155 lines
443 KiB
JavaScript
155 lines
443 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/@opentelemetry+instrumentation-http@0.214.0_@opentelemetry+api@1.9.1";
|
|
exports.ids = ["vendor-chunks/@opentelemetry+instrumentation-http@0.214.0_@opentelemetry+api@1.9.1"];
|
|
exports.modules = {
|
|
|
|
/***/ "(rsc)/./node_modules/.pnpm/@opentelemetry+instrumentation-http@0.214.0_@opentelemetry+api@1.9.1/node_modules/@opentelemetry/instrumentation-http/build/src/enums/AttributeNames.js":
|
|
/*!************************************************************************************************************************************************************************************!*\
|
|
!*** ./node_modules/.pnpm/@opentelemetry+instrumentation-http@0.214.0_@opentelemetry+api@1.9.1/node_modules/@opentelemetry/instrumentation-http/build/src/enums/AttributeNames.js ***!
|
|
\************************************************************************************************************************************************************************************/
|
|
/***/ ((__unused_webpack_module, exports) => {
|
|
|
|
eval("\n/*\n * Copyright The OpenTelemetry Authors\n * SPDX-License-Identifier: Apache-2.0\n */\nObject.defineProperty(exports, \"__esModule\", ({ value: true }));\nexports.AttributeNames = void 0;\n/**\n * https://github.com/open-telemetry/opentelemetry-specification/blob/master/specification/trace/semantic_conventions/http.md\n */\nvar AttributeNames;\n(function (AttributeNames) {\n AttributeNames[\"HTTP_ERROR_NAME\"] = \"http.error_name\";\n AttributeNames[\"HTTP_ERROR_MESSAGE\"] = \"http.error_message\";\n AttributeNames[\"HTTP_STATUS_TEXT\"] = \"http.status_text\";\n})(AttributeNames = exports.AttributeNames || (exports.AttributeNames = {}));\n//# sourceMappingURL=AttributeNames.js.map//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKHJzYykvLi9ub2RlX21vZHVsZXMvLnBucG0vQG9wZW50ZWxlbWV0cnkraW5zdHJ1bWVudGF0aW9uLWh0dHBAMC4yMTQuMF9Ab3BlbnRlbGVtZXRyeSthcGlAMS45LjEvbm9kZV9tb2R1bGVzL0BvcGVudGVsZW1ldHJ5L2luc3RydW1lbnRhdGlvbi1odHRwL2J1aWxkL3NyYy9lbnVtcy9BdHRyaWJ1dGVOYW1lcy5qcyIsIm1hcHBpbmdzIjoiQUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsOENBQTZDLEVBQUUsYUFBYSxFQUFDO0FBQzdELHNCQUFzQjtBQUN0QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQyw4Q0FBOEMsc0JBQXNCLEtBQUs7QUFDMUUiLCJzb3VyY2VzIjpbIi9Vc2Vycy9tYXJjbWludGVsL1Byb2plY3RzL2UtdGliLmNvbS9ub2RlX21vZHVsZXMvLnBucG0vQG9wZW50ZWxlbWV0cnkraW5zdHJ1bWVudGF0aW9uLWh0dHBAMC4yMTQuMF9Ab3BlbnRlbGVtZXRyeSthcGlAMS45LjEvbm9kZV9tb2R1bGVzL0BvcGVudGVsZW1ldHJ5L2luc3RydW1lbnRhdGlvbi1odHRwL2J1aWxkL3NyYy9lbnVtcy9BdHRyaWJ1dGVOYW1lcy5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyJcInVzZSBzdHJpY3RcIjtcbi8qXG4gKiBDb3B5cmlnaHQgVGhlIE9wZW5UZWxlbWV0cnkgQXV0aG9yc1xuICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjBcbiAqL1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5BdHRyaWJ1dGVOYW1lcyA9IHZvaWQgMDtcbi8qKlxuICogaHR0cHM6Ly9naXRodWIuY29tL29wZW4tdGVsZW1ldHJ5L29wZW50ZWxlbWV0cnktc3BlY2lmaWNhdGlvbi9ibG9iL21hc3Rlci9zcGVjaWZpY2F0aW9uL3RyYWNlL3NlbWFudGljX2NvbnZlbnRpb25zL2h0dHAubWRcbiAqL1xudmFyIEF0dHJpYnV0ZU5hbWVzO1xuKGZ1bmN0aW9uIChBdHRyaWJ1dGVOYW1lcykge1xuICAgIEF0dHJpYnV0ZU5hbWVzW1wiSFRUUF9FUlJPUl9OQU1FXCJdID0gXCJodHRwLmVycm9yX25hbWVcIjtcbiAgICBBdHRyaWJ1dGVOYW1lc1tcIkhUVFBfRVJST1JfTUVTU0FHRVwiXSA9IFwiaHR0cC5lcnJvcl9tZXNzYWdlXCI7XG4gICAgQXR0cmlidXRlTmFtZXNbXCJIVFRQX1NUQVRVU19URVhUXCJdID0gXCJodHRwLnN0YXR1c190ZXh0XCI7XG59KShBdHRyaWJ1dGVOYW1lcyA9IGV4cG9ydHMuQXR0cmlidXRlTmFtZXMgfHwgKGV4cG9ydHMuQXR0cmlidXRlTmFtZXMgPSB7fSkpO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9QXR0cmlidXRlTmFtZXMuanMubWFwIl0sIm5hbWVzIjpbXSwiaWdub3JlTGlzdCI6WzBdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///(rsc)/./node_modules/.pnpm/@opentelemetry+instrumentation-http@0.214.0_@opentelemetry+api@1.9.1/node_modules/@opentelemetry/instrumentation-http/build/src/enums/AttributeNames.js\n");
|
|
|
|
/***/ }),
|
|
|
|
/***/ "(rsc)/./node_modules/.pnpm/@opentelemetry+instrumentation-http@0.214.0_@opentelemetry+api@1.9.1/node_modules/@opentelemetry/instrumentation-http/build/src/http.js":
|
|
/*!********************************************************************************************************************************************************************!*\
|
|
!*** ./node_modules/.pnpm/@opentelemetry+instrumentation-http@0.214.0_@opentelemetry+api@1.9.1/node_modules/@opentelemetry/instrumentation-http/build/src/http.js ***!
|
|
\********************************************************************************************************************************************************************/
|
|
/***/ ((__unused_webpack_module, exports, __webpack_require__) => {
|
|
|
|
eval("\n/*\n * Copyright The OpenTelemetry Authors\n * SPDX-License-Identifier: Apache-2.0\n */\nObject.defineProperty(exports, \"__esModule\", ({ value: true }));\nexports.HttpInstrumentation = void 0;\nconst api_1 = __webpack_require__(/*! @opentelemetry/api */ \"(rsc)/./node_modules/.pnpm/@opentelemetry+api@1.9.1/node_modules/@opentelemetry/api/build/esm/index.js\");\nconst core_1 = __webpack_require__(/*! @opentelemetry/core */ \"(rsc)/./node_modules/.pnpm/@opentelemetry+core@2.6.1_@opentelemetry+api@1.9.1/node_modules/@opentelemetry/core/build/esm/index.js\");\nconst url = __webpack_require__(/*! url */ \"url\");\nconst version_1 = __webpack_require__(/*! ./version */ \"(rsc)/./node_modules/.pnpm/@opentelemetry+instrumentation-http@0.214.0_@opentelemetry+api@1.9.1/node_modules/@opentelemetry/instrumentation-http/build/src/version.js\");\nconst instrumentation_1 = __webpack_require__(/*! @opentelemetry/instrumentation */ \"(rsc)/./node_modules/.pnpm/@opentelemetry+instrumentation@0.214.0_@opentelemetry+api@1.9.1/node_modules/@opentelemetry/instrumentation/build/esm/index.js\");\nconst events_1 = __webpack_require__(/*! events */ \"events\");\nconst semantic_conventions_1 = __webpack_require__(/*! @opentelemetry/semantic-conventions */ \"(rsc)/./node_modules/.pnpm/@opentelemetry+semantic-conventions@1.40.0/node_modules/@opentelemetry/semantic-conventions/build/esm/index.js\");\nconst utils_1 = __webpack_require__(/*! ./utils */ \"(rsc)/./node_modules/.pnpm/@opentelemetry+instrumentation-http@0.214.0_@opentelemetry+api@1.9.1/node_modules/@opentelemetry/instrumentation-http/build/src/utils.js\");\n/**\n * `node:http` and `node:https` instrumentation for OpenTelemetry\n */\nclass HttpInstrumentation extends instrumentation_1.InstrumentationBase {\n /** keep track on spans not ended */\n _spanNotEnded = new WeakSet();\n _headerCapture;\n _httpPatched = false;\n _httpsPatched = false;\n _semconvStability = instrumentation_1.SemconvStability.OLD;\n constructor(config = {}) {\n super('@opentelemetry/instrumentation-http', version_1.VERSION, config);\n this._semconvStability = (0, instrumentation_1.semconvStabilityFromStr)('http', process.env.OTEL_SEMCONV_STABILITY_OPT_IN);\n this._headerCapture = this._createHeaderCapture(this._semconvStability);\n }\n _updateMetricInstruments() {\n this._oldHttpServerDurationHistogram = this.meter.createHistogram('http.server.duration', {\n description: 'Measures the duration of inbound HTTP requests.',\n unit: 'ms',\n valueType: api_1.ValueType.DOUBLE,\n });\n this._oldHttpClientDurationHistogram = this.meter.createHistogram('http.client.duration', {\n description: 'Measures the duration of outbound HTTP requests.',\n unit: 'ms',\n valueType: api_1.ValueType.DOUBLE,\n });\n this._stableHttpServerDurationHistogram = this.meter.createHistogram(semantic_conventions_1.METRIC_HTTP_SERVER_REQUEST_DURATION, {\n description: 'Duration of HTTP server requests.',\n unit: 's',\n valueType: api_1.ValueType.DOUBLE,\n advice: {\n explicitBucketBoundaries: [\n 0.005, 0.01, 0.025, 0.05, 0.075, 0.1, 0.25, 0.5, 0.75, 1, 2.5, 5,\n 7.5, 10,\n ],\n },\n });\n this._stableHttpClientDurationHistogram = this.meter.createHistogram(semantic_conventions_1.METRIC_HTTP_CLIENT_REQUEST_DURATION, {\n description: 'Duration of HTTP client requests.',\n unit: 's',\n valueType: api_1.ValueType.DOUBLE,\n advice: {\n explicitBucketBoundaries: [\n 0.005, 0.01, 0.025, 0.05, 0.075, 0.1, 0.25, 0.5, 0.75, 1, 2.5, 5,\n 7.5, 10,\n ],\n },\n });\n }\n _recordServerDuration(durationMs, oldAttributes, stableAttributes) {\n if (this._semconvStability & instrumentation_1.SemconvStability.OLD) {\n // old histogram is counted in MS\n this._oldHttpServerDurationHistogram.record(durationMs, oldAttributes);\n }\n if (this._semconvStability & instrumentation_1.SemconvStability.STABLE) {\n // stable histogram is counted in S\n this._stableHttpServerDurationHistogram.record(durationMs / 1000, stableAttributes);\n }\n }\n _recordClientDuration(durationMs, oldAttributes, stableAttributes) {\n if (this._semconvStability & instrumentation_1.SemconvStability.OLD) {\n // old histogram is counted in MS\n this._oldHttpClientDurationHistogram.record(durationMs, oldAttributes);\n }\n if (this._semconvStability & instrumentation_1.SemconvStability.STABLE) {\n // stable histogram is counted in S\n this._stableHttpClientDurationHistogram.record(durationMs / 1000, stableAttributes);\n }\n }\n setConfig(config = {}) {\n super.setConfig(config);\n this._headerCapture = this._createHeaderCapture(this._semconvStability);\n }\n init() {\n return [this._getHttpsInstrumentation(), this._getHttpInstrumentation()];\n }\n _getHttpInstrumentation() {\n return new instrumentation_1.InstrumentationNodeModuleDefinition('http', ['*'], (moduleExports) => {\n // Guard against double-instrumentation, if loaded by both `require`\n // and `import`.\n if (this._httpPatched) {\n return moduleExports;\n }\n this._httpPatched = true;\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const isESM = moduleExports[Symbol.toStringTag] === 'Module';\n if (!this.getConfig().disableOutgoingRequestInstrumentation) {\n const patchedRequest = this._wrap(moduleExports, 'request', this._getPatchOutgoingRequestFunction('http'));\n const patchedGet = this._wrap(moduleExports, 'get', this._getPatchOutgoingGetFunction(patchedRequest));\n if (isESM) {\n // To handle `import http from 'http'`, which returns the default\n // export, we need to set `module.default.*`.\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n moduleExports.default.request = patchedRequest;\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n moduleExports.default.get = patchedGet;\n }\n }\n if (!this.getConfig().disableIncomingRequestInstrumentation) {\n this._wrap(moduleExports.Server.prototype, 'emit', this._getPatchIncomingRequestFunction('http'));\n }\n return moduleExports;\n }, (moduleExports) => {\n this._httpPatched = false;\n if (moduleExports === undefined)\n return;\n if (!this.getConfig().disableOutgoingRequestInstrumentation) {\n this._unwrap(moduleExports, 'request');\n this._unwrap(moduleExports, 'get');\n }\n if (!this.getConfig().disableIncomingRequestInstrumentation) {\n this._unwrap(moduleExports.Server.prototype, 'emit');\n }\n });\n }\n _getHttpsInstrumentation() {\n return new instrumentation_1.InstrumentationNodeModuleDefinition('https', ['*'], (moduleExports) => {\n // Guard against double-instrumentation, if loaded by both `require`\n // and `import`.\n if (this._httpsPatched) {\n return moduleExports;\n }\n this._httpsPatched = true;\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const isESM = moduleExports[Symbol.toStringTag] === 'Module';\n if (!this.getConfig().disableOutgoingRequestInstrumentation) {\n const patchedRequest = this._wrap(moduleExports, 'request', this._getPatchHttpsOutgoingRequestFunction('https'));\n const patchedGet = this._wrap(moduleExports, 'get', this._getPatchHttpsOutgoingGetFunction(patchedRequest));\n if (isESM) {\n // To handle `import https from 'https'`, which returns the default\n // export, we need to set `module.default.*`.\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n moduleExports.default.request = patchedRequest;\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n moduleExports.default.get = patchedGet;\n }\n }\n if (!this.getConfig().disableIncomingRequestInstrumentation) {\n this._wrap(moduleExports.Server.prototype, 'emit', this._getPatchIncomingRequestFunction('https'));\n }\n return moduleExports;\n }, (moduleExports) => {\n this._httpsPatched = false;\n if (moduleExports === undefined)\n return;\n if (!this.getConfig().disableOutgoingRequestInstrumentation) {\n this._unwrap(moduleExports, 'request');\n this._unwrap(moduleExports, 'get');\n }\n if (!this.getConfig().disableIncomingRequestInstrumentation) {\n this._unwrap(moduleExports.Server.prototype, 'emit');\n }\n });\n }\n /**\n * Creates spans for incoming requests, restoring spans' context if applied.\n */\n _getPatchIncomingRequestFunction(component) {\n return (original) => {\n return this._incomingRequestFunction(component, original);\n };\n }\n /**\n * Creates spans for outgoing requests, sending spans' context for distributed\n * tracing.\n */\n _getPatchOutgoingRequestFunction(component) {\n return (original) => {\n return this._outgoingRequestFunction(component, original);\n };\n }\n _getPatchOutgoingGetFunction(clientRequest) {\n return (_original) => {\n // Re-implement http.get. This needs to be done (instead of using\n // getPatchOutgoingRequestFunction to patch it) because we need to\n // set the trace context header before the returned http.ClientRequest is\n // ended. The Node.js docs state that the only differences between\n // request and get are that (1) get defaults to the HTTP GET method and\n // (2) the returned request object is ended immediately. The former is\n // already true (at least in supported Node versions up to v10), so we\n // simply follow the latter. Ref:\n // https://nodejs.org/dist/latest/docs/api/http.html#http_http_get_options_callback\n // https://github.com/googleapis/cloud-trace-nodejs/blob/master/src/instrumentations/instrumentation-http.ts#L198\n return function outgoingGetRequest(options, ...args) {\n const req = clientRequest(options, ...args);\n req.end();\n return req;\n };\n };\n }\n /** Patches HTTPS outgoing requests */\n _getPatchHttpsOutgoingRequestFunction(component) {\n return (original) => {\n const instrumentation = this;\n return function httpsOutgoingRequest(\n // eslint-disable-next-line n/no-unsupported-features/node-builtins\n options, ...args) {\n // Makes sure options will have default HTTPS parameters\n if (component === 'https' &&\n typeof options === 'object' &&\n options?.constructor?.name !== 'URL') {\n options = Object.assign({}, options);\n instrumentation._setDefaultOptions(options);\n }\n return instrumentation._getPatchOutgoingRequestFunction(component)(original)(options, ...args);\n };\n };\n }\n _setDefaultOptions(options) {\n options.protocol = options.protocol || 'https:';\n options.port = options.port || 443;\n }\n /** Patches HTTPS outgoing get requests */\n _getPatchHttpsOutgoingGetFunction(clientRequest) {\n return (original) => {\n const instrumentation = this;\n return function httpsOutgoingRequest(\n // eslint-disable-next-line n/no-unsupported-features/node-builtins\n options, ...args) {\n return instrumentation._getPatchOutgoingGetFunction(clientRequest)(original)(options, ...args);\n };\n };\n }\n /**\n * Attach event listeners to a client request to end span and add span attributes.\n *\n * @param request The original request object.\n * @param span representing the current operation\n * @param startTime representing the start time of the request to calculate duration in Metric\n * @param oldMetricAttributes metric attributes for old semantic conventions\n * @param stableMetricAttributes metric attributes for new semantic conventions\n */\n _traceClientRequest(request, span, startTime, oldMetricAttributes, stableMetricAttributes) {\n if (this.getConfig().requestHook) {\n this._callRequestHook(span, request);\n }\n /**\n * Determines if the request has errored or the response has ended/errored.\n */\n let responseFinished = false;\n /*\n * User 'response' event listeners can be added before our listener,\n * force our listener to be the first, so response emitter is bound\n * before any user listeners are added to it.\n */\n request.prependListener('response', (response) => {\n this._diag.debug('outgoingRequest on response()');\n if (request.listenerCount('response') <= 1) {\n response.resume();\n }\n const responseAttributes = (0, utils_1.getOutgoingRequestAttributesOnResponse)(response, this._semconvStability);\n span.setAttributes(responseAttributes);\n oldMetricAttributes = Object.assign(oldMetricAttributes, (0, utils_1.getOutgoingRequestMetricAttributesOnResponse)(responseAttributes));\n stableMetricAttributes = Object.assign(stableMetricAttributes, (0, utils_1.getOutgoingStableRequestMetricAttributesOnResponse)(responseAttributes));\n if (this.getConfig().responseHook) {\n this._callResponseHook(span, response);\n }\n span.setAttributes(this._headerCapture.client.captureRequestHeaders(header => request.getHeader(header)));\n span.setAttributes(this._headerCapture.client.captureResponseHeaders(header => response.headers[header]));\n api_1.context.bind(api_1.context.active(), response);\n const endHandler = () => {\n this._diag.debug('outgoingRequest on end()');\n if (responseFinished) {\n return;\n }\n responseFinished = true;\n let status;\n if (response.aborted && !response.complete) {\n status = { code: api_1.SpanStatusCode.ERROR };\n }\n else {\n // behaves same for new and old semconv\n status = {\n code: (0, utils_1.parseResponseStatus)(api_1.SpanKind.CLIENT, response.statusCode),\n };\n }\n span.setStatus(status);\n if (this.getConfig().applyCustomAttributesOnSpan) {\n (0, instrumentation_1.safeExecuteInTheMiddle)(() => this.getConfig().applyCustomAttributesOnSpan(span, request, response), () => { }, true);\n }\n this._closeHttpSpan(span, api_1.SpanKind.CLIENT, startTime, oldMetricAttributes, stableMetricAttributes);\n };\n response.on('end', endHandler);\n response.on(events_1.errorMonitor, (error) => {\n this._diag.debug('outgoingRequest on error()', error);\n if (responseFinished) {\n return;\n }\n responseFinished = true;\n this._onOutgoingRequestError(span, oldMetricAttributes, stableMetricAttributes, startTime, error);\n });\n });\n request.on('close', () => {\n this._diag.debug('outgoingRequest on request close()');\n if (request.aborted || responseFinished) {\n return;\n }\n responseFinished = true;\n this._closeHttpSpan(span, api_1.SpanKind.CLIENT, startTime, oldMetricAttributes, stableMetricAttributes);\n });\n request.on(events_1.errorMonitor, (error) => {\n this._diag.debug('outgoingRequest on request error()', error);\n if (responseFinished) {\n return;\n }\n responseFinished = true;\n this._onOutgoingRequestError(span, oldMetricAttributes, stableMetricAttributes, startTime, error);\n });\n this._diag.debug('http.ClientRequest return request');\n return request;\n }\n _incomingRequestFunction(component, original) {\n const instrumentation = this;\n return function incomingRequest(event, ...args) {\n // Only traces request events\n if (event !== 'request') {\n return original.apply(this, [event, ...args]);\n }\n const request = args[0];\n const response = args[1];\n const method = request.method || 'GET';\n instrumentation._diag.debug(`${component} instrumentation incomingRequest`);\n if ((0, instrumentation_1.safeExecuteInTheMiddle)(() => instrumentation.getConfig().ignoreIncomingRequestHook?.(request), (e) => {\n if (e != null) {\n instrumentation._diag.error('caught ignoreIncomingRequestHook error: ', e);\n }\n }, true)) {\n return api_1.context.with((0, core_1.suppressTracing)(api_1.context.active()), () => {\n api_1.context.bind(api_1.context.active(), request);\n api_1.context.bind(api_1.context.active(), response);\n return original.apply(this, [event, ...args]);\n });\n }\n const headers = request.headers;\n const spanAttributes = (0, utils_1.getIncomingRequestAttributes)(request, {\n component: component,\n serverName: instrumentation.getConfig().serverName,\n hookAttributes: instrumentation._callStartSpanHook(request, instrumentation.getConfig().startIncomingSpanHook),\n semconvStability: instrumentation._semconvStability,\n enableSyntheticSourceDetection: instrumentation.getConfig().enableSyntheticSourceDetection || false,\n }, instrumentation._diag);\n Object.assign(spanAttributes, instrumentation._headerCapture.server.captureRequestHeaders(header => request.headers[header]));\n const spanOptions = {\n kind: api_1.SpanKind.SERVER,\n attributes: spanAttributes,\n };\n const startTime = (0, core_1.hrTime)();\n const oldMetricAttributes = (0, utils_1.getIncomingRequestMetricAttributes)(spanAttributes);\n // request method and url.scheme are both required span attributes\n const stableMetricAttributes = {\n [semantic_conventions_1.ATTR_HTTP_REQUEST_METHOD]: spanAttributes[semantic_conventions_1.ATTR_HTTP_REQUEST_METHOD],\n [semantic_conventions_1.ATTR_URL_SCHEME]: spanAttributes[semantic_conventions_1.ATTR_URL_SCHEME],\n };\n // recommended if and only if one was sent, same as span recommendation\n if (spanAttributes[semantic_conventions_1.ATTR_NETWORK_PROTOCOL_VERSION]) {\n stableMetricAttributes[semantic_conventions_1.ATTR_NETWORK_PROTOCOL_VERSION] =\n spanAttributes[semantic_conventions_1.ATTR_NETWORK_PROTOCOL_VERSION];\n }\n const ctx = api_1.propagation.extract(api_1.ROOT_CONTEXT, headers);\n const span = instrumentation._startHttpSpan(method, spanOptions, ctx);\n const rpcMetadata = {\n type: core_1.RPCType.HTTP,\n span,\n };\n return api_1.context.with((0, core_1.setRPCMetadata)(api_1.trace.setSpan(ctx, span), rpcMetadata), () => {\n api_1.context.bind(api_1.context.active(), request);\n api_1.context.bind(api_1.context.active(), response);\n if (instrumentation.getConfig().requestHook) {\n instrumentation._callRequestHook(span, request);\n }\n if (instrumentation.getConfig().responseHook) {\n instrumentation._callResponseHook(span, response);\n }\n // After 'error', no further events other than 'close' should be emitted.\n let hasError = false;\n response.on('close', () => {\n if (hasError) {\n return;\n }\n instrumentation._onServerResponseFinish(request, response, span, oldMetricAttributes, stableMetricAttributes, startTime);\n });\n response.on(events_1.errorMonitor, (err) => {\n hasError = true;\n instrumentation._onServerResponseError(span, oldMetricAttributes, stableMetricAttributes, startTime, err);\n });\n return (0, instrumentation_1.safeExecuteInTheMiddle)(() => original.apply(this, [event, ...args]), error => {\n if (error) {\n instrumentation._onServerResponseError(span, oldMetricAttributes, stableMetricAttributes, startTime, error);\n throw error;\n }\n });\n });\n };\n }\n _outgoingRequestFunction(component, original) {\n const instrumentation = this;\n return function outgoingRequest(options, ...args) {\n if (!(0, utils_1.isValidOptionsType)(options)) {\n return original.apply(this, [options, ...args]);\n }\n const extraOptions = typeof args[0] === 'object' &&\n (typeof options === 'string' || options instanceof url.URL)\n ? args.shift()\n : undefined;\n const { method, invalidUrl, optionsParsed } = (0, utils_1.getRequestInfo)(instrumentation._diag, options, extraOptions);\n if ((0, instrumentation_1.safeExecuteInTheMiddle)(() => instrumentation\n .getConfig()\n .ignoreOutgoingRequestHook?.(optionsParsed), (e) => {\n if (e != null) {\n instrumentation._diag.error('caught ignoreOutgoingRequestHook error: ', e);\n }\n }, true)) {\n return original.apply(this, [optionsParsed, ...args]);\n }\n const { hostname, port } = (0, utils_1.extractHostnameAndPort)(optionsParsed);\n const attributes = (0, utils_1.getOutgoingRequestAttributes)(optionsParsed, {\n component,\n port,\n hostname,\n hookAttributes: instrumentation._callStartSpanHook(optionsParsed, instrumentation.getConfig().startOutgoingSpanHook),\n redactedQueryParams: instrumentation.getConfig().redactedQueryParams, // Added config for adding custom query strings\n }, instrumentation._semconvStability, instrumentation.getConfig().enableSyntheticSourceDetection || false);\n const startTime = (0, core_1.hrTime)();\n const oldMetricAttributes = (0, utils_1.getOutgoingRequestMetricAttributes)(attributes);\n // request method, server address, and server port are both required span attributes\n const stableMetricAttributes = {\n [semantic_conventions_1.ATTR_HTTP_REQUEST_METHOD]: attributes[semantic_conventions_1.ATTR_HTTP_REQUEST_METHOD],\n [semantic_conventions_1.ATTR_SERVER_ADDRESS]: attributes[semantic_conventions_1.ATTR_SERVER_ADDRESS],\n [semantic_conventions_1.ATTR_SERVER_PORT]: attributes[semantic_conventions_1.ATTR_SERVER_PORT],\n };\n // required if and only if one was sent, same as span requirement\n if (attributes[semantic_conventions_1.ATTR_HTTP_RESPONSE_STATUS_CODE]) {\n stableMetricAttributes[semantic_conventions_1.ATTR_HTTP_RESPONSE_STATUS_CODE] =\n attributes[semantic_conventions_1.ATTR_HTTP_RESPONSE_STATUS_CODE];\n }\n // recommended if and only if one was sent, same as span recommendation\n if (attributes[semantic_conventions_1.ATTR_NETWORK_PROTOCOL_VERSION]) {\n stableMetricAttributes[semantic_conventions_1.ATTR_NETWORK_PROTOCOL_VERSION] =\n attributes[semantic_conventions_1.ATTR_NETWORK_PROTOCOL_VERSION];\n }\n const spanOptions = {\n kind: api_1.SpanKind.CLIENT,\n attributes,\n };\n const span = instrumentation._startHttpSpan(method, spanOptions);\n const parentContext = api_1.context.active();\n const requestContext = api_1.trace.setSpan(parentContext, span);\n if (!optionsParsed.headers) {\n optionsParsed.headers = {};\n }\n else {\n // Make a copy of the headers object to avoid mutating an object the\n // caller might have a reference to.\n optionsParsed.headers = Object.assign({}, optionsParsed.headers);\n }\n api_1.propagation.inject(requestContext, optionsParsed.headers);\n return api_1.context.with(requestContext, () => {\n /*\n * The response callback is registered before ClientRequest is bound,\n * thus it is needed to bind it before the function call.\n */\n const cb = args[args.length - 1];\n if (typeof cb === 'function') {\n args[args.length - 1] = api_1.context.bind(parentContext, cb);\n }\n const request = (0, instrumentation_1.safeExecuteInTheMiddle)(() => {\n if (invalidUrl) {\n // we know that the url is invalid, there's no point in injecting context as it will fail validation.\n // Passing in what the user provided will give the user an error that matches what they'd see without\n // the instrumentation.\n return original.apply(this, [options, ...args]);\n }\n else {\n return original.apply(this, [optionsParsed, ...args]);\n }\n }, error => {\n if (error) {\n instrumentation._onOutgoingRequestError(span, oldMetricAttributes, stableMetricAttributes, startTime, error);\n throw error;\n }\n });\n instrumentation._diag.debug(`${component} instrumentation outgoingRequest`);\n api_1.context.bind(parentContext, request);\n return instrumentation._traceClientRequest(request, span, startTime, oldMetricAttributes, stableMetricAttributes);\n });\n };\n }\n _onServerResponseFinish(request, response, span, oldMetricAttributes, stableMetricAttributes, startTime) {\n const attributes = (0, utils_1.getIncomingRequestAttributesOnResponse)(request, response, this._semconvStability);\n oldMetricAttributes = Object.assign(oldMetricAttributes, (0, utils_1.getIncomingRequestMetricAttributesOnResponse)(attributes));\n stableMetricAttributes = Object.assign(stableMetricAttributes, (0, utils_1.getIncomingStableRequestMetricAttributesOnResponse)(attributes));\n span.setAttributes(this._headerCapture.server.captureResponseHeaders(header => response.getHeader(header)));\n span.setAttributes(attributes).setStatus({\n code: (0, utils_1.parseResponseStatus)(api_1.SpanKind.SERVER, response.statusCode),\n });\n const route = attributes[semantic_conventions_1.ATTR_HTTP_ROUTE];\n if (route) {\n span.updateName(`${request.method || 'GET'} ${route}`);\n }\n if (this.getConfig().applyCustomAttributesOnSpan) {\n (0, instrumentation_1.safeExecuteInTheMiddle)(() => this.getConfig().applyCustomAttributesOnSpan(span, request, response), () => { }, true);\n }\n this._closeHttpSpan(span, api_1.SpanKind.SERVER, startTime, oldMetricAttributes, stableMetricAttributes);\n }\n _onOutgoingRequestError(span, oldMetricAttributes, stableMetricAttributes, startTime, error) {\n (0, utils_1.setSpanWithError)(span, error, this._semconvStability);\n stableMetricAttributes[semantic_conventions_1.ATTR_ERROR_TYPE] = error.name;\n this._closeHttpSpan(span, api_1.SpanKind.CLIENT, startTime, oldMetricAttributes, stableMetricAttributes);\n }\n _onServerResponseError(span, oldMetricAttributes, stableMetricAttributes, startTime, error) {\n (0, utils_1.setSpanWithError)(span, error, this._semconvStability);\n stableMetricAttributes[semantic_conventions_1.ATTR_ERROR_TYPE] = error.name;\n this._closeHttpSpan(span, api_1.SpanKind.SERVER, startTime, oldMetricAttributes, stableMetricAttributes);\n }\n _startHttpSpan(name, options, ctx = api_1.context.active()) {\n /*\n * If a parent is required but not present, we use a `NoopSpan` to still\n * propagate context without recording it.\n */\n const requireParent = options.kind === api_1.SpanKind.CLIENT\n ? this.getConfig().requireParentforOutgoingSpans\n : this.getConfig().requireParentforIncomingSpans;\n let span;\n const currentSpan = api_1.trace.getSpan(ctx);\n if (requireParent === true &&\n (!currentSpan || !api_1.trace.isSpanContextValid(currentSpan.spanContext()))) {\n span = api_1.trace.wrapSpanContext(api_1.INVALID_SPAN_CONTEXT);\n }\n else if (requireParent === true && currentSpan?.spanContext().isRemote) {\n span = currentSpan;\n }\n else {\n span = this.tracer.startSpan(name, options, ctx);\n }\n this._spanNotEnded.add(span);\n return span;\n }\n _closeHttpSpan(span, spanKind, startTime, oldMetricAttributes, stableMetricAttributes) {\n if (!this._spanNotEnded.has(span)) {\n return;\n }\n span.end();\n this._spanNotEnded.delete(span);\n // Record metrics\n const duration = (0, core_1.hrTimeToMilliseconds)((0, core_1.hrTimeDuration)(startTime, (0, core_1.hrTime)()));\n if (spanKind === api_1.SpanKind.SERVER) {\n this._recordServerDuration(duration, oldMetricAttributes, stableMetricAttributes);\n }\n else if (spanKind === api_1.SpanKind.CLIENT) {\n this._recordClientDuration(duration, oldMetricAttributes, stableMetricAttributes);\n }\n }\n _callResponseHook(span, response) {\n (0, instrumentation_1.safeExecuteInTheMiddle)(() => this.getConfig().responseHook(span, response), () => { }, true);\n }\n _callRequestHook(span, request) {\n (0, instrumentation_1.safeExecuteInTheMiddle)(() => this.getConfig().requestHook(span, request), () => { }, true);\n }\n _callStartSpanHook(request, hookFunc) {\n if (typeof hookFunc === 'function') {\n return (0, instrumentation_1.safeExecuteInTheMiddle)(() => hookFunc(request), () => { }, true);\n }\n }\n _createHeaderCapture(semconvStability) {\n const config = this.getConfig();\n return {\n client: {\n captureRequestHeaders: (0, utils_1.headerCapture)('request', config.headersToSpanAttributes?.client?.requestHeaders ?? [], semconvStability),\n captureResponseHeaders: (0, utils_1.headerCapture)('response', config.headersToSpanAttributes?.client?.responseHeaders ?? [], semconvStability),\n },\n server: {\n captureRequestHeaders: (0, utils_1.headerCapture)('request', config.headersToSpanAttributes?.server?.requestHeaders ?? [], semconvStability),\n captureResponseHeaders: (0, utils_1.headerCapture)('response', config.headersToSpanAttributes?.server?.responseHeaders ?? [], semconvStability),\n },\n };\n }\n}\nexports.HttpInstrumentation = HttpInstrumentation;\n//# sourceMappingURL=http.js.map//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKHJzYykvLi9ub2RlX21vZHVsZXMvLnBucG0vQG9wZW50ZWxlbWV0cnkraW5zdHJ1bWVudGF0aW9uLWh0dHBAMC4yMTQuMF9Ab3BlbnRlbGVtZXRyeSthcGlAMS45LjEvbm9kZV9tb2R1bGVzL0BvcGVudGVsZW1ldHJ5L2luc3RydW1lbnRhdGlvbi1odHRwL2J1aWxkL3NyYy9odHRwLmpzIiwibWFwcGluZ3MiOiJBQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQSw4Q0FBNkMsRUFBRSxhQUFhLEVBQUM7QUFDN0QsMkJBQTJCO0FBQzNCLGNBQWMsbUJBQU8sQ0FBQyxrSUFBb0I7QUFDMUMsZUFBZSxtQkFBTyxDQUFDLDhKQUFxQjtBQUM1QyxZQUFZLG1CQUFPLENBQUMsZ0JBQUs7QUFDekIsa0JBQWtCLG1CQUFPLENBQUMsd0xBQVc7QUFDckMsMEJBQTBCLG1CQUFPLENBQUMsaU1BQWdDO0FBQ2xFLGlCQUFpQixtQkFBTyxDQUFDLHNCQUFRO0FBQ2pDLCtCQUErQixtQkFBTyxDQUFDLHNMQUFxQztBQUM1RSxnQkFBZ0IsbUJBQU8sQ0FBQyxvTEFBUztBQUNqQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDJCQUEyQjtBQUMzQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2IsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHlCQUF5QjtBQUN6QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw4Q0FBOEM7QUFDOUM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsK0JBQStCO0FBQy9CO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHdKQUF3SjtBQUN4SjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDJDQUEyQyxXQUFXO0FBQ3REO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUJBQWlCO0FBQ2pCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUJBQWlCO0FBQ2pCO0FBQ0E7QUFDQTtBQUNBLGlCQUFpQjtBQUNqQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUJBQWlCO0FBQ2pCLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxvQkFBb0Isb0NBQW9DO0FBQ3hEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0Esb0JBQW9CLGlCQUFpQjtBQUNyQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx3REFBd0Q7QUFDeEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUJBQWlCO0FBQ2pCO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUJBQWlCO0FBQ2pCLCtDQUErQyxXQUFXO0FBQzFEO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQSwrQkFBK0IseUJBQXlCLEVBQUUsTUFBTTtBQUNoRTtBQUNBO0FBQ0EsZ0pBQWdKO0FBQ2hKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esb0hBQW9IO0FBQ3BIO0FBQ0E7QUFDQSxrSEFBa0g7QUFDbEg7QUFDQTtBQUNBO0FBQ0EsbUdBQW1HO0FBQ25HO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBLDJCQUEyQjtBQUMzQiIsInNvdXJjZXMiOlsiL1VzZXJzL21hcmNtaW50ZWwvUHJvamVjdHMvZS10aWIuY29tL25vZGVfbW9kdWxlcy8ucG5wbS9Ab3BlbnRlbGVtZXRyeStpbnN0cnVtZW50YXRpb24taHR0cEAwLjIxNC4wX0BvcGVudGVsZW1ldHJ5K2FwaUAxLjkuMS9ub2RlX21vZHVsZXMvQG9wZW50ZWxlbWV0cnkvaW5zdHJ1bWVudGF0aW9uLWh0dHAvYnVpbGQvc3JjL2h0dHAuanMiXSwic291cmNlc0NvbnRlbnQiOlsiXCJ1c2Ugc3RyaWN0XCI7XG4vKlxuICogQ29weXJpZ2h0IFRoZSBPcGVuVGVsZW1ldHJ5IEF1dGhvcnNcbiAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wXG4gKi9cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMuSHR0cEluc3RydW1lbnRhdGlvbiA9IHZvaWQgMDtcbmNvbnN0IGFwaV8xID0gcmVxdWlyZShcIkBvcGVudGVsZW1ldHJ5L2FwaVwiKTtcbmNvbnN0IGNvcmVfMSA9IHJlcXVpcmUoXCJAb3BlbnRlbGVtZXRyeS9jb3JlXCIpO1xuY29uc3QgdXJsID0gcmVxdWlyZShcInVybFwiKTtcbmNvbnN0IHZlcnNpb25fMSA9IHJlcXVpcmUoXCIuL3ZlcnNpb25cIik7XG5jb25zdCBpbnN0cnVtZW50YXRpb25fMSA9IHJlcXVpcmUoXCJAb3BlbnRlbGVtZXRyeS9pbnN0cnVtZW50YXRpb25cIik7XG5jb25zdCBldmVudHNfMSA9IHJlcXVpcmUoXCJldmVudHNcIik7XG5jb25zdCBzZW1hbnRpY19jb252ZW50aW9uc18xID0gcmVxdWlyZShcIkBvcGVudGVsZW1ldHJ5L3NlbWFudGljLWNvbnZlbnRpb25zXCIpO1xuY29uc3QgdXRpbHNfMSA9IHJlcXVpcmUoXCIuL3V0aWxzXCIpO1xuLyoqXG4gKiBgbm9kZTpodHRwYCBhbmQgYG5vZGU6aHR0cHNgIGluc3RydW1lbnRhdGlvbiBmb3IgT3BlblRlbGVtZXRyeVxuICovXG5jbGFzcyBIdHRwSW5zdHJ1bWVudGF0aW9uIGV4dGVuZHMgaW5zdHJ1bWVudGF0aW9uXzEuSW5zdHJ1bWVudGF0aW9uQmFzZSB7XG4gICAgLyoqIGtlZXAgdHJhY2sgb24gc3BhbnMgbm90IGVuZGVkICovXG4gICAgX3NwYW5Ob3RFbmRlZCA9IG5ldyBXZWFrU2V0KCk7XG4gICAgX2hlYWRlckNhcHR1cmU7XG4gICAgX2h0dHBQYXRjaGVkID0gZmFsc2U7XG4gICAgX2h0dHBzUGF0Y2hlZCA9IGZhbHNlO1xuICAgIF9zZW1jb252U3RhYmlsaXR5ID0gaW5zdHJ1bWVudGF0aW9uXzEuU2VtY29udlN0YWJpbGl0eS5PTEQ7XG4gICAgY29uc3RydWN0b3IoY29uZmlnID0ge30pIHtcbiAgICAgICAgc3VwZXIoJ0BvcGVudGVsZW1ldHJ5L2luc3RydW1lbnRhdGlvbi1odHRwJywgdmVyc2lvbl8xLlZFUlNJT04sIGNvbmZpZyk7XG4gICAgICAgIHRoaXMuX3NlbWNvbnZTdGFiaWxpdHkgPSAoMCwgaW5zdHJ1bWVudGF0aW9uXzEuc2VtY29udlN0YWJpbGl0eUZyb21TdHIpKCdodHRwJywgcHJvY2Vzcy5lbnYuT1RFTF9TRU1DT05WX1NUQUJJTElUWV9PUFRfSU4pO1xuICAgICAgICB0aGlzLl9oZWFkZXJDYXB0dXJlID0gdGhpcy5fY3JlYXRlSGVhZGVyQ2FwdHVyZSh0aGlzLl9zZW1jb252U3RhYmlsaXR5KTtcbiAgICB9XG4gICAgX3VwZGF0ZU1ldHJpY0luc3RydW1lbnRzKCkge1xuICAgICAgICB0aGlzLl9vbGRIdHRwU2VydmVyRHVyYXRpb25IaXN0b2dyYW0gPSB0aGlzLm1ldGVyLmNyZWF0ZUhpc3RvZ3JhbSgnaHR0cC5zZXJ2ZXIuZHVyYXRpb24nLCB7XG4gICAgICAgICAgICBkZXNjcmlwdGlvbjogJ01lYXN1cmVzIHRoZSBkdXJhdGlvbiBvZiBpbmJvdW5kIEhUVFAgcmVxdWVzdHMuJyxcbiAgICAgICAgICAgIHVuaXQ6ICdtcycsXG4gICAgICAgICAgICB2YWx1ZVR5cGU6IGFwaV8xLlZhbHVlVHlwZS5ET1VCTEUsXG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLl9vbGRIdHRwQ2xpZW50RHVyYXRpb25IaXN0b2dyYW0gPSB0aGlzLm1ldGVyLmNyZWF0ZUhpc3RvZ3JhbSgnaHR0cC5jbGllbnQuZHVyYXRpb24nLCB7XG4gICAgICAgICAgICBkZXNjcmlwdGlvbjogJ01lYXN1cmVzIHRoZSBkdXJhdGlvbiBvZiBvdXRib3VuZCBIVFRQIHJlcXVlc3RzLicsXG4gICAgICAgICAgICB1bml0OiAnbXMnLFxuICAgICAgICAgICAgdmFsdWVUeXBlOiBhcGlfMS5WYWx1ZVR5cGUuRE9VQkxFLFxuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5fc3RhYmxlSHR0cFNlcnZlckR1cmF0aW9uSGlzdG9ncmFtID0gdGhpcy5tZXRlci5jcmVhdGVIaXN0b2dyYW0oc2VtYW50aWNfY29udmVudGlvbnNfMS5NRVRSSUNfSFRUUF9TRVJWRVJfUkVRVUVTVF9EVVJBVElPTiwge1xuICAgICAgICAgICAgZGVzY3JpcHRpb246ICdEdXJhdGlvbiBvZiBIVFRQIHNlcnZlciByZXF1ZXN0cy4nLFxuICAgICAgICAgICAgdW5pdDogJ3MnLFxuICAgICAgICAgICAgdmFsdWVUeXBlOiBhcGlfMS5WYWx1ZVR5cGUuRE9VQkxFLFxuICAgICAgICAgICAgYWR2aWNlOiB7XG4gICAgICAgICAgICAgICAgZXhwbGljaXRCdWNrZXRCb3VuZGFyaWVzOiBbXG4gICAgICAgICAgICAgICAgICAgIDAuMDA1LCAwLjAxLCAwLjAyNSwgMC4wNSwgMC4wNzUsIDAuMSwgMC4yNSwgMC41LCAwLjc1LCAxLCAyLjUsIDUsXG4gICAgICAgICAgICAgICAgICAgIDcuNSwgMTAsXG4gICAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLl9zdGFibGVIdHRwQ2xpZW50RHVyYXRpb25IaXN0b2dyYW0gPSB0aGlzLm1ldGVyLmNyZWF0ZUhpc3RvZ3JhbShzZW1hbnRpY19jb252ZW50aW9uc18xLk1FVFJJQ19IVFRQX0NMSUVOVF9SRVFVRVNUX0RVUkFUSU9OLCB7XG4gICAgICAgICAgICBkZXNjcmlwdGlvbjogJ0R1cmF0aW9uIG9mIEhUVFAgY2xpZW50IHJlcXVlc3RzLicsXG4gICAgICAgICAgICB1bml0OiAncycsXG4gICAgICAgICAgICB2YWx1ZVR5cGU6IGFwaV8xLlZhbHVlVHlwZS5ET1VCTEUsXG4gICAgICAgICAgICBhZHZpY2U6IHtcbiAgICAgICAgICAgICAgICBleHBsaWNpdEJ1Y2tldEJvdW5kYXJpZXM6IFtcbiAgICAgICAgICAgICAgICAgICAgMC4wMDUsIDAuMDEsIDAuMDI1LCAwLjA1LCAwLjA3NSwgMC4xLCAwLjI1LCAwLjUsIDAuNzUsIDEsIDIuNSwgNSxcbiAgICAgICAgICAgICAgICAgICAgNy41LCAxMCxcbiAgICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIF9yZWNvcmRTZXJ2ZXJEdXJhdGlvbihkdXJhdGlvbk1zLCBvbGRBdHRyaWJ1dGVzLCBzdGFibGVBdHRyaWJ1dGVzKSB7XG4gICAgICAgIGlmICh0aGlzLl9zZW1jb252U3RhYmlsaXR5ICYgaW5zdHJ1bWVudGF0aW9uXzEuU2VtY29udlN0YWJpbGl0eS5PTEQpIHtcbiAgICAgICAgICAgIC8vIG9sZCBoaXN0b2dyYW0gaXMgY291bnRlZCBpbiBNU1xuICAgICAgICAgICAgdGhpcy5fb2xkSHR0cFNlcnZlckR1cmF0aW9uSGlzdG9ncmFtLnJlY29yZChkdXJhdGlvbk1zLCBvbGRBdHRyaWJ1dGVzKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5fc2VtY29udlN0YWJpbGl0eSAmIGluc3RydW1lbnRhdGlvbl8xLlNlbWNvbnZTdGFiaWxpdHkuU1RBQkxFKSB7XG4gICAgICAgICAgICAvLyBzdGFibGUgaGlzdG9ncmFtIGlzIGNvdW50ZWQgaW4gU1xuICAgICAgICAgICAgdGhpcy5fc3RhYmxlSHR0cFNlcnZlckR1cmF0aW9uSGlzdG9ncmFtLnJlY29yZChkdXJhdGlvbk1zIC8gMTAwMCwgc3RhYmxlQXR0cmlidXRlcyk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgX3JlY29yZENsaWVudER1cmF0aW9uKGR1cmF0aW9uTXMsIG9sZEF0dHJpYnV0ZXMsIHN0YWJsZUF0dHJpYnV0ZXMpIHtcbiAgICAgICAgaWYgKHRoaXMuX3NlbWNvbnZTdGFiaWxpdHkgJiBpbnN0cnVtZW50YXRpb25fMS5TZW1jb252U3RhYmlsaXR5Lk9MRCkge1xuICAgICAgICAgICAgLy8gb2xkIGhpc3RvZ3JhbSBpcyBjb3VudGVkIGluIE1TXG4gICAgICAgICAgICB0aGlzLl9vbGRIdHRwQ2xpZW50RHVyYXRpb25IaXN0b2dyYW0ucmVjb3JkKGR1cmF0aW9uTXMsIG9sZEF0dHJpYnV0ZXMpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLl9zZW1jb252U3RhYmlsaXR5ICYgaW5zdHJ1bWVudGF0aW9uXzEuU2VtY29udlN0YWJpbGl0eS5TVEFCTEUpIHtcbiAgICAgICAgICAgIC8vIHN0YWJsZSBoaXN0b2dyYW0gaXMgY291bnRlZCBpbiBTXG4gICAgICAgICAgICB0aGlzLl9zdGFibGVIdHRwQ2xpZW50RHVyYXRpb25IaXN0b2dyYW0ucmVjb3JkKGR1cmF0aW9uTXMgLyAxMDAwLCBzdGFibGVBdHRyaWJ1dGVzKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBzZXRDb25maWcoY29uZmlnID0ge30pIHtcbiAgICAgICAgc3VwZXIuc2V0Q29uZmlnKGNvbmZpZyk7XG4gICAgICAgIHRoaXMuX2hlYWRlckNhcHR1cmUgPSB0aGlzLl9jcmVhdGVIZWFkZXJDYXB0dXJlKHRoaXMuX3NlbWNvbnZTdGFiaWxpdHkpO1xuICAgIH1cbiAgICBpbml0KCkge1xuICAgICAgICByZXR1cm4gW3RoaXMuX2dldEh0dHBzSW5zdHJ1bWVudGF0aW9uKCksIHRoaXMuX2dldEh0dHBJbnN0cnVtZW50YXRpb24oKV07XG4gICAgfVxuICAgIF9nZXRIdHRwSW5zdHJ1bWVudGF0aW9uKCkge1xuICAgICAgICByZXR1cm4gbmV3IGluc3RydW1lbnRhdGlvbl8xLkluc3RydW1lbnRhdGlvbk5vZGVNb2R1bGVEZWZpbml0aW9uKCdodHRwJywgWycqJ10sIChtb2R1bGVFeHBvcnRzKSA9PiB7XG4gICAgICAgICAgICAvLyBHdWFyZCBhZ2FpbnN0IGRvdWJsZS1pbnN0cnVtZW50YXRpb24sIGlmIGxvYWRlZCBieSBib3RoIGByZXF1aXJlYFxuICAgICAgICAgICAgLy8gYW5kIGBpbXBvcnRgLlxuICAgICAgICAgICAgaWYgKHRoaXMuX2h0dHBQYXRjaGVkKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG1vZHVsZUV4cG9ydHM7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLl9odHRwUGF0Y2hlZCA9IHRydWU7XG4gICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuICAgICAgICAgICAgY29uc3QgaXNFU00gPSBtb2R1bGVFeHBvcnRzW1N5bWJvbC50b1N0cmluZ1RhZ10gPT09ICdNb2R1bGUnO1xuICAgICAgICAgICAgaWYgKCF0aGlzLmdldENvbmZpZygpLmRpc2FibGVPdXRnb2luZ1JlcXVlc3RJbnN0cnVtZW50YXRpb24pIHtcbiAgICAgICAgICAgICAgICBjb25zdCBwYXRjaGVkUmVxdWVzdCA9IHRoaXMuX3dyYXAobW9kdWxlRXhwb3J0cywgJ3JlcXVlc3QnLCB0aGlzLl9nZXRQYXRjaE91dGdvaW5nUmVxdWVzdEZ1bmN0aW9uKCdodHRwJykpO1xuICAgICAgICAgICAgICAgIGNvbnN0IHBhdGNoZWRHZXQgPSB0aGlzLl93cmFwKG1vZHVsZUV4cG9ydHMsICdnZXQnLCB0aGlzLl9nZXRQYXRjaE91dGdvaW5nR2V0RnVuY3Rpb24ocGF0Y2hlZFJlcXVlc3QpKTtcbiAgICAgICAgICAgICAgICBpZiAoaXNFU00pIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gVG8gaGFuZGxlIGBpbXBvcnQgaHR0cCBmcm9tICdodHRwJ2AsIHdoaWNoIHJldHVybnMgdGhlIGRlZmF1bHRcbiAgICAgICAgICAgICAgICAgICAgLy8gZXhwb3J0LCB3ZSBuZWVkIHRvIHNldCBgbW9kdWxlLmRlZmF1bHQuKmAuXG4gICAgICAgICAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG4gICAgICAgICAgICAgICAgICAgIG1vZHVsZUV4cG9ydHMuZGVmYXVsdC5yZXF1ZXN0ID0gcGF0Y2hlZFJlcXVlc3Q7XG4gICAgICAgICAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG4gICAgICAgICAgICAgICAgICAgIG1vZHVsZUV4cG9ydHMuZGVmYXVsdC5nZXQgPSBwYXRjaGVkR2V0O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICghdGhpcy5nZXRDb25maWcoKS5kaXNhYmxlSW5jb21pbmdSZXF1ZXN0SW5zdHJ1bWVudGF0aW9uKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fd3JhcChtb2R1bGVFeHBvcnRzLlNlcnZlci5wcm90b3R5cGUsICdlbWl0JywgdGhpcy5fZ2V0UGF0Y2hJbmNvbWluZ1JlcXVlc3RGdW5jdGlvbignaHR0cCcpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBtb2R1bGVFeHBvcnRzO1xuICAgICAgICB9LCAobW9kdWxlRXhwb3J0cykgPT4ge1xuICAgICAgICAgICAgdGhpcy5faHR0cFBhdGNoZWQgPSBmYWxzZTtcbiAgICAgICAgICAgIGlmIChtb2R1bGVFeHBvcnRzID09PSB1bmRlZmluZWQpXG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgaWYgKCF0aGlzLmdldENvbmZpZygpLmRpc2FibGVPdXRnb2luZ1JlcXVlc3RJbnN0cnVtZW50YXRpb24pIHtcbiAgICAgICAgICAgICAgICB0aGlzLl91bndyYXAobW9kdWxlRXhwb3J0cywgJ3JlcXVlc3QnKTtcbiAgICAgICAgICAgICAgICB0aGlzLl91bndyYXAobW9kdWxlRXhwb3J0cywgJ2dldCcpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKCF0aGlzLmdldENvbmZpZygpLmRpc2FibGVJbmNvbWluZ1JlcXVlc3RJbnN0cnVtZW50YXRpb24pIHtcbiAgICAgICAgICAgICAgICB0aGlzLl91bndyYXAobW9kdWxlRXhwb3J0cy5TZXJ2ZXIucHJvdG90eXBlLCAnZW1pdCcpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG4gICAgX2dldEh0dHBzSW5zdHJ1bWVudGF0aW9uKCkge1xuICAgICAgICByZXR1cm4gbmV3IGluc3RydW1lbnRhdGlvbl8xLkluc3RydW1lbnRhdGlvbk5vZGVNb2R1bGVEZWZpbml0aW9uKCdodHRwcycsIFsnKiddLCAobW9kdWxlRXhwb3J0cykgPT4ge1xuICAgICAgICAgICAgLy8gR3VhcmQgYWdhaW5zdCBkb3VibGUtaW5zdHJ1bWVudGF0aW9uLCBpZiBsb2FkZWQgYnkgYm90aCBgcmVxdWlyZWBcbiAgICAgICAgICAgIC8vIGFuZCBgaW1wb3J0YC5cbiAgICAgICAgICAgIGlmICh0aGlzLl9odHRwc1BhdGNoZWQpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbW9kdWxlRXhwb3J0cztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuX2h0dHBzUGF0Y2hlZCA9IHRydWU7XG4gICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuICAgICAgICAgICAgY29uc3QgaXNFU00gPSBtb2R1bGVFeHBvcnRzW1N5bWJvbC50b1N0cmluZ1RhZ10gPT09ICdNb2R1bGUnO1xuICAgICAgICAgICAgaWYgKCF0aGlzLmdldENvbmZpZygpLmRpc2FibGVPdXRnb2luZ1JlcXVlc3RJbnN0cnVtZW50YXRpb24pIHtcbiAgICAgICAgICAgICAgICBjb25zdCBwYXRjaGVkUmVxdWVzdCA9IHRoaXMuX3dyYXAobW9kdWxlRXhwb3J0cywgJ3JlcXVlc3QnLCB0aGlzLl9nZXRQYXRjaEh0dHBzT3V0Z29pbmdSZXF1ZXN0RnVuY3Rpb24oJ2h0dHBzJykpO1xuICAgICAgICAgICAgICAgIGNvbnN0IHBhdGNoZWRHZXQgPSB0aGlzLl93cmFwKG1vZHVsZUV4cG9ydHMsICdnZXQnLCB0aGlzLl9nZXRQYXRjaEh0dHBzT3V0Z29pbmdHZXRGdW5jdGlvbihwYXRjaGVkUmVxdWVzdCkpO1xuICAgICAgICAgICAgICAgIGlmIChpc0VTTSkge1xuICAgICAgICAgICAgICAgICAgICAvLyBUbyBoYW5kbGUgYGltcG9ydCBodHRwcyBmcm9tICdodHRwcydgLCB3aGljaCByZXR1cm5zIHRoZSBkZWZhdWx0XG4gICAgICAgICAgICAgICAgICAgIC8vIGV4cG9ydCwgd2UgbmVlZCB0byBzZXQgYG1vZHVsZS5kZWZhdWx0LipgLlxuICAgICAgICAgICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuICAgICAgICAgICAgICAgICAgICBtb2R1bGVFeHBvcnRzLmRlZmF1bHQucmVxdWVzdCA9IHBhdGNoZWRSZXF1ZXN0O1xuICAgICAgICAgICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuICAgICAgICAgICAgICAgICAgICBtb2R1bGVFeHBvcnRzLmRlZmF1bHQuZ2V0ID0gcGF0Y2hlZEdldDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoIXRoaXMuZ2V0Q29uZmlnKCkuZGlzYWJsZUluY29taW5nUmVxdWVzdEluc3RydW1lbnRhdGlvbikge1xuICAgICAgICAgICAgICAgIHRoaXMuX3dyYXAobW9kdWxlRXhwb3J0cy5TZXJ2ZXIucHJvdG90eXBlLCAnZW1pdCcsIHRoaXMuX2dldFBhdGNoSW5jb21pbmdSZXF1ZXN0RnVuY3Rpb24oJ2h0dHBzJykpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIG1vZHVsZUV4cG9ydHM7XG4gICAgICAgIH0sIChtb2R1bGVFeHBvcnRzKSA9PiB7XG4gICAgICAgICAgICB0aGlzLl9odHRwc1BhdGNoZWQgPSBmYWxzZTtcbiAgICAgICAgICAgIGlmIChtb2R1bGVFeHBvcnRzID09PSB1bmRlZmluZWQpXG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgaWYgKCF0aGlzLmdldENvbmZpZygpLmRpc2FibGVPdXRnb2luZ1JlcXVlc3RJbnN0cnVtZW50YXRpb24pIHtcbiAgICAgICAgICAgICAgICB0aGlzLl91bndyYXAobW9kdWxlRXhwb3J0cywgJ3JlcXVlc3QnKTtcbiAgICAgICAgICAgICAgICB0aGlzLl91bndyYXAobW9kdWxlRXhwb3J0cywgJ2dldCcpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKCF0aGlzLmdldENvbmZpZygpLmRpc2FibGVJbmNvbWluZ1JlcXVlc3RJbnN0cnVtZW50YXRpb24pIHtcbiAgICAgICAgICAgICAgICB0aGlzLl91bndyYXAobW9kdWxlRXhwb3J0cy5TZXJ2ZXIucHJvdG90eXBlLCAnZW1pdCcpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBzcGFucyBmb3IgaW5jb21pbmcgcmVxdWVzdHMsIHJlc3RvcmluZyBzcGFucycgY29udGV4dCBpZiBhcHBsaWVkLlxuICAgICAqL1xuICAgIF9nZXRQYXRjaEluY29taW5nUmVxdWVzdEZ1bmN0aW9uKGNvbXBvbmVudCkge1xuICAgICAgICByZXR1cm4gKG9yaWdpbmFsKSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5faW5jb21pbmdSZXF1ZXN0RnVuY3Rpb24oY29tcG9uZW50LCBvcmlnaW5hbCk7XG4gICAgICAgIH07XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgc3BhbnMgZm9yIG91dGdvaW5nIHJlcXVlc3RzLCBzZW5kaW5nIHNwYW5zJyBjb250ZXh0IGZvciBkaXN0cmlidXRlZFxuICAgICAqIHRyYWNpbmcuXG4gICAgICovXG4gICAgX2dldFBhdGNoT3V0Z29pbmdSZXF1ZXN0RnVuY3Rpb24oY29tcG9uZW50KSB7XG4gICAgICAgIHJldHVybiAob3JpZ2luYWwpID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl9vdXRnb2luZ1JlcXVlc3RGdW5jdGlvbihjb21wb25lbnQsIG9yaWdpbmFsKTtcbiAgICAgICAgfTtcbiAgICB9XG4gICAgX2dldFBhdGNoT3V0Z29pbmdHZXRGdW5jdGlvbihjbGllbnRSZXF1ZXN0KSB7XG4gICAgICAgIHJldHVybiAoX29yaWdpbmFsKSA9PiB7XG4gICAgICAgICAgICAvLyBSZS1pbXBsZW1lbnQgaHR0cC5nZXQuIFRoaXMgbmVlZHMgdG8gYmUgZG9uZSAoaW5zdGVhZCBvZiB1c2luZ1xuICAgICAgICAgICAgLy8gZ2V0UGF0Y2hPdXRnb2luZ1JlcXVlc3RGdW5jdGlvbiB0byBwYXRjaCBpdCkgYmVjYXVzZSB3ZSBuZWVkIHRvXG4gICAgICAgICAgICAvLyBzZXQgdGhlIHRyYWNlIGNvbnRleHQgaGVhZGVyIGJlZm9yZSB0aGUgcmV0dXJuZWQgaHR0cC5DbGllbnRSZXF1ZXN0IGlzXG4gICAgICAgICAgICAvLyBlbmRlZC4gVGhlIE5vZGUuanMgZG9jcyBzdGF0ZSB0aGF0IHRoZSBvbmx5IGRpZmZlcmVuY2VzIGJldHdlZW5cbiAgICAgICAgICAgIC8vIHJlcXVlc3QgYW5kIGdldCBhcmUgdGhhdCAoMSkgZ2V0IGRlZmF1bHRzIHRvIHRoZSBIVFRQIEdFVCBtZXRob2QgYW5kXG4gICAgICAgICAgICAvLyAoMikgdGhlIHJldHVybmVkIHJlcXVlc3Qgb2JqZWN0IGlzIGVuZGVkIGltbWVkaWF0ZWx5LiBUaGUgZm9ybWVyIGlzXG4gICAgICAgICAgICAvLyBhbHJlYWR5IHRydWUgKGF0IGxlYXN0IGluIHN1cHBvcnRlZCBOb2RlIHZlcnNpb25zIHVwIHRvIHYxMCksIHNvIHdlXG4gICAgICAgICAgICAvLyBzaW1wbHkgZm9sbG93IHRoZSBsYXR0ZXIuIFJlZjpcbiAgICAgICAgICAgIC8vIGh0dHBzOi8vbm9kZWpzLm9yZy9kaXN0L2xhdGVzdC9kb2NzL2FwaS9odHRwLmh0bWwjaHR0cF9odHRwX2dldF9vcHRpb25zX2NhbGxiYWNrXG4gICAgICAgICAgICAvLyBodHRwczovL2dpdGh1Yi5jb20vZ29vZ2xlYXBpcy9jbG91ZC10cmFjZS1ub2RlanMvYmxvYi9tYXN0ZXIvc3JjL2luc3RydW1lbnRhdGlvbnMvaW5zdHJ1bWVudGF0aW9uLWh0dHAudHMjTDE5OFxuICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uIG91dGdvaW5nR2V0UmVxdWVzdChvcHRpb25zLCAuLi5hcmdzKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgcmVxID0gY2xpZW50UmVxdWVzdChvcHRpb25zLCAuLi5hcmdzKTtcbiAgICAgICAgICAgICAgICByZXEuZW5kKCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlcTtcbiAgICAgICAgICAgIH07XG4gICAgICAgIH07XG4gICAgfVxuICAgIC8qKiBQYXRjaGVzIEhUVFBTIG91dGdvaW5nIHJlcXVlc3RzICovXG4gICAgX2dldFBhdGNoSHR0cHNPdXRnb2luZ1JlcXVlc3RGdW5jdGlvbihjb21wb25lbnQpIHtcbiAgICAgICAgcmV0dXJuIChvcmlnaW5hbCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgaW5zdHJ1bWVudGF0aW9uID0gdGhpcztcbiAgICAgICAgICAgIHJldHVybiBmdW5jdGlvbiBodHRwc091dGdvaW5nUmVxdWVzdChcbiAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuL25vLXVuc3VwcG9ydGVkLWZlYXR1cmVzL25vZGUtYnVpbHRpbnNcbiAgICAgICAgICAgIG9wdGlvbnMsIC4uLmFyZ3MpIHtcbiAgICAgICAgICAgICAgICAvLyBNYWtlcyBzdXJlIG9wdGlvbnMgd2lsbCBoYXZlIGRlZmF1bHQgSFRUUFMgcGFyYW1ldGVyc1xuICAgICAgICAgICAgICAgIGlmIChjb21wb25lbnQgPT09ICdodHRwcycgJiZcbiAgICAgICAgICAgICAgICAgICAgdHlwZW9mIG9wdGlvbnMgPT09ICdvYmplY3QnICYmXG4gICAgICAgICAgICAgICAgICAgIG9wdGlvbnM/LmNvbnN0cnVjdG9yPy5uYW1lICE9PSAnVVJMJykge1xuICAgICAgICAgICAgICAgICAgICBvcHRpb25zID0gT2JqZWN0LmFzc2lnbih7fSwgb3B0aW9ucyk7XG4gICAgICAgICAgICAgICAgICAgIGluc3RydW1lbnRhdGlvbi5fc2V0RGVmYXVsdE9wdGlvbnMob3B0aW9ucyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiBpbnN0cnVtZW50YXRpb24uX2dldFBhdGNoT3V0Z29pbmdSZXF1ZXN0RnVuY3Rpb24oY29tcG9uZW50KShvcmlnaW5hbCkob3B0aW9ucywgLi4uYXJncyk7XG4gICAgICAgICAgICB9O1xuICAgICAgICB9O1xuICAgIH1cbiAgICBfc2V0RGVmYXVsdE9wdGlvbnMob3B0aW9ucykge1xuICAgICAgICBvcHRpb25zLnByb3RvY29sID0gb3B0aW9ucy5wcm90b2NvbCB8fCAnaHR0cHM6JztcbiAgICAgICAgb3B0aW9ucy5wb3J0ID0gb3B0aW9ucy5wb3J0IHx8IDQ0MztcbiAgICB9XG4gICAgLyoqIFBhdGNoZXMgSFRUUFMgb3V0Z29pbmcgZ2V0IHJlcXVlc3RzICovXG4gICAgX2dldFBhdGNoSHR0cHNPdXRnb2luZ0dldEZ1bmN0aW9uKGNsaWVudFJlcXVlc3QpIHtcbiAgICAgICAgcmV0dXJuIChvcmlnaW5hbCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgaW5zdHJ1bWVudGF0aW9uID0gdGhpcztcbiAgICAgICAgICAgIHJldHVybiBmdW5jdGlvbiBodHRwc091dGdvaW5nUmVxdWVzdChcbiAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuL25vLXVuc3VwcG9ydGVkLWZlYXR1cmVzL25vZGUtYnVpbHRpbnNcbiAgICAgICAgICAgIG9wdGlvbnMsIC4uLmFyZ3MpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gaW5zdHJ1bWVudGF0aW9uLl9nZXRQYXRjaE91dGdvaW5nR2V0RnVuY3Rpb24oY2xpZW50UmVxdWVzdCkob3JpZ2luYWwpKG9wdGlvbnMsIC4uLmFyZ3MpO1xuICAgICAgICAgICAgfTtcbiAgICAgICAgfTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQXR0YWNoIGV2ZW50IGxpc3RlbmVycyB0byBhIGNsaWVudCByZXF1ZXN0IHRvIGVuZCBzcGFuIGFuZCBhZGQgc3BhbiBhdHRyaWJ1dGVzLlxuICAgICAqXG4gICAgICogQHBhcmFtIHJlcXVlc3QgVGhlIG9yaWdpbmFsIHJlcXVlc3Qgb2JqZWN0LlxuICAgICAqIEBwYXJhbSBzcGFuIHJlcHJlc2VudGluZyB0aGUgY3VycmVudCBvcGVyYXRpb25cbiAgICAgKiBAcGFyYW0gc3RhcnRUaW1lIHJlcHJlc2VudGluZyB0aGUgc3RhcnQgdGltZSBvZiB0aGUgcmVxdWVzdCB0byBjYWxjdWxhdGUgZHVyYXRpb24gaW4gTWV0cmljXG4gICAgICogQHBhcmFtIG9sZE1ldHJpY0F0dHJpYnV0ZXMgbWV0cmljIGF0dHJpYnV0ZXMgZm9yIG9sZCBzZW1hbnRpYyBjb252ZW50aW9uc1xuICAgICAqIEBwYXJhbSBzdGFibGVNZXRyaWNBdHRyaWJ1dGVzIG1ldHJpYyBhdHRyaWJ1dGVzIGZvciBuZXcgc2VtYW50aWMgY29udmVudGlvbnNcbiAgICAgKi9cbiAgICBfdHJhY2VDbGllbnRSZXF1ZXN0KHJlcXVlc3QsIHNwYW4sIHN0YXJ0VGltZSwgb2xkTWV0cmljQXR0cmlidXRlcywgc3RhYmxlTWV0cmljQXR0cmlidXRlcykge1xuICAgICAgICBpZiAodGhpcy5nZXRDb25maWcoKS5yZXF1ZXN0SG9vaykge1xuICAgICAgICAgICAgdGhpcy5fY2FsbFJlcXVlc3RIb29rKHNwYW4sIHJlcXVlc3QpO1xuICAgICAgICB9XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBEZXRlcm1pbmVzIGlmIHRoZSByZXF1ZXN0IGhhcyBlcnJvcmVkIG9yIHRoZSByZXNwb25zZSBoYXMgZW5kZWQvZXJyb3JlZC5cbiAgICAgICAgICovXG4gICAgICAgIGxldCByZXNwb25zZUZpbmlzaGVkID0gZmFsc2U7XG4gICAgICAgIC8qXG4gICAgICAgICAqIFVzZXIgJ3Jlc3BvbnNlJyBldmVudCBsaXN0ZW5lcnMgY2FuIGJlIGFkZGVkIGJlZm9yZSBvdXIgbGlzdGVuZXIsXG4gICAgICAgICAqIGZvcmNlIG91ciBsaXN0ZW5lciB0byBiZSB0aGUgZmlyc3QsIHNvIHJlc3BvbnNlIGVtaXR0ZXIgaXMgYm91bmRcbiAgICAgICAgICogYmVmb3JlIGFueSB1c2VyIGxpc3RlbmVycyBhcmUgYWRkZWQgdG8gaXQuXG4gICAgICAgICAqL1xuICAgICAgICByZXF1ZXN0LnByZXBlbmRMaXN0ZW5lcigncmVzcG9uc2UnLCAocmVzcG9uc2UpID0+IHtcbiAgICAgICAgICAgIHRoaXMuX2RpYWcuZGVidWcoJ291dGdvaW5nUmVxdWVzdCBvbiByZXNwb25zZSgpJyk7XG4gICAgICAgICAgICBpZiAocmVxdWVzdC5saXN0ZW5lckNvdW50KCdyZXNwb25zZScpIDw9IDEpIHtcbiAgICAgICAgICAgICAgICByZXNwb25zZS5yZXN1bWUoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IHJlc3BvbnNlQXR0cmlidXRlcyA9ICgwLCB1dGlsc18xLmdldE91dGdvaW5nUmVxdWVzdEF0dHJpYnV0ZXNPblJlc3BvbnNlKShyZXNwb25zZSwgdGhpcy5fc2VtY29udlN0YWJpbGl0eSk7XG4gICAgICAgICAgICBzcGFuLnNldEF0dHJpYnV0ZXMocmVzcG9uc2VBdHRyaWJ1dGVzKTtcbiAgICAgICAgICAgIG9sZE1ldHJpY0F0dHJpYnV0ZXMgPSBPYmplY3QuYXNzaWduKG9sZE1ldHJpY0F0dHJpYnV0ZXMsICgwLCB1dGlsc18xLmdldE91dGdvaW5nUmVxdWVzdE1ldHJpY0F0dHJpYnV0ZXNPblJlc3BvbnNlKShyZXNwb25zZUF0dHJpYnV0ZXMpKTtcbiAgICAgICAgICAgIHN0YWJsZU1ldHJpY0F0dHJpYnV0ZXMgPSBPYmplY3QuYXNzaWduKHN0YWJsZU1ldHJpY0F0dHJpYnV0ZXMsICgwLCB1dGlsc18xLmdldE91dGdvaW5nU3RhYmxlUmVxdWVzdE1ldHJpY0F0dHJpYnV0ZXNPblJlc3BvbnNlKShyZXNwb25zZUF0dHJpYnV0ZXMpKTtcbiAgICAgICAgICAgIGlmICh0aGlzLmdldENvbmZpZygpLnJlc3BvbnNlSG9vaykge1xuICAgICAgICAgICAgICAgIHRoaXMuX2NhbGxSZXNwb25zZUhvb2soc3BhbiwgcmVzcG9uc2UpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgc3Bhbi5zZXRBdHRyaWJ1dGVzKHRoaXMuX2hlYWRlckNhcHR1cmUuY2xpZW50LmNhcHR1cmVSZXF1ZXN0SGVhZGVycyhoZWFkZXIgPT4gcmVxdWVzdC5nZXRIZWFkZXIoaGVhZGVyKSkpO1xuICAgICAgICAgICAgc3Bhbi5zZXRBdHRyaWJ1dGVzKHRoaXMuX2hlYWRlckNhcHR1cmUuY2xpZW50LmNhcHR1cmVSZXNwb25zZUhlYWRlcnMoaGVhZGVyID0+IHJlc3BvbnNlLmhlYWRlcnNbaGVhZGVyXSkpO1xuICAgICAgICAgICAgYXBpXzEuY29udGV4dC5iaW5kKGFwaV8xLmNvbnRleHQuYWN0aXZlKCksIHJlc3BvbnNlKTtcbiAgICAgICAgICAgIGNvbnN0IGVuZEhhbmRsZXIgPSAoKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5fZGlhZy5kZWJ1Zygnb3V0Z29pbmdSZXF1ZXN0IG9uIGVuZCgpJyk7XG4gICAgICAgICAgICAgICAgaWYgKHJlc3BvbnNlRmluaXNoZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXNwb25zZUZpbmlzaGVkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICBsZXQgc3RhdHVzO1xuICAgICAgICAgICAgICAgIGlmIChyZXNwb25zZS5hYm9ydGVkICYmICFyZXNwb25zZS5jb21wbGV0ZSkge1xuICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPSB7IGNvZGU6IGFwaV8xLlNwYW5TdGF0dXNDb2RlLkVSUk9SIH07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAvLyBiZWhhdmVzIHNhbWUgZm9yIG5ldyBhbmQgb2xkIHNlbWNvbnZcbiAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0ge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29kZTogKDAsIHV0aWxzXzEucGFyc2VSZXNwb25zZVN0YXR1cykoYXBpXzEuU3BhbktpbmQuQ0xJRU5ULCByZXNwb25zZS5zdGF0dXNDb2RlKSxcbiAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgc3Bhbi5zZXRTdGF0dXMoc3RhdHVzKTtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5nZXRDb25maWcoKS5hcHBseUN1c3RvbUF0dHJpYnV0ZXNPblNwYW4pIHtcbiAgICAgICAgICAgICAgICAgICAgKDAsIGluc3RydW1lbnRhdGlvbl8xLnNhZmVFeGVjdXRlSW5UaGVNaWRkbGUpKCgpID0+IHRoaXMuZ2V0Q29uZmlnKCkuYXBwbHlDdXN0b21BdHRyaWJ1dGVzT25TcGFuKHNwYW4sIHJlcXVlc3QsIHJlc3BvbnNlKSwgKCkgPT4geyB9LCB0cnVlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdGhpcy5fY2xvc2VIdHRwU3BhbihzcGFuLCBhcGlfMS5TcGFuS2luZC5DTElFTlQsIHN0YXJ0VGltZSwgb2xkTWV0cmljQXR0cmlidXRlcywgc3RhYmxlTWV0cmljQXR0cmlidXRlcyk7XG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgcmVzcG9uc2Uub24oJ2VuZCcsIGVuZEhhbmRsZXIpO1xuICAgICAgICAgICAgcmVzcG9uc2Uub24oZXZlbnRzXzEuZXJyb3JNb25pdG9yLCAoZXJyb3IpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLl9kaWFnLmRlYnVnKCdvdXRnb2luZ1JlcXVlc3Qgb24gZXJyb3IoKScsIGVycm9yKTtcbiAgICAgICAgICAgICAgICBpZiAocmVzcG9uc2VGaW5pc2hlZCkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJlc3BvbnNlRmluaXNoZWQgPSB0cnVlO1xuICAgICAgICAgICAgICAgIHRoaXMuX29uT3V0Z29pbmdSZXF1ZXN0RXJyb3Ioc3Bhbiwgb2xkTWV0cmljQXR0cmlidXRlcywgc3RhYmxlTWV0cmljQXR0cmlidXRlcywgc3RhcnRUaW1lLCBlcnJvcik7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgICAgIHJlcXVlc3Qub24oJ2Nsb3NlJywgKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5fZGlhZy5kZWJ1Zygnb3V0Z29pbmdSZXF1ZXN0IG9uIHJlcXVlc3QgY2xvc2UoKScpO1xuICAgICAgICAgICAgaWYgKHJlcXVlc3QuYWJvcnRlZCB8fCByZXNwb25zZUZpbmlzaGVkKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmVzcG9uc2VGaW5pc2hlZCA9IHRydWU7XG4gICAgICAgICAgICB0aGlzLl9jbG9zZUh0dHBTcGFuKHNwYW4sIGFwaV8xLlNwYW5LaW5kLkNMSUVOVCwgc3RhcnRUaW1lLCBvbGRNZXRyaWNBdHRyaWJ1dGVzLCBzdGFibGVNZXRyaWNBdHRyaWJ1dGVzKTtcbiAgICAgICAgfSk7XG4gICAgICAgIHJlcXVlc3Qub24oZXZlbnRzXzEuZXJyb3JNb25pdG9yLCAoZXJyb3IpID0+IHtcbiAgICAgICAgICAgIHRoaXMuX2RpYWcuZGVidWcoJ291dGdvaW5nUmVxdWVzdCBvbiByZXF1ZXN0IGVycm9yKCknLCBlcnJvcik7XG4gICAgICAgICAgICBpZiAocmVzcG9uc2VGaW5pc2hlZCkge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJlc3BvbnNlRmluaXNoZWQgPSB0cnVlO1xuICAgICAgICAgICAgdGhpcy5fb25PdXRnb2luZ1JlcXVlc3RFcnJvcihzcGFuLCBvbGRNZXRyaWNBdHRyaWJ1dGVzLCBzdGFibGVNZXRyaWNBdHRyaWJ1dGVzLCBzdGFydFRpbWUsIGVycm9yKTtcbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMuX2RpYWcuZGVidWcoJ2h0dHAuQ2xpZW50UmVxdWVzdCByZXR1cm4gcmVxdWVzdCcpO1xuICAgICAgICByZXR1cm4gcmVxdWVzdDtcbiAgICB9XG4gICAgX2luY29taW5nUmVxdWVzdEZ1bmN0aW9uKGNvbXBvbmVudCwgb3JpZ2luYWwpIHtcbiAgICAgICAgY29uc3QgaW5zdHJ1bWVudGF0aW9uID0gdGhpcztcbiAgICAgICAgcmV0dXJuIGZ1bmN0aW9uIGluY29taW5nUmVxdWVzdChldmVudCwgLi4uYXJncykge1xuICAgICAgICAgICAgLy8gT25seSB0cmFjZXMgcmVxdWVzdCBldmVudHNcbiAgICAgICAgICAgIGlmIChldmVudCAhPT0gJ3JlcXVlc3QnKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG9yaWdpbmFsLmFwcGx5KHRoaXMsIFtldmVudCwgLi4uYXJnc10pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgcmVxdWVzdCA9IGFyZ3NbMF07XG4gICAgICAgICAgICBjb25zdCByZXNwb25zZSA9IGFyZ3NbMV07XG4gICAgICAgICAgICBjb25zdCBtZXRob2QgPSByZXF1ZXN0Lm1ldGhvZCB8fCAnR0VUJztcbiAgICAgICAgICAgIGluc3RydW1lbnRhdGlvbi5fZGlhZy5kZWJ1ZyhgJHtjb21wb25lbnR9IGluc3RydW1lbnRhdGlvbiBpbmNvbWluZ1JlcXVlc3RgKTtcbiAgICAgICAgICAgIGlmICgoMCwgaW5zdHJ1bWVudGF0aW9uXzEuc2FmZUV4ZWN1dGVJblRoZU1pZGRsZSkoKCkgPT4gaW5zdHJ1bWVudGF0aW9uLmdldENvbmZpZygpLmlnbm9yZUluY29taW5nUmVxdWVzdEhvb2s/LihyZXF1ZXN0KSwgKGUpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoZSAhPSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgIGluc3RydW1lbnRhdGlvbi5fZGlhZy5lcnJvcignY2F1Z2h0IGlnbm9yZUluY29taW5nUmVxdWVzdEhvb2sgZXJyb3I6ICcsIGUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sIHRydWUpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGFwaV8xLmNvbnRleHQud2l0aCgoMCwgY29yZV8xLnN1cHByZXNzVHJhY2luZykoYXBpXzEuY29udGV4dC5hY3RpdmUoKSksICgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgYXBpXzEuY29udGV4dC5iaW5kKGFwaV8xLmNvbnRleHQuYWN0aXZlKCksIHJlcXVlc3QpO1xuICAgICAgICAgICAgICAgICAgICBhcGlfMS5jb250ZXh0LmJpbmQoYXBpXzEuY29udGV4dC5hY3RpdmUoKSwgcmVzcG9uc2UpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gb3JpZ2luYWwuYXBwbHkodGhpcywgW2V2ZW50LCAuLi5hcmdzXSk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCBoZWFkZXJzID0gcmVxdWVzdC5oZWFkZXJzO1xuICAgICAgICAgICAgY29uc3Qgc3BhbkF0dHJpYnV0ZXMgPSAoMCwgdXRpbHNfMS5nZXRJbmNvbWluZ1JlcXVlc3RBdHRyaWJ1dGVzKShyZXF1ZXN0LCB7XG4gICAgICAgICAgICAgICAgY29tcG9uZW50OiBjb21wb25lbnQsXG4gICAgICAgICAgICAgICAgc2VydmVyTmFtZTogaW5zdHJ1bWVudGF0aW9uLmdldENvbmZpZygpLnNlcnZlck5hbWUsXG4gICAgICAgICAgICAgICAgaG9va0F0dHJpYnV0ZXM6IGluc3RydW1lbnRhdGlvbi5fY2FsbFN0YXJ0U3Bhbkhvb2socmVxdWVzdCwgaW5zdHJ1bWVudGF0aW9uLmdldENvbmZpZygpLnN0YXJ0SW5jb21pbmdTcGFuSG9vayksXG4gICAgICAgICAgICAgICAgc2VtY29udlN0YWJpbGl0eTogaW5zdHJ1bWVudGF0aW9uLl9zZW1jb252U3RhYmlsaXR5LFxuICAgICAgICAgICAgICAgIGVuYWJsZVN5bnRoZXRpY1NvdXJjZURldGVjdGlvbjogaW5zdHJ1bWVudGF0aW9uLmdldENvbmZpZygpLmVuYWJsZVN5bnRoZXRpY1NvdXJjZURldGVjdGlvbiB8fCBmYWxzZSxcbiAgICAgICAgICAgIH0sIGluc3RydW1lbnRhdGlvbi5fZGlhZyk7XG4gICAgICAgICAgICBPYmplY3QuYXNzaWduKHNwYW5BdHRyaWJ1dGVzLCBpbnN0cnVtZW50YXRpb24uX2hlYWRlckNhcHR1cmUuc2VydmVyLmNhcHR1cmVSZXF1ZXN0SGVhZGVycyhoZWFkZXIgPT4gcmVxdWVzdC5oZWFkZXJzW2hlYWRlcl0pKTtcbiAgICAgICAgICAgIGNvbnN0IHNwYW5PcHRpb25zID0ge1xuICAgICAgICAgICAgICAgIGtpbmQ6IGFwaV8xLlNwYW5LaW5kLlNFUlZFUixcbiAgICAgICAgICAgICAgICBhdHRyaWJ1dGVzOiBzcGFuQXR0cmlidXRlcyxcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICBjb25zdCBzdGFydFRpbWUgPSAoMCwgY29yZV8xLmhyVGltZSkoKTtcbiAgICAgICAgICAgIGNvbnN0IG9sZE1ldHJpY0F0dHJpYnV0ZXMgPSAoMCwgdXRpbHNfMS5nZXRJbmNvbWluZ1JlcXVlc3RNZXRyaWNBdHRyaWJ1dGVzKShzcGFuQXR0cmlidXRlcyk7XG4gICAgICAgICAgICAvLyByZXF1ZXN0IG1ldGhvZCBhbmQgdXJsLnNjaGVtZSBhcmUgYm90aCByZXF1aXJlZCBzcGFuIGF0dHJpYnV0ZXNcbiAgICAgICAgICAgIGNvbnN0IHN0YWJsZU1ldHJpY0F0dHJpYnV0ZXMgPSB7XG4gICAgICAgICAgICAgICAgW3NlbWFudGljX2NvbnZlbnRpb25zXzEuQVRUUl9IVFRQX1JFUVVFU1RfTUVUSE9EXTogc3BhbkF0dHJpYnV0ZXNbc2VtYW50aWNfY29udmVudGlvbnNfMS5BVFRSX0hUVFBfUkVRVUVTVF9NRVRIT0RdLFxuICAgICAgICAgICAgICAgIFtzZW1hbnRpY19jb252ZW50aW9uc18xLkFUVFJfVVJMX1NDSEVNRV06IHNwYW5BdHRyaWJ1dGVzW3NlbWFudGljX2NvbnZlbnRpb25zXzEuQVRUUl9VUkxfU0NIRU1FXSxcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICAvLyByZWNvbW1lbmRlZCBpZiBhbmQgb25seSBpZiBvbmUgd2FzIHNlbnQsIHNhbWUgYXMgc3BhbiByZWNvbW1lbmRhdGlvblxuICAgICAgICAgICAgaWYgKHNwYW5BdHRyaWJ1dGVzW3NlbWFudGljX2NvbnZlbnRpb25zXzEuQVRUUl9ORVRXT1JLX1BST1RPQ09MX1ZFUlNJT05dKSB7XG4gICAgICAgICAgICAgICAgc3RhYmxlTWV0cmljQXR0cmlidXRlc1tzZW1hbnRpY19jb252ZW50aW9uc18xLkFUVFJfTkVUV09SS19QUk9UT0NPTF9WRVJTSU9OXSA9XG4gICAgICAgICAgICAgICAgICAgIHNwYW5BdHRyaWJ1dGVzW3NlbWFudGljX2NvbnZlbnRpb25zXzEuQVRUUl9ORVRXT1JLX1BST1RPQ09MX1ZFUlNJT05dO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgY3R4ID0gYXBpXzEucHJvcGFnYXRpb24uZXh0cmFjdChhcGlfMS5ST09UX0NPTlRFWFQsIGhlYWRlcnMpO1xuICAgICAgICAgICAgY29uc3Qgc3BhbiA9IGluc3RydW1lbnRhdGlvbi5fc3RhcnRIdHRwU3BhbihtZXRob2QsIHNwYW5PcHRpb25zLCBjdHgpO1xuICAgICAgICAgICAgY29uc3QgcnBjTWV0YWRhdGEgPSB7XG4gICAgICAgICAgICAgICAgdHlwZTogY29yZV8xLlJQQ1R5cGUuSFRUUCxcbiAgICAgICAgICAgICAgICBzcGFuLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIHJldHVybiBhcGlfMS5jb250ZXh0LndpdGgoKDAsIGNvcmVfMS5zZXRSUENNZXRhZGF0YSkoYXBpXzEudHJhY2Uuc2V0U3BhbihjdHgsIHNwYW4pLCBycGNNZXRhZGF0YSksICgpID0+IHtcbiAgICAgICAgICAgICAgICBhcGlfMS5jb250ZXh0LmJpbmQoYXBpXzEuY29udGV4dC5hY3RpdmUoKSwgcmVxdWVzdCk7XG4gICAgICAgICAgICAgICAgYXBpXzEuY29udGV4dC5iaW5kKGFwaV8xLmNvbnRleHQuYWN0aXZlKCksIHJlc3BvbnNlKTtcbiAgICAgICAgICAgICAgICBpZiAoaW5zdHJ1bWVudGF0aW9uLmdldENvbmZpZygpLnJlcXVlc3RIb29rKSB7XG4gICAgICAgICAgICAgICAgICAgIGluc3RydW1lbnRhdGlvbi5fY2FsbFJlcXVlc3RIb29rKHNwYW4sIHJlcXVlc3QpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoaW5zdHJ1bWVudGF0aW9uLmdldENvbmZpZygpLnJlc3BvbnNlSG9vaykge1xuICAgICAgICAgICAgICAgICAgICBpbnN0cnVtZW50YXRpb24uX2NhbGxSZXNwb25zZUhvb2soc3BhbiwgcmVzcG9uc2UpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAvLyBBZnRlciAnZXJyb3InLCBubyBmdXJ0aGVyIGV2ZW50cyBvdGhlciB0aGFuICdjbG9zZScgc2hvdWxkIGJlIGVtaXR0ZWQuXG4gICAgICAgICAgICAgICAgbGV0IGhhc0Vycm9yID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgcmVzcG9uc2Uub24oJ2Nsb3NlJywgKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBpZiAoaGFzRXJyb3IpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBpbnN0cnVtZW50YXRpb24uX29uU2VydmVyUmVzcG9uc2VGaW5pc2gocmVxdWVzdCwgcmVzcG9uc2UsIHNwYW4sIG9sZE1ldHJpY0F0dHJpYnV0ZXMsIHN0YWJsZU1ldHJpY0F0dHJpYnV0ZXMsIHN0YXJ0VGltZSk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgcmVzcG9uc2Uub24oZXZlbnRzXzEuZXJyb3JNb25pdG9yLCAoZXJyKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGhhc0Vycm9yID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgaW5zdHJ1bWVudGF0aW9uLl9vblNlcnZlclJlc3BvbnNlRXJyb3Ioc3Bhbiwgb2xkTWV0cmljQXR0cmlidXRlcywgc3RhYmxlTWV0cmljQXR0cmlidXRlcywgc3RhcnRUaW1lLCBlcnIpO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIHJldHVybiAoMCwgaW5zdHJ1bWVudGF0aW9uXzEuc2FmZUV4ZWN1dGVJblRoZU1pZGRsZSkoKCkgPT4gb3JpZ2luYWwuYXBwbHkodGhpcywgW2V2ZW50LCAuLi5hcmdzXSksIGVycm9yID0+IHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGVycm9yKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpbnN0cnVtZW50YXRpb24uX29uU2VydmVyUmVzcG9uc2VFcnJvcihzcGFuLCBvbGRNZXRyaWNBdHRyaWJ1dGVzLCBzdGFibGVNZXRyaWNBdHRyaWJ1dGVzLCBzdGFydFRpbWUsIGVycm9yKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IGVycm9yO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfTtcbiAgICB9XG4gICAgX291dGdvaW5nUmVxdWVzdEZ1bmN0aW9uKGNvbXBvbmVudCwgb3JpZ2luYWwpIHtcbiAgICAgICAgY29uc3QgaW5zdHJ1bWVudGF0aW9uID0gdGhpcztcbiAgICAgICAgcmV0dXJuIGZ1bmN0aW9uIG91dGdvaW5nUmVxdWVzdChvcHRpb25zLCAuLi5hcmdzKSB7XG4gICAgICAgICAgICBpZiAoISgwLCB1dGlsc18xLmlzVmFsaWRPcHRpb25zVHlwZSkob3B0aW9ucykpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gb3JpZ2luYWwuYXBwbHkodGhpcywgW29wdGlvbnMsIC4uLmFyZ3NdKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IGV4dHJhT3B0aW9ucyA9IHR5cGVvZiBhcmdzWzBdID09PSAnb2JqZWN0JyAmJlxuICAgICAgICAgICAgICAgICh0eXBlb2Ygb3B0aW9ucyA9PT0gJ3N0cmluZycgfHwgb3B0aW9ucyBpbnN0YW5jZW9mIHVybC5VUkwpXG4gICAgICAgICAgICAgICAgPyBhcmdzLnNoaWZ0KClcbiAgICAgICAgICAgICAgICA6IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIGNvbnN0IHsgbWV0aG9kLCBpbnZhbGlkVXJsLCBvcHRpb25zUGFyc2VkIH0gPSAoMCwgdXRpbHNfMS5nZXRSZXF1ZXN0SW5mbykoaW5zdHJ1bWVudGF0aW9uLl9kaWFnLCBvcHRpb25zLCBleHRyYU9wdGlvbnMpO1xuICAgICAgICAgICAgaWYgKCgwLCBpbnN0cnVtZW50YXRpb25fMS5zYWZlRXhlY3V0ZUluVGhlTWlkZGxlKSgoKSA9PiBpbnN0cnVtZW50YXRpb25cbiAgICAgICAgICAgICAgICAuZ2V0Q29uZmlnKClcbiAgICAgICAgICAgICAgICAuaWdub3JlT3V0Z29pbmdSZXF1ZXN0SG9vaz8uKG9wdGlvbnNQYXJzZWQpLCAoZSkgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChlICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgaW5zdHJ1bWVudGF0aW9uLl9kaWFnLmVycm9yKCdjYXVnaHQgaWdub3JlT3V0Z29pbmdSZXF1ZXN0SG9vayBlcnJvcjogJywgZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSwgdHJ1ZSkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gb3JpZ2luYWwuYXBwbHkodGhpcywgW29wdGlvbnNQYXJzZWQsIC4uLmFyZ3NdKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IHsgaG9zdG5hbWUsIHBvcnQgfSA9ICgwLCB1dGlsc18xLmV4dHJhY3RIb3N0bmFtZUFuZFBvcnQpKG9wdGlvbnNQYXJzZWQpO1xuICAgICAgICAgICAgY29uc3QgYXR0cmlidXRlcyA9ICgwLCB1dGlsc18xLmdldE91dGdvaW5nUmVxdWVzdEF0dHJpYnV0ZXMpKG9wdGlvbnNQYXJzZWQsIHtcbiAgICAgICAgICAgICAgICBjb21wb25lbnQsXG4gICAgICAgICAgICAgICAgcG9ydCxcbiAgICAgICAgICAgICAgICBob3N0bmFtZSxcbiAgICAgICAgICAgICAgICBob29rQXR0cmlidXRlczogaW5zdHJ1bWVudGF0aW9uLl9jYWxsU3RhcnRTcGFuSG9vayhvcHRpb25zUGFyc2VkLCBpbnN0cnVtZW50YXRpb24uZ2V0Q29uZmlnKCkuc3RhcnRPdXRnb2luZ1NwYW5Ib29rKSxcbiAgICAgICAgICAgICAgICByZWRhY3RlZFF1ZXJ5UGFyYW1zOiBpbnN0cnVtZW50YXRpb24uZ2V0Q29uZmlnKCkucmVkYWN0ZWRRdWVyeVBhcmFtcywgLy8gQWRkZWQgY29uZmlnIGZvciBhZGRpbmcgY3VzdG9tIHF1ZXJ5IHN0cmluZ3NcbiAgICAgICAgICAgIH0sIGluc3RydW1lbnRhdGlvbi5fc2VtY29udlN0YWJpbGl0eSwgaW5zdHJ1bWVudGF0aW9uLmdldENvbmZpZygpLmVuYWJsZVN5bnRoZXRpY1NvdXJjZURldGVjdGlvbiB8fCBmYWxzZSk7XG4gICAgICAgICAgICBjb25zdCBzdGFydFRpbWUgPSAoMCwgY29yZV8xLmhyVGltZSkoKTtcbiAgICAgICAgICAgIGNvbnN0IG9sZE1ldHJpY0F0dHJpYnV0ZXMgPSAoMCwgdXRpbHNfMS5nZXRPdXRnb2luZ1JlcXVlc3RNZXRyaWNBdHRyaWJ1dGVzKShhdHRyaWJ1dGVzKTtcbiAgICAgICAgICAgIC8vIHJlcXVlc3QgbWV0aG9kLCBzZXJ2ZXIgYWRkcmVzcywgYW5kIHNlcnZlciBwb3J0IGFyZSBib3RoIHJlcXVpcmVkIHNwYW4gYXR0cmlidXRlc1xuICAgICAgICAgICAgY29uc3Qgc3RhYmxlTWV0cmljQXR0cmlidXRlcyA9IHtcbiAgICAgICAgICAgICAgICBbc2VtYW50aWNfY29udmVudGlvbnNfMS5BVFRSX0hUVFBfUkVRVUVTVF9NRVRIT0RdOiBhdHRyaWJ1dGVzW3NlbWFudGljX2NvbnZlbnRpb25zXzEuQVRUUl9IVFRQX1JFUVVFU1RfTUVUSE9EXSxcbiAgICAgICAgICAgICAgICBbc2VtYW50aWNfY29udmVudGlvbnNfMS5BVFRSX1NFUlZFUl9BRERSRVNTXTogYXR0cmlidXRlc1tzZW1hbnRpY19jb252ZW50aW9uc18xLkFUVFJfU0VSVkVSX0FERFJFU1NdLFxuICAgICAgICAgICAgICAgIFtzZW1hbnRpY19jb252ZW50aW9uc18xLkFUVFJfU0VSVkVSX1BPUlRdOiBhdHRyaWJ1dGVzW3NlbWFudGljX2NvbnZlbnRpb25zXzEuQVRUUl9TRVJWRVJfUE9SVF0sXG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgLy8gcmVxdWlyZWQgaWYgYW5kIG9ubHkgaWYgb25lIHdhcyBzZW50LCBzYW1lIGFzIHNwYW4gcmVxdWlyZW1lbnRcbiAgICAgICAgICAgIGlmIChhdHRyaWJ1dGVzW3NlbWFudGljX2NvbnZlbnRpb25zXzEuQVRUUl9IVFRQX1JFU1BPTlNFX1NUQVRVU19DT0RFXSkge1xuICAgICAgICAgICAgICAgIHN0YWJsZU1ldHJpY0F0dHJpYnV0ZXNbc2VtYW50aWNfY29udmVudGlvbnNfMS5BVFRSX0hUVFBfUkVTUE9OU0VfU1RBVFVTX0NPREVdID1cbiAgICAgICAgICAgICAgICAgICAgYXR0cmlidXRlc1tzZW1hbnRpY19jb252ZW50aW9uc18xLkFUVFJfSFRUUF9SRVNQT05TRV9TVEFUVVNfQ09ERV07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyByZWNvbW1lbmRlZCBpZiBhbmQgb25seSBpZiBvbmUgd2FzIHNlbnQsIHNhbWUgYXMgc3BhbiByZWNvbW1lbmRhdGlvblxuICAgICAgICAgICAgaWYgKGF0dHJpYnV0ZXNbc2VtYW50aWNfY29udmVudGlvbnNfMS5BVFRSX05FVFdPUktfUFJPVE9DT0xfVkVSU0lPTl0pIHtcbiAgICAgICAgICAgICAgICBzdGFibGVNZXRyaWNBdHRyaWJ1dGVzW3NlbWFudGljX2NvbnZlbnRpb25zXzEuQVRUUl9ORVRXT1JLX1BST1RPQ09MX1ZFUlNJT05dID1cbiAgICAgICAgICAgICAgICAgICAgYXR0cmlidXRlc1tzZW1hbnRpY19jb252ZW50aW9uc18xLkFUVFJfTkVUV09SS19QUk9UT0NPTF9WRVJTSU9OXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IHNwYW5PcHRpb25zID0ge1xuICAgICAgICAgICAgICAgIGtpbmQ6IGFwaV8xLlNwYW5LaW5kLkNMSUVOVCxcbiAgICAgICAgICAgICAgICBhdHRyaWJ1dGVzLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIGNvbnN0IHNwYW4gPSBpbnN0cnVtZW50YXRpb24uX3N0YXJ0SHR0cFNwYW4obWV0aG9kLCBzcGFuT3B0aW9ucyk7XG4gICAgICAgICAgICBjb25zdCBwYXJlbnRDb250ZXh0ID0gYXBpXzEuY29udGV4dC5hY3RpdmUoKTtcbiAgICAgICAgICAgIGNvbnN0IHJlcXVlc3RDb250ZXh0ID0gYXBpXzEudHJhY2Uuc2V0U3BhbihwYXJlbnRDb250ZXh0LCBzcGFuKTtcbiAgICAgICAgICAgIGlmICghb3B0aW9uc1BhcnNlZC5oZWFkZXJzKSB7XG4gICAgICAgICAgICAgICAgb3B0aW9uc1BhcnNlZC5oZWFkZXJzID0ge307XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAvLyBNYWtlIGEgY29weSBvZiB0aGUgaGVhZGVycyBvYmplY3QgdG8gYXZvaWQgbXV0YXRpbmcgYW4gb2JqZWN0IHRoZVxuICAgICAgICAgICAgICAgIC8vIGNhbGxlciBtaWdodCBoYXZlIGEgcmVmZXJlbmNlIHRvLlxuICAgICAgICAgICAgICAgIG9wdGlvbnNQYXJzZWQuaGVhZGVycyA9IE9iamVjdC5hc3NpZ24oe30sIG9wdGlvbnNQYXJzZWQuaGVhZGVycyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBhcGlfMS5wcm9wYWdhdGlvbi5pbmplY3QocmVxdWVzdENvbnRleHQsIG9wdGlvbnNQYXJzZWQuaGVhZGVycyk7XG4gICAgICAgICAgICByZXR1cm4gYXBpXzEuY29udGV4dC53aXRoKHJlcXVlc3RDb250ZXh0LCAoKSA9PiB7XG4gICAgICAgICAgICAgICAgLypcbiAgICAgICAgICAgICAgICAgKiBUaGUgcmVzcG9uc2UgY2FsbGJhY2sgaXMgcmVnaXN0ZXJlZCBiZWZvcmUgQ2xpZW50UmVxdWVzdCBpcyBib3VuZCxcbiAgICAgICAgICAgICAgICAgKiB0aHVzIGl0IGlzIG5lZWRlZCB0byBiaW5kIGl0IGJlZm9yZSB0aGUgZnVuY3Rpb24gY2FsbC5cbiAgICAgICAgICAgICAgICAgKi9cbiAgICAgICAgICAgICAgICBjb25zdCBjYiA9IGFyZ3NbYXJncy5sZW5ndGggLSAxXTtcbiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIGNiID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICAgICAgICAgIGFyZ3NbYXJncy5sZW5ndGggLSAxXSA9IGFwaV8xLmNvbnRleHQuYmluZChwYXJlbnRDb250ZXh0LCBjYik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNvbnN0IHJlcXVlc3QgPSAoMCwgaW5zdHJ1bWVudGF0aW9uXzEuc2FmZUV4ZWN1dGVJblRoZU1pZGRsZSkoKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBpZiAoaW52YWxpZFVybCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gd2Uga25vdyB0aGF0IHRoZSB1cmwgaXMgaW52YWxpZCwgdGhlcmUncyBubyBwb2ludCBpbiBpbmplY3RpbmcgY29udGV4dCBhcyBpdCB3aWxsIGZhaWwgdmFsaWRhdGlvbi5cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFBhc3NpbmcgaW4gd2hhdCB0aGUgdXNlciBwcm92aWRlZCB3aWxsIGdpdmUgdGhlIHVzZXIgYW4gZXJyb3IgdGhhdCBtYXRjaGVzIHdoYXQgdGhleSdkIHNlZSB3aXRob3V0XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGUgaW5zdHJ1bWVudGF0aW9uLlxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG9yaWdpbmFsLmFwcGx5KHRoaXMsIFtvcHRpb25zLCAuLi5hcmdzXSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gb3JpZ2luYWwuYXBwbHkodGhpcywgW29wdGlvbnNQYXJzZWQsIC4uLmFyZ3NdKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0sIGVycm9yID0+IHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGVycm9yKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpbnN0cnVtZW50YXRpb24uX29uT3V0Z29pbmdSZXF1ZXN0RXJyb3Ioc3Bhbiwgb2xkTWV0cmljQXR0cmlidXRlcywgc3RhYmxlTWV0cmljQXR0cmlidXRlcywgc3RhcnRUaW1lLCBlcnJvcik7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIGluc3RydW1lbnRhdGlvbi5fZGlhZy5kZWJ1ZyhgJHtjb21wb25lbnR9IGluc3RydW1lbnRhdGlvbiBvdXRnb2luZ1JlcXVlc3RgKTtcbiAgICAgICAgICAgICAgICBhcGlfMS5jb250ZXh0LmJpbmQocGFyZW50Q29udGV4dCwgcmVxdWVzdCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGluc3RydW1lbnRhdGlvbi5fdHJhY2VDbGllbnRSZXF1ZXN0KHJlcXVlc3QsIHNwYW4sIHN0YXJ0VGltZSwgb2xkTWV0cmljQXR0cmlidXRlcywgc3RhYmxlTWV0cmljQXR0cmlidXRlcyk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfTtcbiAgICB9XG4gICAgX29uU2VydmVyUmVzcG9uc2VGaW5pc2gocmVxdWVzdCwgcmVzcG9uc2UsIHNwYW4sIG9sZE1ldHJpY0F0dHJpYnV0ZXMsIHN0YWJsZU1ldHJpY0F0dHJpYnV0ZXMsIHN0YXJ0VGltZSkge1xuICAgICAgICBjb25zdCBhdHRyaWJ1dGVzID0gKDAsIHV0aWxzXzEuZ2V0SW5jb21pbmdSZXF1ZXN0QXR0cmlidXRlc09uUmVzcG9uc2UpKHJlcXVlc3QsIHJlc3BvbnNlLCB0aGlzLl9zZW1jb252U3RhYmlsaXR5KTtcbiAgICAgICAgb2xkTWV0cmljQXR0cmlidXRlcyA9IE9iamVjdC5hc3NpZ24ob2xkTWV0cmljQXR0cmlidXRlcywgKDAsIHV0aWxzXzEuZ2V0SW5jb21pbmdSZXF1ZXN0TWV0cmljQXR0cmlidXRlc09uUmVzcG9uc2UpKGF0dHJpYnV0ZXMpKTtcbiAgICAgICAgc3RhYmxlTWV0cmljQXR0cmlidXRlcyA9IE9iamVjdC5hc3NpZ24oc3RhYmxlTWV0cmljQXR0cmlidXRlcywgKDAsIHV0aWxzXzEuZ2V0SW5jb21pbmdTdGFibGVSZXF1ZXN0TWV0cmljQXR0cmlidXRlc09uUmVzcG9uc2UpKGF0dHJpYnV0ZXMpKTtcbiAgICAgICAgc3Bhbi5zZXRBdHRyaWJ1dGVzKHRoaXMuX2hlYWRlckNhcHR1cmUuc2VydmVyLmNhcHR1cmVSZXNwb25zZUhlYWRlcnMoaGVhZGVyID0+IHJlc3BvbnNlLmdldEhlYWRlcihoZWFkZXIpKSk7XG4gICAgICAgIHNwYW4uc2V0QXR0cmlidXRlcyhhdHRyaWJ1dGVzKS5zZXRTdGF0dXMoe1xuICAgICAgICAgICAgY29kZTogKDAsIHV0aWxzXzEucGFyc2VSZXNwb25zZVN0YXR1cykoYXBpXzEuU3BhbktpbmQuU0VSVkVSLCByZXNwb25zZS5zdGF0dXNDb2RlKSxcbiAgICAgICAgfSk7XG4gICAgICAgIGNvbnN0IHJvdXRlID0gYXR0cmlidXRlc1tzZW1hbnRpY19jb252ZW50aW9uc18xLkFUVFJfSFRUUF9ST1VURV07XG4gICAgICAgIGlmIChyb3V0ZSkge1xuICAgICAgICAgICAgc3Bhbi51cGRhdGVOYW1lKGAke3JlcXVlc3QubWV0aG9kIHx8ICdHRVQnfSAke3JvdXRlfWApO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLmdldENvbmZpZygpLmFwcGx5Q3VzdG9tQXR0cmlidXRlc09uU3Bhbikge1xuICAgICAgICAgICAgKDAsIGluc3RydW1lbnRhdGlvbl8xLnNhZmVFeGVjdXRlSW5UaGVNaWRkbGUpKCgpID0+IHRoaXMuZ2V0Q29uZmlnKCkuYXBwbHlDdXN0b21BdHRyaWJ1dGVzT25TcGFuKHNwYW4sIHJlcXVlc3QsIHJlc3BvbnNlKSwgKCkgPT4geyB9LCB0cnVlKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl9jbG9zZUh0dHBTcGFuKHNwYW4sIGFwaV8xLlNwYW5LaW5kLlNFUlZFUiwgc3RhcnRUaW1lLCBvbGRNZXRyaWNBdHRyaWJ1dGVzLCBzdGFibGVNZXRyaWNBdHRyaWJ1dGVzKTtcbiAgICB9XG4gICAgX29uT3V0Z29pbmdSZXF1ZXN0RXJyb3Ioc3Bhbiwgb2xkTWV0cmljQXR0cmlidXRlcywgc3RhYmxlTWV0cmljQXR0cmlidXRlcywgc3RhcnRUaW1lLCBlcnJvcikge1xuICAgICAgICAoMCwgdXRpbHNfMS5zZXRTcGFuV2l0aEVycm9yKShzcGFuLCBlcnJvciwgdGhpcy5fc2VtY29udlN0YWJpbGl0eSk7XG4gICAgICAgIHN0YWJsZU1ldHJpY0F0dHJpYnV0ZXNbc2VtYW50aWNfY29udmVudGlvbnNfMS5BVFRSX0VSUk9SX1RZUEVdID0gZXJyb3IubmFtZTtcbiAgICAgICAgdGhpcy5fY2xvc2VIdHRwU3BhbihzcGFuLCBhcGlfMS5TcGFuS2luZC5DTElFTlQsIHN0YXJ0VGltZSwgb2xkTWV0cmljQXR0cmlidXRlcywgc3RhYmxlTWV0cmljQXR0cmlidXRlcyk7XG4gICAgfVxuICAgIF9vblNlcnZlclJlc3BvbnNlRXJyb3Ioc3Bhbiwgb2xkTWV0cmljQXR0cmlidXRlcywgc3RhYmxlTWV0cmljQXR0cmlidXRlcywgc3RhcnRUaW1lLCBlcnJvcikge1xuICAgICAgICAoMCwgdXRpbHNfMS5zZXRTcGFuV2l0aEVycm9yKShzcGFuLCBlcnJvciwgdGhpcy5fc2VtY29udlN0YWJpbGl0eSk7XG4gICAgICAgIHN0YWJsZU1ldHJpY0F0dHJpYnV0ZXNbc2VtYW50aWNfY29udmVudGlvbnNfMS5BVFRSX0VSUk9SX1RZUEVdID0gZXJyb3IubmFtZTtcbiAgICAgICAgdGhpcy5fY2xvc2VIdHRwU3BhbihzcGFuLCBhcGlfMS5TcGFuS2luZC5TRVJWRVIsIHN0YXJ0VGltZSwgb2xkTWV0cmljQXR0cmlidXRlcywgc3RhYmxlTWV0cmljQXR0cmlidXRlcyk7XG4gICAgfVxuICAgIF9zdGFydEh0dHBTcGFuKG5hbWUsIG9wdGlvbnMsIGN0eCA9IGFwaV8xLmNvbnRleHQuYWN0aXZlKCkpIHtcbiAgICAgICAgLypcbiAgICAgICAgICogSWYgYSBwYXJlbnQgaXMgcmVxdWlyZWQgYnV0IG5vdCBwcmVzZW50LCB3ZSB1c2UgYSBgTm9vcFNwYW5gIHRvIHN0aWxsXG4gICAgICAgICAqIHByb3BhZ2F0ZSBjb250ZXh0IHdpdGhvdXQgcmVjb3JkaW5nIGl0LlxuICAgICAgICAgKi9cbiAgICAgICAgY29uc3QgcmVxdWlyZVBhcmVudCA9IG9wdGlvbnMua2luZCA9PT0gYXBpXzEuU3BhbktpbmQuQ0xJRU5UXG4gICAgICAgICAgICA/IHRoaXMuZ2V0Q29uZmlnKCkucmVxdWlyZVBhcmVudGZvck91dGdvaW5nU3BhbnNcbiAgICAgICAgICAgIDogdGhpcy5nZXRDb25maWcoKS5yZXF1aXJlUGFyZW50Zm9ySW5jb21pbmdTcGFucztcbiAgICAgICAgbGV0IHNwYW47XG4gICAgICAgIGNvbnN0IGN1cnJlbnRTcGFuID0gYXBpXzEudHJhY2UuZ2V0U3BhbihjdHgpO1xuICAgICAgICBpZiAocmVxdWlyZVBhcmVudCA9PT0gdHJ1ZSAmJlxuICAgICAgICAgICAgKCFjdXJyZW50U3BhbiB8fCAhYXBpXzEudHJhY2UuaXNTcGFuQ29udGV4dFZhbGlkKGN1cnJlbnRTcGFuLnNwYW5Db250ZXh0KCkpKSkge1xuICAgICAgICAgICAgc3BhbiA9IGFwaV8xLnRyYWNlLndyYXBTcGFuQ29udGV4dChhcGlfMS5JTlZBTElEX1NQQU5fQ09OVEVYVCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAocmVxdWlyZVBhcmVudCA9PT0gdHJ1ZSAmJiBjdXJyZW50U3Bhbj8uc3BhbkNvbnRleHQoKS5pc1JlbW90ZSkge1xuICAgICAgICAgICAgc3BhbiA9IGN1cnJlbnRTcGFuO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgc3BhbiA9IHRoaXMudHJhY2VyLnN0YXJ0U3BhbihuYW1lLCBvcHRpb25zLCBjdHgpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuX3NwYW5Ob3RFbmRlZC5hZGQoc3Bhbik7XG4gICAgICAgIHJldHVybiBzcGFuO1xuICAgIH1cbiAgICBfY2xvc2VIdHRwU3BhbihzcGFuLCBzcGFuS2luZCwgc3RhcnRUaW1lLCBvbGRNZXRyaWNBdHRyaWJ1dGVzLCBzdGFibGVNZXRyaWNBdHRyaWJ1dGVzKSB7XG4gICAgICAgIGlmICghdGhpcy5fc3Bhbk5vdEVuZGVkLmhhcyhzcGFuKSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHNwYW4uZW5kKCk7XG4gICAgICAgIHRoaXMuX3NwYW5Ob3RFbmRlZC5kZWxldGUoc3Bhbik7XG4gICAgICAgIC8vIFJlY29yZCBtZXRyaWNzXG4gICAgICAgIGNvbnN0IGR1cmF0aW9uID0gKDAsIGNvcmVfMS5oclRpbWVUb01pbGxpc2Vjb25kcykoKDAsIGNvcmVfMS5oclRpbWVEdXJhdGlvbikoc3RhcnRUaW1lLCAoMCwgY29yZV8xLmhyVGltZSkoKSkpO1xuICAgICAgICBpZiAoc3BhbktpbmQgPT09IGFwaV8xLlNwYW5LaW5kLlNFUlZFUikge1xuICAgICAgICAgICAgdGhpcy5fcmVjb3JkU2VydmVyRHVyYXRpb24oZHVyYXRpb24sIG9sZE1ldHJpY0F0dHJpYnV0ZXMsIHN0YWJsZU1ldHJpY0F0dHJpYnV0ZXMpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKHNwYW5LaW5kID09PSBhcGlfMS5TcGFuS2luZC5DTElFTlQpIHtcbiAgICAgICAgICAgIHRoaXMuX3JlY29yZENsaWVudER1cmF0aW9uKGR1cmF0aW9uLCBvbGRNZXRyaWNBdHRyaWJ1dGVzLCBzdGFibGVNZXRyaWNBdHRyaWJ1dGVzKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBfY2FsbFJlc3BvbnNlSG9vayhzcGFuLCByZXNwb25zZSkge1xuICAgICAgICAoMCwgaW5zdHJ1bWVudGF0aW9uXzEuc2FmZUV4ZWN1dGVJblRoZU1pZGRsZSkoKCkgPT4gdGhpcy5nZXRDb25maWcoKS5yZXNwb25zZUhvb2soc3BhbiwgcmVzcG9uc2UpLCAoKSA9PiB7IH0sIHRydWUpO1xuICAgIH1cbiAgICBfY2FsbFJlcXVlc3RIb29rKHNwYW4sIHJlcXVlc3QpIHtcbiAgICAgICAgKDAsIGluc3RydW1lbnRhdGlvbl8xLnNhZmVFeGVjdXRlSW5UaGVNaWRkbGUpKCgpID0+IHRoaXMuZ2V0Q29uZmlnKCkucmVxdWVzdEhvb2soc3BhbiwgcmVxdWVzdCksICgpID0+IHsgfSwgdHJ1ZSk7XG4gICAgfVxuICAgIF9jYWxsU3RhcnRTcGFuSG9vayhyZXF1ZXN0LCBob29rRnVuYykge1xuICAgICAgICBpZiAodHlwZW9mIGhvb2tGdW5jID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICByZXR1cm4gKDAsIGluc3RydW1lbnRhdGlvbl8xLnNhZmVFeGVjdXRlSW5UaGVNaWRkbGUpKCgpID0+IGhvb2tGdW5jKHJlcXVlc3QpLCAoKSA9PiB7IH0sIHRydWUpO1xuICAgICAgICB9XG4gICAgfVxuICAgIF9jcmVhdGVIZWFkZXJDYXB0dXJlKHNlbWNvbnZTdGFiaWxpdHkpIHtcbiAgICAgICAgY29uc3QgY29uZmlnID0gdGhpcy5nZXRDb25maWcoKTtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGNsaWVudDoge1xuICAgICAgICAgICAgICAgIGNhcHR1cmVSZXF1ZXN0SGVhZGVyczogKDAsIHV0aWxzXzEuaGVhZGVyQ2FwdHVyZSkoJ3JlcXVlc3QnLCBjb25maWcuaGVhZGVyc1RvU3BhbkF0dHJpYnV0ZXM/LmNsaWVudD8ucmVxdWVzdEhlYWRlcnMgPz8gW10sIHNlbWNvbnZTdGFiaWxpdHkpLFxuICAgICAgICAgICAgICAgIGNhcHR1cmVSZXNwb25zZUhlYWRlcnM6ICgwLCB1dGlsc18xLmhlYWRlckNhcHR1cmUpKCdyZXNwb25zZScsIGNvbmZpZy5oZWFkZXJzVG9TcGFuQXR0cmlidXRlcz8uY2xpZW50Py5yZXNwb25zZUhlYWRlcnMgPz8gW10sIHNlbWNvbnZTdGFiaWxpdHkpLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHNlcnZlcjoge1xuICAgICAgICAgICAgICAgIGNhcHR1cmVSZXF1ZXN0SGVhZGVyczogKDAsIHV0aWxzXzEuaGVhZGVyQ2FwdHVyZSkoJ3JlcXVlc3QnLCBjb25maWcuaGVhZGVyc1RvU3BhbkF0dHJpYnV0ZXM/LnNlcnZlcj8ucmVxdWVzdEhlYWRlcnMgPz8gW10sIHNlbWNvbnZTdGFiaWxpdHkpLFxuICAgICAgICAgICAgICAgIGNhcHR1cmVSZXNwb25zZUhlYWRlcnM6ICgwLCB1dGlsc18xLmhlYWRlckNhcHR1cmUpKCdyZXNwb25zZScsIGNvbmZpZy5oZWFkZXJzVG9TcGFuQXR0cmlidXRlcz8uc2VydmVyPy5yZXNwb25zZUhlYWRlcnMgPz8gW10sIHNlbWNvbnZTdGFiaWxpdHkpLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgfTtcbiAgICB9XG59XG5leHBvcnRzLkh0dHBJbnN0cnVtZW50YXRpb24gPSBIdHRwSW5zdHJ1bWVudGF0aW9uO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9aHR0cC5qcy5tYXAiXSwibmFtZXMiOltdLCJpZ25vcmVMaXN0IjpbMF0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///(rsc)/./node_modules/.pnpm/@opentelemetry+instrumentation-http@0.214.0_@opentelemetry+api@1.9.1/node_modules/@opentelemetry/instrumentation-http/build/src/http.js\n");
|
|
|
|
/***/ }),
|
|
|
|
/***/ "(rsc)/./node_modules/.pnpm/@opentelemetry+instrumentation-http@0.214.0_@opentelemetry+api@1.9.1/node_modules/@opentelemetry/instrumentation-http/build/src/index.js":
|
|
/*!*********************************************************************************************************************************************************************!*\
|
|
!*** ./node_modules/.pnpm/@opentelemetry+instrumentation-http@0.214.0_@opentelemetry+api@1.9.1/node_modules/@opentelemetry/instrumentation-http/build/src/index.js ***!
|
|
\*********************************************************************************************************************************************************************/
|
|
/***/ ((__unused_webpack_module, exports, __webpack_require__) => {
|
|
|
|
eval("\n/*\n * Copyright The OpenTelemetry Authors\n * SPDX-License-Identifier: Apache-2.0\n */\nObject.defineProperty(exports, \"__esModule\", ({ value: true }));\nexports.HttpInstrumentation = void 0;\nvar http_1 = __webpack_require__(/*! ./http */ \"(rsc)/./node_modules/.pnpm/@opentelemetry+instrumentation-http@0.214.0_@opentelemetry+api@1.9.1/node_modules/@opentelemetry/instrumentation-http/build/src/http.js\");\nObject.defineProperty(exports, \"HttpInstrumentation\", ({ enumerable: true, get: function () { return http_1.HttpInstrumentation; } }));\n//# sourceMappingURL=index.js.map//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKHJzYykvLi9ub2RlX21vZHVsZXMvLnBucG0vQG9wZW50ZWxlbWV0cnkraW5zdHJ1bWVudGF0aW9uLWh0dHBAMC4yMTQuMF9Ab3BlbnRlbGVtZXRyeSthcGlAMS45LjEvbm9kZV9tb2R1bGVzL0BvcGVudGVsZW1ldHJ5L2luc3RydW1lbnRhdGlvbi1odHRwL2J1aWxkL3NyYy9pbmRleC5qcyIsIm1hcHBpbmdzIjoiQUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsOENBQTZDLEVBQUUsYUFBYSxFQUFDO0FBQzdELDJCQUEyQjtBQUMzQixhQUFhLG1CQUFPLENBQUMsa0xBQVE7QUFDN0IsdURBQXNELEVBQUUscUNBQXFDLHNDQUFzQyxFQUFDO0FBQ3BJIiwic291cmNlcyI6WyIvVXNlcnMvbWFyY21pbnRlbC9Qcm9qZWN0cy9lLXRpYi5jb20vbm9kZV9tb2R1bGVzLy5wbnBtL0BvcGVudGVsZW1ldHJ5K2luc3RydW1lbnRhdGlvbi1odHRwQDAuMjE0LjBfQG9wZW50ZWxlbWV0cnkrYXBpQDEuOS4xL25vZGVfbW9kdWxlcy9Ab3BlbnRlbGVtZXRyeS9pbnN0cnVtZW50YXRpb24taHR0cC9idWlsZC9zcmMvaW5kZXguanMiXSwic291cmNlc0NvbnRlbnQiOlsiXCJ1c2Ugc3RyaWN0XCI7XG4vKlxuICogQ29weXJpZ2h0IFRoZSBPcGVuVGVsZW1ldHJ5IEF1dGhvcnNcbiAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wXG4gKi9cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMuSHR0cEluc3RydW1lbnRhdGlvbiA9IHZvaWQgMDtcbnZhciBodHRwXzEgPSByZXF1aXJlKFwiLi9odHRwXCIpO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiSHR0cEluc3RydW1lbnRhdGlvblwiLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gaHR0cF8xLkh0dHBJbnN0cnVtZW50YXRpb247IH0gfSk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1pbmRleC5qcy5tYXAiXSwibmFtZXMiOltdLCJpZ25vcmVMaXN0IjpbMF0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///(rsc)/./node_modules/.pnpm/@opentelemetry+instrumentation-http@0.214.0_@opentelemetry+api@1.9.1/node_modules/@opentelemetry/instrumentation-http/build/src/index.js\n");
|
|
|
|
/***/ }),
|
|
|
|
/***/ "(rsc)/./node_modules/.pnpm/@opentelemetry+instrumentation-http@0.214.0_@opentelemetry+api@1.9.1/node_modules/@opentelemetry/instrumentation-http/build/src/internal-types.js":
|
|
/*!******************************************************************************************************************************************************************************!*\
|
|
!*** ./node_modules/.pnpm/@opentelemetry+instrumentation-http@0.214.0_@opentelemetry+api@1.9.1/node_modules/@opentelemetry/instrumentation-http/build/src/internal-types.js ***!
|
|
\******************************************************************************************************************************************************************************/
|
|
/***/ ((__unused_webpack_module, exports) => {
|
|
|
|
eval("\n/*\n * Copyright The OpenTelemetry Authors\n * SPDX-License-Identifier: Apache-2.0\n */\nObject.defineProperty(exports, \"__esModule\", ({ value: true }));\nexports.DEFAULT_QUERY_STRINGS_TO_REDACT = exports.STR_REDACTED = exports.SYNTHETIC_BOT_NAMES = exports.SYNTHETIC_TEST_NAMES = void 0;\n/**\n * Names of possible synthetic test sources.\n */\nexports.SYNTHETIC_TEST_NAMES = ['alwayson'];\n/**\n * Names of possible synthetic bot sources.\n */\nexports.SYNTHETIC_BOT_NAMES = ['googlebot', 'bingbot'];\n/**\n * REDACTED string used to replace sensitive information in URLs.\n */\nexports.STR_REDACTED = 'REDACTED';\n/**\n * List of URL query keys that are considered sensitive and whose value should be redacted.\n */\nexports.DEFAULT_QUERY_STRINGS_TO_REDACT = [\n 'sig',\n 'Signature',\n 'AWSAccessKeyId',\n 'X-Goog-Signature',\n];\n//# sourceMappingURL=internal-types.js.map//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKHJzYykvLi9ub2RlX21vZHVsZXMvLnBucG0vQG9wZW50ZWxlbWV0cnkraW5zdHJ1bWVudGF0aW9uLWh0dHBAMC4yMTQuMF9Ab3BlbnRlbGVtZXRyeSthcGlAMS45LjEvbm9kZV9tb2R1bGVzL0BvcGVudGVsZW1ldHJ5L2luc3RydW1lbnRhdGlvbi1odHRwL2J1aWxkL3NyYy9pbnRlcm5hbC10eXBlcy5qcyIsIm1hcHBpbmdzIjoiQUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsOENBQTZDLEVBQUUsYUFBYSxFQUFDO0FBQzdELHVDQUF1QyxHQUFHLG9CQUFvQixHQUFHLDJCQUEyQixHQUFHLDRCQUE0QjtBQUMzSDtBQUNBO0FBQ0E7QUFDQSw0QkFBNEI7QUFDNUI7QUFDQTtBQUNBO0FBQ0EsMkJBQTJCO0FBQzNCO0FBQ0E7QUFDQTtBQUNBLG9CQUFvQjtBQUNwQjtBQUNBO0FBQ0E7QUFDQSx1Q0FBdUM7QUFDdkM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwic291cmNlcyI6WyIvVXNlcnMvbWFyY21pbnRlbC9Qcm9qZWN0cy9lLXRpYi5jb20vbm9kZV9tb2R1bGVzLy5wbnBtL0BvcGVudGVsZW1ldHJ5K2luc3RydW1lbnRhdGlvbi1odHRwQDAuMjE0LjBfQG9wZW50ZWxlbWV0cnkrYXBpQDEuOS4xL25vZGVfbW9kdWxlcy9Ab3BlbnRlbGVtZXRyeS9pbnN0cnVtZW50YXRpb24taHR0cC9idWlsZC9zcmMvaW50ZXJuYWwtdHlwZXMuanMiXSwic291cmNlc0NvbnRlbnQiOlsiXCJ1c2Ugc3RyaWN0XCI7XG4vKlxuICogQ29weXJpZ2h0IFRoZSBPcGVuVGVsZW1ldHJ5IEF1dGhvcnNcbiAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wXG4gKi9cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMuREVGQVVMVF9RVUVSWV9TVFJJTkdTX1RPX1JFREFDVCA9IGV4cG9ydHMuU1RSX1JFREFDVEVEID0gZXhwb3J0cy5TWU5USEVUSUNfQk9UX05BTUVTID0gZXhwb3J0cy5TWU5USEVUSUNfVEVTVF9OQU1FUyA9IHZvaWQgMDtcbi8qKlxuICogTmFtZXMgb2YgcG9zc2libGUgc3ludGhldGljIHRlc3Qgc291cmNlcy5cbiAqL1xuZXhwb3J0cy5TWU5USEVUSUNfVEVTVF9OQU1FUyA9IFsnYWx3YXlzb24nXTtcbi8qKlxuICogTmFtZXMgb2YgcG9zc2libGUgc3ludGhldGljIGJvdCBzb3VyY2VzLlxuICovXG5leHBvcnRzLlNZTlRIRVRJQ19CT1RfTkFNRVMgPSBbJ2dvb2dsZWJvdCcsICdiaW5nYm90J107XG4vKipcbiAqIFJFREFDVEVEIHN0cmluZyB1c2VkIHRvIHJlcGxhY2Ugc2Vuc2l0aXZlIGluZm9ybWF0aW9uIGluIFVSTHMuXG4gKi9cbmV4cG9ydHMuU1RSX1JFREFDVEVEID0gJ1JFREFDVEVEJztcbi8qKlxuICogTGlzdCBvZiBVUkwgcXVlcnkga2V5cyB0aGF0IGFyZSBjb25zaWRlcmVkIHNlbnNpdGl2ZSBhbmQgd2hvc2UgdmFsdWUgc2hvdWxkIGJlIHJlZGFjdGVkLlxuICovXG5leHBvcnRzLkRFRkFVTFRfUVVFUllfU1RSSU5HU19UT19SRURBQ1QgPSBbXG4gICAgJ3NpZycsXG4gICAgJ1NpZ25hdHVyZScsXG4gICAgJ0FXU0FjY2Vzc0tleUlkJyxcbiAgICAnWC1Hb29nLVNpZ25hdHVyZScsXG5dO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9aW50ZXJuYWwtdHlwZXMuanMubWFwIl0sIm5hbWVzIjpbXSwiaWdub3JlTGlzdCI6WzBdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///(rsc)/./node_modules/.pnpm/@opentelemetry+instrumentation-http@0.214.0_@opentelemetry+api@1.9.1/node_modules/@opentelemetry/instrumentation-http/build/src/internal-types.js\n");
|
|
|
|
/***/ }),
|
|
|
|
/***/ "(rsc)/./node_modules/.pnpm/@opentelemetry+instrumentation-http@0.214.0_@opentelemetry+api@1.9.1/node_modules/@opentelemetry/instrumentation-http/build/src/semconv.js":
|
|
/*!***********************************************************************************************************************************************************************!*\
|
|
!*** ./node_modules/.pnpm/@opentelemetry+instrumentation-http@0.214.0_@opentelemetry+api@1.9.1/node_modules/@opentelemetry/instrumentation-http/build/src/semconv.js ***!
|
|
\***********************************************************************************************************************************************************************/
|
|
/***/ ((__unused_webpack_module, exports) => {
|
|
|
|
eval("\n/*\n * Copyright The OpenTelemetry Authors\n * SPDX-License-Identifier: Apache-2.0\n */\nObject.defineProperty(exports, \"__esModule\", ({ value: true }));\nexports.HTTP_FLAVOR_VALUE_HTTP_1_1 = exports.NET_TRANSPORT_VALUE_IP_UDP = exports.NET_TRANSPORT_VALUE_IP_TCP = exports.ATTR_NET_TRANSPORT = exports.ATTR_NET_PEER_PORT = exports.ATTR_NET_PEER_NAME = exports.ATTR_NET_PEER_IP = exports.ATTR_NET_HOST_PORT = exports.ATTR_NET_HOST_NAME = exports.ATTR_NET_HOST_IP = exports.ATTR_HTTP_USER_AGENT = exports.ATTR_HTTP_URL = exports.ATTR_HTTP_TARGET = exports.ATTR_HTTP_STATUS_CODE = exports.ATTR_HTTP_SERVER_NAME = exports.ATTR_HTTP_SCHEME = exports.ATTR_HTTP_RESPONSE_CONTENT_LENGTH_UNCOMPRESSED = exports.ATTR_HTTP_RESPONSE_CONTENT_LENGTH = exports.ATTR_HTTP_REQUEST_CONTENT_LENGTH_UNCOMPRESSED = exports.ATTR_HTTP_REQUEST_CONTENT_LENGTH = exports.ATTR_HTTP_METHOD = exports.ATTR_HTTP_HOST = exports.ATTR_HTTP_FLAVOR = exports.ATTR_HTTP_CLIENT_IP = exports.USER_AGENT_SYNTHETIC_TYPE_VALUE_TEST = exports.USER_AGENT_SYNTHETIC_TYPE_VALUE_BOT = exports.ATTR_USER_AGENT_SYNTHETIC_TYPE = void 0;\n/*\n * This file contains a copy of unstable semantic convention definitions\n * used by this package.\n * @see https://github.com/open-telemetry/opentelemetry-js/tree/main/semantic-conventions#unstable-semconv\n */\n/**\n * Specifies the category of synthetic traffic, such as tests or bots.\n *\n * @note This attribute **MAY** be derived from the contents of the `user_agent.original` attribute. Components that populate the attribute are responsible for determining what they consider to be synthetic bot or test traffic. This attribute can either be set for self-identification purposes, or on telemetry detected to be generated as a result of a synthetic request. This attribute is useful for distinguishing between genuine client traffic and synthetic traffic generated by bots or tests.\n *\n * @experimental This attribute is experimental and is subject to breaking changes in minor releases of `@opentelemetry/semantic-conventions`.\n */\nexports.ATTR_USER_AGENT_SYNTHETIC_TYPE = 'user_agent.synthetic.type';\n/**\n * Enum value \"bot\" for attribute {@link ATTR_USER_AGENT_SYNTHETIC_TYPE}.\n */\nexports.USER_AGENT_SYNTHETIC_TYPE_VALUE_BOT = 'bot';\n/**\n * Enum value \"test\" for attribute {@link ATTR_USER_AGENT_SYNTHETIC_TYPE}.\n */\nexports.USER_AGENT_SYNTHETIC_TYPE_VALUE_TEST = 'test';\n/**\n * Deprecated, use `client.address` instead.\n *\n * @example \"83.164.160.102\"\n *\n * @experimental This attribute is experimental and is subject to breaking changes in minor releases of `@opentelemetry/semantic-conventions`.\n *\n * @deprecated Replaced by `client.address`.\n */\nexports.ATTR_HTTP_CLIENT_IP = 'http.client_ip';\n/**\n * Deprecated, use `network.protocol.name` instead.\n *\n * @experimental This attribute is experimental and is subject to breaking changes in minor releases of `@opentelemetry/semantic-conventions`.\n *\n * @deprecated Replaced by `network.protocol.name`.\n */\nexports.ATTR_HTTP_FLAVOR = 'http.flavor';\n/**\n * Deprecated, use one of `server.address`, `client.address` or `http.request.header.host` instead, depending on the usage.\n *\n * @example www.example.org\n *\n * @experimental This attribute is experimental and is subject to breaking changes in minor releases of `@opentelemetry/semantic-conventions`.\n *\n * @deprecated Replaced by one of `server.address`, `client.address` or `http.request.header.host`, depending on the usage.\n */\nexports.ATTR_HTTP_HOST = 'http.host';\n/**\n * Deprecated, use `http.request.method` instead.\n *\n * @example GET\n * @example POST\n * @example HEAD\n *\n * @experimental This attribute is experimental and is subject to breaking changes in minor releases of `@opentelemetry/semantic-conventions`.\n *\n * @deprecated Replaced by `http.request.method`.\n */\nexports.ATTR_HTTP_METHOD = 'http.method';\n/**\n * Deprecated, use `http.request.header.<key>` instead.\n *\n * @example 3495\n *\n * @experimental This attribute is experimental and is subject to breaking changes in minor releases of `@opentelemetry/semantic-conventions`.\n *\n * @deprecated Replaced by `http.request.header.<key>`.\n */\nexports.ATTR_HTTP_REQUEST_CONTENT_LENGTH = 'http.request_content_length';\n/**\n * Deprecated, use `http.request.body.size` instead.\n *\n * @example 5493\n *\n * @experimental This attribute is experimental and is subject to breaking changes in minor releases of `@opentelemetry/semantic-conventions`.\n *\n * @deprecated Replaced by `http.request.body.size`.\n */\nexports.ATTR_HTTP_REQUEST_CONTENT_LENGTH_UNCOMPRESSED = 'http.request_content_length_uncompressed';\n/**\n * Deprecated, use `http.response.header.<key>` instead.\n *\n * @example 3495\n *\n * @experimental This attribute is experimental and is subject to breaking changes in minor releases of `@opentelemetry/semantic-conventions`.\n *\n * @deprecated Replaced by `http.response.header.<key>`.\n */\nexports.ATTR_HTTP_RESPONSE_CONTENT_LENGTH = 'http.response_content_length';\n/**\n * Deprecated, use `http.response.body.size` instead.\n *\n * @example 5493\n *\n * @experimental This attribute is experimental and is subject to breaking changes in minor releases of `@opentelemetry/semantic-conventions`.\n *\n * @deprecated Replace by `http.response.body.size`.\n */\nexports.ATTR_HTTP_RESPONSE_CONTENT_LENGTH_UNCOMPRESSED = 'http.response_content_length_uncompressed';\n/**\n * Deprecated, use `url.scheme` instead.\n *\n * @example http\n * @example https\n *\n * @experimental This attribute is experimental and is subject to breaking changes in minor releases of `@opentelemetry/semantic-conventions`.\n *\n * @deprecated Replaced by `url.scheme` instead.\n */\nexports.ATTR_HTTP_SCHEME = 'http.scheme';\n/**\n * Deprecated, use `server.address` instead.\n *\n * @example example.com\n *\n * @experimental This attribute is experimental and is subject to breaking changes in minor releases of `@opentelemetry/semantic-conventions`.\n *\n * @deprecated Replaced by `server.address`.\n */\nexports.ATTR_HTTP_SERVER_NAME = 'http.server_name';\n/**\n * Deprecated, use `http.response.status_code` instead.\n *\n * @example 200\n *\n * @experimental This attribute is experimental and is subject to breaking changes in minor releases of `@opentelemetry/semantic-conventions`.\n *\n * @deprecated Replaced by `http.response.status_code`.\n */\nexports.ATTR_HTTP_STATUS_CODE = 'http.status_code';\n/**\n * Deprecated, use `url.path` and `url.query` instead.\n *\n * @example /search?q=OpenTelemetry#SemConv\n *\n * @experimental This attribute is experimental and is subject to breaking changes in minor releases of `@opentelemetry/semantic-conventions`.\n *\n * @deprecated Split to `url.path` and `url.query.\n */\nexports.ATTR_HTTP_TARGET = 'http.target';\n/**\n * Deprecated, use `url.full` instead.\n *\n * @example https://www.foo.bar/search?q=OpenTelemetry#SemConv\n *\n * @experimental This attribute is experimental and is subject to breaking changes in minor releases of `@opentelemetry/semantic-conventions`.\n *\n * @deprecated Replaced by `url.full`.\n */\nexports.ATTR_HTTP_URL = 'http.url';\n/**\n * Deprecated, use `user_agent.original` instead.\n *\n * @example CERN-LineMode/2.15 libwww/2.17b3\n * @example Mozilla/5.0 (iPhone; CPU iPhone OS 14_7_1 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/14.1.2 Mobile/15E148 Safari/604.1\n *\n * @experimental This attribute is experimental and is subject to breaking changes in minor releases of `@opentelemetry/semantic-conventions`.\n *\n * @deprecated Replaced by `user_agent.original`.\n */\nexports.ATTR_HTTP_USER_AGENT = 'http.user_agent';\n/**\n * Deprecated, use `network.local.address`.\n *\n * @example \"192.168.0.1\"\n *\n * @experimental This attribute is experimental and is subject to breaking changes in minor releases of `@opentelemetry/semantic-conventions`.\n *\n * @deprecated Replaced by `network.local.address`.\n */\nexports.ATTR_NET_HOST_IP = 'net.host.ip';\n/**\n * Deprecated, use `server.address`.\n *\n * @example example.com\n *\n * @experimental This attribute is experimental and is subject to breaking changes in minor releases of `@opentelemetry/semantic-conventions`.\n *\n * @deprecated Replaced by `server.address`.\n */\nexports.ATTR_NET_HOST_NAME = 'net.host.name';\n/**\n * Deprecated, use `server.port`.\n *\n * @example 8080\n *\n * @experimental This attribute is experimental and is subject to breaking changes in minor releases of `@opentelemetry/semantic-conventions`.\n *\n * @deprecated Replaced by `server.port`.\n */\nexports.ATTR_NET_HOST_PORT = 'net.host.port';\n/**\n * Deprecated, use `network.peer.address`.\n *\n * @example \"127.0.0.1\"\n *\n * @experimental This attribute is experimental and is subject to breaking changes in minor releases of `@opentelemetry/semantic-conventions`.\n *\n * @deprecated Replaced by `network.peer.address`.\n */\nexports.ATTR_NET_PEER_IP = 'net.peer.ip';\n/**\n * Deprecated, use `server.address` on client spans and `client.address` on server spans.\n *\n * @example example.com\n *\n * @experimental This attribute is experimental and is subject to breaking changes in minor releases of `@opentelemetry/semantic-conventions`.\n *\n * @deprecated Replaced by `server.address` on client spans and `client.address` on server spans.\n */\nexports.ATTR_NET_PEER_NAME = 'net.peer.name';\n/**\n * Deprecated, use `server.port` on client spans and `client.port` on server spans.\n *\n * @example 8080\n *\n * @experimental This attribute is experimental and is subject to breaking changes in minor releases of `@opentelemetry/semantic-conventions`.\n *\n * @deprecated Replaced by `server.port` on client spans and `client.port` on server spans.\n */\nexports.ATTR_NET_PEER_PORT = 'net.peer.port';\n/**\n * Deprecated, use `network.transport`.\n *\n * @experimental This attribute is experimental and is subject to breaking changes in minor releases of `@opentelemetry/semantic-conventions`.\n *\n * @deprecated Replaced by `network.transport`.\n */\nexports.ATTR_NET_TRANSPORT = 'net.transport';\n/**\n * Enum value \"ip_tcp\" for attribute {@link ATTR_NET_TRANSPORT}.\n */\nexports.NET_TRANSPORT_VALUE_IP_TCP = 'ip_tcp';\n/**\n * Enum value \"ip_udp\" for attribute {@link ATTR_NET_TRANSPORT}.\n */\nexports.NET_TRANSPORT_VALUE_IP_UDP = 'ip_udp';\n/**\n * Enum value \"1.1\" for attribute {@link ATTR_HTTP_FLAVOR}.\n */\nexports.HTTP_FLAVOR_VALUE_HTTP_1_1 = '1.1';\n//# sourceMappingURL=semconv.js.map//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKHJzYykvLi9ub2RlX21vZHVsZXMvLnBucG0vQG9wZW50ZWxlbWV0cnkraW5zdHJ1bWVudGF0aW9uLWh0dHBAMC4yMTQuMF9Ab3BlbnRlbGVtZXRyeSthcGlAMS45LjEvbm9kZV9tb2R1bGVzL0BvcGVudGVsZW1ldHJ5L2luc3RydW1lbnRhdGlvbi1odHRwL2J1aWxkL3NyYy9zZW1jb252LmpzIiwibWFwcGluZ3MiOiJBQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQSw4Q0FBNkMsRUFBRSxhQUFhLEVBQUM7QUFDN0Qsa0NBQWtDLEdBQUcsa0NBQWtDLEdBQUcsa0NBQWtDLEdBQUcsMEJBQTBCLEdBQUcsMEJBQTBCLEdBQUcsMEJBQTBCLEdBQUcsd0JBQXdCLEdBQUcsMEJBQTBCLEdBQUcsMEJBQTBCLEdBQUcsd0JBQXdCLEdBQUcsNEJBQTRCLEdBQUcscUJBQXFCLEdBQUcsd0JBQXdCLEdBQUcsNkJBQTZCLEdBQUcsNkJBQTZCLEdBQUcsd0JBQXdCLEdBQUcsc0RBQXNELEdBQUcseUNBQXlDLEdBQUcscURBQXFELEdBQUcsd0NBQXdDLEdBQUcsd0JBQXdCLEdBQUcsc0JBQXNCLEdBQUcsd0JBQXdCLEdBQUcsMkJBQTJCLEdBQUcsNENBQTRDLEdBQUcsMkNBQTJDLEdBQUcsc0NBQXNDO0FBQzM1QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxzQ0FBc0M7QUFDdEM7QUFDQSxtQ0FBbUMscUNBQXFDO0FBQ3hFO0FBQ0EsMkNBQTJDO0FBQzNDO0FBQ0Esb0NBQW9DLHFDQUFxQztBQUN6RTtBQUNBLDRDQUE0QztBQUM1QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSwyQkFBMkI7QUFDM0I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx3QkFBd0I7QUFDeEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esc0JBQXNCO0FBQ3RCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx3QkFBd0I7QUFDeEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esd0NBQXdDO0FBQ3hDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHFEQUFxRDtBQUNyRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx5Q0FBeUM7QUFDekM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esc0RBQXNEO0FBQ3REO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esd0JBQXdCO0FBQ3hCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDZCQUE2QjtBQUM3QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw2QkFBNkI7QUFDN0I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esd0JBQXdCO0FBQ3hCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHFCQUFxQjtBQUNyQjtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlDQUFpQztBQUNqQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsNEJBQTRCO0FBQzVCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHdCQUF3QjtBQUN4QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSwwQkFBMEI7QUFDMUI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsMEJBQTBCO0FBQzFCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHdCQUF3QjtBQUN4QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSwwQkFBMEI7QUFDMUI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsMEJBQTBCO0FBQzFCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsMEJBQTBCO0FBQzFCO0FBQ0Esc0NBQXNDLHlCQUF5QjtBQUMvRDtBQUNBLGtDQUFrQztBQUNsQztBQUNBLHNDQUFzQyx5QkFBeUI7QUFDL0Q7QUFDQSxrQ0FBa0M7QUFDbEM7QUFDQSxtQ0FBbUMsdUJBQXVCO0FBQzFEO0FBQ0Esa0NBQWtDO0FBQ2xDIiwic291cmNlcyI6WyIvVXNlcnMvbWFyY21pbnRlbC9Qcm9qZWN0cy9lLXRpYi5jb20vbm9kZV9tb2R1bGVzLy5wbnBtL0BvcGVudGVsZW1ldHJ5K2luc3RydW1lbnRhdGlvbi1odHRwQDAuMjE0LjBfQG9wZW50ZWxlbWV0cnkrYXBpQDEuOS4xL25vZGVfbW9kdWxlcy9Ab3BlbnRlbGVtZXRyeS9pbnN0cnVtZW50YXRpb24taHR0cC9idWlsZC9zcmMvc2VtY29udi5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyJcInVzZSBzdHJpY3RcIjtcbi8qXG4gKiBDb3B5cmlnaHQgVGhlIE9wZW5UZWxlbWV0cnkgQXV0aG9yc1xuICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjBcbiAqL1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5IVFRQX0ZMQVZPUl9WQUxVRV9IVFRQXzFfMSA9IGV4cG9ydHMuTkVUX1RSQU5TUE9SVF9WQUxVRV9JUF9VRFAgPSBleHBvcnRzLk5FVF9UUkFOU1BPUlRfVkFMVUVfSVBfVENQID0gZXhwb3J0cy5BVFRSX05FVF9UUkFOU1BPUlQgPSBleHBvcnRzLkFUVFJfTkVUX1BFRVJfUE9SVCA9IGV4cG9ydHMuQVRUUl9ORVRfUEVFUl9OQU1FID0gZXhwb3J0cy5BVFRSX05FVF9QRUVSX0lQID0gZXhwb3J0cy5BVFRSX05FVF9IT1NUX1BPUlQgPSBleHBvcnRzLkFUVFJfTkVUX0hPU1RfTkFNRSA9IGV4cG9ydHMuQVRUUl9ORVRfSE9TVF9JUCA9IGV4cG9ydHMuQVRUUl9IVFRQX1VTRVJfQUdFTlQgPSBleHBvcnRzLkFUVFJfSFRUUF9VUkwgPSBleHBvcnRzLkFUVFJfSFRUUF9UQVJHRVQgPSBleHBvcnRzLkFUVFJfSFRUUF9TVEFUVVNfQ09ERSA9IGV4cG9ydHMuQVRUUl9IVFRQX1NFUlZFUl9OQU1FID0gZXhwb3J0cy5BVFRSX0hUVFBfU0NIRU1FID0gZXhwb3J0cy5BVFRSX0hUVFBfUkVTUE9OU0VfQ09OVEVOVF9MRU5HVEhfVU5DT01QUkVTU0VEID0gZXhwb3J0cy5BVFRSX0hUVFBfUkVTUE9OU0VfQ09OVEVOVF9MRU5HVEggPSBleHBvcnRzLkFUVFJfSFRUUF9SRVFVRVNUX0NPTlRFTlRfTEVOR1RIX1VOQ09NUFJFU1NFRCA9IGV4cG9ydHMuQVRUUl9IVFRQX1JFUVVFU1RfQ09OVEVOVF9MRU5HVEggPSBleHBvcnRzLkFUVFJfSFRUUF9NRVRIT0QgPSBleHBvcnRzLkFUVFJfSFRUUF9IT1NUID0gZXhwb3J0cy5BVFRSX0hUVFBfRkxBVk9SID0gZXhwb3J0cy5BVFRSX0hUVFBfQ0xJRU5UX0lQID0gZXhwb3J0cy5VU0VSX0FHRU5UX1NZTlRIRVRJQ19UWVBFX1ZBTFVFX1RFU1QgPSBleHBvcnRzLlVTRVJfQUdFTlRfU1lOVEhFVElDX1RZUEVfVkFMVUVfQk9UID0gZXhwb3J0cy5BVFRSX1VTRVJfQUdFTlRfU1lOVEhFVElDX1RZUEUgPSB2b2lkIDA7XG4vKlxuICogVGhpcyBmaWxlIGNvbnRhaW5zIGEgY29weSBvZiB1bnN0YWJsZSBzZW1hbnRpYyBjb252ZW50aW9uIGRlZmluaXRpb25zXG4gKiB1c2VkIGJ5IHRoaXMgcGFja2FnZS5cbiAqIEBzZWUgaHR0cHM6Ly9naXRodWIuY29tL29wZW4tdGVsZW1ldHJ5L29wZW50ZWxlbWV0cnktanMvdHJlZS9tYWluL3NlbWFudGljLWNvbnZlbnRpb25zI3Vuc3RhYmxlLXNlbWNvbnZcbiAqL1xuLyoqXG4gKiBTcGVjaWZpZXMgdGhlIGNhdGVnb3J5IG9mIHN5bnRoZXRpYyB0cmFmZmljLCBzdWNoIGFzIHRlc3RzIG9yIGJvdHMuXG4gKlxuICogQG5vdGUgVGhpcyBhdHRyaWJ1dGUgKipNQVkqKiBiZSBkZXJpdmVkIGZyb20gdGhlIGNvbnRlbnRzIG9mIHRoZSBgdXNlcl9hZ2VudC5vcmlnaW5hbGAgYXR0cmlidXRlLiBDb21wb25lbnRzIHRoYXQgcG9wdWxhdGUgdGhlIGF0dHJpYnV0ZSBhcmUgcmVzcG9uc2libGUgZm9yIGRldGVybWluaW5nIHdoYXQgdGhleSBjb25zaWRlciB0byBiZSBzeW50aGV0aWMgYm90IG9yIHRlc3QgdHJhZmZpYy4gVGhpcyBhdHRyaWJ1dGUgY2FuIGVpdGhlciBiZSBzZXQgZm9yIHNlbGYtaWRlbnRpZmljYXRpb24gcHVycG9zZXMsIG9yIG9uIHRlbGVtZXRyeSBkZXRlY3RlZCB0byBiZSBnZW5lcmF0ZWQgYXMgYSByZXN1bHQgb2YgYSBzeW50aGV0aWMgcmVxdWVzdC4gVGhpcyBhdHRyaWJ1dGUgaXMgdXNlZnVsIGZvciBkaXN0aW5ndWlzaGluZyBiZXR3ZWVuIGdlbnVpbmUgY2xpZW50IHRyYWZmaWMgYW5kIHN5bnRoZXRpYyB0cmFmZmljIGdlbmVyYXRlZCBieSBib3RzIG9yIHRlc3RzLlxuICpcbiAqIEBleHBlcmltZW50YWwgVGhpcyBhdHRyaWJ1dGUgaXMgZXhwZXJpbWVudGFsIGFuZCBpcyBzdWJqZWN0IHRvIGJyZWFraW5nIGNoYW5nZXMgaW4gbWlub3IgcmVsZWFzZXMgb2YgYEBvcGVudGVsZW1ldHJ5L3NlbWFudGljLWNvbnZlbnRpb25zYC5cbiAqL1xuZXhwb3J0cy5BVFRSX1VTRVJfQUdFTlRfU1lOVEhFVElDX1RZUEUgPSAndXNlcl9hZ2VudC5zeW50aGV0aWMudHlwZSc7XG4vKipcbiAqIEVudW0gdmFsdWUgXCJib3RcIiBmb3IgYXR0cmlidXRlIHtAbGluayBBVFRSX1VTRVJfQUdFTlRfU1lOVEhFVElDX1RZUEV9LlxuICovXG5leHBvcnRzLlVTRVJfQUdFTlRfU1lOVEhFVElDX1RZUEVfVkFMVUVfQk9UID0gJ2JvdCc7XG4vKipcbiAqIEVudW0gdmFsdWUgXCJ0ZXN0XCIgZm9yIGF0dHJpYnV0ZSB7QGxpbmsgQVRUUl9VU0VSX0FHRU5UX1NZTlRIRVRJQ19UWVBFfS5cbiAqL1xuZXhwb3J0cy5VU0VSX0FHRU5UX1NZTlRIRVRJQ19UWVBFX1ZBTFVFX1RFU1QgPSAndGVzdCc7XG4vKipcbiAqIERlcHJlY2F0ZWQsIHVzZSBgY2xpZW50LmFkZHJlc3NgIGluc3RlYWQuXG4gKlxuICogQGV4YW1wbGUgXCI4My4xNjQuMTYwLjEwMlwiXG4gKlxuICogQGV4cGVyaW1lbnRhbCBUaGlzIGF0dHJpYnV0ZSBpcyBleHBlcmltZW50YWwgYW5kIGlzIHN1YmplY3QgdG8gYnJlYWtpbmcgY2hhbmdlcyBpbiBtaW5vciByZWxlYXNlcyBvZiBgQG9wZW50ZWxlbWV0cnkvc2VtYW50aWMtY29udmVudGlvbnNgLlxuICpcbiAqIEBkZXByZWNhdGVkIFJlcGxhY2VkIGJ5IGBjbGllbnQuYWRkcmVzc2AuXG4gKi9cbmV4cG9ydHMuQVRUUl9IVFRQX0NMSUVOVF9JUCA9ICdodHRwLmNsaWVudF9pcCc7XG4vKipcbiAqIERlcHJlY2F0ZWQsIHVzZSBgbmV0d29yay5wcm90b2NvbC5uYW1lYCBpbnN0ZWFkLlxuICpcbiAqIEBleHBlcmltZW50YWwgVGhpcyBhdHRyaWJ1dGUgaXMgZXhwZXJpbWVudGFsIGFuZCBpcyBzdWJqZWN0IHRvIGJyZWFraW5nIGNoYW5nZXMgaW4gbWlub3IgcmVsZWFzZXMgb2YgYEBvcGVudGVsZW1ldHJ5L3NlbWFudGljLWNvbnZlbnRpb25zYC5cbiAqXG4gKiBAZGVwcmVjYXRlZCBSZXBsYWNlZCBieSBgbmV0d29yay5wcm90b2NvbC5uYW1lYC5cbiAqL1xuZXhwb3J0cy5BVFRSX0hUVFBfRkxBVk9SID0gJ2h0dHAuZmxhdm9yJztcbi8qKlxuICogRGVwcmVjYXRlZCwgdXNlIG9uZSBvZiBgc2VydmVyLmFkZHJlc3NgLCBgY2xpZW50LmFkZHJlc3NgIG9yIGBodHRwLnJlcXVlc3QuaGVhZGVyLmhvc3RgIGluc3RlYWQsIGRlcGVuZGluZyBvbiB0aGUgdXNhZ2UuXG4gKlxuICogQGV4YW1wbGUgd3d3LmV4YW1wbGUub3JnXG4gKlxuICogQGV4cGVyaW1lbnRhbCBUaGlzIGF0dHJpYnV0ZSBpcyBleHBlcmltZW50YWwgYW5kIGlzIHN1YmplY3QgdG8gYnJlYWtpbmcgY2hhbmdlcyBpbiBtaW5vciByZWxlYXNlcyBvZiBgQG9wZW50ZWxlbWV0cnkvc2VtYW50aWMtY29udmVudGlvbnNgLlxuICpcbiAqIEBkZXByZWNhdGVkIFJlcGxhY2VkIGJ5IG9uZSBvZiBgc2VydmVyLmFkZHJlc3NgLCBgY2xpZW50LmFkZHJlc3NgIG9yIGBodHRwLnJlcXVlc3QuaGVhZGVyLmhvc3RgLCBkZXBlbmRpbmcgb24gdGhlIHVzYWdlLlxuICovXG5leHBvcnRzLkFUVFJfSFRUUF9IT1NUID0gJ2h0dHAuaG9zdCc7XG4vKipcbiAqIERlcHJlY2F0ZWQsIHVzZSBgaHR0cC5yZXF1ZXN0Lm1ldGhvZGAgaW5zdGVhZC5cbiAqXG4gKiBAZXhhbXBsZSBHRVRcbiAqIEBleGFtcGxlIFBPU1RcbiAqIEBleGFtcGxlIEhFQURcbiAqXG4gKiBAZXhwZXJpbWVudGFsIFRoaXMgYXR0cmlidXRlIGlzIGV4cGVyaW1lbnRhbCBhbmQgaXMgc3ViamVjdCB0byBicmVha2luZyBjaGFuZ2VzIGluIG1pbm9yIHJlbGVhc2VzIG9mIGBAb3BlbnRlbGVtZXRyeS9zZW1hbnRpYy1jb252ZW50aW9uc2AuXG4gKlxuICogQGRlcHJlY2F0ZWQgUmVwbGFjZWQgYnkgYGh0dHAucmVxdWVzdC5tZXRob2RgLlxuICovXG5leHBvcnRzLkFUVFJfSFRUUF9NRVRIT0QgPSAnaHR0cC5tZXRob2QnO1xuLyoqXG4gKiBEZXByZWNhdGVkLCB1c2UgYGh0dHAucmVxdWVzdC5oZWFkZXIuPGtleT5gIGluc3RlYWQuXG4gKlxuICogQGV4YW1wbGUgMzQ5NVxuICpcbiAqIEBleHBlcmltZW50YWwgVGhpcyBhdHRyaWJ1dGUgaXMgZXhwZXJpbWVudGFsIGFuZCBpcyBzdWJqZWN0IHRvIGJyZWFraW5nIGNoYW5nZXMgaW4gbWlub3IgcmVsZWFzZXMgb2YgYEBvcGVudGVsZW1ldHJ5L3NlbWFudGljLWNvbnZlbnRpb25zYC5cbiAqXG4gKiBAZGVwcmVjYXRlZCBSZXBsYWNlZCBieSBgaHR0cC5yZXF1ZXN0LmhlYWRlci48a2V5PmAuXG4gKi9cbmV4cG9ydHMuQVRUUl9IVFRQX1JFUVVFU1RfQ09OVEVOVF9MRU5HVEggPSAnaHR0cC5yZXF1ZXN0X2NvbnRlbnRfbGVuZ3RoJztcbi8qKlxuICogRGVwcmVjYXRlZCwgdXNlIGBodHRwLnJlcXVlc3QuYm9keS5zaXplYCBpbnN0ZWFkLlxuICpcbiAqIEBleGFtcGxlIDU0OTNcbiAqXG4gKiBAZXhwZXJpbWVudGFsIFRoaXMgYXR0cmlidXRlIGlzIGV4cGVyaW1lbnRhbCBhbmQgaXMgc3ViamVjdCB0byBicmVha2luZyBjaGFuZ2VzIGluIG1pbm9yIHJlbGVhc2VzIG9mIGBAb3BlbnRlbGVtZXRyeS9zZW1hbnRpYy1jb252ZW50aW9uc2AuXG4gKlxuICogQGRlcHJlY2F0ZWQgUmVwbGFjZWQgYnkgYGh0dHAucmVxdWVzdC5ib2R5LnNpemVgLlxuICovXG5leHBvcnRzLkFUVFJfSFRUUF9SRVFVRVNUX0NPTlRFTlRfTEVOR1RIX1VOQ09NUFJFU1NFRCA9ICdodHRwLnJlcXVlc3RfY29udGVudF9sZW5ndGhfdW5jb21wcmVzc2VkJztcbi8qKlxuICogRGVwcmVjYXRlZCwgdXNlIGBodHRwLnJlc3BvbnNlLmhlYWRlci48a2V5PmAgaW5zdGVhZC5cbiAqXG4gKiBAZXhhbXBsZSAzNDk1XG4gKlxuICogQGV4cGVyaW1lbnRhbCBUaGlzIGF0dHJpYnV0ZSBpcyBleHBlcmltZW50YWwgYW5kIGlzIHN1YmplY3QgdG8gYnJlYWtpbmcgY2hhbmdlcyBpbiBtaW5vciByZWxlYXNlcyBvZiBgQG9wZW50ZWxlbWV0cnkvc2VtYW50aWMtY29udmVudGlvbnNgLlxuICpcbiAqIEBkZXByZWNhdGVkIFJlcGxhY2VkIGJ5IGBodHRwLnJlc3BvbnNlLmhlYWRlci48a2V5PmAuXG4gKi9cbmV4cG9ydHMuQVRUUl9IVFRQX1JFU1BPTlNFX0NPTlRFTlRfTEVOR1RIID0gJ2h0dHAucmVzcG9uc2VfY29udGVudF9sZW5ndGgnO1xuLyoqXG4gKiBEZXByZWNhdGVkLCB1c2UgYGh0dHAucmVzcG9uc2UuYm9keS5zaXplYCBpbnN0ZWFkLlxuICpcbiAqIEBleGFtcGxlIDU0OTNcbiAqXG4gKiBAZXhwZXJpbWVudGFsIFRoaXMgYXR0cmlidXRlIGlzIGV4cGVyaW1lbnRhbCBhbmQgaXMgc3ViamVjdCB0byBicmVha2luZyBjaGFuZ2VzIGluIG1pbm9yIHJlbGVhc2VzIG9mIGBAb3BlbnRlbGVtZXRyeS9zZW1hbnRpYy1jb252ZW50aW9uc2AuXG4gKlxuICogQGRlcHJlY2F0ZWQgUmVwbGFjZSBieSBgaHR0cC5yZXNwb25zZS5ib2R5LnNpemVgLlxuICovXG5leHBvcnRzLkFUVFJfSFRUUF9SRVNQT05TRV9DT05URU5UX0xFTkdUSF9VTkNPTVBSRVNTRUQgPSAnaHR0cC5yZXNwb25zZV9jb250ZW50X2xlbmd0aF91bmNvbXByZXNzZWQnO1xuLyoqXG4gKiBEZXByZWNhdGVkLCB1c2UgYHVybC5zY2hlbWVgIGluc3RlYWQuXG4gKlxuICogQGV4YW1wbGUgaHR0cFxuICogQGV4YW1wbGUgaHR0cHNcbiAqXG4gKiBAZXhwZXJpbWVudGFsIFRoaXMgYXR0cmlidXRlIGlzIGV4cGVyaW1lbnRhbCBhbmQgaXMgc3ViamVjdCB0byBicmVha2luZyBjaGFuZ2VzIGluIG1pbm9yIHJlbGVhc2VzIG9mIGBAb3BlbnRlbGVtZXRyeS9zZW1hbnRpYy1jb252ZW50aW9uc2AuXG4gKlxuICogQGRlcHJlY2F0ZWQgUmVwbGFjZWQgYnkgYHVybC5zY2hlbWVgIGluc3RlYWQuXG4gKi9cbmV4cG9ydHMuQVRUUl9IVFRQX1NDSEVNRSA9ICdodHRwLnNjaGVtZSc7XG4vKipcbiAqIERlcHJlY2F0ZWQsIHVzZSBgc2VydmVyLmFkZHJlc3NgIGluc3RlYWQuXG4gKlxuICogQGV4YW1wbGUgZXhhbXBsZS5jb21cbiAqXG4gKiBAZXhwZXJpbWVudGFsIFRoaXMgYXR0cmlidXRlIGlzIGV4cGVyaW1lbnRhbCBhbmQgaXMgc3ViamVjdCB0byBicmVha2luZyBjaGFuZ2VzIGluIG1pbm9yIHJlbGVhc2VzIG9mIGBAb3BlbnRlbGVtZXRyeS9zZW1hbnRpYy1jb252ZW50aW9uc2AuXG4gKlxuICogQGRlcHJlY2F0ZWQgUmVwbGFjZWQgYnkgYHNlcnZlci5hZGRyZXNzYC5cbiAqL1xuZXhwb3J0cy5BVFRSX0hUVFBfU0VSVkVSX05BTUUgPSAnaHR0cC5zZXJ2ZXJfbmFtZSc7XG4vKipcbiAqIERlcHJlY2F0ZWQsIHVzZSBgaHR0cC5yZXNwb25zZS5zdGF0dXNfY29kZWAgaW5zdGVhZC5cbiAqXG4gKiBAZXhhbXBsZSAyMDBcbiAqXG4gKiBAZXhwZXJpbWVudGFsIFRoaXMgYXR0cmlidXRlIGlzIGV4cGVyaW1lbnRhbCBhbmQgaXMgc3ViamVjdCB0byBicmVha2luZyBjaGFuZ2VzIGluIG1pbm9yIHJlbGVhc2VzIG9mIGBAb3BlbnRlbGVtZXRyeS9zZW1hbnRpYy1jb252ZW50aW9uc2AuXG4gKlxuICogQGRlcHJlY2F0ZWQgUmVwbGFjZWQgYnkgYGh0dHAucmVzcG9uc2Uuc3RhdHVzX2NvZGVgLlxuICovXG5leHBvcnRzLkFUVFJfSFRUUF9TVEFUVVNfQ09ERSA9ICdodHRwLnN0YXR1c19jb2RlJztcbi8qKlxuICogRGVwcmVjYXRlZCwgdXNlIGB1cmwucGF0aGAgYW5kIGB1cmwucXVlcnlgIGluc3RlYWQuXG4gKlxuICogQGV4YW1wbGUgL3NlYXJjaD9xPU9wZW5UZWxlbWV0cnkjU2VtQ29udlxuICpcbiAqIEBleHBlcmltZW50YWwgVGhpcyBhdHRyaWJ1dGUgaXMgZXhwZXJpbWVudGFsIGFuZCBpcyBzdWJqZWN0IHRvIGJyZWFraW5nIGNoYW5nZXMgaW4gbWlub3IgcmVsZWFzZXMgb2YgYEBvcGVudGVsZW1ldHJ5L3NlbWFudGljLWNvbnZlbnRpb25zYC5cbiAqXG4gKiBAZGVwcmVjYXRlZCBTcGxpdCB0byBgdXJsLnBhdGhgIGFuZCBgdXJsLnF1ZXJ5LlxuICovXG5leHBvcnRzLkFUVFJfSFRUUF9UQVJHRVQgPSAnaHR0cC50YXJnZXQnO1xuLyoqXG4gKiBEZXByZWNhdGVkLCB1c2UgYHVybC5mdWxsYCBpbnN0ZWFkLlxuICpcbiAqIEBleGFtcGxlIGh0dHBzOi8vd3d3LmZvby5iYXIvc2VhcmNoP3E9T3BlblRlbGVtZXRyeSNTZW1Db252XG4gKlxuICogQGV4cGVyaW1lbnRhbCBUaGlzIGF0dHJpYnV0ZSBpcyBleHBlcmltZW50YWwgYW5kIGlzIHN1YmplY3QgdG8gYnJlYWtpbmcgY2hhbmdlcyBpbiBtaW5vciByZWxlYXNlcyBvZiBgQG9wZW50ZWxlbWV0cnkvc2VtYW50aWMtY29udmVudGlvbnNgLlxuICpcbiAqIEBkZXByZWNhdGVkIFJlcGxhY2VkIGJ5IGB1cmwuZnVsbGAuXG4gKi9cbmV4cG9ydHMuQVRUUl9IVFRQX1VSTCA9ICdodHRwLnVybCc7XG4vKipcbiAqIERlcHJlY2F0ZWQsIHVzZSBgdXNlcl9hZ2VudC5vcmlnaW5hbGAgaW5zdGVhZC5cbiAqXG4gKiBAZXhhbXBsZSBDRVJOLUxpbmVNb2RlLzIuMTUgbGlid3d3LzIuMTdiM1xuICogQGV4YW1wbGUgTW96aWxsYS81LjAgKGlQaG9uZTsgQ1BVIGlQaG9uZSBPUyAxNF83XzEgbGlrZSBNYWMgT1MgWCkgQXBwbGVXZWJLaXQvNjA1LjEuMTUgKEtIVE1MLCBsaWtlIEdlY2tvKSBWZXJzaW9uLzE0LjEuMiBNb2JpbGUvMTVFMTQ4IFNhZmFyaS82MDQuMVxuICpcbiAqIEBleHBlcmltZW50YWwgVGhpcyBhdHRyaWJ1dGUgaXMgZXhwZXJpbWVudGFsIGFuZCBpcyBzdWJqZWN0IHRvIGJyZWFraW5nIGNoYW5nZXMgaW4gbWlub3IgcmVsZWFzZXMgb2YgYEBvcGVudGVsZW1ldHJ5L3NlbWFudGljLWNvbnZlbnRpb25zYC5cbiAqXG4gKiBAZGVwcmVjYXRlZCBSZXBsYWNlZCBieSBgdXNlcl9hZ2VudC5vcmlnaW5hbGAuXG4gKi9cbmV4cG9ydHMuQVRUUl9IVFRQX1VTRVJfQUdFTlQgPSAnaHR0cC51c2VyX2FnZW50Jztcbi8qKlxuICogRGVwcmVjYXRlZCwgdXNlIGBuZXR3b3JrLmxvY2FsLmFkZHJlc3NgLlxuICpcbiAqIEBleGFtcGxlIFwiMTkyLjE2OC4wLjFcIlxuICpcbiAqIEBleHBlcmltZW50YWwgVGhpcyBhdHRyaWJ1dGUgaXMgZXhwZXJpbWVudGFsIGFuZCBpcyBzdWJqZWN0IHRvIGJyZWFraW5nIGNoYW5nZXMgaW4gbWlub3IgcmVsZWFzZXMgb2YgYEBvcGVudGVsZW1ldHJ5L3NlbWFudGljLWNvbnZlbnRpb25zYC5cbiAqXG4gKiBAZGVwcmVjYXRlZCBSZXBsYWNlZCBieSBgbmV0d29yay5sb2NhbC5hZGRyZXNzYC5cbiAqL1xuZXhwb3J0cy5BVFRSX05FVF9IT1NUX0lQID0gJ25ldC5ob3N0LmlwJztcbi8qKlxuICogRGVwcmVjYXRlZCwgdXNlIGBzZXJ2ZXIuYWRkcmVzc2AuXG4gKlxuICogQGV4YW1wbGUgZXhhbXBsZS5jb21cbiAqXG4gKiBAZXhwZXJpbWVudGFsIFRoaXMgYXR0cmlidXRlIGlzIGV4cGVyaW1lbnRhbCBhbmQgaXMgc3ViamVjdCB0byBicmVha2luZyBjaGFuZ2VzIGluIG1pbm9yIHJlbGVhc2VzIG9mIGBAb3BlbnRlbGVtZXRyeS9zZW1hbnRpYy1jb252ZW50aW9uc2AuXG4gKlxuICogQGRlcHJlY2F0ZWQgUmVwbGFjZWQgYnkgYHNlcnZlci5hZGRyZXNzYC5cbiAqL1xuZXhwb3J0cy5BVFRSX05FVF9IT1NUX05BTUUgPSAnbmV0Lmhvc3QubmFtZSc7XG4vKipcbiAqIERlcHJlY2F0ZWQsIHVzZSBgc2VydmVyLnBvcnRgLlxuICpcbiAqIEBleGFtcGxlIDgwODBcbiAqXG4gKiBAZXhwZXJpbWVudGFsIFRoaXMgYXR0cmlidXRlIGlzIGV4cGVyaW1lbnRhbCBhbmQgaXMgc3ViamVjdCB0byBicmVha2luZyBjaGFuZ2VzIGluIG1pbm9yIHJlbGVhc2VzIG9mIGBAb3BlbnRlbGVtZXRyeS9zZW1hbnRpYy1jb252ZW50aW9uc2AuXG4gKlxuICogQGRlcHJlY2F0ZWQgUmVwbGFjZWQgYnkgYHNlcnZlci5wb3J0YC5cbiAqL1xuZXhwb3J0cy5BVFRSX05FVF9IT1NUX1BPUlQgPSAnbmV0Lmhvc3QucG9ydCc7XG4vKipcbiAqIERlcHJlY2F0ZWQsIHVzZSBgbmV0d29yay5wZWVyLmFkZHJlc3NgLlxuICpcbiAqIEBleGFtcGxlIFwiMTI3LjAuMC4xXCJcbiAqXG4gKiBAZXhwZXJpbWVudGFsIFRoaXMgYXR0cmlidXRlIGlzIGV4cGVyaW1lbnRhbCBhbmQgaXMgc3ViamVjdCB0byBicmVha2luZyBjaGFuZ2VzIGluIG1pbm9yIHJlbGVhc2VzIG9mIGBAb3BlbnRlbGVtZXRyeS9zZW1hbnRpYy1jb252ZW50aW9uc2AuXG4gKlxuICogQGRlcHJlY2F0ZWQgUmVwbGFjZWQgYnkgYG5ldHdvcmsucGVlci5hZGRyZXNzYC5cbiAqL1xuZXhwb3J0cy5BVFRSX05FVF9QRUVSX0lQID0gJ25ldC5wZWVyLmlwJztcbi8qKlxuICogRGVwcmVjYXRlZCwgdXNlIGBzZXJ2ZXIuYWRkcmVzc2Agb24gY2xpZW50IHNwYW5zIGFuZCBgY2xpZW50LmFkZHJlc3NgIG9uIHNlcnZlciBzcGFucy5cbiAqXG4gKiBAZXhhbXBsZSBleGFtcGxlLmNvbVxuICpcbiAqIEBleHBlcmltZW50YWwgVGhpcyBhdHRyaWJ1dGUgaXMgZXhwZXJpbWVudGFsIGFuZCBpcyBzdWJqZWN0IHRvIGJyZWFraW5nIGNoYW5nZXMgaW4gbWlub3IgcmVsZWFzZXMgb2YgYEBvcGVudGVsZW1ldHJ5L3NlbWFudGljLWNvbnZlbnRpb25zYC5cbiAqXG4gKiBAZGVwcmVjYXRlZCBSZXBsYWNlZCBieSBgc2VydmVyLmFkZHJlc3NgIG9uIGNsaWVudCBzcGFucyBhbmQgYGNsaWVudC5hZGRyZXNzYCBvbiBzZXJ2ZXIgc3BhbnMuXG4gKi9cbmV4cG9ydHMuQVRUUl9ORVRfUEVFUl9OQU1FID0gJ25ldC5wZWVyLm5hbWUnO1xuLyoqXG4gKiBEZXByZWNhdGVkLCB1c2UgYHNlcnZlci5wb3J0YCBvbiBjbGllbnQgc3BhbnMgYW5kIGBjbGllbnQucG9ydGAgb24gc2VydmVyIHNwYW5zLlxuICpcbiAqIEBleGFtcGxlIDgwODBcbiAqXG4gKiBAZXhwZXJpbWVudGFsIFRoaXMgYXR0cmlidXRlIGlzIGV4cGVyaW1lbnRhbCBhbmQgaXMgc3ViamVjdCB0byBicmVha2luZyBjaGFuZ2VzIGluIG1pbm9yIHJlbGVhc2VzIG9mIGBAb3BlbnRlbGVtZXRyeS9zZW1hbnRpYy1jb252ZW50aW9uc2AuXG4gKlxuICogQGRlcHJlY2F0ZWQgUmVwbGFjZWQgYnkgYHNlcnZlci5wb3J0YCBvbiBjbGllbnQgc3BhbnMgYW5kIGBjbGllbnQucG9ydGAgb24gc2VydmVyIHNwYW5zLlxuICovXG5leHBvcnRzLkFUVFJfTkVUX1BFRVJfUE9SVCA9ICduZXQucGVlci5wb3J0Jztcbi8qKlxuICogRGVwcmVjYXRlZCwgdXNlIGBuZXR3b3JrLnRyYW5zcG9ydGAuXG4gKlxuICogQGV4cGVyaW1lbnRhbCBUaGlzIGF0dHJpYnV0ZSBpcyBleHBlcmltZW50YWwgYW5kIGlzIHN1YmplY3QgdG8gYnJlYWtpbmcgY2hhbmdlcyBpbiBtaW5vciByZWxlYXNlcyBvZiBgQG9wZW50ZWxlbWV0cnkvc2VtYW50aWMtY29udmVudGlvbnNgLlxuICpcbiAqIEBkZXByZWNhdGVkIFJlcGxhY2VkIGJ5IGBuZXR3b3JrLnRyYW5zcG9ydGAuXG4gKi9cbmV4cG9ydHMuQVRUUl9ORVRfVFJBTlNQT1JUID0gJ25ldC50cmFuc3BvcnQnO1xuLyoqXG4gKiBFbnVtIHZhbHVlIFwiaXBfdGNwXCIgZm9yIGF0dHJpYnV0ZSB7QGxpbmsgQVRUUl9ORVRfVFJBTlNQT1JUfS5cbiAqL1xuZXhwb3J0cy5ORVRfVFJBTlNQT1JUX1ZBTFVFX0lQX1RDUCA9ICdpcF90Y3AnO1xuLyoqXG4gKiBFbnVtIHZhbHVlIFwiaXBfdWRwXCIgZm9yIGF0dHJpYnV0ZSB7QGxpbmsgQVRUUl9ORVRfVFJBTlNQT1JUfS5cbiAqL1xuZXhwb3J0cy5ORVRfVFJBTlNQT1JUX1ZBTFVFX0lQX1VEUCA9ICdpcF91ZHAnO1xuLyoqXG4gKiBFbnVtIHZhbHVlIFwiMS4xXCIgZm9yIGF0dHJpYnV0ZSB7QGxpbmsgQVRUUl9IVFRQX0ZMQVZPUn0uXG4gKi9cbmV4cG9ydHMuSFRUUF9GTEFWT1JfVkFMVUVfSFRUUF8xXzEgPSAnMS4xJztcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXNlbWNvbnYuanMubWFwIl0sIm5hbWVzIjpbXSwiaWdub3JlTGlzdCI6WzBdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///(rsc)/./node_modules/.pnpm/@opentelemetry+instrumentation-http@0.214.0_@opentelemetry+api@1.9.1/node_modules/@opentelemetry/instrumentation-http/build/src/semconv.js\n");
|
|
|
|
/***/ }),
|
|
|
|
/***/ "(rsc)/./node_modules/.pnpm/@opentelemetry+instrumentation-http@0.214.0_@opentelemetry+api@1.9.1/node_modules/@opentelemetry/instrumentation-http/build/src/utils.js":
|
|
/*!*********************************************************************************************************************************************************************!*\
|
|
!*** ./node_modules/.pnpm/@opentelemetry+instrumentation-http@0.214.0_@opentelemetry+api@1.9.1/node_modules/@opentelemetry/instrumentation-http/build/src/utils.js ***!
|
|
\*********************************************************************************************************************************************************************/
|
|
/***/ ((__unused_webpack_module, exports, __webpack_require__) => {
|
|
|
|
eval("\nObject.defineProperty(exports, \"__esModule\", ({ value: true }));\nexports.headerCapture = exports.getIncomingStableRequestMetricAttributesOnResponse = exports.getIncomingRequestMetricAttributesOnResponse = exports.getIncomingRequestAttributesOnResponse = exports.getIncomingRequestMetricAttributes = exports.getIncomingRequestAttributes = exports.getRemoteClientAddress = exports.getOutgoingStableRequestMetricAttributesOnResponse = exports.getOutgoingRequestMetricAttributesOnResponse = exports.getOutgoingRequestAttributesOnResponse = exports.setAttributesFromHttpKind = exports.getOutgoingRequestMetricAttributes = exports.getOutgoingRequestAttributes = exports.extractHostnameAndPort = exports.isValidOptionsType = exports.getRequestInfo = exports.isCompressed = exports.setResponseContentLengthAttribute = exports.setRequestContentLengthAttribute = exports.setSpanWithError = exports.satisfiesPattern = exports.parseResponseStatus = exports.getAbsoluteUrl = void 0;\nconst api_1 = __webpack_require__(/*! @opentelemetry/api */ \"(rsc)/./node_modules/.pnpm/@opentelemetry+api@1.9.1/node_modules/@opentelemetry/api/build/esm/index.js\");\nconst semantic_conventions_1 = __webpack_require__(/*! @opentelemetry/semantic-conventions */ \"(rsc)/./node_modules/.pnpm/@opentelemetry+semantic-conventions@1.40.0/node_modules/@opentelemetry/semantic-conventions/build/esm/index.js\");\nconst semconv_1 = __webpack_require__(/*! ./semconv */ \"(rsc)/./node_modules/.pnpm/@opentelemetry+instrumentation-http@0.214.0_@opentelemetry+api@1.9.1/node_modules/@opentelemetry/instrumentation-http/build/src/semconv.js\");\nconst core_1 = __webpack_require__(/*! @opentelemetry/core */ \"(rsc)/./node_modules/.pnpm/@opentelemetry+core@2.6.1_@opentelemetry+api@1.9.1/node_modules/@opentelemetry/core/build/esm/index.js\");\nconst instrumentation_1 = __webpack_require__(/*! @opentelemetry/instrumentation */ \"(rsc)/./node_modules/.pnpm/@opentelemetry+instrumentation@0.214.0_@opentelemetry+api@1.9.1/node_modules/@opentelemetry/instrumentation/build/esm/index.js\");\nconst url = __webpack_require__(/*! url */ \"url\");\nconst AttributeNames_1 = __webpack_require__(/*! ./enums/AttributeNames */ \"(rsc)/./node_modules/.pnpm/@opentelemetry+instrumentation-http@0.214.0_@opentelemetry+api@1.9.1/node_modules/@opentelemetry/instrumentation-http/build/src/enums/AttributeNames.js\");\nconst internal_types_1 = __webpack_require__(/*! ./internal-types */ \"(rsc)/./node_modules/.pnpm/@opentelemetry+instrumentation-http@0.214.0_@opentelemetry+api@1.9.1/node_modules/@opentelemetry/instrumentation-http/build/src/internal-types.js\");\nconst internal_types_2 = __webpack_require__(/*! ./internal-types */ \"(rsc)/./node_modules/.pnpm/@opentelemetry+instrumentation-http@0.214.0_@opentelemetry+api@1.9.1/node_modules/@opentelemetry/instrumentation-http/build/src/internal-types.js\");\n// eslint-disable-next-line @typescript-eslint/no-require-imports\nconst forwardedParse = __webpack_require__(/*! forwarded-parse */ \"(rsc)/./node_modules/.pnpm/forwarded-parse@2.1.2/node_modules/forwarded-parse/index.js\");\n/**\n * Get an absolute url\n */\nconst getAbsoluteUrl = (requestUrl, headers, fallbackProtocol = 'http:', redactedQueryParams = Array.from(internal_types_2.DEFAULT_QUERY_STRINGS_TO_REDACT)) => {\n const reqUrlObject = requestUrl || {};\n const protocol = reqUrlObject.protocol || fallbackProtocol;\n const port = (reqUrlObject.port || '').toString();\n let path = reqUrlObject.path || '/';\n let host = reqUrlObject.host || reqUrlObject.hostname || headers.host || 'localhost';\n // if there is no port in host and there is a port\n // it should be displayed if it's not 80 and 443 (default ports)\n if (host.indexOf(':') === -1 &&\n port &&\n port !== '80' &&\n port !== '443') {\n host += `:${port}`;\n }\n // Redact sensitive query parameters\n if (path.includes('?')) {\n try {\n const parsedUrl = new URL(path, 'http://localhost');\n const sensitiveParamsToRedact = redactedQueryParams || [];\n for (const sensitiveParam of sensitiveParamsToRedact) {\n if (parsedUrl.searchParams.get(sensitiveParam)) {\n parsedUrl.searchParams.set(sensitiveParam, internal_types_2.STR_REDACTED);\n }\n }\n path = `${parsedUrl.pathname}${parsedUrl.search}`;\n }\n catch {\n // Ignore error, as the path was not a valid URL.\n }\n }\n const authPart = reqUrlObject.auth ? `${internal_types_2.STR_REDACTED}:${internal_types_2.STR_REDACTED}@` : '';\n return `${protocol}//${authPart}${host}${path}`;\n};\nexports.getAbsoluteUrl = getAbsoluteUrl;\n/**\n * Parse status code from HTTP response. [More details](https://github.com/open-telemetry/opentelemetry-specification/blob/master/specification/data-http.md#status)\n */\nconst parseResponseStatus = (kind, statusCode) => {\n const upperBound = kind === api_1.SpanKind.CLIENT ? 400 : 500;\n // 1xx, 2xx, 3xx are OK on client and server\n // 4xx is OK on server\n if (statusCode && statusCode >= 100 && statusCode < upperBound) {\n return api_1.SpanStatusCode.UNSET;\n }\n // All other codes are error\n return api_1.SpanStatusCode.ERROR;\n};\nexports.parseResponseStatus = parseResponseStatus;\n/**\n * Check whether the given obj match pattern\n * @param constant e.g URL of request\n * @param pattern Match pattern\n */\nconst satisfiesPattern = (constant, pattern) => {\n if (typeof pattern === 'string') {\n return pattern === constant;\n }\n else if (pattern instanceof RegExp) {\n return pattern.test(constant);\n }\n else if (typeof pattern === 'function') {\n return pattern(constant);\n }\n else {\n throw new TypeError('Pattern is in unsupported datatype');\n }\n};\nexports.satisfiesPattern = satisfiesPattern;\n/**\n * Sets the span with the error passed in params\n * @param {Span} span the span that need to be set\n * @param {Error} error error that will be set to span\n * @param {SemconvStability} semconvStability determines which semconv version to use\n */\nconst setSpanWithError = (span, error, semconvStability) => {\n const message = error.message;\n if (semconvStability & instrumentation_1.SemconvStability.OLD) {\n span.setAttribute(AttributeNames_1.AttributeNames.HTTP_ERROR_NAME, error.name);\n span.setAttribute(AttributeNames_1.AttributeNames.HTTP_ERROR_MESSAGE, message);\n }\n if (semconvStability & instrumentation_1.SemconvStability.STABLE) {\n span.setAttribute(semantic_conventions_1.ATTR_ERROR_TYPE, error.name);\n }\n span.setStatus({ code: api_1.SpanStatusCode.ERROR, message });\n span.recordException(error);\n};\nexports.setSpanWithError = setSpanWithError;\n/**\n * Adds attributes for request content-length and content-encoding HTTP headers\n * @param { IncomingMessage } Request object whose headers will be analyzed\n * @param { Attributes } Attributes object to be modified\n */\nconst setRequestContentLengthAttribute = (request, attributes) => {\n const length = getContentLength(request.headers);\n if (length === null)\n return;\n if ((0, exports.isCompressed)(request.headers)) {\n attributes[semconv_1.ATTR_HTTP_REQUEST_CONTENT_LENGTH] = length;\n }\n else {\n attributes[semconv_1.ATTR_HTTP_REQUEST_CONTENT_LENGTH_UNCOMPRESSED] = length;\n }\n};\nexports.setRequestContentLengthAttribute = setRequestContentLengthAttribute;\n/**\n * Adds attributes for response content-length and content-encoding HTTP headers\n * @param { IncomingMessage } Response object whose headers will be analyzed\n * @param { Attributes } Attributes object to be modified\n *\n * @deprecated this is for an older version of semconv. It is retained for compatibility using OTEL_SEMCONV_STABILITY_OPT_IN\n */\nconst setResponseContentLengthAttribute = (response, attributes) => {\n const length = getContentLength(response.headers);\n if (length === null)\n return;\n if ((0, exports.isCompressed)(response.headers)) {\n attributes[semconv_1.ATTR_HTTP_RESPONSE_CONTENT_LENGTH] = length;\n }\n else {\n attributes[semconv_1.ATTR_HTTP_RESPONSE_CONTENT_LENGTH_UNCOMPRESSED] = length;\n }\n};\nexports.setResponseContentLengthAttribute = setResponseContentLengthAttribute;\nfunction getContentLength(headers) {\n const contentLengthHeader = headers['content-length'];\n if (contentLengthHeader === undefined)\n return null;\n const contentLength = parseInt(contentLengthHeader, 10);\n if (isNaN(contentLength))\n return null;\n return contentLength;\n}\nconst isCompressed = (headers) => {\n const encoding = headers['content-encoding'];\n return !!encoding && encoding !== 'identity';\n};\nexports.isCompressed = isCompressed;\n/**\n * Mimics Node.js conversion of URL strings to RequestOptions expected by\n * `http.request` and `https.request` APIs.\n *\n * See https://github.com/nodejs/node/blob/2505e217bba05fc581b572c685c5cf280a16c5a3/lib/internal/url.js#L1415-L1437\n *\n * @param stringUrl\n * @throws TypeError if the URL is not valid.\n */\nfunction stringUrlToHttpOptions(stringUrl) {\n // This is heavily inspired by Node.js handling of the same situation, trying\n // to follow it as closely as possible while keeping in mind that we only\n // deal with string URLs, not URL objects.\n const { hostname, pathname, port, username, password, search, protocol, hash, href, origin, host, } = new URL(stringUrl);\n const options = {\n protocol: protocol,\n hostname: hostname && hostname[0] === '[' ? hostname.slice(1, -1) : hostname,\n hash: hash,\n search: search,\n pathname: pathname,\n path: `${pathname || ''}${search || ''}`,\n href: href,\n origin: origin,\n host: host,\n };\n if (port !== '') {\n options.port = Number(port);\n }\n if (username || password) {\n options.auth = `${decodeURIComponent(username)}:${decodeURIComponent(password)}`;\n }\n return options;\n}\n/**\n * Makes sure options is an url object\n * return an object with default value and parsed options\n * @param logger component logger\n * @param options original options for the request\n * @param [extraOptions] additional options for the request\n */\nconst getRequestInfo = (logger, options, extraOptions) => {\n let pathname;\n let origin;\n let optionsParsed;\n let invalidUrl = false;\n if (typeof options === 'string') {\n try {\n const convertedOptions = stringUrlToHttpOptions(options);\n optionsParsed = convertedOptions;\n pathname = convertedOptions.pathname || '/';\n }\n catch (e) {\n invalidUrl = true;\n logger.verbose('Unable to parse URL provided to HTTP request, using fallback to determine path. Original error:', e);\n // for backward compatibility with how url.parse() behaved.\n optionsParsed = {\n path: options,\n };\n pathname = optionsParsed.path || '/';\n }\n origin = `${optionsParsed.protocol || 'http:'}//${optionsParsed.host}`;\n if (extraOptions !== undefined) {\n Object.assign(optionsParsed, extraOptions);\n }\n }\n else if (options instanceof url.URL) {\n optionsParsed = {\n protocol: options.protocol,\n hostname: typeof options.hostname === 'string' && options.hostname.startsWith('[')\n ? options.hostname.slice(1, -1)\n : options.hostname,\n path: `${options.pathname || ''}${options.search || ''}`,\n };\n if (options.port !== '') {\n optionsParsed.port = Number(options.port);\n }\n if (options.username || options.password) {\n optionsParsed.auth = `${options.username}:${options.password}`;\n }\n pathname = options.pathname;\n origin = options.origin;\n if (extraOptions !== undefined) {\n Object.assign(optionsParsed, extraOptions);\n }\n }\n else {\n optionsParsed = Object.assign({ protocol: options.host ? 'http:' : undefined }, options);\n const hostname = optionsParsed.host ||\n (optionsParsed.port != null\n ? `${optionsParsed.hostname}${optionsParsed.port}`\n : optionsParsed.hostname);\n origin = `${optionsParsed.protocol || 'http:'}//${hostname}`;\n pathname = options.pathname;\n if (!pathname && optionsParsed.path) {\n try {\n const parsedUrl = new URL(optionsParsed.path, origin);\n pathname = parsedUrl.pathname || '/';\n }\n catch {\n pathname = '/';\n }\n }\n }\n // some packages return method in lowercase..\n // ensure upperCase for consistency\n const method = optionsParsed.method\n ? optionsParsed.method.toUpperCase()\n : 'GET';\n return { origin, pathname, method, optionsParsed, invalidUrl };\n};\nexports.getRequestInfo = getRequestInfo;\n/**\n * Makes sure options is of type string or object\n * @param options for the request\n */\nconst isValidOptionsType = (options) => {\n if (!options) {\n return false;\n }\n const type = typeof options;\n return type === 'string' || (type === 'object' && !Array.isArray(options));\n};\nexports.isValidOptionsType = isValidOptionsType;\nconst extractHostnameAndPort = (requestOptions) => {\n if (requestOptions.hostname && requestOptions.port) {\n return { hostname: requestOptions.hostname, port: requestOptions.port };\n }\n const matches = requestOptions.host?.match(/^([^:/ ]+)(:\\d{1,5})?/) || null;\n const hostname = requestOptions.hostname || (matches === null ? 'localhost' : matches[1]);\n let port = requestOptions.port;\n if (!port) {\n if (matches && matches[2]) {\n // remove the leading \":\". The extracted port would be something like \":8080\"\n port = matches[2].substring(1);\n }\n else {\n port = requestOptions.protocol === 'https:' ? '443' : '80';\n }\n }\n return { hostname, port };\n};\nexports.extractHostnameAndPort = extractHostnameAndPort;\n/**\n * Returns outgoing request attributes scoped to the options passed to the request\n * @param {ParsedRequestOptions} requestOptions the same options used to make the request\n * @param {{ component: string, hostname: string, hookAttributes?: Attributes }} options used to pass data needed to create attributes\n * @param {SemconvStability} semconvStability determines which semconv version to use\n */\nconst getOutgoingRequestAttributes = (requestOptions, options, semconvStability, enableSyntheticSourceDetection) => {\n const hostname = options.hostname;\n const port = options.port;\n const method = requestOptions.method ?? 'GET';\n const normalizedMethod = normalizeMethod(method);\n const headers = (requestOptions.headers || {});\n const userAgent = headers['user-agent'];\n const urlFull = (0, exports.getAbsoluteUrl)(requestOptions, headers, `${options.component}:`, options.redactedQueryParams);\n const oldAttributes = {\n [semconv_1.ATTR_HTTP_URL]: urlFull,\n [semconv_1.ATTR_HTTP_METHOD]: method,\n [semconv_1.ATTR_HTTP_TARGET]: requestOptions.path || '/',\n [semconv_1.ATTR_NET_PEER_NAME]: hostname,\n [semconv_1.ATTR_HTTP_HOST]: headers.host ?? `${hostname}:${port}`,\n };\n const newAttributes = {\n // Required attributes\n [semantic_conventions_1.ATTR_HTTP_REQUEST_METHOD]: normalizedMethod,\n [semantic_conventions_1.ATTR_SERVER_ADDRESS]: hostname,\n [semantic_conventions_1.ATTR_SERVER_PORT]: Number(port),\n [semantic_conventions_1.ATTR_URL_FULL]: urlFull,\n [semantic_conventions_1.ATTR_USER_AGENT_ORIGINAL]: userAgent,\n // leaving out protocol version, it is not yet negotiated\n // leaving out protocol name, it is only required when protocol version is set\n // retries and redirects not supported\n // Opt-in attributes left off for now\n };\n // conditionally required if request method required case normalization\n if (method !== normalizedMethod) {\n newAttributes[semantic_conventions_1.ATTR_HTTP_REQUEST_METHOD_ORIGINAL] = method;\n }\n if (enableSyntheticSourceDetection && userAgent) {\n newAttributes[semconv_1.ATTR_USER_AGENT_SYNTHETIC_TYPE] = getSyntheticType(userAgent);\n }\n if (userAgent !== undefined) {\n oldAttributes[semconv_1.ATTR_HTTP_USER_AGENT] = userAgent;\n }\n switch (semconvStability) {\n case instrumentation_1.SemconvStability.STABLE:\n return Object.assign(newAttributes, options.hookAttributes);\n case instrumentation_1.SemconvStability.OLD:\n return Object.assign(oldAttributes, options.hookAttributes);\n }\n return Object.assign(oldAttributes, newAttributes, options.hookAttributes);\n};\nexports.getOutgoingRequestAttributes = getOutgoingRequestAttributes;\n/**\n * Returns outgoing request Metric attributes scoped to the request data\n * @param {Attributes} spanAttributes the span attributes\n */\nconst getOutgoingRequestMetricAttributes = (spanAttributes) => {\n const metricAttributes = {};\n metricAttributes[semconv_1.ATTR_HTTP_METHOD] = spanAttributes[semconv_1.ATTR_HTTP_METHOD];\n metricAttributes[semconv_1.ATTR_NET_PEER_NAME] = spanAttributes[semconv_1.ATTR_NET_PEER_NAME];\n //TODO: http.url attribute, it should substitute any parameters to avoid high cardinality.\n return metricAttributes;\n};\nexports.getOutgoingRequestMetricAttributes = getOutgoingRequestMetricAttributes;\n/**\n * Returns attributes related to the kind of HTTP protocol used\n * @param {string} [kind] Kind of HTTP protocol used: \"1.0\", \"1.1\", \"2\", \"SPDY\" or \"QUIC\".\n */\nconst setAttributesFromHttpKind = (kind, attributes) => {\n if (kind) {\n attributes[semconv_1.ATTR_HTTP_FLAVOR] = kind;\n if (kind.toUpperCase() !== 'QUIC') {\n attributes[semconv_1.ATTR_NET_TRANSPORT] = semconv_1.NET_TRANSPORT_VALUE_IP_TCP;\n }\n else {\n attributes[semconv_1.ATTR_NET_TRANSPORT] = semconv_1.NET_TRANSPORT_VALUE_IP_UDP;\n }\n }\n};\nexports.setAttributesFromHttpKind = setAttributesFromHttpKind;\n/**\n * Returns the type of synthetic source based on the user agent\n * @param {OutgoingHttpHeader} userAgent the user agent string\n */\nconst getSyntheticType = (userAgent) => {\n const userAgentString = String(userAgent).toLowerCase();\n for (const name of internal_types_1.SYNTHETIC_TEST_NAMES) {\n if (userAgentString.includes(name)) {\n return semconv_1.USER_AGENT_SYNTHETIC_TYPE_VALUE_TEST;\n }\n }\n for (const name of internal_types_1.SYNTHETIC_BOT_NAMES) {\n if (userAgentString.includes(name)) {\n return semconv_1.USER_AGENT_SYNTHETIC_TYPE_VALUE_BOT;\n }\n }\n return;\n};\n/**\n * Returns outgoing request attributes scoped to the response data\n * @param {IncomingMessage} response the response object\n * @param {SemconvStability} semconvStability determines which semconv version to use\n */\nconst getOutgoingRequestAttributesOnResponse = (response, semconvStability) => {\n const { statusCode, statusMessage, httpVersion, socket } = response;\n const oldAttributes = {};\n const stableAttributes = {};\n if (statusCode != null) {\n stableAttributes[semantic_conventions_1.ATTR_HTTP_RESPONSE_STATUS_CODE] = statusCode;\n }\n if (socket) {\n const { remoteAddress, remotePort } = socket;\n oldAttributes[semconv_1.ATTR_NET_PEER_IP] = remoteAddress;\n oldAttributes[semconv_1.ATTR_NET_PEER_PORT] = remotePort;\n // Recommended\n stableAttributes[semantic_conventions_1.ATTR_NETWORK_PEER_ADDRESS] = remoteAddress;\n stableAttributes[semantic_conventions_1.ATTR_NETWORK_PEER_PORT] = remotePort;\n stableAttributes[semantic_conventions_1.ATTR_NETWORK_PROTOCOL_VERSION] = response.httpVersion;\n }\n (0, exports.setResponseContentLengthAttribute)(response, oldAttributes);\n if (statusCode) {\n oldAttributes[semconv_1.ATTR_HTTP_STATUS_CODE] = statusCode;\n oldAttributes[AttributeNames_1.AttributeNames.HTTP_STATUS_TEXT] = (statusMessage || '').toUpperCase();\n }\n (0, exports.setAttributesFromHttpKind)(httpVersion, oldAttributes);\n switch (semconvStability) {\n case instrumentation_1.SemconvStability.STABLE:\n return stableAttributes;\n case instrumentation_1.SemconvStability.OLD:\n return oldAttributes;\n }\n return Object.assign(oldAttributes, stableAttributes);\n};\nexports.getOutgoingRequestAttributesOnResponse = getOutgoingRequestAttributesOnResponse;\n/**\n * Returns outgoing request Metric attributes scoped to the response data\n * @param {Attributes} spanAttributes the span attributes\n */\nconst getOutgoingRequestMetricAttributesOnResponse = (spanAttributes) => {\n const metricAttributes = {};\n metricAttributes[semconv_1.ATTR_NET_PEER_PORT] = spanAttributes[semconv_1.ATTR_NET_PEER_PORT];\n metricAttributes[semconv_1.ATTR_HTTP_STATUS_CODE] =\n spanAttributes[semconv_1.ATTR_HTTP_STATUS_CODE];\n metricAttributes[semconv_1.ATTR_HTTP_FLAVOR] = spanAttributes[semconv_1.ATTR_HTTP_FLAVOR];\n return metricAttributes;\n};\nexports.getOutgoingRequestMetricAttributesOnResponse = getOutgoingRequestMetricAttributesOnResponse;\nconst getOutgoingStableRequestMetricAttributesOnResponse = (spanAttributes) => {\n const metricAttributes = {};\n if (spanAttributes[semantic_conventions_1.ATTR_NETWORK_PROTOCOL_VERSION]) {\n metricAttributes[semantic_conventions_1.ATTR_NETWORK_PROTOCOL_VERSION] =\n spanAttributes[semantic_conventions_1.ATTR_NETWORK_PROTOCOL_VERSION];\n }\n if (spanAttributes[semantic_conventions_1.ATTR_HTTP_RESPONSE_STATUS_CODE]) {\n metricAttributes[semantic_conventions_1.ATTR_HTTP_RESPONSE_STATUS_CODE] =\n spanAttributes[semantic_conventions_1.ATTR_HTTP_RESPONSE_STATUS_CODE];\n }\n return metricAttributes;\n};\nexports.getOutgoingStableRequestMetricAttributesOnResponse = getOutgoingStableRequestMetricAttributesOnResponse;\nfunction parseHostHeader(hostHeader, proto) {\n const parts = hostHeader.split(':');\n // no semicolon implies ipv4 dotted syntax or host name without port\n // x.x.x.x\n // example.com\n if (parts.length === 1) {\n if (proto === 'http') {\n return { host: parts[0], port: '80' };\n }\n if (proto === 'https') {\n return { host: parts[0], port: '443' };\n }\n return { host: parts[0] };\n }\n // single semicolon implies ipv4 dotted syntax or host name with port\n // x.x.x.x:yyyy\n // example.com:yyyy\n if (parts.length === 2) {\n return {\n host: parts[0],\n port: parts[1],\n };\n }\n // more than 2 parts implies ipv6 syntax with multiple colons\n // [x:x:x:x:x:x:x:x]\n // [x:x:x:x:x:x:x:x]:yyyy\n if (parts[0].startsWith('[')) {\n if (parts[parts.length - 1].endsWith(']')) {\n if (proto === 'http') {\n return { host: hostHeader, port: '80' };\n }\n if (proto === 'https') {\n return { host: hostHeader, port: '443' };\n }\n }\n else if (parts[parts.length - 2].endsWith(']')) {\n return {\n host: parts.slice(0, -1).join(':'),\n port: parts[parts.length - 1],\n };\n }\n }\n // if nothing above matches just return the host header\n return { host: hostHeader };\n}\n/**\n * Get server.address and port according to http semconv 1.27\n * https://github.com/open-telemetry/semantic-conventions/blob/bf0a2c1134f206f034408b201dbec37960ed60ec/docs/http/http-spans.md#setting-serveraddress-and-serverport-attributes\n */\nfunction getServerAddress(request, component) {\n const forwardedHeader = request.headers['forwarded'];\n if (forwardedHeader) {\n for (const entry of parseForwardedHeader(forwardedHeader)) {\n if (entry.host) {\n return parseHostHeader(entry.host, entry.proto);\n }\n }\n }\n const xForwardedHost = request.headers['x-forwarded-host'];\n if (typeof xForwardedHost === 'string') {\n if (typeof request.headers['x-forwarded-proto'] === 'string') {\n return parseHostHeader(xForwardedHost, request.headers['x-forwarded-proto']);\n }\n if (Array.isArray(request.headers['x-forwarded-proto'])) {\n return parseHostHeader(xForwardedHost, request.headers['x-forwarded-proto'][0]);\n }\n return parseHostHeader(xForwardedHost);\n }\n else if (Array.isArray(xForwardedHost) &&\n typeof xForwardedHost[0] === 'string' &&\n xForwardedHost[0].length > 0) {\n if (typeof request.headers['x-forwarded-proto'] === 'string') {\n return parseHostHeader(xForwardedHost[0], request.headers['x-forwarded-proto']);\n }\n if (Array.isArray(request.headers['x-forwarded-proto'])) {\n return parseHostHeader(xForwardedHost[0], request.headers['x-forwarded-proto'][0]);\n }\n return parseHostHeader(xForwardedHost[0]);\n }\n const host = request.headers['host'];\n if (typeof host === 'string' && host.length > 0) {\n return parseHostHeader(host, component);\n }\n return null;\n}\n/**\n * Get server.address and port according to http semconv 1.27\n * https://github.com/open-telemetry/semantic-conventions/blob/bf0a2c1134f206f034408b201dbec37960ed60ec/docs/http/http-spans.md#setting-serveraddress-and-serverport-attributes\n */\nfunction getRemoteClientAddress(request) {\n const forwardedHeader = request.headers['forwarded'];\n if (forwardedHeader) {\n for (const entry of parseForwardedHeader(forwardedHeader)) {\n if (entry.for) {\n return removePortFromAddress(entry.for);\n }\n }\n }\n const xForwardedFor = request.headers['x-forwarded-for'];\n if (xForwardedFor) {\n let xForwardedForVal;\n if (typeof xForwardedFor === 'string') {\n xForwardedForVal = xForwardedFor;\n }\n else if (Array.isArray(xForwardedFor)) {\n xForwardedForVal = xForwardedFor[0];\n }\n if (typeof xForwardedForVal === 'string') {\n xForwardedForVal = xForwardedForVal.split(',')[0].trim();\n return removePortFromAddress(xForwardedForVal);\n }\n }\n const remote = request.socket.remoteAddress;\n if (remote) {\n return remote;\n }\n return null;\n}\nexports.getRemoteClientAddress = getRemoteClientAddress;\nfunction removePortFromAddress(input) {\n // This function can be replaced with SocketAddress.parse() once the minimum\n // supported Node.js version allows it.\n try {\n const { hostname: address } = new URL(`http://${input}`);\n if (address.startsWith('[') && address.endsWith(']')) {\n return address.slice(1, -1);\n }\n return address;\n }\n catch {\n return input;\n }\n}\nfunction getInfoFromIncomingMessage(component, request, logger) {\n try {\n if (request.headers.host) {\n return new URL(request.url ?? '/', `${component}://${request.headers.host}`);\n }\n else {\n const unsafeParsedUrl = new URL(request.url ?? '/', \n // using localhost as a workaround to still use the URL constructor for parsing\n `${component}://localhost`);\n // since we use localhost as a workaround, ensure we hide the rest of the properties to avoid\n // our workaround leaking though.\n return {\n pathname: unsafeParsedUrl.pathname,\n search: unsafeParsedUrl.search,\n toString: function () {\n // we cannot use the result of unsafeParsedUrl.toString as it's potentially wrong.\n return unsafeParsedUrl.pathname + unsafeParsedUrl.search;\n },\n };\n }\n }\n catch (e) {\n // something is wrong, use undefined - this *should* never happen, logging\n // for troubleshooting in case it does happen.\n logger.verbose('Unable to get URL from request', e);\n return {};\n }\n}\n/**\n * Returns incoming request attributes scoped to the request data\n * @param {IncomingMessage} request the request object\n * @param {{ component: string, serverName?: string, hookAttributes?: Attributes }} options used to pass data needed to create attributes\n * @param {SemconvStability} semconvStability determines which semconv version to use\n */\nconst getIncomingRequestAttributes = (request, options, logger) => {\n const { component, enableSyntheticSourceDetection, hookAttributes, semconvStability, serverName, } = options;\n const { headers, httpVersion, method } = request;\n const { host, 'user-agent': userAgent, 'x-forwarded-for': ips } = headers;\n const parsedUrl = getInfoFromIncomingMessage(component, request, logger);\n let newAttributes;\n let oldAttributes;\n if (semconvStability !== instrumentation_1.SemconvStability.OLD) {\n // Stable attributes are used.\n const normalizedMethod = normalizeMethod(method);\n const serverAddress = getServerAddress(request, component);\n const remoteClientAddress = getRemoteClientAddress(request);\n newAttributes = {\n [semantic_conventions_1.ATTR_HTTP_REQUEST_METHOD]: normalizedMethod,\n [semantic_conventions_1.ATTR_URL_SCHEME]: component,\n [semantic_conventions_1.ATTR_SERVER_ADDRESS]: serverAddress?.host,\n [semantic_conventions_1.ATTR_NETWORK_PEER_ADDRESS]: request.socket.remoteAddress,\n [semantic_conventions_1.ATTR_NETWORK_PEER_PORT]: request.socket.remotePort,\n [semantic_conventions_1.ATTR_NETWORK_PROTOCOL_VERSION]: request.httpVersion,\n [semantic_conventions_1.ATTR_USER_AGENT_ORIGINAL]: userAgent,\n };\n if (parsedUrl.pathname != null) {\n newAttributes[semantic_conventions_1.ATTR_URL_PATH] = parsedUrl.pathname;\n }\n if (parsedUrl.search) {\n // Remove leading '?' from URL search (https://developer.mozilla.org/en-US/docs/Web/API/URL/search).\n newAttributes[semantic_conventions_1.ATTR_URL_QUERY] = parsedUrl.search.slice(1);\n }\n if (remoteClientAddress != null) {\n newAttributes[semantic_conventions_1.ATTR_CLIENT_ADDRESS] = remoteClientAddress;\n }\n if (serverAddress?.port != null) {\n newAttributes[semantic_conventions_1.ATTR_SERVER_PORT] = Number(serverAddress.port);\n }\n // Conditionally required if request method required case normalization.\n if (method !== normalizedMethod) {\n newAttributes[semantic_conventions_1.ATTR_HTTP_REQUEST_METHOD_ORIGINAL] = method;\n }\n if (enableSyntheticSourceDetection && userAgent) {\n newAttributes[semconv_1.ATTR_USER_AGENT_SYNTHETIC_TYPE] =\n getSyntheticType(userAgent);\n }\n }\n if (semconvStability !== instrumentation_1.SemconvStability.STABLE) {\n // Old attributes are used.\n const hostname = host?.replace(/^(.*)(:[0-9]{1,5})/, '$1') || 'localhost';\n oldAttributes = {\n [semconv_1.ATTR_HTTP_URL]: parsedUrl.toString(),\n [semconv_1.ATTR_HTTP_HOST]: host,\n [semconv_1.ATTR_NET_HOST_NAME]: hostname,\n [semconv_1.ATTR_HTTP_METHOD]: method,\n [semconv_1.ATTR_HTTP_SCHEME]: component,\n };\n if (typeof ips === 'string') {\n oldAttributes[semconv_1.ATTR_HTTP_CLIENT_IP] = ips.split(',')[0];\n }\n if (typeof serverName === 'string') {\n oldAttributes[semconv_1.ATTR_HTTP_SERVER_NAME] = serverName;\n }\n if (parsedUrl.pathname) {\n oldAttributes[semconv_1.ATTR_HTTP_TARGET] =\n parsedUrl.pathname + parsedUrl.search || '/';\n }\n if (userAgent !== undefined) {\n oldAttributes[semconv_1.ATTR_HTTP_USER_AGENT] = userAgent;\n }\n (0, exports.setRequestContentLengthAttribute)(request, oldAttributes);\n (0, exports.setAttributesFromHttpKind)(httpVersion, oldAttributes);\n }\n switch (semconvStability) {\n case instrumentation_1.SemconvStability.STABLE:\n return Object.assign(newAttributes, hookAttributes);\n case instrumentation_1.SemconvStability.OLD:\n return Object.assign(oldAttributes, hookAttributes);\n default:\n return Object.assign(oldAttributes, newAttributes, hookAttributes);\n }\n};\nexports.getIncomingRequestAttributes = getIncomingRequestAttributes;\n/**\n * Returns incoming request Metric attributes scoped to the request data\n * @param {Attributes} spanAttributes the span attributes\n * @param {{ component: string }} options used to pass data needed to create attributes\n */\nconst getIncomingRequestMetricAttributes = (spanAttributes) => {\n const metricAttributes = {};\n metricAttributes[semconv_1.ATTR_HTTP_SCHEME] = spanAttributes[semconv_1.ATTR_HTTP_SCHEME];\n metricAttributes[semconv_1.ATTR_HTTP_METHOD] = spanAttributes[semconv_1.ATTR_HTTP_METHOD];\n metricAttributes[semconv_1.ATTR_NET_HOST_NAME] = spanAttributes[semconv_1.ATTR_NET_HOST_NAME];\n metricAttributes[semconv_1.ATTR_HTTP_FLAVOR] = spanAttributes[semconv_1.ATTR_HTTP_FLAVOR];\n //TODO: http.target attribute, it should substitute any parameters to avoid high cardinality.\n return metricAttributes;\n};\nexports.getIncomingRequestMetricAttributes = getIncomingRequestMetricAttributes;\n/**\n * Returns incoming request attributes scoped to the response data\n * @param {(ServerResponse & { socket: Socket; })} response the response object\n */\nconst getIncomingRequestAttributesOnResponse = (request, response, semconvStability) => {\n // take socket from the request,\n // since it may be detached from the response object in keep-alive mode\n const { socket } = request;\n const { statusCode, statusMessage } = response;\n const newAttributes = {\n [semantic_conventions_1.ATTR_HTTP_RESPONSE_STATUS_CODE]: statusCode,\n };\n const rpcMetadata = (0, core_1.getRPCMetadata)(api_1.context.active());\n const oldAttributes = {};\n if (socket) {\n const { localAddress, localPort, remoteAddress, remotePort } = socket;\n oldAttributes[semconv_1.ATTR_NET_HOST_IP] = localAddress;\n oldAttributes[semconv_1.ATTR_NET_HOST_PORT] = localPort;\n oldAttributes[semconv_1.ATTR_NET_PEER_IP] = remoteAddress;\n oldAttributes[semconv_1.ATTR_NET_PEER_PORT] = remotePort;\n }\n oldAttributes[semconv_1.ATTR_HTTP_STATUS_CODE] = statusCode;\n oldAttributes[AttributeNames_1.AttributeNames.HTTP_STATUS_TEXT] = (statusMessage || '').toUpperCase();\n if (rpcMetadata?.type === core_1.RPCType.HTTP && rpcMetadata.route !== undefined) {\n oldAttributes[semantic_conventions_1.ATTR_HTTP_ROUTE] = rpcMetadata.route;\n newAttributes[semantic_conventions_1.ATTR_HTTP_ROUTE] = rpcMetadata.route;\n }\n switch (semconvStability) {\n case instrumentation_1.SemconvStability.STABLE:\n return newAttributes;\n case instrumentation_1.SemconvStability.OLD:\n return oldAttributes;\n }\n return Object.assign(oldAttributes, newAttributes);\n};\nexports.getIncomingRequestAttributesOnResponse = getIncomingRequestAttributesOnResponse;\n/**\n * Returns incoming request Metric attributes scoped to the request data\n * @param {Attributes} spanAttributes the span attributes\n */\nconst getIncomingRequestMetricAttributesOnResponse = (spanAttributes) => {\n const metricAttributes = {};\n metricAttributes[semconv_1.ATTR_HTTP_STATUS_CODE] =\n spanAttributes[semconv_1.ATTR_HTTP_STATUS_CODE];\n metricAttributes[semconv_1.ATTR_NET_HOST_PORT] = spanAttributes[semconv_1.ATTR_NET_HOST_PORT];\n if (spanAttributes[semantic_conventions_1.ATTR_HTTP_ROUTE] !== undefined) {\n metricAttributes[semantic_conventions_1.ATTR_HTTP_ROUTE] = spanAttributes[semantic_conventions_1.ATTR_HTTP_ROUTE];\n }\n return metricAttributes;\n};\nexports.getIncomingRequestMetricAttributesOnResponse = getIncomingRequestMetricAttributesOnResponse;\n/**\n * Returns incoming stable request Metric attributes scoped to the request data\n * @param {Attributes} spanAttributes the span attributes\n */\nconst getIncomingStableRequestMetricAttributesOnResponse = (spanAttributes) => {\n const metricAttributes = {};\n if (spanAttributes[semantic_conventions_1.ATTR_HTTP_ROUTE] !== undefined) {\n metricAttributes[semantic_conventions_1.ATTR_HTTP_ROUTE] = spanAttributes[semantic_conventions_1.ATTR_HTTP_ROUTE];\n }\n // required if and only if one was sent, same as span requirement\n if (spanAttributes[semantic_conventions_1.ATTR_HTTP_RESPONSE_STATUS_CODE]) {\n metricAttributes[semantic_conventions_1.ATTR_HTTP_RESPONSE_STATUS_CODE] =\n spanAttributes[semantic_conventions_1.ATTR_HTTP_RESPONSE_STATUS_CODE];\n }\n return metricAttributes;\n};\nexports.getIncomingStableRequestMetricAttributesOnResponse = getIncomingStableRequestMetricAttributesOnResponse;\nfunction headerCapture(type, headers, semconvStability) {\n const normalizedHeaders = new Map();\n for (let i = 0, len = headers.length; i < len; i++) {\n const capturedHeader = headers[i].toLowerCase();\n if (semconvStability & instrumentation_1.SemconvStability.STABLE) {\n normalizedHeaders.set(capturedHeader, capturedHeader);\n }\n else {\n // In old semconv, the header name converted hypen to underscore, e.g.:\n // `http.request.header.content_length`.\n normalizedHeaders.set(capturedHeader, capturedHeader.replaceAll('-', '_'));\n }\n }\n return (getHeader) => {\n const attributes = {};\n for (const capturedHeader of normalizedHeaders.keys()) {\n const value = getHeader(capturedHeader);\n if (value === undefined) {\n continue;\n }\n const normalizedHeader = normalizedHeaders.get(capturedHeader);\n const key = `http.${type}.header.${normalizedHeader}`;\n if (typeof value === 'string') {\n attributes[key] = [value];\n }\n else if (Array.isArray(value)) {\n attributes[key] = value;\n }\n else {\n attributes[key] = [value];\n }\n }\n return attributes;\n };\n}\nexports.headerCapture = headerCapture;\nconst KNOWN_METHODS = new Set([\n // methods from https://www.rfc-editor.org/rfc/rfc9110.html#name-methods\n 'GET',\n 'HEAD',\n 'POST',\n 'PUT',\n 'DELETE',\n 'CONNECT',\n 'OPTIONS',\n 'TRACE',\n // PATCH from https://www.rfc-editor.org/rfc/rfc5789.html\n 'PATCH',\n // QUERY from https://datatracker.ietf.org/doc/draft-ietf-httpbis-safe-method-w-body/\n 'QUERY',\n]);\nfunction normalizeMethod(method) {\n if (method == null) {\n return 'GET';\n }\n const upper = method.toUpperCase();\n if (KNOWN_METHODS.has(upper)) {\n return upper;\n }\n return '_OTHER';\n}\nfunction parseForwardedHeader(header) {\n try {\n return forwardedParse(header);\n }\n catch {\n return [];\n }\n}\n//# sourceMappingURL=utils.js.map//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKHJzYykvLi9ub2RlX21vZHVsZXMvLnBucG0vQG9wZW50ZWxlbWV0cnkraW5zdHJ1bWVudGF0aW9uLWh0dHBAMC4yMTQuMF9Ab3BlbnRlbGVtZXRyeSthcGlAMS45LjEvbm9kZV9tb2R1bGVzL0BvcGVudGVsZW1ldHJ5L2luc3RydW1lbnRhdGlvbi1odHRwL2J1aWxkL3NyYy91dGlscy5qcyIsIm1hcHBpbmdzIjoiQUFBYTtBQUNiLDhDQUE2QyxFQUFFLGFBQWEsRUFBQztBQUM3RCxxQkFBcUIsR0FBRywwREFBMEQsR0FBRyxvREFBb0QsR0FBRyw4Q0FBOEMsR0FBRywwQ0FBMEMsR0FBRyxvQ0FBb0MsR0FBRyw4QkFBOEIsR0FBRywwREFBMEQsR0FBRyxvREFBb0QsR0FBRyw4Q0FBOEMsR0FBRyxpQ0FBaUMsR0FBRywwQ0FBMEMsR0FBRyxvQ0FBb0MsR0FBRyw4QkFBOEIsR0FBRywwQkFBMEIsR0FBRyxzQkFBc0IsR0FBRyxvQkFBb0IsR0FBRyx5Q0FBeUMsR0FBRyx3Q0FBd0MsR0FBRyx3QkFBd0IsR0FBRyx3QkFBd0IsR0FBRywyQkFBMkIsR0FBRyxzQkFBc0I7QUFDOTNCLGNBQWMsbUJBQU8sQ0FBQyxrSUFBb0I7QUFDMUMsK0JBQStCLG1CQUFPLENBQUMsc0xBQXFDO0FBQzVFLGtCQUFrQixtQkFBTyxDQUFDLHdMQUFXO0FBQ3JDLGVBQWUsbUJBQU8sQ0FBQyw4SkFBcUI7QUFDNUMsMEJBQTBCLG1CQUFPLENBQUMsaU1BQWdDO0FBQ2xFLFlBQVksbUJBQU8sQ0FBQyxnQkFBSztBQUN6Qix5QkFBeUIsbUJBQU8sQ0FBQyxrTkFBd0I7QUFDekQseUJBQXlCLG1CQUFPLENBQUMsc01BQWtCO0FBQ25ELHlCQUF5QixtQkFBTyxDQUFDLHNNQUFrQjtBQUNuRDtBQUNBLHVCQUF1QixtQkFBTyxDQUFDLCtHQUFpQjtBQUNoRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxvQkFBb0IsS0FBSztBQUN6QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esc0JBQXNCLG1CQUFtQixFQUFFLGlCQUFpQjtBQUM1RDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsNENBQTRDLDhCQUE4QixHQUFHLDhCQUE4QjtBQUMzRyxjQUFjLFNBQVMsSUFBSSxTQUFTLEVBQUUsS0FBSyxFQUFFLEtBQUs7QUFDbEQ7QUFDQSxzQkFBc0I7QUFDdEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSwyQkFBMkI7QUFDM0I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx3QkFBd0I7QUFDeEI7QUFDQTtBQUNBLFdBQVcsTUFBTTtBQUNqQixXQUFXLE9BQU87QUFDbEIsV0FBVyxrQkFBa0I7QUFDN0I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxxQkFBcUIsMkNBQTJDO0FBQ2hFO0FBQ0E7QUFDQSx3QkFBd0I7QUFDeEI7QUFDQTtBQUNBLFlBQVksa0JBQWtCO0FBQzlCLFlBQVksYUFBYTtBQUN6QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx3Q0FBd0M7QUFDeEM7QUFDQTtBQUNBLFlBQVksa0JBQWtCO0FBQzlCLFlBQVksYUFBYTtBQUN6QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EseUNBQXlDO0FBQ3pDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esb0JBQW9CO0FBQ3BCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsWUFBWSw0RkFBNEY7QUFDeEc7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUJBQWlCLGVBQWUsRUFBRSxhQUFhO0FBQy9DO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSwwQkFBMEIsNkJBQTZCLEdBQUcsNkJBQTZCO0FBQ3ZGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG9CQUFvQixrQ0FBa0MsSUFBSSxtQkFBbUI7QUFDN0U7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxxQkFBcUIsdUJBQXVCLEVBQUUscUJBQXFCO0FBQ25FO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxvQ0FBb0MsaUJBQWlCLEdBQUcsaUJBQWlCO0FBQ3pFO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx3Q0FBd0MsOENBQThDO0FBQ3RGO0FBQ0E7QUFDQSxxQkFBcUIsdUJBQXVCLEVBQUUsbUJBQW1CO0FBQ2pFO0FBQ0Esb0JBQW9CLGtDQUFrQyxJQUFJLFNBQVM7QUFDbkU7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQSxzQkFBc0I7QUFDdEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDBCQUEwQjtBQUMxQjtBQUNBO0FBQ0EsaUJBQWlCO0FBQ2pCO0FBQ0EsK0RBQStELElBQUk7QUFDbkU7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBLDhCQUE4QjtBQUM5QjtBQUNBO0FBQ0EsV0FBVyxzQkFBc0I7QUFDakMsYUFBYSxvRUFBb0U7QUFDakYsV0FBVyxrQkFBa0I7QUFDN0I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaURBQWlEO0FBQ2pEO0FBQ0EsNEVBQTRFLGtCQUFrQjtBQUM5RjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsdURBQXVELFNBQVMsR0FBRyxLQUFLO0FBQ3hFO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esb0NBQW9DO0FBQ3BDO0FBQ0E7QUFDQSxXQUFXLFlBQVk7QUFDdkI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDBDQUEwQztBQUMxQztBQUNBO0FBQ0EsV0FBVyxRQUFRO0FBQ25CO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlDQUFpQztBQUNqQztBQUNBO0FBQ0EsV0FBVyxvQkFBb0I7QUFDL0I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsaUJBQWlCO0FBQzVCLFdBQVcsa0JBQWtCO0FBQzdCO0FBQ0E7QUFDQSxZQUFZLGlEQUFpRDtBQUM3RDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxnQkFBZ0IsNEJBQTRCO0FBQzVDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDhDQUE4QztBQUM5QztBQUNBO0FBQ0EsV0FBVyxZQUFZO0FBQ3ZCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG9EQUFvRDtBQUNwRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSwwREFBMEQ7QUFDMUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxxQkFBcUI7QUFDckI7QUFDQTtBQUNBLHFCQUFxQjtBQUNyQjtBQUNBLGlCQUFpQjtBQUNqQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHlCQUF5QjtBQUN6QjtBQUNBO0FBQ0EseUJBQXlCO0FBQ3pCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw4QkFBOEI7QUFDOUI7QUFDQTtBQUNBO0FBQ0E7QUFDQSxnQkFBZ0Isb0JBQW9CLG9CQUFvQixNQUFNO0FBQzlEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGtEQUFrRCxVQUFVLEtBQUsscUJBQXFCO0FBQ3RGO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZUFBZSxVQUFVO0FBQ3pCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQkFBaUI7QUFDakI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVyxpQkFBaUI7QUFDNUIsYUFBYSx1RUFBdUU7QUFDcEYsV0FBVyxrQkFBa0I7QUFDN0I7QUFDQTtBQUNBLFlBQVksMkZBQTJGO0FBQ3ZHLFlBQVksK0JBQStCO0FBQzNDLFlBQVksd0RBQXdEO0FBQ3BFO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxxREFBcUQsSUFBSTtBQUN6RDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esb0NBQW9DO0FBQ3BDO0FBQ0E7QUFDQSxXQUFXLFlBQVk7QUFDdkIsYUFBYSxxQkFBcUI7QUFDbEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSwwQ0FBMEM7QUFDMUM7QUFDQTtBQUNBLFdBQVcsb0JBQW9CLGlCQUFpQixHQUFHO0FBQ25EO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsWUFBWSxTQUFTO0FBQ3JCLFlBQVksNEJBQTRCO0FBQ3hDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGdCQUFnQixxREFBcUQ7QUFDckU7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw4Q0FBOEM7QUFDOUM7QUFDQTtBQUNBLFdBQVcsWUFBWTtBQUN2QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esb0RBQW9EO0FBQ3BEO0FBQ0E7QUFDQSxXQUFXLFlBQVk7QUFDdkI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSwwREFBMEQ7QUFDMUQ7QUFDQTtBQUNBLDBDQUEwQyxTQUFTO0FBQ25EO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGdDQUFnQyxLQUFLLFVBQVUsaUJBQWlCO0FBQ2hFO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EscUJBQXFCO0FBQ3JCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwic291cmNlcyI6WyIvVXNlcnMvbWFyY21pbnRlbC9Qcm9qZWN0cy9lLXRpYi5jb20vbm9kZV9tb2R1bGVzLy5wbnBtL0BvcGVudGVsZW1ldHJ5K2luc3RydW1lbnRhdGlvbi1odHRwQDAuMjE0LjBfQG9wZW50ZWxlbWV0cnkrYXBpQDEuOS4xL25vZGVfbW9kdWxlcy9Ab3BlbnRlbGVtZXRyeS9pbnN0cnVtZW50YXRpb24taHR0cC9idWlsZC9zcmMvdXRpbHMuanMiXSwic291cmNlc0NvbnRlbnQiOlsiXCJ1c2Ugc3RyaWN0XCI7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLmhlYWRlckNhcHR1cmUgPSBleHBvcnRzLmdldEluY29taW5nU3RhYmxlUmVxdWVzdE1ldHJpY0F0dHJpYnV0ZXNPblJlc3BvbnNlID0gZXhwb3J0cy5nZXRJbmNvbWluZ1JlcXVlc3RNZXRyaWNBdHRyaWJ1dGVzT25SZXNwb25zZSA9IGV4cG9ydHMuZ2V0SW5jb21pbmdSZXF1ZXN0QXR0cmlidXRlc09uUmVzcG9uc2UgPSBleHBvcnRzLmdldEluY29taW5nUmVxdWVzdE1ldHJpY0F0dHJpYnV0ZXMgPSBleHBvcnRzLmdldEluY29taW5nUmVxdWVzdEF0dHJpYnV0ZXMgPSBleHBvcnRzLmdldFJlbW90ZUNsaWVudEFkZHJlc3MgPSBleHBvcnRzLmdldE91dGdvaW5nU3RhYmxlUmVxdWVzdE1ldHJpY0F0dHJpYnV0ZXNPblJlc3BvbnNlID0gZXhwb3J0cy5nZXRPdXRnb2luZ1JlcXVlc3RNZXRyaWNBdHRyaWJ1dGVzT25SZXNwb25zZSA9IGV4cG9ydHMuZ2V0T3V0Z29pbmdSZXF1ZXN0QXR0cmlidXRlc09uUmVzcG9uc2UgPSBleHBvcnRzLnNldEF0dHJpYnV0ZXNGcm9tSHR0cEtpbmQgPSBleHBvcnRzLmdldE91dGdvaW5nUmVxdWVzdE1ldHJpY0F0dHJpYnV0ZXMgPSBleHBvcnRzLmdldE91dGdvaW5nUmVxdWVzdEF0dHJpYnV0ZXMgPSBleHBvcnRzLmV4dHJhY3RIb3N0bmFtZUFuZFBvcnQgPSBleHBvcnRzLmlzVmFsaWRPcHRpb25zVHlwZSA9IGV4cG9ydHMuZ2V0UmVxdWVzdEluZm8gPSBleHBvcnRzLmlzQ29tcHJlc3NlZCA9IGV4cG9ydHMuc2V0UmVzcG9uc2VDb250ZW50TGVuZ3RoQXR0cmlidXRlID0gZXhwb3J0cy5zZXRSZXF1ZXN0Q29udGVudExlbmd0aEF0dHJpYnV0ZSA9IGV4cG9ydHMuc2V0U3BhbldpdGhFcnJvciA9IGV4cG9ydHMuc2F0aXNmaWVzUGF0dGVybiA9IGV4cG9ydHMucGFyc2VSZXNwb25zZVN0YXR1cyA9IGV4cG9ydHMuZ2V0QWJzb2x1dGVVcmwgPSB2b2lkIDA7XG5jb25zdCBhcGlfMSA9IHJlcXVpcmUoXCJAb3BlbnRlbGVtZXRyeS9hcGlcIik7XG5jb25zdCBzZW1hbnRpY19jb252ZW50aW9uc18xID0gcmVxdWlyZShcIkBvcGVudGVsZW1ldHJ5L3NlbWFudGljLWNvbnZlbnRpb25zXCIpO1xuY29uc3Qgc2VtY29udl8xID0gcmVxdWlyZShcIi4vc2VtY29udlwiKTtcbmNvbnN0IGNvcmVfMSA9IHJlcXVpcmUoXCJAb3BlbnRlbGVtZXRyeS9jb3JlXCIpO1xuY29uc3QgaW5zdHJ1bWVudGF0aW9uXzEgPSByZXF1aXJlKFwiQG9wZW50ZWxlbWV0cnkvaW5zdHJ1bWVudGF0aW9uXCIpO1xuY29uc3QgdXJsID0gcmVxdWlyZShcInVybFwiKTtcbmNvbnN0IEF0dHJpYnV0ZU5hbWVzXzEgPSByZXF1aXJlKFwiLi9lbnVtcy9BdHRyaWJ1dGVOYW1lc1wiKTtcbmNvbnN0IGludGVybmFsX3R5cGVzXzEgPSByZXF1aXJlKFwiLi9pbnRlcm5hbC10eXBlc1wiKTtcbmNvbnN0IGludGVybmFsX3R5cGVzXzIgPSByZXF1aXJlKFwiLi9pbnRlcm5hbC10eXBlc1wiKTtcbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tcmVxdWlyZS1pbXBvcnRzXG5jb25zdCBmb3J3YXJkZWRQYXJzZSA9IHJlcXVpcmUoXCJmb3J3YXJkZWQtcGFyc2VcIik7XG4vKipcbiAqIEdldCBhbiBhYnNvbHV0ZSB1cmxcbiAqL1xuY29uc3QgZ2V0QWJzb2x1dGVVcmwgPSAocmVxdWVzdFVybCwgaGVhZGVycywgZmFsbGJhY2tQcm90b2NvbCA9ICdodHRwOicsIHJlZGFjdGVkUXVlcnlQYXJhbXMgPSBBcnJheS5mcm9tKGludGVybmFsX3R5cGVzXzIuREVGQVVMVF9RVUVSWV9TVFJJTkdTX1RPX1JFREFDVCkpID0+IHtcbiAgICBjb25zdCByZXFVcmxPYmplY3QgPSByZXF1ZXN0VXJsIHx8IHt9O1xuICAgIGNvbnN0IHByb3RvY29sID0gcmVxVXJsT2JqZWN0LnByb3RvY29sIHx8IGZhbGxiYWNrUHJvdG9jb2w7XG4gICAgY29uc3QgcG9ydCA9IChyZXFVcmxPYmplY3QucG9ydCB8fCAnJykudG9TdHJpbmcoKTtcbiAgICBsZXQgcGF0aCA9IHJlcVVybE9iamVjdC5wYXRoIHx8ICcvJztcbiAgICBsZXQgaG9zdCA9IHJlcVVybE9iamVjdC5ob3N0IHx8IHJlcVVybE9iamVjdC5ob3N0bmFtZSB8fCBoZWFkZXJzLmhvc3QgfHwgJ2xvY2FsaG9zdCc7XG4gICAgLy8gaWYgdGhlcmUgaXMgbm8gcG9ydCBpbiBob3N0IGFuZCB0aGVyZSBpcyBhIHBvcnRcbiAgICAvLyBpdCBzaG91bGQgYmUgZGlzcGxheWVkIGlmIGl0J3Mgbm90IDgwIGFuZCA0NDMgKGRlZmF1bHQgcG9ydHMpXG4gICAgaWYgKGhvc3QuaW5kZXhPZignOicpID09PSAtMSAmJlxuICAgICAgICBwb3J0ICYmXG4gICAgICAgIHBvcnQgIT09ICc4MCcgJiZcbiAgICAgICAgcG9ydCAhPT0gJzQ0MycpIHtcbiAgICAgICAgaG9zdCArPSBgOiR7cG9ydH1gO1xuICAgIH1cbiAgICAvLyBSZWRhY3Qgc2Vuc2l0aXZlIHF1ZXJ5IHBhcmFtZXRlcnNcbiAgICBpZiAocGF0aC5pbmNsdWRlcygnPycpKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBjb25zdCBwYXJzZWRVcmwgPSBuZXcgVVJMKHBhdGgsICdodHRwOi8vbG9jYWxob3N0Jyk7XG4gICAgICAgICAgICBjb25zdCBzZW5zaXRpdmVQYXJhbXNUb1JlZGFjdCA9IHJlZGFjdGVkUXVlcnlQYXJhbXMgfHwgW107XG4gICAgICAgICAgICBmb3IgKGNvbnN0IHNlbnNpdGl2ZVBhcmFtIG9mIHNlbnNpdGl2ZVBhcmFtc1RvUmVkYWN0KSB7XG4gICAgICAgICAgICAgICAgaWYgKHBhcnNlZFVybC5zZWFyY2hQYXJhbXMuZ2V0KHNlbnNpdGl2ZVBhcmFtKSkge1xuICAgICAgICAgICAgICAgICAgICBwYXJzZWRVcmwuc2VhcmNoUGFyYW1zLnNldChzZW5zaXRpdmVQYXJhbSwgaW50ZXJuYWxfdHlwZXNfMi5TVFJfUkVEQUNURUQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHBhdGggPSBgJHtwYXJzZWRVcmwucGF0aG5hbWV9JHtwYXJzZWRVcmwuc2VhcmNofWA7XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2gge1xuICAgICAgICAgICAgLy8gSWdub3JlIGVycm9yLCBhcyB0aGUgcGF0aCB3YXMgbm90IGEgdmFsaWQgVVJMLlxuICAgICAgICB9XG4gICAgfVxuICAgIGNvbnN0IGF1dGhQYXJ0ID0gcmVxVXJsT2JqZWN0LmF1dGggPyBgJHtpbnRlcm5hbF90eXBlc18yLlNUUl9SRURBQ1RFRH06JHtpbnRlcm5hbF90eXBlc18yLlNUUl9SRURBQ1RFRH1AYCA6ICcnO1xuICAgIHJldHVybiBgJHtwcm90b2NvbH0vLyR7YXV0aFBhcnR9JHtob3N0fSR7cGF0aH1gO1xufTtcbmV4cG9ydHMuZ2V0QWJzb2x1dGVVcmwgPSBnZXRBYnNvbHV0ZVVybDtcbi8qKlxuICogUGFyc2Ugc3RhdHVzIGNvZGUgZnJvbSBIVFRQIHJlc3BvbnNlLiBbTW9yZSBkZXRhaWxzXShodHRwczovL2dpdGh1Yi5jb20vb3Blbi10ZWxlbWV0cnkvb3BlbnRlbGVtZXRyeS1zcGVjaWZpY2F0aW9uL2Jsb2IvbWFzdGVyL3NwZWNpZmljYXRpb24vZGF0YS1odHRwLm1kI3N0YXR1cylcbiAqL1xuY29uc3QgcGFyc2VSZXNwb25zZVN0YXR1cyA9IChraW5kLCBzdGF0dXNDb2RlKSA9PiB7XG4gICAgY29uc3QgdXBwZXJCb3VuZCA9IGtpbmQgPT09IGFwaV8xLlNwYW5LaW5kLkNMSUVOVCA/IDQwMCA6IDUwMDtcbiAgICAvLyAxeHgsIDJ4eCwgM3h4IGFyZSBPSyBvbiBjbGllbnQgYW5kIHNlcnZlclxuICAgIC8vIDR4eCBpcyBPSyBvbiBzZXJ2ZXJcbiAgICBpZiAoc3RhdHVzQ29kZSAmJiBzdGF0dXNDb2RlID49IDEwMCAmJiBzdGF0dXNDb2RlIDwgdXBwZXJCb3VuZCkge1xuICAgICAgICByZXR1cm4gYXBpXzEuU3BhblN0YXR1c0NvZGUuVU5TRVQ7XG4gICAgfVxuICAgIC8vIEFsbCBvdGhlciBjb2RlcyBhcmUgZXJyb3JcbiAgICByZXR1cm4gYXBpXzEuU3BhblN0YXR1c0NvZGUuRVJST1I7XG59O1xuZXhwb3J0cy5wYXJzZVJlc3BvbnNlU3RhdHVzID0gcGFyc2VSZXNwb25zZVN0YXR1cztcbi8qKlxuICogQ2hlY2sgd2hldGhlciB0aGUgZ2l2ZW4gb2JqIG1hdGNoIHBhdHRlcm5cbiAqIEBwYXJhbSBjb25zdGFudCBlLmcgVVJMIG9mIHJlcXVlc3RcbiAqIEBwYXJhbSBwYXR0ZXJuIE1hdGNoIHBhdHRlcm5cbiAqL1xuY29uc3Qgc2F0aXNmaWVzUGF0dGVybiA9IChjb25zdGFudCwgcGF0dGVybikgPT4ge1xuICAgIGlmICh0eXBlb2YgcGF0dGVybiA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgcmV0dXJuIHBhdHRlcm4gPT09IGNvbnN0YW50O1xuICAgIH1cbiAgICBlbHNlIGlmIChwYXR0ZXJuIGluc3RhbmNlb2YgUmVnRXhwKSB7XG4gICAgICAgIHJldHVybiBwYXR0ZXJuLnRlc3QoY29uc3RhbnQpO1xuICAgIH1cbiAgICBlbHNlIGlmICh0eXBlb2YgcGF0dGVybiA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICByZXR1cm4gcGF0dGVybihjb25zdGFudCk7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdQYXR0ZXJuIGlzIGluIHVuc3VwcG9ydGVkIGRhdGF0eXBlJyk7XG4gICAgfVxufTtcbmV4cG9ydHMuc2F0aXNmaWVzUGF0dGVybiA9IHNhdGlzZmllc1BhdHRlcm47XG4vKipcbiAqIFNldHMgdGhlIHNwYW4gd2l0aCB0aGUgZXJyb3IgcGFzc2VkIGluIHBhcmFtc1xuICogQHBhcmFtIHtTcGFufSBzcGFuIHRoZSBzcGFuIHRoYXQgbmVlZCB0byBiZSBzZXRcbiAqIEBwYXJhbSB7RXJyb3J9IGVycm9yIGVycm9yIHRoYXQgd2lsbCBiZSBzZXQgdG8gc3BhblxuICogQHBhcmFtIHtTZW1jb252U3RhYmlsaXR5fSBzZW1jb252U3RhYmlsaXR5IGRldGVybWluZXMgd2hpY2ggc2VtY29udiB2ZXJzaW9uIHRvIHVzZVxuICovXG5jb25zdCBzZXRTcGFuV2l0aEVycm9yID0gKHNwYW4sIGVycm9yLCBzZW1jb252U3RhYmlsaXR5KSA9PiB7XG4gICAgY29uc3QgbWVzc2FnZSA9IGVycm9yLm1lc3NhZ2U7XG4gICAgaWYgKHNlbWNvbnZTdGFiaWxpdHkgJiBpbnN0cnVtZW50YXRpb25fMS5TZW1jb252U3RhYmlsaXR5Lk9MRCkge1xuICAgICAgICBzcGFuLnNldEF0dHJpYnV0ZShBdHRyaWJ1dGVOYW1lc18xLkF0dHJpYnV0ZU5hbWVzLkhUVFBfRVJST1JfTkFNRSwgZXJyb3IubmFtZSk7XG4gICAgICAgIHNwYW4uc2V0QXR0cmlidXRlKEF0dHJpYnV0ZU5hbWVzXzEuQXR0cmlidXRlTmFtZXMuSFRUUF9FUlJPUl9NRVNTQUdFLCBtZXNzYWdlKTtcbiAgICB9XG4gICAgaWYgKHNlbWNvbnZTdGFiaWxpdHkgJiBpbnN0cnVtZW50YXRpb25fMS5TZW1jb252U3RhYmlsaXR5LlNUQUJMRSkge1xuICAgICAgICBzcGFuLnNldEF0dHJpYnV0ZShzZW1hbnRpY19jb252ZW50aW9uc18xLkFUVFJfRVJST1JfVFlQRSwgZXJyb3IubmFtZSk7XG4gICAgfVxuICAgIHNwYW4uc2V0U3RhdHVzKHsgY29kZTogYXBpXzEuU3BhblN0YXR1c0NvZGUuRVJST1IsIG1lc3NhZ2UgfSk7XG4gICAgc3Bhbi5yZWNvcmRFeGNlcHRpb24oZXJyb3IpO1xufTtcbmV4cG9ydHMuc2V0U3BhbldpdGhFcnJvciA9IHNldFNwYW5XaXRoRXJyb3I7XG4vKipcbiAqIEFkZHMgYXR0cmlidXRlcyBmb3IgcmVxdWVzdCBjb250ZW50LWxlbmd0aCBhbmQgY29udGVudC1lbmNvZGluZyBIVFRQIGhlYWRlcnNcbiAqIEBwYXJhbSB7IEluY29taW5nTWVzc2FnZSB9IFJlcXVlc3Qgb2JqZWN0IHdob3NlIGhlYWRlcnMgd2lsbCBiZSBhbmFseXplZFxuICogQHBhcmFtIHsgQXR0cmlidXRlcyB9IEF0dHJpYnV0ZXMgb2JqZWN0IHRvIGJlIG1vZGlmaWVkXG4gKi9cbmNvbnN0IHNldFJlcXVlc3RDb250ZW50TGVuZ3RoQXR0cmlidXRlID0gKHJlcXVlc3QsIGF0dHJpYnV0ZXMpID0+IHtcbiAgICBjb25zdCBsZW5ndGggPSBnZXRDb250ZW50TGVuZ3RoKHJlcXVlc3QuaGVhZGVycyk7XG4gICAgaWYgKGxlbmd0aCA9PT0gbnVsbClcbiAgICAgICAgcmV0dXJuO1xuICAgIGlmICgoMCwgZXhwb3J0cy5pc0NvbXByZXNzZWQpKHJlcXVlc3QuaGVhZGVycykpIHtcbiAgICAgICAgYXR0cmlidXRlc1tzZW1jb252XzEuQVRUUl9IVFRQX1JFUVVFU1RfQ09OVEVOVF9MRU5HVEhdID0gbGVuZ3RoO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgYXR0cmlidXRlc1tzZW1jb252XzEuQVRUUl9IVFRQX1JFUVVFU1RfQ09OVEVOVF9MRU5HVEhfVU5DT01QUkVTU0VEXSA9IGxlbmd0aDtcbiAgICB9XG59O1xuZXhwb3J0cy5zZXRSZXF1ZXN0Q29udGVudExlbmd0aEF0dHJpYnV0ZSA9IHNldFJlcXVlc3RDb250ZW50TGVuZ3RoQXR0cmlidXRlO1xuLyoqXG4gKiBBZGRzIGF0dHJpYnV0ZXMgZm9yIHJlc3BvbnNlIGNvbnRlbnQtbGVuZ3RoIGFuZCBjb250ZW50LWVuY29kaW5nIEhUVFAgaGVhZGVyc1xuICogQHBhcmFtIHsgSW5jb21pbmdNZXNzYWdlIH0gUmVzcG9uc2Ugb2JqZWN0IHdob3NlIGhlYWRlcnMgd2lsbCBiZSBhbmFseXplZFxuICogQHBhcmFtIHsgQXR0cmlidXRlcyB9IEF0dHJpYnV0ZXMgb2JqZWN0IHRvIGJlIG1vZGlmaWVkXG4gKlxuICogQGRlcHJlY2F0ZWQgdGhpcyBpcyBmb3IgYW4gb2xkZXIgdmVyc2lvbiBvZiBzZW1jb252LiBJdCBpcyByZXRhaW5lZCBmb3IgY29tcGF0aWJpbGl0eSB1c2luZyBPVEVMX1NFTUNPTlZfU1RBQklMSVRZX09QVF9JTlxuICovXG5jb25zdCBzZXRSZXNwb25zZUNvbnRlbnRMZW5ndGhBdHRyaWJ1dGUgPSAocmVzcG9uc2UsIGF0dHJpYnV0ZXMpID0+IHtcbiAgICBjb25zdCBsZW5ndGggPSBnZXRDb250ZW50TGVuZ3RoKHJlc3BvbnNlLmhlYWRlcnMpO1xuICAgIGlmIChsZW5ndGggPT09IG51bGwpXG4gICAgICAgIHJldHVybjtcbiAgICBpZiAoKDAsIGV4cG9ydHMuaXNDb21wcmVzc2VkKShyZXNwb25zZS5oZWFkZXJzKSkge1xuICAgICAgICBhdHRyaWJ1dGVzW3NlbWNvbnZfMS5BVFRSX0hUVFBfUkVTUE9OU0VfQ09OVEVOVF9MRU5HVEhdID0gbGVuZ3RoO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgYXR0cmlidXRlc1tzZW1jb252XzEuQVRUUl9IVFRQX1JFU1BPTlNFX0NPTlRFTlRfTEVOR1RIX1VOQ09NUFJFU1NFRF0gPSBsZW5ndGg7XG4gICAgfVxufTtcbmV4cG9ydHMuc2V0UmVzcG9uc2VDb250ZW50TGVuZ3RoQXR0cmlidXRlID0gc2V0UmVzcG9uc2VDb250ZW50TGVuZ3RoQXR0cmlidXRlO1xuZnVuY3Rpb24gZ2V0Q29udGVudExlbmd0aChoZWFkZXJzKSB7XG4gICAgY29uc3QgY29udGVudExlbmd0aEhlYWRlciA9IGhlYWRlcnNbJ2NvbnRlbnQtbGVuZ3RoJ107XG4gICAgaWYgKGNvbnRlbnRMZW5ndGhIZWFkZXIgPT09IHVuZGVmaW5lZClcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgY29uc3QgY29udGVudExlbmd0aCA9IHBhcnNlSW50KGNvbnRlbnRMZW5ndGhIZWFkZXIsIDEwKTtcbiAgICBpZiAoaXNOYU4oY29udGVudExlbmd0aCkpXG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIHJldHVybiBjb250ZW50TGVuZ3RoO1xufVxuY29uc3QgaXNDb21wcmVzc2VkID0gKGhlYWRlcnMpID0+IHtcbiAgICBjb25zdCBlbmNvZGluZyA9IGhlYWRlcnNbJ2NvbnRlbnQtZW5jb2RpbmcnXTtcbiAgICByZXR1cm4gISFlbmNvZGluZyAmJiBlbmNvZGluZyAhPT0gJ2lkZW50aXR5Jztcbn07XG5leHBvcnRzLmlzQ29tcHJlc3NlZCA9IGlzQ29tcHJlc3NlZDtcbi8qKlxuICogTWltaWNzIE5vZGUuanMgY29udmVyc2lvbiBvZiBVUkwgc3RyaW5ncyB0byBSZXF1ZXN0T3B0aW9ucyBleHBlY3RlZCBieVxuICogYGh0dHAucmVxdWVzdGAgYW5kIGBodHRwcy5yZXF1ZXN0YCBBUElzLlxuICpcbiAqIFNlZSBodHRwczovL2dpdGh1Yi5jb20vbm9kZWpzL25vZGUvYmxvYi8yNTA1ZTIxN2JiYTA1ZmM1ODFiNTcyYzY4NWM1Y2YyODBhMTZjNWEzL2xpYi9pbnRlcm5hbC91cmwuanMjTDE0MTUtTDE0MzdcbiAqXG4gKiBAcGFyYW0gc3RyaW5nVXJsXG4gKiBAdGhyb3dzIFR5cGVFcnJvciBpZiB0aGUgVVJMIGlzIG5vdCB2YWxpZC5cbiAqL1xuZnVuY3Rpb24gc3RyaW5nVXJsVG9IdHRwT3B0aW9ucyhzdHJpbmdVcmwpIHtcbiAgICAvLyBUaGlzIGlzIGhlYXZpbHkgaW5zcGlyZWQgYnkgTm9kZS5qcyBoYW5kbGluZyBvZiB0aGUgc2FtZSBzaXR1YXRpb24sIHRyeWluZ1xuICAgIC8vIHRvIGZvbGxvdyBpdCBhcyBjbG9zZWx5IGFzIHBvc3NpYmxlIHdoaWxlIGtlZXBpbmcgaW4gbWluZCB0aGF0IHdlIG9ubHlcbiAgICAvLyBkZWFsIHdpdGggc3RyaW5nIFVSTHMsIG5vdCBVUkwgb2JqZWN0cy5cbiAgICBjb25zdCB7IGhvc3RuYW1lLCBwYXRobmFtZSwgcG9ydCwgdXNlcm5hbWUsIHBhc3N3b3JkLCBzZWFyY2gsIHByb3RvY29sLCBoYXNoLCBocmVmLCBvcmlnaW4sIGhvc3QsIH0gPSBuZXcgVVJMKHN0cmluZ1VybCk7XG4gICAgY29uc3Qgb3B0aW9ucyA9IHtcbiAgICAgICAgcHJvdG9jb2w6IHByb3RvY29sLFxuICAgICAgICBob3N0bmFtZTogaG9zdG5hbWUgJiYgaG9zdG5hbWVbMF0gPT09ICdbJyA/IGhvc3RuYW1lLnNsaWNlKDEsIC0xKSA6IGhvc3RuYW1lLFxuICAgICAgICBoYXNoOiBoYXNoLFxuICAgICAgICBzZWFyY2g6IHNlYXJjaCxcbiAgICAgICAgcGF0aG5hbWU6IHBhdGhuYW1lLFxuICAgICAgICBwYXRoOiBgJHtwYXRobmFtZSB8fCAnJ30ke3NlYXJjaCB8fCAnJ31gLFxuICAgICAgICBocmVmOiBocmVmLFxuICAgICAgICBvcmlnaW46IG9yaWdpbixcbiAgICAgICAgaG9zdDogaG9zdCxcbiAgICB9O1xuICAgIGlmIChwb3J0ICE9PSAnJykge1xuICAgICAgICBvcHRpb25zLnBvcnQgPSBOdW1iZXIocG9ydCk7XG4gICAgfVxuICAgIGlmICh1c2VybmFtZSB8fCBwYXNzd29yZCkge1xuICAgICAgICBvcHRpb25zLmF1dGggPSBgJHtkZWNvZGVVUklDb21wb25lbnQodXNlcm5hbWUpfToke2RlY29kZVVSSUNvbXBvbmVudChwYXNzd29yZCl9YDtcbiAgICB9XG4gICAgcmV0dXJuIG9wdGlvbnM7XG59XG4vKipcbiAqIE1ha2VzIHN1cmUgb3B0aW9ucyBpcyBhbiB1cmwgb2JqZWN0XG4gKiByZXR1cm4gYW4gb2JqZWN0IHdpdGggZGVmYXVsdCB2YWx1ZSBhbmQgcGFyc2VkIG9wdGlvbnNcbiAqIEBwYXJhbSBsb2dnZXIgY29tcG9uZW50IGxvZ2dlclxuICogQHBhcmFtIG9wdGlvbnMgb3JpZ2luYWwgb3B0aW9ucyBmb3IgdGhlIHJlcXVlc3RcbiAqIEBwYXJhbSBbZXh0cmFPcHRpb25zXSBhZGRpdGlvbmFsIG9wdGlvbnMgZm9yIHRoZSByZXF1ZXN0XG4gKi9cbmNvbnN0IGdldFJlcXVlc3RJbmZvID0gKGxvZ2dlciwgb3B0aW9ucywgZXh0cmFPcHRpb25zKSA9PiB7XG4gICAgbGV0IHBhdGhuYW1lO1xuICAgIGxldCBvcmlnaW47XG4gICAgbGV0IG9wdGlvbnNQYXJzZWQ7XG4gICAgbGV0IGludmFsaWRVcmwgPSBmYWxzZTtcbiAgICBpZiAodHlwZW9mIG9wdGlvbnMgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBjb25zdCBjb252ZXJ0ZWRPcHRpb25zID0gc3RyaW5nVXJsVG9IdHRwT3B0aW9ucyhvcHRpb25zKTtcbiAgICAgICAgICAgIG9wdGlvbnNQYXJzZWQgPSBjb252ZXJ0ZWRPcHRpb25zO1xuICAgICAgICAgICAgcGF0aG5hbWUgPSBjb252ZXJ0ZWRPcHRpb25zLnBhdGhuYW1lIHx8ICcvJztcbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZSkge1xuICAgICAgICAgICAgaW52YWxpZFVybCA9IHRydWU7XG4gICAgICAgICAgICBsb2dnZXIudmVyYm9zZSgnVW5hYmxlIHRvIHBhcnNlIFVSTCBwcm92aWRlZCB0byBIVFRQIHJlcXVlc3QsIHVzaW5nIGZhbGxiYWNrIHRvIGRldGVybWluZSBwYXRoLiBPcmlnaW5hbCBlcnJvcjonLCBlKTtcbiAgICAgICAgICAgIC8vIGZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5IHdpdGggaG93IHVybC5wYXJzZSgpIGJlaGF2ZWQuXG4gICAgICAgICAgICBvcHRpb25zUGFyc2VkID0ge1xuICAgICAgICAgICAgICAgIHBhdGg6IG9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgcGF0aG5hbWUgPSBvcHRpb25zUGFyc2VkLnBhdGggfHwgJy8nO1xuICAgICAgICB9XG4gICAgICAgIG9yaWdpbiA9IGAke29wdGlvbnNQYXJzZWQucHJvdG9jb2wgfHwgJ2h0dHA6J30vLyR7b3B0aW9uc1BhcnNlZC5ob3N0fWA7XG4gICAgICAgIGlmIChleHRyYU9wdGlvbnMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgT2JqZWN0LmFzc2lnbihvcHRpb25zUGFyc2VkLCBleHRyYU9wdGlvbnMpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGVsc2UgaWYgKG9wdGlvbnMgaW5zdGFuY2VvZiB1cmwuVVJMKSB7XG4gICAgICAgIG9wdGlvbnNQYXJzZWQgPSB7XG4gICAgICAgICAgICBwcm90b2NvbDogb3B0aW9ucy5wcm90b2NvbCxcbiAgICAgICAgICAgIGhvc3RuYW1lOiB0eXBlb2Ygb3B0aW9ucy5ob3N0bmFtZSA9PT0gJ3N0cmluZycgJiYgb3B0aW9ucy5ob3N0bmFtZS5zdGFydHNXaXRoKCdbJylcbiAgICAgICAgICAgICAgICA/IG9wdGlvbnMuaG9zdG5hbWUuc2xpY2UoMSwgLTEpXG4gICAgICAgICAgICAgICAgOiBvcHRpb25zLmhvc3RuYW1lLFxuICAgICAgICAgICAgcGF0aDogYCR7b3B0aW9ucy5wYXRobmFtZSB8fCAnJ30ke29wdGlvbnMuc2VhcmNoIHx8ICcnfWAsXG4gICAgICAgIH07XG4gICAgICAgIGlmIChvcHRpb25zLnBvcnQgIT09ICcnKSB7XG4gICAgICAgICAgICBvcHRpb25zUGFyc2VkLnBvcnQgPSBOdW1iZXIob3B0aW9ucy5wb3J0KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAob3B0aW9ucy51c2VybmFtZSB8fCBvcHRpb25zLnBhc3N3b3JkKSB7XG4gICAgICAgICAgICBvcHRpb25zUGFyc2VkLmF1dGggPSBgJHtvcHRpb25zLnVzZXJuYW1lfToke29wdGlvbnMucGFzc3dvcmR9YDtcbiAgICAgICAgfVxuICAgICAgICBwYXRobmFtZSA9IG9wdGlvbnMucGF0aG5hbWU7XG4gICAgICAgIG9yaWdpbiA9IG9wdGlvbnMub3JpZ2luO1xuICAgICAgICBpZiAoZXh0cmFPcHRpb25zICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIE9iamVjdC5hc3NpZ24ob3B0aW9uc1BhcnNlZCwgZXh0cmFPcHRpb25zKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgb3B0aW9uc1BhcnNlZCA9IE9iamVjdC5hc3NpZ24oeyBwcm90b2NvbDogb3B0aW9ucy5ob3N0ID8gJ2h0dHA6JyA6IHVuZGVmaW5lZCB9LCBvcHRpb25zKTtcbiAgICAgICAgY29uc3QgaG9zdG5hbWUgPSBvcHRpb25zUGFyc2VkLmhvc3QgfHxcbiAgICAgICAgICAgIChvcHRpb25zUGFyc2VkLnBvcnQgIT0gbnVsbFxuICAgICAgICAgICAgICAgID8gYCR7b3B0aW9uc1BhcnNlZC5ob3N0bmFtZX0ke29wdGlvbnNQYXJzZWQucG9ydH1gXG4gICAgICAgICAgICAgICAgOiBvcHRpb25zUGFyc2VkLmhvc3RuYW1lKTtcbiAgICAgICAgb3JpZ2luID0gYCR7b3B0aW9uc1BhcnNlZC5wcm90b2NvbCB8fCAnaHR0cDonfS8vJHtob3N0bmFtZX1gO1xuICAgICAgICBwYXRobmFtZSA9IG9wdGlvbnMucGF0aG5hbWU7XG4gICAgICAgIGlmICghcGF0aG5hbWUgJiYgb3B0aW9uc1BhcnNlZC5wYXRoKSB7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGNvbnN0IHBhcnNlZFVybCA9IG5ldyBVUkwob3B0aW9uc1BhcnNlZC5wYXRoLCBvcmlnaW4pO1xuICAgICAgICAgICAgICAgIHBhdGhuYW1lID0gcGFyc2VkVXJsLnBhdGhuYW1lIHx8ICcvJztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhdGNoIHtcbiAgICAgICAgICAgICAgICBwYXRobmFtZSA9ICcvJztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICAvLyBzb21lIHBhY2thZ2VzIHJldHVybiBtZXRob2QgaW4gbG93ZXJjYXNlLi5cbiAgICAvLyBlbnN1cmUgdXBwZXJDYXNlIGZvciBjb25zaXN0ZW5jeVxuICAgIGNvbnN0IG1ldGhvZCA9IG9wdGlvbnNQYXJzZWQubWV0aG9kXG4gICAgICAgID8gb3B0aW9uc1BhcnNlZC5tZXRob2QudG9VcHBlckNhc2UoKVxuICAgICAgICA6ICdHRVQnO1xuICAgIHJldHVybiB7IG9yaWdpbiwgcGF0aG5hbWUsIG1ldGhvZCwgb3B0aW9uc1BhcnNlZCwgaW52YWxpZFVybCB9O1xufTtcbmV4cG9ydHMuZ2V0UmVxdWVzdEluZm8gPSBnZXRSZXF1ZXN0SW5mbztcbi8qKlxuICogTWFrZXMgc3VyZSBvcHRpb25zIGlzIG9mIHR5cGUgc3RyaW5nIG9yIG9iamVjdFxuICogQHBhcmFtIG9wdGlvbnMgZm9yIHRoZSByZXF1ZXN0XG4gKi9cbmNvbnN0IGlzVmFsaWRPcHRpb25zVHlwZSA9IChvcHRpb25zKSA9PiB7XG4gICAgaWYgKCFvcHRpb25zKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgY29uc3QgdHlwZSA9IHR5cGVvZiBvcHRpb25zO1xuICAgIHJldHVybiB0eXBlID09PSAnc3RyaW5nJyB8fCAodHlwZSA9PT0gJ29iamVjdCcgJiYgIUFycmF5LmlzQXJyYXkob3B0aW9ucykpO1xufTtcbmV4cG9ydHMuaXNWYWxpZE9wdGlvbnNUeXBlID0gaXNWYWxpZE9wdGlvbnNUeXBlO1xuY29uc3QgZXh0cmFjdEhvc3RuYW1lQW5kUG9ydCA9IChyZXF1ZXN0T3B0aW9ucykgPT4ge1xuICAgIGlmIChyZXF1ZXN0T3B0aW9ucy5ob3N0bmFtZSAmJiByZXF1ZXN0T3B0aW9ucy5wb3J0KSB7XG4gICAgICAgIHJldHVybiB7IGhvc3RuYW1lOiByZXF1ZXN0T3B0aW9ucy5ob3N0bmFtZSwgcG9ydDogcmVxdWVzdE9wdGlvbnMucG9ydCB9O1xuICAgIH1cbiAgICBjb25zdCBtYXRjaGVzID0gcmVxdWVzdE9wdGlvbnMuaG9zdD8ubWF0Y2goL14oW146LyBdKykoOlxcZHsxLDV9KT8vKSB8fCBudWxsO1xuICAgIGNvbnN0IGhvc3RuYW1lID0gcmVxdWVzdE9wdGlvbnMuaG9zdG5hbWUgfHwgKG1hdGNoZXMgPT09IG51bGwgPyAnbG9jYWxob3N0JyA6IG1hdGNoZXNbMV0pO1xuICAgIGxldCBwb3J0ID0gcmVxdWVzdE9wdGlvbnMucG9ydDtcbiAgICBpZiAoIXBvcnQpIHtcbiAgICAgICAgaWYgKG1hdGNoZXMgJiYgbWF0Y2hlc1syXSkge1xuICAgICAgICAgICAgLy8gcmVtb3ZlIHRoZSBsZWFkaW5nIFwiOlwiLiBUaGUgZXh0cmFjdGVkIHBvcnQgd291bGQgYmUgc29tZXRoaW5nIGxpa2UgXCI6ODA4MFwiXG4gICAgICAgICAgICBwb3J0ID0gbWF0Y2hlc1syXS5zdWJzdHJpbmcoMSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBwb3J0ID0gcmVxdWVzdE9wdGlvbnMucHJvdG9jb2wgPT09ICdodHRwczonID8gJzQ0MycgOiAnODAnO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiB7IGhvc3RuYW1lLCBwb3J0IH07XG59O1xuZXhwb3J0cy5leHRyYWN0SG9zdG5hbWVBbmRQb3J0ID0gZXh0cmFjdEhvc3RuYW1lQW5kUG9ydDtcbi8qKlxuICogUmV0dXJucyBvdXRnb2luZyByZXF1ZXN0IGF0dHJpYnV0ZXMgc2NvcGVkIHRvIHRoZSBvcHRpb25zIHBhc3NlZCB0byB0aGUgcmVxdWVzdFxuICogQHBhcmFtIHtQYXJzZWRSZXF1ZXN0T3B0aW9uc30gcmVxdWVzdE9wdGlvbnMgdGhlIHNhbWUgb3B0aW9ucyB1c2VkIHRvIG1ha2UgdGhlIHJlcXVlc3RcbiAqIEBwYXJhbSB7eyBjb21wb25lbnQ6IHN0cmluZywgaG9zdG5hbWU6IHN0cmluZywgaG9va0F0dHJpYnV0ZXM/OiBBdHRyaWJ1dGVzIH19IG9wdGlvbnMgdXNlZCB0byBwYXNzIGRhdGEgbmVlZGVkIHRvIGNyZWF0ZSBhdHRyaWJ1dGVzXG4gKiBAcGFyYW0ge1NlbWNvbnZTdGFiaWxpdHl9IHNlbWNvbnZTdGFiaWxpdHkgZGV0ZXJtaW5lcyB3aGljaCBzZW1jb252IHZlcnNpb24gdG8gdXNlXG4gKi9cbmNvbnN0IGdldE91dGdvaW5nUmVxdWVzdEF0dHJpYnV0ZXMgPSAocmVxdWVzdE9wdGlvbnMsIG9wdGlvbnMsIHNlbWNvbnZTdGFiaWxpdHksIGVuYWJsZVN5bnRoZXRpY1NvdXJjZURldGVjdGlvbikgPT4ge1xuICAgIGNvbnN0IGhvc3RuYW1lID0gb3B0aW9ucy5ob3N0bmFtZTtcbiAgICBjb25zdCBwb3J0ID0gb3B0aW9ucy5wb3J0O1xuICAgIGNvbnN0IG1ldGhvZCA9IHJlcXVlc3RPcHRpb25zLm1ldGhvZCA/PyAnR0VUJztcbiAgICBjb25zdCBub3JtYWxpemVkTWV0aG9kID0gbm9ybWFsaXplTWV0aG9kKG1ldGhvZCk7XG4gICAgY29uc3QgaGVhZGVycyA9IChyZXF1ZXN0T3B0aW9ucy5oZWFkZXJzIHx8IHt9KTtcbiAgICBjb25zdCB1c2VyQWdlbnQgPSBoZWFkZXJzWyd1c2VyLWFnZW50J107XG4gICAgY29uc3QgdXJsRnVsbCA9ICgwLCBleHBvcnRzLmdldEFic29sdXRlVXJsKShyZXF1ZXN0T3B0aW9ucywgaGVhZGVycywgYCR7b3B0aW9ucy5jb21wb25lbnR9OmAsIG9wdGlvbnMucmVkYWN0ZWRRdWVyeVBhcmFtcyk7XG4gICAgY29uc3Qgb2xkQXR0cmlidXRlcyA9IHtcbiAgICAgICAgW3NlbWNvbnZfMS5BVFRSX0hUVFBfVVJMXTogdXJsRnVsbCxcbiAgICAgICAgW3NlbWNvbnZfMS5BVFRSX0hUVFBfTUVUSE9EXTogbWV0aG9kLFxuICAgICAgICBbc2VtY29udl8xLkFUVFJfSFRUUF9UQVJHRVRdOiByZXF1ZXN0T3B0aW9ucy5wYXRoIHx8ICcvJyxcbiAgICAgICAgW3NlbWNvbnZfMS5BVFRSX05FVF9QRUVSX05BTUVdOiBob3N0bmFtZSxcbiAgICAgICAgW3NlbWNvbnZfMS5BVFRSX0hUVFBfSE9TVF06IGhlYWRlcnMuaG9zdCA/PyBgJHtob3N0bmFtZX06JHtwb3J0fWAsXG4gICAgfTtcbiAgICBjb25zdCBuZXdBdHRyaWJ1dGVzID0ge1xuICAgICAgICAvLyBSZXF1aXJlZCBhdHRyaWJ1dGVzXG4gICAgICAgIFtzZW1hbnRpY19jb252ZW50aW9uc18xLkFUVFJfSFRUUF9SRVFVRVNUX01FVEhPRF06IG5vcm1hbGl6ZWRNZXRob2QsXG4gICAgICAgIFtzZW1hbnRpY19jb252ZW50aW9uc18xLkFUVFJfU0VSVkVSX0FERFJFU1NdOiBob3N0bmFtZSxcbiAgICAgICAgW3NlbWFudGljX2NvbnZlbnRpb25zXzEuQVRUUl9TRVJWRVJfUE9SVF06IE51bWJlcihwb3J0KSxcbiAgICAgICAgW3NlbWFudGljX2NvbnZlbnRpb25zXzEuQVRUUl9VUkxfRlVMTF06IHVybEZ1bGwsXG4gICAgICAgIFtzZW1hbnRpY19jb252ZW50aW9uc18xLkFUVFJfVVNFUl9BR0VOVF9PUklHSU5BTF06IHVzZXJBZ2VudCxcbiAgICAgICAgLy8gbGVhdmluZyBvdXQgcHJvdG9jb2wgdmVyc2lvbiwgaXQgaXMgbm90IHlldCBuZWdvdGlhdGVkXG4gICAgICAgIC8vIGxlYXZpbmcgb3V0IHByb3RvY29sIG5hbWUsIGl0IGlzIG9ubHkgcmVxdWlyZWQgd2hlbiBwcm90b2NvbCB2ZXJzaW9uIGlzIHNldFxuICAgICAgICAvLyByZXRyaWVzIGFuZCByZWRpcmVjdHMgbm90IHN1cHBvcnRlZFxuICAgICAgICAvLyBPcHQtaW4gYXR0cmlidXRlcyBsZWZ0IG9mZiBmb3Igbm93XG4gICAgfTtcbiAgICAvLyBjb25kaXRpb25hbGx5IHJlcXVpcmVkIGlmIHJlcXVlc3QgbWV0aG9kIHJlcXVpcmVkIGNhc2Ugbm9ybWFsaXphdGlvblxuICAgIGlmIChtZXRob2QgIT09IG5vcm1hbGl6ZWRNZXRob2QpIHtcbiAgICAgICAgbmV3QXR0cmlidXRlc1tzZW1hbnRpY19jb252ZW50aW9uc18xLkFUVFJfSFRUUF9SRVFVRVNUX01FVEhPRF9PUklHSU5BTF0gPSBtZXRob2Q7XG4gICAgfVxuICAgIGlmIChlbmFibGVTeW50aGV0aWNTb3VyY2VEZXRlY3Rpb24gJiYgdXNlckFnZW50KSB7XG4gICAgICAgIG5ld0F0dHJpYnV0ZXNbc2VtY29udl8xLkFUVFJfVVNFUl9BR0VOVF9TWU5USEVUSUNfVFlQRV0gPSBnZXRTeW50aGV0aWNUeXBlKHVzZXJBZ2VudCk7XG4gICAgfVxuICAgIGlmICh1c2VyQWdlbnQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBvbGRBdHRyaWJ1dGVzW3NlbWNvbnZfMS5BVFRSX0hUVFBfVVNFUl9BR0VOVF0gPSB1c2VyQWdlbnQ7XG4gICAgfVxuICAgIHN3aXRjaCAoc2VtY29udlN0YWJpbGl0eSkge1xuICAgICAgICBjYXNlIGluc3RydW1lbnRhdGlvbl8xLlNlbWNvbnZTdGFiaWxpdHkuU1RBQkxFOlxuICAgICAgICAgICAgcmV0dXJuIE9iamVjdC5hc3NpZ24obmV3QXR0cmlidXRlcywgb3B0aW9ucy5ob29rQXR0cmlidXRlcyk7XG4gICAgICAgIGNhc2UgaW5zdHJ1bWVudGF0aW9uXzEuU2VtY29udlN0YWJpbGl0eS5PTEQ6XG4gICAgICAgICAgICByZXR1cm4gT2JqZWN0LmFzc2lnbihvbGRBdHRyaWJ1dGVzLCBvcHRpb25zLmhvb2tBdHRyaWJ1dGVzKTtcbiAgICB9XG4gICAgcmV0dXJuIE9iamVjdC5hc3NpZ24ob2xkQXR0cmlidXRlcywgbmV3QXR0cmlidXRlcywgb3B0aW9ucy5ob29rQXR0cmlidXRlcyk7XG59O1xuZXhwb3J0cy5nZXRPdXRnb2luZ1JlcXVlc3RBdHRyaWJ1dGVzID0gZ2V0T3V0Z29pbmdSZXF1ZXN0QXR0cmlidXRlcztcbi8qKlxuICogUmV0dXJucyBvdXRnb2luZyByZXF1ZXN0IE1ldHJpYyBhdHRyaWJ1dGVzIHNjb3BlZCB0byB0aGUgcmVxdWVzdCBkYXRhXG4gKiBAcGFyYW0ge0F0dHJpYnV0ZXN9IHNwYW5BdHRyaWJ1dGVzIHRoZSBzcGFuIGF0dHJpYnV0ZXNcbiAqL1xuY29uc3QgZ2V0T3V0Z29pbmdSZXF1ZXN0TWV0cmljQXR0cmlidXRlcyA9IChzcGFuQXR0cmlidXRlcykgPT4ge1xuICAgIGNvbnN0IG1ldHJpY0F0dHJpYnV0ZXMgPSB7fTtcbiAgICBtZXRyaWNBdHRyaWJ1dGVzW3NlbWNvbnZfMS5BVFRSX0hUVFBfTUVUSE9EXSA9IHNwYW5BdHRyaWJ1dGVzW3NlbWNvbnZfMS5BVFRSX0hUVFBfTUVUSE9EXTtcbiAgICBtZXRyaWNBdHRyaWJ1dGVzW3NlbWNvbnZfMS5BVFRSX05FVF9QRUVSX05BTUVdID0gc3BhbkF0dHJpYnV0ZXNbc2VtY29udl8xLkFUVFJfTkVUX1BFRVJfTkFNRV07XG4gICAgLy9UT0RPOiBodHRwLnVybCBhdHRyaWJ1dGUsIGl0IHNob3VsZCBzdWJzdGl0dXRlIGFueSBwYXJhbWV0ZXJzIHRvIGF2b2lkIGhpZ2ggY2FyZGluYWxpdHkuXG4gICAgcmV0dXJuIG1ldHJpY0F0dHJpYnV0ZXM7XG59O1xuZXhwb3J0cy5nZXRPdXRnb2luZ1JlcXVlc3RNZXRyaWNBdHRyaWJ1dGVzID0gZ2V0T3V0Z29pbmdSZXF1ZXN0TWV0cmljQXR0cmlidXRlcztcbi8qKlxuICogUmV0dXJucyBhdHRyaWJ1dGVzIHJlbGF0ZWQgdG8gdGhlIGtpbmQgb2YgSFRUUCBwcm90b2NvbCB1c2VkXG4gKiBAcGFyYW0ge3N0cmluZ30gW2tpbmRdIEtpbmQgb2YgSFRUUCBwcm90b2NvbCB1c2VkOiBcIjEuMFwiLCBcIjEuMVwiLCBcIjJcIiwgXCJTUERZXCIgb3IgXCJRVUlDXCIuXG4gKi9cbmNvbnN0IHNldEF0dHJpYnV0ZXNGcm9tSHR0cEtpbmQgPSAoa2luZCwgYXR0cmlidXRlcykgPT4ge1xuICAgIGlmIChraW5kKSB7XG4gICAgICAgIGF0dHJpYnV0ZXNbc2VtY29udl8xLkFUVFJfSFRUUF9GTEFWT1JdID0ga2luZDtcbiAgICAgICAgaWYgKGtpbmQudG9VcHBlckNhc2UoKSAhPT0gJ1FVSUMnKSB7XG4gICAgICAgICAgICBhdHRyaWJ1dGVzW3NlbWNvbnZfMS5BVFRSX05FVF9UUkFOU1BPUlRdID0gc2VtY29udl8xLk5FVF9UUkFOU1BPUlRfVkFMVUVfSVBfVENQO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgYXR0cmlidXRlc1tzZW1jb252XzEuQVRUUl9ORVRfVFJBTlNQT1JUXSA9IHNlbWNvbnZfMS5ORVRfVFJBTlNQT1JUX1ZBTFVFX0lQX1VEUDtcbiAgICAgICAgfVxuICAgIH1cbn07XG5leHBvcnRzLnNldEF0dHJpYnV0ZXNGcm9tSHR0cEtpbmQgPSBzZXRBdHRyaWJ1dGVzRnJvbUh0dHBLaW5kO1xuLyoqXG4gKiBSZXR1cm5zIHRoZSB0eXBlIG9mIHN5bnRoZXRpYyBzb3VyY2UgYmFzZWQgb24gdGhlIHVzZXIgYWdlbnRcbiAqIEBwYXJhbSB7T3V0Z29pbmdIdHRwSGVhZGVyfSB1c2VyQWdlbnQgdGhlIHVzZXIgYWdlbnQgc3RyaW5nXG4gKi9cbmNvbnN0IGdldFN5bnRoZXRpY1R5cGUgPSAodXNlckFnZW50KSA9PiB7XG4gICAgY29uc3QgdXNlckFnZW50U3RyaW5nID0gU3RyaW5nKHVzZXJBZ2VudCkudG9Mb3dlckNhc2UoKTtcbiAgICBmb3IgKGNvbnN0IG5hbWUgb2YgaW50ZXJuYWxfdHlwZXNfMS5TWU5USEVUSUNfVEVTVF9OQU1FUykge1xuICAgICAgICBpZiAodXNlckFnZW50U3RyaW5nLmluY2x1ZGVzKG5hbWUpKSB7XG4gICAgICAgICAgICByZXR1cm4gc2VtY29udl8xLlVTRVJfQUdFTlRfU1lOVEhFVElDX1RZUEVfVkFMVUVfVEVTVDtcbiAgICAgICAgfVxuICAgIH1cbiAgICBmb3IgKGNvbnN0IG5hbWUgb2YgaW50ZXJuYWxfdHlwZXNfMS5TWU5USEVUSUNfQk9UX05BTUVTKSB7XG4gICAgICAgIGlmICh1c2VyQWdlbnRTdHJpbmcuaW5jbHVkZXMobmFtZSkpIHtcbiAgICAgICAgICAgIHJldHVybiBzZW1jb252XzEuVVNFUl9BR0VOVF9TWU5USEVUSUNfVFlQRV9WQUxVRV9CT1Q7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuO1xufTtcbi8qKlxuICogUmV0dXJucyBvdXRnb2luZyByZXF1ZXN0IGF0dHJpYnV0ZXMgc2NvcGVkIHRvIHRoZSByZXNwb25zZSBkYXRhXG4gKiBAcGFyYW0ge0luY29taW5nTWVzc2FnZX0gcmVzcG9uc2UgdGhlIHJlc3BvbnNlIG9iamVjdFxuICogQHBhcmFtIHtTZW1jb252U3RhYmlsaXR5fSBzZW1jb252U3RhYmlsaXR5IGRldGVybWluZXMgd2hpY2ggc2VtY29udiB2ZXJzaW9uIHRvIHVzZVxuICovXG5jb25zdCBnZXRPdXRnb2luZ1JlcXVlc3RBdHRyaWJ1dGVzT25SZXNwb25zZSA9IChyZXNwb25zZSwgc2VtY29udlN0YWJpbGl0eSkgPT4ge1xuICAgIGNvbnN0IHsgc3RhdHVzQ29kZSwgc3RhdHVzTWVzc2FnZSwgaHR0cFZlcnNpb24sIHNvY2tldCB9ID0gcmVzcG9uc2U7XG4gICAgY29uc3Qgb2xkQXR0cmlidXRlcyA9IHt9O1xuICAgIGNvbnN0IHN0YWJsZUF0dHJpYnV0ZXMgPSB7fTtcbiAgICBpZiAoc3RhdHVzQ29kZSAhPSBudWxsKSB7XG4gICAgICAgIHN0YWJsZUF0dHJpYnV0ZXNbc2VtYW50aWNfY29udmVudGlvbnNfMS5BVFRSX0hUVFBfUkVTUE9OU0VfU1RBVFVTX0NPREVdID0gc3RhdHVzQ29kZTtcbiAgICB9XG4gICAgaWYgKHNvY2tldCkge1xuICAgICAgICBjb25zdCB7IHJlbW90ZUFkZHJlc3MsIHJlbW90ZVBvcnQgfSA9IHNvY2tldDtcbiAgICAgICAgb2xkQXR0cmlidXRlc1tzZW1jb252XzEuQVRUUl9ORVRfUEVFUl9JUF0gPSByZW1vdGVBZGRyZXNzO1xuICAgICAgICBvbGRBdHRyaWJ1dGVzW3NlbWNvbnZfMS5BVFRSX05FVF9QRUVSX1BPUlRdID0gcmVtb3RlUG9ydDtcbiAgICAgICAgLy8gUmVjb21tZW5kZWRcbiAgICAgICAgc3RhYmxlQXR0cmlidXRlc1tzZW1hbnRpY19jb252ZW50aW9uc18xLkFUVFJfTkVUV09SS19QRUVSX0FERFJFU1NdID0gcmVtb3RlQWRkcmVzcztcbiAgICAgICAgc3RhYmxlQXR0cmlidXRlc1tzZW1hbnRpY19jb252ZW50aW9uc18xLkFUVFJfTkVUV09SS19QRUVSX1BPUlRdID0gcmVtb3RlUG9ydDtcbiAgICAgICAgc3RhYmxlQXR0cmlidXRlc1tzZW1hbnRpY19jb252ZW50aW9uc18xLkFUVFJfTkVUV09SS19QUk9UT0NPTF9WRVJTSU9OXSA9IHJlc3BvbnNlLmh0dHBWZXJzaW9uO1xuICAgIH1cbiAgICAoMCwgZXhwb3J0cy5zZXRSZXNwb25zZUNvbnRlbnRMZW5ndGhBdHRyaWJ1dGUpKHJlc3BvbnNlLCBvbGRBdHRyaWJ1dGVzKTtcbiAgICBpZiAoc3RhdHVzQ29kZSkge1xuICAgICAgICBvbGRBdHRyaWJ1dGVzW3NlbWNvbnZfMS5BVFRSX0hUVFBfU1RBVFVTX0NPREVdID0gc3RhdHVzQ29kZTtcbiAgICAgICAgb2xkQXR0cmlidXRlc1tBdHRyaWJ1dGVOYW1lc18xLkF0dHJpYnV0ZU5hbWVzLkhUVFBfU1RBVFVTX1RFWFRdID0gKHN0YXR1c01lc3NhZ2UgfHwgJycpLnRvVXBwZXJDYXNlKCk7XG4gICAgfVxuICAgICgwLCBleHBvcnRzLnNldEF0dHJpYnV0ZXNGcm9tSHR0cEtpbmQpKGh0dHBWZXJzaW9uLCBvbGRBdHRyaWJ1dGVzKTtcbiAgICBzd2l0Y2ggKHNlbWNvbnZTdGFiaWxpdHkpIHtcbiAgICAgICAgY2FzZSBpbnN0cnVtZW50YXRpb25fMS5TZW1jb252U3RhYmlsaXR5LlNUQUJMRTpcbiAgICAgICAgICAgIHJldHVybiBzdGFibGVBdHRyaWJ1dGVzO1xuICAgICAgICBjYXNlIGluc3RydW1lbnRhdGlvbl8xLlNlbWNvbnZTdGFiaWxpdHkuT0xEOlxuICAgICAgICAgICAgcmV0dXJuIG9sZEF0dHJpYnV0ZXM7XG4gICAgfVxuICAgIHJldHVybiBPYmplY3QuYXNzaWduKG9sZEF0dHJpYnV0ZXMsIHN0YWJsZUF0dHJpYnV0ZXMpO1xufTtcbmV4cG9ydHMuZ2V0T3V0Z29pbmdSZXF1ZXN0QXR0cmlidXRlc09uUmVzcG9uc2UgPSBnZXRPdXRnb2luZ1JlcXVlc3RBdHRyaWJ1dGVzT25SZXNwb25zZTtcbi8qKlxuICogUmV0dXJucyBvdXRnb2luZyByZXF1ZXN0IE1ldHJpYyBhdHRyaWJ1dGVzIHNjb3BlZCB0byB0aGUgcmVzcG9uc2UgZGF0YVxuICogQHBhcmFtIHtBdHRyaWJ1dGVzfSBzcGFuQXR0cmlidXRlcyB0aGUgc3BhbiBhdHRyaWJ1dGVzXG4gKi9cbmNvbnN0IGdldE91dGdvaW5nUmVxdWVzdE1ldHJpY0F0dHJpYnV0ZXNPblJlc3BvbnNlID0gKHNwYW5BdHRyaWJ1dGVzKSA9PiB7XG4gICAgY29uc3QgbWV0cmljQXR0cmlidXRlcyA9IHt9O1xuICAgIG1ldHJpY0F0dHJpYnV0ZXNbc2VtY29udl8xLkFUVFJfTkVUX1BFRVJfUE9SVF0gPSBzcGFuQXR0cmlidXRlc1tzZW1jb252XzEuQVRUUl9ORVRfUEVFUl9QT1JUXTtcbiAgICBtZXRyaWNBdHRyaWJ1dGVzW3NlbWNvbnZfMS5BVFRSX0hUVFBfU1RBVFVTX0NPREVdID1cbiAgICAgICAgc3BhbkF0dHJpYnV0ZXNbc2VtY29udl8xLkFUVFJfSFRUUF9TVEFUVVNfQ09ERV07XG4gICAgbWV0cmljQXR0cmlidXRlc1tzZW1jb252XzEuQVRUUl9IVFRQX0ZMQVZPUl0gPSBzcGFuQXR0cmlidXRlc1tzZW1jb252XzEuQVRUUl9IVFRQX0ZMQVZPUl07XG4gICAgcmV0dXJuIG1ldHJpY0F0dHJpYnV0ZXM7XG59O1xuZXhwb3J0cy5nZXRPdXRnb2luZ1JlcXVlc3RNZXRyaWNBdHRyaWJ1dGVzT25SZXNwb25zZSA9IGdldE91dGdvaW5nUmVxdWVzdE1ldHJpY0F0dHJpYnV0ZXNPblJlc3BvbnNlO1xuY29uc3QgZ2V0T3V0Z29pbmdTdGFibGVSZXF1ZXN0TWV0cmljQXR0cmlidXRlc09uUmVzcG9uc2UgPSAoc3BhbkF0dHJpYnV0ZXMpID0+IHtcbiAgICBjb25zdCBtZXRyaWNBdHRyaWJ1dGVzID0ge307XG4gICAgaWYgKHNwYW5BdHRyaWJ1dGVzW3NlbWFudGljX2NvbnZlbnRpb25zXzEuQVRUUl9ORVRXT1JLX1BST1RPQ09MX1ZFUlNJT05dKSB7XG4gICAgICAgIG1ldHJpY0F0dHJpYnV0ZXNbc2VtYW50aWNfY29udmVudGlvbnNfMS5BVFRSX05FVFdPUktfUFJPVE9DT0xfVkVSU0lPTl0gPVxuICAgICAgICAgICAgc3BhbkF0dHJpYnV0ZXNbc2VtYW50aWNfY29udmVudGlvbnNfMS5BVFRSX05FVFdPUktfUFJPVE9DT0xfVkVSU0lPTl07XG4gICAgfVxuICAgIGlmIChzcGFuQXR0cmlidXRlc1tzZW1hbnRpY19jb252ZW50aW9uc18xLkFUVFJfSFRUUF9SRVNQT05TRV9TVEFUVVNfQ09ERV0pIHtcbiAgICAgICAgbWV0cmljQXR0cmlidXRlc1tzZW1hbnRpY19jb252ZW50aW9uc18xLkFUVFJfSFRUUF9SRVNQT05TRV9TVEFUVVNfQ09ERV0gPVxuICAgICAgICAgICAgc3BhbkF0dHJpYnV0ZXNbc2VtYW50aWNfY29udmVudGlvbnNfMS5BVFRSX0hUVFBfUkVTUE9OU0VfU1RBVFVTX0NPREVdO1xuICAgIH1cbiAgICByZXR1cm4gbWV0cmljQXR0cmlidXRlcztcbn07XG5leHBvcnRzLmdldE91dGdvaW5nU3RhYmxlUmVxdWVzdE1ldHJpY0F0dHJpYnV0ZXNPblJlc3BvbnNlID0gZ2V0T3V0Z29pbmdTdGFibGVSZXF1ZXN0TWV0cmljQXR0cmlidXRlc09uUmVzcG9uc2U7XG5mdW5jdGlvbiBwYXJzZUhvc3RIZWFkZXIoaG9zdEhlYWRlciwgcHJvdG8pIHtcbiAgICBjb25zdCBwYXJ0cyA9IGhvc3RIZWFkZXIuc3BsaXQoJzonKTtcbiAgICAvLyBubyBzZW1pY29sb24gaW1wbGllcyBpcHY0IGRvdHRlZCBzeW50YXggb3IgaG9zdCBuYW1lIHdpdGhvdXQgcG9ydFxuICAgIC8vIHgueC54LnhcbiAgICAvLyBleGFtcGxlLmNvbVxuICAgIGlmIChwYXJ0cy5sZW5ndGggPT09IDEpIHtcbiAgICAgICAgaWYgKHByb3RvID09PSAnaHR0cCcpIHtcbiAgICAgICAgICAgIHJldHVybiB7IGhvc3Q6IHBhcnRzWzBdLCBwb3J0OiAnODAnIH07XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHByb3RvID09PSAnaHR0cHMnKSB7XG4gICAgICAgICAgICByZXR1cm4geyBob3N0OiBwYXJ0c1swXSwgcG9ydDogJzQ0MycgfTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4geyBob3N0OiBwYXJ0c1swXSB9O1xuICAgIH1cbiAgICAvLyBzaW5nbGUgc2VtaWNvbG9uIGltcGxpZXMgaXB2NCBkb3R0ZWQgc3ludGF4IG9yIGhvc3QgbmFtZSB3aXRoIHBvcnRcbiAgICAvLyB4LngueC54Onl5eXlcbiAgICAvLyBleGFtcGxlLmNvbTp5eXl5XG4gICAgaWYgKHBhcnRzLmxlbmd0aCA9PT0gMikge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgaG9zdDogcGFydHNbMF0sXG4gICAgICAgICAgICBwb3J0OiBwYXJ0c1sxXSxcbiAgICAgICAgfTtcbiAgICB9XG4gICAgLy8gbW9yZSB0aGFuIDIgcGFydHMgaW1wbGllcyBpcHY2IHN5bnRheCB3aXRoIG11bHRpcGxlIGNvbG9uc1xuICAgIC8vIFt4Ong6eDp4Ong6eDp4OnhdXG4gICAgLy8gW3g6eDp4Ong6eDp4Ong6eF06eXl5eVxuICAgIGlmIChwYXJ0c1swXS5zdGFydHNXaXRoKCdbJykpIHtcbiAgICAgICAgaWYgKHBhcnRzW3BhcnRzLmxlbmd0aCAtIDFdLmVuZHNXaXRoKCddJykpIHtcbiAgICAgICAgICAgIGlmIChwcm90byA9PT0gJ2h0dHAnKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHsgaG9zdDogaG9zdEhlYWRlciwgcG9ydDogJzgwJyB9O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHByb3RvID09PSAnaHR0cHMnKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHsgaG9zdDogaG9zdEhlYWRlciwgcG9ydDogJzQ0MycgfTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChwYXJ0c1twYXJ0cy5sZW5ndGggLSAyXS5lbmRzV2l0aCgnXScpKSB7XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIGhvc3Q6IHBhcnRzLnNsaWNlKDAsIC0xKS5qb2luKCc6JyksXG4gICAgICAgICAgICAgICAgcG9ydDogcGFydHNbcGFydHMubGVuZ3RoIC0gMV0sXG4gICAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgfVxuICAgIC8vIGlmIG5vdGhpbmcgYWJvdmUgbWF0Y2hlcyBqdXN0IHJldHVybiB0aGUgaG9zdCBoZWFkZXJcbiAgICByZXR1cm4geyBob3N0OiBob3N0SGVhZGVyIH07XG59XG4vKipcbiAqIEdldCBzZXJ2ZXIuYWRkcmVzcyBhbmQgcG9ydCBhY2NvcmRpbmcgdG8gaHR0cCBzZW1jb252IDEuMjdcbiAqIGh0dHBzOi8vZ2l0aHViLmNvbS9vcGVuLXRlbGVtZXRyeS9zZW1hbnRpYy1jb252ZW50aW9ucy9ibG9iL2JmMGEyYzExMzRmMjA2ZjAzNDQwOGIyMDFkYmVjMzc5NjBlZDYwZWMvZG9jcy9odHRwL2h0dHAtc3BhbnMubWQjc2V0dGluZy1zZXJ2ZXJhZGRyZXNzLWFuZC1zZXJ2ZXJwb3J0LWF0dHJpYnV0ZXNcbiAqL1xuZnVuY3Rpb24gZ2V0U2VydmVyQWRkcmVzcyhyZXF1ZXN0LCBjb21wb25lbnQpIHtcbiAgICBjb25zdCBmb3J3YXJkZWRIZWFkZXIgPSByZXF1ZXN0LmhlYWRlcnNbJ2ZvcndhcmRlZCddO1xuICAgIGlmIChmb3J3YXJkZWRIZWFkZXIpIHtcbiAgICAgICAgZm9yIChjb25zdCBlbnRyeSBvZiBwYXJzZUZvcndhcmRlZEhlYWRlcihmb3J3YXJkZWRIZWFkZXIpKSB7XG4gICAgICAgICAgICBpZiAoZW50cnkuaG9zdCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBwYXJzZUhvc3RIZWFkZXIoZW50cnkuaG9zdCwgZW50cnkucHJvdG8pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIGNvbnN0IHhGb3J3YXJkZWRIb3N0ID0gcmVxdWVzdC5oZWFkZXJzWyd4LWZvcndhcmRlZC1ob3N0J107XG4gICAgaWYgKHR5cGVvZiB4Rm9yd2FyZGVkSG9zdCA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgaWYgKHR5cGVvZiByZXF1ZXN0LmhlYWRlcnNbJ3gtZm9yd2FyZGVkLXByb3RvJ10gPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICByZXR1cm4gcGFyc2VIb3N0SGVhZGVyKHhGb3J3YXJkZWRIb3N0LCByZXF1ZXN0LmhlYWRlcnNbJ3gtZm9yd2FyZGVkLXByb3RvJ10pO1xuICAgICAgICB9XG4gICAgICAgIGlmIChBcnJheS5pc0FycmF5KHJlcXVlc3QuaGVhZGVyc1sneC1mb3J3YXJkZWQtcHJvdG8nXSkpIHtcbiAgICAgICAgICAgIHJldHVybiBwYXJzZUhvc3RIZWFkZXIoeEZvcndhcmRlZEhvc3QsIHJlcXVlc3QuaGVhZGVyc1sneC1mb3J3YXJkZWQtcHJvdG8nXVswXSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHBhcnNlSG9zdEhlYWRlcih4Rm9yd2FyZGVkSG9zdCk7XG4gICAgfVxuICAgIGVsc2UgaWYgKEFycmF5LmlzQXJyYXkoeEZvcndhcmRlZEhvc3QpICYmXG4gICAgICAgIHR5cGVvZiB4Rm9yd2FyZGVkSG9zdFswXSA9PT0gJ3N0cmluZycgJiZcbiAgICAgICAgeEZvcndhcmRlZEhvc3RbMF0ubGVuZ3RoID4gMCkge1xuICAgICAgICBpZiAodHlwZW9mIHJlcXVlc3QuaGVhZGVyc1sneC1mb3J3YXJkZWQtcHJvdG8nXSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgIHJldHVybiBwYXJzZUhvc3RIZWFkZXIoeEZvcndhcmRlZEhvc3RbMF0sIHJlcXVlc3QuaGVhZGVyc1sneC1mb3J3YXJkZWQtcHJvdG8nXSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkocmVxdWVzdC5oZWFkZXJzWyd4LWZvcndhcmRlZC1wcm90byddKSkge1xuICAgICAgICAgICAgcmV0dXJuIHBhcnNlSG9zdEhlYWRlcih4Rm9yd2FyZGVkSG9zdFswXSwgcmVxdWVzdC5oZWFkZXJzWyd4LWZvcndhcmRlZC1wcm90byddWzBdKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcGFyc2VIb3N0SGVhZGVyKHhGb3J3YXJkZWRIb3N0WzBdKTtcbiAgICB9XG4gICAgY29uc3QgaG9zdCA9IHJlcXVlc3QuaGVhZGVyc1snaG9zdCddO1xuICAgIGlmICh0eXBlb2YgaG9zdCA9PT0gJ3N0cmluZycgJiYgaG9zdC5sZW5ndGggPiAwKSB7XG4gICAgICAgIHJldHVybiBwYXJzZUhvc3RIZWFkZXIoaG9zdCwgY29tcG9uZW50KTtcbiAgICB9XG4gICAgcmV0dXJuIG51bGw7XG59XG4vKipcbiAqIEdldCBzZXJ2ZXIuYWRkcmVzcyBhbmQgcG9ydCBhY2NvcmRpbmcgdG8gaHR0cCBzZW1jb252IDEuMjdcbiAqIGh0dHBzOi8vZ2l0aHViLmNvbS9vcGVuLXRlbGVtZXRyeS9zZW1hbnRpYy1jb252ZW50aW9ucy9ibG9iL2JmMGEyYzExMzRmMjA2ZjAzNDQwOGIyMDFkYmVjMzc5NjBlZDYwZWMvZG9jcy9odHRwL2h0dHAtc3BhbnMubWQjc2V0dGluZy1zZXJ2ZXJhZGRyZXNzLWFuZC1zZXJ2ZXJwb3J0LWF0dHJpYnV0ZXNcbiAqL1xuZnVuY3Rpb24gZ2V0UmVtb3RlQ2xpZW50QWRkcmVzcyhyZXF1ZXN0KSB7XG4gICAgY29uc3QgZm9yd2FyZGVkSGVhZGVyID0gcmVxdWVzdC5oZWFkZXJzWydmb3J3YXJkZWQnXTtcbiAgICBpZiAoZm9yd2FyZGVkSGVhZGVyKSB7XG4gICAgICAgIGZvciAoY29uc3QgZW50cnkgb2YgcGFyc2VGb3J3YXJkZWRIZWFkZXIoZm9yd2FyZGVkSGVhZGVyKSkge1xuICAgICAgICAgICAgaWYgKGVudHJ5LmZvcikge1xuICAgICAgICAgICAgICAgIHJldHVybiByZW1vdmVQb3J0RnJvbUFkZHJlc3MoZW50cnkuZm9yKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICBjb25zdCB4Rm9yd2FyZGVkRm9yID0gcmVxdWVzdC5oZWFkZXJzWyd4LWZvcndhcmRlZC1mb3InXTtcbiAgICBpZiAoeEZvcndhcmRlZEZvcikge1xuICAgICAgICBsZXQgeEZvcndhcmRlZEZvclZhbDtcbiAgICAgICAgaWYgKHR5cGVvZiB4Rm9yd2FyZGVkRm9yID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgeEZvcndhcmRlZEZvclZhbCA9IHhGb3J3YXJkZWRGb3I7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoQXJyYXkuaXNBcnJheSh4Rm9yd2FyZGVkRm9yKSkge1xuICAgICAgICAgICAgeEZvcndhcmRlZEZvclZhbCA9IHhGb3J3YXJkZWRGb3JbMF07XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHR5cGVvZiB4Rm9yd2FyZGVkRm9yVmFsID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgeEZvcndhcmRlZEZvclZhbCA9IHhGb3J3YXJkZWRGb3JWYWwuc3BsaXQoJywnKVswXS50cmltKCk7XG4gICAgICAgICAgICByZXR1cm4gcmVtb3ZlUG9ydEZyb21BZGRyZXNzKHhGb3J3YXJkZWRGb3JWYWwpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGNvbnN0IHJlbW90ZSA9IHJlcXVlc3Quc29ja2V0LnJlbW90ZUFkZHJlc3M7XG4gICAgaWYgKHJlbW90ZSkge1xuICAgICAgICByZXR1cm4gcmVtb3RlO1xuICAgIH1cbiAgICByZXR1cm4gbnVsbDtcbn1cbmV4cG9ydHMuZ2V0UmVtb3RlQ2xpZW50QWRkcmVzcyA9IGdldFJlbW90ZUNsaWVudEFkZHJlc3M7XG5mdW5jdGlvbiByZW1vdmVQb3J0RnJvbUFkZHJlc3MoaW5wdXQpIHtcbiAgICAvLyBUaGlzIGZ1bmN0aW9uIGNhbiBiZSByZXBsYWNlZCB3aXRoIFNvY2tldEFkZHJlc3MucGFyc2UoKSBvbmNlIHRoZSBtaW5pbXVtXG4gICAgLy8gc3VwcG9ydGVkIE5vZGUuanMgdmVyc2lvbiBhbGxvd3MgaXQuXG4gICAgdHJ5IHtcbiAgICAgICAgY29uc3QgeyBob3N0bmFtZTogYWRkcmVzcyB9ID0gbmV3IFVSTChgaHR0cDovLyR7aW5wdXR9YCk7XG4gICAgICAgIGlmIChhZGRyZXNzLnN0YXJ0c1dpdGgoJ1snKSAmJiBhZGRyZXNzLmVuZHNXaXRoKCddJykpIHtcbiAgICAgICAgICAgIHJldHVybiBhZGRyZXNzLnNsaWNlKDEsIC0xKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gYWRkcmVzcztcbiAgICB9XG4gICAgY2F0Y2gge1xuICAgICAgICByZXR1cm4gaW5wdXQ7XG4gICAgfVxufVxuZnVuY3Rpb24gZ2V0SW5mb0Zyb21JbmNvbWluZ01lc3NhZ2UoY29tcG9uZW50LCByZXF1ZXN0LCBsb2dnZXIpIHtcbiAgICB0cnkge1xuICAgICAgICBpZiAocmVxdWVzdC5oZWFkZXJzLmhvc3QpIHtcbiAgICAgICAgICAgIHJldHVybiBuZXcgVVJMKHJlcXVlc3QudXJsID8/ICcvJywgYCR7Y29tcG9uZW50fTovLyR7cmVxdWVzdC5oZWFkZXJzLmhvc3R9YCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBjb25zdCB1bnNhZmVQYXJzZWRVcmwgPSBuZXcgVVJMKHJlcXVlc3QudXJsID8/ICcvJywgXG4gICAgICAgICAgICAvLyB1c2luZyBsb2NhbGhvc3QgYXMgYSB3b3JrYXJvdW5kIHRvIHN0aWxsIHVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIGZvciBwYXJzaW5nXG4gICAgICAgICAgICBgJHtjb21wb25lbnR9Oi8vbG9jYWxob3N0YCk7XG4gICAgICAgICAgICAvLyBzaW5jZSB3ZSB1c2UgbG9jYWxob3N0IGFzIGEgd29ya2Fyb3VuZCwgZW5zdXJlIHdlIGhpZGUgdGhlIHJlc3Qgb2YgdGhlIHByb3BlcnRpZXMgdG8gYXZvaWRcbiAgICAgICAgICAgIC8vIG91ciB3b3JrYXJvdW5kIGxlYWtpbmcgdGhvdWdoLlxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICBwYXRobmFtZTogdW5zYWZlUGFyc2VkVXJsLnBhdGhuYW1lLFxuICAgICAgICAgICAgICAgIHNlYXJjaDogdW5zYWZlUGFyc2VkVXJsLnNlYXJjaCxcbiAgICAgICAgICAgICAgICB0b1N0cmluZzogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgICAgICAvLyB3ZSBjYW5ub3QgdXNlIHRoZSByZXN1bHQgb2YgdW5zYWZlUGFyc2VkVXJsLnRvU3RyaW5nIGFzIGl0J3MgcG90ZW50aWFsbHkgd3JvbmcuXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB1bnNhZmVQYXJzZWRVcmwucGF0aG5hbWUgKyB1bnNhZmVQYXJzZWRVcmwuc2VhcmNoO1xuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgfVxuICAgIGNhdGNoIChlKSB7XG4gICAgICAgIC8vIHNvbWV0aGluZyBpcyB3cm9uZywgdXNlIHVuZGVmaW5lZCAtIHRoaXMgKnNob3VsZCogbmV2ZXIgaGFwcGVuLCBsb2dnaW5nXG4gICAgICAgIC8vIGZvciB0cm91Ymxlc2hvb3RpbmcgaW4gY2FzZSBpdCBkb2VzIGhhcHBlbi5cbiAgICAgICAgbG9nZ2VyLnZlcmJvc2UoJ1VuYWJsZSB0byBnZXQgVVJMIGZyb20gcmVxdWVzdCcsIGUpO1xuICAgICAgICByZXR1cm4ge307XG4gICAgfVxufVxuLyoqXG4gKiBSZXR1cm5zIGluY29taW5nIHJlcXVlc3QgYXR0cmlidXRlcyBzY29wZWQgdG8gdGhlIHJlcXVlc3QgZGF0YVxuICogQHBhcmFtIHtJbmNvbWluZ01lc3NhZ2V9IHJlcXVlc3QgdGhlIHJlcXVlc3Qgb2JqZWN0XG4gKiBAcGFyYW0ge3sgY29tcG9uZW50OiBzdHJpbmcsIHNlcnZlck5hbWU/OiBzdHJpbmcsIGhvb2tBdHRyaWJ1dGVzPzogQXR0cmlidXRlcyB9fSBvcHRpb25zIHVzZWQgdG8gcGFzcyBkYXRhIG5lZWRlZCB0byBjcmVhdGUgYXR0cmlidXRlc1xuICogQHBhcmFtIHtTZW1jb252U3RhYmlsaXR5fSBzZW1jb252U3RhYmlsaXR5IGRldGVybWluZXMgd2hpY2ggc2VtY29udiB2ZXJzaW9uIHRvIHVzZVxuICovXG5jb25zdCBnZXRJbmNvbWluZ1JlcXVlc3RBdHRyaWJ1dGVzID0gKHJlcXVlc3QsIG9wdGlvbnMsIGxvZ2dlcikgPT4ge1xuICAgIGNvbnN0IHsgY29tcG9uZW50LCBlbmFibGVTeW50aGV0aWNTb3VyY2VEZXRlY3Rpb24sIGhvb2tBdHRyaWJ1dGVzLCBzZW1jb252U3RhYmlsaXR5LCBzZXJ2ZXJOYW1lLCB9ID0gb3B0aW9ucztcbiAgICBjb25zdCB7IGhlYWRlcnMsIGh0dHBWZXJzaW9uLCBtZXRob2QgfSA9IHJlcXVlc3Q7XG4gICAgY29uc3QgeyBob3N0LCAndXNlci1hZ2VudCc6IHVzZXJBZ2VudCwgJ3gtZm9yd2FyZGVkLWZvcic6IGlwcyB9ID0gaGVhZGVycztcbiAgICBjb25zdCBwYXJzZWRVcmwgPSBnZXRJbmZvRnJvbUluY29taW5nTWVzc2FnZShjb21wb25lbnQsIHJlcXVlc3QsIGxvZ2dlcik7XG4gICAgbGV0IG5ld0F0dHJpYnV0ZXM7XG4gICAgbGV0IG9sZEF0dHJpYnV0ZXM7XG4gICAgaWYgKHNlbWNvbnZTdGFiaWxpdHkgIT09IGluc3RydW1lbnRhdGlvbl8xLlNlbWNvbnZTdGFiaWxpdHkuT0xEKSB7XG4gICAgICAgIC8vIFN0YWJsZSBhdHRyaWJ1dGVzIGFyZSB1c2VkLlxuICAgICAgICBjb25zdCBub3JtYWxpemVkTWV0aG9kID0gbm9ybWFsaXplTWV0aG9kKG1ldGhvZCk7XG4gICAgICAgIGNvbnN0IHNlcnZlckFkZHJlc3MgPSBnZXRTZXJ2ZXJBZGRyZXNzKHJlcXVlc3QsIGNvbXBvbmVudCk7XG4gICAgICAgIGNvbnN0IHJlbW90ZUNsaWVudEFkZHJlc3MgPSBnZXRSZW1vdGVDbGllbnRBZGRyZXNzKHJlcXVlc3QpO1xuICAgICAgICBuZXdBdHRyaWJ1dGVzID0ge1xuICAgICAgICAgICAgW3NlbWFudGljX2NvbnZlbnRpb25zXzEuQVRUUl9IVFRQX1JFUVVFU1RfTUVUSE9EXTogbm9ybWFsaXplZE1ldGhvZCxcbiAgICAgICAgICAgIFtzZW1hbnRpY19jb252ZW50aW9uc18xLkFUVFJfVVJMX1NDSEVNRV06IGNvbXBvbmVudCxcbiAgICAgICAgICAgIFtzZW1hbnRpY19jb252ZW50aW9uc18xLkFUVFJfU0VSVkVSX0FERFJFU1NdOiBzZXJ2ZXJBZGRyZXNzPy5ob3N0LFxuICAgICAgICAgICAgW3NlbWFudGljX2NvbnZlbnRpb25zXzEuQVRUUl9ORVRXT1JLX1BFRVJfQUREUkVTU106IHJlcXVlc3Quc29ja2V0LnJlbW90ZUFkZHJlc3MsXG4gICAgICAgICAgICBbc2VtYW50aWNfY29udmVudGlvbnNfMS5BVFRSX05FVFdPUktfUEVFUl9QT1JUXTogcmVxdWVzdC5zb2NrZXQucmVtb3RlUG9ydCxcbiAgICAgICAgICAgIFtzZW1hbnRpY19jb252ZW50aW9uc18xLkFUVFJfTkVUV09SS19QUk9UT0NPTF9WRVJTSU9OXTogcmVxdWVzdC5odHRwVmVyc2lvbixcbiAgICAgICAgICAgIFtzZW1hbnRpY19jb252ZW50aW9uc18xLkFUVFJfVVNFUl9BR0VOVF9PUklHSU5BTF06IHVzZXJBZ2VudCxcbiAgICAgICAgfTtcbiAgICAgICAgaWYgKHBhcnNlZFVybC5wYXRobmFtZSAhPSBudWxsKSB7XG4gICAgICAgICAgICBuZXdBdHRyaWJ1dGVzW3NlbWFudGljX2NvbnZlbnRpb25zXzEuQVRUUl9VUkxfUEFUSF0gPSBwYXJzZWRVcmwucGF0aG5hbWU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHBhcnNlZFVybC5zZWFyY2gpIHtcbiAgICAgICAgICAgIC8vIFJlbW92ZSBsZWFkaW5nICc/JyBmcm9tIFVSTCBzZWFyY2ggKGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0FQSS9VUkwvc2VhcmNoKS5cbiAgICAgICAgICAgIG5ld0F0dHJpYnV0ZXNbc2VtYW50aWNfY29udmVudGlvbnNfMS5BVFRSX1VSTF9RVUVSWV0gPSBwYXJzZWRVcmwuc2VhcmNoLnNsaWNlKDEpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChyZW1vdGVDbGllbnRBZGRyZXNzICE9IG51bGwpIHtcbiAgICAgICAgICAgIG5ld0F0dHJpYnV0ZXNbc2VtYW50aWNfY29udmVudGlvbnNfMS5BVFRSX0NMSUVOVF9BRERSRVNTXSA9IHJlbW90ZUNsaWVudEFkZHJlc3M7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHNlcnZlckFkZHJlc3M/LnBvcnQgIT0gbnVsbCkge1xuICAgICAgICAgICAgbmV3QXR0cmlidXRlc1tzZW1hbnRpY19jb252ZW50aW9uc18xLkFUVFJfU0VSVkVSX1BPUlRdID0gTnVtYmVyKHNlcnZlckFkZHJlc3MucG9ydCk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gQ29uZGl0aW9uYWxseSByZXF1aXJlZCBpZiByZXF1ZXN0IG1ldGhvZCByZXF1aXJlZCBjYXNlIG5vcm1hbGl6YXRpb24uXG4gICAgICAgIGlmIChtZXRob2QgIT09IG5vcm1hbGl6ZWRNZXRob2QpIHtcbiAgICAgICAgICAgIG5ld0F0dHJpYnV0ZXNbc2VtYW50aWNfY29udmVudGlvbnNfMS5BVFRSX0hUVFBfUkVRVUVTVF9NRVRIT0RfT1JJR0lOQUxdID0gbWV0aG9kO1xuICAgICAgICB9XG4gICAgICAgIGlmIChlbmFibGVTeW50aGV0aWNTb3VyY2VEZXRlY3Rpb24gJiYgdXNlckFnZW50KSB7XG4gICAgICAgICAgICBuZXdBdHRyaWJ1dGVzW3NlbWNvbnZfMS5BVFRSX1VTRVJfQUdFTlRfU1lOVEhFVElDX1RZUEVdID1cbiAgICAgICAgICAgICAgICBnZXRTeW50aGV0aWNUeXBlKHVzZXJBZ2VudCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgaWYgKHNlbWNvbnZTdGFiaWxpdHkgIT09IGluc3RydW1lbnRhdGlvbl8xLlNlbWNvbnZTdGFiaWxpdHkuU1RBQkxFKSB7XG4gICAgICAgIC8vIE9sZCBhdHRyaWJ1dGVzIGFyZSB1c2VkLlxuICAgICAgICBjb25zdCBob3N0bmFtZSA9IGhvc3Q/LnJlcGxhY2UoL14oLiopKDpbMC05XXsxLDV9KS8sICckMScpIHx8ICdsb2NhbGhvc3QnO1xuICAgICAgICBvbGRBdHRyaWJ1dGVzID0ge1xuICAgICAgICAgICAgW3NlbWNvbnZfMS5BVFRSX0hUVFBfVVJMXTogcGFyc2VkVXJsLnRvU3RyaW5nKCksXG4gICAgICAgICAgICBbc2VtY29udl8xLkFUVFJfSFRUUF9IT1NUXTogaG9zdCxcbiAgICAgICAgICAgIFtzZW1jb252XzEuQVRUUl9ORVRfSE9TVF9OQU1FXTogaG9zdG5hbWUsXG4gICAgICAgICAgICBbc2VtY29udl8xLkFUVFJfSFRUUF9NRVRIT0RdOiBtZXRob2QsXG4gICAgICAgICAgICBbc2VtY29udl8xLkFUVFJfSFRUUF9TQ0hFTUVdOiBjb21wb25lbnQsXG4gICAgICAgIH07XG4gICAgICAgIGlmICh0eXBlb2YgaXBzID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgb2xkQXR0cmlidXRlc1tzZW1jb252XzEuQVRUUl9IVFRQX0NMSUVOVF9JUF0gPSBpcHMuc3BsaXQoJywnKVswXTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZW9mIHNlcnZlck5hbWUgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICBvbGRBdHRyaWJ1dGVzW3NlbWNvbnZfMS5BVFRSX0hUVFBfU0VSVkVSX05BTUVdID0gc2VydmVyTmFtZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAocGFyc2VkVXJsLnBhdGhuYW1lKSB7XG4gICAgICAgICAgICBvbGRBdHRyaWJ1dGVzW3NlbWNvbnZfMS5BVFRSX0hUVFBfVEFSR0VUXSA9XG4gICAgICAgICAgICAgICAgcGFyc2VkVXJsLnBhdGhuYW1lICsgcGFyc2VkVXJsLnNlYXJjaCB8fCAnLyc7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHVzZXJBZ2VudCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBvbGRBdHRyaWJ1dGVzW3NlbWNvbnZfMS5BVFRSX0hUVFBfVVNFUl9BR0VOVF0gPSB1c2VyQWdlbnQ7XG4gICAgICAgIH1cbiAgICAgICAgKDAsIGV4cG9ydHMuc2V0UmVxdWVzdENvbnRlbnRMZW5ndGhBdHRyaWJ1dGUpKHJlcXVlc3QsIG9sZEF0dHJpYnV0ZXMpO1xuICAgICAgICAoMCwgZXhwb3J0cy5zZXRBdHRyaWJ1dGVzRnJvbUh0dHBLaW5kKShodHRwVmVyc2lvbiwgb2xkQXR0cmlidXRlcyk7XG4gICAgfVxuICAgIHN3aXRjaCAoc2VtY29udlN0YWJpbGl0eSkge1xuICAgICAgICBjYXNlIGluc3RydW1lbnRhdGlvbl8xLlNlbWNvbnZTdGFiaWxpdHkuU1RBQkxFOlxuICAgICAgICAgICAgcmV0dXJuIE9iamVjdC5hc3NpZ24obmV3QXR0cmlidXRlcywgaG9va0F0dHJpYnV0ZXMpO1xuICAgICAgICBjYXNlIGluc3RydW1lbnRhdGlvbl8xLlNlbWNvbnZTdGFiaWxpdHkuT0xEOlxuICAgICAgICAgICAgcmV0dXJuIE9iamVjdC5hc3NpZ24ob2xkQXR0cmlidXRlcywgaG9va0F0dHJpYnV0ZXMpO1xuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgcmV0dXJuIE9iamVjdC5hc3NpZ24ob2xkQXR0cmlidXRlcywgbmV3QXR0cmlidXRlcywgaG9va0F0dHJpYnV0ZXMpO1xuICAgIH1cbn07XG5leHBvcnRzLmdldEluY29taW5nUmVxdWVzdEF0dHJpYnV0ZXMgPSBnZXRJbmNvbWluZ1JlcXVlc3RBdHRyaWJ1dGVzO1xuLyoqXG4gKiBSZXR1cm5zIGluY29taW5nIHJlcXVlc3QgTWV0cmljIGF0dHJpYnV0ZXMgc2NvcGVkIHRvIHRoZSByZXF1ZXN0IGRhdGFcbiAqIEBwYXJhbSB7QXR0cmlidXRlc30gc3BhbkF0dHJpYnV0ZXMgdGhlIHNwYW4gYXR0cmlidXRlc1xuICogQHBhcmFtIHt7IGNvbXBvbmVudDogc3RyaW5nIH19IG9wdGlvbnMgdXNlZCB0byBwYXNzIGRhdGEgbmVlZGVkIHRvIGNyZWF0ZSBhdHRyaWJ1dGVzXG4gKi9cbmNvbnN0IGdldEluY29taW5nUmVxdWVzdE1ldHJpY0F0dHJpYnV0ZXMgPSAoc3BhbkF0dHJpYnV0ZXMpID0+IHtcbiAgICBjb25zdCBtZXRyaWNBdHRyaWJ1dGVzID0ge307XG4gICAgbWV0cmljQXR0cmlidXRlc1tzZW1jb252XzEuQVRUUl9IVFRQX1NDSEVNRV0gPSBzcGFuQXR0cmlidXRlc1tzZW1jb252XzEuQVRUUl9IVFRQX1NDSEVNRV07XG4gICAgbWV0cmljQXR0cmlidXRlc1tzZW1jb252XzEuQVRUUl9IVFRQX01FVEhPRF0gPSBzcGFuQXR0cmlidXRlc1tzZW1jb252XzEuQVRUUl9IVFRQX01FVEhPRF07XG4gICAgbWV0cmljQXR0cmlidXRlc1tzZW1jb252XzEuQVRUUl9ORVRfSE9TVF9OQU1FXSA9IHNwYW5BdHRyaWJ1dGVzW3NlbWNvbnZfMS5BVFRSX05FVF9IT1NUX05BTUVdO1xuICAgIG1ldHJpY0F0dHJpYnV0ZXNbc2VtY29udl8xLkFUVFJfSFRUUF9GTEFWT1JdID0gc3BhbkF0dHJpYnV0ZXNbc2VtY29udl8xLkFUVFJfSFRUUF9GTEFWT1JdO1xuICAgIC8vVE9ETzogaHR0cC50YXJnZXQgYXR0cmlidXRlLCBpdCBzaG91bGQgc3Vic3RpdHV0ZSBhbnkgcGFyYW1ldGVycyB0byBhdm9pZCBoaWdoIGNhcmRpbmFsaXR5LlxuICAgIHJldHVybiBtZXRyaWNBdHRyaWJ1dGVzO1xufTtcbmV4cG9ydHMuZ2V0SW5jb21pbmdSZXF1ZXN0TWV0cmljQXR0cmlidXRlcyA9IGdldEluY29taW5nUmVxdWVzdE1ldHJpY0F0dHJpYnV0ZXM7XG4vKipcbiAqIFJldHVybnMgaW5jb21pbmcgcmVxdWVzdCBhdHRyaWJ1dGVzIHNjb3BlZCB0byB0aGUgcmVzcG9uc2UgZGF0YVxuICogQHBhcmFtIHsoU2VydmVyUmVzcG9uc2UgJiB7IHNvY2tldDogU29ja2V0OyB9KX0gcmVzcG9uc2UgdGhlIHJlc3BvbnNlIG9iamVjdFxuICovXG5jb25zdCBnZXRJbmNvbWluZ1JlcXVlc3RBdHRyaWJ1dGVzT25SZXNwb25zZSA9IChyZXF1ZXN0LCByZXNwb25zZSwgc2VtY29udlN0YWJpbGl0eSkgPT4ge1xuICAgIC8vIHRha2Ugc29ja2V0IGZyb20gdGhlIHJlcXVlc3QsXG4gICAgLy8gc2luY2UgaXQgbWF5IGJlIGRldGFjaGVkIGZyb20gdGhlIHJlc3BvbnNlIG9iamVjdCBpbiBrZWVwLWFsaXZlIG1vZGVcbiAgICBjb25zdCB7IHNvY2tldCB9ID0gcmVxdWVzdDtcbiAgICBjb25zdCB7IHN0YXR1c0NvZGUsIHN0YXR1c01lc3NhZ2UgfSA9IHJlc3BvbnNlO1xuICAgIGNvbnN0IG5ld0F0dHJpYnV0ZXMgPSB7XG4gICAgICAgIFtzZW1hbnRpY19jb252ZW50aW9uc18xLkFUVFJfSFRUUF9SRVNQT05TRV9TVEFUVVNfQ09ERV06IHN0YXR1c0NvZGUsXG4gICAgfTtcbiAgICBjb25zdCBycGNNZXRhZGF0YSA9ICgwLCBjb3JlXzEuZ2V0UlBDTWV0YWRhdGEpKGFwaV8xLmNvbnRleHQuYWN0aXZlKCkpO1xuICAgIGNvbnN0IG9sZEF0dHJpYnV0ZXMgPSB7fTtcbiAgICBpZiAoc29ja2V0KSB7XG4gICAgICAgIGNvbnN0IHsgbG9jYWxBZGRyZXNzLCBsb2NhbFBvcnQsIHJlbW90ZUFkZHJlc3MsIHJlbW90ZVBvcnQgfSA9IHNvY2tldDtcbiAgICAgICAgb2xkQXR0cmlidXRlc1tzZW1jb252XzEuQVRUUl9ORVRfSE9TVF9JUF0gPSBsb2NhbEFkZHJlc3M7XG4gICAgICAgIG9sZEF0dHJpYnV0ZXNbc2VtY29udl8xLkFUVFJfTkVUX0hPU1RfUE9SVF0gPSBsb2NhbFBvcnQ7XG4gICAgICAgIG9sZEF0dHJpYnV0ZXNbc2VtY29udl8xLkFUVFJfTkVUX1BFRVJfSVBdID0gcmVtb3RlQWRkcmVzcztcbiAgICAgICAgb2xkQXR0cmlidXRlc1tzZW1jb252XzEuQVRUUl9ORVRfUEVFUl9QT1JUXSA9IHJlbW90ZVBvcnQ7XG4gICAgfVxuICAgIG9sZEF0dHJpYnV0ZXNbc2VtY29udl8xLkFUVFJfSFRUUF9TVEFUVVNfQ09ERV0gPSBzdGF0dXNDb2RlO1xuICAgIG9sZEF0dHJpYnV0ZXNbQXR0cmlidXRlTmFtZXNfMS5BdHRyaWJ1dGVOYW1lcy5IVFRQX1NUQVRVU19URVhUXSA9IChzdGF0dXNNZXNzYWdlIHx8ICcnKS50b1VwcGVyQ2FzZSgpO1xuICAgIGlmIChycGNNZXRhZGF0YT8udHlwZSA9PT0gY29yZV8xLlJQQ1R5cGUuSFRUUCAmJiBycGNNZXRhZGF0YS5yb3V0ZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIG9sZEF0dHJpYnV0ZXNbc2VtYW50aWNfY29udmVudGlvbnNfMS5BVFRSX0hUVFBfUk9VVEVdID0gcnBjTWV0YWRhdGEucm91dGU7XG4gICAgICAgIG5ld0F0dHJpYnV0ZXNbc2VtYW50aWNfY29udmVudGlvbnNfMS5BVFRSX0hUVFBfUk9VVEVdID0gcnBjTWV0YWRhdGEucm91dGU7XG4gICAgfVxuICAgIHN3aXRjaCAoc2VtY29udlN0YWJpbGl0eSkge1xuICAgICAgICBjYXNlIGluc3RydW1lbnRhdGlvbl8xLlNlbWNvbnZTdGFiaWxpdHkuU1RBQkxFOlxuICAgICAgICAgICAgcmV0dXJuIG5ld0F0dHJpYnV0ZXM7XG4gICAgICAgIGNhc2UgaW5zdHJ1bWVudGF0aW9uXzEuU2VtY29udlN0YWJpbGl0eS5PTEQ6XG4gICAgICAgICAgICByZXR1cm4gb2xkQXR0cmlidXRlcztcbiAgICB9XG4gICAgcmV0dXJuIE9iamVjdC5hc3NpZ24ob2xkQXR0cmlidXRlcywgbmV3QXR0cmlidXRlcyk7XG59O1xuZXhwb3J0cy5nZXRJbmNvbWluZ1JlcXVlc3RBdHRyaWJ1dGVzT25SZXNwb25zZSA9IGdldEluY29taW5nUmVxdWVzdEF0dHJpYnV0ZXNPblJlc3BvbnNlO1xuLyoqXG4gKiBSZXR1cm5zIGluY29taW5nIHJlcXVlc3QgTWV0cmljIGF0dHJpYnV0ZXMgc2NvcGVkIHRvIHRoZSByZXF1ZXN0IGRhdGFcbiAqIEBwYXJhbSB7QXR0cmlidXRlc30gc3BhbkF0dHJpYnV0ZXMgdGhlIHNwYW4gYXR0cmlidXRlc1xuICovXG5jb25zdCBnZXRJbmNvbWluZ1JlcXVlc3RNZXRyaWNBdHRyaWJ1dGVzT25SZXNwb25zZSA9IChzcGFuQXR0cmlidXRlcykgPT4ge1xuICAgIGNvbnN0IG1ldHJpY0F0dHJpYnV0ZXMgPSB7fTtcbiAgICBtZXRyaWNBdHRyaWJ1dGVzW3NlbWNvbnZfMS5BVFRSX0hUVFBfU1RBVFVTX0NPREVdID1cbiAgICAgICAgc3BhbkF0dHJpYnV0ZXNbc2VtY29udl8xLkFUVFJfSFRUUF9TVEFUVVNfQ09ERV07XG4gICAgbWV0cmljQXR0cmlidXRlc1tzZW1jb252XzEuQVRUUl9ORVRfSE9TVF9QT1JUXSA9IHNwYW5BdHRyaWJ1dGVzW3NlbWNvbnZfMS5BVFRSX05FVF9IT1NUX1BPUlRdO1xuICAgIGlmIChzcGFuQXR0cmlidXRlc1tzZW1hbnRpY19jb252ZW50aW9uc18xLkFUVFJfSFRUUF9ST1VURV0gIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBtZXRyaWNBdHRyaWJ1dGVzW3NlbWFudGljX2NvbnZlbnRpb25zXzEuQVRUUl9IVFRQX1JPVVRFXSA9IHNwYW5BdHRyaWJ1dGVzW3NlbWFudGljX2NvbnZlbnRpb25zXzEuQVRUUl9IVFRQX1JPVVRFXTtcbiAgICB9XG4gICAgcmV0dXJuIG1ldHJpY0F0dHJpYnV0ZXM7XG59O1xuZXhwb3J0cy5nZXRJbmNvbWluZ1JlcXVlc3RNZXRyaWNBdHRyaWJ1dGVzT25SZXNwb25zZSA9IGdldEluY29taW5nUmVxdWVzdE1ldHJpY0F0dHJpYnV0ZXNPblJlc3BvbnNlO1xuLyoqXG4gKiBSZXR1cm5zIGluY29taW5nIHN0YWJsZSByZXF1ZXN0IE1ldHJpYyBhdHRyaWJ1dGVzIHNjb3BlZCB0byB0aGUgcmVxdWVzdCBkYXRhXG4gKiBAcGFyYW0ge0F0dHJpYnV0ZXN9IHNwYW5BdHRyaWJ1dGVzIHRoZSBzcGFuIGF0dHJpYnV0ZXNcbiAqL1xuY29uc3QgZ2V0SW5jb21pbmdTdGFibGVSZXF1ZXN0TWV0cmljQXR0cmlidXRlc09uUmVzcG9uc2UgPSAoc3BhbkF0dHJpYnV0ZXMpID0+IHtcbiAgICBjb25zdCBtZXRyaWNBdHRyaWJ1dGVzID0ge307XG4gICAgaWYgKHNwYW5BdHRyaWJ1dGVzW3NlbWFudGljX2NvbnZlbnRpb25zXzEuQVRUUl9IVFRQX1JPVVRFXSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIG1ldHJpY0F0dHJpYnV0ZXNbc2VtYW50aWNfY29udmVudGlvbnNfMS5BVFRSX0hUVFBfUk9VVEVdID0gc3BhbkF0dHJpYnV0ZXNbc2VtYW50aWNfY29udmVudGlvbnNfMS5BVFRSX0hUVFBfUk9VVEVdO1xuICAgIH1cbiAgICAvLyByZXF1aXJlZCBpZiBhbmQgb25seSBpZiBvbmUgd2FzIHNlbnQsIHNhbWUgYXMgc3BhbiByZXF1aXJlbWVudFxuICAgIGlmIChzcGFuQXR0cmlidXRlc1tzZW1hbnRpY19jb252ZW50aW9uc18xLkFUVFJfSFRUUF9SRVNQT05TRV9TVEFUVVNfQ09ERV0pIHtcbiAgICAgICAgbWV0cmljQXR0cmlidXRlc1tzZW1hbnRpY19jb252ZW50aW9uc18xLkFUVFJfSFRUUF9SRVNQT05TRV9TVEFUVVNfQ09ERV0gPVxuICAgICAgICAgICAgc3BhbkF0dHJpYnV0ZXNbc2VtYW50aWNfY29udmVudGlvbnNfMS5BVFRSX0hUVFBfUkVTUE9OU0VfU1RBVFVTX0NPREVdO1xuICAgIH1cbiAgICByZXR1cm4gbWV0cmljQXR0cmlidXRlcztcbn07XG5leHBvcnRzLmdldEluY29taW5nU3RhYmxlUmVxdWVzdE1ldHJpY0F0dHJpYnV0ZXNPblJlc3BvbnNlID0gZ2V0SW5jb21pbmdTdGFibGVSZXF1ZXN0TWV0cmljQXR0cmlidXRlc09uUmVzcG9uc2U7XG5mdW5jdGlvbiBoZWFkZXJDYXB0dXJlKHR5cGUsIGhlYWRlcnMsIHNlbWNvbnZTdGFiaWxpdHkpIHtcbiAgICBjb25zdCBub3JtYWxpemVkSGVhZGVycyA9IG5ldyBNYXAoKTtcbiAgICBmb3IgKGxldCBpID0gMCwgbGVuID0gaGVhZGVycy5sZW5ndGg7IGkgPCBsZW47IGkrKykge1xuICAgICAgICBjb25zdCBjYXB0dXJlZEhlYWRlciA9IGhlYWRlcnNbaV0udG9Mb3dlckNhc2UoKTtcbiAgICAgICAgaWYgKHNlbWNvbnZTdGFiaWxpdHkgJiBpbnN0cnVtZW50YXRpb25fMS5TZW1jb252U3RhYmlsaXR5LlNUQUJMRSkge1xuICAgICAgICAgICAgbm9ybWFsaXplZEhlYWRlcnMuc2V0KGNhcHR1cmVkSGVhZGVyLCBjYXB0dXJlZEhlYWRlcik7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAvLyBJbiBvbGQgc2VtY29udiwgdGhlIGhlYWRlciBuYW1lIGNvbnZlcnRlZCBoeXBlbiB0byB1bmRlcnNjb3JlLCBlLmcuOlxuICAgICAgICAgICAgLy8gYGh0dHAucmVxdWVzdC5oZWFkZXIuY29udGVudF9sZW5ndGhgLlxuICAgICAgICAgICAgbm9ybWFsaXplZEhlYWRlcnMuc2V0KGNhcHR1cmVkSGVhZGVyLCBjYXB0dXJlZEhlYWRlci5yZXBsYWNlQWxsKCctJywgJ18nKSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIChnZXRIZWFkZXIpID0+IHtcbiAgICAgICAgY29uc3QgYXR0cmlidXRlcyA9IHt9O1xuICAgICAgICBmb3IgKGNvbnN0IGNhcHR1cmVkSGVhZGVyIG9mIG5vcm1hbGl6ZWRIZWFkZXJzLmtleXMoKSkge1xuICAgICAgICAgICAgY29uc3QgdmFsdWUgPSBnZXRIZWFkZXIoY2FwdHVyZWRIZWFkZXIpO1xuICAgICAgICAgICAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IG5vcm1hbGl6ZWRIZWFkZXIgPSBub3JtYWxpemVkSGVhZGVycy5nZXQoY2FwdHVyZWRIZWFkZXIpO1xuICAgICAgICAgICAgY29uc3Qga2V5ID0gYGh0dHAuJHt0eXBlfS5oZWFkZXIuJHtub3JtYWxpemVkSGVhZGVyfWA7XG4gICAgICAgICAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgICAgIGF0dHJpYnV0ZXNba2V5XSA9IFt2YWx1ZV07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChBcnJheS5pc0FycmF5KHZhbHVlKSkge1xuICAgICAgICAgICAgICAgIGF0dHJpYnV0ZXNba2V5XSA9IHZhbHVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgYXR0cmlidXRlc1trZXldID0gW3ZhbHVlXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gYXR0cmlidXRlcztcbiAgICB9O1xufVxuZXhwb3J0cy5oZWFkZXJDYXB0dXJlID0gaGVhZGVyQ2FwdHVyZTtcbmNvbnN0IEtOT1dOX01FVEhPRFMgPSBuZXcgU2V0KFtcbiAgICAvLyBtZXRob2RzIGZyb20gaHR0cHM6Ly93d3cucmZjLWVkaXRvci5vcmcvcmZjL3JmYzkxMTAuaHRtbCNuYW1lLW1ldGhvZHNcbiAgICAnR0VUJyxcbiAgICAnSEVBRCcsXG4gICAgJ1BPU1QnLFxuICAgICdQVVQnLFxuICAgICdERUxFVEUnLFxuICAgICdDT05ORUNUJyxcbiAgICAnT1BUSU9OUycsXG4gICAgJ1RSQUNFJyxcbiAgICAvLyBQQVRDSCBmcm9tIGh0dHBzOi8vd3d3LnJmYy1lZGl0b3Iub3JnL3JmYy9yZmM1Nzg5Lmh0bWxcbiAgICAnUEFUQ0gnLFxuICAgIC8vIFFVRVJZIGZyb20gaHR0cHM6Ly9kYXRhdHJhY2tlci5pZXRmLm9yZy9kb2MvZHJhZnQtaWV0Zi1odHRwYmlzLXNhZmUtbWV0aG9kLXctYm9keS9cbiAgICAnUVVFUlknLFxuXSk7XG5mdW5jdGlvbiBub3JtYWxpemVNZXRob2QobWV0aG9kKSB7XG4gICAgaWYgKG1ldGhvZCA9PSBudWxsKSB7XG4gICAgICAgIHJldHVybiAnR0VUJztcbiAgICB9XG4gICAgY29uc3QgdXBwZXIgPSBtZXRob2QudG9VcHBlckNhc2UoKTtcbiAgICBpZiAoS05PV05fTUVUSE9EUy5oYXModXBwZXIpKSB7XG4gICAgICAgIHJldHVybiB1cHBlcjtcbiAgICB9XG4gICAgcmV0dXJuICdfT1RIRVInO1xufVxuZnVuY3Rpb24gcGFyc2VGb3J3YXJkZWRIZWFkZXIoaGVhZGVyKSB7XG4gICAgdHJ5IHtcbiAgICAgICAgcmV0dXJuIGZvcndhcmRlZFBhcnNlKGhlYWRlcik7XG4gICAgfVxuICAgIGNhdGNoIHtcbiAgICAgICAgcmV0dXJuIFtdO1xuICAgIH1cbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXV0aWxzLmpzLm1hcCJdLCJuYW1lcyI6W10sImlnbm9yZUxpc3QiOlswXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///(rsc)/./node_modules/.pnpm/@opentelemetry+instrumentation-http@0.214.0_@opentelemetry+api@1.9.1/node_modules/@opentelemetry/instrumentation-http/build/src/utils.js\n");
|
|
|
|
/***/ }),
|
|
|
|
/***/ "(rsc)/./node_modules/.pnpm/@opentelemetry+instrumentation-http@0.214.0_@opentelemetry+api@1.9.1/node_modules/@opentelemetry/instrumentation-http/build/src/version.js":
|
|
/*!***********************************************************************************************************************************************************************!*\
|
|
!*** ./node_modules/.pnpm/@opentelemetry+instrumentation-http@0.214.0_@opentelemetry+api@1.9.1/node_modules/@opentelemetry/instrumentation-http/build/src/version.js ***!
|
|
\***********************************************************************************************************************************************************************/
|
|
/***/ ((__unused_webpack_module, exports) => {
|
|
|
|
eval("\n/*\n * Copyright The OpenTelemetry Authors\n * SPDX-License-Identifier: Apache-2.0\n */\nObject.defineProperty(exports, \"__esModule\", ({ value: true }));\nexports.VERSION = void 0;\n// this is autogenerated file, see scripts/version-update.js\nexports.VERSION = '0.214.0';\n//# sourceMappingURL=version.js.map//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKHJzYykvLi9ub2RlX21vZHVsZXMvLnBucG0vQG9wZW50ZWxlbWV0cnkraW5zdHJ1bWVudGF0aW9uLWh0dHBAMC4yMTQuMF9Ab3BlbnRlbGVtZXRyeSthcGlAMS45LjEvbm9kZV9tb2R1bGVzL0BvcGVudGVsZW1ldHJ5L2luc3RydW1lbnRhdGlvbi1odHRwL2J1aWxkL3NyYy92ZXJzaW9uLmpzIiwibWFwcGluZ3MiOiJBQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQSw4Q0FBNkMsRUFBRSxhQUFhLEVBQUM7QUFDN0QsZUFBZTtBQUNmO0FBQ0EsZUFBZTtBQUNmIiwic291cmNlcyI6WyIvVXNlcnMvbWFyY21pbnRlbC9Qcm9qZWN0cy9lLXRpYi5jb20vbm9kZV9tb2R1bGVzLy5wbnBtL0BvcGVudGVsZW1ldHJ5K2luc3RydW1lbnRhdGlvbi1odHRwQDAuMjE0LjBfQG9wZW50ZWxlbWV0cnkrYXBpQDEuOS4xL25vZGVfbW9kdWxlcy9Ab3BlbnRlbGVtZXRyeS9pbnN0cnVtZW50YXRpb24taHR0cC9idWlsZC9zcmMvdmVyc2lvbi5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyJcInVzZSBzdHJpY3RcIjtcbi8qXG4gKiBDb3B5cmlnaHQgVGhlIE9wZW5UZWxlbWV0cnkgQXV0aG9yc1xuICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjBcbiAqL1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5WRVJTSU9OID0gdm9pZCAwO1xuLy8gdGhpcyBpcyBhdXRvZ2VuZXJhdGVkIGZpbGUsIHNlZSBzY3JpcHRzL3ZlcnNpb24tdXBkYXRlLmpzXG5leHBvcnRzLlZFUlNJT04gPSAnMC4yMTQuMCc7XG4vLyMgc291cmNlTWFwcGluZ1VSTD12ZXJzaW9uLmpzLm1hcCJdLCJuYW1lcyI6W10sImlnbm9yZUxpc3QiOlswXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///(rsc)/./node_modules/.pnpm/@opentelemetry+instrumentation-http@0.214.0_@opentelemetry+api@1.9.1/node_modules/@opentelemetry/instrumentation-http/build/src/version.js\n");
|
|
|
|
/***/ }),
|
|
|
|
/***/ "(ssr)/./node_modules/.pnpm/@opentelemetry+instrumentation-http@0.214.0_@opentelemetry+api@1.9.1/node_modules/@opentelemetry/instrumentation-http/build/src/enums/AttributeNames.js":
|
|
/*!************************************************************************************************************************************************************************************!*\
|
|
!*** ./node_modules/.pnpm/@opentelemetry+instrumentation-http@0.214.0_@opentelemetry+api@1.9.1/node_modules/@opentelemetry/instrumentation-http/build/src/enums/AttributeNames.js ***!
|
|
\************************************************************************************************************************************************************************************/
|
|
/***/ ((__unused_webpack_module, exports) => {
|
|
|
|
eval("\n/*\n * Copyright The OpenTelemetry Authors\n * SPDX-License-Identifier: Apache-2.0\n */\nObject.defineProperty(exports, \"__esModule\", ({ value: true }));\nexports.AttributeNames = void 0;\n/**\n * https://github.com/open-telemetry/opentelemetry-specification/blob/master/specification/trace/semantic_conventions/http.md\n */\nvar AttributeNames;\n(function (AttributeNames) {\n AttributeNames[\"HTTP_ERROR_NAME\"] = \"http.error_name\";\n AttributeNames[\"HTTP_ERROR_MESSAGE\"] = \"http.error_message\";\n AttributeNames[\"HTTP_STATUS_TEXT\"] = \"http.status_text\";\n})(AttributeNames = exports.AttributeNames || (exports.AttributeNames = {}));\n//# sourceMappingURL=AttributeNames.js.map//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKHNzcikvLi9ub2RlX21vZHVsZXMvLnBucG0vQG9wZW50ZWxlbWV0cnkraW5zdHJ1bWVudGF0aW9uLWh0dHBAMC4yMTQuMF9Ab3BlbnRlbGVtZXRyeSthcGlAMS45LjEvbm9kZV9tb2R1bGVzL0BvcGVudGVsZW1ldHJ5L2luc3RydW1lbnRhdGlvbi1odHRwL2J1aWxkL3NyYy9lbnVtcy9BdHRyaWJ1dGVOYW1lcy5qcyIsIm1hcHBpbmdzIjoiQUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsOENBQTZDLEVBQUUsYUFBYSxFQUFDO0FBQzdELHNCQUFzQjtBQUN0QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQyw4Q0FBOEMsc0JBQXNCLEtBQUs7QUFDMUUiLCJzb3VyY2VzIjpbIi9Vc2Vycy9tYXJjbWludGVsL1Byb2plY3RzL2UtdGliLmNvbS9ub2RlX21vZHVsZXMvLnBucG0vQG9wZW50ZWxlbWV0cnkraW5zdHJ1bWVudGF0aW9uLWh0dHBAMC4yMTQuMF9Ab3BlbnRlbGVtZXRyeSthcGlAMS45LjEvbm9kZV9tb2R1bGVzL0BvcGVudGVsZW1ldHJ5L2luc3RydW1lbnRhdGlvbi1odHRwL2J1aWxkL3NyYy9lbnVtcy9BdHRyaWJ1dGVOYW1lcy5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyJcInVzZSBzdHJpY3RcIjtcbi8qXG4gKiBDb3B5cmlnaHQgVGhlIE9wZW5UZWxlbWV0cnkgQXV0aG9yc1xuICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjBcbiAqL1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5BdHRyaWJ1dGVOYW1lcyA9IHZvaWQgMDtcbi8qKlxuICogaHR0cHM6Ly9naXRodWIuY29tL29wZW4tdGVsZW1ldHJ5L29wZW50ZWxlbWV0cnktc3BlY2lmaWNhdGlvbi9ibG9iL21hc3Rlci9zcGVjaWZpY2F0aW9uL3RyYWNlL3NlbWFudGljX2NvbnZlbnRpb25zL2h0dHAubWRcbiAqL1xudmFyIEF0dHJpYnV0ZU5hbWVzO1xuKGZ1bmN0aW9uIChBdHRyaWJ1dGVOYW1lcykge1xuICAgIEF0dHJpYnV0ZU5hbWVzW1wiSFRUUF9FUlJPUl9OQU1FXCJdID0gXCJodHRwLmVycm9yX25hbWVcIjtcbiAgICBBdHRyaWJ1dGVOYW1lc1tcIkhUVFBfRVJST1JfTUVTU0FHRVwiXSA9IFwiaHR0cC5lcnJvcl9tZXNzYWdlXCI7XG4gICAgQXR0cmlidXRlTmFtZXNbXCJIVFRQX1NUQVRVU19URVhUXCJdID0gXCJodHRwLnN0YXR1c190ZXh0XCI7XG59KShBdHRyaWJ1dGVOYW1lcyA9IGV4cG9ydHMuQXR0cmlidXRlTmFtZXMgfHwgKGV4cG9ydHMuQXR0cmlidXRlTmFtZXMgPSB7fSkpO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9QXR0cmlidXRlTmFtZXMuanMubWFwIl0sIm5hbWVzIjpbXSwiaWdub3JlTGlzdCI6WzBdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///(ssr)/./node_modules/.pnpm/@opentelemetry+instrumentation-http@0.214.0_@opentelemetry+api@1.9.1/node_modules/@opentelemetry/instrumentation-http/build/src/enums/AttributeNames.js\n");
|
|
|
|
/***/ }),
|
|
|
|
/***/ "(ssr)/./node_modules/.pnpm/@opentelemetry+instrumentation-http@0.214.0_@opentelemetry+api@1.9.1/node_modules/@opentelemetry/instrumentation-http/build/src/http.js":
|
|
/*!********************************************************************************************************************************************************************!*\
|
|
!*** ./node_modules/.pnpm/@opentelemetry+instrumentation-http@0.214.0_@opentelemetry+api@1.9.1/node_modules/@opentelemetry/instrumentation-http/build/src/http.js ***!
|
|
\********************************************************************************************************************************************************************/
|
|
/***/ ((__unused_webpack_module, exports, __webpack_require__) => {
|
|
|
|
eval("\n/*\n * Copyright The OpenTelemetry Authors\n * SPDX-License-Identifier: Apache-2.0\n */\nObject.defineProperty(exports, \"__esModule\", ({ value: true }));\nexports.HttpInstrumentation = void 0;\nconst api_1 = __webpack_require__(/*! @opentelemetry/api */ \"(ssr)/./node_modules/.pnpm/@opentelemetry+api@1.9.1/node_modules/@opentelemetry/api/build/esm/index.js\");\nconst core_1 = __webpack_require__(/*! @opentelemetry/core */ \"(ssr)/./node_modules/.pnpm/@opentelemetry+core@2.6.1_@opentelemetry+api@1.9.1/node_modules/@opentelemetry/core/build/esm/index.js\");\nconst url = __webpack_require__(/*! url */ \"url\");\nconst version_1 = __webpack_require__(/*! ./version */ \"(ssr)/./node_modules/.pnpm/@opentelemetry+instrumentation-http@0.214.0_@opentelemetry+api@1.9.1/node_modules/@opentelemetry/instrumentation-http/build/src/version.js\");\nconst instrumentation_1 = __webpack_require__(/*! @opentelemetry/instrumentation */ \"(ssr)/./node_modules/.pnpm/@opentelemetry+instrumentation@0.214.0_@opentelemetry+api@1.9.1/node_modules/@opentelemetry/instrumentation/build/esm/index.js\");\nconst events_1 = __webpack_require__(/*! events */ \"events\");\nconst semantic_conventions_1 = __webpack_require__(/*! @opentelemetry/semantic-conventions */ \"(ssr)/./node_modules/.pnpm/@opentelemetry+semantic-conventions@1.40.0/node_modules/@opentelemetry/semantic-conventions/build/esm/index.js\");\nconst utils_1 = __webpack_require__(/*! ./utils */ \"(ssr)/./node_modules/.pnpm/@opentelemetry+instrumentation-http@0.214.0_@opentelemetry+api@1.9.1/node_modules/@opentelemetry/instrumentation-http/build/src/utils.js\");\n/**\n * `node:http` and `node:https` instrumentation for OpenTelemetry\n */\nclass HttpInstrumentation extends instrumentation_1.InstrumentationBase {\n /** keep track on spans not ended */\n _spanNotEnded = new WeakSet();\n _headerCapture;\n _httpPatched = false;\n _httpsPatched = false;\n _semconvStability = instrumentation_1.SemconvStability.OLD;\n constructor(config = {}) {\n super('@opentelemetry/instrumentation-http', version_1.VERSION, config);\n this._semconvStability = (0, instrumentation_1.semconvStabilityFromStr)('http', process.env.OTEL_SEMCONV_STABILITY_OPT_IN);\n this._headerCapture = this._createHeaderCapture(this._semconvStability);\n }\n _updateMetricInstruments() {\n this._oldHttpServerDurationHistogram = this.meter.createHistogram('http.server.duration', {\n description: 'Measures the duration of inbound HTTP requests.',\n unit: 'ms',\n valueType: api_1.ValueType.DOUBLE,\n });\n this._oldHttpClientDurationHistogram = this.meter.createHistogram('http.client.duration', {\n description: 'Measures the duration of outbound HTTP requests.',\n unit: 'ms',\n valueType: api_1.ValueType.DOUBLE,\n });\n this._stableHttpServerDurationHistogram = this.meter.createHistogram(semantic_conventions_1.METRIC_HTTP_SERVER_REQUEST_DURATION, {\n description: 'Duration of HTTP server requests.',\n unit: 's',\n valueType: api_1.ValueType.DOUBLE,\n advice: {\n explicitBucketBoundaries: [\n 0.005, 0.01, 0.025, 0.05, 0.075, 0.1, 0.25, 0.5, 0.75, 1, 2.5, 5,\n 7.5, 10,\n ],\n },\n });\n this._stableHttpClientDurationHistogram = this.meter.createHistogram(semantic_conventions_1.METRIC_HTTP_CLIENT_REQUEST_DURATION, {\n description: 'Duration of HTTP client requests.',\n unit: 's',\n valueType: api_1.ValueType.DOUBLE,\n advice: {\n explicitBucketBoundaries: [\n 0.005, 0.01, 0.025, 0.05, 0.075, 0.1, 0.25, 0.5, 0.75, 1, 2.5, 5,\n 7.5, 10,\n ],\n },\n });\n }\n _recordServerDuration(durationMs, oldAttributes, stableAttributes) {\n if (this._semconvStability & instrumentation_1.SemconvStability.OLD) {\n // old histogram is counted in MS\n this._oldHttpServerDurationHistogram.record(durationMs, oldAttributes);\n }\n if (this._semconvStability & instrumentation_1.SemconvStability.STABLE) {\n // stable histogram is counted in S\n this._stableHttpServerDurationHistogram.record(durationMs / 1000, stableAttributes);\n }\n }\n _recordClientDuration(durationMs, oldAttributes, stableAttributes) {\n if (this._semconvStability & instrumentation_1.SemconvStability.OLD) {\n // old histogram is counted in MS\n this._oldHttpClientDurationHistogram.record(durationMs, oldAttributes);\n }\n if (this._semconvStability & instrumentation_1.SemconvStability.STABLE) {\n // stable histogram is counted in S\n this._stableHttpClientDurationHistogram.record(durationMs / 1000, stableAttributes);\n }\n }\n setConfig(config = {}) {\n super.setConfig(config);\n this._headerCapture = this._createHeaderCapture(this._semconvStability);\n }\n init() {\n return [this._getHttpsInstrumentation(), this._getHttpInstrumentation()];\n }\n _getHttpInstrumentation() {\n return new instrumentation_1.InstrumentationNodeModuleDefinition('http', ['*'], (moduleExports) => {\n // Guard against double-instrumentation, if loaded by both `require`\n // and `import`.\n if (this._httpPatched) {\n return moduleExports;\n }\n this._httpPatched = true;\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const isESM = moduleExports[Symbol.toStringTag] === 'Module';\n if (!this.getConfig().disableOutgoingRequestInstrumentation) {\n const patchedRequest = this._wrap(moduleExports, 'request', this._getPatchOutgoingRequestFunction('http'));\n const patchedGet = this._wrap(moduleExports, 'get', this._getPatchOutgoingGetFunction(patchedRequest));\n if (isESM) {\n // To handle `import http from 'http'`, which returns the default\n // export, we need to set `module.default.*`.\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n moduleExports.default.request = patchedRequest;\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n moduleExports.default.get = patchedGet;\n }\n }\n if (!this.getConfig().disableIncomingRequestInstrumentation) {\n this._wrap(moduleExports.Server.prototype, 'emit', this._getPatchIncomingRequestFunction('http'));\n }\n return moduleExports;\n }, (moduleExports) => {\n this._httpPatched = false;\n if (moduleExports === undefined)\n return;\n if (!this.getConfig().disableOutgoingRequestInstrumentation) {\n this._unwrap(moduleExports, 'request');\n this._unwrap(moduleExports, 'get');\n }\n if (!this.getConfig().disableIncomingRequestInstrumentation) {\n this._unwrap(moduleExports.Server.prototype, 'emit');\n }\n });\n }\n _getHttpsInstrumentation() {\n return new instrumentation_1.InstrumentationNodeModuleDefinition('https', ['*'], (moduleExports) => {\n // Guard against double-instrumentation, if loaded by both `require`\n // and `import`.\n if (this._httpsPatched) {\n return moduleExports;\n }\n this._httpsPatched = true;\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const isESM = moduleExports[Symbol.toStringTag] === 'Module';\n if (!this.getConfig().disableOutgoingRequestInstrumentation) {\n const patchedRequest = this._wrap(moduleExports, 'request', this._getPatchHttpsOutgoingRequestFunction('https'));\n const patchedGet = this._wrap(moduleExports, 'get', this._getPatchHttpsOutgoingGetFunction(patchedRequest));\n if (isESM) {\n // To handle `import https from 'https'`, which returns the default\n // export, we need to set `module.default.*`.\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n moduleExports.default.request = patchedRequest;\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n moduleExports.default.get = patchedGet;\n }\n }\n if (!this.getConfig().disableIncomingRequestInstrumentation) {\n this._wrap(moduleExports.Server.prototype, 'emit', this._getPatchIncomingRequestFunction('https'));\n }\n return moduleExports;\n }, (moduleExports) => {\n this._httpsPatched = false;\n if (moduleExports === undefined)\n return;\n if (!this.getConfig().disableOutgoingRequestInstrumentation) {\n this._unwrap(moduleExports, 'request');\n this._unwrap(moduleExports, 'get');\n }\n if (!this.getConfig().disableIncomingRequestInstrumentation) {\n this._unwrap(moduleExports.Server.prototype, 'emit');\n }\n });\n }\n /**\n * Creates spans for incoming requests, restoring spans' context if applied.\n */\n _getPatchIncomingRequestFunction(component) {\n return (original) => {\n return this._incomingRequestFunction(component, original);\n };\n }\n /**\n * Creates spans for outgoing requests, sending spans' context for distributed\n * tracing.\n */\n _getPatchOutgoingRequestFunction(component) {\n return (original) => {\n return this._outgoingRequestFunction(component, original);\n };\n }\n _getPatchOutgoingGetFunction(clientRequest) {\n return (_original) => {\n // Re-implement http.get. This needs to be done (instead of using\n // getPatchOutgoingRequestFunction to patch it) because we need to\n // set the trace context header before the returned http.ClientRequest is\n // ended. The Node.js docs state that the only differences between\n // request and get are that (1) get defaults to the HTTP GET method and\n // (2) the returned request object is ended immediately. The former is\n // already true (at least in supported Node versions up to v10), so we\n // simply follow the latter. Ref:\n // https://nodejs.org/dist/latest/docs/api/http.html#http_http_get_options_callback\n // https://github.com/googleapis/cloud-trace-nodejs/blob/master/src/instrumentations/instrumentation-http.ts#L198\n return function outgoingGetRequest(options, ...args) {\n const req = clientRequest(options, ...args);\n req.end();\n return req;\n };\n };\n }\n /** Patches HTTPS outgoing requests */\n _getPatchHttpsOutgoingRequestFunction(component) {\n return (original) => {\n const instrumentation = this;\n return function httpsOutgoingRequest(\n // eslint-disable-next-line n/no-unsupported-features/node-builtins\n options, ...args) {\n // Makes sure options will have default HTTPS parameters\n if (component === 'https' &&\n typeof options === 'object' &&\n options?.constructor?.name !== 'URL') {\n options = Object.assign({}, options);\n instrumentation._setDefaultOptions(options);\n }\n return instrumentation._getPatchOutgoingRequestFunction(component)(original)(options, ...args);\n };\n };\n }\n _setDefaultOptions(options) {\n options.protocol = options.protocol || 'https:';\n options.port = options.port || 443;\n }\n /** Patches HTTPS outgoing get requests */\n _getPatchHttpsOutgoingGetFunction(clientRequest) {\n return (original) => {\n const instrumentation = this;\n return function httpsOutgoingRequest(\n // eslint-disable-next-line n/no-unsupported-features/node-builtins\n options, ...args) {\n return instrumentation._getPatchOutgoingGetFunction(clientRequest)(original)(options, ...args);\n };\n };\n }\n /**\n * Attach event listeners to a client request to end span and add span attributes.\n *\n * @param request The original request object.\n * @param span representing the current operation\n * @param startTime representing the start time of the request to calculate duration in Metric\n * @param oldMetricAttributes metric attributes for old semantic conventions\n * @param stableMetricAttributes metric attributes for new semantic conventions\n */\n _traceClientRequest(request, span, startTime, oldMetricAttributes, stableMetricAttributes) {\n if (this.getConfig().requestHook) {\n this._callRequestHook(span, request);\n }\n /**\n * Determines if the request has errored or the response has ended/errored.\n */\n let responseFinished = false;\n /*\n * User 'response' event listeners can be added before our listener,\n * force our listener to be the first, so response emitter is bound\n * before any user listeners are added to it.\n */\n request.prependListener('response', (response) => {\n this._diag.debug('outgoingRequest on response()');\n if (request.listenerCount('response') <= 1) {\n response.resume();\n }\n const responseAttributes = (0, utils_1.getOutgoingRequestAttributesOnResponse)(response, this._semconvStability);\n span.setAttributes(responseAttributes);\n oldMetricAttributes = Object.assign(oldMetricAttributes, (0, utils_1.getOutgoingRequestMetricAttributesOnResponse)(responseAttributes));\n stableMetricAttributes = Object.assign(stableMetricAttributes, (0, utils_1.getOutgoingStableRequestMetricAttributesOnResponse)(responseAttributes));\n if (this.getConfig().responseHook) {\n this._callResponseHook(span, response);\n }\n span.setAttributes(this._headerCapture.client.captureRequestHeaders(header => request.getHeader(header)));\n span.setAttributes(this._headerCapture.client.captureResponseHeaders(header => response.headers[header]));\n api_1.context.bind(api_1.context.active(), response);\n const endHandler = () => {\n this._diag.debug('outgoingRequest on end()');\n if (responseFinished) {\n return;\n }\n responseFinished = true;\n let status;\n if (response.aborted && !response.complete) {\n status = { code: api_1.SpanStatusCode.ERROR };\n }\n else {\n // behaves same for new and old semconv\n status = {\n code: (0, utils_1.parseResponseStatus)(api_1.SpanKind.CLIENT, response.statusCode),\n };\n }\n span.setStatus(status);\n if (this.getConfig().applyCustomAttributesOnSpan) {\n (0, instrumentation_1.safeExecuteInTheMiddle)(() => this.getConfig().applyCustomAttributesOnSpan(span, request, response), () => { }, true);\n }\n this._closeHttpSpan(span, api_1.SpanKind.CLIENT, startTime, oldMetricAttributes, stableMetricAttributes);\n };\n response.on('end', endHandler);\n response.on(events_1.errorMonitor, (error) => {\n this._diag.debug('outgoingRequest on error()', error);\n if (responseFinished) {\n return;\n }\n responseFinished = true;\n this._onOutgoingRequestError(span, oldMetricAttributes, stableMetricAttributes, startTime, error);\n });\n });\n request.on('close', () => {\n this._diag.debug('outgoingRequest on request close()');\n if (request.aborted || responseFinished) {\n return;\n }\n responseFinished = true;\n this._closeHttpSpan(span, api_1.SpanKind.CLIENT, startTime, oldMetricAttributes, stableMetricAttributes);\n });\n request.on(events_1.errorMonitor, (error) => {\n this._diag.debug('outgoingRequest on request error()', error);\n if (responseFinished) {\n return;\n }\n responseFinished = true;\n this._onOutgoingRequestError(span, oldMetricAttributes, stableMetricAttributes, startTime, error);\n });\n this._diag.debug('http.ClientRequest return request');\n return request;\n }\n _incomingRequestFunction(component, original) {\n const instrumentation = this;\n return function incomingRequest(event, ...args) {\n // Only traces request events\n if (event !== 'request') {\n return original.apply(this, [event, ...args]);\n }\n const request = args[0];\n const response = args[1];\n const method = request.method || 'GET';\n instrumentation._diag.debug(`${component} instrumentation incomingRequest`);\n if ((0, instrumentation_1.safeExecuteInTheMiddle)(() => instrumentation.getConfig().ignoreIncomingRequestHook?.(request), (e) => {\n if (e != null) {\n instrumentation._diag.error('caught ignoreIncomingRequestHook error: ', e);\n }\n }, true)) {\n return api_1.context.with((0, core_1.suppressTracing)(api_1.context.active()), () => {\n api_1.context.bind(api_1.context.active(), request);\n api_1.context.bind(api_1.context.active(), response);\n return original.apply(this, [event, ...args]);\n });\n }\n const headers = request.headers;\n const spanAttributes = (0, utils_1.getIncomingRequestAttributes)(request, {\n component: component,\n serverName: instrumentation.getConfig().serverName,\n hookAttributes: instrumentation._callStartSpanHook(request, instrumentation.getConfig().startIncomingSpanHook),\n semconvStability: instrumentation._semconvStability,\n enableSyntheticSourceDetection: instrumentation.getConfig().enableSyntheticSourceDetection || false,\n }, instrumentation._diag);\n Object.assign(spanAttributes, instrumentation._headerCapture.server.captureRequestHeaders(header => request.headers[header]));\n const spanOptions = {\n kind: api_1.SpanKind.SERVER,\n attributes: spanAttributes,\n };\n const startTime = (0, core_1.hrTime)();\n const oldMetricAttributes = (0, utils_1.getIncomingRequestMetricAttributes)(spanAttributes);\n // request method and url.scheme are both required span attributes\n const stableMetricAttributes = {\n [semantic_conventions_1.ATTR_HTTP_REQUEST_METHOD]: spanAttributes[semantic_conventions_1.ATTR_HTTP_REQUEST_METHOD],\n [semantic_conventions_1.ATTR_URL_SCHEME]: spanAttributes[semantic_conventions_1.ATTR_URL_SCHEME],\n };\n // recommended if and only if one was sent, same as span recommendation\n if (spanAttributes[semantic_conventions_1.ATTR_NETWORK_PROTOCOL_VERSION]) {\n stableMetricAttributes[semantic_conventions_1.ATTR_NETWORK_PROTOCOL_VERSION] =\n spanAttributes[semantic_conventions_1.ATTR_NETWORK_PROTOCOL_VERSION];\n }\n const ctx = api_1.propagation.extract(api_1.ROOT_CONTEXT, headers);\n const span = instrumentation._startHttpSpan(method, spanOptions, ctx);\n const rpcMetadata = {\n type: core_1.RPCType.HTTP,\n span,\n };\n return api_1.context.with((0, core_1.setRPCMetadata)(api_1.trace.setSpan(ctx, span), rpcMetadata), () => {\n api_1.context.bind(api_1.context.active(), request);\n api_1.context.bind(api_1.context.active(), response);\n if (instrumentation.getConfig().requestHook) {\n instrumentation._callRequestHook(span, request);\n }\n if (instrumentation.getConfig().responseHook) {\n instrumentation._callResponseHook(span, response);\n }\n // After 'error', no further events other than 'close' should be emitted.\n let hasError = false;\n response.on('close', () => {\n if (hasError) {\n return;\n }\n instrumentation._onServerResponseFinish(request, response, span, oldMetricAttributes, stableMetricAttributes, startTime);\n });\n response.on(events_1.errorMonitor, (err) => {\n hasError = true;\n instrumentation._onServerResponseError(span, oldMetricAttributes, stableMetricAttributes, startTime, err);\n });\n return (0, instrumentation_1.safeExecuteInTheMiddle)(() => original.apply(this, [event, ...args]), error => {\n if (error) {\n instrumentation._onServerResponseError(span, oldMetricAttributes, stableMetricAttributes, startTime, error);\n throw error;\n }\n });\n });\n };\n }\n _outgoingRequestFunction(component, original) {\n const instrumentation = this;\n return function outgoingRequest(options, ...args) {\n if (!(0, utils_1.isValidOptionsType)(options)) {\n return original.apply(this, [options, ...args]);\n }\n const extraOptions = typeof args[0] === 'object' &&\n (typeof options === 'string' || options instanceof url.URL)\n ? args.shift()\n : undefined;\n const { method, invalidUrl, optionsParsed } = (0, utils_1.getRequestInfo)(instrumentation._diag, options, extraOptions);\n if ((0, instrumentation_1.safeExecuteInTheMiddle)(() => instrumentation\n .getConfig()\n .ignoreOutgoingRequestHook?.(optionsParsed), (e) => {\n if (e != null) {\n instrumentation._diag.error('caught ignoreOutgoingRequestHook error: ', e);\n }\n }, true)) {\n return original.apply(this, [optionsParsed, ...args]);\n }\n const { hostname, port } = (0, utils_1.extractHostnameAndPort)(optionsParsed);\n const attributes = (0, utils_1.getOutgoingRequestAttributes)(optionsParsed, {\n component,\n port,\n hostname,\n hookAttributes: instrumentation._callStartSpanHook(optionsParsed, instrumentation.getConfig().startOutgoingSpanHook),\n redactedQueryParams: instrumentation.getConfig().redactedQueryParams, // Added config for adding custom query strings\n }, instrumentation._semconvStability, instrumentation.getConfig().enableSyntheticSourceDetection || false);\n const startTime = (0, core_1.hrTime)();\n const oldMetricAttributes = (0, utils_1.getOutgoingRequestMetricAttributes)(attributes);\n // request method, server address, and server port are both required span attributes\n const stableMetricAttributes = {\n [semantic_conventions_1.ATTR_HTTP_REQUEST_METHOD]: attributes[semantic_conventions_1.ATTR_HTTP_REQUEST_METHOD],\n [semantic_conventions_1.ATTR_SERVER_ADDRESS]: attributes[semantic_conventions_1.ATTR_SERVER_ADDRESS],\n [semantic_conventions_1.ATTR_SERVER_PORT]: attributes[semantic_conventions_1.ATTR_SERVER_PORT],\n };\n // required if and only if one was sent, same as span requirement\n if (attributes[semantic_conventions_1.ATTR_HTTP_RESPONSE_STATUS_CODE]) {\n stableMetricAttributes[semantic_conventions_1.ATTR_HTTP_RESPONSE_STATUS_CODE] =\n attributes[semantic_conventions_1.ATTR_HTTP_RESPONSE_STATUS_CODE];\n }\n // recommended if and only if one was sent, same as span recommendation\n if (attributes[semantic_conventions_1.ATTR_NETWORK_PROTOCOL_VERSION]) {\n stableMetricAttributes[semantic_conventions_1.ATTR_NETWORK_PROTOCOL_VERSION] =\n attributes[semantic_conventions_1.ATTR_NETWORK_PROTOCOL_VERSION];\n }\n const spanOptions = {\n kind: api_1.SpanKind.CLIENT,\n attributes,\n };\n const span = instrumentation._startHttpSpan(method, spanOptions);\n const parentContext = api_1.context.active();\n const requestContext = api_1.trace.setSpan(parentContext, span);\n if (!optionsParsed.headers) {\n optionsParsed.headers = {};\n }\n else {\n // Make a copy of the headers object to avoid mutating an object the\n // caller might have a reference to.\n optionsParsed.headers = Object.assign({}, optionsParsed.headers);\n }\n api_1.propagation.inject(requestContext, optionsParsed.headers);\n return api_1.context.with(requestContext, () => {\n /*\n * The response callback is registered before ClientRequest is bound,\n * thus it is needed to bind it before the function call.\n */\n const cb = args[args.length - 1];\n if (typeof cb === 'function') {\n args[args.length - 1] = api_1.context.bind(parentContext, cb);\n }\n const request = (0, instrumentation_1.safeExecuteInTheMiddle)(() => {\n if (invalidUrl) {\n // we know that the url is invalid, there's no point in injecting context as it will fail validation.\n // Passing in what the user provided will give the user an error that matches what they'd see without\n // the instrumentation.\n return original.apply(this, [options, ...args]);\n }\n else {\n return original.apply(this, [optionsParsed, ...args]);\n }\n }, error => {\n if (error) {\n instrumentation._onOutgoingRequestError(span, oldMetricAttributes, stableMetricAttributes, startTime, error);\n throw error;\n }\n });\n instrumentation._diag.debug(`${component} instrumentation outgoingRequest`);\n api_1.context.bind(parentContext, request);\n return instrumentation._traceClientRequest(request, span, startTime, oldMetricAttributes, stableMetricAttributes);\n });\n };\n }\n _onServerResponseFinish(request, response, span, oldMetricAttributes, stableMetricAttributes, startTime) {\n const attributes = (0, utils_1.getIncomingRequestAttributesOnResponse)(request, response, this._semconvStability);\n oldMetricAttributes = Object.assign(oldMetricAttributes, (0, utils_1.getIncomingRequestMetricAttributesOnResponse)(attributes));\n stableMetricAttributes = Object.assign(stableMetricAttributes, (0, utils_1.getIncomingStableRequestMetricAttributesOnResponse)(attributes));\n span.setAttributes(this._headerCapture.server.captureResponseHeaders(header => response.getHeader(header)));\n span.setAttributes(attributes).setStatus({\n code: (0, utils_1.parseResponseStatus)(api_1.SpanKind.SERVER, response.statusCode),\n });\n const route = attributes[semantic_conventions_1.ATTR_HTTP_ROUTE];\n if (route) {\n span.updateName(`${request.method || 'GET'} ${route}`);\n }\n if (this.getConfig().applyCustomAttributesOnSpan) {\n (0, instrumentation_1.safeExecuteInTheMiddle)(() => this.getConfig().applyCustomAttributesOnSpan(span, request, response), () => { }, true);\n }\n this._closeHttpSpan(span, api_1.SpanKind.SERVER, startTime, oldMetricAttributes, stableMetricAttributes);\n }\n _onOutgoingRequestError(span, oldMetricAttributes, stableMetricAttributes, startTime, error) {\n (0, utils_1.setSpanWithError)(span, error, this._semconvStability);\n stableMetricAttributes[semantic_conventions_1.ATTR_ERROR_TYPE] = error.name;\n this._closeHttpSpan(span, api_1.SpanKind.CLIENT, startTime, oldMetricAttributes, stableMetricAttributes);\n }\n _onServerResponseError(span, oldMetricAttributes, stableMetricAttributes, startTime, error) {\n (0, utils_1.setSpanWithError)(span, error, this._semconvStability);\n stableMetricAttributes[semantic_conventions_1.ATTR_ERROR_TYPE] = error.name;\n this._closeHttpSpan(span, api_1.SpanKind.SERVER, startTime, oldMetricAttributes, stableMetricAttributes);\n }\n _startHttpSpan(name, options, ctx = api_1.context.active()) {\n /*\n * If a parent is required but not present, we use a `NoopSpan` to still\n * propagate context without recording it.\n */\n const requireParent = options.kind === api_1.SpanKind.CLIENT\n ? this.getConfig().requireParentforOutgoingSpans\n : this.getConfig().requireParentforIncomingSpans;\n let span;\n const currentSpan = api_1.trace.getSpan(ctx);\n if (requireParent === true &&\n (!currentSpan || !api_1.trace.isSpanContextValid(currentSpan.spanContext()))) {\n span = api_1.trace.wrapSpanContext(api_1.INVALID_SPAN_CONTEXT);\n }\n else if (requireParent === true && currentSpan?.spanContext().isRemote) {\n span = currentSpan;\n }\n else {\n span = this.tracer.startSpan(name, options, ctx);\n }\n this._spanNotEnded.add(span);\n return span;\n }\n _closeHttpSpan(span, spanKind, startTime, oldMetricAttributes, stableMetricAttributes) {\n if (!this._spanNotEnded.has(span)) {\n return;\n }\n span.end();\n this._spanNotEnded.delete(span);\n // Record metrics\n const duration = (0, core_1.hrTimeToMilliseconds)((0, core_1.hrTimeDuration)(startTime, (0, core_1.hrTime)()));\n if (spanKind === api_1.SpanKind.SERVER) {\n this._recordServerDuration(duration, oldMetricAttributes, stableMetricAttributes);\n }\n else if (spanKind === api_1.SpanKind.CLIENT) {\n this._recordClientDuration(duration, oldMetricAttributes, stableMetricAttributes);\n }\n }\n _callResponseHook(span, response) {\n (0, instrumentation_1.safeExecuteInTheMiddle)(() => this.getConfig().responseHook(span, response), () => { }, true);\n }\n _callRequestHook(span, request) {\n (0, instrumentation_1.safeExecuteInTheMiddle)(() => this.getConfig().requestHook(span, request), () => { }, true);\n }\n _callStartSpanHook(request, hookFunc) {\n if (typeof hookFunc === 'function') {\n return (0, instrumentation_1.safeExecuteInTheMiddle)(() => hookFunc(request), () => { }, true);\n }\n }\n _createHeaderCapture(semconvStability) {\n const config = this.getConfig();\n return {\n client: {\n captureRequestHeaders: (0, utils_1.headerCapture)('request', config.headersToSpanAttributes?.client?.requestHeaders ?? [], semconvStability),\n captureResponseHeaders: (0, utils_1.headerCapture)('response', config.headersToSpanAttributes?.client?.responseHeaders ?? [], semconvStability),\n },\n server: {\n captureRequestHeaders: (0, utils_1.headerCapture)('request', config.headersToSpanAttributes?.server?.requestHeaders ?? [], semconvStability),\n captureResponseHeaders: (0, utils_1.headerCapture)('response', config.headersToSpanAttributes?.server?.responseHeaders ?? [], semconvStability),\n },\n };\n }\n}\nexports.HttpInstrumentation = HttpInstrumentation;\n//# sourceMappingURL=http.js.map//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKHNzcikvLi9ub2RlX21vZHVsZXMvLnBucG0vQG9wZW50ZWxlbWV0cnkraW5zdHJ1bWVudGF0aW9uLWh0dHBAMC4yMTQuMF9Ab3BlbnRlbGVtZXRyeSthcGlAMS45LjEvbm9kZV9tb2R1bGVzL0BvcGVudGVsZW1ldHJ5L2luc3RydW1lbnRhdGlvbi1odHRwL2J1aWxkL3NyYy9odHRwLmpzIiwibWFwcGluZ3MiOiJBQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQSw4Q0FBNkMsRUFBRSxhQUFhLEVBQUM7QUFDN0QsMkJBQTJCO0FBQzNCLGNBQWMsbUJBQU8sQ0FBQyxrSUFBb0I7QUFDMUMsZUFBZSxtQkFBTyxDQUFDLDhKQUFxQjtBQUM1QyxZQUFZLG1CQUFPLENBQUMsZ0JBQUs7QUFDekIsa0JBQWtCLG1CQUFPLENBQUMsd0xBQVc7QUFDckMsMEJBQTBCLG1CQUFPLENBQUMsaU1BQWdDO0FBQ2xFLGlCQUFpQixtQkFBTyxDQUFDLHNCQUFRO0FBQ2pDLCtCQUErQixtQkFBTyxDQUFDLHNMQUFxQztBQUM1RSxnQkFBZ0IsbUJBQU8sQ0FBQyxvTEFBUztBQUNqQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDJCQUEyQjtBQUMzQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2IsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHlCQUF5QjtBQUN6QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw4Q0FBOEM7QUFDOUM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsK0JBQStCO0FBQy9CO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHdKQUF3SjtBQUN4SjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDJDQUEyQyxXQUFXO0FBQ3REO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUJBQWlCO0FBQ2pCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUJBQWlCO0FBQ2pCO0FBQ0E7QUFDQTtBQUNBLGlCQUFpQjtBQUNqQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUJBQWlCO0FBQ2pCLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxvQkFBb0Isb0NBQW9DO0FBQ3hEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0Esb0JBQW9CLGlCQUFpQjtBQUNyQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx3REFBd0Q7QUFDeEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUJBQWlCO0FBQ2pCO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUJBQWlCO0FBQ2pCLCtDQUErQyxXQUFXO0FBQzFEO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQSwrQkFBK0IseUJBQXlCLEVBQUUsTUFBTTtBQUNoRTtBQUNBO0FBQ0EsZ0pBQWdKO0FBQ2hKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esb0hBQW9IO0FBQ3BIO0FBQ0E7QUFDQSxrSEFBa0g7QUFDbEg7QUFDQTtBQUNBO0FBQ0EsbUdBQW1HO0FBQ25HO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBLDJCQUEyQjtBQUMzQiIsInNvdXJjZXMiOlsiL1VzZXJzL21hcmNtaW50ZWwvUHJvamVjdHMvZS10aWIuY29tL25vZGVfbW9kdWxlcy8ucG5wbS9Ab3BlbnRlbGVtZXRyeStpbnN0cnVtZW50YXRpb24taHR0cEAwLjIxNC4wX0BvcGVudGVsZW1ldHJ5K2FwaUAxLjkuMS9ub2RlX21vZHVsZXMvQG9wZW50ZWxlbWV0cnkvaW5zdHJ1bWVudGF0aW9uLWh0dHAvYnVpbGQvc3JjL2h0dHAuanMiXSwic291cmNlc0NvbnRlbnQiOlsiXCJ1c2Ugc3RyaWN0XCI7XG4vKlxuICogQ29weXJpZ2h0IFRoZSBPcGVuVGVsZW1ldHJ5IEF1dGhvcnNcbiAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wXG4gKi9cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMuSHR0cEluc3RydW1lbnRhdGlvbiA9IHZvaWQgMDtcbmNvbnN0IGFwaV8xID0gcmVxdWlyZShcIkBvcGVudGVsZW1ldHJ5L2FwaVwiKTtcbmNvbnN0IGNvcmVfMSA9IHJlcXVpcmUoXCJAb3BlbnRlbGVtZXRyeS9jb3JlXCIpO1xuY29uc3QgdXJsID0gcmVxdWlyZShcInVybFwiKTtcbmNvbnN0IHZlcnNpb25fMSA9IHJlcXVpcmUoXCIuL3ZlcnNpb25cIik7XG5jb25zdCBpbnN0cnVtZW50YXRpb25fMSA9IHJlcXVpcmUoXCJAb3BlbnRlbGVtZXRyeS9pbnN0cnVtZW50YXRpb25cIik7XG5jb25zdCBldmVudHNfMSA9IHJlcXVpcmUoXCJldmVudHNcIik7XG5jb25zdCBzZW1hbnRpY19jb252ZW50aW9uc18xID0gcmVxdWlyZShcIkBvcGVudGVsZW1ldHJ5L3NlbWFudGljLWNvbnZlbnRpb25zXCIpO1xuY29uc3QgdXRpbHNfMSA9IHJlcXVpcmUoXCIuL3V0aWxzXCIpO1xuLyoqXG4gKiBgbm9kZTpodHRwYCBhbmQgYG5vZGU6aHR0cHNgIGluc3RydW1lbnRhdGlvbiBmb3IgT3BlblRlbGVtZXRyeVxuICovXG5jbGFzcyBIdHRwSW5zdHJ1bWVudGF0aW9uIGV4dGVuZHMgaW5zdHJ1bWVudGF0aW9uXzEuSW5zdHJ1bWVudGF0aW9uQmFzZSB7XG4gICAgLyoqIGtlZXAgdHJhY2sgb24gc3BhbnMgbm90IGVuZGVkICovXG4gICAgX3NwYW5Ob3RFbmRlZCA9IG5ldyBXZWFrU2V0KCk7XG4gICAgX2hlYWRlckNhcHR1cmU7XG4gICAgX2h0dHBQYXRjaGVkID0gZmFsc2U7XG4gICAgX2h0dHBzUGF0Y2hlZCA9IGZhbHNlO1xuICAgIF9zZW1jb252U3RhYmlsaXR5ID0gaW5zdHJ1bWVudGF0aW9uXzEuU2VtY29udlN0YWJpbGl0eS5PTEQ7XG4gICAgY29uc3RydWN0b3IoY29uZmlnID0ge30pIHtcbiAgICAgICAgc3VwZXIoJ0BvcGVudGVsZW1ldHJ5L2luc3RydW1lbnRhdGlvbi1odHRwJywgdmVyc2lvbl8xLlZFUlNJT04sIGNvbmZpZyk7XG4gICAgICAgIHRoaXMuX3NlbWNvbnZTdGFiaWxpdHkgPSAoMCwgaW5zdHJ1bWVudGF0aW9uXzEuc2VtY29udlN0YWJpbGl0eUZyb21TdHIpKCdodHRwJywgcHJvY2Vzcy5lbnYuT1RFTF9TRU1DT05WX1NUQUJJTElUWV9PUFRfSU4pO1xuICAgICAgICB0aGlzLl9oZWFkZXJDYXB0dXJlID0gdGhpcy5fY3JlYXRlSGVhZGVyQ2FwdHVyZSh0aGlzLl9zZW1jb252U3RhYmlsaXR5KTtcbiAgICB9XG4gICAgX3VwZGF0ZU1ldHJpY0luc3RydW1lbnRzKCkge1xuICAgICAgICB0aGlzLl9vbGRIdHRwU2VydmVyRHVyYXRpb25IaXN0b2dyYW0gPSB0aGlzLm1ldGVyLmNyZWF0ZUhpc3RvZ3JhbSgnaHR0cC5zZXJ2ZXIuZHVyYXRpb24nLCB7XG4gICAgICAgICAgICBkZXNjcmlwdGlvbjogJ01lYXN1cmVzIHRoZSBkdXJhdGlvbiBvZiBpbmJvdW5kIEhUVFAgcmVxdWVzdHMuJyxcbiAgICAgICAgICAgIHVuaXQ6ICdtcycsXG4gICAgICAgICAgICB2YWx1ZVR5cGU6IGFwaV8xLlZhbHVlVHlwZS5ET1VCTEUsXG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLl9vbGRIdHRwQ2xpZW50RHVyYXRpb25IaXN0b2dyYW0gPSB0aGlzLm1ldGVyLmNyZWF0ZUhpc3RvZ3JhbSgnaHR0cC5jbGllbnQuZHVyYXRpb24nLCB7XG4gICAgICAgICAgICBkZXNjcmlwdGlvbjogJ01lYXN1cmVzIHRoZSBkdXJhdGlvbiBvZiBvdXRib3VuZCBIVFRQIHJlcXVlc3RzLicsXG4gICAgICAgICAgICB1bml0OiAnbXMnLFxuICAgICAgICAgICAgdmFsdWVUeXBlOiBhcGlfMS5WYWx1ZVR5cGUuRE9VQkxFLFxuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5fc3RhYmxlSHR0cFNlcnZlckR1cmF0aW9uSGlzdG9ncmFtID0gdGhpcy5tZXRlci5jcmVhdGVIaXN0b2dyYW0oc2VtYW50aWNfY29udmVudGlvbnNfMS5NRVRSSUNfSFRUUF9TRVJWRVJfUkVRVUVTVF9EVVJBVElPTiwge1xuICAgICAgICAgICAgZGVzY3JpcHRpb246ICdEdXJhdGlvbiBvZiBIVFRQIHNlcnZlciByZXF1ZXN0cy4nLFxuICAgICAgICAgICAgdW5pdDogJ3MnLFxuICAgICAgICAgICAgdmFsdWVUeXBlOiBhcGlfMS5WYWx1ZVR5cGUuRE9VQkxFLFxuICAgICAgICAgICAgYWR2aWNlOiB7XG4gICAgICAgICAgICAgICAgZXhwbGljaXRCdWNrZXRCb3VuZGFyaWVzOiBbXG4gICAgICAgICAgICAgICAgICAgIDAuMDA1LCAwLjAxLCAwLjAyNSwgMC4wNSwgMC4wNzUsIDAuMSwgMC4yNSwgMC41LCAwLjc1LCAxLCAyLjUsIDUsXG4gICAgICAgICAgICAgICAgICAgIDcuNSwgMTAsXG4gICAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLl9zdGFibGVIdHRwQ2xpZW50RHVyYXRpb25IaXN0b2dyYW0gPSB0aGlzLm1ldGVyLmNyZWF0ZUhpc3RvZ3JhbShzZW1hbnRpY19jb252ZW50aW9uc18xLk1FVFJJQ19IVFRQX0NMSUVOVF9SRVFVRVNUX0RVUkFUSU9OLCB7XG4gICAgICAgICAgICBkZXNjcmlwdGlvbjogJ0R1cmF0aW9uIG9mIEhUVFAgY2xpZW50IHJlcXVlc3RzLicsXG4gICAgICAgICAgICB1bml0OiAncycsXG4gICAgICAgICAgICB2YWx1ZVR5cGU6IGFwaV8xLlZhbHVlVHlwZS5ET1VCTEUsXG4gICAgICAgICAgICBhZHZpY2U6IHtcbiAgICAgICAgICAgICAgICBleHBsaWNpdEJ1Y2tldEJvdW5kYXJpZXM6IFtcbiAgICAgICAgICAgICAgICAgICAgMC4wMDUsIDAuMDEsIDAuMDI1LCAwLjA1LCAwLjA3NSwgMC4xLCAwLjI1LCAwLjUsIDAuNzUsIDEsIDIuNSwgNSxcbiAgICAgICAgICAgICAgICAgICAgNy41LCAxMCxcbiAgICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIF9yZWNvcmRTZXJ2ZXJEdXJhdGlvbihkdXJhdGlvbk1zLCBvbGRBdHRyaWJ1dGVzLCBzdGFibGVBdHRyaWJ1dGVzKSB7XG4gICAgICAgIGlmICh0aGlzLl9zZW1jb252U3RhYmlsaXR5ICYgaW5zdHJ1bWVudGF0aW9uXzEuU2VtY29udlN0YWJpbGl0eS5PTEQpIHtcbiAgICAgICAgICAgIC8vIG9sZCBoaXN0b2dyYW0gaXMgY291bnRlZCBpbiBNU1xuICAgICAgICAgICAgdGhpcy5fb2xkSHR0cFNlcnZlckR1cmF0aW9uSGlzdG9ncmFtLnJlY29yZChkdXJhdGlvbk1zLCBvbGRBdHRyaWJ1dGVzKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5fc2VtY29udlN0YWJpbGl0eSAmIGluc3RydW1lbnRhdGlvbl8xLlNlbWNvbnZTdGFiaWxpdHkuU1RBQkxFKSB7XG4gICAgICAgICAgICAvLyBzdGFibGUgaGlzdG9ncmFtIGlzIGNvdW50ZWQgaW4gU1xuICAgICAgICAgICAgdGhpcy5fc3RhYmxlSHR0cFNlcnZlckR1cmF0aW9uSGlzdG9ncmFtLnJlY29yZChkdXJhdGlvbk1zIC8gMTAwMCwgc3RhYmxlQXR0cmlidXRlcyk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgX3JlY29yZENsaWVudER1cmF0aW9uKGR1cmF0aW9uTXMsIG9sZEF0dHJpYnV0ZXMsIHN0YWJsZUF0dHJpYnV0ZXMpIHtcbiAgICAgICAgaWYgKHRoaXMuX3NlbWNvbnZTdGFiaWxpdHkgJiBpbnN0cnVtZW50YXRpb25fMS5TZW1jb252U3RhYmlsaXR5Lk9MRCkge1xuICAgICAgICAgICAgLy8gb2xkIGhpc3RvZ3JhbSBpcyBjb3VudGVkIGluIE1TXG4gICAgICAgICAgICB0aGlzLl9vbGRIdHRwQ2xpZW50RHVyYXRpb25IaXN0b2dyYW0ucmVjb3JkKGR1cmF0aW9uTXMsIG9sZEF0dHJpYnV0ZXMpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLl9zZW1jb252U3RhYmlsaXR5ICYgaW5zdHJ1bWVudGF0aW9uXzEuU2VtY29udlN0YWJpbGl0eS5TVEFCTEUpIHtcbiAgICAgICAgICAgIC8vIHN0YWJsZSBoaXN0b2dyYW0gaXMgY291bnRlZCBpbiBTXG4gICAgICAgICAgICB0aGlzLl9zdGFibGVIdHRwQ2xpZW50RHVyYXRpb25IaXN0b2dyYW0ucmVjb3JkKGR1cmF0aW9uTXMgLyAxMDAwLCBzdGFibGVBdHRyaWJ1dGVzKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBzZXRDb25maWcoY29uZmlnID0ge30pIHtcbiAgICAgICAgc3VwZXIuc2V0Q29uZmlnKGNvbmZpZyk7XG4gICAgICAgIHRoaXMuX2hlYWRlckNhcHR1cmUgPSB0aGlzLl9jcmVhdGVIZWFkZXJDYXB0dXJlKHRoaXMuX3NlbWNvbnZTdGFiaWxpdHkpO1xuICAgIH1cbiAgICBpbml0KCkge1xuICAgICAgICByZXR1cm4gW3RoaXMuX2dldEh0dHBzSW5zdHJ1bWVudGF0aW9uKCksIHRoaXMuX2dldEh0dHBJbnN0cnVtZW50YXRpb24oKV07XG4gICAgfVxuICAgIF9nZXRIdHRwSW5zdHJ1bWVudGF0aW9uKCkge1xuICAgICAgICByZXR1cm4gbmV3IGluc3RydW1lbnRhdGlvbl8xLkluc3RydW1lbnRhdGlvbk5vZGVNb2R1bGVEZWZpbml0aW9uKCdodHRwJywgWycqJ10sIChtb2R1bGVFeHBvcnRzKSA9PiB7XG4gICAgICAgICAgICAvLyBHdWFyZCBhZ2FpbnN0IGRvdWJsZS1pbnN0cnVtZW50YXRpb24sIGlmIGxvYWRlZCBieSBib3RoIGByZXF1aXJlYFxuICAgICAgICAgICAgLy8gYW5kIGBpbXBvcnRgLlxuICAgICAgICAgICAgaWYgKHRoaXMuX2h0dHBQYXRjaGVkKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG1vZHVsZUV4cG9ydHM7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLl9odHRwUGF0Y2hlZCA9IHRydWU7XG4gICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuICAgICAgICAgICAgY29uc3QgaXNFU00gPSBtb2R1bGVFeHBvcnRzW1N5bWJvbC50b1N0cmluZ1RhZ10gPT09ICdNb2R1bGUnO1xuICAgICAgICAgICAgaWYgKCF0aGlzLmdldENvbmZpZygpLmRpc2FibGVPdXRnb2luZ1JlcXVlc3RJbnN0cnVtZW50YXRpb24pIHtcbiAgICAgICAgICAgICAgICBjb25zdCBwYXRjaGVkUmVxdWVzdCA9IHRoaXMuX3dyYXAobW9kdWxlRXhwb3J0cywgJ3JlcXVlc3QnLCB0aGlzLl9nZXRQYXRjaE91dGdvaW5nUmVxdWVzdEZ1bmN0aW9uKCdodHRwJykpO1xuICAgICAgICAgICAgICAgIGNvbnN0IHBhdGNoZWRHZXQgPSB0aGlzLl93cmFwKG1vZHVsZUV4cG9ydHMsICdnZXQnLCB0aGlzLl9nZXRQYXRjaE91dGdvaW5nR2V0RnVuY3Rpb24ocGF0Y2hlZFJlcXVlc3QpKTtcbiAgICAgICAgICAgICAgICBpZiAoaXNFU00pIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gVG8gaGFuZGxlIGBpbXBvcnQgaHR0cCBmcm9tICdodHRwJ2AsIHdoaWNoIHJldHVybnMgdGhlIGRlZmF1bHRcbiAgICAgICAgICAgICAgICAgICAgLy8gZXhwb3J0LCB3ZSBuZWVkIHRvIHNldCBgbW9kdWxlLmRlZmF1bHQuKmAuXG4gICAgICAgICAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG4gICAgICAgICAgICAgICAgICAgIG1vZHVsZUV4cG9ydHMuZGVmYXVsdC5yZXF1ZXN0ID0gcGF0Y2hlZFJlcXVlc3Q7XG4gICAgICAgICAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG4gICAgICAgICAgICAgICAgICAgIG1vZHVsZUV4cG9ydHMuZGVmYXVsdC5nZXQgPSBwYXRjaGVkR2V0O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICghdGhpcy5nZXRDb25maWcoKS5kaXNhYmxlSW5jb21pbmdSZXF1ZXN0SW5zdHJ1bWVudGF0aW9uKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fd3JhcChtb2R1bGVFeHBvcnRzLlNlcnZlci5wcm90b3R5cGUsICdlbWl0JywgdGhpcy5fZ2V0UGF0Y2hJbmNvbWluZ1JlcXVlc3RGdW5jdGlvbignaHR0cCcpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBtb2R1bGVFeHBvcnRzO1xuICAgICAgICB9LCAobW9kdWxlRXhwb3J0cykgPT4ge1xuICAgICAgICAgICAgdGhpcy5faHR0cFBhdGNoZWQgPSBmYWxzZTtcbiAgICAgICAgICAgIGlmIChtb2R1bGVFeHBvcnRzID09PSB1bmRlZmluZWQpXG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgaWYgKCF0aGlzLmdldENvbmZpZygpLmRpc2FibGVPdXRnb2luZ1JlcXVlc3RJbnN0cnVtZW50YXRpb24pIHtcbiAgICAgICAgICAgICAgICB0aGlzLl91bndyYXAobW9kdWxlRXhwb3J0cywgJ3JlcXVlc3QnKTtcbiAgICAgICAgICAgICAgICB0aGlzLl91bndyYXAobW9kdWxlRXhwb3J0cywgJ2dldCcpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKCF0aGlzLmdldENvbmZpZygpLmRpc2FibGVJbmNvbWluZ1JlcXVlc3RJbnN0cnVtZW50YXRpb24pIHtcbiAgICAgICAgICAgICAgICB0aGlzLl91bndyYXAobW9kdWxlRXhwb3J0cy5TZXJ2ZXIucHJvdG90eXBlLCAnZW1pdCcpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG4gICAgX2dldEh0dHBzSW5zdHJ1bWVudGF0aW9uKCkge1xuICAgICAgICByZXR1cm4gbmV3IGluc3RydW1lbnRhdGlvbl8xLkluc3RydW1lbnRhdGlvbk5vZGVNb2R1bGVEZWZpbml0aW9uKCdodHRwcycsIFsnKiddLCAobW9kdWxlRXhwb3J0cykgPT4ge1xuICAgICAgICAgICAgLy8gR3VhcmQgYWdhaW5zdCBkb3VibGUtaW5zdHJ1bWVudGF0aW9uLCBpZiBsb2FkZWQgYnkgYm90aCBgcmVxdWlyZWBcbiAgICAgICAgICAgIC8vIGFuZCBgaW1wb3J0YC5cbiAgICAgICAgICAgIGlmICh0aGlzLl9odHRwc1BhdGNoZWQpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbW9kdWxlRXhwb3J0cztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuX2h0dHBzUGF0Y2hlZCA9IHRydWU7XG4gICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuICAgICAgICAgICAgY29uc3QgaXNFU00gPSBtb2R1bGVFeHBvcnRzW1N5bWJvbC50b1N0cmluZ1RhZ10gPT09ICdNb2R1bGUnO1xuICAgICAgICAgICAgaWYgKCF0aGlzLmdldENvbmZpZygpLmRpc2FibGVPdXRnb2luZ1JlcXVlc3RJbnN0cnVtZW50YXRpb24pIHtcbiAgICAgICAgICAgICAgICBjb25zdCBwYXRjaGVkUmVxdWVzdCA9IHRoaXMuX3dyYXAobW9kdWxlRXhwb3J0cywgJ3JlcXVlc3QnLCB0aGlzLl9nZXRQYXRjaEh0dHBzT3V0Z29pbmdSZXF1ZXN0RnVuY3Rpb24oJ2h0dHBzJykpO1xuICAgICAgICAgICAgICAgIGNvbnN0IHBhdGNoZWRHZXQgPSB0aGlzLl93cmFwKG1vZHVsZUV4cG9ydHMsICdnZXQnLCB0aGlzLl9nZXRQYXRjaEh0dHBzT3V0Z29pbmdHZXRGdW5jdGlvbihwYXRjaGVkUmVxdWVzdCkpO1xuICAgICAgICAgICAgICAgIGlmIChpc0VTTSkge1xuICAgICAgICAgICAgICAgICAgICAvLyBUbyBoYW5kbGUgYGltcG9ydCBodHRwcyBmcm9tICdodHRwcydgLCB3aGljaCByZXR1cm5zIHRoZSBkZWZhdWx0XG4gICAgICAgICAgICAgICAgICAgIC8vIGV4cG9ydCwgd2UgbmVlZCB0byBzZXQgYG1vZHVsZS5kZWZhdWx0LipgLlxuICAgICAgICAgICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuICAgICAgICAgICAgICAgICAgICBtb2R1bGVFeHBvcnRzLmRlZmF1bHQucmVxdWVzdCA9IHBhdGNoZWRSZXF1ZXN0O1xuICAgICAgICAgICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuICAgICAgICAgICAgICAgICAgICBtb2R1bGVFeHBvcnRzLmRlZmF1bHQuZ2V0ID0gcGF0Y2hlZEdldDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoIXRoaXMuZ2V0Q29uZmlnKCkuZGlzYWJsZUluY29taW5nUmVxdWVzdEluc3RydW1lbnRhdGlvbikge1xuICAgICAgICAgICAgICAgIHRoaXMuX3dyYXAobW9kdWxlRXhwb3J0cy5TZXJ2ZXIucHJvdG90eXBlLCAnZW1pdCcsIHRoaXMuX2dldFBhdGNoSW5jb21pbmdSZXF1ZXN0RnVuY3Rpb24oJ2h0dHBzJykpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIG1vZHVsZUV4cG9ydHM7XG4gICAgICAgIH0sIChtb2R1bGVFeHBvcnRzKSA9PiB7XG4gICAgICAgICAgICB0aGlzLl9odHRwc1BhdGNoZWQgPSBmYWxzZTtcbiAgICAgICAgICAgIGlmIChtb2R1bGVFeHBvcnRzID09PSB1bmRlZmluZWQpXG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgaWYgKCF0aGlzLmdldENvbmZpZygpLmRpc2FibGVPdXRnb2luZ1JlcXVlc3RJbnN0cnVtZW50YXRpb24pIHtcbiAgICAgICAgICAgICAgICB0aGlzLl91bndyYXAobW9kdWxlRXhwb3J0cywgJ3JlcXVlc3QnKTtcbiAgICAgICAgICAgICAgICB0aGlzLl91bndyYXAobW9kdWxlRXhwb3J0cywgJ2dldCcpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKCF0aGlzLmdldENvbmZpZygpLmRpc2FibGVJbmNvbWluZ1JlcXVlc3RJbnN0cnVtZW50YXRpb24pIHtcbiAgICAgICAgICAgICAgICB0aGlzLl91bndyYXAobW9kdWxlRXhwb3J0cy5TZXJ2ZXIucHJvdG90eXBlLCAnZW1pdCcpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBzcGFucyBmb3IgaW5jb21pbmcgcmVxdWVzdHMsIHJlc3RvcmluZyBzcGFucycgY29udGV4dCBpZiBhcHBsaWVkLlxuICAgICAqL1xuICAgIF9nZXRQYXRjaEluY29taW5nUmVxdWVzdEZ1bmN0aW9uKGNvbXBvbmVudCkge1xuICAgICAgICByZXR1cm4gKG9yaWdpbmFsKSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5faW5jb21pbmdSZXF1ZXN0RnVuY3Rpb24oY29tcG9uZW50LCBvcmlnaW5hbCk7XG4gICAgICAgIH07XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgc3BhbnMgZm9yIG91dGdvaW5nIHJlcXVlc3RzLCBzZW5kaW5nIHNwYW5zJyBjb250ZXh0IGZvciBkaXN0cmlidXRlZFxuICAgICAqIHRyYWNpbmcuXG4gICAgICovXG4gICAgX2dldFBhdGNoT3V0Z29pbmdSZXF1ZXN0RnVuY3Rpb24oY29tcG9uZW50KSB7XG4gICAgICAgIHJldHVybiAob3JpZ2luYWwpID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl9vdXRnb2luZ1JlcXVlc3RGdW5jdGlvbihjb21wb25lbnQsIG9yaWdpbmFsKTtcbiAgICAgICAgfTtcbiAgICB9XG4gICAgX2dldFBhdGNoT3V0Z29pbmdHZXRGdW5jdGlvbihjbGllbnRSZXF1ZXN0KSB7XG4gICAgICAgIHJldHVybiAoX29yaWdpbmFsKSA9PiB7XG4gICAgICAgICAgICAvLyBSZS1pbXBsZW1lbnQgaHR0cC5nZXQuIFRoaXMgbmVlZHMgdG8gYmUgZG9uZSAoaW5zdGVhZCBvZiB1c2luZ1xuICAgICAgICAgICAgLy8gZ2V0UGF0Y2hPdXRnb2luZ1JlcXVlc3RGdW5jdGlvbiB0byBwYXRjaCBpdCkgYmVjYXVzZSB3ZSBuZWVkIHRvXG4gICAgICAgICAgICAvLyBzZXQgdGhlIHRyYWNlIGNvbnRleHQgaGVhZGVyIGJlZm9yZSB0aGUgcmV0dXJuZWQgaHR0cC5DbGllbnRSZXF1ZXN0IGlzXG4gICAgICAgICAgICAvLyBlbmRlZC4gVGhlIE5vZGUuanMgZG9jcyBzdGF0ZSB0aGF0IHRoZSBvbmx5IGRpZmZlcmVuY2VzIGJldHdlZW5cbiAgICAgICAgICAgIC8vIHJlcXVlc3QgYW5kIGdldCBhcmUgdGhhdCAoMSkgZ2V0IGRlZmF1bHRzIHRvIHRoZSBIVFRQIEdFVCBtZXRob2QgYW5kXG4gICAgICAgICAgICAvLyAoMikgdGhlIHJldHVybmVkIHJlcXVlc3Qgb2JqZWN0IGlzIGVuZGVkIGltbWVkaWF0ZWx5LiBUaGUgZm9ybWVyIGlzXG4gICAgICAgICAgICAvLyBhbHJlYWR5IHRydWUgKGF0IGxlYXN0IGluIHN1cHBvcnRlZCBOb2RlIHZlcnNpb25zIHVwIHRvIHYxMCksIHNvIHdlXG4gICAgICAgICAgICAvLyBzaW1wbHkgZm9sbG93IHRoZSBsYXR0ZXIuIFJlZjpcbiAgICAgICAgICAgIC8vIGh0dHBzOi8vbm9kZWpzLm9yZy9kaXN0L2xhdGVzdC9kb2NzL2FwaS9odHRwLmh0bWwjaHR0cF9odHRwX2dldF9vcHRpb25zX2NhbGxiYWNrXG4gICAgICAgICAgICAvLyBodHRwczovL2dpdGh1Yi5jb20vZ29vZ2xlYXBpcy9jbG91ZC10cmFjZS1ub2RlanMvYmxvYi9tYXN0ZXIvc3JjL2luc3RydW1lbnRhdGlvbnMvaW5zdHJ1bWVudGF0aW9uLWh0dHAudHMjTDE5OFxuICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uIG91dGdvaW5nR2V0UmVxdWVzdChvcHRpb25zLCAuLi5hcmdzKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgcmVxID0gY2xpZW50UmVxdWVzdChvcHRpb25zLCAuLi5hcmdzKTtcbiAgICAgICAgICAgICAgICByZXEuZW5kKCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlcTtcbiAgICAgICAgICAgIH07XG4gICAgICAgIH07XG4gICAgfVxuICAgIC8qKiBQYXRjaGVzIEhUVFBTIG91dGdvaW5nIHJlcXVlc3RzICovXG4gICAgX2dldFBhdGNoSHR0cHNPdXRnb2luZ1JlcXVlc3RGdW5jdGlvbihjb21wb25lbnQpIHtcbiAgICAgICAgcmV0dXJuIChvcmlnaW5hbCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgaW5zdHJ1bWVudGF0aW9uID0gdGhpcztcbiAgICAgICAgICAgIHJldHVybiBmdW5jdGlvbiBodHRwc091dGdvaW5nUmVxdWVzdChcbiAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuL25vLXVuc3VwcG9ydGVkLWZlYXR1cmVzL25vZGUtYnVpbHRpbnNcbiAgICAgICAgICAgIG9wdGlvbnMsIC4uLmFyZ3MpIHtcbiAgICAgICAgICAgICAgICAvLyBNYWtlcyBzdXJlIG9wdGlvbnMgd2lsbCBoYXZlIGRlZmF1bHQgSFRUUFMgcGFyYW1ldGVyc1xuICAgICAgICAgICAgICAgIGlmIChjb21wb25lbnQgPT09ICdodHRwcycgJiZcbiAgICAgICAgICAgICAgICAgICAgdHlwZW9mIG9wdGlvbnMgPT09ICdvYmplY3QnICYmXG4gICAgICAgICAgICAgICAgICAgIG9wdGlvbnM/LmNvbnN0cnVjdG9yPy5uYW1lICE9PSAnVVJMJykge1xuICAgICAgICAgICAgICAgICAgICBvcHRpb25zID0gT2JqZWN0LmFzc2lnbih7fSwgb3B0aW9ucyk7XG4gICAgICAgICAgICAgICAgICAgIGluc3RydW1lbnRhdGlvbi5fc2V0RGVmYXVsdE9wdGlvbnMob3B0aW9ucyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiBpbnN0cnVtZW50YXRpb24uX2dldFBhdGNoT3V0Z29pbmdSZXF1ZXN0RnVuY3Rpb24oY29tcG9uZW50KShvcmlnaW5hbCkob3B0aW9ucywgLi4uYXJncyk7XG4gICAgICAgICAgICB9O1xuICAgICAgICB9O1xuICAgIH1cbiAgICBfc2V0RGVmYXVsdE9wdGlvbnMob3B0aW9ucykge1xuICAgICAgICBvcHRpb25zLnByb3RvY29sID0gb3B0aW9ucy5wcm90b2NvbCB8fCAnaHR0cHM6JztcbiAgICAgICAgb3B0aW9ucy5wb3J0ID0gb3B0aW9ucy5wb3J0IHx8IDQ0MztcbiAgICB9XG4gICAgLyoqIFBhdGNoZXMgSFRUUFMgb3V0Z29pbmcgZ2V0IHJlcXVlc3RzICovXG4gICAgX2dldFBhdGNoSHR0cHNPdXRnb2luZ0dldEZ1bmN0aW9uKGNsaWVudFJlcXVlc3QpIHtcbiAgICAgICAgcmV0dXJuIChvcmlnaW5hbCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgaW5zdHJ1bWVudGF0aW9uID0gdGhpcztcbiAgICAgICAgICAgIHJldHVybiBmdW5jdGlvbiBodHRwc091dGdvaW5nUmVxdWVzdChcbiAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuL25vLXVuc3VwcG9ydGVkLWZlYXR1cmVzL25vZGUtYnVpbHRpbnNcbiAgICAgICAgICAgIG9wdGlvbnMsIC4uLmFyZ3MpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gaW5zdHJ1bWVudGF0aW9uLl9nZXRQYXRjaE91dGdvaW5nR2V0RnVuY3Rpb24oY2xpZW50UmVxdWVzdCkob3JpZ2luYWwpKG9wdGlvbnMsIC4uLmFyZ3MpO1xuICAgICAgICAgICAgfTtcbiAgICAgICAgfTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQXR0YWNoIGV2ZW50IGxpc3RlbmVycyB0byBhIGNsaWVudCByZXF1ZXN0IHRvIGVuZCBzcGFuIGFuZCBhZGQgc3BhbiBhdHRyaWJ1dGVzLlxuICAgICAqXG4gICAgICogQHBhcmFtIHJlcXVlc3QgVGhlIG9yaWdpbmFsIHJlcXVlc3Qgb2JqZWN0LlxuICAgICAqIEBwYXJhbSBzcGFuIHJlcHJlc2VudGluZyB0aGUgY3VycmVudCBvcGVyYXRpb25cbiAgICAgKiBAcGFyYW0gc3RhcnRUaW1lIHJlcHJlc2VudGluZyB0aGUgc3RhcnQgdGltZSBvZiB0aGUgcmVxdWVzdCB0byBjYWxjdWxhdGUgZHVyYXRpb24gaW4gTWV0cmljXG4gICAgICogQHBhcmFtIG9sZE1ldHJpY0F0dHJpYnV0ZXMgbWV0cmljIGF0dHJpYnV0ZXMgZm9yIG9sZCBzZW1hbnRpYyBjb252ZW50aW9uc1xuICAgICAqIEBwYXJhbSBzdGFibGVNZXRyaWNBdHRyaWJ1dGVzIG1ldHJpYyBhdHRyaWJ1dGVzIGZvciBuZXcgc2VtYW50aWMgY29udmVudGlvbnNcbiAgICAgKi9cbiAgICBfdHJhY2VDbGllbnRSZXF1ZXN0KHJlcXVlc3QsIHNwYW4sIHN0YXJ0VGltZSwgb2xkTWV0cmljQXR0cmlidXRlcywgc3RhYmxlTWV0cmljQXR0cmlidXRlcykge1xuICAgICAgICBpZiAodGhpcy5nZXRDb25maWcoKS5yZXF1ZXN0SG9vaykge1xuICAgICAgICAgICAgdGhpcy5fY2FsbFJlcXVlc3RIb29rKHNwYW4sIHJlcXVlc3QpO1xuICAgICAgICB9XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBEZXRlcm1pbmVzIGlmIHRoZSByZXF1ZXN0IGhhcyBlcnJvcmVkIG9yIHRoZSByZXNwb25zZSBoYXMgZW5kZWQvZXJyb3JlZC5cbiAgICAgICAgICovXG4gICAgICAgIGxldCByZXNwb25zZUZpbmlzaGVkID0gZmFsc2U7XG4gICAgICAgIC8qXG4gICAgICAgICAqIFVzZXIgJ3Jlc3BvbnNlJyBldmVudCBsaXN0ZW5lcnMgY2FuIGJlIGFkZGVkIGJlZm9yZSBvdXIgbGlzdGVuZXIsXG4gICAgICAgICAqIGZvcmNlIG91ciBsaXN0ZW5lciB0byBiZSB0aGUgZmlyc3QsIHNvIHJlc3BvbnNlIGVtaXR0ZXIgaXMgYm91bmRcbiAgICAgICAgICogYmVmb3JlIGFueSB1c2VyIGxpc3RlbmVycyBhcmUgYWRkZWQgdG8gaXQuXG4gICAgICAgICAqL1xuICAgICAgICByZXF1ZXN0LnByZXBlbmRMaXN0ZW5lcigncmVzcG9uc2UnLCAocmVzcG9uc2UpID0+IHtcbiAgICAgICAgICAgIHRoaXMuX2RpYWcuZGVidWcoJ291dGdvaW5nUmVxdWVzdCBvbiByZXNwb25zZSgpJyk7XG4gICAgICAgICAgICBpZiAocmVxdWVzdC5saXN0ZW5lckNvdW50KCdyZXNwb25zZScpIDw9IDEpIHtcbiAgICAgICAgICAgICAgICByZXNwb25zZS5yZXN1bWUoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IHJlc3BvbnNlQXR0cmlidXRlcyA9ICgwLCB1dGlsc18xLmdldE91dGdvaW5nUmVxdWVzdEF0dHJpYnV0ZXNPblJlc3BvbnNlKShyZXNwb25zZSwgdGhpcy5fc2VtY29udlN0YWJpbGl0eSk7XG4gICAgICAgICAgICBzcGFuLnNldEF0dHJpYnV0ZXMocmVzcG9uc2VBdHRyaWJ1dGVzKTtcbiAgICAgICAgICAgIG9sZE1ldHJpY0F0dHJpYnV0ZXMgPSBPYmplY3QuYXNzaWduKG9sZE1ldHJpY0F0dHJpYnV0ZXMsICgwLCB1dGlsc18xLmdldE91dGdvaW5nUmVxdWVzdE1ldHJpY0F0dHJpYnV0ZXNPblJlc3BvbnNlKShyZXNwb25zZUF0dHJpYnV0ZXMpKTtcbiAgICAgICAgICAgIHN0YWJsZU1ldHJpY0F0dHJpYnV0ZXMgPSBPYmplY3QuYXNzaWduKHN0YWJsZU1ldHJpY0F0dHJpYnV0ZXMsICgwLCB1dGlsc18xLmdldE91dGdvaW5nU3RhYmxlUmVxdWVzdE1ldHJpY0F0dHJpYnV0ZXNPblJlc3BvbnNlKShyZXNwb25zZUF0dHJpYnV0ZXMpKTtcbiAgICAgICAgICAgIGlmICh0aGlzLmdldENvbmZpZygpLnJlc3BvbnNlSG9vaykge1xuICAgICAgICAgICAgICAgIHRoaXMuX2NhbGxSZXNwb25zZUhvb2soc3BhbiwgcmVzcG9uc2UpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgc3Bhbi5zZXRBdHRyaWJ1dGVzKHRoaXMuX2hlYWRlckNhcHR1cmUuY2xpZW50LmNhcHR1cmVSZXF1ZXN0SGVhZGVycyhoZWFkZXIgPT4gcmVxdWVzdC5nZXRIZWFkZXIoaGVhZGVyKSkpO1xuICAgICAgICAgICAgc3Bhbi5zZXRBdHRyaWJ1dGVzKHRoaXMuX2hlYWRlckNhcHR1cmUuY2xpZW50LmNhcHR1cmVSZXNwb25zZUhlYWRlcnMoaGVhZGVyID0+IHJlc3BvbnNlLmhlYWRlcnNbaGVhZGVyXSkpO1xuICAgICAgICAgICAgYXBpXzEuY29udGV4dC5iaW5kKGFwaV8xLmNvbnRleHQuYWN0aXZlKCksIHJlc3BvbnNlKTtcbiAgICAgICAgICAgIGNvbnN0IGVuZEhhbmRsZXIgPSAoKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5fZGlhZy5kZWJ1Zygnb3V0Z29pbmdSZXF1ZXN0IG9uIGVuZCgpJyk7XG4gICAgICAgICAgICAgICAgaWYgKHJlc3BvbnNlRmluaXNoZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXNwb25zZUZpbmlzaGVkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICBsZXQgc3RhdHVzO1xuICAgICAgICAgICAgICAgIGlmIChyZXNwb25zZS5hYm9ydGVkICYmICFyZXNwb25zZS5jb21wbGV0ZSkge1xuICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPSB7IGNvZGU6IGFwaV8xLlNwYW5TdGF0dXNDb2RlLkVSUk9SIH07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAvLyBiZWhhdmVzIHNhbWUgZm9yIG5ldyBhbmQgb2xkIHNlbWNvbnZcbiAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0ge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29kZTogKDAsIHV0aWxzXzEucGFyc2VSZXNwb25zZVN0YXR1cykoYXBpXzEuU3BhbktpbmQuQ0xJRU5ULCByZXNwb25zZS5zdGF0dXNDb2RlKSxcbiAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgc3Bhbi5zZXRTdGF0dXMoc3RhdHVzKTtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5nZXRDb25maWcoKS5hcHBseUN1c3RvbUF0dHJpYnV0ZXNPblNwYW4pIHtcbiAgICAgICAgICAgICAgICAgICAgKDAsIGluc3RydW1lbnRhdGlvbl8xLnNhZmVFeGVjdXRlSW5UaGVNaWRkbGUpKCgpID0+IHRoaXMuZ2V0Q29uZmlnKCkuYXBwbHlDdXN0b21BdHRyaWJ1dGVzT25TcGFuKHNwYW4sIHJlcXVlc3QsIHJlc3BvbnNlKSwgKCkgPT4geyB9LCB0cnVlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdGhpcy5fY2xvc2VIdHRwU3BhbihzcGFuLCBhcGlfMS5TcGFuS2luZC5DTElFTlQsIHN0YXJ0VGltZSwgb2xkTWV0cmljQXR0cmlidXRlcywgc3RhYmxlTWV0cmljQXR0cmlidXRlcyk7XG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgcmVzcG9uc2Uub24oJ2VuZCcsIGVuZEhhbmRsZXIpO1xuICAgICAgICAgICAgcmVzcG9uc2Uub24oZXZlbnRzXzEuZXJyb3JNb25pdG9yLCAoZXJyb3IpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLl9kaWFnLmRlYnVnKCdvdXRnb2luZ1JlcXVlc3Qgb24gZXJyb3IoKScsIGVycm9yKTtcbiAgICAgICAgICAgICAgICBpZiAocmVzcG9uc2VGaW5pc2hlZCkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJlc3BvbnNlRmluaXNoZWQgPSB0cnVlO1xuICAgICAgICAgICAgICAgIHRoaXMuX29uT3V0Z29pbmdSZXF1ZXN0RXJyb3Ioc3Bhbiwgb2xkTWV0cmljQXR0cmlidXRlcywgc3RhYmxlTWV0cmljQXR0cmlidXRlcywgc3RhcnRUaW1lLCBlcnJvcik7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgICAgIHJlcXVlc3Qub24oJ2Nsb3NlJywgKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5fZGlhZy5kZWJ1Zygnb3V0Z29pbmdSZXF1ZXN0IG9uIHJlcXVlc3QgY2xvc2UoKScpO1xuICAgICAgICAgICAgaWYgKHJlcXVlc3QuYWJvcnRlZCB8fCByZXNwb25zZUZpbmlzaGVkKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmVzcG9uc2VGaW5pc2hlZCA9IHRydWU7XG4gICAgICAgICAgICB0aGlzLl9jbG9zZUh0dHBTcGFuKHNwYW4sIGFwaV8xLlNwYW5LaW5kLkNMSUVOVCwgc3RhcnRUaW1lLCBvbGRNZXRyaWNBdHRyaWJ1dGVzLCBzdGFibGVNZXRyaWNBdHRyaWJ1dGVzKTtcbiAgICAgICAgfSk7XG4gICAgICAgIHJlcXVlc3Qub24oZXZlbnRzXzEuZXJyb3JNb25pdG9yLCAoZXJyb3IpID0+IHtcbiAgICAgICAgICAgIHRoaXMuX2RpYWcuZGVidWcoJ291dGdvaW5nUmVxdWVzdCBvbiByZXF1ZXN0IGVycm9yKCknLCBlcnJvcik7XG4gICAgICAgICAgICBpZiAocmVzcG9uc2VGaW5pc2hlZCkge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJlc3BvbnNlRmluaXNoZWQgPSB0cnVlO1xuICAgICAgICAgICAgdGhpcy5fb25PdXRnb2luZ1JlcXVlc3RFcnJvcihzcGFuLCBvbGRNZXRyaWNBdHRyaWJ1dGVzLCBzdGFibGVNZXRyaWNBdHRyaWJ1dGVzLCBzdGFydFRpbWUsIGVycm9yKTtcbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMuX2RpYWcuZGVidWcoJ2h0dHAuQ2xpZW50UmVxdWVzdCByZXR1cm4gcmVxdWVzdCcpO1xuICAgICAgICByZXR1cm4gcmVxdWVzdDtcbiAgICB9XG4gICAgX2luY29taW5nUmVxdWVzdEZ1bmN0aW9uKGNvbXBvbmVudCwgb3JpZ2luYWwpIHtcbiAgICAgICAgY29uc3QgaW5zdHJ1bWVudGF0aW9uID0gdGhpcztcbiAgICAgICAgcmV0dXJuIGZ1bmN0aW9uIGluY29taW5nUmVxdWVzdChldmVudCwgLi4uYXJncykge1xuICAgICAgICAgICAgLy8gT25seSB0cmFjZXMgcmVxdWVzdCBldmVudHNcbiAgICAgICAgICAgIGlmIChldmVudCAhPT0gJ3JlcXVlc3QnKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG9yaWdpbmFsLmFwcGx5KHRoaXMsIFtldmVudCwgLi4uYXJnc10pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgcmVxdWVzdCA9IGFyZ3NbMF07XG4gICAgICAgICAgICBjb25zdCByZXNwb25zZSA9IGFyZ3NbMV07XG4gICAgICAgICAgICBjb25zdCBtZXRob2QgPSByZXF1ZXN0Lm1ldGhvZCB8fCAnR0VUJztcbiAgICAgICAgICAgIGluc3RydW1lbnRhdGlvbi5fZGlhZy5kZWJ1ZyhgJHtjb21wb25lbnR9IGluc3RydW1lbnRhdGlvbiBpbmNvbWluZ1JlcXVlc3RgKTtcbiAgICAgICAgICAgIGlmICgoMCwgaW5zdHJ1bWVudGF0aW9uXzEuc2FmZUV4ZWN1dGVJblRoZU1pZGRsZSkoKCkgPT4gaW5zdHJ1bWVudGF0aW9uLmdldENvbmZpZygpLmlnbm9yZUluY29taW5nUmVxdWVzdEhvb2s/LihyZXF1ZXN0KSwgKGUpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoZSAhPSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgIGluc3RydW1lbnRhdGlvbi5fZGlhZy5lcnJvcignY2F1Z2h0IGlnbm9yZUluY29taW5nUmVxdWVzdEhvb2sgZXJyb3I6ICcsIGUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sIHRydWUpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGFwaV8xLmNvbnRleHQud2l0aCgoMCwgY29yZV8xLnN1cHByZXNzVHJhY2luZykoYXBpXzEuY29udGV4dC5hY3RpdmUoKSksICgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgYXBpXzEuY29udGV4dC5iaW5kKGFwaV8xLmNvbnRleHQuYWN0aXZlKCksIHJlcXVlc3QpO1xuICAgICAgICAgICAgICAgICAgICBhcGlfMS5jb250ZXh0LmJpbmQoYXBpXzEuY29udGV4dC5hY3RpdmUoKSwgcmVzcG9uc2UpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gb3JpZ2luYWwuYXBwbHkodGhpcywgW2V2ZW50LCAuLi5hcmdzXSk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCBoZWFkZXJzID0gcmVxdWVzdC5oZWFkZXJzO1xuICAgICAgICAgICAgY29uc3Qgc3BhbkF0dHJpYnV0ZXMgPSAoMCwgdXRpbHNfMS5nZXRJbmNvbWluZ1JlcXVlc3RBdHRyaWJ1dGVzKShyZXF1ZXN0LCB7XG4gICAgICAgICAgICAgICAgY29tcG9uZW50OiBjb21wb25lbnQsXG4gICAgICAgICAgICAgICAgc2VydmVyTmFtZTogaW5zdHJ1bWVudGF0aW9uLmdldENvbmZpZygpLnNlcnZlck5hbWUsXG4gICAgICAgICAgICAgICAgaG9va0F0dHJpYnV0ZXM6IGluc3RydW1lbnRhdGlvbi5fY2FsbFN0YXJ0U3Bhbkhvb2socmVxdWVzdCwgaW5zdHJ1bWVudGF0aW9uLmdldENvbmZpZygpLnN0YXJ0SW5jb21pbmdTcGFuSG9vayksXG4gICAgICAgICAgICAgICAgc2VtY29udlN0YWJpbGl0eTogaW5zdHJ1bWVudGF0aW9uLl9zZW1jb252U3RhYmlsaXR5LFxuICAgICAgICAgICAgICAgIGVuYWJsZVN5bnRoZXRpY1NvdXJjZURldGVjdGlvbjogaW5zdHJ1bWVudGF0aW9uLmdldENvbmZpZygpLmVuYWJsZVN5bnRoZXRpY1NvdXJjZURldGVjdGlvbiB8fCBmYWxzZSxcbiAgICAgICAgICAgIH0sIGluc3RydW1lbnRhdGlvbi5fZGlhZyk7XG4gICAgICAgICAgICBPYmplY3QuYXNzaWduKHNwYW5BdHRyaWJ1dGVzLCBpbnN0cnVtZW50YXRpb24uX2hlYWRlckNhcHR1cmUuc2VydmVyLmNhcHR1cmVSZXF1ZXN0SGVhZGVycyhoZWFkZXIgPT4gcmVxdWVzdC5oZWFkZXJzW2hlYWRlcl0pKTtcbiAgICAgICAgICAgIGNvbnN0IHNwYW5PcHRpb25zID0ge1xuICAgICAgICAgICAgICAgIGtpbmQ6IGFwaV8xLlNwYW5LaW5kLlNFUlZFUixcbiAgICAgICAgICAgICAgICBhdHRyaWJ1dGVzOiBzcGFuQXR0cmlidXRlcyxcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICBjb25zdCBzdGFydFRpbWUgPSAoMCwgY29yZV8xLmhyVGltZSkoKTtcbiAgICAgICAgICAgIGNvbnN0IG9sZE1ldHJpY0F0dHJpYnV0ZXMgPSAoMCwgdXRpbHNfMS5nZXRJbmNvbWluZ1JlcXVlc3RNZXRyaWNBdHRyaWJ1dGVzKShzcGFuQXR0cmlidXRlcyk7XG4gICAgICAgICAgICAvLyByZXF1ZXN0IG1ldGhvZCBhbmQgdXJsLnNjaGVtZSBhcmUgYm90aCByZXF1aXJlZCBzcGFuIGF0dHJpYnV0ZXNcbiAgICAgICAgICAgIGNvbnN0IHN0YWJsZU1ldHJpY0F0dHJpYnV0ZXMgPSB7XG4gICAgICAgICAgICAgICAgW3NlbWFudGljX2NvbnZlbnRpb25zXzEuQVRUUl9IVFRQX1JFUVVFU1RfTUVUSE9EXTogc3BhbkF0dHJpYnV0ZXNbc2VtYW50aWNfY29udmVudGlvbnNfMS5BVFRSX0hUVFBfUkVRVUVTVF9NRVRIT0RdLFxuICAgICAgICAgICAgICAgIFtzZW1hbnRpY19jb252ZW50aW9uc18xLkFUVFJfVVJMX1NDSEVNRV06IHNwYW5BdHRyaWJ1dGVzW3NlbWFudGljX2NvbnZlbnRpb25zXzEuQVRUUl9VUkxfU0NIRU1FXSxcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICAvLyByZWNvbW1lbmRlZCBpZiBhbmQgb25seSBpZiBvbmUgd2FzIHNlbnQsIHNhbWUgYXMgc3BhbiByZWNvbW1lbmRhdGlvblxuICAgICAgICAgICAgaWYgKHNwYW5BdHRyaWJ1dGVzW3NlbWFudGljX2NvbnZlbnRpb25zXzEuQVRUUl9ORVRXT1JLX1BST1RPQ09MX1ZFUlNJT05dKSB7XG4gICAgICAgICAgICAgICAgc3RhYmxlTWV0cmljQXR0cmlidXRlc1tzZW1hbnRpY19jb252ZW50aW9uc18xLkFUVFJfTkVUV09SS19QUk9UT0NPTF9WRVJTSU9OXSA9XG4gICAgICAgICAgICAgICAgICAgIHNwYW5BdHRyaWJ1dGVzW3NlbWFudGljX2NvbnZlbnRpb25zXzEuQVRUUl9ORVRXT1JLX1BST1RPQ09MX1ZFUlNJT05dO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgY3R4ID0gYXBpXzEucHJvcGFnYXRpb24uZXh0cmFjdChhcGlfMS5ST09UX0NPTlRFWFQsIGhlYWRlcnMpO1xuICAgICAgICAgICAgY29uc3Qgc3BhbiA9IGluc3RydW1lbnRhdGlvbi5fc3RhcnRIdHRwU3BhbihtZXRob2QsIHNwYW5PcHRpb25zLCBjdHgpO1xuICAgICAgICAgICAgY29uc3QgcnBjTWV0YWRhdGEgPSB7XG4gICAgICAgICAgICAgICAgdHlwZTogY29yZV8xLlJQQ1R5cGUuSFRUUCxcbiAgICAgICAgICAgICAgICBzcGFuLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIHJldHVybiBhcGlfMS5jb250ZXh0LndpdGgoKDAsIGNvcmVfMS5zZXRSUENNZXRhZGF0YSkoYXBpXzEudHJhY2Uuc2V0U3BhbihjdHgsIHNwYW4pLCBycGNNZXRhZGF0YSksICgpID0+IHtcbiAgICAgICAgICAgICAgICBhcGlfMS5jb250ZXh0LmJpbmQoYXBpXzEuY29udGV4dC5hY3RpdmUoKSwgcmVxdWVzdCk7XG4gICAgICAgICAgICAgICAgYXBpXzEuY29udGV4dC5iaW5kKGFwaV8xLmNvbnRleHQuYWN0aXZlKCksIHJlc3BvbnNlKTtcbiAgICAgICAgICAgICAgICBpZiAoaW5zdHJ1bWVudGF0aW9uLmdldENvbmZpZygpLnJlcXVlc3RIb29rKSB7XG4gICAgICAgICAgICAgICAgICAgIGluc3RydW1lbnRhdGlvbi5fY2FsbFJlcXVlc3RIb29rKHNwYW4sIHJlcXVlc3QpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoaW5zdHJ1bWVudGF0aW9uLmdldENvbmZpZygpLnJlc3BvbnNlSG9vaykge1xuICAgICAgICAgICAgICAgICAgICBpbnN0cnVtZW50YXRpb24uX2NhbGxSZXNwb25zZUhvb2soc3BhbiwgcmVzcG9uc2UpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAvLyBBZnRlciAnZXJyb3InLCBubyBmdXJ0aGVyIGV2ZW50cyBvdGhlciB0aGFuICdjbG9zZScgc2hvdWxkIGJlIGVtaXR0ZWQuXG4gICAgICAgICAgICAgICAgbGV0IGhhc0Vycm9yID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgcmVzcG9uc2Uub24oJ2Nsb3NlJywgKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBpZiAoaGFzRXJyb3IpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBpbnN0cnVtZW50YXRpb24uX29uU2VydmVyUmVzcG9uc2VGaW5pc2gocmVxdWVzdCwgcmVzcG9uc2UsIHNwYW4sIG9sZE1ldHJpY0F0dHJpYnV0ZXMsIHN0YWJsZU1ldHJpY0F0dHJpYnV0ZXMsIHN0YXJ0VGltZSk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgcmVzcG9uc2Uub24oZXZlbnRzXzEuZXJyb3JNb25pdG9yLCAoZXJyKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGhhc0Vycm9yID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgaW5zdHJ1bWVudGF0aW9uLl9vblNlcnZlclJlc3BvbnNlRXJyb3Ioc3Bhbiwgb2xkTWV0cmljQXR0cmlidXRlcywgc3RhYmxlTWV0cmljQXR0cmlidXRlcywgc3RhcnRUaW1lLCBlcnIpO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIHJldHVybiAoMCwgaW5zdHJ1bWVudGF0aW9uXzEuc2FmZUV4ZWN1dGVJblRoZU1pZGRsZSkoKCkgPT4gb3JpZ2luYWwuYXBwbHkodGhpcywgW2V2ZW50LCAuLi5hcmdzXSksIGVycm9yID0+IHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGVycm9yKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpbnN0cnVtZW50YXRpb24uX29uU2VydmVyUmVzcG9uc2VFcnJvcihzcGFuLCBvbGRNZXRyaWNBdHRyaWJ1dGVzLCBzdGFibGVNZXRyaWNBdHRyaWJ1dGVzLCBzdGFydFRpbWUsIGVycm9yKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IGVycm9yO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfTtcbiAgICB9XG4gICAgX291dGdvaW5nUmVxdWVzdEZ1bmN0aW9uKGNvbXBvbmVudCwgb3JpZ2luYWwpIHtcbiAgICAgICAgY29uc3QgaW5zdHJ1bWVudGF0aW9uID0gdGhpcztcbiAgICAgICAgcmV0dXJuIGZ1bmN0aW9uIG91dGdvaW5nUmVxdWVzdChvcHRpb25zLCAuLi5hcmdzKSB7XG4gICAgICAgICAgICBpZiAoISgwLCB1dGlsc18xLmlzVmFsaWRPcHRpb25zVHlwZSkob3B0aW9ucykpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gb3JpZ2luYWwuYXBwbHkodGhpcywgW29wdGlvbnMsIC4uLmFyZ3NdKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IGV4dHJhT3B0aW9ucyA9IHR5cGVvZiBhcmdzWzBdID09PSAnb2JqZWN0JyAmJlxuICAgICAgICAgICAgICAgICh0eXBlb2Ygb3B0aW9ucyA9PT0gJ3N0cmluZycgfHwgb3B0aW9ucyBpbnN0YW5jZW9mIHVybC5VUkwpXG4gICAgICAgICAgICAgICAgPyBhcmdzLnNoaWZ0KClcbiAgICAgICAgICAgICAgICA6IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIGNvbnN0IHsgbWV0aG9kLCBpbnZhbGlkVXJsLCBvcHRpb25zUGFyc2VkIH0gPSAoMCwgdXRpbHNfMS5nZXRSZXF1ZXN0SW5mbykoaW5zdHJ1bWVudGF0aW9uLl9kaWFnLCBvcHRpb25zLCBleHRyYU9wdGlvbnMpO1xuICAgICAgICAgICAgaWYgKCgwLCBpbnN0cnVtZW50YXRpb25fMS5zYWZlRXhlY3V0ZUluVGhlTWlkZGxlKSgoKSA9PiBpbnN0cnVtZW50YXRpb25cbiAgICAgICAgICAgICAgICAuZ2V0Q29uZmlnKClcbiAgICAgICAgICAgICAgICAuaWdub3JlT3V0Z29pbmdSZXF1ZXN0SG9vaz8uKG9wdGlvbnNQYXJzZWQpLCAoZSkgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChlICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgaW5zdHJ1bWVudGF0aW9uLl9kaWFnLmVycm9yKCdjYXVnaHQgaWdub3JlT3V0Z29pbmdSZXF1ZXN0SG9vayBlcnJvcjogJywgZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSwgdHJ1ZSkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gb3JpZ2luYWwuYXBwbHkodGhpcywgW29wdGlvbnNQYXJzZWQsIC4uLmFyZ3NdKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IHsgaG9zdG5hbWUsIHBvcnQgfSA9ICgwLCB1dGlsc18xLmV4dHJhY3RIb3N0bmFtZUFuZFBvcnQpKG9wdGlvbnNQYXJzZWQpO1xuICAgICAgICAgICAgY29uc3QgYXR0cmlidXRlcyA9ICgwLCB1dGlsc18xLmdldE91dGdvaW5nUmVxdWVzdEF0dHJpYnV0ZXMpKG9wdGlvbnNQYXJzZWQsIHtcbiAgICAgICAgICAgICAgICBjb21wb25lbnQsXG4gICAgICAgICAgICAgICAgcG9ydCxcbiAgICAgICAgICAgICAgICBob3N0bmFtZSxcbiAgICAgICAgICAgICAgICBob29rQXR0cmlidXRlczogaW5zdHJ1bWVudGF0aW9uLl9jYWxsU3RhcnRTcGFuSG9vayhvcHRpb25zUGFyc2VkLCBpbnN0cnVtZW50YXRpb24uZ2V0Q29uZmlnKCkuc3RhcnRPdXRnb2luZ1NwYW5Ib29rKSxcbiAgICAgICAgICAgICAgICByZWRhY3RlZFF1ZXJ5UGFyYW1zOiBpbnN0cnVtZW50YXRpb24uZ2V0Q29uZmlnKCkucmVkYWN0ZWRRdWVyeVBhcmFtcywgLy8gQWRkZWQgY29uZmlnIGZvciBhZGRpbmcgY3VzdG9tIHF1ZXJ5IHN0cmluZ3NcbiAgICAgICAgICAgIH0sIGluc3RydW1lbnRhdGlvbi5fc2VtY29udlN0YWJpbGl0eSwgaW5zdHJ1bWVudGF0aW9uLmdldENvbmZpZygpLmVuYWJsZVN5bnRoZXRpY1NvdXJjZURldGVjdGlvbiB8fCBmYWxzZSk7XG4gICAgICAgICAgICBjb25zdCBzdGFydFRpbWUgPSAoMCwgY29yZV8xLmhyVGltZSkoKTtcbiAgICAgICAgICAgIGNvbnN0IG9sZE1ldHJpY0F0dHJpYnV0ZXMgPSAoMCwgdXRpbHNfMS5nZXRPdXRnb2luZ1JlcXVlc3RNZXRyaWNBdHRyaWJ1dGVzKShhdHRyaWJ1dGVzKTtcbiAgICAgICAgICAgIC8vIHJlcXVlc3QgbWV0aG9kLCBzZXJ2ZXIgYWRkcmVzcywgYW5kIHNlcnZlciBwb3J0IGFyZSBib3RoIHJlcXVpcmVkIHNwYW4gYXR0cmlidXRlc1xuICAgICAgICAgICAgY29uc3Qgc3RhYmxlTWV0cmljQXR0cmlidXRlcyA9IHtcbiAgICAgICAgICAgICAgICBbc2VtYW50aWNfY29udmVudGlvbnNfMS5BVFRSX0hUVFBfUkVRVUVTVF9NRVRIT0RdOiBhdHRyaWJ1dGVzW3NlbWFudGljX2NvbnZlbnRpb25zXzEuQVRUUl9IVFRQX1JFUVVFU1RfTUVUSE9EXSxcbiAgICAgICAgICAgICAgICBbc2VtYW50aWNfY29udmVudGlvbnNfMS5BVFRSX1NFUlZFUl9BRERSRVNTXTogYXR0cmlidXRlc1tzZW1hbnRpY19jb252ZW50aW9uc18xLkFUVFJfU0VSVkVSX0FERFJFU1NdLFxuICAgICAgICAgICAgICAgIFtzZW1hbnRpY19jb252ZW50aW9uc18xLkFUVFJfU0VSVkVSX1BPUlRdOiBhdHRyaWJ1dGVzW3NlbWFudGljX2NvbnZlbnRpb25zXzEuQVRUUl9TRVJWRVJfUE9SVF0sXG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgLy8gcmVxdWlyZWQgaWYgYW5kIG9ubHkgaWYgb25lIHdhcyBzZW50LCBzYW1lIGFzIHNwYW4gcmVxdWlyZW1lbnRcbiAgICAgICAgICAgIGlmIChhdHRyaWJ1dGVzW3NlbWFudGljX2NvbnZlbnRpb25zXzEuQVRUUl9IVFRQX1JFU1BPTlNFX1NUQVRVU19DT0RFXSkge1xuICAgICAgICAgICAgICAgIHN0YWJsZU1ldHJpY0F0dHJpYnV0ZXNbc2VtYW50aWNfY29udmVudGlvbnNfMS5BVFRSX0hUVFBfUkVTUE9OU0VfU1RBVFVTX0NPREVdID1cbiAgICAgICAgICAgICAgICAgICAgYXR0cmlidXRlc1tzZW1hbnRpY19jb252ZW50aW9uc18xLkFUVFJfSFRUUF9SRVNQT05TRV9TVEFUVVNfQ09ERV07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyByZWNvbW1lbmRlZCBpZiBhbmQgb25seSBpZiBvbmUgd2FzIHNlbnQsIHNhbWUgYXMgc3BhbiByZWNvbW1lbmRhdGlvblxuICAgICAgICAgICAgaWYgKGF0dHJpYnV0ZXNbc2VtYW50aWNfY29udmVudGlvbnNfMS5BVFRSX05FVFdPUktfUFJPVE9DT0xfVkVSU0lPTl0pIHtcbiAgICAgICAgICAgICAgICBzdGFibGVNZXRyaWNBdHRyaWJ1dGVzW3NlbWFudGljX2NvbnZlbnRpb25zXzEuQVRUUl9ORVRXT1JLX1BST1RPQ09MX1ZFUlNJT05dID1cbiAgICAgICAgICAgICAgICAgICAgYXR0cmlidXRlc1tzZW1hbnRpY19jb252ZW50aW9uc18xLkFUVFJfTkVUV09SS19QUk9UT0NPTF9WRVJTSU9OXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IHNwYW5PcHRpb25zID0ge1xuICAgICAgICAgICAgICAgIGtpbmQ6IGFwaV8xLlNwYW5LaW5kLkNMSUVOVCxcbiAgICAgICAgICAgICAgICBhdHRyaWJ1dGVzLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIGNvbnN0IHNwYW4gPSBpbnN0cnVtZW50YXRpb24uX3N0YXJ0SHR0cFNwYW4obWV0aG9kLCBzcGFuT3B0aW9ucyk7XG4gICAgICAgICAgICBjb25zdCBwYXJlbnRDb250ZXh0ID0gYXBpXzEuY29udGV4dC5hY3RpdmUoKTtcbiAgICAgICAgICAgIGNvbnN0IHJlcXVlc3RDb250ZXh0ID0gYXBpXzEudHJhY2Uuc2V0U3BhbihwYXJlbnRDb250ZXh0LCBzcGFuKTtcbiAgICAgICAgICAgIGlmICghb3B0aW9uc1BhcnNlZC5oZWFkZXJzKSB7XG4gICAgICAgICAgICAgICAgb3B0aW9uc1BhcnNlZC5oZWFkZXJzID0ge307XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAvLyBNYWtlIGEgY29weSBvZiB0aGUgaGVhZGVycyBvYmplY3QgdG8gYXZvaWQgbXV0YXRpbmcgYW4gb2JqZWN0IHRoZVxuICAgICAgICAgICAgICAgIC8vIGNhbGxlciBtaWdodCBoYXZlIGEgcmVmZXJlbmNlIHRvLlxuICAgICAgICAgICAgICAgIG9wdGlvbnNQYXJzZWQuaGVhZGVycyA9IE9iamVjdC5hc3NpZ24oe30sIG9wdGlvbnNQYXJzZWQuaGVhZGVycyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBhcGlfMS5wcm9wYWdhdGlvbi5pbmplY3QocmVxdWVzdENvbnRleHQsIG9wdGlvbnNQYXJzZWQuaGVhZGVycyk7XG4gICAgICAgICAgICByZXR1cm4gYXBpXzEuY29udGV4dC53aXRoKHJlcXVlc3RDb250ZXh0LCAoKSA9PiB7XG4gICAgICAgICAgICAgICAgLypcbiAgICAgICAgICAgICAgICAgKiBUaGUgcmVzcG9uc2UgY2FsbGJhY2sgaXMgcmVnaXN0ZXJlZCBiZWZvcmUgQ2xpZW50UmVxdWVzdCBpcyBib3VuZCxcbiAgICAgICAgICAgICAgICAgKiB0aHVzIGl0IGlzIG5lZWRlZCB0byBiaW5kIGl0IGJlZm9yZSB0aGUgZnVuY3Rpb24gY2FsbC5cbiAgICAgICAgICAgICAgICAgKi9cbiAgICAgICAgICAgICAgICBjb25zdCBjYiA9IGFyZ3NbYXJncy5sZW5ndGggLSAxXTtcbiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIGNiID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICAgICAgICAgIGFyZ3NbYXJncy5sZW5ndGggLSAxXSA9IGFwaV8xLmNvbnRleHQuYmluZChwYXJlbnRDb250ZXh0LCBjYik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNvbnN0IHJlcXVlc3QgPSAoMCwgaW5zdHJ1bWVudGF0aW9uXzEuc2FmZUV4ZWN1dGVJblRoZU1pZGRsZSkoKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBpZiAoaW52YWxpZFVybCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gd2Uga25vdyB0aGF0IHRoZSB1cmwgaXMgaW52YWxpZCwgdGhlcmUncyBubyBwb2ludCBpbiBpbmplY3RpbmcgY29udGV4dCBhcyBpdCB3aWxsIGZhaWwgdmFsaWRhdGlvbi5cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFBhc3NpbmcgaW4gd2hhdCB0aGUgdXNlciBwcm92aWRlZCB3aWxsIGdpdmUgdGhlIHVzZXIgYW4gZXJyb3IgdGhhdCBtYXRjaGVzIHdoYXQgdGhleSdkIHNlZSB3aXRob3V0XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGUgaW5zdHJ1bWVudGF0aW9uLlxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG9yaWdpbmFsLmFwcGx5KHRoaXMsIFtvcHRpb25zLCAuLi5hcmdzXSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gb3JpZ2luYWwuYXBwbHkodGhpcywgW29wdGlvbnNQYXJzZWQsIC4uLmFyZ3NdKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0sIGVycm9yID0+IHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGVycm9yKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpbnN0cnVtZW50YXRpb24uX29uT3V0Z29pbmdSZXF1ZXN0RXJyb3Ioc3Bhbiwgb2xkTWV0cmljQXR0cmlidXRlcywgc3RhYmxlTWV0cmljQXR0cmlidXRlcywgc3RhcnRUaW1lLCBlcnJvcik7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIGluc3RydW1lbnRhdGlvbi5fZGlhZy5kZWJ1ZyhgJHtjb21wb25lbnR9IGluc3RydW1lbnRhdGlvbiBvdXRnb2luZ1JlcXVlc3RgKTtcbiAgICAgICAgICAgICAgICBhcGlfMS5jb250ZXh0LmJpbmQocGFyZW50Q29udGV4dCwgcmVxdWVzdCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGluc3RydW1lbnRhdGlvbi5fdHJhY2VDbGllbnRSZXF1ZXN0KHJlcXVlc3QsIHNwYW4sIHN0YXJ0VGltZSwgb2xkTWV0cmljQXR0cmlidXRlcywgc3RhYmxlTWV0cmljQXR0cmlidXRlcyk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfTtcbiAgICB9XG4gICAgX29uU2VydmVyUmVzcG9uc2VGaW5pc2gocmVxdWVzdCwgcmVzcG9uc2UsIHNwYW4sIG9sZE1ldHJpY0F0dHJpYnV0ZXMsIHN0YWJsZU1ldHJpY0F0dHJpYnV0ZXMsIHN0YXJ0VGltZSkge1xuICAgICAgICBjb25zdCBhdHRyaWJ1dGVzID0gKDAsIHV0aWxzXzEuZ2V0SW5jb21pbmdSZXF1ZXN0QXR0cmlidXRlc09uUmVzcG9uc2UpKHJlcXVlc3QsIHJlc3BvbnNlLCB0aGlzLl9zZW1jb252U3RhYmlsaXR5KTtcbiAgICAgICAgb2xkTWV0cmljQXR0cmlidXRlcyA9IE9iamVjdC5hc3NpZ24ob2xkTWV0cmljQXR0cmlidXRlcywgKDAsIHV0aWxzXzEuZ2V0SW5jb21pbmdSZXF1ZXN0TWV0cmljQXR0cmlidXRlc09uUmVzcG9uc2UpKGF0dHJpYnV0ZXMpKTtcbiAgICAgICAgc3RhYmxlTWV0cmljQXR0cmlidXRlcyA9IE9iamVjdC5hc3NpZ24oc3RhYmxlTWV0cmljQXR0cmlidXRlcywgKDAsIHV0aWxzXzEuZ2V0SW5jb21pbmdTdGFibGVSZXF1ZXN0TWV0cmljQXR0cmlidXRlc09uUmVzcG9uc2UpKGF0dHJpYnV0ZXMpKTtcbiAgICAgICAgc3Bhbi5zZXRBdHRyaWJ1dGVzKHRoaXMuX2hlYWRlckNhcHR1cmUuc2VydmVyLmNhcHR1cmVSZXNwb25zZUhlYWRlcnMoaGVhZGVyID0+IHJlc3BvbnNlLmdldEhlYWRlcihoZWFkZXIpKSk7XG4gICAgICAgIHNwYW4uc2V0QXR0cmlidXRlcyhhdHRyaWJ1dGVzKS5zZXRTdGF0dXMoe1xuICAgICAgICAgICAgY29kZTogKDAsIHV0aWxzXzEucGFyc2VSZXNwb25zZVN0YXR1cykoYXBpXzEuU3BhbktpbmQuU0VSVkVSLCByZXNwb25zZS5zdGF0dXNDb2RlKSxcbiAgICAgICAgfSk7XG4gICAgICAgIGNvbnN0IHJvdXRlID0gYXR0cmlidXRlc1tzZW1hbnRpY19jb252ZW50aW9uc18xLkFUVFJfSFRUUF9ST1VURV07XG4gICAgICAgIGlmIChyb3V0ZSkge1xuICAgICAgICAgICAgc3Bhbi51cGRhdGVOYW1lKGAke3JlcXVlc3QubWV0aG9kIHx8ICdHRVQnfSAke3JvdXRlfWApO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLmdldENvbmZpZygpLmFwcGx5Q3VzdG9tQXR0cmlidXRlc09uU3Bhbikge1xuICAgICAgICAgICAgKDAsIGluc3RydW1lbnRhdGlvbl8xLnNhZmVFeGVjdXRlSW5UaGVNaWRkbGUpKCgpID0+IHRoaXMuZ2V0Q29uZmlnKCkuYXBwbHlDdXN0b21BdHRyaWJ1dGVzT25TcGFuKHNwYW4sIHJlcXVlc3QsIHJlc3BvbnNlKSwgKCkgPT4geyB9LCB0cnVlKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl9jbG9zZUh0dHBTcGFuKHNwYW4sIGFwaV8xLlNwYW5LaW5kLlNFUlZFUiwgc3RhcnRUaW1lLCBvbGRNZXRyaWNBdHRyaWJ1dGVzLCBzdGFibGVNZXRyaWNBdHRyaWJ1dGVzKTtcbiAgICB9XG4gICAgX29uT3V0Z29pbmdSZXF1ZXN0RXJyb3Ioc3Bhbiwgb2xkTWV0cmljQXR0cmlidXRlcywgc3RhYmxlTWV0cmljQXR0cmlidXRlcywgc3RhcnRUaW1lLCBlcnJvcikge1xuICAgICAgICAoMCwgdXRpbHNfMS5zZXRTcGFuV2l0aEVycm9yKShzcGFuLCBlcnJvciwgdGhpcy5fc2VtY29udlN0YWJpbGl0eSk7XG4gICAgICAgIHN0YWJsZU1ldHJpY0F0dHJpYnV0ZXNbc2VtYW50aWNfY29udmVudGlvbnNfMS5BVFRSX0VSUk9SX1RZUEVdID0gZXJyb3IubmFtZTtcbiAgICAgICAgdGhpcy5fY2xvc2VIdHRwU3BhbihzcGFuLCBhcGlfMS5TcGFuS2luZC5DTElFTlQsIHN0YXJ0VGltZSwgb2xkTWV0cmljQXR0cmlidXRlcywgc3RhYmxlTWV0cmljQXR0cmlidXRlcyk7XG4gICAgfVxuICAgIF9vblNlcnZlclJlc3BvbnNlRXJyb3Ioc3Bhbiwgb2xkTWV0cmljQXR0cmlidXRlcywgc3RhYmxlTWV0cmljQXR0cmlidXRlcywgc3RhcnRUaW1lLCBlcnJvcikge1xuICAgICAgICAoMCwgdXRpbHNfMS5zZXRTcGFuV2l0aEVycm9yKShzcGFuLCBlcnJvciwgdGhpcy5fc2VtY29udlN0YWJpbGl0eSk7XG4gICAgICAgIHN0YWJsZU1ldHJpY0F0dHJpYnV0ZXNbc2VtYW50aWNfY29udmVudGlvbnNfMS5BVFRSX0VSUk9SX1RZUEVdID0gZXJyb3IubmFtZTtcbiAgICAgICAgdGhpcy5fY2xvc2VIdHRwU3BhbihzcGFuLCBhcGlfMS5TcGFuS2luZC5TRVJWRVIsIHN0YXJ0VGltZSwgb2xkTWV0cmljQXR0cmlidXRlcywgc3RhYmxlTWV0cmljQXR0cmlidXRlcyk7XG4gICAgfVxuICAgIF9zdGFydEh0dHBTcGFuKG5hbWUsIG9wdGlvbnMsIGN0eCA9IGFwaV8xLmNvbnRleHQuYWN0aXZlKCkpIHtcbiAgICAgICAgLypcbiAgICAgICAgICogSWYgYSBwYXJlbnQgaXMgcmVxdWlyZWQgYnV0IG5vdCBwcmVzZW50LCB3ZSB1c2UgYSBgTm9vcFNwYW5gIHRvIHN0aWxsXG4gICAgICAgICAqIHByb3BhZ2F0ZSBjb250ZXh0IHdpdGhvdXQgcmVjb3JkaW5nIGl0LlxuICAgICAgICAgKi9cbiAgICAgICAgY29uc3QgcmVxdWlyZVBhcmVudCA9IG9wdGlvbnMua2luZCA9PT0gYXBpXzEuU3BhbktpbmQuQ0xJRU5UXG4gICAgICAgICAgICA/IHRoaXMuZ2V0Q29uZmlnKCkucmVxdWlyZVBhcmVudGZvck91dGdvaW5nU3BhbnNcbiAgICAgICAgICAgIDogdGhpcy5nZXRDb25maWcoKS5yZXF1aXJlUGFyZW50Zm9ySW5jb21pbmdTcGFucztcbiAgICAgICAgbGV0IHNwYW47XG4gICAgICAgIGNvbnN0IGN1cnJlbnRTcGFuID0gYXBpXzEudHJhY2UuZ2V0U3BhbihjdHgpO1xuICAgICAgICBpZiAocmVxdWlyZVBhcmVudCA9PT0gdHJ1ZSAmJlxuICAgICAgICAgICAgKCFjdXJyZW50U3BhbiB8fCAhYXBpXzEudHJhY2UuaXNTcGFuQ29udGV4dFZhbGlkKGN1cnJlbnRTcGFuLnNwYW5Db250ZXh0KCkpKSkge1xuICAgICAgICAgICAgc3BhbiA9IGFwaV8xLnRyYWNlLndyYXBTcGFuQ29udGV4dChhcGlfMS5JTlZBTElEX1NQQU5fQ09OVEVYVCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAocmVxdWlyZVBhcmVudCA9PT0gdHJ1ZSAmJiBjdXJyZW50U3Bhbj8uc3BhbkNvbnRleHQoKS5pc1JlbW90ZSkge1xuICAgICAgICAgICAgc3BhbiA9IGN1cnJlbnRTcGFuO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgc3BhbiA9IHRoaXMudHJhY2VyLnN0YXJ0U3BhbihuYW1lLCBvcHRpb25zLCBjdHgpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuX3NwYW5Ob3RFbmRlZC5hZGQoc3Bhbik7XG4gICAgICAgIHJldHVybiBzcGFuO1xuICAgIH1cbiAgICBfY2xvc2VIdHRwU3BhbihzcGFuLCBzcGFuS2luZCwgc3RhcnRUaW1lLCBvbGRNZXRyaWNBdHRyaWJ1dGVzLCBzdGFibGVNZXRyaWNBdHRyaWJ1dGVzKSB7XG4gICAgICAgIGlmICghdGhpcy5fc3Bhbk5vdEVuZGVkLmhhcyhzcGFuKSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHNwYW4uZW5kKCk7XG4gICAgICAgIHRoaXMuX3NwYW5Ob3RFbmRlZC5kZWxldGUoc3Bhbik7XG4gICAgICAgIC8vIFJlY29yZCBtZXRyaWNzXG4gICAgICAgIGNvbnN0IGR1cmF0aW9uID0gKDAsIGNvcmVfMS5oclRpbWVUb01pbGxpc2Vjb25kcykoKDAsIGNvcmVfMS5oclRpbWVEdXJhdGlvbikoc3RhcnRUaW1lLCAoMCwgY29yZV8xLmhyVGltZSkoKSkpO1xuICAgICAgICBpZiAoc3BhbktpbmQgPT09IGFwaV8xLlNwYW5LaW5kLlNFUlZFUikge1xuICAgICAgICAgICAgdGhpcy5fcmVjb3JkU2VydmVyRHVyYXRpb24oZHVyYXRpb24sIG9sZE1ldHJpY0F0dHJpYnV0ZXMsIHN0YWJsZU1ldHJpY0F0dHJpYnV0ZXMpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKHNwYW5LaW5kID09PSBhcGlfMS5TcGFuS2luZC5DTElFTlQpIHtcbiAgICAgICAgICAgIHRoaXMuX3JlY29yZENsaWVudER1cmF0aW9uKGR1cmF0aW9uLCBvbGRNZXRyaWNBdHRyaWJ1dGVzLCBzdGFibGVNZXRyaWNBdHRyaWJ1dGVzKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBfY2FsbFJlc3BvbnNlSG9vayhzcGFuLCByZXNwb25zZSkge1xuICAgICAgICAoMCwgaW5zdHJ1bWVudGF0aW9uXzEuc2FmZUV4ZWN1dGVJblRoZU1pZGRsZSkoKCkgPT4gdGhpcy5nZXRDb25maWcoKS5yZXNwb25zZUhvb2soc3BhbiwgcmVzcG9uc2UpLCAoKSA9PiB7IH0sIHRydWUpO1xuICAgIH1cbiAgICBfY2FsbFJlcXVlc3RIb29rKHNwYW4sIHJlcXVlc3QpIHtcbiAgICAgICAgKDAsIGluc3RydW1lbnRhdGlvbl8xLnNhZmVFeGVjdXRlSW5UaGVNaWRkbGUpKCgpID0+IHRoaXMuZ2V0Q29uZmlnKCkucmVxdWVzdEhvb2soc3BhbiwgcmVxdWVzdCksICgpID0+IHsgfSwgdHJ1ZSk7XG4gICAgfVxuICAgIF9jYWxsU3RhcnRTcGFuSG9vayhyZXF1ZXN0LCBob29rRnVuYykge1xuICAgICAgICBpZiAodHlwZW9mIGhvb2tGdW5jID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICByZXR1cm4gKDAsIGluc3RydW1lbnRhdGlvbl8xLnNhZmVFeGVjdXRlSW5UaGVNaWRkbGUpKCgpID0+IGhvb2tGdW5jKHJlcXVlc3QpLCAoKSA9PiB7IH0sIHRydWUpO1xuICAgICAgICB9XG4gICAgfVxuICAgIF9jcmVhdGVIZWFkZXJDYXB0dXJlKHNlbWNvbnZTdGFiaWxpdHkpIHtcbiAgICAgICAgY29uc3QgY29uZmlnID0gdGhpcy5nZXRDb25maWcoKTtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGNsaWVudDoge1xuICAgICAgICAgICAgICAgIGNhcHR1cmVSZXF1ZXN0SGVhZGVyczogKDAsIHV0aWxzXzEuaGVhZGVyQ2FwdHVyZSkoJ3JlcXVlc3QnLCBjb25maWcuaGVhZGVyc1RvU3BhbkF0dHJpYnV0ZXM/LmNsaWVudD8ucmVxdWVzdEhlYWRlcnMgPz8gW10sIHNlbWNvbnZTdGFiaWxpdHkpLFxuICAgICAgICAgICAgICAgIGNhcHR1cmVSZXNwb25zZUhlYWRlcnM6ICgwLCB1dGlsc18xLmhlYWRlckNhcHR1cmUpKCdyZXNwb25zZScsIGNvbmZpZy5oZWFkZXJzVG9TcGFuQXR0cmlidXRlcz8uY2xpZW50Py5yZXNwb25zZUhlYWRlcnMgPz8gW10sIHNlbWNvbnZTdGFiaWxpdHkpLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHNlcnZlcjoge1xuICAgICAgICAgICAgICAgIGNhcHR1cmVSZXF1ZXN0SGVhZGVyczogKDAsIHV0aWxzXzEuaGVhZGVyQ2FwdHVyZSkoJ3JlcXVlc3QnLCBjb25maWcuaGVhZGVyc1RvU3BhbkF0dHJpYnV0ZXM/LnNlcnZlcj8ucmVxdWVzdEhlYWRlcnMgPz8gW10sIHNlbWNvbnZTdGFiaWxpdHkpLFxuICAgICAgICAgICAgICAgIGNhcHR1cmVSZXNwb25zZUhlYWRlcnM6ICgwLCB1dGlsc18xLmhlYWRlckNhcHR1cmUpKCdyZXNwb25zZScsIGNvbmZpZy5oZWFkZXJzVG9TcGFuQXR0cmlidXRlcz8uc2VydmVyPy5yZXNwb25zZUhlYWRlcnMgPz8gW10sIHNlbWNvbnZTdGFiaWxpdHkpLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgfTtcbiAgICB9XG59XG5leHBvcnRzLkh0dHBJbnN0cnVtZW50YXRpb24gPSBIdHRwSW5zdHJ1bWVudGF0aW9uO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9aHR0cC5qcy5tYXAiXSwibmFtZXMiOltdLCJpZ25vcmVMaXN0IjpbMF0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///(ssr)/./node_modules/.pnpm/@opentelemetry+instrumentation-http@0.214.0_@opentelemetry+api@1.9.1/node_modules/@opentelemetry/instrumentation-http/build/src/http.js\n");
|
|
|
|
/***/ }),
|
|
|
|
/***/ "(ssr)/./node_modules/.pnpm/@opentelemetry+instrumentation-http@0.214.0_@opentelemetry+api@1.9.1/node_modules/@opentelemetry/instrumentation-http/build/src/index.js":
|
|
/*!*********************************************************************************************************************************************************************!*\
|
|
!*** ./node_modules/.pnpm/@opentelemetry+instrumentation-http@0.214.0_@opentelemetry+api@1.9.1/node_modules/@opentelemetry/instrumentation-http/build/src/index.js ***!
|
|
\*********************************************************************************************************************************************************************/
|
|
/***/ ((__unused_webpack_module, exports, __webpack_require__) => {
|
|
|
|
eval("\n/*\n * Copyright The OpenTelemetry Authors\n * SPDX-License-Identifier: Apache-2.0\n */\nObject.defineProperty(exports, \"__esModule\", ({ value: true }));\nexports.HttpInstrumentation = void 0;\nvar http_1 = __webpack_require__(/*! ./http */ \"(ssr)/./node_modules/.pnpm/@opentelemetry+instrumentation-http@0.214.0_@opentelemetry+api@1.9.1/node_modules/@opentelemetry/instrumentation-http/build/src/http.js\");\nObject.defineProperty(exports, \"HttpInstrumentation\", ({ enumerable: true, get: function () { return http_1.HttpInstrumentation; } }));\n//# sourceMappingURL=index.js.map//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKHNzcikvLi9ub2RlX21vZHVsZXMvLnBucG0vQG9wZW50ZWxlbWV0cnkraW5zdHJ1bWVudGF0aW9uLWh0dHBAMC4yMTQuMF9Ab3BlbnRlbGVtZXRyeSthcGlAMS45LjEvbm9kZV9tb2R1bGVzL0BvcGVudGVsZW1ldHJ5L2luc3RydW1lbnRhdGlvbi1odHRwL2J1aWxkL3NyYy9pbmRleC5qcyIsIm1hcHBpbmdzIjoiQUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsOENBQTZDLEVBQUUsYUFBYSxFQUFDO0FBQzdELDJCQUEyQjtBQUMzQixhQUFhLG1CQUFPLENBQUMsa0xBQVE7QUFDN0IsdURBQXNELEVBQUUscUNBQXFDLHNDQUFzQyxFQUFDO0FBQ3BJIiwic291cmNlcyI6WyIvVXNlcnMvbWFyY21pbnRlbC9Qcm9qZWN0cy9lLXRpYi5jb20vbm9kZV9tb2R1bGVzLy5wbnBtL0BvcGVudGVsZW1ldHJ5K2luc3RydW1lbnRhdGlvbi1odHRwQDAuMjE0LjBfQG9wZW50ZWxlbWV0cnkrYXBpQDEuOS4xL25vZGVfbW9kdWxlcy9Ab3BlbnRlbGVtZXRyeS9pbnN0cnVtZW50YXRpb24taHR0cC9idWlsZC9zcmMvaW5kZXguanMiXSwic291cmNlc0NvbnRlbnQiOlsiXCJ1c2Ugc3RyaWN0XCI7XG4vKlxuICogQ29weXJpZ2h0IFRoZSBPcGVuVGVsZW1ldHJ5IEF1dGhvcnNcbiAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wXG4gKi9cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMuSHR0cEluc3RydW1lbnRhdGlvbiA9IHZvaWQgMDtcbnZhciBodHRwXzEgPSByZXF1aXJlKFwiLi9odHRwXCIpO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiSHR0cEluc3RydW1lbnRhdGlvblwiLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gaHR0cF8xLkh0dHBJbnN0cnVtZW50YXRpb247IH0gfSk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1pbmRleC5qcy5tYXAiXSwibmFtZXMiOltdLCJpZ25vcmVMaXN0IjpbMF0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///(ssr)/./node_modules/.pnpm/@opentelemetry+instrumentation-http@0.214.0_@opentelemetry+api@1.9.1/node_modules/@opentelemetry/instrumentation-http/build/src/index.js\n");
|
|
|
|
/***/ }),
|
|
|
|
/***/ "(ssr)/./node_modules/.pnpm/@opentelemetry+instrumentation-http@0.214.0_@opentelemetry+api@1.9.1/node_modules/@opentelemetry/instrumentation-http/build/src/internal-types.js":
|
|
/*!******************************************************************************************************************************************************************************!*\
|
|
!*** ./node_modules/.pnpm/@opentelemetry+instrumentation-http@0.214.0_@opentelemetry+api@1.9.1/node_modules/@opentelemetry/instrumentation-http/build/src/internal-types.js ***!
|
|
\******************************************************************************************************************************************************************************/
|
|
/***/ ((__unused_webpack_module, exports) => {
|
|
|
|
eval("\n/*\n * Copyright The OpenTelemetry Authors\n * SPDX-License-Identifier: Apache-2.0\n */\nObject.defineProperty(exports, \"__esModule\", ({ value: true }));\nexports.DEFAULT_QUERY_STRINGS_TO_REDACT = exports.STR_REDACTED = exports.SYNTHETIC_BOT_NAMES = exports.SYNTHETIC_TEST_NAMES = void 0;\n/**\n * Names of possible synthetic test sources.\n */\nexports.SYNTHETIC_TEST_NAMES = ['alwayson'];\n/**\n * Names of possible synthetic bot sources.\n */\nexports.SYNTHETIC_BOT_NAMES = ['googlebot', 'bingbot'];\n/**\n * REDACTED string used to replace sensitive information in URLs.\n */\nexports.STR_REDACTED = 'REDACTED';\n/**\n * List of URL query keys that are considered sensitive and whose value should be redacted.\n */\nexports.DEFAULT_QUERY_STRINGS_TO_REDACT = [\n 'sig',\n 'Signature',\n 'AWSAccessKeyId',\n 'X-Goog-Signature',\n];\n//# sourceMappingURL=internal-types.js.map//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKHNzcikvLi9ub2RlX21vZHVsZXMvLnBucG0vQG9wZW50ZWxlbWV0cnkraW5zdHJ1bWVudGF0aW9uLWh0dHBAMC4yMTQuMF9Ab3BlbnRlbGVtZXRyeSthcGlAMS45LjEvbm9kZV9tb2R1bGVzL0BvcGVudGVsZW1ldHJ5L2luc3RydW1lbnRhdGlvbi1odHRwL2J1aWxkL3NyYy9pbnRlcm5hbC10eXBlcy5qcyIsIm1hcHBpbmdzIjoiQUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsOENBQTZDLEVBQUUsYUFBYSxFQUFDO0FBQzdELHVDQUF1QyxHQUFHLG9CQUFvQixHQUFHLDJCQUEyQixHQUFHLDRCQUE0QjtBQUMzSDtBQUNBO0FBQ0E7QUFDQSw0QkFBNEI7QUFDNUI7QUFDQTtBQUNBO0FBQ0EsMkJBQTJCO0FBQzNCO0FBQ0E7QUFDQTtBQUNBLG9CQUFvQjtBQUNwQjtBQUNBO0FBQ0E7QUFDQSx1Q0FBdUM7QUFDdkM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwic291cmNlcyI6WyIvVXNlcnMvbWFyY21pbnRlbC9Qcm9qZWN0cy9lLXRpYi5jb20vbm9kZV9tb2R1bGVzLy5wbnBtL0BvcGVudGVsZW1ldHJ5K2luc3RydW1lbnRhdGlvbi1odHRwQDAuMjE0LjBfQG9wZW50ZWxlbWV0cnkrYXBpQDEuOS4xL25vZGVfbW9kdWxlcy9Ab3BlbnRlbGVtZXRyeS9pbnN0cnVtZW50YXRpb24taHR0cC9idWlsZC9zcmMvaW50ZXJuYWwtdHlwZXMuanMiXSwic291cmNlc0NvbnRlbnQiOlsiXCJ1c2Ugc3RyaWN0XCI7XG4vKlxuICogQ29weXJpZ2h0IFRoZSBPcGVuVGVsZW1ldHJ5IEF1dGhvcnNcbiAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wXG4gKi9cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMuREVGQVVMVF9RVUVSWV9TVFJJTkdTX1RPX1JFREFDVCA9IGV4cG9ydHMuU1RSX1JFREFDVEVEID0gZXhwb3J0cy5TWU5USEVUSUNfQk9UX05BTUVTID0gZXhwb3J0cy5TWU5USEVUSUNfVEVTVF9OQU1FUyA9IHZvaWQgMDtcbi8qKlxuICogTmFtZXMgb2YgcG9zc2libGUgc3ludGhldGljIHRlc3Qgc291cmNlcy5cbiAqL1xuZXhwb3J0cy5TWU5USEVUSUNfVEVTVF9OQU1FUyA9IFsnYWx3YXlzb24nXTtcbi8qKlxuICogTmFtZXMgb2YgcG9zc2libGUgc3ludGhldGljIGJvdCBzb3VyY2VzLlxuICovXG5leHBvcnRzLlNZTlRIRVRJQ19CT1RfTkFNRVMgPSBbJ2dvb2dsZWJvdCcsICdiaW5nYm90J107XG4vKipcbiAqIFJFREFDVEVEIHN0cmluZyB1c2VkIHRvIHJlcGxhY2Ugc2Vuc2l0aXZlIGluZm9ybWF0aW9uIGluIFVSTHMuXG4gKi9cbmV4cG9ydHMuU1RSX1JFREFDVEVEID0gJ1JFREFDVEVEJztcbi8qKlxuICogTGlzdCBvZiBVUkwgcXVlcnkga2V5cyB0aGF0IGFyZSBjb25zaWRlcmVkIHNlbnNpdGl2ZSBhbmQgd2hvc2UgdmFsdWUgc2hvdWxkIGJlIHJlZGFjdGVkLlxuICovXG5leHBvcnRzLkRFRkFVTFRfUVVFUllfU1RSSU5HU19UT19SRURBQ1QgPSBbXG4gICAgJ3NpZycsXG4gICAgJ1NpZ25hdHVyZScsXG4gICAgJ0FXU0FjY2Vzc0tleUlkJyxcbiAgICAnWC1Hb29nLVNpZ25hdHVyZScsXG5dO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9aW50ZXJuYWwtdHlwZXMuanMubWFwIl0sIm5hbWVzIjpbXSwiaWdub3JlTGlzdCI6WzBdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///(ssr)/./node_modules/.pnpm/@opentelemetry+instrumentation-http@0.214.0_@opentelemetry+api@1.9.1/node_modules/@opentelemetry/instrumentation-http/build/src/internal-types.js\n");
|
|
|
|
/***/ }),
|
|
|
|
/***/ "(ssr)/./node_modules/.pnpm/@opentelemetry+instrumentation-http@0.214.0_@opentelemetry+api@1.9.1/node_modules/@opentelemetry/instrumentation-http/build/src/semconv.js":
|
|
/*!***********************************************************************************************************************************************************************!*\
|
|
!*** ./node_modules/.pnpm/@opentelemetry+instrumentation-http@0.214.0_@opentelemetry+api@1.9.1/node_modules/@opentelemetry/instrumentation-http/build/src/semconv.js ***!
|
|
\***********************************************************************************************************************************************************************/
|
|
/***/ ((__unused_webpack_module, exports) => {
|
|
|
|
eval("\n/*\n * Copyright The OpenTelemetry Authors\n * SPDX-License-Identifier: Apache-2.0\n */\nObject.defineProperty(exports, \"__esModule\", ({ value: true }));\nexports.HTTP_FLAVOR_VALUE_HTTP_1_1 = exports.NET_TRANSPORT_VALUE_IP_UDP = exports.NET_TRANSPORT_VALUE_IP_TCP = exports.ATTR_NET_TRANSPORT = exports.ATTR_NET_PEER_PORT = exports.ATTR_NET_PEER_NAME = exports.ATTR_NET_PEER_IP = exports.ATTR_NET_HOST_PORT = exports.ATTR_NET_HOST_NAME = exports.ATTR_NET_HOST_IP = exports.ATTR_HTTP_USER_AGENT = exports.ATTR_HTTP_URL = exports.ATTR_HTTP_TARGET = exports.ATTR_HTTP_STATUS_CODE = exports.ATTR_HTTP_SERVER_NAME = exports.ATTR_HTTP_SCHEME = exports.ATTR_HTTP_RESPONSE_CONTENT_LENGTH_UNCOMPRESSED = exports.ATTR_HTTP_RESPONSE_CONTENT_LENGTH = exports.ATTR_HTTP_REQUEST_CONTENT_LENGTH_UNCOMPRESSED = exports.ATTR_HTTP_REQUEST_CONTENT_LENGTH = exports.ATTR_HTTP_METHOD = exports.ATTR_HTTP_HOST = exports.ATTR_HTTP_FLAVOR = exports.ATTR_HTTP_CLIENT_IP = exports.USER_AGENT_SYNTHETIC_TYPE_VALUE_TEST = exports.USER_AGENT_SYNTHETIC_TYPE_VALUE_BOT = exports.ATTR_USER_AGENT_SYNTHETIC_TYPE = void 0;\n/*\n * This file contains a copy of unstable semantic convention definitions\n * used by this package.\n * @see https://github.com/open-telemetry/opentelemetry-js/tree/main/semantic-conventions#unstable-semconv\n */\n/**\n * Specifies the category of synthetic traffic, such as tests or bots.\n *\n * @note This attribute **MAY** be derived from the contents of the `user_agent.original` attribute. Components that populate the attribute are responsible for determining what they consider to be synthetic bot or test traffic. This attribute can either be set for self-identification purposes, or on telemetry detected to be generated as a result of a synthetic request. This attribute is useful for distinguishing between genuine client traffic and synthetic traffic generated by bots or tests.\n *\n * @experimental This attribute is experimental and is subject to breaking changes in minor releases of `@opentelemetry/semantic-conventions`.\n */\nexports.ATTR_USER_AGENT_SYNTHETIC_TYPE = 'user_agent.synthetic.type';\n/**\n * Enum value \"bot\" for attribute {@link ATTR_USER_AGENT_SYNTHETIC_TYPE}.\n */\nexports.USER_AGENT_SYNTHETIC_TYPE_VALUE_BOT = 'bot';\n/**\n * Enum value \"test\" for attribute {@link ATTR_USER_AGENT_SYNTHETIC_TYPE}.\n */\nexports.USER_AGENT_SYNTHETIC_TYPE_VALUE_TEST = 'test';\n/**\n * Deprecated, use `client.address` instead.\n *\n * @example \"83.164.160.102\"\n *\n * @experimental This attribute is experimental and is subject to breaking changes in minor releases of `@opentelemetry/semantic-conventions`.\n *\n * @deprecated Replaced by `client.address`.\n */\nexports.ATTR_HTTP_CLIENT_IP = 'http.client_ip';\n/**\n * Deprecated, use `network.protocol.name` instead.\n *\n * @experimental This attribute is experimental and is subject to breaking changes in minor releases of `@opentelemetry/semantic-conventions`.\n *\n * @deprecated Replaced by `network.protocol.name`.\n */\nexports.ATTR_HTTP_FLAVOR = 'http.flavor';\n/**\n * Deprecated, use one of `server.address`, `client.address` or `http.request.header.host` instead, depending on the usage.\n *\n * @example www.example.org\n *\n * @experimental This attribute is experimental and is subject to breaking changes in minor releases of `@opentelemetry/semantic-conventions`.\n *\n * @deprecated Replaced by one of `server.address`, `client.address` or `http.request.header.host`, depending on the usage.\n */\nexports.ATTR_HTTP_HOST = 'http.host';\n/**\n * Deprecated, use `http.request.method` instead.\n *\n * @example GET\n * @example POST\n * @example HEAD\n *\n * @experimental This attribute is experimental and is subject to breaking changes in minor releases of `@opentelemetry/semantic-conventions`.\n *\n * @deprecated Replaced by `http.request.method`.\n */\nexports.ATTR_HTTP_METHOD = 'http.method';\n/**\n * Deprecated, use `http.request.header.<key>` instead.\n *\n * @example 3495\n *\n * @experimental This attribute is experimental and is subject to breaking changes in minor releases of `@opentelemetry/semantic-conventions`.\n *\n * @deprecated Replaced by `http.request.header.<key>`.\n */\nexports.ATTR_HTTP_REQUEST_CONTENT_LENGTH = 'http.request_content_length';\n/**\n * Deprecated, use `http.request.body.size` instead.\n *\n * @example 5493\n *\n * @experimental This attribute is experimental and is subject to breaking changes in minor releases of `@opentelemetry/semantic-conventions`.\n *\n * @deprecated Replaced by `http.request.body.size`.\n */\nexports.ATTR_HTTP_REQUEST_CONTENT_LENGTH_UNCOMPRESSED = 'http.request_content_length_uncompressed';\n/**\n * Deprecated, use `http.response.header.<key>` instead.\n *\n * @example 3495\n *\n * @experimental This attribute is experimental and is subject to breaking changes in minor releases of `@opentelemetry/semantic-conventions`.\n *\n * @deprecated Replaced by `http.response.header.<key>`.\n */\nexports.ATTR_HTTP_RESPONSE_CONTENT_LENGTH = 'http.response_content_length';\n/**\n * Deprecated, use `http.response.body.size` instead.\n *\n * @example 5493\n *\n * @experimental This attribute is experimental and is subject to breaking changes in minor releases of `@opentelemetry/semantic-conventions`.\n *\n * @deprecated Replace by `http.response.body.size`.\n */\nexports.ATTR_HTTP_RESPONSE_CONTENT_LENGTH_UNCOMPRESSED = 'http.response_content_length_uncompressed';\n/**\n * Deprecated, use `url.scheme` instead.\n *\n * @example http\n * @example https\n *\n * @experimental This attribute is experimental and is subject to breaking changes in minor releases of `@opentelemetry/semantic-conventions`.\n *\n * @deprecated Replaced by `url.scheme` instead.\n */\nexports.ATTR_HTTP_SCHEME = 'http.scheme';\n/**\n * Deprecated, use `server.address` instead.\n *\n * @example example.com\n *\n * @experimental This attribute is experimental and is subject to breaking changes in minor releases of `@opentelemetry/semantic-conventions`.\n *\n * @deprecated Replaced by `server.address`.\n */\nexports.ATTR_HTTP_SERVER_NAME = 'http.server_name';\n/**\n * Deprecated, use `http.response.status_code` instead.\n *\n * @example 200\n *\n * @experimental This attribute is experimental and is subject to breaking changes in minor releases of `@opentelemetry/semantic-conventions`.\n *\n * @deprecated Replaced by `http.response.status_code`.\n */\nexports.ATTR_HTTP_STATUS_CODE = 'http.status_code';\n/**\n * Deprecated, use `url.path` and `url.query` instead.\n *\n * @example /search?q=OpenTelemetry#SemConv\n *\n * @experimental This attribute is experimental and is subject to breaking changes in minor releases of `@opentelemetry/semantic-conventions`.\n *\n * @deprecated Split to `url.path` and `url.query.\n */\nexports.ATTR_HTTP_TARGET = 'http.target';\n/**\n * Deprecated, use `url.full` instead.\n *\n * @example https://www.foo.bar/search?q=OpenTelemetry#SemConv\n *\n * @experimental This attribute is experimental and is subject to breaking changes in minor releases of `@opentelemetry/semantic-conventions`.\n *\n * @deprecated Replaced by `url.full`.\n */\nexports.ATTR_HTTP_URL = 'http.url';\n/**\n * Deprecated, use `user_agent.original` instead.\n *\n * @example CERN-LineMode/2.15 libwww/2.17b3\n * @example Mozilla/5.0 (iPhone; CPU iPhone OS 14_7_1 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/14.1.2 Mobile/15E148 Safari/604.1\n *\n * @experimental This attribute is experimental and is subject to breaking changes in minor releases of `@opentelemetry/semantic-conventions`.\n *\n * @deprecated Replaced by `user_agent.original`.\n */\nexports.ATTR_HTTP_USER_AGENT = 'http.user_agent';\n/**\n * Deprecated, use `network.local.address`.\n *\n * @example \"192.168.0.1\"\n *\n * @experimental This attribute is experimental and is subject to breaking changes in minor releases of `@opentelemetry/semantic-conventions`.\n *\n * @deprecated Replaced by `network.local.address`.\n */\nexports.ATTR_NET_HOST_IP = 'net.host.ip';\n/**\n * Deprecated, use `server.address`.\n *\n * @example example.com\n *\n * @experimental This attribute is experimental and is subject to breaking changes in minor releases of `@opentelemetry/semantic-conventions`.\n *\n * @deprecated Replaced by `server.address`.\n */\nexports.ATTR_NET_HOST_NAME = 'net.host.name';\n/**\n * Deprecated, use `server.port`.\n *\n * @example 8080\n *\n * @experimental This attribute is experimental and is subject to breaking changes in minor releases of `@opentelemetry/semantic-conventions`.\n *\n * @deprecated Replaced by `server.port`.\n */\nexports.ATTR_NET_HOST_PORT = 'net.host.port';\n/**\n * Deprecated, use `network.peer.address`.\n *\n * @example \"127.0.0.1\"\n *\n * @experimental This attribute is experimental and is subject to breaking changes in minor releases of `@opentelemetry/semantic-conventions`.\n *\n * @deprecated Replaced by `network.peer.address`.\n */\nexports.ATTR_NET_PEER_IP = 'net.peer.ip';\n/**\n * Deprecated, use `server.address` on client spans and `client.address` on server spans.\n *\n * @example example.com\n *\n * @experimental This attribute is experimental and is subject to breaking changes in minor releases of `@opentelemetry/semantic-conventions`.\n *\n * @deprecated Replaced by `server.address` on client spans and `client.address` on server spans.\n */\nexports.ATTR_NET_PEER_NAME = 'net.peer.name';\n/**\n * Deprecated, use `server.port` on client spans and `client.port` on server spans.\n *\n * @example 8080\n *\n * @experimental This attribute is experimental and is subject to breaking changes in minor releases of `@opentelemetry/semantic-conventions`.\n *\n * @deprecated Replaced by `server.port` on client spans and `client.port` on server spans.\n */\nexports.ATTR_NET_PEER_PORT = 'net.peer.port';\n/**\n * Deprecated, use `network.transport`.\n *\n * @experimental This attribute is experimental and is subject to breaking changes in minor releases of `@opentelemetry/semantic-conventions`.\n *\n * @deprecated Replaced by `network.transport`.\n */\nexports.ATTR_NET_TRANSPORT = 'net.transport';\n/**\n * Enum value \"ip_tcp\" for attribute {@link ATTR_NET_TRANSPORT}.\n */\nexports.NET_TRANSPORT_VALUE_IP_TCP = 'ip_tcp';\n/**\n * Enum value \"ip_udp\" for attribute {@link ATTR_NET_TRANSPORT}.\n */\nexports.NET_TRANSPORT_VALUE_IP_UDP = 'ip_udp';\n/**\n * Enum value \"1.1\" for attribute {@link ATTR_HTTP_FLAVOR}.\n */\nexports.HTTP_FLAVOR_VALUE_HTTP_1_1 = '1.1';\n//# sourceMappingURL=semconv.js.map//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKHNzcikvLi9ub2RlX21vZHVsZXMvLnBucG0vQG9wZW50ZWxlbWV0cnkraW5zdHJ1bWVudGF0aW9uLWh0dHBAMC4yMTQuMF9Ab3BlbnRlbGVtZXRyeSthcGlAMS45LjEvbm9kZV9tb2R1bGVzL0BvcGVudGVsZW1ldHJ5L2luc3RydW1lbnRhdGlvbi1odHRwL2J1aWxkL3NyYy9zZW1jb252LmpzIiwibWFwcGluZ3MiOiJBQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQSw4Q0FBNkMsRUFBRSxhQUFhLEVBQUM7QUFDN0Qsa0NBQWtDLEdBQUcsa0NBQWtDLEdBQUcsa0NBQWtDLEdBQUcsMEJBQTBCLEdBQUcsMEJBQTBCLEdBQUcsMEJBQTBCLEdBQUcsd0JBQXdCLEdBQUcsMEJBQTBCLEdBQUcsMEJBQTBCLEdBQUcsd0JBQXdCLEdBQUcsNEJBQTRCLEdBQUcscUJBQXFCLEdBQUcsd0JBQXdCLEdBQUcsNkJBQTZCLEdBQUcsNkJBQTZCLEdBQUcsd0JBQXdCLEdBQUcsc0RBQXNELEdBQUcseUNBQXlDLEdBQUcscURBQXFELEdBQUcsd0NBQXdDLEdBQUcsd0JBQXdCLEdBQUcsc0JBQXNCLEdBQUcsd0JBQXdCLEdBQUcsMkJBQTJCLEdBQUcsNENBQTRDLEdBQUcsMkNBQTJDLEdBQUcsc0NBQXNDO0FBQzM1QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxzQ0FBc0M7QUFDdEM7QUFDQSxtQ0FBbUMscUNBQXFDO0FBQ3hFO0FBQ0EsMkNBQTJDO0FBQzNDO0FBQ0Esb0NBQW9DLHFDQUFxQztBQUN6RTtBQUNBLDRDQUE0QztBQUM1QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSwyQkFBMkI7QUFDM0I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx3QkFBd0I7QUFDeEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esc0JBQXNCO0FBQ3RCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx3QkFBd0I7QUFDeEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esd0NBQXdDO0FBQ3hDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHFEQUFxRDtBQUNyRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx5Q0FBeUM7QUFDekM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esc0RBQXNEO0FBQ3REO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esd0JBQXdCO0FBQ3hCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDZCQUE2QjtBQUM3QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw2QkFBNkI7QUFDN0I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esd0JBQXdCO0FBQ3hCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHFCQUFxQjtBQUNyQjtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlDQUFpQztBQUNqQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsNEJBQTRCO0FBQzVCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHdCQUF3QjtBQUN4QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSwwQkFBMEI7QUFDMUI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsMEJBQTBCO0FBQzFCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHdCQUF3QjtBQUN4QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSwwQkFBMEI7QUFDMUI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsMEJBQTBCO0FBQzFCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsMEJBQTBCO0FBQzFCO0FBQ0Esc0NBQXNDLHlCQUF5QjtBQUMvRDtBQUNBLGtDQUFrQztBQUNsQztBQUNBLHNDQUFzQyx5QkFBeUI7QUFDL0Q7QUFDQSxrQ0FBa0M7QUFDbEM7QUFDQSxtQ0FBbUMsdUJBQXVCO0FBQzFEO0FBQ0Esa0NBQWtDO0FBQ2xDIiwic291cmNlcyI6WyIvVXNlcnMvbWFyY21pbnRlbC9Qcm9qZWN0cy9lLXRpYi5jb20vbm9kZV9tb2R1bGVzLy5wbnBtL0BvcGVudGVsZW1ldHJ5K2luc3RydW1lbnRhdGlvbi1odHRwQDAuMjE0LjBfQG9wZW50ZWxlbWV0cnkrYXBpQDEuOS4xL25vZGVfbW9kdWxlcy9Ab3BlbnRlbGVtZXRyeS9pbnN0cnVtZW50YXRpb24taHR0cC9idWlsZC9zcmMvc2VtY29udi5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyJcInVzZSBzdHJpY3RcIjtcbi8qXG4gKiBDb3B5cmlnaHQgVGhlIE9wZW5UZWxlbWV0cnkgQXV0aG9yc1xuICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjBcbiAqL1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5IVFRQX0ZMQVZPUl9WQUxVRV9IVFRQXzFfMSA9IGV4cG9ydHMuTkVUX1RSQU5TUE9SVF9WQUxVRV9JUF9VRFAgPSBleHBvcnRzLk5FVF9UUkFOU1BPUlRfVkFMVUVfSVBfVENQID0gZXhwb3J0cy5BVFRSX05FVF9UUkFOU1BPUlQgPSBleHBvcnRzLkFUVFJfTkVUX1BFRVJfUE9SVCA9IGV4cG9ydHMuQVRUUl9ORVRfUEVFUl9OQU1FID0gZXhwb3J0cy5BVFRSX05FVF9QRUVSX0lQID0gZXhwb3J0cy5BVFRSX05FVF9IT1NUX1BPUlQgPSBleHBvcnRzLkFUVFJfTkVUX0hPU1RfTkFNRSA9IGV4cG9ydHMuQVRUUl9ORVRfSE9TVF9JUCA9IGV4cG9ydHMuQVRUUl9IVFRQX1VTRVJfQUdFTlQgPSBleHBvcnRzLkFUVFJfSFRUUF9VUkwgPSBleHBvcnRzLkFUVFJfSFRUUF9UQVJHRVQgPSBleHBvcnRzLkFUVFJfSFRUUF9TVEFUVVNfQ09ERSA9IGV4cG9ydHMuQVRUUl9IVFRQX1NFUlZFUl9OQU1FID0gZXhwb3J0cy5BVFRSX0hUVFBfU0NIRU1FID0gZXhwb3J0cy5BVFRSX0hUVFBfUkVTUE9OU0VfQ09OVEVOVF9MRU5HVEhfVU5DT01QUkVTU0VEID0gZXhwb3J0cy5BVFRSX0hUVFBfUkVTUE9OU0VfQ09OVEVOVF9MRU5HVEggPSBleHBvcnRzLkFUVFJfSFRUUF9SRVFVRVNUX0NPTlRFTlRfTEVOR1RIX1VOQ09NUFJFU1NFRCA9IGV4cG9ydHMuQVRUUl9IVFRQX1JFUVVFU1RfQ09OVEVOVF9MRU5HVEggPSBleHBvcnRzLkFUVFJfSFRUUF9NRVRIT0QgPSBleHBvcnRzLkFUVFJfSFRUUF9IT1NUID0gZXhwb3J0cy5BVFRSX0hUVFBfRkxBVk9SID0gZXhwb3J0cy5BVFRSX0hUVFBfQ0xJRU5UX0lQID0gZXhwb3J0cy5VU0VSX0FHRU5UX1NZTlRIRVRJQ19UWVBFX1ZBTFVFX1RFU1QgPSBleHBvcnRzLlVTRVJfQUdFTlRfU1lOVEhFVElDX1RZUEVfVkFMVUVfQk9UID0gZXhwb3J0cy5BVFRSX1VTRVJfQUdFTlRfU1lOVEhFVElDX1RZUEUgPSB2b2lkIDA7XG4vKlxuICogVGhpcyBmaWxlIGNvbnRhaW5zIGEgY29weSBvZiB1bnN0YWJsZSBzZW1hbnRpYyBjb252ZW50aW9uIGRlZmluaXRpb25zXG4gKiB1c2VkIGJ5IHRoaXMgcGFja2FnZS5cbiAqIEBzZWUgaHR0cHM6Ly9naXRodWIuY29tL29wZW4tdGVsZW1ldHJ5L29wZW50ZWxlbWV0cnktanMvdHJlZS9tYWluL3NlbWFudGljLWNvbnZlbnRpb25zI3Vuc3RhYmxlLXNlbWNvbnZcbiAqL1xuLyoqXG4gKiBTcGVjaWZpZXMgdGhlIGNhdGVnb3J5IG9mIHN5bnRoZXRpYyB0cmFmZmljLCBzdWNoIGFzIHRlc3RzIG9yIGJvdHMuXG4gKlxuICogQG5vdGUgVGhpcyBhdHRyaWJ1dGUgKipNQVkqKiBiZSBkZXJpdmVkIGZyb20gdGhlIGNvbnRlbnRzIG9mIHRoZSBgdXNlcl9hZ2VudC5vcmlnaW5hbGAgYXR0cmlidXRlLiBDb21wb25lbnRzIHRoYXQgcG9wdWxhdGUgdGhlIGF0dHJpYnV0ZSBhcmUgcmVzcG9uc2libGUgZm9yIGRldGVybWluaW5nIHdoYXQgdGhleSBjb25zaWRlciB0byBiZSBzeW50aGV0aWMgYm90IG9yIHRlc3QgdHJhZmZpYy4gVGhpcyBhdHRyaWJ1dGUgY2FuIGVpdGhlciBiZSBzZXQgZm9yIHNlbGYtaWRlbnRpZmljYXRpb24gcHVycG9zZXMsIG9yIG9uIHRlbGVtZXRyeSBkZXRlY3RlZCB0byBiZSBnZW5lcmF0ZWQgYXMgYSByZXN1bHQgb2YgYSBzeW50aGV0aWMgcmVxdWVzdC4gVGhpcyBhdHRyaWJ1dGUgaXMgdXNlZnVsIGZvciBkaXN0aW5ndWlzaGluZyBiZXR3ZWVuIGdlbnVpbmUgY2xpZW50IHRyYWZmaWMgYW5kIHN5bnRoZXRpYyB0cmFmZmljIGdlbmVyYXRlZCBieSBib3RzIG9yIHRlc3RzLlxuICpcbiAqIEBleHBlcmltZW50YWwgVGhpcyBhdHRyaWJ1dGUgaXMgZXhwZXJpbWVudGFsIGFuZCBpcyBzdWJqZWN0IHRvIGJyZWFraW5nIGNoYW5nZXMgaW4gbWlub3IgcmVsZWFzZXMgb2YgYEBvcGVudGVsZW1ldHJ5L3NlbWFudGljLWNvbnZlbnRpb25zYC5cbiAqL1xuZXhwb3J0cy5BVFRSX1VTRVJfQUdFTlRfU1lOVEhFVElDX1RZUEUgPSAndXNlcl9hZ2VudC5zeW50aGV0aWMudHlwZSc7XG4vKipcbiAqIEVudW0gdmFsdWUgXCJib3RcIiBmb3IgYXR0cmlidXRlIHtAbGluayBBVFRSX1VTRVJfQUdFTlRfU1lOVEhFVElDX1RZUEV9LlxuICovXG5leHBvcnRzLlVTRVJfQUdFTlRfU1lOVEhFVElDX1RZUEVfVkFMVUVfQk9UID0gJ2JvdCc7XG4vKipcbiAqIEVudW0gdmFsdWUgXCJ0ZXN0XCIgZm9yIGF0dHJpYnV0ZSB7QGxpbmsgQVRUUl9VU0VSX0FHRU5UX1NZTlRIRVRJQ19UWVBFfS5cbiAqL1xuZXhwb3J0cy5VU0VSX0FHRU5UX1NZTlRIRVRJQ19UWVBFX1ZBTFVFX1RFU1QgPSAndGVzdCc7XG4vKipcbiAqIERlcHJlY2F0ZWQsIHVzZSBgY2xpZW50LmFkZHJlc3NgIGluc3RlYWQuXG4gKlxuICogQGV4YW1wbGUgXCI4My4xNjQuMTYwLjEwMlwiXG4gKlxuICogQGV4cGVyaW1lbnRhbCBUaGlzIGF0dHJpYnV0ZSBpcyBleHBlcmltZW50YWwgYW5kIGlzIHN1YmplY3QgdG8gYnJlYWtpbmcgY2hhbmdlcyBpbiBtaW5vciByZWxlYXNlcyBvZiBgQG9wZW50ZWxlbWV0cnkvc2VtYW50aWMtY29udmVudGlvbnNgLlxuICpcbiAqIEBkZXByZWNhdGVkIFJlcGxhY2VkIGJ5IGBjbGllbnQuYWRkcmVzc2AuXG4gKi9cbmV4cG9ydHMuQVRUUl9IVFRQX0NMSUVOVF9JUCA9ICdodHRwLmNsaWVudF9pcCc7XG4vKipcbiAqIERlcHJlY2F0ZWQsIHVzZSBgbmV0d29yay5wcm90b2NvbC5uYW1lYCBpbnN0ZWFkLlxuICpcbiAqIEBleHBlcmltZW50YWwgVGhpcyBhdHRyaWJ1dGUgaXMgZXhwZXJpbWVudGFsIGFuZCBpcyBzdWJqZWN0IHRvIGJyZWFraW5nIGNoYW5nZXMgaW4gbWlub3IgcmVsZWFzZXMgb2YgYEBvcGVudGVsZW1ldHJ5L3NlbWFudGljLWNvbnZlbnRpb25zYC5cbiAqXG4gKiBAZGVwcmVjYXRlZCBSZXBsYWNlZCBieSBgbmV0d29yay5wcm90b2NvbC5uYW1lYC5cbiAqL1xuZXhwb3J0cy5BVFRSX0hUVFBfRkxBVk9SID0gJ2h0dHAuZmxhdm9yJztcbi8qKlxuICogRGVwcmVjYXRlZCwgdXNlIG9uZSBvZiBgc2VydmVyLmFkZHJlc3NgLCBgY2xpZW50LmFkZHJlc3NgIG9yIGBodHRwLnJlcXVlc3QuaGVhZGVyLmhvc3RgIGluc3RlYWQsIGRlcGVuZGluZyBvbiB0aGUgdXNhZ2UuXG4gKlxuICogQGV4YW1wbGUgd3d3LmV4YW1wbGUub3JnXG4gKlxuICogQGV4cGVyaW1lbnRhbCBUaGlzIGF0dHJpYnV0ZSBpcyBleHBlcmltZW50YWwgYW5kIGlzIHN1YmplY3QgdG8gYnJlYWtpbmcgY2hhbmdlcyBpbiBtaW5vciByZWxlYXNlcyBvZiBgQG9wZW50ZWxlbWV0cnkvc2VtYW50aWMtY29udmVudGlvbnNgLlxuICpcbiAqIEBkZXByZWNhdGVkIFJlcGxhY2VkIGJ5IG9uZSBvZiBgc2VydmVyLmFkZHJlc3NgLCBgY2xpZW50LmFkZHJlc3NgIG9yIGBodHRwLnJlcXVlc3QuaGVhZGVyLmhvc3RgLCBkZXBlbmRpbmcgb24gdGhlIHVzYWdlLlxuICovXG5leHBvcnRzLkFUVFJfSFRUUF9IT1NUID0gJ2h0dHAuaG9zdCc7XG4vKipcbiAqIERlcHJlY2F0ZWQsIHVzZSBgaHR0cC5yZXF1ZXN0Lm1ldGhvZGAgaW5zdGVhZC5cbiAqXG4gKiBAZXhhbXBsZSBHRVRcbiAqIEBleGFtcGxlIFBPU1RcbiAqIEBleGFtcGxlIEhFQURcbiAqXG4gKiBAZXhwZXJpbWVudGFsIFRoaXMgYXR0cmlidXRlIGlzIGV4cGVyaW1lbnRhbCBhbmQgaXMgc3ViamVjdCB0byBicmVha2luZyBjaGFuZ2VzIGluIG1pbm9yIHJlbGVhc2VzIG9mIGBAb3BlbnRlbGVtZXRyeS9zZW1hbnRpYy1jb252ZW50aW9uc2AuXG4gKlxuICogQGRlcHJlY2F0ZWQgUmVwbGFjZWQgYnkgYGh0dHAucmVxdWVzdC5tZXRob2RgLlxuICovXG5leHBvcnRzLkFUVFJfSFRUUF9NRVRIT0QgPSAnaHR0cC5tZXRob2QnO1xuLyoqXG4gKiBEZXByZWNhdGVkLCB1c2UgYGh0dHAucmVxdWVzdC5oZWFkZXIuPGtleT5gIGluc3RlYWQuXG4gKlxuICogQGV4YW1wbGUgMzQ5NVxuICpcbiAqIEBleHBlcmltZW50YWwgVGhpcyBhdHRyaWJ1dGUgaXMgZXhwZXJpbWVudGFsIGFuZCBpcyBzdWJqZWN0IHRvIGJyZWFraW5nIGNoYW5nZXMgaW4gbWlub3IgcmVsZWFzZXMgb2YgYEBvcGVudGVsZW1ldHJ5L3NlbWFudGljLWNvbnZlbnRpb25zYC5cbiAqXG4gKiBAZGVwcmVjYXRlZCBSZXBsYWNlZCBieSBgaHR0cC5yZXF1ZXN0LmhlYWRlci48a2V5PmAuXG4gKi9cbmV4cG9ydHMuQVRUUl9IVFRQX1JFUVVFU1RfQ09OVEVOVF9MRU5HVEggPSAnaHR0cC5yZXF1ZXN0X2NvbnRlbnRfbGVuZ3RoJztcbi8qKlxuICogRGVwcmVjYXRlZCwgdXNlIGBodHRwLnJlcXVlc3QuYm9keS5zaXplYCBpbnN0ZWFkLlxuICpcbiAqIEBleGFtcGxlIDU0OTNcbiAqXG4gKiBAZXhwZXJpbWVudGFsIFRoaXMgYXR0cmlidXRlIGlzIGV4cGVyaW1lbnRhbCBhbmQgaXMgc3ViamVjdCB0byBicmVha2luZyBjaGFuZ2VzIGluIG1pbm9yIHJlbGVhc2VzIG9mIGBAb3BlbnRlbGVtZXRyeS9zZW1hbnRpYy1jb252ZW50aW9uc2AuXG4gKlxuICogQGRlcHJlY2F0ZWQgUmVwbGFjZWQgYnkgYGh0dHAucmVxdWVzdC5ib2R5LnNpemVgLlxuICovXG5leHBvcnRzLkFUVFJfSFRUUF9SRVFVRVNUX0NPTlRFTlRfTEVOR1RIX1VOQ09NUFJFU1NFRCA9ICdodHRwLnJlcXVlc3RfY29udGVudF9sZW5ndGhfdW5jb21wcmVzc2VkJztcbi8qKlxuICogRGVwcmVjYXRlZCwgdXNlIGBodHRwLnJlc3BvbnNlLmhlYWRlci48a2V5PmAgaW5zdGVhZC5cbiAqXG4gKiBAZXhhbXBsZSAzNDk1XG4gKlxuICogQGV4cGVyaW1lbnRhbCBUaGlzIGF0dHJpYnV0ZSBpcyBleHBlcmltZW50YWwgYW5kIGlzIHN1YmplY3QgdG8gYnJlYWtpbmcgY2hhbmdlcyBpbiBtaW5vciByZWxlYXNlcyBvZiBgQG9wZW50ZWxlbWV0cnkvc2VtYW50aWMtY29udmVudGlvbnNgLlxuICpcbiAqIEBkZXByZWNhdGVkIFJlcGxhY2VkIGJ5IGBodHRwLnJlc3BvbnNlLmhlYWRlci48a2V5PmAuXG4gKi9cbmV4cG9ydHMuQVRUUl9IVFRQX1JFU1BPTlNFX0NPTlRFTlRfTEVOR1RIID0gJ2h0dHAucmVzcG9uc2VfY29udGVudF9sZW5ndGgnO1xuLyoqXG4gKiBEZXByZWNhdGVkLCB1c2UgYGh0dHAucmVzcG9uc2UuYm9keS5zaXplYCBpbnN0ZWFkLlxuICpcbiAqIEBleGFtcGxlIDU0OTNcbiAqXG4gKiBAZXhwZXJpbWVudGFsIFRoaXMgYXR0cmlidXRlIGlzIGV4cGVyaW1lbnRhbCBhbmQgaXMgc3ViamVjdCB0byBicmVha2luZyBjaGFuZ2VzIGluIG1pbm9yIHJlbGVhc2VzIG9mIGBAb3BlbnRlbGVtZXRyeS9zZW1hbnRpYy1jb252ZW50aW9uc2AuXG4gKlxuICogQGRlcHJlY2F0ZWQgUmVwbGFjZSBieSBgaHR0cC5yZXNwb25zZS5ib2R5LnNpemVgLlxuICovXG5leHBvcnRzLkFUVFJfSFRUUF9SRVNQT05TRV9DT05URU5UX0xFTkdUSF9VTkNPTVBSRVNTRUQgPSAnaHR0cC5yZXNwb25zZV9jb250ZW50X2xlbmd0aF91bmNvbXByZXNzZWQnO1xuLyoqXG4gKiBEZXByZWNhdGVkLCB1c2UgYHVybC5zY2hlbWVgIGluc3RlYWQuXG4gKlxuICogQGV4YW1wbGUgaHR0cFxuICogQGV4YW1wbGUgaHR0cHNcbiAqXG4gKiBAZXhwZXJpbWVudGFsIFRoaXMgYXR0cmlidXRlIGlzIGV4cGVyaW1lbnRhbCBhbmQgaXMgc3ViamVjdCB0byBicmVha2luZyBjaGFuZ2VzIGluIG1pbm9yIHJlbGVhc2VzIG9mIGBAb3BlbnRlbGVtZXRyeS9zZW1hbnRpYy1jb252ZW50aW9uc2AuXG4gKlxuICogQGRlcHJlY2F0ZWQgUmVwbGFjZWQgYnkgYHVybC5zY2hlbWVgIGluc3RlYWQuXG4gKi9cbmV4cG9ydHMuQVRUUl9IVFRQX1NDSEVNRSA9ICdodHRwLnNjaGVtZSc7XG4vKipcbiAqIERlcHJlY2F0ZWQsIHVzZSBgc2VydmVyLmFkZHJlc3NgIGluc3RlYWQuXG4gKlxuICogQGV4YW1wbGUgZXhhbXBsZS5jb21cbiAqXG4gKiBAZXhwZXJpbWVudGFsIFRoaXMgYXR0cmlidXRlIGlzIGV4cGVyaW1lbnRhbCBhbmQgaXMgc3ViamVjdCB0byBicmVha2luZyBjaGFuZ2VzIGluIG1pbm9yIHJlbGVhc2VzIG9mIGBAb3BlbnRlbGVtZXRyeS9zZW1hbnRpYy1jb252ZW50aW9uc2AuXG4gKlxuICogQGRlcHJlY2F0ZWQgUmVwbGFjZWQgYnkgYHNlcnZlci5hZGRyZXNzYC5cbiAqL1xuZXhwb3J0cy5BVFRSX0hUVFBfU0VSVkVSX05BTUUgPSAnaHR0cC5zZXJ2ZXJfbmFtZSc7XG4vKipcbiAqIERlcHJlY2F0ZWQsIHVzZSBgaHR0cC5yZXNwb25zZS5zdGF0dXNfY29kZWAgaW5zdGVhZC5cbiAqXG4gKiBAZXhhbXBsZSAyMDBcbiAqXG4gKiBAZXhwZXJpbWVudGFsIFRoaXMgYXR0cmlidXRlIGlzIGV4cGVyaW1lbnRhbCBhbmQgaXMgc3ViamVjdCB0byBicmVha2luZyBjaGFuZ2VzIGluIG1pbm9yIHJlbGVhc2VzIG9mIGBAb3BlbnRlbGVtZXRyeS9zZW1hbnRpYy1jb252ZW50aW9uc2AuXG4gKlxuICogQGRlcHJlY2F0ZWQgUmVwbGFjZWQgYnkgYGh0dHAucmVzcG9uc2Uuc3RhdHVzX2NvZGVgLlxuICovXG5leHBvcnRzLkFUVFJfSFRUUF9TVEFUVVNfQ09ERSA9ICdodHRwLnN0YXR1c19jb2RlJztcbi8qKlxuICogRGVwcmVjYXRlZCwgdXNlIGB1cmwucGF0aGAgYW5kIGB1cmwucXVlcnlgIGluc3RlYWQuXG4gKlxuICogQGV4YW1wbGUgL3NlYXJjaD9xPU9wZW5UZWxlbWV0cnkjU2VtQ29udlxuICpcbiAqIEBleHBlcmltZW50YWwgVGhpcyBhdHRyaWJ1dGUgaXMgZXhwZXJpbWVudGFsIGFuZCBpcyBzdWJqZWN0IHRvIGJyZWFraW5nIGNoYW5nZXMgaW4gbWlub3IgcmVsZWFzZXMgb2YgYEBvcGVudGVsZW1ldHJ5L3NlbWFudGljLWNvbnZlbnRpb25zYC5cbiAqXG4gKiBAZGVwcmVjYXRlZCBTcGxpdCB0byBgdXJsLnBhdGhgIGFuZCBgdXJsLnF1ZXJ5LlxuICovXG5leHBvcnRzLkFUVFJfSFRUUF9UQVJHRVQgPSAnaHR0cC50YXJnZXQnO1xuLyoqXG4gKiBEZXByZWNhdGVkLCB1c2UgYHVybC5mdWxsYCBpbnN0ZWFkLlxuICpcbiAqIEBleGFtcGxlIGh0dHBzOi8vd3d3LmZvby5iYXIvc2VhcmNoP3E9T3BlblRlbGVtZXRyeSNTZW1Db252XG4gKlxuICogQGV4cGVyaW1lbnRhbCBUaGlzIGF0dHJpYnV0ZSBpcyBleHBlcmltZW50YWwgYW5kIGlzIHN1YmplY3QgdG8gYnJlYWtpbmcgY2hhbmdlcyBpbiBtaW5vciByZWxlYXNlcyBvZiBgQG9wZW50ZWxlbWV0cnkvc2VtYW50aWMtY29udmVudGlvbnNgLlxuICpcbiAqIEBkZXByZWNhdGVkIFJlcGxhY2VkIGJ5IGB1cmwuZnVsbGAuXG4gKi9cbmV4cG9ydHMuQVRUUl9IVFRQX1VSTCA9ICdodHRwLnVybCc7XG4vKipcbiAqIERlcHJlY2F0ZWQsIHVzZSBgdXNlcl9hZ2VudC5vcmlnaW5hbGAgaW5zdGVhZC5cbiAqXG4gKiBAZXhhbXBsZSBDRVJOLUxpbmVNb2RlLzIuMTUgbGlid3d3LzIuMTdiM1xuICogQGV4YW1wbGUgTW96aWxsYS81LjAgKGlQaG9uZTsgQ1BVIGlQaG9uZSBPUyAxNF83XzEgbGlrZSBNYWMgT1MgWCkgQXBwbGVXZWJLaXQvNjA1LjEuMTUgKEtIVE1MLCBsaWtlIEdlY2tvKSBWZXJzaW9uLzE0LjEuMiBNb2JpbGUvMTVFMTQ4IFNhZmFyaS82MDQuMVxuICpcbiAqIEBleHBlcmltZW50YWwgVGhpcyBhdHRyaWJ1dGUgaXMgZXhwZXJpbWVudGFsIGFuZCBpcyBzdWJqZWN0IHRvIGJyZWFraW5nIGNoYW5nZXMgaW4gbWlub3IgcmVsZWFzZXMgb2YgYEBvcGVudGVsZW1ldHJ5L3NlbWFudGljLWNvbnZlbnRpb25zYC5cbiAqXG4gKiBAZGVwcmVjYXRlZCBSZXBsYWNlZCBieSBgdXNlcl9hZ2VudC5vcmlnaW5hbGAuXG4gKi9cbmV4cG9ydHMuQVRUUl9IVFRQX1VTRVJfQUdFTlQgPSAnaHR0cC51c2VyX2FnZW50Jztcbi8qKlxuICogRGVwcmVjYXRlZCwgdXNlIGBuZXR3b3JrLmxvY2FsLmFkZHJlc3NgLlxuICpcbiAqIEBleGFtcGxlIFwiMTkyLjE2OC4wLjFcIlxuICpcbiAqIEBleHBlcmltZW50YWwgVGhpcyBhdHRyaWJ1dGUgaXMgZXhwZXJpbWVudGFsIGFuZCBpcyBzdWJqZWN0IHRvIGJyZWFraW5nIGNoYW5nZXMgaW4gbWlub3IgcmVsZWFzZXMgb2YgYEBvcGVudGVsZW1ldHJ5L3NlbWFudGljLWNvbnZlbnRpb25zYC5cbiAqXG4gKiBAZGVwcmVjYXRlZCBSZXBsYWNlZCBieSBgbmV0d29yay5sb2NhbC5hZGRyZXNzYC5cbiAqL1xuZXhwb3J0cy5BVFRSX05FVF9IT1NUX0lQID0gJ25ldC5ob3N0LmlwJztcbi8qKlxuICogRGVwcmVjYXRlZCwgdXNlIGBzZXJ2ZXIuYWRkcmVzc2AuXG4gKlxuICogQGV4YW1wbGUgZXhhbXBsZS5jb21cbiAqXG4gKiBAZXhwZXJpbWVudGFsIFRoaXMgYXR0cmlidXRlIGlzIGV4cGVyaW1lbnRhbCBhbmQgaXMgc3ViamVjdCB0byBicmVha2luZyBjaGFuZ2VzIGluIG1pbm9yIHJlbGVhc2VzIG9mIGBAb3BlbnRlbGVtZXRyeS9zZW1hbnRpYy1jb252ZW50aW9uc2AuXG4gKlxuICogQGRlcHJlY2F0ZWQgUmVwbGFjZWQgYnkgYHNlcnZlci5hZGRyZXNzYC5cbiAqL1xuZXhwb3J0cy5BVFRSX05FVF9IT1NUX05BTUUgPSAnbmV0Lmhvc3QubmFtZSc7XG4vKipcbiAqIERlcHJlY2F0ZWQsIHVzZSBgc2VydmVyLnBvcnRgLlxuICpcbiAqIEBleGFtcGxlIDgwODBcbiAqXG4gKiBAZXhwZXJpbWVudGFsIFRoaXMgYXR0cmlidXRlIGlzIGV4cGVyaW1lbnRhbCBhbmQgaXMgc3ViamVjdCB0byBicmVha2luZyBjaGFuZ2VzIGluIG1pbm9yIHJlbGVhc2VzIG9mIGBAb3BlbnRlbGVtZXRyeS9zZW1hbnRpYy1jb252ZW50aW9uc2AuXG4gKlxuICogQGRlcHJlY2F0ZWQgUmVwbGFjZWQgYnkgYHNlcnZlci5wb3J0YC5cbiAqL1xuZXhwb3J0cy5BVFRSX05FVF9IT1NUX1BPUlQgPSAnbmV0Lmhvc3QucG9ydCc7XG4vKipcbiAqIERlcHJlY2F0ZWQsIHVzZSBgbmV0d29yay5wZWVyLmFkZHJlc3NgLlxuICpcbiAqIEBleGFtcGxlIFwiMTI3LjAuMC4xXCJcbiAqXG4gKiBAZXhwZXJpbWVudGFsIFRoaXMgYXR0cmlidXRlIGlzIGV4cGVyaW1lbnRhbCBhbmQgaXMgc3ViamVjdCB0byBicmVha2luZyBjaGFuZ2VzIGluIG1pbm9yIHJlbGVhc2VzIG9mIGBAb3BlbnRlbGVtZXRyeS9zZW1hbnRpYy1jb252ZW50aW9uc2AuXG4gKlxuICogQGRlcHJlY2F0ZWQgUmVwbGFjZWQgYnkgYG5ldHdvcmsucGVlci5hZGRyZXNzYC5cbiAqL1xuZXhwb3J0cy5BVFRSX05FVF9QRUVSX0lQID0gJ25ldC5wZWVyLmlwJztcbi8qKlxuICogRGVwcmVjYXRlZCwgdXNlIGBzZXJ2ZXIuYWRkcmVzc2Agb24gY2xpZW50IHNwYW5zIGFuZCBgY2xpZW50LmFkZHJlc3NgIG9uIHNlcnZlciBzcGFucy5cbiAqXG4gKiBAZXhhbXBsZSBleGFtcGxlLmNvbVxuICpcbiAqIEBleHBlcmltZW50YWwgVGhpcyBhdHRyaWJ1dGUgaXMgZXhwZXJpbWVudGFsIGFuZCBpcyBzdWJqZWN0IHRvIGJyZWFraW5nIGNoYW5nZXMgaW4gbWlub3IgcmVsZWFzZXMgb2YgYEBvcGVudGVsZW1ldHJ5L3NlbWFudGljLWNvbnZlbnRpb25zYC5cbiAqXG4gKiBAZGVwcmVjYXRlZCBSZXBsYWNlZCBieSBgc2VydmVyLmFkZHJlc3NgIG9uIGNsaWVudCBzcGFucyBhbmQgYGNsaWVudC5hZGRyZXNzYCBvbiBzZXJ2ZXIgc3BhbnMuXG4gKi9cbmV4cG9ydHMuQVRUUl9ORVRfUEVFUl9OQU1FID0gJ25ldC5wZWVyLm5hbWUnO1xuLyoqXG4gKiBEZXByZWNhdGVkLCB1c2UgYHNlcnZlci5wb3J0YCBvbiBjbGllbnQgc3BhbnMgYW5kIGBjbGllbnQucG9ydGAgb24gc2VydmVyIHNwYW5zLlxuICpcbiAqIEBleGFtcGxlIDgwODBcbiAqXG4gKiBAZXhwZXJpbWVudGFsIFRoaXMgYXR0cmlidXRlIGlzIGV4cGVyaW1lbnRhbCBhbmQgaXMgc3ViamVjdCB0byBicmVha2luZyBjaGFuZ2VzIGluIG1pbm9yIHJlbGVhc2VzIG9mIGBAb3BlbnRlbGVtZXRyeS9zZW1hbnRpYy1jb252ZW50aW9uc2AuXG4gKlxuICogQGRlcHJlY2F0ZWQgUmVwbGFjZWQgYnkgYHNlcnZlci5wb3J0YCBvbiBjbGllbnQgc3BhbnMgYW5kIGBjbGllbnQucG9ydGAgb24gc2VydmVyIHNwYW5zLlxuICovXG5leHBvcnRzLkFUVFJfTkVUX1BFRVJfUE9SVCA9ICduZXQucGVlci5wb3J0Jztcbi8qKlxuICogRGVwcmVjYXRlZCwgdXNlIGBuZXR3b3JrLnRyYW5zcG9ydGAuXG4gKlxuICogQGV4cGVyaW1lbnRhbCBUaGlzIGF0dHJpYnV0ZSBpcyBleHBlcmltZW50YWwgYW5kIGlzIHN1YmplY3QgdG8gYnJlYWtpbmcgY2hhbmdlcyBpbiBtaW5vciByZWxlYXNlcyBvZiBgQG9wZW50ZWxlbWV0cnkvc2VtYW50aWMtY29udmVudGlvbnNgLlxuICpcbiAqIEBkZXByZWNhdGVkIFJlcGxhY2VkIGJ5IGBuZXR3b3JrLnRyYW5zcG9ydGAuXG4gKi9cbmV4cG9ydHMuQVRUUl9ORVRfVFJBTlNQT1JUID0gJ25ldC50cmFuc3BvcnQnO1xuLyoqXG4gKiBFbnVtIHZhbHVlIFwiaXBfdGNwXCIgZm9yIGF0dHJpYnV0ZSB7QGxpbmsgQVRUUl9ORVRfVFJBTlNQT1JUfS5cbiAqL1xuZXhwb3J0cy5ORVRfVFJBTlNQT1JUX1ZBTFVFX0lQX1RDUCA9ICdpcF90Y3AnO1xuLyoqXG4gKiBFbnVtIHZhbHVlIFwiaXBfdWRwXCIgZm9yIGF0dHJpYnV0ZSB7QGxpbmsgQVRUUl9ORVRfVFJBTlNQT1JUfS5cbiAqL1xuZXhwb3J0cy5ORVRfVFJBTlNQT1JUX1ZBTFVFX0lQX1VEUCA9ICdpcF91ZHAnO1xuLyoqXG4gKiBFbnVtIHZhbHVlIFwiMS4xXCIgZm9yIGF0dHJpYnV0ZSB7QGxpbmsgQVRUUl9IVFRQX0ZMQVZPUn0uXG4gKi9cbmV4cG9ydHMuSFRUUF9GTEFWT1JfVkFMVUVfSFRUUF8xXzEgPSAnMS4xJztcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXNlbWNvbnYuanMubWFwIl0sIm5hbWVzIjpbXSwiaWdub3JlTGlzdCI6WzBdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///(ssr)/./node_modules/.pnpm/@opentelemetry+instrumentation-http@0.214.0_@opentelemetry+api@1.9.1/node_modules/@opentelemetry/instrumentation-http/build/src/semconv.js\n");
|
|
|
|
/***/ }),
|
|
|
|
/***/ "(ssr)/./node_modules/.pnpm/@opentelemetry+instrumentation-http@0.214.0_@opentelemetry+api@1.9.1/node_modules/@opentelemetry/instrumentation-http/build/src/utils.js":
|
|
/*!*********************************************************************************************************************************************************************!*\
|
|
!*** ./node_modules/.pnpm/@opentelemetry+instrumentation-http@0.214.0_@opentelemetry+api@1.9.1/node_modules/@opentelemetry/instrumentation-http/build/src/utils.js ***!
|
|
\*********************************************************************************************************************************************************************/
|
|
/***/ ((__unused_webpack_module, exports, __webpack_require__) => {
|
|
|
|
eval("\nObject.defineProperty(exports, \"__esModule\", ({ value: true }));\nexports.headerCapture = exports.getIncomingStableRequestMetricAttributesOnResponse = exports.getIncomingRequestMetricAttributesOnResponse = exports.getIncomingRequestAttributesOnResponse = exports.getIncomingRequestMetricAttributes = exports.getIncomingRequestAttributes = exports.getRemoteClientAddress = exports.getOutgoingStableRequestMetricAttributesOnResponse = exports.getOutgoingRequestMetricAttributesOnResponse = exports.getOutgoingRequestAttributesOnResponse = exports.setAttributesFromHttpKind = exports.getOutgoingRequestMetricAttributes = exports.getOutgoingRequestAttributes = exports.extractHostnameAndPort = exports.isValidOptionsType = exports.getRequestInfo = exports.isCompressed = exports.setResponseContentLengthAttribute = exports.setRequestContentLengthAttribute = exports.setSpanWithError = exports.satisfiesPattern = exports.parseResponseStatus = exports.getAbsoluteUrl = void 0;\nconst api_1 = __webpack_require__(/*! @opentelemetry/api */ \"(ssr)/./node_modules/.pnpm/@opentelemetry+api@1.9.1/node_modules/@opentelemetry/api/build/esm/index.js\");\nconst semantic_conventions_1 = __webpack_require__(/*! @opentelemetry/semantic-conventions */ \"(ssr)/./node_modules/.pnpm/@opentelemetry+semantic-conventions@1.40.0/node_modules/@opentelemetry/semantic-conventions/build/esm/index.js\");\nconst semconv_1 = __webpack_require__(/*! ./semconv */ \"(ssr)/./node_modules/.pnpm/@opentelemetry+instrumentation-http@0.214.0_@opentelemetry+api@1.9.1/node_modules/@opentelemetry/instrumentation-http/build/src/semconv.js\");\nconst core_1 = __webpack_require__(/*! @opentelemetry/core */ \"(ssr)/./node_modules/.pnpm/@opentelemetry+core@2.6.1_@opentelemetry+api@1.9.1/node_modules/@opentelemetry/core/build/esm/index.js\");\nconst instrumentation_1 = __webpack_require__(/*! @opentelemetry/instrumentation */ \"(ssr)/./node_modules/.pnpm/@opentelemetry+instrumentation@0.214.0_@opentelemetry+api@1.9.1/node_modules/@opentelemetry/instrumentation/build/esm/index.js\");\nconst url = __webpack_require__(/*! url */ \"url\");\nconst AttributeNames_1 = __webpack_require__(/*! ./enums/AttributeNames */ \"(ssr)/./node_modules/.pnpm/@opentelemetry+instrumentation-http@0.214.0_@opentelemetry+api@1.9.1/node_modules/@opentelemetry/instrumentation-http/build/src/enums/AttributeNames.js\");\nconst internal_types_1 = __webpack_require__(/*! ./internal-types */ \"(ssr)/./node_modules/.pnpm/@opentelemetry+instrumentation-http@0.214.0_@opentelemetry+api@1.9.1/node_modules/@opentelemetry/instrumentation-http/build/src/internal-types.js\");\nconst internal_types_2 = __webpack_require__(/*! ./internal-types */ \"(ssr)/./node_modules/.pnpm/@opentelemetry+instrumentation-http@0.214.0_@opentelemetry+api@1.9.1/node_modules/@opentelemetry/instrumentation-http/build/src/internal-types.js\");\n// eslint-disable-next-line @typescript-eslint/no-require-imports\nconst forwardedParse = __webpack_require__(/*! forwarded-parse */ \"(ssr)/./node_modules/.pnpm/forwarded-parse@2.1.2/node_modules/forwarded-parse/index.js\");\n/**\n * Get an absolute url\n */\nconst getAbsoluteUrl = (requestUrl, headers, fallbackProtocol = 'http:', redactedQueryParams = Array.from(internal_types_2.DEFAULT_QUERY_STRINGS_TO_REDACT)) => {\n const reqUrlObject = requestUrl || {};\n const protocol = reqUrlObject.protocol || fallbackProtocol;\n const port = (reqUrlObject.port || '').toString();\n let path = reqUrlObject.path || '/';\n let host = reqUrlObject.host || reqUrlObject.hostname || headers.host || 'localhost';\n // if there is no port in host and there is a port\n // it should be displayed if it's not 80 and 443 (default ports)\n if (host.indexOf(':') === -1 &&\n port &&\n port !== '80' &&\n port !== '443') {\n host += `:${port}`;\n }\n // Redact sensitive query parameters\n if (path.includes('?')) {\n try {\n const parsedUrl = new URL(path, 'http://localhost');\n const sensitiveParamsToRedact = redactedQueryParams || [];\n for (const sensitiveParam of sensitiveParamsToRedact) {\n if (parsedUrl.searchParams.get(sensitiveParam)) {\n parsedUrl.searchParams.set(sensitiveParam, internal_types_2.STR_REDACTED);\n }\n }\n path = `${parsedUrl.pathname}${parsedUrl.search}`;\n }\n catch {\n // Ignore error, as the path was not a valid URL.\n }\n }\n const authPart = reqUrlObject.auth ? `${internal_types_2.STR_REDACTED}:${internal_types_2.STR_REDACTED}@` : '';\n return `${protocol}//${authPart}${host}${path}`;\n};\nexports.getAbsoluteUrl = getAbsoluteUrl;\n/**\n * Parse status code from HTTP response. [More details](https://github.com/open-telemetry/opentelemetry-specification/blob/master/specification/data-http.md#status)\n */\nconst parseResponseStatus = (kind, statusCode) => {\n const upperBound = kind === api_1.SpanKind.CLIENT ? 400 : 500;\n // 1xx, 2xx, 3xx are OK on client and server\n // 4xx is OK on server\n if (statusCode && statusCode >= 100 && statusCode < upperBound) {\n return api_1.SpanStatusCode.UNSET;\n }\n // All other codes are error\n return api_1.SpanStatusCode.ERROR;\n};\nexports.parseResponseStatus = parseResponseStatus;\n/**\n * Check whether the given obj match pattern\n * @param constant e.g URL of request\n * @param pattern Match pattern\n */\nconst satisfiesPattern = (constant, pattern) => {\n if (typeof pattern === 'string') {\n return pattern === constant;\n }\n else if (pattern instanceof RegExp) {\n return pattern.test(constant);\n }\n else if (typeof pattern === 'function') {\n return pattern(constant);\n }\n else {\n throw new TypeError('Pattern is in unsupported datatype');\n }\n};\nexports.satisfiesPattern = satisfiesPattern;\n/**\n * Sets the span with the error passed in params\n * @param {Span} span the span that need to be set\n * @param {Error} error error that will be set to span\n * @param {SemconvStability} semconvStability determines which semconv version to use\n */\nconst setSpanWithError = (span, error, semconvStability) => {\n const message = error.message;\n if (semconvStability & instrumentation_1.SemconvStability.OLD) {\n span.setAttribute(AttributeNames_1.AttributeNames.HTTP_ERROR_NAME, error.name);\n span.setAttribute(AttributeNames_1.AttributeNames.HTTP_ERROR_MESSAGE, message);\n }\n if (semconvStability & instrumentation_1.SemconvStability.STABLE) {\n span.setAttribute(semantic_conventions_1.ATTR_ERROR_TYPE, error.name);\n }\n span.setStatus({ code: api_1.SpanStatusCode.ERROR, message });\n span.recordException(error);\n};\nexports.setSpanWithError = setSpanWithError;\n/**\n * Adds attributes for request content-length and content-encoding HTTP headers\n * @param { IncomingMessage } Request object whose headers will be analyzed\n * @param { Attributes } Attributes object to be modified\n */\nconst setRequestContentLengthAttribute = (request, attributes) => {\n const length = getContentLength(request.headers);\n if (length === null)\n return;\n if ((0, exports.isCompressed)(request.headers)) {\n attributes[semconv_1.ATTR_HTTP_REQUEST_CONTENT_LENGTH] = length;\n }\n else {\n attributes[semconv_1.ATTR_HTTP_REQUEST_CONTENT_LENGTH_UNCOMPRESSED] = length;\n }\n};\nexports.setRequestContentLengthAttribute = setRequestContentLengthAttribute;\n/**\n * Adds attributes for response content-length and content-encoding HTTP headers\n * @param { IncomingMessage } Response object whose headers will be analyzed\n * @param { Attributes } Attributes object to be modified\n *\n * @deprecated this is for an older version of semconv. It is retained for compatibility using OTEL_SEMCONV_STABILITY_OPT_IN\n */\nconst setResponseContentLengthAttribute = (response, attributes) => {\n const length = getContentLength(response.headers);\n if (length === null)\n return;\n if ((0, exports.isCompressed)(response.headers)) {\n attributes[semconv_1.ATTR_HTTP_RESPONSE_CONTENT_LENGTH] = length;\n }\n else {\n attributes[semconv_1.ATTR_HTTP_RESPONSE_CONTENT_LENGTH_UNCOMPRESSED] = length;\n }\n};\nexports.setResponseContentLengthAttribute = setResponseContentLengthAttribute;\nfunction getContentLength(headers) {\n const contentLengthHeader = headers['content-length'];\n if (contentLengthHeader === undefined)\n return null;\n const contentLength = parseInt(contentLengthHeader, 10);\n if (isNaN(contentLength))\n return null;\n return contentLength;\n}\nconst isCompressed = (headers) => {\n const encoding = headers['content-encoding'];\n return !!encoding && encoding !== 'identity';\n};\nexports.isCompressed = isCompressed;\n/**\n * Mimics Node.js conversion of URL strings to RequestOptions expected by\n * `http.request` and `https.request` APIs.\n *\n * See https://github.com/nodejs/node/blob/2505e217bba05fc581b572c685c5cf280a16c5a3/lib/internal/url.js#L1415-L1437\n *\n * @param stringUrl\n * @throws TypeError if the URL is not valid.\n */\nfunction stringUrlToHttpOptions(stringUrl) {\n // This is heavily inspired by Node.js handling of the same situation, trying\n // to follow it as closely as possible while keeping in mind that we only\n // deal with string URLs, not URL objects.\n const { hostname, pathname, port, username, password, search, protocol, hash, href, origin, host, } = new URL(stringUrl);\n const options = {\n protocol: protocol,\n hostname: hostname && hostname[0] === '[' ? hostname.slice(1, -1) : hostname,\n hash: hash,\n search: search,\n pathname: pathname,\n path: `${pathname || ''}${search || ''}`,\n href: href,\n origin: origin,\n host: host,\n };\n if (port !== '') {\n options.port = Number(port);\n }\n if (username || password) {\n options.auth = `${decodeURIComponent(username)}:${decodeURIComponent(password)}`;\n }\n return options;\n}\n/**\n * Makes sure options is an url object\n * return an object with default value and parsed options\n * @param logger component logger\n * @param options original options for the request\n * @param [extraOptions] additional options for the request\n */\nconst getRequestInfo = (logger, options, extraOptions) => {\n let pathname;\n let origin;\n let optionsParsed;\n let invalidUrl = false;\n if (typeof options === 'string') {\n try {\n const convertedOptions = stringUrlToHttpOptions(options);\n optionsParsed = convertedOptions;\n pathname = convertedOptions.pathname || '/';\n }\n catch (e) {\n invalidUrl = true;\n logger.verbose('Unable to parse URL provided to HTTP request, using fallback to determine path. Original error:', e);\n // for backward compatibility with how url.parse() behaved.\n optionsParsed = {\n path: options,\n };\n pathname = optionsParsed.path || '/';\n }\n origin = `${optionsParsed.protocol || 'http:'}//${optionsParsed.host}`;\n if (extraOptions !== undefined) {\n Object.assign(optionsParsed, extraOptions);\n }\n }\n else if (options instanceof url.URL) {\n optionsParsed = {\n protocol: options.protocol,\n hostname: typeof options.hostname === 'string' && options.hostname.startsWith('[')\n ? options.hostname.slice(1, -1)\n : options.hostname,\n path: `${options.pathname || ''}${options.search || ''}`,\n };\n if (options.port !== '') {\n optionsParsed.port = Number(options.port);\n }\n if (options.username || options.password) {\n optionsParsed.auth = `${options.username}:${options.password}`;\n }\n pathname = options.pathname;\n origin = options.origin;\n if (extraOptions !== undefined) {\n Object.assign(optionsParsed, extraOptions);\n }\n }\n else {\n optionsParsed = Object.assign({ protocol: options.host ? 'http:' : undefined }, options);\n const hostname = optionsParsed.host ||\n (optionsParsed.port != null\n ? `${optionsParsed.hostname}${optionsParsed.port}`\n : optionsParsed.hostname);\n origin = `${optionsParsed.protocol || 'http:'}//${hostname}`;\n pathname = options.pathname;\n if (!pathname && optionsParsed.path) {\n try {\n const parsedUrl = new URL(optionsParsed.path, origin);\n pathname = parsedUrl.pathname || '/';\n }\n catch {\n pathname = '/';\n }\n }\n }\n // some packages return method in lowercase..\n // ensure upperCase for consistency\n const method = optionsParsed.method\n ? optionsParsed.method.toUpperCase()\n : 'GET';\n return { origin, pathname, method, optionsParsed, invalidUrl };\n};\nexports.getRequestInfo = getRequestInfo;\n/**\n * Makes sure options is of type string or object\n * @param options for the request\n */\nconst isValidOptionsType = (options) => {\n if (!options) {\n return false;\n }\n const type = typeof options;\n return type === 'string' || (type === 'object' && !Array.isArray(options));\n};\nexports.isValidOptionsType = isValidOptionsType;\nconst extractHostnameAndPort = (requestOptions) => {\n if (requestOptions.hostname && requestOptions.port) {\n return { hostname: requestOptions.hostname, port: requestOptions.port };\n }\n const matches = requestOptions.host?.match(/^([^:/ ]+)(:\\d{1,5})?/) || null;\n const hostname = requestOptions.hostname || (matches === null ? 'localhost' : matches[1]);\n let port = requestOptions.port;\n if (!port) {\n if (matches && matches[2]) {\n // remove the leading \":\". The extracted port would be something like \":8080\"\n port = matches[2].substring(1);\n }\n else {\n port = requestOptions.protocol === 'https:' ? '443' : '80';\n }\n }\n return { hostname, port };\n};\nexports.extractHostnameAndPort = extractHostnameAndPort;\n/**\n * Returns outgoing request attributes scoped to the options passed to the request\n * @param {ParsedRequestOptions} requestOptions the same options used to make the request\n * @param {{ component: string, hostname: string, hookAttributes?: Attributes }} options used to pass data needed to create attributes\n * @param {SemconvStability} semconvStability determines which semconv version to use\n */\nconst getOutgoingRequestAttributes = (requestOptions, options, semconvStability, enableSyntheticSourceDetection) => {\n const hostname = options.hostname;\n const port = options.port;\n const method = requestOptions.method ?? 'GET';\n const normalizedMethod = normalizeMethod(method);\n const headers = (requestOptions.headers || {});\n const userAgent = headers['user-agent'];\n const urlFull = (0, exports.getAbsoluteUrl)(requestOptions, headers, `${options.component}:`, options.redactedQueryParams);\n const oldAttributes = {\n [semconv_1.ATTR_HTTP_URL]: urlFull,\n [semconv_1.ATTR_HTTP_METHOD]: method,\n [semconv_1.ATTR_HTTP_TARGET]: requestOptions.path || '/',\n [semconv_1.ATTR_NET_PEER_NAME]: hostname,\n [semconv_1.ATTR_HTTP_HOST]: headers.host ?? `${hostname}:${port}`,\n };\n const newAttributes = {\n // Required attributes\n [semantic_conventions_1.ATTR_HTTP_REQUEST_METHOD]: normalizedMethod,\n [semantic_conventions_1.ATTR_SERVER_ADDRESS]: hostname,\n [semantic_conventions_1.ATTR_SERVER_PORT]: Number(port),\n [semantic_conventions_1.ATTR_URL_FULL]: urlFull,\n [semantic_conventions_1.ATTR_USER_AGENT_ORIGINAL]: userAgent,\n // leaving out protocol version, it is not yet negotiated\n // leaving out protocol name, it is only required when protocol version is set\n // retries and redirects not supported\n // Opt-in attributes left off for now\n };\n // conditionally required if request method required case normalization\n if (method !== normalizedMethod) {\n newAttributes[semantic_conventions_1.ATTR_HTTP_REQUEST_METHOD_ORIGINAL] = method;\n }\n if (enableSyntheticSourceDetection && userAgent) {\n newAttributes[semconv_1.ATTR_USER_AGENT_SYNTHETIC_TYPE] = getSyntheticType(userAgent);\n }\n if (userAgent !== undefined) {\n oldAttributes[semconv_1.ATTR_HTTP_USER_AGENT] = userAgent;\n }\n switch (semconvStability) {\n case instrumentation_1.SemconvStability.STABLE:\n return Object.assign(newAttributes, options.hookAttributes);\n case instrumentation_1.SemconvStability.OLD:\n return Object.assign(oldAttributes, options.hookAttributes);\n }\n return Object.assign(oldAttributes, newAttributes, options.hookAttributes);\n};\nexports.getOutgoingRequestAttributes = getOutgoingRequestAttributes;\n/**\n * Returns outgoing request Metric attributes scoped to the request data\n * @param {Attributes} spanAttributes the span attributes\n */\nconst getOutgoingRequestMetricAttributes = (spanAttributes) => {\n const metricAttributes = {};\n metricAttributes[semconv_1.ATTR_HTTP_METHOD] = spanAttributes[semconv_1.ATTR_HTTP_METHOD];\n metricAttributes[semconv_1.ATTR_NET_PEER_NAME] = spanAttributes[semconv_1.ATTR_NET_PEER_NAME];\n //TODO: http.url attribute, it should substitute any parameters to avoid high cardinality.\n return metricAttributes;\n};\nexports.getOutgoingRequestMetricAttributes = getOutgoingRequestMetricAttributes;\n/**\n * Returns attributes related to the kind of HTTP protocol used\n * @param {string} [kind] Kind of HTTP protocol used: \"1.0\", \"1.1\", \"2\", \"SPDY\" or \"QUIC\".\n */\nconst setAttributesFromHttpKind = (kind, attributes) => {\n if (kind) {\n attributes[semconv_1.ATTR_HTTP_FLAVOR] = kind;\n if (kind.toUpperCase() !== 'QUIC') {\n attributes[semconv_1.ATTR_NET_TRANSPORT] = semconv_1.NET_TRANSPORT_VALUE_IP_TCP;\n }\n else {\n attributes[semconv_1.ATTR_NET_TRANSPORT] = semconv_1.NET_TRANSPORT_VALUE_IP_UDP;\n }\n }\n};\nexports.setAttributesFromHttpKind = setAttributesFromHttpKind;\n/**\n * Returns the type of synthetic source based on the user agent\n * @param {OutgoingHttpHeader} userAgent the user agent string\n */\nconst getSyntheticType = (userAgent) => {\n const userAgentString = String(userAgent).toLowerCase();\n for (const name of internal_types_1.SYNTHETIC_TEST_NAMES) {\n if (userAgentString.includes(name)) {\n return semconv_1.USER_AGENT_SYNTHETIC_TYPE_VALUE_TEST;\n }\n }\n for (const name of internal_types_1.SYNTHETIC_BOT_NAMES) {\n if (userAgentString.includes(name)) {\n return semconv_1.USER_AGENT_SYNTHETIC_TYPE_VALUE_BOT;\n }\n }\n return;\n};\n/**\n * Returns outgoing request attributes scoped to the response data\n * @param {IncomingMessage} response the response object\n * @param {SemconvStability} semconvStability determines which semconv version to use\n */\nconst getOutgoingRequestAttributesOnResponse = (response, semconvStability) => {\n const { statusCode, statusMessage, httpVersion, socket } = response;\n const oldAttributes = {};\n const stableAttributes = {};\n if (statusCode != null) {\n stableAttributes[semantic_conventions_1.ATTR_HTTP_RESPONSE_STATUS_CODE] = statusCode;\n }\n if (socket) {\n const { remoteAddress, remotePort } = socket;\n oldAttributes[semconv_1.ATTR_NET_PEER_IP] = remoteAddress;\n oldAttributes[semconv_1.ATTR_NET_PEER_PORT] = remotePort;\n // Recommended\n stableAttributes[semantic_conventions_1.ATTR_NETWORK_PEER_ADDRESS] = remoteAddress;\n stableAttributes[semantic_conventions_1.ATTR_NETWORK_PEER_PORT] = remotePort;\n stableAttributes[semantic_conventions_1.ATTR_NETWORK_PROTOCOL_VERSION] = response.httpVersion;\n }\n (0, exports.setResponseContentLengthAttribute)(response, oldAttributes);\n if (statusCode) {\n oldAttributes[semconv_1.ATTR_HTTP_STATUS_CODE] = statusCode;\n oldAttributes[AttributeNames_1.AttributeNames.HTTP_STATUS_TEXT] = (statusMessage || '').toUpperCase();\n }\n (0, exports.setAttributesFromHttpKind)(httpVersion, oldAttributes);\n switch (semconvStability) {\n case instrumentation_1.SemconvStability.STABLE:\n return stableAttributes;\n case instrumentation_1.SemconvStability.OLD:\n return oldAttributes;\n }\n return Object.assign(oldAttributes, stableAttributes);\n};\nexports.getOutgoingRequestAttributesOnResponse = getOutgoingRequestAttributesOnResponse;\n/**\n * Returns outgoing request Metric attributes scoped to the response data\n * @param {Attributes} spanAttributes the span attributes\n */\nconst getOutgoingRequestMetricAttributesOnResponse = (spanAttributes) => {\n const metricAttributes = {};\n metricAttributes[semconv_1.ATTR_NET_PEER_PORT] = spanAttributes[semconv_1.ATTR_NET_PEER_PORT];\n metricAttributes[semconv_1.ATTR_HTTP_STATUS_CODE] =\n spanAttributes[semconv_1.ATTR_HTTP_STATUS_CODE];\n metricAttributes[semconv_1.ATTR_HTTP_FLAVOR] = spanAttributes[semconv_1.ATTR_HTTP_FLAVOR];\n return metricAttributes;\n};\nexports.getOutgoingRequestMetricAttributesOnResponse = getOutgoingRequestMetricAttributesOnResponse;\nconst getOutgoingStableRequestMetricAttributesOnResponse = (spanAttributes) => {\n const metricAttributes = {};\n if (spanAttributes[semantic_conventions_1.ATTR_NETWORK_PROTOCOL_VERSION]) {\n metricAttributes[semantic_conventions_1.ATTR_NETWORK_PROTOCOL_VERSION] =\n spanAttributes[semantic_conventions_1.ATTR_NETWORK_PROTOCOL_VERSION];\n }\n if (spanAttributes[semantic_conventions_1.ATTR_HTTP_RESPONSE_STATUS_CODE]) {\n metricAttributes[semantic_conventions_1.ATTR_HTTP_RESPONSE_STATUS_CODE] =\n spanAttributes[semantic_conventions_1.ATTR_HTTP_RESPONSE_STATUS_CODE];\n }\n return metricAttributes;\n};\nexports.getOutgoingStableRequestMetricAttributesOnResponse = getOutgoingStableRequestMetricAttributesOnResponse;\nfunction parseHostHeader(hostHeader, proto) {\n const parts = hostHeader.split(':');\n // no semicolon implies ipv4 dotted syntax or host name without port\n // x.x.x.x\n // example.com\n if (parts.length === 1) {\n if (proto === 'http') {\n return { host: parts[0], port: '80' };\n }\n if (proto === 'https') {\n return { host: parts[0], port: '443' };\n }\n return { host: parts[0] };\n }\n // single semicolon implies ipv4 dotted syntax or host name with port\n // x.x.x.x:yyyy\n // example.com:yyyy\n if (parts.length === 2) {\n return {\n host: parts[0],\n port: parts[1],\n };\n }\n // more than 2 parts implies ipv6 syntax with multiple colons\n // [x:x:x:x:x:x:x:x]\n // [x:x:x:x:x:x:x:x]:yyyy\n if (parts[0].startsWith('[')) {\n if (parts[parts.length - 1].endsWith(']')) {\n if (proto === 'http') {\n return { host: hostHeader, port: '80' };\n }\n if (proto === 'https') {\n return { host: hostHeader, port: '443' };\n }\n }\n else if (parts[parts.length - 2].endsWith(']')) {\n return {\n host: parts.slice(0, -1).join(':'),\n port: parts[parts.length - 1],\n };\n }\n }\n // if nothing above matches just return the host header\n return { host: hostHeader };\n}\n/**\n * Get server.address and port according to http semconv 1.27\n * https://github.com/open-telemetry/semantic-conventions/blob/bf0a2c1134f206f034408b201dbec37960ed60ec/docs/http/http-spans.md#setting-serveraddress-and-serverport-attributes\n */\nfunction getServerAddress(request, component) {\n const forwardedHeader = request.headers['forwarded'];\n if (forwardedHeader) {\n for (const entry of parseForwardedHeader(forwardedHeader)) {\n if (entry.host) {\n return parseHostHeader(entry.host, entry.proto);\n }\n }\n }\n const xForwardedHost = request.headers['x-forwarded-host'];\n if (typeof xForwardedHost === 'string') {\n if (typeof request.headers['x-forwarded-proto'] === 'string') {\n return parseHostHeader(xForwardedHost, request.headers['x-forwarded-proto']);\n }\n if (Array.isArray(request.headers['x-forwarded-proto'])) {\n return parseHostHeader(xForwardedHost, request.headers['x-forwarded-proto'][0]);\n }\n return parseHostHeader(xForwardedHost);\n }\n else if (Array.isArray(xForwardedHost) &&\n typeof xForwardedHost[0] === 'string' &&\n xForwardedHost[0].length > 0) {\n if (typeof request.headers['x-forwarded-proto'] === 'string') {\n return parseHostHeader(xForwardedHost[0], request.headers['x-forwarded-proto']);\n }\n if (Array.isArray(request.headers['x-forwarded-proto'])) {\n return parseHostHeader(xForwardedHost[0], request.headers['x-forwarded-proto'][0]);\n }\n return parseHostHeader(xForwardedHost[0]);\n }\n const host = request.headers['host'];\n if (typeof host === 'string' && host.length > 0) {\n return parseHostHeader(host, component);\n }\n return null;\n}\n/**\n * Get server.address and port according to http semconv 1.27\n * https://github.com/open-telemetry/semantic-conventions/blob/bf0a2c1134f206f034408b201dbec37960ed60ec/docs/http/http-spans.md#setting-serveraddress-and-serverport-attributes\n */\nfunction getRemoteClientAddress(request) {\n const forwardedHeader = request.headers['forwarded'];\n if (forwardedHeader) {\n for (const entry of parseForwardedHeader(forwardedHeader)) {\n if (entry.for) {\n return removePortFromAddress(entry.for);\n }\n }\n }\n const xForwardedFor = request.headers['x-forwarded-for'];\n if (xForwardedFor) {\n let xForwardedForVal;\n if (typeof xForwardedFor === 'string') {\n xForwardedForVal = xForwardedFor;\n }\n else if (Array.isArray(xForwardedFor)) {\n xForwardedForVal = xForwardedFor[0];\n }\n if (typeof xForwardedForVal === 'string') {\n xForwardedForVal = xForwardedForVal.split(',')[0].trim();\n return removePortFromAddress(xForwardedForVal);\n }\n }\n const remote = request.socket.remoteAddress;\n if (remote) {\n return remote;\n }\n return null;\n}\nexports.getRemoteClientAddress = getRemoteClientAddress;\nfunction removePortFromAddress(input) {\n // This function can be replaced with SocketAddress.parse() once the minimum\n // supported Node.js version allows it.\n try {\n const { hostname: address } = new URL(`http://${input}`);\n if (address.startsWith('[') && address.endsWith(']')) {\n return address.slice(1, -1);\n }\n return address;\n }\n catch {\n return input;\n }\n}\nfunction getInfoFromIncomingMessage(component, request, logger) {\n try {\n if (request.headers.host) {\n return new URL(request.url ?? '/', `${component}://${request.headers.host}`);\n }\n else {\n const unsafeParsedUrl = new URL(request.url ?? '/', \n // using localhost as a workaround to still use the URL constructor for parsing\n `${component}://localhost`);\n // since we use localhost as a workaround, ensure we hide the rest of the properties to avoid\n // our workaround leaking though.\n return {\n pathname: unsafeParsedUrl.pathname,\n search: unsafeParsedUrl.search,\n toString: function () {\n // we cannot use the result of unsafeParsedUrl.toString as it's potentially wrong.\n return unsafeParsedUrl.pathname + unsafeParsedUrl.search;\n },\n };\n }\n }\n catch (e) {\n // something is wrong, use undefined - this *should* never happen, logging\n // for troubleshooting in case it does happen.\n logger.verbose('Unable to get URL from request', e);\n return {};\n }\n}\n/**\n * Returns incoming request attributes scoped to the request data\n * @param {IncomingMessage} request the request object\n * @param {{ component: string, serverName?: string, hookAttributes?: Attributes }} options used to pass data needed to create attributes\n * @param {SemconvStability} semconvStability determines which semconv version to use\n */\nconst getIncomingRequestAttributes = (request, options, logger) => {\n const { component, enableSyntheticSourceDetection, hookAttributes, semconvStability, serverName, } = options;\n const { headers, httpVersion, method } = request;\n const { host, 'user-agent': userAgent, 'x-forwarded-for': ips } = headers;\n const parsedUrl = getInfoFromIncomingMessage(component, request, logger);\n let newAttributes;\n let oldAttributes;\n if (semconvStability !== instrumentation_1.SemconvStability.OLD) {\n // Stable attributes are used.\n const normalizedMethod = normalizeMethod(method);\n const serverAddress = getServerAddress(request, component);\n const remoteClientAddress = getRemoteClientAddress(request);\n newAttributes = {\n [semantic_conventions_1.ATTR_HTTP_REQUEST_METHOD]: normalizedMethod,\n [semantic_conventions_1.ATTR_URL_SCHEME]: component,\n [semantic_conventions_1.ATTR_SERVER_ADDRESS]: serverAddress?.host,\n [semantic_conventions_1.ATTR_NETWORK_PEER_ADDRESS]: request.socket.remoteAddress,\n [semantic_conventions_1.ATTR_NETWORK_PEER_PORT]: request.socket.remotePort,\n [semantic_conventions_1.ATTR_NETWORK_PROTOCOL_VERSION]: request.httpVersion,\n [semantic_conventions_1.ATTR_USER_AGENT_ORIGINAL]: userAgent,\n };\n if (parsedUrl.pathname != null) {\n newAttributes[semantic_conventions_1.ATTR_URL_PATH] = parsedUrl.pathname;\n }\n if (parsedUrl.search) {\n // Remove leading '?' from URL search (https://developer.mozilla.org/en-US/docs/Web/API/URL/search).\n newAttributes[semantic_conventions_1.ATTR_URL_QUERY] = parsedUrl.search.slice(1);\n }\n if (remoteClientAddress != null) {\n newAttributes[semantic_conventions_1.ATTR_CLIENT_ADDRESS] = remoteClientAddress;\n }\n if (serverAddress?.port != null) {\n newAttributes[semantic_conventions_1.ATTR_SERVER_PORT] = Number(serverAddress.port);\n }\n // Conditionally required if request method required case normalization.\n if (method !== normalizedMethod) {\n newAttributes[semantic_conventions_1.ATTR_HTTP_REQUEST_METHOD_ORIGINAL] = method;\n }\n if (enableSyntheticSourceDetection && userAgent) {\n newAttributes[semconv_1.ATTR_USER_AGENT_SYNTHETIC_TYPE] =\n getSyntheticType(userAgent);\n }\n }\n if (semconvStability !== instrumentation_1.SemconvStability.STABLE) {\n // Old attributes are used.\n const hostname = host?.replace(/^(.*)(:[0-9]{1,5})/, '$1') || 'localhost';\n oldAttributes = {\n [semconv_1.ATTR_HTTP_URL]: parsedUrl.toString(),\n [semconv_1.ATTR_HTTP_HOST]: host,\n [semconv_1.ATTR_NET_HOST_NAME]: hostname,\n [semconv_1.ATTR_HTTP_METHOD]: method,\n [semconv_1.ATTR_HTTP_SCHEME]: component,\n };\n if (typeof ips === 'string') {\n oldAttributes[semconv_1.ATTR_HTTP_CLIENT_IP] = ips.split(',')[0];\n }\n if (typeof serverName === 'string') {\n oldAttributes[semconv_1.ATTR_HTTP_SERVER_NAME] = serverName;\n }\n if (parsedUrl.pathname) {\n oldAttributes[semconv_1.ATTR_HTTP_TARGET] =\n parsedUrl.pathname + parsedUrl.search || '/';\n }\n if (userAgent !== undefined) {\n oldAttributes[semconv_1.ATTR_HTTP_USER_AGENT] = userAgent;\n }\n (0, exports.setRequestContentLengthAttribute)(request, oldAttributes);\n (0, exports.setAttributesFromHttpKind)(httpVersion, oldAttributes);\n }\n switch (semconvStability) {\n case instrumentation_1.SemconvStability.STABLE:\n return Object.assign(newAttributes, hookAttributes);\n case instrumentation_1.SemconvStability.OLD:\n return Object.assign(oldAttributes, hookAttributes);\n default:\n return Object.assign(oldAttributes, newAttributes, hookAttributes);\n }\n};\nexports.getIncomingRequestAttributes = getIncomingRequestAttributes;\n/**\n * Returns incoming request Metric attributes scoped to the request data\n * @param {Attributes} spanAttributes the span attributes\n * @param {{ component: string }} options used to pass data needed to create attributes\n */\nconst getIncomingRequestMetricAttributes = (spanAttributes) => {\n const metricAttributes = {};\n metricAttributes[semconv_1.ATTR_HTTP_SCHEME] = spanAttributes[semconv_1.ATTR_HTTP_SCHEME];\n metricAttributes[semconv_1.ATTR_HTTP_METHOD] = spanAttributes[semconv_1.ATTR_HTTP_METHOD];\n metricAttributes[semconv_1.ATTR_NET_HOST_NAME] = spanAttributes[semconv_1.ATTR_NET_HOST_NAME];\n metricAttributes[semconv_1.ATTR_HTTP_FLAVOR] = spanAttributes[semconv_1.ATTR_HTTP_FLAVOR];\n //TODO: http.target attribute, it should substitute any parameters to avoid high cardinality.\n return metricAttributes;\n};\nexports.getIncomingRequestMetricAttributes = getIncomingRequestMetricAttributes;\n/**\n * Returns incoming request attributes scoped to the response data\n * @param {(ServerResponse & { socket: Socket; })} response the response object\n */\nconst getIncomingRequestAttributesOnResponse = (request, response, semconvStability) => {\n // take socket from the request,\n // since it may be detached from the response object in keep-alive mode\n const { socket } = request;\n const { statusCode, statusMessage } = response;\n const newAttributes = {\n [semantic_conventions_1.ATTR_HTTP_RESPONSE_STATUS_CODE]: statusCode,\n };\n const rpcMetadata = (0, core_1.getRPCMetadata)(api_1.context.active());\n const oldAttributes = {};\n if (socket) {\n const { localAddress, localPort, remoteAddress, remotePort } = socket;\n oldAttributes[semconv_1.ATTR_NET_HOST_IP] = localAddress;\n oldAttributes[semconv_1.ATTR_NET_HOST_PORT] = localPort;\n oldAttributes[semconv_1.ATTR_NET_PEER_IP] = remoteAddress;\n oldAttributes[semconv_1.ATTR_NET_PEER_PORT] = remotePort;\n }\n oldAttributes[semconv_1.ATTR_HTTP_STATUS_CODE] = statusCode;\n oldAttributes[AttributeNames_1.AttributeNames.HTTP_STATUS_TEXT] = (statusMessage || '').toUpperCase();\n if (rpcMetadata?.type === core_1.RPCType.HTTP && rpcMetadata.route !== undefined) {\n oldAttributes[semantic_conventions_1.ATTR_HTTP_ROUTE] = rpcMetadata.route;\n newAttributes[semantic_conventions_1.ATTR_HTTP_ROUTE] = rpcMetadata.route;\n }\n switch (semconvStability) {\n case instrumentation_1.SemconvStability.STABLE:\n return newAttributes;\n case instrumentation_1.SemconvStability.OLD:\n return oldAttributes;\n }\n return Object.assign(oldAttributes, newAttributes);\n};\nexports.getIncomingRequestAttributesOnResponse = getIncomingRequestAttributesOnResponse;\n/**\n * Returns incoming request Metric attributes scoped to the request data\n * @param {Attributes} spanAttributes the span attributes\n */\nconst getIncomingRequestMetricAttributesOnResponse = (spanAttributes) => {\n const metricAttributes = {};\n metricAttributes[semconv_1.ATTR_HTTP_STATUS_CODE] =\n spanAttributes[semconv_1.ATTR_HTTP_STATUS_CODE];\n metricAttributes[semconv_1.ATTR_NET_HOST_PORT] = spanAttributes[semconv_1.ATTR_NET_HOST_PORT];\n if (spanAttributes[semantic_conventions_1.ATTR_HTTP_ROUTE] !== undefined) {\n metricAttributes[semantic_conventions_1.ATTR_HTTP_ROUTE] = spanAttributes[semantic_conventions_1.ATTR_HTTP_ROUTE];\n }\n return metricAttributes;\n};\nexports.getIncomingRequestMetricAttributesOnResponse = getIncomingRequestMetricAttributesOnResponse;\n/**\n * Returns incoming stable request Metric attributes scoped to the request data\n * @param {Attributes} spanAttributes the span attributes\n */\nconst getIncomingStableRequestMetricAttributesOnResponse = (spanAttributes) => {\n const metricAttributes = {};\n if (spanAttributes[semantic_conventions_1.ATTR_HTTP_ROUTE] !== undefined) {\n metricAttributes[semantic_conventions_1.ATTR_HTTP_ROUTE] = spanAttributes[semantic_conventions_1.ATTR_HTTP_ROUTE];\n }\n // required if and only if one was sent, same as span requirement\n if (spanAttributes[semantic_conventions_1.ATTR_HTTP_RESPONSE_STATUS_CODE]) {\n metricAttributes[semantic_conventions_1.ATTR_HTTP_RESPONSE_STATUS_CODE] =\n spanAttributes[semantic_conventions_1.ATTR_HTTP_RESPONSE_STATUS_CODE];\n }\n return metricAttributes;\n};\nexports.getIncomingStableRequestMetricAttributesOnResponse = getIncomingStableRequestMetricAttributesOnResponse;\nfunction headerCapture(type, headers, semconvStability) {\n const normalizedHeaders = new Map();\n for (let i = 0, len = headers.length; i < len; i++) {\n const capturedHeader = headers[i].toLowerCase();\n if (semconvStability & instrumentation_1.SemconvStability.STABLE) {\n normalizedHeaders.set(capturedHeader, capturedHeader);\n }\n else {\n // In old semconv, the header name converted hypen to underscore, e.g.:\n // `http.request.header.content_length`.\n normalizedHeaders.set(capturedHeader, capturedHeader.replaceAll('-', '_'));\n }\n }\n return (getHeader) => {\n const attributes = {};\n for (const capturedHeader of normalizedHeaders.keys()) {\n const value = getHeader(capturedHeader);\n if (value === undefined) {\n continue;\n }\n const normalizedHeader = normalizedHeaders.get(capturedHeader);\n const key = `http.${type}.header.${normalizedHeader}`;\n if (typeof value === 'string') {\n attributes[key] = [value];\n }\n else if (Array.isArray(value)) {\n attributes[key] = value;\n }\n else {\n attributes[key] = [value];\n }\n }\n return attributes;\n };\n}\nexports.headerCapture = headerCapture;\nconst KNOWN_METHODS = new Set([\n // methods from https://www.rfc-editor.org/rfc/rfc9110.html#name-methods\n 'GET',\n 'HEAD',\n 'POST',\n 'PUT',\n 'DELETE',\n 'CONNECT',\n 'OPTIONS',\n 'TRACE',\n // PATCH from https://www.rfc-editor.org/rfc/rfc5789.html\n 'PATCH',\n // QUERY from https://datatracker.ietf.org/doc/draft-ietf-httpbis-safe-method-w-body/\n 'QUERY',\n]);\nfunction normalizeMethod(method) {\n if (method == null) {\n return 'GET';\n }\n const upper = method.toUpperCase();\n if (KNOWN_METHODS.has(upper)) {\n return upper;\n }\n return '_OTHER';\n}\nfunction parseForwardedHeader(header) {\n try {\n return forwardedParse(header);\n }\n catch {\n return [];\n }\n}\n//# sourceMappingURL=utils.js.map//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKHNzcikvLi9ub2RlX21vZHVsZXMvLnBucG0vQG9wZW50ZWxlbWV0cnkraW5zdHJ1bWVudGF0aW9uLWh0dHBAMC4yMTQuMF9Ab3BlbnRlbGVtZXRyeSthcGlAMS45LjEvbm9kZV9tb2R1bGVzL0BvcGVudGVsZW1ldHJ5L2luc3RydW1lbnRhdGlvbi1odHRwL2J1aWxkL3NyYy91dGlscy5qcyIsIm1hcHBpbmdzIjoiQUFBYTtBQUNiLDhDQUE2QyxFQUFFLGFBQWEsRUFBQztBQUM3RCxxQkFBcUIsR0FBRywwREFBMEQsR0FBRyxvREFBb0QsR0FBRyw4Q0FBOEMsR0FBRywwQ0FBMEMsR0FBRyxvQ0FBb0MsR0FBRyw4QkFBOEIsR0FBRywwREFBMEQsR0FBRyxvREFBb0QsR0FBRyw4Q0FBOEMsR0FBRyxpQ0FBaUMsR0FBRywwQ0FBMEMsR0FBRyxvQ0FBb0MsR0FBRyw4QkFBOEIsR0FBRywwQkFBMEIsR0FBRyxzQkFBc0IsR0FBRyxvQkFBb0IsR0FBRyx5Q0FBeUMsR0FBRyx3Q0FBd0MsR0FBRyx3QkFBd0IsR0FBRyx3QkFBd0IsR0FBRywyQkFBMkIsR0FBRyxzQkFBc0I7QUFDOTNCLGNBQWMsbUJBQU8sQ0FBQyxrSUFBb0I7QUFDMUMsK0JBQStCLG1CQUFPLENBQUMsc0xBQXFDO0FBQzVFLGtCQUFrQixtQkFBTyxDQUFDLHdMQUFXO0FBQ3JDLGVBQWUsbUJBQU8sQ0FBQyw4SkFBcUI7QUFDNUMsMEJBQTBCLG1CQUFPLENBQUMsaU1BQWdDO0FBQ2xFLFlBQVksbUJBQU8sQ0FBQyxnQkFBSztBQUN6Qix5QkFBeUIsbUJBQU8sQ0FBQyxrTkFBd0I7QUFDekQseUJBQXlCLG1CQUFPLENBQUMsc01BQWtCO0FBQ25ELHlCQUF5QixtQkFBTyxDQUFDLHNNQUFrQjtBQUNuRDtBQUNBLHVCQUF1QixtQkFBTyxDQUFDLCtHQUFpQjtBQUNoRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxvQkFBb0IsS0FBSztBQUN6QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esc0JBQXNCLG1CQUFtQixFQUFFLGlCQUFpQjtBQUM1RDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsNENBQTRDLDhCQUE4QixHQUFHLDhCQUE4QjtBQUMzRyxjQUFjLFNBQVMsSUFBSSxTQUFTLEVBQUUsS0FBSyxFQUFFLEtBQUs7QUFDbEQ7QUFDQSxzQkFBc0I7QUFDdEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSwyQkFBMkI7QUFDM0I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx3QkFBd0I7QUFDeEI7QUFDQTtBQUNBLFdBQVcsTUFBTTtBQUNqQixXQUFXLE9BQU87QUFDbEIsV0FBVyxrQkFBa0I7QUFDN0I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxxQkFBcUIsMkNBQTJDO0FBQ2hFO0FBQ0E7QUFDQSx3QkFBd0I7QUFDeEI7QUFDQTtBQUNBLFlBQVksa0JBQWtCO0FBQzlCLFlBQVksYUFBYTtBQUN6QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx3Q0FBd0M7QUFDeEM7QUFDQTtBQUNBLFlBQVksa0JBQWtCO0FBQzlCLFlBQVksYUFBYTtBQUN6QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EseUNBQXlDO0FBQ3pDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esb0JBQW9CO0FBQ3BCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsWUFBWSw0RkFBNEY7QUFDeEc7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUJBQWlCLGVBQWUsRUFBRSxhQUFhO0FBQy9DO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSwwQkFBMEIsNkJBQTZCLEdBQUcsNkJBQTZCO0FBQ3ZGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG9CQUFvQixrQ0FBa0MsSUFBSSxtQkFBbUI7QUFDN0U7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxxQkFBcUIsdUJBQXVCLEVBQUUscUJBQXFCO0FBQ25FO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxvQ0FBb0MsaUJBQWlCLEdBQUcsaUJBQWlCO0FBQ3pFO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx3Q0FBd0MsOENBQThDO0FBQ3RGO0FBQ0E7QUFDQSxxQkFBcUIsdUJBQXVCLEVBQUUsbUJBQW1CO0FBQ2pFO0FBQ0Esb0JBQW9CLGtDQUFrQyxJQUFJLFNBQVM7QUFDbkU7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQSxzQkFBc0I7QUFDdEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDBCQUEwQjtBQUMxQjtBQUNBO0FBQ0EsaUJBQWlCO0FBQ2pCO0FBQ0EsK0RBQStELElBQUk7QUFDbkU7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBLDhCQUE4QjtBQUM5QjtBQUNBO0FBQ0EsV0FBVyxzQkFBc0I7QUFDakMsYUFBYSxvRUFBb0U7QUFDakYsV0FBVyxrQkFBa0I7QUFDN0I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaURBQWlEO0FBQ2pEO0FBQ0EsNEVBQTRFLGtCQUFrQjtBQUM5RjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsdURBQXVELFNBQVMsR0FBRyxLQUFLO0FBQ3hFO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esb0NBQW9DO0FBQ3BDO0FBQ0E7QUFDQSxXQUFXLFlBQVk7QUFDdkI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDBDQUEwQztBQUMxQztBQUNBO0FBQ0EsV0FBVyxRQUFRO0FBQ25CO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlDQUFpQztBQUNqQztBQUNBO0FBQ0EsV0FBVyxvQkFBb0I7QUFDL0I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsaUJBQWlCO0FBQzVCLFdBQVcsa0JBQWtCO0FBQzdCO0FBQ0E7QUFDQSxZQUFZLGlEQUFpRDtBQUM3RDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxnQkFBZ0IsNEJBQTRCO0FBQzVDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDhDQUE4QztBQUM5QztBQUNBO0FBQ0EsV0FBVyxZQUFZO0FBQ3ZCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG9EQUFvRDtBQUNwRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSwwREFBMEQ7QUFDMUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxxQkFBcUI7QUFDckI7QUFDQTtBQUNBLHFCQUFxQjtBQUNyQjtBQUNBLGlCQUFpQjtBQUNqQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHlCQUF5QjtBQUN6QjtBQUNBO0FBQ0EseUJBQXlCO0FBQ3pCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw4QkFBOEI7QUFDOUI7QUFDQTtBQUNBO0FBQ0E7QUFDQSxnQkFBZ0Isb0JBQW9CLG9CQUFvQixNQUFNO0FBQzlEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGtEQUFrRCxVQUFVLEtBQUsscUJBQXFCO0FBQ3RGO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZUFBZSxVQUFVO0FBQ3pCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQkFBaUI7QUFDakI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVyxpQkFBaUI7QUFDNUIsYUFBYSx1RUFBdUU7QUFDcEYsV0FBVyxrQkFBa0I7QUFDN0I7QUFDQTtBQUNBLFlBQVksMkZBQTJGO0FBQ3ZHLFlBQVksK0JBQStCO0FBQzNDLFlBQVksd0RBQXdEO0FBQ3BFO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxxREFBcUQsSUFBSTtBQUN6RDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esb0NBQW9DO0FBQ3BDO0FBQ0E7QUFDQSxXQUFXLFlBQVk7QUFDdkIsYUFBYSxxQkFBcUI7QUFDbEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSwwQ0FBMEM7QUFDMUM7QUFDQTtBQUNBLFdBQVcsb0JBQW9CLGlCQUFpQixHQUFHO0FBQ25EO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsWUFBWSxTQUFTO0FBQ3JCLFlBQVksNEJBQTRCO0FBQ3hDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGdCQUFnQixxREFBcUQ7QUFDckU7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw4Q0FBOEM7QUFDOUM7QUFDQTtBQUNBLFdBQVcsWUFBWTtBQUN2QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esb0RBQW9EO0FBQ3BEO0FBQ0E7QUFDQSxXQUFXLFlBQVk7QUFDdkI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSwwREFBMEQ7QUFDMUQ7QUFDQTtBQUNBLDBDQUEwQyxTQUFTO0FBQ25EO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGdDQUFnQyxLQUFLLFVBQVUsaUJBQWlCO0FBQ2hFO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EscUJBQXFCO0FBQ3JCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwic291cmNlcyI6WyIvVXNlcnMvbWFyY21pbnRlbC9Qcm9qZWN0cy9lLXRpYi5jb20vbm9kZV9tb2R1bGVzLy5wbnBtL0BvcGVudGVsZW1ldHJ5K2luc3RydW1lbnRhdGlvbi1odHRwQDAuMjE0LjBfQG9wZW50ZWxlbWV0cnkrYXBpQDEuOS4xL25vZGVfbW9kdWxlcy9Ab3BlbnRlbGVtZXRyeS9pbnN0cnVtZW50YXRpb24taHR0cC9idWlsZC9zcmMvdXRpbHMuanMiXSwic291cmNlc0NvbnRlbnQiOlsiXCJ1c2Ugc3RyaWN0XCI7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLmhlYWRlckNhcHR1cmUgPSBleHBvcnRzLmdldEluY29taW5nU3RhYmxlUmVxdWVzdE1ldHJpY0F0dHJpYnV0ZXNPblJlc3BvbnNlID0gZXhwb3J0cy5nZXRJbmNvbWluZ1JlcXVlc3RNZXRyaWNBdHRyaWJ1dGVzT25SZXNwb25zZSA9IGV4cG9ydHMuZ2V0SW5jb21pbmdSZXF1ZXN0QXR0cmlidXRlc09uUmVzcG9uc2UgPSBleHBvcnRzLmdldEluY29taW5nUmVxdWVzdE1ldHJpY0F0dHJpYnV0ZXMgPSBleHBvcnRzLmdldEluY29taW5nUmVxdWVzdEF0dHJpYnV0ZXMgPSBleHBvcnRzLmdldFJlbW90ZUNsaWVudEFkZHJlc3MgPSBleHBvcnRzLmdldE91dGdvaW5nU3RhYmxlUmVxdWVzdE1ldHJpY0F0dHJpYnV0ZXNPblJlc3BvbnNlID0gZXhwb3J0cy5nZXRPdXRnb2luZ1JlcXVlc3RNZXRyaWNBdHRyaWJ1dGVzT25SZXNwb25zZSA9IGV4cG9ydHMuZ2V0T3V0Z29pbmdSZXF1ZXN0QXR0cmlidXRlc09uUmVzcG9uc2UgPSBleHBvcnRzLnNldEF0dHJpYnV0ZXNGcm9tSHR0cEtpbmQgPSBleHBvcnRzLmdldE91dGdvaW5nUmVxdWVzdE1ldHJpY0F0dHJpYnV0ZXMgPSBleHBvcnRzLmdldE91dGdvaW5nUmVxdWVzdEF0dHJpYnV0ZXMgPSBleHBvcnRzLmV4dHJhY3RIb3N0bmFtZUFuZFBvcnQgPSBleHBvcnRzLmlzVmFsaWRPcHRpb25zVHlwZSA9IGV4cG9ydHMuZ2V0UmVxdWVzdEluZm8gPSBleHBvcnRzLmlzQ29tcHJlc3NlZCA9IGV4cG9ydHMuc2V0UmVzcG9uc2VDb250ZW50TGVuZ3RoQXR0cmlidXRlID0gZXhwb3J0cy5zZXRSZXF1ZXN0Q29udGVudExlbmd0aEF0dHJpYnV0ZSA9IGV4cG9ydHMuc2V0U3BhbldpdGhFcnJvciA9IGV4cG9ydHMuc2F0aXNmaWVzUGF0dGVybiA9IGV4cG9ydHMucGFyc2VSZXNwb25zZVN0YXR1cyA9IGV4cG9ydHMuZ2V0QWJzb2x1dGVVcmwgPSB2b2lkIDA7XG5jb25zdCBhcGlfMSA9IHJlcXVpcmUoXCJAb3BlbnRlbGVtZXRyeS9hcGlcIik7XG5jb25zdCBzZW1hbnRpY19jb252ZW50aW9uc18xID0gcmVxdWlyZShcIkBvcGVudGVsZW1ldHJ5L3NlbWFudGljLWNvbnZlbnRpb25zXCIpO1xuY29uc3Qgc2VtY29udl8xID0gcmVxdWlyZShcIi4vc2VtY29udlwiKTtcbmNvbnN0IGNvcmVfMSA9IHJlcXVpcmUoXCJAb3BlbnRlbGVtZXRyeS9jb3JlXCIpO1xuY29uc3QgaW5zdHJ1bWVudGF0aW9uXzEgPSByZXF1aXJlKFwiQG9wZW50ZWxlbWV0cnkvaW5zdHJ1bWVudGF0aW9uXCIpO1xuY29uc3QgdXJsID0gcmVxdWlyZShcInVybFwiKTtcbmNvbnN0IEF0dHJpYnV0ZU5hbWVzXzEgPSByZXF1aXJlKFwiLi9lbnVtcy9BdHRyaWJ1dGVOYW1lc1wiKTtcbmNvbnN0IGludGVybmFsX3R5cGVzXzEgPSByZXF1aXJlKFwiLi9pbnRlcm5hbC10eXBlc1wiKTtcbmNvbnN0IGludGVybmFsX3R5cGVzXzIgPSByZXF1aXJlKFwiLi9pbnRlcm5hbC10eXBlc1wiKTtcbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tcmVxdWlyZS1pbXBvcnRzXG5jb25zdCBmb3J3YXJkZWRQYXJzZSA9IHJlcXVpcmUoXCJmb3J3YXJkZWQtcGFyc2VcIik7XG4vKipcbiAqIEdldCBhbiBhYnNvbHV0ZSB1cmxcbiAqL1xuY29uc3QgZ2V0QWJzb2x1dGVVcmwgPSAocmVxdWVzdFVybCwgaGVhZGVycywgZmFsbGJhY2tQcm90b2NvbCA9ICdodHRwOicsIHJlZGFjdGVkUXVlcnlQYXJhbXMgPSBBcnJheS5mcm9tKGludGVybmFsX3R5cGVzXzIuREVGQVVMVF9RVUVSWV9TVFJJTkdTX1RPX1JFREFDVCkpID0+IHtcbiAgICBjb25zdCByZXFVcmxPYmplY3QgPSByZXF1ZXN0VXJsIHx8IHt9O1xuICAgIGNvbnN0IHByb3RvY29sID0gcmVxVXJsT2JqZWN0LnByb3RvY29sIHx8IGZhbGxiYWNrUHJvdG9jb2w7XG4gICAgY29uc3QgcG9ydCA9IChyZXFVcmxPYmplY3QucG9ydCB8fCAnJykudG9TdHJpbmcoKTtcbiAgICBsZXQgcGF0aCA9IHJlcVVybE9iamVjdC5wYXRoIHx8ICcvJztcbiAgICBsZXQgaG9zdCA9IHJlcVVybE9iamVjdC5ob3N0IHx8IHJlcVVybE9iamVjdC5ob3N0bmFtZSB8fCBoZWFkZXJzLmhvc3QgfHwgJ2xvY2FsaG9zdCc7XG4gICAgLy8gaWYgdGhlcmUgaXMgbm8gcG9ydCBpbiBob3N0IGFuZCB0aGVyZSBpcyBhIHBvcnRcbiAgICAvLyBpdCBzaG91bGQgYmUgZGlzcGxheWVkIGlmIGl0J3Mgbm90IDgwIGFuZCA0NDMgKGRlZmF1bHQgcG9ydHMpXG4gICAgaWYgKGhvc3QuaW5kZXhPZignOicpID09PSAtMSAmJlxuICAgICAgICBwb3J0ICYmXG4gICAgICAgIHBvcnQgIT09ICc4MCcgJiZcbiAgICAgICAgcG9ydCAhPT0gJzQ0MycpIHtcbiAgICAgICAgaG9zdCArPSBgOiR7cG9ydH1gO1xuICAgIH1cbiAgICAvLyBSZWRhY3Qgc2Vuc2l0aXZlIHF1ZXJ5IHBhcmFtZXRlcnNcbiAgICBpZiAocGF0aC5pbmNsdWRlcygnPycpKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBjb25zdCBwYXJzZWRVcmwgPSBuZXcgVVJMKHBhdGgsICdodHRwOi8vbG9jYWxob3N0Jyk7XG4gICAgICAgICAgICBjb25zdCBzZW5zaXRpdmVQYXJhbXNUb1JlZGFjdCA9IHJlZGFjdGVkUXVlcnlQYXJhbXMgfHwgW107XG4gICAgICAgICAgICBmb3IgKGNvbnN0IHNlbnNpdGl2ZVBhcmFtIG9mIHNlbnNpdGl2ZVBhcmFtc1RvUmVkYWN0KSB7XG4gICAgICAgICAgICAgICAgaWYgKHBhcnNlZFVybC5zZWFyY2hQYXJhbXMuZ2V0KHNlbnNpdGl2ZVBhcmFtKSkge1xuICAgICAgICAgICAgICAgICAgICBwYXJzZWRVcmwuc2VhcmNoUGFyYW1zLnNldChzZW5zaXRpdmVQYXJhbSwgaW50ZXJuYWxfdHlwZXNfMi5TVFJfUkVEQUNURUQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHBhdGggPSBgJHtwYXJzZWRVcmwucGF0aG5hbWV9JHtwYXJzZWRVcmwuc2VhcmNofWA7XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2gge1xuICAgICAgICAgICAgLy8gSWdub3JlIGVycm9yLCBhcyB0aGUgcGF0aCB3YXMgbm90IGEgdmFsaWQgVVJMLlxuICAgICAgICB9XG4gICAgfVxuICAgIGNvbnN0IGF1dGhQYXJ0ID0gcmVxVXJsT2JqZWN0LmF1dGggPyBgJHtpbnRlcm5hbF90eXBlc18yLlNUUl9SRURBQ1RFRH06JHtpbnRlcm5hbF90eXBlc18yLlNUUl9SRURBQ1RFRH1AYCA6ICcnO1xuICAgIHJldHVybiBgJHtwcm90b2NvbH0vLyR7YXV0aFBhcnR9JHtob3N0fSR7cGF0aH1gO1xufTtcbmV4cG9ydHMuZ2V0QWJzb2x1dGVVcmwgPSBnZXRBYnNvbHV0ZVVybDtcbi8qKlxuICogUGFyc2Ugc3RhdHVzIGNvZGUgZnJvbSBIVFRQIHJlc3BvbnNlLiBbTW9yZSBkZXRhaWxzXShodHRwczovL2dpdGh1Yi5jb20vb3Blbi10ZWxlbWV0cnkvb3BlbnRlbGVtZXRyeS1zcGVjaWZpY2F0aW9uL2Jsb2IvbWFzdGVyL3NwZWNpZmljYXRpb24vZGF0YS1odHRwLm1kI3N0YXR1cylcbiAqL1xuY29uc3QgcGFyc2VSZXNwb25zZVN0YXR1cyA9IChraW5kLCBzdGF0dXNDb2RlKSA9PiB7XG4gICAgY29uc3QgdXBwZXJCb3VuZCA9IGtpbmQgPT09IGFwaV8xLlNwYW5LaW5kLkNMSUVOVCA/IDQwMCA6IDUwMDtcbiAgICAvLyAxeHgsIDJ4eCwgM3h4IGFyZSBPSyBvbiBjbGllbnQgYW5kIHNlcnZlclxuICAgIC8vIDR4eCBpcyBPSyBvbiBzZXJ2ZXJcbiAgICBpZiAoc3RhdHVzQ29kZSAmJiBzdGF0dXNDb2RlID49IDEwMCAmJiBzdGF0dXNDb2RlIDwgdXBwZXJCb3VuZCkge1xuICAgICAgICByZXR1cm4gYXBpXzEuU3BhblN0YXR1c0NvZGUuVU5TRVQ7XG4gICAgfVxuICAgIC8vIEFsbCBvdGhlciBjb2RlcyBhcmUgZXJyb3JcbiAgICByZXR1cm4gYXBpXzEuU3BhblN0YXR1c0NvZGUuRVJST1I7XG59O1xuZXhwb3J0cy5wYXJzZVJlc3BvbnNlU3RhdHVzID0gcGFyc2VSZXNwb25zZVN0YXR1cztcbi8qKlxuICogQ2hlY2sgd2hldGhlciB0aGUgZ2l2ZW4gb2JqIG1hdGNoIHBhdHRlcm5cbiAqIEBwYXJhbSBjb25zdGFudCBlLmcgVVJMIG9mIHJlcXVlc3RcbiAqIEBwYXJhbSBwYXR0ZXJuIE1hdGNoIHBhdHRlcm5cbiAqL1xuY29uc3Qgc2F0aXNmaWVzUGF0dGVybiA9IChjb25zdGFudCwgcGF0dGVybikgPT4ge1xuICAgIGlmICh0eXBlb2YgcGF0dGVybiA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgcmV0dXJuIHBhdHRlcm4gPT09IGNvbnN0YW50O1xuICAgIH1cbiAgICBlbHNlIGlmIChwYXR0ZXJuIGluc3RhbmNlb2YgUmVnRXhwKSB7XG4gICAgICAgIHJldHVybiBwYXR0ZXJuLnRlc3QoY29uc3RhbnQpO1xuICAgIH1cbiAgICBlbHNlIGlmICh0eXBlb2YgcGF0dGVybiA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICByZXR1cm4gcGF0dGVybihjb25zdGFudCk7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdQYXR0ZXJuIGlzIGluIHVuc3VwcG9ydGVkIGRhdGF0eXBlJyk7XG4gICAgfVxufTtcbmV4cG9ydHMuc2F0aXNmaWVzUGF0dGVybiA9IHNhdGlzZmllc1BhdHRlcm47XG4vKipcbiAqIFNldHMgdGhlIHNwYW4gd2l0aCB0aGUgZXJyb3IgcGFzc2VkIGluIHBhcmFtc1xuICogQHBhcmFtIHtTcGFufSBzcGFuIHRoZSBzcGFuIHRoYXQgbmVlZCB0byBiZSBzZXRcbiAqIEBwYXJhbSB7RXJyb3J9IGVycm9yIGVycm9yIHRoYXQgd2lsbCBiZSBzZXQgdG8gc3BhblxuICogQHBhcmFtIHtTZW1jb252U3RhYmlsaXR5fSBzZW1jb252U3RhYmlsaXR5IGRldGVybWluZXMgd2hpY2ggc2VtY29udiB2ZXJzaW9uIHRvIHVzZVxuICovXG5jb25zdCBzZXRTcGFuV2l0aEVycm9yID0gKHNwYW4sIGVycm9yLCBzZW1jb252U3RhYmlsaXR5KSA9PiB7XG4gICAgY29uc3QgbWVzc2FnZSA9IGVycm9yLm1lc3NhZ2U7XG4gICAgaWYgKHNlbWNvbnZTdGFiaWxpdHkgJiBpbnN0cnVtZW50YXRpb25fMS5TZW1jb252U3RhYmlsaXR5Lk9MRCkge1xuICAgICAgICBzcGFuLnNldEF0dHJpYnV0ZShBdHRyaWJ1dGVOYW1lc18xLkF0dHJpYnV0ZU5hbWVzLkhUVFBfRVJST1JfTkFNRSwgZXJyb3IubmFtZSk7XG4gICAgICAgIHNwYW4uc2V0QXR0cmlidXRlKEF0dHJpYnV0ZU5hbWVzXzEuQXR0cmlidXRlTmFtZXMuSFRUUF9FUlJPUl9NRVNTQUdFLCBtZXNzYWdlKTtcbiAgICB9XG4gICAgaWYgKHNlbWNvbnZTdGFiaWxpdHkgJiBpbnN0cnVtZW50YXRpb25fMS5TZW1jb252U3RhYmlsaXR5LlNUQUJMRSkge1xuICAgICAgICBzcGFuLnNldEF0dHJpYnV0ZShzZW1hbnRpY19jb252ZW50aW9uc18xLkFUVFJfRVJST1JfVFlQRSwgZXJyb3IubmFtZSk7XG4gICAgfVxuICAgIHNwYW4uc2V0U3RhdHVzKHsgY29kZTogYXBpXzEuU3BhblN0YXR1c0NvZGUuRVJST1IsIG1lc3NhZ2UgfSk7XG4gICAgc3Bhbi5yZWNvcmRFeGNlcHRpb24oZXJyb3IpO1xufTtcbmV4cG9ydHMuc2V0U3BhbldpdGhFcnJvciA9IHNldFNwYW5XaXRoRXJyb3I7XG4vKipcbiAqIEFkZHMgYXR0cmlidXRlcyBmb3IgcmVxdWVzdCBjb250ZW50LWxlbmd0aCBhbmQgY29udGVudC1lbmNvZGluZyBIVFRQIGhlYWRlcnNcbiAqIEBwYXJhbSB7IEluY29taW5nTWVzc2FnZSB9IFJlcXVlc3Qgb2JqZWN0IHdob3NlIGhlYWRlcnMgd2lsbCBiZSBhbmFseXplZFxuICogQHBhcmFtIHsgQXR0cmlidXRlcyB9IEF0dHJpYnV0ZXMgb2JqZWN0IHRvIGJlIG1vZGlmaWVkXG4gKi9cbmNvbnN0IHNldFJlcXVlc3RDb250ZW50TGVuZ3RoQXR0cmlidXRlID0gKHJlcXVlc3QsIGF0dHJpYnV0ZXMpID0+IHtcbiAgICBjb25zdCBsZW5ndGggPSBnZXRDb250ZW50TGVuZ3RoKHJlcXVlc3QuaGVhZGVycyk7XG4gICAgaWYgKGxlbmd0aCA9PT0gbnVsbClcbiAgICAgICAgcmV0dXJuO1xuICAgIGlmICgoMCwgZXhwb3J0cy5pc0NvbXByZXNzZWQpKHJlcXVlc3QuaGVhZGVycykpIHtcbiAgICAgICAgYXR0cmlidXRlc1tzZW1jb252XzEuQVRUUl9IVFRQX1JFUVVFU1RfQ09OVEVOVF9MRU5HVEhdID0gbGVuZ3RoO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgYXR0cmlidXRlc1tzZW1jb252XzEuQVRUUl9IVFRQX1JFUVVFU1RfQ09OVEVOVF9MRU5HVEhfVU5DT01QUkVTU0VEXSA9IGxlbmd0aDtcbiAgICB9XG59O1xuZXhwb3J0cy5zZXRSZXF1ZXN0Q29udGVudExlbmd0aEF0dHJpYnV0ZSA9IHNldFJlcXVlc3RDb250ZW50TGVuZ3RoQXR0cmlidXRlO1xuLyoqXG4gKiBBZGRzIGF0dHJpYnV0ZXMgZm9yIHJlc3BvbnNlIGNvbnRlbnQtbGVuZ3RoIGFuZCBjb250ZW50LWVuY29kaW5nIEhUVFAgaGVhZGVyc1xuICogQHBhcmFtIHsgSW5jb21pbmdNZXNzYWdlIH0gUmVzcG9uc2Ugb2JqZWN0IHdob3NlIGhlYWRlcnMgd2lsbCBiZSBhbmFseXplZFxuICogQHBhcmFtIHsgQXR0cmlidXRlcyB9IEF0dHJpYnV0ZXMgb2JqZWN0IHRvIGJlIG1vZGlmaWVkXG4gKlxuICogQGRlcHJlY2F0ZWQgdGhpcyBpcyBmb3IgYW4gb2xkZXIgdmVyc2lvbiBvZiBzZW1jb252LiBJdCBpcyByZXRhaW5lZCBmb3IgY29tcGF0aWJpbGl0eSB1c2luZyBPVEVMX1NFTUNPTlZfU1RBQklMSVRZX09QVF9JTlxuICovXG5jb25zdCBzZXRSZXNwb25zZUNvbnRlbnRMZW5ndGhBdHRyaWJ1dGUgPSAocmVzcG9uc2UsIGF0dHJpYnV0ZXMpID0+IHtcbiAgICBjb25zdCBsZW5ndGggPSBnZXRDb250ZW50TGVuZ3RoKHJlc3BvbnNlLmhlYWRlcnMpO1xuICAgIGlmIChsZW5ndGggPT09IG51bGwpXG4gICAgICAgIHJldHVybjtcbiAgICBpZiAoKDAsIGV4cG9ydHMuaXNDb21wcmVzc2VkKShyZXNwb25zZS5oZWFkZXJzKSkge1xuICAgICAgICBhdHRyaWJ1dGVzW3NlbWNvbnZfMS5BVFRSX0hUVFBfUkVTUE9OU0VfQ09OVEVOVF9MRU5HVEhdID0gbGVuZ3RoO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgYXR0cmlidXRlc1tzZW1jb252XzEuQVRUUl9IVFRQX1JFU1BPTlNFX0NPTlRFTlRfTEVOR1RIX1VOQ09NUFJFU1NFRF0gPSBsZW5ndGg7XG4gICAgfVxufTtcbmV4cG9ydHMuc2V0UmVzcG9uc2VDb250ZW50TGVuZ3RoQXR0cmlidXRlID0gc2V0UmVzcG9uc2VDb250ZW50TGVuZ3RoQXR0cmlidXRlO1xuZnVuY3Rpb24gZ2V0Q29udGVudExlbmd0aChoZWFkZXJzKSB7XG4gICAgY29uc3QgY29udGVudExlbmd0aEhlYWRlciA9IGhlYWRlcnNbJ2NvbnRlbnQtbGVuZ3RoJ107XG4gICAgaWYgKGNvbnRlbnRMZW5ndGhIZWFkZXIgPT09IHVuZGVmaW5lZClcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgY29uc3QgY29udGVudExlbmd0aCA9IHBhcnNlSW50KGNvbnRlbnRMZW5ndGhIZWFkZXIsIDEwKTtcbiAgICBpZiAoaXNOYU4oY29udGVudExlbmd0aCkpXG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIHJldHVybiBjb250ZW50TGVuZ3RoO1xufVxuY29uc3QgaXNDb21wcmVzc2VkID0gKGhlYWRlcnMpID0+IHtcbiAgICBjb25zdCBlbmNvZGluZyA9IGhlYWRlcnNbJ2NvbnRlbnQtZW5jb2RpbmcnXTtcbiAgICByZXR1cm4gISFlbmNvZGluZyAmJiBlbmNvZGluZyAhPT0gJ2lkZW50aXR5Jztcbn07XG5leHBvcnRzLmlzQ29tcHJlc3NlZCA9IGlzQ29tcHJlc3NlZDtcbi8qKlxuICogTWltaWNzIE5vZGUuanMgY29udmVyc2lvbiBvZiBVUkwgc3RyaW5ncyB0byBSZXF1ZXN0T3B0aW9ucyBleHBlY3RlZCBieVxuICogYGh0dHAucmVxdWVzdGAgYW5kIGBodHRwcy5yZXF1ZXN0YCBBUElzLlxuICpcbiAqIFNlZSBodHRwczovL2dpdGh1Yi5jb20vbm9kZWpzL25vZGUvYmxvYi8yNTA1ZTIxN2JiYTA1ZmM1ODFiNTcyYzY4NWM1Y2YyODBhMTZjNWEzL2xpYi9pbnRlcm5hbC91cmwuanMjTDE0MTUtTDE0MzdcbiAqXG4gKiBAcGFyYW0gc3RyaW5nVXJsXG4gKiBAdGhyb3dzIFR5cGVFcnJvciBpZiB0aGUgVVJMIGlzIG5vdCB2YWxpZC5cbiAqL1xuZnVuY3Rpb24gc3RyaW5nVXJsVG9IdHRwT3B0aW9ucyhzdHJpbmdVcmwpIHtcbiAgICAvLyBUaGlzIGlzIGhlYXZpbHkgaW5zcGlyZWQgYnkgTm9kZS5qcyBoYW5kbGluZyBvZiB0aGUgc2FtZSBzaXR1YXRpb24sIHRyeWluZ1xuICAgIC8vIHRvIGZvbGxvdyBpdCBhcyBjbG9zZWx5IGFzIHBvc3NpYmxlIHdoaWxlIGtlZXBpbmcgaW4gbWluZCB0aGF0IHdlIG9ubHlcbiAgICAvLyBkZWFsIHdpdGggc3RyaW5nIFVSTHMsIG5vdCBVUkwgb2JqZWN0cy5cbiAgICBjb25zdCB7IGhvc3RuYW1lLCBwYXRobmFtZSwgcG9ydCwgdXNlcm5hbWUsIHBhc3N3b3JkLCBzZWFyY2gsIHByb3RvY29sLCBoYXNoLCBocmVmLCBvcmlnaW4sIGhvc3QsIH0gPSBuZXcgVVJMKHN0cmluZ1VybCk7XG4gICAgY29uc3Qgb3B0aW9ucyA9IHtcbiAgICAgICAgcHJvdG9jb2w6IHByb3RvY29sLFxuICAgICAgICBob3N0bmFtZTogaG9zdG5hbWUgJiYgaG9zdG5hbWVbMF0gPT09ICdbJyA/IGhvc3RuYW1lLnNsaWNlKDEsIC0xKSA6IGhvc3RuYW1lLFxuICAgICAgICBoYXNoOiBoYXNoLFxuICAgICAgICBzZWFyY2g6IHNlYXJjaCxcbiAgICAgICAgcGF0aG5hbWU6IHBhdGhuYW1lLFxuICAgICAgICBwYXRoOiBgJHtwYXRobmFtZSB8fCAnJ30ke3NlYXJjaCB8fCAnJ31gLFxuICAgICAgICBocmVmOiBocmVmLFxuICAgICAgICBvcmlnaW46IG9yaWdpbixcbiAgICAgICAgaG9zdDogaG9zdCxcbiAgICB9O1xuICAgIGlmIChwb3J0ICE9PSAnJykge1xuICAgICAgICBvcHRpb25zLnBvcnQgPSBOdW1iZXIocG9ydCk7XG4gICAgfVxuICAgIGlmICh1c2VybmFtZSB8fCBwYXNzd29yZCkge1xuICAgICAgICBvcHRpb25zLmF1dGggPSBgJHtkZWNvZGVVUklDb21wb25lbnQodXNlcm5hbWUpfToke2RlY29kZVVSSUNvbXBvbmVudChwYXNzd29yZCl9YDtcbiAgICB9XG4gICAgcmV0dXJuIG9wdGlvbnM7XG59XG4vKipcbiAqIE1ha2VzIHN1cmUgb3B0aW9ucyBpcyBhbiB1cmwgb2JqZWN0XG4gKiByZXR1cm4gYW4gb2JqZWN0IHdpdGggZGVmYXVsdCB2YWx1ZSBhbmQgcGFyc2VkIG9wdGlvbnNcbiAqIEBwYXJhbSBsb2dnZXIgY29tcG9uZW50IGxvZ2dlclxuICogQHBhcmFtIG9wdGlvbnMgb3JpZ2luYWwgb3B0aW9ucyBmb3IgdGhlIHJlcXVlc3RcbiAqIEBwYXJhbSBbZXh0cmFPcHRpb25zXSBhZGRpdGlvbmFsIG9wdGlvbnMgZm9yIHRoZSByZXF1ZXN0XG4gKi9cbmNvbnN0IGdldFJlcXVlc3RJbmZvID0gKGxvZ2dlciwgb3B0aW9ucywgZXh0cmFPcHRpb25zKSA9PiB7XG4gICAgbGV0IHBhdGhuYW1lO1xuICAgIGxldCBvcmlnaW47XG4gICAgbGV0IG9wdGlvbnNQYXJzZWQ7XG4gICAgbGV0IGludmFsaWRVcmwgPSBmYWxzZTtcbiAgICBpZiAodHlwZW9mIG9wdGlvbnMgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBjb25zdCBjb252ZXJ0ZWRPcHRpb25zID0gc3RyaW5nVXJsVG9IdHRwT3B0aW9ucyhvcHRpb25zKTtcbiAgICAgICAgICAgIG9wdGlvbnNQYXJzZWQgPSBjb252ZXJ0ZWRPcHRpb25zO1xuICAgICAgICAgICAgcGF0aG5hbWUgPSBjb252ZXJ0ZWRPcHRpb25zLnBhdGhuYW1lIHx8ICcvJztcbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZSkge1xuICAgICAgICAgICAgaW52YWxpZFVybCA9IHRydWU7XG4gICAgICAgICAgICBsb2dnZXIudmVyYm9zZSgnVW5hYmxlIHRvIHBhcnNlIFVSTCBwcm92aWRlZCB0byBIVFRQIHJlcXVlc3QsIHVzaW5nIGZhbGxiYWNrIHRvIGRldGVybWluZSBwYXRoLiBPcmlnaW5hbCBlcnJvcjonLCBlKTtcbiAgICAgICAgICAgIC8vIGZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5IHdpdGggaG93IHVybC5wYXJzZSgpIGJlaGF2ZWQuXG4gICAgICAgICAgICBvcHRpb25zUGFyc2VkID0ge1xuICAgICAgICAgICAgICAgIHBhdGg6IG9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgcGF0aG5hbWUgPSBvcHRpb25zUGFyc2VkLnBhdGggfHwgJy8nO1xuICAgICAgICB9XG4gICAgICAgIG9yaWdpbiA9IGAke29wdGlvbnNQYXJzZWQucHJvdG9jb2wgfHwgJ2h0dHA6J30vLyR7b3B0aW9uc1BhcnNlZC5ob3N0fWA7XG4gICAgICAgIGlmIChleHRyYU9wdGlvbnMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgT2JqZWN0LmFzc2lnbihvcHRpb25zUGFyc2VkLCBleHRyYU9wdGlvbnMpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGVsc2UgaWYgKG9wdGlvbnMgaW5zdGFuY2VvZiB1cmwuVVJMKSB7XG4gICAgICAgIG9wdGlvbnNQYXJzZWQgPSB7XG4gICAgICAgICAgICBwcm90b2NvbDogb3B0aW9ucy5wcm90b2NvbCxcbiAgICAgICAgICAgIGhvc3RuYW1lOiB0eXBlb2Ygb3B0aW9ucy5ob3N0bmFtZSA9PT0gJ3N0cmluZycgJiYgb3B0aW9ucy5ob3N0bmFtZS5zdGFydHNXaXRoKCdbJylcbiAgICAgICAgICAgICAgICA/IG9wdGlvbnMuaG9zdG5hbWUuc2xpY2UoMSwgLTEpXG4gICAgICAgICAgICAgICAgOiBvcHRpb25zLmhvc3RuYW1lLFxuICAgICAgICAgICAgcGF0aDogYCR7b3B0aW9ucy5wYXRobmFtZSB8fCAnJ30ke29wdGlvbnMuc2VhcmNoIHx8ICcnfWAsXG4gICAgICAgIH07XG4gICAgICAgIGlmIChvcHRpb25zLnBvcnQgIT09ICcnKSB7XG4gICAgICAgICAgICBvcHRpb25zUGFyc2VkLnBvcnQgPSBOdW1iZXIob3B0aW9ucy5wb3J0KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAob3B0aW9ucy51c2VybmFtZSB8fCBvcHRpb25zLnBhc3N3b3JkKSB7XG4gICAgICAgICAgICBvcHRpb25zUGFyc2VkLmF1dGggPSBgJHtvcHRpb25zLnVzZXJuYW1lfToke29wdGlvbnMucGFzc3dvcmR9YDtcbiAgICAgICAgfVxuICAgICAgICBwYXRobmFtZSA9IG9wdGlvbnMucGF0aG5hbWU7XG4gICAgICAgIG9yaWdpbiA9IG9wdGlvbnMub3JpZ2luO1xuICAgICAgICBpZiAoZXh0cmFPcHRpb25zICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIE9iamVjdC5hc3NpZ24ob3B0aW9uc1BhcnNlZCwgZXh0cmFPcHRpb25zKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgb3B0aW9uc1BhcnNlZCA9IE9iamVjdC5hc3NpZ24oeyBwcm90b2NvbDogb3B0aW9ucy5ob3N0ID8gJ2h0dHA6JyA6IHVuZGVmaW5lZCB9LCBvcHRpb25zKTtcbiAgICAgICAgY29uc3QgaG9zdG5hbWUgPSBvcHRpb25zUGFyc2VkLmhvc3QgfHxcbiAgICAgICAgICAgIChvcHRpb25zUGFyc2VkLnBvcnQgIT0gbnVsbFxuICAgICAgICAgICAgICAgID8gYCR7b3B0aW9uc1BhcnNlZC5ob3N0bmFtZX0ke29wdGlvbnNQYXJzZWQucG9ydH1gXG4gICAgICAgICAgICAgICAgOiBvcHRpb25zUGFyc2VkLmhvc3RuYW1lKTtcbiAgICAgICAgb3JpZ2luID0gYCR7b3B0aW9uc1BhcnNlZC5wcm90b2NvbCB8fCAnaHR0cDonfS8vJHtob3N0bmFtZX1gO1xuICAgICAgICBwYXRobmFtZSA9IG9wdGlvbnMucGF0aG5hbWU7XG4gICAgICAgIGlmICghcGF0aG5hbWUgJiYgb3B0aW9uc1BhcnNlZC5wYXRoKSB7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGNvbnN0IHBhcnNlZFVybCA9IG5ldyBVUkwob3B0aW9uc1BhcnNlZC5wYXRoLCBvcmlnaW4pO1xuICAgICAgICAgICAgICAgIHBhdGhuYW1lID0gcGFyc2VkVXJsLnBhdGhuYW1lIHx8ICcvJztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhdGNoIHtcbiAgICAgICAgICAgICAgICBwYXRobmFtZSA9ICcvJztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICAvLyBzb21lIHBhY2thZ2VzIHJldHVybiBtZXRob2QgaW4gbG93ZXJjYXNlLi5cbiAgICAvLyBlbnN1cmUgdXBwZXJDYXNlIGZvciBjb25zaXN0ZW5jeVxuICAgIGNvbnN0IG1ldGhvZCA9IG9wdGlvbnNQYXJzZWQubWV0aG9kXG4gICAgICAgID8gb3B0aW9uc1BhcnNlZC5tZXRob2QudG9VcHBlckNhc2UoKVxuICAgICAgICA6ICdHRVQnO1xuICAgIHJldHVybiB7IG9yaWdpbiwgcGF0aG5hbWUsIG1ldGhvZCwgb3B0aW9uc1BhcnNlZCwgaW52YWxpZFVybCB9O1xufTtcbmV4cG9ydHMuZ2V0UmVxdWVzdEluZm8gPSBnZXRSZXF1ZXN0SW5mbztcbi8qKlxuICogTWFrZXMgc3VyZSBvcHRpb25zIGlzIG9mIHR5cGUgc3RyaW5nIG9yIG9iamVjdFxuICogQHBhcmFtIG9wdGlvbnMgZm9yIHRoZSByZXF1ZXN0XG4gKi9cbmNvbnN0IGlzVmFsaWRPcHRpb25zVHlwZSA9IChvcHRpb25zKSA9PiB7XG4gICAgaWYgKCFvcHRpb25zKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgY29uc3QgdHlwZSA9IHR5cGVvZiBvcHRpb25zO1xuICAgIHJldHVybiB0eXBlID09PSAnc3RyaW5nJyB8fCAodHlwZSA9PT0gJ29iamVjdCcgJiYgIUFycmF5LmlzQXJyYXkob3B0aW9ucykpO1xufTtcbmV4cG9ydHMuaXNWYWxpZE9wdGlvbnNUeXBlID0gaXNWYWxpZE9wdGlvbnNUeXBlO1xuY29uc3QgZXh0cmFjdEhvc3RuYW1lQW5kUG9ydCA9IChyZXF1ZXN0T3B0aW9ucykgPT4ge1xuICAgIGlmIChyZXF1ZXN0T3B0aW9ucy5ob3N0bmFtZSAmJiByZXF1ZXN0T3B0aW9ucy5wb3J0KSB7XG4gICAgICAgIHJldHVybiB7IGhvc3RuYW1lOiByZXF1ZXN0T3B0aW9ucy5ob3N0bmFtZSwgcG9ydDogcmVxdWVzdE9wdGlvbnMucG9ydCB9O1xuICAgIH1cbiAgICBjb25zdCBtYXRjaGVzID0gcmVxdWVzdE9wdGlvbnMuaG9zdD8ubWF0Y2goL14oW146LyBdKykoOlxcZHsxLDV9KT8vKSB8fCBudWxsO1xuICAgIGNvbnN0IGhvc3RuYW1lID0gcmVxdWVzdE9wdGlvbnMuaG9zdG5hbWUgfHwgKG1hdGNoZXMgPT09IG51bGwgPyAnbG9jYWxob3N0JyA6IG1hdGNoZXNbMV0pO1xuICAgIGxldCBwb3J0ID0gcmVxdWVzdE9wdGlvbnMucG9ydDtcbiAgICBpZiAoIXBvcnQpIHtcbiAgICAgICAgaWYgKG1hdGNoZXMgJiYgbWF0Y2hlc1syXSkge1xuICAgICAgICAgICAgLy8gcmVtb3ZlIHRoZSBsZWFkaW5nIFwiOlwiLiBUaGUgZXh0cmFjdGVkIHBvcnQgd291bGQgYmUgc29tZXRoaW5nIGxpa2UgXCI6ODA4MFwiXG4gICAgICAgICAgICBwb3J0ID0gbWF0Y2hlc1syXS5zdWJzdHJpbmcoMSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBwb3J0ID0gcmVxdWVzdE9wdGlvbnMucHJvdG9jb2wgPT09ICdodHRwczonID8gJzQ0MycgOiAnODAnO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiB7IGhvc3RuYW1lLCBwb3J0IH07XG59O1xuZXhwb3J0cy5leHRyYWN0SG9zdG5hbWVBbmRQb3J0ID0gZXh0cmFjdEhvc3RuYW1lQW5kUG9ydDtcbi8qKlxuICogUmV0dXJucyBvdXRnb2luZyByZXF1ZXN0IGF0dHJpYnV0ZXMgc2NvcGVkIHRvIHRoZSBvcHRpb25zIHBhc3NlZCB0byB0aGUgcmVxdWVzdFxuICogQHBhcmFtIHtQYXJzZWRSZXF1ZXN0T3B0aW9uc30gcmVxdWVzdE9wdGlvbnMgdGhlIHNhbWUgb3B0aW9ucyB1c2VkIHRvIG1ha2UgdGhlIHJlcXVlc3RcbiAqIEBwYXJhbSB7eyBjb21wb25lbnQ6IHN0cmluZywgaG9zdG5hbWU6IHN0cmluZywgaG9va0F0dHJpYnV0ZXM/OiBBdHRyaWJ1dGVzIH19IG9wdGlvbnMgdXNlZCB0byBwYXNzIGRhdGEgbmVlZGVkIHRvIGNyZWF0ZSBhdHRyaWJ1dGVzXG4gKiBAcGFyYW0ge1NlbWNvbnZTdGFiaWxpdHl9IHNlbWNvbnZTdGFiaWxpdHkgZGV0ZXJtaW5lcyB3aGljaCBzZW1jb252IHZlcnNpb24gdG8gdXNlXG4gKi9cbmNvbnN0IGdldE91dGdvaW5nUmVxdWVzdEF0dHJpYnV0ZXMgPSAocmVxdWVzdE9wdGlvbnMsIG9wdGlvbnMsIHNlbWNvbnZTdGFiaWxpdHksIGVuYWJsZVN5bnRoZXRpY1NvdXJjZURldGVjdGlvbikgPT4ge1xuICAgIGNvbnN0IGhvc3RuYW1lID0gb3B0aW9ucy5ob3N0bmFtZTtcbiAgICBjb25zdCBwb3J0ID0gb3B0aW9ucy5wb3J0O1xuICAgIGNvbnN0IG1ldGhvZCA9IHJlcXVlc3RPcHRpb25zLm1ldGhvZCA/PyAnR0VUJztcbiAgICBjb25zdCBub3JtYWxpemVkTWV0aG9kID0gbm9ybWFsaXplTWV0aG9kKG1ldGhvZCk7XG4gICAgY29uc3QgaGVhZGVycyA9IChyZXF1ZXN0T3B0aW9ucy5oZWFkZXJzIHx8IHt9KTtcbiAgICBjb25zdCB1c2VyQWdlbnQgPSBoZWFkZXJzWyd1c2VyLWFnZW50J107XG4gICAgY29uc3QgdXJsRnVsbCA9ICgwLCBleHBvcnRzLmdldEFic29sdXRlVXJsKShyZXF1ZXN0T3B0aW9ucywgaGVhZGVycywgYCR7b3B0aW9ucy5jb21wb25lbnR9OmAsIG9wdGlvbnMucmVkYWN0ZWRRdWVyeVBhcmFtcyk7XG4gICAgY29uc3Qgb2xkQXR0cmlidXRlcyA9IHtcbiAgICAgICAgW3NlbWNvbnZfMS5BVFRSX0hUVFBfVVJMXTogdXJsRnVsbCxcbiAgICAgICAgW3NlbWNvbnZfMS5BVFRSX0hUVFBfTUVUSE9EXTogbWV0aG9kLFxuICAgICAgICBbc2VtY29udl8xLkFUVFJfSFRUUF9UQVJHRVRdOiByZXF1ZXN0T3B0aW9ucy5wYXRoIHx8ICcvJyxcbiAgICAgICAgW3NlbWNvbnZfMS5BVFRSX05FVF9QRUVSX05BTUVdOiBob3N0bmFtZSxcbiAgICAgICAgW3NlbWNvbnZfMS5BVFRSX0hUVFBfSE9TVF06IGhlYWRlcnMuaG9zdCA/PyBgJHtob3N0bmFtZX06JHtwb3J0fWAsXG4gICAgfTtcbiAgICBjb25zdCBuZXdBdHRyaWJ1dGVzID0ge1xuICAgICAgICAvLyBSZXF1aXJlZCBhdHRyaWJ1dGVzXG4gICAgICAgIFtzZW1hbnRpY19jb252ZW50aW9uc18xLkFUVFJfSFRUUF9SRVFVRVNUX01FVEhPRF06IG5vcm1hbGl6ZWRNZXRob2QsXG4gICAgICAgIFtzZW1hbnRpY19jb252ZW50aW9uc18xLkFUVFJfU0VSVkVSX0FERFJFU1NdOiBob3N0bmFtZSxcbiAgICAgICAgW3NlbWFudGljX2NvbnZlbnRpb25zXzEuQVRUUl9TRVJWRVJfUE9SVF06IE51bWJlcihwb3J0KSxcbiAgICAgICAgW3NlbWFudGljX2NvbnZlbnRpb25zXzEuQVRUUl9VUkxfRlVMTF06IHVybEZ1bGwsXG4gICAgICAgIFtzZW1hbnRpY19jb252ZW50aW9uc18xLkFUVFJfVVNFUl9BR0VOVF9PUklHSU5BTF06IHVzZXJBZ2VudCxcbiAgICAgICAgLy8gbGVhdmluZyBvdXQgcHJvdG9jb2wgdmVyc2lvbiwgaXQgaXMgbm90IHlldCBuZWdvdGlhdGVkXG4gICAgICAgIC8vIGxlYXZpbmcgb3V0IHByb3RvY29sIG5hbWUsIGl0IGlzIG9ubHkgcmVxdWlyZWQgd2hlbiBwcm90b2NvbCB2ZXJzaW9uIGlzIHNldFxuICAgICAgICAvLyByZXRyaWVzIGFuZCByZWRpcmVjdHMgbm90IHN1cHBvcnRlZFxuICAgICAgICAvLyBPcHQtaW4gYXR0cmlidXRlcyBsZWZ0IG9mZiBmb3Igbm93XG4gICAgfTtcbiAgICAvLyBjb25kaXRpb25hbGx5IHJlcXVpcmVkIGlmIHJlcXVlc3QgbWV0aG9kIHJlcXVpcmVkIGNhc2Ugbm9ybWFsaXphdGlvblxuICAgIGlmIChtZXRob2QgIT09IG5vcm1hbGl6ZWRNZXRob2QpIHtcbiAgICAgICAgbmV3QXR0cmlidXRlc1tzZW1hbnRpY19jb252ZW50aW9uc18xLkFUVFJfSFRUUF9SRVFVRVNUX01FVEhPRF9PUklHSU5BTF0gPSBtZXRob2Q7XG4gICAgfVxuICAgIGlmIChlbmFibGVTeW50aGV0aWNTb3VyY2VEZXRlY3Rpb24gJiYgdXNlckFnZW50KSB7XG4gICAgICAgIG5ld0F0dHJpYnV0ZXNbc2VtY29udl8xLkFUVFJfVVNFUl9BR0VOVF9TWU5USEVUSUNfVFlQRV0gPSBnZXRTeW50aGV0aWNUeXBlKHVzZXJBZ2VudCk7XG4gICAgfVxuICAgIGlmICh1c2VyQWdlbnQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBvbGRBdHRyaWJ1dGVzW3NlbWNvbnZfMS5BVFRSX0hUVFBfVVNFUl9BR0VOVF0gPSB1c2VyQWdlbnQ7XG4gICAgfVxuICAgIHN3aXRjaCAoc2VtY29udlN0YWJpbGl0eSkge1xuICAgICAgICBjYXNlIGluc3RydW1lbnRhdGlvbl8xLlNlbWNvbnZTdGFiaWxpdHkuU1RBQkxFOlxuICAgICAgICAgICAgcmV0dXJuIE9iamVjdC5hc3NpZ24obmV3QXR0cmlidXRlcywgb3B0aW9ucy5ob29rQXR0cmlidXRlcyk7XG4gICAgICAgIGNhc2UgaW5zdHJ1bWVudGF0aW9uXzEuU2VtY29udlN0YWJpbGl0eS5PTEQ6XG4gICAgICAgICAgICByZXR1cm4gT2JqZWN0LmFzc2lnbihvbGRBdHRyaWJ1dGVzLCBvcHRpb25zLmhvb2tBdHRyaWJ1dGVzKTtcbiAgICB9XG4gICAgcmV0dXJuIE9iamVjdC5hc3NpZ24ob2xkQXR0cmlidXRlcywgbmV3QXR0cmlidXRlcywgb3B0aW9ucy5ob29rQXR0cmlidXRlcyk7XG59O1xuZXhwb3J0cy5nZXRPdXRnb2luZ1JlcXVlc3RBdHRyaWJ1dGVzID0gZ2V0T3V0Z29pbmdSZXF1ZXN0QXR0cmlidXRlcztcbi8qKlxuICogUmV0dXJucyBvdXRnb2luZyByZXF1ZXN0IE1ldHJpYyBhdHRyaWJ1dGVzIHNjb3BlZCB0byB0aGUgcmVxdWVzdCBkYXRhXG4gKiBAcGFyYW0ge0F0dHJpYnV0ZXN9IHNwYW5BdHRyaWJ1dGVzIHRoZSBzcGFuIGF0dHJpYnV0ZXNcbiAqL1xuY29uc3QgZ2V0T3V0Z29pbmdSZXF1ZXN0TWV0cmljQXR0cmlidXRlcyA9IChzcGFuQXR0cmlidXRlcykgPT4ge1xuICAgIGNvbnN0IG1ldHJpY0F0dHJpYnV0ZXMgPSB7fTtcbiAgICBtZXRyaWNBdHRyaWJ1dGVzW3NlbWNvbnZfMS5BVFRSX0hUVFBfTUVUSE9EXSA9IHNwYW5BdHRyaWJ1dGVzW3NlbWNvbnZfMS5BVFRSX0hUVFBfTUVUSE9EXTtcbiAgICBtZXRyaWNBdHRyaWJ1dGVzW3NlbWNvbnZfMS5BVFRSX05FVF9QRUVSX05BTUVdID0gc3BhbkF0dHJpYnV0ZXNbc2VtY29udl8xLkFUVFJfTkVUX1BFRVJfTkFNRV07XG4gICAgLy9UT0RPOiBodHRwLnVybCBhdHRyaWJ1dGUsIGl0IHNob3VsZCBzdWJzdGl0dXRlIGFueSBwYXJhbWV0ZXJzIHRvIGF2b2lkIGhpZ2ggY2FyZGluYWxpdHkuXG4gICAgcmV0dXJuIG1ldHJpY0F0dHJpYnV0ZXM7XG59O1xuZXhwb3J0cy5nZXRPdXRnb2luZ1JlcXVlc3RNZXRyaWNBdHRyaWJ1dGVzID0gZ2V0T3V0Z29pbmdSZXF1ZXN0TWV0cmljQXR0cmlidXRlcztcbi8qKlxuICogUmV0dXJucyBhdHRyaWJ1dGVzIHJlbGF0ZWQgdG8gdGhlIGtpbmQgb2YgSFRUUCBwcm90b2NvbCB1c2VkXG4gKiBAcGFyYW0ge3N0cmluZ30gW2tpbmRdIEtpbmQgb2YgSFRUUCBwcm90b2NvbCB1c2VkOiBcIjEuMFwiLCBcIjEuMVwiLCBcIjJcIiwgXCJTUERZXCIgb3IgXCJRVUlDXCIuXG4gKi9cbmNvbnN0IHNldEF0dHJpYnV0ZXNGcm9tSHR0cEtpbmQgPSAoa2luZCwgYXR0cmlidXRlcykgPT4ge1xuICAgIGlmIChraW5kKSB7XG4gICAgICAgIGF0dHJpYnV0ZXNbc2VtY29udl8xLkFUVFJfSFRUUF9GTEFWT1JdID0ga2luZDtcbiAgICAgICAgaWYgKGtpbmQudG9VcHBlckNhc2UoKSAhPT0gJ1FVSUMnKSB7XG4gICAgICAgICAgICBhdHRyaWJ1dGVzW3NlbWNvbnZfMS5BVFRSX05FVF9UUkFOU1BPUlRdID0gc2VtY29udl8xLk5FVF9UUkFOU1BPUlRfVkFMVUVfSVBfVENQO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgYXR0cmlidXRlc1tzZW1jb252XzEuQVRUUl9ORVRfVFJBTlNQT1JUXSA9IHNlbWNvbnZfMS5ORVRfVFJBTlNQT1JUX1ZBTFVFX0lQX1VEUDtcbiAgICAgICAgfVxuICAgIH1cbn07XG5leHBvcnRzLnNldEF0dHJpYnV0ZXNGcm9tSHR0cEtpbmQgPSBzZXRBdHRyaWJ1dGVzRnJvbUh0dHBLaW5kO1xuLyoqXG4gKiBSZXR1cm5zIHRoZSB0eXBlIG9mIHN5bnRoZXRpYyBzb3VyY2UgYmFzZWQgb24gdGhlIHVzZXIgYWdlbnRcbiAqIEBwYXJhbSB7T3V0Z29pbmdIdHRwSGVhZGVyfSB1c2VyQWdlbnQgdGhlIHVzZXIgYWdlbnQgc3RyaW5nXG4gKi9cbmNvbnN0IGdldFN5bnRoZXRpY1R5cGUgPSAodXNlckFnZW50KSA9PiB7XG4gICAgY29uc3QgdXNlckFnZW50U3RyaW5nID0gU3RyaW5nKHVzZXJBZ2VudCkudG9Mb3dlckNhc2UoKTtcbiAgICBmb3IgKGNvbnN0IG5hbWUgb2YgaW50ZXJuYWxfdHlwZXNfMS5TWU5USEVUSUNfVEVTVF9OQU1FUykge1xuICAgICAgICBpZiAodXNlckFnZW50U3RyaW5nLmluY2x1ZGVzKG5hbWUpKSB7XG4gICAgICAgICAgICByZXR1cm4gc2VtY29udl8xLlVTRVJfQUdFTlRfU1lOVEhFVElDX1RZUEVfVkFMVUVfVEVTVDtcbiAgICAgICAgfVxuICAgIH1cbiAgICBmb3IgKGNvbnN0IG5hbWUgb2YgaW50ZXJuYWxfdHlwZXNfMS5TWU5USEVUSUNfQk9UX05BTUVTKSB7XG4gICAgICAgIGlmICh1c2VyQWdlbnRTdHJpbmcuaW5jbHVkZXMobmFtZSkpIHtcbiAgICAgICAgICAgIHJldHVybiBzZW1jb252XzEuVVNFUl9BR0VOVF9TWU5USEVUSUNfVFlQRV9WQUxVRV9CT1Q7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuO1xufTtcbi8qKlxuICogUmV0dXJucyBvdXRnb2luZyByZXF1ZXN0IGF0dHJpYnV0ZXMgc2NvcGVkIHRvIHRoZSByZXNwb25zZSBkYXRhXG4gKiBAcGFyYW0ge0luY29taW5nTWVzc2FnZX0gcmVzcG9uc2UgdGhlIHJlc3BvbnNlIG9iamVjdFxuICogQHBhcmFtIHtTZW1jb252U3RhYmlsaXR5fSBzZW1jb252U3RhYmlsaXR5IGRldGVybWluZXMgd2hpY2ggc2VtY29udiB2ZXJzaW9uIHRvIHVzZVxuICovXG5jb25zdCBnZXRPdXRnb2luZ1JlcXVlc3RBdHRyaWJ1dGVzT25SZXNwb25zZSA9IChyZXNwb25zZSwgc2VtY29udlN0YWJpbGl0eSkgPT4ge1xuICAgIGNvbnN0IHsgc3RhdHVzQ29kZSwgc3RhdHVzTWVzc2FnZSwgaHR0cFZlcnNpb24sIHNvY2tldCB9ID0gcmVzcG9uc2U7XG4gICAgY29uc3Qgb2xkQXR0cmlidXRlcyA9IHt9O1xuICAgIGNvbnN0IHN0YWJsZUF0dHJpYnV0ZXMgPSB7fTtcbiAgICBpZiAoc3RhdHVzQ29kZSAhPSBudWxsKSB7XG4gICAgICAgIHN0YWJsZUF0dHJpYnV0ZXNbc2VtYW50aWNfY29udmVudGlvbnNfMS5BVFRSX0hUVFBfUkVTUE9OU0VfU1RBVFVTX0NPREVdID0gc3RhdHVzQ29kZTtcbiAgICB9XG4gICAgaWYgKHNvY2tldCkge1xuICAgICAgICBjb25zdCB7IHJlbW90ZUFkZHJlc3MsIHJlbW90ZVBvcnQgfSA9IHNvY2tldDtcbiAgICAgICAgb2xkQXR0cmlidXRlc1tzZW1jb252XzEuQVRUUl9ORVRfUEVFUl9JUF0gPSByZW1vdGVBZGRyZXNzO1xuICAgICAgICBvbGRBdHRyaWJ1dGVzW3NlbWNvbnZfMS5BVFRSX05FVF9QRUVSX1BPUlRdID0gcmVtb3RlUG9ydDtcbiAgICAgICAgLy8gUmVjb21tZW5kZWRcbiAgICAgICAgc3RhYmxlQXR0cmlidXRlc1tzZW1hbnRpY19jb252ZW50aW9uc18xLkFUVFJfTkVUV09SS19QRUVSX0FERFJFU1NdID0gcmVtb3RlQWRkcmVzcztcbiAgICAgICAgc3RhYmxlQXR0cmlidXRlc1tzZW1hbnRpY19jb252ZW50aW9uc18xLkFUVFJfTkVUV09SS19QRUVSX1BPUlRdID0gcmVtb3RlUG9ydDtcbiAgICAgICAgc3RhYmxlQXR0cmlidXRlc1tzZW1hbnRpY19jb252ZW50aW9uc18xLkFUVFJfTkVUV09SS19QUk9UT0NPTF9WRVJTSU9OXSA9IHJlc3BvbnNlLmh0dHBWZXJzaW9uO1xuICAgIH1cbiAgICAoMCwgZXhwb3J0cy5zZXRSZXNwb25zZUNvbnRlbnRMZW5ndGhBdHRyaWJ1dGUpKHJlc3BvbnNlLCBvbGRBdHRyaWJ1dGVzKTtcbiAgICBpZiAoc3RhdHVzQ29kZSkge1xuICAgICAgICBvbGRBdHRyaWJ1dGVzW3NlbWNvbnZfMS5BVFRSX0hUVFBfU1RBVFVTX0NPREVdID0gc3RhdHVzQ29kZTtcbiAgICAgICAgb2xkQXR0cmlidXRlc1tBdHRyaWJ1dGVOYW1lc18xLkF0dHJpYnV0ZU5hbWVzLkhUVFBfU1RBVFVTX1RFWFRdID0gKHN0YXR1c01lc3NhZ2UgfHwgJycpLnRvVXBwZXJDYXNlKCk7XG4gICAgfVxuICAgICgwLCBleHBvcnRzLnNldEF0dHJpYnV0ZXNGcm9tSHR0cEtpbmQpKGh0dHBWZXJzaW9uLCBvbGRBdHRyaWJ1dGVzKTtcbiAgICBzd2l0Y2ggKHNlbWNvbnZTdGFiaWxpdHkpIHtcbiAgICAgICAgY2FzZSBpbnN0cnVtZW50YXRpb25fMS5TZW1jb252U3RhYmlsaXR5LlNUQUJMRTpcbiAgICAgICAgICAgIHJldHVybiBzdGFibGVBdHRyaWJ1dGVzO1xuICAgICAgICBjYXNlIGluc3RydW1lbnRhdGlvbl8xLlNlbWNvbnZTdGFiaWxpdHkuT0xEOlxuICAgICAgICAgICAgcmV0dXJuIG9sZEF0dHJpYnV0ZXM7XG4gICAgfVxuICAgIHJldHVybiBPYmplY3QuYXNzaWduKG9sZEF0dHJpYnV0ZXMsIHN0YWJsZUF0dHJpYnV0ZXMpO1xufTtcbmV4cG9ydHMuZ2V0T3V0Z29pbmdSZXF1ZXN0QXR0cmlidXRlc09uUmVzcG9uc2UgPSBnZXRPdXRnb2luZ1JlcXVlc3RBdHRyaWJ1dGVzT25SZXNwb25zZTtcbi8qKlxuICogUmV0dXJucyBvdXRnb2luZyByZXF1ZXN0IE1ldHJpYyBhdHRyaWJ1dGVzIHNjb3BlZCB0byB0aGUgcmVzcG9uc2UgZGF0YVxuICogQHBhcmFtIHtBdHRyaWJ1dGVzfSBzcGFuQXR0cmlidXRlcyB0aGUgc3BhbiBhdHRyaWJ1dGVzXG4gKi9cbmNvbnN0IGdldE91dGdvaW5nUmVxdWVzdE1ldHJpY0F0dHJpYnV0ZXNPblJlc3BvbnNlID0gKHNwYW5BdHRyaWJ1dGVzKSA9PiB7XG4gICAgY29uc3QgbWV0cmljQXR0cmlidXRlcyA9IHt9O1xuICAgIG1ldHJpY0F0dHJpYnV0ZXNbc2VtY29udl8xLkFUVFJfTkVUX1BFRVJfUE9SVF0gPSBzcGFuQXR0cmlidXRlc1tzZW1jb252XzEuQVRUUl9ORVRfUEVFUl9QT1JUXTtcbiAgICBtZXRyaWNBdHRyaWJ1dGVzW3NlbWNvbnZfMS5BVFRSX0hUVFBfU1RBVFVTX0NPREVdID1cbiAgICAgICAgc3BhbkF0dHJpYnV0ZXNbc2VtY29udl8xLkFUVFJfSFRUUF9TVEFUVVNfQ09ERV07XG4gICAgbWV0cmljQXR0cmlidXRlc1tzZW1jb252XzEuQVRUUl9IVFRQX0ZMQVZPUl0gPSBzcGFuQXR0cmlidXRlc1tzZW1jb252XzEuQVRUUl9IVFRQX0ZMQVZPUl07XG4gICAgcmV0dXJuIG1ldHJpY0F0dHJpYnV0ZXM7XG59O1xuZXhwb3J0cy5nZXRPdXRnb2luZ1JlcXVlc3RNZXRyaWNBdHRyaWJ1dGVzT25SZXNwb25zZSA9IGdldE91dGdvaW5nUmVxdWVzdE1ldHJpY0F0dHJpYnV0ZXNPblJlc3BvbnNlO1xuY29uc3QgZ2V0T3V0Z29pbmdTdGFibGVSZXF1ZXN0TWV0cmljQXR0cmlidXRlc09uUmVzcG9uc2UgPSAoc3BhbkF0dHJpYnV0ZXMpID0+IHtcbiAgICBjb25zdCBtZXRyaWNBdHRyaWJ1dGVzID0ge307XG4gICAgaWYgKHNwYW5BdHRyaWJ1dGVzW3NlbWFudGljX2NvbnZlbnRpb25zXzEuQVRUUl9ORVRXT1JLX1BST1RPQ09MX1ZFUlNJT05dKSB7XG4gICAgICAgIG1ldHJpY0F0dHJpYnV0ZXNbc2VtYW50aWNfY29udmVudGlvbnNfMS5BVFRSX05FVFdPUktfUFJPVE9DT0xfVkVSU0lPTl0gPVxuICAgICAgICAgICAgc3BhbkF0dHJpYnV0ZXNbc2VtYW50aWNfY29udmVudGlvbnNfMS5BVFRSX05FVFdPUktfUFJPVE9DT0xfVkVSU0lPTl07XG4gICAgfVxuICAgIGlmIChzcGFuQXR0cmlidXRlc1tzZW1hbnRpY19jb252ZW50aW9uc18xLkFUVFJfSFRUUF9SRVNQT05TRV9TVEFUVVNfQ09ERV0pIHtcbiAgICAgICAgbWV0cmljQXR0cmlidXRlc1tzZW1hbnRpY19jb252ZW50aW9uc18xLkFUVFJfSFRUUF9SRVNQT05TRV9TVEFUVVNfQ09ERV0gPVxuICAgICAgICAgICAgc3BhbkF0dHJpYnV0ZXNbc2VtYW50aWNfY29udmVudGlvbnNfMS5BVFRSX0hUVFBfUkVTUE9OU0VfU1RBVFVTX0NPREVdO1xuICAgIH1cbiAgICByZXR1cm4gbWV0cmljQXR0cmlidXRlcztcbn07XG5leHBvcnRzLmdldE91dGdvaW5nU3RhYmxlUmVxdWVzdE1ldHJpY0F0dHJpYnV0ZXNPblJlc3BvbnNlID0gZ2V0T3V0Z29pbmdTdGFibGVSZXF1ZXN0TWV0cmljQXR0cmlidXRlc09uUmVzcG9uc2U7XG5mdW5jdGlvbiBwYXJzZUhvc3RIZWFkZXIoaG9zdEhlYWRlciwgcHJvdG8pIHtcbiAgICBjb25zdCBwYXJ0cyA9IGhvc3RIZWFkZXIuc3BsaXQoJzonKTtcbiAgICAvLyBubyBzZW1pY29sb24gaW1wbGllcyBpcHY0IGRvdHRlZCBzeW50YXggb3IgaG9zdCBuYW1lIHdpdGhvdXQgcG9ydFxuICAgIC8vIHgueC54LnhcbiAgICAvLyBleGFtcGxlLmNvbVxuICAgIGlmIChwYXJ0cy5sZW5ndGggPT09IDEpIHtcbiAgICAgICAgaWYgKHByb3RvID09PSAnaHR0cCcpIHtcbiAgICAgICAgICAgIHJldHVybiB7IGhvc3Q6IHBhcnRzWzBdLCBwb3J0OiAnODAnIH07XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHByb3RvID09PSAnaHR0cHMnKSB7XG4gICAgICAgICAgICByZXR1cm4geyBob3N0OiBwYXJ0c1swXSwgcG9ydDogJzQ0MycgfTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4geyBob3N0OiBwYXJ0c1swXSB9O1xuICAgIH1cbiAgICAvLyBzaW5nbGUgc2VtaWNvbG9uIGltcGxpZXMgaXB2NCBkb3R0ZWQgc3ludGF4IG9yIGhvc3QgbmFtZSB3aXRoIHBvcnRcbiAgICAvLyB4LngueC54Onl5eXlcbiAgICAvLyBleGFtcGxlLmNvbTp5eXl5XG4gICAgaWYgKHBhcnRzLmxlbmd0aCA9PT0gMikge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgaG9zdDogcGFydHNbMF0sXG4gICAgICAgICAgICBwb3J0OiBwYXJ0c1sxXSxcbiAgICAgICAgfTtcbiAgICB9XG4gICAgLy8gbW9yZSB0aGFuIDIgcGFydHMgaW1wbGllcyBpcHY2IHN5bnRheCB3aXRoIG11bHRpcGxlIGNvbG9uc1xuICAgIC8vIFt4Ong6eDp4Ong6eDp4OnhdXG4gICAgLy8gW3g6eDp4Ong6eDp4Ong6eF06eXl5eVxuICAgIGlmIChwYXJ0c1swXS5zdGFydHNXaXRoKCdbJykpIHtcbiAgICAgICAgaWYgKHBhcnRzW3BhcnRzLmxlbmd0aCAtIDFdLmVuZHNXaXRoKCddJykpIHtcbiAgICAgICAgICAgIGlmIChwcm90byA9PT0gJ2h0dHAnKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHsgaG9zdDogaG9zdEhlYWRlciwgcG9ydDogJzgwJyB9O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHByb3RvID09PSAnaHR0cHMnKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHsgaG9zdDogaG9zdEhlYWRlciwgcG9ydDogJzQ0MycgfTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChwYXJ0c1twYXJ0cy5sZW5ndGggLSAyXS5lbmRzV2l0aCgnXScpKSB7XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIGhvc3Q6IHBhcnRzLnNsaWNlKDAsIC0xKS5qb2luKCc6JyksXG4gICAgICAgICAgICAgICAgcG9ydDogcGFydHNbcGFydHMubGVuZ3RoIC0gMV0sXG4gICAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgfVxuICAgIC8vIGlmIG5vdGhpbmcgYWJvdmUgbWF0Y2hlcyBqdXN0IHJldHVybiB0aGUgaG9zdCBoZWFkZXJcbiAgICByZXR1cm4geyBob3N0OiBob3N0SGVhZGVyIH07XG59XG4vKipcbiAqIEdldCBzZXJ2ZXIuYWRkcmVzcyBhbmQgcG9ydCBhY2NvcmRpbmcgdG8gaHR0cCBzZW1jb252IDEuMjdcbiAqIGh0dHBzOi8vZ2l0aHViLmNvbS9vcGVuLXRlbGVtZXRyeS9zZW1hbnRpYy1jb252ZW50aW9ucy9ibG9iL2JmMGEyYzExMzRmMjA2ZjAzNDQwOGIyMDFkYmVjMzc5NjBlZDYwZWMvZG9jcy9odHRwL2h0dHAtc3BhbnMubWQjc2V0dGluZy1zZXJ2ZXJhZGRyZXNzLWFuZC1zZXJ2ZXJwb3J0LWF0dHJpYnV0ZXNcbiAqL1xuZnVuY3Rpb24gZ2V0U2VydmVyQWRkcmVzcyhyZXF1ZXN0LCBjb21wb25lbnQpIHtcbiAgICBjb25zdCBmb3J3YXJkZWRIZWFkZXIgPSByZXF1ZXN0LmhlYWRlcnNbJ2ZvcndhcmRlZCddO1xuICAgIGlmIChmb3J3YXJkZWRIZWFkZXIpIHtcbiAgICAgICAgZm9yIChjb25zdCBlbnRyeSBvZiBwYXJzZUZvcndhcmRlZEhlYWRlcihmb3J3YXJkZWRIZWFkZXIpKSB7XG4gICAgICAgICAgICBpZiAoZW50cnkuaG9zdCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBwYXJzZUhvc3RIZWFkZXIoZW50cnkuaG9zdCwgZW50cnkucHJvdG8pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIGNvbnN0IHhGb3J3YXJkZWRIb3N0ID0gcmVxdWVzdC5oZWFkZXJzWyd4LWZvcndhcmRlZC1ob3N0J107XG4gICAgaWYgKHR5cGVvZiB4Rm9yd2FyZGVkSG9zdCA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgaWYgKHR5cGVvZiByZXF1ZXN0LmhlYWRlcnNbJ3gtZm9yd2FyZGVkLXByb3RvJ10gPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICByZXR1cm4gcGFyc2VIb3N0SGVhZGVyKHhGb3J3YXJkZWRIb3N0LCByZXF1ZXN0LmhlYWRlcnNbJ3gtZm9yd2FyZGVkLXByb3RvJ10pO1xuICAgICAgICB9XG4gICAgICAgIGlmIChBcnJheS5pc0FycmF5KHJlcXVlc3QuaGVhZGVyc1sneC1mb3J3YXJkZWQtcHJvdG8nXSkpIHtcbiAgICAgICAgICAgIHJldHVybiBwYXJzZUhvc3RIZWFkZXIoeEZvcndhcmRlZEhvc3QsIHJlcXVlc3QuaGVhZGVyc1sneC1mb3J3YXJkZWQtcHJvdG8nXVswXSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHBhcnNlSG9zdEhlYWRlcih4Rm9yd2FyZGVkSG9zdCk7XG4gICAgfVxuICAgIGVsc2UgaWYgKEFycmF5LmlzQXJyYXkoeEZvcndhcmRlZEhvc3QpICYmXG4gICAgICAgIHR5cGVvZiB4Rm9yd2FyZGVkSG9zdFswXSA9PT0gJ3N0cmluZycgJiZcbiAgICAgICAgeEZvcndhcmRlZEhvc3RbMF0ubGVuZ3RoID4gMCkge1xuICAgICAgICBpZiAodHlwZW9mIHJlcXVlc3QuaGVhZGVyc1sneC1mb3J3YXJkZWQtcHJvdG8nXSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgIHJldHVybiBwYXJzZUhvc3RIZWFkZXIoeEZvcndhcmRlZEhvc3RbMF0sIHJlcXVlc3QuaGVhZGVyc1sneC1mb3J3YXJkZWQtcHJvdG8nXSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkocmVxdWVzdC5oZWFkZXJzWyd4LWZvcndhcmRlZC1wcm90byddKSkge1xuICAgICAgICAgICAgcmV0dXJuIHBhcnNlSG9zdEhlYWRlcih4Rm9yd2FyZGVkSG9zdFswXSwgcmVxdWVzdC5oZWFkZXJzWyd4LWZvcndhcmRlZC1wcm90byddWzBdKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcGFyc2VIb3N0SGVhZGVyKHhGb3J3YXJkZWRIb3N0WzBdKTtcbiAgICB9XG4gICAgY29uc3QgaG9zdCA9IHJlcXVlc3QuaGVhZGVyc1snaG9zdCddO1xuICAgIGlmICh0eXBlb2YgaG9zdCA9PT0gJ3N0cmluZycgJiYgaG9zdC5sZW5ndGggPiAwKSB7XG4gICAgICAgIHJldHVybiBwYXJzZUhvc3RIZWFkZXIoaG9zdCwgY29tcG9uZW50KTtcbiAgICB9XG4gICAgcmV0dXJuIG51bGw7XG59XG4vKipcbiAqIEdldCBzZXJ2ZXIuYWRkcmVzcyBhbmQgcG9ydCBhY2NvcmRpbmcgdG8gaHR0cCBzZW1jb252IDEuMjdcbiAqIGh0dHBzOi8vZ2l0aHViLmNvbS9vcGVuLXRlbGVtZXRyeS9zZW1hbnRpYy1jb252ZW50aW9ucy9ibG9iL2JmMGEyYzExMzRmMjA2ZjAzNDQwOGIyMDFkYmVjMzc5NjBlZDYwZWMvZG9jcy9odHRwL2h0dHAtc3BhbnMubWQjc2V0dGluZy1zZXJ2ZXJhZGRyZXNzLWFuZC1zZXJ2ZXJwb3J0LWF0dHJpYnV0ZXNcbiAqL1xuZnVuY3Rpb24gZ2V0UmVtb3RlQ2xpZW50QWRkcmVzcyhyZXF1ZXN0KSB7XG4gICAgY29uc3QgZm9yd2FyZGVkSGVhZGVyID0gcmVxdWVzdC5oZWFkZXJzWydmb3J3YXJkZWQnXTtcbiAgICBpZiAoZm9yd2FyZGVkSGVhZGVyKSB7XG4gICAgICAgIGZvciAoY29uc3QgZW50cnkgb2YgcGFyc2VGb3J3YXJkZWRIZWFkZXIoZm9yd2FyZGVkSGVhZGVyKSkge1xuICAgICAgICAgICAgaWYgKGVudHJ5LmZvcikge1xuICAgICAgICAgICAgICAgIHJldHVybiByZW1vdmVQb3J0RnJvbUFkZHJlc3MoZW50cnkuZm9yKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICBjb25zdCB4Rm9yd2FyZGVkRm9yID0gcmVxdWVzdC5oZWFkZXJzWyd4LWZvcndhcmRlZC1mb3InXTtcbiAgICBpZiAoeEZvcndhcmRlZEZvcikge1xuICAgICAgICBsZXQgeEZvcndhcmRlZEZvclZhbDtcbiAgICAgICAgaWYgKHR5cGVvZiB4Rm9yd2FyZGVkRm9yID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgeEZvcndhcmRlZEZvclZhbCA9IHhGb3J3YXJkZWRGb3I7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoQXJyYXkuaXNBcnJheSh4Rm9yd2FyZGVkRm9yKSkge1xuICAgICAgICAgICAgeEZvcndhcmRlZEZvclZhbCA9IHhGb3J3YXJkZWRGb3JbMF07XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHR5cGVvZiB4Rm9yd2FyZGVkRm9yVmFsID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgeEZvcndhcmRlZEZvclZhbCA9IHhGb3J3YXJkZWRGb3JWYWwuc3BsaXQoJywnKVswXS50cmltKCk7XG4gICAgICAgICAgICByZXR1cm4gcmVtb3ZlUG9ydEZyb21BZGRyZXNzKHhGb3J3YXJkZWRGb3JWYWwpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGNvbnN0IHJlbW90ZSA9IHJlcXVlc3Quc29ja2V0LnJlbW90ZUFkZHJlc3M7XG4gICAgaWYgKHJlbW90ZSkge1xuICAgICAgICByZXR1cm4gcmVtb3RlO1xuICAgIH1cbiAgICByZXR1cm4gbnVsbDtcbn1cbmV4cG9ydHMuZ2V0UmVtb3RlQ2xpZW50QWRkcmVzcyA9IGdldFJlbW90ZUNsaWVudEFkZHJlc3M7XG5mdW5jdGlvbiByZW1vdmVQb3J0RnJvbUFkZHJlc3MoaW5wdXQpIHtcbiAgICAvLyBUaGlzIGZ1bmN0aW9uIGNhbiBiZSByZXBsYWNlZCB3aXRoIFNvY2tldEFkZHJlc3MucGFyc2UoKSBvbmNlIHRoZSBtaW5pbXVtXG4gICAgLy8gc3VwcG9ydGVkIE5vZGUuanMgdmVyc2lvbiBhbGxvd3MgaXQuXG4gICAgdHJ5IHtcbiAgICAgICAgY29uc3QgeyBob3N0bmFtZTogYWRkcmVzcyB9ID0gbmV3IFVSTChgaHR0cDovLyR7aW5wdXR9YCk7XG4gICAgICAgIGlmIChhZGRyZXNzLnN0YXJ0c1dpdGgoJ1snKSAmJiBhZGRyZXNzLmVuZHNXaXRoKCddJykpIHtcbiAgICAgICAgICAgIHJldHVybiBhZGRyZXNzLnNsaWNlKDEsIC0xKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gYWRkcmVzcztcbiAgICB9XG4gICAgY2F0Y2gge1xuICAgICAgICByZXR1cm4gaW5wdXQ7XG4gICAgfVxufVxuZnVuY3Rpb24gZ2V0SW5mb0Zyb21JbmNvbWluZ01lc3NhZ2UoY29tcG9uZW50LCByZXF1ZXN0LCBsb2dnZXIpIHtcbiAgICB0cnkge1xuICAgICAgICBpZiAocmVxdWVzdC5oZWFkZXJzLmhvc3QpIHtcbiAgICAgICAgICAgIHJldHVybiBuZXcgVVJMKHJlcXVlc3QudXJsID8/ICcvJywgYCR7Y29tcG9uZW50fTovLyR7cmVxdWVzdC5oZWFkZXJzLmhvc3R9YCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBjb25zdCB1bnNhZmVQYXJzZWRVcmwgPSBuZXcgVVJMKHJlcXVlc3QudXJsID8/ICcvJywgXG4gICAgICAgICAgICAvLyB1c2luZyBsb2NhbGhvc3QgYXMgYSB3b3JrYXJvdW5kIHRvIHN0aWxsIHVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIGZvciBwYXJzaW5nXG4gICAgICAgICAgICBgJHtjb21wb25lbnR9Oi8vbG9jYWxob3N0YCk7XG4gICAgICAgICAgICAvLyBzaW5jZSB3ZSB1c2UgbG9jYWxob3N0IGFzIGEgd29ya2Fyb3VuZCwgZW5zdXJlIHdlIGhpZGUgdGhlIHJlc3Qgb2YgdGhlIHByb3BlcnRpZXMgdG8gYXZvaWRcbiAgICAgICAgICAgIC8vIG91ciB3b3JrYXJvdW5kIGxlYWtpbmcgdGhvdWdoLlxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICBwYXRobmFtZTogdW5zYWZlUGFyc2VkVXJsLnBhdGhuYW1lLFxuICAgICAgICAgICAgICAgIHNlYXJjaDogdW5zYWZlUGFyc2VkVXJsLnNlYXJjaCxcbiAgICAgICAgICAgICAgICB0b1N0cmluZzogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgICAgICAvLyB3ZSBjYW5ub3QgdXNlIHRoZSByZXN1bHQgb2YgdW5zYWZlUGFyc2VkVXJsLnRvU3RyaW5nIGFzIGl0J3MgcG90ZW50aWFsbHkgd3JvbmcuXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB1bnNhZmVQYXJzZWRVcmwucGF0aG5hbWUgKyB1bnNhZmVQYXJzZWRVcmwuc2VhcmNoO1xuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgfVxuICAgIGNhdGNoIChlKSB7XG4gICAgICAgIC8vIHNvbWV0aGluZyBpcyB3cm9uZywgdXNlIHVuZGVmaW5lZCAtIHRoaXMgKnNob3VsZCogbmV2ZXIgaGFwcGVuLCBsb2dnaW5nXG4gICAgICAgIC8vIGZvciB0cm91Ymxlc2hvb3RpbmcgaW4gY2FzZSBpdCBkb2VzIGhhcHBlbi5cbiAgICAgICAgbG9nZ2VyLnZlcmJvc2UoJ1VuYWJsZSB0byBnZXQgVVJMIGZyb20gcmVxdWVzdCcsIGUpO1xuICAgICAgICByZXR1cm4ge307XG4gICAgfVxufVxuLyoqXG4gKiBSZXR1cm5zIGluY29taW5nIHJlcXVlc3QgYXR0cmlidXRlcyBzY29wZWQgdG8gdGhlIHJlcXVlc3QgZGF0YVxuICogQHBhcmFtIHtJbmNvbWluZ01lc3NhZ2V9IHJlcXVlc3QgdGhlIHJlcXVlc3Qgb2JqZWN0XG4gKiBAcGFyYW0ge3sgY29tcG9uZW50OiBzdHJpbmcsIHNlcnZlck5hbWU/OiBzdHJpbmcsIGhvb2tBdHRyaWJ1dGVzPzogQXR0cmlidXRlcyB9fSBvcHRpb25zIHVzZWQgdG8gcGFzcyBkYXRhIG5lZWRlZCB0byBjcmVhdGUgYXR0cmlidXRlc1xuICogQHBhcmFtIHtTZW1jb252U3RhYmlsaXR5fSBzZW1jb252U3RhYmlsaXR5IGRldGVybWluZXMgd2hpY2ggc2VtY29udiB2ZXJzaW9uIHRvIHVzZVxuICovXG5jb25zdCBnZXRJbmNvbWluZ1JlcXVlc3RBdHRyaWJ1dGVzID0gKHJlcXVlc3QsIG9wdGlvbnMsIGxvZ2dlcikgPT4ge1xuICAgIGNvbnN0IHsgY29tcG9uZW50LCBlbmFibGVTeW50aGV0aWNTb3VyY2VEZXRlY3Rpb24sIGhvb2tBdHRyaWJ1dGVzLCBzZW1jb252U3RhYmlsaXR5LCBzZXJ2ZXJOYW1lLCB9ID0gb3B0aW9ucztcbiAgICBjb25zdCB7IGhlYWRlcnMsIGh0dHBWZXJzaW9uLCBtZXRob2QgfSA9IHJlcXVlc3Q7XG4gICAgY29uc3QgeyBob3N0LCAndXNlci1hZ2VudCc6IHVzZXJBZ2VudCwgJ3gtZm9yd2FyZGVkLWZvcic6IGlwcyB9ID0gaGVhZGVycztcbiAgICBjb25zdCBwYXJzZWRVcmwgPSBnZXRJbmZvRnJvbUluY29taW5nTWVzc2FnZShjb21wb25lbnQsIHJlcXVlc3QsIGxvZ2dlcik7XG4gICAgbGV0IG5ld0F0dHJpYnV0ZXM7XG4gICAgbGV0IG9sZEF0dHJpYnV0ZXM7XG4gICAgaWYgKHNlbWNvbnZTdGFiaWxpdHkgIT09IGluc3RydW1lbnRhdGlvbl8xLlNlbWNvbnZTdGFiaWxpdHkuT0xEKSB7XG4gICAgICAgIC8vIFN0YWJsZSBhdHRyaWJ1dGVzIGFyZSB1c2VkLlxuICAgICAgICBjb25zdCBub3JtYWxpemVkTWV0aG9kID0gbm9ybWFsaXplTWV0aG9kKG1ldGhvZCk7XG4gICAgICAgIGNvbnN0IHNlcnZlckFkZHJlc3MgPSBnZXRTZXJ2ZXJBZGRyZXNzKHJlcXVlc3QsIGNvbXBvbmVudCk7XG4gICAgICAgIGNvbnN0IHJlbW90ZUNsaWVudEFkZHJlc3MgPSBnZXRSZW1vdGVDbGllbnRBZGRyZXNzKHJlcXVlc3QpO1xuICAgICAgICBuZXdBdHRyaWJ1dGVzID0ge1xuICAgICAgICAgICAgW3NlbWFudGljX2NvbnZlbnRpb25zXzEuQVRUUl9IVFRQX1JFUVVFU1RfTUVUSE9EXTogbm9ybWFsaXplZE1ldGhvZCxcbiAgICAgICAgICAgIFtzZW1hbnRpY19jb252ZW50aW9uc18xLkFUVFJfVVJMX1NDSEVNRV06IGNvbXBvbmVudCxcbiAgICAgICAgICAgIFtzZW1hbnRpY19jb252ZW50aW9uc18xLkFUVFJfU0VSVkVSX0FERFJFU1NdOiBzZXJ2ZXJBZGRyZXNzPy5ob3N0LFxuICAgICAgICAgICAgW3NlbWFudGljX2NvbnZlbnRpb25zXzEuQVRUUl9ORVRXT1JLX1BFRVJfQUREUkVTU106IHJlcXVlc3Quc29ja2V0LnJlbW90ZUFkZHJlc3MsXG4gICAgICAgICAgICBbc2VtYW50aWNfY29udmVudGlvbnNfMS5BVFRSX05FVFdPUktfUEVFUl9QT1JUXTogcmVxdWVzdC5zb2NrZXQucmVtb3RlUG9ydCxcbiAgICAgICAgICAgIFtzZW1hbnRpY19jb252ZW50aW9uc18xLkFUVFJfTkVUV09SS19QUk9UT0NPTF9WRVJTSU9OXTogcmVxdWVzdC5odHRwVmVyc2lvbixcbiAgICAgICAgICAgIFtzZW1hbnRpY19jb252ZW50aW9uc18xLkFUVFJfVVNFUl9BR0VOVF9PUklHSU5BTF06IHVzZXJBZ2VudCxcbiAgICAgICAgfTtcbiAgICAgICAgaWYgKHBhcnNlZFVybC5wYXRobmFtZSAhPSBudWxsKSB7XG4gICAgICAgICAgICBuZXdBdHRyaWJ1dGVzW3NlbWFudGljX2NvbnZlbnRpb25zXzEuQVRUUl9VUkxfUEFUSF0gPSBwYXJzZWRVcmwucGF0aG5hbWU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHBhcnNlZFVybC5zZWFyY2gpIHtcbiAgICAgICAgICAgIC8vIFJlbW92ZSBsZWFkaW5nICc/JyBmcm9tIFVSTCBzZWFyY2ggKGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0FQSS9VUkwvc2VhcmNoKS5cbiAgICAgICAgICAgIG5ld0F0dHJpYnV0ZXNbc2VtYW50aWNfY29udmVudGlvbnNfMS5BVFRSX1VSTF9RVUVSWV0gPSBwYXJzZWRVcmwuc2VhcmNoLnNsaWNlKDEpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChyZW1vdGVDbGllbnRBZGRyZXNzICE9IG51bGwpIHtcbiAgICAgICAgICAgIG5ld0F0dHJpYnV0ZXNbc2VtYW50aWNfY29udmVudGlvbnNfMS5BVFRSX0NMSUVOVF9BRERSRVNTXSA9IHJlbW90ZUNsaWVudEFkZHJlc3M7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHNlcnZlckFkZHJlc3M/LnBvcnQgIT0gbnVsbCkge1xuICAgICAgICAgICAgbmV3QXR0cmlidXRlc1tzZW1hbnRpY19jb252ZW50aW9uc18xLkFUVFJfU0VSVkVSX1BPUlRdID0gTnVtYmVyKHNlcnZlckFkZHJlc3MucG9ydCk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gQ29uZGl0aW9uYWxseSByZXF1aXJlZCBpZiByZXF1ZXN0IG1ldGhvZCByZXF1aXJlZCBjYXNlIG5vcm1hbGl6YXRpb24uXG4gICAgICAgIGlmIChtZXRob2QgIT09IG5vcm1hbGl6ZWRNZXRob2QpIHtcbiAgICAgICAgICAgIG5ld0F0dHJpYnV0ZXNbc2VtYW50aWNfY29udmVudGlvbnNfMS5BVFRSX0hUVFBfUkVRVUVTVF9NRVRIT0RfT1JJR0lOQUxdID0gbWV0aG9kO1xuICAgICAgICB9XG4gICAgICAgIGlmIChlbmFibGVTeW50aGV0aWNTb3VyY2VEZXRlY3Rpb24gJiYgdXNlckFnZW50KSB7XG4gICAgICAgICAgICBuZXdBdHRyaWJ1dGVzW3NlbWNvbnZfMS5BVFRSX1VTRVJfQUdFTlRfU1lOVEhFVElDX1RZUEVdID1cbiAgICAgICAgICAgICAgICBnZXRTeW50aGV0aWNUeXBlKHVzZXJBZ2VudCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgaWYgKHNlbWNvbnZTdGFiaWxpdHkgIT09IGluc3RydW1lbnRhdGlvbl8xLlNlbWNvbnZTdGFiaWxpdHkuU1RBQkxFKSB7XG4gICAgICAgIC8vIE9sZCBhdHRyaWJ1dGVzIGFyZSB1c2VkLlxuICAgICAgICBjb25zdCBob3N0bmFtZSA9IGhvc3Q/LnJlcGxhY2UoL14oLiopKDpbMC05XXsxLDV9KS8sICckMScpIHx8ICdsb2NhbGhvc3QnO1xuICAgICAgICBvbGRBdHRyaWJ1dGVzID0ge1xuICAgICAgICAgICAgW3NlbWNvbnZfMS5BVFRSX0hUVFBfVVJMXTogcGFyc2VkVXJsLnRvU3RyaW5nKCksXG4gICAgICAgICAgICBbc2VtY29udl8xLkFUVFJfSFRUUF9IT1NUXTogaG9zdCxcbiAgICAgICAgICAgIFtzZW1jb252XzEuQVRUUl9ORVRfSE9TVF9OQU1FXTogaG9zdG5hbWUsXG4gICAgICAgICAgICBbc2VtY29udl8xLkFUVFJfSFRUUF9NRVRIT0RdOiBtZXRob2QsXG4gICAgICAgICAgICBbc2VtY29udl8xLkFUVFJfSFRUUF9TQ0hFTUVdOiBjb21wb25lbnQsXG4gICAgICAgIH07XG4gICAgICAgIGlmICh0eXBlb2YgaXBzID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgb2xkQXR0cmlidXRlc1tzZW1jb252XzEuQVRUUl9IVFRQX0NMSUVOVF9JUF0gPSBpcHMuc3BsaXQoJywnKVswXTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZW9mIHNlcnZlck5hbWUgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICBvbGRBdHRyaWJ1dGVzW3NlbWNvbnZfMS5BVFRSX0hUVFBfU0VSVkVSX05BTUVdID0gc2VydmVyTmFtZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAocGFyc2VkVXJsLnBhdGhuYW1lKSB7XG4gICAgICAgICAgICBvbGRBdHRyaWJ1dGVzW3NlbWNvbnZfMS5BVFRSX0hUVFBfVEFSR0VUXSA9XG4gICAgICAgICAgICAgICAgcGFyc2VkVXJsLnBhdGhuYW1lICsgcGFyc2VkVXJsLnNlYXJjaCB8fCAnLyc7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHVzZXJBZ2VudCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBvbGRBdHRyaWJ1dGVzW3NlbWNvbnZfMS5BVFRSX0hUVFBfVVNFUl9BR0VOVF0gPSB1c2VyQWdlbnQ7XG4gICAgICAgIH1cbiAgICAgICAgKDAsIGV4cG9ydHMuc2V0UmVxdWVzdENvbnRlbnRMZW5ndGhBdHRyaWJ1dGUpKHJlcXVlc3QsIG9sZEF0dHJpYnV0ZXMpO1xuICAgICAgICAoMCwgZXhwb3J0cy5zZXRBdHRyaWJ1dGVzRnJvbUh0dHBLaW5kKShodHRwVmVyc2lvbiwgb2xkQXR0cmlidXRlcyk7XG4gICAgfVxuICAgIHN3aXRjaCAoc2VtY29udlN0YWJpbGl0eSkge1xuICAgICAgICBjYXNlIGluc3RydW1lbnRhdGlvbl8xLlNlbWNvbnZTdGFiaWxpdHkuU1RBQkxFOlxuICAgICAgICAgICAgcmV0dXJuIE9iamVjdC5hc3NpZ24obmV3QXR0cmlidXRlcywgaG9va0F0dHJpYnV0ZXMpO1xuICAgICAgICBjYXNlIGluc3RydW1lbnRhdGlvbl8xLlNlbWNvbnZTdGFiaWxpdHkuT0xEOlxuICAgICAgICAgICAgcmV0dXJuIE9iamVjdC5hc3NpZ24ob2xkQXR0cmlidXRlcywgaG9va0F0dHJpYnV0ZXMpO1xuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgcmV0dXJuIE9iamVjdC5hc3NpZ24ob2xkQXR0cmlidXRlcywgbmV3QXR0cmlidXRlcywgaG9va0F0dHJpYnV0ZXMpO1xuICAgIH1cbn07XG5leHBvcnRzLmdldEluY29taW5nUmVxdWVzdEF0dHJpYnV0ZXMgPSBnZXRJbmNvbWluZ1JlcXVlc3RBdHRyaWJ1dGVzO1xuLyoqXG4gKiBSZXR1cm5zIGluY29taW5nIHJlcXVlc3QgTWV0cmljIGF0dHJpYnV0ZXMgc2NvcGVkIHRvIHRoZSByZXF1ZXN0IGRhdGFcbiAqIEBwYXJhbSB7QXR0cmlidXRlc30gc3BhbkF0dHJpYnV0ZXMgdGhlIHNwYW4gYXR0cmlidXRlc1xuICogQHBhcmFtIHt7IGNvbXBvbmVudDogc3RyaW5nIH19IG9wdGlvbnMgdXNlZCB0byBwYXNzIGRhdGEgbmVlZGVkIHRvIGNyZWF0ZSBhdHRyaWJ1dGVzXG4gKi9cbmNvbnN0IGdldEluY29taW5nUmVxdWVzdE1ldHJpY0F0dHJpYnV0ZXMgPSAoc3BhbkF0dHJpYnV0ZXMpID0+IHtcbiAgICBjb25zdCBtZXRyaWNBdHRyaWJ1dGVzID0ge307XG4gICAgbWV0cmljQXR0cmlidXRlc1tzZW1jb252XzEuQVRUUl9IVFRQX1NDSEVNRV0gPSBzcGFuQXR0cmlidXRlc1tzZW1jb252XzEuQVRUUl9IVFRQX1NDSEVNRV07XG4gICAgbWV0cmljQXR0cmlidXRlc1tzZW1jb252XzEuQVRUUl9IVFRQX01FVEhPRF0gPSBzcGFuQXR0cmlidXRlc1tzZW1jb252XzEuQVRUUl9IVFRQX01FVEhPRF07XG4gICAgbWV0cmljQXR0cmlidXRlc1tzZW1jb252XzEuQVRUUl9ORVRfSE9TVF9OQU1FXSA9IHNwYW5BdHRyaWJ1dGVzW3NlbWNvbnZfMS5BVFRSX05FVF9IT1NUX05BTUVdO1xuICAgIG1ldHJpY0F0dHJpYnV0ZXNbc2VtY29udl8xLkFUVFJfSFRUUF9GTEFWT1JdID0gc3BhbkF0dHJpYnV0ZXNbc2VtY29udl8xLkFUVFJfSFRUUF9GTEFWT1JdO1xuICAgIC8vVE9ETzogaHR0cC50YXJnZXQgYXR0cmlidXRlLCBpdCBzaG91bGQgc3Vic3RpdHV0ZSBhbnkgcGFyYW1ldGVycyB0byBhdm9pZCBoaWdoIGNhcmRpbmFsaXR5LlxuICAgIHJldHVybiBtZXRyaWNBdHRyaWJ1dGVzO1xufTtcbmV4cG9ydHMuZ2V0SW5jb21pbmdSZXF1ZXN0TWV0cmljQXR0cmlidXRlcyA9IGdldEluY29taW5nUmVxdWVzdE1ldHJpY0F0dHJpYnV0ZXM7XG4vKipcbiAqIFJldHVybnMgaW5jb21pbmcgcmVxdWVzdCBhdHRyaWJ1dGVzIHNjb3BlZCB0byB0aGUgcmVzcG9uc2UgZGF0YVxuICogQHBhcmFtIHsoU2VydmVyUmVzcG9uc2UgJiB7IHNvY2tldDogU29ja2V0OyB9KX0gcmVzcG9uc2UgdGhlIHJlc3BvbnNlIG9iamVjdFxuICovXG5jb25zdCBnZXRJbmNvbWluZ1JlcXVlc3RBdHRyaWJ1dGVzT25SZXNwb25zZSA9IChyZXF1ZXN0LCByZXNwb25zZSwgc2VtY29udlN0YWJpbGl0eSkgPT4ge1xuICAgIC8vIHRha2Ugc29ja2V0IGZyb20gdGhlIHJlcXVlc3QsXG4gICAgLy8gc2luY2UgaXQgbWF5IGJlIGRldGFjaGVkIGZyb20gdGhlIHJlc3BvbnNlIG9iamVjdCBpbiBrZWVwLWFsaXZlIG1vZGVcbiAgICBjb25zdCB7IHNvY2tldCB9ID0gcmVxdWVzdDtcbiAgICBjb25zdCB7IHN0YXR1c0NvZGUsIHN0YXR1c01lc3NhZ2UgfSA9IHJlc3BvbnNlO1xuICAgIGNvbnN0IG5ld0F0dHJpYnV0ZXMgPSB7XG4gICAgICAgIFtzZW1hbnRpY19jb252ZW50aW9uc18xLkFUVFJfSFRUUF9SRVNQT05TRV9TVEFUVVNfQ09ERV06IHN0YXR1c0NvZGUsXG4gICAgfTtcbiAgICBjb25zdCBycGNNZXRhZGF0YSA9ICgwLCBjb3JlXzEuZ2V0UlBDTWV0YWRhdGEpKGFwaV8xLmNvbnRleHQuYWN0aXZlKCkpO1xuICAgIGNvbnN0IG9sZEF0dHJpYnV0ZXMgPSB7fTtcbiAgICBpZiAoc29ja2V0KSB7XG4gICAgICAgIGNvbnN0IHsgbG9jYWxBZGRyZXNzLCBsb2NhbFBvcnQsIHJlbW90ZUFkZHJlc3MsIHJlbW90ZVBvcnQgfSA9IHNvY2tldDtcbiAgICAgICAgb2xkQXR0cmlidXRlc1tzZW1jb252XzEuQVRUUl9ORVRfSE9TVF9JUF0gPSBsb2NhbEFkZHJlc3M7XG4gICAgICAgIG9sZEF0dHJpYnV0ZXNbc2VtY29udl8xLkFUVFJfTkVUX0hPU1RfUE9SVF0gPSBsb2NhbFBvcnQ7XG4gICAgICAgIG9sZEF0dHJpYnV0ZXNbc2VtY29udl8xLkFUVFJfTkVUX1BFRVJfSVBdID0gcmVtb3RlQWRkcmVzcztcbiAgICAgICAgb2xkQXR0cmlidXRlc1tzZW1jb252XzEuQVRUUl9ORVRfUEVFUl9QT1JUXSA9IHJlbW90ZVBvcnQ7XG4gICAgfVxuICAgIG9sZEF0dHJpYnV0ZXNbc2VtY29udl8xLkFUVFJfSFRUUF9TVEFUVVNfQ09ERV0gPSBzdGF0dXNDb2RlO1xuICAgIG9sZEF0dHJpYnV0ZXNbQXR0cmlidXRlTmFtZXNfMS5BdHRyaWJ1dGVOYW1lcy5IVFRQX1NUQVRVU19URVhUXSA9IChzdGF0dXNNZXNzYWdlIHx8ICcnKS50b1VwcGVyQ2FzZSgpO1xuICAgIGlmIChycGNNZXRhZGF0YT8udHlwZSA9PT0gY29yZV8xLlJQQ1R5cGUuSFRUUCAmJiBycGNNZXRhZGF0YS5yb3V0ZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIG9sZEF0dHJpYnV0ZXNbc2VtYW50aWNfY29udmVudGlvbnNfMS5BVFRSX0hUVFBfUk9VVEVdID0gcnBjTWV0YWRhdGEucm91dGU7XG4gICAgICAgIG5ld0F0dHJpYnV0ZXNbc2VtYW50aWNfY29udmVudGlvbnNfMS5BVFRSX0hUVFBfUk9VVEVdID0gcnBjTWV0YWRhdGEucm91dGU7XG4gICAgfVxuICAgIHN3aXRjaCAoc2VtY29udlN0YWJpbGl0eSkge1xuICAgICAgICBjYXNlIGluc3RydW1lbnRhdGlvbl8xLlNlbWNvbnZTdGFiaWxpdHkuU1RBQkxFOlxuICAgICAgICAgICAgcmV0dXJuIG5ld0F0dHJpYnV0ZXM7XG4gICAgICAgIGNhc2UgaW5zdHJ1bWVudGF0aW9uXzEuU2VtY29udlN0YWJpbGl0eS5PTEQ6XG4gICAgICAgICAgICByZXR1cm4gb2xkQXR0cmlidXRlcztcbiAgICB9XG4gICAgcmV0dXJuIE9iamVjdC5hc3NpZ24ob2xkQXR0cmlidXRlcywgbmV3QXR0cmlidXRlcyk7XG59O1xuZXhwb3J0cy5nZXRJbmNvbWluZ1JlcXVlc3RBdHRyaWJ1dGVzT25SZXNwb25zZSA9IGdldEluY29taW5nUmVxdWVzdEF0dHJpYnV0ZXNPblJlc3BvbnNlO1xuLyoqXG4gKiBSZXR1cm5zIGluY29taW5nIHJlcXVlc3QgTWV0cmljIGF0dHJpYnV0ZXMgc2NvcGVkIHRvIHRoZSByZXF1ZXN0IGRhdGFcbiAqIEBwYXJhbSB7QXR0cmlidXRlc30gc3BhbkF0dHJpYnV0ZXMgdGhlIHNwYW4gYXR0cmlidXRlc1xuICovXG5jb25zdCBnZXRJbmNvbWluZ1JlcXVlc3RNZXRyaWNBdHRyaWJ1dGVzT25SZXNwb25zZSA9IChzcGFuQXR0cmlidXRlcykgPT4ge1xuICAgIGNvbnN0IG1ldHJpY0F0dHJpYnV0ZXMgPSB7fTtcbiAgICBtZXRyaWNBdHRyaWJ1dGVzW3NlbWNvbnZfMS5BVFRSX0hUVFBfU1RBVFVTX0NPREVdID1cbiAgICAgICAgc3BhbkF0dHJpYnV0ZXNbc2VtY29udl8xLkFUVFJfSFRUUF9TVEFUVVNfQ09ERV07XG4gICAgbWV0cmljQXR0cmlidXRlc1tzZW1jb252XzEuQVRUUl9ORVRfSE9TVF9QT1JUXSA9IHNwYW5BdHRyaWJ1dGVzW3NlbWNvbnZfMS5BVFRSX05FVF9IT1NUX1BPUlRdO1xuICAgIGlmIChzcGFuQXR0cmlidXRlc1tzZW1hbnRpY19jb252ZW50aW9uc18xLkFUVFJfSFRUUF9ST1VURV0gIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBtZXRyaWNBdHRyaWJ1dGVzW3NlbWFudGljX2NvbnZlbnRpb25zXzEuQVRUUl9IVFRQX1JPVVRFXSA9IHNwYW5BdHRyaWJ1dGVzW3NlbWFudGljX2NvbnZlbnRpb25zXzEuQVRUUl9IVFRQX1JPVVRFXTtcbiAgICB9XG4gICAgcmV0dXJuIG1ldHJpY0F0dHJpYnV0ZXM7XG59O1xuZXhwb3J0cy5nZXRJbmNvbWluZ1JlcXVlc3RNZXRyaWNBdHRyaWJ1dGVzT25SZXNwb25zZSA9IGdldEluY29taW5nUmVxdWVzdE1ldHJpY0F0dHJpYnV0ZXNPblJlc3BvbnNlO1xuLyoqXG4gKiBSZXR1cm5zIGluY29taW5nIHN0YWJsZSByZXF1ZXN0IE1ldHJpYyBhdHRyaWJ1dGVzIHNjb3BlZCB0byB0aGUgcmVxdWVzdCBkYXRhXG4gKiBAcGFyYW0ge0F0dHJpYnV0ZXN9IHNwYW5BdHRyaWJ1dGVzIHRoZSBzcGFuIGF0dHJpYnV0ZXNcbiAqL1xuY29uc3QgZ2V0SW5jb21pbmdTdGFibGVSZXF1ZXN0TWV0cmljQXR0cmlidXRlc09uUmVzcG9uc2UgPSAoc3BhbkF0dHJpYnV0ZXMpID0+IHtcbiAgICBjb25zdCBtZXRyaWNBdHRyaWJ1dGVzID0ge307XG4gICAgaWYgKHNwYW5BdHRyaWJ1dGVzW3NlbWFudGljX2NvbnZlbnRpb25zXzEuQVRUUl9IVFRQX1JPVVRFXSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIG1ldHJpY0F0dHJpYnV0ZXNbc2VtYW50aWNfY29udmVudGlvbnNfMS5BVFRSX0hUVFBfUk9VVEVdID0gc3BhbkF0dHJpYnV0ZXNbc2VtYW50aWNfY29udmVudGlvbnNfMS5BVFRSX0hUVFBfUk9VVEVdO1xuICAgIH1cbiAgICAvLyByZXF1aXJlZCBpZiBhbmQgb25seSBpZiBvbmUgd2FzIHNlbnQsIHNhbWUgYXMgc3BhbiByZXF1aXJlbWVudFxuICAgIGlmIChzcGFuQXR0cmlidXRlc1tzZW1hbnRpY19jb252ZW50aW9uc18xLkFUVFJfSFRUUF9SRVNQT05TRV9TVEFUVVNfQ09ERV0pIHtcbiAgICAgICAgbWV0cmljQXR0cmlidXRlc1tzZW1hbnRpY19jb252ZW50aW9uc18xLkFUVFJfSFRUUF9SRVNQT05TRV9TVEFUVVNfQ09ERV0gPVxuICAgICAgICAgICAgc3BhbkF0dHJpYnV0ZXNbc2VtYW50aWNfY29udmVudGlvbnNfMS5BVFRSX0hUVFBfUkVTUE9OU0VfU1RBVFVTX0NPREVdO1xuICAgIH1cbiAgICByZXR1cm4gbWV0cmljQXR0cmlidXRlcztcbn07XG5leHBvcnRzLmdldEluY29taW5nU3RhYmxlUmVxdWVzdE1ldHJpY0F0dHJpYnV0ZXNPblJlc3BvbnNlID0gZ2V0SW5jb21pbmdTdGFibGVSZXF1ZXN0TWV0cmljQXR0cmlidXRlc09uUmVzcG9uc2U7XG5mdW5jdGlvbiBoZWFkZXJDYXB0dXJlKHR5cGUsIGhlYWRlcnMsIHNlbWNvbnZTdGFiaWxpdHkpIHtcbiAgICBjb25zdCBub3JtYWxpemVkSGVhZGVycyA9IG5ldyBNYXAoKTtcbiAgICBmb3IgKGxldCBpID0gMCwgbGVuID0gaGVhZGVycy5sZW5ndGg7IGkgPCBsZW47IGkrKykge1xuICAgICAgICBjb25zdCBjYXB0dXJlZEhlYWRlciA9IGhlYWRlcnNbaV0udG9Mb3dlckNhc2UoKTtcbiAgICAgICAgaWYgKHNlbWNvbnZTdGFiaWxpdHkgJiBpbnN0cnVtZW50YXRpb25fMS5TZW1jb252U3RhYmlsaXR5LlNUQUJMRSkge1xuICAgICAgICAgICAgbm9ybWFsaXplZEhlYWRlcnMuc2V0KGNhcHR1cmVkSGVhZGVyLCBjYXB0dXJlZEhlYWRlcik7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAvLyBJbiBvbGQgc2VtY29udiwgdGhlIGhlYWRlciBuYW1lIGNvbnZlcnRlZCBoeXBlbiB0byB1bmRlcnNjb3JlLCBlLmcuOlxuICAgICAgICAgICAgLy8gYGh0dHAucmVxdWVzdC5oZWFkZXIuY29udGVudF9sZW5ndGhgLlxuICAgICAgICAgICAgbm9ybWFsaXplZEhlYWRlcnMuc2V0KGNhcHR1cmVkSGVhZGVyLCBjYXB0dXJlZEhlYWRlci5yZXBsYWNlQWxsKCctJywgJ18nKSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIChnZXRIZWFkZXIpID0+IHtcbiAgICAgICAgY29uc3QgYXR0cmlidXRlcyA9IHt9O1xuICAgICAgICBmb3IgKGNvbnN0IGNhcHR1cmVkSGVhZGVyIG9mIG5vcm1hbGl6ZWRIZWFkZXJzLmtleXMoKSkge1xuICAgICAgICAgICAgY29uc3QgdmFsdWUgPSBnZXRIZWFkZXIoY2FwdHVyZWRIZWFkZXIpO1xuICAgICAgICAgICAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IG5vcm1hbGl6ZWRIZWFkZXIgPSBub3JtYWxpemVkSGVhZGVycy5nZXQoY2FwdHVyZWRIZWFkZXIpO1xuICAgICAgICAgICAgY29uc3Qga2V5ID0gYGh0dHAuJHt0eXBlfS5oZWFkZXIuJHtub3JtYWxpemVkSGVhZGVyfWA7XG4gICAgICAgICAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgICAgIGF0dHJpYnV0ZXNba2V5XSA9IFt2YWx1ZV07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChBcnJheS5pc0FycmF5KHZhbHVlKSkge1xuICAgICAgICAgICAgICAgIGF0dHJpYnV0ZXNba2V5XSA9IHZhbHVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgYXR0cmlidXRlc1trZXldID0gW3ZhbHVlXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gYXR0cmlidXRlcztcbiAgICB9O1xufVxuZXhwb3J0cy5oZWFkZXJDYXB0dXJlID0gaGVhZGVyQ2FwdHVyZTtcbmNvbnN0IEtOT1dOX01FVEhPRFMgPSBuZXcgU2V0KFtcbiAgICAvLyBtZXRob2RzIGZyb20gaHR0cHM6Ly93d3cucmZjLWVkaXRvci5vcmcvcmZjL3JmYzkxMTAuaHRtbCNuYW1lLW1ldGhvZHNcbiAgICAnR0VUJyxcbiAgICAnSEVBRCcsXG4gICAgJ1BPU1QnLFxuICAgICdQVVQnLFxuICAgICdERUxFVEUnLFxuICAgICdDT05ORUNUJyxcbiAgICAnT1BUSU9OUycsXG4gICAgJ1RSQUNFJyxcbiAgICAvLyBQQVRDSCBmcm9tIGh0dHBzOi8vd3d3LnJmYy1lZGl0b3Iub3JnL3JmYy9yZmM1Nzg5Lmh0bWxcbiAgICAnUEFUQ0gnLFxuICAgIC8vIFFVRVJZIGZyb20gaHR0cHM6Ly9kYXRhdHJhY2tlci5pZXRmLm9yZy9kb2MvZHJhZnQtaWV0Zi1odHRwYmlzLXNhZmUtbWV0aG9kLXctYm9keS9cbiAgICAnUVVFUlknLFxuXSk7XG5mdW5jdGlvbiBub3JtYWxpemVNZXRob2QobWV0aG9kKSB7XG4gICAgaWYgKG1ldGhvZCA9PSBudWxsKSB7XG4gICAgICAgIHJldHVybiAnR0VUJztcbiAgICB9XG4gICAgY29uc3QgdXBwZXIgPSBtZXRob2QudG9VcHBlckNhc2UoKTtcbiAgICBpZiAoS05PV05fTUVUSE9EUy5oYXModXBwZXIpKSB7XG4gICAgICAgIHJldHVybiB1cHBlcjtcbiAgICB9XG4gICAgcmV0dXJuICdfT1RIRVInO1xufVxuZnVuY3Rpb24gcGFyc2VGb3J3YXJkZWRIZWFkZXIoaGVhZGVyKSB7XG4gICAgdHJ5IHtcbiAgICAgICAgcmV0dXJuIGZvcndhcmRlZFBhcnNlKGhlYWRlcik7XG4gICAgfVxuICAgIGNhdGNoIHtcbiAgICAgICAgcmV0dXJuIFtdO1xuICAgIH1cbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXV0aWxzLmpzLm1hcCJdLCJuYW1lcyI6W10sImlnbm9yZUxpc3QiOlswXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///(ssr)/./node_modules/.pnpm/@opentelemetry+instrumentation-http@0.214.0_@opentelemetry+api@1.9.1/node_modules/@opentelemetry/instrumentation-http/build/src/utils.js\n");
|
|
|
|
/***/ }),
|
|
|
|
/***/ "(ssr)/./node_modules/.pnpm/@opentelemetry+instrumentation-http@0.214.0_@opentelemetry+api@1.9.1/node_modules/@opentelemetry/instrumentation-http/build/src/version.js":
|
|
/*!***********************************************************************************************************************************************************************!*\
|
|
!*** ./node_modules/.pnpm/@opentelemetry+instrumentation-http@0.214.0_@opentelemetry+api@1.9.1/node_modules/@opentelemetry/instrumentation-http/build/src/version.js ***!
|
|
\***********************************************************************************************************************************************************************/
|
|
/***/ ((__unused_webpack_module, exports) => {
|
|
|
|
eval("\n/*\n * Copyright The OpenTelemetry Authors\n * SPDX-License-Identifier: Apache-2.0\n */\nObject.defineProperty(exports, \"__esModule\", ({ value: true }));\nexports.VERSION = void 0;\n// this is autogenerated file, see scripts/version-update.js\nexports.VERSION = '0.214.0';\n//# sourceMappingURL=version.js.map//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKHNzcikvLi9ub2RlX21vZHVsZXMvLnBucG0vQG9wZW50ZWxlbWV0cnkraW5zdHJ1bWVudGF0aW9uLWh0dHBAMC4yMTQuMF9Ab3BlbnRlbGVtZXRyeSthcGlAMS45LjEvbm9kZV9tb2R1bGVzL0BvcGVudGVsZW1ldHJ5L2luc3RydW1lbnRhdGlvbi1odHRwL2J1aWxkL3NyYy92ZXJzaW9uLmpzIiwibWFwcGluZ3MiOiJBQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQSw4Q0FBNkMsRUFBRSxhQUFhLEVBQUM7QUFDN0QsZUFBZTtBQUNmO0FBQ0EsZUFBZTtBQUNmIiwic291cmNlcyI6WyIvVXNlcnMvbWFyY21pbnRlbC9Qcm9qZWN0cy9lLXRpYi5jb20vbm9kZV9tb2R1bGVzLy5wbnBtL0BvcGVudGVsZW1ldHJ5K2luc3RydW1lbnRhdGlvbi1odHRwQDAuMjE0LjBfQG9wZW50ZWxlbWV0cnkrYXBpQDEuOS4xL25vZGVfbW9kdWxlcy9Ab3BlbnRlbGVtZXRyeS9pbnN0cnVtZW50YXRpb24taHR0cC9idWlsZC9zcmMvdmVyc2lvbi5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyJcInVzZSBzdHJpY3RcIjtcbi8qXG4gKiBDb3B5cmlnaHQgVGhlIE9wZW5UZWxlbWV0cnkgQXV0aG9yc1xuICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjBcbiAqL1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5WRVJTSU9OID0gdm9pZCAwO1xuLy8gdGhpcyBpcyBhdXRvZ2VuZXJhdGVkIGZpbGUsIHNlZSBzY3JpcHRzL3ZlcnNpb24tdXBkYXRlLmpzXG5leHBvcnRzLlZFUlNJT04gPSAnMC4yMTQuMCc7XG4vLyMgc291cmNlTWFwcGluZ1VSTD12ZXJzaW9uLmpzLm1hcCJdLCJuYW1lcyI6W10sImlnbm9yZUxpc3QiOlswXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///(ssr)/./node_modules/.pnpm/@opentelemetry+instrumentation-http@0.214.0_@opentelemetry+api@1.9.1/node_modules/@opentelemetry/instrumentation-http/build/src/version.js\n");
|
|
|
|
/***/ })
|
|
|
|
};
|
|
; |