vite-plugin-react-server 1.4.2 → 1.4.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +48 -313
- package/dist/package.json +123 -13
- package/dist/plugin/bundle/deferredStaticGeneration.js +14 -39
- package/dist/plugin/bundle/manifests.js +30 -48
- package/dist/plugin/config/autoDiscover/resolveAutoDiscover.d.ts.map +1 -1
- package/dist/plugin/config/autoDiscover/resolveAutoDiscover.js +4 -1
- package/dist/plugin/config/envPrefixFromConfig.js +12 -7
- package/dist/plugin/config/getCondition.d.ts.map +1 -1
- package/dist/plugin/config/getCondition.js +7 -5
- package/dist/plugin/dev-server/virtualRscHmrPlugin.js +23 -23
- package/dist/plugin/environments/createBuildEventPlugin.js +88 -98
- package/dist/plugin/environments/createEnvironmentPlugin.js +222 -250
- package/dist/plugin/helpers/createRscRenderHelpers.js +33 -34
- package/dist/plugin/helpers/createSharedLoader.d.ts.map +1 -1
- package/dist/plugin/helpers/createSharedLoader.js +4 -2
- package/dist/plugin/helpers/headlessStreamReuseHandler.js +30 -22
- package/dist/plugin/helpers/headlessStreamState.js +15 -28
- package/dist/plugin/helpers/resolveComponent.d.ts.map +1 -1
- package/dist/plugin/helpers/resolveComponent.js +4 -2
- package/dist/plugin/index.client.d.ts +5 -0
- package/dist/plugin/index.client.d.ts.map +1 -0
- package/dist/plugin/index.client.js +4 -0
- package/dist/plugin/index.d.ts +4 -3
- package/dist/plugin/index.d.ts.map +1 -1
- package/dist/plugin/index.js +10 -5
- package/dist/plugin/index.server.d.ts +5 -0
- package/dist/plugin/index.server.d.ts.map +1 -0
- package/dist/plugin/index.server.js +4 -0
- package/dist/plugin/metrics/createWorkerStartupMetrics.js +31 -13
- package/dist/plugin/orchestrator/createPluginOrchestrator.client.js +41 -38
- package/dist/plugin/orchestrator/createPluginOrchestrator.server.js +43 -46
- package/dist/plugin/plugin.client.js +2 -2
- package/dist/plugin/plugin.server.js +2 -2
- package/dist/plugin/react-static/createBuildLoader.client.js +12 -6
- package/dist/plugin/react-static/createBuildLoader.server.js +255 -235
- package/dist/plugin/react-static/plugin.client.js +684 -770
- package/dist/plugin/react-static/plugin.server.js +517 -603
- package/dist/plugin/react-static/processCssFilesForPages.js +103 -88
- package/dist/plugin/react-static/renderPage.client.js +455 -529
- package/dist/plugin/react-static/renderPage.server.js +485 -508
- package/dist/plugin/react-static/renderPagesBatched.js +277 -275
- package/dist/plugin/react-static/rscToHtmlStream.client.js +48 -29
- package/dist/plugin/react-static/rscToHtmlStream.server.js +62 -37
- package/dist/plugin/react-static/temporaryReferences.server.js +11 -2
- package/dist/plugin/stream/createMainThreadHandlers.js +40 -31
- package/dist/plugin/stream/renderRscStream.server.d.ts.map +1 -1
- package/dist/plugin/stream/renderRscStream.server.js +127 -144
- package/dist/plugin/transformer/createTransformerPlugin.js +226 -265
- package/dist/plugin/utils/checkReactVersion.d.ts +7 -0
- package/dist/plugin/utils/checkReactVersion.d.ts.map +1 -0
- package/dist/plugin/utils/checkReactVersion.js +23 -0
- package/dist/plugin/utils/envUrls.node.js +12 -11
- package/dist/plugin/vendor/vendor-alias.js +84 -114
- package/dist/plugin/vendor/vendor.client.d.ts.map +1 -1
- package/dist/plugin/vendor/vendor.client.js +1 -3
- package/dist/plugin/worker/rsc/handleRscRender.d.ts.map +1 -1
- package/dist/plugin/worker/rsc/handleRscRender.js +3 -1
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/package.json +123 -13
- package/plugin/config/autoDiscover/resolveAutoDiscover.ts +4 -0
- package/plugin/config/getCondition.ts +6 -4
- package/plugin/helpers/createRscRenderHelpers.ts +1 -1
- package/plugin/helpers/createSharedLoader.ts +6 -1
- package/plugin/helpers/resolveComponent.ts +6 -1
- package/plugin/index.client.ts +4 -0
- package/plugin/index.server.ts +4 -0
- package/plugin/index.ts +12 -5
- package/plugin/plugin.client.ts +1 -1
- package/plugin/plugin.server.ts +1 -1
- package/plugin/stream/renderRscStream.server.ts +3 -0
- package/plugin/utils/checkReactVersion.ts +28 -0
- package/plugin/vendor/vendor.client.ts +0 -2
- package/plugin/worker/rsc/handleRscRender.ts +2 -0
- package/scripts/generate-toc.mjs +27 -294
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
* MIT License
|
|
5
5
|
*/
|
|
6
6
|
import { assertReactServer } from './config/getCondition.js';
|
|
7
|
-
import { createPluginOrchestrator } from './orchestrator/createPluginOrchestrator.js';
|
|
7
|
+
import { createPluginOrchestrator } from './orchestrator/createPluginOrchestrator.server.js';
|
|
8
8
|
|
|
9
9
|
assertReactServer();
|
|
10
10
|
const vitePluginReactServer = function _vitePluginReactServer(options, strategy) {
|
|
@@ -28,4 +28,4 @@ const vitePluginReactServer = function _vitePluginReactServer(options, strategy)
|
|
|
28
28
|
};
|
|
29
29
|
|
|
30
30
|
export { vitePluginReactServer };
|
|
31
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,
|
|
31
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGx1Z2luLnNlcnZlci5qcyIsInNvdXJjZXMiOlsiLi4vLi4vcGx1Z2luL3BsdWdpbi5zZXJ2ZXIudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgeyBWaXRlUGx1Z2luTWFpbkZuIH0gZnJvbSBcIi4vdHlwZXMuanNcIjtcbmltcG9ydCB0eXBlIHsgVXNlck9wdGlvbnMsIFN0cmF0ZWd5IH0gZnJvbSBcIi4vb3JjaGVzdHJhdG9yL3R5cGVzLmpzXCI7XG5cbmltcG9ydCB7IGFzc2VydFJlYWN0U2VydmVyIH0gZnJvbSBcIi4vY29uZmlnL2dldENvbmRpdGlvbi5qc1wiO1xuaW1wb3J0IHsgY3JlYXRlUGx1Z2luT3JjaGVzdHJhdG9yIH0gZnJvbSBcIi4vb3JjaGVzdHJhdG9yL2NyZWF0ZVBsdWdpbk9yY2hlc3RyYXRvci5zZXJ2ZXIuanNcIjtcblxuYXNzZXJ0UmVhY3RTZXJ2ZXIoKTtcblxuLyoqXG4gKiBNYWluIGVudHJ5cG9pbnQgZm9yIFJlYWN0IFNlcnZlciBDb21wb25lbnRzLlxuICpcbiAqIFRoaXMgcGx1Z2luIHVzZXMgdGhlIGludGVsbGlnZW50IG9yY2hlc3RyYXRvciB0byBhZGFwdCBpdHMgYmVoYXZpb3IgYmFzZWQgb24gdGhlIGJ1aWxkIGNvbnRleHQ6XG4gKiAtIEluIEVudmlyb25tZW50IEFQSSBidWlsZHM6IGxldmVyYWdlcyBmdWxsIFJTQyBjYXBhYmlsaXRpZXNcbiAqIC0gV2l0aCBzdGF0aWMgcGFnZXM6IGFkZHMgc3RhdGljIGdlbmVyYXRpb24gcGx1Z2luIHdoZW4gYXBwcm9wcmlhdGVcbiAqXG4gKiBVc2UgdGhpcyBmb3Igc2VydmVyLXNpZGUgcmVuZGVyaW5nIGFuZCBzdGF0aWMgZ2VuZXJhdGlvbiB3aXRoIGZ1bGwgUlNDIHN1cHBvcnQuXG4gKiBDb25maWd1cmUgdGhlIGJ1aWxkIHRhcmdldCB0aHJvdWdoIHRoZSBzdHJhdGVneSBwYXJhbWV0ZXIuXG4gKiBAcGFyYW0gb3B0aW9uc1xuICogQHBhcmFtIHN0cmF0ZWd5XG4gKiBAcmV0dXJuc1xuICovXG5leHBvcnQgY29uc3Qgdml0ZVBsdWdpblJlYWN0U2VydmVyOiBWaXRlUGx1Z2luTWFpbkZuID1cbiAgZnVuY3Rpb24gX3ZpdGVQbHVnaW5SZWFjdFNlcnZlcihvcHRpb25zLCBzdHJhdGVneT86IFN0cmF0ZWd5KSB7XG4gICAgaWYgKG9wdGlvbnMgPT0gbnVsbCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwib3B0aW9ucyBpcyByZXF1aXJlZFwiKTtcbiAgICB9XG5cblxuICAgIC8vIFVzZSB0aGUgaW50ZWxsaWdlbnQgb3JjaGVzdHJhdG9yIGZvciBwbHVnaW4gY29tcG9zaXRpb24gd2l0aCBzZXJ2ZXIgY29udGV4dFxuICAgIGNvbnN0IHVzZXJTdHJhdGVneSA9IChvcHRpb25zIGFzIFVzZXJPcHRpb25zKS5zdHJhdGVneSB8fCB7fTtcbiAgICBjb25zdCBmaW5hbFN0cmF0ZWd5OiBTdHJhdGVneSA9IHtcbiAgICAgIG1vZGU6IFwiYXV0b1wiLCAvLyBTZXJ2ZXIgYnVpbGRzXG4gICAgICBpbXBvcnRDb250ZXh0OiBcInJlYWN0LXNlcnZlclwiLCAvLyBJbmRpY2F0ZSB0aGlzIGNhbWUgZnJvbSBzZXJ2ZXIgY29udGV4dFxuICAgICAgZW52aXJvbm1lbnRUYXJnZXRzOiBuZXcgTWFwKFtbXCJjbGllbnRcIiwgXCJjbGllbnRcIl0sIFtcInNzclwiLCBcInNzclwiXSwgW1wic2VydmVyXCIsIFwic2VydmVyXCJdXSksIFxuICAgICAgLi4udXNlclN0cmF0ZWd5LFxuICAgICAgLi4uc3RyYXRlZ3lcbiAgICB9O1xuICAgIFxuXG4gICAgcmV0dXJuIGNyZWF0ZVBsdWdpbk9yY2hlc3RyYXRvcih7XG4gICAgICAuLi5vcHRpb25zLFxuICAgICAgc3RyYXRlZ3k6IGZpbmFsU3RyYXRlZ3lcbiAgICB9KTtcbiAgfTtcblxuIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7O0FBTUEsaUJBQWtCLEVBQUE7QUFlWCxNQUFNLHFCQUNYLEdBQUEsU0FBUyxzQkFBdUIsQ0FBQSxPQUFBLEVBQVMsUUFBcUIsRUFBQTtBQUM1RCxFQUFBLElBQUksV0FBVyxJQUFNLEVBQUE7QUFDbkIsSUFBTSxNQUFBLElBQUksTUFBTSxxQkFBcUIsQ0FBQTtBQUFBO0FBS3ZDLEVBQU0sTUFBQSxZQUFBLEdBQWdCLE9BQXdCLENBQUEsUUFBQSxJQUFZLEVBQUM7QUFDM0QsRUFBQSxNQUFNLGFBQTBCLEdBQUE7QUFBQSxJQUM5QixJQUFNLEVBQUEsTUFBQTtBQUFBO0FBQUEsSUFDTixhQUFlLEVBQUEsY0FBQTtBQUFBO0FBQUEsSUFDZixvQ0FBd0IsSUFBQSxHQUFBLENBQUksQ0FBQyxDQUFDLFVBQVUsUUFBUSxDQUFBLEVBQUcsQ0FBQyxLQUFBLEVBQU8sS0FBSyxDQUFHLEVBQUEsQ0FBQyxRQUFVLEVBQUEsUUFBUSxDQUFDLENBQUMsQ0FBQTtBQUFBLElBQ3hGLEdBQUcsWUFBQTtBQUFBLElBQ0gsR0FBRztBQUFBLEdBQ0w7QUFHQSxFQUFBLE9BQU8sd0JBQXlCLENBQUE7QUFBQSxJQUM5QixHQUFHLE9BQUE7QUFBQSxJQUNILFFBQVUsRUFBQTtBQUFBLEdBQ1gsQ0FBQTtBQUNIOzs7OyJ9
|
|
@@ -1,7 +1,13 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
1
|
+
/**
|
|
2
|
+
* vite-plugin-react-server
|
|
3
|
+
* Copyright (c) Nico Brinkkemper
|
|
4
|
+
* MIT License
|
|
5
|
+
*/
|
|
6
|
+
function createBuildLoader() {
|
|
7
|
+
return async function buildLoader(_id) {
|
|
8
|
+
throw new Error("createBuildLoader is called from the client, but it is only available on the server.");
|
|
9
|
+
};
|
|
7
10
|
}
|
|
11
|
+
|
|
12
|
+
export { createBuildLoader };
|
|
13
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3JlYXRlQnVpbGRMb2FkZXIuY2xpZW50LmpzIiwic291cmNlcyI6WyIuLi8uLi8uLi9wbHVnaW4vcmVhY3Qtc3RhdGljL2NyZWF0ZUJ1aWxkTG9hZGVyLmNsaWVudC50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgZnVuY3Rpb24gY3JlYXRlQnVpbGRMb2FkZXIoKSB7XG4gICAgLy8gSW4gY2xpZW50LXN0YXRpYywgdGhlIFJTQyB3b3JrZXIgaGFuZGxlcyBhbGwgbW9kdWxlIGxvYWRpbmdcbiAgICAvLyBUaGUgbWFpbiB0aHJlYWQgZG9lc24ndCBuZWVkIHRvIGxvYWQgbW9kdWxlcyBkaXJlY3RseVxuICAgIHJldHVybiBhc3luYyBmdW5jdGlvbiBidWlsZExvYWRlcihfaWQ6IHN0cmluZykge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJjcmVhdGVCdWlsZExvYWRlciBpcyBjYWxsZWQgZnJvbSB0aGUgY2xpZW50LCBidXQgaXQgaXMgb25seSBhdmFpbGFibGUgb24gdGhlIHNlcnZlci5cIik7XG4gICAgfTtcbn0gICAiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBTyxTQUFTLGlCQUFvQixHQUFBO0FBR2hDLEVBQU8sT0FBQSxlQUFlLFlBQVksR0FBYSxFQUFBO0FBQzNDLElBQU0sTUFBQSxJQUFJLE1BQU0sc0ZBQXNGLENBQUE7QUFBQSxHQUMxRztBQUNKOzs7OyJ9
|
|
@@ -1,253 +1,273 @@
|
|
|
1
|
-
import { join, resolve } from "node:path";
|
|
2
|
-
import { pathToFileURL } from "node:url";
|
|
3
|
-
import { getModuleRef } from "../helpers/moduleRefs.js";
|
|
4
|
-
import { toError } from "../error/toError.js";
|
|
5
|
-
import { handleError } from "../error/handleError.js";
|
|
6
|
-
import { createSharedLoader } from "../helpers/createSharedLoader.js";
|
|
7
|
-
import { resolveVirtualAndNodeModules } from "../helpers/resolveVirtualAndNodeModules.js";
|
|
8
|
-
import { createLogger } from "vite";
|
|
9
1
|
/**
|
|
10
|
-
*
|
|
11
|
-
*
|
|
12
|
-
*
|
|
13
|
-
* - For inline modules: Handle them using bundle
|
|
2
|
+
* vite-plugin-react-server
|
|
3
|
+
* Copyright (c) Nico Brinkkemper
|
|
4
|
+
* MIT License
|
|
14
5
|
*/
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
6
|
+
import { join, resolve } from 'node:path';
|
|
7
|
+
import { pathToFileURL } from 'node:url';
|
|
8
|
+
import { getModuleRef } from '../helpers/moduleRefs.js';
|
|
9
|
+
import { toError } from '../error/toError.js';
|
|
10
|
+
import { handleError } from '../error/handleError.js';
|
|
11
|
+
import { createSharedLoader } from '../helpers/createSharedLoader.js';
|
|
12
|
+
import { resolveVirtualAndNodeModules } from '../helpers/resolveVirtualAndNodeModules.js';
|
|
13
|
+
import { createLogger } from 'vite';
|
|
14
|
+
|
|
15
|
+
const createBuildLoader = function _createBuildLoader({ userOptions, serverManifest, staticManifest }, bundle, temporaryReferences, logger = createLogger()) {
|
|
16
|
+
const manifestKeys = Object.keys(serverManifest);
|
|
17
|
+
if (!manifestKeys.length) {
|
|
18
|
+
throw new Error("Server manifest is empty");
|
|
19
|
+
}
|
|
20
|
+
return async function buildLoader(id) {
|
|
21
|
+
if (userOptions.verbose) {
|
|
22
|
+
logger.info(`[buildLoader] id: ${id}`);
|
|
23
|
+
logger.info(`[buildLoader] Starting lookup for: ${id}`);
|
|
19
24
|
}
|
|
20
|
-
|
|
25
|
+
const [withoutQuery, query] = id.split("?", 2);
|
|
26
|
+
const [moduleId, exportName] = withoutQuery.split("#", 2);
|
|
27
|
+
const [normalizedKey, normalizedValue] = userOptions.normalizer(moduleId);
|
|
28
|
+
const virtualOrNodeModule = await resolveVirtualAndNodeModules(
|
|
29
|
+
moduleId,
|
|
30
|
+
exportName,
|
|
31
|
+
userOptions.verbose,
|
|
32
|
+
logger
|
|
33
|
+
);
|
|
34
|
+
if (virtualOrNodeModule !== null) {
|
|
35
|
+
return virtualOrNodeModule;
|
|
36
|
+
}
|
|
37
|
+
const moduleRef = getModuleRef(id);
|
|
38
|
+
if (temporaryReferences?.has(moduleRef)) {
|
|
39
|
+
const mod = temporaryReferences.get(moduleRef);
|
|
40
|
+
if (typeof mod === "object" && mod !== null && "error" in mod) ; else {
|
|
41
|
+
return mod;
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
try {
|
|
45
|
+
if (query === "inline") {
|
|
46
|
+
const manifestKey = normalizedValue;
|
|
21
47
|
if (userOptions.verbose) {
|
|
22
|
-
|
|
23
|
-
|
|
48
|
+
logger.info(
|
|
49
|
+
`[buildLoader] Looking for inline module: ${normalizedValue}`
|
|
50
|
+
);
|
|
24
51
|
}
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
}
|
|
43
|
-
else {
|
|
44
|
-
return mod;
|
|
52
|
+
let resolvedValue = normalizedValue;
|
|
53
|
+
if (normalizedValue.startsWith("assets/") && normalizedValue.endsWith(".css")) {
|
|
54
|
+
const basePath = normalizedValue.replace(
|
|
55
|
+
/-[a-zA-Z0-9]+\.css$/,
|
|
56
|
+
".css"
|
|
57
|
+
);
|
|
58
|
+
if (userOptions.verbose) {
|
|
59
|
+
logger.info(
|
|
60
|
+
`[buildLoader] CSS file detected, trying to resolve ${normalizedValue} to ${basePath}`
|
|
61
|
+
);
|
|
62
|
+
}
|
|
63
|
+
if (bundle[basePath]) {
|
|
64
|
+
resolvedValue = basePath;
|
|
65
|
+
if (userOptions.verbose) {
|
|
66
|
+
logger.info(
|
|
67
|
+
`[buildLoader] Resolved CSS file to: ${resolvedValue}`
|
|
68
|
+
);
|
|
45
69
|
}
|
|
70
|
+
}
|
|
46
71
|
}
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
72
|
+
if (userOptions.verbose) {
|
|
73
|
+
logger.info(
|
|
74
|
+
`[buildLoader] Trying bundle[moduleId]: bundle["${moduleId}"] = ${!!bundle[moduleId]}`
|
|
75
|
+
);
|
|
76
|
+
logger.info(
|
|
77
|
+
`[buildLoader] Trying bundle[normalizedValue]: bundle["${normalizedValue}"] = ${!!bundle[normalizedValue]}`
|
|
78
|
+
);
|
|
79
|
+
logger.info(
|
|
80
|
+
`[buildLoader] Trying bundle[resolvedValue]: bundle["${resolvedValue}"] = ${!!bundle[resolvedValue]}`
|
|
81
|
+
);
|
|
82
|
+
}
|
|
83
|
+
const serverChunk = bundle[moduleId] ?? bundle[normalizedValue] ?? bundle[resolvedValue] ?? bundle[serverManifest[manifestKey]?.file] ?? bundle[staticManifest[manifestKey]?.file] ?? bundle[serverManifest[normalizedKey]?.file] ?? bundle[staticManifest[normalizedKey]?.file] ?? Object.entries(bundle).find(
|
|
84
|
+
([, value]) => value.name === normalizedValue
|
|
85
|
+
)?.[1];
|
|
86
|
+
if (userOptions.verbose && serverChunk) {
|
|
87
|
+
logger.info(`[buildLoader] Found serverChunk: ${serverChunk.type}`);
|
|
88
|
+
}
|
|
89
|
+
if (serverChunk) {
|
|
90
|
+
if (serverChunk.type === "asset") {
|
|
91
|
+
if (userOptions.autoDiscover.jsonPattern.test(normalizedValue)) {
|
|
92
|
+
const jsonContent = serverChunk.source;
|
|
93
|
+
if (typeof jsonContent === "string") {
|
|
51
94
|
if (userOptions.verbose) {
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
let resolvedValue = normalizedValue;
|
|
56
|
-
if (normalizedValue.startsWith("assets/") &&
|
|
57
|
-
normalizedValue.endsWith(".css")) {
|
|
58
|
-
// Extract the base path without hash
|
|
59
|
-
const basePath = normalizedValue.replace(/-[a-zA-Z0-9]+\.css$/, ".css");
|
|
60
|
-
if (userOptions.verbose) {
|
|
61
|
-
logger.info(`[buildLoader] CSS file detected, trying to resolve ${normalizedValue} to ${basePath}`);
|
|
62
|
-
}
|
|
63
|
-
// Try the base path first
|
|
64
|
-
if (bundle[basePath]) {
|
|
65
|
-
resolvedValue = basePath;
|
|
66
|
-
if (userOptions.verbose) {
|
|
67
|
-
logger.info(`[buildLoader] Resolved CSS file to: ${resolvedValue}`);
|
|
68
|
-
}
|
|
69
|
-
}
|
|
95
|
+
logger.info(
|
|
96
|
+
`[buildLoader] Returning JSON content for: ${normalizedValue}`
|
|
97
|
+
);
|
|
70
98
|
}
|
|
71
|
-
|
|
99
|
+
return { default: JSON.parse(jsonContent) };
|
|
100
|
+
}
|
|
101
|
+
} else if (userOptions.autoDiscover.cssPattern.test(normalizedValue)) {
|
|
102
|
+
const cssContent = serverChunk.source;
|
|
103
|
+
if (typeof cssContent === "string") {
|
|
72
104
|
if (userOptions.verbose) {
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
}
|
|
77
|
-
const serverChunk = bundle[moduleId] ??
|
|
78
|
-
bundle[normalizedValue] ??
|
|
79
|
-
bundle[resolvedValue] ??
|
|
80
|
-
bundle[serverManifest[manifestKey]?.file] ??
|
|
81
|
-
bundle[staticManifest[manifestKey]?.file] ??
|
|
82
|
-
bundle[serverManifest[normalizedKey]?.file] ??
|
|
83
|
-
bundle[staticManifest[normalizedKey]?.file] ??
|
|
84
|
-
Object.entries(bundle).find(([, value]) => value.name === normalizedValue)?.[1];
|
|
85
|
-
if (userOptions.verbose && serverChunk) {
|
|
86
|
-
logger.info(`[buildLoader] Found serverChunk: ${serverChunk.type}`);
|
|
87
|
-
}
|
|
88
|
-
if (serverChunk) {
|
|
89
|
-
if (serverChunk.type === "asset") {
|
|
90
|
-
// For CSS files, ensure we're in the React Server environment
|
|
91
|
-
if (userOptions.autoDiscover.jsonPattern.test(normalizedValue)) {
|
|
92
|
-
const jsonContent = serverChunk.source;
|
|
93
|
-
if (typeof jsonContent === "string") {
|
|
94
|
-
if (userOptions.verbose) {
|
|
95
|
-
logger.info(`[buildLoader] Returning JSON content for: ${normalizedValue}`);
|
|
96
|
-
}
|
|
97
|
-
return { default: JSON.parse(jsonContent) };
|
|
98
|
-
}
|
|
99
|
-
}
|
|
100
|
-
else if (userOptions.autoDiscover.cssPattern.test(normalizedValue)) {
|
|
101
|
-
const cssContent = serverChunk.source;
|
|
102
|
-
if (typeof cssContent === "string") {
|
|
103
|
-
if (userOptions.verbose) {
|
|
104
|
-
logger.info(`[buildLoader] Returning CSS content for: ${normalizedValue}, length: ${cssContent.length}`);
|
|
105
|
-
}
|
|
106
|
-
return { default: cssContent };
|
|
107
|
-
}
|
|
108
|
-
else {
|
|
109
|
-
if (userOptions.verbose) {
|
|
110
|
-
logger.info(`[buildLoader] CSS source is not string: ${typeof cssContent}`);
|
|
111
|
-
}
|
|
112
|
-
}
|
|
113
|
-
}
|
|
114
|
-
if (userOptions.verbose) {
|
|
115
|
-
logger.info(`[buildLoader] Returning default asset source for: ${normalizedValue}`);
|
|
116
|
-
}
|
|
117
|
-
return { default: serverChunk.source };
|
|
118
|
-
}
|
|
119
|
-
else if ("code" in serverChunk) {
|
|
120
|
-
if (userOptions.verbose) {
|
|
121
|
-
logger.info(`[buildLoader] Returning code for: ${normalizedValue}`);
|
|
122
|
-
}
|
|
123
|
-
return { default: serverChunk.code };
|
|
124
|
-
}
|
|
125
|
-
}
|
|
126
|
-
const panicError = handleError({
|
|
127
|
-
error: new Error(`Could not find inline module for: ${normalizedValue}`),
|
|
128
|
-
logger,
|
|
129
|
-
log: true,
|
|
130
|
-
panicThreshold: userOptions.panicThreshold,
|
|
131
|
-
context: "Build Loader Error (inline)",
|
|
132
|
-
});
|
|
133
|
-
if (panicError != null) {
|
|
134
|
-
throw panicError;
|
|
135
|
-
}
|
|
136
|
-
return null;
|
|
137
|
-
}
|
|
138
|
-
// check the bundle manifest for a direct match
|
|
139
|
-
const bundleEntry = bundle[withoutQuery];
|
|
140
|
-
if (bundleEntry) {
|
|
141
|
-
try {
|
|
142
|
-
const filePath = join(userOptions.projectRoot, userOptions.build.outDir, userOptions.build.server, withoutQuery);
|
|
143
|
-
const fileUrl = pathToFileURL(filePath).href;
|
|
144
|
-
const module = await import(fileUrl);
|
|
145
|
-
temporaryReferences?.set(moduleRef, module);
|
|
146
|
-
return module;
|
|
147
|
-
}
|
|
148
|
-
catch (error) {
|
|
149
|
-
const panicError = handleError({
|
|
150
|
-
error: error,
|
|
151
|
-
logger,
|
|
152
|
-
panicThreshold: userOptions.panicThreshold,
|
|
153
|
-
context: "Build Loader Error (bundle)",
|
|
154
|
-
});
|
|
155
|
-
temporaryReferences?.delete(moduleRef);
|
|
156
|
-
if (panicError != null) {
|
|
157
|
-
throw panicError;
|
|
158
|
-
}
|
|
159
|
-
}
|
|
160
|
-
}
|
|
161
|
-
// For static assets, use static manifest
|
|
162
|
-
const staticEntry = staticManifest[normalizedValue];
|
|
163
|
-
if (staticEntry) {
|
|
164
|
-
try {
|
|
165
|
-
const filePath = join(userOptions.projectRoot, userOptions.build.outDir, userOptions.build.static, staticEntry.file);
|
|
166
|
-
const fileUrl = pathToFileURL(filePath).href;
|
|
167
|
-
const module = await import(fileUrl);
|
|
168
|
-
temporaryReferences?.set(moduleRef, module);
|
|
169
|
-
// If we have an export name, make sure it's a key
|
|
170
|
-
if (exportName && !(exportName in module)) {
|
|
171
|
-
throw new Error(`Export ${exportName} not found in module ${normalizedValue}`);
|
|
172
|
-
}
|
|
173
|
-
return module;
|
|
105
|
+
logger.info(
|
|
106
|
+
`[buildLoader] Returning CSS content for: ${normalizedValue}, length: ${cssContent.length}`
|
|
107
|
+
);
|
|
174
108
|
}
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
});
|
|
182
|
-
temporaryReferences?.delete(moduleRef);
|
|
183
|
-
if (panicError != null) {
|
|
184
|
-
throw panicError;
|
|
185
|
-
}
|
|
109
|
+
return { default: cssContent };
|
|
110
|
+
} else {
|
|
111
|
+
if (userOptions.verbose) {
|
|
112
|
+
logger.info(
|
|
113
|
+
`[buildLoader] CSS source is not string: ${typeof cssContent}`
|
|
114
|
+
);
|
|
186
115
|
}
|
|
116
|
+
}
|
|
187
117
|
}
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
moduleId,
|
|
193
|
-
exportName,
|
|
194
|
-
verbose: userOptions.verbose,
|
|
195
|
-
logger,
|
|
196
|
-
resolveVirtual: true,
|
|
197
|
-
manifest: serverManifest,
|
|
198
|
-
normalizer: userOptions.normalizer,
|
|
199
|
-
moduleBase: userOptions.moduleBase,
|
|
200
|
-
preserveModulesRoot: userOptions.build.preserveModulesRoot,
|
|
201
|
-
projectRoot: userOptions.projectRoot,
|
|
202
|
-
buildOutDir: userOptions.build.outDir,
|
|
203
|
-
buildServerDir: userOptions.build.server,
|
|
204
|
-
isBuildMode: true,
|
|
205
|
-
isServeMode: false,
|
|
206
|
-
effectiveProjectRoot: userOptions.projectRoot,
|
|
207
|
-
build: {
|
|
208
|
-
outDir: userOptions.build.outDir,
|
|
209
|
-
server: userOptions.build.server,
|
|
210
|
-
client: userOptions.build.client,
|
|
211
|
-
static: userOptions.build.static,
|
|
212
|
-
},
|
|
213
|
-
});
|
|
214
|
-
// Store in temporary references for caching
|
|
215
|
-
temporaryReferences?.set(moduleRef, module);
|
|
216
|
-
return module;
|
|
118
|
+
if (userOptions.verbose) {
|
|
119
|
+
logger.info(
|
|
120
|
+
`[buildLoader] Returning default asset source for: ${normalizedValue}`
|
|
121
|
+
);
|
|
217
122
|
}
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
context: "Build Loader Error (shared)",
|
|
225
|
-
});
|
|
226
|
-
temporaryReferences?.delete(moduleRef);
|
|
227
|
-
if (panicError != null) {
|
|
228
|
-
throw panicError;
|
|
229
|
-
}
|
|
123
|
+
return { default: serverChunk.source };
|
|
124
|
+
} else if ("code" in serverChunk) {
|
|
125
|
+
if (userOptions.verbose) {
|
|
126
|
+
logger.info(
|
|
127
|
+
`[buildLoader] Returning code for: ${normalizedValue}`
|
|
128
|
+
);
|
|
230
129
|
}
|
|
130
|
+
return { default: serverChunk.code };
|
|
131
|
+
}
|
|
231
132
|
}
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
throw enhancedError;
|
|
244
|
-
}
|
|
245
|
-
const emptyExports = {
|
|
246
|
-
error: enhancedError,
|
|
247
|
-
id: id,
|
|
248
|
-
};
|
|
249
|
-
temporaryReferences?.delete(moduleRef);
|
|
250
|
-
return emptyExports;
|
|
133
|
+
const panicError = handleError({
|
|
134
|
+
error: new Error(
|
|
135
|
+
`Could not find inline module for: ${normalizedValue}`
|
|
136
|
+
),
|
|
137
|
+
logger,
|
|
138
|
+
log: true,
|
|
139
|
+
panicThreshold: userOptions.panicThreshold,
|
|
140
|
+
context: "Build Loader Error (inline)"
|
|
141
|
+
});
|
|
142
|
+
if (panicError != null) {
|
|
143
|
+
throw panicError;
|
|
251
144
|
}
|
|
252
|
-
|
|
145
|
+
return null;
|
|
146
|
+
}
|
|
147
|
+
const bundleEntry = bundle[withoutQuery];
|
|
148
|
+
if (bundleEntry) {
|
|
149
|
+
try {
|
|
150
|
+
const filePath = join(
|
|
151
|
+
userOptions.projectRoot,
|
|
152
|
+
userOptions.build.outDir,
|
|
153
|
+
userOptions.build.server,
|
|
154
|
+
withoutQuery
|
|
155
|
+
);
|
|
156
|
+
const fileUrl = pathToFileURL(filePath).href;
|
|
157
|
+
const module = await import(fileUrl);
|
|
158
|
+
temporaryReferences?.set(moduleRef, module);
|
|
159
|
+
return module;
|
|
160
|
+
} catch (error) {
|
|
161
|
+
const panicError = handleError({
|
|
162
|
+
error,
|
|
163
|
+
logger,
|
|
164
|
+
panicThreshold: userOptions.panicThreshold,
|
|
165
|
+
context: "Build Loader Error (bundle)"
|
|
166
|
+
});
|
|
167
|
+
temporaryReferences?.delete(moduleRef);
|
|
168
|
+
if (panicError != null) {
|
|
169
|
+
throw panicError;
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
const staticEntry = staticManifest[normalizedValue];
|
|
174
|
+
if (staticEntry) {
|
|
175
|
+
try {
|
|
176
|
+
const filePath = join(
|
|
177
|
+
userOptions.projectRoot,
|
|
178
|
+
userOptions.build.outDir,
|
|
179
|
+
userOptions.build.static,
|
|
180
|
+
staticEntry.file
|
|
181
|
+
);
|
|
182
|
+
const fileUrl = pathToFileURL(filePath).href;
|
|
183
|
+
const module = await import(fileUrl);
|
|
184
|
+
temporaryReferences?.set(moduleRef, module);
|
|
185
|
+
if (exportName && !(exportName in module)) {
|
|
186
|
+
throw new Error(
|
|
187
|
+
`Export ${exportName} not found in module ${normalizedValue}`
|
|
188
|
+
);
|
|
189
|
+
}
|
|
190
|
+
return module;
|
|
191
|
+
} catch (error) {
|
|
192
|
+
const panicError = handleError({
|
|
193
|
+
error,
|
|
194
|
+
logger,
|
|
195
|
+
panicThreshold: userOptions.panicThreshold,
|
|
196
|
+
context: "Build Loader Error (static)"
|
|
197
|
+
});
|
|
198
|
+
temporaryReferences?.delete(moduleRef);
|
|
199
|
+
if (panicError != null) {
|
|
200
|
+
throw panicError;
|
|
201
|
+
}
|
|
202
|
+
}
|
|
203
|
+
}
|
|
204
|
+
try {
|
|
205
|
+
const module = await createSharedLoader({
|
|
206
|
+
moduleId,
|
|
207
|
+
exportName,
|
|
208
|
+
verbose: userOptions.verbose,
|
|
209
|
+
logger,
|
|
210
|
+
resolveVirtual: true,
|
|
211
|
+
manifest: serverManifest,
|
|
212
|
+
normalizer: userOptions.normalizer,
|
|
213
|
+
moduleBase: userOptions.moduleBase,
|
|
214
|
+
preserveModulesRoot: userOptions.build.preserveModulesRoot,
|
|
215
|
+
projectRoot: userOptions.projectRoot,
|
|
216
|
+
buildOutDir: userOptions.build.outDir,
|
|
217
|
+
buildServerDir: userOptions.build.server,
|
|
218
|
+
isBuildMode: true,
|
|
219
|
+
isServeMode: false,
|
|
220
|
+
effectiveProjectRoot: userOptions.projectRoot,
|
|
221
|
+
build: {
|
|
222
|
+
outDir: userOptions.build.outDir,
|
|
223
|
+
server: userOptions.build.server,
|
|
224
|
+
client: userOptions.build.client,
|
|
225
|
+
static: userOptions.build.static
|
|
226
|
+
}
|
|
227
|
+
});
|
|
228
|
+
temporaryReferences?.set(moduleRef, module);
|
|
229
|
+
return module;
|
|
230
|
+
} catch (error) {
|
|
231
|
+
const err = toError(error);
|
|
232
|
+
const panicError = handleError({
|
|
233
|
+
error: err,
|
|
234
|
+
logger,
|
|
235
|
+
panicThreshold: userOptions.panicThreshold,
|
|
236
|
+
context: "Build Loader Error (shared)"
|
|
237
|
+
});
|
|
238
|
+
temporaryReferences?.delete(moduleRef);
|
|
239
|
+
if (panicError != null) {
|
|
240
|
+
throw panicError;
|
|
241
|
+
}
|
|
242
|
+
}
|
|
243
|
+
} catch (error) {
|
|
244
|
+
let enhancedError = error instanceof Error ? error : new Error(String(error));
|
|
245
|
+
if (enhancedError.message.includes("React Server Writer cannot be used outside a react-server environment")) {
|
|
246
|
+
const filePath = resolve(
|
|
247
|
+
userOptions.projectRoot,
|
|
248
|
+
userOptions.build.outDir,
|
|
249
|
+
userOptions.build.server,
|
|
250
|
+
moduleId
|
|
251
|
+
);
|
|
252
|
+
enhancedError = new Error(
|
|
253
|
+
`${enhancedError.message}
|
|
254
|
+
→ Imported from: ${moduleId}
|
|
255
|
+
→ Export: ${exportName}
|
|
256
|
+
→ File path: ${filePath}
|
|
257
|
+
→ NODE_OPTIONS: ${process.env.NODE_OPTIONS || "not set"}
|
|
258
|
+
→ execArgv: ${process.execArgv.join(" ") || "not set"}`
|
|
259
|
+
);
|
|
260
|
+
throw enhancedError;
|
|
261
|
+
}
|
|
262
|
+
const emptyExports = {
|
|
263
|
+
error: enhancedError,
|
|
264
|
+
id
|
|
265
|
+
};
|
|
266
|
+
temporaryReferences?.delete(moduleRef);
|
|
267
|
+
return emptyExports;
|
|
268
|
+
}
|
|
269
|
+
};
|
|
253
270
|
};
|
|
271
|
+
|
|
272
|
+
export { createBuildLoader };
|
|
273
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3JlYXRlQnVpbGRMb2FkZXIuc2VydmVyLmpzIiwic291cmNlcyI6WyIuLi8uLi8uLi9wbHVnaW4vcmVhY3Qtc3RhdGljL2NyZWF0ZUJ1aWxkTG9hZGVyLnNlcnZlci50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBqb2luLCByZXNvbHZlIH0gZnJvbSBcIm5vZGU6cGF0aFwiO1xuaW1wb3J0IHsgcGF0aFRvRmlsZVVSTCB9IGZyb20gXCJub2RlOnVybFwiO1xuaW1wb3J0IHsgZ2V0TW9kdWxlUmVmIH0gZnJvbSBcIi4uL2hlbHBlcnMvbW9kdWxlUmVmcy5qc1wiO1xuaW1wb3J0IHsgdG9FcnJvciB9IGZyb20gXCIuLi9lcnJvci90b0Vycm9yLmpzXCI7XG5pbXBvcnQgeyBoYW5kbGVFcnJvciB9IGZyb20gXCIuLi9lcnJvci9oYW5kbGVFcnJvci5qc1wiO1xuaW1wb3J0IHsgY3JlYXRlU2hhcmVkTG9hZGVyIH0gZnJvbSBcIi4uL2hlbHBlcnMvY3JlYXRlU2hhcmVkTG9hZGVyLmpzXCI7XG5pbXBvcnQgeyByZXNvbHZlVmlydHVhbEFuZE5vZGVNb2R1bGVzIH0gZnJvbSBcIi4uL2hlbHBlcnMvcmVzb2x2ZVZpcnR1YWxBbmROb2RlTW9kdWxlcy5qc1wiO1xuXG5pbXBvcnQgdHlwZSB7IENyZWF0ZUJ1aWxkTG9hZGVyRm4gfSBmcm9tIFwiLi90eXBlcy5qc1wiO1xuaW1wb3J0IHsgY3JlYXRlTG9nZ2VyIH0gZnJvbSBcInZpdGVcIjtcblxuLyoqXG4gKiBDcmVhdGVzIGEgbG9hZGVyIGZ1bmN0aW9uIGZvciBoYW5kbGluZyBtb2R1bGUgcmVzb2x1dGlvbiBkdXJpbmcgYnVpbGQuXG4gKlxuICogVGhlIGxvYWRlciBoYW5kbGVzIHRoZSBmb2xsb3dpbmcgc3RyYXRlZ3k6XG4gKiAgLSBGb3IgaW5saW5lIG1vZHVsZXM6IEhhbmRsZSB0aGVtIHVzaW5nIGJ1bmRsZVxuICovXG5leHBvcnQgY29uc3QgY3JlYXRlQnVpbGRMb2FkZXI6IENyZWF0ZUJ1aWxkTG9hZGVyRm4gPVxuICBmdW5jdGlvbiBfY3JlYXRlQnVpbGRMb2FkZXIoXG4gICAgeyB1c2VyT3B0aW9ucywgc2VydmVyTWFuaWZlc3QsIHN0YXRpY01hbmlmZXN0IH0sXG4gICAgYnVuZGxlLFxuICAgIHRlbXBvcmFyeVJlZmVyZW5jZXMsXG4gICAgbG9nZ2VyID0gY3JlYXRlTG9nZ2VyKClcbiAgKSB7XG4gICAgY29uc3QgbWFuaWZlc3RLZXlzID0gT2JqZWN0LmtleXMoc2VydmVyTWFuaWZlc3QpO1xuICAgIGlmICghbWFuaWZlc3RLZXlzLmxlbmd0aCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiU2VydmVyIG1hbmlmZXN0IGlzIGVtcHR5XCIpO1xuICAgIH1cblxuICAgIHJldHVybiBhc3luYyBmdW5jdGlvbiBidWlsZExvYWRlcihpZCkge1xuICAgICAgaWYgKHVzZXJPcHRpb25zLnZlcmJvc2UpIHtcbiAgICAgICAgbG9nZ2VyLmluZm8oYFtidWlsZExvYWRlcl0gaWQ6ICR7aWR9YCk7XG4gICAgICAgIGxvZ2dlci5pbmZvKGBbYnVpbGRMb2FkZXJdIFN0YXJ0aW5nIGxvb2t1cCBmb3I6ICR7aWR9YCk7XG4gICAgICB9XG4gICAgICBjb25zdCBbd2l0aG91dFF1ZXJ5LCBxdWVyeV0gPSBpZC5zcGxpdChcIj9cIiwgMik7XG4gICAgICBjb25zdCBbbW9kdWxlSWQsIGV4cG9ydE5hbWVdID0gd2l0aG91dFF1ZXJ5LnNwbGl0KFwiI1wiLCAyKTtcbiAgICAgIFxuICAgICAgLy8gTm9ybWFsaXplIHRoZSBtb2R1bGVJZCBlYXJseSAodXNlZCB0aHJvdWdob3V0IHRoZSBmdW5jdGlvbilcbiAgICAgIGNvbnN0IFtub3JtYWxpemVkS2V5LCBub3JtYWxpemVkVmFsdWVdID0gdXNlck9wdGlvbnMubm9ybWFsaXplcihtb2R1bGVJZCk7XG4gICAgICBcbiAgICAgIC8vIEZvciB2aXJ0dWFsIG1vZHVsZXMgYW5kIG5vZGVfbW9kdWxlcywgdXNlIHNoYXJlZCB1dGlsaXR5IChzYW1lIGFzIFJTQyB3b3JrZXIgbG9hZGVyKVxuICAgICAgLy8gVGhpcyBoYW5kbGVzIF92aXJ0dWFsL2R5bmFtaWMtaW1wb3J0LWhlbHBlci5qcyBhbmQgcHJvdmlkZXMgc2hpbXMgaWYgbmVlZGVkXG4gICAgICAvLyBDaGVjayB0aGlzIGVhcmx5LCBiZWZvcmUgYnVpbGQtc3BlY2lmaWMgaGFuZGxpbmdcbiAgICAgIGNvbnN0IHZpcnR1YWxPck5vZGVNb2R1bGUgPSBhd2FpdCByZXNvbHZlVmlydHVhbEFuZE5vZGVNb2R1bGVzKFxuICAgICAgICBtb2R1bGVJZCxcbiAgICAgICAgZXhwb3J0TmFtZSxcbiAgICAgICAgdXNlck9wdGlvbnMudmVyYm9zZSxcbiAgICAgICAgbG9nZ2VyXG4gICAgICApO1xuICAgICAgaWYgKHZpcnR1YWxPck5vZGVNb2R1bGUgIT09IG51bGwpIHtcbiAgICAgICAgcmV0dXJuIHZpcnR1YWxPck5vZGVNb2R1bGU7XG4gICAgICB9XG4gICAgICBcbiAgICAgIGNvbnN0IG1vZHVsZVJlZiA9IGdldE1vZHVsZVJlZihpZCk7XG5cbiAgICAgIC8vIENoZWNrIGlmIHdlIGhhdmUgYSB0ZW1wb3JhcnkgcmVmZXJlbmNlIChjYWNoZWQgbW9kdWxlKVxuICAgICAgaWYgKHRlbXBvcmFyeVJlZmVyZW5jZXM/Lmhhcyhtb2R1bGVSZWYpKSB7XG4gICAgICAgIGNvbnN0IG1vZCA9IHRlbXBvcmFyeVJlZmVyZW5jZXMuZ2V0KG1vZHVsZVJlZik7XG4gICAgICAgIGlmICh0eXBlb2YgbW9kID09PSBcIm9iamVjdFwiICYmIG1vZCAhPT0gbnVsbCAmJiBcImVycm9yXCIgaW4gbW9kKSB7XG4gICAgICAgICAgLy8gaWdub3JlIGl0XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmV0dXJuIG1vZDtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICB0cnkge1xuICAgICAgICAvLyBGb3IgaW5saW5lIG1vZHVsZXMsIGhhbmRsZSB0aGVtIGRpcmVjdGx5XG4gICAgICAgIGlmIChxdWVyeSA9PT0gXCJpbmxpbmVcIikge1xuICAgICAgICAgIGNvbnN0IG1hbmlmZXN0S2V5ID0gbm9ybWFsaXplZFZhbHVlO1xuICAgICAgICAgIGlmICh1c2VyT3B0aW9ucy52ZXJib3NlKSB7XG4gICAgICAgICAgICBsb2dnZXIuaW5mbyhcbiAgICAgICAgICAgICAgYFtidWlsZExvYWRlcl0gTG9va2luZyBmb3IgaW5saW5lIG1vZHVsZTogJHtub3JtYWxpemVkVmFsdWV9YFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICAvLyBGb3IgQ1NTIGZpbGVzLCB0cnkgdG8gcmVzb2x2ZSB0aGUgaGFzaGVkIGZpbGVuYW1lIHRvIHRoZSBhY3R1YWwgYnVuZGxlIGZpbGVuYW1lXG4gICAgICAgICAgbGV0IHJlc29sdmVkVmFsdWUgPSBub3JtYWxpemVkVmFsdWU7XG4gICAgICAgICAgaWYgKFxuICAgICAgICAgICAgbm9ybWFsaXplZFZhbHVlLnN0YXJ0c1dpdGgoXCJhc3NldHMvXCIpICYmXG4gICAgICAgICAgICBub3JtYWxpemVkVmFsdWUuZW5kc1dpdGgoXCIuY3NzXCIpXG4gICAgICAgICAgKSB7XG4gICAgICAgICAgICAvLyBFeHRyYWN0IHRoZSBiYXNlIHBhdGggd2l0aG91dCBoYXNoXG4gICAgICAgICAgICBjb25zdCBiYXNlUGF0aCA9IG5vcm1hbGl6ZWRWYWx1ZS5yZXBsYWNlKFxuICAgICAgICAgICAgICAvLVthLXpBLVowLTldK1xcLmNzcyQvLFxuICAgICAgICAgICAgICBcIi5jc3NcIlxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIGlmICh1c2VyT3B0aW9ucy52ZXJib3NlKSB7XG4gICAgICAgICAgICAgIGxvZ2dlci5pbmZvKFxuICAgICAgICAgICAgICAgIGBbYnVpbGRMb2FkZXJdIENTUyBmaWxlIGRldGVjdGVkLCB0cnlpbmcgdG8gcmVzb2x2ZSAke25vcm1hbGl6ZWRWYWx1ZX0gdG8gJHtiYXNlUGF0aH1gXG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBUcnkgdGhlIGJhc2UgcGF0aCBmaXJzdFxuICAgICAgICAgICAgaWYgKGJ1bmRsZVtiYXNlUGF0aF0pIHtcbiAgICAgICAgICAgICAgcmVzb2x2ZWRWYWx1ZSA9IGJhc2VQYXRoO1xuICAgICAgICAgICAgICBpZiAodXNlck9wdGlvbnMudmVyYm9zZSkge1xuICAgICAgICAgICAgICAgIGxvZ2dlci5pbmZvKFxuICAgICAgICAgICAgICAgICAgYFtidWlsZExvYWRlcl0gUmVzb2x2ZWQgQ1NTIGZpbGUgdG86ICR7cmVzb2x2ZWRWYWx1ZX1gXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cblxuICAgICAgICAgIC8vIEZpcnN0IHRyeSB0byBmaW5kIHRoZSBtb2R1bGUgd2l0aG91dCB0aGUgZXhwb3J0IG5hbWVcbiAgICAgICAgICBpZiAodXNlck9wdGlvbnMudmVyYm9zZSkge1xuICAgICAgICAgICAgbG9nZ2VyLmluZm8oXG4gICAgICAgICAgICAgIGBbYnVpbGRMb2FkZXJdIFRyeWluZyBidW5kbGVbbW9kdWxlSWRdOiBidW5kbGVbXCIke21vZHVsZUlkfVwiXSA9ICR7ISFidW5kbGVbXG4gICAgICAgICAgICAgICAgbW9kdWxlSWRcbiAgICAgICAgICAgICAgXX1gXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgbG9nZ2VyLmluZm8oXG4gICAgICAgICAgICAgIGBbYnVpbGRMb2FkZXJdIFRyeWluZyBidW5kbGVbbm9ybWFsaXplZFZhbHVlXTogYnVuZGxlW1wiJHtub3JtYWxpemVkVmFsdWV9XCJdID0gJHshIWJ1bmRsZVtcbiAgICAgICAgICAgICAgICBub3JtYWxpemVkVmFsdWVcbiAgICAgICAgICAgICAgXX1gXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgbG9nZ2VyLmluZm8oXG4gICAgICAgICAgICAgIGBbYnVpbGRMb2FkZXJdIFRyeWluZyBidW5kbGVbcmVzb2x2ZWRWYWx1ZV06IGJ1bmRsZVtcIiR7cmVzb2x2ZWRWYWx1ZX1cIl0gPSAkeyEhYnVuZGxlW1xuICAgICAgICAgICAgICAgIHJlc29sdmVkVmFsdWVcbiAgICAgICAgICAgICAgXX1gXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH1cbiAgICAgICAgICBjb25zdCBzZXJ2ZXJDaHVuayA9XG4gICAgICAgICAgICBidW5kbGVbbW9kdWxlSWRdID8/XG4gICAgICAgICAgICBidW5kbGVbbm9ybWFsaXplZFZhbHVlXSA/P1xuICAgICAgICAgICAgYnVuZGxlW3Jlc29sdmVkVmFsdWVdID8/XG4gICAgICAgICAgICBidW5kbGVbc2VydmVyTWFuaWZlc3RbbWFuaWZlc3RLZXldPy5maWxlXSA/P1xuICAgICAgICAgICAgYnVuZGxlW3N0YXRpY01hbmlmZXN0W21hbmlmZXN0S2V5XT8uZmlsZV0gPz9cbiAgICAgICAgICAgIGJ1bmRsZVtzZXJ2ZXJNYW5pZmVzdFtub3JtYWxpemVkS2V5XT8uZmlsZV0gPz9cbiAgICAgICAgICAgIGJ1bmRsZVtzdGF0aWNNYW5pZmVzdFtub3JtYWxpemVkS2V5XT8uZmlsZV0gPz9cbiAgICAgICAgICAgIE9iamVjdC5lbnRyaWVzKGJ1bmRsZSkuZmluZChcbiAgICAgICAgICAgICAgKFssIHZhbHVlXSkgPT4gdmFsdWUubmFtZSA9PT0gbm9ybWFsaXplZFZhbHVlXG4gICAgICAgICAgICApPy5bMV07XG5cbiAgICAgICAgICBpZiAodXNlck9wdGlvbnMudmVyYm9zZSAmJiBzZXJ2ZXJDaHVuaykge1xuICAgICAgICAgICAgbG9nZ2VyLmluZm8oYFtidWlsZExvYWRlcl0gRm91bmQgc2VydmVyQ2h1bms6ICR7c2VydmVyQ2h1bmsudHlwZX1gKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAoc2VydmVyQ2h1bmspIHtcbiAgICAgICAgICAgIGlmIChzZXJ2ZXJDaHVuay50eXBlID09PSBcImFzc2V0XCIpIHtcbiAgICAgICAgICAgICAgLy8gRm9yIENTUyBmaWxlcywgZW5zdXJlIHdlJ3JlIGluIHRoZSBSZWFjdCBTZXJ2ZXIgZW52aXJvbm1lbnRcbiAgICAgICAgICAgICAgaWYgKHVzZXJPcHRpb25zLmF1dG9EaXNjb3Zlci5qc29uUGF0dGVybi50ZXN0KG5vcm1hbGl6ZWRWYWx1ZSkpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBqc29uQ29udGVudCA9IHNlcnZlckNodW5rLnNvdXJjZTtcbiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIGpzb25Db250ZW50ID09PSBcInN0cmluZ1wiKSB7XG4gICAgICAgICAgICAgICAgICBpZiAodXNlck9wdGlvbnMudmVyYm9zZSkge1xuICAgICAgICAgICAgICAgICAgICBsb2dnZXIuaW5mbyhcbiAgICAgICAgICAgICAgICAgICAgICBgW2J1aWxkTG9hZGVyXSBSZXR1cm5pbmcgSlNPTiBjb250ZW50IGZvcjogJHtub3JtYWxpemVkVmFsdWV9YFxuICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgcmV0dXJuIHsgZGVmYXVsdDogSlNPTi5wYXJzZShqc29uQ29udGVudCkgfTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH0gZWxzZSBpZiAoXG4gICAgICAgICAgICAgICAgdXNlck9wdGlvbnMuYXV0b0Rpc2NvdmVyLmNzc1BhdHRlcm4udGVzdChub3JtYWxpemVkVmFsdWUpXG4gICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGNzc0NvbnRlbnQgPSBzZXJ2ZXJDaHVuay5zb3VyY2U7XG4gICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBjc3NDb250ZW50ID09PSBcInN0cmluZ1wiKSB7XG4gICAgICAgICAgICAgICAgICBpZiAodXNlck9wdGlvbnMudmVyYm9zZSkge1xuICAgICAgICAgICAgICAgICAgICBsb2dnZXIuaW5mbyhcbiAgICAgICAgICAgICAgICAgICAgICBgW2J1aWxkTG9hZGVyXSBSZXR1cm5pbmcgQ1NTIGNvbnRlbnQgZm9yOiAke25vcm1hbGl6ZWRWYWx1ZX0sIGxlbmd0aDogJHtjc3NDb250ZW50Lmxlbmd0aH1gXG4gICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICByZXR1cm4geyBkZWZhdWx0OiBjc3NDb250ZW50IH07XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgIGlmICh1c2VyT3B0aW9ucy52ZXJib3NlKSB7XG4gICAgICAgICAgICAgICAgICAgIGxvZ2dlci5pbmZvKFxuICAgICAgICAgICAgICAgICAgICAgIGBbYnVpbGRMb2FkZXJdIENTUyBzb3VyY2UgaXMgbm90IHN0cmluZzogJHt0eXBlb2YgY3NzQ29udGVudH1gXG4gICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGlmICh1c2VyT3B0aW9ucy52ZXJib3NlKSB7XG4gICAgICAgICAgICAgICAgbG9nZ2VyLmluZm8oXG4gICAgICAgICAgICAgICAgICBgW2J1aWxkTG9hZGVyXSBSZXR1cm5pbmcgZGVmYXVsdCBhc3NldCBzb3VyY2UgZm9yOiAke25vcm1hbGl6ZWRWYWx1ZX1gXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICByZXR1cm4geyBkZWZhdWx0OiBzZXJ2ZXJDaHVuay5zb3VyY2UgfTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoXCJjb2RlXCIgaW4gc2VydmVyQ2h1bmspIHtcbiAgICAgICAgICAgICAgaWYgKHVzZXJPcHRpb25zLnZlcmJvc2UpIHtcbiAgICAgICAgICAgICAgICBsb2dnZXIuaW5mbyhcbiAgICAgICAgICAgICAgICAgIGBbYnVpbGRMb2FkZXJdIFJldHVybmluZyBjb2RlIGZvcjogJHtub3JtYWxpemVkVmFsdWV9YFxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgcmV0dXJuIHsgZGVmYXVsdDogc2VydmVyQ2h1bmsuY29kZSB9O1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBjb25zdCBwYW5pY0Vycm9yID0gaGFuZGxlRXJyb3Ioe1xuICAgICAgICAgICAgZXJyb3I6IG5ldyBFcnJvcihcbiAgICAgICAgICAgICAgYENvdWxkIG5vdCBmaW5kIGlubGluZSBtb2R1bGUgZm9yOiAke25vcm1hbGl6ZWRWYWx1ZX1gXG4gICAgICAgICAgICApLFxuICAgICAgICAgICAgbG9nZ2VyLFxuICAgICAgICAgICAgbG9nOiB0cnVlLFxuICAgICAgICAgICAgcGFuaWNUaHJlc2hvbGQ6IHVzZXJPcHRpb25zLnBhbmljVGhyZXNob2xkLFxuICAgICAgICAgICAgY29udGV4dDogXCJCdWlsZCBMb2FkZXIgRXJyb3IgKGlubGluZSlcIixcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBpZiAocGFuaWNFcnJvciAhPSBudWxsKSB7XG4gICAgICAgICAgICB0aHJvdyBwYW5pY0Vycm9yO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIGNoZWNrIHRoZSBidW5kbGUgbWFuaWZlc3QgZm9yIGEgZGlyZWN0IG1hdGNoXG4gICAgICAgIGNvbnN0IGJ1bmRsZUVudHJ5ID0gYnVuZGxlW3dpdGhvdXRRdWVyeV07XG4gICAgICAgIGlmIChidW5kbGVFbnRyeSkge1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICBjb25zdCBmaWxlUGF0aCA9IGpvaW4oXG4gICAgICAgICAgICAgIHVzZXJPcHRpb25zLnByb2plY3RSb290LFxuICAgICAgICAgICAgICB1c2VyT3B0aW9ucy5idWlsZC5vdXREaXIsXG4gICAgICAgICAgICAgIHVzZXJPcHRpb25zLmJ1aWxkLnNlcnZlcixcbiAgICAgICAgICAgICAgd2l0aG91dFF1ZXJ5XG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgY29uc3QgZmlsZVVybCA9IHBhdGhUb0ZpbGVVUkwoZmlsZVBhdGgpLmhyZWY7XG4gICAgICAgICAgICBjb25zdCBtb2R1bGUgPSBhd2FpdCBpbXBvcnQoZmlsZVVybCk7XG4gICAgICAgICAgICB0ZW1wb3JhcnlSZWZlcmVuY2VzPy5zZXQobW9kdWxlUmVmLCBtb2R1bGUpO1xuICAgICAgICAgICAgcmV0dXJuIG1vZHVsZTtcbiAgICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgY29uc3QgcGFuaWNFcnJvciA9IGhhbmRsZUVycm9yKHtcbiAgICAgICAgICAgICAgZXJyb3I6IGVycm9yLFxuICAgICAgICAgICAgICBsb2dnZXIsXG4gICAgICAgICAgICAgIHBhbmljVGhyZXNob2xkOiB1c2VyT3B0aW9ucy5wYW5pY1RocmVzaG9sZCxcbiAgICAgICAgICAgICAgY29udGV4dDogXCJCdWlsZCBMb2FkZXIgRXJyb3IgKGJ1bmRsZSlcIixcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgdGVtcG9yYXJ5UmVmZXJlbmNlcz8uZGVsZXRlKG1vZHVsZVJlZik7XG4gICAgICAgICAgICBpZiAocGFuaWNFcnJvciAhPSBudWxsKSB7XG4gICAgICAgICAgICAgIHRocm93IHBhbmljRXJyb3I7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gRm9yIHN0YXRpYyBhc3NldHMsIHVzZSBzdGF0aWMgbWFuaWZlc3RcbiAgICAgICAgY29uc3Qgc3RhdGljRW50cnkgPSBzdGF0aWNNYW5pZmVzdFtub3JtYWxpemVkVmFsdWVdO1xuICAgICAgICBpZiAoc3RhdGljRW50cnkpIHtcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgY29uc3QgZmlsZVBhdGggPSBqb2luKFxuICAgICAgICAgICAgICB1c2VyT3B0aW9ucy5wcm9qZWN0Um9vdCxcbiAgICAgICAgICAgICAgdXNlck9wdGlvbnMuYnVpbGQub3V0RGlyLFxuICAgICAgICAgICAgICB1c2VyT3B0aW9ucy5idWlsZC5zdGF0aWMsXG4gICAgICAgICAgICAgIHN0YXRpY0VudHJ5LmZpbGVcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICBjb25zdCBmaWxlVXJsID0gcGF0aFRvRmlsZVVSTChmaWxlUGF0aCkuaHJlZjtcbiAgICAgICAgICAgIGNvbnN0IG1vZHVsZSA9IGF3YWl0IGltcG9ydChmaWxlVXJsKTtcbiAgICAgICAgICAgIHRlbXBvcmFyeVJlZmVyZW5jZXM/LnNldChtb2R1bGVSZWYsIG1vZHVsZSk7XG4gICAgICAgICAgICAvLyBJZiB3ZSBoYXZlIGFuIGV4cG9ydCBuYW1lLCBtYWtlIHN1cmUgaXQncyBhIGtleVxuICAgICAgICAgICAgaWYgKGV4cG9ydE5hbWUgJiYgIShleHBvcnROYW1lIGluIG1vZHVsZSkpIHtcbiAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICAgICAgIGBFeHBvcnQgJHtleHBvcnROYW1lfSBub3QgZm91bmQgaW4gbW9kdWxlICR7bm9ybWFsaXplZFZhbHVlfWBcbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBtb2R1bGU7XG4gICAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgIGNvbnN0IHBhbmljRXJyb3IgPSBoYW5kbGVFcnJvcih7XG4gICAgICAgICAgICAgIGVycm9yOiBlcnJvcixcbiAgICAgICAgICAgICAgbG9nZ2VyLFxuICAgICAgICAgICAgICBwYW5pY1RocmVzaG9sZDogdXNlck9wdGlvbnMucGFuaWNUaHJlc2hvbGQsXG4gICAgICAgICAgICAgIGNvbnRleHQ6IFwiQnVpbGQgTG9hZGVyIEVycm9yIChzdGF0aWMpXCIsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHRlbXBvcmFyeVJlZmVyZW5jZXM/LmRlbGV0ZShtb2R1bGVSZWYpO1xuICAgICAgICAgICAgaWYgKHBhbmljRXJyb3IgIT0gbnVsbCkge1xuICAgICAgICAgICAgICB0aHJvdyBwYW5pY0Vycm9yO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFVzZSBzaGFyZWQgbG9hZGVyIHV0aWxpdHkgZm9yIGNvbW1vbiBjYXNlcyAodmlydHVhbCBtb2R1bGVzLCBtYW5pZmVzdCByZXNvbHV0aW9uLCBpbXBvcnRzKVxuICAgICAgICAvLyBUaGlzIGhhbmRsZXMgdGhlIHNhbWUgbG9naWMgYXMgUlNDIHdvcmtlciBsb2FkZXJcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBjb25zdCBtb2R1bGUgPSBhd2FpdCBjcmVhdGVTaGFyZWRMb2FkZXIoe1xuICAgICAgICAgICAgbW9kdWxlSWQsXG4gICAgICAgICAgICBleHBvcnROYW1lLFxuICAgICAgICAgICAgdmVyYm9zZTogdXNlck9wdGlvbnMudmVyYm9zZSxcbiAgICAgICAgICAgIGxvZ2dlcixcbiAgICAgICAgICAgIHJlc29sdmVWaXJ0dWFsOiB0cnVlLFxuICAgICAgICAgICAgbWFuaWZlc3Q6IHNlcnZlck1hbmlmZXN0LFxuICAgICAgICAgICAgbm9ybWFsaXplcjogdXNlck9wdGlvbnMubm9ybWFsaXplcixcbiAgICAgICAgICAgIG1vZHVsZUJhc2U6IHVzZXJPcHRpb25zLm1vZHVsZUJhc2UsXG4gICAgICAgICAgICBwcmVzZXJ2ZU1vZHVsZXNSb290OiB1c2VyT3B0aW9ucy5idWlsZC5wcmVzZXJ2ZU1vZHVsZXNSb290LFxuICAgICAgICAgICAgcHJvamVjdFJvb3Q6IHVzZXJPcHRpb25zLnByb2plY3RSb290LFxuICAgICAgICAgICAgYnVpbGRPdXREaXI6IHVzZXJPcHRpb25zLmJ1aWxkLm91dERpcixcbiAgICAgICAgICAgIGJ1aWxkU2VydmVyRGlyOiB1c2VyT3B0aW9ucy5idWlsZC5zZXJ2ZXIsXG4gICAgICAgICAgICBpc0J1aWxkTW9kZTogdHJ1ZSxcbiAgICAgICAgICAgIGlzU2VydmVNb2RlOiBmYWxzZSxcbiAgICAgICAgICAgIGVmZmVjdGl2ZVByb2plY3RSb290OiB1c2VyT3B0aW9ucy5wcm9qZWN0Um9vdCxcbiAgICAgICAgICAgIGJ1aWxkOiB7XG4gICAgICAgICAgICAgIG91dERpcjogdXNlck9wdGlvbnMuYnVpbGQub3V0RGlyLFxuICAgICAgICAgICAgICBzZXJ2ZXI6IHVzZXJPcHRpb25zLmJ1aWxkLnNlcnZlcixcbiAgICAgICAgICAgICAgY2xpZW50OiB1c2VyT3B0aW9ucy5idWlsZC5jbGllbnQsXG4gICAgICAgICAgICAgIHN0YXRpYzogdXNlck9wdGlvbnMuYnVpbGQuc3RhdGljLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBcbiAgICAgICAgICAvLyBTdG9yZSBpbiB0ZW1wb3JhcnkgcmVmZXJlbmNlcyBmb3IgY2FjaGluZ1xuICAgICAgICAgIHRlbXBvcmFyeVJlZmVyZW5jZXM/LnNldChtb2R1bGVSZWYsIG1vZHVsZSk7XG4gICAgICAgICAgcmV0dXJuIG1vZHVsZTtcbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICBjb25zdCBlcnIgPSB0b0Vycm9yKGVycm9yKTtcbiAgICAgICAgICBjb25zdCBwYW5pY0Vycm9yID0gaGFuZGxlRXJyb3Ioe1xuICAgICAgICAgICAgZXJyb3I6IGVycixcbiAgICAgICAgICAgIGxvZ2dlcixcbiAgICAgICAgICAgIHBhbmljVGhyZXNob2xkOiB1c2VyT3B0aW9ucy5wYW5pY1RocmVzaG9sZCxcbiAgICAgICAgICAgIGNvbnRleHQ6IFwiQnVpbGQgTG9hZGVyIEVycm9yIChzaGFyZWQpXCIsXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgdGVtcG9yYXJ5UmVmZXJlbmNlcz8uZGVsZXRlKG1vZHVsZVJlZik7XG4gICAgICAgICAgaWYgKHBhbmljRXJyb3IgIT0gbnVsbCkge1xuICAgICAgICAgICAgdGhyb3cgcGFuaWNFcnJvcjtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIC8vIEVuaGFuY2UgUmVhY3QgU2VydmVyIERPTSBlcnJvcnMgd2l0aCBpbXBvcnQgY29udGV4dFxuICAgICAgICBsZXQgZW5oYW5jZWRFcnJvciA9IGVycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvciA6IG5ldyBFcnJvcihTdHJpbmcoZXJyb3IpKTtcbiAgICAgICAgaWYgKGVuaGFuY2VkRXJyb3IubWVzc2FnZS5pbmNsdWRlcygnUmVhY3QgU2VydmVyIFdyaXRlciBjYW5ub3QgYmUgdXNlZCBvdXRzaWRlIGEgcmVhY3Qtc2VydmVyIGVudmlyb25tZW50JykpIHtcbiAgICAgICAgICBjb25zdCBmaWxlUGF0aCA9IHJlc29sdmUoXG4gICAgICAgICAgICB1c2VyT3B0aW9ucy5wcm9qZWN0Um9vdCxcbiAgICAgICAgICAgIHVzZXJPcHRpb25zLmJ1aWxkLm91dERpcixcbiAgICAgICAgICAgIHVzZXJPcHRpb25zLmJ1aWxkLnNlcnZlcixcbiAgICAgICAgICAgIG1vZHVsZUlkXG4gICAgICAgICAgKTtcbiAgICAgICAgICBlbmhhbmNlZEVycm9yID0gbmV3IEVycm9yKFxuICAgICAgICAgICAgYCR7ZW5oYW5jZWRFcnJvci5tZXNzYWdlfVxcbmAgK1xuICAgICAgICAgICAgYCAg4oaSIEltcG9ydGVkIGZyb206ICR7bW9kdWxlSWR9XFxuYCArXG4gICAgICAgICAgICBgICDihpIgRXhwb3J0OiAke2V4cG9ydE5hbWV9XFxuYCArXG4gICAgICAgICAgICBgICDihpIgRmlsZSBwYXRoOiAke2ZpbGVQYXRofVxcbmAgK1xuICAgICAgICAgICAgYCAg4oaSIE5PREVfT1BUSU9OUzogJHtwcm9jZXNzLmVudi5OT0RFX09QVElPTlMgfHwgJ25vdCBzZXQnfVxcbmAgK1xuICAgICAgICAgICAgYCAg4oaSIGV4ZWNBcmd2OiAke3Byb2Nlc3MuZXhlY0FyZ3Yuam9pbignICcpIHx8ICdub3Qgc2V0J31gXG4gICAgICAgICAgKTtcbiAgICAgICAgICB0aHJvdyBlbmhhbmNlZEVycm9yO1xuICAgICAgICB9XG4gICAgICAgIFxuICAgICAgICBjb25zdCBlbXB0eUV4cG9ydHMgPSB7XG4gICAgICAgICAgZXJyb3I6IGVuaGFuY2VkRXJyb3IsXG4gICAgICAgICAgaWQ6IGlkLFxuICAgICAgICB9O1xuICAgICAgICB0ZW1wb3JhcnlSZWZlcmVuY2VzPy5kZWxldGUobW9kdWxlUmVmKTtcbiAgICAgICAgcmV0dXJuIGVtcHR5RXhwb3J0cztcbiAgICAgIH1cbiAgICB9O1xuICB9O1xuIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7O0FBaUJPLE1BQU0saUJBQ1gsR0FBQSxTQUFTLGtCQUNQLENBQUEsRUFBRSxXQUFhLEVBQUEsY0FBQSxFQUFnQixjQUFlLEVBQUEsRUFDOUMsTUFDQSxFQUFBLG1CQUFBLEVBQ0EsTUFBUyxHQUFBLFlBQUEsRUFDVCxFQUFBO0FBQ0EsRUFBTSxNQUFBLFlBQUEsR0FBZSxNQUFPLENBQUEsSUFBQSxDQUFLLGNBQWMsQ0FBQTtBQUMvQyxFQUFJLElBQUEsQ0FBQyxhQUFhLE1BQVEsRUFBQTtBQUN4QixJQUFNLE1BQUEsSUFBSSxNQUFNLDBCQUEwQixDQUFBO0FBQUE7QUFHNUMsRUFBTyxPQUFBLGVBQWUsWUFBWSxFQUFJLEVBQUE7QUFDcEMsSUFBQSxJQUFJLFlBQVksT0FBUyxFQUFBO0FBQ3ZCLE1BQU8sTUFBQSxDQUFBLElBQUEsQ0FBSyxDQUFxQixrQkFBQSxFQUFBLEVBQUUsQ0FBRSxDQUFBLENBQUE7QUFDckMsTUFBTyxNQUFBLENBQUEsSUFBQSxDQUFLLENBQXNDLG1DQUFBLEVBQUEsRUFBRSxDQUFFLENBQUEsQ0FBQTtBQUFBO0FBRXhELElBQUEsTUFBTSxDQUFDLFlBQWMsRUFBQSxLQUFLLElBQUksRUFBRyxDQUFBLEtBQUEsQ0FBTSxLQUFLLENBQUMsQ0FBQTtBQUM3QyxJQUFBLE1BQU0sQ0FBQyxRQUFVLEVBQUEsVUFBVSxJQUFJLFlBQWEsQ0FBQSxLQUFBLENBQU0sS0FBSyxDQUFDLENBQUE7QUFHeEQsSUFBQSxNQUFNLENBQUMsYUFBZSxFQUFBLGVB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
|