@pipeline-builder/pipeline-manager 3.4.89 → 3.4.91
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/dist/agent/bootstrap.js +9 -16
- package/dist/agent/health.d.ts +6 -0
- package/dist/agent/health.d.ts.map +1 -1
- package/dist/agent/health.js +5 -4
- package/dist/agent/ports.d.ts +21 -4
- package/dist/agent/ports.d.ts.map +1 -1
- package/dist/agent/ports.js +111 -14
- package/dist/agent/post-steps.d.ts.map +1 -1
- package/dist/agent/post-steps.js +11 -7
- package/dist/agent/prereqs.d.ts +1 -1
- package/dist/agent/prereqs.d.ts.map +1 -1
- package/dist/agent/prereqs.js +26 -48
- package/dist/agent/targets.d.ts +5 -4
- package/dist/agent/targets.d.ts.map +1 -1
- package/dist/agent/targets.js +1 -1
- package/dist/commands/provision.d.ts +83 -0
- package/dist/commands/provision.d.ts.map +1 -1
- package/dist/commands/provision.js +344 -256
- package/dist/commands/setup-events.d.ts.map +1 -1
- package/dist/commands/setup-events.js +10 -7
- package/dist/commands/store-token.d.ts.map +1 -1
- package/dist/commands/store-token.js +8 -45
- package/dist/utils/platform-secret.d.ts +27 -0
- package/dist/utils/platform-secret.d.ts.map +1 -0
- package/dist/utils/platform-secret.js +74 -0
- package/package.json +3 -3
|
@@ -8,7 +8,7 @@ import { diagnoseFailure, isAiConfigured, parseGoal } from '../agent/ai.js';
|
|
|
8
8
|
import { bootstrapCommand, resolveBootstrap } from '../agent/bootstrap.js';
|
|
9
9
|
import { entrypointExists, executionBlocked, runScript } from '../agent/executor.js';
|
|
10
10
|
import { deriveHealthUrl, waitHealthy, ensureMinikubeGateway } from '../agent/health.js';
|
|
11
|
-
import { checkHostPorts } from '../agent/ports.js';
|
|
11
|
+
import { checkHostPorts, discoverHostPorts, stackRunning } from '../agent/ports.js';
|
|
12
12
|
import { resolvePostSteps } from '../agent/post-steps.js';
|
|
13
13
|
import { checkPrereqs, gitAvailable, gitSupportsSparseCheckout, prereqsSatisfied } from '../agent/prereqs.js';
|
|
14
14
|
import { TOOLS_DIR, fetchTool, isFetchable, withToolsOnPath } from '../agent/tools.js';
|
|
@@ -44,6 +44,312 @@ async function confirm(question, autoYes) {
|
|
|
44
44
|
function collectStep(value, acc) {
|
|
45
45
|
return [...acc, value];
|
|
46
46
|
}
|
|
47
|
+
/**
|
|
48
|
+
* Host-port pre-flight (local/minikube). Ports are DERIVED from the target's cloned
|
|
49
|
+
* deploy source (compose / setup.sh) so the list can't drift — hence this runs AFTER
|
|
50
|
+
* the clone. A taken port makes a container/forward fail to bind mid-deploy (for the
|
|
51
|
+
* gateway, a silent unreachable hang). Prints a ✓/✗ summary and returns false ONLY
|
|
52
|
+
* when the caller must ABORT (a fatal local conflict). minikube ports are managed
|
|
53
|
+
* forwards (setup.sh pkills/restarts them), so a conflict there warns but proceeds.
|
|
54
|
+
* Remote targets (ec2/fargate) bind nothing locally → returns true.
|
|
55
|
+
*/
|
|
56
|
+
export async function preflightPorts(spec, target, cwd) {
|
|
57
|
+
const ports = discoverHostPorts(target, cwd, spec);
|
|
58
|
+
if (ports.length === 0)
|
|
59
|
+
return true;
|
|
60
|
+
const portChecks = await checkHostPorts(ports);
|
|
61
|
+
const taken = portChecks.filter((c) => !c.available);
|
|
62
|
+
printSection('Port availability');
|
|
63
|
+
for (const c of portChecks)
|
|
64
|
+
printInfo(`${c.available ? '✓' : '✗'} ${String(c.port).padEnd(5)} — ${c.service}`);
|
|
65
|
+
if (taken.length === 0)
|
|
66
|
+
return true;
|
|
67
|
+
// local PUBLISHES these ports at `docker compose up` time, so a conflict is fatal.
|
|
68
|
+
// minikube's are kubectl port-forwards setup.sh pkills + restarts (and
|
|
69
|
+
// ensureMinikubeGateway recovers), so a stale forward must NOT block a re-run.
|
|
70
|
+
const fatal = target === 'local';
|
|
71
|
+
// …UNLESS the local stack is already running: those ports are held by YOUR OWN
|
|
72
|
+
// stack, and `docker compose up` no-ops them — this is exactly how you re-run to
|
|
73
|
+
// add loads/options. Don't block (the would-be conflict is a self-conflict).
|
|
74
|
+
if (fatal && stackRunning(target, cwd, spec)) {
|
|
75
|
+
printWarning(`\n${taken.length} port(s) are held by your already-running ${spec.label} stack — re-running just resumes it (no real conflict), so continuing.`);
|
|
76
|
+
return true;
|
|
77
|
+
}
|
|
78
|
+
const lead = `${taken.length} required port(s) already in use: ${taken.map((c) => c.port).join(', ')}`;
|
|
79
|
+
(fatal ? printError : printWarning)(fatal
|
|
80
|
+
? `\n${lead} — the deploy can't bind them and would fail mid-way. Free them and re-run:`
|
|
81
|
+
: `\n${lead} — on minikube these are usually a previous run's port-forwards (setup.sh restarts them). Free any NON-minikube holder if the gateway stays unreachable:`);
|
|
82
|
+
for (const c of taken)
|
|
83
|
+
printInfo(` • port ${c.port} (${c.service}) — find the holder: lsof -i :${c.port}`);
|
|
84
|
+
if (taken.some((c) => c.port === 5000)) {
|
|
85
|
+
printInfo(' Note: on macOS, port 5000 is usually AirPlay Receiver — System Settings → General → AirDrop & Handoff → AirPlay Receiver (off).');
|
|
86
|
+
}
|
|
87
|
+
return !fatal;
|
|
88
|
+
}
|
|
89
|
+
/**
|
|
90
|
+
* Teardown mode — the destroy counterpart of provisioning, gated HARDER than deploy:
|
|
91
|
+
* AWS targets are irreversible, so the operator must TYPE the target id (--force
|
|
92
|
+
* bypasses for CI; --yes alone does NOT). Terminal: owns its output + exitCode.
|
|
93
|
+
*/
|
|
94
|
+
export async function runTeardown(spec, target, cwd, executionId, opts) {
|
|
95
|
+
const { command: downCommand, destructive } = teardownCommand(target, {
|
|
96
|
+
stackName: opts.stackName,
|
|
97
|
+
region: opts.region,
|
|
98
|
+
// Our typed gate IS the confirmation — forward --yes so the native script
|
|
99
|
+
// (Fargate) doesn't also block on stdin we're inheriting.
|
|
100
|
+
assumeYes: true,
|
|
101
|
+
});
|
|
102
|
+
if (opts.json) {
|
|
103
|
+
console.log(JSON.stringify({ success: true, executionId, target, teardown: true, destructive, destroys: spec.destroys, command: downCommand }, null, 2));
|
|
104
|
+
return;
|
|
105
|
+
}
|
|
106
|
+
printSection(`Teardown plan — ${spec.label}`);
|
|
107
|
+
printKeyValue({ 'Target': target, 'Destroys': spec.destroys, 'Stops cost': spec.cost });
|
|
108
|
+
printSection('Command to run');
|
|
109
|
+
printInfo(downCommand);
|
|
110
|
+
if (destructive && !opts.force) {
|
|
111
|
+
const token = await ask(`\nThis is IRREVERSIBLE. Type "${target}" to confirm teardown: `);
|
|
112
|
+
if (token !== target) {
|
|
113
|
+
printWarning('That didn\'t match, so nothing was destroyed — you have to type the exact target id to confirm.');
|
|
114
|
+
return;
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
else if (!destructive && !opts.force && !(await confirm('\nProceed with teardown (stops the stack; on-disk data persists)?', opts.yes ?? false))) {
|
|
118
|
+
printWarning('No problem — nothing was changed.');
|
|
119
|
+
return;
|
|
120
|
+
}
|
|
121
|
+
printSection('Tearing down');
|
|
122
|
+
const { code: downCode } = await runScript(downCommand, cwd, { capture: false });
|
|
123
|
+
if (downCode !== 0) {
|
|
124
|
+
printError(`\nTeardown failed (exit ${downCode}). Inspect the stack/containers and retry.`);
|
|
125
|
+
process.exitCode = 1;
|
|
126
|
+
return;
|
|
127
|
+
}
|
|
128
|
+
printSuccess('Teardown complete.');
|
|
129
|
+
}
|
|
130
|
+
/**
|
|
131
|
+
* Run the deploy command (real, secrets unmasked, streamed + captured) with a
|
|
132
|
+
* bounded auto-fix + retry loop — the deploy scripts are idempotent, so a fixed
|
|
133
|
+
* re-run resumes rather than starting over. Returns whether it succeeded plus the
|
|
134
|
+
* (possibly fix-adjusted) params, which the caller needs for SES guidance.
|
|
135
|
+
*/
|
|
136
|
+
export async function runDeployWithRetry(spec, url, cwd, params, aiOpts, opts) {
|
|
137
|
+
const maxAttempts = 1 + Math.max(0, parseInt(opts.retries ?? '', 10) || 0);
|
|
138
|
+
let runParams = params;
|
|
139
|
+
let succeeded = false;
|
|
140
|
+
for (let attempt = 1; attempt <= maxAttempts; attempt++) {
|
|
141
|
+
const realCommand = assembleCommand(spec, runParams, { mask: false }).command;
|
|
142
|
+
printSection(attempt === 1 ? 'Deploying' : `Deploying — retry ${attempt - 1}`);
|
|
143
|
+
if (attempt === 1) {
|
|
144
|
+
printInfo(`Deploying ${spec.label} → ${url}`);
|
|
145
|
+
printInfo(spec.deploys);
|
|
146
|
+
printInfo('Streaming the deploy below — first run is the slow one (image pulls + cert generation).');
|
|
147
|
+
}
|
|
148
|
+
const { code, tail } = await runScript(realCommand, cwd, { capture: true });
|
|
149
|
+
if (code === 0) {
|
|
150
|
+
succeeded = true;
|
|
151
|
+
break;
|
|
152
|
+
}
|
|
153
|
+
printError(`\nDeploy failed (exit ${code}).`);
|
|
154
|
+
const issues = matchIssues(tail);
|
|
155
|
+
if (issues.length > 0) {
|
|
156
|
+
printSection('Likely cause');
|
|
157
|
+
for (const i of issues)
|
|
158
|
+
printInfo(`• ${i.cause}\n → ${i.suggestion}`);
|
|
159
|
+
}
|
|
160
|
+
if (isAiConfigured(aiOpts)) {
|
|
161
|
+
const diagnosis = await diagnoseFailure(redactSecrets(tail, spec, runParams), aiOpts);
|
|
162
|
+
if (diagnosis) {
|
|
163
|
+
printSection('Diagnosis');
|
|
164
|
+
printInfo(diagnosis);
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
if (attempt >= maxAttempts)
|
|
168
|
+
break;
|
|
169
|
+
// Auto-fix: a retryable issue with a param we haven't already applied.
|
|
170
|
+
const fix = issues.find((i) => i.retryable && i.paramFix && runParams[i.paramFix.key] !== i.paramFix.value);
|
|
171
|
+
if (fix?.paramFix && await confirm(`\nApply fix and retry — ${fix.suggestion}`, opts.yes ?? false)) {
|
|
172
|
+
runParams = { ...runParams, [fix.paramFix.key]: fix.paramFix.value };
|
|
173
|
+
continue;
|
|
174
|
+
}
|
|
175
|
+
// Retryable but no param change (e.g. ACM DNS propagation) — offer a plain re-run.
|
|
176
|
+
if (!fix && issues.some((i) => i.retryable) && await confirm('\nRetry the deploy (safe to re-run — it resumes where it left off)?', opts.yes ?? false)) {
|
|
177
|
+
continue;
|
|
178
|
+
}
|
|
179
|
+
break;
|
|
180
|
+
}
|
|
181
|
+
return { succeeded, runParams };
|
|
182
|
+
}
|
|
183
|
+
/**
|
|
184
|
+
* Execute the post-install steps (register → loads → smoke → events → custom). On
|
|
185
|
+
* EC2/Fargate, register + the events bundle (store-token → setup-events) need a
|
|
186
|
+
* reachable, REGISTERED platform that's only true inside the VPC, so those are
|
|
187
|
+
* SURFACED as ordered manual next-steps instead of auto-run (they'd fail locally).
|
|
188
|
+
* Sets exitCode on a step failure; the platform is already deployed by this point.
|
|
189
|
+
*/
|
|
190
|
+
export async function runPostSteps(postSteps, skippedSteps, target, cwd, adminEnv, opts) {
|
|
191
|
+
if (postSteps.length === 0)
|
|
192
|
+
return;
|
|
193
|
+
for (const s of skippedSteps)
|
|
194
|
+
printWarning(`Skipped post-step ${s.id}: ${s.reason}`);
|
|
195
|
+
const isRemote = (id) => (target === 'ec2' || target === 'fargate') && (id === 'register' || id === 'store-token' || id === 'events');
|
|
196
|
+
const runnable = postSteps.filter((s) => !isRemote(s.id));
|
|
197
|
+
const remote = postSteps.filter((s) => isRemote(s.id));
|
|
198
|
+
if (remote.length > 0) {
|
|
199
|
+
printInfo('\nNext (run from inside the VPC, in this order):');
|
|
200
|
+
for (const s of remote)
|
|
201
|
+
printInfo(` • ${s.label} — ${s.command}`);
|
|
202
|
+
}
|
|
203
|
+
if (runnable.length === 0)
|
|
204
|
+
return;
|
|
205
|
+
// When the loads were picked interactively (autoRun), the user already opted in — skip
|
|
206
|
+
// the redundant second confirm. Flag-driven / non-interactive runs still gate here.
|
|
207
|
+
if (opts.autoRun || await confirm(`\nRun ${runnable.length} post-install step(s) now?`, opts.yes ?? false)) {
|
|
208
|
+
if (opts.autoRun)
|
|
209
|
+
printInfo(`\nRunning the ${runnable.length} post-install step(s) you selected…`);
|
|
210
|
+
for (const s of runnable) {
|
|
211
|
+
printSection(`Post-step: ${s.label}`);
|
|
212
|
+
// register (local/minikube) logs into the platform, so it needs the admin creds
|
|
213
|
+
// (PLATFORM_IDENTIFIER / PLATFORM_PASSWORD) on top of its step env.
|
|
214
|
+
const needsCreds = s.id === 'register' || s.id === 'store-token';
|
|
215
|
+
const env = needsCreds ? { ...s.env, ...adminEnv } : s.env;
|
|
216
|
+
// Loads/smoke are noisy + non-interactive → run QUIET (capture, show only on
|
|
217
|
+
// failure). Exception: a register with no admin creds prompts, so it must stream.
|
|
218
|
+
const interactiveRegister = s.id === 'register' && !adminEnv.PLATFORM_IDENTIFIER;
|
|
219
|
+
const quiet = !interactiveRegister;
|
|
220
|
+
if (quiet)
|
|
221
|
+
printInfo(`${s.command}\n …running (output shown only if it fails)`);
|
|
222
|
+
else
|
|
223
|
+
printInfo(s.command);
|
|
224
|
+
const { code, tail } = await runScript(s.command, cwd, { quiet, capture: false, env });
|
|
225
|
+
if (code !== 0) {
|
|
226
|
+
if (quiet && tail) {
|
|
227
|
+
printError('\n--- last output ---');
|
|
228
|
+
printInfo(tail);
|
|
229
|
+
}
|
|
230
|
+
printError(`\nPost-step '${s.id}' failed (exit ${code}). The platform is deployed; fix and re-run the step manually.`);
|
|
231
|
+
process.exitCode = 1;
|
|
232
|
+
break;
|
|
233
|
+
}
|
|
234
|
+
printSuccess(`${s.id} ✓`);
|
|
235
|
+
}
|
|
236
|
+
}
|
|
237
|
+
else {
|
|
238
|
+
printInfo('\nSkipped post-install steps. Run the commands above manually when ready.');
|
|
239
|
+
}
|
|
240
|
+
}
|
|
241
|
+
/**
|
|
242
|
+
* Sparse-clone the platform repo (when --repo, or accepted via the interactive
|
|
243
|
+
* offer), repoint cwd into it, and verify the deploy entrypoint exists. Owns the
|
|
244
|
+
* cwd/bootstrapped state. Sets exitCode on a hard failure (clone error / missing
|
|
245
|
+
* entrypoint), matching the old inline behavior; a plain decline leaves exitCode
|
|
246
|
+
* untouched. Returns ok:false when the caller must abort.
|
|
247
|
+
*/
|
|
248
|
+
export async function bootstrapAndLocate(spec, bootstrap, bootstrapCmd, sparsePaths, startCwd, opts) {
|
|
249
|
+
let cwd = startCwd;
|
|
250
|
+
let bootstrapped = false;
|
|
251
|
+
// Shared by `--repo` and the interactive offer. Repoints cwd + sets bootstrapped;
|
|
252
|
+
// `bootstrapped` records whether we created the clone (vs. an existing checkout) —
|
|
253
|
+
// only then can the caller additively sparse-fetch load folders.
|
|
254
|
+
const bootstrapClone = async () => {
|
|
255
|
+
const cmd = bootstrapCommand(bootstrap);
|
|
256
|
+
printSection('Bootstrap');
|
|
257
|
+
printInfo(cmd);
|
|
258
|
+
const { code } = await runScript(cmd, cwd, { capture: false });
|
|
259
|
+
if (code !== 0) {
|
|
260
|
+
printError(`\nThe clone didn't finish (exit ${code}). Double-check the repo URL / ref (or your network) and give it another go.`);
|
|
261
|
+
process.exitCode = 1;
|
|
262
|
+
return false;
|
|
263
|
+
}
|
|
264
|
+
cwd = path.resolve(cwd, bootstrap.workdir);
|
|
265
|
+
bootstrapped = true;
|
|
266
|
+
printSuccess(`Repo is ready — continuing from ${cwd}`);
|
|
267
|
+
const absent = sparsePaths.filter((p) => !existsSync(path.join(cwd, p)));
|
|
268
|
+
if (absent.length > 0) {
|
|
269
|
+
printError(`\nThe sparse clone is missing ${absent.join(', ')} — that ref may not have those folders. Try a different --ref.`);
|
|
270
|
+
process.exitCode = 1;
|
|
271
|
+
return false;
|
|
272
|
+
}
|
|
273
|
+
return true;
|
|
274
|
+
};
|
|
275
|
+
// `--repo`: clone up front (must precede the entrypoint check).
|
|
276
|
+
if (bootstrapCmd) {
|
|
277
|
+
printInfo(`\nBootstrap → clone ${bootstrap.repo} @ ${bootstrap.ref} into ${bootstrap.workdir} (sparse).`);
|
|
278
|
+
if (!(await confirm('Go ahead with the clone?', opts.yes ?? false))) {
|
|
279
|
+
printWarning('No problem — nothing was changed. Re-run whenever you\'re ready.');
|
|
280
|
+
return { cwd, bootstrapped, ok: false };
|
|
281
|
+
}
|
|
282
|
+
if (!(await bootstrapClone()))
|
|
283
|
+
return { cwd, bootstrapped, ok: false };
|
|
284
|
+
}
|
|
285
|
+
// The deploy entrypoint must exist relative to cwd. If it doesn't and we haven't
|
|
286
|
+
// bootstrapped, gracefully OFFER to clone (interactive only) so a fresh machine can
|
|
287
|
+
// proceed without re-running with --repo.
|
|
288
|
+
if (!entrypointExists(spec, cwd)) {
|
|
289
|
+
const interactive = Boolean(process.stdin.isTTY) && !opts.yes;
|
|
290
|
+
if (!bootstrapCmd && interactive && gitAvailable()) {
|
|
291
|
+
printInfo(`\nLooks like you're not inside a pipeline-builder checkout, so the ${spec.label} deploy scripts aren't here yet.`);
|
|
292
|
+
if (await confirm(`Want me to sparse-clone them into ${bootstrap.workdir} and keep going?`, false)) {
|
|
293
|
+
if (!(await bootstrapClone()))
|
|
294
|
+
return { cwd, bootstrapped, ok: false };
|
|
295
|
+
}
|
|
296
|
+
}
|
|
297
|
+
if (!entrypointExists(spec, cwd)) {
|
|
298
|
+
printWarning(`\nI couldn't find ${spec.dir}/${spec.entrypoint} from ${cwd}.`);
|
|
299
|
+
printInfo('Two easy ways forward:');
|
|
300
|
+
printInfo(' • cd into your pipeline-builder checkout and re-run, or');
|
|
301
|
+
printInfo(` • add --repo and I'll bootstrap a fresh sparse clone for you${gitAvailable() ? '.' : ' (once git is installed).'}`);
|
|
302
|
+
process.exitCode = 1;
|
|
303
|
+
return { cwd, bootstrapped, ok: false };
|
|
304
|
+
}
|
|
305
|
+
}
|
|
306
|
+
return { cwd, bootstrapped, ok: true };
|
|
307
|
+
}
|
|
308
|
+
/**
|
|
309
|
+
* Interactive opt-in loads, offered AFTER the clone (so we only ask once the operator
|
|
310
|
+
* has agreed to proceed). Prompts per load, additively sparse-fetches the picked
|
|
311
|
+
* folders into a bootstrapped sparse clone, then re-resolves the post-install steps
|
|
312
|
+
* with the selections. Returns the chosen ids + the recomputed steps.
|
|
313
|
+
*/
|
|
314
|
+
export async function resolveLoadsInteractively(target, url, region, cwd, bootstrapped, bootstrap, postStepFlags) {
|
|
315
|
+
const prompts = {
|
|
316
|
+
plugins: 'Load plugins?',
|
|
317
|
+
samples: 'Load sample pipelines?',
|
|
318
|
+
compliance: 'Load compliance rules?',
|
|
319
|
+
};
|
|
320
|
+
printSection('Optional post-install loads');
|
|
321
|
+
const chosen = [];
|
|
322
|
+
for (const s of LOAD_STEPS) {
|
|
323
|
+
if (await confirm(prompts[s.id] ?? `Load ${s.id}?`, false))
|
|
324
|
+
chosen.push(s.id);
|
|
325
|
+
}
|
|
326
|
+
// Additive sparse re-sync: materialize ONLY the picked loads' folders (the partial
|
|
327
|
+
// clone fetches their blobs on demand). Only when we created a SPARSE clone — a
|
|
328
|
+
// normal checkout already has every folder, and the git<2.27 full-clone fallback
|
|
329
|
+
// (bootstrap.full) is non-sparse, where `sparse-checkout add` would switch it to
|
|
330
|
+
// cone mode and PRUNE the already-materialized deploy folders.
|
|
331
|
+
if (bootstrapped && !bootstrap.full) {
|
|
332
|
+
const absent = sparsePathsFor(target, chosen).filter((p) => !existsSync(path.join(cwd, p)));
|
|
333
|
+
if (absent.length > 0) {
|
|
334
|
+
printSection('Fetching selected load folders');
|
|
335
|
+
const addCmd = `git sparse-checkout add ${absent.map((p) => `'${p}'`).join(' ')} && git checkout '${bootstrap.ref}'`;
|
|
336
|
+
printInfo(addCmd);
|
|
337
|
+
const { code } = await runScript(addCmd, cwd, { capture: false });
|
|
338
|
+
if (code !== 0) {
|
|
339
|
+
printWarning(`Couldn't fetch ${absent.join(', ')} — the matching load step(s) may fail. Re-run with --repo to refresh the clone.`);
|
|
340
|
+
}
|
|
341
|
+
}
|
|
342
|
+
}
|
|
343
|
+
const resolved = resolvePostSteps({
|
|
344
|
+
target,
|
|
345
|
+
url,
|
|
346
|
+
region,
|
|
347
|
+
enabledLoadIds: chosen,
|
|
348
|
+
...postStepFlags,
|
|
349
|
+
buildBootstrap: postStepFlags.buildBootstrap || chosen.includes('plugins'),
|
|
350
|
+
});
|
|
351
|
+
return { enabledLoadIds: chosen, steps: resolved.steps, skipped: resolved.skipped };
|
|
352
|
+
}
|
|
47
353
|
/**
|
|
48
354
|
* Redact secret param values (e.g. the ghcr token) from captured deploy output
|
|
49
355
|
* before it is sent to the LLM for diagnosis. The deploy runs with secrets
|
|
@@ -218,44 +524,9 @@ export function provision(program) {
|
|
|
218
524
|
}
|
|
219
525
|
const spec = TARGETS[target];
|
|
220
526
|
let cwd = process.cwd();
|
|
221
|
-
// 4b. Teardown mode — the destroy counterpart of provisioning
|
|
222
|
-
// than deploy: AWS targets are irreversible, so we require the operator to
|
|
223
|
-
// TYPE the target id (--force bypasses for CI; --yes alone does NOT).
|
|
527
|
+
// 4b. Teardown mode — the destroy counterpart of provisioning (see runTeardown).
|
|
224
528
|
if (options.teardown) {
|
|
225
|
-
|
|
226
|
-
stackName: options.stackName,
|
|
227
|
-
region: options.region,
|
|
228
|
-
// Our typed gate IS the confirmation — forward --yes so the native
|
|
229
|
-
// script (Fargate) doesn't also block on stdin we're inheriting.
|
|
230
|
-
assumeYes: true,
|
|
231
|
-
});
|
|
232
|
-
if (options.json) {
|
|
233
|
-
console.log(JSON.stringify({ success: true, executionId, target, teardown: true, destructive, destroys: spec.destroys, command: downCommand }, null, 2));
|
|
234
|
-
return;
|
|
235
|
-
}
|
|
236
|
-
printSection(`Teardown plan — ${spec.label}`);
|
|
237
|
-
printKeyValue({ 'Target': target, 'Destroys': spec.destroys, 'Stops cost': spec.cost });
|
|
238
|
-
printSection('Command to run');
|
|
239
|
-
printInfo(downCommand);
|
|
240
|
-
if (destructive && !options.force) {
|
|
241
|
-
const token = await ask(`\nThis is IRREVERSIBLE. Type "${target}" to confirm teardown: `);
|
|
242
|
-
if (token !== target) {
|
|
243
|
-
printWarning('That didn\'t match, so nothing was destroyed — you have to type the exact target id to confirm.');
|
|
244
|
-
return;
|
|
245
|
-
}
|
|
246
|
-
}
|
|
247
|
-
else if (!destructive && !options.force && !(await confirm('\nProceed with teardown (stops the stack; on-disk data persists)?', options.yes))) {
|
|
248
|
-
printWarning('No problem — nothing was changed.');
|
|
249
|
-
return;
|
|
250
|
-
}
|
|
251
|
-
printSection('Tearing down');
|
|
252
|
-
const { code: downCode } = await runScript(downCommand, cwd, { capture: false });
|
|
253
|
-
if (downCode !== 0) {
|
|
254
|
-
printError(`\nTeardown failed (exit ${downCode}). Inspect the stack/containers and retry.`);
|
|
255
|
-
process.exitCode = 1;
|
|
256
|
-
return;
|
|
257
|
-
}
|
|
258
|
-
printSuccess('Teardown complete.');
|
|
529
|
+
await runTeardown(spec, target, cwd, executionId, options);
|
|
259
530
|
return;
|
|
260
531
|
}
|
|
261
532
|
// Make previously-fetched single-binary tools (e.g. yq) visible to the
|
|
@@ -323,28 +594,6 @@ export function provision(program) {
|
|
|
323
594
|
for (const s of skippedSteps)
|
|
324
595
|
printWarning(`skipped ${s.id}: ${s.reason}`);
|
|
325
596
|
}
|
|
326
|
-
// 5b. Host-port pre-flight (local/minikube only). The deploy binds fixed host
|
|
327
|
-
// ports (Docker publish / kubectl port-forward); if one is taken, a container
|
|
328
|
-
// or forward fails to bind mid-deploy — and for the gateway that surfaces as a
|
|
329
|
-
// silent "/health never reachable" hang. Stop NOW with a summary instead of
|
|
330
|
-
// failing halfway. Remote targets (ec2/fargate) bind nothing locally → skipped.
|
|
331
|
-
if (spec.hostPorts.length > 0) {
|
|
332
|
-
const portChecks = await checkHostPorts(spec);
|
|
333
|
-
const taken = portChecks.filter((c) => !c.available);
|
|
334
|
-
printSection('Port availability');
|
|
335
|
-
for (const c of portChecks)
|
|
336
|
-
printInfo(`${c.available ? '✓' : '✗'} ${String(c.port).padEnd(5)} — ${c.service}`);
|
|
337
|
-
if (taken.length > 0) {
|
|
338
|
-
printError(`\n${taken.length} required port(s) already in use — the deploy can't bind them and would fail mid-way. Free them and re-run:`);
|
|
339
|
-
for (const c of taken)
|
|
340
|
-
printInfo(` • port ${c.port} (${c.service}) — find the holder: lsof -i :${c.port}`);
|
|
341
|
-
if (taken.some((c) => c.port === 5000)) {
|
|
342
|
-
printInfo(' Note: on macOS, port 5000 is usually AirPlay Receiver — System Settings → General → AirDrop & Handoff → AirPlay Receiver (off).');
|
|
343
|
-
}
|
|
344
|
-
process.exitCode = 1;
|
|
345
|
-
return;
|
|
346
|
-
}
|
|
347
|
-
}
|
|
348
597
|
// 6. Any missing required prereq that's a single static binary (e.g. yq)
|
|
349
598
|
// can be fetched into the tools cache instead of a system install — no
|
|
350
599
|
// brew/apt. Offer it, then re-check (the cache dir is already on PATH).
|
|
@@ -368,103 +617,35 @@ export function provision(program) {
|
|
|
368
617
|
process.exitCode = 1;
|
|
369
618
|
return;
|
|
370
619
|
}
|
|
371
|
-
//
|
|
372
|
-
//
|
|
373
|
-
//
|
|
374
|
-
|
|
375
|
-
|
|
376
|
-
|
|
377
|
-
const bootstrapClone = async () => {
|
|
378
|
-
const cmd = bootstrapCommand(bootstrap);
|
|
379
|
-
printSection('Bootstrap');
|
|
380
|
-
printInfo(cmd);
|
|
381
|
-
const { code } = await runScript(cmd, cwd, { capture: false });
|
|
382
|
-
if (code !== 0) {
|
|
383
|
-
printError(`\nThe clone didn't finish (exit ${code}). Double-check the repo URL / ref (or your network) and give it another go.`);
|
|
384
|
-
process.exitCode = 1;
|
|
385
|
-
return false;
|
|
386
|
-
}
|
|
387
|
-
cwd = path.resolve(cwd, bootstrap.workdir);
|
|
388
|
-
bootstrapped = true;
|
|
389
|
-
printSuccess(`Repo is ready — continuing from ${cwd}`);
|
|
390
|
-
const absent = sparsePaths.filter((p) => !existsSync(path.join(cwd, p)));
|
|
391
|
-
if (absent.length > 0) {
|
|
392
|
-
printError(`\nThe sparse clone is missing ${absent.join(', ')} — that ref may not have those folders. Try a different --ref.`);
|
|
393
|
-
process.exitCode = 1;
|
|
394
|
-
return false;
|
|
395
|
-
}
|
|
396
|
-
return true;
|
|
397
|
-
};
|
|
398
|
-
// `--repo`: clone up front (must precede the entrypoint check).
|
|
399
|
-
if (bootstrapCmd) {
|
|
400
|
-
printInfo(`\nBootstrap → clone ${bootstrap.repo} @ ${bootstrap.ref} into ${bootstrap.workdir} (sparse).`);
|
|
401
|
-
if (!(await confirm('Go ahead with the clone?', options.yes))) {
|
|
402
|
-
printWarning('No problem — nothing was changed. Re-run whenever you\'re ready.');
|
|
403
|
-
return;
|
|
404
|
-
}
|
|
405
|
-
if (!(await bootstrapClone()))
|
|
406
|
-
return;
|
|
620
|
+
// Commit gate — confirm BEFORE any side effect (clone, .env, deploy) so a "No"
|
|
621
|
+
// leaves nothing behind. The port check + optional loads + .env below are part of
|
|
622
|
+
// executing the agreed-to plan.
|
|
623
|
+
if (!(await confirm(`\nProceed with provisioning ${spec.label}?`, options.yes))) {
|
|
624
|
+
printWarning('No problem — nothing was changed.');
|
|
625
|
+
return;
|
|
407
626
|
}
|
|
408
|
-
// 7b.
|
|
409
|
-
//
|
|
410
|
-
|
|
411
|
-
|
|
412
|
-
|
|
413
|
-
|
|
414
|
-
|
|
415
|
-
|
|
416
|
-
|
|
417
|
-
|
|
418
|
-
|
|
419
|
-
|
|
420
|
-
|
|
421
|
-
printWarning(`\nI couldn't find ${spec.dir}/${spec.entrypoint} from ${cwd}.`);
|
|
422
|
-
printInfo('Two easy ways forward:');
|
|
423
|
-
printInfo(' • cd into your pipeline-builder checkout and re-run, or');
|
|
424
|
-
printInfo(` • add --repo and I'll bootstrap a fresh sparse clone for you${gitAvailable() ? '.' : ' (once git is installed).'}`);
|
|
425
|
-
process.exitCode = 1;
|
|
426
|
-
return;
|
|
427
|
-
}
|
|
627
|
+
// 7a/7b. Sparse-clone (if --repo or accepted interactively) + locate the deploy
|
|
628
|
+
// entrypoint, repointing cwd into the clone. See bootstrapAndLocate.
|
|
629
|
+
const located = await bootstrapAndLocate(spec, bootstrap, bootstrapCmd, sparsePaths, cwd, options);
|
|
630
|
+
cwd = located.cwd;
|
|
631
|
+
const bootstrapped = located.bootstrapped;
|
|
632
|
+
if (!located.ok)
|
|
633
|
+
return;
|
|
634
|
+
// Host-port pre-flight — now that the deploy source is on disk (post-clone),
|
|
635
|
+
// derive the ports from it (compose / setup.sh) and stop on a fatal conflict
|
|
636
|
+
// before deploying. See preflightPorts.
|
|
637
|
+
if (!(await preflightPorts(spec, target, cwd))) {
|
|
638
|
+
process.exitCode = 1;
|
|
639
|
+
return;
|
|
428
640
|
}
|
|
429
|
-
// Opt-in loads — offered AFTER the clone (
|
|
430
|
-
//
|
|
431
|
-
//
|
|
641
|
+
// Opt-in loads — offered AFTER the clone (see resolveLoadsInteractively); it
|
|
642
|
+
// prompts, additively sparse-fetches the picked folders, and re-resolves the
|
|
643
|
+
// post-install steps with the selections.
|
|
432
644
|
if (willPromptLoads) {
|
|
433
|
-
const
|
|
434
|
-
|
|
435
|
-
|
|
436
|
-
|
|
437
|
-
};
|
|
438
|
-
printSection('Optional post-install loads');
|
|
439
|
-
const chosen = [];
|
|
440
|
-
for (const s of LOAD_STEPS) {
|
|
441
|
-
if (await confirm(prompts[s.id] ?? `Load ${s.id}?`, false))
|
|
442
|
-
chosen.push(s.id);
|
|
443
|
-
}
|
|
444
|
-
enabledLoadIds = chosen;
|
|
445
|
-
// Additive sparse re-sync: materialize ONLY the picked loads' folders in
|
|
446
|
-
// the clone (the partial clone fetches their blobs on demand). Only when we
|
|
447
|
-
// created the clone — a normal checkout already has every folder.
|
|
448
|
-
if (bootstrapped) {
|
|
449
|
-
const absent = sparsePathsFor(target, enabledLoadIds).filter((p) => !existsSync(path.join(cwd, p)));
|
|
450
|
-
if (absent.length > 0) {
|
|
451
|
-
printSection('Fetching selected load folders');
|
|
452
|
-
const addCmd = `git sparse-checkout add ${absent.map((p) => `'${p}'`).join(' ')} && git checkout '${bootstrap.ref}'`;
|
|
453
|
-
printInfo(addCmd);
|
|
454
|
-
const { code } = await runScript(addCmd, cwd, { capture: false });
|
|
455
|
-
if (code !== 0) {
|
|
456
|
-
printWarning(`Couldn't fetch ${absent.join(', ')} — the matching load step(s) may fail. Re-run with --repo to refresh the clone.`);
|
|
457
|
-
}
|
|
458
|
-
}
|
|
459
|
-
}
|
|
460
|
-
({ steps: postSteps, skipped: skippedSteps } = resolvePostSteps({
|
|
461
|
-
target,
|
|
462
|
-
url,
|
|
463
|
-
region: typeof params.region === 'string' ? params.region : undefined,
|
|
464
|
-
enabledLoadIds,
|
|
465
|
-
...postStepFlags,
|
|
466
|
-
buildBootstrap: postStepFlags.buildBootstrap || enabledLoadIds.includes('plugins'),
|
|
467
|
-
}));
|
|
645
|
+
const loaded = await resolveLoadsInteractively(target, url, typeof params.region === 'string' ? params.region : undefined, cwd, bootstrapped, bootstrap, postStepFlags);
|
|
646
|
+
enabledLoadIds = loaded.enabledLoadIds;
|
|
647
|
+
postSteps = loaded.steps;
|
|
648
|
+
skippedSteps = loaded.skipped;
|
|
468
649
|
}
|
|
469
650
|
// local/minikube's setup.sh REQUIRES a `.env` and aborts without it — create
|
|
470
651
|
// it from .env.example with generated secrets so the deploy is non-interactive.
|
|
@@ -480,57 +661,8 @@ export function provision(program) {
|
|
|
480
661
|
printWarning('Continuing without .env — setup.sh will abort if it stays missing.');
|
|
481
662
|
}
|
|
482
663
|
}
|
|
483
|
-
|
|
484
|
-
|
|
485
|
-
return;
|
|
486
|
-
}
|
|
487
|
-
// 7c. Run the deploy out-of-loop (real command, secrets unmasked, streamed +
|
|
488
|
-
// captured), with a bounded auto-fix + retry loop — the deploy scripts are
|
|
489
|
-
// idempotent, so a fixed re-run resumes rather than starting over.
|
|
490
|
-
const maxAttempts = 1 + Math.max(0, parseInt(options.retries, 10) || 0);
|
|
491
|
-
let runParams = params;
|
|
492
|
-
let succeeded = false;
|
|
493
|
-
for (let attempt = 1; attempt <= maxAttempts; attempt++) {
|
|
494
|
-
const realCommand = assembleCommand(spec, runParams, { mask: false }).command;
|
|
495
|
-
printSection(attempt === 1 ? 'Deploying' : `Deploying — retry ${attempt - 1}`);
|
|
496
|
-
if (attempt === 1) {
|
|
497
|
-
printInfo(`Deploying ${spec.label} → ${url}`);
|
|
498
|
-
printInfo(spec.deploys);
|
|
499
|
-
printInfo('Streaming the deploy below — first run is the slow one (image pulls + cert generation).');
|
|
500
|
-
}
|
|
501
|
-
const { code, tail } = await runScript(realCommand, cwd, { capture: true });
|
|
502
|
-
if (code === 0) {
|
|
503
|
-
succeeded = true;
|
|
504
|
-
break;
|
|
505
|
-
}
|
|
506
|
-
printError(`\nDeploy failed (exit ${code}).`);
|
|
507
|
-
const issues = matchIssues(tail);
|
|
508
|
-
if (issues.length > 0) {
|
|
509
|
-
printSection('Likely cause');
|
|
510
|
-
for (const i of issues)
|
|
511
|
-
printInfo(`• ${i.cause}\n → ${i.suggestion}`);
|
|
512
|
-
}
|
|
513
|
-
if (isAiConfigured(aiOpts)) {
|
|
514
|
-
const diagnosis = await diagnoseFailure(redactSecrets(tail, spec, runParams), aiOpts);
|
|
515
|
-
if (diagnosis) {
|
|
516
|
-
printSection('Diagnosis');
|
|
517
|
-
printInfo(diagnosis);
|
|
518
|
-
}
|
|
519
|
-
}
|
|
520
|
-
if (attempt >= maxAttempts)
|
|
521
|
-
break;
|
|
522
|
-
// Auto-fix: a retryable issue with a param we haven't already applied.
|
|
523
|
-
const fix = issues.find((i) => i.retryable && i.paramFix && runParams[i.paramFix.key] !== i.paramFix.value);
|
|
524
|
-
if (fix?.paramFix && await confirm(`\nApply fix and retry — ${fix.suggestion}`, options.yes)) {
|
|
525
|
-
runParams = { ...runParams, [fix.paramFix.key]: fix.paramFix.value };
|
|
526
|
-
continue;
|
|
527
|
-
}
|
|
528
|
-
// Retryable but no param change (e.g. ACM DNS propagation) — offer a plain re-run.
|
|
529
|
-
if (!fix && issues.some((i) => i.retryable) && await confirm('\nRetry the deploy (it is idempotent and will resume)?', options.yes)) {
|
|
530
|
-
continue;
|
|
531
|
-
}
|
|
532
|
-
break;
|
|
533
|
-
}
|
|
664
|
+
// 7c. Run the deploy with a bounded auto-fix + retry loop (see runDeployWithRetry).
|
|
665
|
+
const { succeeded, runParams } = await runDeployWithRetry(spec, url, cwd, params, aiOpts, options);
|
|
534
666
|
if (!succeeded) {
|
|
535
667
|
process.exitCode = 1;
|
|
536
668
|
return;
|
|
@@ -556,58 +688,14 @@ export function provision(program) {
|
|
|
556
688
|
}
|
|
557
689
|
printInfo(`Polling ${url}/health …`);
|
|
558
690
|
const health = await waitHealthy(url, { onTick: (m) => printInfo(m) });
|
|
559
|
-
|
|
691
|
+
// Green only when fully ready; a "health OK but /ready never came" proceed-
|
|
692
|
+
// anyway state is healthy:true but degraded → warn so it doesn't read as done.
|
|
693
|
+
(health.healthy && health.ready ? printSuccess : printWarning)(`${health.url} — ${health.detail}`);
|
|
560
694
|
}
|
|
561
695
|
// 7f. Post-install steps (register + opt-in loads, smoke test, events, custom).
|
|
562
|
-
//
|
|
563
|
-
//
|
|
564
|
-
|
|
565
|
-
for (const s of skippedSteps)
|
|
566
|
-
printWarning(`Skipped post-step ${s.id}: ${s.reason}`);
|
|
567
|
-
const isRemoteRegister = (id) => id === 'register' && (target === 'ec2' || target === 'fargate');
|
|
568
|
-
const runnable = postSteps.filter((s) => !isRemoteRegister(s.id));
|
|
569
|
-
for (const s of postSteps) {
|
|
570
|
-
if (isRemoteRegister(s.id)) {
|
|
571
|
-
printInfo('\nNext (run from inside the VPC): register admin + load plugins —');
|
|
572
|
-
printInfo(` ${s.command}`);
|
|
573
|
-
}
|
|
574
|
-
}
|
|
575
|
-
if (runnable.length > 0 && await confirm(`\nRun ${runnable.length} post-install step(s) now?`, options.yes)) {
|
|
576
|
-
for (const s of runnable) {
|
|
577
|
-
printSection(`Post-step: ${s.label}`);
|
|
578
|
-
// Steps that log into the platform (register + store-token) need the
|
|
579
|
-
// admin creds (PLATFORM_IDENTIFIER / PLATFORM_PASSWORD) on top of their
|
|
580
|
-
// own step env. setup-events does NOT log in — it reads PLATFORM_SECRET_NAME,
|
|
581
|
-
// AWS creds, and the region from the AWS environment — so it's excluded.
|
|
582
|
-
const needsCreds = s.id === 'register' || s.id === 'store-token';
|
|
583
|
-
const env = needsCreds ? { ...s.env, ...adminEnv } : s.env;
|
|
584
|
-
// These steps (plugin/sample/compliance loads, smoke, events) are noisy
|
|
585
|
-
// and non-interactive, so run them QUIETLY — capture the output and only
|
|
586
|
-
// surface it on failure. The exception is a register with no admin creds:
|
|
587
|
-
// init-platform.sh prompts for them, so it must stream to the terminal.
|
|
588
|
-
const interactiveRegister = s.id === 'register' && !adminEnv.PLATFORM_IDENTIFIER;
|
|
589
|
-
const quiet = !interactiveRegister;
|
|
590
|
-
if (quiet)
|
|
591
|
-
printInfo(`${s.command}\n …running (output shown only if it fails)`);
|
|
592
|
-
else
|
|
593
|
-
printInfo(s.command);
|
|
594
|
-
const { code, tail } = await runScript(s.command, cwd, { quiet, capture: false, env });
|
|
595
|
-
if (code !== 0) {
|
|
596
|
-
if (quiet && tail) {
|
|
597
|
-
printError('\n--- last output ---');
|
|
598
|
-
printInfo(tail);
|
|
599
|
-
}
|
|
600
|
-
printError(`\nPost-step '${s.id}' failed (exit ${code}). The platform is deployed; fix and re-run the step manually.`);
|
|
601
|
-
process.exitCode = 1;
|
|
602
|
-
break;
|
|
603
|
-
}
|
|
604
|
-
printSuccess(`${s.id} ✓`);
|
|
605
|
-
}
|
|
606
|
-
}
|
|
607
|
-
else if (runnable.length > 0) {
|
|
608
|
-
printInfo('\nSkipped post-install steps. Run the commands above manually when ready.');
|
|
609
|
-
}
|
|
610
|
-
}
|
|
696
|
+
// See runPostSteps — it surfaces register + the events bundle as manual in-VPC
|
|
697
|
+
// next-steps on EC2/Fargate instead of auto-running (and failing) them locally.
|
|
698
|
+
await runPostSteps(postSteps, skippedSteps, target, cwd, adminEnv, { yes: options.yes, autoRun: willPromptLoads });
|
|
611
699
|
}
|
|
612
700
|
catch (error) {
|
|
613
701
|
handleError(error, ERROR_CODES.GENERAL, {
|
|
@@ -618,4 +706,4 @@ export function provision(program) {
|
|
|
618
706
|
}
|
|
619
707
|
});
|
|
620
708
|
}
|
|
621
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJvdmlzaW9uLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2NvbW1hbmRzL3Byb3Zpc2lvbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSwrQ0FBK0M7QUFDL0Msc0NBQXNDO0FBRXRDLE9BQU8sRUFBRSxZQUFZLEVBQUUsVUFBVSxFQUFFLE1BQU0sSUFBSSxDQUFDO0FBQzlDLE9BQU8sS0FBSyxJQUFJLE1BQU0sV0FBVyxDQUFDO0FBQ2xDLE9BQU8sS0FBSyxRQUFRLE1BQU0sd0JBQXdCLENBQUM7QUFDbkQsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLFdBQVcsQ0FBQztBQUNwQyxPQUFPLEVBQUUsZUFBZSxFQUFFLGNBQWMsRUFBRSxTQUFTLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUM1RSxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUMzRSxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsZ0JBQWdCLEVBQUUsU0FBUyxFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFDckYsT0FBTyxFQUFFLGVBQWUsRUFBRSxXQUFXLEVBQUUscUJBQXFCLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUN6RixPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFDbkQsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDMUQsT0FBTyxFQUFFLFlBQVksRUFBRSxZQUFZLEVBQUUseUJBQXlCLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUM5RyxPQUFPLEVBQUUsU0FBUyxFQUFFLFNBQVMsRUFBRSxXQUFXLEVBQUUsZUFBZSxFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFDdkYsT0FBTyxFQUFFLGFBQWEsRUFBRSxjQUFjLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUNyRSxPQUFPLEVBQ0wsZUFBZSxFQUNmLFVBQVUsRUFDVixVQUFVLEVBQ1Ys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QUFNO3dCQUNSLENBQUM7d0JBQ0QsWUFBWSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUM7b0JBQzVCLENBQUM7Z0JBQ0gsQ0FBQztxQkFBTSxJQUFJLFFBQVEsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFLENBQUM7b0JBQy9CLFNBQVMsQ0FBQywyRUFBMkUsQ0FBQyxDQUFDO2dCQUN6RixDQUFDO1lBQ0gsQ0FBQztRQUNILENBQUM7UUFBQyxPQUFPLEtBQUssRUFBRSxDQUFDO1lBQ2YsV0FBVyxDQUFDLEtBQUssRUFBRSxXQUFXLENBQUMsT0FBTyxFQUFFO2dCQUN0QyxLQUFLLEVBQUUsT0FBTyxDQUFDLElBQUksRUFBRSxDQUFDLEtBQUs7Z0JBQzNCLElBQUksRUFBRSxJQUFJO2dCQUNWLE9BQU8sRUFBRSxFQUFFLE9BQU8sRUFBRSxXQUFXLEVBQUUsV0FBVyxFQUFFO2FBQy9DLENBQUMsQ0FBQztRQUNMLENBQUM7SUFDSCxDQUFDLENBQUMsQ0FBQztBQUNQLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBDb3B5cmlnaHQgMjAyNiBQaXBlbGluZSBCdWlsZGVyIENvbnRyaWJ1dG9yc1xuLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjBcblxuaW1wb3J0IHsgcmVhZEZpbGVTeW5jLCBleGlzdHNTeW5jIH0gZnJvbSAnZnMnO1xuaW1wb3J0ICogYXMgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuaW1wb3J0ICogYXMgcmVhZGxpbmUgZnJvbSAnbm9kZTpyZWFkbGluZS9wcm9taXNlcyc7XG5pbXBvcnQgeyBDb21tYW5kIH0gZnJvbSAnY29tbWFuZGVyJztcbmltcG9ydCB7IGRpYWdub3NlRmFpbHVyZSwgaXNBaUNvbmZpZ3VyZWQsIHBhcnNlR29hbCB9IGZyb20gJy4uL2FnZW50L2FpLmpzJztcbmltcG9ydCB7IGJvb3RzdHJhcENvbW1hbmQsIHJlc29sdmVCb290c3RyYXAgfSBmcm9tICcuLi9hZ2VudC9ib290c3RyYXAuanMnO1xuaW1wb3J0IHsgZW50cnlwb2ludEV4aXN0cywgZXhlY3V0aW9uQmxvY2tlZCwgcnVuU2NyaXB0IH0gZnJvbSAnLi4vYWdlbnQvZXhlY3V0b3IuanMnO1xuaW1wb3J0IHsgZGVyaXZlSGVhbHRoVXJsLCB3YWl0SGVhbHRoeSwgZW5zdXJlTWluaWt1YmVHYXRld2F5IH0gZnJvbSAnLi4vYWdlbnQvaGVhbHRoLmpzJztcbmltcG9ydCB7IGNoZWNrSG9zdFBvcnRzIH0gZnJvbSAnLi4vYWdlbnQvcG9ydHMuanMnO1xuaW1wb3J0IHsgcmVzb2x2ZVBvc3RTdGVwcyB9IGZyb20gJy4uL2FnZW50L3Bvc3Qtc3RlcHMuanMnO1xuaW1wb3J0IHsgY2hlY2tQcmVyZXFzLCBnaXRBdmFpbGFibGUsIGdpdFN1cHBvcnRzU3BhcnNlQ2hlY2tvdXQsIHByZXJlcXNTYXRpc2ZpZWQgfSBmcm9tICcuLi9hZ2VudC9wcmVyZXFzLmpzJztcbmltcG9ydCB7IFRPT0xTX0RJUiwgZmV0Y2hUb29sLCBpc0ZldGNoYWJsZSwgd2l0aFRvb2xzT25QYXRoIH0gZnJvbSAnLi4vYWdlbnQvdG9vbHMuanMnO1xuaW1wb3J0IHsgY3JlYXRlRW52RmlsZSwgZW52RmlsZU1pc3NpbmcgfSBmcm9tICcuLi9hZ2VudC9lbnYtZmlsZS5qcyc7XG5pbXBvcnQge1xuICBhc3NlbWJsZUNvbW1hbmQsXG4gIGlzVGFyZ2V0SWQsXG4gIExPQURfU1RFUFMsXG4gIHNwYXJzZVBhdGhzRm9yLFxuICBUQVJHRVRTLFxuICBUQVJHRVRfSURTLFxuICB0ZWFyZG93bkNvbW1hbmQsXG4gIHR5cGUgVGFyZ2V0SWQsXG4gIHR5cGUgVGFyZ2V0U3BlYyxcbn0gZnJvbSAnLi4vYWdlbnQvdGFyZ2V0cy5qcyc7XG5pbXBvcnQgeyBtYXRjaElzc3Vlcywgc2VzUG9zdERlcGxveUd1aWRhbmNlIH0gZnJvbSAnLi4vYWdlbnQvdHJvdWJsZXNob290LmpzJztcbmltcG9ydCB7IHByaW50Q29tbWFuZEhlYWRlciB9IGZyb20gJy4uL3V0aWxzL2NvbW1hbmQtdXRpbHMuanMnO1xuaW1wb3J0IHsgRVJST1JfQ09ERVMsIGhhbmRsZUVycm9yIH0gZnJvbSAnLi4vdXRpbHMvZXJyb3ItaGFuZGxlci5qcyc7XG5pbXBvcnQgeyBwcmludFNlY3Rpb24sIHByaW50S2V5VmFsdWUsIHByaW50SW5mbywgcHJpbnRXYXJuaW5nLCBwcmludEVycm9yLCBwcmludFN1Y2Nlc3MgfSBmcm9tICcuLi91dGlscy9vdXRwdXQtdXRpbHMuanMnO1xuXG4vKipcbiAqIFJlYWQgb25lIGxpbmUgb2YgdHJpbW1lZCBpbnB1dCBmcm9tIHRoZSB0ZXJtaW5hbCwgb3duaW5nIHRoZSByZWFkbGluZVxuICogbGlmZWN5Y2xlLiBVc2VkIGRpcmVjdGx5IGZvciB0aGUgZGVzdHJ1Y3RpdmUgdGVhcmRvd24gZ2F0ZSAoYSB5L04gaXMgdG9vIGVhc3lcbiAqIHRvIGZhdC1maW5nZXIsIHNvIHdlIHJlcXVpcmUgdGhlIG9wZXJhdG9yIHRvIFRZUEUgdGhlIHRhcmdldCBpZCBiYWNrKSwgYW5kIGFzXG4gKiB0aGUgYmFzaXMgZm9yIGBjb25maXJtYC4gRGVsaWJlcmF0ZWx5IGhhcyBubyBhdXRvLWFjY2VwdC5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gYXNrKHF1ZXN0aW9uOiBzdHJpbmcpOiBQcm9taXNlPHN0cmluZz4ge1xuICBjb25zdCBybCA9IHJlYWRsaW5lLmNyZWF0ZUludGVyZmFjZSh7IGlucHV0OiBwcm9jZXNzLnN0ZGluLCBvdXRwdXQ6IHByb2Nlc3Muc3Rkb3V0IH0pO1xuICB0cnkge1xuICAgIHJldHVybiAoYXdhaXQgcmwucXVlc3Rpb24ocXVlc3Rpb24pKS50cmltKCk7XG4gIH0gZmluYWxseSB7XG4gICAgcmwuY2xvc2UoKTtcbiAgfVxufVxuXG4vKiogSW50ZXJhY3RpdmUgeS9OIGNvbmZpcm1hdGlvbjsgYXV0by10cnVlIHdoZW4gYGF1dG9ZZXNgICh0aGUgYC0teWVzYCBmbGFnKS4gKi9cbmFzeW5jIGZ1bmN0aW9uIGNvbmZpcm0ocXVlc3Rpb246IHN0cmluZywgYXV0b1llczogYm9vbGVhbik6IFByb21pc2U8Ym9vbGVhbj4ge1xuICBpZiAoYXV0b1llcykgcmV0dXJuIHRydWU7XG4gIGNvbnN0IGFuc3dlciA9IChhd2FpdCBhc2soYCR7cXVlc3Rpb259IFt5L05dIGApKS50b0xvd2VyQ2FzZSgpO1xuICByZXR1cm4gYW5zd2VyID09PSAneScgfHwgYW5zd2VyID09PSAneWVzJztcbn1cblxuLyoqIENvbW1hbmRlciBjb2xsZWN0b3I6IGFjY3VtdWxhdGUgcmVwZWF0ZWQgYC0tcG9zdC1zdGVwYCB2YWx1ZXMgaW4gb3JkZXIuICovXG5mdW5jdGlvbiBjb2xsZWN0U3RlcCh2YWx1ZTogc3RyaW5nLCBhY2M6IHN0cmluZ1tdKTogc3RyaW5nW10ge1xuICByZXR1cm4gWy4uLmFjYywgdmFsdWVdO1xufVxuXG4vKipcbiAqIFJlZGFjdCBzZWNyZXQgcGFyYW0gdmFsdWVzIChlLmcuIHRoZSBnaGNyIHRva2VuKSBmcm9tIGNhcHR1cmVkIGRlcGxveSBvdXRwdXRcbiAqIGJlZm9yZSBpdCBpcyBzZW50IHRvIHRoZSBMTE0gZm9yIGRpYWdub3Npcy4gVGhlIGRlcGxveSBydW5zIHdpdGggc2VjcmV0c1xuICogdW5tYXNrZWQsIHNvIGFsdGhvdWdoIHRoZSBjdXJyZW50IHNjcmlwdHMgZG9uJ3QgZWNobyB0aGVtLCB0aGlzIGtlZXBzIGEgZnV0dXJlXG4gKiBzY3JpcHQncyBzdHJheSBlY2hvIChvciBhIHZlcmJvc2Ugc3ViLXRvb2wpIGZyb20gY3Jvc3NpbmcgdGhlIHRoaXJkLXBhcnR5LUxMTVxuICogYm91bmRhcnkuXG4gKi9cbmZ1bmN0aW9uIHJlZGFjdFNlY3JldHModGV4dDogc3RyaW5nLCBzcGVjOiBUYXJnZXRTcGVjLCBwYXJhbXM6IFJlY29yZDxzdHJpbmcsIHVua25vd24+KTogc3RyaW5nIHtcbiAgbGV0IG91dCA9IHRleHQ7XG4gIGZvciAoY29uc3QgaW5wdXQgb2YgWy4uLnNwZWMucmVxdWlyZWQsIC4uLnNwZWMub3B0aW9uYWxdKSB7XG4gICAgaWYgKCFpbnB1dC5zZWNyZXQpIGNvbnRpbnVlO1xuICAgIGNvbnN0IHZhbHVlID0gcGFyYW1zW2lucHV0LmtleV07XG4gICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycgJiYgdmFsdWUubGVuZ3RoID49IDQpIG91dCA9IG91dC5zcGxpdCh2YWx1ZSkuam9pbignKioqJyk7XG4gIH1cbiAgcmV0dXJuIG91dDtcbn1cblxuLyoqXG4gKiBSZWdpc3RlcnMgdGhlIGBwcm92aXNpb25gIGNvbW1hbmQg4oCUIGFuIEFJLWFzc2lzdGVkIGluc3RhbGxlciBmb3IgdGhlIFBpcGVsaW5lXG4gKiBCdWlsZGVyIFBMQVRGT1JNIChsb2NhbC9taW5pa3ViZS9FQzIvRmFyZ2F0ZSkuIEl0IHByaW50cyB0aGUgYXNzZW1ibGVkIHBsYW5cbiAqIChwcmVyZXEgY2hlY2tzLCBOTC1nb2FsIHBhcnNpbmcsIGNvbW1hbmQgYXNzZW1ibHkpIGFuZCB0aGVuIERFUExPWVMsIGdhdGVkIGJ5XG4gKiBjb25maXJtYXRpb24gcHJvbXB0cyAoYC0teWVzYCB0byBhdXRvLWFjY2VwdDsgYC0tanNvbmAgaXMgdGhlIG9ubHkgbm9uLWV4ZWN1dGluZ1xuICogbW9kZSwgcHJpbnRpbmcgdGhlIHBsYW4gZm9yIHRvb2xpbmcpLiBXaXRoIGAtLXJlcG9gIGl0IGNhbiBib290c3RyYXAgYSBmcmVzaFxuICogbWFjaGluZSBieSBzcGFyc2VseSBjbG9uaW5nIG9ubHkgdGhlIGRlcGxveSBmb2xkZXJzIHRoZSBzZWxlY3RlZCB0YXJnZXQgK1xuICogb3B0aW9ucyBuZWVkLCB0aGVuIHJ1bnMgcG9zdC1pbnN0YWxsIHN0ZXBzIChyZWdpc3RlciBhZG1pbiwgb3B0LWluIGxvYWRzLFxuICogc21va2UgdGVzdCwgY3VzdG9tIGNvbW1hbmRzKS4gYC0tdGVhcmRvd25gIHJlbW92ZXMgYSBkZXBsb3ltZW50IGluc3RlYWQuXG4gKlxuICogQHBhcmFtIHByb2dyYW0gLSBUaGUgcm9vdCBDb21tYW5kZXIgcHJvZ3JhbSBpbnN0YW5jZSB0byBhdHRhY2ggdGhlIGNvbW1hbmQgdG8uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBwcm92aXNpb24ocHJvZ3JhbTogQ29tbWFuZCk6IHZvaWQge1xuICBwcm9ncmFtXG4gICAgLmNvbW1hbmQoJ3Byb3Zpc2lvbicpXG4gICAgLmRlc2NyaXB0aW9uKCdBSS1hc3Npc3RlZCBpbnN0YWxsZXIgZm9yIHRoZSBwbGF0Zm9ybSAobG9jYWwvbWluaWt1YmUvRUMyL0ZhcmdhdGUpOiBkZXBsb3lzIGl0IChnYXRlZCBieSBjb25maXJtYXRpb24gcHJvbXB0cyksIG9yIC0tdGVhcmRvd24gdG8gcmVtb3ZlJylcbiAgICAub3B0aW9uKCctdCwgLS10YXJnZXQgPHRhcmdldD4nLCBgRGVwbG95IHRhcmdldDogJHtUQVJHRVRfSURTLmpvaW4oJyB8ICcpfWApXG4gICAgLm9wdGlvbignLXAsIC0tcHJvbXB0IDx0ZXh0PicsICdOYXR1cmFsLWxhbmd1YWdlIGdvYWwgKHBhcnNlZCBpbnRvIHBhcmFtcyB3aGVuIGFuIEFJIGtleSBpcyBzZXQpJylcbiAgICAub3B0aW9uKCctLXJlZ2lvbiA8cmVnaW9uPicsICdBV1MgcmVnaW9uIChFQzIvRmFyZ2F0ZSknKVxuICAgIC5vcHRpb24oJy0tZG9tYWluIDxkb21haW4+JywgJ0Z1bGx5LXF1YWxpZmllZCBkb21haW4gbmFtZSAoRUMyL0ZhcmdhdGUpJylcbiAgICAub3B0aW9uKCctLWhvc3RlZC16b25lLWlkIDxpZD4nLCAnUHVibGljIFJvdXRlIDUzIGhvc3RlZCB6b25lIElEIChFQzIvRmFyZ2F0ZSknKVxuICAgIC5vcHRpb24oJy0tZGVwbG95LW1vZGUgPG1vZGU+JywgJ3B1YmxpYyB8IHByaXZhdGUgKEVDMi9GYXJnYXRlKScpXG4gICAgLm9wdGlvbignLS1rZXktcGFpciA8bmFtZT4nLCAnRUMyIGtleSBwYWlyIChFQzIpJylcbiAgICAub3B0aW9uKCctLWluc3RhbmNlLXR5cGUgPHR5cGU+JywgJ0VDMiBpbnN0YW5jZSB0eXBlIChFQzIpJylcbiAgICAub3B0aW9uKCctLWdoY3ItdG9rZW4gPHRva2VuPicsICdHaXRIdWIgUEFUIChyZWFkOnBhY2thZ2VzKSDigJQgbWFza2VkIGluIG91dHB1dCcpXG4gICAgLm9wdGlvbignLS1lbWFpbCcsICdFbmFibGUgU0VTIHRyYW5zYWN0aW9uYWwgZW1haWwgKG9uIGJ5IGRlZmF1bHQgZm9yIEFXUyknKVxuICAgIC5vcHRpb24oJy0tbm8tZW1haWwnLCAnU2tpcCBTRVMgKHRyYW5zYWN0aW9uYWwgZW1haWwgaXMgcHJvdmlzaW9uZWQgYnkgZGVmYXVsdCBvbiBBV1MpJylcbiAgICAub3B0aW9uKCctLWVtYWlsLWZyb20gPGFkZHI+JywgJ1NFUyBGcm9tIGFkZHJlc3MnKVxuICAgIC5vcHRpb24oJy0tZW1haWwtZnJvbS1uYW1lIDxuYW1lPicsICdTRVMgRnJvbSBkaXNwbGF5IG5hbWUnKVxuICAgIC5vcHRpb24oJy0tYWxlcnQtZW1haWwgPGFkZHI+JywgJ1N1YnNjcmliZSBhbiBhZGRyZXNzIHRvIHRoZSBib3VuY2UvY29tcGxhaW50IFNOUyB0b3BpYycpXG4gICAgLm9wdGlvbignLS1za2lwLXNlcy1pZGVudGl0eScsICdTa2lwIFNFUyBpZGVudGl0eSBjcmVhdGlvbiAoZG9tYWluIGFscmVhZHkgdmVyaWZpZWQpJylcbiAgICAub3B0aW9uKCctLWFpLXByb3ZpZGVyIDxwcm92aWRlcj4nLCAnQUkgcHJvdmlkZXIgKGFudGhyb3BpY3xvcGVuYWl8Z29vZ2xlfHhhaXxiZWRyb2NrKScpXG4gICAgLm9wdGlvbignLS1tb2RlbCA8bW9kZWw+JywgJ0FJIG1vZGVsIGlkJylcbiAgICAub3B0aW9uKCctLWRpYWdub3NlIDxmaWxlPicsICdEaWFnbm9zZSBhIENsb3VkRm9ybWF0aW9uL2RlcGxveSBmYWlsdXJlIGZyb20gYSBmaWxlIChuZWVkcyBhbiBBSSBrZXkpJylcbiAgICAub3B0aW9uKCcteSwgLS15ZXMnLCAnQXV0by1hY2NlcHQgYWxsIGNvbmZpcm1hdGlvbiBwcm9tcHRzIChmb3IgQ0kgLyBub24taW50ZXJhY3RpdmUpJywgZmFsc2UpXG4gICAgLm9wdGlvbignLS1yZXRyaWVzIDxuPicsICdBdXRvLWZpeCArIHJldHJ5IGF0dGVtcHRzIGFmdGVyIGEgZmFpbHVyZSAoZGVwbG95IHNjcmlwdHMgYXJlIGlkZW1wb3RlbnQpJywgJzEnKVxuICAgIC5vcHRpb24oJy0tdGVhcmRvd24nLCAnVGVhciBkb3duIGFuIGV4aXN0aW5nIGRlcGxveW1lbnQgaW5zdGVhZCBvZiBjcmVhdGluZyBvbmUgKGdhdGVkOyBBV1MgdGFyZ2V0cyByZXF1aXJlIGEgdHlwZWQgY29uZmlybWF0aW9uKScsIGZhbHNlKVxuICAgIC5vcHRpb24oJy0tc3RhY2stbmFtZSA8bmFtZT4nLCAnU3RhY2sgbmFtZSAoRUMyKSAvIHN0YWNrIHByZWZpeCAoRmFyZ2F0ZSkgdG8gdGVhciBkb3duIOKAlCBkZWZhdWx0cyB0byB0aGUgZGVwbG95IGRlZmF1bHQnKVxuICAgIC5vcHRpb24oJy0tZm9yY2UnLCAnU2tpcCB0aGUgdGVhcmRvd24gdHlwZWQtY29uZmlybWF0aW9uIChEQU5HRVJPVVMg4oCUIGZvciBDSS9hdXRvbWF0aW9uIG9ubHkpJywgZmFsc2UpXG4gICAgLm9wdGlvbignLS1uby1pbml0JywgJ1NraXAgdGhlIHBvc3QtZGVwbG95IHJlZ2lzdGVyL2luaXQtcGxhdGZvcm0gc3RlcCcpXG4gICAgLy8gQm9vdHN0cmFwIChzcGFyc2UgY2xvbmUpIOKAlCBwcm92aXNpb24gYSBmcmVzaCBtYWNoaW5lIGluIG9uZSBjb21tYW5kLlxuICAgIC5vcHRpb24oJy0tcmVwbyBbdXJsXScsICdCb290c3RyYXA6IGdpdC1jbG9uZSB0aGUgcGxhdGZvcm0gcmVwbyBmaXJzdCAoc3BhcnNlIOKAlCBvbmx5IHRoZSBuZWVkZWQgZGVwbG95IGZvbGRlcnMpLCB0aGVuIHJ1biBmcm9tIGl0IChubyB2YWx1ZSA9IHRoZSB1cHN0cmVhbSBkZWZhdWx0KScpXG4gICAgLm9wdGlvbignLS1yZWYgPHJlZj4nLCAnR2l0IGJyYW5jaC90YWcgdG8gY2hlY2sgb3V0IHdoZW4gYm9vdHN0cmFwcGluZyAoZGVmYXVsdDogbWFpbiknKVxuICAgIC5vcHRpb24oJy0td29ya2RpciA8ZGlyPicsICdEaXJlY3RvcnkgdG8gY2xvbmUgaW50byAvIHJ1biBmcm9tIHdoZW4gYm9vdHN0cmFwcGluZyAoZGVmYXVsdDogcGlwZWxpbmUtYnVpbGRlciknKVxuICAgIC8vIFBvc3QtaW5zdGFsbCBsb2FkcyDigJQgZWFjaCBvcHQtaW4gc3RlcCBhbHNvIGFkZHMgaXRzIGRlcGxveSBmb2xkZXIgdG8gdGhlIHNwYXJzZSBjbG9uZS5cbiAgICAub3B0aW9uKCctLXdpdGgtcGx1Z2lucycsICdQb3N0LWluc3RhbGw6IGJ1aWxkICsgbG9hZCBwbHVnaW5zIChhZGRzIGRlcGxveS9wbHVnaW5zLCBkZXBsb3kvY29kZWJ1aWxkKScsIGZhbHNlKVxuICAgIC5vcHRpb24oJy0td2l0aC1jb21wbGlhbmNlJywgJ1Bvc3QtaW5zdGFsbDogbG9hZCBzYW1wbGUgY29tcGxpYW5jZSBydWxlcy9wb2xpY2llcyAoYWRkcyBkZXBsb3kvY29tcGxpYW5jZSknLCBmYWxzZSlcbiAgICAub3B0aW9uKCctLXdpdGgtc2FtcGxlcycsICdQb3N0LWluc3RhbGw6IGxvYWQgc2FtcGxlIHBpcGVsaW5lcyAoYWRkcyBkZXBsb3kvc2FtcGxlcyknLCBmYWxzZSlcbiAgICAub3B0aW9uKCctLXdpdGgtYWxsJywgJ1Bvc3QtaW5zdGFsbDogcGx1Z2lucyArIGNvbXBsaWFuY2UgKyBzYW1wbGVzJywgZmFsc2UpXG4gICAgLm9wdGlvbignLS1idWlsZC1ib290c3RyYXAnLCAnQnVpbGQgKyBwdWJsaXNoIHRoZSBDb2RlQnVpbGQgYm9vdHN0cmFwIGltYWdlIGR1cmluZyByZWdpc3RlciAoYWRkcyBkZXBsb3kvY29kZWJ1aWxkKScsIGZhbHNlKVxuICAgIC5vcHRpb24oJy0td2l0aC1zbW9rZS10ZXN0JywgJ1Bvc3QtaW5zdGFsbDogcmVhZC1vbmx5IEFQSSByZWFjaGFiaWxpdHkgY2hlY2snLCBmYWxzZSlcbiAgICAub3B0aW9uKCctLXdpdGgtZXZlbnRzJywgJ1Bvc3QtaW5zdGFsbCAoQVdTKTogZXZlbnQgaW5nZXN0aW9uIGJ1bmRsZSDigJQgc3RvcmUtdG9rZW4gKEpXVCDihpIgU2VjcmV0cyBNYW5hZ2VyKSB0aGVuIHNldHVwLWV2ZW50cyAoRXZlbnRCcmlkZ2UvTGFtYmRhKScsIGZhbHNlKVxuICAgIC5vcHRpb24oJy0tcG9zdC1zdGVwIDxjbWQ+JywgJ1J1biBhbiBleHRyYSBjb21tYW5kIGFmdGVyIHRoZSBsb2FkcyAocmVwZWF0YWJsZSwgaW4gb3JkZXIpJywgY29sbGVjdFN0ZXAsIFtdKVxuICAgIC5vcHRpb24oJy0tYWRtaW4tZW1haWwgPGFkZHI+JywgJ0FkbWluIGVtYWlsIGZvciBub24taW50ZXJhY3RpdmUgcmVnaXN0ZXIgKHNldHMgUExBVEZPUk1fSURFTlRJRklFUiknKVxuICAgIC5vcHRpb24oJy0tYWRtaW4tcGFzc3dvcmQgPHB3PicsICdBZG1pbiBwYXNzd29yZCBmb3Igbm9uLWludGVyYWN0aXZlIHJlZ2lzdGVyIChzZXRzIFBMQVRGT1JNX1BBU1NXT1JEKScpXG4gICAgLm9wdGlvbignLS1qc29uJywgJ1ByaW50IHRoZSBwbGFuIGFzIEpTT04gYW5kIGV4aXQgV0lUSE9VVCBydW5uaW5nICh0aGUgb25seSBub24tZXhlY3V0aW5nIG1vZGUg4oCUIGZvciB0b29saW5nL0NJIGluc3BlY3Rpb24pJywgZmFsc2UpXG4gICAgLmFjdGlvbihhc3luYyAob3B0aW9ucykgPT4ge1xuICAgICAgY29uc3QgZXhlY3V0aW9uSWQgPSBwcmludENvbW1hbmRIZWFkZXIoJ1Byb3Zpc2lvbicpO1xuXG4gICAgICB0cnkge1xuICAgICAgICAvLyAxLiBBc3NlbWJsZSBwYXJhbXMgZnJvbSBleHBsaWNpdCBmbGFncyAoZmxhZ3MgYWx3YXlzIHdpbiBvdmVyIE5MIHBhcnNlKS5cbiAgICAgICAgY29uc3QgcGFyYW1zOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiA9IHtcbiAgICAgICAgICByZWdpb246IG9wdGlvbnMucmVnaW9uLFxuICAgICAgICAgIGRvbWFpbjogb3B0aW9ucy5kb21haW4sXG4gICAgICAgICAgaG9zdGVkWm9uZUlkOiBvcHRpb25zLmhvc3RlZFpvbmVJZCxcbiAgICAgICAgICBkZXBsb3lNb2RlOiBvcHRpb25zLmRlcGxveU1vZGUsXG4gICAgICAgICAga2V5UGFpcjogb3B0aW9ucy5rZXlQYWlyLFxuICAgICAgICAgIGluc3RhbmNlVHlwZTogb3B0aW9ucy5pbnN0YW5jZVR5cGUsXG4gICAgICAgICAgZ2hjclRva2VuOiBvcHRpb25zLmdoY3JUb2tlbixcbiAgICAgICAgICAvLyBDb21tYW5kZXIgdHJpLXN0YXRlcyBgZW1haWxgOiB1bmRlZmluZWQgKG5laXRoZXIpLCB0cnVlICgtLWVtYWlsKSxcbiAgICAgICAgICAvLyBmYWxzZSAoLS1uby1lbWFpbCkuIFNFUyBpcyBvbiBieSBkZWZhdWx0LCBzbyBvbmx5IC0tbm8tZW1haWwgaXNcbiAgICAgICAgICAvLyBsb2FkLWJlYXJpbmcgKGl0IGVtaXRzIGAtLW5vLWVtYWlsYCBpbnRvIHRoZSBkZXBsb3kgY29tbWFuZCkuXG4gICAgICAgICAgZW1haWw6IG9wdGlvbnMuZW1haWwgPT09IHRydWUsXG4gICAgICAgICAgbm9FbWFpbDogb3B0aW9ucy5lbWFpbCA9PT0gZmFsc2UsXG4gICAgICAgICAgZW1haWxGcm9tOiBvcHRpb25zLmVtYWlsRnJvbSxcbiAgICAgICAgICBlbWFpbEZyb21OYW1lOiBvcHRpb25zLmVtYWlsRnJvbU5hbWUsXG4gICAgICAgICAgYWxlcnRFbWFpbDogb3B0aW9ucy5hbGVydEVtYWlsLFxuICAgICAgICAgIG5vQ3JlYXRlU2VzSWRlbnRpdHk6IG9wdGlvbnMuc2tpcFNlc0lkZW50aXR5LFxuICAgICAgICB9O1xuICAgICAgICBjb25zdCBhaU9wdHMgPSB7IHByb3ZpZGVyOiBvcHRpb25zLmFpUHJvdmlkZXIsIG1vZGVsOiBvcHRpb25zLm1vZGVsIH07XG5cbiAgICAgICAgLy8gQm9vdHN0cmFwIChzcGFyc2UgY2xvbmUpICsgcG9zdC1pbnN0YWxsIHNlbGVjdGlvbnMuXG4gICAgICAgIGNvbnN0IHdhbnRCb290c3RyYXAgPSBvcHRpb25zLnJlcG8gIT09IHVuZGVmaW5lZCAmJiBvcHRpb25zLnJlcG8gIT09IGZhbHNlO1xuICAgICAgICBjb25zdCB3aXRoQWxsID0gb3B0aW9ucy53aXRoQWxsID09PSB0cnVlO1xuICAgICAgICBjb25zdCBhbnlMb2FkRmxhZyA9IHdpdGhBbGwgfHwgTE9BRF9TVEVQUy5zb21lKChzKSA9PiBvcHRpb25zW3MuZmxhZ10gPT09IHRydWUpO1xuICAgICAgICBsZXQgZW5hYmxlZExvYWRJZHMgPSBMT0FEX1NURVBTLmZpbHRlcigocykgPT4gd2l0aEFsbCB8fCBvcHRpb25zW3MuZmxhZ10gPT09IHRydWUpLm1hcCgocykgPT4gcy5pZCk7XG4gICAgICAgIC8vIFdpdGggbm8gLS13aXRoLSogZmxhZ3MsIGFuIGludGVyYWN0aXZlIHJ1biBvZmZlcnMgZWFjaCBsb2FkIOKAlCBidXQgQUZURVIgdGhlXG4gICAgICAgIC8vIGNsb25lLCBzbyB0aGUgcXVlc3Rpb25zIGNvbWUgb25jZSB5b3UndmUgYWdyZWVkIHRvIHByb2NlZWQgKG5vdCB1cCBmcm9udCkuXG4gICAgICAgIC8vIEVhY2ggcGlja2VkIGxvYWQncyBmb2xkZXIgaXMgdGhlbiBmZXRjaGVkIHZpYSBhbiBhZGRpdGl2ZSBzcGFyc2UgcmUtc3luYy5cbiAgICAgICAgLy8gRmxhZ3MgLyAtLXllcyAvIC0tanNvbiAvIG5vbi1pbnRlcmFjdGl2ZSBzaGVsbHMgc2tpcCB0aGUgcHJvbXB0cy5cbiAgICAgICAgY29uc3Qgd2lsbFByb21wdExvYWRzID0gIW9wdGlvbnMueWVzICYmICFvcHRpb25zLmpzb24gJiYgQm9vbGVhbihwcm9jZXNzLnN0ZGluLmlzVFRZKSAmJiAhYW55TG9hZEZsYWc7XG4gICAgICAgIGNvbnN0IHBvc3RTdGVwRmxhZ3MgPSB7XG4gICAgICAgICAgaW5pdDogb3B0aW9ucy5pbml0ICE9PSBmYWxzZSxcbiAgICAgICAgICBidWlsZEJvb3RzdHJhcDogb3B0aW9ucy5idWlsZEJvb3RzdHJhcCA9PT0gdHJ1ZSB8fCBlbmFibGVkTG9hZElkcy5pbmNsdWRlcygncGx1Z2lucycpLFxuICAgICAgICAgIHNtb2tlVGVzdDogb3B0aW9ucy53aXRoU21va2VUZXN0ID09PSB0cnVlLFxuICAgICAgICAgIGV2ZW50czogb3B0aW9ucy53aXRoRXZlbnRzID09PSB0cnVlLFxuICAgICAgICAgIHN0ZXBzOiAob3B0aW9ucy5wb3N0U3RlcCA/PyBbXSkgYXMgc3RyaW5nW10sXG4gICAgICAgIH07XG4gICAgICAgIC8vIEFkbWluIGNyZWRlbnRpYWxzIGZvcndhcmRlZCBhcyBlbnYgc28gcmVnaXN0ZXIgcnVucyBub24taW50ZXJhY3RpdmVseS5cbiAgICAgICAgY29uc3QgYWRtaW5FbnY6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7fTtcbiAgICAgICAgaWYgKHR5cGVvZiBvcHRpb25zLmFkbWluRW1haWwgPT09ICdzdHJpbmcnKSBhZG1pbkVudi5QTEFURk9STV9JREVOVElGSUVSID0gb3B0aW9ucy5hZG1pbkVtYWlsO1xuICAgICAgICBpZiAodHlwZW9mIG9wdGlvbnMuYWRtaW5QYXNzd29yZCA9PT0gJ3N0cmluZycpIGFkbWluRW52LlBMQVRGT1JNX1BBU1NXT1JEID0gb3B0aW9ucy5hZG1pblBhc3N3b3JkO1xuXG4gICAgICAgIC8vIDIuIE9wdGlvbmFsbHkgcGFyc2UgYSBuYXR1cmFsLWxhbmd1YWdlIGdvYWwgdG8gZmlsbCBhbnkgR0FQUyAoYmVzdC1lZmZvcnQpLlxuICAgICAgICBsZXQgdGFyZ2V0OiBUYXJnZXRJZCB8IHVuZGVmaW5lZCA9IGlzVGFyZ2V0SWQob3B0aW9ucy50YXJnZXQpID8gb3B0aW9ucy50YXJnZXQgOiB1bmRlZmluZWQ7XG4gICAgICAgIGlmIChvcHRpb25zLnByb21wdCkge1xuICAgICAgICAgIGlmIChpc0FpQ29uZmlndXJlZChhaU9wdHMpKSB7XG4gICAgICAgICAgICBjb25zdCBwYXJzZWQgPSBhd2FpdCBwYXJzZUdvYWwob3B0aW9ucy5wcm9tcHQsIGFpT3B0cyk7XG4gICAgICAgICAgICBpZiAocGFyc2VkKSB7XG4gICAgICAgICAgICAgIGlmICghdGFyZ2V0ICYmIGlzVGFyZ2V0SWQocGFyc2VkLnRhcmdldCkpIHRhcmdldCA9IHBhcnNlZC50YXJnZXQ7XG4gICAgICAgICAgICAgIGZvciAoY29uc3QgW2ssIHZdIG9mIE9iamVjdC5lbnRyaWVzKHBhcnNlZCkpIHtcbiAgICAgICAgICAgICAgICBpZiAoayAhPT0gJ3RhcmdldCcgJiYgcGFyYW1zW2tdID09PSB1bmRlZmluZWQgJiYgdiAhPT0gdW5kZWZpbmVkKSBwYXJhbXNba10gPSB2O1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHByaW50V2FybmluZygnQSAtLXByb21wdCB3YXMgZ2l2ZW4gYnV0IG5vIEFJIGtleSBpcyBzZXQg4oCUIGlnbm9yaW5nIGl0IGFuZCB1c2luZyBmbGFncyBvbmx5LiBTZXQgQU5USFJPUElDX0FQSV9LRVkgKG9yIC0tYWktcHJvdmlkZXIgKyBpdHMga2V5KS4nKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyAzLiBPcHRpb25hbCBmYWlsdXJlIGRpYWdub3NpcyAoaW5kZXBlbmRlbnQgb2YgYSBkZXBsb3kgcGxhbikuXG4gICAgICAgIGlmIChvcHRpb25zLmRpYWdub3NlKSB7XG4gICAgICAgICAgbGV0IGZhaWx1cmVUZXh0OiBzdHJpbmc7XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGZhaWx1cmVUZXh0ID0gcmVhZEZpbGVTeW5jKG9wdGlvbnMuZGlhZ25vc2UsICd1dGYtOCcpO1xuICAgICAgICAgIH0gY2F0Y2gge1xuICAgICAgICAgICAgcHJpbnRFcnJvcihgQ2Fubm90IHJlYWQgLS1kaWFnbm9zZSBmaWxlOiAke29wdGlvbnMuZGlhZ25vc2V9YCk7XG4gICAgICAgICAgICBwcm9jZXNzLmV4aXRDb2RlID0gMTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9XG4gICAgICAgICAgY29uc3QgZGlhZ25vc2lzID0gaXNBaUNvbmZpZ3VyZWQoYWlPcHRzKSA/IGF3YWl0IGRpYWdub3NlRmFpbHVyZShmYWlsdXJlVGV4dCwgYWlPcHRzKSA6IG51bGw7XG4gICAgICAgICAgLy8gV2l0aCAtLWpzb24sIHRoZSBkaWFnbm9zaXMgSVMgdGhlIG1hY2hpbmUtcmVhZGFibGUgb3V0cHV0IOKAlCBlbWl0IGl0XG4gICAgICAgICAgLy8gYWxvbmUgKGRvbid0IGFsc28gcHJpbnQgdGV4dCwgd2hpY2ggd291bGQgY29ycnVwdCB0aGUgSlNPTiBzdHJlYW0pLlxuICAgICAgICAgIGlmIChvcHRpb25zLmpzb24pIHtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKEpTT04uc3RyaW5naWZ5KHsgc3VjY2VzczogdHJ1ZSwgZXhlY3V0aW9uSWQsIGRpYWdub3NpcyB9LCBudWxsLCAyKSk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChkaWFnbm9zaXMpIHtcbiAgICAgICAgICAgIHByaW50U2VjdGlvbignRmFpbHVyZSBkaWFnbm9zaXMnKTtcbiAgICAgICAgICAgIHByaW50SW5mbyhkaWFnbm9zaXMpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBwcmludFdhcm5pbmcoJ0RpYWdub3NpcyB1bmF2YWlsYWJsZSAobm8gQUkga2V5IGNvbmZpZ3VyZWQgb3IgdGhlIG1vZGVsIGNvdWxkIG5vdCBiZSByZWFjaGVkKS4nKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKCF0YXJnZXQpIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIDQuIE5lZWQgYSB0YXJnZXQgdG8gYXNzZW1ibGUgYSBwbGFuLlxuICAgICAgICBpZiAoIXRhcmdldCkge1xuICAgICAgICAgIHByaW50RXJyb3IoYE5vIHRhcmdldCBzcGVjaWZpZWQuIFBhc3MgLS10YXJnZXQgPCR7VEFSR0VUX0lEUy5qb2luKCd8Jyl9PiBvciBkZXNjcmliZSB0aGUgZ29hbCB3aXRoIC0tcHJvbXB0LmApO1xuICAgICAgICAgIHByb2Nlc3MuZXhpdENvZGUgPSAxO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHNwZWMgPSBUQVJHRVRTW3RhcmdldF07XG4gICAgICAgIGxldCBjd2QgPSBwcm9jZXNzLmN3ZCgpO1xuXG4gICAgICAgIC8vIDRiLiBUZWFyZG93biBtb2RlIOKAlCB0aGUgZGVzdHJveSBjb3VudGVycGFydCBvZiBwcm92aXNpb25pbmcuIEdhdGVkIGhhcmRlclxuICAgICAgICAvLyB0aGFuIGRlcGxveTogQVdTIHRhcmdldHMgYXJlIGlycmV2ZXJzaWJsZSwgc28gd2UgcmVxdWlyZSB0aGUgb3BlcmF0b3IgdG9cbiAgICAgICAgLy8gVFlQRSB0aGUgdGFyZ2V0IGlkICgtLWZvcmNlIGJ5cGFzc2VzIGZvciBDSTsgLS15ZXMgYWxvbmUgZG9lcyBOT1QpLlxuICAgICAgICBpZiAob3B0aW9ucy50ZWFyZG93bikge1xuICAgICAgICAgIGNvbnN0IHsgY29tbWFuZDogZG93bkNvbW1hbmQsIGRlc3RydWN0aXZlIH0gPSB0ZWFyZG93bkNvbW1hbmQodGFyZ2V0LCB7XG4gICAgICAgICAgICBzdGFja05hbWU6IG9wdGlvbnMuc3RhY2tOYW1lLFxuICAgICAgICAgICAgcmVnaW9uOiBvcHRpb25zLnJlZ2lvbixcbiAgICAgICAgICAgIC8vIE91ciB0eXBlZCBnYXRlIElTIHRoZSBjb25maXJtYXRpb24g4oCUIGZvcndhcmQgLS15ZXMgc28gdGhlIG5hdGl2ZVxuICAgICAgICAgICAgLy8gc2NyaXB0IChGYXJnYXRlKSBkb2Vzbid0IGFsc28gYmxvY2sgb24gc3RkaW4gd2UncmUgaW5oZXJpdGluZy5cbiAgICAgICAgICAgIGFzc3VtZVllczogdHJ1ZSxcbiAgICAgICAgICB9KTtcblxuICAgICAgICAgIGlmIChvcHRpb25zLmpzb24pIHtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKEpTT04uc3RyaW5naWZ5KHsgc3VjY2VzczogdHJ1ZSwgZXhlY3V0aW9uSWQsIHRhcmdldCwgdGVhcmRvd246IHRydWUsIGRlc3RydWN0aXZlLCBkZXN0cm95czogc3BlYy5kZXN0cm95cywgY29tbWFuZDogZG93bkNvbW1hbmQgfSwgbnVsbCwgMikpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHByaW50U2VjdGlvbihgVGVhcmRvd24gcGxhbiDigJQgJHtzcGVjLmxhYmVsfWApO1xuICAgICAgICAgIHByaW50S2V5VmFsdWUoeyAnVGFyZ2V0JzogdGFyZ2V0LCAnRGVzdHJveXMnOiBzcGVjLmRlc3Ryb3lzLCAnU3RvcHMgY29zdCc6IHNwZWMuY29zdCB9KTtcbiAgICAgICAgICBwcmludFNlY3Rpb24oJ0NvbW1hbmQgdG8gcnVuJyk7XG4gICAgICAgICAgcHJpbnRJbmZvKGRvd25Db21tYW5kKTtcblxuICAgICAgICAgIGlmIChkZXN0cnVjdGl2ZSAmJiAhb3B0aW9ucy5mb3JjZSkge1xuICAgICAgICAgICAgY29uc3QgdG9rZW4gPSBhd2FpdCBhc2soYFxcblRoaXMgaXMgSVJSRVZFUlNJQkxFLiBUeXBlIFwiJHt0YXJnZXR9XCIgdG8gY29uZmlybSB0ZWFyZG93bjogYCk7XG4gICAgICAgICAgICBpZiAodG9rZW4gIT09IHRhcmdldCkge1xuICAgICAgICAgICAgICBwcmludFdhcm5pbmcoJ1RoYXQgZGlkblxcJ3QgbWF0Y2gsIHNvIG5vdGhpbmcgd2FzIGRlc3Ryb3llZCDigJQgeW91IGhhdmUgdG8gdHlwZSB0aGUgZXhhY3QgdGFyZ2V0IGlkIHRvIGNvbmZpcm0uJyk7XG4gICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGVsc2UgaWYgKCFkZXN0cnVjdGl2ZSAmJiAhb3B0aW9ucy5mb3JjZSAmJiAhKGF3YWl0IGNvbmZpcm0oJ1xcblByb2NlZWQgd2l0aCB0ZWFyZG93biAoc3RvcHMgdGhlIHN0YWNrOyBvbi1kaXNrIGRhdGEgcGVyc2lzdHMpPycsIG9wdGlvbnMueWVzKSkpIHtcbiAgICAgICAgICAgIHByaW50V2FybmluZygnTm8gcHJvYmxlbSDigJQgbm90aGluZyB3YXMgY2hhbmdlZC4nKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBwcmludFNlY3Rpb24oJ1RlYXJpbmcgZG93bicpO1xuICAgICAgICAgIGNvbnN0IHsgY29kZTogZG93bkNvZGUgfSA9IGF3YWl0IHJ1blNjcmlwdChkb3duQ29tbWFuZCwgY3dkLCB7IGNhcHR1cmU6IGZhbHNlIH0pO1xuICAgICAgICAgIGlmIChkb3duQ29kZSAhPT0gMCkge1xuICAgICAgICAgICAgcHJpbnRFcnJvcihgXFxuVGVhcmRvd24gZmFpbGVkIChleGl0ICR7ZG93bkNvZGV9KS4gSW5zcGVjdCB0aGUgc3RhY2svY29udGFpbmVycyBhbmQgcmV0cnkuYCk7XG4gICAgICAgICAgICBwcm9jZXNzLmV4aXRDb2RlID0gMTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9XG4gICAgICAgICAgcHJpbnRTdWNjZXNzKCdUZWFyZG93biBjb21wbGV0ZS4nKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICAvLyBNYWtlIHByZXZpb3VzbHktZmV0Y2hlZCBzaW5nbGUtYmluYXJ5IHRvb2xzIChlLmcuIHlxKSB2aXNpYmxlIHRvIHRoZVxuICAgICAgICAvLyBwcmVyZXEgY2hlY2tzICsgdGhlIGRlcGxveSDigJQgdGhleSBsaXZlIGluIHRoZSB0b29scyBjYWNoZSwgbm90IG9uIHRoZVxuICAgICAgICAvLyBzeXN0ZW0gUEFUSC4gKEJvdGggYGhhcygpYCBhbmQgdGhlIGRlcGxveSdzIGBiYXNoIC1sY2AgaW5oZXJpdCB0aGlzLilcbiAgICAgICAgd2l0aFRvb2xzT25QYXRoKCk7XG4gICAgICAgIGxldCBwcmVyZXFzID0gY2hlY2tQcmVyZXFzKHRhcmdldCwgeyBib290c3RyYXA6IHdhbnRCb290c3RyYXAsIHdpdGhQbHVnaW5zOiB3aWxsUHJvbXB0TG9hZHMgfHwgZW5hYmxlZExvYWRJZHMuaW5jbHVkZXMoJ3BsdWdpbnMnKSB9KTtcbiAgICAgICAgY29uc3QgeyBjb21tYW5kLCBtaXNzaW5nIH0gPSBhc3NlbWJsZUNvbW1hbmQoc3BlYywgcGFyYW1zKTtcbiAgICAgICAgY29uc3QgdXJsID0gZGVyaXZlSGVhbHRoVXJsKHRhcmdldCwgcGFyYW1zKTtcblxuICAgICAgICAvLyBTcGFyc2UgYm9vdHN0cmFwIGNsb25lIGNvbW1hbmQgKGNvbW1vbiBiYXNlICsgdGFyZ2V0ICsgc2VsZWN0ZWQgbG9hZHMpLlxuICAgICAgICAvLyBJbnRlcmFjdGl2ZSBsb2FkcyBhcmUgY2hvc2VuIEFGVEVSIHRoZSBjbG9uZSwgc28gdGhlIGNsb25lIHN0YXlzIG1pbmltYWwg4oCUXG4gICAgICAgIC8vIGVhY2ggcGlja2VkIGxvYWQncyBmb2xkZXIgaXMgZmV0Y2hlZCB0aGVuIHZpYSBhbiBhZGRpdGl2ZSBzcGFyc2UgcmUtc3luYy5cbiAgICAgICAgY29uc3Qgc3BhcnNlUGF0aHMgPSBzcGFyc2VQYXRoc0Zvcih0YXJnZXQsIGVuYWJsZWRMb2FkSWRzKTtcbiAgICAgICAgY29uc3QgYm9vdHN0cmFwID0gcmVzb2x2ZUJvb3RzdHJhcChcbiAgICAgICAgICB7IHJlcG86IHR5cGVvZiBvcHRpb25zLnJlcG8gPT09ICdzdHJpbmcnID8gb3B0aW9ucy5yZXBvIDogdW5kZWZpbmVkLCByZWY6IG9wdGlvbnMucmVmLCB3b3JrZGlyOiBvcHRpb25zLndvcmtkaXIsIGZ1bGw6ICFnaXRTdXBwb3J0c1NwYXJzZUNoZWNrb3V0KCkgfSxcbiAgICAgICAgICBzcGFyc2VQYXRocyxcbiAgICAgICAgKTtcbiAgICAgICAgY29uc3QgYm9vdHN0cmFwQ21kID0gd2FudEJvb3RzdHJhcCA/IGJvb3RzdHJhcENvbW1hbmQoYm9vdHN0cmFwKSA6IG51bGw7XG5cbiAgICAgICAgLy8gUmVzb2x2ZSBwb3N0LWluc3RhbGwgc3RlcHMgKHJlZ2lzdGVyIOKGkiBzbW9rZSDihpIgZXZlbnRzIOKGkiBjdXN0b20pLiBSZS1yZXNvbHZlZFxuICAgICAgICAvLyBhZnRlciB0aGUgcG9zdC1jbG9uZSBsb2FkIHByb21wdHMgKHNlZSBiZWxvdykgd2hlbiB0aG9zZSBydW4gaW50ZXJhY3RpdmVseS5cbiAgICAgICAgbGV0IHsgc3RlcHM6IHBvc3RTdGVwcywgc2tpcHBlZDogc2tpcHBlZFN0ZXBzIH0gPSByZXNvbHZlUG9zdFN0ZXBzKHtcbiAgICAgICAgICB0YXJnZXQsXG4gICAgICAgICAgdXJsLFxuICAgICAgICAgIHJlZ2lvbjogdHlwZW9mIHBhcmFtcy5yZWdpb24gPT09ICdzdHJpbmcnID8gcGFyYW1zLnJlZ2lvbiA6IHVuZGVmaW5lZCxcbiAgICAgICAgICBlbmFibGVkTG9hZElkcyxcbiAgICAgICAgICAuLi5wb3N0U3RlcEZsYWdzLFxuICAgICAgICB9KTtcblxuICAgICAgICBpZiAob3B0aW9ucy5qc29uKSB7XG4gICAgICAgICAgY29uc29sZS5sb2coSlNPTi5zdHJpbmdpZnkoe1xuICAgICAgICAgICAgc3VjY2VzczogdHJ1ZSxcbiAgICAgICAgICAgIGV4ZWN1dGlvbklkLFxuICAgICAgICAgICAgdGFyZ2V0LFxuICAgICAgICAgICAgcHJlcmVxcyxcbiAgICAgICAgICAgIHByZXJlcXNTYXRpc2ZpZWQ6IHByZXJlcXNTYXRpc2ZpZWQocHJlcmVxcyksXG4gICAgICAgICAgICBtaXNzaW5nSW5wdXRzOiBtaXNzaW5nLm1hcCgobSkgPT4gKHsgZmxhZzogbS5mbGFnLCBkZXNjcmlwdGlvbjogbS5kZXNjcmlwdGlvbiB9KSksXG4gICAgICAgICAgICBib290c3RyYXA6IGJvb3RzdHJhcENtZCxcbiAgICAgICAgICAgIHNwYXJzZVBhdGhzOiB3YW50Qm9vdHN0cmFwID8gc3BhcnNlUGF0aHMgOiBudWxsLFxuICAgICAgICAgICAgY29tbWFuZCxcbiAgICAgICAgICAgIHBvc3RTdGVwczogcG9zdFN0ZXBzLm1hcCgocykgPT4gKHsgaWQ6IHMuaWQsIGxhYmVsOiBzLmxhYmVsLCBjb21tYW5kOiBzLmNvbW1hbmQgfSkpLFxuICAgICAgICAgICAgc2tpcHBlZFBvc3RTdGVwczogc2tpcHBlZFN0ZXBzLFxuICAgICAgICAgIH0sIG51bGwsIDIpKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICAvLyA1LiBQcmludCB0aGUgcGxhbiAoc2hvd24gYmVmb3JlIHRoZSBnYXRlZCBleGVjdXRpb24gYmVsb3cpLlxuICAgICAgICBwcmludFNlY3Rpb24oYFByb3Zpc2lvbiBwbGFuIOKAlCAke3NwZWMubGFiZWx9YCk7XG4gICAgICAgIHByaW50S2V5VmFsdWUoeyAnVGFyZ2V0JzogdGFyZ2V0LCAnQmVzdCBmb3InOiBzcGVjLmJlc3RGb3IsICdDb3N0Jzogc3BlYy5jb3N0IH0pO1xuXG4gICAgICAgIHByaW50U2VjdGlvbignUHJlcmVxdWlzaXRlcycpO1xuICAgICAgICBmb3IgKGNvbnN0IGMgb2YgcHJlcmVxcykgcHJpbnRJbmZvKGAke2Mub2sgPyAn4pyTJyA6ICfinJcnfSAke2MubmFtZX0g4oCUICR7Yy5kZXRhaWx9YCk7XG4gICAgICAgIGlmICghcHJlcmVxc1NhdGlzZmllZChwcmVyZXFzKSkgcHJpbnRXYXJuaW5nKCdSZXNvbHZlIHRoZSBmYWlsaW5nIHByZXJlcXVpc2l0ZXMgYWJvdmUgYmVmb3JlIGRlcGxveWluZy4nKTtcblxuICAgICAgICBpZiAobWlzc2luZy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgcHJpbnRTZWN0aW9uKCdNaXNzaW5nIHJlcXVpcmVkIGlucHV0cycpO1xuICAgICAgICAgIGZvciAoY29uc3QgbSBvZiBtaXNzaW5nKSBwcmludEluZm8oYCAgLS0ke20uZmxhZ30gICgke20uZGVzY3JpcHRpb259KWApO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGJvb3RzdHJhcENtZCkge1xuICAgICAgICAgIHByaW50U2VjdGlvbignQm9vdHN0cmFwIChzcGFyc2UgZ2l0IGNsb25lLCBydW5zIGZpcnN0KScpO1xuICAgICAgICAgIHByaW50SW5mbyhgQ2xvbmUgJHtib290c3RyYXAucmVwb30gQCAke2Jvb3RzdHJhcC5yZWZ9IOKGkiAke2Jvb3RzdHJhcC53b3JrZGlyfTsgZm9sZGVyczogJHtzcGFyc2VQYXRocy5qb2luKCcsICcpfWApO1xuICAgICAgICAgIHByaW50SW5mbyhib290c3RyYXBDbWQpO1xuICAgICAgICB9XG5cbiAgICAgICAgcHJpbnRTZWN0aW9uKCdDb21tYW5kIHRvIHJ1bicpO1xuICAgICAgICBwcmludEluZm8oY29tbWFuZCk7XG5cbiAgICAgICAgaWYgKHBvc3RTdGVwcy5sZW5ndGggPiAwIHx8IHNraXBwZWRTdGVwcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgcHJpbnRTZWN0aW9uKCdQb3N0LWluc3RhbGwgc3RlcHMnKTtcbiAgICAgICAgICBmb3IgKGNvbnN0IHMgb2YgcG9zdFN0ZXBzKSBwcmludEluZm8oYOKAoiAke3MubGFiZWx9XFxuICAgICR7cy5jb21tYW5kfWApO1xuICAgICAgICAgIGZvciAoY29uc3QgcyBvZiBza2lwcGVkU3RlcHMpIHByaW50V2FybmluZyhgc2tpcHBlZCAke3MuaWR9OiAke3MucmVhc29ufWApO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gNWIuIEhvc3QtcG9ydCBwcmUtZmxpZ2h0IChsb2NhbC9taW5pa3ViZSBvbmx5KS4gVGhlIGRlcGxveSBiaW5kcyBmaXhlZCBob3N0XG4gICAgICAgIC8vIHBvcnRzIChEb2NrZXIgcHVibGlzaCAvIGt1YmVjdGwgcG9ydC1mb3J3YXJkKTsgaWYgb25lIGlzIHRha2VuLCBhIGNvbnRhaW5lclxuICAgICAgICAvLyBvciBmb3J3YXJkIGZhaWxzIHRvIGJpbmQgbWlkLWRlcGxveSDigJQgYW5kIGZvciB0aGUgZ2F0ZXdheSB0aGF0IHN1cmZhY2VzIGFzIGFcbiAgICAgICAgLy8gc2lsZW50IFwiL2hlYWx0aCBuZXZlciByZWFjaGFibGVcIiBoYW5nLiBTdG9wIE5PVyB3aXRoIGEgc3VtbWFyeSBpbnN0ZWFkIG9mXG4gICAgICAgIC8vIGZhaWxpbmcgaGFsZndheS4gUmVtb3RlIHRhcmdldHMgKGVjMi9mYXJnYXRlKSBiaW5kIG5vdGhpbmcgbG9jYWxseSDihpIgc2tpcHBlZC5cbiAgICAgICAgaWYgKHNwZWMuaG9zdFBvcnRzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICBjb25zdCBwb3J0Q2hlY2tzID0gYXdhaXQgY2hlY2tIb3N0UG9ydHMoc3BlYyk7XG4gICAgICAgICAgY29uc3QgdGFrZW4gPSBwb3J0Q2hlY2tzLmZpbHRlcigoYykgPT4gIWMuYXZhaWxhYmxlKTtcbiAgICAgICAgICBwcmludFNlY3Rpb24oJ1BvcnQgYXZhaWxhYmlsaXR5Jyk7XG4gICAgICAgICAgZm9yIChjb25zdCBjIG9mIHBvcnRDaGVja3MpIHByaW50SW5mbyhgJHtjLmF2YWlsYWJsZSA/ICfinJMnIDogJ+Kclyd9ICR7U3RyaW5nKGMucG9ydCkucGFkRW5kKDUpfSDigJQgJHtjLnNlcnZpY2V9YCk7XG4gICAgICAgICAgaWYgKHRha2VuLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIHByaW50RXJyb3IoYFxcbiR7dGFrZW4ubGVuZ3RofSByZXF1aXJlZCBwb3J0KHMpIGFscmVhZHkgaW4gdXNlIOKAlCB0aGUgZGVwbG95IGNhbid0IGJpbmQgdGhlbSBhbmQgd291bGQgZmFpbCBtaWQtd2F5LiBGcmVlIHRoZW0gYW5kIHJlLXJ1bjpgKTtcbiAgICAgICAgICAgIGZvciAoY29uc3QgYyBvZiB0YWtlbikgcHJpbnRJbmZvKGAgIOKAoiBwb3J0ICR7Yy5wb3J0fSAoJHtjLnNlcnZpY2V9KSDigJQgZmluZCB0aGUgaG9sZGVyOiAgbHNvZiAtaSA6JHtjLnBvcnR9YCk7XG4gICAgICAgICAgICBpZiAodGFrZW4uc29tZSgoYykgPT4gYy5wb3J0ID09PSA1MDAwKSkge1xuICAgICAgICAgICAgICBwcmludEluZm8oJyAgTm90ZTogb24gbWFjT1MsIHBvcnQgNTAwMCBpcyB1c3VhbGx5IEFpclBsYXkgUmVjZWl2ZXIg4oCUIFN5c3RlbSBTZXR0aW5ncyDihpIgR2VuZXJhbCDihpIgQWlyRHJvcCAmIEhhbmRvZmYg4oaSIEFpclBsYXkgUmVjZWl2ZXIgKG9mZikuJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBwcm9jZXNzLmV4aXRDb2RlID0gMTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyA2LiBBbnkgbWlzc2luZyByZXF1aXJlZCBwcmVyZXEgdGhhdCdzIGEgc2luZ2xlIHN0YXRpYyBiaW5hcnkgKGUuZy4geXEpXG4gICAgICAgIC8vIGNhbiBiZSBmZXRjaGVkIGludG8gdGhlIHRvb2xzIGNhY2hlIGluc3RlYWQgb2YgYSBzeXN0ZW0gaW5zdGFsbCDigJQgbm9cbiAgICAgICAgLy8gYnJldy9hcHQuIE9mZmVyIGl0LCB0aGVuIHJlLWNoZWNrICh0aGUgY2FjaGUgZGlyIGlzIGFscmVhZHkgb24gUEFUSCkuXG4gICAgICAgIGNvbnN0IGZldGNoYWJsZSA9IHByZXJlcXMuZmlsdGVyKChjKSA9PiAhYy5vayAmJiBjLnJlcXVpcmVkICYmIGlzRmV0Y2hhYmxlKGMubmFtZSkpO1xuICAgICAgICBpZiAoZmV0Y2hhYmxlLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICBjb25zdCBuYW1lcyA9IGZldGNoYWJsZS5tYXAoKGMpID0+IGMubmFtZSkuam9pbignLCAnKTtcbiAgICAgICAgICBpZiAoYXdhaXQgY29uZmlybShgXFxuJHtuYW1lc30gbm90IGluc3RhbGxlZCDigJQgZmV0Y2ggdGhlIG9mZmljaWFsIHN0YXRpYyBiaW5hcnkgaW50byAke1RPT0xTX0RJUn0gKG5vIHN5c3RlbSBpbnN0YWxsKT9gLCBvcHRpb25zLnllcykpIHtcbiAgICAgICAgICAgIGZvciAoY29uc3QgYyBvZiBmZXRjaGFibGUpIHtcbiAgICAgICAgICAgICAgcHJpbnRJbmZvKGBGZXRjaGluZyAke2MubmFtZX3igKZgKTtcbiAgICAgICAgICAgICAgaWYgKCFmZXRjaFRvb2woYy5uYW1lKSkgcHJpbnRXYXJuaW5nKGBDb3VsZG4ndCBmZXRjaCAke2MubmFtZX0g4oCUIGluc3RhbGwgaXQgbWFudWFsbHkgYW5kIHJlLXJ1bi5gKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHByZXJlcXMgPSBjaGVja1ByZXJlcXModGFyZ2V0LCB7IGJvb3RzdHJhcDogd2FudEJvb3RzdHJhcCwgd2l0aFBsdWdpbnM6IHdpbGxQcm9tcHRMb2FkcyB8fCBlbmFibGVkTG9hZElkcy5pbmNsdWRlcygncGx1Z2lucycpIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIDdiLiBHYXRlZCBleGVjdXRpb24uIENoZWNrIHByZXJlcXMgLyByZXF1aXJlZCBpbnB1dHMgZmlyc3Qg4oCUIHRoaXMgYWxzb1xuICAgICAgICAvLyBjYXRjaGVzIGEgbWlzc2luZyBgZ2l0YCB3aGVuIGJvb3RzdHJhcHBpbmcuXG4gICAgICAgIGNvbnN0IGJsb2NrZWQgPSBleGVjdXRpb25CbG9ja2VkKHByZXJlcXMsIG1pc3NpbmcpO1xuICAgICAgICBpZiAoYmxvY2tlZCkge1xuICAgICAgICAgIHByaW50RXJyb3IoYENhbid0IHN0YXJ0IGp1c3QgeWV0IOKAlCAke2Jsb2NrZWR9LiBSZXNvbHZlIHRoYXQgYW5kIHJlLXJ1bi5gKTtcbiAgICAgICAgICBwcm9jZXNzLmV4aXRDb2RlID0gMTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICAvLyA3YS4gU3BhcnNlLWNsb25lIHRoZSBwbGF0Zm9ybSByZXBvLCByZXBvaW50IGN3ZCwgYW5kIHZlcmlmeSB0aGUgdHJlZS5cbiAgICAgICAgLy8gU2hhcmVkIGJ5IGAtLXJlcG9gIChiZWxvdykgYW5kIHRoZSBpbnRlcmFjdGl2ZSBvZmZlciBpbiA3Yi4gUmV0dXJuc1xuICAgICAgICAvLyBmYWxzZSAoYW5kIHNldHMgZXhpdENvZGUpIG9uIGZhaWx1cmUg4oCUIHdpdGggYSBmcmllbmRseSBtZXNzYWdlLlxuICAgICAgICAvLyBgYm9vdHN0cmFwcGVkYCByZWNvcmRzIHdoZXRoZXIgd2UgY3JlYXRlZCB0aGUgY2xvbmUgKHZzLiBydW5uaW5nIGluc2lkZSBhblxuICAgICAgICAvLyBleGlzdGluZyBjaGVja291dCkg4oCUIG9ubHkgdGhlbiBjYW4gd2UgYWRkaXRpdmVseSBzcGFyc2UtZmV0Y2ggbG9hZCBmb2xkZXJzLlxuICAgICAgICBsZXQgYm9vdHN0cmFwcGVkID0gZmFsc2U7XG4gICAgICAgIGNvbnN0IGJvb3RzdHJhcENsb25lID0gYXN5bmMgKCk6IFByb21pc2U8Ym9vbGVhbj4gPT4ge1xuICAgICAgICAgIGNvbnN0IGNtZCA9IGJvb3RzdHJhcENvbW1hbmQoYm9vdHN0cmFwKTtcbiAgICAgICAgICBwcmludFNlY3Rpb24oJ0Jvb3RzdHJhcCcpO1xuICAgICAgICAgIHByaW50SW5mbyhjbWQpO1xuICAgICAgICAgIGNvbnN0IHsgY29kZSB9ID0gYXdhaXQgcnVuU2NyaXB0KGNtZCwgY3dkLCB7IGNhcHR1cmU6IGZhbHNlIH0pO1xuICAgICAgICAgIGlmIChjb2RlICE9PSAwKSB7XG4gICAgICAgICAgICBwcmludEVycm9yKGBcXG5UaGUgY2xvbmUgZGlkbid0IGZpbmlzaCAoZXhpdCAke2NvZGV9KS4gRG91YmxlLWNoZWNrIHRoZSByZXBvIFVSTCAvIHJlZiAob3IgeW91ciBuZXR3b3JrKSBhbmQgZ2l2ZSBpdCBhbm90aGVyIGdvLmApO1xuICAgICAgICAgICAgcHJvY2Vzcy5leGl0Q29kZSA9IDE7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgfVxuICAgICAgICAgIGN3ZCA9IHBhdGgucmVzb2x2ZShjd2QsIGJvb3RzdHJhcC53b3JrZGlyKTtcbiAgICAgICAgICBib290c3RyYXBwZWQgPSB0cnVlO1xuICAgICAgICAgIHByaW50U3VjY2VzcyhgUmVwbyBpcyByZWFkeSDigJQgY29udGludWluZyBmcm9tICR7Y3dkfWApO1xuICAgICAgICAgIGNvbnN0IGFic2VudCA9IHNwYXJzZVBhdGhzLmZpbHRlcigocCkgPT4gIWV4aXN0c1N5bmMocGF0aC5qb2luKGN3ZCwgcCkpKTtcbiAgICAgICAgICBpZiAoYWJzZW50Lmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIHByaW50RXJyb3IoYFxcblRoZSBzcGFyc2UgY2xvbmUgaXMgbWlzc2luZyAke2Fic2VudC5qb2luKCcsICcpfSDigJQgdGhhdCByZWYgbWF5IG5vdCBoYXZlIHRob3NlIGZvbGRlcnMuIFRyeSBhIGRpZmZlcmVudCAtLXJlZi5gKTtcbiAgICAgICAgICAgIHByb2Nlc3MuZXhpdENvZGUgPSAxO1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfTtcblxuICAgICAgICAvLyBgLS1yZXBvYDogY2xvbmUgdXAgZnJvbnQgKG11c3QgcHJlY2VkZSB0aGUgZW50cnlwb2ludCBjaGVjaykuXG4gICAgICAgIGlmIChib290c3RyYXBDbWQpIHtcbiAgICAgICAgICBwcmludEluZm8oYFxcbkJvb3RzdHJhcCDihpIgY2xvbmUgJHtib290c3RyYXAucmVwb30gQCAke2Jvb3RzdHJhcC5yZWZ9IGludG8gJHtib290c3RyYXAud29ya2Rpcn0gKHNwYXJzZSkuYCk7XG4gICAgICAgICAgaWYgKCEoYXdhaXQgY29uZmlybSgnR28gYWhlYWQgd2l0aCB0aGUgY2xvbmU/Jywgb3B0aW9ucy55ZXMpKSkge1xuICAgICAgICAgICAgcHJpbnRXYXJuaW5nKCdObyBwcm9ibGVtIOKAlCBub3RoaW5nIHdhcyBjaGFuZ2VkLiBSZS1ydW4gd2hlbmV2ZXIgeW91XFwncmUgcmVhZHkuJyk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmICghKGF3YWl0IGJvb3RzdHJhcENsb25lKCkpKSByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICAvLyA3Yi4gVGhlIGRlcGxveSBlbnRyeXBvaW50IG11c3QgZXhpc3QgcmVsYXRpdmUgdG8gY3dkLiBJZiBpdCBkb2Vzbid0IGFuZFxuICAgICAgICAvLyB3ZSBoYXZlbid0IGJvb3RzdHJhcHBlZCwgZ3JhY2VmdWxseSBPRkZFUiB0byBjbG9uZSAoaW50ZXJhY3RpdmUgb25seSksXG4gICAgICAgIC8vIHNvIGEgZnJlc2ggbWFjaGluZSBjYW4gcHJvY2VlZCB3aXRob3V0IHJlLXJ1bm5pbmcgd2l0aCAtLXJlcG8uXG4gICAgICAgIGlmICghZW50cnlwb2ludEV4aXN0cyhzcGVjLCBjd2QpKSB7XG4gICAgICAgICAgY29uc3QgaW50ZXJhY3RpdmUgPSBCb29sZWFuKHByb2Nlc3Muc3RkaW4uaXNUVFkpICYmICFvcHRpb25zLnllcztcbiAgICAgICAgICBpZiAoIWJvb3RzdHJhcENtZCAmJiBpbnRlcmFjdGl2ZSAmJiBnaXRBdmFpbGFibGUoKSkge1xuICAgICAgICAgICAgcHJpbnRJbmZvKGBcXG5Mb29rcyBsaWtlIHlvdSdyZSBub3QgaW5zaWRlIGEgcGlwZWxpbmUtYnVpbGRlciBjaGVja291dCwgc28gdGhlICR7c3BlYy5sYWJlbH0gZGVwbG95IHNjcmlwdHMgYXJlbid0IGhlcmUgeWV0LmApO1xuICAgICAgICAgICAgaWYgKGF3YWl0IGNvbmZpcm0oYFdhbnQgbWUgdG8gc3BhcnNlLWNsb25lIHRoZW0gaW50byAke2Jvb3RzdHJhcC53b3JrZGlyfSBhbmQga2VlcCBnb2luZz9gLCBmYWxzZSkpIHtcbiAgICAgICAgICAgICAgaWYgKCEoYXdhaXQgYm9vdHN0cmFwQ2xvbmUoKSkpIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKCFlbnRyeXBvaW50RXhpc3RzKHNwZWMsIGN3ZCkpIHtcbiAgICAgICAgICAgIHByaW50V2FybmluZyhgXFxuSSBjb3VsZG4ndCBmaW5kICR7c3BlYy5kaXJ9LyR7c3BlYy5lbnRyeXBvaW50fSBmcm9tICR7Y3dkfS5gKTtcbiAgICAgICAgICAgIHByaW50SW5mbygnVHdvIGVhc3kgd2F5cyBmb3J3YXJkOicpO1xuICAgICAgICAgICAgcHJpbnRJbmZvKCcgIOKAoiBjZCBpbnRvIHlvdXIgcGlwZWxpbmUtYnVpbGRlciBjaGVja291dCBhbmQgcmUtcnVuLCBvcicpO1xuICAgICAgICAgICAgcHJpbnRJbmZvKGAgIOKAoiBhZGQgLS1yZXBvIGFuZCBJJ2xsIGJvb3RzdHJhcCBhIGZyZXNoIHNwYXJzZSBjbG9uZSBmb3IgeW91JHtnaXRBdmFpbGFibGUoKSA/ICcuJyA6ICcgKG9uY2UgZ2l0IGlzIGluc3RhbGxlZCkuJ31gKTtcbiAgICAgICAgICAgIHByb2Nlc3MuZXhpdENvZGUgPSAxO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIE9wdC1pbiBsb2FkcyDigJQgb2ZmZXJlZCBBRlRFUiB0aGUgY2xvbmUgKHNvIHdlIG9ubHkgYXNrIG9uY2UgeW91J3ZlIGFncmVlZFxuICAgICAgICAvLyB0byBwcm9jZWVkKS4gVGhlIGNsb25lIHByZS1zdGFnZWQgZXZlcnkgbG9hZCBmb2xkZXIsIHNvIGVhY2ggY2hvaWNlIGlzIHJlYWR5XG4gICAgICAgIC8vIHdpdGhvdXQgYSByZS1zeW5jOyByZS1yZXNvbHZlIHRoZSBwb3N0LWluc3RhbGwgc3RlcHMgd2l0aCB0aGUgc2VsZWN0aW9ucy5cbiAgICAgICAgaWYgKHdpbGxQcm9tcHRMb2Fkcykge1xuICAgICAgICAgIGNvbnN0IHByb21wdHM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7XG4gICAgICAgICAgICBwbHVnaW5zOiAnTG9hZCBwbHVnaW5zPyAoYnVpbGRzIHRoZSBwbHVnaW4gaW1hZ2VzIGxvY2FsbHkg4oCUIHRoZSBzbG93IG9uZSknLFxuICAgICAgICAgICAgc2FtcGxlczogJ0xvYWQgc2FtcGxlIHBpcGVsaW5lcz8nLFxuICAgICAgICAgICAgY29tcGxpYW5jZTogJ0xvYWQgY29tcGxpYW5jZSBydWxlcz8nLFxuICAgICAgICAgIH07XG4gICAgICAgICAgcHJpbnRTZWN0aW9uKCdPcHRpb25hbCBwb3N0LWluc3RhbGwgbG9hZHMnKTtcbiAgICAgICAgICBjb25zdCBjaG9zZW46IHR5cGVvZiBlbmFibGVkTG9hZElkcyA9IFtdO1xuICAgICAgICAgIGZvciAoY29uc3QgcyBvZiBMT0FEX1NURVBTKSB7XG4gICAgICAgICAgICBpZiAoYXdhaXQgY29uZmlybShwcm9tcHRzW3MuaWRdID8/IGBMb2FkICR7cy5pZH0/YCwgZmFsc2UpKSBjaG9zZW4ucHVzaChzLmlkKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgZW5hYmxlZExvYWRJZHMgPSBjaG9zZW47XG4gICAgICAgICAgLy8gQWRkaXRpdmUgc3BhcnNlIHJlLXN5bmM6IG1hdGVyaWFsaXplIE9OTFkgdGhlIHBpY2tlZCBsb2FkcycgZm9sZGVycyBpblxuICAgICAgICAgIC8vIHRoZSBjbG9uZSAodGhlIHBhcnRpYWwgY2xvbmUgZmV0Y2hlcyB0aGVpciBibG9icyBvbiBkZW1hbmQpLiBPbmx5IHdoZW4gd2VcbiAgICAgICAgICAvLyBjcmVhdGVkIHRoZSBjbG9uZSDigJQgYSBub3JtYWwgY2hlY2tvdXQgYWxyZWFkeSBoYXMgZXZlcnkgZm9sZGVyLlxuICAgICAgICAgIGlmIChib290c3RyYXBwZWQpIHtcbiAgICAgICAgICAgIGNvbnN0IGFic2VudCA9IHNwYXJzZVBhdGhzRm9yKHRhcmdldCwgZW5hYmxlZExvYWRJZHMpLmZpbHRlcigocCkgPT4gIWV4aXN0c1N5bmMocGF0aC5qb2luKGN3ZCwgcCkpKTtcbiAgICAgICAgICAgIGlmIChhYnNlbnQubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICBwcmludFNlY3Rpb24oJ0ZldGNoaW5nIHNlbGVjdGVkIGxvYWQgZm9sZGVycycpO1xuICAgICAgICAgICAgICBjb25zdCBhZGRDbWQgPSBgZ2l0IHNwYXJzZS1jaGVja291dCBhZGQgJHthYnNlbnQubWFwKChwKSA9PiBgJyR7cH0nYCkuam9pbignICcpfSAmJiBnaXQgY2hlY2tvdXQgJyR7Ym9vdHN0cmFwLnJlZn0nYDtcbiAgICAgICAgICAgICAgcHJpbnRJbmZvKGFkZENtZCk7XG4gICAgICAgICAgICAgIGNvbnN0IHsgY29kZSB9ID0gYXdhaXQgcnVuU2NyaXB0KGFkZENtZCwgY3dkLCB7IGNhcHR1cmU6IGZhbHNlIH0pO1xuICAgICAgICAgICAgICBpZiAoY29kZSAhPT0gMCkge1xuICAgICAgICAgICAgICAgIHByaW50V2FybmluZyhgQ291bGRuJ3QgZmV0Y2ggJHthYnNlbnQuam9pbignLCAnKX0g4oCUIHRoZSBtYXRjaGluZyBsb2FkIHN0ZXAocykgbWF5IGZhaWwuIFJlLXJ1biB3aXRoIC0tcmVwbyB0byByZWZyZXNoIHRoZSBjbG9uZS5gKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICAoeyBzdGVwczogcG9zdFN0ZXBzLCBza2lwcGVkOiBza2lwcGVkU3RlcHMgfSA9IHJlc29sdmVQb3N0U3RlcHMoe1xuICAgICAgICAgICAgdGFyZ2V0LFxuICAgICAgICAgICAgdXJsLFxuICAgICAgICAgICAgcmVnaW9uOiB0eXBlb2YgcGFyYW1zLnJlZ2lvbiA9PT0gJ3N0cmluZycgPyBwYXJhbXMucmVnaW9uIDogdW5kZWZpbmVkLFxuICAgICAgICAgICAgZW5hYmxlZExvYWRJZHMsXG4gICAgICAgICAgICAuLi5wb3N0U3RlcEZsYWdzLFxuICAgICAgICAgICAgYnVpbGRCb290c3RyYXA6IHBvc3RTdGVwRmxhZ3MuYnVpbGRCb290c3RyYXAgfHwgZW5hYmxlZExvYWRJZHMuaW5jbHVkZXMoJ3BsdWdpbnMnKSxcbiAgICAgICAgICB9KSk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gbG9jYWwvbWluaWt1YmUncyBzZXR1cC5zaCBSRVFVSVJFUyBhIGAuZW52YCBhbmQgYWJvcnRzIHdpdGhvdXQgaXQg4oCUIGNyZWF0ZVxuICAgICAgICAvLyBpdCBmcm9tIC5lbnYuZXhhbXBsZSB3aXRoIGdlbmVyYXRlZCBzZWNyZXRzIHNvIHRoZSBkZXBsb3kgaXMgbm9uLWludGVyYWN0aXZlLlxuICAgICAgICAvLyBlYzIvZmFyZ2F0ZSBhbHNvIHNoaXAgYSBgLmVudi5leGFtcGxlYCwgYnV0IHRoZWlyIHNldHVwLnNoIG5ldmVyIHJlYWRzIGFcbiAgICAgICAgLy8gbG9jYWwgYC5lbnZgICh0aGUgaW5zdGFuY2UgaGFuZGxlcyBpdHMgb3duOyBGYXJnYXRlIHVzZXMgU2VjcmV0cyBNYW5hZ2VyIHZpYVxuICAgICAgICAvLyBpbml0LXNlY3JldHMuc2gpLCBzbyB3ZSBtdXN0IE5PVCBnZW5lcmF0ZSBvbmUgZm9yIHRoZW0uXG4gICAgICAgIGlmICgodGFyZ2V0ID09PSAnbG9jYWwnIHx8IHRhcmdldCA9PT0gJ21pbmlrdWJlJykgJiYgZW52RmlsZU1pc3NpbmcoY3dkLCBzcGVjLmRpcikpIHtcbiAgICAgICAgICBpZiAoYXdhaXQgY29uZmlybShgXFxuJHtzcGVjLmRpcn0vLmVudiBub3QgZm91bmQg4oCUIGNyZWF0ZSBpdCBmcm9tIC5lbnYuZXhhbXBsZSAoZ2VuZXJhdGVzIHNlY3JldHM7IGVkaXQgbGF0ZXIgZm9yIG9wdGlvbmFsIGludGVncmF0aW9ucyBsaWtlIE9BdXRoKT9gLCBvcHRpb25zLnllcykpIHtcbiAgICAgICAgICAgIGNvbnN0IG4gPSBjcmVhdGVFbnZGaWxlKGN3ZCwgc3BlYy5kaXIpO1xuICAgICAgICAgICAgcHJpbnRTdWNjZXNzKGBDcmVhdGVkICR7c3BlYy5kaXJ9Ly5lbnYg4oCUICR7bn0gc2VjcmV0KHMpIGdlbmVyYXRlZC5gKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcHJpbnRXYXJuaW5nKCdDb250aW51aW5nIHdpdGhvdXQgLmVudiDigJQgc2V0dXAuc2ggd2lsbCBhYm9ydCBpZiBpdCBzdGF5cyBtaXNzaW5nLicpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAoIShhd2FpdCBjb25maXJtKCdcXG5Qcm9jZWVkIHdpdGggdGhpcyBkZXBsb3k/Jywgb3B0aW9ucy55ZXMpKSkge1xuICAgICAgICAgIHByaW50V2FybmluZygnTm8gcHJvYmxlbSDigJQgbm90aGluZyB3YXMgY2hhbmdlZC4nKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICAvLyA3Yy4gUnVuIHRoZSBkZXBsb3kgb3V0LW9mLWxvb3AgKHJlYWwgY29tbWFuZCwgc2VjcmV0cyB1bm1hc2tlZCwgc3RyZWFtZWQgK1xuICAgICAgICAvLyBjYXB0dXJlZCksIHdpdGggYSBib3VuZGVkIGF1dG8tZml4ICsgcmV0cnkgbG9vcCDigJQgdGhlIGRlcGxveSBzY3JpcHRzIGFyZVxuICAgICAgICAvLyBpZGVtcG90ZW50LCBzbyBhIGZpeGVkIHJlLXJ1biByZXN1bWVzIHJhdGhlciB0aGFuIHN0YXJ0aW5nIG92ZXIuXG4gICAgICAgIGNvbnN0IG1heEF0dGVtcHRzID0gMSArIE1hdGgubWF4KDAsIHBhcnNlSW50KG9wdGlvbnMucmV0cmllcywgMTApIHx8IDApO1xuICAgICAgICBsZXQgcnVuUGFyYW1zOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiA9IHBhcmFtcztcbiAgICAgICAgbGV0IHN1Y2NlZWRlZCA9IGZhbHNlO1xuICAgICAgICBmb3IgKGxldCBhdHRlbXB0ID0gMTsgYXR0ZW1wdCA8PSBtYXhBdHRlbXB0czsgYXR0ZW1wdCsrKSB7XG4gICAgICAgICAgY29uc3QgcmVhbENvbW1hbmQgPSBhc3NlbWJsZUNvbW1hbmQoc3BlYywgcnVuUGFyYW1zLCB7IG1hc2s6IGZhbHNlIH0pLmNvbW1hbmQ7XG4gICAgICAgICAgcHJpbnRTZWN0aW9uKGF0dGVtcHQgPT09IDEgPyAnRGVwbG95aW5nJyA6IGBEZXBsb3lpbmcg4oCUIHJldHJ5ICR7YXR0ZW1wdCAtIDF9YCk7XG4gICAgICAgICAgaWYgKGF0dGVtcHQgPT09IDEpIHtcbiAgICAgICAgICAgIHByaW50SW5mbyhgRGVwbG95aW5nICR7c3BlYy5sYWJlbH0g4oaSICR7dXJsfWApO1xuICAgICAgICAgICAgcHJpbnRJbmZvKHNwZWMuZGVwbG95cyk7XG4gICAgICAgICAgICBwcmludEluZm8oJ1N0cmVhbWluZyB0aGUgZGVwbG95IGJlbG93IOKAlCBmaXJzdCBydW4gaXMgdGhlIHNsb3cgb25lIChpbWFnZSBwdWxscyArIGNlcnQgZ2VuZXJhdGlvbikuJyk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGNvbnN0IHsgY29kZSwgdGFpbCB9ID0gYXdhaXQgcnVuU2NyaXB0KHJlYWxDb21tYW5kLCBjd2QsIHsgY2FwdHVyZTogdHJ1ZSB9KTtcbiAgICAgICAgICBpZiAoY29kZSA9PT0gMCkgeyBzdWNjZWVkZWQgPSB0cnVlOyBicmVhazsgfVxuXG4gICAgICAgICAgcHJpbnRFcnJvcihgXFxuRGVwbG95IGZhaWxlZCAoZXhpdCAke2NvZGV9KS5gKTtcbiAgICAgICAgICBjb25zdCBpc3N1ZXMgPSBtYXRjaElzc3Vlcyh0YWlsKTtcbiAgICAgICAgICBpZiAoaXNzdWVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIHByaW50U2VjdGlvbignTGlrZWx5IGNhdXNlJyk7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IGkgb2YgaXNzdWVzKSBwcmludEluZm8oYOKAoiAke2kuY2F1c2V9XFxuICDihpIgJHtpLnN1Z2dlc3Rpb259YCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChpc0FpQ29uZmlndXJlZChhaU9wdHMpKSB7XG4gICAgICAgICAgICBjb25zdCBkaWFnbm9zaXMgPSBhd2FpdCBkaWFnbm9zZUZhaWx1cmUocmVkYWN0U2VjcmV0cyh0YWlsLCBzcGVjLCBydW5QYXJhbXMpLCBhaU9wdHMpO1xuICAgICAgICAgICAgaWYgKGRpYWdub3NpcykgeyBwcmludFNlY3Rpb24oJ0RpYWdub3NpcycpOyBwcmludEluZm8oZGlhZ25vc2lzKTsgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoYXR0ZW1wdCA+PSBtYXhBdHRlbXB0cykgYnJlYWs7XG5cbiAgICAgICAgICAvLyBBdXRvLWZpeDogYSByZXRyeWFibGUgaXNzdWUgd2l0aCBhIHBhcmFtIHdlIGhhdmVuJ3QgYWxyZWFkeSBhcHBsaWVkLlxuICAgICAgICAgIGNvbnN0IGZpeCA9IGlzc3Vlcy5maW5kKChpKSA9PiBpLnJldHJ5YWJsZSAmJiBpLnBhcmFtRml4ICYmIHJ1blBhcmFtc1tpLnBhcmFtRml4LmtleV0gIT09IGkucGFyYW1GaXgudmFsdWUpO1xuICAgICAgICAgIGlmIChmaXg/LnBhcmFtRml4ICYmIGF3YWl0IGNvbmZpcm0oYFxcbkFwcGx5IGZpeCBhbmQgcmV0cnkg4oCUICR7Zml4LnN1Z2dlc3Rpb259YCwgb3B0aW9ucy55ZXMpKSB7XG4gICAgICAgICAgICBydW5QYXJhbXMgPSB7IC4uLnJ1blBhcmFtcywgW2ZpeC5wYXJhbUZpeC5rZXldOiBmaXgucGFyYW1GaXgudmFsdWUgfTtcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgIH1cbiAgICAgICAgICAvLyBSZXRyeWFibGUgYnV0IG5vIHBhcmFtIGNoYW5nZSAoZS5nLiBBQ00gRE5TIHByb3BhZ2F0aW9uKSDigJQgb2ZmZXIgYSBwbGFpbiByZS1ydW4uXG4gICAgICAgICAgaWYgKCFmaXggJiYgaXNzdWVzLnNvbWUoKGkpID0+IGkucmV0cnlhYmxlKSAmJiBhd2FpdCBjb25maXJtKCdcXG5SZXRyeSB0aGUgZGVwbG95IChpdCBpcyBpZGVtcG90ZW50IGFuZCB3aWxsIHJlc3VtZSk/Jywgb3B0aW9ucy55ZXMpKSB7XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFzdWNjZWVkZWQpIHsgcHJvY2Vzcy5leGl0Q29kZSA9IDE7IHJldHVybjsgfVxuICAgICAgICBwcmludFN1Y2Nlc3MoJ0RlcGxveSBjb21tYW5kIGNvbXBsZXRlZC4nKTtcblxuICAgICAgICAvLyA3ZC4gU0VTIHBvc3QtZGVwbG95IGd1aWRhbmNlIChhc3luYyBES0lNICsgc2FuZGJveCArIGJvdW5jZSB0b3BpYykuXG4gICAgICAgIC8vIFNFUyBpcyBwcm92aXNpb25lZCBCWSBERUZBVUxUIG9uIEFXUyBkZXBsb3lzLCBzbyBzdXJmYWNlIHRoZSBndWlkYW5jZVxuICAgICAgICAvLyBmb3IgZWMyL2ZhcmdhdGUgdW5sZXNzIHRoZSBvcGVyYXRvciBvcHRlZCBvdXQgd2l0aCAtLW5vLWVtYWlsLlxuICAgICAgICBjb25zdCBzZXNQcm92aXNpb25lZCA9ICh0YXJnZXQgPT09ICdlYzInIHx8IHRhcmdldCA9PT0gJ2ZhcmdhdGUnKSAmJiBydW5QYXJhbXMubm9FbWFpbCAhPT0gdHJ1ZTtcbiAgICAgICAgaWYgKHNlc1Byb3Zpc2lvbmVkKSB7XG4gICAgICAgICAgcHJpbnRTZWN0aW9uKCdTRVMg4oCUIG5leHQgc3RlcHMnKTtcbiAgICAgICAgICBmb3IgKGNvbnN0IGxpbmUgb2Ygc2VzUG9zdERlcGxveUd1aWRhbmNlKCkpIHByaW50SW5mbyhg4oCiICR7bGluZX1gKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIDdlLiBWZXJpZnkgaGVhbHRoIChDUkVBVEVfQ09NUExFVEUgIT0gc2VydmluZykuXG4gICAgICAgIGlmICh1cmwpIHtcbiAgICAgICAgICBwcmludFNlY3Rpb24oJ1ZlcmlmeWluZyBoZWFsdGgnKTtcbiAgICAgICAgICAvLyBNaW5pa3ViZSByZWFjaGVzIHRoZSBnYXRld2F5IHZpYSBhIGt1YmVjdGwgcG9ydC1mb3J3YXJkIHRoYXQgc2V0dXAuc2hcbiAgICAgICAgICAvLyBiYWNrZ3JvdW5kcyBhbmQgdGhhdCBjYW4gZGllL2ZhaWwgdG8gYmluZCDigJQgKHJlKXN0YXJ0IGl0IGJlZm9yZSBwb2xsaW5nXG4gICAgICAgICAgLy8gc28gd2UgZG9uJ3Qgc2l0IGF0IHRoZSBnYXRlIG9uIGEgZGVhZCBmb3J3YXJkIHdoaWxlIHRoZSBwb2RzIGFyZSBmaW5lLlxuICAgICAgICAgIGlmICh0YXJnZXQgPT09ICdtaW5pa3ViZScpIHtcbiAgICAgICAgICAgIGF3YWl0IGVuc3VyZU1pbmlrdWJlR2F0ZXdheSh1cmwsIHsgb25JbmZvOiAobSkgPT4gcHJpbnRJbmZvKG0pIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgICBwcmludEluZm8oYFBvbGxpbmcgJHt1cmx9L2hlYWx0aCDigKZgKTtcbiAgICAgICAgICBjb25zdCBoZWFsdGggPSBhd2FpdCB3YWl0SGVhbHRoeSh1cmwsIHsgb25UaWNrOiAobSkgPT4gcHJpbnRJbmZvKG0pIH0pO1xuICAgICAgICAgIChoZWFsdGguaGVhbHRoeSA/IHByaW50U3VjY2VzcyA6IHByaW50V2FybmluZykoYCR7aGVhbHRoLnVybH0g4oCUICR7aGVhbHRoLmRldGFpbH1gKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIDdmLiBQb3N0LWluc3RhbGwgc3RlcHMgKHJlZ2lzdGVyICsgb3B0LWluIGxvYWRzLCBzbW9rZSB0ZXN0LCBldmVudHMsIGN1c3RvbSkuXG4gICAgICAgIC8vIHJlZ2lzdGVyIHJ1bnMgaW5pdC1wbGF0Zm9ybTsgZm9yIEVDMi9GYXJnYXRlIGl0IG11c3QgcnVuIGZyb20gaW5zaWRlIHRoZVxuICAgICAgICAvLyBWUEMsIHNvIHdlIHN1cmZhY2UgdGhlIGNvbW1hbmQgdGhlcmUgaW5zdGVhZCBvZiBleGVjdXRpbmcgaXQgbG9jYWxseS5cbiAgICAgICAgaWYgKHBvc3RTdGVwcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgZm9yIChjb25zdCBzIG9mIHNraXBwZWRTdGVwcykgcHJpbnRXYXJuaW5nKGBTa2lwcGVkIHBvc3Qtc3RlcCAke3MuaWR9OiAke3MucmVhc29ufWApO1xuICAgICAgICAgIGNvbnN0IGlzUmVtb3RlUmVnaXN0ZXIgPSAoaWQ6IHN0cmluZyk6IGJvb2xlYW4gPT4gaWQgPT09ICdyZWdpc3RlcicgJiYgKHRhcmdldCA9PT0gJ2VjMicgfHwgdGFyZ2V0ID09PSAnZmFyZ2F0ZScpO1xuICAgICAgICAgIGNvbnN0IHJ1bm5hYmxlID0gcG9zdFN0ZXBzLmZpbHRlcigocykgPT4gIWlzUmVtb3RlUmVnaXN0ZXIocy5pZCkpO1xuICAgICAgICAgIGZvciAoY29uc3QgcyBvZiBwb3N0U3RlcHMpIHtcbiAgICAgICAgICAgIGlmIChpc1JlbW90ZVJlZ2lzdGVyKHMuaWQpKSB7XG4gICAgICAgICAgICAgIHByaW50SW5mbygnXFxuTmV4dCAocnVuIGZyb20gaW5zaWRlIHRoZSBWUEMpOiByZWdpc3RlciBhZG1pbiArIGxvYWQgcGx1Z2lucyDigJQnKTtcbiAgICAgICAgICAgICAgcHJpbnRJbmZvKGAgICR7cy5jb21tYW5kfWApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAocnVubmFibGUubGVuZ3RoID4gMCAmJiBhd2FpdCBjb25maXJtKGBcXG5SdW4gJHtydW5uYWJsZS5sZW5ndGh9IHBvc3QtaW5zdGFsbCBzdGVwKHMpIG5vdz9gLCBvcHRpb25zLnllcykpIHtcbiAgICAgICAgICAgIGZvciAoY29uc3QgcyBvZiBydW5uYWJsZSkge1xuICAgICAgICAgICAgICBwcmludFNlY3Rpb24oYFBvc3Qtc3RlcDogJHtzLmxhYmVsfWApO1xuICAgICAgICAgICAgICAvLyBTdGVwcyB0aGF0IGxvZyBpbnRvIHRoZSBwbGF0Zm9ybSAocmVnaXN0ZXIgKyBzdG9yZS10b2tlbikgbmVlZCB0aGVcbiAgICAgICAgICAgICAgLy8gYWRtaW4gY3JlZHMgKFBMQVRGT1JNX0lERU5USUZJRVIgLyBQTEFURk9STV9QQVNTV09SRCkgb24gdG9wIG9mIHRoZWlyXG4gICAgICAgICAgICAgIC8vIG93biBzdGVwIGVudi4gc2V0dXAtZXZlbnRzIGRvZXMgTk9UIGxvZyBpbiDigJQgaXQgcmVhZHMgUExBVEZPUk1fU0VDUkVUX05BTUUsXG4gICAgICAgICAgICAgIC8vIEFXUyBjcmVkcywgYW5kIHRoZSByZWdpb24gZnJvbSB0aGUgQVdTIGVudmlyb25tZW50IOKAlCBzbyBpdCdzIGV4Y2x1ZGVkLlxuICAgICAgICAgICAgICBjb25zdCBuZWVkc0NyZWRzID0gcy5pZCA9PT0gJ3JlZ2lzdGVyJyB8fCBzLmlkID09PSAnc3RvcmUtdG9rZW4nO1xuICAgICAgICAgICAgICBjb25zdCBlbnYgPSBuZWVkc0NyZWRzID8geyAuLi5zLmVudiwgLi4uYWRtaW5FbnYgfSA6IHMuZW52O1xuICAgICAgICAgICAgICAvLyBUaGVzZSBzdGVwcyAocGx1Z2luL3NhbXBsZS9jb21wbGlhbmNlIGxvYWRzLCBzbW9rZSwgZXZlbnRzKSBhcmUgbm9pc3lcbiAgICAgICAgICAgICAgLy8gYW5kIG5vbi1pbnRlcmFjdGl2ZSwgc28gcnVuIHRoZW0gUVVJRVRMWSDigJQgY2FwdHVyZSB0aGUgb3V0cHV0IGFuZCBvbmx5XG4gICAgICAgICAgICAgIC8vIHN1cmZhY2UgaXQgb24gZmFpbHVyZS4gVGhlIGV4Y2VwdGlvbiBpcyBhIHJlZ2lzdGVyIHdpdGggbm8gYWRtaW4gY3JlZHM6XG4gICAgICAgICAgICAgIC8vIGluaXQtcGxhdGZvcm0uc2ggcHJvbXB0cyBmb3IgdGhlbSwgc28gaXQgbXVzdCBzdHJlYW0gdG8gdGhlIHRlcm1pbmFsLlxuICAgICAgICAgICAgICBjb25zdCBpbnRlcmFjdGl2ZVJlZ2lzdGVyID0gcy5pZCA9PT0gJ3JlZ2lzdGVyJyAmJiAhYWRtaW5FbnYuUExBVEZPUk1fSURFTlRJRklFUjtcbiAgICAgICAgICAgICAgY29uc3QgcXVpZXQgPSAhaW50ZXJhY3RpdmVSZWdpc3RlcjtcbiAgICAgICAgICAgICAgaWYgKHF1aWV0KSBwcmludEluZm8oYCR7cy5jb21tYW5kfVxcbiAg4oCmcnVubmluZyAob3V0cHV0IHNob3duIG9ubHkgaWYgaXQgZmFpbHMpYCk7XG4gICAgICAgICAgICAgIGVsc2UgcHJpbnRJbmZvKHMuY29tbWFuZCk7XG4gICAgICAgICAgICAgIGNvbnN0IHsgY29kZSwgdGFpbCB9ID0gYXdhaXQgcnVuU2NyaXB0KHMuY29tbWFuZCwgY3dkLCB7IHF1aWV0LCBjYXB0dXJlOiBmYWxzZSwgZW52IH0pO1xuICAgICAgICAgICAgICBpZiAoY29kZSAhPT0gMCkge1xuICAgICAgICAgICAgICAgIGlmIChxdWlldCAmJiB0YWlsKSB7IHByaW50RXJyb3IoJ1xcbi0tLSBsYXN0IG91dHB1dCAtLS0nKTsgcHJpbnRJbmZvKHRhaWwpOyB9XG4gICAgICAgICAgICAgICAgcHJpbnRFcnJvcihgXFxuUG9zdC1zdGVwICcke3MuaWR9JyBmYWlsZWQgKGV4aXQgJHtjb2RlfSkuIFRoZSBwbGF0Zm9ybSBpcyBkZXBsb3llZDsgZml4IGFuZCByZS1ydW4gdGhlIHN0ZXAgbWFudWFsbHkuYCk7XG4gICAgICAgICAgICAgICAgcHJvY2Vzcy5leGl0Q29kZSA9IDE7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgcHJpbnRTdWNjZXNzKGAke3MuaWR9IOKck2ApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSBpZiAocnVubmFibGUubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgcHJpbnRJbmZvKCdcXG5Ta2lwcGVkIHBvc3QtaW5zdGFsbCBzdGVwcy4gUnVuIHRoZSBjb21tYW5kcyBhYm92ZSBtYW51YWxseSB3aGVuIHJlYWR5LicpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgaGFuZGxlRXJyb3IoZXJyb3IsIEVSUk9SX0NPREVTLkdFTkVSQUwsIHtcbiAgICAgICAgICBkZWJ1ZzogcHJvZ3JhbS5vcHRzKCkuZGVidWcsXG4gICAgICAgICAgZXhpdDogdHJ1ZSxcbiAgICAgICAgICBjb250ZXh0OiB7IGNvbW1hbmQ6ICdwcm92aXNpb24nLCBleGVjdXRpb25JZCB9LFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9KTtcbn1cbiJdfQ==
|
|
709
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJvdmlzaW9uLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2NvbW1hbmRzL3Byb3Zpc2lvbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSwrQ0FBK0M7QUFDL0Msc0NBQXNDO0FBRXRDLE9BQU8sRUFBRSxZQUFZLEVBQUUsVUFBVSxFQUFFLE1BQU0sSUFBSSxDQUFDO0FBQzlDLE9BQU8sS0FBSyxJQUFJLE1BQU0sV0FBVyxDQUFDO0FBQ2xDLE9BQU8sS0FBSyxRQUFRLE1BQU0sd0JBQXdCLENBQUM7QUFDbkQsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLFdBQVcsQ0FBQztBQUNwQyxPQUFPLEVBQUUsZUFBZSxFQUFFLGNBQWMsRUFBRSxTQUFTLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUM1RSxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsZ0JBQWdCLEVBQXNCLE1BQU0sdUJBQXVCLENBQUM7QUFDL0YsT0FBTyxFQUFFLGdCQUFnQixFQUFFLGdCQUFnQixFQUFFLFNBQVMsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBQ3JGLE9BQU8sRUFBRSxlQUFlLEVBQUUsV0FBVyxFQUFFLHFCQUFxQixFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFDekYsT0FBTyxFQUFFLGNBQWMsRUFBRSxpQkFBaUIsRUFBRSxZQUFZLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUNwRixPQUFPLEVBQUUsZ0JBQWdCLEVBQW1DLE1BQU0sd0JBQXdCLENBQUM7QUFDM0YsT0FBTyxFQUFFLFlBQVksRUFBRSxZQUFZLEVBQUUseUJBQXlCLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUM5RyxPQUFPLEVBQUUsU0FBUyxFQUFFLFNBQVMsRUFBRSxXQUFXLEVBQUUsZUFBZSxFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFDdkYsT0FBTyxFQUFFLGFBQWEsRUFBRSxjQUFjLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUNyRSxPQUFPLEVBQ0wsZUFBZSxF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QyxDQUFDO1lBQ3RGLElBQUksU0FBUyxFQUFFLENBQUM7Z0JBQUMsWUFBWSxDQUFDLFdBQVcsQ0FBQyxDQUFDO2dCQUFDLFNBQVMsQ0FBQyxTQUFTLENBQUMsQ0FBQztZQUFDLENBQUM7UUFDckUsQ0FBQztRQUNELElBQUksT0FBTyxJQUFJLFdBQVc7WUFBRSxNQUFNO1FBRWxDLHVFQUF1RTtRQUN2RSxNQUFNLEdBQUcsR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsU0FBUyxJQUFJLENBQUMsQ0FBQyxRQUFRLElBQUksU0FBUyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUM1RyxJQUFJLEdBQUcsRUFBRSxRQUFRLElBQUksTUFBTSxPQUFPLENBQUMsMkJBQTJCLEdBQUcsQ0FBQyxVQUFVLEVBQUUsRUFBRSxJQUFJLENBQUMsR0FBRyxJQUFJLEtBQUssQ0FBQyxFQUFFLENBQUM7WUFDbkcsU0FBUyxHQUFHLEVBQUUsR0FBRyxTQUFTLEVBQUUsQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxRQUFRLENBQUMsS0FBSyxFQUFFLENBQUM7WUFDckUsU0FBUztRQUNYLENBQUM7UUFDRCxtRkFBbUY7UUFDbkYsSUFBSSxDQUFDLEdBQUcsSUFBSSxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLElBQUksTUFBTSxPQUFPLENBQUMscUVBQXFFLEVBQUUsSUFBSSxDQUFDLEdBQUcsSUFBSSxLQUFLLENBQUMsRUFBRSxDQUFDO1lBQ3ZKLFNBQVM7UUFDWCxDQUFDO1FBQ0QsTUFBTTtJQUNSLENBQUM7SUFDRCxPQUFPLEVBQUUsU0FBUyxFQUFFLFNBQVMsRUFBRSxDQUFDO0FBQ2xDLENBQUM7QUFFRDs7Ozs7O0dBTUc7QUFDSCxNQUFNLENBQUMsS0FB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TSxDQUFDLEdBQUcsTUFBTSxNQUFNLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQztZQUNyRyxDQUFDO1lBRUQsZ0ZBQWdGO1lBQ2hGLCtFQUErRTtZQUMvRSxnRkFBZ0Y7WUFDaEYsTUFBTSxZQUFZLENBQUMsU0FBUyxFQUFFLFlBQVksRUFBRSxNQUFNLEVBQUUsR0FBRyxFQUFFLFFBQVEsRUFBRSxFQUFFLEdBQUcsRUFBRSxPQUFPLENBQUMsR0FBRyxFQUFFLE9BQU8sRUFBRSxlQUFlLEVBQUUsQ0FBQyxDQUFDO1FBQ3JILENBQUM7UUFBQyxPQUFPLEtBQUssRUFBRSxDQUFDO1lBQ2YsV0FBVyxDQUFDLEtBQUssRUFBRSxXQUFXLENBQUMsT0FBTyxFQUFFO2dCQUN0QyxLQUFLLEVBQUUsT0FBTyxDQUFDLElBQUksRUFBRSxDQUFDLEtBQUs7Z0JBQzNCLElBQUksRUFBRSxJQUFJO2dCQUNWLE9BQU8sRUFBRSxFQUFFLE9BQU8sRUFBRSxXQUFXLEVBQUUsV0FBVyxFQUFFO2FBQy9DLENBQUMsQ0FBQztRQUNMLENBQUM7SUFDSCxDQUFDLENBQUMsQ0FBQztBQUNQLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBDb3B5cmlnaHQgMjAyNiBQaXBlbGluZSBCdWlsZGVyIENvbnRyaWJ1dG9yc1xuLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjBcblxuaW1wb3J0IHsgcmVhZEZpbGVTeW5jLCBleGlzdHNTeW5jIH0gZnJvbSAnZnMnO1xuaW1wb3J0ICogYXMgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuaW1wb3J0ICogYXMgcmVhZGxpbmUgZnJvbSAnbm9kZTpyZWFkbGluZS9wcm9taXNlcyc7XG5pbXBvcnQgeyBDb21tYW5kIH0gZnJvbSAnY29tbWFuZGVyJztcbmltcG9ydCB7IGRpYWdub3NlRmFpbHVyZSwgaXNBaUNvbmZpZ3VyZWQsIHBhcnNlR29hbCB9IGZyb20gJy4uL2FnZW50L2FpLmpzJztcbmltcG9ydCB7IGJvb3RzdHJhcENvbW1hbmQsIHJlc29sdmVCb290c3RyYXAsIHR5cGUgQm9vdHN0cmFwU3BlYyB9IGZyb20gJy4uL2FnZW50L2Jvb3RzdHJhcC5qcyc7XG5pbXBvcnQgeyBlbnRyeXBvaW50RXhpc3RzLCBleGVjdXRpb25CbG9ja2VkLCBydW5TY3JpcHQgfSBmcm9tICcuLi9hZ2VudC9leGVjdXRvci5qcyc7XG5pbXBvcnQgeyBkZXJpdmVIZWFsdGhVcmwsIHdhaXRIZWFsdGh5LCBlbnN1cmVNaW5pa3ViZUdhdGV3YXkgfSBmcm9tICcuLi9hZ2VudC9oZWFsdGguanMnO1xuaW1wb3J0IHsgY2hlY2tIb3N0UG9ydHMsIGRpc2NvdmVySG9zdFBvcnRzLCBzdGFja1J1bm5pbmcgfSBmcm9tICcuLi9hZ2VudC9wb3J0cy5qcyc7XG5pbXBvcnQgeyByZXNvbHZlUG9zdFN0ZXBzLCB0eXBlIFBvc3RTdGVwLCB0eXBlIFNraXBwZWRTdGVwIH0gZnJvbSAnLi4vYWdlbnQvcG9zdC1zdGVwcy5qcyc7XG5pbXBvcnQgeyBjaGVja1ByZXJlcXMsIGdpdEF2YWlsYWJsZSwgZ2l0U3VwcG9ydHNTcGFyc2VDaGVja291dCwgcHJlcmVxc1NhdGlzZmllZCB9IGZyb20gJy4uL2FnZW50L3ByZXJlcXMuanMnO1xuaW1wb3J0IHsgVE9PTFNfRElSLCBmZXRjaFRvb2wsIGlzRmV0Y2hhYmxlLCB3aXRoVG9vbHNPblBhdGggfSBmcm9tICcuLi9hZ2VudC90b29scy5qcyc7XG5pbXBvcnQgeyBjcmVhdGVFbnZGaWxlLCBlbnZGaWxlTWlzc2luZyB9IGZyb20gJy4uL2FnZW50L2Vudi1maWxlLmpzJztcbmltcG9ydCB7XG4gIGFzc2VtYmxlQ29tbWFuZCxcbiAgaXNUYXJnZXRJZCxcbiAgTE9BRF9TVEVQUyxcbiAgc3BhcnNlUGF0aHNGb3IsXG4gIFRBUkdFVFMsXG4gIFRBUkdFVF9JRFMsXG4gIHRlYXJkb3duQ29tbWFuZCxcbiAgdHlwZSBUYXJnZXRJZCxcbiAgdHlwZSBUYXJnZXRTcGVjLFxufSBmcm9tICcuLi9hZ2VudC90YXJnZXRzLmpzJztcbmltcG9ydCB7IG1hdGNoSXNzdWVzLCBzZXNQb3N0RGVwbG95R3VpZGFuY2UgfSBmcm9tICcuLi9hZ2VudC90cm91Ymxlc2hvb3QuanMnO1xuaW1wb3J0IHsgcHJpbnRDb21tYW5kSGVhZGVyIH0gZnJvbSAnLi4vdXRpbHMvY29tbWFuZC11dGlscy5qcyc7XG5pbXBvcnQgeyBFUlJPUl9DT0RFUywgaGFuZGxlRXJyb3IgfSBmcm9tICcuLi91dGlscy9lcnJvci1oYW5kbGVyLmpzJztcbmltcG9ydCB7IHByaW50U2VjdGlvbiwgcHJpbnRLZXlWYWx1ZSwgcHJpbnRJbmZvLCBwcmludFdhcm5pbmcsIHByaW50RXJyb3IsIHByaW50U3VjY2VzcyB9IGZyb20gJy4uL3V0aWxzL291dHB1dC11dGlscy5qcyc7XG5cbi8qKlxuICogUmVhZCBvbmUgbGluZSBvZiB0cmltbWVkIGlucHV0IGZyb20gdGhlIHRlcm1pbmFsLCBvd25pbmcgdGhlIHJlYWRsaW5lXG4gKiBsaWZlY3ljbGUuIFVzZWQgZGlyZWN0bHkgZm9yIHRoZSBkZXN0cnVjdGl2ZSB0ZWFyZG93biBnYXRlIChhIHkvTiBpcyB0b28gZWFzeVxuICogdG8gZmF0LWZpbmdlciwgc28gd2UgcmVxdWlyZSB0aGUgb3BlcmF0b3IgdG8gVFlQRSB0aGUgdGFyZ2V0IGlkIGJhY2spLCBhbmQgYXNcbiAqIHRoZSBiYXNpcyBmb3IgYGNvbmZpcm1gLiBEZWxpYmVyYXRlbHkgaGFzIG5vIGF1dG8tYWNjZXB0LlxuICovXG5hc3luYyBmdW5jdGlvbiBhc2socXVlc3Rpb246IHN0cmluZyk6IFByb21pc2U8c3RyaW5nPiB7XG4gIGNvbnN0IHJsID0gcmVhZGxpbmUuY3JlYXRlSW50ZXJmYWNlKHsgaW5wdXQ6IHByb2Nlc3Muc3RkaW4sIG91dHB1dDogcHJvY2Vzcy5zdGRvdXQgfSk7XG4gIHRyeSB7XG4gICAgcmV0dXJuIChhd2FpdCBybC5xdWVzdGlvbihxdWVzdGlvbikpLnRyaW0oKTtcbiAgfSBmaW5hbGx5IHtcbiAgICBybC5jbG9zZSgpO1xuICB9XG59XG5cbi8qKiBJbnRlcmFjdGl2ZSB5L04gY29uZmlybWF0aW9uOyBhdXRvLXRydWUgd2hlbiBgYXV0b1llc2AgKHRoZSBgLS15ZXNgIGZsYWcpLiAqL1xuYXN5bmMgZnVuY3Rpb24gY29uZmlybShxdWVzdGlvbjogc3RyaW5nLCBhdXRvWWVzOiBib29sZWFuKTogUHJvbWlzZTxib29sZWFuPiB7XG4gIGlmIChhdXRvWWVzKSByZXR1cm4gdHJ1ZTtcbiAgY29uc3QgYW5zd2VyID0gKGF3YWl0IGFzayhgJHtxdWVzdGlvbn0gW3kvTl0gYCkpLnRvTG93ZXJDYXNlKCk7XG4gIHJldHVybiBhbnN3ZXIgPT09ICd5JyB8fCBhbnN3ZXIgPT09ICd5ZXMnO1xufVxuXG4vKiogQ29tbWFuZGVyIGNvbGxlY3RvcjogYWNjdW11bGF0ZSByZXBlYXRlZCBgLS1wb3N0LXN0ZXBgIHZhbHVlcyBpbiBvcmRlci4gKi9cbmZ1bmN0aW9uIGNvbGxlY3RTdGVwKHZhbHVlOiBzdHJpbmcsIGFjYzogc3RyaW5nW10pOiBzdHJpbmdbXSB7XG4gIHJldHVybiBbLi4uYWNjLCB2YWx1ZV07XG59XG5cbi8qKlxuICogSG9zdC1wb3J0IHByZS1mbGlnaHQgKGxvY2FsL21pbmlrdWJlKS4gUG9ydHMgYXJlIERFUklWRUQgZnJvbSB0aGUgdGFyZ2V0J3MgY2xvbmVkXG4gKiBkZXBsb3kgc291cmNlIChjb21wb3NlIC8gc2V0dXAuc2gpIHNvIHRoZSBsaXN0IGNhbid0IGRyaWZ0IOKAlCBoZW5jZSB0aGlzIHJ1bnMgQUZURVJcbiAqIHRoZSBjbG9uZS4gQSB0YWtlbiBwb3J0IG1ha2VzIGEgY29udGFpbmVyL2ZvcndhcmQgZmFpbCB0byBiaW5kIG1pZC1kZXBsb3kgKGZvciB0aGVcbiAqIGdhdGV3YXksIGEgc2lsZW50IHVucmVhY2hhYmxlIGhhbmcpLiBQcmludHMgYSDinJMv4pyXIHN1bW1hcnkgYW5kIHJldHVybnMgZmFsc2UgT05MWVxuICogd2hlbiB0aGUgY2FsbGVyIG11c3QgQUJPUlQgKGEgZmF0YWwgbG9jYWwgY29uZmxpY3QpLiBtaW5pa3ViZSBwb3J0cyBhcmUgbWFuYWdlZFxuICogZm9yd2FyZHMgKHNldHVwLnNoIHBraWxscy9yZXN0YXJ0cyB0aGVtKSwgc28gYSBjb25mbGljdCB0aGVyZSB3YXJucyBidXQgcHJvY2VlZHMuXG4gKiBSZW1vdGUgdGFyZ2V0cyAoZWMyL2ZhcmdhdGUpIGJpbmQgbm90aGluZyBsb2NhbGx5IOKGkiByZXR1cm5zIHRydWUuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBwcmVmbGlnaHRQb3J0cyhzcGVjOiBUYXJnZXRTcGVjLCB0YXJnZXQ6IFRhcmdldElkLCBjd2Q6IHN0cmluZyk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICBjb25zdCBwb3J0cyA9IGRpc2NvdmVySG9zdFBvcnRzKHRhcmdldCwgY3dkLCBzcGVjKTtcbiAgaWYgKHBvcnRzLmxlbmd0aCA9PT0gMCkgcmV0dXJuIHRydWU7XG4gIGNvbnN0IHBvcnRDaGVja3MgPSBhd2FpdCBjaGVja0hvc3RQb3J0cyhwb3J0cyk7XG4gIGNvbnN0IHRha2VuID0gcG9ydENoZWNrcy5maWx0ZXIoKGMpID0+ICFjLmF2YWlsYWJsZSk7XG4gIHByaW50U2VjdGlvbignUG9ydCBhdmFpbGFiaWxpdHknKTtcbiAgZm9yIChjb25zdCBjIG9mIHBvcnRDaGVja3MpIHByaW50SW5mbyhgJHtjLmF2YWlsYWJsZSA/ICfinJMnIDogJ+Kclyd9ICR7U3RyaW5nKGMucG9ydCkucGFkRW5kKDUpfSDigJQgJHtjLnNlcnZpY2V9YCk7XG4gIGlmICh0YWtlbi5sZW5ndGggPT09IDApIHJldHVybiB0cnVlO1xuICAvLyBsb2NhbCBQVUJMSVNIRVMgdGhlc2UgcG9ydHMgYXQgYGRvY2tlciBjb21wb3NlIHVwYCB0aW1lLCBzbyBhIGNvbmZsaWN0IGlzIGZhdGFsLlxuICAvLyBtaW5pa3ViZSdzIGFyZSBrdWJlY3RsIHBvcnQtZm9yd2FyZHMgc2V0dXAuc2ggcGtpbGxzICsgcmVzdGFydHMgKGFuZFxuICAvLyBlbnN1cmVNaW5pa3ViZUdhdGV3YXkgcmVjb3ZlcnMpLCBzbyBhIHN0YWxlIGZvcndhcmQgbXVzdCBOT1QgYmxvY2sgYSByZS1ydW4uXG4gIGNvbnN0IGZhdGFsID0gdGFyZ2V0ID09PSAnbG9jYWwnO1xuICAvLyDigKZVTkxFU1MgdGhlIGxvY2FsIHN0YWNrIGlzIGFscmVhZHkgcnVubmluZzogdGhvc2UgcG9ydHMgYXJlIGhlbGQgYnkgWU9VUiBPV05cbiAgLy8gc3RhY2ssIGFuZCBgZG9ja2VyIGNvbXBvc2UgdXBgIG5vLW9wcyB0aGVtIOKAlCB0aGlzIGlzIGV4YWN0bHkgaG93IHlvdSByZS1ydW4gdG9cbiAgLy8gYWRkIGxvYWRzL29wdGlvbnMuIERvbid0IGJsb2NrICh0aGUgd291bGQtYmUgY29uZmxpY3QgaXMgYSBzZWxmLWNvbmZsaWN0KS5cbiAgaWYgKGZhdGFsICYmIHN0YWNrUnVubmluZyh0YXJnZXQsIGN3ZCwgc3BlYykpIHtcbiAgICBwcmludFdhcm5pbmcoYFxcbiR7dGFrZW4ubGVuZ3RofSBwb3J0KHMpIGFyZSBoZWxkIGJ5IHlvdXIgYWxyZWFkeS1ydW5uaW5nICR7c3BlYy5sYWJlbH0gc3RhY2sg4oCUIHJlLXJ1bm5pbmcganVzdCByZXN1bWVzIGl0IChubyByZWFsIGNvbmZsaWN0KSwgc28gY29udGludWluZy5gKTtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICBjb25zdCBsZWFkID0gYCR7dGFrZW4ubGVuZ3RofSByZXF1aXJlZCBwb3J0KHMpIGFscmVhZHkgaW4gdXNlOiAke3Rha2VuLm1hcCgoYykgPT4gYy5wb3J0KS5qb2luKCcsICcpfWA7XG4gIChmYXRhbCA/IHByaW50RXJyb3IgOiBwcmludFdhcm5pbmcpKGZhdGFsXG4gICAgPyBgXFxuJHtsZWFkfSDigJQgdGhlIGRlcGxveSBjYW4ndCBiaW5kIHRoZW0gYW5kIHdvdWxkIGZhaWwgbWlkLXdheS4gRnJlZSB0aGVtIGFuZCByZS1ydW46YFxuICAgIDogYFxcbiR7bGVhZH0g4oCUIG9uIG1pbmlrdWJlIHRoZXNlIGFyZSB1c3VhbGx5IGEgcHJldmlvdXMgcnVuJ3MgcG9ydC1mb3J3YXJkcyAoc2V0dXAuc2ggcmVzdGFydHMgdGhlbSkuIEZyZWUgYW55IE5PTi1taW5pa3ViZSBob2xkZXIgaWYgdGhlIGdhdGV3YXkgc3RheXMgdW5yZWFjaGFibGU6YCk7XG4gIGZvciAoY29uc3QgYyBvZiB0YWtlbikgcHJpbnRJbmZvKGAgIOKAoiBwb3J0ICR7Yy5wb3J0fSAoJHtjLnNlcnZpY2V9KSDigJQgZmluZCB0aGUgaG9sZGVyOiAgbHNvZiAtaSA6JHtjLnBvcnR9YCk7XG4gIGlmICh0YWtlbi5zb21lKChjKSA9PiBjLnBvcnQgPT09IDUwMDApKSB7XG4gICAgcHJpbnRJbmZvKCcgIE5vdGU6IG9uIG1hY09TLCBwb3J0IDUwMDAgaXMgdXN1YWxseSBBaXJQbGF5IFJlY2VpdmVyIOKAlCBTeXN0ZW0gU2V0dGluZ3Mg4oaSIEdlbmVyYWwg4oaSIEFpckRyb3AgJiBIYW5kb2ZmIOKGkiBBaXJQbGF5IFJlY2VpdmVyIChvZmYpLicpO1xuICB9XG4gIHJldHVybiAhZmF0YWw7XG59XG5cbi8qKlxuICogVGVhcmRvd24gbW9kZSDigJQgdGhlIGRlc3Ryb3kgY291bnRlcnBhcnQgb2YgcHJvdmlzaW9uaW5nLCBnYXRlZCBIQVJERVIgdGhhbiBkZXBsb3k6XG4gKiBBV1MgdGFyZ2V0cyBhcmUgaXJyZXZlcnNpYmxlLCBzbyB0aGUgb3BlcmF0b3IgbXVzdCBUWVBFIHRoZSB0YXJnZXQgaWQgKC0tZm9yY2VcbiAqIGJ5cGFzc2VzIGZvciBDSTsgLS15ZXMgYWxvbmUgZG9lcyBOT1QpLiBUZXJtaW5hbDogb3ducyBpdHMgb3V0cHV0ICsgZXhpdENvZGUuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBydW5UZWFyZG93bihcbiAgc3BlYzogVGFyZ2V0U3BlYyxcbiAgdGFyZ2V0OiBUYXJnZXRJZCxcbiAgY3dkOiBzdHJpbmcsXG4gIGV4ZWN1dGlvbklkOiBzdHJpbmcsXG4gIG9wdHM6IHsgc3RhY2tOYW1lPzogc3RyaW5nOyByZWdpb24/OiBzdHJpbmc7IGZvcmNlPzogYm9vbGVhbjsgeWVzPzogYm9vbGVhbjsganNvbj86IGJvb2xlYW4gfSxcbik6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCB7IGNvbW1hbmQ6IGRvd25Db21tYW5kLCBkZXN0cnVjdGl2ZSB9ID0gdGVhcmRvd25Db21tYW5kKHRhcmdldCwge1xuICAgIHN0YWNrTmFtZTogb3B0cy5zdGFja05hbWUsXG4gICAgcmVnaW9uOiBvcHRzLnJlZ2lvbixcbiAgICAvLyBPdXIgdHlwZWQgZ2F0ZSBJUyB0aGUgY29uZmlybWF0aW9uIOKAlCBmb3J3YXJkIC0teWVzIHNvIHRoZSBuYXRpdmUgc2NyaXB0XG4gICAgLy8gKEZhcmdhdGUpIGRvZXNuJ3QgYWxzbyBibG9jayBvbiBzdGRpbiB3ZSdyZSBpbmhlcml0aW5nLlxuICAgIGFzc3VtZVllczogdHJ1ZSxcbiAgfSk7XG4gIGlmIChvcHRzLmpzb24pIHtcbiAgICBjb25zb2xlLmxvZyhKU09OLnN0cmluZ2lmeSh7IHN1Y2Nlc3M6IHRydWUsIGV4ZWN1dGlvbklkLCB0YXJnZXQsIHRlYXJkb3duOiB0cnVlLCBkZXN0cnVjdGl2ZSwgZGVzdHJveXM6IHNwZWMuZGVzdHJveXMsIGNvbW1hbmQ6IGRvd25Db21tYW5kIH0sIG51bGwsIDIpKTtcbiAgICByZXR1cm47XG4gIH1cbiAgcHJpbnRTZWN0aW9uKGBUZWFyZG93biBwbGFuIOKAlCAke3NwZWMubGFiZWx9YCk7XG4gIHByaW50S2V5VmFsdWUoeyAnVGFyZ2V0JzogdGFyZ2V0LCAnRGVzdHJveXMnOiBzcGVjLmRlc3Ryb3lzLCAnU3RvcHMgY29zdCc6IHNwZWMuY29zdCB9KTtcbiAgcHJpbnRTZWN0aW9uKCdDb21tYW5kIHRvIHJ1bicpO1xuICBwcmludEluZm8oZG93bkNvbW1hbmQpO1xuICBpZiAoZGVzdHJ1Y3RpdmUgJiYgIW9wdHMuZm9yY2UpIHtcbiAgICBjb25zdCB0b2tlbiA9IGF3YWl0IGFzayhgXFxuVGhpcyBpcyBJUlJFVkVSU0lCTEUuIFR5cGUgXCIke3RhcmdldH1cIiB0byBjb25maXJtIHRlYXJkb3duOiBgKTtcbiAgICBpZiAodG9rZW4gIT09IHRhcmdldCkge1xuICAgICAgcHJpbnRXYXJuaW5nKCdUaGF0IGRpZG5cXCd0IG1hdGNoLCBzbyBub3RoaW5nIHdhcyBkZXN0cm95ZWQg4oCUIHlvdSBoYXZlIHRvIHR5cGUgdGhlIGV4YWN0IHRhcmdldCBpZCB0byBjb25maXJtLicpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgfSBlbHNlIGlmICghZGVzdHJ1Y3RpdmUgJiYgIW9wdHMuZm9yY2UgJiYgIShhd2FpdCBjb25maXJtKCdcXG5Qcm9jZWVkIHdpdGggdGVhcmRvd24gKHN0b3BzIHRoZSBzdGFjazsgb24tZGlzayBkYXRhIHBlcnNpc3RzKT8nLCBvcHRzLnllcyA/PyBmYWxzZSkpKSB7XG4gICAgcHJpbnRXYXJuaW5nKCdObyBwcm9ibGVtIOKAlCBub3RoaW5nIHdhcyBjaGFuZ2VkLicpO1xuICAgIHJldHVybjtcbiAgfVxuICBwcmludFNlY3Rpb24oJ1RlYXJpbmcgZG93bicpO1xuICBjb25zdCB7IGNvZGU6IGRvd25Db2RlIH0gPSBhd2FpdCBydW5TY3JpcHQoZG93bkNvbW1hbmQsIGN3ZCwgeyBjYXB0dXJlOiBmYWxzZSB9KTtcbiAgaWYgKGRvd25Db2RlICE9PSAwKSB7XG4gICAgcHJpbnRFcnJvcihgXFxuVGVhcmRvd24gZmFpbGVkIChleGl0ICR7ZG93bkNvZGV9KS4gSW5zcGVjdCB0aGUgc3RhY2svY29udGFpbmVycyBhbmQgcmV0cnkuYCk7XG4gICAgcHJvY2Vzcy5leGl0Q29kZSA9IDE7XG4gICAgcmV0dXJuO1xuICB9XG4gIHByaW50U3VjY2VzcygnVGVhcmRvd24gY29tcGxldGUuJyk7XG59XG5cbi8qKlxuICogUnVuIHRoZSBkZXBsb3kgY29tbWFuZCAocmVhbCwgc2VjcmV0cyB1bm1hc2tlZCwgc3RyZWFtZWQgKyBjYXB0dXJlZCkgd2l0aCBhXG4gKiBib3VuZGVkIGF1dG8tZml4ICsgcmV0cnkgbG9vcCDigJQgdGhlIGRlcGxveSBzY3JpcHRzIGFyZSBpZGVtcG90ZW50LCBzbyBhIGZpeGVkXG4gKiByZS1ydW4gcmVzdW1lcyByYXRoZXIgdGhhbiBzdGFydGluZyBvdmVyLiBSZXR1cm5zIHdoZXRoZXIgaXQgc3VjY2VlZGVkIHBsdXMgdGhlXG4gKiAocG9zc2libHkgZml4LWFkanVzdGVkKSBwYXJhbXMsIHdoaWNoIHRoZSBjYWxsZXIgbmVlZHMgZm9yIFNFUyBndWlkYW5jZS5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHJ1bkRlcGxveVdpdGhSZXRyeShcbiAgc3BlYzogVGFyZ2V0U3BlYyxcbiAgdXJsOiBzdHJpbmcgfCBudWxsLFxuICBjd2Q6IHN0cmluZyxcbiAgcGFyYW1zOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPixcbiAgYWlPcHRzOiB7IHByb3ZpZGVyPzogc3RyaW5nOyBtb2RlbD86IHN0cmluZyB9LFxuICBvcHRzOiB7IHJldHJpZXM/OiBzdHJpbmc7IHllcz86IGJvb2xlYW4gfSxcbik6IFByb21pc2U8eyBzdWNjZWVkZWQ6IGJvb2xlYW47IHJ1blBhcmFtczogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gfT4ge1xuICBjb25zdCBtYXhBdHRlbXB0cyA9IDEgKyBNYXRoLm1heCgwLCBwYXJzZUludChvcHRzLnJldHJpZXMgPz8gJycsIDEwKSB8fCAwKTtcbiAgbGV0IHJ1blBhcmFtczogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gPSBwYXJhbXM7XG4gIGxldCBzdWNjZWVkZWQgPSBmYWxzZTtcbiAgZm9yIChsZXQgYXR0ZW1wdCA9IDE7IGF0dGVtcHQgPD0gbWF4QXR0ZW1wdHM7IGF0dGVtcHQrKykge1xuICAgIGNvbnN0IHJlYWxDb21tYW5kID0gYXNzZW1ibGVDb21tYW5kKHNwZWMsIHJ1blBhcmFtcywgeyBtYXNrOiBmYWxzZSB9KS5jb21tYW5kO1xuICAgIHByaW50U2VjdGlvbihhdHRlbXB0ID09PSAxID8gJ0RlcGxveWluZycgOiBgRGVwbG95aW5nIOKAlCByZXRyeSAke2F0dGVtcHQgLSAxfWApO1xuICAgIGlmIChhdHRlbXB0ID09PSAxKSB7XG4gICAgICBwcmludEluZm8oYERlcGxveWluZyAke3NwZWMubGFiZWx9IOKGkiAke3VybH1gKTtcbiAgICAgIHByaW50SW5mbyhzcGVjLmRlcGxveXMpO1xuICAgICAgcHJpbnRJbmZvKCdTdHJlYW1pbmcgdGhlIGRlcGxveSBiZWxvdyDigJQgZmlyc3QgcnVuIGlzIHRoZSBzbG93IG9uZSAoaW1hZ2UgcHVsbHMgKyBjZXJ0IGdlbmVyYXRpb24pLicpO1xuICAgIH1cbiAgICBjb25zdCB7IGNvZGUsIHRhaWwgfSA9IGF3YWl0IHJ1blNjcmlwdChyZWFsQ29tbWFuZCwgY3dkLCB7IGNhcHR1cmU6IHRydWUgfSk7XG4gICAgaWYgKGNvZGUgPT09IDApIHsgc3VjY2VlZGVkID0gdHJ1ZTsgYnJlYWs7IH1cblxuICAgIHByaW50RXJyb3IoYFxcbkRlcGxveSBmYWlsZWQgKGV4aXQgJHtjb2RlfSkuYCk7XG4gICAgY29uc3QgaXNzdWVzID0gbWF0Y2hJc3N1ZXModGFpbCk7XG4gICAgaWYgKGlzc3Vlcy5sZW5ndGggPiAwKSB7XG4gICAgICBwcmludFNlY3Rpb24oJ0xpa2VseSBjYXVzZScpO1xuICAgICAgZm9yIChjb25zdCBpIG9mIGlzc3VlcykgcHJpbnRJbmZvKGDigKIgJHtpLmNhdXNlfVxcbiAg4oaSICR7aS5zdWdnZXN0aW9ufWApO1xuICAgIH1cbiAgICBpZiAoaXNBaUNvbmZpZ3VyZWQoYWlPcHRzKSkge1xuICAgICAgY29uc3QgZGlhZ25vc2lzID0gYXdhaXQgZGlhZ25vc2VGYWlsdXJlKHJlZGFjdFNlY3JldHModGFpbCwgc3BlYywgcnVuUGFyYW1zKSwgYWlPcHRzKTtcbiAgICAgIGlmIChkaWFnbm9zaXMpIHsgcHJpbnRTZWN0aW9uKCdEaWFnbm9zaXMnKTsgcHJpbnRJbmZvKGRpYWdub3Npcyk7IH1cbiAgICB9XG4gICAgaWYgKGF0dGVtcHQgPj0gbWF4QXR0ZW1wdHMpIGJyZWFrO1xuXG4gICAgLy8gQXV0by1maXg6IGEgcmV0cnlhYmxlIGlzc3VlIHdpdGggYSBwYXJhbSB3ZSBoYXZlbid0IGFscmVhZHkgYXBwbGllZC5cbiAgICBjb25zdCBmaXggPSBpc3N1ZXMuZmluZCgoaSkgPT4gaS5yZXRyeWFibGUgJiYgaS5wYXJhbUZpeCAmJiBydW5QYXJhbXNbaS5wYXJhbUZpeC5rZXldICE9PSBpLnBhcmFtRml4LnZhbHVlKTtcbiAgICBpZiAoZml4Py5wYXJhbUZpeCAmJiBhd2FpdCBjb25maXJtKGBcXG5BcHBseSBmaXggYW5kIHJldHJ5IOKAlCAke2ZpeC5zdWdnZXN0aW9ufWAsIG9wdHMueWVzID8/IGZhbHNlKSkge1xuICAgICAgcnVuUGFyYW1zID0geyAuLi5ydW5QYXJhbXMsIFtmaXgucGFyYW1GaXgua2V5XTogZml4LnBhcmFtRml4LnZhbHVlIH07XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgLy8gUmV0cnlhYmxlIGJ1dCBubyBwYXJhbSBjaGFuZ2UgKGUuZy4gQUNNIEROUyBwcm9wYWdhdGlvbikg4oCUIG9mZmVyIGEgcGxhaW4gcmUtcnVuLlxuICAgIGlmICghZml4ICYmIGlzc3Vlcy5zb21lKChpKSA9PiBpLnJldHJ5YWJsZSkgJiYgYXdhaXQgY29uZmlybSgnXFxuUmV0cnkgdGhlIGRlcGxveSAoc2FmZSB0byByZS1ydW4g4oCUIGl0IHJlc3VtZXMgd2hlcmUgaXQgbGVmdCBvZmYpPycsIG9wdHMueWVzID8/IGZhbHNlKSkge1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIGJyZWFrO1xuICB9XG4gIHJldHVybiB7IHN1Y2NlZWRlZCwgcnVuUGFyYW1zIH07XG59XG5cbi8qKlxuICogRXhlY3V0ZSB0aGUgcG9zdC1pbnN0YWxsIHN0ZXBzIChyZWdpc3RlciDihpIgbG9hZHMg4oaSIHNtb2tlIOKGkiBldmVudHMg4oaSIGN1c3RvbSkuIE9uXG4gKiBFQzIvRmFyZ2F0ZSwgcmVnaXN0ZXIgKyB0aGUgZXZlbnRzIGJ1bmRsZSAoc3RvcmUtdG9rZW4g4oaSIHNldHVwLWV2ZW50cykgbmVlZCBhXG4gKiByZWFjaGFibGUsIFJFR0lTVEVSRUQgcGxhdGZvcm0gdGhhdCdzIG9ubHkgdHJ1ZSBpbnNpZGUgdGhlIFZQQywgc28gdGhvc2UgYXJlXG4gKiBTVVJGQUNFRCBhcyBvcmRlcmVkIG1hbnVhbCBuZXh0LXN0ZXBzIGluc3RlYWQgb2YgYXV0by1ydW4gKHRoZXknZCBmYWlsIGxvY2FsbHkpLlxuICogU2V0cyBleGl0Q29kZSBvbiBhIHN0ZXAgZmFpbHVyZTsgdGhlIHBsYXRmb3JtIGlzIGFscmVhZHkgZGVwbG95ZWQgYnkgdGhpcyBwb2ludC5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHJ1blBvc3RTdGVwcyhcbiAgcG9zdFN0ZXBzOiBQb3N0U3RlcFtdLFxuICBza2lwcGVkU3RlcHM6IFNraXBwZWRTdGVwW10sXG4gIHRhcmdldDogVGFyZ2V0SWQsXG4gIGN3ZDogc3RyaW5nLFxuICBhZG1pbkVudjogUmVjb3JkPHN0cmluZywgc3RyaW5nPixcbiAgb3B0czogeyB5ZXM/OiBib29sZWFuOyBhdXRvUnVuPzogYm9vbGVhbiB9LFxuKTogUHJvbWlzZTx2b2lkPiB7XG4gIGlmIChwb3N0U3RlcHMubGVuZ3RoID09PSAwKSByZXR1cm47XG4gIGZvciAoY29uc3QgcyBvZiBza2lwcGVkU3RlcHMpIHByaW50V2FybmluZyhgU2tpcHBlZCBwb3N0LXN0ZXAgJHtzLmlkfTogJHtzLnJlYXNvbn1gKTtcbiAgY29uc3QgaXNSZW1vdGUgPSAoaWQ6IHN0cmluZyk6IGJvb2xlYW4gPT5cbiAgICAodGFyZ2V0ID09PSAnZWMyJyB8fCB0YXJnZXQgPT09ICdmYXJnYXRlJykgJiYgKGlkID09PSAncmVnaXN0ZXInIHx8IGlkID09PSAnc3RvcmUtdG9rZW4nIHx8IGlkID09PSAnZXZlbnRzJyk7XG4gIGNvbnN0IHJ1bm5hYmxlID0gcG9zdFN0ZXBzLmZpbHRlcigocykgPT4gIWlzUmVtb3RlKHMuaWQpKTtcbiAgY29uc3QgcmVtb3RlID0gcG9zdFN0ZXBzLmZpbHRlcigocykgPT4gaXNSZW1vdGUocy5pZCkpO1xuICBpZiAocmVtb3RlLmxlbmd0aCA+IDApIHtcbiAgICBwcmludEluZm8oJ1xcbk5leHQgKHJ1biBmcm9tIGluc2lkZSB0aGUgVlBDLCBpbiB0aGlzIG9yZGVyKTonKTtcbiAgICBmb3IgKGNvbnN0IHMgb2YgcmVtb3RlKSBwcmludEluZm8oYCAg4oCiICR7cy5sYWJlbH0g4oCUICR7cy5jb21tYW5kfWApO1xuICB9XG4gIGlmIChydW5uYWJsZS5sZW5ndGggPT09IDApIHJldHVybjtcbiAgLy8gV2hlbiB0aGUgbG9hZHMgd2VyZSBwaWNrZWQgaW50ZXJhY3RpdmVseSAoYXV0b1J1biksIHRoZSB1c2VyIGFscmVhZHkgb3B0ZWQgaW4g4oCUIHNraXBcbiAgLy8gdGhlIHJlZHVuZGFudCBzZWNvbmQgY29uZmlybS4gRmxhZy1kcml2ZW4gLyBub24taW50ZXJhY3RpdmUgcnVucyBzdGlsbCBnYXRlIGhlcmUuXG4gIGlmIChvcHRzLmF1dG9SdW4gfHwgYXdhaXQgY29uZmlybShgXFxuUnVuICR7cnVubmFibGUubGVuZ3RofSBwb3N0LWluc3RhbGwgc3RlcChzKSBub3c/YCwgb3B0cy55ZXMgPz8gZmFsc2UpKSB7XG4gICAgaWYgKG9wdHMuYXV0b1J1bikgcHJpbnRJbmZvKGBcXG5SdW5uaW5nIHRoZSAke3J1bm5hYmxlLmxlbmd0aH0gcG9zdC1pbnN0YWxsIHN0ZXAocykgeW91IHNlbGVjdGVk4oCmYCk7XG4gICAgZm9yIChjb25zdCBzIG9mIHJ1bm5hYmxlKSB7XG4gICAgICBwcmludFNlY3Rpb24oYFBvc3Qtc3RlcDogJHtzLmxhYmVsfWApO1xuICAgICAgLy8gcmVnaXN0ZXIgKGxvY2FsL21pbmlrdWJlKSBsb2dzIGludG8gdGhlIHBsYXRmb3JtLCBzbyBpdCBuZWVkcyB0aGUgYWRtaW4gY3JlZHNcbiAgICAgIC8vIChQTEFURk9STV9JREVOVElGSUVSIC8gUExBVEZPUk1fUEFTU1dPUkQpIG9uIHRvcCBvZiBpdHMgc3RlcCBlbnYuXG4gICAgICBjb25zdCBuZWVkc0NyZWRzID0gcy5pZCA9PT0gJ3JlZ2lzdGVyJyB8fCBzLmlkID09PSAnc3RvcmUtdG9rZW4nO1xuICAgICAgY29uc3QgZW52ID0gbmVlZHNDcmVkcyA/IHsgLi4ucy5lbnYsIC4uLmFkbWluRW52IH0gOiBzLmVudjtcbiAgICAgIC8vIExvYWRzL3Ntb2tlIGFyZSBub2lzeSArIG5vbi1pbnRlcmFjdGl2ZSDihpIgcnVuIFFVSUVUIChjYXB0dXJlLCBzaG93IG9ubHkgb25cbiAgICAgIC8vIGZhaWx1cmUpLiBFeGNlcHRpb246IGEgcmVnaXN0ZXIgd2l0aCBubyBhZG1pbiBjcmVkcyBwcm9tcHRzLCBzbyBpdCBtdXN0IHN0cmVhbS5cbiAgICAgIGNvbnN0IGludGVyYWN0aXZlUmVnaXN0ZXIgPSBzLmlkID09PSAncmVnaXN0ZXInICYmICFhZG1pbkVudi5QTEFURk9STV9JREVOVElGSUVSO1xuICAgICAgY29uc3QgcXVpZXQgPSAhaW50ZXJhY3RpdmVSZWdpc3RlcjtcbiAgICAgIGlmIChxdWlldCkgcHJpbnRJbmZvKGAke3MuY29tbWFuZH1cXG4gIOKApnJ1bm5pbmcgKG91dHB1dCBzaG93biBvbmx5IGlmIGl0IGZhaWxzKWApO1xuICAgICAgZWxzZSBwcmludEluZm8ocy5jb21tYW5kKTtcbiAgICAgIGNvbnN0IHsgY29kZSwgdGFpbCB9ID0gYXdhaXQgcnVuU2NyaXB0KHMuY29tbWFuZCwgY3dkLCB7IHF1aWV0LCBjYXB0dXJlOiBmYWxzZSwgZW52IH0pO1xuICAgICAgaWYgKGNvZGUgIT09IDApIHtcbiAgICAgICAgaWYgKHF1aWV0ICYmIHRhaWwpIHsgcHJpbnRFcnJvcignXFxuLS0tIGxhc3Qgb3V0cHV0IC0tLScpOyBwcmludEluZm8odGFpbCk7IH1cbiAgICAgICAgcHJpbnRFcnJvcihgXFxuUG9zdC1zdGVwICcke3MuaWR9JyBmYWlsZWQgKGV4aXQgJHtjb2RlfSkuIFRoZSBwbGF0Zm9ybSBpcyBkZXBsb3llZDsgZml4IGFuZCByZS1ydW4gdGhlIHN0ZXAgbWFudWFsbHkuYCk7XG4gICAgICAgIHByb2Nlc3MuZXhpdENvZGUgPSAxO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIHByaW50U3VjY2VzcyhgJHtzLmlkfSDinJNgKTtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgcHJpbnRJbmZvKCdcXG5Ta2lwcGVkIHBvc3QtaW5zdGFsbCBzdGVwcy4gUnVuIHRoZSBjb21tYW5kcyBhYm92ZSBtYW51YWxseSB3aGVuIHJlYWR5LicpO1xuICB9XG59XG5cbi8qKlxuICogU3BhcnNlLWNsb25lIHRoZSBwbGF0Zm9ybSByZXBvICh3aGVuIC0tcmVwbywgb3IgYWNjZXB0ZWQgdmlhIHRoZSBpbnRlcmFjdGl2ZVxuICogb2ZmZXIpLCByZXBvaW50IGN3ZCBpbnRvIGl0LCBhbmQgdmVyaWZ5IHRoZSBkZXBsb3kgZW50cnlwb2ludCBleGlzdHMuIE93bnMgdGhlXG4gKiBjd2QvYm9vdHN0cmFwcGVkIHN0YXRlLiBTZXRzIGV4aXRDb2RlIG9uIGEgaGFyZCBmYWlsdXJlIChjbG9uZSBlcnJvciAvIG1pc3NpbmdcbiAqIGVudHJ5cG9pbnQpLCBtYXRjaGluZyB0aGUgb2xkIGlubGluZSBiZWhhdmlvcjsgYSBwbGFpbiBkZWNsaW5lIGxlYXZlcyBleGl0Q29kZVxuICogdW50b3VjaGVkLiBSZXR1cm5zIG9rOmZhbHNlIHdoZW4gdGhlIGNhbGxlciBtdXN0IGFib3J0LlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gYm9vdHN0cmFwQW5kTG9jYXRlKFxuICBzcGVjOiBUYXJnZXRTcGVjLFxuICBib290c3RyYXA6IEJvb3RzdHJhcFNwZWMsXG4gIGJvb3RzdHJhcENtZDogc3RyaW5nIHwgbnVsbCxcbiAgc3BhcnNlUGF0aHM6IHJlYWRvbmx5IHN0cmluZ1tdLFxuICBzdGFydEN3ZDogc3RyaW5nLFxuICBvcHRzOiB7IHllcz86IGJvb2xlYW4gfSxcbik6IFByb21pc2U8eyBjd2Q6IHN0cmluZzsgYm9vdHN0cmFwcGVkOiBib29sZWFuOyBvazogYm9vbGVhbiB9PiB7XG4gIGxldCBjd2QgPSBzdGFydEN3ZDtcbiAgbGV0IGJvb3RzdHJhcHBlZCA9IGZhbHNlO1xuICAvLyBTaGFyZWQgYnkgYC0tcmVwb2AgYW5kIHRoZSBpbnRlcmFjdGl2ZSBvZmZlci4gUmVwb2ludHMgY3dkICsgc2V0cyBib290c3RyYXBwZWQ7XG4gIC8vIGBib290c3RyYXBwZWRgIHJlY29yZHMgd2hldGhlciB3ZSBjcmVhdGVkIHRoZSBjbG9uZSAodnMuIGFuIGV4aXN0aW5nIGNoZWNrb3V0KSDigJRcbiAgLy8gb25seSB0aGVuIGNhbiB0aGUgY2FsbGVyIGFkZGl0aXZlbHkgc3BhcnNlLWZldGNoIGxvYWQgZm9sZGVycy5cbiAgY29uc3QgYm9vdHN0cmFwQ2xvbmUgPSBhc3luYyAoKTogUHJvbWlzZTxib29sZWFuPiA9PiB7XG4gICAgY29uc3QgY21kID0gYm9vdHN0cmFwQ29tbWFuZChib290c3RyYXApO1xuICAgIHByaW50U2VjdGlvbignQm9vdHN0cmFwJyk7XG4gICAgcHJpbnRJbmZvKGNtZCk7XG4gICAgY29uc3QgeyBjb2RlIH0gPSBhd2FpdCBydW5TY3JpcHQoY21kLCBjd2QsIHsgY2FwdHVyZTogZmFsc2UgfSk7XG4gICAgaWYgKGNvZGUgIT09IDApIHtcbiAgICAgIHByaW50RXJyb3IoYFxcblRoZSBjbG9uZSBkaWRuJ3QgZmluaXNoIChleGl0ICR7Y29kZX0pLiBEb3VibGUtY2hlY2sgdGhlIHJlcG8gVVJMIC8gcmVmIChvciB5b3VyIG5ldHdvcmspIGFuZCBnaXZlIGl0IGFub3RoZXIgZ28uYCk7XG4gICAgICBwcm9jZXNzLmV4aXRDb2RlID0gMTtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgY3dkID0gcGF0aC5yZXNvbHZlKGN3ZCwgYm9vdHN0cmFwLndvcmtkaXIpO1xuICAgIGJvb3RzdHJhcHBlZCA9IHRydWU7XG4gICAgcHJpbnRTdWNjZXNzKGBSZXBvIGlzIHJlYWR5IOKAlCBjb250aW51aW5nIGZyb20gJHtjd2R9YCk7XG4gICAgY29uc3QgYWJzZW50ID0gc3BhcnNlUGF0aHMuZmlsdGVyKChwKSA9PiAhZXhpc3RzU3luYyhwYXRoLmpvaW4oY3dkLCBwKSkpO1xuICAgIGlmIChhYnNlbnQubGVuZ3RoID4gMCkge1xuICAgICAgcHJpbnRFcnJvcihgXFxuVGhlIHNwYXJzZSBjbG9uZSBpcyBtaXNzaW5nICR7YWJzZW50LmpvaW4oJywgJyl9IOKAlCB0aGF0IHJlZiBtYXkgbm90IGhhdmUgdGhvc2UgZm9sZGVycy4gVHJ5IGEgZGlmZmVyZW50IC0tcmVmLmApO1xuICAgICAgcHJvY2Vzcy5leGl0Q29kZSA9IDE7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIHJldHVybiB0cnVlO1xuICB9O1xuXG4gIC8vIGAtLXJlcG9gOiBjbG9uZSB1cCBmcm9udCAobXVzdCBwcmVjZWRlIHRoZSBlbnRyeXBvaW50IGNoZWNrKS5cbiAgaWYgKGJvb3RzdHJhcENtZCkge1xuICAgIHByaW50SW5mbyhgXFxuQm9vdHN0cmFwIOKGkiBjbG9uZSAke2Jvb3RzdHJhcC5yZXBvfSBAICR7Ym9vdHN0cmFwLnJlZn0gaW50byAke2Jvb3RzdHJhcC53b3JrZGlyfSAoc3BhcnNlKS5gKTtcbiAgICBpZiAoIShhd2FpdCBjb25maXJtKCdHbyBhaGVhZCB3aXRoIHRoZSBjbG9uZT8nLCBvcHRzLnllcyA/PyBmYWxzZSkpKSB7XG4gICAgICBwcmludFdhcm5pbmcoJ05vIHByb2JsZW0g4oCUIG5vdGhpbmcgd2FzIGNoYW5nZWQuIFJlLXJ1biB3aGVuZXZlciB5b3VcXCdyZSByZWFkeS4nKTtcbiAgICAgIHJldHVybiB7IGN3ZCwgYm9vdHN0cmFwcGVkLCBvazogZmFsc2UgfTtcbiAgICB9XG4gICAgaWYgKCEoYXdhaXQgYm9vdHN0cmFwQ2xvbmUoKSkpIHJldHVybiB7IGN3ZCwgYm9vdHN0cmFwcGVkLCBvazogZmFsc2UgfTtcbiAgfVxuXG4gIC8vIFRoZSBkZXBsb3kgZW50cnlwb2ludCBtdXN0IGV4aXN0IHJlbGF0aXZlIHRvIGN3ZC4gSWYgaXQgZG9lc24ndCBhbmQgd2UgaGF2ZW4ndFxuICAvLyBib290c3RyYXBwZWQsIGdyYWNlZnVsbHkgT0ZGRVIgdG8gY2xvbmUgKGludGVyYWN0aXZlIG9ubHkpIHNvIGEgZnJlc2ggbWFjaGluZSBjYW5cbiAgLy8gcHJvY2VlZCB3aXRob3V0IHJlLXJ1bm5pbmcgd2l0aCAtLXJlcG8uXG4gIGlmICghZW50cnlwb2ludEV4aXN0cyhzcGVjLCBjd2QpKSB7XG4gICAgY29uc3QgaW50ZXJhY3RpdmUgPSBCb29sZWFuKHByb2Nlc3Muc3RkaW4uaXNUVFkpICYmICFvcHRzLnllcztcbiAgICBpZiAoIWJvb3RzdHJhcENtZCAmJiBpbnRlcmFjdGl2ZSAmJiBnaXRBdmFpbGFibGUoKSkge1xuICAgICAgcHJpbnRJbmZvKGBcXG5Mb29rcyBsaWtlIHlvdSdyZSBub3QgaW5zaWRlIGEgcGlwZWxpbmUtYnVpbGRlciBjaGVja291dCwgc28gdGhlICR7c3BlYy5sYWJlbH0gZGVwbG95IHNjcmlwdHMgYXJlbid0IGhlcmUgeWV0LmApO1xuICAgICAgaWYgKGF3YWl0IGNvbmZpcm0oYFdhbnQgbWUgdG8gc3BhcnNlLWNsb25lIHRoZW0gaW50byAke2Jvb3RzdHJhcC53b3JrZGlyfSBhbmQga2VlcCBnb2luZz9gLCBmYWxzZSkpIHtcbiAgICAgICAgaWYgKCEoYXdhaXQgYm9vdHN0cmFwQ2xvbmUoKSkpIHJldHVybiB7IGN3ZCwgYm9vdHN0cmFwcGVkLCBvazogZmFsc2UgfTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKCFlbnRyeXBvaW50RXhpc3RzKHNwZWMsIGN3ZCkpIHtcbiAgICAgIHByaW50V2FybmluZyhgXFxuSSBjb3VsZG4ndCBmaW5kICR7c3BlYy5kaXJ9LyR7c3BlYy5lbnRyeXBvaW50fSBmcm9tICR7Y3dkfS5gKTtcbiAgICAgIHByaW50SW5mbygnVHdvIGVhc3kgd2F5cyBmb3J3YXJkOicpO1xuICAgICAgcHJpbnRJbmZvKCcgIOKAoiBjZCBpbnRvIHlvdXIgcGlwZWxpbmUtYnVpbGRlciBjaGVja291dCBhbmQgcmUtcnVuLCBvcicpO1xuICAgICAgcHJpbnRJbmZvKGAgIOKAoiBhZGQgLS1yZXBvIGFuZCBJJ2xsIGJvb3RzdHJhcCBhIGZyZXNoIHNwYXJzZSBjbG9uZSBmb3IgeW91JHtnaXRBdmFpbGFibGUoKSA/ICcuJyA6ICcgKG9uY2UgZ2l0IGlzIGluc3RhbGxlZCkuJ31gKTtcbiAgICAgIHByb2Nlc3MuZXhpdENvZGUgPSAxO1xuICAgICAgcmV0dXJuIHsgY3dkLCBib290c3RyYXBwZWQsIG9rOiBmYWxzZSB9O1xuICAgIH1cbiAgfVxuICByZXR1cm4geyBjd2QsIGJvb3RzdHJhcHBlZCwgb2s6IHRydWUgfTtcbn1cblxuLyoqXG4gKiBJbnRlcmFjdGl2ZSBvcHQtaW4gbG9hZHMsIG9mZmVyZWQgQUZURVIgdGhlIGNsb25lIChzbyB3ZSBvbmx5IGFzayBvbmNlIHRoZSBvcGVyYXRvclxuICogaGFzIGFncmVlZCB0byBwcm9jZWVkKS4gUHJvbXB0cyBwZXIgbG9hZCwgYWRkaXRpdmVseSBzcGFyc2UtZmV0Y2hlcyB0aGUgcGlja2VkXG4gKiBmb2xkZXJzIGludG8gYSBib290c3RyYXBwZWQgc3BhcnNlIGNsb25lLCB0aGVuIHJlLXJlc29sdmVzIHRoZSBwb3N0LWluc3RhbGwgc3RlcHNcbiAqIHdpdGggdGhlIHNlbGVjdGlvbnMuIFJldHVybnMgdGhlIGNob3NlbiBpZHMgKyB0aGUgcmVjb21wdXRlZCBzdGVwcy5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHJlc29sdmVMb2Fkc0ludGVyYWN0aXZlbHkoXG4gIHRhcmdldDogVGFyZ2V0SWQsXG4gIHVybDogc3RyaW5nIHwgbnVsbCxcbiAgcmVnaW9uOiBzdHJpbmcgfCB1bmRlZmluZWQsXG4gIGN3ZDogc3RyaW5nLFxuICBib290c3RyYXBwZWQ6IGJvb2xlYW4sXG4gIGJvb3RzdHJhcDogQm9vdHN0cmFwU3BlYyxcbiAgcG9zdFN0ZXBGbGFnczogeyBpbml0OiBib29sZWFuOyBidWlsZEJvb3RzdHJhcDogYm9vbGVhbjsgc21va2VUZXN0OiBib29sZWFuOyBldmVudHM6IGJvb2xlYW47IHN0ZXBzOiBzdHJpbmdbXSB9LFxuKTogUHJvbWlzZTx7IGVuYWJsZWRMb2FkSWRzOiBzdHJpbmdbXTsgc3RlcHM6IFBvc3RTdGVwW107IHNraXBwZWQ6IFNraXBwZWRTdGVwW10gfT4ge1xuICBjb25zdCBwcm9tcHRzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge1xuICAgIHBsdWdpbnM6ICdMb2FkIHBsdWdpbnM/JyxcbiAgICBzYW1wbGVzOiAnTG9hZCBzYW1wbGUgcGlwZWxpbmVzPycsXG4gICAgY29tcGxpYW5jZTogJ0xvYWQgY29tcGxpYW5jZSBydWxlcz8nLFxuICB9O1xuICBwcmludFNlY3Rpb24oJ09wdGlvbmFsIHBvc3QtaW5zdGFsbCBsb2FkcycpO1xuICBjb25zdCBjaG9zZW46IHN0cmluZ1tdID0gW107XG4gIGZvciAoY29uc3QgcyBvZiBMT0FEX1NURVBTKSB7XG4gICAgaWYgKGF3YWl0IGNvbmZpcm0ocHJvbXB0c1tzLmlkXSA/PyBgTG9hZCAke3MuaWR9P2AsIGZhbHNlKSkgY2hvc2VuLnB1c2gocy5pZCk7XG4gIH1cbiAgLy8gQWRkaXRpdmUgc3BhcnNlIHJlLXN5bmM6IG1hdGVyaWFsaXplIE9OTFkgdGhlIHBpY2tlZCBsb2FkcycgZm9sZGVycyAodGhlIHBhcnRpYWxcbiAgLy8gY2xvbmUgZmV0Y2hlcyB0aGVpciBibG9icyBvbiBkZW1hbmQpLiBPbmx5IHdoZW4gd2UgY3JlYXRlZCBhIFNQQVJTRSBjbG9uZSDigJQgYVxuICAvLyBub3JtYWwgY2hlY2tvdXQgYWxyZWFkeSBoYXMgZXZlcnkgZm9sZGVyLCBhbmQgdGhlIGdpdDwyLjI3IGZ1bGwtY2xvbmUgZmFsbGJhY2tcbiAgLy8gKGJvb3RzdHJhcC5mdWxsKSBpcyBub24tc3BhcnNlLCB3aGVyZSBgc3BhcnNlLWNoZWNrb3V0IGFkZGAgd291bGQgc3dpdGNoIGl0IHRvXG4gIC8vIGNvbmUgbW9kZSBhbmQgUFJVTkUgdGhlIGFscmVhZHktbWF0ZXJpYWxpemVkIGRlcGxveSBmb2xkZXJzLlxuICBpZiAoYm9vdHN0cmFwcGVkICYmICFib290c3RyYXAuZnVsbCkge1xuICAgIGNvbnN0IGFic2VudCA9IHNwYXJzZVBhdGhzRm9yKHRhcmdldCwgY2hvc2VuKS5maWx0ZXIoKHApID0+ICFleGlzdHNTeW5jKHBhdGguam9pbihjd2QsIHApKSk7XG4gICAgaWYgKGFic2VudC5sZW5ndGggPiAwKSB7XG4gICAgICBwcmludFNlY3Rpb24oJ0ZldGNoaW5nIHNlbGVjdGVkIGxvYWQgZm9sZGVycycpO1xuICAgICAgY29uc3QgYWRkQ21kID0gYGdpdCBzcGFyc2UtY2hlY2tvdXQgYWRkICR7YWJzZW50Lm1hcCgocCkgPT4gYCcke3B9J2ApLmpvaW4oJyAnKX0gJiYgZ2l0IGNoZWNrb3V0ICcke2Jvb3RzdHJhcC5yZWZ9J2A7XG4gICAgICBwcmludEluZm8oYWRkQ21kKTtcbiAgICAgIGNvbnN0IHsgY29kZSB9ID0gYXdhaXQgcnVuU2NyaXB0KGFkZENtZCwgY3dkLCB7IGNhcHR1cmU6IGZhbHNlIH0pO1xuICAgICAgaWYgKGNvZGUgIT09IDApIHtcbiAgICAgICAgcHJpbnRXYXJuaW5nKGBDb3VsZG4ndCBmZXRjaCAke2Fic2VudC5qb2luKCcsICcpfSDigJQgdGhlIG1hdGNoaW5nIGxvYWQgc3RlcChzKSBtYXkgZmFpbC4gUmUtcnVuIHdpdGggLS1yZXBvIHRvIHJlZnJlc2ggdGhlIGNsb25lLmApO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICBjb25zdCByZXNvbHZlZCA9IHJlc29sdmVQb3N0U3RlcHMoe1xuICAgIHRhcmdldCxcbiAgICB1cmwsXG4gICAgcmVnaW9uLFxuICAgIGVuYWJsZWRMb2FkSWRzOiBjaG9zZW4sXG4gICAgLi4ucG9zdFN0ZXBGbGFncyxcbiAgICBidWlsZEJvb3RzdHJhcDogcG9zdFN0ZXBGbGFncy5idWlsZEJvb3RzdHJhcCB8fCBjaG9zZW4uaW5jbHVkZXMoJ3BsdWdpbnMnKSxcbiAgfSk7XG4gIHJldHVybiB7IGVuYWJsZWRMb2FkSWRzOiBjaG9zZW4sIHN0ZXBzOiByZXNvbHZlZC5zdGVwcywgc2tpcHBlZDogcmVzb2x2ZWQuc2tpcHBlZCB9O1xufVxuXG4vKipcbiAqIFJlZGFjdCBzZWNyZXQgcGFyYW0gdmFsdWVzIChlLmcuIHRoZSBnaGNyIHRva2VuKSBmcm9tIGNhcHR1cmVkIGRlcGxveSBvdXRwdXRcbiAqIGJlZm9yZSBpdCBpcyBzZW50IHRvIHRoZSBMTE0gZm9yIGRpYWdub3Npcy4gVGhlIGRlcGxveSBydW5zIHdpdGggc2VjcmV0c1xuICogdW5tYXNrZWQsIHNvIGFsdGhvdWdoIHRoZSBjdXJyZW50IHNjcmlwdHMgZG9uJ3QgZWNobyB0aGVtLCB0aGlzIGtlZXBzIGEgZnV0dXJlXG4gKiBzY3JpcHQncyBzdHJheSBlY2hvIChvciBhIHZlcmJvc2Ugc3ViLXRvb2wpIGZyb20gY3Jvc3NpbmcgdGhlIHRoaXJkLXBhcnR5LUxMTVxuICogYm91bmRhcnkuXG4gKi9cbmZ1bmN0aW9uIHJlZGFjdFNlY3JldHModGV4dDogc3RyaW5nLCBzcGVjOiBUYXJnZXRTcGVjLCBwYXJhbXM6IFJlY29yZDxzdHJpbmcsIHVua25vd24+KTogc3RyaW5nIHtcbiAgbGV0IG91dCA9IHRleHQ7XG4gIGZvciAoY29uc3QgaW5wdXQgb2YgWy4uLnNwZWMucmVxdWlyZWQsIC4uLnNwZWMub3B0aW9uYWxdKSB7XG4gICAgaWYgKCFpbnB1dC5zZWNyZXQpIGNvbnRpbnVlO1xuICAgIGNvbnN0IHZhbHVlID0gcGFyYW1zW2lucHV0LmtleV07XG4gICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycgJiYgdmFsdWUubGVuZ3RoID49IDQpIG91dCA9IG91dC5zcGxpdCh2YWx1ZSkuam9pbignKioqJyk7XG4gIH1cbiAgcmV0dXJuIG91dDtcbn1cblxuLyoqXG4gKiBSZWdpc3RlcnMgdGhlIGBwcm92aXNpb25gIGNvbW1hbmQg4oCUIGFuIEFJLWFzc2lzdGVkIGluc3RhbGxlciBmb3IgdGhlIFBpcGVsaW5lXG4gKiBCdWlsZGVyIFBMQVRGT1JNIChsb2NhbC9taW5pa3ViZS9FQzIvRmFyZ2F0ZSkuIEl0IHByaW50cyB0aGUgYXNzZW1ibGVkIHBsYW5cbiAqIChwcmVyZXEgY2hlY2tzLCBOTC1nb2FsIHBhcnNpbmcsIGNvbW1hbmQgYXNzZW1ibHkpIGFuZCB0aGVuIERFUExPWVMsIGdhdGVkIGJ5XG4gKiBjb25maXJtYXRpb24gcHJvbXB0cyAoYC0teWVzYCB0byBhdXRvLWFjY2VwdDsgYC0tanNvbmAgaXMgdGhlIG9ubHkgbm9uLWV4ZWN1dGluZ1xuICogbW9kZSwgcHJpbnRpbmcgdGhlIHBsYW4gZm9yIHRvb2xpbmcpLiBXaXRoIGAtLXJlcG9gIGl0IGNhbiBib290c3RyYXAgYSBmcmVzaFxuICogbWFjaGluZSBieSBzcGFyc2VseSBjbG9uaW5nIG9ubHkgdGhlIGRlcGxveSBmb2xkZXJzIHRoZSBzZWxlY3RlZCB0YXJnZXQgK1xuICogb3B0aW9ucyBuZWVkLCB0aGVuIHJ1bnMgcG9zdC1pbnN0YWxsIHN0ZXBzIChyZWdpc3RlciBhZG1pbiwgb3B0LWluIGxvYWRzLFxuICogc21va2UgdGVzdCwgY3VzdG9tIGNvbW1hbmRzKS4gYC0tdGVhcmRvd25gIHJlbW92ZXMgYSBkZXBsb3ltZW50IGluc3RlYWQuXG4gKlxuICogQHBhcmFtIHByb2dyYW0gLSBUaGUgcm9vdCBDb21tYW5kZXIgcHJvZ3JhbSBpbnN0YW5jZSB0byBhdHRhY2ggdGhlIGNvbW1hbmQgdG8uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBwcm92aXNpb24ocHJvZ3JhbTogQ29tbWFuZCk6IHZvaWQge1xuICBwcm9ncmFtXG4gICAgLmNvbW1hbmQoJ3Byb3Zpc2lvbicpXG4gICAgLmRlc2NyaXB0aW9uKCdBSS1hc3Npc3RlZCBpbnN0YWxsZXIgZm9yIHRoZSBwbGF0Zm9ybSAobG9jYWwvbWluaWt1YmUvRUMyL0ZhcmdhdGUpOiBkZXBsb3lzIGl0IChnYXRlZCBieSBjb25maXJtYXRpb24gcHJvbXB0cyksIG9yIC0tdGVhcmRvd24gdG8gcmVtb3ZlJylcbiAgICAub3B0aW9uKCctdCwgLS10YXJnZXQgPHRhcmdldD4nLCBgRGVwbG95IHRhcmdldDogJHtUQVJHRVRfSURTLmpvaW4oJyB8ICcpfWApXG4gICAgLm9wdGlvbignLXAsIC0tcHJvbXB0IDx0ZXh0PicsICdOYXR1cmFsLWxhbmd1YWdlIGdvYWwgKHBhcnNlZCBpbnRvIHBhcmFtcyB3aGVuIGFuIEFJIGtleSBpcyBzZXQpJylcbiAgICAub3B0aW9uKCctLXJlZ2lvbiA8cmVnaW9uPicsICdBV1MgcmVnaW9uIChFQzIvRmFyZ2F0ZSknKVxuICAgIC5vcHRpb24oJy0tZG9tYWluIDxkb21haW4+JywgJ0Z1bGx5LXF1YWxpZmllZCBkb21haW4gbmFtZSAoRUMyL0ZhcmdhdGUpJylcbiAgICAub3B0aW9uKCctLWhvc3RlZC16b25lLWlkIDxpZD4nLCAnUHVibGljIFJvdXRlIDUzIGhvc3RlZCB6b25lIElEIChFQzIvRmFyZ2F0ZSknKVxuICAgIC5vcHRpb24oJy0tZGVwbG95LW1vZGUgPG1vZGU+JywgJ3B1YmxpYyB8IHByaXZhdGUgKEVDMi9GYXJnYXRlKScpXG4gICAgLm9wdGlvbignLS1rZXktcGFpciA8bmFtZT4nLCAnRUMyIGtleSBwYWlyIChFQzIpJylcbiAgICAub3B0aW9uKCctLWluc3RhbmNlLXR5cGUgPHR5cGU+JywgJ0VDMiBpbnN0YW5jZSB0eXBlIChFQzIpJylcbiAgICAub3B0aW9uKCctLWdoY3ItdG9rZW4gPHRva2VuPicsICdHaXRIdWIgUEFUIChyZWFkOnBhY2thZ2VzKSDigJQgbWFza2VkIGluIG91dHB1dCcpXG4gICAgLm9wdGlvbignLS1lbWFpbCcsICdFbmFibGUgU0VTIHRyYW5zYWN0aW9uYWwgZW1haWwgKG9uIGJ5IGRlZmF1bHQgZm9yIEFXUyknKVxuICAgIC5vcHRpb24oJy0tbm8tZW1haWwnLCAnU2tpcCBTRVMgKHRyYW5zYWN0aW9uYWwgZW1haWwgaXMgcHJvdmlzaW9uZWQgYnkgZGVmYXVsdCBvbiBBV1MpJylcbiAgICAub3B0aW9uKCctLWVtYWlsLWZyb20gPGFkZHI+JywgJ1NFUyBGcm9tIGFkZHJlc3MnKVxuICAgIC5vcHRpb24oJy0tZW1haWwtZnJvbS1uYW1lIDxuYW1lPicsICdTRVMgRnJvbSBkaXNwbGF5IG5hbWUnKVxuICAgIC5vcHRpb24oJy0tYWxlcnQtZW1haWwgPGFkZHI+JywgJ1N1YnNjcmliZSBhbiBhZGRyZXNzIHRvIHRoZSBib3VuY2UvY29tcGxhaW50IFNOUyB0b3BpYycpXG4gICAgLm9wdGlvbignLS1za2lwLXNlcy1pZGVudGl0eScsICdTa2lwIFNFUyBpZGVudGl0eSBjcmVhdGlvbiAoZG9tYWluIGFscmVhZHkgdmVyaWZpZWQpJylcbiAgICAub3B0aW9uKCctLWFpLXByb3ZpZGVyIDxwcm92aWRlcj4nLCAnQUkgcHJvdmlkZXIgKGFudGhyb3BpY3xvcGVuYWl8Z29vZ2xlfHhhaXxiZWRyb2NrKScpXG4gICAgLm9wdGlvbignLS1tb2RlbCA8bW9kZWw+JywgJ0FJIG1vZGVsIGlkJylcbiAgICAub3B0aW9uKCctLWRpYWdub3NlIDxmaWxlPicsICdEaWFnbm9zZSBhIENsb3VkRm9ybWF0aW9uL2RlcGxveSBmYWlsdXJlIGZyb20gYSBmaWxlIChuZWVkcyBhbiBBSSBrZXkpJylcbiAgICAub3B0aW9uKCcteSwgLS15ZXMnLCAnQXV0by1hY2NlcHQgYWxsIGNvbmZpcm1hdGlvbiBwcm9tcHRzIChmb3IgQ0kgLyBub24taW50ZXJhY3RpdmUpJywgZmFsc2UpXG4gICAgLm9wdGlvbignLS1yZXRyaWVzIDxuPicsICdBdXRvLWZpeCArIHJldHJ5IGF0dGVtcHRzIGFmdGVyIGEgZmFpbHVyZSAoZGVwbG95IHNjcmlwdHMgYXJlIGlkZW1wb3RlbnQpJywgJzEnKVxuICAgIC5vcHRpb24oJy0tdGVhcmRvd24nLCAnVGVhciBkb3duIGFuIGV4aXN0aW5nIGRlcGxveW1lbnQgaW5zdGVhZCBvZiBjcmVhdGluZyBvbmUgKGdhdGVkOyBBV1MgdGFyZ2V0cyByZXF1aXJlIGEgdHlwZWQgY29uZmlybWF0aW9uKScsIGZhbHNlKVxuICAgIC5vcHRpb24oJy0tc3RhY2stbmFtZSA8bmFtZT4nLCAnU3RhY2sgbmFtZSAoRUMyKSAvIHN0YWNrIHByZWZpeCAoRmFyZ2F0ZSkgdG8gdGVhciBkb3duIOKAlCBkZWZhdWx0cyB0byB0aGUgZGVwbG95IGRlZmF1bHQnKVxuICAgIC5vcHRpb24oJy0tZm9yY2UnLCAnU2tpcCB0aGUgdGVhcmRvd24gdHlwZWQtY29uZmlybWF0aW9uIChEQU5HRVJPVVMg4oCUIGZvciBDSS9hdXRvbWF0aW9uIG9ubHkpJywgZmFsc2UpXG4gICAgLm9wdGlvbignLS1uby1pbml0JywgJ1NraXAgdGhlIHBvc3QtZGVwbG95IHJlZ2lzdGVyL2luaXQtcGxhdGZvcm0gc3RlcCcpXG4gICAgLy8gQm9vdHN0cmFwIChzcGFyc2UgY2xvbmUpIOKAlCBwcm92aXNpb24gYSBmcmVzaCBtYWNoaW5lIGluIG9uZSBjb21tYW5kLlxuICAgIC5vcHRpb24oJy0tcmVwbyBbdXJsXScsICdCb290c3RyYXA6IGdpdC1jbG9uZSB0aGUgcGxhdGZvcm0gcmVwbyBmaXJzdCAoc3BhcnNlIOKAlCBvbmx5IHRoZSBuZWVkZWQgZGVwbG95IGZvbGRlcnMpLCB0aGVuIHJ1biBmcm9tIGl0IChubyB2YWx1ZSA9IHRoZSB1cHN0cmVhbSBkZWZhdWx0KScpXG4gICAgLm9wdGlvbignLS1yZWYgPHJlZj4nLCAnR2l0IGJyYW5jaC90YWcgdG8gY2hlY2sgb3V0IHdoZW4gYm9vdHN0cmFwcGluZyAoZGVmYXVsdDogbWFpbiknKVxuICAgIC5vcHRpb24oJy0td29ya2RpciA8ZGlyPicsICdEaXJlY3RvcnkgdG8gY2xvbmUgaW50byAvIHJ1biBmcm9tIHdoZW4gYm9vdHN0cmFwcGluZyAoZGVmYXVsdDogcGlwZWxpbmUtYnVpbGRlciknKVxuICAgIC8vIFBvc3QtaW5zdGFsbCBsb2FkcyDigJQgZWFjaCBvcHQtaW4gc3RlcCBhbHNvIGFkZHMgaXRzIGRlcGxveSBmb2xkZXIgdG8gdGhlIHNwYXJzZSBjbG9uZS5cbiAgICAub3B0aW9uKCctLXdpdGgtcGx1Z2lucycsICdQb3N0LWluc3RhbGw6IGJ1aWxkICsgbG9hZCBwbHVnaW5zIChhZGRzIGRlcGxveS9wbHVnaW5zLCBkZXBsb3kvY29kZWJ1aWxkKScsIGZhbHNlKVxuICAgIC5vcHRpb24oJy0td2l0aC1jb21wbGlhbmNlJywgJ1Bvc3QtaW5zdGFsbDogbG9hZCBzYW1wbGUgY29tcGxpYW5jZSBydWxlcy9wb2xpY2llcyAoYWRkcyBkZXBsb3kvY29tcGxpYW5jZSknLCBmYWxzZSlcbiAgICAub3B0aW9uKCctLXdpdGgtc2FtcGxlcycsICdQb3N0LWluc3RhbGw6IGxvYWQgc2FtcGxlIHBpcGVsaW5lcyAoYWRkcyBkZXBsb3kvc2FtcGxlcyknLCBmYWxzZSlcbiAgICAub3B0aW9uKCctLXdpdGgtYWxsJywgJ1Bvc3QtaW5zdGFsbDogcGx1Z2lucyArIGNvbXBsaWFuY2UgKyBzYW1wbGVzJywgZmFsc2UpXG4gICAgLm9wdGlvbignLS1idWlsZC1ib290c3RyYXAnLCAnQnVpbGQgKyBwdWJsaXNoIHRoZSBDb2RlQnVpbGQgYm9vdHN0cmFwIGltYWdlIGR1cmluZyByZWdpc3RlciAoYWRkcyBkZXBsb3kvY29kZWJ1aWxkKScsIGZhbHNlKVxuICAgIC5vcHRpb24oJy0td2l0aC1zbW9rZS10ZXN0JywgJ1Bvc3QtaW5zdGFsbDogcmVhZC1vbmx5IEFQSSByZWFjaGFiaWxpdHkgY2hlY2snLCBmYWxzZSlcbiAgICAub3B0aW9uKCctLXdpdGgtZXZlbnRzJywgJ1Bvc3QtaW5zdGFsbCAoQVdTKTogZXZlbnQgaW5nZXN0aW9uIGJ1bmRsZSDigJQgc3RvcmUtdG9rZW4gKEpXVCDihpIgU2VjcmV0cyBNYW5hZ2VyKSB0aGVuIHNldHVwLWV2ZW50cyAoRXZlbnRCcmlkZ2UvTGFtYmRhKScsIGZhbHNlKVxuICAgIC5vcHRpb24oJy0tcG9zdC1zdGVwIDxjbWQ+JywgJ1J1biBhbiBleHRyYSBjb21tYW5kIGFmdGVyIHRoZSBsb2FkcyAocmVwZWF0YWJsZSwgaW4gb3JkZXIpJywgY29sbGVjdFN0ZXAsIFtdKVxuICAgIC5vcHRpb24oJy0tYWRtaW4tZW1haWwgPGFkZHI+JywgJ0FkbWluIGVtYWlsIGZvciBub24taW50ZXJhY3RpdmUgcmVnaXN0ZXIgKHNldHMgUExBVEZPUk1fSURFTlRJRklFUiknKVxuICAgIC5vcHRpb24oJy0tYWRtaW4tcGFzc3dvcmQgPHB3PicsICdBZG1pbiBwYXNzd29yZCBmb3Igbm9uLWludGVyYWN0aXZlIHJlZ2lzdGVyIChzZXRzIFBMQVRGT1JNX1BBU1NXT1JEKScpXG4gICAgLm9wdGlvbignLS1qc29uJywgJ1ByaW50IHRoZSBwbGFuIGFzIEpTT04gYW5kIGV4aXQgV0lUSE9VVCBydW5uaW5nICh0aGUgb25seSBub24tZXhlY3V0aW5nIG1vZGUg4oCUIGZvciB0b29saW5nL0NJIGluc3BlY3Rpb24pJywgZmFsc2UpXG4gICAgLmFjdGlvbihhc3luYyAob3B0aW9ucykgPT4ge1xuICAgICAgY29uc3QgZXhlY3V0aW9uSWQgPSBwcmludENvbW1hbmRIZWFkZXIoJ1Byb3Zpc2lvbicpO1xuXG4gICAgICB0cnkge1xuICAgICAgICAvLyAxLiBBc3NlbWJsZSBwYXJhbXMgZnJvbSBleHBsaWNpdCBmbGFncyAoZmxhZ3MgYWx3YXlzIHdpbiBvdmVyIE5MIHBhcnNlKS5cbiAgICAgICAgY29uc3QgcGFyYW1zOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiA9IHtcbiAgICAgICAgICByZWdpb246IG9wdGlvbnMucmVnaW9uLFxuICAgICAgICAgIGRvbWFpbjogb3B0aW9ucy5kb21haW4sXG4gICAgICAgICAgaG9zdGVkWm9uZUlkOiBvcHRpb25zLmhvc3RlZFpvbmVJZCxcbiAgICAgICAgICBkZXBsb3lNb2RlOiBvcHRpb25zLmRlcGxveU1vZGUsXG4gICAgICAgICAga2V5UGFpcjogb3B0aW9ucy5rZXlQYWlyLFxuICAgICAgICAgIGluc3RhbmNlVHlwZTogb3B0aW9ucy5pbnN0YW5jZVR5cGUsXG4gICAgICAgICAgZ2hjclRva2VuOiBvcHRpb25zLmdoY3JUb2tlbixcbiAgICAgICAgICAvLyBDb21tYW5kZXIgdHJpLXN0YXRlcyBgZW1haWxgOiB1bmRlZmluZWQgKG5laXRoZXIpLCB0cnVlICgtLWVtYWlsKSxcbiAgICAgICAgICAvLyBmYWxzZSAoLS1uby1lbWFpbCkuIFNFUyBpcyBvbiBieSBkZWZhdWx0LCBzbyBvbmx5IC0tbm8tZW1haWwgaXNcbiAgICAgICAgICAvLyBsb2FkLWJlYXJpbmcgKGl0IGVtaXRzIGAtLW5vLWVtYWlsYCBpbnRvIHRoZSBkZXBsb3kgY29tbWFuZCkuXG4gICAgICAgICAgZW1haWw6IG9wdGlvbnMuZW1haWwgPT09IHRydWUsXG4gICAgICAgICAgbm9FbWFpbDogb3B0aW9ucy5lbWFpbCA9PT0gZmFsc2UsXG4gICAgICAgICAgZW1haWxGcm9tOiBvcHRpb25zLmVtYWlsRnJvbSxcbiAgICAgICAgICBlbWFpbEZyb21OYW1lOiBvcHRpb25zLmVtYWlsRnJvbU5hbWUsXG4gICAgICAgICAgYWxlcnRFbWFpbDogb3B0aW9ucy5hbGVydEVtYWlsLFxuICAgICAgICAgIG5vQ3JlYXRlU2VzSWRlbnRpdHk6IG9wdGlvbnMuc2tpcFNlc0lkZW50aXR5LFxuICAgICAgICB9O1xuICAgICAgICBjb25zdCBhaU9wdHMgPSB7IHByb3ZpZGVyOiBvcHRpb25zLmFpUHJvdmlkZXIsIG1vZGVsOiBvcHRpb25zLm1vZGVsIH07XG5cbiAgICAgICAgLy8gQm9vdHN0cmFwIChzcGFyc2UgY2xvbmUpICsgcG9zdC1pbnN0YWxsIHNlbGVjdGlvbnMuXG4gICAgICAgIGNvbnN0IHdhbnRCb290c3RyYXAgPSBvcHRpb25zLnJlcG8gIT09IHVuZGVmaW5lZCAmJiBvcHRpb25zLnJlcG8gIT09IGZhbHNlO1xuICAgICAgICBjb25zdCB3aXRoQWxsID0gb3B0aW9ucy53aXRoQWxsID09PSB0cnVlO1xuICAgICAgICBjb25zdCBhbnlMb2FkRmxhZyA9IHdpdGhBbGwgfHwgTE9BRF9TVEVQUy5zb21lKChzKSA9PiBvcHRpb25zW3MuZmxhZ10gPT09IHRydWUpO1xuICAgICAgICBsZXQgZW5hYmxlZExvYWRJZHM6IHN0cmluZ1tdID0gTE9BRF9TVEVQUy5maWx0ZXIoKHMpID0+IHdpdGhBbGwgfHwgb3B0aW9uc1tzLmZsYWddID09PSB0cnVlKS5tYXAoKHMpID0+IHMuaWQpO1xuICAgICAgICAvLyBXaXRoIG5vIC0td2l0aC0qIGZsYWdzLCBhbiBpbnRlcmFjdGl2ZSBydW4gb2ZmZXJzIGVhY2ggbG9hZCDigJQgYnV0IEFGVEVSIHRoZVxuICAgICAgICAvLyBjbG9uZSwgc28gdGhlIHF1ZXN0aW9ucyBjb21lIG9uY2UgeW91J3ZlIGFncmVlZCB0byBwcm9jZWVkIChub3QgdXAgZnJvbnQpLlxuICAgICAgICAvLyBFYWNoIHBpY2tlZCBsb2FkJ3MgZm9sZGVyIGlzIHRoZW4gZmV0Y2hlZCB2aWEgYW4gYWRkaXRpdmUgc3BhcnNlIHJlLXN5bmMuXG4gICAgICAgIC8vIEZsYWdzIC8gLS15ZXMgLyAtLWpzb24gLyBub24taW50ZXJhY3RpdmUgc2hlbGxzIHNraXAgdGhlIHByb21wdHMuXG4gICAgICAgIGNvbnN0IHdpbGxQcm9tcHRMb2FkcyA9ICFvcHRpb25zLnllcyAmJiAhb3B0aW9ucy5qc29uICYmIEJvb2xlYW4ocHJvY2Vzcy5zdGRpbi5pc1RUWSkgJiYgIWFueUxvYWRGbGFnO1xuICAgICAgICBjb25zdCBwb3N0U3RlcEZsYWdzID0ge1xuICAgICAgICAgIGluaXQ6IG9wdGlvbnMuaW5pdCAhPT0gZmFsc2UsXG4gICAgICAgICAgYnVpbGRCb290c3RyYXA6IG9wdGlvbnMuYnVpbGRCb290c3RyYXAgPT09IHRydWUgfHwgZW5hYmxlZExvYWRJZHMuaW5jbHVkZXMoJ3BsdWdpbnMnKSxcbiAgICAgICAgICBzbW9rZVRlc3Q6IG9wdGlvbnMud2l0aFNtb2tlVGVzdCA9PT0gdHJ1ZSxcbiAgICAgICAgICBldmVudHM6IG9wdGlvbnMud2l0aEV2ZW50cyA9PT0gdHJ1ZSxcbiAgICAgICAgICBzdGVwczogKG9wdGlvbnMucG9zdFN0ZXAgPz8gW10pIGFzIHN0cmluZ1tdLFxuICAgICAgICB9O1xuICAgICAgICAvLyBBZG1pbiBjcmVkZW50aWFscyBmb3J3YXJkZWQgYXMgZW52IHNvIHJlZ2lzdGVyIHJ1bnMgbm9uLWludGVyYWN0aXZlbHkuXG4gICAgICAgIGNvbnN0IGFkbWluRW52OiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge307XG4gICAgICAgIGlmICh0eXBlb2Ygb3B0aW9ucy5hZG1pbkVtYWlsID09PSAnc3RyaW5nJykgYWRtaW5FbnYuUExBVEZPUk1fSURFTlRJRklFUiA9IG9wdGlvbnMuYWRtaW5FbWFpbDtcbiAgICAgICAgaWYgKHR5cGVvZiBvcHRpb25zLmFkbWluUGFzc3dvcmQgPT09ICdzdHJpbmcnKSBhZG1pbkVudi5QTEFURk9STV9QQVNTV09SRCA9IG9wdGlvbnMuYWRtaW5QYXNzd29yZDtcblxuICAgICAgICAvLyAyLiBPcHRpb25hbGx5IHBhcnNlIGEgbmF0dXJhbC1sYW5ndWFnZSBnb2FsIHRvIGZpbGwgYW55IEdBUFMgKGJlc3QtZWZmb3J0KS5cbiAgICAgICAgbGV0IHRhcmdldDogVGFyZ2V0SWQgfCB1bmRlZmluZWQgPSBpc1RhcmdldElkKG9wdGlvbnMudGFyZ2V0KSA/IG9wdGlvbnMudGFyZ2V0IDogdW5kZWZpbmVkO1xuICAgICAgICBpZiAob3B0aW9ucy5wcm9tcHQpIHtcbiAgICAgICAgICBpZiAoaXNBaUNvbmZpZ3VyZWQoYWlPcHRzKSkge1xuICAgICAgICAgICAgY29uc3QgcGFyc2VkID0gYXdhaXQgcGFyc2VHb2FsKG9wdGlvbnMucHJvbXB0LCBhaU9wdHMpO1xuICAgICAgICAgICAgaWYgKHBhcnNlZCkge1xuICAgICAgICAgICAgICBpZiAoIXRhcmdldCAmJiBpc1RhcmdldElkKHBhcnNlZC50YXJnZXQpKSB0YXJnZXQgPSBwYXJzZWQudGFyZ2V0O1xuICAgICAgICAgICAgICBmb3IgKGNvbnN0IFtrLCB2XSBvZiBPYmplY3QuZW50cmllcyhwYXJzZWQpKSB7XG4gICAgICAgICAgICAgICAgaWYgKGsgIT09ICd0YXJnZXQnICYmIHBhcmFtc1trXSA9PT0gdW5kZWZpbmVkICYmIHYgIT09IHVuZGVmaW5lZCkgcGFyYW1zW2tdID0gdjtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBwcmludFdhcm5pbmcoJ0EgLS1wcm9tcHQgd2FzIGdpdmVuIGJ1dCBubyBBSSBrZXkgaXMgc2V0IOKAlCBpZ25vcmluZyBpdCBhbmQgdXNpbmcgZmxhZ3Mgb25seS4gU2V0IEFOVEhST1BJQ19BUElfS0VZIChvciAtLWFpLXByb3ZpZGVyICsgaXRzIGtleSkuJyk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gMy4gT3B0aW9uYWwgZmFpbHVyZSBkaWFnbm9zaXMgKGluZGVwZW5kZW50IG9mIGEgZGVwbG95IHBsYW4pLlxuICAgICAgICBpZiAob3B0aW9ucy5kaWFnbm9zZSkge1xuICAgICAgICAgIGxldCBmYWlsdXJlVGV4dDogc3RyaW5nO1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICBmYWlsdXJlVGV4dCA9IHJlYWRGaWxlU3luYyhvcHRpb25zLmRpYWdub3NlLCAndXRmLTgnKTtcbiAgICAgICAgICB9IGNhdGNoIHtcbiAgICAgICAgICAgIHByaW50RXJyb3IoYENhbm5vdCByZWFkIC0tZGlhZ25vc2UgZmlsZTogJHtvcHRpb25zLmRpYWdub3NlfWApO1xuICAgICAgICAgICAgcHJvY2Vzcy5leGl0Q29kZSA9IDE7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfVxuICAgICAgICAgIGNvbnN0IGRpYWdub3NpcyA9IGlzQWlDb25maWd1cmVkKGFpT3B0cykgPyBhd2FpdCBkaWFnbm9zZUZhaWx1cmUoZmFpbHVyZVRleHQsIGFpT3B0cykgOiBudWxsO1xuICAgICAgICAgIC8vIFdpdGggLS1qc29uLCB0aGUgZGlhZ25vc2lzIElTIHRoZSBtYWNoaW5lLXJlYWRhYmxlIG91dHB1dCDigJQgZW1pdCBpdFxuICAgICAgICAgIC8vIGFsb25lIChkb24ndCBhbHNvIHByaW50IHRleHQsIHdoaWNoIHdvdWxkIGNvcnJ1cHQgdGhlIEpTT04gc3RyZWFtKS5cbiAgICAgICAgICBpZiAob3B0aW9ucy5qc29uKSB7XG4gICAgICAgICAgICBjb25zb2xlLmxvZyhKU09OLnN0cmluZ2lmeSh7IHN1Y2Nlc3M6IHRydWUsIGV4ZWN1dGlvbklkLCBkaWFnbm9zaXMgfSwgbnVsbCwgMikpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoZGlhZ25vc2lzKSB7XG4gICAgICAgICAgICBwcmludFNlY3Rpb24oJ0ZhaWx1cmUgZGlhZ25vc2lzJyk7XG4gICAgICAgICAgICBwcmludEluZm8oZGlhZ25vc2lzKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcHJpbnRXYXJuaW5nKCdEaWFnbm9zaXMgdW5hdmFpbGFibGUgKG5vIEFJIGtleSBjb25maWd1cmVkIG9yIHRoZSBtb2RlbCBjb3VsZCBub3QgYmUgcmVhY2hlZCkuJyk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmICghdGFyZ2V0KSByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICAvLyA0LiBOZWVkIGEgdGFyZ2V0IHRvIGFzc2VtYmxlIGEgcGxhbi5cbiAgICAgICAgaWYgKCF0YXJnZXQpIHtcbiAgICAgICAgICBwcmludEVycm9yKGBObyB0YXJnZXQgc3BlY2lmaWVkLiBQYXNzIC0tdGFyZ2V0IDwke1RBUkdFVF9JRFMuam9pbignfCcpfT4gb3IgZGVzY3JpYmUgdGhlIGdvYWwgd2l0aCAtLXByb21wdC5gKTtcbiAgICAgICAgICBwcm9jZXNzLmV4aXRDb2RlID0gMTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBzcGVjID0gVEFSR0VUU1t0YXJnZXRdO1xuICAgICAgICBsZXQgY3dkID0gcHJvY2Vzcy5jd2QoKTtcblxuICAgICAgICAvLyA0Yi4gVGVhcmRvd24gbW9kZSDigJQgdGhlIGRlc3Ryb3kgY291bnRlcnBhcnQgb2YgcHJvdmlzaW9uaW5nIChzZWUgcnVuVGVhcmRvd24pLlxuICAgICAgICBpZiAob3B0aW9ucy50ZWFyZG93bikge1xuICAgICAgICAgIGF3YWl0IHJ1blRlYXJkb3duKHNwZWMsIHRhcmdldCwgY3dkLCBleGVjdXRpb25JZCwgb3B0aW9ucyk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gTWFrZSBwcmV2aW91c2x5LWZldGNoZWQgc2luZ2xlLWJpbmFyeSB0b29scyAoZS5nLiB5cSkgdmlzaWJsZSB0byB0aGVcbiAgICAgICAgLy8gcHJlcmVxIGNoZWNrcyArIHRoZSBkZXBsb3kg4oCUIHRoZXkgbGl2ZSBpbiB0aGUgdG9vbHMgY2FjaGUsIG5vdCBvbiB0aGVcbiAgICAgICAgLy8gc3lzdGVtIFBBVEguIChCb3RoIGBoYXMoKWAgYW5kIHRoZSBkZXBsb3kncyBgYmFzaCAtbGNgIGluaGVyaXQgdGhpcy4pXG4gICAgICAgIHdpdGhUb29sc09uUGF0aCgpO1xuICAgICAgICBsZXQgcHJlcmVxcyA9IGNoZWNrUHJlcmVxcyh0YXJnZXQsIHsgYm9vdHN0cmFwOiB3YW50Qm9vdHN0cmFwLCB3aXRoUGx1Z2luczogd2lsbFByb21wdExvYWRzIHx8IGVuYWJsZWRMb2FkSWRzLmluY2x1ZGVzKCdwbHVnaW5zJykgfSk7XG4gICAgICAgIGNvbnN0IHsgY29tbWFuZCwgbWlzc2luZyB9ID0gYXNzZW1ibGVDb21tYW5kKHNwZWMsIHBhcmFtcyk7XG4gICAgICAgIGNvbnN0IHVybCA9IGRlcml2ZUhlYWx0aFVybCh0YXJnZXQsIHBhcmFtcyk7XG5cbiAgICAgICAgLy8gU3BhcnNlIGJvb3RzdHJhcCBjbG9uZSBjb21tYW5kIChjb21tb24gYmFzZSArIHRhcmdldCArIHNlbGVjdGVkIGxvYWRzKS5cbiAgICAgICAgLy8gSW50ZXJhY3RpdmUgbG9hZHMgYXJlIGNob3NlbiBBRlRFUiB0aGUgY2xvbmUsIHNvIHRoZSBjbG9uZSBzdGF5cyBtaW5pbWFsIOKAlFxuICAgICAgICAvLyBlYWNoIHBpY2tlZCBsb2FkJ3MgZm9sZGVyIGlzIGZldGNoZWQgdGhlbiB2aWEgYW4gYWRkaXRpdmUgc3BhcnNlIHJlLXN5bmMuXG4gICAgICAgIGNvbnN0IHNwYXJzZVBhdGhzID0gc3BhcnNlUGF0aHNGb3IodGFyZ2V0LCBlbmFibGVkTG9hZElkcyk7XG4gICAgICAgIGNvbnN0IGJvb3RzdHJhcCA9IHJlc29sdmVCb290c3RyYXAoXG4gICAgICAgICAgeyByZXBvOiB0eXBlb2Ygb3B0aW9ucy5yZXBvID09PSAnc3RyaW5nJyA/IG9wdGlvbnMucmVwbyA6IHVuZGVmaW5lZCwgcmVmOiBvcHRpb25zLnJlZiwgd29ya2Rpcjogb3B0aW9ucy53b3JrZGlyLCBmdWxsOiAhZ2l0U3VwcG9ydHNTcGFyc2VDaGVja291dCgpIH0sXG4gICAgICAgICAgc3BhcnNlUGF0aHMsXG4gICAgICAgICk7XG4gICAgICAgIGNvbnN0IGJvb3RzdHJhcENtZCA9IHdhbnRCb290c3RyYXAgPyBib290c3RyYXBDb21tYW5kKGJvb3RzdHJhcCkgOiBudWxsO1xuXG4gICAgICAgIC8vIFJlc29sdmUgcG9zdC1pbnN0YWxsIHN0ZXBzIChyZWdpc3RlciDihpIgc21va2Ug4oaSIGV2ZW50cyDihpIgY3VzdG9tKS4gUmUtcmVzb2x2ZWRcbiAgICAgICAgLy8gYWZ0ZXIgdGhlIHBvc3QtY2xvbmUgbG9hZCBwcm9tcHRzIChzZWUgYmVsb3cpIHdoZW4gdGhvc2UgcnVuIGludGVyYWN0aXZlbHkuXG4gICAgICAgIGxldCB7IHN0ZXBzOiBwb3N0U3RlcHMsIHNraXBwZWQ6IHNraXBwZWRTdGVwcyB9ID0gcmVzb2x2ZVBvc3RTdGVwcyh7XG4gICAgICAgICAgdGFyZ2V0LFxuICAgICAgICAgIHVybCxcbiAgICAgICAgICByZWdpb246IHR5cGVvZiBwYXJhbXMucmVnaW9uID09PSAnc3RyaW5nJyA/IHBhcmFtcy5yZWdpb24gOiB1bmRlZmluZWQsXG4gICAgICAgICAgZW5hYmxlZExvYWRJZHMsXG4gICAgICAgICAgLi4ucG9zdFN0ZXBGbGFncyxcbiAgICAgICAgfSk7XG5cbiAgICAgICAgaWYgKG9wdGlvbnMuanNvbikge1xuICAgICAgICAgIGNvbnNvbGUubG9nKEpTT04uc3RyaW5naWZ5KHtcbiAgICAgICAgICAgIHN1Y2Nlc3M6IHRydWUsXG4gICAgICAgICAgICBleGVjdXRpb25JZCxcbiAgICAgICAgICAgIHRhcmdldCxcbiAgICAgICAgICAgIHByZXJlcXMsXG4gICAgICAgICAgICBwcmVyZXFzU2F0aXNmaWVkOiBwcmVyZXFzU2F0aXNmaWVkKHByZXJlcXMpLFxuICAgICAgICAgICAgbWlzc2luZ0lucHV0czogbWlzc2luZy5tYXAoKG0pID0+ICh7IGZsYWc6IG0uZmxhZywgZGVzY3JpcHRpb246IG0uZGVzY3JpcHRpb24gfSkpLFxuICAgICAgICAgICAgYm9vdHN0cmFwOiBib290c3RyYXBDbWQsXG4gICAgICAgICAgICBzcGFyc2VQYXRoczogd2FudEJvb3RzdHJhcCA/IHNwYXJzZVBhdGhzIDogbnVsbCxcbiAgICAgICAgICAgIGNvbW1hbmQsXG4gICAgICAgICAgICBwb3N0U3RlcHM6IHBvc3RTdGVwcy5tYXAoKHMpID0+ICh7IGlkOiBzLmlkLCBsYWJlbDogcy5sYWJlbCwgY29tbWFuZDogcy5jb21tYW5kIH0pKSxcbiAgICAgICAgICAgIHNraXBwZWRQb3N0U3RlcHM6IHNraXBwZWRTdGVwcyxcbiAgICAgICAgICB9LCBudWxsLCAyKSk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gNS4gUHJpbnQgdGhlIHBsYW4gKHNob3duIGJlZm9yZSB0aGUgZ2F0ZWQgZXhlY3V0aW9uIGJlbG93KS5cbiAgICAgICAgcHJpbnRTZWN0aW9uKGBQcm92aXNpb24gcGxhbiDigJQgJHtzcGVjLmxhYmVsfWApO1xuICAgICAgICBwcmludEtleVZhbHVlKHsgJ1RhcmdldCc6IHRhcmdldCwgJ0Jlc3QgZm9yJzogc3BlYy5iZXN0Rm9yLCAnQ29zdCc6IHNwZWMuY29zdCB9KTtcblxuICAgICAgICBwcmludFNlY3Rpb24oJ1ByZXJlcXVpc2l0ZXMnKTtcbiAgICAgICAgZm9yIChjb25zdCBjIG9mIHByZXJlcXMpIHByaW50SW5mbyhgJHtjLm9rID8gJ+KckycgOiAn4pyXJ30gJHtjLm5hbWV9IOKAlCAke2MuZGV0YWlsfWApO1xuICAgICAgICBpZiAoIXByZXJlcXNTYXRpc2ZpZWQocHJlcmVxcykpIHByaW50V2FybmluZygnUmVzb2x2ZSB0aGUgZmFpbGluZyBwcmVyZXF1aXNpdGVzIGFib3ZlIGJlZm9yZSBkZXBsb3lpbmcuJyk7XG5cbiAgICAgICAgaWYgKG1pc3NpbmcubGVuZ3RoID4gMCkge1xuICAgICAgICAgIHByaW50U2VjdGlvbignTWlzc2luZyByZXF1aXJlZCBpbnB1dHMnKTtcbiAgICAgICAgICBmb3IgKGNvbnN0IG0gb2YgbWlzc2luZykgcHJpbnRJbmZvKGAgIC0tJHttLmZsYWd9ICAoJHttLmRlc2NyaXB0aW9ufSlgKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChib290c3RyYXBDbWQpIHtcbiAgICAgICAgICBwcmludFNlY3Rpb24oJ0Jvb3RzdHJhcCAoc3BhcnNlIGdpdCBjbG9uZSwgcnVucyBmaXJzdCknKTtcbiAgICAgICAgICBwcmludEluZm8oYENsb25lICR7Ym9vdHN0cmFwLnJlcG99IEAgJHtib290c3RyYXAucmVmfSDihpIgJHtib290c3RyYXAud29ya2Rpcn07IGZvbGRlcnM6ICR7c3BhcnNlUGF0aHMuam9pbignLCAnKX1gKTtcbiAgICAgICAgICBwcmludEluZm8oYm9vdHN0cmFwQ21kKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHByaW50U2VjdGlvbignQ29tbWFuZCB0byBydW4nKTtcbiAgICAgICAgcHJpbnRJbmZvKGNvbW1hbmQpO1xuXG4gICAgICAgIGlmIChwb3N0U3RlcHMubGVuZ3RoID4gMCB8fCBza2lwcGVkU3RlcHMubGVuZ3RoID4gMCkge1xuICAgICAgICAgIHByaW50U2VjdGlvbignUG9zdC1pbnN0YWxsIHN0ZXBzJyk7XG4gICAgICAgICAgZm9yIChjb25zdCBzIG9mIHBvc3RTdGVwcykgcHJpbnRJbmZvKGDigKIgJHtzLmxhYmVsfVxcbiAgICAke3MuY29tbWFuZH1gKTtcbiAgICAgICAgICBmb3IgKGNvbnN0IHMgb2Ygc2tpcHBlZFN0ZXBzKSBwcmludFdhcm5pbmcoYHNraXBwZWQgJHtzLmlkfTogJHtzLnJlYXNvbn1gKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIDYuIEFueSBtaXNzaW5nIHJlcXVpcmVkIHByZXJlcSB0aGF0J3MgYSBzaW5nbGUgc3RhdGljIGJpbmFyeSAoZS5nLiB5cSlcbiAgICAgICAgLy8gY2FuIGJlIGZldGNoZWQgaW50byB0aGUgdG9vbHMgY2FjaGUgaW5zdGVhZCBvZiBhIHN5c3RlbSBpbnN0YWxsIOKAlCBub1xuICAgICAgICAvLyBicmV3L2FwdC4gT2ZmZXIgaXQsIHRoZW4gcmUtY2hlY2sgKHRoZSBjYWNoZSBkaXIgaXMgYWxyZWFkeSBvbiBQQVRIKS5cbiAgICAgICAgY29uc3QgZmV0Y2hhYmxlID0gcHJlcmVxcy5maWx0ZXIoKGMpID0+ICFjLm9rICYmIGMucmVxdWlyZWQgJiYgaXNGZXRjaGFibGUoYy5uYW1lKSk7XG4gICAgICAgIGlmIChmZXRjaGFibGUubGVuZ3RoID4gMCkge1xuICAgICAgICAgIGNvbnN0IG5hbWVzID0gZmV0Y2hhYmxlLm1hcCgoYykgPT4gYy5uYW1lKS5qb2luKCcsICcpO1xuICAgICAgICAgIGlmIChhd2FpdCBjb25maXJtKGBcXG4ke25hbWVzfSBub3QgaW5zdGFsbGVkIOKAlCBmZXRjaCB0aGUgb2ZmaWNpYWwgc3RhdGljIGJpbmFyeSBpbnRvICR7VE9PTFNfRElSfSAobm8gc3lzdGVtIGluc3RhbGwpP2AsIG9wdGlvbnMueWVzKSkge1xuICAgICAgICAgICAgZm9yIChjb25zdCBjIG9mIGZldGNoYWJsZSkge1xuICAgICAgICAgICAgICBwcmludEluZm8oYEZldGNoaW5nICR7Yy5uYW1lfeKApmApO1xuICAgICAgICAgICAgICBpZiAoIWZldGNoVG9vbChjLm5hbWUpKSBwcmludFdhcm5pbmcoYENvdWxkbid0IGZldGNoICR7Yy5uYW1lfSDigJQgaW5zdGFsbCBpdCBtYW51YWxseSBhbmQgcmUtcnVuLmApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcHJlcmVxcyA9IGNoZWNrUHJlcmVxcyh0YXJnZXQsIHsgYm9vdHN0cmFwOiB3YW50Qm9vdHN0cmFwLCB3aXRoUGx1Z2luczogd2lsbFByb21wdExvYWRzIHx8IGVuYWJsZWRMb2FkSWRzLmluY2x1ZGVzKCdwbHVnaW5zJykgfSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gN2IuIEdhdGVkIGV4ZWN1dGlvbi4gQ2hlY2sgcHJlcmVxcyAvIHJlcXVpcmVkIGlucHV0cyBmaXJzdCDigJQgdGhpcyBhbHNvXG4gICAgICAgIC8vIGNhdGNoZXMgYSBtaXNzaW5nIGBnaXRgIHdoZW4gYm9vdHN0cmFwcGluZy5cbiAgICAgICAgY29uc3QgYmxvY2tlZCA9IGV4ZWN1dGlvbkJsb2NrZWQocHJlcmVxcywgbWlzc2luZyk7XG4gICAgICAgIGlmIChibG9ja2VkKSB7XG4gICAgICAgICAgcHJpbnRFcnJvcihgQ2FuJ3Qgc3RhcnQganVzdCB5ZXQg4oCUICR7YmxvY2tlZH0uIFJlc29sdmUgdGhhdCBhbmQgcmUtcnVuLmApO1xuICAgICAgICAgIHByb2Nlc3MuZXhpdENvZGUgPSAxO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIENvbW1pdCBnYXRlIOKAlCBjb25maXJtIEJFRk9SRSBhbnkgc2lkZSBlZmZlY3QgKGNsb25lLCAuZW52LCBkZXBsb3kpIHNvIGEgXCJOb1wiXG4gICAgICAgIC8vIGxlYXZlcyBub3RoaW5nIGJlaGluZC4gVGhlIHBvcnQgY2hlY2sgKyBvcHRpb25hbCBsb2FkcyArIC5lbnYgYmVsb3cgYXJlIHBhcnQgb2ZcbiAgICAgICAgLy8gZXhlY3V0aW5nIHRoZSBhZ3JlZWQtdG8gcGxhbi5cbiAgICAgICAgaWYgKCEoYXdhaXQgY29uZmlybShgXFxuUHJvY2VlZCB3aXRoIHByb3Zpc2lvbmluZyAke3NwZWMubGFiZWx9P2AsIG9wdGlvbnMueWVzKSkpIHtcbiAgICAgICAgICBwcmludFdhcm5pbmcoJ05vIHByb2JsZW0g4oCUIG5vdGhpbmcgd2FzIGNoYW5nZWQuJyk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gN2EvN2IuIFNwYXJzZS1jbG9uZSAoaWYgLS1yZXBvIG9yIGFjY2VwdGVkIGludGVyYWN0aXZlbHkpICsgbG9jYXRlIHRoZSBkZXBsb3lcbiAgICAgICAgLy8gZW50cnlwb2ludCwgcmVwb2ludGluZyBjd2QgaW50byB0aGUgY2xvbmUuIFNlZSBib290c3RyYXBBbmRMb2NhdGUuXG4gICAgICAgIGNvbnN0IGxvY2F0ZWQgPSBhd2FpdCBib290c3RyYXBBbmRMb2NhdGUoc3BlYywgYm9vdHN0cmFwLCBib290c3RyYXBDbWQsIHNwYXJzZVBhdGhzLCBjd2QsIG9wdGlvbnMpO1xuICAgICAgICBjd2QgPSBsb2NhdGVkLmN3ZDtcbiAgICAgICAgY29uc3QgYm9vdHN0cmFwcGVkID0gbG9jYXRlZC5ib290c3RyYXBwZWQ7XG4gICAgICAgIGlmICghbG9jYXRlZC5vaykgcmV0dXJuO1xuXG4gICAgICAgIC8vIEhvc3QtcG9ydCBwcmUtZmxpZ2h0IOKAlCBub3cgdGhhdCB0aGUgZGVwbG95IHNvdXJjZSBpcyBvbiBkaXNrIChwb3N0LWNsb25lKSxcbiAgICAgICAgLy8gZGVyaXZlIHRoZSBwb3J0cyBmcm9tIGl0IChjb21wb3NlIC8gc2V0dXAuc2gpIGFuZCBzdG9wIG9uIGEgZmF0YWwgY29uZmxpY3RcbiAgICAgICAgLy8gYmVmb3JlIGRlcGxveWluZy4gU2VlIHByZWZsaWdodFBvcnRzLlxuICAgICAgICBpZiAoIShhd2FpdCBwcmVmbGlnaHRQb3J0cyhzcGVjLCB0YXJnZXQsIGN3ZCkpKSB7XG4gICAgICAgICAgcHJvY2Vzcy5leGl0Q29kZSA9IDE7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gT3B0LWluIGxvYWRzIOKAlCBvZmZlcmVkIEFGVEVSIHRoZSBjbG9uZSAoc2VlIHJlc29sdmVMb2Fkc0ludGVyYWN0aXZlbHkpOyBpdFxuICAgICAgICAvLyBwcm9tcHRzLCBhZGRpdGl2ZWx5IHNwYXJzZS1mZXRjaGVzIHRoZSBwaWNrZWQgZm9sZGVycywgYW5kIHJlLXJlc29sdmVzIHRoZVxuICAgICAgICAvLyBwb3N0LWluc3RhbGwgc3RlcHMgd2l0aCB0aGUgc2VsZWN0aW9ucy5cbiAgICAgICAgaWYgKHdpbGxQcm9tcHRMb2Fkcykge1xuICAgICAgICAgIGNvbnN0IGxvYWRlZCA9IGF3YWl0IHJlc29sdmVMb2Fkc0ludGVyYWN0aXZlbHkoXG4gICAgICAgICAgICB0YXJnZXQsXG4gICAgICAgICAgICB1cmwsXG4gICAgICAgICAgICB0eXBlb2YgcGFyYW1zLnJlZ2lvbiA9PT0gJ3N0cmluZycgPyBwYXJhbXMucmVnaW9uIDogdW5kZWZpbmVkLFxuICAgICAgICAgICAgY3dkLFxuICAgICAgICAgICAgYm9vdHN0cmFwcGVkLFxuICAgICAgICAgICAgYm9vdHN0cmFwLFxuICAgICAgICAgICAgcG9zdFN0ZXBGbGFncyxcbiAgICAgICAgICApO1xuICAgICAgICAgIGVuYWJsZWRMb2FkSWRzID0gbG9hZGVkLmVuYWJsZWRMb2FkSWRzO1xuICAgICAgICAgIHBvc3RTdGVwcyA9IGxvYWRlZC5zdGVwcztcbiAgICAgICAgICBza2lwcGVkU3RlcHMgPSBsb2FkZWQuc2tpcHBlZDtcbiAgICAgICAgfVxuICAgICAgICAvLyBsb2NhbC9taW5pa3ViZSdzIHNldHVwLnNoIFJFUVVJUkVTIGEgYC5lbnZgIGFuZCBhYm9ydHMgd2l0aG91dCBpdCDigJQgY3JlYXRlXG4gICAgICAgIC8vIGl0IGZyb20gLmVudi5leGFtcGxlIHdpdGggZ2VuZXJhdGVkIHNlY3JldHMgc28gdGhlIGRlcGxveSBpcyBub24taW50ZXJhY3RpdmUuXG4gICAgICAgIC8vIGVjMi9mYXJnYXRlIGFsc28gc2hpcCBhIGAuZW52LmV4YW1wbGVgLCBidXQgdGhlaXIgc2V0dXAuc2ggbmV2ZXIgcmVhZHMgYVxuICAgICAgICAvLyBsb2NhbCBgLmVudmAgKHRoZSBpbnN0YW5jZSBoYW5kbGVzIGl0cyBvd247IEZhcmdhdGUgdXNlcyBTZWNyZXRzIE1hbmFnZXIgdmlhXG4gICAgICAgIC8vIGluaXQtc2VjcmV0cy5zaCksIHNvIHdlIG11c3QgTk9UIGdlbmVyYXRlIG9uZSBmb3IgdGhlbS5cbiAgICAgICAgaWYgKCh0YXJnZXQgPT09ICdsb2NhbCcgfHwgdGFyZ2V0ID09PSAnbWluaWt1YmUnKSAmJiBlbnZGaWxlTWlzc2luZyhjd2QsIHNwZWMuZGlyKSkge1xuICAgICAgICAgIGlmIChhd2FpdCBjb25maXJtKGBcXG4ke3NwZWMuZGlyfS8uZW52IG5vdCBmb3VuZCDigJQgY3JlYXRlIGl0IGZyb20gLmVudi5leGFtcGxlIChnZW5lcmF0ZXMgc2VjcmV0czsgZWRpdCBsYXRlciBmb3Igb3B0aW9uYWwgaW50ZWdyYXRpb25zIGxpa2UgT0F1dGgpP2AsIG9wdGlvbnMueWVzKSkge1xuICAgICAgICAgICAgY29uc3QgbiA9IGNyZWF0ZUVudkZpbGUoY3dkLCBzcGVjLmRpcik7XG4gICAgICAgICAgICBwcmludFN1Y2Nlc3MoYENyZWF0ZWQgJHtzcGVjLmRpcn0vLmVudiDigJQgJHtufSBzZWNyZXQocykgZ2VuZXJhdGVkLmApO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBwcmludFdhcm5pbmcoJ0NvbnRpbnVpbmcgd2l0aG91dCAuZW52IOKAlCBzZXR1cC5zaCB3aWxsIGFib3J0IGlmIGl0IHN0YXlzIG1pc3NpbmcuJyk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8vIDdjLiBSdW4gdGhlIGRlcGxveSB3aXRoIGEgYm91bmRlZCBhdXRvLWZpeCArIHJldHJ5IGxvb3AgKHNlZSBydW5EZXBsb3lXaXRoUmV0cnkpLlxuICAgICAgICBjb25zdCB7IHN1Y2NlZWRlZCwgcnVuUGFyYW1zIH0gPSBhd2FpdCBydW5EZXBsb3lXaXRoUmV0cnkoc3BlYywgdXJsLCBjd2QsIHBhcmFtcywgYWlPcHRzLCBvcHRpb25zKTtcbiAgICAgICAgaWYgKCFzdWNjZWVkZWQpIHsgcHJvY2Vzcy5leGl0Q29kZSA9IDE7IHJldHVybjsgfVxuICAgICAgICBwcmludFN1Y2Nlc3MoJ0RlcGxveSBjb21tYW5kIGNvbXBsZXRlZC4nKTtcblxuICAgICAgICAvLyA3ZC4gU0VTIHBvc3QtZGVwbG95IGd1aWRhbmNlIChhc3luYyBES0lNICsgc2FuZGJveCArIGJvdW5jZSB0b3BpYykuXG4gICAgICAgIC8vIFNFUyBpcyBwcm92aXNpb25lZCBCWSBERUZBVUxUIG9uIEFXUyBkZXBsb3lzLCBzbyBzdXJmYWNlIHRoZSBndWlkYW5jZVxuICAgICAgICAvLyBmb3IgZWMyL2ZhcmdhdGUgdW5sZXNzIHRoZSBvcGVyYXRvciBvcHRlZCBvdXQgd2l0aCAtLW5vLWVtYWlsLlxuICAgICAgICBjb25zdCBzZXNQcm92aXNpb25lZCA9ICh0YXJnZXQgPT09ICdlYzInIHx8IHRhcmdldCA9PT0gJ2ZhcmdhdGUnKSAmJiBydW5QYXJhbXMubm9FbWFpbCAhPT0gdHJ1ZTtcbiAgICAgICAgaWYgKHNlc1Byb3Zpc2lvbmVkKSB7XG4gICAgICAgICAgcHJpbnRTZWN0aW9uKCdTRVMg4oCUIG5leHQgc3RlcHMnKTtcbiAgICAgICAgICBmb3IgKGNvbnN0IGxpbmUgb2Ygc2VzUG9zdERlcGxveUd1aWRhbmNlKCkpIHByaW50SW5mbyhg4oCiICR7bGluZX1gKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIDdlLiBWZXJpZnkgaGVhbHRoIChDUkVBVEVfQ09NUExFVEUgIT0gc2VydmluZykuXG4gICAgICAgIGlmICh1cmwpIHtcbiAgICAgICAgICBwcmludFNlY3Rpb24oJ1ZlcmlmeWluZyBoZWFsdGgnKTtcbiAgICAgICAgICAvLyBNaW5pa3ViZSByZWFjaGVzIHRoZSBnYXRld2F5IHZpYSBhIGt1YmVjdGwgcG9ydC1mb3J3YXJkIHRoYXQgc2V0dXAuc2hcbiAgICAgICAgICAvLyBiYWNrZ3JvdW5kcyBhbmQgdGhhdCBjYW4gZGllL2ZhaWwgdG8gYmluZCDigJQgKHJlKXN0YXJ0IGl0IGJlZm9yZSBwb2xsaW5nXG4gICAgICAgICAgLy8gc28gd2UgZG9uJ3Qgc2l0IGF0IHRoZSBnYXRlIG9uIGEgZGVhZCBmb3J3YXJkIHdoaWxlIHRoZSBwb2RzIGFyZSBmaW5lLlxuICAgICAgICAgIGlmICh0YXJnZXQgPT09ICdtaW5pa3ViZScpIHtcbiAgICAgICAgICAgIGF3YWl0IGVuc3VyZU1pbmlrdWJlR2F0ZXdheSh1cmwsIHsgb25JbmZvOiAobSkgPT4gcHJpbnRJbmZvKG0pIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgICBwcmludEluZm8oYFBvbGxpbmcgJHt1cmx9L2hlYWx0aCDigKZgKTtcbiAgICAgICAgICBjb25zdCBoZWFsdGggPSBhd2FpdCB3YWl0SGVhbHRoeSh1cmwsIHsgb25UaWNrOiAobSkgPT4gcHJpbnRJbmZvKG0pIH0pO1xuICAgICAgICAgIC8vIEdyZWVuIG9ubHkgd2hlbiBmdWxseSByZWFkeTsgYSBcImhlYWx0aCBPSyBidXQgL3JlYWR5IG5ldmVyIGNhbWVcIiBwcm9jZWVkLVxuICAgICAgICAgIC8vIGFueXdheSBzdGF0ZSBpcyBoZWFsdGh5OnRydWUgYnV0IGRlZ3JhZGVkIOKGkiB3YXJuIHNvIGl0IGRvZXNuJ3QgcmVhZCBhcyBkb25lLlxuICAgICAgICAgIChoZWFsdGguaGVhbHRoeSAmJiBoZWFsdGgucmVhZHkgPyBwcmludFN1Y2Nlc3MgOiBwcmludFdhcm5pbmcpKGAke2hlYWx0aC51cmx9IOKAlCAke2hlYWx0aC5kZXRhaWx9YCk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyA3Zi4gUG9zdC1pbnN0YWxsIHN0ZXBzIChyZWdpc3RlciArIG9wdC1pbiBsb2Fkcywgc21va2UgdGVzdCwgZXZlbnRzLCBjdXN0b20pLlxuICAgICAgICAvLyBTZWUgcnVuUG9zdFN0ZXBzIOKAlCBpdCBzdXJmYWNlcyByZWdpc3RlciArIHRoZSBldmVudHMgYnVuZGxlIGFzIG1hbnVhbCBpbi1WUENcbiAgICAgICAgLy8gbmV4dC1zdGVwcyBvbiBFQzIvRmFyZ2F0ZSBpbnN0ZWFkIG9mIGF1dG8tcnVubmluZyAoYW5kIGZhaWxpbmcpIHRoZW0gbG9jYWxseS5cbiAgICAgICAgYXdhaXQgcnVuUG9zdFN0ZXBzKHBvc3RTdGVwcywgc2tpcHBlZFN0ZXBzLCB0YXJnZXQsIGN3ZCwgYWRtaW5FbnYsIHsgeWVzOiBvcHRpb25zLnllcywgYXV0b1J1bjogd2lsbFByb21wdExvYWRzIH0pO1xuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgaGFuZGxlRXJyb3IoZXJyb3IsIEVSUk9SX0NPREVTLkdFTkVSQUwsIHtcbiAgICAgICAgICBkZWJ1ZzogcHJvZ3JhbS5vcHRzKCkuZGVidWcsXG4gICAgICAgICAgZXhpdDogdHJ1ZSxcbiAgICAgICAgICBjb250ZXh0OiB7IGNvbW1hbmQ6ICdwcm92aXNpb24nLCBleGVjdXRpb25JZCB9LFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9KTtcbn1cbiJdfQ==
|