projen 0.98.7 → 0.98.8
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/.jsii +174 -139
- package/lib/ai-instructions.js +2 -2
- package/lib/awscdk/auto-discover.js +5 -5
- package/lib/awscdk/awscdk-app-java.js +1 -1
- package/lib/awscdk/awscdk-app-py.js +1 -1
- package/lib/awscdk/awscdk-app-ts.js +1 -1
- package/lib/awscdk/awscdk-construct.js +2 -2
- package/lib/awscdk/awscdk-deps-java.js +1 -1
- package/lib/awscdk/awscdk-deps-js.js +1 -1
- package/lib/awscdk/awscdk-deps-py.js +1 -1
- package/lib/awscdk/awscdk-deps.js +1 -1
- package/lib/awscdk/cdk-config.js +4 -4
- package/lib/awscdk/cdk-tasks.js +1 -1
- package/lib/awscdk/integration-test.js +1 -1
- package/lib/awscdk/lambda-extension.js +1 -1
- package/lib/awscdk/lambda-function.js +2 -2
- package/lib/build/build-workflow.js +1 -1
- package/lib/cdk/auto-discover-base.js +2 -2
- package/lib/cdk/construct-lib.js +1 -1
- package/lib/cdk/integration-test-base.js +1 -1
- package/lib/cdk/jsii-docgen.js +1 -1
- package/lib/cdk/jsii-project.js +1 -1
- package/lib/cdk8s/auto-discover.js +2 -2
- package/lib/cdk8s/cdk8s-app-py.js +1 -1
- package/lib/cdk8s/cdk8s-app-ts.js +1 -1
- package/lib/cdk8s/cdk8s-construct.js +1 -1
- package/lib/cdk8s/cdk8s-deps-py.js +1 -1
- package/lib/cdk8s/cdk8s-deps.js +1 -1
- package/lib/cdk8s/integration-test.js +1 -1
- package/lib/cdktf/cdktf-construct.js +1 -1
- package/lib/circleci/circleci.js +1 -1
- package/lib/component.js +1 -1
- package/lib/dependencies.js +1 -1
- package/lib/dev-env.js +1 -1
- package/lib/docker-compose/docker-compose-service.js +1 -1
- package/lib/docker-compose/docker-compose.js +1 -1
- package/lib/file.js +1 -1
- package/lib/gitattributes.js +1 -1
- package/lib/github/actions-provider.js +1 -1
- package/lib/github/auto-approve.js +1 -1
- package/lib/github/auto-merge.js +1 -1
- package/lib/github/auto-queue.js +1 -1
- package/lib/github/dependabot.js +1 -1
- package/lib/github/github-credentials.js +1 -1
- package/lib/github/github-project.js +1 -1
- package/lib/github/github.js +1 -1
- package/lib/github/merge-queue.js +1 -1
- package/lib/github/mergify.js +1 -1
- package/lib/github/pr-template.js +1 -1
- package/lib/github/pull-request-backport.js +1 -1
- package/lib/github/pull-request-lint.js +1 -1
- package/lib/github/stale.js +1 -1
- package/lib/github/task-workflow-job.js +1 -1
- package/lib/github/task-workflow.js +1 -1
- package/lib/github/workflow-actions.js +1 -1
- package/lib/github/workflow-jobs.js +1 -1
- package/lib/github/workflow-steps.js +1 -1
- package/lib/github/workflows.js +1 -1
- package/lib/gitlab/configuration.js +1 -1
- package/lib/gitlab/gitlab-configuration.js +1 -1
- package/lib/gitlab/nested-configuration.js +1 -1
- package/lib/gitpod.js +1 -1
- package/lib/ignore-file.js +1 -1
- package/lib/ini.js +1 -1
- package/lib/java/java-project.js +1 -1
- package/lib/java/junit.js +1 -1
- package/lib/java/maven-compile.js +1 -1
- package/lib/java/maven-packaging.js +1 -1
- package/lib/java/maven-sample.js +1 -1
- package/lib/java/pom.js +2 -2
- package/lib/java/projenrc.js +1 -1
- package/lib/javascript/biome/biome.js +1 -1
- package/lib/javascript/bundler.js +1 -1
- package/lib/javascript/eslint.js +1 -1
- package/lib/javascript/jest.js +4 -4
- package/lib/javascript/license-checker.js +1 -1
- package/lib/javascript/node-package.js +16 -17
- package/lib/javascript/node-project.js +19 -25
- package/lib/javascript/npm-config.js +1 -1
- package/lib/javascript/prettier.js +1 -1
- package/lib/javascript/projenrc.js +1 -1
- package/lib/javascript/typescript-config.js +2 -2
- package/lib/javascript/upgrade-dependencies.d.ts +25 -1
- package/lib/javascript/upgrade-dependencies.js +113 -39
- package/lib/javascript/util.d.ts +13 -0
- package/lib/javascript/util.js +24 -1
- package/lib/javascript/yarnrc.js +1 -1
- package/lib/json-patch.js +1 -1
- package/lib/json.js +1 -1
- package/lib/license.js +1 -1
- package/lib/logger.js +1 -1
- package/lib/makefile.js +1 -1
- package/lib/object-file.js +1 -1
- package/lib/project-build.js +1 -1
- package/lib/project-tree.js +1 -1
- package/lib/project.js +1 -1
- package/lib/projects.js +1 -1
- package/lib/projenrc-json.js +2 -2
- package/lib/projenrc.js +1 -1
- package/lib/python/pip.js +1 -1
- package/lib/python/poetry.js +2 -2
- package/lib/python/projenrc.js +1 -1
- package/lib/python/pytest-sample.js +1 -1
- package/lib/python/pytest.js +1 -1
- package/lib/python/python-project.js +1 -1
- package/lib/python/python-sample.js +1 -1
- package/lib/python/requirements-file.js +1 -1
- package/lib/python/setuppy.js +1 -1
- package/lib/python/setuptools.js +1 -1
- package/lib/python/venv.js +1 -1
- package/lib/readme.js +1 -1
- package/lib/release/publisher.js +1 -1
- package/lib/release/release-trigger.js +1 -1
- package/lib/release/release.js +1 -1
- package/lib/renovatebot.js +1 -1
- package/lib/sample-file.js +2 -2
- package/lib/semver.js +1 -1
- package/lib/source-code.js +1 -1
- package/lib/task-runtime.js +1 -1
- package/lib/task.js +1 -1
- package/lib/tasks.js +1 -1
- package/lib/testing.js +1 -1
- package/lib/textfile.js +1 -1
- package/lib/toml.js +1 -1
- package/lib/typescript/projenrc-ts.js +1 -1
- package/lib/typescript/projenrc.js +1 -1
- package/lib/typescript/typescript-typedoc.js +1 -1
- package/lib/typescript/typescript.js +6 -6
- package/lib/version.js +2 -2
- package/lib/vscode/devcontainer.js +1 -1
- package/lib/vscode/extensions.js +1 -1
- package/lib/vscode/launch-config.js +1 -1
- package/lib/vscode/settings.js +1 -1
- package/lib/vscode/vscode.js +1 -1
- package/lib/web/next.js +3 -3
- package/lib/web/postcss.js +1 -1
- package/lib/web/react.js +4 -4
- package/lib/web/tailwind.js +1 -1
- package/lib/xmlfile.js +1 -1
- package/lib/yaml.js +1 -1
- package/package.json +1 -1
|
@@ -12,6 +12,7 @@ const workflows_model_1 = require("../github/workflows-model");
|
|
|
12
12
|
const javascript_1 = require("../javascript");
|
|
13
13
|
const release_1 = require("../release");
|
|
14
14
|
const runner_options_1 = require("../runner-options");
|
|
15
|
+
const util_1 = require("./util");
|
|
15
16
|
const CREATE_PATCH_STEP_ID = "create_patch";
|
|
16
17
|
const PATCH_CREATED_OUTPUT = "patch_created";
|
|
17
18
|
/**
|
|
@@ -24,8 +25,18 @@ class UpgradeDependencies extends component_1.Component {
|
|
|
24
25
|
* The workflows that execute the upgrades. One workflow per branch.
|
|
25
26
|
*/
|
|
26
27
|
this.workflows = [];
|
|
27
|
-
this.
|
|
28
|
+
this.project = project;
|
|
28
29
|
this.options = options;
|
|
30
|
+
// Validate cooldown
|
|
31
|
+
if (options.cooldown !== undefined &&
|
|
32
|
+
(!Number.isInteger(options.cooldown) || options.cooldown < 0)) {
|
|
33
|
+
throw new Error("The 'cooldown' option must be a non-negative integer representing days");
|
|
34
|
+
}
|
|
35
|
+
// Yarn classic doesn't support cooldown
|
|
36
|
+
if (options.cooldown && (0, util_1.isYarnClassic)(project.package.packageManager)) {
|
|
37
|
+
throw new Error("The 'cooldown' option is not supported with yarn classic. " +
|
|
38
|
+
"Consider using npm, pnpm, bun, or yarn berry instead.");
|
|
39
|
+
}
|
|
29
40
|
this.depTypes = this.options.types ?? [
|
|
30
41
|
dependencies_1.DependencyType.BUILD,
|
|
31
42
|
dependencies_1.DependencyType.BUNDLED,
|
|
@@ -53,10 +64,19 @@ class UpgradeDependencies extends component_1.Component {
|
|
|
53
64
|
project.tasks.addTask("post-upgrade", {
|
|
54
65
|
description: "Runs after upgrading dependencies",
|
|
55
66
|
});
|
|
67
|
+
const taskEnv = { CI: "0" };
|
|
68
|
+
// Set yarn berry cooldown via environment variable, expects minutes
|
|
69
|
+
if (options.cooldown && (0, util_1.isYarnBerry)(project.package.packageManager)) {
|
|
70
|
+
taskEnv.YARN_NPM_MINIMAL_AGE_GATE = String(daysToMinutes(options.cooldown));
|
|
71
|
+
}
|
|
72
|
+
// Set npm cooldown date via environment variable (calculated at runtime), expects a date in ISO format
|
|
73
|
+
if (options.cooldown && (0, util_1.isNpm)(project.package.packageManager)) {
|
|
74
|
+
taskEnv.NPM_CONFIG_BEFORE = `$(node -p "new Date(Date.now()-${daysToMilliseconds(options.cooldown)}).toISOString()")`;
|
|
75
|
+
}
|
|
56
76
|
this.upgradeTask = project.addTask(options.taskName ?? "upgrade", {
|
|
57
77
|
// this task should not run in CI mode because its designed to
|
|
58
78
|
// update package.json and lock files.
|
|
59
|
-
env:
|
|
79
|
+
env: taskEnv,
|
|
60
80
|
description: this.pullRequestTitle,
|
|
61
81
|
steps: { toJSON: () => this.renderTaskSteps() },
|
|
62
82
|
});
|
|
@@ -89,21 +109,6 @@ class UpgradeDependencies extends component_1.Component {
|
|
|
89
109
|
this.postBuildSteps.push(...steps);
|
|
90
110
|
}
|
|
91
111
|
renderTaskSteps() {
|
|
92
|
-
function executeCommand(packageManager) {
|
|
93
|
-
switch (packageManager) {
|
|
94
|
-
case javascript_1.NodePackageManager.NPM:
|
|
95
|
-
case javascript_1.NodePackageManager.YARN:
|
|
96
|
-
case javascript_1.NodePackageManager.YARN_CLASSIC:
|
|
97
|
-
return "npx";
|
|
98
|
-
case javascript_1.NodePackageManager.PNPM:
|
|
99
|
-
return "pnpm dlx";
|
|
100
|
-
case javascript_1.NodePackageManager.YARN2:
|
|
101
|
-
case javascript_1.NodePackageManager.YARN_BERRY:
|
|
102
|
-
return "yarn dlx";
|
|
103
|
-
case javascript_1.NodePackageManager.BUN:
|
|
104
|
-
return "bunx";
|
|
105
|
-
}
|
|
106
|
-
}
|
|
107
112
|
const steps = new Array();
|
|
108
113
|
// Package Manager upgrade should always include all deps
|
|
109
114
|
const includeForPackageManagerUpgrade = this.buildDependencyList(true);
|
|
@@ -114,30 +119,68 @@ class UpgradeDependencies extends component_1.Component {
|
|
|
114
119
|
// that uses an npm-specific feature that causes an invalid dependency tree when using Yarn 1.
|
|
115
120
|
// See https://github.com/projen/projen/pull/3136 for more details.
|
|
116
121
|
const includeForNcu = this.buildDependencyList(false);
|
|
117
|
-
const ncuCommand = [
|
|
118
|
-
`${executeCommand(this._project.package.packageManager)} npm-check-updates@16`,
|
|
119
|
-
"--upgrade",
|
|
120
|
-
`--target=${this.upgradeTarget}`,
|
|
121
|
-
`--${this.satisfyPeerDependencies ? "peer" : "no-peer"}`,
|
|
122
|
-
`--${this.includeDeprecatedVersions ? "deprecated" : "no-deprecated"}`,
|
|
123
|
-
`--dep=${this.renderNcuDependencyTypes(this.depTypes)}`,
|
|
124
|
-
`--filter=${includeForNcu.join(",")}`,
|
|
125
|
-
];
|
|
126
122
|
// bump versions in package.json
|
|
127
123
|
if (includeForNcu.length) {
|
|
128
|
-
|
|
124
|
+
const ncuCommand = this.buildNcuCommand(includeForNcu, {
|
|
125
|
+
upgrade: true,
|
|
126
|
+
target: this.upgradeTarget,
|
|
127
|
+
});
|
|
128
|
+
steps.push({ exec: ncuCommand });
|
|
129
129
|
}
|
|
130
130
|
// run "yarn/npm install" to update the lockfile and install any deps (such as projen)
|
|
131
|
-
steps.push({ exec: this.
|
|
131
|
+
steps.push({ exec: this.project.package.installAndUpdateLockfileCommand });
|
|
132
132
|
// run upgrade command to upgrade transitive deps as well
|
|
133
133
|
steps.push({
|
|
134
134
|
exec: this.renderUpgradePackagesCommand(includeForPackageManagerUpgrade),
|
|
135
135
|
});
|
|
136
136
|
// run "projen" to give projen a chance to update dependencies (it will also run "yarn install")
|
|
137
|
-
steps.push({ exec: this.
|
|
137
|
+
steps.push({ exec: this.project.projenCommand });
|
|
138
138
|
steps.push({ spawn: this.postUpgradeTask.name });
|
|
139
139
|
return steps;
|
|
140
140
|
}
|
|
141
|
+
/**
|
|
142
|
+
* Build npm-check-updates command with common options.
|
|
143
|
+
*/
|
|
144
|
+
buildNcuCommand(includePackages, options = {}) {
|
|
145
|
+
function executeCommand(packageManager) {
|
|
146
|
+
switch (packageManager) {
|
|
147
|
+
case javascript_1.NodePackageManager.NPM:
|
|
148
|
+
case javascript_1.NodePackageManager.YARN:
|
|
149
|
+
case javascript_1.NodePackageManager.YARN_CLASSIC:
|
|
150
|
+
return "npx";
|
|
151
|
+
case javascript_1.NodePackageManager.PNPM:
|
|
152
|
+
return "pnpm dlx";
|
|
153
|
+
case javascript_1.NodePackageManager.YARN2:
|
|
154
|
+
case javascript_1.NodePackageManager.YARN_BERRY:
|
|
155
|
+
return "yarn dlx";
|
|
156
|
+
case javascript_1.NodePackageManager.BUN:
|
|
157
|
+
return "bunx";
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
const command = [
|
|
161
|
+
`${executeCommand(this.project.package.packageManager)} npm-check-updates@18`,
|
|
162
|
+
];
|
|
163
|
+
if (options.upgrade) {
|
|
164
|
+
command.push("--upgrade");
|
|
165
|
+
}
|
|
166
|
+
if (options.target) {
|
|
167
|
+
command.push(`--target=${options.target}`);
|
|
168
|
+
}
|
|
169
|
+
if (options.format) {
|
|
170
|
+
command.push(`--format=${options.format}`);
|
|
171
|
+
}
|
|
172
|
+
if (options.removeRange) {
|
|
173
|
+
command.push("--removeRange");
|
|
174
|
+
}
|
|
175
|
+
if (this.options.cooldown) {
|
|
176
|
+
command.push(`--cooldown=${this.options.cooldown}`);
|
|
177
|
+
}
|
|
178
|
+
command.push(`--${this.satisfyPeerDependencies ? "peer" : "no-peer"}`);
|
|
179
|
+
command.push(`--${this.includeDeprecatedVersions ? "deprecated" : "no-deprecated"}`);
|
|
180
|
+
command.push(`--dep=${this.renderNcuDependencyTypes(this.depTypes)}`);
|
|
181
|
+
command.push(`--filter=${includePackages.join(",")}`);
|
|
182
|
+
return command.join(" ");
|
|
183
|
+
}
|
|
141
184
|
/**
|
|
142
185
|
* Render projen dependencies types to a list of ncu compatible types
|
|
143
186
|
*/
|
|
@@ -166,12 +209,17 @@ class UpgradeDependencies extends component_1.Component {
|
|
|
166
209
|
* Render a package manager specific command to upgrade all requested dependencies.
|
|
167
210
|
*/
|
|
168
211
|
renderUpgradePackagesCommand(include) {
|
|
169
|
-
function upgradePackages(command) {
|
|
212
|
+
function upgradePackages(command, cooldownFlag) {
|
|
170
213
|
return () => {
|
|
171
|
-
|
|
214
|
+
const parts = [command, ...include];
|
|
215
|
+
if (cooldownFlag) {
|
|
216
|
+
parts.push(cooldownFlag);
|
|
217
|
+
}
|
|
218
|
+
return parts.join(" ");
|
|
172
219
|
};
|
|
173
220
|
}
|
|
174
|
-
const packageManager = this.
|
|
221
|
+
const packageManager = this.project.package.packageManager;
|
|
222
|
+
const cooldown = this.options.cooldown;
|
|
175
223
|
let lazy = undefined;
|
|
176
224
|
switch (packageManager) {
|
|
177
225
|
case javascript_1.NodePackageManager.YARN:
|
|
@@ -180,16 +228,24 @@ class UpgradeDependencies extends component_1.Component {
|
|
|
180
228
|
break;
|
|
181
229
|
case javascript_1.NodePackageManager.YARN2:
|
|
182
230
|
case javascript_1.NodePackageManager.YARN_BERRY:
|
|
231
|
+
// Yarn Berry cooldown set via task env
|
|
183
232
|
lazy = upgradePackages("yarn up");
|
|
184
233
|
break;
|
|
185
234
|
case javascript_1.NodePackageManager.NPM:
|
|
235
|
+
// npm cooldown set via NPM_CONFIG_BEFORE env
|
|
186
236
|
lazy = upgradePackages("npm update");
|
|
187
237
|
break;
|
|
188
238
|
case javascript_1.NodePackageManager.PNPM:
|
|
189
|
-
|
|
239
|
+
// pnpm expects minutes
|
|
240
|
+
lazy = upgradePackages("pnpm update", cooldown !== undefined
|
|
241
|
+
? `--config.minimum-release-age=${daysToMinutes(cooldown)}`
|
|
242
|
+
: undefined);
|
|
190
243
|
break;
|
|
191
244
|
case javascript_1.NodePackageManager.BUN:
|
|
192
|
-
|
|
245
|
+
// bun expects seconds
|
|
246
|
+
lazy = upgradePackages("bun update", cooldown
|
|
247
|
+
? `--minimum-release-age=${daysToSeconds(cooldown)}`
|
|
248
|
+
: undefined);
|
|
193
249
|
break;
|
|
194
250
|
default:
|
|
195
251
|
throw new Error(`unexpected package manager ${packageManager}`);
|
|
@@ -255,10 +311,10 @@ class UpgradeDependencies extends component_1.Component {
|
|
|
255
311
|
};
|
|
256
312
|
const steps = [
|
|
257
313
|
github_1.WorkflowSteps.checkout({ with: with_ }),
|
|
258
|
-
...this.
|
|
314
|
+
...this.project.renderWorkflowSetup({ mutable: false }),
|
|
259
315
|
{
|
|
260
316
|
name: "Upgrade dependencies",
|
|
261
|
-
run: this.
|
|
317
|
+
run: this.project.runTaskCommand(task),
|
|
262
318
|
},
|
|
263
319
|
];
|
|
264
320
|
steps.push(...this.postBuildSteps);
|
|
@@ -312,7 +368,7 @@ class UpgradeDependencies extends component_1.Component {
|
|
|
312
368
|
}
|
|
313
369
|
exports.UpgradeDependencies = UpgradeDependencies;
|
|
314
370
|
_a = JSII_RTTI_SYMBOL_1;
|
|
315
|
-
UpgradeDependencies[_a] = { fqn: "projen.javascript.UpgradeDependencies", version: "0.98.
|
|
371
|
+
UpgradeDependencies[_a] = { fqn: "projen.javascript.UpgradeDependencies", version: "0.98.8" };
|
|
316
372
|
/**
|
|
317
373
|
* How often to check for new versions and raise pull requests for version upgrades.
|
|
318
374
|
*/
|
|
@@ -329,7 +385,7 @@ class UpgradeDependenciesSchedule {
|
|
|
329
385
|
}
|
|
330
386
|
exports.UpgradeDependenciesSchedule = UpgradeDependenciesSchedule;
|
|
331
387
|
_b = JSII_RTTI_SYMBOL_1;
|
|
332
|
-
UpgradeDependenciesSchedule[_b] = { fqn: "projen.javascript.UpgradeDependenciesSchedule", version: "0.98.
|
|
388
|
+
UpgradeDependenciesSchedule[_b] = { fqn: "projen.javascript.UpgradeDependenciesSchedule", version: "0.98.8" };
|
|
333
389
|
/**
|
|
334
390
|
* Disables automatic upgrades.
|
|
335
391
|
*/
|
|
@@ -356,4 +412,22 @@ UpgradeDependenciesSchedule.WEEKLY = new UpgradeDependenciesSchedule([
|
|
|
356
412
|
UpgradeDependenciesSchedule.MONTHLY = new UpgradeDependenciesSchedule([
|
|
357
413
|
"0 0 1 * *",
|
|
358
414
|
]);
|
|
359
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXBncmFkZS1kZXBlbmRlbmNpZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvamF2YXNjcmlwdC91cGdyYWRlLWRlcGVuZGVuY2llcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQUFBLDRDQUF5QztBQUN6QyxrREFBaUQ7QUFDakQsc0NBUW1CO0FBQ25CLG1EQUFrRTtBQUNsRSxpRUFBNkQ7QUFDN0QsK0RBS21DO0FBQ25DLDhDQUFnRTtBQUNoRSx3Q0FBcUM7QUFDckMsc0RBQThFO0FBSTlFLE1BQU0sb0JBQW9CLEdBQUcsY0FBYyxDQUFDO0FBQzVDLE1BQU0sb0JBQW9CLEdBQUcsZUFBZSxDQUFDO0FBMkc3Qzs7R0FFRztBQUNILE1BQWEsbUJBQW9CLFNBQVEscUJBQVM7SUFpQ2hELFlBQVksT0FBb0IsRUFBRSxVQUFzQyxFQUFFO1FBQ3hFLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQztRQWpDakI7O1dBRUc7UUFDYSxjQUFTLEdBQXFCLEVBQUUsQ0FBQztRQWdDL0MsSUFBSSxDQUFDLFFBQVEsR0FBRyxPQUFPLENBQUM7UUFDeEIsSUFBSSxDQUFDLE9BQU8sR0FBRyxPQUFPLENBQUM7UUFDdkIsSUFBSSxDQUFDLFFBQVEsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLEtBQUssSUFBSTtZQUNwQyw2QkFBYyxDQUFDLEtBQUs7WUFDcEIsNkJBQWMsQ0FBQyxPQUFPO1lBQ3RCLDZCQUFjLENBQUMsTUFBTTtZQUNyQiw2QkFBYyxDQUFDLElBQUk7WUFDbkIsNkJBQWMsQ0FBQyxPQUFPO1lBQ3RCLDZCQUFjLENBQUMsSUFBSTtZQUNuQiw2QkFBYyxDQUFDLFFBQVE7U0FDeEIsQ0FBQztRQUNGLElBQUksQ0FBQyxhQUFhLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLElBQUksT0FBTyxDQUFDO1FBQ3BELElBQUksQ0FBQyx1QkFBdUIsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLHVCQUF1QixJQUFJLElBQUks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QUFNLENBQUMsV0FBVyxDQUFDLElBQWM7UUFDdEMsT0FBTyxJQUFJLDJCQUEyQixDQUFDLElBQUksQ0FBQyxDQUFDO0lBQy9DLENBQUM7SUFFRCxZQUFvQyxJQUFjO1FBQWQsU0FBSSxHQUFKLElBQUksQ0FBVTtJQUFHLENBQUM7O0FBdkN4RCxrRUF3Q0M7OztBQXZDQzs7R0FFRztBQUNvQixpQ0FBSyxHQUFHLElBQUksMkJBQTJCLENBQUMsRUFBRSxDQUFDLENBQUM7QUFFbkU7O0dBRUc7QUFDb0IsaUNBQUssR0FBRyxJQUFJLDJCQUEyQixDQUFDLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQztBQUU5RTs7R0FFRztBQUNvQixtQ0FBTyxHQUFHLElBQUksMkJBQTJCLENBQUM7SUFDL0QsYUFBYTtDQUNkLENBQUMsQ0FBQztBQUVIOztHQUVHO0FBQ29CLGtDQUFNLEdBQUcsSUFBSSwyQkFBMkIsQ0FBQztJQUM5RCxXQUFXO0NBQ1osQ0FBQyxDQUFDO0FBRUg7O0dBRUc7QUFDb0IsbUNBQU8sR0FBRyxJQUFJLDJCQUEyQixDQUFDO0lBQy9ELFdBQVc7Q0FDWixDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQgfSBmcm9tIFwiLi4vY29tcG9uZW50XCI7XG5pbXBvcnQgeyBEZXBlbmRlbmN5VHlwZSB9IGZyb20gXCIuLi9kZXBlbmRlbmNpZXNcIjtcbmltcG9ydCB7XG4gIEdpdGh1YkNyZWRlbnRpYWxzLFxuICBHaXRIdWIsXG4gIEdpdGh1YldvcmtmbG93LFxuICBHaXRJZGVudGl0eSxcbiAgd29ya2Zsb3dzLFxuICBXb3JrZmxvd0pvYnMsXG4gIFdvcmtmbG93U3RlcHMsXG59IGZyb20gXCIuLi9naXRodWJcIjtcbmltcG9ydCB7IERFRkFVTFRfR0lUSFVCX0FDVElPTlNfVVNFUiB9IGZyb20gXCIuLi9naXRodWIvY29uc3RhbnRzXCI7XG5pbXBvcnQgeyBXb3JrZmxvd0FjdGlvbnMgfSBmcm9tIFwiLi4vZ2l0aHViL3dvcmtmbG93LWFjdGlvbnNcIjtcbmltcG9ydCB7XG4gIENvbnRhaW5lck9wdGlvbnMsXG4gIEpvYlN0ZXAsXG4gIEpvYlBlcm1pc3Npb24sXG4gIEpvYlBlcm1pc3Npb25zLFxufSBmcm9tIFwiLi4vZ2l0aHViL3dvcmtmbG93cy1tb2RlbFwiO1xuaW1wb3J0IHsgTm9kZVBhY2thZ2VNYW5hZ2VyLCBOb2RlUHJvamVjdCB9IGZyb20gXCIuLi9qYXZhc2NyaXB0XCI7XG5pbXBvcnQgeyBSZWxlYXNlIH0gZnJvbSBcIi4uL3JlbGVhc2VcIjtcbmltcG9ydCB7IEdyb3VwUnVubmVyT3B0aW9ucywgZmlsdGVyZWRSdW5zT25PcHRpb25zIH0gZnJvbSBcIi4uL3J1bm5lci1vcHRpb25zXCI7XG5pbXBvcnQgeyBUYXNrIH0gZnJvbSBcIi4uL3Rhc2tcIjtcbmltcG9ydCB7IFRhc2tTdGVwIH0gZnJvbSBcIi4uL3Rhc2stbW9kZWxcIjtcblxuY29uc3QgQ1JFQVRFX1BBVENIX1NURVBfSUQgPSBcImNyZWF0ZV9wYXRjaFwiO1xuY29uc3QgUEFUQ0hfQ1JFQVRFRF9PVVRQVVQgPSBcInBhdGNoX2NyZWF0ZWRcIjtcblxuLyoqXG4gKiBPcHRpb25zIGZvciBgVXBncmFkZURlcGVuZGVuY2llc2AuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVXBncmFkZURlcGVuZGVuY2llc09wdGlvbnMge1xuICAvKipcbiAgICogTGlzdCBvZiBwYWNrYWdlIG5hbWVzIHRvIGV4Y2x1ZGUgZHVyaW5nIHRoZSB1cGdyYWRlLlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIE5vdGhpbmcgaXMgZXhjbHVkZWQuXG4gICAqL1xuICByZWFkb25seSBleGNsdWRlPzogc3RyaW5nW107XG5cbiAgLyoqXG4gICAqIExpc3Qgb2YgcGFja2FnZSBuYW1lcyB0byBpbmNsdWRlIGR1cmluZyB0aGUgdXBncmFkZS5cbiAgICpcbiAgICogQGRlZmF1bHQgLSBFdmVyeXRoaW5nIGlzIGluY2x1ZGVkLlxuICAgKi9cbiAgcmVhZG9ubHkgaW5jbHVkZT86IHN0cmluZ1tdO1xuXG4gIC8qKlxuICAgKiBEZXRlcm1pbmVzIHRoZSB0YXJnZXQgdmVyc2lvbiB0byB1cGdyYWRlIGRlcGVuZGVuY2llcyB0by5cbiAgICpcbiAgICogQHNlZSBodHRwczovL2dpdGh1Yi5jb20vcmFpbmVvcnNoaW5lL25wbS1jaGVjay11cGRhdGVzI3RhcmdldFxuICAgKlxuICAgKiBAZGVmYXVsdCBcIm1pbm9yXCJcbiAgICovXG4gIHJlYWRvbmx5IHRhcmdldD86IHN0cmluZztcblxuICAvKipcbiAgICogQ2hlY2sgcGVlciBkZXBlbmRlbmNpZXMgb2YgaW5zdGFsbGVkIHBhY2thZ2VzIGFuZCBmaWx0ZXIgdXBkYXRlcyB0byBjb21wYXRpYmxlIHZlcnNpb25zLlxuICAgKlxuICAgKiBCeSBkZWZhdWx0LCB0aGUgdXBncmFkZSB3b3JrZmxvdyB3aWxsIGFkaGVyZSB0byB2ZXJzaW9uIGNvbnN0cmFpbnRzIGZyb20gcGVlciBkZXBlbmRlbmNpZXMuXG4gICAqIFNvbWV0aW1lcyB0aGlzIGlzIG5vdCBkZXNpcmFibGUgYW5kIGNhbiBiZSBkaXNhYmxlZC5cbiAgICpcbiAgICogQHNlZSBodHRwczovL2dpdGh1Yi5jb20vcmFpbmVvcnNoaW5lL25wbS1jaGVjay11cGRhdGVzI3BlZXJcbiAgICpcbiAgICogQGRlZmF1bHQgdHJ1ZVxuICAgKi9cbiAgcmVhZG9ubHkgc2F0aXNmeVBlZXJEZXBlbmRlbmNpZXM/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBJbmNsdWRlIGRlcHJlY2F0ZWQgcGFja2FnZXMuXG4gICAqXG4gICAqIEJ5IGRlZmF1bHQsIGRlcHJlY2F0ZWQgdmVyc2lvbnMgd2lsbCBiZSBleGNsdWRlZCBmcm9tIHVwZ3JhZGVzLlxuICAgKlxuICAgKiBAc2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9yYWluZW9yc2hpbmUvbnBtLWNoZWNrLXVwZGF0ZXM/dGFiPXJlYWRtZS1vdi1maWxlI29wdGlvbnNcbiAgICpcbiAgICogQGRlZmF1bHQgZmFsc2VcbiAgICovXG4gIHJlYWRvbmx5IGluY2x1ZGVEZXByZWNhdGVkVmVyc2lvbnM/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBJbmNsdWRlIGEgZ2l0aHViIHdvcmtmbG93IGZvciBjcmVhdGluZyBQUidzIHRoYXQgdXBncmFkZXMgdGhlXG4gICAqIHJlcXVpcmVkIGRlcGVuZGVuY2llcywgZWl0aGVyIGJ5IG1hbnVhbCBkaXNwYXRjaCwgb3IgYnkgYSBzY2hlZHVsZS5cbiAgICpcbiAgICogSWYgdGhpcyBpcyBgZmFsc2VgLCBvbmx5IGEgbG9jYWwgcHJvamVuIHRhc2sgaXMgY3JlYXRlZCwgd2hpY2ggY2FuIGJlIGV4ZWN1dGVkIG1hbnVhbGx5IHRvXG4gICAqIHVwZ3JhZGUgdGhlIGRlcGVuZGVuY2llcy5cbiAgICpcbiAgICogQGRlZmF1bHQgLSB0cnVlIGZvciByb290IHByb2plY3RzLCBmYWxzZSBmb3Igc3VicHJvamVjdHMuXG4gICAqL1xuICByZWFkb25seSB3b3JrZmxvdz86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIE9wdGlvbnMgZm9yIHRoZSBnaXRodWIgd29ya2Zsb3cuIE9ubHkgYXBwbGllcyBpZiBgd29ya2Zsb3dgIGlzIHRydWUuXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gZGVmYXVsdCBvcHRpb25zLlxuICAgKi9cbiAgcmVhZG9ubHkgd29ya2Zsb3dPcHRpb25zPzogVXBncmFkZURlcGVuZGVuY2llc1dvcmtmbG93T3B0aW9ucztcblxuICAvKipcbiAgICogVGhlIG5hbWUgb2YgdGhlIHRhc2sgdGhhdCB3aWxsIGJlIGNyZWF0ZWQuXG4gICAqIFRoaXMgd2lsbCBhbHNvIGJlIHRoZSB3b3JrZmxvdyBuYW1lLlxuICAgKlxuICAgKiBAZGVmYXVsdCBcInVwZ3JhZGVcIi5cbiAgICovXG4gIHJlYWRvbmx5IHRhc2tOYW1lPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaXRsZSBvZiB0aGUgcHVsbCByZXF1ZXN0IHRvIHVzZSAoc2hvdWxkIGJlIGFsbCBsb3dlci1jYXNlKS5cbiAgICpcbiAgICogQGRlZmF1bHQgXCJ1cGdyYWRlIGRlcGVuZGVuY2llc1wiXG4gICAqL1xuICByZWFkb25seSBwdWxsUmVxdWVzdFRpdGxlPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgc2VtYW50aWMgY29tbWl0IHR5cGUuXG4gICAqXG4gICAqIEBkZWZhdWx0ICdjaG9yZSdcbiAgICovXG4gIHJlYWRvbmx5IHNlbWFudGljQ29tbWl0Pzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBBZGQgU2lnbmVkLW9mZi1ieSBsaW5lIGJ5IHRoZSBjb21taXR0ZXIgYXQgdGhlIGVuZCBvZiB0aGUgY29tbWl0IGxvZyBtZXNzYWdlLlxuICAgKlxuICAgKiBAZGVmYXVsdCB0cnVlXG4gICAqL1xuICByZWFkb25seSBzaWdub2ZmPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogU3BlY2lmeSB3aGljaCBkZXBlbmRlbmN5IHR5cGVzIHRoZSB1cGdyYWRlIHNob3VsZCBvcGVyYXRlIG9uLlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIEFsbCBkZXBlbmRlbmN5IHR5cGVzLlxuICAgKi9cbiAgcmVhZG9ubHkgdHlwZXM/OiBEZXBlbmRlbmN5VHlwZVtdO1xufVxuXG4vKipcbiAqIFVwZ3JhZGUgbm9kZSBwcm9qZWN0IGRlcGVuZGVuY2llcy5cbiAqL1xuZXhwb3J0IGNsYXNzIFVwZ3JhZGVEZXBlbmRlbmNpZXMgZXh0ZW5kcyBDb21wb25lbnQge1xuICAvKipcbiAgICogVGhlIHdvcmtmbG93cyB0aGF0IGV4ZWN1dGUgdGhlIHVwZ3JhZGVzLiBPbmUgd29ya2Zsb3cgcGVyIGJyYW5jaC5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSB3b3JrZmxvd3M6IEdpdGh1YldvcmtmbG93W10gPSBbXTtcblxuICBwcml2YXRlIHJlYWRvbmx5IG9wdGlvbnM6IFVwZ3JhZGVEZXBlbmRlbmNpZXNPcHRpb25zO1xuICBwcml2YXRlIHJlYWRvbmx5IF9wcm9qZWN0OiBOb2RlUHJvamVjdDtcbiAgcHJpdmF0ZSByZWFkb25seSBwdWxsUmVxdWVzdFRpdGxlOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIENvbnRhaW5lciBkZWZpbml0aW9ucyBmb3IgdGhlIHVwZ3JhZGUgd29ya2Zsb3cuXG4gICAqL1xuICBwdWJsaWMgY29udGFpbmVyT3B0aW9ucz86IENvbnRhaW5lck9wdGlvbnM7XG5cbiAgLyoqXG4gICAqIFRoZSB1cGdyYWRlIHRhc2suXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgdXBncmFkZVRhc2s6IFRhc2s7XG5cbiAgLyoqXG4gICAqIEEgdGFzayBydW4gYWZ0ZXIgdGhlIHVwZ3JhZGUgdGFzay5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBwb3N0VXBncmFkZVRhc2s6IFRhc2s7XG5cbiAgcHJpdmF0ZSByZWFkb25seSBnaXRJZGVudGl0eTogR2l0SWRlbnRpdHk7XG4gIHByaXZhdGUgcmVhZG9ubHkgcG9zdEJ1aWxkU3RlcHM6IEpvYlN0ZXBbXTtcbiAgcHJpdmF0ZSByZWFkb25seSBwZXJtaXNzaW9uczogSm9iUGVybWlzc2lvbnM7XG4gIHByaXZhdGUgcmVhZG9ubHkgZGVwVHlwZXM6IERlcGVuZGVuY3lUeXBlW107XG4gIHByaXZhdGUgcmVhZG9ubHkgdXBncmFkZVRhcmdldDogc3RyaW5nO1xuICBwcml2YXRlIHJlYWRvbmx5IHNhdGlzZnlQZWVyRGVwZW5kZW5jaWVzOiBib29sZWFuO1xuICBwcml2YXRlIHJlYWRvbmx5IGluY2x1ZGVEZXByZWNhdGVkVmVyc2lvbnM6IGJvb2xlYW47XG5cbiAgY29uc3RydWN0b3IocHJvamVjdDogTm9kZVByb2plY3QsIG9wdGlvbnM6IFVwZ3JhZGVEZXBlbmRlbmNpZXNPcHRpb25zID0ge30pIHtcbiAgICBzdXBlcihwcm9qZWN0KTtcblxuICAgIHRoaXMuX3Byb2plY3QgPSBwcm9qZWN0O1xuICAgIHRoaXMub3B0aW9ucyA9IG9wdGlvbnM7XG4gICAgdGhpcy5kZXBUeXBlcyA9IHRoaXMub3B0aW9ucy50eXBlcyA/PyBbXG4gICAgICBEZXBlbmRlbmN5VHlwZS5CVUlMRCxcbiAgICAgIERlcGVuZGVuY3lUeXBlLkJVTkRMRUQsXG4gICAgICBEZXBlbmRlbmN5VHlwZS5ERVZFTlYsXG4gICAgICBEZXBlbmRlbmN5VHlwZS5QRUVSLFxuICAgICAgRGVwZW5kZW5jeVR5cGUuUlVOVElNRSxcbiAgICAgIERlcGVuZGVuY3lUeXBlLlRFU1QsXG4gICAgICBEZXBlbmRlbmN5VHlwZS5PUFRJT05BTCxcbiAgICBdO1xuICAgIHRoaXMudXBncmFkZVRhcmdldCA9IHRoaXMub3B0aW9ucy50YXJnZXQgPz8gXCJtaW5vclwiO1xuICAgIHRoaXMuc2F0aXNmeVBlZXJEZXBlbmRlbmNpZXMgPSB0aGlzLm9wdGlvbnMuc2F0aXNmeVBlZXJEZXBlbmRlbmNpZXMgPz8gdHJ1ZTtcbiAgICB0aGlzLmluY2x1ZGVEZXByZWNhdGVkVmVyc2lvbnMgPVxuICAgICAgdGhpcy5vcHRpb25zLmluY2x1ZGVEZXByZWNhdGVkVmVyc2lvbnMgPz8gZmFsc2U7XG4gICAgdGhpcy5wdWxsUmVxdWVzdFRpdGxlID0gb3B0aW9ucy5wdWxsUmVxdWVzdFRpdGxlID8/IFwidXBncmFkZSBkZXBlbmRlbmNpZXNcIjtcbiAgICB0aGlzLmdpdElkZW50aXR5ID1cbiAgICAgIG9wdGlvbnMud29ya2Zsb3dPcHRpb25zPy5naXRJZGVudGl0eSA/PyBERUZBVUxUX0dJVEhVQl9BQ1RJT05TX1VTRVI7XG4gICAgdGhpcy5wZXJtaXNzaW9ucyA9IHtcbiAgICAgIGNvbnRlbnRzOiBKb2JQZXJtaXNzaW9uLlJFQUQsXG4gICAgICAuLi5vcHRpb25zLndvcmtmbG93T3B0aW9ucz8ucGVybWlzc2lvbnMsXG4gICAgfTtcbiAgICB0aGlzLnBvc3RCdWlsZFN0ZXBzID0gW107XG4gICAgdGhpcy5jb250YWluZXJPcHRpb25zID0gb3B0aW9ucy53b3JrZmxvd09wdGlvbnM/LmNvbnRhaW5lcjtcblxuICAgIHRoaXMucG9zdFVwZ3JhZGVUYXNrID1cbiAgICAgIHByb2plY3QudGFza3MudHJ5RmluZChcInBvc3QtdXBncmFkZVwiKSA/P1xuICAgICAgcHJvamVjdC50YXNrcy5hZGRUYXNrKFwicG9zdC11cGdyYWRlXCIsIHtcbiAgICAgICAgZGVzY3JpcHRpb246IFwiUnVucyBhZnRlciB1cGdyYWRpbmcgZGVwZW5kZW5jaWVzXCIsXG4gICAgICB9KTtcblxuICAgIHRoaXMudXBncmFkZVRhc2sgPSBwcm9qZWN0LmFkZFRhc2sob3B0aW9ucy50YXNrTmFtZSA/PyBcInVwZ3JhZGVcIiwge1xuICAgICAgLy8gdGhpcyB0YXNrIHNob3VsZCBub3QgcnVuIGluIENJIG1vZGUgYmVjYXVzZSBpdHMgZGVzaWduZWQgdG9cbiAgICAgIC8vIHVwZGF0ZSBwYWNrYWdlLmpzb24gYW5kIGxvY2sgZmlsZXMuXG4gICAgICBlbnY6IHsgQ0k6IFwiMFwiIH0sXG4gICAgICBkZXNjcmlwdGlvbjogdGhpcy5wdWxsUmVxdWVzdFRpdGxlLFxuICAgICAgc3RlcHM6IHsgdG9KU09OOiAoKSA9PiB0aGlzLnJlbmRlclRhc2tTdGVwcygpIH0gYXMgYW55LFxuICAgIH0pO1xuICAgIHRoaXMudXBncmFkZVRhc2subG9jaygpOyAvLyB0aGlzIHRhc2sgaXMgYSBsYXp5IHZhbHVlLCBzbyBtYWtlIGl0IHJlYWRvbmx5XG5cbiAgICBpZiAodGhpcy51cGdyYWRlVGFzayAmJiBwcm9qZWN0LmdpdGh1YiAmJiAob3B0aW9ucy53b3JrZmxvdyA/PyB0cnVlKSkge1xuICAgICAgaWYgKG9wdGlvbnMud29ya2Zsb3dPcHRpb25zPy5icmFuY2hlcykge1xuICAgICAgICBmb3IgKGNvbnN0IGJyYW5jaCBvZiBvcHRpb25zLndvcmtmbG93T3B0aW9ucy5icmFuY2hlcykge1xuICAgICAgICAgIHRoaXMud29ya2Zsb3dzLnB1c2goXG4gICAgICAgICAgICB0aGlzLmNyZWF0ZVdvcmtmbG93KHRoaXMudXBncmFkZVRhc2ssIHByb2plY3QuZ2l0aHViLCBicmFuY2gpXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmIChSZWxlYXNlLm9mKHByb2plY3QpKSB7XG4gICAgICAgIGNvbnN0IHJlbGVhc2UgPSBSZWxlYXNlLm9mKHByb2plY3QpITtcbiAgICAgICAgcmVsZWFzZS5fZm9yRWFjaEJyYW5jaCgoYnJhbmNoOiBzdHJpbmcpID0+IHtcbiAgICAgICAgICB0aGlzLndvcmtmbG93cy5wdXNoKFxuICAgICAgICAgICAgdGhpcy5jcmVhdGVXb3JrZmxvdyh0aGlzLnVwZ3JhZGVUYXNrLCBwcm9qZWN0LmdpdGh1YiEsIGJyYW5jaClcbiAgICAgICAgICApO1xuICAgICAgICB9KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIHJlcHJlc2VudHMgdGhlIGRlZmF1bHQgcmVwb3NpdG9yeSBicmFuY2guXG4gICAgICAgIC8vIGp1c3QgbGlrZSBub3Qgc3BlY2lmeWluZyBhbnl0aGluZy5cbiAgICAgICAgY29uc3QgZGVmYXVsdEJyYW5jaCA9IHVuZGVmaW5lZDtcbiAgICAgICAgdGhpcy53b3JrZmxvd3MucHVzaChcbiAgICAgICAgICB0aGlzLmNyZWF0ZVdvcmtmbG93KHRoaXMudXBncmFkZVRhc2ssIHByb2plY3QuZ2l0aHViLCBkZWZhdWx0QnJhbmNoKVxuICAgICAgICApO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBBZGQgc3RlcHMgdG8gZXhlY3V0ZSBhIHN1Y2Nlc3NmdWwgYnVpbGQuXG4gICAqIEBwYXJhbSBzdGVwcyB3b3JrZmxvdyBzdGVwc1xuICAgKi9cbiAgcHVibGljIGFkZFBvc3RCdWlsZFN0ZXBzKC4uLnN0ZXBzOiBKb2JTdGVwW10pIHtcbiAgICB0aGlzLnBvc3RCdWlsZFN0ZXBzLnB1c2goLi4uc3RlcHMpO1xuICB9XG5cbiAgcHJpdmF0ZSByZW5kZXJUYXNrU3RlcHMoKTogVGFza1N0ZXBbXSB7XG4gICAgZnVuY3Rpb24gZXhlY3V0ZUNvbW1hbmQocGFja2FnZU1hbmFnZXI6IE5vZGVQYWNrYWdlTWFuYWdlcik6IHN0cmluZyB7XG4gICAgICBzd2l0Y2ggKHBhY2thZ2VNYW5hZ2VyKSB7XG4gICAgICAgIGNhc2UgTm9kZVBhY2thZ2VNYW5hZ2VyLk5QTTpcbiAgICAgICAgY2FzZSBOb2RlUGFja2FnZU1hbmFnZXIuWUFSTjpcbiAgICAgICAgY2FzZSBOb2RlUGFja2FnZU1hbmFnZXIuWUFSTl9DTEFTU0lDOlxuICAgICAgICAgIHJldHVybiBcIm5weFwiO1xuICAgICAgICBjYXNlIE5vZGVQYWNrYWdlTWFuYWdlci5QTlBNOlxuICAgICAgICAgIHJldHVybiBcInBucG0gZGx4XCI7XG4gICAgICAgIGNhc2UgTm9kZVBhY2thZ2VNYW5hZ2VyLllBUk4yOlxuICAgICAgICBjYXNlIE5vZGVQYWNrYWdlTWFuYWdlci5ZQVJOX0JFUlJZOlxuICAgICAgICAgIHJldHVybiBcInlhcm4gZGx4XCI7XG4gICAgICAgIGNhc2UgTm9kZVBhY2thZ2VNYW5hZ2VyLkJVTjpcbiAgICAgICAgICByZXR1cm4gXCJidW54XCI7XG4gICAgICB9XG4gICAgfVxuICAgIGNvbnN0IHN0ZXBzID0gbmV3IEFycmF5PFRhc2tTdGVwPigpO1xuXG4gICAgLy8gUGFja2FnZSBNYW5hZ2VyIHVwZ3JhZGUgc2hvdWxkIGFsd2F5cyBpbmNsdWRlIGFsbCBkZXBzXG4gICAgY29uc3QgaW5jbHVkZUZvclBhY2thZ2VNYW5hZ2VyVXBncmFkZSA9IHRoaXMuYnVpbGREZXBlbmRlbmN5TGlzdCh0cnVlKTtcbiAgICBpZiAoaW5jbHVkZUZvclBhY2thZ2VNYW5hZ2VyVXBncmFkZS5sZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVybiBbeyBleGVjOiBcImVjaG8gTm8gZGVwZW5kZW5jaWVzIHRvIHVwZ3JhZGUuXCIgfV07XG4gICAgfVxuXG4gICAgLy8gUmVtb3ZpbmcgYG5wbS1jaGVjay11cGRhdGVzYCBmcm9tIG91ciBkZXBlbmRlbmN5IHRyZWUgYmVjYXVzZSBpdCBkZXBlbmRzIG9uIGEgcGFja2FnZVxuICAgIC8vIHRoYXQgdXNlcyBhbiBucG0tc3BlY2lmaWMgZmVhdHVyZSB0aGF0IGNhdXNlcyBhbiBpbnZhbGlkIGRlcGVuZGVuY3kgdHJlZSB3aGVuIHVzaW5nIFlhcm4gMS5cbiAgICAvLyBTZWUgaHR0cHM6Ly9naXRodWIuY29tL3Byb2plbi9wcm9qZW4vcHVsbC8zMTM2IGZvciBtb3JlIGRldGFpbHMuXG4gICAgY29uc3QgaW5jbHVkZUZvck5jdSA9IHRoaXMuYnVpbGREZXBlbmRlbmN5TGlzdChmYWxzZSk7XG4gICAgY29uc3QgbmN1Q29tbWFuZCA9IFtcbiAgICAgIGAke2V4ZWN1dGVDb21tYW5kKFxuICAgICAgICB0aGlzLl9wcm9qZWN0LnBhY2thZ2UucGFja2FnZU1hbmFnZXJcbiAgICAgICl9IG5wbS1jaGVjay11cGRhdGVzQDE2YCxcbiAgICAgIFwiLS11cGdyYWRlXCIsXG4gICAgICBgLS10YXJnZXQ9JHt0aGlzLnVwZ3JhZGVUYXJnZXR9YCxcbiAgICAgIGAtLSR7dGhpcy5zYXRpc2Z5UGVlckRlcGVuZGVuY2llcyA/IFwicGVlclwiIDogXCJuby1wZWVyXCJ9YCxcbiAgICAgIGAtLSR7dGhpcy5pbmNsdWRlRGVwcmVjYXRlZFZlcnNpb25zID8gXCJkZXByZWNhdGVkXCIgOiBcIm5vLWRlcHJlY2F0ZWRcIn1gLFxuICAgICAgYC0tZGVwPSR7dGhpcy5yZW5kZXJOY3VEZXBlbmRlbmN5VHlwZXModGhpcy5kZXBUeXBlcyl9YCxcbiAgICAgIGAtLWZpbHRlcj0ke2luY2x1ZGVGb3JOY3Uuam9pbihcIixcIil9YCxcbiAgICBdO1xuXG4gICAgLy8gYnVtcCB2ZXJzaW9ucyBpbiBwYWNrYWdlLmpzb25cbiAgICBpZiAoaW5jbHVkZUZvck5jdS5sZW5ndGgpIHtcbiAgICAgIHN0ZXBzLnB1c2goeyBleGVjOiBuY3VDb21tYW5kLmpvaW4oXCIgXCIpIH0pO1xuICAgIH1cblxuICAgIC8vIHJ1biBcInlhcm4vbnBtIGluc3RhbGxcIiB0byB1cGRhdGUgdGhlIGxvY2tmaWxlIGFuZCBpbnN0YWxsIGFueSBkZXBzIChzdWNoIGFzIHByb2plbilcbiAgICBzdGVwcy5wdXNoKHsgZXhlYzogdGhpcy5fcHJvamVjdC5wYWNrYWdlLmluc3RhbGxBbmRVcGRhdGVMb2NrZmlsZUNvbW1hbmQgfSk7XG5cbiAgICAvLyBydW4gdXBncmFkZSBjb21tYW5kIHRvIHVwZ3JhZGUgdHJhbnNpdGl2ZSBkZXBzIGFzIHdlbGxcbiAgICBzdGVwcy5wdXNoKHtcbiAgICAgIGV4ZWM6IHRoaXMucmVuZGVyVXBncmFkZVBhY2thZ2VzQ29tbWFuZChpbmNsdWRlRm9yUGFja2FnZU1hbmFnZXJVcGdyYWRlKSxcbiAgICB9KTtcblxuICAgIC8vIHJ1biBcInByb2plblwiIHRvIGdpdmUgcHJvamVuIGEgY2hhbmNlIHRvIHVwZGF0ZSBkZXBlbmRlbmNpZXMgKGl0IHdpbGwgYWxzbyBydW4gXCJ5YXJuIGluc3RhbGxcIilcbiAgICBzdGVwcy5wdXNoKHsgZXhlYzogdGhpcy5fcHJvamVjdC5wcm9qZW5Db21tYW5kIH0pO1xuICAgIHN0ZXBzLnB1c2goeyBzcGF3bjogdGhpcy5wb3N0VXBncmFkZVRhc2submFtZSB9KTtcblxuICAgIHJldHVybiBzdGVwcztcbiAgfVxuXG4gIC8qKlxuICAgKiBSZW5kZXIgcHJvamVuIGRlcGVuZGVuY2llcyB0eXBlcyB0byBhIGxpc3Qgb2YgbmN1IGNvbXBhdGlibGUgdHlwZXNcbiAgICovXG4gIHByaXZhdGUgcmVuZGVyTmN1RGVwZW5kZW5jeVR5cGVzKHR5cGVzOiBEZXBlbmRlbmN5VHlwZVtdKSB7XG4gICAgcmV0dXJuIEFycmF5LmZyb20oXG4gICAgICBuZXcgU2V0KFxuICAgICAgICB0eXBlc1xuICAgICAgICAgIC5tYXAoKHR5cGUpID0+IHtcbiAgICAgICAgICAgIHN3aXRjaCAodHlwZSkge1xuICAgICAgICAgICAgICBjYXNlIERlcGVuZGVuY3lUeXBlLlBFRVI6XG4gICAgICAgICAgICAgICAgcmV0dXJuIFwicGVlclwiO1xuICAgICAgICAgICAgICBjYXNlIERlcGVuZGVuY3lUeXBlLlJVTlRJTUU6XG4gICAgICAgICAgICAgICAgcmV0dXJuIFwicHJvZFwiO1xuICAgICAgICAgICAgICBjYXNlIERlcGVuZGVuY3lUeXBlLk9QVElPTkFMOlxuICAgICAgICAgICAgICAgIHJldHVybiBcIm9wdGlvbmFsXCI7XG5cbiAgICAgICAgICAgICAgY2FzZSBEZXBlbmRlbmN5VHlwZS5URVNUOlxuICAgICAgICAgICAgICBjYXNlIERlcGVuZGVuY3lUeXBlLkRFVkVOVjpcbiAgICAgICAgICAgICAgY2FzZSBEZXBlbmRlbmN5VHlwZS5CVUlMRDpcbiAgICAgICAgICAgICAgICByZXR1cm4gXCJkZXZcIjtcblxuICAgICAgICAgICAgICBjYXNlIERlcGVuZGVuY3lUeXBlLkJVTkRMRUQ6XG4gICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pXG4gICAgICAgICAgLmZpbHRlcigodHlwZSkgPT4gQm9vbGVhbih0eXBlKSlcbiAgICAgIClcbiAgICApLmpvaW4oXCIsXCIpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlbmRlciBhIHBhY2thZ2UgbWFuYWdlciBzcGVjaWZpYyBjb21tYW5kIHRvIHVwZ3JhZGUgYWxsIHJlcXVlc3RlZCBkZXBlbmRlbmNpZXMuXG4gICAqL1xuICBwcml2YXRlIHJlbmRlclVwZ3JhZGVQYWNrYWdlc0NvbW1hbmQoaW5jbHVkZTogc3RyaW5nW10pOiBzdHJpbmcge1xuICAgIGZ1bmN0aW9uIHVwZ3JhZGVQYWNrYWdlcyhjb21tYW5kOiBzdHJpbmcpIHtcbiAgICAgIHJldHVybiAoKSA9PiB7XG4gICAgICAgIHJldHVybiBgJHtjb21tYW5kfSAke2luY2x1ZGUuam9pbihcIiBcIil9YDtcbiAgICAgIH07XG4gICAgfVxuXG4gICAgY29uc3QgcGFja2FnZU1hbmFnZXIgPSB0aGlzLl9wcm9qZWN0LnBhY2thZ2UucGFja2FnZU1hbmFnZXI7XG5cbiAgICBsZXQgbGF6eSA9IHVuZGVmaW5lZDtcbiAgICBzd2l0Y2ggKHBhY2thZ2VNYW5hZ2VyKSB7XG4gICAgICBjYXNlIE5vZGVQYWNrYWdlTWFuYWdlci5ZQVJOOlxuICAgICAgY2FzZSBOb2RlUGFja2FnZU1hbmFnZXIuWUFSTl9DTEFTU0lDOlxuICAgICAgICBsYXp5ID0gdXBncmFkZVBhY2thZ2VzKFwieWFybiB1cGdyYWRlXCIpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgTm9kZVBhY2thZ2VNYW5hZ2VyLllBUk4yOlxuICAgICAgY2FzZSBOb2RlUGFja2FnZU1hbmFnZXIuWUFSTl9CRVJSWTpcbiAgICAgICAgbGF6eSA9IHVwZ3JhZGVQYWNrYWdlcyhcInlhcm4gdXBcIik7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBOb2RlUGFja2FnZU1hbmFnZXIuTlBNOlxuICAgICAgICBsYXp5ID0gdXBncmFkZVBhY2thZ2VzKFwibnBtIHVwZGF0ZVwiKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIE5vZGVQYWNrYWdlTWFuYWdlci5QTlBNOlxuICAgICAgICBsYXp5ID0gdXBncmFkZVBhY2thZ2VzKFwicG5wbSB1cGRhdGVcIik7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBOb2RlUGFja2FnZU1hbmFnZXIuQlVOOlxuICAgICAgICBsYXp5ID0gdXBncmFkZVBhY2thZ2VzKFwiYnVuIHVwZGF0ZVwiKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYHVuZXhwZWN0ZWQgcGFja2FnZSBtYW5hZ2VyICR7cGFja2FnZU1hbmFnZXJ9YCk7XG4gICAgfVxuXG4gICAgLy8gcmV0dXJuIGEgbGF6eSBmdW5jdGlvbiBzbyB0aGF0IGRlcGVuZGVuY2llcyBpbmNsdWRlIG9uZXMgdGhhdCB3ZXJlXG4gICAgLy8gYWRkZWQgcG9zdCBwcm9qZWN0IGluc3RhbnRpYXRpb24gKGkuZSB1c2luZyBwcm9qZWN0LmFkZERlcHMpXG4gICAgcmV0dXJuIGxhenkgYXMgdW5rbm93biBhcyBzdHJpbmc7XG4gIH1cblxuICBwcml2YXRlIGJ1aWxkRGVwZW5kZW5jeUxpc3QoaW5jbHVkZURlcGVuZGVuY2llc1dpdGhDb25zdHJhaW50OiBib29sZWFuKSB7XG4gICAgcmV0dXJuIEFycmF5LmZyb20oXG4gICAgICBuZXcgU2V0KFxuICAgICAgICB0aGlzLm9wdGlvbnMuaW5jbHVkZSA/P1xuICAgICAgICAgIHRoaXMuZmlsdGVyRGVwZW5kZW5jaWVzKGluY2x1ZGVEZXBlbmRlbmNpZXNXaXRoQ29uc3RyYWludClcbiAgICAgIClcbiAgICApO1xuICB9XG5cbiAgcHJpdmF0ZSBmaWx0ZXJEZXBlbmRlbmNpZXMoaW5jbHVkZUNvbnN0cmFpbnQ6IGJvb2xlYW4pOiBzdHJpbmdbXSB7XG4gICAgY29uc3QgZGVwZW5kZW5jaWVzID0gW107XG5cbiAgICBjb25zdCBkZXBzID0gdGhpcy5wcm9qZWN0LmRlcHMuYWxsXG4gICAgICAvLyByZW1vdmUgdGhvc2UgdGhhdCBoYXZlIGEgY29uc3RyYWludCB2ZXJzaW9uICh1bmxlc3MgaW5jbHVkZUNvbnN0cmFpbnQgaXMgdHJ1ZSlcbiAgICAgIC5maWx0ZXIoXG4gICAgICAgIChkKSA9PlxuICAgICAgICAgIGluY2x1ZGVDb25zdHJhaW50IHx8IHRoaXMucGFja2FnZUNhbkJlVXBncmFkZWRJblBhY2thZ2VKc29uKGQudmVyc2lvbilcbiAgICAgIClcbiAgICAgIC8vIHJlbW92ZSBvdmVycmlkZSBkZXBlbmRlbmNpZXNcbiAgICAgIC5maWx0ZXIoKGQpID0+IGQudHlwZSAhPT0gRGVwZW5kZW5jeVR5cGUuT1ZFUlJJREUpO1xuXG4gICAgZm9yIChjb25zdCB0eXBlIG9mIHRoaXMuZGVwVHlwZXMpIHtcbiAgICAgIGRlcGVuZGVuY2llcy5wdXNoKFxuICAgICAgICAuLi5kZXBzXG4gICAgICAgICAgLmZpbHRlcigoZCkgPT4gZC50eXBlID09PSB0eXBlKVxuICAgICAgICAgIC5maWx0ZXIoKGQpID0+ICEodGhpcy5vcHRpb25zLmV4Y2x1ZGUgPz8gW10pLmluY2x1ZGVzKGQubmFtZSkpXG4gICAgICApO1xuICAgIH1cblxuICAgIHJldHVybiBkZXBlbmRlbmNpZXMubWFwKChkKSA9PiBkLm5hbWUpO1xuICB9XG5cbiAgLyoqXG4gICAqIFByb2plbiBjYW4gYWx0ZXIgYSBwYWNrYWdlJ3MgdmVyc2lvbiBpbiBwYWNrYWdlLmpzb24gd2hlbiBlaXRoZXIgdGhlIHZlcnNpb24gaXMgb21pdHRlZCwgb3Igc2V0IHRvIFwiKlwiLlxuICAgKiBPdGhlcndpc2UsIHRoZSBleGFjdCB2ZXJzaW9uIHNlbGVjdGVkIGlzIHBsYWNlZCBpbiB0aGUgcGFja2FnZS5qc29uIGZpbGUgYW5kIHVwZ3JhZGluZyBpcyBoYW5kbGVkIHRocm91Z2ggdGhlIHBhY2thZ2UgbWFuYWdlclxuICAgKiByYXRoZXIgdGhhbiBucG0tY2hlY2stdXBkYXRlcy5cbiAgICpcbiAgICogQHBhcmFtIHZlcnNpb24gc2VtdmVyIGZyb20gRGVwZW5kZW5jeUNvb3JkaW5hdGVzLnZlcnNpb24sIG1heSBiZSB1bmRlZmluZWRcbiAgICogQHJldHVybnMgd2hldGhlciB0aGUgdmVyc2lvbiBpcyB0aGUgZGVmYXVsdCB2ZXJzaW9uaW5nIGJlaGF2aW9yXG4gICAqL1xuICBwcml2YXRlIHBhY2thZ2VDYW5CZVVwZ3JhZGVkSW5QYWNrYWdlSnNvbihcbiAgICB2ZXJzaW9uOiBzdHJpbmcgfCB1bmRlZmluZWRcbiAgKTogYm9vbGVhbiB7XG4gICAgLy8gTm8gdmVyc2lvbiBtZWFucyBcImxhdGVzdFwiXG4gICAgcmV0dXJuICF2ZXJzaW9uIHx8IHZlcnNpb24gPT09IFwiKlwiO1xuICB9XG5cbiAgcHJpdmF0ZSBjcmVhdGVXb3JrZmxvdyhcbiAgICB0YXNrOiBUYXNrLFxuICAgIGdpdGh1YjogR2l0SHViLFxuICAgIGJyYW5jaD86IHN0cmluZ1xuICApOiBHaXRodWJXb3JrZmxvdyB7XG4gICAgY29uc3Qgc2NoZWR1bGUgPVxuICAgICAgdGhpcy5vcHRpb25zLndvcmtmbG93T3B0aW9ucz8uc2NoZWR1bGUgPz9cbiAgICAgIFVwZ3JhZGVEZXBlbmRlbmNpZXNTY2hlZHVsZS5EQUlMWTtcblxuICAgIGNvbnN0IHdvcmtmbG93TmFtZSA9IGAke3Rhc2submFtZX0ke1xuICAgICAgYnJhbmNoID8gYC0ke2JyYW5jaC5yZXBsYWNlKC9cXC8vZywgXCItXCIpfWAgOiBcIlwiXG4gICAgfWA7XG4gICAgY29uc3Qgd29ya2Zsb3cgPSBnaXRodWIuYWRkV29ya2Zsb3cod29ya2Zsb3dOYW1lKTtcbiAgICBjb25zdCB0cmlnZ2Vyczogd29ya2Zsb3dzLlRyaWdnZXJzID0ge1xuICAgICAgd29ya2Zsb3dEaXNwYXRjaDoge30sXG4gICAgICBzY2hlZHVsZTpcbiAgICAgICAgc2NoZWR1bGUuY3Jvbi5sZW5ndGggPiAwXG4gICAgICAgICAgPyBzY2hlZHVsZS5jcm9uLm1hcCgoZSkgPT4gKHsgY3JvbjogZSB9KSlcbiAgICAgICAgICA6IHVuZGVmaW5lZCxcbiAgICB9O1xuICAgIHdvcmtmbG93Lm9uKHRyaWdnZXJzKTtcblxuICAgIGNvbnN0IHVwZ3JhZGUgPSB0aGlzLmNyZWF0ZVVwZ3JhZGUodGFzaywgZ2l0aHViLCBicmFuY2gpO1xuICAgIGNvbnN0IHByID0gdGhpcy5jcmVhdGVQcih3b3JrZmxvdywgdXBncmFkZSk7XG5cbiAgICBjb25zdCBqb2JzOiBSZWNvcmQ8c3RyaW5nLCB3b3JrZmxvd3MuSm9iPiA9IHt9O1xuICAgIGpvYnNbdXBncmFkZS5qb2JJZF0gPSB1cGdyYWRlLmpvYjtcbiAgICBqb2JzW3ByLmpvYklkXSA9IHByLmpvYjtcblxuICAgIHdvcmtmbG93LmFkZEpvYnMoam9icyk7XG4gICAgcmV0dXJuIHdvcmtmbG93O1xuICB9XG5cbiAgcHJpdmF0ZSBjcmVhdGVVcGdyYWRlKHRhc2s6IFRhc2ssIGdpdGh1YjogR2l0SHViLCBicmFuY2g/OiBzdHJpbmcpOiBVcGdyYWRlIHtcbiAgICBjb25zdCB3aXRoXyA9IHtcbiAgICAgIC4uLihicmFuY2ggPyB7IHJlZjogYnJhbmNoIH0gOiB7fSksXG4gICAgICAuLi4oZ2l0aHViLmRvd25sb2FkTGZzID8geyBsZnM6IHRydWUgfSA6IHt9KSxcbiAgICB9O1xuXG4gICAgY29uc3Qgc3RlcHM6IHdvcmtmbG93cy5Kb2JTdGVwW10gPSBbXG4gICAgICBXb3JrZmxvd1N0ZXBzLmNoZWNrb3V0KHsgd2l0aDogd2l0aF8gfSksXG4gICAgICAuLi50aGlzLl9wcm9qZWN0LnJlbmRlcldvcmtmbG93U2V0dXAoeyBtdXRhYmxlOiBmYWxzZSB9KSxcbiAgICAgIHtcbiAgICAgICAgbmFtZTogXCJVcGdyYWRlIGRlcGVuZGVuY2llc1wiLFxuICAgICAgICBydW46IHRoaXMuX3Byb2plY3QucnVuVGFza0NvbW1hbmQodGFzayksXG4gICAgICB9LFxuICAgIF07XG5cbiAgICBzdGVwcy5wdXNoKC4uLnRoaXMucG9zdEJ1aWxkU3RlcHMpO1xuICAgIHN0ZXBzLnB1c2goXG4gICAgICAuLi5Xb3JrZmxvd0FjdGlvbnMudXBsb2FkR2l0UGF0Y2goe1xuICAgICAgICBzdGVwSWQ6IENSRUFURV9QQVRDSF9TVEVQX0lELFxuICAgICAgICBvdXRwdXROYW1lOiBQQVRDSF9DUkVBVEVEX09VVFBVVCxcbiAgICAgIH0pXG4gICAgKTtcblxuICAgIHJldHVybiB7XG4gICAgICBqb2I6IHtcbiAgICAgICAgbmFtZTogXCJVcGdyYWRlXCIsXG4gICAgICAgIGNvbnRhaW5lcjogdGhpcy5jb250YWluZXJPcHRpb25zLFxuICAgICAgICBwZXJtaXNzaW9uczogdGhpcy5wZXJtaXNzaW9ucyxcbiAgICAgICAgZW52OiB0aGlzLm9wdGlvbnMud29ya2Zsb3dPcHRpb25zPy5lbnYsXG4gICAgICAgIC4uLmZpbHRlcmVkUnVuc09uT3B0aW9ucyhcbiAgICAgICAgICB0aGlzLm9wdGlvbnMud29ya2Zsb3dPcHRpb25zPy5ydW5zT24sXG4gICAgICAgICAgdGhpcy5vcHRpb25zLndvcmtmbG93T3B0aW9ucz8ucnVuc09uR3JvdXBcbiAgICAgICAgKSxcbiAgICAgICAgc3RlcHM6IHN0ZXBzLFxuICAgICAgICBvdXRwdXRzOiB7XG4gICAgICAgICAgW1BBVENIX0NSRUFURURfT1VUUFVUXToge1xuICAgICAgICAgICAgc3RlcElkOiBDUkVBVEVfUEFUQ0hfU1RFUF9JRCxcbiAgICAgICAgICAgIG91dHB1dE5hbWU6IFBBVENIX0NSRUFURURfT1VUUFVULFxuICAgICAgICAgIH0sXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgICAgam9iSWQ6IFwidXBncmFkZVwiLFxuICAgICAgcmVmOiBicmFuY2gsXG4gICAgfTtcbiAgfVxuXG4gIHByaXZhdGUgY3JlYXRlUHIod29ya2Zsb3c6IEdpdGh1YldvcmtmbG93LCB1cGdyYWRlOiBVcGdyYWRlKTogUFIge1xuICAgIGNvbnN0IGNyZWRlbnRpYWxzID1cbiAgICAgIHRoaXMub3B0aW9ucy53b3JrZmxvd09wdGlvbnM/LnByb2plbkNyZWRlbnRpYWxzID8/XG4gICAgICB3b3JrZmxvdy5wcm9qZW5DcmVkZW50aWFscztcblxuICAgIGNvbnN0IHNlbWFudGljQ29tbWl0ID0gdGhpcy5vcHRpb25zLnNlbWFudGljQ29tbWl0ID8/IFwiY2hvcmVcIjtcblxuICAgIHJldHVybiB7XG4gICAgICBqb2I6IFdvcmtmbG93Sm9icy5wdWxsUmVxdWVzdEZyb21QYXRjaCh7XG4gICAgICAgIHBhdGNoOiB7XG4gICAgICAgICAgam9iSWQ6IHVwZ3JhZGUuam9iSWQsXG4gICAgICAgICAgb3V0cHV0TmFtZTogUEFUQ0hfQ1JFQVRFRF9PVVRQVVQsXG4gICAgICAgICAgcmVmOiB1cGdyYWRlLnJlZixcbiAgICAgICAgfSxcbiAgICAgICAgd29ya2Zsb3dOYW1lOiB3b3JrZmxvdy5uYW1lLFxuICAgICAgICBjcmVkZW50aWFscyxcbiAgICAgICAgLi4uZmlsdGVyZWRSdW5zT25PcHRpb25zKFxuICAgICAgICAgIHRoaXMub3B0aW9ucy53b3JrZmxvd09wdGlvbnM/LnJ1bnNPbixcbiAgICAgICAgICB0aGlzLm9wdGlvbnMud29ya2Zsb3dPcHRpb25zPy5ydW5zT25Hcm91cFxuICAgICAgICApLFxuICAgICAgICBwdWxsUmVxdWVzdFRpdGxlOiBgJHtzZW1hbnRpY0NvbW1pdH0oZGVwcyk6ICR7dGhpcy5wdWxsUmVxdWVzdFRpdGxlfWAsXG4gICAgICAgIHB1bGxSZXF1ZXN0RGVzY3JpcHRpb246IFwiVXBncmFkZXMgcHJvamVjdCBkZXBlbmRlbmNpZXMuXCIsXG4gICAgICAgIGdpdElkZW50aXR5OiB0aGlzLmdpdElkZW50aXR5LFxuICAgICAgICBhc3NpZ25lZXM6IHRoaXMub3B0aW9ucy53b3JrZmxvd09wdGlvbnM/LmFzc2lnbmVlcyxcbiAgICAgICAgbGFiZWxzOiB0aGlzLm9wdGlvbnMud29ya2Zsb3dPcHRpb25zPy5sYWJlbHMsXG4gICAgICAgIHNpZ25vZmY6IHRoaXMub3B0aW9ucy5zaWdub2ZmLFxuICAgICAgfSksXG4gICAgICBqb2JJZDogXCJwclwiLFxuICAgIH07XG4gIH1cbn1cblxuaW50ZXJmYWNlIFVwZ3JhZGUge1xuICByZWFkb25seSByZWY/OiBzdHJpbmc7XG4gIHJlYWRvbmx5IGpvYjogd29ya2Zsb3dzLkpvYjtcbiAgcmVhZG9ubHkgam9iSWQ6IHN0cmluZztcbn1cblxuaW50ZXJmYWNlIFBSIHtcbiAgcmVhZG9ubHkgam9iOiB3b3JrZmxvd3MuSm9iO1xuICByZWFkb25seSBqb2JJZDogc3RyaW5nO1xufVxuXG4vKipcbiAqIE9wdGlvbnMgZm9yIGBVcGdyYWRlRGVwZW5kZW5jaWVzLndvcmtmbG93T3B0aW9uc2AuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVXBncmFkZURlcGVuZGVuY2llc1dvcmtmbG93T3B0aW9ucyB7XG4gIC8qKlxuICAgKiBTY2hlZHVsZSB0byBydW4gb24uXG4gICAqXG4gICAqIEBkZWZhdWx0IFVwZ3JhZGVEZXBlbmRlbmNpZXNTY2hlZHVsZS5EQUlMWVxuICAgKi9cbiAgcmVhZG9ubHkgc2NoZWR1bGU/OiBVcGdyYWRlRGVwZW5kZW5jaWVzU2NoZWR1bGU7XG5cbiAgLyoqXG4gICAqIENob29zZSBhIG1ldGhvZCBmb3IgYXV0aGVudGljYXRpbmcgd2l0aCBHaXRIdWIgZm9yIGNyZWF0aW5nIHRoZSBQUi5cbiAgICpcbiAgICogV2hlbiB1c2luZyB0aGUgZGVmYXVsdCBnaXRodWIgdG9rZW4sIFBSJ3MgY3JlYXRlZCBieSB0aGlzIHdvcmtmbG93XG4gICAqIHdpbGwgbm90IHRyaWdnZXIgYW55IHN1YnNlcXVlbnQgd29ya2Zsb3dzIChpLmUgdGhlIGJ1aWxkIHdvcmtmbG93KSwgc29cbiAgICogcHJvamVuIHJlcXVpcmVzIEFQSSBhY2Nlc3MgdG8gYmUgcHJvdmlkZWQgdGhyb3VnaCBlLmcuIGEgcGVyc29uYWxcbiAgICogYWNjZXNzIHRva2VuIG9yIG90aGVyIG1ldGhvZC5cbiAgICpcbiAgICogQHNlZSBodHRwczovL2dpdGh1Yi5jb20vcGV0ZXItZXZhbnMvY3JlYXRlLXB1bGwtcmVxdWVzdC9pc3N1ZXMvNDhcbiAgICogQGRlZmF1bHQgLSBwZXJzb25hbCBhY2Nlc3MgdG9rZW4gbmFtZWQgUFJPSkVOX0dJVEhVQl9UT0tFTlxuICAgKi9cbiAgcmVhZG9ubHkgcHJvamVuQ3JlZGVudGlhbHM/OiBHaXRodWJDcmVkZW50aWFscztcblxuICAvKipcbiAgICogTGFiZWxzIHRvIGFwcGx5IG9uIHRoZSBQUi5cbiAgICpcbiAgICogQGRlZmF1bHQgLSBubyBsYWJlbHMuXG4gICAqL1xuICByZWFkb25seSBsYWJlbHM/OiBzdHJpbmdbXTtcblxuICAvKipcbiAgICogQXNzaWduZWVzIHRvIGFkZCBvbiB0aGUgUFIuXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gbm8gYXNzaWduZWVzXG4gICAqL1xuICByZWFkb25seSBhc3NpZ25lZXM/OiBzdHJpbmdbXTtcblxuICAvKipcbiAgICogSm9iIGNvbnRhaW5lciBvcHRpb25zLlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIGRlZmF1bHRzXG4gICAqL1xuICByZWFkb25seSBjb250YWluZXI/OiB3b3JrZmxvd3MuQ29udGFpbmVyT3B0aW9ucztcblxuICAvKipcbiAgICogTGlzdCBvZiBicmFuY2hlcyB0byBjcmVhdGUgUFIncyBmb3IuXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gQWxsIHJlbGVhc2UgYnJhbmNoZXMgY29uZmlndXJlZCBmb3IgdGhlIHByb2plY3QuXG4gICAqL1xuICByZWFkb25seSBicmFuY2hlcz86IHN0cmluZ1tdO1xuXG4gIC8qKlxuICAgKiBUaGUgZ2l0IGlkZW50aXR5IHRvIHVzZSBmb3IgY29tbWl0cy5cbiAgICogQGRlZmF1bHQgLSBkZWZhdWx0IEdpdEh1YiBBY3Rpb25zIHVzZXJcbiAgICovXG4gIHJlYWRvbmx5IGdpdElkZW50aXR5PzogR2l0SWRlbnRpdHk7XG5cbiAgLyoqXG4gICAqIEdpdGh1YiBSdW5uZXIgc2VsZWN0aW9uIGxhYmVsc1xuICAgKiBAZGVmYXVsdCBbXCJ1YnVudHUtbGF0ZXN0XCJdXG4gICAqIEBkZXNjcmlwdGlvbiBEZWZpbmVzIGEgdGFyZ2V0IFJ1bm5lciBieSBsYWJlbHNcbiAgICogQHRocm93cyB7RXJyb3J9IGlmIGJvdGggYHJ1bnNPbmAgYW5kIGBydW5zT25Hcm91cGAgYXJlIHNwZWNpZmllZFxuICAgKi9cbiAgcmVhZG9ubHkgcnVuc09uPzogc3RyaW5nW107XG5cbiAgLyoqXG4gICAqIEdpdGh1YiBSdW5uZXIgR3JvdXAgc2VsZWN0aW9uIG9wdGlvbnNcbiAgICogQGRlc2NyaXB0aW9uIERlZmluZXMgYSB0YXJnZXQgUnVubmVyIEdyb3VwIGJ5IG5hbWUgYW5kL29yIGxhYmVsc1xuICAgKiBAdGhyb3dzIHtFcnJvcn0gaWYgYm90aCBgcnVuc09uYCBhbmQgYHJ1bnNPbkdyb3VwYCBhcmUgc3BlY2lmaWVkXG4gICAqL1xuICByZWFkb25seSBydW5zT25Hcm91cD86IEdyb3VwUnVubmVyT3B0aW9ucztcblxuICAvKipcbiAgICogUGVybWlzc2lvbnMgZ3JhbnRlZCB0byB0aGUgdXBncmFkZSBqb2JcbiAgICogVG8gbGltaXQgam9iIHBlcm1pc3Npb25zIGZvciBgY29udGVudHNgLCB0aGUgZGVzaXJlZCBwZXJtaXNzaW9ucyBoYXZlIHRvIGJlIGV4cGxpY2l0bHkgc2V0LCBlLmcuOiBgeyBjb250ZW50czogSm9iUGVybWlzc2lvbi5OT05FIH1gXG4gICAqIEBkZWZhdWx0IGB7IGNvbnRlbnRzOiBKb2JQZXJtaXNzaW9uLlJFQUQgfWBcbiAgICovXG4gIHJlYWRvbmx5IHBlcm1pc3Npb25zPzogSm9iUGVybWlzc2lvbnM7XG5cbiAgLyoqXG4gICAqIEJ1aWxkIGVudmlyb25tZW50IHZhcmlhYmxlcyBmb3IgdGhlIHVwZ3JhZGUgam9iLlxuICAgKlxuICAgKiBAZGVmYXVsdCB7fVxuICAgKi9cbiAgcmVhZG9ubHkgZW52PzogeyBba2V5OiBzdHJpbmddOiBzdHJpbmcgfTtcbn1cblxuLyoqXG4gKiBIb3cgb2Z0ZW4gdG8gY2hlY2sgZm9yIG5ldyB2ZXJzaW9ucyBhbmQgcmFpc2UgcHVsbCByZXF1ZXN0cyBmb3IgdmVyc2lvbiB1cGdyYWRlcy5cbiAqL1xuZXhwb3J0IGNsYXNzIFVwZ3JhZGVEZXBlbmRlbmNpZXNTY2hlZHVsZSB7XG4gIC8qKlxuICAgKiBEaXNhYmxlcyBhdXRvbWF0aWMgdXBncmFkZXMuXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IE5FVkVSID0gbmV3IFVwZ3JhZGVEZXBlbmRlbmNpZXNTY2hlZHVsZShbXSk7XG5cbiAgLyoqXG4gICAqIEF0IDAwOjAwLlxuICAgKi9cbiAgcHVibGljIHN0YXRpYyByZWFkb25seSBEQUlMWSA9IG5ldyBVcGdyYWRlRGVwZW5kZW5jaWVzU2NoZWR1bGUoW1wiMCAwICogKiAqXCJdKTtcblxuICAvKipcbiAgICogQXQgMDA6MDAgb24gZXZlcnkgZGF5LW9mLXdlZWsgZnJvbSBNb25kYXkgdGhyb3VnaCBGcmlkYXkuXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFdFRUtEQVkgPSBuZXcgVXBncmFkZURlcGVuZGVuY2llc1NjaGVkdWxlKFtcbiAgICBcIjAgMCAqICogMS01XCIsXG4gIF0pO1xuXG4gIC8qKlxuICAgKiBBdCAwMDowMCBvbiBNb25kYXkuXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFdFRUtMWSA9IG5ldyBVcGdyYWRlRGVwZW5kZW5jaWVzU2NoZWR1bGUoW1xuICAgIFwiMCAwICogKiAxXCIsXG4gIF0pO1xuXG4gIC8qKlxuICAgKiBBdCAwMDowMCBvbiBkYXktb2YtbW9udGggMS5cbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgTU9OVEhMWSA9IG5ldyBVcGdyYWRlRGVwZW5kZW5jaWVzU2NoZWR1bGUoW1xuICAgIFwiMCAwIDEgKiAqXCIsXG4gIF0pO1xuXG4gIC8qKlxuICAgKiBDcmVhdGUgYSBzY2hlZHVsZSBmcm9tIGEgcmF3IGNyb24gZXhwcmVzc2lvbi5cbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgZXhwcmVzc2lvbnMoY3Jvbjogc3RyaW5nW10pIHtcbiAgICByZXR1cm4gbmV3IFVwZ3JhZGVEZXBlbmRlbmNpZXNTY2hlZHVsZShjcm9uKTtcbiAgfVxuXG4gIHByaXZhdGUgY29uc3RydWN0b3IocHVibGljIHJlYWRvbmx5IGNyb246IHN0cmluZ1tdKSB7fVxufVxuIl19
|
|
415
|
+
/**
|
|
416
|
+
* Convert days to minutes.
|
|
417
|
+
*/
|
|
418
|
+
function daysToMinutes(days) {
|
|
419
|
+
return days * 1440;
|
|
420
|
+
}
|
|
421
|
+
/**
|
|
422
|
+
* Convert days to seconds.
|
|
423
|
+
*/
|
|
424
|
+
function daysToSeconds(days) {
|
|
425
|
+
return days * 86400;
|
|
426
|
+
}
|
|
427
|
+
/**
|
|
428
|
+
* Convert days to milliseconds.
|
|
429
|
+
*/
|
|
430
|
+
function daysToMilliseconds(days) {
|
|
431
|
+
return days * 86400000;
|
|
432
|
+
}
|
|
433
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXBncmFkZS1kZXBlbmRlbmNpZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvamF2YXNjcmlwdC91cGdyYWRlLWRlcGVuZGVuY2llcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQUFBLDRDQUF5QztBQUN6QyxrREFBaUQ7QUFDakQsc0NBUW1CO0FBQ25CLG1EQUFrRTtBQUNsRSxpRUFBNkQ7QUFDN0QsK0RBS21DO0FBQ25DLDhDQUFnRTtBQUNoRSx3Q0FBcUM7QUFDckMsc0RBQThFO0FBRzlFLGlDQUEyRDtBQUUzRCxNQUFNLG9CQUFvQixHQUFHLGNBQWMsQ0FBQztBQUM1QyxNQUFNLG9CQUFvQixHQUFHLGVBQWUsQ0FBQztBQWdJN0M7O0dBRUc7QUFDSCxNQUFhLG1CQUFvQixTQUFRLHFCQUFTO0lBa0NoRCxZQUFZLE9BQW9CLEVBQUUsVUFBc0MsRUFBRTtRQUN4RSxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUM7UUFsQ2pCOztXQUVHO1FBQ2EsY0FBUyxHQUFxQixFQUFFLENBQUM7UUFpQy9DLElBQUksQ0FBQyxPQUFPLEdBQUcsT0FBTyxDQUFDO1FBQ3ZCLElBQUksQ0FBQyxPQUFPLEdBQUcsT0FBTyxDQUFDO1FBRXZCLG9CQUFvQjtRQUNwQixJQUNFLE9BQU8sQ0FBQyxRQUFRLEtBQUssU0FBUztZQUM5QixDQUFDLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLElBQUksT0FBTyxDQUFDLFFBQVEsR0FBRyxDQUFDLENBQUMsRUFDN0QsQ0FBQztZQUNELE1BQU0sSUFBSSxLQUFLLENBQ2Isd0VBQXdFLENBQ3pFLENBQUM7UUFDSixDQUFDO1FBRUQsd0NBQXdDO1FBQ3hDLElBQUksT0FBTyxDQUFDLFFBQVEsSUFBSSxJQUFBLG9CQUFhLEVBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxjQUFjLENBQUMsRUFBRSxDQUFDO1lBQ3RFLE1BQU0sSUFBSSxLQUFLLENBQ2IsNERBQTREO2dC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QVEsQ0FBQztBQUN6QixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50IH0gZnJvbSBcIi4uL2NvbXBvbmVudFwiO1xuaW1wb3J0IHsgRGVwZW5kZW5jeVR5cGUgfSBmcm9tIFwiLi4vZGVwZW5kZW5jaWVzXCI7XG5pbXBvcnQge1xuICBHaXRodWJDcmVkZW50aWFscyxcbiAgR2l0SHViLFxuICBHaXRodWJXb3JrZmxvdyxcbiAgR2l0SWRlbnRpdHksXG4gIHdvcmtmbG93cyxcbiAgV29ya2Zsb3dKb2JzLFxuICBXb3JrZmxvd1N0ZXBzLFxufSBmcm9tIFwiLi4vZ2l0aHViXCI7XG5pbXBvcnQgeyBERUZBVUxUX0dJVEhVQl9BQ1RJT05TX1VTRVIgfSBmcm9tIFwiLi4vZ2l0aHViL2NvbnN0YW50c1wiO1xuaW1wb3J0IHsgV29ya2Zsb3dBY3Rpb25zIH0gZnJvbSBcIi4uL2dpdGh1Yi93b3JrZmxvdy1hY3Rpb25zXCI7XG5pbXBvcnQge1xuICBDb250YWluZXJPcHRpb25zLFxuICBKb2JTdGVwLFxuICBKb2JQZXJtaXNzaW9uLFxuICBKb2JQZXJtaXNzaW9ucyxcbn0gZnJvbSBcIi4uL2dpdGh1Yi93b3JrZmxvd3MtbW9kZWxcIjtcbmltcG9ydCB7IE5vZGVQYWNrYWdlTWFuYWdlciwgTm9kZVByb2plY3QgfSBmcm9tIFwiLi4vamF2YXNjcmlwdFwiO1xuaW1wb3J0IHsgUmVsZWFzZSB9IGZyb20gXCIuLi9yZWxlYXNlXCI7XG5pbXBvcnQgeyBHcm91cFJ1bm5lck9wdGlvbnMsIGZpbHRlcmVkUnVuc09uT3B0aW9ucyB9IGZyb20gXCIuLi9ydW5uZXItb3B0aW9uc1wiO1xuaW1wb3J0IHsgVGFzayB9IGZyb20gXCIuLi90YXNrXCI7XG5pbXBvcnQgeyBUYXNrU3RlcCB9IGZyb20gXCIuLi90YXNrLW1vZGVsXCI7XG5pbXBvcnQgeyBpc1lhcm5DbGFzc2ljLCBpc1lhcm5CZXJyeSwgaXNOcG0gfSBmcm9tIFwiLi91dGlsXCI7XG5cbmNvbnN0IENSRUFURV9QQVRDSF9TVEVQX0lEID0gXCJjcmVhdGVfcGF0Y2hcIjtcbmNvbnN0IFBBVENIX0NSRUFURURfT1VUUFVUID0gXCJwYXRjaF9jcmVhdGVkXCI7XG5cbi8qKlxuICogT3B0aW9ucyBmb3IgYFVwZ3JhZGVEZXBlbmRlbmNpZXNgLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFVwZ3JhZGVEZXBlbmRlbmNpZXNPcHRpb25zIHtcbiAgLyoqXG4gICAqIExpc3Qgb2YgcGFja2FnZSBuYW1lcyB0byBleGNsdWRlIGR1cmluZyB0aGUgdXBncmFkZS5cbiAgICpcbiAgICogQGRlZmF1bHQgLSBOb3RoaW5nIGlzIGV4Y2x1ZGVkLlxuICAgKi9cbiAgcmVhZG9ubHkgZXhjbHVkZT86IHN0cmluZ1tdO1xuXG4gIC8qKlxuICAgKiBMaXN0IG9mIHBhY2thZ2UgbmFtZXMgdG8gaW5jbHVkZSBkdXJpbmcgdGhlIHVwZ3JhZGUuXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gRXZlcnl0aGluZyBpcyBpbmNsdWRlZC5cbiAgICovXG4gIHJlYWRvbmx5IGluY2x1ZGU/OiBzdHJpbmdbXTtcblxuICAvKipcbiAgICogRGV0ZXJtaW5lcyB0aGUgdGFyZ2V0IHZlcnNpb24gdG8gdXBncmFkZSBkZXBlbmRlbmNpZXMgdG8uXG4gICAqXG4gICAqIEBzZWUgaHR0cHM6Ly9naXRodWIuY29tL3JhaW5lb3JzaGluZS9ucG0tY2hlY2stdXBkYXRlcyN0YXJnZXRcbiAgICpcbiAgICogQGRlZmF1bHQgXCJtaW5vclwiXG4gICAqL1xuICByZWFkb25seSB0YXJnZXQ/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIENoZWNrIHBlZXIgZGVwZW5kZW5jaWVzIG9mIGluc3RhbGxlZCBwYWNrYWdlcyBhbmQgZmlsdGVyIHVwZGF0ZXMgdG8gY29tcGF0aWJsZSB2ZXJzaW9ucy5cbiAgICpcbiAgICogQnkgZGVmYXVsdCwgdGhlIHVwZ3JhZGUgd29ya2Zsb3cgd2lsbCBhZGhlcmUgdG8gdmVyc2lvbiBjb25zdHJhaW50cyBmcm9tIHBlZXIgZGVwZW5kZW5jaWVzLlxuICAgKiBTb21ldGltZXMgdGhpcyBpcyBub3QgZGVzaXJhYmxlIGFuZCBjYW4gYmUgZGlzYWJsZWQuXG4gICAqXG4gICAqIEBzZWUgaHR0cHM6Ly9naXRodWIuY29tL3JhaW5lb3JzaGluZS9ucG0tY2hlY2stdXBkYXRlcyNwZWVyXG4gICAqXG4gICAqIEBkZWZhdWx0IHRydWVcbiAgICovXG4gIHJlYWRvbmx5IHNhdGlzZnlQZWVyRGVwZW5kZW5jaWVzPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogSW5jbHVkZSBkZXByZWNhdGVkIHBhY2thZ2VzLlxuICAgKlxuICAgKiBCeSBkZWZhdWx0LCBkZXByZWNhdGVkIHZlcnNpb25zIHdpbGwgYmUgZXhjbHVkZWQgZnJvbSB1cGdyYWRlcy5cbiAgICpcbiAgICogQHNlZSBodHRwczovL2dpdGh1Yi5jb20vcmFpbmVvcnNoaW5lL25wbS1jaGVjay11cGRhdGVzP3RhYj1yZWFkbWUtb3YtZmlsZSNvcHRpb25zXG4gICAqXG4gICAqIEBkZWZhdWx0IGZhbHNlXG4gICAqL1xuICByZWFkb25seSBpbmNsdWRlRGVwcmVjYXRlZFZlcnNpb25zPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogSW5jbHVkZSBhIGdpdGh1YiB3b3JrZmxvdyBmb3IgY3JlYXRpbmcgUFIncyB0aGF0IHVwZ3JhZGVzIHRoZVxuICAgKiByZXF1aXJlZCBkZXBlbmRlbmNpZXMsIGVpdGhlciBieSBtYW51YWwgZGlzcGF0Y2gsIG9yIGJ5IGEgc2NoZWR1bGUuXG4gICAqXG4gICAqIElmIHRoaXMgaXMgYGZhbHNlYCwgb25seSBhIGxvY2FsIHByb2plbiB0YXNrIGlzIGNyZWF0ZWQsIHdoaWNoIGNhbiBiZSBleGVjdXRlZCBtYW51YWxseSB0b1xuICAgKiB1cGdyYWRlIHRoZSBkZXBlbmRlbmNpZXMuXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gdHJ1ZSBmb3Igcm9vdCBwcm9qZWN0cywgZmFsc2UgZm9yIHN1YnByb2plY3RzLlxuICAgKi9cbiAgcmVhZG9ubHkgd29ya2Zsb3c/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBPcHRpb25zIGZvciB0aGUgZ2l0aHViIHdvcmtmbG93LiBPbmx5IGFwcGxpZXMgaWYgYHdvcmtmbG93YCBpcyB0cnVlLlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIGRlZmF1bHQgb3B0aW9ucy5cbiAgICovXG4gIHJlYWRvbmx5IHdvcmtmbG93T3B0aW9ucz86IFVwZ3JhZGVEZXBlbmRlbmNpZXNXb3JrZmxvd09wdGlvbnM7XG5cbiAgLyoqXG4gICAqIFRoZSBuYW1lIG9mIHRoZSB0YXNrIHRoYXQgd2lsbCBiZSBjcmVhdGVkLlxuICAgKiBUaGlzIHdpbGwgYWxzbyBiZSB0aGUgd29ya2Zsb3cgbmFtZS5cbiAgICpcbiAgICogQGRlZmF1bHQgXCJ1cGdyYWRlXCIuXG4gICAqL1xuICByZWFkb25seSB0YXNrTmFtZT86IHN0cmluZztcblxuICAvKipcbiAgICogVGl0bGUgb2YgdGhlIHB1bGwgcmVxdWVzdCB0byB1c2UgKHNob3VsZCBiZSBhbGwgbG93ZXItY2FzZSkuXG4gICAqXG4gICAqIEBkZWZhdWx0IFwidXBncmFkZSBkZXBlbmRlbmNpZXNcIlxuICAgKi9cbiAgcmVhZG9ubHkgcHVsbFJlcXVlc3RUaXRsZT86IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIHNlbWFudGljIGNvbW1pdCB0eXBlLlxuICAgKlxuICAgKiBAZGVmYXVsdCAnY2hvcmUnXG4gICAqL1xuICByZWFkb25seSBzZW1hbnRpY0NvbW1pdD86IHN0cmluZztcblxuICAvKipcbiAgICogQWRkIFNpZ25lZC1vZmYtYnkgbGluZSBieSB0aGUgY29tbWl0dGVyIGF0IHRoZSBlbmQgb2YgdGhlIGNvbW1pdCBsb2cgbWVzc2FnZS5cbiAgICpcbiAgICogQGRlZmF1bHQgdHJ1ZVxuICAgKi9cbiAgcmVhZG9ubHkgc2lnbm9mZj86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFNwZWNpZnkgd2hpY2ggZGVwZW5kZW5jeSB0eXBlcyB0aGUgdXBncmFkZSBzaG91bGQgb3BlcmF0ZSBvbi5cbiAgICpcbiAgICogQGRlZmF1bHQgLSBBbGwgZGVwZW5kZW5jeSB0eXBlcy5cbiAgICovXG4gIHJlYWRvbmx5IHR5cGVzPzogRGVwZW5kZW5jeVR5cGVbXTtcblxuICAvKipcbiAgICogRXhjbHVkZSBwYWNrYWdlIHZlcnNpb25zIHB1Ymxpc2hlZCB3aXRoaW4gdGhlIHNwZWNpZmllZCBudW1iZXIgb2YgZGF5cy5cbiAgICpcbiAgICogVGhpcyBtYXkgcHJvdmlkZSBzb21lIHByb3RlY3Rpb24gYWdhaW5zdCBzdXBwbHkgY2hhaW4gYXR0YWNrcywgc2ltcGx5IGJ5IGF2b2lkaW5nXG4gICAqIG5ld2x5IHB1Ymxpc2hlZCBwYWNrYWdlcyB0aGF0IG1heSBiZSBtYWxpY2lvdXMuIEl0IGdpdmVzIHRoZSBlY29zeXN0ZW0gbW9yZSB0aW1lXG4gICAqIHRvIGRldGVjdCBtYWxpY2lvdXMgcGFja2FnZXMuIEhvd2V2ZXIgaXQgY29tZXMgYXQgdGhlIGNvc3Qgb2YgdXBkYXRpbmcgb3RoZXJcbiAgICogcGFja2FnZXMgc2xvd2VyLCB3aGljaCBtaWdodCBhbHNvIGNvbnRhaW4gdnVsbmVyYWJpbGl0aWVzIG9yIGJ1Z3MgaW4gbmVlZCBvZiBhIGZpeC5cbiAgICpcbiAgICogVGhlIGNvb2xkb3duIHBlcmlvZCBhcHBsaWVzIHRvIGJvdGggbnBtLWNoZWNrLXVwZGF0ZXMgZGlzY292ZXJ5XG4gICAqIGFuZCB0aGUgcGFja2FnZSBtYW5hZ2VyIHVwZGF0ZSBjb21tYW5kLlxuICAgKlxuICAgKiBAc2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9yYWluZW9yc2hpbmUvbnBtLWNoZWNrLXVwZGF0ZXMjY29vbGRvd25cbiAgICogQHNlZSBodHRwczovL2RvY3MubnBtanMuY29tL2NsaS92MTEvY29tbWFuZHMvbnBtLXVwZGF0ZSNiZWZvcmVcbiAgICogQHNlZSBodHRwczovL3BucG0uaW8vc2V0dGluZ3MjbWluaW11bXJlbGVhc2VhZ2VcbiAgICogQHNlZSBodHRwczovL2J1bi5jb20vZG9jcy9wbS9jbGkvaW5zdGFsbCNtaW5pbXVtLXJlbGVhc2UtYWdlXG4gICAqIEBzZWUgaHR0cHM6Ly95YXJucGtnLmNvbS9jb25maWd1cmF0aW9uL3lhcm5yYyNucG1NaW5pbWFsQWdlR2F0ZVxuICAgKlxuICAgKiBAZGVmYXVsdCAtIE5vIGNvb2xkb3duIHBlcmlvZC5cbiAgICovXG4gIHJlYWRvbmx5IGNvb2xkb3duPzogbnVtYmVyO1xufVxuXG4vKipcbiAqIFVwZ3JhZGUgbm9kZSBwcm9qZWN0IGRlcGVuZGVuY2llcy5cbiAqL1xuZXhwb3J0IGNsYXNzIFVwZ3JhZGVEZXBlbmRlbmNpZXMgZXh0ZW5kcyBDb21wb25lbnQge1xuICAvKipcbiAgICogVGhlIHdvcmtmbG93cyB0aGF0IGV4ZWN1dGUgdGhlIHVwZ3JhZGVzLiBPbmUgd29ya2Zsb3cgcGVyIGJyYW5jaC5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSB3b3JrZmxvd3M6IEdpdGh1YldvcmtmbG93W10gPSBbXTtcblxuICBwdWJsaWMgcmVhZG9ubHkgcHJvamVjdDogTm9kZVByb2plY3Q7XG5cbiAgcHJpdmF0ZSByZWFkb25seSBvcHRpb25zOiBVcGdyYWRlRGVwZW5kZW5jaWVzT3B0aW9ucztcbiAgcHJpdmF0ZSByZWFkb25seSBwdWxsUmVxdWVzdFRpdGxlOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIENvbnRhaW5lciBkZWZpbml0aW9ucyBmb3IgdGhlIHVwZ3JhZGUgd29ya2Zsb3cuXG4gICAqL1xuICBwdWJsaWMgY29udGFpbmVyT3B0aW9ucz86IENvbnRhaW5lck9wdGlvbnM7XG5cbiAgLyoqXG4gICAqIFRoZSB1cGdyYWRlIHRhc2suXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgdXBncmFkZVRhc2s6IFRhc2s7XG5cbiAgLyoqXG4gICAqIEEgdGFzayBydW4gYWZ0ZXIgdGhlIHVwZ3JhZGUgdGFzay5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBwb3N0VXBncmFkZVRhc2s6IFRhc2s7XG5cbiAgcHJpdmF0ZSByZWFkb25seSBnaXRJZGVudGl0eTogR2l0SWRlbnRpdHk7XG4gIHByaXZhdGUgcmVhZG9ubHkgcG9zdEJ1aWxkU3RlcHM6IEpvYlN0ZXBbXTtcbiAgcHJpdmF0ZSByZWFkb25seSBwZXJtaXNzaW9uczogSm9iUGVybWlzc2lvbnM7XG4gIHByaXZhdGUgcmVhZG9ubHkgZGVwVHlwZXM6IERlcGVuZGVuY3lUeXBlW107XG4gIHByaXZhdGUgcmVhZG9ubHkgdXBncmFkZVRhcmdldDogc3RyaW5nO1xuICBwcml2YXRlIHJlYWRvbmx5IHNhdGlzZnlQZWVyRGVwZW5kZW5jaWVzOiBib29sZWFuO1xuICBwcml2YXRlIHJlYWRvbmx5IGluY2x1ZGVEZXByZWNhdGVkVmVyc2lvbnM6IGJvb2xlYW47XG5cbiAgY29uc3RydWN0b3IocHJvamVjdDogTm9kZVByb2plY3QsIG9wdGlvbnM6IFVwZ3JhZGVEZXBlbmRlbmNpZXNPcHRpb25zID0ge30pIHtcbiAgICBzdXBlcihwcm9qZWN0KTtcblxuICAgIHRoaXMucHJvamVjdCA9IHByb2plY3Q7XG4gICAgdGhpcy5vcHRpb25zID0gb3B0aW9ucztcblxuICAgIC8vIFZhbGlkYXRlIGNvb2xkb3duXG4gICAgaWYgKFxuICAgICAgb3B0aW9ucy5jb29sZG93biAhPT0gdW5kZWZpbmVkICYmXG4gICAgICAoIU51bWJlci5pc0ludGVnZXIob3B0aW9ucy5jb29sZG93bikgfHwgb3B0aW9ucy5jb29sZG93biA8IDApXG4gICAgKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIFwiVGhlICdjb29sZG93bicgb3B0aW9uIG11c3QgYmUgYSBub24tbmVnYXRpdmUgaW50ZWdlciByZXByZXNlbnRpbmcgZGF5c1wiXG4gICAgICApO1xuICAgIH1cblxuICAgIC8vIFlhcm4gY2xhc3NpYyBkb2Vzbid0IHN1cHBvcnQgY29vbGRvd25cbiAgICBpZiAob3B0aW9ucy5jb29sZG93biAmJiBpc1lhcm5DbGFzc2ljKHByb2plY3QucGFja2FnZS5wYWNrYWdlTWFuYWdlcikpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgXCJUaGUgJ2Nvb2xkb3duJyBvcHRpb24gaXMgbm90IHN1cHBvcnRlZCB3aXRoIHlhcm4gY2xhc3NpYy4gXCIgK1xuICAgICAgICAgIFwiQ29uc2lkZXIgdXNpbmcgbnBtLCBwbnBtLCBidW4sIG9yIHlhcm4gYmVycnkgaW5zdGVhZC5cIlxuICAgICAgKTtcbiAgICB9XG5cbiAgICB0aGlzLmRlcFR5cGVzID0gdGhpcy5vcHRpb25zLnR5cGVzID8/IFtcbiAgICAgIERlcGVuZGVuY3lUeXBlLkJVSUxELFxuICAgICAgRGVwZW5kZW5jeVR5cGUuQlVORExFRCxcbiAgICAgIERlcGVuZGVuY3lUeXBlLkRFVkVOVixcbiAgICAgIERlcGVuZGVuY3lUeXBlLlBFRVIsXG4gICAgICBEZXBlbmRlbmN5VHlwZS5SVU5USU1FLFxuICAgICAgRGVwZW5kZW5jeVR5cGUuVEVTVCxcbiAgICAgIERlcGVuZGVuY3lUeXBlLk9QVElPTkFMLFxuICAgIF07XG4gICAgdGhpcy51cGdyYWRlVGFyZ2V0ID0gdGhpcy5vcHRpb25zLnRhcmdldCA/PyBcIm1pbm9yXCI7XG4gICAgdGhpcy5zYXRpc2Z5UGVlckRlcGVuZGVuY2llcyA9IHRoaXMub3B0aW9ucy5zYXRpc2Z5UGVlckRlcGVuZGVuY2llcyA/PyB0cnVlO1xuICAgIHRoaXMuaW5jbHVkZURlcHJlY2F0ZWRWZXJzaW9ucyA9XG4gICAgICB0aGlzLm9wdGlvbnMuaW5jbHVkZURlcHJlY2F0ZWRWZXJzaW9ucyA/PyBmYWxzZTtcbiAgICB0aGlzLnB1bGxSZXF1ZXN0VGl0bGUgPSBvcHRpb25zLnB1bGxSZXF1ZXN0VGl0bGUgPz8gXCJ1cGdyYWRlIGRlcGVuZGVuY2llc1wiO1xuICAgIHRoaXMuZ2l0SWRlbnRpdHkgPVxuICAgICAgb3B0aW9ucy53b3JrZmxvd09wdGlvbnM/LmdpdElkZW50aXR5ID8/IERFRkFVTFRfR0lUSFVCX0FDVElPTlNfVVNFUjtcbiAgICB0aGlzLnBlcm1pc3Npb25zID0ge1xuICAgICAgY29udGVudHM6IEpvYlBlcm1pc3Npb24uUkVBRCxcbiAgICAgIC4uLm9wdGlvbnMud29ya2Zsb3dPcHRpb25zPy5wZXJtaXNzaW9ucyxcbiAgICB9O1xuICAgIHRoaXMucG9zdEJ1aWxkU3RlcHMgPSBbXTtcbiAgICB0aGlzLmNvbnRhaW5lck9wdGlvbnMgPSBvcHRpb25zLndvcmtmbG93T3B0aW9ucz8uY29udGFpbmVyO1xuXG4gICAgdGhpcy5wb3N0VXBncmFkZVRhc2sgPVxuICAgICAgcHJvamVjdC50YXNrcy50cnlGaW5kKFwicG9zdC11cGdyYWRlXCIpID8/XG4gICAgICBwcm9qZWN0LnRhc2tzLmFkZFRhc2soXCJwb3N0LXVwZ3JhZGVcIiwge1xuICAgICAgICBkZXNjcmlwdGlvbjogXCJSdW5zIGFmdGVyIHVwZ3JhZGluZyBkZXBlbmRlbmNpZXNcIixcbiAgICAgIH0pO1xuXG4gICAgY29uc3QgdGFza0VudjogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHsgQ0k6IFwiMFwiIH07XG5cbiAgICAvLyBTZXQgeWFybiBiZXJyeSBjb29sZG93biB2aWEgZW52aXJvbm1lbnQgdmFyaWFibGUsIGV4cGVjdHMgbWludXRlc1xuICAgIGlmIChvcHRpb25zLmNvb2xkb3duICYmIGlzWWFybkJlcnJ5KHByb2plY3QucGFja2FnZS5wYWNrYWdlTWFuYWdlcikpIHtcbiAgICAgIHRhc2tFbnYuWUFSTl9OUE1fTUlOSU1BTF9BR0VfR0FURSA9IFN0cmluZyhcbiAgICAgICAgZGF5c1RvTWludXRlcyhvcHRpb25zLmNvb2xkb3duKVxuICAgICAgKTtcbiAgICB9XG5cbiAgICAvLyBTZXQgbnBtIGNvb2xkb3duIGRhdGUgdmlhIGVudmlyb25tZW50IHZhcmlhYmxlIChjYWxjdWxhdGVkIGF0IHJ1bnRpbWUpLCBleHBlY3RzIGEgZGF0ZSBpbiBJU08gZm9ybWF0XG4gICAgaWYgKG9wdGlvbnMuY29vbGRvd24gJiYgaXNOcG0ocHJvamVjdC5wYWNrYWdlLnBhY2thZ2VNYW5hZ2VyKSkge1xuICAgICAgdGFza0Vudi5OUE1fQ09ORklHX0JFRk9SRSA9IGAkKG5vZGUgLXAgXCJuZXcgRGF0ZShEYXRlLm5vdygpLSR7ZGF5c1RvTWlsbGlzZWNvbmRzKFxuICAgICAgICBvcHRpb25zLmNvb2xkb3duXG4gICAgICApfSkudG9JU09TdHJpbmcoKVwiKWA7XG4gICAgfVxuXG4gICAgdGhpcy51cGdyYWRlVGFzayA9IHByb2plY3QuYWRkVGFzayhvcHRpb25zLnRhc2tOYW1lID8/IFwidXBncmFkZVwiLCB7XG4gICAgICAvLyB0aGlzIHRhc2sgc2hvdWxkIG5vdCBydW4gaW4gQ0kgbW9kZSBiZWNhdXNlIGl0cyBkZXNpZ25lZCB0b1xuICAgICAgLy8gdXBkYXRlIHBhY2thZ2UuanNvbiBhbmQgbG9jayBmaWxlcy5cbiAgICAgIGVudjogdGFza0VudixcbiAgICAgIGRlc2NyaXB0aW9uOiB0aGlzLnB1bGxSZXF1ZXN0VGl0bGUsXG4gICAgICBzdGVwczogeyB0b0pTT046ICgpID0+IHRoaXMucmVuZGVyVGFza1N0ZXBzKCkgfSBhcyBhbnksXG4gICAgfSk7XG4gICAgdGhpcy51cGdyYWRlVGFzay5sb2NrKCk7IC8vIHRoaXMgdGFzayBpcyBhIGxhenkgdmFsdWUsIHNvIG1ha2UgaXQgcmVhZG9ubHlcblxuICAgIGlmICh0aGlzLnVwZ3JhZGVUYXNrICYmIHByb2plY3QuZ2l0aHViICYmIChvcHRpb25zLndvcmtmbG93ID8/IHRydWUpKSB7XG4gICAgICBpZiAob3B0aW9ucy53b3JrZmxvd09wdGlvbnM/LmJyYW5jaGVzKSB7XG4gICAgICAgIGZvciAoY29uc3QgYnJhbmNoIG9mIG9wdGlvbnMud29ya2Zsb3dPcHRpb25zLmJyYW5jaGVzKSB7XG4gICAgICAgICAgdGhpcy53b3JrZmxvd3MucHVzaChcbiAgICAgICAgICAgIHRoaXMuY3JlYXRlV29ya2Zsb3codGhpcy51cGdyYWRlVGFzaywgcHJvamVjdC5naXRodWIsIGJyYW5jaClcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKFJlbGVhc2Uub2YocHJvamVjdCkpIHtcbiAgICAgICAgY29uc3QgcmVsZWFzZSA9IFJlbGVhc2Uub2YocHJvamVjdCkhO1xuICAgICAgICByZWxlYXNlLl9mb3JFYWNoQnJhbmNoKChicmFuY2g6IHN0cmluZykgPT4ge1xuICAgICAgICAgIHRoaXMud29ya2Zsb3dzLnB1c2goXG4gICAgICAgICAgICB0aGlzLmNyZWF0ZVdvcmtmbG93KHRoaXMudXBncmFkZVRhc2ssIHByb2plY3QuZ2l0aHViISwgYnJhbmNoKVxuICAgICAgICAgICk7XG4gICAgICAgIH0pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gcmVwcmVzZW50cyB0aGUgZGVmYXVsdCByZXBvc2l0b3J5IGJyYW5jaC5cbiAgICAgICAgLy8ganVzdCBsaWtlIG5vdCBzcGVjaWZ5aW5nIGFueXRoaW5nLlxuICAgICAgICBjb25zdCBkZWZhdWx0QnJhbmNoID0gdW5kZWZpbmVkO1xuICAgICAgICB0aGlzLndvcmtmbG93cy5wdXNoKFxuICAgICAgICAgIHRoaXMuY3JlYXRlV29ya2Zsb3codGhpcy51cGdyYWRlVGFzaywgcHJvamVjdC5naXRodWIsIGRlZmF1bHRCcmFuY2gpXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEFkZCBzdGVwcyB0byBleGVjdXRlIGEgc3VjY2Vzc2Z1bCBidWlsZC5cbiAgICogQHBhcmFtIHN0ZXBzIHdvcmtmbG93IHN0ZXBzXG4gICAqL1xuICBwdWJsaWMgYWRkUG9zdEJ1aWxkU3RlcHMoLi4uc3RlcHM6IEpvYlN0ZXBbXSkge1xuICAgIHRoaXMucG9zdEJ1aWxkU3RlcHMucHVzaCguLi5zdGVwcyk7XG4gIH1cblxuICBwcml2YXRlIHJlbmRlclRhc2tTdGVwcygpOiBUYXNrU3RlcFtdIHtcbiAgICBjb25zdCBzdGVwcyA9IG5ldyBBcnJheTxUYXNrU3RlcD4oKTtcblxuICAgIC8vIFBhY2thZ2UgTWFuYWdlciB1cGdyYWRlIHNob3VsZCBhbHdheXMgaW5jbHVkZSBhbGwgZGVwc1xuICAgIGNvbnN0IGluY2x1ZGVGb3JQYWNrYWdlTWFuYWdlclVwZ3JhZGUgPSB0aGlzLmJ1aWxkRGVwZW5kZW5jeUxpc3QodHJ1ZSk7XG4gICAgaWYgKGluY2x1ZGVGb3JQYWNrYWdlTWFuYWdlclVwZ3JhZGUubGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm4gW3sgZXhlYzogXCJlY2hvIE5vIGRlcGVuZGVuY2llcyB0byB1cGdyYWRlLlwiIH1dO1xuICAgIH1cblxuICAgIC8vIFJlbW92aW5nIGBucG0tY2hlY2stdXBkYXRlc2AgZnJvbSBvdXIgZGVwZW5kZW5jeSB0cmVlIGJlY2F1c2UgaXQgZGVwZW5kcyBvbiBhIHBhY2thZ2VcbiAgICAvLyB0aGF0IHVzZXMgYW4gbnBtLXNwZWNpZmljIGZlYXR1cmUgdGhhdCBjYXVzZXMgYW4gaW52YWxpZCBkZXBlbmRlbmN5IHRyZWUgd2hlbiB1c2luZyBZYXJuIDEuXG4gICAgLy8gU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9wcm9qZW4vcHJvamVuL3B1bGwvMzEzNiBmb3IgbW9yZSBkZXRhaWxzLlxuICAgIGNvbnN0IGluY2x1ZGVGb3JOY3UgPSB0aGlzLmJ1aWxkRGVwZW5kZW5jeUxpc3QoZmFsc2UpO1xuXG4gICAgLy8gYnVtcCB2ZXJzaW9ucyBpbiBwYWNrYWdlLmpzb25cbiAgICBpZiAoaW5jbHVkZUZvck5jdS5sZW5ndGgpIHtcbiAgICAgIGNvbnN0IG5jdUNvbW1hbmQgPSB0aGlzLmJ1aWxkTmN1Q29tbWFuZChpbmNsdWRlRm9yTmN1LCB7XG4gICAgICAgIHVwZ3JhZGU6IHRydWUsXG4gICAgICAgIHRhcmdldDogdGhpcy51cGdyYWRlVGFyZ2V0LFxuICAgICAgfSk7XG4gICAgICBzdGVwcy5wdXNoKHsgZXhlYzogbmN1Q29tbWFuZCB9KTtcbiAgICB9XG5cbiAgICAvLyBydW4gXCJ5YXJuL25wbSBpbnN0YWxsXCIgdG8gdXBkYXRlIHRoZSBsb2NrZmlsZSBhbmQgaW5zdGFsbCBhbnkgZGVwcyAoc3VjaCBhcyBwcm9qZW4pXG4gICAgc3RlcHMucHVzaCh7IGV4ZWM6IHRoaXMucHJvamVjdC5wYWNrYWdlLmluc3RhbGxBbmRVcGRhdGVMb2NrZmlsZUNvbW1hbmQgfSk7XG5cbiAgICAvLyBydW4gdXBncmFkZSBjb21tYW5kIHRvIHVwZ3JhZGUgdHJhbnNpdGl2ZSBkZXBzIGFzIHdlbGxcbiAgICBzdGVwcy5wdXNoKHtcbiAgICAgIGV4ZWM6IHRoaXMucmVuZGVyVXBncmFkZVBhY2thZ2VzQ29tbWFuZChpbmNsdWRlRm9yUGFja2FnZU1hbmFnZXJVcGdyYWRlKSxcbiAgICB9KTtcblxuICAgIC8vIHJ1biBcInByb2plblwiIHRvIGdpdmUgcHJvamVuIGEgY2hhbmNlIHRvIHVwZGF0ZSBkZXBlbmRlbmNpZXMgKGl0IHdpbGwgYWxzbyBydW4gXCJ5YXJuIGluc3RhbGxcIilcbiAgICBzdGVwcy5wdXNoKHsgZXhlYzogdGhpcy5wcm9qZWN0LnByb2plbkNvbW1hbmQgfSk7XG4gICAgc3RlcHMucHVzaCh7IHNwYXduOiB0aGlzLnBvc3RVcGdyYWRlVGFzay5uYW1lIH0pO1xuXG4gICAgcmV0dXJuIHN0ZXBzO1xuICB9XG5cbiAgLyoqXG4gICAqIEJ1aWxkIG5wbS1jaGVjay11cGRhdGVzIGNvbW1hbmQgd2l0aCBjb21tb24gb3B0aW9ucy5cbiAgICovXG4gIHByaXZhdGUgYnVpbGROY3VDb21tYW5kKFxuICAgIGluY2x1ZGVQYWNrYWdlczogc3RyaW5nW10sXG4gICAgb3B0aW9uczoge1xuICAgICAgdXBncmFkZT86IGJvb2xlYW47XG4gICAgICB0YXJnZXQ/OiBzdHJpbmc7XG4gICAgICBmb3JtYXQ/OiBzdHJpbmc7XG4gICAgICByZW1vdmVSYW5nZT86IGJvb2xlYW47XG4gICAgfSA9IHt9XG4gICk6IHN0cmluZyB7XG4gICAgZnVuY3Rpb24gZXhlY3V0ZUNvbW1hbmQocGFja2FnZU1hbmFnZXI6IE5vZGVQYWNrYWdlTWFuYWdlcik6IHN0cmluZyB7XG4gICAgICBzd2l0Y2ggKHBhY2thZ2VNYW5hZ2VyKSB7XG4gICAgICAgIGNhc2UgTm9kZVBhY2thZ2VNYW5hZ2VyLk5QTTpcbiAgICAgICAgY2FzZSBOb2RlUGFja2FnZU1hbmFnZXIuWUFSTjpcbiAgICAgICAgY2FzZSBOb2RlUGFja2FnZU1hbmFnZXIuWUFSTl9DTEFTU0lDOlxuICAgICAgICAgIHJldHVybiBcIm5weFwiO1xuICAgICAgICBjYXNlIE5vZGVQYWNrYWdlTWFuYWdlci5QTlBNOlxuICAgICAgICAgIHJldHVybiBcInBucG0gZGx4XCI7XG4gICAgICAgIGNhc2UgTm9kZVBhY2thZ2VNYW5hZ2VyLllBUk4yOlxuICAgICAgICBjYXNlIE5vZGVQYWNrYWdlTWFuYWdlci5ZQVJOX0JFUlJZOlxuICAgICAgICAgIHJldHVybiBcInlhcm4gZGx4XCI7XG4gICAgICAgIGNhc2UgTm9kZVBhY2thZ2VNYW5hZ2VyLkJVTjpcbiAgICAgICAgICByZXR1cm4gXCJidW54XCI7XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3QgY29tbWFuZCA9IFtcbiAgICAgIGAke2V4ZWN1dGVDb21tYW5kKFxuICAgICAgICB0aGlzLnByb2plY3QucGFja2FnZS5wYWNrYWdlTWFuYWdlclxuICAgICAgKX0gbnBtLWNoZWNrLXVwZGF0ZXNAMThgLFxuICAgIF07XG5cbiAgICBpZiAob3B0aW9ucy51cGdyYWRlKSB7XG4gICAgICBjb21tYW5kLnB1c2goXCItLXVwZ3JhZGVcIik7XG4gICAgfVxuICAgIGlmIChvcHRpb25zLnRhcmdldCkge1xuICAgICAgY29tbWFuZC5wdXNoKGAtLXRhcmdldD0ke29wdGlvbnMudGFyZ2V0fWApO1xuICAgIH1cbiAgICBpZiAob3B0aW9ucy5mb3JtYXQpIHtcbiAgICAgIGNvbW1hbmQucHVzaChgLS1mb3JtYXQ9JHtvcHRpb25zLmZvcm1hdH1gKTtcbiAgICB9XG4gICAgaWYgKG9wdGlvbnMucmVtb3ZlUmFuZ2UpIHtcbiAgICAgIGNvbW1hbmQucHVzaChcIi0tcmVtb3ZlUmFuZ2VcIik7XG4gICAgfVxuICAgIGlmICh0aGlzLm9wdGlvbnMuY29vbGRvd24pIHtcbiAgICAgIGNvbW1hbmQucHVzaChgLS1jb29sZG93bj0ke3RoaXMub3B0aW9ucy5jb29sZG93bn1gKTtcbiAgICB9XG5cbiAgICBjb21tYW5kLnB1c2goYC0tJHt0aGlzLnNhdGlzZnlQZWVyRGVwZW5kZW5jaWVzID8gXCJwZWVyXCIgOiBcIm5vLXBlZXJcIn1gKTtcbiAgICBjb21tYW5kLnB1c2goXG4gICAgICBgLS0ke3RoaXMuaW5jbHVkZURlcHJlY2F0ZWRWZXJzaW9ucyA/IFwiZGVwcmVjYXRlZFwiIDogXCJuby1kZXByZWNhdGVkXCJ9YFxuICAgICk7XG4gICAgY29tbWFuZC5wdXNoKGAtLWRlcD0ke3RoaXMucmVuZGVyTmN1RGVwZW5kZW5jeVR5cGVzKHRoaXMuZGVwVHlwZXMpfWApO1xuICAgIGNvbW1hbmQucHVzaChgLS1maWx0ZXI9JHtpbmNsdWRlUGFja2FnZXMuam9pbihcIixcIil9YCk7XG5cbiAgICByZXR1cm4gY29tbWFuZC5qb2luKFwiIFwiKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZW5kZXIgcHJvamVuIGRlcGVuZGVuY2llcyB0eXBlcyB0byBhIGxpc3Qgb2YgbmN1IGNvbXBhdGlibGUgdHlwZXNcbiAgICovXG4gIHByaXZhdGUgcmVuZGVyTmN1RGVwZW5kZW5jeVR5cGVzKHR5cGVzOiBEZXBlbmRlbmN5VHlwZVtdKSB7XG4gICAgcmV0dXJuIEFycmF5LmZyb20oXG4gICAgICBuZXcgU2V0KFxuICAgICAgICB0eXBlc1xuICAgICAgICAgIC5tYXAoKHR5cGUpID0+IHtcbiAgICAgICAgICAgIHN3aXRjaCAodHlwZSkge1xuICAgICAgICAgICAgICBjYXNlIERlcGVuZGVuY3lUeXBlLlBFRVI6XG4gICAgICAgICAgICAgICAgcmV0dXJuIFwicGVlclwiO1xuICAgICAgICAgICAgICBjYXNlIERlcGVuZGVuY3lUeXBlLlJVTlRJTUU6XG4gICAgICAgICAgICAgICAgcmV0dXJuIFwicHJvZFwiO1xuICAgICAgICAgICAgICBjYXNlIERlcGVuZGVuY3lUeXBlLk9QVElPTkFMOlxuICAgICAgICAgICAgICAgIHJldHVybiBcIm9wdGlvbmFsXCI7XG5cbiAgICAgICAgICAgICAgY2FzZSBEZXBlbmRlbmN5VHlwZS5URVNUOlxuICAgICAgICAgICAgICBjYXNlIERlcGVuZGVuY3lUeXBlLkRFVkVOVjpcbiAgICAgICAgICAgICAgY2FzZSBEZXBlbmRlbmN5VHlwZS5CVUlMRDpcbiAgICAgICAgICAgICAgICByZXR1cm4gXCJkZXZcIjtcblxuICAgICAgICAgICAgICBjYXNlIERlcGVuZGVuY3lUeXBlLkJVTkRMRUQ6XG4gICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pXG4gICAgICAgICAgLmZpbHRlcigodHlwZSkgPT4gQm9vbGVhbih0eXBlKSlcbiAgICAgIClcbiAgICApLmpvaW4oXCIsXCIpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlbmRlciBhIHBhY2thZ2UgbWFuYWdlciBzcGVjaWZpYyBjb21tYW5kIHRvIHVwZ3JhZGUgYWxsIHJlcXVlc3RlZCBkZXBlbmRlbmNpZXMuXG4gICAqL1xuICBwcml2YXRlIHJlbmRlclVwZ3JhZGVQYWNrYWdlc0NvbW1hbmQoaW5jbHVkZTogc3RyaW5nW10pOiBzdHJpbmcge1xuICAgIGZ1bmN0aW9uIHVwZ3JhZGVQYWNrYWdlcyhjb21tYW5kOiBzdHJpbmcsIGNvb2xkb3duRmxhZz86IHN0cmluZykge1xuICAgICAgcmV0dXJuICgpID0+IHtcbiAgICAgICAgY29uc3QgcGFydHMgPSBbY29tbWFuZCwgLi4uaW5jbHVkZV07XG4gICAgICAgIGlmIChjb29sZG93bkZsYWcpIHtcbiAgICAgICAgICBwYXJ0cy5wdXNoKGNvb2xkb3duRmxhZyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHBhcnRzLmpvaW4oXCIgXCIpO1xuICAgICAgfTtcbiAgICB9XG5cbiAgICBjb25zdCBwYWNrYWdlTWFuYWdlciA9IHRoaXMucHJvamVjdC5wYWNrYWdlLnBhY2thZ2VNYW5hZ2VyO1xuICAgIGNvbnN0IGNvb2xkb3duID0gdGhpcy5vcHRpb25zLmNvb2xkb3duO1xuXG4gICAgbGV0IGxhenkgPSB1bmRlZmluZWQ7XG4gICAgc3dpdGNoIChwYWNrYWdlTWFuYWdlcikge1xuICAgICAgY2FzZSBOb2RlUGFja2FnZU1hbmFnZXIuWUFSTjpcbiAgICAgIGNhc2UgTm9kZVBhY2thZ2VNYW5hZ2VyLllBUk5fQ0xBU1NJQzpcbiAgICAgICAgbGF6eSA9IHVwZ3JhZGVQYWNrYWdlcyhcInlhcm4gdXBncmFkZVwiKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIE5vZGVQYWNrYWdlTWFuYWdlci5ZQVJOMjpcbiAgICAgIGNhc2UgTm9kZVBhY2thZ2VNYW5hZ2VyLllBUk5fQkVSUlk6XG4gICAgICAgIC8vIFlhcm4gQmVycnkgY29vbGRvd24gc2V0IHZpYSB0YXNrIGVudlxuICAgICAgICBsYXp5ID0gdXBncmFkZVBhY2thZ2VzKFwieWFybiB1cFwiKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIE5vZGVQYWNrYWdlTWFuYWdlci5OUE06XG4gICAgICAgIC8vIG5wbSBjb29sZG93biBzZXQgdmlhIE5QTV9DT05GSUdfQkVGT1JFIGVudlxuICAgICAgICBsYXp5ID0gdXBncmFkZVBhY2thZ2VzKFwibnBtIHVwZGF0ZVwiKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIE5vZGVQYWNrYWdlTWFuYWdlci5QTlBNOlxuICAgICAgICAvLyBwbnBtIGV4cGVjdHMgbWludXRlc1xuICAgICAgICBsYXp5ID0gdXBncmFkZVBhY2thZ2VzKFxuICAgICAgICAgIFwicG5wbSB1cGRhdGVcIixcbiAgICAgICAgICBjb29sZG93biAhPT0gdW5kZWZpbmVkXG4gICAgICAgICAgICA/IGAtLWNvbmZpZy5taW5pbXVtLXJlbGVhc2UtYWdlPSR7ZGF5c1RvTWludXRlcyhjb29sZG93bil9YFxuICAgICAgICAgICAgOiB1bmRlZmluZWRcbiAgICAgICAgKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIE5vZGVQYWNrYWdlTWFuYWdlci5CVU46XG4gICAgICAgIC8vIGJ1biBleHBlY3RzIHNlY29uZHNcbiAgICAgICAgbGF6eSA9IHVwZ3JhZGVQYWNrYWdlcyhcbiAgICAgICAgICBcImJ1biB1cGRhdGVcIixcbiAgICAgICAgICBjb29sZG93blxuICAgICAgICAgICAgPyBgLS1taW5pbXVtLXJlbGVhc2UtYWdlPSR7ZGF5c1RvU2Vjb25kcyhjb29sZG93bil9YFxuICAgICAgICAgICAgOiB1bmRlZmluZWRcbiAgICAgICAgKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYHVuZXhwZWN0ZWQgcGFja2FnZSBtYW5hZ2VyICR7cGFja2FnZU1hbmFnZXJ9YCk7XG4gICAgfVxuXG4gICAgLy8gcmV0dXJuIGEgbGF6eSBmdW5jdGlvbiBzbyB0aGF0IGRlcGVuZGVuY2llcyBpbmNsdWRlIG9uZXMgdGhhdCB3ZXJlXG4gICAgLy8gYWRkZWQgcG9zdCBwcm9qZWN0IGluc3RhbnRpYXRpb24gKGkuZSB1c2luZyBwcm9qZWN0LmFkZERlcHMpXG4gICAgcmV0dXJuIGxhenkgYXMgdW5rbm93biBhcyBzdHJpbmc7XG4gIH1cblxuICBwcml2YXRlIGJ1aWxkRGVwZW5kZW5jeUxpc3QoaW5jbHVkZURlcGVuZGVuY2llc1dpdGhDb25zdHJhaW50OiBib29sZWFuKSB7XG4gICAgcmV0dXJuIEFycmF5LmZyb20oXG4gICAgICBuZXcgU2V0KFxuICAgICAgICB0aGlzLm9wdGlvbnMuaW5jbHVkZSA/P1xuICAgICAgICAgIHRoaXMuZmlsdGVyRGVwZW5kZW5jaWVzKGluY2x1ZGVEZXBlbmRlbmNpZXNXaXRoQ29uc3RyYWludClcbiAgICAgIClcbiAgICApO1xuICB9XG5cbiAgcHJpdmF0ZSBmaWx0ZXJEZXBlbmRlbmNpZXMoaW5jbHVkZUNvbnN0cmFpbnQ6IGJvb2xlYW4pOiBzdHJpbmdbXSB7XG4gICAgY29uc3QgZGVwZW5kZW5jaWVzID0gW107XG5cbiAgICBjb25zdCBkZXBzID0gdGhpcy5wcm9qZWN0LmRlcHMuYWxsXG4gICAgICAvLyByZW1vdmUgdGhvc2UgdGhhdCBoYXZlIGEgY29uc3RyYWludCB2ZXJzaW9uICh1bmxlc3MgaW5jbHVkZUNvbnN0cmFpbnQgaXMgdHJ1ZSlcbiAgICAgIC5maWx0ZXIoXG4gICAgICAgIChkKSA9PlxuICAgICAgICAgIGluY2x1ZGVDb25zdHJhaW50IHx8IHRoaXMucGFja2FnZUNhbkJlVXBncmFkZWRJblBhY2thZ2VKc29uKGQudmVyc2lvbilcbiAgICAgIClcbiAgICAgIC8vIHJlbW92ZSBvdmVycmlkZSBkZXBlbmRlbmNpZXNcbiAgICAgIC5maWx0ZXIoKGQpID0+IGQudHlwZSAhPT0gRGVwZW5kZW5jeVR5cGUuT1ZFUlJJREUpO1xuXG4gICAgZm9yIChjb25zdCB0eXBlIG9mIHRoaXMuZGVwVHlwZXMpIHtcbiAgICAgIGRlcGVuZGVuY2llcy5wdXNoKFxuICAgICAgICAuLi5kZXBzXG4gICAgICAgICAgLmZpbHRlcigoZCkgPT4gZC50eXBlID09PSB0eXBlKVxuICAgICAgICAgIC5maWx0ZXIoKGQpID0+ICEodGhpcy5vcHRpb25zLmV4Y2x1ZGUgPz8gW10pLmluY2x1ZGVzKGQubmFtZSkpXG4gICAgICApO1xuICAgIH1cblxuICAgIHJldHVybiBkZXBlbmRlbmNpZXMubWFwKChkKSA9PiBkLm5hbWUpO1xuICB9XG5cbiAgLyoqXG4gICAqIFByb2plbiBjYW4gYWx0ZXIgYSBwYWNrYWdlJ3MgdmVyc2lvbiBpbiBwYWNrYWdlLmpzb24gd2hlbiBlaXRoZXIgdGhlIHZlcnNpb24gaXMgb21pdHRlZCwgb3Igc2V0IHRvIFwiKlwiLlxuICAgKiBPdGhlcndpc2UsIHRoZSBleGFjdCB2ZXJzaW9uIHNlbGVjdGVkIGlzIHBsYWNlZCBpbiB0aGUgcGFja2FnZS5qc29uIGZpbGUgYW5kIHVwZ3JhZGluZyBpcyBoYW5kbGVkIHRocm91Z2ggdGhlIHBhY2thZ2UgbWFuYWdlclxuICAgKiByYXRoZXIgdGhhbiBucG0tY2hlY2stdXBkYXRlcy5cbiAgICpcbiAgICogQHBhcmFtIHZlcnNpb24gc2VtdmVyIGZyb20gRGVwZW5kZW5jeUNvb3JkaW5hdGVzLnZlcnNpb24sIG1heSBiZSB1bmRlZmluZWRcbiAgICogQHJldHVybnMgd2hldGhlciB0aGUgdmVyc2lvbiBpcyB0aGUgZGVmYXVsdCB2ZXJzaW9uaW5nIGJlaGF2aW9yXG4gICAqL1xuICBwcml2YXRlIHBhY2thZ2VDYW5CZVVwZ3JhZGVkSW5QYWNrYWdlSnNvbihcbiAgICB2ZXJzaW9uOiBzdHJpbmcgfCB1bmRlZmluZWRcbiAgKTogYm9vbGVhbiB7XG4gICAgLy8gTm8gdmVyc2lvbiBtZWFucyBcImxhdGVzdFwiXG4gICAgcmV0dXJuICF2ZXJzaW9uIHx8IHZlcnNpb24gPT09IFwiKlwiO1xuICB9XG5cbiAgcHJpdmF0ZSBjcmVhdGVXb3JrZmxvdyhcbiAgICB0YXNrOiBUYXNrLFxuICAgIGdpdGh1YjogR2l0SHViLFxuICAgIGJyYW5jaD86IHN0cmluZ1xuICApOiBHaXRodWJXb3JrZmxvdyB7XG4gICAgY29uc3Qgc2NoZWR1bGUgPVxuICAgICAgdGhpcy5vcHRpb25zLndvcmtmbG93T3B0aW9ucz8uc2NoZWR1bGUgPz9cbiAgICAgIFVwZ3JhZGVEZXBlbmRlbmNpZXNTY2hlZHVsZS5EQUlMWTtcblxuICAgIGNvbnN0IHdvcmtmbG93TmFtZSA9IGAke3Rhc2submFtZX0ke1xuICAgICAgYnJhbmNoID8gYC0ke2JyYW5jaC5yZXBsYWNlKC9cXC8vZywgXCItXCIpfWAgOiBcIlwiXG4gICAgfWA7XG4gICAgY29uc3Qgd29ya2Zsb3cgPSBnaXRodWIuYWRkV29ya2Zsb3cod29ya2Zsb3dOYW1lKTtcbiAgICBjb25zdCB0cmlnZ2Vyczogd29ya2Zsb3dzLlRyaWdnZXJzID0ge1xuICAgICAgd29ya2Zsb3dEaXNwYXRjaDoge30sXG4gICAgICBzY2hlZHVsZTpcbiAgICAgICAgc2NoZWR1bGUuY3Jvbi5sZW5ndGggPiAwXG4gICAgICAgICAgPyBzY2hlZHVsZS5jcm9uLm1hcCgoZSkgPT4gKHsgY3JvbjogZSB9KSlcbiAgICAgICAgICA6IHVuZGVmaW5lZCxcbiAgICB9O1xuICAgIHdvcmtmbG93Lm9uKHRyaWdnZXJzKTtcblxuICAgIGNvbnN0IHVwZ3JhZGUgPSB0aGlzLmNyZWF0ZVVwZ3JhZGUodGFzaywgZ2l0aHViLCBicmFuY2gpO1xuICAgIGNvbnN0IHByID0gdGhpcy5jcmVhdGVQcih3b3JrZmxvdywgdXBncmFkZSk7XG5cbiAgICBjb25zdCBqb2JzOiBSZWNvcmQ8c3RyaW5nLCB3b3JrZmxvd3MuSm9iPiA9IHt9O1xuICAgIGpvYnNbdXBncmFkZS5qb2JJZF0gPSB1cGdyYWRlLmpvYjtcbiAgICBqb2JzW3ByLmpvYklkXSA9IHByLmpvYjtcblxuICAgIHdvcmtmbG93LmFkZEpvYnMoam9icyk7XG4gICAgcmV0dXJuIHdvcmtmbG93O1xuICB9XG5cbiAgcHJpdmF0ZSBjcmVhdGVVcGdyYWRlKHRhc2s6IFRhc2ssIGdpdGh1YjogR2l0SHViLCBicmFuY2g/OiBzdHJpbmcpOiBVcGdyYWRlIHtcbiAgICBjb25zdCB3aXRoXyA9IHtcbiAgICAgIC4uLihicmFuY2ggPyB7IHJlZjogYnJhbmNoIH0gOiB7fSksXG4gICAgICAuLi4oZ2l0aHViLmRvd25sb2FkTGZzID8geyBsZnM6IHRydWUgfSA6IHt9KSxcbiAgICB9O1xuXG4gICAgY29uc3Qgc3RlcHM6IHdvcmtmbG93cy5Kb2JTdGVwW10gPSBbXG4gICAgICBXb3JrZmxvd1N0ZXBzLmNoZWNrb3V0KHsgd2l0aDogd2l0aF8gfSksXG4gICAgICAuLi50aGlzLnByb2plY3QucmVuZGVyV29ya2Zsb3dTZXR1cCh7IG11dGFibGU6IGZhbHNlIH0pLFxuICAgICAge1xuICAgICAgICBuYW1lOiBcIlVwZ3JhZGUgZGVwZW5kZW5jaWVzXCIsXG4gICAgICAgIHJ1bjogdGhpcy5wcm9qZWN0LnJ1blRhc2tDb21tYW5kKHRhc2spLFxuICAgICAgfSxcbiAgICBdO1xuXG4gICAgc3RlcHMucHVzaCguLi50aGlzLnBvc3RCdWlsZFN0ZXBzKTtcbiAgICBzdGVwcy5wdXNoKFxuICAgICAgLi4uV29ya2Zsb3dBY3Rpb25zLnVwbG9hZEdpdFBhdGNoKHtcbiAgICAgICAgc3RlcElkOiBDUkVBVEVfUEFUQ0hfU1RFUF9JRCxcbiAgICAgICAgb3V0cHV0TmFtZTogUEFUQ0hfQ1JFQVRFRF9PVVRQVVQsXG4gICAgICB9KVxuICAgICk7XG5cbiAgICByZXR1cm4ge1xuICAgICAgam9iOiB7XG4gICAgICAgIG5hbWU6IFwiVXBncmFkZVwiLFxuICAgICAgICBjb250YWluZXI6IHRoaXMuY29udGFpbmVyT3B0aW9ucyxcbiAgICAgICAgcGVybWlzc2lvbnM6IHRoaXMucGVybWlzc2lvbnMsXG4gICAgICAgIGVudjogdGhpcy5vcHRpb25zLndvcmtmbG93T3B0aW9ucz8uZW52LFxuICAgICAgICAuLi5maWx0ZXJlZFJ1bnNPbk9wdGlvbnMoXG4gICAgICAgICAgdGhpcy5vcHRpb25zLndvcmtmbG93T3B0aW9ucz8ucnVuc09uLFxuICAgICAgICAgIHRoaXMub3B0aW9ucy53b3JrZmxvd09wdGlvbnM/LnJ1bnNPbkdyb3VwXG4gICAgICAgICksXG4gICAgICAgIHN0ZXBzOiBzdGVwcyxcbiAgICAgICAgb3V0cHV0czoge1xuICAgICAgICAgIFtQQVRDSF9DUkVBVEVEX09VVFBVVF06IHtcbiAgICAgICAgICAgIHN0ZXBJZDogQ1JFQVRFX1BBVENIX1NURVBfSUQsXG4gICAgICAgICAgICBvdXRwdXROYW1lOiBQQVRDSF9DUkVBVEVEX09VVFBVVCxcbiAgICAgICAgICB9LFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICAgIGpvYklkOiBcInVwZ3JhZGVcIixcbiAgICAgIHJlZjogYnJhbmNoLFxuICAgIH07XG4gIH1cblxuICBwcml2YXRlIGNyZWF0ZVByKHdvcmtmbG93OiBHaXRodWJXb3JrZmxvdywgdXBncmFkZTogVXBncmFkZSk6IFBSIHtcbiAgICBjb25zdCBjcmVkZW50aWFscyA9XG4gICAgICB0aGlzLm9wdGlvbnMud29ya2Zsb3dPcHRpb25zPy5wcm9qZW5DcmVkZW50aWFscyA/P1xuICAgICAgd29ya2Zsb3cucHJvamVuQ3JlZGVudGlhbHM7XG5cbiAgICBjb25zdCBzZW1hbnRpY0NvbW1pdCA9IHRoaXMub3B0aW9ucy5zZW1hbnRpY0NvbW1pdCA/PyBcImNob3JlXCI7XG5cbiAgICByZXR1cm4ge1xuICAgICAgam9iOiBXb3JrZmxvd0pvYnMucHVsbFJlcXVlc3RGcm9tUGF0Y2goe1xuICAgICAgICBwYXRjaDoge1xuICAgICAgICAgIGpvYklkOiB1cGdyYWRlLmpvYklkLFxuICAgICAgICAgIG91dHB1dE5hbWU6IFBBVENIX0NSRUFURURfT1VUUFVULFxuICAgICAgICAgIHJlZjogdXBncmFkZS5yZWYsXG4gICAgICAgIH0sXG4gICAgICAgIHdvcmtmbG93TmFtZTogd29ya2Zsb3cubmFtZSxcbiAgICAgICAgY3JlZGVudGlhbHMsXG4gICAgICAgIC4uLmZpbHRlcmVkUnVuc09uT3B0aW9ucyhcbiAgICAgICAgICB0aGlzLm9wdGlvbnMud29ya2Zsb3dPcHRpb25zPy5ydW5zT24sXG4gICAgICAgICAgdGhpcy5vcHRpb25zLndvcmtmbG93T3B0aW9ucz8ucnVuc09uR3JvdXBcbiAgICAgICAgKSxcbiAgICAgICAgcHVsbFJlcXVlc3RUaXRsZTogYCR7c2VtYW50aWNDb21taXR9KGRlcHMpOiAke3RoaXMucHVsbFJlcXVlc3RUaXRsZX1gLFxuICAgICAgICBwdWxsUmVxdWVzdERlc2NyaXB0aW9uOiBcIlVwZ3JhZGVzIHByb2plY3QgZGVwZW5kZW5jaWVzLlwiLFxuICAgICAgICBnaXRJZGVudGl0eTogdGhpcy5naXRJZGVudGl0eSxcbiAgICAgICAgYXNzaWduZWVzOiB0aGlzLm9wdGlvbnMud29ya2Zsb3dPcHRpb25zPy5hc3NpZ25lZXMsXG4gICAgICAgIGxhYmVsczogdGhpcy5vcHRpb25zLndvcmtmbG93T3B0aW9ucz8ubGFiZWxzLFxuICAgICAgICBzaWdub2ZmOiB0aGlzLm9wdGlvbnMuc2lnbm9mZixcbiAgICAgIH0pLFxuICAgICAgam9iSWQ6IFwicHJcIixcbiAgICB9O1xuICB9XG59XG5cbmludGVyZmFjZSBVcGdyYWRlIHtcbiAgcmVhZG9ubHkgcmVmPzogc3RyaW5nO1xuICByZWFkb25seSBqb2I6IHdvcmtmbG93cy5Kb2I7XG4gIHJlYWRvbmx5IGpvYklkOiBzdHJpbmc7XG59XG5cbmludGVyZmFjZSBQUiB7XG4gIHJlYWRvbmx5IGpvYjogd29ya2Zsb3dzLkpvYjtcbiAgcmVhZG9ubHkgam9iSWQ6IHN0cmluZztcbn1cblxuLyoqXG4gKiBPcHRpb25zIGZvciBgVXBncmFkZURlcGVuZGVuY2llcy53b3JrZmxvd09wdGlvbnNgLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFVwZ3JhZGVEZXBlbmRlbmNpZXNXb3JrZmxvd09wdGlvbnMge1xuICAvKipcbiAgICogU2NoZWR1bGUgdG8gcnVuIG9uLlxuICAgKlxuICAgKiBAZGVmYXVsdCBVcGdyYWRlRGVwZW5kZW5jaWVzU2NoZWR1bGUuREFJTFlcbiAgICovXG4gIHJlYWRvbmx5IHNjaGVkdWxlPzogVXBncmFkZURlcGVuZGVuY2llc1NjaGVkdWxlO1xuXG4gIC8qKlxuICAgKiBDaG9vc2UgYSBtZXRob2QgZm9yIGF1dGhlbnRpY2F0aW5nIHdpdGggR2l0SHViIGZvciBjcmVhdGluZyB0aGUgUFIuXG4gICAqXG4gICAqIFdoZW4gdXNpbmcgdGhlIGRlZmF1bHQgZ2l0aHViIHRva2VuLCBQUidzIGNyZWF0ZWQgYnkgdGhpcyB3b3JrZmxvd1xuICAgKiB3aWxsIG5vdCB0cmlnZ2VyIGFueSBzdWJzZXF1ZW50IHdvcmtmbG93cyAoaS5lIHRoZSBidWlsZCB3b3JrZmxvdyksIHNvXG4gICAqIHByb2plbiByZXF1aXJlcyBBUEkgYWNjZXNzIHRvIGJlIHByb3ZpZGVkIHRocm91Z2ggZS5nLiBhIHBlcnNvbmFsXG4gICAqIGFjY2VzcyB0b2tlbiBvciBvdGhlciBtZXRob2QuXG4gICAqXG4gICAqIEBzZWUgaHR0cHM6Ly9naXRodWIuY29tL3BldGVyLWV2YW5zL2NyZWF0ZS1wdWxsLXJlcXVlc3QvaXNzdWVzLzQ4XG4gICAqIEBkZWZhdWx0IC0gcGVyc29uYWwgYWNjZXNzIHRva2VuIG5hbWVkIFBST0pFTl9HSVRIVUJfVE9LRU5cbiAgICovXG4gIHJlYWRvbmx5IHByb2plbkNyZWRlbnRpYWxzPzogR2l0aHViQ3JlZGVudGlhbHM7XG5cbiAgLyoqXG4gICAqIExhYmVscyB0byBhcHBseSBvbiB0aGUgUFIuXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gbm8gbGFiZWxzLlxuICAgKi9cbiAgcmVhZG9ubHkgbGFiZWxzPzogc3RyaW5nW107XG5cbiAgLyoqXG4gICAqIEFzc2lnbmVlcyB0byBhZGQgb24gdGhlIFBSLlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIG5vIGFzc2lnbmVlc1xuICAgKi9cbiAgcmVhZG9ubHkgYXNzaWduZWVzPzogc3RyaW5nW107XG5cbiAgLyoqXG4gICAqIEpvYiBjb250YWluZXIgb3B0aW9ucy5cbiAgICpcbiAgICogQGRlZmF1bHQgLSBkZWZhdWx0c1xuICAgKi9cbiAgcmVhZG9ubHkgY29udGFpbmVyPzogd29ya2Zsb3dzLkNvbnRhaW5lck9wdGlvbnM7XG5cbiAgLyoqXG4gICAqIExpc3Qgb2YgYnJhbmNoZXMgdG8gY3JlYXRlIFBSJ3MgZm9yLlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIEFsbCByZWxlYXNlIGJyYW5jaGVzIGNvbmZpZ3VyZWQgZm9yIHRoZSBwcm9qZWN0LlxuICAgKi9cbiAgcmVhZG9ubHkgYnJhbmNoZXM/OiBzdHJpbmdbXTtcblxuICAvKipcbiAgICogVGhlIGdpdCBpZGVudGl0eSB0byB1c2UgZm9yIGNvbW1pdHMuXG4gICAqIEBkZWZhdWx0IC0gZGVmYXVsdCBHaXRIdWIgQWN0aW9ucyB1c2VyXG4gICAqL1xuICByZWFkb25seSBnaXRJZGVudGl0eT86IEdpdElkZW50aXR5O1xuXG4gIC8qKlxuICAgKiBHaXRodWIgUnVubmVyIHNlbGVjdGlvbiBsYWJlbHNcbiAgICogQGRlZmF1bHQgW1widWJ1bnR1LWxhdGVzdFwiXVxuICAgKiBAZGVzY3JpcHRpb24gRGVmaW5lcyBhIHRhcmdldCBSdW5uZXIgYnkgbGFiZWxzXG4gICAqIEB0aHJvd3Mge0Vycm9yfSBpZiBib3RoIGBydW5zT25gIGFuZCBgcnVuc09uR3JvdXBgIGFyZSBzcGVjaWZpZWRcbiAgICovXG4gIHJlYWRvbmx5IHJ1bnNPbj86IHN0cmluZ1tdO1xuXG4gIC8qKlxuICAgKiBHaXRodWIgUnVubmVyIEdyb3VwIHNlbGVjdGlvbiBvcHRpb25zXG4gICAqIEBkZXNjcmlwdGlvbiBEZWZpbmVzIGEgdGFyZ2V0IFJ1bm5lciBHcm91cCBieSBuYW1lIGFuZC9vciBsYWJlbHNcbiAgICogQHRocm93cyB7RXJyb3J9IGlmIGJvdGggYHJ1bnNPbmAgYW5kIGBydW5zT25Hcm91cGAgYXJlIHNwZWNpZmllZFxuICAgKi9cbiAgcmVhZG9ubHkgcnVuc09uR3JvdXA/OiBHcm91cFJ1bm5lck9wdGlvbnM7XG5cbiAgLyoqXG4gICAqIFBlcm1pc3Npb25zIGdyYW50ZWQgdG8gdGhlIHVwZ3JhZGUgam9iXG4gICAqIFRvIGxpbWl0IGpvYiBwZXJtaXNzaW9ucyBmb3IgYGNvbnRlbnRzYCwgdGhlIGRlc2lyZWQgcGVybWlzc2lvbnMgaGF2ZSB0byBiZSBleHBsaWNpdGx5IHNldCwgZS5nLjogYHsgY29udGVudHM6IEpvYlBlcm1pc3Npb24uTk9ORSB9YFxuICAgKiBAZGVmYXVsdCBgeyBjb250ZW50czogSm9iUGVybWlzc2lvbi5SRUFEIH1gXG4gICAqL1xuICByZWFkb25seSBwZXJtaXNzaW9ucz86IEpvYlBlcm1pc3Npb25zO1xuXG4gIC8qKlxuICAgKiBCdWlsZCBlbnZpcm9ubWVudCB2YXJpYWJsZXMgZm9yIHRoZSB1cGdyYWRlIGpvYi5cbiAgICpcbiAgICogQGRlZmF1bHQge31cbiAgICovXG4gIHJlYWRvbmx5IGVudj86IHsgW2tleTogc3RyaW5nXTogc3RyaW5nIH07XG59XG5cbi8qKlxuICogSG93IG9mdGVuIHRvIGNoZWNrIGZvciBuZXcgdmVyc2lvbnMgYW5kIHJhaXNlIHB1bGwgcmVxdWVzdHMgZm9yIHZlcnNpb24gdXBncmFkZXMuXG4gKi9cbmV4cG9ydCBjbGFzcyBVcGdyYWRlRGVwZW5kZW5jaWVzU2NoZWR1bGUge1xuICAvKipcbiAgICogRGlzYWJsZXMgYXV0b21hdGljIHVwZ3JhZGVzLlxuICAgKi9cbiAgcHVibGljIHN0YXRpYyByZWFkb25seSBORVZFUiA9IG5ldyBVcGdyYWRlRGVwZW5kZW5jaWVzU2NoZWR1bGUoW10pO1xuXG4gIC8qKlxuICAgKiBBdCAwMDowMC5cbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgREFJTFkgPSBuZXcgVXBncmFkZURlcGVuZGVuY2llc1NjaGVkdWxlKFtcIjAgMCAqICogKlwiXSk7XG5cbiAgLyoqXG4gICAqIEF0IDAwOjAwIG9uIGV2ZXJ5IGRheS1vZi13ZWVrIGZyb20gTW9uZGF5IHRocm91Z2ggRnJpZGF5LlxuICAgKi9cbiAgcHVibGljIHN0YXRpYyByZWFkb25seSBXRUVLREFZID0gbmV3IFVwZ3JhZGVEZXBlbmRlbmNpZXNTY2hlZHVsZShbXG4gICAgXCIwIDAgKiAqIDEtNVwiLFxuICBdKTtcblxuICAvKipcbiAgICogQXQgMDA6MDAgb24gTW9uZGF5LlxuICAgKi9cbiAgcHVibGljIHN0YXRpYyByZWFkb25seSBXRUVLTFkgPSBuZXcgVXBncmFkZURlcGVuZGVuY2llc1NjaGVkdWxlKFtcbiAgICBcIjAgMCAqICogMVwiLFxuICBdKTtcblxuICAvKipcbiAgICogQXQgMDA6MDAgb24gZGF5LW9mLW1vbnRoIDEuXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IE1PTlRITFkgPSBuZXcgVXBncmFkZURlcGVuZGVuY2llc1NjaGVkdWxlKFtcbiAgICBcIjAgMCAxICogKlwiLFxuICBdKTtcblxuICAvKipcbiAgICogQ3JlYXRlIGEgc2NoZWR1bGUgZnJvbSBhIHJhdyBjcm9uIGV4cHJlc3Npb24uXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIGV4cHJlc3Npb25zKGNyb246IHN0cmluZ1tdKSB7XG4gICAgcmV0dXJuIG5ldyBVcGdyYWRlRGVwZW5kZW5jaWVzU2NoZWR1bGUoY3Jvbik7XG4gIH1cblxuICBwcml2YXRlIGNvbnN0cnVjdG9yKHB1YmxpYyByZWFkb25seSBjcm9uOiBzdHJpbmdbXSkge31cbn1cblxuLyoqXG4gKiBDb252ZXJ0IGRheXMgdG8gbWludXRlcy5cbiAqL1xuZnVuY3Rpb24gZGF5c1RvTWludXRlcyhkYXlzOiBudW1iZXIpOiBudW1iZXIge1xuICByZXR1cm4gZGF5cyAqIDE0NDA7XG59XG5cbi8qKlxuICogQ29udmVydCBkYXlzIHRvIHNlY29uZHMuXG4gKi9cbmZ1bmN0aW9uIGRheXNUb1NlY29uZHMoZGF5czogbnVtYmVyKTogbnVtYmVyIHtcbiAgcmV0dXJuIGRheXMgKiA4NjQwMDtcbn1cblxuLyoqXG4gKiBDb252ZXJ0IGRheXMgdG8gbWlsbGlzZWNvbmRzLlxuICovXG5mdW5jdGlvbiBkYXlzVG9NaWxsaXNlY29uZHMoZGF5czogbnVtYmVyKTogbnVtYmVyIHtcbiAgcmV0dXJuIGRheXMgKiA4NjQwMDAwMDtcbn1cbiJdfQ==
|
package/lib/javascript/util.d.ts
CHANGED
|
@@ -1,4 +1,17 @@
|
|
|
1
|
+
import { NodePackageManager } from "./node-package";
|
|
1
2
|
import { Project } from "../project";
|
|
3
|
+
/**
|
|
4
|
+
* Check if package manager is yarn classic.
|
|
5
|
+
*/
|
|
6
|
+
export declare function isYarnClassic(packageManager: NodePackageManager): boolean;
|
|
7
|
+
/**
|
|
8
|
+
* Check if package manager is yarn berry.
|
|
9
|
+
*/
|
|
10
|
+
export declare function isYarnBerry(packageManager: NodePackageManager): boolean;
|
|
11
|
+
/**
|
|
12
|
+
* Check if package manager is npm.
|
|
13
|
+
*/
|
|
14
|
+
export declare function isNpm(packageManager: NodePackageManager): boolean;
|
|
2
15
|
/**
|
|
3
16
|
* Basic interface for `package.json`.
|
|
4
17
|
*/
|
package/lib/javascript/util.js
CHANGED
|
@@ -1,6 +1,9 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.codeArtifactRegex = void 0;
|
|
4
|
+
exports.isYarnClassic = isYarnClassic;
|
|
5
|
+
exports.isYarnBerry = isYarnBerry;
|
|
6
|
+
exports.isNpm = isNpm;
|
|
4
7
|
exports.renderBundleName = renderBundleName;
|
|
5
8
|
exports.extractCodeArtifactDetails = extractCodeArtifactDetails;
|
|
6
9
|
exports.minVersion = minVersion;
|
|
@@ -18,6 +21,26 @@ const path_1 = require("path");
|
|
|
18
21
|
const semver = require("semver");
|
|
19
22
|
const node_package_1 = require("./node-package");
|
|
20
23
|
const util_1 = require("../util");
|
|
24
|
+
/**
|
|
25
|
+
* Check if package manager is yarn classic.
|
|
26
|
+
*/
|
|
27
|
+
function isYarnClassic(packageManager) {
|
|
28
|
+
return (packageManager === node_package_1.NodePackageManager.YARN ||
|
|
29
|
+
packageManager === node_package_1.NodePackageManager.YARN_CLASSIC);
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* Check if package manager is yarn berry.
|
|
33
|
+
*/
|
|
34
|
+
function isYarnBerry(packageManager) {
|
|
35
|
+
return (packageManager === node_package_1.NodePackageManager.YARN2 ||
|
|
36
|
+
packageManager === node_package_1.NodePackageManager.YARN_BERRY);
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* Check if package manager is npm.
|
|
40
|
+
*/
|
|
41
|
+
function isNpm(packageManager) {
|
|
42
|
+
return packageManager === node_package_1.NodePackageManager.NPM;
|
|
43
|
+
}
|
|
21
44
|
function renderBundleName(entrypoint) {
|
|
22
45
|
const parts = (0, path_1.join)(entrypoint).split(path_1.sep);
|
|
23
46
|
if (parts[0] === "src") {
|
|
@@ -295,4 +318,4 @@ function installedVersionProbablyMatches(requestedRange, checkRange) {
|
|
|
295
318
|
// we're in the bottom case with `<=` checks, and return `false`.
|
|
296
319
|
return !semver.eq(semver.minVersion(requestedRange, options) ?? "1.2.3", semver.minVersion(checkRange, options) ?? "1.2.3");
|
|
297
320
|
}
|
|
298
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXRpbC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9qYXZhc2NyaXB0L3V0aWwudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBdUJBLDRDQVVDO0FBY0QsZ0VBT0M7QUFFRCxnQ0FNQztBQU9ELDRDQVNDO0FBY0Qsb0VBUUM7QUFTRCwwRkFhQztBQVlELHdFQVlDO0FBUUQsNEVBZ0JDO0FBT0QsNERBMkJDO0FBT0Qsa0VBU0M7QUEyQ0Qsb0RBNENDO0FBUUQsMEVBcUNDO0FBaFdELDJCQUE4QztBQUM5QywrQkFBNkU7QUFDN0UsaUNBQWlDO0FBQ2pDLGlEQUE2QztBQUU3QyxrQ0FBaUM7QUFrQmpDLFNBQWdCLGdCQUFnQixDQUFDLFVBQWtCO0lBQ2pELE1BQU0sS0FBSyxHQUFHLElBQUEsV0FBSSxFQUFDLFVBQVUsQ0FBQyxDQUFDLEtBQUssQ0FBQyxVQUFHLENBQUMsQ0FBQztJQUMxQyxJQUFJLEtBQUssQ0FBQyxDQUFDLENBQUMsS0FBSyxLQUFLLEVBQUUsQ0FBQztRQUN2QixLQUFLLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQyw0REFBNEQ7SUFDN0UsQ0FBQztJQUVELE1BQU0sQ0FBQyxHQUFHLEtBQUssQ0FBQyxJQUFJLENBQUMsWUFBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQ2hDLE1BQU0sR0FBRyxHQUFHLElBQUEsY0FBTyxFQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ3ZCLE1BQU0sSUFBSSxHQUFHLElBQUEsZUFBUSxFQUFDLENBQUMsRUFBRSxJQUFBLGNBQU8sRUFBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ3JDLE9BQU8sWUFBSyxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsSUFBSSxDQUFDLENBQUM7QUFDL0IsQ0FBQztBQUVEOztHQUVHO0FBQ1UsUUFBQSxpQkFBaUIsR0FDNUIsbUpBQW1KLENBQUM7QUFFdEo7Ozs7O0dBS0c7QUFDSCxTQUFnQiwwQkFBMEIsQ0FBQyxXQUFtQjtJQUM1RCxNQUFNLEtBQUss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LENBQUMsVUFBVSxDQUFDLFVBQVUsRUFBRSxPQUFPLENBQUMsSUFBSSxPQUFPLENBQ2xELENBQUM7QUFDSixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgZXhpc3RzU3luYywgcmVhZEZpbGVTeW5jIH0gZnJvbSBcImZzXCI7XG5pbXBvcnQgeyBiYXNlbmFtZSwgZGlybmFtZSwgZXh0bmFtZSwgam9pbiwgc2VwLCByZXNvbHZlLCBwb3NpeCB9IGZyb20gXCJwYXRoXCI7XG5pbXBvcnQgKiBhcyBzZW12ZXIgZnJvbSBcInNlbXZlclwiO1xuaW1wb3J0IHsgTm9kZVBhY2thZ2UgfSBmcm9tIFwiLi9ub2RlLXBhY2thZ2VcIjtcbmltcG9ydCB7IFByb2plY3QgfSBmcm9tIFwiLi4vcHJvamVjdFwiO1xuaW1wb3J0IHsgZmluZFVwIH0gZnJvbSBcIi4uL3V0aWxcIjtcblxuLyoqXG4gKiBCYXNpYyBpbnRlcmZhY2UgZm9yIGBwYWNrYWdlLmpzb25gLlxuICovXG5pbnRlcmZhY2UgUGFja2FnZU1hbmlmZXN0IHtcbiAgW2tleTogc3RyaW5nXTogYW55O1xuXG4gIC8qKlxuICAgKiBQYWNrYWdlIG5hbWUuXG4gICAqL1xuICBuYW1lOiBzdHJpbmc7XG4gIC8qKlxuICAgKiBQYWNrYWdlIHZlcnNpb24uXG4gICAqL1xuICB2ZXJzaW9uOiBzdHJpbmc7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiByZW5kZXJCdW5kbGVOYW1lKGVudHJ5cG9pbnQ6IHN0cmluZykge1xuICBjb25zdCBwYXJ0cyA9IGpvaW4oZW50cnlwb2ludCkuc3BsaXQoc2VwKTtcbiAgaWYgKHBhcnRzWzBdID09PSBcInNyY1wiKSB7XG4gICAgcGFydHMuc2hpZnQoKTsgLy8ganVzdCByZW1vdmUgJ3NyYycgaWYgaXRzIHRoZSBmaXJzdCBlbGVtZW50IGZvciBlcmdvbm9taWNzXG4gIH1cblxuICBjb25zdCBwID0gcGFydHMuam9pbihwb3NpeC5zZXApO1xuICBjb25zdCBkaXIgPSBkaXJuYW1lKHApO1xuICBjb25zdCBiYXNlID0gYmFzZW5hbWUocCwgZXh0bmFtZShwKSk7XG4gIHJldHVybiBwb3NpeC5qb2luKGRpciwgYmFzZSk7XG59XG5cbi8qKlxuICogUmVnZXggZm9yIEFXUyBDb2RlQXJ0aWZhY3QgcmVnaXN0cnlcbiAqL1xuZXhwb3J0IGNvbnN0IGNvZGVBcnRpZmFjdFJlZ2V4ID1cbiAgL15odHRwczpcXC9cXC8oPzxyZWdpc3RyeT4oPzxkb21haW4+W15cXC5dKyktKD88YWNjb3VudElkPlxcZHsxMn0pXFwuZFxcLmNvZGVhcnRpZmFjdFxcLig/PHJlZ2lvbj5bXlxcLl0rKS4qXFwuYW1hem9uYXdzXFwuY29tXFwvLipcXC8oPzxyZXBvc2l0b3J5PlteXFwvXSspXFwvKS87XG5cbi8qKlxuICogZ2V0cyBBV1MgZGV0YWlscyBmcm9tIHRoZSBDb2RlIEFydGlmYWN0IHJlZ2lzdHJ5IFVSTFxuICogdGhyb3dzIGV4Y2VwdGlvbiBpZiBub3QgbWF0Y2hpbmcgZXhwZWN0ZWQgcGF0dGVyblxuICogQHBhcmFtIHJlZ2lzdHJ5VXJsIENvZGUgQXJ0aWZhY3QgcmVnaXN0cnkgVVJMXG4gKiBAcmV0dXJucyBvYmplY3QgY29udGFpbmluZyB0aGUgKGRvbWFpbiwgYWNjb3VudElkLCByZWdpb24sIHJlcG9zaXRvcnkpXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBleHRyYWN0Q29kZUFydGlmYWN0RGV0YWlscyhyZWdpc3RyeVVybDogc3RyaW5nKSB7XG4gIGNvbnN0IG1hdGNoID0gcmVnaXN0cnlVcmwubWF0Y2goY29kZUFydGlmYWN0UmVnZXgpO1xuICBpZiAobWF0Y2g/Lmdyb3Vwcykge1xuICAgIGNvbnN0IHsgZG9tYWluLCBhY2NvdW50SWQsIHJlZ2lvbiwgcmVwb3NpdG9yeSwgcmVnaXN0cnkgfSA9IG1hdGNoLmdyb3VwcztcbiAgICByZXR1cm4geyBkb21haW4sIGFjY291bnRJZCwgcmVnaW9uLCByZXBvc2l0b3J5LCByZWdpc3RyeSB9O1xuICB9XG4gIHRocm93IG5ldyBFcnJvcihcIkNvdWxkIG5vdCBnZXQgQ29kZUFydGlmYWN0IGRldGFpbHMgZnJvbSBucG0gUmVnaXN0cnlcIik7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBtaW5WZXJzaW9uKHZlcnNpb246IHN0cmluZyk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIGlmIChzZW12ZXIudmFsaWRSYW5nZSh2ZXJzaW9uKSkge1xuICAgIHJldHVybiBzZW12ZXIubWluVmVyc2lvbih2ZXJzaW9uKT8udmVyc2lvbjtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gdmVyc2lvbjtcbiAgfVxufVxuXG4vKipcbiAqIEF0dGVtcHQgdG8gcmVzb2x2ZSBsb2NhdGlvbiBvZiB0aGUgZ2l2ZW4gYG1vZHVsZUlkYC5cbiAqIEBwYXJhbSBtb2R1bGVJZCBNb2R1bGUgSUQgdG8gbG9va3VwLlxuICogQHBhcmFtIG9wdGlvbnMgUGFzc2VkIHRocm91Z2ggdG8gYHJlcXVpcmUucmVzb2x2ZWAuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB0cnlSZXNvbHZlTW9kdWxlKFxuICBtb2R1bGVJZDogc3RyaW5nLFxuICBvcHRpb25zPzogeyBwYXRoczogc3RyaW5nW10gfVxuKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgdHJ5IHtcbiAgICByZXR1cm4gcmVxdWlyZS5yZXNvbHZlKG1vZHVsZUlkLCBvcHRpb25zKTtcbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxufVxuXG4vKipcbiAqIEF0dGVtcHQgdG8gcmVzb2x2ZSBhIG1vZHVsZSdzIG1hbmlmZXN0IChwYWNrYWdlLmpzb24pIHBhdGggdmlhIGByZXF1aXJlLnJlc29sdmVgIGxvb2t1cC5cbiAqXG4gKiBAcmVtYXJrc1xuICogSWYgdGhlIHRhcmdldCBwYWNrYWdlIGhhcyBgZXhwb3J0c2AgdGhhdCBkaWZmZXIgZnJvbSB0aGUgZGVmYXVsdFxuICogKGkuZSwgaXQgZGVmaW5lcyB0aGUgYGV4cG9ydHNgIGZpZWxkIGluIGl0cyBtYW5pZmVzdCkgYW5kIGRvZXMgbm90XG4gKiBleHBsaWNpdGx5IGluY2x1ZGUgYW4gZW50cnkgZm9yIGBwYWNrYWdlLmpzb25gLCB0aGlzIHN0cmF0ZWd5IHdpbGwgZmFpbC5cbiAqIFNlZSB7QGxpbmsgdHJ5UmVzb2x2ZU1hbmlmZXN0UGF0aEZyb21EZWZhdWx0RXhwb3J0fSBhcyBhbiBhbHRlcm5hdGl2ZS5cbiAqXG4gKiBAcGFyYW0gbW9kdWxlSWQgTW9kdWxlIElEIHRvIGxvb2t1cC5cbiAqIEBwYXJhbSBvcHRpb25zIFBhc3NlZCB0aHJvdWdoIHRvIGByZXF1aXJlLnJlc29sdmVgLlxuICovXG5leHBvcnQgZnVuY3Rpb24gdHJ5UmVzb2x2ZU1vZHVsZU1hbmlmZXN0UGF0aChcbiAgbW9kdWxlSWQ6IHN0cmluZyxcbiAgb3B0aW9ucz86IHsgcGF0aHM6IHN0cmluZ1tdIH1cbik6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIC8vIGNhbm5vdCBqdXN0IGByZXF1aXJlKCdkZXBlbmRlbmN5L3BhY2thZ2UuanNvbicpYCBoZXJlIGJlY2F1c2VcbiAgLy8gYG9wdGlvbnMucGF0aHNgIG1heSBub3Qgb3ZlcmxhcCB3aXRoIHRoaXMgbm9kZSBwcm9jJ3MgcmVzb2x1dGlvbiBwYXRocy5cbiAgY29uc3QgbWFuaWZlc3RJZCA9IGAke21vZHVsZUlkfS9wYWNrYWdlLmpzb25gO1xuICByZXR1cm4gdHJ5UmVzb2x2ZU1vZHVsZShtYW5pZmVzdElkLCBvcHRpb25zKTtcbn1cblxuLyoqXG4gKiBBdHRlbXB0IHRvIHJlc29sdmUgYSBtb2R1bGUncyBtYW5pZmVzdCAocGFja2FnZS5qc29uKSBwYXRoIGJ5IGxvb2tpbmcgZm9yIHRoZSBuZWFyZXN0XG4gKiBgcGFja2FnZS5qc29uYCBmaWxlIHRoYXQgaXMgYW4gYW5jZXN0b3IgdG8gdGhlIG1vZHVsZSdzIGRlZmF1bHQgZXhwb3J0IGxvY2F0aW9uLlxuICpcbiAqIEBwYXJhbSBtb2R1bGVJZCBNb2R1bGUgSUQgdG8gbG9va3VwLlxuICogQHBhcmFtIG9wdGlvbnMgUGFzc2VkIHRocm91Z2ggdG8gYHJlcXVpcmUucmVzb2x2ZWAuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB0cnlSZXNvbHZlTWFuaWZlc3RQYXRoRnJvbURlZmF1bHRFeHBvcnQoXG4gIG1vZHVsZUlkOiBzdHJpbmcsXG4gIG9wdGlvbnM/OiB7IHBhdGhzOiBzdHJpbmdbXSB9XG4pOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICBjb25zdCBkZWZhdWx0RXhwb3J0UGF0aCA9IHRyeVJlc29sdmVNb2R1bGUobW9kdWxlSWQsIG9wdGlvbnMpO1xuICBpZiAoIWRlZmF1bHRFeHBvcnRQYXRoKSB7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuICBjb25zdCBtb2R1bGVEaXIgPSBmaW5kVXAoXCJwYWNrYWdlLmpzb25cIiwgZGVmYXVsdEV4cG9ydFBhdGgpO1xuICBpZiAoIW1vZHVsZURpcikge1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cbiAgcmV0dXJuIGpvaW4obW9kdWxlRGlyLCBcInBhY2thZ2UuanNvblwiKTtcbn1cblxuLyoqXG4gKiBBdHRlbXB0IHRvIHJlc29sdmUgYSBtb2R1bGUncyBtYW5pZmVzdCAocGFja2FnZS5qc29uKSBwYXRoIGJ5IGNoZWNraW5nIGZvciBpdHMgZXhpc3RlbmNlIHVuZGVyIGBub2RlX21vZHVsZXNgIHJlbGF0aXZlIHRvIGBiYXNlUGF0aGAuXG4gKlxuICogQHJlbWFya3NcbiAqIFRoaXMgc3RyYXRlZ3kgY2FuIGJlIGhlbHBmdWwgaW4gdGhlIHNjZW5hcmlvIHRoYXQgYSBtb2R1bGUgZGVmaW5lc1xuICogY3VzdG9tIGV4cG9ydHMgd2l0aG91dCBgcGFja2FnZS5qc29uYCBhbmQgbm8gZGVmYXVsdCBleHBvcnQgKGkuZSwgc29tZSB0eXBlIGRlZmluaXRpb24gcGFja2FnZXMpLlxuICpcbiAqIEBwYXJhbSBtb2R1bGVJZCBNb2R1bGUgSUQgdG8gbG9va3VwLlxuICogQHBhcmFtIGJhc2VQYXRoIFJvb3QgcGF0aCB0byBzZWFyY2ggZnJvbS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRyeVJlc29sdmVNYW5pZmVzdFBhdGhGcm9tUGF0aChcbiAgbW9kdWxlSWQ6IHN0cmluZyxcbiAgYmFzZVBhdGg6IHN0cmluZ1xuKSB7XG4gIGNvbnN0IGJhc2UgPSBiYXNlUGF0aC5pbmNsdWRlcyhcIm5vZGVfbW9kdWxlc1wiKVxuICAgID8gYmFzZVBhdGhcbiAgICA6IGpvaW4oYmFzZVBhdGgsIFwibm9kZV9tb2R1bGVzXCIpO1xuICBjb25zdCBmaWxlUGF0aCA9IHJlc29sdmUoYmFzZSwgLi4ubW9kdWxlSWQuc3BsaXQoXCIvXCIpLCBcInBhY2thZ2UuanNvblwiKTtcbiAgaWYgKGV4aXN0c1N5bmMoZmlsZVBhdGgpKSB7XG4gICAgcmV0dXJuIGZpbGVQYXRoO1xuICB9XG4gIHJldHVybiB1bmRlZmluZWQ7XG59XG5cbi8qKlxuICogQXR0ZW1wdCB0byByZXNvbHZlIGEgbW9kdWxlJ3MgbWFuaWZlc3QgKHBhY2thZ2UuanNvbikgcGF0aCBieSBzZWFyY2hpbmcgZm9yIGl0IGluIHRoZSBvcHRpb25hbGx5IHByb3ZpZGVkIHBhdGhzIGFycmF5XG4gKiBhcyB3ZWxsIGFzIHRoZSBjdXJyZW50IG5vZGUgcHJvY2Vzc2VzJyBkZWZhdWx0IHJlc29sdXRpb24gcGF0aHMuXG4gKiBAcGFyYW0gbW9kdWxlSWQgTW9kdWxlIElEIHRvIHNlYXJjaCBmb3IuXG4gKiBAcGFyYW0gb3B0aW9ucyBTZWFyY2ggb3B0aW9ucy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRyeVJlc29sdmVNYW5pZmVzdFBhdGhGcm9tU2VhcmNoKFxuICBtb2R1bGVJZDogc3RyaW5nLFxuICBvcHRpb25zPzogeyBwYXRoczogc3RyaW5nW10gfVxuKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgY29uc3Qgc2VhcmNoUGF0aHMgPSBbXG4gICAgLi4uKG9wdGlvbnM/LnBhdGhzID8/IFtdKSxcbiAgICAuLi4ocmVxdWlyZS5yZXNvbHZlLnBhdGhzKG1vZHVsZUlkKSA/PyBbXSksXG4gIF07XG4gIGZvciAoY29uc3QgcGF0aCBvZiBzZWFyY2hQYXRocykge1xuICAgIGNvbnN0IHJlc3VsdCA9IHRyeVJlc29sdmVNYW5pZmVzdFBhdGhGcm9tUGF0aChtb2R1bGVJZCwgcGF0aCk7XG4gICAgLy8gZWFybHkgcmV0dXJuIG9uIGZpcnN0IHJlc3VsdC5cbiAgICBpZiAocmVzdWx0KSB7XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cbiAgfVxuICByZXR1cm4gdW5kZWZpbmVkO1xufVxuXG4vKipcbiAqIEF0dGVtcHQgdG8gcmVzb2x2ZSBhIG1vZHVsZSdzIG1hbmlmZXN0IChwYWNrYWdlLmpzb24pIHVzaW5nIG11bHRpcGxlIHN0cmF0ZWdpZXMuXG4gKiBAcGFyYW0gbW9kdWxlSWQgTW9kdWxlIHRvIHJlc29sdmUgbWFuaWZlc3QgcGF0aCBmb3IuXG4gKiBAcGFyYW0gb3B0aW9ucyBSZXNvbHV0aW9uIG9wdGlvbnMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB0cnlSZXNvbHZlTW9kdWxlTWFuaWZlc3QoXG4gIG1vZHVsZUlkOiBzdHJpbmcsXG4gIG9wdGlvbnM/OiB7IHBhdGhzOiBzdHJpbmdbXSB9XG4pOiBQYWNrYWdlTWFuaWZlc3QgfCB1bmRlZmluZWQge1xuICBjb25zdCBzdHJhdGVnaWVzID0gW1xuICAgIHRyeVJlc29sdmVNb2R1bGVNYW5pZmVzdFBhdGgsXG4gICAgdHJ5UmVzb2x2ZU1hbmlmZXN0UGF0aEZyb21EZWZhdWx0RXhwb3J0LFxuICAgIHRyeVJlc29sdmVNYW5pZmVzdFBhdGhGcm9tU2VhcmNoLFxuICBdO1xuICBmb3IgKGNvbnN0IHN0cmF0ZWd5IG9mIHN0cmF0ZWdpZXMpIHtcbiAgICBjb25zdCByZXN1bHQgPSBzdHJhdGVneShtb2R1bGVJZCwgb3B0aW9ucyk7XG4gICAgLy8gZWFybHkgcmV0dXJuIG9uIGZpcnN0IHJlc3VsdC5cbiAgICBpZiAocmVzdWx0KSB7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCBtYW5pZmVzdCA9IEpTT04ucGFyc2UoXG4gICAgICAgICAgcmVhZEZpbGVTeW5jKHJlc3VsdCwgXCJ1dGY4XCIpXG4gICAgICAgICkgYXMgUGFja2FnZU1hbmlmZXN0O1xuICAgICAgICAvLyB2ZXJpZnkgbmFtZSBtYXRjaGVzIHRhcmdldCBtb2R1bGUuXG4gICAgICAgIGlmIChtYW5pZmVzdC5uYW1lID09PSBtb2R1bGVJZCkge1xuICAgICAgICAgIHJldHVybiBtYW5pZmVzdDtcbiAgICAgICAgfVxuICAgICAgfSBjYXRjaCB7XG4gICAgICAgIC8vIGNvbnRpbnVlIHRvIG5leHQgc3RyYXRlZ3kuXG4gICAgICB9XG4gICAgfVxuICB9XG4gIHJldHVybiB1bmRlZmluZWQ7XG59XG5cbi8qKlxuICogQXR0ZW1wdCB0byByZXNvbHZlIHRoZSBpbnN0YWxsZWQgdmVyc2lvbiBvZiBhIGdpdmVuIGRlcGVuZGVuY3kuXG4gKiBAcGFyYW0gZGVwZW5kZW5jeU5hbWUgTmFtZSBvZiBkZXBlbmRlbmN5LlxuICogQHBhcmFtIG9wdGlvbnMgT3B0aW9uYWwgb3B0aW9ucyBwYXNzZWQgdGhyb3VnaCB0byBgcmVxdWlyZS5yZXNvbHZlYC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRyeVJlc29sdmVEZXBlbmRlbmN5VmVyc2lvbihcbiAgZGVwZW5kZW5jeU5hbWU6IHN0cmluZyxcbiAgb3B0aW9ucz86IHsgcGF0aHM6IHN0cmluZ1tdIH1cbik6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IG1hbmlmZXN0ID0gdHJ5UmVzb2x2ZU1vZHVsZU1hbmlmZXN0KGRlcGVuZGVuY3lOYW1lLCBvcHRpb25zKTtcbiAgaWYgKCFtYW5pZmVzdCkge1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cbiAgcmV0dXJuIG1hbmlmZXN0Py52ZXJzaW9uO1xufVxuXG4vKipcbiAqIFdoZXRoZXIgdGhlIGdpdmVuIGRlcGVuZGVuY3kgdmVyc2lvbiBpcyBpbnN0YWxsZWRcbiAqXG4gKiBUaGlzIGNhbiBiZSB1c2VkIHRvIHRlc3QgZm9yIHRoZSBwcmVzZW5jZSBvZiBjZXJ0YWluIHZlcnNpb25zIG9mIGRldkRlcGVuZGVuY2llcyxcbiAqIGFuZCBkbyBzb21ldGhpbmcgZGVwZW5kZW5jeS1zcGVjaWZpYyBpbiBjZXJ0YWluIENvbXBvbmVudHMuIEZvciBleGFtcGxlLCB0ZXN0IGZvclxuICogYSB2ZXJzaW9uIG9mIEplc3QgYW5kIGdlbmVyYXRlIGRpZmZlcmVudCBjb25maWdzIGJhc2VkIG9uIHRoZSBKZXN0IHZlcnNpb24uXG4gKlxuICogTk9URTogVGhlIGltcGxlbWVudGF0aW9uIG9mIHRoaXMgZnVuY3Rpb24gY3VycmVudGx5IGlzIGN1cnJlbnRseVxuICogYXBwcm94aW1hdGU6IHRvIGRvIGl0IGNvcnJlY3RseSwgd2Ugd291bGQgbmVlZCBhIHNlcGFyYXRlIGltcGxlbWVudGF0aW9uXG4gKiBmb3IgZXZlcnkgcGFja2FnZSBtYW5hZ2VyLCB0byBxdWVyeSBpdHMgaW5zdGFsbGVkIHZlcnNpb24gKGVpdGhlciB0aGF0LCBvciB3ZVxuICogd291bGQgY29kZSB0byBxdWVyeSBgcGFja2FnZS1sb2NrLmpzb25gLCBgeWFybi5sb2NrYCwgZXRjLi4uKS5cbiAqXG4gKiBJbnN0ZWFkLCB3ZSB3aWxsIGxvb2sgYXQgYHBhY2thZ2UuanNvbmAsIGFuZCBhc3N1bWUgdGhhdCB0aGUgdmVyc2lvbnNcbiAqIHBpY2tlZCBieSB0aGUgcGFja2FnZSBtYW5hZ2VyIG1hdGNoIH50aGF0LiBUaGlzIHdpbGwgd29yayB3ZWxsIGVub3VnaCBmb3JcbiAqIG1ham9yIHZlcnNpb24gY2hlY2tzLCBidXQgbWF5IGZhaWwgZm9yIHBvaW50IHZlcnNpb25zLlxuICpcbiAqIFdoYXQgd2UgU0hPVUxEIGRvIGlzOiBgYWN0dWFsVmVyc2lvbiDiiIggY2hlY2tSYW5nZWAuXG4gKlxuICogV2hhdCB3ZSBkbyBpbnN0ZWFkIGlzIGEgc2xpZ2h0bHkgbW9yZSBzb3BoaXN0aWNhdGVkIHZlcnNpb24gb2ZcbiAqIGByZXF1ZXN0ZWRSYW5nZSDiiKkgY2hlY2tSYW5nZSAhPSDiiIVgLiBUaGlzIHdpbGwgYWx3YXlzIGdpdmUgYSBjb3JyZWN0IHJlc3VsdCBpZlxuICogYHJlcXVlc3RlZFJhbmdlIOKKhiBjaGVja1JhbmdlYCwgYnV0IG1heSBnaXZlIGZhbHNlIHBvc2l0aXZlcyB3aGVuIGBjaGVja1JhbmdlXG4gKiDiioYgcmVxdWVzdGVkUmFuZ2VgLlxuICpcbiAqIE1heSByZXR1cm4gYHVuZGVmaW5lZGAgaWYgdGhlIHF1ZXN0aW9uIGNhbm5vdCBiZSBhbnN3ZXJlZC4gVGhlc2UgaW5jbHVkZSB0aGVcbiAqIGZvbGxvd2luZyBjYXNlczpcbiAqXG4gKiAgIC0gVGhlIGRlcGVuZGVuY3kgaXMgcmVxdWVzdGVkIHZpYSBsb2NhbCBmaWxlIGRlcGVuZGVuY2llcyAoYGZpbGU6Ly8uLi5gKVxuICogICAtIFRoZSBkZXBlbmRlbmN5IHVzZXMgYW4gb3RoZXIgdHlwZSBvZiBVUkwsIHN1Y2ggYXMgYSBHaXRIdWIgVVJMXG4gKiAgIC0gVGhlIGRlcGVuZGVuY3kgaXMgbm90IGZvdW5kIGluIHRoZSBgcGFja2FnZS5qc29uYCwgc3VjaCBhcyB3aGVuXG4gKiAgICAgYm9vdHN0cmFwcGluZyBmcm9tIGFuIGV4dGVybmFsIHByb2plbiBwYWNrYWdlLCBhbmQgdGhlIGBwYWNrYWdlLmpzb25gXG4gKiAgICAgZmlsZSBvbmx5IGhhcyB0aGF0IG9uZSBleHRlcm5hbCBwYWNrYWdlIGFzIGEgZGVwZW5kZW5jeVxuICpcbiAqIE90aGVyd2lzZSBpdCB3aWxsIHJldHVybiBgdHJ1ZWAgaWYgdGhlIGluc3RhbGxlZCB2ZXJzaW9uIGlzIHByb2JhYmx5IGluIHRoZVxuICogcmVxdWVzdGVkIHJhbmdlLCBhbmQgYGZhbHNlYCBpZiBpdCBpcyBwcm9iYWJseSBub3QuXG4gKlxuICogVGhpcyBBUEkgbWF5IGV2ZW50dWFsbHkgYmUgYWRkZWQgdG8gdGhlIHB1YmxpYyBwcm9qZW4gQVBJLCBidXQgb25seSBhZnRlclxuICogd2UgaW1wbGVtZW50IGV4YWN0IHZlcnNpb24gY2hlY2tpbmcuXG4gKlxuICogQHBhcmFtIGRlcGVuZGVuY3lOYW1lIFRoZSBuYW1lIG9mIHRoZSBkZXBlbmRlbmN5XG4gKiBAcGFyYW0gY2hlY2tSYW5nZSBBIHBhcnRpY3VsYXIgdmVyc2lvbiwgb3IgcmFuZ2Ugb2YgdmVyc2lvbnMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBoYXNEZXBlbmRlbmN5VmVyc2lvbihcbiAgcHJvamVjdDogUHJvamVjdCxcbiAgZGVwZW5kZW5jeU5hbWU6IHN0cmluZyxcbiAgY2hlY2tSYW5nZTogc3RyaW5nXG4pOiBib29sZWFuIHwgdW5kZWZpbmVkIHtcbiAgY29uc3QgZmlsZSA9IE5vZGVQYWNrYWdlLm9mKHByb2plY3QpPy5maWxlO1xuICBpZiAoIWZpbGUpIHtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG5cbiAgaWYgKCFleGlzdHNTeW5jKGZpbGUuYWJzb2x1dGVQYXRoKSkge1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cblxuICBjb25zdCBwaiA9IEpTT04ucGFyc2UocmVhZEZpbGVTeW5jKGZpbGUuYWJzb2x1dGVQYXRoLCBcInV0Zi04XCIpKTtcblxuICAvLyBUZWNobmljYWx5LCB3ZSBzaG91bGQgYmUgaW50ZXJzZWN0aW5nIGFsbCByYW5nZXMgdG8gY29tZSB1cCB3aXRoIHRoZSBtb3N0IG5hcnJvdyBkZXBlbmRlbmN5XG4gIC8vIHJhbmdlLCBidXQgYHNlbXZlcmAgZG9lc24ndCBhbGxvdyBkb2luZyB0aGF0IGFuZCB3ZSBkb24ndCB3YW50IHRvIGFkZCBhIGRlcGVuZGVuY3kgb24gYHNlbXZlci1pbnRlcnNlY3RgLlxuICAvL1xuICAvLyBMZXQncyB0YWtlIHRoZSBmaXJzdCBkZXBlbmRlbmN5IGRlY2xhcmF0aW9uIHdlIGZpbmQsIGFuZCBhc3N1bWUgdGhhdCBwZW9wbGVcbiAgLy8gc2V0IHVwIHRoZWlyIGBwYWNrYWdlLmpzb25gIGNvcnJlY3RseS5cbiAgbGV0IHJlcXVlc3RlZFJhbmdlOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gIGZvciAoY29uc3Qga2V5IG9mIFtcImRlcGVuZGVuY2llc1wiLCBcImRldkRlcGVuZGVuY2llc1wiLCBcInBlZXJEZXBlbmRlbmNpZXNcIl0pIHtcbiAgICBjb25zdCBkZXBzID0gcGpba2V5XSA/PyB7fTtcbiAgICBsZXQgcmVxdWVzdGVkVmVyc2lvbiA9IGRlcHNbZGVwZW5kZW5jeU5hbWVdO1xuICAgIGlmIChyZXF1ZXN0ZWRWZXJzaW9uKSB7XG4gICAgICAvLyBJZiB0aGlzIGlzIG5vdCBhIHZhbGlkIHJhbmdlLCBpdCBjb3VsZCBiZSAnZmlsZTpkZXAudGd6Jywgb3IgYSBHaXRIdWIgVVJMLiBObyB3YXkgdG8ga25vdyB3aGF0XG4gICAgICAvLyB2ZXJzaW9uIHdlJ3JlIGdldHRpbmcsIGJhaWwgb3V0LlxuICAgICAgaWYgKCFzZW12ZXIudmFsaWRSYW5nZShyZXF1ZXN0ZWRWZXJzaW9uKSkge1xuICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgfVxuICAgICAgcmVxdWVzdGVkUmFuZ2UgPSByZXF1ZXN0ZWRWZXJzaW9uO1xuICAgICAgYnJlYWs7XG4gICAgfVxuICB9XG5cbiAgLy8gSWYgdGhlIGRlcGVuZGVuY3kgaXMgbm90IGZvdW5kIGluIHRoZSBgcGFja2FnZS5qc29uYCwgd2UgY2FuJ3QgYW5zd2VyIHRoZSBxdWVzdGlvbiAoeWV0KS5cbiAgLy8gVGhpcyBtZWFucyB0aGF0IHRoZSBkZXBlbmRlbmN5IGhhc24ndCBiZWVuIGFkZGVkIHlldCwgd2hpY2ggbWVhbnMgd2Uga25vdyAodXBzdHJlYW0pIHdoYXQgd2UncmUgZ29pbmcgdG8gcmVxdWVzdCxcbiAgLy8gb3Igd2UncmUgZ29pbmcgdG8gYXNrIGZvciAnKicgYW5kIHdlJ2xsIGdldCB0aGUgbGF0ZXN0IHZlcnNpb24uXG4gIGlmICghcmVxdWVzdGVkUmFuZ2UpIHtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG5cbiAgcmV0dXJuIGluc3RhbGxlZFZlcnNpb25Qcm9iYWJseU1hdGNoZXMocmVxdWVzdGVkUmFuZ2UsIGNoZWNrUmFuZ2UpO1xufVxuXG4vKipcbiAqIFdoZXRoZXIgdGhlIGdpdmVuIHJlcXVlc3RlZFJhbmdlICpwcm9iYWJseSogbGVhZHMgdG8gdGhlIGluc3RhbGxhdGlvbiBvZiBhIHZlcnNpb24gdGhhdCBtYXRjaGVzIGNoZWNrUmFuZ2VcbiAqXG4gKiBXZSBhc3N1bWUgdGhhdCBOUE0gYWx3YXlzIGluc3RhbGxzIHRoZSBtb3N0IHJlY2VudCB2ZXJzaW9uIG9mIGEgcGFja2FnZSB0aGF0XG4gKiBpcyBhbGxvd2VkIGJ5IHRoZSByZXF1ZXN0ZWRSYW5nZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGluc3RhbGxlZFZlcnNpb25Qcm9iYWJseU1hdGNoZXMoXG4gIHJlcXVlc3RlZFJhbmdlOiBzdHJpbmcsXG4gIGNoZWNrUmFuZ2U6IHN0cmluZ1xuKTogYm9vbGVhbiB7XG4gIGNvbnN0IG9wdGlvbnMgPSB7XG4gICAgaW5jbHVkZVByZXJlbGVhc2U6IHRydWUsXG4gICAgbG9vc2U6IHRydWUsXG4gIH07XG5cbiAgLy8gTm8gcXVlc3Rpb25zIGFza2VkOiBhbHdheXMgdHJ1ZVxuICBpZiAoc2VtdmVyLnN1YnNldChyZXF1ZXN0ZWRSYW5nZSwgY2hlY2tSYW5nZSwgb3B0aW9ucykpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIC8vIEFsc28gbm8gcXVlc3Rpb25zIGFza2VkOiBhbHdheXMgZmFsc2VcbiAgaWYgKCFzZW12ZXIuaW50ZXJzZWN0cyhyZXF1ZXN0ZWRSYW5nZSwgY2hlY2tSYW5nZSwgb3B0aW9ucykpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICAvLyBOb3cgd2UncmUgaW4gdHJpY2t5IHRlcnJpdG9yeS4gV2UgaW50ZXJzZWN0LCBidXQgYXJlbid0IGEgZnVsbCBzdWJzZXQuXG4gIC8vIFdlIGFyZSBpbiBvbmUgb2YgdGhlIGZvbGxvd2luZyAyIHNpdHVhdGlvbnMsIHdoaWNoIHdlIHdpbGwgdGllLWJyZWFrIGJ5XG4gIC8vIGFzc3VtaW5nIE5QTSB3aWxsIGluc3RhbGwgdGhlIG1vc3QgcmVjZW50IG1hdGNoaW5nIHZlcnNpb24gaW4gJ3JlcXVlc3RlZCcuXG4gIC8vXG4gIC8vIHJlcXVlc3RlZCAgfCBjaGVjayAgICB8IHJlc3VsdFxuICAvLyAtLS0tLS0tLS0tLXwtLS0tLS0tLS0tfC0tLS0tLS0tLS0tXG4gIC8vICAgPj0gMiAgICAgfCAgPj0gMyAgICB8IHByb2JhYmx5IHRydWUgKGNoYW5jZSBvZiBGUClcbiAgLy8gICA8PSAyICAgICB8ICA8PSAxICAgIHwgcHJvYmFibHkgZmFsc2UgKGNoYW5nZSBvZiBGTilcbiAgLy9cbiAgLy8gYHNlbXZlcmAgZG9lc24ndCBtYWtlIGl0IGVhc3kgdG8gZGlzdGluZ3Vpc2ggdGhlc2UgY2FzZXMgKHdlIGNhbid0IHJlcXVlc3RcbiAgLy8gdGhlIGBtYXhWZXJzaW9uYCB0aGF0IHNhdGlzZmllcyBhIHJhbmdlKS4gSW5zdGVhZCB3aGF0IHdlIGRvIGlzXG4gIC8vIGdldCB0aGUgYG1pblZlcnNpb25gIG9mIGVhY2ggcmFuZ2UsIGFuZCBpZiB0aGV5IGNvbXBhcmUgZXF1YWwgd2UgYXNzdW1lXG4gIC8vIHdlJ3JlIGluIHRoZSBib3R0b20gY2FzZSB3aXRoIGA8PWAgY2hlY2tzLCBhbmQgcmV0dXJuIGBmYWxzZWAuXG5cbiAgcmV0dXJuICFzZW12ZXIuZXEoXG4gICAgc2VtdmVyLm1pblZlcnNpb24ocmVxdWVzdGVkUmFuZ2UsIG9wdGlvbnMpID8/IFwiMS4yLjNcIixcbiAgICBzZW12ZXIubWluVmVyc2lvbihjaGVja1JhbmdlLCBvcHRpb25zKSA/PyBcIjEuMi4zXCJcbiAgKTtcbn1cbiJdfQ==
|
|
321
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXRpbC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9qYXZhc2NyaXB0L3V0aWwudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBVUEsc0NBS0M7QUFLRCxrQ0FLQztBQUtELHNCQUVDO0FBa0JELDRDQVVDO0FBY0QsZ0VBT0M7QUFFRCxnQ0FNQztBQU9ELDRDQVNDO0FBY0Qsb0VBUUM7QUFTRCwwRkFhQztBQVlELHdFQVlDO0FBUUQsNEVBZ0JDO0FBT0QsNERBMkJDO0FBT0Qsa0VBU0M7QUEyQ0Qsb0RBNENDO0FBUUQsMEVBcUNDO0FBM1hELDJCQUE4QztBQUM5QywrQkFBNkU7QUFDN0UsaUNBQWlDO0FBQ2pDLGlEQUFpRTtBQUVqRSxrQ0FBaUM7QUFFakM7O0dBRUc7QUFDSCxTQUFnQixhQUFhLENBQUMsY0FBa0M7SUFDOUQsT0FBTyxDQUNMLGNBQWMsS0FBSyxpQ0FBa0IsQ0FBQyxJQUFJO1FBQzFDLGNBQWMsS0FBSyxpQ0FBa0IsQ0FBQyxZQUFZLENBQ25ELENBQUM7QUFDSixDQUFDO0FBRUQ7O0dBRUc7QUFDSCxTQUFnQixXQUFXLENBQUMsY0FBa0M7SUFDNUQsT0FBTyxDQUNMLGNBQWMsS0FBSyxpQ0FBa0IsQ0FBQyxLQUFLO1FBQzNDLGNBQWMsS0FBSyxpQ0FBa0IsQ0FBQyxVQUFVLENBQ2pELENBQUM7QUFDSixDQUFDO0FBRUQ7O0dBRUc7QUFDSCxTQUFnQixLQUFLLENBQUMsY0FBa0M7SUFDdEQsT0FBTyxjQUFjLEtBQUssaUNBQWtCLENBQUMsR0FBRyxDQUFDO0FBQ25ELENBQUM7QUFrQkQsU0FBZ0IsZ0JBQWdCLENBQUMsVUFBa0I7SUFDakQsTUFBTSxLQUFLLEdBQUcsSUFBQSxXQUFJLEVBQUMsVUFBVSxDQUFDLENBQUMsS0FBSyxDQUFDLFVBQUcsQ0FBQyxDQUFDO0lBQzFDLElBQUksS0FBSyxDQUFDLENBQUMsQ0FBQyxLQUFLLEtBQUssRUFBRSxDQUFDO1FBQ3ZCLEtBQUssQ0FBQyxLQUFLLEVBQUUsQ0FB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QUksQ0FBQztJQUNkLENBQUM7SUFFRCx3Q0FBd0M7SUFDeEMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxVQUFVLENBQUMsY0FBYyxFQUFFLFVBQVUsRUFBRSxPQUFPLENBQUMsRUFBRSxDQUFDO1FBQzVELE9BQU8sS0FBSyxDQUFDO0lBQ2YsQ0FBQztJQUVELHlFQUF5RTtJQUN6RSwwRUFBMEU7SUFDMUUsNkVBQTZFO0lBQzdFLEVBQUU7SUFDRixpQ0FBaUM7SUFDakMscUNBQXFDO0lBQ3JDLHVEQUF1RDtJQUN2RCx3REFBd0Q7SUFDeEQsRUFBRTtJQUNGLDZFQUE2RTtJQUM3RSxrRUFBa0U7SUFDbEUsMEVBQTBFO0lBQzFFLGlFQUFpRTtJQUVqRSxPQUFPLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FDZixNQUFNLENBQUMsVUFBVSxDQUFDLGNBQWMsRUFBRSxPQUFPLENBQUMsSUFBSSxPQUFPLEVBQ3JELE1BQU0sQ0FBQyxVQUFVLENBQUMsVUFBVSxFQUFFLE9BQU8sQ0FBQyxJQUFJLE9BQU8sQ0FDbEQsQ0FBQztBQUNKLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBleGlzdHNTeW5jLCByZWFkRmlsZVN5bmMgfSBmcm9tIFwiZnNcIjtcbmltcG9ydCB7IGJhc2VuYW1lLCBkaXJuYW1lLCBleHRuYW1lLCBqb2luLCBzZXAsIHJlc29sdmUsIHBvc2l4IH0gZnJvbSBcInBhdGhcIjtcbmltcG9ydCAqIGFzIHNlbXZlciBmcm9tIFwic2VtdmVyXCI7XG5pbXBvcnQgeyBOb2RlUGFja2FnZSwgTm9kZVBhY2thZ2VNYW5hZ2VyIH0gZnJvbSBcIi4vbm9kZS1wYWNrYWdlXCI7XG5pbXBvcnQgeyBQcm9qZWN0IH0gZnJvbSBcIi4uL3Byb2plY3RcIjtcbmltcG9ydCB7IGZpbmRVcCB9IGZyb20gXCIuLi91dGlsXCI7XG5cbi8qKlxuICogQ2hlY2sgaWYgcGFja2FnZSBtYW5hZ2VyIGlzIHlhcm4gY2xhc3NpYy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzWWFybkNsYXNzaWMocGFja2FnZU1hbmFnZXI6IE5vZGVQYWNrYWdlTWFuYWdlcik6IGJvb2xlYW4ge1xuICByZXR1cm4gKFxuICAgIHBhY2thZ2VNYW5hZ2VyID09PSBOb2RlUGFja2FnZU1hbmFnZXIuWUFSTiB8fFxuICAgIHBhY2thZ2VNYW5hZ2VyID09PSBOb2RlUGFja2FnZU1hbmFnZXIuWUFSTl9DTEFTU0lDXG4gICk7XG59XG5cbi8qKlxuICogQ2hlY2sgaWYgcGFja2FnZSBtYW5hZ2VyIGlzIHlhcm4gYmVycnkuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc1lhcm5CZXJyeShwYWNrYWdlTWFuYWdlcjogTm9kZVBhY2thZ2VNYW5hZ2VyKTogYm9vbGVhbiB7XG4gIHJldHVybiAoXG4gICAgcGFja2FnZU1hbmFnZXIgPT09IE5vZGVQYWNrYWdlTWFuYWdlci5ZQVJOMiB8fFxuICAgIHBhY2thZ2VNYW5hZ2VyID09PSBOb2RlUGFja2FnZU1hbmFnZXIuWUFSTl9CRVJSWVxuICApO1xufVxuXG4vKipcbiAqIENoZWNrIGlmIHBhY2thZ2UgbWFuYWdlciBpcyBucG0uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc05wbShwYWNrYWdlTWFuYWdlcjogTm9kZVBhY2thZ2VNYW5hZ2VyKTogYm9vbGVhbiB7XG4gIHJldHVybiBwYWNrYWdlTWFuYWdlciA9PT0gTm9kZVBhY2thZ2VNYW5hZ2VyLk5QTTtcbn1cblxuLyoqXG4gKiBCYXNpYyBpbnRlcmZhY2UgZm9yIGBwYWNrYWdlLmpzb25gLlxuICovXG5pbnRlcmZhY2UgUGFja2FnZU1hbmlmZXN0IHtcbiAgW2tleTogc3RyaW5nXTogYW55O1xuXG4gIC8qKlxuICAgKiBQYWNrYWdlIG5hbWUuXG4gICAqL1xuICBuYW1lOiBzdHJpbmc7XG4gIC8qKlxuICAgKiBQYWNrYWdlIHZlcnNpb24uXG4gICAqL1xuICB2ZXJzaW9uOiBzdHJpbmc7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiByZW5kZXJCdW5kbGVOYW1lKGVudHJ5cG9pbnQ6IHN0cmluZykge1xuICBjb25zdCBwYXJ0cyA9IGpvaW4oZW50cnlwb2ludCkuc3BsaXQoc2VwKTtcbiAgaWYgKHBhcnRzWzBdID09PSBcInNyY1wiKSB7XG4gICAgcGFydHMuc2hpZnQoKTsgLy8ganVzdCByZW1vdmUgJ3NyYycgaWYgaXRzIHRoZSBmaXJzdCBlbGVtZW50IGZvciBlcmdvbm9taWNzXG4gIH1cblxuICBjb25zdCBwID0gcGFydHMuam9pbihwb3NpeC5zZXApO1xuICBjb25zdCBkaXIgPSBkaXJuYW1lKHApO1xuICBjb25zdCBiYXNlID0gYmFzZW5hbWUocCwgZXh0bmFtZShwKSk7XG4gIHJldHVybiBwb3NpeC5qb2luKGRpciwgYmFzZSk7XG59XG5cbi8qKlxuICogUmVnZXggZm9yIEFXUyBDb2RlQXJ0aWZhY3QgcmVnaXN0cnlcbiAqL1xuZXhwb3J0IGNvbnN0IGNvZGVBcnRpZmFjdFJlZ2V4ID1cbiAgL15odHRwczpcXC9cXC8oPzxyZWdpc3RyeT4oPzxkb21haW4+W15cXC5dKyktKD88YWNjb3VudElkPlxcZHsxMn0pXFwuZFxcLmNvZGVhcnRpZmFjdFxcLig/PHJlZ2lvbj5bXlxcLl0rKS4qXFwuYW1hem9uYXdzXFwuY29tXFwvLipcXC8oPzxyZXBvc2l0b3J5PlteXFwvXSspXFwvKS87XG5cbi8qKlxuICogZ2V0cyBBV1MgZGV0YWlscyBmcm9tIHRoZSBDb2RlIEFydGlmYWN0IHJlZ2lzdHJ5IFVSTFxuICogdGhyb3dzIGV4Y2VwdGlvbiBpZiBub3QgbWF0Y2hpbmcgZXhwZWN0ZWQgcGF0dGVyblxuICogQHBhcmFtIHJlZ2lzdHJ5VXJsIENvZGUgQXJ0aWZhY3QgcmVnaXN0cnkgVVJMXG4gKiBAcmV0dXJucyBvYmplY3QgY29udGFpbmluZyB0aGUgKGRvbWFpbiwgYWNjb3VudElkLCByZWdpb24sIHJlcG9zaXRvcnkpXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBleHRyYWN0Q29kZUFydGlmYWN0RGV0YWlscyhyZWdpc3RyeVVybDogc3RyaW5nKSB7XG4gIGNvbnN0IG1hdGNoID0gcmVnaXN0cnlVcmwubWF0Y2goY29kZUFydGlmYWN0UmVnZXgpO1xuICBpZiAobWF0Y2g/Lmdyb3Vwcykge1xuICAgIGNvbnN0IHsgZG9tYWluLCBhY2NvdW50SWQsIHJlZ2lvbiwgcmVwb3NpdG9yeSwgcmVnaXN0cnkgfSA9IG1hdGNoLmdyb3VwcztcbiAgICByZXR1cm4geyBkb21haW4sIGFjY291bnRJZCwgcmVnaW9uLCByZXBvc2l0b3J5LCByZWdpc3RyeSB9O1xuICB9XG4gIHRocm93IG5ldyBFcnJvcihcIkNvdWxkIG5vdCBnZXQgQ29kZUFydGlmYWN0IGRldGFpbHMgZnJvbSBucG0gUmVnaXN0cnlcIik7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBtaW5WZXJzaW9uKHZlcnNpb246IHN0cmluZyk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIGlmIChzZW12ZXIudmFsaWRSYW5nZSh2ZXJzaW9uKSkge1xuICAgIHJldHVybiBzZW12ZXIubWluVmVyc2lvbih2ZXJzaW9uKT8udmVyc2lvbjtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gdmVyc2lvbjtcbiAgfVxufVxuXG4vKipcbiAqIEF0dGVtcHQgdG8gcmVzb2x2ZSBsb2NhdGlvbiBvZiB0aGUgZ2l2ZW4gYG1vZHVsZUlkYC5cbiAqIEBwYXJhbSBtb2R1bGVJZCBNb2R1bGUgSUQgdG8gbG9va3VwLlxuICogQHBhcmFtIG9wdGlvbnMgUGFzc2VkIHRocm91Z2ggdG8gYHJlcXVpcmUucmVzb2x2ZWAuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB0cnlSZXNvbHZlTW9kdWxlKFxuICBtb2R1bGVJZDogc3RyaW5nLFxuICBvcHRpb25zPzogeyBwYXRoczogc3RyaW5nW10gfVxuKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgdHJ5IHtcbiAgICByZXR1cm4gcmVxdWlyZS5yZXNvbHZlKG1vZHVsZUlkLCBvcHRpb25zKTtcbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxufVxuXG4vKipcbiAqIEF0dGVtcHQgdG8gcmVzb2x2ZSBhIG1vZHVsZSdzIG1hbmlmZXN0IChwYWNrYWdlLmpzb24pIHBhdGggdmlhIGByZXF1aXJlLnJlc29sdmVgIGxvb2t1cC5cbiAqXG4gKiBAcmVtYXJrc1xuICogSWYgdGhlIHRhcmdldCBwYWNrYWdlIGhhcyBgZXhwb3J0c2AgdGhhdCBkaWZmZXIgZnJvbSB0aGUgZGVmYXVsdFxuICogKGkuZSwgaXQgZGVmaW5lcyB0aGUgYGV4cG9ydHNgIGZpZWxkIGluIGl0cyBtYW5pZmVzdCkgYW5kIGRvZXMgbm90XG4gKiBleHBsaWNpdGx5IGluY2x1ZGUgYW4gZW50cnkgZm9yIGBwYWNrYWdlLmpzb25gLCB0aGlzIHN0cmF0ZWd5IHdpbGwgZmFpbC5cbiAqIFNlZSB7QGxpbmsgdHJ5UmVzb2x2ZU1hbmlmZXN0UGF0aEZyb21EZWZhdWx0RXhwb3J0fSBhcyBhbiBhbHRlcm5hdGl2ZS5cbiAqXG4gKiBAcGFyYW0gbW9kdWxlSWQgTW9kdWxlIElEIHRvIGxvb2t1cC5cbiAqIEBwYXJhbSBvcHRpb25zIFBhc3NlZCB0aHJvdWdoIHRvIGByZXF1aXJlLnJlc29sdmVgLlxuICovXG5leHBvcnQgZnVuY3Rpb24gdHJ5UmVzb2x2ZU1vZHVsZU1hbmlmZXN0UGF0aChcbiAgbW9kdWxlSWQ6IHN0cmluZyxcbiAgb3B0aW9ucz86IHsgcGF0aHM6IHN0cmluZ1tdIH1cbik6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIC8vIGNhbm5vdCBqdXN0IGByZXF1aXJlKCdkZXBlbmRlbmN5L3BhY2thZ2UuanNvbicpYCBoZXJlIGJlY2F1c2VcbiAgLy8gYG9wdGlvbnMucGF0aHNgIG1heSBub3Qgb3ZlcmxhcCB3aXRoIHRoaXMgbm9kZSBwcm9jJ3MgcmVzb2x1dGlvbiBwYXRocy5cbiAgY29uc3QgbWFuaWZlc3RJZCA9IGAke21vZHVsZUlkfS9wYWNrYWdlLmpzb25gO1xuICByZXR1cm4gdHJ5UmVzb2x2ZU1vZHVsZShtYW5pZmVzdElkLCBvcHRpb25zKTtcbn1cblxuLyoqXG4gKiBBdHRlbXB0IHRvIHJlc29sdmUgYSBtb2R1bGUncyBtYW5pZmVzdCAocGFja2FnZS5qc29uKSBwYXRoIGJ5IGxvb2tpbmcgZm9yIHRoZSBuZWFyZXN0XG4gKiBgcGFja2FnZS5qc29uYCBmaWxlIHRoYXQgaXMgYW4gYW5jZXN0b3IgdG8gdGhlIG1vZHVsZSdzIGRlZmF1bHQgZXhwb3J0IGxvY2F0aW9uLlxuICpcbiAqIEBwYXJhbSBtb2R1bGVJZCBNb2R1bGUgSUQgdG8gbG9va3VwLlxuICogQHBhcmFtIG9wdGlvbnMgUGFzc2VkIHRocm91Z2ggdG8gYHJlcXVpcmUucmVzb2x2ZWAuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB0cnlSZXNvbHZlTWFuaWZlc3RQYXRoRnJvbURlZmF1bHRFeHBvcnQoXG4gIG1vZHVsZUlkOiBzdHJpbmcsXG4gIG9wdGlvbnM/OiB7IHBhdGhzOiBzdHJpbmdbXSB9XG4pOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICBjb25zdCBkZWZhdWx0RXhwb3J0UGF0aCA9IHRyeVJlc29sdmVNb2R1bGUobW9kdWxlSWQsIG9wdGlvbnMpO1xuICBpZiAoIWRlZmF1bHRFeHBvcnRQYXRoKSB7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuICBjb25zdCBtb2R1bGVEaXIgPSBmaW5kVXAoXCJwYWNrYWdlLmpzb25cIiwgZGVmYXVsdEV4cG9ydFBhdGgpO1xuICBpZiAoIW1vZHVsZURpcikge1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cbiAgcmV0dXJuIGpvaW4obW9kdWxlRGlyLCBcInBhY2thZ2UuanNvblwiKTtcbn1cblxuLyoqXG4gKiBBdHRlbXB0IHRvIHJlc29sdmUgYSBtb2R1bGUncyBtYW5pZmVzdCAocGFja2FnZS5qc29uKSBwYXRoIGJ5IGNoZWNraW5nIGZvciBpdHMgZXhpc3RlbmNlIHVuZGVyIGBub2RlX21vZHVsZXNgIHJlbGF0aXZlIHRvIGBiYXNlUGF0aGAuXG4gKlxuICogQHJlbWFya3NcbiAqIFRoaXMgc3RyYXRlZ3kgY2FuIGJlIGhlbHBmdWwgaW4gdGhlIHNjZW5hcmlvIHRoYXQgYSBtb2R1bGUgZGVmaW5lc1xuICogY3VzdG9tIGV4cG9ydHMgd2l0aG91dCBgcGFja2FnZS5qc29uYCBhbmQgbm8gZGVmYXVsdCBleHBvcnQgKGkuZSwgc29tZSB0eXBlIGRlZmluaXRpb24gcGFja2FnZXMpLlxuICpcbiAqIEBwYXJhbSBtb2R1bGVJZCBNb2R1bGUgSUQgdG8gbG9va3VwLlxuICogQHBhcmFtIGJhc2VQYXRoIFJvb3QgcGF0aCB0byBzZWFyY2ggZnJvbS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRyeVJlc29sdmVNYW5pZmVzdFBhdGhGcm9tUGF0aChcbiAgbW9kdWxlSWQ6IHN0cmluZyxcbiAgYmFzZVBhdGg6IHN0cmluZ1xuKSB7XG4gIGNvbnN0IGJhc2UgPSBiYXNlUGF0aC5pbmNsdWRlcyhcIm5vZGVfbW9kdWxlc1wiKVxuICAgID8gYmFzZVBhdGhcbiAgICA6IGpvaW4oYmFzZVBhdGgsIFwibm9kZV9tb2R1bGVzXCIpO1xuICBjb25zdCBmaWxlUGF0aCA9IHJlc29sdmUoYmFzZSwgLi4ubW9kdWxlSWQuc3BsaXQoXCIvXCIpLCBcInBhY2thZ2UuanNvblwiKTtcbiAgaWYgKGV4aXN0c1N5bmMoZmlsZVBhdGgpKSB7XG4gICAgcmV0dXJuIGZpbGVQYXRoO1xuICB9XG4gIHJldHVybiB1bmRlZmluZWQ7XG59XG5cbi8qKlxuICogQXR0ZW1wdCB0byByZXNvbHZlIGEgbW9kdWxlJ3MgbWFuaWZlc3QgKHBhY2thZ2UuanNvbikgcGF0aCBieSBzZWFyY2hpbmcgZm9yIGl0IGluIHRoZSBvcHRpb25hbGx5IHByb3ZpZGVkIHBhdGhzIGFycmF5XG4gKiBhcyB3ZWxsIGFzIHRoZSBjdXJyZW50IG5vZGUgcHJvY2Vzc2VzJyBkZWZhdWx0IHJlc29sdXRpb24gcGF0aHMuXG4gKiBAcGFyYW0gbW9kdWxlSWQgTW9kdWxlIElEIHRvIHNlYXJjaCBmb3IuXG4gKiBAcGFyYW0gb3B0aW9ucyBTZWFyY2ggb3B0aW9ucy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRyeVJlc29sdmVNYW5pZmVzdFBhdGhGcm9tU2VhcmNoKFxuICBtb2R1bGVJZDogc3RyaW5nLFxuICBvcHRpb25zPzogeyBwYXRoczogc3RyaW5nW10gfVxuKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgY29uc3Qgc2VhcmNoUGF0aHMgPSBbXG4gICAgLi4uKG9wdGlvbnM/LnBhdGhzID8/IFtdKSxcbiAgICAuLi4ocmVxdWlyZS5yZXNvbHZlLnBhdGhzKG1vZHVsZUlkKSA/PyBbXSksXG4gIF07XG4gIGZvciAoY29uc3QgcGF0aCBvZiBzZWFyY2hQYXRocykge1xuICAgIGNvbnN0IHJlc3VsdCA9IHRyeVJlc29sdmVNYW5pZmVzdFBhdGhGcm9tUGF0aChtb2R1bGVJZCwgcGF0aCk7XG4gICAgLy8gZWFybHkgcmV0dXJuIG9uIGZpcnN0IHJlc3VsdC5cbiAgICBpZiAocmVzdWx0KSB7XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cbiAgfVxuICByZXR1cm4gdW5kZWZpbmVkO1xufVxuXG4vKipcbiAqIEF0dGVtcHQgdG8gcmVzb2x2ZSBhIG1vZHVsZSdzIG1hbmlmZXN0IChwYWNrYWdlLmpzb24pIHVzaW5nIG11bHRpcGxlIHN0cmF0ZWdpZXMuXG4gKiBAcGFyYW0gbW9kdWxlSWQgTW9kdWxlIHRvIHJlc29sdmUgbWFuaWZlc3QgcGF0aCBmb3IuXG4gKiBAcGFyYW0gb3B0aW9ucyBSZXNvbHV0aW9uIG9wdGlvbnMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB0cnlSZXNvbHZlTW9kdWxlTWFuaWZlc3QoXG4gIG1vZHVsZUlkOiBzdHJpbmcsXG4gIG9wdGlvbnM/OiB7IHBhdGhzOiBzdHJpbmdbXSB9XG4pOiBQYWNrYWdlTWFuaWZlc3QgfCB1bmRlZmluZWQge1xuICBjb25zdCBzdHJhdGVnaWVzID0gW1xuICAgIHRyeVJlc29sdmVNb2R1bGVNYW5pZmVzdFBhdGgsXG4gICAgdHJ5UmVzb2x2ZU1hbmlmZXN0UGF0aEZyb21EZWZhdWx0RXhwb3J0LFxuICAgIHRyeVJlc29sdmVNYW5pZmVzdFBhdGhGcm9tU2VhcmNoLFxuICBdO1xuICBmb3IgKGNvbnN0IHN0cmF0ZWd5IG9mIHN0cmF0ZWdpZXMpIHtcbiAgICBjb25zdCByZXN1bHQgPSBzdHJhdGVneShtb2R1bGVJZCwgb3B0aW9ucyk7XG4gICAgLy8gZWFybHkgcmV0dXJuIG9uIGZpcnN0IHJlc3VsdC5cbiAgICBpZiAocmVzdWx0KSB7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCBtYW5pZmVzdCA9IEpTT04ucGFyc2UoXG4gICAgICAgICAgcmVhZEZpbGVTeW5jKHJlc3VsdCwgXCJ1dGY4XCIpXG4gICAgICAgICkgYXMgUGFja2FnZU1hbmlmZXN0O1xuICAgICAgICAvLyB2ZXJpZnkgbmFtZSBtYXRjaGVzIHRhcmdldCBtb2R1bGUuXG4gICAgICAgIGlmIChtYW5pZmVzdC5uYW1lID09PSBtb2R1bGVJZCkge1xuICAgICAgICAgIHJldHVybiBtYW5pZmVzdDtcbiAgICAgICAgfVxuICAgICAgfSBjYXRjaCB7XG4gICAgICAgIC8vIGNvbnRpbnVlIHRvIG5leHQgc3RyYXRlZ3kuXG4gICAgICB9XG4gICAgfVxuICB9XG4gIHJldHVybiB1bmRlZmluZWQ7XG59XG5cbi8qKlxuICogQXR0ZW1wdCB0byByZXNvbHZlIHRoZSBpbnN0YWxsZWQgdmVyc2lvbiBvZiBhIGdpdmVuIGRlcGVuZGVuY3kuXG4gKiBAcGFyYW0gZGVwZW5kZW5jeU5hbWUgTmFtZSBvZiBkZXBlbmRlbmN5LlxuICogQHBhcmFtIG9wdGlvbnMgT3B0aW9uYWwgb3B0aW9ucyBwYXNzZWQgdGhyb3VnaCB0byBgcmVxdWlyZS5yZXNvbHZlYC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRyeVJlc29sdmVEZXBlbmRlbmN5VmVyc2lvbihcbiAgZGVwZW5kZW5jeU5hbWU6IHN0cmluZyxcbiAgb3B0aW9ucz86IHsgcGF0aHM6IHN0cmluZ1tdIH1cbik6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IG1hbmlmZXN0ID0gdHJ5UmVzb2x2ZU1vZHVsZU1hbmlmZXN0KGRlcGVuZGVuY3lOYW1lLCBvcHRpb25zKTtcbiAgaWYgKCFtYW5pZmVzdCkge1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cbiAgcmV0dXJuIG1hbmlmZXN0Py52ZXJzaW9uO1xufVxuXG4vKipcbiAqIFdoZXRoZXIgdGhlIGdpdmVuIGRlcGVuZGVuY3kgdmVyc2lvbiBpcyBpbnN0YWxsZWRcbiAqXG4gKiBUaGlzIGNhbiBiZSB1c2VkIHRvIHRlc3QgZm9yIHRoZSBwcmVzZW5jZSBvZiBjZXJ0YWluIHZlcnNpb25zIG9mIGRldkRlcGVuZGVuY2llcyxcbiAqIGFuZCBkbyBzb21ldGhpbmcgZGVwZW5kZW5jeS1zcGVjaWZpYyBpbiBjZXJ0YWluIENvbXBvbmVudHMuIEZvciBleGFtcGxlLCB0ZXN0IGZvclxuICogYSB2ZXJzaW9uIG9mIEplc3QgYW5kIGdlbmVyYXRlIGRpZmZlcmVudCBjb25maWdzIGJhc2VkIG9uIHRoZSBKZXN0IHZlcnNpb24uXG4gKlxuICogTk9URTogVGhlIGltcGxlbWVudGF0aW9uIG9mIHRoaXMgZnVuY3Rpb24gY3VycmVudGx5IGlzIGN1cnJlbnRseVxuICogYXBwcm94aW1hdGU6IHRvIGRvIGl0IGNvcnJlY3RseSwgd2Ugd291bGQgbmVlZCBhIHNlcGFyYXRlIGltcGxlbWVudGF0aW9uXG4gKiBmb3IgZXZlcnkgcGFja2FnZSBtYW5hZ2VyLCB0byBxdWVyeSBpdHMgaW5zdGFsbGVkIHZlcnNpb24gKGVpdGhlciB0aGF0LCBvciB3ZVxuICogd291bGQgY29kZSB0byBxdWVyeSBgcGFja2FnZS1sb2NrLmpzb25gLCBgeWFybi5sb2NrYCwgZXRjLi4uKS5cbiAqXG4gKiBJbnN0ZWFkLCB3ZSB3aWxsIGxvb2sgYXQgYHBhY2thZ2UuanNvbmAsIGFuZCBhc3N1bWUgdGhhdCB0aGUgdmVyc2lvbnNcbiAqIHBpY2tlZCBieSB0aGUgcGFja2FnZSBtYW5hZ2VyIG1hdGNoIH50aGF0LiBUaGlzIHdpbGwgd29yayB3ZWxsIGVub3VnaCBmb3JcbiAqIG1ham9yIHZlcnNpb24gY2hlY2tzLCBidXQgbWF5IGZhaWwgZm9yIHBvaW50IHZlcnNpb25zLlxuICpcbiAqIFdoYXQgd2UgU0hPVUxEIGRvIGlzOiBgYWN0dWFsVmVyc2lvbiDiiIggY2hlY2tSYW5nZWAuXG4gKlxuICogV2hhdCB3ZSBkbyBpbnN0ZWFkIGlzIGEgc2xpZ2h0bHkgbW9yZSBzb3BoaXN0aWNhdGVkIHZlcnNpb24gb2ZcbiAqIGByZXF1ZXN0ZWRSYW5nZSDiiKkgY2hlY2tSYW5nZSAhPSDiiIVgLiBUaGlzIHdpbGwgYWx3YXlzIGdpdmUgYSBjb3JyZWN0IHJlc3VsdCBpZlxuICogYHJlcXVlc3RlZFJhbmdlIOKKhiBjaGVja1JhbmdlYCwgYnV0IG1heSBnaXZlIGZhbHNlIHBvc2l0aXZlcyB3aGVuIGBjaGVja1JhbmdlXG4gKiDiioYgcmVxdWVzdGVkUmFuZ2VgLlxuICpcbiAqIE1heSByZXR1cm4gYHVuZGVmaW5lZGAgaWYgdGhlIHF1ZXN0aW9uIGNhbm5vdCBiZSBhbnN3ZXJlZC4gVGhlc2UgaW5jbHVkZSB0aGVcbiAqIGZvbGxvd2luZyBjYXNlczpcbiAqXG4gKiAgIC0gVGhlIGRlcGVuZGVuY3kgaXMgcmVxdWVzdGVkIHZpYSBsb2NhbCBmaWxlIGRlcGVuZGVuY2llcyAoYGZpbGU6Ly8uLi5gKVxuICogICAtIFRoZSBkZXBlbmRlbmN5IHVzZXMgYW4gb3RoZXIgdHlwZSBvZiBVUkwsIHN1Y2ggYXMgYSBHaXRIdWIgVVJMXG4gKiAgIC0gVGhlIGRlcGVuZGVuY3kgaXMgbm90IGZvdW5kIGluIHRoZSBgcGFja2FnZS5qc29uYCwgc3VjaCBhcyB3aGVuXG4gKiAgICAgYm9vdHN0cmFwcGluZyBmcm9tIGFuIGV4dGVybmFsIHByb2plbiBwYWNrYWdlLCBhbmQgdGhlIGBwYWNrYWdlLmpzb25gXG4gKiAgICAgZmlsZSBvbmx5IGhhcyB0aGF0IG9uZSBleHRlcm5hbCBwYWNrYWdlIGFzIGEgZGVwZW5kZW5jeVxuICpcbiAqIE90aGVyd2lzZSBpdCB3aWxsIHJldHVybiBgdHJ1ZWAgaWYgdGhlIGluc3RhbGxlZCB2ZXJzaW9uIGlzIHByb2JhYmx5IGluIHRoZVxuICogcmVxdWVzdGVkIHJhbmdlLCBhbmQgYGZhbHNlYCBpZiBpdCBpcyBwcm9iYWJseSBub3QuXG4gKlxuICogVGhpcyBBUEkgbWF5IGV2ZW50dWFsbHkgYmUgYWRkZWQgdG8gdGhlIHB1YmxpYyBwcm9qZW4gQVBJLCBidXQgb25seSBhZnRlclxuICogd2UgaW1wbGVtZW50IGV4YWN0IHZlcnNpb24gY2hlY2tpbmcuXG4gKlxuICogQHBhcmFtIGRlcGVuZGVuY3lOYW1lIFRoZSBuYW1lIG9mIHRoZSBkZXBlbmRlbmN5XG4gKiBAcGFyYW0gY2hlY2tSYW5nZSBBIHBhcnRpY3VsYXIgdmVyc2lvbiwgb3IgcmFuZ2Ugb2YgdmVyc2lvbnMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBoYXNEZXBlbmRlbmN5VmVyc2lvbihcbiAgcHJvamVjdDogUHJvamVjdCxcbiAgZGVwZW5kZW5jeU5hbWU6IHN0cmluZyxcbiAgY2hlY2tSYW5nZTogc3RyaW5nXG4pOiBib29sZWFuIHwgdW5kZWZpbmVkIHtcbiAgY29uc3QgZmlsZSA9IE5vZGVQYWNrYWdlLm9mKHByb2plY3QpPy5maWxlO1xuICBpZiAoIWZpbGUpIHtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG5cbiAgaWYgKCFleGlzdHNTeW5jKGZpbGUuYWJzb2x1dGVQYXRoKSkge1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cblxuICBjb25zdCBwaiA9IEpTT04ucGFyc2UocmVhZEZpbGVTeW5jKGZpbGUuYWJzb2x1dGVQYXRoLCBcInV0Zi04XCIpKTtcblxuICAvLyBUZWNobmljYWx5LCB3ZSBzaG91bGQgYmUgaW50ZXJzZWN0aW5nIGFsbCByYW5nZXMgdG8gY29tZSB1cCB3aXRoIHRoZSBtb3N0IG5hcnJvdyBkZXBlbmRlbmN5XG4gIC8vIHJhbmdlLCBidXQgYHNlbXZlcmAgZG9lc24ndCBhbGxvdyBkb2luZyB0aGF0IGFuZCB3ZSBkb24ndCB3YW50IHRvIGFkZCBhIGRlcGVuZGVuY3kgb24gYHNlbXZlci1pbnRlcnNlY3RgLlxuICAvL1xuICAvLyBMZXQncyB0YWtlIHRoZSBmaXJzdCBkZXBlbmRlbmN5IGRlY2xhcmF0aW9uIHdlIGZpbmQsIGFuZCBhc3N1bWUgdGhhdCBwZW9wbGVcbiAgLy8gc2V0IHVwIHRoZWlyIGBwYWNrYWdlLmpzb25gIGNvcnJlY3RseS5cbiAgbGV0IHJlcXVlc3RlZFJhbmdlOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gIGZvciAoY29uc3Qga2V5IG9mIFtcImRlcGVuZGVuY2llc1wiLCBcImRldkRlcGVuZGVuY2llc1wiLCBcInBlZXJEZXBlbmRlbmNpZXNcIl0pIHtcbiAgICBjb25zdCBkZXBzID0gcGpba2V5XSA/PyB7fTtcbiAgICBsZXQgcmVxdWVzdGVkVmVyc2lvbiA9IGRlcHNbZGVwZW5kZW5jeU5hbWVdO1xuICAgIGlmIChyZXF1ZXN0ZWRWZXJzaW9uKSB7XG4gICAgICAvLyBJZiB0aGlzIGlzIG5vdCBhIHZhbGlkIHJhbmdlLCBpdCBjb3VsZCBiZSAnZmlsZTpkZXAudGd6Jywgb3IgYSBHaXRIdWIgVVJMLiBObyB3YXkgdG8ga25vdyB3aGF0XG4gICAgICAvLyB2ZXJzaW9uIHdlJ3JlIGdldHRpbmcsIGJhaWwgb3V0LlxuICAgICAgaWYgKCFzZW12ZXIudmFsaWRSYW5nZShyZXF1ZXN0ZWRWZXJzaW9uKSkge1xuICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgfVxuICAgICAgcmVxdWVzdGVkUmFuZ2UgPSByZXF1ZXN0ZWRWZXJzaW9uO1xuICAgICAgYnJlYWs7XG4gICAgfVxuICB9XG5cbiAgLy8gSWYgdGhlIGRlcGVuZGVuY3kgaXMgbm90IGZvdW5kIGluIHRoZSBgcGFja2FnZS5qc29uYCwgd2UgY2FuJ3QgYW5zd2VyIHRoZSBxdWVzdGlvbiAoeWV0KS5cbiAgLy8gVGhpcyBtZWFucyB0aGF0IHRoZSBkZXBlbmRlbmN5IGhhc24ndCBiZWVuIGFkZGVkIHlldCwgd2hpY2ggbWVhbnMgd2Uga25vdyAodXBzdHJlYW0pIHdoYXQgd2UncmUgZ29pbmcgdG8gcmVxdWVzdCxcbiAgLy8gb3Igd2UncmUgZ29pbmcgdG8gYXNrIGZvciAnKicgYW5kIHdlJ2xsIGdldCB0aGUgbGF0ZXN0IHZlcnNpb24uXG4gIGlmICghcmVxdWVzdGVkUmFuZ2UpIHtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG5cbiAgcmV0dXJuIGluc3RhbGxlZFZlcnNpb25Qcm9iYWJseU1hdGNoZXMocmVxdWVzdGVkUmFuZ2UsIGNoZWNrUmFuZ2UpO1xufVxuXG4vKipcbiAqIFdoZXRoZXIgdGhlIGdpdmVuIHJlcXVlc3RlZFJhbmdlICpwcm9iYWJseSogbGVhZHMgdG8gdGhlIGluc3RhbGxhdGlvbiBvZiBhIHZlcnNpb24gdGhhdCBtYXRjaGVzIGNoZWNrUmFuZ2VcbiAqXG4gKiBXZSBhc3N1bWUgdGhhdCBOUE0gYWx3YXlzIGluc3RhbGxzIHRoZSBtb3N0IHJlY2VudCB2ZXJzaW9uIG9mIGEgcGFja2FnZSB0aGF0XG4gKiBpcyBhbGxvd2VkIGJ5IHRoZSByZXF1ZXN0ZWRSYW5nZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGluc3RhbGxlZFZlcnNpb25Qcm9iYWJseU1hdGNoZXMoXG4gIHJlcXVlc3RlZFJhbmdlOiBzdHJpbmcsXG4gIGNoZWNrUmFuZ2U6IHN0cmluZ1xuKTogYm9vbGVhbiB7XG4gIGNvbnN0IG9wdGlvbnMgPSB7XG4gICAgaW5jbHVkZVByZXJlbGVhc2U6IHRydWUsXG4gICAgbG9vc2U6IHRydWUsXG4gIH07XG5cbiAgLy8gTm8gcXVlc3Rpb25zIGFza2VkOiBhbHdheXMgdHJ1ZVxuICBpZiAoc2VtdmVyLnN1YnNldChyZXF1ZXN0ZWRSYW5nZSwgY2hlY2tSYW5nZSwgb3B0aW9ucykpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIC8vIEFsc28gbm8gcXVlc3Rpb25zIGFza2VkOiBhbHdheXMgZmFsc2VcbiAgaWYgKCFzZW12ZXIuaW50ZXJzZWN0cyhyZXF1ZXN0ZWRSYW5nZSwgY2hlY2tSYW5nZSwgb3B0aW9ucykpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICAvLyBOb3cgd2UncmUgaW4gdHJpY2t5IHRlcnJpdG9yeS4gV2UgaW50ZXJzZWN0LCBidXQgYXJlbid0IGEgZnVsbCBzdWJzZXQuXG4gIC8vIFdlIGFyZSBpbiBvbmUgb2YgdGhlIGZvbGxvd2luZyAyIHNpdHVhdGlvbnMsIHdoaWNoIHdlIHdpbGwgdGllLWJyZWFrIGJ5XG4gIC8vIGFzc3VtaW5nIE5QTSB3aWxsIGluc3RhbGwgdGhlIG1vc3QgcmVjZW50IG1hdGNoaW5nIHZlcnNpb24gaW4gJ3JlcXVlc3RlZCcuXG4gIC8vXG4gIC8vIHJlcXVlc3RlZCAgfCBjaGVjayAgICB8IHJlc3VsdFxuICAvLyAtLS0tLS0tLS0tLXwtLS0tLS0tLS0tfC0tLS0tLS0tLS0tXG4gIC8vICAgPj0gMiAgICAgfCAgPj0gMyAgICB8IHByb2JhYmx5IHRydWUgKGNoYW5jZSBvZiBGUClcbiAgLy8gICA8PSAyICAgICB8ICA8PSAxICAgIHwgcHJvYmFibHkgZmFsc2UgKGNoYW5nZSBvZiBGTilcbiAgLy9cbiAgLy8gYHNlbXZlcmAgZG9lc24ndCBtYWtlIGl0IGVhc3kgdG8gZGlzdGluZ3Vpc2ggdGhlc2UgY2FzZXMgKHdlIGNhbid0IHJlcXVlc3RcbiAgLy8gdGhlIGBtYXhWZXJzaW9uYCB0aGF0IHNhdGlzZmllcyBhIHJhbmdlKS4gSW5zdGVhZCB3aGF0IHdlIGRvIGlzXG4gIC8vIGdldCB0aGUgYG1pblZlcnNpb25gIG9mIGVhY2ggcmFuZ2UsIGFuZCBpZiB0aGV5IGNvbXBhcmUgZXF1YWwgd2UgYXNzdW1lXG4gIC8vIHdlJ3JlIGluIHRoZSBib3R0b20gY2FzZSB3aXRoIGA8PWAgY2hlY2tzLCBhbmQgcmV0dXJuIGBmYWxzZWAuXG5cbiAgcmV0dXJuICFzZW12ZXIuZXEoXG4gICAgc2VtdmVyLm1pblZlcnNpb24ocmVxdWVzdGVkUmFuZ2UsIG9wdGlvbnMpID8/IFwiMS4yLjNcIixcbiAgICBzZW12ZXIubWluVmVyc2lvbihjaGVja1JhbmdlLCBvcHRpb25zKSA/PyBcIjEuMi4zXCJcbiAgKTtcbn1cbiJdfQ==
|