vite-plugin-react-server 1.3.6 → 1.4.1
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 +33 -19
- package/dist/package.json +4 -2
- package/dist/plugin/config/resolveOptions.d.ts.map +1 -1
- package/dist/plugin/config/resolveOptions.js +4 -2
- package/dist/plugin/dev-server/configureReactServer.client.js +1 -1
- package/dist/plugin/dev-server/plugin.client.d.ts.map +1 -1
- package/dist/plugin/dev-server/plugin.client.js +17 -15
- package/dist/plugin/dev-server/plugin.server.d.ts.map +1 -1
- package/dist/plugin/dev-server/plugin.server.js +54 -4
- package/dist/plugin/helpers/requestInfo.d.ts.map +1 -1
- package/dist/plugin/helpers/requestInfo.js +4 -3
- package/dist/plugin/helpers/requestToRoute.d.ts.map +1 -1
- package/dist/plugin/helpers/requestToRoute.js +2 -2
- package/dist/plugin/react-static/plugin.server.d.ts.map +1 -1
- package/dist/plugin/react-static/plugin.server.js +9 -1
- package/dist/plugin/react-static/renderPagesBatched.d.ts.map +1 -1
- package/dist/plugin/react-static/renderPagesBatched.js +136 -36
- package/dist/plugin/react-static/types.d.ts +1 -0
- package/dist/plugin/react-static/types.d.ts.map +1 -1
- package/dist/plugin/types.d.ts +15 -0
- package/dist/plugin/types.d.ts.map +1 -1
- package/dist/plugin/utils/createReactFetcher.js +24 -2
- package/dist/plugin/utils/useRscHmr.js +10 -2
- package/dist/plugin/vendor/register-vendor.js +1 -1
- package/dist/plugin/vendor/vendor-alias.d.ts +5 -2
- package/dist/plugin/vendor/vendor-alias.d.ts.map +1 -1
- package/dist/plugin/vendor/vendor-alias.js +60 -26
- package/dist/plugin/vendor/vendor.server.d.ts.map +1 -1
- package/dist/plugin/vendor/vendor.server.js +2 -2
- package/dist/plugin/vendor/vendor.static.d.ts.map +1 -1
- package/dist/plugin/vendor/vendor.static.js +2 -2
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/oss-experimental/react-server-dom-esm/cjs/react-server-dom-esm-client.browser.development.js +1 -1
- package/oss-experimental/react-server-dom-esm/cjs/react-server-dom-esm-client.browser.production.js +1 -1
- package/oss-experimental/react-server-dom-esm/cjs/react-server-dom-esm-client.node.development.js +1 -1
- package/oss-experimental/react-server-dom-esm/cjs/react-server-dom-esm-client.node.production.js +1 -1
- package/oss-experimental/react-server-dom-esm/cjs/react-server-dom-esm-server.node.development.js +1 -1
- package/oss-experimental/react-server-dom-esm/cjs/react-server-dom-esm-server.node.production.js +1 -1
- package/oss-experimental/react-server-dom-esm/esm/react-server-dom-esm-client.browser.development.js +1 -1
- package/oss-experimental/react-server-dom-esm/esm/react-server-dom-esm-client.browser.production.js +1 -1
- package/oss-experimental/react-server-dom-esm/package.json +3 -3
- package/package.json +4 -2
- package/plugin/config/resolveOptions.ts +2 -0
- package/plugin/dev-server/configureReactServer.client.ts +1 -1
- package/plugin/dev-server/plugin.client.ts +23 -20
- package/plugin/dev-server/plugin.server.ts +71 -4
- package/plugin/helpers/requestInfo.ts +6 -3
- package/plugin/helpers/requestToRoute.ts +3 -2
- package/plugin/react-static/plugin.server.ts +11 -1
- package/plugin/react-static/renderPagesBatched.ts +148 -39
- package/plugin/react-static/types.ts +1 -0
- package/plugin/types.ts +15 -0
- package/plugin/vendor/register-vendor.ts +1 -1
- package/plugin/vendor/vendor-alias.ts +61 -39
- package/plugin/vendor/vendor.server.ts +3 -3
- package/plugin/vendor/vendor.static.ts +3 -2
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { dirname, join } from "node:path";
|
|
2
2
|
import { fileURLToPath } from "node:url";
|
|
3
|
-
import { existsSync } from "node:fs";
|
|
3
|
+
import { existsSync, lstatSync, readlinkSync, symlinkSync, unlinkSync } from "node:fs";
|
|
4
4
|
// Find package root by walking up from current file until we find oss-experimental/
|
|
5
5
|
// Works from both plugin/vendor/ (source) and dist/plugin/vendor/ (built)
|
|
6
6
|
const __dirname = dirname(fileURLToPath(import.meta.url));
|
|
@@ -21,22 +21,23 @@ const ossDir = join(pkgRoot, "oss-experimental");
|
|
|
21
21
|
* install `react-server-dom-esm` separately or use patch-package.
|
|
22
22
|
*
|
|
23
23
|
* Browser client entries use true ESM files for Rollup tree-shaking.
|
|
24
|
-
* Server/static entries are
|
|
25
|
-
*
|
|
24
|
+
* Server/static entries are CJS and must be loadable via native Node import()
|
|
25
|
+
* (not eval'd as ESM by Vite's module runner, which lacks require()).
|
|
26
|
+
*
|
|
27
|
+
* In dev mode, we ensure the vendored package is reachable from node_modules
|
|
28
|
+
* so Vite's module runner can externalize and natively import() CJS entries.
|
|
26
29
|
*/
|
|
27
30
|
export function vitePluginVendorAlias() {
|
|
28
|
-
let isBuild = false;
|
|
29
31
|
return {
|
|
30
32
|
name: "vite-plugin-react-server:vendor-alias",
|
|
31
33
|
enforce: "pre",
|
|
32
34
|
config(_config, env) {
|
|
33
35
|
const pkg = join(ossDir, "react-server-dom-esm");
|
|
34
36
|
const isProd = env.mode === "production";
|
|
35
|
-
// Only alias browser client to ESM for Rollup tree-shaking.
|
|
36
|
-
// Server/static are handled by resolveId with external:true.
|
|
37
37
|
return {
|
|
38
38
|
resolve: {
|
|
39
39
|
alias: [
|
|
40
|
+
// Browser client → ESM for Rollup tree-shaking
|
|
40
41
|
{
|
|
41
42
|
find: "react-server-dom-esm/client.browser",
|
|
42
43
|
replacement: join(pkg, "esm", isProd
|
|
@@ -48,34 +49,69 @@ export function vitePluginVendorAlias() {
|
|
|
48
49
|
};
|
|
49
50
|
},
|
|
50
51
|
configResolved(config) {
|
|
51
|
-
|
|
52
|
+
// Allow serving vendored files when the plugin is linked or in a monorepo.
|
|
53
|
+
// Must be done in configResolved to append to the resolved allow list
|
|
54
|
+
// (setting in config hook can override Vite's defaults).
|
|
55
|
+
if (config.command === "serve" && config.server?.fs?.allow) {
|
|
56
|
+
if (!config.server.fs.allow.includes(pkgRoot)) {
|
|
57
|
+
config.server.fs.allow.push(pkgRoot);
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
// Ensure vendored package is reachable via Node resolution in ALL Vite
|
|
61
|
+
// contexts (dev server, vitest, SSR workers, custom scripts).
|
|
62
|
+
// Vite's module runner resolves bare imports via Node — not plugin hooks —
|
|
63
|
+
// so the package must be in node_modules for CJS entries to work.
|
|
64
|
+
ensureVendoredPackageLinked(config.root);
|
|
52
65
|
},
|
|
53
66
|
resolveId(source) {
|
|
54
|
-
|
|
55
|
-
if (!source.startsWith("react-server-dom-esm")) {
|
|
67
|
+
if (!source.startsWith("react-server-dom-esm"))
|
|
56
68
|
return;
|
|
57
|
-
|
|
58
|
-
// Skip client.browser — handled by config alias above
|
|
59
|
-
if (source === "react-server-dom-esm/client.browser") {
|
|
69
|
+
if (source === "react-server-dom-esm/client.browser")
|
|
60
70
|
return;
|
|
71
|
+
// Server/static entries: mark external so the runner/bundler uses native
|
|
72
|
+
// import() rather than eval(). The resolved path points into the vendored
|
|
73
|
+
// copy (reachable via symlink in dev, directly in build).
|
|
74
|
+
if (isServerEntry(source)) {
|
|
75
|
+
return { id: resolveVendored(source), external: true };
|
|
61
76
|
}
|
|
62
|
-
// For server/static entries during build: mark external with resolved path.
|
|
63
|
-
// At runtime, vendor.*.ts uses createRequire to load from this path.
|
|
64
|
-
if (isBuild && isServerEntry(source)) {
|
|
65
|
-
const resolved = resolveVendored(source);
|
|
66
|
-
return { id: resolved, external: true };
|
|
67
|
-
}
|
|
68
|
-
// For all other entries (client.node, client, index), resolve to vendored path
|
|
69
77
|
return resolveVendored(source);
|
|
70
78
|
},
|
|
71
79
|
};
|
|
72
80
|
}
|
|
81
|
+
/**
|
|
82
|
+
* Ensure `node_modules/react-server-dom-esm` links to the vendored copy.
|
|
83
|
+
* Only creates a symlink if no real install exists. Safe to call multiple times.
|
|
84
|
+
*/
|
|
85
|
+
function ensureVendoredPackageLinked(root) {
|
|
86
|
+
const pkg = join(ossDir, "react-server-dom-esm");
|
|
87
|
+
const target = join(root ?? process.cwd(), "node_modules", "react-server-dom-esm");
|
|
88
|
+
try {
|
|
89
|
+
const stat = (() => { try {
|
|
90
|
+
return lstatSync(target);
|
|
91
|
+
}
|
|
92
|
+
catch {
|
|
93
|
+
return null;
|
|
94
|
+
} })();
|
|
95
|
+
if (stat?.isSymbolicLink()) {
|
|
96
|
+
// Update symlink if it points elsewhere
|
|
97
|
+
if (readlinkSync(target) !== pkg) {
|
|
98
|
+
unlinkSync(target);
|
|
99
|
+
symlinkSync(pkg, target, "junction");
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
else if (!stat) {
|
|
103
|
+
// No existing file — create symlink
|
|
104
|
+
symlinkSync(pkg, target, "junction");
|
|
105
|
+
}
|
|
106
|
+
// If a real directory/file exists (user installed it), leave it alone
|
|
107
|
+
}
|
|
108
|
+
catch {
|
|
109
|
+
// Non-fatal: symlink creation can fail on some systems
|
|
110
|
+
}
|
|
111
|
+
}
|
|
73
112
|
function isServerEntry(source) {
|
|
74
|
-
return
|
|
75
|
-
source.includes("/static"));
|
|
113
|
+
return source.includes("/server") || source.includes("/static");
|
|
76
114
|
}
|
|
77
|
-
// Explicit subpath → file mapping. Server entries always resolve to .node
|
|
78
|
-
// variants to bypass the react-server condition guard in server.js.
|
|
79
115
|
const subpathMap = {
|
|
80
116
|
"react-server-dom-esm": "index.js",
|
|
81
117
|
"react-server-dom-esm/client": "client.js",
|
|
@@ -88,10 +124,8 @@ const subpathMap = {
|
|
|
88
124
|
};
|
|
89
125
|
function resolveVendored(source) {
|
|
90
126
|
const file = subpathMap[source];
|
|
91
|
-
if (file)
|
|
127
|
+
if (file)
|
|
92
128
|
return join(ossDir, "react-server-dom-esm", file);
|
|
93
|
-
}
|
|
94
|
-
// Fallback for unknown subpaths
|
|
95
129
|
const subpath = source.replace("react-server-dom-esm", "");
|
|
96
130
|
return join(ossDir, "react-server-dom-esm", subpath || "index.js");
|
|
97
131
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"vendor.server.d.ts","sourceRoot":"","sources":["../../../plugin/vendor/vendor.server.ts"],"names":[],"mappings":"AAmBA,QAAA,MAAM,cAAc,
|
|
1
|
+
{"version":3,"file":"vendor.server.d.ts","sourceRoot":"","sources":["../../../plugin/vendor/vendor.server.ts"],"names":[],"mappings":"AAmBA,QAAA,MAAM,cAAc,EAAmD,cAAc,kCAAkC,CAAC,CAAC;AAKzH,QAAA,MAAM,KAAK,EAA8B,cAAc,OAAO,CAAC,CAAC;AAEhE,OAAO,EAAE,cAAc,EAAE,KAAK,EAAE,CAAC;AACjC,mBAAmB,kCAAkC,CAAC;AACtD,MAAM,MAAM,KAAK,GAAG,cAAc,OAAO,CAAC,CAAC"}
|
|
@@ -19,10 +19,10 @@ function findPkgRoot() {
|
|
|
19
19
|
}
|
|
20
20
|
const ossDir = join(findPkgRoot(), "oss-experimental");
|
|
21
21
|
const vendorRequire = createRequire(join(ossDir, "react-server-dom-esm", "package.json"));
|
|
22
|
-
const ReactDOMServer = vendorRequire(
|
|
22
|
+
const ReactDOMServer = vendorRequire("react-server-dom-esm/server");
|
|
23
23
|
const projectRoot = process.env["npm_config_local_prefix"] || process.cwd();
|
|
24
24
|
const projectRequire = createRequire(join(projectRoot, "package.json"));
|
|
25
25
|
const React = projectRequire("react");
|
|
26
26
|
|
|
27
27
|
export { React, ReactDOMServer };
|
|
28
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,
|
|
28
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmVuZG9yLnNlcnZlci5qcyIsInNvdXJjZXMiOlsiLi4vLi4vLi4vcGx1Z2luL3ZlbmRvci92ZW5kb3Iuc2VydmVyLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGNyZWF0ZVJlcXVpcmUgfSBmcm9tIFwibm9kZTptb2R1bGVcIjtcbmltcG9ydCB7IGRpcm5hbWUsIGpvaW4gfSBmcm9tIFwibm9kZTpwYXRoXCI7XG5pbXBvcnQgeyBmaWxlVVJMVG9QYXRoIH0gZnJvbSBcIm5vZGU6dXJsXCI7XG5pbXBvcnQgeyBleGlzdHNTeW5jIH0gZnJvbSBcIm5vZGU6ZnNcIjtcblxuY29uc3QgX19kaXJuYW1lID0gZGlybmFtZShmaWxlVVJMVG9QYXRoKGltcG9ydC5tZXRhLnVybCkpO1xuZnVuY3Rpb24gZmluZFBrZ1Jvb3QoKTogc3RyaW5nIHtcbiAgbGV0IGRpciA9IF9fZGlybmFtZTtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCA1OyBpKyspIHtcbiAgICBpZiAoZXhpc3RzU3luYyhqb2luKGRpciwgXCJvc3MtZXhwZXJpbWVudGFsXCIsIFwicmVhY3Qtc2VydmVyLWRvbS1lc21cIikpKSByZXR1cm4gZGlyO1xuICAgIGRpciA9IGRpcm5hbWUoZGlyKTtcbiAgfVxuICByZXR1cm4gZGlybmFtZShkaXJuYW1lKF9fZGlybmFtZSkpO1xufVxuY29uc3Qgb3NzRGlyID0gam9pbihmaW5kUGtnUm9vdCgpLCBcIm9zcy1leHBlcmltZW50YWxcIik7XG5cbi8vIExvYWQgcmVhY3Qtc2VydmVyLWRvbS1lc20vc2VydmVyIGZyb20gdmVuZG9yZWQgY29weVxuLy8gVGhlIHZlbmRvcmVkIHBhY2thZ2UuanNvbiBleHBvcnRzIG1hcCBkZWZhdWx0cyB0byBzZXJ2ZXIubm9kZS5qc1xuY29uc3QgdmVuZG9yUmVxdWlyZSA9IGNyZWF0ZVJlcXVpcmUoam9pbihvc3NEaXIsIFwicmVhY3Qtc2VydmVyLWRvbS1lc21cIiwgXCJwYWNrYWdlLmpzb25cIikpO1xuY29uc3QgUmVhY3RET01TZXJ2ZXIgPSB2ZW5kb3JSZXF1aXJlKFwicmVhY3Qtc2VydmVyLWRvbS1lc20vc2VydmVyXCIpIGFzIHR5cGVvZiBpbXBvcnQoXCJyZWFjdC1zZXJ2ZXItZG9tLWVzbS9zZXJ2ZXIubm9kZVwiKTtcblxuLy8gUmVhY3Qgc3RpbGwgY29tZXMgZnJvbSB0aGUgY29uc3VtZXIncyBwcm9qZWN0XG5jb25zdCBwcm9qZWN0Um9vdCA9IHByb2Nlc3MuZW52W1wibnBtX2NvbmZpZ19sb2NhbF9wcmVmaXhcIl0gfHwgcHJvY2Vzcy5jd2QoKTtcbmNvbnN0IHByb2plY3RSZXF1aXJlID0gY3JlYXRlUmVxdWlyZShqb2luKHByb2plY3RSb290LCBcInBhY2thZ2UuanNvblwiKSk7XG5jb25zdCBSZWFjdCA9IHByb2plY3RSZXF1aXJlKFwicmVhY3RcIikgYXMgdHlwZW9mIGltcG9ydChcInJlYWN0XCIpO1xuXG5leHBvcnQgeyBSZWFjdERPTVNlcnZlciwgUmVhY3QgfTtcbmV4cG9ydCB0eXBlICogZnJvbSBcInJlYWN0LXNlcnZlci1kb20tZXNtL3NlcnZlci5ub2RlXCI7XG5leHBvcnQgdHlwZSBSZWFjdCA9IHR5cGVvZiBpbXBvcnQoXCJyZWFjdFwiKTtcbiJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7O0FBS0EsTUFBTSxTQUFZLEdBQUEsT0FBQSxDQUFRLGFBQWMsQ0FBQSxNQUFBLENBQUEsSUFBQSxDQUFZLEdBQUcsQ0FBQyxDQUFBO0FBQ3hELFNBQVMsV0FBc0IsR0FBQTtBQUM3QixFQUFBLElBQUksR0FBTSxHQUFBLFNBQUE7QUFDVixFQUFBLEtBQUEsSUFBUyxDQUFJLEdBQUEsQ0FBQSxFQUFHLENBQUksR0FBQSxDQUFBLEVBQUcsQ0FBSyxFQUFBLEVBQUE7QUFDMUIsSUFBQSxJQUFJLFdBQVcsSUFBSyxDQUFBLEdBQUEsRUFBSyxvQkFBb0Isc0JBQXNCLENBQUMsR0FBVSxPQUFBLEdBQUE7QUFDOUUsSUFBQSxHQUFBLEdBQU0sUUFBUSxHQUFHLENBQUE7QUFBQTtBQUVuQixFQUFPLE9BQUEsT0FBQSxDQUFRLE9BQVEsQ0FBQSxTQUFTLENBQUMsQ0FBQTtBQUNuQztBQUNBLE1BQU0sTUFBUyxHQUFBLElBQUEsQ0FBSyxXQUFZLEVBQUEsRUFBRyxrQkFBa0IsQ0FBQTtBQUlyRCxNQUFNLGdCQUFnQixhQUFjLENBQUEsSUFBQSxDQUFLLE1BQVEsRUFBQSxzQkFBQSxFQUF3QixjQUFjLENBQUMsQ0FBQTtBQUNsRixNQUFBLGNBQUEsR0FBaUIsY0FBYyw2QkFBNkI7QUFHbEUsTUFBTSxjQUFjLE9BQVEsQ0FBQSxHQUFBLENBQUkseUJBQXlCLENBQUEsSUFBSyxRQUFRLEdBQUksRUFBQTtBQUMxRSxNQUFNLGNBQWlCLEdBQUEsYUFBQSxDQUFjLElBQUssQ0FBQSxXQUFBLEVBQWEsY0FBYyxDQUFDLENBQUE7QUFDaEUsTUFBQSxLQUFBLEdBQVEsZUFBZSxPQUFPOzs7OyJ9
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"vendor.static.d.ts","sourceRoot":"","sources":["../../../plugin/vendor/vendor.static.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"vendor.static.d.ts","sourceRoot":"","sources":["../../../plugin/vendor/vendor.static.ts"],"names":[],"mappings":"AAmBA,QAAA,MAAM,cAAc,EAAmD,cAAc,kCAAkC,CAAC,CAAC;AAKzH,QAAA,MAAM,KAAK,EAA8B,cAAc,OAAO,CAAC,CAAC;AAEhE,OAAO,EAAE,cAAc,EAAE,KAAK,EAAE,CAAC"}
|
|
@@ -19,10 +19,10 @@ function findPkgRoot() {
|
|
|
19
19
|
}
|
|
20
20
|
const ossDir = join(findPkgRoot(), "oss-experimental");
|
|
21
21
|
const vendorRequire = createRequire(join(ossDir, "react-server-dom-esm", "package.json"));
|
|
22
|
-
const ReactDOMServer = vendorRequire(
|
|
22
|
+
const ReactDOMServer = vendorRequire("react-server-dom-esm/static");
|
|
23
23
|
const projectRoot = process.env["npm_config_local_prefix"] || process.cwd();
|
|
24
24
|
const projectRequire = createRequire(join(projectRoot, "package.json"));
|
|
25
25
|
const React = projectRequire("react");
|
|
26
26
|
|
|
27
27
|
export { React, ReactDOMServer };
|
|
28
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,
|
|
28
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmVuZG9yLnN0YXRpYy5qcyIsInNvdXJjZXMiOlsiLi4vLi4vLi4vcGx1Z2luL3ZlbmRvci92ZW5kb3Iuc3RhdGljLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGNyZWF0ZVJlcXVpcmUgfSBmcm9tIFwibm9kZTptb2R1bGVcIjtcbmltcG9ydCB7IGRpcm5hbWUsIGpvaW4gfSBmcm9tIFwibm9kZTpwYXRoXCI7XG5pbXBvcnQgeyBmaWxlVVJMVG9QYXRoIH0gZnJvbSBcIm5vZGU6dXJsXCI7XG5pbXBvcnQgeyBleGlzdHNTeW5jIH0gZnJvbSBcIm5vZGU6ZnNcIjtcblxuY29uc3QgX19kaXJuYW1lID0gZGlybmFtZShmaWxlVVJMVG9QYXRoKGltcG9ydC5tZXRhLnVybCkpO1xuZnVuY3Rpb24gZmluZFBrZ1Jvb3QoKTogc3RyaW5nIHtcbiAgbGV0IGRpciA9IF9fZGlybmFtZTtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCA1OyBpKyspIHtcbiAgICBpZiAoZXhpc3RzU3luYyhqb2luKGRpciwgXCJvc3MtZXhwZXJpbWVudGFsXCIsIFwicmVhY3Qtc2VydmVyLWRvbS1lc21cIikpKSByZXR1cm4gZGlyO1xuICAgIGRpciA9IGRpcm5hbWUoZGlyKTtcbiAgfVxuICByZXR1cm4gZGlybmFtZShkaXJuYW1lKF9fZGlybmFtZSkpO1xufVxuY29uc3Qgb3NzRGlyID0gam9pbihmaW5kUGtnUm9vdCgpLCBcIm9zcy1leHBlcmltZW50YWxcIik7XG5cbi8vIExvYWQgcmVhY3Qtc2VydmVyLWRvbS1lc20vc3RhdGljIGZyb20gdmVuZG9yZWQgY29weVxuLy8gVGhlIHZlbmRvcmVkIHBhY2thZ2UuanNvbiBleHBvcnRzIG1hcCBkZWZhdWx0cyB0byBzdGF0aWMubm9kZS5qc1xuY29uc3QgdmVuZG9yUmVxdWlyZSA9IGNyZWF0ZVJlcXVpcmUoam9pbihvc3NEaXIsIFwicmVhY3Qtc2VydmVyLWRvbS1lc21cIiwgXCJwYWNrYWdlLmpzb25cIikpO1xuY29uc3QgUmVhY3RET01TZXJ2ZXIgPSB2ZW5kb3JSZXF1aXJlKFwicmVhY3Qtc2VydmVyLWRvbS1lc20vc3RhdGljXCIpIGFzIHR5cGVvZiBpbXBvcnQoXCJyZWFjdC1zZXJ2ZXItZG9tLWVzbS9zdGF0aWMubm9kZVwiKTtcblxuLy8gUmVhY3Qgc3RpbGwgY29tZXMgZnJvbSB0aGUgY29uc3VtZXIncyBwcm9qZWN0XG5jb25zdCBwcm9qZWN0Um9vdCA9IHByb2Nlc3MuZW52W1wibnBtX2NvbmZpZ19sb2NhbF9wcmVmaXhcIl0gfHwgcHJvY2Vzcy5jd2QoKTtcbmNvbnN0IHByb2plY3RSZXF1aXJlID0gY3JlYXRlUmVxdWlyZShqb2luKHByb2plY3RSb290LCBcInBhY2thZ2UuanNvblwiKSk7XG5jb25zdCBSZWFjdCA9IHByb2plY3RSZXF1aXJlKFwicmVhY3RcIikgYXMgdHlwZW9mIGltcG9ydChcInJlYWN0XCIpO1xuXG5leHBvcnQgeyBSZWFjdERPTVNlcnZlciwgUmVhY3QgfTtcbiJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7O0FBS0EsTUFBTSxTQUFZLEdBQUEsT0FBQSxDQUFRLGFBQWMsQ0FBQSxNQUFBLENBQUEsSUFBQSxDQUFZLEdBQUcsQ0FBQyxDQUFBO0FBQ3hELFNBQVMsV0FBc0IsR0FBQTtBQUM3QixFQUFBLElBQUksR0FBTSxHQUFBLFNBQUE7QUFDVixFQUFBLEtBQUEsSUFBUyxDQUFJLEdBQUEsQ0FBQSxFQUFHLENBQUksR0FBQSxDQUFBLEVBQUcsQ0FBSyxFQUFBLEVBQUE7QUFDMUIsSUFBQSxJQUFJLFdBQVcsSUFBSyxDQUFBLEdBQUEsRUFBSyxvQkFBb0Isc0JBQXNCLENBQUMsR0FBVSxPQUFBLEdBQUE7QUFDOUUsSUFBQSxHQUFBLEdBQU0sUUFBUSxHQUFHLENBQUE7QUFBQTtBQUVuQixFQUFPLE9BQUEsT0FBQSxDQUFRLE9BQVEsQ0FBQSxTQUFTLENBQUMsQ0FBQTtBQUNuQztBQUNBLE1BQU0sTUFBUyxHQUFBLElBQUEsQ0FBSyxXQUFZLEVBQUEsRUFBRyxrQkFBa0IsQ0FBQTtBQUlyRCxNQUFNLGdCQUFnQixhQUFjLENBQUEsSUFBQSxDQUFLLE1BQVEsRUFBQSxzQkFBQSxFQUF3QixjQUFjLENBQUMsQ0FBQTtBQUNsRixNQUFBLGNBQUEsR0FBaUIsY0FBYyw2QkFBNkI7QUFHbEUsTUFBTSxjQUFjLE9BQVEsQ0FBQSxHQUFBLENBQUkseUJBQXlCLENBQUEsSUFBSyxRQUFRLEdBQUksRUFBQTtBQUMxRSxNQUFNLGNBQWlCLEdBQUEsYUFBQSxDQUFjLElBQUssQ0FBQSxXQUFBLEVBQWEsY0FBYyxDQUFDLENBQUE7QUFDaEUsTUFBQSxLQUFBLEdBQVEsZUFBZSxPQUFPOzs7OyJ9
|