vite-plugin-react-server
Version:
Vite plugin for React Server Components (RSC)
135 lines (132 loc) • 16.2 kB
JavaScript
/**
* vite-plugin-react-server
* Copyright (c) Nico Brinkkemper
* MIT License
*/
import 'node:worker_threads';
import { fileURLToPath } from 'node:url';
import { resolveConfig, preprocessCSS } from 'vite';
import { readFile } from 'node:fs/promises';
import { env } from '../utils/env.js';
import { hydrateUserOptions } from '../helpers/hydrateUserOptions.js';
import { toError } from '../error/toError.js';
import { sendMessage } from '../worker/sendMessage.js';
let loaderPort;
let resolvedConfig;
let userOptions;
async function initialize(data) {
loaderPort = data.port;
resolvedConfig = data.resolvedConfig;
const resolvedUserOptions = hydrateUserOptions(data.userOptions);
if (resolvedUserOptions.type === "error") {
if (loaderPort) {
sendMessage(
{
type: "ERROR",
id: "css-loader",
error: resolvedUserOptions.error
},
loaderPort
);
}
throw resolvedUserOptions.error;
}
userOptions = resolvedUserOptions.userOptions;
if (loaderPort) {
sendMessage(
{
type: "INITIALIZED_CSS_LOADER",
id: data.id
},
loaderPort
);
}
}
async function processCssFile(filePath, inline) {
try {
const path = filePath.startsWith("file://") ? fileURLToPath(filePath) : filePath;
const source = await readFile(path, "utf-8");
let moduleID = path;
if (userOptions?.normalizer) {
const [, value] = userOptions.normalizer(path);
moduleID = userOptions.moduleID?.(value || path) || path;
}
let processed;
try {
const viteConfig = await resolveConfig(
{
...resolvedConfig,
env,
// do-not re-resolve the config file as it would import the plugin again which we do not need.
configFile: false
},
"serve"
);
processed = await preprocessCSS(source, path, viteConfig);
} catch (error) {
if (loaderPort) {
sendMessage(
{
type: "ERROR",
id: moduleID,
error: toError(error)
},
loaderPort
);
}
processed = { code: source, modules: {} };
}
if (loaderPort) {
sendMessage(
{
type: "CSS_FILE",
id: moduleID,
content: processed.code
},
loaderPort
);
}
if (inline) {
return {
format: "module",
source: processed.code,
shortCircuit: true
};
}
return {
format: "module",
source: `export default ${JSON.stringify(processed.modules || {})};`,
shortCircuit: true
};
} catch (error) {
const err = toError(error);
if (loaderPort) {
sendMessage(
{
type: "ERROR",
id: "css-loader",
error: err
},
loaderPort
);
}
throw err;
}
}
const load = async (url, context, defaultLoad) => {
const [name, query] = url.split("?");
if (name.endsWith(".css")) {
let isInline = query?.startsWith("inline") || query?.includes("&inline");
if (isInline && query.includes("inline=")) {
const match = query.match(/inline=(1|true|0|false)/)?.[1];
isInline = match === "1" || match === "true";
}
return processCssFile(url, isInline);
}
return defaultLoad(url, context);
};
const resolve = (specifier, context, defaultResolve) => {
return defaultResolve(specifier, context);
};
export { initialize, load, loaderPort, resolve };
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3NzLWxvYWRlci5qcyIsInNvdXJjZXMiOlsiLi4vLi4vLi4vcGx1Z2luL2xvYWRlci9jc3MtbG9hZGVyLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IHR5cGUgTWVzc2FnZVBvcnQgfSBmcm9tIFwibm9kZTp3b3JrZXJfdGhyZWFkc1wiO1xuaW1wb3J0IHR5cGUgeyBMb2FkSG9vaywgUmVzb2x2ZUhvb2ssIE1vZHVsZUZvcm1hdCB9IGZyb20gXCJub2RlOm1vZHVsZVwiO1xuaW1wb3J0IHR5cGUge1xuICBSZXNvbHZlZFVzZXJPcHRpb25zLFxuICBTZXJpYWxpemVkUmVzb2x2ZWRDb25maWcsXG4gIFNlcmlhbGl6ZWRVc2VyT3B0aW9ucyxcbn0gZnJvbSBcIi4uL3R5cGVzLmpzXCI7XG5pbXBvcnQgeyBmaWxlVVJMVG9QYXRoIH0gZnJvbSBcIm5vZGU6dXJsXCI7XG5pbXBvcnQgeyBwcmVwcm9jZXNzQ1NTLCByZXNvbHZlQ29uZmlnIH0gZnJvbSBcInZpdGVcIjtcbmltcG9ydCB7IHJlYWRGaWxlIH0gZnJvbSBcIm5vZGU6ZnMvcHJvbWlzZXNcIjtcbmltcG9ydCB7IGVudiB9IGZyb20gXCIuLi91dGlscy9lbnYuanNcIjtcbmltcG9ydCB0eXBlIHtcbiAgQ3NzRmlsZU1lc3NhZ2UsXG4gIEluaXRpYWxpemVkQ3NzTG9hZGVyTWVzc2FnZSxcbn0gZnJvbSBcIi4uL3dvcmtlci9yc2MvdHlwZXMuanNcIjtcbmltcG9ydCB7IGh5ZHJhdGVVc2VyT3B0aW9ucyB9IGZyb20gXCIuLi9oZWxwZXJzL2h5ZHJhdGVVc2VyT3B0aW9ucy5qc1wiO1xuaW1wb3J0IHsgdG9FcnJvciB9IGZyb20gXCIuLi9lcnJvci90b0Vycm9yLmpzXCI7XG5pbXBvcnQgeyBzZW5kTWVzc2FnZSB9IGZyb20gXCIuLi93b3JrZXIvc2VuZE1lc3NhZ2UuanNcIjtcbmltcG9ydCB0eXBlIHsgRXJyb3JNZXNzYWdlIH0gZnJvbSBcIi4uL3dvcmtlci90eXBlcy5qc1wiO1xuXG4vKipcbiAqIEdsb2JhbCBwb3J0IGZvciBjb21tdW5pY2F0aW9uIGJldHdlZW4gdGhlIG1haW4gdGhyZWFkIGFuZCB0aGUgQ1NTIGxvYWRlci5cbiAqIFRoaXMgcG9ydCBpcyB1c2VkIHRvIHNlbmQgQ1NTIGZpbGUgcmVxdWVzdHMgYW5kIHJlY2VpdmUgcmVzcG9uc2VzLlxuICovXG5leHBvcnQgbGV0IGxvYWRlclBvcnQ6IE1lc3NhZ2VQb3J0IHwgdW5kZWZpbmVkO1xuXG5sZXQgcmVzb2x2ZWRDb25maWc6IFNlcmlhbGl6ZWRSZXNvbHZlZENvbmZpZyB8IG51bGw7XG5sZXQgdXNlck9wdGlvbnM6IFJlc29sdmVkVXNlck9wdGlvbnMgfCB1bmRlZmluZWQ7XG5cbi8qKlxuICogSW5pdGlhbGl6ZXMgdGhlIENTUyBsb2FkZXIgd2l0aCB0aGUgbmVjZXNzYXJ5IGNvbW11bmljYXRpb24gY2hhbm5lbHMuXG4gKiBTZXRzIHVwIG1lc3NhZ2UgaGFuZGxlcnMgZm9yIENTUyBmaWxlIHJlcXVlc3RzIGFuZCByZXNwb25zZXMuXG4gKlxuICogQHBhcmFtIGRhdGEgLSBDb25maWd1cmF0aW9uIGRhdGEgZm9yIHRoZSBDU1MgbG9hZGVyXG4gKiBAcGFyYW0gZGF0YS5wb3J0IC0gVGhlIG1lc3NhZ2UgcG9ydCBmb3IgY29tbXVuaWNhdGlvblxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gaW5pdGlhbGl6ZShkYXRhOiB7XG4gIGlkOiBzdHJpbmc7XG4gIHBvcnQ6IE1lc3NhZ2VQb3J0O1xuICByZXNvbHZlZENvbmZpZzogU2VyaWFsaXplZFJlc29sdmVkQ29uZmlnO1xuICB1c2VyT3B0aW9uczogU2VyaWFsaXplZFVzZXJPcHRpb25zO1xufSkge1xuICBsb2FkZXJQb3J0ID0gZGF0YS5wb3J0O1xuICByZXNvbHZlZENvbmZpZyA9IGRhdGEucmVzb2x2ZWRDb25maWc7XG4gIGNvbnN0IHJlc29sdmVkVXNlck9wdGlvbnMgPSBoeWRyYXRlVXNlck9wdGlvbnMoZGF0YS51c2VyT3B0aW9ucyk7XG4gIGlmIChyZXNvbHZlZFVzZXJPcHRpb25zLnR5cGUgPT09IFwiZXJyb3JcIikge1xuICAgIGlmIChsb2FkZXJQb3J0KSB7XG4gICAgICBzZW5kTWVzc2FnZShcbiAgICAgICAge1xuICAgICAgICAgIHR5cGU6IFwiRVJST1JcIixcbiAgICAgICAgICBpZDogXCJjc3MtbG9hZGVyXCIsXG4gICAgICAgICAgZXJyb3I6IHJlc29sdmVkVXNlck9wdGlvbnMuZXJyb3IsXG4gICAgICAgIH0gc2F0aXNmaWVzIEVycm9yTWVzc2FnZSxcbiAgICAgICAgbG9hZGVyUG9ydFxuICAgICAgKTtcbiAgICB9XG4gICAgdGhyb3cgcmVzb2x2ZWRVc2VyT3B0aW9ucy5lcnJvcjtcbiAgfVxuXG4gIC8vIFVzZSB0aGUgaHlkcmF0ZWQgdXNlciBvcHRpb25zIGRpcmVjdGx5IChpbmNsdWRlcyByZWNyZWF0ZWQgZnVuY3Rpb25zKVxuICB1c2VyT3B0aW9ucyA9IHJlc29sdmVkVXNlck9wdGlvbnMudXNlck9wdGlvbnM7XG5cbiAgaWYgKGxvYWRlclBvcnQpIHtcbiAgICBzZW5kTWVzc2FnZShcbiAgICAgIHtcbiAgICAgICAgdHlwZTogXCJJTklUSUFMSVpFRF9DU1NfTE9BREVSXCIsXG4gICAgICAgIGlkOiBkYXRhLmlkLFxuICAgICAgfSBzYXRpc2ZpZXMgSW5pdGlhbGl6ZWRDc3NMb2FkZXJNZXNzYWdlLFxuICAgICAgbG9hZGVyUG9ydFxuICAgICk7XG4gIH1cbn1cblxuLyoqXG4gKiBQcm9jZXNzZXMgYSBDU1MgZmlsZSByZXF1ZXN0LlxuICogU2VuZHMgYSByZXF1ZXN0IHRvIHRoZSBtYWluIHRocmVhZCBhbmQgd2FpdHMgZm9yIHRoZSBwcm9jZXNzZWQgQ1NTLlxuICpcbiAqIEBwYXJhbSBmaWxlUGF0aCAtIFRoZSBmaWxlIHN5c3RlbSBwYXRoIG9mIHRoZSBDU1MgZmlsZVxuICogQHBhcmFtIGNvbmZpZyAtIFRoZSBWaXRlIGNvbmZpZ1xuICogQHJldHVybnMgQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgdG8gdGhlIHByb2Nlc3NlZCBDU1MgY29udGVudFxuICovXG5hc3luYyBmdW5jdGlvbiBwcm9jZXNzQ3NzRmlsZShcbiAgZmlsZVBhdGg6IHN0cmluZyxcbiAgaW5saW5lOiBib29sZWFuXG4pOiBQcm9taXNlPHsgZm9ybWF0OiBNb2R1bGVGb3JtYXQ7IHNvdXJjZTogc3RyaW5nOyBzaG9ydENpcmN1aXQ6IGJvb2xlYW4gfT4ge1xuICB0cnkge1xuICAgIC8vIENvbnZlcnQgZmlsZSBVUkwgdG8gcGF0aCBpZiBuZWVkZWRcbiAgICBjb25zdCBwYXRoID0gZmlsZVBhdGguc3RhcnRzV2l0aChcImZpbGU6Ly9cIilcbiAgICAgID8gZmlsZVVSTFRvUGF0aChmaWxlUGF0aClcbiAgICAgIDogZmlsZVBhdGg7XG5cbiAgICAvLyBQcm9jZXNzIENTUyB1c2luZyBWaXRlJ3MgcHJlcHJvY2Vzc0NTU1xuICAgIGNvbnN0IHNvdXJjZSA9IGF3YWl0IHJlYWRGaWxlKHBhdGgsIFwidXRmLThcIik7XG4gICAgbGV0IG1vZHVsZUlEID0gcGF0aDtcbiAgICBpZiAodXNlck9wdGlvbnM/Lm5vcm1hbGl6ZXIpIHtcbiAgICAgIGNvbnN0IFssIHZhbHVlXSA9IHVzZXJPcHRpb25zLm5vcm1hbGl6ZXIocGF0aCk7XG4gICAgICBtb2R1bGVJRCA9IHVzZXJPcHRpb25zLm1vZHVsZUlEPy4odmFsdWUgfHwgcGF0aCkgfHwgcGF0aDtcbiAgICB9XG4gICAgLy8gVHJ5IHRvIHByb2Nlc3MgQ1NTIHdpdGggcHJlcHJvY2Vzc0NTUywgZmFsbCBiYWNrIHRvIHJhdyBDU1MgaWYgY29uZmlnIGlzIGluY29tcGxldGVcbiAgICBsZXQgcHJvY2Vzc2VkOiB7IGNvZGU6IHN0cmluZzsgbW9kdWxlcz86IGFueSB9O1xuICAgIHRyeSB7XG4gICAgICAvLyBDcmVhdGUgYSBtaW5pbWFsIGNvbmZpZyB3aXRoIGVudmlyb25tZW50cyB0aGF0IHByZXByb2Nlc3NDU1MgZXhwZWN0c1xuICAgICAgY29uc3Qgdml0ZUNvbmZpZyA9IGF3YWl0IHJlc29sdmVDb25maWcoXG4gICAgICAgIHtcbiAgICAgICAgICAuLi5yZXNvbHZlZENvbmZpZyxcbiAgICAgICAgICBlbnY6IGVudixcbiAgICAgICAgICAvLyBkby1ub3QgcmUtcmVzb2x2ZSB0aGUgY29uZmlnIGZpbGUgYXMgaXQgd291bGQgaW1wb3J0IHRoZSBwbHVnaW4gYWdhaW4gd2hpY2ggd2UgZG8gbm90IG5lZWQuXG4gICAgICAgICAgY29uZmlnRmlsZTogZmFsc2UsXG4gICAgICAgIH0sXG4gICAgICAgIFwic2VydmVcIlxuICAgICAgKTtcblxuICAgICAgcHJvY2Vzc2VkID0gYXdhaXQgcHJlcHJvY2Vzc0NTUyhzb3VyY2UsIHBhdGgsIHZpdGVDb25maWcpO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAvLyBJZiBwcmVwcm9jZXNzQ1NTIGZhaWxzLCBmYWxsIGJhY2sgdG8gcmF3IENTU1xuICAgICAgaWYgKGxvYWRlclBvcnQpIHtcbiAgICAgICAgc2VuZE1lc3NhZ2UoXG4gICAgICAgICAge1xuICAgICAgICAgICAgdHlwZTogXCJFUlJPUlwiLFxuICAgICAgICAgICAgaWQ6IG1vZHVsZUlELFxuICAgICAgICAgICAgZXJyb3I6IHRvRXJyb3IoZXJyb3IpLFxuICAgICAgICAgIH0gc2F0aXNmaWVzIEVycm9yTWVzc2FnZSxcbiAgICAgICAgICBsb2FkZXJQb3J0XG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICBwcm9jZXNzZWQgPSB7IGNvZGU6IHNvdXJjZSwgbW9kdWxlczoge30gfTtcbiAgICB9XG5cbiAgICAvLyBJZiB3ZSdyZSBwcm9jZXNzaW5nIENTUyBmb3IgYSBzcGVjaWZpYyBwYWdlLCBub3RpZnkgdGhlIG1lc3NhZ2UgaGFuZGxlclxuICAgIGlmIChsb2FkZXJQb3J0KSB7XG4gICAgICBzZW5kTWVzc2FnZShcbiAgICAgICAge1xuICAgICAgICAgIHR5cGU6IFwiQ1NTX0ZJTEVcIixcbiAgICAgICAgICBpZDogbW9kdWxlSUQsXG4gICAgICAgICAgY29udGVudDogcHJvY2Vzc2VkLmNvZGUsXG4gICAgICAgIH0gc2F0aXNmaWVzIENzc0ZpbGVNZXNzYWdlLFxuICAgICAgICBsb2FkZXJQb3J0XG4gICAgICApO1xuICAgIH1cblxuICAgIC8vIFJldHVybiBhIG1vZHVsZSB0aGF0IGNhbiBiZSB1c2VkIGJ5IFJlYWN0IGNvbXBvbmVudHNcbiAgICBpZiAoaW5saW5lKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBmb3JtYXQ6IFwibW9kdWxlXCIsXG4gICAgICAgIHNvdXJjZTogcHJvY2Vzc2VkLmNvZGUsXG4gICAgICAgIHNob3J0Q2lyY3VpdDogdHJ1ZSxcbiAgICAgIH07XG4gICAgfVxuICAgIHJldHVybiB7XG4gICAgICBmb3JtYXQ6IFwibW9kdWxlXCIsXG4gICAgICBzb3VyY2U6IGBleHBvcnQgZGVmYXVsdCAke0pTT04uc3RyaW5naWZ5KHByb2Nlc3NlZC5tb2R1bGVzIHx8IHt9KX07YCxcbiAgICAgIHNob3J0Q2lyY3VpdDogdHJ1ZSxcbiAgICB9O1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGNvbnN0IGVyciA9IHRvRXJyb3IoZXJyb3IpO1xuICAgIGlmIChsb2FkZXJQb3J0KSB7XG4gICAgICBzZW5kTWVzc2FnZShcbiAgICAgICAge1xuICAgICAgICAgIHR5cGU6IFwiRVJST1JcIixcbiAgICAgICAgICBpZDogXCJjc3MtbG9hZGVyXCIsXG4gICAgICAgICAgZXJyb3I6IGVycixcbiAgICAgICAgfSBzYXRpc2ZpZXMgRXJyb3JNZXNzYWdlLFxuICAgICAgICBsb2FkZXJQb3J0XG4gICAgICApO1xuICAgIH1cbiAgICB0aHJvdyBlcnI7XG4gIH1cbn1cblxuLyoqXG4gKiBWaXRlJ3MgbG9hZCBob29rIGltcGxlbWVudGF0aW9uIGZvciBDU1MgZmlsZXMuXG4gKiBIYW5kbGVzIENTUyBmaWxlIGxvYWRpbmcgcmVxdWVzdHMgYW5kIHJldHVybnMgYSBwbGFjZWhvbGRlciBtb2R1bGUuXG4gKiBUaGUgYWN0dWFsIENTUyBjb250ZW50IGlzIHByb2Nlc3NlZCBpbiB0aGUgbWFpbiB0aHJlYWQuXG4gKlxuICogQHBhcmFtIHVybCAtIFRoZSBVUkwgb2YgdGhlIG1vZHVsZSB0byBsb2FkXG4gKiBAcGFyYW0gY29udGV4dCAtIFRoZSBsb2FkIGhvb2sgY29udGV4dFxuICogQHBhcmFtIGRlZmF1bHRMb2FkIC0gVGhlIGRlZmF1bHQgbG9hZCBmdW5jdGlvblxuICogQHJldHVybnMgQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgdG8gdGhlIG1vZHVsZSBjb250ZW50XG4gKi9cbmV4cG9ydCBjb25zdCBsb2FkOiBMb2FkSG9vayA9IGFzeW5jICh1cmwsIGNvbnRleHQsIGRlZmF1bHRMb2FkKSA9PiB7XG4gIGNvbnN0IFtuYW1lLCBxdWVyeV0gPSB1cmwuc3BsaXQoXCI/XCIpO1xuICBpZiAobmFtZS5lbmRzV2l0aChcIi5jc3NcIikpIHtcbiAgICBsZXQgaXNJbmxpbmUgPSBxdWVyeT8uc3RhcnRzV2l0aChcImlubGluZVwiKSB8fCBxdWVyeT8uaW5jbHVkZXMoXCImaW5saW5lXCIpO1xuICAgIGlmIChpc0lubGluZSAmJiBxdWVyeS5pbmNsdWRlcygnaW5saW5lPScpKSB7XG4gICAgICAvLyBoYW5kbGUgPSB0cnVlL2ZhbHNlXG4gICAgICBjb25zdCBtYXRjaCA9IHF1ZXJ5Lm1hdGNoKC9pbmxpbmU9KDF8dHJ1ZXwwfGZhbHNlKS8pPy5bMV07XG4gICAgICBpc0lubGluZSA9IG1hdGNoID09PSAnMScgfHwgbWF0Y2ggPT09ICd0cnVlJztcbiAgICB9XG4gICAgcmV0dXJuIHByb2Nlc3NDc3NGaWxlKHVybCwgaXNJbmxpbmUpO1xuICB9XG5cbiAgcmV0dXJuIGRlZmF1bHRMb2FkKHVybCwgY29udGV4dCk7XG59O1xuXG4vKipcbiAqIFZpdGUncyByZXNvbHZlIGhvb2sgaW1wbGVtZW50YXRpb24uXG4gKiBIYW5kbGVzIG1vZHVsZSByZXNvbHV0aW9uIGR1cmluZyBkZXZlbG9wbWVudC5cbiAqXG4gKiBAcGFyYW0gc3BlY2lmaWVyIC0gVGhlIG1vZHVsZSBzcGVjaWZpZXIgdG8gcmVzb2x2ZVxuICogQHBhcmFtIGNvbnRleHQgLSBUaGUgcmVzb2x2ZSBob29rIGNvbnRleHRcbiAqIEBwYXJhbSBkZWZhdWx0UmVzb2x2ZSAtIFRoZSBkZWZhdWx0IHJlc29sdmUgZnVuY3Rpb25cbiAqIEByZXR1cm5zIEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHRvIHRoZSByZXNvbHZlZCBtb2R1bGVcbiAqL1xuZXhwb3J0IGNvbnN0IHJlc29sdmU6IFJlc29sdmVIb29rID0gKHNwZWNpZmllciwgY29udGV4dCwgZGVmYXVsdFJlc29sdmUpID0+IHtcbiAgcmV0dXJuIGRlZmF1bHRSZXNvbHZlKHNwZWNpZmllciwgY29udGV4dCk7XG59O1xuIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7O0FBd0JXLElBQUE7QUFFWCxJQUFJLGNBQUE7QUFDSixJQUFJLFdBQUE7QUFTSixlQUFzQixXQUFXLElBSzlCLEVBQUE7QUFDRCxFQUFBLFVBQUEsR0FBYSxJQUFLLENBQUEsSUFBQTtBQUNsQixFQUFBLGNBQUEsR0FBaUIsSUFBSyxDQUFBLGNBQUE7QUFDdEIsRUFBTSxNQUFBLG1CQUFBLEdBQXNCLGtCQUFtQixDQUFBLElBQUEsQ0FBSyxXQUFXLENBQUE7QUFDL0QsRUFBSSxJQUFBLG1CQUFBLENBQW9CLFNBQVMsT0FBUyxFQUFBO0FBQ3hDLElBQUEsSUFBSSxVQUFZLEVBQUE7QUFDZCxNQUFBLFdBQUE7QUFBQSxRQUNFO0FBQUEsVUFDRSxJQUFNLEVBQUEsT0FBQTtBQUFBLFVBQ04sRUFBSSxFQUFBLFlBQUE7QUFBQSxVQUNKLE9BQU8sbUJBQW9CLENBQUE7QUFBQSxTQUM3QjtBQUFBLFFBQ0E7QUFBQSxPQUNGO0FBQUE7QUFFRixJQUFBLE1BQU0sbUJBQW9CLENBQUEsS0FBQTtBQUFBO0FBSTVCLEVBQUEsV0FBQSxHQUFjLG1CQUFvQixDQUFBLFdBQUE7QUFFbEMsRUFBQSxJQUFJLFVBQVksRUFBQTtBQUNkLElBQUEsV0FBQTtBQUFBLE1BQ0U7QUFBQSxRQUNFLElBQU0sRUFBQSx3QkFBQTtBQUFB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