vite-plugin-react-server
Version:
Vite plugin for React Server Components (RSC)
121 lines (118 loc) • 13.8 kB
JavaScript
/**
* vite-plugin-react-server
* Copyright (c) Nico Brinkkemper
* MIT License
*/
import { PassThrough } from 'node:stream';
import { toError } from '../error/toError.js';
import { createMessageChannels } from './createMessageChannels.js';
function createRscWorkerStream(options) {
const {
worker,
route,
url,
projectRoot,
verbose = false,
logger,
panicThreshold,
serverPipeableStreamOptions,
onError,
rscTimeout,
build,
pagePath,
propsPath,
rootPath,
htmlPath
} = options;
const { dataPort1, dataPort2, controlPort1, controlPort2 } = createMessageChannels();
const rscStream = new PassThrough({
objectMode: false,
highWaterMark: 64 * 1024
// 64KB buffer
});
dataPort1.onmessage = (event) => {
const data = event.data;
if (data === null) {
if (verbose) {
logger?.info(`[createRscWorkerStream] End of RSC stream via dataPort`);
}
rscStream.end();
} else {
if (verbose) {
logger?.info(`[createRscWorkerStream] Writing raw RSC data to stream: ${data.length} bytes`);
}
rscStream.write(data);
}
};
controlPort1.onmessage = (event) => {
const message = event.data;
if (verbose) {
logger?.info(`[createRscWorkerStream] Received control message: ${message.type}`);
}
switch (message.type) {
case "RSC_END":
if (verbose) {
logger?.info(`[createRscWorkerStream] RSC stream ended by control message`);
}
rscStream.end();
break;
case "ERROR":
if (verbose) {
logger?.error(`[createRscWorkerStream] RSC stream error: ${message.error?.message}`, { error: message.error });
}
const error = toError(message.error);
rscStream.destroy(error);
if (onError) {
onError(error);
}
break;
case "METRICS":
if (verbose) {
logger?.info(`[createRscWorkerStream] Received metrics:`, message.metrics);
}
break;
case "RSC_RENDER_START":
if (verbose) {
logger?.info(`[createRscWorkerStream] RSC render started`);
}
break;
default:
if (verbose) {
logger?.warn(`[createRscWorkerStream] Unknown control message type: ${message.type}`);
}
}
};
worker.postMessage({
type: "INIT",
id: route,
dataPort: dataPort2,
controlPort: controlPort2,
options: {
route,
url,
projectRoot,
panicThreshold,
rscTimeout,
serverPipeableStreamOptions,
pagePath,
propsPath,
rootPath,
htmlPath,
build: build ? {
outDir: build.outDir,
assetsDir: build.assetsDir,
pages: build.pages,
static: build.static,
rscOutputPath: build.rscOutputPath,
htmlOutputPath: build.htmlOutputPath
} : void 0
}
}, [dataPort2, controlPort2]);
return {
stream: rscStream,
dataPort1,
controlPort1
};
}
export { createRscWorkerStream };
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3JlYXRlUnNjV29ya2VyU3RyZWFtLmpzIiwic291cmNlcyI6WyIuLi8uLi8uLi9wbHVnaW4vc3RyZWFtL2NyZWF0ZVJzY1dvcmtlclN0cmVhbS50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgdHlwZSB7IFdvcmtlciB9IGZyb20gXCJub2RlOndvcmtlcl90aHJlYWRzXCI7XG5pbXBvcnQgdHlwZSB7IExvZ2dlciB9IGZyb20gXCJ2aXRlXCI7XG5pbXBvcnQgeyBQYXNzVGhyb3VnaCB9IGZyb20gXCJub2RlOnN0cmVhbVwiO1xuaW1wb3J0IHR5cGUgeyBTZXJpYWxpemVhYmxlUmVuZGVyVG9QaXBlYWJsZVN0cmVhbU9wdGlvbnMgfSBmcm9tIFwiLi4vd29ya2VyL3JzYy90eXBlcy5qc1wiO1xuaW1wb3J0IHsgdG9FcnJvciB9IGZyb20gXCIuLi9lcnJvci90b0Vycm9yLmpzXCI7XG5pbXBvcnQgeyBjcmVhdGVNZXNzYWdlQ2hhbm5lbHMgfSBmcm9tIFwiLi9jcmVhdGVNZXNzYWdlQ2hhbm5lbHMuanNcIjtcblxuLyoqXG4gKiBSU0Mtc3BlY2lmaWMgb3B0aW9ucyBmb3Igd29ya2VyIHN0cmVhbVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFJzY1dvcmtlclN0cmVhbU9wdGlvbnMge1xuICB3b3JrZXI6IFdvcmtlcjtcbiAgcm91dGU6IHN0cmluZztcbiAgdXJsOiBzdHJpbmc7XG4gIHByb2plY3RSb290OiBzdHJpbmc7XG4gIG1vZHVsZUJhc2VQYXRoOiBzdHJpbmc7XG4gIG1vZHVsZUJhc2VVUkw6IHN0cmluZztcbiAgbW9kdWxlUm9vdFBhdGg6IHN0cmluZztcbiAgc2VydmVyUGlwZWFibGVTdHJlYW1PcHRpb25zOiBTZXJpYWxpemVhYmxlUmVuZGVyVG9QaXBlYWJsZVN0cmVhbU9wdGlvbnM7XG4gIHZlcmJvc2U/OiBib29sZWFuO1xuICBsb2dnZXI/OiBMb2dnZXI7XG4gIHBhbmljVGhyZXNob2xkPzogYW55O1xuICBvbkVycm9yPzogKGVycm9yOiBFcnJvciwgZXJyb3JJbmZvPzogYW55KSA9PiB2b2lkO1xuICBcbiAgLy8gUlNDLXNwZWNpZmljIG9wdGlvbnNcbiAgcnNjVGltZW91dD86IG51bWJlcjtcbiAgYnVpbGQ/OiBhbnk7XG4gIHBhZ2VQYXRoPzogc3RyaW5nO1xuICBwcm9wc1BhdGg/OiBzdHJpbmc7XG4gIHJvb3RQYXRoPzogc3RyaW5nO1xuICBodG1sUGF0aD86IHN0cmluZztcbn1cblxuLyoqXG4gKiBDcmVhdGVzIGFuIFJTQyB3b3JrZXIgc3RyZWFtIHVzaW5nIHRoZSB0d28tcG9ydCBhcmNoaXRlY3R1cmVcbiAqIFxuICogVGhpcyBmdW5jdGlvbiBjcmVhdGVzIFJTQyBzdHJlYW1zIGJ5IG9mZmxvYWRpbmcgUmVhY3QgcmVuZGVyaW5nIHRvIGEgc2VwYXJhdGUgd29ya2VyIHRocmVhZFxuICogdXNpbmcgdGhlIHR3by1wb3J0IGFyY2hpdGVjdHVyZSAoZGF0YSBwb3J0ICsgY29udHJvbCBwb3J0KSBmb3IgY2xlYW4gc2VwYXJhdGlvbiBvZiBjb25jZXJucy5cbiAqIFxuICogKipGbG93Kio6IFJvdXRlICsgQ29tcG9uZW50cyDihpIgUlNDIFdvcmtlciAodHdvLXBvcnQpIOKGkiBSU0MgU3RyZWFtXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVSc2NXb3JrZXJTdHJlYW0ob3B0aW9uczogUnNjV29ya2VyU3RyZWFtT3B0aW9ucyk6IHtcbiAgc3RyZWFtOiBQYXNzVGhyb3VnaDtcbiAgZGF0YVBvcnQxOiBhbnk7XG4gIGNvbnRyb2xQb3J0MTogYW55O1xufSB7XG4gIGNvbnN0IHtcbiAgICB3b3JrZXIsXG4gICAgcm91dGUsXG4gICAgdXJsLFxuICAgIHByb2plY3RSb290LFxuICAgIHZlcmJvc2UgPSBmYWxzZSxcbiAgICBsb2dnZXIsXG4gICAgcGFuaWNUaHJlc2hvbGQsXG4gICAgc2VydmVyUGlwZWFibGVTdHJlYW1PcHRpb25zLFxuICAgIG9uRXJyb3IsXG4gICAgcnNjVGltZW91dCxcbiAgICBidWlsZCxcbiAgICBwYWdlUGF0aCxcbiAgICBwcm9wc1BhdGgsXG4gICAgcm9vdFBhdGgsXG4gICAgaHRtbFBhdGhcbiAgfSA9IG9wdGlvbnM7XG5cbiAgLy8gQ3JlYXRlIHR3byBzZXBhcmF0ZSBNZXNzYWdlUG9ydHMgZm9yIGNsZWFuIHNlcGFyYXRpb24gb2YgY29uY2VybnNcbiAgY29uc3QgeyBkYXRhUG9ydDEsIGRhdGFQb3J0MiwgY29udHJvbFBvcnQxLCBjb250cm9sUG9ydDIgfSA9IGNyZWF0ZU1lc3NhZ2VDaGFubmVscygpO1xuICBcbiAgLy8gTm90ZTogQ2xlYW51cCBpcyBoYW5kbGVkIGJ5IHRoZSByZXNwb25zZSBjbG9zZSBoYW5kbGVyIGluIGNvbmZpZ3VyZVJlYWN0U2VydmVyLnNlcnZlci50c1xuICAvLyBUaGlzIHByZXZlbnRzIG11bHRpcGxlIGNsZWFudXAgbWVjaGFuaXNtcyBmcm9tIGNvbmZsaWN0aW5nXG4gIFxuICAvLyBDcmVhdGUgdGhlIFJTQyBvdXRwdXQgc3RyZWFtXG4gIGNvbnN0IHJzY1N0cmVhbSA9IG5ldyBQYXNzVGhyb3VnaCh7XG4gICAgb2JqZWN0TW9kZTogZmFsc2UsXG4gICAgaGlnaFdhdGVyTWFyazogNjQgKiAxMDI0IC8vIDY0S0IgYnVmZmVyXG4gIH0pO1xuICBcbiAgLy8gRGF0YSBwb3J0IC0gT05MWSBmb3IgcmF3IFJTQyBzdHJlYW0gZGF0YVxuICAoZGF0YVBvcnQxIGFzIGFueSkub25tZXNzYWdlID0gKGV2ZW50OiBhbnkpID0+IHtcbiAgICBjb25zdCBkYXRhID0gZXZlbnQuZGF0YTtcbiAgICBcbiAgICBpZiAoZGF0YSA9PT0gbnVsbCkge1xuICAgICAgLy8gRW5kIG9mIHN0cmVhbVxuICAgICAgaWYgKHZlcmJvc2UpIHtcbiAgICAgICAgbG9nZ2VyPy5pbmZvKGBbY3JlYXRlUnNjV29ya2VyU3RyZWFtXSBFbmQgb2YgUlNDIHN0cmVhbSB2aWEgZGF0YVBvcnRgKTtcbiAgICAgIH1cbiAgICAgIHJzY1N0cmVhbS5lbmQoKTtcbiAgICAgIFxuICAgICAgLy8gTm90ZTogV2UgZG9uJ3QgY2xvc2UgcG9ydHMgaGVyZSAtIGxldCB0aGUgc3RyZWFtIGNvbnN1bWVyIG1hbmFnZSBwb3J0IGxpZmVjeWNsZVxuICAgICAgLy8gVGhpcyBlbnN1cmVzIFJlYWN0RE9NQ2xpZW50LmNyZWF0ZUZyb21Ob2RlU3RyZWFtKCkgY2FuIGZ1bGx5IGNvbnN1bWUgdGhlIHN0cmVhbVxuICAgIH0gZWxzZSB7XG4gICAgICAvLyBSYXcgUlNDIGRhdGEgLSBkaXJlY3QgcGlwaW5nXG4gICAgICBpZiAodmVyYm9zZSkge1xuICAgICAgICBsb2dnZXI/LmluZm8oYFtjcmVhdGVSc2NXb3JrZXJTdHJlYW1dIFdyaXRpbmcgcmF3IFJTQyBkYXRhIHRvIHN0cmVhbTogJHtkYXRhLmxlbmd0aH0gYnl0ZXNgKTtcbiAgICAgIH1cbiAgICAgIHJzY1N0cmVhbS53cml0ZShkYXRhKTtcbiAgICB9XG4gIH07XG4gIFxuICAvLyBDb250cm9sIHBvcnQgLSBPTkxZIGZvciBjb250cm9sIG1lc3NhZ2VzXG4gIChjb250cm9sUG9ydDEgYXMgYW55KS5vbm1lc3NhZ2UgPSAoZXZlbnQ6IGFueSkgPT4ge1xuICAgIGNvbnN0IG1lc3NhZ2UgPSBldmVudC5kYXRhO1xuICAgIFxuICAgIGlmICh2ZXJib3NlKSB7XG4gICAgICBsb2dnZXI/LmluZm8oYFtjcmVhdGVSc2NXb3JrZXJTdHJlYW1dIFJlY2VpdmVkIGNvbnRyb2wgbWVzc2FnZTogJHttZXNzYWdlLnR5cGV9YCk7XG4gICAgfVxuICAgIFxuICAgIHN3aXRjaCAobWVzc2FnZS50eXBlKSB7XG4gICAgICBjYXNlICdSU0NfRU5EJzpcbiAgICAgICAgaWYgKHZlcmJvc2UpIHtcbiAgICAgICAgICBsb2dnZXI/LmluZm8oYFtjcmVhdGVSc2NXb3JrZXJTdHJlYW1dIFJTQyBzdHJlYW0gZW5kZWQgYnkgY29udHJvbCBtZXNzYWdlYCk7XG4gICAgICAgIH1cbiAgICAgICAgcnNjU3RyZWFtLmVuZCgpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ0VSUk9SJzpcbiAgICAgICAgaWYgKHZlcmJvc2UpIHtcbiAgICAgICAgICBsb2dnZXI/LmVycm9yKGBbY3JlYXRlUnNjV29ya2VyU3RyZWFtXSBSU0Mgc3RyZWFtIGVycm9yOiAke21lc3NhZ2UuZXJyb3I/Lm1lc3NhZ2V9YCwge2Vycm9yOiBtZXNzYWdlLmVycm9yfSk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgZXJyb3IgPSB0b0Vycm9yKG1lc3NhZ2UuZXJyb3IpO1xuICAgICAgICByc2NTdHJlYW0uZGVzdHJveShlcnJvcik7XG4gICAgICAgIFxuICAgICAgICBpZiAob25FcnJvcikge1xuICAgICAgICAgIG9uRXJyb3IoZXJyb3IpO1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnTUVUUklDUyc6XG4gICAgICAgIGlmICh2ZXJib3NlKSB7XG4gICAgICAgICAgbG9nZ2VyPy5pbmZvKGBbY3JlYXRlUnNjV29ya2VyU3RyZWFtXSBSZWNlaXZlZCBtZXRyaWNzOmAsIG1lc3NhZ2UubWV0cmljcyk7XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdSU0NfUkVOREVSX1NUQVJUJzpcbiAgICAgICAgaWYgKHZlcmJvc2UpIHtcbiAgICAgICAgICBsb2dnZXI/LmluZm8oYFtjcmVhdGVSc2NXb3JrZXJTdHJlYW1dIFJTQyByZW5kZXIgc3RhcnRlZGApO1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgaWYgKHZlcmJvc2UpIHtcbiAgICAgICAgICBsb2dnZXI/Lndhcm4oYFtjcmVhdGVSc2NXb3JrZXJTdHJlYW1dIFVua25vd24gY29udHJvbCBtZXNzYWdlIHR5cGU6ICR7bWVzc2FnZS50eXBlfWApO1xuICAgICAgICB9XG4gICAgfVxuICB9O1xuXG4gIC8vIFNlbmQgdGhlIElOSVQgbWVzc2FnZSB0byB0aGUgd29ya2VyIHdpdGggYm90aCBNZXNzYWdlUG9ydHNcbiAgd29ya2VyLnBvc3RNZXNzYWdlKHtcbiAgICB0eXBlOiBcIklOSVRcIixcbiAgICBpZDogcm91dGUsXG4gICAgZGF0YVBvcnQ6IGRhdGFQb3J0MixcbiAgICBjb250cm9sUG9ydDogY29udHJvbFBvcnQyLFxuICAgIG9wdGlvbnM6IHtcbiAgICAgIHJvdXRlLFxuICAgICAgdXJsLFxuICAgICAgcHJvamVjdFJvb3QsXG4gICAgICBwYW5pY1RocmVzaG9sZCxcbiAgICAgIHJzY1RpbWVvdXQsXG4gICAgICBzZXJ2ZXJQaXBlYWJsZVN0cmVhbU9wdGlvbnMsXG4gICAgICBwYWdlUGF0aCxcbiAgICAgIHByb3BzUGF0aCxcbiAgICAgIHJvb3RQYXRoLFxuICAgICAgaHRtbFBhdGgsXG4gICAgICBidWlsZDogYnVpbGQgPyB7XG4gICAgICAgIG91dERpcjogYnVpbGQub3V0RGlyLFxuICAgICAgICBhc3NldHNEaXI6IGJ1aWxkLmFzc2V0c0RpcixcbiAgICAgICAgcGFnZXM6IGJ1aWxkLnBhZ2VzLFxuICAgICAgICBzdGF0aWM6IGJ1aWxkLnN0YXRpYyxcbiAgICAgICAgcnNjT3V0cHV0UGF0aDogYnVpbGQucnNjT3V0cHV0UGF0aCxcbiAgICAgICAgaHRtbE91dHB1dFBhdGg6IGJ1aWxkLmh0bWxPdXRwdXRQYXRoLFxuICAgICAgfSA6IHVuZGVmaW5lZCxcbiAgICB9XG4gIH0sIFtkYXRhUG9ydDIsIGNvbnRyb2xQb3J0Ml0gYXMgYW55KTsgLy8gVHJhbnNmZXIgYm90aCBwb3J0cyB0byB0aGUgd29ya2VyXG5cbiAgLy8gTm90ZTogQ2xlYW51cCBpcyBoYW5kbGVkIGJ5IHRoZSByZXNwb25zZSBjbG9zZSBoYW5kbGVyIGluIGNvbmZpZ3VyZVJlYWN0U2VydmVyLnNlcnZlci50c1xuICAvLyBObyBuZWVkIGZvciBhIGNsZWFudXAgbWV0aG9kIG9uIHRoZSBzdHJlYW0gaXRzZWxmXG5cbiAgcmV0dXJuIHtcbiAgICBzdHJlYW06IHJzY1N0cmVhbSxcbiAgICBkYXRhUG9ydDEsXG4gICAgY29udHJvbFBvcnQxXG4gIH07XG59XG4iXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7O0FBeUNPLFNBQVMsc0JBQXNCLE9BSXBDLEVBQUE7QUFDQSxFQUFNLE1BQUE7QUFBQSxJQUNKLE1BQUE7QUFBQSxJQUNBLEtBQUE7QUFBQSxJQUNBLEdBQUE7QUFBQSxJQUNBLFdBQUE7QUFBQSxJQUNBLE9BQVUsR0FBQSxLQUFBO0FBQUEsSUFDVixNQUFBO0FBQUEsSUFDQSxjQUFBO0FBQUEsSUFDQSwyQkFBQTtBQUFBLElBQ0EsT0FBQTtBQUFBLElBQ0EsVUFBQTtBQUFBLElBQ0EsS0FBQTtBQUFBLElBQ0EsUUFBQTtBQUFBLElBQ0EsU0FBQTtBQUFBLElBQ0EsUUFBQTtBQUFBLElBQ0E7QUFBQSxHQUNFLEdBQUEsT0FBQTtBQUdKLEVBQUEsTUFBTSxFQUFFLFNBQVcsRUFBQSxTQUFBLEVBQVcsWUFBYyxFQUFBLFlBQUEsS0FBaUIscUJBQXNCLEVBQUE7QUFNbkYsRUFBTSxNQUFBLFNBQUEsR0FBWSxJQUFJLFdBQVksQ0FBQTtBQUFBLElBQ2hDLFVBQVksRUFBQSxLQUFBO0FBQUEsSUFDWixlQUFlLEVBQUssR0FBQTtBQUFBO0FBQUEsR0FDckIsQ0FBQTtBQUdELEVBQUMsU0FBQSxDQUFrQixTQUFZLEdBQUEsQ0FBQyxLQUFlLEtBQUE7QUFDN0MsSUFBQSxNQUFNLE9BQU8sS0FBTSxDQUFBLElBQUE7QUFFbkIsSUFBQSxJQUFJLFNBQVMsSUFBTSxFQUFBO0FBRWpCLE1BQUEsSUFBSSxPQUFTLEVBQUE7QUFDWCxRQUFBLE1BQUEsRUFBUSxLQUFLLENBQXdELHNEQUFBLENBQUEsQ0FBQTtBQUFBO0FBRXZFLE1BQUEsU0FBQSxDQUFVLEdBQUksRUFBQTtBQUFBLEtBSVQsTUFBQTtBQUVMLE1BQUEsSUFBSSxPQUFTLEVBQUE7QUFDWCxRQUFBLE1BQUEsRUFBUSxJQUFLLENBQUEsQ0FBQSx3REFBQSxFQUEyRCxJQUFLLENBQUEsTUFBTSxDQUFRLE1BQUEsQ0FBQSxDQUFBO0FBQUE7QUFFN0YsTUFBQSxTQUFBLENBQVUsTUFBTSxJQUFJLENBQUE7QUFBQTtBQUN0QixHQUNGO0FBR0EsRUFBQyxZQUFBLENBQXFCLFNBQVksR0FBQSxDQUFDLEtBQWUsS0FBQTtBQUNoRCxJQUFBLE1BQU0sVUFBVSxLQUFNLENBQUEsSUFBQTtBQUV0QixJQUFBLElBQUksT0FBUyxFQUFBO0FBQ1gsTUFBQSxNQUFBLEVBQVEsSUFBSyxDQUFBLENBQUEsa0RBQUEsRUFBcUQsT0FBUSxDQUFBLElBQUksQ0FBRSxDQUFBLENBQUE7QUFBQTtBQUdsRixJQUFBLFFBQVEsUUFBUSxJQUFNO0FBQUEsTUFDcEIsS0FBSyxTQUFBO0FBQ0gsUUFBQSxJQUFJLE9BQVMsRUFBQTtBQUNYLFVBQUEsTUFBQSxFQUFRLEtBQUssQ0FBNkQsMkRBQUEsQ0FBQSxDQUFBO0FBQUE7QUFFNUUsUUFBQSxTQUFBLENBQVUsR0FBSSxFQUFBO0FBQ2QsUUFBQTtBQUFBLE1BQ0YsS0FBSyxPQUFBO0FBQ0gsUUFBQSxJQUFJLE9BQVMsRUFBQTtBQUNYLFVBQVEsTUFBQSxFQUFBLEtBQUEsQ0FBTSxDQUE2QywwQ0FBQSxFQUFBLE9BQUEsQ0FBUSxLQUFPLEVBQUEsT0FBTyxJQUFJLEVBQUMsS0FBQSxFQUFPLE9BQVEsQ0FBQSxLQUFBLEVBQU0sQ0FBQTtBQUFBO0FBRTdHLFFBQU0sTUFBQSxLQUFBLEdBQVEsT0FBUSxDQUFBLE9BQUEsQ0FBUSxLQUFLLENBQUE7QUFDbkMsUUFBQSxTQUFBLENBQVUsUUFBUSxLQUFLLENBQUE7QUFFdkIsUUFBQSxJQUFJLE9BQVMsRUFBQTtBQUNYLFVBQUEsT0FBQSxDQUFRLEtBQUssQ0FBQTtBQUFBO0FBRWYsUUFBQTtBQUFBLE1BQ0YsS0FBSyxTQUFBO0FBQ0gsUUFBQSxJQUFJLE9BQVMsRUFBQTtBQUNYLFVBQVEsTUFBQSxFQUFBLElBQUEsQ0FBSyxDQUE2Qyx5Q0FBQSxDQUFBLEVBQUEsT0FBQSxDQUFRLE9BQU8sQ0FBQTtBQUFBO0FBRTNFLFFBQUE7QUFBQSxNQUNGLEtBQUssa0JBQUE7QUFDSCxRQUFBLElBQUksT0FBUyxFQUFBO0FBQ1gsVUFBQSxNQUFBLEVBQVEsS0FBSyxDQUE0QywwQ0FBQSxDQUFBLENBQUE7QUFBQTtBQUUzRCxRQUFBO0FBQUEsTUFDRjtBQUNFLFFBQUEsSUFBSSxPQUFTLEVBQUE7QUFDWCxVQUFBLE1BQUEsRUFBUSxJQUFLLENBQUEsQ0FBQSxzREFBQSxFQUF5RCxPQUFRLENBQUEsSUFBSSxDQUFFLENBQUEsQ0FBQTtBQUFBO0FBQ3RGO0FBQ0osR0FDRjtBQUdBLEVBQUEsTUFBQSxDQUFPLFdBQVksQ0FBQTtBQUFBLElBQ2pCLElBQU0sRUFBQSxNQUFBO0FBQUEsSUFDTixFQUFJLEVBQUEsS0FBQTtBQUFBLElBQ0osUUFBVSxFQUFBLFNBQUE7QUFBQSxJQUNWLFdBQWEsRUFBQSxZQUFBO0FBQUEsSUFDYixPQUFTLEVBQUE7QUFBQSxNQUNQLEtBQUE7QUFBQSxNQUNBLEdBQUE7QUFBQSxNQUNBLFdBQUE7QUFBQSxNQUNBLGNBQUE7QUFBQSxNQUNBLFVBQUE7QUFBQSxNQUNBLDJCQUFBO0FBQUEsTUFDQSxRQUFBO0FBQUEsTUFDQSxTQUFBO0FBQUEsTUFDQSxRQUFBO0FBQUEsTUFDQSxRQUFBO0FBQUEsTUFDQSxPQUFPLEtBQVEsR0FBQTtBQUFBLFFBQ2IsUUFBUSxLQUFNLENBQUEsTUFBQTtBQUFBLFFBQ2QsV0FBVyxLQUFNLENBQUEsU0FBQTtBQUFBLFFBQ2pCLE9BQU8sS0FBTSxDQUFBLEtBQUE7QUFBQSxRQUNiLFFBQVEsS0FBTSxDQUFBLE1BQUE7QUFBQSxRQUNkLGVBQWUsS0FBTSxDQUFBLGFBQUE7QUFBQSxRQUNyQixnQkFBZ0IsS0FBTSxDQUFBO0FBQUEsT0FDcEIsR0FBQTtBQUFBO0FBQ04sR0FDQyxFQUFBLENBQUMsU0FBVyxFQUFBLFlBQVksQ0FBUSxDQUFBO0FBS25DLEVBQU8sT0FBQTtBQUFBLElBQ0wsTUFBUSxFQUFBLFNBQUE7QUFBQSxJQUNSLFNBQUE7QUFBQSxJQUNBO0FBQUEsR0FDRjtBQUNGOzs7OyJ9