vite-plugin-react-server
Version:
Vite plugin for React Server Components (RSC)
105 lines (102 loc) • 15.7 kB
JavaScript
/**
* vite-plugin-react-server
* Copyright (c) Nico Brinkkemper
* MIT License
*/
import { isAbsolute, join } from 'node:path';
import { pathToFileURL } from 'node:url';
import { resolveVirtualAndNodeModules } from './resolveVirtualAndNodeModules.js';
import { resolveModuleFromManifest } from './resolveModuleFromManifest.js';
async function createSharedLoader({
moduleId,
exportName,
verbose = false,
logger,
// Virtual module handling
resolveVirtual = true,
// Manifest resolution
manifest,
normalizer,
moduleBase,
preserveModulesRoot,
projectRoot,
buildOutDir,
buildServerDir,
// Direct import options
isBuildMode = false,
isServeMode: _isServeMode = false,
effectiveProjectRoot,
build,
moduleRunner
}) {
if (resolveVirtual) {
const virtualOrNodeModule = await resolveVirtualAndNodeModules(
moduleId,
exportName,
verbose,
logger
);
if (virtualOrNodeModule !== null) {
return virtualOrNodeModule;
}
}
let resolvedModuleID = moduleId;
if (isBuildMode && manifest && normalizer && moduleBase && projectRoot && buildOutDir && buildServerDir) {
const manifestResolution = resolveModuleFromManifest({
moduleId,
normalizer,
manifest,
moduleBase,
preserveModulesRoot,
projectRoot,
buildOutDir,
buildServerDir,
verbose,
logger
});
if (manifestResolution.manifestEntry && manifestResolution.resolvedPath) {
resolvedModuleID = manifestResolution.resolvedPath;
} else {
resolvedModuleID = manifestResolution.builtModuleId;
const isSourcePath = moduleId.startsWith(moduleBase + "/") || moduleId.startsWith("./" + moduleBase + "/") || isAbsolute(moduleId) && moduleId.includes(moduleBase);
if (!isSourcePath && !isAbsolute(resolvedModuleID) && effectiveProjectRoot && build) {
resolvedModuleID = join(
effectiveProjectRoot,
build.outDir || "dist",
build.server || "server",
resolvedModuleID
);
}
}
} else if (isBuildMode && effectiveProjectRoot && build && !isAbsolute(resolvedModuleID)) {
resolvedModuleID = join(
effectiveProjectRoot,
build.outDir || "dist",
build.server || "server",
resolvedModuleID
);
}
const fullPath = isAbsolute(resolvedModuleID) ? resolvedModuleID : effectiveProjectRoot ? join(effectiveProjectRoot, resolvedModuleID) : resolvedModuleID;
let result;
if (moduleRunner != null && !isBuildMode && effectiveProjectRoot && isAbsolute(fullPath) && fullPath.startsWith(effectiveProjectRoot)) {
if (verbose) logger?.info(`[shared-loader] runner.import: ${fullPath}`);
result = await moduleRunner.import(fullPath);
} else {
const fileUrl = isAbsolute(fullPath) ? pathToFileURL(fullPath).href : fullPath;
result = await import(fileUrl);
}
if (result == null) {
throw new Error(`Module "${moduleId}" does not have any exports`);
}
if (!Object.keys(result).length && exportName?.length) {
throw new Error(`Module "${moduleId}" has no exports, can't find ${exportName}`);
}
if (exportName && !(exportName in result)) {
throw new Error(
`Module "${moduleId}" does not export "${exportName}". ` + (exportName !== "default" ? `Did you use \`export default\`? Use \`export function ${exportName}(...)\` or set pageExportName: "default" in your plugin config.` : `The module does not have a default export.`)
);
}
return result;
}
export { createSharedLoader };
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3JlYXRlU2hhcmVkTG9hZGVyLmpzIiwic291cmNlcyI6WyIuLi8uLi8uLi9wbHVnaW4vaGVscGVycy9jcmVhdGVTaGFyZWRMb2FkZXIudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgam9pbiwgaXNBYnNvbHV0ZSB9IGZyb20gXCJub2RlOnBhdGhcIjtcbmltcG9ydCB7IHBhdGhUb0ZpbGVVUkwgfSBmcm9tIFwibm9kZTp1cmxcIjtcbmltcG9ydCB0eXBlIHsgTG9nZ2VyIH0gZnJvbSBcInZpdGVcIjtcbmltcG9ydCB0eXBlIHsgTW9kdWxlUnVubmVyIH0gZnJvbSBcInZpdGUvbW9kdWxlLXJ1bm5lclwiO1xuaW1wb3J0IHR5cGUgeyBJbnB1dE5vcm1hbGl6ZXIgfSBmcm9tIFwiLi4vdHlwZXMuanNcIjtcbmltcG9ydCB7IHJlc29sdmVWaXJ0dWFsQW5kTm9kZU1vZHVsZXMgfSBmcm9tIFwiLi9yZXNvbHZlVmlydHVhbEFuZE5vZGVNb2R1bGVzLmpzXCI7XG5pbXBvcnQgeyByZXNvbHZlTW9kdWxlRnJvbU1hbmlmZXN0IH0gZnJvbSBcIi4vcmVzb2x2ZU1vZHVsZUZyb21NYW5pZmVzdC5qc1wiO1xuXG4vKipcbiAqIFNoYXJlZCBsb2FkZXIgdXRpbGl0eSB0aGF0IGJvdGggUlNDIHdvcmtlciBsb2FkZXIgYW5kIGJ1aWxkIGxvYWRlciBjYW4gdXNlLlxuICogXG4gKiBUaGlzIGhhbmRsZXMgdGhlIGNvbW1vbiBwYXR0ZXJuOlxuICogMS4gUGFyc2UgaWQgdG8gZ2V0IG1vZHVsZUlkIGFuZCBleHBvcnROYW1lXG4gKiAyLiBIYW5kbGUgdmlydHVhbCBtb2R1bGVzIGFuZCBub2RlX21vZHVsZXMgKHZpYSByZXNvbHZlVmlydHVhbEFuZE5vZGVNb2R1bGVzKVxuICogMy4gVHJ5IG1hbmlmZXN0LWJhc2VkIHJlc29sdXRpb24gKGJ1aWxkIG1vZGUpXG4gKiA0LiBJbXBvcnQgdGhlIG1vZHVsZVxuICogNS4gVmFsaWRhdGUgZXhwb3J0c1xuICogXG4gKiBJZiB0aGUgcmVzdWx0IGlzIGFscmVhZHkgYSBtb2R1bGUgb2JqZWN0IChub3QgYSBQcm9taXNlKSwgaXQncyByZXR1cm5lZCBkaXJlY3RseS5cbiAqIFRoaXMgYWxsb3dzIGxvYWRlcnMgdG8gcmV1c2UgYWxyZWFkeS1sb2FkZWQgbW9kdWxlcy5cbiAqIFxuICogQHBhcmFtIG9wdGlvbnMgLSBMb2FkZXIgY29uZmlndXJhdGlvbiBvcHRpb25zXG4gKiBAcmV0dXJucyBUaGUgcmVzb2x2ZWQgbW9kdWxlIChhbHJlYWR5IGEgbW9kdWxlIG9iamVjdCwgbm90IGEgUHJvbWlzZSlcbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGNyZWF0ZVNoYXJlZExvYWRlcih7XG4gIG1vZHVsZUlkLFxuICBleHBvcnROYW1lLFxuICB2ZXJib3NlID0gZmFsc2UsXG4gIGxvZ2dlcixcbiAgLy8gVmlydHVhbCBtb2R1bGUgaGFuZGxpbmdcbiAgcmVzb2x2ZVZpcnR1YWwgPSB0cnVlLFxuICAvLyBNYW5pZmVzdCByZXNvbHV0aW9uXG4gIG1hbmlmZXN0LFxuICBub3JtYWxpemVyLFxuICBtb2R1bGVCYXNlLFxuICBwcmVzZXJ2ZU1vZHVsZXNSb290LFxuICBwcm9qZWN0Um9vdCxcbiAgYnVpbGRPdXREaXIsXG4gIGJ1aWxkU2VydmVyRGlyLFxuICAvLyBEaXJlY3QgaW1wb3J0IG9wdGlvbnNcbiAgaXNCdWlsZE1vZGUgPSBmYWxzZSxcbiAgaXNTZXJ2ZU1vZGU6IF9pc1NlcnZlTW9kZSA9IGZhbHNlLFxuICBlZmZlY3RpdmVQcm9qZWN0Um9vdCxcbiAgYnVpbGQsXG4gIG1vZHVsZVJ1bm5lcixcbn06IHtcbiAgbW9kdWxlSWQ6IHN0cmluZztcbiAgZXhwb3J0TmFtZT86IHN0cmluZztcbiAgdmVyYm9zZT86IGJvb2xlYW47XG4gIGxvZ2dlcj86IExvZ2dlcjtcbiAgLy8gVmlydHVhbCBtb2R1bGUgaGFuZGxpbmdcbiAgcmVzb2x2ZVZpcnR1YWw/OiBib29sZWFuO1xuICAvLyBNYW5pZmVzdCByZXNvbHV0aW9uXG4gIG1hbmlmZXN0PzogUmVjb3JkPHN0cmluZywgeyBmaWxlOiBzdHJpbmcgfSB8IHVuZGVmaW5lZD47XG4gIG5vcm1hbGl6ZXI/OiBJbnB1dE5vcm1hbGl6ZXI7XG4gIG1vZHVsZUJhc2U/OiBzdHJpbmc7XG4gIHByZXNlcnZlTW9kdWxlc1Jvb3Q/OiBib29sZWFuO1xuICBwcm9qZWN0Um9vdD86IHN0cmluZztcbiAgYnVpbGRPdXREaXI/OiBzdHJpbmc7XG4gIGJ1aWxkU2VydmVyRGlyPzogc3RyaW5nO1xuICAvLyBEaXJlY3QgaW1wb3J0IG9wdGlvbnNcbiAgaXNCdWlsZE1vZGU/OiBib29sZWFuO1xuICBpc1NlcnZlTW9kZT86IGJvb2xlYW47XG4gIGVmZmVjdGl2ZVByb2plY3RSb290Pzogc3RyaW5nO1xuICBidWlsZD86IHtcbiAgICBzZXJ2ZXI/OiBzdHJpbmc7XG4gICAgY2xpZW50Pzogc3RyaW5nO1xuICAgIHN0YXRpYz86IHN0cmluZztcbiAgICBvdXREaXI/OiBzdHJpbmc7XG4gIH07XG4gIC8qKlxuICAgKiBPcHRpb25hbCBWaXRlIE1vZHVsZVJ1bm5lci4gV2hlbiBwcm92aWRlZCBpbiBkZXY6c3NyIG1vZGUgdGhlIHdvcmtlclxuICAgKiBwdWxscyBwcm9qZWN0IHNvdXJjZSB0aHJvdWdoIFZpdGUncyBydW5uZXIgaW5zdGVhZCBvZiBOb2RlJ3MgbmF0aXZlXG4gICAqIGltcG9ydCgpLCBzbyBmaWxlIGVkaXRzIGludmFsaWRhdGUgcGVyLW1vZHVsZSB3aXRob3V0IGEgd29ya2VyIHJlc3RhcnQuXG4gICAqL1xuICBtb2R1bGVSdW5uZXI/OiBNb2R1bGVSdW5uZXIgfCBudWxsO1xufSk6IFByb21pc2U8UmVjb3JkPHN0cmluZywgYW55Pj4ge1xuICAvLyBTdGVwIDE6IEhhbmRsZSB2aXJ0dWFsIG1vZHVsZXMgYW5kIG5vZGVfbW9kdWxlcyBmaXJzdCAoaWYgZW5hYmxlZClcbiAgaWYgKHJlc29sdmVWaXJ0dWFsKSB7XG4gICAgY29uc3QgdmlydHVhbE9yTm9kZU1vZHVsZSA9IGF3YWl0IHJlc29sdmVWaXJ0dWFsQW5kTm9kZU1vZHVsZXMoXG4gICAgICBtb2R1bGVJZCxcbiAgICAgIGV4cG9ydE5hbWUsXG4gICAgICB2ZXJib3NlLFxuICAgICAgbG9nZ2VyXG4gICAgKTtcbiAgICBpZiAodmlydHVhbE9yTm9kZU1vZHVsZSAhPT0gbnVsbCkge1xuICAgICAgLy8gcmVzb2x2ZVZpcnR1YWxBbmROb2RlTW9kdWxlcyByZXR1cm5zIGEgbW9kdWxlIG9iamVjdCBkaXJlY3RseSAobm90IGEgUHJvbWlzZSlcbiAgICAgIC8vIElmIGl0J3MgYWxyZWFkeSBhIG1vZHVsZSBvYmplY3QsIHJldHVybiBpdCBkaXJlY3RseVxuICAgICAgcmV0dXJuIHZpcnR1YWxPck5vZGVNb2R1bGU7XG4gICAgfVxuICB9XG5cbiAgLy8gU3RlcCAyOiBUcnkgbWFuaWZlc3QtYmFzZWQgcmVzb2x1dGlvbiAoYnVpbGQgbW9kZSlcbiAgbGV0IHJlc29sdmVkTW9kdWxlSUQgPSBtb2R1bGVJZDtcbiAgaWYgKGlzQnVpbGRNb2RlICYmIG1hbmlmZXN0ICYmIG5vcm1hbGl6ZXIgJiYgbW9kdWxlQmFzZSAmJiBwcm9qZWN0Um9vdCAmJiBidWlsZE91dERpciAmJiBidWlsZFNlcnZlckRpcikge1xuICAgIGNvbnN0IG1hbmlmZXN0UmVzb2x1dGlvbiA9IHJlc29sdmVNb2R1bGVGcm9tTWFuaWZlc3Qoe1xuICAgICAgbW9kdWxlSWQsXG4gICAgICBub3JtYWxpemVyLFxuICAgICAgbWFuaWZlc3QsXG4gICAgICBtb2R1bGVCYXNlLFxuICAgICAgcHJlc2VydmVNb2R1bGVzUm9vdCxcbiAgICAgIHByb2plY3RSb290LFxuICAgICAgYnVpbGRPdXREaXIsXG4gICAgICBidWlsZFNlcnZlckRpcixcbiAgICAgIHZlcmJvc2UsXG4gICAgICBsb2dnZXIsXG4gICAgfSk7XG5cbiAgICBpZiAobWFuaWZlc3RSZXNvbHV0aW9uLm1hbmlmZXN0RW50cnkgJiYgbWFuaWZlc3RSZXNvbHV0aW9uLnJlc29sdmVkUGF0aCkge1xuICAgICAgcmVzb2x2ZWRNb2R1bGVJRCA9IG1hbmlmZXN0UmVzb2x1dGlvbi5yZXNvbHZlZFBhdGg7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJlc29sdmVkTW9kdWxlSUQgPSBtYW5pZmVzdFJlc29sdXRpb24uYnVpbHRNb2R1bGVJZDtcbiAgICAgIFxuICAgICAgLy8gUHJlZml4IG5vbi1zb3VyY2UsIG5vbi1hYnNvbHV0ZSBwYXRocyB3aXRoIHNlcnZlciBidWlsZCBkaXJlY3RvcnlcbiAgICAgIGNvbnN0IGlzU291cmNlUGF0aCA9IG1vZHVsZUlkLnN0YXJ0c1dpdGgobW9kdWxlQmFzZSArIFwiL1wiKSB8fCBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kdWxlSWQuc3RhcnRzV2l0aChcIi4vXCIgKyBtb2R1bGVCYXNlICsgXCIvXCIpIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICAgIChpc0Fic29sdXRlKG1vZHVsZUlkKSAmJiBtb2R1bGVJZC5pbmNsdWRlcyhtb2R1bGVCYXNlKSk7XG4gICAgICBcbiAgICAgIGlmICghaXNTb3VyY2VQYXRoICYmICFpc0Fic29sdXRlKHJlc29sdmVkTW9kdWxlSUQpICYmIGVmZmVjdGl2ZVByb2plY3RSb290ICYmIGJ1aWxkKSB7XG4gICAgICAgIHJlc29sdmVkTW9kdWxlSUQgPSBqb2luKFxuICAgICAgICAgIGVmZmVjdGl2ZVByb2plY3RSb290LFxuICAgICAgICAgIGJ1aWxkLm91dERpciB8fCBcImRpc3RcIixcbiAgICAgICAgICBidWlsZC5zZXJ2ZXIgfHwgXCJzZXJ2ZXJcIixcbiAgICAgICAgICByZXNvbHZlZE1vZHVsZUlEXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuICB9IGVsc2UgaWYgKGlzQnVpbGRNb2RlICYmIGVmZmVjdGl2ZVByb2plY3RSb290ICYmIGJ1aWxkICYmICFpc0Fic29sdXRlKHJlc29sdmVkTW9kdWxlSUQpKSB7XG4gICAgLy8gQnVpbGQgbW9kZSBmYWxsYmFjayB3aXRob3V0IG1hbmlmZXN0XG4gICAgcmVzb2x2ZWRNb2R1bGVJRCA9IGpvaW4oXG4gICAgICBlZmZlY3RpdmVQcm9qZWN0Um9vdCxcbiAgICAgIGJ1aWxkLm91dERpciB8fCBcImRpc3RcIixcbiAgICAgIGJ1aWxkLnNlcnZlciB8fCBcInNlcnZlclwiLFxuICAgICAgcmVzb2x2ZWRNb2R1bGVJRFxuICAgICk7XG4gIH1cblxuICAvLyBTdGVwIDM6IENvbnN0cnVjdCB0aGUgZnVsbCBwYXRoIGFuZCBpbXBvcnRcbiAgY29uc3QgZnVsbFBhdGggPSBpc0Fic29sdXRlKHJlc29sdmVkTW9kdWxlSUQpXG4gICAgPyByZXNvbHZlZE1vZHVsZUlEXG4gICAgOiBlZmZlY3RpdmVQcm9qZWN0Um9vdFxuICAgICAgPyBqb2luKGVmZmVjdGl2ZVByb2plY3RSb290LCByZXNvbHZlZE1vZHVsZUlEKVxuICAgICAgOiByZXNvbHZlZE1vZHVsZUlEO1xuXG4gIC8vIFN0ZXAgM2E6IElmIGEgVml0ZSBNb2R1bGVSdW5uZXIgaXMgYXZhaWxhYmxlLCBwcmVmZXIgaXQgZm9yIHByb2plY3Qgc291cmNlLlxuICAvLyBWZW5kb3JlZCAvIG5vZGVfbW9kdWxlcyBwYXRocyBhcmUgYWxyZWFkeSBoYW5kbGVkIGJ5IHJlc29sdmVWaXJ0dWFsQW5kTm9kZU1vZHVsZXNcbiAgLy8gZWFybGllciwgc28gYW55dGhpbmcgcmVhY2hpbmcgdGhpcyBwb2ludCBpbiBkZXY6c3NyIGlzIHByb2plY3Qgc291cmNlLlxuICBsZXQgcmVzdWx0OiBSZWNvcmQ8c3RyaW5nLCBhbnk+O1xuICBpZiAoXG4gICAgbW9kdWxlUnVubmVyICE9IG51bGwgJiZcbiAgICAhaXNCdWlsZE1vZGUgJiZcbiAgICBlZmZlY3RpdmVQcm9qZWN0Um9vdCAmJlxuICAgIGlzQWJzb2x1dGUoZnVsbFBhdGgpICYmXG4gICAgZnVsbFBhdGguc3RhcnRzV2l0aChlZmZlY3RpdmVQcm9qZWN0Um9vdClcbiAgKSB7XG4gICAgaWYgKHZlcmJvc2UpIGxvZ2dlcj8uaW5mbyhgW3NoYXJlZC1sb2FkZXJdIHJ1bm5lci5pbXBvcnQ6ICR7ZnVsbFBhdGh9YCk7XG4gICAgcmVzdWx0ID0gKGF3YWl0IG1vZHVsZVJ1bm5lci5pbXBvcnQoZnVsbFBhdGgpKSBhcyBSZWNvcmQ8c3RyaW5nLCBhbnk+O1xuICB9IGVsc2Uge1xuICAgIC8vIEltcG9ydCB0aGUgbW9kdWxlIHZpYSBOb2RlJ3MgbmF0aXZlIEVTTSBsb2FkZXIuXG4gICAgY29uc3QgZmlsZVVybCA9IGlzQWJzb2x1dGUoZnVsbFBhdGgpID8gcGF0aFRvRmlsZVVSTChmdWxsUGF0aCkuaHJlZiA6IGZ1bGxQYXRoO1xuICAgIHJlc3VsdCA9IGF3YWl0IGltcG9ydChmaWxlVXJsKTtcbiAgfVxuXG4gIC8vIFZhbGlkYXRlIGV4cG9ydHNcbiAgaWYgKHJlc3VsdCA9PSBudWxsKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBNb2R1bGUgXCIke21vZHVsZUlkfVwiIGRvZXMgbm90IGhhdmUgYW55IGV4cG9ydHNgKTtcbiAgfVxuICBpZiAoIU9iamVjdC5rZXlzKHJlc3VsdCkubGVuZ3RoICYmIGV4cG9ydE5hbWU/Lmxlbmd0aCkge1xuICAgIHRocm93IG5ldyBFcnJvcihgTW9kdWxlIFwiJHttb2R1bGVJZH1cIiBoYXMgbm8gZXhwb3J0cywgY2FuJ3QgZmluZCAke2V4cG9ydE5hbWV9YCk7XG4gIH1cbiAgaWYgKGV4cG9ydE5hbWUgJiYgIShleHBvcnROYW1lIGluIHJlc3VsdCkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICBgTW9kdWxlIFwiJHttb2R1bGVJZH1cIiBkb2VzIG5vdCBleHBvcnQgXCIke2V4cG9ydE5hbWV9XCIuIGAgK1xuICAgICAgKGV4cG9ydE5hbWUgIT09ICdkZWZhdWx0J1xuICAgICAgICA/IGBEaWQgeW91IHVzZSBcXGBleHBvcnQgZGVmYXVsdFxcYD8gVXNlIFxcYGV4cG9ydCBmdW5jdGlvbiAke2V4cG9ydE5hbWV9KC4uLilcXGAgb3Igc2V0IHBhZ2VFeHBvcnROYW1lOiBcImRlZmF1bHRcIiBpbiB5b3VyIHBsdWdpbiBjb25maWcuYFxuICAgICAgICA6IGBUaGUgbW9kdWxlIGRvZXMgbm90IGhhdmUgYSBkZWZhdWx0IGV4cG9ydC5gKVxuICAgICk7XG4gIH1cblxuICByZXR1cm4gcmVzdWx0O1xufVxuXG4iXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7OztBQXdCQSxlQUFzQixrQkFBbUIsQ0FBQTtBQUFBLEVBQ3ZDLFFBQUE7QUFBQSxFQUNBLFVBQUE7QUFBQSxFQUNBLE9BQVUsR0FBQSxLQUFBO0FBQUEsRUFDVixNQUFBO0FBQUE7QUFBQSxFQUVBLGNBQWlCLEdBQUEsSUFBQTtBQUFBO0FBQUEsRUFFakIsUUFBQTtBQUFBLEVBQ0EsVUFBQTtBQUFBLEVBQ0EsVUFBQTtBQUFBLEVBQ0EsbUJBQUE7QUFBQSxFQUNBLFdBQUE7QUFBQSxFQUNBLFdBQUE7QUFBQSxFQUNBLGNBQUE7QUFBQTtBQUFBLEVBRUEsV0FBYyxHQUFBLEtBQUE7QUFBQSxFQUNkLGFBQWEsWUFBZSxHQUFBLEtBQUE7QUFBQSxFQUM1QixvQkFBQTtBQUFBLEVBQ0EsS0FBQTtBQUFBLEVBQ0E7QUFDRixDQStCaUMsRUFBQTtBQUUvQixFQUFBLElBQUksY0FBZ0IsRUFBQTtBQUNsQixJQUFBLE1BQU0sc0JBQXNCLE1BQU0sNEJBQUE7QUFBQSxNQUNoQyxRQUFBO0FBQUEsTUFDQSxVQUFBO0FBQUEsTUFDQSxPQUFBO0FBQUEsTUFDQTtBQUFBLEtBQ0Y7QUFDQSxJQUFBLElBQUksd0JBQXdCLElBQU0sRUFBQTtBQUdoQyxNQUFPLE9BQUEsbUJBQUE7QUFBQTtBQUNUO0FBSUYsRUFBQSxJQUFJLGdCQUFtQixHQUFBLFFBQUE7QUFDdkIsRUFBQSxJQUFJLGVBQWUsUUFBWSxJQUFBLFVBQUEsSUFBYyxVQUFjLElBQUEsV0FBQSxJQUFlLGVBQWUsY0FBZ0IsRUFBQTtBQUN2RyxJQUFBLE1BQU0scUJBQXFCLHlCQUEwQixDQUFBO0FBQUEsTUFDbkQsUUFBQTtBQUFBLE1BQ0EsVUFBQTtBQUFBLE1BQ0EsUUFBQTtBQUFBLE1BQ0EsVUFBQTtBQUFBLE1BQ0EsbUJBQUE7QUFBQSxNQUNB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