vite-plugin-react-server 1.4.2 → 1.4.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (73) hide show
  1. package/README.md +48 -313
  2. package/dist/package.json +123 -13
  3. package/dist/plugin/bundle/deferredStaticGeneration.js +14 -39
  4. package/dist/plugin/bundle/manifests.js +30 -48
  5. package/dist/plugin/config/autoDiscover/resolveAutoDiscover.d.ts.map +1 -1
  6. package/dist/plugin/config/autoDiscover/resolveAutoDiscover.js +4 -1
  7. package/dist/plugin/config/envPrefixFromConfig.js +12 -7
  8. package/dist/plugin/config/getCondition.d.ts.map +1 -1
  9. package/dist/plugin/config/getCondition.js +7 -5
  10. package/dist/plugin/dev-server/virtualRscHmrPlugin.js +23 -23
  11. package/dist/plugin/environments/createBuildEventPlugin.js +88 -98
  12. package/dist/plugin/environments/createEnvironmentPlugin.js +222 -250
  13. package/dist/plugin/helpers/createRscRenderHelpers.js +33 -34
  14. package/dist/plugin/helpers/createSharedLoader.d.ts.map +1 -1
  15. package/dist/plugin/helpers/createSharedLoader.js +4 -2
  16. package/dist/plugin/helpers/headlessStreamReuseHandler.js +30 -22
  17. package/dist/plugin/helpers/headlessStreamState.js +15 -28
  18. package/dist/plugin/helpers/resolveComponent.d.ts.map +1 -1
  19. package/dist/plugin/helpers/resolveComponent.js +4 -2
  20. package/dist/plugin/index.client.d.ts +5 -0
  21. package/dist/plugin/index.client.d.ts.map +1 -0
  22. package/dist/plugin/index.client.js +4 -0
  23. package/dist/plugin/index.d.ts +4 -3
  24. package/dist/plugin/index.d.ts.map +1 -1
  25. package/dist/plugin/index.js +10 -5
  26. package/dist/plugin/index.server.d.ts +5 -0
  27. package/dist/plugin/index.server.d.ts.map +1 -0
  28. package/dist/plugin/index.server.js +4 -0
  29. package/dist/plugin/metrics/createWorkerStartupMetrics.js +31 -13
  30. package/dist/plugin/orchestrator/createPluginOrchestrator.client.js +41 -38
  31. package/dist/plugin/orchestrator/createPluginOrchestrator.server.js +43 -46
  32. package/dist/plugin/plugin.client.js +2 -2
  33. package/dist/plugin/plugin.server.js +2 -2
  34. package/dist/plugin/react-static/createBuildLoader.client.js +12 -6
  35. package/dist/plugin/react-static/createBuildLoader.server.js +255 -235
  36. package/dist/plugin/react-static/plugin.client.js +684 -770
  37. package/dist/plugin/react-static/plugin.server.js +517 -603
  38. package/dist/plugin/react-static/processCssFilesForPages.js +103 -88
  39. package/dist/plugin/react-static/renderPage.client.js +455 -529
  40. package/dist/plugin/react-static/renderPage.server.js +485 -508
  41. package/dist/plugin/react-static/renderPagesBatched.js +277 -275
  42. package/dist/plugin/react-static/rscToHtmlStream.client.js +48 -29
  43. package/dist/plugin/react-static/rscToHtmlStream.server.js +62 -37
  44. package/dist/plugin/react-static/temporaryReferences.server.js +11 -2
  45. package/dist/plugin/stream/createMainThreadHandlers.js +40 -31
  46. package/dist/plugin/stream/renderRscStream.server.d.ts.map +1 -1
  47. package/dist/plugin/stream/renderRscStream.server.js +127 -144
  48. package/dist/plugin/transformer/createTransformerPlugin.js +226 -265
  49. package/dist/plugin/utils/checkReactVersion.d.ts +7 -0
  50. package/dist/plugin/utils/checkReactVersion.d.ts.map +1 -0
  51. package/dist/plugin/utils/checkReactVersion.js +23 -0
  52. package/dist/plugin/utils/envUrls.node.js +12 -11
  53. package/dist/plugin/vendor/vendor-alias.js +84 -114
  54. package/dist/plugin/vendor/vendor.client.d.ts.map +1 -1
  55. package/dist/plugin/vendor/vendor.client.js +1 -3
  56. package/dist/plugin/worker/rsc/handleRscRender.d.ts.map +1 -1
  57. package/dist/plugin/worker/rsc/handleRscRender.js +3 -1
  58. package/dist/tsconfig.tsbuildinfo +1 -1
  59. package/package.json +123 -13
  60. package/plugin/config/autoDiscover/resolveAutoDiscover.ts +4 -0
  61. package/plugin/config/getCondition.ts +6 -4
  62. package/plugin/helpers/createSharedLoader.ts +6 -1
  63. package/plugin/helpers/resolveComponent.ts +6 -1
  64. package/plugin/index.client.ts +4 -0
  65. package/plugin/index.server.ts +4 -0
  66. package/plugin/index.ts +12 -5
  67. package/plugin/plugin.client.ts +1 -1
  68. package/plugin/plugin.server.ts +1 -1
  69. package/plugin/stream/renderRscStream.server.ts +3 -0
  70. package/plugin/utils/checkReactVersion.ts +28 -0
  71. package/plugin/vendor/vendor.client.ts +0 -2
  72. package/plugin/worker/rsc/handleRscRender.ts +2 -0
  73. package/scripts/generate-toc.mjs +27 -294
@@ -4,7 +4,7 @@
4
4
  * MIT License
5
5
  */
6
6
  import { assertReactServer } from './config/getCondition.js';
7
- import { createPluginOrchestrator } from './orchestrator/createPluginOrchestrator.js';
7
+ import { createPluginOrchestrator } from './orchestrator/createPluginOrchestrator.server.js';
8
8
 
9
9
  assertReactServer();
10
10
  const vitePluginReactServer = function _vitePluginReactServer(options, strategy) {
@@ -28,4 +28,4 @@ const vitePluginReactServer = function _vitePluginReactServer(options, strategy)
28
28
  };
29
29
 
30
30
  export { vitePluginReactServer };
31
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGx1Z2luLnNlcnZlci5qcyIsInNvdXJjZXMiOlsiLi4vLi4vcGx1Z2luL3BsdWdpbi5zZXJ2ZXIudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgeyBWaXRlUGx1Z2luTWFpbkZuIH0gZnJvbSBcIi4vdHlwZXMuanNcIjtcbmltcG9ydCB0eXBlIHsgVXNlck9wdGlvbnMsIFN0cmF0ZWd5IH0gZnJvbSBcIi4vb3JjaGVzdHJhdG9yL3R5cGVzLmpzXCI7XG5cbmltcG9ydCB7IGFzc2VydFJlYWN0U2VydmVyIH0gZnJvbSBcIi4vY29uZmlnL2dldENvbmRpdGlvbi5qc1wiO1xuaW1wb3J0IHsgY3JlYXRlUGx1Z2luT3JjaGVzdHJhdG9yIH0gZnJvbSBcIi4vb3JjaGVzdHJhdG9yL2NyZWF0ZVBsdWdpbk9yY2hlc3RyYXRvci5qc1wiO1xuXG5hc3NlcnRSZWFjdFNlcnZlcigpO1xuXG4vKipcbiAqIE1haW4gZW50cnlwb2ludCBmb3IgUmVhY3QgU2VydmVyIENvbXBvbmVudHMuXG4gKlxuICogVGhpcyBwbHVnaW4gdXNlcyB0aGUgaW50ZWxsaWdlbnQgb3JjaGVzdHJhdG9yIHRvIGFkYXB0IGl0cyBiZWhhdmlvciBiYXNlZCBvbiB0aGUgYnVpbGQgY29udGV4dDpcbiAqIC0gSW4gRW52aXJvbm1lbnQgQVBJIGJ1aWxkczogbGV2ZXJhZ2VzIGZ1bGwgUlNDIGNhcGFiaWxpdGllc1xuICogLSBXaXRoIHN0YXRpYyBwYWdlczogYWRkcyBzdGF0aWMgZ2VuZXJhdGlvbiBwbHVnaW4gd2hlbiBhcHByb3ByaWF0ZVxuICpcbiAqIFVzZSB0aGlzIGZvciBzZXJ2ZXItc2lkZSByZW5kZXJpbmcgYW5kIHN0YXRpYyBnZW5lcmF0aW9uIHdpdGggZnVsbCBSU0Mgc3VwcG9ydC5cbiAqIENvbmZpZ3VyZSB0aGUgYnVpbGQgdGFyZ2V0IHRocm91Z2ggdGhlIHN0cmF0ZWd5IHBhcmFtZXRlci5cbiAqIEBwYXJhbSBvcHRpb25zXG4gKiBAcGFyYW0gc3RyYXRlZ3lcbiAqIEByZXR1cm5zXG4gKi9cbmV4cG9ydCBjb25zdCB2aXRlUGx1Z2luUmVhY3RTZXJ2ZXI6IFZpdGVQbHVnaW5NYWluRm4gPVxuICBmdW5jdGlvbiBfdml0ZVBsdWdpblJlYWN0U2VydmVyKG9wdGlvbnMsIHN0cmF0ZWd5PzogU3RyYXRlZ3kpIHtcbiAgICBpZiAob3B0aW9ucyA9PSBudWxsKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJvcHRpb25zIGlzIHJlcXVpcmVkXCIpO1xuICAgIH1cblxuXG4gICAgLy8gVXNlIHRoZSBpbnRlbGxpZ2VudCBvcmNoZXN0cmF0b3IgZm9yIHBsdWdpbiBjb21wb3NpdGlvbiB3aXRoIHNlcnZlciBjb250ZXh0XG4gICAgY29uc3QgdXNlclN0cmF0ZWd5ID0gKG9wdGlvbnMgYXMgVXNlck9wdGlvbnMpLnN0cmF0ZWd5IHx8IHt9O1xuICAgIGNvbnN0IGZpbmFsU3RyYXRlZ3k6IFN0cmF0ZWd5ID0ge1xuICAgICAgbW9kZTogXCJhdXRvXCIsIC8vIFNlcnZlciBidWlsZHNcbiAgICAgIGltcG9ydENvbnRleHQ6IFwicmVhY3Qtc2VydmVyXCIsIC8vIEluZGljYXRlIHRoaXMgY2FtZSBmcm9tIHNlcnZlciBjb250ZXh0XG4gICAgICBlbnZpcm9ubWVudFRhcmdldHM6IG5ldyBNYXAoW1tcImNsaWVudFwiLCBcImNsaWVudFwiXSwgW1wic3NyXCIsIFwic3NyXCJdLCBbXCJzZXJ2ZXJcIiwgXCJzZXJ2ZXJcIl1dKSwgXG4gICAgICAuLi51c2VyU3RyYXRlZ3ksXG4gICAgICAuLi5zdHJhdGVneVxuICAgIH07XG4gICAgXG5cbiAgICByZXR1cm4gY3JlYXRlUGx1Z2luT3JjaGVzdHJhdG9yKHtcbiAgICAgIC4uLm9wdGlvbnMsXG4gICAgICBzdHJhdGVneTogZmluYWxTdHJhdGVneVxuICAgIH0pO1xuICB9O1xuXG4iXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7QUFNQSxpQkFBa0IsRUFBQTtBQWVYLE1BQU0scUJBQ1gsR0FBQSxTQUFTLHNCQUF1QixDQUFBLE9BQUEsRUFBUyxRQUFxQixFQUFBO0FBQzVELEVBQUEsSUFBSSxXQUFXLElBQU0sRUFBQTtBQUNuQixJQUFNLE1BQUEsSUFBSSxNQUFNLHFCQUFxQixDQUFBO0FBQUE7QUFLdkMsRUFBTSxNQUFBLFlBQUEsR0FBZ0IsT0FBd0IsQ0FBQSxRQUFBLElBQVksRUFBQztBQUMzRCxFQUFBLE1BQU0sYUFBMEIsR0FBQTtBQUFBLElBQzlCLElBQU0sRUFBQSxNQUFBO0FBQUE7QUFBQSxJQUNOLGFBQWUsRUFBQSxjQUFBO0FBQUE7QUFBQSxJQUNmLG9DQUF3QixJQUFBLEdBQUEsQ0FBSSxDQUFDLENBQUMsVUFBVSxRQUFRLENBQUEsRUFBRyxDQUFDLEtBQUEsRUFBTyxLQUFLLENBQUcsRUFBQSxDQUFDLFFBQVUsRUFBQSxRQUFRLENBQUMsQ0FBQyxDQUFBO0FBQUEsSUFDeEYsR0FBRyxZQUFBO0FBQUEsSUFDSCxHQUFHO0FBQUEsR0FDTDtBQUdBLEVBQUEsT0FBTyx3QkFBeUIsQ0FBQTtBQUFBLElBQzlCLEdBQUcsT0FBQTtBQUFBLElBQ0gsUUFBVSxFQUFBO0FBQUEsR0FDWCxDQUFBO0FBQ0g7Ozs7In0=
31
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGx1Z2luLnNlcnZlci5qcyIsInNvdXJjZXMiOlsiLi4vLi4vcGx1Z2luL3BsdWdpbi5zZXJ2ZXIudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgeyBWaXRlUGx1Z2luTWFpbkZuIH0gZnJvbSBcIi4vdHlwZXMuanNcIjtcbmltcG9ydCB0eXBlIHsgVXNlck9wdGlvbnMsIFN0cmF0ZWd5IH0gZnJvbSBcIi4vb3JjaGVzdHJhdG9yL3R5cGVzLmpzXCI7XG5cbmltcG9ydCB7IGFzc2VydFJlYWN0U2VydmVyIH0gZnJvbSBcIi4vY29uZmlnL2dldENvbmRpdGlvbi5qc1wiO1xuaW1wb3J0IHsgY3JlYXRlUGx1Z2luT3JjaGVzdHJhdG9yIH0gZnJvbSBcIi4vb3JjaGVzdHJhdG9yL2NyZWF0ZVBsdWdpbk9yY2hlc3RyYXRvci5zZXJ2ZXIuanNcIjtcblxuYXNzZXJ0UmVhY3RTZXJ2ZXIoKTtcblxuLyoqXG4gKiBNYWluIGVudHJ5cG9pbnQgZm9yIFJlYWN0IFNlcnZlciBDb21wb25lbnRzLlxuICpcbiAqIFRoaXMgcGx1Z2luIHVzZXMgdGhlIGludGVsbGlnZW50IG9yY2hlc3RyYXRvciB0byBhZGFwdCBpdHMgYmVoYXZpb3IgYmFzZWQgb24gdGhlIGJ1aWxkIGNvbnRleHQ6XG4gKiAtIEluIEVudmlyb25tZW50IEFQSSBidWlsZHM6IGxldmVyYWdlcyBmdWxsIFJTQyBjYXBhYmlsaXRpZXNcbiAqIC0gV2l0aCBzdGF0aWMgcGFnZXM6IGFkZHMgc3RhdGljIGdlbmVyYXRpb24gcGx1Z2luIHdoZW4gYXBwcm9wcmlhdGVcbiAqXG4gKiBVc2UgdGhpcyBmb3Igc2VydmVyLXNpZGUgcmVuZGVyaW5nIGFuZCBzdGF0aWMgZ2VuZXJhdGlvbiB3aXRoIGZ1bGwgUlNDIHN1cHBvcnQuXG4gKiBDb25maWd1cmUgdGhlIGJ1aWxkIHRhcmdldCB0aHJvdWdoIHRoZSBzdHJhdGVneSBwYXJhbWV0ZXIuXG4gKiBAcGFyYW0gb3B0aW9uc1xuICogQHBhcmFtIHN0cmF0ZWd5XG4gKiBAcmV0dXJuc1xuICovXG5leHBvcnQgY29uc3Qgdml0ZVBsdWdpblJlYWN0U2VydmVyOiBWaXRlUGx1Z2luTWFpbkZuID1cbiAgZnVuY3Rpb24gX3ZpdGVQbHVnaW5SZWFjdFNlcnZlcihvcHRpb25zLCBzdHJhdGVneT86IFN0cmF0ZWd5KSB7XG4gICAgaWYgKG9wdGlvbnMgPT0gbnVsbCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwib3B0aW9ucyBpcyByZXF1aXJlZFwiKTtcbiAgICB9XG5cblxuICAgIC8vIFVzZSB0aGUgaW50ZWxsaWdlbnQgb3JjaGVzdHJhdG9yIGZvciBwbHVnaW4gY29tcG9zaXRpb24gd2l0aCBzZXJ2ZXIgY29udGV4dFxuICAgIGNvbnN0IHVzZXJTdHJhdGVneSA9IChvcHRpb25zIGFzIFVzZXJPcHRpb25zKS5zdHJhdGVneSB8fCB7fTtcbiAgICBjb25zdCBmaW5hbFN0cmF0ZWd5OiBTdHJhdGVneSA9IHtcbiAgICAgIG1vZGU6IFwiYXV0b1wiLCAvLyBTZXJ2ZXIgYnVpbGRzXG4gICAgICBpbXBvcnRDb250ZXh0OiBcInJlYWN0LXNlcnZlclwiLCAvLyBJbmRpY2F0ZSB0aGlzIGNhbWUgZnJvbSBzZXJ2ZXIgY29udGV4dFxuICAgICAgZW52aXJvbm1lbnRUYXJnZXRzOiBuZXcgTWFwKFtbXCJjbGllbnRcIiwgXCJjbGllbnRcIl0sIFtcInNzclwiLCBcInNzclwiXSwgW1wic2VydmVyXCIsIFwic2VydmVyXCJdXSksIFxuICAgICAgLi4udXNlclN0cmF0ZWd5LFxuICAgICAgLi4uc3RyYXRlZ3lcbiAgICB9O1xuICAgIFxuXG4gICAgcmV0dXJuIGNyZWF0ZVBsdWdpbk9yY2hlc3RyYXRvcih7XG4gICAgICAuLi5vcHRpb25zLFxuICAgICAgc3RyYXRlZ3k6IGZpbmFsU3RyYXRlZ3lcbiAgICB9KTtcbiAgfTtcblxuIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7O0FBTUEsaUJBQWtCLEVBQUE7QUFlWCxNQUFNLHFCQUNYLEdBQUEsU0FBUyxzQkFBdUIsQ0FBQSxPQUFBLEVBQVMsUUFBcUIsRUFBQTtBQUM1RCxFQUFBLElBQUksV0FBVyxJQUFNLEVBQUE7QUFDbkIsSUFBTSxNQUFBLElBQUksTUFBTSxxQkFBcUIsQ0FBQTtBQUFBO0FBS3ZDLEVBQU0sTUFBQSxZQUFBLEdBQWdCLE9BQXdCLENBQUEsUUFBQSxJQUFZLEVBQUM7QUFDM0QsRUFBQSxNQUFNLGFBQTBCLEdBQUE7QUFBQSxJQUM5QixJQUFNLEVBQUEsTUFBQTtBQUFBO0FBQUEsSUFDTixhQUFlLEVBQUEsY0FBQTtBQUFBO0FBQUEsSUFDZixvQ0FBd0IsSUFBQSxHQUFBLENBQUksQ0FBQyxDQUFDLFVBQVUsUUFBUSxDQUFBLEVBQUcsQ0FBQyxLQUFBLEVBQU8sS0FBSyxDQUFHLEVBQUEsQ0FBQyxRQUFVLEVBQUEsUUFBUSxDQUFDLENBQUMsQ0FBQTtBQUFBLElBQ3hGLEdBQUcsWUFBQTtBQUFBLElBQ0gsR0FBRztBQUFBLEdBQ0w7QUFHQSxFQUFBLE9BQU8sd0JBQXlCLENBQUE7QUFBQSxJQUM5QixHQUFHLE9BQUE7QUFBQSxJQUNILFFBQVUsRUFBQTtBQUFBLEdBQ1gsQ0FBQTtBQUNIOzs7OyJ9
@@ -1,7 +1,13 @@
1
- export function createBuildLoader() {
2
- // In client-static, the RSC worker handles all module loading
3
- // The main thread doesn't need to load modules directly
4
- return async function buildLoader(_id) {
5
- throw new Error("createBuildLoader is called from the client, but it is only available on the server.");
6
- };
1
+ /**
2
+ * vite-plugin-react-server
3
+ * Copyright (c) Nico Brinkkemper
4
+ * MIT License
5
+ */
6
+ function createBuildLoader() {
7
+ return async function buildLoader(_id) {
8
+ throw new Error("createBuildLoader is called from the client, but it is only available on the server.");
9
+ };
7
10
  }
11
+
12
+ export { createBuildLoader };
13
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3JlYXRlQnVpbGRMb2FkZXIuY2xpZW50LmpzIiwic291cmNlcyI6WyIuLi8uLi8uLi9wbHVnaW4vcmVhY3Qtc3RhdGljL2NyZWF0ZUJ1aWxkTG9hZGVyLmNsaWVudC50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgZnVuY3Rpb24gY3JlYXRlQnVpbGRMb2FkZXIoKSB7XG4gICAgLy8gSW4gY2xpZW50LXN0YXRpYywgdGhlIFJTQyB3b3JrZXIgaGFuZGxlcyBhbGwgbW9kdWxlIGxvYWRpbmdcbiAgICAvLyBUaGUgbWFpbiB0aHJlYWQgZG9lc24ndCBuZWVkIHRvIGxvYWQgbW9kdWxlcyBkaXJlY3RseVxuICAgIHJldHVybiBhc3luYyBmdW5jdGlvbiBidWlsZExvYWRlcihfaWQ6IHN0cmluZykge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJjcmVhdGVCdWlsZExvYWRlciBpcyBjYWxsZWQgZnJvbSB0aGUgY2xpZW50LCBidXQgaXQgaXMgb25seSBhdmFpbGFibGUgb24gdGhlIHNlcnZlci5cIik7XG4gICAgfTtcbn0gICAiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBTyxTQUFTLGlCQUFvQixHQUFBO0FBR2hDLEVBQU8sT0FBQSxlQUFlLFlBQVksR0FBYSxFQUFBO0FBQzNDLElBQU0sTUFBQSxJQUFJLE1BQU0sc0ZBQXNGLENBQUE7QUFBQSxHQUMxRztBQUNKOzs7OyJ9
@@ -1,253 +1,273 @@
1
- import { join, resolve } from "node:path";
2
- import { pathToFileURL } from "node:url";
3
- import { getModuleRef } from "../helpers/moduleRefs.js";
4
- import { toError } from "../error/toError.js";
5
- import { handleError } from "../error/handleError.js";
6
- import { createSharedLoader } from "../helpers/createSharedLoader.js";
7
- import { resolveVirtualAndNodeModules } from "../helpers/resolveVirtualAndNodeModules.js";
8
- import { createLogger } from "vite";
9
1
  /**
10
- * Creates a loader function for handling module resolution during build.
11
- *
12
- * The loader handles the following strategy:
13
- * - For inline modules: Handle them using bundle
2
+ * vite-plugin-react-server
3
+ * Copyright (c) Nico Brinkkemper
4
+ * MIT License
14
5
  */
15
- export const createBuildLoader = function _createBuildLoader({ userOptions, serverManifest, staticManifest }, bundle, temporaryReferences, logger = createLogger()) {
16
- const manifestKeys = Object.keys(serverManifest);
17
- if (!manifestKeys.length) {
18
- throw new Error("Server manifest is empty");
6
+ import { join, resolve } from 'node:path';
7
+ import { pathToFileURL } from 'node:url';
8
+ import { getModuleRef } from '../helpers/moduleRefs.js';
9
+ import { toError } from '../error/toError.js';
10
+ import { handleError } from '../error/handleError.js';
11
+ import { createSharedLoader } from '../helpers/createSharedLoader.js';
12
+ import { resolveVirtualAndNodeModules } from '../helpers/resolveVirtualAndNodeModules.js';
13
+ import { createLogger } from 'vite';
14
+
15
+ const createBuildLoader = function _createBuildLoader({ userOptions, serverManifest, staticManifest }, bundle, temporaryReferences, logger = createLogger()) {
16
+ const manifestKeys = Object.keys(serverManifest);
17
+ if (!manifestKeys.length) {
18
+ throw new Error("Server manifest is empty");
19
+ }
20
+ return async function buildLoader(id) {
21
+ if (userOptions.verbose) {
22
+ logger.info(`[buildLoader] id: ${id}`);
23
+ logger.info(`[buildLoader] Starting lookup for: ${id}`);
19
24
  }
20
- return async function buildLoader(id) {
25
+ const [withoutQuery, query] = id.split("?", 2);
26
+ const [moduleId, exportName] = withoutQuery.split("#", 2);
27
+ const [normalizedKey, normalizedValue] = userOptions.normalizer(moduleId);
28
+ const virtualOrNodeModule = await resolveVirtualAndNodeModules(
29
+ moduleId,
30
+ exportName,
31
+ userOptions.verbose,
32
+ logger
33
+ );
34
+ if (virtualOrNodeModule !== null) {
35
+ return virtualOrNodeModule;
36
+ }
37
+ const moduleRef = getModuleRef(id);
38
+ if (temporaryReferences?.has(moduleRef)) {
39
+ const mod = temporaryReferences.get(moduleRef);
40
+ if (typeof mod === "object" && mod !== null && "error" in mod) ; else {
41
+ return mod;
42
+ }
43
+ }
44
+ try {
45
+ if (query === "inline") {
46
+ const manifestKey = normalizedValue;
21
47
  if (userOptions.verbose) {
22
- logger.info(`[buildLoader] id: ${id}`);
23
- logger.info(`[buildLoader] Starting lookup for: ${id}`);
48
+ logger.info(
49
+ `[buildLoader] Looking for inline module: ${normalizedValue}`
50
+ );
24
51
  }
25
- const [withoutQuery, query] = id.split("?", 2);
26
- const [moduleId, exportName] = withoutQuery.split("#", 2);
27
- // Normalize the moduleId early (used throughout the function)
28
- const [normalizedKey, normalizedValue] = userOptions.normalizer(moduleId);
29
- // For virtual modules and node_modules, use shared utility (same as RSC worker loader)
30
- // This handles _virtual/dynamic-import-helper.js and provides shims if needed
31
- // Check this early, before build-specific handling
32
- const virtualOrNodeModule = await resolveVirtualAndNodeModules(moduleId, exportName, userOptions.verbose, logger);
33
- if (virtualOrNodeModule !== null) {
34
- return virtualOrNodeModule;
35
- }
36
- const moduleRef = getModuleRef(id);
37
- // Check if we have a temporary reference (cached module)
38
- if (temporaryReferences?.has(moduleRef)) {
39
- const mod = temporaryReferences.get(moduleRef);
40
- if (typeof mod === "object" && mod !== null && "error" in mod) {
41
- // ignore it
42
- }
43
- else {
44
- return mod;
52
+ let resolvedValue = normalizedValue;
53
+ if (normalizedValue.startsWith("assets/") && normalizedValue.endsWith(".css")) {
54
+ const basePath = normalizedValue.replace(
55
+ /-[a-zA-Z0-9]+\.css$/,
56
+ ".css"
57
+ );
58
+ if (userOptions.verbose) {
59
+ logger.info(
60
+ `[buildLoader] CSS file detected, trying to resolve ${normalizedValue} to ${basePath}`
61
+ );
62
+ }
63
+ if (bundle[basePath]) {
64
+ resolvedValue = basePath;
65
+ if (userOptions.verbose) {
66
+ logger.info(
67
+ `[buildLoader] Resolved CSS file to: ${resolvedValue}`
68
+ );
45
69
  }
70
+ }
46
71
  }
47
- try {
48
- // For inline modules, handle them directly
49
- if (query === "inline") {
50
- const manifestKey = normalizedValue;
72
+ if (userOptions.verbose) {
73
+ logger.info(
74
+ `[buildLoader] Trying bundle[moduleId]: bundle["${moduleId}"] = ${!!bundle[moduleId]}`
75
+ );
76
+ logger.info(
77
+ `[buildLoader] Trying bundle[normalizedValue]: bundle["${normalizedValue}"] = ${!!bundle[normalizedValue]}`
78
+ );
79
+ logger.info(
80
+ `[buildLoader] Trying bundle[resolvedValue]: bundle["${resolvedValue}"] = ${!!bundle[resolvedValue]}`
81
+ );
82
+ }
83
+ const serverChunk = bundle[moduleId] ?? bundle[normalizedValue] ?? bundle[resolvedValue] ?? bundle[serverManifest[manifestKey]?.file] ?? bundle[staticManifest[manifestKey]?.file] ?? bundle[serverManifest[normalizedKey]?.file] ?? bundle[staticManifest[normalizedKey]?.file] ?? Object.entries(bundle).find(
84
+ ([, value]) => value.name === normalizedValue
85
+ )?.[1];
86
+ if (userOptions.verbose && serverChunk) {
87
+ logger.info(`[buildLoader] Found serverChunk: ${serverChunk.type}`);
88
+ }
89
+ if (serverChunk) {
90
+ if (serverChunk.type === "asset") {
91
+ if (userOptions.autoDiscover.jsonPattern.test(normalizedValue)) {
92
+ const jsonContent = serverChunk.source;
93
+ if (typeof jsonContent === "string") {
51
94
  if (userOptions.verbose) {
52
- logger.info(`[buildLoader] Looking for inline module: ${normalizedValue}`);
53
- }
54
- // For CSS files, try to resolve the hashed filename to the actual bundle filename
55
- let resolvedValue = normalizedValue;
56
- if (normalizedValue.startsWith("assets/") &&
57
- normalizedValue.endsWith(".css")) {
58
- // Extract the base path without hash
59
- const basePath = normalizedValue.replace(/-[a-zA-Z0-9]+\.css$/, ".css");
60
- if (userOptions.verbose) {
61
- logger.info(`[buildLoader] CSS file detected, trying to resolve ${normalizedValue} to ${basePath}`);
62
- }
63
- // Try the base path first
64
- if (bundle[basePath]) {
65
- resolvedValue = basePath;
66
- if (userOptions.verbose) {
67
- logger.info(`[buildLoader] Resolved CSS file to: ${resolvedValue}`);
68
- }
69
- }
95
+ logger.info(
96
+ `[buildLoader] Returning JSON content for: ${normalizedValue}`
97
+ );
70
98
  }
71
- // First try to find the module without the export name
99
+ return { default: JSON.parse(jsonContent) };
100
+ }
101
+ } else if (userOptions.autoDiscover.cssPattern.test(normalizedValue)) {
102
+ const cssContent = serverChunk.source;
103
+ if (typeof cssContent === "string") {
72
104
  if (userOptions.verbose) {
73
- logger.info(`[buildLoader] Trying bundle[moduleId]: bundle["${moduleId}"] = ${!!bundle[moduleId]}`);
74
- logger.info(`[buildLoader] Trying bundle[normalizedValue]: bundle["${normalizedValue}"] = ${!!bundle[normalizedValue]}`);
75
- logger.info(`[buildLoader] Trying bundle[resolvedValue]: bundle["${resolvedValue}"] = ${!!bundle[resolvedValue]}`);
76
- }
77
- const serverChunk = bundle[moduleId] ??
78
- bundle[normalizedValue] ??
79
- bundle[resolvedValue] ??
80
- bundle[serverManifest[manifestKey]?.file] ??
81
- bundle[staticManifest[manifestKey]?.file] ??
82
- bundle[serverManifest[normalizedKey]?.file] ??
83
- bundle[staticManifest[normalizedKey]?.file] ??
84
- Object.entries(bundle).find(([, value]) => value.name === normalizedValue)?.[1];
85
- if (userOptions.verbose && serverChunk) {
86
- logger.info(`[buildLoader] Found serverChunk: ${serverChunk.type}`);
87
- }
88
- if (serverChunk) {
89
- if (serverChunk.type === "asset") {
90
- // For CSS files, ensure we're in the React Server environment
91
- if (userOptions.autoDiscover.jsonPattern.test(normalizedValue)) {
92
- const jsonContent = serverChunk.source;
93
- if (typeof jsonContent === "string") {
94
- if (userOptions.verbose) {
95
- logger.info(`[buildLoader] Returning JSON content for: ${normalizedValue}`);
96
- }
97
- return { default: JSON.parse(jsonContent) };
98
- }
99
- }
100
- else if (userOptions.autoDiscover.cssPattern.test(normalizedValue)) {
101
- const cssContent = serverChunk.source;
102
- if (typeof cssContent === "string") {
103
- if (userOptions.verbose) {
104
- logger.info(`[buildLoader] Returning CSS content for: ${normalizedValue}, length: ${cssContent.length}`);
105
- }
106
- return { default: cssContent };
107
- }
108
- else {
109
- if (userOptions.verbose) {
110
- logger.info(`[buildLoader] CSS source is not string: ${typeof cssContent}`);
111
- }
112
- }
113
- }
114
- if (userOptions.verbose) {
115
- logger.info(`[buildLoader] Returning default asset source for: ${normalizedValue}`);
116
- }
117
- return { default: serverChunk.source };
118
- }
119
- else if ("code" in serverChunk) {
120
- if (userOptions.verbose) {
121
- logger.info(`[buildLoader] Returning code for: ${normalizedValue}`);
122
- }
123
- return { default: serverChunk.code };
124
- }
125
- }
126
- const panicError = handleError({
127
- error: new Error(`Could not find inline module for: ${normalizedValue}`),
128
- logger,
129
- log: true,
130
- panicThreshold: userOptions.panicThreshold,
131
- context: "Build Loader Error (inline)",
132
- });
133
- if (panicError != null) {
134
- throw panicError;
135
- }
136
- return null;
137
- }
138
- // check the bundle manifest for a direct match
139
- const bundleEntry = bundle[withoutQuery];
140
- if (bundleEntry) {
141
- try {
142
- const filePath = join(userOptions.projectRoot, userOptions.build.outDir, userOptions.build.server, withoutQuery);
143
- const fileUrl = pathToFileURL(filePath).href;
144
- const module = await import(fileUrl);
145
- temporaryReferences?.set(moduleRef, module);
146
- return module;
147
- }
148
- catch (error) {
149
- const panicError = handleError({
150
- error: error,
151
- logger,
152
- panicThreshold: userOptions.panicThreshold,
153
- context: "Build Loader Error (bundle)",
154
- });
155
- temporaryReferences?.delete(moduleRef);
156
- if (panicError != null) {
157
- throw panicError;
158
- }
159
- }
160
- }
161
- // For static assets, use static manifest
162
- const staticEntry = staticManifest[normalizedValue];
163
- if (staticEntry) {
164
- try {
165
- const filePath = join(userOptions.projectRoot, userOptions.build.outDir, userOptions.build.static, staticEntry.file);
166
- const fileUrl = pathToFileURL(filePath).href;
167
- const module = await import(fileUrl);
168
- temporaryReferences?.set(moduleRef, module);
169
- // If we have an export name, make sure it's a key
170
- if (exportName && !(exportName in module)) {
171
- throw new Error(`Export ${exportName} not found in module ${normalizedValue}`);
172
- }
173
- return module;
105
+ logger.info(
106
+ `[buildLoader] Returning CSS content for: ${normalizedValue}, length: ${cssContent.length}`
107
+ );
174
108
  }
175
- catch (error) {
176
- const panicError = handleError({
177
- error: error,
178
- logger,
179
- panicThreshold: userOptions.panicThreshold,
180
- context: "Build Loader Error (static)",
181
- });
182
- temporaryReferences?.delete(moduleRef);
183
- if (panicError != null) {
184
- throw panicError;
185
- }
109
+ return { default: cssContent };
110
+ } else {
111
+ if (userOptions.verbose) {
112
+ logger.info(
113
+ `[buildLoader] CSS source is not string: ${typeof cssContent}`
114
+ );
186
115
  }
116
+ }
187
117
  }
188
- // Use shared loader utility for common cases (virtual modules, manifest resolution, imports)
189
- // This handles the same logic as RSC worker loader
190
- try {
191
- const module = await createSharedLoader({
192
- moduleId,
193
- exportName,
194
- verbose: userOptions.verbose,
195
- logger,
196
- resolveVirtual: true,
197
- manifest: serverManifest,
198
- normalizer: userOptions.normalizer,
199
- moduleBase: userOptions.moduleBase,
200
- preserveModulesRoot: userOptions.build.preserveModulesRoot,
201
- projectRoot: userOptions.projectRoot,
202
- buildOutDir: userOptions.build.outDir,
203
- buildServerDir: userOptions.build.server,
204
- isBuildMode: true,
205
- isServeMode: false,
206
- effectiveProjectRoot: userOptions.projectRoot,
207
- build: {
208
- outDir: userOptions.build.outDir,
209
- server: userOptions.build.server,
210
- client: userOptions.build.client,
211
- static: userOptions.build.static,
212
- },
213
- });
214
- // Store in temporary references for caching
215
- temporaryReferences?.set(moduleRef, module);
216
- return module;
118
+ if (userOptions.verbose) {
119
+ logger.info(
120
+ `[buildLoader] Returning default asset source for: ${normalizedValue}`
121
+ );
217
122
  }
218
- catch (error) {
219
- const err = toError(error);
220
- const panicError = handleError({
221
- error: err,
222
- logger,
223
- panicThreshold: userOptions.panicThreshold,
224
- context: "Build Loader Error (shared)",
225
- });
226
- temporaryReferences?.delete(moduleRef);
227
- if (panicError != null) {
228
- throw panicError;
229
- }
123
+ return { default: serverChunk.source };
124
+ } else if ("code" in serverChunk) {
125
+ if (userOptions.verbose) {
126
+ logger.info(
127
+ `[buildLoader] Returning code for: ${normalizedValue}`
128
+ );
230
129
  }
130
+ return { default: serverChunk.code };
131
+ }
231
132
  }
232
- catch (error) {
233
- // Enhance React Server DOM errors with import context
234
- let enhancedError = error instanceof Error ? error : new Error(String(error));
235
- if (enhancedError.message.includes('React Server Writer cannot be used outside a react-server environment')) {
236
- const filePath = resolve(userOptions.projectRoot, userOptions.build.outDir, userOptions.build.server, moduleId);
237
- enhancedError = new Error(`${enhancedError.message}\n` +
238
- ` → Imported from: ${moduleId}\n` +
239
- ` → Export: ${exportName}\n` +
240
- ` → File path: ${filePath}\n` +
241
- ` → NODE_OPTIONS: ${process.env.NODE_OPTIONS || 'not set'}\n` +
242
- ` → execArgv: ${process.execArgv.join(' ') || 'not set'}`);
243
- throw enhancedError;
244
- }
245
- const emptyExports = {
246
- error: enhancedError,
247
- id: id,
248
- };
249
- temporaryReferences?.delete(moduleRef);
250
- return emptyExports;
133
+ const panicError = handleError({
134
+ error: new Error(
135
+ `Could not find inline module for: ${normalizedValue}`
136
+ ),
137
+ logger,
138
+ log: true,
139
+ panicThreshold: userOptions.panicThreshold,
140
+ context: "Build Loader Error (inline)"
141
+ });
142
+ if (panicError != null) {
143
+ throw panicError;
251
144
  }
252
- };
145
+ return null;
146
+ }
147
+ const bundleEntry = bundle[withoutQuery];
148
+ if (bundleEntry) {
149
+ try {
150
+ const filePath = join(
151
+ userOptions.projectRoot,
152
+ userOptions.build.outDir,
153
+ userOptions.build.server,
154
+ withoutQuery
155
+ );
156
+ const fileUrl = pathToFileURL(filePath).href;
157
+ const module = await import(fileUrl);
158
+ temporaryReferences?.set(moduleRef, module);
159
+ return module;
160
+ } catch (error) {
161
+ const panicError = handleError({
162
+ error,
163
+ logger,
164
+ panicThreshold: userOptions.panicThreshold,
165
+ context: "Build Loader Error (bundle)"
166
+ });
167
+ temporaryReferences?.delete(moduleRef);
168
+ if (panicError != null) {
169
+ throw panicError;
170
+ }
171
+ }
172
+ }
173
+ const staticEntry = staticManifest[normalizedValue];
174
+ if (staticEntry) {
175
+ try {
176
+ const filePath = join(
177
+ userOptions.projectRoot,
178
+ userOptions.build.outDir,
179
+ userOptions.build.static,
180
+ staticEntry.file
181
+ );
182
+ const fileUrl = pathToFileURL(filePath).href;
183
+ const module = await import(fileUrl);
184
+ temporaryReferences?.set(moduleRef, module);
185
+ if (exportName && !(exportName in module)) {
186
+ throw new Error(
187
+ `Export ${exportName} not found in module ${normalizedValue}`
188
+ );
189
+ }
190
+ return module;
191
+ } catch (error) {
192
+ const panicError = handleError({
193
+ error,
194
+ logger,
195
+ panicThreshold: userOptions.panicThreshold,
196
+ context: "Build Loader Error (static)"
197
+ });
198
+ temporaryReferences?.delete(moduleRef);
199
+ if (panicError != null) {
200
+ throw panicError;
201
+ }
202
+ }
203
+ }
204
+ try {
205
+ const module = await createSharedLoader({
206
+ moduleId,
207
+ exportName,
208
+ verbose: userOptions.verbose,
209
+ logger,
210
+ resolveVirtual: true,
211
+ manifest: serverManifest,
212
+ normalizer: userOptions.normalizer,
213
+ moduleBase: userOptions.moduleBase,
214
+ preserveModulesRoot: userOptions.build.preserveModulesRoot,
215
+ projectRoot: userOptions.projectRoot,
216
+ buildOutDir: userOptions.build.outDir,
217
+ buildServerDir: userOptions.build.server,
218
+ isBuildMode: true,
219
+ isServeMode: false,
220
+ effectiveProjectRoot: userOptions.projectRoot,
221
+ build: {
222
+ outDir: userOptions.build.outDir,
223
+ server: userOptions.build.server,
224
+ client: userOptions.build.client,
225
+ static: userOptions.build.static
226
+ }
227
+ });
228
+ temporaryReferences?.set(moduleRef, module);
229
+ return module;
230
+ } catch (error) {
231
+ const err = toError(error);
232
+ const panicError = handleError({
233
+ error: err,
234
+ logger,
235
+ panicThreshold: userOptions.panicThreshold,
236
+ context: "Build Loader Error (shared)"
237
+ });
238
+ temporaryReferences?.delete(moduleRef);
239
+ if (panicError != null) {
240
+ throw panicError;
241
+ }
242
+ }
243
+ } catch (error) {
244
+ let enhancedError = error instanceof Error ? error : new Error(String(error));
245
+ if (enhancedError.message.includes("React Server Writer cannot be used outside a react-server environment")) {
246
+ const filePath = resolve(
247
+ userOptions.projectRoot,
248
+ userOptions.build.outDir,
249
+ userOptions.build.server,
250
+ moduleId
251
+ );
252
+ enhancedError = new Error(
253
+ `${enhancedError.message}
254
+ → Imported from: ${moduleId}
255
+ → Export: ${exportName}
256
+ → File path: ${filePath}
257
+ → NODE_OPTIONS: ${process.env.NODE_OPTIONS || "not set"}
258
+ → execArgv: ${process.execArgv.join(" ") || "not set"}`
259
+ );
260
+ throw enhancedError;
261
+ }
262
+ const emptyExports = {
263
+ error: enhancedError,
264
+ id
265
+ };
266
+ temporaryReferences?.delete(moduleRef);
267
+ return emptyExports;
268
+ }
269
+ };
253
270
  };
271
+
272
+ export { createBuildLoader };
273
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3JlYXRlQnVpbGRMb2FkZXIuc2VydmVyLmpzIiwic291cmNlcyI6WyIuLi8uLi8uLi9wbHVnaW4vcmVhY3Qtc3RhdGljL2NyZWF0ZUJ1aWxkTG9hZGVyLnNlcnZlci50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBqb2luLCByZXNvbHZlIH0gZnJvbSBcIm5vZGU6cGF0aFwiO1xuaW1wb3J0IHsgcGF0aFRvRmlsZVVSTCB9IGZyb20gXCJub2RlOnVybFwiO1xuaW1wb3J0IHsgZ2V0TW9kdWxlUmVmIH0gZnJvbSBcIi4uL2hlbHBlcnMvbW9kdWxlUmVmcy5qc1wiO1xuaW1wb3J0IHsgdG9FcnJvciB9IGZyb20gXCIuLi9lcnJvci90b0Vycm9yLmpzXCI7XG5pbXBvcnQgeyBoYW5kbGVFcnJvciB9IGZyb20gXCIuLi9lcnJvci9oYW5kbGVFcnJvci5qc1wiO1xuaW1wb3J0IHsgY3JlYXRlU2hhcmVkTG9hZGVyIH0gZnJvbSBcIi4uL2hlbHBlcnMvY3JlYXRlU2hhcmVkTG9hZGVyLmpzXCI7XG5pbXBvcnQgeyByZXNvbHZlVmlydHVhbEFuZE5vZGVNb2R1bGVzIH0gZnJvbSBcIi4uL2hlbHBlcnMvcmVzb2x2ZVZpcnR1YWxBbmROb2RlTW9kdWxlcy5qc1wiO1xuXG5pbXBvcnQgdHlwZSB7IENyZWF0ZUJ1aWxkTG9hZGVyRm4gfSBmcm9tIFwiLi90eXBlcy5qc1wiO1xuaW1wb3J0IHsgY3JlYXRlTG9nZ2VyIH0gZnJvbSBcInZpdGVcIjtcblxuLyoqXG4gKiBDcmVhdGVzIGEgbG9hZGVyIGZ1bmN0aW9uIGZvciBoYW5kbGluZyBtb2R1bGUgcmVzb2x1dGlvbiBkdXJpbmcgYnVpbGQuXG4gKlxuICogVGhlIGxvYWRlciBoYW5kbGVzIHRoZSBmb2xsb3dpbmcgc3RyYXRlZ3k6XG4gKiAgLSBGb3IgaW5saW5lIG1vZHVsZXM6IEhhbmRsZSB0aGVtIHVzaW5nIGJ1bmRsZVxuICovXG5leHBvcnQgY29uc3QgY3JlYXRlQnVpbGRMb2FkZXI6IENyZWF0ZUJ1aWxkTG9hZGVyRm4gPVxuICBmdW5jdGlvbiBfY3JlYXRlQnVpbGRMb2FkZXIoXG4gICAgeyB1c2VyT3B0aW9ucywgc2VydmVyTWFuaWZlc3QsIHN0YXRpY01hbmlmZXN0IH0sXG4gICAgYnVuZGxlLFxuICAgIHRlbXBvcmFyeVJlZmVyZW5jZXMsXG4gICAgbG9nZ2VyID0gY3JlYXRlTG9nZ2VyKClcbiAgKSB7XG4gICAgY29uc3QgbWFuaWZlc3RLZXlzID0gT2JqZWN0LmtleXMoc2VydmVyTWFuaWZlc3QpO1xuICAgIGlmICghbWFuaWZlc3RLZXlzLmxlbmd0aCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiU2VydmVyIG1hbmlmZXN0IGlzIGVtcHR5XCIpO1xuICAgIH1cblxuICAgIHJldHVybiBhc3luYyBmdW5jdGlvbiBidWlsZExvYWRlcihpZCkge1xuICAgICAgaWYgKHVzZXJPcHRpb25zLnZlcmJvc2UpIHtcbiAgICAgICAgbG9nZ2VyLmluZm8oYFtidWlsZExvYWRlcl0gaWQ6ICR7aWR9YCk7XG4gICAgICAgIGxvZ2dlci5pbmZvKGBbYnVpbGRMb2FkZXJdIFN0YXJ0aW5nIGxvb2t1cCBmb3I6ICR7aWR9YCk7XG4gICAgICB9XG4gICAgICBjb25zdCBbd2l0aG91dFF1ZXJ5LCBxdWVyeV0gPSBpZC5zcGxpdChcIj9cIiwgMik7XG4gICAgICBjb25zdCBbbW9kdWxlSWQsIGV4cG9ydE5hbWVdID0gd2l0aG91dFF1ZXJ5LnNwbGl0KFwiI1wiLCAyKTtcbiAgICAgIFxuICAgICAgLy8gTm9ybWFsaXplIHRoZSBtb2R1bGVJZCBlYXJseSAodXNlZCB0aHJvdWdob3V0IHRoZSBmdW5jdGlvbilcbiAgICAgIGNvbnN0IFtub3JtYWxpemVkS2V5LCBub3JtYWxpemVkVmFsdWVdID0gdXNlck9wdGlvbnMubm9ybWFsaXplcihtb2R1bGVJZCk7XG4gICAgICBcbiAgICAgIC8vIEZvciB2aXJ0dWFsIG1vZHVsZXMgYW5kIG5vZGVfbW9kdWxlcywgdXNlIHNoYXJlZCB1dGlsaXR5IChzYW1lIGFzIFJTQyB3b3JrZXIgbG9hZGVyKVxuICAgICAgLy8gVGhpcyBoYW5kbGVzIF92aXJ0dWFsL2R5bmFtaWMtaW1wb3J0LWhlbHBlci5qcyBhbmQgcHJvdmlkZXMgc2hpbXMgaWYgbmVlZGVkXG4gICAgICAvLyBDaGVjayB0aGlzIGVhcmx5LCBiZWZvcmUgYnVpbGQtc3BlY2lmaWMgaGFuZGxpbmdcbiAgICAgIGNvbnN0IHZpcnR1YWxPck5vZGVNb2R1bGUgPSBhd2FpdCByZXNvbHZlVmlydHVhbEFuZE5vZGVNb2R1bGVzKFxuICAgICAgICBtb2R1bGVJZCxcbiAgICAgICAgZXhwb3J0TmFtZSxcbiAgICAgICAgdXNlck9wdGlvbnMudmVyYm9zZSxcbiAgICAgICAgbG9nZ2VyXG4gICAgICApO1xuICAgICAgaWYgKHZpcnR1YWxPck5vZGVNb2R1bGUgIT09IG51bGwpIHtcbiAgICAgICAgcmV0dXJuIHZpcnR1YWxPck5vZGVNb2R1bGU7XG4gICAgICB9XG4gICAgICBcbiAgICAgIGNvbnN0IG1vZHVsZVJlZiA9IGdldE1vZHVsZVJlZihpZCk7XG5cbiAgICAgIC8vIENoZWNrIGlmIHdlIGhhdmUgYSB0ZW1wb3JhcnkgcmVmZXJlbmNlIChjYWNoZWQgbW9kdWxlKVxuICAgICAgaWYgKHRlbXBvcmFyeVJlZmVyZW5jZXM/Lmhhcyhtb2R1bGVSZWYpKSB7XG4gICAgICAgIGNvbnN0IG1vZCA9IHRlbXBvcmFyeVJlZmVyZW5jZXMuZ2V0KG1vZHVsZVJlZik7XG4gICAgICAgIGlmICh0eXBlb2YgbW9kID09PSBcIm9iamVjdFwiICYmIG1vZCAhPT0gbnVsbCAmJiBcImVycm9yXCIgaW4gbW9kKSB7XG4gICAgICAgICAgLy8gaWdub3JlIGl0XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmV0dXJuIG1vZDtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICB0cnkge1xuICAgICAgICAvLyBGb3IgaW5saW5lIG1vZHVsZXMsIGhhbmRsZSB0aGVtIGRpcmVjdGx5XG4gICAgICAgIGlmIChxdWVyeSA9PT0gXCJpbmxpbmVcIikge1xuICAgICAgICAgIGNvbnN0IG1hbmlmZXN0S2V5ID0gbm9ybWFsaXplZFZhbHVlO1xuICAgICAgICAgIGlmICh1c2VyT3B0aW9ucy52ZXJib3NlKSB7XG4gICAgICAgICAgICBsb2dnZXIuaW5mbyhcbiAgICAgICAgICAgICAgYFtidWlsZExvYWRlcl0gTG9va2luZyBmb3IgaW5saW5lIG1vZHVsZTogJHtub3JtYWxpemVkVmFsdWV9YFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICAvLyBGb3IgQ1NTIGZpbGVzLCB0cnkgdG8gcmVzb2x2ZSB0aGUgaGFzaGVkIGZpbGVuYW1lIHRvIHRoZSBhY3R1YWwgYnVuZGxlIGZpbGVuYW1lXG4gICAgICAgICAgbGV0IHJlc29sdmVkVmFsdWUgPSBub3JtYWxpemVkVmFsdWU7XG4gICAgICAgICAgaWYgKFxuICAgICAgICAgICAgbm9ybWFsaXplZFZhbHVlLnN0YXJ0c1dpdGgoXCJhc3NldHMvXCIpICYmXG4gICAgICAgICAgICBub3JtYWxpemVkVmFsdWUuZW5kc1dpdGgoXCIuY3NzXCIpXG4gICAgICAgICAgKSB7XG4gICAgICAgICAgICAvLyBFeHRyYWN0IHRoZSBiYXNlIHBhdGggd2l0aG91dCBoYXNoXG4gICAgICAgICAgICBjb25zdCBiYXNlUGF0aCA9IG5vcm1hbGl6ZWRWYWx1ZS5yZXBsYWNlKFxuICAgICAgICAgICAgICAvLVthLXpBLVowLTldK1xcLmNzcyQvLFxuICAgICAgICAgICAgICBcIi5jc3NcIlxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIGlmICh1c2VyT3B0aW9ucy52ZXJib3NlKSB7XG4gICAgICAgICAgICAgIGxvZ2dlci5pbmZvKFxuICAgICAgICAgICAgICAgIGBbYnVpbGRMb2FkZXJdIENTUyBmaWxlIGRldGVjdGVkLCB0cnlpbmcgdG8gcmVzb2x2ZSAke25vcm1hbGl6ZWRWYWx1ZX0gdG8gJHtiYXNlUGF0aH1gXG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBUcnkgdGhlIGJhc2UgcGF0aCBmaXJzdFxuICAgICAgICAgICAgaWYgKGJ1bmRsZVtiYXNlUGF0aF0pIHtcbiAgICAgICAgICAgICAgcmVzb2x2ZWRWYWx1ZSA9IGJhc2VQYXRoO1xuICAgICAgICAgICAgICBpZiAodXNlck9wdGlvbnMudmVyYm9zZSkge1xuICAgICAgICAgICAgICAgIGxvZ2dlci5pbmZvKFxuICAgICAgICAgICAgICAgICAgYFtidWlsZExvYWRlcl0gUmVzb2x2ZWQgQ1NTIGZpbGUgdG86ICR7cmVzb2x2ZWRWYWx1ZX1gXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cblxuICAgICAgICAgIC8vIEZpcnN0IHRyeSB0byBmaW5kIHRoZSBtb2R1bGUgd2l0aG91dCB0aGUgZXhwb3J0IG5hbWVcbiAgICAgICAgICBpZiAodXNlck9wdGlvbnMudmVyYm9zZSkge1xuICAgICAgICAgICAgbG9nZ2VyLmluZm8oXG4gICAgICAgICAgICAgIGBbYnVpbGRMb2FkZXJdIFRyeWluZyBidW5kbGVbbW9kdWxlSWRdOiBidW5kbGVbXCIke21vZHVsZUlkfVwiXSA9ICR7ISFidW5kbGVbXG4gICAgICAgICAgICAgICAgbW9kdWxlSWRcbiAgICAgICAgICAgICAgXX1gXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgbG9nZ2VyLmluZm8oXG4gICAgICAgICAgICAgIGBbYnVpbGRMb2FkZXJdIFRyeWluZyBidW5kbGVbbm9ybWFsaXplZFZhbHVlXTogYnVuZGxlW1wiJHtub3JtYWxpemVkVmFsdWV9XCJdID0gJHshIWJ1bmRsZVtcbiAgICAgICAgICAgICAgICBub3JtYWxpemVkVmFsdWVcbiAgICAgICAgICAgICAgXX1gXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgbG9nZ2VyLmluZm8oXG4gICAgICAgICAgICAgIGBbYnVpbGRMb2FkZXJdIFRyeWluZyBidW5kbGVbcmVzb2x2ZWRWYWx1ZV06IGJ1bmRsZVtcIiR7cmVzb2x2ZWRWYWx1ZX1cIl0gPSAkeyEhYnVuZGxlW1xuICAgICAgICAgICAgICAgIHJlc29sdmVkVmFsdWVcbiAgICAgICAgICAgICAgXX1gXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH1cbiAgICAgICAgICBjb25zdCBzZXJ2ZXJDaHVuayA9XG4gICAgICAgICAgICBidW5kbGVbbW9kdWxlSWRdID8/XG4gICAgICAgICAgICBidW5kbGVbbm9ybWFsaXplZFZhbHVlXSA/P1xuICAgICAgICAgICAgYnVuZGxlW3Jlc29sdmVkVmFsdWVdID8/XG4gICAgICAgICAgICBidW5kbGVbc2VydmVyTWFuaWZlc3RbbWFuaWZlc3RLZXldPy5maWxlXSA/P1xuICAgICAgICAgICAgYnVuZGxlW3N0YXRpY01hbmlmZXN0W21hbmlmZXN0S2V5XT8uZmlsZV0gPz9cbiAgICAgICAgICAgIGJ1bmRsZVtzZXJ2ZXJNYW5pZmVzdFtub3JtYWxpemVkS2V5XT8uZmlsZV0gPz9cbiAgICAgICAgICAgIGJ1bmRsZVtzdGF0aWNNYW5pZmVzdFtub3JtYWxpemVkS2V5XT8uZmlsZV0gPz9cbiAgICAgICAgICAgIE9iamVjdC5lbnRyaWVzKGJ1bmRsZSkuZmluZChcbiAgICAgICAgICAgICAgKFssIHZhbHVlXSkgPT4gdmFsdWUubmFtZSA9PT0gbm9ybWFsaXplZFZhbHVlXG4gICAgICAgICAgICApPy5bMV07XG5cbiAgICAgICAgICBpZiAodXNlck9wdGlvbnMudmVyYm9zZSAmJiBzZXJ2ZXJDaHVuaykge1xuICAgICAgICAgICAgbG9nZ2VyLmluZm8oYFtidWlsZExvYWRlcl0gRm91bmQgc2VydmVyQ2h1bms6ICR7c2VydmVyQ2h1bmsudHlwZX1gKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAoc2VydmVyQ2h1bmspIHtcbiAgICAgICAgICAgIGlmIChzZXJ2ZXJDaHVuay50eXBlID09PSBcImFzc2V0XCIpIHtcbiAgICAgICAgICAgICAgLy8gRm9yIENTUyBmaWxlcywgZW5zdXJlIHdlJ3JlIGluIHRoZSBSZWFjdCBTZXJ2ZXIgZW52aXJvbm1lbnRcbiAgICAgICAgICAgICAgaWYgKHVzZXJPcHRpb25zLmF1dG9EaXNjb3Zlci5qc29uUGF0dGVybi50ZXN0KG5vcm1hbGl6ZWRWYWx1ZSkpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBqc29uQ29udGVudCA9IHNlcnZlckNodW5rLnNvdXJjZTtcbiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIGpzb25Db250ZW50ID09PSBcInN0cmluZ1wiKSB7XG4gICAgICAgICAgICAgICAgICBpZiAodXNlck9wdGlvbnMudmVyYm9zZSkge1xuICAgICAgICAgICAgICAgICAgICBsb2dnZXIuaW5mbyhcbiAgICAgICAgICAgICAgICAgICAgICBgW2J1aWxkTG9hZGVyXSBSZXR1cm5pbmcgSlNPTiBjb250ZW50IGZvcjogJHtub3JtYWxpemVkVmFsdWV9YFxuICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgcmV0dXJuIHsgZGVmYXVsdDogSlNPTi5wYXJzZShqc29uQ29udGVudCkgfTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH0gZWxzZSBpZiAoXG4gICAgICAgICAgICAgICAgdXNlck9wdGlvbnMuYXV0b0Rpc2NvdmVyLmNzc1BhdHRlcm4udGVzdChub3JtYWxpemVkVmFsdWUpXG4gICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGNzc0NvbnRlbnQgPSBzZXJ2ZXJDaHVuay5zb3VyY2U7XG4gICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBjc3NDb250ZW50ID09PSBcInN0cmluZ1wiKSB7XG4gICAgICAgICAgICAgICAgICBpZiAodXNlck9wdGlvbnMudmVyYm9zZSkge1xuICAgICAgICAgICAgICAgICAgICBsb2dnZXIuaW5mbyhcbiAgICAgICAgICAgICAgICAgICAgICBgW2J1aWxkTG9hZGVyXSBSZXR1cm5pbmcgQ1NTIGNvbnRlbnQgZm9yOiAke25vcm1hbGl6ZWRWYWx1ZX0sIGxlbmd0aDogJHtjc3NDb250ZW50Lmxlbmd0aH1gXG4gICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICByZXR1cm4geyBkZWZhdWx0OiBjc3NDb250ZW50IH07XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgIGlmICh1c2VyT3B0aW9ucy52ZXJib3NlKSB7XG4gICAgICAgICAgICAgICAgICAgIGxvZ2dlci5pbmZvKFxuICAgICAgICAgICAgICAgICAgICAgIGBbYnVpbGRMb2FkZXJdIENTUyBzb3VyY2UgaXMgbm90IHN0cmluZzogJHt0eXBlb2YgY3NzQ29udGVudH1gXG4gICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGlmICh1c2VyT3B0aW9ucy52ZXJib3NlKSB7XG4gICAgICAgICAgICAgICAgbG9nZ2VyLmluZm8oXG4gICAgICAgICAgICAgICAgICBgW2J1aWxkTG9hZGVyXSBSZXR1cm5pbmcgZGVmYXVsdCBhc3NldCBzb3VyY2UgZm9yOiAke25vcm1hbGl6ZWRWYWx1ZX1gXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICByZXR1cm4geyBkZWZhdWx0OiBzZXJ2ZXJDaHVuay5zb3VyY2UgfTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoXCJjb2RlXCIgaW4gc2VydmVyQ2h1bmspIHtcbiAgICAgICAgICAgICAgaWYgKHVzZXJPcHRpb25zLnZlcmJvc2UpIHtcbiAgICAgICAgICAgICAgICBsb2dnZXIuaW5mbyhcbiAgICAgICAgICAgICAgICAgIGBbYnVpbGRMb2FkZXJdIFJldHVybmluZyBjb2RlIGZvcjogJHtub3JtYWxpemVkVmFsdWV9YFxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgcmV0dXJuIHsgZGVmYXVsdDogc2VydmVyQ2h1bmsuY29kZSB9O1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBjb25zdCBwYW5pY0Vycm9yID0gaGFuZGxlRXJyb3Ioe1xuICAgICAgICAgICAgZXJyb3I6IG5ldyBFcnJvcihcbiAgICAgICAgICAgICAgYENvdWxkIG5vdCBmaW5kIGlubGluZSBtb2R1bGUgZm9yOiAke25vcm1hbGl6ZWRWYWx1ZX1gXG4gICAgICAgICAgICApLFxuICAgICAgICAgICAgbG9nZ2VyLFxuICAgICAgICAgICAgbG9nOiB0cnVlLFxuICAgICAgICAgICAgcGFuaWNUaHJlc2hvbGQ6IHVzZXJPcHRpb25zLnBhbmljVGhyZXNob2xkLFxuICAgICAgICAgICAgY29udGV4dDogXCJCdWlsZCBMb2FkZXIgRXJyb3IgKGlubGluZSlcIixcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBpZiAocGFuaWNFcnJvciAhPSBudWxsKSB7XG4gICAgICAgICAgICB0aHJvdyBwYW5pY0Vycm9yO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIGNoZWNrIHRoZSBidW5kbGUgbWFuaWZlc3QgZm9yIGEgZGlyZWN0IG1hdGNoXG4gICAgICAgIGNvbnN0IGJ1bmRsZUVudHJ5ID0gYnVuZGxlW3dpdGhvdXRRdWVyeV07XG4gICAgICAgIGlmIChidW5kbGVFbnRyeSkge1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICBjb25zdCBmaWxlUGF0aCA9IGpvaW4oXG4gICAgICAgICAgICAgIHVzZXJPcHRpb25zLnByb2plY3RSb290LFxuICAgICAgICAgICAgICB1c2VyT3B0aW9ucy5idWlsZC5vdXREaXIsXG4gICAgICAgICAgICAgIHVzZXJPcHRpb25zLmJ1aWxkLnNlcnZlcixcbiAgICAgICAgICAgICAgd2l0aG91dFF1ZXJ5XG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgY29uc3QgZmlsZVVybCA9IHBhdGhUb0ZpbGVVUkwoZmlsZVBhdGgpLmhyZWY7XG4gICAgICAgICAgICBjb25zdCBtb2R1bGUgPSBhd2FpdCBpbXBvcnQoZmlsZVVybCk7XG4gICAgICAgICAgICB0ZW1wb3JhcnlSZWZlcmVuY2VzPy5zZXQobW9kdWxlUmVmLCBtb2R1bGUpO1xuICAgICAgICAgICAgcmV0dXJuIG1vZHVsZTtcbiAgICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgY29uc3QgcGFuaWNFcnJvciA9IGhhbmRsZUVycm9yKHtcbiAgICAgICAgICAgICAgZXJyb3I6IGVycm9yLFxuICAgICAgICAgICAgICBsb2dnZXIsXG4gICAgICAgICAgICAgIHBhbmljVGhyZXNob2xkOiB1c2VyT3B0aW9ucy5wYW5pY1RocmVzaG9sZCxcbiAgICAgICAgICAgICAgY29udGV4dDogXCJCdWlsZCBMb2FkZXIgRXJyb3IgKGJ1bmRsZSlcIixcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgdGVtcG9yYXJ5UmVmZXJlbmNlcz8uZGVsZXRlKG1vZHVsZVJlZik7XG4gICAgICAgICAgICBpZiAocGFuaWNFcnJvciAhPSBudWxsKSB7XG4gICAgICAgICAgICAgIHRocm93IHBhbmljRXJyb3I7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gRm9yIHN0YXRpYyBhc3NldHMsIHVzZSBzdGF0aWMgbWFuaWZlc3RcbiAgICAgICAgY29uc3Qgc3RhdGljRW50cnkgPSBzdGF0aWNNYW5pZmVzdFtub3JtYWxpemVkVmFsdWVdO1xuICAgICAgICBpZiAoc3RhdGljRW50cnkpIHtcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgY29uc3QgZmlsZVBhdGggPSBqb2luKFxuICAgICAgICAgICAgICB1c2VyT3B0aW9ucy5wcm9qZWN0Um9vdCxcbiAgICAgICAgICAgICAgdXNlck9wdGlvbnMuYnVpbGQub3V0RGlyLFxuICAgICAgICAgICAgICB1c2VyT3B0aW9ucy5idWlsZC5zdGF0aWMsXG4gICAgICAgICAgICAgIHN0YXRpY0VudHJ5LmZpbGVcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICBjb25zdCBmaWxlVXJsID0gcGF0aFRvRmlsZVVSTChmaWxlUGF0aCkuaHJlZjtcbiAgICAgICAgICAgIGNvbnN0IG1vZHVsZSA9IGF3YWl0IGltcG9ydChmaWxlVXJsKTtcbiAgICAgICAgICAgIHRlbXBvcmFyeVJlZmVyZW5jZXM/LnNldChtb2R1bGVSZWYsIG1vZHVsZSk7XG4gICAgICAgICAgICAvLyBJZiB3ZSBoYXZlIGFuIGV4cG9ydCBuYW1lLCBtYWtlIHN1cmUgaXQncyBhIGtleVxuICAgICAgICAgICAgaWYgKGV4cG9ydE5hbWUgJiYgIShleHBvcnROYW1lIGluIG1vZHVsZSkpIHtcbiAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICAgICAgIGBFeHBvcnQgJHtleHBvcnROYW1lfSBub3QgZm91bmQgaW4gbW9kdWxlICR7bm9ybWFsaXplZFZhbHVlfWBcbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBtb2R1bGU7XG4gICAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgIGNvbnN0IHBhbmljRXJyb3IgPSBoYW5kbGVFcnJvcih7XG4gICAgICAgICAgICAgIGVycm9yOiBlcnJvcixcbiAgICAgICAgICAgICAgbG9nZ2VyLFxuICAgICAgICAgICAgICBwYW5pY1RocmVzaG9sZDogdXNlck9wdGlvbnMucGFuaWNUaHJlc2hvbGQsXG4gICAgICAgICAgICAgIGNvbnRleHQ6IFwiQnVpbGQgTG9hZGVyIEVycm9yIChzdGF0aWMpXCIsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHRlbXBvcmFyeVJlZmVyZW5jZXM/LmRlbGV0ZShtb2R1bGVSZWYpO1xuICAgICAgICAgICAgaWYgKHBhbmljRXJyb3IgIT0gbnVsbCkge1xuICAgICAgICAgICAgICB0aHJvdyBwYW5pY0Vycm9yO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFVzZSBzaGFyZWQgbG9hZGVyIHV0aWxpdHkgZm9yIGNvbW1vbiBjYXNlcyAodmlydHVhbCBtb2R1bGVzLCBtYW5pZmVzdCByZXNvbHV0aW9uLCBpbXBvcnRzKVxuICAgICAgICAvLyBUaGlzIGhhbmRsZXMgdGhlIHNhbWUgbG9naWMgYXMgUlNDIHdvcmtlciBsb2FkZXJcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBjb25zdCBtb2R1bGUgPSBhd2FpdCBjcmVhdGVTaGFyZWRMb2FkZXIoe1xuICAgICAgICAgICAgbW9kdWxlSWQsXG4gICAgICAgICAgICBleHBvcnROYW1lLFxuICAgICAgICAgICAgdmVyYm9zZTogdXNlck9wdGlvbnMudmVyYm9zZSxcbiAgICAgICAgICAgIGxvZ2dlcixcbiAgICAgICAgICAgIHJlc29sdmVWaXJ0dWFsOiB0cnVlLFxuICAgICAgICAgICAgbWFuaWZlc3Q6IHNlcnZlck1hbmlmZXN0LFxuICAgICAgICAgICAgbm9ybWFsaXplcjogdXNlck9wdGlvbnMubm9ybWFsaXplcixcbiAgICAgICAgICAgIG1vZHVsZUJhc2U6IHVzZXJPcHRpb25zLm1vZHVsZUJhc2UsXG4gICAgICAgICAgICBwcmVzZXJ2ZU1vZHVsZXNSb290OiB1c2VyT3B0aW9ucy5idWlsZC5wcmVzZXJ2ZU1vZHVsZXNSb290LFxuICAgICAgICAgICAgcHJvamVjdFJvb3Q6IHVzZXJPcHRpb25zLnByb2plY3RSb290LFxuICAgICAgICAgICAgYnVpbGRPdXREaXI6IHVzZXJPcHRpb25zLmJ1aWxkLm91dERpcixcbiAgICAgICAgICAgIGJ1aWxkU2VydmVyRGlyOiB1c2VyT3B0aW9ucy5idWlsZC5zZXJ2ZXIsXG4gICAgICAgICAgICBpc0J1aWxkTW9kZTogdHJ1ZSxcbiAgICAgICAgICAgIGlzU2VydmVNb2RlOiBmYWxzZSxcbiAgICAgICAgICAgIGVmZmVjdGl2ZVByb2plY3RSb290OiB1c2VyT3B0aW9ucy5wcm9qZWN0Um9vdCxcbiAgICAgICAgICAgIGJ1aWxkOiB7XG4gICAgICAgICAgICAgIG91dERpcjogdXNlck9wdGlvbnMuYnVpbGQub3V0RGlyLFxuICAgICAgICAgICAgICBzZXJ2ZXI6IHVzZXJPcHRpb25zLmJ1aWxkLnNlcnZlcixcbiAgICAgICAgICAgICAgY2xpZW50OiB1c2VyT3B0aW9ucy5idWlsZC5jbGllbnQsXG4gICAgICAgICAgICAgIHN0YXRpYzogdXNlck9wdGlvbnMuYnVpbGQuc3RhdGljLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBcbiAgICAgICAgICAvLyBTdG9yZSBpbiB0ZW1wb3JhcnkgcmVmZXJlbmNlcyBmb3IgY2FjaGluZ1xuICAgICAgICAgIHRlbXBvcmFyeVJlZmVyZW5jZXM/LnNldChtb2R1bGVSZWYsIG1vZHVsZSk7XG4gICAgICAgICAgcmV0dXJuIG1vZHVsZTtcbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICBjb25zdCBlcnIgPSB0b0Vycm9yKGVycm9yKTtcbiAgICAgICAgICBjb25zdCBwYW5pY0Vycm9yID0gaGFuZGxlRXJyb3Ioe1xuICAgICAgICAgICAgZXJyb3I6IGVycixcbiAgICAgICAgICAgIGxvZ2dlcixcbiAgICAgICAgICAgIHBhbmljVGhyZXNob2xkOiB1c2VyT3B0aW9ucy5wYW5pY1RocmVzaG9sZCxcbiAgICAgICAgICAgIGNvbnRleHQ6IFwiQnVpbGQgTG9hZGVyIEVycm9yIChzaGFyZWQpXCIsXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgdGVtcG9yYXJ5UmVmZXJlbmNlcz8uZGVsZXRlKG1vZHVsZVJlZik7XG4gICAgICAgICAgaWYgKHBhbmljRXJyb3IgIT0gbnVsbCkge1xuICAgICAgICAgICAgdGhyb3cgcGFuaWNFcnJvcjtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIC8vIEVuaGFuY2UgUmVhY3QgU2VydmVyIERPTSBlcnJvcnMgd2l0aCBpbXBvcnQgY29udGV4dFxuICAgICAgICBsZXQgZW5oYW5jZWRFcnJvciA9IGVycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvciA6IG5ldyBFcnJvcihTdHJpbmcoZXJyb3IpKTtcbiAgICAgICAgaWYgKGVuaGFuY2VkRXJyb3IubWVzc2FnZS5pbmNsdWRlcygnUmVhY3QgU2VydmVyIFdyaXRlciBjYW5ub3QgYmUgdXNlZCBvdXRzaWRlIGEgcmVhY3Qtc2VydmVyIGVudmlyb25tZW50JykpIHtcbiAgICAgICAgICBjb25zdCBmaWxlUGF0aCA9IHJlc29sdmUoXG4gICAgICAgICAgICB1c2VyT3B0aW9ucy5wcm9qZWN0Um9vdCxcbiAgICAgICAgICAgIHVzZXJPcHRpb25zLmJ1aWxkLm91dERpcixcbiAgICAgICAgICAgIHVzZXJPcHRpb25zLmJ1aWxkLnNlcnZlcixcbiAgICAgICAgICAgIG1vZHVsZUlkXG4gICAgICAgICAgKTtcbiAgICAgICAgICBlbmhhbmNlZEVycm9yID0gbmV3IEVycm9yKFxuICAgICAgICAgICAgYCR7ZW5oYW5jZWRFcnJvci5tZXNzYWdlfVxcbmAgK1xuICAgICAgICAgICAgYCAg4oaSIEltcG9ydGVkIGZyb206ICR7bW9kdWxlSWR9XFxuYCArXG4gICAgICAgICAgICBgICDihpIgRXhwb3J0OiAke2V4cG9ydE5hbWV9XFxuYCArXG4gICAgICAgICAgICBgICDihpIgRmlsZSBwYXRoOiAke2ZpbGVQYXRofVxcbmAgK1xuICAgICAgICAgICAgYCAg4oaSIE5PREVfT1BUSU9OUzogJHtwcm9jZXNzLmVudi5OT0RFX09QVElPTlMgfHwgJ25vdCBzZXQnfVxcbmAgK1xuICAgICAgICAgICAgYCAg4oaSIGV4ZWNBcmd2OiAke3Byb2Nlc3MuZXhlY0FyZ3Yuam9pbignICcpIHx8ICdub3Qgc2V0J31gXG4gICAgICAgICAgKTtcbiAgICAgICAgICB0aHJvdyBlbmhhbmNlZEVycm9yO1xuICAgICAgICB9XG4gICAgICAgIFxuICAgICAgICBjb25zdCBlbXB0eUV4cG9ydHMgPSB7XG4gICAgICAgICAgZXJyb3I6IGVuaGFuY2VkRXJyb3IsXG4gICAgICAgICAgaWQ6IGlkLFxuICAgICAgICB9O1xuICAgICAgICB0ZW1wb3JhcnlSZWZlcmVuY2VzPy5kZWxldGUobW9kdWxlUmVmKTtcbiAgICAgICAgcmV0dXJuIGVtcHR5RXhwb3J0cztcbiAgICAgIH1cbiAgICB9O1xuICB9O1xuIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7O0FBaUJPLE1BQU0saUJBQ1gsR0FBQSxTQUFTLGtCQUNQLENBQUEsRUFBRSxXQUFhLEVBQUEsY0FBQSxFQUFnQixjQUFlLEVBQUEsRUFDOUMsTUFDQSxFQUFBLG1CQUFBLEVBQ0EsTUFBUyxHQUFBLFlBQUEsRUFDVCxFQUFBO0FBQ0EsRUFBTSxNQUFBLFlBQUEsR0FBZSxNQUFPLENBQUEsSUFBQSxDQUFLLGNBQWMsQ0FBQTtBQUMvQyxFQUFJLElBQUEsQ0FBQyxhQUFhLE1BQVEsRUFBQTtBQUN4QixJQUFNLE1BQUEsSUFBSSxNQUFNLDBCQUEwQixDQUFBO0FBQUE7QUFHNUMsRUFBTyxPQUFBLGVBQWUsWUFBWSxFQUFJLEVBQUE7QUFDcEMsSUFBQSxJQUFJLFlBQVksT0FBUyxFQUFBO0FBQ3ZCLE1BQU8sTUFBQSxDQUFBLElBQUEsQ0FBSyxDQUFxQixrQkFBQSxFQUFBLEVBQUUsQ0FBRSxDQUFBLENBQUE7QUFDckMsTUFBTyxNQUFBLENBQUEsSUFBQSxDQUFLLENBQXNDLG1DQUFBLEVBQUEsRUFBRSxDQUFFLENBQUEsQ0FBQTtBQUFBO0FBRXhELElBQUEsTUFBTSxDQUFDLFlBQWMsRUFBQSxLQUFLLElBQUksRUFBRyxDQUFBLEtBQUEsQ0FBTSxLQUFLLENBQUMsQ0FBQTtBQUM3QyxJQUFBLE1BQU0sQ0FBQyxRQUFVLEVBQUEsVUFBVSxJQUFJLFlBQWEsQ0FBQSxLQUFBLENBQU0sS0FBSyxDQUFDLENBQUE7QUFHeEQsSUFBQSxNQUFNLENBQUMsYUFBZSxFQUFBLGVBQWUsQ0FBSSxHQUFBLFdBQUEsQ0FBWSxXQUFXLFFBQVEsQ0FBQTtBQUt4RSxJQUFBLE1BQU0sc0JBQXNCLE1BQU0sNEJBQUE7QUFBQSxNQUNoQyxRQUFBO0FBQUEsTUFDQSxVQUFBO0FBQUEsTUFDQSxXQUFZLENBQUEsT0FBQTtBQUFBLE1BQ1o7QUFBQSxLQUNGO0FBQ0EsSUFBQSxJQUFJLHdCQUF3QixJQUFNLEVBQUE7QUFDaEMsTUFBTyxPQUFBLG1CQUFBO0FBQUE7QUFHVCxJQUFNLE1BQUEsU0FBQSxHQUFZLGFBQWEsRUFBRSxDQUFBO0FBR2pDLElBQUksSUFBQSxtQkFBQSxFQUFxQixHQUFJLENBQUEsU0FBUyxDQUFHLEVBQUE7QUFDdkMsTUFBTSxNQUFBLEdBQUEsR0FBTSxtQkFBb0IsQ0FBQSxHQUFBLENBQUksU0FBUyxDQUFBO0FBQzdDLE1BQUEsSUFBSSxPQUFPLEdBQVEsS0FBQSxRQUFBLElBQVksR0FBUSxLQUFBLElBQUEsSUFBUSxXQUFXLEdBQUssRUFBQSxDQUV4RCxNQUFBO0FBQ0wsUUFBTyxPQUFBLEdBQUE7QUFBQTtBQUNUO0FBR0YsSUFBSSxJQUFBO0FBRUYsTUFBQSxJQUFJLFVBQVUsUUFBVSxFQUFBO0FBQ3RCLFFBQUEsTUFBTSxXQUFjLEdBQUEsZUFBQTtBQUNwQixRQUFBLElBQUksWUFBWSxPQUFTLEVBQUE7QUFDdkIsVUFBTyxNQUFBLENBQUEsSUFBQTtBQUFBLFlBQ0wsNENBQTRDLGVBQWUsQ0FBQTtBQUFBLFdBQzdEO0FBQUE7QUFJRixRQUFBLElBQUksYUFBZ0IsR0FBQSxlQUFBO0FBQ3BCLFFBQUEsSUFDRSxnQkFBZ0IsVUFBVyxDQUFBLFNBQVMsS0FDcEMsZUFBZ0IsQ0FBQSxRQUFBLENBQVMsTUFBTSxDQUMvQixFQUFBO0FBRUEsVUFBQSxNQUFNLFdBQVcsZUFBZ0IsQ0FBQSxPQUFBO0FBQUEsWUFDL0IscUJBQUE7QUFBQSxZQUNBO0FBQUEsV0FDRjtBQUNBLFVBQUEsSUFBSSxZQUFZLE9BQVMsRUFBQTtBQUN2QixZQUFPLE1BQUEsQ0FBQSxJQUFBO0FBQUEsY0FDTCxDQUFBLG1EQUFBLEVBQXNELGVBQWUsQ0FBQSxJQUFBLEVBQU8sUUFBUSxDQUFBO0FBQUEsYUFDdEY7QUFBQTtBQUdGLFVBQUksSUFBQSxNQUFBLENBQU8sUUFBUSxDQUFHLEVBQUE7QUFDcEIsWUFBZ0IsYUFBQSxHQUFBLFFBQUE7QUFDaEIsWUFBQSxJQUFJLFlBQVksT0FBUyxFQUFBO0FBQ3ZCLGNBQU8sTUFBQSxDQUFBLElBQUE7QUFBQSxnQkFDTCx1Q0FBdUMsYUFBYSxDQUFBO0FBQUEsZUFDdEQ7QUFBQTtBQUNGO0FBQ0Y7QUFJRixRQUFBLElBQUksWUFBWSxPQUFTLEVBQUE7QUFDdkIsVUFBTyxNQUFBLENBQUEsSUFBQTtBQUFBLFlBQ0wsa0RBQWtELFFBQVEsQ0FBQSxLQUFBLEVBQVEsQ0FBQyxDQUFDLE1BQUEsQ0FDbEUsUUFDRixDQUFDLENBQUE7QUFBQSxXQUNIO0FBQ0EsVUFBTyxNQUFBLENBQUEsSUFBQTtBQUFBLFlBQ0wseURBQXlELGVBQWUsQ0FBQSxLQUFBLEVBQVEsQ0FBQyxDQUFDLE1BQUEsQ0FDaEYsZUFDRixDQUFDLENBQUE7QUFBQSxXQUNIO0FBQ0EsVUFBTyxNQUFBLENBQUEsSUFBQTtBQUFBLFlBQ0wsdURBQXVELGFBQWEsQ0FBQSxLQUFBLEVBQVEsQ0FBQyxDQUFDLE1BQUEsQ0FDNUUsYUFDRixDQUFDLENBQUE7QUFBQSxXQUNIO0FBQUE7QUFFRixRQUFBLE1BQU0sY0FDSixNQUFPLENBQUEsUUFBUSxDQUNmLElBQUEsTUFBQSxDQUFPLGVBQWUsQ0FDdEIsSUFBQSxNQUFBLENBQU8sYUFBYSxDQUFBLElBQ3BCLE9BQU8sY0FBZSxDQUFBLFdBQVcsQ0FBRyxFQUFBLElBQUksS0FDeEMsTUFBTyxDQUFBLGNBQUEsQ0FBZSxXQUFXLENBQUEsRUFBRyxJQUFJLENBQ3hDLElBQUEsTUFBQSxDQUFPLGNBQWUsQ0FBQSxhQUFhLEdBQUcsSUFBSSxDQUFBLElBQzFDLE1BQU8sQ0FBQSxjQUFBLENBQWUsYUFBYSxDQUFHLEVBQUEsSUFBSSxLQUMxQyxNQUFPLENBQUEsT0FBQSxDQUFRLE1BQU0sQ0FBRSxDQUFBLElBQUE7QUFBQSxVQUNyQixDQUFDLEdBQUcsS0FBSyxDQUFBLEtBQU0sTUFBTSxJQUFTLEtBQUE7QUFBQSxZQUM1QixDQUFDLENBQUE7QUFFUCxRQUFJLElBQUEsV0FBQSxDQUFZLFdBQVcsV0FBYSxFQUFBO0FBQ3RDLFVBQUEsTUFBQSxDQUFPLElBQUssQ0FBQSxDQUFBLGlDQUFBLEVBQW9DLFdBQVksQ0FBQSxJQUFJLENBQUUsQ0FBQSxDQUFBO0FBQUE7QUFHcEUsUUFBQSxJQUFJLFdBQWEsRUFBQTtBQUNmLFVBQUksSUFBQSxXQUFBLENBQVksU0FBUyxPQUFTLEVBQUE7QUFFaEMsWUFBQSxJQUFJLFdBQVksQ0FBQSxZQUFBLENBQWEsV0FBWSxDQUFBLElBQUEsQ0FBSyxlQUFlLENBQUcsRUFBQTtBQUM5RCxjQUFBLE1BQU0sY0FBYyxXQUFZLENBQUEsTUFBQTtBQUNoQyxjQUFJLElBQUEsT0FBTyxnQkFBZ0IsUUFBVSxFQUFBO0FBQ25DLGdCQUFBLElBQUksWUFBWSxPQUFTLEVBQUE7QUFDdkIsa0JBQU8sTUFBQSxDQUFBLElBQUE7QUFBQSxvQkFDTCw2Q0FBNkMsZUFBZSxDQUFBO0FBQUEsbUJBQzlEO0FBQUE7QUFFRixnQkFBQSxPQUFPLEVBQUUsT0FBQSxFQUFTLElBQUssQ0FBQSxLQUFBLENBQU0sV0FBVyxDQUFFLEVBQUE7QUFBQTtBQUM1Qyx1QkFFQSxXQUFZLENBQUEsWUFBQSxDQUFhLFVBQVcsQ0FBQSxJQUFBLENBQUssZUFBZSxDQUN4RCxFQUFBO0FBQ0EsY0FBQSxNQUFNLGFBQWEsV0FBWSxDQUFBLE1BQUE7QUFDL0IsY0FBSSxJQUFBLE9BQU8sZUFBZSxRQUFVLEVBQUE7QUFDbEMsZ0JBQUEsSUFBSSxZQUFZLE9BQVMsRUFBQTtBQUN2QixrQkFBTyxNQUFBLENBQUEsSUFBQTtBQUFBLG9CQUNMLENBQTRDLHlDQUFBLEVBQUEsZUFBZSxDQUFhLFVBQUEsRUFBQSxVQUFBLENBQVcsTUFBTSxDQUFBO0FBQUEsbUJBQzNGO0FBQUE7QUFFRixnQkFBTyxPQUFBLEVBQUUsU0FBUyxVQUFXLEVBQUE7QUFBQSxlQUN4QixNQUFBO0FBQ0wsZ0JBQUEsSUFBSSxZQUFZLE9BQVMsRUFBQTtBQUN2QixrQkFBTyxNQUFBLENBQUEsSUFBQTtBQUFBLG9CQUNMLENBQUEsd0NBQUEsRUFBMkMsT0FBTyxVQUFVLENBQUE7QUFBQSxtQkFDOUQ7QUFBQTtBQUNGO0FBQ0Y7QUFFRixZQUFBLElBQUksWUFBWSxPQUFTLEVBQUE7QUFDdkIsY0FBTyxNQUFBLENBQUEsSUFBQTtBQUFBLGdCQUNMLHFEQUFxRCxlQUFlLENBQUE7QUFBQSxlQUN0RTtBQUFBO0FBRUYsWUFBTyxPQUFBLEVBQUUsT0FBUyxFQUFBLFdBQUEsQ0FBWSxNQUFPLEVBQUE7QUFBQSxXQUN2QyxNQUFBLElBQVcsVUFBVSxXQUFhLEVBQUE7QUFDaEMsWUFBQSxJQUFJLFlBQVksT0FBUyxFQUFBO0FBQ3ZCLGNBQU8sTUFBQSxDQUFBLElBQUE7QUFBQSxnQkFDTCxxQ0FBcUMsZUFBZSxDQUFBO0FBQUEsZUFDdEQ7QUFBQTtBQUVGLFlBQU8sT0FBQSxFQUFFLE9BQVMsRUFBQSxXQUFBLENBQVksSUFBSyxFQUFBO0FBQUE7QUFDckM7QUFFRixRQUFBLE1BQU0sYUFBYSxXQUFZLENBQUE7QUFBQSxVQUM3QixPQUFPLElBQUksS0FBQTtBQUFBLFlBQ1QscUNBQXFDLGVBQWUsQ0FBQTtBQUFBLFdBQ3REO0FBQUEsVUFDQSxNQUFBO0FBQUEsVUFDQSxHQUFLLEVBQUEsSUFBQTtBQUFBLFVBQ0wsZ0JBQWdCLFdBQVksQ0FBQSxjQUFBO0FBQUEsVUFDNUIsT0FBUyxFQUFBO0FBQUEsU0FDVixDQUFBO0FBQ0QsUUFBQSxJQUFJLGNBQWMsSUFBTSxFQUFBO0FBQ3RCLFVBQU0sTUFBQSxVQUFBO0FBQUE7QUFFUixRQUFPLE9BQUEsSUFBQTtBQUFBO0FBSVQsTUFBTSxNQUFBLFdBQUEsR0FBYyxPQUFPLFlBQVksQ0FBQTtBQUN2QyxNQUFBLElBQUksV0FBYSxFQUFBO0FBQ2YsUUFBSSxJQUFBO0FBQ0YsVUFBQSxNQUFNLFFBQVcsR0FBQSxJQUFBO0FBQUEsWUFDZixXQUFZLENBQUEsV0FBQTtBQUFBLFlBQ1osWUFBWSxLQUFNLENBQUEsTUFBQTtBQUFBLFlBQ2xCLFlBQVksS0FBTSxDQUFBLE1BQUE7QUFBQSxZQUNsQjtBQUFBLFdBQ0Y7QUFDQSxVQUFNLE1BQUEsT0FBQSxHQUFVLGFBQWMsQ0FBQSxRQUFRLENBQUUsQ0FBQSxJQUFBO0FBQ3hDLFVBQU0sTUFBQSxNQUFBLEdBQVMsTUFBTSxPQUFPLE9BQUEsQ0FBQTtBQUM1QixVQUFxQixtQkFBQSxFQUFBLEdBQUEsQ0FBSSxXQUFXLE1BQU0sQ0FBQTtBQUMxQyxVQUFPLE9BQUEsTUFBQTtBQUFBLGlCQUNBLEtBQU8sRUFBQTtBQUNkLFVBQUEsTUFBTSxhQUFhLFdBQVksQ0FBQTtBQUFBLFlBQzdCLEtBQUE7QUFBQSxZQUNBLE1BQUE7QUFBQSxZQUNBLGdCQUFnQixXQUFZLENBQUEsY0FBQTtBQUFBLFlBQzVCLE9BQVMsRUFBQTtBQUFBLFdBQ1YsQ0FBQTtBQUNELFVBQUEsbUJBQUEsRUFBcUIsT0FBTyxTQUFTLENBQUE7QUFDckMsVUFBQSxJQUFJLGNBQWMsSUFBTSxFQUFBO0FBQ3RCLFlBQU0sTUFBQSxVQUFBO0FBQUE7QUFDUjtBQUNGO0FBSUYsTUFBTSxNQUFBLFdBQUEsR0FBYyxlQUFlLGVBQWUsQ0FBQTtBQUNsRCxNQUFBLElBQUksV0FBYSxFQUFBO0FBQ2YsUUFBSSxJQUFBO0FBQ0YsVUFBQSxNQUFNLFFBQVcsR0FBQSxJQUFBO0FBQUEsWUFDZixXQUFZLENBQUEsV0FBQTtBQUFBLFlBQ1osWUFBWSxLQUFNLENBQUEsTUFBQTtBQUFBLFlBQ2xCLFlBQVksS0FBTSxDQUFBLE1BQUE7QUFBQSxZQUNsQixXQUFZLENBQUE7QUFBQSxXQUNkO0FBQ0EsVUFBTSxNQUFBLE9BQUEsR0FBVSxhQUFjLENBQUEsUUFBUSxDQUFFLENBQUEsSUFBQTtBQUN4QyxVQUFNLE1BQUEsTUFBQSxHQUFTLE1BQU0sT0FBTyxPQUFBLENBQUE7QUFDNUIsVUFBcUIsbUJBQUEsRUFBQSxHQUFBLENBQUksV0FBVyxNQUFNLENBQUE7QUFFMUMsVUFBSSxJQUFBLFVBQUEsSUFBYyxFQUFFLFVBQUEsSUFBYyxNQUFTLENBQUEsRUFBQTtBQUN6QyxZQUFBLE1BQU0sSUFBSSxLQUFBO0FBQUEsY0FDUixDQUFBLE9BQUEsRUFBVSxVQUFVLENBQUEscUJBQUEsRUFBd0IsZUFBZSxDQUFBO0FBQUEsYUFDN0Q7QUFBQTtBQUVGLFVBQU8sT0FBQSxNQUFBO0FBQUEsaUJBQ0EsS0FBTyxFQUFBO0FBQ2QsVUFBQSxNQUFNLGFBQWEsV0FBWSxDQUFBO0FBQUEsWUFDN0IsS0FBQTtBQUFBLFlBQ0EsTUFBQTtBQUFBLFlBQ0EsZ0JBQWdCLFdBQVksQ0FBQSxjQUFBO0FBQUEsWUFDNUIsT0FBUyxFQUFBO0FBQUEsV0FDVixDQUFBO0FBQ0QsVUFBQSxtQkFBQSxFQUFxQixPQUFPLFNBQVMsQ0FBQTtBQUNyQyxVQUFBLElBQUksY0FBYyxJQUFNLEVBQUE7QUFDdEIsWUFBTSxNQUFBLFVBQUE7QUFBQTtBQUNSO0FBQ0Y7QUFLRixNQUFJLElBQUE7QUFDRixRQUFNLE1BQUEsTUFBQSxHQUFTLE1BQU0sa0JBQW1CLENBQUE7QUFBQSxVQUN0QyxRQUFBO0FBQUEsVUFDQSxVQUFBO0FBQUEsVUFDQSxTQUFTLFdBQVksQ0FBQSxPQUFBO0FBQUEsVUFDckIsTUFBQTtBQUFBLFVBQ0EsY0FBZ0IsRUFBQSxJQUFBO0FBQUEsVUFDaEIsUUFBVSxFQUFBLGNBQUE7QUFBQSxVQUNWLFlBQVksV0FBWSxDQUFBLFVBQUE7QUFBQSxVQUN4QixZQUFZLFdBQVksQ0FBQSxVQUFBO0FBQUEsVUFDeEIsbUJBQUEsRUFBcUIsWUFBWSxLQUFNLENBQUEsbUJBQUE7QUFBQSxVQUN2QyxhQUFhLFdBQVksQ0FBQSxXQUFBO0FBQUEsVUFDekIsV0FBQSxFQUFhLFlBQVksS0FBTSxDQUFBLE1BQUE7QUFBQSxVQUMvQixjQUFBLEVBQWdCLFlBQVksS0FBTSxDQUFBLE1BQUE7QUFBQSxVQUNsQyxXQUFhLEVBQUEsSUFBQTtBQUFBLFVBQ2IsV0FBYSxFQUFBLEtBQUE7QUFBQSxVQUNiLHNCQUFzQixXQUFZLENBQUEsV0FBQTtBQUFBLFVBQ2xDLEtBQU8sRUFBQTtBQUFBLFlBQ0wsTUFBQSxFQUFRLFlBQVksS0FBTSxDQUFBLE1BQUE7QUFBQSxZQUMxQixNQUFBLEVBQVEsWUFBWSxLQUFNLENBQUEsTUFBQTtBQUFBLFlBQzFCLE1BQUEsRUFBUSxZQUFZLEtBQU0sQ0FBQSxNQUFBO0FBQUEsWUFDMUIsTUFBQSxFQUFRLFlBQVksS0FBTSxDQUFBO0FBQUE7QUFDNUIsU0FDRCxDQUFBO0FBR0QsUUFBcUIsbUJBQUEsRUFBQSxHQUFBLENBQUksV0FBVyxNQUFNLENBQUE7QUFDMUMsUUFBTyxPQUFBLE1BQUE7QUFBQSxlQUNBLEtBQU8sRUFBQTtBQUNkLFFBQU0sTUFBQSxHQUFBLEdBQU0sUUFBUSxLQUFLLENBQUE7QUFDekIsUUFBQSxNQUFNLGFBQWEsV0FBWSxDQUFBO0FBQUEsVUFDN0IsS0FBTyxFQUFBLEdBQUE7QUFBQSxVQUNQLE1BQUE7QUFBQSxVQUNBLGdCQUFnQixXQUFZLENBQUEsY0FBQTtBQUFBLFVBQzVCLE9BQVMsRUFBQTtBQUFBLFNBQ1YsQ0FBQTtBQUNELFFBQUEsbUJBQUEsRUFBcUIsT0FBTyxTQUFTLENBQUE7QUFDckMsUUFBQSxJQUFJLGNBQWMsSUFBTSxFQUFBO0FBQ3RCLFVBQU0sTUFBQSxVQUFBO0FBQUE7QUFDUjtBQUNGLGFBQ08sS0FBTyxFQUFBO0FBRWQsTUFBSSxJQUFBLGFBQUEsR0FBZ0IsaUJBQWlCLEtBQVEsR0FBQSxLQUFBLEdBQVEsSUFBSSxLQUFNLENBQUEsTUFBQSxDQUFPLEtBQUssQ0FBQyxDQUFBO0FBQzVFLE1BQUEsSUFBSSxhQUFjLENBQUEsT0FBQSxDQUFRLFFBQVMsQ0FBQSx1RUFBdUUsQ0FBRyxFQUFBO0FBQzNHLFFBQUEsTUFBTSxRQUFXLEdBQUEsT0FBQTtBQUFBLFVBQ2YsV0FBWSxDQUFBLFdBQUE7QUFBQSxVQUNaLFlBQVksS0FBTSxDQUFBLE1BQUE7QUFBQSxVQUNsQixZQUFZLEtBQU0sQ0FBQSxNQUFBO0FBQUEsVUFDbEI7QUFBQSxTQUNGO0FBQ0EsUUFBQSxhQUFBLEdBQWdCLElBQUksS0FBQTtBQUFBLFVBQ2xCLENBQUEsRUFBRyxjQUFjLE9BQU87QUFBQSxtQkFBQSxFQUNGLFFBQVE7QUFBQSxZQUFBLEVBQ2YsVUFBVTtBQUFBLGVBQUEsRUFDUCxRQUFRO0FBQUEsa0JBQ0wsRUFBQSxPQUFBLENBQVEsR0FBSSxDQUFBLFlBQUEsSUFBZ0IsU0FBUztBQUFBLGNBQUEsRUFDekMsT0FBUSxDQUFBLFFBQUEsQ0FBUyxJQUFLLENBQUEsR0FBRyxLQUFLLFNBQVMsQ0FBQTtBQUFBLFNBQzFEO0FBQ0EsUUFBTSxNQUFBLGFBQUE7QUFBQTtBQUdSLE1BQUEsTUFBTSxZQUFlLEdBQUE7QUFBQSxRQUNuQixLQUFPLEVBQUEsYUFBQTtBQUFBLFFBQ1A7QUFBQSxPQUNGO0FBQ0EsTUFBQSxtQkFBQSxFQUFxQixPQUFPLFNBQVMsQ0FBQTtBQUNyQyxNQUFPLE9BQUEsWUFBQTtBQUFBO0FBQ1QsR0FDRjtBQUNGOzs7OyJ9