@cmmn/tools 2.2.3 → 3.0.0-alpha-4

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 (205) hide show
  1. package/.swcrc +20 -0
  2. package/dist/bundle/index.js +913 -0
  3. package/dist/bundle/test.js +32 -0
  4. package/dist/esm/bin.js +9 -0
  5. package/dist/esm/bin.js.map +1 -0
  6. package/dist/esm/bundlers/createBundler.js +9 -0
  7. package/dist/esm/bundlers/createBundler.js.map +1 -0
  8. package/dist/esm/bundlers/plugins/minify.js +34 -0
  9. package/dist/esm/bundlers/plugins/minify.js.map +1 -0
  10. package/dist/esm/bundlers/plugins/wasm.js +43 -0
  11. package/dist/esm/bundlers/plugins/wasm.js.map +1 -0
  12. package/dist/esm/bundlers/rolldown-bundler.js +153 -0
  13. package/dist/esm/bundlers/rolldown-bundler.js.map +1 -0
  14. package/dist/esm/bundlers/types.js +3 -0
  15. package/dist/esm/bundlers/types.js.map +1 -0
  16. package/dist/esm/bundlers/vite.builder.js +117 -0
  17. package/dist/esm/bundlers/vite.builder.js.map +1 -0
  18. package/dist/esm/bundlers/vite.bundler.js +56 -0
  19. package/dist/esm/bundlers/vite.bundler.js.map +1 -0
  20. package/dist/esm/commands/bundle.js +102 -0
  21. package/dist/esm/commands/bundle.js.map +1 -0
  22. package/dist/esm/commands/cert.js +26 -0
  23. package/dist/esm/commands/cert.js.map +1 -0
  24. package/dist/esm/commands/ci.js +14 -0
  25. package/dist/esm/commands/ci.js.map +1 -0
  26. package/dist/esm/commands/clean.js +18 -0
  27. package/dist/esm/commands/clean.js.map +1 -0
  28. package/dist/esm/commands/compile.js +60 -0
  29. package/dist/esm/commands/compile.js.map +1 -0
  30. package/dist/esm/commands/deploy.js +61 -0
  31. package/dist/esm/commands/deploy.js.map +1 -0
  32. package/dist/esm/commands/dev.js +37 -0
  33. package/dist/esm/commands/dev.js.map +1 -0
  34. package/dist/esm/commands/format.js +44 -0
  35. package/dist/esm/commands/format.js.map +1 -0
  36. package/dist/esm/commands/gen.js +36 -0
  37. package/dist/esm/commands/gen.js.map +1 -0
  38. package/dist/esm/commands/host.js +21 -0
  39. package/dist/esm/commands/host.js.map +1 -0
  40. package/dist/esm/commands/index.js +12 -0
  41. package/dist/esm/commands/index.js.map +1 -0
  42. package/dist/esm/commands/lint.js +45 -0
  43. package/dist/esm/commands/lint.js.map +1 -0
  44. package/dist/esm/commands/nginx.js +62 -0
  45. package/dist/esm/commands/nginx.js.map +1 -0
  46. package/dist/esm/commands/publish.js +37 -0
  47. package/dist/esm/commands/publish.js.map +1 -0
  48. package/dist/esm/commands/typings.js +66 -0
  49. package/dist/esm/commands/typings.js.map +1 -0
  50. package/dist/esm/commands/version.js +34 -0
  51. package/dist/esm/commands/version.js.map +1 -0
  52. package/dist/esm/dev-server/asset-collection.js +18 -0
  53. package/dist/esm/dev-server/asset-collection.js.map +1 -0
  54. package/dist/esm/dev-server/bundle.json.builder.js +47 -0
  55. package/dist/esm/dev-server/bundle.json.builder.js.map +1 -0
  56. package/dist/esm/dev-server/dependencyServer.js +96 -0
  57. package/dist/esm/dev-server/dependencyServer.js.map +1 -0
  58. package/dist/esm/dev-server/dev-server.js +49 -0
  59. package/dist/esm/dev-server/dev-server.js.map +1 -0
  60. package/dist/esm/dev-server/plugins/minify.js +34 -0
  61. package/dist/esm/dev-server/plugins/minify.js.map +1 -0
  62. package/dist/esm/dev-server/plugins/wasm.js +30 -0
  63. package/dist/esm/dev-server/plugins/wasm.js.map +1 -0
  64. package/dist/esm/dev-server/resolver.js +55 -0
  65. package/dist/esm/dev-server/resolver.js.map +1 -0
  66. package/dist/esm/dev-server/rolldown-dependency-builder.js +150 -0
  67. package/dist/esm/dev-server/rolldown-dependency-builder.js.map +1 -0
  68. package/dist/esm/dev-server/target-runnner.js +72 -0
  69. package/dist/esm/dev-server/target-runnner.js.map +1 -0
  70. package/dist/esm/dev-server/target-web-server.js +78 -0
  71. package/dist/esm/dev-server/target-web-server.js.map +1 -0
  72. package/dist/esm/dev-server/targetServer.js +29 -0
  73. package/dist/esm/dev-server/targetServer.js.map +1 -0
  74. package/dist/esm/dev-server/vite.builder.js +183 -0
  75. package/dist/esm/dev-server/vite.builder.js.map +1 -0
  76. package/dist/esm/dev-server/wasm-resolver.js +25 -0
  77. package/dist/esm/dev-server/wasm-resolver.js.map +1 -0
  78. package/dist/esm/helpers/fastify-compress.js +26 -0
  79. package/dist/esm/helpers/fastify-compress.js.map +1 -0
  80. package/dist/esm/helpers/flags.js +22 -0
  81. package/dist/esm/helpers/flags.js.map +1 -0
  82. package/dist/esm/helpers/getProjects.js +49 -0
  83. package/dist/esm/helpers/getProjects.js.map +1 -0
  84. package/dist/esm/helpers/getTSConfig.js +32 -0
  85. package/dist/esm/helpers/getTSConfig.js.map +1 -0
  86. package/dist/esm/helpers/target.js +230 -0
  87. package/dist/esm/helpers/target.js.map +1 -0
  88. package/dist/esm/helpers/terminal.js +117 -0
  89. package/dist/esm/helpers/terminal.js.map +1 -0
  90. package/dist/esm/helpers/ts-resolve-plugin.js +139 -0
  91. package/dist/esm/helpers/ts-resolve-plugin.js.map +1 -0
  92. package/dist/esm/helpers/watcher.js +35 -0
  93. package/dist/esm/helpers/watcher.js.map +1 -0
  94. package/dist/esm/index.js +5 -0
  95. package/dist/esm/index.js.map +1 -0
  96. package/dist/esm/model/bundle.js +75 -0
  97. package/dist/esm/model/bundle.js.map +1 -0
  98. package/dist/esm/model/flags.js +27 -0
  99. package/dist/esm/model/flags.js.map +1 -0
  100. package/dist/esm/model/monorepo.js +74 -0
  101. package/dist/esm/model/monorepo.js.map +1 -0
  102. package/dist/esm/model/pack.js +134 -0
  103. package/dist/esm/model/pack.js.map +1 -0
  104. package/dist/esm/model/resolver.js +100 -0
  105. package/dist/esm/model/resolver.js.map +1 -0
  106. package/dist/esm/model/target.js +111 -0
  107. package/dist/esm/model/target.js.map +1 -0
  108. package/dist/esm/servers/bundle-server.js +20 -0
  109. package/dist/esm/servers/bundle-server.js.map +1 -0
  110. package/dist/esm/servers/dev-server.js +70 -0
  111. package/dist/esm/servers/dev-server.js.map +1 -0
  112. package/dist/esm/servers/pack-server.js +20 -0
  113. package/dist/esm/servers/pack-server.js.map +1 -0
  114. package/dist/esm/servers/target-runnner.js +80 -0
  115. package/dist/esm/servers/target-runnner.js.map +1 -0
  116. package/dist/esm/servers/vite-dev-server.js +61 -0
  117. package/dist/esm/servers/vite-dev-server.js.map +1 -0
  118. package/dist/esm/specs/dependency-builder-specs.js +164 -0
  119. package/dist/esm/specs/dependency-builder-specs.js.map +1 -0
  120. package/dist/esm/specs/dev-server.specs.js +73 -0
  121. package/dist/esm/specs/dev-server.specs.js.map +1 -0
  122. package/dist/esm/specs/monorepo.specs.js +35 -0
  123. package/dist/esm/specs/monorepo.specs.js.map +1 -0
  124. package/dist/esm/specs/resolver.specs.js +57 -0
  125. package/dist/esm/specs/resolver.specs.js.map +1 -0
  126. package/dist/esm/specs/rolldown.specs.js +278 -0
  127. package/dist/esm/specs/rolldown.specs.js.map +1 -0
  128. package/dist/esm/specs/target-specs.js +108 -0
  129. package/dist/esm/specs/target-specs.js.map +1 -0
  130. package/dist/esm/specs/vite-bundler.specs.js +77 -0
  131. package/dist/esm/specs/vite-bundler.specs.js.map +1 -0
  132. package/dist/esm/test/test.js +30 -0
  133. package/dist/esm/test/test.js.map +1 -0
  134. package/dist/ts.buildinfo +1 -0
  135. package/dist/typings/bin.d.ts +2 -0
  136. package/dist/typings/bundlers/plugins/minify.d.ts +6 -0
  137. package/dist/typings/bundlers/plugins/wasm.d.ts +5 -0
  138. package/dist/typings/bundlers/rolldown-bundler.d.ts +18 -0
  139. package/dist/typings/bundlers/types.d.ts +4 -0
  140. package/dist/typings/bundlers/vite.builder.d.ts +12 -0
  141. package/dist/typings/bundlers/vite.bundler.d.ts +9 -0
  142. package/dist/typings/commands/bundle.d.ts +2 -0
  143. package/dist/typings/commands/cert.d.ts +1 -0
  144. package/dist/typings/commands/clean.d.ts +2 -0
  145. package/dist/typings/commands/compile.d.ts +2 -0
  146. package/dist/typings/commands/dev.d.ts +2 -0
  147. package/dist/typings/commands/format.d.ts +5 -0
  148. package/dist/typings/commands/gen.d.ts +1 -0
  149. package/dist/typings/commands/host.d.ts +1 -0
  150. package/dist/typings/commands/index.d.ts +10 -0
  151. package/dist/typings/commands/lint.d.ts +5 -0
  152. package/dist/typings/commands/nginx.d.ts +6 -0
  153. package/dist/typings/commands/publish.d.ts +2 -0
  154. package/dist/typings/commands/typings.d.ts +4 -0
  155. package/dist/typings/commands/version.d.ts +1 -0
  156. package/dist/typings/helpers/fastify-compress.d.ts +6 -0
  157. package/dist/typings/helpers/getTSConfig.d.ts +11 -0
  158. package/dist/typings/helpers/terminal.d.ts +22 -0
  159. package/dist/typings/helpers/watcher.d.ts +7 -0
  160. package/dist/typings/index.d.ts +4 -0
  161. package/dist/typings/model/bundle.d.ts +34 -0
  162. package/dist/typings/model/flags.d.ts +15 -0
  163. package/dist/typings/model/monorepo.d.ts +18 -0
  164. package/dist/typings/model/pack.d.ts +45 -0
  165. package/dist/typings/model/resolver.d.ts +38 -0
  166. package/dist/typings/model/target.d.ts +27 -0
  167. package/dist/typings/servers/bundle-server.d.ts +10 -0
  168. package/dist/typings/servers/dev-server.d.ts +16 -0
  169. package/dist/typings/servers/pack-server.d.ts +9 -0
  170. package/dist/typings/servers/target-runnner.d.ts +13 -0
  171. package/dist/typings/servers/vite-dev-server.d.ts +18 -0
  172. package/dist/typings/specs/dev-server.specs.d.ts +1 -0
  173. package/dist/typings/specs/monorepo.specs.d.ts +1 -0
  174. package/dist/typings/specs/resolver.specs.d.ts +1 -0
  175. package/dist/typings/specs/rolldown.specs.d.ts +1 -0
  176. package/dist/typings/specs/target-specs.d.ts +1 -0
  177. package/dist/typings/specs/vite-bundler.specs.d.ts +1 -0
  178. package/dist/typings/test/test.d.ts +16 -0
  179. package/{compile → helpers}/tsconfig.json +12 -9
  180. package/node/hooks-dev.js +72 -0
  181. package/node/register-dev.js +3 -0
  182. package/node/register.js +14 -0
  183. package/package.json +51 -40
  184. package/readme.md +2 -2
  185. package/tsconfig.json +14 -0
  186. package/LICENSE +0 -21
  187. package/bin.js +0 -21
  188. package/bundle/bundle.js +0 -46
  189. package/bundle/esbuild.config.js +0 -178
  190. package/bundle/getConfigs.js +0 -62
  191. package/compile/compile.js +0 -53
  192. package/compile/ts-resolve-plugin.js +0 -235
  193. package/compile/typings.d.ts +0 -19
  194. package/gen/component.ts.tpl +0 -16
  195. package/gen/gen.js +0 -27
  196. package/gen/style.less.tpl +0 -3
  197. package/gen/template.ts.tpl +0 -8
  198. package/helpers/getTSConfig.js +0 -19
  199. package/serve/readme.md +0 -8
  200. package/serve/serve.js +0 -109
  201. package/spawn/index.js +0 -81
  202. package/test/index.d.ts +0 -18
  203. package/test/index.js +0 -16
  204. package/test/jest.config.js +0 -32
  205. package/test/pathsToModuleNameMapper.js +0 -46
@@ -0,0 +1,913 @@
1
+ import { getPackages } from '@manypkg/get-packages';
2
+ import path, { join, dirname, resolve, relative } from 'node:path';
3
+ import terminalKit from 'terminal-kit';
4
+ import fs$1, { stat, readFile } from 'node:fs/promises';
5
+ import fs from 'node:fs';
6
+ import { fileURLToPath } from 'node:url';
7
+ import ts from 'typescript';
8
+ import { minimatch } from 'minimatch';
9
+ import { build } from 'vite';
10
+ import { subtle } from 'crypto';
11
+ import builtinModules from 'builtin-modules';
12
+ import swc from 'unplugin-swc';
13
+ import tsconfigPaths from 'vite-tsconfig-paths';
14
+ import { minify } from '@swc/core';
15
+ import { _ } from '@swc/helpers/_/_ts_add_disposable_resource';
16
+ import { _ as _$1 } from '@swc/helpers/_/_ts_dispose_resources';
17
+ import { crc32 } from 'node:zlib';
18
+ import { esmExternalRequirePlugin } from 'rolldown/experimental';
19
+
20
+ var define_process_default$2 = { env: { NODE_ENV: "production" } };
21
+ class Pack extends EventTarget {
22
+ static async read(id, version, dir = define_process_default$2.cwd()) {
23
+ while (dir) {
24
+ try {
25
+ const pkgDir = join(dir, "node_modules", id);
26
+ if (await stat(pkgDir)) {
27
+ const json = JSON.parse(await readFile(join(pkgDir, "package.json"), {
28
+ encoding: "utf-8"
29
+ }));
30
+ return new Pack(pkgDir, json);
31
+ }
32
+ } catch {
33
+ dir = dirname(dir);
34
+ }
35
+ }
36
+ }
37
+ *getAllDependencies(prod) {
38
+ yield* Object.entries(this.packageJson.dependencies ?? {});
39
+ if (!prod) yield* Object.entries(this.packageJson.devDependencies ?? {});
40
+ }
41
+ constructor(rootDir, packageJson) {
42
+ super(), this.rootDir = rootDir, this.packageJson = packageJson, this.reactions = [];
43
+ }
44
+ init(flags, packsMap) {
45
+ const deps = Object.keys(this.packageJson.dependencies ?? {});
46
+ if (!flags.production) deps.push(...Object.keys(this.packageJson.devDependencies ?? {}));
47
+ this.deps = deps.map((x) => packsMap.get(x)).filter((x) => !!x);
48
+ this.deps.forEach((x) => x.reactions.push(this));
49
+ for (let dep of this.deps) {
50
+ dep.addEventListener("change", (e) => {
51
+ this.dispatchEvent(new ChangeEvent(e.payload, e.from));
52
+ });
53
+ dep.addEventListener("file", (e) => {
54
+ this.dispatchEvent(new FileChangeEvent([]));
55
+ });
56
+ }
57
+ }
58
+ get isServer() {
59
+ return !!this.packageJson.config?.server;
60
+ }
61
+ get name() {
62
+ return this.packageJson.name;
63
+ }
64
+ log(text) {
65
+ this.term ??= new terminalKit.Terminal();
66
+ this.term.blue(this.packageJson.name);
67
+ this.term.white(` ${text}
68
+ `);
69
+ }
70
+ error(text) {
71
+ this.log(`^RERROR: ^w` + text.toString());
72
+ }
73
+ get entries() {
74
+ if (this._entries) return this._entries;
75
+ if (this.packageJson.exports && typeof this.packageJson.exports == "object") {
76
+ const result = [];
77
+ for (let item in this.packageJson.exports) {
78
+ if (!item.startsWith(".")) {
79
+ const exports = this.packageJson.exports;
80
+ const importFile2 = exports.default ?? exports.require ?? exports.import;
81
+ if (!importFile2 || !(typeof importFile2 === "string")) {
82
+ this.error(`Failed to read entry '${item}' in ${this.packageJson.name}`);
83
+ continue;
84
+ }
85
+ result.push(this.createEntry(".", importFile2));
86
+ break;
87
+ }
88
+ const importFile = this.packageJson.exports[item].default ?? this.packageJson.exports[item].import ?? this.packageJson.exports[item].require ?? this.packageJson.exports[item];
89
+ if (!importFile || !(typeof importFile === "string")) {
90
+ this.error(`Failed to read entry '${item}' in ${this.packageJson.name}`);
91
+ continue;
92
+ }
93
+ result.push(this.createEntry(item, importFile));
94
+ }
95
+ return this._entries = result;
96
+ }
97
+ const entry = this.packageJson.module ?? this.packageJson.main ?? this.packageJson.browser ?? this.packageJson.exports;
98
+ return this._entries = entry ? [
99
+ this.createEntry(".", entry)
100
+ ] : [];
101
+ }
102
+ /**
103
+ * @param name relative path inside pack: "", "/index.js", "/bundler"...
104
+ */
105
+ getEntry(name) {
106
+ return this.entries.find((x) => x.name === name);
107
+ }
108
+ createEntry(name, source) {
109
+ const absolute = resolve(this.rootDir, source);
110
+ name = name.replace(/^[.\/]+/, "");
111
+ return {
112
+ name,
113
+ source: absolute,
114
+ relative: source.replace(/^[.\/]+/, ""),
115
+ isExcluded: false,
116
+ isHTML: /\.html$/i.test(source),
117
+ output: this.getExport(name, source),
118
+ isTypeScript: /\.tsx?$/i.test(source),
119
+ isJavaScript: /\.jsx?$/i.test(source)
120
+ };
121
+ }
122
+ getExport(entry, file) {
123
+ const extension = file.match(/\.([^.]+)$/)[1];
124
+ const entryName = entry.replace(/^\.?\/?/, "").replace(/\.[^.]+$/, "") || "index";
125
+ const outExt = extension.replace(/^[jt]sx?$/, "js").replace(/^(less|css|sass|scss)$/, "css");
126
+ return `${entryName}.${outExt}`;
127
+ }
128
+ static {
129
+ this.ImportPrefix = "/_/";
130
+ }
131
+ get publicPath() {
132
+ return `${Pack.ImportPrefix}${this.name}`;
133
+ }
134
+ }
135
+ class ChangeEvent extends Event {
136
+ constructor(payload, from) {
137
+ super("change");
138
+ this.payload = payload;
139
+ }
140
+ }
141
+ class FileChangeEvent extends Event {
142
+ constructor(files) {
143
+ super("file"), this.files = files;
144
+ }
145
+ }
146
+
147
+ function getTSConfig(configPath) {
148
+ const result = ts.readConfigFile(configPath, ts.sys.readFile);
149
+ if (result.error) {
150
+ return null;
151
+ }
152
+ if (result.config.extends) {
153
+ const extended = getTSConfig(path.resolve(path.dirname(configPath), result.config.extends)) ?? getTSConfig(fileURLToPath(import.meta.resolve(result.config.extends)));
154
+ const merged = merge([
155
+ extended,
156
+ result.config
157
+ ]);
158
+ return merged;
159
+ }
160
+ return result.config;
161
+ }
162
+ function merge(values) {
163
+ const keys = new Set(values.flatMap(Object.keys));
164
+ const result = {};
165
+ for (let key of keys){
166
+ const v = values.map((x)=>x[key]).filter((x)=>x !== undefined);
167
+ if (v.length === 0) result[key] = undefined;
168
+ else if (v.length === 1) result[key] = v[0];
169
+ else if (typeof v.at(-1) !== "object" || v.at(-1) === null || Array.isArray(v.at(-1))) result[key] = v.at(-1);
170
+ else result[key] = merge(v);
171
+ }
172
+ return result;
173
+ }
174
+
175
+ class Target extends Pack {
176
+ get publicPath() {
177
+ return this.packageJson.config?.publicPath ?? super.publicPath;
178
+ }
179
+ get tsConfig() {
180
+ return this._tsConfig ??= getTSConfig(join(this.rootDir, 'tsconfig.json'));
181
+ }
182
+ isExcluded(fileName, isRelative = false) {
183
+ if (!isRelative) fileName = relative(this.rootDir, fileName);
184
+ if (fileName.startsWith('./')) fileName = fileName.substring(2);
185
+ const check = (pattern)=>{
186
+ return fileName.startsWith(pattern) || minimatch(fileName, pattern);
187
+ };
188
+ const include = this.tsConfig.include ?? [];
189
+ if (include.length > 0) {
190
+ if (!include.some(check)) return true;
191
+ }
192
+ const exclude = this.tsConfig.exclude ?? [
193
+ 'dist',
194
+ 'node_modules'
195
+ ];
196
+ return exclude.some(check);
197
+ }
198
+ get swcConfigPath() {
199
+ const local = join(this.rootDir, '.swcrc');
200
+ if (fs.existsSync(local)) return local;
201
+ return fileURLToPath(import.meta.resolve('@cmmn/tools/swcrc'));
202
+ }
203
+ get swcConfig() {
204
+ this.swcConfigBase ??= JSON.parse(fs.readFileSync(this.swcConfigPath, {
205
+ encoding: 'utf-8'
206
+ }));
207
+ const tsConfig = this.tsConfig;
208
+ return this._swcConfig ??= {
209
+ ...this.swcConfigBase,
210
+ jsc: {
211
+ ...this.swcConfigBase.jsc,
212
+ baseUrl: this.rootDir,
213
+ paths: tsConfig.compilerOptions?.paths
214
+ },
215
+ module: {
216
+ type: 'es6',
217
+ strict: true,
218
+ strictMode: false,
219
+ resolveFully: true
220
+ },
221
+ sourceMaps: true,
222
+ inlineSourcesContent: false
223
+ };
224
+ }
225
+ async getPublishPackageJson() {
226
+ const packageJson = JSON.parse(JSON.stringify(this.packageJson));
227
+ for (let entry of this.entries){
228
+ if (entry.isHTML || entry.isExcluded) continue;
229
+ const typings = entry.isTypeScript ? './' + join('./dist/typings', relative(this.rootDir, entry.source.replace(/\.ts$/, '.d.ts'))) : undefined;
230
+ const bundle = `./dist/bundle/${entry.output}`;
231
+ if (packageJson.exports) {
232
+ packageJson.exports[entry.name ? "./" + entry.name : "."] = {
233
+ default: bundle,
234
+ typings
235
+ };
236
+ } else {
237
+ packageJson.main = bundle;
238
+ packageJson.typings = typings;
239
+ }
240
+ }
241
+ delete packageJson.module;
242
+ delete packageJson.browser;
243
+ delete packageJson.scripts;
244
+ delete packageJson.devDependencies;
245
+ if (!packageJson.files) packageJson.files = [
246
+ 'dist'
247
+ ];
248
+ return JSON.stringify(packageJson, null, '\t');
249
+ }
250
+ createEntry(name, source) {
251
+ return {
252
+ ...super.createEntry(name, source),
253
+ isExcluded: this.isExcluded(source, true)
254
+ };
255
+ }
256
+ get https() {
257
+ const host = this.packageJson.config?.host;
258
+ if (!host) return null;
259
+ return {
260
+ host,
261
+ port: this.packageJson.config.port,
262
+ cert: join(this.rootDir, `dist/${host}.pem`),
263
+ key: join(this.rootDir, `dist/${host}-key.pem`)
264
+ };
265
+ }
266
+ get proxy() {
267
+ return this._proxy ??= Object.entries({
268
+ ...this.packageJson.config?.proxy ?? {}
269
+ }).map(([regex, replace])=>({
270
+ regex: new RegExp(regex),
271
+ replace
272
+ }));
273
+ }
274
+ constructor(...args){
275
+ super(...args), this.publicDir = join(this.rootDir, 'public');
276
+ }
277
+ }
278
+
279
+ class Resolver {
280
+ constructor(packs, flags){
281
+ this.packs = packs;
282
+ this.flags = flags;
283
+ this.basePath = '';
284
+ /**
285
+ * Resolve id to absolute path
286
+ * @param id - relative path: "react", "react/jsx-runtime.js", "loro-crdt/bundler", "loro-crdt/loro.wasm"...
287
+ * @param importer
288
+ * @param options
289
+ */ this.resolveId = (id, importer = null, options = null)=>{
290
+ if (options?.isEntry) return;
291
+ const pack = this.getPack(id);
292
+ if (!pack) return undefined;
293
+ return this.resolveInPack(pack.pack, pack.path, importer, options);
294
+ };
295
+ }
296
+ resolvePath(path, importer = null, options = null) {
297
+ const pack = this.getPack(path);
298
+ if (!pack) return undefined;
299
+ return this.resolveWithProxy(pack.pack, pack.path, importer, options) ?? pack;
300
+ }
301
+ resolveWithProxy(pack, path, importer = null, options = null) {
302
+ if (pack instanceof Target) {
303
+ for (let proxy of pack.proxy){
304
+ if (path.match(proxy.regex)) {
305
+ path = path.replace(proxy.regex, proxy.replace);
306
+ break;
307
+ }
308
+ }
309
+ }
310
+ return this.resolveInPack(pack, path, importer, options);
311
+ }
312
+ resolveInPack(pack, id, importer = null, options = null) {
313
+ if (options?.attributes?.resolve) {
314
+ return {
315
+ external: "absolute",
316
+ id: `${this.basePath}${pack.publicPath}`,
317
+ path: '',
318
+ entry: null,
319
+ pack
320
+ };
321
+ }
322
+ // id - absolute path inside pack: "", "/index.ts", "/src/page.html", "/bundler", "/loro.wasm"
323
+ const entry = pack.getEntry(id.replace(/^\//, ''));
324
+ if (!entry) {
325
+ return;
326
+ }
327
+ const resolved = !this.flags.production && pack instanceof Target ? entry.relative : entry.output;
328
+ return {
329
+ external: "absolute",
330
+ id: `${this.basePath}${pack.publicPath}/${resolved}`,
331
+ path: resolved,
332
+ entry,
333
+ pack
334
+ };
335
+ }
336
+ getPackNames() {
337
+ return this.packs.map((x)=>x.name);
338
+ }
339
+ getPack(id) {
340
+ if (id.startsWith(this.basePath)) id = id.substring(this.basePath.length);
341
+ for (const pack of this.packs){
342
+ if (pack.name == id) {
343
+ return {
344
+ pack,
345
+ path: ''
346
+ };
347
+ } else if (id.startsWith(pack.name + '/')) {
348
+ return {
349
+ pack,
350
+ path: id.substring(pack.name.length + 1)
351
+ };
352
+ } else if (id == pack.rootDir) {
353
+ return {
354
+ pack,
355
+ path: ''
356
+ };
357
+ } else if (id.startsWith(pack.rootDir)) {
358
+ return {
359
+ pack,
360
+ path: id.substring(pack.rootDir.length + 1)
361
+ };
362
+ } else if (id == pack.publicPath) {
363
+ return {
364
+ pack,
365
+ path: ''
366
+ };
367
+ } else if (id.startsWith(pack.publicPath + '/')) {
368
+ return {
369
+ pack,
370
+ path: id.substring(pack.publicPath.length + 1)
371
+ };
372
+ }
373
+ }
374
+ }
375
+ }
376
+
377
+ class Flags {
378
+ static{
379
+ this.Current = new Flags([]);
380
+ }
381
+ constructor(args){
382
+ this.args = args;
383
+ this.deploy = this.args.includes('--deploy');
384
+ this.out = this.args.includes('-out') ? this.args[this.args.indexOf('-out') + 1] : '.out';
385
+ this.command = args[0];
386
+ this.watch = args.includes('--watch');
387
+ this.minify = args.includes('--minify');
388
+ this.unsafe = args.includes('--unsafe');
389
+ this.workspace = args.includes('-w') ? args[args.indexOf('-w') + 1] ?? '.' : undefined;
390
+ this.version = this.command === 'version' ? args[1] : undefined;
391
+ this.production = args.includes('--prod');
392
+ if (this.workspace?.startsWith('--')) {
393
+ this.workspace = undefined;
394
+ }
395
+ }
396
+ get(arg) {
397
+ const index = this.args.indexOf(`--${arg}`);
398
+ if (index === -1) return undefined;
399
+ return this.args[index + 1];
400
+ }
401
+ }
402
+
403
+ class Bundle {
404
+ constructor(pack, output){
405
+ this.pack = pack;
406
+ this.output = output;
407
+ }
408
+ fileNames() {
409
+ return this.output.map((x)=>x.entry?.output ?? x.fileName);
410
+ }
411
+ get(id) {
412
+ return this.output.find((x)=>x.fileName == id || x.entry?.output == id)?.data;
413
+ }
414
+ async getPublicAsset(id) {
415
+ if (!(this.pack instanceof Target) || !this.pack.publicDir) {
416
+ return undefined;
417
+ }
418
+ return readFile(path.join(this.pack.publicDir, id));
419
+ }
420
+ async getBundleJson() {
421
+ return {
422
+ baseURI: this.pack.publicPath,
423
+ assets: [
424
+ ...await Promise.all(this.output.map((o)=>this.getOutputAsset(o)))
425
+ ]
426
+ };
427
+ }
428
+ async getOutputAsset(output) {
429
+ return {
430
+ path: output.entry?.output ?? output.fileName,
431
+ hash: await getHash(output.data),
432
+ size: output.data.length,
433
+ regex: output.entry && this.pack instanceof Target ? this.pack.proxy.find((x)=>x.replace == output.entry.name)?.regex.source : undefined,
434
+ deps: Object.fromEntries(this.getDeps(output))
435
+ };
436
+ }
437
+ *getDeps(output) {
438
+ const flat = output.deps.map((x)=>({
439
+ baseURI: x.pack === this.pack ? "." : x.pack.publicPath,
440
+ path: x.path
441
+ }));
442
+ if (typeof output.data === "string") {
443
+ for (let fileName of this.fileNames()){
444
+ if (output.data.includes(`new URL("${fileName}"`)) {
445
+ flat.push({
446
+ baseURI: ".",
447
+ path: fileName
448
+ });
449
+ }
450
+ if (output.data.includes(`import("./${fileName}"`)) {
451
+ flat.push({
452
+ baseURI: ".",
453
+ path: fileName
454
+ });
455
+ }
456
+ }
457
+ }
458
+ const grouped = Map.groupBy(flat, (x)=>x.baseURI);
459
+ for (let [uri, deps] of grouped){
460
+ yield [
461
+ uri,
462
+ Array.from(new Set(deps.map((x)=>x.path)))
463
+ ];
464
+ }
465
+ }
466
+ }
467
+ async function getHash(data) {
468
+ const buffer = Buffer.from(data);
469
+ const hash = await subtle.digest('SHA-1', buffer);
470
+ return Buffer.from(hash).toString('base64');
471
+ }
472
+
473
+ function wasm(options = {}) {
474
+ return {
475
+ name: 'wasm',
476
+ resolveId (id, importer) {
477
+ if (!/\.wasm$/.test(id)) return null;
478
+ const name = id.split('/').pop();
479
+ const moduleInfo = this.getModuleInfo(importer);
480
+ // @ts-ignore
481
+ moduleInfo.dynamicallyImportedIds.push(name);
482
+ // @ts-ignore
483
+ moduleInfo.importedIds.push(name);
484
+ return resolve(dirname(importer), id);
485
+ },
486
+ async load (id) {
487
+ if (!/\.wasm$/.test(id)) return null;
488
+ const name = id.split('/').pop();
489
+ let url = `new URL("./${name}?no-inline", import.meta.url)`;
490
+ if (options.emitAsset) {
491
+ const referenceId = this.emitFile({
492
+ type: 'asset',
493
+ source: await (this.fs ?? fs$1).readFile(id),
494
+ name: options.assetName?.replace('{name}', name) ?? 'WASM Asset',
495
+ fileName: name
496
+ });
497
+ url = `import.meta.ROLLUP_FILE_URL_${referenceId}`;
498
+ }
499
+ return {
500
+ map: {
501
+ mappings: ''
502
+ },
503
+ code: [
504
+ `const url = ${url};`,
505
+ `const ab = await fetch(url).then(x => x.arrayBuffer())`,
506
+ `export default new WebAssembly.Module(ab);`
507
+ ].join('\n')
508
+ };
509
+ }
510
+ };
511
+ }
512
+
513
+ function swcMinifyPlugin() {
514
+ return {
515
+ name: "custom-terser",
516
+ async renderChunk(code, chunk) {
517
+ if (!chunk.fileName.endsWith(".mjs") && !chunk.fileName.endsWith(".js")) {
518
+ return null;
519
+ }
520
+ const result = await minify(code, {
521
+ compress: {
522
+ defaults: false,
523
+ module: true,
524
+ hoist_props: true,
525
+ unused: true,
526
+ dead_code: true
527
+ },
528
+ ecma: 2016,
529
+ module: true,
530
+ format: {
531
+ comments: false,
532
+ ecma: 2016
533
+ }
534
+ });
535
+ return result.code || null;
536
+ }
537
+ };
538
+ }
539
+
540
+ class ViteBuilder {
541
+ constructor(target, resolver, flags) {
542
+ this.target = target;
543
+ this.resolver = resolver;
544
+ this.flags = flags;
545
+ }
546
+ async getConfig() {
547
+ return {
548
+ root: this.target.rootDir,
549
+ logLevel: "silent",
550
+ mode: this.flags.production ? "production" : "debug",
551
+ optimizeDeps: {
552
+ noDiscovery: true,
553
+ include: []
554
+ },
555
+ define: {
556
+ process: {
557
+ env: {
558
+ NODE_ENV: this.flags.production ? "production" : "development"
559
+ }
560
+ }
561
+ },
562
+ html: {},
563
+ base: this.target.publicPath + "/",
564
+ build: {
565
+ target: "baseline-widely-available",
566
+ emptyOutDir: false,
567
+ rollupOptions: {
568
+ external: [
569
+ ...this.resolver ? [] : this.target.deps.map((x) => new RegExp(`^${x.name}`.replace("/", "\\/"))),
570
+ ...builtinModules,
571
+ "fsevents",
572
+ /@id/g
573
+ ]
574
+ },
575
+ write: false,
576
+ minify: false,
577
+ sourcemap: this.flags.minify ? false : "inline",
578
+ commonjsOptions: {
579
+ transformMixedEsModules: true
580
+ }
581
+ },
582
+ plugins: [
583
+ ...this.getPlugins()
584
+ ]
585
+ };
586
+ }
587
+ *getPlugins() {
588
+ yield wasm();
589
+ yield swc.vite(this.target.swcConfig);
590
+ yield tsconfigPaths();
591
+ if (this.resolver) {
592
+ yield {
593
+ name: this.target.packageJson.name + ":resolver",
594
+ resolveId: this.resolver.resolveId,
595
+ enforce: "pre"
596
+ };
597
+ }
598
+ yield {
599
+ name: "cmmn:html-base-tag",
600
+ enforce: "pre",
601
+ transformIndexHtml: (_, config) => {
602
+ const dir = this.flags.production ? "" : dirname(config.path);
603
+ const result = [
604
+ {
605
+ tag: "base",
606
+ attrs: {
607
+ href: `${this.target.publicPath}${dir}/`
608
+ },
609
+ children: "/** injected **/"
610
+ }
611
+ ];
612
+ if (this.flags.production) {
613
+ result.push({
614
+ tag: "link",
615
+ attrs: {
616
+ rel: "manifest",
617
+ href: `${this.target.publicPath}/manifest.json`
618
+ }
619
+ });
620
+ }
621
+ return result;
622
+ }
623
+ };
624
+ if (this.flags.minify) yield swcMinifyPlugin();
625
+ yield {
626
+ name: "url-resolver",
627
+ enforce: "pre",
628
+ resolveId: (id, importer, options) => {
629
+ if (id.endsWith("?resolve")) {
630
+ const resolved = this.resolver?.resolveId(id.split("?")[0], importer, {
631
+ ...options,
632
+ attributes: {
633
+ ...options.attributes,
634
+ resolve: true
635
+ }
636
+ });
637
+ return resolved ? resolved.id + "?resolve" : id;
638
+ }
639
+ },
640
+ load: (id) => {
641
+ if (id.endsWith("?resolve")) {
642
+ return `export default ${JSON.stringify(id.split("?")[0])}`;
643
+ }
644
+ }
645
+ };
646
+ }
647
+ }
648
+
649
+ class ViteBundler extends ViteBuilder {
650
+ async getBundleConfig() {
651
+ const config = await this.getConfig();
652
+ config.build.lib = {
653
+ entry: Object.fromEntries(this.target.entries.filter((x)=>!x.isExcluded).map((x)=>[
654
+ x.name,
655
+ x.source
656
+ ])),
657
+ fileName: (format, entryName)=>{
658
+ if (entryName == '') entryName = 'index';
659
+ return entryName + '.js';
660
+ },
661
+ formats: [
662
+ 'es'
663
+ ]
664
+ };
665
+ config.build.modulePreload = false;
666
+ return config;
667
+ }
668
+ async createBundle() {
669
+ if (!this.target.entries.length) return [];
670
+ const config = await this.getBundleConfig();
671
+ return build(config).catch((err)=>{
672
+ this.target.error(err.message);
673
+ return [];
674
+ });
675
+ }
676
+ async bundle() {
677
+ const rollupOutput = await this.createBundle();
678
+ const outputChunks = rollupOutput.flatMap((x)=>x.output);
679
+ const entryMap = new Map(this.target.entries.map((x)=>[
680
+ x.relative,
681
+ x
682
+ ]));
683
+ const outputs = outputChunks.map((x)=>{
684
+ return {
685
+ fileName: x.fileName,
686
+ entry: entryMap.get(x.fileName),
687
+ data: x.type == "asset" ? x.source : x.code,
688
+ deps: x.type == "asset" ? [] : [
689
+ ...x.imports,
690
+ ...x.dynamicImports
691
+ ].filter((x)=>!/^node:/.test(x)).map((path)=>path.replace(/^(\.\.\/)+/, '/')).map((path)=>this.resolver?.getPack(path) ?? {
692
+ pack: this.target,
693
+ path: path
694
+ })
695
+ };
696
+ });
697
+ return new Bundle(this.target, outputs);
698
+ }
699
+ }
700
+
701
+ var define_process_default$1 = { env: { NODE_ENV: "production" } };
702
+ class RolldownBundler {
703
+ constructor(pack, resolver, flags) {
704
+ this.pack = pack;
705
+ this.resolver = resolver;
706
+ this.flags = flags;
707
+ this.dir = path.join(define_process_default$1.cwd(), "./node_modules/.cmmn");
708
+ }
709
+ async getFileContent(entry) {
710
+ const target = entry.name ? `${this.pack.name}/${entry.name}` : `${this.pack.name}`;
711
+ if (this.pack.packageJson.type === "module") return `export * from '${target}';`;
712
+ const pkg = await import(target, entry.source.endsWith(".json") ? {
713
+ with: {
714
+ type: "json"
715
+ }
716
+ } : {});
717
+ const keys = Object.keys(pkg).filter((x) => x !== "default");
718
+ return [
719
+ `import * as result from '${target}';`,
720
+ `export const { ${keys.join(",")} } = result;`,
721
+ "default" in pkg ? "export default result.default;" : ""
722
+ ].join("\n");
723
+ }
724
+ async getInputs() {
725
+ const result = {
726
+ async [Symbol.asyncDispose]() {
727
+ for (let file of Object.values(this)) {
728
+ if (typeof file === "string") await fs$1.rm(file);
729
+ }
730
+ }
731
+ };
732
+ for (let entry of this.pack.entries) {
733
+ if (entry.source.match(/\.(d\.ts|css|scss|sass|less|styl|pcss|postcss|html)$/)) continue;
734
+ if (entry.source.includes("*")) continue;
735
+ const id = crc32(entry.name + /* @__PURE__ */ new Date() + Math.random());
736
+ const file = `${this.dir}/.${id}.js`;
737
+ const content = await this.getFileContent(entry);
738
+ await fs$1.mkdir(this.dir, {
739
+ recursive: true
740
+ });
741
+ await fs$1.writeFile(file, content, "utf-8");
742
+ result[entry.name] = file;
743
+ }
744
+ return result;
745
+ }
746
+ getConfig() {
747
+ return {
748
+ write: false,
749
+ output: {
750
+ format: "esm"
751
+ },
752
+ define: {
753
+ "process.env.NODE_ENV": this.flags.production ? '"production"' : '"development"'
754
+ },
755
+ experimental: {},
756
+ platform: "browser",
757
+ resolve: {
758
+ mainFields: [
759
+ "browser",
760
+ "module",
761
+ "main"
762
+ ]
763
+ },
764
+ optimization: {
765
+ inlineConst: this.flags.minify
766
+ },
767
+ treeshake: true,
768
+ plugins: [
769
+ ...this.getPlugins()
770
+ ]
771
+ };
772
+ }
773
+ // TODO: Filter hook https://rolldown.rs/in-depth/why-plugin-hook-filter#when-to-use-filters
774
+ *getPlugins() {
775
+ yield wasm({
776
+ emitAsset: true,
777
+ assetName: `{name}`
778
+ });
779
+ yield {
780
+ name: "require",
781
+ load: (id) => {
782
+ const prefix = "builtin:esm-external-require-";
783
+ if (id.startsWith(prefix)) {
784
+ const resolved = this.resolver.resolveId(id.substring(prefix.length), null, null);
785
+ if (resolved) return `export * from "${resolved.id}"`;
786
+ }
787
+ }
788
+ };
789
+ yield {
790
+ name: "externals",
791
+ resolveId: (id, importer, options) => {
792
+ if (options.kind === "require-call") return;
793
+ const resolved = this.resolver.resolveId(id, importer, options);
794
+ if (resolved && resolved.pack !== this.pack) return resolved;
795
+ }
796
+ };
797
+ yield esmExternalRequirePlugin({
798
+ external: this.resolver.getPackNames().filter((x) => x !== this.pack.name)
799
+ });
800
+ if (this.flags.minify) yield swcMinifyPlugin();
801
+ }
802
+ async bundle() {
803
+ const env = {
804
+ stack: [],
805
+ error: void 0,
806
+ hasError: false
807
+ };
808
+ try {
809
+ const input = _(env, await this.getInputs(), true);
810
+ if (Object.keys(input).length == 0) return new Bundle(this.pack, []);
811
+ const { build } = await import('rolldown');
812
+ const config = this.getConfig();
813
+ const result = await build({
814
+ ...config,
815
+ input
816
+ }).catch((err) => {
817
+ this.pack.error(err.message);
818
+ return {
819
+ output: []
820
+ };
821
+ });
822
+ const outputs = result.output.map((x) => ({
823
+ fileName: x.fileName,
824
+ entry: this.pack.getEntry(x.name),
825
+ data: x.type == "asset" ? x.source : x.code,
826
+ deps: x.type == "asset" ? [] : [
827
+ ...x.imports,
828
+ ...x.dynamicImports
829
+ ].map((path2) => this.resolver.getPack(path2) ?? {
830
+ pack: this.pack,
831
+ path: path2
832
+ })
833
+ }));
834
+ return new Bundle(this.pack, outputs);
835
+ } catch (e) {
836
+ env.error = e;
837
+ env.hasError = true;
838
+ } finally {
839
+ const result = _$1(env);
840
+ if (result) await result;
841
+ }
842
+ }
843
+ }
844
+
845
+ var define_process_default = { env: { NODE_ENV: "production" } };
846
+ class Monorepo {
847
+ static async load(flags = new Flags([]), rootDir = define_process_default.cwd()) {
848
+ const monorepoPackages = await getPackages(rootDir);
849
+ const monorepo = new MonorepoLoader(monorepoPackages);
850
+ await monorepo.load(flags.production);
851
+ return new Monorepo(monorepo.root, monorepo.packs, flags);
852
+ }
853
+ constructor(root, packsMap, flags) {
854
+ this.root = root;
855
+ this.packsMap = packsMap;
856
+ this.flags = flags;
857
+ this.packs = Array.from(this.packsMap.values());
858
+ if (flags.deploy) this.resolver = new Resolver(this.packs, this.flags);
859
+ this.packs.forEach((x) => x.init(flags, this.packsMap));
860
+ root.init(flags, this.packsMap);
861
+ }
862
+ get targets() {
863
+ return Array.from(this.packs.values()).filter((x) => x instanceof Target);
864
+ }
865
+ get(id) {
866
+ return this.packsMap.get(id);
867
+ }
868
+ createBundler(pack) {
869
+ if (pack instanceof Target) return new ViteBundler(pack, this.resolver, this.flags);
870
+ return new RolldownBundler(pack, this.resolver, this.flags);
871
+ }
872
+ }
873
+ class MonorepoLoader {
874
+ constructor(packages) {
875
+ this.packages = packages;
876
+ this.packs = /* @__PURE__ */ new Map();
877
+ }
878
+ async load(prod) {
879
+ for (let p of this.packages.packages) {
880
+ await this.export(p.packageJson.name, p.packageJson.version, prod);
881
+ }
882
+ this.root = await this.export(this.packages.rootPackage.packageJson.name, this.packages.rootPackage.packageJson.version, prod);
883
+ return Array.from(this.packs.values());
884
+ }
885
+ async export(name, version, prod) {
886
+ if (this.packs.has(name)) return this.packs.get(name);
887
+ const pkg = this.getPackage(name);
888
+ if (pkg) {
889
+ const pack = new Target(pkg.dir, pkg.packageJson);
890
+ this.packs.set(name, pack);
891
+ for (let [name2, version2] of pack.getAllDependencies(prod)) {
892
+ if (this.packs.has(name2)) continue;
893
+ await this.export(name2, version2, prod);
894
+ }
895
+ return pack;
896
+ } else {
897
+ const pack = await Pack.read(name, version);
898
+ this.packs.set(name, pack);
899
+ return pack;
900
+ }
901
+ }
902
+ getPackage(name) {
903
+ const p = this.packages.rootPackage.packageJson.name == name ? this.packages.rootPackage : this.packages.packages.find((x) => x.packageJson.name == name);
904
+ return p && {
905
+ dir: p.dir,
906
+ packageJson: p.packageJson,
907
+ version: p.packageJson.version
908
+ };
909
+ }
910
+ }
911
+
912
+ export { Flags, Monorepo };
913
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VzIjpbIi4uL21vZGVsL3BhY2sudHMiLCIuLi9oZWxwZXJzL2dldFRTQ29uZmlnLnRzIiwiLi4vbW9kZWwvdGFyZ2V0LnRzIiwiLi4vbW9kZWwvcmVzb2x2ZXIudHMiLCIuLi9tb2RlbC9mbGFncy50cyIsIi4uL21vZGVsL2J1bmRsZS50cyIsIi4uL2J1bmRsZXJzL3BsdWdpbnMvd2FzbS50cyIsIi4uL2J1bmRsZXJzL3BsdWdpbnMvbWluaWZ5LnRzIiwiLi4vYnVuZGxlcnMvdml0ZS5idWlsZGVyLnRzIiwiLi4vYnVuZGxlcnMvdml0ZS5idW5kbGVyLnRzIiwiLi4vYnVuZGxlcnMvcm9sbGRvd24tYnVuZGxlci50cyIsIi4uL21vZGVsL21vbm9yZXBvLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7SlNPTlNjaGVtYUZvck5QTVBhY2thZ2VKc29uRmlsZXN9IGZyb20gXCJAc2NoZW1hc3RvcmUvcGFja2FnZVwiO1xuaW1wb3J0IHtkaXJuYW1lLCBqb2luLCByZXNvbHZlfSBmcm9tIFwibm9kZTpwYXRoXCI7XG5pbXBvcnQge0ZsYWdzfSBmcm9tIFwiLi9mbGFnc1wiO1xuaW1wb3J0IHRlcm1pbmFsS2l0IGZyb20gXCJ0ZXJtaW5hbC1raXRcIjtcbmltcG9ydCB7cmVhZEZpbGUsIHN0YXR9IGZyb20gXCJub2RlOmZzL3Byb21pc2VzXCI7XG5cbmV4cG9ydCBjbGFzcyBQYWNrIGV4dGVuZHMgRXZlbnRUYXJnZXQge1xuICAgIHN0YXRpYyBhc3luYyByZWFkKGlkOiBzdHJpbmcsIHZlcnNpb24/OiBzdHJpbmcsIGRpciA9IHByb2Nlc3MuY3dkKCkpIHtcbiAgICAgICAgd2hpbGUgKGRpcikge1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBjb25zdCBwa2dEaXIgPSBqb2luKGRpciwgJ25vZGVfbW9kdWxlcycsIGlkKTtcbiAgICAgICAgICAgICAgICBpZiAoYXdhaXQgc3RhdChwa2dEaXIpKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGpzb24gPSBKU09OLnBhcnNlKGF3YWl0IHJlYWRGaWxlKGpvaW4ocGtnRGlyLCBcInBhY2thZ2UuanNvblwiKSwge2VuY29kaW5nOiAndXRmLTgnfSkpIGFzIEpTT05TY2hlbWFGb3JOUE1QYWNrYWdlSnNvbkZpbGVzO1xuICAgICAgICAgICAgICAgICAgICAvLyBUT0RPOiBjaGVjayB2ZXJzaW9uXG4gICAgICAgICAgICAgICAgICAgIC8vIGlmICh2ZXJzaW9uICYmIGpzb24udmVyc2lvbiAhPT0gdmVyc2lvbilcbiAgICAgICAgICAgICAgICAgICAgLy8gICAgIGRpciA9IGRpcm5hbWUoZGlyKTtcbiAgICAgICAgICAgICAgICAgICAgLy8gZWxzZVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFBhY2socGtnRGlyLCBqc29uKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGNhdGNoIHtcbiAgICAgICAgICAgICAgICBkaXIgPSBkaXJuYW1lKGRpcik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMqIGdldEFsbERlcGVuZGVuY2llcyhwcm9kOiBib29sZWFuKSB7XG4gICAgICAgIHlpZWxkKiBPYmplY3QuZW50cmllcyh0aGlzLnBhY2thZ2VKc29uLmRlcGVuZGVuY2llcyA/PyB7fSk7XG4gICAgICAgIGlmICghcHJvZClcbiAgICAgICAgICAgIHlpZWxkKiBPYmplY3QuZW50cmllcyh0aGlzLnBhY2thZ2VKc29uLmRldkRlcGVuZGVuY2llcyA/PyB7fSk7XG4gICAgfVxuXG4gICAgZGVwczogUGFja1tdO1xuICAgIHJlYWN0aW9uczogUGFja1tdID0gW107XG5cbiAgICBjb25zdHJ1Y3RvcihwdWJsaWMgcmVhZG9ubHkgcm9vdERpcixcbiAgICAgICAgICAgICAgICBwdWJsaWMgcmVhZG9ubHkgcGFja2FnZUpzb246IEpTT05TY2hlbWFGb3JOUE1QYWNrYWdlSnNvbkZpbGVzKSB7XG4gICAgICAgIHN1cGVyKCk7XG4gICAgfVxuXG4gICAgcHVibGljIGluaXQoZmxhZ3M6IEZsYWdzLCBwYWNrc01hcDogTWFwPHN0cmluZywgUGFjaz4pIHtcbiAgICAgICAgY29uc3QgZGVwcyA9IE9iamVjdC5rZXlzKHRoaXMucGFja2FnZUpzb24uZGVwZW5kZW5jaWVzID8/IHt9KTtcbiAgICAgICAgaWYgKCFmbGFncy5wcm9kdWN0aW9uKVxuICAgICAgICAgICAgZGVwcy5wdXNoKC4uLk9iamVjdC5rZXlzKHRoaXMucGFja2FnZUpzb24uZGV2RGVwZW5kZW5jaWVzID8/IHt9KSk7XG4gICAgICAgIHRoaXMuZGVwcyA9IGRlcHMubWFwKHggPT4gcGFja3NNYXAuZ2V0KHgpKS5maWx0ZXIoeCA9PiAhIXgpIGFzIFBhY2tbXTtcbiAgICAgICAgdGhpcy5kZXBzLmZvckVhY2goeCA9PiB4LnJlYWN0aW9ucy5wdXNoKHRoaXMpKTtcbiAgICAgICAgZm9yIChsZXQgZGVwIG9mIHRoaXMuZGVwcykge1xuICAgICAgICAgICAgZGVwLmFkZEV2ZW50TGlzdGVuZXIoJ2NoYW5nZScsIChlOiBDaGFuZ2VFdmVudCkgPT4ge1xuICAgICAgICAgICAgICAgIC8vIFRPRE86IHByZXZlbnQgY3ljbGVzXG4gICAgICAgICAgICAgICAgdGhpcy5kaXNwYXRjaEV2ZW50KG5ldyBDaGFuZ2VFdmVudChlLnBheWxvYWQsIGUuZnJvbSkpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBkZXAuYWRkRXZlbnRMaXN0ZW5lcignZmlsZScsIChlOiBGaWxlQ2hhbmdlRXZlbnQpID0+IHtcbiAgICAgICAgICAgICAgICAvLyBUT0RPOiBwcmV2ZW50IGN5Y2xlc1xuICAgICAgICAgICAgICAgIHRoaXMuZGlzcGF0Y2hFdmVudChuZXcgRmlsZUNoYW5nZUV2ZW50KFtdKSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgaXNTZXJ2ZXIoKSB7XG4gICAgICAgIHJldHVybiAhIXRoaXMucGFja2FnZUpzb24uY29uZmlnPy5zZXJ2ZXI7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCBuYW1lKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5wYWNrYWdlSnNvbi5uYW1lO1xuICAgIH1cblxuICAgIHRlcm07XG5cbiAgICBsb2codGV4dCkge1xuICAgICAgICB0aGlzLnRlcm0gPz89IG5ldyB0ZXJtaW5hbEtpdC5UZXJtaW5hbCgpO1xuICAgICAgICB0aGlzLnRlcm0uYmx1ZSh0aGlzLnBhY2thZ2VKc29uLm5hbWUpO1xuICAgICAgICB0aGlzLnRlcm0ud2hpdGUoYCAke3RleHR9XFxuYCk7XG4gICAgfVxuXG4gICAgZXJyb3IodGV4dCkge1xuICAgICAgICB0aGlzLmxvZyhgXlJFUlJPUjogXndgICsgdGV4dC50b1N0cmluZygpKTtcbiAgICB9XG5cbiAgICBfZW50cmllczogRW50cnlbXVxuICAgIGdldCBlbnRyaWVzKCk6IEVudHJ5W10ge1xuICAgICAgICBpZiAodGhpcy5fZW50cmllcykgcmV0dXJuIHRoaXMuX2VudHJpZXM7XG4gICAgICAgIGlmICh0aGlzLnBhY2thZ2VKc29uLmV4cG9ydHMgJiYgdHlwZW9mIHRoaXMucGFja2FnZUpzb24uZXhwb3J0cyA9PSBcIm9iamVjdFwiKSB7XG4gICAgICAgICAgICBjb25zdCByZXN1bHQgPSBbXSBhcyBFbnRyeVtdO1xuICAgICAgICAgICAgZm9yIChsZXQgaXRlbSBpbiB0aGlzLnBhY2thZ2VKc29uLmV4cG9ydHMpIHtcbiAgICAgICAgICAgICAgICBpZiAoIWl0ZW0uc3RhcnRzV2l0aCgnLicpKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGV4cG9ydHMgPSB0aGlzLnBhY2thZ2VKc29uLmV4cG9ydHMgYXMgYW55O1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBpbXBvcnRGaWxlID0gZXhwb3J0cy5kZWZhdWx0ID8/IGV4cG9ydHMucmVxdWlyZSA/PyBleHBvcnRzLmltcG9ydDtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFpbXBvcnRGaWxlIHx8ICEodHlwZW9mIGltcG9ydEZpbGUgPT09IFwic3RyaW5nXCIpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmVycm9yKGBGYWlsZWQgdG8gcmVhZCBlbnRyeSAnJHtpdGVtfScgaW4gJHt0aGlzLnBhY2thZ2VKc29uLm5hbWV9YClcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKHRoaXMuY3JlYXRlRW50cnkoJy4nLCBpbXBvcnRGaWxlKSk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjb25zdCBpbXBvcnRGaWxlID0gdGhpcy5wYWNrYWdlSnNvbi5leHBvcnRzW2l0ZW1dLmRlZmF1bHQgPz9cbiAgICAgICAgICAgICAgICAgICAgdGhpcy5wYWNrYWdlSnNvbi5leHBvcnRzW2l0ZW1dLmltcG9ydCA/P1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnBhY2thZ2VKc29uLmV4cG9ydHNbaXRlbV0ucmVxdWlyZSA/PyB0aGlzLnBhY2thZ2VKc29uLmV4cG9ydHNbaXRlbV07XG4gICAgICAgICAgICAgICAgaWYgKCFpbXBvcnRGaWxlIHx8ICEodHlwZW9mIGltcG9ydEZpbGUgPT09IFwic3RyaW5nXCIpKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZXJyb3IoYEZhaWxlZCB0byByZWFkIGVudHJ5ICcke2l0ZW19JyBpbiAke3RoaXMucGFja2FnZUpzb24ubmFtZX1gKVxuICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmVzdWx0LnB1c2godGhpcy5jcmVhdGVFbnRyeShpdGVtLCBpbXBvcnRGaWxlKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fZW50cmllcyA9IHJlc3VsdDtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBlbnRyeSA9IHRoaXMucGFja2FnZUpzb24ubW9kdWxlXG4gICAgICAgICAgICA/PyB0aGlzLnBhY2thZ2VKc29uLm1haW5cbiAgICAgICAgICAgID8/IHRoaXMucGFja2FnZUpzb24uYnJvd3NlclxuICAgICAgICAgICAgPz8gdGhpcy5wYWNrYWdlSnNvbi5leHBvcnRzIGFzIHN0cmluZ1xuICAgICAgICByZXR1cm4gdGhpcy5fZW50cmllcyA9IGVudHJ5ID8gW3RoaXMuY3JlYXRlRW50cnkoJy4nLCBlbnRyeSldIDogW107XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIG5hbWUgcmVsYXRpdmUgcGF0aCBpbnNpZGUgcGFjazogXCJcIiwgXCIvaW5kZXguanNcIiwgXCIvYnVuZGxlclwiLi4uXG4gICAgICovXG4gICAgZ2V0RW50cnkobmFtZTogc3RyaW5nKTogRW50cnkgfCB1bmRlZmluZWQge1xuICAgICAgICByZXR1cm4gdGhpcy5lbnRyaWVzLmZpbmQoeCA9PiB4Lm5hbWUgPT09IG5hbWUpO1xuICAgIH1cblxuICAgIHByb3RlY3RlZCBjcmVhdGVFbnRyeShuYW1lOiBzdHJpbmcsIHNvdXJjZTogc3RyaW5nKTogRW50cnkge1xuICAgICAgICBjb25zdCBhYnNvbHV0ZSA9IHJlc29sdmUodGhpcy5yb290RGlyLCBzb3VyY2UpO1xuICAgICAgICBuYW1lID0gbmFtZS5yZXBsYWNlKC9eWy5cXC9dKy8sICcnKTtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIG5hbWUsXG4gICAgICAgICAgICBzb3VyY2U6IGFic29sdXRlLFxuICAgICAgICAgICAgcmVsYXRpdmU6IHNvdXJjZS5yZXBsYWNlKC9eWy5cXC9dKy8sICcnKSxcbiAgICAgICAgICAgIGlzRXhjbHVkZWQ6IGZhbHNlLFxuICAgICAgICAgICAgaXNIVE1MOiAvXFwuaHRtbCQvaS50ZXN0KHNvdXJjZSksXG4gICAgICAgICAgICBvdXRwdXQ6IHRoaXMuZ2V0RXhwb3J0KG5hbWUsIHNvdXJjZSksXG4gICAgICAgICAgICBpc1R5cGVTY3JpcHQ6IC9cXC50c3g/JC9pLnRlc3Qoc291cmNlKSxcbiAgICAgICAgICAgIGlzSmF2YVNjcmlwdDogL1xcLmpzeD8kL2kudGVzdChzb3VyY2UpXG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBnZXRFeHBvcnQoZW50cnk6IHN0cmluZywgZmlsZTogc3RyaW5nKSB7XG4gICAgICAgIGNvbnN0IGV4dGVuc2lvbiA9IGZpbGUubWF0Y2goL1xcLihbXi5dKykkLylbMV07XG4gICAgICAgIGNvbnN0IGVudHJ5TmFtZSA9IGVudHJ5XG4gICAgICAgICAgICAucmVwbGFjZSgvXlxcLj9cXC8/LywgJycpXG4gICAgICAgICAgICAucmVwbGFjZSgvXFwuW14uXSskLywgJycpIHx8ICdpbmRleCc7XG4gICAgICAgIGNvbnN0IG91dEV4dCA9IGV4dGVuc2lvblxuICAgICAgICAgICAgLnJlcGxhY2UoL15banRdc3g/JC8sICdqcycpXG4gICAgICAgICAgICAucmVwbGFjZSgvXihsZXNzfGNzc3xzYXNzfHNjc3MpJC8sICdjc3MnKVxuICAgICAgICByZXR1cm4gYCR7ZW50cnlOYW1lfS4ke291dEV4dH1gO1xuICAgIH1cblxuICAgIHByaXZhdGUgc3RhdGljIEltcG9ydFByZWZpeDogc3RyaW5nID0gJy9fLyc7XG5cbiAgICBnZXQgcHVibGljUGF0aCgpOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gYCR7UGFjay5JbXBvcnRQcmVmaXh9JHt0aGlzLm5hbWV9YDtcbiAgICB9XG5cbn1cblxuZXhwb3J0IGNsYXNzIENoYW5nZUV2ZW50IGV4dGVuZHMgRXZlbnQge1xuICAgIHBheWxvYWQ7XG4gICAgZnJvbTtcblxuICAgIGNvbnN0cnVjdG9yKHBheWxvYWQsIGZyb20pIHtcbiAgICAgICAgc3VwZXIoJ2NoYW5nZScpO1xuICAgICAgICB0aGlzLnBheWxvYWQgPSBwYXlsb2FkO1xuICAgIH1cbn1cblxuZXhwb3J0IGNsYXNzIEZpbGVDaGFuZ2VFdmVudCBleHRlbmRzIEV2ZW50IHtcbiAgICBjb25zdHJ1Y3RvcihwdWJsaWMgZmlsZXM6IHN0cmluZ1tdKSB7XG4gICAgICAgIHN1cGVyKCdmaWxlJyk7XG4gICAgfVxuXG59XG5cbmV4cG9ydCB0eXBlIEVudHJ5ID0ge1xuICAgIG5hbWU6IHN0cmluZztcbiAgICBzb3VyY2U6IHN0cmluZztcbiAgICByZWxhdGl2ZTogc3RyaW5nO1xuICAgIGlzSFRNTDogYm9vbGVhbjtcbiAgICBpc0V4Y2x1ZGVkOiBib29sZWFuO1xuICAgIG91dHB1dDogc3RyaW5nO1xuICAgIGlzVHlwZVNjcmlwdDogYm9vbGVhbjtcbiAgICBpc0phdmFTY3JpcHQ6IGJvb2xlYW47XG4gICAgLy8gY29tcGlsZWRQYXRoOiBzdHJpbmc7XG4gICAgLy8gdHlwaW5nc1BhdGg6IHN0cmluZztcbn0iLCJpbXBvcnQgdHMsIHtDb21waWxlck9wdGlvbnN9IGZyb20gXCJ0eXBlc2NyaXB0XCI7XG5pbXBvcnQgcGF0aCBmcm9tIFwibm9kZTpwYXRoXCI7XG5pbXBvcnQge2ZpbGVVUkxUb1BhdGh9IGZyb20gXCJub2RlOnVybFwiO1xuXG5leHBvcnQgZnVuY3Rpb24gZ2V0VFNDb25maWcoY29uZmlnUGF0aDogc3RyaW5nKSB7XG5cdGNvbnN0IHJlc3VsdCA9IHRzLnJlYWRDb25maWdGaWxlKGNvbmZpZ1BhdGgsIHRzLnN5cy5yZWFkRmlsZSk7XG5cdGlmIChyZXN1bHQuZXJyb3IpIHtcblx0XHRyZXR1cm4gbnVsbDtcblx0fVxuXHRpZiAocmVzdWx0LmNvbmZpZy5leHRlbmRzKXtcblx0XHRjb25zdCBleHRlbmRlZCA9IGdldFRTQ29uZmlnKHBhdGgucmVzb2x2ZShwYXRoLmRpcm5hbWUoY29uZmlnUGF0aCksIHJlc3VsdC5jb25maWcuZXh0ZW5kcykpID8/XG5cdFx0XHRnZXRUU0NvbmZpZyhmaWxlVVJMVG9QYXRoKGltcG9ydC5tZXRhLnJlc29sdmUocmVzdWx0LmNvbmZpZy5leHRlbmRzKSkpO1xuXHRcdGNvbnN0IG1lcmdlZCA9IG1lcmdlKFtleHRlbmRlZCwgcmVzdWx0LmNvbmZpZ10pO1xuXHRcdHJldHVybiAgbWVyZ2VkO1xuXHR9XG5cdHJldHVybiByZXN1bHQuY29uZmlnO1xufVxuXG5leHBvcnQgdHlwZSBUeXBlc2NyaXB0Q29uZmlnID0ge1xuXHRleHRlbmRzPzogc3RyaW5nO1xuXHRjb21waWxlck9wdGlvbnM/OiBDb21waWxlck9wdGlvbnM7XG5cdGV4Y2x1ZGU/OiBzdHJpbmdbXTtcblx0aW5jbHVkZT86IHN0cmluZ1tdO1xuXHRyZWZlcmVuY2VzPzogQXJyYXk8eyBwYXRoOiBzdHJpbmc7IH0+XG59XG5cbmZ1bmN0aW9uIG1lcmdlKHZhbHVlczogb2JqZWN0W10pe1xuXHRjb25zdCBrZXlzID0gbmV3IFNldCh2YWx1ZXMuZmxhdE1hcChPYmplY3Qua2V5cykpO1xuXHRjb25zdCByZXN1bHQgPSB7fTtcblx0Zm9yIChsZXQga2V5IG9mIGtleXMpIHtcblx0XHRjb25zdCB2ID0gdmFsdWVzLm1hcCh4ID0+IHhba2V5IGFzIGFueV0pLmZpbHRlcih4ID0+IHggIT09IHVuZGVmaW5lZCk7XG5cdFx0aWYgKHYubGVuZ3RoID09PSAwKVxuXHRcdFx0cmVzdWx0W2tleSBhcyBhbnldID0gdW5kZWZpbmVkO1xuXHRcdGVsc2UgaWYgKHYubGVuZ3RoID09PSAxKVxuXHRcdFx0cmVzdWx0W2tleSBhcyBhbnldID0gdlswXTtcblx0XHRlbHNlIGlmICh0eXBlb2Ygdi5hdCgtMSkgIT09IFwib2JqZWN0XCIgfHwgdi5hdCgtMSkgPT09IG51bGwgfHwgQXJyYXkuaXNBcnJheSh2LmF0KC0xKSkpXG5cdFx0XHRyZXN1bHRba2V5IGFzIGFueV0gPSB2LmF0KC0xKVxuXHRcdGVsc2Vcblx0XHRcdHJlc3VsdFtrZXkgYXMgYW55XSA9IG1lcmdlKHYpO1xuXHR9XG5cdHJldHVybiByZXN1bHQ7XG59IiwiaW1wb3J0IHtqb2luLCByZWxhdGl2ZX0gZnJvbSBcIm5vZGU6cGF0aFwiO1xuaW1wb3J0IGZzIGZyb20gXCJub2RlOmZzXCI7XG5pbXBvcnQge2ZpbGVVUkxUb1BhdGh9IGZyb20gXCJub2RlOnVybFwiO1xuaW1wb3J0IHtnZXRUU0NvbmZpZywgVHlwZXNjcmlwdENvbmZpZ30gZnJvbSBcIi4uL2hlbHBlcnMvZ2V0VFNDb25maWcuanNcIjtcbmltcG9ydCB7RmxhZ3N9IGZyb20gXCIuL2ZsYWdzXCI7XG5pbXBvcnQge0NvbmZpZ30gZnJvbSBcIkBzd2MvY29yZVwiO1xuaW1wb3J0IHttaW5pbWF0Y2h9IGZyb20gJ21pbmltYXRjaCc7XG5pbXBvcnQge0VudHJ5LCBQYWNrfSBmcm9tIFwiLi9wYWNrXCI7XG5cbmV4cG9ydCBjbGFzcyBUYXJnZXQgZXh0ZW5kcyBQYWNrIHtcbiAgICBwdWJsaWMgcmVhZG9ubHkgcHVibGljRGlyID0gam9pbih0aGlzLnJvb3REaXIsICdwdWJsaWMnKTtcblxuICAgIGdldCBwdWJsaWNQYXRoKCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gICAgICAgIHJldHVybiB0aGlzLnBhY2thZ2VKc29uLmNvbmZpZz8ucHVibGljUGF0aCBhcyBzdHJpbmcgPz8gc3VwZXIucHVibGljUGF0aDtcbiAgICB9XG5cbiAgICBfdHNDb25maWc6IFR5cGVzY3JpcHRDb25maWc7XG4gICAgZ2V0IHRzQ29uZmlnKCk6IFR5cGVzY3JpcHRDb25maWcge1xuICAgICAgICByZXR1cm4gdGhpcy5fdHNDb25maWcgPz89IGdldFRTQ29uZmlnKGpvaW4odGhpcy5yb290RGlyLCAndHNjb25maWcuanNvbicpKTtcbiAgICB9XG5cbiAgICBpc0V4Y2x1ZGVkKGZpbGVOYW1lOiBzdHJpbmcsIGlzUmVsYXRpdmU6IGJvb2xlYW4gPSBmYWxzZSkge1xuICAgICAgICBpZiAoIWlzUmVsYXRpdmUpXG4gICAgICAgICAgICBmaWxlTmFtZSA9IHJlbGF0aXZlKHRoaXMucm9vdERpciwgZmlsZU5hbWUpO1xuICAgICAgICBpZiAoZmlsZU5hbWUuc3RhcnRzV2l0aCgnLi8nKSlcbiAgICAgICAgICAgIGZpbGVOYW1lID0gZmlsZU5hbWUuc3Vic3RyaW5nKDIpO1xuICAgICAgICBjb25zdCBjaGVjayA9IChwYXR0ZXJuOiBzdHJpbmcpID0+IHtcbiAgICAgICAgICAgIHJldHVybiBmaWxlTmFtZS5zdGFydHNXaXRoKHBhdHRlcm4pIHx8IG1pbmltYXRjaChmaWxlTmFtZSwgcGF0dGVybik7XG4gICAgICAgIH07XG4gICAgICAgIGNvbnN0IGluY2x1ZGUgPSB0aGlzLnRzQ29uZmlnLmluY2x1ZGUgPz8gW107XG4gICAgICAgIGlmIChpbmNsdWRlLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIGlmICghaW5jbHVkZS5zb21lKGNoZWNrKSlcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBleGNsdWRlID0gdGhpcy50c0NvbmZpZy5leGNsdWRlID8/IFsnZGlzdCcsICdub2RlX21vZHVsZXMnXTtcbiAgICAgICAgcmV0dXJuIGV4Y2x1ZGUuc29tZShjaGVjayk7XG4gICAgfVxuXG4gICAgZ2V0IHN3Y0NvbmZpZ1BhdGgoKXtcbiAgICAgICAgY29uc3QgbG9jYWwgPSBqb2luKHRoaXMucm9vdERpciwgJy5zd2NyYycpO1xuICAgICAgICBpZiAoZnMuZXhpc3RzU3luYyhsb2NhbCkpXG4gICAgICAgICAgICByZXR1cm4gbG9jYWw7XG4gICAgICAgIHJldHVybiBmaWxlVVJMVG9QYXRoKGltcG9ydC5tZXRhLnJlc29sdmUoJ0BjbW1uL3Rvb2xzL3N3Y3JjJykpO1xuICAgIH1cbiAgICBzd2NDb25maWdCYXNlO1xuXG4gICAgX3N3Y0NvbmZpZzogQ29uZmlnO1xuICAgIGdldCBzd2NDb25maWcoKTogQ29uZmlnIHtcbiAgICAgICAgdGhpcy5zd2NDb25maWdCYXNlID8/PSBKU09OLnBhcnNlKGZzLnJlYWRGaWxlU3luYyh0aGlzLnN3Y0NvbmZpZ1BhdGgsIHtcbiAgICAgICAgICAgIGVuY29kaW5nOiAndXRmLTgnXG4gICAgICAgIH0pKTtcbiAgICAgICAgY29uc3QgdHNDb25maWcgPSB0aGlzLnRzQ29uZmlnO1xuICAgICAgICByZXR1cm4gdGhpcy5fc3djQ29uZmlnID8/PSB7XG4gICAgICAgICAgICAuLi50aGlzLnN3Y0NvbmZpZ0Jhc2UsXG4gICAgICAgICAgICBqc2M6IHtcbiAgICAgICAgICAgICAgICAuLi50aGlzLnN3Y0NvbmZpZ0Jhc2UuanNjLFxuICAgICAgICAgICAgICAgIGJhc2VVcmw6IHRoaXMucm9vdERpcixcbiAgICAgICAgICAgICAgICBwYXRoczogdHNDb25maWcuY29tcGlsZXJPcHRpb25zPy5wYXRocyxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBtb2R1bGU6IHtcbiAgICAgICAgICAgICAgICB0eXBlOiAnZXM2JyxcbiAgICAgICAgICAgICAgICBzdHJpY3Q6IHRydWUsXG4gICAgICAgICAgICAgICAgc3RyaWN0TW9kZTogZmFsc2UsXG5cbiAgICAgICAgICAgICAgICByZXNvbHZlRnVsbHk6IHRydWVcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBzb3VyY2VNYXBzOiB0cnVlLFxuICAgICAgICAgICAgaW5saW5lU291cmNlc0NvbnRlbnQ6IGZhbHNlXG4gICAgICAgIH07XG4gICAgfVxuXG5cblxuICAgIGFzeW5jIGdldFB1Ymxpc2hQYWNrYWdlSnNvbigpIHtcbiAgICAgICAgY29uc3QgcGFja2FnZUpzb24gPSBKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KHRoaXMucGFja2FnZUpzb24pKTtcbiAgICAgICAgZm9yIChsZXQgZW50cnkgb2YgdGhpcy5lbnRyaWVzKSB7XG4gICAgICAgICAgICBpZiAoZW50cnkuaXNIVE1MIHx8IGVudHJ5LmlzRXhjbHVkZWQpIGNvbnRpbnVlO1xuICAgICAgICAgICAgY29uc3QgdHlwaW5ncyA9IGVudHJ5LmlzVHlwZVNjcmlwdCA/ICcuLycgKyBqb2luKCcuL2Rpc3QvdHlwaW5ncycsIHJlbGF0aXZlKHRoaXMucm9vdERpciwgZW50cnkuc291cmNlLnJlcGxhY2UoL1xcLnRzJC8sICcuZC50cycpKSkgOiB1bmRlZmluZWQ7XG4gICAgICAgICAgICBjb25zdCBidW5kbGUgPSBgLi9kaXN0L2J1bmRsZS8ke2VudHJ5Lm91dHB1dH1gO1xuICAgICAgICAgICAgaWYgKHBhY2thZ2VKc29uLmV4cG9ydHMpIHtcbiAgICAgICAgICAgICAgICBwYWNrYWdlSnNvbi5leHBvcnRzW2VudHJ5Lm5hbWUgPyBcIi4vXCIgKyBlbnRyeS5uYW1lIDogXCIuXCJdID0ge2RlZmF1bHQ6IGJ1bmRsZSwgdHlwaW5nc307XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHBhY2thZ2VKc29uLm1haW4gPSBidW5kbGU7XG4gICAgICAgICAgICAgICAgcGFja2FnZUpzb24udHlwaW5ncyA9IHR5cGluZ3M7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZGVsZXRlIHBhY2thZ2VKc29uLm1vZHVsZTtcbiAgICAgICAgZGVsZXRlIHBhY2thZ2VKc29uLmJyb3dzZXI7XG4gICAgICAgIGRlbGV0ZSBwYWNrYWdlSnNvbi5zY3JpcHRzO1xuICAgICAgICBkZWxldGUgcGFja2FnZUpzb24uZGV2RGVwZW5kZW5jaWVzO1xuICAgICAgICBpZiAoIXBhY2thZ2VKc29uLmZpbGVzKVxuICAgICAgICAgICAgcGFja2FnZUpzb24uZmlsZXMgPSBbJ2Rpc3QnXTtcbiAgICAgICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KHBhY2thZ2VKc29uLCBudWxsLCAnXFx0Jyk7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIGNyZWF0ZUVudHJ5KG5hbWU6IHN0cmluZywgc291cmNlOiBzdHJpbmcpOiBFbnRyeSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAuLi5zdXBlci5jcmVhdGVFbnRyeShuYW1lLCBzb3VyY2UpLFxuICAgICAgICAgICAgaXNFeGNsdWRlZDogdGhpcy5pc0V4Y2x1ZGVkKHNvdXJjZSwgdHJ1ZSlcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICBnZXQgaHR0cHMoKSB7XG4gICAgICAgIGNvbnN0IGhvc3QgPSB0aGlzLnBhY2thZ2VKc29uLmNvbmZpZz8uaG9zdDtcbiAgICAgICAgaWYgKCFob3N0KSByZXR1cm4gbnVsbDtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGhvc3QsXG4gICAgICAgICAgICBwb3J0OiB0aGlzLnBhY2thZ2VKc29uLmNvbmZpZy5wb3J0LFxuICAgICAgICAgICAgY2VydDogam9pbih0aGlzLnJvb3REaXIsIGBkaXN0LyR7aG9zdH0ucGVtYCksXG4gICAgICAgICAgICBrZXk6IGpvaW4odGhpcy5yb290RGlyLCBgZGlzdC8ke2hvc3R9LWtleS5wZW1gKSxcbiAgICAgICAgfVxuICAgIH1cblxuICAgIF9wcm94eTtcbiAgICBnZXQgcHJveHkoKTogQXJyYXk8eyByZWdleDogUmVnRXhwOyByZXBsYWNlIH0+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3Byb3h5ID8/PSBPYmplY3QuZW50cmllcyh7XG4gICAgICAgICAgICAuLi50aGlzLnBhY2thZ2VKc29uLmNvbmZpZz8ucHJveHkgYXMgYW55ID8/IHt9LFxuICAgICAgICB9KVxuICAgICAgICAgICAgLm1hcCgoW3JlZ2V4LCByZXBsYWNlXSkgPT4gKHtcbiAgICAgICAgICAgICAgICByZWdleDogbmV3IFJlZ0V4cChyZWdleCksXG4gICAgICAgICAgICAgICAgcmVwbGFjZVxuICAgICAgICAgICAgfSkpO1xuICAgIH1cblxufSIsImltcG9ydCB7UGFja30gZnJvbSBcIi4vcGFja1wiO1xuaW1wb3J0IHtGbGFnc30gZnJvbSBcIi4vZmxhZ3NcIjtcbmltcG9ydCB7VGFyZ2V0fSBmcm9tIFwiLi90YXJnZXRcIjtcblxuZXhwb3J0IGNsYXNzIFJlc29sdmVyIHtcbiAgICBiYXNlUGF0aDogc3RyaW5nID0gJyc7XG4gICAgY29uc3RydWN0b3IocHJpdmF0ZSByZWFkb25seSBwYWNrczogUGFja1tdLCBwcml2YXRlIGZsYWdzOiBGbGFncykge1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJlc29sdmUgaWQgdG8gYWJzb2x1dGUgcGF0aFxuICAgICAqIEBwYXJhbSBpZCAtIHJlbGF0aXZlIHBhdGg6IFwicmVhY3RcIiwgXCJyZWFjdC9qc3gtcnVudGltZS5qc1wiLCBcImxvcm8tY3JkdC9idW5kbGVyXCIsIFwibG9yby1jcmR0L2xvcm8ud2FzbVwiLi4uXG4gICAgICogQHBhcmFtIGltcG9ydGVyXG4gICAgICogQHBhcmFtIG9wdGlvbnNcbiAgICAgKi9cbiAgICBwdWJsaWMgcmVzb2x2ZUlkID0gKGlkOiBzdHJpbmcsIGltcG9ydGVyOiBzdHJpbmcgPSBudWxsLCBvcHRpb25zID0gbnVsbCkgPT4ge1xuICAgICAgICBpZiAob3B0aW9ucz8uaXNFbnRyeSkgcmV0dXJuO1xuICAgICAgICBjb25zdCBwYWNrID0gdGhpcy5nZXRQYWNrKGlkKTtcbiAgICAgICAgaWYgKCFwYWNrKSByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICByZXR1cm4gdGhpcy5yZXNvbHZlSW5QYWNrKHBhY2sucGFjaywgcGFjay5wYXRoLCBpbXBvcnRlciwgb3B0aW9ucyk7XG4gICAgfVxuXG4gICAgcHVibGljIHJlc29sdmVQYXRoKHBhdGg6IHN0cmluZywgaW1wb3J0ZXI6IHN0cmluZyA9IG51bGwsIG9wdGlvbnMgPSBudWxsKXtcbiAgICAgICAgY29uc3QgcGFjayA9IHRoaXMuZ2V0UGFjayhwYXRoKTtcbiAgICAgICAgaWYgKCFwYWNrKSByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICByZXR1cm4gdGhpcy5yZXNvbHZlV2l0aFByb3h5KHBhY2sucGFjaywgcGFjay5wYXRoLCBpbXBvcnRlciwgb3B0aW9ucykgPz8gcGFjaztcbiAgICB9XG5cbiAgICBwcml2YXRlIHJlc29sdmVXaXRoUHJveHkocGFjazogUGFjaywgcGF0aDogc3RyaW5nLCBpbXBvcnRlcjogc3RyaW5nID0gbnVsbCwgb3B0aW9uczogYW55ID0gbnVsbCl7XG4gICAgICAgIGlmIChwYWNrIGluc3RhbmNlb2YgVGFyZ2V0KSB7XG4gICAgICAgICAgICBmb3IgKGxldCBwcm94eSBvZiBwYWNrLnByb3h5KSB7XG4gICAgICAgICAgICAgICAgaWYgKHBhdGgubWF0Y2gocHJveHkucmVnZXgpKSB7XG4gICAgICAgICAgICAgICAgICAgIHBhdGggPSBwYXRoLnJlcGxhY2UocHJveHkucmVnZXgsIHByb3h5LnJlcGxhY2UpO1xuICAgICAgICAgICAgICAgICAgICBicmVha1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5yZXNvbHZlSW5QYWNrKHBhY2ssIHBhdGgsIGltcG9ydGVyLCBvcHRpb25zKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgcmVzb2x2ZUluUGFjayhwYWNrOiBQYWNrLCBpZDogc3RyaW5nLCBpbXBvcnRlcjogc3RyaW5nID0gbnVsbCwgb3B0aW9uczogYW55ID0gbnVsbCl7XG4gICAgICAgIGlmKG9wdGlvbnM/LmF0dHJpYnV0ZXM/LnJlc29sdmUpe1xuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICBleHRlcm5hbDogXCJhYnNvbHV0ZVwiIGFzIGJvb2xlYW4gfCBcImFic29sdXRlXCIgfCBcInJlbGF0aXZlXCIsXG4gICAgICAgICAgICAgICAgaWQ6IGAke3RoaXMuYmFzZVBhdGh9JHtwYWNrLnB1YmxpY1BhdGh9YCxcbiAgICAgICAgICAgICAgICBwYXRoOiAnJyxcbiAgICAgICAgICAgICAgICBlbnRyeTogbnVsbCxcbiAgICAgICAgICAgICAgICBwYWNrXG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgLy8gaWQgLSBhYnNvbHV0ZSBwYXRoIGluc2lkZSBwYWNrOiBcIlwiLCBcIi9pbmRleC50c1wiLCBcIi9zcmMvcGFnZS5odG1sXCIsIFwiL2J1bmRsZXJcIiwgXCIvbG9yby53YXNtXCJcbiAgICAgICAgY29uc3QgZW50cnkgPSBwYWNrLmdldEVudHJ5KGlkLnJlcGxhY2UoL15cXC8vLCcnKSk7XG4gICAgICAgIGlmICghZW50cnkpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCByZXNvbHZlZCA9ICghdGhpcy5mbGFncy5wcm9kdWN0aW9uICYmIHBhY2sgaW5zdGFuY2VvZiBUYXJnZXQpXG4gICAgICAgICAgICA/IGVudHJ5LnJlbGF0aXZlIDogZW50cnkub3V0cHV0O1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgZXh0ZXJuYWw6IFwiYWJzb2x1dGVcIiBhcyBib29sZWFuIHwgXCJhYnNvbHV0ZVwiIHwgXCJyZWxhdGl2ZVwiLFxuICAgICAgICAgICAgaWQ6IGAke3RoaXMuYmFzZVBhdGh9JHtwYWNrLnB1YmxpY1BhdGh9LyR7cmVzb2x2ZWR9YCxcbiAgICAgICAgICAgIHBhdGg6IHJlc29sdmVkLFxuICAgICAgICAgICAgZW50cnksXG4gICAgICAgICAgICBwYWNrXG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBnZXRQYWNrTmFtZXMoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnBhY2tzLm1hcCh4ID0+IHgubmFtZSk7XG4gICAgfVxuXG4gICAgcHVibGljIGdldFBhY2soaWQ6IHN0cmluZyk6IHsgcGFjazogUGFjaywgcGF0aDogc3RyaW5nIH0gfCB1bmRlZmluZWR7XG4gICAgICAgIGlmIChpZC5zdGFydHNXaXRoKHRoaXMuYmFzZVBhdGgpKVxuICAgICAgICAgICAgaWQgPSBpZC5zdWJzdHJpbmcodGhpcy5iYXNlUGF0aC5sZW5ndGgpO1xuICAgICAgICBmb3IgKGNvbnN0IHBhY2sgb2YgdGhpcy5wYWNrcykge1xuICAgICAgICAgICAgaWYgKHBhY2submFtZSA9PSBpZCkge1xuICAgICAgICAgICAgICAgIHJldHVybiB7IHBhY2ssIHBhdGg6ICcnIH07XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGlkLnN0YXJ0c1dpdGgocGFjay5uYW1lICsgJy8nKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiB7IHBhY2ssIHBhdGg6IGlkLnN1YnN0cmluZyhwYWNrLm5hbWUubGVuZ3RoICsgMSkgfTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoaWQgPT0gcGFjay5yb290RGlyKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHsgcGFjaywgcGF0aDogJycgfTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoaWQuc3RhcnRzV2l0aChwYWNrLnJvb3REaXIpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHsgcGFjaywgcGF0aDogaWQuc3Vic3RyaW5nKHBhY2sucm9vdERpci5sZW5ndGggKyAxKSB9O1xuICAgICAgICAgICAgfSBlbHNlIGlmIChpZCA9PSBwYWNrLnB1YmxpY1BhdGgpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4geyBwYWNrLCBwYXRoOiAnJyB9O1xuICAgICAgICAgICAgfSBlbHNlIGlmIChpZC5zdGFydHNXaXRoKHBhY2sucHVibGljUGF0aCArICcvJykpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4geyBwYWNrLCBwYXRoOiBpZC5zdWJzdHJpbmcocGFjay5wdWJsaWNQYXRoLmxlbmd0aCArIDEpIH07XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG59IiwiXG5leHBvcnQgY2xhc3MgRmxhZ3Mge1xuICAgIHN0YXRpYyBDdXJyZW50OiBGbGFncyA9IG5ldyBGbGFncyhbXSk7XG4gICAgd2F0Y2g/OiBib29sZWFuO1xuICAgIG1pbmlmeT86IGJvb2xlYW47XG4gICAgd29ya3NwYWNlPzogc3RyaW5nO1xuICAgIHVuc2FmZT86IGJvb2xlYW47XG4gICAgdmVyc2lvbj86IHN0cmluZztcbiAgICBjb21tYW5kPzogc3RyaW5nO1xuICAgIHByb2R1Y3Rpb24/OiBib29sZWFuO1xuICAgIGRlcGxveT8gPSB0aGlzLmFyZ3MuaW5jbHVkZXMoJy0tZGVwbG95Jyk7XG4gICAgb3V0ID0gdGhpcy5hcmdzLmluY2x1ZGVzKCctb3V0JylcbiAgICAgICAgPyB0aGlzLmFyZ3NbdGhpcy5hcmdzLmluZGV4T2YoJy1vdXQnKSArIDFdXG4gICAgICAgIDogJy5vdXQnO1xuXG4gICAgY29uc3RydWN0b3IocHVibGljIGFyZ3M/OiBzdHJpbmdbXSkge1xuICAgICAgICB0aGlzLmNvbW1hbmQgPSBhcmdzWzBdO1xuICAgICAgICB0aGlzLndhdGNoID0gYXJncy5pbmNsdWRlcygnLS13YXRjaCcpO1xuICAgICAgICB0aGlzLm1pbmlmeSA9IGFyZ3MuaW5jbHVkZXMoJy0tbWluaWZ5Jyk7XG4gICAgICAgIHRoaXMudW5zYWZlID0gYXJncy5pbmNsdWRlcygnLS11bnNhZmUnKTtcbiAgICAgICAgdGhpcy53b3Jrc3BhY2UgPSBhcmdzLmluY2x1ZGVzKCctdycpXG4gICAgICAgICAgICA/IGFyZ3NbYXJncy5pbmRleE9mKCctdycpICsgMV0gPz8gJy4nIDogdW5kZWZpbmVkO1xuICAgICAgICB0aGlzLnZlcnNpb24gPSB0aGlzLmNvbW1hbmQgPT09ICd2ZXJzaW9uJyA/IGFyZ3NbMV0gOiB1bmRlZmluZWRcbiAgICAgICAgdGhpcy5wcm9kdWN0aW9uID0gYXJncy5pbmNsdWRlcygnLS1wcm9kJyk7XG4gICAgICAgIGlmICh0aGlzLndvcmtzcGFjZT8uc3RhcnRzV2l0aCgnLS0nKSl7XG4gICAgICAgICAgICB0aGlzLndvcmtzcGFjZSA9IHVuZGVmaW5lZDtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGdldChhcmcpIHtcbiAgICAgICAgY29uc3QgaW5kZXggPSB0aGlzLmFyZ3MuaW5kZXhPZihgLS0ke2FyZ31gKTtcbiAgICAgICAgaWYgKGluZGV4ID09PSAtMSkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgcmV0dXJuIHRoaXMuYXJnc1tpbmRleCArIDFdO1xuICAgIH1cbn0iLCJpbXBvcnQge0VudHJ5LCBQYWNrfSBmcm9tIFwiLi9wYWNrXCI7XG5pbXBvcnQge1RhcmdldH0gZnJvbSBcIi4vdGFyZ2V0XCI7XG5pbXBvcnQge3JlYWRGaWxlfSBmcm9tIFwibm9kZTpmcy9wcm9taXNlc1wiO1xuaW1wb3J0IHBhdGggZnJvbSBcIm5vZGU6cGF0aFwiO1xuaW1wb3J0IHtzdWJ0bGV9IGZyb20gXCJjcnlwdG9cIjtcbmltcG9ydCB7c3RyaW5nfSBmcm9tIFwiZmFzdC1nbG9iL291dC91dGlsc1wiO1xuXG5leHBvcnQgY2xhc3MgQnVuZGxlIHtcbiAgICBjb25zdHJ1Y3Rvcihwcml2YXRlIHBhY2s6IFBhY2ssIHByaXZhdGUgb3V0cHV0OiBPdXRwdXRbXSkge1xuICAgIH1cblxuICAgIGZpbGVOYW1lcygpe1xuICAgICAgICByZXR1cm4gdGhpcy5vdXRwdXQubWFwKHggPT4geC5lbnRyeT8ub3V0cHV0ID8/IHguZmlsZU5hbWUpO1xuICAgIH1cblxuICAgIGdldChpZDogc3RyaW5nKXtcbiAgICAgICAgcmV0dXJuIHRoaXMub3V0cHV0LmZpbmQoeCA9PiB4LmZpbGVOYW1lID09IGlkIHx8IHguZW50cnk/Lm91dHB1dCA9PSBpZCk/LmRhdGE7XG4gICAgfVxuXG4gICAgYXN5bmMgZ2V0UHVibGljQXNzZXQoaWQ6IHN0cmluZyl7XG4gICAgICAgIGlmICghKHRoaXMucGFjayBpbnN0YW5jZW9mIFRhcmdldCkgfHwgIXRoaXMucGFjay5wdWJsaWNEaXIpIHtcbiAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlYWRGaWxlKHBhdGguam9pbih0aGlzLnBhY2sucHVibGljRGlyLCBpZCkpXG4gICAgfVxuXG4gICAgYXN5bmMgZ2V0QnVuZGxlSnNvbigpOiBQcm9taXNlPEJ1bmRsZUpzb24+e1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgYmFzZVVSSTogdGhpcy5wYWNrLnB1YmxpY1BhdGgsXG4gICAgICAgICAgICBhc3NldHM6IFtcbiAgICAgICAgICAgICAgICAuLi4oYXdhaXQgUHJvbWlzZS5hbGwodGhpcy5vdXRwdXQubWFwKG8gPT4gdGhpcy5nZXRPdXRwdXRBc3NldChvKSkpKSxcbiAgICAgICAgICAgIF0sXG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIGFzeW5jIGdldE91dHB1dEFzc2V0KG91dHB1dDogT3V0cHV0KTogUHJvbWlzZTxBc3NldD4ge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgcGF0aDogb3V0cHV0LmVudHJ5Py5vdXRwdXQgPz8gb3V0cHV0LmZpbGVOYW1lLFxuICAgICAgICAgICAgaGFzaDogYXdhaXQgZ2V0SGFzaChvdXRwdXQuZGF0YSksXG4gICAgICAgICAgICBzaXplOiBvdXRwdXQuZGF0YS5sZW5ndGgsXG4gICAgICAgICAgICByZWdleDogb3V0cHV0LmVudHJ5ICYmIHRoaXMucGFjayBpbnN0YW5jZW9mIFRhcmdldFxuICAgICAgICAgICAgICAgID8gdGhpcy5wYWNrLnByb3h5LmZpbmQoeCA9PiB4LnJlcGxhY2UgPT0gb3V0cHV0LmVudHJ5Lm5hbWUpPy5yZWdleC5zb3VyY2VcbiAgICAgICAgICAgICAgICA6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgIGRlcHM6IE9iamVjdC5mcm9tRW50cmllcyh0aGlzLmdldERlcHMob3V0cHV0KSksXG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlICpnZXREZXBzKG91dHB1dDogT3V0cHV0KTogR2VuZXJhdG9yPFtzdHJpbmcsIHN0cmluZ1tdXT57XG4gICAgICAgIGNvbnN0IGZsYXQgPSBvdXRwdXQuZGVwcy5tYXAoeCA9PiAoe1xuICAgICAgICAgICAgYmFzZVVSSTogeC5wYWNrID09PSB0aGlzLnBhY2sgPyBcIi5cIiA6IHgucGFjay5wdWJsaWNQYXRoLFxuICAgICAgICAgICAgcGF0aDogeC5wYXRoXG4gICAgICAgIH0pKTtcbiAgICAgICAgaWYgKHR5cGVvZiBvdXRwdXQuZGF0YSA9PT0gXCJzdHJpbmdcIil7XG4gICAgICAgICAgICBmb3IgKGxldCBmaWxlTmFtZSBvZiB0aGlzLmZpbGVOYW1lcygpKSB7XG4gICAgICAgICAgICAgICAgaWYgKG91dHB1dC5kYXRhLmluY2x1ZGVzKGBuZXcgVVJMKFwiJHtmaWxlTmFtZX1cImApKSB7XG4gICAgICAgICAgICAgICAgICAgIGZsYXQucHVzaCh7IGJhc2VVUkk6IFwiLlwiLCBwYXRoOiBmaWxlTmFtZSB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKG91dHB1dC5kYXRhLmluY2x1ZGVzKGBpbXBvcnQoXCIuLyR7ZmlsZU5hbWV9XCJgKSkge1xuICAgICAgICAgICAgICAgICAgICBmbGF0LnB1c2goeyBiYXNlVVJJOiBcIi5cIiwgcGF0aDogZmlsZU5hbWUgfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgZ3JvdXBlZCA9IE1hcC5ncm91cEJ5KGZsYXQsIHggPT4geC5iYXNlVVJJKTtcbiAgICAgICAgZm9yIChsZXQgW3VyaSwgZGVwc10gb2YgZ3JvdXBlZCkge1xuICAgICAgICAgICAgeWllbGQgW3VyaSwgQXJyYXkuZnJvbShuZXcgU2V0KGRlcHMubWFwKHggPT4geC5wYXRoKSkpXTtcbiAgICAgICAgfVxuICAgIH1cbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdldEhhc2goZGF0YTogc3RyaW5nIHwgVWludDhBcnJheSkge1xuICAgIGNvbnN0IGJ1ZmZlciA9IEJ1ZmZlci5mcm9tKGRhdGEpO1xuICAgIGNvbnN0IGhhc2ggPSBhd2FpdCBzdWJ0bGUuZGlnZXN0KCdTSEEtMScsIGJ1ZmZlcik7XG4gICAgcmV0dXJuIEJ1ZmZlci5mcm9tKGhhc2gpLnRvU3RyaW5nKCdiYXNlNjQnKTtcbn1cblxuZXhwb3J0IHR5cGUgT3V0cHV0ID0ge1xuICAgIGVudHJ5PzogRW50cnk7XG4gICAgZmlsZU5hbWU6IHN0cmluZztcbiAgICBkYXRhOiBzdHJpbmcgfCBVaW50OEFycmF5O1xuICAgIGRlcHM6IEFycmF5PHtcbiAgICAgICAgcGFjazogUGFjaztcbiAgICAgICAgcGF0aDogc3RyaW5nO1xuICAgIH0+XG59XG5leHBvcnQgdHlwZSBCdW5kbGVKc29uID0ge1xuICAgIGJhc2VVUkk6IHN0cmluZztcbiAgICBhc3NldHM6IEFzc2V0W107XG59XG5leHBvcnQgdHlwZSBBc3NldCA9IHtcbiAgICBwYXRoOiBzdHJpbmc7XG4gICAgcmVnZXg/OiBzdHJpbmc7XG4gICAgaGFzaDogc3RyaW5nO1xuICAgIHNpemU6IG51bWJlcjtcbiAgICBvcHRpb25hbD86IGJvb2xlYW47XG4gICAgZGVwczogUmVjb3JkPHN0cmluZywgc3RyaW5nW10+O1xufSIsImltcG9ydCBmcyBmcm9tIFwibm9kZTpmcy9wcm9taXNlc1wiO1xuaW1wb3J0IHtQbHVnaW59IGZyb20gXCJ2aXRlXCI7XG5pbXBvcnQge2Rpcm5hbWUsIHJlc29sdmV9IGZyb20gXCJub2RlOnBhdGhcIjtcblxuZXhwb3J0IGZ1bmN0aW9uIHdhc20ob3B0aW9uczoge1xuXHRlbWl0QXNzZXQ/OiBib29sZWFuXG5cdGFzc2V0TmFtZT86IHN0cmluZ1xufSA9IHt9KTogUGx1Z2lue1xuXHRyZXR1cm4ge1xuXHRcdG5hbWU6ICd3YXNtJyxcbiAgICAgICAgcmVzb2x2ZUlkKGlkLCBpbXBvcnRlcil7XG4gICAgICAgICAgICBpZiAoIS9cXC53YXNtJC8udGVzdChpZCkpIHJldHVybiBudWxsO1xuICAgICAgICAgICAgY29uc3QgbmFtZSA9IGlkLnNwbGl0KCcvJykucG9wKCk7XG4gICAgICAgICAgICBjb25zdCBtb2R1bGVJbmZvID0gdGhpcy5nZXRNb2R1bGVJbmZvKGltcG9ydGVyKTtcbiAgICAgICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgICAgIG1vZHVsZUluZm8uZHluYW1pY2FsbHlJbXBvcnRlZElkcy5wdXNoKG5hbWUpO1xuICAgICAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAgICAgbW9kdWxlSW5mby5pbXBvcnRlZElkcy5wdXNoKG5hbWUpO1xuICAgICAgICAgICAgcmV0dXJuIHJlc29sdmUoZGlybmFtZShpbXBvcnRlciksIGlkKTtcbiAgICAgICAgfSxcblx0XHRhc3luYyBsb2FkKGlkKSB7XG5cdFx0XHRpZiAoIS9cXC53YXNtJC8udGVzdChpZCkpIHJldHVybiBudWxsO1xuXHRcdFx0Y29uc3QgbmFtZSA9IGlkLnNwbGl0KCcvJykucG9wKCk7XG4gICAgICAgICAgICBsZXQgdXJsID1gbmV3IFVSTChcIi4vJHtuYW1lfT9uby1pbmxpbmVcIiwgaW1wb3J0Lm1ldGEudXJsKWA7XG5cdFx0XHRpZiAob3B0aW9ucy5lbWl0QXNzZXQpIHtcbiAgICAgICAgICAgICAgICBjb25zdCByZWZlcmVuY2VJZCA9IHRoaXMuZW1pdEZpbGUoe1xuXHRcdFx0XHRcdHR5cGU6ICdhc3NldCcsXG5cdFx0XHRcdFx0c291cmNlOiBhd2FpdCAodGhpcy5mcyA/PyBmcykucmVhZEZpbGUoaWQpLFxuXHRcdFx0XHRcdG5hbWU6IG9wdGlvbnMuYXNzZXROYW1lPy5yZXBsYWNlKCd7bmFtZX0nLCBuYW1lKSA/PyAnV0FTTSBBc3NldCcsXG5cdFx0XHRcdFx0ZmlsZU5hbWU6IG5hbWUsXG5cdFx0XHRcdH0pO1xuICAgICAgICAgICAgICAgIHVybCA9IGBpbXBvcnQubWV0YS5ST0xMVVBfRklMRV9VUkxfJHtyZWZlcmVuY2VJZH1gO1xuXHRcdFx0fVxuXHRcdFx0cmV0dXJuIHtcblx0XHRcdFx0bWFwOiB7XG5cdFx0XHRcdFx0bWFwcGluZ3M6ICcnXG5cdFx0XHRcdH0sXG5cblx0XHRcdFx0Y29kZTogW1xuXHRcdFx0XHRcdGBjb25zdCB1cmwgPSAke3VybH07YCxcblx0XHRcdFx0XHRgY29uc3QgYWIgPSBhd2FpdCBmZXRjaCh1cmwpLnRoZW4oeCA9PiB4LmFycmF5QnVmZmVyKCkpYCxcblx0XHRcdFx0XHRgZXhwb3J0IGRlZmF1bHQgbmV3IFdlYkFzc2VtYmx5Lk1vZHVsZShhYik7YFxuXHRcdFx0XHRdLmpvaW4oJ1xcbicpXG5cdFx0XHR9XG5cdFx0fVxuXHR9XG59O1xuIiwiaW1wb3J0IHttaW5pZnl9IGZyb20gXCJAc3djL2NvcmVcIjtcbmltcG9ydCB7IFBsdWdpbiB9IGZyb20gXCJ2aXRlXCI7XG5cbi8qKlxuICogQ3VzdG9tIHBsdWdpbiB0byBhcHBseSB0ZXJzZXIgZHVyaW5nIHRoZSBidW5kbGUgZ2VuZXJhdGlvbi4gVml0ZSBkb2Vzbid0IG1pbmlmeSBsaWJyYXJ5IEVTXG4gKiBtb2R1bGVzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gc3djTWluaWZ5UGx1Z2luKCk6IFBsdWdpbiB7XG5cdHJldHVybiB7XG5cdFx0bmFtZTogJ2N1c3RvbS10ZXJzZXInLFxuXHRcdGFzeW5jIHJlbmRlckNodW5rKGNvZGUsIGNodW5rKSB7XG5cdFx0XHQvLyBPbmx5IHByb2Nlc3MgSmF2YVNjcmlwdCBjaHVua3Ncblx0XHRcdGlmICghY2h1bmsuZmlsZU5hbWUuZW5kc1dpdGgoJy5tanMnKSAmJiAhY2h1bmsuZmlsZU5hbWUuZW5kc1dpdGgoJy5qcycpKSB7XG5cdFx0XHRcdHJldHVybiBudWxsO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBLZWVwIHRoZSByZXN1bHQgcmVhZGFibGUgZm9yIGRlYnVnZ2luZ1xuXHRcdFx0Y29uc3QgcmVzdWx0ID0gYXdhaXQgbWluaWZ5KGNvZGUsIHtcblx0XHRcdFx0Y29tcHJlc3M6IHtcblx0XHRcdFx0XHRkZWZhdWx0czogZmFsc2UsXG5cdFx0XHRcdFx0bW9kdWxlOiB0cnVlLFxuXHRcdFx0XHRcdGhvaXN0X3Byb3BzOiB0cnVlLFxuXHRcdFx0XHRcdHVudXNlZDogdHJ1ZSxcblx0XHRcdFx0XHRkZWFkX2NvZGU6IHRydWUsXG5cdFx0XHRcdH0sXG5cdFx0XHRcdGVjbWE6IDIwMTYsXG5cdFx0XHRcdG1vZHVsZTogdHJ1ZSxcblx0XHRcdFx0Zm9ybWF0OiB7XG5cdFx0XHRcdFx0Y29tbWVudHM6IGZhbHNlLFxuXHRcdFx0XHRcdGVjbWE6IDIwMTZcblx0XHRcdFx0fSxcblx0XHRcdH0pO1xuXG5cdFx0XHRyZXR1cm4gcmVzdWx0LmNvZGUgfHwgbnVsbDtcblx0XHR9LFxuXHR9O1xufSIsImltcG9ydCB7VGFyZ2V0fSBmcm9tIFwiLi4vbW9kZWwvdGFyZ2V0XCI7XG5pbXBvcnQge1Jlc29sdmVyfSBmcm9tIFwiLi4vbW9kZWwvcmVzb2x2ZXJcIjtcbmltcG9ydCB7SHRtbFRhZ0Rlc2NyaXB0b3IsIEluZGV4SHRtbFRyYW5zZm9ybUNvbnRleHQsIElubGluZUNvbmZpZywgUGx1Z2lufSBmcm9tIFwidml0ZVwiO1xuaW1wb3J0IGJ1aWx0aW5Nb2R1bGVzIGZyb20gXCJidWlsdGluLW1vZHVsZXNcIjtcbmltcG9ydCB7d2FzbX0gZnJvbSBcIi4vcGx1Z2lucy93YXNtXCI7XG5pbXBvcnQgc3djIGZyb20gXCJ1bnBsdWdpbi1zd2NcIjtcbmltcG9ydCB0c2NvbmZpZ1BhdGhzIGZyb20gXCJ2aXRlLXRzY29uZmlnLXBhdGhzXCI7XG5pbXBvcnQge2Rpcm5hbWV9IGZyb20gXCJub2RlOnBhdGhcIjtcbmltcG9ydCB7c3djTWluaWZ5UGx1Z2lufSBmcm9tIFwiLi9wbHVnaW5zL21pbmlmeVwiO1xuaW1wb3J0IHtGbGFnc30gZnJvbSBcIi4uL21vZGVsL2ZsYWdzXCI7XG5cbmV4cG9ydCBjbGFzcyBWaXRlQnVpbGRlciB7XG4gICAgY29uc3RydWN0b3IocHJvdGVjdGVkIHJlYWRvbmx5IHRhcmdldDogVGFyZ2V0LFxuICAgICAgICAgICAgICAgIHByb3RlY3RlZCByZWFkb25seSByZXNvbHZlcjogUmVzb2x2ZXIsXG4gICAgICAgICAgICAgICAgcHJvdGVjdGVkIHJlYWRvbmx5IGZsYWdzOiBGbGFncykge1xuXG4gICAgfVxuXG4gICAgYXN5bmMgZ2V0Q29uZmlnKCk6IFByb21pc2U8SW5saW5lQ29uZmlnPiB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICByb290OiB0aGlzLnRhcmdldC5yb290RGlyLFxuICAgICAgICAgICAgbG9nTGV2ZWw6ICdzaWxlbnQnLFxuICAgICAgICAgICAgbW9kZTogdGhpcy5mbGFncy5wcm9kdWN0aW9uID8gXCJwcm9kdWN0aW9uXCIgOiAnZGVidWcnLFxuICAgICAgICAgICAgb3B0aW1pemVEZXBzOiB7XG4gICAgICAgICAgICAgICAgbm9EaXNjb3Zlcnk6IHRydWUsXG4gICAgICAgICAgICAgICAgaW5jbHVkZTogW11cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBkZWZpbmU6IHtcbiAgICAgICAgICAgICAgICBwcm9jZXNzOiB7XG4gICAgICAgICAgICAgICAgICAgIGVudjoge1xuICAgICAgICAgICAgICAgICAgICAgICAgTk9ERV9FTlY6IHRoaXMuZmxhZ3MucHJvZHVjdGlvbiA/ICdwcm9kdWN0aW9uJyA6ICdkZXZlbG9wbWVudCdcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBodG1sOiB7fSxcbiAgICAgICAgICAgIGJhc2U6IHRoaXMudGFyZ2V0LnB1YmxpY1BhdGggKyAnLycsXG4gICAgICAgICAgICBidWlsZDoge1xuICAgICAgICAgICAgICAgIHRhcmdldDogJ2Jhc2VsaW5lLXdpZGVseS1hdmFpbGFibGUnLFxuICAgICAgICAgICAgICAgIGVtcHR5T3V0RGlyOiBmYWxzZSxcbiAgICAgICAgICAgICAgICByb2xsdXBPcHRpb25zOiB7XG4gICAgICAgICAgICAgICAgICAgIGV4dGVybmFsOiBbXG4gICAgICAgICAgICAgICAgICAgICAgICAuLi4odGhpcy5yZXNvbHZlciA/IFtdIDogdGhpcy50YXJnZXQuZGVwcy5tYXAoeCA9PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBSZWdFeHAoYF4ke3gubmFtZX1gLnJlcGxhY2UoJy8nLCAnXFxcXC8nKSlcbiAgICAgICAgICAgICAgICAgICAgICAgICkpLFxuICAgICAgICAgICAgICAgICAgICAgICAgLi4uYnVpbHRpbk1vZHVsZXMsXG4gICAgICAgICAgICAgICAgICAgICAgICAnZnNldmVudHMnLFxuICAgICAgICAgICAgICAgICAgICAgICAgL0BpZC9nLFxuICAgICAgICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgd3JpdGU6IGZhbHNlLFxuICAgICAgICAgICAgICAgIG1pbmlmeTogZmFsc2UsXG4gICAgICAgICAgICAgICAgc291cmNlbWFwOiB0aGlzLmZsYWdzLm1pbmlmeSA/IGZhbHNlIDogJ2lubGluZScsXG4gICAgICAgICAgICAgICAgY29tbW9uanNPcHRpb25zOiB7XG4gICAgICAgICAgICAgICAgICAgIHRyYW5zZm9ybU1peGVkRXNNb2R1bGVzOiB0cnVlXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBwbHVnaW5zOiBbLi4udGhpcy5nZXRQbHVnaW5zKCldLFxuICAgICAgICB9O1xuICAgIH1cblxuICAgICogZ2V0UGx1Z2lucygpOiBHZW5lcmF0b3I8UGx1Z2luPiB7XG4gICAgICAgIHlpZWxkIHdhc20oKTtcbiAgICAgICAgeWllbGQgc3djLnZpdGUodGhpcy50YXJnZXQuc3djQ29uZmlnKSBhcyB1bmtub3duIGFzIFBsdWdpbjtcbiAgICAgICAgeWllbGQgdHNjb25maWdQYXRocygpO1xuICAgICAgICBpZiAodGhpcy5yZXNvbHZlcikge1xuICAgICAgICAgICAgeWllbGQge1xuICAgICAgICAgICAgICAgIG5hbWU6IHRoaXMudGFyZ2V0LnBhY2thZ2VKc29uLm5hbWUgKyAnOnJlc29sdmVyJyxcbiAgICAgICAgICAgICAgICByZXNvbHZlSWQ6IHRoaXMucmVzb2x2ZXIucmVzb2x2ZUlkLFxuICAgICAgICAgICAgICAgIGVuZm9yY2U6ICdwcmUnLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgICB5aWVsZCB7XG4gICAgICAgICAgICBuYW1lOiBcImNtbW46aHRtbC1iYXNlLXRhZ1wiLFxuICAgICAgICAgICAgZW5mb3JjZTogJ3ByZScsXG4gICAgICAgICAgICB0cmFuc2Zvcm1JbmRleEh0bWw6IChfLCBjb25maWc6IEluZGV4SHRtbFRyYW5zZm9ybUNvbnRleHQpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBkaXIgPSB0aGlzLmZsYWdzLnByb2R1Y3Rpb24gPyAnJyA6IGRpcm5hbWUoY29uZmlnLnBhdGgpO1xuICAgICAgICAgICAgICAgIGNvbnN0IHJlc3VsdDogSHRtbFRhZ0Rlc2NyaXB0b3JbXSA9IFtcbiAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGFnOiBcImJhc2VcIixcbiAgICAgICAgICAgICAgICAgICAgICAgIGF0dHJzOiB7aHJlZjogYCR7dGhpcy50YXJnZXQucHVibGljUGF0aH0ke2Rpcn0vYH0sXG4gICAgICAgICAgICAgICAgICAgICAgICBjaGlsZHJlbjogJy8qKiBpbmplY3RlZCAqKi8nXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBdO1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLmZsYWdzLnByb2R1Y3Rpb24pIHtcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0LnB1c2goe1xuICAgICAgICAgICAgICAgICAgICAgICAgdGFnOiBcImxpbmtcIixcbiAgICAgICAgICAgICAgICAgICAgICAgIGF0dHJzOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVsOiAnbWFuaWZlc3QnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhyZWY6IGAke3RoaXMudGFyZ2V0LnB1YmxpY1BhdGh9L21hbmlmZXN0Lmpzb25gXG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICAgICAgfSxcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5mbGFncy5taW5pZnkpXG4gICAgICAgICAgICB5aWVsZCBzd2NNaW5pZnlQbHVnaW4oKTtcbiAgICAgICAgeWllbGQge1xuICAgICAgICAgICAgbmFtZTogXCJ1cmwtcmVzb2x2ZXJcIixcbiAgICAgICAgICAgIGVuZm9yY2U6ICdwcmUnLFxuICAgICAgICAgICAgcmVzb2x2ZUlkOiAoaWQsIGltcG9ydGVyLCBvcHRpb25zKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKGlkLmVuZHNXaXRoKCc/cmVzb2x2ZScpKXtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVzb2x2ZWQgPSB0aGlzLnJlc29sdmVyPy5yZXNvbHZlSWQoaWQuc3BsaXQoJz8nKVswXSwgaW1wb3J0ZXIsIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC4uLm9wdGlvbnMsXG4gICAgICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGVzOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLi4ub3B0aW9ucy5hdHRyaWJ1dGVzLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmU6IHRydWUsXG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVzb2x2ZWQgPyByZXNvbHZlZC5pZCArICc/cmVzb2x2ZScgOiBpZDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgbG9hZDogKGlkKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKGlkLmVuZHNXaXRoKCc/cmVzb2x2ZScpKXtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGBleHBvcnQgZGVmYXVsdCAke0pTT04uc3RyaW5naWZ5KGlkLnNwbGl0KCc/JylbMF0pfWA7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8vIHlpZWxkIGFuYWx5emVyKCk7XG4gICAgfVxuXG59XG4iLCJpbXBvcnQge1xuICAgIGJ1aWxkLFxuICAgIElubGluZUNvbmZpZyxcbn0gZnJvbSBcInZpdGVcIjtcbmltcG9ydCB7Um9sbHVwT3V0cHV0fSBmcm9tIFwicm9sbHVwXCI7XG5pbXBvcnQge0lCdW5kbGVyfSBmcm9tIFwiLi90eXBlc1wiO1xuaW1wb3J0IHtCdW5kbGUsIE91dHB1dH0gZnJvbSBcIi4uL21vZGVsL2J1bmRsZVwiO1xuaW1wb3J0IHtWaXRlQnVpbGRlcn0gZnJvbSBcIi4vdml0ZS5idWlsZGVyXCI7XG5cbmV4cG9ydCBjbGFzcyBWaXRlQnVuZGxlciBleHRlbmRzIFZpdGVCdWlsZGVyIGltcGxlbWVudHMgSUJ1bmRsZXIge1xuXG4gICAgYXN5bmMgZ2V0QnVuZGxlQ29uZmlnKCk6IFByb21pc2U8SW5saW5lQ29uZmlnPntcbiAgICAgICAgY29uc3QgY29uZmlnID0gYXdhaXQgdGhpcy5nZXRDb25maWcoKTtcbiAgICAgICAgY29uZmlnLmJ1aWxkLmxpYiA9IHtcbiAgICAgICAgICAgIGVudHJ5OiBPYmplY3QuZnJvbUVudHJpZXModGhpcy50YXJnZXQuZW50cmllc1xuICAgICAgICAgICAgICAgIC5maWx0ZXIoeCA9PiAheC5pc0V4Y2x1ZGVkKVxuICAgICAgICAgICAgICAgIC5tYXAoeCA9PiBbeC5uYW1lLCB4LnNvdXJjZV0pKSBhcyBhbnksXG4gICAgICAgICAgICBmaWxlTmFtZTogKGZvcm1hdCwgZW50cnlOYW1lKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKGVudHJ5TmFtZSA9PSAnJykgZW50cnlOYW1lID0gJ2luZGV4JztcbiAgICAgICAgICAgICAgICByZXR1cm4gZW50cnlOYW1lICsgJy5qcyc7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgZm9ybWF0czogWydlcyddLFxuICAgICAgICB9O1xuICAgICAgICBjb25maWcuYnVpbGQubW9kdWxlUHJlbG9hZCA9IGZhbHNlO1xuICAgICAgICByZXR1cm4gY29uZmlnO1xuICAgIH1cblxuICAgIHByaXZhdGUgYXN5bmMgY3JlYXRlQnVuZGxlKCk6IFByb21pc2U8Um9sbHVwT3V0cHV0W10+IHtcbiAgICAgICAgaWYgKCF0aGlzLnRhcmdldC5lbnRyaWVzLmxlbmd0aClcbiAgICAgICAgICAgIHJldHVybiBbXTtcbiAgICAgICAgY29uc3QgY29uZmlnID0gYXdhaXQgdGhpcy5nZXRCdW5kbGVDb25maWcoKTtcbiAgICAgICAgcmV0dXJuIGJ1aWxkKGNvbmZpZykuY2F0Y2goZXJyID0+IHtcbiAgICAgICAgICAgIHRoaXMudGFyZ2V0LmVycm9yKGVyci5tZXNzYWdlKTtcbiAgICAgICAgICAgIHJldHVybiBbXTtcbiAgICAgICAgfSkgYXMgUHJvbWlzZTxSb2xsdXBPdXRwdXRbXT47XG4gICAgfVxuICAgIHB1YmxpYyBhc3luYyBidW5kbGUoKTogUHJvbWlzZTxCdW5kbGU+e1xuICAgICAgICBjb25zdCByb2xsdXBPdXRwdXQgPSBhd2FpdCB0aGlzLmNyZWF0ZUJ1bmRsZSgpXG4gICAgICAgIGNvbnN0IG91dHB1dENodW5rcyA9IHJvbGx1cE91dHB1dC5mbGF0TWFwKHggPT4geC5vdXRwdXQpO1xuICAgICAgICBjb25zdCBlbnRyeU1hcCA9IG5ldyBNYXAodGhpcy50YXJnZXQuZW50cmllcy5tYXAoeCA9PiBbeC5yZWxhdGl2ZSwgeF0pKVxuICAgICAgICBjb25zdCBvdXRwdXRzID0gb3V0cHV0Q2h1bmtzLm1hcCh4ID0+IHtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgZmlsZU5hbWU6IHguZmlsZU5hbWUsXG4gICAgICAgICAgICAgICAgZW50cnk6IGVudHJ5TWFwLmdldCh4LmZpbGVOYW1lKSxcbiAgICAgICAgICAgICAgICBkYXRhOiAgeC50eXBlID09IFwiYXNzZXRcIiA/IHguc291cmNlIDogeC5jb2RlLFxuICAgICAgICAgICAgICAgIGRlcHM6IHgudHlwZSA9PSBcImFzc2V0XCIgPyBbXSA6IFtcbiAgICAgICAgICAgICAgICAgICAgLi4ueC5pbXBvcnRzLFxuICAgICAgICAgICAgICAgICAgICAuLi54LmR5bmFtaWNJbXBvcnRzXG4gICAgICAgICAgICAgICAgXS5maWx0ZXIoeCA9PiAhL15ub2RlOi8udGVzdCh4KSkubWFwKHBhdGggPT4gcGF0aC5yZXBsYWNlKC9eKFxcLlxcLlxcLykrLywnLycpKS5tYXAocGF0aCA9PiB0aGlzLnJlc29sdmVyPy5nZXRQYWNrKHBhdGgpID8/IHtcbiAgICAgICAgICAgICAgICAgICAgcGFjazogdGhpcy50YXJnZXQsXG4gICAgICAgICAgICAgICAgICAgIHBhdGg6IHBhdGhcbiAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgfSBhcyBPdXRwdXRcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiBuZXcgQnVuZGxlKHRoaXMudGFyZ2V0LCBvdXRwdXRzKTtcbiAgICB9XG5cbn1cbiIsImltcG9ydCB7Y3JjMzJ9IGZyb20gXCJub2RlOnpsaWJcIjtcbmltcG9ydCBmcyBmcm9tIFwibm9kZTpmcy9wcm9taXNlc1wiO1xuaW1wb3J0IHt3YXNtfSBmcm9tIFwiLi9wbHVnaW5zL3dhc21cIjtcbmltcG9ydCB7c3djTWluaWZ5UGx1Z2lufSBmcm9tIFwiLi9wbHVnaW5zL21pbmlmeVwiO1xuaW1wb3J0IHBhdGgsIHtqb2lufSBmcm9tIFwibm9kZTpwYXRoXCI7XG5pbXBvcnQge0J1bmRsZSwgT3V0cHV0fSBmcm9tIFwiLi4vbW9kZWwvYnVuZGxlXCI7XG5pbXBvcnQge0VudHJ5LCBQYWNrfSBmcm9tIFwiLi4vbW9kZWwvcGFja1wiO1xuaW1wb3J0IHtSZXNvbHZlcn0gZnJvbSBcIi4uL21vZGVsL3Jlc29sdmVyXCI7XG5pbXBvcnQge0ZsYWdzfSBmcm9tIFwiLi4vbW9kZWwvZmxhZ3NcIjtcbmltcG9ydCB7QnVpbGRPcHRpb25zfSBmcm9tIFwicm9sbGRvd25cIjtcbmltcG9ydCB7ZXNtRXh0ZXJuYWxSZXF1aXJlUGx1Z2lufSBmcm9tIFwicm9sbGRvd24vZXhwZXJpbWVudGFsXCI7XG5pbXBvcnQge0lCdW5kbGVyfSBmcm9tIFwiLi90eXBlc1wiO1xuaW1wb3J0IHtQbHVnaW59IGZyb20gXCJyb2xsZG93blwiO1xuZXhwb3J0IGNsYXNzIFJvbGxkb3duQnVuZGxlciBpbXBsZW1lbnRzIElCdW5kbGVye1xuICAgIGNvbnN0cnVjdG9yKHByaXZhdGUgcGFjazogUGFjayxcbiAgICAgICAgICAgICAgICBwcml2YXRlIHJlc29sdmVyOiBSZXNvbHZlcixcbiAgICAgICAgICAgICAgICBwcml2YXRlIGZsYWdzOiBGbGFncykge1xuICAgIH1cblxuICAgIHByaXZhdGUgYXN5bmMgZ2V0RmlsZUNvbnRlbnQoZW50cnk6IEVudHJ5KSB7XG4gICAgICAgIGNvbnN0IHRhcmdldCA9IGVudHJ5Lm5hbWUgPyBgJHt0aGlzLnBhY2submFtZX0vJHtlbnRyeS5uYW1lfWAgOiBgJHt0aGlzLnBhY2submFtZX1gO1xuICAgICAgICBpZiAodGhpcy5wYWNrLnBhY2thZ2VKc29uLnR5cGUgPT09IFwibW9kdWxlXCIpXG4gICAgICAgICAgICByZXR1cm4gYGV4cG9ydCAqIGZyb20gJyR7dGFyZ2V0fSc7YFxuICAgICAgICBjb25zdCBwa2cgPSBhd2FpdCBpbXBvcnQodGFyZ2V0LCBlbnRyeS5zb3VyY2UuZW5kc1dpdGgoJy5qc29uJykgPyB7XG4gICAgICAgICAgICB3aXRoOiB7XG4gICAgICAgICAgICAgICAgdHlwZTogJ2pzb24nXG4gICAgICAgICAgICB9XG4gICAgICAgIH0gOiB7fSk7XG4gICAgICAgIGNvbnN0IGtleXMgPSBPYmplY3Qua2V5cyhwa2cpLmZpbHRlcih4ID0+IHggIT09ICdkZWZhdWx0Jyk7XG4gICAgICAgIHJldHVybiBbXG4gICAgICAgICAgICBgaW1wb3J0ICogYXMgcmVzdWx0IGZyb20gJyR7dGFyZ2V0fSc7YCxcbiAgICAgICAgICAgIGBleHBvcnQgY29uc3QgeyAke2tleXMuam9pbignLCcpfSB9ID0gcmVzdWx0O2AsXG4gICAgICAgICAgICAoJ2RlZmF1bHQnIGluIHBrZykgPyAnZXhwb3J0IGRlZmF1bHQgcmVzdWx0LmRlZmF1bHQ7JyA6ICcnXG4gICAgICAgIF0uam9pbignXFxuJyk7XG4gICAgfVxuXG4gICAgZGlyID0gcGF0aC5qb2luKHByb2Nlc3MuY3dkKCksICcuL25vZGVfbW9kdWxlcy8uY21tbicpO1xuXG4gICAgYXN5bmMgZ2V0SW5wdXRzKCk6IFByb21pc2U8QXN5bmNEaXNwb3NhYmxlICYgUmVjb3JkPHN0cmluZywgc3RyaW5nPj4ge1xuICAgICAgICBjb25zdCByZXN1bHQ6IEFzeW5jRGlzcG9zYWJsZSAmIFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7XG4gICAgICAgICAgICBhc3luYyBbU3ltYm9sLmFzeW5jRGlzcG9zZV0oKSB7XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgZmlsZSBvZiBPYmplY3QudmFsdWVzKHRoaXMpKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgZmlsZSA9PT0gJ3N0cmluZycpXG4gICAgICAgICAgICAgICAgICAgICAgICBhd2FpdCBmcy5ybShmaWxlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgICAgIGZvciAobGV0IGVudHJ5IG9mIHRoaXMucGFjay5lbnRyaWVzKSB7XG4gICAgICAgICAgICBpZiAoZW50cnkuc291cmNlLm1hdGNoKC9cXC4oZFxcLnRzfGNzc3xzY3NzfHNhc3N8bGVzc3xzdHlsfHBjc3N8cG9zdGNzc3xodG1sKSQvKSlcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIGlmKGVudHJ5LnNvdXJjZS5pbmNsdWRlcygnKicpKSAvLyBUT0RPOiByZWFkIGFsbCBmaWxlc1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgY29uc3QgaWQgPSBjcmMzMihlbnRyeS5uYW1lICsgbmV3IERhdGUoKSArIE1hdGgucmFuZG9tKCkpO1xuICAgICAgICAgICAgY29uc3QgZmlsZSA9IGAke3RoaXMuZGlyfS8uJHtpZH0uanNgO1xuICAgICAgICAgICAgY29uc3QgY29udGVudCA9IGF3YWl0IHRoaXMuZ2V0RmlsZUNvbnRlbnQoZW50cnkpO1xuICAgICAgICAgICAgYXdhaXQgZnMubWtkaXIodGhpcy5kaXIsIHtyZWN1cnNpdmU6IHRydWV9KTtcbiAgICAgICAgICAgIGF3YWl0IGZzLndyaXRlRmlsZShmaWxlLCBjb250ZW50LCAndXRmLTgnKTtcbiAgICAgICAgICAgIHJlc3VsdFtlbnRyeS5uYW1lXSA9IGZpbGU7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICBwcml2YXRlIGdldENvbmZpZygpOiBCdWlsZE9wdGlvbnMge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgd3JpdGU6IGZhbHNlLFxuICAgICAgICAgICAgb3V0cHV0OiB7XG4gICAgICAgICAgICAgICAgZm9ybWF0OiAnZXNtJyxcbiAgICAgICAgICAgICAgICAvLyBjaHVua0ZpbGVOYW1lczogY2h1bmsgPT4gICdAXy8nICsgY2h1bmsubmFtZSArICcuanMnLFxuICAgICAgICAgICAgICAgIC8vIGFzc2V0RmlsZU5hbWVzOiBhc3NldCA9PiAgJ0BfLycgKyBhc3NldC5uYW1lICsgJy5qcycsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgZGVmaW5lOiB7XG4gICAgICAgICAgICAgICAgJ3Byb2Nlc3MuZW52Lk5PREVfRU5WJzogdGhpcy5mbGFncy5wcm9kdWN0aW9uID8gJ1wicHJvZHVjdGlvblwiJyA6ICdcImRldmVsb3BtZW50XCInXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgZXhwZXJpbWVudGFsOiB7fSxcbiAgICAgICAgICAgIHBsYXRmb3JtOiAnYnJvd3NlcicsXG4gICAgICAgICAgICByZXNvbHZlOiB7XG4gICAgICAgICAgICAgICAgbWFpbkZpZWxkczogW1xuICAgICAgICAgICAgICAgICAgICAnYnJvd3NlcicsXG4gICAgICAgICAgICAgICAgICAgICdtb2R1bGUnLFxuICAgICAgICAgICAgICAgICAgICAnbWFpbicsXG4gICAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBvcHRpbWl6YXRpb246IHtcbiAgICAgICAgICAgICAgICBpbmxpbmVDb25zdDogdGhpcy5mbGFncy5taW5pZnksXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgdHJlZXNoYWtlOiB0cnVlLFxuICAgICAgICAgICAgcGx1Z2luczogWy4uLnRoaXMuZ2V0UGx1Z2lucygpXVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy8gVE9ETzogRmlsdGVyIGhvb2sgaHR0cHM6Ly9yb2xsZG93bi5ycy9pbi1kZXB0aC93aHktcGx1Z2luLWhvb2stZmlsdGVyI3doZW4tdG8tdXNlLWZpbHRlcnNcbiAgICAqIGdldFBsdWdpbnMoKTogR2VuZXJhdG9yPFBsdWdpbj4ge1xuICAgICAgICB5aWVsZCB3YXNtKHtcbiAgICAgICAgICAgIGVtaXRBc3NldDogdHJ1ZSxcbiAgICAgICAgICAgIGFzc2V0TmFtZTogYHtuYW1lfWBcbiAgICAgICAgfSkgYXMgYW55O1xuICAgICAgICB5aWVsZCB7XG4gICAgICAgICAgICBuYW1lOiAncmVxdWlyZScsXG4gICAgICAgICAgICBsb2FkOiBpZCA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgcHJlZml4ID0gJ2J1aWx0aW46ZXNtLWV4dGVybmFsLXJlcXVpcmUtJztcbiAgICAgICAgICAgICAgICBpZiAoaWQuc3RhcnRzV2l0aChwcmVmaXgpKXtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVzb2x2ZWQgPSB0aGlzLnJlc29sdmVyLnJlc29sdmVJZChpZC5zdWJzdHJpbmcocHJlZml4Lmxlbmd0aCksIG51bGwsIG51bGwpXG4gICAgICAgICAgICAgICAgICAgIGlmIChyZXNvbHZlZClcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBgZXhwb3J0ICogZnJvbSBcIiR7cmVzb2x2ZWQuaWR9XCJgO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgICAgeWllbGQge1xuICAgICAgICAgICAgbmFtZTogJ2V4dGVybmFscycsXG4gICAgICAgICAgICByZXNvbHZlSWQ6IChpZCwgaW1wb3J0ZXIsIG9wdGlvbnMpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAob3B0aW9ucy5raW5kID09PSAncmVxdWlyZS1jYWxsJylcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIGNvbnN0IHJlc29sdmVkID0gdGhpcy5yZXNvbHZlci5yZXNvbHZlSWQoaWQsIGltcG9ydGVyLCBvcHRpb25zKTtcbiAgICAgICAgICAgICAgICBpZiAocmVzb2x2ZWQgJiYgcmVzb2x2ZWQucGFjayAhPT0gdGhpcy5wYWNrKVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVzb2x2ZWQ7XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgICAgIHlpZWxkIGVzbUV4dGVybmFsUmVxdWlyZVBsdWdpbih7XG4gICAgICAgICAgICBleHRlcm5hbDogdGhpcy5yZXNvbHZlci5nZXRQYWNrTmFtZXMoKS5maWx0ZXIoeCA9PiB4ICE9PSB0aGlzLnBhY2submFtZSksXG4gICAgICAgIH0pO1xuICAgICAgICBpZiAodGhpcy5mbGFncy5taW5pZnkpXG4gICAgICAgICAgICB5aWVsZCBzd2NNaW5pZnlQbHVnaW4oKSBhcyBhbnk7XG4gICAgfVxuXG4gICAgYXN5bmMgYnVuZGxlKCk6IFByb21pc2U8QnVuZGxlPiB7XG4gICAgICAgIGF3YWl0IHVzaW5nIGlucHV0ID0gYXdhaXQgdGhpcy5nZXRJbnB1dHMoKTtcbiAgICAgICAgaWYgKE9iamVjdC5rZXlzKGlucHV0KS5sZW5ndGggPT0gMClcbiAgICAgICAgICAgIHJldHVybiBuZXcgQnVuZGxlKHRoaXMucGFjaywgW10pO1xuICAgICAgICBjb25zdCB7YnVpbGR9ID0gYXdhaXQgaW1wb3J0KFwicm9sbGRvd25cIik7XG4gICAgICAgIGNvbnN0IGNvbmZpZyA9IHRoaXMuZ2V0Q29uZmlnKCk7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGJ1aWxkKHtcbiAgICAgICAgICAgIC4uLmNvbmZpZyxcbiAgICAgICAgICAgIGlucHV0XG4gICAgICAgIH0pLmNhdGNoKGVyciA9PiB7XG4gICAgICAgICAgICB0aGlzLnBhY2suZXJyb3IoZXJyLm1lc3NhZ2UpO1xuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICBvdXRwdXQ6IFtdXG4gICAgICAgICAgICB9O1xuICAgICAgICB9KTtcbiAgICAgICAgY29uc3Qgb3V0cHV0cyA9IHJlc3VsdC5vdXRwdXQubWFwKHggPT4gKHtcbiAgICAgICAgICAgIGZpbGVOYW1lOiB4LmZpbGVOYW1lLFxuICAgICAgICAgICAgZW50cnk6IHRoaXMucGFjay5nZXRFbnRyeSh4Lm5hbWUpLFxuICAgICAgICAgICAgZGF0YTogeC50eXBlID09IFwiYXNzZXRcIiA/IHguc291cmNlIDogeC5jb2RlLFxuICAgICAgICAgICAgZGVwczogeC50eXBlID09IFwiYXNzZXRcIiA/IFtdIDogW1xuICAgICAgICAgICAgICAgIC4uLnguaW1wb3J0cyxcbiAgICAgICAgICAgICAgICAuLi54LmR5bmFtaWNJbXBvcnRzXG4gICAgICAgICAgICBdLm1hcChwYXRoID0+IHRoaXMucmVzb2x2ZXIuZ2V0UGFjayhwYXRoKSA/PyB7XG4gICAgICAgICAgICAgICAgcGFjazogdGhpcy5wYWNrLFxuICAgICAgICAgICAgICAgIHBhdGg6IHBhdGhcbiAgICAgICAgICAgIH0pXG4gICAgICAgIH0gYXMgT3V0cHV0KSk7XG4gICAgICAgIHJldHVybiBuZXcgQnVuZGxlKHRoaXMucGFjaywgb3V0cHV0cyk7XG4gICAgfVxufSIsImltcG9ydCB7Z2V0UGFja2FnZXMsIFBhY2thZ2VzfSBmcm9tIFwiQG1hbnlwa2cvZ2V0LXBhY2thZ2VzXCI7XG5pbXBvcnQge0pTT05TY2hlbWFGb3JOUE1QYWNrYWdlSnNvbkZpbGVzfSBmcm9tIFwiQHNjaGVtYXN0b3JlL3BhY2thZ2VcIjtcbmltcG9ydCB7UGFja30gZnJvbSBcIi4vcGFja1wiO1xuaW1wb3J0IHtUYXJnZXR9IGZyb20gXCIuL3RhcmdldFwiO1xuaW1wb3J0IHtSZXNvbHZlcn0gZnJvbSBcIi4vcmVzb2x2ZXJcIjtcbmltcG9ydCB7RmxhZ3N9IGZyb20gXCIuL2ZsYWdzXCI7XG5pbXBvcnQge1ZpdGVCdW5kbGVyfSBmcm9tIFwiLi4vYnVuZGxlcnMvdml0ZS5idW5kbGVyXCI7XG5pbXBvcnQge1JvbGxkb3duQnVuZGxlcn0gZnJvbSBcIi4uL2J1bmRsZXJzL3JvbGxkb3duLWJ1bmRsZXJcIjtcblxuZXhwb3J0IGNsYXNzIE1vbm9yZXBvIHtcbiAgICBwdWJsaWMgc3RhdGljIGFzeW5jIGxvYWQoZmxhZ3M6IEZsYWdzID0gbmV3IEZsYWdzKFtdKSwgcm9vdERpcjogc3RyaW5nID0gcHJvY2Vzcy5jd2QoKSk6IFByb21pc2U8TW9ub3JlcG8+IHtcbiAgICAgICAgY29uc3QgbW9ub3JlcG9QYWNrYWdlcyA9IGF3YWl0IGdldFBhY2thZ2VzKHJvb3REaXIpO1xuICAgICAgICBjb25zdCBtb25vcmVwbyA9IG5ldyBNb25vcmVwb0xvYWRlcihtb25vcmVwb1BhY2thZ2VzKTtcbiAgICAgICAgYXdhaXQgbW9ub3JlcG8ubG9hZChmbGFncy5wcm9kdWN0aW9uKTtcbiAgICAgICAgcmV0dXJuIG5ldyBNb25vcmVwbyhtb25vcmVwby5yb290IGFzIFRhcmdldCwgbW9ub3JlcG8ucGFja3MsIGZsYWdzKTtcbiAgICB9XG4gICAgcHVibGljIHJlYWRvbmx5IHBhY2tzID0gQXJyYXkuZnJvbSh0aGlzLnBhY2tzTWFwLnZhbHVlcygpKSBhcyBQYWNrW107XG4gICAgcHJpdmF0ZSBjb25zdHJ1Y3RvcihyZWFkb25seSByb290OiBUYXJnZXQsXG4gICAgICAgICAgICAgICAgICAgICAgICBwcml2YXRlIHJlYWRvbmx5IHBhY2tzTWFwOiBNYXA8c3RyaW5nLFBhY2s+LFxuICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljIHJlYWRvbmx5IGZsYWdzOiBGbGFncykge1xuICAgICAgICBpZiAoZmxhZ3MuZGVwbG95KVxuICAgICAgICAgICAgdGhpcy5yZXNvbHZlciA9IG5ldyBSZXNvbHZlcih0aGlzLnBhY2tzLCB0aGlzLmZsYWdzKTtcbiAgICAgICAgdGhpcy5wYWNrcy5mb3JFYWNoKHggPT4geC5pbml0KGZsYWdzLCB0aGlzLnBhY2tzTWFwKSk7XG4gICAgICAgIHJvb3QuaW5pdChmbGFncywgdGhpcy5wYWNrc01hcCk7XG4gICAgfVxuXG4gICAgZ2V0IHRhcmdldHMoKXtcbiAgICAgICAgcmV0dXJuIEFycmF5LmZyb20odGhpcy5wYWNrcy52YWx1ZXMoKSkuZmlsdGVyKHggPT4geCBpbnN0YW5jZW9mIFRhcmdldCkgYXMgVGFyZ2V0W107XG4gICAgfVxuXG4gICAgZ2V0KGlkOiBzdHJpbmcpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucGFja3NNYXAuZ2V0KGlkKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgcmVhZG9ubHkgcmVzb2x2ZXI6IFJlc29sdmVyIHwgdW5kZWZpbmVkO1xuXG4gICAgcHVibGljIGNyZWF0ZUJ1bmRsZXIocGFjazogUGFjayl7XG4gICAgICAgIGlmIChwYWNrIGluc3RhbmNlb2YgVGFyZ2V0KVxuICAgICAgICAgICAgcmV0dXJuIG5ldyBWaXRlQnVuZGxlcihwYWNrLCB0aGlzLnJlc29sdmVyLCB0aGlzLmZsYWdzKTtcbiAgICAgICAgcmV0dXJuIG5ldyBSb2xsZG93bkJ1bmRsZXIocGFjaywgdGhpcy5yZXNvbHZlciwgdGhpcy5mbGFncylcbiAgICB9XG59XG5cbmNsYXNzIE1vbm9yZXBvTG9hZGVyIHtcblxuICAgIHBhY2tzID0gbmV3IE1hcDxzdHJpbmcsIFBhY2s+KCk7XG4gICAgcm9vdDogUGFjaztcblxuICAgIGNvbnN0cnVjdG9yKHByaXZhdGUgcmVhZG9ubHkgcGFja2FnZXM6IFBhY2thZ2VzKSB7XG4gICAgfVxuXG4gICAgYXN5bmMgbG9hZChwcm9kOiBib29sZWFuKXtcbiAgICAgICAgZm9yIChsZXQgcCBvZiB0aGlzLnBhY2thZ2VzLnBhY2thZ2VzKSB7XG4gICAgICAgICAgICBhd2FpdCB0aGlzLmV4cG9ydChwLnBhY2thZ2VKc29uLm5hbWUsIHAucGFja2FnZUpzb24udmVyc2lvbiwgcHJvZCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5yb290ID0gYXdhaXQgdGhpcy5leHBvcnQodGhpcy5wYWNrYWdlcy5yb290UGFja2FnZS5wYWNrYWdlSnNvbi5uYW1lLFxuICAgICAgICAgICAgdGhpcy5wYWNrYWdlcy5yb290UGFja2FnZS5wYWNrYWdlSnNvbi52ZXJzaW9uLCBwcm9kKTtcbiAgICAgICAgcmV0dXJuIEFycmF5LmZyb20odGhpcy5wYWNrcy52YWx1ZXMoKSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBhc3luYyBleHBvcnQobmFtZTogc3RyaW5nLCB2ZXJzaW9uOiBzdHJpbmcsIHByb2Q6IGJvb2xlYW4pe1xuICAgICAgICBpZiAodGhpcy5wYWNrcy5oYXMobmFtZSkpIHJldHVybiB0aGlzLnBhY2tzLmdldChuYW1lKTtcbiAgICAgICAgY29uc3QgcGtnID0gdGhpcy5nZXRQYWNrYWdlKG5hbWUpO1xuICAgICAgICBpZihwa2cpIHtcbiAgICAgICAgICAgIGNvbnN0IHBhY2sgPSBuZXcgVGFyZ2V0KHBrZy5kaXIsIHBrZy5wYWNrYWdlSnNvbilcbiAgICAgICAgICAgIHRoaXMucGFja3Muc2V0KG5hbWUsIHBhY2spO1xuICAgICAgICAgICAgZm9yIChsZXQgW25hbWUsIHZlcnNpb25dIG9mIHBhY2suZ2V0QWxsRGVwZW5kZW5jaWVzKHByb2QpKSB7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMucGFja3MuaGFzKG5hbWUpKSBjb250aW51ZTtcbiAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLmV4cG9ydChuYW1lLCB2ZXJzaW9uLCBwcm9kKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBwYWNrO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29uc3QgcGFjayA9IGF3YWl0IFBhY2sucmVhZChuYW1lLCB2ZXJzaW9uKTtcbiAgICAgICAgICAgIHRoaXMucGFja3Muc2V0KG5hbWUsIHBhY2spO1xuICAgICAgICAgICAgcmV0dXJuIHBhY2s7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIGdldFBhY2thZ2UobmFtZTogc3RyaW5nKTogUGFja2FnZSB8IHVuZGVmaW5lZCB7XG4gICAgICAgIGNvbnN0IHAgPSB0aGlzLnBhY2thZ2VzLnJvb3RQYWNrYWdlLnBhY2thZ2VKc29uLm5hbWUgPT0gbmFtZVxuICAgICAgICAgICAgPyB0aGlzLnBhY2thZ2VzLnJvb3RQYWNrYWdlXG4gICAgICAgICAgICA6IHRoaXMucGFja2FnZXMucGFja2FnZXMuZmluZCh4ID0+IHgucGFja2FnZUpzb24ubmFtZSA9PSBuYW1lKTtcbiAgICAgICAgcmV0dXJuIHAgJiYge1xuICAgICAgICAgICAgZGlyOiBwLmRpcixcbiAgICAgICAgICAgIHBhY2thZ2VKc29uOiBwLnBhY2thZ2VKc29uIGFzIEpTT05TY2hlbWFGb3JOUE1QYWNrYWdlSnNvbkZpbGVzLFxuICAgICAgICAgICAgdmVyc2lvbjogcC5wYWNrYWdlSnNvbi52ZXJzaW9uLFxuICAgICAgICB9O1xuICAgIH1cblxufVxudHlwZSBQYWNrYWdlID0ge1xuICAgIGRpcjogc3RyaW5nO1xuICAgIHBhY2thZ2VKc29uOiBKU09OU2NoZW1hRm9yTlBNUGFja2FnZUpzb25GaWxlcztcbiAgICB2ZXJzaW9uOiBzdHJpbmc7XG59XG4iXSwibmFtZXMiOlsiUGFjayIsIkV2ZW50VGFyZ2V0IiwicmVhZCIsImlkIiwidmVyc2lvbiIsImRpciIsInByb2Nlc3MiLCJjd2QiLCJwa2dEaXIiLCJqb2luIiwic3RhdCIsImpzb24iLCJKU09OIiwicGFyc2UiLCJyZWFkRmlsZSIsImVuY29kaW5nIiwiZGlybmFtZSIsImdldEFsbERlcGVuZGVuY2llcyIsInByb2QiLCJPYmplY3QiLCJlbnRyaWVzIiwicGFja2FnZUpzb24iLCJkZXBlbmRlbmNpZXMiLCJkZXZEZXBlbmRlbmNpZXMiLCJyb290RGlyIiwicmVhY3Rpb25zIiwiaW5pdCIsImZsYWdzIiwicGFja3NNYXAiLCJkZXBzIiwia2V5cyIsInByb2R1Y3Rpb24iLCJwdXNoIiwibWFwIiwieCIsImdldCIsImZpbHRlciIsImZvckVhY2giLCJkZXAiLCJhZGRFdmVudExpc3RlbmVyIiwiZSIsImRpc3BhdGNoRXZlbnQiLCJDaGFuZ2VFdmVudCIsInBheWxvYWQiLCJmcm9tIiwiRmlsZUNoYW5nZUV2ZW50IiwiaXNTZXJ2ZXIiLCJjb25maWciLCJzZXJ2ZXIiLCJuYW1lIiwibG9nIiwidGV4dCIsInRlcm0iLCJ0ZXJtaW5hbEtpdCIsIlRlcm1pbmFsIiwiYmx1ZSIsIndoaXRlIiwiZXJyb3IiLCJ0b1N0cmluZyIsIl9lbnRyaWVzIiwiZXhwb3J0cyIsInJlc3VsdCIsIml0ZW0iLCJzdGFydHNXaXRoIiwiaW1wb3J0RmlsZSIsImRlZmF1bHQiLCJyZXF1aXJlIiwiaW1wb3J0IiwiY3JlYXRlRW50cnkiLCJlbnRyeSIsIm1vZHVsZSIsIm1haW4iLCJicm93c2VyIiwiZ2V0RW50cnkiLCJmaW5kIiwic291cmNlIiwiYWJzb2x1dGUiLCJyZXNvbHZlIiwicmVwbGFjZSIsInJlbGF0aXZlIiwiaXNFeGNsdWRlZCIsImlzSFRNTCIsInRlc3QiLCJvdXRwdXQiLCJnZXRFeHBvcnQiLCJpc1R5cGVTY3JpcHQiLCJpc0phdmFTY3JpcHQiLCJmaWxlIiwiZXh0ZW5zaW9uIiwibWF0Y2giLCJlbnRyeU5hbWUiLCJvdXRFeHQiLCJJbXBvcnRQcmVmaXgiLCJwdWJsaWNQYXRoIiwiRXZlbnQiLCJmaWxlcyIsImdldFRTQ29uZmlnIiwiY29uZmlnUGF0aCIsInRzIiwicmVhZENvbmZpZ0ZpbGUiLCJzeXMiLCJleHRlbmRzIiwiZXh0ZW5kZWQiLCJwYXRoIiwiZmlsZVVSTFRvUGF0aCIsIm1lcmdlZCIsIm1lcmdlIiwidmFsdWVzIiwiU2V0IiwiZmxhdE1hcCIsImtleSIsInYiLCJ1bmRlZmluZWQiLCJsZW5ndGgiLCJhdCIsIkFycmF5IiwiaXNBcnJheSIsIlRhcmdldCIsInRzQ29uZmlnIiwiX3RzQ29uZmlnIiwiZmlsZU5hbWUiLCJpc1JlbGF0aXZlIiwic3Vic3RyaW5nIiwiY2hlY2siLCJwYXR0ZXJuIiwibWluaW1hdGNoIiwiaW5jbHVkZSIsInNvbWUiLCJleGNsdWRlIiwic3djQ29uZmlnUGF0aCIsImxvY2FsIiwiZnMiLCJleGlzdHNTeW5jIiwic3djQ29uZmlnIiwic3djQ29uZmlnQmFzZSIsInJlYWRGaWxlU3luYyIsIl9zd2NDb25maWciLCJqc2MiLCJiYXNlVXJsIiwicGF0aHMiLCJjb21waWxlck9wdGlvbnMiLCJ0eXBlIiwic3RyaWN0Iiwic3RyaWN0TW9kZSIsInJlc29sdmVGdWxseSIsInNvdXJjZU1hcHMiLCJpbmxpbmVTb3VyY2VzQ29udGVudCIsImdldFB1Ymxpc2hQYWNrYWdlSnNvbiIsInN0cmluZ2lmeSIsInR5cGluZ3MiLCJidW5kbGUiLCJzY3JpcHRzIiwiaHR0cHMiLCJob3N0IiwicG9ydCIsImNlcnQiLCJwcm94eSIsIl9wcm94eSIsInJlZ2V4IiwiUmVnRXhwIiwicHVibGljRGlyIiwiUmVzb2x2ZXIiLCJwYWNrcyIsImJhc2VQYXRoIiwicmVzb2x2ZUlkIiwiaW1wb3J0ZXIiLCJvcHRpb25zIiwiaXNFbnRyeSIsInBhY2siLCJnZXRQYWNrIiwicmVzb2x2ZUluUGFjayIsInJlc29sdmVQYXRoIiwicmVzb2x2ZVdpdGhQcm94eSIsImF0dHJpYnV0ZXMiLCJleHRlcm5hbCIsInJlc29sdmVkIiwiZ2V0UGFja05hbWVzIiwiRmxhZ3MiLCJDdXJyZW50IiwiYXJncyIsImRlcGxveSIsImluY2x1ZGVzIiwib3V0IiwiaW5kZXhPZiIsImNvbW1hbmQiLCJ3YXRjaCIsIm1pbmlmeSIsInVuc2FmZSIsIndvcmtzcGFjZSIsImFyZyIsImluZGV4IiwiQnVuZGxlIiwiZmlsZU5hbWVzIiwiZGF0YSIsImdldFB1YmxpY0Fzc2V0IiwiZ2V0QnVuZGxlSnNvbiIsImJhc2VVUkkiLCJhc3NldHMiLCJQcm9taXNlIiwiYWxsIiwibyIsImdldE91dHB1dEFzc2V0IiwiaGFzaCIsImdldEhhc2giLCJzaXplIiwiZnJvbUVudHJpZXMiLCJnZXREZXBzIiwiZmxhdCIsImdyb3VwZWQiLCJNYXAiLCJncm91cEJ5IiwidXJpIiwiYnVmZmVyIiwiQnVmZmVyIiwic3VidGxlIiwiZGlnZXN0Iiwid2FzbSIsInNwbGl0IiwicG9wIiwibW9kdWxlSW5mbyIsImdldE1vZHVsZUluZm8iLCJkeW5hbWljYWxseUltcG9ydGVkSWRzIiwiaW1wb3J0ZWRJZHMiLCJsb2FkIiwidXJsIiwiZW1pdEFzc2V0IiwicmVmZXJlbmNlSWQiLCJlbWl0RmlsZSIsImFzc2V0TmFtZSIsIm1hcHBpbmdzIiwiY29kZSIsInN3Y01pbmlmeVBsdWdpbiIsInJlbmRlckNodW5rIiwiY2h1bmsiLCJlbmRzV2l0aCIsImNvbXByZXNzIiwiZGVmYXVsdHMiLCJob2lzdF9wcm9wcyIsInVudXNlZCIsImRlYWRfY29kZSIsImVjbWEiLCJmb3JtYXQiLCJjb21tZW50cyIsIlZpdGVCdWlsZGVyIiwidGFyZ2V0IiwicmVzb2x2ZXIiLCJnZXRDb25maWciLCJyb290IiwibG9nTGV2ZWwiLCJtb2RlIiwib3B0aW1pemVEZXBzIiwibm9EaXNjb3ZlcnkiLCJkZWZpbmUiLCJlbnYiLCJOT0RFX0VOViIsImh0bWwiLCJiYXNlIiwiYnVpbGQiLCJlbXB0eU91dERpciIsInJvbGx1cE9wdGlvbnMiLCJidWlsdGluTW9kdWxlcyIsIndyaXRlIiwic291cmNlbWFwIiwiY29tbW9uanNPcHRpb25zIiwidHJhbnNmb3JtTWl4ZWRFc01vZHVsZXMiLCJwbHVnaW5zIiwiZ2V0UGx1Z2lucyIsInN3YyIsInZpdGUiLCJ0c2NvbmZpZ1BhdGhzIiwiZW5mb3JjZSIsInRyYW5zZm9ybUluZGV4SHRtbCIsIl8iLCJ0YWciLCJhdHRycyIsImhyZWYiLCJjaGlsZHJlbiIsInJlbCIsIlZpdGVCdW5kbGVyIiwiZ2V0QnVuZGxlQ29uZmlnIiwibGliIiwiZm9ybWF0cyIsIm1vZHVsZVByZWxvYWQiLCJjcmVhdGVCdW5kbGUiLCJjYXRjaCIsImVyciIsIm1lc3NhZ2UiLCJyb2xsdXBPdXRwdXQiLCJvdXRwdXRDaHVua3MiLCJlbnRyeU1hcCIsIm91dHB1dHMiLCJpbXBvcnRzIiwiZHluYW1pY0ltcG9ydHMiLCJSb2xsZG93bkJ1bmRsZXIiLCJnZXRGaWxlQ29udGVudCIsInBrZyIsIndpdGgiLCJnZXRJbnB1dHMiLCJTeW1ib2wiLCJhc3luY0Rpc3Bvc2UiLCJybSIsImNyYzMyIiwiRGF0ZSIsIk1hdGgiLCJyYW5kb20iLCJjb250ZW50IiwibWtkaXIiLCJyZWN1cnNpdmUiLCJ3cml0ZUZpbGUiLCJleHBlcmltZW50YWwiLCJwbGF0Zm9ybSIsIm1haW5GaWVsZHMiLCJvcHRpbWl6YXRpb24iLCJpbmxpbmVDb25zdCIsInRyZWVzaGFrZSIsInByZWZpeCIsImtpbmQiLCJlc21FeHRlcm5hbFJlcXVpcmVQbHVnaW4iLCJpbnB1dCIsIk1vbm9yZXBvIiwibW9ub3JlcG9QYWNrYWdlcyIsImdldFBhY2thZ2VzIiwibW9ub3JlcG8iLCJNb25vcmVwb0xvYWRlciIsInRhcmdldHMiLCJjcmVhdGVCdW5kbGVyIiwicGFja2FnZXMiLCJwIiwiZXhwb3J0Iiwicm9vdFBhY2thZ2UiLCJoYXMiLCJnZXRQYWNrYWdlIiwic2V0Il0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQU1PLE1BQU1BLGFBQWFDLFdBQUFBLENBQUFBO0FBQUFBLEVBQ3RCLGFBQWFDLElBQUFBLENBQUtDLEVBQUFBLEVBQVlDLFNBQWtCQyxHQUFBQSxHQUFNQyx3QkFBQUEsQ0FBUUMsS0FBRyxFQUFJO0FBQ2pFLElBQUEsT0FBT0YsR0FBQUEsRUFBSztBQUNSLE1BQUEsSUFBSTtBQUNBLFFBQUEsTUFBTUcsTUFBQUEsR0FBU0MsSUFBQUEsQ0FBS0osR0FBQUEsRUFBSyxjQUFBLEVBQWdCRixFQUFBQSxDQUFBQTtBQUN6QyxRQUFBLElBQUksTUFBTU8sSUFBQUEsQ0FBS0YsTUFBQUEsQ0FBQUEsRUFBUztBQUNwQixVQUFBLE1BQU1HLElBQUFBLEdBQU9DLEtBQUtDLEtBQUFBLENBQU0sTUFBTUMsU0FBU0wsSUFBQUEsQ0FBS0QsTUFBQUEsRUFBUSxjQUFBLENBQUEsRUFBaUI7QUFBQSxZQUFDTyxRQUFBQSxFQUFVO0FBQUEsV0FBTyxDQUFBLENBQUE7QUFLdkYsVUFBQSxPQUFPLElBQUlmLElBQUFBLENBQUtRLE1BQUFBLEVBQVFHLElBQUFBLENBQUFBO0FBQUFBLFFBQzVCO0FBQUEsTUFDSixD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