@tscircuit/cli 0.1.7 → 0.1.9

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.
@@ -12,12 +12,28 @@ export const registerDev = (program: Command) => {
12
12
  program
13
13
  .command("dev")
14
14
  .description("Start development server for a snippet")
15
- .argument("<file>", "Path to the snippet file")
15
+ .argument("[file]", "Path to the snippet file")
16
16
  .option("-p, --port <number>", "Port to run server on", "3000")
17
17
  .action(async (file: string, options: { port: string }) => {
18
- const absolutePath = path.resolve(file)
19
- const fileDir = path.dirname(absolutePath)
20
18
  const port = parseInt(options.port)
19
+ let absolutePath: string
20
+
21
+ if (file) {
22
+ absolutePath = path.resolve(file)
23
+ } else {
24
+ const entrypointPath = path.resolve("index.tsx")
25
+ if (fs.existsSync(entrypointPath)) {
26
+ absolutePath = entrypointPath
27
+ console.log("No file provided. Using 'index.tsx' as the entrypoint.")
28
+ } else {
29
+ console.log(
30
+ "No entrypoint found. Run 'tsci init' to bootstrap a basic project.",
31
+ )
32
+ return
33
+ }
34
+ }
35
+
36
+ const fileDir = path.dirname(absolutePath)
21
37
 
22
38
  try {
23
39
  console.log("Installing types for imported snippets...")
@@ -0,0 +1,59 @@
1
+ import type { Command } from "commander"
2
+ import * as fs from "node:fs"
3
+ import * as path from "node:path"
4
+
5
+ export const registerInit = (program: Command) => {
6
+ program
7
+ .command("init")
8
+ .description("Initialize a new TSCircuit project in the current directory")
9
+ .action(() => {
10
+ const currentDir = process.cwd()
11
+
12
+ const indexFilePath = path.join(currentDir, "index.tsx")
13
+ const npmrcFilePath = path.join(currentDir, ".npmrc")
14
+
15
+ const indexContent = `
16
+ export default () => (
17
+ <board width="10mm" height="10mm">
18
+ <resistor
19
+ resistance="1k"
20
+ footprint="0402"
21
+ name="R1"
22
+ schX={3}
23
+ pcbX={3}
24
+ />
25
+ <capacitor
26
+ capacitance="1000pF"
27
+ footprint="0402"
28
+ name="C1"
29
+ schX={-3}
30
+ pcbX={-3}
31
+ />
32
+ <trace from=".R1 > .pin1" to=".C1 > .pin1" />
33
+ </board>
34
+ );
35
+ `
36
+
37
+ const npmrcContent = `
38
+ @tsci:registry=https://npm.tscircuit.com
39
+ `
40
+
41
+ if (!fs.existsSync(indexFilePath)) {
42
+ fs.writeFileSync(indexFilePath, indexContent.trimStart())
43
+ console.log(`Created: ${indexFilePath}`)
44
+ } else {
45
+ console.log(`Skipped: ${indexFilePath} already exists`)
46
+ }
47
+
48
+ if (!fs.existsSync(npmrcFilePath)) {
49
+ fs.writeFileSync(npmrcFilePath, npmrcContent.trimStart())
50
+ console.log(`Created: ${npmrcFilePath}`)
51
+ } else {
52
+ console.log(`Skipped: ${npmrcFilePath} already exists`)
53
+ }
54
+
55
+ console.log(
56
+ `Initialization complete. Run "tsci dev" to start developing.`,
57
+ )
58
+ })
59
+ }
package/cli/main.ts CHANGED
@@ -1,5 +1,6 @@
1
1
  #!/usr/bin/env node
2
2
  import { Command } from "commander"
3
+ import { registerInit } from "./init/register"
3
4
  import { registerDev } from "./dev/register"
4
5
  import { registerAuthLogin } from "./auth/login/register"
5
6
  import { registerAuthLogout } from "./auth/logout/register"
@@ -21,6 +22,8 @@ program
21
22
  // fix this at some point...
22
23
  .version(semver.inc(pkg.version, "patch") ?? pkg.version)
23
24
 
25
+ registerInit(program)
26
+
24
27
  registerDev(program)
25
28
  registerClone(program)
26
29
 
package/dist/main.js CHANGED
@@ -3,15 +3,66 @@
3
3
  // cli/main.ts
4
4
  import { Command } from "commander";
5
5
 
6
+ // cli/init/register.ts
7
+ import * as fs from "node:fs";
8
+ import * as path from "node:path";
9
+ var registerInit = (program2) => {
10
+ program2.command("init").description("Initialize a new TSCircuit project in the current directory").action(() => {
11
+ const currentDir = process.cwd();
12
+ const indexFilePath = path.join(currentDir, "index.tsx");
13
+ const npmrcFilePath = path.join(currentDir, ".npmrc");
14
+ const indexContent = `
15
+ export default () => (
16
+ <board width="10mm" height="10mm">
17
+ <resistor
18
+ resistance="1k"
19
+ footprint="0402"
20
+ name="R1"
21
+ schX={3}
22
+ pcbX={3}
23
+ />
24
+ <capacitor
25
+ capacitance="1000pF"
26
+ footprint="0402"
27
+ name="C1"
28
+ schX={-3}
29
+ pcbX={-3}
30
+ />
31
+ <trace from=".R1 > .pin1" to=".C1 > .pin1" />
32
+ </board>
33
+ );
34
+ `;
35
+ const npmrcContent = `
36
+ @tsci:registry=https://npm.tscircuit.com
37
+ `;
38
+ if (!fs.existsSync(indexFilePath)) {
39
+ fs.writeFileSync(indexFilePath, indexContent.trimStart());
40
+ console.log(`Created: ${indexFilePath}`);
41
+ } else {
42
+ console.log(`Skipped: ${indexFilePath} already exists`);
43
+ }
44
+ if (!fs.existsSync(npmrcFilePath)) {
45
+ fs.writeFileSync(npmrcFilePath, npmrcContent.trimStart());
46
+ console.log(`Created: ${npmrcFilePath}`);
47
+ } else {
48
+ console.log(`Skipped: ${npmrcFilePath} already exists`);
49
+ }
50
+ console.log(
51
+ `Initialization complete. Run "tsci dev" to start developing.`
52
+ );
53
+ });
54
+ };
55
+
6
56
  // cli/dev/register.ts
7
- import * as path4 from "node:path";
57
+ import * as path5 from "node:path";
58
+ import * as fs5 from "node:fs";
8
59
 
9
60
  // lib/dependency-analysis/installNodeModuleTypesForSnippet.ts
10
- import * as fs from "node:fs";
11
- import * as path from "node:path";
61
+ import * as fs2 from "node:fs";
62
+ import * as path2 from "node:path";
12
63
  import * as ts from "typescript";
13
64
  async function installNodeModuleTypesForSnippet(snippetPath) {
14
- const content = fs.readFileSync(snippetPath, "utf-8");
65
+ const content = fs2.readFileSync(snippetPath, "utf-8");
15
66
  const sourceFile = ts.createSourceFile(
16
67
  snippetPath,
17
68
  content,
@@ -32,12 +83,12 @@ async function installNodeModuleTypesForSnippet(snippetPath) {
32
83
  ts.forEachChild(node, visit);
33
84
  }
34
85
  visit(sourceFile);
35
- let projectRoot = path.dirname(snippetPath);
36
- while (projectRoot !== path.parse(projectRoot).root) {
37
- if (fs.existsSync(path.join(projectRoot, "package.json"))) {
86
+ let projectRoot = path2.dirname(snippetPath);
87
+ while (projectRoot !== path2.parse(projectRoot).root) {
88
+ if (fs2.existsSync(path2.join(projectRoot, "package.json"))) {
38
89
  break;
39
90
  }
40
- projectRoot = path.dirname(projectRoot);
91
+ projectRoot = path2.dirname(projectRoot);
41
92
  }
42
93
  for (const importPath of imports) {
43
94
  const [owner, name] = importPath.replace("@tsci/", "").split(".");
@@ -51,14 +102,14 @@ async function installNodeModuleTypesForSnippet(snippetPath) {
51
102
  }
52
103
  const data = await response.json();
53
104
  if (data.snippet.dts) {
54
- const packageDir = path.join(
105
+ const packageDir = path2.join(
55
106
  projectRoot,
56
107
  "node_modules",
57
108
  "@tsci",
58
109
  `${owner}.${name}`
59
110
  );
60
- fs.mkdirSync(packageDir, { recursive: true });
61
- fs.writeFileSync(path.join(packageDir, "index.d.ts"), data.snippet.dts);
111
+ fs2.mkdirSync(packageDir, { recursive: true });
112
+ fs2.writeFileSync(path2.join(packageDir, "index.d.ts"), data.snippet.dts);
62
113
  }
63
114
  } catch (error) {
64
115
  console.warn(`Error fetching types for ${importPath}:`, error);
@@ -71,8 +122,8 @@ import ky from "ky";
71
122
 
72
123
  // lib/server/createHttpServer.ts
73
124
  import * as http from "node:http";
74
- import * as fs2 from "node:fs";
75
- import * as path2 from "node:path";
125
+ import * as fs3 from "node:fs";
126
+ import * as path3 from "node:path";
76
127
  import { getNodeHandler } from "winterspec/adapters/node";
77
128
 
78
129
  // package.json
@@ -80,7 +131,7 @@ var package_default = {
80
131
  name: "@tscircuit/cli",
81
132
  main: "dist/main.js",
82
133
  type: "module",
83
- version: "0.1.6",
134
+ version: "0.1.8",
84
135
  bin: {
85
136
  tsci: "./dist/main.js"
86
137
  },
@@ -147,13 +198,13 @@ var createHttpServer = async (port = 3e3) => {
147
198
  const server = http.createServer(async (req, res) => {
148
199
  const url = new URL(req.url, `http://${req.headers.host}`);
149
200
  if (url.pathname === "/standalone.min.js") {
150
- const standaloneFilePath = process.env.RUNFRAME_STANDALONE_FILE_PATH || path2.resolve(
201
+ const standaloneFilePath = process.env.RUNFRAME_STANDALONE_FILE_PATH || path3.resolve(
151
202
  process.cwd(),
152
203
  "node_modules",
153
204
  "@tscircuit/runframe/dist/standalone.min.js"
154
205
  );
155
206
  try {
156
- const content = fs2.readFileSync(standaloneFilePath, "utf8");
207
+ const content = fs3.readFileSync(standaloneFilePath, "utf8");
157
208
  res.writeHead(200, {
158
209
  "Content-Type": "application/javascript; charset=utf-8"
159
210
  });
@@ -242,8 +293,8 @@ var EventsWatcher = class extends EventEmitter {
242
293
  };
243
294
 
244
295
  // cli/dev/DevServer.ts
245
- import path3 from "node:path";
246
- import fs3 from "node:fs";
296
+ import path4 from "node:path";
297
+ import fs4 from "node:fs";
247
298
  import * as chokidar from "chokidar";
248
299
  var DevServer = class {
249
300
  port;
@@ -276,7 +327,7 @@ var DevServer = class {
276
327
  }) {
277
328
  this.port = port;
278
329
  this.componentFilePath = componentFilePath;
279
- this.projectDir = path3.dirname(componentFilePath);
330
+ this.projectDir = path4.dirname(componentFilePath);
280
331
  this.fsKy = ky.create({
281
332
  prefixUrl: `http://localhost:${port}`
282
333
  });
@@ -305,7 +356,7 @@ var DevServer = class {
305
356
  this.upsertInitialFiles();
306
357
  }
307
358
  async addEntrypoint() {
308
- const relativeComponentFilePath = path3.relative(
359
+ const relativeComponentFilePath = path4.relative(
309
360
  this.projectDir,
310
361
  this.componentFilePath
311
362
  );
@@ -327,30 +378,30 @@ circuit.add(<MyCircuit />)
327
378
  const { file } = await this.fsKy.get("api/files/get", {
328
379
  searchParams: { file_path: ev.file_path }
329
380
  }).json();
330
- fs3.writeFileSync(
331
- path3.join(this.projectDir, "manual-edits.json"),
381
+ fs4.writeFileSync(
382
+ path4.join(this.projectDir, "manual-edits.json"),
332
383
  file.text_content
333
384
  );
334
385
  }
335
386
  }
336
387
  async handleFileChangedOnFilesystem(absoluteFilePath) {
337
- const relativeFilePath = path3.relative(this.projectDir, absoluteFilePath);
388
+ const relativeFilePath = path4.relative(this.projectDir, absoluteFilePath);
338
389
  if (relativeFilePath.includes("manual-edits.json")) return;
339
390
  await this.fsKy.post("api/files/upsert", {
340
391
  json: {
341
392
  file_path: relativeFilePath,
342
- text_content: fs3.readFileSync(absoluteFilePath, "utf-8"),
393
+ text_content: fs4.readFileSync(absoluteFilePath, "utf-8"),
343
394
  initiator: "filesystem_change"
344
395
  }
345
396
  }).json();
346
397
  }
347
398
  async upsertInitialFiles() {
348
- const fileNames = fs3.readdirSync(this.projectDir);
399
+ const fileNames = fs4.readdirSync(this.projectDir);
349
400
  for (const fileName of fileNames) {
350
- if (fs3.statSync(path3.join(this.projectDir, fileName)).isDirectory())
401
+ if (fs4.statSync(path4.join(this.projectDir, fileName)).isDirectory())
351
402
  continue;
352
- const fileContent = fs3.readFileSync(
353
- path3.join(this.projectDir, fileName),
403
+ const fileContent = fs4.readFileSync(
404
+ path4.join(this.projectDir, fileName),
354
405
  "utf-8"
355
406
  );
356
407
  await this.fsKy.post("api/files/upsert", {
@@ -370,10 +421,24 @@ circuit.add(<MyCircuit />)
370
421
 
371
422
  // cli/dev/register.ts
372
423
  var registerDev = (program2) => {
373
- program2.command("dev").description("Start development server for a snippet").argument("<file>", "Path to the snippet file").option("-p, --port <number>", "Port to run server on", "3000").action(async (file, options) => {
374
- const absolutePath = path4.resolve(file);
375
- const fileDir = path4.dirname(absolutePath);
424
+ program2.command("dev").description("Start development server for a snippet").argument("[file]", "Path to the snippet file").option("-p, --port <number>", "Port to run server on", "3000").action(async (file, options) => {
376
425
  const port = parseInt(options.port);
426
+ let absolutePath;
427
+ if (file) {
428
+ absolutePath = path5.resolve(file);
429
+ } else {
430
+ const entrypointPath = path5.resolve("index.tsx");
431
+ if (fs5.existsSync(entrypointPath)) {
432
+ absolutePath = entrypointPath;
433
+ console.log("No file provided. Using 'index.tsx' as the entrypoint.");
434
+ } else {
435
+ console.log(
436
+ "No entrypoint found. Run 'tsci init' to bootstrap a basic project."
437
+ );
438
+ return;
439
+ }
440
+ }
441
+ const fileDir = path5.dirname(absolutePath);
377
442
  try {
378
443
  console.log("Installing types for imported snippets...");
379
444
  await installNodeModuleTypesForSnippet(absolutePath);
@@ -500,8 +565,8 @@ var registerConfigPrint = (program2) => {
500
565
  };
501
566
 
502
567
  // cli/clone/register.ts
503
- import * as fs4 from "node:fs";
504
- import * as path5 from "node:path";
568
+ import * as fs6 from "node:fs";
569
+ import * as path6 from "node:path";
505
570
  var registerClone = (program2) => {
506
571
  program2.command("clone").description("Clone a snippet from the registry").argument("<snippet>", "Snippet to clone (e.g. author/snippetName)").action(async (snippetPath) => {
507
572
  let author;
@@ -531,8 +596,8 @@ var registerClone = (program2) => {
531
596
  }
532
597
  }).json();
533
598
  const dirPath = `./${author}.${snippetName}`;
534
- if (!fs4.existsSync(dirPath)) {
535
- fs4.mkdirSync(dirPath);
599
+ if (!fs6.existsSync(dirPath)) {
600
+ fs6.mkdirSync(dirPath);
536
601
  }
537
602
  for (const fileInfo of packageFileList.package_files) {
538
603
  const filePath = fileInfo.file_path.startsWith("/") ? fileInfo.file_path.slice(1) : fileInfo.file_path;
@@ -543,12 +608,12 @@ var registerClone = (program2) => {
543
608
  file_path: fileInfo.file_path
544
609
  }
545
610
  }).json();
546
- const fullPath = path5.join(dirPath, filePath);
547
- const dirName = path5.dirname(fullPath);
548
- if (!fs4.existsSync(dirName)) {
549
- fs4.mkdirSync(dirName, { recursive: true });
611
+ const fullPath = path6.join(dirPath, filePath);
612
+ const dirName = path6.dirname(fullPath);
613
+ if (!fs6.existsSync(dirName)) {
614
+ fs6.mkdirSync(dirName, { recursive: true });
550
615
  }
551
- fs4.writeFileSync(fullPath, fileContent.package_file.content_text);
616
+ fs6.writeFileSync(fullPath, fileContent.package_file.content_text);
552
617
  }
553
618
  console.log(`Successfully cloned to ./${author}.${snippetName}/`);
554
619
  } catch (error) {
@@ -570,8 +635,8 @@ import semver from "semver";
570
635
  import { createCircuitWebWorker } from "@tscircuit/eval-webworker";
571
636
  import webWorkerBundleUrl from "@tscircuit/eval-webworker/blob-url";
572
637
  import { getVirtualFileSystemFromDirPath } from "make-vfs";
573
- import path6 from "node:path";
574
- import fs5 from "node:fs";
638
+ import path7 from "node:path";
639
+ import fs7 from "node:fs";
575
640
  var ALLOWED_FORMATS = [
576
641
  "json",
577
642
  "circuit-json",
@@ -603,13 +668,13 @@ Supported formats: ${ALLOWED_FORMATS.join(",")}`
603
668
  );
604
669
  }
605
670
  if (!output) {
606
- output = path6.basename(file).replace(/\.[^.]+$/, "");
671
+ output = path7.basename(file).replace(/\.[^.]+$/, "");
607
672
  }
608
673
  const worker = await createCircuitWebWorker({
609
674
  webWorkerUrl: webWorkerBundleUrl
610
675
  });
611
- const projectDir = path6.dirname(file);
612
- const relativeComponentPath = path6.relative(projectDir, file);
676
+ const projectDir = path7.dirname(file);
677
+ const relativeComponentPath = path7.relative(projectDir, file);
613
678
  await worker.executeWithFsMap({
614
679
  entrypoint: "entrypoint.tsx",
615
680
  fsMap: {
@@ -626,11 +691,11 @@ circuit.add(<MyCircuit />)
626
691
  });
627
692
  await worker.renderUntilSettled();
628
693
  const circuitJson = await worker.getCircuitJson();
629
- const outputPath = path6.join(
694
+ const outputPath = path7.join(
630
695
  projectDir,
631
696
  `${output}${OUTPUT_EXTENSIONS[format]}`
632
697
  );
633
- fs5.writeFileSync(outputPath, JSON.stringify(circuitJson));
698
+ fs7.writeFileSync(outputPath, JSON.stringify(circuitJson));
634
699
  console.log(`Exported to ${outputPath}`);
635
700
  process.exit(0);
636
701
  });
@@ -639,6 +704,7 @@ circuit.add(<MyCircuit />)
639
704
  // cli/main.ts
640
705
  var program = new Command();
641
706
  program.name("tsci").description("CLI for developing tscircuit snippets").version(semver.inc(package_default.version, "patch") ?? package_default.version);
707
+ registerInit(program);
642
708
  registerDev(program);
643
709
  registerClone(program);
644
710
  registerAuth(program);
@@ -652,4 +718,4 @@ if (process.argv.length === 2) {
652
718
  } else {
653
719
  program.parse();
654
720
  }
655
- //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vY2xpL21haW4udHMiLCAiLi4vY2xpL2Rldi9yZWdpc3Rlci50cyIsICIuLi9saWIvZGVwZW5kZW5jeS1hbmFseXNpcy9pbnN0YWxsTm9kZU1vZHVsZVR5cGVzRm9yU25pcHBldC50cyIsICIuLi9jbGkvZGV2L0RldlNlcnZlci50cyIsICIuLi9saWIvc2VydmVyL2NyZWF0ZUh0dHBTZXJ2ZXIudHMiLCAiLi4vcGFja2FnZS5qc29uIiwgIi4uL2xpYi9zaXRlL2dldEluZGV4LnRzIiwgIi4uL2xpYi9zZXJ2ZXIvRXZlbnRzV2F0Y2hlci50cyIsICIuLi9saWIvY2xpLWNvbmZpZy9pbmRleC50cyIsICIuLi9jbGkvYXV0aC9sb2dpbi9yZWdpc3Rlci50cyIsICIuLi9saWIvcmVnaXN0cnktYXBpL2dldC1reS50cyIsICIuLi9jbGkvYXV0aC9sb2dvdXQvcmVnaXN0ZXIudHMiLCAiLi4vY2xpL2F1dGgvcmVnaXN0ZXIudHMiLCAiLi4vY2xpL2NvbmZpZy9yZWdpc3Rlci50cyIsICIuLi9jbGkvY29uZmlnL3ByaW50L3JlZ2lzdGVyLnRzIiwgIi4uL2NsaS9jbG9uZS9yZWdpc3Rlci50cyIsICIuLi9jbGkvZXhwb3J0L3JlZ2lzdGVyLnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyIjIS91c3IvYmluL2VudiBub2RlXG5pbXBvcnQgeyBDb21tYW5kIH0gZnJvbSBcImNvbW1hbmRlclwiXG5pbXBvcnQgeyByZWdpc3RlckRldiB9IGZyb20gXCIuL2Rldi9yZWdpc3RlclwiXG5pbXBvcnQgeyByZWdpc3RlckF1dGhMb2dpbiB9IGZyb20gXCIuL2F1dGgvbG9naW4vcmVnaXN0ZXJcIlxuaW1wb3J0IHsgcmVnaXN0ZXJBdXRoTG9nb3V0IH0gZnJvbSBcIi4vYXV0aC9sb2dvdXQvcmVnaXN0ZXJcIlxuaW1wb3J0IHsgcmVnaXN0ZXJBdXRoIH0gZnJvbSBcIi4vYXV0aC9yZWdpc3RlclwiXG5pbXBvcnQgeyByZWdpc3RlckNvbmZpZyB9IGZyb20gXCIuL2NvbmZpZy9yZWdpc3RlclwiXG5pbXBvcnQgeyByZWdpc3RlckNvbmZpZ1ByaW50IH0gZnJvbSBcIi4vY29uZmlnL3ByaW50L3JlZ2lzdGVyXCJcbmltcG9ydCB7IHJlZ2lzdGVyQ2xvbmUgfSBmcm9tIFwiLi9jbG9uZS9yZWdpc3RlclwiXG5pbXBvcnQgeyBwZXJmZWN0Q2xpIH0gZnJvbSBcInBlcmZlY3QtY2xpXCJcbmltcG9ydCBwa2cgZnJvbSBcIi4uL3BhY2thZ2UuanNvblwiXG5pbXBvcnQgc2VtdmVyIGZyb20gXCJzZW12ZXJcIlxuaW1wb3J0IHsgcmVnaXN0ZXJFeHBvcnQgfSBmcm9tIFwiLi9leHBvcnQvcmVnaXN0ZXJcIlxuXG5jb25zdCBwcm9ncmFtID0gbmV3IENvbW1hbmQoKVxuXG5wcm9ncmFtXG4gIC5uYW1lKFwidHNjaVwiKVxuICAuZGVzY3JpcHRpb24oXCJDTEkgZm9yIGRldmVsb3BpbmcgdHNjaXJjdWl0IHNuaXBwZXRzXCIpXG4gIC8vIEhBQ0s6IGF0IGJ1aWxkIHRpbWUgdGhlIHZlcnNpb24gaXMgb2xkLCB3ZSBuZWVkIHRvXG4gIC8vIGZpeCB0aGlzIGF0IHNvbWUgcG9pbnQuLi5cbiAgLnZlcnNpb24oc2VtdmVyLmluYyhwa2cudmVyc2lvbiwgXCJwYXRjaFwiKSA/PyBwa2cudmVyc2lvbilcblxucmVnaXN0ZXJEZXYocHJvZ3JhbSlcbnJlZ2lzdGVyQ2xvbmUocHJvZ3JhbSlcblxucmVnaXN0ZXJBdXRoKHByb2dyYW0pXG5yZWdpc3RlckF1dGhMb2dpbihwcm9ncmFtKVxucmVnaXN0ZXJBdXRoTG9nb3V0KHByb2dyYW0pXG5cbnJlZ2lzdGVyQ29uZmlnKHByb2dyYW0pXG5yZWdpc3RlckNvbmZpZ1ByaW50KHByb2dyYW0pXG5cbnJlZ2lzdGVyRXhwb3J0KHByb2dyYW0pXG5cbmlmIChwcm9jZXNzLmFyZ3YubGVuZ3RoID09PSAyKSB7XG4gIHBlcmZlY3RDbGkocHJvZ3JhbSwgcHJvY2Vzcy5hcmd2KVxufSBlbHNlIHtcbiAgcHJvZ3JhbS5wYXJzZSgpXG59XG4iLCAiaW1wb3J0IHR5cGUgeyBDb21tYW5kIH0gZnJvbSBcImNvbW1hbmRlclwiXG5pbXBvcnQgKiBhcyBwYXRoIGZyb20gXCJub2RlOnBhdGhcIlxuaW1wb3J0ICogYXMgY2hva2lkYXIgZnJvbSBcImNob2tpZGFyXCJcbmltcG9ydCAqIGFzIGZzIGZyb20gXCJub2RlOmZzXCJcbmltcG9ydCB7IGNyZWF0ZUh0dHBTZXJ2ZXIgfSBmcm9tIFwibGliL3NlcnZlci9jcmVhdGVIdHRwU2VydmVyXCJcbmltcG9ydCB7IGdldExvY2FsRmlsZURlcGVuZGVuY2llcyB9IGZyb20gXCJsaWIvZGVwZW5kZW5jeS1hbmFseXNpcy9nZXRMb2NhbEZpbGVEZXBlbmRlbmNpZXNcIlxuaW1wb3J0IHsgaW5zdGFsbE5vZGVNb2R1bGVUeXBlc0ZvclNuaXBwZXQgfSBmcm9tIFwiLi4vLi4vbGliL2RlcGVuZGVuY3ktYW5hbHlzaXMvaW5zdGFsbE5vZGVNb2R1bGVUeXBlc0ZvclNuaXBwZXRcIlxuaW1wb3J0IHsgRXZlbnRzV2F0Y2hlciB9IGZyb20gXCIuLi8uLi9saWIvc2VydmVyL0V2ZW50c1dhdGNoZXJcIlxuaW1wb3J0IHsgRGV2U2VydmVyIH0gZnJvbSBcIi4vRGV2U2VydmVyXCJcblxuZXhwb3J0IGNvbnN0IHJlZ2lzdGVyRGV2ID0gKHByb2dyYW06IENvbW1hbmQpID0+IHtcbiAgcHJvZ3JhbVxuICAgIC5jb21tYW5kKFwiZGV2XCIpXG4gICAgLmRlc2NyaXB0aW9uKFwiU3RhcnQgZGV2ZWxvcG1lbnQgc2VydmVyIGZvciBhIHNuaXBwZXRcIilcbiAgICAuYXJndW1lbnQoXCI8ZmlsZT5cIiwgXCJQYXRoIHRvIHRoZSBzbmlwcGV0IGZpbGVcIilcbiAgICAub3B0aW9uKFwiLXAsIC0tcG9ydCA8bnVtYmVyPlwiLCBcIlBvcnQgdG8gcnVuIHNlcnZlciBvblwiLCBcIjMwMDBcIilcbiAgICAuYWN0aW9uKGFzeW5jIChmaWxlOiBzdHJpbmcsIG9wdGlvbnM6IHsgcG9ydDogc3RyaW5nIH0pID0+IHtcbiAgICAgIGNvbnN0IGFic29sdXRlUGF0aCA9IHBhdGgucmVzb2x2ZShmaWxlKVxuICAgICAgY29uc3QgZmlsZURpciA9IHBhdGguZGlybmFtZShhYnNvbHV0ZVBhdGgpXG4gICAgICBjb25zdCBwb3J0ID0gcGFyc2VJbnQob3B0aW9ucy5wb3J0KVxuXG4gICAgICB0cnkge1xuICAgICAgICBjb25zb2xlLmxvZyhcIkluc3RhbGxpbmcgdHlwZXMgZm9yIGltcG9ydGVkIHNuaXBwZXRzLi4uXCIpXG4gICAgICAgIGF3YWl0IGluc3RhbGxOb2RlTW9kdWxlVHlwZXNGb3JTbmlwcGV0KGFic29sdXRlUGF0aClcbiAgICAgICAgY29uc29sZS5sb2coXCJUeXBlcyBpbnN0YWxsZWQgc3VjY2Vzc2Z1bGx5XCIpXG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBjb25zb2xlLndhcm4oXCJGYWlsZWQgdG8gaW5zdGFsbCB0eXBlczpcIiwgZXJyb3IpXG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHNlcnZlciA9IG5ldyBEZXZTZXJ2ZXIoe1xuICAgICAgICBwb3J0LFxuICAgICAgICBjb21wb25lbnRGaWxlUGF0aDogYWJzb2x1dGVQYXRoLFxuICAgICAgfSlcblxuICAgICAgYXdhaXQgc2VydmVyLnN0YXJ0KClcbiAgICAgIGF3YWl0IHNlcnZlci5hZGRFbnRyeXBvaW50KClcbiAgICB9KVxufVxuIiwgImltcG9ydCAqIGFzIGZzIGZyb20gXCJub2RlOmZzXCJcbmltcG9ydCAqIGFzIHBhdGggZnJvbSBcIm5vZGU6cGF0aFwiXG5pbXBvcnQgKiBhcyB0cyBmcm9tIFwidHlwZXNjcmlwdFwiXG5cbmludGVyZmFjZSBTbmlwcGV0QXBpUmVzcG9uc2Uge1xuICBzbmlwcGV0OiB7XG4gICAgZHRzOiBzdHJpbmdcbiAgfVxufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gaW5zdGFsbE5vZGVNb2R1bGVUeXBlc0ZvclNuaXBwZXQoc25pcHBldFBhdGg6IHN0cmluZykge1xuICBjb25zdCBjb250ZW50ID0gZnMucmVhZEZpbGVTeW5jKHNuaXBwZXRQYXRoLCBcInV0Zi04XCIpXG4gIGNvbnN0IHNvdXJjZUZpbGUgPSB0cy5jcmVhdGVTb3VyY2VGaWxlKFxuICAgIHNuaXBwZXRQYXRoLFxuICAgIGNvbnRlbnQsXG4gICAgdHMuU2NyaXB0VGFyZ2V0LkxhdGVzdCxcbiAgICB0cnVlLFxuICApXG5cbiAgY29uc3QgaW1wb3J0czogc3RyaW5nW10gPSBbXVxuXG4gIGZ1bmN0aW9uIHZpc2l0KG5vZGU6IHRzLk5vZGUpIHtcbiAgICBpZiAodHMuaXNJbXBvcnREZWNsYXJhdGlvbihub2RlKSkge1xuICAgICAgY29uc3QgbW9kdWxlU3BlY2lmaWVyID0gbm9kZS5tb2R1bGVTcGVjaWZpZXJcbiAgICAgIGlmIChtb2R1bGVTcGVjaWZpZXIgJiYgdHMuaXNTdHJpbmdMaXRlcmFsKG1vZHVsZVNwZWNpZmllcikpIHtcbiAgICAgICAgY29uc3QgaW1wb3J0UGF0aCA9IG1vZHVsZVNwZWNpZmllci50ZXh0XG4gICAgICAgIGlmIChpbXBvcnRQYXRoLnN0YXJ0c1dpdGgoXCJAdHNjaS9cIikpIHtcbiAgICAgICAgICBpbXBvcnRzLnB1c2goaW1wb3J0UGF0aClcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICB0cy5mb3JFYWNoQ2hpbGQobm9kZSwgdmlzaXQpXG4gIH1cblxuICB2aXNpdChzb3VyY2VGaWxlKVxuXG4gIGxldCBwcm9qZWN0Um9vdCA9IHBhdGguZGlybmFtZShzbmlwcGV0UGF0aClcbiAgd2hpbGUgKHByb2plY3RSb290ICE9PSBwYXRoLnBhcnNlKHByb2plY3RSb290KS5yb290KSB7XG4gICAgaWYgKGZzLmV4aXN0c1N5bmMocGF0aC5qb2luKHByb2plY3RSb290LCBcInBhY2thZ2UuanNvblwiKSkpIHtcbiAgICAgIGJyZWFrXG4gICAgfVxuICAgIHByb2plY3RSb290ID0gcGF0aC5kaXJuYW1lKHByb2plY3RSb290KVxuICB9XG5cbiAgZm9yIChjb25zdCBpbXBvcnRQYXRoIG9mIGltcG9ydHMpIHtcbiAgICBjb25zdCBbb3duZXIsIG5hbWVdID0gaW1wb3J0UGF0aC5yZXBsYWNlKFwiQHRzY2kvXCIsIFwiXCIpLnNwbGl0KFwiLlwiKVxuICAgIHRyeSB7XG4gICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGZldGNoKFxuICAgICAgICBgaHR0cHM6Ly9yZWdpc3RyeS1hcGkudHNjaXJjdWl0LmNvbS9zbmlwcGV0cy9nZXQ/b3duZXJfbmFtZT0ke293bmVyfSZ1bnNjb3BlZF9uYW1lPSR7bmFtZX1gLFxuICAgICAgKVxuXG4gICAgICBpZiAoIXJlc3BvbnNlLm9rKSB7XG4gICAgICAgIGNvbnNvbGUud2FybihgRmFpbGVkIHRvIGZldGNoIHR5cGVzIGZvciAke2ltcG9ydFBhdGh9YClcbiAgICAgICAgY29udGludWVcbiAgICAgIH1cblxuICAgICAgY29uc3QgZGF0YTogU25pcHBldEFwaVJlc3BvbnNlID0gYXdhaXQgcmVzcG9uc2UuanNvbigpXG5cbiAgICAgIGlmIChkYXRhLnNuaXBwZXQuZHRzKSB7XG4gICAgICAgIGNvbnN0IHBhY2thZ2VEaXIgPSBwYXRoLmpvaW4oXG4gICAgICAgICAgcHJvamVjdFJvb3QsXG4gICAgICAgICAgXCJub2RlX21vZHVsZXNcIixcbiAgICAgICAgICBcIkB0c2NpXCIsXG4gICAgICAgICAgYCR7b3duZXJ9LiR7bmFtZX1gLFxuICAgICAgICApXG4gICAgICAgIGZzLm1rZGlyU3luYyhwYWNrYWdlRGlyLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KVxuXG4gICAgICAgIGZzLndyaXRlRmlsZVN5bmMocGF0aC5qb2luKHBhY2thZ2VEaXIsIFwiaW5kZXguZC50c1wiKSwgZGF0YS5zbmlwcGV0LmR0cylcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgY29uc29sZS53YXJuKGBFcnJvciBmZXRjaGluZyB0eXBlcyBmb3IgJHtpbXBvcnRQYXRofTpgLCBlcnJvcilcbiAgICB9XG4gIH1cbn1cbiIsICJpbXBvcnQga3kgZnJvbSBcImt5XCJcbmltcG9ydCB0eXBlIHsgRmlsZVNlcnZlclJvdXRlcyB9IGZyb20gXCJsaWIvZmlsZS1zZXJ2ZXIvRmlsZVNlcnZlclJvdXRlc1wiXG5pbXBvcnQgeyBjcmVhdGVIdHRwU2VydmVyIH0gZnJvbSBcImxpYi9zZXJ2ZXIvY3JlYXRlSHR0cFNlcnZlclwiXG5pbXBvcnQgeyBFdmVudHNXYXRjaGVyIH0gZnJvbSBcImxpYi9zZXJ2ZXIvRXZlbnRzV2F0Y2hlclwiXG5pbXBvcnQgdHlwZSBodHRwIGZyb20gXCJub2RlOmh0dHBcIlxuaW1wb3J0IHR5cGUgeyBUeXBlZEt5SW5zdGFuY2UgfSBmcm9tIFwidHlwZWQta3lcIlxuaW1wb3J0IHBhdGggZnJvbSBcIm5vZGU6cGF0aFwiXG5pbXBvcnQgZnMgZnJvbSBcIm5vZGU6ZnNcIlxuaW1wb3J0IHR5cGUgeyBGaWxlVXBkYXRlZEV2ZW50IH0gZnJvbSBcImxpYi9maWxlLXNlcnZlci9GaWxlU2VydmVyRXZlbnRcIlxuaW1wb3J0ICogYXMgY2hva2lkYXIgZnJvbSBcImNob2tpZGFyXCJcblxuZXhwb3J0IGNsYXNzIERldlNlcnZlciB7XG4gIHBvcnQ6IG51bWJlclxuICAvKipcbiAgICogVGhlIHBhdGggdG8gYSBjb21wb25lbnQgdGhhdCBleHBvcnRzIGEgPGJvYXJkIC8+IG9yIDxncm91cCAvPiBjb21wb25lbnRcbiAgICovXG4gIGNvbXBvbmVudEZpbGVQYXRoOiBzdHJpbmdcblxuICBwcm9qZWN0RGlyOiBzdHJpbmdcblxuICAvKipcbiAgICogVGhlIEhUVFAgc2VydmVyIHRoYXQgaG9zdHMgdGhlIGZpbGUgc2VydmVyIGFuZCBldmVudCBidXMuIFlvdSBjYW4gdXNlXG4gICAqIGZzS3kgdG8gY29tbXVuaWNhdGUgd2l0aCB0aGUgZmlsZSBzZXJ2ZXIvZXZlbnQgYnVzXG4gICAqL1xuICBodHRwU2VydmVyPzogaHR0cC5TZXJ2ZXJcbiAgLyoqXG4gICAqIFdhdGNoZXMgZm9yIGV2ZW50cyBvbiB0aGUgZXZlbnQgYnVzIGJ5IHBvbGxpbmcgYGFwaS9ldmVudHMvbGlzdGBcbiAgICovXG4gIGV2ZW50c1dhdGNoZXI/OiBFdmVudHNXYXRjaGVyXG4gIC8qKlxuICAgKiBBIGt5IGluc3RhbmNlIHRoYXQgY2FuIGJlIHVzZWQgdG8gY29tbXVuaWNhdGUgd2l0aCB0aGUgZmlsZSBzZXJ2ZXIgYW5kXG4gICAqIGV2ZW50IGJ1c1xuICAgKi9cbiAgZnNLeTogVHlwZWRLeUluc3RhbmNlPGtleW9mIEZpbGVTZXJ2ZXJSb3V0ZXMsIEZpbGVTZXJ2ZXJSb3V0ZXM+XG4gIC8qKlxuICAgKiBBIGNob2tpZGFyIGluc3RhbmNlIHRoYXQgd2F0Y2hlcyB0aGUgcHJvamVjdCBkaXJlY3RvcnkgZm9yIGZpbGUgY2hhbmdlc1xuICAgKi9cbiAgZmlsZXN5c3RlbVdhdGNoZXI/OiBjaG9raWRhci5GU1dhdGNoZXJcblxuICBjb25zdHJ1Y3Rvcih7XG4gICAgcG9ydCxcbiAgICBjb21wb25lbnRGaWxlUGF0aCxcbiAgfToge1xuICAgIHBvcnQ6IG51bWJlclxuICAgIGNvbXBvbmVudEZpbGVQYXRoOiBzdHJpbmdcbiAgfSkge1xuICAgIHRoaXMucG9ydCA9IHBvcnRcbiAgICB0aGlzLmNvbXBvbmVudEZpbGVQYXRoID0gY29tcG9uZW50RmlsZVBhdGhcbiAgICB0aGlzLnByb2plY3REaXIgPSBwYXRoLmRpcm5hbWUoY29tcG9uZW50RmlsZVBhdGgpXG4gICAgdGhpcy5mc0t5ID0ga3kuY3JlYXRlKHtcbiAgICAgIHByZWZpeFVybDogYGh0dHA6Ly9sb2NhbGhvc3Q6JHtwb3J0fWAsXG4gICAgfSkgYXMgYW55XG4gIH1cblxuICBhc3luYyBzdGFydCgpIHtcbiAgICBjb25zdCB7IHNlcnZlciB9ID0gYXdhaXQgY3JlYXRlSHR0cFNlcnZlcih0aGlzLnBvcnQpXG4gICAgdGhpcy5odHRwU2VydmVyID0gc2VydmVyXG5cbiAgICB0aGlzLmV2ZW50c1dhdGNoZXIgPSBuZXcgRXZlbnRzV2F0Y2hlcihgaHR0cDovL2xvY2FsaG9zdDoke3RoaXMucG9ydH1gKVxuICAgIHRoaXMuZXZlbnRzV2F0Y2hlci5zdGFydCgpXG5cbiAgICB0aGlzLmV2ZW50c1dhdGNoZXIub24oXG4gICAgICBcIkZJTEVfVVBEQVRFRFwiLFxuICAgICAgdGhpcy5oYW5kbGVGaWxlVXBkYXRlZEV2ZW50RnJvbVNlcnZlci5iaW5kKHRoaXMpLFxuICAgIClcblxuICAgIHRoaXMuZmlsZXN5c3RlbVdhdGNoZXIgPSBjaG9raWRhci53YXRjaCh0aGlzLnByb2plY3REaXIsIHtcbiAgICAgIHBlcnNpc3RlbnQ6IHRydWUsXG4gICAgICBpZ25vcmVJbml0aWFsOiB0cnVlLFxuICAgIH0pXG5cbiAgICB0aGlzLmZpbGVzeXN0ZW1XYXRjaGVyLm9uKFwiY2hhbmdlXCIsIChmaWxlUGF0aCkgPT5cbiAgICAgIHRoaXMuaGFuZGxlRmlsZUNoYW5nZWRPbkZpbGVzeXN0ZW0oZmlsZVBhdGgpLFxuICAgIClcbiAgICB0aGlzLmZpbGVzeXN0ZW1XYXRjaGVyLm9uKFwiYWRkXCIsIChmaWxlUGF0aCkgPT5cbiAgICAgIHRoaXMuaGFuZGxlRmlsZUNoYW5nZWRPbkZpbGVzeXN0ZW0oZmlsZVBhdGgpLFxuICAgIClcblxuICAgIHRoaXMudXBzZXJ0SW5pdGlhbEZpbGVzKClcbiAgfVxuXG4gIGFzeW5jIGFkZEVudHJ5cG9pbnQoKSB7XG4gICAgY29uc3QgcmVsYXRpdmVDb21wb25lbnRGaWxlUGF0aCA9IHBhdGgucmVsYXRpdmUoXG4gICAgICB0aGlzLnByb2plY3REaXIsXG4gICAgICB0aGlzLmNvbXBvbmVudEZpbGVQYXRoLFxuICAgIClcbiAgICBhd2FpdCB0aGlzLmZzS3kucG9zdChcImFwaS9maWxlcy91cHNlcnRcIiwge1xuICAgICAganNvbjoge1xuICAgICAgICBmaWxlX3BhdGg6IFwiZW50cnlwb2ludC50c3hcIixcbiAgICAgICAgdGV4dF9jb250ZW50OiBgXG5pbXBvcnQgTXlDaXJjdWl0IGZyb20gXCIuLyR7cmVsYXRpdmVDb21wb25lbnRGaWxlUGF0aH1cIlxuXG5jaXJjdWl0LmFkZCg8TXlDaXJjdWl0IC8+KVxuYCxcbiAgICAgIH0sXG4gICAgfSlcbiAgfVxuXG4gIGFzeW5jIGhhbmRsZUZpbGVVcGRhdGVkRXZlbnRGcm9tU2VydmVyKGV2OiBGaWxlVXBkYXRlZEV2ZW50KSB7XG4gICAgaWYgKGV2LmluaXRpYXRvciA9PT0gXCJmaWxlc3lzdGVtX2NoYW5nZVwiKSByZXR1cm5cblxuICAgIGlmIChldi5maWxlX3BhdGggPT09IFwibWFudWFsLWVkaXRzLmpzb25cIikge1xuICAgICAgY29uc29sZS5sb2coXCJNYW51YWwgZWRpdHMgdXBkYXRlZCwgdXBkYXRpbmcgb24gZmlsZXN5c3RlbS4uLlwiKVxuICAgICAgY29uc3QgeyBmaWxlIH0gPSBhd2FpdCB0aGlzLmZzS3lcbiAgICAgICAgLmdldChcImFwaS9maWxlcy9nZXRcIiwge1xuICAgICAgICAgIHNlYXJjaFBhcmFtczogeyBmaWxlX3BhdGg6IGV2LmZpbGVfcGF0aCB9LFxuICAgICAgICB9KVxuICAgICAgICAuanNvbigpXG4gICAgICBmcy53cml0ZUZpbGVTeW5jKFxuICAgICAgICBwYXRoLmpvaW4odGhpcy5wcm9qZWN0RGlyLCBcIm1hbnVhbC1lZGl0cy5qc29uXCIpLFxuICAgICAgICBmaWxlLnRleHRfY29udGVudCxcbiAgICAgIClcbiAgICB9XG4gIH1cblxuICBhc3luYyBoYW5kbGVGaWxlQ2hhbmdlZE9uRmlsZXN5c3RlbShhYnNvbHV0ZUZpbGVQYXRoOiBzdHJpbmcpIHtcbiAgICBjb25zdCByZWxhdGl2ZUZpbGVQYXRoID0gcGF0aC5yZWxhdGl2ZSh0aGlzLnByb2plY3REaXIsIGFic29sdXRlRmlsZVBhdGgpXG5cbiAgICAvLyBXZSd2ZSB0ZW1wb3JhcmlseSBkaXNhYmxlZCB1cHNlcnRpbmcgbWFudWFsIGVkaXRzIGZyb20gZmlsZXN5c3RlbSBjaGFuZ2VzXG4gICAgLy8gYmVjYXVzZSBpdCBjYW4gYmUgZWRpdGVkIGJ5IHRoZSBicm93c2VyXG4gICAgaWYgKHJlbGF0aXZlRmlsZVBhdGguaW5jbHVkZXMoXCJtYW51YWwtZWRpdHMuanNvblwiKSkgcmV0dXJuXG5cbiAgICBhd2FpdCB0aGlzLmZzS3lcbiAgICAgIC5wb3N0KFwiYXBpL2ZpbGVzL3Vwc2VydFwiLCB7XG4gICAgICAgIGpzb246IHtcbiAgICAgICAgICBmaWxlX3BhdGg6IHJlbGF0aXZlRmlsZVBhdGgsXG4gICAgICAgICAgdGV4dF9jb250ZW50OiBmcy5yZWFkRmlsZVN5bmMoYWJzb2x1dGVGaWxlUGF0aCwgXCJ1dGYtOFwiKSxcbiAgICAgICAgICBpbml0aWF0b3I6IFwiZmlsZXN5c3RlbV9jaGFuZ2VcIixcbiAgICAgICAgfSxcbiAgICAgIH0pXG4gICAgICAuanNvbigpXG4gIH1cblxuICBhc3luYyB1cHNlcnRJbml0aWFsRmlsZXMoKSB7XG4gICAgLy8gU2NhbiBwcm9qZWN0IGRpcmVjdG9yeSBmb3IgYWxsIGZpbGVzIGFuZCB1cHNlcnQgdGhlbVxuICAgIGNvbnN0IGZpbGVOYW1lcyA9IGZzLnJlYWRkaXJTeW5jKHRoaXMucHJvamVjdERpcilcbiAgICBmb3IgKGNvbnN0IGZpbGVOYW1lIG9mIGZpbGVOYW1lcykge1xuICAgICAgaWYgKGZzLnN0YXRTeW5jKHBhdGguam9pbih0aGlzLnByb2plY3REaXIsIGZpbGVOYW1lKSkuaXNEaXJlY3RvcnkoKSlcbiAgICAgICAgY29udGludWVcbiAgICAgIGNvbnN0IGZpbGVDb250ZW50ID0gZnMucmVhZEZpbGVTeW5jKFxuICAgICAgICBwYXRoLmpvaW4odGhpcy5wcm9qZWN0RGlyLCBmaWxlTmFtZSksXG4gICAgICAgIFwidXRmLThcIixcbiAgICAgIClcbiAgICAgIGF3YWl0IHRoaXMuZnNLeS5wb3N0KFwiYXBpL2ZpbGVzL3Vwc2VydFwiLCB7XG4gICAgICAgIGpzb246IHtcbiAgICAgICAgICBmaWxlX3BhdGg6IGZpbGVOYW1lLFxuICAgICAgICAgIHRleHRfY29udGVudDogZmlsZUNvbnRlbnQsXG4gICAgICAgICAgaW5pdGlhdG9yOiBcImZpbGVzeXN0ZW1fY2hhbmdlXCIsXG4gICAgICAgIH0sXG4gICAgICB9KVxuICAgIH1cbiAgfVxuXG4gIGFzeW5jIHN0b3AoKSB7XG4gICAgdGhpcy5odHRwU2VydmVyPy5jbG9zZSgpXG4gICAgdGhpcy5ldmVudHNXYXRjaGVyPy5zdG9wKClcbiAgfVxufVxuIiwgImltcG9ydCAqIGFzIGh0dHAgZnJvbSBcIm5vZGU6aHR0cFwiXG5pbXBvcnQgKiBhcyBmcyBmcm9tIFwibm9kZTpmc1wiXG5pbXBvcnQgKiBhcyBwYXRoIGZyb20gXCJub2RlOnBhdGhcIlxuaW1wb3J0IHsgZ2V0Tm9kZUhhbmRsZXIgfSBmcm9tIFwid2ludGVyc3BlYy9hZGFwdGVycy9ub2RlXCJcbmltcG9ydCBwa2cgZnJvbSBcIi4uLy4uL3BhY2thZ2UuanNvblwiXG5cbi8vIEB0cy1pZ25vcmVcbmltcG9ydCB3aW50ZXJzcGVjQnVuZGxlIGZyb20gXCJAdHNjaXJjdWl0L2ZpbGUtc2VydmVyL2Rpc3QvYnVuZGxlLmpzXCJcbmltcG9ydCB7IGdldEluZGV4IH0gZnJvbSBcIi4uL3NpdGUvZ2V0SW5kZXhcIlxuXG5leHBvcnQgY29uc3QgY3JlYXRlSHR0cFNlcnZlciA9IGFzeW5jIChwb3J0ID0gMzAwMCkgPT4ge1xuICBjb25zdCBmaWxlU2VydmVySGFuZGxlciA9IGdldE5vZGVIYW5kbGVyKHdpbnRlcnNwZWNCdW5kbGUgYXMgYW55LCB7fSlcblxuICBjb25zdCBzZXJ2ZXIgPSBodHRwLmNyZWF0ZVNlcnZlcihhc3luYyAocmVxLCByZXMpID0+IHtcbiAgICBjb25zdCB1cmwgPSBuZXcgVVJMKHJlcS51cmwhLCBgaHR0cDovLyR7cmVxLmhlYWRlcnMuaG9zdH1gKVxuXG4gICAgaWYgKHVybC5wYXRobmFtZSA9PT0gXCIvc3RhbmRhbG9uZS5taW4uanNcIikge1xuICAgICAgY29uc3Qgc3RhbmRhbG9uZUZpbGVQYXRoID1cbiAgICAgICAgcHJvY2Vzcy5lbnYuUlVORlJBTUVfU1RBTkRBTE9ORV9GSUxFX1BBVEggfHxcbiAgICAgICAgcGF0aC5yZXNvbHZlKFxuICAgICAgICAgIHByb2Nlc3MuY3dkKCksXG4gICAgICAgICAgXCJub2RlX21vZHVsZXNcIixcbiAgICAgICAgICBcIkB0c2NpcmN1aXQvcnVuZnJhbWUvZGlzdC9zdGFuZGFsb25lLm1pbi5qc1wiLFxuICAgICAgICApXG5cbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IGNvbnRlbnQgPSBmcy5yZWFkRmlsZVN5bmMoc3RhbmRhbG9uZUZpbGVQYXRoLCBcInV0ZjhcIilcbiAgICAgICAgcmVzLndyaXRlSGVhZCgyMDAsIHtcbiAgICAgICAgICBcIkNvbnRlbnQtVHlwZVwiOiBcImFwcGxpY2F0aW9uL2phdmFzY3JpcHQ7IGNoYXJzZXQ9dXRmLThcIixcbiAgICAgICAgfSlcbiAgICAgICAgcmVzLmVuZChjb250ZW50KVxuICAgICAgICByZXR1cm5cbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoXCJFcnJvciBzZXJ2aW5nIHN0YW5kYWxvbmUubWluLmpzOlwiLCBlcnJvcilcbiAgICAgIH1cblxuICAgICAgcmVzLndyaXRlSGVhZCgzMDIsIHtcbiAgICAgICAgTG9jYXRpb246IGBodHRwczovL2Nkbi5qc2RlbGl2ci5uZXQvbnBtL0B0c2NpcmN1aXQvcnVuZnJhbWVAJHtwa2cuZGVwZW5kZW5jaWVzW1wiQHRzY2lyY3VpdC9ydW5mcmFtZVwiXS5yZXBsYWNlKC9eW14wLTldKy8sIFwiXCIpfS9kaXN0L3N0YW5kYWxvbmUubWluLmpzYCxcbiAgICAgIH0pXG4gICAgICByZXMuZW5kKClcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGlmICh1cmwucGF0aG5hbWUgPT09IFwiL1wiKSB7XG4gICAgICBjb25zdCBodG1sID0gYXdhaXQgZ2V0SW5kZXgoKVxuICAgICAgcmVzLndyaXRlSGVhZCgyMDAsIHsgXCJDb250ZW50LVR5cGVcIjogXCJ0ZXh0L2h0bWxcIiB9KVxuICAgICAgcmVzLmVuZChodG1sKVxuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgaWYgKHVybC5wYXRobmFtZS5zdGFydHNXaXRoKFwiL2FwaS9cIikpIHtcbiAgICAgIHJlcS51cmwgPSByZXEudXJsIS5yZXBsYWNlKFwiL2FwaS9cIiwgXCIvXCIpXG4gICAgICBmaWxlU2VydmVySGFuZGxlcihyZXEsIHJlcylcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIHJlcy53cml0ZUhlYWQoNDA0KVxuICAgIHJlcy5lbmQoXCJOb3QgZm91bmRcIilcbiAgfSlcblxuICByZXR1cm4gbmV3IFByb21pc2U8eyBzZXJ2ZXI6IGh0dHAuU2VydmVyIH0+KChyZXNvbHZlKSA9PiB7XG4gICAgc2VydmVyLmxpc3Rlbihwb3J0LCAoKSA9PiB7XG4gICAgICBjb25zb2xlLmxvZyhgU2VydmVyIHJ1bm5pbmcgYXQgaHR0cDovL2xvY2FsaG9zdDoke3BvcnR9YClcbiAgICAgIHJlc29sdmUoeyBzZXJ2ZXIgfSlcbiAgICB9KVxuICB9KVxufVxuIiwgIntcbiAgXCJuYW1lXCI6IFwiQHRzY2lyY3VpdC9jbGlcIixcbiAgXCJtYWluXCI6IFwiZGlzdC9tYWluLmpzXCIsXG4gIFwidHlwZVwiOiBcIm1vZHVsZVwiLFxuICBcInZlcnNpb25cIjogXCIwLjEuNlwiLFxuICBcImJpblwiOiB7XG4gICAgXCJ0c2NpXCI6IFwiLi9kaXN0L21haW4uanNcIlxuICB9LFxuICBcInNjcmlwdHNcIjoge1xuICAgIFwic3RhcnRcIjogXCJidW4gcnVuIGRldlwiLFxuICAgIFwiZGV2XCI6IFwiYnVuIC0taG90IC4vY2xpL21haW4udHMgZGV2IC4vZXhhbXBsZS1kaXIvc25pcHBldC50c3hcIixcbiAgICBcImJ1aWxkXCI6IFwidHN1cC1ub2RlIGNsaS9tYWluLnRzIC0tZm9ybWF0IGVzbSAtLXNvdXJjZW1hcCBpbmxpbmVcIixcbiAgICBcImZvcm1hdFwiOiBcImJpb21lIGZvcm1hdCAtLXdyaXRlIC5cIixcbiAgICBcImZvcm1hdDpjaGVja1wiOiBcImJpb21lIGZvcm1hdCAuXCIsXG4gICAgXCJjbGlcIjogXCJidW4gLi9jbGkvbWFpbi50c1wiXG4gIH0sXG4gIFwiZGV2RGVwZW5kZW5jaWVzXCI6IHtcbiAgICBcIkBiaW9tZWpzL2Jpb21lXCI6IFwiXjEuOS40XCIsXG4gICAgXCJAdHNjaXJjdWl0L2NvcmVcIjogXCJeMC4wLjI0OVwiLFxuICAgIFwiQHR5cGVzL2J1blwiOiBcIl4xLjEuMTVcIixcbiAgICBcIkB0eXBlcy9jb25maWdzdG9yZVwiOiBcIl42LjAuMlwiLFxuICAgIFwiQHR5cGVzL3JlYWN0XCI6IFwiXjE5LjAuMVwiLFxuICAgIFwiQHR5cGVzL3NlbXZlclwiOiBcIl43LjUuOFwiLFxuICAgIFwiZ2V0LXBvcnRcIjogXCJeNy4xLjBcIixcbiAgICBcInRlbXB5XCI6IFwiXjMuMS4wXCIsXG4gICAgXCJ0c3VwXCI6IFwiXjguMy41XCIsXG4gICAgXCJ0eXBlZC1reVwiOiBcIl4wLjAuNFwiXG4gIH0sXG4gIFwicGVlckRlcGVuZGVuY2llc1wiOiB7XG4gICAgXCJ0eXBlc2NyaXB0XCI6IFwiXjUuMC4wXCJcbiAgfSxcbiAgXCJkZXBlbmRlbmNpZXNcIjoge1xuICAgIFwiQHRzY2lyY3VpdC9maWxlLXNlcnZlclwiOiBcIl4wLjAuMTNcIixcbiAgICBcIkB0c2NpcmN1aXQvcnVuZnJhbWVcIjogXCJeMC4wLjQ3XCIsXG4gICAgXCJjaG9raWRhclwiOiBcIl40LjAuMVwiLFxuICAgIFwiY29tbWFuZGVyXCI6IFwiXjEyLjEuMFwiLFxuICAgIFwiY29uZmlnc3RvcmVcIjogXCJeNy4wLjBcIixcbiAgICBcImNvc21pY29uZmlnXCI6IFwiXjkuMC4wXCIsXG4gICAgXCJkZWxheVwiOiBcIl42LjAuMFwiLFxuICAgIFwia3lcIjogXCJeMS43LjRcIixcbiAgICBcIm1ha2UtdmZzXCI6IFwiXjEuMC4xNVwiLFxuICAgIFwicGVyZmVjdC1jbGlcIjogXCJeMS4wLjIwXCIsXG4gICAgXCJzZW12ZXJcIjogXCJeNy42LjNcIlxuICB9XG59XG4iLCAiaW1wb3J0IHBrZyBmcm9tIFwiLi4vLi4vcGFja2FnZS5qc29uXCJcblxuZXhwb3J0IGNvbnN0IGdldEluZGV4ID0gYXN5bmMgKCkgPT4ge1xuICByZXR1cm4gYDxodG1sPlxuICAgIDxoZWFkPlxuICAgIDwvaGVhZD5cbiAgICA8Ym9keT5cbiAgICAgIDxzY3JpcHQgc3JjPVwiaHR0cHM6Ly9jZG4udGFpbHdpbmRjc3MuY29tXCI+PC9zY3JpcHQ+XG4gICAgICA8ZGl2IGlkPVwicm9vdFwiPmxvYWRpbmcuLi48L2Rpdj5cbiAgICAgIDxzY3JpcHQ+XG4gICAgICBnbG9iYWxUaGlzLnByb2Nlc3MgPSB7IGVudjogeyBOT0RFX0VOVjogXCJwcm9kdWN0aW9uXCIgfSB9XG4gICAgICA8L3NjcmlwdD5cbiAgICAgIDxzY3JpcHQgc3JjPVwiL3N0YW5kYWxvbmUubWluLmpzXCI+PC9zY3JpcHQ+XG4gICAgPC9ib2R5PlxuICA8L2h0bWw+YFxufVxuXG4vLyA8c2NyaXB0IHNyYz1cImh0dHBzOi8vY2RuLmpzZGVsaXZyLm5ldC9ucG0vQHRzY2lyY3VpdC9ydW5mcmFtZUAke3BrZy5kZXBlbmRlbmNpZXNbXCJAdHNjaXJjdWl0L3J1bmZyYW1lXCJdLnJlcGxhY2UoL15bXjAtOV0rLywgXCJcIil9L2Rpc3Qvc3RhbmRhbG9uZS5taW4uanNcIj48L3NjcmlwdD5cbiIsICJpbXBvcnQgeyBFdmVudEVtaXR0ZXIgfSBmcm9tIFwiZXZlbnRzXCJcblxuaW50ZXJmYWNlIEV2ZW50IHtcbiAgZXZlbnRfaWQ6IHN0cmluZ1xuICBjcmVhdGVkX2F0OiBzdHJpbmdcbiAgZXZlbnRfdHlwZTogc3RyaW5nXG4gIFtrZXk6IHN0cmluZ106IGFueVxufVxuXG5pbnRlcmZhY2UgRXZlbnRzUmVzcG9uc2Uge1xuICBldmVudF9saXN0OiBFdmVudFtdXG59XG5cbmV4cG9ydCBjbGFzcyBFdmVudHNXYXRjaGVyIGV4dGVuZHMgRXZlbnRFbWl0dGVyIHtcbiAgcHJpdmF0ZSBsYXN0UG9sbFRpbWU6IHN0cmluZ1xuICBwcml2YXRlIHBvbGxJbnRlcnZhbDogbnVtYmVyXG4gIHByaXZhdGUgYmFzZVVybDogc3RyaW5nXG4gIHByaXZhdGUgcG9sbGluZyA9IGZhbHNlXG4gIHByaXZhdGUgdGltZW91dElkPzogTm9kZUpTLlRpbWVvdXRcblxuICBjb25zdHJ1Y3RvcihiYXNlVXJsID0gXCJodHRwOi8vbG9jYWxob3N0OjMwMDBcIiwgcG9sbEludGVydmFsID0gMTAwMCkge1xuICAgIHN1cGVyKClcbiAgICB0aGlzLmJhc2VVcmwgPSBiYXNlVXJsXG4gICAgdGhpcy5wb2xsSW50ZXJ2YWwgPSBwb2xsSW50ZXJ2YWxcbiAgICB0aGlzLmxhc3RQb2xsVGltZSA9IG5ldyBEYXRlKCkudG9JU09TdHJpbmcoKVxuICB9XG5cbiAgYXN5bmMgc3RhcnQoKSB7XG4gICAgaWYgKHRoaXMucG9sbGluZykgcmV0dXJuXG4gICAgdGhpcy5wb2xsaW5nID0gdHJ1ZVxuICAgIGF3YWl0IHRoaXMucG9sbCgpXG4gIH1cblxuICBzdG9wKCkge1xuICAgIHRoaXMucG9sbGluZyA9IGZhbHNlXG4gICAgaWYgKHRoaXMudGltZW91dElkKSB7XG4gICAgICBjbGVhclRpbWVvdXQodGhpcy50aW1lb3V0SWQpXG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBwb2xsKCkge1xuICAgIGlmICghdGhpcy5wb2xsaW5nKSByZXR1cm5cblxuICAgIHRyeSB7XG4gICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGZldGNoKFxuICAgICAgICBgJHt0aGlzLmJhc2VVcmx9L2FwaS9ldmVudHMvbGlzdD9zaW5jZT0ke2VuY29kZVVSSUNvbXBvbmVudCh0aGlzLmxhc3RQb2xsVGltZSl9YCxcbiAgICAgIClcblxuICAgICAgaWYgKCFyZXNwb25zZS5vaykge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEhUVFAgZXJyb3IhIHN0YXR1czogJHtyZXNwb25zZS5zdGF0dXN9YClcbiAgICAgIH1cblxuICAgICAgY29uc3QgZGF0YTogRXZlbnRzUmVzcG9uc2UgPSBhd2FpdCByZXNwb25zZS5qc29uKClcblxuICAgICAgLy8gVXBkYXRlIGxhc3QgcG9sbCB0aW1lIHRvIGxhdGVzdCBldmVudCBvciBjdXJyZW50IHRpbWVcbiAgICAgIGNvbnN0IGxhdGVzdEV2ZW50ID0gZGF0YS5ldmVudF9saXN0W2RhdGEuZXZlbnRfbGlzdC5sZW5ndGggLSAxXVxuICAgICAgdGhpcy5sYXN0UG9sbFRpbWUgPSBsYXRlc3RFdmVudFxuICAgICAgICA/IGxhdGVzdEV2ZW50LmNyZWF0ZWRfYXRcbiAgICAgICAgOiBuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKClcblxuICAgICAgLy8gRW1pdCBldmVudHMgaW4gY2hyb25vbG9naWNhbCBvcmRlclxuICAgICAgZGF0YS5ldmVudF9saXN0LmZvckVhY2goKGV2ZW50KSA9PiB7XG4gICAgICAgIHRoaXMuZW1pdChldmVudC5ldmVudF90eXBlLCBldmVudClcbiAgICAgICAgdGhpcy5lbWl0KFwiKlwiLCBldmVudClcbiAgICAgIH0pXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIHRoaXMuZW1pdChcImVycm9yXCIsIGVycm9yKVxuICAgIH1cbiAgICAvLyBTY2hlZHVsZSBuZXh0IHBvbGxcbiAgICB0aGlzLnRpbWVvdXRJZCA9IGdsb2JhbFRoaXMuc2V0VGltZW91dChcbiAgICAgICgpID0+IHRoaXMucG9sbCgpLFxuICAgICAgdGhpcy5wb2xsSW50ZXJ2YWwsXG4gICAgKSBhcyB1bmtub3duIGFzIE5vZGVKUy5UaW1lb3V0XG4gIH1cbn1cbiIsICJpbXBvcnQgQ29uZmlnc3RvcmUgZnJvbSBcImNvbmZpZ3N0b3JlXCJcbmltcG9ydCB0eXBlIHsgVHlwZWRDb25maWdzdG9yZSB9IGZyb20gXCIuL1R5cGVkQ29uZmlnU3RvcmVcIlxuXG5leHBvcnQgaW50ZXJmYWNlIENsaUNvbmZpZyB7XG4gIHNlc3Npb25Ub2tlbj86IHN0cmluZ1xuICBnaXRodWJVc2VybmFtZT86IHN0cmluZ1xuICByZWdpc3RyeUFwaVVybD86IHN0cmluZ1xufVxuXG5leHBvcnQgY29uc3QgY2xpQ29uZmlnOiBUeXBlZENvbmZpZ3N0b3JlPENsaUNvbmZpZz4gPSBuZXcgQ29uZmlnc3RvcmUoXG4gIFwidHNjaXJjdWl0XCIsXG4pXG5cbmV4cG9ydCBjb25zdCBnZXRSZWdpc3RyeUFwaVVybCA9ICgpOiBzdHJpbmcgPT4ge1xuICByZXR1cm4gY2xpQ29uZmlnLmdldChcInJlZ2lzdHJ5QXBpVXJsXCIpID8/IFwiaHR0cHM6Ly9yZWdpc3RyeS1hcGkudHNjaXJjdWl0LmNvbVwiXG59XG4iLCAiaW1wb3J0IHR5cGUgeyBDb21tYW5kIH0gZnJvbSBcImNvbW1hbmRlclwiXG5pbXBvcnQgeyBjbGlDb25maWcgfSBmcm9tIFwibGliL2NsaS1jb25maWdcIlxuaW1wb3J0IGRlbGF5IGZyb20gXCJkZWxheVwiXG5pbXBvcnQgeyBnZXRLeSB9IGZyb20gXCJsaWIvcmVnaXN0cnktYXBpL2dldC1reVwiXG5pbXBvcnQgdHlwZSB7IEVuZHBvaW50UmVzcG9uc2UgfSBmcm9tIFwibGliL3JlZ2lzdHJ5LWFwaS9lbmRwb2ludC10eXBlc1wiXG5cbmV4cG9ydCBjb25zdCByZWdpc3RlckF1dGhMb2dpbiA9IChwcm9ncmFtOiBDb21tYW5kKSA9PiB7XG4gIHByb2dyYW0uY29tbWFuZHNcbiAgICAuZmluZCgoYykgPT4gYy5uYW1lKCkgPT09IFwiYXV0aFwiKSFcbiAgICAuY29tbWFuZChcImxvZ2luXCIpXG4gICAgLmRlc2NyaXB0aW9uKFwiQXV0aGVudGljYXRlIENMSSwgbG9naW4gdG8gcmVnaXN0cnlcIilcbiAgICAuYWN0aW9uKGFzeW5jIChhcmdzKSA9PiB7XG4gICAgICBjb25zdCBreSA9IGdldEt5KClcblxuICAgICAgY29uc3QgeyBsb2dpbl9wYWdlIH0gPSBhd2FpdCBreVxuICAgICAgICAucG9zdDxFbmRwb2ludFJlc3BvbnNlW1wic2Vzc2lvbnMvbG9naW5fcGFnZS9jcmVhdGVcIl0+KFxuICAgICAgICAgIFwic2Vzc2lvbnMvbG9naW5fcGFnZS9jcmVhdGVcIixcbiAgICAgICAgICB7XG4gICAgICAgICAgICBqc29uOiB7fSxcbiAgICAgICAgICB9LFxuICAgICAgICApXG4gICAgICAgIC5qc29uKClcblxuICAgICAgY29uc29sZS5sb2coXCJQbGVhc2UgdmlzaXQgdGhlIGZvbGxvd2luZyBVUkwgdG8gbG9nIGluOlwiKVxuICAgICAgY29uc29sZS5sb2cobG9naW5fcGFnZS51cmwpXG5cbiAgICAgIC8vIFdhaXQgdW50aWwgd2UgcmVjZWl2ZSBjb25maXJtYXRpb25cbiAgICAgIHdoaWxlICh0cnVlKSB7XG4gICAgICAgIGNvbnN0IHsgbG9naW5fcGFnZTogbmV3X2xvZ2luX3BhZ2UgfSA9IGF3YWl0IGt5XG4gICAgICAgICAgLnBvc3Q8RW5kcG9pbnRSZXNwb25zZVtcInNlc3Npb25zL2xvZ2luX3BhZ2UvZ2V0XCJdPihcbiAgICAgICAgICAgIFwic2Vzc2lvbnMvbG9naW5fcGFnZS9nZXRcIixcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAganNvbjoge1xuICAgICAgICAgICAgICAgIGxvZ2luX3BhZ2VfaWQ6IGxvZ2luX3BhZ2UubG9naW5fcGFnZV9pZCxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgaGVhZGVyczoge1xuICAgICAgICAgICAgICAgIEF1dGhvcml6YXRpb246IGBCZWFyZXIgJHtsb2dpbl9wYWdlLmxvZ2luX3BhZ2VfYXV0aF90b2tlbn1gLFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICApXG4gICAgICAgICAgLmpzb24oKVxuXG4gICAgICAgIGlmIChuZXdfbG9naW5fcGFnZS53YXNfbG9naW5fc3VjY2Vzc2Z1bCkge1xuICAgICAgICAgIGNvbnNvbGUubG9nKFwiTG9nZ2VkIGluISBHZW5lcmF0aW5nIHRva2VuLi4uXCIpXG4gICAgICAgICAgYnJlYWtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChuZXdfbG9naW5fcGFnZS5pc19leHBpcmVkKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiTG9naW4gcGFnZSBleHBpcmVkXCIpXG4gICAgICAgIH1cblxuICAgICAgICBhd2FpdCBkZWxheSgxMDAwKVxuICAgICAgfVxuXG4gICAgICBjb25zdCB7IHNlc3Npb24gfSA9IGF3YWl0IGt5XG4gICAgICAgIC5wb3N0PEVuZHBvaW50UmVzcG9uc2VbXCJzZXNzaW9ucy9sb2dpbl9wYWdlL2V4Y2hhbmdlX2Zvcl9jbGlfc2Vzc2lvblwiXT4oXG4gICAgICAgICAgXCJzZXNzaW9ucy9sb2dpbl9wYWdlL2V4Y2hhbmdlX2Zvcl9jbGlfc2Vzc2lvblwiLFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIGpzb246IHtcbiAgICAgICAgICAgICAgbG9naW5fcGFnZV9pZDogbG9naW5fcGFnZS5sb2dpbl9wYWdlX2lkLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGhlYWRlcnM6IHtcbiAgICAgICAgICAgICAgQXV0aG9yaXphdGlvbjogYEJlYXJlciAke2xvZ2luX3BhZ2UubG9naW5fcGFnZV9hdXRoX3Rva2VufWAsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIH0sXG4gICAgICAgIClcbiAgICAgICAgLmpzb24oKVxuXG4gICAgICBjbGlDb25maWcuc2V0KFwic2Vzc2lvblRva2VuXCIsIHNlc3Npb24udG9rZW4pXG5cbiAgICAgIGNvbnNvbGUubG9nKFwiUmVhZHkgdG8gdXNlIVwiKVxuICAgIH0pXG59XG4iLCAiaW1wb3J0IHsgZ2V0UmVnaXN0cnlBcGlVcmwgfSBmcm9tIFwibGliL2NsaS1jb25maWdcIlxuaW1wb3J0IGt5LCB7IHR5cGUgQWZ0ZXJSZXNwb25zZUhvb2sgfSBmcm9tIFwia3lcIlxuXG5jb25zdCBwcmV0dHlSZXNwb25zZUVycm9ySG9vazogQWZ0ZXJSZXNwb25zZUhvb2sgPSBhc3luYyAoXG4gIF9yZXF1ZXN0LFxuICBfb3B0aW9ucyxcbiAgcmVzcG9uc2UsXG4pID0+IHtcbiAgaWYgKCFyZXNwb25zZS5vaykge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBlcnJvckRhdGEgPSBhd2FpdCByZXNwb25zZS5qc29uKClcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYEZBSUwgWyR7cmVzcG9uc2Uuc3RhdHVzfV06ICR7X3JlcXVlc3QubWV0aG9kfSAke1xuICAgICAgICAgIG5ldyBVUkwoX3JlcXVlc3QudXJsKS5wYXRobmFtZVxuICAgICAgICB9IFxcblxcbiAke0pTT04uc3RyaW5naWZ5KGVycm9yRGF0YSwgbnVsbCwgMil9YCxcbiAgICAgIClcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICAvL2lnbm9yZSwgYWxsb3cgdGhlIGVycm9yIHRvIGJlIHRocm93blxuICAgIH1cbiAgfVxufVxuXG5leHBvcnQgY29uc3QgZ2V0S3kgPSAoKSA9PiB7XG4gIHJldHVybiBreS5jcmVhdGUoe1xuICAgIHByZWZpeFVybDogZ2V0UmVnaXN0cnlBcGlVcmwoKSxcbiAgICBob29rczoge1xuICAgICAgYWZ0ZXJSZXNwb25zZTogW3ByZXR0eVJlc3BvbnNlRXJyb3JIb29rXSxcbiAgICB9LFxuICB9KVxufVxuIiwgImltcG9ydCB0eXBlIHsgQ29tbWFuZCB9IGZyb20gXCJjb21tYW5kZXJcIlxuXG5leHBvcnQgY29uc3QgcmVnaXN0ZXJBdXRoTG9nb3V0ID0gKHByb2dyYW06IENvbW1hbmQpID0+IHtcbiAgcHJvZ3JhbS5jb21tYW5kc1xuICAgIC5maW5kKChjKSA9PiBjLm5hbWUoKSA9PT0gXCJhdXRoXCIpIVxuICAgIC5jb21tYW5kKFwibG9nb3V0XCIpXG4gICAgLmRlc2NyaXB0aW9uKFwiTG9nb3V0IGZyb20gcmVnaXN0cnlcIilcbiAgICAuYWN0aW9uKChhcmdzKSA9PiB7XG4gICAgICBjb25zb2xlLmxvZyhcImxvZ291dFwiKVxuICAgIH0pXG59XG4iLCAiaW1wb3J0IHR5cGUgeyBDb21tYW5kIH0gZnJvbSBcImNvbW1hbmRlclwiXG5cbmV4cG9ydCBjb25zdCByZWdpc3RlckF1dGggPSAocHJvZ3JhbTogQ29tbWFuZCkgPT4ge1xuICBwcm9ncmFtLmNvbW1hbmQoXCJhdXRoXCIpLmRlc2NyaXB0aW9uKFwiTG9naW4vbG9nb3V0XCIpXG59XG4iLCAiaW1wb3J0IHR5cGUgeyBDb21tYW5kIH0gZnJvbSBcImNvbW1hbmRlclwiXG5cbmV4cG9ydCBjb25zdCByZWdpc3RlckNvbmZpZyA9IChwcm9ncmFtOiBDb21tYW5kKSA9PiB7XG4gIHByb2dyYW0uY29tbWFuZChcImNvbmZpZ1wiKS5kZXNjcmlwdGlvbihcIk1hbmFnZSB0c2NpcmN1aXQgQ0xJIGNvbmZpZ3VyYXRpb25cIilcbn1cbiIsICJpbXBvcnQgdHlwZSB7IENvbW1hbmQgfSBmcm9tIFwiY29tbWFuZGVyXCJcbmltcG9ydCB7IGNsaUNvbmZpZyB9IGZyb20gXCJsaWIvY2xpLWNvbmZpZ1wiXG5cbmV4cG9ydCBjb25zdCByZWdpc3RlckNvbmZpZ1ByaW50ID0gKHByb2dyYW06IENvbW1hbmQpID0+IHtcbiAgcHJvZ3JhbS5jb21tYW5kc1xuICAgIC5maW5kKChjKSA9PiBjLm5hbWUoKSA9PT0gXCJjb25maWdcIikhXG4gICAgLmNvbW1hbmQoXCJwcmludFwiKVxuICAgIC5kZXNjcmlwdGlvbihcIlByaW50IHRoZSBjdXJyZW50IGNvbmZpZ1wiKVxuICAgIC5hY3Rpb24oKCkgPT4ge1xuICAgICAgY29uc29sZS5sb2coSlNPTi5zdHJpbmdpZnkoY2xpQ29uZmlnLmFsbCwgbnVsbCwgMikpXG4gICAgfSlcbn1cbiIsICJpbXBvcnQgdHlwZSB7IENvbW1hbmQgfSBmcm9tIFwiY29tbWFuZGVyXCJcbmltcG9ydCB7IGdldEt5IH0gZnJvbSBcImxpYi9yZWdpc3RyeS1hcGkvZ2V0LWt5XCJcbmltcG9ydCAqIGFzIGZzIGZyb20gXCJub2RlOmZzXCJcbmltcG9ydCAqIGFzIHBhdGggZnJvbSBcIm5vZGU6cGF0aFwiXG5cbmV4cG9ydCBjb25zdCByZWdpc3RlckNsb25lID0gKHByb2dyYW06IENvbW1hbmQpID0+IHtcbiAgcHJvZ3JhbVxuICAgIC5jb21tYW5kKFwiY2xvbmVcIilcbiAgICAuZGVzY3JpcHRpb24oXCJDbG9uZSBhIHNuaXBwZXQgZnJvbSB0aGUgcmVnaXN0cnlcIilcbiAgICAuYXJndW1lbnQoXCI8c25pcHBldD5cIiwgXCJTbmlwcGV0IHRvIGNsb25lIChlLmcuIGF1dGhvci9zbmlwcGV0TmFtZSlcIilcbiAgICAuYWN0aW9uKGFzeW5jIChzbmlwcGV0UGF0aDogc3RyaW5nKSA9PiB7XG4gICAgICBsZXQgYXV0aG9yOiBzdHJpbmdcbiAgICAgIGxldCBzbmlwcGV0TmFtZTogc3RyaW5nXG4gICAgICBpZiAoIXNuaXBwZXRQYXRoLnN0YXJ0c1dpdGgoXCJAdHNjaS9cIikgJiYgc25pcHBldFBhdGguaW5jbHVkZXMoXCIvXCIpKSB7XG4gICAgICAgIDtbYXV0aG9yLCBzbmlwcGV0TmFtZV0gPSBzbmlwcGV0UGF0aC5zcGxpdChcIi9cIilcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnN0IHRyaW1tZWRQYXRoID0gc25pcHBldFBhdGgucmVwbGFjZShcIkB0c2NpL1wiLCBcIlwiKVxuICAgICAgICBjb25zdCBmaXJzdERvdEluZGV4ID0gdHJpbW1lZFBhdGguaW5kZXhPZihcIi5cIilcbiAgICAgICAgYXV0aG9yID0gdHJpbW1lZFBhdGguc2xpY2UoMCwgZmlyc3REb3RJbmRleClcbiAgICAgICAgc25pcHBldE5hbWUgPSB0cmltbWVkUGF0aC5zbGljZShmaXJzdERvdEluZGV4ICsgMSlcbiAgICAgIH1cblxuICAgICAgaWYgKCFhdXRob3IgfHwgIXNuaXBwZXROYW1lKSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoXG4gICAgICAgICAgXCJJbnZhbGlkIHNuaXBwZXQgcGF0aC4gVXNlIGZvcm1hdDogYXV0aG9yL3NuaXBwZXROYW1lLCBhdXRob3Iuc25pcHBldE5hbWUgb3IgQHRzY2kvYXV0aG9yLnNuaXBwZXROYW1lXCIsXG4gICAgICAgIClcbiAgICAgICAgcHJvY2Vzcy5leGl0KDEpXG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGt5ID0gZ2V0S3koKVxuXG4gICAgICB0cnkge1xuICAgICAgICBjb25zb2xlLmxvZyhgQ2xvbmluZyAke2F1dGhvcn0vJHtzbmlwcGV0TmFtZX0uLi5gKVxuXG4gICAgICAgIGNvbnN0IHBhY2thZ2VGaWxlTGlzdCA9IGF3YWl0IGt5XG4gICAgICAgICAgLnBvc3Q8e1xuICAgICAgICAgICAgcGFja2FnZV9maWxlczogQXJyYXk8e1xuICAgICAgICAgICAgICBwYWNrYWdlX2ZpbGVfaWQ6IHN0cmluZ1xuICAgICAgICAgICAgICBwYWNrYWdlX3JlbGVhc2VfaWQ6IHN0cmluZ1xuICAgICAgICAgICAgICBmaWxlX3BhdGg6IHN0cmluZ1xuICAgICAgICAgICAgICBjcmVhdGVkX2F0OiBzdHJpbmdcbiAgICAgICAgICAgIH0+XG4gICAgICAgICAgfT4oXCJwYWNrYWdlX2ZpbGVzL2xpc3RcIiwge1xuICAgICAgICAgICAganNvbjoge1xuICAgICAgICAgICAgICBwYWNrYWdlX25hbWU6IGAke2F1dGhvcn0vJHtzbmlwcGV0TmFtZX1gLFxuICAgICAgICAgICAgICB1c2VfbGF0ZXN0X3ZlcnNpb246IHRydWUsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIH0pXG4gICAgICAgICAgLmpzb24oKVxuXG4gICAgICAgIC8vIENyZWF0ZSBkaXJlY3RvcnkgaWYgaXQgZG9lc24ndCBleGlzdFxuICAgICAgICBjb25zdCBkaXJQYXRoID0gYC4vJHthdXRob3J9LiR7c25pcHBldE5hbWV9YFxuICAgICAgICBpZiAoIWZzLmV4aXN0c1N5bmMoZGlyUGF0aCkpIHtcbiAgICAgICAgICBmcy5ta2RpclN5bmMoZGlyUGF0aClcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIERvd25sb2FkIGVhY2ggZmlsZSB0aGF0IGRvZXNuJ3Qgc3RhcnQgd2l0aCBkaXN0L1xuICAgICAgICBmb3IgKGNvbnN0IGZpbGVJbmZvIG9mIHBhY2thZ2VGaWxlTGlzdC5wYWNrYWdlX2ZpbGVzKSB7XG4gICAgICAgICAgY29uc3QgZmlsZVBhdGggPSBmaWxlSW5mby5maWxlX3BhdGguc3RhcnRzV2l0aChcIi9cIilcbiAgICAgICAgICAgID8gZmlsZUluZm8uZmlsZV9wYXRoLnNsaWNlKDEpXG4gICAgICAgICAgICA6IGZpbGVJbmZvLmZpbGVfcGF0aFxuXG4gICAgICAgICAgaWYgKGZpbGVQYXRoLnN0YXJ0c1dpdGgoXCJkaXN0L1wiKSkgY29udGludWVcblxuICAgICAgICAgIGNvbnN0IGZpbGVDb250ZW50ID0gYXdhaXQga3lcbiAgICAgICAgICAgIC5wb3N0PHtcbiAgICAgICAgICAgICAgcGFja2FnZV9maWxlOiB7XG4gICAgICAgICAgICAgICAgY29udGVudF90ZXh0OiBzdHJpbmdcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfT4oXCJwYWNrYWdlX2ZpbGVzL2dldFwiLCB7XG4gICAgICAgICAgICAgIGpzb246IHtcbiAgICAgICAgICAgICAgICBwYWNrYWdlX25hbWU6IGAke2F1dGhvcn0vJHtzbmlwcGV0TmFtZX1gLFxuICAgICAgICAgICAgICAgIGZpbGVfcGF0aDogZmlsZUluZm8uZmlsZV9wYXRoLFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIC5qc29uKClcblxuICAgICAgICAgIGNvbnN0IGZ1bGxQYXRoID0gcGF0aC5qb2luKGRpclBhdGgsIGZpbGVQYXRoKVxuICAgICAgICAgIGNvbnN0IGRpck5hbWUgPSBwYXRoLmRpcm5hbWUoZnVsbFBhdGgpXG5cbiAgICAgICAgICAvLyBDcmVhdGUgbmVzdGVkIGRpcmVjdG9yaWVzIGlmIHRoZXkgZG9uJ3QgZXhpc3RcbiAgICAgICAgICBpZiAoIWZzLmV4aXN0c1N5bmMoZGlyTmFtZSkpIHtcbiAgICAgICAgICAgIGZzLm1rZGlyU3luYyhkaXJOYW1lLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KVxuICAgICAgICAgIH1cblxuICAgICAgICAgIGZzLndyaXRlRmlsZVN5bmMoZnVsbFBhdGgsIGZpbGVDb250ZW50LnBhY2thZ2VfZmlsZS5jb250ZW50X3RleHQpXG4gICAgICAgIH1cblxuICAgICAgICBjb25zb2xlLmxvZyhgU3VjY2Vzc2Z1bGx5IGNsb25lZCB0byAuLyR7YXV0aG9yfS4ke3NuaXBwZXROYW1lfS9gKVxuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgaWYgKGVycm9yIGluc3RhbmNlb2YgRXJyb3IpIHtcbiAgICAgICAgICBjb25zb2xlLmVycm9yKFwiRmFpbGVkIHRvIGNsb25lIHNuaXBwZXQ6XCIsIGVycm9yLm1lc3NhZ2UpXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY29uc29sZS5lcnJvcihcIkZhaWxlZCB0byBjbG9uZSBzbmlwcGV0OlwiLCBlcnJvcilcbiAgICAgICAgfVxuICAgICAgICBwcm9jZXNzLmV4aXQoMSlcbiAgICAgIH1cbiAgICB9KVxufVxuIiwgImltcG9ydCB0eXBlIHsgQ29tbWFuZCB9IGZyb20gXCJjb21tYW5kZXJcIlxuaW1wb3J0IHsgY3JlYXRlQ2lyY3VpdFdlYldvcmtlciB9IGZyb20gXCJAdHNjaXJjdWl0L2V2YWwtd2Vid29ya2VyXCJcbmltcG9ydCB3ZWJXb3JrZXJCdW5kbGVVcmwgZnJvbSBcIkB0c2NpcmN1aXQvZXZhbC13ZWJ3b3JrZXIvYmxvYi11cmxcIlxuaW1wb3J0IHsgZ2V0VmlydHVhbEZpbGVTeXN0ZW1Gcm9tRGlyUGF0aCB9IGZyb20gXCJtYWtlLXZmc1wiXG5pbXBvcnQgcGF0aCBmcm9tIFwibm9kZTpwYXRoXCJcbmltcG9ydCBmcyBmcm9tIFwibm9kZTpmc1wiXG5cbmNvbnN0IEFMTE9XRURfRk9STUFUUyA9IFtcbiAgXCJqc29uXCIsXG4gIFwiY2lyY3VpdC1qc29uXCIsXG4gIFwic2NoZW1hdGljLXN2Z1wiLFxuICBcInBjYi1zdmdcIixcbiAgXCJnZXJiZXJzXCIsXG4gIFwicmVhZGFibGUtbmV0bGlzdFwiLFxuICBcImdsdGZcIixcbiAgXCJzcGVjY3RyYS1kc25cIixcbl0gYXMgY29uc3RcblxudHlwZSBGb3JtYXQgPSAodHlwZW9mIEFMTE9XRURfRk9STUFUUylbbnVtYmVyXVxuXG5jb25zdCBPVVRQVVRfRVhURU5TSU9OUyA9IHtcbiAganNvbjogXCIuY2lyY3VpdC5qc29uXCIsXG4gIFwiY2lyY3VpdC1qc29uXCI6IFwiLmNpcmN1aXQuanNvblwiLFxuICBcInNjaGVtYXRpYy1zdmdcIjogXCItc2NoZW1hdGljLnN2Z1wiLFxuICBcInBjYi1zdmdcIjogXCItcGNiLnN2Z1wiLFxuICBnZXJiZXJzOiBcIi1nZXJiZXJzLnppcFwiLFxuICBcInJlYWRhYmxlLW5ldGxpc3RcIjogXCItcmVhZGFibGUubmV0bGlzdFwiLFxuICBnbHRmOiBcIi5nbHRmXCIsXG4gIFwic3BlY2N0cmEtZHNuXCI6IFwiLmRzblwiLFxufVxuXG5leHBvcnQgY29uc3QgcmVnaXN0ZXJFeHBvcnQgPSAocHJvZ3JhbTogQ29tbWFuZCkgPT4ge1xuICBwcm9ncmFtXG4gICAgLmNvbW1hbmQoXCJleHBvcnRcIilcbiAgICAuZGVzY3JpcHRpb24oXCJFeHBvcnQgdHNjaXJjdWl0IGNvZGUgdG8gdmFyaW91cyBmb3JtYXRzXCIpXG4gICAgLmFyZ3VtZW50KFwiPGZpbGU+XCIsIFwiUGF0aCB0byB0aGUgc25pcHBldCBmaWxlXCIpXG4gICAgLm9wdGlvbihcIi1mLCAtLWZvcm1hdCA8Zm9ybWF0PlwiLCBcIk91dHB1dCBmb3JtYXRcIilcbiAgICAub3B0aW9uKFwiLW8sIC0tb3V0cHV0IDxwYXRoPlwiLCBcIk91dHB1dCBmaWxlIHBhdGhcIilcbiAgICAuYWN0aW9uKGFzeW5jIChmaWxlLCBvcHRpb25zKSA9PiB7XG4gICAgICBjb25zdCB7IGZvcm1hdCA9IFwiY2lyY3VpdC1qc29uXCIgfSA9IG9wdGlvbnNcbiAgICAgIGxldCB7IG91dHB1dCB9ID0gb3B0aW9uc1xuICAgICAgaWYgKCFBTExPV0VEX0ZPUk1BVFMuaW5jbHVkZXMoZm9ybWF0KSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgYEludmFsaWQgZm9ybWF0OiAke2Zvcm1hdH1cXG5TdXBwb3J0ZWQgZm9ybWF0czogJHtBTExPV0VEX0ZPUk1BVFMuam9pbihcIixcIil9YCxcbiAgICAgICAgKVxuICAgICAgfVxuXG4gICAgICBpZiAoIW91dHB1dCkge1xuICAgICAgICBvdXRwdXQgPSBwYXRoLmJhc2VuYW1lKGZpbGUpLnJlcGxhY2UoL1xcLlteLl0rJC8sIFwiXCIpXG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHdvcmtlciA9IGF3YWl0IGNyZWF0ZUNpcmN1aXRXZWJXb3JrZXIoe1xuICAgICAgICB3ZWJXb3JrZXJVcmw6IHdlYldvcmtlckJ1bmRsZVVybCxcbiAgICAgIH0pXG5cbiAgICAgIGNvbnN0IHByb2plY3REaXIgPSBwYXRoLmRpcm5hbWUoZmlsZSlcblxuICAgICAgY29uc3QgcmVsYXRpdmVDb21wb25lbnRQYXRoID0gcGF0aC5yZWxhdGl2ZShwcm9qZWN0RGlyLCBmaWxlKVxuXG4gICAgICBhd2FpdCB3b3JrZXIuZXhlY3V0ZVdpdGhGc01hcCh7XG4gICAgICAgIGVudHJ5cG9pbnQ6IFwiZW50cnlwb2ludC50c3hcIixcbiAgICAgICAgZnNNYXA6IHtcbiAgICAgICAgICAuLi4oKGF3YWl0IGdldFZpcnR1YWxGaWxlU3lzdGVtRnJvbURpclBhdGgoe1xuICAgICAgICAgICAgZGlyUGF0aDogcHJvamVjdERpcixcbiAgICAgICAgICAgIGNvbnRlbnRGb3JtYXQ6IFwic3RyaW5nXCIsXG4gICAgICAgICAgfSkpIGFzIFJlY29yZDxzdHJpbmcsIHN0cmluZz4pLFxuICAgICAgICAgIFwiZW50cnlwb2ludC50c3hcIjogYFxuaW1wb3J0IE15Q2lyY3VpdCBmcm9tIFwiLi8ke3JlbGF0aXZlQ29tcG9uZW50UGF0aH1cIlxuXG5jaXJjdWl0LmFkZCg8TXlDaXJjdWl0IC8+KVxuICAgICAgICBgLFxuICAgICAgICB9LFxuICAgICAgfSlcblxuICAgICAgYXdhaXQgd29ya2VyLnJlbmRlclVudGlsU2V0dGxlZCgpXG5cbiAgICAgIGNvbnN0IGNpcmN1aXRKc29uID0gYXdhaXQgd29ya2VyLmdldENpcmN1aXRKc29uKClcblxuICAgICAgY29uc3Qgb3V0cHV0UGF0aCA9IHBhdGguam9pbihcbiAgICAgICAgcHJvamVjdERpcixcbiAgICAgICAgYCR7b3V0cHV0fSR7T1VUUFVUX0VYVEVOU0lPTlNbZm9ybWF0IGFzIEZvcm1hdF19YCxcbiAgICAgIClcblxuICAgICAgZnMud3JpdGVGaWxlU3luYyhvdXRwdXRQYXRoLCBKU09OLnN0cmluZ2lmeShjaXJjdWl0SnNvbikpXG5cbiAgICAgIGNvbnNvbGUubG9nKGBFeHBvcnRlZCB0byAke291dHB1dFBhdGh9YClcblxuICAgICAgcHJvY2Vzcy5leGl0KDApXG4gICAgfSlcbn1cbiJdLAogICJtYXBwaW5ncyI6ICI7OztBQUNBLFNBQVMsZUFBZTs7O0FDQXhCLFlBQVlBLFdBQVU7OztBQ0R0QixZQUFZLFFBQVE7QUFDcEIsWUFBWSxVQUFVO0FBQ3RCLFlBQVksUUFBUTtBQVFwQixlQUFzQixpQ0FBaUMsYUFBcUI7QUFDMUUsUUFBTSxVQUFhLGdCQUFhLGFBQWEsT0FBTztBQUNwRCxRQUFNLGFBQWdCO0FBQUEsSUFDcEI7QUFBQSxJQUNBO0FBQUEsSUFDRyxnQkFBYTtBQUFBLElBQ2hCO0FBQUEsRUFDRjtBQUVBLFFBQU0sVUFBb0IsQ0FBQztBQUUzQixXQUFTLE1BQU0sTUFBZTtBQUM1QixRQUFPLHVCQUFvQixJQUFJLEdBQUc7QUFDaEMsWUFBTSxrQkFBa0IsS0FBSztBQUM3QixVQUFJLG1CQUFzQixtQkFBZ0IsZUFBZSxHQUFHO0FBQzFELGNBQU0sYUFBYSxnQkFBZ0I7QUFDbkMsWUFBSSxXQUFXLFdBQVcsUUFBUSxHQUFHO0FBQ25DLGtCQUFRLEtBQUssVUFBVTtBQUFBLFFBQ3pCO0FBQUEsTUFDRjtBQUFBLElBQ0Y7QUFDQSxJQUFHLGdCQUFhLE1BQU0sS0FBSztBQUFBLEVBQzdCO0FBRUEsUUFBTSxVQUFVO0FBRWhCLE1BQUksY0FBbUIsYUFBUSxXQUFXO0FBQzFDLFNBQU8sZ0JBQXFCLFdBQU0sV0FBVyxFQUFFLE1BQU07QUFDbkQsUUFBTyxjQUFnQixVQUFLLGFBQWEsY0FBYyxDQUFDLEdBQUc7QUFDekQ7QUFBQSxJQUNGO0FBQ0Esa0JBQW1CLGFBQVEsV0FBVztBQUFBLEVBQ3hDO0FBRUEsYUFBVyxjQUFjLFNBQVM7QUFDaEMsVUFBTSxDQUFDLE9B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R0FBSyxNQUFNLGdDQUFnQztBQUFBLFVBQ3pDLFNBQVM7QUFBQSxVQUNULGVBQWU7QUFBQSxRQUNqQixDQUFDO0FBQUEsUUFDRCxrQkFBa0I7QUFBQSwyQkFDRCxxQkFBcUI7QUFBQTtBQUFBO0FBQUE7QUFBQSxNQUl4QztBQUFBLElBQ0YsQ0FBQztBQUVELFVBQU0sT0FBTyxtQkFBbUI7QUFFaEMsVUFBTSxjQUFjLE1BQU0sT0FBTyxlQUFlO0FBRWhELFVBQU0sYUFBYUEsTUFBSztBQUFBLE1BQ3RCO0FBQUEsTUFDQSxHQUFHLE1BQU0sR0FBRyxrQkFBa0IsTUFBZ0IsQ0FBQztBQUFBLElBQ2pEO0FBRUEsSUFBQUMsSUFBRyxjQUFjLFlBQVksS0FBSyxVQUFVLFdBQVcsQ0FBQztBQUV4RCxZQUFRLElBQUksZUFBZSxVQUFVLEVBQUU7QUFFdkMsWUFBUSxLQUFLLENBQUM7QUFBQSxFQUNoQixDQUFDO0FBQ0w7OztBaEIzRUEsSUFBTSxVQUFVLElBQUksUUFBUTtBQUU1QixRQUNHLEtBQUssTUFBTSxFQUNYLFlBQVksdUNBQXVDLEVBR25ELFFBQVEsT0FBTyxJQUFJLGdCQUFJLFNBQVMsT0FBTyxLQUFLLGdCQUFJLE9BQU87QUFFMUQsWUFBWSxPQUFPO0FBQ25CLGNBQWMsT0FBTztBQUVyQixhQUFhLE9BQU87QUFDcEIsa0JBQWtCLE9BQU87QUFDekIsbUJBQW1CLE9BQU87QUFFMUIsZUFBZSxPQUFPO0FBQ3RCLG9CQUFvQixPQUFPO0FBRTNCLGVBQWUsT0FBTztBQUV0QixJQUFJLFFBQVEsS0FBSyxXQUFXLEdBQUc7QUFDN0IsYUFBVyxTQUFTLFFBQVEsSUFBSTtBQUNsQyxPQUFPO0FBQ0wsVUFBUSxNQUFNO0FBQ2hCOyIsCiAgIm5hbWVzIjogWyJwYXRoIiwgImZzIiwgInBhdGgiLCAicmVzb2x2ZSIsICJwYXRoIiwgImZzIiwgInByb2dyYW0iLCAia3kiLCAicHJvZ3JhbSIsICJreSIsICJwcm9ncmFtIiwgInByb2dyYW0iLCAicHJvZ3JhbSIsICJwcm9ncmFtIiwgImZzIiwgInBhdGgiLCAicHJvZ3JhbSIsICJreSIsICJwYXRoIiwgImZzIiwgInByb2dyYW0iXQp9Cg==
721
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vY2xpL21haW4udHMiLCAiLi4vY2xpL2luaXQvcmVnaXN0ZXIudHMiLCAiLi4vY2xpL2Rldi9yZWdpc3Rlci50cyIsICIuLi9saWIvZGVwZW5kZW5jeS1hbmFseXNpcy9pbnN0YWxsTm9kZU1vZHVsZVR5cGVzRm9yU25pcHBldC50cyIsICIuLi9jbGkvZGV2L0RldlNlcnZlci50cyIsICIuLi9saWIvc2VydmVyL2NyZWF0ZUh0dHBTZXJ2ZXIudHMiLCAiLi4vcGFja2FnZS5qc29uIiwgIi4uL2xpYi9zaXRlL2dldEluZGV4LnRzIiwgIi4uL2xpYi9zZXJ2ZXIvRXZlbnRzV2F0Y2hlci50cyIsICIuLi9saWIvY2xpLWNvbmZpZy9pbmRleC50cyIsICIuLi9jbGkvYXV0aC9sb2dpbi9yZWdpc3Rlci50cyIsICIuLi9saWIvcmVnaXN0cnktYXBpL2dldC1reS50cyIsICIuLi9jbGkvYXV0aC9sb2dvdXQvcmVnaXN0ZXIudHMiLCAiLi4vY2xpL2F1dGgvcmVnaXN0ZXIudHMiLCAiLi4vY2xpL2NvbmZpZy9yZWdpc3Rlci50cyIsICIuLi9jbGkvY29uZmlnL3ByaW50L3JlZ2lzdGVyLnRzIiwgIi4uL2NsaS9jbG9uZS9yZWdpc3Rlci50cyIsICIuLi9jbGkvZXhwb3J0L3JlZ2lzdGVyLnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyIjIS91c3IvYmluL2VudiBub2RlXG5pbXBvcnQgeyBDb21tYW5kIH0gZnJvbSBcImNvbW1hbmRlclwiXG5pbXBvcnQgeyByZWdpc3RlckluaXQgfSBmcm9tIFwiLi9pbml0L3JlZ2lzdGVyXCJcbmltcG9ydCB7IHJlZ2lzdGVyRGV2IH0gZnJvbSBcIi4vZGV2L3JlZ2lzdGVyXCJcbmltcG9ydCB7IHJlZ2lzdGVyQXV0aExvZ2luIH0gZnJvbSBcIi4vYXV0aC9sb2dpbi9yZWdpc3RlclwiXG5pbXBvcnQgeyByZWdpc3RlckF1dGhMb2dvdXQgfSBmcm9tIFwiLi9hdXRoL2xvZ291dC9yZWdpc3RlclwiXG5pbXBvcnQgeyByZWdpc3RlckF1dGggfSBmcm9tIFwiLi9hdXRoL3JlZ2lzdGVyXCJcbmltcG9ydCB7IHJlZ2lzdGVyQ29uZmlnIH0gZnJvbSBcIi4vY29uZmlnL3JlZ2lzdGVyXCJcbmltcG9ydCB7IHJlZ2lzdGVyQ29uZmlnUHJpbnQgfSBmcm9tIFwiLi9jb25maWcvcHJpbnQvcmVnaXN0ZXJcIlxuaW1wb3J0IHsgcmVnaXN0ZXJDbG9uZSB9IGZyb20gXCIuL2Nsb25lL3JlZ2lzdGVyXCJcbmltcG9ydCB7IHBlcmZlY3RDbGkgfSBmcm9tIFwicGVyZmVjdC1jbGlcIlxuaW1wb3J0IHBrZyBmcm9tIFwiLi4vcGFja2FnZS5qc29uXCJcbmltcG9ydCBzZW12ZXIgZnJvbSBcInNlbXZlclwiXG5pbXBvcnQgeyByZWdpc3RlckV4cG9ydCB9IGZyb20gXCIuL2V4cG9ydC9yZWdpc3RlclwiXG5cbmNvbnN0IHByb2dyYW0gPSBuZXcgQ29tbWFuZCgpXG5cbnByb2dyYW1cbiAgLm5hbWUoXCJ0c2NpXCIpXG4gIC5kZXNjcmlwdGlvbihcIkNMSSBmb3IgZGV2ZWxvcGluZyB0c2NpcmN1aXQgc25pcHBldHNcIilcbiAgLy8gSEFDSzogYXQgYnVpbGQgdGltZSB0aGUgdmVyc2lvbiBpcyBvbGQsIHdlIG5lZWQgdG9cbiAgLy8gZml4IHRoaXMgYXQgc29tZSBwb2ludC4uLlxuICAudmVyc2lvbihzZW12ZXIuaW5jKHBrZy52ZXJzaW9uLCBcInBhdGNoXCIpID8/IHBrZy52ZXJzaW9uKVxuXG5yZWdpc3RlckluaXQocHJvZ3JhbSlcblxucmVnaXN0ZXJEZXYocHJvZ3JhbSlcbnJlZ2lzdGVyQ2xvbmUocHJvZ3JhbSlcblxucmVnaXN0ZXJBdXRoKHByb2dyYW0pXG5yZWdpc3RlckF1dGhMb2dpbihwcm9ncmFtKVxucmVnaXN0ZXJBdXRoTG9nb3V0KHByb2dyYW0pXG5cbnJlZ2lzdGVyQ29uZmlnKHByb2dyYW0pXG5yZWdpc3RlckNvbmZpZ1ByaW50KHByb2dyYW0pXG5cbnJlZ2lzdGVyRXhwb3J0KHByb2dyYW0pXG5cbmlmIChwcm9jZXNzLmFyZ3YubGVuZ3RoID09PSAyKSB7XG4gIHBlcmZlY3RDbGkocHJvZ3JhbSwgcHJvY2Vzcy5hcmd2KVxufSBlbHNlIHtcbiAgcHJvZ3JhbS5wYXJzZSgpXG59XG4iLCAiaW1wb3J0IHR5cGUgeyBDb21tYW5kIH0gZnJvbSBcImNvbW1hbmRlclwiXG5pbXBvcnQgKiBhcyBmcyBmcm9tIFwibm9kZTpmc1wiXG5pbXBvcnQgKiBhcyBwYXRoIGZyb20gXCJub2RlOnBhdGhcIlxuXG5leHBvcnQgY29uc3QgcmVnaXN0ZXJJbml0ID0gKHByb2dyYW06IENvbW1hbmQpID0+IHtcbiAgcHJvZ3JhbVxuICAgIC5jb21tYW5kKFwiaW5pdFwiKVxuICAgIC5kZXNjcmlwdGlvbihcIkluaXRpYWxpemUgYSBuZXcgVFNDaXJjdWl0IHByb2plY3QgaW4gdGhlIGN1cnJlbnQgZGlyZWN0b3J5XCIpXG4gICAgLmFjdGlvbigoKSA9PiB7XG4gICAgICBjb25zdCBjdXJyZW50RGlyID0gcHJvY2Vzcy5jd2QoKVxuXG4gICAgICBjb25zdCBpbmRleEZpbGVQYXRoID0gcGF0aC5qb2luKGN1cnJlbnREaXIsIFwiaW5kZXgudHN4XCIpXG4gICAgICBjb25zdCBucG1yY0ZpbGVQYXRoID0gcGF0aC5qb2luKGN1cnJlbnREaXIsIFwiLm5wbXJjXCIpXG5cbiAgICAgIGNvbnN0IGluZGV4Q29udGVudCA9IGBcbmV4cG9ydCBkZWZhdWx0ICgpID0+IChcbiAgPGJvYXJkIHdpZHRoPVwiMTBtbVwiIGhlaWdodD1cIjEwbW1cIj5cbiAgICA8cmVzaXN0b3JcbiAgICAgIHJlc2lzdGFuY2U9XCIxa1wiXG4gICAgICBmb290cHJpbnQ9XCIwNDAyXCJcbiAgICAgIG5hbWU9XCJSMVwiXG4gICAgICBzY2hYPXszfVxuICAgICAgcGNiWD17M31cbiAgICAvPlxuICAgIDxjYXBhY2l0b3JcbiAgICAgIGNhcGFjaXRhbmNlPVwiMTAwMHBGXCJcbiAgICAgIGZvb3RwcmludD1cIjA0MDJcIlxuICAgICAgbmFtZT1cIkMxXCJcbiAgICAgIHNjaFg9ey0zfVxuICAgICAgcGNiWD17LTN9XG4gICAgLz5cbiAgICA8dHJhY2UgZnJvbT1cIi5SMSA+IC5waW4xXCIgdG89XCIuQzEgPiAucGluMVwiIC8+XG4gIDwvYm9hcmQ+XG4pO1xuYFxuXG4gICAgICBjb25zdCBucG1yY0NvbnRlbnQgPSBgXG5AdHNjaTpyZWdpc3RyeT1odHRwczovL25wbS50c2NpcmN1aXQuY29tXG5gXG5cbiAgICAgIGlmICghZnMuZXhpc3RzU3luYyhpbmRleEZpbGVQYXRoKSkge1xuICAgICAgICBmcy53cml0ZUZpbGVTeW5jKGluZGV4RmlsZVBhdGgsIGluZGV4Q29udGVudC50cmltU3RhcnQoKSlcbiAgICAgICAgY29uc29sZS5sb2coYENyZWF0ZWQ6ICR7aW5kZXhGaWxlUGF0aH1gKVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc29sZS5sb2coYFNraXBwZWQ6ICR7aW5kZXhGaWxlUGF0aH0gYWxyZWFkeSBleGlzdHNgKVxuICAgICAgfVxuXG4gICAgICBpZiAoIWZzLmV4aXN0c1N5bmMobnBtcmNGaWxlUGF0aCkpIHtcbiAgICAgICAgZnMud3JpdGVGaWxlU3luYyhucG1yY0ZpbGVQYXRoLCBucG1yY0NvbnRlbnQudHJpbVN0YXJ0KCkpXG4gICAgICAgIGNvbnNvbGUubG9nKGBDcmVhdGVkOiAke25wbXJjRmlsZVBhdGh9YClcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnNvbGUubG9nKGBTa2lwcGVkOiAke25wbXJjRmlsZVBhdGh9IGFscmVhZHkgZXhpc3RzYClcbiAgICAgIH1cblxuICAgICAgY29uc29sZS5sb2coXG4gICAgICAgIGBJbml0aWFsaXphdGlvbiBjb21wbGV0ZS4gUnVuIFwidHNjaSBkZXZcIiB0byBzdGFydCBkZXZlbG9waW5nLmAsXG4gICAgICApXG4gICAgfSlcbn1cbiIsICJpbXBvcnQgdHlwZSB7IENvbW1hbmQgfSBmcm9tIFwiY29tbWFuZGVyXCJcbmltcG9ydCAqIGFzIHBhdGggZnJvbSBcIm5vZGU6cGF0aFwiXG5pbXBvcnQgKiBhcyBjaG9raWRhciBmcm9tIFwiY2hva2lkYXJcIlxuaW1wb3J0ICogYXMgZnMgZnJvbSBcIm5vZGU6ZnNcIlxuaW1wb3J0IHsgY3JlYXRlSHR0cFNlcnZlciB9IGZyb20gXCJsaWIvc2VydmVyL2NyZWF0ZUh0dHBTZXJ2ZXJcIlxuaW1wb3J0IHsgZ2V0TG9jYWxGaWxlRGVwZW5kZW5jaWVzIH0gZnJvbSBcImxpYi9kZXBlbmRlbmN5LWFuYWx5c2lzL2dldExvY2FsRmlsZURlcGVuZGVuY2llc1wiXG5pbXBvcnQgeyBpbnN0YWxsTm9kZU1vZHVsZVR5cGVzRm9yU25pcHBldCB9IGZyb20gXCIuLi8uLi9saWIvZGVwZW5kZW5jeS1hbmFseXNpcy9pbnN0YWxsTm9kZU1vZHVsZVR5cGVzRm9yU25pcHBldFwiXG5pbXBvcnQgeyBFdmVudHNXYXRjaGVyIH0gZnJvbSBcIi4uLy4uL2xpYi9zZXJ2ZXIvRXZlbnRzV2F0Y2hlclwiXG5pbXBvcnQgeyBEZXZTZXJ2ZXIgfSBmcm9tIFwiLi9EZXZTZXJ2ZXJcIlxuXG5leHBvcnQgY29uc3QgcmVnaXN0ZXJEZXYgPSAocHJvZ3JhbTogQ29tbWFuZCkgPT4ge1xuICBwcm9ncmFtXG4gICAgLmNvbW1hbmQoXCJkZXZcIilcbiAgICAuZGVzY3JpcHRpb24oXCJTdGFydCBkZXZlbG9wbWVudCBzZXJ2ZXIgZm9yIGEgc25pcHBldFwiKVxuICAgIC5hcmd1bWVudChcIltmaWxlXVwiLCBcIlBhdGggdG8gdGhlIHNuaXBwZXQgZmlsZVwiKVxuICAgIC5vcHRpb24oXCItcCwgLS1wb3J0IDxudW1iZXI+XCIsIFwiUG9ydCB0byBydW4gc2VydmVyIG9uXCIsIFwiMzAwMFwiKVxuICAgIC5hY3Rpb24oYXN5bmMgKGZpbGU6IHN0cmluZywgb3B0aW9uczogeyBwb3J0OiBzdHJpbmcgfSkgPT4ge1xuICAgICAgY29uc3QgcG9ydCA9IHBhcnNlSW50KG9wdGlvbnMucG9ydClcbiAgICAgIGxldCBhYnNvbHV0ZVBhdGg6IHN0cmluZ1xuXG4gICAgICBpZiAoZmlsZSkge1xuICAgICAgICBhYnNvbHV0ZVBhdGggPSBwYXRoLnJlc29sdmUoZmlsZSlcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnN0IGVudHJ5cG9pbnRQYXRoID0gcGF0aC5yZXNvbHZlKFwiaW5kZXgudHN4XCIpXG4gICAgICAgIGlmIChmcy5leGlzdHNTeW5jKGVudHJ5cG9pbnRQYXRoKSkge1xuICAgICAgICAgIGFic29sdXRlUGF0aCA9IGVudHJ5cG9pbnRQYXRoXG4gICAgICAgICAgY29uc29sZS5sb2coXCJObyBmaWxlIHByb3ZpZGVkLiBVc2luZyAnaW5kZXgudHN4JyBhcyB0aGUgZW50cnlwb2ludC5cIilcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBjb25zb2xlLmxvZyhcbiAgICAgICAgICAgIFwiTm8gZW50cnlwb2ludCBmb3VuZC4gUnVuICd0c2NpIGluaXQnIHRvIGJvb3RzdHJhcCBhIGJhc2ljIHByb2plY3QuXCIsXG4gICAgICAgICAgKVxuICAgICAgICAgIHJldHVyblxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGZpbGVEaXIgPSBwYXRoLmRpcm5hbWUoYWJzb2x1dGVQYXRoKVxuXG4gICAgICB0cnkge1xuICAgICAgICBjb25zb2xlLmxvZyhcIkluc3RhbGxpbmcgdHlwZXMgZm9yIGltcG9ydGVkIHNuaXBwZXRzLi4uXCIpXG4gICAgICAgIGF3YWl0IGluc3RhbGxOb2RlTW9kdWxlVHlwZXNGb3JTbmlwcGV0KGFic29sdXRlUGF0aClcbiAgICAgICAgY29uc29sZS5sb2coXCJUeXBlcyBpbnN0YWxsZWQgc3VjY2Vzc2Z1bGx5XCIpXG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBjb25zb2xlLndhcm4oXCJGYWlsZWQgdG8gaW5zdGFsbCB0eXBlczpcIiwgZXJyb3IpXG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHNlcnZlciA9IG5ldyBEZXZTZXJ2ZXIoe1xuICAgICAgICBwb3J0LFxuICAgICAgICBjb21wb25lbnRGaWxlUGF0aDogYWJzb2x1dGVQYXRoLFxuICAgICAgfSlcblxuICAgICAgYXdhaXQgc2VydmVyLnN0YXJ0KClcbiAgICAgIGF3YWl0IHNlcnZlci5hZGRFbnRyeXBvaW50KClcbiAgICB9KVxufVxuIiwgImltcG9ydCAqIGFzIGZzIGZyb20gXCJub2RlOmZzXCJcbmltcG9ydCAqIGFzIHBhdGggZnJvbSBcIm5vZGU6cGF0aFwiXG5pbXBvcnQgKiBhcyB0cyBmcm9tIFwidHlwZXNjcmlwdFwiXG5cbmludGVyZmFjZSBTbmlwcGV0QXBpUmVzcG9uc2Uge1xuICBzbmlwcGV0OiB7XG4gICAgZHRzOiBzdHJpbmdcbiAgfVxufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gaW5zdGFsbE5vZGVNb2R1bGVUeXBlc0ZvclNuaXBwZXQoc25pcHBldFBhdGg6IHN0cmluZykge1xuICBjb25zdCBjb250ZW50ID0gZnMucmVhZEZpbGVTeW5jKHNuaXBwZXRQYXRoLCBcInV0Zi04XCIpXG4gIGNvbnN0IHNvdXJjZUZpbGUgPSB0cy5jcmVhdGVTb3VyY2VGaWxlKFxuICAgIHNuaXBwZXRQYXRoLFxuICAgIGNvbnRlbnQsXG4gICAgdHMuU2NyaXB0VGFyZ2V0LkxhdGVzdCxcbiAgICB0cnVlLFxuICApXG5cbiAgY29uc3QgaW1wb3J0czogc3RyaW5nW10gPSBbXVxuXG4gIGZ1bmN0aW9uIHZpc2l0KG5vZGU6IHRzLk5vZGUpIHtcbiAgICBpZiAodHMuaXNJbXBvcnREZWNsYXJhdGlvbihub2RlKSkge1xuICAgICAgY29uc3QgbW9kdWxlU3BlY2lmaWVyID0gbm9kZS5tb2R1bGVTcGVjaWZpZXJcbiAgICAgIGlmIChtb2R1bGVTcGVjaWZpZXIgJiYgdHMuaXNTdHJpbmdMaXRlcmFsKG1vZHVsZVNwZWNpZmllcikpIHtcbiAgICAgICAgY29uc3QgaW1wb3J0UGF0aCA9IG1vZHVsZVNwZWNpZmllci50ZXh0XG4gICAgICAgIGlmIChpbXBvcnRQYXRoLnN0YXJ0c1dpdGgoXCJAdHNjaS9cIikpIHtcbiAgICAgICAgICBpbXBvcnRzLnB1c2goaW1wb3J0UGF0aClcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICB0cy5mb3JFYWNoQ2hpbGQobm9kZSwgdmlzaXQpXG4gIH1cblxuICB2aXNpdChzb3VyY2VGaWxlKVxuXG4gIGxldCBwcm9qZWN0Um9vdCA9IHBhdGguZGlybmFtZShzbmlwcGV0UGF0aClcbiAgd2hpbGUgKHByb2plY3RSb290ICE9PSBwYXRoLnBhcnNlKHByb2plY3RSb290KS5yb290KSB7XG4gICAgaWYgKGZzLmV4aXN0c1N5bmMocGF0aC5qb2luKHByb2plY3RSb290LCBcInBhY2thZ2UuanNvblwiKSkpIHtcbiAgICAgIGJyZWFrXG4gICAgfVxuICAgIHByb2plY3RSb290ID0gcGF0aC5kaXJuYW1lKHByb2plY3RSb290KVxuICB9XG5cbiAgZm9yIChjb25zdCBpbXBvcnRQYXRoIG9mIGltcG9ydHMpIHtcbiAgICBjb25zdCBbb3duZXIsIG5hbWVdID0gaW1wb3J0UGF0aC5yZXBsYWNlKFwiQHRzY2kvXCIsIFwiXCIpLnNwbGl0KFwiLlwiKVxuICAgIHRyeSB7XG4gICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGZldGNoKFxuICAgICAgICBgaHR0cHM6Ly9yZWdpc3RyeS1hcGkudHNjaXJjdWl0LmNvbS9zbmlwcGV0cy9nZXQ/b3duZXJfbmFtZT0ke293bmVyfSZ1bnNjb3BlZF9uYW1lPSR7bmFtZX1gLFxuICAgICAgKVxuXG4gICAgICBpZiAoIXJlc3BvbnNlLm9rKSB7XG4gICAgICAgIGNvbnNvbGUud2FybihgRmFpbGVkIHRvIGZldGNoIHR5cGVzIGZvciAke2ltcG9ydFBhdGh9YClcbiAgICAgICAgY29udGludWVcbiAgICAgIH1cblxuICAgICAgY29uc3QgZGF0YTogU25pcHBldEFwaVJlc3BvbnNlID0gYXdhaXQgcmVzcG9uc2UuanNvbigpXG5cbiAgICAgIGlmIChkYXRhLnNuaXBwZXQuZHRzKSB7XG4gICAgICAgIGNvbnN0IHBhY2thZ2VEaXIgPSBwYXRoLmpvaW4oXG4gICAgICAgICAgcHJvamVjdFJvb3QsXG4gICAgICAgICAgXCJub2RlX21vZHVsZXNcIixcbiAgICAgICAgICBcIkB0c2NpXCIsXG4gICAgICAgICAgYCR7b3duZXJ9LiR7bmFtZX1gLFxuICAgICAgICApXG4gICAgICAgIGZzLm1rZGlyU3luYyhwYWNrYWdlRGlyLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KVxuXG4gICAgICAgIGZzLndyaXRlRmlsZVN5bmMocGF0aC5qb2luKHBhY2thZ2VEaXIsIFwiaW5kZXguZC50c1wiKSwgZGF0YS5zbmlwcGV0LmR0cylcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgY29uc29sZS53YXJuKGBFcnJvciBmZXRjaGluZyB0eXBlcyBmb3IgJHtpbXBvcnRQYXRofTpgLCBlcnJvcilcbiAgICB9XG4gIH1cbn1cbiIsICJpbXBvcnQga3kgZnJvbSBcImt5XCJcbmltcG9ydCB0eXBlIHsgRmlsZVNlcnZlclJvdXRlcyB9IGZyb20gXCJsaWIvZmlsZS1zZXJ2ZXIvRmlsZVNlcnZlclJvdXRlc1wiXG5pbXBvcnQgeyBjcmVhdGVIdHRwU2VydmVyIH0gZnJvbSBcImxpYi9zZXJ2ZXIvY3JlYXRlSHR0cFNlcnZlclwiXG5pbXBvcnQgeyBFdmVudHNXYXRjaGVyIH0gZnJvbSBcImxpYi9zZXJ2ZXIvRXZlbnRzV2F0Y2hlclwiXG5pbXBvcnQgdHlwZSBodHRwIGZyb20gXCJub2RlOmh0dHBcIlxuaW1wb3J0IHR5cGUgeyBUeXBlZEt5SW5zdGFuY2UgfSBmcm9tIFwidHlwZWQta3lcIlxuaW1wb3J0IHBhdGggZnJvbSBcIm5vZGU6cGF0aFwiXG5pbXBvcnQgZnMgZnJvbSBcIm5vZGU6ZnNcIlxuaW1wb3J0IHR5cGUgeyBGaWxlVXBkYXRlZEV2ZW50IH0gZnJvbSBcImxpYi9maWxlLXNlcnZlci9GaWxlU2VydmVyRXZlbnRcIlxuaW1wb3J0ICogYXMgY2hva2lkYXIgZnJvbSBcImNob2tpZGFyXCJcblxuZXhwb3J0IGNsYXNzIERldlNlcnZlciB7XG4gIHBvcnQ6IG51bWJlclxuICAvKipcbiAgICogVGhlIHBhdGggdG8gYSBjb21wb25lbnQgdGhhdCBleHBvcnRzIGEgPGJvYXJkIC8+IG9yIDxncm91cCAvPiBjb21wb25lbnRcbiAgICovXG4gIGNvbXBvbmVudEZpbGVQYXRoOiBzdHJpbmdcblxuICBwcm9qZWN0RGlyOiBzdHJpbmdcblxuICAvKipcbiAgICogVGhlIEhUVFAgc2VydmVyIHRoYXQgaG9zdHMgdGhlIGZpbGUgc2VydmVyIGFuZCBldmVudCBidXMuIFlvdSBjYW4gdXNlXG4gICAqIGZzS3kgdG8gY29tbXVuaWNhdGUgd2l0aCB0aGUgZmlsZSBzZXJ2ZXIvZXZlbnQgYnVzXG4gICAqL1xuICBodHRwU2VydmVyPzogaHR0cC5TZXJ2ZXJcbiAgLyoqXG4gICAqIFdhdGNoZXMgZm9yIGV2ZW50cyBvbiB0aGUgZXZlbnQgYnVzIGJ5IHBvbGxpbmcgYGFwaS9ldmVudHMvbGlzdGBcbiAgICovXG4gIGV2ZW50c1dhdGNoZXI/OiBFdmVudHNXYXRjaGVyXG4gIC8qKlxuICAgKiBBIGt5IGluc3RhbmNlIHRoYXQgY2FuIGJlIHVzZWQgdG8gY29tbXVuaWNhdGUgd2l0aCB0aGUgZmlsZSBzZXJ2ZXIgYW5kXG4gICAqIGV2ZW50IGJ1c1xuICAgKi9cbiAgZnNLeTogVHlwZWRLeUluc3RhbmNlPGtleW9mIEZpbGVTZXJ2ZXJSb3V0ZXMsIEZpbGVTZXJ2ZXJSb3V0ZXM+XG4gIC8qKlxuICAgKiBBIGNob2tpZGFyIGluc3RhbmNlIHRoYXQgd2F0Y2hlcyB0aGUgcHJvamVjdCBkaXJlY3RvcnkgZm9yIGZpbGUgY2hhbmdlc1xuICAgKi9cbiAgZmlsZXN5c3RlbVdhdGNoZXI/OiBjaG9raWRhci5GU1dhdGNoZXJcblxuICBjb25zdHJ1Y3Rvcih7XG4gICAgcG9ydCxcbiAgICBjb21wb25lbnRGaWxlUGF0aCxcbiAgfToge1xuICAgIHBvcnQ6IG51bWJlclxuICAgIGNvbXBvbmVudEZpbGVQYXRoOiBzdHJpbmdcbiAgfSkge1xuICAgIHRoaXMucG9ydCA9IHBvcnRcbiAgICB0aGlzLmNvbXBvbmVudEZpbGVQYXRoID0gY29tcG9uZW50RmlsZVBhdGhcbiAgICB0aGlzLnByb2plY3REaXIgPSBwYXRoLmRpcm5hbWUoY29tcG9uZW50RmlsZVBhdGgpXG4gICAgdGhpcy5mc0t5ID0ga3kuY3JlYXRlKHtcbiAgICAgIHByZWZpeFVybDogYGh0dHA6Ly9sb2NhbGhvc3Q6JHtwb3J0fWAsXG4gICAgfSkgYXMgYW55XG4gIH1cblxuICBhc3luYyBzdGFydCgpIHtcbiAgICBjb25zdCB7IHNlcnZlciB9ID0gYXdhaXQgY3JlYXRlSHR0cFNlcnZlcih0aGlzLnBvcnQpXG4gICAgdGhpcy5odHRwU2VydmVyID0gc2VydmVyXG5cbiAgICB0aGlzLmV2ZW50c1dhdGNoZXIgPSBuZXcgRXZlbnRzV2F0Y2hlcihgaHR0cDovL2xvY2FsaG9zdDoke3RoaXMucG9ydH1gKVxuICAgIHRoaXMuZXZlbnRzV2F0Y2hlci5zdGFydCgpXG5cbiAgICB0aGlzLmV2ZW50c1dhdGNoZXIub24oXG4gICAgICBcIkZJTEVfVVBEQVRFRFwiLFxuICAgICAgdGhpcy5oYW5kbGVGaWxlVXBkYXRlZEV2ZW50RnJvbVNlcnZlci5iaW5kKHRoaXMpLFxuICAgIClcblxuICAgIHRoaXMuZmlsZXN5c3RlbVdhdGNoZXIgPSBjaG9raWRhci53YXRjaCh0aGlzLnByb2plY3REaXIsIHtcbiAgICAgIHBlcnNpc3RlbnQ6IHRydWUsXG4gICAgICBpZ25vcmVJbml0aWFsOiB0cnVlLFxuICAgIH0pXG5cbiAgICB0aGlzLmZpbGVzeXN0ZW1XYXRjaGVyLm9uKFwiY2hhbmdlXCIsIChmaWxlUGF0aCkgPT5cbiAgICAgIHRoaXMuaGFuZGxlRmlsZUNoYW5nZWRPbkZpbGVzeXN0ZW0oZmlsZVBhdGgpLFxuICAgIClcbiAgICB0aGlzLmZpbGVzeXN0ZW1XYXRjaGVyLm9uKFwiYWRkXCIsIChmaWxlUGF0aCkgPT5cbiAgICAgIHRoaXMuaGFuZGxlRmlsZUNoYW5nZWRPbkZpbGVzeXN0ZW0oZmlsZVBhdGgpLFxuICAgIClcblxuICAgIHRoaXMudXBzZXJ0SW5pdGlhbEZpbGVzKClcbiAgfVxuXG4gIGFzeW5jIGFkZEVudHJ5cG9pbnQoKSB7XG4gICAgY29uc3QgcmVsYXRpdmVDb21wb25lbnRGaWxlUGF0aCA9IHBhdGgucmVsYXRpdmUoXG4gICAgICB0aGlzLnByb2plY3REaXIsXG4gICAgICB0aGlzLmNvbXBvbmVudEZpbGVQYXRoLFxuICAgIClcbiAgICBhd2FpdCB0aGlzLmZzS3kucG9zdChcImFwaS9maWxlcy91cHNlcnRcIiwge1xuICAgICAganNvbjoge1xuICAgICAgICBmaWxlX3BhdGg6IFwiZW50cnlwb2ludC50c3hcIixcbiAgICAgICAgdGV4dF9jb250ZW50OiBgXG5pbXBvcnQgTXlDaXJjdWl0IGZyb20gXCIuLyR7cmVsYXRpdmVDb21wb25lbnRGaWxlUGF0aH1cIlxuXG5jaXJjdWl0LmFkZCg8TXlDaXJjdWl0IC8+KVxuYCxcbiAgICAgIH0sXG4gICAgfSlcbiAgfVxuXG4gIGFzeW5jIGhhbmRsZUZpbGVVcGRhdGVkRXZlbnRGcm9tU2VydmVyKGV2OiBGaWxlVXBkYXRlZEV2ZW50KSB7XG4gICAgaWYgKGV2LmluaXRpYXRvciA9PT0gXCJmaWxlc3lzdGVtX2NoYW5nZVwiKSByZXR1cm5cblxuICAgIGlmIChldi5maWxlX3BhdGggPT09IFwibWFudWFsLWVkaXRzLmpzb25cIikge1xuICAgICAgY29uc29sZS5sb2coXCJNYW51YWwgZWRpdHMgdXBkYXRlZCwgdXBkYXRpbmcgb24gZmlsZXN5c3RlbS4uLlwiKVxuICAgICAgY29uc3QgeyBmaWxlIH0gPSBhd2FpdCB0aGlzLmZzS3lcbiAgICAgICAgLmdldChcImFwaS9maWxlcy9nZXRcIiwge1xuICAgICAgICAgIHNlYXJjaFBhcmFtczogeyBmaWxlX3BhdGg6IGV2LmZpbGVfcGF0aCB9LFxuICAgICAgICB9KVxuICAgICAgICAuanNvbigpXG4gICAgICBmcy53cml0ZUZpbGVTeW5jKFxuICAgICAgICBwYXRoLmpvaW4odGhpcy5wcm9qZWN0RGlyLCBcIm1hbnVhbC1lZGl0cy5qc29uXCIpLFxuICAgICAgICBmaWxlLnRleHRfY29udGVudCxcbiAgICAgIClcbiAgICB9XG4gIH1cblxuICBhc3luYyBoYW5kbGVGaWxlQ2hhbmdlZE9uRmlsZXN5c3RlbShhYnNvbHV0ZUZpbGVQYXRoOiBzdHJpbmcpIHtcbiAgICBjb25zdCByZWxhdGl2ZUZpbGVQYXRoID0gcGF0aC5yZWxhdGl2ZSh0aGlzLnByb2plY3REaXIsIGFic29sdXRlRmlsZVBhdGgpXG5cbiAgICAvLyBXZSd2ZSB0ZW1wb3JhcmlseSBkaXNhYmxlZCB1cHNlcnRpbmcgbWFudWFsIGVkaXRzIGZyb20gZmlsZXN5c3RlbSBjaGFuZ2VzXG4gICAgLy8gYmVjYXVzZSBpdCBjYW4gYmUgZWRpdGVkIGJ5IHRoZSBicm93c2VyXG4gICAgaWYgKHJlbGF0aXZlRmlsZVBhdGguaW5jbHVkZXMoXCJtYW51YWwtZWRpdHMuanNvblwiKSkgcmV0dXJuXG5cbiAgICBhd2FpdCB0aGlzLmZzS3lcbiAgICAgIC5wb3N0KFwiYXBpL2ZpbGVzL3Vwc2VydFwiLCB7XG4gICAgICAgIGpzb246IHtcbiAgICAgICAgICBmaWxlX3BhdGg6IHJlbGF0aXZlRmlsZVBhdGgsXG4gICAgICAgICAgdGV4dF9jb250ZW50OiBmcy5yZWFkRmlsZVN5bmMoYWJzb2x1dGVGaWxlUGF0aCwgXCJ1dGYtOFwiKSxcbiAgICAgICAgICBpbml0aWF0b3I6IFwiZmlsZXN5c3RlbV9jaGFuZ2VcIixcbiAgICAgICAgfSxcbiAgICAgIH0pXG4gICAgICAuanNvbigpXG4gIH1cblxuICBhc3luYyB1cHNlcnRJbml0aWFsRmlsZXMoKSB7XG4gICAgLy8gU2NhbiBwcm9qZWN0IGRpcmVjdG9yeSBmb3IgYWxsIGZpbGVzIGFuZCB1cHNlcnQgdGhlbVxuICAgIGNvbnN0IGZpbGVOYW1lcyA9IGZzLnJlYWRkaXJTeW5jKHRoaXMucHJvamVjdERpcilcbiAgICBmb3IgKGNvbnN0IGZpbGVOYW1lIG9mIGZpbGVOYW1lcykge1xuICAgICAgaWYgKGZzLnN0YXRTeW5jKHBhdGguam9pbih0aGlzLnByb2plY3REaXIsIGZpbGVOYW1lKSkuaXNEaXJlY3RvcnkoKSlcbiAgICAgICAgY29udGludWVcbiAgICAgIGNvbnN0IGZpbGVDb250ZW50ID0gZnMucmVhZEZpbGVTeW5jKFxuICAgICAgICBwYXRoLmpvaW4odGhpcy5wcm9qZWN0RGlyLCBmaWxlTmFtZSksXG4gICAgICAgIFwidXRmLThcIixcbiAgICAgIClcbiAgICAgIGF3YWl0IHRoaXMuZnNLeS5wb3N0KFwiYXBpL2ZpbGVzL3Vwc2VydFwiLCB7XG4gICAgICAgIGpzb246IHtcbiAgICAgICAgICBmaWxlX3BhdGg6IGZpbGVOYW1lLFxuICAgICAgICAgIHRleHRfY29udGVudDogZmlsZUNvbnRlbnQsXG4gICAgICAgICAgaW5pdGlhdG9yOiBcImZpbGVzeXN0ZW1fY2hhbmdlXCIsXG4gICAgICAgIH0sXG4gICAgICB9KVxuICAgIH1cbiAgfVxuXG4gIGFzeW5jIHN0b3AoKSB7XG4gICAgdGhpcy5odHRwU2VydmVyPy5jbG9zZSgpXG4gICAgdGhpcy5ldmVudHNXYXRjaGVyPy5zdG9wKClcbiAgfVxufVxuIiwgImltcG9ydCAqIGFzIGh0dHAgZnJvbSBcIm5vZGU6aHR0cFwiXG5pbXBvcnQgKiBhcyBmcyBmcm9tIFwibm9kZTpmc1wiXG5pbXBvcnQgKiBhcyBwYXRoIGZyb20gXCJub2RlOnBhdGhcIlxuaW1wb3J0IHsgZ2V0Tm9kZUhhbmRsZXIgfSBmcm9tIFwid2ludGVyc3BlYy9hZGFwdGVycy9ub2RlXCJcbmltcG9ydCBwa2cgZnJvbSBcIi4uLy4uL3BhY2thZ2UuanNvblwiXG5cbi8vIEB0cy1pZ25vcmVcbmltcG9ydCB3aW50ZXJzcGVjQnVuZGxlIGZyb20gXCJAdHNjaXJjdWl0L2ZpbGUtc2VydmVyL2Rpc3QvYnVuZGxlLmpzXCJcbmltcG9ydCB7IGdldEluZGV4IH0gZnJvbSBcIi4uL3NpdGUvZ2V0SW5kZXhcIlxuXG5leHBvcnQgY29uc3QgY3JlYXRlSHR0cFNlcnZlciA9IGFzeW5jIChwb3J0ID0gMzAwMCkgPT4ge1xuICBjb25zdCBmaWxlU2VydmVySGFuZGxlciA9IGdldE5vZGVIYW5kbGVyKHdpbnRlcnNwZWNCdW5kbGUgYXMgYW55LCB7fSlcblxuICBjb25zdCBzZXJ2ZXIgPSBodHRwLmNyZWF0ZVNlcnZlcihhc3luYyAocmVxLCByZXMpID0+IHtcbiAgICBjb25zdCB1cmwgPSBuZXcgVVJMKHJlcS51cmwhLCBgaHR0cDovLyR7cmVxLmhlYWRlcnMuaG9zdH1gKVxuXG4gICAgaWYgKHVybC5wYXRobmFtZSA9PT0gXCIvc3RhbmRhbG9uZS5taW4uanNcIikge1xuICAgICAgY29uc3Qgc3RhbmRhbG9uZUZpbGVQYXRoID1cbiAgICAgICAgcHJvY2Vzcy5lbnYuUlVORlJBTUVfU1RBTkRBTE9ORV9GSUxFX1BBVEggfHxcbiAgICAgICAgcGF0aC5yZXNvbHZlKFxuICAgICAgICAgIHByb2Nlc3MuY3dkKCksXG4gICAgICAgICAgXCJub2RlX21vZHVsZXNcIixcbiAgICAgICAgICBcIkB0c2NpcmN1aXQvcnVuZnJhbWUvZGlzdC9zdGFuZGFsb25lLm1pbi5qc1wiLFxuICAgICAgICApXG5cbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IGNvbnRlbnQgPSBmcy5yZWFkRmlsZVN5bmMoc3RhbmRhbG9uZUZpbGVQYXRoLCBcInV0ZjhcIilcbiAgICAgICAgcmVzLndyaXRlSGVhZCgyMDAsIHtcbiAgICAgICAgICBcIkNvbnRlbnQtVHlwZVwiOiBcImFwcGxpY2F0aW9uL2phdmFzY3JpcHQ7IGNoYXJzZXQ9dXRmLThcIixcbiAgICAgICAgfSlcbiAgICAgICAgcmVzLmVuZChjb250ZW50KVxuICAgICAgICByZXR1cm5cbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoXCJFcnJvciBzZXJ2aW5nIHN0YW5kYWxvbmUubWluLmpzOlwiLCBlcnJvcilcbiAgICAgIH1cblxuICAgICAgcmVzLndyaXRlSGVhZCgzMDIsIHtcbiAgICAgICAgTG9jYXRpb246IGBodHRwczovL2Nkbi5qc2RlbGl2ci5uZXQvbnBtL0B0c2NpcmN1aXQvcnVuZnJhbWVAJHtwa2cuZGVwZW5kZW5jaWVzW1wiQHRzY2lyY3VpdC9ydW5mcmFtZVwiXS5yZXBsYWNlKC9eW14wLTldKy8sIFwiXCIpfS9kaXN0L3N0YW5kYWxvbmUubWluLmpzYCxcbiAgICAgIH0pXG4gICAgICByZXMuZW5kKClcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGlmICh1cmwucGF0aG5hbWUgPT09IFwiL1wiKSB7XG4gICAgICBjb25zdCBodG1sID0gYXdhaXQgZ2V0SW5kZXgoKVxuICAgICAgcmVzLndyaXRlSGVhZCgyMDAsIHsgXCJDb250ZW50LVR5cGVcIjogXCJ0ZXh0L2h0bWxcIiB9KVxuICAgICAgcmVzLmVuZChodG1sKVxuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgaWYgKHVybC5wYXRobmFtZS5zdGFydHNXaXRoKFwiL2FwaS9cIikpIHtcbiAgICAgIHJlcS51cmwgPSByZXEudXJsIS5yZXBsYWNlKFwiL2FwaS9cIiwgXCIvXCIpXG4gICAgICBmaWxlU2VydmVySGFuZGxlcihyZXEsIHJlcylcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIHJlcy53cml0ZUhlYWQoNDA0KVxuICAgIHJlcy5lbmQoXCJOb3QgZm91bmRcIilcbiAgfSlcblxuICByZXR1cm4gbmV3IFByb21pc2U8eyBzZXJ2ZXI6IGh0dHAuU2VydmVyIH0+KChyZXNvbHZlKSA9PiB7XG4gICAgc2VydmVyLmxpc3Rlbihwb3J0LCAoKSA9PiB7XG4gICAgICBjb25zb2xlLmxvZyhgU2VydmVyIHJ1bm5pbmcgYXQgaHR0cDovL2xvY2FsaG9zdDoke3BvcnR9YClcbiAgICAgIHJlc29sdmUoeyBzZXJ2ZXIgfSlcbiAgICB9KVxuICB9KVxufVxuIiwgIntcbiAgXCJuYW1lXCI6IFwiQHRzY2lyY3VpdC9jbGlcIixcbiAgXCJtYWluXCI6IFwiZGlzdC9tYWluLmpzXCIsXG4gIFwidHlwZVwiOiBcIm1vZHVsZVwiLFxuICBcInZlcnNpb25cIjogXCIwLjEuOFwiLFxuICBcImJpblwiOiB7XG4gICAgXCJ0c2NpXCI6IFwiLi9kaXN0L21haW4uanNcIlxuICB9LFxuICBcInNjcmlwdHNcIjoge1xuICAgIFwic3RhcnRcIjogXCJidW4gcnVuIGRldlwiLFxuICAgIFwiZGV2XCI6IFwiYnVuIC0taG90IC4vY2xpL21haW4udHMgZGV2IC4vZXhhbXBsZS1kaXIvc25pcHBldC50c3hcIixcbiAgICBcImJ1aWxkXCI6IFwidHN1cC1ub2RlIGNsaS9tYWluLnRzIC0tZm9ybWF0IGVzbSAtLXNvdXJjZW1hcCBpbmxpbmVcIixcbiAgICBcImZvcm1hdFwiOiBcImJpb21lIGZvcm1hdCAtLXdyaXRlIC5cIixcbiAgICBcImZvcm1hdDpjaGVja1wiOiBcImJpb21lIGZvcm1hdCAuXCIsXG4gICAgXCJjbGlcIjogXCJidW4gLi9jbGkvbWFpbi50c1wiXG4gIH0sXG4gIFwiZGV2RGVwZW5kZW5jaWVzXCI6IHtcbiAgICBcIkBiaW9tZWpzL2Jpb21lXCI6IFwiXjEuOS40XCIsXG4gICAgXCJAdHNjaXJjdWl0L2NvcmVcIjogXCJeMC4wLjI0OVwiLFxuICAgIFwiQHR5cGVzL2J1blwiOiBcIl4xLjEuMTVcIixcbiAgICBcIkB0eXBlcy9jb25maWdzdG9yZVwiOiBcIl42LjAuMlwiLFxuICAgIFwiQHR5cGVzL3JlYWN0XCI6IFwiXjE5LjAuMVwiLFxuICAgIFwiQHR5cGVzL3NlbXZlclwiOiBcIl43LjUuOFwiLFxuICAgIFwiZ2V0LXBvcnRcIjogXCJeNy4xLjBcIixcbiAgICBcInRlbXB5XCI6IFwiXjMuMS4wXCIsXG4gICAgXCJ0c3VwXCI6IFwiXjguMy41XCIsXG4gICAgXCJ0eXBlZC1reVwiOiBcIl4wLjAuNFwiXG4gIH0sXG4gIFwicGVlckRlcGVuZGVuY2llc1wiOiB7XG4gICAgXCJ0eXBlc2NyaXB0XCI6IFwiXjUuMC4wXCJcbiAgfSxcbiAgXCJkZXBlbmRlbmNpZXNcIjoge1xuICAgIFwiQHRzY2lyY3VpdC9maWxlLXNlcnZlclwiOiBcIl4wLjAuMTNcIixcbiAgICBcIkB0c2NpcmN1aXQvcnVuZnJhbWVcIjogXCJeMC4wLjQ3XCIsXG4gICAgXCJjaG9raWRhclwiOiBcIl40LjAuMVwiLFxuICAgIFwiY29tbWFuZGVyXCI6IFwiXjEyLjEuMFwiLFxuICAgIFwiY29uZmlnc3RvcmVcIjogXCJeNy4wLjBcIixcbiAgICBcImNvc21pY29uZmlnXCI6IFwiXjkuMC4wXCIsXG4gICAgXCJkZWxheVwiOiBcIl42LjAuMFwiLFxuICAgIFwia3lcIjogXCJeMS43LjRcIixcbiAgICBcIm1ha2UtdmZzXCI6IFwiXjEuMC4xNVwiLFxuICAgIFwicGVyZmVjdC1jbGlcIjogXCJeMS4wLjIwXCIsXG4gICAgXCJzZW12ZXJcIjogXCJeNy42LjNcIlxuICB9XG59XG4iLCAiaW1wb3J0IHBrZyBmcm9tIFwiLi4vLi4vcGFja2FnZS5qc29uXCJcblxuZXhwb3J0IGNvbnN0IGdldEluZGV4ID0gYXN5bmMgKCkgPT4ge1xuICByZXR1cm4gYDxodG1sPlxuICAgIDxoZWFkPlxuICAgIDwvaGVhZD5cbiAgICA8Ym9keT5cbiAgICAgIDxzY3JpcHQgc3JjPVwiaHR0cHM6Ly9jZG4udGFpbHdpbmRjc3MuY29tXCI+PC9zY3JpcHQ+XG4gICAgICA8ZGl2IGlkPVwicm9vdFwiPmxvYWRpbmcuLi48L2Rpdj5cbiAgICAgIDxzY3JpcHQ+XG4gICAgICBnbG9iYWxUaGlzLnByb2Nlc3MgPSB7IGVudjogeyBOT0RFX0VOVjogXCJwcm9kdWN0aW9uXCIgfSB9XG4gICAgICA8L3NjcmlwdD5cbiAgICAgIDxzY3JpcHQgc3JjPVwiL3N0YW5kYWxvbmUubWluLmpzXCI+PC9zY3JpcHQ+XG4gICAgPC9ib2R5PlxuICA8L2h0bWw+YFxufVxuXG4vLyA8c2NyaXB0IHNyYz1cImh0dHBzOi8vY2RuLmpzZGVsaXZyLm5ldC9ucG0vQHRzY2lyY3VpdC9ydW5mcmFtZUAke3BrZy5kZXBlbmRlbmNpZXNbXCJAdHNjaXJjdWl0L3J1bmZyYW1lXCJdLnJlcGxhY2UoL15bXjAtOV0rLywgXCJcIil9L2Rpc3Qvc3RhbmRhbG9uZS5taW4uanNcIj48L3NjcmlwdD5cbiIsICJpbXBvcnQgeyBFdmVudEVtaXR0ZXIgfSBmcm9tIFwiZXZlbnRzXCJcblxuaW50ZXJmYWNlIEV2ZW50IHtcbiAgZXZlbnRfaWQ6IHN0cmluZ1xuICBjcmVhdGVkX2F0OiBzdHJpbmdcbiAgZXZlbnRfdHlwZTogc3RyaW5nXG4gIFtrZXk6IHN0cmluZ106IGFueVxufVxuXG5pbnRlcmZhY2UgRXZlbnRzUmVzcG9uc2Uge1xuICBldmVudF9saXN0OiBFdmVudFtdXG59XG5cbmV4cG9ydCBjbGFzcyBFdmVudHNXYXRjaGVyIGV4dGVuZHMgRXZlbnRFbWl0dGVyIHtcbiAgcHJpdmF0ZSBsYXN0UG9sbFRpbWU6IHN0cmluZ1xuICBwcml2YXRlIHBvbGxJbnRlcnZhbDogbnVtYmVyXG4gIHByaXZhdGUgYmFzZVVybDogc3RyaW5nXG4gIHByaXZhdGUgcG9sbGluZyA9IGZhbHNlXG4gIHByaXZhdGUgdGltZW91dElkPzogTm9kZUpTLlRpbWVvdXRcblxuICBjb25zdHJ1Y3RvcihiYXNlVXJsID0gXCJodHRwOi8vbG9jYWxob3N0OjMwMDBcIiwgcG9sbEludGVydmFsID0gMTAwMCkge1xuICAgIHN1cGVyKClcbiAgICB0aGlzLmJhc2VVcmwgPSBiYXNlVXJsXG4gICAgdGhpcy5wb2xsSW50ZXJ2YWwgPSBwb2xsSW50ZXJ2YWxcbiAgICB0aGlzLmxhc3RQb2xsVGltZSA9IG5ldyBEYXRlKCkudG9JU09TdHJpbmcoKVxuICB9XG5cbiAgYXN5bmMgc3RhcnQoKSB7XG4gICAgaWYgKHRoaXMucG9sbGluZykgcmV0dXJuXG4gICAgdGhpcy5wb2xsaW5nID0gdHJ1ZVxuICAgIGF3YWl0IHRoaXMucG9sbCgpXG4gIH1cblxuICBzdG9wKCkge1xuICAgIHRoaXMucG9sbGluZyA9IGZhbHNlXG4gICAgaWYgKHRoaXMudGltZW91dElkKSB7XG4gICAgICBjbGVhclRpbWVvdXQodGhpcy50aW1lb3V0SWQpXG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBwb2xsKCkge1xuICAgIGlmICghdGhpcy5wb2xsaW5nKSByZXR1cm5cblxuICAgIHRyeSB7XG4gICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGZldGNoKFxuICAgICAgICBgJHt0aGlzLmJhc2VVcmx9L2FwaS9ldmVudHMvbGlzdD9zaW5jZT0ke2VuY29kZVVSSUNvbXBvbmVudCh0aGlzLmxhc3RQb2xsVGltZSl9YCxcbiAgICAgIClcblxuICAgICAgaWYgKCFyZXNwb25zZS5vaykge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEhUVFAgZXJyb3IhIHN0YXR1czogJHtyZXNwb25zZS5zdGF0dXN9YClcbiAgICAgIH1cblxuICAgICAgY29uc3QgZGF0YTogRXZlbnRzUmVzcG9uc2UgPSBhd2FpdCByZXNwb25zZS5qc29uKClcblxuICAgICAgLy8gVXBkYXRlIGxhc3QgcG9sbCB0aW1lIHRvIGxhdGVzdCBldmVudCBvciBjdXJyZW50IHRpbWVcbiAgICAgIGNvbnN0IGxhdGVzdEV2ZW50ID0gZGF0YS5ldmVudF9saXN0W2RhdGEuZXZlbnRfbGlzdC5sZW5ndGggLSAxXVxuICAgICAgdGhpcy5sYXN0UG9sbFRpbWUgPSBsYXRlc3RFdmVudFxuICAgICAgICA/IGxhdGVzdEV2ZW50LmNyZWF0ZWRfYXRcbiAgICAgICAgOiBuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKClcblxuICAgICAgLy8gRW1pdCBldmVudHMgaW4gY2hyb25vbG9naWNhbCBvcmRlclxuICAgICAgZGF0YS5ldmVudF9saXN0LmZvckVhY2goKGV2ZW50KSA9PiB7XG4gICAgICAgIHRoaXMuZW1pdChldmVudC5ldmVudF90eXBlLCBldmVudClcbiAgICAgICAgdGhpcy5lbWl0KFwiKlwiLCBldmVudClcbiAgICAgIH0pXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIHRoaXMuZW1pdChcImVycm9yXCIsIGVycm9yKVxuICAgIH1cbiAgICAvLyBTY2hlZHVsZSBuZXh0IHBvbGxcbiAgICB0aGlzLnRpbWVvdXRJZCA9IGdsb2JhbFRoaXMuc2V0VGltZW91dChcbiAgICAgICgpID0+IHRoaXMucG9sbCgpLFxuICAgICAgdGhpcy5wb2xsSW50ZXJ2YWwsXG4gICAgKSBhcyB1bmtub3duIGFzIE5vZGVKUy5UaW1lb3V0XG4gIH1cbn1cbiIsICJpbXBvcnQgQ29uZmlnc3RvcmUgZnJvbSBcImNvbmZpZ3N0b3JlXCJcbmltcG9ydCB0eXBlIHsgVHlwZWRDb25maWdzdG9yZSB9IGZyb20gXCIuL1R5cGVkQ29uZmlnU3RvcmVcIlxuXG5leHBvcnQgaW50ZXJmYWNlIENsaUNvbmZpZyB7XG4gIHNlc3Npb25Ub2tlbj86IHN0cmluZ1xuICBnaXRodWJVc2VybmFtZT86IHN0cmluZ1xuICByZWdpc3RyeUFwaVVybD86IHN0cmluZ1xufVxuXG5leHBvcnQgY29uc3QgY2xpQ29uZmlnOiBUeXBlZENvbmZpZ3N0b3JlPENsaUNvbmZpZz4gPSBuZXcgQ29uZmlnc3RvcmUoXG4gIFwidHNjaXJjdWl0XCIsXG4pXG5cbmV4cG9ydCBjb25zdCBnZXRSZWdpc3RyeUFwaVVybCA9ICgpOiBzdHJpbmcgPT4ge1xuICByZXR1cm4gY2xpQ29uZmlnLmdldChcInJlZ2lzdHJ5QXBpVXJsXCIpID8/IFwiaHR0cHM6Ly9yZWdpc3RyeS1hcGkudHNjaXJjdWl0LmNvbVwiXG59XG4iLCAiaW1wb3J0IHR5cGUgeyBDb21tYW5kIH0gZnJvbSBcImNvbW1hbmRlclwiXG5pbXBvcnQgeyBjbGlDb25maWcgfSBmcm9tIFwibGliL2NsaS1jb25maWdcIlxuaW1wb3J0IGRlbGF5IGZyb20gXCJkZWxheVwiXG5pbXBvcnQgeyBnZXRLeSB9IGZyb20gXCJsaWIvcmVnaXN0cnktYXBpL2dldC1reVwiXG5pbXBvcnQgdHlwZSB7IEVuZHBvaW50UmVzcG9uc2UgfSBmcm9tIFwibGliL3JlZ2lzdHJ5LWFwaS9lbmRwb2ludC10eXBlc1wiXG5cbmV4cG9ydCBjb25zdCByZWdpc3RlckF1dGhMb2dpbiA9IChwcm9ncmFtOiBDb21tYW5kKSA9PiB7XG4gIHByb2dyYW0uY29tbWFuZHNcbiAgICAuZmluZCgoYykgPT4gYy5uYW1lKCkgPT09IFwiYXV0aFwiKSFcbiAgICAuY29tbWFuZChcImxvZ2luXCIpXG4gICAgLmRlc2NyaXB0aW9uKFwiQXV0aGVudGljYXRlIENMSSwgbG9naW4gdG8gcmVnaXN0cnlcIilcbiAgICAuYWN0aW9uKGFzeW5jIChhcmdzKSA9PiB7XG4gICAgICBjb25zdCBreSA9IGdldEt5KClcblxuICAgICAgY29uc3QgeyBsb2dpbl9wYWdlIH0gPSBhd2FpdCBreVxuICAgICAgICAucG9zdDxFbmRwb2ludFJlc3BvbnNlW1wic2Vzc2lvbnMvbG9naW5fcGFnZS9jcmVhdGVcIl0+KFxuICAgICAgICAgIFwic2Vzc2lvbnMvbG9naW5fcGFnZS9jcmVhdGVcIixcbiAgICAgICAgICB7XG4gICAgICAgICAgICBqc29uOiB7fSxcbiAgICAgICAgICB9LFxuICAgICAgICApXG4gICAgICAgIC5qc29uKClcblxuICAgICAgY29uc29sZS5sb2coXCJQbGVhc2UgdmlzaXQgdGhlIGZvbGxvd2luZyBVUkwgdG8gbG9nIGluOlwiKVxuICAgICAgY29uc29sZS5sb2cobG9naW5fcGFnZS51cmwpXG5cbiAgICAgIC8vIFdhaXQgdW50aWwgd2UgcmVjZWl2ZSBjb25maXJtYXRpb25cbiAgICAgIHdoaWxlICh0cnVlKSB7XG4gICAgICAgIGNvbnN0IHsgbG9naW5fcGFnZTogbmV3X2xvZ2luX3BhZ2UgfSA9IGF3YWl0IGt5XG4gICAgICAgICAgLnBvc3Q8RW5kcG9pbnRSZXNwb25zZVtcInNlc3Npb25zL2xvZ2luX3BhZ2UvZ2V0XCJdPihcbiAgICAgICAgICAgIFwic2Vzc2lvbnMvbG9naW5fcGFnZS9nZXRcIixcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAganNvbjoge1xuICAgICAgICAgICAgICAgIGxvZ2luX3BhZ2VfaWQ6IGxvZ2luX3BhZ2UubG9naW5fcGFnZV9pZCxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgaGVhZGVyczoge1xuICAgICAgICAgICAgICAgIEF1dGhvcml6YXRpb246IGBCZWFyZXIgJHtsb2dpbl9wYWdlLmxvZ2luX3BhZ2VfYXV0aF90b2tlbn1gLFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICApXG4gICAgICAgICAgLmpzb24oKVxuXG4gICAgICAgIGlmIChuZXdfbG9naW5fcGFnZS53YXNfbG9naW5fc3VjY2Vzc2Z1bCkge1xuICAgICAgICAgIGNvbnNvbGUubG9nKFwiTG9nZ2VkIGluISBHZW5lcmF0aW5nIHRva2VuLi4uXCIpXG4gICAgICAgICAgYnJlYWtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChuZXdfbG9naW5fcGFnZS5pc19leHBpcmVkKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiTG9naW4gcGFnZSBleHBpcmVkXCIpXG4gICAgICAgIH1cblxuICAgICAgICBhd2FpdCBkZWxheSgxMDAwKVxuICAgICAgfVxuXG4gICAgICBjb25zdCB7IHNlc3Npb24gfSA9IGF3YWl0IGt5XG4gICAgICAgIC5wb3N0PEVuZHBvaW50UmVzcG9uc2VbXCJzZXNzaW9ucy9sb2dpbl9wYWdlL2V4Y2hhbmdlX2Zvcl9jbGlfc2Vzc2lvblwiXT4oXG4gICAgICAgICAgXCJzZXNzaW9ucy9sb2dpbl9wYWdlL2V4Y2hhbmdlX2Zvcl9jbGlfc2Vzc2lvblwiLFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIGpzb246IHtcbiAgICAgICAgICAgICAgbG9naW5fcGFnZV9pZDogbG9naW5fcGFnZS5sb2dpbl9wYWdlX2lkLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGhlYWRlcnM6IHtcbiAgICAgICAgICAgICAgQXV0aG9yaXphdGlvbjogYEJlYXJlciAke2xvZ2luX3BhZ2UubG9naW5fcGFnZV9hdXRoX3Rva2VufWAsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIH0sXG4gICAgICAgIClcbiAgICAgICAgLmpzb24oKVxuXG4gICAgICBjbGlDb25maWcuc2V0KFwic2Vzc2lvblRva2VuXCIsIHNlc3Npb24udG9rZW4pXG5cbiAgICAgIGNvbnNvbGUubG9nKFwiUmVhZHkgdG8gdXNlIVwiKVxuICAgIH0pXG59XG4iLCAiaW1wb3J0IHsgZ2V0UmVnaXN0cnlBcGlVcmwgfSBmcm9tIFwibGliL2NsaS1jb25maWdcIlxuaW1wb3J0IGt5LCB7IHR5cGUgQWZ0ZXJSZXNwb25zZUhvb2sgfSBmcm9tIFwia3lcIlxuXG5jb25zdCBwcmV0dHlSZXNwb25zZUVycm9ySG9vazogQWZ0ZXJSZXNwb25zZUhvb2sgPSBhc3luYyAoXG4gIF9yZXF1ZXN0LFxuICBfb3B0aW9ucyxcbiAgcmVzcG9uc2UsXG4pID0+IHtcbiAgaWYgKCFyZXNwb25zZS5vaykge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBlcnJvckRhdGEgPSBhd2FpdCByZXNwb25zZS5qc29uKClcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYEZBSUwgWyR7cmVzcG9uc2Uuc3RhdHVzfV06ICR7X3JlcXVlc3QubWV0aG9kfSAke1xuICAgICAgICAgIG5ldyBVUkwoX3JlcXVlc3QudXJsKS5wYXRobmFtZVxuICAgICAgICB9IFxcblxcbiAke0pTT04uc3RyaW5naWZ5KGVycm9yRGF0YSwgbnVsbCwgMil9YCxcbiAgICAgIClcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICAvL2lnbm9yZSwgYWxsb3cgdGhlIGVycm9yIHRvIGJlIHRocm93blxuICAgIH1cbiAgfVxufVxuXG5leHBvcnQgY29uc3QgZ2V0S3kgPSAoKSA9PiB7XG4gIHJldHVybiBreS5jcmVhdGUoe1xuICAgIHByZWZpeFVybDogZ2V0UmVnaXN0cnlBcGlVcmwoKSxcbiAgICBob29rczoge1xuICAgICAgYWZ0ZXJSZXNwb25zZTogW3ByZXR0eVJlc3BvbnNlRXJyb3JIb29rXSxcbiAgICB9LFxuICB9KVxufVxuIiwgImltcG9ydCB0eXBlIHsgQ29tbWFuZCB9IGZyb20gXCJjb21tYW5kZXJcIlxuXG5leHBvcnQgY29uc3QgcmVnaXN0ZXJBdXRoTG9nb3V0ID0gKHByb2dyYW06IENvbW1hbmQpID0+IHtcbiAgcHJvZ3JhbS5jb21tYW5kc1xuICAgIC5maW5kKChjKSA9PiBjLm5hbWUoKSA9PT0gXCJhdXRoXCIpIVxuICAgIC5jb21tYW5kKFwibG9nb3V0XCIpXG4gICAgLmRlc2NyaXB0aW9uKFwiTG9nb3V0IGZyb20gcmVnaXN0cnlcIilcbiAgICAuYWN0aW9uKChhcmdzKSA9PiB7XG4gICAgICBjb25zb2xlLmxvZyhcImxvZ291dFwiKVxuICAgIH0pXG59XG4iLCAiaW1wb3J0IHR5cGUgeyBDb21tYW5kIH0gZnJvbSBcImNvbW1hbmRlclwiXG5cbmV4cG9ydCBjb25zdCByZWdpc3RlckF1dGggPSAocHJvZ3JhbTogQ29tbWFuZCkgPT4ge1xuICBwcm9ncmFtLmNvbW1hbmQoXCJhdXRoXCIpLmRlc2NyaXB0aW9uKFwiTG9naW4vbG9nb3V0XCIpXG59XG4iLCAiaW1wb3J0IHR5cGUgeyBDb21tYW5kIH0gZnJvbSBcImNvbW1hbmRlclwiXG5cbmV4cG9ydCBjb25zdCByZWdpc3RlckNvbmZpZyA9IChwcm9ncmFtOiBDb21tYW5kKSA9PiB7XG4gIHByb2dyYW0uY29tbWFuZChcImNvbmZpZ1wiKS5kZXNjcmlwdGlvbihcIk1hbmFnZSB0c2NpcmN1aXQgQ0xJIGNvbmZpZ3VyYXRpb25cIilcbn1cbiIsICJpbXBvcnQgdHlwZSB7IENvbW1hbmQgfSBmcm9tIFwiY29tbWFuZGVyXCJcbmltcG9ydCB7IGNsaUNvbmZpZyB9IGZyb20gXCJsaWIvY2xpLWNvbmZpZ1wiXG5cbmV4cG9ydCBjb25zdCByZWdpc3RlckNvbmZpZ1ByaW50ID0gKHByb2dyYW06IENvbW1hbmQpID0+IHtcbiAgcHJvZ3JhbS5jb21tYW5kc1xuICAgIC5maW5kKChjKSA9PiBjLm5hbWUoKSA9PT0gXCJjb25maWdcIikhXG4gICAgLmNvbW1hbmQoXCJwcmludFwiKVxuICAgIC5kZXNjcmlwdGlvbihcIlByaW50IHRoZSBjdXJyZW50IGNvbmZpZ1wiKVxuICAgIC5hY3Rpb24oKCkgPT4ge1xuICAgICAgY29uc29sZS5sb2coSlNPTi5zdHJpbmdpZnkoY2xpQ29uZmlnLmFsbCwgbnVsbCwgMikpXG4gICAgfSlcbn1cbiIsICJpbXBvcnQgdHlwZSB7IENvbW1hbmQgfSBmcm9tIFwiY29tbWFuZGVyXCJcbmltcG9ydCB7IGdldEt5IH0gZnJvbSBcImxpYi9yZWdpc3RyeS1hcGkvZ2V0LWt5XCJcbmltcG9ydCAqIGFzIGZzIGZyb20gXCJub2RlOmZzXCJcbmltcG9ydCAqIGFzIHBhdGggZnJvbSBcIm5vZGU6cGF0aFwiXG5cbmV4cG9ydCBjb25zdCByZWdpc3RlckNsb25lID0gKHByb2dyYW06IENvbW1hbmQpID0+IHtcbiAgcHJvZ3JhbVxuICAgIC5jb21tYW5kKFwiY2xvbmVcIilcbiAgICAuZGVzY3JpcHRpb24oXCJDbG9uZSBhIHNuaXBwZXQgZnJvbSB0aGUgcmVnaXN0cnlcIilcbiAgICAuYXJndW1lbnQoXCI8c25pcHBldD5cIiwgXCJTbmlwcGV0IHRvIGNsb25lIChlLmcuIGF1dGhvci9zbmlwcGV0TmFtZSlcIilcbiAgICAuYWN0aW9uKGFzeW5jIChzbmlwcGV0UGF0aDogc3RyaW5nKSA9PiB7XG4gICAgICBsZXQgYXV0aG9yOiBzdHJpbmdcbiAgICAgIGxldCBzbmlwcGV0TmFtZTogc3RyaW5nXG4gICAgICBpZiAoIXNuaXBwZXRQYXRoLnN0YXJ0c1dpdGgoXCJAdHNjaS9cIikgJiYgc25pcHBldFBhdGguaW5jbHVkZXMoXCIvXCIpKSB7XG4gICAgICAgIDtbYXV0aG9yLCBzbmlwcGV0TmFtZV0gPSBzbmlwcGV0UGF0aC5zcGxpdChcIi9cIilcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnN0IHRyaW1tZWRQYXRoID0gc25pcHBldFBhdGgucmVwbGFjZShcIkB0c2NpL1wiLCBcIlwiKVxuICAgICAgICBjb25zdCBmaXJzdERvdEluZGV4ID0gdHJpbW1lZFBhdGguaW5kZXhPZihcIi5cIilcbiAgICAgICAgYXV0aG9yID0gdHJpbW1lZFBhdGguc2xpY2UoMCwgZmlyc3REb3RJbmRleClcbiAgICAgICAgc25pcHBldE5hbWUgPSB0cmltbWVkUGF0aC5zbGljZShmaXJzdERvdEluZGV4ICsgMSlcbiAgICAgIH1cblxuICAgICAgaWYgKCFhdXRob3IgfHwgIXNuaXBwZXROYW1lKSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoXG4gICAgICAgICAgXCJJbnZhbGlkIHNuaXBwZXQgcGF0aC4gVXNlIGZvcm1hdDogYXV0aG9yL3NuaXBwZXROYW1lLCBhdXRob3Iuc25pcHBldE5hbWUgb3IgQHRzY2kvYXV0aG9yLnNuaXBwZXROYW1lXCIsXG4gICAgICAgIClcbiAgICAgICAgcHJvY2Vzcy5leGl0KDEpXG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGt5ID0gZ2V0S3koKVxuXG4gICAgICB0cnkge1xuICAgICAgICBjb25zb2xlLmxvZyhgQ2xvbmluZyAke2F1dGhvcn0vJHtzbmlwcGV0TmFtZX0uLi5gKVxuXG4gICAgICAgIGNvbnN0IHBhY2thZ2VGaWxlTGlzdCA9IGF3YWl0IGt5XG4gICAgICAgICAgLnBvc3Q8e1xuICAgICAgICAgICAgcGFja2FnZV9maWxlczogQXJyYXk8e1xuICAgICAgICAgICAgICBwYWNrYWdlX2ZpbGVfaWQ6IHN0cmluZ1xuICAgICAgICAgICAgICBwYWNrYWdlX3JlbGVhc2VfaWQ6IHN0cmluZ1xuICAgICAgICAgICAgICBmaWxlX3BhdGg6IHN0cmluZ1xuICAgICAgICAgICAgICBjcmVhdGVkX2F0OiBzdHJpbmdcbiAgICAgICAgICAgIH0+XG4gICAgICAgICAgfT4oXCJwYWNrYWdlX2ZpbGVzL2xpc3RcIiwge1xuICAgICAgICAgICAganNvbjoge1xuICAgICAgICAgICAgICBwYWNrYWdlX25hbWU6IGAke2F1dGhvcn0vJHtzbmlwcGV0TmFtZX1gLFxuICAgICAgICAgICAgICB1c2VfbGF0ZXN0X3ZlcnNpb246IHRydWUsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIH0pXG4gICAgICAgICAgLmpzb24oKVxuXG4gICAgICAgIC8vIENyZWF0ZSBkaXJlY3RvcnkgaWYgaXQgZG9lc24ndCBleGlzdFxuICAgICAgICBjb25zdCBkaXJQYXRoID0gYC4vJHthdXRob3J9LiR7c25pcHBldE5hbWV9YFxuICAgICAgICBpZiAoIWZzLmV4aXN0c1N5bmMoZGlyUGF0aCkpIHtcbiAgICAgICAgICBmcy5ta2RpclN5bmMoZGlyUGF0aClcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIERvd25sb2FkIGVhY2ggZmlsZSB0aGF0IGRvZXNuJ3Qgc3RhcnQgd2l0aCBkaXN0L1xuICAgICAgICBmb3IgKGNvbnN0IGZpbGVJbmZvIG9mIHBhY2thZ2VGaWxlTGlzdC5wYWNrYWdlX2ZpbGVzKSB7XG4gICAgICAgICAgY29uc3QgZmlsZVBhdGggPSBmaWxlSW5mby5maWxlX3BhdGguc3RhcnRzV2l0aChcIi9cIilcbiAgICAgICAgICAgID8gZmlsZUluZm8uZmlsZV9wYXRoLnNsaWNlKDEpXG4gICAgICAgICAgICA6IGZpbGVJbmZvLmZpbGVfcGF0aFxuXG4gICAgICAgICAgaWYgKGZpbGVQYXRoLnN0YXJ0c1dpdGgoXCJkaXN0L1wiKSkgY29udGludWVcblxuICAgICAgICAgIGNvbnN0IGZpbGVDb250ZW50ID0gYXdhaXQga3lcbiAgICAgICAgICAgIC5wb3N0PHtcbiAgICAgICAgICAgICAgcGFja2FnZV9maWxlOiB7XG4gICAgICAgICAgICAgICAgY29udGVudF90ZXh0OiBzdHJpbmdcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfT4oXCJwYWNrYWdlX2ZpbGVzL2dldFwiLCB7XG4gICAgICAgICAgICAgIGpzb246IHtcbiAgICAgICAgICAgICAgICBwYWNrYWdlX25hbWU6IGAke2F1dGhvcn0vJHtzbmlwcGV0TmFtZX1gLFxuICAgICAgICAgICAgICAgIGZpbGVfcGF0aDogZmlsZUluZm8uZmlsZV9wYXRoLFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIC5qc29uKClcblxuICAgICAgICAgIGNvbnN0IGZ1bGxQYXRoID0gcGF0aC5qb2luKGRpclBhdGgsIGZpbGVQYXRoKVxuICAgICAgICAgIGNvbnN0IGRpck5hbWUgPSBwYXRoLmRpcm5hbWUoZnVsbFBhdGgpXG5cbiAgICAgICAgICAvLyBDcmVhdGUgbmVzdGVkIGRpcmVjdG9yaWVzIGlmIHRoZXkgZG9uJ3QgZXhpc3RcbiAgICAgICAgICBpZiAoIWZzLmV4aXN0c1N5bmMoZGlyTmFtZSkpIHtcbiAgICAgICAgICAgIGZzLm1rZGlyU3luYyhkaXJOYW1lLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KVxuICAgICAgICAgIH1cblxuICAgICAgICAgIGZzLndyaXRlRmlsZVN5bmMoZnVsbFBhdGgsIGZpbGVDb250ZW50LnBhY2thZ2VfZmlsZS5jb250ZW50X3RleHQpXG4gICAgICAgIH1cblxuICAgICAgICBjb25zb2xlLmxvZyhgU3VjY2Vzc2Z1bGx5IGNsb25lZCB0byAuLyR7YXV0aG9yfS4ke3NuaXBwZXROYW1lfS9gKVxuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgaWYgKGVycm9yIGluc3RhbmNlb2YgRXJyb3IpIHtcbiAgICAgICAgICBjb25zb2xlLmVycm9yKFwiRmFpbGVkIHRvIGNsb25lIHNuaXBwZXQ6XCIsIGVycm9yLm1lc3NhZ2UpXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY29uc29sZS5lcnJvcihcIkZhaWxlZCB0byBjbG9uZSBzbmlwcGV0OlwiLCBlcnJvcilcbiAgICAgICAgfVxuICAgICAgICBwcm9jZXNzLmV4aXQoMSlcbiAgICAgIH1cbiAgICB9KVxufVxuIiwgImltcG9ydCB0eXBlIHsgQ29tbWFuZCB9IGZyb20gXCJjb21tYW5kZXJcIlxuaW1wb3J0IHsgY3JlYXRlQ2lyY3VpdFdlYldvcmtlciB9IGZyb20gXCJAdHNjaXJjdWl0L2V2YWwtd2Vid29ya2VyXCJcbmltcG9ydCB3ZWJXb3JrZXJCdW5kbGVVcmwgZnJvbSBcIkB0c2NpcmN1aXQvZXZhbC13ZWJ3b3JrZXIvYmxvYi11cmxcIlxuaW1wb3J0IHsgZ2V0VmlydHVhbEZpbGVTeXN0ZW1Gcm9tRGlyUGF0aCB9IGZyb20gXCJtYWtlLXZmc1wiXG5pbXBvcnQgcGF0aCBmcm9tIFwibm9kZTpwYXRoXCJcbmltcG9ydCBmcyBmcm9tIFwibm9kZTpmc1wiXG5cbmNvbnN0IEFMTE9XRURfRk9STUFUUyA9IFtcbiAgXCJqc29uXCIsXG4gIFwiY2lyY3VpdC1qc29uXCIsXG4gIFwic2NoZW1hdGljLXN2Z1wiLFxuICBcInBjYi1zdmdcIixcbiAgXCJnZXJiZXJzXCIsXG4gIFwicmVhZGFibGUtbmV0bGlzdFwiLFxuICBcImdsdGZcIixcbiAgXCJzcGVjY3RyYS1kc25cIixcbl0gYXMgY29uc3RcblxudHlwZSBGb3JtYXQgPSAodHlwZW9mIEFMTE9XRURfRk9STUFUUylbbnVtYmVyXVxuXG5jb25zdCBPVVRQVVRfRVhURU5TSU9OUyA9IHtcbiAganNvbjogXCIuY2lyY3VpdC5qc29uXCIsXG4gIFwiY2lyY3VpdC1qc29uXCI6IFwiLmNpcmN1aXQuanNvblwiLFxuICBcInNjaGVtYXRpYy1zdmdcIjogXCItc2NoZW1hdGljLnN2Z1wiLFxuICBcInBjYi1zdmdcIjogXCItcGNiLnN2Z1wiLFxuICBnZXJiZXJzOiBcIi1nZXJiZXJzLnppcFwiLFxuICBcInJlYWRhYmxlLW5ldGxpc3RcIjogXCItcmVhZGFibGUubmV0bGlzdFwiLFxuICBnbHRmOiBcIi5nbHRmXCIsXG4gIFwic3BlY2N0cmEtZHNuXCI6IFwiLmRzblwiLFxufVxuXG5leHBvcnQgY29uc3QgcmVnaXN0ZXJFeHBvcnQgPSAocHJvZ3JhbTogQ29tbWFuZCkgPT4ge1xuICBwcm9ncmFtXG4gICAgLmNvbW1hbmQoXCJleHBvcnRcIilcbiAgICAuZGVzY3JpcHRpb24oXCJFeHBvcnQgdHNjaXJjdWl0IGNvZGUgdG8gdmFyaW91cyBmb3JtYXRzXCIpXG4gICAgLmFyZ3VtZW50KFwiPGZpbGU+XCIsIFwiUGF0aCB0byB0aGUgc25pcHBldCBmaWxlXCIpXG4gICAgLm9wdGlvbihcIi1mLCAtLWZvcm1hdCA8Zm9ybWF0PlwiLCBcIk91dHB1dCBmb3JtYXRcIilcbiAgICAub3B0aW9uKFwiLW8sIC0tb3V0cHV0IDxwYXRoPlwiLCBcIk91dHB1dCBmaWxlIHBhdGhcIilcbiAgICAuYWN0aW9uKGFzeW5jIChmaWxlLCBvcHRpb25zKSA9PiB7XG4gICAgICBjb25zdCB7IGZvcm1hdCA9IFwiY2lyY3VpdC1qc29uXCIgfSA9IG9wdGlvbnNcbiAgICAgIGxldCB7IG91dHB1dCB9ID0gb3B0aW9uc1xuICAgICAgaWYgKCFBTExPV0VEX0ZPUk1BVFMuaW5jbHVkZXMoZm9ybWF0KSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgYEludmFsaWQgZm9ybWF0OiAke2Zvcm1hdH1cXG5TdXBwb3J0ZWQgZm9ybWF0czogJHtBTExPV0VEX0ZPUk1BVFMuam9pbihcIixcIil9YCxcbiAgICAgICAgKVxuICAgICAgfVxuXG4gICAgICBpZiAoIW91dHB1dCkge1xuICAgICAgICBvdXRwdXQgPSBwYXRoLmJhc2VuYW1lKGZpbGUpLnJlcGxhY2UoL1xcLlteLl0rJC8sIFwiXCIpXG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHdvcmtlciA9IGF3YWl0IGNyZWF0ZUNpcmN1aXRXZWJXb3JrZXIoe1xuICAgICAgICB3ZWJXb3JrZXJVcmw6IHdlYldvcmtlckJ1bmRsZVVybCxcbiAgICAgIH0pXG5cbiAgICAgIGNvbnN0IHByb2plY3REaXIgPSBwYXRoLmRpcm5hbWUoZmlsZSlcblxuICAgICAgY29uc3QgcmVsYXRpdmVDb21wb25lbnRQYXRoID0gcGF0aC5yZWxhdGl2ZShwcm9qZWN0RGlyLCBmaWxlKVxuXG4gICAgICBhd2FpdCB3b3JrZXIuZXhlY3V0ZVdpdGhGc01hcCh7XG4gICAgICAgIGVudHJ5cG9pbnQ6IFwiZW50cnlwb2ludC50c3hcIixcbiAgICAgICAgZnNNYXA6IHtcbiAgICAgICAgICAuLi4oKGF3YWl0IGdldFZpcnR1YWxGaWxlU3lzdGVtRnJvbURpclBhdGgoe1xuICAgICAgICAgICAgZGlyUGF0aDogcHJvamVjdERpcixcbiAgICAgICAgICAgIGNvbnRlbnRGb3JtYXQ6IFwic3RyaW5nXCIsXG4gICAgICAgICAgfSkpIGFzIFJlY29yZDxzdHJpbmcsIHN0cmluZz4pLFxuICAgICAgICAgIFwiZW50cnlwb2ludC50c3hcIjogYFxuaW1wb3J0IE15Q2lyY3VpdCBmcm9tIFwiLi8ke3JlbGF0aXZlQ29tcG9uZW50UGF0aH1cIlxuXG5jaXJjdWl0LmFkZCg8TXlDaXJjdWl0IC8+KVxuICAgICAgICBgLFxuICAgICAgICB9LFxuICAgICAgfSlcblxuICAgICAgYXdhaXQgd29ya2VyLnJlbmRlclVudGlsU2V0dGxlZCgpXG5cbiAgICAgIGNvbnN0IGNpcmN1aXRKc29uID0gYXdhaXQgd29ya2VyLmdldENpcmN1aXRKc29uKClcblxuICAgICAgY29uc3Qgb3V0cHV0UGF0aCA9IHBhdGguam9pbihcbiAgICAgICAgcHJvamVjdERpcixcbiAgICAgICAgYCR7b3V0cHV0fSR7T1VUUFVUX0VYVEVOU0lPTlNbZm9ybWF0IGFzIEZvcm1hdF19YCxcbiAgICAgIClcblxuICAgICAgZnMud3JpdGVGaWxlU3luYyhvdXRwdXRQYXRoLCBKU09OLnN0cmluZ2lmeShjaXJjdWl0SnNvbikpXG5cbiAgICAgIGNvbnNvbGUubG9nKGBFeHBvcnRlZCB0byAke291dHB1dFBhdGh9YClcblxuICAgICAgcHJvY2Vzcy5leGl0KDApXG4gICAgfSlcbn1cbiJdLAogICJtYXBwaW5ncyI6ICI7OztBQUNBLFNBQVMsZUFBZTs7O0FDQXhCLFlBQVksUUFBUTtBQUNwQixZQUFZLFVBQVU7QUFFZixJQUFNLGVBQWUsQ0FBQ0EsYUFBcUI7QUFDaEQsRUFBQUEsU0FDRyxRQUFRLE1BQU0sRUFDZCxZQUFZLDZEQUE2RCxFQUN6RSxPQUFPLE1BQU07QUFDWixVQUFNLGFBQWEsUUFBUSxJQUFJO0FBRS9CLFVBQU0sZ0JBQXFCLFVBQUssWUFBWSxXQUFXO0FBQ3ZELFVBQU0sZ0JBQXFCLFVBQUssWUFBWSxRQUFRO0FBRXBELFVBQU0sZUFBZTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFB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QVEsT0FBTyxJQUFJLGdCQUFJLFNBQVMsT0FBTyxLQUFLLGdCQUFJLE9BQU87QUFFMUQsYUFBYSxPQUFPO0FBRXBCLFlBQVksT0FBTztBQUNuQixjQUFjLE9BQU87QUFFckIsYUFBYSxPQUFPO0FBQ3BCLGtCQUFrQixPQUFPO0FBQ3pCLG1CQUFtQixPQUFPO0FBRTFCLGVBQWUsT0FBTztBQUN0QixvQkFBb0IsT0FBTztBQUUzQixlQUFlLE9BQU87QUFFdEIsSUFBSSxRQUFRLEtBQUssV0FBVyxHQUFHO0FBQzdCLGFBQVcsU0FBUyxRQUFRLElBQUk7QUFDbEMsT0FBTztBQUNMLFVBQVEsTUFBTTtBQUNoQjsiLAogICJuYW1lcyI6IFsicHJvZ3JhbSIsICJwYXRoIiwgImZzIiwgImZzIiwgInBhdGgiLCAiZnMiLCAicGF0aCIsICJyZXNvbHZlIiwgInBhdGgiLCAiZnMiLCAicHJvZ3JhbSIsICJreSIsICJwcm9ncmFtIiwgImt5IiwgInByb2dyYW0iLCAicHJvZ3JhbSIsICJwcm9ncmFtIiwgInByb2dyYW0iLCAiZnMiLCAicGF0aCIsICJwcm9ncmFtIiwgImt5IiwgInBhdGgiLCAiZnMiLCAicHJvZ3JhbSJdCn0K
package/package.json CHANGED
@@ -2,7 +2,7 @@
2
2
  "name": "@tscircuit/cli",
3
3
  "main": "dist/main.js",
4
4
  "type": "module",
5
- "version": "0.1.7",
5
+ "version": "0.1.9",
6
6
  "bin": {
7
7
  "tsci": "./dist/main.js"
8
8
  },