@f-o-t/cli 0.1.0 → 1.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (3) hide show
  1. package/README.md +8 -7
  2. package/dist/index.js +111 -108
  3. package/package.json +31 -29
package/README.md CHANGED
@@ -7,7 +7,7 @@ CLI tool for managing FOT (Factories of Tomorrow) libraries in monorepo workspac
7
7
  - **Build** - Compile TypeScript libraries with optimized bundling
8
8
  - **Dev Mode** - Watch mode for rapid development with automatic rebuilds
9
9
  - **Test** - Run tests with optional coverage and watch mode
10
- - **Check** - Run all checks (typecheck + test) in one command
10
+ - **Check** - Format and lint code with Biome
11
11
  - **Typecheck** - TypeScript type checking without builds
12
12
  - **Generate** - Generate configuration files from `fot.config.ts`
13
13
  - **Create** - Scaffold new libraries with complete boilerplate
@@ -102,17 +102,18 @@ fot test --coverage
102
102
 
103
103
  ### `fot check`
104
104
 
105
- Run all checks (typecheck + test) in sequence.
105
+ Format and lint code with Biome.
106
106
 
107
107
  ```bash
108
108
  fot check
109
109
  ```
110
110
 
111
111
  **What it does:**
112
- - First runs TypeScript type checking
113
- - Then runs the full test suite
114
- - Exits with error if either check fails
115
- - Perfect for CI/CD pipelines
112
+ - Runs Biome code formatter on all source files
113
+ - Performs linting checks with Biome
114
+ - Ensures code style consistency across the codebase
115
+ - Exits with error if formatting or linting issues are found
116
+ - Perfect for pre-commit hooks and CI/CD pipelines
116
117
 
117
118
  ---
118
119
 
@@ -308,7 +309,7 @@ jobs:
308
309
  ```
309
310
 
310
311
  **Pipeline best practices:**
311
- - Use `fot check` to run both typechecking and tests
312
+ - Use `fot check` to ensure code formatting and linting standards
312
313
  - Run `fot test --coverage` to track code coverage
313
314
  - Build after tests pass with `fot build`
314
315
  - Cache `node_modules` for faster CI runs
package/dist/index.js CHANGED
@@ -1,10 +1,19 @@
1
1
  #!/usr/bin/env bun
2
2
  // @bun
3
+ var __require = import.meta.require;
4
+
5
+ // src/index.ts
6
+ import { Command } from "commander";
7
+ import { readFileSync } from "fs";
8
+ import { join as join5, dirname } from "path";
9
+ import { fileURLToPath } from "url";
3
10
 
4
11
  // src/builder.ts
5
12
  import { join as join2 } from "path";
13
+ import { writeFileSync } from "fs";
6
14
  var {build: bunBuild } = globalThis.Bun;
7
15
  var {$ } = globalThis.Bun;
16
+ import { generateTSConfig } from "@f-o-t/config";
8
17
 
9
18
  // src/config-loader.ts
10
19
  import { existsSync } from "fs";
@@ -38,6 +47,9 @@ async function buildLibrary(options = {}) {
38
47
  const watch = options.watch || false;
39
48
  console.log("Loading fot.config.ts...");
40
49
  const config = await loadFotConfig(cwd);
50
+ const tsconfig = generateTSConfig(config);
51
+ writeFileSync(join2(cwd, "tsconfig.json"), JSON.stringify(tsconfig, null, 2) + `
52
+ `);
41
53
  const entryPoints = [];
42
54
  const mainEntry = join2(cwd, "src", "index.ts");
43
55
  entryPoints.push(mainEntry);
@@ -80,14 +92,70 @@ ${errors}`);
80
92
  if (config.typescript.declaration) {
81
93
  console.log("Generating TypeScript declarations...");
82
94
  try {
83
- await $`cd ${cwd} && bun tsc --emitDeclarationOnly --declaration --declarationMap --outDir dist --noEmit false`.quiet();
95
+ if (config.typescript.maxMemory) {
96
+ await $`cd ${cwd} && NODE_OPTIONS='--max-old-space-size=${config.typescript.maxMemory}' bun tsc --emitDeclarationOnly --declaration --declarationMap --outDir dist --noEmit false`.quiet();
97
+ } else {
98
+ await $`cd ${cwd} && bun tsc --emitDeclarationOnly --declaration --declarationMap --outDir dist --noEmit false`.quiet();
99
+ }
84
100
  console.log("\u2713 TypeScript declarations generated");
85
101
  } catch (error) {
86
102
  throw new Error(`Declaration generation failed: ${error instanceof Error ? error.message : String(error)}`);
87
103
  }
88
104
  }
89
105
  if (watch) {
90
- console.log("Watching for changes...");
106
+ const { watch: fsWatch } = await import("fs");
107
+ const srcDir = join2(cwd, "src");
108
+ const configFile = join2(cwd, "fot.config.ts");
109
+ console.log(`Watching ${srcDir} and fot.config.ts for changes...`);
110
+ let debounceTimer = null;
111
+ let isBuilding = false;
112
+ const watchers = [];
113
+ const handleChange = (filename) => {
114
+ if (!filename)
115
+ return;
116
+ const isTypeScript = filename.endsWith(".ts") || filename.endsWith(".tsx");
117
+ const isConfig = filename === "fot.config.ts";
118
+ if (!isTypeScript && !isConfig)
119
+ return;
120
+ if (debounceTimer)
121
+ clearTimeout(debounceTimer);
122
+ debounceTimer = setTimeout(async () => {
123
+ if (isBuilding) {
124
+ console.log("Build in progress, skipping...");
125
+ return;
126
+ }
127
+ isBuilding = true;
128
+ const timestamp = new Date().toLocaleTimeString();
129
+ console.log(`
130
+ [${timestamp}] File changed: ${filename}`);
131
+ console.log("Rebuilding...");
132
+ try {
133
+ await buildLibrary({ cwd, watch: false });
134
+ console.log("\u2713 Rebuild successful");
135
+ } catch (error) {
136
+ console.error("\u2717 Rebuild failed:", error instanceof Error ? error.message : String(error));
137
+ } finally {
138
+ isBuilding = false;
139
+ }
140
+ }, 300);
141
+ };
142
+ watchers.push(fsWatch(srcDir, { recursive: true }, (_event, filename) => {
143
+ handleChange(filename);
144
+ }));
145
+ watchers.push(fsWatch(configFile, (_event, filename) => {
146
+ handleChange(filename);
147
+ }));
148
+ const cleanup = () => {
149
+ console.log(`
150
+ Stopping watch mode...`);
151
+ watchers.forEach((w) => w.close());
152
+ if (debounceTimer)
153
+ clearTimeout(debounceTimer);
154
+ process.exit(0);
155
+ };
156
+ process.on("SIGINT", cleanup);
157
+ process.on("SIGTERM", cleanup);
158
+ await new Promise(() => {});
91
159
  }
92
160
  }
93
161
 
@@ -149,7 +217,7 @@ var {spawn: spawn3 } = globalThis.Bun;
149
217
  async function typecheckCommand() {
150
218
  console.log("Running TypeScript type checking...");
151
219
  const proc = spawn3({
152
- cmd: ["bunx", "tsc"],
220
+ cmd: ["bunx", "tsc", "--noEmit"],
153
221
  stdio: ["inherit", "inherit", "inherit"]
154
222
  });
155
223
  const exitCode = await proc.exited;
@@ -161,11 +229,11 @@ async function typecheckCommand() {
161
229
  process.exit(exitCode);
162
230
  }
163
231
  // src/commands/generate.ts
164
- import { writeFileSync } from "fs";
232
+ import { writeFileSync as writeFileSync2 } from "fs";
165
233
  import { join as join3 } from "path";
166
234
  import {
167
235
  generatePackageJson,
168
- generateTSConfig,
236
+ generateTSConfig as generateTSConfig2,
169
237
  generateBiomeConfig
170
238
  } from "@f-o-t/config";
171
239
  async function generateConfigFiles(cwd) {
@@ -175,25 +243,25 @@ async function generateConfigFiles(cwd) {
175
243
  const libraryName = cwd.split("/").pop() || "library";
176
244
  const packageJson = generatePackageJson(libraryName, "0.1.0", config);
177
245
  const packageJsonPath = join3(cwd, "package.json");
178
- writeFileSync(packageJsonPath, JSON.stringify(packageJson, null, 2) + `
246
+ writeFileSync2(packageJsonPath, JSON.stringify(packageJson, null, 2) + `
179
247
  `);
180
248
  console.log(`\u2713 Generated ${packageJsonPath}`);
181
249
  console.log("Generating tsconfig.json...");
182
- const tsconfig = generateTSConfig(config);
250
+ const tsconfig = generateTSConfig2(config);
183
251
  const tsconfigPath = join3(cwd, "tsconfig.json");
184
- writeFileSync(tsconfigPath, JSON.stringify(tsconfig, null, 2) + `
252
+ writeFileSync2(tsconfigPath, JSON.stringify(tsconfig, null, 2) + `
185
253
  `);
186
254
  console.log(`\u2713 Generated ${tsconfigPath}`);
187
255
  console.log("Generating biome.json...");
188
256
  const biomeConfig = generateBiomeConfig(config);
189
257
  const biomeConfigPath = join3(cwd, "biome.json");
190
- writeFileSync(biomeConfigPath, JSON.stringify(biomeConfig, null, 2) + `
258
+ writeFileSync2(biomeConfigPath, JSON.stringify(biomeConfig, null, 2) + `
191
259
  `);
192
260
  console.log(`\u2713 Generated ${biomeConfigPath}`);
193
261
  console.log("All configuration files generated successfully!");
194
262
  }
195
263
  // src/commands/create.ts
196
- import { existsSync as existsSync2, mkdirSync, writeFileSync as writeFileSync2 } from "fs";
264
+ import { existsSync as existsSync2, mkdirSync, writeFileSync as writeFileSync3 } from "fs";
197
265
  import { join as join4 } from "path";
198
266
  var {spawn: spawn4 } = globalThis.Bun;
199
267
 
@@ -307,16 +375,16 @@ Creating directory structure...`);
307
375
  Generating template files...`);
308
376
  const templates = getLibraryTemplate(name, description);
309
377
  const fotConfigPath = join4(libraryPath, "fot.config.ts");
310
- writeFileSync2(fotConfigPath, templates.fotConfig);
378
+ writeFileSync3(fotConfigPath, templates.fotConfig);
311
379
  console.log(`\u2713 Created ${fotConfigPath}`);
312
380
  const indexTsPath = join4(srcPath, "index.ts");
313
- writeFileSync2(indexTsPath, templates.indexTs);
381
+ writeFileSync3(indexTsPath, templates.indexTs);
314
382
  console.log(`\u2713 Created ${indexTsPath}`);
315
383
  const indexTestTsPath = join4(srcPath, "index.test.ts");
316
- writeFileSync2(indexTestTsPath, templates.indexTestTs);
384
+ writeFileSync3(indexTestTsPath, templates.indexTestTs);
317
385
  console.log(`\u2713 Created ${indexTestTsPath}`);
318
386
  const readmePath = join4(libraryPath, "README.md");
319
- writeFileSync2(readmePath, templates.readme);
387
+ writeFileSync3(readmePath, templates.readme);
320
388
  console.log(`\u2713 Created ${readmePath}`);
321
389
  console.log(`
322
390
  Generating configuration files...`);
@@ -349,98 +417,33 @@ Next steps:`);
349
417
  Happy coding! \uD83D\uDE80`);
350
418
  }
351
419
  // src/index.ts
352
- function printHelp() {
353
- console.log(`
354
- FOT CLI - Build tools for monorepo libraries
355
-
356
- Usage: fot <command> [options]
357
-
358
- Commands:
359
- build Build the current library
360
- dev Start development mode with watch
361
- test Run tests
362
- --watch Run tests in watch mode
363
- --coverage Run tests with coverage
364
- check Run all checks (typecheck + test)
365
- typecheck Run TypeScript type checking
366
- generate Generate configuration files
367
- create <name> Create a new library
368
- [description] Optional description for the library
369
- help, --help, -h Show this help message
370
- version, --version, -v Show version number
371
-
372
- Examples:
373
- fot build
374
- fot dev
375
- fot test --coverage
376
- fot test --watch
377
- fot create my-lib "A new library"
378
- fot generate
379
- fot check
380
- `);
381
- }
382
- async function main() {
383
- const args = process.argv.slice(2);
384
- const command = args[0];
385
- try {
386
- switch (command) {
387
- case "build":
388
- await buildCommand();
389
- break;
390
- case "dev":
391
- await devCommand();
392
- break;
393
- case "test": {
394
- const options = {
395
- coverage: args.includes("--coverage"),
396
- watch: args.includes("--watch")
397
- };
398
- await testCommand(options);
399
- break;
400
- }
401
- case "check":
402
- await checkCommand();
403
- break;
404
- case "typecheck":
405
- await typecheckCommand();
406
- break;
407
- case "generate":
408
- await generateConfigFiles(process.cwd());
409
- break;
410
- case "create": {
411
- const name = args[1];
412
- const description = args[2] || `A new FOT library: ${name}`;
413
- const options = {
414
- name,
415
- description
416
- };
417
- await createCommand(options);
418
- break;
419
- }
420
- case "help":
421
- case "--help":
422
- case "-h":
423
- printHelp();
424
- break;
425
- case "version":
426
- case "--version":
427
- case "-v":
428
- console.log("fot v0.1.0");
429
- break;
430
- case undefined:
431
- printHelp();
432
- break;
433
- default:
434
- console.error(`Unknown command: ${command}`);
435
- console.log('Run "fot --help" for usage information');
436
- process.exit(1);
437
- }
438
- } catch (error) {
439
- console.error("Error:", error instanceof Error ? error.message : error);
440
- process.exit(1);
441
- }
442
- }
443
- main();
420
+ var __dirname2 = dirname(fileURLToPath(import.meta.url));
421
+ var pkg = JSON.parse(readFileSync(join5(__dirname2, "..", "package.json"), "utf-8"));
422
+ var program = new Command;
423
+ program.name("fot").description("Build tools for FOT monorepo libraries").version(pkg.version);
424
+ program.command("build").description("Build the current library").action(async () => {
425
+ await buildCommand();
426
+ });
427
+ program.command("dev").description("Start development mode with file watching").action(async () => {
428
+ await devCommand();
429
+ });
430
+ program.command("test").description("Run tests").option("--watch", "Run tests in watch mode").option("--coverage", "Run tests with coverage").action(async (options) => {
431
+ await testCommand(options);
432
+ });
433
+ program.command("check").description("Format and lint code with Biome").action(async () => {
434
+ await checkCommand();
435
+ });
436
+ program.command("typecheck").description("Run TypeScript type checking").action(async () => {
437
+ await typecheckCommand();
438
+ });
439
+ program.command("generate").description("Generate config files from fot.config.ts").action(async () => {
440
+ await generateConfigFiles(process.cwd());
441
+ });
442
+ program.command("create <name>").description("Scaffold a new library").argument("[description]", "Description for the library", "A new FOT library").action(async (name, description) => {
443
+ const options = { name, description };
444
+ await createCommand(options);
445
+ });
446
+ program.parse();
444
447
  export {
445
448
  loadFotConfig,
446
449
  hasFotConfig,
@@ -449,5 +452,5 @@ export {
449
452
  buildCommand
450
453
  };
451
454
 
452
- //# debugId=3D1BC492518C26A964756E2164756E21
453
- //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsic3JjL2J1aWxkZXIudHMiLCAic3JjL2NvbmZpZy1sb2FkZXIudHMiLCAic3JjL2NvbW1hbmRzL2J1aWxkLnRzIiwgInNyYy9jb21tYW5kcy9kZXYudHMiLCAic3JjL2NvbW1hbmRzL3Rlc3QudHMiLCAic3JjL2NvbW1hbmRzL2NoZWNrLnRzIiwgInNyYy9jb21tYW5kcy90eXBlY2hlY2sudHMiLCAic3JjL2NvbW1hbmRzL2dlbmVyYXRlLnRzIiwgInNyYy9jb21tYW5kcy9jcmVhdGUudHMiLCAic3JjL3RlbXBsYXRlcy9saWJyYXJ5LnRzIiwgInNyYy9pbmRleC50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsKICAgICJpbXBvcnQgeyBqb2luIH0gZnJvbSBcIm5vZGU6cGF0aFwiO1xuaW1wb3J0IHsgYnVpbGQgYXMgYnVuQnVpbGQgfSBmcm9tIFwiYnVuXCI7XG5pbXBvcnQgeyAkIH0gZnJvbSBcImJ1blwiO1xuaW1wb3J0IHR5cGUgeyBCdWlsZEZvcm1hdCB9IGZyb20gXCJAZi1vLXQvY29uZmlnXCI7XG5pbXBvcnQgeyBsb2FkRm90Q29uZmlnIH0gZnJvbSBcIi4vY29uZmlnLWxvYWRlclwiO1xuXG4vKipcbiAqIE9wdGlvbnMgZm9yIGJ1aWxkaW5nIGEgbGlicmFyeVxuICovXG5leHBvcnQgaW50ZXJmYWNlIEJ1aWxkT3B0aW9ucyB7XG4gIC8qKlxuICAgKiBUaGUgd29ya2luZyBkaXJlY3RvcnkgY29udGFpbmluZyB0aGUgZm90LmNvbmZpZy50cyBmaWxlXG4gICAqIEBkZWZhdWx0IHByb2Nlc3MuY3dkKClcbiAgICovXG4gIGN3ZD86IHN0cmluZztcbiAgLyoqXG4gICAqIFdoZXRoZXIgdG8gd2F0Y2ggZm9yIGNoYW5nZXMgYW5kIHJlYnVpbGRcbiAgICogQGRlZmF1bHQgZmFsc2VcbiAgICovXG4gIHdhdGNoPzogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBCdWlsZCBhIGxpYnJhcnkgdXNpbmcgQnVuJ3MgYnVuZGxlclxuICpcbiAqIEBwYXJhbSBvcHRpb25zIC0gQnVpbGQgb3B0aW9uc1xuICogQHRocm93cyB7RXJyb3J9IElmIHRoZSBidWlsZCBmYWlsc1xuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gYnVpbGRMaWJyYXJ5KG9wdGlvbnM6IEJ1aWxkT3B0aW9ucyA9IHt9KTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IGN3ZCA9IG9wdGlvbnMuY3dkIHx8IHByb2Nlc3MuY3dkKCk7XG4gIGNvbnN0IHdhdGNoID0gb3B0aW9ucy53YXRjaCB8fCBmYWxzZTtcblxuICBjb25zb2xlLmxvZyhcIkxvYWRpbmcgZm90LmNvbmZpZy50cy4uLlwiKTtcbiAgY29uc3QgY29uZmlnID0gYXdhaXQgbG9hZEZvdENvbmZpZyhjd2QpO1xuXG4gIC8vIENvbGxlY3QgYWxsIGVudHJ5IHBvaW50cyAobWFpbiArIHBsdWdpbnMpXG4gIGNvbnN0IGVudHJ5UG9pbnRzOiBzdHJpbmdbXSA9IFtdO1xuXG4gIC8vIE1haW4gZW50cnkgcG9pbnRcbiAgY29uc3QgbWFpbkVudHJ5ID0gam9pbihjd2QsIFwic3JjXCIsIFwiaW5kZXgudHNcIik7XG4gIGVudHJ5UG9pbnRzLnB1c2gobWFpbkVudHJ5KTtcblxuICAvLyBQbHVnaW4gZW50cnkgcG9pbnRzXG4gIGZvciAoY29uc3QgcGx1Z2luIG9mIGNvbmZpZy5wbHVnaW5zKSB7XG4gICAgaWYgKHBsdWdpbi5lbmFibGVkICE9PSBmYWxzZSkge1xuICAgICAgY29uc3QgcGx1Z2luRW50cnkgPSBqb2luKGN3ZCwgXCJzcmNcIiwgXCJwbHVnaW5zXCIsIHBsdWdpbi5uYW1lLCBcImluZGV4LnRzXCIpO1xuICAgICAgZW50cnlQb2ludHMucHVzaChwbHVnaW5FbnRyeSk7XG4gICAgfVxuICB9XG5cbiAgY29uc29sZS5sb2coYEJ1aWxkaW5nICR7ZW50cnlQb2ludHMubGVuZ3RofSBlbnRyeSBwb2ludChzKS4uLmApO1xuXG4gIC8vIEl0ZXJhdGUgb3ZlciBmb3JtYXRzIGFuZCBidWlsZCBlYWNoXG4gIGZvciAoY29uc3QgZm9ybWF0IG9mIGNvbmZpZy5mb3JtYXRzKSB7XG4gICAgY29uc29sZS5sb2coYEJ1aWxkaW5nICR7Zm9ybWF0fSBmb3JtYXQuLi5gKTtcblxuICAgIHRyeSB7XG4gICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBidW5CdWlsZCh7XG4gICAgICAgIGVudHJ5cG9pbnRzOiBlbnRyeVBvaW50cyxcbiAgICAgICAgb3V0ZGlyOiBqb2luKGN3ZCwgXCJkaXN0XCIpLFxuICAgICAgICB0YXJnZXQ6IFwiYnVuXCIsXG4gICAgICAgIGZvcm1hdDogZm9ybWF0ID09PSBcImVzbVwiID8gXCJlc21cIiA6IFwiY2pzXCIsXG4gICAgICAgIHNwbGl0dGluZzogZm9ybWF0ID09PSBcImVzbVwiLFxuICAgICAgICBtaW5pZnk6IGZhbHNlLFxuICAgICAgICBzb3VyY2VtYXA6IFwiZXh0ZXJuYWxcIixcbiAgICAgICAgZXh0ZXJuYWw6IGNvbmZpZy5leHRlcm5hbCxcbiAgICAgICAgbmFtaW5nOiB7XG4gICAgICAgICAgZW50cnk6IFwiW2Rpcl0vW25hbWVdLmpzXCIsXG4gICAgICAgICAgY2h1bms6IFwiW25hbWVdLVtoYXNoXS5qc1wiLFxuICAgICAgICB9LFxuICAgICAgfSk7XG5cbiAgICAgIGlmICghcmVzdWx0LnN1Y2Nlc3MpIHtcbiAgICAgICAgY29uc3QgZXJyb3JzID0gcmVzdWx0LmxvZ3MubWFwKChsb2cpID0+IGxvZy5tZXNzYWdlKS5qb2luKFwiXFxuXCIpO1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEJ1aWxkIGZhaWxlZCBmb3IgJHtmb3JtYXR9IGZvcm1hdDpcXG4ke2Vycm9yc31gKTtcbiAgICAgIH1cblxuICAgICAgY29uc29sZS5sb2coYOKckyAke2Zvcm1hdH0gZm9ybWF0IGJ1aWx0IHN1Y2Nlc3NmdWxseWApO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGBCdWlsZCBmYWlsZWQgZm9yICR7Zm9ybWF0fSBmb3JtYXQ6ICR7ZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiBTdHJpbmcoZXJyb3IpfWBcbiAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgY29uc29sZS5sb2coXCJCdWlsZCBjb21wbGV0ZWQgc3VjY2Vzc2Z1bGx5IVwiKTtcblxuICAvLyBHZW5lcmF0ZSBUeXBlU2NyaXB0IGRlY2xhcmF0aW9ucyBpZiBlbmFibGVkXG4gIGlmIChjb25maWcudHlwZXNjcmlwdC5kZWNsYXJhdGlvbikge1xuICAgIGNvbnNvbGUubG9nKFwiR2VuZXJhdGluZyBUeXBlU2NyaXB0IGRlY2xhcmF0aW9ucy4uLlwiKTtcbiAgICB0cnkge1xuICAgICAgYXdhaXQgJGBjZCAke2N3ZH0gJiYgYnVuIHRzYyAtLWVtaXREZWNsYXJhdGlvbk9ubHkgLS1kZWNsYXJhdGlvbiAtLWRlY2xhcmF0aW9uTWFwIC0tb3V0RGlyIGRpc3QgLS1ub0VtaXQgZmFsc2VgLnF1aWV0KCk7XG4gICAgICBjb25zb2xlLmxvZyhcIuKckyBUeXBlU2NyaXB0IGRlY2xhcmF0aW9ucyBnZW5lcmF0ZWRcIik7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYERlY2xhcmF0aW9uIGdlbmVyYXRpb24gZmFpbGVkOiAke2Vycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogU3RyaW5nKGVycm9yKX1gXG4gICAgICApO1xuICAgIH1cbiAgfVxuXG4gIGlmICh3YXRjaCkge1xuICAgIGNvbnNvbGUubG9nKFwiV2F0Y2hpbmcgZm9yIGNoYW5nZXMuLi5cIik7XG4gICAgLy8gVE9ETzogSW1wbGVtZW50IHdhdGNoIG1vZGUgaW4gZnV0dXJlXG4gIH1cbn1cbiIsCiAgICAiaW1wb3J0IHsgZXhpc3RzU3luYyB9IGZyb20gXCJub2RlOmZzXCI7XG5pbXBvcnQgeyBqb2luIH0gZnJvbSBcIm5vZGU6cGF0aFwiO1xuaW1wb3J0IHR5cGUgeyBSZXNvbHZlZEZvdENvbmZpZyB9IGZyb20gXCJAZi1vLXQvY29uZmlnXCI7XG5cbi8qKlxuICogQ2hlY2tzIGlmIGEgZm90LmNvbmZpZy50cyBmaWxlIGV4aXN0cyBpbiB0aGUgZ2l2ZW4gZGlyZWN0b3J5XG4gKlxuICogQHBhcmFtIGN3ZCAtIFRoZSBkaXJlY3RvcnkgdG8gY2hlY2tcbiAqIEByZXR1cm5zIFRydWUgaWYgZm90LmNvbmZpZy50cyBleGlzdHMsIGZhbHNlIG90aGVyd2lzZVxuICovXG5leHBvcnQgZnVuY3Rpb24gaGFzRm90Q29uZmlnKGN3ZDogc3RyaW5nKTogYm9vbGVhbiB7XG4gIGNvbnN0IGNvbmZpZ1BhdGggPSBqb2luKGN3ZCwgXCJmb3QuY29uZmlnLnRzXCIpO1xuICByZXR1cm4gZXhpc3RzU3luYyhjb25maWdQYXRoKTtcbn1cblxuLyoqXG4gKiBMb2FkcyBhbmQgdmFsaWRhdGVzIGEgZm90LmNvbmZpZy50cyBmaWxlIGZyb20gdGhlIGdpdmVuIGRpcmVjdG9yeVxuICpcbiAqIEBwYXJhbSBjd2QgLSBUaGUgZGlyZWN0b3J5IGNvbnRhaW5pbmcgdGhlIGZvdC5jb25maWcudHMgZmlsZVxuICogQHJldHVybnMgVGhlIHJlc29sdmVkIEZPVCBjb25maWd1cmF0aW9uXG4gKiBAdGhyb3dzIHtFcnJvcn0gSWYgdGhlIGNvbmZpZyBmaWxlIGlzIG5vdCBmb3VuZCBvciBoYXMgbm8gZGVmYXVsdCBleHBvcnRcbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGxvYWRGb3RDb25maWcoY3dkOiBzdHJpbmcpOiBQcm9taXNlPFJlc29sdmVkRm90Q29uZmlnPiB7XG4gIGNvbnN0IGNvbmZpZ1BhdGggPSBqb2luKGN3ZCwgXCJmb3QuY29uZmlnLnRzXCIpO1xuXG4gIGlmICghZXhpc3RzU3luYyhjb25maWdQYXRoKSkge1xuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgIGBmb3QuY29uZmlnLnRzIG5vdCBmb3VuZCBpbiAke2N3ZH0uIFBsZWFzZSBjcmVhdGUgYSBmb3QuY29uZmlnLnRzIGZpbGUuYFxuICAgICk7XG4gIH1cblxuICB0cnkge1xuICAgIC8vIER5bmFtaWMgaW1wb3J0IHRvIGxvYWQgdGhlIGNvbmZpZyBmaWxlXG4gICAgY29uc3QgY29uZmlnTW9kdWxlID0gYXdhaXQgaW1wb3J0KGNvbmZpZ1BhdGgpO1xuXG4gICAgaWYgKCFjb25maWdNb2R1bGUuZGVmYXVsdCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgZm90LmNvbmZpZy50cyBpbiAke2N3ZH0gbXVzdCBoYXZlIGEgZGVmYXVsdCBleHBvcnQuIFVzZSAnZXhwb3J0IGRlZmF1bHQgZGVmaW5lRm90Q29uZmlnKHsgLi4uIH0pJy5gXG4gICAgICApO1xuICAgIH1cblxuICAgIHJldHVybiBjb25maWdNb2R1bGUuZGVmYXVsdCBhcyBSZXNvbHZlZEZvdENvbmZpZztcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAvLyBJZiBpdCdzIGFscmVhZHkgb3VyIGN1c3RvbSBlcnJvciwgcmUtdGhyb3cgaXRcbiAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBFcnJvciAmJiBlcnJvci5tZXNzYWdlLmluY2x1ZGVzKFwiZm90LmNvbmZpZy50c1wiKSkge1xuICAgICAgdGhyb3cgZXJyb3I7XG4gICAgfVxuXG4gICAgLy8gT3RoZXJ3aXNlLCB3cmFwIHRoZSBlcnJvciB3aXRoIG1vcmUgY29udGV4dFxuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgIGBGYWlsZWQgdG8gbG9hZCBmb3QuY29uZmlnLnRzIGZyb20gJHtjd2R9OiAke2Vycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogU3RyaW5nKGVycm9yKX1gXG4gICAgKTtcbiAgfVxufVxuIiwKICAgICJpbXBvcnQgeyBidWlsZExpYnJhcnksIHR5cGUgQnVpbGRPcHRpb25zIH0gZnJvbSBcIi4uL2J1aWxkZXJcIjtcblxuLyoqXG4gKiBFeGVjdXRlIHRoZSBidWlsZCBjb21tYW5kXG4gKlxuICogQHBhcmFtIG9wdGlvbnMgLSBCdWlsZCBvcHRpb25zXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBidWlsZENvbW1hbmQob3B0aW9uczogQnVpbGRPcHRpb25zID0ge30pOiBQcm9taXNlPHZvaWQ+IHtcbiAgdHJ5IHtcbiAgICBhd2FpdCBidWlsZExpYnJhcnkob3B0aW9ucyk7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgY29uc29sZS5lcnJvcihcbiAgICAgIFwiQnVpbGQgZmFpbGVkOlwiLFxuICAgICAgZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiBTdHJpbmcoZXJyb3IpXG4gICAgKTtcbiAgICBwcm9jZXNzLmV4aXQoMSk7XG4gIH1cbn1cbiIsCiAgICAiaW1wb3J0IHsgYnVpbGRMaWJyYXJ5IH0gZnJvbSBcIi4uL2J1aWxkZXJcIjtcblxuLyoqXG4gKiBFeGVjdXRlIHRoZSBkZXYgY29tbWFuZFxuICogUnVucyB0aGUgYnVpbGQgaW4gd2F0Y2ggbW9kZSBmb3IgZGV2ZWxvcG1lbnRcbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGRldkNvbW1hbmQoKTogUHJvbWlzZTx2b2lkPiB7XG4gIHRyeSB7XG4gICAgY29uc29sZS5sb2coXCJTdGFydGluZyBkZXZlbG9wbWVudCBtb2RlLi4uXCIpO1xuICAgIGF3YWl0IGJ1aWxkTGlicmFyeSh7IHdhdGNoOiB0cnVlIH0pO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGNvbnNvbGUuZXJyb3IoXG4gICAgICBcIkRldmVsb3BtZW50IG1vZGUgZmFpbGVkOlwiLFxuICAgICAgZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiBTdHJpbmcoZXJyb3IpXG4gICAgKTtcbiAgICBwcm9jZXNzLmV4aXQoMSk7XG4gIH1cbn1cbiIsCiAgICAiaW1wb3J0IHsgc3Bhd24gfSBmcm9tIFwiYnVuXCI7XG5cbi8qKlxuICogT3B0aW9ucyBmb3IgdGhlIHRlc3QgY29tbWFuZFxuICovXG5leHBvcnQgaW50ZXJmYWNlIFRlc3RPcHRpb25zIHtcbiAgLyoqXG4gICAqIFdoZXRoZXIgdG8gZ2VuZXJhdGUgY292ZXJhZ2UgcmVwb3J0c1xuICAgKiBAZGVmYXVsdCBmYWxzZVxuICAgKi9cbiAgY292ZXJhZ2U/OiBib29sZWFuO1xuICAvKipcbiAgICogV2hldGhlciB0byB3YXRjaCBmb3IgY2hhbmdlcyBhbmQgcmUtcnVuIHRlc3RzXG4gICAqIEBkZWZhdWx0IGZhbHNlXG4gICAqL1xuICB3YXRjaD86IGJvb2xlYW47XG59XG5cbi8qKlxuICogRXhlY3V0ZSB0aGUgdGVzdCBjb21tYW5kXG4gKlxuICogQHBhcmFtIG9wdGlvbnMgLSBUZXN0IG9wdGlvbnNcbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHRlc3RDb21tYW5kKG9wdGlvbnM6IFRlc3RPcHRpb25zID0ge30pOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgYXJncyA9IFtcInRlc3RcIl07XG5cbiAgaWYgKG9wdGlvbnMuY292ZXJhZ2UpIHtcbiAgICBhcmdzLnB1c2goXCItLWNvdmVyYWdlXCIpO1xuICB9XG5cbiAgaWYgKG9wdGlvbnMud2F0Y2gpIHtcbiAgICBhcmdzLnB1c2goXCItLXdhdGNoXCIpO1xuICB9XG5cbiAgY29uc29sZS5sb2coYFJ1bm5pbmc6IGJ1biAke2FyZ3Muam9pbihcIiBcIil9YCk7XG5cbiAgY29uc3QgcHJvYyA9IHNwYXduKHtcbiAgICBjbWQ6IFtcImJ1blwiLCAuLi5hcmdzXSxcbiAgICBzdGRpbzogW1wiaW5oZXJpdFwiLCBcImluaGVyaXRcIiwgXCJpbmhlcml0XCJdLFxuICB9KTtcblxuICBjb25zdCBleGl0Q29kZSA9IGF3YWl0IHByb2MuZXhpdGVkO1xuICBwcm9jZXNzLmV4aXQoZXhpdENvZGUpO1xufVxuIiwKICAgICJpbXBvcnQgeyBzcGF3biB9IGZyb20gXCJidW5cIjtcblxuLyoqXG4gKiBFeGVjdXRlIHRoZSBjaGVjayBjb21tYW5kXG4gKiBSdW5zIEJpb21lIHRvIGNoZWNrIGFuZCBmaXggY29kZSBzdHlsZSBpc3N1ZXNcbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGNoZWNrQ29tbWFuZCgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc29sZS5sb2coXCJSdW5uaW5nIEJpb21lIGNoZWNrIHdpdGggYXV0by1maXguLi5cIik7XG5cbiAgY29uc3QgcHJvYyA9IHNwYXduKHtcbiAgICBjbWQ6IFtcImJ1bnhcIiwgXCJiaW9tZVwiLCBcImNoZWNrXCIsIFwiLS13cml0ZVwiLCBcIi5cIl0sXG4gICAgc3RkaW86IFtcImluaGVyaXRcIiwgXCJpbmhlcml0XCIsIFwiaW5oZXJpdFwiXSxcbiAgfSk7XG5cbiAgY29uc3QgZXhpdENvZGUgPSBhd2FpdCBwcm9jLmV4aXRlZDtcblxuICBpZiAoZXhpdENvZGUgPT09IDApIHtcbiAgICBjb25zb2xlLmxvZyhcIuKckyBDaGVjayBjb21wbGV0ZWQgc3VjY2Vzc2Z1bGx5XCIpO1xuICB9IGVsc2Uge1xuICAgIGNvbnNvbGUuZXJyb3IoXCJDaGVjayBmYWlsZWRcIik7XG4gIH1cblxuICBwcm9jZXNzLmV4aXQoZXhpdENvZGUpO1xufVxuIiwKICAgICJpbXBvcnQgeyBzcGF3biB9IGZyb20gXCJidW5cIjtcblxuLyoqXG4gKiBFeGVjdXRlIHRoZSB0eXBlY2hlY2sgY29tbWFuZFxuICogUnVucyBUeXBlU2NyaXB0IGNvbXBpbGVyIHRvIGNoZWNrIGZvciB0eXBlIGVycm9yc1xuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gdHlwZWNoZWNrQ29tbWFuZCgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc29sZS5sb2coXCJSdW5uaW5nIFR5cGVTY3JpcHQgdHlwZSBjaGVja2luZy4uLlwiKTtcblxuICBjb25zdCBwcm9jID0gc3Bhd24oe1xuICAgIGNtZDogW1wiYnVueFwiLCBcInRzY1wiXSxcbiAgICBzdGRpbzogW1wiaW5oZXJpdFwiLCBcImluaGVyaXRcIiwgXCJpbmhlcml0XCJdLFxuICB9KTtcblxuICBjb25zdCBleGl0Q29kZSA9IGF3YWl0IHByb2MuZXhpdGVkO1xuXG4gIGlmIChleGl0Q29kZSA9PT0gMCkge1xuICAgIGNvbnNvbGUubG9nKFwi4pyTIFR5cGUgY2hlY2tpbmcgY29tcGxldGVkIHN1Y2Nlc3NmdWxseVwiKTtcbiAgfSBlbHNlIHtcbiAgICBjb25zb2xlLmVycm9yKFwiVHlwZSBjaGVja2luZyBmYWlsZWRcIik7XG4gIH1cblxuICBwcm9jZXNzLmV4aXQoZXhpdENvZGUpO1xufVxuIiwKICAgICJpbXBvcnQgeyB3cml0ZUZpbGVTeW5jIH0gZnJvbSBcIm5vZGU6ZnNcIjtcbmltcG9ydCB7IGpvaW4gfSBmcm9tIFwibm9kZTpwYXRoXCI7XG5pbXBvcnQge1xuICBnZW5lcmF0ZVBhY2thZ2VKc29uLFxuICBnZW5lcmF0ZVRTQ29uZmlnLFxuICBnZW5lcmF0ZUJpb21lQ29uZmlnLFxufSBmcm9tIFwiQGYtby10L2NvbmZpZ1wiO1xuaW1wb3J0IHsgbG9hZEZvdENvbmZpZyB9IGZyb20gXCIuLi9jb25maWctbG9hZGVyXCI7XG5cbi8qKlxuICogR2VuZXJhdGUgY29uZmlndXJhdGlvbiBmaWxlcyAocGFja2FnZS5qc29uLCB0c2NvbmZpZy5qc29uLCBiaW9tZS5qc29uKSBmcm9tIGZvdC5jb25maWcudHNcbiAqXG4gKiBAcGFyYW0gY3dkIC0gVGhlIGRpcmVjdG9yeSBjb250YWluaW5nIHRoZSBmb3QuY29uZmlnLnRzIGZpbGVcbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdlbmVyYXRlQ29uZmlnRmlsZXMoY3dkOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc29sZS5sb2coXCJMb2FkaW5nIGZvdC5jb25maWcudHMuLi5cIik7XG4gIGNvbnN0IGNvbmZpZyA9IGF3YWl0IGxvYWRGb3RDb25maWcoY3dkKTtcblxuICBjb25zb2xlLmxvZyhcIkdlbmVyYXRpbmcgcGFja2FnZS5qc29uLi4uXCIpO1xuICAvLyBFeHRyYWN0IGxpYnJhcnkgbmFtZSBmcm9tIGRpcmVjdG9yeSBuYW1lIG9yIHVzZSBhIGRlZmF1bHRcbiAgY29uc3QgbGlicmFyeU5hbWUgPSBjd2Quc3BsaXQoXCIvXCIpLnBvcCgpIHx8IFwibGlicmFyeVwiO1xuICBjb25zdCBwYWNrYWdlSnNvbiA9IGdlbmVyYXRlUGFja2FnZUpzb24obGlicmFyeU5hbWUsIFwiMC4xLjBcIiwgY29uZmlnKTtcbiAgY29uc3QgcGFja2FnZUpzb25QYXRoID0gam9pbihjd2QsIFwicGFja2FnZS5qc29uXCIpO1xuICB3cml0ZUZpbGVTeW5jKHBhY2thZ2VKc29uUGF0aCwgSlNPTi5zdHJpbmdpZnkocGFja2FnZUpzb24sIG51bGwsIDIpICsgXCJcXG5cIik7XG4gIGNvbnNvbGUubG9nKGDinJMgR2VuZXJhdGVkICR7cGFja2FnZUpzb25QYXRofWApO1xuXG4gIGNvbnNvbGUubG9nKFwiR2VuZXJhdGluZyB0c2NvbmZpZy5qc29uLi4uXCIpO1xuICBjb25zdCB0c2NvbmZpZyA9IGdlbmVyYXRlVFNDb25maWcoY29uZmlnKTtcbiAgY29uc3QgdHNjb25maWdQYXRoID0gam9pbihjd2QsIFwidHNjb25maWcuanNvblwiKTtcbiAgd3JpdGVGaWxlU3luYyh0c2NvbmZpZ1BhdGgsIEpTT04uc3RyaW5naWZ5KHRzY29uZmlnLCBudWxsLCAyKSArIFwiXFxuXCIpO1xuICBjb25zb2xlLmxvZyhg4pyTIEdlbmVyYXRlZCAke3RzY29uZmlnUGF0aH1gKTtcblxuICBjb25zb2xlLmxvZyhcIkdlbmVyYXRpbmcgYmlvbWUuanNvbi4uLlwiKTtcbiAgY29uc3QgYmlvbWVDb25maWcgPSBnZW5lcmF0ZUJpb21lQ29uZmlnKGNvbmZpZyk7XG4gIGNvbnN0IGJpb21lQ29uZmlnUGF0aCA9IGpvaW4oY3dkLCBcImJpb21lLmpzb25cIik7XG4gIHdyaXRlRmlsZVN5bmMoYmlvbWVDb25maWdQYXRoLCBKU09OLnN0cmluZ2lmeShiaW9tZUNvbmZpZywgbnVsbCwgMikgKyBcIlxcblwiKTtcbiAgY29uc29sZS5sb2coYOKckyBHZW5lcmF0ZWQgJHtiaW9tZUNvbmZpZ1BhdGh9YCk7XG5cbiAgY29uc29sZS5sb2coXCJBbGwgY29uZmlndXJhdGlvbiBmaWxlcyBnZW5lcmF0ZWQgc3VjY2Vzc2Z1bGx5IVwiKTtcbn1cbiIsCiAgICAiaW1wb3J0IHsgZXhpc3RzU3luYywgbWtkaXJTeW5jLCB3cml0ZUZpbGVTeW5jIH0gZnJvbSBcIm5vZGU6ZnNcIjtcbmltcG9ydCB7IGpvaW4gfSBmcm9tIFwibm9kZTpwYXRoXCI7XG5pbXBvcnQgeyBzcGF3biB9IGZyb20gXCJidW5cIjtcbmltcG9ydCB7IGdldExpYnJhcnlUZW1wbGF0ZSB9IGZyb20gXCIuLi90ZW1wbGF0ZXMvbGlicmFyeVwiO1xuaW1wb3J0IHsgZ2VuZXJhdGVDb25maWdGaWxlcyB9IGZyb20gXCIuL2dlbmVyYXRlXCI7XG5cbi8qKlxuICogT3B0aW9ucyBmb3IgY3JlYXRpbmcgYSBuZXcgbGlicmFyeVxuICovXG5leHBvcnQgaW50ZXJmYWNlIENyZWF0ZU9wdGlvbnMge1xuICAvKipcbiAgICogTmFtZSBvZiB0aGUgbGlicmFyeSAoZS5nLiwgXCJteS1saWJyYXJ5XCIpXG4gICAqL1xuICBuYW1lOiBzdHJpbmc7XG4gIC8qKlxuICAgKiBCcmllZiBkZXNjcmlwdGlvbiBvZiB0aGUgbGlicmFyeVxuICAgKi9cbiAgZGVzY3JpcHRpb246IHN0cmluZztcbiAgLyoqXG4gICAqIFdvcmtpbmcgZGlyZWN0b3J5IChkZWZhdWx0cyB0byBwcm9jZXNzLmN3ZCgpKVxuICAgKi9cbiAgY3dkPzogc3RyaW5nO1xufVxuXG4vKipcbiAqIENyZWF0ZSBhIG5ldyBsaWJyYXJ5IHdpdGggc2NhZmZvbGRlZCBmaWxlc1xuICpcbiAqIEBwYXJhbSBvcHRpb25zIC0gQ3JlYXRlIG9wdGlvbnNcbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGNyZWF0ZUNvbW1hbmQob3B0aW9uczogQ3JlYXRlT3B0aW9ucyk6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCB7IG5hbWUsIGRlc2NyaXB0aW9uLCBjd2QgPSBwcm9jZXNzLmN3ZCgpIH0gPSBvcHRpb25zO1xuXG4gIGNvbnNvbGUubG9nKGBDcmVhdGluZyBsaWJyYXJ5OiBAZi1vLXQvJHtuYW1lfWApO1xuICBjb25zb2xlLmxvZyhgRGVzY3JpcHRpb246ICR7ZGVzY3JpcHRpb259YCk7XG5cbiAgLy8gRGV0ZXJtaW5lIGxpYnJhcnkgcGF0aFxuICBjb25zdCBsaWJyYXJ5UGF0aCA9IGpvaW4oY3dkLCBcImxpYnJhcmllc1wiLCBuYW1lKTtcblxuICAvLyBDaGVjayBpZiBsaWJyYXJ5IGFscmVhZHkgZXhpc3RzXG4gIGlmIChleGlzdHNTeW5jKGxpYnJhcnlQYXRoKSkge1xuICAgIGNvbnNvbGUuZXJyb3IoYEVycm9yOiBMaWJyYXJ5IGFscmVhZHkgZXhpc3RzIGF0ICR7bGlicmFyeVBhdGh9YCk7XG4gICAgcHJvY2Vzcy5leGl0KDEpO1xuICB9XG5cbiAgLy8gQ3JlYXRlIGRpcmVjdG9yeSBzdHJ1Y3R1cmVcbiAgY29uc29sZS5sb2coXCJcXG5DcmVhdGluZyBkaXJlY3Rvcnkgc3RydWN0dXJlLi4uXCIpO1xuICBjb25zdCBzcmNQYXRoID0gam9pbihsaWJyYXJ5UGF0aCwgXCJzcmNcIik7XG4gIG1rZGlyU3luYyhzcmNQYXRoLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgY29uc29sZS5sb2coYOKckyBDcmVhdGVkICR7c3JjUGF0aH1gKTtcblxuICAvLyBHZXQgdGVtcGxhdGVzXG4gIGNvbnNvbGUubG9nKFwiXFxuR2VuZXJhdGluZyB0ZW1wbGF0ZSBmaWxlcy4uLlwiKTtcbiAgY29uc3QgdGVtcGxhdGVzID0gZ2V0TGlicmFyeVRlbXBsYXRlKG5hbWUsIGRlc2NyaXB0aW9uKTtcblxuICAvLyBXcml0ZSBmb3QuY29uZmlnLnRzXG4gIGNvbnN0IGZvdENvbmZpZ1BhdGggPSBqb2luKGxpYnJhcnlQYXRoLCBcImZvdC5jb25maWcudHNcIik7XG4gIHdyaXRlRmlsZVN5bmMoZm90Q29uZmlnUGF0aCwgdGVtcGxhdGVzLmZvdENvbmZpZyk7XG4gIGNvbnNvbGUubG9nKGDinJMgQ3JlYXRlZCAke2ZvdENvbmZpZ1BhdGh9YCk7XG5cbiAgLy8gV3JpdGUgc3JjL2luZGV4LnRzXG4gIGNvbnN0IGluZGV4VHNQYXRoID0gam9pbihzcmNQYXRoLCBcImluZGV4LnRzXCIpO1xuICB3cml0ZUZpbGVTeW5jKGluZGV4VHNQYXRoLCB0ZW1wbGF0ZXMuaW5kZXhUcyk7XG4gIGNvbnNvbGUubG9nKGDinJMgQ3JlYXRlZCAke2luZGV4VHNQYXRofWApO1xuXG4gIC8vIFdyaXRlIHNyYy9pbmRleC50ZXN0LnRzXG4gIGNvbnN0IGluZGV4VGVzdFRzUGF0aCA9IGpvaW4oc3JjUGF0aCwgXCJpbmRleC50ZXN0LnRzXCIpO1xuICB3cml0ZUZpbGVTeW5jKGluZGV4VGVzdFRzUGF0aCwgdGVtcGxhdGVzLmluZGV4VGVzdFRzKTtcbiAgY29uc29sZS5sb2coYOKckyBDcmVhdGVkICR7aW5kZXhUZXN0VHNQYXRofWApO1xuXG4gIC8vIFdyaXRlIFJFQURNRS5tZFxuICBjb25zdCByZWFkbWVQYXRoID0gam9pbihsaWJyYXJ5UGF0aCwgXCJSRUFETUUubWRcIik7XG4gIHdyaXRlRmlsZVN5bmMocmVhZG1lUGF0aCwgdGVtcGxhdGVzLnJlYWRtZSk7XG4gIGNvbnNvbGUubG9nKGDinJMgQ3JlYXRlZCAke3JlYWRtZVBhdGh9YCk7XG5cbiAgLy8gR2VuZXJhdGUgY29uZmlndXJhdGlvbiBmaWxlc1xuICBjb25zb2xlLmxvZyhcIlxcbkdlbmVyYXRpbmcgY29uZmlndXJhdGlvbiBmaWxlcy4uLlwiKTtcbiAgYXdhaXQgZ2VuZXJhdGVDb25maWdGaWxlcyhsaWJyYXJ5UGF0aCk7XG5cbiAgLy8gUnVuIGJ1biBpbnN0YWxsXG4gIGNvbnNvbGUubG9nKFwiXFxuSW5zdGFsbGluZyBkZXBlbmRlbmNpZXMuLi5cIik7XG4gIGNvbnN0IGluc3RhbGxQcm9jID0gc3Bhd24oe1xuICAgIGNtZDogW1wiYnVuXCIsIFwiaW5zdGFsbFwiXSxcbiAgICBjd2Q6IGxpYnJhcnlQYXRoLFxuICAgIHN0ZGlvOiBbXCJpbmhlcml0XCIsIFwiaW5oZXJpdFwiLCBcImluaGVyaXRcIl0sXG4gIH0pO1xuXG4gIGNvbnN0IGV4aXRDb2RlID0gYXdhaXQgaW5zdGFsbFByb2MuZXhpdGVkO1xuXG4gIGlmIChleGl0Q29kZSAhPT0gMCkge1xuICAgIGNvbnNvbGUuZXJyb3IoXCJGYWlsZWQgdG8gaW5zdGFsbCBkZXBlbmRlbmNpZXNcIik7XG4gICAgcHJvY2Vzcy5leGl0KGV4aXRDb2RlKTtcbiAgfVxuXG4gIGNvbnNvbGUubG9nKFwi4pyTIERlcGVuZGVuY2llcyBpbnN0YWxsZWRcIik7XG5cbiAgLy8gU2hvdyBuZXh0IHN0ZXBzXG4gIGNvbnNvbGUubG9nKFwiXFxuXCIgKyBcIj1cIi5yZXBlYXQoNjApKTtcbiAgY29uc29sZS5sb2coXCLinJMgTGlicmFyeSBjcmVhdGVkIHN1Y2Nlc3NmdWxseSFcIik7XG4gIGNvbnNvbGUubG9nKFwiPVwiLnJlcGVhdCg2MCkpO1xuICBjb25zb2xlLmxvZyhcIlxcbk5leHQgc3RlcHM6XCIpO1xuICBjb25zb2xlLmxvZyhgICAxLiBjZCBsaWJyYXJpZXMvJHtuYW1lfWApO1xuICBjb25zb2xlLmxvZyhcIiAgMi4gRWRpdCBzcmMvaW5kZXgudHMgdG8gaW1wbGVtZW50IHlvdXIgbGlicmFyeVwiKTtcbiAgY29uc29sZS5sb2coXCIgIDMuIEFkZCB0ZXN0cyBpbiBzcmMvaW5kZXgudGVzdC50c1wiKTtcbiAgY29uc29sZS5sb2coXCIgIDQuIFJ1biAnYnVuIHRlc3QnIHRvIHZlcmlmeSB0ZXN0cyBwYXNzXCIpO1xuICBjb25zb2xlLmxvZyhcIiAgNS4gUnVuICdidW4gcnVuIGJ1aWxkJyB0byBidWlsZCB0aGUgbGlicmFyeVwiKTtcbiAgY29uc29sZS5sb2coXCJcXG5IYXBweSBjb2RpbmchIPCfmoBcIik7XG59XG4iLAogICAgIi8qKlxuICogVGVtcGxhdGVzIGZvciBzY2FmZm9sZGluZyBuZXcgbGlicmFyaWVzXG4gKi9cblxuZXhwb3J0IGludGVyZmFjZSBMaWJyYXJ5VGVtcGxhdGVzIHtcbiAgZm90Q29uZmlnOiBzdHJpbmc7XG4gIGluZGV4VHM6IHN0cmluZztcbiAgaW5kZXhUZXN0VHM6IHN0cmluZztcbiAgcmVhZG1lOiBzdHJpbmc7XG59XG5cbi8qKlxuICogR2V0IHRlbXBsYXRlcyBmb3IgYSBuZXcgbGlicmFyeVxuICpcbiAqIEBwYXJhbSBuYW1lIC0gTGlicmFyeSBuYW1lIChlLmcuLCBcIm15LWxpYnJhcnlcIilcbiAqIEBwYXJhbSBkZXNjcmlwdGlvbiAtIEJyaWVmIGRlc2NyaXB0aW9uIG9mIHRoZSBsaWJyYXJ5XG4gKiBAcmV0dXJucyBPYmplY3QgY29udGFpbmluZyBhbGwgdGVtcGxhdGUgZmlsZXNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldExpYnJhcnlUZW1wbGF0ZShcbiAgbmFtZTogc3RyaW5nLFxuICBkZXNjcmlwdGlvbjogc3RyaW5nXG4pOiBMaWJyYXJ5VGVtcGxhdGVzIHtcbiAgY29uc3QgcGFja2FnZU5hbWUgPSBgQGYtby10LyR7bmFtZX1gO1xuXG4gIGNvbnN0IGZvdENvbmZpZyA9IGBpbXBvcnQgeyBkZWZpbmVGb3RDb25maWcgfSBmcm9tIFwiQGYtby10L2NvbmZpZ1wiO1xuXG5leHBvcnQgZGVmYXVsdCBkZWZpbmVGb3RDb25maWcoe1xuICBmb3JtYXRzOiBbXCJlc21cIiwgXCJjanNcIl0sXG4gIGV4dGVybmFsOiBbXSxcbiAgdHlwZXNjcmlwdDoge1xuICAgIGRlY2xhcmF0aW9uOiB0cnVlLFxuICB9LFxufSk7XG5gO1xuXG4gIGNvbnN0IGluZGV4VHMgPSBgLyoqXG4gKiAke3BhY2thZ2VOYW1lfVxuICogJHtkZXNjcmlwdGlvbn1cbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gaGVsbG8oKTogc3RyaW5nIHtcbiAgcmV0dXJuIFwiSGVsbG8gZnJvbSAke3BhY2thZ2VOYW1lfSFcIjtcbn1cbmA7XG5cbiAgY29uc3QgaW5kZXhUZXN0VHMgPSBgaW1wb3J0IHsgZGVzY3JpYmUsIGV4cGVjdCwgdGVzdCBhcyBpdCB9IGZyb20gXCJidW46dGVzdFwiO1xuaW1wb3J0IHsgaGVsbG8gfSBmcm9tIFwiLi9pbmRleFwiO1xuXG5kZXNjcmliZShcIiR7cGFja2FnZU5hbWV9XCIsICgpID0+IHtcbiAgaXQoXCJzaG91bGQgZXhwb3J0IGhlbGxvIGZ1bmN0aW9uXCIsICgpID0+IHtcbiAgICBleHBlY3QoaGVsbG8oKSkudG9CZShcIkhlbGxvIGZyb20gJHtwYWNrYWdlTmFtZX0hXCIpO1xuICB9KTtcbn0pO1xuYDtcblxuICBjb25zdCByZWFkbWUgPSBgIyAke3BhY2thZ2VOYW1lfVxuXG4ke2Rlc2NyaXB0aW9ufVxuXG4jIyBJbnN0YWxsYXRpb25cblxuXFxgXFxgXFxgYmFzaFxuIyBidW5cbmJ1biBhZGQgJHtwYWNrYWdlTmFtZX1cblxuIyBucG1cbm5wbSBpbnN0YWxsICR7cGFja2FnZU5hbWV9XG5cbiMgeWFyblxueWFybiBhZGQgJHtwYWNrYWdlTmFtZX1cblxuIyBwbnBtXG5wbnBtIGFkZCAke3BhY2thZ2VOYW1lfVxuXFxgXFxgXFxgXG5cbiMjIFF1aWNrIFN0YXJ0XG5cblxcYFxcYFxcYHR5cGVzY3JpcHRcbmltcG9ydCB7IGhlbGxvIH0gZnJvbSBcIiR7cGFja2FnZU5hbWV9XCI7XG5cbmNvbnNvbGUubG9nKGhlbGxvKCkpO1xuXFxgXFxgXFxgXG5cbiMjIEFQSSBSZWZlcmVuY2VcblxuIyMjIFxcYGhlbGxvKClcXGBcblxuUmV0dXJucyBhIGdyZWV0aW5nIHN0cmluZy5cblxuXFxgXFxgXFxgdHlwZXNjcmlwdFxuY29uc3QgZ3JlZXRpbmcgPSBoZWxsbygpO1xuY29uc29sZS5sb2coZ3JlZXRpbmcpOyAvLyBcIkhlbGxvIGZyb20gJHtwYWNrYWdlTmFtZX0hXCJcblxcYFxcYFxcYFxuXG4jIyBDb250cmlidXRpbmdcblxuQ29udHJpYnV0aW9ucyBhcmUgd2VsY29tZSEgUGxlYXNlIGNoZWNrIHRoZSByZXBvc2l0b3J5IGZvciBndWlkZWxpbmVzLlxuXG4jIyBMaWNlbnNlXG5cbk1JVCBMaWNlbnNlIC0gc2VlIFtMSUNFTlNFXSguL0xJQ0VOU0UpIGZpbGUgZm9yIGRldGFpbHMuXG5cbiMjIExpbmtzXG5cbi0gW0dpdEh1YiBSZXBvc2l0b3J5XShodHRwczovL2dpdGh1Yi5jb20vRi1PLVQvbGlicmFyaWVzKVxuLSBbSXNzdWUgVHJhY2tlcl0oaHR0cHM6Ly9naXRodWIuY29tL0YtTy1UL2xpYnJhcmllcy9pc3N1ZXMpXG5gO1xuXG4gIHJldHVybiB7XG4gICAgZm90Q29uZmlnLFxuICAgIGluZGV4VHMsXG4gICAgaW5kZXhUZXN0VHMsXG4gICAgcmVhZG1lLFxuICB9O1xufVxuIiwKICAgICIjIS91c3IvYmluL2VudiBidW5cblxuaW1wb3J0IHtcbiAgYnVpbGRDb21tYW5kLFxuICBkZXZDb21tYW5kLFxuICB0ZXN0Q29tbWFuZCxcbiAgY2hlY2tDb21tYW5kLFxuICB0eXBlY2hlY2tDb21tYW5kLFxuICBnZW5lcmF0ZUNvbmZpZ0ZpbGVzLFxuICBjcmVhdGVDb21tYW5kLFxuICB0eXBlIFRlc3RPcHRpb25zLFxuICB0eXBlIENyZWF0ZU9wdGlvbnMsXG59IGZyb20gXCIuL2NvbW1hbmRzL2luZGV4XCI7XG5cbi8vIEV4cG9ydCBhbGwgY29tbWFuZHMgYW5kIHV0aWxpdGllc1xuZXhwb3J0IHsgZ2VuZXJhdGVDb25maWdGaWxlcyB9IGZyb20gXCIuL2NvbW1hbmRzL2dlbmVyYXRlXCI7XG5leHBvcnQgeyBidWlsZENvbW1hbmQgfSBmcm9tIFwiLi9jb21tYW5kcy9idWlsZFwiO1xuZXhwb3J0IHsgYnVpbGRMaWJyYXJ5LCB0eXBlIEJ1aWxkT3B0aW9ucyB9IGZyb20gXCIuL2J1aWxkZXJcIjtcbmV4cG9ydCB7IGxvYWRGb3RDb25maWcsIGhhc0ZvdENvbmZpZyB9IGZyb20gXCIuL2NvbmZpZy1sb2FkZXJcIjtcblxuZnVuY3Rpb24gcHJpbnRIZWxwKCkge1xuICBjb25zb2xlLmxvZyhgXG5GT1QgQ0xJIC0gQnVpbGQgdG9vbHMgZm9yIG1vbm9yZXBvIGxpYnJhcmllc1xuXG5Vc2FnZTogZm90IDxjb21tYW5kPiBbb3B0aW9uc11cblxuQ29tbWFuZHM6XG4gIGJ1aWxkICAgICAgICAgICAgICBCdWlsZCB0aGUgY3VycmVudCBsaWJyYXJ5XG4gIGRldiAgICAgICAgICAgICAgICBTdGFydCBkZXZlbG9wbWVudCBtb2RlIHdpdGggd2F0Y2hcbiAgdGVzdCAgICAgICAgICAgICAgIFJ1biB0ZXN0c1xuICAgIC0td2F0Y2ggICAgICAgICAgUnVuIHRlc3RzIGluIHdhdGNoIG1vZGVcbiAgICAtLWNvdmVyYWdlICAgICAgIFJ1biB0ZXN0cyB3aXRoIGNvdmVyYWdlXG4gIGNoZWNrICAgICAgICAgICAgICBSdW4gYWxsIGNoZWNrcyAodHlwZWNoZWNrICsgdGVzdClcbiAgdHlwZWNoZWNrICAgICAgICAgIFJ1biBUeXBlU2NyaXB0IHR5cGUgY2hlY2tpbmdcbiAgZ2VuZXJhdGUgICAgICAgICAgIEdlbmVyYXRlIGNvbmZpZ3VyYXRpb24gZmlsZXNcbiAgY3JlYXRlIDxuYW1lPiAgICAgIENyZWF0ZSBhIG5ldyBsaWJyYXJ5XG4gICAgW2Rlc2NyaXB0aW9uXSAgICBPcHRpb25hbCBkZXNjcmlwdGlvbiBmb3IgdGhlIGxpYnJhcnlcbiAgaGVscCwgLS1oZWxwLCAtaCAgIFNob3cgdGhpcyBoZWxwIG1lc3NhZ2VcbiAgdmVyc2lvbiwgLS12ZXJzaW9uLCAtdiAgU2hvdyB2ZXJzaW9uIG51bWJlclxuXG5FeGFtcGxlczpcbiAgZm90IGJ1aWxkXG4gIGZvdCBkZXZcbiAgZm90IHRlc3QgLS1jb3ZlcmFnZVxuICBmb3QgdGVzdCAtLXdhdGNoXG4gIGZvdCBjcmVhdGUgbXktbGliIFwiQSBuZXcgbGlicmFyeVwiXG4gIGZvdCBnZW5lcmF0ZVxuICBmb3QgY2hlY2tcbmApO1xufVxuXG5hc3luYyBmdW5jdGlvbiBtYWluKCkge1xuICBjb25zdCBhcmdzID0gcHJvY2Vzcy5hcmd2LnNsaWNlKDIpO1xuICBjb25zdCBjb21tYW5kID0gYXJnc1swXTtcblxuICB0cnkge1xuICAgIHN3aXRjaCAoY29tbWFuZCkge1xuICAgICAgY2FzZSBcImJ1aWxkXCI6XG4gICAgICAgIGF3YWl0IGJ1aWxkQ29tbWFuZCgpO1xuICAgICAgICBicmVhaztcblxuICAgICAgY2FzZSBcImRldlwiOlxuICAgICAgICBhd2FpdCBkZXZDb21tYW5kKCk7XG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBjYXNlIFwidGVzdFwiOiB7XG4gICAgICAgIGNvbnN0IG9wdGlvbnM6IFRlc3RPcHRpb25zID0ge1xuICAgICAgICAgIGNvdmVyYWdlOiBhcmdzLmluY2x1ZGVzKFwiLS1jb3ZlcmFnZVwiKSxcbiAgICAgICAgICB3YXRjaDogYXJncy5pbmNsdWRlcyhcIi0td2F0Y2hcIiksXG4gICAgICAgIH07XG4gICAgICAgIGF3YWl0IHRlc3RDb21tYW5kKG9wdGlvbnMpO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cblxuICAgICAgY2FzZSBcImNoZWNrXCI6XG4gICAgICAgIGF3YWl0IGNoZWNrQ29tbWFuZCgpO1xuICAgICAgICBicmVhaztcblxuICAgICAgY2FzZSBcInR5cGVjaGVja1wiOlxuICAgICAgICBhd2FpdCB0eXBlY2hlY2tDb21tYW5kKCk7XG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBjYXNlIFwiZ2VuZXJhdGVcIjpcbiAgICAgICAgYXdhaXQgZ2VuZXJhdGVDb25maWdGaWxlcyhwcm9jZXNzLmN3ZCgpKTtcbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGNhc2UgXCJjcmVhdGVcIjoge1xuICAgICAgICBjb25zdCBuYW1lID0gYXJnc1sxXTtcbiAgICAgICAgY29uc3QgZGVzY3JpcHRpb24gPSBhcmdzWzJdIHx8IGBBIG5ldyBGT1QgbGlicmFyeTogJHtuYW1lfWA7XG4gICAgICAgIGNvbnN0IG9wdGlvbnM6IENyZWF0ZU9wdGlvbnMgPSB7XG4gICAgICAgICAgbmFtZSxcbiAgICAgICAgICBkZXNjcmlwdGlvbixcbiAgICAgICAgfTtcbiAgICAgICAgYXdhaXQgY3JlYXRlQ29tbWFuZChvcHRpb25zKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG5cbiAgICAgIGNhc2UgXCJoZWxwXCI6XG4gICAgICBjYXNlIFwiLS1oZWxwXCI6XG4gICAgICBjYXNlIFwiLWhcIjpcbiAgICAgICAgcHJpbnRIZWxwKCk7XG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBjYXNlIFwidmVyc2lvblwiOlxuICAgICAgY2FzZSBcIi0tdmVyc2lvblwiOlxuICAgICAgY2FzZSBcIi12XCI6XG4gICAgICAgIGNvbnNvbGUubG9nKFwiZm90IHYwLjEuMFwiKTtcbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGNhc2UgdW5kZWZpbmVkOlxuICAgICAgICBwcmludEhlbHAoKTtcbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoYFVua25vd24gY29tbWFuZDogJHtjb21tYW5kfWApO1xuICAgICAgICBjb25zb2xlLmxvZygnUnVuIFwiZm90IC0taGVscFwiIGZvciB1c2FnZSBpbmZvcm1hdGlvbicpO1xuICAgICAgICBwcm9jZXNzLmV4aXQoMSk7XG4gICAgfVxuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGNvbnNvbGUuZXJyb3IoXCJFcnJvcjpcIiwgZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiBlcnJvcik7XG4gICAgcHJvY2Vzcy5leGl0KDEpO1xuICB9XG59XG5cbm1haW4oKTtcbiIKICBdLAogICJtYXBwaW5ncyI6ICI7Ozs7QUFBQSxpQkFBUztBQUNUO0FBQ0E7OztBQ0ZBO0FBQ0E7QUFTTyxTQUFTLFlBQVksQ0FBQyxLQUFzQjtBQUFBLEVBQ2pELE1BQU0sYUFBYSxLQUFLLEtBQUssZUFBZTtBQUFBLEVBQzVDLE9BQU8sV0FBVyxVQUFVO0FBQUE7QUFVOUIsZUFBc0IsYUFBYSxDQUFDLEtBQXlDO0FBQUEsRUFDM0UsTUFBTSxhQUFhLEtBQUssS0FBSyxlQUFlO0FBQUEsRUFFNUMsSUFBSSxDQUFDLFdBQVcsVUFBVSxHQUFHO0FBQUEsSUFDM0IsTUFBTSxJQUFJLE1BQ1IsOEJBQThCLDBDQUNoQztBQUFBLEVBQ0Y7QUFBQSxFQUVBLElBQUk7QUFBQSxJQUVGLE1BQU0sZUFBZSxNQUFhO0FBQUEsSUFFbEMsSUFBSSxDQUFDLGFBQWEsU0FBUztBQUFBLE1BQ3pCLE1BQU0sSUFBSSxN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QUErQztBQUFBLEVBQzNELFFBQVEsSUFBSTtBQUFBLDJCQUFtQjtBQUFBOztBRXJGakMsU0FBUyxTQUFTLEdBQUc7QUFBQSxFQUNuQixRQUFRLElBQUk7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsQ0EyQmI7QUFBQTtBQUdELGVBQWUsSUFBSSxHQUFHO0FBQUEsRUFDcEIsTUFBTSxPQUFPLFFBQVEsS0FBSyxNQUFNLENBQUM7QUFBQSxFQUNqQyxNQUFNLFVBQVUsS0FBSztBQUFBLEVBRXJCLElBQUk7QUFBQSxJQUNGLFFBQVE7QUFBQSxXQUNEO0FBQUEsUUFDSCxNQUFNLGFBQWE7QUFBQSxRQUNuQjtBQUFBLFdBRUc7QUFBQSxRQUNILE1BQU0sV0FBVztBQUFBLFFBQ2pCO0FBQUEsV0FFRyxRQUFRO0FBQUEsUUFDWCxNQUFNLFVBQXVCO0FBQUEsVUFDM0IsVUFBVSxLQUFLLFNBQVMsWUFBWTtBQUFBLFVBQ3BDLE9BQU8sS0FBSyxTQUFTLFNBQVM7QUFBQSxRQUNoQztBQUFBLFFBQ0EsTUFBTSxZQUFZLE9BQU87QUFBQSxRQUN6QjtBQUFBLE1BQ0Y7QUFBQSxXQUVLO0FBQUEsUUFDSCxNQUFNLGFBQWE7QUFBQSxRQUNuQjtBQUFBLFdBRUc7QUFBQSxRQUNILE1BQU0saUJBQWlCO0FBQUEsUUFDdkI7QUFBQSxXQUVHO0FBQUEsUUFDSCxNQUFNLG9CQUFvQixRQUFRLElBQUksQ0FBQztBQUFBLFFBQ3ZDO0FBQUEsV0FFRyxVQUFVO0FBQUEsUUFDYixNQUFNLE9BQU8sS0FBSztBQUFBLFFBQ2xCLE1BQU0sY0FBYyxLQUFLLE1BQU0sc0JBQXNCO0FBQUEsUUFDckQsTUFBTSxVQUF5QjtBQUFBLFVBQzdCO0FBQUEsVUFDQTtBQUFBLFFBQ0Y7QUFBQSxRQUNBLE1BQU0sY0FBYyxPQUFPO0FBQUEsUUFDM0I7QUFBQSxNQUNGO0FBQUEsV0FFSztBQUFBLFdBQ0E7QUFBQSxXQUNBO0FBQUEsUUFDSCxVQUFVO0FBQUEsUUFDVjtBQUFBLFdBRUc7QUFBQSxXQUNBO0FBQUEsV0FDQTtBQUFBLFFBQ0gsUUFBUSxJQUFJLFlBQVk7QUFBQSxRQUN4QjtBQUFBLFdBRUc7QUFBQSxRQUNILFVBQVU7QUFBQSxRQUNWO0FBQUE7QUFBQSxRQUdBLFFBQVEsTUFBTSxvQkFBb0IsU0FBUztBQUFBLFFBQzNDLFFBQVEsSUFBSSx3Q0FBd0M7QUFBQSxRQUNwRCxRQUFRLEtBQUssQ0FBQztBQUFBO0FBQUEsSUFFbEIsT0FBTyxPQUFPO0FBQUEsSUFDZCxRQUFRLE1BQU0sVUFBVSxpQkFBaUIsUUFBUSxNQUFNLFVBQVUsS0FBSztBQUFBLElBQ3RFLFFBQVEsS0FBSyxDQUFDO0FBQUE7QUFBQTtBQUlsQixLQUFLOyIsCiAgImRlYnVnSWQiOiAiM0QxQkM0OTI1MThDMjZBOTY0NzU2RTIxNjQ3NTZFMjEiLAogICJuYW1lcyI6IFtdCn0=
455
+ //# debugId=9EBFF578F67EF15964756E2164756E21
456
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsic3JjL2luZGV4LnRzIiwgInNyYy9idWlsZGVyLnRzIiwgInNyYy9jb25maWctbG9hZGVyLnRzIiwgInNyYy9jb21tYW5kcy9idWlsZC50cyIsICJzcmMvY29tbWFuZHMvZGV2LnRzIiwgInNyYy9jb21tYW5kcy90ZXN0LnRzIiwgInNyYy9jb21tYW5kcy9jaGVjay50cyIsICJzcmMvY29tbWFuZHMvdHlwZWNoZWNrLnRzIiwgInNyYy9jb21tYW5kcy9nZW5lcmF0ZS50cyIsICJzcmMvY29tbWFuZHMvY3JlYXRlLnRzIiwgInNyYy90ZW1wbGF0ZXMvbGlicmFyeS50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsKICAgICIjIS91c3IvYmluL2VudiBidW5cblxuaW1wb3J0IHsgQ29tbWFuZCB9IGZyb20gXCJjb21tYW5kZXJcIjtcbmltcG9ydCB7IHJlYWRGaWxlU3luYyB9IGZyb20gXCJub2RlOmZzXCI7XG5pbXBvcnQgeyBqb2luLCBkaXJuYW1lIH0gZnJvbSBcIm5vZGU6cGF0aFwiO1xuaW1wb3J0IHsgZmlsZVVSTFRvUGF0aCB9IGZyb20gXCJub2RlOnVybFwiO1xuaW1wb3J0IHtcbiAgYnVpbGRDb21tYW5kLFxuICBkZXZDb21tYW5kLFxuICB0ZXN0Q29tbWFuZCxcbiAgY2hlY2tDb21tYW5kLFxuICB0eXBlY2hlY2tDb21tYW5kLFxuICBnZW5lcmF0ZUNvbmZpZ0ZpbGVzLFxuICBjcmVhdGVDb21tYW5kLFxuICB0eXBlIFRlc3RPcHRpb25zLFxuICB0eXBlIENyZWF0ZU9wdGlvbnMsXG59IGZyb20gXCIuL2NvbW1hbmRzL2luZGV4XCI7XG5cbi8vIFJlLWV4cG9ydCBwdWJsaWMgQVBJXG5leHBvcnQgeyBnZW5lcmF0ZUNvbmZpZ0ZpbGVzIH0gZnJvbSBcIi4vY29tbWFuZHMvZ2VuZXJhdGVcIjtcbmV4cG9ydCB7IGJ1aWxkQ29tbWFuZCB9IGZyb20gXCIuL2NvbW1hbmRzL2J1aWxkXCI7XG5leHBvcnQgeyBidWlsZExpYnJhcnksIHR5cGUgQnVpbGRPcHRpb25zIH0gZnJvbSBcIi4vYnVpbGRlclwiO1xuZXhwb3J0IHsgbG9hZEZvdENvbmZpZywgaGFzRm90Q29uZmlnIH0gZnJvbSBcIi4vY29uZmlnLWxvYWRlclwiO1xuXG4vLyBSZWFkIHZlcnNpb24gZnJvbSBwYWNrYWdlLmpzb25cbmNvbnN0IF9fZGlybmFtZSA9IGRpcm5hbWUoZmlsZVVSTFRvUGF0aChpbXBvcnQubWV0YS51cmwpKTtcbmNvbnN0IHBrZyA9IEpTT04ucGFyc2UocmVhZEZpbGVTeW5jKGpvaW4oX19kaXJuYW1lLCBcIi4uXCIsIFwicGFja2FnZS5qc29uXCIpLCBcInV0Zi04XCIpKTtcblxuY29uc3QgcHJvZ3JhbSA9IG5ldyBDb21tYW5kKCk7XG5cbnByb2dyYW1cbiAgLm5hbWUoXCJmb3RcIilcbiAgLmRlc2NyaXB0aW9uKFwiQnVpbGQgdG9vbHMgZm9yIEZPVCBtb25vcmVwbyBsaWJyYXJpZXNcIilcbiAgLnZlcnNpb24ocGtnLnZlcnNpb24pO1xuXG5wcm9ncmFtXG4gIC5jb21tYW5kKFwiYnVpbGRcIilcbiAgLmRlc2NyaXB0aW9uKFwiQnVpbGQgdGhlIGN1cnJlbnQgbGlicmFyeVwiKVxuICAuYWN0aW9uKGFzeW5jICgpID0+IHtcbiAgICBhd2FpdCBidWlsZENvbW1hbmQoKTtcbiAgfSk7XG5cbnByb2dyYW1cbiAgLmNvbW1hbmQoXCJkZXZcIilcbiAgLmRlc2NyaXB0aW9uKFwiU3RhcnQgZGV2ZWxvcG1lbnQgbW9kZSB3aXRoIGZpbGUgd2F0Y2hpbmdcIilcbiAgLmFjdGlvbihhc3luYyAoKSA9PiB7XG4gICAgYXdhaXQgZGV2Q29tbWFuZCgpO1xuICB9KTtcblxucHJvZ3JhbVxuICAuY29tbWFuZChcInRlc3RcIilcbiAgLmRlc2NyaXB0aW9uKFwiUnVuIHRlc3RzXCIpXG4gIC5vcHRpb24oXCItLXdhdGNoXCIsIFwiUnVuIHRlc3RzIGluIHdhdGNoIG1vZGVcIilcbiAgLm9wdGlvbihcIi0tY292ZXJhZ2VcIiwgXCJSdW4gdGVzdHMgd2l0aCBjb3ZlcmFnZVwiKVxuICAuYWN0aW9uKGFzeW5jIChvcHRpb25zOiBUZXN0T3B0aW9ucykgPT4ge1xuICAgIGF3YWl0IHRlc3RDb21tYW5kKG9wdGlvbnMpO1xuICB9KTtcblxucHJvZ3JhbVxuICAuY29tbWFuZChcImNoZWNrXCIpXG4gIC5kZXNjcmlwdGlvbihcIkZvcm1hdCBhbmQgbGludCBjb2RlIHdpdGggQmlvbWVcIilcbiAgLmFjdGlvbihhc3luYyAoKSA9PiB7XG4gICAgYXdhaXQgY2hlY2tDb21tYW5kKCk7XG4gIH0pO1xuXG5wcm9ncmFtXG4gIC5jb21tYW5kKFwidHlwZWNoZWNrXCIpXG4gIC5kZXNjcmlwdGlvbihcIlJ1biBUeXBlU2NyaXB0IHR5cGUgY2hlY2tpbmdcIilcbiAgLmFjdGlvbihhc3luYyAoKSA9PiB7XG4gICAgYXdhaXQgdHlwZWNoZWNrQ29tbWFuZCgpO1xuICB9KTtcblxucHJvZ3JhbVxuICAuY29tbWFuZChcImdlbmVyYXRlXCIpXG4gIC5kZXNjcmlwdGlvbihcIkdlbmVyYXRlIGNvbmZpZyBmaWxlcyBmcm9tIGZvdC5jb25maWcudHNcIilcbiAgLmFjdGlvbihhc3luYyAoKSA9PiB7XG4gICAgYXdhaXQgZ2VuZXJhdGVDb25maWdGaWxlcyhwcm9jZXNzLmN3ZCgpKTtcbiAgfSk7XG5cbnByb2dyYW1cbiAgLmNvbW1hbmQoXCJjcmVhdGUgPG5hbWU+XCIpXG4gIC5kZXNjcmlwdGlvbihcIlNjYWZmb2xkIGEgbmV3IGxpYnJhcnlcIilcbiAgLmFyZ3VtZW50KFwiW2Rlc2NyaXB0aW9uXVwiLCBcIkRlc2NyaXB0aW9uIGZvciB0aGUgbGlicmFyeVwiLCBcIkEgbmV3IEZPVCBsaWJyYXJ5XCIpXG4gIC5hY3Rpb24oYXN5bmMgKG5hbWU6IHN0cmluZywgZGVzY3JpcHRpb246IHN0cmluZykgPT4ge1xuICAgIGNvbnN0IG9wdGlvbnM6IENyZWF0ZU9wdGlvbnMgPSB7IG5hbWUsIGRlc2NyaXB0aW9uIH07XG4gICAgYXdhaXQgY3JlYXRlQ29tbWFuZChvcHRpb25zKTtcbiAgfSk7XG5cbnByb2dyYW0ucGFyc2UoKTtcbiIsCiAgICAiaW1wb3J0IHsgam9pbiB9IGZyb20gXCJub2RlOnBhdGhcIjtcbmltcG9ydCB7IHdyaXRlRmlsZVN5bmMgfSBmcm9tIFwibm9kZTpmc1wiO1xuaW1wb3J0IHsgYnVpbGQgYXMgYnVuQnVpbGQgfSBmcm9tIFwiYnVuXCI7XG5pbXBvcnQgeyAkIH0gZnJvbSBcImJ1blwiO1xuaW1wb3J0IHR5cGUgeyBCdWlsZEZvcm1hdCB9IGZyb20gXCJAZi1vLXQvY29uZmlnXCI7XG5pbXBvcnQgeyBnZW5lcmF0ZVRTQ29uZmlnIH0gZnJvbSBcIkBmLW8tdC9jb25maWdcIjtcbmltcG9ydCB7IGxvYWRGb3RDb25maWcgfSBmcm9tIFwiLi9jb25maWctbG9hZGVyXCI7XG5cbi8qKlxuICogT3B0aW9ucyBmb3IgYnVpbGRpbmcgYSBsaWJyYXJ5XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQnVpbGRPcHRpb25zIHtcbiAgLyoqXG4gICAqIFRoZSB3b3JraW5nIGRpcmVjdG9yeSBjb250YWluaW5nIHRoZSBmb3QuY29uZmlnLnRzIGZpbGVcbiAgICogQGRlZmF1bHQgcHJvY2Vzcy5jd2QoKVxuICAgKi9cbiAgY3dkPzogc3RyaW5nO1xuICAvKipcbiAgICogV2hldGhlciB0byB3YXRjaCBmb3IgY2hhbmdlcyBhbmQgcmVidWlsZFxuICAgKiBAZGVmYXVsdCBmYWxzZVxuICAgKi9cbiAgd2F0Y2g/OiBib29sZWFuO1xufVxuXG4vKipcbiAqIEJ1aWxkIGEgbGlicmFyeSB1c2luZyBCdW4ncyBidW5kbGVyXG4gKlxuICogQHBhcmFtIG9wdGlvbnMgLSBCdWlsZCBvcHRpb25zXG4gKiBAdGhyb3dzIHtFcnJvcn0gSWYgdGhlIGJ1aWxkIGZhaWxzXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBidWlsZExpYnJhcnkob3B0aW9uczogQnVpbGRPcHRpb25zID0ge30pOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgY3dkID0gb3B0aW9ucy5jd2QgfHwgcHJvY2Vzcy5jd2QoKTtcbiAgY29uc3Qgd2F0Y2ggPSBvcHRpb25zLndhdGNoIHx8IGZhbHNlO1xuXG4gIGNvbnNvbGUubG9nKFwiTG9hZGluZyBmb3QuY29uZmlnLnRzLi4uXCIpO1xuICBjb25zdCBjb25maWcgPSBhd2FpdCBsb2FkRm90Q29uZmlnKGN3ZCk7XG5cbiAgLy8gR2VuZXJhdGUgdHNjb25maWcuanNvbiBmcm9tIGNvbmZpZyB0byBrZWVwIGl0IGluIHN5bmNcbiAgY29uc3QgdHNjb25maWcgPSBnZW5lcmF0ZVRTQ29uZmlnKGNvbmZpZyk7XG4gIHdyaXRlRmlsZVN5bmMoXG4gICAgam9pbihjd2QsIFwidHNjb25maWcuanNvblwiKSxcbiAgICBKU09OLnN0cmluZ2lmeSh0c2NvbmZpZywgbnVsbCwgMikgKyBcIlxcblwiXG4gICk7XG5cbiAgLy8gQ29sbGVjdCBhbGwgZW50cnkgcG9pbnRzIChtYWluICsgcGx1Z2lucylcbiAgY29uc3QgZW50cnlQb2ludHM6IHN0cmluZ1tdID0gW107XG5cbiAgLy8gTWFpbiBlbnRyeSBwb2ludFxuICBjb25zdCBtYWluRW50cnkgPSBqb2luKGN3ZCwgXCJzcmNcIiwgXCJpbmRleC50c1wiKTtcbiAgZW50cnlQb2ludHMucHVzaChtYWluRW50cnkpO1xuXG4gIC8vIFBsdWdpbiBlbnRyeSBwb2ludHNcbiAgZm9yIChjb25zdCBwbHVnaW4gb2YgY29uZmlnLnBsdWdpbnMpIHtcbiAgICBpZiAocGx1Z2luLmVuYWJsZWQgIT09IGZhbHNlKSB7XG4gICAgICBjb25zdCBwbHVnaW5FbnRyeSA9IGpvaW4oY3dkLCBcInNyY1wiLCBcInBsdWdpbnNcIiwgcGx1Z2luLm5hbWUsIFwiaW5kZXgudHNcIik7XG4gICAgICBlbnRyeVBvaW50cy5wdXNoKHBsdWdpbkVudHJ5KTtcbiAgICB9XG4gIH1cblxuICBjb25zb2xlLmxvZyhgQnVpbGRpbmcgJHtlbnRyeVBvaW50cy5sZW5ndGh9IGVudHJ5IHBvaW50KHMpLi4uYCk7XG5cbiAgLy8gSXRlcmF0ZSBvdmVyIGZvcm1hdHMgYW5kIGJ1aWxkIGVhY2hcbiAgZm9yIChjb25zdCBmb3JtYXQgb2YgY29uZmlnLmZvcm1hdHMpIHtcbiAgICBjb25zb2xlLmxvZyhgQnVpbGRpbmcgJHtmb3JtYXR9IGZvcm1hdC4uLmApO1xuXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGJ1bkJ1aWxkKHtcbiAgICAgICAgZW50cnlwb2ludHM6IGVudHJ5UG9pbnRzLFxuICAgICAgICBvdXRkaXI6IGpvaW4oY3dkLCBcImRpc3RcIiksXG4gICAgICAgIHRhcmdldDogXCJidW5cIixcbiAgICAgICAgZm9ybWF0OiBmb3JtYXQgPT09IFwiZXNtXCIgPyBcImVzbVwiIDogXCJjanNcIixcbiAgICAgICAgc3BsaXR0aW5nOiBmb3JtYXQgPT09IFwiZXNtXCIsXG4gICAgICAgIG1pbmlmeTogZmFsc2UsXG4gICAgICAgIHNvdXJjZW1hcDogXCJleHRlcm5hbFwiLFxuICAgICAgICBleHRlcm5hbDogY29uZmlnLmV4dGVybmFsLFxuICAgICAgICBuYW1pbmc6IHtcbiAgICAgICAgICBlbnRyeTogXCJbZGlyXS9bbmFtZV0uanNcIixcbiAgICAgICAgICBjaHVuazogXCJbbmFtZV0tW2hhc2hdLmpzXCIsXG4gICAgICAgIH0sXG4gICAgICB9KTtcblxuICAgICAgaWYgKCFyZXN1bHQuc3VjY2Vzcykge1xuICAgICAgICBjb25zdCBlcnJvcnMgPSByZXN1bHQubG9ncy5tYXAoKGxvZykgPT4gbG9nLm1lc3NhZ2UpLmpvaW4oXCJcXG5cIik7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgQnVpbGQgZmFpbGVkIGZvciAke2Zvcm1hdH0gZm9ybWF0OlxcbiR7ZXJyb3JzfWApO1xuICAgICAgfVxuXG4gICAgICBjb25zb2xlLmxvZyhg4pyTICR7Zm9ybWF0fSBmb3JtYXQgYnVpbHQgc3VjY2Vzc2Z1bGx5YCk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYEJ1aWxkIGZhaWxlZCBmb3IgJHtmb3JtYXR9IGZvcm1hdDogJHtlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6IFN0cmluZyhlcnJvcil9YFxuICAgICAgKTtcbiAgICB9XG4gIH1cblxuICBjb25zb2xlLmxvZyhcIkJ1aWxkIGNvbXBsZXRlZCBzdWNjZXNzZnVsbHkhXCIpO1xuXG4gIC8vIEdlbmVyYXRlIFR5cGVTY3JpcHQgZGVjbGFyYXRpb25zIGlmIGVuYWJsZWRcbiAgaWYgKGNvbmZpZy50eXBlc2NyaXB0LmRlY2xhcmF0aW9uKSB7XG4gICAgY29uc29sZS5sb2coXCJHZW5lcmF0aW5nIFR5cGVTY3JpcHQgZGVjbGFyYXRpb25zLi4uXCIpO1xuICAgIHRyeSB7XG4gICAgICAvLyBDb25maWd1cmUgTm9kZSBtZW1vcnkgbGltaXQgaWYgc3BlY2lmaWVkIGluIGNvbmZpZ1xuICAgICAgaWYgKGNvbmZpZy50eXBlc2NyaXB0Lm1heE1lbW9yeSkge1xuICAgICAgICBhd2FpdCAkYGNkICR7Y3dkfSAmJiBOT0RFX09QVElPTlM9Jy0tbWF4LW9sZC1zcGFjZS1zaXplPSR7Y29uZmlnLnR5cGVzY3JpcHQubWF4TWVtb3J5fScgYnVuIHRzYyAtLWVtaXREZWNsYXJhdGlvbk9ubHkgLS1kZWNsYXJhdGlvbiAtLWRlY2xhcmF0aW9uTWFwIC0tb3V0RGlyIGRpc3QgLS1ub0VtaXQgZmFsc2VgLnF1aWV0KCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBhd2FpdCAkYGNkICR7Y3dkfSAmJiBidW4gdHNjIC0tZW1pdERlY2xhcmF0aW9uT25seSAtLWRlY2xhcmF0aW9uIC0tZGVjbGFyYXRpb25NYXAgLS1vdXREaXIgZGlzdCAtLW5vRW1pdCBmYWxzZWAucXVpZXQoKTtcbiAgICAgIH1cbiAgICAgIGNvbnNvbGUubG9nKFwi4pyTIFR5cGVTY3JpcHQgZGVjbGFyYXRpb25zIGdlbmVyYXRlZFwiKTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgRGVjbGFyYXRpb24gZ2VuZXJhdGlvbiBmYWlsZWQ6ICR7ZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiBTdHJpbmcoZXJyb3IpfWBcbiAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgaWYgKHdhdGNoKSB7XG4gICAgY29uc3QgeyB3YXRjaDogZnNXYXRjaCB9ID0gYXdhaXQgaW1wb3J0KFwibm9kZTpmc1wiKTtcbiAgICBjb25zdCBzcmNEaXIgPSBqb2luKGN3ZCwgXCJzcmNcIik7XG4gICAgY29uc3QgY29uZmlnRmlsZSA9IGpvaW4oY3dkLCBcImZvdC5jb25maWcudHNcIik7XG5cbiAgICBjb25zb2xlLmxvZyhgV2F0Y2hpbmcgJHtzcmNEaXJ9IGFuZCBmb3QuY29uZmlnLnRzIGZvciBjaGFuZ2VzLi4uYCk7XG5cbiAgICBsZXQgZGVib3VuY2VUaW1lcjogUmV0dXJuVHlwZTx0eXBlb2Ygc2V0VGltZW91dD4gfCBudWxsID0gbnVsbDtcbiAgICBsZXQgaXNCdWlsZGluZyA9IGZhbHNlO1xuICAgIGNvbnN0IHdhdGNoZXJzOiBSZXR1cm5UeXBlPHR5cGVvZiBmc1dhdGNoPltdID0gW107XG5cbiAgICBjb25zdCBoYW5kbGVDaGFuZ2UgPSAoZmlsZW5hbWU6IHN0cmluZyB8IG51bGwpID0+IHtcbiAgICAgIGlmICghZmlsZW5hbWUpIHJldHVybjtcbiAgICAgIFxuICAgICAgY29uc3QgaXNUeXBlU2NyaXB0ID0gZmlsZW5hbWUuZW5kc1dpdGgoXCIudHNcIikgfHwgZmlsZW5hbWUuZW5kc1dpdGgoXCIudHN4XCIpO1xuICAgICAgY29uc3QgaXNDb25maWcgPSBmaWxlbmFtZSA9PT0gXCJmb3QuY29uZmlnLnRzXCI7XG4gICAgICBcbiAgICAgIGlmICghaXNUeXBlU2NyaXB0ICYmICFpc0NvbmZpZykgcmV0dXJuO1xuXG4gICAgICBpZiAoZGVib3VuY2VUaW1lcikgY2xlYXJUaW1lb3V0KGRlYm91bmNlVGltZXIpO1xuXG4gICAgICBkZWJvdW5jZVRpbWVyID0gc2V0VGltZW91dChhc3luYyAoKSA9PiB7XG4gICAgICAgIGlmIChpc0J1aWxkaW5nKSB7XG4gICAgICAgICAgY29uc29sZS5sb2coXCJCdWlsZCBpbiBwcm9ncmVzcywgc2tpcHBpbmcuLi5cIik7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIFxuICAgICAgICBpc0J1aWxkaW5nID0gdHJ1ZTtcbiAgICAgICAgY29uc3QgdGltZXN0YW1wID0gbmV3IERhdGUoKS50b0xvY2FsZVRpbWVTdHJpbmcoKTtcbiAgICAgICAgXG4gICAgICAgIGNvbnNvbGUubG9nKGBcXG5bJHt0aW1lc3RhbXB9XSBGaWxlIGNoYW5nZWQ6ICR7ZmlsZW5hbWV9YCk7XG4gICAgICAgIGNvbnNvbGUubG9nKFwiUmVidWlsZGluZy4uLlwiKTtcbiAgICAgICAgXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgYXdhaXQgYnVpbGRMaWJyYXJ5KHsgY3dkLCB3YXRjaDogZmFsc2UgfSk7XG4gICAgICAgICAgY29uc29sZS5sb2coXCLinJMgUmVidWlsZCBzdWNjZXNzZnVsXCIpO1xuICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoXG4gICAgICAgICAgICBcIuKclyBSZWJ1aWxkIGZhaWxlZDpcIixcbiAgICAgICAgICAgIGVycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogU3RyaW5nKGVycm9yKVxuICAgICAgICAgICk7XG4gICAgICAgIH0gZmluYWxseSB7XG4gICAgICAgICAgaXNCdWlsZGluZyA9IGZhbHNlO1xuICAgICAgICB9XG4gICAgICB9LCAzMDApO1xuICAgIH07XG5cbiAgICAvLyBXYXRjaCBzcmMgZGlyZWN0b3J5XG4gICAgd2F0Y2hlcnMucHVzaChmc1dhdGNoKHNyY0RpciwgeyByZWN1cnNpdmU6IHRydWUgfSwgKF9ldmVudCwgZmlsZW5hbWUpID0+IHtcbiAgICAgIGhhbmRsZUNoYW5nZShmaWxlbmFtZSk7XG4gICAgfSkpO1xuXG4gICAgLy8gV2F0Y2ggY29uZmlnIGZpbGVcbiAgICB3YXRjaGVycy5wdXNoKGZzV2F0Y2goY29uZmlnRmlsZSwgKF9ldmVudCwgZmlsZW5hbWUpID0+IHtcbiAgICAgIGhhbmRsZUNoYW5nZShmaWxlbmFtZSk7XG4gICAgfSkpO1xuXG4gICAgLy8gQ2xlYW51cCBvbiBleGl0XG4gICAgY29uc3QgY2xlYW51cCA9ICgpID0+IHtcbiAgICAgIGNvbnNvbGUubG9nKFwiXFxuU3RvcHBpbmcgd2F0Y2ggbW9kZS4uLlwiKTtcbiAgICAgIHdhdGNoZXJzLmZvckVhY2godyA9PiB3LmNsb3NlKCkpO1xuICAgICAgaWYgKGRlYm91bmNlVGltZXIpIGNsZWFyVGltZW91dChkZWJvdW5jZVRpbWVyKTtcbiAgICAgIHByb2Nlc3MuZXhpdCgwKTtcbiAgICB9O1xuXG4gICAgcHJvY2Vzcy5vbihcIlNJR0lOVFwiLCBjbGVhbnVwKTtcbiAgICBwcm9jZXNzLm9uKFwiU0lHVEVSTVwiLCBjbGVhbnVwKTtcblxuICAgIC8vIEtlZXAgcHJvY2VzcyBhbGl2ZVxuICAgIGF3YWl0IG5ldyBQcm9taXNlKCgpID0+IHt9KTtcbiAgfVxufVxuIiwKICAgICJpbXBvcnQgeyBleGlzdHNTeW5jIH0gZnJvbSBcIm5vZGU6ZnNcIjtcbmltcG9ydCB7IGpvaW4gfSBmcm9tIFwibm9kZTpwYXRoXCI7XG5pbXBvcnQgdHlwZSB7IFJlc29sdmVkRm90Q29uZmlnIH0gZnJvbSBcIkBmLW8tdC9jb25maWdcIjtcblxuLyoqXG4gKiBDaGVja3MgaWYgYSBmb3QuY29uZmlnLnRzIGZpbGUgZXhpc3RzIGluIHRoZSBnaXZlbiBkaXJlY3RvcnlcbiAqXG4gKiBAcGFyYW0gY3dkIC0gVGhlIGRpcmVjdG9yeSB0byBjaGVja1xuICogQHJldHVybnMgVHJ1ZSBpZiBmb3QuY29uZmlnLnRzIGV4aXN0cywgZmFsc2Ugb3RoZXJ3aXNlXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBoYXNGb3RDb25maWcoY3dkOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgY29uc3QgY29uZmlnUGF0aCA9IGpvaW4oY3dkLCBcImZvdC5jb25maWcudHNcIik7XG4gIHJldHVybiBleGlzdHNTeW5jKGNvbmZpZ1BhdGgpO1xufVxuXG4vKipcbiAqIExvYWRzIGFuZCB2YWxpZGF0ZXMgYSBmb3QuY29uZmlnLnRzIGZpbGUgZnJvbSB0aGUgZ2l2ZW4gZGlyZWN0b3J5XG4gKlxuICogQHBhcmFtIGN3ZCAtIFRoZSBkaXJlY3RvcnkgY29udGFpbmluZyB0aGUgZm90LmNvbmZpZy50cyBmaWxlXG4gKiBAcmV0dXJucyBUaGUgcmVzb2x2ZWQgRk9UIGNvbmZpZ3VyYXRpb25cbiAqIEB0aHJvd3Mge0Vycm9yfSBJZiB0aGUgY29uZmlnIGZpbGUgaXMgbm90IGZvdW5kIG9yIGhhcyBubyBkZWZhdWx0IGV4cG9ydFxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gbG9hZEZvdENvbmZpZyhjd2Q6IHN0cmluZyk6IFByb21pc2U8UmVzb2x2ZWRGb3RDb25maWc+IHtcbiAgY29uc3QgY29uZmlnUGF0aCA9IGpvaW4oY3dkLCBcImZvdC5jb25maWcudHNcIik7XG5cbiAgaWYgKCFleGlzdHNTeW5jKGNvbmZpZ1BhdGgpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgYGZvdC5jb25maWcudHMgbm90IGZvdW5kIGluICR7Y3dkfS4gUGxlYXNlIGNyZWF0ZSBhIGZvdC5jb25maWcudHMgZmlsZS5gXG4gICAgKTtcbiAgfVxuXG4gIHRyeSB7XG4gICAgLy8gRHluYW1pYyBpbXBvcnQgdG8gbG9hZCB0aGUgY29uZmlnIGZpbGVcbiAgICBjb25zdCBjb25maWdNb2R1bGUgPSBhd2FpdCBpbXBvcnQoY29uZmlnUGF0aCk7XG5cbiAgICBpZiAoIWNvbmZpZ01vZHVsZS5kZWZhdWx0KSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGBmb3QuY29uZmlnLnRzIGluICR7Y3dkfSBtdXN0IGhhdmUgYSBkZWZhdWx0IGV4cG9ydC4gVXNlICdleHBvcnQgZGVmYXVsdCBkZWZpbmVGb3RDb25maWcoeyAuLi4gfSknLmBcbiAgICAgICk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGNvbmZpZ01vZHVsZS5kZWZhdWx0IGFzIFJlc29sdmVkRm90Q29uZmlnO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIC8vIElmIGl0J3MgYWxyZWFkeSBvdXIgY3VzdG9tIGVycm9yLCByZS10aHJvdyBpdFxuICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIEVycm9yICYmIGVycm9yLm1lc3NhZ2UuaW5jbHVkZXMoXCJmb3QuY29uZmlnLnRzXCIpKSB7XG4gICAgICB0aHJvdyBlcnJvcjtcbiAgICB9XG5cbiAgICAvLyBPdGhlcndpc2UsIHdyYXAgdGhlIGVycm9yIHdpdGggbW9yZSBjb250ZXh0XG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgYEZhaWxlZCB0byBsb2FkIGZvdC5jb25maWcudHMgZnJvbSAke2N3ZH06ICR7ZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiBTdHJpbmcoZXJyb3IpfWBcbiAgICApO1xuICB9XG59XG4iLAogICAgImltcG9ydCB7IGJ1aWxkTGlicmFyeSwgdHlwZSBCdWlsZE9wdGlvbnMgfSBmcm9tIFwiLi4vYnVpbGRlclwiO1xuXG4vKipcbiAqIEV4ZWN1dGUgdGhlIGJ1aWxkIGNvbW1hbmRcbiAqXG4gKiBAcGFyYW0gb3B0aW9ucyAtIEJ1aWxkIG9wdGlvbnNcbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGJ1aWxkQ29tbWFuZChvcHRpb25zOiBCdWlsZE9wdGlvbnMgPSB7fSk6IFByb21pc2U8dm9pZD4ge1xuICB0cnkge1xuICAgIGF3YWl0IGJ1aWxkTGlicmFyeShvcHRpb25zKTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBjb25zb2xlLmVycm9yKFxuICAgICAgXCJCdWlsZCBmYWlsZWQ6XCIsXG4gICAgICBlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6IFN0cmluZyhlcnJvcilcbiAgICApO1xuICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgfVxufVxuIiwKICAgICJpbXBvcnQgeyBidWlsZExpYnJhcnkgfSBmcm9tIFwiLi4vYnVpbGRlclwiO1xuXG4vKipcbiAqIEV4ZWN1dGUgdGhlIGRldiBjb21tYW5kXG4gKiBSdW5zIHRoZSBidWlsZCBpbiB3YXRjaCBtb2RlIGZvciBkZXZlbG9wbWVudFxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZGV2Q29tbWFuZCgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgdHJ5IHtcbiAgICBjb25zb2xlLmxvZyhcIlN0YXJ0aW5nIGRldmVsb3BtZW50IG1vZGUuLi5cIik7XG4gICAgYXdhaXQgYnVpbGRMaWJyYXJ5KHsgd2F0Y2g6IHRydWUgfSk7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgY29uc29sZS5lcnJvcihcbiAgICAgIFwiRGV2ZWxvcG1lbnQgbW9kZSBmYWlsZWQ6XCIsXG4gICAgICBlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6IFN0cmluZyhlcnJvcilcbiAgICApO1xuICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgfVxufVxuIiwKICAgICJpbXBvcnQgeyBzcGF3biB9IGZyb20gXCJidW5cIjtcblxuLyoqXG4gKiBPcHRpb25zIGZvciB0aGUgdGVzdCBjb21tYW5kXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVGVzdE9wdGlvbnMge1xuICAvKipcbiAgICogV2hldGhlciB0byBnZW5lcmF0ZSBjb3ZlcmFnZSByZXBvcnRzXG4gICAqIEBkZWZhdWx0IGZhbHNlXG4gICAqL1xuICBjb3ZlcmFnZT86IGJvb2xlYW47XG4gIC8qKlxuICAgKiBXaGV0aGVyIHRvIHdhdGNoIGZvciBjaGFuZ2VzIGFuZCByZS1ydW4gdGVzdHNcbiAgICogQGRlZmF1bHQgZmFsc2VcbiAgICovXG4gIHdhdGNoPzogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBFeGVjdXRlIHRoZSB0ZXN0IGNvbW1hbmRcbiAqXG4gKiBAcGFyYW0gb3B0aW9ucyAtIFRlc3Qgb3B0aW9uc1xuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gdGVzdENvbW1hbmQob3B0aW9uczogVGVzdE9wdGlvbnMgPSB7fSk6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCBhcmdzID0gW1widGVzdFwiXTtcblxuICBpZiAob3B0aW9ucy5jb3ZlcmFnZSkge1xuICAgIGFyZ3MucHVzaChcIi0tY292ZXJhZ2VcIik7XG4gIH1cblxuICBpZiAob3B0aW9ucy53YXRjaCkge1xuICAgIGFyZ3MucHVzaChcIi0td2F0Y2hcIik7XG4gIH1cblxuICBjb25zb2xlLmxvZyhgUnVubmluZzogYnVuICR7YXJncy5qb2luKFwiIFwiKX1gKTtcblxuICBjb25zdCBwcm9jID0gc3Bhd24oe1xuICAgIGNtZDogW1wiYnVuXCIsIC4uLmFyZ3NdLFxuICAgIHN0ZGlvOiBbXCJpbmhlcml0XCIsIFwiaW5oZXJpdFwiLCBcImluaGVyaXRcIl0sXG4gIH0pO1xuXG4gIGNvbnN0IGV4aXRDb2RlID0gYXdhaXQgcHJvYy5leGl0ZWQ7XG4gIHByb2Nlc3MuZXhpdChleGl0Q29kZSk7XG59XG4iLAogICAgImltcG9ydCB7IHNwYXduIH0gZnJvbSBcImJ1blwiO1xuXG4vKipcbiAqIEV4ZWN1dGUgdGhlIGNoZWNrIGNvbW1hbmRcbiAqIFJ1bnMgQmlvbWUgdG8gY2hlY2sgYW5kIGZpeCBjb2RlIHN0eWxlIGlzc3Vlc1xuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gY2hlY2tDb21tYW5kKCk6IFByb21pc2U8dm9pZD4ge1xuICBjb25zb2xlLmxvZyhcIlJ1bm5pbmcgQmlvbWUgY2hlY2sgd2l0aCBhdXRvLWZpeC4uLlwiKTtcblxuICBjb25zdCBwcm9jID0gc3Bhd24oe1xuICAgIGNtZDogW1wiYnVueFwiLCBcImJpb21lXCIsIFwiY2hlY2tcIiwgXCItLXdyaXRlXCIsIFwiLlwiXSxcbiAgICBzdGRpbzogW1wiaW5oZXJpdFwiLCBcImluaGVyaXRcIiwgXCJpbmhlcml0XCJdLFxuICB9KTtcblxuICBjb25zdCBleGl0Q29kZSA9IGF3YWl0IHByb2MuZXhpdGVkO1xuXG4gIGlmIChleGl0Q29kZSA9PT0gMCkge1xuICAgIGNvbnNvbGUubG9nKFwi4pyTIENoZWNrIGNvbXBsZXRlZCBzdWNjZXNzZnVsbHlcIik7XG4gIH0gZWxzZSB7XG4gICAgY29uc29sZS5lcnJvcihcIkNoZWNrIGZhaWxlZFwiKTtcbiAgfVxuXG4gIHByb2Nlc3MuZXhpdChleGl0Q29kZSk7XG59XG4iLAogICAgImltcG9ydCB7IHNwYXduIH0gZnJvbSBcImJ1blwiO1xuXG4vKipcbiAqIEV4ZWN1dGUgdGhlIHR5cGVjaGVjayBjb21tYW5kXG4gKiBSdW5zIFR5cGVTY3JpcHQgY29tcGlsZXIgdG8gY2hlY2sgZm9yIHR5cGUgZXJyb3JzXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiB0eXBlY2hlY2tDb21tYW5kKCk6IFByb21pc2U8dm9pZD4ge1xuICBjb25zb2xlLmxvZyhcIlJ1bm5pbmcgVHlwZVNjcmlwdCB0eXBlIGNoZWNraW5nLi4uXCIpO1xuXG4gIGNvbnN0IHByb2MgPSBzcGF3bih7XG4gICAgY21kOiBbXCJidW54XCIsIFwidHNjXCIsIFwiLS1ub0VtaXRcIl0sXG4gICAgc3RkaW86IFtcImluaGVyaXRcIiwgXCJpbmhlcml0XCIsIFwiaW5oZXJpdFwiXSxcbiAgfSk7XG5cbiAgY29uc3QgZXhpdENvZGUgPSBhd2FpdCBwcm9jLmV4aXRlZDtcblxuICBpZiAoZXhpdENvZGUgPT09IDApIHtcbiAgICBjb25zb2xlLmxvZyhcIuKckyBUeXBlIGNoZWNraW5nIGNvbXBsZXRlZCBzdWNjZXNzZnVsbHlcIik7XG4gIH0gZWxzZSB7XG4gICAgY29uc29sZS5lcnJvcihcIlR5cGUgY2hlY2tpbmcgZmFpbGVkXCIpO1xuICB9XG5cbiAgcHJvY2Vzcy5leGl0KGV4aXRDb2RlKTtcbn1cbiIsCiAgICAiaW1wb3J0IHsgd3JpdGVGaWxlU3luYyB9IGZyb20gXCJub2RlOmZzXCI7XG5pbXBvcnQgeyBqb2luIH0gZnJvbSBcIm5vZGU6cGF0aFwiO1xuaW1wb3J0IHtcbiAgZ2VuZXJhdGVQYWNrYWdlSnNvbixcbiAgZ2VuZXJhdGVUU0NvbmZpZyxcbiAgZ2VuZXJhdGVCaW9tZUNvbmZpZyxcbn0gZnJvbSBcIkBmLW8tdC9jb25maWdcIjtcbmltcG9ydCB7IGxvYWRGb3RDb25maWcgfSBmcm9tIFwiLi4vY29uZmlnLWxvYWRlclwiO1xuXG4vKipcbiAqIEdlbmVyYXRlIGNvbmZpZ3VyYXRpb24gZmlsZXMgKHBhY2thZ2UuanNvbiwgdHNjb25maWcuanNvbiwgYmlvbWUuanNvbikgZnJvbSBmb3QuY29uZmlnLnRzXG4gKlxuICogQHBhcmFtIGN3ZCAtIFRoZSBkaXJlY3RvcnkgY29udGFpbmluZyB0aGUgZm90LmNvbmZpZy50cyBmaWxlXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZW5lcmF0ZUNvbmZpZ0ZpbGVzKGN3ZDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnNvbGUubG9nKFwiTG9hZGluZyBmb3QuY29uZmlnLnRzLi4uXCIpO1xuICBjb25zdCBjb25maWcgPSBhd2FpdCBsb2FkRm90Q29uZmlnKGN3ZCk7XG5cbiAgY29uc29sZS5sb2coXCJHZW5lcmF0aW5nIHBhY2thZ2UuanNvbi4uLlwiKTtcbiAgLy8gRXh0cmFjdCBsaWJyYXJ5IG5hbWUgZnJvbSBkaXJlY3RvcnkgbmFtZSBvciB1c2UgYSBkZWZhdWx0XG4gIGNvbnN0IGxpYnJhcnlOYW1lID0gY3dkLnNwbGl0KFwiL1wiKS5wb3AoKSB8fCBcImxpYnJhcnlcIjtcbiAgY29uc3QgcGFja2FnZUpzb24gPSBnZW5lcmF0ZVBhY2thZ2VKc29uKGxpYnJhcnlOYW1lLCBcIjAuMS4wXCIsIGNvbmZpZyk7XG4gIGNvbnN0IHBhY2thZ2VKc29uUGF0aCA9IGpvaW4oY3dkLCBcInBhY2thZ2UuanNvblwiKTtcbiAgd3JpdGVGaWxlU3luYyhwYWNrYWdlSnNvblBhdGgsIEpTT04uc3RyaW5naWZ5KHBhY2thZ2VKc29uLCBudWxsLCAyKSArIFwiXFxuXCIpO1xuICBjb25zb2xlLmxvZyhg4pyTIEdlbmVyYXRlZCAke3BhY2thZ2VKc29uUGF0aH1gKTtcblxuICBjb25zb2xlLmxvZyhcIkdlbmVyYXRpbmcgdHNjb25maWcuanNvbi4uLlwiKTtcbiAgY29uc3QgdHNjb25maWcgPSBnZW5lcmF0ZVRTQ29uZmlnKGNvbmZpZyk7XG4gIGNvbnN0IHRzY29uZmlnUGF0aCA9IGpvaW4oY3dkLCBcInRzY29uZmlnLmpzb25cIik7XG4gIHdyaXRlRmlsZVN5bmModHNjb25maWdQYXRoLCBKU09OLnN0cmluZ2lmeSh0c2NvbmZpZywgbnVsbCwgMikgKyBcIlxcblwiKTtcbiAgY29uc29sZS5sb2coYOKckyBHZW5lcmF0ZWQgJHt0c2NvbmZpZ1BhdGh9YCk7XG5cbiAgY29uc29sZS5sb2coXCJHZW5lcmF0aW5nIGJpb21lLmpzb24uLi5cIik7XG4gIGNvbnN0IGJpb21lQ29uZmlnID0gZ2VuZXJhdGVCaW9tZUNvbmZpZyhjb25maWcpO1xuICBjb25zdCBiaW9tZUNvbmZpZ1BhdGggPSBqb2luKGN3ZCwgXCJiaW9tZS5qc29uXCIpO1xuICB3cml0ZUZpbGVTeW5jKGJpb21lQ29uZmlnUGF0aCwgSlNPTi5zdHJpbmdpZnkoYmlvbWVDb25maWcsIG51bGwsIDIpICsgXCJcXG5cIik7XG4gIGNvbnNvbGUubG9nKGDinJMgR2VuZXJhdGVkICR7YmlvbWVDb25maWdQYXRofWApO1xuXG4gIGNvbnNvbGUubG9nKFwiQWxsIGNvbmZpZ3VyYXRpb24gZmlsZXMgZ2VuZXJhdGVkIHN1Y2Nlc3NmdWxseSFcIik7XG59XG4iLAogICAgImltcG9ydCB7IGV4aXN0c1N5bmMsIG1rZGlyU3luYywgd3JpdGVGaWxlU3luYyB9IGZyb20gXCJub2RlOmZzXCI7XG5pbXBvcnQgeyBqb2luIH0gZnJvbSBcIm5vZGU6cGF0aFwiO1xuaW1wb3J0IHsgc3Bhd24gfSBmcm9tIFwiYnVuXCI7XG5pbXBvcnQgeyBnZXRMaWJyYXJ5VGVtcGxhdGUgfSBmcm9tIFwiLi4vdGVtcGxhdGVzL2xpYnJhcnlcIjtcbmltcG9ydCB7IGdlbmVyYXRlQ29uZmlnRmlsZXMgfSBmcm9tIFwiLi9nZW5lcmF0ZVwiO1xuXG4vKipcbiAqIE9wdGlvbnMgZm9yIGNyZWF0aW5nIGEgbmV3IGxpYnJhcnlcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDcmVhdGVPcHRpb25zIHtcbiAgLyoqXG4gICAqIE5hbWUgb2YgdGhlIGxpYnJhcnkgKGUuZy4sIFwibXktbGlicmFyeVwiKVxuICAgKi9cbiAgbmFtZTogc3RyaW5nO1xuICAvKipcbiAgICogQnJpZWYgZGVzY3JpcHRpb24gb2YgdGhlIGxpYnJhcnlcbiAgICovXG4gIGRlc2NyaXB0aW9uOiBzdHJpbmc7XG4gIC8qKlxuICAgKiBXb3JraW5nIGRpcmVjdG9yeSAoZGVmYXVsdHMgdG8gcHJvY2Vzcy5jd2QoKSlcbiAgICovXG4gIGN3ZD86IHN0cmluZztcbn1cblxuLyoqXG4gKiBDcmVhdGUgYSBuZXcgbGlicmFyeSB3aXRoIHNjYWZmb2xkZWQgZmlsZXNcbiAqXG4gKiBAcGFyYW0gb3B0aW9ucyAtIENyZWF0ZSBvcHRpb25zXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBjcmVhdGVDb21tYW5kKG9wdGlvbnM6IENyZWF0ZU9wdGlvbnMpOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgeyBuYW1lLCBkZXNjcmlwdGlvbiwgY3dkID0gcHJvY2Vzcy5jd2QoKSB9ID0gb3B0aW9ucztcblxuICBjb25zb2xlLmxvZyhgQ3JlYXRpbmcgbGlicmFyeTogQGYtby10LyR7bmFtZX1gKTtcbiAgY29uc29sZS5sb2coYERlc2NyaXB0aW9uOiAke2Rlc2NyaXB0aW9ufWApO1xuXG4gIC8vIERldGVybWluZSBsaWJyYXJ5IHBhdGhcbiAgY29uc3QgbGlicmFyeVBhdGggPSBqb2luKGN3ZCwgXCJsaWJyYXJpZXNcIiwgbmFtZSk7XG5cbiAgLy8gQ2hlY2sgaWYgbGlicmFyeSBhbHJlYWR5IGV4aXN0c1xuICBpZiAoZXhpc3RzU3luYyhsaWJyYXJ5UGF0aCkpIHtcbiAgICBjb25zb2xlLmVycm9yKGBFcnJvcjogTGlicmFyeSBhbHJlYWR5IGV4aXN0cyBhdCAke2xpYnJhcnlQYXRofWApO1xuICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgfVxuXG4gIC8vIENyZWF0ZSBkaXJlY3Rvcnkgc3RydWN0dXJlXG4gIGNvbnNvbGUubG9nKFwiXFxuQ3JlYXRpbmcgZGlyZWN0b3J5IHN0cnVjdHVyZS4uLlwiKTtcbiAgY29uc3Qgc3JjUGF0aCA9IGpvaW4obGlicmFyeVBhdGgsIFwic3JjXCIpO1xuICBta2RpclN5bmMoc3JjUGF0aCwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG4gIGNvbnNvbGUubG9nKGDinJMgQ3JlYXRlZCAke3NyY1BhdGh9YCk7XG5cbiAgLy8gR2V0IHRlbXBsYXRlc1xuICBjb25zb2xlLmxvZyhcIlxcbkdlbmVyYXRpbmcgdGVtcGxhdGUgZmlsZXMuLi5cIik7XG4gIGNvbnN0IHRlbXBsYXRlcyA9IGdldExpYnJhcnlUZW1wbGF0ZShuYW1lLCBkZXNjcmlwdGlvbik7XG5cbiAgLy8gV3JpdGUgZm90LmNvbmZpZy50c1xuICBjb25zdCBmb3RDb25maWdQYXRoID0gam9pbihsaWJyYXJ5UGF0aCwgXCJmb3QuY29uZmlnLnRzXCIpO1xuICB3cml0ZUZpbGVTeW5jKGZvdENvbmZpZ1BhdGgsIHRlbXBsYXRlcy5mb3RDb25maWcpO1xuICBjb25zb2xlLmxvZyhg4pyTIENyZWF0ZWQgJHtmb3RDb25maWdQYXRofWApO1xuXG4gIC8vIFdyaXRlIHNyYy9pbmRleC50c1xuICBjb25zdCBpbmRleFRzUGF0aCA9IGpvaW4oc3JjUGF0aCwgXCJpbmRleC50c1wiKTtcbiAgd3JpdGVGaWxlU3luYyhpbmRleFRzUGF0aCwgdGVtcGxhdGVzLmluZGV4VHMpO1xuICBjb25zb2xlLmxvZyhg4pyTIENyZWF0ZWQgJHtpbmRleFRzUGF0aH1gKTtcblxuICAvLyBXcml0ZSBzcmMvaW5kZXgudGVzdC50c1xuICBjb25zdCBpbmRleFRlc3RUc1BhdGggPSBqb2luKHNyY1BhdGgsIFwiaW5kZXgudGVzdC50c1wiKTtcbiAgd3JpdGVGaWxlU3luYyhpbmRleFRlc3RUc1BhdGgsIHRlbXBsYXRlcy5pbmRleFRlc3RUcyk7XG4gIGNvbnNvbGUubG9nKGDinJMgQ3JlYXRlZCAke2luZGV4VGVzdFRzUGF0aH1gKTtcblxuICAvLyBXcml0ZSBSRUFETUUubWRcbiAgY29uc3QgcmVhZG1lUGF0aCA9IGpvaW4obGlicmFyeVBhdGgsIFwiUkVBRE1FLm1kXCIpO1xuICB3cml0ZUZpbGVTeW5jKHJlYWRtZVBhdGgsIHRlbXBsYXRlcy5yZWFkbWUpO1xuICBjb25zb2xlLmxvZyhg4pyTIENyZWF0ZWQgJHtyZWFkbWVQYXRofWApO1xuXG4gIC8vIEdlbmVyYXRlIGNvbmZpZ3VyYXRpb24gZmlsZXNcbiAgY29uc29sZS5sb2coXCJcXG5HZW5lcmF0aW5nIGNvbmZpZ3VyYXRpb24gZmlsZXMuLi5cIik7XG4gIGF3YWl0IGdlbmVyYXRlQ29uZmlnRmlsZXMobGlicmFyeVBhdGgpO1xuXG4gIC8vIFJ1biBidW4gaW5zdGFsbFxuICBjb25zb2xlLmxvZyhcIlxcbkluc3RhbGxpbmcgZGVwZW5kZW5jaWVzLi4uXCIpO1xuICBjb25zdCBpbnN0YWxsUHJvYyA9IHNwYXduKHtcbiAgICBjbWQ6IFtcImJ1blwiLCBcImluc3RhbGxcIl0sXG4gICAgY3dkOiBsaWJyYXJ5UGF0aCxcbiAgICBzdGRpbzogW1wiaW5oZXJpdFwiLCBcImluaGVyaXRcIiwgXCJpbmhlcml0XCJdLFxuICB9KTtcblxuICBjb25zdCBleGl0Q29kZSA9IGF3YWl0IGluc3RhbGxQcm9jLmV4aXRlZDtcblxuICBpZiAoZXhpdENvZGUgIT09IDApIHtcbiAgICBjb25zb2xlLmVycm9yKFwiRmFpbGVkIHRvIGluc3RhbGwgZGVwZW5kZW5jaWVzXCIpO1xuICAgIHByb2Nlc3MuZXhpdChleGl0Q29kZSk7XG4gIH1cblxuICBjb25zb2xlLmxvZyhcIuKckyBEZXBlbmRlbmNpZXMgaW5zdGFsbGVkXCIpO1xuXG4gIC8vIFNob3cgbmV4dCBzdGVwc1xuICBjb25zb2xlLmxvZyhcIlxcblwiICsgXCI9XCIucmVwZWF0KDYwKSk7XG4gIGNvbnNvbGUubG9nKFwi4pyTIExpYnJhcnkgY3JlYXRlZCBzdWNjZXNzZnVsbHkhXCIpO1xuICBjb25zb2xlLmxvZyhcIj1cIi5yZXBlYXQoNjApKTtcbiAgY29uc29sZS5sb2coXCJcXG5OZXh0IHN0ZXBzOlwiKTtcbiAgY29uc29sZS5sb2coYCAgMS4gY2QgbGlicmFyaWVzLyR7bmFtZX1gKTtcbiAgY29uc29sZS5sb2coXCIgIDIuIEVkaXQgc3JjL2luZGV4LnRzIHRvIGltcGxlbWVudCB5b3VyIGxpYnJhcnlcIik7XG4gIGNvbnNvbGUubG9nKFwiICAzLiBBZGQgdGVzdHMgaW4gc3JjL2luZGV4LnRlc3QudHNcIik7XG4gIGNvbnNvbGUubG9nKFwiICA0LiBSdW4gJ2J1biB0ZXN0JyB0byB2ZXJpZnkgdGVzdHMgcGFzc1wiKTtcbiAgY29uc29sZS5sb2coXCIgIDUuIFJ1biAnYnVuIHJ1biBidWlsZCcgdG8gYnVpbGQgdGhlIGxpYnJhcnlcIik7XG4gIGNvbnNvbGUubG9nKFwiXFxuSGFwcHkgY29kaW5nISDwn5qAXCIpO1xufVxuIiwKICAgICIvKipcbiAqIFRlbXBsYXRlcyBmb3Igc2NhZmZvbGRpbmcgbmV3IGxpYnJhcmllc1xuICovXG5cbmV4cG9ydCBpbnRlcmZhY2UgTGlicmFyeVRlbXBsYXRlcyB7XG4gIGZvdENvbmZpZzogc3RyaW5nO1xuICBpbmRleFRzOiBzdHJpbmc7XG4gIGluZGV4VGVzdFRzOiBzdHJpbmc7XG4gIHJlYWRtZTogc3RyaW5nO1xufVxuXG4vKipcbiAqIEdldCB0ZW1wbGF0ZXMgZm9yIGEgbmV3IGxpYnJhcnlcbiAqXG4gKiBAcGFyYW0gbmFtZSAtIExpYnJhcnkgbmFtZSAoZS5nLiwgXCJteS1saWJyYXJ5XCIpXG4gKiBAcGFyYW0gZGVzY3JpcHRpb24gLSBCcmllZiBkZXNjcmlwdGlvbiBvZiB0aGUgbGlicmFyeVxuICogQHJldHVybnMgT2JqZWN0IGNvbnRhaW5pbmcgYWxsIHRlbXBsYXRlIGZpbGVzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRMaWJyYXJ5VGVtcGxhdGUoXG4gIG5hbWU6IHN0cmluZyxcbiAgZGVzY3JpcHRpb246IHN0cmluZ1xuKTogTGlicmFyeVRlbXBsYXRlcyB7XG4gIGNvbnN0IHBhY2thZ2VOYW1lID0gYEBmLW8tdC8ke25hbWV9YDtcblxuICBjb25zdCBmb3RDb25maWcgPSBgaW1wb3J0IHsgZGVmaW5lRm90Q29uZmlnIH0gZnJvbSBcIkBmLW8tdC9jb25maWdcIjtcblxuZXhwb3J0IGRlZmF1bHQgZGVmaW5lRm90Q29uZmlnKHtcbiAgZm9ybWF0czogW1wiZXNtXCIsIFwiY2pzXCJdLFxuICBleHRlcm5hbDogW10sXG4gIHR5cGVzY3JpcHQ6IHtcbiAgICBkZWNsYXJhdGlvbjogdHJ1ZSxcbiAgfSxcbn0pO1xuYDtcblxuICBjb25zdCBpbmRleFRzID0gYC8qKlxuICogJHtwYWNrYWdlTmFtZX1cbiAqICR7ZGVzY3JpcHRpb259XG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIGhlbGxvKCk6IHN0cmluZyB7XG4gIHJldHVybiBcIkhlbGxvIGZyb20gJHtwYWNrYWdlTmFtZX0hXCI7XG59XG5gO1xuXG4gIGNvbnN0IGluZGV4VGVzdFRzID0gYGltcG9ydCB7IGRlc2NyaWJlLCBleHBlY3QsIHRlc3QgYXMgaXQgfSBmcm9tIFwiYnVuOnRlc3RcIjtcbmltcG9ydCB7IGhlbGxvIH0gZnJvbSBcIi4vaW5kZXhcIjtcblxuZGVzY3JpYmUoXCIke3BhY2thZ2VOYW1lfVwiLCAoKSA9PiB7XG4gIGl0KFwic2hvdWxkIGV4cG9ydCBoZWxsbyBmdW5jdGlvblwiLCAoKSA9PiB7XG4gICAgZXhwZWN0KGhlbGxvKCkpLnRvQmUoXCJIZWxsbyBmcm9tICR7cGFja2FnZU5hbWV9IVwiKTtcbiAgfSk7XG59KTtcbmA7XG5cbiAgY29uc3QgcmVhZG1lID0gYCMgJHtwYWNrYWdlTmFtZX1cblxuJHtkZXNjcmlwdGlvbn1cblxuIyMgSW5zdGFsbGF0aW9uXG5cblxcYFxcYFxcYGJhc2hcbiMgYnVuXG5idW4gYWRkICR7cGFja2FnZU5hbWV9XG5cbiMgbnBtXG5ucG0gaW5zdGFsbCAke3BhY2thZ2VOYW1lfVxuXG4jIHlhcm5cbnlhcm4gYWRkICR7cGFja2FnZU5hbWV9XG5cbiMgcG5wbVxucG5wbSBhZGQgJHtwYWNrYWdlTmFtZX1cblxcYFxcYFxcYFxuXG4jIyBRdWljayBTdGFydFxuXG5cXGBcXGBcXGB0eXBlc2NyaXB0XG5pbXBvcnQgeyBoZWxsbyB9IGZyb20gXCIke3BhY2thZ2VOYW1lfVwiO1xuXG5jb25zb2xlLmxvZyhoZWxsbygpKTtcblxcYFxcYFxcYFxuXG4jIyBBUEkgUmVmZXJlbmNlXG5cbiMjIyBcXGBoZWxsbygpXFxgXG5cblJldHVybnMgYSBncmVldGluZyBzdHJpbmcuXG5cblxcYFxcYFxcYHR5cGVzY3JpcHRcbmNvbnN0IGdyZWV0aW5nID0gaGVsbG8oKTtcbmNvbnNvbGUubG9nKGdyZWV0aW5nKTsgLy8gXCJIZWxsbyBmcm9tICR7cGFja2FnZU5hbWV9IVwiXG5cXGBcXGBcXGBcblxuIyMgQ29udHJpYnV0aW5nXG5cbkNvbnRyaWJ1dGlvbnMgYXJlIHdlbGNvbWUhIFBsZWFzZSBjaGVjayB0aGUgcmVwb3NpdG9yeSBmb3IgZ3VpZGVsaW5lcy5cblxuIyMgTGljZW5zZVxuXG5NSVQgTGljZW5zZSAtIHNlZSBbTElDRU5TRV0oLi9MSUNFTlNFKSBmaWxlIGZvciBkZXRhaWxzLlxuXG4jIyBMaW5rc1xuXG4tIFtHaXRIdWIgUmVwb3NpdG9yeV0oaHR0cHM6Ly9naXRodWIuY29tL0YtTy1UL2xpYnJhcmllcylcbi0gW0lzc3VlIFRyYWNrZXJdKGh0dHBzOi8vZ2l0aHViLmNvbS9GLU8tVC9saWJyYXJpZXMvaXNzdWVzKVxuYDtcblxuICByZXR1cm4ge1xuICAgIGZvdENvbmZpZyxcbiAgICBpbmRleFRzLFxuICAgIGluZGV4VGVzdFRzLFxuICAgIHJlYWRtZSxcbiAgfTtcbn1cbiIKICBdLAogICJtYXBwaW5ncyI6ICI7Ozs7O0FBRUE7QUFDQTtBQUNBLGlCQUFTO0FBQ1Q7OztBQ0xBLGlCQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBRUE7OztBQ0xBO0FBQ0E7QUFTTyxTQUFT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QztBQUFBLEVBQ2pELFFBQVEsSUFBSSwwQ0FBMEM7QUFBQSxFQUN0RCxRQUFRLElBQUksK0NBQStDO0FBQUEsRUFDM0QsUUFBUSxJQUFJO0FBQUEsMkJBQW1CO0FBQUE7O0FUaEZqQyxJQUFNLGFBQVksUUFBUSxjQUFjLFlBQVksR0FBRyxDQUFDO0FBQ3hELElBQU0sTUFBTSxLQUFLLE1BQU0sYUFBYSxNQUFLLFlBQVcsTUFBTSxjQUFjLEdBQUcsT0FBTyxDQUFDO0FBRW5GLElBQU0sVUFBVSxJQUFJO0FBRXBCLFFBQ0csS0FBSyxLQUFLLEVBQ1YsWUFBWSx3Q0FBd0MsRUFDcEQsUUFBUSxJQUFJLE9BQU87QUFFdEIsUUFDRyxRQUFRLE9BQU8sRUFDZixZQUFZLDJCQUEyQixFQUN2QyxPQUFPLFlBQVk7QUFBQSxFQUNsQixNQUFNLGFBQWE7QUFBQSxDQUNwQjtBQUVILFFBQ0csUUFBUSxLQUFLLEVBQ2IsWUFBWSwyQ0FBMkMsRUFDdkQsT0FBTyxZQUFZO0FBQUEsRUFDbEIsTUFBTSxXQUFXO0FBQUEsQ0FDbEI7QUFFSCxRQUNHLFFBQVEsTUFBTSxFQUNkLFlBQVksV0FBVyxFQUN2QixPQUFPLFdBQVcseUJBQXlCLEVBQzNDLE9BQU8sY0FBYyx5QkFBeUIsRUFDOUMsT0FBTyxPQUFPLFlBQXlCO0FBQUEsRUFDdEMsTUFBTSxZQUFZLE9BQU87QUFBQSxDQUMxQjtBQUVILFFBQ0csUUFBUSxPQUFPLEVBQ2YsWUFBWSxpQ0FBaUMsRUFDN0MsT0FBTyxZQUFZO0FBQUEsRUFDbEIsTUFBTSxhQUFhO0FBQUEsQ0FDcEI7QUFFSCxRQUNHLFFBQVEsV0FBVyxFQUNuQixZQUFZLDhCQUE4QixFQUMxQyxPQUFPLFlBQVk7QUFBQSxFQUNsQixNQUFNLGlCQUFpQjtBQUFBLENBQ3hCO0FBRUgsUUFDRyxRQUFRLFVBQVUsRUFDbEIsWUFBWSwwQ0FBMEMsRUFDdEQsT0FBTyxZQUFZO0FBQUEsRUFDbEIsTUFBTSxvQkFBb0IsUUFBUSxJQUFJLENBQUM7QUFBQSxDQUN4QztBQUVILFFBQ0csUUFBUSxlQUFlLEVBQ3ZCLFlBQVksd0JBQXdCLEVBQ3BDLFNBQVMsaUJBQWlCLCtCQUErQixtQkFBbUIsRUFDNUUsT0FBTyxPQUFPLE1BQWMsZ0JBQXdCO0FBQUEsRUFDbkQsTUFBTSxVQUF5QixFQUFFLE1BQU0sWUFBWTtBQUFBLEVBQ25ELE1BQU0sY0FBYyxPQUFPO0FBQUEsQ0FDNUI7QUFFSCxRQUFRLE1BQU07IiwKICAiZGVidWdJZCI6ICI5RUJGRjU3OEY2N0VGMTU5NjQ3NTZFMjE2NDc1NkUyMSIsCiAgIm5hbWVzIjogW10KfQ==
package/package.json CHANGED
@@ -1,31 +1,33 @@
1
1
  {
2
- "name": "@f-o-t/cli",
3
- "version": "0.1.0",
4
- "description": "CLI tool for managing FOT libraries",
5
- "type": "module",
6
- "bin": {
7
- "fot": "./dist/index.js"
8
- },
9
- "main": "./dist/index.js",
10
- "types": "./dist/index.d.ts",
11
- "files": [
12
- "dist"
13
- ],
14
- "scripts": {
15
- "build": "bunup",
16
- "dev": "bunup --watch",
17
- "test": "bun test"
18
- },
19
- "dependencies": {
20
- "@f-o-t/config": "workspace:*",
21
- "commander": "^12.1.0"
22
- },
23
- "devDependencies": {
24
- "@types/bun": "latest",
25
- "bunup": "^0.16.20",
26
- "typescript": "^5.7.3"
27
- },
28
- "peerDependencies": {
29
- "typescript": ">=5.0.0"
30
- }
2
+ "name": "@f-o-t/cli",
3
+ "version": "1.0.1",
4
+ "description": "CLI tool for managing FOT libraries",
5
+ "type": "module",
6
+ "bin": {
7
+ "fot": "./dist/index.js"
8
+ },
9
+ "main": "./dist/index.js",
10
+ "types": "./dist/index.d.ts",
11
+ "files": [
12
+ "dist"
13
+ ],
14
+ "scripts": {
15
+ "build": "bunup",
16
+ "postbuild": "chmod +x dist/index.js",
17
+ "dev": "bunup --watch",
18
+ "test": "bun test",
19
+ "typecheck": "tsc --noEmit"
20
+ },
21
+ "dependencies": {
22
+ "@f-o-t/config": "^1.0.0",
23
+ "commander": "^12.1.0"
24
+ },
25
+ "devDependencies": {
26
+ "@types/bun": "latest",
27
+ "bunup": "^0.16.20",
28
+ "typescript": "^5.7.3"
29
+ },
30
+ "peerDependencies": {
31
+ "typescript": ">=5.0.0"
32
+ }
31
33
  }