vite-plugin-react-server
Version:
Vite plugin for React Server Components (RSC)
114 lines (111 loc) • 15.8 kB
JavaScript
/**
* vite-plugin-react-server
* Copyright (c) Nico Brinkkemper
* MIT License
*/
import { createRenderToPipeableStreamHandler } from './createRenderToPipeableStreamHandler.server.js';
import { assertReactServer } from '../config/getCondition.js';
import { validateRscStreamOptions, createBaseRscStreamResult, handleRscStreamError } from './createRscStream.utils.js';
import { createStreamMetrics } from '../metrics/createStreamMetrics.js';
import { createRscWorkerStream } from './createRscWorkerStream.js';
assertReactServer();
const createRscStream = function _createRscStreamServer(options) {
const logger = options.logger;
const verbose = options.verbose || false;
validateRscStreamOptions(options, "createRscStream.server");
if (verbose) {
logger?.info(
`[createRscStream.server:${options.route}] Creating RSC stream for route: ${options.route}`
);
}
try {
if (verbose) {
logger?.info(`[createRscStream.server:${options.route}] Checking for rscWorker: ${!!options.rscWorker}`);
}
if (options.rscWorker) {
if (verbose) {
logger?.info(
`[createRscStream.server:${options.route}] Using worker-based RSC stream`
);
}
const workerStreamResult = createRscWorkerStream({
worker: options.rscWorker,
route: options.route,
url: options.url,
moduleBasePath: options.moduleBasePath,
moduleBaseURL: options.moduleBaseURL,
moduleRootPath: options.moduleRootPath,
projectRoot: options.projectRoot,
verbose,
logger,
panicThreshold: options.panicThreshold,
rscTimeout: options.rscTimeout,
serverPipeableStreamOptions: options.serverPipeableStreamOptions,
build: options.build,
pagePath: options.pagePath,
propsPath: options.propsPath,
rootPath: options.rootPath,
htmlPath: options.htmlPath
});
const { stream: workerStream, dataPort1, controlPort1 } = workerStreamResult;
const serverResult2 = {
type: "server",
rscStream: workerStream,
id: options.id || options.route,
pipe: (destination) => {
workerStream.pipe(destination);
return destination;
},
abort: () => {
try {
workerStream.destroy();
} catch (error) {
}
try {
dataPort1.onmessage = null;
controlPort1.onmessage = null;
dataPort1.close();
controlPort1.close();
} catch (error) {
}
},
metrics: createStreamMetrics()
// Worker will provide real metrics
};
return serverResult2;
}
const result = createRenderToPipeableStreamHandler(options);
if (!result || typeof result.pipe !== "function") {
throw new Error(
"createHandler returned invalid result - missing pipe function"
);
}
if (!result.rscStream) {
throw new Error(
"createHandler returned invalid result - missing stream"
);
}
const baseResult = createBaseRscStreamResult(
result.rscStream,
result.pipe,
result.abort,
result.metrics,
options.id || options.route
);
const serverResult = {
...baseResult,
type: "server"
};
if (verbose) {
logger?.info(
`[createRscStream.server:${options.route}] RSC stream created successfully`
);
}
return serverResult;
} catch (error) {
handleRscStreamError(error, options, "RSC stream creation error");
throw error;
}
};
export { createRscStream };
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3JlYXRlUnNjU3RyZWFtLnNlcnZlci5qcyIsInNvdXJjZXMiOlsiLi4vLi4vLi4vcGx1Z2luL3N0cmVhbS9jcmVhdGVSc2NTdHJlYW0uc2VydmVyLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGNyZWF0ZVJlbmRlclRvUGlwZWFibGVTdHJlYW1IYW5kbGVyIH0gZnJvbSBcIi4vY3JlYXRlUmVuZGVyVG9QaXBlYWJsZVN0cmVhbUhhbmRsZXIuc2VydmVyLmpzXCI7XG5pbXBvcnQgdHlwZSB7XG4gIENyZWF0ZVJzY1N0cmVhbUZuLFxuICBTZXJ2ZXJSc2NTdHJlYW1SZXN1bHQsXG59IGZyb20gXCIuL2NyZWF0ZVJzY1N0cmVhbS50eXBlcy5qc1wiO1xuaW1wb3J0IHsgYXNzZXJ0UmVhY3RTZXJ2ZXIgfSBmcm9tIFwiLi4vY29uZmlnL2dldENvbmRpdGlvbi5qc1wiO1xuaW1wb3J0IHtcbiAgdmFsaWRhdGVSc2NTdHJlYW1PcHRpb25zLFxuICBjcmVhdGVCYXNlUnNjU3RyZWFtUmVzdWx0LFxuICBoYW5kbGVSc2NTdHJlYW1FcnJvcixcbn0gZnJvbSBcIi4vY3JlYXRlUnNjU3RyZWFtLnV0aWxzLmpzXCI7XG5cbmltcG9ydCB7IGNyZWF0ZVN0cmVhbU1ldHJpY3MgfSBmcm9tIFwiLi4vbWV0cmljcy9jcmVhdGVTdHJlYW1NZXRyaWNzLmpzXCI7XG5pbXBvcnQgeyBjcmVhdGVSc2NXb3JrZXJTdHJlYW0gfSBmcm9tIFwiLi9jcmVhdGVSc2NXb3JrZXJTdHJlYW0uanNcIjtcblxuYXNzZXJ0UmVhY3RTZXJ2ZXIoKTtcblxuLyoqXG4gKiBDcmVhdGVzIGFuIFJTQyBzdHJlYW0gdXNpbmcgdGhlIHNlcnZlci1zaWRlIHJlbmRlciBoYW5kbGVyLlxuICpcbiAqICoqUHVycG9zZSoqOiBDcmVhdGVzIFJTQyBzdHJlYW1zIGRpcmVjdGx5IGluIHRoZSBzZXJ2ZXIgZW52aXJvbm1lbnQgd2l0aG91dCB3b3JrZXIgdGhyZWFkcy5cbiAqICoqV2hlbiB0byB1c2UqKjpcbiAqIC0gWW91J3JlIGluIGEgc2VydmVyIGVudmlyb25tZW50IChOb2RlLmpzIHNlcnZlcilcbiAqIC0gWW91IHdhbnQgdG8gY3JlYXRlIFJTQyBzdHJlYW1zIHN5bmNocm9ub3VzbHkgd2l0aG91dCB3b3JrZXIgb3ZlcmhlYWRcbiAqIC0gWW91IG5lZWQgUlNDIHN0cmVhbXMgZm9yIHNlcnZlci1zaWRlIHJlbmRlcmluZyBvciBBUEkgcmVzcG9uc2VzXG4gKiAtIFlvdSdyZSBpbiBhIGRldmVsb3BtZW50IHNlcnZlciBhbmQgd2FudCBkaXJlY3QgUlNDIGdlbmVyYXRpb25cbiAqXG4gKiAqKkZsb3cqKjogUm91dGUgKyBDb21wb25lbnRzIOKGkiBSU0MgU3RyZWFtIChkaXJlY3Qgc2VydmVyIHJlbmRlcmluZylcbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgdHlwZXNjcmlwdFxuICogLy8gQ3JlYXRlIFJTQyBzdHJlYW0gZm9yIHNlcnZlci1zaWRlIHJlbmRlcmluZ1xuICogY29uc3QgcnNjU3RyZWFtID0gY3JlYXRlUnNjU3RyZWFtKHtcbiAqICAgcm91dGU6IFwiL2FwaS9kYXRhXCIsXG4gKiAgIFBhZ2VDb21wb25lbnQ6IERhdGFQYWdlLFxuICogICBSb290Q29tcG9uZW50OiBSb290TGF5b3V0LFxuICogICBIdG1sQ29tcG9uZW50OiBSZWFjdC5GcmFnbWVudCwgLy8gSGVhZGxlc3MgZm9yIEFQSVxuICogICBwYWdlUHJvcHM6IHsgZGF0YTogYXBpRGF0YSB9LFxuICogICBsb2dnZXI6IG15TG9nZ2VyLFxuICogfSk7XG4gKlxuICogLy8gUGlwZSB0byByZXNwb25zZVxuICogcnNjU3RyZWFtLnBpcGUocmVzcG9uc2UpO1xuICogYGBgXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIC8vIENyZWF0ZSBmdWxsIFJTQyB3aXRoIEhUTUwgd3JhcHBlclxuICogY29uc3QgcnNjRnVsbCA9IGNyZWF0ZVJzY1N0cmVhbSh7XG4gKiAgIHJvdXRlOiBcIi9hYm91dFwiLFxuICogICBQYWdlQ29tcG9uZW50OiBBYm91dFBhZ2UsXG4gKiAgIFJvb3RDb21wb25lbnQ6IFJvb3RMYXlvdXQsXG4gKiAgIEh0bWxDb21wb25lbnQ6IEh0bWxEb2N1bWVudCwgLy8gRnVsbCBIVE1MIHdyYXBwZXJcbiAqICAgcGFnZVByb3BzOiB7IHRpdGxlOiBcIkFib3V0IFVzXCIgfSxcbiAqIH0pO1xuICogYGBgXG4gKlxuICogQHBhcmFtIG9wdGlvbnMgLSBPcHRpb25zIGZvciBSU0Mgc3RyZWFtIGNyZWF0aW9uXG4gKiBAcmV0dXJucyBSU0Mgc3RyZWFtIHdpdGggcGlwZS9hYm9ydCBpbnRlcmZhY2VcbiAqL1xuZXhwb3J0IGNvbnN0IGNyZWF0ZVJzY1N0cmVhbTogQ3JlYXRlUnNjU3RyZWFtRm48XCJzZXJ2ZXJcIj4gPVxuICBmdW5jdGlvbiBfY3JlYXRlUnNjU3RyZWFtU2VydmVyKG9wdGlvbnMpIHtcbiAgICBjb25zdCBsb2dnZXIgPSBvcHRpb25zLmxvZ2dlcjtcbiAgICBjb25zdCB2ZXJib3NlID0gb3B0aW9ucy52ZXJib3NlIHx8IGZhbHNlO1xuXG4gICAgLy8gVmFsaWRhdGUgY29tbW9uIG9wdGlvbnNcbiAgICB2YWxpZGF0ZVJzY1N0cmVhbU9wdGlvbnMob3B0aW9ucywgXCJjcmVhdGVSc2NTdHJlYW0uc2VydmVyXCIpO1xuXG4gICAgaWYgKHZlcmJvc2UpIHtcbiAgICAgIGxvZ2dlcj8uaW5mbyhcbiAgICAgICAgYFtjcmVhdGVSc2NTdHJlYW0uc2VydmVyOiR7b3B0aW9ucy5yb3V0ZX1dIENyZWF0aW5nIFJTQyBzdHJlYW0gZm9yIHJvdXRlOiAke29wdGlvbnMucm91dGV9YFxuICAgICAgKTtcbiAgICB9XG5cbiAgICB0cnkge1xuICAgICAgLy8gSWYgd29ya2VyIGlzIHByb3ZpZGVkLCB1c2Ugd29ya2VyLWJhc2VkIFJTQyBzdHJlYW1cbiAgICAgIC8vIG5vdGU6IGRvbid0IHVzZSB0aGUgbWFpbiBcIndvcmtlclwiIHByb3AgaGVyZSwgd2hpY2ggaXMgYWx3YXlzIHRoZSBpbnZlcnNlIHdvcmtlciAoaHRtbC13b3JrZXIgaW4gc2VydmVyIGNhc2UpXG4gICAgICBpZiAodmVyYm9zZSkge1xuICAgICAgICBsb2dnZXI/LmluZm8oYFtjcmVhdGVSc2NTdHJlYW0uc2VydmVyOiR7b3B0aW9ucy5yb3V0ZX1dIENoZWNraW5nIGZvciByc2NXb3JrZXI6ICR7ISFvcHRpb25zLnJzY1dvcmtlcn1gKTtcbiAgICAgIH1cbiAgICAgIGlmIChvcHRpb25zLnJzY1dvcmtlcikge1xuICAgICAgICBpZiAodmVyYm9zZSkge1xuICAgICAgICAgIGxvZ2dlcj8uaW5mbyhcbiAgICAgICAgICAgIGBbY3JlYXRlUnNjU3RyZWFtLnNlcnZlcjoke29wdGlvbnMucm91dGV9XSBVc2luZyB3b3JrZXItYmFzZWQgUlNDIHN0cmVhbWBcbiAgICAgICAgICApO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3Qgd29ya2VyU3RyZWFtUmVzdWx0ID0gY3JlYXRlUnNjV29ya2VyU3RyZWFtKHtcbiAgICAgICAgICB3b3JrZXI6IG9wdGlvbnMucnNjV29ya2VyLFxuICAgICAgICAgIHJvdXRlOiBvcHRpb25zLnJvdXRlLFxuICAgICAgICAgIHVybDogb3B0aW9ucy51cmwsXG4gICAgICAgICAgbW9kdWxlQmFzZVBhdGg6IG9wdGlvbnMubW9kdWxlQmFzZVBhdGgsXG4gICAgICAgICAgbW9kdWxlQmFzZVVSTDogb3B0aW9ucy5tb2R1bGVCYXNlVVJMLFxuICAgICAgICAgIG1vZHVsZVJvb3RQYXRoOiBvcHRpb25zLm1vZHVsZVJvb3RQYXRoLFxuICAgICAgICAgIHByb2plY3RSb290OiBvcHRpb25zLnByb2plY3RSb290LFxuICAgICAgICAgIHZlcmJvc2UsXG4gICAgICAgICAgbG9nZ2VyLFxuICAgICAgICAgIHBhbmljVGhyZXNob2xkOiBvcHRpb25zLnBhbmljVGhyZXNob2xkLFxuICAgICAgICAgIHJzY1RpbWVvdXQ6IG9wdGlvbnMucnNjVGltZW91dCxcbiAgICAgICAgICBzZXJ2ZXJQaXBlYWJsZVN0cmVhbU9wdGlvbnM6IG9wdGlvbnMuc2VydmVyUGlwZWFibGVTdHJlYW1PcHRpb25zLFxuICAgICAgICAgIGJ1aWxkOiBvcHRpb25zLmJ1aWxkLFxuICAgICAgICAgIHBhZ2VQYXRoOiBvcHRpb25zLnBhZ2VQYXRoLFxuICAgICAgICAgIHByb3BzUGF0aDogb3B0aW9ucy5wcm9wc1BhdGgsXG4gICAgICAgICAgcm9vdFBhdGg6IG9wdGlvbnMucm9vdFBhdGgsXG4gICAgICAgICAgaHRtbFBhdGg6IG9wdGlvbnMuaHRtbFBhdGgsXG4gICAgICAgIH0pO1xuXG4gICAgICAgIGNvbnN0IHsgc3RyZWFtOiB3b3JrZXJTdHJlYW0sIGRhdGFQb3J0MSwgY29udHJvbFBvcnQxIH0gPSB3b3JrZXJTdHJlYW1SZXN1bHQ7XG5cbiAgICAgICAgLy8gUmV0dXJuIHdvcmtlciBzdHJlYW0gd2l0aCBjb25zaXN0ZW50IGludGVyZmFjZVxuICAgICAgICBjb25zdCBzZXJ2ZXJSZXN1bHQ6IFNlcnZlclJzY1N0cmVhbVJlc3VsdCA9IHtcbiAgICAgICAgICB0eXBlOiBcInNlcnZlclwiIGFzIGNvbnN0LFxuICAgICAgICAgIHJzY1N0cmVhbTogd29ya2VyU3RyZWFtLFxuICAgICAgICAgIGlkOiBvcHRpb25zLmlkIHx8IG9wdGlvbnMucm91dGUsXG4gICAgICAgICAgcGlwZTogPFdyaXRhYmxlIGV4dGVuZHMgTm9kZUpTLldyaXRhYmxlU3RyZWFtPihcbiAgICAgICAgICAgIGRlc3RpbmF0aW9uOiBXcml0YWJsZVxuICAgICAgICAgICkgPT4ge1xuICAgICAgICAgICAgd29ya2VyU3RyZWFtLnBpcGUoZGVzdGluYXRpb24pO1xuICAgICAgICAgICAgcmV0dXJuIGRlc3RpbmF0aW9uO1xuICAgICAgICAgIH0sXG4gICAgICAgICAgYWJvcnQ6ICgpID0+IHtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgIHdvcmtlclN0cmVhbS5kZXN0cm95KCk7XG4gICAgICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgICAvLyBTdHJlYW0gbWF5IGFscmVhZHkgYmUgZGVzdHJveWVkLCBpZ25vcmVcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIENsZWFuIHVwIE1lc3NhZ2VQb3J0IGxpc3RlbmVycyB0byBwcmV2ZW50IG1lbW9yeSBsZWFrc1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgLy8gUmVtb3ZlIG9ubWVzc2FnZSBoYW5kbGVycyAocHJvcGVydHkgYXNzaWdubWVudCBjbGVhbnVwKVxuICAgICAgICAgICAgICBkYXRhUG9ydDEub25tZXNzYWdlID0gbnVsbDtcbiAgICAgICAgICAgICAgY29udHJvbFBvcnQxLm9ubWVzc2FnZSA9IG51bGw7XG4gICAgICAgICAgICAgIC8vIENsb3NlIE1lc3NhZ2VQb3J0c1xuICAgICAgICAgICAgICBkYXRhUG9ydDEuY2xvc2UoKTtcbiAgICAgICAgICAgICAgY29udHJvbFBvcnQxLmNsb3NlKCk7XG4gICAgICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgICAvLyBJZ25vcmUgY2xlYW51cCBlcnJvcnNcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9LFxuICAgICAgICAgIG1ldHJpY3M6IGNyZWF0ZVN0cmVhbU1ldHJpY3MoKSwgLy8gV29ya2VyIHdpbGwgcHJvdmlkZSByZWFsIG1ldHJpY3NcbiAgICAgICAgfTtcblxuICAgICAgICByZXR1cm4gc2VydmVyUmVzdWx0O1xuICAgICAgfVxuXG4gICAgICAvLyBPdGhlcndpc2UsIHVzZSBkaXJlY3Qgc2VydmVyIHJlbmRlcmluZ1xuICAgICAgY29uc3QgcmVzdWx0ID0gY3JlYXRlUmVuZGVyVG9QaXBlYWJsZVN0cmVhbUhhbmRsZXIob3B0aW9ucyk7XG5cbiAgICAgIC8vIFZhbGlkYXRlIHRoZSByZXN1bHRcbiAgICAgIGlmICghcmVzdWx0IHx8IHR5cGVvZiByZXN1bHQucGlwZSAhPT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICBcImNyZWF0ZUhhbmRsZXIgcmV0dXJuZWQgaW52YWxpZCByZXN1bHQgLSBtaXNzaW5nIHBpcGUgZnVuY3Rpb25cIlxuICAgICAgICApO1xuICAgICAgfVxuXG4gICAgICBpZiAoIXJlc3VsdC5yc2NTdHJlYW0pIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgIFwiY3JlYXRlSGFuZGxlciByZXR1cm5lZCBpbnZhbGlkIHJlc3VsdCAtIG1pc3Npbmcgc3RyZWFtXCJcbiAgICAgICAgKTtcbiAgICAgIH1cblxuICAgICAgLy8gQ3JlYXRlIGJhc2UgcmVzdWx0IHN0cnVjdHVyZVxuICAgICAgY29uc3QgYmFzZVJlc3VsdCA9IGNyZWF0ZUJhc2VSc2NTdHJlYW1SZXN1bHQoXG4gICAgICAgIHJlc3VsdC5yc2NTdHJlYW0sXG4gICAgICAgIHJlc3VsdC5waXBlLFxuICAgICAgICByZXN1bHQuYWJvcnQsXG4gICAgICAgIHJlc3VsdC5tZXRyaWNzLFxuICAgICAgICBvcHRpb25zLmlkIHx8IG9wdGlvbnMucm91dGVcbiAgICAgICk7XG5cbiAgICAgIC8vIFJldHVybiBzZXJ2ZXItc3BlY2lmaWMgcmVzdWx0c1xuICAgICAgY29uc3Qgc2VydmVyUmVzdWx0OiBTZXJ2ZXJSc2NTdHJlYW1SZXN1bHQgPSB7XG4gICAgICAgIC4uLmJhc2VSZXN1bHQsXG4gICAgICAgIHR5cGU6IFwic2VydmVyXCIgYXMgY29uc3QsXG4gICAgICB9O1xuXG4gICAgICBpZiAodmVyYm9zZSkge1xuICAgICAgICBsb2dnZXI/LmluZm8oXG4gICAgICAgICAgYFtjcmVhdGVSc2NTdHJlYW0uc2VydmVyOiR7b3B0aW9ucy5yb3V0ZX1dIFJTQyBzdHJlYW0gY3JlYXRlZCBzdWNjZXNzZnVsbHlgXG4gICAgICAgICk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBzZXJ2ZXJSZXN1bHQ7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGhhbmRsZVJzY1N0cmVhbUVycm9yKGVycm9yLCBvcHRpb25zLCBcIlJTQyBzdHJlYW0gY3JlYXRpb24gZXJyb3JcIik7XG4gICAgICAvLyBUaGlzIHdpbGwgbmV2ZXIgYmUgcmVhY2hlZCBhcyBoYW5kbGVSc2NTdHJlYW1FcnJvciBlaXRoZXIgdGhyb3dzIG9yIHJlLXRocm93c1xuICAgICAgdGhyb3cgZXJyb3I7XG4gICAgfVxuICB9O1xuIl0sIm5hbWVzIjpbInNlcnZlclJlc3VsdCJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7QUFlQSxpQkFBa0IsRUFBQTtBQTZDTCxNQUFBLGVBQUEsR0FDWCxTQUFTLHNCQUFBLENBQXVCLE9BQVMsRUFBQTtBQUN2QyxFQUFBLE1BQU0sU0FBUyxPQUFRLENBQUEsTUFBQTtBQUN2QixFQUFNLE1BQUEsT0FBQSxHQUFVLFFBQVEsT0FBVyxJQUFBLEtBQUE7QUFHbkMsRUFBQSx3QkFBQSxDQUF5QixTQUFTLHdCQUF3QixDQUFBO0FBRTFELEVBQUEsSUFBSSxPQUFTLEVBQUE7QUFDWCxJQUFRLE1BQUEsRUFBQSxJQUFBO0FBQUEsTUFDTixDQUEyQix3QkFBQSxFQUFBLE9BQUEsQ0FBUSxLQUFLLENBQUEsaUNBQUEsRUFBb0MsUUFBUSxLQUFLLENBQUE7QUFBQSxLQUMzRjtBQUFBO0FBR0YsRUFBSSxJQUFBO0FBR0YsSUFBQSxJQUFJLE9BQVMsRUFBQTtBQUNYLE1BQVEsTUFBQSxFQUFBLElBQUEsQ0FBSywyQkFBMkIsT0FBUSxDQUFBLEtBQUssNkJBQTZCLENBQUMsQ0FBQyxPQUFRLENBQUEsU0FBUyxDQUFFLENBQUEsQ0FBQTtBQUFBO0FBRXpHLElBQUEsSUFBSSxRQUFRLFNBQVcsRUFBQTtBQUNyQixNQUFBLElBQUksT0FBUyxFQUFBO0FBQ1gsUUFBUSxNQUFBLEVBQUEsSUFBQTtBQUFBLFVBQ04sQ0FBQSx3QkFBQSxFQUEyQixRQUFRLEtBQUssQ0FBQSwrQkFBQTtBQUFBLFNBQzFDO0FBQUE7QUFHRixNQUFBLE1BQU0scUJBQXFCLHFCQUFzQixDQUFBO0FBQUEsUUFDL0MsUUFBUSxPQUFRLENBQUEsU0FBQTtBQUFBLFFBQ2hCLE9B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