gitlab-ci-local 4.53.0 → 4.55.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/src/job.js CHANGED
@@ -1,44 +1,15 @@
1
- "use strict";
2
- var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
- if (k2 === undefined) k2 = k;
4
- var desc = Object.getOwnPropertyDescriptor(m, k);
5
- if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
- desc = { enumerable: true, get: function() { return m[k]; } };
7
- }
8
- Object.defineProperty(o, k2, desc);
9
- }) : (function(o, m, k, k2) {
10
- if (k2 === undefined) k2 = k;
11
- o[k2] = m[k];
12
- }));
13
- var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
- Object.defineProperty(o, "default", { enumerable: true, value: v });
15
- }) : function(o, v) {
16
- o["default"] = v;
17
- });
18
- var __importStar = (this && this.__importStar) || function (mod) {
19
- if (mod && mod.__esModule) return mod;
20
- var result = {};
21
- if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
22
- __setModuleDefault(result, mod);
23
- return result;
24
- };
25
- var __importDefault = (this && this.__importDefault) || function (mod) {
26
- return (mod && mod.__esModule) ? mod : { "default": mod };
27
- };
28
- Object.defineProperty(exports, "__esModule", { value: true });
29
- exports.Job = void 0;
30
- exports.cleanupJobResources = cleanupJobResources;
31
- const chalk_1 = __importDefault(require("chalk"));
32
- const dotenv = __importStar(require("dotenv"));
33
- const fs = __importStar(require("fs-extra"));
34
- const pretty_hrtime_1 = __importDefault(require("pretty-hrtime"));
35
- const split2_1 = __importDefault(require("split2"));
36
- const utils_1 = require("./utils");
37
- const assert_1 = __importStar(require("assert"));
38
- const mutex_1 = require("./mutex");
39
- const execa_1 = __importDefault(require("execa"));
40
- const gitlab_preset_1 = require("./gitlab-preset");
1
+ import chalk from "chalk";
2
+ import * as dotenv from "dotenv";
3
+ import fs from "fs-extra";
4
+ import prettyHrtime from "pretty-hrtime";
5
+ import split2 from "split2";
6
+ import { Utils } from "./utils.js";
7
+ import assert, { AssertionError } from "assert";
8
+ import { Mutex } from "./mutex.js";
9
+ import execa from "execa";
10
+ import { GitlabRunnerCPUsPresetValue, GitlabRunnerMemoryPresetValue, GitlabRunnerPresetValues } from "./gitlab-preset.js";
41
11
  const CI_PROJECT_DIR = "/gcl-builds";
12
+ const GCL_SHELL_PROMPT_PLACEHOLDER = "<gclShellPromptPlaceholder>";
42
13
  const dateFormatter = new Intl.DateTimeFormat(undefined, {
43
14
  year: undefined,
44
15
  month: undefined,
@@ -47,7 +18,10 @@ const dateFormatter = new Intl.DateTimeFormat(undefined, {
47
18
  second: "numeric",
48
19
  hour12: false,
49
20
  });
50
- class Job {
21
+ export class Job {
22
+ generateJobId() {
23
+ return Math.floor(Math.random() * 1000000);
24
+ }
51
25
  static illegalJobNames = new Set([
52
26
  "include", "local_configuration", "image", "services",
53
27
  "stages", "before_script", "default",
@@ -65,6 +39,8 @@ class Job {
65
39
  exists;
66
40
  pipelineIid;
67
41
  gitData;
42
+ inherit;
43
+ _globalVariables = {};
68
44
  _variables = {};
69
45
  _dotenvVariables = {};
70
46
  _prescriptsExitCode = null;
@@ -87,7 +63,6 @@ class Job {
87
63
  const jobData = opt.data;
88
64
  const gitData = opt.gitData;
89
65
  const jobVariables = jobData.variables ?? {};
90
- const globalVariables = opt.globalVariables ?? {};
91
66
  const variablesFromFiles = opt.variablesFromFiles;
92
67
  const argv = opt.argv;
93
68
  const cwd = argv.cwd;
@@ -100,21 +75,25 @@ class Job {
100
75
  this.gitData = opt.gitData;
101
76
  this.name = opt.name;
102
77
  this.baseName = opt.baseName;
103
- this.jobId = Math.floor(Math.random() * 1000000);
78
+ this.jobId = this.generateJobId();
104
79
  this.jobData = opt.data;
105
80
  this.pipelineIid = opt.pipelineIid;
81
+ this._globalVariables = opt.globalVariables;
82
+ this.inherit = {};
83
+ this.inherit.variables = this.jobData.inherit?.variables ?? true;
84
+ this.inherit.default = this.jobData.inherit?.default ?? true;
85
+ if (this.inherit.default === false) {
86
+ this.writeStreams.memoStdout(chalk `{black.bgYellowBright WARN } \`.inherit.default\` has not been implemented!\n`);
87
+ }
106
88
  this.when = jobData.when || "on_success";
107
89
  this.exists = jobData.exists || [];
108
90
  this.allowFailure = jobData.allow_failure ?? false;
109
91
  this.dependencies = jobData.dependencies || null;
110
92
  this.rules = jobData.rules || null;
111
93
  this.environment = typeof jobData.environment === "string" ? { name: jobData.environment } : jobData.environment;
112
- // HACK: So that this won't show up in the preview variables
113
- if (!argv.preview) {
114
- globalVariables["FF_DISABLE_UMASK_FOR_DOCKER_EXECUTOR"] = argv.umask ? "false" : "true";
115
- }
116
94
  const matrixVariables = opt.matrixVariables ?? {};
117
- this._variables = { ...globalVariables, ...jobVariables, ...matrixVariables, ...predefinedVariables, ...argvVariables };
95
+ const fileVariables = Utils.findEnvMatchedVariables(variablesFromFiles, this.fileVariablesDir);
96
+ this._variables = { ...this.globalVariables, ...jobVariables, ...matrixVariables, ...predefinedVariables, ...fileVariables, ...argvVariables };
118
97
  let ciProjectDir = `${cwd}`;
119
98
  if (this.jobData["image"]) {
120
99
  ciProjectDir = CI_PROJECT_DIR;
@@ -129,8 +108,8 @@ class Job {
129
108
  predefinedVariables["CI_JOB_NAME_SLUG"] = `${this.name.replace(/[^a-z\d]+/ig, "-").replace(/^-/, "").slice(0, 63).replace(/-$/, "").toLowerCase()}`;
130
109
  predefinedVariables["CI_JOB_STAGE"] = `${this.stage}`;
131
110
  predefinedVariables["CI_PROJECT_DIR"] = ciProjectDir;
132
- predefinedVariables["CI_JOB_URL"] = `https://${gitData.remote.host}/${gitData.remote.group}/${gitData.remote.project}/-/jobs/${this.jobId}`; // Changes on rerun.
133
- predefinedVariables["CI_PIPELINE_URL"] = `https://${gitData.remote.host}/${gitData.remote.group}/${gitData.remote.project}/pipelines/${this.pipelineIid}`;
111
+ predefinedVariables["CI_JOB_URL"] = `${this._variables["CI_SERVER_URL"]}/${gitData.remote.group}/${gitData.remote.project}/-/jobs/${this.jobId}`; // Changes on rerun.
112
+ predefinedVariables["CI_PIPELINE_URL"] = `${this._variables["CI_SERVER_URL"]}/${gitData.remote.group}/${gitData.remote.project}/pipelines/${this.pipelineIid}`;
134
113
  predefinedVariables["CI_ENVIRONMENT_NAME"] = this.environment?.name ?? "";
135
114
  predefinedVariables["CI_ENVIRONMENT_SLUG"] = this.environment?.name?.replace(/[^a-z\d]+/ig, "-").replace(/^-/, "").slice(0, 23).replace(/-$/, "").toLowerCase() ?? "";
136
115
  predefinedVariables["CI_ENVIRONMENT_URL"] = this.environment?.url ?? "";
@@ -144,64 +123,64 @@ class Job {
144
123
  predefinedVariables["CI_REGISTRY_IMAGE"] = `$CI_REGISTRY/${this._variables["CI_PROJECT_PATH"].toLowerCase()}`;
145
124
  // Expand variables in rules:changes
146
125
  if (this.rules && expandVariables) {
147
- const expanded = utils_1.Utils.expandVariables(this._variables);
126
+ const expanded = Utils.expandVariables(this._variables);
148
127
  this.rules.forEach((rule, ruleIdx, rules) => {
149
128
  const changes = Array.isArray(rule.changes) ? rule.changes : rule.changes?.paths;
150
129
  if (!changes) {
151
130
  return;
152
131
  }
153
132
  changes.forEach((change, changeIdx, changes) => {
154
- changes[changeIdx] = utils_1.Utils.expandText(change, expanded);
133
+ changes[changeIdx] = Utils.expandText(change, expanded);
155
134
  });
156
135
  rules[ruleIdx].changes = changes;
157
136
  });
158
137
  }
159
138
  // Find environment matched variables
160
139
  if (this.environment && expandVariables) {
161
- const expanded = utils_1.Utils.expandVariables(this._variables);
162
- this.environment.name = utils_1.Utils.expandText(this.environment.name, expanded);
163
- this.environment.url = utils_1.Utils.expandText(this.environment.url, expanded);
140
+ const expanded = Utils.expandVariables(this._variables);
141
+ this.environment.name = Utils.expandText(this.environment.name, expanded);
142
+ this.environment.url = Utils.expandText(this.environment.url, expanded);
164
143
  }
165
- const envMatchedVariables = utils_1.Utils.findEnvMatchedVariables(variablesFromFiles, this.fileVariablesDir, this.environment);
144
+ const envMatchedVariables = Utils.findEnvMatchedVariables(variablesFromFiles, this.fileVariablesDir, this.environment);
166
145
  // Merge and expand after finding env matched variables
167
- this._variables = { ...globalVariables, ...jobVariables, ...matrixVariables, ...predefinedVariables, ...envMatchedVariables, ...argvVariables };
146
+ this._variables = { ...this.globalVariables, ...jobVariables, ...matrixVariables, ...predefinedVariables, ...envMatchedVariables, ...argvVariables };
168
147
  // Set {when, allowFailure} based on rules result
169
148
  if (this.rules) {
170
- const ruleResult = utils_1.Utils.getRulesResult({ cwd, rules: this.rules, variables: this._variables }, this.gitData, this.when, this.allowFailure);
149
+ const ruleResult = Utils.getRulesResult({ cwd, rules: this.rules, variables: this._variables }, this.gitData, this.when, this.allowFailure);
171
150
  this.when = ruleResult.when;
172
151
  this.allowFailure = ruleResult.allowFailure;
173
- this._variables = { ...globalVariables, ...jobVariables, ...ruleResult.variables, ...matrixVariables, ...predefinedVariables, ...envMatchedVariables, ...argvVariables };
152
+ this._variables = { ...this.globalVariables, ...jobVariables, ...ruleResult.variables, ...matrixVariables, ...predefinedVariables, ...envMatchedVariables, ...argvVariables };
174
153
  }
175
154
  // Delete variables the user intentionally wants unset
176
155
  for (const unsetVariable of argv.unsetVariables) {
177
156
  delete this._variables[unsetVariable];
178
157
  }
179
- (0, assert_1.default)(this.scripts || this.trigger, (0, chalk_1.default) `{blueBright ${this.name}} must have script specified`);
180
- (0, assert_1.default)(!(this.interactive && !this.argv.shellExecutorNoImage), (0, chalk_1.default) `${this.formattedJobName} @Interactive decorator cannot be used with --no-shell-executor-no-image`);
158
+ assert(this.scripts || this.trigger, chalk `{blueBright ${this.name}} must have script specified`);
159
+ assert(!(this.interactive && !this.argv.shellExecutorNoImage), chalk `${this.formattedJobName} @Interactive decorator cannot be used with --no-shell-executor-no-image`);
181
160
  if (this.interactive && (this.when !== "manual" || this.imageName(this._variables) !== null)) {
182
- throw new assert_1.AssertionError({ message: `${this.formattedJobName} @Interactive decorator cannot have image: and must be when:manual` });
161
+ throw new AssertionError({ message: `${this.formattedJobName} @Interactive decorator cannot have image: and must be when:manual` });
183
162
  }
184
163
  if (this.injectSSHAgent && this.imageName(this._variables) === null) {
185
- throw new assert_1.AssertionError({ message: `${this.formattedJobName} @InjectSSHAgent can only be used with image:` });
164
+ throw new AssertionError({ message: `${this.formattedJobName} @InjectSSHAgent can only be used with image:` });
186
165
  }
187
- const expanded = utils_1.Utils.expandVariables(this._variables);
166
+ const expanded = Utils.expandVariables(this._variables);
188
167
  for (const [i, c] of Object.entries(this.cache)) {
189
- c.policy = utils_1.Utils.expandText(c.policy, expanded);
190
- (0, assert_1.default)(["pull", "push", "pull-push"].includes(c.policy), (0, chalk_1.default) `{blue ${this.name}} cache[${i}].policy is not 'pull', 'push' or 'pull-push'`);
191
- (0, assert_1.default)(["on_success", "on_failure", "always"].includes(c.when), (0, chalk_1.default) `{blue ${this.name}} cache[${i}].when is not 'on_success', 'on_failure' or 'always'`);
192
- (0, assert_1.default)(Array.isArray(c.paths), (0, chalk_1.default) `{blue ${this.name}} cache[${i}].paths must be array`);
168
+ c.policy = Utils.expandText(c.policy, expanded);
169
+ assert(["pull", "push", "pull-push"].includes(c.policy), chalk `{blue ${this.name}} cache[${i}].policy is not 'pull', 'push' or 'pull-push'`);
170
+ assert(["on_success", "on_failure", "always"].includes(c.when), chalk `{blue ${this.name}} cache[${i}].when is not 'on_success', 'on_failure' or 'always'`);
171
+ assert(Array.isArray(c.paths), chalk `{blue ${this.name}} cache[${i}].paths must be array`);
193
172
  }
194
173
  for (const [i, s] of Object.entries(this.services)) {
195
- (0, assert_1.default)(s.name, (0, chalk_1.default) `{blue ${this.name}} services[${i}].name is undefined`);
196
- (0, assert_1.default)(!s.command || Array.isArray(s.command), (0, chalk_1.default) `{blue ${this.name}} services[${i}].command must be an array`);
197
- (0, assert_1.default)(!s.entrypoint || Array.isArray(s.entrypoint), (0, chalk_1.default) `{blue ${this.name}} services[${i}].entrypoint must be an array`);
174
+ assert(s.name, chalk `{blue ${this.name}} services[${i}].name is undefined`);
175
+ assert(!s.command || Array.isArray(s.command), chalk `{blue ${this.name}} services[${i}].command must be an array`);
176
+ assert(!s.entrypoint || Array.isArray(s.entrypoint), chalk `{blue ${this.name}} services[${i}].entrypoint must be an array`);
198
177
  }
199
- (0, assert_1.default)(!this.artifacts?.paths || Array.isArray(this.artifacts.paths), (0, chalk_1.default) `{blue ${this.name}} artifacts.paths must be an array`);
178
+ assert(!this.artifacts?.paths || Array.isArray(this.artifacts.paths), chalk `{blue ${this.name}} artifacts.paths must be an array`);
200
179
  if (this.imageName(this._variables) && argv.mountCache) {
201
180
  for (const c of this.cache) {
202
181
  c.paths.forEach((p) => {
203
- const path = utils_1.Utils.expandText(p, expanded);
204
- (0, assert_1.default)(!path.includes("*"), (0, chalk_1.default) `{blue ${this.name}} cannot have * in cache paths, when --mount-cache is enabled`);
182
+ const path = Utils.expandText(p, expanded);
183
+ assert(!path.includes("*"), chalk `{blue ${this.name}} cannot have * in cache paths, when --mount-cache is enabled`);
205
184
  });
206
185
  }
207
186
  }
@@ -239,10 +218,10 @@ class Job {
239
218
  }
240
219
  get prettyDuration() {
241
220
  if (this._endTime) {
242
- return (0, pretty_hrtime_1.default)(this._endTime);
221
+ return prettyHrtime(this._endTime);
243
222
  }
244
223
  return this._startTime
245
- ? (0, pretty_hrtime_1.default)(process.hrtime(this._startTime))
224
+ ? prettyHrtime(process.hrtime(this._startTime))
246
225
  : "0 ms";
247
226
  }
248
227
  get formattedJobName() {
@@ -250,10 +229,10 @@ class Job {
250
229
  ? `[${dateFormatter.format(new Date())} ${this.prettyDuration.padStart(7)}] `
251
230
  : "";
252
231
  // [16:33:19 1.37 min] my-job > hello world
253
- return (0, chalk_1.default) `${timestampPrefix}{blueBright ${this.name.padEnd(this.jobNamePad)}}`;
232
+ return chalk `${timestampPrefix}{blueBright ${this.name.padEnd(this.jobNamePad)}}`;
254
233
  }
255
234
  get safeJobName() {
256
- return utils_1.Utils.safeDockerString(this.name);
235
+ return Utils.safeDockerString(this.name);
257
236
  }
258
237
  get needs() {
259
238
  return this.jobData["needs"] ?? null;
@@ -269,21 +248,21 @@ class Job {
269
248
  if (!this.jobData["services"])
270
249
  return [];
271
250
  for (const service of Object.values(this.jobData["services"])) {
272
- const expanded = utils_1.Utils.expandVariables({ ...this._variables, ...this._dotenvVariables, ...service["variables"] });
273
- let serviceName = utils_1.Utils.expandText(service["name"], expanded);
251
+ const expanded = Utils.expandVariables({ ...this._variables, ...this._dotenvVariables, ...service["variables"] });
252
+ let serviceName = Utils.expandText(service["name"], expanded);
274
253
  serviceName = serviceName.includes(":") ? serviceName : `${serviceName}:latest`;
275
254
  services.push({
276
255
  name: serviceName,
277
256
  entrypoint: service["entrypoint"] ?? null,
278
257
  command: service["command"] ?? null,
279
258
  variables: expanded,
280
- alias: utils_1.Utils.expandText(service["alias"], expanded) ?? null,
259
+ alias: Utils.expandText(service["alias"], expanded) ?? null,
281
260
  });
282
261
  }
283
262
  return services;
284
263
  }
285
264
  set jobNamePad(jobNamePad) {
286
- (0, assert_1.default)(this._jobNamePad == null, "this._jobNamePad can only be set once");
265
+ assert(this._jobNamePad == null, "this._jobNamePad can only be set once");
287
266
  this._jobNamePad = jobNamePad;
288
267
  }
289
268
  get jobNamePad() {
@@ -293,7 +272,7 @@ class Job {
293
272
  return this._producers;
294
273
  }
295
274
  set producers(producers) {
296
- (0, assert_1.default)(this._producers == null, "this._producers can only be set once");
275
+ assert(this._producers == null, "this._producers can only be set once");
297
276
  this._producers = producers;
298
277
  }
299
278
  get stage() {
@@ -319,16 +298,16 @@ class Job {
319
298
  }
320
299
  async getUniqueCacheName(cwd, expanded, key) {
321
300
  if (typeof key === "string" || key == null) {
322
- return utils_1.Utils.expandText(key ?? "default", expanded);
301
+ return Utils.expandText(key ?? "default", expanded);
323
302
  }
324
303
  const files = key["files"].map((f) => {
325
- let path = utils_1.Utils.expandText(f, expanded);
304
+ let path = Utils.expandText(f, expanded);
326
305
  if (path.startsWith(`${CI_PROJECT_DIR}/`)) {
327
306
  path = path.slice(`${CI_PROJECT_DIR}/`.length);
328
307
  }
329
308
  return `${cwd}/${path}`;
330
309
  });
331
- return "md-" + await utils_1.Utils.checksumFiles(cwd, files);
310
+ return "md-" + await Utils.checksumFiles(cwd, files);
332
311
  }
333
312
  get beforeScripts() {
334
313
  const beforeScripts = this.jobData["before_script"] || [];
@@ -363,29 +342,40 @@ class Job {
363
342
  get fileVariablesDir() {
364
343
  return `/tmp/gitlab-ci-local-file-variables-${this._variables["CI_PROJECT_PATH_SLUG"]}-${this.jobId}`;
365
344
  }
345
+ get globalVariables() {
346
+ if (this.inherit.variables === false) {
347
+ return {};
348
+ }
349
+ else if (Array.isArray(this.inherit.variables)) {
350
+ const inheritVariables = this.inherit.variables;
351
+ return Object.fromEntries(Object.entries(this._globalVariables).filter(([k]) => inheritVariables.includes(k)));
352
+ }
353
+ return this._globalVariables;
354
+ }
366
355
  async start() {
367
356
  this._running = true;
368
357
  const argv = this.argv;
369
358
  this._startTime = process.hrtime();
370
359
  this._variables["CI_JOB_STARTED_AT"] = new Date().toISOString().split(".")[0] + "Z";
371
360
  const writeStreams = this.writeStreams;
372
- this._dotenvVariables = await this.initProducerReportsDotenvVariables(writeStreams, utils_1.Utils.expandVariables(this._variables));
373
- const expanded = utils_1.Utils.unscape$$Variables(utils_1.Utils.expandVariables({ ...this._variables, ...this._dotenvVariables }));
361
+ this._dotenvVariables = await this.initProducerReportsDotenvVariables(writeStreams, Utils.expandVariables(this._variables));
362
+ const expanded = Utils.unscape$$Variables(Utils.expandVariables({ ...this._variables, ...this._dotenvVariables }));
374
363
  const imageName = this.imageName(expanded);
375
364
  const safeJobName = this.safeJobName;
376
365
  const outputLogFilePath = `${argv.cwd}/${argv.stateDir}/output/${safeJobName}.log`;
377
366
  await fs.ensureFile(outputLogFilePath);
378
367
  await fs.truncate(outputLogFilePath);
379
368
  if (!this.interactive) {
380
- writeStreams.stdout((0, chalk_1.default) `${this.formattedJobName} {magentaBright starting} ${imageName ?? "shell"} ({yellow ${this.stage}})\n`);
369
+ writeStreams.stdout(chalk `${this.formattedJobName} {magentaBright starting} ${imageName ?? "shell"} ({yellow ${this.stage}})\n`);
381
370
  }
382
371
  if (imageName) {
372
+ await this.pullImage(writeStreams, imageName);
383
373
  const buildVolumeName = this.buildVolumeName;
384
374
  const tmpVolumeName = this.tmpVolumeName;
385
375
  const fileVariablesDir = this.fileVariablesDir;
386
376
  const volumePromises = [];
387
- volumePromises.push(utils_1.Utils.spawn([this.argv.containerExecutable, "volume", "create", `${buildVolumeName}`], argv.cwd));
388
- volumePromises.push(utils_1.Utils.spawn([this.argv.containerExecutable, "volume", "create", `${tmpVolumeName}`], argv.cwd));
377
+ volumePromises.push(Utils.spawn([this.argv.containerExecutable, "volume", "create", `${buildVolumeName}`], argv.cwd));
378
+ volumePromises.push(Utils.spawn([this.argv.containerExecutable, "volume", "create", `${tmpVolumeName}`], argv.cwd));
389
379
  this._containerVolumeNames.push(buildVolumeName);
390
380
  this._containerVolumeNames.push(tmpVolumeName);
391
381
  await Promise.all(volumePromises);
@@ -393,44 +383,44 @@ class Job {
393
383
  this.refreshLongRunningSilentTimeout(writeStreams);
394
384
  let chownOpt = "0:0";
395
385
  let chmodOpt = "a+rw";
396
- if (expanded["FF_DISABLE_UMASK_FOR_DOCKER_EXECUTOR"] === "true") {
397
- const { stdout } = await utils_1.Utils.spawn(["docker", "run", "--rm", "--entrypoint", "sh", imageName, "-c", "echo \"$(id -u):$(id -g)\""]);
386
+ if (this.argv.umask === false) {
387
+ const { stdout } = await Utils.spawn(["docker", "run", "--rm", "--entrypoint", "sh", imageName, "-c", "echo \"$(id -u):$(id -g)\""]);
398
388
  chownOpt = stdout;
399
389
  if (chownOpt == "0:0") {
400
390
  chmodOpt = "g-w";
401
391
  }
402
392
  }
403
- const { stdout: containerId } = await utils_1.Utils.spawn([
393
+ const { stdout: containerId } = await Utils.spawn([
404
394
  this.argv.containerExecutable, "create", "--user=0:0", `--volume=${buildVolumeName}:/gcl-builds`, `--volume=${tmpVolumeName}:${this.fileVariablesDir}`, "docker.io/firecow/gitlab-ci-local-util",
405
395
  ...["sh", "-c", `chown ${chownOpt} -R /gcl-builds/ && chmod ${chmodOpt} -R /gcl-builds/ && chown ${chownOpt} -R /tmp/ && chmod ${chmodOpt} -R /tmp/`],
406
396
  ], argv.cwd);
407
397
  this._containersToClean.push(containerId);
408
398
  if (await fs.pathExists(fileVariablesDir)) {
409
- await utils_1.Utils.spawn([this.argv.containerExecutable, "cp", `${fileVariablesDir}/.`, `${containerId}:${fileVariablesDir}`], argv.cwd);
399
+ await Utils.spawn([this.argv.containerExecutable, "cp", `${fileVariablesDir}/.`, `${containerId}:${fileVariablesDir}`], argv.cwd);
410
400
  this.refreshLongRunningSilentTimeout(writeStreams);
411
401
  }
412
- await utils_1.Utils.spawn([this.argv.containerExecutable, "cp", `${argv.stateDir}/builds/.docker/.`, `${containerId}:/gcl-builds`], argv.cwd);
413
- await utils_1.Utils.spawn([this.argv.containerExecutable, "start", "--attach", containerId], argv.cwd);
414
- await utils_1.Utils.spawn([this.argv.containerExecutable, "rm", "-vf", containerId], argv.cwd);
402
+ await Utils.spawn([this.argv.containerExecutable, "cp", `${argv.stateDir}/builds/.docker/.`, `${containerId}:/gcl-builds`], argv.cwd);
403
+ await Utils.spawn([this.argv.containerExecutable, "start", "--attach", containerId], argv.cwd);
404
+ await Utils.spawn([this.argv.containerExecutable, "rm", "-vf", containerId], argv.cwd);
415
405
  const endTime = process.hrtime(time);
416
- writeStreams.stdout((0, chalk_1.default) `${this.formattedJobName} {magentaBright copied to docker volumes} in {magenta ${(0, pretty_hrtime_1.default)(endTime)}}\n`);
406
+ writeStreams.stdout(chalk `${this.formattedJobName} {magentaBright copied to docker volumes} in {magenta ${prettyHrtime(endTime)}}\n`);
417
407
  }
418
408
  if (this.services?.length) {
419
409
  // `host` and `none` networks do not work with services because aliases only work for
420
410
  // user defined networks.
421
411
  for (const network of this.argv.network) {
422
412
  if (["host", "none"].includes(network)) {
423
- throw new assert_1.AssertionError({ message: `Cannot add service network alias with network mode '${network}'` });
413
+ throw new AssertionError({ message: `Cannot add service network alias with network mode '${network}'` });
424
414
  }
425
415
  }
426
416
  await this.createDockerNetwork(`gitlab-ci-local-${this.jobId}`);
427
417
  await Promise.all(this.services.map(async (service, serviceIndex) => {
428
418
  const serviceName = service.name;
429
419
  await this.pullImage(writeStreams, serviceName);
430
- const serviceContainerId = await this.startService(writeStreams, utils_1.Utils.expandVariables({ ...expanded, ...service.variables }), service);
420
+ const serviceContainerId = await this.startService(writeStreams, Utils.expandVariables({ ...expanded, ...service.variables }), service);
431
421
  const serviceContainerLogFile = `${argv.cwd}/${argv.stateDir}/services-output/${this.safeJobName}/${serviceName}-${serviceIndex}.log`;
432
422
  await this.serviceHealthCheck(writeStreams, service, serviceIndex, serviceContainerLogFile);
433
- const { stdout, stderr } = await utils_1.Utils.spawn([this.argv.containerExecutable, "logs", serviceContainerId]);
423
+ const { stdout, stderr } = await Utils.spawn([this.argv.containerExecutable, "logs", serviceContainerId]);
434
424
  await fs.ensureFile(serviceContainerLogFile);
435
425
  await fs.promises.writeFile(serviceContainerLogFile, `### stdout ###\n${stdout}\n### stderr ###\n${stderr}\n`);
436
426
  }));
@@ -445,7 +435,7 @@ class Job {
445
435
  await this.copyCacheOut(this.writeStreams, expanded);
446
436
  await this.copyArtifactsOut(this.writeStreams, expanded);
447
437
  if (this.jobData["coverage"]) {
448
- this._coveragePercent = await utils_1.Utils.getCoveragePercent(argv.cwd, argv.stateDir, this.jobData["coverage"], safeJobName);
438
+ this._coveragePercent = await Utils.getCoveragePercent(argv.cwd, argv.stateDir, this.jobData["coverage"], safeJobName);
449
439
  }
450
440
  this.cleanupResources();
451
441
  }
@@ -454,24 +444,24 @@ class Job {
454
444
  if (!this.argv.cleanup)
455
445
  return;
456
446
  try {
457
- await utils_1.Utils.spawn([this.argv.containerExecutable, "rm", "-vf", ...this._containersToClean]);
447
+ await Utils.spawn([this.argv.containerExecutable, "rm", "-vf", ...this._containersToClean]);
458
448
  }
459
449
  catch (e) {
460
- (0, assert_1.default)(e instanceof Error, "e is not instanceof Error");
450
+ assert(e instanceof Error, "e is not instanceof Error");
461
451
  }
462
452
  if (this._serviceNetworkId) {
463
453
  try {
464
- await utils_1.Utils.spawn([this.argv.containerExecutable, "network", "rm", `${this._serviceNetworkId}`]);
454
+ await Utils.spawn([this.argv.containerExecutable, "network", "rm", `${this._serviceNetworkId}`]);
465
455
  }
466
456
  catch (e) {
467
- (0, assert_1.default)(e instanceof Error, "e is not instanceof Error");
457
+ assert(e instanceof Error, "e is not instanceof Error");
468
458
  }
469
459
  }
470
460
  try {
471
- await utils_1.Utils.spawn([this.argv.containerExecutable, "volume", "rm", ...this._containerVolumeNames]);
461
+ await Utils.spawn([this.argv.containerExecutable, "volume", "rm", ...this._containerVolumeNames]);
472
462
  }
473
463
  catch (e) {
474
- (0, assert_1.default)(e instanceof Error, "e is not instanceof Error");
464
+ assert(e instanceof Error, "e is not instanceof Error");
475
465
  }
476
466
  const rmPromises = [];
477
467
  for (const file of this._filesToRm) {
@@ -483,7 +473,7 @@ class Job {
483
473
  await fs.rm(fileVariablesDir, { recursive: true, force: true });
484
474
  }
485
475
  catch (e) {
486
- (0, assert_1.default)(e instanceof Error, "e is not instanceof Error");
476
+ assert(e instanceof Error, "e is not instanceof Error");
487
477
  }
488
478
  }
489
479
  generateInjectSSHAgentOptions() {
@@ -498,11 +488,11 @@ class Job {
498
488
  generateScriptCommands(scripts) {
499
489
  let cmd = "";
500
490
  scripts.forEach((script) => {
501
- // Print command echo'ed in color
491
+ // Print command echo'ed with $GCL_SHELL_PROMPT_PLACEHOLDER
502
492
  const split = script.split(/\r?\n/);
503
493
  const multilineText = split.length > 1 ? " # collapsed multi-line command" : "";
504
494
  const text = split[0]?.replace(/\\/g, "\\\\").replace(/"/g, "\\\"").replace(/[$]/g, "\\$");
505
- cmd += (0, chalk_1.default) `echo "{green $ ${text}${multilineText}}"\n`;
495
+ cmd += `echo "${GCL_SHELL_PROMPT_PLACEHOLDER} ${text}${multilineText}"\n`;
506
496
  // Execute actual script
507
497
  cmd += `${script}\n`;
508
498
  });
@@ -515,9 +505,9 @@ class Job {
515
505
  for (const c of this.cache) {
516
506
  const uniqueCacheName = await this.getUniqueCacheName(this.argv.cwd, expanded, c.key);
517
507
  c.paths.forEach((p) => {
518
- const path = utils_1.Utils.expandText(p, expanded);
519
- writeStreams.stdout((0, chalk_1.default) `${this.formattedJobName} {magentaBright mounting cache} for path ${path}\n`);
520
- const cacheMount = utils_1.Utils.safeDockerString(`gcl-${expanded.CI_PROJECT_PATH_SLUG}-${uniqueCacheName}`);
508
+ const path = Utils.expandText(p, expanded);
509
+ writeStreams.stdout(chalk `${this.formattedJobName} {magentaBright mounting cache} for path ${path}\n`);
510
+ const cacheMount = Utils.safeDockerString(`gcl-${expanded.CI_PROJECT_PATH_SLUG}-${uniqueCacheName}`);
521
511
  cmd.push("-v", `${cacheMount}:/gcl-builds/${path}`);
522
512
  });
523
513
  }
@@ -547,15 +537,15 @@ class Job {
547
537
  if (scripts.length === 0 || scripts[0] == null)
548
538
  return 0;
549
539
  if (message.length > 0)
550
- writeStreams.stdout((0, chalk_1.default) `${this.formattedJobName} {magentaBright ${message}}\n`);
540
+ writeStreams.stdout(chalk `${this.formattedJobName} {magentaBright ${message}}\n`);
551
541
  // Copy git tracked files to build folder if shell isolation enabled.
552
542
  if (!imageName && this.argv.shellIsolation) {
553
- await utils_1.Utils.rsyncTrackedFiles(cwd, stateDir, `${safeJobName}`);
543
+ await Utils.rsyncTrackedFiles(cwd, stateDir, `${safeJobName}`);
554
544
  }
555
545
  if (this.interactive) {
556
546
  let iCmd = "set -eo pipefail\n";
557
547
  iCmd += this.generateScriptCommands(scripts);
558
- const interactiveCp = (0, execa_1.default)(iCmd, {
548
+ const interactiveCp = execa(iCmd, {
559
549
  cwd,
560
550
  shell: "bash",
561
551
  stdio: ["inherit", "inherit", "inherit"],
@@ -567,8 +557,7 @@ class Job {
567
557
  });
568
558
  }
569
559
  this.refreshLongRunningSilentTimeout(writeStreams);
570
- if (imageName) {
571
- await this.pullImage(writeStreams, imageName);
560
+ if (imageName && !this._containerId) {
572
561
  let dockerCmd = `${this.argv.containerExecutable} create --interactive ${this.generateInjectSSHAgentOptions()} `;
573
562
  if (this.argv.privileged) {
574
563
  dockerCmd += "--privileged ";
@@ -576,7 +565,7 @@ class Job {
576
565
  if (this.argv.ulimit !== null) {
577
566
  dockerCmd += `--ulimit nofile=${this.argv.ulimit} `;
578
567
  }
579
- if (expanded["FF_DISABLE_UMASK_FOR_DOCKER_EXECUTOR"] === "false") {
568
+ if (this.argv.umask === true) {
580
569
  dockerCmd += "--user 0:0 ";
581
570
  }
582
571
  if (this.argv.containerMacAddress) {
@@ -588,11 +577,11 @@ class Job {
588
577
  }
589
578
  if (this.argv.containerEmulate) {
590
579
  const runnerName = this.argv.containerEmulate;
591
- if (!gitlab_preset_1.GitlabRunnerPresetValues.includes(runnerName)) {
580
+ if (!GitlabRunnerPresetValues.includes(runnerName)) {
592
581
  throw new Error("Invalid gitlab runner to emulate.");
593
582
  }
594
- const memoryConfig = gitlab_preset_1.GitlabRunnerMemoryPresetValue[runnerName];
595
- const cpuConfig = gitlab_preset_1.GitlabRunnerCPUsPresetValue[runnerName];
583
+ const memoryConfig = GitlabRunnerMemoryPresetValue[runnerName];
584
+ const cpuConfig = GitlabRunnerCPUsPresetValue[runnerName];
596
585
  dockerCmd += `--memory=${memoryConfig}m `;
597
586
  dockerCmd += `--kernel-memory=${memoryConfig}m `;
598
587
  dockerCmd += `--cpus=${cpuConfig} `;
@@ -663,13 +652,13 @@ class Job {
663
652
  dockerCmd += "\techo shell not found\n";
664
653
  dockerCmd += "\texit 1\n";
665
654
  dockerCmd += "fi\n\"";
666
- const { stdout: containerId } = await utils_1.Utils.bash(dockerCmd, cwd);
655
+ const { stdout: containerId } = await Utils.bash(dockerCmd, cwd);
667
656
  for (const network of this.argv.network) {
668
657
  // Special network names that do not work with `docker network connect`
669
658
  if (["host", "none"].includes(network)) {
670
659
  continue;
671
660
  }
672
- await utils_1.Utils.spawn([this.argv.containerExecutable, "network", "connect", network, `${containerId}`]);
661
+ await Utils.spawn([this.argv.containerExecutable, "network", "connect", network, `${containerId}`]);
673
662
  }
674
663
  this._containerId = containerId;
675
664
  this._containersToClean.push(this._containerId);
@@ -683,6 +672,10 @@ class Job {
683
672
  }
684
673
  if (imageName) {
685
674
  cmd += "cd /gcl-builds \n";
675
+ if (expanded["CI_JOB_STATUS"] != "running") {
676
+ // Ensures the env `CI_JOB_STATUS` is passed to the after_script context
677
+ cmd += `export CI_JOB_STATUS=${expanded["CI_JOB_STATUS"]}\n`;
678
+ }
686
679
  }
687
680
  cmd += this.generateScriptCommands(scripts);
688
681
  cmd += "exit 0\n";
@@ -691,9 +684,9 @@ class Job {
691
684
  await fs.chmod(jobScriptFile, "0755");
692
685
  this._filesToRm.push(jobScriptFile);
693
686
  if (imageName) {
694
- await utils_1.Utils.spawn([this.argv.containerExecutable, "cp", `${stateDir}/scripts/${safeJobName}_${this.jobId}`, `${this._containerId}:/gcl-cmd`], cwd);
687
+ await Utils.spawn([this.argv.containerExecutable, "cp", `${stateDir}/scripts/${safeJobName}_${this.jobId}`, `${this._containerId}:/gcl-cmd`], cwd);
695
688
  }
696
- const cp = (0, execa_1.default)(this._containerId ? `${this.argv.containerExecutable} start --attach -i ${this._containerId}` : "bash", {
689
+ const cp = execa(this._containerId ? `${this.argv.containerExecutable} start --attach -i ${this._containerId}` : "bash", {
697
690
  cwd,
698
691
  shell: "bash",
699
692
  env: imageName ? process.env : expanded,
@@ -701,7 +694,12 @@ class Job {
701
694
  const outFunc = (line, stream, colorize) => {
702
695
  this.refreshLongRunningSilentTimeout(writeStreams);
703
696
  stream(`${this.formattedJobName} `);
704
- if (!line.startsWith("\u001b[32m$")) {
697
+ if (line.startsWith(GCL_SHELL_PROMPT_PLACEHOLDER)) {
698
+ // replace the GCL_SHELL_PROMPT_PLACEHOLDER with `$` and make the SHELL_PROMPT line green color
699
+ line = line.slice(GCL_SHELL_PROMPT_PLACEHOLDER.length);
700
+ line = chalk `{green $${line}}`;
701
+ }
702
+ else {
705
703
  stream(`${colorize(">")} `);
706
704
  }
707
705
  stream(`${line}\n`);
@@ -710,8 +708,8 @@ class Job {
710
708
  const quiet = this.argv.quiet;
711
709
  return await new Promise((resolve, reject) => {
712
710
  if (!quiet) {
713
- cp.stdout?.pipe((0, split2_1.default)()).on("data", (e) => outFunc(e, writeStreams.stdout.bind(writeStreams), (s) => (0, chalk_1.default) `{greenBright ${s}}`));
714
- cp.stderr?.pipe((0, split2_1.default)()).on("data", (e) => outFunc(e, writeStreams.stderr.bind(writeStreams), (s) => (0, chalk_1.default) `{redBright ${s}}`));
711
+ cp.stdout?.pipe(split2()).on("data", (e) => outFunc(e, writeStreams.stdout.bind(writeStreams), (s) => chalk `{greenBright ${s}}`));
712
+ cp.stderr?.pipe(split2()).on("data", (e) => outFunc(e, writeStreams.stderr.bind(writeStreams), (s) => chalk `{redBright ${s}}`));
715
713
  }
716
714
  void cp.on("exit", (code) => resolve(code ?? 0));
717
715
  void cp.on("error", (err) => reject(err));
@@ -734,8 +732,8 @@ class Job {
734
732
  return "docker.io/ruby:3.1";
735
733
  }
736
734
  }
737
- const expanded = utils_1.Utils.expandVariables(vars);
738
- const imageName = utils_1.Utils.expandText(image.name, expanded);
735
+ const expanded = Utils.expandVariables(vars);
736
+ const imageName = Utils.expandText(image.name, expanded);
739
737
  return imageName.includes(":") ? imageName : `${imageName}:latest`;
740
738
  }
741
739
  imageUser(vars = {}) {
@@ -744,23 +742,23 @@ class Job {
744
742
  return null;
745
743
  if (!image["docker"])
746
744
  return null;
747
- return utils_1.Utils.expandText(image["docker"]["user"], vars);
745
+ return Utils.expandText(image["docker"]["user"], vars);
748
746
  }
749
747
  get imageEntrypoint() {
750
748
  const image = this.jobData["image"];
751
749
  if (!image?.entrypoint) {
752
750
  return null;
753
751
  }
754
- (0, assert_1.default)(Array.isArray(image.entrypoint), "image:entrypoint must be an array");
752
+ assert(Array.isArray(image.entrypoint), "image:entrypoint must be an array");
755
753
  return image.entrypoint;
756
754
  }
757
755
  async pullImage(writeStreams, imageToPull) {
758
756
  const pullPolicy = this.argv.pullPolicy;
759
757
  const actualPull = async () => {
760
758
  const time = process.hrtime();
761
- await utils_1.Utils.spawn([this.argv.containerExecutable, "pull", imageToPull]);
759
+ await Utils.spawn([this.argv.containerExecutable, "pull", imageToPull]);
762
760
  const endTime = process.hrtime(time);
763
- writeStreams.stdout((0, chalk_1.default) `${this.formattedJobName} {magentaBright pulled} ${imageToPull} in {magenta ${(0, pretty_hrtime_1.default)(endTime)}}\n`);
761
+ writeStreams.stdout(chalk `${this.formattedJobName} {magentaBright pulled} ${imageToPull} in {magenta ${prettyHrtime(endTime)}}\n`);
764
762
  this.refreshLongRunningSilentTimeout(writeStreams);
765
763
  };
766
764
  if (pullPolicy === "always") {
@@ -768,7 +766,7 @@ class Job {
768
766
  return;
769
767
  }
770
768
  try {
771
- await utils_1.Utils.spawn([this.argv.containerExecutable, "image", "inspect", imageToPull]);
769
+ await Utils.spawn([this.argv.containerExecutable, "image", "inspect", imageToPull]);
772
770
  }
773
771
  catch (e) {
774
772
  await actualPull();
@@ -780,13 +778,13 @@ class Job {
780
778
  const producers = this.producers;
781
779
  let producerReportsEnvs = {};
782
780
  for (const producer of producers ?? []) {
783
- const producerDotenv = utils_1.Utils.expandText(producer.dotenv, expanded);
781
+ const producerDotenv = Utils.expandText(producer.dotenv, expanded);
784
782
  if (producerDotenv === null)
785
783
  continue;
786
- const safeProducerName = utils_1.Utils.safeDockerString(producer.name);
784
+ const safeProducerName = Utils.safeDockerString(producer.name);
787
785
  const dotenvFolder = `${cwd}/${stateDir}/artifacts/${safeProducerName}/.gitlab-ci-reports/dotenv/`;
788
786
  if (await fs.pathExists(dotenvFolder)) {
789
- const dotenvFiles = (await utils_1.Utils.spawn(["find", ".", "-type", "f"], dotenvFolder)).stdout.split("\n");
787
+ const dotenvFiles = (await Utils.spawn(["find", ".", "-type", "f"], dotenvFolder)).stdout.split("\n");
790
788
  for (const dotenvFile of dotenvFiles) {
791
789
  if (dotenvFile == "")
792
790
  continue;
@@ -795,7 +793,7 @@ class Job {
795
793
  }
796
794
  }
797
795
  else {
798
- writeStreams.stderr((0, chalk_1.default) `${this.formattedJobName} {yellow reports.dotenv produced by '${producer.name}' could not be found}\n`);
796
+ writeStreams.stderr(chalk `${this.formattedJobName} {yellow reports.dotenv produced by '${producer.name}' could not be found}\n`);
799
797
  }
800
798
  }
801
799
  return producerReportsEnvs;
@@ -816,11 +814,11 @@ class Job {
816
814
  if (!await fs.pathExists(cacheFolder)) {
817
815
  continue;
818
816
  }
819
- await mutex_1.Mutex.exclusive(cacheName, async () => {
817
+ await Mutex.exclusive(cacheName, async () => {
820
818
  await this.copyIn(cacheFolder);
821
819
  });
822
820
  const endTime = process.hrtime(time);
823
- writeStreams.stdout((0, chalk_1.default) `${this.formattedJobName} {magentaBright imported cache '${cacheName}'} in {magenta ${(0, pretty_hrtime_1.default)(endTime)}}\n`);
821
+ writeStreams.stdout(chalk `${this.formattedJobName} {magentaBright imported cache '${cacheName}'} in {magenta ${prettyHrtime(endTime)}}\n`);
824
822
  }
825
823
  }
826
824
  async copyArtifactsIn(writeStreams) {
@@ -831,27 +829,27 @@ class Job {
831
829
  const time = process.hrtime();
832
830
  const promises = [];
833
831
  for (const producer of this.producers ?? []) {
834
- const producerSafeName = utils_1.Utils.safeDockerString(producer.name);
832
+ const producerSafeName = Utils.safeDockerString(producer.name);
835
833
  const artifactFolder = `${cwd}/${stateDir}/artifacts/${producerSafeName}`;
836
834
  if (!await fs.pathExists(artifactFolder)) {
837
835
  await fs.mkdirp(artifactFolder);
838
836
  }
839
837
  const readdir = await fs.readdir(artifactFolder);
840
838
  if (readdir.length === 0) {
841
- writeStreams.stderr((0, chalk_1.default) `${this.formattedJobName} {yellow artifacts from {blueBright ${producerSafeName}} was empty}\n`);
839
+ writeStreams.stderr(chalk `${this.formattedJobName} {yellow artifacts from {blueBright ${producerSafeName}} was empty}\n`);
842
840
  }
843
841
  promises.push(this.copyIn(artifactFolder));
844
842
  }
845
843
  await Promise.all(promises);
846
844
  const endTime = process.hrtime(time);
847
- writeStreams.stdout((0, chalk_1.default) `${this.formattedJobName} {magentaBright imported artifacts} in {magenta ${(0, pretty_hrtime_1.default)(endTime)}}\n`);
845
+ writeStreams.stdout(chalk `${this.formattedJobName} {magentaBright imported artifacts} in {magenta ${prettyHrtime(endTime)}}\n`);
848
846
  }
849
847
  copyIn(source) {
850
848
  const safeJobName = this.safeJobName;
851
849
  if (!this.imageName(this._variables) && this.argv.shellIsolation) {
852
- return utils_1.Utils.spawn(["rsync", "-a", `${source}/.`, `${this.argv.cwd}/${this.argv.stateDir}/builds/${safeJobName}`]);
850
+ return Utils.spawn(["rsync", "-a", `${source}/.`, `${this.argv.cwd}/${this.argv.stateDir}/builds/${safeJobName}`]);
853
851
  }
854
- return utils_1.Utils.spawn([this.argv.containerExecutable, "cp", `${source}/.`, `${this._containerId}:/gcl-builds`]);
852
+ return Utils.spawn([this.argv.containerExecutable, "cp", `${source}/.`, `${this._containerId}:/gcl-builds`]);
855
853
  }
856
854
  async copyCacheOut(writeStreams, expanded) {
857
855
  if (this.argv.mountCache && this.imageName(expanded))
@@ -871,20 +869,20 @@ class Job {
871
869
  const cacheName = await this.getUniqueCacheName(cwd, expanded, c.key);
872
870
  for (const path of c.paths) {
873
871
  time = process.hrtime();
874
- const expandedPath = utils_1.Utils.expandText(path, expanded).replace(`${expanded.CI_PROJECT_DIR}/`, "");
872
+ const expandedPath = Utils.expandText(path, expanded).replace(`${expanded.CI_PROJECT_DIR}/`, "");
875
873
  let cmd = "shopt -s globstar nullglob dotglob\n";
876
874
  cmd += `mkdir -p ../../cache/${cacheName}\n`;
877
875
  cmd += `rsync -Ra ${expandedPath} ../../cache/${cacheName}/. || true\n`;
878
- await mutex_1.Mutex.exclusive(cacheName, async () => {
876
+ await Mutex.exclusive(cacheName, async () => {
879
877
  await this.copyOut(cmd, stateDir, "cache", []);
880
878
  });
881
879
  endTime = process.hrtime(time);
882
880
  const readdir = await fs.readdir(`${this.argv.cwd}/${stateDir}/cache/${cacheName}`);
883
881
  if (readdir.length === 0) {
884
- writeStreams.stdout((0, chalk_1.default) `${this.formattedJobName} {yellow !! no cache was copied for ${path} !!}\n`);
882
+ writeStreams.stdout(chalk `${this.formattedJobName} {yellow !! no cache was copied for ${path} !!}\n`);
885
883
  }
886
884
  else {
887
- writeStreams.stdout((0, chalk_1.default) `${this.formattedJobName} {magentaBright exported cache ${expandedPath} '${cacheName}'} in {magenta ${(0, pretty_hrtime_1.default)(endTime)}}\n`);
885
+ writeStreams.stdout(chalk `${this.formattedJobName} {magentaBright exported cache ${expandedPath} '${cacheName}'} in {magenta ${prettyHrtime(endTime)}}\n`);
888
886
  }
889
887
  }
890
888
  }
@@ -906,15 +904,15 @@ class Job {
906
904
  cpCmd += `mkdir -p ${artifactsPath}/${safeJobName}\n`;
907
905
  cpCmd += "rsync --exclude '.gitlab-ci-local/**' -Ra ";
908
906
  for (const artifactExcludePath of this.artifacts?.exclude ?? []) {
909
- const expandedPath = utils_1.Utils.expandText(artifactExcludePath, expanded).replace(`${expanded.CI_PROJECT_DIR}/`, "");
907
+ const expandedPath = Utils.expandText(artifactExcludePath, expanded).replace(`${expanded.CI_PROJECT_DIR}/`, "");
910
908
  cpCmd += `--exclude '${expandedPath}' `;
911
909
  }
912
910
  for (const artifactPath of this.artifacts?.paths ?? []) {
913
- const expandedPath = utils_1.Utils.expandText(artifactPath, expanded).replace(`${expanded.CI_PROJECT_DIR}/`, "");
911
+ const expandedPath = Utils.expandText(artifactPath, expanded).replace(`${expanded.CI_PROJECT_DIR}/`, "");
914
912
  cpCmd += `${expandedPath} `;
915
913
  }
916
914
  cpCmd += `${artifactsPath}/${safeJobName}/. || true\n`;
917
- const reportDotenv = utils_1.Utils.expandText(this.artifacts.reports?.dotenv ?? null, expanded);
915
+ const reportDotenv = Utils.expandText(this.artifacts.reports?.dotenv ?? null, expanded);
918
916
  const reportDotenvs = (typeof reportDotenv === "string") // normalize to string[] for easier handling
919
917
  ? [reportDotenv]
920
918
  : reportDotenv;
@@ -933,25 +931,25 @@ class Job {
933
931
  if (reportDotenvs != null) {
934
932
  reportDotenvs.forEach(async (reportDotenv) => {
935
933
  if (!await fs.pathExists(`${cwd}/${stateDir}/artifacts/${safeJobName}/.gitlab-ci-reports/dotenv/${reportDotenv}`)) {
936
- writeStreams.stderr((0, chalk_1.default) `${this.formattedJobName} {yellow artifact reports dotenv '${reportDotenv}' could not be found}\n`);
934
+ writeStreams.stderr(chalk `${this.formattedJobName} {yellow artifact reports dotenv '${reportDotenv}' could not be found}\n`);
937
935
  }
938
936
  });
939
937
  }
940
938
  const readdir = await fs.readdir(`${cwd}/${stateDir}/artifacts/${safeJobName}`);
941
939
  if (readdir.length === 0) {
942
- writeStreams.stdout((0, chalk_1.default) `${this.formattedJobName} {yellow !! no artifacts was copied !!}\n`);
940
+ writeStreams.stdout(chalk `${this.formattedJobName} {yellow !! no artifacts was copied !!}\n`);
943
941
  }
944
942
  else {
945
- writeStreams.stdout((0, chalk_1.default) `${this.formattedJobName} {magentaBright exported artifacts} in {magenta ${(0, pretty_hrtime_1.default)(endTime)}}\n`);
943
+ writeStreams.stdout(chalk `${this.formattedJobName} {magentaBright exported artifacts} in {magenta ${prettyHrtime(endTime)}}\n`);
946
944
  }
947
945
  if (this.artifactsToSource && (this.argv.shellIsolation || this.imageName(expanded))) {
948
946
  time = process.hrtime();
949
- await utils_1.Utils.spawn(["rsync", "--exclude=/.gitlab-ci-reports/", "-a", `${cwd}/${stateDir}/artifacts/${safeJobName}/.`, cwd]);
947
+ await Utils.spawn(["rsync", "--exclude=/.gitlab-ci-reports/", "-a", `${cwd}/${stateDir}/artifacts/${safeJobName}/.`, cwd]);
950
948
  if (reportDotenv != null) {
951
- await utils_1.Utils.spawn(["rsync", "-a", `${cwd}/${stateDir}/artifacts/${safeJobName}/.gitlab-ci-reports/dotenv/.`, cwd]);
949
+ await Utils.spawn(["rsync", "-a", `${cwd}/${stateDir}/artifacts/${safeJobName}/.gitlab-ci-reports/dotenv/.`, cwd]);
952
950
  }
953
951
  endTime = process.hrtime(time);
954
- writeStreams.stdout((0, chalk_1.default) `${this.formattedJobName} {magentaBright copied artifacts to cwd} in {magenta ${(0, pretty_hrtime_1.default)(endTime)}}\n`);
952
+ writeStreams.stdout(chalk `${this.formattedJobName} {magentaBright copied artifacts to cwd} in {magenta ${prettyHrtime(endTime)}}\n`);
955
953
  }
956
954
  }
957
955
  async copyOut(cmd, stateDir, type, dockerCmdExtras) {
@@ -960,27 +958,27 @@ class Job {
960
958
  const cwd = this.argv.cwd;
961
959
  await fs.mkdirp(`${cwd}/${stateDir}/${type}`);
962
960
  if (this.imageName(this._variables)) {
963
- const { stdout: containerId } = await utils_1.Utils.bash(`${this.argv.containerExecutable} create -i ${dockerCmdExtras.join(" ")} -v ${buildVolumeName}:/gcl-builds/ -w /gcl-builds docker.io/firecow/gitlab-ci-local-util bash -c "${cmd}"`, cwd);
961
+ const { stdout: containerId } = await Utils.bash(`${this.argv.containerExecutable} create -i ${dockerCmdExtras.join(" ")} -v ${buildVolumeName}:/gcl-builds/ -w /gcl-builds docker.io/firecow/gitlab-ci-local-util bash -c "${cmd}"`, cwd);
964
962
  this._containersToClean.push(containerId);
965
- await utils_1.Utils.spawn([this.argv.containerExecutable, "start", containerId, "--attach"]);
966
- await utils_1.Utils.spawn([this.argv.containerExecutable, "cp", `${containerId}:/${type}/.`, `${stateDir}/${type}/.`], cwd);
963
+ await Utils.spawn([this.argv.containerExecutable, "start", containerId, "--attach"]);
964
+ await Utils.spawn([this.argv.containerExecutable, "cp", `${containerId}:/${type}/.`, `${stateDir}/${type}/.`], cwd);
967
965
  }
968
966
  else if (this.argv.shellIsolation) {
969
- await utils_1.Utils.bash(`bash -eo pipefail -c "${cmd}"`, `${cwd}/${stateDir}/builds/${safeJobName}`);
967
+ await Utils.bash(`bash -eo pipefail -c "${cmd}"`, `${cwd}/${stateDir}/builds/${safeJobName}`);
970
968
  }
971
969
  else if (!this.argv.shellIsolation) {
972
- await utils_1.Utils.bash(`bash -eo pipefail -c "${cmd}"`, `${cwd}`);
970
+ await Utils.bash(`bash -eo pipefail -c "${cmd}"`, `${cwd}`);
973
971
  }
974
972
  }
975
973
  refreshLongRunningSilentTimeout(writeStreams) {
976
974
  clearTimeout(this._longRunningSilentTimeout);
977
975
  this._longRunningSilentTimeout = setTimeout(() => {
978
- writeStreams.stdout((0, chalk_1.default) `${this.formattedJobName} {grey > still running...}\n`);
976
+ writeStreams.stdout(chalk `${this.formattedJobName} {grey > still running...}\n`);
979
977
  this.refreshLongRunningSilentTimeout(writeStreams);
980
978
  }, 10000);
981
979
  }
982
980
  getFinishedString() {
983
- return (0, chalk_1.default) `${this.formattedJobName} {magentaBright finished} in {magenta ${this.prettyDuration}}`;
981
+ return chalk `${this.formattedJobName} {magentaBright finished} in {magenta ${this.prettyDuration}}`;
984
982
  }
985
983
  printFinishedString() {
986
984
  if (this.jobStatus !== "success")
@@ -992,28 +990,28 @@ class Job {
992
990
  const finishedStr = this.getFinishedString();
993
991
  // Won't print if jobStatus is "success" because that will be printed via the `printFinishedString()`
994
992
  if (this.jobStatus === "warning") {
995
- writeStreams.stderr((0, chalk_1.default) `${finishedStr} {black.bgYellowBright WARN ${code.toString()} }\n`);
993
+ writeStreams.stderr(chalk `${finishedStr} {black.bgYellowBright WARN ${code.toString()} }\n`);
996
994
  }
997
995
  else if (this.jobStatus === "failed") {
998
- writeStreams.stderr((0, chalk_1.default) `${finishedStr} {black.bgRed FAIL ${code.toString()} }\n`);
996
+ writeStreams.stderr(chalk `${finishedStr} {black.bgRed FAIL ${code.toString()} }\n`);
999
997
  }
1000
998
  }
1001
999
  printAfterScriptExitedString(code) {
1002
1000
  const writeStreams = this.writeStreams;
1003
1001
  const finishedStr = this.getFinishedString();
1004
1002
  if (code !== 0) {
1005
- writeStreams.stderr((0, chalk_1.default) `${finishedStr} {black.bgYellowBright WARN ${code.toString()} } after_script\n`);
1003
+ writeStreams.stderr(chalk `${finishedStr} {black.bgYellowBright WARN ${code.toString()} } after_script\n`);
1006
1004
  }
1007
1005
  }
1008
1006
  async createDockerNetwork(networkName) {
1009
- const { stdout: networkId } = await utils_1.Utils.spawn([this.argv.containerExecutable, "network", "create", `${networkName}`]);
1007
+ const { stdout: networkId } = await Utils.spawn([this.argv.containerExecutable, "network", "create", `${networkName}`]);
1010
1008
  this._serviceNetworkId = networkId;
1011
1009
  }
1012
1010
  async startService(writeStreams, expanded, service) {
1013
1011
  const cwd = this.argv.cwd;
1014
1012
  let dockerCmd = `${this.argv.containerExecutable} create --interactive `;
1015
1013
  this.refreshLongRunningSilentTimeout(writeStreams);
1016
- if (expanded["FF_DISABLE_UMASK_FOR_DOCKER_EXECUTOR"] === "false") {
1014
+ if (this.argv.umask === true) {
1017
1015
  dockerCmd += "--user 0:0 ";
1018
1016
  }
1019
1017
  if (this.argv.privileged) {
@@ -1069,20 +1067,20 @@ class Job {
1069
1067
  }
1070
1068
  (service.command ?? []).forEach((e) => dockerCmd += `"${e.replace(/\$/g, "\\$")}" `);
1071
1069
  const time = process.hrtime();
1072
- const { stdout: containerId } = await utils_1.Utils.bash(dockerCmd, cwd);
1070
+ const { stdout: containerId } = await Utils.bash(dockerCmd, cwd);
1073
1071
  this._containersToClean.push(containerId);
1074
1072
  for (const network of this.argv.network) {
1075
- await utils_1.Utils.spawn([this.argv.containerExecutable, "network", "connect", network, `${containerId}`]);
1073
+ await Utils.spawn([this.argv.containerExecutable, "network", "connect", network, `${containerId}`]);
1076
1074
  }
1077
- await utils_1.Utils.spawn([this.argv.containerExecutable, "start", `${containerId}`]);
1075
+ await Utils.spawn([this.argv.containerExecutable, "start", `${containerId}`]);
1078
1076
  const endTime = process.hrtime(time);
1079
- writeStreams.stdout((0, chalk_1.default) `${this.formattedJobName} {magentaBright started service image: ${serviceName} with aliases: ${Array.from(aliases).join(", ")}} in {magenta ${(0, pretty_hrtime_1.default)(endTime)}}\n`);
1077
+ writeStreams.stdout(chalk `${this.formattedJobName} {magentaBright started service image: ${serviceName} with aliases: ${Array.from(aliases).join(", ")}} in {magenta ${prettyHrtime(endTime)}}\n`);
1080
1078
  return containerId;
1081
1079
  }
1082
1080
  async serviceHealthCheck(writeStreams, service, serviceIndex, serviceContainerLogFile) {
1083
1081
  const serviceAlias = service.alias;
1084
1082
  const serviceName = service.name;
1085
- const { stdout } = await utils_1.Utils.spawn([this.argv.containerExecutable, "image", "inspect", serviceName]);
1083
+ const { stdout } = await Utils.spawn([this.argv.containerExecutable, "image", "inspect", serviceName]);
1086
1084
  const imageInspect = JSON.parse(stdout);
1087
1085
  // Copied from the startService block. Important thing is that the aliases match
1088
1086
  const serviceNameWithoutVersion = serviceName.replace(/(.*)(:.*)/, "$1");
@@ -1092,7 +1090,7 @@ class Job {
1092
1090
  }
1093
1091
  const uniqueAlias = aliases[aliases.length - 1];
1094
1092
  if ((imageInspect[0]?.Config?.ExposedPorts ?? null) === null) {
1095
- return writeStreams.stderr((0, chalk_1.default) `${this.formattedJobName} {yellow Could not find exposed tcp ports ${serviceName}}\n`);
1093
+ return writeStreams.stderr(chalk `${this.formattedJobName} {yellow Could not find exposed tcp ports ${serviceName}}\n`);
1096
1094
  }
1097
1095
  const time = process.hrtime();
1098
1096
  try {
@@ -1102,20 +1100,20 @@ class Job {
1102
1100
  return;
1103
1101
  const portNum = parseInt(port.replace("/tcp", ""));
1104
1102
  const spawnCmd = [this.argv.containerExecutable, "run", "--rm", `--name=gcl-wait-for-it-${this.jobId}-${serviceIndex}-${portNum}`, "--network", `${this._serviceNetworkId}`, "docker.io/sumina46/wait-for-it", `${uniqueAlias}:${portNum}`, "-t", "30"];
1105
- return utils_1.Utils.spawn(spawnCmd);
1103
+ return Utils.spawn(spawnCmd);
1106
1104
  }));
1107
1105
  const endTime = process.hrtime(time);
1108
- writeStreams.stdout((0, chalk_1.default) `${this.formattedJobName} {greenBright service image: ${serviceName} healthcheck passed in {green ${(0, pretty_hrtime_1.default)(endTime)}}}\n`);
1106
+ writeStreams.stdout(chalk `${this.formattedJobName} {greenBright service image: ${serviceName} healthcheck passed in {green ${prettyHrtime(endTime)}}}\n`);
1109
1107
  }
1110
1108
  catch (e) {
1111
1109
  if (!(e instanceof AggregateError))
1112
1110
  throw e;
1113
1111
  e.errors.forEach((singleError) => {
1114
- writeStreams.stdout((0, chalk_1.default) `${this.formattedJobName} {redBright service image: ${serviceName} healthcheck failed}\n`);
1112
+ writeStreams.stdout(chalk `${this.formattedJobName} {redBright service image: ${serviceName} healthcheck failed}\n`);
1115
1113
  singleError.message.split(/\r?\n/g).forEach((line) => {
1116
- writeStreams.stdout((0, chalk_1.default) `${this.formattedJobName} {redBright ${line}}\n`);
1114
+ writeStreams.stdout(chalk `${this.formattedJobName} {redBright ${line}}\n`);
1117
1115
  });
1118
- writeStreams.stdout((0, chalk_1.default) `${this.formattedJobName} {redBright also see (${serviceContainerLogFile})}\n`);
1116
+ writeStreams.stdout(chalk `${this.formattedJobName} {redBright also see (${serviceContainerLogFile})}\n`);
1119
1117
  });
1120
1118
  }
1121
1119
  finally {
@@ -1124,13 +1122,12 @@ class Job {
1124
1122
  if (!port.endsWith("/tcp"))
1125
1123
  return;
1126
1124
  const portNum = parseInt(port.replace("/tcp", ""));
1127
- return utils_1.Utils.spawn([this.argv.containerExecutable, "rm", "-vf", `gcl-wait-for-it-${this.jobId}-${serviceIndex}-${portNum}`]);
1125
+ return Utils.spawn([this.argv.containerExecutable, "rm", "-vf", `gcl-wait-for-it-${this.jobId}-${serviceIndex}-${portNum}`]);
1128
1126
  }));
1129
1127
  }
1130
1128
  }
1131
1129
  }
1132
- exports.Job = Job;
1133
- async function cleanupJobResources(jobs) {
1130
+ export async function cleanupJobResources(jobs) {
1134
1131
  if (!jobs)
1135
1132
  return;
1136
1133
  const promises = [];
@@ -1139,4 +1136,4 @@ async function cleanupJobResources(jobs) {
1139
1136
  }
1140
1137
  await Promise.all(promises);
1141
1138
  }
1142
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiam9iLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiam9iLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBNnlDQSxrREFPQztBQXB6Q0Qsa0RBQTBCO0FBQzFCLCtDQUFpQztBQUNqQyw2Q0FBK0I7QUFDL0Isa0VBQXlDO0FBQ3pDLG9EQUE0QjtBQUM1QixtQ0FBOEI7QUFHOUIsaURBQThDO0FBQzlDLG1DQUE4QjtBQUU5QixrREFBMEI7QUFFMUIsbURBQXFIO0FBRXJILE1BQU0sY0FBYyxHQUFHLGFBQWEsQ0FBQztBQTBDckMsTUFBTSxhQUFhLEdBQUcsSUFBSSxJQUFJLENBQUMsY0FBYyxDQUFDLFNBQVMsRUFBRTtJQUNyRCxJQUFJLEVBQUUsU0FBUztJQUNmLEtBQUssRUFBRSxTQUFTO0lBQ2hCLElBQUksRUFBRSxTQUFTO0lBQ2YsTUFBTSxFQUFFLFNBQVM7SUFDakIsTUFBTSxFQUFFLFNBQVM7SUFDakIsTUFBTSxFQUFFLEtBQUs7Q0FDaEIsQ0FBQyxDQUFDO0FBV0gsTUFBYSxHQUFHO0lBRVosTUFBTSxDQUFVLGVBQWUsR0FBRyxJQUFJLEdBQUcsQ0FBQztRQUN0QyxTQUFTLEVBQUUscUJBQXFCLEVBQUUsT0FBTyxFQUFFLFVBQVU7UUFDckQsUUFBUSxFQUFFLGVBQWUsRUFBRSxTQUFTO1FBQ3BDLGNBQWMsRUFBRSxXQUFXLEVBQUUsT0FBTyxFQUFFLFVBQVUsRUFBRSxhQUFhO0tBQ2xFLENBQUMsQ0FBQztJQUVNLElBQUksQ0FBTztJQUNYLElBQUksQ0FBUztJQUNiLFFBQVEsQ0FBUztJQUNqQixZQUFZLENBQWtCO0lBQzlCLFdBQVcsQ0FBNkY7SUFDeEcsS0FBSyxDQUFTO0lBQ2QsS0FBSyxDQUFhO0lBRWxCLFlBQVksQ0FFbkI7SUFDTyxJQUFJLENBQVM7SUFDYixNQUFNLENBQVc7SUFDakIsV0FBVyxDQUFTO0lBQ3BCLE9BQU8sQ0FBVTtJQUVULFVBQVUsR0FBNEIsRUFBRSxDQUFD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cnQgKiBhcyBkb3RlbnYgZnJvbSBcImRvdGVudlwiO1xuaW1wb3J0ICogYXMgZnMgZnJvbSBcImZzLWV4dHJhXCI7XG5pbXBvcnQgcHJldHR5SHJ0aW1lIGZyb20gXCJwcmV0dHktaHJ0aW1lXCI7XG5pbXBvcnQgc3BsaXQyIGZyb20gXCJzcGxpdDJcIjtcbmltcG9ydCB7VXRpbHN9IGZyb20gXCIuL3V0aWxzXCI7XG5pbXBvcnQge1dyaXRlU3RyZWFtc30gZnJvbSBcIi4vd3JpdGUtc3RyZWFtc1wiO1xuaW1wb3J0IHtHaXREYXRhfSBmcm9tIFwiLi9naXQtZGF0YVwiO1xuaW1wb3J0IGFzc2VydCwge0Fzc2VydGlvbkVycm9yfSBmcm9tIFwiYXNzZXJ0XCI7XG5pbXBvcnQge011dGV4fSBmcm9tIFwiLi9tdXRleFwiO1xuaW1wb3J0IHtBcmd2fSBmcm9tIFwiLi9hcmd2XCI7XG5pbXBvcnQgZXhlY2EgZnJvbSBcImV4ZWNhXCI7XG5pbXBvcnQge0NJQ0RWYXJpYWJsZX0gZnJvbSBcIi4vdmFyaWFibGVzLWZyb20tZmlsZXNcIjtcbmltcG9ydCB7R2l0bGFiUnVubmVyQ1BVc1ByZXNldFZhbHVlLCBHaXRsYWJSdW5uZXJNZW1vcnlQcmVzZXRWYWx1ZSwgR2l0bGFiUnVubmVyUHJlc2V0VmFsdWVzfSBmcm9tIFwiLi9naXRsYWItcHJlc2V0XCI7XG5cbmNvbnN0IENJX1BST0pFQ1RfRElSID0gXCIvZ2NsLWJ1aWxkc1wiO1xuaW50ZXJmYWNlIEpvYk9wdGlvbnMge1xuICAgIGFyZ3Y6IEFyZ3Y7XG4gICAgd3JpdGVTdHJlYW1zOiBXcml0ZVN0cmVhbXM7XG4gICAgZGF0YTogYW55O1xuICAgIG5hbWU6IHN0cmluZztcbiAgICBiYXNlTmFtZTogc3RyaW5nO1xuICAgIHBpcGVsaW5lSWlkOiBudW1iZXI7XG4gICAgZ2l0RGF0YTogR2l0RGF0YTtcbiAgICBnbG9iYWxWYXJpYWJsZXM6IHtbbmFtZTogc3RyaW5nXTogc3RyaW5nfTtcbiAgICB2YXJpYWJsZXNGcm9tRmlsZXM6IHtbbmFtZTogc3RyaW5nXTogQ0lDRFZhcmlhYmxlfTtcbiAgICBwcmVkZWZpbmVkVmFyaWFibGVzOiB7W25hbWU6IHN0cmluZ106IGFueX07XG4gICAgbWF0cml4VmFyaWFibGVzOiB7W2tleTogc3RyaW5nXTogc3RyaW5nfSB8IG51bGw7XG4gICAgbm9kZUluZGV4OiBudW1iZXIgfCBudWxsO1xuICAgIG5vZGVzVG90YWw6IG51bWJlcjtcbiAgICBleHBhbmRWYXJpYWJsZXM6IGJvb2xlYW47XG59XG5cbmludGVyZmFjZSBDYWNoZSB7XG4gICAgcG9saWN5OiBcInB1bGxcIiB8IFwicHVsbC1wdXNoXCIgfCBcInB1c2hcIjtcbiAgICBrZXk6IHN0cmluZyB8IHtmaWxlczogc3RyaW5nW119O1xuICAgIHBhdGhzOiBzdHJpbmdbXTtcbiAgICB3aGVuOiBcIm9uX3N1Y2Nlc3NcIiB8IFwib25fZmFpbHVyZVwiIHwgXCJhbHdheXNcIjtcbn1cblxuaW50ZXJmYWNlIFNlcnZpY2Uge1xuICAgIG5hbWU6IHN0cmluZztcbiAgICBlbnRyeXBvaW50OiBzdHJpbmdbXSB8IG51bGw7XG4gICAgY29tbWFuZDogc3RyaW5nW10gfCBudWxsO1xuICAgIGFsaWFzOiBzdHJpbmcgfCBudWxsO1xuICAgIHZhcmlhYmxlczoge1tuYW1lOiBzdHJpbmddOiBzdHJpbmd9O1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIE5lZWQge1xuICAgIGpvYjogc3RyaW5nO1xuICAgIGFydGlmYWN0czogYm9vbGVhbjtcbiAgICBvcHRpb25hbD86IGJvb2xlYW47XG4gICAgcmVmPzogc3RyaW5nO1xuICAgIHBpcGVsaW5lPzogc3RyaW5nO1xuICAgIHByb2plY3Q/OiBzdHJpbmc7XG59XG5cbmNvbnN0IGRhdGVGb3JtYXR0ZXIgPSBuZXcgSW50bC5EYXRlVGltZUZvcm1hdCh1bmRlZmluZWQsIHtcbiAgICB5ZWFyOiB1bmRlZmluZWQsXG4gICAgbW9udGg6IHVuZGVmaW5lZCxcbiAgICBob3VyOiBcIm51bWVyaWNcIixcbiAgICBtaW51dGU6IFwibnVtZXJpY1wiLFxuICAgIHNlY29uZDogXCJudW1lcmljXCIsXG4gICAgaG91cjEyOiBmYWxzZSxcbn0pO1xuXG5leHBvcnQgdHlwZSBKb2JSdWxlID0ge1xuICAgIGlmPzogc3RyaW5nO1xuICAgIHdoZW4/OiBzdHJpbmc7XG4gICAgY2hhbmdlcz86IHN0cmluZ1tdIHwge3BhdGhzOiBzdHJpbmdbXX07XG4gICAgZXhpc3RzPzogc3RyaW5nW107XG4gICAgYWxsb3dfZmFpbHVyZT86IGJvb2xlYW47XG4gICAgdmFyaWFibGVzPzoge1tuYW1lOiBzdHJpbmddOiBzdHJpbmd9O1xufTtcblxuZXhwb3J0IGNsYXNzIEpvYiB7XG5cbiAgICBzdGF0aWMgcmVhZG9ubHkgaWxsZWdhbEpvYk5hbWVzID0gbmV3IFNldChbXG4gICAgICAgIFwiaW5jbHVkZVwiLCBcImxvY2FsX2NvbmZpZ3VyYXRpb25cIiwgXCJpbWFnZVwiLCBcInNlcnZpY2VzXCIsXG4gICAgICAgIFwic3RhZ2VzXCIsIFwiYmVmb3JlX3NjcmlwdFwiLCBcImRlZmF1bHRcIixcbiAgICAgICAgXCJhZnRlcl9zY3JpcHRcIiwgXCJ2YXJpYWJsZXNcIiwgXCJjYWNoZVwiLCBcIndvcmtmbG93XCIsIFwicGFnZTpkZXBsb3lcIixcbiAgICBdKTtcblxuICAgIHJlYWRvbmx5IGFyZ3Y6IEFyZ3Y7XG4gICAgcmVhZG9ubHkgbmFtZTogc3RyaW5nO1xuICAgIHJlYWRvbmx5IGJhc2VOYW1lOiBzdHJpbmc7XG4gICAgcmVhZG9ubHkgZGVwZW5kZW5jaWVzOiBzdHJpbmdbXSB8IG51bGw7XG4gICAgcmVhZG9ubHkgZW52aXJvbm1lbnQ/OiB7bmFtZTogc3RyaW5nOyB1cmw6IHN0cmluZyB8IG51bGw7IGRlcGxveW1lbnRfdGllcjogc3RyaW5nIHwgbnVsbDsgYWN0aW9uOiBzdHJpbmcgfCBudWxsfTtcbiAgICByZWFkb25seSBqb2JJZDogbnVtYmVyO1xuICAgIHJlYWRvbmx5IHJ1bGVzPzogSm9iUnVsZVtdO1xuXG4gICAgcmVhZG9ubHkgYWxsb3dGYWlsdXJlOiBib29sZWFuIHwge1xuICAgICAgICBleGl0X2NvZGVzOiBudW1iZXIgfCBudW1iZXJbXTtcbiAgICB9O1xuICAgIHJlYWRvbmx5IHdoZW46IHN0cmluZztcbiAgICByZWFkb25seSBleGlzdHM6IHN0cmluZ1tdO1xuICAgIHJlYWRvbmx5IHBpcGVsaW5lSWlkOiBudW1iZXI7XG4gICAgcmVhZG9ubHkgZ2l0RGF0YTogR2l0RGF0YTtcblxuICAgIHByaXZhdGUgcmVhZG9ubHkgX3ZhcmlhYmxlczoge1trZXk6IHN0cmluZ106IHN0cmluZ30gPSB7fTtcbiAgICBwcml2YXRlIF9kb3RlbnZWYXJpYWJsZXM6IHtba2V5OiBzdHJpbmddOiBzdHJpbmd9ID0ge307XG4gICAgcHJpdmF0ZSBfcHJlc2NyaXB0c0V4aXRDb2RlOiBudW1iZXIgfCBudWxsID0gbnVsbDtcbiAgICBwcml2YXRlIF9hZnRlclNjcmlwdHNFeGl0Q29kZSA9IDA7XG4gICAgcHJpdmF0ZSBfY292ZXJhZ2VQZXJjZW50OiBzdHJpbmcgfCBudWxsID0gbnVsbDtcbiAgICBwcml2YXRlIF9ydW5uaW5nID0gZmFsc2U7XG4gICAgcHJpdmF0ZSBfY29udGFpbmVySWQ6IHN0cmluZyB8IG51bGwgPSBudWxsO1xuICAgIHByaXZhdGUgX3NlcnZpY2VOZXR3b3JrSWQ6IHN0cmluZyB8IG51bGwgPSBudWxsO1xuICAgIHByaXZhdGUgX2NvbnRhaW5lclZvbHVtZU5hbWVzOiBzdHJpbmdbXSA9IFtdO1xuICAgIHByaXZhdGUgX2xvbmdSdW5uaW5nU2lsZW50VGltZW91dDogTm9kZUpTLlRpbWVvdXQgPSAtMSBhcyBhbnk7XG4gICAgcHJpdmF0ZSBfcHJvZHVjZXJzOiB7bmFtZTogc3RyaW5nOyBkb3RlbnY6IHN0cmluZyB8IG51bGx9W10gfCBudWxsID0gbnVsbDtcbiAgICBwcml2YXRlIF9qb2JOYW1lUGFkOiBudW1iZXIgfCBudWxsID0gbnVsbDtcblxuICAgIHByaXZhdGUgX2NvbnRhaW5lcnNUb0NsZWFuOiBzdHJpbmdbXSA9IFtdO1xuICAgIHByaXZhdGUgX2ZpbGVzVG9SbTogc3RyaW5nW10gPSBbXTtcbiAgICBwcml2YXRlIF9zdGFydFRpbWU/OiBbbnVtYmVyLCBudW1iZXJdO1xuICAgIHByaXZhdGUgX2VuZFRpbWU/OiBbbnVtYmVyLCBudW1iZXJdO1xuXG4gICAgcHJpdmF0ZSByZWFkb25seSBqb2JEYXRhOiBhbnk7XG4gICAgcHJpdmF0ZSByZWFkb25seSB3cml0ZVN0cmVhbXM6IFdyaXRlU3RyZWFtcztcblxuICAgIGNvbnN0cnVjdG9yIChvcHQ6IEpvYk9wdGlvbnMpIHtcbiAgICAgICAgY29uc3Qgam9iRGF0YSA9IG9wdC5kYXRhO1xuICAgICAgICBjb25zdCBnaXREYXRhID0gb3B0LmdpdERhdGE7XG4gICAgICAgIGNvbnN0IGpvYlZhcmlhYmxlcyA9IGpvYkRhdGEudmFyaWFibGVzID8/IHt9O1xuICAgICAgICBjb25zdCBnbG9iYWxWYXJpYWJsZXMgPSBvcHQuZ2xvYmFsVmFyaWFibGVzID8/IHt9O1xuICAgICAgICBjb25zdCB2YXJpYWJsZXNGcm9tRmlsZXMgPSBvcHQudmFyaWFibGVzRnJvbUZpbGVzO1xuICAgICAgICBjb25zdCBhcmd2ID0gb3B0LmFyZ3Y7XG4gICAgICAgIGNvbnN0IGN3ZCA9IGFyZ3YuY3dkO1xuICAgICAgICBjb25zdCBzdGF0ZURpciA9IGFyZ3Yuc3RhdGVEaXI7XG4gICAgICAgIGNvbnN0IGFyZ3ZWYXJpYWJsZXMgPSBhcmd2LnZhcmlhYmxlO1xuICAgICAgICBjb25zdCBwcmVkZWZpbmVkVmFyaWFibGVzID0gb3B0LnByZWRlZmluZWRWYXJpYWJsZXM7XG4gICAgICAgIGNvbnN0IGV4cGFuZFZhcmlhYmxlcyA9IG9wdC5leHBhbmRWYXJpYWJsZXMgPz8gdHJ1ZTtcblxuICAgICAgICB0aGlzLmFyZ3YgPSBhcmd2O1xuICAgICAgICB0aGlzLndyaXRlU3RyZWFtcyA9IG9wdC53cml0ZVN0cmVhbXM7XG4gICAgICAgIHRoaXMuZ2l0RGF0YSA9IG9wdC5naXREYXRhO1xuICAgICAgICB0aGlzLm5hbWUgPSBvcHQubmFtZTtcbiAgICAgICAgdGhpcy5iYXNlTmFtZSA9IG9wdC5iYXNlTmFtZTtcbiAgICAgICAgdGhpcy5qb2JJZCA9IE1hdGguZmxvb3IoTWF0aC5yYW5kb20oKSAqIDEwMDAwMDApO1xuICAgICAgICB0aGlzLmpvYkRhdGEgPSBvcHQuZGF0YTtcbiAgICAgICAgdGhpcy5waXBlbGluZUlpZCA9IG9wdC5waXBlbGluZUlpZDtcblxuICAgICAgICB0aGlzLndoZW4gPSBqb2JEYXRhLndoZW4gfHwgXCJvbl9zdWNjZXNzXCI7XG4gICAgICAgIHRoaXMuZXhpc3RzID0gam9iRGF0YS5leGlzdHMgfHwgW107XG4gICAgICAgIHRoaXMuYWxsb3dGYWlsdXJlID0gam9iRGF0YS5hbGxvd19mYWlsdXJlID8/IGZhbHNlO1xuICAgICAgICB0aGlzLmRlcGVuZGVuY2llcyA9IGpvYkRhdGEuZGVwZW5kZW5jaWVzIHx8IG51bGw7XG4gICAgICAgIHRoaXMucnVsZXMgPSBqb2JEYXRhLnJ1bGVzIHx8IG51bGw7XG4gICAgICAgIHRoaXMuZW52aXJvbm1lbnQgPSB0eXBlb2Ygam9iRGF0YS5lbnZpcm9ubWVudCA9PT0gXCJzdHJpbmdcIiA/IHtuYW1lOiBqb2JEYXRhLmVudmlyb25tZW50fSA6IGpvYkRhdGEuZW52aXJvbm1lbnQ7XG5cbiAgICAgICAgLy8gSEFDSzogU28gdGhhdCB0aGlzIHdvbid0IHNob3cgdXAgaW4gdGhlIHByZXZpZXcgdmFyaWFibGVzXG4gICAgICAgIGlmICghIGFyZ3YucHJldmlldykge1xuICAgICAgICAgICAgZ2xvYmFsVmFyaWFibGVzW1wiRkZfRElTQUJMRV9VTUFTS19GT1JfRE9DS0VSX0VYRUNVVE9SXCJdID0gYXJndi51bWFzayA/IFwiZmFsc2VcIiA6IFwidHJ1ZVwiO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgbWF0cml4VmFyaWFibGVzID0gb3B0Lm1hdHJpeFZhcmlhYmxlcyA/PyB7fTtcbiAgICAgICAgdGhpcy5fdmFyaWFibGVzID0gey4uLmdsb2JhbFZhcmlhYmxlcywgLi4uam9iVmFyaWFibGVzLCAuLi5tYXRyaXhWYXJpYWJsZXMsIC4uLnByZWRlZmluZWRWYXJpYWJsZXMsIC4uLmFyZ3ZWYXJpYWJsZXN9O1xuXG4gICAgICAgIGxldCBjaVByb2plY3REaXIgPSBgJHtjd2R9YDtcbiAgICAgICAgaWYgKHRoaXMuam9iRGF0YVtcImltYWdlXCJdKSB7XG4gICAgICAgICAgICBjaVByb2plY3REaXIgPSBDSV9QUk9KRUNUX0RJUjtcbiAgICAgICAgfSBlbHNlIGlmIChhcmd2LnNoZWxsSXNvbGF0aW9uKSB7XG4gICAgICAgICAgICBjaVByb2plY3REaXIgPSBgJHtjd2R9LyR7c3RhdGVEaXJ9L2J1aWxkcy8ke3RoaXMuc2FmZUpvYk5hbWV9YDtcbiAgICAgICAgfVxuXG4gICAgICAgIHByZWRlZmluZWRWYXJpYWJsZXNbXCJDSV9KT0JfSURcIl0gPSBgJHt0aGlzLmpvYklkfWA7XG4gICAgICAgIHByZWRlZmluZWRWYXJpYWJsZXNbXCJDSV9QSVBFTElORV9JRFwiXSA9IGAke3RoaXMucGlwZWxpbmVJaWQgKyAxMDAwfWA7XG4gICAgICAgIHByZWRlZmluZWRWYXJpYWJsZXNbXCJDSV9QSVBFTElORV9JSURcIl0gPSBgJHt0aGlzLnBpcGVsaW5lSWlkfWA7XG4gICAgICAgIHByZWRlZmluZWRWYXJpYWJsZXNbXCJDSV9KT0JfTkFNRVwiXSA9IGAke3RoaXMubmFtZX1gO1xuICAgICAgICBwcmVkZWZpbmVkVmFyaWFibGVzW1wiQ0lfSk9CX05BTUVfU0xVR1wiXSA9IGAke3RoaXMubmFtZS5yZXBsYWNlKC9bXmEtelxcZF0rL2lnLCBcIi1cIikucmVwbGFjZSgvXi0vLCBcIlwiKS5zbGljZSgwLCA2MykucmVwbGFjZSgvLSQvLCBcIlwiKS50b0xvd2VyQ2FzZSgpfWA7XG4gICAgICAgIHByZWRlZmluZWRWYXJpYWJsZXNbXCJDSV9KT0JfU1RBR0VcIl0gPSBgJHt0aGlzLnN0YWdlfWA7XG4gICAgICAgIHByZWRlZmluZWRWYXJpYWJsZXNbXCJDSV9QUk9KRUNUX0RJUlwiXSA9IGNpUHJvamVjdERpcjtcbiAgICAgICAgcHJlZGVmaW5lZFZhcmlhYmxlc1tcIkNJX0pPQl9VUkxcIl0gPSBgaHR0cHM6Ly8ke2dpdERhdGEucmVtb3RlLmhvc3R9LyR7Z2l0RGF0YS5yZW1vdGUuZ3JvdXB9LyR7Z2l0RGF0YS5yZW1vdGUucHJvamVjdH0vLS9qb2JzLyR7dGhpcy5qb2JJZH1gOyAvLyBDaGFuZ2VzIG9uIHJlcnVuLlxuICAgICAgICBwcmVkZWZpbmVkVmFyaWFibGVzW1wiQ0lfUElQRUxJTkVfVVJMXCJdID0gYGh0dHBzOi8vJHtnaXREYXRhLnJlbW90ZS5ob3N0fS8ke2dpdERhdGEucmVtb3RlLmdyb3VwfS8ke2dpdERhdGEucmVtb3RlLnByb2plY3R9L3BpcGVsaW5lcy8ke3RoaXMucGlwZWxpbmVJaWR9YDtcbiAgICAgICAgcHJlZGVmaW5lZFZhcmlhYmxlc1tcIkNJX0VOVklST05NRU5UX05BTUVcIl0gPSB0aGlzLmVudmlyb25tZW50Py5uYW1lID8/IFwiXCI7XG4gICAgICAgIHByZWRlZmluZWRWYXJpYWJsZXNbXCJDSV9FTlZJUk9OTUVOVF9TTFVHXCJdID0gdGhpcy5lbnZpcm9ubWVudD8ubmFtZT8ucmVwbGFjZSgvW15hLXpcXGRdKy9pZywgXCItXCIpLnJlcGxhY2UoL14tLywgXCJcIikuc2xpY2UoMCwgMjMpLnJlcGxhY2UoLy0kLywgXCJcIikudG9Mb3dlckNhc2UoKSA/PyBcIlwiO1xuICAgICAgICBwcmVkZWZpbmVkVmFyaWFibGVzW1wiQ0lfRU5WSVJPTk1FTlRfVVJMXCJdID0gdGhpcy5lbnZpcm9ubWVudD8udXJsID8/IFwiXCI7XG4gICAgICAgIHByZWRlZmluZWRWYXJpYWJsZXNbXCJDSV9FTlZJUk9OTUVOVF9USUVSXCJdID0gdGhpcy5lbnZpcm9ubWVudD8uZGVwbG95bWVudF90aWVyID8/IFwiXCI7XG4gICAgICAgIHByZWRlZmluZWRWYXJpYWJsZXNbXCJDSV9FTlZJUk9OTUVOVF9BQ1RJT05cIl0gPSB0aGlzLmVudmlyb25tZW50Py5hY3Rpb24gPz8gXCJcIjtcblxuICAgICAgICBpZiAob3B0Lm5vZGVJbmRleCAhPT0gbnVsbCkge1xuICAgICAgICAgICAgcHJlZGVmaW5lZFZhcmlhYmxlc1tcIkNJX05PREVfSU5ERVhcIl0gPSBgJHtvcHQubm9kZUluZGV4fWA7XG4gICAgICAgIH1cbiAgICAgICAgcHJlZGVmaW5lZFZhcmlhYmxlc1tcIkNJX05PREVfVE9UQUxcIl0gPSBgJHtvcHQubm9kZXNUb3RhbH1gO1xuICAgICAgICBwcmVkZWZpbmVkVmFyaWFibGVzW1wiQ0lfUkVHSVNUUllcIl0gPSBgbG9jYWwtcmVnaXN0cnkuJHt0aGlzLmdpdERhdGEucmVtb3RlLmhvc3R9YDtcbiAgICAgICAgcHJlZGVmaW5lZFZhcmlhYmxlc1tcIkNJX1JFR0lTVFJZX0lNQUdFXCJdID0gYCRDSV9SRUdJU1RSWS8ke3RoaXMuX3ZhcmlhYmxlc1tcIkNJX1BST0pFQ1RfUEFUSFwiXS50b0xvd2VyQ2FzZSgpfWA7XG5cbiAgICAgICAgLy8gRXhwYW5kIHZhcmlhYmxlcyBpbiBydWxlczpjaGFuZ2VzXG4gICAgICAgIGlmICh0aGlzLnJ1bGVzICYmIGV4cGFuZFZhcmlhYmxlcykge1xuICAgICAgICAgICAgY29uc3QgZXhwYW5kZWQgPSBVdGlscy5leHBhbmRWYXJpYWJsZXModGhpcy5fdmFyaWFibGVzKTtcbiAgICAgICAgICAgIHRoaXMucnVsZXMuZm9yRWFjaCgocnVsZSwgcnVsZUlkeCwgcnVsZXMpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBjaGFuZ2VzID0gQXJyYXkuaXNBcnJheShydWxlLmNoYW5nZXMpID8gcnVsZS5jaGFuZ2VzIDogcnVsZS5jaGFuZ2VzPy5wYXRocztcbiAgICAgICAgICAgICAgICBpZiAoIWNoYW5nZXMpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGNoYW5nZXMuZm9yRWFjaCgoY2hhbmdlLCBjaGFuZ2VJZHgsIGNoYW5nZXMpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgY2hhbmdlc1tjaGFuZ2VJZHhdID0gVXRpbHMuZXhwYW5kVGV4dChjaGFuZ2UsIGV4cGFuZGVkKTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICBydWxlc1tydWxlSWR4XS5jaGFuZ2VzID0gY2hhbmdlcztcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gRmluZCBlbnZpcm9ubWVudCBtYXRjaGVkIHZhcmlhYmxlc1xuICAgICAgICBpZiAodGhpcy5lbnZpcm9ubWVudCAmJiBleHBhbmRWYXJpYWJsZXMpIHtcbiAgICAgICAgICAgIGNvbnN0IGV4cGFuZGVkID0gVXRpbHMuZXhwYW5kVmFyaWFibGVzKHRoaXMuX3ZhcmlhYmxlcyk7XG4gICAgICAgICAgICB0aGlzLmVudmlyb25tZW50Lm5hbWUgPSBVdGlscy5leHBhbmRUZXh0KHRoaXMuZW52aXJvbm1lbnQubmFtZSwgZXhwYW5kZWQpO1xuICAgICAgICAgICAgdGhpcy5lbnZpcm9ubWVudC51cmwgPSBVdGlscy5leHBhbmRUZXh0KHRoaXMuZW52aXJvbm1lbnQudXJsLCBleHBhbmRlZCk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgZW52TWF0Y2hlZFZhcmlhYmxlcyA9IFV0aWxzLmZpbmRFbnZNYXRjaGVkVmFyaWFibGVzKHZhcmlhYmxlc0Zyb21GaWxlcywgdGhpcy5maWxlVmFyaWFibGVzRGlyLCB0aGlzLmVudmlyb25tZW50KTtcblxuICAgICAgICAvLyBNZXJnZSBhbmQgZXhwYW5kIGFmdGVyIGZpbmRpbmcgZW52IG1hdGNoZWQgdmFyaWFibGVzXG4gICAgICAgIHRoaXMuX3ZhcmlhYmxlcyA9IHsuLi5nbG9iYWxWYXJpYWJsZXMsIC4uLmpvYlZhcmlhYmxlcywgLi4ubWF0cml4VmFyaWFibGVzLCAuLi5wcmVkZWZpbmVkVmFyaWFibGVzLCAuLi5lbnZNYXRjaGVkVmFyaWFibGVzLCAuLi5hcmd2VmFyaWFibGVzfTtcblxuICAgICAgICAvLyBTZXQge3doZW4sIGFsbG93RmFpbHVyZX0gYmFzZWQgb24gcnVsZXMgcmVzdWx0XG4gICAgICAgIGlmICh0aGlzLnJ1bGVzKSB7XG4gICAgICAgICAgICBjb25zdCBydWxlUmVzdWx0ID0gVXRpbHMuZ2V0UnVsZXNSZXN1bHQoe2N3ZCwgcnVsZXM6IHRoaXMucnVsZXMsIHZhcmlhYmxlczogdGhpcy5fdmFyaWFibGVzfSwgdGhpcy5naXREYXRhLCB0aGlzLndoZW4sIHRoaXMuYWxsb3dGYWlsdXJlKTtcbiAgICAgICAgICAgIHRoaXMud2hlbiA9IHJ1bGVSZXN1bHQud2hlbjtcbiAgICAgICAgICAgIHRoaXMuYWxsb3dGYWlsdXJlID0gcnVsZVJlc3VsdC5hbGxvd0ZhaWx1cmU7XG4gICAgICAgICAgICB0aGlzLl92YXJpYWJsZXMgPSB7Li4uZ2xvYmFsVmFyaWFibGVzLCAuLi5qb2JWYXJpYWJsZXMsIC4uLnJ1bGVSZXN1bHQudmFyaWFibGVzLCAuLi5tYXRyaXhWYXJpYWJsZXMsIC4uLnByZWRlZmluZWRWYXJpYWJsZXMsIC4uLmVudk1hdGNoZWRWYXJpYWJsZXMsIC4uLmFyZ3ZWYXJpYWJsZXN9O1xuICAgICAgICB9XG4gICAgICAgIC8vIERlbGV0ZSB2YXJpYWJsZXMgdGhlIHVzZXIgaW50ZW50aW9uYWxseSB3YW50cyB1bnNldFxuICAgICAgICBmb3IgKGNvbnN0IHVuc2V0VmFyaWFibGUgb2YgYXJndi51bnNldFZhcmlhYmxlcykge1xuICAgICAgICAgICAgZGVsZXRlIHRoaXMuX3ZhcmlhYmxlc1t1bnNldFZhcmlhYmxlXTtcbiAgICAgICAgfVxuXG4gICAgICAgIGFzc2VydCh0aGlzLnNjcmlwdHMgfHwgdGhpcy50cmlnZ2VyLCBjaGFsa2B7Ymx1ZUJyaWdodCAke3RoaXMubmFtZX19IG11c3QgaGF2ZSBzY3JpcHQgc3BlY2lmaWVkYCk7XG5cbiAgICAgICAgYXNzZXJ0KCEodGhpcy5pbnRlcmFjdGl2ZSAmJiAhdGhpcy5hcmd2LnNoZWxsRXhlY3V0b3JOb0ltYWdlKSwgY2hhbGtgJHt0aGlzLmZvcm1hdHRlZEpvYk5hbWV9IEBJbnRlcmFjdGl2ZSBkZWNvcmF0b3IgY2Fubm90IGJlIHVzZWQgd2l0aCAtLW5vLXNoZWxsLWV4ZWN1dG9yLW5vLWltYWdlYCk7XG5cbiAgICAgICAgaWYgKHRoaXMuaW50ZXJhY3RpdmUgJiYgKHRoaXMud2hlbiAhPT0gXCJtYW51YWxcIiB8fCB0aGlzLmltYWdlTmFtZSh0aGlzLl92YXJpYWJsZXMpICE9PSBudWxsKSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEFzc2VydGlvbkVycm9yKHttZXNzYWdlOiBgJHt0aGlzLmZvcm1hdHRlZEpvYk5hbWV9IEBJbnRlcmFjdGl2ZSBkZWNvcmF0b3IgY2Fubm90IGhhdmUgaW1hZ2U6IGFuZCBtdXN0IGJlIHdoZW46bWFudWFsYH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMuaW5qZWN0U1NIQWdlbnQgJiYgdGhpcy5pbWFnZU5hbWUodGhpcy5fdmFyaWFibGVzKSA9PT0gbnVsbCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEFzc2VydGlvbkVycm9yKHttZXNzYWdlOiBgJHt0aGlzLmZvcm1hdHRlZEpvYk5hbWV9IEBJbmplY3RTU0hBZ2VudCBjYW4gb25seSBiZSB1c2VkIHdpdGggaW1hZ2U6YH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgZXhwYW5kZWQgPSBVdGlscy5leHBhbmRWYXJpYWJsZXModGhpcy5fdmFyaWFibGVzKTtcbiAgICAgICAgZm9yIChjb25zdCBbaSwgY10gb2YgT2JqZWN0LmVudHJpZXM8YW55Pih0aGlzLmNhY2hlKSkge1xuICAgICAgICAgICAgYy5wb2xpY3kgPSBVdGlscy5leHBhbmRUZXh0KGMucG9saWN5LCBleHBhbmRlZCk7XG4gICAgICAgICAgICBhc3NlcnQoW1wicHVsbFwiLCBcInB1c2hcIiwgXCJwdWxsLXB1c2hcIl0uaW5jbHVkZXMoYy5wb2xpY3kpLCBjaGFsa2B7Ymx1ZSAke3RoaXMubmFtZX19IGNhY2hlWyR7aX1dLnBvbGljeSBpcyBub3QgJ3B1bGwnLCAncHVzaCcgb3IgJ3B1bGwtcHVzaCdgKTtcbiAgICAgICAgICAgIGFzc2VydChbXCJvbl9zdWNjZXNzXCIsIFwib25fZmFpbHVyZVwiLCBcImFsd2F5c1wiXS5pbmNsdWRlcyhjLndoZW4pLCBjaGFsa2B7Ymx1ZSAke3RoaXMubmFtZX19IGNhY2hlWyR7aX1dLndoZW4gaXMgbm90ICdvbl9zdWNjZXNzJywgJ29uX2ZhaWx1cmUnIG9yICdhbHdheXMnYCk7XG4gICAgICAgICAgICBhc3NlcnQoQXJyYXkuaXNBcnJheShjLnBhdGhzKSwgY2hhbGtge2JsdWUgJHt0aGlzLm5hbWV9fSBjYWNoZVske2l9XS5wYXRocyBtdXN0IGJlIGFycmF5YCk7XG4gICAgICAgIH1cblxuICAgICAgICBmb3IgKGNvbnN0IFtpLCBzXSBvZiBPYmplY3QuZW50cmllczxhbnk+KHRoaXMuc2VydmljZXMpKSB7XG4gICAgICAgICAgICBhc3NlcnQocy5uYW1lLCBjaGFsa2B7Ymx1ZSAke3RoaXMubmFtZX19IHNlcnZpY2VzWyR7aX1dLm5hbWUgaXMgdW5kZWZpbmVkYCk7XG4gICAgICAgICAgICBhc3NlcnQoIXMuY29tbWFuZCB8fCBBcnJheS5pc0FycmF5KHMuY29tbWFuZCksIGNoYWxrYHtibHVlICR7dGhpcy5uYW1lfX0gc2VydmljZXNbJHtpfV0uY29tbWFuZCBtdXN0IGJlIGFuIGFycmF5YCk7XG4gICAgICAgICAgICBhc3NlcnQoIXMuZW50cnlwb2ludCB8fCBBcnJheS5pc0FycmF5KHMuZW50cnlwb2ludCksIGNoYWxrYHtibHVlICR7dGhpcy5uYW1lfX0gc2VydmljZXNbJHtpfV0uZW50cnlwb2ludCBtdXN0IGJlIGFuIGFycmF5YCk7XG4gICAgICAgIH1cblxuICAgICAgICBhc3NlcnQoIXRoaXMuYXJ0aWZhY3RzPy5wYXRocyB8fCBBcnJheS5pc0FycmF5KHRoaXMuYXJ0aWZhY3RzLnBhdGhzKSwgY2hhbGtge2JsdWUgJHt0aGlzLm5hbWV9fSBhcnRpZmFjdHMucGF0aHMgbXVzdCBiZSBhbiBhcnJheWApO1xuXG4gICAgICAgIGlmICh0aGlzLmltYWdlTmFtZSh0aGlzLl92YXJpYWJsZXMpICYmIGFyZ3YubW91bnRDYWNoZSkge1xuICAgICAgICAgICAgZm9yIChjb25zdCBjIG9mIHRoaXMuY2FjaGUpIHtcbiAgICAgICAgICAgICAgICBjLnBhdGhzLmZvckVhY2goKHApID0+IHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcGF0aCA9IFV0aWxzLmV4cGFuZFRleHQocCwgZXhwYW5kZWQpO1xuICAgICAgICAgICAgICAgICAgICBhc3NlcnQoIXBhdGguaW5jbHVkZXMoXCIqXCIpLCBjaGFsa2B7Ymx1ZSAke3RoaXMubmFtZX19IGNhbm5vdCBoYXZlICogaW4gY2FjaGUgcGF0aHMsIHdoZW4gLS1tb3VudC1jYWNoZSBpcyBlbmFibGVkYCk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBnZXQgam9iU3RhdHVzICgpIHtcbiAgICAgICAgaWYgKHRoaXMucHJlU2NyaXB0c0V4aXRDb2RlID09IG51bGwpIHJldHVybiBcInBlbmRpbmdcIjtcbiAgICAgICAgaWYgKHRoaXMucHJlU2NyaXB0c0V4aXRDb2RlID09IDApIHJldHVybiBcInN1Y2Nlc3NcIjtcblxuICAgICAgICBsZXQgYWxsb3dlZEV4aXRDb2RlcyA9IFswXTtcbiAgICAgICAgY29uc3QgYWxsb3dGYWlsdXJlID0gdGhpcy5hbGxvd0ZhaWx1cmU7XG4gICAgICAgIHN3aXRjaCAodHlwZW9mIGFsbG93RmFpbHVyZSkge1xuICAgICAgICAgICAgY2FzZSBcImJvb2xlYW5cIjpcbiAgICAgICAgICAgICAgICBpZiAoYWxsb3dGYWlsdXJlKSB7XG4gICAgICAgICAgICAgICAgICAgIGFsbG93ZWRFeGl0Q29kZXMgPSBbdGhpcy5wcmVTY3JpcHRzRXhpdENvZGVdO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgXCJvYmplY3RcIjpcbiAgICAgICAgICAgICAgICBpZiAoISBBcnJheS5pc0FycmF5KGFsbG93RmFpbHVyZS5leGl0X2NvZGVzKSkge1xuICAgICAgICAgICAgICAgICAgICBhbGxvd2VkRXhpdENvZGVzID0gW2FsbG93RmFpbHVyZS5leGl0X2NvZGVzXTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBhbGxvd2VkRXhpdENvZGVzID0gYWxsb3dGYWlsdXJlLmV4aXRfY29kZXM7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFVuZXhwZWN0ZWQgdHlwZTogICR7dHlwZW9mIGFsbG93RmFpbHVyZX1gKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBhbGxvd2VkRXhpdENvZGVzLmluY2x1ZGVzKHRoaXMucHJlU2NyaXB0c0V4aXRDb2RlKSA/IFwid2FybmluZ1wiIDogXCJmYWlsZWRcIjtcbiAgICB9XG5cbiAgICBnZXQgYXJ0aWZhY3RzVG9Tb3VyY2UgKCkge1xuICAgICAgICBpZiAodGhpcy5qb2JEYXRhW1wiZ2NsQXJ0aWZhY3RzVG9Tb3VyY2VcIl0gIT0gbnVsbCkgcmV0dXJuIHRoaXMuam9iRGF0YVtcImdjbEFydGlmYWN0c1RvU291cmNlXCJdO1xuICAgICAgICByZXR1cm4gdGhpcy5hcmd2LmFydGlmYWN0c1RvU291cmNlO1xuICAgIH1cblxuICAgIGdldCBwcmV0dHlEdXJhdGlvbiAoKSB7XG4gICAgICAgIGlmICh0aGlzLl9lbmRUaW1lKSB7XG4gICAgICAgICAgICByZXR1cm4gcHJldHR5SHJ0aW1lKHRoaXMuX2VuZFRpbWUpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHRoaXMuX3N0YXJ0VGltZVxuICAgICAgICAgICAgPyBwcmV0dHlIcnRpbWUocHJvY2Vzcy5ocnRpbWUodGhpcy5fc3RhcnRUaW1lKSlcbiAgICAgICAgICAgIDogXCIwIG1zXCI7XG4gICAgfVxuXG4gICAgZ2V0IGZvcm1hdHRlZEpvYk5hbWUgKCkge1xuICAgICAgICBjb25zdCB0aW1lc3RhbXBQcmVmaXggPSB0aGlzLmFyZ3Yuc2hvd1RpbWVzdGFtcHNcbiAgICAgICAgICAgID8gYFske2RhdGVGb3JtYXR0ZXIuZm9ybWF0KG5ldyBEYXRlKCkpfSAke3RoaXMucHJldHR5RHVyYXRpb24ucGFkU3RhcnQoNyl9XSBgXG4gICAgICAgICAgICA6IFwiXCI7XG5cbiAgICAgICAgLy8gWzE2OjMzOjE5IDEuMzcgbWluXSBteS1qb2IgICAgID4gaGVsbG8gd29ybGRcbiAgICAgICAgcmV0dXJuIGNoYWxrYCR7dGltZXN0YW1wUHJlZml4fXtibHVlQnJpZ2h0ICR7dGhpcy5uYW1lLnBhZEVuZCh0aGlzLmpvYk5hbWVQYWQpfX1gO1xuICAgIH1cblxuICAgIGdldCBzYWZlSm9iTmFtZSAoKSB7XG4gICAgICAgIHJldHVybiBVdGlscy5zYWZlRG9ja2VyU3RyaW5nKHRoaXMubmFtZSk7XG4gICAgfVxuXG4gICAgZ2V0IG5lZWRzICgpOiBOZWVkW10gfCBudWxsIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuam9iRGF0YVtcIm5lZWRzXCJdID8/IG51bGw7XG4gICAgfVxuXG4gICAgZ2V0IGJ1aWxkVm9sdW1lTmFtZSAoKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIGBnY2wtJHt0aGlzLnNhZmVKb2JOYW1lfS0ke3RoaXMuam9iSWR9LWJ1aWxkYDtcbiAgICB9XG5cbiAgICBnZXQgdG1wVm9sdW1lTmFtZSAoKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIGBnY2wtJHt0aGlzLnNhZmVKb2JOYW1lfS0ke3RoaXMuam9iSWR9LXRtcGA7XG4gICAgfVxuXG4gICAgZ2V0IHNlcnZpY2VzICgpOiBTZXJ2aWNlW10ge1xuICAgICAgICBjb25zdCBzZXJ2aWNlczogU2VydmljZVtdID0gW107XG4gICAgICAgIGlmICghdGhpcy5qb2JEYXRhW1wic2VydmljZXNcIl0pIHJldHVybiBbXTtcblxuICAgICAgICBmb3IgKGNvbnN0IHNlcnZpY2Ugb2YgT2JqZWN0LnZhbHVlczxhbnk+KHRoaXMuam9iRGF0YVtcInNlcnZpY2VzXCJdKSkge1xuICAgICAgICAgICAgY29uc3QgZXhwYW5kZWQgPSBVdGlscy5leHBhbmRWYXJpYWJsZXMoey4uLnRoaXMuX3ZhcmlhYmxlcywgLi4udGhpcy5fZG90ZW52VmFyaWFibGVzLCAuLi5zZXJ2aWNlW1widmFyaWFibGVzXCJdfSk7XG4gICAgICAgICAgICBsZXQgc2VydmljZU5hbWUgPSBVdGlscy5leHBhbmRUZXh0KHNlcnZpY2VbXCJuYW1lXCJdLCBleHBhbmRlZCk7XG4gICAgICAgICAgICBzZXJ2aWNlTmFtZSA9IHNlcnZpY2VOYW1lLmluY2x1ZGVzKFwiOlwiKSA/IHNlcnZpY2VOYW1lIDogYCR7c2VydmljZU5hbWV9OmxhdGVzdGA7XG4gICAgICAgICAgICBzZXJ2aWNlcy5wdXNoKHtcbiAgICAgICAgICAgICAgICBuYW1lOiBzZXJ2aWNlTmFtZSxcbiAgICAgICAgICAgICAgICBlbnRyeXBvaW50OiBzZXJ2aWNlW1wiZW50cnlwb2ludFwiXSA/PyBudWxsLFxuICAgICAgICAgICAgICAgIGNvbW1hbmQ6IHNlcnZpY2VbXCJjb21tYW5kXCJdID8/IG51bGwsXG4gICAgICAgICAgICAgICAgdmFyaWFibGVzOiBleHBhbmRlZCxcbiAgICAgICAgICAgICAgICBhbGlhczogVXRpbHMuZXhwYW5kVGV4dChzZXJ2aWNlW1wiYWxpYXNcIl0sIGV4cGFuZGVkKSA/PyBudWxsLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHNlcnZpY2VzO1xuICAgIH1cblxuICAgIHNldCBqb2JOYW1lUGFkIChqb2JOYW1lUGFkOiBudW1iZXIpIHtcbiAgICAgICAgYXNzZXJ0KHRoaXMuX2pvYk5hbWVQYWQgPT0gbnVsbCwgXCJ0aGlzLl9qb2JOYW1lUGFkIGNhbiBvbmx5IGJlIHNldCBvbmNlXCIpO1xuICAgICAgICB0aGlzLl9qb2JOYW1lUGFkID0gam9iTmFtZVBhZDtcbiAgICB9XG5cbiAgICBnZXQgam9iTmFtZVBhZCAoKTogbnVtYmVyIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2pvYk5hbWVQYWQgPz8gMDtcbiAgICB9XG5cbiAgICBnZXQgcHJvZHVjZXJzICgpOiB7bmFtZTogc3RyaW5nOyBkb3RlbnY6IHN0cmluZyB8IG51bGx9W10gfCBudWxsIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3Byb2R1Y2VycztcbiAgICB9XG5cbiAgICBzZXQgcHJvZHVjZXJzIChwcm9kdWNlcnM6IHtuYW1lOiBzdHJpbmc7IGRvdGVudjogc3RyaW5nIHwgbnVsbH1bXSB8IG51bGwpIHtcbiAgICAgICAgYXNzZXJ0KHRoaXMuX3Byb2R1Y2VycyA9PSBudWxsLCBcInRoaXMuX3Byb2R1Y2VycyBjYW4gb25seSBiZSBzZXQgb25jZVwiKTtcbiAgICAgICAgdGhpcy5fcHJvZHVjZXJzID0gcHJvZHVjZXJzO1xuICAgIH1cblxuICAgIGdldCBzdGFnZSAoKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuam9iRGF0YVtcInN0YWdlXCJdIHx8IFwidGVzdFwiO1xuICAgIH1cblxuICAgIGdldCBpbnRlcmFjdGl2ZSAoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLmpvYkRhdGFbXCJnY2xJbnRlcmFjdGl2ZVwiXSB8fCBmYWxzZTtcbiAgICB9XG5cbiAgICBnZXQgaW5qZWN0U1NIQWdlbnQgKCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy5qb2JEYXRhW1wiZ2NsSW5qZWN0U1NIQWdlbnRcIl0gfHwgZmFsc2U7XG4gICAgfVxuXG4gICAgZ2V0IGRlc2NyaXB0aW9uICgpOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gdGhpcy5qb2JEYXRhW1wiZ2NsRGVzY3JpcHRpb25cIl0gPz8gXCJcIjtcbiAgICB9XG5cbiAgICBnZXQgYXJ0aWZhY3RzICgpOiB7cGF0aHM6IHN0cmluZ1tdOyBleGNsdWRlPzogc3RyaW5nW107IHJlcG9ydHM/OiB7ZG90ZW52Pzogc3RyaW5nfTsgd2hlbj86IHN0cmluZ30gfCBudWxsIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuam9iRGF0YVtcImFydGlmYWN0c1wiXTtcbiAgICB9XG5cbiAgICBkZWxldGVBcnRpZmFjdHMgKCkge1xuICAgICAgICBkZWxldGUgdGhpcy5qb2JEYXRhW1wiYXJ0aWZhY3RzXCJdO1xuICAgIH1cblxuICAgIGdldCBjYWNoZSAoKTogQ2FjaGVbXSB7XG4gICAgICAgIHJldHVybiB0aGlzLmpvYkRhdGFbXCJjYWNoZVwiXSB8fCBbXTtcbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgZ2V0VW5pcXVlQ2FjaGVOYW1lIChjd2Q6IHN0cmluZywgZXhwYW5kZWQ6IHtba2V5OiBzdHJpbmddOiBzdHJpbmd9LCBrZXk6IGFueSkge1xuICAgICAgICBpZiAodHlwZW9mIGtleSA9PT0gXCJzdHJpbmdcIiB8fCBrZXkgPT0gbnVsbCkge1xuICAgICAgICAgICAgcmV0dXJuIFV0aWxzLmV4cGFuZFRleHQoa2V5ID8/IFwiZGVmYXVsdFwiLCBleHBhbmRlZCk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBmaWxlcyA9IGtleVtcImZpbGVzXCJdLm1hcCgoZjogc3RyaW5nKSA9PiB7XG4gICAgICAgICAgICBsZXQgcGF0aCA9IFV0aWxzLmV4cGFuZFRleHQoZiwgZXhwYW5kZWQpO1xuICAgICAgICAgICAgaWYgKHBhdGguc3RhcnRzV2l0aChgJHtDSV9QUk9KRUNUX0RJUn0vYCkpIHtcbiAgICAgICAgICAgICAgICBwYXRoID0gcGF0aC5zbGljZShgJHtDSV9QUk9KRUNUX0RJUn0vYC5sZW5ndGgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGAke2N3ZH0vJHtwYXRofWA7XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gXCJtZC1cIiArIGF3YWl0IFV0aWxzLmNoZWNrc3VtRmlsZXMoY3dkLCBmaWxlcyk7XG4gICAgfVxuXG4gICAgZ2V0IGJlZm9yZVNjcmlwdHMgKCk6IHN0cmluZ1tdIHtcbiAgICAgICAgY29uc3QgYmVmb3JlU2NyaXB0cyA9IHRoaXMuam9iRGF0YVtcImJlZm9yZV9zY3JpcHRcIl0gfHwgW107XG4gICAgICAgIHJldHVybiB0eXBlb2YgYmVmb3JlU2NyaXB0cyA9PT0gXCJzdHJpbmdcIiA/IFtiZWZvcmVTY3JpcHRzXSA6IGJlZm9yZVNjcmlwdHM7XG4gICAgfVxuXG4gICAgZ2V0IGFmdGVyU2NyaXB0cyAoKTogc3RyaW5nW10ge1xuICAgICAgICBjb25zdCBhZnRlclNjcmlwdHMgPSB0aGlzLmpvYkRhdGFbXCJhZnRlcl9zY3JpcHRcIl0gfHwgW107XG4gICAgICAgIHJldHVybiB0eXBlb2YgYWZ0ZXJTY3JpcHRzID09PSBcInN0cmluZ1wiID8gW2FmdGVyU2NyaXB0c10gOiBhZnRlclNjcmlwdHM7XG4gICAgfVxuXG4gICAgZ2V0IHNjcmlwdHMgKCk6IHN0cmluZ1tdIHtcbiAgICAgICAgY29uc3Qgc2NyaXB0ID0gdGhpcy5qb2JEYXRhW1wic2NyaXB0XCJdO1xuICAgICAgICByZXR1cm4gdHlwZW9mIHNjcmlwdCA9PT0gXCJzdHJpbmdcIiA/IFtzY3JpcHRdIDogc2NyaXB0O1xuICAgIH1cblxuICAgIGdldCB0cmlnZ2VyICgpOiBhbnkge1xuICAgICAgICByZXR1cm4gdGhpcy5qb2JEYXRhW1widHJpZ2dlclwiXTtcbiAgICB9XG5cbiAgICBnZXQgcHJlU2NyaXB0c0V4aXRDb2RlICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3ByZXNjcmlwdHNFeGl0Q29kZTtcbiAgICB9XG5cbiAgICBnZXQgYWZ0ZXJTY3JpcHRzRXhpdENvZGUgKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fYWZ0ZXJTY3JpcHRzRXhpdENvZGU7XG4gICAgfVxuXG4gICAgZ2V0IHN0YXJ0ZWQgKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fcnVubmluZyB8fCB0aGlzLl9wcmVzY3JpcHRzRXhpdENvZGUgIT09IG51bGw7XG4gICAgfVxuXG4gICAgZ2V0IGZpbmlzaGVkICgpIHtcbiAgICAgICAgcmV0dXJuICF0aGlzLl9ydW5uaW5nICYmIHRoaXMuX3ByZXNjcmlwdHNFeGl0Q29kZSAhPT0gbnVsbDtcbiAgICB9XG5cbiAgICBnZXQgY292ZXJhZ2VQZXJjZW50ICgpOiBzdHJpbmcgfCBudWxsIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2NvdmVyYWdlUGVyY2VudDtcbiAgICB9XG5cbiAgICBnZXQgZmlsZVZhcmlhYmxlc0RpciAoKSB7XG4gICAgICAgIHJldHVybiBgL3RtcC9naXRsYWItY2ktbG9jYWwtZmlsZS12YXJpYWJsZXMtJHt0aGlzLl92YXJpYWJsZXNbXCJDSV9QUk9KRUNUX1BBVEhfU0xVR1wiXX0tJHt0aGlzLmpvYklkfWA7XG4gICAgfVxuXG4gICAgYXN5bmMgc3RhcnQgKCk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICB0aGlzLl9ydW5uaW5nID0gdHJ1ZTtcblxuICAgICAgICBjb25zdCBhcmd2ID0gdGhpcy5hcmd2O1xuICAgICAgICB0aGlzLl9zdGFydFRpbWUgPSBwcm9jZXNzLmhydGltZSgpO1xuICAgICAgICB0aGlzLl92YXJpYWJsZXNbXCJDSV9KT0JfU1RBUlRFRF9BVFwiXSA9IG5ldyBEYXRlKCkudG9JU09TdHJpbmcoKS5zcGxpdChcIi5cIilbMF0gKyBcIlpcIjtcbiAgICAgICAgY29uc3Qgd3JpdGVTdHJlYW1zID0gdGhpcy53cml0ZVN0cmVhbXM7XG4gICAgICAgIHRoaXMuX2RvdGVudlZhcmlhYmxlcyA9IGF3YWl0IHRoaXMuaW5pdFByb2R1Y2VyUmVwb3J0c0RvdGVudlZhcmlhYmxlcyh3cml0ZVN0cmVhbXMsIFV0aWxzLmV4cGFuZFZhcmlhYmxlcyh0aGlzLl92YXJpYWJsZXMpKTtcbiAgICAgICAgY29uc3QgZXhwYW5kZWQgPSBVdGlscy51bnNjYXBlJCRWYXJpYWJsZXMoVXRpbHMuZXhwYW5kVmFyaWFibGVzKHsuLi50aGlzLl92YXJpYWJsZXMsIC4uLnRoaXMuX2RvdGVudlZhcmlhYmxlc30pKTtcbiAgICAgICAgY29uc3QgaW1hZ2VOYW1lID0gdGhpcy5pbWFnZU5hbWUoZXhwYW5kZWQpO1xuICAgICAgICBjb25zdCBzYWZlSm9iTmFtZSA9IHRoaXMuc2FmZUpvYk5hbWU7XG5cbiAgICAgICAgY29uc3Qgb3V0cHV0TG9nRmlsZVBhdGggPSBgJHthcmd2LmN3ZH0vJHthcmd2LnN0YXRlRGlyfS9vdXRwdXQvJHtzYWZlSm9iTmFtZX0ubG9nYDtcbiAgICAgICAgYXdhaXQgZnMuZW5zdXJlRmlsZShvdXRwdXRMb2dGaWxlUGF0aCk7XG4gICAgICAgIGF3YWl0IGZzLnRydW5jYXRlKG91dHB1dExvZ0ZpbGVQYXRoKTtcblxuICAgICAgICBpZiAoIXRoaXMuaW50ZXJhY3RpdmUpIHtcbiAgICAgICAgICAgIHdyaXRlU3RyZWFtcy5zdGRvdXQoY2hhbGtgJHt0aGlzLmZvcm1hdHRlZEpvYk5hbWV9IHttYWdlbnRhQnJpZ2h0IHN0YXJ0aW5nfSAke2ltYWdlTmFtZSA/PyBcInNoZWxsXCJ9ICh7eWVsbG93ICR7dGhpcy5zdGFnZX19KVxcbmApO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGltYWdlTmFtZSkge1xuICAgICAgICAgICAgY29uc3QgYnVpbGRWb2x1bWVOYW1lID0gdGhpcy5idWlsZFZvbHVtZU5hbWU7XG4gICAgICAgICAgICBjb25zdCB0bXBWb2x1bWVOYW1lID0gdGhpcy50bXBWb2x1bWVOYW1lO1xuICAgICAgICAgICAgY29uc3QgZmlsZVZhcmlhYmxlc0RpciA9IHRoaXMuZmlsZVZhcmlhYmxlc0RpcjtcblxuICAgICAgICAgICAgY29uc3Qgdm9sdW1lUHJvbWlzZXMgPSBbXTtcbiAgICAgICAgICAgIHZvbHVtZVByb21pc2VzLnB1c2goVXRpbHMuc3Bhd24oW3RoaXMuYXJndi5jb250YWluZXJFeGVjdXRhYmxlLCBcInZvbHVtZVwiLCBcImNyZWF0ZVwiLCBgJHtidWlsZFZvbHVtZU5hbWV9YF0sIGFyZ3YuY3dkKSk7XG4gICAgICAgICAgICB2b2x1bWVQcm9taXNlcy5wdXNoKFV0aWxzLnNwYXduKFt0aGlzLmFyZ3YuY29udGFpbmVyRXhlY3V0YWJsZSwgXCJ2b2x1bWVcIiwgXCJjcmVhdGVcIiwgYCR7dG1wVm9sdW1lTmFtZX1gXSwgYXJndi5jd2QpKTtcbiAgICAgICAgICAgIHRoaXMuX2NvbnRhaW5lclZvbHVtZU5hbWVzLnB1c2goYnVpbGRWb2x1bWVOYW1lKTtcbiAgICAgICAgICAgIHRoaXMuX2NvbnRhaW5lclZvbHVtZU5hbWVzLnB1c2godG1wVm9sdW1lTmFtZSk7XG4gICAgICAgICAgICBhd2FpdCBQcm9taXNlLmFsbCh2b2x1bWVQcm9taXNlcyk7XG5cbiAgICAgICAgICAgIGNvbnN0IHRpbWUgPSBwcm9jZXNzLmhydGltZSgpO1xuICAgICAgICAgICAgdGhpcy5yZWZyZXNoTG9uZ1J1bm5pbmdTaWxlbnRUaW1lb3V0KHdyaXRlU3RyZWFtcyk7XG5cbiAgICAgICAgICAgIGxldCBjaG93bk9wdCA9IFwiMDowXCI7XG4gICAgICAgICAgICBsZXQgY2htb2RPcHQgPSBcImErcndcIjtcbiAgICAgICAgICAgIGlmIChleHBhbmRlZFtcIkZGX0RJU0FCTEVfVU1BU0tfRk9SX0RPQ0tFUl9FWEVDVVRPUlwiXSA9PT0gXCJ0cnVlXCIpIHtcbiAgICAgICAgICAgICAgICBjb25zdCB7c3Rkb3V0fSA9IGF3YWl0IFV0aWxzLnNwYXduKFtcImRvY2tlclwiLCBcInJ1blwiLCBcIi0tcm1cIiwgXCItLWVudHJ5cG9pbnRcIiwgXCJzaFwiLCBpbWFnZU5hbWUsIFwiLWNcIiwgXCJlY2hvIFxcXCIkKGlkIC11KTokKGlkIC1nKVxcXCJcIl0pO1xuICAgICAgICAgICAgICAgIGNob3duT3B0ID0gc3Rkb3V0O1xuICAgICAgICAgICAgICAgIGlmIChjaG93bk9wdCA9PSBcIjA6MFwiKSB7XG4gICAgICAgICAgICAgICAgICAgIGNobW9kT3B0ID0gXCJnLXdcIjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCB7c3Rkb3V0OiBjb250YWluZXJJZH0gPSBhd2FpdCBVdGlscy5zcGF3bihbXG4gICAgICAgICAgICAgICAgdGhpcy5hcmd2LmNvbnRhaW5lckV4ZWN1dGFibGUsIFwiY3JlYXRlXCIsIFwiLS11c2VyPTA6MFwiLCBgLS12b2x1bWU9JHtidWlsZFZvbHVtZU5hbWV9Oi9nY2wtYnVpbGRzYCwgYC0tdm9sdW1lPSR7dG1wVm9sdW1lTmFtZX06JHt0aGlzLmZpbGVWYXJpYWJsZXNEaXJ9YCwgXCJkb2NrZXIuaW8vZmlyZWNvdy9naXRsYWItY2ktbG9jYWwtdXRpbFwiLFxuICAgICAgICAgICAgICAgIC4uLltcInNoXCIsIFwiLWNcIiwgYGNob3duICR7Y2hvd25PcHR9IC1SIC9nY2wtYnVpbGRzLyAmJiBjaG1vZCAke2NobW9kT3B0fSAtUiAvZ2NsLWJ1aWxkcy8gJiYgY2hvd24gJHtjaG93bk9wdH0gLVIgL3RtcC8gJiYgY2htb2QgJHtjaG1vZE9wdH0gLVIgL3RtcC9gXSxcbiAgICAgICAgICAgIF0sIGFyZ3YuY3dkKTtcbiAgICAgICAgICAgIHRoaXMuX2NvbnRhaW5lcnNUb0NsZWFuLnB1c2goY29udGFpbmVySWQpO1xuICAgICAgICAgICAgaWYgKGF3YWl0IGZzLnBhdGhFeGlzdHMoZmlsZVZhcmlhYmxlc0RpcikpIHtcbiAgICAgICAgICAgICAgICBhd2FpdCBVdGlscy5zcGF3bihbdGhpcy5hcmd2LmNvbnRhaW5lckV4ZWN1dGFibGUsIFwiY3BcIiwgYCR7ZmlsZVZhcmlhYmxlc0Rpcn0vLmAsIGAke2NvbnRhaW5lcklkfToke2ZpbGVWYXJpYWJsZXNEaXJ9YF0sIGFyZ3YuY3dkKTtcbiAgICAgICAgICAgICAgICB0aGlzLnJlZnJlc2hMb25nUnVubmluZ1NpbGVudFRpbWVvdXQod3JpdGVTdHJlYW1zKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGF3YWl0IFV0aWxzLnNwYXduKFt0aGlzLmFyZ3YuY29udGFpbmVyRXhlY3V0YWJsZSwgXCJjcFwiLCBgJHthcmd2LnN0YXRlRGlyfS9idWlsZHMvLmRvY2tlci8uYCwgYCR7Y29udGFpbmVySWR9Oi9nY2wtYnVpbGRzYF0sIGFyZ3YuY3dkKTtcbiAgICAgICAgICAgIGF3YWl0IFV0aWxzLnNwYXduKFt0aGlzLmFyZ3YuY29udGFpbmVyRXhlY3V0YWJsZSwgXCJzdGFydFwiLCBcIi0tYXR0YWNoXCIsIGNvbnRhaW5lcklkXSwgYXJndi5jd2QpO1xuICAgICAgICAgICAgYXdhaXQgVXRpbHMuc3Bhd24oW3RoaXMuYXJndi5jb250YWluZXJFeGVjdXRhYmxlLCBcInJtXCIsIFwiLXZmXCIsIGNvbnRhaW5lcklkXSwgYXJndi5jd2QpO1xuICAgICAgICAgICAgY29uc3QgZW5kVGltZSA9IHByb2Nlc3MuaHJ0aW1lKHRpbWUpO1xuICAgICAgICAgICAgd3JpdGVTdHJlYW1zLnN0ZG91dChjaGFsa2Ake3RoaXMuZm9ybWF0dGVkSm9iTmFtZX0ge21hZ2VudGFCcmlnaHQgY29waWVkIHRvIGRvY2tlciB2b2x1bWVzfSBpbiB7bWFnZW50YSAke3ByZXR0eUhydGltZShlbmRUaW1lKX19XFxuYCk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5zZXJ2aWNlcz8ubGVuZ3RoKSB7XG4gICAgICAgICAgICAvLyBgaG9zdGAgYW5kIGBub25lYCBuZXR3b3JrcyBkbyBub3Qgd29yayB3aXRoIHNlcnZpY2VzIGJlY2F1c2UgYWxpYXNlcyBvbmx5IHdvcmsgZm9yXG4gICAgICAgICAgICAvLyB1c2VyIGRlZmluZWQgbmV0d29ya3MuXG4gICAgICAgICAgICBmb3IgKGNvbnN0IG5ldHdvcmsgb2YgdGhpcy5hcmd2Lm5ldHdvcmspIHtcbiAgICAgICAgICAgICAgICBpZiAoW1wiaG9zdFwiLCBcIm5vbmVcIl0uaW5jbHVkZXMobmV0d29yaykpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEFzc2VydGlvbkVycm9yKHttZXNzYWdlOiBgQ2Fubm90IGFkZCBzZXJ2aWNlIG5ldHdvcmsgYWxpYXMgd2l0aCBuZXR3b3JrIG1vZGUgJyR7bmV0d29ya30nYH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgYXdhaXQgdGhpcy5jcmVhdGVEb2NrZXJOZXR3b3JrKGBnaXRsYWItY2ktbG9jYWwtJHt0aGlzLmpvYklkfWApO1xuXG4gICAgICAgICAgICBhd2FpdCBQcm9taXNlLmFsbChcbiAgICAgICAgICAgICAgICB0aGlzLnNlcnZpY2VzLm1hcChhc3luYyAoc2VydmljZSwgc2VydmljZUluZGV4KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHNlcnZpY2VOYW1lID0gc2VydmljZS5uYW1lO1xuICAgICAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLnB1bGxJbWFnZSh3cml0ZVN0cmVhbXMsIHNlcnZpY2VOYW1lKTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2VydmljZUNvbnRhaW5lcklkID0gYXdhaXQgdGhpcy5zdGFydFNlcnZpY2Uod3JpdGVTdHJlYW1zLCBVdGlscy5leHBhbmRWYXJpYWJsZXMoey4uLmV4cGFuZGVkLCAuLi5zZXJ2aWNlLnZhcmlhYmxlc30pLCBzZXJ2aWNlKTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2VydmljZUNvbnRhaW5lckxvZ0ZpbGUgPSBgJHthcmd2LmN3ZH0vJHthcmd2LnN0YXRlRGlyfS9zZXJ2aWNlcy1vdXRwdXQvJHt0aGlzLnNhZmVKb2JOYW1lfS8ke3NlcnZpY2VOYW1lfS0ke3NlcnZpY2VJbmRleH0ubG9nYDtcbiAgICAgICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5zZXJ2aWNlSGVhbHRoQ2hlY2sod3JpdGVTdHJlYW1zLCBzZXJ2aWNlLCBzZXJ2aWNlSW5kZXgsIHNlcnZpY2VDb250YWluZXJMb2dGaWxlKTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3Qge3N0ZG91dCwgc3RkZXJyfSA9IGF3YWl0IFV0aWxzLnNwYXduKFt0aGlzLmFyZ3YuY29udGFpbmVyRXhlY3V0YWJsZSwgXCJsb2dzXCIsIHNlcnZpY2VDb250YWluZXJJZF0pO1xuICAgICAgICAgICAgICAgICAgICBhd2FpdCBmcy5lbnN1cmVGaWxlKHNlcnZpY2VDb250YWluZXJMb2dGaWxlKTtcbiAgICAgICAgICAgICAgICAgICAgYXdhaXQgZnMucHJvbWlzZXMud3JpdGVGaWxlKHNlcnZpY2VDb250YWluZXJMb2dGaWxlLCBgIyMjIHN0ZG91dCAjIyNcXG4ke3N0ZG91dH1cXG4jIyMgc3RkZXJyICMjI1xcbiR7c3RkZXJyfVxcbmApO1xuICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICApO1xuICAgICAgICB9XG5cbiAgICAgICAgYXdhaXQgdGhpcy5leGVjUHJlU2NyaXB0cyhleHBhbmRlZCk7XG4gICAgICAgIGlmICh0aGlzLl9wcmVzY3JpcHRzRXhpdENvZGUgPT0gbnVsbCkgdGhyb3cgRXJyb3IoXCJ0aGlzLl9wcmVzY3JpcHRzRXhpdENvZGUgbXVzdCBiZSBkZWZpbmVkIVwiKTtcblxuICAgICAgICBhd2FpdCB0aGlzLmV4ZWNBZnRlclNjcmlwdHMoZXhwYW5kZWQpO1xuXG4gICAgICAgIHRoaXMuX3J1bm5pbmcgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5fZW5kVGltZSA9IHRoaXMuX2VuZFRpbWUgPz8gcHJvY2Vzcy5ocnRpbWUodGhpcy5fc3RhcnRUaW1lKTtcbiAgICAgICAgdGhpcy5wcmludEZpbmlzaGVkU3RyaW5nKCk7XG5cbiAgICAgICAgYXdhaXQgdGhpcy5jb3B5Q2FjaGVPdXQodGhpcy53cml0ZVN0cmVhbXMsIGV4cGFuZGVkKTtcbiAgICAgICAgYXdhaXQgdGhpcy5jb3B5QXJ0aWZhY3RzT3V0KHRoaXMud3JpdGVTdHJlYW1zLCBleHBhbmRlZCk7XG5cbiAgICAgICAgaWYgKHRoaXMuam9iRGF0YVtcImNvdmVyYWdlXCJdKSB7XG4gICAgICAgICAgICB0aGlzLl9jb3ZlcmFnZVBlcmNlbnQgPSBhd2FpdCBVdGlscy5nZXRDb3ZlcmFnZVBlcmNlbnQoYXJndi5jd2QsIGFyZ3Yuc3RhdGVEaXIsIHRoaXMuam9iRGF0YVtcImNvdmVyYWdlXCJdLCBzYWZlSm9iTmFtZSk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmNsZWFudXBSZXNvdXJjZXMoKTtcbiAgICB9XG5cbiAgICBhc3luYyBjbGVhbnVwUmVzb3VyY2VzICgpIHtcbiAgICAgICAgY2xlYXJUaW1lb3V0KHRoaXMuX2xvbmdSdW5uaW5nU2lsZW50VGltZW91dCk7XG5cbiAgICAgICAgaWYgKCF0aGlzLmFyZ3YuY2xlYW51cCkgcmV0dXJuO1xuXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBhd2FpdCBVdGlscy5zcGF3bihbdGhpcy5hcmd2LmNvbnRhaW5lckV4ZWN1dGFibGUsIFwicm1cIiwgXCItdmZcIiwgLi4udGhpcy5fY29udGFpbmVyc1RvQ2xlYW5dKTtcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgYXNzZXJ0KGUgaW5zdGFuY2VvZiBFcnJvciwgXCJlIGlzIG5vdCBpbnN0YW5jZW9mIEVycm9yXCIpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMuX3NlcnZpY2VOZXR3b3JrSWQpIHtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgYXdhaXQgVXRpbHMuc3Bhd24oW3RoaXMuYXJndi5jb250YWluZXJFeGVjdXRhYmxlLCBcIm5ldHdvcmtcIiwgXCJybVwiLCBgJHt0aGlzLl9zZXJ2aWNlTmV0d29ya0lkfWBdKTtcbiAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICBhc3NlcnQoZSBpbnN0YW5jZW9mIEVycm9yLCBcImUgaXMgbm90IGluc3RhbmNlb2YgRXJyb3JcIik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICB0cnkge1xuICAgICAgICAgICAgYXdhaXQgVXRpbHMuc3Bhd24oW3RoaXMuYXJndi5jb250YWluZXJFeGVjdXRhYmxlLCBcInZvbHVtZVwiLCBcInJtXCIsIC4uLnRoaXMuX2NvbnRhaW5lclZvbHVtZU5hbWVzXSk7XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIGFzc2VydChlIGluc3RhbmNlb2YgRXJyb3IsIFwiZSBpcyBub3QgaW5zdGFuY2VvZiBFcnJvclwiKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHJtUHJvbWlzZXMgPSBbXTtcbiAgICAgICAgZm9yIChjb25zdCBmaWxlIG9mIHRoaXMuX2ZpbGVzVG9SbSkge1xuICAgICAgICAgICAgcm1Qcm9taXNlcy5wdXNoKGZzLnJtKGZpbGUsIHtyZWN1cnNpdmU6IHRydWUsIGZvcmNlOiB0cnVlfSkpO1xuICAgICAgICB9XG4gICAgICAgIGF3YWl0IFByb21pc2UuYWxsKHJtUHJvbWlzZXMpO1xuXG4gICAgICAgIGNvbnN0IGZpbGVWYXJpYWJsZXNEaXIgPSB0aGlzLmZpbGVWYXJpYWJsZXNEaXI7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBhd2FpdCBmcy5ybShmaWxlVmFyaWFibGVzRGlyLCB7cmVjdXJzaXZlOiB0cnVlLCBmb3JjZTogdHJ1ZX0pO1xuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICBhc3NlcnQoZSBpbnN0YW5jZW9mIEVycm9yLCBcImUgaXMgbm90IGluc3RhbmNlb2YgRXJyb3JcIik7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIGdlbmVyYXRlSW5qZWN0U1NIQWdlbnRPcHRpb25zICgpIHtcbiAgICAgICAgaWYgKCF0aGlzLmluamVjdFNTSEFnZW50KSB7XG4gICAgICAgICAgICByZXR1cm4gXCJcIjtcbiAgICAgICAgfVxuICAgICAgICBpZiAocHJvY2Vzcy5wbGF0Zm9ybSA9PT0gXCJkYXJ3aW5cIiB8fCAvXmRhcndpbi8uZXhlYyhwcm9jZXNzLmVudi5PU1RZUEUgPz8gXCJcIikpIHtcbiAgICAgICAgICAgIHJldHVybiBcIi0tZW52IFNTSF9BVVRIX1NPQ0s9L3J1bi9ob3N0LXNlcnZpY2VzL3NzaC1hdXRoLnNvY2sgLXYgL3J1bi9ob3N0LXNlcnZpY2VzL3NzaC1hdXRoLnNvY2s6L3J1bi9ob3N0LXNlcnZpY2VzL3NzaC1hdXRoLnNvY2tcIjtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gYC0tZW52IFNTSF9BVVRIX1NPQ0s9JHtwcm9jZXNzLmVudi5TU0hfQVVUSF9TT0NLfSAtdiAke3Byb2Nlc3MuZW52LlNTSF9BVVRIX1NPQ0t9OiR7cHJvY2Vzcy5lbnYuU1NIX0FVVEhfU09DS31gO1xuICAgIH1cblxuICAgIHByaXZhdGUgZ2VuZXJhdGVTY3JpcHRDb21tYW5kcyAoc2NyaXB0czogc3RyaW5nW10pIHtcbiAgICAgICAgbGV0IGNtZCA9IFwiXCI7XG4gICAgICAgIHNjcmlwdHMuZm9yRWFjaCgoc2NyaXB0KSA9PiB7XG4gICAgICAgICAgICAvLyBQcmludCBjb21tYW5kIGVjaG8nZWQgaW4gY29sb3JcbiAgICAgICAgICAgIGNvbnN0IHNwbGl0ID0gc2NyaXB0LnNwbGl0KC9cXHI/XFxuLyk7XG4gICAgICAgICAgICBjb25zdCBtdWx0aWxpbmVUZXh0ID0gc3BsaXQubGVuZ3RoID4gMSA/IFwiICMgY29sbGFwc2VkIG11bHRpLWxpbmUgY29tbWFuZFwiIDogXCJcIjtcbiAgICAgICAgICAgIGNvbnN0IHRleHQgPSBzcGxpdFswXT8ucmVwbGFjZSgvXFxcXC9nLCBcIlxcXFxcXFxcXCIpLnJlcGxhY2UoL1wiL2csIFwiXFxcXFxcXCJcIikucmVwbGFjZSgvWyRdL2csIFwiXFxcXCRcIik7XG4gICAgICAgICAgICBjbWQgKz0gY2hhbGtgZWNobyBcIntncmVlbiAkICR7dGV4dH0ke211bHRpbGluZVRleHR9fVwiXFxuYDtcblxuICAgICAgICAgICAgLy8gRXhlY3V0ZSBhY3R1YWwgc2NyaXB0XG4gICAgICAgICAgICBjbWQgKz0gYCR7c2NyaXB0fVxcbmA7XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gY21kO1xuICAgIH1cblxuICAgIHByaXZhdGUgYXN5bmMgbW91bnRDYWNoZUNtZCAod3JpdGVTdHJlYW1zOiBXcml0ZVN0cmVhbXMsIGV4cGFuZGVkOiB7W2tleTogc3RyaW5nXTogc3RyaW5nfSkge1xuICAgICAgICBpZiAodGhpcy5pbWFnZU5hbWUoZXhwYW5kZWQpICYmICF0aGlzLmFyZ3YubW91bnRDYWNoZSkgcmV0dXJuIFtdO1xuXG4gICAgICAgIGNvbnN0IGNtZDogc3RyaW5nW10gPSBbXTtcbiAgICAgICAgZm9yIChjb25zdCBjIG9mIHRoaXMuY2FjaGUpIHtcbiAgICAgICAgICAgIGNvbnN0IHVuaXF1ZUNhY2hlTmFtZSA9IGF3YWl0IHRoaXMuZ2V0VW5pcXVlQ2FjaGVOYW1lKHRoaXMuYXJndi5jd2QsIGV4cGFuZGVkLCBjLmtleSk7XG4gICAgICAgICAgICBjLnBhdGhzLmZvckVhY2goKHApID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBwYXRoID0gVXRpbHMuZXhwYW5kVGV4dChwLCBleHBhbmRlZCk7XG4gICAgICAgICAgICAgICAgd3JpdGVTdHJlYW1zLnN0ZG91dChjaGFsa2Ake3RoaXMuZm9ybWF0dGVkSm9iTmFtZX0ge21hZ2VudGFCcmlnaHQgbW91bnRpbmcgY2FjaGV9IGZvciBwYXRoICR7cGF0aH1cXG5gKTtcbiAgICAgICAgICAgICAgICBjb25zdCBjYWNoZU1vdW50ID0gVXRpbHMuc2FmZURvY2tlclN0cmluZyhgZ2NsLSR7ZXhwYW5kZWQuQ0lfUFJPSkVDVF9QQVRIX1NMVUd9LSR7dW5pcXVlQ2FjaGVOYW1lfWApO1xuICAgICAgICAgICAgICAgIGNtZC5wdXNoKFwiLXZcIiwgYCR7Y2FjaGVNb3VudH06L2djbC1idWlsZHMvJHtwYXRofWApO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGNtZDtcbiAgICB9XG5cbiAgICBwcml2YXRlIGFzeW5jIGV4ZWNQcmVTY3JpcHRzIChleHBhbmRlZDoge1trZXk6IHN0cmluZ106IHN0cmluZ30pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgY29uc3QgcHJlc2NyaXB0cyA9IHRoaXMuYmVmb3JlU2NyaXB0cy5jb25jYXQodGhpcy5zY3JpcHRzKTtcbiAgICAgICAgZXhwYW5kZWRbXCJDSV9KT0JfU1RBVFVTXCJdID0gXCJydW5uaW5nXCI7XG5cbiAgICAgICAgdGhpcy5fcHJlc2NyaXB0c0V4aXRDb2RlID0gYXdhaXQgdGhpcy5leGVjU2NyaXB0cyhwcmVzY3JpcHRzLCBleHBhbmRlZCwgXCJcIik7XG4gICAgICAgIGV4cGFuZGVkW1wiQ0lfSk9CX1NUQVRVU1wiXSA9IHRoaXMuX3ByZXNjcmlwdHNFeGl0Q29kZSA9PT0gMCA/IFwic3VjY2Vzc1wiIDogXCJmYWlsZWRcIjtcblxuICAgICAgICB0aGlzLnByaW50RXhpdGVkU3RyaW5nKHRoaXMuX3ByZXNjcmlwdHNFeGl0Q29kZSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBhc3luYyBleGVjQWZ0ZXJTY3JpcHRzIChleHBhbmRlZDoge1trZXk6IHN0cmluZ106IHN0cmluZ30pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgY29uc3QgbWVzc2FnZSA9IFwiUnVubmluZyBhZnRlciBzY3JpcHQuLi5cIjtcbiAgICAgICAgdGhpcy5fYWZ0ZXJTY3JpcHRzRXhpdENvZGUgPSBhd2FpdCB0aGlzLmV4ZWNTY3JpcHRzKHRoaXMuYWZ0ZXJTY3JpcHRzLCBleHBhbmRlZCwgbWVzc2FnZSk7XG5cbiAgICAgICAgdGhpcy5wcmludEFmdGVyU2NyaXB0RXhpdGVkU3RyaW5nKHRoaXMuX2FmdGVyU2NyaXB0c0V4aXRDb2RlKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGFzeW5jIGV4ZWNTY3JpcHRzIChzY3JpcHRzOiBzdHJpbmdbXSwgZXhwYW5kZWQ6IHtba2V5OiBzdHJpbmddOiBzdHJpbmd9LCBtZXNzYWdlOiBzdHJpbmcpOiBQcm9taXNlPG51bWJlcj4ge1xuICAgICAgICBjb25zdCBjd2QgPSB0aGlzLmFyZ3YuY3dkO1xuICAgICAgICBjb25zdCBzdGF0ZURpciA9IHRoaXMuYXJndi5zdGF0ZURpcjtcbiAgICAgICAgY29uc3Qgc2FmZUpvYk5hbWUgPSB0aGlzLnNhZmVKb2JOYW1lO1xuICAgICAgICBjb25zdCBvdXRwdXRGaWxlc1BhdGggPSBgJHtjd2R9LyR7c3RhdGVEaXJ9L291dHB1dC8ke3NhZmVKb2JOYW1lfS5sb2dgO1xuICAgICAgICBjb25zdCBidWlsZFZvbHVtZU5hbWUgPSB0aGlzLmJ1aWxkVm9sdW1lTmFtZTtcbiAgICAgICAgY29uc3QgdG1wVm9sdW1lTmFtZSA9IHRoaXMudG1wVm9sdW1lTmFtZTtcbiAgICAgICAgY29uc3QgaW1hZ2VOYW1lID0gdGhpcy5pbWFnZU5hbWUoZXhwYW5kZWQpO1xuICAgICAgICBjb25zdCB3cml0ZVN0cmVhbXMgPSB0aGlzLndyaXRlU3RyZWFtcztcblxuICAgICAgICBpZiAoc2NyaXB0cy5sZW5ndGggPT09IDAgfHwgc2NyaXB0c1swXSA9PSBudWxsKSByZXR1cm4gMDtcblxuICAgICAgICBpZiAobWVzc2FnZS5sZW5ndGggPiAwKSB3cml0ZVN0cmVhbXMuc3Rkb3V0KGNoYWxrYCR7dGhpcy5mb3JtYXR0ZWRKb2JOYW1lfSB7bWFnZW50YUJyaWdodCAke21lc3NhZ2V9fVxcbmApO1xuXG4gICAgICAgIC8vIENvcHkgZ2l0IHRyYWNrZWQgZmlsZXMgdG8gYnVpbGQgZm9sZGVyIGlmIHNoZWxsIGlzb2xhdGlvbiBlbmFibGVkLlxuICAgICAgICBpZiAoIWltYWdlTmFtZSAmJiB0aGlzLmFyZ3Yuc2hlbGxJc29sYXRpb24pIHtcbiAgICAgICAgICAgIGF3YWl0IFV0aWxzLnJzeW5jVHJhY2tlZEZpbGVzKGN3ZCwgc3RhdGVEaXIsIGAke3NhZmVKb2JOYW1lfWApO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMuaW50ZXJhY3RpdmUpIHtcbiAgICAgICAgICAgIGxldCBpQ21kID0gXCJzZXQgLWVvIHBpcGVmYWlsXFxuXCI7XG4gICAgICAgICAgICBpQ21kICs9IHRoaXMuZ2VuZXJhdGVTY3JpcHRDb21tYW5kcyhzY3JpcHRzKTtcblxuICAgICAgICAgICAgY29uc3QgaW50ZXJhY3RpdmVDcCA9IGV4ZWNhKGlDbWQsIHtcbiAgICAgICAgICAgICAgICBjd2QsXG4gICAgICAgICAgICAgICAgc2hlbGw6IFwiYmFzaFwiLFxuICAgICAgICAgICAgICAgIHN0ZGlvOiBbXCJpbmhlcml0XCIsIFwiaW5oZXJpdFwiLCBcImluaGVyaXRcIl0sXG4gICAgICAgICAgICAgICAgZW52OiB7Li4uZXhwYW5kZWQsIC4uLnByb2Nlc3MuZW52fSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlPG51bWJlcj4oKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICAgICAgICAgIHZvaWQgaW50ZXJhY3RpdmVDcC5vbihcImV4aXRcIiwgKGNvZGUpID0+IHJlc29sdmUoY29kZSA/PyAwKSk7XG4gICAgICAgICAgICAgICAgdm9pZCBpbnRlcmFjdGl2ZUNwLm9uKFwiZXJyb3JcIiwgKGVycikgPT4gcmVqZWN0KGVycikpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLnJlZnJlc2hMb25nUnVubmluZ1NpbGVudFRpbWVvdXQod3JpdGVTdHJlYW1zKTtcblxuICAgICAgICBpZiAoaW1hZ2VOYW1lKSB7XG4gICAgICAgICAgICBhd2FpdCB0aGlzLnB1bGxJbWFnZSh3cml0ZVN0cmVhbXMsIGltYWdlTmFtZSk7XG5cbiAgICAgICAgICAgIGxldCBkb2NrZXJDbWQgPSBgJHt0aGlzLmFyZ3YuY29udGFpbmVyRXhlY3V0YWJsZX0gY3JlYXRlIC0taW50ZXJhY3RpdmUgJHt0aGlzLmdlbmVyYXRlSW5qZWN0U1NIQWdlbnRPcHRpb25zKCl9IGA7XG4gICAgICAgICAgICBpZiAodGhpcy5hcmd2LnByaXZpbGVnZWQpIHtcbiAgICAgICAgICAgICAgICBkb2NrZXJDbWQgKz0gXCItLXByaXZpbGVnZWQgXCI7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmICh0aGlzLmFyZ3YudWxpbWl0ICE9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgZG9ja2VyQ21kICs9IGAtLXVsaW1pdCBub2ZpbGU9JHt0aGlzLmFyZ3YudWxpbWl0fSBgO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoZXhwYW5kZWRbXCJGRl9ESVNBQkxFX1VNQVNLX0ZPUl9ET0NLRVJfRVhFQ1VUT1JcIl0gPT09IFwiZmFsc2VcIikge1xuICAgICAgICAgICAgICAgIGRvY2tlckNtZCArPSBcIi0tdXNlciAwOjAgXCI7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmICh0aGlzLmFyZ3YuY29udGFpbmVyTWFjQWRkcmVzcykge1xuICAgICAgICAgICAgICAgIGRvY2tlckNtZCArPSBgLS1tYWMtYWRkcmVzcyBcIiR7dGhpcy5hcmd2LmNvbnRhaW5lck1hY0FkZHJlc3N9XCIgYDtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgaW1hZ2VVc2VyID0gdGhpcy5pbWFnZVVzZXIoZXhwYW5kZWQpO1xuICAgICAgICAgICAgaWYgKGltYWdlVXNlcikge1xuICAgICAgICAgICAgICAgIGRvY2tlckNtZCArPSBgLS11c2VyICR7aW1hZ2VVc2VyfSBgO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAodGhpcy5hcmd2LmNvbnRhaW5lckVtdWxhdGUpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBydW5uZXJOYW1lOiBzdHJpbmcgPSB0aGlzLmFyZ3YuY29udGFpbmVyRW11bGF0ZTtcblxuICAgICAgICAgICAgICAgIGlmICghR2l0bGFiUnVubmVyUHJlc2V0VmFsdWVzLmluY2x1ZGVzKHJ1bm5lck5hbWUpKSB7XG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIkludmFsaWQgZ2l0bGFiIHJ1bm5lciB0byBlbXVsYXRlLlwiKTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBjb25zdCBtZW1vcnlDb25maWcgPSBHaXRsYWJSdW5uZXJNZW1vcnlQcmVzZXRWYWx1ZVtydW5uZXJOYW1lXTtcbiAgICAgICAgICAgICAgICBjb25zdCBjcHVDb25maWcgPSBHaXRsYWJSdW5uZXJDUFVzUHJlc2V0VmFsdWVbcnVubmVyTmFtZV07XG5cbiAgICAgICAgICAgICAgICBkb2NrZXJDbWQgKz0gYC0tbWVtb3J5PSR7bWVtb3J5Q29uZmlnfW0gYDtcbiAgICAgICAgICAgICAgICBkb2NrZXJDbWQgKz0gYC0ta2VybmVsLW1lbW9yeT0ke21lbW9yeUNvbmZpZ31tIGA7XG4gICAgICAgICAgICAgICAgZG9ja2VyQ21kICs9IGAtLWNwdXM9JHtjcHVDb25maWd9IGA7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIGhvc3QgYW5kIG5vbmUgbmV0d29ya3MgaGF2ZSB0byBiZSBzcGVjaWZpZWQgdXNpbmcgLS1uZXR3b3JrLCBzaW5jZSB0aGV5IGNhbm5vdCBiZSB1c2VkIHdpdGhcbiAgICAgICAgICAgIC8vIGBkb2NrZXIgbmV0d29yayBjb25uZWN0YC5cbiAgICAgICAgICAgIGZvciAoY29uc3QgbmV0d29yayBvZiB0aGlzLmFyZ3YubmV0d29yaykge1xuICAgICAgICAgICAgICAgIGlmIChbXCJob3N0XCIsIFwibm9uZVwiXS5pbmNsdWRlcyhuZXR3b3JrKSkge1xuICAgICAgICAgICAgICAgICAgICBkb2NrZXJDbWQgKz0gYC0tbmV0d29yayAke25ldHdvcmt9IGA7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gVGhlIGRlZmF1bHQgcG9kbWFuIG5ldHdvcmsgbW9kZSBpcyBub3QgYGJyaWRnZWAsIHdoaWNoIG1lYW5zIGEgYHBvZG1hbiBuZXR3b3JrIGNvbm5lY3RgIGNhbGwgd2lsbCBmYWlsXG4gICAgICAgICAgICAvLyB3aGVuIGNvbm5lY3RpbmcgdXNlciBkZWZpbmVkIG5ldHdvcmtzLiBUaGUgd29ya2Fyb3VuZCBpcyB0byB1c2UgYSB1c2VyIGRlZmluZWQgbmV0d29yayBvbiBjb250YWluZXJcbiAgICAgICAgICAgIC8vIGNyZWF0aW9uLlxuICAgICAgICAgICAgLy9cbiAgICAgICAgICAgIC8vIFNlZSBodHRwczovL2dpdGh1Yi5jb20vY29udGFpbmVycy9wb2RtYW4vaXNzdWVzLzE5NTc3XG4gICAgICAgICAgICAvL1xuICAgICAgICAgICAgLy8gVGhpcyBzaG91bGQgbm90IGNsYXNoIHdpdGggdGhlIGBob3N0YCBhbmQgYG5vbmVgIG5ldHdvcmtzIGFib3ZlLCBzaW5jZSBzZXJ2aWNlIGNyZWF0aW9uIHNob3VsZCBoYXZlXG4gICAgICAgICAgICAvLyBmYWlsZWQgd2hlbiB1c2luZyBgaG9zdGAgb3IgYG5vbmVgIG5ldHdvcmtzLlxuICAgICAgICAgICAgaWYgKHRoaXMuX3NlcnZpY2VOZXR3b3JrSWQpIHtcbiAgICAgICAgICAgICAgICAvLyBgYnVpbGRgIGFsaWFzOiBodHRwczovL2dpdGxhYi5jb20vZ2l0bGFiLW9yZy9naXRsYWItcnVubmVyLy0vaXNzdWVzLzI3MDYwXG4gICAgICAgICAgICAgICAgZG9ja2VyQ21kICs9IGAtLW5ldHdvcmsgJHt0aGlzLl9zZXJ2aWNlTmV0d29ya0lkfSAtLW5ldHdvcmstYWxpYXMgYnVpbGQgYDtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgZG9ja2VyQ21kICs9IGAtLXZvbHVtZSAke2J1aWxkVm9sdW1lTmFtZX06L2djbC1idWlsZHMgYDtcbiAgICAgICAgICAgIGRvY2tlckNtZCArPSBgLS12b2x1bWUgJHt0bXBWb2x1bWVOYW1lfToke3RoaXMuZmlsZVZhcmlhYmxlc0Rpcn0gYDtcbiAgICAgICAgICAgIGRvY2tlckNtZCArPSBcIi0td29ya2RpciAvZ2NsLWJ1aWxkcyBcIjtcblxuICAgICAgICAgICAgZm9yIChjb25zdCB2b2x1bWUgb2YgdGhpcy5hcmd2LnZvbHVtZSkge1xuICAgICAgICAgICAgICAgIGRvY2tlckNtZCArPSBgLS12b2x1bWUgJHt2b2x1bWV9IGA7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGZvciAoY29uc3QgZXh0cmFIb3N0IG9mIHRoaXMuYXJndi5leHRyYUhvc3QpIHtcbiAgICAgICAgICAgICAgICBkb2NrZXJDbWQgKz0gYC0tYWRkLWhvc3Q9JHtleHRyYUhvc3R9IGA7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGZvciAoY29uc3QgW2tleSwgdmFsXSBvZiBPYmplY3QuZW50cmllcyhleHBhbmRlZCkpIHtcbiAgICAgICAgICAgICAgICAvLyBSZXBsYWNpbmcgYCdgIHdpdGggYCdcXCcnYCB0byBjb3JyZWN0bHkgaGFuZGxlIHNpbmdsZSBxdW90ZXMoaWYgYHZhbGAgY29udGFpbnMgYCdgKSBpbiBzaGVsbCBjb21tYW5kc1xuICAgICAgICAgICAgICAgIGRvY2tlckNtZCArPSBgICAtZSAnJHtrZXl9PSR7dmFsLnJlcGxhY2UoLycvZywgXCInXFxcXCcnXCIpfScgXFxcXFxcbmA7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmICh0aGlzLmltYWdlRW50cnlwb2ludCkge1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLmltYWdlRW50cnlwb2ludFswXSA9PSBcIlwiKSB7XG4gICAgICAgICAgICAgICAgICAgIGRvY2tlckNtZCArPSBcIi0tZW50cnlwb2ludCAnJyBcIjtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBkb2NrZXJDbWQgKz0gYC0tZW50cnlwb2ludCAke3RoaXMuaW1hZ2VFbnRyeXBvaW50WzBdfSBgO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgZG9ja2VyQ21kICs9IGAkeyhhd2FpdCB0aGlzLm1vdW50Q2FjaGVDbWQod3JpdGVTdHJlYW1zLCBleHBhbmRlZCkpLmpvaW4oXCIgXCIpfSBgO1xuICAgICAgICAgICAgZG9ja2VyQ21kICs9IGAke2ltYWdlTmFtZX0gYDtcblxuICAgICAgICAgICAgaWYgKHRoaXMuaW1hZ2VFbnRyeXBvaW50Py5sZW5ndGggPz8gMCA+IDEpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmltYWdlRW50cnlwb2ludD8uc2xpY2UoMSkuZm9yRWFjaCgoZSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBkb2NrZXJDbWQgKz0gYFwiJHtlfVwiIGA7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGRvY2tlckNtZCArPSBcInNoIC1jIFxcXCJcXG5cIjtcbiAgICAgICAgICAgIGRvY2tlckNtZCArPSBcImlmIFsgLXggL3Vzci9sb2NhbC9iaW4vYmFzaCBdOyB0aGVuXFxuXCI7XG4gICAgICAgICAgICBkb2NrZXJDbWQgKz0gXCJcXHRleGVjIC91c3IvbG9jYWwvYmluL2Jhc2ggXFxuXCI7XG4gICAgICAgICAgICBkb2NrZXJDbWQgKz0gXCJlbGlmIFsgLXggL3Vzci9iaW4vYmFzaCBdOyB0aGVuXFxuXCI7XG4gICAgICAgICAgICBkb2NrZXJDbWQgKz0gXCJcXHRleGVjIC91c3IvYmluL2Jhc2ggXFxuXCI7XG4gICAgICAgICAgICBkb2NrZXJDbWQgKz0gXCJlbGlmIFsgLXggL2Jpbi9iYXNoIF07IHRoZW5cXG5cIjtcbiAgICAgICAgICAgIGRvY2tlckNtZCArPSBcIlxcdGV4ZWMgL2Jpbi9iYXNoIFxcblwiO1xuICAgICAgICAgICAgZG9ja2VyQ21kICs9IFwiZWxpZiBbIC14IC91c3IvbG9jYWwvYmluL3NoIF07IHRoZW5cXG5cIjtcbiAgICAgICAgICAgIGRvY2tlckNtZCArPSBcIlxcdGV4ZWMgL3Vzci9sb2NhbC9iaW4vc2ggXFxuXCI7XG4gICAgICAgICAgICBkb2NrZXJDbWQgKz0gXCJlbGlmIFsgLXggL3Vzci9iaW4vc2ggXTsgdGhlblxcblwiO1xuICAgICAgICAgICAgZG9ja2VyQ21kICs9IFwiXFx0ZXhlYyAvdXNyL2Jpbi9zaCBcXG5cIjtcbiAgICAgICAgICAgIGRvY2tlckNtZCArPSBcImVsaWYgWyAteCAvYmluL3NoIF07IHRoZW5cXG5cIjtcbiAgICAgICAgICAgIGRvY2tlckNtZCArPSBcIlxcdGV4ZWMgL2Jpbi9zaCBcXG5cIjtcbiAgICAgICAgICAgIGRvY2tlckNtZCArPSBcImVsaWYgWyAteCAvYnVzeWJveC9zaCBdOyB0aGVuXFxuXCI7XG4gICAgICAgICAgICBkb2NrZXJDbWQgKz0gXCJcXHRleGVjIC9idXN5Ym94L3NoIFxcblwiO1xuICAgICAgICAgICAgZG9ja2VyQ21kICs9IFwiZWxzZVxcblwiO1xuICAgICAgICAgICAgZG9ja2VyQ21kICs9IFwiXFx0ZWNobyBzaGVsbCBub3QgZm91bmRcXG5cIjtcbiAgICAgICAgICAgIGRvY2tlckNtZCArPSBcIlxcdGV4aXQgMVxcblwiO1xuICAgICAgICAgICAgZG9ja2VyQ21kICs9IFwiZmlcXG5cXFwiXCI7XG5cbiAgICAgICAgICAgIGNvbnN0IHtzdGRvdXQ6IGNvbnRhaW5lcklkfSA9IGF3YWl0IFV0aWxzLmJhc2goZG9ja2VyQ21kLCBjd2QpO1xuXG4gICAgICAgICAgICBmb3IgKGNvbnN0IG5ldHdvcmsgb2YgdGhpcy5hcmd2Lm5ldHdvcmspIHtcbiAgICAgICAgICAgICAgICAvLyBTcGVjaWFsIG5ldHdvcmsgbmFtZXMgdGhhdCBkbyBub3Qgd29yayB3aXRoIGBkb2NrZXIgbmV0d29yayBjb25uZWN0YFxuICAgICAgICAgICAgICAgIGlmIChbXCJob3N0XCIsIFwibm9uZVwiXS5pbmNsdWRlcyhuZXR3b3JrKSkge1xuICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgYXdhaXQgVXRpbHMuc3Bhd24oW3RoaXMuYXJndi5jb250YWluZXJFeGVjdXRhYmxlLCBcIm5ldHdvcmtcIiwgXCJjb25uZWN0XCIsIG5ldHdvcmssIGAke2NvbnRhaW5lcklkfWBdKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdGhpcy5fY29udGFpbmVySWQgPSBjb250YWluZXJJZDtcbiAgICAgICAgICAgIHRoaXMuX2NvbnRhaW5lcnNUb0NsZWFuLnB1c2godGhpcy5fY29udGFpbmVySWQpO1xuICAgICAgICB9XG5cbiAgICAgICAgYXdhaXQgdGhpcy5jb3B5Q2FjaGVJbih3cml0ZVN0cmVhbXMsIGV4cGFuZGVkKTtcbiAgICAgICAgYXdhaXQgdGhpcy5jb3B5QXJ0aWZhY3RzSW4od3JpdGVTdHJlYW1zKTtcblxuICAgICAgICBsZXQgY21kID0gXCJzZXQgLWVvIHBpcGVmYWlsXFxuXCI7XG4gICAgICAgIGNtZCArPSBcImV4ZWMgMDwgL2Rldi9udWxsXFxuXCI7XG5cbiAgICAgICAgaWYgKCFpbWFnZU5hbWUgJiYgdGhpcy5hcmd2LnNoZWxsSXNvbGF0aW9uKSB7XG4gICAgICAgICAgICBjbWQgKz0gYGNkICR7c3RhdGVEaXJ9L2J1aWxkcy8ke3NhZmVKb2JOYW1lfS9cXG5gO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGltYWdlTmFtZSkge1xuICAgICAgICAgICAgY21kICs9IFwiY2QgL2djbC1idWlsZHMgXFxuXCI7XG4gICAgICAgIH1cbiAgICAgICAgY21kICs9IHRoaXMuZ2VuZXJhdGVTY3JpcHRDb21tYW5kcyhzY3JpcHRzKTtcblxuICAgICAgICBjbWQgKz0gXCJleGl0IDBcXG5cIjtcblxuICAgICAgICBjb25zdCBqb2JTY3JpcHRGaWxlID0gYCR7Y3dkfS8ke3N0YXRlRGlyfS9zY3JpcHRzLyR7c2FmZUpvYk5hbWV9XyR7dGhpcy5qb2JJZH1gO1xuICAgICAgICBhd2FpdCBmcy5vdXRwdXRGaWxlKGpvYlNjcmlwdEZpbGUsIGNtZCwgXCJ1dGYtOFwiKTtcbiAgICAgICAgYXdhaXQgZnMuY2htb2Qoam9iU2NyaXB0RmlsZSwgXCIwNzU1XCIpO1xuICAgICAgICB0aGlzLl9maWxlc1RvUm0ucHVzaChqb2JTY3JpcHRGaWxlKTtcblxuICAgICAgICBpZiAoaW1hZ2VOYW1lKSB7XG4gICAgICAgICAgICBhd2FpdCBVdGlscy5zcGF3bihbdGhpcy5hcmd2LmNvbnRhaW5lckV4ZWN1dGFibGUsIFwiY3BcIiwgYCR7c3RhdGVEaXJ9L3NjcmlwdHMvJHtzYWZlSm9iTmFtZX1fJHt0aGlzLmpvYklkfWAsIGAke3RoaXMuX2NvbnRhaW5lcklkfTovZ2NsLWNtZGBdLCBjd2QpO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgY3AgPSBleGVjYSh0aGlzLl9jb250YWluZXJJZCA/IGAke3RoaXMuYXJndi5jb250YWluZXJFeGVjdXRhYmxlfSBzdGFydCAtLWF0dGFjaCAtaSAke3RoaXMuX2NvbnRhaW5lcklkfWAgOiBcImJhc2hcIiwge1xuICAgICAgICAgICAgY3dkLFxuICAgICAgICAgICAgc2hlbGw6IFwiYmFzaFwiLFxuICAgICAgICAgICAgZW52OiBpbWFnZU5hbWUgPyBwcm9jZXNzLmVudiA6IGV4cGFuZGVkLFxuICAgICAgICB9KTtcblxuICAgICAgICBjb25zdCBvdXRGdW5jID0gKGxpbmU6IHN0cmluZywgc3RyZWFtOiAodHh0OiBzdHJpbmcpID0+IHZvaWQsIGNvbG9yaXplOiAoc3RyOiBzdHJpbmcpID0+IHN0cmluZykgPT4ge1xuICAgICAgICAgICAgdGhpcy5yZWZyZXNoTG9uZ1J1bm5pbmdTaWxlbnRUaW1lb3V0KHdyaXRlU3RyZWFtcyk7XG4gICAgICAgICAgICBzdHJlYW0oYCR7dGhpcy5mb3JtYXR0ZWRKb2JOYW1lfSBgKTtcbiAgICAgICAgICAgIGlmICghbGluZS5zdGFydHNXaXRoKFwiXFx1MDAxYlszMm0kXCIpKSB7XG4gICAgICAgICAgICAgICAgc3RyZWFtKGAke2NvbG9yaXplKFwiPlwiKX0gYCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBzdHJlYW0oYCR7bGluZX1cXG5gKTtcbiAgICAgICAgICAgIGZzLmFwcGVuZEZpbGVTeW5jKG91dHB1dEZpbGVzUGF0aCwgYCR7bGluZX1cXG5gKTtcbiAgICAgICAgfTtcblxuICAgICAgICBjb25zdCBxdWlldCA9IHRoaXMuYXJndi5xdWlldDtcblxuICAgICAgICByZXR1cm4gYXdhaXQgbmV3IFByb21pc2U8bnVtYmVyPigocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgICAgICBpZiAoIXF1aWV0KSB7XG4gICAgICAgICAgICAgICAgY3Auc3Rkb3V0Py5waXBlKHNwbGl0MigpKS5vbihcImRhdGFcIiwgKGU6IHN0cmluZykgPT4gb3V0RnVuYyhlLCB3cml0ZVN0cmVhbXMuc3Rkb3V0LmJpbmQod3JpdGVTdHJlYW1zKSwgKHMpID0+IGNoYWxrYHtncmVlbkJyaWdodCAke3N9fWApKTtcbiAgICAgICAgICAgICAgICBjcC5zdGRlcnI/LnBpcGUoc3BsaXQyKCkpLm9uKFwiZGF0YVwiLCAoZTogc3RyaW5nKSA9PiBvdXRGdW5jKGUsIHdyaXRlU3RyZWFtcy5zdGRlcnIuYmluZCh3cml0ZVN0cmVhbXMpLCAocykgPT4gY2hhbGtge3JlZEJyaWdodCAke3N9fWApKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHZvaWQgY3Aub24oXCJleGl0XCIsIChjb2RlKSA9PiByZXNvbHZlKGNvZGUgPz8gMCkpO1xuICAgICAgICAgICAgdm9pZCBjcC5vbihcImVycm9yXCIsIChlcnIpID0+IHJlamVjdChlcnIpKTtcblxuICAgICAgICAgICAgaWYgKGltYWdlTmFtZSkge1xuICAgICAgICAgICAgICAgIGNwLnN0ZGluPy5lbmQoXCIvZ2NsLWNtZFwiKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgY3Auc3RkaW4/LmVuZChgLi8ke3N0YXRlRGlyfS9zY3JpcHRzLyR7c2FmZUpvYk5hbWV9XyR7dGhpcy5qb2JJZH1gKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBpbWFnZU5hbWUgKHZhcnM6IHtba2V5OiBzdHJpbmddOiBzdHJpbmd9ID0ge30pOiBzdHJpbmcgfCBudWxsIHtcbiAgICAgICAgY29uc3QgaW1hZ2UgPSB0aGlzLmpvYkRhdGFbXCJpbWFnZVwiXTtcbiAgICAgICAgaWYgKCFpbWFnZSkge1xuICAgICAgICAgICAgaWYgKHRoaXMuYXJndi5zaGVsbEV4ZWN1dG9yTm9JbWFnZSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAvLyBodHRwczovL2RvY3MuZ2l0bGFiLmNvbS9lZS9jaS9ydW5uZXJzL2hvc3RlZF9ydW5uZXJzL2xpbnV4Lmh0bWwjY29udGFpbmVyLWltYWdlc1xuICAgICAgICAgICAgICAgIHJldHVybiBcImRvY2tlci5pby9ydWJ5OjMuMVwiO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGV4cGFuZGVkID0gVXRpbHMuZXhwYW5kVmFyaWFibGVzKHZhcnMpO1xuICAgICAgICBjb25zdCBpbWFnZU5hbWUgPSBVdGlscy5leHBhbmRUZXh0KGltYWdlLm5hbWUsIGV4cGFuZGVkKTtcbiAgICAgICAgcmV0dXJuIGltYWdlTmFtZS5pbmNsdWRlcyhcIjpcIikgPyBpbWFnZU5hbWUgOiBgJHtpbWFnZU5hbWV9OmxhdGVzdGA7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBpbWFnZVVzZXIgKHZhcnM6IHtba2V5OiBzdHJpbmddOiBzdHJpbmd9ID0ge30pOiBzdHJpbmcgfCBudWxsIHtcbiAgICAgICAgY29uc3QgaW1hZ2UgPSB0aGlzLmpvYkRhdGFbXCJpbWFnZVwiXTtcbiAgICAgICAgaWYgKCFpbWFnZSkgcmV0dXJuIG51bGw7XG4gICAgICAgIGlmICghaW1hZ2VbXCJkb2NrZXJcIl0pIHJldHVybiBudWxsO1xuICAgICAgICByZXR1cm4gVXRpbHMuZXhwYW5kVGV4dChpbWFnZVtcImRvY2tlclwiXVtcInVzZXJcIl0sIHZhcnMpO1xuICAgIH1cblxuICAgIGdldCBpbWFnZUVudHJ5cG9pbnQgKCk6IHN0cmluZ1tdIHwgbnVsbCB7XG4gICAgICAgIGNvbnN0IGltYWdlID0gdGhpcy5qb2JEYXRhW1wiaW1hZ2VcIl07XG5cbiAgICAgICAgaWYgKCFpbWFnZT8uZW50cnlwb2ludCkge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgYXNzZXJ0KEFycmF5LmlzQXJyYXkoaW1hZ2UuZW50cnlwb2ludCksIFwiaW1hZ2U6ZW50cnlwb2ludCBtdXN0IGJlIGFuIGFycmF5XCIpO1xuICAgICAgICByZXR1cm4gaW1hZ2UuZW50cnlwb2ludDtcbiAgICB9XG5cbiAgICBwcml2YXRlIGFzeW5jIHB1bGxJbWFnZSAod3JpdGVTdHJlYW1zOiBXcml0ZVN0cmVhbXMsIGltYWdlVG9QdWxsOiBzdHJpbmcpIHtcbiAgICAgICAgY29uc3QgcHVsbFBvbGljeSA9IHRoaXMuYXJndi5wdWxsUG9saWN5O1xuICAgICAgICBjb25zdCBhY3R1YWxQdWxsID0gYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgdGltZSA9IHByb2Nlc3MuaHJ0aW1lKCk7XG4gICAgICAgICAgICBhd2FpdCBVdGlscy5zcGF3bihbdGhpcy5hcmd2LmNvbnRhaW5lckV4ZWN1dGFibGUsIFwicHVsbFwiLCBpbWFnZVRvUHVsbF0pO1xuICAgICAgICAgICAgY29uc3QgZW5kVGltZSA9IHByb2Nlc3MuaHJ0aW1lKHRpbWUpO1xuICAgICAgICAgICAgd3JpdGVTdHJlYW1zLnN0ZG91dChjaGFsa2Ake3RoaXMuZm9ybWF0dGVkSm9iTmFtZX0ge21hZ2VudGFCcmlnaHQgcHVsbGVkfSAke2ltYWdlVG9QdWxsfSBpbiB7bWFnZW50YSAke3ByZXR0eUhydGltZShlbmRUaW1lKX19XFxuYCk7XG4gICAgICAgICAgICB0aGlzLnJlZnJlc2hMb25nUnVubmluZ1NpbGVudFRpbWVvdXQod3JpdGVTdHJlYW1zKTtcbiAgICAgICAgfTtcblxuICAgICAgICBpZiAocHVsbFBvbGljeSA9PT0gXCJhbHdheXNcIikge1xuICAgICAgICAgICAgYXdhaXQgYWN0dWFsUHVsbCgpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBhd2FpdCBVdGlscy5zcGF3bihbdGhpcy5hcmd2LmNvbnRhaW5lckV4ZWN1dGFibGUsIFwiaW1hZ2VcIiwgXCJpbnNwZWN0XCIsIGltYWdlVG9QdWxsXSk7XG4gICAgICAgIH0gY2F0Y2ggKGU6IGFueSkge1xuICAgICAgICAgICAgYXdhaXQgYWN0dWFsUHVsbCgpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBhc3luYyBpbml0UHJvZHVjZXJSZXBvcnRzRG90ZW52VmFyaWFibGVzICh3cml0ZVN0cmVhbXM6IFdyaXRlU3RyZWFtcywgZXhwYW5kZWQ6IHtba2V5OiBzdHJpbmddOiBzdHJpbmd9KSB7XG4gICAgICAgIGNvbnN0IGN3ZCA9IHRoaXMuYXJndi5jd2Q7XG4gICAgICAgIGNvbnN0IHN0YXRlRGlyID0gdGhpcy5hcmd2LnN0YXRlRGlyO1xuICAgICAgICBjb25zdCBwcm9kdWNlcnMgPSB0aGlzLnByb2R1Y2VycztcbiAgICAgICAgbGV0IHByb2R1Y2VyUmVwb3J0c0VudnMgPSB7fTtcbiAgICAgICAgZm9yIChjb25zdCBwcm9kdWNlciBvZiBwcm9kdWNlcnMgPz8gW10pIHtcbiAgICAgICAgICAgIGNvbnN0IHByb2R1Y2VyRG90ZW52ID0gVXRpbHMuZXhwYW5kVGV4dChwcm9kdWNlci5kb3RlbnYsIGV4cGFuZGVkKTtcbiAgICAgICAgICAgIGlmIChwcm9kdWNlckRvdGVudiA9PT0gbnVsbCkgY29udGludWU7XG5cbiAgICAgICAgICAgIGNvbnN0IHNhZmVQcm9kdWNlck5hbWUgPSBVdGlscy5zYWZlRG9ja2VyU3RyaW5nKHByb2R1Y2VyLm5hbWUpO1xuICAgICAgICAgICAgY29uc3QgZG90ZW52Rm9sZGVyID0gYCR7Y3dkfS8ke3N0YXRlRGlyfS9hcnRpZmFjdHMvJHtzYWZlUHJvZHVjZXJOYW1lfS8uZ2l0bGFiLWNpLXJlcG9ydHMvZG90ZW52L2A7XG4gICAgICAgICAgICBpZiAoYXdhaXQgZnMucGF0aEV4aXN0cyhkb3RlbnZGb2xkZXIpKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgZG90ZW52RmlsZXMgPSAoYXdhaXQgVXRpbHMuc3Bhd24oW1wiZmluZFwiLCBcIi5cIiwgXCItdHlwZVwiLCBcImZcIl0sIGRvdGVudkZvbGRlcikpLnN0ZG91dC5zcGxpdChcIlxcblwiKTtcbiAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IGRvdGVudkZpbGUgb2YgZG90ZW52RmlsZXMpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGRvdGVudkZpbGUgPT0gXCJcIikgY29udGludWU7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHByb2R1Y2VyUmVwb3J0RW52ID0gZG90ZW52LnBhcnNlKGF3YWl0IGZzLnJlYWRGaWxlKGAke2RvdGVudkZvbGRlcn0vJHtkb3RlbnZGaWxlfWApKTtcbiAgICAgICAgICAgICAgICAgICAgcHJvZHVjZXJSZXBvcnRzRW52cyA9IHsuLi5wcm9kdWNlclJlcG9ydHNFbnZzLCAuLi5wcm9kdWNlclJlcG9ydEVudn07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB3cml0ZVN0cmVhbXMuc3RkZXJyKGNoYWxrYCR7dGhpcy5mb3JtYXR0ZWRKb2JOYW1lfSB7eWVsbG93IHJlcG9ydHMuZG90ZW52IHByb2R1Y2VkIGJ5ICcke3Byb2R1Y2VyLm5hbWV9JyBjb3VsZCBub3QgYmUgZm91bmR9XFxuYCk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcHJvZHVjZXJSZXBvcnRzRW52cztcbiAgICB9XG5cbiAgICBwcml2YXRlIGFzeW5jIGNvcHlDYWNoZUluICh3cml0ZVN0cmVhbXM6IFdyaXRlU3RyZWFtcywgZXhwYW5kZWQ6IHtba2V5OiBzdHJpbmddOiBzdHJpbmd9KSB7XG4gICAgICAgIGlmICh0aGlzLmFyZ3YubW91bnRDYWNoZSAmJiB0aGlzLmltYWdlTmFtZShleHBhbmRlZCkpIHJldHVybjtcbiAgICAgICAgaWYgKCghdGhpcy5pbWFnZU5hbWUoZXhwYW5kZWQpICYmICF0aGlzLmFyZ3Yuc2hlbGxJc29sYXRpb24pIHx8IHRoaXMuY2FjaGUubGVuZ3RoID09PSAwKSByZXR1cm47XG5cbiAgICAgICAgY29uc3QgY3dkID0gdGhpcy5hcmd2LmN3ZDtcbiAgICAgICAgY29uc3Qgc3RhdGVEaXIgPSB0aGlzLmFyZ3Yuc3RhdGVEaXI7XG5cbiAgICAgICAgZm9yIChjb25zdCBjIG9mIHRoaXMuY2FjaGUpIHtcbiAgICAgICAgICAgIGlmICghW1wicHVsbFwiLCBcInB1bGwtcHVzaFwiXS5pbmNsdWRlcyhjLnBvbGljeSkpIHJldHVybjtcblxuICAgICAgICAgICAgY29uc3QgdGltZSA9IHByb2Nlc3MuaHJ0aW1lKCk7XG4gICAgICAgICAgICBjb25zdCBjYWNoZU5hbWUgPSBhd2FpdCB0aGlzLmdldFVuaXF1ZUNhY2hlTmFtZShjd2QsIGV4cGFuZGVkLCBjLmtleSk7XG4gICAgICAgICAgICBjb25zdCBjYWNoZUZvbGRlciA9IGAke2N3ZH0vJHtzdGF0ZURpcn0vY2FjaGUvJHtjYWNoZU5hbWV9YDtcbiAgICAgICAgICAgIGlmICghYXdhaXQgZnMucGF0aEV4aXN0cyhjYWNoZUZvbGRlcikpIHtcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgYXdhaXQgTXV0ZXguZXhjbHVzaXZlKGNhY2hlTmFtZSwgYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuY29weUluKGNhY2hlRm9sZGVyKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgY29uc3QgZW5kVGltZSA9IHByb2Nlc3MuaHJ0aW1lKHRpbWUpO1xuICAgICAgICAgICAgd3JpdGVTdHJlYW1zLnN0ZG91dChjaGFsa2Ake3RoaXMuZm9ybWF0dGVkSm9iTmFtZX0ge21hZ2VudGFCcmlnaHQgaW1wb3J0ZWQgY2FjaGUgJyR7Y2FjaGVOYW1lfSd9IGluIHttYWdlbnRhICR7cHJldHR5SHJ0aW1lKGVuZFRpbWUpfX1cXG5gKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgYXN5bmMgY29weUFydGlmYWN0c0luICh3cml0ZVN0cmVhbXM6IFdyaXRlU3RyZWFtcykge1xuICAgICAgICBpZiAoKCF0aGlzLmltYWdlTmFtZSh0aGlzLl92YXJpYWJsZXMpICYmICF0aGlzLmFyZ3Yuc2hlbGxJc29sYXRpb24pIHx8ICh0aGlzLnByb2R1Y2VycyA/PyBbXSkubGVuZ3RoID09PSAwKSByZXR1cm47XG5cbiAgICAgICAgY29uc3QgY3dkID0gdGhpcy5hcmd2LmN3ZDtcbiAgICAgICAgY29uc3Qgc3RhdGVEaXIgPSB0aGlzLmFyZ3Yuc3RhdGVEaXI7XG4gICAgICAgIGNvbnN0IHRpbWUgPSBwcm9jZXNzLmhydGltZSgpO1xuICAgICAgICBjb25zdCBwcm9taXNlcyA9IFtdO1xuICAgICAgICBmb3IgKGNvbnN0IHByb2R1Y2VyIG9mIHRoaXMucHJvZHVjZXJzID8/IFtdKSB7XG4gICAgICAgICAgICBjb25zdCBwcm9kdWNlclNhZmVOYW1lID0gVXRpbHMuc2FmZURvY2tlclN0cmluZyhwcm9kdWNlci5uYW1lKTtcbiAgICAgICAgICAgIGNvbnN0IGFydGlmYWN0Rm9sZGVyID0gYCR7Y3dkfS8ke3N0YXRlRGlyfS9hcnRpZmFjdHMvJHtwcm9kdWNlclNhZmVOYW1lfWA7XG4gICAgICAgICAgICBpZiAoIWF3YWl0IGZzLnBhdGhFeGlzdHMoYXJ0aWZhY3RGb2xkZXIpKSB7XG4gICAgICAgICAgICAgICAgYXdhaXQgZnMubWtkaXJwKGFydGlmYWN0Rm9sZGVyKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgcmVhZGRpciA9IGF3YWl0IGZzLnJlYWRkaXIoYXJ0aWZhY3RGb2xkZXIpO1xuICAgICAgICAgICAgaWYgKHJlYWRkaXIubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICAgICAgd3JpdGVTdHJlYW1zLnN0ZGVycihjaGFsa2Ake3RoaXMuZm9ybWF0dGVkSm9iTmFtZX0ge3llbGxvdyBhcnRpZmFjdHMgZnJvbSB7Ymx1ZUJyaWdodCAke3Byb2R1Y2VyU2FmZU5hbWV9fSB3YXMgZW1wdHl9XFxuYCk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHByb21pc2VzLnB1c2godGhpcy5jb3B5SW4oYXJ0aWZhY3RGb2xkZXIpKTtcbiAgICAgICAgfVxuICAgICAgICBhd2FpdCBQcm9taXNlLmFsbChwcm9taXNlcyk7XG4gICAgICAgIGNvbnN0IGVuZFRpbWUgPSBwcm9jZXNzLmhydGltZSh0aW1lKTtcbiAgICAgICAgd3JpdGVTdHJlYW1zLnN0ZG91dChjaGFsa2Ake3RoaXMuZm9ybWF0dGVkSm9iTmFtZX0ge21hZ2VudGFCcmlnaHQgaW1wb3J0ZWQgYXJ0aWZhY3RzfSBpbiB7bWFnZW50YSAke3ByZXR0eUhydGltZShlbmRUaW1lKX19XFxuYCk7XG4gICAgfVxuXG4gICAgY29weUluIChzb3VyY2U6IHN0cmluZykge1xuICAgICAgICBjb25zdCBzYWZlSm9iTmFtZSA9IHRoaXMuc2FmZUpvYk5hbWU7XG4gICAgICAgIGlmICghdGhpcy5pbWFnZU5hbWUodGhpcy5fdmFyaWFibGVzKSAmJiB0aGlzLmFyZ3Yuc2hlbGxJc29sYXRpb24pIHtcbiAgICAgICAgICAgIHJldHVybiBVdGlscy5zcGF3bihbXCJyc3luY1wiLCBcIi1hXCIsIGAke3NvdXJjZX0vLmAsIGAke3RoaXMuYXJndi5jd2R9LyR7dGhpcy5hcmd2LnN0YXRlRGlyfS9idWlsZHMvJHtzYWZlSm9iTmFtZX1gXSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIFV0aWxzLnNwYXduKFt0aGlzLmFyZ3YuY29udGFpbmVyRXhlY3V0YWJsZSwgXCJjcFwiLCBgJHtzb3VyY2V9Ly5gLCBgJHt0aGlzLl9jb250YWluZXJJZH06L2djbC1idWlsZHNgXSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBhc3luYyBjb3B5Q2FjaGVPdXQgKHdyaXRlU3RyZWFtczogV3JpdGVTdHJlYW1zLCBleHBhbmRlZDoge1trZXk6IHN0cmluZ106IHN0cmluZ30pIHtcbiAgICAgICAgaWYgKHRoaXMuYXJndi5tb3VudENhY2hlICYmIHRoaXMuaW1hZ2VOYW1lKGV4cGFuZGVkKSkgcmV0dXJuO1xuICAgICAgICBpZiAoKCF0aGlzLmltYWdlTmFtZShleHBhbmRlZCkgJiYgIXRoaXMuYXJndi5zaGVsbElzb2xhdGlvbikgfHwgdGhpcy5jYWNoZS5sZW5ndGggPT09IDApIHJldHVybjtcblxuICAgICAgICBjb25zdCBjd2QgPSB0aGlzLmFyZ3YuY3dkO1xuICAgICAgICBjb25zdCBzdGF0ZURpciA9IHRoaXMuYXJndi5zdGF0ZURpcjtcblxuICAgICAgICBsZXQgdGltZSwgZW5kVGltZTtcbiAgICAgICAgZm9yIChjb25zdCBjIG9mIHRoaXMuY2FjaGUpIHtcbiAgICAgICAgICAgIGlmICghW1wicHVzaFwiLCBcInB1bGwtcHVzaFwiXS5pbmNsdWRlcyhjLnBvbGljeSkpIHJldHVybjtcbiAgICAgICAgICAgIGlmIChcIm9uX3N1Y2Nlc3NcIiA9PT0gYy53aGVuICYmIHRoaXMuam9iU3RhdHVzICE9PSBcInN1Y2Nlc3NcIikgcmV0dXJuO1xuICAgICAgICAgICAgaWYgKFwib25fZmFpbHVyZVwiID09PSBjLndoZW4gJiYgdGhpcy5qb2JTdGF0dXMgPT09IFwic3VjY2Vzc1wiKSByZXR1cm47XG4gICAgICAgICAgICBjb25zdCBjYWNoZU5hbWUgPSBhd2FpdCB0aGlzLmdldFVuaXF1ZUNhY2hlTmFtZShjd2QsIGV4cGFuZGVkLCBjLmtleSk7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IHBhdGggb2YgYy5wYXRocykge1xuICAgICAgICAgICAgICAgIHRpbWUgPSBwcm9jZXNzLmhydGltZSgpO1xuICAgICAgICAgICAgICAgIGNvbnN0IGV4cGFuZGVkUGF0aCA9IFV0aWxzLmV4cGFuZFRleHQocGF0aCwgZXhwYW5kZWQpLnJlcGxhY2UoYCR7ZXhwYW5kZWQuQ0lfUFJPSkVDVF9ESVJ9L2AsIFwiXCIpO1xuICAgICAgICAgICAgICAgIGxldCBjbWQgPSBcInNob3B0IC1zIGdsb2JzdGFyIG51bGxnbG9iIGRvdGdsb2JcXG5cIjtcbiAgICAgICAgICAgICAgICBjbWQgKz0gYG1rZGlyIC1wIC4uLy4uL2NhY2hlLyR7Y2FjaGVOYW1lfVxcbmA7XG4gICAgICAgICAgICAgICAgY21kICs9IGByc3luYyAtUmEgJHtleHBhbmRlZFBhdGh9IC4uLy4uL2NhY2hlLyR7Y2FjaGVOYW1lfS8uIHx8IHRydWVcXG5gO1xuXG4gICAgICAgICAgICAgICAgYXdhaXQgTXV0ZXguZXhjbHVzaXZlKGNhY2hlTmFtZSwgYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLmNvcHlPdXQoY21kLCBzdGF0ZURpciwgXCJjYWNoZVwiLCBbXSk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgZW5kVGltZSA9IHByb2Nlc3MuaHJ0aW1lKHRpbWUpO1xuXG4gICAgICAgICAgICAgICAgY29uc3QgcmVhZGRpciA9IGF3YWl0IGZzLnJlYWRkaXIoYCR7dGhpcy5hcmd2LmN3ZH0vJHtzdGF0ZURpcn0vY2FjaGUvJHtjYWNoZU5hbWV9YCk7XG4gICAgICAgICAgICAgICAgaWYgKHJlYWRkaXIubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgIHdyaXRlU3RyZWFtcy5zdGRvdXQoY2hhbGtgJHt0aGlzLmZvcm1hdHRlZEpvYk5hbWV9IHt5ZWxsb3cgISEgbm8gY2FjaGUgd2FzIGNvcGllZCBmb3IgJHtwYXRofSAhIX1cXG5gKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB3cml0ZVN0cmVhbXMuc3Rkb3V0KGNoYWxrYCR7dGhpcy5mb3JtYXR0ZWRKb2JOYW1lfSB7bWFnZW50YUJyaWdodCBleHBvcnRlZCBjYWNoZSAke2V4cGFuZGVkUGF0aH0gJyR7Y2FjaGVOYW1lfSd9IGluIHttYWdlbnRhICR7cHJldHR5SHJ0aW1lKGVuZFRpbWUpfX1cXG5gKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIGFzeW5jIGNvcHlBcnRpZmFjdHNPdXQgKHdyaXRlU3RyZWFtczogV3JpdGVTdHJlYW1zLCBleHBhbmRlZDoge1trZXk6IHN0cmluZ106IHN0cmluZ30pIHtcbiAgICAgICAgLy8gVE9ETzogdXBkYXRlIHRoZSBjb25kaXRpb24gdG8gc3VwcG9ydCB3aGVuOm9uX3N1Y2Nlc3MgLyB3aGVuOm9uX2ZhaWx1cmVcbiAgICAgICAgaWYgKHRoaXMuam9iU3RhdHVzICE9PSBcInN1Y2Nlc3NcIiAmJiB0aGlzLmFydGlmYWN0cz8ud2hlbiAhPT0gXCJhbHdheXNcIikgcmV0dXJuO1xuICAgICAgICBpZiAoIXRoaXMuYXJ0aWZhY3RzKSByZXR1cm47XG4gICAgICAgIGlmICgodGhpcy5hcnRpZmFjdHMucGF0aHM/Lmxlbmd0aCA/PyAwKSA9PT0gMCAmJiB0aGlzLmFydGlmYWN0cy5yZXBvcnRzPy5kb3RlbnYgPT0gbnVsbCkgcmV0dXJuO1xuXG4gICAgICAgIGNvbnN0IHNhZmVKb2JOYW1lID0gdGhpcy5zYWZlSm9iTmFtZTtcbiAgICAgICAgY29uc3QgY3dkID0gdGhpcy5hcmd2LmN3ZDtcbiAgICAgICAgY29uc3Qgc3RhdGVEaXIgPSB0aGlzLmFyZ3Yuc3RhdGVEaXI7XG4gICAgICAgIGNvbnN0IGFydGlmYWN0c1BhdGggPSAhdGhpcy5hcmd2LnNoZWxsSXNvbGF0aW9uICYmICF0aGlzLmltYWdlTmFtZShleHBhbmRlZCkgPyBgJHtzdGF0ZURpcn0vYXJ0aWZhY3RzYCA6IFwiLi4vLi4vYXJ0aWZhY3RzXCI7XG5cbiAgICAgICAgbGV0IHRpbWUsIGVuZFRpbWU7XG4gICAgICAgIGxldCBjcENtZCA9IFwic2hvcHQgLXMgZ2xvYnN0YXIgbnVsbGdsb2IgZG90Z2xvYlxcblwiO1xuICAgICAgICBjcENtZCArPSBgbWtkaXIgLXAgJHthcnRpZmFjdHNQYXRofS8ke3NhZmVKb2JOYW1lfVxcbmA7XG4gICAgICAgIGNwQ21kICs9IFwicnN5bmMgLS1leGNsdWRlICcuZ2l0bGFiLWNpLWxvY2FsLyoqJyAtUmEgXCI7XG4gICAgICAgIGZvciAoY29uc3QgYXJ0aWZhY3RFeGNsdWRlUGF0aCBvZiB0aGlzLmFydGlmYWN0cz8uZXhjbHVkZSA/PyBbXSkge1xuICAgICAgICAgICAgY29uc3QgZXhwYW5kZWRQYXRoID0gVXRpbHMuZXhwYW5kVGV4dChhcnRpZmFjdEV4Y2x1ZGVQYXRoLCBleHBhbmRlZCkucmVwbGFjZShgJHtleHBhbmRlZC5DSV9QUk9KRUNUX0RJUn0vYCwgXCJcIik7XG4gICAgICAgICAgICBjcENtZCArPSBgLS1leGNsdWRlICcke2V4cGFuZGVkUGF0aH0nIGA7XG4gICAgICAgIH1cbiAgICAgICAgZm9yIChjb25zdCBhcnRpZmFjdFBhdGggb2YgdGhpcy5hcnRpZmFjdHM/LnBhdGhzID8/IFtdKSB7XG4gICAgICAgICAgICBjb25zdCBleHBhbmRlZFBhdGggPSBVdGlscy5leHBhbmRUZXh0KGFydGlmYWN0UGF0aCwgZXhwYW5kZWQpLnJlcGxhY2UoYCR7ZXhwYW5kZWQuQ0lfUFJPSkVDVF9ESVJ9L2AsIFwiXCIpO1xuICAgICAgICAgICAgY3BDbWQgKz0gYCR7ZXhwYW5kZWRQYXRofSBgO1xuICAgICAgICB9XG4gICAgICAgIGNwQ21kICs9IGAke2FydGlmYWN0c1BhdGh9LyR7c2FmZUpvYk5hbWV9Ly4gfHwgdHJ1ZVxcbmA7XG4gICAgICAgIGNvbnN0IHJlcG9ydERvdGVudiA9IFV0aWxzLmV4cGFuZFRleHQodGhpcy5hcnRpZmFjdHMucmVwb3J0cz8uZG90ZW52ID8/IG51bGwsIGV4cGFuZGVkKTtcbiAgICAgICAgY29uc3QgcmVwb3J0RG90ZW52czogc3RyaW5nW10gfCBudWxsID0gKHR5cGVvZiByZXBvcnREb3RlbnYgPT09IFwic3RyaW5nXCIpIC8vIG5vcm1hbGl6ZSB0byBzdHJpbmdbXSBmb3IgZWFzaWVyIGhhbmRsaW5nXG4gICAgICAgICAgICA/IFtyZXBvcnREb3RlbnZdXG4gICAgICAgICAgICA6IHJlcG9ydERvdGVudjtcbiAgICAgICAgaWYgKHJlcG9ydERvdGVudnMgIT0gbnVsbCkge1xuICAgICAgICAgICAgcmVwb3J0RG90ZW52cy5mb3JFYWNoKChyZXBvcnREb3RlbnYpID0+IHtcbiAgICAgICAgICAgICAgICBjcENtZCArPSBgbWtkaXIgLXAgJHthcnRpZmFjdHNQYXRofS8ke3NhZmVKb2JOYW1lfS8uZ2l0bGFiLWNpLXJlcG9ydHMvZG90ZW52XFxuYDtcbiAgICAgICAgICAgICAgICBjcENtZCArPSBgaWYgWyAtZiAke3JlcG9ydERvdGVudn0gXTsgdGhlblxcbmA7XG4gICAgICAgICAgICAgICAgY3BDbWQgKz0gYCAgcnN5bmMgLVJhICR7cmVwb3J0RG90ZW52fSAke2FydGlmYWN0c1BhdGh9LyR7c2FmZUpvYk5hbWV9Ly5naXRsYWItY2ktcmVwb3J0cy9kb3RlbnYvLlxcbmA7XG4gICAgICAgICAgICAgICAgY3BDbWQgKz0gXCJmaVxcblwiO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgICB0aW1lID0gcHJvY2Vzcy5ocnRpbWUoKTtcbiAgICAgICAgY29uc3QgZG9ja2VyQ21kRXh0cmFzID0gdGhpcy5hcmd2Lm1vdW50Q2FjaGUgPyBhd2FpdCB0aGlzLm1vdW50Q2FjaGVDbWQod3JpdGVTdHJlYW1zLCBleHBhbmRlZCkgOiBbXTtcbiAgICAgICAgYXdhaXQgdGhpcy5jb3B5T3V0KGNwQ21kLCBzdGF0ZURpciwgXCJhcnRpZmFjdHNcIiwgZG9ja2VyQ21kRXh0cmFzKTtcbiAgICAgICAgZW5kVGltZSA9IHByb2Nlc3MuaHJ0aW1lKHRpbWUpO1xuXG4gICAgICAgIGlmIChyZXBvcnREb3RlbnZzICE9IG51bGwpIHtcbiAgICAgICAgICAgIHJlcG9ydERvdGVudnMuZm9yRWFjaChhc3luYyAocmVwb3J0RG90ZW52KSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKCFhd2FpdCBmcy5wYXRoRXhpc3RzKGAke2N3ZH0vJHtzdGF0ZURpcn0vYXJ0aWZhY3RzLyR7c2FmZUpvYk5hbWV9Ly5naXRsYWItY2ktcmVwb3J0cy9kb3RlbnYvJHtyZXBvcnREb3RlbnZ9YCkpIHtcbiAgICAgICAgICAgICAgICAgICAgd3JpdGVTdHJlYW1zLnN0ZGVycihjaGFsa2Ake3RoaXMuZm9ybWF0dGVkSm9iTmFtZX0ge3llbGxvdyBhcnRpZmFjdCByZXBvcnRzIGRvdGVudiAnJHtyZXBvcnREb3RlbnZ9JyBjb3VsZCBub3QgYmUgZm91bmR9XFxuYCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCByZWFkZGlyID0gYXdhaXQgZnMucmVhZGRpcihgJHtjd2R9LyR7c3RhdGVEaXJ9L2FydGlmYWN0cy8ke3NhZmVKb2JOYW1lfWApO1xuICAgICAgICBpZiAocmVhZGRpci5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgIHdyaXRlU3RyZWFtcy5zdGRvdXQoY2hhbGtgJHt0aGlzLmZvcm1hdHRlZEpvYk5hbWV9IHt5ZWxsb3cgISEgbm8gYXJ0aWZhY3RzIHdhcyBjb3BpZWQgISF9XFxuYCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB3cml0ZVN0cmVhbXMuc3Rkb3V0KGNoYWxrYCR7dGhpcy5mb3JtYXR0ZWRKb2JOYW1lfSB7bWFnZW50YUJyaWdodCBleHBvcnRlZCBhcnRpZmFjdHN9IGluIHttYWdlbnRhICR7cHJldHR5SHJ0aW1lKGVuZFRpbWUpfX1cXG5gKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLmFydGlmYWN0c1RvU291cmNlICYmICh0aGlzLmFyZ3Yuc2hlbGxJc29sYXRpb24gfHwgdGhpcy5pbWFnZU5hbWUoZXhwYW5kZWQpKSkge1xuICAgICAgICAgICAgdGltZSA9IHByb2Nlc3MuaHJ0aW1lKCk7XG4gICAgICAgICAgICBhd2FpdCBVdGlscy5zcGF3bihbXCJyc3luY1wiLCBcIi0tZXhjbHVkZT0vLmdpdGxhYi1jaS1yZXBvcnRzL1wiLCBcIi1hXCIsIGAke2N3ZH0vJHtzdGF0ZURpcn0vYXJ0aWZhY3RzLyR7c2FmZUpvYk5hbWV9Ly5gLCBjd2RdKTtcbiAgICAgICAgICAgIGlmIChyZXBvcnREb3RlbnYgIT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIGF3YWl0IFV0aWxzLnNwYXduKFtcInJzeW5jXCIsIFwiLWFcIiwgYCR7Y3dkfS8ke3N0YXRlRGlyfS9hcnRpZmFjdHMvJHtzYWZlSm9iTmFtZX0vLmdpdGxhYi1jaS1yZXBvcnRzL2RvdGVudi8uYCwgY3dkXSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbmRUaW1lID0gcHJvY2Vzcy5ocnRpbWUodGltZSk7XG4gICAgICAgICAgICB3cml0ZVN0cmVhbXMuc3Rkb3V0KGNoYWxrYCR7dGhpcy5mb3JtYXR0ZWRKb2JOYW1lfSB7bWFnZW50YUJyaWdodCBjb3BpZWQgYXJ0aWZhY3RzIHRvIGN3ZH0gaW4ge21hZ2VudGEgJHtwcmV0dHlIcnRpbWUoZW5kVGltZSl9fVxcbmApO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBhc3luYyBjb3B5T3V0IChjbWQ6IHN0cmluZywgc3RhdGVEaXI6IHN0cmluZywgdHlwZTogXCJhcnRpZmFjdHNcIiB8IFwiY2FjaGVcIiwgZG9ja2VyQ21kRXh0cmFzOiBzdHJpbmdbXSkge1xuICAgICAgICBjb25zdCBzYWZlSm9iTmFtZSA9IHRoaXMuc2FmZUpvYk5hbWU7XG4gICAgICAgIGNvbnN0IGJ1aWxkVm9sdW1lTmFtZSA9IHRoaXMuYnVpbGRWb2x1bWVOYW1lO1xuICAgICAgICBjb25zdCBjd2QgPSB0aGlzLmFyZ3YuY3dkO1xuXG4gICAgICAgIGF3YWl0IGZzLm1rZGlycChgJHtjd2R9LyR7c3RhdGVEaXJ9LyR7dHlwZX1gKTtcblxuICAgICAgICBpZiAodGhpcy5pbWFnZU5hbWUodGhpcy5fdmFyaWFibGVzKSkge1xuICAgICAgICAgICAgY29uc3Qge3N0ZG91dDogY29udGFpbmVySWR9ID0gYXdhaXQgVXRpbHMuYmFzaChgJHt0aGlzLmFyZ3YuY29udGFpbmVyRXhlY3V0YWJsZX0gY3JlYXRlIC1pICR7ZG9ja2VyQ21kRXh0cmFzLmpvaW4oXCIgXCIpfSAtdiAke2J1aWxkVm9sdW1lTmFtZX06L2djbC1idWlsZHMvIC13IC9nY2wtYnVpbGRzIGRvY2tlci5pby9maXJlY293L2dpdGxhYi1jaS1sb2NhbC11dGlsIGJhc2ggLWMgXCIke2NtZH1cImAsIGN3ZCk7XG4gICAgICAgICAgICB0aGlzLl9jb250YWluZXJzVG9DbGVhbi5wdXNoKGNvbnRhaW5lcklkKTtcbiAgICAgICAgICAgIGF3YWl0IFV0aWxzLnNwYXduKFt0aGlzLmFyZ3YuY29udGFpbmVyRXhlY3V0YWJsZSwgXCJzdGFydFwiLCBjb250YWluZXJJZCwgXCItLWF0dGFjaFwiXSk7XG4gICAgICAgICAgICBhd2FpdCBVdGlscy5zcGF3bihbdGhpcy5hcmd2LmNvbnRhaW5lckV4ZWN1dGFibGUsIFwiY3BcIiwgYCR7Y29udGFpbmVySWR9Oi8ke3R5cGV9Ly5gLCBgJHtzdGF0ZURpcn0vJHt0eXBlfS8uYF0sIGN3ZCk7XG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy5hcmd2LnNoZWxsSXNvbGF0aW9uKSB7XG4gICAgICAgICAgICBhd2FpdCBVdGlscy5iYXNoKGBiYXNoIC1lbyBwaXBlZmFpbCAtYyBcIiR7Y21kfVwiYCwgYCR7Y3dkfS8ke3N0YXRlRGlyfS9idWlsZHMvJHtzYWZlSm9iTmFtZX1gKTtcbiAgICAgICAgfSBlbHNlIGlmICghdGhpcy5hcmd2LnNoZWxsSXNvbGF0aW9uKSB7XG4gICAgICAgICAgICBhd2FpdCBVdGlscy5iYXNoKGBiYXNoIC1lbyBwaXBlZmFpbCAtYyBcIiR7Y21kfVwiYCwgYCR7Y3dkfWApO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSByZWZyZXNoTG9uZ1J1bm5pbmdTaWxlbnRUaW1lb3V0ICh3cml0ZVN0cmVhbXM6IFdyaXRlU3RyZWFtcykge1xuICAgICAgICBjbGVhclRpbWVvdXQodGhpcy5fbG9uZ1J1bm5pbmdTaWxlbnRUaW1lb3V0KTtcbiAgICAgICAgdGhpcy5fbG9uZ1J1bm5pbmdTaWxlbnRUaW1lb3V0ID0gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICB3cml0ZVN0cmVhbXMuc3Rkb3V0KGNoYWxrYCR7dGhpcy5mb3JtYXR0ZWRKb2JOYW1lfSB7Z3JleSA+IHN0aWxsIHJ1bm5pbmcuLi59XFxuYCk7XG4gICAgICAgICAgICB0aGlzLnJlZnJlc2hMb25nUnVubmluZ1NpbGVudFRpbWVvdXQod3JpdGVTdHJlYW1zKTtcbiAgICAgICAgfSwgMTAwMDApO1xuICAgIH1cblxuICAgIHByaXZhdGUgZ2V0RmluaXNoZWRTdHJpbmcgKCkge1xuICAgICAgICByZXR1cm4gY2hhbGtgJHt0aGlzLmZvcm1hdHRlZEpvYk5hbWV9IHttYWdlbnRhQnJpZ2h0IGZpbmlzaGVkfSBpbiB7bWFnZW50YSAke3RoaXMucHJldHR5RHVyYXRpb259fWA7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBwcmludEZpbmlzaGVkU3RyaW5nICgpIHtcbiAgICAgICAgaWYgKHRoaXMuam9iU3RhdHVzICE9PSBcInN1Y2Nlc3NcIikgcmV0dXJuO1xuICAgICAgICB0aGlzLndyaXRlU3RyZWFtcy5zdGRvdXQoYCR7dGhpcy5nZXRGaW5pc2hlZFN0cmluZygpfVxcbmApO1xuICAgIH1cblxuICAgIHByaXZhdGUgcHJpbnRFeGl0ZWRTdHJpbmcgKGNvZGU6IG51bWJlcikge1xuICAgICAgICBjb25zdCB3cml0ZVN0cmVhbXMgPSB0aGlzLndyaXRlU3RyZWFtcztcbiAgICAgICAgY29uc3QgZmluaXNoZWRTdHIgPSB0aGlzLmdldEZpbmlzaGVkU3RyaW5nKCk7XG5cbiAgICAgICAgLy8gV29uJ3QgcHJpbnQgaWYgam9iU3RhdHVzIGlzIFwic3VjY2Vzc1wiIGJlY2F1c2UgdGhhdCB3aWxsIGJlIHByaW50ZWQgdmlhIHRoZSBgcHJpbnRGaW5pc2hlZFN0cmluZygpYFxuICAgICAgICBpZiAodGhpcy5qb2JTdGF0dXMgPT09IFwid2FybmluZ1wiKSB7XG4gICAgICAgICAgICB3cml0ZVN0cmVhbXMuc3RkZXJyKFxuICAgICAgICAgICAgICAgIGNoYWxrYCR7ZmluaXNoZWRTdHJ9IHtibGFjay5iZ1llbGxvd0JyaWdodCAgV0FSTiAke2NvZGUudG9TdHJpbmcoKX0gfVxcbmBcbiAgICAgICAgICAgICk7XG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy5qb2JTdGF0dXMgPT09IFwiZmFpbGVkXCIpIHtcbiAgICAgICAgICAgIHdyaXRlU3RyZWFtcy5zdGRlcnIoXG4gICAgICAgICAgICAgICAgY2hhbGtgJHtmaW5pc2hlZFN0cn0ge2JsYWNrLmJnUmVkICBGQUlMICR7Y29kZS50b1N0cmluZygpfSB9XFxuYFxuICAgICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgcHJpbnRBZnRlclNjcmlwdEV4aXRlZFN0cmluZyAoY29kZTogbnVtYmVyKSB7XG4gICAgICAgIGNvbnN0IHdyaXRlU3RyZWFtcyA9IHRoaXMud3JpdGVTdHJlYW1zO1xuICAgICAgICBjb25zdCBmaW5pc2hlZFN0ciA9IHRoaXMuZ2V0RmluaXNoZWRTdHJpbmcoKTtcblxuICAgICAgICBpZiAoY29kZSAhPT0gMCkge1xuICAgICAgICAgICAgd3JpdGVTdHJlYW1zLnN0ZGVycihcbiAgICAgICAgICAgICAgICBjaGFsa2Ake2ZpbmlzaGVkU3RyfSB7YmxhY2suYmdZZWxsb3dCcmlnaHQgIFdBUk4gJHtjb2RlLnRvU3RyaW5nKCl9IH0gYWZ0ZXJfc2NyaXB0XFxuYFxuICAgICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgYXN5bmMgY3JlYXRlRG9ja2VyTmV0d29yayAobmV0d29ya05hbWU6IHN0cmluZykge1xuICAgICAgICBjb25zdCB7c3Rkb3V0OiBuZXR3b3JrSWR9ID0gYXdhaXQgVXRpbHMuc3Bhd24oW3RoaXMuYXJndi5jb250YWluZXJFeGVjdXRhYmxlLCBcIm5ldHdvcmtcIiwgXCJjcmVhdGVcIiwgYCR7bmV0d29ya05hbWV9YF0pO1xuICAgICAgICB0aGlzLl9zZXJ2aWNlTmV0d29ya0lkID0gbmV0d29ya0lkO1xuICAgIH1cblxuICAgIHByaXZhdGUgYXN5bmMgc3RhcnRTZXJ2aWNlICh3cml0ZVN0cmVhbXM6IFdyaXRlU3RyZWFtcywgZXhwYW5kZWQ6IHtba2V5OiBzdHJpbmddOiBzdHJpbmd9LCBzZXJ2aWNlOiBTZXJ2aWNlKSB7XG4gICAgICAgIGNvbnN0IGN3ZCA9IHRoaXMuYXJndi5jd2Q7XG4gICAgICAgIGxldCBkb2NrZXJDbWQgPSBgJHt0aGlzLmFyZ3YuY29udGFpbmVyRXhlY3V0YWJsZX0gY3JlYXRlIC0taW50ZXJhY3RpdmUgYDtcbiAgICAgICAgdGhpcy5yZWZyZXNoTG9uZ1J1bm5pbmdTaWxlbnRUaW1lb3V0KHdyaXRlU3RyZWFtcyk7XG5cbiAgICAgICAgaWYgKGV4cGFuZGVkW1wiRkZfRElTQUJMRV9VTUFTS19GT1JfRE9DS0VSX0VYRUNVVE9SXCJdID09PSBcImZhbHNlXCIpIHtcbiAgICAgICAgICAgIGRvY2tlckNtZCArPSBcIi0tdXNlciAwOjAgXCI7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5hcmd2LnByaXZpbGVnZWQpIHtcbiAgICAgICAgICAgIGRvY2tlckNtZCArPSBcIi0tcHJpdmlsZWdlZCBcIjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLmFyZ3YudWxpbWl0ICE9PSBudWxsKSB7XG4gICAgICAgICAgICBkb2NrZXJDbWQgKz0gYC0tdWxpbWl0IG5vZmlsZT0ke3RoaXMuYXJndi51bGltaXR9IGA7XG4gICAgICAgIH1cblxuICAgICAgICBmb3IgKGNvbnN0IHZvbHVtZSBvZiB0aGlzLmFyZ3Yudm9sdW1lKSB7XG4gICAgICAgICAgICBkb2NrZXJDbWQgKz0gYC0tdm9sdW1lICR7dm9sdW1lfSBgO1xuICAgICAgICB9XG5cbiAgICAgICAgZm9yIChjb25zdCBleHRyYUhvc3Qgb2YgdGhpcy5hcmd2LmV4dHJhSG9zdCkge1xuICAgICAgICAgICAgZG9ja2VyQ21kICs9IGAtLWFkZC1ob3N0PSR7ZXh0cmFIb3N0fSBgO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3Qgc2VydmljZUFsaWFzID0gc2VydmljZS5hbGlhcztcbiAgICAgICAgY29uc3Qgc2VydmljZU5hbWUgPSBzZXJ2aWNlLm5hbWU7XG4gICAgICAgIGNvbnN0IHNlcnZpY2VOYW1lV2l0aG91dFZlcnNpb24gPSBzZXJ2aWNlTmFtZS5yZXBsYWNlKC8oLiopKDouKikvLCBcIiQxXCIpO1xuICAgICAgICBjb25zdCBhbGlhc2VzID0gbmV3IFNldDxzdHJpbmc+KCk7XG4gICAgICAgIGFsaWFzZXMuYWRkKHNlcnZpY2VOYW1lV2l0aG91dFZlcnNpb24ucmVwbGFjZUFsbChcIi9cIiwgXCItXCIpKTtcbiAgICAgICAgYWxpYXNlcy5hZGQoc2VydmljZU5hbWVXaXRob3V0VmVyc2lvbi5yZXBsYWNlQWxsKFwiL1wiLCBcIl9fXCIpKTtcbiAgICAgICAgaWYgKHNlcnZpY2VBbGlhcykge1xuICAgICAgICAgICAgYWxpYXNlcy5hZGQoc2VydmljZUFsaWFzKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGZvciAoY29uc3QgW2tleSwgdmFsXSBvZiBPYmplY3QuZW50cmllcyhleHBhbmRlZCkpIHtcbiAgICAgICAgICAgIC8vIFJlcGxhY2luZyBgJ2Agd2l0aCBgJ1xcJydgIHRvIGNvcnJlY3RseSBoYW5kbGUgc2luZ2xlIHF1b3RlcyhpZiBgdmFsYCBjb250YWlucyBgJ2ApIGluIHNoZWxsIGNvbW1hbmRzXG4gICAgICAgICAgICBkb2NrZXJDbWQgKz0gYCAgLWUgJyR7a2V5fT0ke3ZhbC5yZXBsYWNlKC8nL2csIFwiJ1xcXFwnJ1wiKX0nIFxcXFxcXG5gO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3Qgc2VydmljZUVudHJ5cG9pbnQgPSBzZXJ2aWNlLmVudHJ5cG9pbnQ7XG4gICAgICAgIGlmIChzZXJ2aWNlRW50cnlwb2ludCkge1xuICAgICAgICAgICAgaWYgKHNlcnZpY2VFbnRyeXBvaW50WzBdID09IFwiXCIpIHtcbiAgICAgICAgICAgICAgICBkb2NrZXJDbWQgKz0gXCItLWVudHJ5cG9pbnQgJycgXCI7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGRvY2tlckNtZCArPSBgLS1lbnRyeXBvaW50ICR7c2VydmljZUVudHJ5cG9pbnRbMF19IGA7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZG9ja2VyQ21kICs9IGAtLXZvbHVtZSAke3RoaXMuYnVpbGRWb2x1bWVOYW1lfTovZ2NsLWJ1aWxkcyBgO1xuICAgICAgICBkb2NrZXJDbWQgKz0gYC0tdm9sdW1lICR7dGhpcy50bXBWb2x1bWVOYW1lfToke3RoaXMuZmlsZVZhcmlhYmxlc0Rpcn0gYDtcblxuICAgICAgICAvLyBUaGUgZGVmYXVsdCBwb2RtYW4gbmV0d29yayBtb2RlIGlzIG5vdCBgYnJpZGdlYCwgd2hpY2ggbWVhbnMgYSBgcG9kbWFuIG5ldHdvcmsgY29ubmVjdGAgY2FsbCB3aWxsIGZhaWxcbiAgICAgICAgLy8gd2hlbiBjb25uZWN0aW5nIHVzZXIgZGVmaW5lZCBuZXR3b3Jrcy4gVGhlIHdvcmthcm91bmQgaXMgdG8gdXNlIGEgdXNlciBkZWZpbmVkIG5ldHdvcmsgb24gY29udGFpbmVyXG4gICAgICAgIC8vIGNyZWF0aW9uLlxuICAgICAgICAvL1xuICAgICAgICAvLyBTZWUgaHR0cHM6Ly9naXRodWIuY29tL2NvbnRhaW5lcnMvcG9kbWFuL2lzc3Vlcy8xOTU3N1xuICAgICAgICBkb2NrZXJDbWQgKz0gYC0tbmV0d29yayAke3RoaXMuX3NlcnZpY2VOZXR3b3JrSWR9IGA7XG4gICAgICAgIGZvciAoY29uc3QgYWxpYXMgb2YgYWxpYXNlcykge1xuICAgICAgICAgICAgZG9ja2VyQ21kICs9IGAtLW5ldHdvcmstYWxpYXMgJHthbGlhc30gYDtcbiAgICAgICAgfVxuXG4gICAgICAgIGRvY2tlckNtZCArPSBgJHtzZXJ2aWNlTmFtZX0gYDtcblxuICAgICAgICBpZiAoc2VydmljZUVudHJ5cG9pbnQ/Lmxlbmd0aCA/PyAwID4gMSkge1xuICAgICAgICAgICAgc2VydmljZUVudHJ5cG9pbnQ/LnNsaWNlKDEpLmZvckVhY2goKGUpID0+IHtcbiAgICAgICAgICAgICAgICBkb2NrZXJDbWQgKz0gYFwiJHtlfVwiIGA7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICAoc2VydmljZS5jb21tYW5kID8/IFtdKS5mb3JFYWNoKChlKSA9PiBkb2NrZXJDbWQgKz0gYFwiJHtlLnJlcGxhY2UoL1xcJC9nLCBcIlxcXFwkXCIpfVwiIGApO1xuXG4gICAgICAgIGNvbnN0IHRpbWUgPSBwcm9jZXNzLmhydGltZSgpO1xuXG4gICAgICAgIGNvbnN0IHtzdGRvdXQ6IGNvbnRhaW5lcklkfSA9IGF3YWl0IFV0aWxzLmJhc2goZG9ja2VyQ21kLCBjd2QpO1xuICAgICAgICB0aGlzLl9jb250YWluZXJzVG9DbGVhbi5wdXNoKGNvbnRhaW5lcklkKTtcblxuICAgICAgICBmb3IgKGNvbnN0IG5ldHdvcmsgb2YgdGhpcy5hcmd2Lm5ldHdvcmspIHtcbiAgICAgICAgICAgIGF3YWl0IFV0aWxzLnNwYXduKFt0aGlzLmFyZ3YuY29udGFpbmVyRXhlY3V0YWJsZSwgXCJuZXR3b3JrXCIsIFwiY29ubmVjdFwiLCBuZXR3b3JrLCBgJHtjb250YWluZXJJZH1gXSk7XG4gICAgICAgIH1cblxuICAgICAgICBhd2FpdCBVdGlscy5zcGF3bihbdGhpcy5hcmd2LmNvbnRhaW5lckV4ZWN1dGFibGUsIFwic3RhcnRcIiwgYCR7Y29udGFpbmVySWR9YF0pO1xuXG4gICAgICAgIGNvbnN0IGVuZFRpbWUgPSBwcm9jZXNzLmhydGltZSh0aW1lKTtcbiAgICAgICAgd3JpdGVTdHJlYW1zLnN0ZG91dChjaGFsa2Ake3RoaXMuZm9ybWF0dGVkSm9iTmFtZX0ge21hZ2VudGFCcmlnaHQgc3RhcnRlZCBzZXJ2aWNlIGltYWdlOiAke3NlcnZpY2VOYW1lfSB3aXRoIGFsaWFzZXM6ICR7QXJyYXkuZnJvbShhbGlhc2VzKS5qb2luKFwiLCBcIil9fSBpbiB7bWFnZW50YSAke3ByZXR0eUhydGltZShlbmRUaW1lKX19XFxuYCk7XG5cbiAgICAgICAgcmV0dXJuIGNvbnRhaW5lcklkO1xuICAgIH1cblxuICAgIHByaXZhdGUgYXN5bmMgc2VydmljZUhlYWx0aENoZWNrICh3cml0ZVN0cmVhbXM6IFdyaXRlU3RyZWFtcywgc2VydmljZTogU2VydmljZSwgc2VydmljZUluZGV4OiBudW1iZXIsIHNlcnZpY2VDb250YWluZXJMb2dGaWxlOiBzdHJpbmcpIHtcbiAgICAgICAgY29uc3Qgc2VydmljZUFsaWFzID0gc2VydmljZS5hbGlhcztcbiAgICAgICAgY29uc3Qgc2VydmljZU5hbWUgPSBzZXJ2aWNlLm5hbWU7XG5cbiAgICAgICAgY29uc3Qge3N0ZG91dH0gPSBhd2FpdCBVdGlscy5zcGF3bihbdGhpcy5hcmd2LmNvbnRhaW5lckV4ZWN1dGFibGUsIFwiaW1hZ2VcIiwgXCJpbnNwZWN0XCIsIHNlcnZpY2VOYW1lXSk7XG4gICAgICAgIGNvbnN0IGltYWdlSW5zcGVjdCA9IEpTT04ucGFyc2Uoc3Rkb3V0KTtcblxuICAgICAgICAvLyBDb3BpZWQgZnJvbSB0aGUgc3RhcnRTZXJ2aWNlIGJsb2NrLiBJbXBvcnRhbnQgdGhpbmcgaXMgdGhhdCB0aGUgYWxpYXNlcyBtYXRjaFxuICAgICAgICBjb25zdCBzZXJ2aWNlTmFtZVdpdGhvdXRWZXJzaW9uID0gc2VydmljZU5hbWUucmVwbGFjZSgvKC4qKSg6LiopLywgXCIkMVwiKTtcbiAgICAgICAgY29uc3QgYWxpYXNlcyA9IFtzZXJ2aWNlTmFtZVdpdGhvdXRWZXJzaW9uLnJlcGxhY2VBbGwoXCIvXCIsIFwiLVwiKSwgc2VydmljZU5hbWVXaXRob3V0VmVyc2lvbi5yZXBsYWNlQWxsKFwiL1wiLCBcIl9fXCIpXTtcbiAgICAgICAgaWYgKHNlcnZpY2VBbGlhcykge1xuICAgICAgICAgICAgYWxpYXNlcy5wdXNoKHNlcnZpY2VBbGlhcyk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCB1bmlxdWVBbGlhcyA9IGFsaWFzZXNbYWxpYXNlcy5sZW5ndGggLSAxXTtcblxuICAgICAgICBpZiAoKGltYWdlSW5zcGVjdFswXT8uQ29uZmlnPy5FeHBvc2VkUG9ydHMgPz8gbnVsbCkgPT09IG51bGwpIHtcbiAgICAgICAgICAgIHJldHVybiB3cml0ZVN0cmVhbXMuc3RkZXJyKGNoYWxrYCR7dGhpcy5mb3JtYXR0ZWRKb2JOYW1lfSB7eWVsbG93IENvdWxkIG5vdCBmaW5kIGV4cG9zZWQgdGNwIHBvcnRzICR7c2VydmljZU5hbWV9fVxcbmApO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgdGltZSA9IHByb2Nlc3MuaHJ0aW1lKCk7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICAvLyBJdGVyYXRlIG92ZXIgZWFjaCBwb3J0IGRlZmluZWQgaW4gdGhlIGltYWdlLCBhbmQgdHJ5IHRvIGNvbm5lY3QgdG8gdGhlIGFsaWFzXG4gICAgICAgICAgICBhd2FpdCBQcm9taXNlLmFueShPYmplY3Qua2V5cyhpbWFnZUluc3BlY3RbMF0uQ29uZmlnLkV4cG9zZWRQb3J0cykubWFwKChwb3J0KSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKCFwb3J0LmVuZHNXaXRoKFwiL3RjcFwiKSkgcmV0dXJuO1xuICAgICAgICAgICAgICAgIGNvbnN0IHBvcnROdW0gPSBwYXJzZUludChwb3J0LnJlcGxhY2UoXCIvdGNwXCIsIFwiXCIpKTtcbiAgICAgICAgICAgICAgICBjb25zdCBzcGF3bkNtZCA9IFt0aGlzLmFyZ3YuY29udGFpbmVyRXhlY3V0YWJsZSwgXCJydW5cIiwgXCItLXJtXCIsIGAtLW5hbWU9Z2NsLXdhaXQtZm9yLWl0LSR7dGhpcy5qb2JJZH0tJHtzZXJ2aWNlSW5kZXh9LSR7cG9ydE51bX1gLCBcIi0tbmV0d29ya1wiLCBgJHt0aGlzLl9zZXJ2aWNlTmV0d29ya0lkfWAsIFwiZG9ja2VyLmlvL3N1bWluYTQ2L3dhaXQtZm9yLWl0XCIsIGAke3VuaXF1ZUFsaWFzfToke3BvcnROdW19YCwgXCItdFwiLCBcIjMwXCJdO1xuICAgICAgICAgICAgICAgIHJldHVybiBVdGlscy5zcGF3bihzcGF3bkNtZCk7XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgICAgICBjb25zdCBlbmRUaW1lID0gcHJvY2Vzcy5ocnRpbWUodGltZSk7XG4gICAgICAgICAgICB3cml0ZVN0cmVhbXMuc3Rkb3V0KGNoYWxrYCR7dGhpcy5mb3JtYXR0ZWRKb2JOYW1lfSB7Z3JlZW5CcmlnaHQgc2VydmljZSBpbWFnZTogJHtzZXJ2aWNlTmFtZX0gaGVhbHRoY2hlY2sgcGFzc2VkIGluIHtncmVlbiAke3ByZXR0eUhydGltZShlbmRUaW1lKX19fVxcbmApO1xuICAgICAgICB9IGNhdGNoIChlOiBhbnkpIHtcbiAgICAgICAgICAgIGlmICghKGUgaW5zdGFuY2VvZiBBZ2dyZWdhdGVFcnJvcikpIHRocm93IGU7XG4gICAgICAgICAgICBlLmVycm9ycy5mb3JFYWNoKChzaW5nbGVFcnJvcjogRXJyb3IpID0+IHtcbiAgICAgICAgICAgICAgICB3cml0ZVN0cmVhbXMuc3Rkb3V0KGNoYWxrYCR7dGhpcy5mb3JtYXR0ZWRKb2JOYW1lfSB7cmVkQnJpZ2h0IHNlcnZpY2UgaW1hZ2U6ICR7c2VydmljZU5hbWV9IGhlYWx0aGNoZWNrIGZhaWxlZH1cXG5gKTtcbiAgICAgICAgICAgICAgICBzaW5nbGVFcnJvci5tZXNzYWdlLnNwbGl0KC9cXHI/XFxuL2cpLmZvckVhY2goKGxpbmU6IHN0cmluZykgPT4ge1xuICAgICAgICAgICAgICAgICAgICB3cml0ZVN0cmVhbXMuc3Rkb3V0KGNoYWxrYCR7dGhpcy5mb3JtYXR0ZWRKb2JOYW1lfSB7cmVkQnJpZ2h0ICAgJHtsaW5lfX1cXG5gKTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB3cml0ZVN0cmVhbXMuc3Rkb3V0KGNoYWxrYCR7dGhpcy5mb3JtYXR0ZWRKb2JOYW1lfSB7cmVkQnJpZ2h0IGFsc28gc2VlICgke3NlcnZpY2VDb250YWluZXJMb2dGaWxlfSl9XFxuYCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgICAgIC8vIEtpbGwgYWxsIHdhaXQtZm9yLWl0IGNvbnRhaW5lcnMsIHdoZW4gb25lIGhhdmUgYmVlbiBzdWNjZXNzZnVsXG4gICAgICAgICAgICBhd2FpdCBQcm9taXNlLmFsbFNldHRsZWQoT2JqZWN0LmtleXMoaW1hZ2VJbnNwZWN0WzBdLkNvbmZpZy5FeHBvc2VkUG9ydHMpLm1hcCgocG9ydCkgPT4ge1xuICAgICAgICAgICAgICAgIGlmICghcG9ydC5lbmRzV2l0aChcIi90Y3BcIikpIHJldHVybjtcbiAgICAgICAgICAgICAgICBjb25zdCBwb3J0TnVtID0gcGFyc2VJbnQocG9ydC5yZXBsYWNlKFwiL3RjcFwiLCBcIlwiKSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFV0aWxzLnNwYXduKFt0aGlzLmFyZ3YuY29udGFpbmVyRXhlY3V0YWJsZSwgXCJybVwiLCBcIi12ZlwiLCBgZ2NsLXdhaXQtZm9yLWl0LSR7dGhpcy5qb2JJZH0tJHtzZXJ2aWNlSW5kZXh9LSR7cG9ydE51bX1gXSk7XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH1cbiAgICB9XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBjbGVhbnVwSm9iUmVzb3VyY2VzIChqb2JzPzogSXRlcmFibGU8Sm9iPikge1xuICAgIGlmICgham9icykgcmV0dXJuO1xuICAgIGNvbnN0IHByb21pc2VzID0gW107XG4gICAgZm9yIChjb25zdCBqb2Igb2Ygam9icykge1xuICAgICAgICBwcm9taXNlcy5wdXNoKGpvYi5jbGVhbnVwUmVzb3VyY2VzKCkpO1xuICAgIH1cbiAgICBhd2FpdCBQcm9taXNlLmFsbChwcm9taXNlcyk7XG59XG4iXX0=
1139
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiam9iLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiam9iLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sS0FBSyxNQUFNLE9BQU8sQ0FBQztBQUMxQixPQUFPLEtBQUssTUFBTSxNQUFNLFFBQVEsQ0FBQztBQUNqQyxPQUFPLEVBQUUsTUFBTSxVQUFVLENBQUM7QUFDMUIsT0FBTyxZQUFZLE1BQU0sZUFBZSxDQUFDO0FBQ3pDLE9BQU8sTUFBTSxNQUFNLFFBQVEsQ0FBQztBQUM1QixPQUFPLEVBQUMsS0FBSyxFQUFDLE1BQU0sWUFBWSxDQUFDO0FBR2pDLE9BQU8sTUFBTSxFQUFFLEVBQUMsY0FBYyxFQUFDLE1BQU0sUUFBUSxDQUFDO0FBQzlDLE9BQU8sRUFBQyxLQUFLLEVBQUMsTUFBTSxZQUFZLENBQUM7QUFFakMsT0FBTyxLQUFLLE1BQU0sT0FBTyxDQUFDO0FBRTFCLE9BQU8sRUFBQywyQkFBMkIsRUFBRSw2QkFBNkIsRUFBRSx3QkFBd0IsRUFBQyxNQUFNLG9CQUFvQixDQUFDO0FBRXhILE1BQU0sY0FBYyxHQUFHLGFBQWEsQ0FBQztBQUNyQyxNQUFNLDRCQUE0QixHQUFHLDZCQUE2QixDQUFDO0FBMENuRSxNQUFNLGFBQWEsR0FBRyxJQUFJLElBQUksQ0FBQyxjQUFjLENBQUMsU0FBUyxFQUFFO0lBQ3JELElBQUksRUFBRSxTQUFTO0lBQ2YsS0FBSyxFQUFFLFNBQVM7SUFDaEIsSUFBSSxFQUFFLFNBQVM7SUFDZixNQUFNLEVBQUUsU0FBUztJQUNqQixNQUFNLEVBQUUsU0FBUztJQUNqQixNQUFNLEVBQUUsS0FBSztDQUNoQixDQUFDLENBQUM7QUFXSCxNQUFNLE9BQU8sR0FBRztJQUNKLGFBQWE7UUFDakIsT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsR0FBRyxPQUFPLENBQUMsQ0FBQztJQUMvQyxDQUFDO0lBRUQsTUFBTSxDQUFVLGVBQWUsR0FBRyxJQUFJLEdBQUcsQ0FBQztRQUN0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RSxDQUFDLENBQUM7SUFDMUMsQ0FBQztJQUNELE1BQU0sT0FBTyxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUMsQ0FBQztBQUNoQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IGNoYWxrIGZyb20gXCJjaGFsa1wiO1xuaW1wb3J0ICogYXMgZG90ZW52IGZyb20gXCJkb3RlbnZcIjtcbmltcG9ydCBmcyBmcm9tIFwiZnMtZXh0cmFcIjtcbmltcG9ydCBwcmV0dHlIcnRpbWUgZnJvbSBcInByZXR0eS1ocnRpbWVcIjtcbmltcG9ydCBzcGxpdDIgZnJvbSBcInNwbGl0MlwiO1xuaW1wb3J0IHtVdGlsc30gZnJvbSBcIi4vdXRpbHMuanNcIjtcbmltcG9ydCB7V3JpdGVTdHJlYW1zfSBmcm9tIFwiLi93cml0ZS1zdHJlYW1zLmpzXCI7XG5pbXBvcnQge0dpdERhdGF9IGZyb20gXCIuL2dpdC1kYXRhLmpzXCI7XG5pbXBvcnQgYXNzZXJ0LCB7QXNzZXJ0aW9uRXJyb3J9IGZyb20gXCJhc3NlcnRcIjtcbmltcG9ydCB7TXV0ZXh9IGZyb20gXCIuL211dGV4LmpzXCI7XG5pbXBvcnQge0FyZ3Z9IGZyb20gXCIuL2FyZ3YuanNcIjtcbmltcG9ydCBleGVjYSBmcm9tIFwiZXhlY2FcIjtcbmltcG9ydCB7Q0lDRFZhcmlhYmxlfSBmcm9tIFwiLi92YXJpYWJsZXMtZnJvbS1maWxlcy5qc1wiO1xuaW1wb3J0IHtHaXRsYWJSdW5uZXJDUFVzUHJlc2V0VmFsdWUsIEdpdGxhYlJ1bm5lck1lbW9yeVByZXNldFZhbHVlLCBHaXRsYWJSdW5uZXJQcmVzZXRWYWx1ZXN9IGZyb20gXCIuL2dpdGxhYi1wcmVzZXQuanNcIjtcblxuY29uc3QgQ0lfUFJPSkVDVF9ESVIgPSBcIi9nY2wtYnVpbGRzXCI7XG5jb25zdCBHQ0xfU0hFTExfUFJPTVBUX1BMQUNFSE9MREVSID0gXCI8Z2NsU2hlbGxQcm9tcHRQbGFjZWhvbGRlcj5cIjtcbmludGVyZmFjZSBKb2JPcHRpb25zIHtcbiAgICBhcmd2OiBBcmd2O1xuICAgIHdyaXRlU3RyZWFtczogV3JpdGVTdHJlYW1zO1xuICAgIGRhdGE6IGFueTtcbiAgICBuYW1lOiBzdHJpbmc7XG4gICAgYmFzZU5hbWU6IHN0cmluZztcbiAgICBwaXBlbGluZUlpZDogbnVtYmVyO1xuICAgIGdpdERhdGE6IEdpdERhdGE7XG4gICAgZ2xvYmFsVmFyaWFibGVzOiB7W25hbWU6IHN0cmluZ106IHN0cmluZ307XG4gICAgdmFyaWFibGVzRnJvbUZpbGVzOiB7W25hbWU6IHN0cmluZ106IENJQ0RWYXJpYWJsZX07XG4gICAgcHJlZGVmaW5lZFZhcmlhYmxlczoge1tuYW1lOiBzdHJpbmddOiBhbnl9O1xuICAgIG1hdHJpeFZhcmlhYmxlczoge1trZXk6IHN0cmluZ106IHN0cmluZ30gfCBudWxsO1xuICAgIG5vZGVJbmRleDogbnVtYmVyIHwgbnVsbDtcbiAgICBub2Rlc1RvdGFsOiBudW1iZXI7XG4gICAgZXhwYW5kVmFyaWFibGVzOiBib29sZWFuO1xufVxuXG5pbnRlcmZhY2UgQ2FjaGUge1xuICAgIHBvbGljeTogXCJwdWxsXCIgfCBcInB1bGwtcHVzaFwiIHwgXCJwdXNoXCI7XG4gICAga2V5OiBzdHJpbmcgfCB7ZmlsZXM6IHN0cmluZ1tdfTtcbiAgICBwYXRoczogc3RyaW5nW107XG4gICAgd2hlbjogXCJvbl9zdWNjZXNzXCIgfCBcIm9uX2ZhaWx1cmVcIiB8IFwiYWx3YXlzXCI7XG59XG5cbmludGVyZmFjZSBTZXJ2aWNlIHtcbiAgICBuYW1lOiBzdHJpbmc7XG4gICAgZW50cnlwb2ludDogc3RyaW5nW10gfCBudWxsO1xuICAgIGNvbW1hbmQ6IHN0cmluZ1tdIHwgbnVsbDtcbiAgICBhbGlhczogc3RyaW5nIHwgbnVsbDtcbiAgICB2YXJpYWJsZXM6IHtbbmFtZTogc3RyaW5nXTogc3RyaW5nfTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBOZWVkIHtcbiAgICBqb2I6IHN0cmluZztcbiAgICBhcnRpZmFjdHM6IGJvb2xlYW47XG4gICAgb3B0aW9uYWw/OiBib29sZWFuO1xuICAgIHJlZj86IHN0cmluZztcbiAgICBwaXBlbGluZT86IHN0cmluZztcbiAgICBwcm9qZWN0Pzogc3RyaW5nO1xufVxuXG5jb25zdCBkYXRlRm9ybWF0dGVyID0gbmV3IEludGwuRGF0ZVRpbWVGb3JtYXQodW5kZWZpbmVkLCB7XG4gICAgeWVhcjogdW5kZWZpbmVkLFxuICAgIG1vbnRoOiB1bmRlZmluZWQsXG4gICAgaG91cjogXCJudW1lcmljXCIsXG4gICAgbWludXRlOiBcIm51bWVyaWNcIixcbiAgICBzZWNvbmQ6IFwibnVtZXJpY1wiLFxuICAgIGhvdXIxMjogZmFsc2UsXG59KTtcblxuZXhwb3J0IHR5cGUgSm9iUnVsZSA9IHtcbiAgICBpZj86IHN0cmluZztcbiAgICB3aGVuPzogc3RyaW5nO1xuICAgIGNoYW5nZXM/OiBzdHJpbmdbXSB8IHtwYXRoczogc3RyaW5nW119O1xuICAgIGV4aXN0cz86IHN0cmluZ1tdO1xuICAgIGFsbG93X2ZhaWx1cmU/OiBib29sZWFuO1xuICAgIHZhcmlhYmxlcz86IHtbbmFtZTogc3RyaW5nXTogc3RyaW5nfTtcbn07XG5cbmV4cG9ydCBjbGFzcyBKb2Ige1xuICAgIHByaXZhdGUgZ2VuZXJhdGVKb2JJZCAoKTogbnVtYmVyIHtcbiAgICAgICAgcmV0dXJuIE1hdGguZmxvb3IoTWF0aC5yYW5kb20oKSAqIDEwMDAwMDApO1xuICAgIH1cblxuICAgIHN0YXRpYyByZWFkb25seSBpbGxlZ2FsSm9iTmFtZXMgPSBuZXcgU2V0KFtcbiAgICAgICAgXCJpbmNsdWRlXCIsIFwibG9jYWxfY29uZmlndXJhdGlvblwiLCBcImltYWdlXCIsIFwic2VydmljZXNcIixcbiAgICAgICAgXCJzdGFnZXNcIiwgXCJiZWZvcmVfc2NyaXB0XCIsIFwiZGVmYXVsdFwiLFxuICAgICAgICBcImFmdGVyX3NjcmlwdFwiLCBcInZhcmlhYmxlc1wiLCBcImNhY2hlXCIsIFwid29ya2Zsb3dcIiwgXCJwYWdlOmRlcGxveVwiLFxuICAgIF0pO1xuXG4gICAgcmVhZG9ubHkgYXJndjogQXJndjtcbiAgICByZWFkb25seSBuYW1lOiBzdHJpbmc7XG4gICAgcmVhZG9ubHkgYmFzZU5hbWU6IHN0cmluZztcbiAgICByZWFkb25seSBkZXBlbmRlbmNpZXM6IHN0cmluZ1tdIHwgbnVsbDtcbiAgICByZWFkb25seSBlbnZpcm9ubWVudD86IHtuYW1lOiBzdHJpbmc7IHVybDogc3RyaW5nIHwgbnVsbDsgZGVwbG95bWVudF90aWVyOiBzdHJpbmcgfCBudWxsOyBhY3Rpb246IHN0cmluZyB8IG51bGx9O1xuICAgIHJlYWRvbmx5IGpvYklkOiBudW1iZXI7XG4gICAgcmVhZG9ubHkgcnVsZXM/OiBKb2JSdWxlW107XG5cbiAgICByZWFkb25seSBhbGxvd0ZhaWx1cmU6IGJvb2xlYW4gfCB7XG4gICAgICAgIGV4aXRfY29kZXM6IG51bWJlciB8IG51bWJlcltdO1xuICAgIH07XG4gICAgcmVhZG9ubHkgd2hlbjogc3RyaW5nO1xuICAgIHJlYWRvbmx5IGV4aXN0czogc3RyaW5nW107XG4gICAgcmVhZG9ubHkgcGlwZWxpbmVJaWQ6IG51bWJlcjtcbiAgICByZWFkb25seSBnaXREYXRhOiBHaXREYXRhO1xuICAgIHJlYWRvbmx5IGluaGVyaXQ6IHtcbiAgICAgICAgdmFyaWFibGVzPzogYm9vbGVhbiB8IHN0cmluZ1tdO1xuICAgICAgICBkZWZhdWx0PzogYm9vbGVhbiB8IHN0cmluZ1tdO1xuICAgIH07XG5cbiAgICBwcml2YXRlIHJlYWRvbmx5IF9nbG9iYWxWYXJpYWJsZXM6IHtba2V5OiBzdHJpbmddOiBzdHJpbmd9ID0ge307XG4gICAgcHJpdmF0ZSByZWFkb25seSBfdmFyaWFibGVzOiB7W2tleTogc3RyaW5nXTogc3RyaW5nfSA9IHt9O1xuICAgIHByaXZhdGUgX2RvdGVudlZhcmlhYmxlczoge1trZXk6IHN0cmluZ106IHN0cmluZ30gPSB7fTtcbiAgICBwcml2YXRlIF9wcmVzY3JpcHRzRXhpdENvZGU6IG51bWJlciB8IG51bGwgPSBudWxsO1xuICAgIHByaXZhdGUgX2FmdGVyU2NyaXB0c0V4aXRDb2RlID0gMDtcbiAgICBwcml2YXRlIF9jb3ZlcmFnZVBlcmNlbnQ6IHN0cmluZyB8IG51bGwgPSBudWxsO1xuICAgIHByaXZhdGUgX3J1bm5pbmcgPSBmYWxzZTtcbiAgICBwcml2YXRlIF9jb250YWluZXJJZDogc3RyaW5nIHwgbnVsbCA9IG51bGw7XG4gICAgcHJpdmF0ZSBfc2VydmljZU5ldHdvcmtJZDogc3RyaW5nIHwgbnVsbCA9IG51bGw7XG4gICAgcHJpdmF0ZSBfY29udGFpbmVyVm9sdW1lTmFtZXM6IHN0cmluZ1tdID0gW107XG4gICAgcHJpdmF0ZSBfbG9uZ1J1bm5pbmdTaWxlbnRUaW1lb3V0OiBOb2RlSlMuVGltZW91dCA9IC0xIGFzIGFueTtcbiAgICBwcml2YXRlIF9wcm9kdWNlcnM6IHtuYW1lOiBzdHJpbmc7IGRvdGVudjogc3RyaW5nIHwgbnVsbH1bXSB8IG51bGwgPSBudWxsO1xuICAgIHByaXZhdGUgX2pvYk5hbWVQYWQ6IG51bWJlciB8IG51bGwgPSBudWxsO1xuXG4gICAgcHJpdmF0ZSBfY29udGFpbmVyc1RvQ2xlYW46IHN0cmluZ1tdID0gW107XG4gICAgcHJpdmF0ZSBfZmlsZXNUb1JtOiBzdHJpbmdbXSA9IFtdO1xuICAgIHByaXZhdGUgX3N0YXJ0VGltZT86IFtudW1iZXIsIG51bWJlcl07XG4gICAgcHJpdmF0ZSBfZW5kVGltZT86IFtudW1iZXIsIG51bWJlcl07XG5cbiAgICBwcml2YXRlIHJlYWRvbmx5IGpvYkRhdGE6IGFueTtcbiAgICBwcml2YXRlIHJlYWRvbmx5IHdyaXRlU3RyZWFtczogV3JpdGVTdHJlYW1zO1xuXG4gICAgY29uc3RydWN0b3IgKG9wdDogSm9iT3B0aW9ucykge1xuICAgICAgICBjb25zdCBqb2JEYXRhID0gb3B0LmRhdGE7XG4gICAgICAgIGNvbnN0IGdpdERhdGEgPSBvcHQuZ2l0RGF0YTtcbiAgICAgICAgY29uc3Qgam9iVmFyaWFibGVzID0gam9iRGF0YS52YXJpYWJsZXMgPz8ge307XG4gICAgICAgIGNvbnN0IHZhcmlhYmxlc0Zyb21GaWxlcyA9IG9wdC52YXJpYWJsZXNGcm9tRmlsZXM7XG4gICAgICAgIGNvbnN0IGFyZ3YgPSBvcHQuYXJndjtcbiAgICAgICAgY29uc3QgY3dkID0gYXJndi5jd2Q7XG4gICAgICAgIGNvbnN0IHN0YXRlRGlyID0gYXJndi5zdGF0ZURpcjtcbiAgICAgICAgY29uc3QgYXJndlZhcmlhYmxlcyA9IGFyZ3YudmFyaWFibGU7XG4gICAgICAgIGNvbnN0IHByZWRlZmluZWRWYXJpYWJsZXMgPSBvcHQucHJlZGVmaW5lZFZhcmlhYmxlcztcbiAgICAgICAgY29uc3QgZXhwYW5kVmFyaWFibGVzID0gb3B0LmV4cGFuZFZhcmlhYmxlcyA/PyB0cnVlO1xuXG4gICAgICAgIHRoaXMuYXJndiA9IGFyZ3Y7XG4gICAgICAgIHRoaXMud3JpdGVTdHJlYW1zID0gb3B0LndyaXRlU3RyZWFtcztcbiAgICAgICAgdGhpcy5naXREYXRhID0gb3B0LmdpdERhdGE7XG4gICAgICAgIHRoaXMubmFtZSA9IG9wdC5uYW1lO1xuICAgICAgICB0aGlzLmJhc2VOYW1lID0gb3B0LmJhc2VOYW1lO1xuICAgICAgICB0aGlzLmpvYklkID0gdGhpcy5nZW5lcmF0ZUpvYklkKCk7XG4gICAgICAgIHRoaXMuam9iRGF0YSA9IG9wdC5kYXRhO1xuICAgICAgICB0aGlzLnBpcGVsaW5lSWlkID0gb3B0LnBpcGVsaW5lSWlkO1xuICAgICAgICB0aGlzLl9nbG9iYWxWYXJpYWJsZXMgPSBvcHQuZ2xvYmFsVmFyaWFibGVzO1xuXG4gICAgICAgIHRoaXMuaW5oZXJpdCA9IHt9O1xuICAgICAgICB0aGlzLmluaGVyaXQudmFyaWFibGVzID0gdGhpcy5qb2JEYXRhLmluaGVyaXQ/LnZhcmlhYmxlcyA/PyB0cnVlO1xuICAgICAgICB0aGlzLmluaGVyaXQuZGVmYXVsdCA9IHRoaXMuam9iRGF0YS5pbmhlcml0Py5kZWZhdWx0ID8/IHRydWU7XG5cbiAgICAgICAgaWYgKHRoaXMuaW5oZXJpdC5kZWZhdWx0ID09PSBmYWxzZSkge1xuICAgICAgICAgICAgdGhpcy53cml0ZVN0cmVhbXMubWVtb1N0ZG91dChjaGFsa2B7YmxhY2suYmdZZWxsb3dCcmlnaHQgIFdBUk4gfSBcXGAuaW5oZXJpdC5kZWZhdWx0XFxgIGhhcyBub3QgYmVlbiBpbXBsZW1lbnRlZCFcXG5gKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMud2hlbiA9IGpvYkRhdGEud2hlbiB8fCBcIm9uX3N1Y2Nlc3NcIjtcbiAgICAgICAgdGhpcy5leGlzdHMgPSBqb2JEYXRhLmV4aXN0cyB8fCBbXTtcbiAgICAgICAgdGhpcy5hbGxvd0ZhaWx1cmUgPSBqb2JEYXRhLmFsbG93X2ZhaWx1cmUgPz8gZmFsc2U7XG4gICAgICAgIHRoaXMuZGVwZW5kZW5jaWVzID0gam9iRGF0YS5kZXBlbmRlbmNpZXMgfHwgbnVsbDtcbiAgICAgICAgdGhpcy5ydWxlcyA9IGpvYkRhdGEucnVsZXMgfHwgbnVsbDtcbiAgICAgICAgdGhpcy5lbnZpcm9ubWVudCA9IHR5cGVvZiBqb2JEYXRhLmVudmlyb25tZW50ID09PSBcInN0cmluZ1wiID8ge25hbWU6IGpvYkRhdGEuZW52aXJvbm1lbnR9IDogam9iRGF0YS5lbnZpcm9ubWVudDtcblxuICAgICAgICBjb25zdCBtYXRyaXhWYXJpYWJsZXMgPSBvcHQubWF0cml4VmFyaWFibGVzID8/IHt9O1xuICAgICAgICBjb25zdCBmaWxlVmFyaWFibGVzID0gVXRpbHMuZmluZEVudk1hdGNoZWRWYXJpYWJsZXModmFyaWFibGVzRnJvbUZpbGVzLCB0aGlzLmZpbGVWYXJpYWJsZXNEaXIpO1xuICAgICAgICB0aGlzLl92YXJpYWJsZXMgPSB7Li4udGhpcy5nbG9iYWxWYXJpYWJsZXMsIC4uLmpvYlZhcmlhYmxlcywgLi4ubWF0cml4VmFyaWFibGVzLCAuLi5wcmVkZWZpbmVkVmFyaWFibGVzLCAuLi5maWxlVmFyaWFibGVzLCAuLi5hcmd2VmFyaWFibGVzfTtcblxuICAgICAgICBsZXQgY2lQcm9qZWN0RGlyID0gYCR7Y3dkfWA7XG4gICAgICAgIGlmICh0aGlzLmpvYkRhdGFbXCJpbWFnZVwiXSkge1xuICAgICAgICAgICAgY2lQcm9qZWN0RGlyID0gQ0lfUFJPSkVDVF9ESVI7XG4gICAgICAgIH0gZWxzZSBpZiAoYXJndi5zaGVsbElzb2xhdGlvbikge1xuICAgICAgICAgICAgY2lQcm9qZWN0RGlyID0gYCR7Y3dkfS8ke3N0YXRlRGlyfS9idWlsZHMvJHt0aGlzLnNhZmVKb2JOYW1lfWA7XG4gICAgICAgIH1cblxuICAgICAgICBwcmVkZWZpbmVkVmFyaWFibGVzW1wiQ0lfSk9CX0lEXCJdID0gYCR7dGhpcy5qb2JJZH1gO1xuICAgICAgICBwcmVkZWZpbmVkVmFyaWFibGVzW1wiQ0lfUElQRUxJTkVfSURcIl0gPSBgJHt0aGlzLnBpcGVsaW5lSWlkICsgMTAwMH1gO1xuICAgICAgICBwcmVkZWZpbmVkVmFyaWFibGVzW1wiQ0lfUElQRUxJTkVfSUlEXCJdID0gYCR7dGhpcy5waXBlbGluZUlpZH1gO1xuICAgICAgICBwcmVkZWZpbmVkVmFyaWFibGVzW1wiQ0lfSk9CX05BTUVcIl0gPSBgJHt0aGlzLm5hbWV9YDtcbiAgICAgICAgcHJlZGVmaW5lZFZhcmlhYmxlc1tcIkNJX0pPQl9OQU1FX1NMVUdcIl0gPSBgJHt0aGlzLm5hbWUucmVwbGFjZSgvW15hLXpcXGRdKy9pZywgXCItXCIpLnJlcGxhY2UoL14tLywgXCJcIikuc2xpY2UoMCwgNjMpLnJlcGxhY2UoLy0kLywgXCJcIikudG9Mb3dlckNhc2UoKX1gO1xuICAgICAgICBwcmVkZWZpbmVkVmFyaWFibGVzW1wiQ0lfSk9CX1NUQUdFXCJdID0gYCR7dGhpcy5zdGFnZX1gO1xuICAgICAgICBwcmVkZWZpbmVkVmFyaWFibGVzW1wiQ0lfUFJPSkVDVF9ESVJcIl0gPSBjaVByb2plY3REaXI7XG4gICAgICAgIHByZWRlZmluZWRWYXJpYWJsZXNbXCJDSV9KT0JfVVJMXCJdID0gYCR7dGhpcy5fdmFyaWFibGVzW1wiQ0lfU0VSVkVSX1VSTFwiXX0vJHtnaXREYXRhLnJlbW90ZS5ncm91cH0vJHtnaXREYXRhLnJlbW90ZS5wcm9qZWN0fS8tL2pvYnMvJHt0aGlzLmpvYklkfWA7IC8vIENoYW5nZXMgb24gcmVydW4uXG4gICAgICAgIHByZWRlZmluZWRWYXJpYWJsZXNbXCJDSV9QSVBFTElORV9VUkxcIl0gPSBgJHt0aGlzLl92YXJpYWJsZXNbXCJDSV9TRVJWRVJfVVJMXCJdfS8ke2dpdERhdGEucmVtb3RlLmdyb3VwfS8ke2dpdERhdGEucmVtb3RlLnByb2plY3R9L3BpcGVsaW5lcy8ke3RoaXMucGlwZWxpbmVJaWR9YDtcbiAgICAgICAgcHJlZGVmaW5lZFZhcmlhYmxlc1tcIkNJX0VOVklST05NRU5UX05BTUVcIl0gPSB0aGlzLmVudmlyb25tZW50Py5uYW1lID8/IFwiXCI7XG4gICAgICAgIHByZWRlZmluZWRWYXJpYWJsZXNbXCJDSV9FTlZJUk9OTUVOVF9TTFVHXCJdID0gdGhpcy5lbnZpcm9ubWVudD8ubmFtZT8ucmVwbGFjZSgvW15hLXpcXGRdKy9pZywgXCItXCIpLnJlcGxhY2UoL14tLywgXCJcIikuc2xpY2UoMCwgMjMpLnJlcGxhY2UoLy0kLywgXCJcIikudG9Mb3dlckNhc2UoKSA/PyBcIlwiO1xuICAgICAgICBwcmVkZWZpbmVkVmFyaWFibGVzW1wiQ0lfRU5WSVJPTk1FTlRfVVJMXCJdID0gdGhpcy5lbnZpcm9ubWVudD8udXJsID8/IFwiXCI7XG4gICAgICAgIHByZWRlZmluZWRWYXJpYWJsZXNbXCJDSV9FTlZJUk9OTUVOVF9USUVSXCJdID0gdGhpcy5lbnZpcm9ubWVudD8uZGVwbG95bWVudF90aWVyID8/IFwiXCI7XG4gICAgICAgIHByZWRlZmluZWRWYXJpYWJsZXNbXCJDSV9FTlZJUk9OTUVOVF9BQ1RJT05cIl0gPSB0aGlzLmVudmlyb25tZW50Py5hY3Rpb24gPz8gXCJcIjtcblxuICAgICAgICBpZiAob3B0Lm5vZGVJbmRleCAhPT0gbnVsbCkge1xuICAgICAgICAgICAgcHJlZGVmaW5lZFZhcmlhYmxlc1tcIkNJX05PREVfSU5ERVhcIl0gPSBgJHtvcHQubm9kZUluZGV4fWA7XG4gICAgICAgIH1cbiAgICAgICAgcHJlZGVmaW5lZFZhcmlhYmxlc1tcIkNJX05PREVfVE9UQUxcIl0gPSBgJHtvcHQubm9kZXNUb3RhbH1gO1xuICAgICAgICBwcmVkZWZpbmVkVmFyaWFibGVzW1wiQ0lfUkVHSVNUUllcIl0gPSBgbG9jYWwtcmVnaXN0cnkuJHt0aGlzLmdpdERhdGEucmVtb3RlLmhvc3R9YDtcbiAgICAgICAgcHJlZGVmaW5lZFZhcmlhYmxlc1tcIkNJX1JFR0lTVFJZX0lNQUdFXCJdID0gYCRDSV9SRUdJU1RSWS8ke3RoaXMuX3ZhcmlhYmxlc1tcIkNJX1BST0pFQ1RfUEFUSFwiXS50b0xvd2VyQ2FzZSgpfWA7XG5cbiAgICAgICAgLy8gRXhwYW5kIHZhcmlhYmxlcyBpbiBydWxlczpjaGFuZ2VzXG4gICAgICAgIGlmICh0aGlzLnJ1bGVzICYmIGV4cGFuZFZhcmlhYmxlcykge1xuICAgICAgICAgICAgY29uc3QgZXhwYW5kZWQgPSBVdGlscy5leHBhbmRWYXJpYWJsZXModGhpcy5fdmFyaWFibGVzKTtcbiAgICAgICAgICAgIHRoaXMucnVsZXMuZm9yRWFjaCgocnVsZSwgcnVsZUlkeCwgcnVsZXMpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBjaGFuZ2VzID0gQXJyYXkuaXNBcnJheShydWxlLmNoYW5nZXMpID8gcnVsZS5jaGFuZ2VzIDogcnVsZS5jaGFuZ2VzPy5wYXRocztcbiAgICAgICAgICAgICAgICBpZiAoIWNoYW5nZXMpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGNoYW5nZXMuZm9yRWFjaCgoY2hhbmdlLCBjaGFuZ2VJZHgsIGNoYW5nZXMpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgY2hhbmdlc1tjaGFuZ2VJZHhdID0gVXRpbHMuZXhwYW5kVGV4dChjaGFuZ2UsIGV4cGFuZGVkKTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICBydWxlc1tydWxlSWR4XS5jaGFuZ2VzID0gY2hhbmdlcztcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gRmluZCBlbnZpcm9ubWVudCBtYXRjaGVkIHZhcmlhYmxlc1xuICAgICAgICBpZiAodGhpcy5lbnZpcm9ubWVudCAmJiBleHBhbmRWYXJpYWJsZXMpIHtcbiAgICAgICAgICAgIGNvbnN0IGV4cGFuZGVkID0gVXRpbHMuZXhwYW5kVmFyaWFibGVzKHRoaXMuX3ZhcmlhYmxlcyk7XG4gICAgICAgICAgICB0aGlzLmVudmlyb25tZW50Lm5hbWUgPSBVdGlscy5leHBhbmRUZXh0KHRoaXMuZW52aXJvbm1lbnQubmFtZSwgZXhwYW5kZWQpO1xuICAgICAgICAgICAgdGhpcy5lbnZpcm9ubWVudC51cmwgPSBVdGlscy5leHBhbmRUZXh0KHRoaXMuZW52aXJvbm1lbnQudXJsLCBleHBhbmRlZCk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgZW52TWF0Y2hlZFZhcmlhYmxlcyA9IFV0aWxzLmZpbmRFbnZNYXRjaGVkVmFyaWFibGVzKHZhcmlhYmxlc0Zyb21GaWxlcywgdGhpcy5maWxlVmFyaWFibGVzRGlyLCB0aGlzLmVudmlyb25tZW50KTtcblxuICAgICAgICAvLyBNZXJnZSBhbmQgZXhwYW5kIGFmdGVyIGZpbmRpbmcgZW52IG1hdGNoZWQgdmFyaWFibGVzXG4gICAgICAgIHRoaXMuX3ZhcmlhYmxlcyA9IHsuLi50aGlzLmdsb2JhbFZhcmlhYmxlcywgLi4uam9iVmFyaWFibGVzLCAuLi5tYXRyaXhWYXJpYWJsZXMsIC4uLnByZWRlZmluZWRWYXJpYWJsZXMsIC4uLmVudk1hdGNoZWRWYXJpYWJsZXMsIC4uLmFyZ3ZWYXJpYWJsZXN9O1xuXG4gICAgICAgIC8vIFNldCB7d2hlbiwgYWxsb3dGYWlsdXJlfSBiYXNlZCBvbiBydWxlcyByZXN1bHRcbiAgICAgICAgaWYgKHRoaXMucnVsZXMpIHtcbiAgICAgICAgICAgIGNvbnN0IHJ1bGVSZXN1bHQgPSBVdGlscy5nZXRSdWxlc1Jlc3VsdCh7Y3dkLCBydWxlczogdGhpcy5ydWxlcywgdmFyaWFibGVzOiB0aGlzLl92YXJpYWJsZXN9LCB0aGlzLmdpdERhdGEsIHRoaXMud2hlbiwgdGhpcy5hbGxvd0ZhaWx1cmUpO1xuICAgICAgICAgICAgdGhpcy53aGVuID0gcnVsZVJlc3VsdC53aGVuO1xuICAgICAgICAgICAgdGhpcy5hbGxvd0ZhaWx1cmUgPSBydWxlUmVzdWx0LmFsbG93RmFpbHVyZTtcbiAgICAgICAgICAgIHRoaXMuX3ZhcmlhYmxlcyA9IHsuLi50aGlzLmdsb2JhbFZhcmlhYmxlcywgLi4uam9iVmFyaWFibGVzLCAuLi5ydWxlUmVzdWx0LnZhcmlhYmxlcywgLi4ubWF0cml4VmFyaWFibGVzLCAuLi5wcmVkZWZpbmVkVmFyaWFibGVzLCAuLi5lbnZNYXRjaGVkVmFyaWFibGVzLCAuLi5hcmd2VmFyaWFibGVzfTtcbiAgICAgICAgfVxuICAgICAgICAvLyBEZWxldGUgdmFyaWFibGVzIHRoZSB1c2VyIGludGVudGlvbmFsbHkgd2FudHMgdW5zZXRcbiAgICAgICAgZm9yIChjb25zdCB1bnNldFZhcmlhYmxlIG9mIGFyZ3YudW5zZXRWYXJpYWJsZXMpIHtcbiAgICAgICAgICAgIGRlbGV0ZSB0aGlzLl92YXJpYWJsZXNbdW5zZXRWYXJpYWJsZV07XG4gICAgICAgIH1cblxuICAgICAgICBhc3NlcnQodGhpcy5zY3JpcHRzIHx8IHRoaXMudHJpZ2dlciwgY2hhbGtge2JsdWVCcmlnaHQgJHt0aGlzLm5hbWV9fSBtdXN0IGhhdmUgc2NyaXB0IHNwZWNpZmllZGApO1xuXG4gICAgICAgIGFzc2VydCghKHRoaXMuaW50ZXJhY3RpdmUgJiYgIXRoaXMuYXJndi5zaGVsbEV4ZWN1dG9yTm9JbWFnZSksIGNoYWxrYCR7dGhpcy5mb3JtYXR0ZWRKb2JOYW1lfSBASW50ZXJhY3RpdmUgZGVjb3JhdG9yIGNhbm5vdCBiZSB1c2VkIHdpdGggLS1uby1zaGVsbC1leGVjdXRvci1uby1pbWFnZWApO1xuXG4gICAgICAgIGlmICh0aGlzLmludGVyYWN0aXZlICYmICh0aGlzLndoZW4gIT09IFwibWFudWFsXCIgfHwgdGhpcy5pbWFnZU5hbWUodGhpcy5fdmFyaWFibGVzKSAhPT0gbnVsbCkpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBBc3NlcnRpb25FcnJvcih7bWVzc2FnZTogYCR7dGhpcy5mb3JtYXR0ZWRKb2JOYW1lfSBASW50ZXJhY3RpdmUgZGVjb3JhdG9yIGNhbm5vdCBoYXZlIGltYWdlOiBhbmQgbXVzdCBiZSB3aGVuOm1hbnVhbGB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLmluamVjdFNTSEFnZW50ICYmIHRoaXMuaW1hZ2VOYW1lKHRoaXMuX3ZhcmlhYmxlcykgPT09IG51bGwpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBBc3NlcnRpb25FcnJvcih7bWVzc2FnZTogYCR7dGhpcy5mb3JtYXR0ZWRKb2JOYW1lfSBASW5qZWN0U1NIQWdlbnQgY2FuIG9ubHkgYmUgdXNlZCB3aXRoIGltYWdlOmB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGV4cGFuZGVkID0gVXRpbHMuZXhwYW5kVmFyaWFibGVzKHRoaXMuX3ZhcmlhYmxlcyk7XG4gICAgICAgIGZvciAoY29uc3QgW2ksIGNdIG9mIE9iamVjdC5lbnRyaWVzPGFueT4odGhpcy5jYWNoZSkpIHtcbiAgICAgICAgICAgIGMucG9saWN5ID0gVXRpbHMuZXhwYW5kVGV4dChjLnBvbGljeSwgZXhwYW5kZWQpO1xuICAgICAgICAgICAgYXNzZXJ0KFtcInB1bGxcIiwgXCJwdXNoXCIsIFwicHVsbC1wdXNoXCJdLmluY2x1ZGVzKGMucG9saWN5KSwgY2hhbGtge2JsdWUgJHt0aGlzLm5hbWV9fSBjYWNoZVske2l9XS5wb2xpY3kgaXMgbm90ICdwdWxsJywgJ3B1c2gnIG9yICdwdWxsLXB1c2gnYCk7XG4gICAgICAgICAgICBhc3NlcnQoW1wib25fc3VjY2Vzc1wiLCBcIm9uX2ZhaWx1cmVcIiwgXCJhbHdheXNcIl0uaW5jbHVkZXMoYy53aGVuKSwgY2hhbGtge2JsdWUgJHt0aGlzLm5hbWV9fSBjYWNoZVske2l9XS53aGVuIGlzIG5vdCAnb25fc3VjY2VzcycsICdvbl9mYWlsdXJlJyBvciAnYWx3YXlzJ2ApO1xuICAgICAgICAgICAgYXNzZXJ0KEFycmF5LmlzQXJyYXkoYy5wYXRocyksIGNoYWxrYHtibHVlICR7dGhpcy5uYW1lfX0gY2FjaGVbJHtpfV0ucGF0aHMgbXVzdCBiZSBhcnJheWApO1xuICAgICAgICB9XG5cbiAgICAgICAgZm9yIChjb25zdCBbaSwgc10gb2YgT2JqZWN0LmVudHJpZXM8YW55Pih0aGlzLnNlcnZpY2VzKSkge1xuICAgICAgICAgICAgYXNzZXJ0KHMubmFtZSwgY2hhbGtge2JsdWUgJHt0aGlzLm5hbWV9fSBzZXJ2aWNlc1ske2l9XS5uYW1lIGlzIHVuZGVmaW5lZGApO1xuICAgICAgICAgICAgYXNzZXJ0KCFzLmNvbW1hbmQgfHwgQXJyYXkuaXNBcnJheShzLmNvbW1hbmQpLCBjaGFsa2B7Ymx1ZSAke3RoaXMubmFtZX19IHNlcnZpY2VzWyR7aX1dLmNvbW1hbmQgbXVzdCBiZSBhbiBhcnJheWApO1xuICAgICAgICAgICAgYXNzZXJ0KCFzLmVudHJ5cG9pbnQgfHwgQXJyYXkuaXNBcnJheShzLmVudHJ5cG9pbnQpLCBjaGFsa2B7Ymx1ZSAke3RoaXMubmFtZX19IHNlcnZpY2VzWyR7aX1dLmVudHJ5cG9pbnQgbXVzdCBiZSBhbiBhcnJheWApO1xuICAgICAgICB9XG5cbiAgICAgICAgYXNzZXJ0KCF0aGlzLmFydGlmYWN0cz8ucGF0aHMgfHwgQXJyYXkuaXNBcnJheSh0aGlzLmFydGlmYWN0cy5wYXRocyksIGNoYWxrYHtibHVlICR7dGhpcy5uYW1lfX0gYXJ0aWZhY3RzLnBhdGhzIG11c3QgYmUgYW4gYXJyYXlgKTtcblxuICAgICAgICBpZiAodGhpcy5pbWFnZU5hbWUodGhpcy5fdmFyaWFibGVzKSAmJiBhcmd2Lm1vdW50Q2FjaGUpIHtcbiAgICAgICAgICAgIGZvciAoY29uc3QgYyBvZiB0aGlzLmNhY2hlKSB7XG4gICAgICAgICAgICAgICAgYy5wYXRocy5mb3JFYWNoKChwKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHBhdGggPSBVdGlscy5leHBhbmRUZXh0KHAsIGV4cGFuZGVkKTtcbiAgICAgICAgICAgICAgICAgICAgYXNzZXJ0KCFwYXRoLmluY2x1ZGVzKFwiKlwiKSwgY2hhbGtge2JsdWUgJHt0aGlzLm5hbWV9fSBjYW5ub3QgaGF2ZSAqIGluIGNhY2hlIHBhdGhzLCB3aGVuIC0tbW91bnQtY2FjaGUgaXMgZW5hYmxlZGApO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgZ2V0IGpvYlN0YXR1cyAoKSB7XG4gICAgICAgIGlmICh0aGlzLnByZVNjcmlwdHNFeGl0Q29kZSA9PSBudWxsKSByZXR1cm4gXCJwZW5kaW5nXCI7XG4gICAgICAgIGlmICh0aGlzLnByZVNjcmlwdHNFeGl0Q29kZSA9PSAwKSByZXR1cm4gXCJzdWNjZXNzXCI7XG5cbiAgICAgICAgbGV0IGFsbG93ZWRFeGl0Q29kZXMgPSBbMF07XG4gICAgICAgIGNvbnN0IGFsbG93RmFpbHVyZSA9IHRoaXMuYWxsb3dGYWlsdXJlO1xuICAgICAgICBzd2l0Y2ggKHR5cGVvZiBhbGxvd0ZhaWx1cmUpIHtcbiAgICAgICAgICAgIGNhc2UgXCJib29sZWFuXCI6XG4gICAgICAgICAgICAgICAgaWYgKGFsbG93RmFpbHVyZSkge1xuICAgICAgICAgICAgICAgICAgICBhbGxvd2VkRXhpdENvZGVzID0gW3RoaXMucHJlU2NyaXB0c0V4aXRDb2RlXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIFwib2JqZWN0XCI6XG4gICAgICAgICAgICAgICAgaWYgKCEgQXJyYXkuaXNBcnJheShhbGxvd0ZhaWx1cmUuZXhpdF9jb2RlcykpIHtcbiAgICAgICAgICAgICAgICAgICAgYWxsb3dlZEV4aXRDb2RlcyA9IFthbGxvd0ZhaWx1cmUuZXhpdF9jb2Rlc107XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgYWxsb3dlZEV4aXRDb2RlcyA9IGFsbG93RmFpbHVyZS5leGl0X2NvZGVzO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBVbmV4cGVjdGVkIHR5cGU6ICAke3R5cGVvZiBhbGxvd0ZhaWx1cmV9YCk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gYWxsb3dlZEV4aXRDb2Rlcy5pbmNsdWRlcyh0aGlzLnByZVNjcmlwdHNFeGl0Q29kZSkgPyBcIndhcm5pbmdcIiA6IFwiZmFpbGVkXCI7XG4gICAgfVxuXG4gICAgZ2V0IGFydGlmYWN0c1RvU291cmNlICgpIHtcbiAgICAgICAgaWYgKHRoaXMuam9iRGF0YVtcImdjbEFydGlmYWN0c1RvU291cmNlXCJdICE9IG51bGwpIHJldHVybiB0aGlzLmpvYkRhdGFbXCJnY2xBcnRpZmFjdHNUb1NvdXJjZVwiXTtcbiAgICAgICAgcmV0dXJuIHRoaXMuYXJndi5hcnRpZmFjdHNUb1NvdXJjZTtcbiAgICB9XG5cbiAgICBnZXQgcHJldHR5RHVyYXRpb24gKCkge1xuICAgICAgICBpZiAodGhpcy5fZW5kVGltZSkge1xuICAgICAgICAgICAgcmV0dXJuIHByZXR0eUhydGltZSh0aGlzLl9lbmRUaW1lKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0aGlzLl9zdGFydFRpbWVcbiAgICAgICAgICAgID8gcHJldHR5SHJ0aW1lKHByb2Nlc3MuaHJ0aW1lKHRoaXMuX3N0YXJ0VGltZSkpXG4gICAgICAgICAgICA6IFwiMCBtc1wiO1xuICAgIH1cblxuICAgIGdldCBmb3JtYXR0ZWRKb2JOYW1lICgpIHtcbiAgICAgICAgY29uc3QgdGltZXN0YW1wUHJlZml4ID0gdGhpcy5hcmd2LnNob3dUaW1lc3RhbXBzXG4gICAgICAgICAgICA/IGBbJHtkYXRlRm9ybWF0dGVyLmZvcm1hdChuZXcgRGF0ZSgpKX0gJHt0aGlzLnByZXR0eUR1cmF0aW9uLnBhZFN0YXJ0KDcpfV0gYFxuICAgICAgICAgICAgOiBcIlwiO1xuXG4gICAgICAgIC8vIFsxNjozMzoxOSAxLjM3IG1pbl0gbXktam9iICAgICA+IGhlbGxvIHdvcmxkXG4gICAgICAgIHJldHVybiBjaGFsa2Ake3RpbWVzdGFtcFByZWZpeH17Ymx1ZUJyaWdodCAke3RoaXMubmFtZS5wYWRFbmQodGhpcy5qb2JOYW1lUGFkKX19YDtcbiAgICB9XG5cbiAgICBnZXQgc2FmZUpvYk5hbWUgKCkge1xuICAgICAgICByZXR1cm4gVXRpbHMuc2FmZURvY2tlclN0cmluZyh0aGlzLm5hbWUpO1xuICAgIH1cblxuICAgIGdldCBuZWVkcyAoKTogTmVlZFtdIHwgbnVsbCB7XG4gICAgICAgIHJldHVybiB0aGlzLmpvYkRhdGFbXCJuZWVkc1wiXSA/PyBudWxsO1xuICAgIH1cblxuICAgIGdldCBidWlsZFZvbHVtZU5hbWUgKCk6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiBgZ2NsLSR7dGhpcy5zYWZlSm9iTmFtZX0tJHt0aGlzLmpvYklkfS1idWlsZGA7XG4gICAgfVxuXG4gICAgZ2V0IHRtcFZvbHVtZU5hbWUgKCk6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiBgZ2NsLSR7dGhpcy5zYWZlSm9iTmFtZX0tJHt0aGlzLmpvYklkfS10bXBgO1xuICAgIH1cblxuICAgIGdldCBzZXJ2aWNlcyAoKTogU2VydmljZVtdIHtcbiAgICAgICAgY29uc3Qgc2VydmljZXM6IFNlcnZpY2VbXSA9IFtdO1xuICAgICAgICBpZiAoIXRoaXMuam9iRGF0YVtcInNlcnZpY2VzXCJdKSByZXR1cm4gW107XG5cbiAgICAgICAgZm9yIChjb25zdCBzZXJ2aWNlIG9mIE9iamVjdC52YWx1ZXM8YW55Pih0aGlzLmpvYkRhdGFbXCJzZXJ2aWNlc1wiXSkpIHtcbiAgICAgICAgICAgIGNvbnN0IGV4cGFuZGVkID0gVXRpbHMuZXhwYW5kVmFyaWFibGVzKHsuLi50aGlzLl92YXJpYWJsZXMsIC4uLnRoaXMuX2RvdGVudlZhcmlhYmxlcywgLi4uc2VydmljZVtcInZhcmlhYmxlc1wiXX0pO1xuICAgICAgICAgICAgbGV0IHNlcnZpY2VOYW1lID0gVXRpbHMuZXhwYW5kVGV4dChzZXJ2aWNlW1wibmFtZVwiXSwgZXhwYW5kZWQpO1xuICAgICAgICAgICAgc2VydmljZU5hbWUgPSBzZXJ2aWNlTmFtZS5pbmNsdWRlcyhcIjpcIikgPyBzZXJ2aWNlTmFtZSA6IGAke3NlcnZpY2VOYW1lfTpsYXRlc3RgO1xuICAgICAgICAgICAgc2VydmljZXMucHVzaCh7XG4gICAgICAgICAgICAgICAgbmFtZTogc2VydmljZU5hbWUsXG4gICAgICAgICAgICAgICAgZW50cnlwb2ludDogc2VydmljZVtcImVudHJ5cG9pbnRcIl0gPz8gbnVsbCxcbiAgICAgICAgICAgICAgICBjb21tYW5kOiBzZXJ2aWNlW1wiY29tbWFuZFwiXSA/PyBudWxsLFxuICAgICAgICAgICAgICAgIHZhcmlhYmxlczogZXhwYW5kZWQsXG4gICAgICAgICAgICAgICAgYWxpYXM6IFV0aWxzLmV4cGFuZFRleHQoc2VydmljZVtcImFsaWFzXCJdLCBleHBhbmRlZCkgPz8gbnVsbCxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBzZXJ2aWNlcztcbiAgICB9XG5cbiAgICBzZXQgam9iTmFtZVBhZCAoam9iTmFtZVBhZDogbnVtYmVyKSB7XG4gICAgICAgIGFzc2VydCh0aGlzLl9qb2JOYW1lUGFkID09IG51bGwsIFwidGhpcy5fam9iTmFtZVBhZCBjYW4gb25seSBiZSBzZXQgb25jZVwiKTtcbiAgICAgICAgdGhpcy5fam9iTmFtZVBhZCA9IGpvYk5hbWVQYWQ7XG4gICAgfVxuXG4gICAgZ2V0IGpvYk5hbWVQYWQgKCk6IG51bWJlciB7XG4gICAgICAgIHJldHVybiB0aGlzLl9qb2JOYW1lUGFkID8/IDA7XG4gICAgfVxuXG4gICAgZ2V0IHByb2R1Y2VycyAoKToge25hbWU6IHN0cmluZzsgZG90ZW52OiBzdHJpbmcgfCBudWxsfVtdIHwgbnVsbCB7XG4gICAgICAgIHJldHVybiB0aGlzLl9wcm9kdWNlcnM7XG4gICAgfVxuXG4gICAgc2V0IHByb2R1Y2VycyAocHJvZHVjZXJzOiB7bmFtZTogc3RyaW5nOyBkb3RlbnY6IHN0cmluZyB8IG51bGx9W10gfCBudWxsKSB7XG4gICAgICAgIGFzc2VydCh0aGlzLl9wcm9kdWNlcnMgPT0gbnVsbCwgXCJ0aGlzLl9wcm9kdWNlcnMgY2FuIG9ubHkgYmUgc2V0IG9uY2VcIik7XG4gICAgICAgIHRoaXMuX3Byb2R1Y2VycyA9IHByb2R1Y2VycztcbiAgICB9XG5cbiAgICBnZXQgc3RhZ2UgKCk6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiB0aGlzLmpvYkRhdGFbXCJzdGFnZVwiXSB8fCBcInRlc3RcIjtcbiAgICB9XG5cbiAgICBnZXQgaW50ZXJhY3RpdmUgKCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy5qb2JEYXRhW1wiZ2NsSW50ZXJhY3RpdmVcIl0gfHwgZmFsc2U7XG4gICAgfVxuXG4gICAgZ2V0IGluamVjdFNTSEFnZW50ICgpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuam9iRGF0YVtcImdjbEluamVjdFNTSEFnZW50XCJdIHx8IGZhbHNlO1xuICAgIH1cblxuICAgIGdldCBkZXNjcmlwdGlvbiAoKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuam9iRGF0YVtcImdjbERlc2NyaXB0aW9uXCJdID8/IFwiXCI7XG4gICAgfVxuXG4gICAgZ2V0IGFydGlmYWN0cyAoKToge3BhdGhzOiBzdHJpbmdbXTsgZXhjbHVkZT86IHN0cmluZ1tdOyByZXBvcnRzPzoge2RvdGVudj86IHN0cmluZ307IHdoZW4/OiBzdHJpbmd9IHwgbnVsbCB7XG4gICAgICAgIHJldHVybiB0aGlzLmpvYkRhdGFbXCJhcnRpZmFjdHNcIl07XG4gICAgfVxuXG4gICAgZGVsZXRlQXJ0aWZhY3RzICgpIHtcbiAgICAgICAgZGVsZXRlIHRoaXMuam9iRGF0YVtcImFydGlmYWN0c1wiXTtcbiAgICB9XG5cbiAgICBnZXQgY2FjaGUgKCk6IENhY2hlW10ge1xuICAgICAgICByZXR1cm4gdGhpcy5qb2JEYXRhW1wiY2FjaGVcIl0gfHwgW107XG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIGdldFVuaXF1ZUNhY2hlTmFtZSAoY3dkOiBzdHJpbmcsIGV4cGFuZGVkOiB7W2tleTogc3RyaW5nXTogc3RyaW5nfSwga2V5OiBhbnkpIHtcbiAgICAgICAgaWYgKHR5cGVvZiBrZXkgPT09IFwic3RyaW5nXCIgfHwga2V5ID09IG51bGwpIHtcbiAgICAgICAgICAgIHJldHVybiBVdGlscy5leHBhbmRUZXh0KGtleSA/PyBcImRlZmF1bHRcIiwgZXhwYW5kZWQpO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgZmlsZXMgPSBrZXlbXCJmaWxlc1wiXS5tYXAoKGY6IHN0cmluZykgPT4ge1xuICAgICAgICAgICAgbGV0IHBhdGggPSBVdGlscy5leHBhbmRUZXh0KGYsIGV4cGFuZGVkKTtcbiAgICAgICAgICAgIGlmIChwYXRoLnN0YXJ0c1dpdGgoYCR7Q0lfUFJPSkVDVF9ESVJ9L2ApKSB7XG4gICAgICAgICAgICAgICAgcGF0aCA9IHBhdGguc2xpY2UoYCR7Q0lfUFJPSkVDVF9ESVJ9L2AubGVuZ3RoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBgJHtjd2R9LyR7cGF0aH1gO1xuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIFwibWQtXCIgKyBhd2FpdCBVdGlscy5jaGVja3N1bUZpbGVzKGN3ZCwgZmlsZXMpO1xuICAgIH1cblxuICAgIGdldCBiZWZvcmVTY3JpcHRzICgpOiBzdHJpbmdbXSB7XG4gICAgICAgIGNvbnN0IGJlZm9yZVNjcmlwdHMgPSB0aGlzLmpvYkRhdGFbXCJiZWZvcmVfc2NyaXB0XCJdIHx8IFtdO1xuICAgICAgICByZXR1cm4gdHlwZW9mIGJlZm9yZVNjcmlwdHMgPT09IFwic3RyaW5nXCIgPyBbYmVmb3JlU2NyaXB0c10gOiBiZWZvcmVTY3JpcHRzO1xuICAgIH1cblxuICAgIGdldCBhZnRlclNjcmlwdHMgKCk6IHN0cmluZ1tdIHtcbiAgICAgICAgY29uc3QgYWZ0ZXJTY3JpcHRzID0gdGhpcy5qb2JEYXRhW1wiYWZ0ZXJfc2NyaXB0XCJdIHx8IFtdO1xuICAgICAgICByZXR1cm4gdHlwZW9mIGFmdGVyU2NyaXB0cyA9PT0gXCJzdHJpbmdcIiA/IFthZnRlclNjcmlwdHNdIDogYWZ0ZXJTY3JpcHRzO1xuICAgIH1cblxuICAgIGdldCBzY3JpcHRzICgpOiBzdHJpbmdbXSB7XG4gICAgICAgIGNvbnN0IHNjcmlwdCA9IHRoaXMuam9iRGF0YVtcInNjcmlwdFwiXTtcbiAgICAgICAgcmV0dXJuIHR5cGVvZiBzY3JpcHQgPT09IFwic3RyaW5nXCIgPyBbc2NyaXB0XSA6IHNjcmlwdDtcbiAgICB9XG5cbiAgICBnZXQgdHJpZ2dlciAoKTogYW55IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuam9iRGF0YVtcInRyaWdnZXJcIl07XG4gICAgfVxuXG4gICAgZ2V0IHByZVNjcmlwdHNFeGl0Q29kZSAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9wcmVzY3JpcHRzRXhpdENvZGU7XG4gICAgfVxuXG4gICAgZ2V0IGFmdGVyU2NyaXB0c0V4aXRDb2RlICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2FmdGVyU2NyaXB0c0V4aXRDb2RlO1xuICAgIH1cblxuICAgIGdldCBzdGFydGVkICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3J1bm5pbmcgfHwgdGhpcy5fcHJlc2NyaXB0c0V4aXRDb2RlICE9PSBudWxsO1xuICAgIH1cblxuICAgIGdldCBmaW5pc2hlZCAoKSB7XG4gICAgICAgIHJldHVybiAhdGhpcy5fcnVubmluZyAmJiB0aGlzLl9wcmVzY3JpcHRzRXhpdENvZGUgIT09IG51bGw7XG4gICAgfVxuXG4gICAgZ2V0IGNvdmVyYWdlUGVyY2VudCAoKTogc3RyaW5nIHwgbnVsbCB7XG4gICAgICAgIHJldHVybiB0aGlzLl9jb3ZlcmFnZVBlcmNlbnQ7XG4gICAgfVxuXG4gICAgZ2V0IGZpbGVWYXJpYWJsZXNEaXIgKCkge1xuICAgICAgICByZXR1cm4gYC90bXAvZ2l0bGFiLWNpLWxvY2FsLWZpbGUtdmFyaWFibGVzLSR7dGhpcy5fdmFyaWFibGVzW1wiQ0lfUFJPSkVDVF9QQVRIX1NMVUdcIl19LSR7dGhpcy5qb2JJZH1gO1xuICAgIH1cblxuICAgIGdldCBnbG9iYWxWYXJpYWJsZXMgKCkge1xuICAgICAgICBpZiAodGhpcy5pbmhlcml0LnZhcmlhYmxlcyA9PT0gZmFsc2UpIHtcbiAgICAgICAgICAgIHJldHVybiB7fTtcbiAgICAgICAgfSBlbHNlIGlmIChBcnJheS5pc0FycmF5KHRoaXMuaW5oZXJpdC52YXJpYWJsZXMpKSB7XG4gICAgICAgICAgICBjb25zdCBpbmhlcml0VmFyaWFibGVzID0gdGhpcy5pbmhlcml0LnZhcmlhYmxlcztcbiAgICAgICAgICAgIHJldHVybiBPYmplY3QuZnJvbUVudHJpZXMoXG4gICAgICAgICAgICAgICAgT2JqZWN0LmVudHJpZXModGhpcy5fZ2xvYmFsVmFyaWFibGVzKS5maWx0ZXIoKFtrXSkgPT4gaW5oZXJpdFZhcmlhYmxlcy5pbmNsdWRlcyhrKSlcbiAgICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuX2dsb2JhbFZhcmlhYmxlcztcbiAgICB9XG5cbiAgICBhc3luYyBzdGFydCAoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIHRoaXMuX3J1bm5pbmcgPSB0cnVlO1xuXG4gICAgICAgIGNvbnN0IGFyZ3YgPSB0aGlzLmFyZ3Y7XG4gICAgICAgIHRoaXMuX3N0YXJ0VGltZSA9IHByb2Nlc3MuaHJ0aW1lKCk7XG4gICAgICAgIHRoaXMuX3ZhcmlhYmxlc1tcIkNJX0pPQl9TVEFSVEVEX0FUXCJdID0gbmV3IERhdGUoKS50b0lTT1N0cmluZygpLnNwbGl0KFwiLlwiKVswXSArIFwiWlwiO1xuICAgICAgICBjb25zdCB3cml0ZVN0cmVhbXMgPSB0aGlzLndyaXRlU3RyZWFtcztcbiAgICAgICAgdGhpcy5fZG90ZW52VmFyaWFibGVzID0gYXdhaXQgdGhpcy5pbml0UHJvZHVjZXJSZXBvcnRzRG90ZW52VmFyaWFibGVzKHdyaXRlU3RyZWFtcywgVXRpbHMuZXhwYW5kVmFyaWFibGVzKHRoaXMuX3ZhcmlhYmxlcykpO1xuICAgICAgICBjb25zdCBleHBhbmRlZCA9IFV0aWxzLnVuc2NhcGUkJFZhcmlhYmxlcyhVdGlscy5leHBhbmRWYXJpYWJsZXMoey4uLnRoaXMuX3ZhcmlhYmxlcywgLi4udGhpcy5fZG90ZW52VmFyaWFibGVzfSkpO1xuICAgICAgICBjb25zdCBpbWFnZU5hbWUgPSB0aGlzLmltYWdlTmFtZShleHBhbmRlZCk7XG4gICAgICAgIGNvbnN0IHNhZmVKb2JOYW1lID0gdGhpcy5zYWZlSm9iTmFtZTtcblxuICAgICAgICBjb25zdCBvdXRwdXRMb2dGaWxlUGF0aCA9IGAke2FyZ3YuY3dkfS8ke2FyZ3Yuc3RhdGVEaXJ9L291dHB1dC8ke3NhZmVKb2JOYW1lfS5sb2dgO1xuICAgICAgICBhd2FpdCBmcy5lbnN1cmVGaWxlKG91dHB1dExvZ0ZpbGVQYXRoKTtcbiAgICAgICAgYXdhaXQgZnMudHJ1bmNhdGUob3V0cHV0TG9nRmlsZVBhdGgpO1xuXG4gICAgICAgIGlmICghdGhpcy5pbnRlcmFjdGl2ZSkge1xuICAgICAgICAgICAgd3JpdGVTdHJlYW1zLnN0ZG91dChjaGFsa2Ake3RoaXMuZm9ybWF0dGVkSm9iTmFtZX0ge21hZ2VudGFCcmlnaHQgc3RhcnRpbmd9ICR7aW1hZ2VOYW1lID8/IFwic2hlbGxcIn0gKHt5ZWxsb3cgJHt0aGlzLnN0YWdlfX0pXFxuYCk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoaW1hZ2VOYW1lKSB7XG4gICAgICAgICAgICBhd2FpdCB0aGlzLnB1bGxJbWFnZSh3cml0ZVN0cmVhbXMsIGltYWdlTmFtZSk7XG5cbiAgICAgICAgICAgIGNvbnN0IGJ1aWxkVm9sdW1lTmFtZSA9IHRoaXMuYnVpbGRWb2x1bWVOYW1lO1xuICAgICAgICAgICAgY29uc3QgdG1wVm9sdW1lTmFtZSA9IHRoaXMudG1wVm9sdW1lTmFtZTtcbiAgICAgICAgICAgIGNvbnN0IGZpbGVWYXJpYWJsZXNEaXIgPSB0aGlzLmZpbGVWYXJpYWJsZXNEaXI7XG5cbiAgICAgICAgICAgIGNvbnN0IHZvbHVtZVByb21pc2VzID0gW107XG4gICAgICAgICAgICB2b2x1bWVQcm9taXNlcy5wdXNoKFV0aWxzLnNwYXduKFt0aGlzLmFyZ3YuY29udGFpbmVyRXhlY3V0YWJsZSwgXCJ2b2x1bWVcIiwgXCJjcmVhdGVcIiwgYCR7YnVpbGRWb2x1bWVOYW1lfWBdLCBhcmd2LmN3ZCkpO1xuICAgICAgICAgICAgdm9sdW1lUHJvbWlzZXMucHVzaChVdGlscy5zcGF3bihbdGhpcy5hcmd2LmNvbnRhaW5lckV4ZWN1dGFibGUsIFwidm9sdW1lXCIsIFwiY3JlYXRlXCIsIGAke3RtcFZvbHVtZU5hbWV9YF0sIGFyZ3YuY3dkKSk7XG4gICAgICAgICAgICB0aGlzLl9jb250YWluZXJWb2x1bWVOYW1lcy5wdXNoKGJ1aWxkVm9sdW1lTmFtZSk7XG4gICAgICAgICAgICB0aGlzLl9jb250YWluZXJWb2x1bWVOYW1lcy5wdXNoKHRtcFZvbHVtZU5hbWUpO1xuICAgICAgICAgICAgYXdhaXQgUHJvbWlzZS5hbGwodm9sdW1lUHJvbWlzZXMpO1xuXG4gICAgICAgICAgICBjb25zdCB0aW1lID0gcHJvY2Vzcy5ocnRpbWUoKTtcbiAgICAgICAgICAgIHRoaXMucmVmcmVzaExvbmdSdW5uaW5nU2lsZW50VGltZW91dCh3cml0ZVN0cmVhbXMpO1xuXG4gICAgICAgICAgICBsZXQgY2hvd25PcHQgPSBcIjA6MFwiO1xuICAgICAgICAgICAgbGV0IGNobW9kT3B0ID0gXCJhK3J3XCI7XG4gICAgICAgICAgICBpZiAodGhpcy5hcmd2LnVtYXNrID09PSBmYWxzZSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IHtzdGRvdXR9ID0gYXdhaXQgVXRpbHMuc3Bhd24oW1wiZG9ja2VyXCIsIFwicnVuXCIsIFwiLS1ybVwiLCBcIi0tZW50cnlwb2ludFwiLCBcInNoXCIsIGltYWdlTmFtZSwgXCItY1wiLCBcImVjaG8gXFxcIiQoaWQgLXUpOiQoaWQgLWcpXFxcIlwiXSk7XG4gICAgICAgICAgICAgICAgY2hvd25PcHQgPSBzdGRvdXQ7XG4gICAgICAgICAgICAgICAgaWYgKGNob3duT3B0ID09IFwiMDowXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgY2htb2RPcHQgPSBcImctd1wiO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IHtzdGRvdXQ6IGNvbnRhaW5lcklkfSA9IGF3YWl0IFV0aWxzLnNwYXduKFtcbiAgICAgICAgICAgICAgICB0aGlzLmFyZ3YuY29udGFpbmVyRXhlY3V0YWJsZSwgXCJjcmVhdGVcIiwgXCItLXVzZXI9MDowXCIsIGAtLXZvbHVtZT0ke2J1aWxkVm9sdW1lTmFtZX06L2djbC1idWlsZHNgLCBgLS12b2x1bWU9JHt0bXBWb2x1bWVOYW1lfToke3RoaXMuZmlsZVZhcmlhYmxlc0Rpcn1gLCBcImRvY2tlci5pby9maXJlY293L2dpdGxhYi1jaS1sb2NhbC11dGlsXCIsXG4gICAgICAgICAgICAgICAgLi4uW1wic2hcIiwgXCItY1wiLCBgY2hvd24gJHtjaG93bk9wdH0gLVIgL2djbC1idWlsZHMvICYmIGNobW9kICR7Y2htb2RPcHR9IC1SIC9nY2wtYnVpbGRzLyAmJiBjaG93biAke2Nob3duT3B0fSAtUiAvdG1wLyAmJiBjaG1vZCAke2NobW9kT3B0fSAtUiAvdG1wL2BdLFxuICAgICAgICAgICAgXSwgYXJndi5jd2QpO1xuICAgICAgICAgICAgdGhpcy5fY29udGFpbmVyc1RvQ2xlYW4ucHVzaChjb250YWluZXJJZCk7XG4gICAgICAgICAgICBpZiAoYXdhaXQgZnMucGF0aEV4aXN0cyhmaWxlVmFyaWFibGVzRGlyKSkge1xuICAgICAgICAgICAgICAgIGF3YWl0IFV0aWxzLnNwYXduKFt0aGlzLmFyZ3YuY29udGFpbmVyRXhlY3V0YWJsZSwgXCJjcFwiLCBgJHtmaWxlVmFyaWFibGVzRGlyfS8uYCwgYCR7Y29udGFpbmVySWR9OiR7ZmlsZVZhcmlhYmxlc0Rpcn1gXSwgYXJndi5jd2QpO1xuICAgICAgICAgICAgICAgIHRoaXMucmVmcmVzaExvbmdSdW5uaW5nU2lsZW50VGltZW91dCh3cml0ZVN0cmVhbXMpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgYXdhaXQgVXRpbHMuc3Bhd24oW3RoaXMuYXJndi5jb250YWluZXJFeGVjdXRhYmxlLCBcImNwXCIsIGAke2FyZ3Yuc3RhdGVEaXJ9L2J1aWxkcy8uZG9ja2VyLy5gLCBgJHtjb250YWluZXJJZH06L2djbC1idWlsZHNgXSwgYXJndi5jd2QpO1xuICAgICAgICAgICAgYXdhaXQgVXRpbHMuc3Bhd24oW3RoaXMuYXJndi5jb250YWluZXJFeGVjdXRhYmxlLCBcInN0YXJ0XCIsIFwiLS1hdHRhY2hcIiwgY29udGFpbmVySWRdLCBhcmd2LmN3ZCk7XG4gICAgICAgICAgICBhd2FpdCBVdGlscy5zcGF3bihbdGhpcy5hcmd2LmNvbnRhaW5lckV4ZWN1dGFibGUsIFwicm1cIiwgXCItdmZcIiwgY29udGFpbmVySWRdLCBhcmd2LmN3ZCk7XG4gICAgICAgICAgICBjb25zdCBlbmRUaW1lID0gcHJvY2Vzcy5ocnRpbWUodGltZSk7XG4gICAgICAgICAgICB3cml0ZVN0cmVhbXMuc3Rkb3V0KGNoYWxrYCR7dGhpcy5mb3JtYXR0ZWRKb2JOYW1lfSB7bWFnZW50YUJyaWdodCBjb3BpZWQgdG8gZG9ja2VyIHZvbHVtZXN9IGluIHttYWdlbnRhICR7cHJldHR5SHJ0aW1lKGVuZFRpbWUpfX1cXG5gKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLnNlcnZpY2VzPy5sZW5ndGgpIHtcbiAgICAgICAgICAgIC8vIGBob3N0YCBhbmQgYG5vbmVgIG5ldHdvcmtzIGRvIG5vdCB3b3JrIHdpdGggc2VydmljZXMgYmVjYXVzZSBhbGlhc2VzIG9ubHkgd29yayBmb3JcbiAgICAgICAgICAgIC8vIHVzZXIgZGVmaW5lZCBuZXR3b3Jrcy5cbiAgICAgICAgICAgIGZvciAoY29uc3QgbmV0d29yayBvZiB0aGlzLmFyZ3YubmV0d29yaykge1xuICAgICAgICAgICAgICAgIGlmIChbXCJob3N0XCIsIFwibm9uZVwiXS5pbmNsdWRlcyhuZXR3b3JrKSkge1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQXNzZXJ0aW9uRXJyb3Ioe21lc3NhZ2U6IGBDYW5ub3QgYWRkIHNlcnZpY2UgbmV0d29yayBhbGlhcyB3aXRoIG5ldHdvcmsgbW9kZSAnJHtuZXR3b3JrfSdgfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBhd2FpdCB0aGlzLmNyZWF0ZURvY2tlck5ldHdvcmsoYGdpdGxhYi1jaS1sb2NhbC0ke3RoaXMuam9iSWR9YCk7XG5cbiAgICAgICAgICAgIGF3YWl0IFByb21pc2UuYWxsKFxuICAgICAgICAgICAgICAgIHRoaXMuc2VydmljZXMubWFwKGFzeW5jIChzZXJ2aWNlLCBzZXJ2aWNlSW5kZXgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2VydmljZU5hbWUgPSBzZXJ2aWNlLm5hbWU7XG4gICAgICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMucHVsbEltYWdlKHdyaXRlU3RyZWFtcywgc2VydmljZU5hbWUpO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBzZXJ2aWNlQ29udGFpbmVySWQgPSBhd2FpdCB0aGlzLnN0YXJ0U2VydmljZSh3cml0ZVN0cmVhbXMsIFV0aWxzLmV4cGFuZFZhcmlhYmxlcyh7Li4uZXhwYW5kZWQsIC4uLnNlcnZpY2UudmFyaWFibGVzfSksIHNlcnZpY2UpO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBzZXJ2aWNlQ29udGFpbmVyTG9nRmlsZSA9IGAke2FyZ3YuY3dkfS8ke2FyZ3Yuc3RhdGVEaXJ9L3NlcnZpY2VzLW91dHB1dC8ke3RoaXMuc2FmZUpvYk5hbWV9LyR7c2VydmljZU5hbWV9LSR7c2VydmljZUluZGV4fS5sb2dgO1xuICAgICAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLnNlcnZpY2VIZWFsdGhDaGVjayh3cml0ZVN0cmVhbXMsIHNlcnZpY2UsIHNlcnZpY2VJbmRleCwgc2VydmljZUNvbnRhaW5lckxvZ0ZpbGUpO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCB7c3Rkb3V0LCBzdGRlcnJ9ID0gYXdhaXQgVXRpbHMuc3Bhd24oW3RoaXMuYXJndi5jb250YWluZXJFeGVjdXRhYmxlLCBcImxvZ3NcIiwgc2VydmljZUNvbnRhaW5lcklkXSk7XG4gICAgICAgICAgICAgICAgICAgIGF3YWl0IGZzLmVuc3VyZUZpbGUoc2VydmljZUNvbnRhaW5lckxvZ0ZpbGUpO1xuICAgICAgICAgICAgICAgICAgICBhd2FpdCBmcy5wcm9taXNlcy53cml0ZUZpbGUoc2VydmljZUNvbnRhaW5lckxvZ0ZpbGUsIGAjIyMgc3Rkb3V0ICMjI1xcbiR7c3Rkb3V0fVxcbiMjIyBzdGRlcnIgIyMjXFxuJHtzdGRlcnJ9XFxuYCk7XG4gICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICk7XG4gICAgICAgIH1cblxuICAgICAgICBhd2FpdCB0aGlzLmV4ZWNQcmVTY3JpcHRzKGV4cGFuZGVkKTtcbiAgICAgICAgaWYgKHRoaXMuX3ByZXNjcmlwdHNFeGl0Q29kZSA9PSBudWxsKSB0aHJvdyBFcnJvcihcInRoaXMuX3ByZXNjcmlwdHNFeGl0Q29kZSBtdXN0IGJlIGRlZmluZWQhXCIpO1xuXG4gICAgICAgIGF3YWl0IHRoaXMuZXhlY0FmdGVyU2NyaXB0cyhleHBhbmRlZCk7XG5cbiAgICAgICAgdGhpcy5fcnVubmluZyA9IGZhbHNlO1xuICAgICAgICB0aGlzLl9lbmRUaW1lID0gdGhpcy5fZW5kVGltZSA/PyBwcm9jZXNzLmhydGltZSh0aGlzLl9zdGFydFRpbWUpO1xuICAgICAgICB0aGlzLnByaW50RmluaXNoZWRTdHJpbmcoKTtcblxuICAgICAgICBhd2FpdCB0aGlzLmNvcHlDYWNoZU91dCh0aGlzLndyaXRlU3RyZWFtcywgZXhwYW5kZWQpO1xuICAgICAgICBhd2FpdCB0aGlzLmNvcHlBcnRpZmFjdHNPdXQodGhpcy53cml0ZVN0cmVhbXMsIGV4cGFuZGVkKTtcblxuICAgICAgICBpZiAodGhpcy5qb2JEYXRhW1wiY292ZXJhZ2VcIl0pIHtcbiAgICAgICAgICAgIHRoaXMuX2NvdmVyYWdlUGVyY2VudCA9IGF3YWl0IFV0aWxzLmdldENvdmVyYWdlUGVyY2VudChhcmd2LmN3ZCwgYXJndi5zdGF0ZURpciwgdGhpcy5qb2JEYXRhW1wiY292ZXJhZ2VcIl0sIHNhZmVKb2JOYW1lKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuY2xlYW51cFJlc291cmNlcygpO1xuICAgIH1cblxuICAgIGFzeW5jIGNsZWFudXBSZXNvdXJjZXMgKCkge1xuICAgICAgICBjbGVhclRpbWVvdXQodGhpcy5fbG9uZ1J1bm5pbmdTaWxlbnRUaW1lb3V0KTtcblxuICAgICAgICBpZiAoIXRoaXMuYXJndi5jbGVhbnVwKSByZXR1cm47XG5cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGF3YWl0IFV0aWxzLnNwYXduKFt0aGlzLmFyZ3YuY29udGFpbmVyRXhlY3V0YWJsZSwgXCJybVwiLCBcIi12ZlwiLCAuLi50aGlzLl9jb250YWluZXJzVG9DbGVhbl0pO1xuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICBhc3NlcnQoZSBpbnN0YW5jZW9mIEVycm9yLCBcImUgaXMgbm90IGluc3RhbmNlb2YgRXJyb3JcIik7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5fc2VydmljZU5ldHdvcmtJZCkge1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBhd2FpdCBVdGlscy5zcGF3bihbdGhpcy5hcmd2LmNvbnRhaW5lckV4ZWN1dGFibGUsIFwibmV0d29ya1wiLCBcInJtXCIsIGAke3RoaXMuX3NlcnZpY2VOZXR3b3JrSWR9YF0pO1xuICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgIGFzc2VydChlIGluc3RhbmNlb2YgRXJyb3IsIFwiZSBpcyBub3QgaW5zdGFuY2VvZiBFcnJvclwiKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBhd2FpdCBVdGlscy5zcGF3bihbdGhpcy5hcmd2LmNvbnRhaW5lckV4ZWN1dGFibGUsIFwidm9sdW1lXCIsIFwicm1cIiwgLi4udGhpcy5fY29udGFpbmVyVm9sdW1lTmFtZXNdKTtcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgYXNzZXJ0KGUgaW5zdGFuY2VvZiBFcnJvciwgXCJlIGlzIG5vdCBpbnN0YW5jZW9mIEVycm9yXCIpO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3Qgcm1Qcm9taXNlcyA9IFtdO1xuICAgICAgICBmb3IgKGNvbnN0IGZpbGUgb2YgdGhpcy5fZmlsZXNUb1JtKSB7XG4gICAgICAgICAgICBybVByb21pc2VzLnB1c2goZnMucm0oZmlsZSwge3JlY3Vyc2l2ZTogdHJ1ZSwgZm9yY2U6IHRydWV9KSk7XG4gICAgICAgIH1cbiAgICAgICAgYXdhaXQgUHJvbWlzZS5hbGwocm1Qcm9taXNlcyk7XG5cbiAgICAgICAgY29uc3QgZmlsZVZhcmlhYmxlc0RpciA9IHRoaXMuZmlsZVZhcmlhYmxlc0RpcjtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGF3YWl0IGZzLnJtKGZpbGVWYXJpYWJsZXNEaXIsIHtyZWN1cnNpdmU6IHRydWUsIGZvcmNlOiB0cnVlfSk7XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIGFzc2VydChlIGluc3RhbmNlb2YgRXJyb3IsIFwiZSBpcyBub3QgaW5zdGFuY2VvZiBFcnJvclwiKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgZ2VuZXJhdGVJbmplY3RTU0hBZ2VudE9wdGlvbnMgKCkge1xuICAgICAgICBpZiAoIXRoaXMuaW5qZWN0U1NIQWdlbnQpIHtcbiAgICAgICAgICAgIHJldHVybiBcIlwiO1xuICAgICAgICB9XG4gICAgICAgIGlmIChwcm9jZXNzLnBsYXRmb3JtID09PSBcImRhcndpblwiIHx8IC9eZGFyd2luLy5leGVjKHByb2Nlc3MuZW52Lk9TVFlQRSA/PyBcIlwiKSkge1xuICAgICAgICAgICAgcmV0dXJuIFwiLS1lbnYgU1NIX0FVVEhfU09DSz0vcnVuL2hvc3Qtc2VydmljZXMvc3NoLWF1dGguc29jayAtdiAvcnVuL2hvc3Qtc2VydmljZXMvc3NoLWF1dGguc29jazovcnVuL2hvc3Qtc2VydmljZXMvc3NoLWF1dGguc29ja1wiO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBgLS1lbnYgU1NIX0FVVEhfU09DSz0ke3Byb2Nlc3MuZW52LlNTSF9BVVRIX1NPQ0t9IC12ICR7cHJvY2Vzcy5lbnYuU1NIX0FVVEhfU09DS306JHtwcm9jZXNzLmVudi5TU0hfQVVUSF9TT0NLfWA7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBnZW5lcmF0ZVNjcmlwdENvbW1hbmRzIChzY3JpcHRzOiBzdHJpbmdbXSkge1xuICAgICAgICBsZXQgY21kID0gXCJcIjtcbiAgICAgICAgc2NyaXB0cy5mb3JFYWNoKChzY3JpcHQpID0+IHtcbiAgICAgICAgICAgIC8vIFByaW50IGNvbW1hbmQgZWNobydlZCB3aXRoICRHQ0xfU0hFTExfUFJPTVBUX1BMQUNFSE9MREVSXG4gICAgICAgICAgICBjb25zdCBzcGxpdCA9IHNjcmlwdC5zcGxpdCgvXFxyP1xcbi8pO1xuICAgICAgICAgICAgY29uc3QgbXVsdGlsaW5lVGV4dCA9IHNwbGl0Lmxlbmd0aCA+IDEgPyBcIiAjIGNvbGxhcHNlZCBtdWx0aS1saW5lIGNvbW1hbmRcIiA6IFwiXCI7XG4gICAgICAgICAgICBjb25zdCB0ZXh0ID0gc3BsaXRbMF0/LnJlcGxhY2UoL1xcXFwvZywgXCJcXFxcXFxcXFwiKS5yZXBsYWNlKC9cIi9nLCBcIlxcXFxcXFwiXCIpLnJlcGxhY2UoL1skXS9nLCBcIlxcXFwkXCIpO1xuICAgICAgICAgICAgY21kICs9IGBlY2hvIFwiJHtHQ0xfU0hFTExfUFJPTVBUX1BMQUNFSE9MREVSfSAke3RleHR9JHttdWx0aWxpbmVUZXh0fVwiXFxuYDtcblxuICAgICAgICAgICAgLy8gRXhlY3V0ZSBhY3R1YWwgc2NyaXB0XG4gICAgICAgICAgICBjbWQgKz0gYCR7c2NyaXB0fVxcbmA7XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gY21kO1xuICAgIH1cblxuICAgIHByaXZhdGUgYXN5bmMgbW91bnRDYWNoZUNtZCAod3JpdGVTdHJlYW1zOiBXcml0ZVN0cmVhbXMsIGV4cGFuZGVkOiB7W2tleTogc3RyaW5nXTogc3RyaW5nfSkge1xuICAgICAgICBpZiAodGhpcy5pbWFnZU5hbWUoZXhwYW5kZWQpICYmICF0aGlzLmFyZ3YubW91bnRDYWNoZSkgcmV0dXJuIFtdO1xuXG4gICAgICAgIGNvbnN0IGNtZDogc3RyaW5nW10gPSBbXTtcbiAgICAgICAgZm9yIChjb25zdCBjIG9mIHRoaXMuY2FjaGUpIHtcbiAgICAgICAgICAgIGNvbnN0IHVuaXF1ZUNhY2hlTmFtZSA9IGF3YWl0IHRoaXMuZ2V0VW5pcXVlQ2FjaGVOYW1lKHRoaXMuYXJndi5jd2QsIGV4cGFuZGVkLCBjLmtleSk7XG4gICAgICAgICAgICBjLnBhdGhzLmZvckVhY2goKHApID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBwYXRoID0gVXRpbHMuZXhwYW5kVGV4dChwLCBleHBhbmRlZCk7XG4gICAgICAgICAgICAgICAgd3JpdGVTdHJlYW1zLnN0ZG91dChjaGFsa2Ake3RoaXMuZm9ybWF0dGVkSm9iTmFtZX0ge21hZ2VudGFCcmlnaHQgbW91bnRpbmcgY2FjaGV9IGZvciBwYXRoICR7cGF0aH1cXG5gKTtcbiAgICAgICAgICAgICAgICBjb25zdCBjYWNoZU1vdW50ID0gVXRpbHMuc2FmZURvY2tlclN0cmluZyhgZ2NsLSR7ZXhwYW5kZWQuQ0lfUFJPSkVDVF9QQVRIX1NMVUd9LSR7dW5pcXVlQ2FjaGVOYW1lfWApO1xuICAgICAgICAgICAgICAgIGNtZC5wdXNoKFwiLXZcIiwgYCR7Y2FjaGVNb3VudH06L2djbC1idWlsZHMvJHtwYXRofWApO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGNtZDtcbiAgICB9XG5cbiAgICBwcml2YXRlIGFzeW5jIGV4ZWNQcmVTY3JpcHRzIChleHBhbmRlZDoge1trZXk6IHN0cmluZ106IHN0cmluZ30pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgY29uc3QgcHJlc2NyaXB0cyA9IHRoaXMuYmVmb3JlU2NyaXB0cy5jb25jYXQodGhpcy5zY3JpcHRzKTtcbiAgICAgICAgZXhwYW5kZWRbXCJDSV9KT0JfU1RBVFVTXCJdID0gXCJydW5uaW5nXCI7XG5cbiAgICAgICAgdGhpcy5fcHJlc2NyaXB0c0V4aXRDb2RlID0gYXdhaXQgdGhpcy5leGVjU2NyaXB0cyhwcmVzY3JpcHRzLCBleHBhbmRlZCwgXCJcIik7XG4gICAgICAgIGV4cGFuZGVkW1wiQ0lfSk9CX1NUQVRVU1wiXSA9IHRoaXMuX3ByZXNjcmlwdHNFeGl0Q29kZSA9PT0gMCA/IFwic3VjY2Vzc1wiIDogXCJmYWlsZWRcIjtcblxuICAgICAgICB0aGlzLnByaW50RXhpdGVkU3RyaW5nKHRoaXMuX3ByZXNjcmlwdHNFeGl0Q29kZSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBhc3luYyBleGVjQWZ0ZXJTY3JpcHRzIChleHBhbmRlZDoge1trZXk6IHN0cmluZ106IHN0cmluZ30pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgY29uc3QgbWVzc2FnZSA9IFwiUnVubmluZyBhZnRlciBzY3JpcHQuLi5cIjtcbiAgICAgICAgdGhpcy5fYWZ0ZXJTY3JpcHRzRXhpdENvZGUgPSBhd2FpdCB0aGlzLmV4ZWNTY3JpcHRzKHRoaXMuYWZ0ZXJTY3JpcHRzLCBleHBhbmRlZCwgbWVzc2FnZSk7XG5cbiAgICAgICAgdGhpcy5wcmludEFmdGVyU2NyaXB0RXhpdGVkU3RyaW5nKHRoaXMuX2FmdGVyU2NyaXB0c0V4aXRDb2RlKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGFzeW5jIGV4ZWNTY3JpcHRzIChzY3JpcHRzOiBzdHJpbmdbXSwgZXhwYW5kZWQ6IHtba2V5OiBzdHJpbmddOiBzdHJpbmd9LCBtZXNzYWdlOiBzdHJpbmcpOiBQcm9taXNlPG51bWJlcj4ge1xuICAgICAgICBjb25zdCBjd2QgPSB0aGlzLmFyZ3YuY3dkO1xuICAgICAgICBjb25zdCBzdGF0ZURpciA9IHRoaXMuYXJndi5zdGF0ZURpcjtcbiAgICAgICAgY29uc3Qgc2FmZUpvYk5hbWUgPSB0aGlzLnNhZmVKb2JOYW1lO1xuICAgICAgICBjb25zdCBvdXRwdXRGaWxlc1BhdGggPSBgJHtjd2R9LyR7c3RhdGVEaXJ9L291dHB1dC8ke3NhZmVKb2JOYW1lfS5sb2dgO1xuICAgICAgICBjb25zdCBidWlsZFZvbHVtZU5hbWUgPSB0aGlzLmJ1aWxkVm9sdW1lTmFtZTtcbiAgICAgICAgY29uc3QgdG1wVm9sdW1lTmFtZSA9IHRoaXMudG1wVm9sdW1lTmFtZTtcbiAgICAgICAgY29uc3QgaW1hZ2VOYW1lID0gdGhpcy5pbWFnZU5hbWUoZXhwYW5kZWQpO1xuICAgICAgICBjb25zdCB3cml0ZVN0cmVhbXMgPSB0aGlzLndyaXRlU3RyZWFtcztcblxuICAgICAgICBpZiAoc2NyaXB0cy5sZW5ndGggPT09IDAgfHwgc2NyaXB0c1swXSA9PSBudWxsKSByZXR1cm4gMDtcblxuICAgICAgICBpZiAobWVzc2FnZS5sZW5ndGggPiAwKSB3cml0ZVN0cmVhbXMuc3Rkb3V0KGNoYWxrYCR7dGhpcy5mb3JtYXR0ZWRKb2JOYW1lfSB7bWFnZW50YUJyaWdodCAke21lc3NhZ2V9fVxcbmApO1xuXG4gICAgICAgIC8vIENvcHkgZ2l0IHRyYWNrZWQgZmlsZXMgdG8gYnVpbGQgZm9sZGVyIGlmIHNoZWxsIGlzb2xhdGlvbiBlbmFibGVkLlxuICAgICAgICBpZiAoIWltYWdlTmFtZSAmJiB0aGlzLmFyZ3Yuc2hlbGxJc29sYXRpb24pIHtcbiAgICAgICAgICAgIGF3YWl0IFV0aWxzLnJzeW5jVHJhY2tlZEZpbGVzKGN3ZCwgc3RhdGVEaXIsIGAke3NhZmVKb2JOYW1lfWApO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMuaW50ZXJhY3RpdmUpIHtcbiAgICAgICAgICAgIGxldCBpQ21kID0gXCJzZXQgLWVvIHBpcGVmYWlsXFxuXCI7XG4gICAgICAgICAgICBpQ21kICs9IHRoaXMuZ2VuZXJhdGVTY3JpcHRDb21tYW5kcyhzY3JpcHRzKTtcblxuICAgICAgICAgICAgY29uc3QgaW50ZXJhY3RpdmVDcCA9IGV4ZWNhKGlDbWQsIHtcbiAgICAgICAgICAgICAgICBjd2QsXG4gICAgICAgICAgICAgICAgc2hlbGw6IFwiYmFzaFwiLFxuICAgICAgICAgICAgICAgIHN0ZGlvOiBbXCJpbmhlcml0XCIsIFwiaW5oZXJpdFwiLCBcImluaGVyaXRcIl0sXG4gICAgICAgICAgICAgICAgZW52OiB7Li4uZXhwYW5kZWQsIC4uLnByb2Nlc3MuZW52fSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlPG51bWJlcj4oKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICAgICAgICAgIHZvaWQgaW50ZXJhY3RpdmVDcC5vbihcImV4aXRcIiwgKGNvZGUpID0+IHJlc29sdmUoY29kZSA/PyAwKSk7XG4gICAgICAgICAgICAgICAgdm9pZCBpbnRlcmFjdGl2ZUNwLm9uKFwiZXJyb3JcIiwgKGVycikgPT4gcmVqZWN0KGVycikpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLnJlZnJlc2hMb25nUnVubmluZ1NpbGVudFRpbWVvdXQod3JpdGVTdHJlYW1zKTtcblxuICAgICAgICBpZiAoaW1hZ2VOYW1lICYmICF0aGlzLl9jb250YWluZXJJZCkge1xuICAgICAgICAgICAgbGV0IGRvY2tlckNtZCA9IGAke3RoaXMuYXJndi5jb250YWluZXJFeGVjdXRhYmxlfSBjcmVhdGUgLS1pbnRlcmFjdGl2ZSAke3RoaXMuZ2VuZXJhdGVJbmplY3RTU0hBZ2VudE9wdGlvbnMoKX0gYDtcbiAgICAgICAgICAgIGlmICh0aGlzLmFyZ3YucHJpdmlsZWdlZCkge1xuICAgICAgICAgICAgICAgIGRvY2tlckNtZCArPSBcIi0tcHJpdmlsZWdlZCBcIjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKHRoaXMuYXJndi51bGltaXQgIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICBkb2NrZXJDbWQgKz0gYC0tdWxpbWl0IG5vZmlsZT0ke3RoaXMuYXJndi51bGltaXR9IGA7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmICh0aGlzLmFyZ3YudW1hc2sgPT09IHRydWUpIHtcbiAgICAgICAgICAgICAgICBkb2NrZXJDbWQgKz0gXCItLXVzZXIgMDowIFwiO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAodGhpcy5hcmd2LmNvbnRhaW5lck1hY0FkZHJlc3MpIHtcbiAgICAgICAgICAgICAgICBkb2NrZXJDbWQgKz0gYC0tbWFjLWFkZHJlc3MgXCIke3RoaXMuYXJndi5jb250YWluZXJNYWNBZGRyZXNzfVwiIGA7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGltYWdlVXNlciA9IHRoaXMuaW1hZ2VVc2VyKGV4cGFuZGVkKTtcbiAgICAgICAgICAgIGlmIChpbWFnZVVzZXIpIHtcbiAgICAgICAgICAgICAgICBkb2NrZXJDbWQgKz0gYC0tdXNlciAke2ltYWdlVXNlcn0gYDtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKHRoaXMuYXJndi5jb250YWluZXJFbXVsYXRlKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgcnVubmVyTmFtZTogc3RyaW5nID0gdGhpcy5hcmd2LmNvbnRhaW5lckVtdWxhdGU7XG5cbiAgICAgICAgICAgICAgICBpZiAoIUdpdGxhYlJ1bm5lclByZXNldFZhbHVlcy5pbmNsdWRlcyhydW5uZXJOYW1lKSkge1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJJbnZhbGlkIGdpdGxhYiBydW5uZXIgdG8gZW11bGF0ZS5cIik7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgY29uc3QgbWVtb3J5Q29uZmlnID0gR2l0bGFiUnVubmVyTWVtb3J5UHJlc2V0VmFsdWVbcnVubmVyTmFtZV07XG4gICAgICAgICAgICAgICAgY29uc3QgY3B1Q29uZmlnID0gR2l0bGFiUnVubmVyQ1BVc1ByZXNldFZhbHVlW3J1bm5lck5hbWVdO1xuXG4gICAgICAgICAgICAgICAgZG9ja2VyQ21kICs9IGAtLW1lbW9yeT0ke21lbW9yeUNvbmZpZ31tIGA7XG4gICAgICAgICAgICAgICAgZG9ja2VyQ21kICs9IGAtLWtlcm5lbC1tZW1vcnk9JHttZW1vcnlDb25maWd9bSBgO1xuICAgICAgICAgICAgICAgIGRvY2tlckNtZCArPSBgLS1jcHVzPSR7Y3B1Q29uZmlnfSBgO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBob3N0IGFuZCBub25lIG5ldHdvcmtzIGhhdmUgdG8gYmUgc3BlY2lmaWVkIHVzaW5nIC0tbmV0d29yaywgc2luY2UgdGhleSBjYW5ub3QgYmUgdXNlZCB3aXRoXG4gICAgICAgICAgICAvLyBgZG9ja2VyIG5ldHdvcmsgY29ubmVjdGAuXG4gICAgICAgICAgICBmb3IgKGNvbnN0IG5ldHdvcmsgb2YgdGhpcy5hcmd2Lm5ldHdvcmspIHtcbiAgICAgICAgICAgICAgICBpZiAoW1wiaG9zdFwiLCBcIm5vbmVcIl0uaW5jbHVkZXMobmV0d29yaykpIHtcbiAgICAgICAgICAgICAgICAgICAgZG9ja2VyQ21kICs9IGAtLW5ldHdvcmsgJHtuZXR3b3JrfSBgO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIFRoZSBkZWZhdWx0IHBvZG1hbiBuZXR3b3JrIG1vZGUgaXMgbm90IGBicmlkZ2VgLCB3aGljaCBtZWFucyBhIGBwb2RtYW4gbmV0d29yayBjb25uZWN0YCBjYWxsIHdpbGwgZmFpbFxuICAgICAgICAgICAgLy8gd2hlbiBjb25uZWN0aW5nIHVzZXIgZGVmaW5lZCBuZXR3b3Jrcy4gVGhlIHdvcmthcm91bmQgaXMgdG8gdXNlIGEgdXNlciBkZWZpbmVkIG5ldHdvcmsgb24gY29udGFpbmVyXG4gICAgICAgICAgICAvLyBjcmVhdGlvbi5cbiAgICAgICAgICAgIC8vXG4gICAgICAgICAgICAvLyBTZWUgaHR0cHM6Ly9naXRodWIuY29tL2NvbnRhaW5lcnMvcG9kbWFuL2lzc3Vlcy8xOTU3N1xuICAgICAgICAgICAgLy9cbiAgICAgICAgICAgIC8vIFRoaXMgc2hvdWxkIG5vdCBjbGFzaCB3aXRoIHRoZSBgaG9zdGAgYW5kIGBub25lYCBuZXR3b3JrcyBhYm92ZSwgc2luY2Ugc2VydmljZSBjcmVhdGlvbiBzaG91bGQgaGF2ZVxuICAgICAgICAgICAgLy8gZmFpbGVkIHdoZW4gdXNpbmcgYGhvc3RgIG9yIGBub25lYCBuZXR3b3Jrcy5cbiAgICAgICAgICAgIGlmICh0aGlzLl9zZXJ2aWNlTmV0d29ya0lkKSB7XG4gICAgICAgICAgICAgICAgLy8gYGJ1aWxkYCBhbGlhczogaHR0cHM6Ly9naXRsYWIuY29tL2dpdGxhYi1vcmcvZ2l0bGFiLXJ1bm5lci8tL2lzc3Vlcy8yNzA2MFxuICAgICAgICAgICAgICAgIGRvY2tlckNtZCArPSBgLS1uZXR3b3JrICR7dGhpcy5fc2VydmljZU5ldHdvcmtJZH0gLS1uZXR3b3JrLWFsaWFzIGJ1aWxkIGA7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGRvY2tlckNtZCArPSBgLS12b2x1bWUgJHtidWlsZFZvbHVtZU5hbWV9Oi9nY2wtYnVpbGRzIGA7XG4gICAgICAgICAgICBkb2NrZXJDbWQgKz0gYC0tdm9sdW1lICR7dG1wVm9sdW1lTmFtZX06JHt0aGlzLmZpbGVWYXJpYWJsZXNEaXJ9IGA7XG4gICAgICAgICAgICBkb2NrZXJDbWQgKz0gXCItLXdvcmtkaXIgL2djbC1idWlsZHMgXCI7XG5cbiAgICAgICAgICAgIGZvciAoY29uc3Qgdm9sdW1lIG9mIHRoaXMuYXJndi52b2x1bWUpIHtcbiAgICAgICAgICAgICAgICBkb2NrZXJDbWQgKz0gYC0tdm9sdW1lICR7dm9sdW1lfSBgO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBmb3IgKGNvbnN0IGV4dHJhSG9zdCBvZiB0aGlzLmFyZ3YuZXh0cmFIb3N0KSB7XG4gICAgICAgICAgICAgICAgZG9ja2VyQ21kICs9IGAtLWFkZC1ob3N0PSR7ZXh0cmFIb3N0fSBgO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBmb3IgKGNvbnN0IFtrZXksIHZhbF0gb2YgT2JqZWN0LmVudHJpZXMoZXhwYW5kZWQpKSB7XG4gICAgICAgICAgICAgICAgLy8gUmVwbGFjaW5nIGAnYCB3aXRoIGAnXFwnJ2AgdG8gY29ycmVjdGx5IGhhbmRsZSBzaW5nbGUgcXVvdGVzKGlmIGB2YWxgIGNvbnRhaW5zIGAnYCkgaW4gc2hlbGwgY29tbWFuZHNcbiAgICAgICAgICAgICAgICBkb2NrZXJDbWQgKz0gYCAgLWUgJyR7a2V5fT0ke3ZhbC5yZXBsYWNlKC8nL2csIFwiJ1xcXFwnJ1wiKX0nIFxcXFxcXG5gO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAodGhpcy5pbWFnZUVudHJ5cG9pbnQpIHtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5pbWFnZUVudHJ5cG9pbnRbMF0gPT0gXCJcIikge1xuICAgICAgICAgICAgICAgICAgICBkb2NrZXJDbWQgKz0gXCItLWVudHJ5cG9pbnQgJycgXCI7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgZG9ja2VyQ21kICs9IGAtLWVudHJ5cG9pbnQgJHt0aGlzLmltYWdlRW50cnlwb2ludFswXX0gYDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGRvY2tlckNtZCArPSBgJHsoYXdhaXQgdGhpcy5tb3VudENhY2hlQ21kKHdyaXRlU3RyZWFtcywgZXhwYW5kZWQpKS5qb2luKFwiIFwiKX0gYDtcbiAgICAgICAgICAgIGRvY2tlckNtZCArPSBgJHtpbWFnZU5hbWV9IGA7XG5cbiAgICAgICAgICAgIGlmICh0aGlzLmltYWdlRW50cnlwb2ludD8ubGVuZ3RoID8/IDAgPiAxKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5pbWFnZUVudHJ5cG9pbnQ/LnNsaWNlKDEpLmZvckVhY2goKGUpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgZG9ja2VyQ21kICs9IGBcIiR7ZX1cIiBgO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBkb2NrZXJDbWQgKz0gXCJzaCAtYyBcXFwiXFxuXCI7XG4gICAgICAgICAgICBkb2NrZXJDbWQgKz0gXCJpZiBbIC14IC91c3IvbG9jYWwvYmluL2Jhc2ggXTsgdGhlblxcblwiO1xuICAgICAgICAgICAgZG9ja2VyQ21kICs9IFwiXFx0ZXhlYyAvdXNyL2xvY2FsL2Jpbi9iYXNoIFxcblwiO1xuICAgICAgICAgICAgZG9ja2VyQ21kICs9IFwiZWxpZiBbIC14IC91c3IvYmluL2Jhc2ggXTsgdGhlblxcblwiO1xuICAgICAgICAgICAgZG9ja2VyQ21kICs9IFwiXFx0ZXhlYyAvdXNyL2Jpbi9iYXNoIFxcblwiO1xuICAgICAgICAgICAgZG9ja2VyQ21kICs9IFwiZWxpZiBbIC14IC9iaW4vYmFzaCBdOyB0aGVuXFxuXCI7XG4gICAgICAgICAgICBkb2NrZXJDbWQgKz0gXCJcXHRleGVjIC9iaW4vYmFzaCBcXG5cIjtcbiAgICAgICAgICAgIGRvY2tlckNtZCArPSBcImVsaWYgWyAteCAvdXNyL2xvY2FsL2Jpbi9zaCBdOyB0aGVuXFxuXCI7XG4gICAgICAgICAgICBkb2NrZXJDbWQgKz0gXCJcXHRleGVjIC91c3IvbG9jYWwvYmluL3NoIFxcblwiO1xuICAgICAgICAgICAgZG9ja2VyQ21kICs9IFwiZWxpZiBbIC14IC91c3IvYmluL3NoIF07IHRoZW5cXG5cIjtcbiAgICAgICAgICAgIGRvY2tlckNtZCArPSBcIlxcdGV4ZWMgL3Vzci9iaW4vc2ggXFxuXCI7XG4gICAgICAgICAgICBkb2NrZXJDbWQgKz0gXCJlbGlmIFsgLXggL2Jpbi9zaCBdOyB0aGVuXFxuXCI7XG4gICAgICAgICAgICBkb2NrZXJDbWQgKz0gXCJcXHRleGVjIC9iaW4vc2ggXFxuXCI7XG4gICAgICAgICAgICBkb2NrZXJDbWQgKz0gXCJlbGlmIFsgLXggL2J1c3lib3gvc2ggXTsgdGhlblxcblwiO1xuICAgICAgICAgICAgZG9ja2VyQ21kICs9IFwiXFx0ZXhlYyAvYnVzeWJveC9zaCBcXG5cIjtcbiAgICAgICAgICAgIGRvY2tlckNtZCArPSBcImVsc2VcXG5cIjtcbiAgICAgICAgICAgIGRvY2tlckNtZCArPSBcIlxcdGVjaG8gc2hlbGwgbm90IGZvdW5kXFxuXCI7XG4gICAgICAgICAgICBkb2NrZXJDbWQgKz0gXCJcXHRleGl0IDFcXG5cIjtcbiAgICAgICAgICAgIGRvY2tlckNtZCArPSBcImZpXFxuXFxcIlwiO1xuXG4gICAgICAgICAgICBjb25zdCB7c3Rkb3V0OiBjb250YWluZXJJZH0gPSBhd2FpdCBVdGlscy5iYXNoKGRvY2tlckNtZCwgY3dkKTtcblxuICAgICAgICAgICAgZm9yIChjb25zdCBuZXR3b3JrIG9mIHRoaXMuYXJndi5uZXR3b3JrKSB7XG4gICAgICAgICAgICAgICAgLy8gU3BlY2lhbCBuZXR3b3JrIG5hbWVzIHRoYXQgZG8gbm90IHdvcmsgd2l0aCBgZG9ja2VyIG5ldHdvcmsgY29ubmVjdGBcbiAgICAgICAgICAgICAgICBpZiAoW1wiaG9zdFwiLCBcIm5vbmVcIl0uaW5jbHVkZXMobmV0d29yaykpIHtcbiAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGF3YWl0IFV0aWxzLnNwYXduKFt0aGlzLmFyZ3YuY29udGFpbmVyRXhlY3V0YWJsZSwgXCJuZXR3b3JrXCIsIFwiY29ubmVjdFwiLCBuZXR3b3JrLCBgJHtjb250YWluZXJJZH1gXSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHRoaXMuX2NvbnRhaW5lcklkID0gY29udGFpbmVySWQ7XG4gICAgICAgICAgICB0aGlzLl9jb250YWluZXJzVG9DbGVhbi5wdXNoKHRoaXMuX2NvbnRhaW5lcklkKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGF3YWl0IHRoaXMuY29weUNhY2hlSW4od3JpdGVTdHJlYW1zLCBleHBhbmRlZCk7XG4gICAgICAgIGF3YWl0IHRoaXMuY29weUFydGlmYWN0c0luKHdyaXRlU3RyZWFtcyk7XG5cbiAgICAgICAgbGV0IGNtZCA9IFwic2V0IC1lbyBwaXBlZmFpbFxcblwiO1xuICAgICAgICBjbWQgKz0gXCJleGVjIDA8IC9kZXYvbnVsbFxcblwiO1xuXG4gICAgICAgIGlmICghaW1hZ2VOYW1lICYmIHRoaXMuYXJndi5zaGVsbElzb2xhdGlvbikge1xuICAgICAgICAgICAgY21kICs9IGBjZCAke3N0YXRlRGlyfS9idWlsZHMvJHtzYWZlSm9iTmFtZX0vXFxuYDtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChpbWFnZU5hbWUpIHtcbiAgICAgICAgICAgIGNtZCArPSBcImNkIC9nY2wtYnVpbGRzIFxcblwiO1xuXG4gICAgICAgICAgICBpZiAoZXhwYW5kZWRbXCJDSV9KT0JfU1RBVFVTXCJdICE9IFwicnVubmluZ1wiKSB7XG4gICAgICAgICAgICAgICAgLy8gRW5zdXJlcyB0aGUgZW52IGBDSV9KT0JfU1RBVFVTYCBpcyBwYXNzZWQgdG8gdGhlIGFmdGVyX3NjcmlwdCBjb250ZXh0XG4gICAgICAgICAgICAgICAgY21kICs9IGBleHBvcnQgQ0lfSk9CX1NUQVRVUz0ke2V4cGFuZGVkW1wiQ0lfSk9CX1NUQVRVU1wiXX1cXG5gO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGNtZCArPSB0aGlzLmdlbmVyYXRlU2NyaXB0Q29tbWFuZHMoc2NyaXB0cyk7XG5cbiAgICAgICAgY21kICs9IFwiZXhpdCAwXFxuXCI7XG5cbiAgICAgICAgY29uc3Qgam9iU2NyaXB0RmlsZSA9IGAke2N3ZH0vJHtzdGF0ZURpcn0vc2NyaXB0cy8ke3NhZmVKb2JOYW1lfV8ke3RoaXMuam9iSWR9YDtcbiAgICAgICAgYXdhaXQgZnMub3V0cHV0RmlsZShqb2JTY3JpcHRGaWxlLCBjbWQsIFwidXRmLThcIik7XG4gICAgICAgIGF3YWl0IGZzLmNobW9kKGpvYlNjcmlwdEZpbGUsIFwiMDc1NVwiKTtcbiAgICAgICAgdGhpcy5fZmlsZXNUb1JtLnB1c2goam9iU2NyaXB0RmlsZSk7XG5cbiAgICAgICAgaWYgKGltYWdlTmFtZSkge1xuICAgICAgICAgICAgYXdhaXQgVXRpbHMuc3Bhd24oW3RoaXMuYXJndi5jb250YWluZXJFeGVjdXRhYmxlLCBcImNwXCIsIGAke3N0YXRlRGlyfS9zY3JpcHRzLyR7c2FmZUpvYk5hbWV9XyR7dGhpcy5qb2JJZH1gLCBgJHt0aGlzLl9jb250YWluZXJJZH06L2djbC1jbWRgXSwgY3dkKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGNwID0gZXhlY2EodGhpcy5fY29udGFpbmVySWQgPyBgJHt0aGlzLmFyZ3YuY29udGFpbmVyRXhlY3V0YWJsZX0gc3RhcnQgLS1hdHRhY2ggLWkgJHt0aGlzLl9jb250YWluZXJJZH1gIDogXCJiYXNoXCIsIHtcbiAgICAgICAgICAgIGN3ZCxcbiAgICAgICAgICAgIHNoZWxsOiBcImJhc2hcIixcbiAgICAgICAgICAgIGVudjogaW1hZ2VOYW1lID8gcHJvY2Vzcy5lbnYgOiBleHBhbmRlZCxcbiAgICAgICAgfSk7XG5cbiAgICAgICAgY29uc3Qgb3V0RnVuYyA9IChsaW5lOiBzdHJpbmcsIHN0cmVhbTogKHR4dDogc3RyaW5nKSA9PiB2b2lkLCBjb2xvcml6ZTogKHN0cjogc3RyaW5nKSA9PiBzdHJpbmcpID0+IHtcbiAgICAgICAgICAgIHRoaXMucmVmcmVzaExvbmdSdW5uaW5nU2lsZW50VGltZW91dCh3cml0ZVN0cmVhbXMpO1xuICAgICAgICAgICAgc3RyZWFtKGAke3RoaXMuZm9ybWF0dGVkSm9iTmFtZX0gYCk7XG4gICAgICAgICAgICBpZiAobGluZS5zdGFydHNXaXRoKEdDTF9TSEVMTF9QUk9NUFRfUExBQ0VIT0xERVIpKSB7XG4gICAgICAgICAgICAgICAgLy8gcmVwbGFjZSB0aGUgR0NMX1NIRUxMX1BST01QVF9QTEFDRUhPTERFUiB3aXRoIGAkYCBhbmQgbWFrZSB0aGUgU0hFTExfUFJPTVBUIGxpbmUgZ3JlZW4gY29sb3JcbiAgICAgICAgICAgICAgICBsaW5lID0gbGluZS5zbGljZShHQ0xfU0hFTExfUFJPTVBUX1BMQUNFSE9MREVSLmxlbmd0aCk7XG4gICAgICAgICAgICAgICAgbGluZSA9IGNoYWxrYHtncmVlbiAkJHtsaW5lfX1gO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBzdHJlYW0oYCR7Y29sb3JpemUoXCI+XCIpfSBgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHN0cmVhbShgJHtsaW5lfVxcbmApO1xuICAgICAgICAgICAgZnMuYXBwZW5kRmlsZVN5bmMob3V0cHV0RmlsZXNQYXRoLCBgJHtsaW5lfVxcbmApO1xuICAgICAgICB9O1xuXG4gICAgICAgIGNvbnN0IHF1aWV0ID0gdGhpcy5hcmd2LnF1aWV0O1xuXG4gICAgICAgIHJldHVybiBhd2FpdCBuZXcgUHJvbWlzZTxudW1iZXI+KChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgICAgIGlmICghcXVpZXQpIHtcbiAgICAgICAgICAgICAgICBjcC5zdGRvdXQ/LnBpcGUoc3BsaXQyKCkpLm9uKFwiZGF0YVwiLCAoZTogc3RyaW5nKSA9PiBvdXRGdW5jKGUsIHdyaXRlU3RyZWFtcy5zdGRvdXQuYmluZCh3cml0ZVN0cmVhbXMpLCAocykgPT4gY2hhbGtge2dyZWVuQnJpZ2h0ICR7c319YCkpO1xuICAgICAgICAgICAgICAgIGNwLnN0ZGVycj8ucGlwZShzcGxpdDIoKSkub24oXCJkYXRhXCIsIChlOiBzdHJpbmcpID0+IG91dEZ1bmMoZSwgd3JpdGVTdHJlYW1zLnN0ZGVyci5iaW5kKHdyaXRlU3RyZWFtcyksIChzKSA9PiBjaGFsa2B7cmVkQnJpZ2h0ICR7c319YCkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdm9pZCBjcC5vbihcImV4aXRcIiwgKGNvZGUpID0+IHJlc29sdmUoY29kZSA/PyAwKSk7XG4gICAgICAgICAgICB2b2lkIGNwLm9uKFwiZXJyb3JcIiwgKGVycikgPT4gcmVqZWN0KGVycikpO1xuXG4gICAgICAgICAgICBpZiAoaW1hZ2VOYW1lKSB7XG4gICAgICAgICAgICAgICAgY3Auc3RkaW4/LmVuZChcIi9nY2wtY21kXCIpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBjcC5zdGRpbj8uZW5kKGAuLyR7c3RhdGVEaXJ9L3NjcmlwdHMvJHtzYWZlSm9iTmFtZX1fJHt0aGlzLmpvYklkfWApO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGltYWdlTmFtZSAodmFyczoge1trZXk6IHN0cmluZ106IHN0cmluZ30gPSB7fSk6IHN0cmluZyB8IG51bGwge1xuICAgICAgICBjb25zdCBpbWFnZSA9IHRoaXMuam9iRGF0YVtcImltYWdlXCJdO1xuICAgICAgICBpZiAoIWltYWdlKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5hcmd2LnNoZWxsRXhlY3V0b3JOb0ltYWdlKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIC8vIGh0dHBzOi8vZG9jcy5naXRsYWIuY29tL2VlL2NpL3J1bm5lcnMvaG9zdGVkX3J1bm5lcnMvbGludXguaHRtbCNjb250YWluZXItaW1hZ2VzXG4gICAgICAgICAgICAgICAgcmV0dXJuIFwiZG9ja2VyLmlvL3J1Ynk6My4xXCI7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgZXhwYW5kZWQgPSBVdGlscy5leHBhbmRWYXJpYWJsZXModmFycyk7XG4gICAgICAgIGNvbnN0IGltYWdlTmFtZSA9IFV0aWxzLmV4cGFuZFRleHQoaW1hZ2UubmFtZSwgZXhwYW5kZWQpO1xuICAgICAgICByZXR1cm4gaW1hZ2VOYW1lLmluY2x1ZGVzKFwiOlwiKSA/IGltYWdlTmFtZSA6IGAke2ltYWdlTmFtZX06bGF0ZXN0YDtcbiAgICB9XG5cbiAgICBwcml2YXRlIGltYWdlVXNlciAodmFyczoge1trZXk6IHN0cmluZ106IHN0cmluZ30gPSB7fSk6IHN0cmluZyB8IG51bGwge1xuICAgICAgICBjb25zdCBpbWFnZSA9IHRoaXMuam9iRGF0YVtcImltYWdlXCJdO1xuICAgICAgICBpZiAoIWltYWdlKSByZXR1cm4gbnVsbDtcbiAgICAgICAgaWYgKCFpbWFnZVtcImRvY2tlclwiXSkgcmV0dXJuIG51bGw7XG4gICAgICAgIHJldHVybiBVdGlscy5leHBhbmRUZXh0KGltYWdlW1wiZG9ja2VyXCJdW1widXNlclwiXSwgdmFycyk7XG4gICAgfVxuXG4gICAgZ2V0IGltYWdlRW50cnlwb2ludCAoKTogc3RyaW5nW10gfCBudWxsIHtcbiAgICAgICAgY29uc3QgaW1hZ2UgPSB0aGlzLmpvYkRhdGFbXCJpbWFnZVwiXTtcblxuICAgICAgICBpZiAoIWltYWdlPy5lbnRyeXBvaW50KSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICBhc3NlcnQoQXJyYXkuaXNBcnJheShpbWFnZS5lbnRyeXBvaW50KSwgXCJpbWFnZTplbnRyeXBvaW50IG11c3QgYmUgYW4gYXJyYXlcIik7XG4gICAgICAgIHJldHVybiBpbWFnZS5lbnRyeXBvaW50O1xuICAgIH1cblxuICAgIHByaXZhdGUgYXN5bmMgcHVsbEltYWdlICh3cml0ZVN0cmVhbXM6IFdyaXRlU3RyZWFtcywgaW1hZ2VUb1B1bGw6IHN0cmluZykge1xuICAgICAgICBjb25zdCBwdWxsUG9saWN5ID0gdGhpcy5hcmd2LnB1bGxQb2xpY3k7XG4gICAgICAgIGNvbnN0IGFjdHVhbFB1bGwgPSBhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICBjb25zdCB0aW1lID0gcHJvY2Vzcy5ocnRpbWUoKTtcbiAgICAgICAgICAgIGF3YWl0IFV0aWxzLnNwYXduKFt0aGlzLmFyZ3YuY29udGFpbmVyRXhlY3V0YWJsZSwgXCJwdWxsXCIsIGltYWdlVG9QdWxsXSk7XG4gICAgICAgICAgICBjb25zdCBlbmRUaW1lID0gcHJvY2Vzcy5ocnRpbWUodGltZSk7XG4gICAgICAgICAgICB3cml0ZVN0cmVhbXMuc3Rkb3V0KGNoYWxrYCR7dGhpcy5mb3JtYXR0ZWRKb2JOYW1lfSB7bWFnZW50YUJyaWdodCBwdWxsZWR9ICR7aW1hZ2VUb1B1bGx9IGluIHttYWdlbnRhICR7cHJldHR5SHJ0aW1lKGVuZFRpbWUpfX1cXG5gKTtcbiAgICAgICAgICAgIHRoaXMucmVmcmVzaExvbmdSdW5uaW5nU2lsZW50VGltZW91dCh3cml0ZVN0cmVhbXMpO1xuICAgICAgICB9O1xuXG4gICAgICAgIGlmIChwdWxsUG9saWN5ID09PSBcImFsd2F5c1wiKSB7XG4gICAgICAgICAgICBhd2FpdCBhY3R1YWxQdWxsKCk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGF3YWl0IFV0aWxzLnNwYXduKFt0aGlzLmFyZ3YuY29udGFpbmVyRXhlY3V0YWJsZSwgXCJpbWFnZVwiLCBcImluc3BlY3RcIiwgaW1hZ2VUb1B1bGxdKTtcbiAgICAgICAgfSBjYXRjaCAoZTogYW55KSB7XG4gICAgICAgICAgICBhd2FpdCBhY3R1YWxQdWxsKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIGFzeW5jIGluaXRQcm9kdWNlclJlcG9ydHNEb3RlbnZWYXJpYWJsZXMgKHdyaXRlU3RyZWFtczogV3JpdGVTdHJlYW1zLCBleHBhbmRlZDoge1trZXk6IHN0cmluZ106IHN0cmluZ30pIHtcbiAgICAgICAgY29uc3QgY3dkID0gdGhpcy5hcmd2LmN3ZDtcbiAgICAgICAgY29uc3Qgc3RhdGVEaXIgPSB0aGlzLmFyZ3Yuc3RhdGVEaXI7XG4gICAgICAgIGNvbnN0IHByb2R1Y2VycyA9IHRoaXMucHJvZHVjZXJzO1xuICAgICAgICBsZXQgcHJvZHVjZXJSZXBvcnRzRW52cyA9IHt9O1xuICAgICAgICBmb3IgKGNvbnN0IHByb2R1Y2VyIG9mIHByb2R1Y2VycyA/PyBbXSkge1xuICAgICAgICAgICAgY29uc3QgcHJvZHVjZXJEb3RlbnYgPSBVdGlscy5leHBhbmRUZXh0KHByb2R1Y2VyLmRvdGVudiwgZXhwYW5kZWQpO1xuICAgICAgICAgICAgaWYgKHByb2R1Y2VyRG90ZW52ID09PSBudWxsKSBjb250aW51ZTtcblxuICAgICAgICAgICAgY29uc3Qgc2FmZVByb2R1Y2VyTmFtZSA9IFV0aWxzLnNhZmVEb2NrZXJTdHJpbmcocHJvZHVjZXIubmFtZSk7XG4gICAgICAgICAgICBjb25zdCBkb3RlbnZGb2xkZXIgPSBgJHtjd2R9LyR7c3RhdGVEaXJ9L2FydGlmYWN0cy8ke3NhZmVQcm9kdWNlck5hbWV9Ly5naXRsYWItY2ktcmVwb3J0cy9kb3RlbnYvYDtcbiAgICAgICAgICAgIGlmIChhd2FpdCBmcy5wYXRoRXhpc3RzKGRvdGVudkZvbGRlcikpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBkb3RlbnZGaWxlcyA9IChhd2FpdCBVdGlscy5zcGF3bihbXCJmaW5kXCIsIFwiLlwiLCBcIi10eXBlXCIsIFwiZlwiXSwgZG90ZW52Rm9sZGVyKSkuc3Rkb3V0LnNwbGl0KFwiXFxuXCIpO1xuICAgICAgICAgICAgICAgIGZvciAoY29uc3QgZG90ZW52RmlsZSBvZiBkb3RlbnZGaWxlcykge1xuICAgICAgICAgICAgICAgICAgICBpZiAoZG90ZW52RmlsZSA9PSBcIlwiKSBjb250aW51ZTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcHJvZHVjZXJSZXBvcnRFbnYgPSBkb3RlbnYucGFyc2UoYXdhaXQgZnMucmVhZEZpbGUoYCR7ZG90ZW52Rm9sZGVyfS8ke2RvdGVudkZpbGV9YCkpO1xuICAgICAgICAgICAgICAgICAgICBwcm9kdWNlclJlcG9ydHNFbnZzID0gey4uLnByb2R1Y2VyUmVwb3J0c0VudnMsIC4uLnByb2R1Y2VyUmVwb3J0RW52fTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHdyaXRlU3RyZWFtcy5zdGRlcnIoY2hhbGtgJHt0aGlzLmZvcm1hdHRlZEpvYk5hbWV9IHt5ZWxsb3cgcmVwb3J0cy5kb3RlbnYgcHJvZHVjZWQgYnkgJyR7cHJvZHVjZXIubmFtZX0nIGNvdWxkIG5vdCBiZSBmb3VuZH1cXG5gKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBwcm9kdWNlclJlcG9ydHNFbnZzO1xuICAgIH1cblxuICAgIHByaXZhdGUgYXN5bmMgY29weUNhY2hlSW4gKHdyaXRlU3RyZWFtczogV3JpdGVTdHJlYW1zLCBleHBhbmRlZDoge1trZXk6IHN0cmluZ106IHN0cmluZ30pIHtcbiAgICAgICAgaWYgKHRoaXMuYXJndi5tb3VudENhY2hlICYmIHRoaXMuaW1hZ2VOYW1lKGV4cGFuZGVkKSkgcmV0dXJuO1xuICAgICAgICBpZiAoKCF0aGlzLmltYWdlTmFtZShleHBhbmRlZCkgJiYgIXRoaXMuYXJndi5zaGVsbElzb2xhdGlvbikgfHwgdGhpcy5jYWNoZS5sZW5ndGggPT09IDApIHJldHVybjtcblxuICAgICAgICBjb25zdCBjd2QgPSB0aGlzLmFyZ3YuY3dkO1xuICAgICAgICBjb25zdCBzdGF0ZURpciA9IHRoaXMuYXJndi5zdGF0ZURpcjtcblxuICAgICAgICBmb3IgKGNvbnN0IGMgb2YgdGhpcy5jYWNoZSkge1xuICAgICAgICAgICAgaWYgKCFbXCJwdWxsXCIsIFwicHVsbC1wdXNoXCJdLmluY2x1ZGVzKGMucG9saWN5KSkgcmV0dXJuO1xuXG4gICAgICAgICAgICBjb25zdCB0aW1lID0gcHJvY2Vzcy5ocnRpbWUoKTtcbiAgICAgICAgICAgIGNvbnN0IGNhY2hlTmFtZSA9IGF3YWl0IHRoaXMuZ2V0VW5pcXVlQ2FjaGVOYW1lKGN3ZCwgZXhwYW5kZWQsIGMua2V5KTtcbiAgICAgICAgICAgIGNvbnN0IGNhY2hlRm9sZGVyID0gYCR7Y3dkfS8ke3N0YXRlRGlyfS9jYWNoZS8ke2NhY2hlTmFtZX1gO1xuICAgICAgICAgICAgaWYgKCFhd2FpdCBmcy5wYXRoRXhpc3RzKGNhY2hlRm9sZGVyKSkge1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBhd2FpdCBNdXRleC5leGNsdXNpdmUoY2FjaGVOYW1lLCBhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5jb3B5SW4oY2FjaGVGb2xkZXIpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBjb25zdCBlbmRUaW1lID0gcHJvY2Vzcy5ocnRpbWUodGltZSk7XG4gICAgICAgICAgICB3cml0ZVN0cmVhbXMuc3Rkb3V0KGNoYWxrYCR7dGhpcy5mb3JtYXR0ZWRKb2JOYW1lfSB7bWFnZW50YUJyaWdodCBpbXBvcnRlZCBjYWNoZSAnJHtjYWNoZU5hbWV9J30gaW4ge21hZ2VudGEgJHtwcmV0dHlIcnRpbWUoZW5kVGltZSl9fVxcbmApO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBhc3luYyBjb3B5QXJ0aWZhY3RzSW4gKHdyaXRlU3RyZWFtczogV3JpdGVTdHJlYW1zKSB7XG4gICAgICAgIGlmICgoIXRoaXMuaW1hZ2VOYW1lKHRoaXMuX3ZhcmlhYmxlcykgJiYgIXRoaXMuYXJndi5zaGVsbElzb2xhdGlvbikgfHwgKHRoaXMucHJvZHVjZXJzID8/IFtdKS5sZW5ndGggPT09IDApIHJldHVybjtcblxuICAgICAgICBjb25zdCBjd2QgPSB0aGlzLmFyZ3YuY3dkO1xuICAgICAgICBjb25zdCBzdGF0ZURpciA9IHRoaXMuYXJndi5zdGF0ZURpcjtcbiAgICAgICAgY29uc3QgdGltZSA9IHByb2Nlc3MuaHJ0aW1lKCk7XG4gICAgICAgIGNvbnN0IHByb21pc2VzID0gW107XG4gICAgICAgIGZvciAoY29uc3QgcHJvZHVjZXIgb2YgdGhpcy5wcm9kdWNlcnMgPz8gW10pIHtcbiAgICAgICAgICAgIGNvbnN0IHByb2R1Y2VyU2FmZU5hbWUgPSBVdGlscy5zYWZlRG9ja2VyU3RyaW5nKHByb2R1Y2VyLm5hbWUpO1xuICAgICAgICAgICAgY29uc3QgYXJ0aWZhY3RGb2xkZXIgPSBgJHtjd2R9LyR7c3RhdGVEaXJ9L2FydGlmYWN0cy8ke3Byb2R1Y2VyU2FmZU5hbWV9YDtcbiAgICAgICAgICAgIGlmICghYXdhaXQgZnMucGF0aEV4aXN0cyhhcnRpZmFjdEZvbGRlcikpIHtcbiAgICAgICAgICAgICAgICBhd2FpdCBmcy5ta2RpcnAoYXJ0aWZhY3RGb2xkZXIpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCByZWFkZGlyID0gYXdhaXQgZnMucmVhZGRpcihhcnRpZmFjdEZvbGRlcik7XG4gICAgICAgICAgICBpZiAocmVhZGRpci5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgICAgICB3cml0ZVN0cmVhbXMuc3RkZXJyKGNoYWxrYCR7dGhpcy5mb3JtYXR0ZWRKb2JOYW1lfSB7eWVsbG93IGFydGlmYWN0cyBmcm9tIHtibHVlQnJpZ2h0ICR7cHJvZHVjZXJTYWZlTmFtZX19IHdhcyBlbXB0eX1cXG5gKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcHJvbWlzZXMucHVzaCh0aGlzLmNvcHlJbihhcnRpZmFjdEZvbGRlcikpO1xuICAgICAgICB9XG4gICAgICAgIGF3YWl0IFByb21pc2UuYWxsKHByb21pc2VzKTtcbiAgICAgICAgY29uc3QgZW5kVGltZSA9IHByb2Nlc3MuaHJ0aW1lKHRpbWUpO1xuICAgICAgICB3cml0ZVN0cmVhbXMuc3Rkb3V0KGNoYWxrYCR7dGhpcy5mb3JtYXR0ZWRKb2JOYW1lfSB7bWFnZW50YUJyaWdodCBpbXBvcnRlZCBhcnRpZmFjdHN9IGluIHttYWdlbnRhICR7cHJldHR5SHJ0aW1lKGVuZFRpbWUpfX1cXG5gKTtcbiAgICB9XG5cbiAgICBjb3B5SW4gKHNvdXJjZTogc3RyaW5nKSB7XG4gICAgICAgIGNvbnN0IHNhZmVKb2JOYW1lID0gdGhpcy5zYWZlSm9iTmFtZTtcbiAgICAgICAgaWYgKCF0aGlzLmltYWdlTmFtZSh0aGlzLl92YXJpYWJsZXMpICYmIHRoaXMuYXJndi5zaGVsbElzb2xhdGlvbikge1xuICAgICAgICAgICAgcmV0dXJuIFV0aWxzLnNwYXduKFtcInJzeW5jXCIsIFwiLWFcIiwgYCR7c291cmNlfS8uYCwgYCR7dGhpcy5hcmd2LmN3ZH0vJHt0aGlzLmFyZ3Yuc3RhdGVEaXJ9L2J1aWxkcy8ke3NhZmVKb2JOYW1lfWBdKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gVXRpbHMuc3Bhd24oW3RoaXMuYXJndi5jb250YWluZXJFeGVjdXRhYmxlLCBcImNwXCIsIGAke3NvdXJjZX0vLmAsIGAke3RoaXMuX2NvbnRhaW5lcklkfTovZ2NsLWJ1aWxkc2BdKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGFzeW5jIGNvcHlDYWNoZU91dCAod3JpdGVTdHJlYW1zOiBXcml0ZVN0cmVhbXMsIGV4cGFuZGVkOiB7W2tleTogc3RyaW5nXTogc3RyaW5nfSkge1xuICAgICAgICBpZiAodGhpcy5hcmd2Lm1vdW50Q2FjaGUgJiYgdGhpcy5pbWFnZU5hbWUoZXhwYW5kZWQpKSByZXR1cm47XG4gICAgICAgIGlmICgoIXRoaXMuaW1hZ2VOYW1lKGV4cGFuZGVkKSAmJiAhdGhpcy5hcmd2LnNoZWxsSXNvbGF0aW9uKSB8fCB0aGlzLmNhY2hlLmxlbmd0aCA9PT0gMCkgcmV0dXJuO1xuXG4gICAgICAgIGNvbnN0IGN3ZCA9IHRoaXMuYXJndi5jd2Q7XG4gICAgICAgIGNvbnN0IHN0YXRlRGlyID0gdGhpcy5hcmd2LnN0YXRlRGlyO1xuXG4gICAgICAgIGxldCB0aW1lLCBlbmRUaW1lO1xuICAgICAgICBmb3IgKGNvbnN0IGMgb2YgdGhpcy5jYWNoZSkge1xuICAgICAgICAgICAgaWYgKCFbXCJwdXNoXCIsIFwicHVsbC1wdXNoXCJdLmluY2x1ZGVzKGMucG9saWN5KSkgcmV0dXJuO1xuICAgICAgICAgICAgaWYgKFwib25fc3VjY2Vzc1wiID09PSBjLndoZW4gJiYgdGhpcy5qb2JTdGF0dXMgIT09IFwic3VjY2Vzc1wiKSByZXR1cm47XG4gICAgICAgICAgICBpZiAoXCJvbl9mYWlsdXJlXCIgPT09IGMud2hlbiAmJiB0aGlzLmpvYlN0YXR1cyA9PT0gXCJzdWNjZXNzXCIpIHJldHVybjtcbiAgICAgICAgICAgIGNvbnN0IGNhY2hlTmFtZSA9IGF3YWl0IHRoaXMuZ2V0VW5pcXVlQ2FjaGVOYW1lKGN3ZCwgZXhwYW5kZWQsIGMua2V5KTtcbiAgICAgICAgICAgIGZvciAoY29uc3QgcGF0aCBvZiBjLnBhdGhzKSB7XG4gICAgICAgICAgICAgICAgdGltZSA9IHByb2Nlc3MuaHJ0aW1lKCk7XG4gICAgICAgICAgICAgICAgY29uc3QgZXhwYW5kZWRQYXRoID0gVXRpbHMuZXhwYW5kVGV4dChwYXRoLCBleHBhbmRlZCkucmVwbGFjZShgJHtleHBhbmRlZC5DSV9QUk9KRUNUX0RJUn0vYCwgXCJcIik7XG4gICAgICAgICAgICAgICAgbGV0IGNtZCA9IFwic2hvcHQgLXMgZ2xvYnN0YXIgbnVsbGdsb2IgZG90Z2xvYlxcblwiO1xuICAgICAgICAgICAgICAgIGNtZCArPSBgbWtkaXIgLXAgLi4vLi4vY2FjaGUvJHtjYWNoZU5hbWV9XFxuYDtcbiAgICAgICAgICAgICAgICBjbWQgKz0gYHJzeW5jIC1SYSAke2V4cGFuZGVkUGF0aH0gLi4vLi4vY2FjaGUvJHtjYWNoZU5hbWV9Ly4gfHwgdHJ1ZVxcbmA7XG5cbiAgICAgICAgICAgICAgICBhd2FpdCBNdXRleC5leGNsdXNpdmUoY2FjaGVOYW1lLCBhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuY29weU91dChjbWQsIHN0YXRlRGlyLCBcImNhY2hlXCIsIFtdKTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICBlbmRUaW1lID0gcHJvY2Vzcy5ocnRpbWUodGltZSk7XG5cbiAgICAgICAgICAgICAgICBjb25zdCByZWFkZGlyID0gYXdhaXQgZnMucmVhZGRpcihgJHt0aGlzLmFyZ3YuY3dkfS8ke3N0YXRlRGlyfS9jYWNoZS8ke2NhY2hlTmFtZX1gKTtcbiAgICAgICAgICAgICAgICBpZiAocmVhZGRpci5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgICAgICAgICAgd3JpdGVTdHJlYW1zLnN0ZG91dChjaGFsa2Ake3RoaXMuZm9ybWF0dGVkSm9iTmFtZX0ge3llbGxvdyAhISBubyBjYWNoZSB3YXMgY29waWVkIGZvciAke3BhdGh9ICEhfVxcbmApO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHdyaXRlU3RyZWFtcy5zdGRvdXQoY2hhbGtgJHt0aGlzLmZvcm1hdHRlZEpvYk5hbWV9IHttYWdlbnRhQnJpZ2h0IGV4cG9ydGVkIGNhY2hlICR7ZXhwYW5kZWRQYXRofSAnJHtjYWNoZU5hbWV9J30gaW4ge21hZ2VudGEgJHtwcmV0dHlIcnRpbWUoZW5kVGltZSl9fVxcbmApO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgYXN5bmMgY29weUFydGlmYWN0c091dCAod3JpdGVTdHJlYW1zOiBXcml0ZVN0cmVhbXMsIGV4cGFuZGVkOiB7W2tleTogc3RyaW5nXTogc3RyaW5nfSkge1xuICAgICAgICAvLyBUT0RPOiB1cGRhdGUgdGhlIGNvbmRpdGlvbiB0byBzdXBwb3J0IHdoZW46b25fc3VjY2VzcyAvIHdoZW46b25fZmFpbHVyZVxuICAgICAgICBpZiAodGhpcy5qb2JTdGF0dXMgIT09IFwic3VjY2Vzc1wiICYmIHRoaXMuYXJ0aWZhY3RzPy53aGVuICE9PSBcImFsd2F5c1wiKSByZXR1cm47XG4gICAgICAgIGlmICghdGhpcy5hcnRpZmFjdHMpIHJldHVybjtcbiAgICAgICAgaWYgKCh0aGlzLmFydGlmYWN0cy5wYXRocz8ubGVuZ3RoID8/IDApID09PSAwICYmIHRoaXMuYXJ0aWZhY3RzLnJlcG9ydHM/LmRvdGVudiA9PSBudWxsKSByZXR1cm47XG5cbiAgICAgICAgY29uc3Qgc2FmZUpvYk5hbWUgPSB0aGlzLnNhZmVKb2JOYW1lO1xuICAgICAgICBjb25zdCBjd2QgPSB0aGlzLmFyZ3YuY3dkO1xuICAgICAgICBjb25zdCBzdGF0ZURpciA9IHRoaXMuYXJndi5zdGF0ZURpcjtcbiAgICAgICAgY29uc3QgYXJ0aWZhY3RzUGF0aCA9ICF0aGlzLmFyZ3Yuc2hlbGxJc29sYXRpb24gJiYgIXRoaXMuaW1hZ2VOYW1lKGV4cGFuZGVkKSA/IGAke3N0YXRlRGlyfS9hcnRpZmFjdHNgIDogXCIuLi8uLi9hcnRpZmFjdHNcIjtcblxuICAgICAgICBsZXQgdGltZSwgZW5kVGltZTtcbiAgICAgICAgbGV0IGNwQ21kID0gXCJzaG9wdCAtcyBnbG9ic3RhciBudWxsZ2xvYiBkb3RnbG9iXFxuXCI7XG4gICAgICAgIGNwQ21kICs9IGBta2RpciAtcCAke2FydGlmYWN0c1BhdGh9LyR7c2FmZUpvYk5hbWV9XFxuYDtcbiAgICAgICAgY3BDbWQgKz0gXCJyc3luYyAtLWV4Y2x1ZGUgJy5naXRsYWItY2ktbG9jYWwvKionIC1SYSBcIjtcbiAgICAgICAgZm9yIChjb25zdCBhcnRpZmFjdEV4Y2x1ZGVQYXRoIG9mIHRoaXMuYXJ0aWZhY3RzPy5leGNsdWRlID8/IFtdKSB7XG4gICAgICAgICAgICBjb25zdCBleHBhbmRlZFBhdGggPSBVdGlscy5leHBhbmRUZXh0KGFydGlmYWN0RXhjbHVkZVBhdGgsIGV4cGFuZGVkKS5yZXBsYWNlKGAke2V4cGFuZGVkLkNJX1BST0pFQ1RfRElSfS9gLCBcIlwiKTtcbiAgICAgICAgICAgIGNwQ21kICs9IGAtLWV4Y2x1ZGUgJyR7ZXhwYW5kZWRQYXRofScgYDtcbiAgICAgICAgfVxuICAgICAgICBmb3IgKGNvbnN0IGFydGlmYWN0UGF0aCBvZiB0aGlzLmFydGlmYWN0cz8ucGF0aHMgPz8gW10pIHtcbiAgICAgICAgICAgIGNvbnN0IGV4cGFuZGVkUGF0aCA9IFV0aWxzLmV4cGFuZFRleHQoYXJ0aWZhY3RQYXRoLCBleHBhbmRlZCkucmVwbGFjZShgJHtleHBhbmRlZC5DSV9QUk9KRUNUX0RJUn0vYCwgXCJcIik7XG4gICAgICAgICAgICBjcENtZCArPSBgJHtleHBhbmRlZFBhdGh9IGA7XG4gICAgICAgIH1cbiAgICAgICAgY3BDbWQgKz0gYCR7YXJ0aWZhY3RzUGF0aH0vJHtzYWZlSm9iTmFtZX0vLiB8fCB0cnVlXFxuYDtcbiAgICAgICAgY29uc3QgcmVwb3J0RG90ZW52ID0gVXRpbHMuZXhwYW5kVGV4dCh0aGlzLmFydGlmYWN0cy5yZXBvcnRzPy5kb3RlbnYgPz8gbnVsbCwgZXhwYW5kZWQpO1xuICAgICAgICBjb25zdCByZXBvcnREb3RlbnZzOiBzdHJpbmdbXSB8IG51bGwgPSAodHlwZW9mIHJlcG9ydERvdGVudiA9PT0gXCJzdHJpbmdcIikgLy8gbm9ybWFsaXplIHRvIHN0cmluZ1tdIGZvciBlYXNpZXIgaGFuZGxpbmdcbiAgICAgICAgICAgID8gW3JlcG9ydERvdGVudl1cbiAgICAgICAgICAgIDogcmVwb3J0RG90ZW52O1xuICAgICAgICBpZiAocmVwb3J0RG90ZW52cyAhPSBudWxsKSB7XG4gICAgICAgICAgICByZXBvcnREb3RlbnZzLmZvckVhY2goKHJlcG9ydERvdGVudikgPT4ge1xuICAgICAgICAgICAgICAgIGNwQ21kICs9IGBta2RpciAtcCAke2FydGlmYWN0c1BhdGh9LyR7c2FmZUpvYk5hbWV9Ly5naXRsYWItY2ktcmVwb3J0cy9kb3RlbnZcXG5gO1xuICAgICAgICAgICAgICAgIGNwQ21kICs9IGBpZiBbIC1mICR7cmVwb3J0RG90ZW52fSBdOyB0aGVuXFxuYDtcbiAgICAgICAgICAgICAgICBjcENtZCArPSBgICByc3luYyAtUmEgJHtyZXBvcnREb3RlbnZ9ICR7YXJ0aWZhY3RzUGF0aH0vJHtzYWZlSm9iTmFtZX0vLmdpdGxhYi1jaS1yZXBvcnRzL2RvdGVudi8uXFxuYDtcbiAgICAgICAgICAgICAgICBjcENtZCArPSBcImZpXFxuXCI7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRpbWUgPSBwcm9jZXNzLmhydGltZSgpO1xuICAgICAgICBjb25zdCBkb2NrZXJDbWRFeHRyYXMgPSB0aGlzLmFyZ3YubW91bnRDYWNoZSA/IGF3YWl0IHRoaXMubW91bnRDYWNoZUNtZCh3cml0ZVN0cmVhbXMsIGV4cGFuZGVkKSA6IFtdO1xuICAgICAgICBhd2FpdCB0aGlzLmNvcHlPdXQoY3BDbWQsIHN0YXRlRGlyLCBcImFydGlmYWN0c1wiLCBkb2NrZXJDbWRFeHRyYXMpO1xuICAgICAgICBlbmRUaW1lID0gcHJvY2Vzcy5ocnRpbWUodGltZSk7XG5cbiAgICAgICAgaWYgKHJlcG9ydERvdGVudnMgIT0gbnVsbCkge1xuICAgICAgICAgICAgcmVwb3J0RG90ZW52cy5mb3JFYWNoKGFzeW5jIChyZXBvcnREb3RlbnYpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoIWF3YWl0IGZzLnBhdGhFeGlzdHMoYCR7Y3dkfS8ke3N0YXRlRGlyfS9hcnRpZmFjdHMvJHtzYWZlSm9iTmFtZX0vLmdpdGxhYi1jaS1yZXBvcnRzL2RvdGVudi8ke3JlcG9ydERvdGVudn1gKSkge1xuICAgICAgICAgICAgICAgICAgICB3cml0ZVN0cmVhbXMuc3RkZXJyKGNoYWxrYCR7dGhpcy5mb3JtYXR0ZWRKb2JOYW1lfSB7eWVsbG93IGFydGlmYWN0IHJlcG9ydHMgZG90ZW52ICcke3JlcG9ydERvdGVudn0nIGNvdWxkIG5vdCBiZSBmb3VuZH1cXG5gKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHJlYWRkaXIgPSBhd2FpdCBmcy5yZWFkZGlyKGAke2N3ZH0vJHtzdGF0ZURpcn0vYXJ0aWZhY3RzLyR7c2FmZUpvYk5hbWV9YCk7XG4gICAgICAgIGlmIChyZWFkZGlyLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgd3JpdGVTdHJlYW1zLnN0ZG91dChjaGFsa2Ake3RoaXMuZm9ybWF0dGVkSm9iTmFtZX0ge3llbGxvdyAhISBubyBhcnRpZmFjdHMgd2FzIGNvcGllZCAhIX1cXG5gKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHdyaXRlU3RyZWFtcy5zdGRvdXQoY2hhbGtgJHt0aGlzLmZvcm1hdHRlZEpvYk5hbWV9IHttYWdlbnRhQnJpZ2h0IGV4cG9ydGVkIGFydGlmYWN0c30gaW4ge21hZ2VudGEgJHtwcmV0dHlIcnRpbWUoZW5kVGltZSl9fVxcbmApO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMuYXJ0aWZhY3RzVG9Tb3VyY2UgJiYgKHRoaXMuYXJndi5zaGVsbElzb2xhdGlvbiB8fCB0aGlzLmltYWdlTmFtZShleHBhbmRlZCkpKSB7XG4gICAgICAgICAgICB0aW1lID0gcHJvY2Vzcy5ocnRpbWUoKTtcbiAgICAgICAgICAgIGF3YWl0IFV0aWxzLnNwYXduKFtcInJzeW5jXCIsIFwiLS1leGNsdWRlPS8uZ2l0bGFiLWNpLXJlcG9ydHMvXCIsIFwiLWFcIiwgYCR7Y3dkfS8ke3N0YXRlRGlyfS9hcnRpZmFjdHMvJHtzYWZlSm9iTmFtZX0vLmAsIGN3ZF0pO1xuICAgICAgICAgICAgaWYgKHJlcG9ydERvdGVudiAhPSBudWxsKSB7XG4gICAgICAgICAgICAgICAgYXdhaXQgVXRpbHMuc3Bhd24oW1wicnN5bmNcIiwgXCItYVwiLCBgJHtjd2R9LyR7c3RhdGVEaXJ9L2FydGlmYWN0cy8ke3NhZmVKb2JOYW1lfS8uZ2l0bGFiLWNpLXJlcG9ydHMvZG90ZW52Ly5gLCBjd2RdKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVuZFRpbWUgPSBwcm9jZXNzLmhydGltZSh0aW1lKTtcbiAgICAgICAgICAgIHdyaXRlU3RyZWFtcy5zdGRvdXQoY2hhbGtgJHt0aGlzLmZvcm1hdHRlZEpvYk5hbWV9IHttYWdlbnRhQnJpZ2h0IGNvcGllZCBhcnRpZmFjdHMgdG8gY3dkfSBpbiB7bWFnZW50YSAke3ByZXR0eUhydGltZShlbmRUaW1lKX19XFxuYCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIGFzeW5jIGNvcHlPdXQgKGNtZDogc3RyaW5nLCBzdGF0ZURpcjogc3RyaW5nLCB0eXBlOiBcImFydGlmYWN0c1wiIHwgXCJjYWNoZVwiLCBkb2NrZXJDbWRFeHRyYXM6IHN0cmluZ1tdKSB7XG4gICAgICAgIGNvbnN0IHNhZmVKb2JOYW1lID0gdGhpcy5zYWZlSm9iTmFtZTtcbiAgICAgICAgY29uc3QgYnVpbGRWb2x1bWVOYW1lID0gdGhpcy5idWlsZFZvbHVtZU5hbWU7XG4gICAgICAgIGNvbnN0IGN3ZCA9IHRoaXMuYXJndi5jd2Q7XG5cbiAgICAgICAgYXdhaXQgZnMubWtkaXJwKGAke2N3ZH0vJHtzdGF0ZURpcn0vJHt0eXBlfWApO1xuXG4gICAgICAgIGlmICh0aGlzLmltYWdlTmFtZSh0aGlzLl92YXJpYWJsZXMpKSB7XG4gICAgICAgICAgICBjb25zdCB7c3Rkb3V0OiBjb250YWluZXJJZH0gPSBhd2FpdCBVdGlscy5iYXNoKGAke3RoaXMuYXJndi5jb250YWluZXJFeGVjdXRhYmxlfSBjcmVhdGUgLWkgJHtkb2NrZXJDbWRFeHRyYXMuam9pbihcIiBcIil9IC12ICR7YnVpbGRWb2x1bWVOYW1lfTovZ2NsLWJ1aWxkcy8gLXcgL2djbC1idWlsZHMgZG9ja2VyLmlvL2ZpcmVjb3cvZ2l0bGFiLWNpLWxvY2FsLXV0aWwgYmFzaCAtYyBcIiR7Y21kfVwiYCwgY3dkKTtcbiAgICAgICAgICAgIHRoaXMuX2NvbnRhaW5lcnNUb0NsZWFuLnB1c2goY29udGFpbmVySWQpO1xuICAgICAgICAgICAgYXdhaXQgVXRpbHMuc3Bhd24oW3RoaXMuYXJndi5jb250YWluZXJFeGVjdXRhYmxlLCBcInN0YXJ0XCIsIGNvbnRhaW5lcklkLCBcIi0tYXR0YWNoXCJdKTtcbiAgICAgICAgICAgIGF3YWl0IFV0aWxzLnNwYXduKFt0aGlzLmFyZ3YuY29udGFpbmVyRXhlY3V0YWJsZSwgXCJjcFwiLCBgJHtjb250YWluZXJJZH06LyR7dHlwZX0vLmAsIGAke3N0YXRlRGlyfS8ke3R5cGV9Ly5gXSwgY3dkKTtcbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLmFyZ3Yuc2hlbGxJc29sYXRpb24pIHtcbiAgICAgICAgICAgIGF3YWl0IFV0aWxzLmJhc2goYGJhc2ggLWVvIHBpcGVmYWlsIC1jIFwiJHtjbWR9XCJgLCBgJHtjd2R9LyR7c3RhdGVEaXJ9L2J1aWxkcy8ke3NhZmVKb2JOYW1lfWApO1xuICAgICAgICB9IGVsc2UgaWYgKCF0aGlzLmFyZ3Yuc2hlbGxJc29sYXRpb24pIHtcbiAgICAgICAgICAgIGF3YWl0IFV0aWxzLmJhc2goYGJhc2ggLWVvIHBpcGVmYWlsIC1jIFwiJHtjbWR9XCJgLCBgJHtjd2R9YCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIHJlZnJlc2hMb25nUnVubmluZ1NpbGVudFRpbWVvdXQgKHdyaXRlU3RyZWFtczogV3JpdGVTdHJlYW1zKSB7XG4gICAgICAgIGNsZWFyVGltZW91dCh0aGlzLl9sb25nUnVubmluZ1NpbGVudFRpbWVvdXQpO1xuICAgICAgICB0aGlzLl9sb25nUnVubmluZ1NpbGVudFRpbWVvdXQgPSBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgIHdyaXRlU3RyZWFtcy5zdGRvdXQoY2hhbGtgJHt0aGlzLmZvcm1hdHRlZEpvYk5hbWV9IHtncmV5ID4gc3RpbGwgcnVubmluZy4uLn1cXG5gKTtcbiAgICAgICAgICAgIHRoaXMucmVmcmVzaExvbmdSdW5uaW5nU2lsZW50VGltZW91dCh3cml0ZVN0cmVhbXMpO1xuICAgICAgICB9LCAxMDAwMCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBnZXRGaW5pc2hlZFN0cmluZyAoKSB7XG4gICAgICAgIHJldHVybiBjaGFsa2Ake3RoaXMuZm9ybWF0dGVkSm9iTmFtZX0ge21hZ2VudGFCcmlnaHQgZmluaXNoZWR9IGluIHttYWdlbnRhICR7dGhpcy5wcmV0dHlEdXJhdGlvbn19YDtcbiAgICB9XG5cbiAgICBwcml2YXRlIHByaW50RmluaXNoZWRTdHJpbmcgKCkge1xuICAgICAgICBpZiAodGhpcy5qb2JTdGF0dXMgIT09IFwic3VjY2Vzc1wiKSByZXR1cm47XG4gICAgICAgIHRoaXMud3JpdGVTdHJlYW1zLnN0ZG91dChgJHt0aGlzLmdldEZpbmlzaGVkU3RyaW5nKCl9XFxuYCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBwcmludEV4aXRlZFN0cmluZyAoY29kZTogbnVtYmVyKSB7XG4gICAgICAgIGNvbnN0IHdyaXRlU3RyZWFtcyA9IHRoaXMud3JpdGVTdHJlYW1zO1xuICAgICAgICBjb25zdCBmaW5pc2hlZFN0ciA9IHRoaXMuZ2V0RmluaXNoZWRTdHJpbmcoKTtcblxuICAgICAgICAvLyBXb24ndCBwcmludCBpZiBqb2JTdGF0dXMgaXMgXCJzdWNjZXNzXCIgYmVjYXVzZSB0aGF0IHdpbGwgYmUgcHJpbnRlZCB2aWEgdGhlIGBwcmludEZpbmlzaGVkU3RyaW5nKClgXG4gICAgICAgIGlmICh0aGlzLmpvYlN0YXR1cyA9PT0gXCJ3YXJuaW5nXCIpIHtcbiAgICAgICAgICAgIHdyaXRlU3RyZWFtcy5zdGRlcnIoXG4gICAgICAgICAgICAgICAgY2hhbGtgJHtmaW5pc2hlZFN0cn0ge2JsYWNrLmJnWWVsbG93QnJpZ2h0ICBXQVJOICR7Y29kZS50b1N0cmluZygpfSB9XFxuYFxuICAgICAgICAgICAgKTtcbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLmpvYlN0YXR1cyA9PT0gXCJmYWlsZWRcIikge1xuICAgICAgICAgICAgd3JpdGVTdHJlYW1zLnN0ZGVycihcbiAgICAgICAgICAgICAgICBjaGFsa2Ake2ZpbmlzaGVkU3RyfSB7YmxhY2suYmdSZWQgIEZBSUwgJHtjb2RlLnRvU3RyaW5nKCl9IH1cXG5gXG4gICAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBwcmludEFmdGVyU2NyaXB0RXhpdGVkU3RyaW5nIChjb2RlOiBudW1iZXIpIHtcbiAgICAgICAgY29uc3Qgd3JpdGVTdHJlYW1zID0gdGhpcy53cml0ZVN0cmVhbXM7XG4gICAgICAgIGNvbnN0IGZpbmlzaGVkU3RyID0gdGhpcy5nZXRGaW5pc2hlZFN0cmluZygpO1xuXG4gICAgICAgIGlmIChjb2RlICE9PSAwKSB7XG4gICAgICAgICAgICB3cml0ZVN0cmVhbXMuc3RkZXJyKFxuICAgICAgICAgICAgICAgIGNoYWxrYCR7ZmluaXNoZWRTdHJ9IHtibGFjay5iZ1llbGxvd0JyaWdodCAgV0FSTiAke2NvZGUudG9TdHJpbmcoKX0gfSBhZnRlcl9zY3JpcHRcXG5gXG4gICAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBhc3luYyBjcmVhdGVEb2NrZXJOZXR3b3JrIChuZXR3b3JrTmFtZTogc3RyaW5nKSB7XG4gICAgICAgIGNvbnN0IHtzdGRvdXQ6IG5ldHdvcmtJZH0gPSBhd2FpdCBVdGlscy5zcGF3bihbdGhpcy5hcmd2LmNvbnRhaW5lckV4ZWN1dGFibGUsIFwibmV0d29ya1wiLCBcImNyZWF0ZVwiLCBgJHtuZXR3b3JrTmFtZX1gXSk7XG4gICAgICAgIHRoaXMuX3NlcnZpY2VOZXR3b3JrSWQgPSBuZXR3b3JrSWQ7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBhc3luYyBzdGFydFNlcnZpY2UgKHdyaXRlU3RyZWFtczogV3JpdGVTdHJlYW1zLCBleHBhbmRlZDoge1trZXk6IHN0cmluZ106IHN0cmluZ30sIHNlcnZpY2U6IFNlcnZpY2UpIHtcbiAgICAgICAgY29uc3QgY3dkID0gdGhpcy5hcmd2LmN3ZDtcbiAgICAgICAgbGV0IGRvY2tlckNtZCA9IGAke3RoaXMuYXJndi5jb250YWluZXJFeGVjdXRhYmxlfSBjcmVhdGUgLS1pbnRlcmFjdGl2ZSBgO1xuICAgICAgICB0aGlzLnJlZnJlc2hMb25nUnVubmluZ1NpbGVudFRpbWVvdXQod3JpdGVTdHJlYW1zKTtcblxuICAgICAgICBpZiAodGhpcy5hcmd2LnVtYXNrID09PSB0cnVlKSB7XG4gICAgICAgICAgICBkb2NrZXJDbWQgKz0gXCItLXVzZXIgMDowIFwiO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMuYXJndi5wcml2aWxlZ2VkKSB7XG4gICAgICAgICAgICBkb2NrZXJDbWQgKz0gXCItLXByaXZpbGVnZWQgXCI7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5hcmd2LnVsaW1pdCAhPT0gbnVsbCkge1xuICAgICAgICAgICAgZG9ja2VyQ21kICs9IGAtLXVsaW1pdCBub2ZpbGU9JHt0aGlzLmFyZ3YudWxpbWl0fSBgO1xuICAgICAgICB9XG5cbiAgICAgICAgZm9yIChjb25zdCB2b2x1bWUgb2YgdGhpcy5hcmd2LnZvbHVtZSkge1xuICAgICAgICAgICAgZG9ja2VyQ21kICs9IGAtLXZvbHVtZSAke3ZvbHVtZX0gYDtcbiAgICAgICAgfVxuXG4gICAgICAgIGZvciAoY29uc3QgZXh0cmFIb3N0IG9mIHRoaXMuYXJndi5leHRyYUhvc3QpIHtcbiAgICAgICAgICAgIGRvY2tlckNtZCArPSBgLS1hZGQtaG9zdD0ke2V4dHJhSG9zdH0gYDtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHNlcnZpY2VBbGlhcyA9IHNlcnZpY2UuYWxpYXM7XG4gICAgICAgIGNvbnN0IHNlcnZpY2VOYW1lID0gc2VydmljZS5uYW1lO1xuICAgICAgICBjb25zdCBzZXJ2aWNlTmFtZVdpdGhvdXRWZXJzaW9uID0gc2VydmljZU5hbWUucmVwbGFjZSgvKC4qKSg6LiopLywgXCIkMVwiKTtcbiAgICAgICAgY29uc3QgYWxpYXNlcyA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuICAgICAgICBhbGlhc2VzLmFkZChzZXJ2aWNlTmFtZVdpdGhvdXRWZXJzaW9uLnJlcGxhY2VBbGwoXCIvXCIsIFwiLVwiKSk7XG4gICAgICAgIGFsaWFzZXMuYWRkKHNlcnZpY2VOYW1lV2l0aG91dFZlcnNpb24ucmVwbGFjZUFsbChcIi9cIiwgXCJfX1wiKSk7XG4gICAgICAgIGlmIChzZXJ2aWNlQWxpYXMpIHtcbiAgICAgICAgICAgIGFsaWFzZXMuYWRkKHNlcnZpY2VBbGlhcyk7XG4gICAgICAgIH1cblxuICAgICAgICBmb3IgKGNvbnN0IFtrZXksIHZhbF0gb2YgT2JqZWN0LmVudHJpZXMoZXhwYW5kZWQpKSB7XG4gICAgICAgICAgICAvLyBSZXBsYWNpbmcgYCdgIHdpdGggYCdcXCcnYCB0byBjb3JyZWN0bHkgaGFuZGxlIHNpbmdsZSBxdW90ZXMoaWYgYHZhbGAgY29udGFpbnMgYCdgKSBpbiBzaGVsbCBjb21tYW5kc1xuICAgICAgICAgICAgZG9ja2VyQ21kICs9IGAgIC1lICcke2tleX09JHt2YWwucmVwbGFjZSgvJy9nLCBcIidcXFxcJydcIil9JyBcXFxcXFxuYDtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHNlcnZpY2VFbnRyeXBvaW50ID0gc2VydmljZS5lbnRyeXBvaW50O1xuICAgICAgICBpZiAoc2VydmljZUVudHJ5cG9pbnQpIHtcbiAgICAgICAgICAgIGlmIChzZXJ2aWNlRW50cnlwb2ludFswXSA9PSBcIlwiKSB7XG4gICAgICAgICAgICAgICAgZG9ja2VyQ21kICs9IFwiLS1lbnRyeXBvaW50ICcnIFwiO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBkb2NrZXJDbWQgKz0gYC0tZW50cnlwb2ludCAke3NlcnZpY2VFbnRyeXBvaW50WzBdfSBgO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGRvY2tlckNtZCArPSBgLS12b2x1bWUgJHt0aGlzLmJ1aWxkVm9sdW1lTmFtZX06L2djbC1idWlsZHMgYDtcbiAgICAgICAgZG9ja2VyQ21kICs9IGAtLXZvbHVtZSAke3RoaXMudG1wVm9sdW1lTmFtZX06JHt0aGlzLmZpbGVWYXJpYWJsZXNEaXJ9IGA7XG5cbiAgICAgICAgLy8gVGhlIGRlZmF1bHQgcG9kbWFuIG5ldHdvcmsgbW9kZSBpcyBub3QgYGJyaWRnZWAsIHdoaWNoIG1lYW5zIGEgYHBvZG1hbiBuZXR3b3JrIGNvbm5lY3RgIGNhbGwgd2lsbCBmYWlsXG4gICAgICAgIC8vIHdoZW4gY29ubmVjdGluZyB1c2VyIGRlZmluZWQgbmV0d29ya3MuIFRoZSB3b3JrYXJvdW5kIGlzIHRvIHVzZSBhIHVzZXIgZGVmaW5lZCBuZXR3b3JrIG9uIGNvbnRhaW5lclxuICAgICAgICAvLyBjcmVhdGlvbi5cbiAgICAgICAgLy9cbiAgICAgICAgLy8gU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9jb250YWluZXJzL3BvZG1hbi9pc3N1ZXMvMTk1NzdcbiAgICAgICAgZG9ja2VyQ21kICs9IGAtLW5ldHdvcmsgJHt0aGlzLl9zZXJ2aWNlTmV0d29ya0lkfSBgO1xuICAgICAgICBmb3IgKGNvbnN0IGFsaWFzIG9mIGFsaWFzZXMpIHtcbiAgICAgICAgICAgIGRvY2tlckNtZCArPSBgLS1uZXR3b3JrLWFsaWFzICR7YWxpYXN9IGA7XG4gICAgICAgIH1cblxuICAgICAgICBkb2NrZXJDbWQgKz0gYCR7c2VydmljZU5hbWV9IGA7XG5cbiAgICAgICAgaWYgKHNlcnZpY2VFbnRyeXBvaW50Py5sZW5ndGggPz8gMCA+IDEpIHtcbiAgICAgICAgICAgIHNlcnZpY2VFbnRyeXBvaW50Py5zbGljZSgxKS5mb3JFYWNoKChlKSA9PiB7XG4gICAgICAgICAgICAgICAgZG9ja2VyQ21kICs9IGBcIiR7ZX1cIiBgO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgKHNlcnZpY2UuY29tbWFuZCA/PyBbXSkuZm9yRWFjaCgoZSkgPT4gZG9ja2VyQ21kICs9IGBcIiR7ZS5yZXBsYWNlKC9cXCQvZywgXCJcXFxcJFwiKX1cIiBgKTtcblxuICAgICAgICBjb25zdCB0aW1lID0gcHJvY2Vzcy5ocnRpbWUoKTtcblxuICAgICAgICBjb25zdCB7c3Rkb3V0OiBjb250YWluZXJJZH0gPSBhd2FpdCBVdGlscy5iYXNoKGRvY2tlckNtZCwgY3dkKTtcbiAgICAgICAgdGhpcy5fY29udGFpbmVyc1RvQ2xlYW4ucHVzaChjb250YWluZXJJZCk7XG5cbiAgICAgICAgZm9yIChjb25zdCBuZXR3b3JrIG9mIHRoaXMuYXJndi5uZXR3b3JrKSB7XG4gICAgICAgICAgICBhd2FpdCBVdGlscy5zcGF3bihbdGhpcy5hcmd2LmNvbnRhaW5lckV4ZWN1dGFibGUsIFwibmV0d29ya1wiLCBcImNvbm5lY3RcIiwgbmV0d29yaywgYCR7Y29udGFpbmVySWR9YF0pO1xuICAgICAgICB9XG5cbiAgICAgICAgYXdhaXQgVXRpbHMuc3Bhd24oW3RoaXMuYXJndi5jb250YWluZXJFeGVjdXRhYmxlLCBcInN0YXJ0XCIsIGAke2NvbnRhaW5lcklkfWBdKTtcblxuICAgICAgICBjb25zdCBlbmRUaW1lID0gcHJvY2Vzcy5ocnRpbWUodGltZSk7XG4gICAgICAgIHdyaXRlU3RyZWFtcy5zdGRvdXQoY2hhbGtgJHt0aGlzLmZvcm1hdHRlZEpvYk5hbWV9IHttYWdlbnRhQnJpZ2h0IHN0YXJ0ZWQgc2VydmljZSBpbWFnZTogJHtzZXJ2aWNlTmFtZX0gd2l0aCBhbGlhc2VzOiAke0FycmF5LmZyb20oYWxpYXNlcykuam9pbihcIiwgXCIpfX0gaW4ge21hZ2VudGEgJHtwcmV0dHlIcnRpbWUoZW5kVGltZSl9fVxcbmApO1xuXG4gICAgICAgIHJldHVybiBjb250YWluZXJJZDtcbiAgICB9XG5cbiAgICBwcml2YXRlIGFzeW5jIHNlcnZpY2VIZWFsdGhDaGVjayAod3JpdGVTdHJlYW1zOiBXcml0ZVN0cmVhbXMsIHNlcnZpY2U6IFNlcnZpY2UsIHNlcnZpY2VJbmRleDogbnVtYmVyLCBzZXJ2aWNlQ29udGFpbmVyTG9nRmlsZTogc3RyaW5nKSB7XG4gICAgICAgIGNvbnN0IHNlcnZpY2VBbGlhcyA9IHNlcnZpY2UuYWxpYXM7XG4gICAgICAgIGNvbnN0IHNlcnZpY2VOYW1lID0gc2VydmljZS5uYW1lO1xuXG4gICAgICAgIGNvbnN0IHtzdGRvdXR9ID0gYXdhaXQgVXRpbHMuc3Bhd24oW3RoaXMuYXJndi5jb250YWluZXJFeGVjdXRhYmxlLCBcImltYWdlXCIsIFwiaW5zcGVjdFwiLCBzZXJ2aWNlTmFtZV0pO1xuICAgICAgICBjb25zdCBpbWFnZUluc3BlY3QgPSBKU09OLnBhcnNlKHN0ZG91dCk7XG5cbiAgICAgICAgLy8gQ29waWVkIGZyb20gdGhlIHN0YXJ0U2VydmljZSBibG9jay4gSW1wb3J0YW50IHRoaW5nIGlzIHRoYXQgdGhlIGFsaWFzZXMgbWF0Y2hcbiAgICAgICAgY29uc3Qgc2VydmljZU5hbWVXaXRob3V0VmVyc2lvbiA9IHNlcnZpY2VOYW1lLnJlcGxhY2UoLyguKikoOi4qKS8sIFwiJDFcIik7XG4gICAgICAgIGNvbnN0IGFsaWFzZXMgPSBbc2VydmljZU5hbWVXaXRob3V0VmVyc2lvbi5yZXBsYWNlQWxsKFwiL1wiLCBcIi1cIiksIHNlcnZpY2VOYW1lV2l0aG91dFZlcnNpb24ucmVwbGFjZUFsbChcIi9cIiwgXCJfX1wiKV07XG4gICAgICAgIGlmIChzZXJ2aWNlQWxpYXMpIHtcbiAgICAgICAgICAgIGFsaWFzZXMucHVzaChzZXJ2aWNlQWxpYXMpO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgdW5pcXVlQWxpYXMgPSBhbGlhc2VzW2FsaWFzZXMubGVuZ3RoIC0gMV07XG5cbiAgICAgICAgaWYgKChpbWFnZUluc3BlY3RbMF0/LkNvbmZpZz8uRXhwb3NlZFBvcnRzID8/IG51bGwpID09PSBudWxsKSB7XG4gICAgICAgICAgICByZXR1cm4gd3JpdGVTdHJlYW1zLnN0ZGVycihjaGFsa2Ake3RoaXMuZm9ybWF0dGVkSm9iTmFtZX0ge3llbGxvdyBDb3VsZCBub3QgZmluZCBleHBvc2VkIHRjcCBwb3J0cyAke3NlcnZpY2VOYW1lfX1cXG5gKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHRpbWUgPSBwcm9jZXNzLmhydGltZSgpO1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgLy8gSXRlcmF0ZSBvdmVyIGVhY2ggcG9ydCBkZWZpbmVkIGluIHRoZSBpbWFnZSwgYW5kIHRyeSB0byBjb25uZWN0IHRvIHRoZSBhbGlhc1xuICAgICAgICAgICAgYXdhaXQgUHJvbWlzZS5hbnkoT2JqZWN0LmtleXMoaW1hZ2VJbnNwZWN0WzBdLkNvbmZpZy5FeHBvc2VkUG9ydHMpLm1hcCgocG9ydCkgPT4ge1xuICAgICAgICAgICAgICAgIGlmICghcG9ydC5lbmRzV2l0aChcIi90Y3BcIikpIHJldHVybjtcbiAgICAgICAgICAgICAgICBjb25zdCBwb3J0TnVtID0gcGFyc2VJbnQocG9ydC5yZXBsYWNlKFwiL3RjcFwiLCBcIlwiKSk7XG4gICAgICAgICAgICAgICAgY29uc3Qgc3Bhd25DbWQgPSBbdGhpcy5hcmd2LmNvbnRhaW5lckV4ZWN1dGFibGUsIFwicnVuXCIsIFwiLS1ybVwiLCBgLS1uYW1lPWdjbC13YWl0LWZvci1pdC0ke3RoaXMuam9iSWR9LSR7c2VydmljZUluZGV4fS0ke3BvcnROdW19YCwgXCItLW5ldHdvcmtcIiwgYCR7dGhpcy5fc2VydmljZU5ldHdvcmtJZH1gLCBcImRvY2tlci5pby9zdW1pbmE0Ni93YWl0LWZvci1pdFwiLCBgJHt1bmlxdWVBbGlhc306JHtwb3J0TnVtfWAsIFwiLXRcIiwgXCIzMFwiXTtcbiAgICAgICAgICAgICAgICByZXR1cm4gVXRpbHMuc3Bhd24oc3Bhd25DbWQpO1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICAgICAgY29uc3QgZW5kVGltZSA9IHByb2Nlc3MuaHJ0aW1lKHRpbWUpO1xuICAgICAgICAgICAgd3JpdGVTdHJlYW1zLnN0ZG91dChjaGFsa2Ake3RoaXMuZm9ybWF0dGVkSm9iTmFtZX0ge2dyZWVuQnJpZ2h0IHNlcnZpY2UgaW1hZ2U6ICR7c2VydmljZU5hbWV9IGhlYWx0aGNoZWNrIHBhc3NlZCBpbiB7Z3JlZW4gJHtwcmV0dHlIcnRpbWUoZW5kVGltZSl9fX1cXG5gKTtcbiAgICAgICAgfSBjYXRjaCAoZTogYW55KSB7XG4gICAgICAgICAgICBpZiAoIShlIGluc3RhbmNlb2YgQWdncmVnYXRlRXJyb3IpKSB0aHJvdyBlO1xuICAgICAgICAgICAgZS5lcnJvcnMuZm9yRWFjaCgoc2luZ2xlRXJyb3I6IEVycm9yKSA9PiB7XG4gICAgICAgICAgICAgICAgd3JpdGVTdHJlYW1zLnN0ZG91dChjaGFsa2Ake3RoaXMuZm9ybWF0dGVkSm9iTmFtZX0ge3JlZEJyaWdodCBzZXJ2aWNlIGltYWdlOiAke3NlcnZpY2VOYW1lfSBoZWFsdGhjaGVjayBmYWlsZWR9XFxuYCk7XG4gICAgICAgICAgICAgICAgc2luZ2xlRXJyb3IubWVzc2FnZS5zcGxpdCgvXFxyP1xcbi9nKS5mb3JFYWNoKChsaW5lOiBzdHJpbmcpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgd3JpdGVTdHJlYW1zLnN0ZG91dChjaGFsa2Ake3RoaXMuZm9ybWF0dGVkSm9iTmFtZX0ge3JlZEJyaWdodCAgICR7bGluZX19XFxuYCk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgd3JpdGVTdHJlYW1zLnN0ZG91dChjaGFsa2Ake3RoaXMuZm9ybWF0dGVkSm9iTmFtZX0ge3JlZEJyaWdodCBhbHNvIHNlZSAoJHtzZXJ2aWNlQ29udGFpbmVyTG9nRmlsZX0pfVxcbmApO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0gZmluYWxseSB7XG4gICAgICAgICAgICAvLyBLaWxsIGFsbCB3YWl0LWZvci1pdCBjb250YWluZXJzLCB3aGVuIG9uZSBoYXZlIGJlZW4gc3VjY2Vzc2Z1bFxuICAgICAgICAgICAgYXdhaXQgUHJvbWlzZS5hbGxTZXR0bGVkKE9iamVjdC5rZXlzKGltYWdlSW5zcGVjdFswXS5Db25maWcuRXhwb3NlZFBvcnRzKS5tYXAoKHBvcnQpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoIXBvcnQuZW5kc1dpdGgoXCIvdGNwXCIpKSByZXR1cm47XG4gICAgICAgICAgICAgICAgY29uc3QgcG9ydE51bSA9IHBhcnNlSW50KHBvcnQucmVwbGFjZShcIi90Y3BcIiwgXCJcIikpO1xuICAgICAgICAgICAgICAgIHJldHVybiBVdGlscy5zcGF3bihbdGhpcy5hcmd2LmNvbnRhaW5lckV4ZWN1dGFibGUsIFwicm1cIiwgXCItdmZcIiwgYGdjbC13YWl0LWZvci1pdC0ke3RoaXMuam9iSWR9LSR7c2VydmljZUluZGV4fS0ke3BvcnROdW19YF0pO1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9XG4gICAgfVxufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gY2xlYW51cEpvYlJlc291cmNlcyAoam9icz86IEl0ZXJhYmxlPEpvYj4pIHtcbiAgICBpZiAoIWpvYnMpIHJldHVybjtcbiAgICBjb25zdCBwcm9taXNlcyA9IFtdO1xuICAgIGZvciAoY29uc3Qgam9iIG9mIGpvYnMpIHtcbiAgICAgICAgcHJvbWlzZXMucHVzaChqb2IuY2xlYW51cFJlc291cmNlcygpKTtcbiAgICB9XG4gICAgYXdhaXQgUHJvbWlzZS5hbGwocHJvbWlzZXMpO1xufVxuIl19