@dbx-tools/appkit-mastra 0.9.5 → 0.9.6

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.
Files changed (49) hide show
  1. package/README.md +16 -18
  2. package/index.ts +1 -3
  3. package/lib/index.d.ts +1 -3
  4. package/lib/index.js +2 -3
  5. package/lib/src/agents.d.ts +2 -2
  6. package/lib/src/agents.js +6 -6
  7. package/lib/src/chart.js +23 -23
  8. package/lib/src/evaluation.js +3 -3
  9. package/lib/src/genie.d.ts +2 -2
  10. package/lib/src/genie.js +20 -20
  11. package/lib/src/memory.js +9 -26
  12. package/lib/src/mlflow.js +4 -4
  13. package/lib/src/model.js +4 -4
  14. package/lib/src/monty-sandbox.js +6 -6
  15. package/lib/src/observability.js +3 -3
  16. package/lib/src/plugin.js +26 -21
  17. package/lib/src/remote-skills.js +20 -30
  18. package/lib/src/sandbox.js +10 -10
  19. package/lib/src/server.js +5 -5
  20. package/lib/src/serving-sanitize.js +12 -9
  21. package/lib/src/serving.js +8 -8
  22. package/lib/src/storage-schema.js +4 -4
  23. package/lib/src/summarize.js +3 -3
  24. package/lib/src/workspaces.js +9 -9
  25. package/lib/src/writer.js +3 -3
  26. package/lib/tsconfig.tsbuildinfo +1 -1
  27. package/package.json +17 -17
  28. package/src/agents.ts +8 -8
  29. package/src/chart.ts +24 -24
  30. package/src/evaluation.ts +2 -2
  31. package/src/genie.ts +20 -20
  32. package/src/memory.ts +11 -27
  33. package/src/mlflow.ts +3 -3
  34. package/src/model.ts +3 -3
  35. package/src/monty-sandbox.ts +5 -5
  36. package/src/observability.ts +2 -2
  37. package/src/plugin.ts +30 -20
  38. package/src/remote-skills.ts +36 -38
  39. package/src/sandbox.ts +9 -9
  40. package/src/server.ts +4 -4
  41. package/src/serving-sanitize.ts +11 -13
  42. package/src/serving.ts +7 -7
  43. package/src/storage-schema.ts +3 -3
  44. package/src/summarize.ts +2 -2
  45. package/src/workspaces.ts +8 -8
  46. package/src/writer.ts +2 -2
  47. package/lib/src/pagination.d.ts +0 -33
  48. package/lib/src/pagination.js +0 -36
  49. package/src/pagination.ts +0 -47
@@ -54,10 +54,10 @@ import { createRequire } from "node:module";
54
54
  import { dirname, join, posix } from "node:path";
55
55
  import { appkit } from "@dbx-tools/appkit";
56
56
  import { exec } from "@dbx-tools/core";
57
- import { DatabricksFileSystem, workspace as databricksWorkspace } from "@dbx-tools/databricks";
57
+ import { DatabricksFileSystem, workspaceClient } from "@dbx-tools/databricks";
58
58
  import { localFS } from "@dbx-tools/fs";
59
59
  import { find } from "@dbx-tools/path";
60
- import { error, hash, json, log, net, object, string } from "@dbx-tools/shared-core";
60
+ import { asyncUtils, errorUtils, hash, json, log, net, object, stringUtils, } from "@dbx-tools/shared-core";
61
61
  import { ASSISTANT_SHARED_SKILLS_PATH, userAssistantSkillsPath } from "./skill-paths.js";
62
62
  const logger = log.logger("mastra/remote-skills");
63
63
  /**
@@ -156,11 +156,11 @@ function isAiToolsSource(source) {
156
156
  * not what a success produces.
157
157
  */
158
158
  function cachePolicy(sourceOptions) {
159
- const skills = string.parseList(sourceOptions.skills);
159
+ const skills = stringUtils.parseList(sourceOptions.skills);
160
160
  const policy = {
161
161
  ...(skills.length > 0 ? { skills: [...skills].sort() } : {}),
162
162
  ...(sourceOptions.experimental === true ? { experimental: true } : {}),
163
- ...(string.trimToNull(sourceOptions.ref) ? { ref: sourceOptions.ref.trim() } : {}),
163
+ ...(stringUtils.trimToNull(sourceOptions.ref) ? { ref: sourceOptions.ref.trim() } : {}),
164
164
  };
165
165
  return Object.keys(policy).length > 0 ? policy : undefined;
166
166
  }
@@ -198,7 +198,7 @@ async function readMetadata(fs) {
198
198
  return object.isRecord(parsed.sources) ? parsed : undefined;
199
199
  }
200
200
  catch (err) {
201
- logger.debug("cache:unreadable", { error: error.errorMessage(err) });
201
+ logger.debug("cache:unreadable", { error: errorUtils.errorMessage(err) });
202
202
  return undefined;
203
203
  }
204
204
  }
@@ -320,11 +320,11 @@ export async function provisionRemoteSkills(option) {
320
320
  }
321
321
  catch (err) {
322
322
  if (failOnError) {
323
- throw new Error(`failed to provision remote skill source "${sourceOptions.source}": ${error.errorMessage(err)}`, { cause: error.toError(err) });
323
+ throw new Error(`failed to provision remote skill source "${sourceOptions.source}": ${errorUtils.errorMessage(err)}`, { cause: errorUtils.toError(err) });
324
324
  }
325
325
  logger.warn("source:skipped", {
326
326
  source: sourceOptions.source,
327
- error: error.errorMessage(err),
327
+ error: errorUtils.errorMessage(err),
328
328
  });
329
329
  }
330
330
  }
@@ -356,7 +356,7 @@ const WRITE_PROBE_FILE = ".dbx-tools-write-probe";
356
356
  */
357
357
  async function openWritableWorkspace(basePath, client) {
358
358
  const fs = new DatabricksFileSystem({
359
- client: databricksWorkspace.toLegacyWorkspaceClient(client),
359
+ client: workspaceClient.toLegacyWorkspaceClient(client),
360
360
  root: basePath,
361
361
  readOnly: false,
362
362
  createRoot: true,
@@ -368,7 +368,7 @@ async function openWritableWorkspace(basePath, client) {
368
368
  catch (err) {
369
369
  logger.warn("destination:unwritable", {
370
370
  destination: basePath,
371
- error: error.errorMessage(err),
371
+ error: errorUtils.errorMessage(err),
372
372
  });
373
373
  return undefined;
374
374
  }
@@ -381,7 +381,7 @@ function resolveDatabricksBasePath(options, client) {
381
381
  return undefined;
382
382
  if (options.databricksBasePath)
383
383
  return options.databricksBasePath.trim() || undefined;
384
- const email = string.trimToNull(options.userEmail);
384
+ const email = stringUtils.trimToNull(options.userEmail);
385
385
  // A named user targets their personal Assistant tree (the "save a skill"
386
386
  // target); otherwise the shared workspace Assistant tree, which the built-in
387
387
  // Assistant-skills mount already scans.
@@ -412,9 +412,9 @@ async function stageSource(sourceOptions, stagingRoot, options) {
412
412
  */
413
413
  async function stageAiTools(sourceOptions, target, options) {
414
414
  const maxBytes = resolveMaxBytes(sourceOptions, options);
415
- const ref = string.trimToNull(sourceOptions.ref) ?? AITOOLS_REF;
415
+ const ref = stringUtils.trimToNull(sourceOptions.ref) ?? AITOOLS_REF;
416
416
  const manifest = json.parse((await download(aiToolsRawUrl(ref, "manifest.json"), maxBytes)).toString("utf8"), undefined);
417
- const wanted = new Set(string.parseList(sourceOptions.skills));
417
+ const wanted = new Set(stringUtils.parseList(sourceOptions.skills));
418
418
  const selected = Object.entries(manifest?.skills ?? {}).filter(([name, entry]) => wanted.size > 0
419
419
  ? wanted.has(name)
420
420
  : entry.repo_dir !== "experimental" || sourceOptions.experimental === true);
@@ -425,11 +425,11 @@ async function stageAiTools(sourceOptions, target, options) {
425
425
  url: aiToolsRawUrl(ref, `${entry.repo_dir ?? "skills"}/${name}/${file}`),
426
426
  path: join(target, name, ...file.split("/")),
427
427
  })));
428
- await mapConcurrent(files, AITOOLS_CONCURRENCY, async (item) => {
428
+ await asyncUtils.mapConcurrent(files, async (item) => {
429
429
  const body = await download(item.url, maxBytes);
430
430
  await mkdir(dirname(item.path), { recursive: true });
431
431
  await writeFile(item.path, body);
432
- });
432
+ }, { concurrency: AITOOLS_CONCURRENCY });
433
433
  logger.debug("aitools:staged", { ref, skills: selected.length, files: files.length });
434
434
  return target;
435
435
  }
@@ -437,16 +437,6 @@ async function stageAiTools(sourceOptions, target, options) {
437
437
  function aiToolsRawUrl(ref, path) {
438
438
  return `https://raw.githubusercontent.com/${AITOOLS_REPO}/${ref}/${path}`;
439
439
  }
440
- /** Run `worker` over `items`, at most `limit` in flight. */
441
- async function mapConcurrent(items, limit, worker) {
442
- let cursor = 0;
443
- const runners = Array.from({ length: Math.min(limit, items.length) }, async () => {
444
- while (cursor < items.length) {
445
- await worker(items[cursor++]);
446
- }
447
- });
448
- await Promise.all(runners);
449
- }
450
440
  /**
451
441
  * Copy a source into `target` with the `skills` CLI when it is installed.
452
442
  * Returns the dir holding the copied `SKILL.md` trees, or `undefined` when the
@@ -465,10 +455,10 @@ async function stageViaSkillsCli(sourceOptions, target) {
465
455
  "--copy",
466
456
  "-y",
467
457
  ];
468
- for (const skill of string.parseList(sourceOptions.skills)) {
458
+ for (const skill of stringUtils.parseList(sourceOptions.skills)) {
469
459
  args.push("--skill", skill);
470
460
  }
471
- if (string.parseList(sourceOptions.skills).length === 0)
461
+ if (stringUtils.parseList(sourceOptions.skills).length === 0)
472
462
  args.push("--skill", "*");
473
463
  const result = await exec.spawn(cli.command, args, {
474
464
  cwd: target,
@@ -509,7 +499,7 @@ async function stageViaFetch(sourceOptions, target, options) {
509
499
  throw new Error(`source "${sourceOptions.source}" is not a URL and the optional "skills" package is not installed`);
510
500
  }
511
501
  const buffer = await download(url.toString(), resolveMaxBytes(sourceOptions, options));
512
- const name = string.toSlug(deriveSkillName(url.toString())) || "remote-skill";
502
+ const name = stringUtils.toSlug(deriveSkillName(url.toString())) || "remote-skill";
513
503
  const skillDir = join(target, name);
514
504
  await mkdir(skillDir, { recursive: true });
515
505
  await writeFile(join(skillDir, "SKILL.md"), buffer);
@@ -524,8 +514,8 @@ async function download(url, maxBytes) {
524
514
  const response = await fetch(url, {
525
515
  signal: AbortSignal.timeout(DEFAULT_DOWNLOAD_TIMEOUT_MS),
526
516
  }).catch((err) => {
527
- throw new Error(`download failed (${url}): ${error.errorMessage(err)}`, {
528
- cause: error.toError(err),
517
+ throw new Error(`download failed (${url}): ${errorUtils.errorMessage(err)}`, {
518
+ cause: errorUtils.toError(err),
529
519
  });
530
520
  });
531
521
  if (!response.ok) {
@@ -622,4 +612,4 @@ async function pathExists(path) {
622
612
  return false;
623
613
  }
624
614
  }
625
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVtb3RlLXNraWxscy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9yZW1vdGUtc2tpbGxzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQWtERztBQUVILE9BQU8sRUFBRSxLQUFLLEVBQUUsT0FBTyxFQUFFLFFBQVEsRUFBRSxFQUFFLEVBQUUsSUFBSSxFQUFFLFNBQVMsRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBQ2pGLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFDNUMsT0FBTyxFQUFFLE9BQU8sRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLE1BQU0sV0FBVyxDQUFDO0FBRWpELE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUUzQyxPQUFPLEVBQUUsSUFBSSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDdkMsT0FBTyxFQUFFLG9CQUFvQixFQUFFLFNBQVMsSUFBSSxtQkFBbUIsRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBQy9GLE9BQU8sRUFBRSxPQUFPLEVBQXdCLE1BQU0sZUFBZSxDQUFDO0FBQzlELE9BQU8sRUFBRSxJQUFJLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUN2QyxPQUFPLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFJckYsT0FBTyxFQUFFLDRCQUE0QixFQUFFLHVCQUF1QixFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFFekYsTUFBTSxNQUFNLEdBQUcsR0FBRyxDQUFDLE1BQU0sQ0FBQyxzQkFBc0IsQ0FBQyxDQUFDO0FBRWxEOzs7Ozs7Ozs7R0FTRztBQUNILE1BQU0sZ0JBQWdCLEdBQUcsV0FBVyxDQUFDO0FBRXJDLCtFQUErRTtBQUMvRSxN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UUFDSCxNQUFNLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUNqQixPQUFPLElBQUksQ0FBQztJQUNkLENBQUM7SUFBQyxNQUFNLENBQUM7UUFDUCxPQUFPLEtBQUssQ0FBQztJQUNmLENBQUM7QUFDSCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBTdGFydHVwIHByb3Zpc2lvbmluZyBvZiByZW1vdGUgQWdlbnQtU2tpbGwgc291cmNlcyBmb3IgYSBNYXN0cmEgd29ya3NwYWNlLlxuICpcbiAqIEEge0BsaW5rIFJlbW90ZVNraWxsU291cmNlfSBuYW1lcyBXSEVSRSBhIGBTS0lMTC5tZGAgdHJlZSBjb21lcyBmcm9tIC0gdGhlXG4gKiB7QGxpbmsgQUlUT09MU19TT1VSQ0V9IGNvbnN0YW50LCBhIEdpdEh1YiBgb3duZXIvcmVwb2AsIGFueSBnaXQgLyBHaXRMYWIgVVJMLFxuICogb3IgYSBkaXJlY3QgZG93bmxvYWQgVVJMIC0gYW5kIG9wdGlvbmFsIHBlci1zb3VyY2UgcG9saWN5LlxuICoge0BsaW5rIHByb3Zpc2lvblJlbW90ZVNraWxsc30gbWF0ZXJpYWxpemVzIGV2ZXJ5IHNvdXJjZSBpbnRvIGEgbG9jYWxcbiAqIGBTS0lMTC5tZGAgdHJlZSBhdCBhcHAgYm9vdCBhbmQgcmV0dXJucyB0aGUgZGlyZWN0b3JpZXMgdG8gaGFuZCBNYXN0cmEgYXNcbiAqIGV4dHJhIHNraWxsIHNjYW4gcGF0aHMuXG4gKlxuICogUmVzb2x1dGlvbiBwZXIgc291cmNlLCBpbiBvcmRlcjpcbiAqXG4gKiAxLiB0aGUge0BsaW5rIEFJVE9PTFNfU09VUkNFfSBjb25zdGFudCAoYFwiYWl0b29sc1wiYCk6IERhdGFicmlja3MnIG93biBza2lsbFxuICogICAgc2V0LCByZWFkIHN0cmFpZ2h0IGZyb20gdGhlIHB1YmxpYyByZXBvIHRoZSBgZGF0YWJyaWNrcyBhaXRvb2xzYCBDTElcbiAqICAgIHNvdXJjZXMgZnJvbS4gTm8gQ0xJLCBubyBEYXRhYnJpY2tzIGF1dGggLSB3aGljaCBpcyB3aGF0IG1ha2VzIGl0IHVzYWJsZVxuICogICAgaW5zaWRlIGEgRGF0YWJyaWNrcyBBcHAgY29udGFpbmVyLCB3aGVyZSB0aGUgQ0xJIGlzIG5vdCBpbnN0YWxsZWQ7XG4gKiAyLiB0aGUgT1BUSU9OQUwgYHNraWxsc2AgbnBtIENMSSAocGVlciBkZXApOiBpZiBpbnN0YWxsZWQsIGVhY2ggc291cmNlIGlzXG4gKiAgICBjb3BpZWQgaW50byBhIHN0YWdpbmcgZGlyIHdpdGggYHNraWxscyBhZGQgPHNvdXJjZT4gLS1hZ2VudCA8ZGlyPiAtLWNvcHlgLFxuICogICAgd2hpY2ggdW5kZXJzdGFuZHMgZXZlcnkgc291cmNlIGZvcm1hdCB0aGUgZWNvc3lzdGVtIGRvZXMgKEdpdEh1YlxuICogICAgc2hvcnRoYW5kLCBnaXQgVVJMcywgYXJjaGl2ZS9kb3dubG9hZCBVUkxzKTtcbiAqIDMuIG90aGVyd2lzZSBhIHBsYWluIHtAbGluayBmZXRjaH0gb2YgdGhlIHNvdXJjZSBVUkwgKGJ1aWx0IHdpdGhcbiAqICAgIHtAbGluayBuZXQudXJsQnVpbGRlcn0pLCB3cml0aW5nIHRoZSBkb3dubG9hZGVkIGBTS0lMTC5tZGAgdG8gYSBzdGFnaW5nXG4gKiAgICBkaXIuXG4gKlxuICogQSBzb3VyY2UgdGhhdCByZXNvbHZlcyB0aHJvdWdoIG5laXRoZXIgcGF0aCBmYWlscyBhcHAgc3RhcnR1cCwgdW5sZXNzIHRoZVxuICogc291cmNlIChvciB0aGUgdG9wLWxldmVsIGNhbGwpIHNldHMgYGZhaWxPbkVycm9yOiBmYWxzZWAsIGluIHdoaWNoIGNhc2UgaXQgaXNcbiAqIGxvZ2dlZCBhbmQgc2tpcHBlZCBzbyBvbmUgYmFkIHNvdXJjZSBuZXZlciB0YWtlcyB0aGUgYXBwIGRvd24uXG4gKlxuICogRXZlcnkgcHJvdmlzaW9uZWQgdHJlZSBjYXJyaWVzIGEge0BsaW5rIE1FVEFEQVRBX0ZJTEV9IHJlY29yZGluZyB3aGVuIGVhY2hcbiAqIHNvdXJjZSB3YXMgbGFzdCBkb3dubG9hZGVkLCBhbmQgYSBzb3VyY2UgaXMgb25seSByZS1kb3dubG9hZGVkIG9uY2UgdGhhdFxuICogcmVjb3JkIGlzIG9sZGVyIHRoYW4ge0BsaW5rIERFRkFVTFRfUkVGUkVTSF9UVExfTVN9IChzZXZlbiBkYXlzKS4gVGhpcyBydW5zIGF0IGFwcFxuICogQk9PVCwgc28gd2l0aG91dCBpdCBhIGNvbnRhaW5lciB0aGF0IHJlc3RhcnRzIGEgZG96ZW4gdGltZXMgYW4gaG91ciByZS1wdWxsc1xuICogdGhlIHdob2xlIEFJIFRvb2xzIHNldCBhIGRvemVuIHRpbWVzIGZvciBjb250ZW50IHRoYXQgY2hhbmdlcyByYXJlbHkuIFRoZVxuICogcmVjb3JkIHRyYXZlbHMgV0lUSCB0aGUgdHJlZSByYXRoZXIgdGhhbiBpbiBwcm9jZXNzIG1lbW9yeSwgc28gdGhlIHJldXNlXG4gKiBzdXJ2aXZlcyBhIHJlc3RhcnQgLSB3aGljaCBpcyB0aGUgb25seSB3YXkgaXQgaGVscHMgYSBEYXRhYnJpY2tzIEFwcCBhdCBhbGwuXG4gKiBQYXNzIGByZWZyZXNoVHRsTXM6IDBgIHRvIGRvd25sb2FkIG9uIGV2ZXJ5IGJvb3QuXG4gKlxuICogVGhlIGRlZmF1bHQgZGVzdGluYXRpb24gaXMgdGhlIERhdGFicmlja3Mgd29ya3NwYWNlIEFzc2lzdGFudCBza2lsbHMgdHJlZVxuICogKGAvV29ya3NwYWNlLy5hc3Npc3RhbnQvc2tpbGxzYCwgdGhlIHNhbWUgdHJlZSBhIFwic2F2ZSB0aGlzIGFzIGEgc2tpbGxcIlxuICogYWN0aW9uIHdyaXRlcyB0byksIHNvIHByb3Zpc2lvbmVkIHNraWxscyBwZXJzaXN0IGFjcm9zcyByZXN0YXJ0cyBhbmQgYXJlXG4gKiBkaXNjb3ZlcmVkIGJ5IHRoZSBidWlsdC1pbiBBc3Npc3RhbnQtc2tpbGxzIG1vdW50LiBQYXNzIGB1c2VyRW1haWxgIChvciBhblxuICogZXhwbGljaXQgYGRhdGFicmlja3NCYXNlUGF0aGApIHRvIHRhcmdldCBgL1VzZXJzLzxlbWFpbD4vLmFzc2lzdGFudC9za2lsbHNgXG4gKiBpbnN0ZWFkLiBXaGVuIG5vIERhdGFicmlja3MgY2xpZW50IGlzIHJlc29sdmFibGUgYXQgc3RhcnR1cCAtIG9yIHRoZSByZXNvbHZlZFxuICogaWRlbnRpdHkgY2Fubm90IFdSSVRFIHRoZSBkZXN0aW5hdGlvbiwgd2hpY2ggaXMgdGhlIG5vcm1hbCBjYXNlIGZvciBhXG4gKiBEYXRhYnJpY2tzIEFwcCBzZXJ2aWNlIHByaW5jaXBhbCBhZ2FpbnN0IHRoZSBhZG1pbi1vd25lZCBzaGFyZWQgdHJlZSAoc2VlXG4gKiB7QGxpbmsgb3BlbldyaXRhYmxlV29ya3NwYWNlfSkgLSB0aGUgdHJlZSBpcyB3cml0dGVuIHVuZGVyXG4gKiB7QGxpbmsgbG9jYWxGUy50bXBGU30gYW5kIHJldHVybmVkIGFzIGFuIGV4dHJhIGxvY2FsIHNraWxsIHBhdGggZm9yIHRoZVxuICogY3VycmVudCBwcm9jZXNzLiBTdG9yYWdlIGxvY2F0aW9uIGRlZ3JhZGVzOyB0aGUgc2tpbGxzIHRoZW1zZWx2ZXMgZG8gbm90LlxuICpcbiAqIEBtb2R1bGVcbiAqL1xuXG5pbXBvcnQgeyBta2RpciwgcmVhZGRpciwgcmVhZEZpbGUsIHJtLCBzdGF0LCB3cml0ZUZpbGUgfSBmcm9tIFwibm9kZTpmcy9wcm9taXNlc1wiO1xuaW1wb3J0IHsgY3JlYXRlUmVxdWlyZSB9IGZyb20gXCJub2RlOm1vZHVsZVwiO1xuaW1wb3J0IHsgZGlybmFtZSwgam9pbiwgcG9zaXggfSBmcm9tIFwibm9kZTpwYXRoXCI7XG5pbXBvcnQgdHlwZSB7IFdvcmtzcGFjZUNsaWVudCB9IGZyb20gXCJAZGF0YWJyaWNrcy9hcHBraXRcIjtcbmltcG9ydCB7IGFwcGtpdCB9IGZyb20gXCJAZGJ4LXRvb2xzL2FwcGtpdFwiO1xuaW1wb3J0IHR5cGUgeyBXb3Jrc3BhY2VDbGllbnRMaWtlIH0gZnJvbSBcIkBkYngtdG9vbHMvYXBwa2l0XCI7XG5pbXBvcnQgeyBleGVjIH0gZnJvbSBcIkBkYngtdG9vbHMvY29yZVwiO1xuaW1wb3J0IHsgRGF0YWJyaWNrc0ZpbGVTeXN0ZW0sIHdvcmtzcGFjZSBhcyBkYXRhYnJpY2tzV29ya3NwYWNlIH0gZnJvbSBcIkBkYngtdG9vbHMvZGF0YWJyaWNrc1wiO1xuaW1wb3J0IHsgbG9jYWxGUywgdHlwZSBMb2NhbEZpbGVTeXN0ZW0gfSBmcm9tIFwiQGRieC10b29scy9mc1wiO1xuaW1wb3J0IHsgZmluZCB9IGZyb20gXCJAZGJ4LXRvb2xzL3BhdGhcIjtcbmltcG9ydCB7IGVycm9yLCBoYXNoLCBqc29uLCBsb2csIG5ldCwgb2JqZWN0LCBzdHJpbmcgfSBmcm9tIFwiQGRieC10b29scy9zaGFyZWQtY29yZVwiO1xuaW1wb3J0IHR5cGUgeyBPbmVPck1hbnkgfSBmcm9tIFwiQGRieC10b29scy9zaGFyZWQtY29yZVwiO1xuaW1wb3J0IHR5cGUgeyBGaWxlU3lzdGVtIH0gZnJvbSBcIkBkYngtdG9vbHMvc2hhcmVkLWZzXCI7XG5cbmltcG9ydCB7IEFTU0lTVEFOVF9TSEFSRURfU0tJTExTX1BBVEgsIHVzZXJBc3Npc3RhbnRTa2lsbHNQYXRoIH0gZnJvbSBcIi4vc2tpbGwtcGF0aHMudHNcIjtcblxuY29uc3QgbG9nZ2VyID0gbG9nLmxvZ2dlcihcIm1hc3RyYS9yZW1vdGUtc2tpbGxzXCIpO1xuXG4vKipcbiAqIEFnZW50IGlkIHRoZSBgc2tpbGxzYCBDTEkgaW5zdGFsbHMgYSBiYXJlIGBTS0lMTC5tZGAgdHJlZSB1bmRlci5cbiAqXG4gKiBgdW5pdmVyc2FsYCBpcyB0aGUgQ0xJJ3Mgb3duIG5hbWUgZm9yIFwibm8gcGFydGljdWxhciBhZ2VudCwganVzdCB0aGUgcGxhaW5cbiAqIHRyZWVcIiwgd2hpY2ggaXMgd2hhdCB0aGlzIG1vZHVsZSB3YW50cyAtIGl0IHJlLWhvc3RzIHRoZSByZXN1bHQgaXRzZWxmLiBUaGVcbiAqIGlkIG11c3QgYmUgb25lIHRoZSBpbnN0YWxsZWQgQ0xJIGtub3dzOiBhbiB1bnJlY29nbml6ZWQgb25lIGlzIHJlamVjdGVkXG4gKiBvdXRyaWdodCAoYEludmFsaWQgYWdlbnRzOiAuLi5gKSwgdGFraW5nIGV2ZXJ5IG5vbi1gYWl0b29sc2Agc291cmNlIGRvd24gd2l0aFxuICogaXQsIHNpbmNlIGEgQ0xJIGZhaWx1cmUgaXMgYSBoYXJkIGZhaWx1cmUgcmF0aGVyIHRoYW4gYSBmYWxsLXRocm91Z2ggdG9cbiAqIHtAbGluayBzdGFnZVZpYUZldGNofS5cbiAqL1xuY29uc3QgU0tJTExTX0NMSV9BR0VOVCA9IFwidW5pdmVyc2FsXCI7XG5cbi8qKiBXaGVyZSB0aGUgYHNraWxsc2AgQ0xJIGRyb3BzIGEgcGxhaW4gYFNLSUxMLm1kYCB0cmVlIHVuZGVyIGEgdGFyZ2V0IGRpci4gKi9cbmNvbnN0IFNLSUxMU19DTElfTEFZT1VUID0gW1wiLmFnZW50c1wiLCBcInNraWxsc1wiXSBhcyBjb25zdDtcblxuLyoqIENhcCBvbiBhIGRpcmVjdC1mZXRjaCBkb3dubG9hZCBib2R5LCBtYXRjaGluZyB0aGUgYHNraWxsc2AgQ0xJIGRlZmF1bHQuICovXG5jb25zdCBERUZBVUxUX01BWF9ET1dOTE9BRF9CWVRFUyA9IDEwICogMTAyNCAqIDEwMjQ7XG5cbi8qKiBNYXhpbXVtIHRpbWUgb25lIHJlbW90ZSBmaWxlIGRvd25sb2FkIG1heSBibG9jayBzdGFydHVwLiAqL1xuY29uc3QgREVGQVVMVF9ET1dOTE9BRF9USU1FT1VUX01TID0gNjBfMDAwO1xuXG4vKiogU3RhYmxlIHRlbXAgZGlyZWN0b3J5IGhvbGRpbmcgb25lIHJlYnVpbHQgc2tpbGwgdHJlZSBwZXIgcmVtb3RlIHNvdXJjZS4gKi9cbmNvbnN0IExPQ0FMX1NLSUxMU19ESVIgPSBcIm1hc3RyYS1sb2NhbC1za2lsbHNcIjtcblxuLyoqXG4gKiBCb29ra2VlcGluZyBmaWxlIHdyaXR0ZW4gYXQgdGhlIHJvb3Qgb2YgZXZlcnkgcHJvdmlzaW9uZWQgc2tpbGwgdHJlZSwgbmFtaW5nXG4gKiB3aGVuIGVhY2ggc291cmNlIHdhcyBsYXN0IGRvd25sb2FkZWQuIEEgZG90ZmlsZSBzbyB0aGUgc2tpbGwgc2Nhbm5lcnMsIHdoaWNoXG4gKiBsb29rIGZvciBgPGRpcj4vU0tJTEwubWRgLCBuZXZlciBtaXN0YWtlIGl0IGZvciBhIHNraWxsLlxuICovXG5jb25zdCBNRVRBREFUQV9GSUxFID0gXCIubWV0YWRhdGEuanNvblwiO1xuXG4vKiogU2hhcGUgbWFya2VyIGZvciB7QGxpbmsgTUVUQURBVEFfRklMRX07IGFuIHVua25vd24gdmVyc2lvbiBpcyBpZ25vcmVkLCBub3QgcmVhZC4gKi9cbmNvbnN0IE1FVEFEQVRBX1ZFUlNJT04gPSAxO1xuXG4vKiogSG93IGxvbmcgYSBwcm92aXNpb25lZCBzb3VyY2UgaXMgcmV1c2VkIGJlZm9yZSBiZWluZyBkb3dubG9hZGVkIGFnYWluLiAqL1xuY29uc3QgREVGQVVMVF9SRUZSRVNIX1RUTF9NUyA9IDcgKiAyNCAqIDYwICogNjAgKiAxMDAwO1xuXG4vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gQUkgVG9vbHMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovXG5cbi8qKlxuICogU291cmNlIGNvbnN0YW50IHNlbGVjdGluZyBEYXRhYnJpY2tzJyBvd24gQUkgVG9vbHMgc2tpbGwgc2V0LlxuICpcbiAqIEBleGFtcGxlXG4gKiBtYXN0cmEoeyByZW1vdGVTa2lsbHM6IFwiYWl0b29sc1wiIH0pO1xuICovXG5leHBvcnQgY29uc3QgQUlUT09MU19TT1VSQ0UgPSBcImFpdG9vbHNcIjtcblxuLyoqIFRoZSB7QGxpbmsgQUlUT09MU19TT1VSQ0V9IGxpdGVyYWwsIGZvciBjYWxsZXJzIHNwZWxsaW5nIHRoZSB1bmlvbiBvdXQuICovXG5leHBvcnQgdHlwZSBBaVRvb2xzU291cmNlID0gdHlwZW9mIEFJVE9PTFNfU09VUkNFO1xuXG4vKipcbiAqIFRoZSBQVUJMSUMgcmVwbyBgZGF0YWJyaWNrcyBhaXRvb2xzIGluc3RhbGxgIHNvdXJjZXMgZnJvbS4gUmVhZGluZyBpdFxuICogZGlyZWN0bHkgaXMgd2hhdCBsZXRzIGFuIGFwcCBnZXQgdGhlIHNhbWUgc2tpbGxzIHRoZSBDTEkgaW5zdGFsbHMgd2l0aG91dFxuICogdGhlIENMSSAtIHdoaWNoIGEgRGF0YWJyaWNrcyBBcHAgY29udGFpbmVyIGRvZXMgbm90IHNoaXAuXG4gKi9cbmNvbnN0IEFJVE9PTFNfUkVQTyA9IFwiZGF0YWJyaWNrcy9kYXRhYnJpY2tzLWFnZW50LXNraWxsc1wiO1xuXG4vKiogUmVwbyByZWYgdGhlIHNraWxscyBhcmUgcmVhZCBmcm9tLiBPdmVycmlkZSBwZXIgc291cmNlIHdpdGggYHJlZmAuICovXG5jb25zdCBBSVRPT0xTX1JFRiA9IFwibWFpblwiO1xuXG4vKiogU2tpbGwgZmlsZXMgZG93bmxvYWRlZCBhdCBvbmNlOyB0aGUgc2V0IGlzIH4zMCBza2lsbHMgb2YgYSBmZXcgZmlsZXMgZWFjaC4gKi9cbmNvbnN0IEFJVE9PTFNfQ09OQ1VSUkVOQ1kgPSA4O1xuXG4vKiogVGhlIHN1YnNldCBvZiB0aGUgcmVwbydzIGdlbmVyYXRlZCBgbWFuaWZlc3QuanNvbmAgdGhpcyBtb2R1bGUgcmVhZHMuICovXG5pbnRlcmZhY2UgQWlUb29sc01hbmlmZXN0IHtcbiAgc2tpbGxzPzogUmVjb3JkPHN0cmluZywgeyBmaWxlcz86IHN0cmluZ1tdOyByZXBvX2Rpcj86IHN0cmluZyB9Pjtcbn1cblxuLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gdHlwZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi9cblxuLyoqXG4gKiBPbmUgcmVtb3RlIHNraWxsIHNvdXJjZSBhbmQgaXRzIHBlci1zb3VyY2UgcG9saWN5LlxuICpcbiAqIGBzb3VyY2VgIGlzIHtAbGluayBBSVRPT0xTX1NPVVJDRX0gb3IgYW55dGhpbmcgdGhlIGBza2lsbHNgIGVjb3N5c3RlbVxuICogdW5kZXJzdGFuZHM6IGEgR2l0SHViIGBvd25lci9yZXBvYCBzaG9ydGhhbmQsIGEgZnVsbCBHaXRIdWIgLyBHaXRMYWIgLyBnaXRcbiAqIFVSTCwgb3IgYSBkaXJlY3QgZG93bmxvYWQgVVJMIHRvIGEgYFNLSUxMLm1kYCBvciBhcmNoaXZlLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFJlbW90ZVNraWxsU291cmNlT3B0aW9ucyB7XG4gIC8qKiBgXCJhaXRvb2xzXCJgLCBhIEdpdEh1YiBzaG9ydGhhbmQsIGEgZ2l0IC8gR2l0TGFiIFVSTCwgb3IgYSBkb3dubG9hZCBVUkwuICovXG4gIHNvdXJjZTogbmV0LlVybExpa2UgfCBBaVRvb2xzU291cmNlO1xuICAvKiogSW5zdGFsbCBvbmx5IHRoZXNlIHNraWxsIG5hbWVzIGZyb20gdGhlIHNvdXJjZS4gKi9cbiAgc2tpbGxzPzogc3RyaW5nIHwgc3RyaW5nW107XG4gIC8qKiBJbmNsdWRlIGV4cGVyaW1lbnRhbCBza2lsbHMuIGBcImFpdG9vbHNcImAgb25seS4gKi9cbiAgZXhwZXJpbWVudGFsPzogYm9vbGVhbjtcbiAgLyoqIFBpbiB0aGUgcmVwbyByZWYgKHRhZyAvIGJyYW5jaCAvIHNoYSkuIGBcImFpdG9vbHNcImAgb25seTsgZGVmYXVsdHMgdG8gYG1haW5gLiAqL1xuICByZWY/OiBzdHJpbmc7XG4gIC8qKiBPdmVycmlkZSB0aGUgYnl0ZSBjZWlsaW5nIG9uIGEgZGlyZWN0LWZldGNoIGRvd25sb2FkIGZvciB0aGlzIHNvdXJjZS4gKi9cbiAgbWF4RG93bmxvYWRCeXRlcz86IG51bWJlcjtcbiAgLyoqXG4gICAqIEhvdyBsb25nIHRoaXMgc291cmNlJ3MgcHJvdmlzaW9uZWQgdHJlZSBpcyByZXVzZWQgYmVmb3JlIGl0IGlzIGRvd25sb2FkZWRcbiAgICogYWdhaW4sIGluIG1pbGxpc2Vjb25kcy4gT3ZlcnJpZGVzIHRoZSB0b3AtbGV2ZWxcbiAgICoge0BsaW5rIFByb3Zpc2lvblJlbW90ZVNraWxsc09wdGlvbnMucmVmcmVzaFR0bE1zfTsgYDBgIHJlLWRvd25sb2FkcyBvblxuICAgKiBldmVyeSBib290LlxuICAgKi9cbiAgcmVmcmVzaFR0bE1zPzogbnVtYmVyO1xuICAvKipcbiAgICogV2hlbiBgZmFsc2VgLCBhIHNvdXJjZSB0aGF0IGZhaWxzIHRvIHJlc29sdmUgaXMgbG9nZ2VkIGFuZCBza2lwcGVkIGluc3RlYWRcbiAgICogb2YgZmFpbGluZyBhcHAgc3RhcnR1cC4gT3ZlcnJpZGVzIHRoZSB0b3AtbGV2ZWwge0BsaW5rIFByb3Zpc2lvblJlbW90ZVNraWxsc09wdGlvbnMuZmFpbE9uRXJyb3J9LlxuICAgKi9cbiAgZmFpbE9uRXJyb3I/OiBib29sZWFuO1xufVxuXG4vKipcbiAqIEEgcmVtb3RlIHNraWxsIHNvdXJjZTogdGhlIHtAbGluayBBSVRPT0xTX1NPVVJDRX0gY29uc3RhbnQsIGEgVVJMLWxpa2VcbiAqIChzdHJpbmcgLyBgVVJMYCAvIGB7IHVybCB9YCksIG9yIGEge0BsaW5rIFJlbW90ZVNraWxsU291cmNlT3B0aW9uc30gYmFnIHdpdGhcbiAqIHBlci1zb3VyY2UgcG9saWN5LlxuICovXG5leHBvcnQgdHlwZSBSZW1vdGVTa2lsbFNvdXJjZSA9IG5ldC5VcmxMaWtlIHwgQWlUb29sc1NvdXJjZSB8IFJlbW90ZVNraWxsU291cmNlT3B0aW9ucztcblxuLyoqXG4gKiBUaGUgd29ya3NwYWNlIGByZW1vdGVTa2lsbHNgIG9wdGlvbjogb25lIHNvdXJjZSwgYSBub24tZW1wdHkgbGlzdCBvZiB0aGVtLCBvclxuICogYSB7QGxpbmsgUHJvdmlzaW9uUmVtb3RlU2tpbGxzT3B0aW9uc30gYmFnIHdoZW4gdG9wLWxldmVsIHBvbGljeSBpcyBuZWVkZWQuXG4gKi9cbmV4cG9ydCB0eXBlIFJlbW90ZVNraWxsc09wdGlvbiA9XG4gIFJlbW90ZVNraWxsU291cmNlIHwgT25lT3JNYW55PFJlbW90ZVNraWxsU291cmNlPiB8IFByb3Zpc2lvblJlbW90ZVNraWxsc09wdGlvbnM7XG5cbi8qKiBBIHNvdXJjZSBlbnRyeSB3aXRoIGl0cyBgc291cmNlYCBmbGF0dGVuZWQgdG8gYSBwbGFpbiBzdHJpbmcuICovXG50eXBlIE5vcm1hbGl6ZWRTb3VyY2UgPSBPbWl0PFJlbW90ZVNraWxsU291cmNlT3B0aW9ucywgXCJzb3VyY2VcIj4gJiB7IHNvdXJjZTogc3RyaW5nIH07XG5cbi8qKiBUb3AtbGV2ZWwgcmVtb3RlLXNraWxscyBwcm92aXNpb25pbmcgb3B0aW9ucy4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUHJvdmlzaW9uUmVtb3RlU2tpbGxzT3B0aW9ucyB7XG4gIC8qKiBTb3VyY2VzIHRvIG1hdGVyaWFsaXplIGF0IHN0YXJ0dXAuICovXG4gIHNvdXJjZXM6IFJlbW90ZVNraWxsU291cmNlIHwgT25lT3JNYW55PFJlbW90ZVNraWxsU291cmNlPjtcbiAgLyoqXG4gICAqIEZhaWwgYXBwIHN0YXJ0dXAgd2hlbiBhIHNvdXJjZSBjYW4ndCBiZSByZXNvbHZlZC4gRGVmYXVsdHMgdG8gYHRydWVgLiBBXG4gICAqIHBlci1zb3VyY2UgYGZhaWxPbkVycm9yYCB3aW5zIG92ZXIgdGhpcy5cbiAgICovXG4gIGZhaWxPbkVycm9yPzogYm9vbGVhbjtcbiAgLyoqXG4gICAqIEFic29sdXRlIERhdGFicmlja3MgcGF0aCB0aGF0IHJvb3RzIHRoZSBkZXN0aW5hdGlvbiBBc3Npc3RhbnQgc2tpbGxzIHRyZWUuXG4gICAqIERlZmF1bHRzIHRvIHRoZSBPQk8gdXNlcidzIGAvVXNlcnMvPGVtYWlsPi8uYXNzaXN0YW50L3NraWxsc2AuXG4gICAqL1xuICBkYXRhYnJpY2tzQmFzZVBhdGg/OiBzdHJpbmc7XG4gIC8qKiBBdXRoLXNjb3BlZCBEYXRhYnJpY2tzIGNsaWVudC4gRGVmYXVsdHMgdG8gdGhlIEFwcEtpdCBleGVjdXRpb24gY29udGV4dC4gKi9cbiAgY2xpZW50PzogV29ya3NwYWNlQ2xpZW50TGlrZTtcbiAgLyoqIFVzZXIgZW1haWwgdXNlZCB0byBkZXJpdmUgdGhlIGRlZmF1bHQgRGF0YWJyaWNrcyBkZXN0aW5hdGlvbi4gKi9cbiAgdXNlckVtYWlsPzogc3RyaW5nO1xuICAvKiogQnl0ZSBjZWlsaW5nIG9uIGEgZGlyZWN0LWZldGNoIGRvd25sb2FkLiBEZWZhdWx0cyB0byAxMCBNaUIuICovXG4gIG1heERvd25sb2FkQnl0ZXM/OiBudW1iZXI7XG4gIC8qKlxuICAgKiBIb3cgbG9uZyBhIHByb3Zpc2lvbmVkIHRyZWUgaXMgcmV1c2VkIGJlZm9yZSBpdHMgc291cmNlIGlzIGRvd25sb2FkZWRcbiAgICogYWdhaW4sIGluIG1pbGxpc2Vjb25kcy4gRGVmYXVsdHMgdG8gc2V2ZW4gZGF5czsgYDBgIHJlLWRvd25sb2FkcyBvbiBldmVyeVxuICAgKiBib290LiBBIHBlci1zb3VyY2UgYHJlZnJlc2hUdGxNc2Agd2lucyBvdmVyIHRoaXMuXG4gICAqL1xuICByZWZyZXNoVHRsTXM/OiBudW1iZXI7XG59XG5cbi8qKiBXaGF0IHtAbGluayBwcm92aXNpb25SZW1vdGVTa2lsbHN9IHJlc29sdmVkLiAqL1xuZXhwb3J0IGludGVyZmFjZSBQcm92aXNpb25lZFJlbW90ZVNraWxscyB7XG4gIC8qKlxuICAgKiBFeHRyYSBMT0NBTCBza2lsbCBzY2FuIHBhdGhzIHRvIGhhbmQgTWFzdHJhIChhIHRlbXAgZGlyIHBlciBzb3VyY2UgdGhhdFxuICAgKiBjb3VsZG4ndCBiZSB3cml0dGVuIHRvIERhdGFicmlja3MpLiBFbXB0eSB3aGVuIGV2ZXJ5dGhpbmcgbGFuZGVkIGluIHRoZVxuICAgKiBEYXRhYnJpY2tzIEFzc2lzdGFudCB0cmVlLCB3aGljaCB0aGUgYnVpbHQtaW4gbW91bnQgYWxyZWFkeSBzY2Fucy5cbiAgICovXG4gIGxvY2FsU2tpbGxQYXRoczogc3RyaW5nW107XG4gIC8qKiBBYnNvbHV0ZSBEYXRhYnJpY2tzIGRlc3RpbmF0aW9uIGVhY2ggc291cmNlIHdhcyB3cml0dGVuIHRvLCBpZiBhbnkuICovXG4gIGRhdGFicmlja3NCYXNlUGF0aD86IHN0cmluZztcbiAgLyoqXG4gICAqIE5hbWVzIG9mIGV2ZXJ5IHNraWxsIGRpcmVjdG9yeSBub3cgYXZhaWxhYmxlLCB3aGV0aGVyIGl0IHdhcyBkb3dubG9hZGVkIG9uXG4gICAqIHRoaXMgYm9vdCBvciByZXVzZWQgZnJvbSBhIHN0aWxsLWZyZXNoIHRyZWUgKHNlZSB7QGxpbmsgTUVUQURBVEFfRklMRX0pLlxuICAgKi9cbiAgc2tpbGxOYW1lczogc3RyaW5nW107XG59XG5cbi8qKlxuICogV2hhdCBvbmUgc291cmNlJ3MgbGFzdCBkb3dubG9hZCBsZWZ0IGJlaGluZCwgYXMgcmVjb3JkZWQgaW5cbiAqIHtAbGluayBNRVRBREFUQV9GSUxFfS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBSZW1vdGVTa2lsbENhY2hlRW50cnkge1xuICAvKiogVGhlIHNvdXJjZSBzdHJpbmcgdGhpcyBlbnRyeSB3YXMgZG93bmxvYWRlZCBmcm9tLCBmb3IgcmVhZGFiaWxpdHkuICovXG4gIHNvdXJjZTogc3RyaW5nO1xuICAvKiogV2hlbiB0aGUgZG93bmxvYWQgY29tcGxldGVkLCBJU08tODYwMS4gKi9cbiAgZG93bmxvYWRlZEF0OiBzdHJpbmc7XG4gIC8qKiBTa2lsbCBkaXJlY3RvcnkgbmFtZXMgdGhlIGRvd25sb2FkIHByb2R1Y2VkLiAqL1xuICBza2lsbHM6IHN0cmluZ1tdO1xuICAvKipcbiAgICogVGhlIGNvbnRlbnQtYWZmZWN0aW5nIHBvbGljeSB0aGF0IGRvd25sb2FkIHVzZWQuIEFsc28gZm9sZGVkIGludG8gdGhlIGVudHJ5XG4gICAqIEtFWSwgc28gbmFycm93aW5nIGBza2lsbHNgIG9yIG1vdmluZyBgcmVmYCBtaXNzZXMgdGhlIGNhY2hlIGluc3RlYWQgb2ZcbiAgICogc2lsZW50bHkgc2VydmluZyB0aGUgcHJldmlvdXMgc2VsZWN0aW9uLlxuICAgKi9cbiAgcG9saWN5PzogeyBza2lsbHM/OiBzdHJpbmdbXTsgZXhwZXJpbWVudGFsPzogYm9vbGVhbjsgcmVmPzogc3RyaW5nIH07XG59XG5cbi8qKiBUaGUge0BsaW5rIE1FVEFEQVRBX0ZJTEV9IGRvY3VtZW50OiBvbmUgZW50cnkgcGVyIHByb3Zpc2lvbmVkIHNvdXJjZS4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUmVtb3RlU2tpbGxzTWV0YWRhdGEge1xuICB2ZXJzaW9uOiBudW1iZXI7XG4gIHNvdXJjZXM6IFJlY29yZDxzdHJpbmcsIFJlbW90ZVNraWxsQ2FjaGVFbnRyeT47XG59XG5cbi8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gaGVscGVycyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovXG5cbi8qKiBOb3JtYWxpemUgdGhlIGByZW1vdGVTa2lsbHNgIG9wdGlvbiBpbnRvIGEgZmxhdCBvcHRpb25zIGJhZy4gKi9cbmV4cG9ydCBmdW5jdGlvbiBub3JtYWxpemVSZW1vdGVTa2lsbHNPcHRpb24oXG4gIG9wdGlvbjogUmVtb3RlU2tpbGxzT3B0aW9uIHwgdW5kZWZpbmVkLFxuKTogUHJvdmlzaW9uUmVtb3RlU2tpbGxzT3B0aW9ucyB8IHVuZGVmaW5lZCB7XG4gIGlmIChvcHRpb24gPT09IHVuZGVmaW5lZCkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgY29uc3QgYmFnID0gaXNQcm92aXNpb25PcHRpb25zKG9wdGlvbikgPyBvcHRpb24gOiB1bmRlZmluZWQ7XG4gIGNvbnN0IHNvdXJjZXMgPSB0b1NvdXJjZUxpc3QoYmFnID8gYmFnLnNvdXJjZXMgOiAob3B0aW9uIGFzIFJlbW90ZVNraWxsU291cmNlKSk7XG4gIC8vIEFuIGVtcHR5IGxpc3QgaXMgdGhlIHNhbWUgYXMgbm8gY29uZmlndXJhdGlvbiBhdCBhbGwuXG4gIGlmICghb2JqZWN0LmlzT25lT3JNYW55KHNvdXJjZXMpKSByZXR1cm4gdW5kZWZpbmVkO1xuICByZXR1cm4geyAuLi5iYWcsIHNvdXJjZXMgfTtcbn1cblxuLyoqIEEgYHNvdXJjZXNgLWJlYXJpbmcgYmFnIGlzIHRoZSB0b3AtbGV2ZWwgb3B0aW9ucyBzaGFwZSwgbm90IGEgc2luZ2xlIHNvdXJjZS4gKi9cbmZ1bmN0aW9uIGlzUHJvdmlzaW9uT3B0aW9ucyh2YWx1ZTogdW5rbm93bik6IHZhbHVlIGlzIFByb3Zpc2lvblJlbW90ZVNraWxsc09wdGlvbnMge1xuICByZXR1cm4gb2JqZWN0LmlzUmVjb3JkKHZhbHVlKSAmJiBcInNvdXJjZXNcIiBpbiB2YWx1ZTtcbn1cblxuLyoqIE9uZSBzb3VyY2Ugb3IgbWFueSwgYXMgYSBwbGFpbiBhcnJheS4gQSBzb3VyY2UgaXMgbmV2ZXIgaXRzZWxmIGFuIGFycmF5LiAqL1xuZnVuY3Rpb24gdG9Tb3VyY2VMaXN0KFxuICBpbnB1dDogUmVtb3RlU2tpbGxTb3VyY2UgfCBPbmVPck1hbnk8UmVtb3RlU2tpbGxTb3VyY2U+LFxuKTogUmVtb3RlU2tpbGxTb3VyY2VbXSB7XG4gIHJldHVybiBBcnJheS5pc0FycmF5KGlucHV0KSA/IFsuLi5pbnB1dF0gOiBbaW5wdXRdO1xufVxuXG4vKiogRmxhdHRlbiBhIHNvdXJjZSBlbnRyeSAtIHN0cmluZywgYFVSTGAsIGB7IHVybCB9YCwgb3Igb3B0aW9ucyBiYWcgLSB0byBhIHtAbGluayBOb3JtYWxpemVkU291cmNlfS4gKi9cbmZ1bmN0aW9uIHRvU291cmNlT3B0aW9ucyhzb3VyY2U6IFJlbW90ZVNraWxsU291cmNlKTogTm9ybWFsaXplZFNvdXJjZSB7XG4gIGlmICh0eXBlb2Ygc291cmNlID09PSBcInN0cmluZ1wiKSByZXR1cm4geyBzb3VyY2UgfTtcbiAgaWYgKHNvdXJjZSBpbnN0YW5jZW9mIFVSTCkgcmV0dXJuIHsgc291cmNlOiBzb3VyY2UudG9TdHJpbmcoKSB9O1xuICBpZiAoXCJzb3VyY2VcIiBpbiBzb3VyY2UpIHJldHVybiB7IC4uLnNvdXJjZSwgc291cmNlOiB0b1NvdXJjZVN0cmluZyhzb3VyY2Uuc291cmNlKSB9O1xuICByZXR1cm4geyBzb3VyY2U6IHNvdXJjZS51cmwgfTtcbn1cblxuLyoqIEEge0BsaW5rIG5ldC5VcmxMaWtlfSBhcyB0aGUgcGxhaW4gc3RyaW5nIHRoZSBzdGFnaW5nIHBhdGhzIHdvcmsgd2l0aC4gKi9cbmZ1bmN0aW9uIHRvU291cmNlU3RyaW5nKHNvdXJjZTogbmV0LlVybExpa2UpOiBzdHJpbmcge1xuICBpZiAodHlwZW9mIHNvdXJjZSA9PT0gXCJzdHJpbmdcIikgcmV0dXJuIHNvdXJjZTtcbiAgcmV0dXJuIHNvdXJjZSBpbnN0YW5jZW9mIFVSTCA/IHNvdXJjZS50b1N0cmluZygpIDogc291cmNlLnVybDtcbn1cblxuLyoqIFRydWUgd2hlbiBhIHNvdXJjZSBzZWxlY3RzIHRoZSBidWlsdC1pbiBEYXRhYnJpY2tzIEFJIFRvb2xzIHNraWxsIHNldC4gKi9cbmZ1bmN0aW9uIGlzQWlUb29sc1NvdXJjZShzb3VyY2U6IHN0cmluZyk6IGJvb2xlYW4ge1xuICByZXR1cm4gc291cmNlLnRyaW0oKS50b0xvd2VyQ2FzZSgpID09PSBBSVRPT0xTX1NPVVJDRTtcbn1cblxuLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gY2FjaGUgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi9cblxuLyoqXG4gKiBUaGUgcG9saWN5IHRoYXQgZGVjaWRlcyB3aGF0IGEgc291cmNlJ3MgZG93bmxvYWQgQ09OVEFJTlMuXG4gKlxuICogT25seSB0aGVzZSB0aHJlZSBjaGFuZ2UgdGhlIHJlc3VsdGluZyB0cmVlLCBzbyBvbmx5IHRoZXNlIGJlbG9uZyBpbiB0aGUgY2FjaGVcbiAqIGtleSAtIGBmYWlsT25FcnJvcmAgYW5kIGBtYXhEb3dubG9hZEJ5dGVzYCBnb3Zlcm4gaG93IGEgZmFpbHVyZSBpcyBoYW5kbGVkLFxuICogbm90IHdoYXQgYSBzdWNjZXNzIHByb2R1Y2VzLlxuICovXG5mdW5jdGlvbiBjYWNoZVBvbGljeShzb3VyY2VPcHRpb25zOiBOb3JtYWxpemVkU291cmNlKTogUmVtb3RlU2tpbGxDYWNoZUVudHJ5W1wicG9saWN5XCJdIHtcbiAgY29uc3Qgc2tpbGxzID0gc3RyaW5nLnBhcnNlTGlzdChzb3VyY2VPcHRpb25zLnNraWxscyk7XG4gIGNvbnN0IHBvbGljeSA9IHtcbiAgICAuLi4oc2tpbGxzLmxlbmd0aCA+IDAgPyB7IHNraWxsczogWy4uLnNraWxsc10uc29ydCgpIH0gOiB7fSksXG4gICAgLi4uKHNvdXJjZU9wdGlvbnMuZXhwZXJpbWVudGFsID09PSB0cnVlID8geyBleHBlcmltZW50YWw6IHRydWUgfSA6IHt9KSxcbiAgICAuLi4oc3RyaW5nLnRyaW1Ub051bGwoc291cmNlT3B0aW9ucy5yZWYpID8geyByZWY6IHNvdXJjZU9wdGlvbnMucmVmIS50cmltKCkgfSA6IHt9KSxcbiAgfTtcbiAgcmV0dXJuIE9iamVjdC5rZXlzKHBvbGljeSkubGVuZ3RoID4gMCA/IHBvbGljeSA6IHVuZGVmaW5lZDtcbn1cblxuLyoqXG4gKiBTdGFibGUgaWRlbnRpdHkgb2YgYSBzb3VyY2UgQU5EIGl0cyBjb250ZW50LWFmZmVjdGluZyBwb2xpY3kuXG4gKlxuICogS2V5aW5nIG9uIHRoZSBzb3VyY2UgYWxvbmUgd291bGQgbGV0IGEgY2hhbmdlZCBgc2tpbGxzYCBmaWx0ZXIgb3IgYHJlZmAgcmVhZFxuICogYmFjayB0aGUgcHJldmlvdXMgZG93bmxvYWQgZm9yIGEgZGF5OyBrZXlpbmcgb24gYm90aCB0dXJucyB0aGF0IGludG8gYSBtaXNzLlxuICogVGhlIHNraWxsIGxpc3QgaXMgc29ydGVkIGZpcnN0IHNvIGEgcmVvcmRlcmVkIGFycmF5IGlzIHN0aWxsIHRoZSBzYW1lIGtleS5cbiAqL1xuZnVuY3Rpb24gY2FjaGVLZXkoc291cmNlT3B0aW9uczogTm9ybWFsaXplZFNvdXJjZSk6IHN0cmluZyB7XG4gIHJldHVybiBoYXNoLmZudkhhc2goXG4gICAgSlNPTi5zdHJpbmdpZnkoeyBzb3VyY2U6IHNvdXJjZU9wdGlvbnMuc291cmNlLCBwb2xpY3k6IGNhY2hlUG9saWN5KHNvdXJjZU9wdGlvbnMpID8/IG51bGwgfSksXG4gICk7XG59XG5cbi8qKiBUaGUgZWZmZWN0aXZlIHJldXNlIHdpbmRvdzogcGVyLXNvdXJjZSwgdGhlbiB0b3AtbGV2ZWwsIHRoZW4gc2V2ZW4gZGF5cy4gKi9cbmZ1bmN0aW9uIHJlc29sdmVSZWZyZXNoVHRsKFxuICBzb3VyY2VPcHRpb25zOiBOb3JtYWxpemVkU291cmNlLFxuICBvcHRpb25zOiBQcm92aXNpb25SZW1vdGVTa2lsbHNPcHRpb25zLFxuKTogbnVtYmVyIHtcbiAgcmV0dXJuIHNvdXJjZU9wdGlvbnMucmVmcmVzaFR0bE1zID8/IG9wdGlvbnMucmVmcmVzaFR0bE1zID8/IERFRkFVTFRfUkVGUkVTSF9UVExfTVM7XG59XG5cbi8qKlxuICogUmVhZCB0aGUgbWV0YWRhdGEgZG9jdW1lbnQgYXQgdGhlIHJvb3Qgb2YgYSBwcm92aXNpb25lZCB0cmVlLCBvciBgdW5kZWZpbmVkYFxuICogd2hlbiB0aGVyZSBpcyBub25lLCBpdCBpcyB1bnJlYWRhYmxlLCBvciBpdCB3YXMgd3JpdHRlbiBieSBhIHNoYXBlIHRoaXNcbiAqIHZlcnNpb24gZG9lcyBub3Qga25vdy5cbiAqXG4gKiBOZXZlciB0aHJvd3M6IGEgbWlzc2luZyBvciBjb3JydXB0IHJlY29yZCBpcyBhIGNhY2hlIE1JU1MsIHdoaWNoIGNvc3RzIGFcbiAqIGRvd25sb2FkIC0gd2hpbGUgbGV0dGluZyBpdCBmYWlsIHdvdWxkIHRha2UgYXBwIHN0YXJ0dXAgZG93biBvdmVyXG4gKiBib29ra2VlcGluZy5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gcmVhZE1ldGFkYXRhKGZzOiBGaWxlU3lzdGVtKTogUHJvbWlzZTxSZW1vdGVTa2lsbHNNZXRhZGF0YSB8IHVuZGVmaW5lZD4ge1xuICB0cnkge1xuICAgIGlmICghKGF3YWl0IGZzLmV4aXN0cyhNRVRBREFUQV9GSUxFKSkpIHJldHVybiB1bmRlZmluZWQ7XG4gICAgY29uc3QgcmF3ID0gYXdhaXQgZnMucmVhZEZpbGUoTUVUQURBVEFfRklMRSwgeyBlbmNvZGluZzogXCJ1dGY4XCIgfSk7XG4gICAgY29uc3QgcGFyc2VkID0ganNvbi5wYXJzZShyYXcsIHVuZGVmaW5lZCkgYXMgUmVtb3RlU2tpbGxzTWV0YWRhdGEgfCB1bmRlZmluZWQ7XG4gICAgaWYgKCFvYmplY3QuaXNSZWNvcmQocGFyc2VkKSB8fCBwYXJzZWQudmVyc2lvbiAhPT0gTUVUQURBVEFfVkVSU0lPTikgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICByZXR1cm4gb2JqZWN0LmlzUmVjb3JkKHBhcnNlZC5zb3VyY2VzKSA/IHBhcnNlZCA6IHVuZGVmaW5lZDtcbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgbG9nZ2VyLmRlYnVnKFwiY2FjaGU6dW5yZWFkYWJsZVwiLCB7IGVycm9yOiBlcnJvci5lcnJvck1lc3NhZ2UoZXJyKSB9KTtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG59XG5cbi8qKlxuICogV2hldGhlciBhbiBlbnRyeSBpcyBzdGlsbCBpbnNpZGUgaXRzIHJldXNlIHdpbmRvdy5cbiAqXG4gKiBBIGB0dGxNc2Agb2YgYDBgIGRpc2FibGVzIHJldXNlIG91dHJpZ2h0LCBhbmQgYW4gdW5wYXJzZWFibGUgb3IgRlVUVVJFXG4gKiB0aW1lc3RhbXAgY291bnRzIGFzIHN0YWxlIC0gYSBjbG9jayB0aGF0IG1vdmVkIGJhY2t3YXJkcyBzaG91bGQgY29zdCBvbmVcbiAqIGV4dHJhIGRvd25sb2FkLCBub3QgcGluIGEgdHJlZSBhcyBmcmVzaCBpbmRlZmluaXRlbHkuXG4gKi9cbmZ1bmN0aW9uIGlzRnJlc2goZW50cnk6IFJlbW90ZVNraWxsQ2FjaGVFbnRyeSwgdHRsTXM6IG51bWJlcik6IGJvb2xlYW4ge1xuICBpZiAodHRsTXMgPD0gMCB8fCAhQXJyYXkuaXNBcnJheShlbnRyeS5za2lsbHMpKSByZXR1cm4gZmFsc2U7XG4gIGNvbnN0IGRvd25sb2FkZWRBdCA9IG9iamVjdC50b0RhdGUoZW50cnkuZG93bmxvYWRlZEF0KTtcbiAgaWYgKCFkb3dubG9hZGVkQXQpIHJldHVybiBmYWxzZTtcbiAgY29uc3QgYWdlID0gRGF0ZS5ub3coKSAtIGRvd25sb2FkZWRBdC5nZXRUaW1lKCk7XG4gIHJldHVybiBhZ2UgPj0gMCAmJiBhZ2UgPCB0dGxNcztcbn1cblxuLyoqXG4gKiBNZXJnZSBvbmUgc291cmNlJ3MgZW50cnkgaW50byB0aGUgdHJlZSdzIG1ldGFkYXRhIGRvY3VtZW50LCBwcmVzZXJ2aW5nIHdoYXRcbiAqIG90aGVyIHNvdXJjZXMgcmVjb3JkZWQgLSB0aGUgRGF0YWJyaWNrcyBkZXN0aW5hdGlvbiBpcyBTSEFSRUQsIHNvIGEgYmxpbmRcbiAqIG92ZXJ3cml0ZSB3b3VsZCBkcm9wIGV2ZXJ5IHNpYmxpbmcgc291cmNlJ3MgdGltZXN0YW1wIGFuZCByZS1kb3dubG9hZCB0aGVcbiAqIGxvdCBvbiB0aGUgbmV4dCBib290LlxuICovXG5hc3luYyBmdW5jdGlvbiB3cml0ZU1ldGFkYXRhKFxuICBmczogRmlsZVN5c3RlbSxcbiAga2V5OiBzdHJpbmcsXG4gIGVudHJ5OiBSZW1vdGVTa2lsbENhY2hlRW50cnksXG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgY3VycmVudCA9IGF3YWl0IHJlYWRNZXRhZGF0YShmcyk7XG4gIGNvbnN0IG5leHQ6IFJlbW90ZVNraWxsc01ldGFkYXRhID0ge1xuICAgIHZlcnNpb246IE1FVEFEQVRBX1ZFUlNJT04sXG4gICAgc291cmNlczogeyAuLi5jdXJyZW50Py5zb3VyY2VzLCBba2V5XTogZW50cnkgfSxcbiAgfTtcbiAgYXdhaXQgZnMud3JpdGVGaWxlKE1FVEFEQVRBX0ZJTEUsIGAke0pTT04uc3RyaW5naWZ5KG5leHQsIG51bGwsIDIpfVxcbmAsIHsgb3ZlcndyaXRlOiB0cnVlIH0pO1xufVxuXG4vKiogVGhlIHN0YWJsZSBsb2NhbCB0cmVlIGEgc291cmNlIGlzIHJlYnVpbHQgaW50bywga2V5ZWQgYnkge0BsaW5rIGNhY2hlS2V5fS4gKi9cbmZ1bmN0aW9uIGxvY2FsU2tpbGxzRlMoa2V5OiBzdHJpbmcpOiBMb2NhbEZpbGVTeXN0ZW0ge1xuICByZXR1cm4gbG9jYWxGUy50bXBGUyhgJHtMT0NBTF9TS0lMTFNfRElSfS8ke2tleX1gKTtcbn1cblxuLyoqXG4gKiBNYXRlcmlhbGl6ZSBldmVyeSBjb25maWd1cmVkIHJlbW90ZSBza2lsbCBzb3VyY2UgYXQgYXBwIHN0YXJ0dXAuXG4gKlxuICogV3JpdGVzIGVhY2ggcmVzb2x2ZWQgYFNLSUxMLm1kYCB0cmVlIHRvIHRoZSBEYXRhYnJpY2tzIHVzZXIgQXNzaXN0YW50IHNraWxsc1xuICogZm9sZGVyIHdoZW4gYSB3cml0YWJsZSB3b3Jrc3BhY2UgaXMgYXZhaWxhYmxlLCBlbHNlIHVuZGVyXG4gKiB7QGxpbmsgbG9jYWxGUy50bXBGU30gcmV0dXJuZWQgaW4ge0BsaW5rIFByb3Zpc2lvbmVkUmVtb3RlU2tpbGxzLmxvY2FsU2tpbGxQYXRoc30uXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBwcm92aXNpb25SZW1vdGVTa2lsbHMoXG4gIG9wdGlvbjogUmVtb3RlU2tpbGxzT3B0aW9uIHwgdW5kZWZpbmVkLFxuKTogUHJvbWlzZTxQcm92aXNpb25lZFJlbW90ZVNraWxscz4ge1xuICBjb25zdCBvcHRpb25zID0gbm9ybWFsaXplUmVtb3RlU2tpbGxzT3B0aW9uKG9wdGlvbik7XG4gIGNvbnN0IGVtcHR5OiBQcm92aXNpb25lZFJlbW90ZVNraWxscyA9IHsgbG9jYWxTa2lsbFBhdGhzOiBbXSwgc2tpbGxOYW1lczogW10gfTtcbiAgaWYgKCFvcHRpb25zKSByZXR1cm4gZW1wdHk7XG5cbiAgY29uc3QgZmFpbERlZmF1bHQgPSBvcHRpb25zLmZhaWxPbkVycm9yICE9PSBmYWxzZTtcbiAgY29uc3QgY2xpZW50ID0gb3B0aW9ucy5jbGllbnQgPz8gYXBwa2l0LnRyeUdldEV4ZWN1dGlvbkNvbnRleHQoKT8uY2xpZW50O1xuICAvLyBQcm9iZWQgcmF0aGVyIHRoYW4gYXNzdW1lZDogYW4gaWRlbnRpdHkgdGhhdCBjYW5ub3Qgd3JpdGUgdGhlIHdvcmtzcGFjZVxuICAvLyB0cmVlIGZhbGxzIGJhY2sgdG8gdGhlIGxvY2FsIG9uZSBpbnN0ZWFkIG9mIGZhaWxpbmcgc3RhcnR1cC4gVGhlIHByb2JlIGFsc29cbiAgLy8gY3JlYXRlcyB0aGUgcm9vdCwgd2hpY2ggdGhlIGZpcnN0IGNhY2hlIFJFQUQgbmVlZHMgLSBgY29weVNraWxsRGlyc2Agd291bGRcbiAgLy8gb3RoZXJ3aXNlIGJlIHRoZSBmaXJzdCB0aGluZyB0byBjcmVhdGUgaXQsIHdoaWNoIGlzIHRvbyBsYXRlLlxuICBjb25zdCByZXF1ZXN0ZWRCYXNlUGF0aCA9IHJlc29sdmVEYXRhYnJpY2tzQmFzZVBhdGgob3B0aW9ucywgY2xpZW50KTtcbiAgY29uc3QgZGVzdGluYXRpb24gPSByZXF1ZXN0ZWRCYXNlUGF0aFxuICAgID8gYXdhaXQgb3BlbldyaXRhYmxlV29ya3NwYWNlKHJlcXVlc3RlZEJhc2VQYXRoLCBjbGllbnQgYXMgV29ya3NwYWNlQ2xpZW50KVxuICAgIDogdW5kZWZpbmVkO1xuICBjb25zdCBkYXRhYnJpY2tzQmFzZVBhdGggPSBkZXN0aW5hdGlvbiA/IHJlcXVlc3RlZEJhc2VQYXRoIDogdW5kZWZpbmVkO1xuXG4gIGNvbnN0IGxvY2FsU2tpbGxQYXRoczogc3RyaW5nW10gPSBbXTtcbiAgY29uc3Qgc2tpbGxOYW1lczogc3RyaW5nW10gPSBbXTtcbiAgbGV0IHN0YWdpbmc6IExvY2FsRmlsZVN5c3RlbSB8IHVuZGVmaW5lZDtcblxuICB0cnkge1xuICAgIGNvbnN0IHNvdXJjZXMgPSBBcnJheS5pc0FycmF5KG9wdGlvbnMuc291cmNlcykgPyBvcHRpb25zLnNvdXJjZXMgOiBbb3B0aW9ucy5zb3VyY2VzXTtcbiAgICBmb3IgKGNvbnN0IGVudHJ5IG9mIHNvdXJjZXMpIHtcbiAgICAgIGNvbnN0IHNvdXJjZU9wdGlvbnMgPSB0b1NvdXJjZU9wdGlvbnMoZW50cnkpO1xuICAgICAgY29uc3QgZmFpbE9uRXJyb3IgPSBzb3VyY2VPcHRpb25zLmZhaWxPbkVycm9yID8/IGZhaWxEZWZhdWx0O1xuICAgICAgdHJ5IHtcbiAgICAgICAgLy8gV2hlcmUgdGhpcyBzb3VyY2UncyBib29ra2VlcGluZyBsaXZlczogdGhlIHNoYXJlZCBEYXRhYnJpY2tzIHRyZWUsIG9yXG4gICAgICAgIC8vIHRoZSBzb3VyY2UncyBvd24gc3RhYmxlIGxvY2FsIGRpci5cbiAgICAgICAgY29uc3Qga2V5ID0gY2FjaGVLZXkoc291cmNlT3B0aW9ucyk7XG4gICAgICAgIGNvbnN0IGNhY2hlRlMgPSBkZXN0aW5hdGlvbiA/PyBsb2NhbFNraWxsc0ZTKGtleSk7XG4gICAgICAgIGNvbnN0IGNhY2hlZCA9IChhd2FpdCByZWFkTWV0YWRhdGEoY2FjaGVGUykpPy5zb3VyY2VzW2tleV07XG4gICAgICAgIGlmIChjYWNoZWQgJiYgaXNGcmVzaChjYWNoZWQsIHJlc29sdmVSZWZyZXNoVHRsKHNvdXJjZU9wdGlvbnMsIG9wdGlvbnMpKSkge1xuICAgICAgICAgIHNraWxsTmFtZXMucHVzaCguLi5jYWNoZWQuc2tpbGxzKTtcbiAgICAgICAgICBpZiAoIWRlc3RpbmF0aW9uKSBsb2NhbFNraWxsUGF0aHMucHVzaChjYWNoZUZTLnJvb3QpO1xuICAgICAgICAgIGxvZ2dlci5pbmZvKFwicmVtb3RlIHNraWxsIHJlYWR5XCIsIHtcbiAgICAgICAgICAgIHNvdXJjZTogc291cmNlT3B0aW9ucy5zb3VyY2UsXG4gICAgICAgICAgICBkZXN0aW5hdGlvbjogZGF0YWJyaWNrc0Jhc2VQYXRoID8/IGNhY2hlRlMucm9vdCxcbiAgICAgICAgICAgIGRvd25sb2FkZWRBdDogY2FjaGVkLmRvd25sb2FkZWRBdCxcbiAgICAgICAgICAgIHNraWxsczogY2FjaGVkLnNraWxscyxcbiAgICAgICAgICAgIGNhY2hlZDogdHJ1ZSxcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxvZ2dlci5pbmZvKFwiaW5zdGFsbGluZyByZW1vdGUgc2tpbGxcIiwge1xuICAgICAgICAgIHNvdXJjZTogc291cmNlT3B0aW9ucy5zb3VyY2UsXG4gICAgICAgIH0pO1xuICAgICAgICBzdGFnaW5nID8/PSBhd2FpdCBpbml0aWFsaXplZFNjcmF0Y2goXCJtYXN0cmEtcmVtb3RlLXNraWxsc1wiKTtcbiAgICAgICAgY29uc3Qgc3RhZ2VkRGlyID0gYXdhaXQgc3RhZ2VTb3VyY2Uoc291cmNlT3B0aW9ucywgc3RhZ2luZy5yb290LCBvcHRpb25zKTtcbiAgICAgICAgY29uc3Qgc3RhZ2VkID0gYXdhaXQgY29sbGVjdFNraWxsRGlycyhzdGFnZWREaXIpO1xuICAgICAgICBpZiAoc3RhZ2VkLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgbm8gU0tJTEwubWQgZm91bmQgZm9yIHNvdXJjZSBcIiR7c291cmNlT3B0aW9ucy5zb3VyY2V9XCJgKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBwb2xpY3kgPSBjYWNoZVBvbGljeShzb3VyY2VPcHRpb25zKTtcbiAgICAgICAgY29uc3QgcmVjb3JkOiBSZW1vdGVTa2lsbENhY2hlRW50cnkgPSB7XG4gICAgICAgICAgc291cmNlOiBzb3VyY2VPcHRpb25zLnNvdXJjZSxcbiAgICAgICAgICBkb3dubG9hZGVkQXQ6IG5ldyBEYXRlKCkudG9JU09TdHJpbmcoKSxcbiAgICAgICAgICBza2lsbHM6IHN0YWdlZC5tYXAoKGRpcikgPT4gZGlyLm5hbWUpLFxuICAgICAgICAgIC4uLihwb2xpY3kgPyB7IHBvbGljeSB9IDoge30pLFxuICAgICAgICB9O1xuICAgICAgICBpZiAoZGVzdGluYXRpb24gJiYgZGF0YWJyaWNrc0Jhc2VQYXRoKSB7XG4gICAgICAgICAgYXdhaXQgY29weVNraWxsRGlycyhkZXN0aW5hdGlvbiwgc3RhZ2VkKTtcbiAgICAgICAgICAvLyBPbmx5IGFmdGVyIHRoZSBjb3B5IGxhbmRzOiBhIG1ldGFkYXRhIGVudHJ5IHdyaXR0ZW4gZmlyc3Qgd291bGRcbiAgICAgICAgICAvLyBtYXJrIGEgZmFpbGVkIHByb3Zpc2lvbiBhcyBmcmVzaCBhbmQgc3VwcHJlc3MgdGhlIHJldHJ5IGZvciBhIGRheS5cbiAgICAgICAgICBhd2FpdCB3cml0ZU1ldGFkYXRhKGRlc3RpbmF0aW9uLCBrZXksIHJlY29yZCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgbG9jYWxTa2lsbFBhdGhzLnB1c2goYXdhaXQgcGVyc2lzdExvY2FsbHkoa2V5LCBzdGFnZWQsIHJlY29yZCkpO1xuICAgICAgICB9XG4gICAgICAgIHNraWxsTmFtZXMucHVzaCguLi5yZWNvcmQuc2tpbGxzKTtcbiAgICAgICAgbG9nZ2VyLmluZm8oXCJyZW1vdGUgc2tpbGwgaW5zdGFsbGVkXCIsIHtcbiAgICAgICAgICBzb3VyY2U6IHNvdXJjZU9wdGlvbnMuc291cmNlLFxuICAgICAgICAgIGRlc3RpbmF0aW9uOiBkYXRhYnJpY2tzQmFzZVBhdGggPz8gbG9jYWxTa2lsbFBhdGhzLmF0KC0xKSxcbiAgICAgICAgICBza2lsbHM6IHJlY29yZC5za2lsbHMsXG4gICAgICAgIH0pO1xuICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgIGlmIChmYWlsT25FcnJvcikge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAgIGBmYWlsZWQgdG8gcHJvdmlzaW9uIHJlbW90ZSBza2lsbCBzb3VyY2UgXCIke3NvdXJjZU9wdGlvbnMuc291cmNlfVwiOiAke2Vycm9yLmVycm9yTWVzc2FnZShlcnIpfWAsXG4gICAgICAgICAgICB7IGNhdXNlOiBlcnJvci50b0Vycm9yKGVycikgfSxcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICAgIGxvZ2dlci53YXJuKFwic291cmNlOnNraXBwZWRcIiwge1xuICAgICAgICAgIHNvdXJjZTogc291cmNlT3B0aW9ucy5zb3VyY2UsXG4gICAgICAgICAgZXJyb3I6IGVycm9yLmVycm9yTWVzc2FnZShlcnIpLFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG4gIH0gZmluYWxseSB7XG4gICAgaWYgKHN0YWdpbmcpIHtcbiAgICAgIGF3YWl0IHJtKHN0YWdpbmcucm9vdCwgeyByZWN1cnNpdmU6IHRydWUsIGZvcmNlOiB0cnVlIH0pLmNhdGNoKCgpID0+IHVuZGVmaW5lZCk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHsgbG9jYWxTa2lsbFBhdGhzLCBkYXRhYnJpY2tzQmFzZVBhdGgsIHNraWxsTmFtZXMgfTtcbn1cblxuLyoqIFByb2JlIGZpbGUge0BsaW5rIG9wZW5Xcml0YWJsZVdvcmtzcGFjZX0gd3JpdGVzIGFuZCByZW1vdmVzLiAqL1xuY29uc3QgV1JJVEVfUFJPQkVfRklMRSA9IFwiLmRieC10b29scy13cml0ZS1wcm9iZVwiO1xuXG4vKipcbiAqIE9wZW4gdGhlIERhdGFicmlja3Mgc2tpbGxzIGRlc3RpbmF0aW9uLCBvciBgdW5kZWZpbmVkYCB3aGVuIHRoaXMgaWRlbnRpdHlcbiAqIGNhbm5vdCB3cml0ZSB0aGVyZS5cbiAqXG4gKiBUaGUgZGVmYXVsdCBkZXN0aW5hdGlvbiAoYC9Xb3Jrc3BhY2UvLmFzc2lzdGFudC9za2lsbHNgKSBpcyBjb21tb25seVxuICogYWRtaW5zLW9ubHksIGFuZCBhbiBhcHAgc2VydmljZSBwcmluY2lwYWwgaXMgbm90IGFuIGFkbWluIC0gc28gYSBEYXRhYnJpY2tzXG4gKiBBcHAgd3JpdGluZyB0aGVyZSBmYWlscyB3aXRoIGBSRVNPVVJDRV9ET0VTX05PVF9FWElTVGAsIHdoaWNoIGlzIGhvdyB0aGVcbiAqIHdvcmtzcGFjZSBBUEkgcmVwb3J0cyBhIHBhdGggdGhlIGNhbGxlciBpcyBub3QgYWxsb3dlZCB0byBzZWUuIFRoYXQgaXMgYSBmYWN0XG4gKiBhYm91dCBXSEVSRSB0aGUgdHJlZSBpcyBzdG9yZWQsIG5vdCBhYm91dCB3aGV0aGVyIHRoZSBza2lsbHMgYXJlIHVzYWJsZSwgc28gaXRcbiAqIGRlZ3JhZGVzIHRvIHRoZSBsb2NhbCB0cmVlIChoYW5kZWQgdG8gTWFzdHJhIGFzIGFuIGV4dHJhIHNjYW4gcGF0aCkgcmF0aGVyXG4gKiB0aGFuIHRha2luZyBhcHAgc3RhcnR1cCBkb3duIG92ZXIgYm9va2tlZXBpbmcgbG9jYXRpb24uXG4gKlxuICogVGhlIHByb2JlIGlzIGEgcmVhbCB3cml0ZTogYG1rZGlyc2Agc3VjY2VlZHMgb24gYW4gZXhpc3RpbmcgZGlyZWN0b3J5IGV2ZW4gZm9yXG4gKiBhbiBpZGVudGl0eSB0aGF0IGNhbm5vdCB3cml0ZSBpbnRvIGl0LCBzbyBpbml0IGFsb25lIHByb3ZlcyBub3RoaW5nLiBSZW1vdmluZ1xuICogdGhlIHByb2JlIGZpbGUgaXMgYmVzdC1lZmZvcnQgLSBhIGZhaWxlZCBjbGVhbnVwIG11c3Qgbm90IGRlY2lkZSB3cml0YWJpbGl0eS5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gb3BlbldyaXRhYmxlV29ya3NwYWNlKFxuICBiYXNlUGF0aDogc3RyaW5nLFxuICBjbGllbnQ6IFdvcmtzcGFjZUNsaWVudCxcbik6IFByb21pc2U8RGF0YWJyaWNrc0ZpbGVTeXN0ZW0gfCB1bmRlZmluZWQ+IHtcbiAgY29uc3QgZnMgPSBuZXcgRGF0YWJyaWNrc0ZpbGVTeXN0ZW0oe1xuICAgIGNsaWVudDogZGF0YWJyaWNrc1dvcmtzcGFjZS50b0xlZ2FjeVdvcmtzcGFjZUNsaWVudChjbGllbnQpLFxuICAgIHJvb3Q6IGJhc2VQYXRoLFxuICAgIHJlYWRPbmx5OiBmYWxzZSxcbiAgICBjcmVhdGVSb290OiB0cnVlLFxuICB9KTtcbiAgdHJ5IHtcbiAgICBhd2FpdCBmcy5pbml0KCk7XG4gICAgYXdhaXQgZnMud3JpdGVGaWxlKFdSSVRFX1BST0JFX0ZJTEUsIG5ldyBEYXRlKCkudG9JU09TdHJpbmcoKSwgeyBvdmVyd3JpdGU6IHRydWUgfSk7XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIGxvZ2dlci53YXJuKFwiZGVzdGluYXRpb246dW53cml0YWJsZVwiLCB7XG4gICAgICBkZXN0aW5hdGlvbjogYmFzZVBhdGgsXG4gICAgICBlcnJvcjogZXJyb3IuZXJyb3JNZXNzYWdlKGVyciksXG4gICAgfSk7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuICBhd2FpdCBmcy5kZWxldGVGaWxlKFdSSVRFX1BST0JFX0ZJTEUsIHsgZm9yY2U6IHRydWUgfSkuY2F0Y2goKCkgPT4gdW5kZWZpbmVkKTtcbiAgcmV0dXJuIGZzO1xufVxuXG4vKiogUmVzb2x2ZSB0aGUgRGF0YWJyaWNrcyBBc3Npc3RhbnQgc2tpbGxzIGRlc3RpbmF0aW9uLCBvciBgdW5kZWZpbmVkYCBmb3IgbG9jYWwgdGVtcC4gKi9cbmZ1bmN0aW9uIHJlc29sdmVEYXRhYnJpY2tzQmFzZVBhdGgoXG4gIG9wdGlvbnM6IFByb3Zpc2lvblJlbW90ZVNraWxsc09wdGlvbnMsXG4gIGNsaWVudDogV29ya3NwYWNlQ2xpZW50TGlrZSB8IHVuZGVmaW5lZCxcbik6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIGlmICghY2xpZW50KSByZXR1cm4gdW5kZWZpbmVkO1xuICBpZiAob3B0aW9ucy5kYXRhYnJpY2tzQmFzZVBhdGgpIHJldHVybiBvcHRpb25zLmRhdGFicmlja3NCYXNlUGF0aC50cmltKCkgfHwgdW5kZWZpbmVkO1xuICBjb25zdCBlbWFpbCA9IHN0cmluZy50cmltVG9OdWxsKG9wdGlvbnMudXNlckVtYWlsKTtcbiAgLy8gQSBuYW1lZCB1c2VyIHRhcmdldHMgdGhlaXIgcGVyc29uYWwgQXNzaXN0YW50IHRyZWUgKHRoZSBcInNhdmUgYSBza2lsbFwiXG4gIC8vIHRhcmdldCk7IG90aGVyd2lzZSB0aGUgc2hhcmVkIHdvcmtzcGFjZSBBc3Npc3RhbnQgdHJlZSwgd2hpY2ggdGhlIGJ1aWx0LWluXG4gIC8vIEFzc2lzdGFudC1za2lsbHMgbW91bnQgYWxyZWFkeSBzY2Fucy5cbiAgcmV0dXJuIGVtYWlsID8gdXNlckFzc2lzdGFudFNraWxsc1BhdGgoZW1haWwpIDogQVNTSVNUQU5UX1NIQVJFRF9TS0lMTFNfUEFUSDtcbn1cblxuLyoqXG4gKiBTdGFnZSBvbmUgc291cmNlIGludG8gYSBmcmVzaCBkaXIgdW5kZXIgYHN0YWdpbmdSb290YCwgcHJlZmVycmluZyB0aGUgb3B0aW9uYWxcbiAqIGBza2lsbHNgIENMSSBhbmQgZmFsbGluZyBiYWNrIHRvIGEgZGlyZWN0IGZldGNoLlxuICovXG5hc3luYyBmdW5jdGlvbiBzdGFnZVNvdXJjZShcbiAgc291cmNlT3B0aW9uczogTm9ybWFsaXplZFNvdXJjZSxcbiAgc3RhZ2luZ1Jvb3Q6IHN0cmluZyxcbiAgb3B0aW9uczogUHJvdmlzaW9uUmVtb3RlU2tpbGxzT3B0aW9ucyxcbik6IFByb21pc2U8c3RyaW5nPiB7XG4gIGNvbnN0IHRhcmdldCA9IGpvaW4oc3RhZ2luZ1Jvb3QsIGBzcmMtJHtoYXNoLmlkKCl9YCk7XG4gIGF3YWl0IG1rZGlyKHRhcmdldCwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG4gIC8vIEFJIFRvb2xzIHJlc29sdmVzIGZyb20gYSBrbm93biByZXBvIGxheW91dCwgc28gaXQgbmV2ZXIgbmVlZHMgdGhlIENMSS5cbiAgaWYgKGlzQWlUb29sc1NvdXJjZShzb3VyY2VPcHRpb25zLnNvdXJjZSkpIHJldHVybiBzdGFnZUFpVG9vbHMoc291cmNlT3B0aW9ucywgdGFyZ2V0LCBvcHRpb25zKTtcbiAgY29uc3QgdmlhQ2xpID0gYXdhaXQgc3RhZ2VWaWFTa2lsbHNDbGkoc291cmNlT3B0aW9ucywgdGFyZ2V0KTtcbiAgaWYgKHZpYUNsaSkgcmV0dXJuIHZpYUNsaTtcbiAgcmV0dXJuIHN0YWdlVmlhRmV0Y2goc291cmNlT3B0aW9ucywgdGFyZ2V0LCBvcHRpb25zKTtcbn1cblxuLyoqXG4gKiBNYXRlcmlhbGl6ZSB0aGUgRGF0YWJyaWNrcyBBSSBUb29scyBza2lsbHMgaW50byBgdGFyZ2V0YC5cbiAqXG4gKiBSZWFkcyB0aGUgcmVwbydzIG93biBnZW5lcmF0ZWQgYG1hbmlmZXN0Lmpzb25gICh3aGljaCBuYW1lcyBlYWNoIHNraWxsJ3NcbiAqIGZpbGVzIGFuZCB3aGV0aGVyIGl0IGxpdmVzIHVuZGVyIGBza2lsbHMvYCBvciBgZXhwZXJpbWVudGFsL2ApIGFuZCBkb3dubG9hZHNcbiAqIHRoZW0gLSB0aGUgc2FtZSB0aGluZyBgZGF0YWJyaWNrcyBhaXRvb2xzIGluc3RhbGxgIGRvZXMsIG1pbnVzIHRoZSBDTEkgYW5kXG4gKiBtaW51cyBhbnkgRGF0YWJyaWNrcyBhdXRoLCBzaW5jZSB0aGUgcmVwbyBpcyBwdWJsaWMuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIHN0YWdlQWlUb29scyhcbiAgc291cmNlT3B0aW9uczogTm9ybWFsaXplZFNvdXJjZSxcbiAgdGFyZ2V0OiBzdHJpbmcsXG4gIG9wdGlvbnM6IFByb3Zpc2lvblJlbW90ZVNraWxsc09wdGlvbnMsXG4pOiBQcm9taXNlPHN0cmluZz4ge1xuICBjb25zdCBtYXhCeXRlcyA9IHJlc29sdmVNYXhCeXRlcyhzb3VyY2VPcHRpb25zLCBvcHRpb25zKTtcbiAgY29uc3QgcmVmID0gc3RyaW5nLnRyaW1Ub051bGwoc291cmNlT3B0aW9ucy5yZWYpID8/IEFJVE9PTFNfUkVGO1xuICBjb25zdCBtYW5pZmVzdCA9IGpzb24ucGFyc2UoXG4gICAgKGF3YWl0IGRvd25sb2FkKGFpVG9vbHNSYXdVcmwocmVmLCBcIm1hbmlmZXN0Lmpzb25cIiksIG1heEJ5dGVzKSkudG9TdHJpbmcoXCJ1dGY4XCIpLFxuICAgIHVuZGVmaW5lZCxcbiAgKSBhcyBBaVRvb2xzTWFuaWZlc3QgfCB1bmRlZmluZWQ7XG5cbiAgY29uc3Qgd2FudGVkID0gbmV3IFNldChzdHJpbmcucGFyc2VMaXN0KHNvdXJjZU9wdGlvbnMuc2tpbGxzKSk7XG4gIGNvbnN0IHNlbGVjdGVkID0gT2JqZWN0LmVudHJpZXMobWFuaWZlc3Q/LnNraWxscyA/PyB7fSkuZmlsdGVyKChbbmFtZSwgZW50cnldKSA9PlxuICAgIHdhbnRlZC5zaXplID4gMFxuICAgICAgPyB3YW50ZWQuaGFzKG5hbWUpXG4gICAgICA6IGVudHJ5LnJlcG9fZGlyICE9PSBcImV4cGVyaW1lbnRhbFwiIHx8IHNvdXJjZU9wdGlvbnMuZXhwZXJpbWVudGFsID09PSB0cnVlLFxuICApO1xuICBpZiAoc2VsZWN0ZWQubGVuZ3RoID09PSAwKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBubyBtYXRjaGluZyBza2lsbHMgaW4gJHtBSVRPT0xTX1JFUE99QCR7cmVmfWApO1xuICB9XG5cbiAgY29uc3QgZmlsZXMgPSBzZWxlY3RlZC5mbGF0TWFwKChbbmFtZSwgZW50cnldKSA9PlxuICAgIChlbnRyeS5maWxlcyA/PyBbXSkubWFwKChmaWxlKSA9PiAoe1xuICAgICAgdXJsOiBhaVRvb2xzUmF3VXJsKHJlZiwgYCR7ZW50cnkucmVwb19kaXIgPz8gXCJza2lsbHNcIn0vJHtuYW1lfS8ke2ZpbGV9YCksXG4gICAgICBwYXRoOiBqb2luKHRhcmdldCwgbmFtZSwgLi4uZmlsZS5zcGxpdChcIi9cIikpLFxuICAgIH0pKSxcbiAgKTtcbiAgYXdhaXQgbWFwQ29uY3VycmVudChmaWxlcywgQUlUT09MU19DT05DVVJSRU5DWSwgYXN5bmMgKGl0ZW0pID0+IHtcbiAgICBjb25zdCBib2R5ID0gYXdhaXQgZG93bmxvYWQoaXRlbS51cmwsIG1heEJ5dGVzKTtcbiAgICBhd2FpdCBta2RpcihkaXJuYW1lKGl0ZW0ucGF0aCksIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICAgIGF3YWl0IHdyaXRlRmlsZShpdGVtLnBhdGgsIGJvZHkpO1xuICB9KTtcblxuICBsb2dnZXIuZGVidWcoXCJhaXRvb2xzOnN0YWdlZFwiLCB7IHJlZiwgc2tpbGxzOiBzZWxlY3RlZC5sZW5ndGgsIGZpbGVzOiBmaWxlcy5sZW5ndGggfSk7XG4gIHJldHVybiB0YXJnZXQ7XG59XG5cbi8qKiBSYXctY29udGVudCBVUkwgZm9yIGEgcGF0aCBpbiB0aGUgQUkgVG9vbHMgcmVwbyBhdCBgcmVmYC4gKi9cbmZ1bmN0aW9uIGFpVG9vbHNSYXdVcmwocmVmOiBzdHJpbmcsIHBhdGg6IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiBgaHR0cHM6Ly9yYXcuZ2l0aHVidXNlcmNvbnRlbnQuY29tLyR7QUlUT09MU19SRVBPfS8ke3JlZn0vJHtwYXRofWA7XG59XG5cbi8qKiBSdW4gYHdvcmtlcmAgb3ZlciBgaXRlbXNgLCBhdCBtb3N0IGBsaW1pdGAgaW4gZmxpZ2h0LiAqL1xuYXN5bmMgZnVuY3Rpb24gbWFwQ29uY3VycmVudDxUPihcbiAgaXRlbXM6IHJlYWRvbmx5IFRbXSxcbiAgbGltaXQ6IG51bWJlcixcbiAgd29ya2VyOiAoaXRlbTogVCkgPT4gUHJvbWlzZTx2b2lkPixcbik6IFByb21pc2U8dm9pZD4ge1xuICBsZXQgY3Vyc29yID0gMDtcbiAgY29uc3QgcnVubmVycyA9IEFycmF5LmZyb20oeyBsZW5ndGg6IE1hdGgubWluKGxpbWl0LCBpdGVtcy5sZW5ndGgpIH0sIGFzeW5jICgpID0+IHtcbiAgICB3aGlsZSAoY3Vyc29yIDwgaXRlbXMubGVuZ3RoKSB7XG4gICAgICBhd2FpdCB3b3JrZXIoaXRlbXNbY3Vyc29yKytdISk7XG4gICAgfVxuICB9KTtcbiAgYXdhaXQgUHJvbWlzZS5hbGwocnVubmVycyk7XG59XG5cbi8qKlxuICogQ29weSBhIHNvdXJjZSBpbnRvIGB0YXJnZXRgIHdpdGggdGhlIGBza2lsbHNgIENMSSB3aGVuIGl0IGlzIGluc3RhbGxlZC5cbiAqIFJldHVybnMgdGhlIGRpciBob2xkaW5nIHRoZSBjb3BpZWQgYFNLSUxMLm1kYCB0cmVlcywgb3IgYHVuZGVmaW5lZGAgd2hlbiB0aGVcbiAqIENMSSBpcyBhYnNlbnQgKHNvIHRoZSBjYWxsZXIgY2FuIGZhbGwgYmFjayB0byBhIGZldGNoKS5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gc3RhZ2VWaWFTa2lsbHNDbGkoXG4gIHNvdXJjZU9wdGlvbnM6IE5vcm1hbGl6ZWRTb3VyY2UsXG4gIHRhcmdldDogc3RyaW5nLFxuKTogUHJvbWlzZTxzdHJpbmcgfCB1bmRlZmluZWQ+IHtcbiAgY29uc3QgY2xpID0gYXdhaXQgcmVzb2x2ZVNraWxsc0NsaSgpO1xuICBpZiAoIWNsaSkgcmV0dXJuIHVuZGVmaW5lZDtcblxuICBjb25zdCBhcmdzID0gW1xuICAgIC4uLmNsaS5hcmdzLFxuICAgIFwiYWRkXCIsXG4gICAgc291cmNlT3B0aW9ucy5zb3VyY2UsXG4gICAgXCItLWFnZW50XCIsXG4gICAgU0tJTExTX0NMSV9BR0VOVCxcbiAgICBcIi0tY29weVwiLFxuICAgIFwiLXlcIixcbiAgXTtcbiAgZm9yIChjb25zdCBza2lsbCBvZiBzdHJpbmcucGFyc2VMaXN0KHNvdXJjZU9wdGlvbnMuc2tpbGxzKSkge1xuICAgIGFyZ3MucHVzaChcIi0tc2tpbGxcIiwgc2tpbGwpO1xuICB9XG4gIGlmIChzdHJpbmcucGFyc2VMaXN0KHNvdXJjZU9wdGlvbnMuc2tpbGxzKS5sZW5ndGggPT09IDApIGFyZ3MucHVzaChcIi0tc2tpbGxcIiwgXCIqXCIpO1xuXG4gIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGV4ZWMuc3Bhd24oY2xpLmNvbW1hbmQsIGFyZ3MsIHtcbiAgICBjd2Q6IHRhcmdldCxcbiAgICBzdGRvdXQ6IFwiY2FwdHVyZVwiLFxuICAgIHN0ZGVycjogXCJjYXB0dXJlXCIsXG4gICAgY2hlY2s6IGZhbHNlLFxuICB9KTtcbiAgaWYgKHJlc3VsdC5leGl0Q29kZSAhPT0gMCkge1xuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgIGBza2lsbHMgQ0xJIGZhaWxlZCAoZXhpdCAke3Jlc3VsdC5leGl0Q29kZX0pOiAke3Jlc3VsdC5zdGRlcnIgfHwgcmVzdWx0LnN0ZG91dH1gLFxuICAgICk7XG4gIH1cbiAgcmV0dXJuIGpvaW4odGFyZ2V0LCAuLi5TS0lMTFNfQ0xJX0xBWU9VVCk7XG59XG5cbi8qKlxuICogTG9jYXRlIHRoZSBvcHRpb25hbCBgc2tpbGxzYCBDTEkgYmluLCByZXNvbHZlZCBmcm9tIFRISVMgcGFja2FnZSdzIG1vZHVsZVxuICogZ3JhcGguIFJldHVybnMgYHVuZGVmaW5lZGAgd2hlbiB0aGUgcGVlciBkZXAgaXNuJ3QgaW5zdGFsbGVkLCBzbyB0aGUgY2FsbGVyXG4gKiBmYWxscyBiYWNrIHRvIGEgZGlyZWN0IGZldGNoLlxuICovXG5hc3luYyBmdW5jdGlvbiByZXNvbHZlU2tpbGxzQ2xpKCk6IFByb21pc2U8eyBjb21tYW5kOiBzdHJpbmc7IGFyZ3M6IHN0cmluZ1tdIH0gfCB1bmRlZmluZWQ+IHtcbiAgdHJ5IHtcbiAgICBjb25zdCByZXF1aXJlID0gY3JlYXRlUmVxdWlyZShpbXBvcnQubWV0YS51cmwpO1xuICAgIGNvbnN0IHBrZ1BhdGggPSByZXF1aXJlLnJlc29sdmUoXCJza2lsbHMvcGFja2FnZS5qc29uXCIpO1xuICAgIGNvbnN0IGJpbiA9IGpvaW4ocGtnUGF0aCwgXCIuLlwiLCBcImJpblwiLCBcImNsaS5tanNcIik7XG4gICAgaWYgKGF3YWl0IHBhdGhFeGlzdHMoYmluKSkgcmV0dXJuIHsgY29tbWFuZDogcHJvY2Vzcy5leGVjUGF0aCwgYXJnczogW2Jpbl0gfTtcbiAgfSBjYXRjaCB7XG4gICAgLy8gcGVlciBkZXAgYWJzZW50IG9yIHVucmVzb2x2YWJsZSAtIGZldGNoIGZhbGxiYWNrIGhhbmRsZXMgaXRcbiAgfVxuICByZXR1cm4gdW5kZWZpbmVkO1xufVxuXG4vKipcbiAqIEZldGNoIGEgc291cmNlIFVSTCBhbmQgd3JpdGUgdGhlIGRvd25sb2FkZWQgYFNLSUxMLm1kYCB1bmRlciBgdGFyZ2V0YC5cbiAqIFVzZWQgd2hlbiB0aGUgYHNraWxsc2AgQ0xJIGlzbid0IGluc3RhbGxlZDsgc3VwcG9ydHMgYSBkaXJlY3QgYFNLSUxMLm1kYCBVUkwuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIHN0YWdlVmlhRmV0Y2goXG4gIHNvdXJjZU9wdGlvbnM6IE5vcm1hbGl6ZWRTb3VyY2UsXG4gIHRhcmdldDogc3RyaW5nLFxuICBvcHRpb25zOiBQcm92aXNpb25SZW1vdGVTa2lsbHNPcHRpb25zLFxuKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgY29uc3QgdXJsID0gbmV0LnVybEJ1aWxkZXIoc291cmNlT3B0aW9ucy5zb3VyY2UpO1xuICBpZiAoIXVybCkge1xuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgIGBzb3VyY2UgXCIke3NvdXJjZU9wdGlvbnMuc291cmNlfVwiIGlzIG5vdCBhIFVSTCBhbmQgdGhlIG9wdGlvbmFsIFwic2tpbGxzXCIgcGFja2FnZSBpcyBub3QgaW5zdGFsbGVkYCxcbiAgICApO1xuICB9XG4gIGNvbnN0IGJ1ZmZlciA9IGF3YWl0IGRvd25sb2FkKHVybC50b1N0cmluZygpLCByZXNvbHZlTWF4Qnl0ZXMoc291cmNlT3B0aW9ucywgb3B0aW9ucykpO1xuICBjb25zdCBuYW1lID0gc3RyaW5nLnRvU2x1ZyhkZXJpdmVTa2lsbE5hbWUodXJsLnRvU3RyaW5nKCkpKSB8fCBcInJlbW90ZS1za2lsbFwiO1xuICBjb25zdCBza2lsbERpciA9IGpvaW4odGFyZ2V0LCBuYW1lKTtcbiAgYXdhaXQgbWtkaXIoc2tpbGxEaXIsIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICBhd2FpdCB3cml0ZUZpbGUoam9pbihza2lsbERpciwgXCJTS0lMTC5tZFwiKSwgYnVmZmVyKTtcbiAgcmV0dXJuIHRhcmdldDtcbn1cblxuLyoqIFRoZSBlZmZlY3RpdmUgZG93bmxvYWQgY2VpbGluZzogcGVyLXNvdXJjZSwgdGhlbiB0b3AtbGV2ZWwsIHRoZW4gdGhlIGRlZmF1bHQuICovXG5mdW5jdGlvbiByZXNvbHZlTWF4Qnl0ZXMoXG4gIHNvdXJjZU9wdGlvbnM6IE5vcm1hbGl6ZWRTb3VyY2UsXG4gIG9wdGlvbnM6IFByb3Zpc2lvblJlbW90ZVNraWxsc09wdGlvbnMsXG4pOiBudW1iZXIge1xuICByZXR1cm4gc291cmNlT3B0aW9ucy5tYXhEb3dubG9hZEJ5dGVzID8/IG9wdGlvbnMubWF4RG93bmxvYWRCeXRlcyA/PyBERUZBVUxUX01BWF9ET1dOTE9BRF9CWVRFUztcbn1cblxuLyoqIEdFVCBhIFVSTCwgZmFpbGluZyBsb3VkbHkgb24gYSBub24tMnh4IHN0YXR1cyBvciBhbiBvdmVyc2l6ZWQgYm9keS4gKi9cbmFzeW5jIGZ1bmN0aW9uIGRvd25sb2FkKHVybDogc3RyaW5nLCBtYXhCeXRlczogbnVtYmVyKTogUHJvbWlzZTxCdWZmZXI+IHtcbiAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaCh1cmwsIHtcbiAgICBzaWduYWw6IEFib3J0U2lnbmFsLnRpbWVvdXQoREVGQVVMVF9ET1dOTE9BRF9USU1FT1VUX01TKSxcbiAgfSkuY2F0Y2goKGVycikgPT4ge1xuICAgIHRocm93IG5ldyBFcnJvcihgZG93bmxvYWQgZmFpbGVkICgke3VybH0pOiAke2Vycm9yLmVycm9yTWVzc2FnZShlcnIpfWAsIHtcbiAgICAgIGNhdXNlOiBlcnJvci50b0Vycm9yKGVyciksXG4gICAgfSk7XG4gIH0pO1xuICBpZiAoIXJlc3BvbnNlLm9rKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBkb3dubG9hZCBmYWlsZWQ6ICR7cmVzcG9uc2Uuc3RhdHVzfSAke3Jlc3BvbnNlLnN0YXR1c1RleHR9ICgke3VybH0pYCk7XG4gIH1cbiAgY29uc3QgYnVmZmVyID0gQnVmZmVyLmZyb20oYXdhaXQgcmVzcG9uc2UuYXJyYXlCdWZmZXIoKSk7XG4gIGlmIChidWZmZXIuYnl0ZUxlbmd0aCA+IG1heEJ5dGVzKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBkb3dubG9hZCBleGNlZWRzICR7bWF4Qnl0ZXN9IGJ5dGVzICgke3VybH0pYCk7XG4gIH1cbiAgcmV0dXJuIGJ1ZmZlcjtcbn1cblxuLyoqIERlcml2ZSBhIHNraWxsIGRpcmVjdG9yeSBuYW1lIGZyb20gYSBkb3dubG9hZCBVUkwncyBsYXN0IHBhdGggc2VnbWVudC4gKi9cbmZ1bmN0aW9uIGRlcml2ZVNraWxsTmFtZSh1cmxTdHJpbmc6IHN0cmluZyk6IHN0cmluZyB7XG4gIGNvbnN0IHVybCA9IG5ldC51cmxCdWlsZGVyKHVybFN0cmluZyk7XG4gIGNvbnN0IGxhc3QgPSB1cmw/LnBhdGhuYW1lLnNwbGl0KFwiL1wiKS5maWx0ZXIoQm9vbGVhbikucG9wKCkgPz8gXCJcIjtcbiAgcmV0dXJuIGxhc3QucmVwbGFjZSgvXFwuKG1kfHppcHx0YXJ8dGd6fGd6KSQvaSwgXCJcIik7XG59XG5cbi8qKiBBIHNraWxsIGRpcmVjdG9yeSAoaG9sZGluZyBhIGBTS0lMTC5tZGApIHN0YWdlZCBvbiBsb2NhbCBkaXNrLiAqL1xuaW50ZXJmYWNlIFN0YWdlZFNraWxsRGlyIHtcbiAgbmFtZTogc3RyaW5nO1xuICBhYnNvbHV0ZVBhdGg6IHN0cmluZztcbn1cblxuLyoqXG4gKiBDb2xsZWN0IGV2ZXJ5IHNraWxsIGRpcmVjdG9yeSB1bmRlciBgcm9vdGA6IGEgYHJvb3QvU0tJTEwubWRgIChyb290IElTIHRoZVxuICogc2tpbGwpIG9yIGVhY2ggaW1tZWRpYXRlIGNoaWxkIGRpciB0aGF0IGNvbnRhaW5zIGEgYFNLSUxMLm1kYC5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gY29sbGVjdFNraWxsRGlycyhyb290OiBzdHJpbmcpOiBQcm9taXNlPFN0YWdlZFNraWxsRGlyW10+IHtcbiAgaWYgKCEoYXdhaXQgcGF0aEV4aXN0cyhyb290KSkpIHJldHVybiBbXTtcbiAgaWYgKGF3YWl0IHBhdGhFeGlzdHMoam9pbihyb290LCBcIlNLSUxMLm1kXCIpKSkge1xuICAgIGNvbnN0IG5hbWUgPSBwb3NpeC5iYXNlbmFtZShyb290LnNwbGl0KC9bXFxcXC9dLykuam9pbihcIi9cIikpO1xuICAgIHJldHVybiBbeyBuYW1lLCBhYnNvbHV0ZVBhdGg6IHJvb3QgfV07XG4gIH1cbiAgY29uc3QgZGlyczogU3RhZ2VkU2tpbGxEaXJbXSA9IFtdO1xuICBmb3IgKGNvbnN0IGVudHJ5IG9mIGF3YWl0IHJlYWRkaXIocm9vdCwgeyB3aXRoRmlsZVR5cGVzOiB0cnVlIH0pKSB7XG4gICAgaWYgKCFlbnRyeS5pc0RpcmVjdG9yeSgpKSBjb250aW51ZTtcbiAgICBjb25zdCBkaXIgPSBqb2luKHJvb3QsIGVudHJ5Lm5hbWUpO1xuICAgIGlmIChhd2FpdCBwYXRoRXhpc3RzKGpvaW4oZGlyLCBcIlNLSUxMLm1kXCIpKSkge1xuICAgICAgZGlycy5wdXNoKHsgbmFtZTogZW50cnkubmFtZSwgYWJzb2x1dGVQYXRoOiBkaXIgfSk7XG4gICAgfVxuICB9XG4gIHJldHVybiBkaXJzO1xufVxuXG4vKipcbiAqIENvcHkgZXZlcnkgc3RhZ2VkIHNraWxsIGRpcmVjdG9yeSBpbnRvIHtAbGluayBkZXN0aW5hdGlvbn0sIHByZXNlcnZpbmcgdGhlXG4gKiBgPHNraWxsPi88cmVsYXRpdmU+YCBsYXlvdXQuIFRoZSBkZXN0aW5hdGlvbiBpcyBqdXN0IGEge0BsaW5rIEZpbGVTeXN0ZW19LFxuICogc28gdGhlIERhdGFicmlja3MgQXNzaXN0YW50IHRyZWUgYW5kIHRoZSBsb2NhbCBmYWxsYmFjayBzaGFyZSBvbmUgY29waWVyLlxuICovXG5hc3luYyBmdW5jdGlvbiBjb3B5U2tpbGxEaXJzKGRlc3RpbmF0aW9uOiBGaWxlU3lzdGVtLCBkaXJzOiBTdGFnZWRTa2lsbERpcltdKTogUHJvbWlzZTx2b2lkPiB7XG4gIGF3YWl0IGRlc3RpbmF0aW9uLmluaXQoKTtcbiAgZm9yIChjb25zdCBkaXIgb2YgZGlycykge1xuICAgIGZvciAoY29uc3QgcmVsYXRpdmUgb2YgZmluZC5maW5kRmlsZXMoXCIqKi8qXCIsIHsgY3dkOiBkaXIuYWJzb2x1dGVQYXRoLCBub2RpcjogdHJ1ZSB9KSkge1xuICAgICAgY29uc3QgYnVmZmVyID0gYXdhaXQgcmVhZEZpbGUoam9pbihkaXIuYWJzb2x1dGVQYXRoLCByZWxhdGl2ZSkpO1xuICAgICAgY29uc3Qgc2tpbGxQYXRoID0gcG9zaXguam9pbihkaXIubmFtZSwgcmVsYXRpdmUuc3BsaXQoL1tcXFxcL10vKS5qb2luKFwiL1wiKSk7XG4gICAgICBhd2FpdCBkZXN0aW5hdGlvbi53cml0ZUZpbGUoc2tpbGxQYXRoLCBidWZmZXIsIHsgb3ZlcndyaXRlOiB0cnVlIH0pO1xuICAgIH1cbiAgfVxufVxuXG4vKipcbiAqIENvcHkgc3RhZ2VkIHNraWxsIGRpcnMgaW50byBhIFNUQUJMRSBsb2NhbCB0cmVlIGtleWVkIGJ5IHRoZSBzb3VyY2UsIGFuZFxuICogcmV0dXJuIGl0cyByb290IHBhdGguXG4gKlxuICogQSBnaXZlbiBzb3VyY2UgcmVzb2x2ZXMgdG8gdGhlIHNhbWUgY29udGVudCBvbiBhbG1vc3QgZXZlcnkgYm9vdCwgc28gZWFjaFxuICogb25lIG93bnMgYSBkaXJlY3RvcnkgbmFtZWQgZm9yIGl0cyB7QGxpbmsgY2FjaGVLZXl9IHJhdGhlciB0aGFuIGxlYXZpbmcgYVxuICogZnJlc2ggc2NyYXRjaCBkaXIgYmVoaW5kIHBlciByZXN0YXJ0LiBLZXlpbmcgb24gdGhlIHNvdXJjZSBhbmQgaXRzIHBvbGljeVxuICogKG5vdCB0aGUgY29udGVudCkgaXMgd2hhdCBrZWVwcyB0d28gZGlmZmVyZW50IHNvdXJjZXMgZnJvbSBvdmVyd3JpdGluZyBlYWNoXG4gKiBvdGhlci5cbiAqXG4gKiBUaGUgbWV0YWRhdGEgaXMgd3JpdHRlbiBJTlNJREUgdGhlIHJlYnVpbGQgcmF0aGVyIHRoYW4gYWZ0ZXIgaXQ6IGByZWJ1aWxkRlNgXG4gKiByZXBsYWNlcyB0aGUgc3RhYmxlIHJvb3Qgd2hvbGVzYWxlLCBzbyBhbnl0aGluZyB3cml0dGVuIGFmdGVyd2FyZHMgd291bGRcbiAqIHN1cnZpdmUgb25seSB1bnRpbCB0aGUgbmV4dCByZWZyZXNoLCBhbmQgYW55dGhpbmcgd3JpdHRlbiBiZWZvcmUgd291bGQgYmVcbiAqIHRocm93biBhd2F5IGJ5IHRoZSBzd2FwLlxuICovXG5hc3luYyBmdW5jdGlvbiBwZXJzaXN0TG9jYWxseShcbiAga2V5OiBzdHJpbmcsXG4gIGRpcnM6IFN0YWdlZFNraWxsRGlyW10sXG4gIHJlY29yZDogUmVtb3RlU2tpbGxDYWNoZUVudHJ5LFxuKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgY29uc3Qgc3RhYmxlID0gYXdhaXQgbG9jYWxGUy5yZWJ1aWxkRlMoYCR7TE9DQUxfU0tJTExTX0RJUn0vJHtrZXl9YCwgYXN5bmMgKHNjcmF0Y2gpID0+IHtcbiAgICBhd2FpdCBjb3B5U2tpbGxEaXJzKHNjcmF0Y2gsIGRpcnMpO1xuICAgIGF3YWl0IHdyaXRlTWV0YWRhdGEoc2NyYXRjaCwga2V5LCByZWNvcmQpO1xuICB9KTtcbiAgcmV0dXJuIHN0YWJsZS5yb290O1xufVxuXG4vKipcbiAqIEEgc2NyYXRjaCBmaWxlc3lzdGVtIHdob3NlIHJvb3QgZXhpc3RzIG9uIGRpc2ssIGZvciB0aGUgcGF0aHMgdGhhdCBoYW5kIGFcbiAqIHJlYWwgZGlyZWN0b3J5IHRvIGBub2RlOmZzYCBvciBhIGNoaWxkIHByb2Nlc3MgcmF0aGVyIHRoYW4gZ29pbmcgdGhyb3VnaFxuICogdGhlIHtAbGluayBGaWxlU3lzdGVtfSBBUEkuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGluaXRpYWxpemVkU2NyYXRjaChwcmVmaXg6IHN0cmluZyk6IFByb21pc2U8TG9jYWxGaWxlU3lzdGVtPiB7XG4gIGNvbnN0IHNjcmF0Y2ggPSBsb2NhbEZTLnNjcmF0Y2hGUyhwcmVmaXgpO1xuICBhd2FpdCBzY3JhdGNoLmluaXQoKTtcbiAgcmV0dXJuIHNjcmF0Y2g7XG59XG5cbi8qKiBCZXN0LWVmZm9ydCBleGlzdGVuY2UgY2hlY2suICovXG5hc3luYyBmdW5jdGlvbiBwYXRoRXhpc3RzKHBhdGg6IHN0cmluZyk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICB0cnkge1xuICAgIGF3YWl0IHN0YXQocGF0aCk7XG4gICAgcmV0dXJuIHRydWU7XG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxufVxuIl19
615
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVtb3RlLXNraWxscy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9yZW1vdGUtc2tpbGxzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQWtERztBQUVILE9BQU8sRUFBRSxLQUFLLEVBQUUsT0FBTyxFQUFFLFFBQVEsRUFBRSxFQUFFLEVBQUUsSUFBSSxFQUFFLFNBQVMsRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBQ2pGLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFDNUMsT0FBTyxFQUFFLE9BQU8sRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLE1BQU0sV0FBVyxDQUFDO0FBRWpELE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUUzQyxPQUFPLEVBQUUsSUFBSSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDdkMsT0FBTyxFQUFFLG9CQUFvQixFQUFFLGVBQWUsRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBQzlFLE9BQU8sRUFBRSxPQUFPLEVBQXdCLE1BQU0sZUFBZSxDQUFDO0FBQzlELE9BQU8sRUFBRSxJQUFJLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUN2QyxPQUFPLEVBQ0wsVUFBVSxFQUNWLFVBQVUsRUFDVixJQUFJLEVBQ0osSUFBSSxFQUNKLEdBQUcsRUFDSCxHQUFHLEVBQ0gsTUFBTSxFQUNOLFdBQVcsR0FDWixNQUFNLHdCQUF3QixDQUFDO0FBSWhDLE9BQU8sRUFBRSw0QkFBNEIsRUFBRSx1QkFBdUIsRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBRXpGLE1BQU0sTUFBTSxHQUFHLEdBQUcsQ0FBQyxNQUFNLENBQUMsc0JBQXNCLENBQUMsQ0FBQztBQUVsRDs7Ozs7Ozs7O0dBU0c7QUFDSCxNQUFNLGdCQUFnQixHQUFHLFdBQVcsQ0FBQztBQUVyQywrRUFBK0U7QUFDL0UsTUFB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c0IsRUFDdEIsTUFBNkI7SUFFN0IsTUFBTSxNQUFNLEdBQUcsTUFBTSxPQUFPLENBQUMsU0FBUyxDQUFDLEdBQUcsZ0JBQWdCLElBQUksR0FBRyxFQUFFLEVBQUUsS0FBSyxFQUFFLE9BQU8sRUFBRSxFQUFFO1FBQ3JGLE1BQU0sYUFBYSxDQUFDLE9BQU8sRUFBRSxJQUFJLENBQUMsQ0FBQztRQUNuQyxNQUFNLGFBQWEsQ0FBQyxPQUFPLEVBQUUsR0FBRyxFQUFFLE1BQU0sQ0FBQyxDQUFDO0lBQzVDLENBQUMsQ0FBQyxDQUFDO0lBQ0gsT0FBTyxNQUFNLENBQUMsSUFBSSxDQUFDO0FBQ3JCLENBQUM7QUFFRDs7OztHQUlHO0FBQ0gsS0FBSyxVQUFVLGtCQUFrQixDQUFDLE1BQWM7SUFDOUMsTUFBTSxPQUFPLEdBQUcsT0FBTyxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUMxQyxNQUFNLE9BQU8sQ0FBQyxJQUFJLEVBQUUsQ0FBQztJQUNyQixPQUFPLE9BQU8sQ0FBQztBQUNqQixDQUFDO0FBRUQsbUNBQW1DO0FBQ25DLEtBQUssVUFBVSxVQUFVLENBQUMsSUFBWTtJQUNwQyxJQUFJLENBQUM7UUFDSCxNQUFNLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUNqQixPQUFPLElBQUksQ0FBQztJQUNkLENBQUM7SUFBQyxNQUFNLENBQUM7UUFDUCxPQUFPLEtBQUssQ0FBQztJQUNmLENBQUM7QUFDSCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBTdGFydHVwIHByb3Zpc2lvbmluZyBvZiByZW1vdGUgQWdlbnQtU2tpbGwgc291cmNlcyBmb3IgYSBNYXN0cmEgd29ya3NwYWNlLlxuICpcbiAqIEEge0BsaW5rIFJlbW90ZVNraWxsU291cmNlfSBuYW1lcyBXSEVSRSBhIGBTS0lMTC5tZGAgdHJlZSBjb21lcyBmcm9tIC0gdGhlXG4gKiB7QGxpbmsgQUlUT09MU19TT1VSQ0V9IGNvbnN0YW50LCBhIEdpdEh1YiBgb3duZXIvcmVwb2AsIGFueSBnaXQgLyBHaXRMYWIgVVJMLFxuICogb3IgYSBkaXJlY3QgZG93bmxvYWQgVVJMIC0gYW5kIG9wdGlvbmFsIHBlci1zb3VyY2UgcG9saWN5LlxuICoge0BsaW5rIHByb3Zpc2lvblJlbW90ZVNraWxsc30gbWF0ZXJpYWxpemVzIGV2ZXJ5IHNvdXJjZSBpbnRvIGEgbG9jYWxcbiAqIGBTS0lMTC5tZGAgdHJlZSBhdCBhcHAgYm9vdCBhbmQgcmV0dXJucyB0aGUgZGlyZWN0b3JpZXMgdG8gaGFuZCBNYXN0cmEgYXNcbiAqIGV4dHJhIHNraWxsIHNjYW4gcGF0aHMuXG4gKlxuICogUmVzb2x1dGlvbiBwZXIgc291cmNlLCBpbiBvcmRlcjpcbiAqXG4gKiAxLiB0aGUge0BsaW5rIEFJVE9PTFNfU09VUkNFfSBjb25zdGFudCAoYFwiYWl0b29sc1wiYCk6IERhdGFicmlja3MnIG93biBza2lsbFxuICogICAgc2V0LCByZWFkIHN0cmFpZ2h0IGZyb20gdGhlIHB1YmxpYyByZXBvIHRoZSBgZGF0YWJyaWNrcyBhaXRvb2xzYCBDTElcbiAqICAgIHNvdXJjZXMgZnJvbS4gTm8gQ0xJLCBubyBEYXRhYnJpY2tzIGF1dGggLSB3aGljaCBpcyB3aGF0IG1ha2VzIGl0IHVzYWJsZVxuICogICAgaW5zaWRlIGEgRGF0YWJyaWNrcyBBcHAgY29udGFpbmVyLCB3aGVyZSB0aGUgQ0xJIGlzIG5vdCBpbnN0YWxsZWQ7XG4gKiAyLiB0aGUgT1BUSU9OQUwgYHNraWxsc2AgbnBtIENMSSAocGVlciBkZXApOiBpZiBpbnN0YWxsZWQsIGVhY2ggc291cmNlIGlzXG4gKiAgICBjb3BpZWQgaW50byBhIHN0YWdpbmcgZGlyIHdpdGggYHNraWxscyBhZGQgPHNvdXJjZT4gLS1hZ2VudCA8ZGlyPiAtLWNvcHlgLFxuICogICAgd2hpY2ggdW5kZXJzdGFuZHMgZXZlcnkgc291cmNlIGZvcm1hdCB0aGUgZWNvc3lzdGVtIGRvZXMgKEdpdEh1YlxuICogICAgc2hvcnRoYW5kLCBnaXQgVVJMcywgYXJjaGl2ZS9kb3dubG9hZCBVUkxzKTtcbiAqIDMuIG90aGVyd2lzZSBhIHBsYWluIHtAbGluayBmZXRjaH0gb2YgdGhlIHNvdXJjZSBVUkwgKGJ1aWx0IHdpdGhcbiAqICAgIHtAbGluayBuZXQudXJsQnVpbGRlcn0pLCB3cml0aW5nIHRoZSBkb3dubG9hZGVkIGBTS0lMTC5tZGAgdG8gYSBzdGFnaW5nXG4gKiAgICBkaXIuXG4gKlxuICogQSBzb3VyY2UgdGhhdCByZXNvbHZlcyB0aHJvdWdoIG5laXRoZXIgcGF0aCBmYWlscyBhcHAgc3RhcnR1cCwgdW5sZXNzIHRoZVxuICogc291cmNlIChvciB0aGUgdG9wLWxldmVsIGNhbGwpIHNldHMgYGZhaWxPbkVycm9yOiBmYWxzZWAsIGluIHdoaWNoIGNhc2UgaXQgaXNcbiAqIGxvZ2dlZCBhbmQgc2tpcHBlZCBzbyBvbmUgYmFkIHNvdXJjZSBuZXZlciB0YWtlcyB0aGUgYXBwIGRvd24uXG4gKlxuICogRXZlcnkgcHJvdmlzaW9uZWQgdHJlZSBjYXJyaWVzIGEge0BsaW5rIE1FVEFEQVRBX0ZJTEV9IHJlY29yZGluZyB3aGVuIGVhY2hcbiAqIHNvdXJjZSB3YXMgbGFzdCBkb3dubG9hZGVkLCBhbmQgYSBzb3VyY2UgaXMgb25seSByZS1kb3dubG9hZGVkIG9uY2UgdGhhdFxuICogcmVjb3JkIGlzIG9sZGVyIHRoYW4ge0BsaW5rIERFRkFVTFRfUkVGUkVTSF9UVExfTVN9IChzZXZlbiBkYXlzKS4gVGhpcyBydW5zIGF0IGFwcFxuICogQk9PVCwgc28gd2l0aG91dCBpdCBhIGNvbnRhaW5lciB0aGF0IHJlc3RhcnRzIGEgZG96ZW4gdGltZXMgYW4gaG91ciByZS1wdWxsc1xuICogdGhlIHdob2xlIEFJIFRvb2xzIHNldCBhIGRvemVuIHRpbWVzIGZvciBjb250ZW50IHRoYXQgY2hhbmdlcyByYXJlbHkuIFRoZVxuICogcmVjb3JkIHRyYXZlbHMgV0lUSCB0aGUgdHJlZSByYXRoZXIgdGhhbiBpbiBwcm9jZXNzIG1lbW9yeSwgc28gdGhlIHJldXNlXG4gKiBzdXJ2aXZlcyBhIHJlc3RhcnQgLSB3aGljaCBpcyB0aGUgb25seSB3YXkgaXQgaGVscHMgYSBEYXRhYnJpY2tzIEFwcCBhdCBhbGwuXG4gKiBQYXNzIGByZWZyZXNoVHRsTXM6IDBgIHRvIGRvd25sb2FkIG9uIGV2ZXJ5IGJvb3QuXG4gKlxuICogVGhlIGRlZmF1bHQgZGVzdGluYXRpb24gaXMgdGhlIERhdGFicmlja3Mgd29ya3NwYWNlIEFzc2lzdGFudCBza2lsbHMgdHJlZVxuICogKGAvV29ya3NwYWNlLy5hc3Npc3RhbnQvc2tpbGxzYCwgdGhlIHNhbWUgdHJlZSBhIFwic2F2ZSB0aGlzIGFzIGEgc2tpbGxcIlxuICogYWN0aW9uIHdyaXRlcyB0byksIHNvIHByb3Zpc2lvbmVkIHNraWxscyBwZXJzaXN0IGFjcm9zcyByZXN0YXJ0cyBhbmQgYXJlXG4gKiBkaXNjb3ZlcmVkIGJ5IHRoZSBidWlsdC1pbiBBc3Npc3RhbnQtc2tpbGxzIG1vdW50LiBQYXNzIGB1c2VyRW1haWxgIChvciBhblxuICogZXhwbGljaXQgYGRhdGFicmlja3NCYXNlUGF0aGApIHRvIHRhcmdldCBgL1VzZXJzLzxlbWFpbD4vLmFzc2lzdGFudC9za2lsbHNgXG4gKiBpbnN0ZWFkLiBXaGVuIG5vIERhdGFicmlja3MgY2xpZW50IGlzIHJlc29sdmFibGUgYXQgc3RhcnR1cCAtIG9yIHRoZSByZXNvbHZlZFxuICogaWRlbnRpdHkgY2Fubm90IFdSSVRFIHRoZSBkZXN0aW5hdGlvbiwgd2hpY2ggaXMgdGhlIG5vcm1hbCBjYXNlIGZvciBhXG4gKiBEYXRhYnJpY2tzIEFwcCBzZXJ2aWNlIHByaW5jaXBhbCBhZ2FpbnN0IHRoZSBhZG1pbi1vd25lZCBzaGFyZWQgdHJlZSAoc2VlXG4gKiB7QGxpbmsgb3BlbldyaXRhYmxlV29ya3NwYWNlfSkgLSB0aGUgdHJlZSBpcyB3cml0dGVuIHVuZGVyXG4gKiB7QGxpbmsgbG9jYWxGUy50bXBGU30gYW5kIHJldHVybmVkIGFzIGFuIGV4dHJhIGxvY2FsIHNraWxsIHBhdGggZm9yIHRoZVxuICogY3VycmVudCBwcm9jZXNzLiBTdG9yYWdlIGxvY2F0aW9uIGRlZ3JhZGVzOyB0aGUgc2tpbGxzIHRoZW1zZWx2ZXMgZG8gbm90LlxuICpcbiAqIEBtb2R1bGVcbiAqL1xuXG5pbXBvcnQgeyBta2RpciwgcmVhZGRpciwgcmVhZEZpbGUsIHJtLCBzdGF0LCB3cml0ZUZpbGUgfSBmcm9tIFwibm9kZTpmcy9wcm9taXNlc1wiO1xuaW1wb3J0IHsgY3JlYXRlUmVxdWlyZSB9IGZyb20gXCJub2RlOm1vZHVsZVwiO1xuaW1wb3J0IHsgZGlybmFtZSwgam9pbiwgcG9zaXggfSBmcm9tIFwibm9kZTpwYXRoXCI7XG5pbXBvcnQgdHlwZSB7IFdvcmtzcGFjZUNsaWVudCB9IGZyb20gXCJAZGF0YWJyaWNrcy9hcHBraXRcIjtcbmltcG9ydCB7IGFwcGtpdCB9IGZyb20gXCJAZGJ4LXRvb2xzL2FwcGtpdFwiO1xuaW1wb3J0IHR5cGUgeyBXb3Jrc3BhY2VDbGllbnRMaWtlIH0gZnJvbSBcIkBkYngtdG9vbHMvYXBwa2l0XCI7XG5pbXBvcnQgeyBleGVjIH0gZnJvbSBcIkBkYngtdG9vbHMvY29yZVwiO1xuaW1wb3J0IHsgRGF0YWJyaWNrc0ZpbGVTeXN0ZW0sIHdvcmtzcGFjZUNsaWVudCB9IGZyb20gXCJAZGJ4LXRvb2xzL2RhdGFicmlja3NcIjtcbmltcG9ydCB7IGxvY2FsRlMsIHR5cGUgTG9jYWxGaWxlU3lzdGVtIH0gZnJvbSBcIkBkYngtdG9vbHMvZnNcIjtcbmltcG9ydCB7IGZpbmQgfSBmcm9tIFwiQGRieC10b29scy9wYXRoXCI7XG5pbXBvcnQge1xuICBhc3luY1V0aWxzLFxuICBlcnJvclV0aWxzLFxuICBoYXNoLFxuICBqc29uLFxuICBsb2csXG4gIG5ldCxcbiAgb2JqZWN0LFxuICBzdHJpbmdVdGlscyxcbn0gZnJvbSBcIkBkYngtdG9vbHMvc2hhcmVkLWNvcmVcIjtcbmltcG9ydCB0eXBlIHsgT25lT3JNYW55IH0gZnJvbSBcIkBkYngtdG9vbHMvc2hhcmVkLWNvcmVcIjtcbmltcG9ydCB0eXBlIHsgRmlsZVN5c3RlbSB9IGZyb20gXCJAZGJ4LXRvb2xzL3NoYXJlZC1mc1wiO1xuXG5pbXBvcnQgeyBBU1NJU1RBTlRfU0hBUkVEX1NLSUxMU19QQVRILCB1c2VyQXNzaXN0YW50U2tpbGxzUGF0aCB9IGZyb20gXCIuL3NraWxsLXBhdGhzLnRzXCI7XG5cbmNvbnN0IGxvZ2dlciA9IGxvZy5sb2dnZXIoXCJtYXN0cmEvcmVtb3RlLXNraWxsc1wiKTtcblxuLyoqXG4gKiBBZ2VudCBpZCB0aGUgYHNraWxsc2AgQ0xJIGluc3RhbGxzIGEgYmFyZSBgU0tJTEwubWRgIHRyZWUgdW5kZXIuXG4gKlxuICogYHVuaXZlcnNhbGAgaXMgdGhlIENMSSdzIG93biBuYW1lIGZvciBcIm5vIHBhcnRpY3VsYXIgYWdlbnQsIGp1c3QgdGhlIHBsYWluXG4gKiB0cmVlXCIsIHdoaWNoIGlzIHdoYXQgdGhpcyBtb2R1bGUgd2FudHMgLSBpdCByZS1ob3N0cyB0aGUgcmVzdWx0IGl0c2VsZi4gVGhlXG4gKiBpZCBtdXN0IGJlIG9uZSB0aGUgaW5zdGFsbGVkIENMSSBrbm93czogYW4gdW5yZWNvZ25pemVkIG9uZSBpcyByZWplY3RlZFxuICogb3V0cmlnaHQgKGBJbnZhbGlkIGFnZW50czogLi4uYCksIHRha2luZyBldmVyeSBub24tYGFpdG9vbHNgIHNvdXJjZSBkb3duIHdpdGhcbiAqIGl0LCBzaW5jZSBhIENMSSBmYWlsdXJlIGlzIGEgaGFyZCBmYWlsdXJlIHJhdGhlciB0aGFuIGEgZmFsbC10aHJvdWdoIHRvXG4gKiB7QGxpbmsgc3RhZ2VWaWFGZXRjaH0uXG4gKi9cbmNvbnN0IFNLSUxMU19DTElfQUdFTlQgPSBcInVuaXZlcnNhbFwiO1xuXG4vKiogV2hlcmUgdGhlIGBza2lsbHNgIENMSSBkcm9wcyBhIHBsYWluIGBTS0lMTC5tZGAgdHJlZSB1bmRlciBhIHRhcmdldCBkaXIuICovXG5jb25zdCBTS0lMTFNfQ0xJX0xBWU9VVCA9IFtcIi5hZ2VudHNcIiwgXCJza2lsbHNcIl0gYXMgY29uc3Q7XG5cbi8qKiBDYXAgb24gYSBkaXJlY3QtZmV0Y2ggZG93bmxvYWQgYm9keSwgbWF0Y2hpbmcgdGhlIGBza2lsbHNgIENMSSBkZWZhdWx0LiAqL1xuY29uc3QgREVGQVVMVF9NQVhfRE9XTkxPQURfQllURVMgPSAxMCAqIDEwMjQgKiAxMDI0O1xuXG4vKiogTWF4aW11bSB0aW1lIG9uZSByZW1vdGUgZmlsZSBkb3dubG9hZCBtYXkgYmxvY2sgc3RhcnR1cC4gKi9cbmNvbnN0IERFRkFVTFRfRE9XTkxPQURfVElNRU9VVF9NUyA9IDYwXzAwMDtcblxuLyoqIFN0YWJsZSB0ZW1wIGRpcmVjdG9yeSBob2xkaW5nIG9uZSByZWJ1aWx0IHNraWxsIHRyZWUgcGVyIHJlbW90ZSBzb3VyY2UuICovXG5jb25zdCBMT0NBTF9TS0lMTFNfRElSID0gXCJtYXN0cmEtbG9jYWwtc2tpbGxzXCI7XG5cbi8qKlxuICogQm9va2tlZXBpbmcgZmlsZSB3cml0dGVuIGF0IHRoZSByb290IG9mIGV2ZXJ5IHByb3Zpc2lvbmVkIHNraWxsIHRyZWUsIG5hbWluZ1xuICogd2hlbiBlYWNoIHNvdXJjZSB3YXMgbGFzdCBkb3dubG9hZGVkLiBBIGRvdGZpbGUgc28gdGhlIHNraWxsIHNjYW5uZXJzLCB3aGljaFxuICogbG9vayBmb3IgYDxkaXI+L1NLSUxMLm1kYCwgbmV2ZXIgbWlzdGFrZSBpdCBmb3IgYSBza2lsbC5cbiAqL1xuY29uc3QgTUVUQURBVEFfRklMRSA9IFwiLm1ldGFkYXRhLmpzb25cIjtcblxuLyoqIFNoYXBlIG1hcmtlciBmb3Ige0BsaW5rIE1FVEFEQVRBX0ZJTEV9OyBhbiB1bmtub3duIHZlcnNpb24gaXMgaWdub3JlZCwgbm90IHJlYWQuICovXG5jb25zdCBNRVRBREFUQV9WRVJTSU9OID0gMTtcblxuLyoqIEhvdyBsb25nIGEgcHJvdmlzaW9uZWQgc291cmNlIGlzIHJldXNlZCBiZWZvcmUgYmVpbmcgZG93bmxvYWRlZCBhZ2Fpbi4gKi9cbmNvbnN0IERFRkFVTFRfUkVGUkVTSF9UVExfTVMgPSA3ICogMjQgKiA2MCAqIDYwICogMTAwMDtcblxuLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEFJIFRvb2xzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqL1xuXG4vKipcbiAqIFNvdXJjZSBjb25zdGFudCBzZWxlY3RpbmcgRGF0YWJyaWNrcycgb3duIEFJIFRvb2xzIHNraWxsIHNldC5cbiAqXG4gKiBAZXhhbXBsZVxuICogbWFzdHJhKHsgcmVtb3RlU2tpbGxzOiBcImFpdG9vbHNcIiB9KTtcbiAqL1xuZXhwb3J0IGNvbnN0IEFJVE9PTFNfU09VUkNFID0gXCJhaXRvb2xzXCI7XG5cbi8qKiBUaGUge0BsaW5rIEFJVE9PTFNfU09VUkNFfSBsaXRlcmFsLCBmb3IgY2FsbGVycyBzcGVsbGluZyB0aGUgdW5pb24gb3V0LiAqL1xuZXhwb3J0IHR5cGUgQWlUb29sc1NvdXJjZSA9IHR5cGVvZiBBSVRPT0xTX1NPVVJDRTtcblxuLyoqXG4gKiBUaGUgUFVCTElDIHJlcG8gYGRhdGFicmlja3MgYWl0b29scyBpbnN0YWxsYCBzb3VyY2VzIGZyb20uIFJlYWRpbmcgaXRcbiAqIGRpcmVjdGx5IGlzIHdoYXQgbGV0cyBhbiBhcHAgZ2V0IHRoZSBzYW1lIHNraWxscyB0aGUgQ0xJIGluc3RhbGxzIHdpdGhvdXRcbiAqIHRoZSBDTEkgLSB3aGljaCBhIERhdGFicmlja3MgQXBwIGNvbnRhaW5lciBkb2VzIG5vdCBzaGlwLlxuICovXG5jb25zdCBBSVRPT0xTX1JFUE8gPSBcImRhdGFicmlja3MvZGF0YWJyaWNrcy1hZ2VudC1za2lsbHNcIjtcblxuLyoqIFJlcG8gcmVmIHRoZSBza2lsbHMgYXJlIHJlYWQgZnJvbS4gT3ZlcnJpZGUgcGVyIHNvdXJjZSB3aXRoIGByZWZgLiAqL1xuY29uc3QgQUlUT09MU19SRUYgPSBcIm1haW5cIjtcblxuLyoqIFNraWxsIGZpbGVzIGRvd25sb2FkZWQgYXQgb25jZTsgdGhlIHNldCBpcyB+MzAgc2tpbGxzIG9mIGEgZmV3IGZpbGVzIGVhY2guICovXG5jb25zdCBBSVRPT0xTX0NPTkNVUlJFTkNZID0gODtcblxuLyoqIFRoZSBzdWJzZXQgb2YgdGhlIHJlcG8ncyBnZW5lcmF0ZWQgYG1hbmlmZXN0Lmpzb25gIHRoaXMgbW9kdWxlIHJlYWRzLiAqL1xuaW50ZXJmYWNlIEFpVG9vbHNNYW5pZmVzdCB7XG4gIHNraWxscz86IFJlY29yZDxzdHJpbmcsIHsgZmlsZXM/OiBzdHJpbmdbXTsgcmVwb19kaXI/OiBzdHJpbmcgfT47XG59XG5cbi8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHR5cGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovXG5cbi8qKlxuICogT25lIHJlbW90ZSBza2lsbCBzb3VyY2UgYW5kIGl0cyBwZXItc291cmNlIHBvbGljeS5cbiAqXG4gKiBgc291cmNlYCBpcyB7QGxpbmsgQUlUT09MU19TT1VSQ0V9IG9yIGFueXRoaW5nIHRoZSBgc2tpbGxzYCBlY29zeXN0ZW1cbiAqIHVuZGVyc3RhbmRzOiBhIEdpdEh1YiBgb3duZXIvcmVwb2Agc2hvcnRoYW5kLCBhIGZ1bGwgR2l0SHViIC8gR2l0TGFiIC8gZ2l0XG4gKiBVUkwsIG9yIGEgZGlyZWN0IGRvd25sb2FkIFVSTCB0byBhIGBTS0lMTC5tZGAgb3IgYXJjaGl2ZS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBSZW1vdGVTa2lsbFNvdXJjZU9wdGlvbnMge1xuICAvKiogYFwiYWl0b29sc1wiYCwgYSBHaXRIdWIgc2hvcnRoYW5kLCBhIGdpdCAvIEdpdExhYiBVUkwsIG9yIGEgZG93bmxvYWQgVVJMLiAqL1xuICBzb3VyY2U6IG5ldC5VcmxMaWtlIHwgQWlUb29sc1NvdXJjZTtcbiAgLyoqIEluc3RhbGwgb25seSB0aGVzZSBza2lsbCBuYW1lcyBmcm9tIHRoZSBzb3VyY2UuICovXG4gIHNraWxscz86IHN0cmluZyB8IHN0cmluZ1tdO1xuICAvKiogSW5jbHVkZSBleHBlcmltZW50YWwgc2tpbGxzLiBgXCJhaXRvb2xzXCJgIG9ubHkuICovXG4gIGV4cGVyaW1lbnRhbD86IGJvb2xlYW47XG4gIC8qKiBQaW4gdGhlIHJlcG8gcmVmICh0YWcgLyBicmFuY2ggLyBzaGEpLiBgXCJhaXRvb2xzXCJgIG9ubHk7IGRlZmF1bHRzIHRvIGBtYWluYC4gKi9cbiAgcmVmPzogc3RyaW5nO1xuICAvKiogT3ZlcnJpZGUgdGhlIGJ5dGUgY2VpbGluZyBvbiBhIGRpcmVjdC1mZXRjaCBkb3dubG9hZCBmb3IgdGhpcyBzb3VyY2UuICovXG4gIG1heERvd25sb2FkQnl0ZXM/OiBudW1iZXI7XG4gIC8qKlxuICAgKiBIb3cgbG9uZyB0aGlzIHNvdXJjZSdzIHByb3Zpc2lvbmVkIHRyZWUgaXMgcmV1c2VkIGJlZm9yZSBpdCBpcyBkb3dubG9hZGVkXG4gICAqIGFnYWluLCBpbiBtaWxsaXNlY29uZHMuIE92ZXJyaWRlcyB0aGUgdG9wLWxldmVsXG4gICAqIHtAbGluayBQcm92aXNpb25SZW1vdGVTa2lsbHNPcHRpb25zLnJlZnJlc2hUdGxNc307IGAwYCByZS1kb3dubG9hZHMgb25cbiAgICogZXZlcnkgYm9vdC5cbiAgICovXG4gIHJlZnJlc2hUdGxNcz86IG51bWJlcjtcbiAgLyoqXG4gICAqIFdoZW4gYGZhbHNlYCwgYSBzb3VyY2UgdGhhdCBmYWlscyB0byByZXNvbHZlIGlzIGxvZ2dlZCBhbmQgc2tpcHBlZCBpbnN0ZWFkXG4gICAqIG9mIGZhaWxpbmcgYXBwIHN0YXJ0dXAuIE92ZXJyaWRlcyB0aGUgdG9wLWxldmVsIHtAbGluayBQcm92aXNpb25SZW1vdGVTa2lsbHNPcHRpb25zLmZhaWxPbkVycm9yfS5cbiAgICovXG4gIGZhaWxPbkVycm9yPzogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBBIHJlbW90ZSBza2lsbCBzb3VyY2U6IHRoZSB7QGxpbmsgQUlUT09MU19TT1VSQ0V9IGNvbnN0YW50LCBhIFVSTC1saWtlXG4gKiAoc3RyaW5nIC8gYFVSTGAgLyBgeyB1cmwgfWApLCBvciBhIHtAbGluayBSZW1vdGVTa2lsbFNvdXJjZU9wdGlvbnN9IGJhZyB3aXRoXG4gKiBwZXItc291cmNlIHBvbGljeS5cbiAqL1xuZXhwb3J0IHR5cGUgUmVtb3RlU2tpbGxTb3VyY2UgPSBuZXQuVXJsTGlrZSB8IEFpVG9vbHNTb3VyY2UgfCBSZW1vdGVTa2lsbFNvdXJjZU9wdGlvbnM7XG5cbi8qKlxuICogVGhlIHdvcmtzcGFjZSBgcmVtb3RlU2tpbGxzYCBvcHRpb246IG9uZSBzb3VyY2UsIGEgbm9uLWVtcHR5IGxpc3Qgb2YgdGhlbSwgb3JcbiAqIGEge0BsaW5rIFByb3Zpc2lvblJlbW90ZVNraWxsc09wdGlvbnN9IGJhZyB3aGVuIHRvcC1sZXZlbCBwb2xpY3kgaXMgbmVlZGVkLlxuICovXG5leHBvcnQgdHlwZSBSZW1vdGVTa2lsbHNPcHRpb24gPVxuICBSZW1vdGVTa2lsbFNvdXJjZSB8IE9uZU9yTWFueTxSZW1vdGVTa2lsbFNvdXJjZT4gfCBQcm92aXNpb25SZW1vdGVTa2lsbHNPcHRpb25zO1xuXG4vKiogQSBzb3VyY2UgZW50cnkgd2l0aCBpdHMgYHNvdXJjZWAgZmxhdHRlbmVkIHRvIGEgcGxhaW4gc3RyaW5nLiAqL1xudHlwZSBOb3JtYWxpemVkU291cmNlID0gT21pdDxSZW1vdGVTa2lsbFNvdXJjZU9wdGlvbnMsIFwic291cmNlXCI+ICYgeyBzb3VyY2U6IHN0cmluZyB9O1xuXG4vKiogVG9wLWxldmVsIHJlbW90ZS1za2lsbHMgcHJvdmlzaW9uaW5nIG9wdGlvbnMuICovXG5leHBvcnQgaW50ZXJmYWNlIFByb3Zpc2lvblJlbW90ZVNraWxsc09wdGlvbnMge1xuICAvKiogU291cmNlcyB0byBtYXRlcmlhbGl6ZSBhdCBzdGFydHVwLiAqL1xuICBzb3VyY2VzOiBSZW1vdGVTa2lsbFNvdXJjZSB8IE9uZU9yTWFueTxSZW1vdGVTa2lsbFNvdXJjZT47XG4gIC8qKlxuICAgKiBGYWlsIGFwcCBzdGFydHVwIHdoZW4gYSBzb3VyY2UgY2FuJ3QgYmUgcmVzb2x2ZWQuIERlZmF1bHRzIHRvIGB0cnVlYC4gQVxuICAgKiBwZXItc291cmNlIGBmYWlsT25FcnJvcmAgd2lucyBvdmVyIHRoaXMuXG4gICAqL1xuICBmYWlsT25FcnJvcj86IGJvb2xlYW47XG4gIC8qKlxuICAgKiBBYnNvbHV0ZSBEYXRhYnJpY2tzIHBhdGggdGhhdCByb290cyB0aGUgZGVzdGluYXRpb24gQXNzaXN0YW50IHNraWxscyB0cmVlLlxuICAgKiBEZWZhdWx0cyB0byB0aGUgT0JPIHVzZXIncyBgL1VzZXJzLzxlbWFpbD4vLmFzc2lzdGFudC9za2lsbHNgLlxuICAgKi9cbiAgZGF0YWJyaWNrc0Jhc2VQYXRoPzogc3RyaW5nO1xuICAvKiogQXV0aC1zY29wZWQgRGF0YWJyaWNrcyBjbGllbnQuIERlZmF1bHRzIHRvIHRoZSBBcHBLaXQgZXhlY3V0aW9uIGNvbnRleHQuICovXG4gIGNsaWVudD86IFdvcmtzcGFjZUNsaWVudExpa2U7XG4gIC8qKiBVc2VyIGVtYWlsIHVzZWQgdG8gZGVyaXZlIHRoZSBkZWZhdWx0IERhdGFicmlja3MgZGVzdGluYXRpb24uICovXG4gIHVzZXJFbWFpbD86IHN0cmluZztcbiAgLyoqIEJ5dGUgY2VpbGluZyBvbiBhIGRpcmVjdC1mZXRjaCBkb3dubG9hZC4gRGVmYXVsdHMgdG8gMTAgTWlCLiAqL1xuICBtYXhEb3dubG9hZEJ5dGVzPzogbnVtYmVyO1xuICAvKipcbiAgICogSG93IGxvbmcgYSBwcm92aXNpb25lZCB0cmVlIGlzIHJldXNlZCBiZWZvcmUgaXRzIHNvdXJjZSBpcyBkb3dubG9hZGVkXG4gICAqIGFnYWluLCBpbiBtaWxsaXNlY29uZHMuIERlZmF1bHRzIHRvIHNldmVuIGRheXM7IGAwYCByZS1kb3dubG9hZHMgb24gZXZlcnlcbiAgICogYm9vdC4gQSBwZXItc291cmNlIGByZWZyZXNoVHRsTXNgIHdpbnMgb3ZlciB0aGlzLlxuICAgKi9cbiAgcmVmcmVzaFR0bE1zPzogbnVtYmVyO1xufVxuXG4vKiogV2hhdCB7QGxpbmsgcHJvdmlzaW9uUmVtb3RlU2tpbGxzfSByZXNvbHZlZC4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUHJvdmlzaW9uZWRSZW1vdGVTa2lsbHMge1xuICAvKipcbiAgICogRXh0cmEgTE9DQUwgc2tpbGwgc2NhbiBwYXRocyB0byBoYW5kIE1hc3RyYSAoYSB0ZW1wIGRpciBwZXIgc291cmNlIHRoYXRcbiAgICogY291bGRuJ3QgYmUgd3JpdHRlbiB0byBEYXRhYnJpY2tzKS4gRW1wdHkgd2hlbiBldmVyeXRoaW5nIGxhbmRlZCBpbiB0aGVcbiAgICogRGF0YWJyaWNrcyBBc3Npc3RhbnQgdHJlZSwgd2hpY2ggdGhlIGJ1aWx0LWluIG1vdW50IGFscmVhZHkgc2NhbnMuXG4gICAqL1xuICBsb2NhbFNraWxsUGF0aHM6IHN0cmluZ1tdO1xuICAvKiogQWJzb2x1dGUgRGF0YWJyaWNrcyBkZXN0aW5hdGlvbiBlYWNoIHNvdXJjZSB3YXMgd3JpdHRlbiB0bywgaWYgYW55LiAqL1xuICBkYXRhYnJpY2tzQmFzZVBhdGg/OiBzdHJpbmc7XG4gIC8qKlxuICAgKiBOYW1lcyBvZiBldmVyeSBza2lsbCBkaXJlY3Rvcnkgbm93IGF2YWlsYWJsZSwgd2hldGhlciBpdCB3YXMgZG93bmxvYWRlZCBvblxuICAgKiB0aGlzIGJvb3Qgb3IgcmV1c2VkIGZyb20gYSBzdGlsbC1mcmVzaCB0cmVlIChzZWUge0BsaW5rIE1FVEFEQVRBX0ZJTEV9KS5cbiAgICovXG4gIHNraWxsTmFtZXM6IHN0cmluZ1tdO1xufVxuXG4vKipcbiAqIFdoYXQgb25lIHNvdXJjZSdzIGxhc3QgZG93bmxvYWQgbGVmdCBiZWhpbmQsIGFzIHJlY29yZGVkIGluXG4gKiB7QGxpbmsgTUVUQURBVEFfRklMRX0uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUmVtb3RlU2tpbGxDYWNoZUVudHJ5IHtcbiAgLyoqIFRoZSBzb3VyY2Ugc3RyaW5nIHRoaXMgZW50cnkgd2FzIGRvd25sb2FkZWQgZnJvbSwgZm9yIHJlYWRhYmlsaXR5LiAqL1xuICBzb3VyY2U6IHN0cmluZztcbiAgLyoqIFdoZW4gdGhlIGRvd25sb2FkIGNvbXBsZXRlZCwgSVNPLTg2MDEuICovXG4gIGRvd25sb2FkZWRBdDogc3RyaW5nO1xuICAvKiogU2tpbGwgZGlyZWN0b3J5IG5hbWVzIHRoZSBkb3dubG9hZCBwcm9kdWNlZC4gKi9cbiAgc2tpbGxzOiBzdHJpbmdbXTtcbiAgLyoqXG4gICAqIFRoZSBjb250ZW50LWFmZmVjdGluZyBwb2xpY3kgdGhhdCBkb3dubG9hZCB1c2VkLiBBbHNvIGZvbGRlZCBpbnRvIHRoZSBlbnRyeVxuICAgKiBLRVksIHNvIG5hcnJvd2luZyBgc2tpbGxzYCBvciBtb3ZpbmcgYHJlZmAgbWlzc2VzIHRoZSBjYWNoZSBpbnN0ZWFkIG9mXG4gICAqIHNpbGVudGx5IHNlcnZpbmcgdGhlIHByZXZpb3VzIHNlbGVjdGlvbi5cbiAgICovXG4gIHBvbGljeT86IHsgc2tpbGxzPzogc3RyaW5nW107IGV4cGVyaW1lbnRhbD86IGJvb2xlYW47IHJlZj86IHN0cmluZyB9O1xufVxuXG4vKiogVGhlIHtAbGluayBNRVRBREFUQV9GSUxFfSBkb2N1bWVudDogb25lIGVudHJ5IHBlciBwcm92aXNpb25lZCBzb3VyY2UuICovXG5leHBvcnQgaW50ZXJmYWNlIFJlbW90ZVNraWxsc01ldGFkYXRhIHtcbiAgdmVyc2lvbjogbnVtYmVyO1xuICBzb3VyY2VzOiBSZWNvcmQ8c3RyaW5nLCBSZW1vdGVTa2lsbENhY2hlRW50cnk+O1xufVxuXG4vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIGhlbHBlcnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqL1xuXG4vKiogTm9ybWFsaXplIHRoZSBgcmVtb3RlU2tpbGxzYCBvcHRpb24gaW50byBhIGZsYXQgb3B0aW9ucyBiYWcuICovXG5leHBvcnQgZnVuY3Rpb24gbm9ybWFsaXplUmVtb3RlU2tpbGxzT3B0aW9uKFxuICBvcHRpb246IFJlbW90ZVNraWxsc09wdGlvbiB8IHVuZGVmaW5lZCxcbik6IFByb3Zpc2lvblJlbW90ZVNraWxsc09wdGlvbnMgfCB1bmRlZmluZWQge1xuICBpZiAob3B0aW9uID09PSB1bmRlZmluZWQpIHJldHVybiB1bmRlZmluZWQ7XG4gIGNvbnN0IGJhZyA9IGlzUHJvdmlzaW9uT3B0aW9ucyhvcHRpb24pID8gb3B0aW9uIDogdW5kZWZpbmVkO1xuICBjb25zdCBzb3VyY2VzID0gdG9Tb3VyY2VMaXN0KGJhZyA/IGJhZy5zb3VyY2VzIDogKG9wdGlvbiBhcyBSZW1vdGVTa2lsbFNvdXJjZSkpO1xuICAvLyBBbiBlbXB0eSBsaXN0IGlzIHRoZSBzYW1lIGFzIG5vIGNvbmZpZ3VyYXRpb24gYXQgYWxsLlxuICBpZiAoIW9iamVjdC5pc09uZU9yTWFueShzb3VyY2VzKSkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgcmV0dXJuIHsgLi4uYmFnLCBzb3VyY2VzIH07XG59XG5cbi8qKiBBIGBzb3VyY2VzYC1iZWFyaW5nIGJhZyBpcyB0aGUgdG9wLWxldmVsIG9wdGlvbnMgc2hhcGUsIG5vdCBhIHNpbmdsZSBzb3VyY2UuICovXG5mdW5jdGlvbiBpc1Byb3Zpc2lvbk9wdGlvbnModmFsdWU6IHVua25vd24pOiB2YWx1ZSBpcyBQcm92aXNpb25SZW1vdGVTa2lsbHNPcHRpb25zIHtcbiAgcmV0dXJuIG9iamVjdC5pc1JlY29yZCh2YWx1ZSkgJiYgXCJzb3VyY2VzXCIgaW4gdmFsdWU7XG59XG5cbi8qKiBPbmUgc291cmNlIG9yIG1hbnksIGFzIGEgcGxhaW4gYXJyYXkuIEEgc291cmNlIGlzIG5ldmVyIGl0c2VsZiBhbiBhcnJheS4gKi9cbmZ1bmN0aW9uIHRvU291cmNlTGlzdChcbiAgaW5wdXQ6IFJlbW90ZVNraWxsU291cmNlIHwgT25lT3JNYW55PFJlbW90ZVNraWxsU291cmNlPixcbik6IFJlbW90ZVNraWxsU291cmNlW10ge1xuICByZXR1cm4gQXJyYXkuaXNBcnJheShpbnB1dCkgPyBbLi4uaW5wdXRdIDogW2lucHV0XTtcbn1cblxuLyoqIEZsYXR0ZW4gYSBzb3VyY2UgZW50cnkgLSBzdHJpbmcsIGBVUkxgLCBgeyB1cmwgfWAsIG9yIG9wdGlvbnMgYmFnIC0gdG8gYSB7QGxpbmsgTm9ybWFsaXplZFNvdXJjZX0uICovXG5mdW5jdGlvbiB0b1NvdXJjZU9wdGlvbnMoc291cmNlOiBSZW1vdGVTa2lsbFNvdXJjZSk6IE5vcm1hbGl6ZWRTb3VyY2Uge1xuICBpZiAodHlwZW9mIHNvdXJjZSA9PT0gXCJzdHJpbmdcIikgcmV0dXJuIHsgc291cmNlIH07XG4gIGlmIChzb3VyY2UgaW5zdGFuY2VvZiBVUkwpIHJldHVybiB7IHNvdXJjZTogc291cmNlLnRvU3RyaW5nKCkgfTtcbiAgaWYgKFwic291cmNlXCIgaW4gc291cmNlKSByZXR1cm4geyAuLi5zb3VyY2UsIHNvdXJjZTogdG9Tb3VyY2VTdHJpbmcoc291cmNlLnNvdXJjZSkgfTtcbiAgcmV0dXJuIHsgc291cmNlOiBzb3VyY2UudXJsIH07XG59XG5cbi8qKiBBIHtAbGluayBuZXQuVXJsTGlrZX0gYXMgdGhlIHBsYWluIHN0cmluZyB0aGUgc3RhZ2luZyBwYXRocyB3b3JrIHdpdGguICovXG5mdW5jdGlvbiB0b1NvdXJjZVN0cmluZyhzb3VyY2U6IG5ldC5VcmxMaWtlKTogc3RyaW5nIHtcbiAgaWYgKHR5cGVvZiBzb3VyY2UgPT09IFwic3RyaW5nXCIpIHJldHVybiBzb3VyY2U7XG4gIHJldHVybiBzb3VyY2UgaW5zdGFuY2VvZiBVUkwgPyBzb3VyY2UudG9TdHJpbmcoKSA6IHNvdXJjZS51cmw7XG59XG5cbi8qKiBUcnVlIHdoZW4gYSBzb3VyY2Ugc2VsZWN0cyB0aGUgYnVpbHQtaW4gRGF0YWJyaWNrcyBBSSBUb29scyBza2lsbCBzZXQuICovXG5mdW5jdGlvbiBpc0FpVG9vbHNTb3VyY2Uoc291cmNlOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgcmV0dXJuIHNvdXJjZS50cmltKCkudG9Mb3dlckNhc2UoKSA9PT0gQUlUT09MU19TT1VSQ0U7XG59XG5cbi8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIGNhY2hlIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovXG5cbi8qKlxuICogVGhlIHBvbGljeSB0aGF0IGRlY2lkZXMgd2hhdCBhIHNvdXJjZSdzIGRvd25sb2FkIENPTlRBSU5TLlxuICpcbiAqIE9ubHkgdGhlc2UgdGhyZWUgY2hhbmdlIHRoZSByZXN1bHRpbmcgdHJlZSwgc28gb25seSB0aGVzZSBiZWxvbmcgaW4gdGhlIGNhY2hlXG4gKiBrZXkgLSBgZmFpbE9uRXJyb3JgIGFuZCBgbWF4RG93bmxvYWRCeXRlc2AgZ292ZXJuIGhvdyBhIGZhaWx1cmUgaXMgaGFuZGxlZCxcbiAqIG5vdCB3aGF0IGEgc3VjY2VzcyBwcm9kdWNlcy5cbiAqL1xuZnVuY3Rpb24gY2FjaGVQb2xpY3koc291cmNlT3B0aW9uczogTm9ybWFsaXplZFNvdXJjZSk6IFJlbW90ZVNraWxsQ2FjaGVFbnRyeVtcInBvbGljeVwiXSB7XG4gIGNvbnN0IHNraWxscyA9IHN0cmluZ1V0aWxzLnBhcnNlTGlzdChzb3VyY2VPcHRpb25zLnNraWxscyk7XG4gIGNvbnN0IHBvbGljeSA9IHtcbiAgICAuLi4oc2tpbGxzLmxlbmd0aCA+IDAgPyB7IHNraWxsczogWy4uLnNraWxsc10uc29ydCgpIH0gOiB7fSksXG4gICAgLi4uKHNvdXJjZU9wdGlvbnMuZXhwZXJpbWVudGFsID09PSB0cnVlID8geyBleHBlcmltZW50YWw6IHRydWUgfSA6IHt9KSxcbiAgICAuLi4oc3RyaW5nVXRpbHMudHJpbVRvTnVsbChzb3VyY2VPcHRpb25zLnJlZikgPyB7IHJlZjogc291cmNlT3B0aW9ucy5yZWYhLnRyaW0oKSB9IDoge30pLFxuICB9O1xuICByZXR1cm4gT2JqZWN0LmtleXMocG9saWN5KS5sZW5ndGggPiAwID8gcG9saWN5IDogdW5kZWZpbmVkO1xufVxuXG4vKipcbiAqIFN0YWJsZSBpZGVudGl0eSBvZiBhIHNvdXJjZSBBTkQgaXRzIGNvbnRlbnQtYWZmZWN0aW5nIHBvbGljeS5cbiAqXG4gKiBLZXlpbmcgb24gdGhlIHNvdXJjZSBhbG9uZSB3b3VsZCBsZXQgYSBjaGFuZ2VkIGBza2lsbHNgIGZpbHRlciBvciBgcmVmYCByZWFkXG4gKiBiYWNrIHRoZSBwcmV2aW91cyBkb3dubG9hZCBmb3IgYSBkYXk7IGtleWluZyBvbiBib3RoIHR1cm5zIHRoYXQgaW50byBhIG1pc3MuXG4gKiBUaGUgc2tpbGwgbGlzdCBpcyBzb3J0ZWQgZmlyc3Qgc28gYSByZW9yZGVyZWQgYXJyYXkgaXMgc3RpbGwgdGhlIHNhbWUga2V5LlxuICovXG5mdW5jdGlvbiBjYWNoZUtleShzb3VyY2VPcHRpb25zOiBOb3JtYWxpemVkU291cmNlKTogc3RyaW5nIHtcbiAgcmV0dXJuIGhhc2guZm52SGFzaChcbiAgICBKU09OLnN0cmluZ2lmeSh7IHNvdXJjZTogc291cmNlT3B0aW9ucy5zb3VyY2UsIHBvbGljeTogY2FjaGVQb2xpY3koc291cmNlT3B0aW9ucykgPz8gbnVsbCB9KSxcbiAgKTtcbn1cblxuLyoqIFRoZSBlZmZlY3RpdmUgcmV1c2Ugd2luZG93OiBwZXItc291cmNlLCB0aGVuIHRvcC1sZXZlbCwgdGhlbiBzZXZlbiBkYXlzLiAqL1xuZnVuY3Rpb24gcmVzb2x2ZVJlZnJlc2hUdGwoXG4gIHNvdXJjZU9wdGlvbnM6IE5vcm1hbGl6ZWRTb3VyY2UsXG4gIG9wdGlvbnM6IFByb3Zpc2lvblJlbW90ZVNraWxsc09wdGlvbnMsXG4pOiBudW1iZXIge1xuICByZXR1cm4gc291cmNlT3B0aW9ucy5yZWZyZXNoVHRsTXMgPz8gb3B0aW9ucy5yZWZyZXNoVHRsTXMgPz8gREVGQVVMVF9SRUZSRVNIX1RUTF9NUztcbn1cblxuLyoqXG4gKiBSZWFkIHRoZSBtZXRhZGF0YSBkb2N1bWVudCBhdCB0aGUgcm9vdCBvZiBhIHByb3Zpc2lvbmVkIHRyZWUsIG9yIGB1bmRlZmluZWRgXG4gKiB3aGVuIHRoZXJlIGlzIG5vbmUsIGl0IGlzIHVucmVhZGFibGUsIG9yIGl0IHdhcyB3cml0dGVuIGJ5IGEgc2hhcGUgdGhpc1xuICogdmVyc2lvbiBkb2VzIG5vdCBrbm93LlxuICpcbiAqIE5ldmVyIHRocm93czogYSBtaXNzaW5nIG9yIGNvcnJ1cHQgcmVjb3JkIGlzIGEgY2FjaGUgTUlTUywgd2hpY2ggY29zdHMgYVxuICogZG93bmxvYWQgLSB3aGlsZSBsZXR0aW5nIGl0IGZhaWwgd291bGQgdGFrZSBhcHAgc3RhcnR1cCBkb3duIG92ZXJcbiAqIGJvb2trZWVwaW5nLlxuICovXG5hc3luYyBmdW5jdGlvbiByZWFkTWV0YWRhdGEoZnM6IEZpbGVTeXN0ZW0pOiBQcm9taXNlPFJlbW90ZVNraWxsc01ldGFkYXRhIHwgdW5kZWZpbmVkPiB7XG4gIHRyeSB7XG4gICAgaWYgKCEoYXdhaXQgZnMuZXhpc3RzKE1FVEFEQVRBX0ZJTEUpKSkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICBjb25zdCByYXcgPSBhd2FpdCBmcy5yZWFkRmlsZShNRVRBREFUQV9GSUxFLCB7IGVuY29kaW5nOiBcInV0ZjhcIiB9KTtcbiAgICBjb25zdCBwYXJzZWQgPSBqc29uLnBhcnNlKHJhdywgdW5kZWZpbmVkKSBhcyBSZW1vdGVTa2lsbHNNZXRhZGF0YSB8IHVuZGVmaW5lZDtcbiAgICBpZiAoIW9iamVjdC5pc1JlY29yZChwYXJzZWQpIHx8IHBhcnNlZC52ZXJzaW9uICE9PSBNRVRBREFUQV9WRVJTSU9OKSByZXR1cm4gdW5kZWZpbmVkO1xuICAgIHJldHVybiBvYmplY3QuaXNSZWNvcmQocGFyc2VkLnNvdXJjZXMpID8gcGFyc2VkIDogdW5kZWZpbmVkO1xuICB9IGNhdGNoIChlcnIpIHtcbiAgICBsb2dnZXIuZGVidWcoXCJjYWNoZTp1bnJlYWRhYmxlXCIsIHsgZXJyb3I6IGVycm9yVXRpbHMuZXJyb3JNZXNzYWdlKGVycikgfSk7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxufVxuXG4vKipcbiAqIFdoZXRoZXIgYW4gZW50cnkgaXMgc3RpbGwgaW5zaWRlIGl0cyByZXVzZSB3aW5kb3cuXG4gKlxuICogQSBgdHRsTXNgIG9mIGAwYCBkaXNhYmxlcyByZXVzZSBvdXRyaWdodCwgYW5kIGFuIHVucGFyc2VhYmxlIG9yIEZVVFVSRVxuICogdGltZXN0YW1wIGNvdW50cyBhcyBzdGFsZSAtIGEgY2xvY2sgdGhhdCBtb3ZlZCBiYWNrd2FyZHMgc2hvdWxkIGNvc3Qgb25lXG4gKiBleHRyYSBkb3dubG9hZCwgbm90IHBpbiBhIHRyZWUgYXMgZnJlc2ggaW5kZWZpbml0ZWx5LlxuICovXG5mdW5jdGlvbiBpc0ZyZXNoKGVudHJ5OiBSZW1vdGVTa2lsbENhY2hlRW50cnksIHR0bE1zOiBudW1iZXIpOiBib29sZWFuIHtcbiAgaWYgKHR0bE1zIDw9IDAgfHwgIUFycmF5LmlzQXJyYXkoZW50cnkuc2tpbGxzKSkgcmV0dXJuIGZhbHNlO1xuICBjb25zdCBkb3dubG9hZGVkQXQgPSBvYmplY3QudG9EYXRlKGVudHJ5LmRvd25sb2FkZWRBdCk7XG4gIGlmICghZG93bmxvYWRlZEF0KSByZXR1cm4gZmFsc2U7XG4gIGNvbnN0IGFnZSA9IERhdGUubm93KCkgLSBkb3dubG9hZGVkQXQuZ2V0VGltZSgpO1xuICByZXR1cm4gYWdlID49IDAgJiYgYWdlIDwgdHRsTXM7XG59XG5cbi8qKlxuICogTWVyZ2Ugb25lIHNvdXJjZSdzIGVudHJ5IGludG8gdGhlIHRyZWUncyBtZXRhZGF0YSBkb2N1bWVudCwgcHJlc2VydmluZyB3aGF0XG4gKiBvdGhlciBzb3VyY2VzIHJlY29yZGVkIC0gdGhlIERhdGFicmlja3MgZGVzdGluYXRpb24gaXMgU0hBUkVELCBzbyBhIGJsaW5kXG4gKiBvdmVyd3JpdGUgd291bGQgZHJvcCBldmVyeSBzaWJsaW5nIHNvdXJjZSdzIHRpbWVzdGFtcCBhbmQgcmUtZG93bmxvYWQgdGhlXG4gKiBsb3Qgb24gdGhlIG5leHQgYm9vdC5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gd3JpdGVNZXRhZGF0YShcbiAgZnM6IEZpbGVTeXN0ZW0sXG4gIGtleTogc3RyaW5nLFxuICBlbnRyeTogUmVtb3RlU2tpbGxDYWNoZUVudHJ5LFxuKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IGN1cnJlbnQgPSBhd2FpdCByZWFkTWV0YWRhdGEoZnMpO1xuICBjb25zdCBuZXh0OiBSZW1vdGVTa2lsbHNNZXRhZGF0YSA9IHtcbiAgICB2ZXJzaW9uOiBNRVRBREFUQV9WRVJTSU9OLFxuICAgIHNvdXJjZXM6IHsgLi4uY3VycmVudD8uc291cmNlcywgW2tleV06IGVudHJ5IH0sXG4gIH07XG4gIGF3YWl0IGZzLndyaXRlRmlsZShNRVRBREFUQV9GSUxFLCBgJHtKU09OLnN0cmluZ2lmeShuZXh0LCBudWxsLCAyKX1cXG5gLCB7IG92ZXJ3cml0ZTogdHJ1ZSB9KTtcbn1cblxuLyoqIFRoZSBzdGFibGUgbG9jYWwgdHJlZSBhIHNvdXJjZSBpcyByZWJ1aWx0IGludG8sIGtleWVkIGJ5IHtAbGluayBjYWNoZUtleX0uICovXG5mdW5jdGlvbiBsb2NhbFNraWxsc0ZTKGtleTogc3RyaW5nKTogTG9jYWxGaWxlU3lzdGVtIHtcbiAgcmV0dXJuIGxvY2FsRlMudG1wRlMoYCR7TE9DQUxfU0tJTExTX0RJUn0vJHtrZXl9YCk7XG59XG5cbi8qKlxuICogTWF0ZXJpYWxpemUgZXZlcnkgY29uZmlndXJlZCByZW1vdGUgc2tpbGwgc291cmNlIGF0IGFwcCBzdGFydHVwLlxuICpcbiAqIFdyaXRlcyBlYWNoIHJlc29sdmVkIGBTS0lMTC5tZGAgdHJlZSB0byB0aGUgRGF0YWJyaWNrcyB1c2VyIEFzc2lzdGFudCBza2lsbHNcbiAqIGZvbGRlciB3aGVuIGEgd3JpdGFibGUgd29ya3NwYWNlIGlzIGF2YWlsYWJsZSwgZWxzZSB1bmRlclxuICoge0BsaW5rIGxvY2FsRlMudG1wRlN9IHJldHVybmVkIGluIHtAbGluayBQcm92aXNpb25lZFJlbW90ZVNraWxscy5sb2NhbFNraWxsUGF0aHN9LlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcHJvdmlzaW9uUmVtb3RlU2tpbGxzKFxuICBvcHRpb246IFJlbW90ZVNraWxsc09wdGlvbiB8IHVuZGVmaW5lZCxcbik6IFByb21pc2U8UHJvdmlzaW9uZWRSZW1vdGVTa2lsbHM+IHtcbiAgY29uc3Qgb3B0aW9ucyA9IG5vcm1hbGl6ZVJlbW90ZVNraWxsc09wdGlvbihvcHRpb24pO1xuICBjb25zdCBlbXB0eTogUHJvdmlzaW9uZWRSZW1vdGVTa2lsbHMgPSB7IGxvY2FsU2tpbGxQYXRoczogW10sIHNraWxsTmFtZXM6IFtdIH07XG4gIGlmICghb3B0aW9ucykgcmV0dXJuIGVtcHR5O1xuXG4gIGNvbnN0IGZhaWxEZWZhdWx0ID0gb3B0aW9ucy5mYWlsT25FcnJvciAhPT0gZmFsc2U7XG4gIGNvbnN0IGNsaWVudCA9IG9wdGlvbnMuY2xpZW50ID8/IGFwcGtpdC50cnlHZXRFeGVjdXRpb25Db250ZXh0KCk/LmNsaWVudDtcbiAgLy8gUHJvYmVkIHJhdGhlciB0aGFuIGFzc3VtZWQ6IGFuIGlkZW50aXR5IHRoYXQgY2Fubm90IHdyaXRlIHRoZSB3b3Jrc3BhY2VcbiAgLy8gdHJlZSBmYWxscyBiYWNrIHRvIHRoZSBsb2NhbCBvbmUgaW5zdGVhZCBvZiBmYWlsaW5nIHN0YXJ0dXAuIFRoZSBwcm9iZSBhbHNvXG4gIC8vIGNyZWF0ZXMgdGhlIHJvb3QsIHdoaWNoIHRoZSBmaXJzdCBjYWNoZSBSRUFEIG5lZWRzIC0gYGNvcHlTa2lsbERpcnNgIHdvdWxkXG4gIC8vIG90aGVyd2lzZSBiZSB0aGUgZmlyc3QgdGhpbmcgdG8gY3JlYXRlIGl0LCB3aGljaCBpcyB0b28gbGF0ZS5cbiAgY29uc3QgcmVxdWVzdGVkQmFzZVBhdGggPSByZXNvbHZlRGF0YWJyaWNrc0Jhc2VQYXRoKG9wdGlvbnMsIGNsaWVudCk7XG4gIGNvbnN0IGRlc3RpbmF0aW9uID0gcmVxdWVzdGVkQmFzZVBhdGhcbiAgICA/IGF3YWl0IG9wZW5Xcml0YWJsZVdvcmtzcGFjZShyZXF1ZXN0ZWRCYXNlUGF0aCwgY2xpZW50IGFzIFdvcmtzcGFjZUNsaWVudClcbiAgICA6IHVuZGVmaW5lZDtcbiAgY29uc3QgZGF0YWJyaWNrc0Jhc2VQYXRoID0gZGVzdGluYXRpb24gPyByZXF1ZXN0ZWRCYXNlUGF0aCA6IHVuZGVmaW5lZDtcblxuICBjb25zdCBsb2NhbFNraWxsUGF0aHM6IHN0cmluZ1tdID0gW107XG4gIGNvbnN0IHNraWxsTmFtZXM6IHN0cmluZ1tdID0gW107XG4gIGxldCBzdGFnaW5nOiBMb2NhbEZpbGVTeXN0ZW0gfCB1bmRlZmluZWQ7XG5cbiAgdHJ5IHtcbiAgICBjb25zdCBzb3VyY2VzID0gQXJyYXkuaXNBcnJheShvcHRpb25zLnNvdXJjZXMpID8gb3B0aW9ucy5zb3VyY2VzIDogW29wdGlvbnMuc291cmNlc107XG4gICAgZm9yIChjb25zdCBlbnRyeSBvZiBzb3VyY2VzKSB7XG4gICAgICBjb25zdCBzb3VyY2VPcHRpb25zID0gdG9Tb3VyY2VPcHRpb25zKGVudHJ5KTtcbiAgICAgIGNvbnN0IGZhaWxPbkVycm9yID0gc291cmNlT3B0aW9ucy5mYWlsT25FcnJvciA/PyBmYWlsRGVmYXVsdDtcbiAgICAgIHRyeSB7XG4gICAgICAgIC8vIFdoZXJlIHRoaXMgc291cmNlJ3MgYm9va2tlZXBpbmcgbGl2ZXM6IHRoZSBzaGFyZWQgRGF0YWJyaWNrcyB0cmVlLCBvclxuICAgICAgICAvLyB0aGUgc291cmNlJ3Mgb3duIHN0YWJsZSBsb2NhbCBkaXIuXG4gICAgICAgIGNvbnN0IGtleSA9IGNhY2hlS2V5KHNvdXJjZU9wdGlvbnMpO1xuICAgICAgICBjb25zdCBjYWNoZUZTID0gZGVzdGluYXRpb24gPz8gbG9jYWxTa2lsbHNGUyhrZXkpO1xuICAgICAgICBjb25zdCBjYWNoZWQgPSAoYXdhaXQgcmVhZE1ldGFkYXRhKGNhY2hlRlMpKT8uc291cmNlc1trZXldO1xuICAgICAgICBpZiAoY2FjaGVkICYmIGlzRnJlc2goY2FjaGVkLCByZXNvbHZlUmVmcmVzaFR0bChzb3VyY2VPcHRpb25zLCBvcHRpb25zKSkpIHtcbiAgICAgICAgICBza2lsbE5hbWVzLnB1c2goLi4uY2FjaGVkLnNraWxscyk7XG4gICAgICAgICAgaWYgKCFkZXN0aW5hdGlvbikgbG9jYWxTa2lsbFBhdGhzLnB1c2goY2FjaGVGUy5yb290KTtcbiAgICAgICAgICBsb2dnZXIuaW5mbyhcInJlbW90ZSBza2lsbCByZWFkeVwiLCB7XG4gICAgICAgICAgICBzb3VyY2U6IHNvdXJjZU9wdGlvbnMuc291cmNlLFxuICAgICAgICAgICAgZGVzdGluYXRpb246IGRhdGFicmlja3NCYXNlUGF0aCA/PyBjYWNoZUZTLnJvb3QsXG4gICAgICAgICAgICBkb3dubG9hZGVkQXQ6IGNhY2hlZC5kb3dubG9hZGVkQXQsXG4gICAgICAgICAgICBza2lsbHM6IGNhY2hlZC5za2lsbHMsXG4gICAgICAgICAgICBjYWNoZWQ6IHRydWUsXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cblxuICAgICAgICBsb2dnZXIuaW5mbyhcImluc3RhbGxpbmcgcmVtb3RlIHNraWxsXCIsIHtcbiAgICAgICAgICBzb3VyY2U6IHNvdXJjZU9wdGlvbnMuc291cmNlLFxuICAgICAgICB9KTtcbiAgICAgICAgc3RhZ2luZyA/Pz0gYXdhaXQgaW5pdGlhbGl6ZWRTY3JhdGNoKFwibWFzdHJhLXJlbW90ZS1za2lsbHNcIik7XG4gICAgICAgIGNvbnN0IHN0YWdlZERpciA9IGF3YWl0IHN0YWdlU291cmNlKHNvdXJjZU9wdGlvbnMsIHN0YWdpbmcucm9vdCwgb3B0aW9ucyk7XG4gICAgICAgIGNvbnN0IHN0YWdlZCA9IGF3YWl0IGNvbGxlY3RTa2lsbERpcnMoc3RhZ2VkRGlyKTtcbiAgICAgICAgaWYgKHN0YWdlZC5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYG5vIFNLSUxMLm1kIGZvdW5kIGZvciBzb3VyY2UgXCIke3NvdXJjZU9wdGlvbnMuc291cmNlfVwiYCk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgcG9saWN5ID0gY2FjaGVQb2xpY3koc291cmNlT3B0aW9ucyk7XG4gICAgICAgIGNvbnN0IHJlY29yZDogUmVtb3RlU2tpbGxDYWNoZUVudHJ5ID0ge1xuICAgICAgICAgIHNvdXJjZTogc291cmNlT3B0aW9ucy5zb3VyY2UsXG4gICAgICAgICAgZG93bmxvYWRlZEF0OiBuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKCksXG4gICAgICAgICAgc2tpbGxzOiBzdGFnZWQubWFwKChkaXIpID0+IGRpci5uYW1lKSxcbiAgICAgICAgICAuLi4ocG9saWN5ID8geyBwb2xpY3kgfSA6IHt9KSxcbiAgICAgICAgfTtcbiAgICAgICAgaWYgKGRlc3RpbmF0aW9uICYmIGRhdGFicmlja3NCYXNlUGF0aCkge1xuICAgICAgICAgIGF3YWl0IGNvcHlTa2lsbERpcnMoZGVzdGluYXRpb24sIHN0YWdlZCk7XG4gICAgICAgICAgLy8gT25seSBhZnRlciB0aGUgY29weSBsYW5kczogYSBtZXRhZGF0YSBlbnRyeSB3cml0dGVuIGZpcnN0IHdvdWxkXG4gICAgICAgICAgLy8gbWFyayBhIGZhaWxlZCBwcm92aXNpb24gYXMgZnJlc2ggYW5kIHN1cHByZXNzIHRoZSByZXRyeSBmb3IgYSBkYXkuXG4gICAgICAgICAgYXdhaXQgd3JpdGVNZXRhZGF0YShkZXN0aW5hdGlvbiwga2V5LCByZWNvcmQpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGxvY2FsU2tpbGxQYXRocy5wdXNoKGF3YWl0IHBlcnNpc3RMb2NhbGx5KGtleSwgc3RhZ2VkLCByZWNvcmQpKTtcbiAgICAgICAgfVxuICAgICAgICBza2lsbE5hbWVzLnB1c2goLi4ucmVjb3JkLnNraWxscyk7XG4gICAgICAgIGxvZ2dlci5pbmZvKFwicmVtb3RlIHNraWxsIGluc3RhbGxlZFwiLCB7XG4gICAgICAgICAgc291cmNlOiBzb3VyY2VPcHRpb25zLnNvdXJjZSxcbiAgICAgICAgICBkZXN0aW5hdGlvbjogZGF0YWJyaWNrc0Jhc2VQYXRoID8/IGxvY2FsU2tpbGxQYXRocy5hdCgtMSksXG4gICAgICAgICAgc2tpbGxzOiByZWNvcmQuc2tpbGxzLFxuICAgICAgICB9KTtcbiAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICBpZiAoZmFpbE9uRXJyb3IpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgICBgZmFpbGVkIHRvIHByb3Zpc2lvbiByZW1vdGUgc2tpbGwgc291cmNlIFwiJHtzb3VyY2VPcHRpb25zLnNvdXJjZX1cIjogJHtlcnJvclV0aWxzLmVycm9yTWVzc2FnZShlcnIpfWAsXG4gICAgICAgICAgICB7IGNhdXNlOiBlcnJvclV0aWxzLnRvRXJyb3IoZXJyKSB9LFxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgICAgbG9nZ2VyLndhcm4oXCJzb3VyY2U6c2tpcHBlZFwiLCB7XG4gICAgICAgICAgc291cmNlOiBzb3VyY2VPcHRpb25zLnNvdXJjZSxcbiAgICAgICAgICBlcnJvcjogZXJyb3JVdGlscy5lcnJvck1lc3NhZ2UoZXJyKSxcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuICB9IGZpbmFsbHkge1xuICAgIGlmIChzdGFnaW5nKSB7XG4gICAgICBhd2FpdCBybShzdGFnaW5nLnJvb3QsIHsgcmVjdXJzaXZlOiB0cnVlLCBmb3JjZTogdHJ1ZSB9KS5jYXRjaCgoKSA9PiB1bmRlZmluZWQpO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiB7IGxvY2FsU2tpbGxQYXRocywgZGF0YWJyaWNrc0Jhc2VQYXRoLCBza2lsbE5hbWVzIH07XG59XG5cbi8qKiBQcm9iZSBmaWxlIHtAbGluayBvcGVuV3JpdGFibGVXb3Jrc3BhY2V9IHdyaXRlcyBhbmQgcmVtb3Zlcy4gKi9cbmNvbnN0IFdSSVRFX1BST0JFX0ZJTEUgPSBcIi5kYngtdG9vbHMtd3JpdGUtcHJvYmVcIjtcblxuLyoqXG4gKiBPcGVuIHRoZSBEYXRhYnJpY2tzIHNraWxscyBkZXN0aW5hdGlvbiwgb3IgYHVuZGVmaW5lZGAgd2hlbiB0aGlzIGlkZW50aXR5XG4gKiBjYW5ub3Qgd3JpdGUgdGhlcmUuXG4gKlxuICogVGhlIGRlZmF1bHQgZGVzdGluYXRpb24gKGAvV29ya3NwYWNlLy5hc3Npc3RhbnQvc2tpbGxzYCkgaXMgY29tbW9ubHlcbiAqIGFkbWlucy1vbmx5LCBhbmQgYW4gYXBwIHNlcnZpY2UgcHJpbmNpcGFsIGlzIG5vdCBhbiBhZG1pbiAtIHNvIGEgRGF0YWJyaWNrc1xuICogQXBwIHdyaXRpbmcgdGhlcmUgZmFpbHMgd2l0aCBgUkVTT1VSQ0VfRE9FU19OT1RfRVhJU1RgLCB3aGljaCBpcyBob3cgdGhlXG4gKiB3b3Jrc3BhY2UgQVBJIHJlcG9ydHMgYSBwYXRoIHRoZSBjYWxsZXIgaXMgbm90IGFsbG93ZWQgdG8gc2VlLiBUaGF0IGlzIGEgZmFjdFxuICogYWJvdXQgV0hFUkUgdGhlIHRyZWUgaXMgc3RvcmVkLCBub3QgYWJvdXQgd2hldGhlciB0aGUgc2tpbGxzIGFyZSB1c2FibGUsIHNvIGl0XG4gKiBkZWdyYWRlcyB0byB0aGUgbG9jYWwgdHJlZSAoaGFuZGVkIHRvIE1hc3RyYSBhcyBhbiBleHRyYSBzY2FuIHBhdGgpIHJhdGhlclxuICogdGhhbiB0YWtpbmcgYXBwIHN0YXJ0dXAgZG93biBvdmVyIGJvb2trZWVwaW5nIGxvY2F0aW9uLlxuICpcbiAqIFRoZSBwcm9iZSBpcyBhIHJlYWwgd3JpdGU6IGBta2RpcnNgIHN1Y2NlZWRzIG9uIGFuIGV4aXN0aW5nIGRpcmVjdG9yeSBldmVuIGZvclxuICogYW4gaWRlbnRpdHkgdGhhdCBjYW5ub3Qgd3JpdGUgaW50byBpdCwgc28gaW5pdCBhbG9uZSBwcm92ZXMgbm90aGluZy4gUmVtb3ZpbmdcbiAqIHRoZSBwcm9iZSBmaWxlIGlzIGJlc3QtZWZmb3J0IC0gYSBmYWlsZWQgY2xlYW51cCBtdXN0IG5vdCBkZWNpZGUgd3JpdGFiaWxpdHkuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIG9wZW5Xcml0YWJsZVdvcmtzcGFjZShcbiAgYmFzZVBhdGg6IHN0cmluZyxcbiAgY2xpZW50OiBXb3Jrc3BhY2VDbGllbnQsXG4pOiBQcm9taXNlPERhdGFicmlja3NGaWxlU3lzdGVtIHwgdW5kZWZpbmVkPiB7XG4gIGNvbnN0IGZzID0gbmV3IERhdGFicmlja3NGaWxlU3lzdGVtKHtcbiAgICBjbGllbnQ6IHdvcmtzcGFjZUNsaWVudC50b0xlZ2FjeVdvcmtzcGFjZUNsaWVudChjbGllbnQpLFxuICAgIHJvb3Q6IGJhc2VQYXRoLFxuICAgIHJlYWRPbmx5OiBmYWxzZSxcbiAgICBjcmVhdGVSb290OiB0cnVlLFxuICB9KTtcbiAgdHJ5IHtcbiAgICBhd2FpdCBmcy5pbml0KCk7XG4gICAgYXdhaXQgZnMud3JpdGVGaWxlKFdSSVRFX1BST0JFX0ZJTEUsIG5ldyBEYXRlKCkudG9JU09TdHJpbmcoKSwgeyBvdmVyd3JpdGU6IHRydWUgfSk7XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIGxvZ2dlci53YXJuKFwiZGVzdGluYXRpb246dW53cml0YWJsZVwiLCB7XG4gICAgICBkZXN0aW5hdGlvbjogYmFzZVBhdGgsXG4gICAgICBlcnJvcjogZXJyb3JVdGlscy5lcnJvck1lc3NhZ2UoZXJyKSxcbiAgICB9KTtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG4gIGF3YWl0IGZzLmRlbGV0ZUZpbGUoV1JJVEVfUFJPQkVfRklMRSwgeyBmb3JjZTogdHJ1ZSB9KS5jYXRjaCgoKSA9PiB1bmRlZmluZWQpO1xuICByZXR1cm4gZnM7XG59XG5cbi8qKiBSZXNvbHZlIHRoZSBEYXRhYnJpY2tzIEFzc2lzdGFudCBza2lsbHMgZGVzdGluYXRpb24sIG9yIGB1bmRlZmluZWRgIGZvciBsb2NhbCB0ZW1wLiAqL1xuZnVuY3Rpb24gcmVzb2x2ZURhdGFicmlja3NCYXNlUGF0aChcbiAgb3B0aW9uczogUHJvdmlzaW9uUmVtb3RlU2tpbGxzT3B0aW9ucyxcbiAgY2xpZW50OiBXb3Jrc3BhY2VDbGllbnRMaWtlIHwgdW5kZWZpbmVkLFxuKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgaWYgKCFjbGllbnQpIHJldHVybiB1bmRlZmluZWQ7XG4gIGlmIChvcHRpb25zLmRhdGFicmlja3NCYXNlUGF0aCkgcmV0dXJuIG9wdGlvbnMuZGF0YWJyaWNrc0Jhc2VQYXRoLnRyaW0oKSB8fCB1bmRlZmluZWQ7XG4gIGNvbnN0IGVtYWlsID0gc3RyaW5nVXRpbHMudHJpbVRvTnVsbChvcHRpb25zLnVzZXJFbWFpbCk7XG4gIC8vIEEgbmFtZWQgdXNlciB0YXJnZXRzIHRoZWlyIHBlcnNvbmFsIEFzc2lzdGFudCB0cmVlICh0aGUgXCJzYXZlIGEgc2tpbGxcIlxuICAvLyB0YXJnZXQpOyBvdGhlcndpc2UgdGhlIHNoYXJlZCB3b3Jrc3BhY2UgQXNzaXN0YW50IHRyZWUsIHdoaWNoIHRoZSBidWlsdC1pblxuICAvLyBBc3Npc3RhbnQtc2tpbGxzIG1vdW50IGFscmVhZHkgc2NhbnMuXG4gIHJldHVybiBlbWFpbCA/IHVzZXJBc3Npc3RhbnRTa2lsbHNQYXRoKGVtYWlsKSA6IEFTU0lTVEFOVF9TSEFSRURfU0tJTExTX1BBVEg7XG59XG5cbi8qKlxuICogU3RhZ2Ugb25lIHNvdXJjZSBpbnRvIGEgZnJlc2ggZGlyIHVuZGVyIGBzdGFnaW5nUm9vdGAsIHByZWZlcnJpbmcgdGhlIG9wdGlvbmFsXG4gKiBgc2tpbGxzYCBDTEkgYW5kIGZhbGxpbmcgYmFjayB0byBhIGRpcmVjdCBmZXRjaC5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gc3RhZ2VTb3VyY2UoXG4gIHNvdXJjZU9wdGlvbnM6IE5vcm1hbGl6ZWRTb3VyY2UsXG4gIHN0YWdpbmdSb290OiBzdHJpbmcsXG4gIG9wdGlvbnM6IFByb3Zpc2lvblJlbW90ZVNraWxsc09wdGlvbnMsXG4pOiBQcm9taXNlPHN0cmluZz4ge1xuICBjb25zdCB0YXJnZXQgPSBqb2luKHN0YWdpbmdSb290LCBgc3JjLSR7aGFzaC5pZCgpfWApO1xuICBhd2FpdCBta2Rpcih0YXJnZXQsIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICAvLyBBSSBUb29scyByZXNvbHZlcyBmcm9tIGEga25vd24gcmVwbyBsYXlvdXQsIHNvIGl0IG5ldmVyIG5lZWRzIHRoZSBDTEkuXG4gIGlmIChpc0FpVG9vbHNTb3VyY2Uoc291cmNlT3B0aW9ucy5zb3VyY2UpKSByZXR1cm4gc3RhZ2VBaVRvb2xzKHNvdXJjZU9wdGlvbnMsIHRhcmdldCwgb3B0aW9ucyk7XG4gIGNvbnN0IHZpYUNsaSA9IGF3YWl0IHN0YWdlVmlhU2tpbGxzQ2xpKHNvdXJjZU9wdGlvbnMsIHRhcmdldCk7XG4gIGlmICh2aWFDbGkpIHJldHVybiB2aWFDbGk7XG4gIHJldHVybiBzdGFnZVZpYUZldGNoKHNvdXJjZU9wdGlvbnMsIHRhcmdldCwgb3B0aW9ucyk7XG59XG5cbi8qKlxuICogTWF0ZXJpYWxpemUgdGhlIERhdGFicmlja3MgQUkgVG9vbHMgc2tpbGxzIGludG8gYHRhcmdldGAuXG4gKlxuICogUmVhZHMgdGhlIHJlcG8ncyBvd24gZ2VuZXJhdGVkIGBtYW5pZmVzdC5qc29uYCAod2hpY2ggbmFtZXMgZWFjaCBza2lsbCdzXG4gKiBmaWxlcyBhbmQgd2hldGhlciBpdCBsaXZlcyB1bmRlciBgc2tpbGxzL2Agb3IgYGV4cGVyaW1lbnRhbC9gKSBhbmQgZG93bmxvYWRzXG4gKiB0aGVtIC0gdGhlIHNhbWUgdGhpbmcgYGRhdGFicmlja3MgYWl0b29scyBpbnN0YWxsYCBkb2VzLCBtaW51cyB0aGUgQ0xJIGFuZFxuICogbWludXMgYW55IERhdGFicmlja3MgYXV0aCwgc2luY2UgdGhlIHJlcG8gaXMgcHVibGljLlxuICovXG5hc3luYyBmdW5jdGlvbiBzdGFnZUFpVG9vbHMoXG4gIHNvdXJjZU9wdGlvbnM6IE5vcm1hbGl6ZWRTb3VyY2UsXG4gIHRhcmdldDogc3RyaW5nLFxuICBvcHRpb25zOiBQcm92aXNpb25SZW1vdGVTa2lsbHNPcHRpb25zLFxuKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgY29uc3QgbWF4Qnl0ZXMgPSByZXNvbHZlTWF4Qnl0ZXMoc291cmNlT3B0aW9ucywgb3B0aW9ucyk7XG4gIGNvbnN0IHJlZiA9IHN0cmluZ1V0aWxzLnRyaW1Ub051bGwoc291cmNlT3B0aW9ucy5yZWYpID8/IEFJVE9PTFNfUkVGO1xuICBjb25zdCBtYW5pZmVzdCA9IGpzb24ucGFyc2UoXG4gICAgKGF3YWl0IGRvd25sb2FkKGFpVG9vbHNSYXdVcmwocmVmLCBcIm1hbmlmZXN0Lmpzb25cIiksIG1heEJ5dGVzKSkudG9TdHJpbmcoXCJ1dGY4XCIpLFxuICAgIHVuZGVmaW5lZCxcbiAgKSBhcyBBaVRvb2xzTWFuaWZlc3QgfCB1bmRlZmluZWQ7XG5cbiAgY29uc3Qgd2FudGVkID0gbmV3IFNldChzdHJpbmdVdGlscy5wYXJzZUxpc3Qoc291cmNlT3B0aW9ucy5za2lsbHMpKTtcbiAgY29uc3Qgc2VsZWN0ZWQgPSBPYmplY3QuZW50cmllcyhtYW5pZmVzdD8uc2tpbGxzID8/IHt9KS5maWx0ZXIoKFtuYW1lLCBlbnRyeV0pID0+XG4gICAgd2FudGVkLnNpemUgPiAwXG4gICAgICA/IHdhbnRlZC5oYXMobmFtZSlcbiAgICAgIDogZW50cnkucmVwb19kaXIgIT09IFwiZXhwZXJpbWVudGFsXCIgfHwgc291cmNlT3B0aW9ucy5leHBlcmltZW50YWwgPT09IHRydWUsXG4gICk7XG4gIGlmIChzZWxlY3RlZC5sZW5ndGggPT09IDApIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYG5vIG1hdGNoaW5nIHNraWxscyBpbiAke0FJVE9PTFNfUkVQT31AJHtyZWZ9YCk7XG4gIH1cblxuICBjb25zdCBmaWxlcyA9IHNlbGVjdGVkLmZsYXRNYXAoKFtuYW1lLCBlbnRyeV0pID0+XG4gICAgKGVudHJ5LmZpbGVzID8/IFtdKS5tYXAoKGZpbGUpID0+ICh7XG4gICAgICB1cmw6IGFpVG9vbHNSYXdVcmwocmVmLCBgJHtlbnRyeS5yZXBvX2RpciA/PyBcInNraWxsc1wifS8ke25hbWV9LyR7ZmlsZX1gKSxcbiAgICAgIHBhdGg6IGpvaW4odGFyZ2V0LCBuYW1lLCAuLi5maWxlLnNwbGl0KFwiL1wiKSksXG4gICAgfSkpLFxuICApO1xuICBhd2FpdCBhc3luY1V0aWxzLm1hcENvbmN1cnJlbnQoXG4gICAgZmlsZXMsXG4gICAgYXN5bmMgKGl0ZW0pID0+IHtcbiAgICAgIGNvbnN0IGJvZHkgPSBhd2FpdCBkb3dubG9hZChpdGVtLnVybCwgbWF4Qnl0ZXMpO1xuICAgICAgYXdhaXQgbWtkaXIoZGlybmFtZShpdGVtLnBhdGgpLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgICAgIGF3YWl0IHdyaXRlRmlsZShpdGVtLnBhdGgsIGJvZHkpO1xuICAgIH0sXG4gICAgeyBjb25jdXJyZW5jeTogQUlUT09MU19DT05DVVJSRU5DWSB9LFxuICApO1xuXG4gIGxvZ2dlci5kZWJ1ZyhcImFpdG9vbHM6c3RhZ2VkXCIsIHsgcmVmLCBza2lsbHM6IHNlbGVjdGVkLmxlbmd0aCwgZmlsZXM6IGZpbGVzLmxlbmd0aCB9KTtcbiAgcmV0dXJuIHRhcmdldDtcbn1cblxuLyoqIFJhdy1jb250ZW50IFVSTCBmb3IgYSBwYXRoIGluIHRoZSBBSSBUb29scyByZXBvIGF0IGByZWZgLiAqL1xuZnVuY3Rpb24gYWlUb29sc1Jhd1VybChyZWY6IHN0cmluZywgcGF0aDogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIGBodHRwczovL3Jhdy5naXRodWJ1c2VyY29udGVudC5jb20vJHtBSVRPT0xTX1JFUE99LyR7cmVmfS8ke3BhdGh9YDtcbn1cblxuLyoqXG4gKiBDb3B5IGEgc291cmNlIGludG8gYHRhcmdldGAgd2l0aCB0aGUgYHNraWxsc2AgQ0xJIHdoZW4gaXQgaXMgaW5zdGFsbGVkLlxuICogUmV0dXJucyB0aGUgZGlyIGhvbGRpbmcgdGhlIGNvcGllZCBgU0tJTEwubWRgIHRyZWVzLCBvciBgdW5kZWZpbmVkYCB3aGVuIHRoZVxuICogQ0xJIGlzIGFic2VudCAoc28gdGhlIGNhbGxlciBjYW4gZmFsbCBiYWNrIHRvIGEgZmV0Y2gpLlxuICovXG5hc3luYyBmdW5jdGlvbiBzdGFnZVZpYVNraWxsc0NsaShcbiAgc291cmNlT3B0aW9uczogTm9ybWFsaXplZFNvdXJjZSxcbiAgdGFyZ2V0OiBzdHJpbmcsXG4pOiBQcm9taXNlPHN0cmluZyB8IHVuZGVmaW5lZD4ge1xuICBjb25zdCBjbGkgPSBhd2FpdCByZXNvbHZlU2tpbGxzQ2xpKCk7XG4gIGlmICghY2xpKSByZXR1cm4gdW5kZWZpbmVkO1xuXG4gIGNvbnN0IGFyZ3MgPSBbXG4gICAgLi4uY2xpLmFyZ3MsXG4gICAgXCJhZGRcIixcbiAgICBzb3VyY2VPcHRpb25zLnNvdXJjZSxcbiAgICBcIi0tYWdlbnRcIixcbiAgICBTS0lMTFNfQ0xJX0FHRU5ULFxuICAgIFwiLS1jb3B5XCIsXG4gICAgXCIteVwiLFxuICBdO1xuICBmb3IgKGNvbnN0IHNraWxsIG9mIHN0cmluZ1V0aWxzLnBhcnNlTGlzdChzb3VyY2VPcHRpb25zLnNraWxscykpIHtcbiAgICBhcmdzLnB1c2goXCItLXNraWxsXCIsIHNraWxsKTtcbiAgfVxuICBpZiAoc3RyaW5nVXRpbHMucGFyc2VMaXN0KHNvdXJjZU9wdGlvbnMuc2tpbGxzKS5sZW5ndGggPT09IDApIGFyZ3MucHVzaChcIi0tc2tpbGxcIiwgXCIqXCIpO1xuXG4gIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGV4ZWMuc3Bhd24oY2xpLmNvbW1hbmQsIGFyZ3MsIHtcbiAgICBjd2Q6IHRhcmdldCxcbiAgICBzdGRvdXQ6IFwiY2FwdHVyZVwiLFxuICAgIHN0ZGVycjogXCJjYXB0dXJlXCIsXG4gICAgY2hlY2s6IGZhbHNlLFxuICB9KTtcbiAgaWYgKHJlc3VsdC5leGl0Q29kZSAhPT0gMCkge1xuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgIGBza2lsbHMgQ0xJIGZhaWxlZCAoZXhpdCAke3Jlc3VsdC5leGl0Q29kZX0pOiAke3Jlc3VsdC5zdGRlcnIgfHwgcmVzdWx0LnN0ZG91dH1gLFxuICAgICk7XG4gIH1cbiAgcmV0dXJuIGpvaW4odGFyZ2V0LCAuLi5TS0lMTFNfQ0xJX0xBWU9VVCk7XG59XG5cbi8qKlxuICogTG9jYXRlIHRoZSBvcHRpb25hbCBgc2tpbGxzYCBDTEkgYmluLCByZXNvbHZlZCBmcm9tIFRISVMgcGFja2FnZSdzIG1vZHVsZVxuICogZ3JhcGguIFJldHVybnMgYHVuZGVmaW5lZGAgd2hlbiB0aGUgcGVlciBkZXAgaXNuJ3QgaW5zdGFsbGVkLCBzbyB0aGUgY2FsbGVyXG4gKiBmYWxscyBiYWNrIHRvIGEgZGlyZWN0IGZldGNoLlxuICovXG5hc3luYyBmdW5jdGlvbiByZXNvbHZlU2tpbGxzQ2xpKCk6IFByb21pc2U8eyBjb21tYW5kOiBzdHJpbmc7IGFyZ3M6IHN0cmluZ1tdIH0gfCB1bmRlZmluZWQ+IHtcbiAgdHJ5IHtcbiAgICBjb25zdCByZXF1aXJlID0gY3JlYXRlUmVxdWlyZShpbXBvcnQubWV0YS51cmwpO1xuICAgIGNvbnN0IHBrZ1BhdGggPSByZXF1aXJlLnJlc29sdmUoXCJza2lsbHMvcGFja2FnZS5qc29uXCIpO1xuICAgIGNvbnN0IGJpbiA9IGpvaW4ocGtnUGF0aCwgXCIuLlwiLCBcImJpblwiLCBcImNsaS5tanNcIik7XG4gICAgaWYgKGF3YWl0IHBhdGhFeGlzdHMoYmluKSkgcmV0dXJuIHsgY29tbWFuZDogcHJvY2Vzcy5leGVjUGF0aCwgYXJnczogW2Jpbl0gfTtcbiAgfSBjYXRjaCB7XG4gICAgLy8gcGVlciBkZXAgYWJzZW50IG9yIHVucmVzb2x2YWJsZSAtIGZldGNoIGZhbGxiYWNrIGhhbmRsZXMgaXRcbiAgfVxuICByZXR1cm4gdW5kZWZpbmVkO1xufVxuXG4vKipcbiAqIEZldGNoIGEgc291cmNlIFVSTCBhbmQgd3JpdGUgdGhlIGRvd25sb2FkZWQgYFNLSUxMLm1kYCB1bmRlciBgdGFyZ2V0YC5cbiAqIFVzZWQgd2hlbiB0aGUgYHNraWxsc2AgQ0xJIGlzbid0IGluc3RhbGxlZDsgc3VwcG9ydHMgYSBkaXJlY3QgYFNLSUxMLm1kYCBVUkwuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIHN0YWdlVmlhRmV0Y2goXG4gIHNvdXJjZU9wdGlvbnM6IE5vcm1hbGl6ZWRTb3VyY2UsXG4gIHRhcmdldDogc3RyaW5nLFxuICBvcHRpb25zOiBQcm92aXNpb25SZW1vdGVTa2lsbHNPcHRpb25zLFxuKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgY29uc3QgdXJsID0gbmV0LnVybEJ1aWxkZXIoc291cmNlT3B0aW9ucy5zb3VyY2UpO1xuICBpZiAoIXVybCkge1xuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgIGBzb3VyY2UgXCIke3NvdXJjZU9wdGlvbnMuc291cmNlfVwiIGlzIG5vdCBhIFVSTCBhbmQgdGhlIG9wdGlvbmFsIFwic2tpbGxzXCIgcGFja2FnZSBpcyBub3QgaW5zdGFsbGVkYCxcbiAgICApO1xuICB9XG4gIGNvbnN0IGJ1ZmZlciA9IGF3YWl0IGRvd25sb2FkKHVybC50b1N0cmluZygpLCByZXNvbHZlTWF4Qnl0ZXMoc291cmNlT3B0aW9ucywgb3B0aW9ucykpO1xuICBjb25zdCBuYW1lID0gc3RyaW5nVXRpbHMudG9TbHVnKGRlcml2ZVNraWxsTmFtZSh1cmwudG9TdHJpbmcoKSkpIHx8IFwicmVtb3RlLXNraWxsXCI7XG4gIGNvbnN0IHNraWxsRGlyID0gam9pbih0YXJnZXQsIG5hbWUpO1xuICBhd2FpdCBta2Rpcihza2lsbERpciwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG4gIGF3YWl0IHdyaXRlRmlsZShqb2luKHNraWxsRGlyLCBcIlNLSUxMLm1kXCIpLCBidWZmZXIpO1xuICByZXR1cm4gdGFyZ2V0O1xufVxuXG4vKiogVGhlIGVmZmVjdGl2ZSBkb3dubG9hZCBjZWlsaW5nOiBwZXItc291cmNlLCB0aGVuIHRvcC1sZXZlbCwgdGhlbiB0aGUgZGVmYXVsdC4gKi9cbmZ1bmN0aW9uIHJlc29sdmVNYXhCeXRlcyhcbiAgc291cmNlT3B0aW9uczogTm9ybWFsaXplZFNvdXJjZSxcbiAgb3B0aW9uczogUHJvdmlzaW9uUmVtb3RlU2tpbGxzT3B0aW9ucyxcbik6IG51bWJlciB7XG4gIHJldHVybiBzb3VyY2VPcHRpb25zLm1heERvd25sb2FkQnl0ZXMgPz8gb3B0aW9ucy5tYXhEb3dubG9hZEJ5dGVzID8/IERFRkFVTFRfTUFYX0RPV05MT0FEX0JZVEVTO1xufVxuXG4vKiogR0VUIGEgVVJMLCBmYWlsaW5nIGxvdWRseSBvbiBhIG5vbi0yeHggc3RhdHVzIG9yIGFuIG92ZXJzaXplZCBib2R5LiAqL1xuYXN5bmMgZnVuY3Rpb24gZG93bmxvYWQodXJsOiBzdHJpbmcsIG1heEJ5dGVzOiBudW1iZXIpOiBQcm9taXNlPEJ1ZmZlcj4ge1xuICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGZldGNoKHVybCwge1xuICAgIHNpZ25hbDogQWJvcnRTaWduYWwudGltZW91dChERUZBVUxUX0RPV05MT0FEX1RJTUVPVVRfTVMpLFxuICB9KS5jYXRjaCgoZXJyKSA9PiB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBkb3dubG9hZCBmYWlsZWQgKCR7dXJsfSk6ICR7ZXJyb3JVdGlscy5lcnJvck1lc3NhZ2UoZXJyKX1gLCB7XG4gICAgICBjYXVzZTogZXJyb3JVdGlscy50b0Vycm9yKGVyciksXG4gICAgfSk7XG4gIH0pO1xuICBpZiAoIXJlc3BvbnNlLm9rKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBkb3dubG9hZCBmYWlsZWQ6ICR7cmVzcG9uc2Uuc3RhdHVzfSAke3Jlc3BvbnNlLnN0YXR1c1RleHR9ICgke3VybH0pYCk7XG4gIH1cbiAgY29uc3QgYnVmZmVyID0gQnVmZmVyLmZyb20oYXdhaXQgcmVzcG9uc2UuYXJyYXlCdWZmZXIoKSk7XG4gIGlmIChidWZmZXIuYnl0ZUxlbmd0aCA+IG1heEJ5dGVzKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBkb3dubG9hZCBleGNlZWRzICR7bWF4Qnl0ZXN9IGJ5dGVzICgke3VybH0pYCk7XG4gIH1cbiAgcmV0dXJuIGJ1ZmZlcjtcbn1cblxuLyoqIERlcml2ZSBhIHNraWxsIGRpcmVjdG9yeSBuYW1lIGZyb20gYSBkb3dubG9hZCBVUkwncyBsYXN0IHBhdGggc2VnbWVudC4gKi9cbmZ1bmN0aW9uIGRlcml2ZVNraWxsTmFtZSh1cmxTdHJpbmc6IHN0cmluZyk6IHN0cmluZyB7XG4gIGNvbnN0IHVybCA9IG5ldC51cmxCdWlsZGVyKHVybFN0cmluZyk7XG4gIGNvbnN0IGxhc3QgPSB1cmw/LnBhdGhuYW1lLnNwbGl0KFwiL1wiKS5maWx0ZXIoQm9vbGVhbikucG9wKCkgPz8gXCJcIjtcbiAgcmV0dXJuIGxhc3QucmVwbGFjZSgvXFwuKG1kfHppcHx0YXJ8dGd6fGd6KSQvaSwgXCJcIik7XG59XG5cbi8qKiBBIHNraWxsIGRpcmVjdG9yeSAoaG9sZGluZyBhIGBTS0lMTC5tZGApIHN0YWdlZCBvbiBsb2NhbCBkaXNrLiAqL1xuaW50ZXJmYWNlIFN0YWdlZFNraWxsRGlyIHtcbiAgbmFtZTogc3RyaW5nO1xuICBhYnNvbHV0ZVBhdGg6IHN0cmluZztcbn1cblxuLyoqXG4gKiBDb2xsZWN0IGV2ZXJ5IHNraWxsIGRpcmVjdG9yeSB1bmRlciBgcm9vdGA6IGEgYHJvb3QvU0tJTEwubWRgIChyb290IElTIHRoZVxuICogc2tpbGwpIG9yIGVhY2ggaW1tZWRpYXRlIGNoaWxkIGRpciB0aGF0IGNvbnRhaW5zIGEgYFNLSUxMLm1kYC5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gY29sbGVjdFNraWxsRGlycyhyb290OiBzdHJpbmcpOiBQcm9taXNlPFN0YWdlZFNraWxsRGlyW10+IHtcbiAgaWYgKCEoYXdhaXQgcGF0aEV4aXN0cyhyb290KSkpIHJldHVybiBbXTtcbiAgaWYgKGF3YWl0IHBhdGhFeGlzdHMoam9pbihyb290LCBcIlNLSUxMLm1kXCIpKSkge1xuICAgIGNvbnN0IG5hbWUgPSBwb3NpeC5iYXNlbmFtZShyb290LnNwbGl0KC9bXFxcXC9dLykuam9pbihcIi9cIikpO1xuICAgIHJldHVybiBbeyBuYW1lLCBhYnNvbHV0ZVBhdGg6IHJvb3QgfV07XG4gIH1cbiAgY29uc3QgZGlyczogU3RhZ2VkU2tpbGxEaXJbXSA9IFtdO1xuICBmb3IgKGNvbnN0IGVudHJ5IG9mIGF3YWl0IHJlYWRkaXIocm9vdCwgeyB3aXRoRmlsZVR5cGVzOiB0cnVlIH0pKSB7XG4gICAgaWYgKCFlbnRyeS5pc0RpcmVjdG9yeSgpKSBjb250aW51ZTtcbiAgICBjb25zdCBkaXIgPSBqb2luKHJvb3QsIGVudHJ5Lm5hbWUpO1xuICAgIGlmIChhd2FpdCBwYXRoRXhpc3RzKGpvaW4oZGlyLCBcIlNLSUxMLm1kXCIpKSkge1xuICAgICAgZGlycy5wdXNoKHsgbmFtZTogZW50cnkubmFtZSwgYWJzb2x1dGVQYXRoOiBkaXIgfSk7XG4gICAgfVxuICB9XG4gIHJldHVybiBkaXJzO1xufVxuXG4vKipcbiAqIENvcHkgZXZlcnkgc3RhZ2VkIHNraWxsIGRpcmVjdG9yeSBpbnRvIHtAbGluayBkZXN0aW5hdGlvbn0sIHByZXNlcnZpbmcgdGhlXG4gKiBgPHNraWxsPi88cmVsYXRpdmU+YCBsYXlvdXQuIFRoZSBkZXN0aW5hdGlvbiBpcyBqdXN0IGEge0BsaW5rIEZpbGVTeXN0ZW19LFxuICogc28gdGhlIERhdGFicmlja3MgQXNzaXN0YW50IHRyZWUgYW5kIHRoZSBsb2NhbCBmYWxsYmFjayBzaGFyZSBvbmUgY29waWVyLlxuICovXG5hc3luYyBmdW5jdGlvbiBjb3B5U2tpbGxEaXJzKGRlc3RpbmF0aW9uOiBGaWxlU3lzdGVtLCBkaXJzOiBTdGFnZWRTa2lsbERpcltdKTogUHJvbWlzZTx2b2lkPiB7XG4gIGF3YWl0IGRlc3RpbmF0aW9uLmluaXQoKTtcbiAgZm9yIChjb25zdCBkaXIgb2YgZGlycykge1xuICAgIGZvciAoY29uc3QgcmVsYXRpdmUgb2YgZmluZC5maW5kRmlsZXMoXCIqKi8qXCIsIHsgY3dkOiBkaXIuYWJzb2x1dGVQYXRoLCBub2RpcjogdHJ1ZSB9KSkge1xuICAgICAgY29uc3QgYnVmZmVyID0gYXdhaXQgcmVhZEZpbGUoam9pbihkaXIuYWJzb2x1dGVQYXRoLCByZWxhdGl2ZSkpO1xuICAgICAgY29uc3Qgc2tpbGxQYXRoID0gcG9zaXguam9pbihkaXIubmFtZSwgcmVsYXRpdmUuc3BsaXQoL1tcXFxcL10vKS5qb2luKFwiL1wiKSk7XG4gICAgICBhd2FpdCBkZXN0aW5hdGlvbi53cml0ZUZpbGUoc2tpbGxQYXRoLCBidWZmZXIsIHsgb3ZlcndyaXRlOiB0cnVlIH0pO1xuICAgIH1cbiAgfVxufVxuXG4vKipcbiAqIENvcHkgc3RhZ2VkIHNraWxsIGRpcnMgaW50byBhIFNUQUJMRSBsb2NhbCB0cmVlIGtleWVkIGJ5IHRoZSBzb3VyY2UsIGFuZFxuICogcmV0dXJuIGl0cyByb290IHBhdGguXG4gKlxuICogQSBnaXZlbiBzb3VyY2UgcmVzb2x2ZXMgdG8gdGhlIHNhbWUgY29udGVudCBvbiBhbG1vc3QgZXZlcnkgYm9vdCwgc28gZWFjaFxuICogb25lIG93bnMgYSBkaXJlY3RvcnkgbmFtZWQgZm9yIGl0cyB7QGxpbmsgY2FjaGVLZXl9IHJhdGhlciB0aGFuIGxlYXZpbmcgYVxuICogZnJlc2ggc2NyYXRjaCBkaXIgYmVoaW5kIHBlciByZXN0YXJ0LiBLZXlpbmcgb24gdGhlIHNvdXJjZSBhbmQgaXRzIHBvbGljeVxuICogKG5vdCB0aGUgY29udGVudCkgaXMgd2hhdCBrZWVwcyB0d28gZGlmZmVyZW50IHNvdXJjZXMgZnJvbSBvdmVyd3JpdGluZyBlYWNoXG4gKiBvdGhlci5cbiAqXG4gKiBUaGUgbWV0YWRhdGEgaXMgd3JpdHRlbiBJTlNJREUgdGhlIHJlYnVpbGQgcmF0aGVyIHRoYW4gYWZ0ZXIgaXQ6IGByZWJ1aWxkRlNgXG4gKiByZXBsYWNlcyB0aGUgc3RhYmxlIHJvb3Qgd2hvbGVzYWxlLCBzbyBhbnl0aGluZyB3cml0dGVuIGFmdGVyd2FyZHMgd291bGRcbiAqIHN1cnZpdmUgb25seSB1bnRpbCB0aGUgbmV4dCByZWZyZXNoLCBhbmQgYW55dGhpbmcgd3JpdHRlbiBiZWZvcmUgd291bGQgYmVcbiAqIHRocm93biBhd2F5IGJ5IHRoZSBzd2FwLlxuICovXG5hc3luYyBmdW5jdGlvbiBwZXJzaXN0TG9jYWxseShcbiAga2V5OiBzdHJpbmcsXG4gIGRpcnM6IFN0YWdlZFNraWxsRGlyW10sXG4gIHJlY29yZDogUmVtb3RlU2tpbGxDYWNoZUVudHJ5LFxuKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgY29uc3Qgc3RhYmxlID0gYXdhaXQgbG9jYWxGUy5yZWJ1aWxkRlMoYCR7TE9DQUxfU0tJTExTX0RJUn0vJHtrZXl9YCwgYXN5bmMgKHNjcmF0Y2gpID0+IHtcbiAgICBhd2FpdCBjb3B5U2tpbGxEaXJzKHNjcmF0Y2gsIGRpcnMpO1xuICAgIGF3YWl0IHdyaXRlTWV0YWRhdGEoc2NyYXRjaCwga2V5LCByZWNvcmQpO1xuICB9KTtcbiAgcmV0dXJuIHN0YWJsZS5yb290O1xufVxuXG4vKipcbiAqIEEgc2NyYXRjaCBmaWxlc3lzdGVtIHdob3NlIHJvb3QgZXhpc3RzIG9uIGRpc2ssIGZvciB0aGUgcGF0aHMgdGhhdCBoYW5kIGFcbiAqIHJlYWwgZGlyZWN0b3J5IHRvIGBub2RlOmZzYCBvciBhIGNoaWxkIHByb2Nlc3MgcmF0aGVyIHRoYW4gZ29pbmcgdGhyb3VnaFxuICogdGhlIHtAbGluayBGaWxlU3lzdGVtfSBBUEkuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGluaXRpYWxpemVkU2NyYXRjaChwcmVmaXg6IHN0cmluZyk6IFByb21pc2U8TG9jYWxGaWxlU3lzdGVtPiB7XG4gIGNvbnN0IHNjcmF0Y2ggPSBsb2NhbEZTLnNjcmF0Y2hGUyhwcmVmaXgpO1xuICBhd2FpdCBzY3JhdGNoLmluaXQoKTtcbiAgcmV0dXJuIHNjcmF0Y2g7XG59XG5cbi8qKiBCZXN0LWVmZm9ydCBleGlzdGVuY2UgY2hlY2suICovXG5hc3luYyBmdW5jdGlvbiBwYXRoRXhpc3RzKHBhdGg6IHN0cmluZyk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICB0cnkge1xuICAgIGF3YWl0IHN0YXQocGF0aCk7XG4gICAgcmV0dXJuIHRydWU7XG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxufVxuIl19