@f-o-t/cli 0.1.0 → 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +8 -7
- package/dist/index.js +111 -108
- package/package.json +5 -3
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** -
|
|
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
|
-
|
|
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
|
-
-
|
|
113
|
-
-
|
|
114
|
-
-
|
|
115
|
-
-
|
|
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
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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 =
|
|
250
|
+
const tsconfig = generateTSConfig2(config);
|
|
183
251
|
const tsconfigPath = join3(cwd, "tsconfig.json");
|
|
184
|
-
|
|
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
|
-
|
|
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
|
|
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
|
-
|
|
378
|
+
writeFileSync3(fotConfigPath, templates.fotConfig);
|
|
311
379
|
console.log(`\u2713 Created ${fotConfigPath}`);
|
|
312
380
|
const indexTsPath = join4(srcPath, "index.ts");
|
|
313
|
-
|
|
381
|
+
writeFileSync3(indexTsPath, templates.indexTs);
|
|
314
382
|
console.log(`\u2713 Created ${indexTsPath}`);
|
|
315
383
|
const indexTestTsPath = join4(srcPath, "index.test.ts");
|
|
316
|
-
|
|
384
|
+
writeFileSync3(indexTestTsPath, templates.indexTestTs);
|
|
317
385
|
console.log(`\u2713 Created ${indexTestTsPath}`);
|
|
318
386
|
const readmePath = join4(libraryPath, "README.md");
|
|
319
|
-
|
|
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
|
-
|
|
353
|
-
|
|
354
|
-
|
|
355
|
-
|
|
356
|
-
|
|
357
|
-
|
|
358
|
-
|
|
359
|
-
|
|
360
|
-
|
|
361
|
-
|
|
362
|
-
|
|
363
|
-
|
|
364
|
-
|
|
365
|
-
|
|
366
|
-
|
|
367
|
-
|
|
368
|
-
|
|
369
|
-
|
|
370
|
-
|
|
371
|
-
|
|
372
|
-
|
|
373
|
-
|
|
374
|
-
|
|
375
|
-
|
|
376
|
-
|
|
377
|
-
|
|
378
|
-
|
|
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=
|
|
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,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@f-o-t/cli",
|
|
3
|
-
"version": "
|
|
3
|
+
"version": "1.0.0",
|
|
4
4
|
"description": "CLI tool for managing FOT libraries",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"bin": {
|
|
@@ -13,11 +13,13 @@
|
|
|
13
13
|
],
|
|
14
14
|
"scripts": {
|
|
15
15
|
"build": "bunup",
|
|
16
|
+
"postbuild": "chmod +x dist/index.js",
|
|
16
17
|
"dev": "bunup --watch",
|
|
17
|
-
"test": "bun test"
|
|
18
|
+
"test": "bun test",
|
|
19
|
+
"typecheck": "tsc --noEmit"
|
|
18
20
|
},
|
|
19
21
|
"dependencies": {
|
|
20
|
-
"@f-o-t/config": "
|
|
22
|
+
"@f-o-t/config": "^1.0.0",
|
|
21
23
|
"commander": "^12.1.0"
|
|
22
24
|
},
|
|
23
25
|
"devDependencies": {
|