@tscircuit/cli 0.1.1 → 0.1.3
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 -5
- package/cli/clone/register.ts +99 -0
- package/cli/main.ts +2 -0
- package/dist/main.js +113 -4
- package/lib/server/createServer.ts +8 -3
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
#
|
|
1
|
+
# tscircuit command line interface (CLI)
|
|
2
2
|
|
|
3
|
-
A CLI for developing, managing and publishing
|
|
3
|
+
A CLI for developing, managing and publishing tscircuit code (the "npm for tscircuit")
|
|
4
4
|
|
|
5
5
|
## Usage
|
|
6
6
|
|
|
@@ -8,7 +8,10 @@ A CLI for developing, managing and publishing snippets on [tscircuit.com](https:
|
|
|
8
8
|
# Start a local server that watches for changes in
|
|
9
9
|
# this file or it's dependencies and updates the
|
|
10
10
|
# browser preview
|
|
11
|
-
|
|
11
|
+
tsci dev ./path/to/file.tsx
|
|
12
|
+
|
|
13
|
+
# Clone a snippet from the registry
|
|
14
|
+
tsci clone author/snippetName
|
|
12
15
|
```
|
|
13
16
|
|
|
14
17
|
> Note: The snippets CLI uses the same configuration files as the [@tscircuit/cli](https://github.com/tscircuit/cli), so you may need to also install `npm install -g @tscircuit/cli` and run `tsci login` to authenticate!
|
|
@@ -16,7 +19,7 @@ snippets dev ./path/to/file.tsx
|
|
|
16
19
|
## Installation
|
|
17
20
|
|
|
18
21
|
```bash
|
|
19
|
-
npm install -g @tscircuit/
|
|
22
|
+
npm install -g @tscircuit/cli
|
|
20
23
|
```
|
|
21
24
|
|
|
22
25
|
## Development
|
|
@@ -47,5 +50,5 @@ runframe each time you'd like to load a new version of runframe.
|
|
|
47
50
|
```bash
|
|
48
51
|
export RUNFRAME_STANDALONE_FILE_PATH=../runframe/dist/standalone.min.js
|
|
49
52
|
cd ../runframe && bun run build
|
|
50
|
-
cd ../
|
|
53
|
+
cd ../cli && bun run dev
|
|
51
54
|
```
|
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
import type { Command } from "commander"
|
|
2
|
+
import { getKy } from "lib/registry-api/get-ky"
|
|
3
|
+
import * as fs from "node:fs"
|
|
4
|
+
import * as path from "node:path"
|
|
5
|
+
|
|
6
|
+
export const registerClone = (program: Command) => {
|
|
7
|
+
program
|
|
8
|
+
.command("clone")
|
|
9
|
+
.description("Clone a snippet from the registry")
|
|
10
|
+
.argument("<snippet>", "Snippet to clone (e.g. author/snippetName)")
|
|
11
|
+
.action(async (snippetPath: string) => {
|
|
12
|
+
let author: string
|
|
13
|
+
let snippetName: string
|
|
14
|
+
if (!snippetPath.startsWith("@tsci/") && snippetPath.includes("/")) {
|
|
15
|
+
;[author, snippetName] = snippetPath.split("/")
|
|
16
|
+
} else {
|
|
17
|
+
const trimmedPath = snippetPath.replace("@tsci/", "")
|
|
18
|
+
const firstDotIndex = trimmedPath.indexOf(".")
|
|
19
|
+
author = trimmedPath.slice(0, firstDotIndex)
|
|
20
|
+
snippetName = trimmedPath.slice(firstDotIndex + 1)
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
if (!author || !snippetName) {
|
|
24
|
+
console.error(
|
|
25
|
+
"Invalid snippet path. Use format: author/snippetName, author.snippetName or @tsci/author.snippetName",
|
|
26
|
+
)
|
|
27
|
+
process.exit(1)
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
const ky = getKy()
|
|
31
|
+
|
|
32
|
+
try {
|
|
33
|
+
console.log(`Cloning ${author}/${snippetName}...`)
|
|
34
|
+
|
|
35
|
+
const packageFileList = await ky
|
|
36
|
+
.post<{
|
|
37
|
+
package_files: Array<{
|
|
38
|
+
package_file_id: string
|
|
39
|
+
package_release_id: string
|
|
40
|
+
file_path: string
|
|
41
|
+
created_at: string
|
|
42
|
+
}>
|
|
43
|
+
}>("package_files/list", {
|
|
44
|
+
json: {
|
|
45
|
+
package_name: `${author}/${snippetName}`,
|
|
46
|
+
use_latest_version: true,
|
|
47
|
+
},
|
|
48
|
+
})
|
|
49
|
+
.json()
|
|
50
|
+
|
|
51
|
+
// Create directory if it doesn't exist
|
|
52
|
+
const dirPath = `./${author}.${snippetName}`
|
|
53
|
+
if (!fs.existsSync(dirPath)) {
|
|
54
|
+
fs.mkdirSync(dirPath)
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
// Download each file that doesn't start with dist/
|
|
58
|
+
for (const fileInfo of packageFileList.package_files) {
|
|
59
|
+
const filePath = fileInfo.file_path.startsWith("/")
|
|
60
|
+
? fileInfo.file_path.slice(1)
|
|
61
|
+
: fileInfo.file_path
|
|
62
|
+
|
|
63
|
+
if (filePath.startsWith("dist/")) continue
|
|
64
|
+
|
|
65
|
+
const fileContent = await ky
|
|
66
|
+
.post<{
|
|
67
|
+
package_file: {
|
|
68
|
+
content_text: string
|
|
69
|
+
}
|
|
70
|
+
}>("package_files/get", {
|
|
71
|
+
json: {
|
|
72
|
+
package_name: `${author}/${snippetName}`,
|
|
73
|
+
file_path: fileInfo.file_path,
|
|
74
|
+
},
|
|
75
|
+
})
|
|
76
|
+
.json()
|
|
77
|
+
|
|
78
|
+
const fullPath = path.join(dirPath, filePath)
|
|
79
|
+
const dirName = path.dirname(fullPath)
|
|
80
|
+
|
|
81
|
+
// Create nested directories if they don't exist
|
|
82
|
+
if (!fs.existsSync(dirName)) {
|
|
83
|
+
fs.mkdirSync(dirName, { recursive: true })
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
fs.writeFileSync(fullPath, fileContent.package_file.content_text)
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
console.log(`Successfully cloned to ./${author}.${snippetName}/`)
|
|
90
|
+
} catch (error) {
|
|
91
|
+
if (error instanceof Error) {
|
|
92
|
+
console.error("Failed to clone snippet:", error.message)
|
|
93
|
+
} else {
|
|
94
|
+
console.error("Failed to clone snippet:", error)
|
|
95
|
+
}
|
|
96
|
+
process.exit(1)
|
|
97
|
+
}
|
|
98
|
+
})
|
|
99
|
+
}
|
package/cli/main.ts
CHANGED
|
@@ -6,6 +6,7 @@ import { registerAuthLogout } from "./auth/logout/register"
|
|
|
6
6
|
import { registerAuth } from "./auth/register"
|
|
7
7
|
import { registerConfig } from "./config/register"
|
|
8
8
|
import { registerConfigPrint } from "./config/print/register"
|
|
9
|
+
import { registerClone } from "./clone/register"
|
|
9
10
|
import { perfectCli } from "perfect-cli"
|
|
10
11
|
|
|
11
12
|
const program = new Command()
|
|
@@ -16,6 +17,7 @@ program
|
|
|
16
17
|
.version("1.0.0")
|
|
17
18
|
|
|
18
19
|
registerDev(program)
|
|
20
|
+
registerClone(program)
|
|
19
21
|
|
|
20
22
|
registerAuth(program)
|
|
21
23
|
registerAuthLogin(program)
|
package/dist/main.js
CHANGED
|
@@ -13,6 +13,49 @@ import * as http from "node:http";
|
|
|
13
13
|
import * as fs from "node:fs";
|
|
14
14
|
import * as path from "node:path";
|
|
15
15
|
import { getNodeHandler } from "winterspec/adapters/node";
|
|
16
|
+
|
|
17
|
+
// package.json
|
|
18
|
+
var package_default = {
|
|
19
|
+
name: "@tscircuit/cli",
|
|
20
|
+
main: "dist/main.js",
|
|
21
|
+
type: "module",
|
|
22
|
+
version: "0.1.2",
|
|
23
|
+
bin: {
|
|
24
|
+
tsci: "./dist/main.js"
|
|
25
|
+
},
|
|
26
|
+
scripts: {
|
|
27
|
+
start: "bun run dev",
|
|
28
|
+
dev: "bun --hot ./cli/main.ts dev ./example-dir/snippet.tsx",
|
|
29
|
+
build: "tsup-node cli/main.ts --format esm --sourcemap inline",
|
|
30
|
+
format: "biome format --write .",
|
|
31
|
+
"format:check": "biome format .",
|
|
32
|
+
cli: "bun ./cli/main.ts"
|
|
33
|
+
},
|
|
34
|
+
devDependencies: {
|
|
35
|
+
"@biomejs/biome": "^1.9.4",
|
|
36
|
+
"@tscircuit/core": "^0.0.249",
|
|
37
|
+
"@types/bun": "latest",
|
|
38
|
+
"@types/configstore": "^6.0.2",
|
|
39
|
+
"@types/react": "^19.0.1",
|
|
40
|
+
tsup: "^8.3.5"
|
|
41
|
+
},
|
|
42
|
+
peerDependencies: {
|
|
43
|
+
typescript: "^5.0.0"
|
|
44
|
+
},
|
|
45
|
+
dependencies: {
|
|
46
|
+
"@tscircuit/file-server": "^0.0.11",
|
|
47
|
+
"@tscircuit/runframe": "^0.0.47",
|
|
48
|
+
chokidar: "^4.0.1",
|
|
49
|
+
commander: "^12.1.0",
|
|
50
|
+
configstore: "^7.0.0",
|
|
51
|
+
cosmiconfig: "^9.0.0",
|
|
52
|
+
delay: "^6.0.0",
|
|
53
|
+
ky: "^1.7.4",
|
|
54
|
+
"perfect-cli": "^1.0.20"
|
|
55
|
+
}
|
|
56
|
+
};
|
|
57
|
+
|
|
58
|
+
// lib/server/createServer.ts
|
|
16
59
|
import winterspecBundle from "@tscircuit/file-server/dist/bundle.js";
|
|
17
60
|
|
|
18
61
|
// lib/site/getIndex.ts
|
|
@@ -51,10 +94,12 @@ var createServer2 = async (port = 3e3) => {
|
|
|
51
94
|
return;
|
|
52
95
|
} catch (error) {
|
|
53
96
|
console.error("Error serving standalone.min.js:", error);
|
|
54
|
-
res.writeHead(404);
|
|
55
|
-
res.end("File not found");
|
|
56
|
-
return;
|
|
57
97
|
}
|
|
98
|
+
res.writeHead(302, {
|
|
99
|
+
Location: `https://cdn.jsdelivr.net/npm/@tscircuit/runframe@${package_default.dependencies["@tscircuit/runframe"].replace(/^[^0-9]+/, "")}/dist/standalone.min.js`
|
|
100
|
+
});
|
|
101
|
+
res.end();
|
|
102
|
+
return;
|
|
58
103
|
}
|
|
59
104
|
if (url.pathname === "/") {
|
|
60
105
|
const html = await getIndex();
|
|
@@ -455,11 +500,75 @@ var registerConfigPrint = (program2) => {
|
|
|
455
500
|
});
|
|
456
501
|
};
|
|
457
502
|
|
|
503
|
+
// cli/clone/register.ts
|
|
504
|
+
import * as fs5 from "node:fs";
|
|
505
|
+
import * as path5 from "node:path";
|
|
506
|
+
var registerClone = (program2) => {
|
|
507
|
+
program2.command("clone").description("Clone a snippet from the registry").argument("<snippet>", "Snippet to clone (e.g. author/snippetName)").action(async (snippetPath) => {
|
|
508
|
+
let author;
|
|
509
|
+
let snippetName;
|
|
510
|
+
if (!snippetPath.startsWith("@tsci/") && snippetPath.includes("/")) {
|
|
511
|
+
;
|
|
512
|
+
[author, snippetName] = snippetPath.split("/");
|
|
513
|
+
} else {
|
|
514
|
+
const trimmedPath = snippetPath.replace("@tsci/", "");
|
|
515
|
+
const firstDotIndex = trimmedPath.indexOf(".");
|
|
516
|
+
author = trimmedPath.slice(0, firstDotIndex);
|
|
517
|
+
snippetName = trimmedPath.slice(firstDotIndex + 1);
|
|
518
|
+
}
|
|
519
|
+
if (!author || !snippetName) {
|
|
520
|
+
console.error(
|
|
521
|
+
"Invalid snippet path. Use format: author/snippetName, author.snippetName or @tsci/author.snippetName"
|
|
522
|
+
);
|
|
523
|
+
process.exit(1);
|
|
524
|
+
}
|
|
525
|
+
const ky2 = getKy();
|
|
526
|
+
try {
|
|
527
|
+
console.log(`Cloning ${author}/${snippetName}...`);
|
|
528
|
+
const packageFileList = await ky2.post("package_files/list", {
|
|
529
|
+
json: {
|
|
530
|
+
package_name: `${author}/${snippetName}`,
|
|
531
|
+
use_latest_version: true
|
|
532
|
+
}
|
|
533
|
+
}).json();
|
|
534
|
+
const dirPath = `./${author}.${snippetName}`;
|
|
535
|
+
if (!fs5.existsSync(dirPath)) {
|
|
536
|
+
fs5.mkdirSync(dirPath);
|
|
537
|
+
}
|
|
538
|
+
for (const fileInfo of packageFileList.package_files) {
|
|
539
|
+
const filePath = fileInfo.file_path.startsWith("/") ? fileInfo.file_path.slice(1) : fileInfo.file_path;
|
|
540
|
+
if (filePath.startsWith("dist/")) continue;
|
|
541
|
+
const fileContent = await ky2.post("package_files/get", {
|
|
542
|
+
json: {
|
|
543
|
+
package_name: `${author}/${snippetName}`,
|
|
544
|
+
file_path: fileInfo.file_path
|
|
545
|
+
}
|
|
546
|
+
}).json();
|
|
547
|
+
const fullPath = path5.join(dirPath, filePath);
|
|
548
|
+
const dirName = path5.dirname(fullPath);
|
|
549
|
+
if (!fs5.existsSync(dirName)) {
|
|
550
|
+
fs5.mkdirSync(dirName, { recursive: true });
|
|
551
|
+
}
|
|
552
|
+
fs5.writeFileSync(fullPath, fileContent.package_file.content_text);
|
|
553
|
+
}
|
|
554
|
+
console.log(`Successfully cloned to ./${author}.${snippetName}/`);
|
|
555
|
+
} catch (error) {
|
|
556
|
+
if (error instanceof Error) {
|
|
557
|
+
console.error("Failed to clone snippet:", error.message);
|
|
558
|
+
} else {
|
|
559
|
+
console.error("Failed to clone snippet:", error);
|
|
560
|
+
}
|
|
561
|
+
process.exit(1);
|
|
562
|
+
}
|
|
563
|
+
});
|
|
564
|
+
};
|
|
565
|
+
|
|
458
566
|
// cli/main.ts
|
|
459
567
|
import { perfectCli } from "perfect-cli";
|
|
460
568
|
var program = new Command();
|
|
461
569
|
program.name("tsci").description("CLI for developing tscircuit snippets").version("1.0.0");
|
|
462
570
|
registerDev(program);
|
|
571
|
+
registerClone(program);
|
|
463
572
|
registerAuth(program);
|
|
464
573
|
registerAuthLogin(program);
|
|
465
574
|
registerAuthLogout(program);
|
|
@@ -470,4 +579,4 @@ if (process.argv.length === 2) {
|
|
|
470
579
|
} else {
|
|
471
580
|
program.parse();
|
|
472
581
|
}
|
|
473
|
-
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vY2xpL21haW4udHMiLCAiLi4vY2xpL2Rldi9yZWdpc3Rlci50cyIsICIuLi9saWIvc2VydmVyL2NyZWF0ZVNlcnZlci50cyIsICIuLi9saWIvc2l0ZS9nZXRJbmRleC50cyIsICIuLi9saWIvZGVwZW5kZW5jeS1hbmFseXNpcy9nZXRMb2NhbEZpbGVEZXBlbmRlbmNpZXMudHMiLCAiLi4vbGliL2RlcGVuZGVuY3ktYW5hbHlzaXMvaW5zdGFsbE5vZGVNb2R1bGVUeXBlcy50cyIsICIuLi9saWIvc2VydmVyL0V2ZW50c1dhdGNoZXIudHMiLCAiLi4vbGliL2NsaS1jb25maWcvaW5kZXgudHMiLCAiLi4vY2xpL2F1dGgvbG9naW4vcmVnaXN0ZXIudHMiLCAiLi4vbGliL3JlZ2lzdHJ5LWFwaS9nZXQta3kudHMiLCAiLi4vY2xpL2F1dGgvbG9nb3V0L3JlZ2lzdGVyLnRzIiwgIi4uL2NsaS9hdXRoL3JlZ2lzdGVyLnRzIiwgIi4uL2NsaS9jb25maWcvcmVnaXN0ZXIudHMiLCAiLi4vY2xpL2NvbmZpZy9wcmludC9yZWdpc3Rlci50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiIyEvdXNyL2Jpbi9lbnYgbm9kZVxuaW1wb3J0IHsgQ29tbWFuZCB9IGZyb20gXCJjb21tYW5kZXJcIlxuaW1wb3J0IHsgcmVnaXN0ZXJEZXYgfSBmcm9tIFwiLi9kZXYvcmVnaXN0ZXJcIlxuaW1wb3J0IHsgcmVnaXN0ZXJBdXRoTG9naW4gfSBmcm9tIFwiLi9hdXRoL2xvZ2luL3JlZ2lzdGVyXCJcbmltcG9ydCB7IHJlZ2lzdGVyQXV0aExvZ291dCB9IGZyb20gXCIuL2F1dGgvbG9nb3V0L3JlZ2lzdGVyXCJcbmltcG9ydCB7IHJlZ2lzdGVyQXV0aCB9IGZyb20gXCIuL2F1dGgvcmVnaXN0ZXJcIlxuaW1wb3J0IHsgcmVnaXN0ZXJDb25maWcgfSBmcm9tIFwiLi9jb25maWcvcmVnaXN0ZXJcIlxuaW1wb3J0IHsgcmVnaXN0ZXJDb25maWdQcmludCB9IGZyb20gXCIuL2NvbmZpZy9wcmludC9yZWdpc3RlclwiXG5pbXBvcnQgeyBwZXJmZWN0Q2xpIH0gZnJvbSBcInBlcmZlY3QtY2xpXCJcblxuY29uc3QgcHJvZ3JhbSA9IG5ldyBDb21tYW5kKClcblxucHJvZ3JhbVxuICAubmFtZShcInRzY2lcIilcbiAgLmRlc2NyaXB0aW9uKFwiQ0xJIGZvciBkZXZlbG9waW5nIHRzY2lyY3VpdCBzbmlwcGV0c1wiKVxuICAudmVyc2lvbihcIjEuMC4wXCIpXG5cbnJlZ2lzdGVyRGV2KHByb2dyYW0pXG5cbnJlZ2lzdGVyQXV0aChwcm9ncmFtKVxucmVnaXN0ZXJBdXRoTG9naW4ocHJvZ3JhbSlcbnJlZ2lzdGVyQXV0aExvZ291dChwcm9ncmFtKVxuXG5yZWdpc3RlckNvbmZpZyhwcm9ncmFtKVxucmVnaXN0ZXJDb25maWdQcmludChwcm9ncmFtKVxuXG5pZiAocHJvY2Vzcy5hcmd2Lmxlbmd0aCA9PT0gMikge1xuICBwZXJmZWN0Q2xpKHByb2dyYW0sIHByb2Nlc3MuYXJndilcbn0gZWxzZSB7XG4gIHByb2dyYW0ucGFyc2UoKVxufVxuIiwgImltcG9ydCB0eXBlIHsgQ29tbWFuZCB9IGZyb20gXCJjb21tYW5kZXJcIlxuaW1wb3J0ICogYXMgcGF0aCBmcm9tIFwibm9kZTpwYXRoXCJcbmltcG9ydCAqIGFzIGNob2tpZGFyIGZyb20gXCJjaG9raWRhclwiXG5pbXBvcnQgKiBhcyBmcyBmcm9tIFwibm9kZTpmc1wiXG5pbXBvcnQgeyBjcmVhdGVTZXJ2ZXIgfSBmcm9tIFwibGliL3NlcnZlci9jcmVhdGVTZXJ2ZXJcIlxuaW1wb3J0IHsgZ2V0TG9jYWxGaWxlRGVwZW5kZW5jaWVzIH0gZnJvbSBcImxpYi9kZXBlbmRlbmN5LWFuYWx5c2lzL2dldExvY2FsRmlsZURlcGVuZGVuY2llc1wiXG5pbXBvcnQgeyBpbnN0YWxsVHlwZXMgfSBmcm9tIFwiLi4vLi4vbGliL2RlcGVuZGVuY3ktYW5hbHlzaXMvaW5zdGFsbE5vZGVNb2R1bGVUeXBlc1wiXG5pbXBvcnQgeyBFdmVudHNXYXRjaGVyIH0gZnJvbSBcIi4uLy4uL2xpYi9zZXJ2ZXIvRXZlbnRzV2F0Y2hlclwiXG5cbmV4cG9ydCBjb25zdCByZWdpc3RlckRldiA9IChwcm9ncmFtOiBDb21tYW5kKSA9PiB7XG4gIHByb2dyYW1cbiAgICAuY29tbWFuZChcImRldlwiKVxuICAgIC5kZXNjcmlwdGlvbihcIlN0YXJ0IGRldmVsb3BtZW50IHNlcnZlciBmb3IgYSBzbmlwcGV0XCIpXG4gICAgLmFyZ3VtZW50KFwiPGZpbGU+XCIsIFwiUGF0aCB0byB0aGUgc25pcHBldCBmaWxlXCIpXG4gICAgLm9wdGlvbihcIi1wLCAtLXBvcnQgPG51bWJlcj5cIiwgXCJQb3J0IHRvIHJ1biBzZXJ2ZXIgb25cIiwgXCIzMDAwXCIpXG4gICAgLmFjdGlvbihhc3luYyAoZmlsZTogc3RyaW5nLCBvcHRpb25zOiB7IHBvcnQ6IHN0cmluZyB9KSA9PiB7XG4gICAgICBjb25zdCBhYnNvbHV0ZVBhdGggPSBwYXRoLnJlc29sdmUoZmlsZSlcbiAgICAgIGNvbnN0IGZpbGVEaXIgPSBwYXRoLmRpcm5hbWUoYWJzb2x1dGVQYXRoKVxuICAgICAgY29uc3QgcG9ydCA9IHBhcnNlSW50KG9wdGlvbnMucG9ydClcblxuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc29sZS5sb2coXCJJbnN0YWxsaW5nIHR5cGVzIGZvciBpbXBvcnRlZCBzbmlwcGV0cy4uLlwiKVxuICAgICAgICBhd2FpdCBpbnN0YWxsVHlwZXMoYWJzb2x1dGVQYXRoKVxuICAgICAgICBjb25zb2xlLmxvZyhcIlR5cGVzIGluc3RhbGxlZCBzdWNjZXNzZnVsbHlcIilcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIGNvbnNvbGUud2FybihcIkZhaWxlZCB0byBpbnN0YWxsIHR5cGVzOlwiLCBlcnJvcilcbiAgICAgIH1cblxuICAgICAgLy8gU3RhcnQgdGhlIHNlcnZlclxuICAgICAgYXdhaXQgY3JlYXRlU2VydmVyKHBvcnQpXG5cbiAgICAgIGNvbnN0IGV2ZW50c1dhdGNoZXIgPSBuZXcgRXZlbnRzV2F0Y2hlcihgaHR0cDovL2xvY2FsaG9zdDoke3BvcnR9YClcbiAgICAgIGV2ZW50c1dhdGNoZXIuc3RhcnQoKVxuXG4gICAgICBhd2FpdCBmZXRjaChgaHR0cDovL2xvY2FsaG9zdDoke3BvcnR9L2FwaS9maWxlcy91cHNlcnRgLCB7XG4gICAgICAgIG1ldGhvZDogXCJQT1NUXCIsXG4gICAgICAgIGhlYWRlcnM6IHsgXCJDb250ZW50LVR5cGVcIjogXCJhcHBsaWNhdGlvbi9qc29uXCIgfSxcbiAgICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkoe1xuICAgICAgICAgIGZpbGVfcGF0aDogXCJlbnRyeXBvaW50LnRzeFwiLFxuICAgICAgICAgIHRleHRfY29udGVudDogYFxuaW1wb3J0IE15Q2lyY3VpdCBmcm9tIFwiLi9zbmlwcGV0LnRzeFwiXG5cbmNpcmN1aXQuYWRkKDxNeUNpcmN1aXQgLz4pXG5gLFxuICAgICAgICB9KSxcbiAgICAgIH0pXG5cbiAgICAgIC8vIEZ1bmN0aW9uIHRvIHVwZGF0ZSBmaWxlIGNvbnRlbnRcbiAgICAgIGNvbnN0IHVwZGF0ZUZpbGUgPSBhc3luYyAoZmlsZVBhdGg6IHN0cmluZykgPT4ge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGNvbnN0IGNvbnRlbnQgPSBhd2FpdCBmcy5wcm9taXNlcy5yZWFkRmlsZShmaWxlUGF0aCwgXCJ1dGYtOFwiKVxuICAgICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2goXG4gICAgICAgICAgICBgaHR0cDovL2xvY2FsaG9zdDoke3BvcnR9L2FwaS9maWxlcy91cHNlcnRgLFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBtZXRob2Q6IFwiUE9TVFwiLFxuICAgICAgICAgICAgICBoZWFkZXJzOiB7IFwiQ29udGVudC1UeXBlXCI6IFwiYXBwbGljYXRpb24vanNvblwiIH0sXG4gICAgICAgICAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KHtcbiAgICAgICAgICAgICAgICBmaWxlX3BhdGg6IHBhdGgucmVsYXRpdmUoZmlsZURpciwgZmlsZVBhdGgpLFxuICAgICAgICAgICAgICAgIHRleHRfY29udGVudDogY29udGVudCxcbiAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIClcbiAgICAgICAgICBpZiAoIXJlc3BvbnNlLm9rKSB7XG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKGBGYWlsZWQgdG8gdXBkYXRlICR7ZmlsZVBhdGh9YClcbiAgICAgICAgICB9XG4gICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgY29uc29sZS5lcnJvcihgRXJyb3IgdXBkYXRpbmcgJHtmaWxlUGF0aH06YCwgZXJyb3IpXG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gR2V0IGluaXRpYWwgZGVwZW5kZW5jaWVzXG4gICAgICBjb25zdCBkZXBlbmRlbmNpZXMgPSBuZXcgU2V0KFthYnNvbHV0ZVBhdGhdKVxuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgZGVwcyA9IGdldExvY2FsRmlsZURlcGVuZGVuY2llcyhhYnNvbHV0ZVBhdGgpXG4gICAgICAgIGRlcHMuZm9yRWFjaCgoZGVwKSA9PiBkZXBlbmRlbmNpZXMuYWRkKGRlcCkpXG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBjb25zb2xlLndhcm4oXCJGYWlsZWQgdG8gYW5hbHl6ZSBkZXBlbmRlbmNpZXM6XCIsIGVycm9yKVxuICAgICAgfVxuXG4gICAgICAvLyBXYXRjaCB0aGUgbWFpbiBmaWxlIGFuZCBpdHMgZGVwZW5kZW5jaWVzXG4gICAgICBjb25zdCBmaWxlc3lzdGVtV2F0Y2hlciA9IGNob2tpZGFyLndhdGNoKEFycmF5LmZyb20oZGVwZW5kZW5jaWVzKSwge1xuICAgICAgICBwZXJzaXN0ZW50OiB0cnVlLFxuICAgICAgICBpZ25vcmVJbml0aWFsOiBmYWxzZSxcbiAgICAgIH0pXG5cbiAgICAgIGZpbGVzeXN0ZW1XYXRjaGVyLm9uKFwiY2hhbmdlXCIsIGFzeW5jIChmaWxlUGF0aCkgPT4ge1xuICAgICAgICBjb25zb2xlLmxvZyhgRmlsZSAke2ZpbGVQYXRofSBjaGFuZ2VkYClcbiAgICAgICAgYXdhaXQgdXBkYXRlRmlsZShmaWxlUGF0aClcbiAgICAgIH0pXG5cbiAgICAgIGZpbGVzeXN0ZW1XYXRjaGVyLm9uKFwiYWRkXCIsIGFzeW5jIChmaWxlUGF0aCkgPT4ge1xuICAgICAgICBjb25zb2xlLmxvZyhgRmlsZSAke2ZpbGVQYXRofSBhZGRlZGApXG4gICAgICAgIGF3YWl0IHVwZGF0ZUZpbGUoZmlsZVBhdGgpXG4gICAgICB9KVxuXG4gICAgICBldmVudHNXYXRjaGVyLm9uKFwiRklMRV9VUERBVEVEXCIsIGFzeW5jIChldikgPT4ge1xuICAgICAgICBpZiAoZXYuZmlsZV9wYXRoID09PSBcIm1hbnVhbC1lZGl0cy5qc29uXCIpIHtcbiAgICAgICAgICBjb25zb2xlLmxvZyhcIk1hbnVhbCBlZGl0cyB1cGRhdGVkLCB1cGRhdGluZyBvbiBmaWxlc3lzdGVtLi4uXCIpXG4gICAgICAgICAgY29uc3QgeyBmaWxlIH0gPSBhd2FpdCBmZXRjaChcbiAgICAgICAgICAgIGBodHRwOi8vbG9jYWxob3N0OiR7cG9ydH0vYXBpL2ZpbGVzL2dldD9maWxlX3BhdGg9bWFudWFsLWVkaXRzLmpzb25gLFxuICAgICAgICAgICkudGhlbigocikgPT4gci5qc29uKCkpXG4gICAgICAgICAgZnMud3JpdGVGaWxlU3luYyhcbiAgICAgICAgICAgIHBhdGguam9pbihmaWxlRGlyLCBcIm1hbnVhbC1lZGl0cy5qc29uXCIpLFxuICAgICAgICAgICAgZmlsZS50ZXh0X2NvbnRlbnQsXG4gICAgICAgICAgKVxuICAgICAgICB9XG4gICAgICB9KVxuXG4gICAgICBjb25zb2xlLmxvZyhgV2F0Y2hpbmcgJHtmaWxlfSBhbmQgaXRzIGRlcGVuZGVuY2llcy4uLmApXG4gICAgfSlcbn1cbiIsICJpbXBvcnQgKiBhcyBodHRwIGZyb20gXCJub2RlOmh0dHBcIlxuaW1wb3J0ICogYXMgZnMgZnJvbSBcIm5vZGU6ZnNcIlxuaW1wb3J0ICogYXMgcGF0aCBmcm9tIFwibm9kZTpwYXRoXCJcbmltcG9ydCB7IGdldE5vZGVIYW5kbGVyIH0gZnJvbSBcIndpbnRlcnNwZWMvYWRhcHRlcnMvbm9kZVwiXG4vLyBAdHMtaWdub3JlXG5pbXBvcnQgd2ludGVyc3BlY0J1bmRsZSBmcm9tIFwiQHRzY2lyY3VpdC9maWxlLXNlcnZlci9kaXN0L2J1bmRsZS5qc1wiXG5pbXBvcnQgeyBnZXRJbmRleCB9IGZyb20gXCIuLi9zaXRlL2dldEluZGV4XCJcblxuZXhwb3J0IGNvbnN0IGNyZWF0ZVNlcnZlciA9IGFzeW5jIChwb3J0OiBudW1iZXIgPSAzMDAwKSA9PiB7XG4gIGNvbnN0IGZpbGVTZXJ2ZXJIYW5kbGVyID0gZ2V0Tm9kZUhhbmRsZXIod2ludGVyc3BlY0J1bmRsZSBhcyBhbnksIHt9KVxuXG4gIGNvbnN0IHNlcnZlciA9IGh0dHAuY3JlYXRlU2VydmVyKGFzeW5jIChyZXEsIHJlcykgPT4ge1xuICAgIGNvbnN0IHVybCA9IG5ldyBVUkwocmVxLnVybCEsIGBodHRwOi8vJHtyZXEuaGVhZGVycy5ob3N0fWApXG5cbiAgICBpZiAodXJsLnBhdGhuYW1lID09PSBcIi9zdGFuZGFsb25lLm1pbi5qc1wiKSB7XG4gICAgICBjb25zdCBzdGFuZGFsb25lRmlsZVBhdGggPVxuICAgICAgICBwcm9jZXNzLmVudi5SVU5GUkFNRV9TVEFOREFMT05FX0ZJTEVfUEFUSCB8fFxuICAgICAgICBwYXRoLnJlc29sdmUoXG4gICAgICAgICAgcHJvY2Vzcy5jd2QoKSxcbiAgICAgICAgICBcIm5vZGVfbW9kdWxlc1wiLFxuICAgICAgICAgIFwiQHRzY2lyY3VpdC9ydW5mcmFtZS9kaXN0L3N0YW5kYWxvbmUubWluLmpzXCIsXG4gICAgICAgIClcblxuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgY29udGVudCA9IGZzLnJlYWRGaWxlU3luYyhzdGFuZGFsb25lRmlsZVBhdGgsIFwidXRmOFwiKVxuICAgICAgICByZXMud3JpdGVIZWFkKDIwMCwge1xuICAgICAgICAgIFwiQ29udGVudC1UeXBlXCI6IFwiYXBwbGljYXRpb24vamF2YXNjcmlwdDsgY2hhcnNldD11dGYtOFwiLFxuICAgICAgICB9KVxuICAgICAgICByZXMuZW5kKGNvbnRlbnQpXG4gICAgICAgIHJldHVyblxuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgY29uc29sZS5lcnJvcihcIkVycm9yIHNlcnZpbmcgc3RhbmRhbG9uZS5taW4uanM6XCIsIGVycm9yKVxuICAgICAgICByZXMud3JpdGVIZWFkKDQwNClcbiAgICAgICAgcmVzLmVuZChcIkZpbGUgbm90IGZvdW5kXCIpXG4gICAgICAgIHJldHVyblxuICAgICAgfVxuICAgIH1cblxuICAgIGlmICh1cmwucGF0aG5hbWUgPT09IFwiL1wiKSB7XG4gICAgICBjb25zdCBodG1sID0gYXdhaXQgZ2V0SW5kZXgoKVxuICAgICAgcmVzLndyaXRlSGVhZCgyMDAsIHsgXCJDb250ZW50LVR5cGVcIjogXCJ0ZXh0L2h0bWxcIiB9KVxuICAgICAgcmVzLmVuZChodG1sKVxuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgaWYgKHVybC5wYXRobmFtZS5zdGFydHNXaXRoKFwiL2FwaS9cIikpIHtcbiAgICAgIHJlcS51cmwgPSByZXEudXJsIS5yZXBsYWNlKFwiL2FwaS9cIiwgXCIvXCIpXG4gICAgICBmaWxlU2VydmVySGFuZGxlcihyZXEsIHJlcylcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIHJlcy53cml0ZUhlYWQoNDA0KVxuICAgIHJlcy5lbmQoXCJOb3QgZm91bmRcIilcbiAgfSlcblxuICByZXR1cm4gbmV3IFByb21pc2U8dm9pZD4oKHJlc29sdmUpID0+IHtcbiAgICBzZXJ2ZXIubGlzdGVuKHBvcnQsICgpID0+IHtcbiAgICAgIGNvbnNvbGUubG9nKGBTZXJ2ZXIgcnVubmluZyBhdCBodHRwOi8vbG9jYWxob3N0OiR7cG9ydH1gKVxuICAgICAgcmVzb2x2ZSgpXG4gICAgfSlcbiAgfSlcbn1cbiIsICJpbXBvcnQgcGtnIGZyb20gXCIuLi8uLi9wYWNrYWdlLmpzb25cIlxuXG5leHBvcnQgY29uc3QgZ2V0SW5kZXggPSBhc3luYyAoKSA9PiB7XG4gIHJldHVybiBgPGh0bWw+XG4gICAgPGhlYWQ+XG4gICAgPC9oZWFkPlxuICAgIDxib2R5PlxuICAgICAgPHNjcmlwdCBzcmM9XCJodHRwczovL2Nkbi50YWlsd2luZGNzcy5jb21cIj48L3NjcmlwdD5cbiAgICAgIDxkaXYgaWQ9XCJyb290XCI+bG9hZGluZy4uLjwvZGl2PlxuICAgICAgPHNjcmlwdD5cbiAgICAgIGdsb2JhbFRoaXMucHJvY2VzcyA9IHsgZW52OiB7IE5PREVfRU5WOiBcInByb2R1Y3Rpb25cIiB9IH1cbiAgICAgIDwvc2NyaXB0PlxuICAgICAgPHNjcmlwdCBzcmM9XCIvc3RhbmRhbG9uZS5taW4uanNcIj48L3NjcmlwdD5cbiAgICA8L2JvZHk+XG4gIDwvaHRtbD5gXG59XG5cbi8vIDxzY3JpcHQgc3JjPVwiaHR0cHM6Ly9jZG4uanNkZWxpdnIubmV0L25wbS9AdHNjaXJjdWl0L3J1bmZyYW1lQCR7cGtnLmRlcGVuZGVuY2llc1tcIkB0c2NpcmN1aXQvcnVuZnJhbWVcIl0ucmVwbGFjZSgvXlteMC05XSsvLCBcIlwiKX0vZGlzdC9zdGFuZGFsb25lLm1pbi5qc1wiPjwvc2NyaXB0PlxuIiwgImltcG9ydCAqIGFzIHRzIGZyb20gXCJ0eXBlc2NyaXB0XCJcbmltcG9ydCAqIGFzIHBhdGggZnJvbSBcInBhdGhcIlxuaW1wb3J0ICogYXMgZnMgZnJvbSBcImZzXCJcblxuZnVuY3Rpb24gZ2V0TG9jYWxGaWxlRGVwZW5kZW5jaWVzKHBhdGhUb1RzeEZpbGU6IHN0cmluZyk6IHN0cmluZ1tdIHtcbiAgLy8gRW5zdXJlIGFic29sdXRlIHBhdGhcbiAgY29uc3QgYWJzb2x1dGVQYXRoID0gcGF0aC5yZXNvbHZlKHBhdGhUb1RzeEZpbGUpXG4gIGNvbnN0IGJhc2VEaXIgPSBwYXRoLmRpcm5hbWUoYWJzb2x1dGVQYXRoKVxuXG4gIC8vIFJlYWQgYW5kIHBhcnNlIHRoZSBmaWxlXG4gIGNvbnN0IGNvbnRlbnQgPSBmcy5yZWFkRmlsZVN5bmMoYWJzb2x1dGVQYXRoLCBcInV0Zi04XCIpXG4gIGNvbnN0IHNvdXJjZUZpbGUgPSB0cy5jcmVhdGVTb3VyY2VGaWxlKFxuICAgIGFic29sdXRlUGF0aCxcbiAgICBjb250ZW50LFxuICAgIHRzLlNjcmlwdFRhcmdldC5MYXRlc3QsXG4gICAgdHJ1ZSxcbiAgKVxuXG4gIGNvbnN0IGRlcGVuZGVuY2llcyA9IG5ldyBTZXQ8c3RyaW5nPigpXG5cbiAgLy8gUmVjdXJzaXZlbHkgdmlzaXQgbm9kZXMgdG8gZmluZCBpbXBvcnRzXG4gIGZ1bmN0aW9uIHZpc2l0KG5vZGU6IHRzLk5vZGUpIHtcbiAgICBpZiAodHMuaXNJbXBvcnREZWNsYXJhdGlvbihub2RlKSB8fCB0cy5pc0V4cG9ydERlY2xhcmF0aW9uKG5vZGUpKSB7XG4gICAgICBjb25zdCBtb2R1bGVTcGVjaWZpZXIgPSBub2RlLm1vZHVsZVNwZWNpZmllclxuICAgICAgaWYgKG1vZHVsZVNwZWNpZmllciAmJiB0cy5pc1N0cmluZ0xpdGVyYWwobW9kdWxlU3BlY2lmaWVyKSkge1xuICAgICAgICBjb25zdCBpbXBvcnRQYXRoID0gbW9kdWxlU3BlY2lmaWVyLnRleHRcbiAgICAgICAgLy8gT25seSBwcm9jZXNzIGxvY2FsIGltcG9ydHMgKHN0YXJ0aW5nIHdpdGggLiBvciAuLilcbiAgICAgICAgaWYgKGltcG9ydFBhdGguc3RhcnRzV2l0aChcIi5cIikpIHtcbiAgICAgICAgICByZXNvbHZlQW5kQWRkRGVwZW5kZW5jeShpbXBvcnRQYXRoKVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gSGFuZGxlIGR5bmFtaWMgaW1wb3J0c1xuICAgIGlmIChcbiAgICAgIHRzLmlzQ2FsbEV4cHJlc3Npb24obm9kZSkgJiZcbiAgICAgIG5vZGUuZXhwcmVzc2lvbi5raW5kID09PSB0cy5TeW50YXhLaW5kLkltcG9ydEtleXdvcmRcbiAgICApIHtcbiAgICAgIGNvbnN0IGFyZ3VtZW50ID0gbm9kZS5hcmd1bWVudHNbMF1cbiAgICAgIGlmIChhcmd1bWVudCAmJiB0cy5pc1N0cmluZ0xpdGVyYWwoYXJndW1lbnQpKSB7XG4gICAgICAgIGNvbnN0IGltcG9ydFBhdGggPSBhcmd1bWVudC50ZXh0XG4gICAgICAgIGlmIChpbXBvcnRQYXRoLnN0YXJ0c1dpdGgoXCIuXCIpKSB7XG4gICAgICAgICAgcmVzb2x2ZUFuZEFkZERlcGVuZGVuY3koaW1wb3J0UGF0aClcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHRzLmZvckVhY2hDaGlsZChub2RlLCB2aXNpdClcbiAgfVxuXG4gIC8vIEhlbHBlciB0byByZXNvbHZlIGFuZCBhZGQgZGVwZW5kZW5jeSBwYXRoc1xuICBmdW5jdGlvbiByZXNvbHZlQW5kQWRkRGVwZW5kZW5jeShpbXBvcnRQYXRoOiBzdHJpbmcpIHtcbiAgICBjb25zdCBleHRlbnNpb25zID0gW1xuICAgICAgXCIudHN4XCIsXG4gICAgICBcIi50c1wiLFxuICAgICAgXCIuanN4XCIsXG4gICAgICBcIi5qc1wiLFxuICAgICAgXCIuY3NzXCIsXG4gICAgICBcIi5zY3NzXCIsXG4gICAgICBcIi5zYXNzXCIsXG4gICAgICBcIi5sZXNzXCIsXG4gICAgXVxuICAgIGxldCByZXNvbHZlZFBhdGggPSBwYXRoLnJlc29sdmUoYmFzZURpciwgaW1wb3J0UGF0aClcblxuICAgIC8vIENoZWNrIGlmIHBhdGggZXhpc3RzIGFzLWlzXG4gICAgaWYgKGZzLmV4aXN0c1N5bmMocmVzb2x2ZWRQYXRoKSkge1xuICAgICAgZGVwZW5kZW5jaWVzLmFkZChyZXNvbHZlZFBhdGgpXG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICAvLyBUcnkgd2l0aCBleHRlbnNpb25zXG4gICAgZm9yIChjb25zdCBleHQgb2YgZXh0ZW5zaW9ucykge1xuICAgICAgY29uc3QgcGF0aFdpdGhFeHQgPSByZXNvbHZlZFBhdGggKyBleHRcbiAgICAgIGlmIChmcy5leGlzdHNTeW5jKHBhdGhXaXRoRXh0KSkge1xuICAgICAgICBkZXBlbmRlbmNpZXMuYWRkKHBhdGhXaXRoRXh0KVxuICAgICAgICByZXR1cm5cbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBDaGVjayBmb3IgaW5kZXggZmlsZXMgaW4gZGlyZWN0b3JpZXNcbiAgICBpZiAoXG4gICAgICBmcy5leGlzdHNTeW5jKHJlc29sdmVkUGF0aCkgJiZcbiAgICAgIGZzLnN0YXRTeW5jKHJlc29sdmVkUGF0aCkuaXNEaXJlY3RvcnkoKVxuICAgICkge1xuICAgICAgZm9yIChjb25zdCBleHQgb2YgZXh0ZW5zaW9ucykge1xuICAgICAgICBjb25zdCBpbmRleFBhdGggPSBwYXRoLmpvaW4ocmVzb2x2ZWRQYXRoLCBgaW5kZXgke2V4dH1gKVxuICAgICAgICBpZiAoZnMuZXhpc3RzU3luYyhpbmRleFBhdGgpKSB7XG4gICAgICAgICAgZGVwZW5kZW5jaWVzLmFkZChpbmRleFBhdGgpXG4gICAgICAgICAgcmV0dXJuXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvLyBTdGFydCB0aGUgdHJhdmVyc2FsXG4gIHZpc2l0KHNvdXJjZUZpbGUpXG5cbiAgcmV0dXJuIEFycmF5LmZyb20oZGVwZW5kZW5jaWVzKVxufVxuXG5leHBvcnQgeyBnZXRMb2NhbEZpbGVEZXBlbmRlbmNpZXMgfVxuIiwgImltcG9ydCAqIGFzIGZzIGZyb20gXCJub2RlOmZzXCJcbmltcG9ydCAqIGFzIHBhdGggZnJvbSBcIm5vZGU6cGF0aFwiXG5pbXBvcnQgKiBhcyB0cyBmcm9tIFwidHlwZXNjcmlwdFwiXG5cbmludGVyZmFjZSBTbmlwcGV0QXBpUmVzcG9uc2Uge1xuICBzbmlwcGV0OiB7XG4gICAgZHRzOiBzdHJpbmdcbiAgfVxufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gaW5zdGFsbFR5cGVzKHNuaXBwZXRQYXRoOiBzdHJpbmcpIHtcbiAgY29uc3QgY29udGVudCA9IGZzLnJlYWRGaWxlU3luYyhzbmlwcGV0UGF0aCwgXCJ1dGYtOFwiKVxuICBjb25zdCBzb3VyY2VGaWxlID0gdHMuY3JlYXRlU291cmNlRmlsZShcbiAgICBzbmlwcGV0UGF0aCxcbiAgICBjb250ZW50LFxuICAgIHRzLlNjcmlwdFRhcmdldC5MYXRlc3QsXG4gICAgdHJ1ZSxcbiAgKVxuXG4gIGNvbnN0IGltcG9ydHM6IHN0cmluZ1tdID0gW11cblxuICBmdW5jdGlvbiB2aXNpdChub2RlOiB0cy5Ob2RlKSB7XG4gICAgaWYgKHRzLmlzSW1wb3J0RGVjbGFyYXRpb24obm9kZSkpIHtcbiAgICAgIGNvbnN0IG1vZHVsZVNwZWNpZmllciA9IG5vZGUubW9kdWxlU3BlY2lmaWVyXG4gICAgICBpZiAobW9kdWxlU3BlY2lmaWVyICYmIHRzLmlzU3RyaW5nTGl0ZXJhbChtb2R1bGVTcGVjaWZpZXIpKSB7XG4gICAgICAgIGNvbnN0IGltcG9ydFBhdGggPSBtb2R1bGVTcGVjaWZpZXIudGV4dFxuICAgICAgICBpZiAoaW1wb3J0UGF0aC5zdGFydHNXaXRoKFwiQHRzY2kvXCIpKSB7XG4gICAgICAgICAgaW1wb3J0cy5wdXNoKGltcG9ydFBhdGgpXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgdHMuZm9yRWFjaENoaWxkKG5vZGUsIHZpc2l0KVxuICB9XG5cbiAgdmlzaXQoc291cmNlRmlsZSlcblxuICBsZXQgcHJvamVjdFJvb3QgPSBwYXRoLmRpcm5hbWUoc25pcHBldFBhdGgpXG4gIHdoaWxlIChwcm9qZWN0Um9vdCAhPT0gcGF0aC5wYXJzZShwcm9qZWN0Um9vdCkucm9vdCkge1xuICAgIGlmIChmcy5leGlzdHNTeW5jKHBhdGguam9pbihwcm9qZWN0Um9vdCwgXCJwYWNrYWdlLmpzb25cIikpKSB7XG4gICAgICBicmVha1xuICAgIH1cbiAgICBwcm9qZWN0Um9vdCA9IHBhdGguZGlybmFtZShwcm9qZWN0Um9vdClcbiAgfVxuXG4gIGZvciAoY29uc3QgaW1wb3J0UGF0aCBvZiBpbXBvcnRzKSB7XG4gICAgY29uc3QgW293bmVyLCBuYW1lXSA9IGltcG9ydFBhdGgucmVwbGFjZShcIkB0c2NpL1wiLCBcIlwiKS5zcGxpdChcIi5cIilcbiAgICB0cnkge1xuICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaChcbiAgICAgICAgYGh0dHBzOi8vcmVnaXN0cnktYXBpLnRzY2lyY3VpdC5jb20vc25pcHBldHMvZ2V0P293bmVyX25hbWU9JHtvd25lcn0mdW5zY29wZWRfbmFtZT0ke25hbWV9YCxcbiAgICAgIClcblxuICAgICAgaWYgKCFyZXNwb25zZS5vaykge1xuICAgICAgICBjb25zb2xlLndhcm4oYEZhaWxlZCB0byBmZXRjaCB0eXBlcyBmb3IgJHtpbXBvcnRQYXRofWApXG4gICAgICAgIGNvbnRpbnVlXG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGRhdGE6IFNuaXBwZXRBcGlSZXNwb25zZSA9IGF3YWl0IHJlc3BvbnNlLmpzb24oKVxuXG4gICAgICBpZiAoZGF0YS5zbmlwcGV0LmR0cykge1xuICAgICAgICBjb25zdCBwYWNrYWdlRGlyID0gcGF0aC5qb2luKFxuICAgICAgICAgIHByb2plY3RSb290LFxuICAgICAgICAgIFwibm9kZV9tb2R1bGVzXCIsXG4gICAgICAgICAgXCJAdHNjaVwiLFxuICAgICAgICAgIGAke293bmVyfS4ke25hbWV9YCxcbiAgICAgICAgKVxuICAgICAgICBmcy5ta2RpclN5bmMocGFja2FnZURpciwgeyByZWN1cnNpdmU6IHRydWUgfSlcblxuICAgICAgICBmcy53cml0ZUZpbGVTeW5jKHBhdGguam9pbihwYWNrYWdlRGlyLCBcImluZGV4LmQudHNcIiksIGRhdGEuc25pcHBldC5kdHMpXG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGNvbnNvbGUud2FybihgRXJyb3IgZmV0Y2hpbmcgdHlwZXMgZm9yICR7aW1wb3J0UGF0aH06YCwgZXJyb3IpXG4gICAgfVxuICB9XG59XG4iLCAiaW1wb3J0IHsgRXZlbnRFbWl0dGVyIH0gZnJvbSBcImV2ZW50c1wiXG5cbmludGVyZmFjZSBFdmVudCB7XG4gIGV2ZW50X2lkOiBzdHJpbmdcbiAgY3JlYXRlZF9hdDogc3RyaW5nXG4gIGV2ZW50X3R5cGU6IHN0cmluZ1xuICBba2V5OiBzdHJpbmddOiBhbnlcbn1cblxuaW50ZXJmYWNlIEV2ZW50c1Jlc3BvbnNlIHtcbiAgZXZlbnRfbGlzdDogRXZlbnRbXVxufVxuXG5leHBvcnQgY2xhc3MgRXZlbnRzV2F0Y2hlciBleHRlbmRzIEV2ZW50RW1pdHRlciB7XG4gIHByaXZhdGUgbGFzdFBvbGxUaW1lOiBzdHJpbmdcbiAgcHJpdmF0ZSBwb2xsSW50ZXJ2YWw6IG51bWJlclxuICBwcml2YXRlIGJhc2VVcmw6IHN0cmluZ1xuICBwcml2YXRlIHBvbGxpbmcgPSBmYWxzZVxuICBwcml2YXRlIHRpbWVvdXRJZD86IE5vZGVKUy5UaW1lb3V0XG5cbiAgY29uc3RydWN0b3IoYmFzZVVybCA9IFwiaHR0cDovL2xvY2FsaG9zdDozMDAwXCIsIHBvbGxJbnRlcnZhbCA9IDEwMDApIHtcbiAgICBzdXBlcigpXG4gICAgdGhpcy5iYXNlVXJsID0gYmFzZVVybFxuICAgIHRoaXMucG9sbEludGVydmFsID0gcG9sbEludGVydmFsXG4gICAgdGhpcy5sYXN0UG9sbFRpbWUgPSBuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKClcbiAgfVxuXG4gIGFzeW5jIHN0YXJ0KCkge1xuICAgIGlmICh0aGlzLnBvbGxpbmcpIHJldHVyblxuICAgIHRoaXMucG9sbGluZyA9IHRydWVcbiAgICBhd2FpdCB0aGlzLnBvbGwoKVxuICB9XG5cbiAgc3RvcCgpIHtcbiAgICB0aGlzLnBvbGxpbmcgPSBmYWxzZVxuICAgIGlmICh0aGlzLnRpbWVvdXRJZCkge1xuICAgICAgY2xlYXJUaW1lb3V0KHRoaXMudGltZW91dElkKVxuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgcG9sbCgpIHtcbiAgICBpZiAoIXRoaXMucG9sbGluZykgcmV0dXJuXG5cbiAgICB0cnkge1xuICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaChcbiAgICAgICAgYCR7dGhpcy5iYXNlVXJsfS9hcGkvZXZlbnRzL2xpc3Q/c2luY2U9JHtlbmNvZGVVUklDb21wb25lbnQodGhpcy5sYXN0UG9sbFRpbWUpfWAsXG4gICAgICApXG5cbiAgICAgIGlmICghcmVzcG9uc2Uub2spIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBIVFRQIGVycm9yISBzdGF0dXM6ICR7cmVzcG9uc2Uuc3RhdHVzfWApXG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGRhdGE6IEV2ZW50c1Jlc3BvbnNlID0gYXdhaXQgcmVzcG9uc2UuanNvbigpXG5cbiAgICAgIC8vIFVwZGF0ZSBsYXN0IHBvbGwgdGltZSB0byBsYXRlc3QgZXZlbnQgb3IgY3VycmVudCB0aW1lXG4gICAgICBjb25zdCBsYXRlc3RFdmVudCA9IGRhdGEuZXZlbnRfbGlzdFtkYXRhLmV2ZW50X2xpc3QubGVuZ3RoIC0gMV1cbiAgICAgIHRoaXMubGFzdFBvbGxUaW1lID0gbGF0ZXN0RXZlbnRcbiAgICAgICAgPyBsYXRlc3RFdmVudC5jcmVhdGVkX2F0XG4gICAgICAgIDogbmV3IERhdGUoKS50b0lTT1N0cmluZygpXG5cbiAgICAgIC8vIEVtaXQgZXZlbnRzIGluIGNocm9ub2xvZ2ljYWwgb3JkZXJcbiAgICAgIGRhdGEuZXZlbnRfbGlzdC5mb3JFYWNoKChldmVudCkgPT4ge1xuICAgICAgICB0aGlzLmVtaXQoZXZlbnQuZXZlbnRfdHlwZSwgZXZlbnQpXG4gICAgICAgIHRoaXMuZW1pdChcIipcIiwgZXZlbnQpXG4gICAgICB9KVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICB0aGlzLmVtaXQoXCJlcnJvclwiLCBlcnJvcilcbiAgICB9XG4gICAgLy8gU2NoZWR1bGUgbmV4dCBwb2xsXG4gICAgdGhpcy50aW1lb3V0SWQgPSBnbG9iYWxUaGlzLnNldFRpbWVvdXQoXG4gICAgICAoKSA9PiB0aGlzLnBvbGwoKSxcbiAgICAgIHRoaXMucG9sbEludGVydmFsLFxuICAgICkgYXMgdW5rbm93biBhcyBOb2RlSlMuVGltZW91dFxuICB9XG59XG4iLCAiaW1wb3J0IENvbmZpZ3N0b3JlIGZyb20gXCJjb25maWdzdG9yZVwiXG5pbXBvcnQgdHlwZSB7IFR5cGVkQ29uZmlnc3RvcmUgfSBmcm9tIFwiLi9UeXBlZENvbmZpZ1N0b3JlXCJcblxuZXhwb3J0IGludGVyZmFjZSBDbGlDb25maWcge1xuICBzZXNzaW9uVG9rZW4/OiBzdHJpbmdcbiAgZ2l0aHViVXNlcm5hbWU/OiBzdHJpbmdcbiAgcmVnaXN0cnlBcGlVcmw/OiBzdHJpbmdcbn1cblxuZXhwb3J0IGNvbnN0IGNsaUNvbmZpZzogVHlwZWRDb25maWdzdG9yZTxDbGlDb25maWc+ID0gbmV3IENvbmZpZ3N0b3JlKFxuICBcInRzY2lyY3VpdFwiLFxuKVxuXG5leHBvcnQgY29uc3QgZ2V0UmVnaXN0cnlBcGlVcmwgPSAoKTogc3RyaW5nID0+IHtcbiAgcmV0dXJuIGNsaUNvbmZpZy5nZXQoXCJyZWdpc3RyeUFwaVVybFwiKSA/PyBcImh0dHBzOi8vcmVnaXN0cnktYXBpLnRzY2lyY3VpdC5jb21cIlxufVxuIiwgImltcG9ydCB0eXBlIHsgQ29tbWFuZCB9IGZyb20gXCJjb21tYW5kZXJcIlxuaW1wb3J0IHsgY2xpQ29uZmlnIH0gZnJvbSBcImxpYi9jbGktY29uZmlnXCJcbmltcG9ydCBkZWxheSBmcm9tIFwiZGVsYXlcIlxuaW1wb3J0IHsgZ2V0S3kgfSBmcm9tIFwibGliL3JlZ2lzdHJ5LWFwaS9nZXQta3lcIlxuaW1wb3J0IHR5cGUgeyBFbmRwb2ludFJlc3BvbnNlIH0gZnJvbSBcImxpYi9yZWdpc3RyeS1hcGkvZW5kcG9pbnQtdHlwZXNcIlxuXG5leHBvcnQgY29uc3QgcmVnaXN0ZXJBdXRoTG9naW4gPSAocHJvZ3JhbTogQ29tbWFuZCkgPT4ge1xuICBwcm9ncmFtLmNvbW1hbmRzXG4gICAgLmZpbmQoKGMpID0+IGMubmFtZSgpID09PSBcImF1dGhcIikhXG4gICAgLmNvbW1hbmQoXCJsb2dpblwiKVxuICAgIC5kZXNjcmlwdGlvbihcIkF1dGhlbnRpY2F0ZSBDTEksIGxvZ2luIHRvIHJlZ2lzdHJ5XCIpXG4gICAgLmFjdGlvbihhc3luYyAoYXJncykgPT4ge1xuICAgICAgY29uc3Qga3kgPSBnZXRLeSgpXG5cbiAgICAgIGNvbnN0IHsgbG9naW5fcGFnZSB9ID0gYXdhaXQga3lcbiAgICAgICAgLnBvc3Q8RW5kcG9pbnRSZXNwb25zZVtcInNlc3Npb25zL2xvZ2luX3BhZ2UvY3JlYXRlXCJdPihcbiAgICAgICAgICBcInNlc3Npb25zL2xvZ2luX3BhZ2UvY3JlYXRlXCIsXG4gICAgICAgICAge1xuICAgICAgICAgICAganNvbjoge30sXG4gICAgICAgICAgfSxcbiAgICAgICAgKVxuICAgICAgICAuanNvbigpXG5cbiAgICAgIGNvbnNvbGUubG9nKFwiUGxlYXNlIHZpc2l0IHRoZSBmb2xsb3dpbmcgVVJMIHRvIGxvZyBpbjpcIilcbiAgICAgIGNvbnNvbGUubG9nKGxvZ2luX3BhZ2UudXJsKVxuXG4gICAgICAvLyBXYWl0IHVudGlsIHdlIHJlY2VpdmUgY29uZmlybWF0aW9uXG4gICAgICB3aGlsZSAodHJ1ZSkge1xuICAgICAgICBjb25zdCB7IGxvZ2luX3BhZ2U6IG5ld19sb2dpbl9wYWdlIH0gPSBhd2FpdCBreVxuICAgICAgICAgIC5wb3N0PEVuZHBvaW50UmVzcG9uc2VbXCJzZXNzaW9ucy9sb2dpbl9wYWdlL2dldFwiXT4oXG4gICAgICAgICAgICBcInNlc3Npb25zL2xvZ2luX3BhZ2UvZ2V0XCIsXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIGpzb246IHtcbiAgICAgICAgICAgICAgICBsb2dpbl9wYWdlX2lkOiBsb2dpbl9wYWdlLmxvZ2luX3BhZ2VfaWQsXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIGhlYWRlcnM6IHtcbiAgICAgICAgICAgICAgICBBdXRob3JpemF0aW9uOiBgQmVhcmVyICR7bG9naW5fcGFnZS5sb2dpbl9wYWdlX2F1dGhfdG9rZW59YCxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgKVxuICAgICAgICAgIC5qc29uKClcblxuICAgICAgICBpZiAobmV3X2xvZ2luX3BhZ2Uud2FzX2xvZ2luX3N1Y2Nlc3NmdWwpIHtcbiAgICAgICAgICBjb25zb2xlLmxvZyhcIkxvZ2dlZCBpbiEgR2VuZXJhdGluZyB0b2tlbi4uLlwiKVxuICAgICAgICAgIGJyZWFrXG4gICAgICAgIH1cblxuICAgICAgICBpZiAobmV3X2xvZ2luX3BhZ2UuaXNfZXhwaXJlZCkge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIkxvZ2luIHBhZ2UgZXhwaXJlZFwiKVxuICAgICAgICB9XG5cbiAgICAgICAgYXdhaXQgZGVsYXkoMTAwMClcbiAgICAgIH1cblxuICAgICAgY29uc3QgeyBzZXNzaW9uIH0gPSBhd2FpdCBreVxuICAgICAgICAucG9zdDxFbmRwb2ludFJlc3BvbnNlW1wic2Vzc2lvbnMvbG9naW5fcGFnZS9leGNoYW5nZV9mb3JfY2xpX3Nlc3Npb25cIl0+KFxuICAgICAgICAgIFwic2Vzc2lvbnMvbG9naW5fcGFnZS9leGNoYW5nZV9mb3JfY2xpX3Nlc3Npb25cIixcbiAgICAgICAgICB7XG4gICAgICAgICAgICBqc29uOiB7XG4gICAgICAgICAgICAgIGxvZ2luX3BhZ2VfaWQ6IGxvZ2luX3BhZ2UubG9naW5fcGFnZV9pZCxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBoZWFkZXJzOiB7XG4gICAgICAgICAgICAgIEF1dGhvcml6YXRpb246IGBCZWFyZXIgJHtsb2dpbl9wYWdlLmxvZ2luX3BhZ2VfYXV0aF90b2tlbn1gLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICB9LFxuICAgICAgICApXG4gICAgICAgIC5qc29uKClcblxuICAgICAgY2xpQ29uZmlnLnNldChcInNlc3Npb25Ub2tlblwiLCBzZXNzaW9uLnRva2VuKVxuXG4gICAgICBjb25zb2xlLmxvZyhcIlJlYWR5IHRvIHVzZSFcIilcbiAgICB9KVxufVxuIiwgImltcG9ydCB7IGdldFJlZ2lzdHJ5QXBpVXJsIH0gZnJvbSBcImxpYi9jbGktY29uZmlnXCJcbmltcG9ydCBreSwgeyB0eXBlIEFmdGVyUmVzcG9uc2VIb29rIH0gZnJvbSBcImt5XCJcblxuY29uc3QgcHJldHR5UmVzcG9uc2VFcnJvckhvb2s6IEFmdGVyUmVzcG9uc2VIb29rID0gYXN5bmMgKFxuICBfcmVxdWVzdCxcbiAgX29wdGlvbnMsXG4gIHJlc3BvbnNlLFxuKSA9PiB7XG4gIGlmICghcmVzcG9uc2Uub2spIHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgZXJyb3JEYXRhID0gYXdhaXQgcmVzcG9uc2UuanNvbigpXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGBGQUlMIFske3Jlc3BvbnNlLnN0YXR1c31dOiAke19yZXF1ZXN0Lm1ldGhvZH0gJHtcbiAgICAgICAgICBuZXcgVVJMKF9yZXF1ZXN0LnVybCkucGF0aG5hbWVcbiAgICAgICAgfSBcXG5cXG4gJHtKU09OLnN0cmluZ2lmeShlcnJvckRhdGEsIG51bGwsIDIpfWAsXG4gICAgICApXG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgLy9pZ25vcmUsIGFsbG93IHRoZSBlcnJvciB0byBiZSB0aHJvd25cbiAgICB9XG4gIH1cbn1cblxuZXhwb3J0IGNvbnN0IGdldEt5ID0gKCkgPT4ge1xuICByZXR1cm4ga3kuY3JlYXRlKHtcbiAgICBwcmVmaXhVcmw6IGdldFJlZ2lzdHJ5QXBpVXJsKCksXG4gICAgaG9va3M6IHtcbiAgICAgIGFmdGVyUmVzcG9uc2U6IFtwcmV0dHlSZXNwb25zZUVycm9ySG9va10sXG4gICAgfSxcbiAgfSlcbn1cbiIsICJpbXBvcnQgdHlwZSB7IENvbW1hbmQgfSBmcm9tIFwiY29tbWFuZGVyXCJcblxuZXhwb3J0IGNvbnN0IHJlZ2lzdGVyQXV0aExvZ291dCA9IChwcm9ncmFtOiBDb21tYW5kKSA9PiB7XG4gIHByb2dyYW0uY29tbWFuZHNcbiAgICAuZmluZCgoYykgPT4gYy5uYW1lKCkgPT09IFwiYXV0aFwiKSFcbiAgICAuY29tbWFuZChcImxvZ291dFwiKVxuICAgIC5kZXNjcmlwdGlvbihcIkxvZ291dCBmcm9tIHJlZ2lzdHJ5XCIpXG4gICAgLmFjdGlvbigoYXJncykgPT4ge1xuICAgICAgY29uc29sZS5sb2coXCJsb2dvdXRcIilcbiAgICB9KVxufVxuIiwgImltcG9ydCB0eXBlIHsgQ29tbWFuZCB9IGZyb20gXCJjb21tYW5kZXJcIlxuXG5leHBvcnQgY29uc3QgcmVnaXN0ZXJBdXRoID0gKHByb2dyYW06IENvbW1hbmQpID0+IHtcbiAgcHJvZ3JhbS5jb21tYW5kKFwiYXV0aFwiKS5kZXNjcmlwdGlvbihcIkxvZ2luL2xvZ291dFwiKVxufVxuIiwgImltcG9ydCB0eXBlIHsgQ29tbWFuZCB9IGZyb20gXCJjb21tYW5kZXJcIlxuXG5leHBvcnQgY29uc3QgcmVnaXN0ZXJDb25maWcgPSAocHJvZ3JhbTogQ29tbWFuZCkgPT4ge1xuICBwcm9ncmFtLmNvbW1hbmQoXCJjb25maWdcIikuZGVzY3JpcHRpb24oXCJNYW5hZ2UgdHNjaXJjdWl0IENMSSBjb25maWd1cmF0aW9uXCIpXG59XG4iLCAiaW1wb3J0IHR5cGUgeyBDb21tYW5kIH0gZnJvbSBcImNvbW1hbmRlclwiXG5pbXBvcnQgeyBjbGlDb25maWcgfSBmcm9tIFwibGliL2NsaS1jb25maWdcIlxuXG5leHBvcnQgY29uc3QgcmVnaXN0ZXJDb25maWdQcmludCA9IChwcm9ncmFtOiBDb21tYW5kKSA9PiB7XG4gIHByb2dyYW0uY29tbWFuZHNcbiAgICAuZmluZCgoYykgPT4gYy5uYW1lKCkgPT09IFwiY29uZmlnXCIpIVxuICAgIC5jb21tYW5kKFwicHJpbnRcIilcbiAgICAuZGVzY3JpcHRpb24oXCJQcmludCB0aGUgY3VycmVudCBjb25maWdcIilcbiAgICAuYWN0aW9uKCgpID0+IHtcbiAgICAgIGNvbnNvbGUubG9nKEpTT04uc3RyaW5naWZ5KGNsaUNvbmZpZy5hbGwsIG51bGwsIDIpKVxuICAgIH0pXG59XG4iXSwKICAibWFwcGluZ3Mi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RDtBQUFBLE1BQ0Y7QUFBQSxJQUNGLEVBQ0MsS0FBSztBQUVSLGNBQVUsSUFBSSxnQkFBZ0IsUUFBUSxLQUFLO0FBRTNDLFlBQVEsSUFBSSxlQUFlO0FBQUEsRUFDN0IsQ0FBQztBQUNMOzs7QUV0RU8sSUFBTSxxQkFBcUIsQ0FBQ0MsYUFBcUI7QUFDdEQsRUFBQUEsU0FBUSxTQUNMLEtBQUssQ0FBQyxNQUFNLEVBQUUsS0FBSyxNQUFNLE1BQU0sRUFDL0IsUUFBUSxRQUFRLEVBQ2hCLFlBQVksc0JBQXNCLEVBQ2xDLE9BQU8sQ0FBQyxTQUFTO0FBQ2hCLFlBQVEsSUFBSSxRQUFRO0FBQUEsRUFDdEIsQ0FBQztBQUNMOzs7QUNSTyxJQUFNLGVBQWUsQ0FBQ0MsYUFBcUI7QUFDaEQsRUFBQUEsU0FBUSxRQUFRLE1BQU0sRUFBRSxZQUFZLGNBQWM7QUFDcEQ7OztBQ0ZPLElBQU0saUJBQWlCLENBQUNDLGFBQXFCO0FBQ2xELEVBQUFBLFNBQVEsUUFBUSxRQUFRLEVBQUUsWUFBWSxvQ0FBb0M7QUFDNUU7OztBQ0RPLElBQU0sc0JBQXNCLENBQUNDLGFBQXFCO0FBQ3ZELEVBQUFBLFNBQVEsU0FDTCxLQUFLLENBQUMsTUFBTSxFQUFFLEtBQUssTUFBTSxRQUFRLEVBQ2pDLFFBQVEsT0FBTyxFQUNmLFlBQVksMEJBQTBCLEVBQ3RDLE9BQU8sTUFBTTtBQUNaLFlBQVEsSUFBSSxLQUFLLFVBQVUsVUFBVSxLQUFLLE1BQU0sQ0FBQyxDQUFDO0FBQUEsRUFDcEQsQ0FBQztBQUNMOzs7QWJIQSxTQUFTLGtCQUFrQjtBQUUzQixJQUFNLFVBQVUsSUFBSSxRQUFRO0FBRTVCLFFBQ0csS0FBSyxNQUFNLEVBQ1gsWUFBWSx1Q0FBdUMsRUFDbkQsUUFBUSxPQUFPO0FBRWxCLFlBQVksT0FBTztBQUVuQixhQUFhLE9BQU87QUFDcEIsa0JBQWtCLE9BQU87QUFDekIsbUJBQW1CLE9BQU87QUFFMUIsZUFBZSxPQUFPO0FBQ3RCLG9CQUFvQixPQUFPO0FBRTNCLElBQUksUUFBUSxLQUFLLFdBQVcsR0FBRztBQUM3QixhQUFXLFNBQVMsUUFBUSxJQUFJO0FBQ2xDLE9BQU87QUFDTCxVQUFRLE1BQU07QUFDaEI7IiwKICAibmFtZXMiOiBbInBhdGgiLCAiZnMiLCAiY3JlYXRlU2VydmVyIiwgInJlc29sdmUiLCAicGF0aCIsICJmcyIsICJmcyIsICJwYXRoIiwgInRzIiwgInByb2dyYW0iLCAiY3JlYXRlU2VydmVyIiwgImZpbGUiLCAicHJvZ3JhbSIsICJreSIsICJwcm9ncmFtIiwgInByb2dyYW0iLCAicHJvZ3JhbSIsICJwcm9ncmFtIl0KfQo=
|
|
582
|
+
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vY2xpL21haW4udHMiLCAiLi4vY2xpL2Rldi9yZWdpc3Rlci50cyIsICIuLi9saWIvc2VydmVyL2NyZWF0ZVNlcnZlci50cyIsICIuLi9wYWNrYWdlLmpzb24iLCAiLi4vbGliL3NpdGUvZ2V0SW5kZXgudHMiLCAiLi4vbGliL2RlcGVuZGVuY3ktYW5hbHlzaXMvZ2V0TG9jYWxGaWxlRGVwZW5kZW5jaWVzLnRzIiwgIi4uL2xpYi9kZXBlbmRlbmN5LWFuYWx5c2lzL2luc3RhbGxOb2RlTW9kdWxlVHlwZXMudHMiLCAiLi4vbGliL3NlcnZlci9FdmVudHNXYXRjaGVyLnRzIiwgIi4uL2xpYi9jbGktY29uZmlnL2luZGV4LnRzIiwgIi4uL2NsaS9hdXRoL2xvZ2luL3JlZ2lzdGVyLnRzIiwgIi4uL2xpYi9yZWdpc3RyeS1hcGkvZ2V0LWt5LnRzIiwgIi4uL2NsaS9hdXRoL2xvZ291dC9yZWdpc3Rlci50cyIsICIuLi9jbGkvYXV0aC9yZWdpc3Rlci50cyIsICIuLi9jbGkvY29uZmlnL3JlZ2lzdGVyLnRzIiwgIi4uL2NsaS9jb25maWcvcHJpbnQvcmVnaXN0ZXIudHMiLCAiLi4vY2xpL2Nsb25lL3JlZ2lzdGVyLnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyIjIS91c3IvYmluL2VudiBub2RlXG5pbXBvcnQgeyBDb21tYW5kIH0gZnJvbSBcImNvbW1hbmRlclwiXG5pbXBvcnQgeyByZWdpc3RlckRldiB9IGZyb20gXCIuL2Rldi9yZWdpc3RlclwiXG5pbXBvcnQgeyByZWdpc3RlckF1dGhMb2dpbiB9IGZyb20gXCIuL2F1dGgvbG9naW4vcmVnaXN0ZXJcIlxuaW1wb3J0IHsgcmVnaXN0ZXJBdXRoTG9nb3V0IH0gZnJvbSBcIi4vYXV0aC9sb2dvdXQvcmVnaXN0ZXJcIlxuaW1wb3J0IHsgcmVnaXN0ZXJBdXRoIH0gZnJvbSBcIi4vYXV0aC9yZWdpc3RlclwiXG5pbXBvcnQgeyByZWdpc3RlckNvbmZpZyB9IGZyb20gXCIuL2NvbmZpZy9yZWdpc3RlclwiXG5pbXBvcnQgeyByZWdpc3RlckNvbmZpZ1ByaW50IH0gZnJvbSBcIi4vY29uZmlnL3ByaW50L3JlZ2lzdGVyXCJcbmltcG9ydCB7IHJlZ2lzdGVyQ2xvbmUgfSBmcm9tIFwiLi9jbG9uZS9yZWdpc3RlclwiXG5pbXBvcnQgeyBwZXJmZWN0Q2xpIH0gZnJvbSBcInBlcmZlY3QtY2xpXCJcblxuY29uc3QgcHJvZ3JhbSA9IG5ldyBDb21tYW5kKClcblxucHJvZ3JhbVxuICAubmFtZShcInRzY2lcIilcbiAgLmRlc2NyaXB0aW9uKFwiQ0xJIGZvciBkZXZlbG9waW5nIHRzY2lyY3VpdCBzbmlwcGV0c1wiKVxuICAudmVyc2lvbihcIjEuMC4wXCIpXG5cbnJlZ2lzdGVyRGV2KHByb2dyYW0pXG5yZWdpc3RlckNsb25lKHByb2dyYW0pXG5cbnJlZ2lzdGVyQXV0aChwcm9ncmFtKVxucmVnaXN0ZXJBdXRoTG9naW4ocHJvZ3JhbSlcbnJlZ2lzdGVyQXV0aExvZ291dChwcm9ncmFtKVxuXG5yZWdpc3RlckNvbmZpZyhwcm9ncmFtKVxucmVnaXN0ZXJDb25maWdQcmludChwcm9ncmFtKVxuXG5pZiAocHJvY2Vzcy5hcmd2Lmxlbmd0aCA9PT0gMikge1xuICBwZXJmZWN0Q2xpKHByb2dyYW0sIHByb2Nlc3MuYXJndilcbn0gZWxzZSB7XG4gIHByb2dyYW0ucGFyc2UoKVxufVxuIiwgImltcG9ydCB0eXBlIHsgQ29tbWFuZCB9IGZyb20gXCJjb21tYW5kZXJcIlxuaW1wb3J0ICogYXMgcGF0aCBmcm9tIFwibm9kZTpwYXRoXCJcbmltcG9ydCAqIGFzIGNob2tpZGFyIGZyb20gXCJjaG9raWRhclwiXG5pbXBvcnQgKiBhcyBmcyBmcm9tIFwibm9kZTpmc1wiXG5pbXBvcnQgeyBjcmVhdGVTZXJ2ZXIgfSBmcm9tIFwibGliL3NlcnZlci9jcmVhdGVTZXJ2ZXJcIlxuaW1wb3J0IHsgZ2V0TG9jYWxGaWxlRGVwZW5kZW5jaWVzIH0gZnJvbSBcImxpYi9kZXBlbmRlbmN5LWFuYWx5c2lzL2dldExvY2FsRmlsZURlcGVuZGVuY2llc1wiXG5pbXBvcnQgeyBpbnN0YWxsVHlwZXMgfSBmcm9tIFwiLi4vLi4vbGliL2RlcGVuZGVuY3ktYW5hbHlzaXMvaW5zdGFsbE5vZGVNb2R1bGVUeXBlc1wiXG5pbXBvcnQgeyBFdmVudHNXYXRjaGVyIH0gZnJvbSBcIi4uLy4uL2xpYi9zZXJ2ZXIvRXZlbnRzV2F0Y2hlclwiXG5cbmV4cG9ydCBjb25zdCByZWdpc3RlckRldiA9IChwcm9ncmFtOiBDb21tYW5kKSA9PiB7XG4gIHByb2dyYW1cbiAgICAuY29tbWFuZChcImRldlwiKVxuICAgIC5kZXNjcmlwdGlvbihcIlN0YXJ0IGRldmVsb3BtZW50IHNlcnZlciBmb3IgYSBzbmlwcGV0XCIpXG4gICAgLmFyZ3VtZW50KFwiPGZpbGU+XCIsIFwiUGF0aCB0byB0aGUgc25pcHBldCBmaWxlXCIpXG4gICAgLm9wdGlvbihcIi1wLCAtLXBvcnQgPG51bWJlcj5cIiwgXCJQb3J0IHRvIHJ1biBzZXJ2ZXIgb25cIiwgXCIzMDAwXCIpXG4gICAgLmFjdGlvbihhc3luYyAoZmlsZTogc3RyaW5nLCBvcHRpb25zOiB7IHBvcnQ6IHN0cmluZyB9KSA9PiB7XG4gICAgICBjb25zdCBhYnNvbHV0ZVBhdGggPSBwYXRoLnJlc29sdmUoZmlsZSlcbiAgICAgIGNvbnN0IGZpbGVEaXIgPSBwYXRoLmRpcm5hbWUoYWJzb2x1dGVQYXRoKVxuICAgICAgY29uc3QgcG9ydCA9IHBhcnNlSW50KG9wdGlvbnMucG9ydClcblxuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc29sZS5sb2coXCJJbnN0YWxsaW5nIHR5cGVzIGZvciBpbXBvcnRlZCBzbmlwcGV0cy4uLlwiKVxuICAgICAgICBhd2FpdCBpbnN0YWxsVHlwZXMoYWJzb2x1dGVQYXRoKVxuICAgICAgICBjb25zb2xlLmxvZyhcIlR5cGVzIGluc3RhbGxlZCBzdWNjZXNzZnVsbHlcIilcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIGNvbnNvbGUud2FybihcIkZhaWxlZCB0byBpbnN0YWxsIHR5cGVzOlwiLCBlcnJvcilcbiAgICAgIH1cblxuICAgICAgLy8gU3RhcnQgdGhlIHNlcnZlclxuICAgICAgYXdhaXQgY3JlYXRlU2VydmVyKHBvcnQpXG5cbiAgICAgIGNvbnN0IGV2ZW50c1dhdGNoZXIgPSBuZXcgRXZlbnRzV2F0Y2hlcihgaHR0cDovL2xvY2FsaG9zdDoke3BvcnR9YClcbiAgICAgIGV2ZW50c1dhdGNoZXIuc3RhcnQoKVxuXG4gICAgICBhd2FpdCBmZXRjaChgaHR0cDovL2xvY2FsaG9zdDoke3BvcnR9L2FwaS9maWxlcy91cHNlcnRgLCB7XG4gICAgICAgIG1ldGhvZDogXCJQT1NUXCIsXG4gICAgICAgIGhlYWRlcnM6IHsgXCJDb250ZW50LVR5cGVcIjogXCJhcHBsaWNhdGlvbi9qc29uXCIgfSxcbiAgICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkoe1xuICAgICAgICAgIGZpbGVfcGF0aDogXCJlbnRyeXBvaW50LnRzeFwiLFxuICAgICAgICAgIHRleHRfY29udGVudDogYFxuaW1wb3J0IE15Q2lyY3VpdCBmcm9tIFwiLi9zbmlwcGV0LnRzeFwiXG5cbmNpcmN1aXQuYWRkKDxNeUNpcmN1aXQgLz4pXG5gLFxuICAgICAgICB9KSxcbiAgICAgIH0pXG5cbiAgICAgIC8vIEZ1bmN0aW9uIHRvIHVwZGF0ZSBmaWxlIGNvbnRlbnRcbiAgICAgIGNvbnN0IHVwZGF0ZUZpbGUgPSBhc3luYyAoZmlsZVBhdGg6IHN0cmluZykgPT4ge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGNvbnN0IGNvbnRlbnQgPSBhd2FpdCBmcy5wcm9taXNlcy5yZWFkRmlsZShmaWxlUGF0aCwgXCJ1dGYtOFwiKVxuICAgICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2goXG4gICAgICAgICAgICBgaHR0cDovL2xvY2FsaG9zdDoke3BvcnR9L2FwaS9maWxlcy91cHNlcnRgLFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBtZXRob2Q6IFwiUE9TVFwiLFxuICAgICAgICAgICAgICBoZWFkZXJzOiB7IFwiQ29udGVudC1UeXBlXCI6IFwiYXBwbGljYXRpb24vanNvblwiIH0sXG4gICAgICAgICAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KHtcbiAgICAgICAgICAgICAgICBmaWxlX3BhdGg6IHBhdGgucmVsYXRpdmUoZmlsZURpciwgZmlsZVBhdGgpLFxuICAgICAgICAgICAgICAgIHRleHRfY29udGVudDogY29udGVudCxcbiAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIClcbiAgICAgICAgICBpZiAoIXJlc3BvbnNlLm9rKSB7XG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKGBGYWlsZWQgdG8gdXBkYXRlICR7ZmlsZVBhdGh9YClcbiAgICAgICAgICB9XG4gICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgY29uc29sZS5lcnJvcihgRXJyb3IgdXBkYXRpbmcgJHtmaWxlUGF0aH06YCwgZXJyb3IpXG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gR2V0IGluaXRpYWwgZGVwZW5kZW5jaWVzXG4gICAgICBjb25zdCBkZXBlbmRlbmNpZXMgPSBuZXcgU2V0KFthYnNvbHV0ZVBhdGhdKVxuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgZGVwcyA9IGdldExvY2FsRmlsZURlcGVuZGVuY2llcyhhYnNvbHV0ZVBhdGgpXG4gICAgICAgIGRlcHMuZm9yRWFjaCgoZGVwKSA9PiBkZXBlbmRlbmNpZXMuYWRkKGRlcCkpXG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBjb25zb2xlLndhcm4oXCJGYWlsZWQgdG8gYW5hbHl6ZSBkZXBlbmRlbmNpZXM6XCIsIGVycm9yKVxuICAgICAgfVxuXG4gICAgICAvLyBXYXRjaCB0aGUgbWFpbiBmaWxlIGFuZCBpdHMgZGVwZW5kZW5jaWVzXG4gICAgICBjb25zdCBmaWxlc3lzdGVtV2F0Y2hlciA9IGNob2tpZGFyLndhdGNoKEFycmF5LmZyb20oZGVwZW5kZW5jaWVzKSwge1xuICAgICAgICBwZXJzaXN0ZW50OiB0cnVlLFxuICAgICAgICBpZ25vcmVJbml0aWFsOiBmYWxzZSxcbiAgICAgIH0pXG5cbiAgICAgIGZpbGVzeXN0ZW1XYXRjaGVyLm9uKFwiY2hhbmdlXCIsIGFzeW5jIChmaWxlUGF0aCkgPT4ge1xuICAgICAgICBjb25zb2xlLmxvZyhgRmlsZSAke2ZpbGVQYXRofSBjaGFuZ2VkYClcbiAgICAgICAgYXdhaXQgdXBkYXRlRmlsZShmaWxlUGF0aClcbiAgICAgIH0pXG5cbiAgICAgIGZpbGVzeXN0ZW1XYXRjaGVyLm9uKFwiYWRkXCIsIGFzeW5jIChmaWxlUGF0aCkgPT4ge1xuICAgICAgICBjb25zb2xlLmxvZyhgRmlsZSAke2ZpbGVQYXRofSBhZGRlZGApXG4gICAgICAgIGF3YWl0IHVwZGF0ZUZpbGUoZmlsZVBhdGgpXG4gICAgICB9KVxuXG4gICAgICBldmVudHNXYXRjaGVyLm9uKFwiRklMRV9VUERBVEVEXCIsIGFzeW5jIChldikgPT4ge1xuICAgICAgICBpZiAoZXYuZmlsZV9wYXRoID09PSBcIm1hbnVhbC1lZGl0cy5qc29uXCIpIHtcbiAgICAgICAgICBjb25zb2xlLmxvZyhcIk1hbnVhbCBlZGl0cyB1cGRhdGVkLCB1cGRhdGluZyBvbiBmaWxlc3lzdGVtLi4uXCIpXG4gICAgICAgICAgY29uc3QgeyBmaWxlIH0gPSBhd2FpdCBmZXRjaChcbiAgICAgICAgICAgIGBodHRwOi8vbG9jYWxob3N0OiR7cG9ydH0vYXBpL2ZpbGVzL2dldD9maWxlX3BhdGg9bWFudWFsLWVkaXRzLmpzb25gLFxuICAgICAgICAgICkudGhlbigocikgPT4gci5qc29uKCkpXG4gICAgICAgICAgZnMud3JpdGVGaWxlU3luYyhcbiAgICAgICAgICAgIHBhdGguam9pbihmaWxlRGlyLCBcIm1hbnVhbC1lZGl0cy5qc29uXCIpLFxuICAgICAgICAgICAgZmlsZS50ZXh0X2NvbnRlbnQsXG4gICAgICAgICAgKVxuICAgICAgICB9XG4gICAgICB9KVxuXG4gICAgICBjb25zb2xlLmxvZyhgV2F0Y2hpbmcgJHtmaWxlfSBhbmQgaXRzIGRlcGVuZGVuY2llcy4uLmApXG4gICAgfSlcbn1cbiIsICJpbXBvcnQgKiBhcyBodHRwIGZyb20gXCJub2RlOmh0dHBcIlxuaW1wb3J0ICogYXMgZnMgZnJvbSBcIm5vZGU6ZnNcIlxuaW1wb3J0ICogYXMgcGF0aCBmcm9tIFwibm9kZTpwYXRoXCJcbmltcG9ydCB7IGdldE5vZGVIYW5kbGVyIH0gZnJvbSBcIndpbnRlcnNwZWMvYWRhcHRlcnMvbm9kZVwiXG5pbXBvcnQgcGtnIGZyb20gXCIuLi8uLi9wYWNrYWdlLmpzb25cIlxuXG4vLyBAdHMtaWdub3JlXG5pbXBvcnQgd2ludGVyc3BlY0J1bmRsZSBmcm9tIFwiQHRzY2lyY3VpdC9maWxlLXNlcnZlci9kaXN0L2J1bmRsZS5qc1wiXG5pbXBvcnQgeyBnZXRJbmRleCB9IGZyb20gXCIuLi9zaXRlL2dldEluZGV4XCJcblxuZXhwb3J0IGNvbnN0IGNyZWF0ZVNlcnZlciA9IGFzeW5jIChwb3J0OiBudW1iZXIgPSAzMDAwKSA9PiB7XG4gIGNvbnN0IGZpbGVTZXJ2ZXJIYW5kbGVyID0gZ2V0Tm9kZUhhbmRsZXIod2ludGVyc3BlY0J1bmRsZSBhcyBhbnksIHt9KVxuXG4gIGNvbnN0IHNlcnZlciA9IGh0dHAuY3JlYXRlU2VydmVyKGFzeW5jIChyZXEsIHJlcykgPT4ge1xuICAgIGNvbnN0IHVybCA9IG5ldyBVUkwocmVxLnVybCEsIGBodHRwOi8vJHtyZXEuaGVhZGVycy5ob3N0fWApXG5cbiAgICBpZiAodXJsLnBhdGhuYW1lID09PSBcIi9zdGFuZGFsb25lLm1pbi5qc1wiKSB7XG4gICAgICBjb25zdCBzdGFuZGFsb25lRmlsZVBhdGggPVxuICAgICAgICBwcm9jZXNzLmVudi5SVU5GUkFNRV9TVEFOREFMT05FX0ZJTEVfUEFUSCB8fFxuICAgICAgICBwYXRoLnJlc29sdmUoXG4gICAgICAgICAgcHJvY2Vzcy5jd2QoKSxcbiAgICAgICAgICBcIm5vZGVfbW9kdWxlc1wiLFxuICAgICAgICAgIFwiQHRzY2lyY3VpdC9ydW5mcmFtZS9kaXN0L3N0YW5kYWxvbmUubWluLmpzXCIsXG4gICAgICAgIClcblxuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgY29udGVudCA9IGZzLnJlYWRGaWxlU3luYyhzdGFuZGFsb25lRmlsZVBhdGgsIFwidXRmOFwiKVxuICAgICAgICByZXMud3JpdGVIZWFkKDIwMCwge1xuICAgICAgICAgIFwiQ29udGVudC1UeXBlXCI6IFwiYXBwbGljYXRpb24vamF2YXNjcmlwdDsgY2hhcnNldD11dGYtOFwiLFxuICAgICAgICB9KVxuICAgICAgICByZXMuZW5kKGNvbnRlbnQpXG4gICAgICAgIHJldHVyblxuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgY29uc29sZS5lcnJvcihcIkVycm9yIHNlcnZpbmcgc3RhbmRhbG9uZS5taW4uanM6XCIsIGVycm9yKVxuICAgICAgfVxuXG4gICAgICByZXMud3JpdGVIZWFkKDMwMiwge1xuICAgICAgICBMb2NhdGlvbjogYGh0dHBzOi8vY2RuLmpzZGVsaXZyLm5ldC9ucG0vQHRzY2lyY3VpdC9ydW5mcmFtZUAke3BrZy5kZXBlbmRlbmNpZXNbXCJAdHNjaXJjdWl0L3J1bmZyYW1lXCJdLnJlcGxhY2UoL15bXjAtOV0rLywgXCJcIil9L2Rpc3Qvc3RhbmRhbG9uZS5taW4uanNgLFxuICAgICAgfSlcbiAgICAgIHJlcy5lbmQoKVxuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgaWYgKHVybC5wYXRobmFtZSA9PT0gXCIvXCIpIHtcbiAgICAgIGNvbnN0IGh0bWwgPSBhd2FpdCBnZXRJbmRleCgpXG4gICAgICByZXMud3JpdGVIZWFkKDIwMCwgeyBcIkNvbnRlbnQtVHlwZVwiOiBcInRleHQvaHRtbFwiIH0pXG4gICAgICByZXMuZW5kKGh0bWwpXG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBpZiAodXJsLnBhdGhuYW1lLnN0YXJ0c1dpdGgoXCIvYXBpL1wiKSkge1xuICAgICAgcmVxLnVybCA9IHJlcS51cmwhLnJlcGxhY2UoXCIvYXBpL1wiLCBcIi9cIilcbiAgICAgIGZpbGVTZXJ2ZXJIYW5kbGVyKHJlcSwgcmVzKVxuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgcmVzLndyaXRlSGVhZCg0MDQpXG4gICAgcmVzLmVuZChcIk5vdCBmb3VuZFwiKVxuICB9KVxuXG4gIHJldHVybiBuZXcgUHJvbWlzZTx2b2lkPigocmVzb2x2ZSkgPT4ge1xuICAgIHNlcnZlci5saXN0ZW4ocG9ydCwgKCkgPT4ge1xuICAgICAgY29uc29sZS5sb2coYFNlcnZlciBydW5uaW5nIGF0IGh0dHA6Ly9sb2NhbGhvc3Q6JHtwb3J0fWApXG4gICAgICByZXNvbHZlKClcbiAgICB9KVxuICB9KVxufVxuIiwgIntcbiAgXCJuYW1lXCI6IFwiQHRzY2lyY3VpdC9jbGlcIixcbiAgXCJtYWluXCI6IFwiZGlzdC9tYWluLmpzXCIsXG4gIFwidHlwZVwiOiBcIm1vZHVsZVwiLFxuICBcInZlcnNpb25cIjogXCIwLjEuMlwiLFxuICBcImJpblwiOiB7XG4gICAgXCJ0c2NpXCI6IFwiLi9kaXN0L21haW4uanNcIlxuICB9LFxuICBcInNjcmlwdHNcIjoge1xuICAgIFwic3RhcnRcIjogXCJidW4gcnVuIGRldlwiLFxuICAgIFwiZGV2XCI6IFwiYnVuIC0taG90IC4vY2xpL21haW4udHMgZGV2IC4vZXhhbXBsZS1kaXIvc25pcHBldC50c3hcIixcbiAgICBcImJ1aWxkXCI6IFwidHN1cC1ub2RlIGNsaS9tYWluLnRzIC0tZm9ybWF0IGVzbSAtLXNvdXJjZW1hcCBpbmxpbmVcIixcbiAgICBcImZvcm1hdFwiOiBcImJpb21lIGZvcm1hdCAtLXdyaXRlIC5cIixcbiAgICBcImZvcm1hdDpjaGVja1wiOiBcImJpb21lIGZvcm1hdCAuXCIsXG4gICAgXCJjbGlcIjogXCJidW4gLi9jbGkvbWFpbi50c1wiXG4gIH0sXG4gIFwiZGV2RGVwZW5kZW5jaWVzXCI6IHtcbiAgICBcIkBiaW9tZWpzL2Jpb21lXCI6IFwiXjEuOS40XCIsXG4gICAgXCJAdHNjaXJjdWl0L2NvcmVcIjogXCJeMC4wLjI0OVwiLFxuICAgIFwiQHR5cGVzL2J1blwiOiBcImxhdGVzdFwiLFxuICAgIFwiQHR5cGVzL2NvbmZpZ3N0b3JlXCI6IFwiXjYuMC4yXCIsXG4gICAgXCJAdHlwZXMvcmVhY3RcIjogXCJeMTkuMC4xXCIsXG4gICAgXCJ0c3VwXCI6IFwiXjguMy41XCJcbiAgfSxcbiAgXCJwZWVyRGVwZW5kZW5jaWVzXCI6IHtcbiAgICBcInR5cGVzY3JpcHRcIjogXCJeNS4wLjBcIlxuICB9LFxuICBcImRlcGVuZGVuY2llc1wiOiB7XG4gICAgXCJAdHNjaXJjdWl0L2ZpbGUtc2VydmVyXCI6IFwiXjAuMC4xMVwiLFxuICAgIFwiQHRzY2lyY3VpdC9ydW5mcmFtZVwiOiBcIl4wLjAuNDdcIixcbiAgICBcImNob2tpZGFyXCI6IFwiXjQuMC4xXCIsXG4gICAgXCJjb21tYW5kZXJcIjogXCJeMTIuMS4wXCIsXG4gICAgXCJjb25maWdzdG9yZVwiOiBcIl43LjAuMFwiLFxuICAgIFwiY29zbWljb25maWdcIjogXCJeOS4wLjBcIixcbiAgICBcImRlbGF5XCI6IFwiXjYuMC4wXCIsXG4gICAgXCJreVwiOiBcIl4xLjcuNFwiLFxuICAgIFwicGVyZmVjdC1jbGlcIjogXCJeMS4wLjIwXCJcbiAgfVxufVxuIiwgImltcG9ydCBwa2cgZnJvbSBcIi4uLy4uL3BhY2thZ2UuanNvblwiXG5cbmV4cG9ydCBjb25zdCBnZXRJbmRleCA9IGFzeW5jICgpID0+IHtcbiAgcmV0dXJuIGA8aHRtbD5cbiAgICA8aGVhZD5cbiAgICA8L2hlYWQ+XG4gICAgPGJvZHk+XG4gICAgICA8c2NyaXB0IHNyYz1cImh0dHBzOi8vY2RuLnRhaWx3aW5kY3NzLmNvbVwiPjwvc2NyaXB0PlxuICAgICAgPGRpdiBpZD1cInJvb3RcIj5sb2FkaW5nLi4uPC9kaXY+XG4gICAgICA8c2NyaXB0PlxuICAgICAgZ2xvYmFsVGhpcy5wcm9jZXNzID0geyBlbnY6IHsgTk9ERV9FTlY6IFwicHJvZHVjdGlvblwiIH0gfVxuICAgICAgPC9zY3JpcHQ+XG4gICAgICA8c2NyaXB0IHNyYz1cIi9zdGFuZGFsb25lLm1pbi5qc1wiPjwvc2NyaXB0PlxuICAgIDwvYm9keT5cbiAgPC9odG1sPmBcbn1cblxuLy8gPHNjcmlwdCBzcmM9XCJodHRwczovL2Nkbi5qc2RlbGl2ci5uZXQvbnBtL0B0c2NpcmN1aXQvcnVuZnJhbWVAJHtwa2cuZGVwZW5kZW5jaWVzW1wiQHRzY2lyY3VpdC9ydW5mcmFtZVwiXS5yZXBsYWNlKC9eW14wLTldKy8sIFwiXCIpfS9kaXN0L3N0YW5kYWxvbmUubWluLmpzXCI+PC9zY3JpcHQ+XG4iLCAiaW1wb3J0ICogYXMgdHMgZnJvbSBcInR5cGVzY3JpcHRcIlxuaW1wb3J0ICogYXMgcGF0aCBmcm9tIFwicGF0aFwiXG5pbXBvcnQgKiBhcyBmcyBmcm9tIFwiZnNcIlxuXG5mdW5jdGlvbiBnZXRMb2NhbEZpbGVEZXBlbmRlbmNpZXMocGF0aFRvVHN4RmlsZTogc3RyaW5nKTogc3RyaW5nW10ge1xuICAvLyBFbnN1cmUgYWJzb2x1dGUgcGF0aFxuICBjb25zdCBhYnNvbHV0ZVBhdGggPSBwYXRoLnJlc29sdmUocGF0aFRvVHN4RmlsZSlcbiAgY29uc3QgYmFzZURpciA9IHBhdGguZGlybmFtZShhYnNvbHV0ZVBhdGgpXG5cbiAgLy8gUmVhZCBhbmQgcGFyc2UgdGhlIGZpbGVcbiAgY29uc3QgY29udGVudCA9IGZzLnJlYWRGaWxlU3luYyhhYnNvbHV0ZVBhdGgsIFwidXRmLThcIilcbiAgY29uc3Qgc291cmNlRmlsZSA9IHRzLmNyZWF0ZVNvdXJjZUZpbGUoXG4gICAgYWJzb2x1dGVQYXRoLFxuICAgIGNvbnRlbnQsXG4gICAgdHMuU2NyaXB0VGFyZ2V0LkxhdGVzdCxcbiAgICB0cnVlLFxuICApXG5cbiAgY29uc3QgZGVwZW5kZW5jaWVzID0gbmV3IFNldDxzdHJpbmc+KClcblxuICAvLyBSZWN1cnNpdmVseSB2aXNpdCBub2RlcyB0byBmaW5kIGltcG9ydHNcbiAgZnVuY3Rpb24gdmlzaXQobm9kZTogdHMuTm9kZSkge1xuICAgIGlmICh0cy5pc0ltcG9ydERlY2xhcmF0aW9uKG5vZGUpIHx8IHRzLmlzRXhwb3J0RGVjbGFyYXRpb24obm9kZSkpIHtcbiAgICAgIGNvbnN0IG1vZHVsZVNwZWNpZmllciA9IG5vZGUubW9kdWxlU3BlY2lmaWVyXG4gICAgICBpZiAobW9kdWxlU3BlY2lmaWVyICYmIHRzLmlzU3RyaW5nTGl0ZXJhbChtb2R1bGVTcGVjaWZpZXIpKSB7XG4gICAgICAgIGNvbnN0IGltcG9ydFBhdGggPSBtb2R1bGVTcGVjaWZpZXIudGV4dFxuICAgICAgICAvLyBPbmx5IHByb2Nlc3MgbG9jYWwgaW1wb3J0cyAoc3RhcnRpbmcgd2l0aCAuIG9yIC4uKVxuICAgICAgICBpZiAoaW1wb3J0UGF0aC5zdGFydHNXaXRoKFwiLlwiKSkge1xuICAgICAgICAgIHJlc29sdmVBbmRBZGREZXBlbmRlbmN5KGltcG9ydFBhdGgpXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBIYW5kbGUgZHluYW1pYyBpbXBvcnRzXG4gICAgaWYgKFxuICAgICAgdHMuaXNDYWxsRXhwcmVzc2lvbihub2RlKSAmJlxuICAgICAgbm9kZS5leHByZXNzaW9uLmtpbmQgPT09IHRzLlN5bnRheEtpbmQuSW1wb3J0S2V5d29yZFxuICAgICkge1xuICAgICAgY29uc3QgYXJndW1lbnQgPSBub2RlLmFyZ3VtZW50c1swXVxuICAgICAgaWYgKGFyZ3VtZW50ICYmIHRzLmlzU3RyaW5nTGl0ZXJhbChhcmd1bWVudCkpIHtcbiAgICAgICAgY29uc3QgaW1wb3J0UGF0aCA9IGFyZ3VtZW50LnRleHRcbiAgICAgICAgaWYgKGltcG9ydFBhdGguc3RhcnRzV2l0aChcIi5cIikpIHtcbiAgICAgICAgICByZXNvbHZlQW5kQWRkRGVwZW5kZW5jeShpbXBvcnRQYXRoKVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgdHMuZm9yRWFjaENoaWxkKG5vZGUsIHZpc2l0KVxuICB9XG5cbiAgLy8gSGVscGVyIHRvIHJlc29sdmUgYW5kIGFkZCBkZXBlbmRlbmN5IHBhdGhzXG4gIGZ1bmN0aW9uIHJlc29sdmVBbmRBZGREZXBlbmRlbmN5KGltcG9ydFBhdGg6IHN0cmluZykge1xuICAgIGNvbnN0IGV4dGVuc2lvbnMgPSBbXG4gICAgICBcIi50c3hcIixcbiAgICAgIFwiLnRzXCIsXG4gICAgICBcIi5qc3hcIixcbiAgICAgIFwiLmpzXCIsXG4gICAgICBcIi5jc3NcIixcbiAgICAgIFwiLnNjc3NcIixcbiAgICAgIFwiLnNhc3NcIixcbiAgICAgIFwiLmxlc3NcIixcbiAgICBdXG4gICAgbGV0IHJlc29sdmVkUGF0aCA9IHBhdGgucmVzb2x2ZShiYXNlRGlyLCBpbXBvcnRQYXRoKVxuXG4gICAgLy8gQ2hlY2sgaWYgcGF0aCBleGlzdHMgYXMtaXNcbiAgICBpZiAoZnMuZXhpc3RzU3luYyhyZXNvbHZlZFBhdGgpKSB7XG4gICAgICBkZXBlbmRlbmNpZXMuYWRkKHJlc29sdmVkUGF0aClcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIC8vIFRyeSB3aXRoIGV4dGVuc2lvbnNcbiAgICBmb3IgKGNvbnN0IGV4dCBvZiBleHRlbnNpb25zKSB7XG4gICAgICBjb25zdCBwYXRoV2l0aEV4dCA9IHJlc29sdmVkUGF0aCArIGV4dFxuICAgICAgaWYgKGZzLmV4aXN0c1N5bmMocGF0aFdpdGhFeHQpKSB7XG4gICAgICAgIGRlcGVuZGVuY2llcy5hZGQocGF0aFdpdGhFeHQpXG4gICAgICAgIHJldHVyblxuICAgICAgfVxuICAgIH1cblxuICAgIC8vIENoZWNrIGZvciBpbmRleCBmaWxlcyBpbiBkaXJlY3Rvcmllc1xuICAgIGlmIChcbiAgICAgIGZzLmV4aXN0c1N5bmMocmVzb2x2ZWRQYXRoKSAmJlxuICAgICAgZnMuc3RhdFN5bmMocmVzb2x2ZWRQYXRoKS5pc0RpcmVjdG9yeSgpXG4gICAgKSB7XG4gICAgICBmb3IgKGNvbnN0IGV4dCBvZiBleHRlbnNpb25zKSB7XG4gICAgICAgIGNvbnN0IGluZGV4UGF0aCA9IHBhdGguam9pbihyZXNvbHZlZFBhdGgsIGBpbmRleCR7ZXh0fWApXG4gICAgICAgIGlmIChmcy5leGlzdHNTeW5jKGluZGV4UGF0aCkpIHtcbiAgICAgICAgICBkZXBlbmRlbmNpZXMuYWRkKGluZGV4UGF0aClcbiAgICAgICAgICByZXR1cm5cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8vIFN0YXJ0IHRoZSB0cmF2ZXJzYWxcbiAgdmlzaXQoc291cmNlRmlsZSlcblxuICByZXR1cm4gQXJyYXkuZnJvbShkZXBlbmRlbmNpZXMpXG59XG5cbmV4cG9ydCB7IGdldExvY2FsRmlsZURlcGVuZGVuY2llcyB9XG4iLCAiaW1wb3J0ICogYXMgZnMgZnJvbSBcIm5vZGU6ZnNcIlxuaW1wb3J0ICogYXMgcGF0aCBmcm9tIFwibm9kZTpwYXRoXCJcbmltcG9ydCAqIGFzIHRzIGZyb20gXCJ0eXBlc2NyaXB0XCJcblxuaW50ZXJmYWNlIFNuaXBwZXRBcGlSZXNwb25zZSB7XG4gIHNuaXBwZXQ6IHtcbiAgICBkdHM6IHN0cmluZ1xuICB9XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBpbnN0YWxsVHlwZXMoc25pcHBldFBhdGg6IHN0cmluZykge1xuICBjb25zdCBjb250ZW50ID0gZnMucmVhZEZpbGVTeW5jKHNuaXBwZXRQYXRoLCBcInV0Zi04XCIpXG4gIGNvbnN0IHNvdXJjZUZpbGUgPSB0cy5jcmVhdGVTb3VyY2VGaWxlKFxuICAgIHNuaXBwZXRQYXRoLFxuICAgIGNvbnRlbnQsXG4gICAgdHMuU2NyaXB0VGFyZ2V0LkxhdGVzdCxcbiAgICB0cnVlLFxuICApXG5cbiAgY29uc3QgaW1wb3J0czogc3RyaW5nW10gPSBbXVxuXG4gIGZ1bmN0aW9uIHZpc2l0KG5vZGU6IHRzLk5vZGUpIHtcbiAgICBpZiAodHMuaXNJbXBvcnREZWNsYXJhdGlvbihub2RlKSkge1xuICAgICAgY29uc3QgbW9kdWxlU3BlY2lmaWVyID0gbm9kZS5tb2R1bGVTcGVjaWZpZXJcbiAgICAgIGlmIChtb2R1bGVTcGVjaWZpZXIgJiYgdHMuaXNTdHJpbmdMaXRlcmFsKG1vZHVsZVNwZWNpZmllcikpIHtcbiAgICAgICAgY29uc3QgaW1wb3J0UGF0aCA9IG1vZHVsZVNwZWNpZmllci50ZXh0XG4gICAgICAgIGlmIChpbXBvcnRQYXRoLnN0YXJ0c1dpdGgoXCJAdHNjaS9cIikpIHtcbiAgICAgICAgICBpbXBvcnRzLnB1c2goaW1wb3J0UGF0aClcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICB0cy5mb3JFYWNoQ2hpbGQobm9kZSwgdmlzaXQpXG4gIH1cblxuICB2aXNpdChzb3VyY2VGaWxlKVxuXG4gIGxldCBwcm9qZWN0Um9vdCA9IHBhdGguZGlybmFtZShzbmlwcGV0UGF0aClcbiAgd2hpbGUgKHByb2plY3RSb290ICE9PSBwYXRoLnBhcnNlKHByb2plY3RSb290KS5yb290KSB7XG4gICAgaWYgKGZzLmV4aXN0c1N5bmMocGF0aC5qb2luKHByb2plY3RSb290LCBcInBhY2thZ2UuanNvblwiKSkpIHtcbiAgICAgIGJyZWFrXG4gICAgfVxuICAgIHByb2plY3RSb290ID0gcGF0aC5kaXJuYW1lKHByb2plY3RSb290KVxuICB9XG5cbiAgZm9yIChjb25zdCBpbXBvcnRQYXRoIG9mIGltcG9ydHMpIHtcbiAgICBjb25zdCBbb3duZXIsIG5hbWVdID0gaW1wb3J0UGF0aC5yZXBsYWNlKFwiQHRzY2kvXCIsIFwiXCIpLnNwbGl0KFwiLlwiKVxuICAgIHRyeSB7XG4gICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGZldGNoKFxuICAgICAgICBgaHR0cHM6Ly9yZWdpc3RyeS1hcGkudHNjaXJjdWl0LmNvbS9zbmlwcGV0cy9nZXQ/b3duZXJfbmFtZT0ke293bmVyfSZ1bnNjb3BlZF9uYW1lPSR7bmFtZX1gLFxuICAgICAgKVxuXG4gICAgICBpZiAoIXJlc3BvbnNlLm9rKSB7XG4gICAgICAgIGNvbnNvbGUud2FybihgRmFpbGVkIHRvIGZldGNoIHR5cGVzIGZvciAke2ltcG9ydFBhdGh9YClcbiAgICAgICAgY29udGludWVcbiAgICAgIH1cblxuICAgICAgY29uc3QgZGF0YTogU25pcHBldEFwaVJlc3BvbnNlID0gYXdhaXQgcmVzcG9uc2UuanNvbigpXG5cbiAgICAgIGlmIChkYXRhLnNuaXBwZXQuZHRzKSB7XG4gICAgICAgIGNvbnN0IHBhY2thZ2VEaXIgPSBwYXRoLmpvaW4oXG4gICAgICAgICAgcHJvamVjdFJvb3QsXG4gICAgICAgICAgXCJub2RlX21vZHVsZXNcIixcbiAgICAgICAgICBcIkB0c2NpXCIsXG4gICAgICAgICAgYCR7b3duZXJ9LiR7bmFtZX1gLFxuICAgICAgICApXG4gICAgICAgIGZzLm1rZGlyU3luYyhwYWNrYWdlRGlyLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KVxuXG4gICAgICAgIGZzLndyaXRlRmlsZVN5bmMocGF0aC5qb2luKHBhY2thZ2VEaXIsIFwiaW5kZXguZC50c1wiKSwgZGF0YS5zbmlwcGV0LmR0cylcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgY29uc29sZS53YXJuKGBFcnJvciBmZXRjaGluZyB0eXBlcyBmb3IgJHtpbXBvcnRQYXRofTpgLCBlcnJvcilcbiAgICB9XG4gIH1cbn1cbiIsICJpbXBvcnQgeyBFdmVudEVtaXR0ZXIgfSBmcm9tIFwiZXZlbnRzXCJcblxuaW50ZXJmYWNlIEV2ZW50IHtcbiAgZXZlbnRfaWQ6IHN0cmluZ1xuICBjcmVhdGVkX2F0OiBzdHJpbmdcbiAgZXZlbnRfdHlwZTogc3RyaW5nXG4gIFtrZXk6IHN0cmluZ106IGFueVxufVxuXG5pbnRlcmZhY2UgRXZlbnRzUmVzcG9uc2Uge1xuICBldmVudF9saXN0OiBFdmVudFtdXG59XG5cbmV4cG9ydCBjbGFzcyBFdmVudHNXYXRjaGVyIGV4dGVuZHMgRXZlbnRFbWl0dGVyIHtcbiAgcHJpdmF0ZSBsYXN0UG9sbFRpbWU6IHN0cmluZ1xuICBwcml2YXRlIHBvbGxJbnRlcnZhbDogbnVtYmVyXG4gIHByaXZhdGUgYmFzZVVybDogc3RyaW5nXG4gIHByaXZhdGUgcG9sbGluZyA9IGZhbHNlXG4gIHByaXZhdGUgdGltZW91dElkPzogTm9kZUpTLlRpbWVvdXRcblxuICBjb25zdHJ1Y3RvcihiYXNlVXJsID0gXCJodHRwOi8vbG9jYWxob3N0OjMwMDBcIiwgcG9sbEludGVydmFsID0gMTAwMCkge1xuICAgIHN1cGVyKClcbiAgICB0aGlzLmJhc2VVcmwgPSBiYXNlVXJsXG4gICAgdGhpcy5wb2xsSW50ZXJ2YWwgPSBwb2xsSW50ZXJ2YWxcbiAgICB0aGlzLmxhc3RQb2xsVGltZSA9IG5ldyBEYXRlKCkudG9JU09TdHJpbmcoKVxuICB9XG5cbiAgYXN5bmMgc3RhcnQoKSB7XG4gICAgaWYgKHRoaXMucG9sbGluZykgcmV0dXJuXG4gICAgdGhpcy5wb2xsaW5nID0gdHJ1ZVxuICAgIGF3YWl0IHRoaXMucG9sbCgpXG4gIH1cblxuICBzdG9wKCkge1xuICAgIHRoaXMucG9sbGluZyA9IGZhbHNlXG4gICAgaWYgKHRoaXMudGltZW91dElkKSB7XG4gICAgICBjbGVhclRpbWVvdXQodGhpcy50aW1lb3V0SWQpXG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBwb2xsKCkge1xuICAgIGlmICghdGhpcy5wb2xsaW5nKSByZXR1cm5cblxuICAgIHRyeSB7XG4gICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGZldGNoKFxuICAgICAgICBgJHt0aGlzLmJhc2VVcmx9L2FwaS9ldmVudHMvbGlzdD9zaW5jZT0ke2VuY29kZVVSSUNvbXBvbmVudCh0aGlzLmxhc3RQb2xsVGltZSl9YCxcbiAgICAgIClcblxuICAgICAgaWYgKCFyZXNwb25zZS5vaykge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEhUVFAgZXJyb3IhIHN0YXR1czogJHtyZXNwb25zZS5zdGF0dXN9YClcbiAgICAgIH1cblxuICAgICAgY29uc3QgZGF0YTogRXZlbnRzUmVzcG9uc2UgPSBhd2FpdCByZXNwb25zZS5qc29uKClcblxuICAgICAgLy8gVXBkYXRlIGxhc3QgcG9sbCB0aW1lIHRvIGxhdGVzdCBldmVudCBvciBjdXJyZW50IHRpbWVcbiAgICAgIGNvbnN0IGxhdGVzdEV2ZW50ID0gZGF0YS5ldmVudF9saXN0W2RhdGEuZXZlbnRfbGlzdC5sZW5ndGggLSAxXVxuICAgICAgdGhpcy5sYXN0UG9sbFRpbWUgPSBsYXRlc3RFdmVudFxuICAgICAgICA/IGxhdGVzdEV2ZW50LmNyZWF0ZWRfYXRcbiAgICAgICAgOiBuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKClcblxuICAgICAgLy8gRW1pdCBldmVudHMgaW4gY2hyb25vbG9naWNhbCBvcmRlclxuICAgICAgZGF0YS5ldmVudF9saXN0LmZvckVhY2goKGV2ZW50KSA9PiB7XG4gICAgICAgIHRoaXMuZW1pdChldmVudC5ldmVudF90eXBlLCBldmVudClcbiAgICAgICAgdGhpcy5lbWl0KFwiKlwiLCBldmVudClcbiAgICAgIH0pXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIHRoaXMuZW1pdChcImVycm9yXCIsIGVycm9yKVxuICAgIH1cbiAgICAvLyBTY2hlZHVsZSBuZXh0IHBvbGxcbiAgICB0aGlzLnRpbWVvdXRJZCA9IGdsb2JhbFRoaXMuc2V0VGltZW91dChcbiAgICAgICgpID0+IHRoaXMucG9sbCgpLFxuICAgICAgdGhpcy5wb2xsSW50ZXJ2YWwsXG4gICAgKSBhcyB1bmtub3duIGFzIE5vZGVKUy5UaW1lb3V0XG4gIH1cbn1cbiIsICJpbXBvcnQgQ29uZmlnc3RvcmUgZnJvbSBcImNvbmZpZ3N0b3JlXCJcbmltcG9ydCB0eXBlIHsgVHlwZWRDb25maWdzdG9yZSB9IGZyb20gXCIuL1R5cGVkQ29uZmlnU3RvcmVcIlxuXG5leHBvcnQgaW50ZXJmYWNlIENsaUNvbmZpZyB7XG4gIHNlc3Npb25Ub2tlbj86IHN0cmluZ1xuICBnaXRodWJVc2VybmFtZT86IHN0cmluZ1xuICByZWdpc3RyeUFwaVVybD86IHN0cmluZ1xufVxuXG5leHBvcnQgY29uc3QgY2xpQ29uZmlnOiBUeXBlZENvbmZpZ3N0b3JlPENsaUNvbmZpZz4gPSBuZXcgQ29uZmlnc3RvcmUoXG4gIFwidHNjaXJjdWl0XCIsXG4pXG5cbmV4cG9ydCBjb25zdCBnZXRSZWdpc3RyeUFwaVVybCA9ICgpOiBzdHJpbmcgPT4ge1xuICByZXR1cm4gY2xpQ29uZmlnLmdldChcInJlZ2lzdHJ5QXBpVXJsXCIpID8/IFwiaHR0cHM6Ly9yZWdpc3RyeS1hcGkudHNjaXJjdWl0LmNvbVwiXG59XG4iLCAiaW1wb3J0IHR5cGUgeyBDb21tYW5kIH0gZnJvbSBcImNvbW1hbmRlclwiXG5pbXBvcnQgeyBjbGlDb25maWcgfSBmcm9tIFwibGliL2NsaS1jb25maWdcIlxuaW1wb3J0IGRlbGF5IGZyb20gXCJkZWxheVwiXG5pbXBvcnQgeyBnZXRLeSB9IGZyb20gXCJsaWIvcmVnaXN0cnktYXBpL2dldC1reVwiXG5pbXBvcnQgdHlwZSB7IEVuZHBvaW50UmVzcG9uc2UgfSBmcm9tIFwibGliL3JlZ2lzdHJ5LWFwaS9lbmRwb2ludC10eXBlc1wiXG5cbmV4cG9ydCBjb25zdCByZWdpc3RlckF1dGhMb2dpbiA9IChwcm9ncmFtOiBDb21tYW5kKSA9PiB7XG4gIHByb2dyYW0uY29tbWFuZHNcbiAgICAuZmluZCgoYykgPT4gYy5uYW1lKCkgPT09IFwiYXV0aFwiKSFcbiAgICAuY29tbWFuZChcImxvZ2luXCIpXG4gICAgLmRlc2NyaXB0aW9uKFwiQXV0aGVudGljYXRlIENMSSwgbG9naW4gdG8gcmVnaXN0cnlcIilcbiAgICAuYWN0aW9uKGFzeW5jIChhcmdzKSA9PiB7XG4gICAgICBjb25zdCBreSA9IGdldEt5KClcblxuICAgICAgY29uc3QgeyBsb2dpbl9wYWdlIH0gPSBhd2FpdCBreVxuICAgICAgICAucG9zdDxFbmRwb2ludFJlc3BvbnNlW1wic2Vzc2lvbnMvbG9naW5fcGFnZS9jcmVhdGVcIl0+KFxuICAgICAgICAgIFwic2Vzc2lvbnMvbG9naW5fcGFnZS9jcmVhdGVcIixcbiAgICAgICAgICB7XG4gICAgICAgICAgICBqc29uOiB7fSxcbiAgICAgICAgICB9LFxuICAgICAgICApXG4gICAgICAgIC5qc29uKClcblxuICAgICAgY29uc29sZS5sb2coXCJQbGVhc2UgdmlzaXQgdGhlIGZvbGxvd2luZyBVUkwgdG8gbG9nIGluOlwiKVxuICAgICAgY29uc29sZS5sb2cobG9naW5fcGFnZS51cmwpXG5cbiAgICAgIC8vIFdhaXQgdW50aWwgd2UgcmVjZWl2ZSBjb25maXJtYXRpb25cbiAgICAgIHdoaWxlICh0cnVlKSB7XG4gICAgICAgIGNvbnN0IHsgbG9naW5fcGFnZTogbmV3X2xvZ2luX3BhZ2UgfSA9IGF3YWl0IGt5XG4gICAgICAgICAgLnBvc3Q8RW5kcG9pbnRSZXNwb25zZVtcInNlc3Npb25zL2xvZ2luX3BhZ2UvZ2V0XCJdPihcbiAgICAgICAgICAgIFwic2Vzc2lvbnMvbG9naW5fcGFnZS9nZXRcIixcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAganNvbjoge1xuICAgICAgICAgICAgICAgIGxvZ2luX3BhZ2VfaWQ6IGxvZ2luX3BhZ2UubG9naW5fcGFnZV9pZCxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgaGVhZGVyczoge1xuICAgICAgICAgICAgICAgIEF1dGhvcml6YXRpb246IGBCZWFyZXIgJHtsb2dpbl9wYWdlLmxvZ2luX3BhZ2VfYXV0aF90b2tlbn1gLFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICApXG4gICAgICAgICAgLmpzb24oKVxuXG4gICAgICAgIGlmIChuZXdfbG9naW5fcGFnZS53YXNfbG9naW5fc3VjY2Vzc2Z1bCkge1xuICAgICAgICAgIGNvbnNvbGUubG9nKFwiTG9nZ2VkIGluISBHZW5lcmF0aW5nIHRva2VuLi4uXCIpXG4gICAgICAgICAgYnJlYWtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChuZXdfbG9naW5fcGFnZS5pc19leHBpcmVkKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiTG9naW4gcGFnZSBleHBpcmVkXCIpXG4gICAgICAgIH1cblxuICAgICAgICBhd2FpdCBkZWxheSgxMDAwKVxuICAgICAgfVxuXG4gICAgICBjb25zdCB7IHNlc3Npb24gfSA9IGF3YWl0IGt5XG4gICAgICAgIC5wb3N0PEVuZHBvaW50UmVzcG9uc2VbXCJzZXNzaW9ucy9sb2dpbl9wYWdlL2V4Y2hhbmdlX2Zvcl9jbGlfc2Vzc2lvblwiXT4oXG4gICAgICAgICAgXCJzZXNzaW9ucy9sb2dpbl9wYWdlL2V4Y2hhbmdlX2Zvcl9jbGlfc2Vzc2lvblwiLFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIGpzb246IHtcbiAgICAgICAgICAgICAgbG9naW5fcGFnZV9pZDogbG9naW5fcGFnZS5sb2dpbl9wYWdlX2lkLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGhlYWRlcnM6IHtcbiAgICAgICAgICAgICAgQXV0aG9yaXphdGlvbjogYEJlYXJlciAke2xvZ2luX3BhZ2UubG9naW5fcGFnZV9hdXRoX3Rva2VufWAsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIH0sXG4gICAgICAgIClcbiAgICAgICAgLmpzb24oKVxuXG4gICAgICBjbGlDb25maWcuc2V0KFwic2Vzc2lvblRva2VuXCIsIHNlc3Npb24udG9rZW4pXG5cbiAgICAgIGNvbnNvbGUubG9nKFwiUmVhZHkgdG8gdXNlIVwiKVxuICAgIH0pXG59XG4iLCAiaW1wb3J0IHsgZ2V0UmVnaXN0cnlBcGlVcmwgfSBmcm9tIFwibGliL2NsaS1jb25maWdcIlxuaW1wb3J0IGt5LCB7IHR5cGUgQWZ0ZXJSZXNwb25zZUhvb2sgfSBmcm9tIFwia3lcIlxuXG5jb25zdCBwcmV0dHlSZXNwb25zZUVycm9ySG9vazogQWZ0ZXJSZXNwb25zZUhvb2sgPSBhc3luYyAoXG4gIF9yZXF1ZXN0LFxuICBfb3B0aW9ucyxcbiAgcmVzcG9uc2UsXG4pID0+IHtcbiAgaWYgKCFyZXNwb25zZS5vaykge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBlcnJvckRhdGEgPSBhd2FpdCByZXNwb25zZS5qc29uKClcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYEZBSUwgWyR7cmVzcG9uc2Uuc3RhdHVzfV06ICR7X3JlcXVlc3QubWV0aG9kfSAke1xuICAgICAgICAgIG5ldyBVUkwoX3JlcXVlc3QudXJsKS5wYXRobmFtZVxuICAgICAgICB9IFxcblxcbiAke0pTT04uc3RyaW5naWZ5KGVycm9yRGF0YSwgbnVsbCwgMil9YCxcbiAgICAgIClcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICAvL2lnbm9yZSwgYWxsb3cgdGhlIGVycm9yIHRvIGJlIHRocm93blxuICAgIH1cbiAgfVxufVxuXG5leHBvcnQgY29uc3QgZ2V0S3kgPSAoKSA9PiB7XG4gIHJldHVybiBreS5jcmVhdGUoe1xuICAgIHByZWZpeFVybDogZ2V0UmVnaXN0cnlBcGlVcmwoKSxcbiAgICBob29rczoge1xuICAgICAgYWZ0ZXJSZXNwb25zZTogW3ByZXR0eVJlc3BvbnNlRXJyb3JIb29rXSxcbiAgICB9LFxuICB9KVxufVxuIiwgImltcG9ydCB0eXBlIHsgQ29tbWFuZCB9IGZyb20gXCJjb21tYW5kZXJcIlxuXG5leHBvcnQgY29uc3QgcmVnaXN0ZXJBdXRoTG9nb3V0ID0gKHByb2dyYW06IENvbW1hbmQpID0+IHtcbiAgcHJvZ3JhbS5jb21tYW5kc1xuICAgIC5maW5kKChjKSA9PiBjLm5hbWUoKSA9PT0gXCJhdXRoXCIpIVxuICAgIC5jb21tYW5kKFwibG9nb3V0XCIpXG4gICAgLmRlc2NyaXB0aW9uKFwiTG9nb3V0IGZyb20gcmVnaXN0cnlcIilcbiAgICAuYWN0aW9uKChhcmdzKSA9PiB7XG4gICAgICBjb25zb2xlLmxvZyhcImxvZ291dFwiKVxuICAgIH0pXG59XG4iLCAiaW1wb3J0IHR5cGUgeyBDb21tYW5kIH0gZnJvbSBcImNvbW1hbmRlclwiXG5cbmV4cG9ydCBjb25zdCByZWdpc3RlckF1dGggPSAocHJvZ3JhbTogQ29tbWFuZCkgPT4ge1xuICBwcm9ncmFtLmNvbW1hbmQoXCJhdXRoXCIpLmRlc2NyaXB0aW9uKFwiTG9naW4vbG9nb3V0XCIpXG59XG4iLCAiaW1wb3J0IHR5cGUgeyBDb21tYW5kIH0gZnJvbSBcImNvbW1hbmRlclwiXG5cbmV4cG9ydCBjb25zdCByZWdpc3RlckNvbmZpZyA9IChwcm9ncmFtOiBDb21tYW5kKSA9PiB7XG4gIHByb2dyYW0uY29tbWFuZChcImNvbmZpZ1wiKS5kZXNjcmlwdGlvbihcIk1hbmFnZSB0c2NpcmN1aXQgQ0xJIGNvbmZpZ3VyYXRpb25cIilcbn1cbiIsICJpbXBvcnQgdHlwZSB7IENvbW1hbmQgfSBmcm9tIFwiY29tbWFuZGVyXCJcbmltcG9ydCB7IGNsaUNvbmZpZyB9IGZyb20gXCJsaWIvY2xpLWNvbmZpZ1wiXG5cbmV4cG9ydCBjb25zdCByZWdpc3RlckNvbmZpZ1ByaW50ID0gKHByb2dyYW06IENvbW1hbmQpID0+IHtcbiAgcHJvZ3JhbS5jb21tYW5kc1xuICAgIC5maW5kKChjKSA9PiBjLm5hbWUoKSA9PT0gXCJjb25maWdcIikhXG4gICAgLmNvbW1hbmQoXCJwcmludFwiKVxuICAgIC5kZXNjcmlwdGlvbihcIlByaW50IHRoZSBjdXJyZW50IGNvbmZpZ1wiKVxuICAgIC5hY3Rpb24oKCkgPT4ge1xuICAgICAgY29uc29sZS5sb2coSlNPTi5zdHJpbmdpZnkoY2xpQ29uZmlnLmFsbCwgbnVsbCwgMikpXG4gICAgfSlcbn1cbiIsICJpbXBvcnQgdHlwZSB7IENvbW1hbmQgfSBmcm9tIFwiY29tbWFuZGVyXCJcbmltcG9ydCB7IGdldEt5IH0gZnJvbSBcImxpYi9yZWdpc3RyeS1hcGkvZ2V0LWt5XCJcbmltcG9ydCAqIGFzIGZzIGZyb20gXCJub2RlOmZzXCJcbmltcG9ydCAqIGFzIHBhdGggZnJvbSBcIm5vZGU6cGF0aFwiXG5cbmV4cG9ydCBjb25zdCByZWdpc3RlckNsb25lID0gKHByb2dyYW06IENvbW1hbmQpID0+IHtcbiAgcHJvZ3JhbVxuICAgIC5jb21tYW5kKFwiY2xvbmVcIilcbiAgICAuZGVzY3JpcHRpb24oXCJDbG9uZSBhIHNuaXBwZXQgZnJvbSB0aGUgcmVnaXN0cnlcIilcbiAgICAuYXJndW1lbnQoXCI8c25pcHBldD5cIiwgXCJTbmlwcGV0IHRvIGNsb25lIChlLmcuIGF1dGhvci9zbmlwcGV0TmFtZSlcIilcbiAgICAuYWN0aW9uKGFzeW5jIChzbmlwcGV0UGF0aDogc3RyaW5nKSA9PiB7XG4gICAgICBsZXQgYXV0aG9yOiBzdHJpbmdcbiAgICAgIGxldCBzbmlwcGV0TmFtZTogc3RyaW5nXG4gICAgICBpZiAoIXNuaXBwZXRQYXRoLnN0YXJ0c1dpdGgoXCJAdHNjaS9cIikgJiYgc25pcHBldFBhdGguaW5jbHVkZXMoXCIvXCIpKSB7XG4gICAgICAgIDtbYXV0aG9yLCBzbmlwcGV0TmFtZV0gPSBzbmlwcGV0UGF0aC5zcGxpdChcIi9cIilcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnN0IHRyaW1tZWRQYXRoID0gc25pcHBldFBhdGgucmVwbGFjZShcIkB0c2NpL1wiLCBcIlwiKVxuICAgICAgICBjb25zdCBmaXJzdERvdEluZGV4ID0gdHJpbW1lZFBhdGguaW5kZXhPZihcIi5cIilcbiAgICAgICAgYXV0aG9yID0gdHJpbW1lZFBhdGguc2xpY2UoMCwgZmlyc3REb3RJbmRleClcbiAgICAgICAgc25pcHBldE5hbWUgPSB0cmltbWVkUGF0aC5zbGljZShmaXJzdERvdEluZGV4ICsgMSlcbiAgICAgIH1cblxuICAgICAgaWYgKCFhdXRob3IgfHwgIXNuaXBwZXROYW1lKSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoXG4gICAgICAgICAgXCJJbnZhbGlkIHNuaXBwZXQgcGF0aC4gVXNlIGZvcm1hdDogYXV0aG9yL3NuaXBwZXROYW1lLCBhdXRob3Iuc25pcHBldE5hbWUgb3IgQHRzY2kvYXV0aG9yLnNuaXBwZXROYW1lXCIsXG4gICAgICAgIClcbiAgICAgICAgcHJvY2Vzcy5leGl0KDEpXG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGt5ID0gZ2V0S3koKVxuXG4gICAgICB0cnkge1xuICAgICAgICBjb25zb2xlLmxvZyhgQ2xvbmluZyAke2F1dGhvcn0vJHtzbmlwcGV0TmFtZX0uLi5gKVxuXG4gICAgICAgIGNvbnN0IHBhY2thZ2VGaWxlTGlzdCA9IGF3YWl0IGt5XG4gICAgICAgICAgLnBvc3Q8e1xuICAgICAgICAgICAgcGFja2FnZV9maWxlczogQXJyYXk8e1xuICAgICAgICAgICAgICBwYWNrYWdlX2ZpbGVfaWQ6IHN0cmluZ1xuICAgICAgICAgICAgICBwYWNrYWdlX3JlbGVhc2VfaWQ6IHN0cmluZ1xuICAgICAgICAgICAgICBmaWxlX3BhdGg6IHN0cmluZ1xuICAgICAgICAgICAgICBjcmVhdGVkX2F0OiBzdHJpbmdcbiAgICAgICAgICAgIH0+XG4gICAgICAgICAgfT4oXCJwYWNrYWdlX2ZpbGVzL2xpc3RcIiwge1xuICAgICAgICAgICAganNvbjoge1xuICAgICAgICAgICAgICBwYWNrYWdlX25hbWU6IGAke2F1dGhvcn0vJHtzbmlwcGV0TmFtZX1gLFxuICAgICAgICAgICAgICB1c2VfbGF0ZXN0X3ZlcnNpb246IHRydWUsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIH0pXG4gICAgICAgICAgLmpzb24oKVxuXG4gICAgICAgIC8vIENyZWF0ZSBkaXJlY3RvcnkgaWYgaXQgZG9lc24ndCBleGlzdFxuICAgICAgICBjb25zdCBkaXJQYXRoID0gYC4vJHthdXRob3J9LiR7c25pcHBldE5hbWV9YFxuICAgICAgICBpZiAoIWZzLmV4aXN0c1N5bmMoZGlyUGF0aCkpIHtcbiAgICAgICAgICBmcy5ta2RpclN5bmMoZGlyUGF0aClcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIERvd25sb2FkIGVhY2ggZmlsZSB0aGF0IGRvZXNuJ3Qgc3RhcnQgd2l0aCBkaXN0L1xuICAgICAgICBmb3IgKGNvbnN0IGZpbGVJbmZvIG9mIHBhY2thZ2VGaWxlTGlzdC5wYWNrYWdlX2ZpbGVzKSB7XG4gICAgICAgICAgY29uc3QgZmlsZVBhdGggPSBmaWxlSW5mby5maWxlX3BhdGguc3RhcnRzV2l0aChcIi9cIilcbiAgICAgICAgICAgID8gZmlsZUluZm8uZmlsZV9wYXRoLnNsaWNlKDEpXG4gICAgICAgICAgICA6IGZpbGVJbmZvLmZpbGVfcGF0aFxuXG4gICAgICAgICAgaWYgKGZpbGVQYXRoLnN0YXJ0c1dpdGgoXCJkaXN0L1wiKSkgY29udGludWVcblxuICAgICAgICAgIGNvbnN0IGZpbGVDb250ZW50ID0gYXdhaXQga3lcbiAgICAgICAgICAgIC5wb3N0PHtcbiAgICAgICAgICAgICAgcGFja2FnZV9maWxlOiB7XG4gICAgICAgICAgICAgICAgY29udGVudF90ZXh0OiBzdHJpbmdcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfT4oXCJwYWNrYWdlX2ZpbGVzL2dldFwiLCB7XG4gICAgICAgICAgICAgIGpzb246IHtcbiAgICAgICAgICAgICAgICBwYWNrYWdlX25hbWU6IGAke2F1dGhvcn0vJHtzbmlwcGV0TmFtZX1gLFxuICAgICAgICAgICAgICAgIGZpbGVfcGF0aDogZmlsZUluZm8uZmlsZV9wYXRoLFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIC5qc29uKClcblxuICAgICAgICAgIGNvbnN0IGZ1bGxQYXRoID0gcGF0aC5qb2luKGRpclBhdGgsIGZpbGVQYXRoKVxuICAgICAgICAgIGNvbnN0IGRpck5hbWUgPSBwYXRoLmRpcm5hbWUoZnVsbFBhdGgpXG5cbiAgICAgICAgICAvLyBDcmVhdGUgbmVzdGVkIGRpcmVjdG9yaWVzIGlmIHRoZXkgZG9uJ3QgZXhpc3RcbiAgICAgICAgICBpZiAoIWZzLmV4aXN0c1N5bmMoZGlyTmFtZSkpIHtcbiAgICAgICAgICAgIGZzLm1rZGlyU3luYyhkaXJOYW1lLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KVxuICAgICAgICAgIH1cblxuICAgICAgICAgIGZzLndyaXRlRmlsZVN5bmMoZnVsbFBhdGgsIGZpbGVDb250ZW50LnBhY2thZ2VfZmlsZS5jb250ZW50X3RleHQpXG4gICAgICAgIH1cblxuICAgICAgICBjb25zb2xlLmxvZyhgU3VjY2Vzc2Z1bGx5IGNsb25lZCB0byAuLyR7YXV0aG9yfS4ke3NuaXBwZXROYW1lfS9gKVxuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgaWYgKGVycm9yIGluc3RhbmNlb2YgRXJyb3IpIHtcbiAgICAgICAgICBjb25zb2xlLmVycm9yKFwiRmFpbGVkIHRvIGNsb25lIHNuaXBwZXQ6XCIsIGVycm9yLm1lc3NhZ2UpXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY29uc29sZS5lcnJvcihcIkZhaWxlZCB0byBjbG9uZSBzbmlwcGV0OlwiLCBlcnJvcilcbiAgICAgICAgfVxuICAgICAgICBwcm9jZXNzLmV4aXQoMSlcbiAgICAgIH1cbiAgICB9KVxufVxuIl0sCiAgIm1hcHBpbmdzIjogIjs7O0FBQ0EsU0FBUyxlQUFlOzs7QUNBeEIsWUFBWUEsV0FBVTtBQUN0QixZQUFZLGNBQWM7QUFDMUIsWUFBWUMsU0FBUTs7O0FDSHBCLFlBQVksVUFBVTtBQUN0QixZQUFZLFFBQVE7QUFDcEIsWUFBWSxVQUFVO0FBQ3RCLFNBQVMsc0JBQXNCOzs7QUNIL0I7QUFBQSxFQUNFLE1BQVE7QUFBQSxFQUNSLE1BQVE7QUFBQSxFQUNSLE1BQVE7QUFBQSxFQUNSLFNBQVc7QUFBQSxFQUNYLEtBQU87QUFBQSxJQUNMLE1BQVE7QUFBQSxFQUNWO0FBQUEsRUFDQSxTQUFXO0FBQUEsSUFDVCxPQUFTO0FBQUEsSUFDVCxLQUFPO0FBQUEsSUFDUCxPQUFTO0FBQUEsSUFDVCxRQUFVO0FBQUEsSUFDVixnQkFBZ0I7QUFBQSxJQUNoQixLQUFPO0FBQUEsRUFDVDtBQUFBLEVBQ0EsaUJBQW1CO0FBQUEsSUFDakIsa0JBQWtCO0FBQUEsSUFDbEIsbUJBQW1CO0FBQUEsSUFDbkIsY0FBYztBQUFBLElBQ2Qsc0JBQXNCO0FBQUEsSUFDdEIsZ0JBQWdCO0FBQUEsSUFDaEIsTUFBUTtBQUFBLEVBQ1Y7QUFBQSxFQUNBLGtCQUFvQjtBQUFBLElBQ2xCLFlBQWM7QUFBQSxFQUNoQjtBQUFBLEVBQ0EsY0FBZ0I7QUFBQSxJQUNkLDBCQUEwQjtBQUFBLElBQzFCLHVCQUF1QjtBQUFBLElBQ3ZCLFVBQVk7QUFB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QUNGLENBQUMsRUFDQSxLQUFLO0FBRVIsY0FBTSxXQUFnQixXQUFLLFNBQVMsUUFBUTtBQUM1QyxjQUFNLFVBQWUsY0FBUSxRQUFRO0FBR3JDLFlBQUksQ0FBSSxlQUFXLE9BQU8sR0FBRztBQUMzQixVQUFHLGNBQVUsU0FBUyxFQUFFLFdBQVcsS0FBSyxDQUFDO0FBQUEsUUFDM0M7QUFFQSxRQUFHLGtCQUFjLFVBQVUsWUFBWSxhQUFhLFlBQVk7QUFBQSxNQUNsRTtBQUVBLGNBQVEsSUFBSSw0QkFBNEIsTUFBTSxJQUFJLFdBQVcsR0FBRztBQUFBLElBQ2xFLFNBQVMsT0FBTztBQUNkLFVBQUksaUJBQWlCLE9BQU87QUFDMUIsZ0JBQVEsTUFBTSw0QkFBNEIsTUFBTSxPQUFPO0FBQUEsTUFDekQsT0FBTztBQUNMLGdCQUFRLE1BQU0sNEJBQTRCLEtBQUs7QUFBQSxNQUNqRDtBQUNBLGNBQVEsS0FBSyxDQUFDO0FBQUEsSUFDaEI7QUFBQSxFQUNGLENBQUM7QUFDTDs7O0FmekZBLFNBQVMsa0JBQWtCO0FBRTNCLElBQU0sVUFBVSxJQUFJLFFBQVE7QUFFNUIsUUFDRyxLQUFLLE1BQU0sRUFDWCxZQUFZLHVDQUF1QyxFQUNuRCxRQUFRLE9BQU87QUFFbEIsWUFBWSxPQUFPO0FBQ25CLGNBQWMsT0FBTztBQUVyQixhQUFhLE9BQU87QUFDcEIsa0JBQWtCLE9BQU87QUFDekIsbUJBQW1CLE9BQU87QUFFMUIsZUFBZSxPQUFPO0FBQ3RCLG9CQUFvQixPQUFPO0FBRTNCLElBQUksUUFBUSxLQUFLLFdBQVcsR0FBRztBQUM3QixhQUFXLFNBQVMsUUFBUSxJQUFJO0FBQ2xDLE9BQU87QUFDTCxVQUFRLE1BQU07QUFDaEI7IiwKICAibmFtZXMiOiBbInBhdGgiLCAiZnMiLCAiY3JlYXRlU2VydmVyIiwgInJlc29sdmUiLCAicGF0aCIsICJmcyIsICJmcyIsICJwYXRoIiwgInRzIiwgInByb2dyYW0iLCAiY3JlYXRlU2VydmVyIiwgImZpbGUiLCAicHJvZ3JhbSIsICJreSIsICJwcm9ncmFtIiwgInByb2dyYW0iLCAicHJvZ3JhbSIsICJwcm9ncmFtIiwgImZzIiwgInBhdGgiLCAicHJvZ3JhbSIsICJreSJdCn0K
|
|
@@ -2,6 +2,8 @@ import * as http from "node:http"
|
|
|
2
2
|
import * as fs from "node:fs"
|
|
3
3
|
import * as path from "node:path"
|
|
4
4
|
import { getNodeHandler } from "winterspec/adapters/node"
|
|
5
|
+
import pkg from "../../package.json"
|
|
6
|
+
|
|
5
7
|
// @ts-ignore
|
|
6
8
|
import winterspecBundle from "@tscircuit/file-server/dist/bundle.js"
|
|
7
9
|
import { getIndex } from "../site/getIndex"
|
|
@@ -30,10 +32,13 @@ export const createServer = async (port: number = 3000) => {
|
|
|
30
32
|
return
|
|
31
33
|
} catch (error) {
|
|
32
34
|
console.error("Error serving standalone.min.js:", error)
|
|
33
|
-
res.writeHead(404)
|
|
34
|
-
res.end("File not found")
|
|
35
|
-
return
|
|
36
35
|
}
|
|
36
|
+
|
|
37
|
+
res.writeHead(302, {
|
|
38
|
+
Location: `https://cdn.jsdelivr.net/npm/@tscircuit/runframe@${pkg.dependencies["@tscircuit/runframe"].replace(/^[^0-9]+/, "")}/dist/standalone.min.js`,
|
|
39
|
+
})
|
|
40
|
+
res.end()
|
|
41
|
+
return
|
|
37
42
|
}
|
|
38
43
|
|
|
39
44
|
if (url.pathname === "/") {
|