@dbx-tools/core 0.9.11 → 0.9.17
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +54 -10
- package/index.ts +5 -3
- package/lib/index.d.ts +5 -3
- package/lib/index.js +3 -2
- package/lib/src/bin.d.ts +12 -1
- package/lib/src/bin.js +36 -8
- package/lib/src/dependency-resolver.d.ts +83 -0
- package/lib/src/dependency-resolver.js +515 -0
- package/lib/src/project-utils.d.ts +18 -9
- package/lib/src/project-utils.js +217 -32
- package/lib/tsconfig.tsbuildinfo +1 -1
- package/package.json +14 -4
- package/src/bin.ts +52 -8
- package/src/dependency-resolver.ts +654 -0
- package/src/project-utils.ts +233 -38
|
@@ -48,14 +48,23 @@ export declare function name(cwd?: string): string;
|
|
|
48
48
|
* `package.json` `repository.url` that passes npm provenance).
|
|
49
49
|
*/
|
|
50
50
|
export declare function repositoryUrl(cwd?: string, format?: "https" | "npm"): string | undefined;
|
|
51
|
-
/**
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
* A blank, null, omitted, or explicitly current `cwd` reuses the cached npm
|
|
55
|
-
* command; another resolved directory executes it directly. Environment options
|
|
56
|
-
* are evaluated on every call.
|
|
57
|
-
*/
|
|
58
|
-
export declare function npmRegistry(cwd?: string | null, options?: {
|
|
51
|
+
/** Inputs that control active npm registry discovery. */
|
|
52
|
+
export type NpmRegistryOptions = {
|
|
53
|
+
/** Skip public npmjs.org so callers can detect a configured override. */
|
|
59
54
|
overrideOnly?: boolean;
|
|
55
|
+
/**
|
|
56
|
+
* Read `npm_config_registry`, `NPM_CONFIG_REGISTRY`, and `BUN_CONFIG_REGISTRY`
|
|
57
|
+
* first. Defaults to true so the same cascade a package manager uses is the
|
|
58
|
+
* default.
|
|
59
|
+
*/
|
|
60
60
|
envVars?: boolean;
|
|
61
|
-
}
|
|
61
|
+
};
|
|
62
|
+
/**
|
|
63
|
+
* The active npm registry as a chainable {@link net.UrlBuilder}.
|
|
64
|
+
*
|
|
65
|
+
* Resolution is manager-agnostic and memoized per cwd plus options: environment
|
|
66
|
+
* variables, then `.npmrc` (project ancestors, user, global), then Bun
|
|
67
|
+
* `bunfig.toml` `install.registry`, then pnpm workspace/global YAML, then
|
|
68
|
+
* `https://registry.npmjs.org/`. `overrideOnly` skips that public default.
|
|
69
|
+
*/
|
|
70
|
+
export declare function npmRegistry(cwd?: string | null, options?: NpmRegistryOptions): net.UrlBuilder | undefined;
|
package/lib/src/project-utils.js
CHANGED
|
@@ -1,8 +1,10 @@
|
|
|
1
1
|
import { spawnSync } from "node:child_process";
|
|
2
2
|
import { readFileSync } from "node:fs";
|
|
3
|
+
import { homedir } from "node:os";
|
|
3
4
|
import { basename, dirname, join, resolve } from "node:path";
|
|
4
|
-
import { json, net, stringUtils } from "@dbx-tools/shared-core";
|
|
5
|
-
import {
|
|
5
|
+
import { json, net, object, stringUtils } from "@dbx-tools/shared-core";
|
|
6
|
+
import { parse as parseYaml } from "yaml";
|
|
7
|
+
import { cachedRecord, statSync as fileStatSync } from "./file.js";
|
|
6
8
|
const ROOT_MARKERS = [
|
|
7
9
|
".projenrc.ts",
|
|
8
10
|
".projenrc.js",
|
|
@@ -54,10 +56,33 @@ function commandRoot(command, args, cwd) {
|
|
|
54
56
|
const parsed = projectContextCommand(command, args, cwd);
|
|
55
57
|
return parsed.pathStats?.isDirectory() ? parsed.path : undefined;
|
|
56
58
|
}
|
|
59
|
+
/**
|
|
60
|
+
* Closest directory with a `package.json` or `node_modules`, matching `npm prefix`.
|
|
61
|
+
*
|
|
62
|
+
* Lifecycle scripts from npm and Bun set `npm_config_local_prefix` to that
|
|
63
|
+
* directory. Read it first when resolving this process's cwd so a missing npm
|
|
64
|
+
* CLI is not required. `npm_config_prefix` / `PREFIX` are the global install
|
|
65
|
+
* prefix and must not be used here.
|
|
66
|
+
*
|
|
67
|
+
* Bun has no prefix command (`bun pm bin` is the `.bin` directory). pnpm's
|
|
68
|
+
* `prefix` command is unimplemented; `pnpm root` prints `node_modules`.
|
|
69
|
+
*/
|
|
57
70
|
function npmRoot(cwd) {
|
|
58
71
|
const resolved = resolveWorkingDirectory(cwd);
|
|
72
|
+
if (resolved === resolveWorkingDirectory()) {
|
|
73
|
+
const fromEnv = envDirectory(process.env.npm_config_local_prefix);
|
|
74
|
+
if (fromEnv)
|
|
75
|
+
return fromEnv;
|
|
76
|
+
}
|
|
59
77
|
return commandRoot("npm", ["prefix"], resolved);
|
|
60
78
|
}
|
|
79
|
+
function envDirectory(value) {
|
|
80
|
+
const path = stringUtils.trimToNull(value);
|
|
81
|
+
if (!path)
|
|
82
|
+
return undefined;
|
|
83
|
+
const resolved = resolve(path);
|
|
84
|
+
return fileStatSync(resolved)?.isDirectory() ? resolved : undefined;
|
|
85
|
+
}
|
|
61
86
|
function gitRoot(cwd) {
|
|
62
87
|
const resolved = resolveWorkingDirectory(cwd);
|
|
63
88
|
return commandRoot("git", ["rev-parse", "--show-toplevel"], resolved);
|
|
@@ -240,46 +265,206 @@ export function repositoryUrl(cwd, format = "https") {
|
|
|
240
265
|
return undefined;
|
|
241
266
|
return format === "npm" ? `git+${https.replace(/\.git$/, "")}.git` : https;
|
|
242
267
|
}
|
|
268
|
+
/** Public npm, used only after env, npmrc, bunfig, and pnpm yaml miss. */
|
|
269
|
+
const DEFAULT_NPM_REGISTRY = "https://registry.npmjs.org/";
|
|
270
|
+
const npmRegistryCache = new Map();
|
|
243
271
|
/**
|
|
244
|
-
* The active npm registry
|
|
245
|
-
*
|
|
246
|
-
*
|
|
247
|
-
*
|
|
248
|
-
*
|
|
272
|
+
* The active npm registry as a chainable {@link net.UrlBuilder}.
|
|
273
|
+
*
|
|
274
|
+
* Resolution is manager-agnostic and memoized per cwd plus options: environment
|
|
275
|
+
* variables, then `.npmrc` (project ancestors, user, global), then Bun
|
|
276
|
+
* `bunfig.toml` `install.registry`, then pnpm workspace/global YAML, then
|
|
277
|
+
* `https://registry.npmjs.org/`. `overrideOnly` skips that public default.
|
|
249
278
|
*/
|
|
250
279
|
export function npmRegistry(cwd, options) {
|
|
251
280
|
const resolved = resolveWorkingDirectory(cwd);
|
|
252
|
-
|
|
281
|
+
const envVars = options?.envVars !== false;
|
|
282
|
+
const overrideOnly = Boolean(options?.overrideOnly);
|
|
283
|
+
const key = JSON.stringify([
|
|
284
|
+
resolved,
|
|
285
|
+
overrideOnly,
|
|
286
|
+
envVars,
|
|
287
|
+
homedir(),
|
|
288
|
+
process.env.NPM_CONFIG_USERCONFIG ?? "",
|
|
289
|
+
process.env.NPM_CONFIG_GLOBALCONFIG ?? "",
|
|
290
|
+
process.env.PREFIX ?? "",
|
|
291
|
+
envVars ? (process.env.npm_config_registry ?? "") : "",
|
|
292
|
+
envVars ? (process.env.NPM_CONFIG_REGISTRY ?? "") : "",
|
|
293
|
+
envVars ? (process.env.BUN_CONFIG_REGISTRY ?? "") : "",
|
|
294
|
+
]);
|
|
295
|
+
if (npmRegistryCache.has(key))
|
|
296
|
+
return npmRegistryCache.get(key);
|
|
297
|
+
const value = resolveNpmRegistry(resolved, { overrideOnly, envVars });
|
|
298
|
+
npmRegistryCache.set(key, value);
|
|
299
|
+
return value;
|
|
253
300
|
}
|
|
254
301
|
function resolveNpmRegistry(cwd, options) {
|
|
255
|
-
const
|
|
256
|
-
|
|
257
|
-
if (
|
|
258
|
-
const envKey = "npm_config_registry";
|
|
259
|
-
if (options?.envVars) {
|
|
260
|
-
yield process.env[envKey];
|
|
261
|
-
yield process.env[envKey.toUpperCase()];
|
|
262
|
-
}
|
|
263
|
-
}
|
|
264
|
-
})();
|
|
265
|
-
for (const candidate of candidates) {
|
|
266
|
-
if (candidate) {
|
|
267
|
-
const url = net.urlBuilder(candidate);
|
|
268
|
-
if (!url) {
|
|
269
|
-
continue;
|
|
270
|
-
}
|
|
271
|
-
else if (options?.overrideOnly) {
|
|
272
|
-
const npmjsRegistryUrl = "https://registry.npmjs.org";
|
|
273
|
-
const registryUrl = url.toString();
|
|
274
|
-
if (registryUrl === npmjsRegistryUrl || registryUrl.startsWith(npmjsRegistryUrl + "/")) {
|
|
275
|
-
continue;
|
|
276
|
-
}
|
|
277
|
-
}
|
|
302
|
+
for (const candidate of npmRegistryCandidates(cwd, options.envVars)) {
|
|
303
|
+
const url = toRegistryUrl(candidate, options.overrideOnly);
|
|
304
|
+
if (url)
|
|
278
305
|
return url;
|
|
306
|
+
}
|
|
307
|
+
return toRegistryUrl(DEFAULT_NPM_REGISTRY, options.overrideOnly);
|
|
308
|
+
}
|
|
309
|
+
function* npmRegistryCandidates(cwd, envVars) {
|
|
310
|
+
if (envVars) {
|
|
311
|
+
yield process.env.npm_config_registry;
|
|
312
|
+
yield process.env.NPM_CONFIG_REGISTRY;
|
|
313
|
+
yield process.env.BUN_CONFIG_REGISTRY;
|
|
314
|
+
}
|
|
315
|
+
for (const dir of ancestorDirs(cwd)) {
|
|
316
|
+
yield readNpmrcRegistry(join(dir, ".npmrc"));
|
|
317
|
+
}
|
|
318
|
+
yield readNpmrcRegistry(process.env.NPM_CONFIG_USERCONFIG ?? join(homedir(), ".npmrc"));
|
|
319
|
+
yield readNpmrcRegistry(process.env.NPM_CONFIG_GLOBALCONFIG ?? defaultGlobalNpmrc());
|
|
320
|
+
for (const dir of ancestorDirs(cwd)) {
|
|
321
|
+
yield readBunfigRegistry(join(dir, "bunfig.toml"));
|
|
322
|
+
}
|
|
323
|
+
yield readBunfigRegistry(join(homedir(), "bunfig.toml"));
|
|
324
|
+
for (const dir of ancestorDirs(cwd)) {
|
|
325
|
+
yield readYamlRegistry(join(dir, "pnpm-workspace.yaml"));
|
|
326
|
+
}
|
|
327
|
+
for (const path of pnpmGlobalConfigPaths()) {
|
|
328
|
+
yield readYamlRegistry(path);
|
|
329
|
+
}
|
|
330
|
+
}
|
|
331
|
+
function toRegistryUrl(candidate, overrideOnly) {
|
|
332
|
+
const trimmed = stringUtils.trimToNull(candidate);
|
|
333
|
+
if (!trimmed)
|
|
334
|
+
return undefined;
|
|
335
|
+
const url = net.urlBuilder(trimmed);
|
|
336
|
+
if (!url)
|
|
337
|
+
return undefined;
|
|
338
|
+
if (overrideOnly && isPublicNpmRegistry(url))
|
|
339
|
+
return undefined;
|
|
340
|
+
return url;
|
|
341
|
+
}
|
|
342
|
+
function isPublicNpmRegistry(url) {
|
|
343
|
+
return url.hostname === "registry.npmjs.org";
|
|
344
|
+
}
|
|
345
|
+
function* ancestorDirs(cwd) {
|
|
346
|
+
let current = cwd;
|
|
347
|
+
while (true) {
|
|
348
|
+
yield current;
|
|
349
|
+
const parent = dirname(current);
|
|
350
|
+
if (parent === current)
|
|
351
|
+
return;
|
|
352
|
+
current = parent;
|
|
353
|
+
}
|
|
354
|
+
}
|
|
355
|
+
function defaultGlobalNpmrc() {
|
|
356
|
+
if (process.platform === "win32") {
|
|
357
|
+
return join(process.env.PROGRAMDATA ?? "C:\\ProgramData", "npm", "etc", "npmrc");
|
|
358
|
+
}
|
|
359
|
+
return join(process.env.PREFIX ?? "/usr/local", "etc", "npmrc");
|
|
360
|
+
}
|
|
361
|
+
function pnpmGlobalConfigPaths() {
|
|
362
|
+
const home = homedir();
|
|
363
|
+
if (process.platform === "darwin") {
|
|
364
|
+
return [join(home, "Library/Preferences/pnpm/config.yaml")];
|
|
365
|
+
}
|
|
366
|
+
if (process.platform === "win32") {
|
|
367
|
+
return [join(process.env.LOCALAPPDATA ?? join(home, "AppData/Local"), "pnpm/config.yaml")];
|
|
368
|
+
}
|
|
369
|
+
return [join(home, ".config/pnpm/config.yaml")];
|
|
370
|
+
}
|
|
371
|
+
function readNpmrcRegistry(path) {
|
|
372
|
+
return cachedRecord(`npmrc-registry:${path}`, () => {
|
|
373
|
+
const text = readTextFile(path);
|
|
374
|
+
const registry = text ? parseIniRegistry(text) : undefined;
|
|
375
|
+
return registry ? { registry } : undefined;
|
|
376
|
+
})?.registry;
|
|
377
|
+
}
|
|
378
|
+
function readBunfigRegistry(path) {
|
|
379
|
+
return cachedRecord(`bunfig-registry:${path}`, () => {
|
|
380
|
+
const text = readTextFile(path);
|
|
381
|
+
const registry = text ? parseBunfigRegistry(text) : undefined;
|
|
382
|
+
return registry ? { registry } : undefined;
|
|
383
|
+
})?.registry;
|
|
384
|
+
}
|
|
385
|
+
function readYamlRegistry(path) {
|
|
386
|
+
return cachedRecord(`yaml-registry:${path}`, () => {
|
|
387
|
+
const text = readTextFile(path);
|
|
388
|
+
if (!text)
|
|
389
|
+
return undefined;
|
|
390
|
+
const parsed = parseYaml(text);
|
|
391
|
+
if (!object.isRecord(parsed))
|
|
392
|
+
return undefined;
|
|
393
|
+
const registry = yamlRegistry(parsed);
|
|
394
|
+
return registry ? { registry } : undefined;
|
|
395
|
+
})?.registry;
|
|
396
|
+
}
|
|
397
|
+
function readTextFile(path) {
|
|
398
|
+
if (!fileStatSync(path)?.isFile())
|
|
399
|
+
return undefined;
|
|
400
|
+
return readFileSync(path, "utf8");
|
|
401
|
+
}
|
|
402
|
+
/** Parse a `registry=` assignment from npmrc / ini text. */
|
|
403
|
+
function parseIniRegistry(text) {
|
|
404
|
+
for (const raw of text.split(/\r?\n/)) {
|
|
405
|
+
const line = raw.trim();
|
|
406
|
+
if (!line || line.startsWith("#") || line.startsWith(";"))
|
|
407
|
+
continue;
|
|
408
|
+
const eq = line.indexOf("=");
|
|
409
|
+
if (eq === -1)
|
|
410
|
+
continue;
|
|
411
|
+
if (line.slice(0, eq).trim() !== "registry")
|
|
412
|
+
continue;
|
|
413
|
+
return unquoteIniValue(line.slice(eq + 1));
|
|
414
|
+
}
|
|
415
|
+
return undefined;
|
|
416
|
+
}
|
|
417
|
+
/**
|
|
418
|
+
* Read Bun `install.registry` from a bunfig.toml. Table form
|
|
419
|
+
* `[install.registry]` with `url = "..."` is accepted; scoped maps are ignored.
|
|
420
|
+
*/
|
|
421
|
+
function parseBunfigRegistry(text) {
|
|
422
|
+
let section = "";
|
|
423
|
+
for (const raw of text.split(/\r?\n/)) {
|
|
424
|
+
const line = stripTomlComment(raw).trim();
|
|
425
|
+
if (!line)
|
|
426
|
+
continue;
|
|
427
|
+
const header = /^\[([^\]]+)\]$/.exec(line);
|
|
428
|
+
if (header) {
|
|
429
|
+
section = header[1].trim();
|
|
430
|
+
continue;
|
|
279
431
|
}
|
|
432
|
+
const eq = line.indexOf("=");
|
|
433
|
+
if (eq === -1)
|
|
434
|
+
continue;
|
|
435
|
+
const key = line.slice(0, eq).trim();
|
|
436
|
+
const value = unquoteIniValue(line.slice(eq + 1));
|
|
437
|
+
if (section === "install" && key === "registry" && !value.startsWith("{"))
|
|
438
|
+
return value;
|
|
439
|
+
if (section === "install.registry" && key === "url")
|
|
440
|
+
return value;
|
|
441
|
+
if (!section && key === "install.registry")
|
|
442
|
+
return value;
|
|
443
|
+
}
|
|
444
|
+
return undefined;
|
|
445
|
+
}
|
|
446
|
+
function yamlRegistry(data) {
|
|
447
|
+
if (typeof data.registry === "string")
|
|
448
|
+
return data.registry;
|
|
449
|
+
const registries = data.registries;
|
|
450
|
+
if (object.isRecord(registries) && typeof registries.default === "string") {
|
|
451
|
+
return registries.default;
|
|
280
452
|
}
|
|
281
453
|
return undefined;
|
|
282
454
|
}
|
|
455
|
+
function unquoteIniValue(value) {
|
|
456
|
+
const trimmed = value.trim();
|
|
457
|
+
const comment = trimmed.search(/\s+#/);
|
|
458
|
+
const raw = comment === -1 ? trimmed : trimmed.slice(0, comment).trim();
|
|
459
|
+
if ((raw.startsWith('"') && raw.endsWith('"')) || (raw.startsWith("'") && raw.endsWith("'"))) {
|
|
460
|
+
return raw.slice(1, -1);
|
|
461
|
+
}
|
|
462
|
+
return raw;
|
|
463
|
+
}
|
|
464
|
+
function stripTomlComment(line) {
|
|
465
|
+
const hash = line.indexOf("#");
|
|
466
|
+
return hash === -1 ? line : line.slice(0, hash);
|
|
467
|
+
}
|
|
283
468
|
function readPackageName(pkgPath) {
|
|
284
469
|
if (!fileStatSync(pkgPath)?.isFile())
|
|
285
470
|
return undefined;
|
|
@@ -293,4 +478,4 @@ if (import.meta.main) {
|
|
|
293
478
|
console.log("repository url:", repositoryUrl());
|
|
294
479
|
console.log("repository url (npm):", repositoryUrl(undefined, "npm"));
|
|
295
480
|
}
|
|
296
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJvamVjdC11dGlscy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9wcm9qZWN0LXV0aWxzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUMvQyxPQUFPLEVBQVMsWUFBWSxFQUFFLE1BQU0sU0FBUyxDQUFDO0FBQzlDLE9BQU8sRUFBRSxRQUFRLEVBQUUsT0FBTyxFQUFFLElBQUksRUFBRSxPQUFPLEVBQUUsTUFBTSxXQUFXLENBQUM7QUFDN0QsT0FBTyxFQUFFLElBQUksRUFBRSxHQUFHLEVBQUUsV0FBVyxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDaEUsT0FBTyxFQUFFLFFBQVEsSUFBSSxZQUFZLEVBQUUsTUFBTSxXQUFXLENBQUM7QUFFckQsTUFBTSxZQUFZLEdBQUc7SUFDbkIsY0FBYztJQUNkLGNBQWM7SUFDZCxlQUFlO0lBQ2YsZUFBZTtJQUNmLGNBQWM7Q0FDTixDQUFDO0FBRVgscUZBQXFGO0FBQ3JGLE1BQU0sVUFBVSx1QkFBdUIsQ0FBQyxHQUFtQjtJQUN6RCxPQUFPLE9BQU8sQ0FBQyxXQUFXLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxJQUFJLE9BQU8sQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDO0FBQy9ELENBQUM7QUFpQkQ7Ozs7Ozs7R0FPRztBQUNILFNBQVMsMkJBQTJCLENBQUMsT0FBZSxFQUFFLElBQWMsRUFBRSxHQUFXO0lBQy9FLE1BQU0sTUFBTSxHQUFHLFNBQVMsQ0FBQyxPQUFPLEVBQUUsSUFBSSxFQUFFLEVBQUUsR0FBRyxFQUFFLEtBQUssRUFBRSxDQUFDLFFBQVEsRUFBRSxNQUFNLEVBQUUsUUFBUSxDQUFDLEVBQUUsQ0FBQyxDQUFDO0lBQ3RGLE1BQU0sTUFBTSxHQUFHLE1BQU0sRUFBRSxNQUFNLEVBQUUsUUFBUSxFQUFFLEVBQUUsSUFBSSxFQUFFLENBQUM7SUFDbEQsSUFBSSxNQUFNLENBQUMsTUFBTSxL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QWEsQ0FBQyxTQUFTLEVBQUUsS0FBSyxDQUFDLENBQUMsQ0FBQztBQUN4RSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgc3Bhd25TeW5jIH0gZnJvbSBcIm5vZGU6Y2hpbGRfcHJvY2Vzc1wiO1xuaW1wb3J0IHsgU3RhdHMsIHJlYWRGaWxlU3luYyB9IGZyb20gXCJub2RlOmZzXCI7XG5pbXBvcnQgeyBiYXNlbmFtZSwgZGlybmFtZSwgam9pbiwgcmVzb2x2ZSB9IGZyb20gXCJub2RlOnBhdGhcIjtcbmltcG9ydCB7IGpzb24sIG5ldCwgc3RyaW5nVXRpbHMgfSBmcm9tIFwiQGRieC10b29scy9zaGFyZWQtY29yZVwiO1xuaW1wb3J0IHsgc3RhdFN5bmMgYXMgZmlsZVN0YXRTeW5jIH0gZnJvbSBcIi4vZmlsZS50c1wiO1xuXG5jb25zdCBST09UX01BUktFUlMgPSBbXG4gIFwiLnByb2plbnJjLnRzXCIsXG4gIFwiLnByb2plbnJjLmpzXCIsXG4gIFwiLnByb2plbnJjLm1qc1wiLFxuICBcIi5wcm9qZW5yYy5janNcIixcbiAgXCJwYWNrYWdlLmpzb25cIixcbl0gYXMgY29uc3Q7XG5cbi8qKiBSZXNvbHZlIGEgYmxhbmssIG51bGwsIG9taXR0ZWQsIHJlbGF0aXZlLCBvciBhYnNvbHV0ZSBjd2QgdG8gYW4gYWJzb2x1dGUgcGF0aC4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZXNvbHZlV29ya2luZ0RpcmVjdG9yeShjd2Q/OiBzdHJpbmcgfCBudWxsKTogc3RyaW5nIHtcbiAgcmV0dXJuIHJlc29sdmUoc3RyaW5nVXRpbHMudHJpbVRvTnVsbChjd2QpID8/IHByb2Nlc3MuY3dkKCkpO1xufVxuXG4vKiogQSBjb21tYW5kJ3Mgc3Rkb3V0LCBjbGFzc2lmaWVkIGFzIGEgZmlsZXN5c3RlbSBwYXRoIGFuZC9vciBhIFVSTC4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUHJvamVjdENvbnRleHQge1xuICByZWFkb25seSBvdXRwdXQ6IHN0cmluZztcbiAgLyoqIGBvdXRwdXRgIHdoZW4gaXQgbmFtZXMgc29tZXRoaW5nIG9uIGRpc2suICovXG4gIHJlYWRvbmx5IHBhdGg/OiBzdHJpbmc7XG4gIC8qKiBgZmlsZS5zdGF0U3luY2Agb2Yge0BsaW5rIHBhdGh9LCB3aGVuIGl0IGV4aXN0cy4gKi9cbiAgcmVhZG9ubHkgcGF0aFN0YXRzPzogU3RhdHM7XG4gIC8qKlxuICAgKiBgb3V0cHV0YCBwYXJzZWQgaW50byBhIGNoYWluYWJsZSB7QGxpbmsgbmV0LlVybEJ1aWxkZXJ9LCB3aGVuIGl0IGlzIGEgcmVhbFxuICAgKiBuZXR3b3JrIFVSTCAtIGEgbm9uLWJsYW5rIHNjaGVtZSAobm90IGBmaWxlOmApIEFORCBhIG5vbi1ibGFuayBob3N0bmFtZS5cbiAgICogQmFyZSBwYXRocywgc2NwLWxpa2UgYGdpdEBob3N0Oi4uLmAgcmVtb3RlcywgYW5kIGBmaWxlOmAgVVJMcyBzdGF5IHVuc2V0LlxuICAgKi9cbiAgcmVhZG9ubHkgdXJsPzogbmV0LlVybEJ1aWxkZXI7XG59XG5cbi8qKlxuICogYmVjYXVzZSB0aGlzIGlzIGNydWNpYWwgZG8gbm90IHVzZSBleGVjLnNwYXduU3luY1xuICpcbiAqIFJ1biBgY29tbWFuZCBhcmdzYCBpbiBgY3dkYCBhbmQgY2xhc3NpZnkgaXRzIHN0ZG91dDogYHBhdGhgICsgYHBhdGhTdGF0c2Agd2hlblxuICogdGhlIG91dHB1dCBuYW1lcyBzb21ldGhpbmcgb24gZGlzaywgYHVybGAgKGEge0BsaW5rIG5ldC5VcmxCdWlsZGVyfSkgd2hlbiBpdFxuICogcGFyc2VzIGFzIGEgcmVhbCBuZXR3b3JrIFVSTC4gRW1wdHkge0BsaW5rIFByb2plY3RDb250ZXh0fSBvbiBhIG5vbi16ZXJvIGV4aXRcbiAqIG9yIGVtcHR5IG91dHB1dC5cbiAqL1xuZnVuY3Rpb24gcHJvamVjdENvbnRleHRDb21tYW5kT3V0cHV0KGNvbW1hbmQ6IHN0cmluZywgYXJnczogc3RyaW5nW10sIGN3ZDogc3RyaW5nKTogUHJvamVjdENvbnRleHQge1xuICBjb25zdCByZXN1bHQgPSBzcGF3blN5bmMoY29tbWFuZCwgYXJncywgeyBjd2QsIHN0ZGlvOiBbXCJpZ25vcmVcIiwgXCJwaXBlXCIsIFwiaWdub3JlXCJdIH0pO1xuICBjb25zdCBvdXRwdXQgPSByZXN1bHQ/LnN0ZG91dD8udG9TdHJpbmcoKT8udHJpbSgpO1xuICBpZiAocmVzdWx0LnN0YXR1cyA9PT0gMCAmJiBvdXRwdXQpIHtcbiAgICBjb25zdCBwYXRoU3RhdHMgPSBmaWxlU3RhdFN5bmMob3V0cHV0KTtcbiAgICAvLyBPbmx5IGFuIEVYUExJQ0lUIGBzY2hlbWU6Ly8uLi5gIGNvdW50cyBhcyBhIFVSTC4gYHVybEJ1aWxkZXJgIG90aGVyd2lzZVxuICAgIC8vIHN5bnRoZXNpemVzIG9uZSAoYSBiYXJlIGBleGFtcGxlLmNvbWAgLT4gYGh0dHBzOi8v4oCmYCwgYW4gYWJzb2x1dGUgcGF0aCAtPlxuICAgIC8vIGBodHRwOi8vbG9jYWxob3N0L+KApmApLCB3aGljaCB3b3VsZCBtaXNsYWJlbCBkaXJlY3Rvcnkgb3V0cHV0cyBhbmQgYmFyZVxuICAgIC8vIHRva2VucyAtIHNvIGdhdGUgb24gdGhlIHJhdyBvdXRwdXQgYWxyZWFkeSBjYXJyeWluZyBhIHNjaGVtZSArIGF1dGhvcml0eS5cbiAgICBjb25zdCB1cmwgPSAvXlthLXpdW2EtejAtOSsuLV0qOlxcL1xcLy9pLnRlc3Qob3V0cHV0KSA/IG5ldC51cmxCdWlsZGVyKG91dHB1dCkgOiB1bmRlZmluZWQ7XG4gICAgcmV0dXJuIHsgb3V0cHV0LCBwYXRoOiBwYXRoU3RhdHMgPyBvdXRwdXQgOiB1bmRlZmluZWQsIHBhdGhTdGF0cywgdXJsIH07XG4gIH1cbiAgcmV0dXJuIHsgb3V0cHV0IH07XG59XG5cbmNvbnN0IHByb2plY3RDb21tYW5kQ2FjaGUgPSBuZXcgTWFwPHN0cmluZywgUHJvamVjdENvbnRleHQ+KCk7XG5cbmZ1bmN0aW9uIHByb2plY3RDb250ZXh0Q29tbWFuZChjb21tYW5kOiBzdHJpbmcsIGFyZ3M6IHN0cmluZ1tdLCBjd2Q/OiBzdHJpbmcpOiBQcm9qZWN0Q29udGV4dCB7XG4gIGNvbnN0IHJlc29sdmVkID0gcmVzb2x2ZVdvcmtpbmdEaXJlY3RvcnkoY3dkKTtcbiAgY29uc3Qga2V5ID1cbiAgICByZXNvbHZlZCA9PT0gcmVzb2x2ZVdvcmtpbmdEaXJlY3RvcnkoKSA/IEpTT04uc3RyaW5naWZ5KFtjb21tYW5kLCAuLi5hcmdzXSkgOiB1bmRlZmluZWQ7XG4gIGlmIChrZXkgIT09IHVuZGVmaW5lZCkge1xuICAgIGNvbnN0IGNhY2hlZCA9IHByb2plY3RDb21tYW5kQ2FjaGUuZ2V0KGtleSk7XG4gICAgaWYgKGNhY2hlZCAhPT0gdW5kZWZpbmVkKSByZXR1cm4gY2FjaGVkO1xuICB9XG4gIGNvbnN0IHZhbHVlID0gcHJvamVjdENvbnRleHRDb21tYW5kT3V0cHV0KGNvbW1hbmQsIGFyZ3MsIHJlc29sdmVkKTtcbiAgaWYgKGtleSAhPT0gdW5kZWZpbmVkKSBwcm9qZWN0Q29tbWFuZENhY2hlLnNldChrZXksIHZhbHVlKTtcbiAgcmV0dXJuIHZhbHVlO1xufVxuXG5mdW5jdGlvbiBjb21tYW5kUm9vdChjb21tYW5kOiBzdHJpbmcsIGFyZ3M6IHN0cmluZ1tdLCBjd2Q6IHN0cmluZyk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IHBhcnNlZCA9IHByb2plY3RDb250ZXh0Q29tbWFuZChjb21tYW5kLCBhcmdzLCBjd2QpO1xuICByZXR1cm4gcGFyc2VkLnBhdGhTdGF0cz8uaXNEaXJlY3RvcnkoKSA/IHBhcnNlZC5wYXRoIDogdW5kZWZpbmVkO1xufVxuXG5mdW5jdGlvbiBucG1Sb290KGN3ZD86IHN0cmluZyk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IHJlc29sdmVkID0gcmVzb2x2ZVdvcmtpbmdEaXJlY3RvcnkoY3dkKTtcbiAgcmV0dXJuIGNvbW1hbmRSb290KFwibnBtXCIsIFtcInByZWZpeFwiXSwgcmVzb2x2ZWQpO1xufVxuXG5mdW5jdGlvbiBnaXRSb290KGN3ZD86IHN0cmluZyk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IHJlc29sdmVkID0gcmVzb2x2ZVdvcmtpbmdEaXJlY3RvcnkoY3dkKTtcbiAgcmV0dXJuIGNvbW1hbmRSb290KFwiZ2l0XCIsIFtcInJldi1wYXJzZVwiLCBcIi0tc2hvdy10b3BsZXZlbFwiXSwgcmVzb2x2ZWQpO1xufVxuXG4vKiogUmVzb2x2ZSB0aGUgbmVhcmVzdCBwcm9qZWN0IHJvb3Qgd2l0aG91dCB3YWxraW5nIGFib3ZlIGl0cyBucG0gb3IgR2l0IGJvdW5kYXJ5LiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJvb3QoY3dkPzogc3RyaW5nKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgY29uc3QgcmVzb2x2ZWQgPSByZXNvbHZlV29ya2luZ0RpcmVjdG9yeShjd2QpO1xuICBsZXQgY3VycmVudCA9IHJlc29sdmVkO1xuXG4gIGlmICghZmlsZVN0YXRTeW5jKGN1cnJlbnQpPy5pc0RpcmVjdG9yeSgpKSB7XG4gICAgY3VycmVudCA9IGRpcm5hbWUoY3VycmVudCk7XG4gIH1cbiAgY29uc3QgYm91bmRhcmllcyA9IG5ldyBTZXQoXG4gICAgW25wbVJvb3QocmVzb2x2ZWQpLCBnaXRSb290KHJlc29sdmVkKV1cbiAgICAgIC5maWx0ZXIoKHBhdGgpOiBwYXRoIGlzIHN0cmluZyA9PiBwYXRoICE9PSB1bmRlZmluZWQpXG4gICAgICAubWFwKChwYXRoKSA9PiByZXNvbHZlKHBhdGgpKSxcbiAgKTtcbiAgY29uc3QgaGFzQm91bmRhcnkgPSBib3VuZGFyaWVzLnNpemUgPiAwO1xuICBsZXQgYmVzdDogeyBkaXI6IHN0cmluZzsgcHJpb3JpdHk6IG51bWJlciB9IHwgdW5kZWZpbmVkO1xuICB3aGlsZSAodHJ1ZSkge1xuICAgIGZvciAoY29uc3QgW3ByaW9yaXR5LCBtYXJrZXJdIG9mIFJPT1RfTUFSS0VSUy5lbnRyaWVzKCkpIHtcbiAgICAgIGlmIChmaWxlU3RhdFN5bmMoam9pbihjdXJyZW50LCBtYXJrZXIpKT8uaXNGaWxlKCkpIHtcbiAgICAgICAgaWYgKFxuICAgICAgICAgIGJlc3QgPT09IHVuZGVmaW5lZCB8fFxuICAgICAgICAgIHByaW9yaXR5IDwgYmVzdC5wcmlvcml0eSB8fFxuICAgICAgICAgIChwcmlvcml0eSA9PT0gYmVzdC5wcmlvcml0eSAmJiBjdXJyZW50Lmxlbmd0aCA8IGJlc3QuZGlyLmxlbmd0aClcbiAgICAgICAgKSB7XG4gICAgICAgICAgYmVzdCA9IHsgZGlyOiBjdXJyZW50LCBwcmlvcml0eSB9O1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAoIWhhc0JvdW5kYXJ5ICYmIGJlc3QpIHtcbiAgICAgIHJldHVybiBiZXN0LmRpcjtcbiAgICB9XG4gICAgaWYgKGJvdW5kYXJpZXMuaGFzKGN1cnJlbnQpKSB7XG4gICAgICByZXR1cm4gYmVzdD8uZGlyO1xuICAgIH1cbiAgICBjb25zdCBwYXJlbnQgPSBkaXJuYW1lKGN1cnJlbnQpO1xuICAgIGlmIChwYXJlbnQgPT09IGN1cnJlbnQpIHtcbiAgICAgIHJldHVybiBiZXN0Py5kaXI7XG4gICAgfVxuICAgIGN1cnJlbnQgPSBwYXJlbnQ7XG4gIH1cbn1cblxuLyoqXG4gKiBQYXJzZSBhIGdpdCByZW1vdGUgVVJMIChgaHR0cHM6Ly8uLi5gLCBgZ2l0QGhvc3Q6b3duZXIvcmVwby5naXRgLCBldGMuKSBhbmRcbiAqIHJldHVybiB0aGUgcmVwbyBzZWdtZW50LCBzdHJpcHBpbmcgYW55IGAuZ2l0YCBzdWZmaXguIFJldHVybnMgYHVuZGVmaW5lZGAgZm9yXG4gKiBlbXB0eSBvciB1bnBhcnNhYmxlIGlucHV0LlxuICovXG5leHBvcnQgZnVuY3Rpb24gcGFyc2VHaXRSZW1vdGUodXJsOiBzdHJpbmcpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICBjb25zdCB0cmltbWVkID0gdXJsLnRyaW0oKTtcbiAgaWYgKCF0cmltbWVkKSByZXR1cm4gdW5kZWZpbmVkO1xuXG4gIGNvbnN0IHNjcCA9IC9eW15AXStAW146XSs6KC4rKSQvaS5leGVjKHRyaW1tZWQpO1xuICBpZiAoc2NwKSByZXR1cm4gbGFzdFBhdGhTZWdtZW50KHNjcFsxXSA/PyBcIlwiKTtcblxuICB0cnkge1xuICAgIGNvbnN0IG5vcm1hbGl6ZWQgPSB0cmltbWVkLnJlcGxhY2UoL1xcLmdpdCQvaSwgXCJcIik7XG4gICAgY29uc3QgcGF0aG5hbWUgPSBuZXcgVVJMKG5vcm1hbGl6ZWQpLnBhdGhuYW1lO1xuICAgIGNvbnN0IHNlZ21lbnQgPSBwYXRobmFtZS5zcGxpdChcIi9cIikuZmlsdGVyKEJvb2xlYW4pLmF0KC0xKTtcbiAgICByZXR1cm4gc2VnbWVudCA/IGxhc3RQYXRoU2VnbWVudChzZWdtZW50KSA6IHVuZGVmaW5lZDtcbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxufVxuXG5mdW5jdGlvbiBsYXN0UGF0aFNlZ21lbnQocGF0aDogc3RyaW5nKTogc3RyaW5nIHtcbiAgY29uc3Qgc2VnbWVudCA9IHBhdGguc3BsaXQoXCIvXCIpLmZpbHRlcihCb29sZWFuKS5hdCgtMSkgPz8gcGF0aDtcbiAgcmV0dXJuIHNlZ21lbnQucmVwbGFjZSgvXFwuZ2l0JC9pLCBcIlwiKTtcbn1cblxuLyoqXG4gKiBZaWVsZCBjYW5kaWRhdGUgcHJvamVjdC1yb290IGRpcmVjdG9yaWVzIGZvciBgY3dkYCwgaW4gcHJpb3JpdHkgb3JkZXI6IHRoZVxuICogYG5wbSBwcmVmaXhgLCB0aGUgZ2l0IHRvcC1sZXZlbCwgdGhlbiBgY3dkYCBpdHNlbGYuIER1cGxpY2F0ZXMgYXJlIHNraXBwZWQ7XG4gKiBvbmx5IGV4aXN0aW5nIGRpcmVjdG9yaWVzIGFyZSB5aWVsZGVkIChleGNlcHQgdGhlIGZpbmFsIGBjd2RgIGZhbGxiYWNrKS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uKiByZXNvbHZlUHJvamVjdFJvb3RzKGN3ZD86IHN0cmluZyk6IEdlbmVyYXRvcjxzdHJpbmc+IHtcbiAgY29uc3QgYmFzZSA9IHJlc29sdmVXb3JraW5nRGlyZWN0b3J5KGN3ZCk7XG4gIGNvbnN0IHNlZW4gPSBuZXcgU2V0PHN0cmluZz4oKTtcbiAgZm9yIChjb25zdCBjYW5kaWRhdGUgb2YgW25wbVJvb3QoYmFzZSksIGdpdFJvb3QoYmFzZSldKSB7XG4gICAgaWYgKCFjYW5kaWRhdGUpIGNvbnRpbnVlO1xuICAgIGNvbnN0IGRpciA9IHJlc29sdmUoY2FuZGlkYXRlKTtcbiAgICBpZiAoc2Vlbi5oYXMoZGlyKSkgY29udGludWU7XG4gICAgc2Vlbi5hZGQoZGlyKTtcbiAgICBpZiAoZmlsZVN0YXRTeW5jKGRpcik/LmlzRGlyZWN0b3J5KCkpIHlpZWxkIGRpcjtcbiAgfVxuICBpZiAoIXNlZW4uaGFzKGJhc2UpKSB5aWVsZCBiYXNlO1xufVxuXG4vKiogVGhlIG5lYXJlc3QgYW5jZXN0b3Igb2YgYGN3ZGAgKGZyb20ge0BsaW5rIHJlc29sdmVQcm9qZWN0Um9vdHN9KSB3aXRoIGEgYHBhY2thZ2UuanNvbmAuICovXG5mdW5jdGlvbiB3b3Jrc3BhY2VSb290KGN3ZD86IHN0cmluZyk6IHN0cmluZyB7XG4gIGxldCBsYXN0OiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gIGZvciAoY29uc3QgZGlyIG9mIHJlc29sdmVQcm9qZWN0Um9vdHMoY3dkKSkge1xuICAgIGlmIChmaWxlU3RhdFN5bmMocmVzb2x2ZShkaXIsIFwicGFja2FnZS5qc29uXCIpKT8uaXNGaWxlKCkpIHJldHVybiBkaXI7XG4gICAgbGFzdCA9IGRpcjtcbiAgfVxuICByZXR1cm4gbGFzdCA/PyByZXNvbHZlV29ya2luZ0RpcmVjdG9yeShjd2QpO1xufVxuXG4vKipcbiAqIFJlc29sdmUgYSBodW1hbi1mcmllbmRseSBwcm9qZWN0IG5hbWUgZm9yIHRoZSByZXBvIHJvb3RlZCBhdCBgY3dkYDpcbiAqIGBwYWNrYWdlLmpzb25gIGBuYW1lYCwgdGhlbiB0aGUgZ2l0IHJlbW90ZSdzIHJlcG8gbmFtZSwgdGhlbiB0aGUgcm9vdFxuICogZGlyZWN0b3J5J3MgYmFzZW5hbWUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBuYW1lKGN3ZD86IHN0cmluZyk6IHN0cmluZyB7XG4gIGNvbnN0IHJlc29sdmVkID0gcmVzb2x2ZVdvcmtpbmdEaXJlY3RvcnkoY3dkKTtcbiAgY29uc3Qgcm9vdERpciA9IHdvcmtzcGFjZVJvb3QocmVzb2x2ZWQpO1xuXG4gIGNvbnN0IGZyb21QYWNrYWdlID0gcmVhZFBhY2thZ2VOYW1lKHJlc29sdmUocm9vdERpciwgXCJwYWNrYWdlLmpzb25cIikpO1xuICBpZiAoZnJvbVBhY2thZ2UpIHJldHVybiBmcm9tUGFja2FnZTtcblxuICBjb25zdCByZW1vdGUgPSBwcm9qZWN0Q29udGV4dENvbW1hbmQoXG4gICAgXCJnaXRcIixcbiAgICBbXCItQ1wiLCByb290RGlyLCBcInJlbW90ZVwiLCBcImdldC11cmxcIiwgXCJvcmlnaW5cIl0sXG4gICAgcm9vdERpcixcbiAgKS5vdXRwdXQ7XG4gIGNvbnN0IGZyb21HaXQgPSByZW1vdGUgPyBwYXJzZUdpdFJlbW90ZShyZW1vdGUpIDogdW5kZWZpbmVkO1xuICBpZiAoZnJvbUdpdCkgcmV0dXJuIGZyb21HaXQ7XG5cbiAgcmV0dXJuIGJhc2VuYW1lKHJvb3REaXIpO1xufVxuXG4vKipcbiAqIFRoZSBHaXRIdWIgQ0xJJ3MgY2Fub25pY2FsIHJlcG8gVVJMIC0gdGhlIGVhc3kgcGF0aC4gYGdoYCBhbHJlYWR5IHJlc29sdmVzIHRoZVxuICogdHJ1ZSBob3N0IChubyBzc2gtYWxpYXMgcGFyc2luZykgYW5kIHByaW50cyBhIGNsZWFuIGBodHRwczovL2hvc3Qvb3duZXIvcmVwb2AuXG4gKiBgdW5kZWZpbmVkYCB3aGVuIGBnaGAgaXMgYWJzZW50LCB1bmF1dGhlbnRpY2F0ZWQsIG9yIHRoZSBkaXIgaXNuJ3QgYSBHSCByZXBvLlxuICovXG5mdW5jdGlvbiByZXBvc2l0b3J5VXJsRnJvbUdoKGN3ZD86IHN0cmluZyk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IG91dCA9IHByb2plY3RDb250ZXh0Q29tbWFuZChcImdoXCIsIFtcInJlcG9cIiwgXCJ2aWV3XCIsIFwiLS1qc29uXCIsIFwidXJsXCJdLCBjd2QpLm91dHB1dDtcbiAgcmV0dXJuIHN0cmluZ1V0aWxzLnRyaW1Ub051bGwoanNvbi5wYXJzZVJlY29yZChvdXQpPy51cmwpID8/IHVuZGVmaW5lZDtcbn1cblxuLyoqIFJlc29sdmUgYW4gc3NoIGhvc3QgYWxpYXMgKGB+Ly5zc2gvY29uZmlnYCkgdG8gaXRzIGVmZmVjdGl2ZSBgaG9zdG5hbWVgIHZpYSBgc3NoIC1HYC4gKi9cbmZ1bmN0aW9uIHJlc29sdmVTc2hIb3N0TmFtZShob3N0OiBzdHJpbmcsIGN3ZD86IHN0cmluZyk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IGxpbmUgPSBwcm9qZWN0Q29udGV4dENvbW1hbmQoXCJzc2hcIiwgW1wiLUdcIiwgaG9zdF0sIGN3ZClcbiAgICAub3V0cHV0Py5zcGxpdChcIlxcblwiKVxuICAgIC5maW5kKChsKSA9PiAvXmhvc3RuYW1lXFxzL2kudGVzdChsLnRyaW0oKSkpO1xuICBjb25zdCBuYW1lID0gbGluZT8udHJpbSgpLnNwbGl0KC9cXHMrLylbMV07XG4gIHJldHVybiBuYW1lICYmIG5hbWUgIT09IGhvc3QgPyBuYW1lIDogdW5kZWZpbmVkO1xufVxuXG4vKipcbiAqIEZhbGxiYWNrOiBub3JtYWxpemUgYGdpdCByZW1vdGUgZ2V0LXVybCBvcmlnaW5gIHRvIGEgcGxhaW5cbiAqIGBodHRwczovL2hvc3Qvb3duZXIvcmVwb2AgVVJMLiBzY3AtbGlrZSAvIGBzc2g6Ly9gIC8gYGdpdDovL2AgL1xuICogZW1iZWRkZWQtY3JlZGVudGlhbCBmb3JtcyBhcmUgcmV3cml0dGVuIHRvIGh0dHBzLCBhbmQgYW4gc3NoIGhvc3QgYWxpYXMgaXNcbiAqIGZvbGxvd2VkIHRvIGl0cyByZWFsIGhvc3RuYW1lLlxuICovXG5mdW5jdGlvbiByZXBvc2l0b3J5VXJsRnJvbUdpdChjd2Q/OiBzdHJpbmcpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICBjb25zdCByYXcgPSBwcm9qZWN0Q29udGV4dENvbW1hbmQoXCJnaXRcIiwgW1wicmVtb3RlXCIsIFwiZ2V0LXVybFwiLCBcIm9yaWdpblwiXSwgY3dkKS5vdXRwdXQ7XG4gIGlmICghcmF3KSByZXR1cm4gdW5kZWZpbmVkO1xuXG4gIC8vIE5vcm1hbGl6ZSB0aGUgc2NoZW1lIHRvIGh0dHBzIGF0IHRoZSBzdHJpbmcgbGV2ZWwgZmlyc3Q6IHRoZSBXSEFUV0cgYFVSTGBcbiAgLy8gcGFyc2VyIGNhbid0IGNvbnZlcnQgYSBub24tc3BlY2lhbCBzY2hlbWUgKGBzc2hgL2BnaXRgKSB0byBgaHR0cHNgICh0aGVcbiAgLy8gYHByb3RvY29sYCBzZXR0ZXIgbm8tb3BzKSwgYW5kIHNjcC1saWtlIGBnaXRAaG9zdDpvd25lci9yZXBvYCBpc24ndCBhIFVSTCBhdFxuICAvLyBhbGwuIFJld3JpdGUgYm90aCBpbnRvIGFuIGBodHRwczovL2Agc3RyaW5nLCB0aGVuIGxldCB7QGxpbmsgbmV0LnVybEJ1aWxkZXJ9XG4gIC8vIG93biB0aGUgc3RydWN0dXJlZCBlZGl0cyAoc3RyaXAgY3JlZGVudGlhbHMsIHN3YXAgdGhlIGhvc3QpLlxuICBsZXQgaHR0cHMgPSByYXcucmVwbGFjZSgvXmdpdFxcKy8sIFwiXCIpO1xuICBjb25zdCBzY3AgPSAvXlteQF0rQChbXjpdKyk6KC4rKSQvLmV4ZWMoaHR0cHMpO1xuICBpZiAoc2NwKSBodHRwcyA9IGBodHRwczovLyR7c2NwWzFdfS8ke3NjcFsyXX1gO1xuICBodHRwcyA9IGh0dHBzLnJlcGxhY2UoL14oc3NofGdpdCk6XFwvXFwvLywgXCJodHRwczovL1wiKTtcblxuICBsZXQgYnVpbGRlciA9IG5ldC51cmxCdWlsZGVyKGh0dHBzKTtcbiAgaWYgKCFidWlsZGVyKSByZXR1cm4gdW5kZWZpbmVkO1xuICAvLyBEcm9wIGFueSBlbWJlZGRlZCBgdXNlcls6cGFzc11AYCBjcmVkZW50aWFscy5cbiAgaWYgKGJ1aWxkZXIudXNlcm5hbWUgfHwgYnVpbGRlci5wYXNzd29yZCkge1xuICAgIGJ1aWxkZXIgPSBidWlsZGVyLndpdGgoXCJ1c2VybmFtZVwiLCBcIlwiKS53aXRoKFwicGFzc3dvcmRcIiwgXCJcIik7XG4gIH1cbiAgLy8gRm9sbG93IGFuIHNzaCBob3N0IGFsaWFzIHRvIHRoZSB0cnVlIGhvc3QgKHNvIGBnaXRodWItcmVnZ2llLWRiYCAtPiBgZ2l0aHViLmNvbWApLlxuICBjb25zdCByZWFsSG9zdCA9IHJlc29sdmVTc2hIb3N0TmFtZShidWlsZGVyLmhvc3RuYW1lLCBjd2QpO1xuICBpZiAocmVhbEhvc3QpIGJ1aWxkZXIgPSBidWlsZGVyLndpdGgoXCJob3N0bmFtZVwiLCByZWFsSG9zdCk7XG5cbiAgcmV0dXJuIGAke2J1aWxkZXIub3JpZ2lufSR7YnVpbGRlci5wYXRobmFtZS5yZXBsYWNlKC9cXC5naXQkLywgXCJcIil9YDtcbn1cblxuLyoqXG4gKiBUaGUgcmVwbydzIGNhbm9uaWNhbCByZW1vdGUgVVJMLCBvciBgdW5kZWZpbmVkYCB3aGVuIHRoZXJlIGlzIG5vIGdpdCByZW1vdGUuXG4gKiBUcmllcyBgZ2ggcmVwbyB2aWV3YCBmaXJzdCAoaG9zdC1hY2N1cmF0ZSwgbm8gcGFyc2luZyksIHRoZW4gbm9ybWFsaXplc1xuICogYGdpdCByZW1vdGUgZ2V0LXVybCBvcmlnaW5gLiBBIGJsYW5rLCBvbWl0dGVkLCBvciBleHBsaWNpdGx5IGN1cnJlbnQgYGN3ZGBcbiAqIHJldXNlcyBjYWNoZWQgY29tbWFuZCBwcm9iZXM7IGFub3RoZXIgcmVzb2x2ZWQgZGlyZWN0b3J5IGV4ZWN1dGVzIGRpcmVjdGx5LlxuICpcbiAqIEBwYXJhbSBjd2QgLSBkaXJlY3RvcnkgdG8gcmVzb2x2ZSBmcm9tIChkZWZhdWx0cyB0byBgcHJvY2Vzcy5jd2QoKWApLlxuICogQHBhcmFtIGZvcm1hdCAtIGBcImh0dHBzXCJgIChkZWZhdWx0KSB5aWVsZHMgYGh0dHBzOi8vaG9zdC9vd25lci9yZXBvYDtcbiAqICAgYFwibnBtXCJgIHlpZWxkcyBucG0ncyBgZ2l0K2h0dHBzOi8vaG9zdC9vd25lci9yZXBvLmdpdGAgZm9ybSAoZm9yIGFcbiAqICAgYHBhY2thZ2UuanNvbmAgYHJlcG9zaXRvcnkudXJsYCB0aGF0IHBhc3NlcyBucG0gcHJvdmVuYW5jZSkuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZXBvc2l0b3J5VXJsKGN3ZD86IHN0cmluZywgZm9ybWF0OiBcImh0dHBzXCIgfCBcIm5wbVwiID0gXCJodHRwc1wiKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgY29uc3QgcmVzb2x2ZWQgPSByZXNvbHZlV29ya2luZ0RpcmVjdG9yeShjd2QpO1xuICBjb25zdCBodHRwcyA9IHJlcG9zaXRvcnlVcmxGcm9tR2gocmVzb2x2ZWQpID8/IHJlcG9zaXRvcnlVcmxGcm9tR2l0KHJlc29sdmVkKTtcbiAgaWYgKCFodHRwcykgcmV0dXJuIHVuZGVmaW5lZDtcbiAgcmV0dXJuIGZvcm1hdCA9PT0gXCJucG1cIiA/IGBnaXQrJHtodHRwcy5yZXBsYWNlKC9cXC5naXQkLywgXCJcIil9LmdpdGAgOiBodHRwcztcbn1cblxuLyoqXG4gKiBUaGUgYWN0aXZlIG5wbSByZWdpc3RyeSAoYG5wbSBjb25maWcgZ2V0IHJlZ2lzdHJ5YCkgYXMgYSBjaGFpbmFibGVcbiAqIHtAbGluayBuZXQuVXJsQnVpbGRlcn0sIG9yIGB1bmRlZmluZWRgIHdoZW4gbnBtIGlzIGFic2VudCBvciBwcmludHMgbm8gVVJMLlxuICogQSBibGFuaywgbnVsbCwgb21pdHRlZCwgb3IgZXhwbGljaXRseSBjdXJyZW50IGBjd2RgIHJldXNlcyB0aGUgY2FjaGVkIG5wbVxuICogY29tbWFuZDsgYW5vdGhlciByZXNvbHZlZCBkaXJlY3RvcnkgZXhlY3V0ZXMgaXQgZGlyZWN0bHkuIEVudmlyb25tZW50IG9wdGlvbnNcbiAqIGFyZSBldmFsdWF0ZWQgb24gZXZlcnkgY2FsbC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG5wbVJlZ2lzdHJ5KFxuICBjd2Q/OiBzdHJpbmcgfCBudWxsLFxuICBvcHRpb25zPzogeyBvdmVycmlkZU9ubHk/OiBib29sZWFuOyBlbnZWYXJzPzogYm9vbGVhbiB9LFxuKTogbmV0LlVybEJ1aWxkZXIgfCB1bmRlZmluZWQge1xuICBjb25zdCByZXNvbHZlZCA9IHJlc29sdmVXb3JraW5nRGlyZWN0b3J5KGN3ZCk7XG4gIHJldHVybiByZXNvbHZlTnBtUmVnaXN0cnkocmVzb2x2ZWQsIG9wdGlvbnMpO1xufVxuXG5mdW5jdGlvbiByZXNvbHZlTnBtUmVnaXN0cnkoXG4gIGN3ZDogc3RyaW5nIHwgbnVsbCB8IHVuZGVmaW5lZCxcbiAgb3B0aW9uczogeyBvdmVycmlkZU9ubHk/OiBib29sZWFuOyBlbnZWYXJzPzogYm9vbGVhbiB9IHwgdW5kZWZpbmVkLFxuKTogbmV0LlVybEJ1aWxkZXIgfCB1bmRlZmluZWQge1xuICBjb25zdCBjYW5kaWRhdGVzID0gKGZ1bmN0aW9uKiAoKSB7XG4gICAgeWllbGQgcHJvamVjdENvbnRleHRDb21tYW5kKFxuICAgICAgXCJucG1cIixcbiAgICAgIFtcImNvbmZpZ1wiLCBcImdldFwiLCBcInJlZ2lzdHJ5XCJdLFxuICAgICAgY3dkID8/IHVuZGVmaW5lZCxcbiAgICApLm91dHB1dD8udHJpbSgpO1xuICAgIGlmICh0eXBlb2YgcHJvY2VzcyAhPT0gXCJ1bmRlZmluZWRcIiAmJiBwcm9jZXNzPy5lbnYpIHtcbiAgICAgIGNvbnN0IGVudktleSA9IFwibnBtX2NvbmZpZ19yZWdpc3RyeVwiO1xuICAgICAgaWYgKG9wdGlvbnM/LmVudlZhcnMpIHtcbiAgICAgICAgeWllbGQgcHJvY2Vzcy5lbnZbZW52S2V5XTtcbiAgICAgICAgeWllbGQgcHJvY2Vzcy5lbnZbZW52S2V5LnRvVXBwZXJDYXNlKCldO1xuICAgICAgfVxuICAgIH1cbiAgfSkoKTtcbiAgZm9yIChjb25zdCBjYW5kaWRhdGUgb2YgY2FuZGlkYXRlcykge1xuICAgIGlmIChjYW5kaWRhdGUpIHtcbiAgICAgIGNvbnN0IHVybCA9IG5ldC51cmxCdWlsZGVyKGNhbmRpZGF0ZSk7XG4gICAgICBpZiAoIXVybCkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH0gZWxzZSBpZiAob3B0aW9ucz8ub3ZlcnJpZGVPbmx5KSB7XG4gICAgICAgIGNvbnN0IG5wbWpzUmVnaXN0cnlVcmwgPSBcImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnXCI7XG4gICAgICAgIGNvbnN0IHJlZ2lzdHJ5VXJsID0gdXJsLnRvU3RyaW5nKCk7XG4gICAgICAgIGlmIChyZWdpc3RyeVVybCA9PT0gbnBtanNSZWdpc3RyeVVybCB8fCByZWdpc3RyeVVybC5zdGFydHNXaXRoKG5wbWpzUmVnaXN0cnlVcmwgKyBcIi9cIikpIHtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIHVybDtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHVuZGVmaW5lZDtcbn1cblxuZnVuY3Rpb24gcmVhZFBhY2thZ2VOYW1lKHBrZ1BhdGg6IHN0cmluZyk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIGlmICghZmlsZVN0YXRTeW5jKHBrZ1BhdGgpPy5pc0ZpbGUoKSkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgcmV0dXJuIHN0cmluZ1V0aWxzLnRyaW1Ub051bGwoanNvbi5wYXJzZVJlY29yZChyZWFkRmlsZVN5bmMocGtnUGF0aCwgXCJ1dGY4XCIpKT8ubmFtZSkgPz8gdW5kZWZpbmVkO1xufVxuXG5pZiAoaW1wb3J0Lm1ldGEubWFpbikge1xuICBjb25zb2xlLmxvZyhcIm5wbSByb290OlwiLCBucG1Sb290KCkpO1xuICBjb25zb2xlLmxvZyhcInJlcG8gcm9vdDpcIiwgZ2l0Um9vdCgpKTtcbiAgY29uc29sZS5sb2coXCJwYWNrYWdlIHJvb3Q6XCIsIHJvb3QoKSk7XG4gIGNvbnNvbGUubG9nKFwicHJvamVjdCBuYW1lOlwiLCBuYW1lKCkpO1xuICBjb25zb2xlLmxvZyhcInJlcG9zaXRvcnkgdXJsOlwiLCByZXBvc2l0b3J5VXJsKCkpO1xuICBjb25zb2xlLmxvZyhcInJlcG9zaXRvcnkgdXJsIChucG0pOlwiLCByZXBvc2l0b3J5VXJsKHVuZGVmaW5lZCwgXCJucG1cIikpO1xufVxuIl19
|
|
481
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJvamVjdC11dGlscy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9wcm9qZWN0LXV0aWxzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUMvQyxPQUFPLEVBQVMsWUFBWSxFQUFFLE1BQU0sU0FBUyxDQUFDO0FBQzlDLE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxTQUFTLENBQUM7QUFDbEMsT0FBTyxFQUFFLFFBQVEsRUFBRSxPQUFPLEVBQUUsSUFBSSxFQUFFLE9BQU8sRUFBRSxNQUFNLFdBQVcsQ0FBQztBQUM3RCxPQUFPLEVBQUUsSUFBSSxFQUFFLEdBQUcsRUFBRSxNQUFNLEVBQUUsV0FBVyxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDeEUsT0FBTyxFQUFFLEtBQUssSUFBSSxTQUFTLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDMUMsT0FBTyxFQUFFLFlBQVksRUFBRSxRQUFRLElBQUksWUFBWSxFQUFFLE1BQU0sV0FBVyxDQUFDO0FBRW5FLE1BQU0sWUFBWSxHQUFHO0lBQ25CLGNBQWM7SUFDZCxjQUFjO0lBQ2QsZUFBZTtJQUNmLGVBQWU7SUFDZixjQUFjO0NBQ04sQ0FBQztBQUVYLHFGQUFxRjtBQUNyRixNQUFNLFVBQVUsdUJBQXVCLENBQUMsR0FBbUI7SUFDekQsT0FBTyxPQUFPLENBQUMsV0FBVyxDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUMsSUFBSSxPQUFPLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQztBQUMvRCxDQUFDO0FBaUJEOzs7Ozs7O0dBT0c7QUFDSCxTQUFTLDJCQUEyQixDQUFDLE9BQWUsRUFBRSxJQUFjLEVBQUUsR0FBVztJQUMvRSxNQUFNLE1BQU0sR0FBRyxTQUFTLENBQUMsT0FBTyxFQUFFLElBQUksRUFBRSxFQUFFLEdBQUcsRUFBRSxLQUFLLEVBQUUsQ0FBQyxRQUFRLEVBQUUsTUFBTSxFQUFFLFFBQVEsQ0FBQyxFQUFFLENBQUMsQ0FBQztJQUN0RixNQUFNLE1BQU0sR0FBRyxNQUFNLEVBQUUsTUFBTSxFQUFFLFFBQVEsRUFBRSxFQUFFLElBQUksRUFBRSxDQUFDO0lBQ2xELElBQUksTUFBTSxDQUFDLE1BQU0sS0FBSyxDQUFDLElBQUksTUFBTSxFQUFFLENBQUM7UUFDbEMsTUFBTSxTQUFTLEdBQUcsWUFBWSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQ3ZDLDBFQUEwRTtRQUMxRSw0RUFBNEU7UUFDNUUseUVBQXlFO1FBQ3pFLDRFQUE0RTtRQUM1RSxNQUFNLEdBQUcsR0FBRywwQkFBMEIsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxVQUFVLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQztRQUN6RixPQUFPLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRSxTQUFTLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsU0FBUyxFQUFFLFNBQVMsRUFBRSxHQUFHLEVBQUUsQ0FBQztJQUMxRSxDQUFDO0lBQ0QsT0FBTyxFQUFFLE1BQU0sRUFBRSxDQUFDO0FBQ3BCLENBQUM7QUFFRCxNQUFNLG1CQUFtQixHQUFHLElBQUksR0FBRyxFQUEwQixDQUFDO0FBRTlELFNBQVMscUJBQXFCLENBQUMsT0FBZSxFQUFFLElBQWMsRUFBRSxHQUFZO0lBQzFFLE1BQU0sUUFBUSxHQUFHLHVCQUF1QixDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQzlDLE1BQU0sR0FBRyxHQUNQLFFBQVEsS0FBSyx1QkFBdUIsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsT0FBTyxFQUFFLEdBQUcsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDO0lBQzFGLElBQUksR0FBRyxLQUFLLFNBQVMsRUFBRSxDQUFDO1FBQ3RCLE1BQU0sTUFBTSxHQUFHLG1CQUFtQixDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUM1QyxJQUFJLE1BQU0sS0FBSyxTQUFTO1lBQUUsT0FBTyxNQUFNLENBQUM7SUFDMUMsQ0FBQztJQUNELE1BQU0sS0FBSyxHQUFHLDJCQUEyQixDQUFDLE9BQU8sRUFBRSxJQUFJLEVBQUUsUUFBUSxDQUFDLENBQUM7SUFDbkUsSUFBSSxHQUFHLEtBQUssU0FBUztRQUFFLG1CQUFtQixDQUFDLEdBQUcsQ0FBQyxHQUFHLEVBQUUsS0FBSyxDQUFDLENBQUM7SUFDM0QsT0FBTyxLQUFLLENBQUM7QUFDZixDQUFDO0FBRUQsU0FBUyxXQUFXLENBQUMsT0FBZSxFQUFFLElBQWMsRUFBRSxHQUFXO0lBQy9ELE1BQU0sTUFBTSxHQUFHLHFCQUFxQixDQUFDLE9BQU8sRUFBRSxJQUFJLEVBQUUsR0FBRyxDQUFDLENBQUM7SUFDekQsT0FBTyxNQUFNLENBQUMsU0FBUyxFQUFFLFdBQVcsRUFBRSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUM7QUFDbkUsQ0FBQztBQUVEOzs7Ozs7Ozs7O0dBVUc7QUFDSCxTQUFTLE9BQU8sQ0FBQyxHQUFZO0lBQzNCLE1BQU0sUUFBUSxHQUFHLHVCQUF1QixDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQzlDLElBQUksUUFBUSxLQUFLLHVCQUF1QixFQUFFLEVBQUUsQ0FBQztRQUMzQyxNQUFNLE9BQU8sR0FBRyxZQUFZLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyx1QkFBdUIsQ0FBQyxDQUFDO1FBQ2xFLElBQUksT0FBTztZQUFFLE9BQU8sT0FBTyxDQUFDO0lBQzlCLENBQUM7SUFDRCxPQUFPLFdBQVcsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxRQUFRLENBQUMsRUFBRSxRQUFRLENBQUMsQ0FBQztBQUNsRCxDQUFDO0FBRUQsU0FBUyxZQUFZLENBQUMsS0FBeUI7SUFDN0MsTUFBTSxJQUFJLEdBQUcsV0FBVyxDQUFDLFVBQVUsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUMzQyxJQUFJLENBQUMsSUFBSTtRQUFFLE9BQU8sU0FBUyxDQUFDO0lBQzVCLE1BQU0sUUFBUSxHQUFHLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUMvQixPQUFPLFlBQVksQ0FBQyxRQUFRLENBQUMsRUFBRSxXQUFXLEVBQUUsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUM7QUFDdEUsQ0FBQztBQUVELFNBQVMsT0FBTyxDQUFDLEdBQVk7SUFDM0IsTUFBTSxRQUFRLEdBQUcsdUJBQXVCLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDOUMsT0FBTyxXQUFXLENBQUMsS0FBSyxFQUFFLENBQUMsV0FBVyxFQUFFLGlCQUFpQixDQUFDLEVBQUUsUUFBUSxDQUFDLENBQUM7QUFDeEUsQ0FBQztBQUVELHNGQUFzRjtBQUN0RixNQUFNLFVBQVUsSUFBSSxDQUFDLEdBQVk7SUFDL0IsTUFBTSxRQUFRLEdBQUcsdUJBQXVCLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDOUMsSUFBSSxPQUFPLEdBQUcsUUFBUSxDQUFDO0lBRXZCLElBQUksQ0FBQyxZQUFZLENBQUMsT0FBTyxDQUFDLEVBQUUsV0FBVyxFQUFFLEVBQUUsQ0FBQztRQUMxQyxPQUFPLEdBQUcsT0FBTyxDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQzdCLENBQUM7SUFDRCxNQUFNLFVBQVUsR0FBRyxJQUFJLEdBQUcsQ0FDeEIsQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLEVBQUUsT0FBTyxDQUFDLFFBQVEsQ0FBQyxDQUFDO1NBQ25DLE1BQU0sQ0FBQyxDQUFDLElBQUksRUFBa0IsRUFBRSxDQUFDLElBQUksS0FBSyxTQUFTLENBQUM7U0FDcEQsR0FBRyxDQUFDLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FDaEMsQ0FBQztJQUNGLE1BQU0sV0FBVyxHQUFHLFVBQVUsQ0FBQyxJQUFJLEdBQUcsQ0FBQyxDQUFDO0lBQ3hDLElBQUksSUFBbUQsQ0FBQztJQUN4RCxPQUFPLElBQUksRUFBRSxDQUFDO1FBQ1osS0FBSyxNQUFNLENBQUMsUUFBUSxFQUFFLE1BQU0sQ0FBQyxJQUFJLFlBQVksQ0FBQyxPQUFPLEVBQUUsRUFBRSxDQUFDO1lBQ3hELElBQUksWUFBWSxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsTUFBTSxDQUFDLENBQUMsRUFBRSxNQUFNLEVBQUUsRUFBRSxDQUFDO2dCQUNsRCxJQUNFLElBQUksS0FBSyxTQUFTO29CQUNsQixRQUFRLEdBQUcsSUFBSSxDQUFDLFFBQVE7b0JBQ3hCLENBQUMsUUFBUSxLQUFLLElBQUksQ0FBQyxRQUFRLElBQUksT0FBTyxDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxFQUNoRSxDQUFDO29CQUNELElBQUksR0FBRyxFQUFFLEdBQUcsRUFBRSxPQUFPLEVBQUUsUUFBUSxFQUFFLENBQUM7Z0JBQ3BDLENBQUM7Z0JBQ0QsTUFBTTtZQUNSLENBQUM7UUFDSCxDQUFDO1FBQ0QsSUFBSSxDQUFDLFdBQVcsSUFBSSxJQUFJLEVBQUUsQ0FBQztZQUN6QixPQUFPLElBQUksQ0FBQyxHQUFHLENBQUM7UUFDbEIsQ0FBQztRQUNELElBQUksVUFBVSxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDO1lBQzVCLE9BQU8sSUFBSSxFQUFFLEdBQUcsQ0FBQztRQUNuQixDQUFDO1FBQ0QsTUFBTSxNQUFNLEdBQUcsT0FBTyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQ2hDLElBQUksTUFBTSxLQUFLLE9BQU8sRUFBRSxDQUFDO1lBQ3ZCLE9BQU8sSUFBSSxFQUFFLEdBQUcsQ0FBQztRQUNuQixDQUFDO1FBQ0QsT0FBTyxHQUFHLE1BQU0sQ0FBQztJQUNuQixDQUFDO0FBQ0gsQ0FBQztBQUVEOzs7O0dBSUc7QUFDSCxNQUFNLFVBQVUsY0FBYyxDQUFDLEdBQVc7SUFDeEMsTUFBTSxPQUFPLEdBQUcsR0FBRyxDQUFDLElBQUksRUFBRSxDQUFDO0lBQzNCLElBQUksQ0FBQyxPQUFPO1FBQUUsT0FBTyxTQUFTLENBQUM7SUFFL0IsTUFBTSxHQUFHLEdBQUcscUJBQXFCLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQ2hELElBQUksR0FBRztRQUFFLE9BQU8sZUFBZSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQztJQUU5QyxJQUFJLENBQUM7UUFDSCxNQUFNLFVBQVUsR0FBRyxPQUFPLENBQUMsT0FBTyxDQUFDLFNBQVMsRUFBRSxFQUFFLENBQUMsQ0FBQztRQUNsRCxNQUFNLFFBQVEsR0FBRyxJQUFJLEdBQUcsQ0FBQyxVQUFVLENBQUMsQ0FBQyxRQUFRLENBQUM7UUFDOUMsTUFBTSxPQUFPLEdBQUcsUUFBUSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDM0QsT0FBTyxPQUFPLENBQUMsQ0FBQyxDQUFDLGVBQWUsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDO0lBQ3hELENBQUM7SUFBQyxNQUFNLENBQUM7UUFDUCxPQUFPLFNBQVMsQ0FBQztJQUNuQixDQUFDO0FBQ0gsQ0FBQztBQUVELFNBQVMsZUFBZSxDQUFDLElBQVk7SUFDbkMsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDO0lBQy9ELE9BQU8sT0FBTyxDQUFDLE9BQU8sQ0FBQyxTQUFTLEVBQUUsRUFBRSxDQUFDLENBQUM7QUFDeEMsQ0FBQztBQUVEOzs7O0dBSUc7QUFDSCxNQUFNLFNBQVMsQ0FBQyxDQUFDLG1CQUFtQixDQUFDLEdBQVk7SUFDL0MsTUFBTSxJQUFJLEdBQUcsdUJBQXVCLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDMUMsTUFBTSxJQUFJLEdBQUcsSUFBSSxHQUFHLEVBQVUsQ0FBQztJQUMvQixLQUFLLE1BQU0sU0FBUyxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxFQUFFLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQyxFQUFFLENBQUM7UUFDdkQsSUFBSSxDQUFDLFNBQVM7WUFBRSxTQUFTO1FBQ3pCLE1BQU0sR0FBRyxHQUFHLE9BQU8sQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUMvQixJQUFJLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDO1lBQUUsU0FBUztRQUM1QixJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ2QsSUFBSSxZQUFZLENBQUMsR0FBRyxDQUFDLEVBQUUsV0FBVyxFQUFFO1lBQUUsTUFBTSxHQUFHLENBQUM7SUFDbEQsQ0FBQztJQUNELElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQztRQUFFLE1BQU0sSUFBSSxDQUFDO0FBQ2xDLENBQUM7QUFFRCw4RkFBOEY7QUFDOUYsU0FBUyxhQUFhLENBQUMsR0FBWTtJQUNqQyxJQUFJLElBQXdCLENBQUM7SUFDN0IsS0FBSyxNQUFNLEdBQUcsSUFBSSxtQkFBbUIsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDO1FBQzNDLElBQUksWUFBWSxDQUFDLE9BQU8sQ0FBQyxHQUFHLEVBQUUsY0FBYyxDQUFDLENBQUMsRUFBRSxNQUFNLEVBQUU7WUFBRSxPQUFPLEdBQUcsQ0FBQztRQUNyRSxJQUFJLEdBQUcsR0FBRyxDQUFDO0lBQ2IsQ0FBQztJQUNELE9BQU8sSUFBSSxJQUFJLHVCQUF1QixDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQzlDLENBQUM7QUFFRDs7OztHQUlHO0FBQ0gsTUFBTSxVQUFVLElBQUksQ0FBQyxHQUFZO0lBQy9CLE1BQU0sUUFBUSxHQUFHLHVCQUF1QixDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQzlDLE1BQU0sT0FBTyxHQUFHLGFBQWEsQ0FBQyxRQUFRLENBQUMsQ0FBQztJQUV4QyxNQUFNLFdBQVcsR0FBRyxlQUFlLENBQUMsT0FBTyxDQUFDLE9BQU8sRUFBRSxjQUFjLENBQUMsQ0FBQyxDQUFDO0lBQ3RFLElBQUksV0FBVztRQUFFLE9BQU8sV0FBVyxDQUFDO0lBRXBDLE1BQU0sTUFBTSxHQUFHLHFCQUFxQixDQUNsQyxLQUFLLEVBQ0wsQ0FBQyxJQUFJLEVBQUUsT0FBTyxFQUFFLFFBQVEsRUFBRSxTQUFTLEVBQUUsUUFBUSxDQUFDLEVBQzlDLE9BQU8sQ0FDUixDQUFDLE1BQU0sQ0FBQztJQUNULE1BQU0sT0FBTyxHQUFHLE1BQU0sQ0FBQyxDQUFDLENBQUMsY0FBYyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUM7SUFDNUQsSUFBSSxPQUFPO1FBQUUsT0FBTyxPQUFPLENBQUM7SUFFNUIsT0FBTyxRQUFRLENBQUMsT0FBTyxDQUFDLENBQUM7QUFDM0IsQ0FBQztBQUVEOzs7O0dBSUc7QUFDSCxTQUFTLG1CQUFtQixDQUFDLEdBQVk7SUFDdkMsTUFBTSxHQUFHLEdBQUcscUJBQXFCLENBQUMsSUFBSSxFQUFFLENBQUMsTUFBTSxFQUFFLE1BQU0sRUFBRSxRQUFRLEVBQUUsS0FBSyxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUMsTUFBTSxDQUFDO0lBQ3ZGLE9BQU8sV0FBVyxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLEdBQUcsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxJQUFJLFNBQVMsQ0FBQztBQUN6RSxDQUFDO0FBRUQsNEZBQTRGO0FBQzVGLFNBQVMsa0JBQWtCLENBQUMsSUFBWSxFQUFFLEdBQVk7SUFDcEQsTUFBTSxJQUFJLEdBQUcscUJBQXFCLENBQUMsS0FBSyxFQUFFLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxFQUFFLEdBQUcsQ0FBQztTQUN6RCxNQUFNLEVBQUUsS0FBSyxDQUFDLElBQUksQ0FBQztTQUNuQixJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQztJQUM5QyxNQUFNLElBQUksR0FBRyxJQUFJLEVBQUUsSUFBSSxFQUFFLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQzFDLE9BQU8sSUFBSSxJQUFJLElBQUksS0FBSyxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDO0FBQ2xELENBQUM7QUFFRDs7Ozs7R0FLRztBQUNILFNBQVMsb0JBQW9CLENBQUMsR0FBWTtJQUN4QyxNQUFNLEdBQUcsR0FBRyxxQkFBcUIsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxRQUFRLEVBQUUsU0FBUyxFQUFFLFFBQVEsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDLE1BQU0sQ0FBQztJQUN0RixJQUFJLENBQUMsR0FBRztRQUFFLE9BQU8sU0FBUyxDQUFDO0lBRTNCLDRFQUE0RTtJQUM1RSwwRUFBMEU7SUFDMUUsK0VBQStFO0lBQy9FLCtFQUErRTtJQUMvRSwrREFBK0Q7SUFDL0QsSUFBSSxLQUFLLEdBQUcsR0FBRyxDQUFDLE9BQU8sQ0FBQyxRQUFRLEVBQUUsRUFBRSxDQUFDLENBQUM7SUFDdEMsTUFBTSxHQUFHLEdBQUcsc0JBQXNCLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQy9DLElBQUksR0FBRztRQUFFLEtBQUssR0FBRyxXQUFXLEdBQUcsQ0FBQyxDQUFDLENBQUMsSUFBSSxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztJQUMvQyxLQUFLLEdBQUcsS0FBSyxDQUFDLE9BQU8sQ0FBQyxpQkFBaUIsRUFBRSxVQUFVLENBQUMsQ0FBQztJQUVyRCxJQUFJLE9BQU8sR0FBRyxHQUFHLENBQUMsVUFBVSxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ3BDLElBQUksQ0FBQyxPQUFPO1FBQUUsT0FBTyxTQUFTLENBQUM7SUFDL0IsZ0RBQWdEO0lBQ2hELElBQUksT0FBTyxDQUFDLFFBQVEsSUFBSSxPQUFPLENBQUMsUUFBUSxFQUFFLENBQUM7UUFDekMsT0FBTyxHQUFHLE9BQU8sQ0FBQyxJQUFJLENBQUMsVUFBVSxFQUFFLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxVQUFVLEVBQUUsRUFBRSxDQUFDLENBQUM7SUFDOUQsQ0FBQztJQUNELHFGQUFxRjtJQUNyRixNQUFNLFFBQVEsR0FBRyxrQkFBa0IsQ0FBQyxPQUFPLENBQUMsUUFBUSxFQUFFLEdBQUcsQ0FBQyxDQUFDO0lBQzNELElBQUksUUFBUTtRQUFFLE9BQU8sR0FBRyxPQUFPLENBQUMsSUFBSSxDQUFDLFVBQVUsRUFBRSxRQUFRLENBQUMsQ0FBQztJQUUzRCxPQUFPLEdBQUcsT0FBTyxDQUFDLE1BQU0sR0FBRyxPQUFPLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxRQUFRLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQztBQUN0RSxDQUFDO0FBRUQ7Ozs7Ozs7Ozs7R0FVRztBQUNILE1BQU0sVUFBVSxhQUFhLENBQUMsR0FBWSxFQUFFLFNBQTBCLE9BQU87SUFDM0UsTUFBTSxRQUFRLEdBQUcsdUJBQXVCLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDOUMsTUFBTSxLQUFLLEdBQUcsbUJBQW1CLENBQUMsUUFBUSxDQUFDLElBQUksb0JBQW9CLENBQUMsUUFBUSxDQUFDLENBQUM7SUFDOUUsSUFBSSxDQUFDLEtBQUs7UUFBRSxPQUFPLFNBQVMsQ0FBQztJQUM3QixPQUFPLE1BQU0sS0FBSyxLQUFLLENBQUMsQ0FBQyxDQUFDLE9BQU8sS0FBSyxDQUFDLE9BQU8sQ0FBQyxRQUFRLEVBQUUsRUFBRSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDO0FBQzdFLENBQUM7QUFFRCwwRUFBMEU7QUFDMUUsTUFBTSxvQkFBb0IsR0FBRyw2QkFBNkIsQ0FBQztBQWMzRCxNQUFNLGdCQUFnQixHQUFHLElBQUksR0FBRyxFQUFzQyxDQUFDO0FBRXZFOzs7Ozs7O0dBT0c7QUFDSCxNQUFNLFVBQVUsV0FBVyxDQUN6QixHQUFtQixFQUNuQixPQUE0QjtJQUU1QixNQUFNLFFBQVEsR0FBRyx1QkFBdUIsQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUM5QyxNQUFNLE9BQU8sR0FBRyxPQUFPLEVBQUUsT0FBTyxLQUFLLEtBQUssQ0FBQztJQUMzQyxNQUFNLFlBQVksR0FBRyxPQUFPLENBQUMsT0FBTyxFQUFFLFlBQVksQ0FBQyxDQUFDO0lBQ3BELE1BQU0sR0FBRyxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUM7UUFDekIsUUFBUTtRQUNSLFlBQVk7UUFDWixPQUFPO1FBQ1AsT0FBTyxFQUFFO1FBQ1QsT0FBTyxDQUFDLEdBQUcsQ0FBQyxxQkFBcUIsSUFBSSxFQUFFO1FBQ3ZDLE9BQU8sQ0FBQyxHQUFHLENBQUMsdUJBQXVCLElBQUksRUFBRTtRQUN6QyxPQUFPLENBQUMsR0FBRyxDQUFDLE1BQU0sSUFBSSxFQUFFO1FBQ3hCLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLG1CQUFtQixJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFO1FBQ3RELE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLG1CQUFtQixJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFO1FBQ3RELE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLG1CQUFtQixJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFO0tBQ3ZELENBQUMsQ0FBQztJQUNILElBQUksZ0JBQWdCLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQztRQUFFLE9BQU8sZ0JBQWdCLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQ2hFLE1BQU0sS0FBSyxHQUFHLGtCQUFrQixDQUFDLFFBQVEsRUFBRSxFQUFFLFlBQVksRUFBRSxPQUFPLEVBQUUsQ0FBQyxDQUFDO0lBQ3RFLGdCQUFnQixDQUFDLEdBQUcsQ0FBQyxHQUFHLEVBQUUsS0FBSyxDQUFDLENBQUM7SUFDakMsT0FBTyxLQUFLLENBQUM7QUFDZixDQUFDO0FBRUQsU0FBUyxrQkFBa0IsQ0FDekIsR0FBVyxFQUNYLE9BQW9EO0lBRXBELEtBQUssTUFBTSxTQUFTLElBQUkscUJBQXFCLENBQUMsR0FBRyxFQUFFLE9BQU8sQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDO1FBQ3BFLE1BQU0sR0FBRyxHQUFHLGFBQWEsQ0FBQyxTQUFTLEVBQUUsT0FBTyxDQUFDLFlBQVksQ0FBQyxDQUFDO1FBQzNELElBQUksR0FBRztZQUFFLE9BQU8sR0FBRyxDQUFDO0lBQ3RCLENBQUM7SUFDRCxPQUFPLGFBQWEsQ0FBQyxvQkFBb0IsRUFBRSxPQUFPLENBQUMsWUFBWSxDQUFDLENBQUM7QUFDbkUsQ0FBQztBQUVELFFBQVEsQ0FBQyxDQUFDLHFCQUFxQixDQUFDLEdBQVcsRUFBRSxPQUFnQjtJQUMzRCxJQUFJLE9BQU8sRUFBRSxDQUFDO1FBQ1osTUFBTSxPQUFPLENBQUMsR0FBRyxDQUFDLG1CQUFtQixDQUFDO1FBQ3RDLE1BQU0sT0FBTyxDQUFDLEdBQUcsQ0FBQyxtQkFBbUIsQ0FBQztRQUN0QyxNQUFNLE9BQU8sQ0FBQyxHQUFHLENBQUMsbUJBQW1CLENBQUM7SUFDeEMsQ0FBQztJQUNELEtBQUssTUFBTSxHQUFHLElBQUksWUFBWSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUM7UUFDcEMsTUFBTSxpQkFBaUIsQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFLFFBQVEsQ0FBQyxDQUFDLENBQUM7SUFDL0MsQ0FBQztJQUNELE1BQU0saUJBQWlCLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxxQkFBcUIsSUFBSSxJQUFJLENBQUMsT0FBTyxFQUFFLEVBQUUsUUFBUSxDQUFDLENBQUMsQ0FBQztJQUN4RixNQUFNLGlCQUFpQixDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsdUJBQXVCLElBQUksa0JBQWtCLEVBQUUsQ0FBQyxDQUFDO0lBQ3JGLEtBQUssTUFBTSxHQUFHLElBQUksWUFBWSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUM7UUFDcEMsTUFBTSxrQkFBa0IsQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFLGFBQWEsQ0FBQyxDQUFDLENBQUM7SUFDckQsQ0FBQztJQUNELE1BQU0sa0JBQWtCLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxFQUFFLGFBQWEsQ0FBQyxDQUFDLENBQUM7SUFDekQsS0FBSyxNQUFNLEdBQUcsSUFBSSxZQUFZLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQztRQUNwQyxNQUFNLGdCQUFnQixDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUscUJBQXFCLENBQUMsQ0FBQyxDQUFDO0lBQzNELENBQUM7SUFDRCxLQUFLLE1BQU0sSUFBSSxJQUFJLHFCQUFxQixFQUFFLEVBQUUsQ0FBQztRQUMzQyxNQUFNLGdCQUFnQixDQUFDLElBQUksQ0FBQyxDQUFDO0lBQy9CLENBQUM7QUFDSCxDQUFDO0FBRUQsU0FBUyxhQUFhLENBQ3BCLFNBQTZCLEVBQzdCLFlBQXFCO0lBRXJCLE1BQU0sT0FBTyxHQUFHLFdBQVcsQ0FBQyxVQUFVLENBQUMsU0FBUyxDQUFDLENBQUM7SUFDbEQsSUFBSSxDQUFDLE9BQU87UUFBRSxPQUFPLFNBQVMsQ0FBQztJQUMvQixNQUFNLEdBQUcsR0FBRyxHQUFHLENBQUMsVUFBVSxDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQ3BDLElBQUksQ0FBQyxHQUFHO1FBQUUsT0FBTyxTQUFTLENBQUM7SUFDM0IsSUFBSSxZQUFZLElBQUksbUJBQW1CLENBQUMsR0FBRyxDQUFDO1FBQUUsT0FBTyxTQUFTLENBQUM7SUFDL0QsT0FBTyxHQUFHLENBQUM7QUFDYixDQUFDO0FBRUQsU0FBUyxtQkFBbUIsQ0FBQyxHQUFtQjtJQUM5QyxPQUFPLEdBQUcsQ0FBQyxRQUFRLEtBQUssb0JBQW9CLENBQUM7QUFDL0MsQ0FBQztBQUVELFFBQVEsQ0FBQyxDQUFDLFlBQVksQ0FBQyxHQUFXO0lBQ2hDLElBQUksT0FBTyxHQUFHLEdBQUcsQ0FBQztJQUNsQixPQUFPLElBQUksRUFBRSxDQUFDO1FBQ1osTUFBTSxPQUFPLENBQUM7UUFDZCxNQUFNLE1BQU0sR0FBRyxPQUFPLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDaEMsSUFBSSxNQUFNLEtBQUssT0FBTztZQUFFLE9BQU87UUFDL0IsT0FBTyxHQUFHLE1BQU0sQ0FBQztJQUNuQixDQUFDO0FBQ0gsQ0FBQztBQUVELFNBQVMsa0JBQWtCO0lBQ3pCLElBQUksT0FBTyxDQUFDLFFBQVEsS0FBSyxPQUFPLEVBQUUsQ0FBQztRQUNqQyxPQUFPLElBQUksQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLFdBQVcsSUFBSSxpQkFBaUIsRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLE9BQU8sQ0FBQyxDQUFDO0lBQ25GLENBQUM7SUFDRCxPQUFPLElBQUksQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLE1BQU0sSUFBSSxZQUFZLEVBQUUsS0FBSyxFQUFFLE9BQU8sQ0FBQyxDQUFDO0FBQ2xFLENBQUM7QUFFRCxTQUFTLHFCQUFxQjtJQUM1QixNQUFNLElBQUksR0FBRyxPQUFPLEVBQUUsQ0FBQztJQUN2QixJQUFJLE9BQU8sQ0FBQyxRQUFRLEtBQUssUUFBUSxFQUFFLENBQUM7UUFDbEMsT0FBTyxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsc0NBQXNDLENBQUMsQ0FBQyxDQUFDO0lBQzlELENBQUM7SUFDRCxJQUFJLE9BQU8sQ0FBQyxRQUFRLEtBQUssT0FBTyxFQUFFLENBQUM7UUFDakMsT0FBTyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLFlBQVksSUFBSSxJQUFJLENBQUMsSUFBSSxFQUFFLGVBQWUsQ0FBQyxFQUFFLGtCQUFrQixDQUFDLENBQUMsQ0FBQztJQUM3RixDQUFDO0lBQ0QsT0FBTyxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsMEJBQTBCLENBQUMsQ0FBQyxDQUFDO0FBQ2xELENBQUM7QUFFRCxTQUFTLGlCQUFpQixDQUFDLElBQVk7SUFDckMsT0FBTyxZQUFZLENBQUMsa0JBQWtCLElBQUksRUFBRSxFQUFFLEdBQUcsRUFBRTtRQUNqRCxNQUFNLElBQUksR0FBRyxZQUFZLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDaEMsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLENBQUMsQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDO1FBQzNELE9BQU8sUUFBUSxDQUFDLENBQUMsQ0FBQyxFQUFFLFFBQVEsRUFBRSxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUM7SUFDN0MsQ0FBQyxDQUFDLEVBQUUsUUFBUSxDQUFDO0FBQ2YsQ0FBQztBQUVELFNBQVMsa0JBQWtCLENBQUMsSUFBWTtJQUN0QyxPQUFPLFlBQVksQ0FBQyxtQkFBbUIsSUFBSSxFQUFFLEVBQUUsR0FBRyxFQUFFO1FBQ2xELE1BQU0sSUFBSSxHQUFHLFlBQVksQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUNoQyxNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsQ0FBQyxDQUFDLG1CQUFtQixDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUM7UUFDOUQsT0FBTyxRQUFRLENBQUMsQ0FBQyxDQUFDLEVBQUUsUUFBUSxFQUFFLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQztJQUM3QyxDQUFDLENBQUMsRUFBRSxRQUFRLENBQUM7QUFDZixDQUFDO0FBRUQsU0FBUyxnQkFBZ0IsQ0FBQyxJQUFZO0lBQ3BDLE9BQU8sWUFBWSxDQUFDLGlCQUFpQixJQUFJLEVBQUUsRUFBRSxHQUFHLEVBQUU7UUFDaEQsTUFBTSxJQUFJLEdBQUcsWUFBWSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ2hDLElBQUksQ0FBQyxJQUFJO1lBQUUsT0FBTyxTQUFTLENBQUM7UUFDNUIsTUFBTSxNQUFNLEdBQUcsU0FBUyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQy9CLElBQUksQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQztZQUFFLE9BQU8sU0FBUyxDQUFDO1FBQy9DLE1BQU0sUUFBUSxHQUFHLFlBQVksQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUN0QyxPQUFPLFFBQVEsQ0FBQyxDQUFDLENBQUMsRUFBRSxRQUFRLEVBQUUsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDO0lBQzdDLENBQUMsQ0FBQyxFQUFFLFFBQVEsQ0FBQztBQUNmLENBQUM7QUFFRCxTQUFTLFlBQVksQ0FBQyxJQUFZO0lBQ2hDLElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLEVBQUUsTUFBTSxFQUFFO1FBQUUsT0FBTyxTQUFTLENBQUM7SUFDcEQsT0FBTyxZQUFZLENBQUMsSUFBSSxFQUFFLE1BQU0sQ0FBQyxDQUFDO0FBQ3BDLENBQUM7QUFFRCw0REFBNEQ7QUFDNUQsU0FBUyxnQkFBZ0IsQ0FBQyxJQUFZO0lBQ3BDLEtBQUssTUFBTSxHQUFHLElBQUksSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDO1FBQ3RDLE1BQU0sSUFBSSxHQUFHLEdBQUcsQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUN4QixJQUFJLENBQUMsSUFBSSxJQUFJLElBQUksQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDLElBQUksSUFBSSxDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUM7WUFBRSxTQUFTO1FBQ3BFLE1BQU0sRUFBRSxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDN0IsSUFBSSxFQUFFLEtBQUssQ0FBQyxDQUFDO1lBQUUsU0FBUztRQUN4QixJQUFJLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLElBQUksRUFBRSxLQUFLLFVBQVU7WUFBRSxTQUFTO1FBQ3RELE9BQU8sZUFBZSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDN0MsQ0FBQztJQUNELE9BQU8sU0FBUyxDQUFDO0FBQ25CLENBQUM7QUFFRDs7O0dBR0c7QUFDSCxTQUFTLG1CQUFtQixDQUFDLElBQVk7SUFDdkMsSUFBSSxPQUFPLEdBQUcsRUFBRSxDQUFDO0lBQ2pCLEtBQUssTUFBTSxHQUFHLElBQUksSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDO1FBQ3RDLE1BQU0sSUFBSSxHQUFHLGdCQUFnQixDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDO1FBQzFDLElBQUksQ0FBQyxJQUFJO1lBQUUsU0FBUztRQUNwQixNQUFNLE1BQU0sR0FBRyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDM0MsSUFBSSxNQUFNLEVBQUUsQ0FBQztZQUNYLE9BQU8sR0FBRyxNQUFNLENBQUMsQ0FBQyxDQUFFLENBQUMsSUFBSSxFQUFFLENBQUM7WUFDNUIsU0FBUztRQUNYLENBQUM7UUFDRCxNQUFNLEVBQUUsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQzdCLElBQUksRUFBRSxLQUFLLENBQUMsQ0FBQztZQUFFLFNBQVM7UUFDeEIsTUFBTSxHQUFHLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUM7UUFDckMsTUFBTSxLQUFLLEdBQUcsZUFBZSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDbEQsSUFBSSxPQUFPLEtBQUssU0FBUyxJQUFJLEdBQUcsS0FBSyxVQUFVLElBQUksQ0FBQyxLQUFLLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQztZQUFFLE9BQU8sS0FBSyxDQUFDO1FBQ3hGLElBQUksT0FBTyxLQUFLLGtCQUFrQixJQUFJLEdBQUcsS0FBSyxLQUFLO1lBQUUsT0FBTyxLQUFLLENBQUM7UUFDbEUsSUFBSSxDQUFDLE9BQU8sSUFBSSxHQUFHLEtBQUssa0JBQWtCO1lBQUUsT0FBTyxLQUFLLENBQUM7SUFDM0QsQ0FBQztJQUNELE9BQU8sU0FBUyxDQUFDO0FBQ25CLENBQUM7QUFFRCxTQUFTLFlBQVksQ0FBQyxJQUE2QjtJQUNqRCxJQUFJLE9BQU8sSUFBSSxDQUFDLFFBQVEsS0FBSyxRQUFRO1FBQUUsT0FBTyxJQUFJLENBQUMsUUFBUSxDQUFDO0lBQzVELE1BQU0sVUFBVSxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUM7SUFDbkMsSUFBSSxNQUFNLENBQUMsUUFBUSxDQUFDLFVBQVUsQ0FBQyxJQUFJLE9BQU8sVUFBVSxDQUFDLE9BQU8sS0FBSyxRQUFRLEVBQUUsQ0FBQztRQUMxRSxPQUFPLFVBQVUsQ0FBQyxPQUFPLENBQUM7SUFDNUIsQ0FBQztJQUNELE9BQU8sU0FBUyxDQUFDO0FBQ25CLENBQUM7QUFFRCxTQUFTLGVBQWUsQ0FBQyxLQUFhO0lBQ3BDLE1BQU0sT0FBTyxHQUFHLEtBQUssQ0FBQyxJQUFJLEVBQUUsQ0FBQztJQUM3QixNQUFNLE9BQU8sR0FBRyxPQUFPLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQ3ZDLE1BQU0sR0FBRyxHQUFHLE9BQU8sS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxPQUFPLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQztJQUN4RSxJQUFJLENBQUMsR0FBRyxDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUMsSUFBSSxHQUFHLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxJQUFJLEdBQUcsQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDO1FBQzdGLE9BQU8sR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUMxQixDQUFDO0lBQ0QsT0FBTyxHQUFHLENBQUM7QUFDYixDQUFDO0FBRUQsU0FBUyxnQkFBZ0IsQ0FBQyxJQUFZO0lBQ3BDLE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDL0IsT0FBTyxJQUFJLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUM7QUFDbEQsQ0FBQztBQUVELFNBQVMsZUFBZSxDQUFDLE9BQWU7SUFDdEMsSUFBSSxDQUFDLFlBQVksQ0FBQyxPQUFPLENBQUMsRUFBRSxNQUFNLEVBQUU7UUFBRSxPQUFPLFNBQVMsQ0FBQztJQUN2RCxPQUFPLFdBQVcsQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxZQUFZLENBQUMsT0FBTyxFQUFFLE1BQU0sQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLElBQUksU0FBUyxDQUFDO0FBQ3BHLENBQUM7QUFFRCxJQUFJLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUM7SUFDckIsT0FBTyxDQUFDLEdBQUcsQ0FBQyxXQUFXLEVBQUUsT0FBTyxFQUFFLENBQUMsQ0FBQztJQUNwQyxPQUFPLENBQUMsR0FBRyxDQUFDLFlBQVksRUFBRSxPQUFPLEVBQUUsQ0FBQyxDQUFDO0lBQ3JDLE9BQU8sQ0FBQyxHQUFHLENBQUMsZUFBZSxFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7SUFDckMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxlQUFlLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQztJQUNyQyxPQUFPLENBQUMsR0FBRyxDQUFDLGlCQUFpQixFQUFFLGFBQWEsRUFBRSxDQUFDLENBQUM7SUFDaEQsT0FBTyxDQUFDLEdBQUcsQ0FBQyx1QkFBdUIsRUFBRSxhQUFhLENBQUMsU0FBUyxFQUFFLEtBQUssQ0FBQyxDQUFDLENBQUM7QUFDeEUsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IHNwYXduU3luYyB9IGZyb20gXCJub2RlOmNoaWxkX3Byb2Nlc3NcIjtcbmltcG9ydCB7IFN0YXRzLCByZWFkRmlsZVN5bmMgfSBmcm9tIFwibm9kZTpmc1wiO1xuaW1wb3J0IHsgaG9tZWRpciB9IGZyb20gXCJub2RlOm9zXCI7XG5pbXBvcnQgeyBiYXNlbmFtZSwgZGlybmFtZSwgam9pbiwgcmVzb2x2ZSB9IGZyb20gXCJub2RlOnBhdGhcIjtcbmltcG9ydCB7IGpzb24sIG5ldCwgb2JqZWN0LCBzdHJpbmdVdGlscyB9IGZyb20gXCJAZGJ4LXRvb2xzL3NoYXJlZC1jb3JlXCI7XG5pbXBvcnQgeyBwYXJzZSBhcyBwYXJzZVlhbWwgfSBmcm9tIFwieWFtbFwiO1xuaW1wb3J0IHsgY2FjaGVkUmVjb3JkLCBzdGF0U3luYyBhcyBmaWxlU3RhdFN5bmMgfSBmcm9tIFwiLi9maWxlLnRzXCI7XG5cbmNvbnN0IFJPT1RfTUFSS0VSUyA9IFtcbiAgXCIucHJvamVucmMudHNcIixcbiAgXCIucHJvamVucmMuanNcIixcbiAgXCIucHJvamVucmMubWpzXCIsXG4gIFwiLnByb2plbnJjLmNqc1wiLFxuICBcInBhY2thZ2UuanNvblwiLFxuXSBhcyBjb25zdDtcblxuLyoqIFJlc29sdmUgYSBibGFuaywgbnVsbCwgb21pdHRlZCwgcmVsYXRpdmUsIG9yIGFic29sdXRlIGN3ZCB0byBhbiBhYnNvbHV0ZSBwYXRoLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlc29sdmVXb3JraW5nRGlyZWN0b3J5KGN3ZD86IHN0cmluZyB8IG51bGwpOiBzdHJpbmcge1xuICByZXR1cm4gcmVzb2x2ZShzdHJpbmdVdGlscy50cmltVG9OdWxsKGN3ZCkgPz8gcHJvY2Vzcy5jd2QoKSk7XG59XG5cbi8qKiBBIGNvbW1hbmQncyBzdGRvdXQsIGNsYXNzaWZpZWQgYXMgYSBmaWxlc3lzdGVtIHBhdGggYW5kL29yIGEgVVJMLiAqL1xuZXhwb3J0IGludGVyZmFjZSBQcm9qZWN0Q29udGV4dCB7XG4gIHJlYWRvbmx5IG91dHB1dDogc3RyaW5nO1xuICAvKiogYG91dHB1dGAgd2hlbiBpdCBuYW1lcyBzb21ldGhpbmcgb24gZGlzay4gKi9cbiAgcmVhZG9ubHkgcGF0aD86IHN0cmluZztcbiAgLyoqIGBmaWxlLnN0YXRTeW5jYCBvZiB7QGxpbmsgcGF0aH0sIHdoZW4gaXQgZXhpc3RzLiAqL1xuICByZWFkb25seSBwYXRoU3RhdHM/OiBTdGF0cztcbiAgLyoqXG4gICAqIGBvdXRwdXRgIHBhcnNlZCBpbnRvIGEgY2hhaW5hYmxlIHtAbGluayBuZXQuVXJsQnVpbGRlcn0sIHdoZW4gaXQgaXMgYSByZWFsXG4gICAqIG5ldHdvcmsgVVJMIC0gYSBub24tYmxhbmsgc2NoZW1lIChub3QgYGZpbGU6YCkgQU5EIGEgbm9uLWJsYW5rIGhvc3RuYW1lLlxuICAgKiBCYXJlIHBhdGhzLCBzY3AtbGlrZSBgZ2l0QGhvc3Q6Li4uYCByZW1vdGVzLCBhbmQgYGZpbGU6YCBVUkxzIHN0YXkgdW5zZXQuXG4gICAqL1xuICByZWFkb25seSB1cmw/OiBuZXQuVXJsQnVpbGRlcjtcbn1cblxuLyoqXG4gKiBiZWNhdXNlIHRoaXMgaXMgY3J1Y2lhbCBkbyBub3QgdXNlIGV4ZWMuc3Bhd25TeW5jXG4gKlxuICogUnVuIGBjb21tYW5kIGFyZ3NgIGluIGBjd2RgIGFuZCBjbGFzc2lmeSBpdHMgc3Rkb3V0OiBgcGF0aGAgKyBgcGF0aFN0YXRzYCB3aGVuXG4gKiB0aGUgb3V0cHV0IG5hbWVzIHNvbWV0aGluZyBvbiBkaXNrLCBgdXJsYCAoYSB7QGxpbmsgbmV0LlVybEJ1aWxkZXJ9KSB3aGVuIGl0XG4gKiBwYXJzZXMgYXMgYSByZWFsIG5ldHdvcmsgVVJMLiBFbXB0eSB7QGxpbmsgUHJvamVjdENvbnRleHR9IG9uIGEgbm9uLXplcm8gZXhpdFxuICogb3IgZW1wdHkgb3V0cHV0LlxuICovXG5mdW5jdGlvbiBwcm9qZWN0Q29udGV4dENvbW1hbmRPdXRwdXQoY29tbWFuZDogc3RyaW5nLCBhcmdzOiBzdHJpbmdbXSwgY3dkOiBzdHJpbmcpOiBQcm9qZWN0Q29udGV4dCB7XG4gIGNvbnN0IHJlc3VsdCA9IHNwYXduU3luYyhjb21tYW5kLCBhcmdzLCB7IGN3ZCwgc3RkaW86IFtcImlnbm9yZVwiLCBcInBpcGVcIiwgXCJpZ25vcmVcIl0gfSk7XG4gIGNvbnN0IG91dHB1dCA9IHJlc3VsdD8uc3Rkb3V0Py50b1N0cmluZygpPy50cmltKCk7XG4gIGlmIChyZXN1bHQuc3RhdHVzID09PSAwICYmIG91dHB1dCkge1xuICAgIGNvbnN0IHBhdGhTdGF0cyA9IGZpbGVTdGF0U3luYyhvdXRwdXQpO1xuICAgIC8vIE9ubHkgYW4gRVhQTElDSVQgYHNjaGVtZTovLy4uLmAgY291bnRzIGFzIGEgVVJMLiBgdXJsQnVpbGRlcmAgb3RoZXJ3aXNlXG4gICAgLy8gc3ludGhlc2l6ZXMgb25lIChhIGJhcmUgYGV4YW1wbGUuY29tYCAtPiBgaHR0cHM6Ly/igKZgLCBhbiBhYnNvbHV0ZSBwYXRoIC0+XG4gICAgLy8gYGh0dHA6Ly9sb2NhbGhvc3Qv4oCmYCksIHdoaWNoIHdvdWxkIG1pc2xhYmVsIGRpcmVjdG9yeSBvdXRwdXRzIGFuZCBiYXJlXG4gICAgLy8gdG9rZW5zIC0gc28gZ2F0ZSBvbiB0aGUgcmF3IG91dHB1dCBhbHJlYWR5IGNhcnJ5aW5nIGEgc2NoZW1lICsgYXV0aG9yaXR5LlxuICAgIGNvbnN0IHVybCA9IC9eW2Etel1bYS16MC05Ky4tXSo6XFwvXFwvL2kudGVzdChvdXRwdXQpID8gbmV0LnVybEJ1aWxkZXIob3V0cHV0KSA6IHVuZGVmaW5lZDtcbiAgICByZXR1cm4geyBvdXRwdXQsIHBhdGg6IHBhdGhTdGF0cyA/IG91dHB1dCA6IHVuZGVmaW5lZCwgcGF0aFN0YXRzLCB1cmwgfTtcbiAgfVxuICByZXR1cm4geyBvdXRwdXQgfTtcbn1cblxuY29uc3QgcHJvamVjdENvbW1hbmRDYWNoZSA9IG5ldyBNYXA8c3RyaW5nLCBQcm9qZWN0Q29udGV4dD4oKTtcblxuZnVuY3Rpb24gcHJvamVjdENvbnRleHRDb21tYW5kKGNvbW1hbmQ6IHN0cmluZywgYXJnczogc3RyaW5nW10sIGN3ZD86IHN0cmluZyk6IFByb2plY3RDb250ZXh0IHtcbiAgY29uc3QgcmVzb2x2ZWQgPSByZXNvbHZlV29ya2luZ0RpcmVjdG9yeShjd2QpO1xuICBjb25zdCBrZXkgPVxuICAgIHJlc29sdmVkID09PSByZXNvbHZlV29ya2luZ0RpcmVjdG9yeSgpID8gSlNPTi5zdHJpbmdpZnkoW2NvbW1hbmQsIC4uLmFyZ3NdKSA6IHVuZGVmaW5lZDtcbiAgaWYgKGtleSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgY29uc3QgY2FjaGVkID0gcHJvamVjdENvbW1hbmRDYWNoZS5nZXQoa2V5KTtcbiAgICBpZiAoY2FjaGVkICE9PSB1bmRlZmluZWQpIHJldHVybiBjYWNoZWQ7XG4gIH1cbiAgY29uc3QgdmFsdWUgPSBwcm9qZWN0Q29udGV4dENvbW1hbmRPdXRwdXQoY29tbWFuZCwgYXJncywgcmVzb2x2ZWQpO1xuICBpZiAoa2V5ICE9PSB1bmRlZmluZWQpIHByb2plY3RDb21tYW5kQ2FjaGUuc2V0KGtleSwgdmFsdWUpO1xuICByZXR1cm4gdmFsdWU7XG59XG5cbmZ1bmN0aW9uIGNvbW1hbmRSb290KGNvbW1hbmQ6IHN0cmluZywgYXJnczogc3RyaW5nW10sIGN3ZDogc3RyaW5nKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgY29uc3QgcGFyc2VkID0gcHJvamVjdENvbnRleHRDb21tYW5kKGNvbW1hbmQsIGFyZ3MsIGN3ZCk7XG4gIHJldHVybiBwYXJzZWQucGF0aFN0YXRzPy5pc0RpcmVjdG9yeSgpID8gcGFyc2VkLnBhdGggOiB1bmRlZmluZWQ7XG59XG5cbi8qKlxuICogQ2xvc2VzdCBkaXJlY3Rvcnkgd2l0aCBhIGBwYWNrYWdlLmpzb25gIG9yIGBub2RlX21vZHVsZXNgLCBtYXRjaGluZyBgbnBtIHByZWZpeGAuXG4gKlxuICogTGlmZWN5Y2xlIHNjcmlwdHMgZnJvbSBucG0gYW5kIEJ1biBzZXQgYG5wbV9jb25maWdfbG9jYWxfcHJlZml4YCB0byB0aGF0XG4gKiBkaXJlY3RvcnkuIFJlYWQgaXQgZmlyc3Qgd2hlbiByZXNvbHZpbmcgdGhpcyBwcm9jZXNzJ3MgY3dkIHNvIGEgbWlzc2luZyBucG1cbiAqIENMSSBpcyBub3QgcmVxdWlyZWQuIGBucG1fY29uZmlnX3ByZWZpeGAgLyBgUFJFRklYYCBhcmUgdGhlIGdsb2JhbCBpbnN0YWxsXG4gKiBwcmVmaXggYW5kIG11c3Qgbm90IGJlIHVzZWQgaGVyZS5cbiAqXG4gKiBCdW4gaGFzIG5vIHByZWZpeCBjb21tYW5kIChgYnVuIHBtIGJpbmAgaXMgdGhlIGAuYmluYCBkaXJlY3RvcnkpLiBwbnBtJ3NcbiAqIGBwcmVmaXhgIGNvbW1hbmQgaXMgdW5pbXBsZW1lbnRlZDsgYHBucG0gcm9vdGAgcHJpbnRzIGBub2RlX21vZHVsZXNgLlxuICovXG5mdW5jdGlvbiBucG1Sb290KGN3ZD86IHN0cmluZyk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IHJlc29sdmVkID0gcmVzb2x2ZVdvcmtpbmdEaXJlY3RvcnkoY3dkKTtcbiAgaWYgKHJlc29sdmVkID09PSByZXNvbHZlV29ya2luZ0RpcmVjdG9yeSgpKSB7XG4gICAgY29uc3QgZnJvbUVudiA9IGVudkRpcmVjdG9yeShwcm9jZXNzLmVudi5ucG1fY29uZmlnX2xvY2FsX3ByZWZpeCk7XG4gICAgaWYgKGZyb21FbnYpIHJldHVybiBmcm9tRW52O1xuICB9XG4gIHJldHVybiBjb21tYW5kUm9vdChcIm5wbVwiLCBbXCJwcmVmaXhcIl0sIHJlc29sdmVkKTtcbn1cblxuZnVuY3Rpb24gZW52RGlyZWN0b3J5KHZhbHVlOiBzdHJpbmcgfCB1bmRlZmluZWQpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICBjb25zdCBwYXRoID0gc3RyaW5nVXRpbHMudHJpbVRvTnVsbCh2YWx1ZSk7XG4gIGlmICghcGF0aCkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgY29uc3QgcmVzb2x2ZWQgPSByZXNvbHZlKHBhdGgpO1xuICByZXR1cm4gZmlsZVN0YXRTeW5jKHJlc29sdmVkKT8uaXNEaXJlY3RvcnkoKSA/IHJlc29sdmVkIDogdW5kZWZpbmVkO1xufVxuXG5mdW5jdGlvbiBnaXRSb290KGN3ZD86IHN0cmluZyk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IHJlc29sdmVkID0gcmVzb2x2ZVdvcmtpbmdEaXJlY3RvcnkoY3dkKTtcbiAgcmV0dXJuIGNvbW1hbmRSb290KFwiZ2l0XCIsIFtcInJldi1wYXJzZVwiLCBcIi0tc2hvdy10b3BsZXZlbFwiXSwgcmVzb2x2ZWQpO1xufVxuXG4vKiogUmVzb2x2ZSB0aGUgbmVhcmVzdCBwcm9qZWN0IHJvb3Qgd2l0aG91dCB3YWxraW5nIGFib3ZlIGl0cyBucG0gb3IgR2l0IGJvdW5kYXJ5LiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJvb3QoY3dkPzogc3RyaW5nKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgY29uc3QgcmVzb2x2ZWQgPSByZXNvbHZlV29ya2luZ0RpcmVjdG9yeShjd2QpO1xuICBsZXQgY3VycmVudCA9IHJlc29sdmVkO1xuXG4gIGlmICghZmlsZVN0YXRTeW5jKGN1cnJlbnQpPy5pc0RpcmVjdG9yeSgpKSB7XG4gICAgY3VycmVudCA9IGRpcm5hbWUoY3VycmVudCk7XG4gIH1cbiAgY29uc3QgYm91bmRhcmllcyA9IG5ldyBTZXQoXG4gICAgW25wbVJvb3QocmVzb2x2ZWQpLCBnaXRSb290KHJlc29sdmVkKV1cbiAgICAgIC5maWx0ZXIoKHBhdGgpOiBwYXRoIGlzIHN0cmluZyA9PiBwYXRoICE9PSB1bmRlZmluZWQpXG4gICAgICAubWFwKChwYXRoKSA9PiByZXNvbHZlKHBhdGgpKSxcbiAgKTtcbiAgY29uc3QgaGFzQm91bmRhcnkgPSBib3VuZGFyaWVzLnNpemUgPiAwO1xuICBsZXQgYmVzdDogeyBkaXI6IHN0cmluZzsgcHJpb3JpdHk6IG51bWJlciB9IHwgdW5kZWZpbmVkO1xuICB3aGlsZSAodHJ1ZSkge1xuICAgIGZvciAoY29uc3QgW3ByaW9yaXR5LCBtYXJrZXJdIG9mIFJPT1RfTUFSS0VSUy5lbnRyaWVzKCkpIHtcbiAgICAgIGlmIChmaWxlU3RhdFN5bmMoam9pbihjdXJyZW50LCBtYXJrZXIpKT8uaXNGaWxlKCkpIHtcbiAgICAgICAgaWYgKFxuICAgICAgICAgIGJlc3QgPT09IHVuZGVmaW5lZCB8fFxuICAgICAgICAgIHByaW9yaXR5IDwgYmVzdC5wcmlvcml0eSB8fFxuICAgICAgICAgIChwcmlvcml0eSA9PT0gYmVzdC5wcmlvcml0eSAmJiBjdXJyZW50Lmxlbmd0aCA8IGJlc3QuZGlyLmxlbmd0aClcbiAgICAgICAgKSB7XG4gICAgICAgICAgYmVzdCA9IHsgZGlyOiBjdXJyZW50LCBwcmlvcml0eSB9O1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAoIWhhc0JvdW5kYXJ5ICYmIGJlc3QpIHtcbiAgICAgIHJldHVybiBiZXN0LmRpcjtcbiAgICB9XG4gICAgaWYgKGJvdW5kYXJpZXMuaGFzKGN1cnJlbnQpKSB7XG4gICAgICByZXR1cm4gYmVzdD8uZGlyO1xuICAgIH1cbiAgICBjb25zdCBwYXJlbnQgPSBkaXJuYW1lKGN1cnJlbnQpO1xuICAgIGlmIChwYXJlbnQgPT09IGN1cnJlbnQpIHtcbiAgICAgIHJldHVybiBiZXN0Py5kaXI7XG4gICAgfVxuICAgIGN1cnJlbnQgPSBwYXJlbnQ7XG4gIH1cbn1cblxuLyoqXG4gKiBQYXJzZSBhIGdpdCByZW1vdGUgVVJMIChgaHR0cHM6Ly8uLi5gLCBgZ2l0QGhvc3Q6b3duZXIvcmVwby5naXRgLCBldGMuKSBhbmRcbiAqIHJldHVybiB0aGUgcmVwbyBzZWdtZW50LCBzdHJpcHBpbmcgYW55IGAuZ2l0YCBzdWZmaXguIFJldHVybnMgYHVuZGVmaW5lZGAgZm9yXG4gKiBlbXB0eSBvciB1bnBhcnNhYmxlIGlucHV0LlxuICovXG5leHBvcnQgZnVuY3Rpb24gcGFyc2VHaXRSZW1vdGUodXJsOiBzdHJpbmcpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICBjb25zdCB0cmltbWVkID0gdXJsLnRyaW0oKTtcbiAgaWYgKCF0cmltbWVkKSByZXR1cm4gdW5kZWZpbmVkO1xuXG4gIGNvbnN0IHNjcCA9IC9eW15AXStAW146XSs6KC4rKSQvaS5leGVjKHRyaW1tZWQpO1xuICBpZiAoc2NwKSByZXR1cm4gbGFzdFBhdGhTZWdtZW50KHNjcFsxXSA/PyBcIlwiKTtcblxuICB0cnkge1xuICAgIGNvbnN0IG5vcm1hbGl6ZWQgPSB0cmltbWVkLnJlcGxhY2UoL1xcLmdpdCQvaSwgXCJcIik7XG4gICAgY29uc3QgcGF0aG5hbWUgPSBuZXcgVVJMKG5vcm1hbGl6ZWQpLnBhdGhuYW1lO1xuICAgIGNvbnN0IHNlZ21lbnQgPSBwYXRobmFtZS5zcGxpdChcIi9cIikuZmlsdGVyKEJvb2xlYW4pLmF0KC0xKTtcbiAgICByZXR1cm4gc2VnbWVudCA/IGxhc3RQYXRoU2VnbWVudChzZWdtZW50KSA6IHVuZGVmaW5lZDtcbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxufVxuXG5mdW5jdGlvbiBsYXN0UGF0aFNlZ21lbnQocGF0aDogc3RyaW5nKTogc3RyaW5nIHtcbiAgY29uc3Qgc2VnbWVudCA9IHBhdGguc3BsaXQoXCIvXCIpLmZpbHRlcihCb29sZWFuKS5hdCgtMSkgPz8gcGF0aDtcbiAgcmV0dXJuIHNlZ21lbnQucmVwbGFjZSgvXFwuZ2l0JC9pLCBcIlwiKTtcbn1cblxuLyoqXG4gKiBZaWVsZCBjYW5kaWRhdGUgcHJvamVjdC1yb290IGRpcmVjdG9yaWVzIGZvciBgY3dkYCwgaW4gcHJpb3JpdHkgb3JkZXI6IHRoZVxuICogYG5wbSBwcmVmaXhgLCB0aGUgZ2l0IHRvcC1sZXZlbCwgdGhlbiBgY3dkYCBpdHNlbGYuIER1cGxpY2F0ZXMgYXJlIHNraXBwZWQ7XG4gKiBvbmx5IGV4aXN0aW5nIGRpcmVjdG9yaWVzIGFyZSB5aWVsZGVkIChleGNlcHQgdGhlIGZpbmFsIGBjd2RgIGZhbGxiYWNrKS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uKiByZXNvbHZlUHJvamVjdFJvb3RzKGN3ZD86IHN0cmluZyk6IEdlbmVyYXRvcjxzdHJpbmc+IHtcbiAgY29uc3QgYmFzZSA9IHJlc29sdmVXb3JraW5nRGlyZWN0b3J5KGN3ZCk7XG4gIGNvbnN0IHNlZW4gPSBuZXcgU2V0PHN0cmluZz4oKTtcbiAgZm9yIChjb25zdCBjYW5kaWRhdGUgb2YgW25wbVJvb3QoYmFzZSksIGdpdFJvb3QoYmFzZSldKSB7XG4gICAgaWYgKCFjYW5kaWRhdGUpIGNvbnRpbnVlO1xuICAgIGNvbnN0IGRpciA9IHJlc29sdmUoY2FuZGlkYXRlKTtcbiAgICBpZiAoc2Vlbi5oYXMoZGlyKSkgY29udGludWU7XG4gICAgc2Vlbi5hZGQoZGlyKTtcbiAgICBpZiAoZmlsZVN0YXRTeW5jKGRpcik/LmlzRGlyZWN0b3J5KCkpIHlpZWxkIGRpcjtcbiAgfVxuICBpZiAoIXNlZW4uaGFzKGJhc2UpKSB5aWVsZCBiYXNlO1xufVxuXG4vKiogVGhlIG5lYXJlc3QgYW5jZXN0b3Igb2YgYGN3ZGAgKGZyb20ge0BsaW5rIHJlc29sdmVQcm9qZWN0Um9vdHN9KSB3aXRoIGEgYHBhY2thZ2UuanNvbmAuICovXG5mdW5jdGlvbiB3b3Jrc3BhY2VSb290KGN3ZD86IHN0cmluZyk6IHN0cmluZyB7XG4gIGxldCBsYXN0OiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gIGZvciAoY29uc3QgZGlyIG9mIHJlc29sdmVQcm9qZWN0Um9vdHMoY3dkKSkge1xuICAgIGlmIChmaWxlU3RhdFN5bmMocmVzb2x2ZShkaXIsIFwicGFja2FnZS5qc29uXCIpKT8uaXNGaWxlKCkpIHJldHVybiBkaXI7XG4gICAgbGFzdCA9IGRpcjtcbiAgfVxuICByZXR1cm4gbGFzdCA/PyByZXNvbHZlV29ya2luZ0RpcmVjdG9yeShjd2QpO1xufVxuXG4vKipcbiAqIFJlc29sdmUgYSBodW1hbi1mcmllbmRseSBwcm9qZWN0IG5hbWUgZm9yIHRoZSByZXBvIHJvb3RlZCBhdCBgY3dkYDpcbiAqIGBwYWNrYWdlLmpzb25gIGBuYW1lYCwgdGhlbiB0aGUgZ2l0IHJlbW90ZSdzIHJlcG8gbmFtZSwgdGhlbiB0aGUgcm9vdFxuICogZGlyZWN0b3J5J3MgYmFzZW5hbWUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBuYW1lKGN3ZD86IHN0cmluZyk6IHN0cmluZyB7XG4gIGNvbnN0IHJlc29sdmVkID0gcmVzb2x2ZVdvcmtpbmdEaXJlY3RvcnkoY3dkKTtcbiAgY29uc3Qgcm9vdERpciA9IHdvcmtzcGFjZVJvb3QocmVzb2x2ZWQpO1xuXG4gIGNvbnN0IGZyb21QYWNrYWdlID0gcmVhZFBhY2thZ2VOYW1lKHJlc29sdmUocm9vdERpciwgXCJwYWNrYWdlLmpzb25cIikpO1xuICBpZiAoZnJvbVBhY2thZ2UpIHJldHVybiBmcm9tUGFja2FnZTtcblxuICBjb25zdCByZW1vdGUgPSBwcm9qZWN0Q29udGV4dENvbW1hbmQoXG4gICAgXCJnaXRcIixcbiAgICBbXCItQ1wiLCByb290RGlyLCBcInJlbW90ZVwiLCBcImdldC11cmxcIiwgXCJvcmlnaW5cIl0sXG4gICAgcm9vdERpcixcbiAgKS5vdXRwdXQ7XG4gIGNvbnN0IGZyb21HaXQgPSByZW1vdGUgPyBwYXJzZUdpdFJlbW90ZShyZW1vdGUpIDogdW5kZWZpbmVkO1xuICBpZiAoZnJvbUdpdCkgcmV0dXJuIGZyb21HaXQ7XG5cbiAgcmV0dXJuIGJhc2VuYW1lKHJvb3REaXIpO1xufVxuXG4vKipcbiAqIFRoZSBHaXRIdWIgQ0xJJ3MgY2Fub25pY2FsIHJlcG8gVVJMIC0gdGhlIGVhc3kgcGF0aC4gYGdoYCBhbHJlYWR5IHJlc29sdmVzIHRoZVxuICogdHJ1ZSBob3N0IChubyBzc2gtYWxpYXMgcGFyc2luZykgYW5kIHByaW50cyBhIGNsZWFuIGBodHRwczovL2hvc3Qvb3duZXIvcmVwb2AuXG4gKiBgdW5kZWZpbmVkYCB3aGVuIGBnaGAgaXMgYWJzZW50LCB1bmF1dGhlbnRpY2F0ZWQsIG9yIHRoZSBkaXIgaXNuJ3QgYSBHSCByZXBvLlxuICovXG5mdW5jdGlvbiByZXBvc2l0b3J5VXJsRnJvbUdoKGN3ZD86IHN0cmluZyk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IG91dCA9IHByb2plY3RDb250ZXh0Q29tbWFuZChcImdoXCIsIFtcInJlcG9cIiwgXCJ2aWV3XCIsIFwiLS1qc29uXCIsIFwidXJsXCJdLCBjd2QpLm91dHB1dDtcbiAgcmV0dXJuIHN0cmluZ1V0aWxzLnRyaW1Ub051bGwoanNvbi5wYXJzZVJlY29yZChvdXQpPy51cmwpID8/IHVuZGVmaW5lZDtcbn1cblxuLyoqIFJlc29sdmUgYW4gc3NoIGhvc3QgYWxpYXMgKGB+Ly5zc2gvY29uZmlnYCkgdG8gaXRzIGVmZmVjdGl2ZSBgaG9zdG5hbWVgIHZpYSBgc3NoIC1HYC4gKi9cbmZ1bmN0aW9uIHJlc29sdmVTc2hIb3N0TmFtZShob3N0OiBzdHJpbmcsIGN3ZD86IHN0cmluZyk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IGxpbmUgPSBwcm9qZWN0Q29udGV4dENvbW1hbmQoXCJzc2hcIiwgW1wiLUdcIiwgaG9zdF0sIGN3ZClcbiAgICAub3V0cHV0Py5zcGxpdChcIlxcblwiKVxuICAgIC5maW5kKChsKSA9PiAvXmhvc3RuYW1lXFxzL2kudGVzdChsLnRyaW0oKSkpO1xuICBjb25zdCBuYW1lID0gbGluZT8udHJpbSgpLnNwbGl0KC9cXHMrLylbMV07XG4gIHJldHVybiBuYW1lICYmIG5hbWUgIT09IGhvc3QgPyBuYW1lIDogdW5kZWZpbmVkO1xufVxuXG4vKipcbiAqIEZhbGxiYWNrOiBub3JtYWxpemUgYGdpdCByZW1vdGUgZ2V0LXVybCBvcmlnaW5gIHRvIGEgcGxhaW5cbiAqIGBodHRwczovL2hvc3Qvb3duZXIvcmVwb2AgVVJMLiBzY3AtbGlrZSAvIGBzc2g6Ly9gIC8gYGdpdDovL2AgL1xuICogZW1iZWRkZWQtY3JlZGVudGlhbCBmb3JtcyBhcmUgcmV3cml0dGVuIHRvIGh0dHBzLCBhbmQgYW4gc3NoIGhvc3QgYWxpYXMgaXNcbiAqIGZvbGxvd2VkIHRvIGl0cyByZWFsIGhvc3RuYW1lLlxuICovXG5mdW5jdGlvbiByZXBvc2l0b3J5VXJsRnJvbUdpdChjd2Q/OiBzdHJpbmcpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICBjb25zdCByYXcgPSBwcm9qZWN0Q29udGV4dENvbW1hbmQoXCJnaXRcIiwgW1wicmVtb3RlXCIsIFwiZ2V0LXVybFwiLCBcIm9yaWdpblwiXSwgY3dkKS5vdXRwdXQ7XG4gIGlmICghcmF3KSByZXR1cm4gdW5kZWZpbmVkO1xuXG4gIC8vIE5vcm1hbGl6ZSB0aGUgc2NoZW1lIHRvIGh0dHBzIGF0IHRoZSBzdHJpbmcgbGV2ZWwgZmlyc3Q6IHRoZSBXSEFUV0cgYFVSTGBcbiAgLy8gcGFyc2VyIGNhbid0IGNvbnZlcnQgYSBub24tc3BlY2lhbCBzY2hlbWUgKGBzc2hgL2BnaXRgKSB0byBgaHR0cHNgICh0aGVcbiAgLy8gYHByb3RvY29sYCBzZXR0ZXIgbm8tb3BzKSwgYW5kIHNjcC1saWtlIGBnaXRAaG9zdDpvd25lci9yZXBvYCBpc24ndCBhIFVSTCBhdFxuICAvLyBhbGwuIFJld3JpdGUgYm90aCBpbnRvIGFuIGBodHRwczovL2Agc3RyaW5nLCB0aGVuIGxldCB7QGxpbmsgbmV0LnVybEJ1aWxkZXJ9XG4gIC8vIG93biB0aGUgc3RydWN0dXJlZCBlZGl0cyAoc3RyaXAgY3JlZGVudGlhbHMsIHN3YXAgdGhlIGhvc3QpLlxuICBsZXQgaHR0cHMgPSByYXcucmVwbGFjZSgvXmdpdFxcKy8sIFwiXCIpO1xuICBjb25zdCBzY3AgPSAvXlteQF0rQChbXjpdKyk6KC4rKSQvLmV4ZWMoaHR0cHMpO1xuICBpZiAoc2NwKSBodHRwcyA9IGBodHRwczovLyR7c2NwWzFdfS8ke3NjcFsyXX1gO1xuICBodHRwcyA9IGh0dHBzLnJlcGxhY2UoL14oc3NofGdpdCk6XFwvXFwvLywgXCJodHRwczovL1wiKTtcblxuICBsZXQgYnVpbGRlciA9IG5ldC51cmxCdWlsZGVyKGh0dHBzKTtcbiAgaWYgKCFidWlsZGVyKSByZXR1cm4gdW5kZWZpbmVkO1xuICAvLyBEcm9wIGFueSBlbWJlZGRlZCBgdXNlcls6cGFzc11AYCBjcmVkZW50aWFscy5cbiAgaWYgKGJ1aWxkZXIudXNlcm5hbWUgfHwgYnVpbGRlci5wYXNzd29yZCkge1xuICAgIGJ1aWxkZXIgPSBidWlsZGVyLndpdGgoXCJ1c2VybmFtZVwiLCBcIlwiKS53aXRoKFwicGFzc3dvcmRcIiwgXCJcIik7XG4gIH1cbiAgLy8gRm9sbG93IGFuIHNzaCBob3N0IGFsaWFzIHRvIHRoZSB0cnVlIGhvc3QgKHNvIGBnaXRodWItcmVnZ2llLWRiYCAtPiBgZ2l0aHViLmNvbWApLlxuICBjb25zdCByZWFsSG9zdCA9IHJlc29sdmVTc2hIb3N0TmFtZShidWlsZGVyLmhvc3RuYW1lLCBjd2QpO1xuICBpZiAocmVhbEhvc3QpIGJ1aWxkZXIgPSBidWlsZGVyLndpdGgoXCJob3N0bmFtZVwiLCByZWFsSG9zdCk7XG5cbiAgcmV0dXJuIGAke2J1aWxkZXIub3JpZ2lufSR7YnVpbGRlci5wYXRobmFtZS5yZXBsYWNlKC9cXC5naXQkLywgXCJcIil9YDtcbn1cblxuLyoqXG4gKiBUaGUgcmVwbydzIGNhbm9uaWNhbCByZW1vdGUgVVJMLCBvciBgdW5kZWZpbmVkYCB3aGVuIHRoZXJlIGlzIG5vIGdpdCByZW1vdGUuXG4gKiBUcmllcyBgZ2ggcmVwbyB2aWV3YCBmaXJzdCAoaG9zdC1hY2N1cmF0ZSwgbm8gcGFyc2luZyksIHRoZW4gbm9ybWFsaXplc1xuICogYGdpdCByZW1vdGUgZ2V0LXVybCBvcmlnaW5gLiBBIGJsYW5rLCBvbWl0dGVkLCBvciBleHBsaWNpdGx5IGN1cnJlbnQgYGN3ZGBcbiAqIHJldXNlcyBjYWNoZWQgY29tbWFuZCBwcm9iZXM7IGFub3RoZXIgcmVzb2x2ZWQgZGlyZWN0b3J5IGV4ZWN1dGVzIGRpcmVjdGx5LlxuICpcbiAqIEBwYXJhbSBjd2QgLSBkaXJlY3RvcnkgdG8gcmVzb2x2ZSBmcm9tIChkZWZhdWx0cyB0byBgcHJvY2Vzcy5jd2QoKWApLlxuICogQHBhcmFtIGZvcm1hdCAtIGBcImh0dHBzXCJgIChkZWZhdWx0KSB5aWVsZHMgYGh0dHBzOi8vaG9zdC9vd25lci9yZXBvYDtcbiAqICAgYFwibnBtXCJgIHlpZWxkcyBucG0ncyBgZ2l0K2h0dHBzOi8vaG9zdC9vd25lci9yZXBvLmdpdGAgZm9ybSAoZm9yIGFcbiAqICAgYHBhY2thZ2UuanNvbmAgYHJlcG9zaXRvcnkudXJsYCB0aGF0IHBhc3NlcyBucG0gcHJvdmVuYW5jZSkuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZXBvc2l0b3J5VXJsKGN3ZD86IHN0cmluZywgZm9ybWF0OiBcImh0dHBzXCIgfCBcIm5wbVwiID0gXCJodHRwc1wiKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgY29uc3QgcmVzb2x2ZWQgPSByZXNvbHZlV29ya2luZ0RpcmVjdG9yeShjd2QpO1xuICBjb25zdCBodHRwcyA9IHJlcG9zaXRvcnlVcmxGcm9tR2gocmVzb2x2ZWQpID8/IHJlcG9zaXRvcnlVcmxGcm9tR2l0KHJlc29sdmVkKTtcbiAgaWYgKCFodHRwcykgcmV0dXJuIHVuZGVmaW5lZDtcbiAgcmV0dXJuIGZvcm1hdCA9PT0gXCJucG1cIiA/IGBnaXQrJHtodHRwcy5yZXBsYWNlKC9cXC5naXQkLywgXCJcIil9LmdpdGAgOiBodHRwcztcbn1cblxuLyoqIFB1YmxpYyBucG0sIHVzZWQgb25seSBhZnRlciBlbnYsIG5wbXJjLCBidW5maWcsIGFuZCBwbnBtIHlhbWwgbWlzcy4gKi9cbmNvbnN0IERFRkFVTFRfTlBNX1JFR0lTVFJZID0gXCJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9cIjtcblxuLyoqIElucHV0cyB0aGF0IGNvbnRyb2wgYWN0aXZlIG5wbSByZWdpc3RyeSBkaXNjb3ZlcnkuICovXG5leHBvcnQgdHlwZSBOcG1SZWdpc3RyeU9wdGlvbnMgPSB7XG4gIC8qKiBTa2lwIHB1YmxpYyBucG1qcy5vcmcgc28gY2FsbGVycyBjYW4gZGV0ZWN0IGEgY29uZmlndXJlZCBvdmVycmlkZS4gKi9cbiAgb3ZlcnJpZGVPbmx5PzogYm9vbGVhbjtcbiAgLyoqXG4gICAqIFJlYWQgYG5wbV9jb25maWdfcmVnaXN0cnlgLCBgTlBNX0NPTkZJR19SRUdJU1RSWWAsIGFuZCBgQlVOX0NPTkZJR19SRUdJU1RSWWBcbiAgICogZmlyc3QuIERlZmF1bHRzIHRvIHRydWUgc28gdGhlIHNhbWUgY2FzY2FkZSBhIHBhY2thZ2UgbWFuYWdlciB1c2VzIGlzIHRoZVxuICAgKiBkZWZhdWx0LlxuICAgKi9cbiAgZW52VmFycz86IGJvb2xlYW47XG59O1xuXG5jb25zdCBucG1SZWdpc3RyeUNhY2hlID0gbmV3IE1hcDxzdHJpbmcsIG5ldC5VcmxCdWlsZGVyIHwgdW5kZWZpbmVkPigpO1xuXG4vKipcbiAqIFRoZSBhY3RpdmUgbnBtIHJlZ2lzdHJ5IGFzIGEgY2hhaW5hYmxlIHtAbGluayBuZXQuVXJsQnVpbGRlcn0uXG4gKlxuICogUmVzb2x1dGlvbiBpcyBtYW5hZ2VyLWFnbm9zdGljIGFuZCBtZW1vaXplZCBwZXIgY3dkIHBsdXMgb3B0aW9uczogZW52aXJvbm1lbnRcbiAqIHZhcmlhYmxlcywgdGhlbiBgLm5wbXJjYCAocHJvamVjdCBhbmNlc3RvcnMsIHVzZXIsIGdsb2JhbCksIHRoZW4gQnVuXG4gKiBgYnVuZmlnLnRvbWxgIGBpbnN0YWxsLnJlZ2lzdHJ5YCwgdGhlbiBwbnBtIHdvcmtzcGFjZS9nbG9iYWwgWUFNTCwgdGhlblxuICogYGh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2AuIGBvdmVycmlkZU9ubHlgIHNraXBzIHRoYXQgcHVibGljIGRlZmF1bHQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBucG1SZWdpc3RyeShcbiAgY3dkPzogc3RyaW5nIHwgbnVsbCxcbiAgb3B0aW9ucz86IE5wbVJlZ2lzdHJ5T3B0aW9ucyxcbik6IG5ldC5VcmxCdWlsZGVyIHwgdW5kZWZpbmVkIHtcbiAgY29uc3QgcmVzb2x2ZWQgPSByZXNvbHZlV29ya2luZ0RpcmVjdG9yeShjd2QpO1xuICBjb25zdCBlbnZWYXJzID0gb3B0aW9ucz8uZW52VmFycyAhPT0gZmFsc2U7XG4gIGNvbnN0IG92ZXJyaWRlT25seSA9IEJvb2xlYW4ob3B0aW9ucz8ub3ZlcnJpZGVPbmx5KTtcbiAgY29uc3Qga2V5ID0gSlNPTi5zdHJpbmdpZnkoW1xuICAgIHJlc29sdmVkLFxuICAgIG92ZXJyaWRlT25seSxcbiAgICBlbnZWYXJzLFxuICAgIGhvbWVkaXIoKSxcbiAgICBwcm9jZXNzLmVudi5OUE1fQ09ORklHX1VTRVJDT05GSUcgPz8gXCJcIixcbiAgICBwcm9jZXNzLmVudi5OUE1fQ09ORklHX0dMT0JBTENPTkZJRyA/PyBcIlwiLFxuICAgIHByb2Nlc3MuZW52LlBSRUZJWCA/PyBcIlwiLFxuICAgIGVudlZhcnMgPyAocHJvY2Vzcy5lbnYubnBtX2NvbmZpZ19yZWdpc3RyeSA/PyBcIlwiKSA6IFwiXCIsXG4gICAgZW52VmFycyA/IChwcm9jZXNzLmVudi5OUE1fQ09ORklHX1JFR0lTVFJZID8/IFwiXCIpIDogXCJcIixcbiAgICBlbnZWYXJzID8gKHByb2Nlc3MuZW52LkJVTl9DT05GSUdfUkVHSVNUUlkgPz8gXCJcIikgOiBcIlwiLFxuICBdKTtcbiAgaWYgKG5wbVJlZ2lzdHJ5Q2FjaGUuaGFzKGtleSkpIHJldHVybiBucG1SZWdpc3RyeUNhY2hlLmdldChrZXkpO1xuICBjb25zdCB2YWx1ZSA9IHJlc29sdmVOcG1SZWdpc3RyeShyZXNvbHZlZCwgeyBvdmVycmlkZU9ubHksIGVudlZhcnMgfSk7XG4gIG5wbVJlZ2lzdHJ5Q2FjaGUuc2V0KGtleSwgdmFsdWUpO1xuICByZXR1cm4gdmFsdWU7XG59XG5cbmZ1bmN0aW9uIHJlc29sdmVOcG1SZWdpc3RyeShcbiAgY3dkOiBzdHJpbmcsXG4gIG9wdGlvbnM6IHsgb3ZlcnJpZGVPbmx5OiBib29sZWFuOyBlbnZWYXJzOiBib29sZWFuIH0sXG4pOiBuZXQuVXJsQnVpbGRlciB8IHVuZGVmaW5lZCB7XG4gIGZvciAoY29uc3QgY2FuZGlkYXRlIG9mIG5wbVJlZ2lzdHJ5Q2FuZGlkYXRlcyhjd2QsIG9wdGlvbnMuZW52VmFycykpIHtcbiAgICBjb25zdCB1cmwgPSB0b1JlZ2lzdHJ5VXJsKGNhbmRpZGF0ZSwgb3B0aW9ucy5vdmVycmlkZU9ubHkpO1xuICAgIGlmICh1cmwpIHJldHVybiB1cmw7XG4gIH1cbiAgcmV0dXJuIHRvUmVnaXN0cnlVcmwoREVGQVVMVF9OUE1fUkVHSVNUUlksIG9wdGlvbnMub3ZlcnJpZGVPbmx5KTtcbn1cblxuZnVuY3Rpb24qIG5wbVJlZ2lzdHJ5Q2FuZGlkYXRlcyhjd2Q6IHN0cmluZywgZW52VmFyczogYm9vbGVhbik6IEdlbmVyYXRvcjxzdHJpbmcgfCB1bmRlZmluZWQ+IHtcbiAgaWYgKGVudlZhcnMpIHtcbiAgICB5aWVsZCBwcm9jZXNzLmVudi5ucG1fY29uZmlnX3JlZ2lzdHJ5O1xuICAgIHlpZWxkIHByb2Nlc3MuZW52Lk5QTV9DT05GSUdfUkVHSVNUUlk7XG4gICAgeWllbGQgcHJvY2Vzcy5lbnYuQlVOX0NPTkZJR19SRUdJU1RSWTtcbiAgfVxuICBmb3IgKGNvbnN0IGRpciBvZiBhbmNlc3RvckRpcnMoY3dkKSkge1xuICAgIHlpZWxkIHJlYWROcG1yY1JlZ2lzdHJ5KGpvaW4oZGlyLCBcIi5ucG1yY1wiKSk7XG4gIH1cbiAgeWllbGQgcmVhZE5wbXJjUmVnaXN0cnkocHJvY2Vzcy5lbnYuTlBNX0NPTkZJR19VU0VSQ09ORklHID8/IGpvaW4oaG9tZWRpcigpLCBcIi5ucG1yY1wiKSk7XG4gIHlpZWxkIHJlYWROcG1yY1JlZ2lzdHJ5KHByb2Nlc3MuZW52Lk5QTV9DT05GSUdfR0xPQkFMQ09ORklHID8/IGRlZmF1bHRHbG9iYWxOcG1yYygpKTtcbiAgZm9yIChjb25zdCBkaXIgb2YgYW5jZXN0b3JEaXJzKGN3ZCkpIHtcbiAgICB5aWVsZCByZWFkQnVuZmlnUmVnaXN0cnkoam9pbihkaXIsIFwiYnVuZmlnLnRvbWxcIikpO1xuICB9XG4gIHlpZWxkIHJlYWRCdW5maWdSZWdpc3RyeShqb2luKGhvbWVkaXIoKSwgXCJidW5maWcudG9tbFwiKSk7XG4gIGZvciAoY29uc3QgZGlyIG9mIGFuY2VzdG9yRGlycyhjd2QpKSB7XG4gICAgeWllbGQgcmVhZFlhbWxSZWdpc3RyeShqb2luKGRpciwgXCJwbnBtLXdvcmtzcGFjZS55YW1sXCIpKTtcbiAgfVxuICBmb3IgKGNvbnN0IHBhdGggb2YgcG5wbUdsb2JhbENvbmZpZ1BhdGhzKCkpIHtcbiAgICB5aWVsZCByZWFkWWFtbFJlZ2lzdHJ5KHBhdGgpO1xuICB9XG59XG5cbmZ1bmN0aW9uIHRvUmVnaXN0cnlVcmwoXG4gIGNhbmRpZGF0ZTogc3RyaW5nIHwgdW5kZWZpbmVkLFxuICBvdmVycmlkZU9ubHk6IGJvb2xlYW4sXG4pOiBuZXQuVXJsQnVpbGRlciB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IHRyaW1tZWQgPSBzdHJpbmdVdGlscy50cmltVG9OdWxsKGNhbmRpZGF0ZSk7XG4gIGlmICghdHJpbW1lZCkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgY29uc3QgdXJsID0gbmV0LnVybEJ1aWxkZXIodHJpbW1lZCk7XG4gIGlmICghdXJsKSByZXR1cm4gdW5kZWZpbmVkO1xuICBpZiAob3ZlcnJpZGVPbmx5ICYmIGlzUHVibGljTnBtUmVnaXN0cnkodXJsKSkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgcmV0dXJuIHVybDtcbn1cblxuZnVuY3Rpb24gaXNQdWJsaWNOcG1SZWdpc3RyeSh1cmw6IG5ldC5VcmxCdWlsZGVyKTogYm9vbGVhbiB7XG4gIHJldHVybiB1cmwuaG9zdG5hbWUgPT09IFwicmVnaXN0cnkubnBtanMub3JnXCI7XG59XG5cbmZ1bmN0aW9uKiBhbmNlc3RvckRpcnMoY3dkOiBzdHJpbmcpOiBHZW5lcmF0b3I8c3RyaW5nPiB7XG4gIGxldCBjdXJyZW50ID0gY3dkO1xuICB3aGlsZSAodHJ1ZSkge1xuICAgIHlpZWxkIGN1cnJlbnQ7XG4gICAgY29uc3QgcGFyZW50ID0gZGlybmFtZShjdXJyZW50KTtcbiAgICBpZiAocGFyZW50ID09PSBjdXJyZW50KSByZXR1cm47XG4gICAgY3VycmVudCA9IHBhcmVudDtcbiAgfVxufVxuXG5mdW5jdGlvbiBkZWZhdWx0R2xvYmFsTnBtcmMoKTogc3RyaW5nIHtcbiAgaWYgKHByb2Nlc3MucGxhdGZvcm0gPT09IFwid2luMzJcIikge1xuICAgIHJldHVybiBqb2luKHByb2Nlc3MuZW52LlBST0dSQU1EQVRBID8/IFwiQzpcXFxcUHJvZ3JhbURhdGFcIiwgXCJucG1cIiwgXCJldGNcIiwgXCJucG1yY1wiKTtcbiAgfVxuICByZXR1cm4gam9pbihwcm9jZXNzLmVudi5QUkVGSVggPz8gXCIvdXNyL2xvY2FsXCIsIFwiZXRjXCIsIFwibnBtcmNcIik7XG59XG5cbmZ1bmN0aW9uIHBucG1HbG9iYWxDb25maWdQYXRocygpOiBzdHJpbmdbXSB7XG4gIGNvbnN0IGhvbWUgPSBob21lZGlyKCk7XG4gIGlmIChwcm9jZXNzLnBsYXRmb3JtID09PSBcImRhcndpblwiKSB7XG4gICAgcmV0dXJuIFtqb2luKGhvbWUsIFwiTGlicmFyeS9QcmVmZXJlbmNlcy9wbnBtL2NvbmZpZy55YW1sXCIpXTtcbiAgfVxuICBpZiAocHJvY2Vzcy5wbGF0Zm9ybSA9PT0gXCJ3aW4zMlwiKSB7XG4gICAgcmV0dXJuIFtqb2luKHByb2Nlc3MuZW52LkxPQ0FMQVBQREFUQSA/PyBqb2luKGhvbWUsIFwiQXBwRGF0YS9Mb2NhbFwiKSwgXCJwbnBtL2NvbmZpZy55YW1sXCIpXTtcbiAgfVxuICByZXR1cm4gW2pvaW4oaG9tZSwgXCIuY29uZmlnL3BucG0vY29uZmlnLnlhbWxcIildO1xufVxuXG5mdW5jdGlvbiByZWFkTnBtcmNSZWdpc3RyeShwYXRoOiBzdHJpbmcpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICByZXR1cm4gY2FjaGVkUmVjb3JkKGBucG1yYy1yZWdpc3RyeToke3BhdGh9YCwgKCkgPT4ge1xuICAgIGNvbnN0IHRleHQgPSByZWFkVGV4dEZpbGUocGF0aCk7XG4gICAgY29uc3QgcmVnaXN0cnkgPSB0ZXh0ID8gcGFyc2VJbmlSZWdpc3RyeSh0ZXh0KSA6IHVuZGVmaW5lZDtcbiAgICByZXR1cm4gcmVnaXN0cnkgPyB7IHJlZ2lzdHJ5IH0gOiB1bmRlZmluZWQ7XG4gIH0pPy5yZWdpc3RyeTtcbn1cblxuZnVuY3Rpb24gcmVhZEJ1bmZpZ1JlZ2lzdHJ5KHBhdGg6IHN0cmluZyk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIHJldHVybiBjYWNoZWRSZWNvcmQoYGJ1bmZpZy1yZWdpc3RyeToke3BhdGh9YCwgKCkgPT4ge1xuICAgIGNvbnN0IHRleHQgPSByZWFkVGV4dEZpbGUocGF0aCk7XG4gICAgY29uc3QgcmVnaXN0cnkgPSB0ZXh0ID8gcGFyc2VCdW5maWdSZWdpc3RyeSh0ZXh0KSA6IHVuZGVmaW5lZDtcbiAgICByZXR1cm4gcmVnaXN0cnkgPyB7IHJlZ2lzdHJ5IH0gOiB1bmRlZmluZWQ7XG4gIH0pPy5yZWdpc3RyeTtcbn1cblxuZnVuY3Rpb24gcmVhZFlhbWxSZWdpc3RyeShwYXRoOiBzdHJpbmcpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICByZXR1cm4gY2FjaGVkUmVjb3JkKGB5YW1sLXJlZ2lzdHJ5OiR7cGF0aH1gLCAoKSA9PiB7XG4gICAgY29uc3QgdGV4dCA9IHJlYWRUZXh0RmlsZShwYXRoKTtcbiAgICBpZiAoIXRleHQpIHJldHVybiB1bmRlZmluZWQ7XG4gICAgY29uc3QgcGFyc2VkID0gcGFyc2VZYW1sKHRleHQpO1xuICAgIGlmICghb2JqZWN0LmlzUmVjb3JkKHBhcnNlZCkpIHJldHVybiB1bmRlZmluZWQ7XG4gICAgY29uc3QgcmVnaXN0cnkgPSB5YW1sUmVnaXN0cnkocGFyc2VkKTtcbiAgICByZXR1cm4gcmVnaXN0cnkgPyB7IHJlZ2lzdHJ5IH0gOiB1bmRlZmluZWQ7XG4gIH0pPy5yZWdpc3RyeTtcbn1cblxuZnVuY3Rpb24gcmVhZFRleHRGaWxlKHBhdGg6IHN0cmluZyk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIGlmICghZmlsZVN0YXRTeW5jKHBhdGgpPy5pc0ZpbGUoKSkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgcmV0dXJuIHJlYWRGaWxlU3luYyhwYXRoLCBcInV0ZjhcIik7XG59XG5cbi8qKiBQYXJzZSBhIGByZWdpc3RyeT1gIGFzc2lnbm1lbnQgZnJvbSBucG1yYyAvIGluaSB0ZXh0LiAqL1xuZnVuY3Rpb24gcGFyc2VJbmlSZWdpc3RyeSh0ZXh0OiBzdHJpbmcpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICBmb3IgKGNvbnN0IHJhdyBvZiB0ZXh0LnNwbGl0KC9cXHI/XFxuLykpIHtcbiAgICBjb25zdCBsaW5lID0gcmF3LnRyaW0oKTtcbiAgICBpZiAoIWxpbmUgfHwgbGluZS5zdGFydHNXaXRoKFwiI1wiKSB8fCBsaW5lLnN0YXJ0c1dpdGgoXCI7XCIpKSBjb250aW51ZTtcbiAgICBjb25zdCBlcSA9IGxpbmUuaW5kZXhPZihcIj1cIik7XG4gICAgaWYgKGVxID09PSAtMSkgY29udGludWU7XG4gICAgaWYgKGxpbmUuc2xpY2UoMCwgZXEpLnRyaW0oKSAhPT0gXCJyZWdpc3RyeVwiKSBjb250aW51ZTtcbiAgICByZXR1cm4gdW5xdW90ZUluaVZhbHVlKGxpbmUuc2xpY2UoZXEgKyAxKSk7XG4gIH1cbiAgcmV0dXJuIHVuZGVmaW5lZDtcbn1cblxuLyoqXG4gKiBSZWFkIEJ1biBgaW5zdGFsbC5yZWdpc3RyeWAgZnJvbSBhIGJ1bmZpZy50b21sLiBUYWJsZSBmb3JtXG4gKiBgW2luc3RhbGwucmVnaXN0cnldYCB3aXRoIGB1cmwgPSBcIi4uLlwiYCBpcyBhY2NlcHRlZDsgc2NvcGVkIG1hcHMgYXJlIGlnbm9yZWQuXG4gKi9cbmZ1bmN0aW9uIHBhcnNlQnVuZmlnUmVnaXN0cnkodGV4dDogc3RyaW5nKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgbGV0IHNlY3Rpb24gPSBcIlwiO1xuICBmb3IgKGNvbnN0IHJhdyBvZiB0ZXh0LnNwbGl0KC9cXHI/XFxuLykpIHtcbiAgICBjb25zdCBsaW5lID0gc3RyaXBUb21sQ29tbWVudChyYXcpLnRyaW0oKTtcbiAgICBpZiAoIWxpbmUpIGNvbnRpbnVlO1xuICAgIGNvbnN0IGhlYWRlciA9IC9eXFxbKFteXFxdXSspXFxdJC8uZXhlYyhsaW5lKTtcbiAgICBpZiAoaGVhZGVyKSB7XG4gICAgICBzZWN0aW9uID0gaGVhZGVyWzFdIS50cmltKCk7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgY29uc3QgZXEgPSBsaW5lLmluZGV4T2YoXCI9XCIpO1xuICAgIGlmIChlcSA9PT0gLTEpIGNvbnRpbnVlO1xuICAgIGNvbnN0IGtleSA9IGxpbmUuc2xpY2UoMCwgZXEpLnRyaW0oKTtcbiAgICBjb25zdCB2YWx1ZSA9IHVucXVvdGVJbmlWYWx1ZShsaW5lLnNsaWNlKGVxICsgMSkpO1xuICAgIGlmIChzZWN0aW9uID09PSBcImluc3RhbGxcIiAmJiBrZXkgPT09IFwicmVnaXN0cnlcIiAmJiAhdmFsdWUuc3RhcnRzV2l0aChcIntcIikpIHJldHVybiB2YWx1ZTtcbiAgICBpZiAoc2VjdGlvbiA9PT0gXCJpbnN0YWxsLnJlZ2lzdHJ5XCIgJiYga2V5ID09PSBcInVybFwiKSByZXR1cm4gdmFsdWU7XG4gICAgaWYgKCFzZWN0aW9uICYmIGtleSA9PT0gXCJpbnN0YWxsLnJlZ2lzdHJ5XCIpIHJldHVybiB2YWx1ZTtcbiAgfVxuICByZXR1cm4gdW5kZWZpbmVkO1xufVxuXG5mdW5jdGlvbiB5YW1sUmVnaXN0cnkoZGF0YTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4pOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICBpZiAodHlwZW9mIGRhdGEucmVnaXN0cnkgPT09IFwic3RyaW5nXCIpIHJldHVybiBkYXRhLnJlZ2lzdHJ5O1xuICBjb25zdCByZWdpc3RyaWVzID0gZGF0YS5yZWdpc3RyaWVzO1xuICBpZiAob2JqZWN0LmlzUmVjb3JkKHJlZ2lzdHJpZXMpICYmIHR5cGVvZiByZWdpc3RyaWVzLmRlZmF1bHQgPT09IFwic3RyaW5nXCIpIHtcbiAgICByZXR1cm4gcmVnaXN0cmllcy5kZWZhdWx0O1xuICB9XG4gIHJldHVybiB1bmRlZmluZWQ7XG59XG5cbmZ1bmN0aW9uIHVucXVvdGVJbmlWYWx1ZSh2YWx1ZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgY29uc3QgdHJpbW1lZCA9IHZhbHVlLnRyaW0oKTtcbiAgY29uc3QgY29tbWVudCA9IHRyaW1tZWQuc2VhcmNoKC9cXHMrIy8pO1xuICBjb25zdCByYXcgPSBjb21tZW50ID09PSAtMSA/IHRyaW1tZWQgOiB0cmltbWVkLnNsaWNlKDAsIGNvbW1lbnQpLnRyaW0oKTtcbiAgaWYgKChyYXcuc3RhcnRzV2l0aCgnXCInKSAmJiByYXcuZW5kc1dpdGgoJ1wiJykpIHx8IChyYXcuc3RhcnRzV2l0aChcIidcIikgJiYgcmF3LmVuZHNXaXRoKFwiJ1wiKSkpIHtcbiAgICByZXR1cm4gcmF3LnNsaWNlKDEsIC0xKTtcbiAgfVxuICByZXR1cm4gcmF3O1xufVxuXG5mdW5jdGlvbiBzdHJpcFRvbWxDb21tZW50KGxpbmU6IHN0cmluZyk6IHN0cmluZyB7XG4gIGNvbnN0IGhhc2ggPSBsaW5lLmluZGV4T2YoXCIjXCIpO1xuICByZXR1cm4gaGFzaCA9PT0gLTEgPyBsaW5lIDogbGluZS5zbGljZSgwLCBoYXNoKTtcbn1cblxuZnVuY3Rpb24gcmVhZFBhY2thZ2VOYW1lKHBrZ1BhdGg6IHN0cmluZyk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIGlmICghZmlsZVN0YXRTeW5jKHBrZ1BhdGgpPy5pc0ZpbGUoKSkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgcmV0dXJuIHN0cmluZ1V0aWxzLnRyaW1Ub051bGwoanNvbi5wYXJzZVJlY29yZChyZWFkRmlsZVN5bmMocGtnUGF0aCwgXCJ1dGY4XCIpKT8ubmFtZSkgPz8gdW5kZWZpbmVkO1xufVxuXG5pZiAoaW1wb3J0Lm1ldGEubWFpbikge1xuICBjb25zb2xlLmxvZyhcIm5wbSByb290OlwiLCBucG1Sb290KCkpO1xuICBjb25zb2xlLmxvZyhcInJlcG8gcm9vdDpcIiwgZ2l0Um9vdCgpKTtcbiAgY29uc29sZS5sb2coXCJwYWNrYWdlIHJvb3Q6XCIsIHJvb3QoKSk7XG4gIGNvbnNvbGUubG9nKFwicHJvamVjdCBuYW1lOlwiLCBuYW1lKCkpO1xuICBjb25zb2xlLmxvZyhcInJlcG9zaXRvcnkgdXJsOlwiLCByZXBvc2l0b3J5VXJsKCkpO1xuICBjb25zb2xlLmxvZyhcInJlcG9zaXRvcnkgdXJsIChucG0pOlwiLCByZXBvc2l0b3J5VXJsKHVuZGVmaW5lZCwgXCJucG1cIikpO1xufVxuIl19
|
package/lib/tsconfig.tsbuildinfo
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"root":["../src/bin.ts","../src/brand-files.ts","../src/bundle.ts","../src/config-utils.ts","../src/exec.ts","../src/file-lock.ts","../src/file.ts","../src/process-lock.ts","../src/project-utils.ts","../index.ts"],"version":"5.9.3"}
|
|
1
|
+
{"root":["../src/bin.ts","../src/brand-files.ts","../src/bundle.ts","../src/config-utils.ts","../src/dependency-resolver.ts","../src/exec.ts","../src/file-lock.ts","../src/file.ts","../src/process-lock.ts","../src/project-utils.ts","../index.ts"],"version":"5.9.3"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@dbx-tools/core",
|
|
3
|
-
"description": "Node helpers for layered configuration, binary installation, process execution, locking, and
|
|
3
|
+
"description": "Node helpers for layered configuration, binary installation, process execution, locking, project discovery, and npm dependency resolution",
|
|
4
4
|
"repository": {
|
|
5
5
|
"type": "git",
|
|
6
6
|
"url": "git+https://github.com/reggie-db/dbx-tools.git",
|
|
@@ -22,13 +22,15 @@
|
|
|
22
22
|
"@types/bun": "1.3.14",
|
|
23
23
|
"@types/node": "^24.6.0",
|
|
24
24
|
"@types/proper-lockfile": "^4.1.4",
|
|
25
|
+
"@types/semver": "^7.7.1",
|
|
25
26
|
"typescript": "^5.9.3"
|
|
26
27
|
},
|
|
27
28
|
"dependencies": {
|
|
28
|
-
"@dbx-tools/core-rs": "^0.9.
|
|
29
|
-
"@dbx-tools/shared-core": "^0.9.
|
|
29
|
+
"@dbx-tools/core-rs": "^0.9.17",
|
|
30
|
+
"@dbx-tools/shared-core": "^0.9.17",
|
|
30
31
|
"extract-zip": "^2.0.1",
|
|
31
32
|
"proper-lockfile": "^4.1.2",
|
|
33
|
+
"semver": "^7.7.3",
|
|
32
34
|
"tar": "^7.5.22",
|
|
33
35
|
"yaml": "^2.9.0",
|
|
34
36
|
"zod": "4.3.6"
|
|
@@ -56,6 +58,10 @@
|
|
|
56
58
|
"types": "./lib/src/file-lock.d.ts",
|
|
57
59
|
"default": "./lib/src/file-lock.js"
|
|
58
60
|
},
|
|
61
|
+
"./dependency-resolver": {
|
|
62
|
+
"types": "./lib/src/dependency-resolver.d.ts",
|
|
63
|
+
"default": "./lib/src/dependency-resolver.js"
|
|
64
|
+
},
|
|
59
65
|
"./project-utils": {
|
|
60
66
|
"types": "./lib/src/project-utils.d.ts",
|
|
61
67
|
"default": "./lib/src/project-utils.js"
|
|
@@ -63,7 +69,7 @@
|
|
|
63
69
|
"./package.json": "./package.json"
|
|
64
70
|
}
|
|
65
71
|
},
|
|
66
|
-
"version": "0.9.
|
|
72
|
+
"version": "0.9.17",
|
|
67
73
|
"types": "./lib/index.d.ts",
|
|
68
74
|
"type": "module",
|
|
69
75
|
"exports": {
|
|
@@ -83,6 +89,10 @@
|
|
|
83
89
|
"types": "./lib/src/file-lock.d.ts",
|
|
84
90
|
"default": "./lib/src/file-lock.js"
|
|
85
91
|
},
|
|
92
|
+
"./dependency-resolver": {
|
|
93
|
+
"types": "./lib/src/dependency-resolver.d.ts",
|
|
94
|
+
"default": "./lib/src/dependency-resolver.js"
|
|
95
|
+
},
|
|
86
96
|
"./project-utils": {
|
|
87
97
|
"types": "./lib/src/project-utils.d.ts",
|
|
88
98
|
"default": "./lib/src/project-utils.js"
|