@mnaoumov/obsidian-dev-toolkit 2.1.0 → 3.1.0

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 (131) hide show
  1. package/README.md +6 -2
  2. package/bin/archive-demo-vault.mjs +8 -0
  3. package/bin/generate-coverage-badge.mjs +8 -0
  4. package/bundlers/esbuild-impl/feature-options/package.json +6 -0
  5. package/bundlers/obsidian-cli-reload/package.json +6 -0
  6. package/bundlers/obsidian-plugin-build/package.json +6 -0
  7. package/bundlers/obsidian-plugin-features/package.json +6 -0
  8. package/bundlers/obsidian-plugin-transforms/package.json +6 -0
  9. package/bundlers/obsidian-plugin-webpack-loader/package.json +6 -0
  10. package/bundlers/obsidian-plugins-folder-deployment/package.json +6 -0
  11. package/bundlers/parcel/package.json +6 -0
  12. package/bundlers/rollup/package.json +6 -0
  13. package/bundlers/rollup-compatible/package.json +6 -0
  14. package/bundlers/rollup-compatible-features/package.json +6 -0
  15. package/bundlers/vite/package.json +6 -0
  16. package/bundlers/webpack/package.json +6 -0
  17. package/dist/demo-vault-helper/main.js +6 -442
  18. package/dist/integration-test-plugin/main.js +918 -4912
  19. package/dist/lib/cjs/bundlers/esbuild-impl/copy-to-obsidian-plugins-folder-plugin.cjs +3 -188
  20. package/dist/lib/cjs/bundlers/esbuild-impl/copy-to-obsidian-plugins-folder-plugin.d.cts +2 -18
  21. package/dist/lib/cjs/bundlers/esbuild-impl/feature-options.cjs +173 -0
  22. package/dist/lib/cjs/bundlers/esbuild-impl/feature-options.d.cts +60 -0
  23. package/dist/lib/cjs/bundlers/esbuild-impl/index.cjs +4 -1
  24. package/dist/lib/cjs/bundlers/esbuild-impl/index.d.cts +1 -0
  25. package/dist/lib/cjs/bundlers/esbuild-impl/obsidian-plugin-builder.cjs +30 -82
  26. package/dist/lib/cjs/bundlers/esbuild-impl/obsidian-plugin-builder.d.cts +7 -24
  27. package/dist/lib/cjs/bundlers/index.cjs +39 -3
  28. package/dist/lib/cjs/bundlers/index.d.cts +12 -0
  29. package/dist/lib/cjs/bundlers/obsidian-cli-reload.cjs +182 -0
  30. package/dist/lib/cjs/bundlers/obsidian-cli-reload.d.cts +37 -0
  31. package/dist/lib/cjs/bundlers/obsidian-plugin-build.cjs +278 -0
  32. package/dist/lib/cjs/bundlers/obsidian-plugin-build.d.cts +217 -0
  33. package/dist/lib/cjs/bundlers/obsidian-plugin-features.cjs +242 -0
  34. package/dist/lib/cjs/bundlers/obsidian-plugin-features.d.cts +186 -0
  35. package/dist/lib/cjs/bundlers/obsidian-plugin-transforms.cjs +306 -0
  36. package/dist/lib/cjs/bundlers/obsidian-plugin-transforms.d.cts +231 -0
  37. package/dist/lib/cjs/bundlers/obsidian-plugin-webpack-loader.cjs +182 -0
  38. package/dist/lib/cjs/bundlers/obsidian-plugin-webpack-loader.d.cts +47 -0
  39. package/dist/lib/cjs/bundlers/obsidian-plugins-folder-deployment.cjs +320 -0
  40. package/dist/lib/cjs/bundlers/obsidian-plugins-folder-deployment.d.cts +44 -0
  41. package/dist/lib/cjs/bundlers/parcel.cjs +462 -0
  42. package/dist/lib/cjs/bundlers/parcel.d.cts +128 -0
  43. package/dist/lib/cjs/bundlers/rollup-compatible-features.cjs +181 -0
  44. package/dist/lib/cjs/bundlers/rollup-compatible-features.d.cts +128 -0
  45. package/dist/lib/cjs/bundlers/rollup-compatible.cjs +138 -0
  46. package/dist/lib/cjs/bundlers/rollup-compatible.d.cts +84 -0
  47. package/dist/lib/cjs/bundlers/rollup.cjs +218 -0
  48. package/dist/lib/cjs/bundlers/rollup.d.cts +99 -0
  49. package/dist/lib/cjs/bundlers/vite.cjs +229 -0
  50. package/dist/lib/cjs/bundlers/vite.d.cts +105 -0
  51. package/dist/lib/cjs/bundlers/webpack.cjs +354 -0
  52. package/dist/lib/cjs/bundlers/webpack.d.cts +133 -0
  53. package/dist/lib/cjs/demo-vault-cli.cjs +131 -0
  54. package/dist/lib/cjs/demo-vault-cli.d.cts +15 -0
  55. package/dist/lib/cjs/index.cjs +4 -1
  56. package/dist/lib/cjs/index.d.cts +1 -0
  57. package/dist/lib/cjs/test-runners/coverage-badge-cli.cjs +160 -0
  58. package/dist/lib/cjs/test-runners/coverage-badge-cli.d.cts +25 -0
  59. package/dist/lib/cjs/test-runners/coverage-badge.cjs +279 -0
  60. package/dist/lib/cjs/test-runners/coverage-badge.d.cts +143 -0
  61. package/dist/lib/cjs/test-runners/e2e-runner-support.cjs +170 -0
  62. package/dist/lib/cjs/test-runners/e2e-runner-support.d.cts +36 -0
  63. package/dist/lib/cjs/test-runners/index.cjs +18 -3
  64. package/dist/lib/cjs/test-runners/index.d.cts +5 -0
  65. package/dist/lib/cjs/test-runners/obsidian-test-runner.cjs +147 -0
  66. package/dist/lib/cjs/test-runners/obsidian-test-runner.d.cts +42 -0
  67. package/dist/lib/cjs/test-runners/wdio-obsidian.cjs +205 -0
  68. package/dist/lib/cjs/test-runners/wdio-obsidian.d.cts +199 -0
  69. package/dist/lib/esm/bundlers/esbuild-impl/copy-to-obsidian-plugins-folder-plugin.d.mts +2 -18
  70. package/dist/lib/esm/bundlers/esbuild-impl/copy-to-obsidian-plugins-folder-plugin.mjs +3 -192
  71. package/dist/lib/esm/bundlers/esbuild-impl/feature-options.d.mts +60 -0
  72. package/dist/lib/esm/bundlers/esbuild-impl/feature-options.mjs +82 -0
  73. package/dist/lib/esm/bundlers/esbuild-impl/index.d.mts +1 -0
  74. package/dist/lib/esm/bundlers/esbuild-impl/index.mjs +3 -1
  75. package/dist/lib/esm/bundlers/esbuild-impl/obsidian-plugin-builder.d.mts +7 -24
  76. package/dist/lib/esm/bundlers/esbuild-impl/obsidian-plugin-builder.mjs +41 -87
  77. package/dist/lib/esm/bundlers/index.d.mts +12 -0
  78. package/dist/lib/esm/bundlers/index.mjs +26 -2
  79. package/dist/lib/esm/bundlers/obsidian-cli-reload.d.mts +37 -0
  80. package/dist/lib/esm/bundlers/obsidian-cli-reload.mjs +83 -0
  81. package/dist/lib/esm/bundlers/obsidian-plugin-build.d.mts +217 -0
  82. package/dist/lib/esm/bundlers/obsidian-plugin-build.mjs +166 -0
  83. package/dist/lib/esm/bundlers/obsidian-plugin-features.d.mts +186 -0
  84. package/dist/lib/esm/bundlers/obsidian-plugin-features.mjs +126 -0
  85. package/dist/lib/esm/bundlers/obsidian-plugin-transforms.d.mts +231 -0
  86. package/dist/lib/esm/bundlers/obsidian-plugin-transforms.mjs +194 -0
  87. package/dist/lib/esm/bundlers/obsidian-plugin-webpack-loader.d.mts +47 -0
  88. package/dist/lib/esm/bundlers/obsidian-plugin-webpack-loader.mjs +89 -0
  89. package/dist/lib/esm/bundlers/obsidian-plugins-folder-deployment.d.mts +44 -0
  90. package/dist/lib/esm/bundlers/obsidian-plugins-folder-deployment.mjs +228 -0
  91. package/dist/lib/esm/bundlers/parcel.d.mts +128 -0
  92. package/dist/lib/esm/bundlers/parcel.mjs +361 -0
  93. package/dist/lib/esm/bundlers/rollup-compatible-features.d.mts +128 -0
  94. package/dist/lib/esm/bundlers/rollup-compatible-features.mjs +93 -0
  95. package/dist/lib/esm/bundlers/rollup-compatible.d.mts +84 -0
  96. package/dist/lib/esm/bundlers/rollup-compatible.mjs +43 -0
  97. package/dist/lib/esm/bundlers/rollup.d.mts +99 -0
  98. package/dist/lib/esm/bundlers/rollup.mjs +130 -0
  99. package/dist/lib/esm/bundlers/vite.d.mts +105 -0
  100. package/dist/lib/esm/bundlers/vite.mjs +144 -0
  101. package/dist/lib/esm/bundlers/webpack.d.mts +133 -0
  102. package/dist/lib/esm/bundlers/webpack.mjs +259 -0
  103. package/dist/lib/esm/demo-vault-cli.d.mts +15 -0
  104. package/dist/lib/esm/demo-vault-cli.mjs +23 -0
  105. package/dist/lib/esm/index.d.mts +1 -0
  106. package/dist/lib/esm/index.mjs +3 -1
  107. package/dist/lib/esm/test-runners/coverage-badge-cli.d.mts +25 -0
  108. package/dist/lib/esm/test-runners/coverage-badge-cli.mjs +51 -0
  109. package/dist/lib/esm/test-runners/coverage-badge.d.mts +143 -0
  110. package/dist/lib/esm/test-runners/coverage-badge.mjs +181 -0
  111. package/dist/lib/esm/test-runners/e2e-runner-support.d.mts +36 -0
  112. package/dist/lib/esm/test-runners/e2e-runner-support.mjs +61 -0
  113. package/dist/lib/esm/test-runners/index.d.mts +5 -0
  114. package/dist/lib/esm/test-runners/index.mjs +12 -2
  115. package/dist/lib/esm/test-runners/obsidian-test-runner.d.mts +42 -0
  116. package/dist/lib/esm/test-runners/obsidian-test-runner.mjs +52 -0
  117. package/dist/lib/esm/test-runners/wdio-obsidian.d.mts +199 -0
  118. package/dist/lib/esm/test-runners/wdio-obsidian.mjs +110 -0
  119. package/package.json +104 -5
  120. package/test-runners/coverage-badge/package.json +6 -0
  121. package/test-runners/coverage-badge-cli/package.json +6 -0
  122. package/test-runners/e2e-runner-support/package.json +6 -0
  123. package/test-runners/obsidian-test-runner/package.json +6 -0
  124. package/test-runners/wdio-obsidian/package.json +6 -0
  125. package/tsconfig/preact.json +7 -0
  126. package/tsconfig/react.json +7 -0
  127. package/tsconfig/solid.json +7 -0
  128. package/tsconfig/svelte.json +7 -0
  129. package/tsconfig/vue.json +7 -0
  130. package/types/styles.d.ts +32 -0
  131. package/types/wasm.d.ts +11 -0
@@ -0,0 +1,126 @@
1
+ /*
2
+ THIS IS A GENERATED/BUNDLED FILE BY ESBUILD
3
+ if you want to view the source, please visit the github repository of this plugin
4
+ */
5
+ (function () {
6
+ function ensureBrowserProcess() {
7
+ const browserProcess = {
8
+ browser: true,
9
+ cwd() {
10
+ return "/";
11
+ },
12
+ env: {},
13
+ platform: "android"
14
+ };
15
+ const existingProcess = globalThis.process;
16
+ if (!existingProcess) {
17
+ globalThis.process = browserProcess;
18
+ return;
19
+ }
20
+ if (existingProcess.versions?.node) {
21
+ return;
22
+ }
23
+ const existingProcessRecord = existingProcess;
24
+ for (const [key, value] of Object.entries(browserProcess)) {
25
+ existingProcessRecord[key] ??= value;
26
+ }
27
+ existingProcessRecord["browser"] = true;
28
+ }
29
+
30
+ ensureBrowserProcess();
31
+ })();
32
+
33
+ import { getRootFolder } from "@mnaoumov/typescript-dev-toolkit/root";
34
+ import { join } from "@mnaoumov/typescript-lib/path";
35
+ import { escapeRegExp } from "@mnaoumov/typescript-lib/reg-exp";
36
+ import { createRequire } from "node:module";
37
+ import process from "node:process";
38
+ import { pathToFileURL } from "node:url";
39
+ const CSS_MODULE_FILE_PATTERN = /\.module\.(?:css|pcss|s[ac]ss)$/iu;
40
+ const JSX_SOURCE_FILE_PATTERN = /\.[jt]sx$/iu;
41
+ const STYLESHEET_FILE_PATTERN = /\.p?css$/iu;
42
+ const SVELTE_FILE_PATTERN = /\.svelte(?:\.[cm]?[jt]s)?$/iu;
43
+ const WASM_FILE_PATTERN = /\.wasm$/iu;
44
+ const VIRTUAL_MODULE_PREFIX = "\0";
45
+ function getFeatureFileKind(id) {
46
+ if (id.startsWith(VIRTUAL_MODULE_PREFIX)) {
47
+ return void 0;
48
+ }
49
+ if (STYLESHEET_FILE_PATTERN.test(id)) {
50
+ return "stylesheet";
51
+ }
52
+ const [filePath = ""] = id.split("?", 1);
53
+ if (SVELTE_FILE_PATTERN.test(filePath)) {
54
+ return "svelte";
55
+ }
56
+ if (JSX_SOURCE_FILE_PATTERN.test(filePath)) {
57
+ return "jsx";
58
+ }
59
+ return WASM_FILE_PATTERN.test(filePath) ? "wasm" : void 0;
60
+ }
61
+ function getFrameworkDefines(params) {
62
+ const { framework, isProductionBuild } = params;
63
+ if (framework === void 0) {
64
+ return {};
65
+ }
66
+ const defines = {
67
+ "process.env.NODE_ENV": JSON.stringify(isProductionBuild ? "production" : "development")
68
+ };
69
+ if (framework === "vue") {
70
+ defines["__VUE_OPTIONS_API__"] = "true";
71
+ defines["__VUE_PROD_DEVTOOLS__"] = "false";
72
+ defines["__VUE_PROD_HYDRATION_MISMATCH_DETAILS__"] = "false";
73
+ }
74
+ return defines;
75
+ }
76
+ function getJsxImportSource(framework) {
77
+ return framework === "preact" || framework === "react" ? framework : void 0;
78
+ }
79
+ async function importOptionalPeer(params) {
80
+ return await import(pathToFileURL(resolveOptionalPeer(params)).href);
81
+ }
82
+ function isCssModuleFile(filePath) {
83
+ return CSS_MODULE_FILE_PATTERN.test(filePath);
84
+ }
85
+ function isPostcssNeeded(styles) {
86
+ return Boolean(styles?.postcss) || Boolean(styles?.tailwind);
87
+ }
88
+ function replaceDefines(code, defines) {
89
+ let result = code;
90
+ for (const [expression, value] of Object.entries(defines)) {
91
+ if (!result.includes(expression)) {
92
+ continue;
93
+ }
94
+ result = result.replace(new RegExp(String.raw`(?<![\w$.])${escapeRegExp(expression)}(?![\w$])`, "gu"), () => value);
95
+ }
96
+ return result;
97
+ }
98
+ function requireOptionalPeer(params) {
99
+ return createProjectRequire(params.projectFolder)(resolveOptionalPeer(params));
100
+ }
101
+ function resolveOptionalPeer(params) {
102
+ const { feature, packageName } = params;
103
+ try {
104
+ return createProjectRequire(params.projectFolder).resolve(params.specifier ?? packageName);
105
+ } catch (error) {
106
+ throw new Error(
107
+ `The \`${feature}\` build option needs \`${packageName}\`, which this project does not have. Install it with: npm install --save-dev ${packageName}`,
108
+ { cause: error }
109
+ );
110
+ }
111
+ }
112
+ function createProjectRequire(projectFolder) {
113
+ return createRequire(join(projectFolder ?? getRootFolder() ?? process.cwd(), "package.json"));
114
+ }
115
+ export {
116
+ getFeatureFileKind,
117
+ getFrameworkDefines,
118
+ getJsxImportSource,
119
+ importOptionalPeer,
120
+ isCssModuleFile,
121
+ isPostcssNeeded,
122
+ replaceDefines,
123
+ requireOptionalPeer,
124
+ resolveOptionalPeer
125
+ };
126
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9idW5kbGVycy9vYnNpZGlhbi1wbHVnaW4tZmVhdHVyZXMudHMiXSwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAZmlsZVxuICpcbiAqIFRoZSBidWlsZCBmZWF0dXJlcyBldmVyeSBidW5kbGVyIGFkYXB0ZXIgb2ZmZXJzIGJlc2lkZSB0aGUgcGxhaW4gcGx1Z2luIGJ1aWxkOiBhIFVJIGZyYW1ld29yaywgdGhlIHN0eWxlc2hlZXRcbiAqIHBpcGVsaW5lIGFuZCBXZWJBc3NlbWJseS4gRXZlcnkgYWRhcHRlciB0YWtlcyB0aGUgc2FtZSB7QGxpbmsgT2JzaWRpYW5QbHVnaW5GZWF0dXJlT3B0aW9uc30sIHNvIGEgcHJvamVjdCB0aGF0XG4gKiBzd2l0Y2hlcyBidW5kbGVyIGtlZXBzIGl0cyBvcHRpb25zIGFuZCBpdHMgaW5zdGFsbGVkIHBhY2thZ2VzLlxuICpcbiAqIEVhY2ggZmVhdHVyZSdzIHBhY2thZ2VzIGFyZSBvcHRpb25hbCBwZWVyIGRlcGVuZGVuY2llcyBvZiB0aGUgdG9vbGtpdCwgaW1wb3J0ZWQgZnJvbSB0aGUgUFJPSkVDVCdzIG93blxuICogYG5vZGVfbW9kdWxlc2Agb25seSB3aGVuIHRoZSBmZWF0dXJlIGlzIG9uLCB0aHJvdWdoIHtAbGluayBpbXBvcnRPcHRpb25hbFBlZXJ9LlxuICpcbiAqIEVyYXNhYmxlIFR5cGVTY3JpcHQgb25seSAobm8gZW51bXMsIG5vIHBhcmFtZXRlciBwcm9wZXJ0aWVzKTogYG9ic2lkaWFuLXBsdWdpbi10cmFuc2Zvcm1zLnRzYCBpbXBvcnRzIHRoaXMgbW9kdWxlLFxuICogYW5kIGEgd2VicGFjayBsb2FkZXIgb3IgYSBwYXJjZWwgd29ya2VyIGxvYWRzIHRoYXQgb25lIHN0cmFpZ2h0IGZyb20gc291cmNlIHdoZW4gdGhlIHRvb2xraXQgcnVucyBmcm9tIHNvdXJjZS5cbiAqL1xuXG5pbXBvcnQgeyBnZXRSb290Rm9sZGVyIH0gZnJvbSAnQG1uYW91bW92L3R5cGVzY3JpcHQtZGV2LXRvb2xraXQvcm9vdCc7XG5pbXBvcnQgeyBqb2luIH0gZnJvbSAnQG1uYW91bW92L3R5cGVzY3JpcHQtbGliL3BhdGgnO1xuaW1wb3J0IHsgZXNjYXBlUmVnRXhwIH0gZnJvbSAnQG1uYW91bW92L3R5cGVzY3JpcHQtbGliL3JlZy1leHAnO1xuaW1wb3J0IHsgY3JlYXRlUmVxdWlyZSB9IGZyb20gJ25vZGU6bW9kdWxlJztcbmltcG9ydCBwcm9jZXNzIGZyb20gJ25vZGU6cHJvY2Vzcyc7XG5pbXBvcnQgeyBwYXRoVG9GaWxlVVJMIH0gZnJvbSAnbm9kZTp1cmwnO1xuXG4vKipcbiAqIFdoaWNoIHNoYXJlZCB0cmFuc2Zvcm0gYSBtb2R1bGUgZ29lcyB0aHJvdWdoLCBhcyB7QGxpbmsgZ2V0RmVhdHVyZUZpbGVLaW5kfSB0ZWxscyBpdC5cbiAqL1xuZXhwb3J0IHR5cGUgRmVhdHVyZUZpbGVLaW5kID0gJ2pzeCcgfCAnc3R5bGVzaGVldCcgfCAnc3ZlbHRlJyB8ICd3YXNtJztcblxuLyoqXG4gKiBQYXJhbWV0ZXJzIGZvciB7QGxpbmsgZ2V0RnJhbWV3b3JrRGVmaW5lc30uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgR2V0RnJhbWV3b3JrRGVmaW5lc1BhcmFtcyB7XG4gIC8qKlxuICAgKiBUaGUgVUkgZnJhbWV3b3JrLCBpZiBhbnkuXG4gICAqL1xuICByZWFkb25seSBmcmFtZXdvcms6IE9ic2lkaWFuUGx1Z2luRnJhbWV3b3JrIHwgdW5kZWZpbmVkO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRoaXMgaXMgYSBwcm9kdWN0aW9uIGJ1aWxkLlxuICAgKi9cbiAgcmVhZG9ubHkgaXNQcm9kdWN0aW9uQnVpbGQ6IGJvb2xlYW47XG59XG5cbi8qKlxuICogUGFyYW1ldGVycyBmb3Ige0BsaW5rIGltcG9ydE9wdGlvbmFsUGVlcn0uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSW1wb3J0T3B0aW9uYWxQZWVyUGFyYW1zIHtcbiAgLyoqXG4gICAqIFRoZSBvcHRpb24gdGhhdCBuZWVkcyB0aGUgcGFja2FnZSwgYXMgdGhlIGVycm9yIG1lc3NhZ2UgbmFtZXMgaXQsIGUuZy4gYGZyYW1ld29yazogJ3NvbGlkJ2AuXG4gICAqL1xuICByZWFkb25seSBmZWF0dXJlOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBwYWNrYWdlIHRvIGluc3RhbGwgd2hlbiBpdCBpcyBtaXNzaW5nLlxuICAgKi9cbiAgcmVhZG9ubHkgcGFja2FnZU5hbWU6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIGZvbGRlciB3aG9zZSBgbm9kZV9tb2R1bGVzYCB0aGUgcGFja2FnZSBpcyByZXNvbHZlZCBmcm9tLiBEZWZhdWx0cyB0byB0aGUgcHJvamVjdCByb290LlxuICAgKi9cbiAgcmVhZG9ubHkgcHJvamVjdEZvbGRlcj86IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIG1vZHVsZSB0byBpbXBvcnQuIERlZmF1bHRzIHRvIHtAbGluayBwYWNrYWdlTmFtZX0uXG4gICAqL1xuICByZWFkb25seSBzcGVjaWZpZXI/OiBzdHJpbmc7XG59XG5cbi8qKlxuICogVGhlIGJ1aWxkIGZlYXR1cmVzIGJlc2lkZSB0aGUgcGxhaW4gcGx1Z2luIGJ1aWxkLiBFdmVyeSBvcHRpb24gaXMgb2ZmIHVubGVzcyBzZXQuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgT2JzaWRpYW5QbHVnaW5GZWF0dXJlT3B0aW9ucyB7XG4gIC8qKlxuICAgKiBUaGUgVUkgZnJhbWV3b3JrIHdob3NlIGNvbXBvbmVudHMgdGhlIGJ1aWxkIGNvbXBpbGVzLlxuICAgKi9cbiAgcmVhZG9ubHkgZnJhbWV3b3JrPzogT2JzaWRpYW5QbHVnaW5GcmFtZXdvcms7XG5cbiAgLyoqXG4gICAqIFRoZSBzdHlsZXNoZWV0IHBpcGVsaW5lLlxuICAgKi9cbiAgcmVhZG9ubHkgc3R5bGVzPzogT2JzaWRpYW5QbHVnaW5TdHlsZXNPcHRpb25zO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIGBpbXBvcnQgYnl0ZXMgZnJvbSAnLi9tb2R1bGUud2FzbSdgIGltcG9ydHMgdGhlIG1vZHVsZSdzIGJ5dGVzIGFzIGEgYFVpbnQ4QXJyYXlgLCBpbmxpbmVkIGludG8gYG1haW4uanNgLlxuICAgKi9cbiAgcmVhZG9ubHkgd2FzbT86IGJvb2xlYW47XG59XG5cbi8qKlxuICogQSBVSSBmcmFtZXdvcmsgdGhlIGJ1bmRsZXIgYWRhcHRlcnMgY29tcGlsZS5cbiAqXG4gKiAtIGByZWFjdGAgYW5kIGBwcmVhY3RgIGNvbXBpbGUgSlNYIHdpdGggdGhlIGF1dG9tYXRpYyBydW50aW1lIGZyb20gYHJlYWN0YCAvIGBwcmVhY3RgLlxuICogLSBgc29saWRgIGNvbXBpbGVzIEpTWCB3aXRoIGBiYWJlbC1wcmVzZXQtc29saWRgLlxuICogLSBgc3ZlbHRlYCBjb21waWxlcyBgLnN2ZWx0ZWAgY29tcG9uZW50cyBhbmQgYC5zdmVsdGUudHNgIC8gYC5zdmVsdGUuanNgIG1vZHVsZXMgd2l0aCB0aGUgcHJvamVjdCdzIGBzdmVsdGVgLlxuICogLSBgdnVlYCBjb21waWxlcyBzaW5nbGUtZmlsZSBjb21wb25lbnRzIHdpdGggYHVucGx1Z2luLXZ1ZWAgKG9uIHBhcmNlbCwgd2l0aCBgQHBhcmNlbC90cmFuc2Zvcm1lci12dWVgKS5cbiAqL1xuZXhwb3J0IHR5cGUgT2JzaWRpYW5QbHVnaW5GcmFtZXdvcmsgPSAncHJlYWN0JyB8ICdyZWFjdCcgfCAnc29saWQnIHwgJ3N2ZWx0ZScgfCAndnVlJztcblxuLyoqXG4gKiBUaGUgc3R5bGVzaGVldCBwaXBlbGluZSBvZiB7QGxpbmsgT2JzaWRpYW5QbHVnaW5GZWF0dXJlT3B0aW9uc30uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgT2JzaWRpYW5QbHVnaW5TdHlsZXNPcHRpb25zIHtcbiAgLyoqXG4gICAqIFdoZXRoZXIgYSBgKi5tb2R1bGUuY3NzYCBmaWxlIGlzIGEgQ1NTIG1vZHVsZTogaXRzIGNsYXNzIG5hbWVzIGFyZSBzY29wZWQsIGFuZCBpbXBvcnRpbmcgaXQgZ2l2ZXMgdGhlIHNjb3BlZFxuICAgKiBuYW1lcyBieSB0aGVpciBvcmlnaW5hbCBvbmVzLlxuICAgKi9cbiAgcmVhZG9ubHkgY3NzTW9kdWxlcz86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgZXZlcnkgc3R5bGVzaGVldCBnb2VzIHRocm91Z2ggdGhlIHByb2plY3QncyBQb3N0Q1NTIGNvbmZpZ3VyYXRpb24gKGBwb3N0Y3NzLmNvbmZpZy4qYCwgYC5wb3N0Y3NzcmMqYCwgb3JcbiAgICogYHBvc3Rjc3NgIGluIGBwYWNrYWdlLmpzb25gKS5cbiAgICovXG4gIHJlYWRvbmx5IHBvc3Rjc3M/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIGV2ZXJ5IHN0eWxlc2hlZXQgZ29lcyB0aHJvdWdoIFRhaWx3aW5kIENTUyA0IChgQHRhaWx3aW5kY3NzL3Bvc3Rjc3NgKSwgc28gYEBpbXBvcnQgXCJ0YWlsd2luZGNzc1wiO2BcbiAgICogZXhwYW5kcyB0byB0aGUgdXRpbGl0aWVzIHRoZSBzb3VyY2VzIHVzZS5cbiAgICovXG4gIHJlYWRvbmx5IHRhaWx3aW5kPzogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBQYXJhbWV0ZXJzIGZvciB7QGxpbmsgcmVxdWlyZU9wdGlvbmFsUGVlcn06IHRoZSBzYW1lIGFzIHtAbGluayBJbXBvcnRPcHRpb25hbFBlZXJQYXJhbXN9LlxuICovXG5leHBvcnQgdHlwZSBSZXF1aXJlT3B0aW9uYWxQZWVyUGFyYW1zID0gSW1wb3J0T3B0aW9uYWxQZWVyUGFyYW1zO1xuXG4vKipcbiAqIFBhcmFtZXRlcnMgZm9yIHtAbGluayByZXNvbHZlT3B0aW9uYWxQZWVyfTogdGhlIHNhbWUgYXMge0BsaW5rIEltcG9ydE9wdGlvbmFsUGVlclBhcmFtc30uXG4gKi9cbmV4cG9ydCB0eXBlIFJlc29sdmVPcHRpb25hbFBlZXJQYXJhbXMgPSBJbXBvcnRPcHRpb25hbFBlZXJQYXJhbXM7XG5cbmNvbnN0IENTU19NT0RVTEVfRklMRV9QQVRURVJOID0gL1xcLm1vZHVsZVxcLig/OmNzc3xwY3NzfHNbYWNdc3MpJC9pdTtcbmNvbnN0IEpTWF9TT1VSQ0VfRklMRV9QQVRURVJOID0gL1xcLltqdF1zeCQvaXU7XG5jb25zdCBTVFlMRVNIRUVUX0ZJTEVfUEFUVEVSTiA9IC9cXC5wP2NzcyQvaXU7XG5jb25zdCBTVkVMVEVfRklMRV9QQVRURVJOID0gL1xcLnN2ZWx0ZSg/OlxcLltjbV0/W2p0XXMpPyQvaXU7XG5jb25zdCBXQVNNX0ZJTEVfUEFUVEVSTiA9IC9cXC53YXNtJC9pdTtcbmNvbnN0IFZJUlRVQUxfTU9EVUxFX1BSRUZJWCA9ICdcXDAnO1xuXG4vKipcbiAqIFRlbGxzIHdoaWNoIHNoYXJlZCB0cmFuc2Zvcm0gYSBtb2R1bGUgb2YgYSByb2xsdXAtZmFtaWx5IGJ1aWxkIGdvZXMgdGhyb3VnaCwgYnkgaXRzIGlkLlxuICpcbiAqIEEgdmlydHVhbCBtb2R1bGUgKGFuIGlkIHN0YXJ0aW5nIHdpdGggYFxcMGApIGdvZXMgdGhyb3VnaCBub25lLiBBIHF1ZXJ5IGlzIHBhcnQgb2YgdGhlIG1hdGNoIGZvciBhIHN0eWxlc2hlZXQsIHNvIGFcbiAqIFZ1ZSBjb21wb25lbnQncyBgP3Z1ZSZ0eXBlPXN0eWxlJmxhbmcuY3NzYCBibG9jayBjb3VudHMgYXMgb25lLCBhbmQgaXMgY3V0IG9mZiBmb3IgdGhlIHJlc3QuXG4gKlxuICogQHBhcmFtIGlkIC0gVGhlIG1vZHVsZSBpZC5cbiAqIEByZXR1cm5zIFRoZSBraW5kIG9mIGZpbGUsIG9yIGB1bmRlZmluZWRgIGZvciBhIG1vZHVsZSBubyBmZWF0dXJlIHRyYW5zZm9ybXMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRGZWF0dXJlRmlsZUtpbmQoaWQ6IHN0cmluZyk6IEZlYXR1cmVGaWxlS2luZCB8IHVuZGVmaW5lZCB7XG4gIGlmIChpZC5zdGFydHNXaXRoKFZJUlRVQUxfTU9EVUxFX1BSRUZJWCkpIHtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG4gIGlmIChTVFlMRVNIRUVUX0ZJTEVfUEFUVEVSTi50ZXN0KGlkKSkge1xuICAgIHJldHVybiAnc3R5bGVzaGVldCc7XG4gIH1cbiAgY29uc3QgW2ZpbGVQYXRoID0gJyddID0gaWQuc3BsaXQoJz8nLCAxKTtcbiAgaWYgKFNWRUxURV9GSUxFX1BBVFRFUk4udGVzdChmaWxlUGF0aCkpIHtcbiAgICByZXR1cm4gJ3N2ZWx0ZSc7XG4gIH1cbiAgaWYgKEpTWF9TT1VSQ0VfRklMRV9QQVRURVJOLnRlc3QoZmlsZVBhdGgpKSB7XG4gICAgcmV0dXJuICdqc3gnO1xuICB9XG4gIHJldHVybiBXQVNNX0ZJTEVfUEFUVEVSTi50ZXN0KGZpbGVQYXRoKSA/ICd3YXNtJyA6IHVuZGVmaW5lZDtcbn1cblxuLyoqXG4gKiBCdWlsZHMgdGhlIGNvbXBpbGUtdGltZSBjb25zdGFudHMgYSBmcmFtZXdvcmsncyBydW50aW1lIHJlYWRzLCB3aGljaCBPYnNpZGlhbidzIHJlbmRlcmVyIGRvZXMgbm90IGRlZmluZS5cbiAqXG4gKiBgcHJvY2Vzcy5lbnYuTk9ERV9FTlZgIHBpY2tzIGEgcnVudGltZSdzIHByb2R1Y3Rpb24gYnVpbGQgKFJlYWN0LCBQcmVhY3QncyBkZXZ0b29scywgVnVlLCBTb2xpZCksIGFuZCB3aXRob3V0IGl0IGFcbiAqIHByb2R1Y3Rpb24gcGx1Z2luIHdvdWxkIGJ1bmRsZSBhbmQgcnVuIHRoZSBkZXZlbG9wbWVudCBvbmUuIFZ1ZSBhbHNvIHJlYWRzIGl0cyB0aHJlZSBmZWF0dXJlIGZsYWdzLlxuICpcbiAqIEBwYXJhbSBwYXJhbXMgLSBUaGUge0BsaW5rIEdldEZyYW1ld29ya0RlZmluZXNQYXJhbXN9LlxuICogQHJldHVybnMgVGhlIGNvbnN0YW50cywgYnkgZXhwcmVzc2lvbiwgZWFjaCB2YWx1ZSBhIEphdmFTY3JpcHQgbGl0ZXJhbC4gRW1wdHkgd2hlbiB0aGVyZSBpcyBubyBmcmFtZXdvcmsuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRGcmFtZXdvcmtEZWZpbmVzKHBhcmFtczogR2V0RnJhbWV3b3JrRGVmaW5lc1BhcmFtcyk6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4ge1xuICBjb25zdCB7IGZyYW1ld29yaywgaXNQcm9kdWN0aW9uQnVpbGQgfSA9IHBhcmFtcztcbiAgaWYgKGZyYW1ld29yayA9PT0gdW5kZWZpbmVkKSB7XG4gICAgcmV0dXJuIHt9O1xuICB9XG5cbiAgY29uc3QgZGVmaW5lczogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHtcbiAgICAncHJvY2Vzcy5lbnYuTk9ERV9FTlYnOiBKU09OLnN0cmluZ2lmeShpc1Byb2R1Y3Rpb25CdWlsZCA/ICdwcm9kdWN0aW9uJyA6ICdkZXZlbG9wbWVudCcpXG4gIH07XG4gIGlmIChmcmFtZXdvcmsgPT09ICd2dWUnKSB7XG4gICAgZGVmaW5lc1snX19WVUVfT1BUSU9OU19BUElfXyddID0gJ3RydWUnO1xuICAgIGRlZmluZXNbJ19fVlVFX1BST0RfREVWVE9PTFNfXyddID0gJ2ZhbHNlJztcbiAgICBkZWZpbmVzWydfX1ZVRV9QUk9EX0hZRFJBVElPTl9NSVNNQVRDSF9ERVRBSUxTX18nXSA9ICdmYWxzZSc7XG4gIH1cbiAgcmV0dXJuIGRlZmluZXM7XG59XG5cbi8qKlxuICogVGVsbHMgd2hpY2ggcGFja2FnZSBzdXBwbGllcyB0aGUgYXV0b21hdGljIEpTWCBydW50aW1lIG9mIGEgZnJhbWV3b3JrLlxuICpcbiAqIEBwYXJhbSBmcmFtZXdvcmsgLSBUaGUgVUkgZnJhbWV3b3JrLCBpZiBhbnkuXG4gKiBAcmV0dXJucyBgcmVhY3RgIG9yIGBwcmVhY3RgLCBvciBgdW5kZWZpbmVkYCBmb3IgYSBmcmFtZXdvcmsgdGhhdCBkb2VzIG5vdCBjb21waWxlIEpTWCB3aXRoIHRoZSBhdXRvbWF0aWMgcnVudGltZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldEpzeEltcG9ydFNvdXJjZShmcmFtZXdvcms6IE9ic2lkaWFuUGx1Z2luRnJhbWV3b3JrIHwgdW5kZWZpbmVkKTogJ3ByZWFjdCcgfCAncmVhY3QnIHwgdW5kZWZpbmVkIHtcbiAgcmV0dXJuIGZyYW1ld29yayA9PT0gJ3ByZWFjdCcgfHwgZnJhbWV3b3JrID09PSAncmVhY3QnID8gZnJhbWV3b3JrIDogdW5kZWZpbmVkO1xufVxuXG4vKipcbiAqIEltcG9ydHMgYW4gb3B0aW9uYWwgcGVlciBkZXBlbmRlbmN5IGZyb20gdGhlIHByb2plY3QncyBvd24gYG5vZGVfbW9kdWxlc2AuXG4gKlxuICogUmVzb2x2ZWQgZnJvbSB0aGUgcHJvamVjdCByYXRoZXIgdGhhbiBmcm9tIHRoZSB0b29sa2l0LCBzbyBhIHBhY2thZ2UgbWFuYWdlciB0aGF0IGRvZXMgbm90IGhvaXN0IHN0aWxsIGZpbmRzIHdoYXRcbiAqIHRoZSBwcm9qZWN0IGluc3RhbGxlZC5cbiAqXG4gKiBAdHlwZVBhcmFtIE1vZHVsZSAtIFRoZSBtb2R1bGUncyB0eXBlLlxuICogQHBhcmFtIHBhcmFtcyAtIFRoZSB7QGxpbmsgSW1wb3J0T3B0aW9uYWxQZWVyUGFyYW1zfS5cbiAqIEByZXR1cm5zIEEge0BsaW5rIFByb21pc2V9IHRoYXQgcmVzb2x2ZXMgdG8gdGhlIG1vZHVsZSBuYW1lc3BhY2UuXG4gKiBAdGhyb3dzIElmIHRoZSBwcm9qZWN0IGRvZXMgbm90IGhhdmUgdGhlIHBhY2thZ2UsIG5hbWluZyB0aGUgb3B0aW9uIHRoYXQgbmVlZHMgaXQgYW5kIHRoZSBjb21tYW5kIHRoYXQgaW5zdGFsbHMgaXQuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBpbXBvcnRPcHRpb25hbFBlZXI8TW9kdWxlPihwYXJhbXM6IEltcG9ydE9wdGlvbmFsUGVlclBhcmFtcyk6IFByb21pc2U8TW9kdWxlPiB7XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11bnNhbml0aXplZC9tZXRob2QgLS0gVGhlIHBhdGggaXMgd2hhdCBOb2RlIHJlc29sdmVkIHRoZSBwYWNrYWdlIG5hbWUgdG8sIGZyb20gdGhlIHByb2plY3QncyBvd24gYG5vZGVfbW9kdWxlc2AuXG4gIHJldHVybiBhd2FpdCBpbXBvcnQocGF0aFRvRmlsZVVSTChyZXNvbHZlT3B0aW9uYWxQZWVyKHBhcmFtcykpLmhyZWYpIGFzIE1vZHVsZTtcbn1cblxuLyoqXG4gKiBUZWxscyB3aGV0aGVyIGEgc3R5bGVzaGVldCBpcyBhIENTUyBtb2R1bGUgYnkgaXRzIGZpbGUgbmFtZS5cbiAqXG4gKiBAcGFyYW0gZmlsZVBhdGggLSBUaGUgc3R5bGVzaGVldCdzIHBhdGguXG4gKiBAcmV0dXJucyBgdHJ1ZWAgZm9yIGAqLm1vZHVsZS5jc3NgIChhbmQgYC5tb2R1bGUucGNzc2AsIGAubW9kdWxlLnNjc3NgLCBgLm1vZHVsZS5zYXNzYCkuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc0Nzc01vZHVsZUZpbGUoZmlsZVBhdGg6IHN0cmluZyk6IGJvb2xlYW4ge1xuICByZXR1cm4gQ1NTX01PRFVMRV9GSUxFX1BBVFRFUk4udGVzdChmaWxlUGF0aCk7XG59XG5cbi8qKlxuICogVGVsbHMgd2hldGhlciBhIHN0eWxlc2hlZXQgZ29lcyB0aHJvdWdoIFBvc3RDU1MgYXQgYWxsLlxuICpcbiAqIEBwYXJhbSBzdHlsZXMgLSBUaGUgc3R5bGVzaGVldCBvcHRpb25zLCBpZiBhbnkuXG4gKiBAcmV0dXJucyBgdHJ1ZWAgd2hlbiB0aGUgcHJvamVjdCdzIFBvc3RDU1MgY29uZmlndXJhdGlvbiBvciBUYWlsd2luZCBhcHBsaWVzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNQb3N0Y3NzTmVlZGVkKHN0eWxlczogT2JzaWRpYW5QbHVnaW5TdHlsZXNPcHRpb25zIHwgdW5kZWZpbmVkKTogYm9vbGVhbiB7XG4gIHJldHVybiBCb29sZWFuKHN0eWxlcz8ucG9zdGNzcykgfHwgQm9vbGVhbihzdHlsZXM/LnRhaWx3aW5kKTtcbn1cblxuLyoqXG4gKiBSZXBsYWNlcyBlYWNoIGNvbXBpbGUtdGltZSBjb25zdGFudCBpbiBhIG1vZHVsZSdzIGNvZGUgd2l0aCBpdHMgdmFsdWUsIGFzIGEgYnVuZGxlcidzIGBkZWZpbmVgIGRvZXM6IG9ubHkgd2hlcmVcbiAqIHRoZSB3aG9sZSBleHByZXNzaW9uIHN0YW5kcyBvbiBpdHMgb3duLCBzbyBgcHJvY2Vzcy5lbnYuTk9ERV9FTlZgIGlzIHJlcGxhY2VkIGFuZCBgYS5wcm9jZXNzLmVudi5OT0RFX0VOVmAgb3JcbiAqIGBwcm9jZXNzLmVudi5OT0RFX0VOVl9YYCBhcmUgbm90LlxuICpcbiAqIEBwYXJhbSBjb2RlIC0gVGhlIG1vZHVsZSdzIGNvZGUuXG4gKiBAcGFyYW0gZGVmaW5lcyAtIFRoZSBjb25zdGFudHMsIGJ5IGV4cHJlc3Npb24sIGVhY2ggdmFsdWUgYSBKYXZhU2NyaXB0IGxpdGVyYWwuXG4gKiBAcmV0dXJucyBUaGUgY29kZSB3aXRoIHRoZSBjb25zdGFudHMgcmVwbGFjZWQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZXBsYWNlRGVmaW5lcyhjb2RlOiBzdHJpbmcsIGRlZmluZXM6IFJlYWRvbmx5PFJlY29yZDxzdHJpbmcsIHN0cmluZz4+KTogc3RyaW5nIHtcbiAgbGV0IHJlc3VsdCA9IGNvZGU7XG4gIGZvciAoY29uc3QgW2V4cHJlc3Npb24sIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhkZWZpbmVzKSkge1xuICAgIGlmICghcmVzdWx0LmluY2x1ZGVzKGV4cHJlc3Npb24pKSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgcmVzdWx0ID0gcmVzdWx0LnJlcGxhY2UobmV3IFJlZ0V4cChTdHJpbmcucmF3YCg/PCFbXFx3JC5dKSR7ZXNjYXBlUmVnRXhwKGV4cHJlc3Npb24pfSg/IVtcXHckXSlgLCAnZ3UnKSwgKCkgPT4gdmFsdWUpO1xuICB9XG4gIHJldHVybiByZXN1bHQ7XG59XG5cbi8qKlxuICogTG9hZHMgYW4gb3B0aW9uYWwgcGVlciBkZXBlbmRlbmN5IGZyb20gdGhlIHByb2plY3QncyBvd24gYG5vZGVfbW9kdWxlc2Agc3luY2hyb25vdXNseSwgZm9yIGEgYnVuZGxlciB3aG9zZSBwbHVnaW5zXG4gKiBhcmUgYXBwbGllZCBzeW5jaHJvbm91c2x5ICh3ZWJwYWNrKS4gTG9hZHMgYW4gRVMgbW9kdWxlIHRvbywgdGhyb3VnaCBgcmVxdWlyZWAuXG4gKlxuICogQHBhcmFtIHBhcmFtcyAtIFRoZSB7QGxpbmsgUmVxdWlyZU9wdGlvbmFsUGVlclBhcmFtc30uXG4gKiBAcmV0dXJucyBUaGUgbW9kdWxlLCBmb3IgdGhlIGNhbGxlciB0byB0eXBlLlxuICogQHRocm93cyBJZiB0aGUgcHJvamVjdCBkb2VzIG5vdCBoYXZlIHRoZSBwYWNrYWdlLCBuYW1pbmcgdGhlIG9wdGlvbiB0aGF0IG5lZWRzIGl0IGFuZCB0aGUgY29tbWFuZCB0aGF0IGluc3RhbGxzIGl0LlxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVxdWlyZU9wdGlvbmFsUGVlcihwYXJhbXM6IFJlcXVpcmVPcHRpb25hbFBlZXJQYXJhbXMpOiB1bmtub3duIHtcbiAgcmV0dXJuIGNyZWF0ZVByb2plY3RSZXF1aXJlKHBhcmFtcy5wcm9qZWN0Rm9sZGVyKShyZXNvbHZlT3B0aW9uYWxQZWVyKHBhcmFtcykpO1xufVxuXG4vKipcbiAqIFJlc29sdmVzIGFuIG9wdGlvbmFsIHBlZXIgZGVwZW5kZW5jeSBmcm9tIHRoZSBwcm9qZWN0J3Mgb3duIGBub2RlX21vZHVsZXNgLlxuICpcbiAqIEBwYXJhbSBwYXJhbXMgLSBUaGUge0BsaW5rIFJlc29sdmVPcHRpb25hbFBlZXJQYXJhbXN9LlxuICogQHJldHVybnMgVGhlIGFic29sdXRlIHBhdGggb2YgdGhlIG1vZHVsZS5cbiAqIEB0aHJvd3MgSWYgdGhlIHByb2plY3QgZG9lcyBub3QgaGF2ZSB0aGUgcGFja2FnZSwgbmFtaW5nIHRoZSBvcHRpb24gdGhhdCBuZWVkcyBpdCBhbmQgdGhlIGNvbW1hbmQgdGhhdCBpbnN0YWxscyBpdC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlc29sdmVPcHRpb25hbFBlZXIocGFyYW1zOiBSZXNvbHZlT3B0aW9uYWxQZWVyUGFyYW1zKTogc3RyaW5nIHtcbiAgY29uc3QgeyBmZWF0dXJlLCBwYWNrYWdlTmFtZSB9ID0gcGFyYW1zO1xuICB0cnkge1xuICAgIHJldHVybiBjcmVhdGVQcm9qZWN0UmVxdWlyZShwYXJhbXMucHJvamVjdEZvbGRlcikucmVzb2x2ZShwYXJhbXMuc3BlY2lmaWVyID8/IHBhY2thZ2VOYW1lKTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICBgVGhlIFxcYCR7ZmVhdHVyZX1cXGAgYnVpbGQgb3B0aW9uIG5lZWRzIFxcYCR7cGFja2FnZU5hbWV9XFxgLCB3aGljaCB0aGlzIHByb2plY3QgZG9lcyBub3QgaGF2ZS4gSW5zdGFsbCBpdCB3aXRoOiBucG0gaW5zdGFsbCAtLXNhdmUtZGV2ICR7cGFja2FnZU5hbWV9YCxcbiAgICAgIHsgY2F1c2U6IGVycm9yIH1cbiAgICApO1xuICB9XG59XG5cbmZ1bmN0aW9uIGNyZWF0ZVByb2plY3RSZXF1aXJlKHByb2plY3RGb2xkZXI6IHN0cmluZyB8IHVuZGVmaW5lZCk6IE5vZGVKUy5SZXF1aXJlIHtcbiAgcmV0dXJuIGNyZWF0ZVJlcXVpcmUoam9pbihwcm9qZWN0Rm9sZGVyID8/IGdldFJvb3RGb2xkZXIoKSA/PyBwcm9jZXNzLmN3ZCgpLCAncGFja2FnZS5qc29uJykpO1xufVxuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQWNBLFNBQVMscUJBQXFCO0FBQzlCLFNBQVMsWUFBWTtBQUNyQixTQUFTLG9CQUFvQjtBQUM3QixTQUFTLHFCQUFxQjtBQUM5QixPQUFPLGFBQWE7QUFDcEIsU0FBUyxxQkFBcUI7QUE4RzlCLE1BQU0sMEJBQTBCO0FBQ2hDLE1BQU0sMEJBQTBCO0FBQ2hDLE1BQU0sMEJBQTBCO0FBQ2hDLE1BQU0sc0JBQXNCO0FBQzVCLE1BQU0sb0JBQW9CO0FBQzFCLE1BQU0sd0JBQXdCO0FBV3ZCLFNBQVMsbUJBQW1CLElBQXlDO0FBQzFFLE1BQUksR0FBRyxXQUFXLHFCQUFxQixHQUFHO0FBQ3hDLFdBQU87QUFBQSxFQUNUO0FBQ0EsTUFBSSx3QkFBd0IsS0FBSyxFQUFFLEdBQUc7QUFDcEMsV0FBTztBQUFBLEVBQ1Q7QUFDQSxRQUFNLENBQUMsV0FBVyxFQUFFLElBQUksR0FBRyxNQUFNLEtBQUssQ0FBQztBQUN2QyxNQUFJLG9CQUFvQixLQUFLLFFBQVEsR0FBRztBQUN0QyxXQUFPO0FBQUEsRUFDVDtBQUNBLE1BQUksd0JBQXdCLEtBQUssUUFBUSxHQUFHO0FBQzFDLFdBQU87QUFBQSxFQUNUO0FBQ0EsU0FBTyxrQkFBa0IsS0FBSyxRQUFRLElBQUksU0FBUztBQUNyRDtBQVdPLFNBQVMsb0JBQW9CLFFBQTJEO0FBQzdGLFFBQU0sRUFBRSxXQUFXLGtCQUFrQixJQUFJO0FBQ3pDLE1BQUksY0FBYyxRQUFXO0FBQzNCLFdBQU8sQ0FBQztBQUFBLEVBQ1Y7QUFFQSxRQUFNLFVBQWtDO0FBQUEsSUFDdEMsd0JBQXdCLEtBQUssVUFBVSxvQkFBb0IsZUFBZSxhQUFhO0FBQUEsRUFDekY7QUFDQSxNQUFJLGNBQWMsT0FBTztBQUN2QixZQUFRLHFCQUFxQixJQUFJO0FBQ2pDLFlBQVEsdUJBQXVCLElBQUk7QUFDbkMsWUFBUSx5Q0FBeUMsSUFBSTtBQUFBLEVBQ3ZEO0FBQ0EsU0FBTztBQUNUO0FBUU8sU0FBUyxtQkFBbUIsV0FBZ0Y7QUFDakgsU0FBTyxjQUFjLFlBQVksY0FBYyxVQUFVLFlBQVk7QUFDdkU7QUFhQSxlQUFzQixtQkFBMkIsUUFBbUQ7QUFFbEcsU0FBTyxNQUFNLE9BQU8sY0FBYyxvQkFBb0IsTUFBTSxDQUFDLEVBQUU7QUFDakU7QUFRTyxTQUFTLGdCQUFnQixVQUEyQjtBQUN6RCxTQUFPLHdCQUF3QixLQUFLLFFBQVE7QUFDOUM7QUFRTyxTQUFTLGdCQUFnQixRQUEwRDtBQUN4RixTQUFPLFFBQVEsUUFBUSxPQUFPLEtBQUssUUFBUSxRQUFRLFFBQVE7QUFDN0Q7QUFXTyxTQUFTLGVBQWUsTUFBYyxTQUFtRDtBQUM5RixNQUFJLFNBQVM7QUFDYixhQUFXLENBQUMsWUFBWSxLQUFLLEtBQUssT0FBTyxRQUFRLE9BQU8sR0FBRztBQUN6RCxRQUFJLENBQUMsT0FBTyxTQUFTLFVBQVUsR0FBRztBQUNoQztBQUFBLElBQ0Y7QUFDQSxhQUFTLE9BQU8sUUFBUSxJQUFJLE9BQU8sT0FBTyxpQkFBaUIsYUFBYSxVQUFVLENBQUMsYUFBYSxJQUFJLEdBQUcsTUFBTSxLQUFLO0FBQUEsRUFDcEg7QUFDQSxTQUFPO0FBQ1Q7QUFVTyxTQUFTLG9CQUFvQixRQUE0QztBQUM5RSxTQUFPLHFCQUFxQixPQUFPLGFBQWEsRUFBRSxvQkFBb0IsTUFBTSxDQUFDO0FBQy9FO0FBU08sU0FBUyxvQkFBb0IsUUFBMkM7QUFDN0UsUUFBTSxFQUFFLFNBQVMsWUFBWSxJQUFJO0FBQ2pDLE1BQUk7QUFDRixXQUFPLHFCQUFxQixPQUFPLGFBQWEsRUFBRSxRQUFRLE9BQU8sYUFBYSxXQUFXO0FBQUEsRUFDM0YsU0FBUyxPQUFPO0FBQ2QsVUFBTSxJQUFJO0FBQUEsTUFDUixTQUFTLE9BQU8sMkJBQTJCLFdBQVcsaUZBQWlGLFdBQVc7QUFBQSxNQUNsSixFQUFFLE9BQU8sTUFBTTtBQUFBLElBQ2pCO0FBQUEsRUFDRjtBQUNGO0FBRUEsU0FBUyxxQkFBcUIsZUFBbUQ7QUFDL0UsU0FBTyxjQUFjLEtBQUssaUJBQWlCLGNBQWMsS0FBSyxRQUFRLElBQUksR0FBRyxjQUFjLENBQUM7QUFDOUY7IiwibmFtZXMiOltdfQ==
@@ -0,0 +1,231 @@
1
+ /// <reference path="../library-references.d.mts" />
2
+ /**
3
+ * @file
4
+ *
5
+ * The source transforms every bundler adapter shares, so a feature compiles the same way whichever bundler runs it:
6
+ * Solid's JSX, Svelte components and modules, stylesheets through PostCSS, Tailwind and CSS modules, and WebAssembly
7
+ * modules as bytes. The esbuild, rollup and vite adapters call them in-process; the webpack adapter through the
8
+ * loader it ships, and the parcel adapter through the transformers it generates.
9
+ *
10
+ * Erasable TypeScript only (no enums, no parameter properties), so a webpack loader or a parcel worker can load this
11
+ * module straight from source when the toolkit runs from source.
12
+ */
13
+ import type { AcceptedPlugin, ProcessOptions } from 'postcss';
14
+ import type { ObsidianPluginStylesOptions } from './obsidian-plugin-features.mjs';
15
+ /**
16
+ * Parameters for {@link loadPostcssConfig}.
17
+ */
18
+ export interface LoadPostcssConfigParams {
19
+ /**
20
+ * Whether this is a production build.
21
+ */
22
+ readonly isProductionBuild: boolean;
23
+ /**
24
+ * The folder the project's PostCSS configuration and packages are found from. Defaults to the project root.
25
+ */
26
+ readonly projectFolder?: string | undefined;
27
+ /**
28
+ * The stylesheet options.
29
+ */
30
+ readonly styles: ObsidianPluginStylesOptions;
31
+ }
32
+ /**
33
+ * What {@link loadPostcssConfig} loaded.
34
+ */
35
+ export interface PostcssConfig {
36
+ /**
37
+ * The files the configuration came from, for a watch build to watch.
38
+ */
39
+ readonly dependencies: readonly string[];
40
+ /**
41
+ * The process options of the project's configuration (a custom parser or syntax, say).
42
+ */
43
+ readonly options: ProcessOptions;
44
+ /**
45
+ * The plugins, in the order they run.
46
+ */
47
+ readonly plugins: readonly AcceptedPlugin[];
48
+ }
49
+ /**
50
+ * A source map, as the transforms hand it over: the decoded JSON of a version 3 source map.
51
+ */
52
+ export interface SourceMapLike {
53
+ /**
54
+ * The encoded mappings.
55
+ */
56
+ readonly mappings: string;
57
+ /**
58
+ * The original sources.
59
+ */
60
+ readonly sources: readonly string[];
61
+ /**
62
+ * The source map version.
63
+ */
64
+ readonly version: number;
65
+ }
66
+ /**
67
+ * Parameters for {@link transformCss}.
68
+ */
69
+ export interface TransformCssParams {
70
+ /**
71
+ * The stylesheet's path.
72
+ */
73
+ readonly filePath: string;
74
+ /**
75
+ * Whether `*.module.css` files are scoped here. A bundler that scopes CSS modules itself passes `false`.
76
+ */
77
+ readonly isCssModuleScoped: boolean;
78
+ /**
79
+ * Whether this is a production build.
80
+ */
81
+ readonly isProductionBuild: boolean;
82
+ /**
83
+ * The folder the project's PostCSS configuration and packages are found from. Defaults to the project root.
84
+ */
85
+ readonly projectFolder?: string | undefined;
86
+ /**
87
+ * The stylesheet's contents.
88
+ */
89
+ readonly source: string;
90
+ /**
91
+ * The stylesheet options.
92
+ */
93
+ readonly styles: ObsidianPluginStylesOptions;
94
+ }
95
+ /**
96
+ * The CSS {@link transformCss} produced.
97
+ */
98
+ export interface TransformedCss {
99
+ /**
100
+ * The stylesheet.
101
+ */
102
+ readonly css: string;
103
+ /**
104
+ * The files besides the stylesheet that the result depends on, for a watch build to watch: a PostCSS configuration,
105
+ * or a stylesheet a plugin inlined.
106
+ */
107
+ readonly dependencies: readonly string[];
108
+ /**
109
+ * The scoped class names by their original ones, for a CSS module; `undefined` for an ordinary stylesheet.
110
+ */
111
+ readonly moduleExports: Readonly<Record<string, string>> | undefined;
112
+ }
113
+ /**
114
+ * A JavaScript module a transform produced.
115
+ */
116
+ export interface TransformedModule {
117
+ /**
118
+ * The JavaScript code.
119
+ */
120
+ readonly code: string;
121
+ /**
122
+ * Its source map, or `undefined` when there is none.
123
+ */
124
+ readonly map: SourceMapLike | undefined;
125
+ }
126
+ /**
127
+ * Parameters for {@link transformJsx}.
128
+ */
129
+ export interface TransformJsxParams extends TransformModuleParams {
130
+ /**
131
+ * The package that supplies the automatic JSX runtime: `react` or `preact`.
132
+ */
133
+ readonly jsxImportSource: string;
134
+ }
135
+ /**
136
+ * Parameters of a transform that compiles one module.
137
+ */
138
+ export interface TransformModuleParams {
139
+ /**
140
+ * The source code.
141
+ */
142
+ readonly code: string;
143
+ /**
144
+ * The source file's path.
145
+ */
146
+ readonly filePath: string;
147
+ /**
148
+ * Whether this is a production build.
149
+ */
150
+ readonly isProductionBuild: boolean;
151
+ /**
152
+ * The folder the framework's packages are resolved from. Defaults to the project root.
153
+ */
154
+ readonly projectFolder?: string;
155
+ }
156
+ /**
157
+ * Parameters for {@link transformSolid}.
158
+ */
159
+ export type TransformSolidParams = TransformModuleParams;
160
+ /**
161
+ * Parameters for {@link transformSvelte}.
162
+ */
163
+ export type TransformSvelteParams = TransformModuleParams;
164
+ /**
165
+ * Appends a source map to a module's code as an inline `sourceMappingURL` comment, which is how a bundler that
166
+ * reads a loaded file's own source map takes it.
167
+ *
168
+ * @param module - The module.
169
+ * @returns The code, with the source map inlined when there is one.
170
+ */
171
+ export declare function appendInlineSourceMap(module: TransformedModule): string;
172
+ /**
173
+ * Builds the JavaScript module a CSS module's import resolves to: its scoped class names, by their original ones, as
174
+ * the default export.
175
+ *
176
+ * @param moduleExports - The scoped class names.
177
+ * @returns The module's code.
178
+ */
179
+ export declare function getCssModuleCode(moduleExports: Readonly<Record<string, string>>): string;
180
+ /**
181
+ * Builds the JavaScript module a `.wasm` import resolves to: the WebAssembly module's bytes as a `Uint8Array`
182
+ * default export, inlined as base64, because an Obsidian release ships `main.js` and nothing beside it.
183
+ *
184
+ * @param bytes - The WebAssembly module's bytes.
185
+ * @returns The module's code.
186
+ */
187
+ export declare function getWasmModuleCode(bytes: Uint8Array): string;
188
+ /**
189
+ * Loads the PostCSS plugins a stylesheet goes through, without the CSS-module scoping: the project's PostCSS
190
+ * configuration when `postcss` is on, and Tailwind ahead of it when `tailwind` is on and the configuration does not
191
+ * already run it.
192
+ *
193
+ * @param params - The {@link LoadPostcssConfigParams}.
194
+ * @returns A {@link Promise} that resolves to the {@link PostcssConfig}; its `plugins` is empty when neither applies.
195
+ * @throws If `postcss` is on and the project has no PostCSS configuration.
196
+ */
197
+ export declare function loadPostcssConfig(params: LoadPostcssConfigParams): Promise<PostcssConfig>;
198
+ /**
199
+ * Runs a stylesheet through the pipeline its options ask for: the project's PostCSS configuration, Tailwind, and the
200
+ * CSS-module scoping of a `*.module.css` file.
201
+ *
202
+ * @param params - The {@link TransformCssParams}.
203
+ * @returns A {@link Promise} that resolves to the {@link TransformedCss}.
204
+ * @throws If `postcss` is on and the project has no PostCSS configuration.
205
+ */
206
+ export declare function transformCss(params: TransformCssParams): Promise<TransformedCss>;
207
+ /**
208
+ * Compiles a React or Preact JSX or TSX module with the automatic JSX runtime, for a bundler that does not take the
209
+ * runtime from the project's tsconfig (parcel does not follow its `extends`).
210
+ *
211
+ * @param params - The {@link TransformJsxParams}.
212
+ * @returns A {@link Promise} that resolves to the compiled module.
213
+ */
214
+ export declare function transformJsx(params: TransformJsxParams): Promise<TransformedModule>;
215
+ /**
216
+ * Compiles a Solid JSX or TSX module: esbuild strips the TypeScript and keeps the JSX, then `babel-preset-solid`
217
+ * compiles the JSX into DOM expressions.
218
+ *
219
+ * @param params - The {@link TransformModuleParams}.
220
+ * @returns A {@link Promise} that resolves to the compiled module.
221
+ * @throws If Babel produced no code.
222
+ */
223
+ export declare function transformSolid(params: TransformSolidParams): Promise<TransformedModule>;
224
+ /**
225
+ * Compiles a Svelte component (`.svelte`), with its styles injected by the component itself, or a Svelte module
226
+ * (`.svelte.ts`, `.svelte.js`), whose TypeScript esbuild strips first.
227
+ *
228
+ * @param params - The {@link TransformModuleParams}.
229
+ * @returns A {@link Promise} that resolves to the compiled module.
230
+ */
231
+ export declare function transformSvelte(params: TransformSvelteParams): Promise<TransformedModule>;
@@ -0,0 +1,194 @@
1
+ /*
2
+ THIS IS A GENERATED/BUNDLED FILE BY ESBUILD
3
+ if you want to view the source, please visit the github repository of this plugin
4
+ */
5
+ (function () {
6
+ function ensureBrowserProcess() {
7
+ const browserProcess = {
8
+ browser: true,
9
+ cwd() {
10
+ return "/";
11
+ },
12
+ env: {},
13
+ platform: "android"
14
+ };
15
+ const existingProcess = globalThis.process;
16
+ if (!existingProcess) {
17
+ globalThis.process = browserProcess;
18
+ return;
19
+ }
20
+ if (existingProcess.versions?.node) {
21
+ return;
22
+ }
23
+ const existingProcessRecord = existingProcess;
24
+ for (const [key, value] of Object.entries(browserProcess)) {
25
+ existingProcessRecord[key] ??= value;
26
+ }
27
+ existingProcessRecord["browser"] = true;
28
+ }
29
+
30
+ ensureBrowserProcess();
31
+ })();
32
+
33
+ import { extractDefaultExportInterop } from "@mnaoumov/typescript-lib/object-utils";
34
+ import { ensureNonNullable } from "@mnaoumov/typescript-lib/type-guards";
35
+ import { transform as esbuildTransform } from "esbuild";
36
+ import process from "node:process";
37
+ import postcss from "postcss";
38
+ import postcssLoadConfig_ from "postcss-load-config";
39
+ import postcssModules_ from "postcss-modules";
40
+ import {
41
+ importOptionalPeer,
42
+ isCssModuleFile
43
+ } from "./obsidian-plugin-features.mjs";
44
+ const postcssLoadConfig = extractDefaultExportInterop(postcssLoadConfig_);
45
+ const postcssModules = extractDefaultExportInterop(postcssModules_);
46
+ const SVELTE_MODULE_PATTERN = /\.svelte\.[cm]?[jt]s$/iu;
47
+ const TYPESCRIPT_MODULE_PATTERN = /\.[cm]?ts$/iu;
48
+ const TAILWIND_POSTCSS_PLUGIN_NAME = "@tailwindcss/postcss";
49
+ function appendInlineSourceMap(module) {
50
+ if (!module.map) {
51
+ return module.code;
52
+ }
53
+ const base64 = Buffer.from(JSON.stringify(module.map), "utf-8").toString("base64");
54
+ return `${module.code}
55
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,${base64}
56
+ `;
57
+ }
58
+ function getCssModuleCode(moduleExports) {
59
+ return `export default ${JSON.stringify(moduleExports)};
60
+ `;
61
+ }
62
+ function getWasmModuleCode(bytes) {
63
+ const base64 = Buffer.from(bytes).toString("base64");
64
+ return `const binary = atob(${JSON.stringify(base64)});
65
+ const bytes = new Uint8Array(binary.length);
66
+ for (let i = 0; i < binary.length; i++) {
67
+ bytes[i] = binary.charCodeAt(i);
68
+ }
69
+ export default bytes;
70
+ `;
71
+ }
72
+ async function loadPostcssConfig(params) {
73
+ const { isProductionBuild, projectFolder, styles } = params;
74
+ const plugins = [];
75
+ const dependencies = [];
76
+ let options = {};
77
+ if (styles.postcss) {
78
+ let config;
79
+ try {
80
+ config = await postcssLoadConfig({ cwd: projectFolder ?? process.cwd(), env: isProductionBuild ? "production" : "development" }, projectFolder);
81
+ } catch (error) {
82
+ throw new Error("The `styles.postcss` build option needs a PostCSS configuration (`postcss.config.mjs`, `.postcssrc.json`, ...) in the project.", {
83
+ cause: error
84
+ });
85
+ }
86
+ plugins.push(...config.plugins);
87
+ options = config.options;
88
+ dependencies.push(config.file);
89
+ }
90
+ if (styles.tailwind && plugins.every((plugin) => !isTailwindPlugin(plugin))) {
91
+ const { default: tailwind } = await importOptionalPeer({
92
+ feature: "styles.tailwind",
93
+ packageName: TAILWIND_POSTCSS_PLUGIN_NAME,
94
+ ...projectFolder !== void 0 && { projectFolder }
95
+ });
96
+ plugins.unshift(tailwind({ ...projectFolder !== void 0 && { base: projectFolder }, optimize: isProductionBuild }));
97
+ }
98
+ return { dependencies, options, plugins };
99
+ }
100
+ async function transformCss(params) {
101
+ const { filePath, isCssModuleScoped, source, styles } = params;
102
+ const postcssConfig = await loadPostcssConfig(params);
103
+ const plugins = [...postcssConfig.plugins];
104
+ const dependencies = [...postcssConfig.dependencies];
105
+ let moduleExports;
106
+ if (styles.cssModules && isCssModuleScoped && isCssModuleFile(filePath)) {
107
+ plugins.push(postcssModules({
108
+ getJSON(_cssFileName, json) {
109
+ moduleExports = json;
110
+ }
111
+ }));
112
+ }
113
+ if (plugins.length === 0) {
114
+ return { css: source, dependencies, moduleExports };
115
+ }
116
+ const result = await postcss(plugins).process(source, { ...postcssConfig.options, from: filePath, map: false });
117
+ for (const message of result.messages) {
118
+ if (message.type === "dependency" && message.file !== void 0) {
119
+ dependencies.push(message.file);
120
+ }
121
+ }
122
+ return { css: result.css, dependencies, moduleExports };
123
+ }
124
+ async function transformJsx(params) {
125
+ const { code, filePath, jsxImportSource } = params;
126
+ const result = await esbuildTransform(code, {
127
+ jsx: "automatic",
128
+ jsxImportSource,
129
+ loader: /\.tsx$/iu.test(filePath) ? "tsx" : "jsx",
130
+ sourcefile: filePath,
131
+ sourcemap: "external"
132
+ });
133
+ return { code: result.code, map: JSON.parse(result.map) };
134
+ }
135
+ async function transformSolid(params) {
136
+ const { code, filePath } = params;
137
+ const feature = "framework: 'solid'";
138
+ const projectFolderOption = params.projectFolder === void 0 ? {} : { projectFolder: params.projectFolder };
139
+ const babel = extractDefaultExportInterop(await importOptionalPeer({ feature, packageName: "@babel/core", ...projectFolderOption }));
140
+ const solidPreset = extractDefaultExportInterop(await importOptionalPeer({ feature, packageName: "babel-preset-solid", ...projectFolderOption }));
141
+ const stripped = await esbuildTransform(code, {
142
+ jsx: "preserve",
143
+ loader: /\.tsx$/iu.test(filePath) ? "tsx" : "jsx",
144
+ sourcefile: filePath,
145
+ sourcemap: "external"
146
+ });
147
+ const result = await babel.transformAsync(stripped.code, {
148
+ babelrc: false,
149
+ configFile: false,
150
+ filename: filePath,
151
+ inputSourceMap: JSON.parse(stripped.map),
152
+ presets: [[solidPreset, { generate: "dom", hydratable: false }]],
153
+ sourceMaps: true
154
+ });
155
+ if (!result?.code) {
156
+ throw new Error(`Babel produced no code for ${filePath}`);
157
+ }
158
+ return { code: result.code, map: ensureNonNullable(result.map, `Babel produced no source map for ${filePath}`) };
159
+ }
160
+ async function transformSvelte(params) {
161
+ const { code, filePath, isProductionBuild } = params;
162
+ const compiler = extractDefaultExportInterop(
163
+ await importOptionalPeer({
164
+ feature: "framework: 'svelte'",
165
+ packageName: "svelte",
166
+ specifier: "svelte/compiler",
167
+ ...params.projectFolder !== void 0 && { projectFolder: params.projectFolder }
168
+ })
169
+ );
170
+ const moduleOptions = { dev: !isProductionBuild, filename: filePath, generate: "client" };
171
+ if (SVELTE_MODULE_PATTERN.test(filePath)) {
172
+ let javaScript = code;
173
+ if (TYPESCRIPT_MODULE_PATTERN.test(filePath)) {
174
+ const stripped = await esbuildTransform(code, { loader: "ts", sourcefile: filePath });
175
+ javaScript = stripped.code;
176
+ }
177
+ return compiler.compileModule(javaScript, moduleOptions).js;
178
+ }
179
+ return compiler.compile(code, { ...moduleOptions, css: "injected" }).js;
180
+ }
181
+ function isTailwindPlugin(plugin) {
182
+ return typeof plugin === "object" && "postcssPlugin" in plugin && plugin.postcssPlugin === TAILWIND_POSTCSS_PLUGIN_NAME;
183
+ }
184
+ export {
185
+ appendInlineSourceMap,
186
+ getCssModuleCode,
187
+ getWasmModuleCode,
188
+ loadPostcssConfig,
189
+ transformCss,
190
+ transformJsx,
191
+ transformSolid,
192
+ transformSvelte
193
+ };
194
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9idW5kbGVycy9vYnNpZGlhbi1wbHVnaW4tdHJhbnNmb3Jtcy50cyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBmaWxlXG4gKlxuICogVGhlIHNvdXJjZSB0cmFuc2Zvcm1zIGV2ZXJ5IGJ1bmRsZXIgYWRhcHRlciBzaGFyZXMsIHNvIGEgZmVhdHVyZSBjb21waWxlcyB0aGUgc2FtZSB3YXkgd2hpY2hldmVyIGJ1bmRsZXIgcnVucyBpdDpcbiAqIFNvbGlkJ3MgSlNYLCBTdmVsdGUgY29tcG9uZW50cyBhbmQgbW9kdWxlcywgc3R5bGVzaGVldHMgdGhyb3VnaCBQb3N0Q1NTLCBUYWlsd2luZCBhbmQgQ1NTIG1vZHVsZXMsIGFuZCBXZWJBc3NlbWJseVxuICogbW9kdWxlcyBhcyBieXRlcy4gVGhlIGVzYnVpbGQsIHJvbGx1cCBhbmQgdml0ZSBhZGFwdGVycyBjYWxsIHRoZW0gaW4tcHJvY2VzczsgdGhlIHdlYnBhY2sgYWRhcHRlciB0aHJvdWdoIHRoZVxuICogbG9hZGVyIGl0IHNoaXBzLCBhbmQgdGhlIHBhcmNlbCBhZGFwdGVyIHRocm91Z2ggdGhlIHRyYW5zZm9ybWVycyBpdCBnZW5lcmF0ZXMuXG4gKlxuICogRXJhc2FibGUgVHlwZVNjcmlwdCBvbmx5IChubyBlbnVtcywgbm8gcGFyYW1ldGVyIHByb3BlcnRpZXMpLCBzbyBhIHdlYnBhY2sgbG9hZGVyIG9yIGEgcGFyY2VsIHdvcmtlciBjYW4gbG9hZCB0aGlzXG4gKiBtb2R1bGUgc3RyYWlnaHQgZnJvbSBzb3VyY2Ugd2hlbiB0aGUgdG9vbGtpdCBydW5zIGZyb20gc291cmNlLlxuICovXG5cbmltcG9ydCB0eXBlIHsgVHJhbnNmb3JtT3B0aW9ucyBhcyBCYWJlbFRyYW5zZm9ybU9wdGlvbnMgfSBmcm9tICdAYmFiZWwvY29yZSc7XG5pbXBvcnQgdHlwZSB7XG4gIEFjY2VwdGVkUGx1Z2luLFxuICBQcm9jZXNzT3B0aW9uc1xufSBmcm9tICdwb3N0Y3NzJztcblxuaW1wb3J0IHsgZXh0cmFjdERlZmF1bHRFeHBvcnRJbnRlcm9wIH0gZnJvbSAnQG1uYW91bW92L3R5cGVzY3JpcHQtbGliL29iamVjdC11dGlscyc7XG5pbXBvcnQgeyBlbnN1cmVOb25OdWxsYWJsZSB9IGZyb20gJ0BtbmFvdW1vdi90eXBlc2NyaXB0LWxpYi90eXBlLWd1YXJkcyc7XG5pbXBvcnQgeyB0cmFuc2Zvcm0gYXMgZXNidWlsZFRyYW5zZm9ybSB9IGZyb20gJ2VzYnVpbGQnO1xuaW1wb3J0IHByb2Nlc3MgZnJvbSAnbm9kZTpwcm9jZXNzJztcbmltcG9ydCBwb3N0Y3NzIGZyb20gJ3Bvc3Rjc3MnO1xuaW1wb3J0IHBvc3Rjc3NMb2FkQ29uZmlnXyBmcm9tICdwb3N0Y3NzLWxvYWQtY29uZmlnJztcbmltcG9ydCBwb3N0Y3NzTW9kdWxlc18gZnJvbSAncG9zdGNzcy1tb2R1bGVzJztcblxuaW1wb3J0IHR5cGUgeyBPYnNpZGlhblBsdWdpblN0eWxlc09wdGlvbnMgfSBmcm9tICcuL29ic2lkaWFuLXBsdWdpbi1mZWF0dXJlcy50cyc7XG5cbmltcG9ydCB7XG4gIGltcG9ydE9wdGlvbmFsUGVlcixcbiAgaXNDc3NNb2R1bGVGaWxlXG59IGZyb20gJy4vb2JzaWRpYW4tcGx1Z2luLWZlYXR1cmVzLnRzJztcblxuY29uc3QgcG9zdGNzc0xvYWRDb25maWcgPSBleHRyYWN0RGVmYXVsdEV4cG9ydEludGVyb3AocG9zdGNzc0xvYWRDb25maWdfKTtcbmNvbnN0IHBvc3Rjc3NNb2R1bGVzID0gZXh0cmFjdERlZmF1bHRFeHBvcnRJbnRlcm9wKHBvc3Rjc3NNb2R1bGVzXyk7XG5cbi8qKlxuICogUGFyYW1ldGVycyBmb3Ige0BsaW5rIGxvYWRQb3N0Y3NzQ29uZmlnfS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBMb2FkUG9zdGNzc0NvbmZpZ1BhcmFtcyB7XG4gIC8qKlxuICAgKiBXaGV0aGVyIHRoaXMgaXMgYSBwcm9kdWN0aW9uIGJ1aWxkLlxuICAgKi9cbiAgcmVhZG9ubHkgaXNQcm9kdWN0aW9uQnVpbGQ6IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFRoZSBmb2xkZXIgdGhlIHByb2plY3QncyBQb3N0Q1NTIGNvbmZpZ3VyYXRpb24gYW5kIHBhY2thZ2VzIGFyZSBmb3VuZCBmcm9tLiBEZWZhdWx0cyB0byB0aGUgcHJvamVjdCByb290LlxuICAgKi9cbiAgcmVhZG9ubHkgcHJvamVjdEZvbGRlcj86IHN0cmluZyB8IHVuZGVmaW5lZDtcblxuICAvKipcbiAgICogVGhlIHN0eWxlc2hlZXQgb3B0aW9ucy5cbiAgICovXG4gIHJlYWRvbmx5IHN0eWxlczogT2JzaWRpYW5QbHVnaW5TdHlsZXNPcHRpb25zO1xufVxuXG4vKipcbiAqIFdoYXQge0BsaW5rIGxvYWRQb3N0Y3NzQ29uZmlnfSBsb2FkZWQuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUG9zdGNzc0NvbmZpZyB7XG4gIC8qKlxuICAgKiBUaGUgZmlsZXMgdGhlIGNvbmZpZ3VyYXRpb24gY2FtZSBmcm9tLCBmb3IgYSB3YXRjaCBidWlsZCB0byB3YXRjaC5cbiAgICovXG4gIHJlYWRvbmx5IGRlcGVuZGVuY2llczogcmVhZG9ubHkgc3RyaW5nW107XG5cbiAgLyoqXG4gICAqIFRoZSBwcm9jZXNzIG9wdGlvbnMgb2YgdGhlIHByb2plY3QncyBjb25maWd1cmF0aW9uIChhIGN1c3RvbSBwYXJzZXIgb3Igc3ludGF4LCBzYXkpLlxuICAgKi9cbiAgcmVhZG9ubHkgb3B0aW9uczogUHJvY2Vzc09wdGlvbnM7XG5cbiAgLyoqXG4gICAqIFRoZSBwbHVnaW5zLCBpbiB0aGUgb3JkZXIgdGhleSBydW4uXG4gICAqL1xuICByZWFkb25seSBwbHVnaW5zOiByZWFkb25seSBBY2NlcHRlZFBsdWdpbltdO1xufVxuXG4vKipcbiAqIEEgc291cmNlIG1hcCwgYXMgdGhlIHRyYW5zZm9ybXMgaGFuZCBpdCBvdmVyOiB0aGUgZGVjb2RlZCBKU09OIG9mIGEgdmVyc2lvbiAzIHNvdXJjZSBtYXAuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU291cmNlTWFwTGlrZSB7XG4gIC8qKlxuICAgKiBUaGUgZW5jb2RlZCBtYXBwaW5ncy5cbiAgICovXG4gIHJlYWRvbmx5IG1hcHBpbmdzOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBvcmlnaW5hbCBzb3VyY2VzLlxuICAgKi9cbiAgcmVhZG9ubHkgc291cmNlczogcmVhZG9ubHkgc3RyaW5nW107XG5cbiAgLyoqXG4gICAqIFRoZSBzb3VyY2UgbWFwIHZlcnNpb24uXG4gICAqL1xuICByZWFkb25seSB2ZXJzaW9uOiBudW1iZXI7XG59XG5cbi8qKlxuICogUGFyYW1ldGVycyBmb3Ige0BsaW5rIHRyYW5zZm9ybUNzc30uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVHJhbnNmb3JtQ3NzUGFyYW1zIHtcbiAgLyoqXG4gICAqIFRoZSBzdHlsZXNoZWV0J3MgcGF0aC5cbiAgICovXG4gIHJlYWRvbmx5IGZpbGVQYXRoOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgYCoubW9kdWxlLmNzc2AgZmlsZXMgYXJlIHNjb3BlZCBoZXJlLiBBIGJ1bmRsZXIgdGhhdCBzY29wZXMgQ1NTIG1vZHVsZXMgaXRzZWxmIHBhc3NlcyBgZmFsc2VgLlxuICAgKi9cbiAgcmVhZG9ubHkgaXNDc3NNb2R1bGVTY29wZWQ6IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdGhpcyBpcyBhIHByb2R1Y3Rpb24gYnVpbGQuXG4gICAqL1xuICByZWFkb25seSBpc1Byb2R1Y3Rpb25CdWlsZDogYm9vbGVhbjtcblxuICAvKipcbiAgICogVGhlIGZvbGRlciB0aGUgcHJvamVjdCdzIFBvc3RDU1MgY29uZmlndXJhdGlvbiBhbmQgcGFja2FnZXMgYXJlIGZvdW5kIGZyb20uIERlZmF1bHRzIHRvIHRoZSBwcm9qZWN0IHJvb3QuXG4gICAqL1xuICByZWFkb25seSBwcm9qZWN0Rm9sZGVyPzogc3RyaW5nIHwgdW5kZWZpbmVkO1xuXG4gIC8qKlxuICAgKiBUaGUgc3R5bGVzaGVldCdzIGNvbnRlbnRzLlxuICAgKi9cbiAgcmVhZG9ubHkgc291cmNlOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBzdHlsZXNoZWV0IG9wdGlvbnMuXG4gICAqL1xuICByZWFkb25seSBzdHlsZXM6IE9ic2lkaWFuUGx1Z2luU3R5bGVzT3B0aW9ucztcbn1cblxuLyoqXG4gKiBUaGUgQ1NTIHtAbGluayB0cmFuc2Zvcm1Dc3N9IHByb2R1Y2VkLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFRyYW5zZm9ybWVkQ3NzIHtcbiAgLyoqXG4gICAqIFRoZSBzdHlsZXNoZWV0LlxuICAgKi9cbiAgcmVhZG9ubHkgY3NzOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBmaWxlcyBiZXNpZGVzIHRoZSBzdHlsZXNoZWV0IHRoYXQgdGhlIHJlc3VsdCBkZXBlbmRzIG9uLCBmb3IgYSB3YXRjaCBidWlsZCB0byB3YXRjaDogYSBQb3N0Q1NTIGNvbmZpZ3VyYXRpb24sXG4gICAqIG9yIGEgc3R5bGVzaGVldCBhIHBsdWdpbiBpbmxpbmVkLlxuICAgKi9cbiAgcmVhZG9ubHkgZGVwZW5kZW5jaWVzOiByZWFkb25seSBzdHJpbmdbXTtcblxuICAvKipcbiAgICogVGhlIHNjb3BlZCBjbGFzcyBuYW1lcyBieSB0aGVpciBvcmlnaW5hbCBvbmVzLCBmb3IgYSBDU1MgbW9kdWxlOyBgdW5kZWZpbmVkYCBmb3IgYW4gb3JkaW5hcnkgc3R5bGVzaGVldC5cbiAgICovXG4gIHJlYWRvbmx5IG1vZHVsZUV4cG9ydHM6IFJlYWRvbmx5PFJlY29yZDxzdHJpbmcsIHN0cmluZz4+IHwgdW5kZWZpbmVkO1xufVxuXG4vKipcbiAqIEEgSmF2YVNjcmlwdCBtb2R1bGUgYSB0cmFuc2Zvcm0gcHJvZHVjZWQuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVHJhbnNmb3JtZWRNb2R1bGUge1xuICAvKipcbiAgICogVGhlIEphdmFTY3JpcHQgY29kZS5cbiAgICovXG4gIHJlYWRvbmx5IGNvZGU6IHN0cmluZztcblxuICAvKipcbiAgICogSXRzIHNvdXJjZSBtYXAsIG9yIGB1bmRlZmluZWRgIHdoZW4gdGhlcmUgaXMgbm9uZS5cbiAgICovXG4gIHJlYWRvbmx5IG1hcDogU291cmNlTWFwTGlrZSB8IHVuZGVmaW5lZDtcbn1cblxuLyoqXG4gKiBQYXJhbWV0ZXJzIGZvciB7QGxpbmsgdHJhbnNmb3JtSnN4fS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBUcmFuc2Zvcm1Kc3hQYXJhbXMgZXh0ZW5kcyBUcmFuc2Zvcm1Nb2R1bGVQYXJhbXMge1xuICAvKipcbiAgICogVGhlIHBhY2thZ2UgdGhhdCBzdXBwbGllcyB0aGUgYXV0b21hdGljIEpTWCBydW50aW1lOiBgcmVhY3RgIG9yIGBwcmVhY3RgLlxuICAgKi9cbiAgcmVhZG9ubHkganN4SW1wb3J0U291cmNlOiBzdHJpbmc7XG59XG5cbi8qKlxuICogUGFyYW1ldGVycyBvZiBhIHRyYW5zZm9ybSB0aGF0IGNvbXBpbGVzIG9uZSBtb2R1bGUuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVHJhbnNmb3JtTW9kdWxlUGFyYW1zIHtcbiAgLyoqXG4gICAqIFRoZSBzb3VyY2UgY29kZS5cbiAgICovXG4gIHJlYWRvbmx5IGNvZGU6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIHNvdXJjZSBmaWxlJ3MgcGF0aC5cbiAgICovXG4gIHJlYWRvbmx5IGZpbGVQYXRoOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdGhpcyBpcyBhIHByb2R1Y3Rpb24gYnVpbGQuXG4gICAqL1xuICByZWFkb25seSBpc1Byb2R1Y3Rpb25CdWlsZDogYm9vbGVhbjtcblxuICAvKipcbiAgICogVGhlIGZvbGRlciB0aGUgZnJhbWV3b3JrJ3MgcGFja2FnZXMgYXJlIHJlc29sdmVkIGZyb20uIERlZmF1bHRzIHRvIHRoZSBwcm9qZWN0IHJvb3QuXG4gICAqL1xuICByZWFkb25seSBwcm9qZWN0Rm9sZGVyPzogc3RyaW5nO1xufVxuXG4vKipcbiAqIFBhcmFtZXRlcnMgZm9yIHtAbGluayB0cmFuc2Zvcm1Tb2xpZH0uXG4gKi9cbmV4cG9ydCB0eXBlIFRyYW5zZm9ybVNvbGlkUGFyYW1zID0gVHJhbnNmb3JtTW9kdWxlUGFyYW1zO1xuXG4vKipcbiAqIFBhcmFtZXRlcnMgZm9yIHtAbGluayB0cmFuc2Zvcm1TdmVsdGV9LlxuICovXG5leHBvcnQgdHlwZSBUcmFuc2Zvcm1TdmVsdGVQYXJhbXMgPSBUcmFuc2Zvcm1Nb2R1bGVQYXJhbXM7XG5cbmludGVyZmFjZSBCYWJlbENvcmVMaWtlIHtcbiAgdHJhbnNmb3JtQXN5bmM6IChjb2RlOiBzdHJpbmcsIG9wdGlvbnM6IEJhYmVsVHJhbnNmb3JtT3B0aW9ucykgPT4gUHJvbWlzZTxCYWJlbFJlc3VsdExpa2UgfCBudWxsPjtcbn1cblxuaW50ZXJmYWNlIEJhYmVsUmVzdWx0TGlrZSB7XG4gIHJlYWRvbmx5IGNvZGU/OiBudWxsIHwgc3RyaW5nO1xuICByZWFkb25seSBtYXA/OiBudWxsIHwgU291cmNlTWFwTGlrZTtcbn1cblxuaW50ZXJmYWNlIFBvc3Rjc3NEZXBlbmRlbmN5TWVzc2FnZSB7XG4gIHJlYWRvbmx5IGZpbGU/OiBzdHJpbmc7XG4gIHJlYWRvbmx5IHR5cGU6IHN0cmluZztcbn1cblxuaW50ZXJmYWNlIFN2ZWx0ZUNvbXBpbGVPcHRpb25zTGlrZSBleHRlbmRzIFN2ZWx0ZU1vZHVsZUNvbXBpbGVPcHRpb25zTGlrZSB7XG4gIHJlYWRvbmx5IGNzczogJ2luamVjdGVkJztcbn1cblxuaW50ZXJmYWNlIFN2ZWx0ZUNvbXBpbGVSZXN1bHRMaWtlIHtcbiAgcmVhZG9ubHkganM6IFRyYW5zZm9ybWVkTW9kdWxlO1xufVxuXG5pbnRlcmZhY2UgU3ZlbHRlQ29tcGlsZXJMaWtlIHtcbiAgY29tcGlsZTogKHNvdXJjZTogc3RyaW5nLCBvcHRpb25zOiBTdmVsdGVDb21waWxlT3B0aW9uc0xpa2UpID0+IFN2ZWx0ZUNvbXBpbGVSZXN1bHRMaWtlO1xuICBjb21waWxlTW9kdWxlOiAoc291cmNlOiBzdHJpbmcsIG9wdGlvbnM6IFN2ZWx0ZU1vZHVsZUNvbXBpbGVPcHRpb25zTGlrZSkgPT4gU3ZlbHRlQ29tcGlsZVJlc3VsdExpa2U7XG59XG5cbmludGVyZmFjZSBTdmVsdGVNb2R1bGVDb21waWxlT3B0aW9uc0xpa2Uge1xuICByZWFkb25seSBkZXY6IGJvb2xlYW47XG4gIHJlYWRvbmx5IGZpbGVuYW1lOiBzdHJpbmc7XG4gIHJlYWRvbmx5IGdlbmVyYXRlOiAnY2xpZW50Jztcbn1cblxuaW50ZXJmYWNlIFRhaWx3aW5kUG9zdGNzc01vZHVsZSB7XG4gIHJlYWRvbmx5IGRlZmF1bHQ6IChvcHRpb25zPzogVGFpbHdpbmRQb3N0Y3NzT3B0aW9ucykgPT4gQWNjZXB0ZWRQbHVnaW47XG59XG5cbmludGVyZmFjZSBUYWlsd2luZFBvc3Rjc3NPcHRpb25zIHtcbiAgcmVhZG9ubHkgYmFzZT86IHN0cmluZztcbiAgcmVhZG9ubHkgb3B0aW1pemU/OiBib29sZWFuO1xufVxuXG5jb25zdCBTVkVMVEVfTU9EVUxFX1BBVFRFUk4gPSAvXFwuc3ZlbHRlXFwuW2NtXT9banRdcyQvaXU7XG5jb25zdCBUWVBFU0NSSVBUX01PRFVMRV9QQVRURVJOID0gL1xcLltjbV0/dHMkL2l1O1xuY29uc3QgVEFJTFdJTkRfUE9TVENTU19QTFVHSU5fTkFNRSA9ICdAdGFpbHdpbmRjc3MvcG9zdGNzcyc7XG5cbi8qKlxuICogQXBwZW5kcyBhIHNvdXJjZSBtYXAgdG8gYSBtb2R1bGUncyBjb2RlIGFzIGFuIGlubGluZSBgc291cmNlTWFwcGluZ1VSTGAgY29tbWVudCwgd2hpY2ggaXMgaG93IGEgYnVuZGxlciB0aGF0XG4gKiByZWFkcyBhIGxvYWRlZCBmaWxlJ3Mgb3duIHNvdXJjZSBtYXAgdGFrZXMgaXQuXG4gKlxuICogQHBhcmFtIG1vZHVsZSAtIFRoZSBtb2R1bGUuXG4gKiBAcmV0dXJucyBUaGUgY29kZSwgd2l0aCB0aGUgc291cmNlIG1hcCBpbmxpbmVkIHdoZW4gdGhlcmUgaXMgb25lLlxuICovXG5leHBvcnQgZnVuY3Rpb24gYXBwZW5kSW5saW5lU291cmNlTWFwKG1vZHVsZTogVHJhbnNmb3JtZWRNb2R1bGUpOiBzdHJpbmcge1xuICBpZiAoIW1vZHVsZS5tYXApIHtcbiAgICByZXR1cm4gbW9kdWxlLmNvZGU7XG4gIH1cbiAgY29uc3QgYmFzZTY0ID0gQnVmZmVyLmZyb20oSlNPTi5zdHJpbmdpZnkobW9kdWxlLm1hcCksICd1dGYtOCcpLnRvU3RyaW5nKCdiYXNlNjQnKTtcbiAgcmV0dXJuIGAke21vZHVsZS5jb2RlfVxcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWRhdGE6YXBwbGljYXRpb24vanNvbjtjaGFyc2V0PXV0Zi04O2Jhc2U2NCwke2Jhc2U2NH1cXG5gO1xufVxuXG4vKipcbiAqIEJ1aWxkcyB0aGUgSmF2YVNjcmlwdCBtb2R1bGUgYSBDU1MgbW9kdWxlJ3MgaW1wb3J0IHJlc29sdmVzIHRvOiBpdHMgc2NvcGVkIGNsYXNzIG5hbWVzLCBieSB0aGVpciBvcmlnaW5hbCBvbmVzLCBhc1xuICogdGhlIGRlZmF1bHQgZXhwb3J0LlxuICpcbiAqIEBwYXJhbSBtb2R1bGVFeHBvcnRzIC0gVGhlIHNjb3BlZCBjbGFzcyBuYW1lcy5cbiAqIEByZXR1cm5zIFRoZSBtb2R1bGUncyBjb2RlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0Q3NzTW9kdWxlQ29kZShtb2R1bGVFeHBvcnRzOiBSZWFkb25seTxSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+Pik6IHN0cmluZyB7XG4gIHJldHVybiBgZXhwb3J0IGRlZmF1bHQgJHtKU09OLnN0cmluZ2lmeShtb2R1bGVFeHBvcnRzKX07XFxuYDtcbn1cblxuLyoqXG4gKiBCdWlsZHMgdGhlIEphdmFTY3JpcHQgbW9kdWxlIGEgYC53YXNtYCBpbXBvcnQgcmVzb2x2ZXMgdG86IHRoZSBXZWJBc3NlbWJseSBtb2R1bGUncyBieXRlcyBhcyBhIGBVaW50OEFycmF5YFxuICogZGVmYXVsdCBleHBvcnQsIGlubGluZWQgYXMgYmFzZTY0LCBiZWNhdXNlIGFuIE9ic2lkaWFuIHJlbGVhc2Ugc2hpcHMgYG1haW4uanNgIGFuZCBub3RoaW5nIGJlc2lkZSBpdC5cbiAqXG4gKiBAcGFyYW0gYnl0ZXMgLSBUaGUgV2ViQXNzZW1ibHkgbW9kdWxlJ3MgYnl0ZXMuXG4gKiBAcmV0dXJucyBUaGUgbW9kdWxlJ3MgY29kZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldFdhc21Nb2R1bGVDb2RlKGJ5dGVzOiBVaW50OEFycmF5KTogc3RyaW5nIHtcbiAgY29uc3QgYmFzZTY0ID0gQnVmZmVyLmZyb20oYnl0ZXMpLnRvU3RyaW5nKCdiYXNlNjQnKTtcbiAgcmV0dXJuIGBjb25zdCBiaW5hcnkgPSBhdG9iKCR7SlNPTi5zdHJpbmdpZnkoYmFzZTY0KX0pO1xuY29uc3QgYnl0ZXMgPSBuZXcgVWludDhBcnJheShiaW5hcnkubGVuZ3RoKTtcbmZvciAobGV0IGkgPSAwOyBpIDwgYmluYXJ5Lmxlbmd0aDsgaSsrKSB7XG4gIGJ5dGVzW2ldID0gYmluYXJ5LmNoYXJDb2RlQXQoaSk7XG59XG5leHBvcnQgZGVmYXVsdCBieXRlcztcbmA7XG59XG5cbi8qKlxuICogTG9hZHMgdGhlIFBvc3RDU1MgcGx1Z2lucyBhIHN0eWxlc2hlZXQgZ29lcyB0aHJvdWdoLCB3aXRob3V0IHRoZSBDU1MtbW9kdWxlIHNjb3Bpbmc6IHRoZSBwcm9qZWN0J3MgUG9zdENTU1xuICogY29uZmlndXJhdGlvbiB3aGVuIGBwb3N0Y3NzYCBpcyBvbiwgYW5kIFRhaWx3aW5kIGFoZWFkIG9mIGl0IHdoZW4gYHRhaWx3aW5kYCBpcyBvbiBhbmQgdGhlIGNvbmZpZ3VyYXRpb24gZG9lcyBub3RcbiAqIGFscmVhZHkgcnVuIGl0LlxuICpcbiAqIEBwYXJhbSBwYXJhbXMgLSBUaGUge0BsaW5rIExvYWRQb3N0Y3NzQ29uZmlnUGFyYW1zfS5cbiAqIEByZXR1cm5zIEEge0BsaW5rIFByb21pc2V9IHRoYXQgcmVzb2x2ZXMgdG8gdGhlIHtAbGluayBQb3N0Y3NzQ29uZmlnfTsgaXRzIGBwbHVnaW5zYCBpcyBlbXB0eSB3aGVuIG5laXRoZXIgYXBwbGllcy5cbiAqIEB0aHJvd3MgSWYgYHBvc3Rjc3NgIGlzIG9uIGFuZCB0aGUgcHJvamVjdCBoYXMgbm8gUG9zdENTUyBjb25maWd1cmF0aW9uLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gbG9hZFBvc3Rjc3NDb25maWcocGFyYW1zOiBMb2FkUG9zdGNzc0NvbmZpZ1BhcmFtcyk6IFByb21pc2U8UG9zdGNzc0NvbmZpZz4ge1xuICBjb25zdCB7IGlzUHJvZHVjdGlvbkJ1aWxkLCBwcm9qZWN0Rm9sZGVyLCBzdHlsZXMgfSA9IHBhcmFtcztcbiAgY29uc3QgcGx1Z2luczogQWNjZXB0ZWRQbHVnaW5bXSA9IFtdO1xuICBjb25zdCBkZXBlbmRlbmNpZXM6IHN0cmluZ1tdID0gW107XG4gIGxldCBvcHRpb25zOiBQcm9jZXNzT3B0aW9ucyA9IHt9O1xuXG4gIGlmIChzdHlsZXMucG9zdGNzcykge1xuICAgIGxldCBjb25maWc6IHBvc3Rjc3NMb2FkQ29uZmlnXy5SZXN1bHQ7XG4gICAgdHJ5IHtcbiAgICAgIGNvbmZpZyA9IGF3YWl0IHBvc3Rjc3NMb2FkQ29uZmlnKHsgY3dkOiBwcm9qZWN0Rm9sZGVyID8/IHByb2Nlc3MuY3dkKCksIGVudjogaXNQcm9kdWN0aW9uQnVpbGQgPyAncHJvZHVjdGlvbicgOiAnZGV2ZWxvcG1lbnQnIH0sIHByb2plY3RGb2xkZXIpO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1RoZSBgc3R5bGVzLnBvc3Rjc3NgIGJ1aWxkIG9wdGlvbiBuZWVkcyBhIFBvc3RDU1MgY29uZmlndXJhdGlvbiAoYHBvc3Rjc3MuY29uZmlnLm1qc2AsIGAucG9zdGNzc3JjLmpzb25gLCAuLi4pIGluIHRoZSBwcm9qZWN0LicsIHtcbiAgICAgICAgY2F1c2U6IGVycm9yXG4gICAgICB9KTtcbiAgICB9XG4gICAgcGx1Z2lucy5wdXNoKC4uLmNvbmZpZy5wbHVnaW5zIGFzIEFjY2VwdGVkUGx1Z2luW10pO1xuICAgIG9wdGlvbnMgPSBjb25maWcub3B0aW9ucztcbiAgICBkZXBlbmRlbmNpZXMucHVzaChjb25maWcuZmlsZSk7XG4gIH1cblxuICBpZiAoc3R5bGVzLnRhaWx3aW5kICYmIHBsdWdpbnMuZXZlcnkoKHBsdWdpbikgPT4gIWlzVGFpbHdpbmRQbHVnaW4ocGx1Z2luKSkpIHtcbiAgICBjb25zdCB7IGRlZmF1bHQ6IHRhaWx3aW5kIH0gPSBhd2FpdCBpbXBvcnRPcHRpb25hbFBlZXI8VGFpbHdpbmRQb3N0Y3NzTW9kdWxlPih7XG4gICAgICBmZWF0dXJlOiAnc3R5bGVzLnRhaWx3aW5kJyxcbiAgICAgIHBhY2thZ2VOYW1lOiBUQUlMV0lORF9QT1NUQ1NTX1BMVUdJTl9OQU1FLFxuICAgICAgLi4uKHByb2plY3RGb2xkZXIgIT09IHVuZGVmaW5lZCAmJiB7IHByb2plY3RGb2xkZXIgfSlcbiAgICB9KTtcbiAgICBwbHVnaW5zLnVuc2hpZnQodGFpbHdpbmQoeyAuLi4ocHJvamVjdEZvbGRlciAhPT0gdW5kZWZpbmVkICYmIHsgYmFzZTogcHJvamVjdEZvbGRlciB9KSwgb3B0aW1pemU6IGlzUHJvZHVjdGlvbkJ1aWxkIH0pKTtcbiAgfVxuXG4gIHJldHVybiB7IGRlcGVuZGVuY2llcywgb3B0aW9ucywgcGx1Z2lucyB9O1xufVxuXG4vKipcbiAqIFJ1bnMgYSBzdHlsZXNoZWV0IHRocm91Z2ggdGhlIHBpcGVsaW5lIGl0cyBvcHRpb25zIGFzayBmb3I6IHRoZSBwcm9qZWN0J3MgUG9zdENTUyBjb25maWd1cmF0aW9uLCBUYWlsd2luZCwgYW5kIHRoZVxuICogQ1NTLW1vZHVsZSBzY29waW5nIG9mIGEgYCoubW9kdWxlLmNzc2AgZmlsZS5cbiAqXG4gKiBAcGFyYW0gcGFyYW1zIC0gVGhlIHtAbGluayBUcmFuc2Zvcm1Dc3NQYXJhbXN9LlxuICogQHJldHVybnMgQSB7QGxpbmsgUHJvbWlzZX0gdGhhdCByZXNvbHZlcyB0byB0aGUge0BsaW5rIFRyYW5zZm9ybWVkQ3NzfS5cbiAqIEB0aHJvd3MgSWYgYHBvc3Rjc3NgIGlzIG9uIGFuZCB0aGUgcHJvamVjdCBoYXMgbm8gUG9zdENTUyBjb25maWd1cmF0aW9uLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gdHJhbnNmb3JtQ3NzKHBhcmFtczogVHJhbnNmb3JtQ3NzUGFyYW1zKTogUHJvbWlzZTxUcmFuc2Zvcm1lZENzcz4ge1xuICBjb25zdCB7IGZpbGVQYXRoLCBpc0Nzc01vZHVsZVNjb3BlZCwgc291cmNlLCBzdHlsZXMgfSA9IHBhcmFtcztcbiAgY29uc3QgcG9zdGNzc0NvbmZpZyA9IGF3YWl0IGxvYWRQb3N0Y3NzQ29uZmlnKHBhcmFtcyk7XG4gIGNvbnN0IHBsdWdpbnMgPSBbLi4ucG9zdGNzc0NvbmZpZy5wbHVnaW5zXTtcbiAgY29uc3QgZGVwZW5kZW5jaWVzID0gWy4uLnBvc3Rjc3NDb25maWcuZGVwZW5kZW5jaWVzXTtcblxuICBsZXQgbW9kdWxlRXhwb3J0czogUmVjb3JkPHN0cmluZywgc3RyaW5nPiB8IHVuZGVmaW5lZDtcbiAgaWYgKHN0eWxlcy5jc3NNb2R1bGVzICYmIGlzQ3NzTW9kdWxlU2NvcGVkICYmIGlzQ3NzTW9kdWxlRmlsZShmaWxlUGF0aCkpIHtcbiAgICBwbHVnaW5zLnB1c2gocG9zdGNzc01vZHVsZXMoe1xuICAgICAgZ2V0SlNPTihfY3NzRmlsZU5hbWUsIGpzb24pOiB2b2lkIHtcbiAgICAgICAgbW9kdWxlRXhwb3J0cyA9IGpzb247XG4gICAgICB9XG4gICAgfSkpO1xuICB9XG5cbiAgaWYgKHBsdWdpbnMubGVuZ3RoID09PSAwKSB7XG4gICAgcmV0dXJuIHsgY3NzOiBzb3VyY2UsIGRlcGVuZGVuY2llcywgbW9kdWxlRXhwb3J0cyB9O1xuICB9XG5cbiAgY29uc3QgcmVzdWx0ID0gYXdhaXQgcG9zdGNzcyhwbHVnaW5zKS5wcm9jZXNzKHNvdXJjZSwgeyAuLi5wb3N0Y3NzQ29uZmlnLm9wdGlvbnMsIGZyb206IGZpbGVQYXRoLCBtYXA6IGZhbHNlIH0pO1xuICBmb3IgKGNvbnN0IG1lc3NhZ2Ugb2YgcmVzdWx0Lm1lc3NhZ2VzIGFzIFBvc3Rjc3NEZXBlbmRlbmN5TWVzc2FnZVtdKSB7XG4gICAgaWYgKG1lc3NhZ2UudHlwZSA9PT0gJ2RlcGVuZGVuY3knICYmIG1lc3NhZ2UuZmlsZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBkZXBlbmRlbmNpZXMucHVzaChtZXNzYWdlLmZpbGUpO1xuICAgIH1cbiAgfVxuICByZXR1cm4geyBjc3M6IHJlc3VsdC5jc3MsIGRlcGVuZGVuY2llcywgbW9kdWxlRXhwb3J0cyB9O1xufVxuXG4vKipcbiAqIENvbXBpbGVzIGEgUmVhY3Qgb3IgUHJlYWN0IEpTWCBvciBUU1ggbW9kdWxlIHdpdGggdGhlIGF1dG9tYXRpYyBKU1ggcnVudGltZSwgZm9yIGEgYnVuZGxlciB0aGF0IGRvZXMgbm90IHRha2UgdGhlXG4gKiBydW50aW1lIGZyb20gdGhlIHByb2plY3QncyB0c2NvbmZpZyAocGFyY2VsIGRvZXMgbm90IGZvbGxvdyBpdHMgYGV4dGVuZHNgKS5cbiAqXG4gKiBAcGFyYW0gcGFyYW1zIC0gVGhlIHtAbGluayBUcmFuc2Zvcm1Kc3hQYXJhbXN9LlxuICogQHJldHVybnMgQSB7QGxpbmsgUHJvbWlzZX0gdGhhdCByZXNvbHZlcyB0byB0aGUgY29tcGlsZWQgbW9kdWxlLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gdHJhbnNmb3JtSnN4KHBhcmFtczogVHJhbnNmb3JtSnN4UGFyYW1zKTogUHJvbWlzZTxUcmFuc2Zvcm1lZE1vZHVsZT4ge1xuICBjb25zdCB7IGNvZGUsIGZpbGVQYXRoLCBqc3hJbXBvcnRTb3VyY2UgfSA9IHBhcmFtcztcbiAgY29uc3QgcmVzdWx0ID0gYXdhaXQgZXNidWlsZFRyYW5zZm9ybShjb2RlLCB7XG4gICAganN4OiAnYXV0b21hdGljJyxcbiAgICBqc3hJbXBvcnRTb3VyY2UsXG4gICAgbG9hZGVyOiAvXFwudHN4JC9pdS50ZXN0KGZpbGVQYXRoKSA/ICd0c3gnIDogJ2pzeCcsXG4gICAgc291cmNlZmlsZTogZmlsZVBhdGgsXG4gICAgc291cmNlbWFwOiAnZXh0ZXJuYWwnXG4gIH0pO1xuICByZXR1cm4geyBjb2RlOiByZXN1bHQuY29kZSwgbWFwOiBKU09OLnBhcnNlKHJlc3VsdC5tYXApIGFzIFNvdXJjZU1hcExpa2UgfTtcbn1cblxuLyoqXG4gKiBDb21waWxlcyBhIFNvbGlkIEpTWCBvciBUU1ggbW9kdWxlOiBlc2J1aWxkIHN0cmlwcyB0aGUgVHlwZVNjcmlwdCBhbmQga2VlcHMgdGhlIEpTWCwgdGhlbiBgYmFiZWwtcHJlc2V0LXNvbGlkYFxuICogY29tcGlsZXMgdGhlIEpTWCBpbnRvIERPTSBleHByZXNzaW9ucy5cbiAqXG4gKiBAcGFyYW0gcGFyYW1zIC0gVGhlIHtAbGluayBUcmFuc2Zvcm1Nb2R1bGVQYXJhbXN9LlxuICogQHJldHVybnMgQSB7QGxpbmsgUHJvbWlzZX0gdGhhdCByZXNvbHZlcyB0byB0aGUgY29tcGlsZWQgbW9kdWxlLlxuICogQHRocm93cyBJZiBCYWJlbCBwcm9kdWNlZCBubyBjb2RlLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gdHJhbnNmb3JtU29saWQocGFyYW1zOiBUcmFuc2Zvcm1Tb2xpZFBhcmFtcyk6IFByb21pc2U8VHJhbnNmb3JtZWRNb2R1bGU+IHtcbiAgY29uc3QgeyBjb2RlLCBmaWxlUGF0aCB9ID0gcGFyYW1zO1xuICBjb25zdCBmZWF0dXJlID0gJ2ZyYW1ld29yazogXFwnc29saWRcXCcnO1xuICBjb25zdCBwcm9qZWN0Rm9sZGVyT3B0aW9uID0gcGFyYW1zLnByb2plY3RGb2xkZXIgPT09IHVuZGVmaW5lZCA/IHt9IDogeyBwcm9qZWN0Rm9sZGVyOiBwYXJhbXMucHJvamVjdEZvbGRlciB9O1xuICBjb25zdCBiYWJlbCA9IGV4dHJhY3REZWZhdWx0RXhwb3J0SW50ZXJvcChhd2FpdCBpbXBvcnRPcHRpb25hbFBlZXI8QmFiZWxDb3JlTGlrZT4oeyBmZWF0dXJlLCBwYWNrYWdlTmFtZTogJ0BiYWJlbC9jb3JlJywgLi4ucHJvamVjdEZvbGRlck9wdGlvbiB9KSk7XG4gIGNvbnN0IHNvbGlkUHJlc2V0ID0gZXh0cmFjdERlZmF1bHRFeHBvcnRJbnRlcm9wKGF3YWl0IGltcG9ydE9wdGlvbmFsUGVlcjxvYmplY3Q+KHsgZmVhdHVyZSwgcGFja2FnZU5hbWU6ICdiYWJlbC1wcmVzZXQtc29saWQnLCAuLi5wcm9qZWN0Rm9sZGVyT3B0aW9uIH0pKTtcblxuICBjb25zdCBzdHJpcHBlZCA9IGF3YWl0IGVzYnVpbGRUcmFuc2Zvcm0oY29kZSwge1xuICAgIGpzeDogJ3ByZXNlcnZlJyxcbiAgICBsb2FkZXI6IC9cXC50c3gkL2l1LnRlc3QoZmlsZVBhdGgpID8gJ3RzeCcgOiAnanN4JyxcbiAgICBzb3VyY2VmaWxlOiBmaWxlUGF0aCxcbiAgICBzb3VyY2VtYXA6ICdleHRlcm5hbCdcbiAgfSk7XG5cbiAgY29uc3QgcmVzdWx0ID0gYXdhaXQgYmFiZWwudHJhbnNmb3JtQXN5bmMoc3RyaXBwZWQuY29kZSwge1xuICAgIGJhYmVscmM6IGZhbHNlLFxuICAgIGNvbmZpZ0ZpbGU6IGZhbHNlLFxuICAgIGZpbGVuYW1lOiBmaWxlUGF0aCxcbiAgICBpbnB1dFNvdXJjZU1hcDogSlNPTi5wYXJzZShzdHJpcHBlZC5tYXApIGFzIEJhYmVsVHJhbnNmb3JtT3B0aW9uc1snaW5wdXRTb3VyY2VNYXAnXSxcbiAgICBwcmVzZXRzOiBbW3NvbGlkUHJlc2V0LCB7IGdlbmVyYXRlOiAnZG9tJywgaHlkcmF0YWJsZTogZmFsc2UgfV1dLFxuICAgIHNvdXJjZU1hcHM6IHRydWVcbiAgfSk7XG4gIC8qIHY4IGlnbm9yZSBzdGFydCAtLSBCYWJlbCByZXR1cm5zIG5vIGNvZGUgb25seSB3aGVuIGEgcGx1Z2luIGRyb3BzIHRoZSBmaWxlLCB3aGljaCB0aGUgU29saWQgcHJlc2V0IG5ldmVyIGRvZXMuICovXG4gIGlmICghcmVzdWx0Py5jb2RlKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBCYWJlbCBwcm9kdWNlZCBubyBjb2RlIGZvciAke2ZpbGVQYXRofWApO1xuICB9XG4gIC8qIHY4IGlnbm9yZSBzdG9wICovXG4gIC8vIFdpdGggYHNvdXJjZU1hcHNgIG9uLCBCYWJlbCBhbHdheXMgcmV0dXJucyBhIHNvdXJjZSBtYXAuXG4gIHJldHVybiB7IGNvZGU6IHJlc3VsdC5jb2RlLCBtYXA6IGVuc3VyZU5vbk51bGxhYmxlKHJlc3VsdC5tYXAsIGBCYWJlbCBwcm9kdWNlZCBubyBzb3VyY2UgbWFwIGZvciAke2ZpbGVQYXRofWApIH07XG59XG5cbi8qKlxuICogQ29tcGlsZXMgYSBTdmVsdGUgY29tcG9uZW50IChgLnN2ZWx0ZWApLCB3aXRoIGl0cyBzdHlsZXMgaW5qZWN0ZWQgYnkgdGhlIGNvbXBvbmVudCBpdHNlbGYsIG9yIGEgU3ZlbHRlIG1vZHVsZVxuICogKGAuc3ZlbHRlLnRzYCwgYC5zdmVsdGUuanNgKSwgd2hvc2UgVHlwZVNjcmlwdCBlc2J1aWxkIHN0cmlwcyBmaXJzdC5cbiAqXG4gKiBAcGFyYW0gcGFyYW1zIC0gVGhlIHtAbGluayBUcmFuc2Zvcm1Nb2R1bGVQYXJhbXN9LlxuICogQHJldHVybnMgQSB7QGxpbmsgUHJvbWlzZX0gdGhhdCByZXNvbHZlcyB0byB0aGUgY29tcGlsZWQgbW9kdWxlLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gdHJhbnNmb3JtU3ZlbHRlKHBhcmFtczogVHJhbnNmb3JtU3ZlbHRlUGFyYW1zKTogUHJvbWlzZTxUcmFuc2Zvcm1lZE1vZHVsZT4ge1xuICBjb25zdCB7IGNvZGUsIGZpbGVQYXRoLCBpc1Byb2R1Y3Rpb25CdWlsZCB9ID0gcGFyYW1zO1xuICBjb25zdCBjb21waWxlciA9IGV4dHJhY3REZWZhdWx0RXhwb3J0SW50ZXJvcChcbiAgICBhd2FpdCBpbXBvcnRPcHRpb25hbFBlZXI8U3ZlbHRlQ29tcGlsZXJMaWtlPih7XG4gICAgICBmZWF0dXJlOiAnZnJhbWV3b3JrOiBcXCdzdmVsdGVcXCcnLFxuICAgICAgcGFja2FnZU5hbWU6ICdzdmVsdGUnLFxuICAgICAgc3BlY2lmaWVyOiAnc3ZlbHRlL2NvbXBpbGVyJyxcbiAgICAgIC4uLihwYXJhbXMucHJvamVjdEZvbGRlciAhPT0gdW5kZWZpbmVkICYmIHsgcHJvamVjdEZvbGRlcjogcGFyYW1zLnByb2plY3RGb2xkZXIgfSlcbiAgICB9KVxuICApO1xuICBjb25zdCBtb2R1bGVPcHRpb25zOiBTdmVsdGVNb2R1bGVDb21waWxlT3B0aW9uc0xpa2UgPSB7IGRldjogIWlzUHJvZHVjdGlvbkJ1aWxkLCBmaWxlbmFtZTogZmlsZVBhdGgsIGdlbmVyYXRlOiAnY2xpZW50JyB9O1xuXG4gIGlmIChTVkVMVEVfTU9EVUxFX1BBVFRFUk4udGVzdChmaWxlUGF0aCkpIHtcbiAgICBsZXQgamF2YVNjcmlwdCA9IGNvZGU7XG4gICAgaWYgKFRZUEVTQ1JJUFRfTU9EVUxFX1BBVFRFUk4udGVzdChmaWxlUGF0aCkpIHtcbiAgICAgIGNvbnN0IHN0cmlwcGVkID0gYXdhaXQgZXNidWlsZFRyYW5zZm9ybShjb2RlLCB7IGxvYWRlcjogJ3RzJywgc291cmNlZmlsZTogZmlsZVBhdGggfSk7XG4gICAgICBqYXZhU2NyaXB0ID0gc3RyaXBwZWQuY29kZTtcbiAgICB9XG4gICAgcmV0dXJuIGNvbXBpbGVyLmNvbXBpbGVNb2R1bGUoamF2YVNjcmlwdCwgbW9kdWxlT3B0aW9ucykuanM7XG4gIH1cblxuICByZXR1cm4gY29tcGlsZXIuY29tcGlsZShjb2RlLCB7IC4uLm1vZHVsZU9wdGlvbnMsIGNzczogJ2luamVjdGVkJyB9KS5qcztcbn1cblxuZnVuY3Rpb24gaXNUYWlsd2luZFBsdWdpbihwbHVnaW46IEFjY2VwdGVkUGx1Z2luKTogYm9vbGVhbiB7XG4gIHJldHVybiB0eXBlb2YgcGx1Z2luID09PSAnb2JqZWN0JyAmJiAncG9zdGNzc1BsdWdpbicgaW4gcGx1Z2luICYmIHBsdWdpbi5wb3N0Y3NzUGx1Z2luID09PSBUQUlMV0lORF9QT1NUQ1NTX1BMVUdJTl9OQU1FO1xufVxuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQWtCQSxTQUFTLG1DQUFtQztBQUM1QyxTQUFTLHlCQUF5QjtBQUNsQyxTQUFTLGFBQWEsd0JBQXdCO0FBQzlDLE9BQU8sYUFBYTtBQUNwQixPQUFPLGFBQWE7QUFDcEIsT0FBTyx3QkFBd0I7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