gitlab-ci-local 4.31.0 → 4.32.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 CHANGED
@@ -26,12 +26,13 @@ Get rid of all those dev specific shell scripts and make files.
26
26
  * [docker-swarm-php](./examples/docker-swarm-php/README.md)
27
27
  * [Installation](#installation)
28
28
  * [Convenience](#convenience)
29
- * [CLI options via shell](#cli-options-via-shell)
29
+ * [CLI options via shell](#cli-options-via-shell)
30
30
  * [DotEnv file](#dotenv-file)
31
31
  * [Bash alias](#bash-alias)
32
32
  * [Tab completion](#tab-completion)
33
33
  * [Quirks](#quirks)
34
34
  * [Tracked Files](#tracked-files)
35
+ * [Local Only](#local-only)
35
36
  * [Home File Variables](#home-file-variables)
36
37
  * [Remote File Variables](#remote-file-variables)
37
38
  * [Project File Variables](#project-file-variables)
@@ -122,6 +123,21 @@ Untracked and ignored files will not be synced inside isolated jobs, only tracke
122
123
 
123
124
  Remember `git add`
124
125
 
126
+ ### Local Only
127
+
128
+ ```yml
129
+ local-only-job:
130
+ rules:
131
+ - { if: $GITLAB_CI == 'false' }
132
+ ```
133
+
134
+ ```yml
135
+ local-only-subsection:
136
+ script:
137
+ - if [ $GITLAB_CI == 'false' ]; then eslint . --fix; fi
138
+ - eslint .
139
+ ```
140
+
125
141
  ### Home file variables
126
142
 
127
143
  Put a file like this in `$HOME/.gitlab-ci-local/variables.yml`
@@ -246,7 +262,7 @@ Docker executor copies artifacts to and from .gitlab-ci-local/artifacts
246
262
 
247
263
  ## Development
248
264
 
249
- You need nodejs 16+
265
+ You need nodejs 18+
250
266
 
251
267
  ### Scripts
252
268
 
package/package.json CHANGED
@@ -3,16 +3,16 @@
3
3
  "description": "Tired of pushing to test your .gitlab-ci.yml?",
4
4
  "main": "src/index.js",
5
5
  "bin": "src/index.js",
6
- "version": "4.31.0",
6
+ "version": "4.32.0",
7
7
  "scripts": {
8
8
  "prepublishOnly": "npm run check-all && chmod +x src/index.js",
9
- "pkg-linux": "pkg src/index.js --public -t node16-linux-x64 -o bin/linux/gitlab-ci-local && chmod +x bin/linux/gitlab-ci-local && gzip -c bin/linux/gitlab-ci-local > bin/linux.gz",
10
- "pkg-macos": "pkg src/index.js --public -t node16-macos-x64 -o bin/macos/gitlab-ci-local && gzip -c bin/macos/gitlab-ci-local > bin/macos.gz",
11
- "pkg-win": "pkg src/index.js --public -t node16-win-x64 -o bin/win/gitlab-ci-local && gzip -c bin/win/gitlab-ci-local.exe > bin/win.gz",
9
+ "pkg-linux": "pkg src/index.js --public -t node18-linux-x64 -o bin/linux/gitlab-ci-local && chmod +x bin/linux/gitlab-ci-local && gzip -c bin/linux/gitlab-ci-local > bin/linux.gz",
10
+ "pkg-macos": "pkg src/index.js --public -t node18-macos-x64 -o bin/macos/gitlab-ci-local && gzip -c bin/macos/gitlab-ci-local > bin/macos.gz",
11
+ "pkg-win": "pkg src/index.js --public -t node18-win-x64 -o bin/win/gitlab-ci-local && gzip -c bin/win/gitlab-ci-local.exe > bin/win.gz",
12
12
  "pkg-all": "npm run pkg-linux && npm run pkg-macos && npm run pkg-win",
13
13
  "pkg": "pkg",
14
14
  "build": "rm -f src/*.js src/*.d.ts && tsc",
15
- "check-all": "npm run build && npm run lint && npm run coverage",
15
+ "check-all": "npm run build && npm run lint && npm run coverage && npm run audit",
16
16
  "audit": "npm audit --parseable",
17
17
  "lint": "npx eslint .",
18
18
  "test": "jest --testTimeout 30000",
@@ -26,14 +26,14 @@
26
26
  "chalk": "^4.1.2",
27
27
  "checksum": "^1.0.0",
28
28
  "deep-extend": "^0.6.0",
29
- "dotenv": "^16.0.0",
29
+ "dotenv": "^16.0.1",
30
30
  "execa": "^5.1.1",
31
31
  "fs-extra": "^10.1.0",
32
32
  "js-yaml": "^4.1.0",
33
33
  "object-traversal": "^1.0.1",
34
34
  "pretty-hrtime": "^1.0.3",
35
35
  "source-map-support": "^0.5.21",
36
- "yargs": "^17.4.1"
36
+ "yargs": "^17.5.1"
37
37
  },
38
38
  "devDependencies": {
39
39
  "@types/base64url": "^2.0.3",
@@ -41,23 +41,23 @@
41
41
  "@types/checksum": "0.1.33",
42
42
  "@types/deep-extend": "0.4.32",
43
43
  "@types/fs-extra": "9.0.13",
44
- "@types/jest": "27.5.0",
44
+ "@types/jest": "27.5.2",
45
45
  "@types/jest-when": "3.5.0",
46
46
  "@types/js-yaml": "4.0.5",
47
47
  "@types/pretty-hrtime": "1.0.1",
48
48
  "@types/source-map-support": "0.5.4",
49
49
  "@types/yargs": "17.0.10",
50
- "@typescript-eslint/eslint-plugin": "5.22.0",
51
- "@typescript-eslint/parser": "5.22.0",
52
- "axios-mock-adapter": "1.20.0",
50
+ "@typescript-eslint/eslint-plugin": "5.27.0",
51
+ "@typescript-eslint/parser": "5.27.0",
52
+ "axios-mock-adapter": "1.21.1",
53
53
  "depcheck": "1.4.3",
54
- "eslint": "8.14.0",
54
+ "eslint": "8.16.0",
55
55
  "jest": "28.1.0",
56
56
  "jest-when": "3.5.1",
57
- "pkg": "5.6.0",
58
- "ts-jest": "^28.0.1",
59
- "ts-node": "10.7.0",
60
- "typescript": "4.6.4"
57
+ "pkg": "5.7.0",
58
+ "ts-jest": "^28.0.3",
59
+ "ts-node": "10.8.0",
60
+ "typescript": "4.7.2"
61
61
  },
62
62
  "engines": {
63
63
  "node": ">=16.10.0"
package/src/argv.js CHANGED
@@ -58,6 +58,9 @@ class Argv {
58
58
  get file() {
59
59
  return this.map.get("file") ?? ".gitlab-ci.yml";
60
60
  }
61
+ get stateDir() {
62
+ return (this.map.get("stateDir") ?? ".gitlab-ci-local").replace(/\/$/, "");
63
+ }
61
64
  get home() {
62
65
  return (this.map.get("home") ?? process.env.HOME ?? "").replace(/\/$/, "");
63
66
  }
@@ -129,4 +132,4 @@ class Argv {
129
132
  }
130
133
  }
131
134
  exports.Argv = Argv;
132
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXJndi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbImFyZ3YudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQSx1Q0FBaUM7QUFDakMsNkNBQStCO0FBQy9CLCtDQUFpQztBQUNqQywwREFBa0M7QUFFbEMsTUFBYSxJQUFJO0lBSWIsWUFBWSxJQUFTO1FBRmIsUUFBRyxHQUFxQixJQUFJLEdBQUcsRUFBZSxDQUFDO1FBR25ELEtBQUssTUFBTSxDQUFDLEdBQUcsRUFBRSxLQUFLLENBQUMsSUFBSSxNQUFNLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxFQUFFO1lBQzdDLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRSxLQUFLLENBQUMsQ0FBQztTQUM1QjtRQUVELE1BQU0sR0FBRyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUM7UUFDckIsSUFBSSxFQUFFLENBQUMsVUFBVSxDQUFDLEdBQUcsR0FBRyx1QkFBdUIsQ0FBQyxFQUFFO1lBQzlDLE1BQU0sTUFBTSxHQUFHLE1BQU0sQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLFlBQVksQ0FBQyxHQUFHLEdBQUcsdUJBQXVCLENBQUMsQ0FBQyxDQUFDO1lBQzVFLEtBQUssTUFBTSxDQUFDLEdBQUcsRUFBRSxLQUFLLENBQUMsSUFBSSxNQUFNLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxFQUFFO2dCQUMvQyxNQUFNLE1BQU0sR0FBRyxJQUFBLG1CQUFTLEVBQUMsR0FBRyxDQUFDLENBQUM7Z0JBQzlCLElBQUksSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLElBQUksRUFBRTtvQkFDdEIsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsTUFBTSxFQUFFLEtBQUssQ0FBQyxDQUFDO2lCQUMvQjthQUNKO1NBQ0o7SUFDTCxDQUFDO0lBRUQsSUFBSSxHQUFHO1FBQ0gsSUFBSSxHQUFHLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FB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T0FBTyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLEtBQUssQ0FBQztJQUNuRCxDQUFDO0lBRUQsSUFBSSxhQUFhO1FBQ2IsT0FBTyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxlQUFlLENBQUMsSUFBSSxLQUFLLENBQUM7SUFDbEQsQ0FBQztJQUVELElBQUksVUFBVTtRQUNWLE9BQU8sSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsWUFBWSxDQUFDLElBQUksS0FBSyxDQUFDO0lBQy9DLENBQUM7Q0FDSjtBQXhIRCxvQkF3SEMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge2Fzc2VydH0gZnJvbSBcIi4vYXNzZXJ0c1wiO1xuaW1wb3J0ICogYXMgZnMgZnJvbSBcImZzLWV4dHJhXCI7XG5pbXBvcnQgKiBhcyBkb3RlbnYgZnJvbSBcImRvdGVudlwiO1xuaW1wb3J0IGNhbWVsQ2FzZSBmcm9tIFwiY2FtZWxjYXNlXCI7XG5cbmV4cG9ydCBjbGFzcyBBcmd2IHtcblxuICAgIHByaXZhdGUgbWFwOiBNYXA8c3RyaW5nLCBhbnk+ID0gbmV3IE1hcDxzdHJpbmcsIGFueT4oKTtcblxuICAgIGNvbnN0cnVjdG9yKGFyZ3Y6IGFueSkge1xuICAgICAgICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhhcmd2KSkge1xuICAgICAgICAgICAgdGhpcy5tYXAuc2V0KGtleSwgdmFsdWUpO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgY3dkID0gdGhpcy5jd2Q7XG4gICAgICAgIGlmIChmcy5leGlzdHNTeW5jKGAke2N3ZH0vLmdpdGxhYi1jaS1sb2NhbC1lbnZgKSkge1xuICAgICAgICAgICAgY29uc3QgY29uZmlnID0gZG90ZW52LnBhcnNlKGZzLnJlYWRGaWxlU3luYyhgJHtjd2R9Ly5naXRsYWItY2ktbG9jYWwtZW52YCkpO1xuICAgICAgICAgICAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMoY29uZmlnKSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGFyZ0tleSA9IGNhbWVsQ2FzZShrZXkpO1xuICAgICAgICAgICAgICAgIGlmIChhcmd2W2FyZ0tleV0gPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLm1hcC5zZXQoYXJnS2V5LCB2YWx1ZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgZ2V0IGN3ZCgpOiBzdHJpbmcge1xuICAgICAgICBsZXQgY3dkID0gdGhpcy5tYXAuZ2V0KFwiY3dkXCIpID8/IHByb2Nlc3MuY3dkKCk7XG4gICAgICAgIGFzc2VydCh0eXBlb2YgY3dkICE9IFwib2JqZWN0XCIsIFwiLS1jd2Qgb3B0aW9uIGNhbm5vdCBiZSBhbiBhcnJheVwiKTtcbiAgICAgICAgY3dkID0gY3dkLnJlcGxhY2UoL1xcLyQvLCBcIlwiKTtcbiAgICAgICAgYXNzZXJ0KGZzLnBhdGhFeGlzdHNTeW5jKGN3ZCksIGAke2N3ZH0gaXMgbm90IGEgZGlyZWN0b3J5YCk7XG4gICAgICAgIHJldHVybiBjd2Q7XG4gICAgfVxuXG4gICAgZ2V0IGZpbGUoKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubWFwLmdldChcImZpbGVcIikgPz8gXCIuZ2l0bGFiLWNpLnltbFwiO1xuICAgIH1cblxuICAgIGdldCBob21lKCk6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiAodGhpcy5tYXAuZ2V0KFwiaG9tZVwiKSA/PyBwcm9jZXNzLmVudi5IT01FID8/IFwiXCIpLnJlcGxhY2UoL1xcLyQvLCBcIlwiKTtcbiAgICB9XG5cbiAgICBnZXQgdm9sdW1lKCk6IHN0cmluZ1tdIHtcbiAgICAgICAgY29uc3QgdmFsID0gdGhpcy5tYXAuZ2V0KFwidm9sdW1lXCIpID8/IFtdO1xuICAgICAgICByZXR1cm4gdHlwZW9mIHZhbCA9PSBcInN0cmluZ1wiID8gdmFsLnNwbGl0KFwiIFwiKSA6IHZhbDtcbiAgICB9XG5cbiAgICBnZXQgZXh0cmFIb3N0KCk6IHN0cmluZ1tdIHtcbiAgICAgICAgY29uc3QgdmFsID0gdGhpcy5tYXAuZ2V0KFwiZXh0cmFIb3N0XCIpID8/IFtdO1xuICAgICAgICByZXR1cm4gdHlwZW9mIHZhbCA9PSBcInN0cmluZ1wiID8gdmFsLnNwbGl0KFwiIFwiKSA6IHZhbDtcbiAgICB9XG5cbiAgICBnZXQgcmVtb3RlVmFyaWFibGVzKCk6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiB0aGlzLm1hcC5nZXQoXCJyZW1vdGVWYXJpYWJsZXNcIik7XG4gICAgfVxuXG4gICAgZ2V0IHZhcmlhYmxlKCk6IHsgW2tleTogc3RyaW5nXTogc3RyaW5nIH0ge1xuICAgICAgICBjb25zdCB2YWwgPSB0aGlzLm1hcC5nZXQoXCJ2YXJpYWJsZVwiKTtcbiAgICAgICAgY29uc3QgdmFyaWFibGVzOiB7IFtrZXk6IHN0cmluZ106IHN0cmluZyB9ID0ge307XG4gICAgICAgIGNvbnN0IHBhaXJzID0gdHlwZW9mIHZhbCA9PSBcInN0cmluZ1wiID8gdmFsLnNwbGl0KFwiIFwiKSA6IHZhbDtcbiAgICAgICAgKHBhaXJzID8/IFtdKS5mb3JFYWNoKCh2YXJpYWJsZVBhaXI6IHN0cmluZykgPT4ge1xuICAgICAgICAgICAgY29uc3QgZXhlYyA9IC8oPzxrZXk+XFx3Kj8pKD0pKD88dmFsdWU+XFx3LiopLy5leGVjKHZhcmlhYmxlUGFpcik7XG4gICAgICAgICAgICBpZiAoZXhlYz8uZ3JvdXBzPy5rZXkpIHtcbiAgICAgICAgICAgICAgICB2YXJpYWJsZXNbZXhlYy5ncm91cHMua2V5XSA9IGV4ZWM/Lmdyb3Vwcz8udmFsdWU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gdmFyaWFibGVzO1xuICAgIH1cblxuICAgIGdldCBtYW51YWwoKTogc3RyaW5nW10ge1xuICAgICAgICBjb25zdCB2YWwgPSB0aGlzLm1hcC5nZXQoXCJtYW51YWxcIikgPz8gW107XG4gICAgICAgIHJldHVybiB0eXBlb2YgdmFsID09IFwic3RyaW5nXCIgPyB2YWwuc3BsaXQoXCIgXCIpIDogdmFsO1xuICAgIH1cblxuICAgIGdldCBqb2IoKTogc3RyaW5nW10ge1xuICAgICAgICByZXR1cm4gdGhpcy5tYXAuZ2V0KFwiam9iXCIpID8/IFtdO1xuICAgIH1cblxuICAgIGdldCBhdXRvQ29tcGxldGluZygpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubWFwLmdldChcImF1dG9Db21wbGV0aW5nXCIpID8/IGZhbHNlO1xuICAgIH1cblxuICAgIGdldCBwcml2aWxlZ2VkKCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy5tYXAuZ2V0KFwicHJpdmlsZWdlZFwiKSA/PyBmYWxzZTtcbiAgICB9XG5cbiAgICBnZXQgbmVlZHMoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLm1hcC5nZXQoXCJuZWVkc1wiKSA/PyBmYWxzZTtcbiAgICB9XG5cbiAgICBnZXQgb25seU5lZWRzKCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy5tYXAuZ2V0KFwib25seU5lZWRzXCIpID8/IGZhbHNlO1xuICAgIH1cblxuICAgIGdldCBjb21wbGV0aW9uKCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy5tYXAuZ2V0KFwiY29tcGxldGlvblwiKSA/PyBmYWxzZTtcbiAgICB9XG5cbiAgICBnZXQgbGlzdCgpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubWFwLmdldChcImxpc3RcIikgPz8gZmFsc2U7XG4gICAgfVxuXG4gICAgZ2V0IGxpc3RBbGwoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLm1hcC5nZXQoXCJsaXN0QWxsXCIpID8/IGZhbHNlO1xuICAgIH1cblxuICAgIGdldCBsaXN0SnNvbigpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubWFwLmdldChcImxpc3RKc29uXCIpID8/IGZhbHNlO1xuICAgIH1cblxuICAgIGdldCBwcmV2aWV3KCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy5tYXAuZ2V0KFwicHJldmlld1wiKSA/PyBmYWxzZTtcbiAgICB9XG5cbiAgICBnZXQgc2hlbGxJc29sYXRpb24oKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLm1hcC5nZXQoXCJzaGVsbElzb2xhdGlvblwiKSA/PyBmYWxzZTtcbiAgICB9XG5cbiAgICBnZXQgZmV0Y2hJbmNsdWRlcygpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubWFwLmdldChcImZldGNoSW5jbHVkZXNcIikgPz8gZmFsc2U7XG4gICAgfVxuXG4gICAgZ2V0IG1vdW50Q2FjaGUoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLm1hcC5nZXQoXCJtb3VudENhY2hlXCIpID8/IGZhbHNlO1xuICAgIH1cbn1cbiJdfQ==
135
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXJndi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbImFyZ3YudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQSx1Q0FBaUM7QUFDakMsNkNBQStCO0FBQy9CLCtDQUFpQztBQUNqQywwREFBa0M7QUFFbEMsTUFBYSxJQUFJO0lBSWIsWUFBWSxJQUFTO1FBRmIsUUFBRyxHQUFxQixJQUFJLEdBQUcsRUFBZSxDQUFDO1FBR25ELEtBQUssTUFBTSxDQUFDLEdBQUcsRUFBRSxLQUFLLENBQUMsSUFBSSxNQUFNLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxFQUFFO1lBQzdDLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRSxLQUFLLENBQUMsQ0FBQztTQUM1QjtRQUVELE1BQU0sR0FBRyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUM7UUFDckIsSUFBSSxFQUFFLENBQUMsVUFBVSxDQUFDLEdBQUcsR0FBRyx1QkFBdUIsQ0FBQyxFQUFFO1lBQzlDLE1BQU0sTUFBTSxHQUFHLE1BQU0sQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLFlBQVksQ0FBQyxHQUFHLEdBQUcsdUJBQXVCLENBQUMsQ0FBQyxDQUFDO1lBQzVFLEtBQUssTUFBTSxDQUFDLEdBQUcsRUFBRSxLQUFLLENBQUMsSUFBSSxNQUFNLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxFQUFFO2dCQUMvQyxNQUFNLE1BQU0sR0FBRyxJQUFBLG1CQUFTLEVBQUMsR0FBRyxDQUFDLENBQUM7Z0JBQzlCLElBQUksSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLElBQUksRUFBRTtvQkFDdEIsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsTUFBTSxFQUFFLEtBQUssQ0FBQyxDQUFDO2lCQUMvQjthQUNKO1NBQ0o7SUFDTCxDQUFDO0lBRUQsSUFBSSxHQUFHO1FBQ0gsSUFBSSxHQUFHLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FB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LElBQUksS0FBSyxDQUFDO0lBQzdDLENBQUM7SUFFRCxJQUFJLE9BQU87UUFDUCxPQUFPLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLFNBQVMsQ0FBQyxJQUFJLEtBQUssQ0FBQztJQUM1QyxDQUFDO0lBRUQsSUFBSSxjQUFjO1FBQ2QsT0FBTyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLEtBQUssQ0FBQztJQUNuRCxDQUFDO0lBRUQsSUFBSSxhQUFhO1FBQ2IsT0FBTyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxlQUFlLENBQUMsSUFBSSxLQUFLLENBQUM7SUFDbEQsQ0FBQztJQUVELElBQUksVUFBVTtRQUNWLE9BQU8sSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsWUFBWSxDQUFDLElBQUksS0FBSyxDQUFDO0lBQy9DLENBQUM7Q0FDSjtBQTVIRCxvQkE0SEMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge2Fzc2VydH0gZnJvbSBcIi4vYXNzZXJ0c1wiO1xuaW1wb3J0ICogYXMgZnMgZnJvbSBcImZzLWV4dHJhXCI7XG5pbXBvcnQgKiBhcyBkb3RlbnYgZnJvbSBcImRvdGVudlwiO1xuaW1wb3J0IGNhbWVsQ2FzZSBmcm9tIFwiY2FtZWxjYXNlXCI7XG5cbmV4cG9ydCBjbGFzcyBBcmd2IHtcblxuICAgIHByaXZhdGUgbWFwOiBNYXA8c3RyaW5nLCBhbnk+ID0gbmV3IE1hcDxzdHJpbmcsIGFueT4oKTtcblxuICAgIGNvbnN0cnVjdG9yKGFyZ3Y6IGFueSkge1xuICAgICAgICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhhcmd2KSkge1xuICAgICAgICAgICAgdGhpcy5tYXAuc2V0KGtleSwgdmFsdWUpO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgY3dkID0gdGhpcy5jd2Q7XG4gICAgICAgIGlmIChmcy5leGlzdHNTeW5jKGAke2N3ZH0vLmdpdGxhYi1jaS1sb2NhbC1lbnZgKSkge1xuICAgICAgICAgICAgY29uc3QgY29uZmlnID0gZG90ZW52LnBhcnNlKGZzLnJlYWRGaWxlU3luYyhgJHtjd2R9Ly5naXRsYWItY2ktbG9jYWwtZW52YCkpO1xuICAgICAgICAgICAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMoY29uZmlnKSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGFyZ0tleSA9IGNhbWVsQ2FzZShrZXkpO1xuICAgICAgICAgICAgICAgIGlmIChhcmd2W2FyZ0tleV0gPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLm1hcC5zZXQoYXJnS2V5LCB2YWx1ZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgZ2V0IGN3ZCgpOiBzdHJpbmcge1xuICAgICAgICBsZXQgY3dkID0gdGhpcy5tYXAuZ2V0KFwiY3dkXCIpID8/IHByb2Nlc3MuY3dkKCk7XG4gICAgICAgIGFzc2VydCh0eXBlb2YgY3dkICE9IFwib2JqZWN0XCIsIFwiLS1jd2Qgb3B0aW9uIGNhbm5vdCBiZSBhbiBhcnJheVwiKTtcbiAgICAgICAgY3dkID0gY3dkLnJlcGxhY2UoL1xcLyQvLCBcIlwiKTtcbiAgICAgICAgYXNzZXJ0KGZzLnBhdGhFeGlzdHNTeW5jKGN3ZCksIGAke2N3ZH0gaXMgbm90IGEgZGlyZWN0b3J5YCk7XG4gICAgICAgIHJldHVybiBjd2Q7XG4gICAgfVxuXG4gICAgZ2V0IGZpbGUoKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubWFwLmdldChcImZpbGVcIikgPz8gXCIuZ2l0bGFiLWNpLnltbFwiO1xuICAgIH1cblxuICAgIGdldCBzdGF0ZURpcigpOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gKHRoaXMubWFwLmdldChcInN0YXRlRGlyXCIpID8/IFwiLmdpdGxhYi1jaS1sb2NhbFwiKS5yZXBsYWNlKC9cXC8kLywgXCJcIik7XG4gICAgfVxuXG4gICAgZ2V0IGhvbWUoKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuICh0aGlzLm1hcC5nZXQoXCJob21lXCIpID8/IHByb2Nlc3MuZW52LkhPTUUgPz8gXCJcIikucmVwbGFjZSgvXFwvJC8sIFwiXCIpO1xuICAgIH1cblxuICAgIGdldCB2b2x1bWUoKTogc3RyaW5nW10ge1xuICAgICAgICBjb25zdCB2YWwgPSB0aGlzLm1hcC5nZXQoXCJ2b2x1bWVcIikgPz8gW107XG4gICAgICAgIHJldHVybiB0eXBlb2YgdmFsID09IFwic3RyaW5nXCIgPyB2YWwuc3BsaXQoXCIgXCIpIDogdmFsO1xuICAgIH1cblxuICAgIGdldCBleHRyYUhvc3QoKTogc3RyaW5nW10ge1xuICAgICAgICBjb25zdCB2YWwgPSB0aGlzLm1hcC5nZXQoXCJleHRyYUhvc3RcIikgPz8gW107XG4gICAgICAgIHJldHVybiB0eXBlb2YgdmFsID09IFwic3RyaW5nXCIgPyB2YWwuc3BsaXQoXCIgXCIpIDogdmFsO1xuICAgIH1cblxuICAgIGdldCByZW1vdGVWYXJpYWJsZXMoKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubWFwLmdldChcInJlbW90ZVZhcmlhYmxlc1wiKTtcbiAgICB9XG5cbiAgICBnZXQgdmFyaWFibGUoKTogeyBba2V5OiBzdHJpbmddOiBzdHJpbmcgfSB7XG4gICAgICAgIGNvbnN0IHZhbCA9IHRoaXMubWFwLmdldChcInZhcmlhYmxlXCIpO1xuICAgICAgICBjb25zdCB2YXJpYWJsZXM6IHsgW2tleTogc3RyaW5nXTogc3RyaW5nIH0gPSB7fTtcbiAgICAgICAgY29uc3QgcGFpcnMgPSB0eXBlb2YgdmFsID09IFwic3RyaW5nXCIgPyB2YWwuc3BsaXQoXCIgXCIpIDogdmFsO1xuICAgICAgICAocGFpcnMgPz8gW10pLmZvckVhY2goKHZhcmlhYmxlUGFpcjogc3RyaW5nKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBleGVjID0gLyg/PGtleT5cXHcqPykoPSkoPzx2YWx1ZT5cXHcuKikvLmV4ZWModmFyaWFibGVQYWlyKTtcbiAgICAgICAgICAgIGlmIChleGVjPy5ncm91cHM/LmtleSkge1xuICAgICAgICAgICAgICAgIHZhcmlhYmxlc1tleGVjLmdyb3Vwcy5rZXldID0gZXhlYz8uZ3JvdXBzPy52YWx1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiB2YXJpYWJsZXM7XG4gICAgfVxuXG4gICAgZ2V0IG1hbnVhbCgpOiBzdHJpbmdbXSB7XG4gICAgICAgIGNvbnN0IHZhbCA9IHRoaXMubWFwLmdldChcIm1hbnVhbFwiKSA/PyBbXTtcbiAgICAgICAgcmV0dXJuIHR5cGVvZiB2YWwgPT0gXCJzdHJpbmdcIiA/IHZhbC5zcGxpdChcIiBcIikgOiB2YWw7XG4gICAgfVxuXG4gICAgZ2V0IGpvYigpOiBzdHJpbmdbXSB7XG4gICAgICAgIHJldHVybiB0aGlzLm1hcC5nZXQoXCJqb2JcIikgPz8gW107XG4gICAgfVxuXG4gICAgZ2V0IGF1dG9Db21wbGV0aW5nKCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy5tYXAuZ2V0KFwiYXV0b0NvbXBsZXRpbmdcIikgPz8gZmFsc2U7XG4gICAgfVxuXG4gICAgZ2V0IHByaXZpbGVnZWQoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLm1hcC5nZXQoXCJwcml2aWxlZ2VkXCIpID8/IGZhbHNlO1xuICAgIH1cblxuICAgIGdldCBuZWVkcygpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubWFwLmdldChcIm5lZWRzXCIpID8/IGZhbHNlO1xuICAgIH1cblxuICAgIGdldCBvbmx5TmVlZHMoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLm1hcC5nZXQoXCJvbmx5TmVlZHNcIikgPz8gZmFsc2U7XG4gICAgfVxuXG4gICAgZ2V0IGNvbXBsZXRpb24oKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLm1hcC5nZXQoXCJjb21wbGV0aW9uXCIpID8/IGZhbHNlO1xuICAgIH1cblxuICAgIGdldCBsaXN0KCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy5tYXAuZ2V0KFwibGlzdFwiKSA/PyBmYWxzZTtcbiAgICB9XG5cbiAgICBnZXQgbGlzdEFsbCgpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubWFwLmdldChcImxpc3RBbGxcIikgPz8gZmFsc2U7XG4gICAgfVxuXG4gICAgZ2V0IGxpc3RKc29uKCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy5tYXAuZ2V0KFwibGlzdEpzb25cIikgPz8gZmFsc2U7XG4gICAgfVxuXG4gICAgZ2V0IHByZXZpZXcoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLm1hcC5nZXQoXCJwcmV2aWV3XCIpID8/IGZhbHNlO1xuICAgIH1cblxuICAgIGdldCBzaGVsbElzb2xhdGlvbigpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubWFwLmdldChcInNoZWxsSXNvbGF0aW9uXCIpID8/IGZhbHNlO1xuICAgIH1cblxuICAgIGdldCBmZXRjaEluY2x1ZGVzKCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy5tYXAuZ2V0KFwiZmV0Y2hJbmNsdWRlc1wiKSA/PyBmYWxzZTtcbiAgICB9XG5cbiAgICBnZXQgbW91bnRDYWNoZSgpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubWFwLmdldChcIm1vdW50Q2FjaGVcIikgPz8gZmFsc2U7XG4gICAgfVxufVxuIl19
package/src/commander.js CHANGED
@@ -2,13 +2,13 @@
2
2
  var __importDefault = (this && this.__importDefault) || function (mod) {
3
3
  return (mod && mod.__esModule) ? mod : { "default": mod };
4
4
  };
5
- var _a;
6
5
  Object.defineProperty(exports, "__esModule", { value: true });
7
6
  exports.Commander = void 0;
8
7
  const chalk_1 = __importDefault(require("chalk"));
9
8
  const utils_1 = require("./utils");
10
9
  const job_executor_1 = require("./job-executor");
11
10
  const fs_extra_1 = __importDefault(require("fs-extra"));
11
+ const exit_error_1 = require("./types/exit-error");
12
12
  class Commander {
13
13
  static async runPipeline(argv, parser, writeStreams) {
14
14
  const jobs = parser.jobs;
@@ -17,7 +17,7 @@ class Commander {
17
17
  potentialStarters = potentialStarters.filter(j => j.when !== "never");
18
18
  potentialStarters = potentialStarters.filter(j => j.when !== "manual" || argv.manual.includes(j.name));
19
19
  await job_executor_1.JobExecutor.runLoop(argv, jobs, stages, potentialStarters);
20
- await Commander.printReport(argv.cwd, writeStreams, jobs, stages, parser.jobNamePad);
20
+ await Commander.printReport(argv.cwd, argv.stateDir, writeStreams, jobs, stages, parser.jobNamePad);
21
21
  }
22
22
  static async runJobs(argv, parser, writeStreams) {
23
23
  const needs = argv.needs || argv.onlyNeeds;
@@ -25,22 +25,112 @@ class Commander {
25
25
  const jobs = parser.jobs;
26
26
  const stages = parser.stages;
27
27
  let potentialStarters = [];
28
- const jobPoolMap = needs ? new Map(jobs) : new Map();
28
+ const jobSet = needs ? new Set(jobs) : new Set();
29
29
  jobArgs.forEach(jobName => {
30
- const job = utils_1.Utils.getJobByName(jobs, jobName);
31
- jobPoolMap.set(jobName, job);
32
- if (needs) {
33
- potentialStarters = potentialStarters.concat(job_executor_1.JobExecutor.getPastToWaitFor(jobs, stages, job, argv.manual));
30
+ const baseJobs = jobs.filter(j => j.baseName == jobName);
31
+ for (const b of baseJobs) {
32
+ jobSet.add(b);
33
+ if (needs) {
34
+ potentialStarters = potentialStarters.concat(job_executor_1.JobExecutor.getPastToWaitFor(jobs, stages, b, argv.manual));
35
+ }
36
+ potentialStarters.push(b);
34
37
  }
35
- potentialStarters.push(job);
36
38
  });
39
+ if (potentialStarters.length === 0) {
40
+ throw new exit_error_1.ExitError((0, chalk_1.default) `{blueBright ${jobArgs.join(",")}} could not be found`);
41
+ }
37
42
  if (argv.onlyNeeds) {
38
43
  jobArgs.forEach((j) => {
39
44
  potentialStarters = potentialStarters.filter(p => p.name !== j);
40
45
  });
41
46
  }
42
- await job_executor_1.JobExecutor.runLoop(argv, jobPoolMap, stages, potentialStarters);
43
- await Commander.printReport(argv.cwd, writeStreams, jobs, stages, parser.jobNamePad);
47
+ await job_executor_1.JobExecutor.runLoop(argv, Array.from(jobSet), stages, potentialStarters);
48
+ await Commander.printReport(argv.cwd, argv.stateDir, writeStreams, jobs, stages, parser.jobNamePad);
49
+ }
50
+ static async printReport(cwd, stateDir, writeStreams, jobs, stages, jobNamePad) {
51
+ writeStreams.stdout("\n");
52
+ const preScripts = {
53
+ successful: [],
54
+ failed: [],
55
+ warned: [],
56
+ };
57
+ const afterScripts = {
58
+ warned: [],
59
+ };
60
+ for (const job of jobs.values()) {
61
+ if (job.started && job.afterScriptsExitCode !== 0) {
62
+ afterScripts.warned.push(job);
63
+ }
64
+ }
65
+ for (const job of jobs.values()) {
66
+ if (!job.started) {
67
+ continue;
68
+ }
69
+ if (job.preScriptsExitCode === 0) {
70
+ preScripts.successful.push(job);
71
+ }
72
+ else if (job.allowFailure) {
73
+ preScripts.warned.push(job);
74
+ }
75
+ else {
76
+ preScripts.failed.push(job);
77
+ }
78
+ }
79
+ if (preScripts.successful.length !== 0) {
80
+ preScripts.successful.sort((a, b) => stages.indexOf(a.stage) - stages.indexOf(b.stage));
81
+ preScripts.successful.forEach((job) => {
82
+ const namePad = job.name.padEnd(jobNamePad);
83
+ writeStreams.stdout((0, chalk_1.default) `{black.bgGreenBright PASS } {blueBright ${namePad}}`);
84
+ if (job.coveragePercent) {
85
+ writeStreams.stdout((0, chalk_1.default) ` ${job.coveragePercent}% {grey coverage}`);
86
+ }
87
+ writeStreams.stdout("\n");
88
+ });
89
+ }
90
+ if (preScripts.warned.length !== 0) {
91
+ preScripts.warned.sort((a, b) => stages.indexOf(a.stage) - stages.indexOf(b.stage));
92
+ for (const { name } of preScripts.warned) {
93
+ const namePad = name.padEnd(jobNamePad);
94
+ const safeName = utils_1.Utils.getSafeJobName(name);
95
+ writeStreams.stdout((0, chalk_1.default) `{black.bgYellowBright WARN } {blueBright ${namePad}} pre_script\n`);
96
+ const outputLog = await fs_extra_1.default.readFile(`${cwd}/${stateDir}/output/${safeName}.log`, "utf8");
97
+ for (const line of outputLog.split(/\r?\n/).filter(j => !j.includes("[32m$ ")).filter(j => j !== "").slice(-3)) {
98
+ writeStreams.stdout((0, chalk_1.default) ` {yellow >} ${line}\n`);
99
+ }
100
+ }
101
+ }
102
+ if (afterScripts.warned.length !== 0) {
103
+ afterScripts.warned.sort((a, b) => stages.indexOf(a.stage) - stages.indexOf(b.stage));
104
+ afterScripts.warned.forEach(({ name }) => {
105
+ const namePad = name.padEnd(jobNamePad);
106
+ writeStreams.stdout((0, chalk_1.default) `{black.bgYellowBright WARN } {blueBright ${namePad}} after_script\n`);
107
+ });
108
+ }
109
+ if (preScripts.failed.length !== 0) {
110
+ preScripts.failed.sort((a, b) => stages.indexOf(a.stage) - stages.indexOf(b.stage));
111
+ for (const { name } of preScripts.failed) {
112
+ const namePad = name.padEnd(jobNamePad);
113
+ const safeName = utils_1.Utils.getSafeJobName(name);
114
+ writeStreams.stdout((0, chalk_1.default) `{black.bgRed FAIL } {blueBright ${namePad}}\n`);
115
+ const outputLog = await fs_extra_1.default.readFile(`${cwd}/${stateDir}/output/${safeName}.log`, "utf8");
116
+ for (const line of outputLog.split(/\r?\n/).filter(j => !j.includes("[32m$ ")).filter(j => j !== "").slice(-3)) {
117
+ writeStreams.stdout((0, chalk_1.default) ` {red >} ${line}\n`);
118
+ }
119
+ }
120
+ }
121
+ for (const job of preScripts.successful) {
122
+ const e = job.environment;
123
+ if (e == null) {
124
+ continue;
125
+ }
126
+ const name = utils_1.Utils.expandText(e.name, job.expandedVariables);
127
+ const url = utils_1.Utils.expandText(e.url, job.expandedVariables);
128
+ writeStreams.stdout((0, chalk_1.default) `{blueBright ${job.name}} environment: \{ name: {bold ${name}}`);
129
+ if (url != null) {
130
+ writeStreams.stdout((0, chalk_1.default) `, url: {bold ${url}}`);
131
+ }
132
+ writeStreams.stdout(" }\n");
133
+ }
44
134
  }
45
135
  static runList(parser, writeStreams, listAll) {
46
136
  const stages = parser.stages;
@@ -90,90 +180,4 @@ class Commander {
90
180
  }
91
181
  }
92
182
  exports.Commander = Commander;
93
- _a = Commander;
94
- Commander.printReport = async (cwd, writeStreams, jobs, stages, jobNamePad) => {
95
- writeStreams.stdout("\n");
96
- const preScripts = {
97
- successful: [],
98
- failed: [],
99
- warned: [],
100
- };
101
- const afterScripts = {
102
- warned: [],
103
- };
104
- for (const job of jobs.values()) {
105
- if (job.started && job.afterScriptsExitCode !== 0) {
106
- afterScripts.warned.push(job);
107
- }
108
- }
109
- for (const job of jobs.values()) {
110
- if (!job.started) {
111
- continue;
112
- }
113
- if (job.preScriptsExitCode === 0) {
114
- preScripts.successful.push(job);
115
- }
116
- else if (job.allowFailure) {
117
- preScripts.warned.push(job);
118
- }
119
- else {
120
- preScripts.failed.push(job);
121
- }
122
- }
123
- if (preScripts.successful.length !== 0) {
124
- preScripts.successful.sort((a, b) => stages.indexOf(a.stage) - stages.indexOf(b.stage));
125
- preScripts.successful.forEach((job) => {
126
- const namePad = job.name.padEnd(jobNamePad);
127
- writeStreams.stdout((0, chalk_1.default) `{black.bgGreenBright PASS } {blueBright ${namePad}}`);
128
- if (job.coveragePercent) {
129
- writeStreams.stdout((0, chalk_1.default) ` ${job.coveragePercent}% {grey coverage}`);
130
- }
131
- writeStreams.stdout("\n");
132
- });
133
- }
134
- if (preScripts.warned.length !== 0) {
135
- preScripts.warned.sort((a, b) => stages.indexOf(a.stage) - stages.indexOf(b.stage));
136
- for (const { name } of preScripts.warned) {
137
- const namePad = name.padEnd(jobNamePad);
138
- const safeName = utils_1.Utils.getSafeJobName(name);
139
- writeStreams.stdout((0, chalk_1.default) `{black.bgYellowBright WARN } {blueBright ${namePad}} pre_script\n`);
140
- const outputLog = await fs_extra_1.default.readFile(`${cwd}/.gitlab-ci-local/output/${safeName}.log`, "utf8");
141
- for (const line of outputLog.split(/\r?\n/).filter(j => !j.includes("[32m$ ")).filter(j => j !== "").slice(-3)) {
142
- writeStreams.stdout((0, chalk_1.default) ` {yellow >} ${line}\n`);
143
- }
144
- }
145
- }
146
- if (afterScripts.warned.length !== 0) {
147
- afterScripts.warned.sort((a, b) => stages.indexOf(a.stage) - stages.indexOf(b.stage));
148
- afterScripts.warned.forEach(({ name }) => {
149
- const namePad = name.padEnd(jobNamePad);
150
- writeStreams.stdout((0, chalk_1.default) `{black.bgYellowBright WARN } {blueBright ${namePad}} after_script\n`);
151
- });
152
- }
153
- if (preScripts.failed.length !== 0) {
154
- preScripts.failed.sort((a, b) => stages.indexOf(a.stage) - stages.indexOf(b.stage));
155
- for (const { name } of preScripts.failed) {
156
- const namePad = name.padEnd(jobNamePad);
157
- const safeName = utils_1.Utils.getSafeJobName(name);
158
- writeStreams.stdout((0, chalk_1.default) `{black.bgRed FAIL } {blueBright ${namePad}}\n`);
159
- const outputLog = await fs_extra_1.default.readFile(`${cwd}/.gitlab-ci-local/output/${safeName}.log`, "utf8");
160
- for (const line of outputLog.split(/\r?\n/).filter(j => !j.includes("[32m$ ")).filter(j => j !== "").slice(-3)) {
161
- writeStreams.stdout((0, chalk_1.default) ` {red >} ${line}\n`);
162
- }
163
- }
164
- }
165
- for (const job of preScripts.successful) {
166
- const e = job.environment;
167
- if (e == null) {
168
- continue;
169
- }
170
- const name = utils_1.Utils.expandText(e.name, job.expandedVariables);
171
- const url = utils_1.Utils.expandText(e.url, job.expandedVariables);
172
- writeStreams.stdout((0, chalk_1.default) `{blueBright ${job.name}} environment: \{ name: {bold ${name}}`);
173
- if (url != null) {
174
- writeStreams.stdout((0, chalk_1.default) `, url: {bold ${url}}`);
175
- }
176
- writeStreams.stdout(" }\n");
177
- }
178
- };
179
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29tbWFuZGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiY29tbWFuZGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7QUFBQSxrREFBMEI7QUFHMUIsbUNBQThCO0FBRTlCLGlEQUEyQztBQUMzQyx3REFBMEI7QUFHMUIsTUFBYSxTQUFTO0lBRWxCLE1BQU0sQ0FBQyxLQUFLLENBQUMsV0FBVyxDQUFDLElBQVUsRUFBRSxNQUFjLEVBQUUsWUFBMEI7UUFDM0UsTUFBTSxJQUFJLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQztRQUN6QixNQUFNLE1BQU0sR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDO1FBRTdCLElBQUksaUJBQWlCLEdBQUcsQ0FBQyxHQUFHLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDO1FBQzNDLGlCQUFpQixHQUFHLGlCQUFpQixDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLEtBQUssT0FBTyxDQUFDLENBQUM7UUFDdEUsaUJBQWlCLEdBQUcsaUJBQWlCLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksS0FBSyxRQUFRLElBQUksSUFBSSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7UUFDdkcsTUFBTSwwQkFBVyxDQUFDLE9BQU8sQ0FBQyxJQUFJLEVBQUUsSUFBSSxFQUFFLE1BQU0sRUFBRSxpQkFBaUIsQ0FBQyxDQUFDO1FBQ2pFLE1BQU0sU0FBUyxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFLFlBQVksRUFBRSxJQUFJLEVBQUUsTUFBTSxFQUFFLE1BQU0sQ0FBQyxVQUFVLENBQUMsQ0FBQztJQUN6RixDQUFDO0lBRUQsTUFBTSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsSUFBVSxFQUFFLE1BQWMsRUFBRSxZQUEwQjtRQUN2RSxNQUFNLEtBQUss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QUM7YUFDbkQ7U0FDSjtLQUNKO0lBRUQsS0FBSyxNQUFNLEdBQUcsSUFBSSxVQUFVLENBQUMsVUFBVSxFQUFFO1FBQ3JDLE1BQU0sQ0FBQyxHQUFHLEdBQUcsQ0FBQyxXQUFXLENBQUM7UUFDMUIsSUFBSSxDQUFDLElBQUksSUFBSSxFQUFFO1lBQ1gsU0FBUztTQUNaO1FBQ0QsTUFBTSxJQUFJLEdBQUcsYUFBSyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsSUFBSSxFQUFFLEdBQUcsQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDO1FBQzdELE1BQU0sR0FBRyxHQUFHLGFBQUssQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxHQUFHLENBQUMsaUJBQWlCLENBQUMsQ0FBQztRQUMzRCxZQUFZLENBQUMsTUFBTSxDQUFDLElBQUEsZUFBSyxFQUFBLGVBQWUsR0FBRyxDQUFDLElBQUksaUNBQWlDLElBQUksR0FBRyxDQUFDLENBQUM7UUFDMUYsSUFBSSxHQUFHLElBQUksSUFBSSxFQUFFO1lBQ2IsWUFBWSxDQUFDLE1BQU0sQ0FBQyxJQUFBLGVBQUssRUFBQSxnQkFBZ0IsR0FBRyxHQUFHLENBQUMsQ0FBQztTQUNwRDtRQUNELFlBQVksQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUM7S0FDL0I7QUFFTCxDQUFFLENBQUEiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgY2hhbGsgZnJvbSBcImNoYWxrXCI7XG5pbXBvcnQge0pvYn0gZnJvbSBcIi4vam9iXCI7XG5pbXBvcnQge1BhcnNlcn0gZnJvbSBcIi4vcGFyc2VyXCI7XG5pbXBvcnQge1V0aWxzfSBmcm9tIFwiLi91dGlsc1wiO1xuaW1wb3J0IHtXcml0ZVN0cmVhbXN9IGZyb20gXCIuL3R5cGVzL3dyaXRlLXN0cmVhbXNcIjtcbmltcG9ydCB7Sm9iRXhlY3V0b3J9IGZyb20gXCIuL2pvYi1leGVjdXRvclwiO1xuaW1wb3J0IGZzIGZyb20gXCJmcy1leHRyYVwiO1xuaW1wb3J0IHtBcmd2fSBmcm9tIFwiLi9hcmd2XCI7XG5cbmV4cG9ydCBjbGFzcyBDb21tYW5kZXIge1xuXG4gICAgc3RhdGljIGFzeW5jIHJ1blBpcGVsaW5lKGFyZ3Y6IEFyZ3YsIHBhcnNlcjogUGFyc2VyLCB3cml0ZVN0cmVhbXM6IFdyaXRlU3RyZWFtcykge1xuICAgICAgICBjb25zdCBqb2JzID0gcGFyc2VyLmpvYnM7XG4gICAgICAgIGNvbnN0IHN0YWdlcyA9IHBhcnNlci5zdGFnZXM7XG5cbiAgICAgICAgbGV0IHBvdGVudGlhbFN0YXJ0ZXJzID0gWy4uLmpvYnMudmFsdWVzKCldO1xuICAgICAgICBwb3RlbnRpYWxTdGFydGVycyA9IHBvdGVudGlhbFN0YXJ0ZXJzLmZpbHRlcihqID0+IGoud2hlbiAhPT0gXCJuZXZlclwiKTtcbiAgICAgICAgcG90ZW50aWFsU3RhcnRlcnMgPSBwb3RlbnRpYWxTdGFydGVycy5maWx0ZXIoaiA9PiBqLndoZW4gIT09IFwibWFudWFsXCIgfHwgYXJndi5tYW51YWwuaW5jbHVkZXMoai5uYW1lKSk7XG4gICAgICAgIGF3YWl0IEpvYkV4ZWN1dG9yLnJ1bkxvb3AoYXJndiwgam9icywgc3RhZ2VzLCBwb3RlbnRpYWxTdGFydGVycyk7XG4gICAgICAgIGF3YWl0IENvbW1hbmRlci5wcmludFJlcG9ydChhcmd2LmN3ZCwgd3JpdGVTdHJlYW1zLCBqb2JzLCBzdGFnZXMsIHBhcnNlci5qb2JOYW1lUGFkKTtcbiAgICB9XG5cbiAgICBzdGF0aWMgYXN5bmMgcnVuSm9icyhhcmd2OiBBcmd2LCBwYXJzZXI6IFBhcnNlciwgd3JpdGVTdHJlYW1zOiBXcml0ZVN0cmVhbXMpIHtcbiAgICAgICAgY29uc3QgbmVlZHMgPSBhcmd2Lm5lZWRzIHx8IGFyZ3Yub25seU5lZWRzO1xuICAgICAgICBjb25zdCBqb2JBcmdzID0gYXJndi5qb2I7XG4gICAgICAgIGNvbnN0IGpvYnMgPSBwYXJzZXIuam9icztcbiAgICAgICAgY29uc3Qgc3RhZ2VzID0gcGFyc2VyLnN0YWdlcztcblxuXG4gICAgICAgIGxldCBwb3RlbnRpYWxTdGFydGVyczogSm9iW10gPSBbXTtcbiAgICAgICAgY29uc3Qgam9iUG9vbE1hcCA9IG5lZWRzID8gbmV3IE1hcDxzdHJpbmcsIEpvYj4oam9icykgOiBuZXcgTWFwPHN0cmluZywgSm9iPigpO1xuICAgICAgICBqb2JBcmdzLmZvckVhY2goam9iTmFtZSA9PiB7XG4gICAgICAgICAgICBjb25zdCBqb2IgPSBVdGlscy5nZXRKb2JCeU5hbWUoam9icywgam9iTmFtZSk7XG4gICAgICAgICAgICBqb2JQb29sTWFwLnNldChqb2JOYW1lLCBqb2IpO1xuICAgICAgICAgICAgaWYgKG5lZWRzKSB7XG4gICAgICAgICAgICAgICAgcG90ZW50aWFsU3RhcnRlcnMgPSBwb3RlbnRpYWxTdGFydGVycy5jb25jYXQoSm9iRXhlY3V0b3IuZ2V0UGFzdFRvV2FpdEZvcihqb2JzLCBzdGFnZXMsIGpvYiwgYXJndi5tYW51YWwpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHBvdGVudGlhbFN0YXJ0ZXJzLnB1c2goam9iKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgaWYgKGFyZ3Yub25seU5lZWRzKSB7XG4gICAgICAgICAgICBqb2JBcmdzLmZvckVhY2goKGopID0+IHtcbiAgICAgICAgICAgICAgICBwb3RlbnRpYWxTdGFydGVycyA9IHBvdGVudGlhbFN0YXJ0ZXJzLmZpbHRlcihwID0+IHAubmFtZSAhPT0gaik7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGF3YWl0IEpvYkV4ZWN1dG9yLnJ1bkxvb3AoYXJndiwgam9iUG9vbE1hcCwgc3RhZ2VzLCBwb3RlbnRpYWxTdGFydGVycyk7XG4gICAgICAgIGF3YWl0IENvbW1hbmRlci5wcmludFJlcG9ydChhcmd2LmN3ZCwgd3JpdGVTdHJlYW1zLCBqb2JzLCBzdGFnZXMsIHBhcnNlci5qb2JOYW1lUGFkKTtcbiAgICB9XG5cbiAgICBzdGF0aWMgcHJpbnRSZXBvcnQgPSBhc3luYyAoY3dkOiBzdHJpbmcsIHdyaXRlU3RyZWFtczogV3JpdGVTdHJlYW1zLCBqb2JzOiBSZWFkb25seU1hcDxzdHJpbmcsIEpvYj4sIHN0YWdlczogcmVhZG9ubHkgc3RyaW5nW10sIGpvYk5hbWVQYWQ6IG51bWJlcikgPT4ge1xuXG4gICAgICAgIHdyaXRlU3RyZWFtcy5zdGRvdXQoXCJcXG5cIik7XG5cbiAgICAgICAgY29uc3QgcHJlU2NyaXB0czogeyBzdWNjZXNzZnVsOiBKb2JbXTsgZmFpbGVkOiBKb2JbXTsgd2FybmVkOiBKb2JbXSB9ID0ge1xuICAgICAgICAgICAgc3VjY2Vzc2Z1bDogW10sXG4gICAgICAgICAgICBmYWlsZWQ6IFtdLFxuICAgICAgICAgICAgd2FybmVkOiBbXSxcbiAgICAgICAgfTtcbiAgICAgICAgY29uc3QgYWZ0ZXJTY3JpcHRzOiB7IHdhcm5lZDogSm9iW10gfSA9IHtcbiAgICAgICAgICAgIHdhcm5lZDogW10sXG4gICAgICAgIH07XG5cbiAgICAgICAgZm9yIChjb25zdCBqb2Igb2Ygam9icy52YWx1ZXMoKSkge1xuICAgICAgICAgICAgaWYgKGpvYi5zdGFydGVkICYmIGpvYi5hZnRlclNjcmlwdHNFeGl0Q29kZSAhPT0gMCkge1xuICAgICAgICAgICAgICAgIGFmdGVyU2NyaXB0cy53YXJuZWQucHVzaChqb2IpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgZm9yIChjb25zdCBqb2Igb2Ygam9icy52YWx1ZXMoKSkge1xuICAgICAgICAgICAgaWYgKCFqb2Iuc3RhcnRlZCkge1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoam9iLnByZVNjcmlwdHNFeGl0Q29kZSA9PT0gMCkge1xuICAgICAgICAgICAgICAgIHByZVNjcmlwdHMuc3VjY2Vzc2Z1bC5wdXNoKGpvYik7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGpvYi5hbGxvd0ZhaWx1cmUpIHtcbiAgICAgICAgICAgICAgICBwcmVTY3JpcHRzLndhcm5lZC5wdXNoKGpvYik7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHByZVNjcmlwdHMuZmFpbGVkLnB1c2goam9iKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChwcmVTY3JpcHRzLnN1Y2Nlc3NmdWwubGVuZ3RoICE9PSAwKSB7XG4gICAgICAgICAgICBwcmVTY3JpcHRzLnN1Y2Nlc3NmdWwuc29ydCgoYSwgYikgPT4gc3RhZ2VzLmluZGV4T2YoYS5zdGFnZSkgLSBzdGFnZXMuaW5kZXhPZihiLnN0YWdlKSk7XG4gICAgICAgICAgICBwcmVTY3JpcHRzLnN1Y2Nlc3NmdWwuZm9yRWFjaCgoam9iKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgbmFtZVBhZCA9IGpvYi5uYW1lLnBhZEVuZChqb2JOYW1lUGFkKTtcbiAgICAgICAgICAgICAgICB3cml0ZVN0cmVhbXMuc3Rkb3V0KGNoYWxrYHtibGFjay5iZ0dyZWVuQnJpZ2h0ICBQQVNTIH0ge2JsdWVCcmlnaHQgJHtuYW1lUGFkfX1gKTtcbiAgICAgICAgICAgICAgICBpZiAoam9iLmNvdmVyYWdlUGVyY2VudCkge1xuICAgICAgICAgICAgICAgICAgICB3cml0ZVN0cmVhbXMuc3Rkb3V0KGNoYWxrYCAke2pvYi5jb3ZlcmFnZVBlcmNlbnR9JSB7Z3JleSBjb3ZlcmFnZX1gKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgd3JpdGVTdHJlYW1zLnN0ZG91dChcIlxcblwiKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHByZVNjcmlwdHMud2FybmVkLmxlbmd0aCAhPT0gMCkge1xuICAgICAgICAgICAgcHJlU2NyaXB0cy53YXJuZWQuc29ydCgoYSwgYikgPT4gc3RhZ2VzLmluZGV4T2YoYS5zdGFnZSkgLSBzdGFnZXMuaW5kZXhPZihiLnN0YWdlKSk7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IHtuYW1lfSBvZiBwcmVTY3JpcHRzLndhcm5lZCkge1xuICAgICAgICAgICAgICAgIGNvbnN0IG5hbWVQYWQgPSBuYW1lLnBhZEVuZChqb2JOYW1lUGFkKTtcbiAgICAgICAgICAgICAgICBjb25zdCBzYWZlTmFtZSA9IFV0aWxzLmdldFNhZmVKb2JOYW1lKG5hbWUpO1xuICAgICAgICAgICAgICAgIHdyaXRlU3RyZWFtcy5zdGRvdXQoY2hhbGtge2JsYWNrLmJnWWVsbG93QnJpZ2h0ICBXQVJOIH0ge2JsdWVCcmlnaHQgJHtuYW1lUGFkfX0gIHByZV9zY3JpcHRcXG5gKTtcbiAgICAgICAgICAgICAgICBjb25zdCBvdXRwdXRMb2cgPSBhd2FpdCBmcy5yZWFkRmlsZShgJHtjd2R9Ly5naXRsYWItY2ktbG9jYWwvb3V0cHV0LyR7c2FmZU5hbWV9LmxvZ2AsIFwidXRmOFwiKTtcbiAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IGxpbmUgb2Ygb3V0cHV0TG9nLnNwbGl0KC9cXHI/XFxuLykuZmlsdGVyKGogPT4gIWouaW5jbHVkZXMoXCJbMzJtJCBcIikpLmZpbHRlcihqID0+IGogIT09IFwiXCIpLnNsaWNlKC0zKSkge1xuICAgICAgICAgICAgICAgICAgICB3cml0ZVN0cmVhbXMuc3Rkb3V0KGNoYWxrYCAge3llbGxvdyA+fSAke2xpbmV9XFxuYCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGFmdGVyU2NyaXB0cy53YXJuZWQubGVuZ3RoICE9PSAwKSB7XG4gICAgICAgICAgICBhZnRlclNjcmlwdHMud2FybmVkLnNvcnQoKGEsIGIpID0+IHN0YWdlcy5pbmRleE9mKGEuc3RhZ2UpIC0gc3RhZ2VzLmluZGV4T2YoYi5zdGFnZSkpO1xuICAgICAgICAgICAgYWZ0ZXJTY3JpcHRzLndhcm5lZC5mb3JFYWNoKCh7bmFtZX0pID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBuYW1lUGFkID0gbmFtZS5wYWRFbmQoam9iTmFtZVBhZCk7XG4gICAgICAgICAgICAgICAgd3JpdGVTdHJlYW1zLnN0ZG91dChjaGFsa2B7YmxhY2suYmdZZWxsb3dCcmlnaHQgIFdBUk4gfSB7Ymx1ZUJyaWdodCAke25hbWVQYWR9fSAgYWZ0ZXJfc2NyaXB0XFxuYCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChwcmVTY3JpcHRzLmZhaWxlZC5sZW5ndGggIT09IDApIHtcbiAgICAgICAgICAgIHByZVNjcmlwdHMuZmFpbGVkLnNvcnQoKGEsIGIpID0+IHN0YWdlcy5pbmRleE9mKGEuc3RhZ2UpIC0gc3RhZ2VzLmluZGV4T2YoYi5zdGFnZSkpO1xuICAgICAgICAgICAgZm9yIChjb25zdCB7bmFtZX0gb2YgcHJlU2NyaXB0cy5mYWlsZWQpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBuYW1lUGFkID0gbmFtZS5wYWRFbmQoam9iTmFtZVBhZCk7XG4gICAgICAgICAgICAgICAgY29uc3Qgc2FmZU5hbWUgPSBVdGlscy5nZXRTYWZlSm9iTmFtZShuYW1lKTtcbiAgICAgICAgICAgICAgICB3cml0ZVN0cmVhbXMuc3Rkb3V0KGNoYWxrYHtibGFjay5iZ1JlZCAgRkFJTCB9IHtibHVlQnJpZ2h0ICR7bmFtZVBhZH19XFxuYCk7XG4gICAgICAgICAgICAgICAgY29uc3Qgb3V0cHV0TG9nID0gYXdhaXQgZnMucmVhZEZpbGUoYCR7Y3dkfS8uZ2l0bGFiLWNpLWxvY2FsL291dHB1dC8ke3NhZmVOYW1lfS5sb2dgLCBcInV0ZjhcIik7XG4gICAgICAgICAgICAgICAgZm9yIChjb25zdCBsaW5lIG9mIG91dHB1dExvZy5zcGxpdCgvXFxyP1xcbi8pLmZpbHRlcihqID0+ICFqLmluY2x1ZGVzKFwiWzMybSQgXCIpKS5maWx0ZXIoaiA9PiBqICE9PSBcIlwiKS5zbGljZSgtMykpIHtcbiAgICAgICAgICAgICAgICAgICAgd3JpdGVTdHJlYW1zLnN0ZG91dChjaGFsa2AgIHtyZWQgPn0gJHtsaW5lfVxcbmApO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGZvciAoY29uc3Qgam9iIG9mIHByZVNjcmlwdHMuc3VjY2Vzc2Z1bCkge1xuICAgICAgICAgICAgY29uc3QgZSA9IGpvYi5lbnZpcm9ubWVudDtcbiAgICAgICAgICAgIGlmIChlID09IG51bGwpIHtcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IG5hbWUgPSBVdGlscy5leHBhbmRUZXh0KGUubmFtZSwgam9iLmV4cGFuZGVkVmFyaWFibGVzKTtcbiAgICAgICAgICAgIGNvbnN0IHVybCA9IFV0aWxzLmV4cGFuZFRleHQoZS51cmwsIGpvYi5leHBhbmRlZFZhcmlhYmxlcyk7XG4gICAgICAgICAgICB3cml0ZVN0cmVhbXMuc3Rkb3V0KGNoYWxrYHtibHVlQnJpZ2h0ICR7am9iLm5hbWV9fSBlbnZpcm9ubWVudDogXFx7IG5hbWU6IHtib2xkICR7bmFtZX19YCk7XG4gICAgICAgICAgICBpZiAodXJsICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgICB3cml0ZVN0cmVhbXMuc3Rkb3V0KGNoYWxrYCwgdXJsOiB7Ym9sZCAke3VybH19YCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB3cml0ZVN0cmVhbXMuc3Rkb3V0KFwiIH1cXG5cIik7XG4gICAgICAgIH1cblxuICAgIH07XG5cbiAgICBzdGF0aWMgcnVuTGlzdChwYXJzZXI6IFBhcnNlciwgd3JpdGVTdHJlYW1zOiBXcml0ZVN0cmVhbXMsIGxpc3RBbGw6IGJvb2xlYW4pIHtcbiAgICAgICAgY29uc3Qgc3RhZ2VzID0gcGFyc2VyLnN0YWdlcztcbiAgICAgICAgbGV0IGpvYnMgPSBbLi4ucGFyc2VyLmpvYnMudmFsdWVzKCldO1xuICAgICAgICBqb2JzLnNvcnQoKGEsIGIpID0+IHtcbiAgICAgICAgICAgIHJldHVybiBzdGFnZXMuaW5kZXhPZihhLnN0YWdlKSAtIHN0YWdlcy5pbmRleE9mKGIuc3RhZ2UpO1xuICAgICAgICB9KTtcblxuICAgICAgICBsZXQgd2hlblBhZEVuZCA9IDQ7XG4gICAgICAgIGpvYnMuZm9yRWFjaChqID0+IHdoZW5QYWRFbmQgPSBNYXRoLm1heChqLndoZW4ubGVuZ3RoLCB3aGVuUGFkRW5kKSk7XG5cbiAgICAgICAgbGV0IHN0YWdlUGFkRW5kID0gNTtcbiAgICAgICAgc3RhZ2VzLmZvckVhY2gocyA9PiBzdGFnZVBhZEVuZCA9IE1hdGgubWF4KHMubGVuZ3RoLCBzdGFnZVBhZEVuZCkpO1xuXG4gICAgICAgIGxldCBkZXNjcmlwdGlvblBhZEVuZCA9IDExO1xuICAgICAgICBqb2JzLmZvckVhY2goaiA9PiBkZXNjcmlwdGlvblBhZEVuZCA9IE1hdGgubWF4KGouZGVzY3JpcHRpb24ubGVuZ3RoLCBkZXNjcmlwdGlvblBhZEVuZCkpO1xuXG4gICAgICAgIGNvbnN0IGpvYk5hbWVQYWQgPSBwYXJzZXIuam9iTmFtZVBhZDtcblxuICAgICAgICBpZiAoIWxpc3RBbGwpIHtcbiAgICAgICAgICAgIGpvYnMgPSBqb2JzLmZpbHRlcihqID0+IGoud2hlbiAhPT0gXCJuZXZlclwiKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHdyaXRlU3RyZWFtcy5zdGRvdXQoY2hhbGtge2dyZXkgJHtcIm5hbWVcIi5wYWRFbmQoam9iTmFtZVBhZCl9ICAke1wiZGVzY3JpcHRpb25cIi5wYWRFbmQoZGVzY3JpcHRpb25QYWRFbmQpfX0gIGApO1xuICAgICAgICB3cml0ZVN0cmVhbXMuc3Rkb3V0KGNoYWxrYHtncmV5ICR7XCJzdGFnZVwiLnBhZEVuZChzdGFnZVBhZEVuZCl9ICAke1wid2hlblwiLnBhZEVuZCh3aGVuUGFkRW5kKX19ICBgKTtcbiAgICAgICAgd3JpdGVTdHJlYW1zLnN0ZG91dChjaGFsa2B7Z3JleSBhbGxvd19mYWlsdXJlICBuZWVkc31cXG5gKTtcblxuICAgICAgICBjb25zdCByZW5kZXJMaW5lID0gKGpvYjogSm9iKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBuZWVkcyA9IGpvYi5uZWVkcztcbiAgICAgICAgICAgIGNvbnN0IGFsbG93RmFpbHVyZSA9IGpvYi5hbGxvd0ZhaWx1cmUgPyBcInRydWUgXCIgOiBcImZhbHNlXCI7XG4gICAgICAgICAgICBsZXQgam9iTGluZSA9IGNoYWxrYHtibHVlQnJpZ2h0ICR7am9iLm5hbWUucGFkRW5kKGpvYk5hbWVQYWQpfX0gICR7am9iLmRlc2NyaXB0aW9uLnBhZEVuZChkZXNjcmlwdGlvblBhZEVuZCl9ICBgO1xuICAgICAgICAgICAgam9iTGluZSArPSBjaGFsa2B7eWVsbG93ICR7am9iLnN0YWdlLnBhZEVuZChzdGFnZVBhZEVuZCl9fSAgJHtqb2Iud2hlbi5wYWRFbmQod2hlblBhZEVuZCl9ICAke2FsbG93RmFpbHVyZS5wYWRFbmQoMTEpfWA7XG4gICAgICAgICAgICBpZiAobmVlZHMpIHtcbiAgICAgICAgICAgICAgICBqb2JMaW5lICs9IGNoYWxrYCAgICBbe2JsdWVCcmlnaHQgJHtuZWVkcy5tYXAobiA9PiBuLmpvYikuam9pbihcIixcIil9fV1gO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgd3JpdGVTdHJlYW1zLnN0ZG91dChgJHtqb2JMaW5lfVxcbmApO1xuICAgICAgICB9O1xuXG4gICAgICAgIGpvYnMuZm9yRWFjaCgoam9iKSA9PiByZW5kZXJMaW5lKGpvYikpO1xuICAgIH1cblxuICAgIHN0YXRpYyBydW5Kc29uKHBhcnNlcjogUGFyc2VyLCB3cml0ZVN0cmVhbXM6IFdyaXRlU3RyZWFtcykge1xuICAgICAgICBjb25zdCBqb2JzID0gWy4uLnBhcnNlci5qb2JzLnZhbHVlcygpXTtcbiAgICAgICAgY29uc3QganNvbjogYW55W10gPSBbXTtcblxuICAgICAgICBqb2JzLmZvckVhY2goKGpvYikgPT4ge1xuICAgICAgICAgICAganNvbi5wdXNoKHtcbiAgICAgICAgICAgICAgICBuYW1lOiBqb2IubmFtZSxcbiAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbjogam9iLmRlc2NyaXB0aW9uLFxuICAgICAgICAgICAgICAgIHN0YWdlOiBqb2Iuc3RhZ2UsXG4gICAgICAgICAgICAgICAgd2hlbjogam9iLndoZW4sXG4gICAgICAgICAgICAgICAgYWxsb3dfZmFpbHVyZTogam9iLmFsbG93RmFpbHVyZSxcbiAgICAgICAgICAgICAgICBuZWVkczogam9iLm5lZWRzLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHdyaXRlU3RyZWFtcy5zdGRvdXQoYCR7SlNPTi5zdHJpbmdpZnkoanNvbiwgbnVsbCwgMil9XFxuYCk7XG4gICAgfVxuXG59XG4iXX0=
183
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29tbWFuZGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiY29tbWFuZGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7OztBQUFBLGtEQUEwQjtBQUcxQixtQ0FBOEI7QUFFOUIsaURBQTJDO0FBQzNDLHdEQUEwQjtBQUUxQixtREFBNkM7QUFFN0MsTUFBYSxTQUFTO0lBRWxCLE1BQU0sQ0FBQyxLQUFLLENBQUMsV0FBVyxDQUFDLElBQVUsRUFBRSxNQUFjLEVBQUUsWUFBMEI7UUFDM0UsTUFBTSxJQUFJLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQztRQUN6QixNQUFNLE1BQU0sR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDO1FBRTdCLElBQUksaUJBQWlCLEdBQUcsQ0FBQyxHQUFHLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDO1FBQzNDLGlCQUFpQixHQUFHLGlCQUFpQixDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLEtBQUssT0FBTyxDQUFDLENBQUM7UUFDdEUsaUJBQWlCLEdBQUcsaUJBQWlCLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksS0FBSyxRQUFRLElBQUksSUFBSSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7UUFDdkcsTUFBTSwwQkFBVyxDQUFDLE9BQU8sQ0FBQyxJQUFJLEVBQUUsSUFBSSxFQUFFLE1BQU0sRUFBRSxpQkFBaUIsQ0FBQyxDQUFDO1FBQ2pFLE1BQU0sU0FBUyxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFLElBQUksQ0FBQyxRQUFRLEVBQUUsWUFBWSxFQUFFLElBQUksRUFBRSxNQUFNLEVBQUUsTUFBTSxDQUFDLFVBQVUsQ0FBQyxDQUFDO0lBQ3hHLENBQUM7SUFFRCxNQUFNLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxJQUFVLEVBQUUs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QXRNRCw4QkFzTUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgY2hhbGsgZnJvbSBcImNoYWxrXCI7XG5pbXBvcnQge0pvYn0gZnJvbSBcIi4vam9iXCI7XG5pbXBvcnQge1BhcnNlcn0gZnJvbSBcIi4vcGFyc2VyXCI7XG5pbXBvcnQge1V0aWxzfSBmcm9tIFwiLi91dGlsc1wiO1xuaW1wb3J0IHtXcml0ZVN0cmVhbXN9IGZyb20gXCIuL3R5cGVzL3dyaXRlLXN0cmVhbXNcIjtcbmltcG9ydCB7Sm9iRXhlY3V0b3J9IGZyb20gXCIuL2pvYi1leGVjdXRvclwiO1xuaW1wb3J0IGZzIGZyb20gXCJmcy1leHRyYVwiO1xuaW1wb3J0IHtBcmd2fSBmcm9tIFwiLi9hcmd2XCI7XG5pbXBvcnQge0V4aXRFcnJvcn0gZnJvbSBcIi4vdHlwZXMvZXhpdC1lcnJvclwiO1xuXG5leHBvcnQgY2xhc3MgQ29tbWFuZGVyIHtcblxuICAgIHN0YXRpYyBhc3luYyBydW5QaXBlbGluZShhcmd2OiBBcmd2LCBwYXJzZXI6IFBhcnNlciwgd3JpdGVTdHJlYW1zOiBXcml0ZVN0cmVhbXMpIHtcbiAgICAgICAgY29uc3Qgam9icyA9IHBhcnNlci5qb2JzO1xuICAgICAgICBjb25zdCBzdGFnZXMgPSBwYXJzZXIuc3RhZ2VzO1xuXG4gICAgICAgIGxldCBwb3RlbnRpYWxTdGFydGVycyA9IFsuLi5qb2JzLnZhbHVlcygpXTtcbiAgICAgICAgcG90ZW50aWFsU3RhcnRlcnMgPSBwb3RlbnRpYWxTdGFydGVycy5maWx0ZXIoaiA9PiBqLndoZW4gIT09IFwibmV2ZXJcIik7XG4gICAgICAgIHBvdGVudGlhbFN0YXJ0ZXJzID0gcG90ZW50aWFsU3RhcnRlcnMuZmlsdGVyKGogPT4gai53aGVuICE9PSBcIm1hbnVhbFwiIHx8IGFyZ3YubWFudWFsLmluY2x1ZGVzKGoubmFtZSkpO1xuICAgICAgICBhd2FpdCBKb2JFeGVjdXRvci5ydW5Mb29wKGFyZ3YsIGpvYnMsIHN0YWdlcywgcG90ZW50aWFsU3RhcnRlcnMpO1xuICAgICAgICBhd2FpdCBDb21tYW5kZXIucHJpbnRSZXBvcnQoYXJndi5jd2QsIGFyZ3Yuc3RhdGVEaXIsIHdyaXRlU3RyZWFtcywgam9icywgc3RhZ2VzLCBwYXJzZXIuam9iTmFtZVBhZCk7XG4gICAgfVxuXG4gICAgc3RhdGljIGFzeW5jIHJ1bkpvYnMoYXJndjogQXJndiwgcGFyc2VyOiBQYXJzZXIsIHdyaXRlU3RyZWFtczogV3JpdGVTdHJlYW1zKSB7XG4gICAgICAgIGNvbnN0IG5lZWRzID0gYXJndi5uZWVkcyB8fCBhcmd2Lm9ubHlOZWVkcztcbiAgICAgICAgY29uc3Qgam9iQXJncyA9IGFyZ3Yuam9iO1xuICAgICAgICBjb25zdCBqb2JzID0gcGFyc2VyLmpvYnM7XG4gICAgICAgIGNvbnN0IHN0YWdlcyA9IHBhcnNlci5zdGFnZXM7XG5cblxuICAgICAgICBsZXQgcG90ZW50aWFsU3RhcnRlcnM6IEpvYltdID0gW107XG4gICAgICAgIGNvbnN0IGpvYlNldCA9IG5lZWRzID8gbmV3IFNldChqb2JzKSA6IG5ldyBTZXQ8Sm9iPigpO1xuICAgICAgICBqb2JBcmdzLmZvckVhY2goam9iTmFtZSA9PiB7XG4gICAgICAgICAgICBjb25zdCBiYXNlSm9icyA9IGpvYnMuZmlsdGVyKGogPT4gai5iYXNlTmFtZSA9PSBqb2JOYW1lKTtcbiAgICAgICAgICAgIGZvciAoY29uc3QgYiBvZiBiYXNlSm9icykge1xuICAgICAgICAgICAgICAgIGpvYlNldC5hZGQoYik7XG4gICAgICAgICAgICAgICAgaWYgKG5lZWRzKSB7XG4gICAgICAgICAgICAgICAgICAgIHBvdGVudGlhbFN0YXJ0ZXJzID0gcG90ZW50aWFsU3RhcnRlcnMuY29uY2F0KEpvYkV4ZWN1dG9yLmdldFBhc3RUb1dhaXRGb3Ioam9icywgc3RhZ2VzLCBiLCBhcmd2Lm1hbnVhbCkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBwb3RlbnRpYWxTdGFydGVycy5wdXNoKGIpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgaWYgKHBvdGVudGlhbFN0YXJ0ZXJzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEV4aXRFcnJvcihjaGFsa2B7Ymx1ZUJyaWdodCAke2pvYkFyZ3Muam9pbihcIixcIil9fSBjb3VsZCBub3QgYmUgZm91bmRgKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChhcmd2Lm9ubHlOZWVkcykge1xuICAgICAgICAgICAgam9iQXJncy5mb3JFYWNoKChqKSA9PiB7XG4gICAgICAgICAgICAgICAgcG90ZW50aWFsU3RhcnRlcnMgPSBwb3RlbnRpYWxTdGFydGVycy5maWx0ZXIocCA9PiBwLm5hbWUgIT09IGopO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgICBhd2FpdCBKb2JFeGVjdXRvci5ydW5Mb29wKGFyZ3YsIEFycmF5LmZyb20oam9iU2V0KSwgc3RhZ2VzLCBwb3RlbnRpYWxTdGFydGVycyk7XG4gICAgICAgIGF3YWl0IENvbW1hbmRlci5wcmludFJlcG9ydChhcmd2LmN3ZCwgYXJndi5zdGF0ZURpciwgd3JpdGVTdHJlYW1zLCBqb2JzLCBzdGFnZXMsIHBhcnNlci5qb2JOYW1lUGFkKTtcbiAgICB9XG5cbiAgICBzdGF0aWMgYXN5bmMgcHJpbnRSZXBvcnQoY3dkOiBzdHJpbmcsIHN0YXRlRGlyOiBzdHJpbmcsIHdyaXRlU3RyZWFtczogV3JpdGVTdHJlYW1zLCBqb2JzOiBSZWFkb25seUFycmF5PEpvYj4sIHN0YWdlczogcmVhZG9ubHkgc3RyaW5nW10sIGpvYk5hbWVQYWQ6IG51bWJlcikge1xuXG4gICAgICAgIHdyaXRlU3RyZWFtcy5zdGRvdXQoXCJcXG5cIik7XG5cbiAgICAgICAgY29uc3QgcHJlU2NyaXB0czogeyBzdWNjZXNzZnVsOiBKb2JbXTsgZmFpbGVkOiBKb2JbXTsgd2FybmVkOiBKb2JbXSB9ID0ge1xuICAgICAgICAgICAgc3VjY2Vzc2Z1bDogW10sXG4gICAgICAgICAgICBmYWlsZWQ6IFtdLFxuICAgICAgICAgICAgd2FybmVkOiBbXSxcbiAgICAgICAgfTtcbiAgICAgICAgY29uc3QgYWZ0ZXJTY3JpcHRzOiB7IHdhcm5lZDogSm9iW10gfSA9IHtcbiAgICAgICAgICAgIHdhcm5lZDogW10sXG4gICAgICAgIH07XG5cbiAgICAgICAgZm9yIChjb25zdCBqb2Igb2Ygam9icy52YWx1ZXMoKSkge1xuICAgICAgICAgICAgaWYgKGpvYi5zdGFydGVkICYmIGpvYi5hZnRlclNjcmlwdHNFeGl0Q29kZSAhPT0gMCkge1xuICAgICAgICAgICAgICAgIGFmdGVyU2NyaXB0cy53YXJuZWQucHVzaChqb2IpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgZm9yIChjb25zdCBqb2Igb2Ygam9icy52YWx1ZXMoKSkge1xuICAgICAgICAgICAgaWYgKCFqb2Iuc3RhcnRlZCkge1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoam9iLnByZVNjcmlwdHNFeGl0Q29kZSA9PT0gMCkge1xuICAgICAgICAgICAgICAgIHByZVNjcmlwdHMuc3VjY2Vzc2Z1bC5wdXNoKGpvYik7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGpvYi5hbGxvd0ZhaWx1cmUpIHtcbiAgICAgICAgICAgICAgICBwcmVTY3JpcHRzLndhcm5lZC5wdXNoKGpvYik7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHByZVNjcmlwdHMuZmFpbGVkLnB1c2goam9iKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChwcmVTY3JpcHRzLnN1Y2Nlc3NmdWwubGVuZ3RoICE9PSAwKSB7XG4gICAgICAgICAgICBwcmVTY3JpcHRzLnN1Y2Nlc3NmdWwuc29ydCgoYSwgYikgPT4gc3RhZ2VzLmluZGV4T2YoYS5zdGFnZSkgLSBzdGFnZXMuaW5kZXhPZihiLnN0YWdlKSk7XG4gICAgICAgICAgICBwcmVTY3JpcHRzLnN1Y2Nlc3NmdWwuZm9yRWFjaCgoam9iKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgbmFtZVBhZCA9IGpvYi5uYW1lLnBhZEVuZChqb2JOYW1lUGFkKTtcbiAgICAgICAgICAgICAgICB3cml0ZVN0cmVhbXMuc3Rkb3V0KGNoYWxrYHtibGFjay5iZ0dyZWVuQnJpZ2h0ICBQQVNTIH0ge2JsdWVCcmlnaHQgJHtuYW1lUGFkfX1gKTtcbiAgICAgICAgICAgICAgICBpZiAoam9iLmNvdmVyYWdlUGVyY2VudCkge1xuICAgICAgICAgICAgICAgICAgICB3cml0ZVN0cmVhbXMuc3Rkb3V0KGNoYWxrYCAke2pvYi5jb3ZlcmFnZVBlcmNlbnR9JSB7Z3JleSBjb3ZlcmFnZX1gKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgd3JpdGVTdHJlYW1zLnN0ZG91dChcIlxcblwiKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHByZVNjcmlwdHMud2FybmVkLmxlbmd0aCAhPT0gMCkge1xuICAgICAgICAgICAgcHJlU2NyaXB0cy53YXJuZWQuc29ydCgoYSwgYikgPT4gc3RhZ2VzLmluZGV4T2YoYS5zdGFnZSkgLSBzdGFnZXMuaW5kZXhPZihiLnN0YWdlKSk7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IHtuYW1lfSBvZiBwcmVTY3JpcHRzLndhcm5lZCkge1xuICAgICAgICAgICAgICAgIGNvbnN0IG5hbWVQYWQgPSBuYW1lLnBhZEVuZChqb2JOYW1lUGFkKTtcbiAgICAgICAgICAgICAgICBjb25zdCBzYWZlTmFtZSA9IFV0aWxzLmdldFNhZmVKb2JOYW1lKG5hbWUpO1xuICAgICAgICAgICAgICAgIHdyaXRlU3RyZWFtcy5zdGRvdXQoY2hhbGtge2JsYWNrLmJnWWVsbG93QnJpZ2h0ICBXQVJOIH0ge2JsdWVCcmlnaHQgJHtuYW1lUGFkfX0gIHByZV9zY3JpcHRcXG5gKTtcbiAgICAgICAgICAgICAgICBjb25zdCBvdXRwdXRMb2cgPSBhd2FpdCBmcy5yZWFkRmlsZShgJHtjd2R9LyR7c3RhdGVEaXJ9L291dHB1dC8ke3NhZmVOYW1lfS5sb2dgLCBcInV0ZjhcIik7XG4gICAgICAgICAgICAgICAgZm9yIChjb25zdCBsaW5lIG9mIG91dHB1dExvZy5zcGxpdCgvXFxyP1xcbi8pLmZpbHRlcihqID0+ICFqLmluY2x1ZGVzKFwiWzMybSQgXCIpKS5maWx0ZXIoaiA9PiBqICE9PSBcIlwiKS5zbGljZSgtMykpIHtcbiAgICAgICAgICAgICAgICAgICAgd3JpdGVTdHJlYW1zLnN0ZG91dChjaGFsa2AgIHt5ZWxsb3cgPn0gJHtsaW5lfVxcbmApO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChhZnRlclNjcmlwdHMud2FybmVkLmxlbmd0aCAhPT0gMCkge1xuICAgICAgICAgICAgYWZ0ZXJTY3JpcHRzLndhcm5lZC5zb3J0KChhLCBiKSA9PiBzdGFnZXMuaW5kZXhPZihhLnN0YWdlKSAtIHN0YWdlcy5pbmRleE9mKGIuc3RhZ2UpKTtcbiAgICAgICAgICAgIGFmdGVyU2NyaXB0cy53YXJuZWQuZm9yRWFjaCgoe25hbWV9KSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgbmFtZVBhZCA9IG5hbWUucGFkRW5kKGpvYk5hbWVQYWQpO1xuICAgICAgICAgICAgICAgIHdyaXRlU3RyZWFtcy5zdGRvdXQoY2hhbGtge2JsYWNrLmJnWWVsbG93QnJpZ2h0ICBXQVJOIH0ge2JsdWVCcmlnaHQgJHtuYW1lUGFkfX0gIGFmdGVyX3NjcmlwdFxcbmApO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAocHJlU2NyaXB0cy5mYWlsZWQubGVuZ3RoICE9PSAwKSB7XG4gICAgICAgICAgICBwcmVTY3JpcHRzLmZhaWxlZC5zb3J0KChhLCBiKSA9PiBzdGFnZXMuaW5kZXhPZihhLnN0YWdlKSAtIHN0YWdlcy5pbmRleE9mKGIuc3RhZ2UpKTtcbiAgICAgICAgICAgIGZvciAoY29uc3Qge25hbWV9IG9mIHByZVNjcmlwdHMuZmFpbGVkKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgbmFtZVBhZCA9IG5hbWUucGFkRW5kKGpvYk5hbWVQYWQpO1xuICAgICAgICAgICAgICAgIGNvbnN0IHNhZmVOYW1lID0gVXRpbHMuZ2V0U2FmZUpvYk5hbWUobmFtZSk7XG4gICAgICAgICAgICAgICAgd3JpdGVTdHJlYW1zLnN0ZG91dChjaGFsa2B7YmxhY2suYmdSZWQgIEZBSUwgfSB7Ymx1ZUJyaWdodCAke25hbWVQYWR9fVxcbmApO1xuICAgICAgICAgICAgICAgIGNvbnN0IG91dHB1dExvZyA9IGF3YWl0IGZzLnJlYWRGaWxlKGAke2N3ZH0vJHtzdGF0ZURpcn0vb3V0cHV0LyR7c2FmZU5hbWV9LmxvZ2AsIFwidXRmOFwiKTtcbiAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IGxpbmUgb2Ygb3V0cHV0TG9nLnNwbGl0KC9cXHI/XFxuLykuZmlsdGVyKGogPT4gIWouaW5jbHVkZXMoXCJbMzJtJCBcIikpLmZpbHRlcihqID0+IGogIT09IFwiXCIpLnNsaWNlKC0zKSkge1xuICAgICAgICAgICAgICAgICAgICB3cml0ZVN0cmVhbXMuc3Rkb3V0KGNoYWxrYCAge3JlZCA+fSAke2xpbmV9XFxuYCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgZm9yIChjb25zdCBqb2Igb2YgcHJlU2NyaXB0cy5zdWNjZXNzZnVsKSB7XG4gICAgICAgICAgICBjb25zdCBlID0gam9iLmVudmlyb25tZW50O1xuICAgICAgICAgICAgaWYgKGUgPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgbmFtZSA9IFV0aWxzLmV4cGFuZFRleHQoZS5uYW1lLCBqb2IuZXhwYW5kZWRWYXJpYWJsZXMpO1xuICAgICAgICAgICAgY29uc3QgdXJsID0gVXRpbHMuZXhwYW5kVGV4dChlLnVybCwgam9iLmV4cGFuZGVkVmFyaWFibGVzKTtcbiAgICAgICAgICAgIHdyaXRlU3RyZWFtcy5zdGRvdXQoY2hhbGtge2JsdWVCcmlnaHQgJHtqb2IubmFtZX19IGVudmlyb25tZW50OiBcXHsgbmFtZToge2JvbGQgJHtuYW1lfX1gKTtcbiAgICAgICAgICAgIGlmICh1cmwgIT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIHdyaXRlU3RyZWFtcy5zdGRvdXQoY2hhbGtgLCB1cmw6IHtib2xkICR7dXJsfX1gKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHdyaXRlU3RyZWFtcy5zdGRvdXQoXCIgfVxcblwiKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHN0YXRpYyBydW5MaXN0KHBhcnNlcjogUGFyc2VyLCB3cml0ZVN0cmVhbXM6IFdyaXRlU3RyZWFtcywgbGlzdEFsbDogYm9vbGVhbikge1xuICAgICAgICBjb25zdCBzdGFnZXMgPSBwYXJzZXIuc3RhZ2VzO1xuICAgICAgICBsZXQgam9icyA9IFsuLi5wYXJzZXIuam9icy52YWx1ZXMoKV07XG4gICAgICAgIGpvYnMuc29ydCgoYSwgYikgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHN0YWdlcy5pbmRleE9mKGEuc3RhZ2UpIC0gc3RhZ2VzLmluZGV4T2YoYi5zdGFnZSk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGxldCB3aGVuUGFkRW5kID0gNDtcbiAgICAgICAgam9icy5mb3JFYWNoKGogPT4gd2hlblBhZEVuZCA9IE1hdGgubWF4KGoud2hlbi5sZW5ndGgsIHdoZW5QYWRFbmQpKTtcblxuICAgICAgICBsZXQgc3RhZ2VQYWRFbmQgPSA1O1xuICAgICAgICBzdGFnZXMuZm9yRWFjaChzID0+IHN0YWdlUGFkRW5kID0gTWF0aC5tYXgocy5sZW5ndGgsIHN0YWdlUGFkRW5kKSk7XG5cbiAgICAgICAgbGV0IGRlc2NyaXB0aW9uUGFkRW5kID0gMTE7XG4gICAgICAgIGpvYnMuZm9yRWFjaChqID0+IGRlc2NyaXB0aW9uUGFkRW5kID0gTWF0aC5tYXgoai5kZXNjcmlwdGlvbi5sZW5ndGgsIGRlc2NyaXB0aW9uUGFkRW5kKSk7XG5cbiAgICAgICAgY29uc3Qgam9iTmFtZVBhZCA9IHBhcnNlci5qb2JOYW1lUGFkO1xuXG4gICAgICAgIGlmICghbGlzdEFsbCkge1xuICAgICAgICAgICAgam9icyA9IGpvYnMuZmlsdGVyKGogPT4gai53aGVuICE9PSBcIm5ldmVyXCIpO1xuICAgICAgICB9XG5cbiAgICAgICAgd3JpdGVTdHJlYW1zLnN0ZG91dChjaGFsa2B7Z3JleSAke1wibmFtZVwiLnBhZEVuZChqb2JOYW1lUGFkKX0gICR7XCJkZXNjcmlwdGlvblwiLnBhZEVuZChkZXNjcmlwdGlvblBhZEVuZCl9fSAgYCk7XG4gICAgICAgIHdyaXRlU3RyZWFtcy5zdGRvdXQoY2hhbGtge2dyZXkgJHtcInN0YWdlXCIucGFkRW5kKHN0YWdlUGFkRW5kKX0gICR7XCJ3aGVuXCIucGFkRW5kKHdoZW5QYWRFbmQpfX0gIGApO1xuICAgICAgICB3cml0ZVN0cmVhbXMuc3Rkb3V0KGNoYWxrYHtncmV5IGFsbG93X2ZhaWx1cmUgIG5lZWRzfVxcbmApO1xuXG4gICAgICAgIGNvbnN0IHJlbmRlckxpbmUgPSAoam9iOiBKb2IpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IG5lZWRzID0gam9iLm5lZWRzO1xuICAgICAgICAgICAgY29uc3QgYWxsb3dGYWlsdXJlID0gam9iLmFsbG93RmFpbHVyZSA/IFwidHJ1ZSBcIiA6IFwiZmFsc2VcIjtcbiAgICAgICAgICAgIGxldCBqb2JMaW5lID0gY2hhbGtge2JsdWVCcmlnaHQgJHtqb2IubmFtZS5wYWRFbmQoam9iTmFtZVBhZCl9fSAgJHtqb2IuZGVzY3JpcHRpb24ucGFkRW5kKGRlc2NyaXB0aW9uUGFkRW5kKX0gIGA7XG4gICAgICAgICAgICBqb2JMaW5lICs9IGNoYWxrYHt5ZWxsb3cgJHtqb2Iuc3RhZ2UucGFkRW5kKHN0YWdlUGFkRW5kKX19ICAke2pvYi53aGVuLnBhZEVuZCh3aGVuUGFkRW5kKX0gICR7YWxsb3dGYWlsdXJlLnBhZEVuZCgxMSl9YDtcbiAgICAgICAgICAgIGlmIChuZWVkcykge1xuICAgICAgICAgICAgICAgIGpvYkxpbmUgKz0gY2hhbGtgICAgIFt7Ymx1ZUJyaWdodCAke25lZWRzLm1hcChuID0+IG4uam9iKS5qb2luKFwiLFwiKX19XWA7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB3cml0ZVN0cmVhbXMuc3Rkb3V0KGAke2pvYkxpbmV9XFxuYCk7XG4gICAgICAgIH07XG5cbiAgICAgICAgam9icy5mb3JFYWNoKChqb2IpID0+IHJlbmRlckxpbmUoam9iKSk7XG4gICAgfVxuXG4gICAgc3RhdGljIHJ1bkpzb24ocGFyc2VyOiBQYXJzZXIsIHdyaXRlU3RyZWFtczogV3JpdGVTdHJlYW1zKSB7XG4gICAgICAgIGNvbnN0IGpvYnMgPSBbLi4ucGFyc2VyLmpvYnMudmFsdWVzKCldO1xuICAgICAgICBjb25zdCBqc29uOiBhbnlbXSA9IFtdO1xuXG4gICAgICAgIGpvYnMuZm9yRWFjaCgoam9iKSA9PiB7XG4gICAgICAgICAgICBqc29uLnB1c2goe1xuICAgICAgICAgICAgICAgIG5hbWU6IGpvYi5uYW1lLFxuICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uOiBqb2IuZGVzY3JpcHRpb24sXG4gICAgICAgICAgICAgICAgc3RhZ2U6IGpvYi5zdGFnZSxcbiAgICAgICAgICAgICAgICB3aGVuOiBqb2Iud2hlbixcbiAgICAgICAgICAgICAgICBhbGxvd19mYWlsdXJlOiBqb2IuYWxsb3dGYWlsdXJlLFxuICAgICAgICAgICAgICAgIG5lZWRzOiBqb2IubmVlZHMsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgd3JpdGVTdHJlYW1zLnN0ZG91dChgJHtKU09OLnN0cmluZ2lmeShqc29uLCBudWxsLCAyKX1cXG5gKTtcbiAgICB9XG5cbn1cbiJdfQ==