UNPKG

vite-plugin-react-server

Version:
117 lines (114 loc) 18.9 kB
/** * vite-plugin-react-server * Copyright (c) Nico Brinkkemper * MIT License */ import { readFileSync } from 'node:fs'; import { configureReactServer } from './configureReactServer.client.js'; import { resolveOptions } from '../config/resolveOptions.js'; import { detectClientModule } from 'react-server-loader/directives'; const vitePluginReactDevServer = function _vitePluginReactServerDevClient(options) { if (options == null) { throw new Error("options is required"); } if (options.verbose) ; const resolvedOptions = resolveOptions(options); if (resolvedOptions.type === "error") { if (resolvedOptions.error != null) { throw resolvedOptions.error; } throw new Error("Failed to resolve options"); } const userOptions = resolvedOptions.userOptions; let configEnv; let hmrHandler = null; let isProcessingHmr = false; return { name: "vite-plugin-react-server:dev-server-client", apply: "serve", // Only apply in dev server mode // No applyToEnvironment — hotUpdate needs to run for all environments // that should work regardless of environment filtering config(_config, viteConfigEnv) { configEnv = viteConfigEnv; }, configureServer(server) { server.config.logger.info(`[vite-plugin-react-server] Dev server plugin configured for client environment`); hmrHandler = configureReactServer({ server, autoDiscoveredFiles: { propsMap: /* @__PURE__ */ new Map(), pageMap: /* @__PURE__ */ new Map(), rootMap: /* @__PURE__ */ new Map(), htmlMap: /* @__PURE__ */ new Map(), routeMap: /* @__PURE__ */ new Map(), urlMap: /* @__PURE__ */ new Map(), errors: [], workerPaths: {}, serverEntry: null, clientEntry: {}, clientInputs: {}, staticInputs: {}, serverInputs: {}, // staticManifest removed from AutoDiscoveredFiles serverActions: {} }, userOptions, configEnv, serverManifest: {}, resolvedConfig: server.config }); }, hotUpdate(ctx) { const { file, server } = ctx; const envName = ctx.environment?.name ?? "unknown"; if (envName !== "client") return; if (isProcessingHmr) { return void 0; } const moduleBase = userOptions.moduleBase || "src"; const projectRoot = userOptions.projectRoot || server.config.root; const normalizedFile = file.replace(projectRoot, "").replace(/^\/+/, ""); const isInModuleBase = normalizedFile.startsWith(moduleBase + "/"); const isSourceFile = isInModuleBase && (file.endsWith(".tsx") || file.endsWith(".ts") || file.endsWith(".jsx") || file.endsWith(".js")); const isCssFile = isInModuleBase && (file.endsWith(".css") || file.endsWith(".scss") || file.endsWith(".sass") || file.endsWith(".less")); const isClientFile = isSourceFile && (() => { try { const source = readFileSync(file, "utf-8"); return detectClientModule({ source, moduleId: file }); } catch { return false; } })(); const isServerFile = isSourceFile && !isClientFile; const shouldInvalidateWorker = isServerFile || isCssFile; if (shouldInvalidateWorker && hmrHandler) { isProcessingHmr = true; try { if (userOptions.verbose) { server.config.logger.info(`[vite-plugin-react-server] File changed: ${file}, sending HMR update...`); } hmrHandler.sendHmrUpdate(file); server.ws.send({ type: "custom", event: "vite-plugin-react-server:server-component-update", data: { file: normalizedFile, path: file, kind: isCssFile ? "css" : "component" } }); setTimeout(() => { isProcessingHmr = false; }, 100); } catch (error) { server.config.logger.error(`[vite-plugin-react-server] Error handling HMR update: ${error}`); isProcessingHmr = false; } if (isCssFile) return []; } else if (shouldInvalidateWorker && !hmrHandler) { if (userOptions.verbose) { server.config.logger.warn(`[vite-plugin-react-server] Source file changed but HMR handler not available yet: ${file}`); } } } }; }; export { vitePluginReactDevServer }; //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGx1Z2luLmNsaWVudC5qcyIsInNvdXJjZXMiOlsiLi4vLi4vLi4vcGx1Z2luL2Rldi1zZXJ2ZXIvcGx1Z2luLmNsaWVudC50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyByZWFkRmlsZVN5bmMgfSBmcm9tIFwibm9kZTpmc1wiO1xuaW1wb3J0IHR5cGUgeyBWaXRlUGx1Z2luRm4gfSBmcm9tIFwiLi4vLi4vdHlwZXMuanNcIjtcbmltcG9ydCB7IGNvbmZpZ3VyZVJlYWN0U2VydmVyIH0gZnJvbSBcIi4vY29uZmlndXJlUmVhY3RTZXJ2ZXIuY2xpZW50LmpzXCI7XG5pbXBvcnQgeyByZXNvbHZlT3B0aW9ucyB9IGZyb20gXCIuLi9jb25maWcvcmVzb2x2ZU9wdGlvbnMuanNcIjtcbmltcG9ydCB7IGRldGVjdENsaWVudE1vZHVsZSB9IGZyb20gXCJyZWFjdC1zZXJ2ZXItbG9hZGVyL2RpcmVjdGl2ZXNcIjtcbmltcG9ydCB0eXBlIHsgQ29uZmlnRW52IH0gZnJvbSBcInZpdGVcIjtcblxuXG4vKipcbiAqIERldiBzZXJ2ZXIgcGx1Z2luIGZvciBjbGllbnQgZW52aXJvbm1lbnQuXG4gKiBVc2VzIGNvbmZpZ3VyZVNlcnZlciBob29rIGZvciBwcm9wZXIgZGV2IHNlcnZlciBzZXR1cC5cbiAqL1xuZXhwb3J0IGNvbnN0IHZpdGVQbHVnaW5SZWFjdERldlNlcnZlcjogVml0ZVBsdWdpbkZuID0gZnVuY3Rpb24gX3ZpdGVQbHVnaW5SZWFjdFNlcnZlckRldkNsaWVudChvcHRpb25zKSB7XG4gIGlmIChvcHRpb25zID09IG51bGwpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXCJvcHRpb25zIGlzIHJlcXVpcmVkXCIpO1xuICB9XG5cbiAgaWYgKG9wdGlvbnMudmVyYm9zZSkge1xuICB9XG4gIFxuICBjb25zdCByZXNvbHZlZE9wdGlvbnMgPSByZXNvbHZlT3B0aW9ucyhvcHRpb25zKTtcbiAgaWYgKHJlc29sdmVkT3B0aW9ucy50eXBlID09PSBcImVycm9yXCIpIHtcbiAgICBpZiAocmVzb2x2ZWRPcHRpb25zLmVycm9yICE9IG51bGwpIHtcbiAgICAgIHRocm93IHJlc29sdmVkT3B0aW9ucy5lcnJvcjtcbiAgICB9XG4gICAgdGhyb3cgbmV3IEVycm9yKFwiRmFpbGVkIHRvIHJlc29sdmUgb3B0aW9uc1wiKTtcbiAgfVxuICBjb25zdCB1c2VyT3B0aW9ucyA9IHJlc29sdmVkT3B0aW9ucy51c2VyT3B0aW9ucztcbiAgXG5cbiAgbGV0IGNvbmZpZ0VudjogQ29uZmlnRW52IHwgdW5kZWZpbmVkO1xuICBsZXQgaG1ySGFuZGxlcjogeyBzZW5kSG1yVXBkYXRlOiAoZmlsZTogc3RyaW5nLCByb3V0ZXM/OiBzdHJpbmdbXSkgPT4gdm9pZCB9IHwgbnVsbCA9IG51bGw7XG4gIGxldCBpc1Byb2Nlc3NpbmdIbXIgPSBmYWxzZTsgLy8gUHJldmVudCByZWN1cnNpdmUgSE1SIHVwZGF0ZXNcblxuICByZXR1cm4ge1xuICAgIG5hbWU6IFwidml0ZS1wbHVnaW4tcmVhY3Qtc2VydmVyOmRldi1zZXJ2ZXItY2xpZW50XCIsXG4gICAgYXBwbHk6IFwic2VydmVcIiwgLy8gT25seSBhcHBseSBpbiBkZXYgc2VydmVyIG1vZGVcbiAgICAvLyBObyBhcHBseVRvRW52aXJvbm1lbnQg4oCUIGhvdFVwZGF0ZSBuZWVkcyB0byBydW4gZm9yIGFsbCBlbnZpcm9ubWVudHNcbiAgICAvLyB0aGF0IHNob3VsZCB3b3JrIHJlZ2FyZGxlc3Mgb2YgZW52aXJvbm1lbnQgZmlsdGVyaW5nXG4gICAgY29uZmlnKF9jb25maWcsIHZpdGVDb25maWdFbnYpIHtcbiAgICAgIGNvbmZpZ0VudiA9IHZpdGVDb25maWdFbnY7XG4gIFxuICAgIH0sXG4gICAgY29uZmlndXJlU2VydmVyKHNlcnZlcikgeyAgICAgIFxuICAgICAgLy8gTG9nIHRoYXQgcGx1Z2luIGlzIGJlaW5nIGNvbmZpZ3VyZWRcbiAgICAgIHNlcnZlci5jb25maWcubG9nZ2VyLmluZm8oYFt2aXRlLXBsdWdpbi1yZWFjdC1zZXJ2ZXJdIERldiBzZXJ2ZXIgcGx1Z2luIGNvbmZpZ3VyZWQgZm9yIGNsaWVudCBlbnZpcm9ubWVudGApO1xuICAgICAgXG4gICAgICAvLyBDb25maWd1cmUgdGhlIFJlYWN0IHNlcnZlciBmb3IgY2xpZW50IGVudmlyb25tZW50ICh3b3JrZXItYmFzZWQpXG4gICAgICAvLyBUaGlzIHVzZXMgdGhlIGV4aXN0aW5nIGNvbmZpZ3VyZVJlYWN0U2VydmVyLmNsaWVudC5qcyBpbXBsZW1lbnRhdGlvblxuICAgICAgaG1ySGFuZGxlciA9IGNvbmZpZ3VyZVJlYWN0U2VydmVyKHtcbiAgICAgICAgc2VydmVyLFxuICAgICAgICBhdXRvRGlzY292ZXJlZEZpbGVzOiB7XG4gICAgICAgICAgcHJvcHNNYXA6IG5ldyBNYXAoKSxcbiAgICAgICAgICBwYWdlTWFwOiBuZXcgTWFwKCksXG4gICAgICAgICAgcm9vdE1hcDogbmV3IE1hcCgpLFxuICAgICAgICAgIGh0bWxNYXA6IG5ldyBNYXAoKSxcbiAgICAgICAgICByb3V0ZU1hcDogbmV3IE1hcCgpLFxuICAgICAgICAgIHVybE1hcDogbmV3IE1hcCgpLFxuICAgICAgICAgIGVycm9yczogW10sXG4gICAgICAgICAgd29ya2VyUGF0aHM6IHt9LFxuICAgICAgICAgIHNlcnZlckVudHJ5OiBudWxsLFxuICAgICAgICAgIGNsaWVudEVudHJ5OiB7fSxcbiAgICAgICAgICBjbGllbnRJbnB1dHM6IHt9LFxuICAgICAgICAgIHN0YXRpY0lucHV0czoge30sXG4gICAgICAgICAgc2VydmVySW5wdXRzOiB7fSxcbiAgICAgICAgICAvLyBzdGF0aWNNYW5pZmVzdCByZW1vdmVkIGZyb20gQXV0b0Rpc2NvdmVyZWRGaWxlc1xuICAgICAgICAgIHNlcnZlckFjdGlvbnM6IHt9LFxuICAgICAgICB9LFxuICAgICAgICB1c2VyT3B0aW9ucyxcbiAgICAgICAgY29uZmlnRW52OiBjb25maWdFbnYhLFxuICAgICAgICBzZXJ2ZXJNYW5pZmVzdDoge30sIFxuICAgICAgICByZXNvbHZlZENvbmZpZzogc2VydmVyLmNvbmZpZyxcbiAgICAgIH0pO1xuICAgIH0sXG4gICAgaG90VXBkYXRlKGN0eDogYW55KSB7XG4gICAgICBjb25zdCB7IGZpbGUsIHNlcnZlciB9ID0gY3R4O1xuICAgICAgY29uc3QgZW52TmFtZSA9IGN0eC5lbnZpcm9ubWVudD8ubmFtZSA/PyAndW5rbm93bic7XG4gICAgICBcbiAgICAgIC8vIE9ubHkgcnVuIHdvcmtlciBpbnZhbGlkYXRpb24gZnJvbSB0aGUgY2xpZW50IGVudmlyb25tZW50IChvbmNlIHBlciBjaGFuZ2UpXG4gICAgICBpZiAoZW52TmFtZSAhPT0gJ2NsaWVudCcpIHJldHVybjtcbiAgICAgIFxuICAgICAgLy8gUHJldmVudCByZWN1cnNpdmUgSE1SIHVwZGF0ZXNcbiAgICAgIGlmIChpc1Byb2Nlc3NpbmdIbXIpIHtcbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgIH1cbiAgICAgIFxuICAgICAgLy8gSGFuZGxlIHNlcnZlciBjb21wb25lbnQgZmlsZSBjaGFuZ2VzXG4gICAgICBjb25zdCBtb2R1bGVCYXNlID0gdXNlck9wdGlvbnMubW9kdWxlQmFzZSB8fCBcInNyY1wiO1xuICAgICAgY29uc3QgcHJvamVjdFJvb3QgPSB1c2VyT3B0aW9ucy5wcm9qZWN0Um9vdCB8fCBzZXJ2ZXIuY29uZmlnLnJvb3Q7XG4gICAgICBcbiAgICAgIC8vIE5vcm1hbGl6ZSBwYXRocyBmb3IgY29tcGFyaXNvbiAoaGFuZGxlIGJvdGggYWJzb2x1dGUgYW5kIHJlbGF0aXZlKVxuICAgICAgY29uc3Qgbm9ybWFsaXplZEZpbGUgPSBmaWxlLnJlcGxhY2UocHJvamVjdFJvb3QsICcnKS5yZXBsYWNlKC9eXFwvKy8sICcnKTtcbiAgICAgIGNvbnN0IGlzSW5Nb2R1bGVCYXNlID0gbm9ybWFsaXplZEZpbGUuc3RhcnRzV2l0aChtb2R1bGVCYXNlICsgJy8nKTtcbiAgICAgIGNvbnN0IGlzU291cmNlRmlsZSA9IGlzSW5Nb2R1bGVCYXNlICYmXG4gICAgICAgIChmaWxlLmVuZHNXaXRoKCcudHN4JykgfHwgZmlsZS5lbmRzV2l0aCgnLnRzJykgfHwgZmlsZS5lbmRzV2l0aCgnLmpzeCcpIHx8IGZpbGUuZW5kc1dpdGgoJy5qcycpKTtcbiAgICAgIC8vIENTUyBlZGl0cyByb3V0ZSB0aHJvdWdoIHRoZSBzYW1lIHdvcmtlci1pbnZhbGlkYXRpb24gcGF0aCBzbyB0aGVcbiAgICAgIC8vIE1vZHVsZVJ1bm5lciBjYWNoZSBkcm9wcyBldmVyeSByZWFjaGFibGUgQ1NTIG1vZHVsZSBiZWZvcmUgdGhlXG4gICAgICAvLyBuZXh0IHJlbmRlciBhc2tzIGZvciBjbGFzcy1uYW1lIGhhc2hlcy5cbiAgICAgIGNvbnN0IGlzQ3NzRmlsZSA9IGlzSW5Nb2R1bGVCYXNlICYmXG4gICAgICAgIChmaWxlLmVuZHNXaXRoKCcuY3NzJykgfHwgZmlsZS5lbmRzV2l0aCgnLnNjc3MnKSB8fCBmaWxlLmVuZHNXaXRoKCcuc2FzcycpIHx8IGZpbGUuZW5kc1dpdGgoJy5sZXNzJykpO1xuXG4gICAgICAvLyBTa2lwIGNsaWVudCBjb21wb25lbnRzIOKAlCBWaXRlIG93bnMgY2xpZW50LXNpZGUgSE1SIChGYXN0IFJlZnJlc2hcbiAgICAgIC8vIHdoZW4gYEB2aXRlanMvcGx1Z2luLXJlYWN0YCBpcyBpbnN0YWxsZWQsIHBsYWluIHJlbG9hZCBvdGhlcndpc2UpLlxuICAgICAgLy8gV29ya2VyIGludmFsaWRhdGlvbiBpcyBmb3IgdGhlIHNlcnZlciB0cmVlLlxuICAgICAgY29uc3QgaXNDbGllbnRGaWxlID0gaXNTb3VyY2VGaWxlICYmICgoKSA9PiB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgY29uc3Qgc291cmNlID0gcmVhZEZpbGVTeW5jKGZpbGUsIFwidXRmLThcIik7XG4gICAgICAgICAgcmV0dXJuIGRldGVjdENsaWVudE1vZHVsZSh7IHNvdXJjZSwgbW9kdWxlSWQ6IGZpbGUgfSk7XG4gICAgICAgIH0gY2F0Y2ggeyByZXR1cm4gZmFsc2U7IH1cbiAgICAgIH0pKCk7XG5cbiAgICAgIGNvbnN0IGlzU2VydmVyRmlsZSA9IGlzU291cmNlRmlsZSAmJiAhaXNDbGllbnRGaWxlO1xuICAgICAgY29uc3Qgc2hvdWxkSW52YWxpZGF0ZVdvcmtlciA9IGlzU2VydmVyRmlsZSB8fCBpc0Nzc0ZpbGU7XG5cbiAgICAgIGlmIChzaG91bGRJbnZhbGlkYXRlV29ya2VyICYmIGhtckhhbmRsZXIpIHtcbiAgICAgICAgaXNQcm9jZXNzaW5nSG1yID0gdHJ1ZTtcblxuICAgICAgICB0cnkge1xuICAgICAgICAgIGlmICh1c2VyT3B0aW9ucy52ZXJib3NlKSB7XG4gICAgICAgICAgICBzZXJ2ZXIuY29uZmlnLmxvZ2dlci5pbmZvKGBbdml0ZS1wbHVnaW4tcmVhY3Qtc2VydmVyXSBGaWxlIGNoYW5nZWQ6ICR7ZmlsZX0sIHNlbmRpbmcgSE1SIHVwZGF0ZS4uLmApO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIC8vIFRlbGwgdGhlIHdvcmtlciB0byBpbnZhbGlkYXRlLiBJdHMgSE1SX1VQREFURSBoYW5kbGVyIGNsZWFycyB0aGVcbiAgICAgICAgICAvLyBNb2R1bGVSdW5uZXIgY2FjaGUgc28gdGhlIG5leHQgaW1wb3J0IHJlLWZldGNoZXMgdHJhbnNmb3JtZWQgY29kZVxuICAgICAgICAgIC8vIHRocm91Z2ggVml0ZSDigJQgbm8gd29ya2VyIHJlc3RhcnQgbmVlZGVkLlxuICAgICAgICAgIGhtckhhbmRsZXIuc2VuZEhtclVwZGF0ZShmaWxlKTtcblxuICAgICAgICAgIC8vIE5vdGlmeSB0aGUgYnJvd3NlciB0byByZWZldGNoIHRoZSBSU0Mgc3RyZWFtLiBJbiBkZXY6cnNjIHRoZVxuICAgICAgICAgIC8vIGVxdWl2YWxlbnQgc2VuZCBsaXZlcyBpbiBwbHVnaW4uc2VydmVyLnRzJ3MgaG1yUGx1Z2luLCB3aGljaCBvbmx5XG4gICAgICAgICAgLy8gcnVucyB1bmRlciB0aGUgcmVhY3Qtc2VydmVyIG9yY2hlc3RyYXRvci4gZGV2OnNzciAodGhpcyBwbHVnaW4pXG4gICAgICAgICAgLy8gbmV2ZXIgbG9hZHMgdGhhdCBvcmNoZXN0cmF0b3IsIHNvIHdpdGhvdXQgc2VuZGluZyB0aGUgZXZlbnQgaGVyZVxuICAgICAgICAgIC8vIHRoZSB3b3JrZXIgaW52YWxpZGF0ZXMgY29ycmVjdGx5IGJ1dCB0aGUgYnJvd3NlciBrZWVwcyBzaG93aW5nXG4gICAgICAgICAgLy8gcHJlLWVkaXQgY29udGVudCDigJQgYHVzZVJzY0htcmAgbGlzdGVucyBmb3IgdGhpcyBldmVudCBhbmQgb25seVxuICAgICAgICAgIC8vIHJlZmV0Y2hlcyBvbiByZWNlaXB0LiBGb3IgQ1NTIGZpbGVzIHRoZSBjb25zdW1lcidzIDxsaW5rPiB0YWdcbiAgICAgICAgICAvLyBzdGlsbCBwb2ludHMgYXQgdGhlIHNhbWUgVVJMIGFmdGVyIHRoZSBlZGl0LCBzbyB3ZSB0YWcgdGhlIGV2ZW50XG4gICAgICAgICAgLy8gc28gdGhlIGNsaWVudCBhbHNvIGNhY2hlLWJ1c3RzIG1hdGNoaW5nIHN0eWxlc2hlZXRzLlxuICAgICAgICAgIHNlcnZlci53cy5zZW5kKHtcbiAgICAgICAgICAgIHR5cGU6IFwiY3VzdG9tXCIsXG4gICAgICAgICAgICBldmVudDogXCJ2aXRlLXBsdWdpbi1yZWFjdC1zZXJ2ZXI6c2VydmVyLWNvbXBvbmVudC11cGRhdGVcIixcbiAgICAgICAgICAgIGRhdGE6IHsgZmlsZTogbm9ybWFsaXplZEZpbGUsIHBhdGg6IGZpbGUsIGtpbmQ6IGlzQ3NzRmlsZSA/IFwiY3NzXCIgOiBcImNvbXBvbmVudFwiIH0sXG4gICAgICAgICAgfSk7XG5cbiAgICAgICAgICAvLyBUaGUgcnVubmVyIHRha2VzIGNhcmUgb2YgcGVyLW1vZHVsZSBpbnZhbGlkYXRpb24sIHNvIHRoZSBvbmx5XG4gICAgICAgICAgLy8gdGhpbmcgbGVmdCB0byBjbGVhciBoZXJlIGlzIHRoZSBsb2NhbCBwcm9jZXNzaW5nIGZsYWcuXG4gICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICBpc1Byb2Nlc3NpbmdIbXIgPSBmYWxzZTtcbiAgICAgICAgICB9LCAxMDApO1xuICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgIHNlcnZlci5jb25maWcubG9nZ2VyLmVycm9yKGBbdml0ZS1wbHVnaW4tcmVhY3Qtc2VydmVyXSBFcnJvciBoYW5kbGluZyBITVIgdXBkYXRlOiAke2Vycm9yfWApO1xuICAgICAgICAgIGlzUHJvY2Vzc2luZ0htciA9IGZhbHNlO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gRm9yIENTUyBlZGl0cyBpbiBkZXY6c3NyLCBzdXBwcmVzcyBWaXRlJ3MgZGVmYXVsdCBiZWhhdmlvci4gVml0ZSdzXG4gICAgICAgIC8vIGZhbGxiYWNrIGZvciBtb2R1bGUtZ3JhcGgtdW50cmFja2VkIENTUyBpcyBhIGZ1bGwgcGFnZSByZWxvYWQsIGFuZFxuICAgICAgICAvLyBldmVuIHRyYWNrZWQgQ1NTIG1vZHVsZXMgaW4gZGV2OnNzciBjYW4gZmFsbCBiYWNrIHRvIHJlbG9hZCBiZWNhdXNlXG4gICAgICAgIC8vIHZwcnMgcmVuZGVycyB0aGVtIHNlcnZlci1zaWRlIHZpYSB0aGUgPENzcyBjc3NGaWxlcz17Li4ufS8+IHBhdHRlcm5cbiAgICAgICAgLy8gKHRoZSBjbGllbnQgbmV2ZXIgZGlyZWN0bHkgaW1wb3J0cyB0aGVtLCBzbyBWaXRlJ3MgQ1NTIEhNUiBpc24ndFxuICAgICAgICAvLyByZWFjaGFibGUpLiB1c2VSc2NIbXIgaGFuZGxlcyBib3RoIHNoYXBlczpcbiAgICAgICAgLy8gIC0gaW5saW5lZCA8c3R5bGU+OiByZWZldGNoIGJyaW5ncyBuZXcgY29udGVudFxuICAgICAgICAvLyAgLSA8bGluayBocmVmPeKApj46ICAgcmVmcmVzaENzc0xpbmtzIGNhY2hlLWJ1c3RzIHRoZSBVUkxcbiAgICAgICAgaWYgKGlzQ3NzRmlsZSkgcmV0dXJuIFtdO1xuICAgICAgfSBlbHNlIGlmIChzaG91bGRJbnZhbGlkYXRlV29ya2VyICYmICFobXJIYW5kbGVyKSB7XG4gICAgICAgIGlmICh1c2VyT3B0aW9ucy52ZXJib3NlKSB7XG4gICAgICAgICAgc2VydmVyLmNvbmZpZy5sb2dnZXIud2FybihgW3ZpdGUtcGx1Z2luLXJlYWN0LXNlcnZlcl0gU291cmNlIGZpbGUgY2hhbmdlZCBidXQgSE1SIGhhbmRsZXIgbm90IGF2YWlsYWJsZSB5ZXQ6ICR7ZmlsZX1gKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBEb24ndCBzdXBwcmVzcyDigJQgcGx1Z2luLnNlcnZlci50cyBob3RVcGRhdGUgaGFuZGxlcyBwYWdlIHJlbG9hZCBwcmV2ZW50aW9uXG4gICAgfSxcbiAgfTtcbn07XG4iXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7OztBQVlhLE1BQUEsd0JBQUEsR0FBeUMsU0FBUywrQkFBQSxDQUFnQyxPQUFTLEVBQUE7QUFDdEcsRUFBQSxJQUFJLFdBQVcsSUFBTSxFQUFBO0FBQ25CLElBQU0sTUFBQSxJQUFJLE1BQU0scUJBQXFCLENBQUE7QUFBQTtBQUd2QyxFQUFBLElBQUksUUFBUSxPQUFTLEVBQUE7QUFHckIsRUFBTSxNQUFBLGVBQUEsR0FBa0IsZUFBZSxPQUFPLENBQUE7QUFDOUMsRUFBSSxJQUFBLGVBQUEsQ0FBZ0IsU0FBUyxPQUFTLEVBQUE7QUFDcEMsSUFBSSxJQUFBLGVBQUEsQ0FBZ0IsU0FBUyxJQUFNLEVBQUE7QUFDakMsTUFBQSxNQUFNLGVBQWdCLENBQUEsS0FBQTtBQUFBO0FBRXhCLElBQU0sTUFBQSxJQUFJLE1BQU0sMkJBQTJCLENBQUE7QUFBQTtBQUU3QyxFQUFBLE1BQU0sY0FBYyxlQUFnQixDQUFBLFdBQUE7QUFHcEMsRUFBSSxJQUFBLFNBQUE7QUFDSixFQUFBLElBQUksVUFBa0YsR0FBQSxJQUFBO0FBQ3RGLEVBQUEsSUFBSSxlQUFrQixHQUFBLEtBQUE7QUFFdEIsRUFBTyxPQUFBO0FBQUEsSUFDTCxJQUFNLEVBQUEsNENBQUE7QUFBQSxJQUNOLEtBQU8sRUFBQSxPQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsSUFHUCxNQUFBLENBQU8s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