@cmmn/tools 3.0.0-alpha-1 → 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.
- package/dist/bundle/index.js +913 -0
- package/dist/bundle/test.js +32 -0
- package/dist/esm/bundlers/vite.builder.js +1 -1
- package/dist/esm/bundlers/vite.builder.js.map +1 -1
- package/dist/esm/commands/bundle.js +2 -0
- package/dist/esm/commands/bundle.js.map +1 -1
- package/dist/esm/commands/dev.js +1 -0
- package/dist/esm/commands/dev.js.map +1 -1
- package/dist/esm/model/monorepo.js +1 -1
- package/dist/esm/model/monorepo.js.map +1 -1
- package/dist/esm/model/pack.js +4 -1
- package/dist/esm/model/pack.js.map +1 -1
- package/dist/esm/specs/vite-bundler.specs.js +2 -0
- package/dist/esm/specs/vite-bundler.specs.js.map +1 -1
- package/package.json +2 -1
|
@@ -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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
|