@mnaoumov/obsidian-lib 9.0.0 → 10.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -248,8 +248,8 @@ function buildBacklinksSnapshot(params) {
248
248
  payloads = /* @__PURE__ */ new Map();
249
249
  snapshot.set(newBacklinkPath, payloads);
250
250
  }
251
- for (const link of backlinks.get(backlinkPath) ?? []) {
252
- payloads.set(referenceIdentityKeyProvider(link), payloadProvider(link));
251
+ for (const reference of backlinks.get(backlinkPath) ?? []) {
252
+ payloads.set(referenceIdentityKeyProvider(reference), payloadProvider(reference));
253
253
  }
254
254
  }
255
255
  return snapshot;
@@ -320,11 +320,11 @@ async function editBacklinksSnapshot(params) {
320
320
  await editReferences({
321
321
  app,
322
322
  pathOrFile: backlinkNotePath,
323
- referenceConverter: (link) => {
324
- const referenceIdentityKey = referenceIdentityKeyProvider(link);
323
+ referenceConverter: (reference) => {
324
+ const referenceIdentityKey = referenceIdentityKeyProvider(reference);
325
325
  return !payloads.has(referenceIdentityKey) && !shouldVisitUnmatchedReferences ? void 0 : referenceConverter({
326
326
  payload: payloads.get(referenceIdentityKey),
327
- reference: link,
327
+ reference,
328
328
  sourcePath: backlinkNotePath
329
329
  });
330
330
  },
@@ -347,6 +347,7 @@ async function editReferences(params) {
347
347
  shouldEditExternalLinks = false,
348
348
  shouldEditFrontmatterExternalLinks = false,
349
349
  shouldEditMultiValueFrontmatterExternalLinks = false,
350
+ shouldSkipReference,
350
351
  shouldSkipReferencesInHeadings = false,
351
352
  ...options
352
353
  } = params;
@@ -374,6 +375,7 @@ async function editReferences(params) {
374
375
  shouldIncludeExternalLinks: shouldEditExternalLinks,
375
376
  shouldIncludeFrontmatterExternalLinks: shouldEditFrontmatterExternalLinks,
376
377
  shouldIncludeMultiValueFrontmatterExternalLinks: shouldEditMultiValueFrontmatterExternalLinks,
378
+ shouldSkipReference,
377
379
  shouldSkipReferencesInHeadings
378
380
  })) : null;
379
381
  },
@@ -390,6 +392,7 @@ async function editReferencesInContent(params) {
390
392
  shouldEditExternalLinks = false,
391
393
  shouldEditFrontmatterExternalLinks = false,
392
394
  shouldEditMultiValueFrontmatterExternalLinks = false,
395
+ shouldSkipReference,
393
396
  shouldSkipReferencesInHeadings = false
394
397
  } = params;
395
398
  let { abortSignal } = params;
@@ -416,6 +419,7 @@ async function editReferencesInContent(params) {
416
419
  shouldIncludeExternalLinks: shouldEditExternalLinks,
417
420
  shouldIncludeFrontmatterExternalLinks: shouldEditFrontmatterExternalLinks,
418
421
  shouldIncludeMultiValueFrontmatterExternalLinks: shouldEditMultiValueFrontmatterExternalLinks,
422
+ shouldSkipReference,
419
423
  shouldSkipReferencesInHeadings
420
424
  }));
421
425
  abortSignal.throwIfAborted();
@@ -431,11 +435,11 @@ async function editReferencesInContent(params) {
431
435
  function extractReferenceFile(params) {
432
436
  const {
433
437
  app,
434
- reference: link,
438
+ reference,
435
439
  shouldAllowNonExistingFile = false,
436
440
  sourcePathOrFile
437
441
  } = params;
438
- const { linkPath } = splitSubpath(link.link);
442
+ const { linkPath } = splitSubpath(reference.link);
439
443
  const sourcePath = (0, import_file_system.getPath)(app, sourcePathOrFile);
440
444
  const file = app.metadataCache.getFirstLinkpathDest(linkPath, sourcePath);
441
445
  if (file) {
@@ -564,16 +568,17 @@ function splitSubpath(link) {
564
568
  };
565
569
  }
566
570
  async function updateFileUrlLinksInContent(params) {
567
- const { app, content, offsetRange, shouldSkipReferencesInHeadings, shouldUseAngleBrackets = false } = params;
571
+ const { app, content, offsetRange, shouldSkipReference, shouldSkipReferencesInHeadings, shouldUseAngleBrackets = false } = params;
568
572
  return await editReferencesInContent((0, import_object_utils.normalizeOptionalProperties)({
569
573
  abortSignal: params.abortSignal,
570
574
  app,
571
575
  content,
572
576
  offsetRange,
573
- referenceConverter: (link) => normalizeFileUrlLink(link, shouldUseAngleBrackets),
577
+ referenceConverter: (reference) => normalizeFileUrlLink(reference, shouldUseAngleBrackets),
574
578
  shouldEditExternalLinks: true,
575
579
  shouldEditFrontmatterExternalLinks: true,
576
580
  shouldEditMultiValueFrontmatterExternalLinks: true,
581
+ shouldSkipReference,
577
582
  shouldSkipReferencesInHeadings
578
583
  }));
579
584
  }
@@ -582,6 +587,7 @@ async function updateFileUrlLinksInFile(params) {
582
587
  app,
583
588
  offsetRange,
584
589
  pathOrFile,
590
+ shouldSkipReference,
585
591
  shouldSkipReferencesInHeadings,
586
592
  shouldUseAngleBrackets = false,
587
593
  ...options
@@ -591,10 +597,11 @@ async function updateFileUrlLinksInFile(params) {
591
597
  // Forwarded by name rather than through `options`, so a later refactor cannot drop it silently.
592
598
  offsetRange,
593
599
  pathOrFile,
594
- referenceConverter: (link) => normalizeFileUrlLink(link, shouldUseAngleBrackets),
600
+ referenceConverter: (reference) => normalizeFileUrlLink(reference, shouldUseAngleBrackets),
595
601
  shouldEditExternalLinks: true,
596
602
  shouldEditFrontmatterExternalLinks: true,
597
603
  shouldEditMultiValueFrontmatterExternalLinks: true,
604
+ shouldSkipReference,
598
605
  shouldSkipReferencesInHeadings,
599
606
  ...options
600
607
  }));
@@ -609,7 +616,7 @@ function updateLink(params) {
609
616
  newTargetPathOrFile,
610
617
  oldSourcePathOrFile,
611
618
  oldTargetPathOrFile,
612
- reference: link,
619
+ reference,
613
620
  shouldEscapeAlias,
614
621
  shouldIncludeAttachmentExtensionToEmbedAlias,
615
622
  shouldUpdateFileNameAlias = true,
@@ -617,7 +624,7 @@ function updateLink(params) {
617
624
  shouldUseLeadingDotForRelativePaths,
618
625
  shouldUseLeadingSlashForAbsolutePaths
619
626
  } = params;
620
- const originalLinkText = (0, import_reference.getReferenceLinkText)(link);
627
+ const originalLinkText = (0, import_reference.getReferenceLinkText)(reference);
621
628
  if (!newTargetPathOrFile) {
622
629
  return originalLinkText;
623
630
  }
@@ -629,8 +636,8 @@ function updateLink(params) {
629
636
  linkStyle,
630
637
  originalLink: originalLinkText
631
638
  }));
632
- const { subpath } = splitSubpath(link.link);
633
- if ((0, import_file_system.isCanvasFile)(newSourcePathOrFile) && (0, import_reference.isCanvasFileNodeReference)(link)) {
639
+ const { subpath } = splitSubpath(reference.link);
640
+ if ((0, import_file_system.isCanvasFile)(newSourcePathOrFile) && (0, import_reference.isCanvasFileNodeReference)(reference)) {
634
641
  return newTargetFile.path + subpath;
635
642
  }
636
643
  const parseLinkResult = (0, import_parse_link.parseLink)(originalLinkText);
@@ -640,7 +647,7 @@ function updateLink(params) {
640
647
  }
641
648
  alias ??= shouldResetAlias((0, import_object_utils.normalizeOptionalProperties)({
642
649
  app,
643
- displayText: link.displayText,
650
+ displayText: reference.displayText,
644
651
  isWikilink,
645
652
  newSourcePathOrFile,
646
653
  oldSourcePathOrFile,
@@ -688,6 +695,7 @@ async function updateReferencesInContent(params) {
688
695
  oldSourcePathOrFile,
689
696
  shouldEscapeAlias,
690
697
  shouldIncludeAttachmentExtensionToEmbedAlias,
698
+ shouldSkipReference,
691
699
  shouldSkipReferencesInHeadings,
692
700
  shouldUpdateEmbedOnlyLinks,
693
701
  shouldUpdateFileNameAlias,
@@ -699,16 +707,16 @@ async function updateReferencesInContent(params) {
699
707
  app,
700
708
  content,
701
709
  offsetRange,
702
- referenceConverter: (link) => {
703
- const isEmbedLink = hasEmbedSyntax((0, import_reference.getReferenceLinkText)(link));
710
+ referenceConverter: (reference) => {
711
+ const isEmbedLink = hasEmbedSyntax((0, import_reference.getReferenceLinkText)(reference));
704
712
  return shouldUpdateEmbedOnlyLinks !== void 0 && shouldUpdateEmbedOnlyLinks !== isEmbedLink ? void 0 : convertLink((0, import_object_utils.normalizeOptionalProperties)({
705
713
  app,
706
714
  isEmptyEmbedAliasAllowed,
707
715
  linkPathStyle,
708
- linkStyle: linkStyleProvider?.(link) ?? linkStyle,
716
+ linkStyle: linkStyleProvider?.(reference) ?? linkStyle,
709
717
  newSourcePathOrFile,
710
718
  oldSourcePathOrFile,
711
- reference: link,
719
+ reference,
712
720
  shouldEscapeAlias,
713
721
  shouldIncludeAttachmentExtensionToEmbedAlias,
714
722
  shouldUpdateFileNameAlias,
@@ -717,6 +725,7 @@ async function updateReferencesInContent(params) {
717
725
  shouldUseLeadingSlashForAbsolutePaths
718
726
  }));
719
727
  },
728
+ shouldSkipReference,
720
729
  shouldSkipReferencesInHeadings
721
730
  }));
722
731
  }
@@ -732,6 +741,7 @@ async function updateReferencesInFile(params) {
732
741
  oldSourcePathOrFile,
733
742
  shouldEscapeAlias,
734
743
  shouldIncludeAttachmentExtensionToEmbedAlias,
744
+ shouldSkipReference,
735
745
  shouldSkipReferencesInHeadings,
736
746
  shouldUpdateEmbedOnlyLinks,
737
747
  shouldUpdateFileNameAlias,
@@ -747,16 +757,16 @@ async function updateReferencesInFile(params) {
747
757
  // Named beside the `...params` spread, so a later refactor to explicit forwarding cannot drop it silently.
748
758
  offsetRange,
749
759
  pathOrFile: newSourcePathOrFile,
750
- referenceConverter: (link) => {
751
- const isEmbedLink = hasEmbedSyntax((0, import_reference.getReferenceLinkText)(link));
760
+ referenceConverter: (reference) => {
761
+ const isEmbedLink = hasEmbedSyntax((0, import_reference.getReferenceLinkText)(reference));
752
762
  return shouldUpdateEmbedOnlyLinks !== void 0 && shouldUpdateEmbedOnlyLinks !== isEmbedLink ? void 0 : convertLink((0, import_object_utils.normalizeOptionalProperties)({
753
763
  app,
754
764
  isEmptyEmbedAliasAllowed,
755
765
  linkPathStyle,
756
- linkStyle: linkStyleProvider?.(link) ?? linkStyle,
766
+ linkStyle: linkStyleProvider?.(reference) ?? linkStyle,
757
767
  newSourcePathOrFile,
758
768
  oldSourcePathOrFile,
759
- reference: link,
769
+ reference,
760
770
  shouldEscapeAlias,
761
771
  shouldIncludeAttachmentExtensionToEmbedAlias,
762
772
  shouldUpdateFileNameAlias,
@@ -765,11 +775,12 @@ async function updateReferencesInFile(params) {
765
775
  shouldUseLeadingSlashForAbsolutePaths
766
776
  }));
767
777
  },
778
+ shouldSkipReference,
768
779
  shouldSkipReferencesInHeadings
769
780
  }));
770
781
  }
771
- function defaultReferenceIdentityKeyProvider(link) {
772
- return JSON.stringify(link);
782
+ function defaultReferenceIdentityKeyProvider(reference) {
783
+ return JSON.stringify(reference);
773
784
  }
774
785
  function generateLinkText(params) {
775
786
  const { app, config, subpath, targetFile } = params;
@@ -877,6 +888,7 @@ async function getFileChanges(params) {
877
888
  shouldIncludeExternalLinks = false,
878
889
  shouldIncludeFrontmatterExternalLinks = false,
879
890
  shouldIncludeMultiValueFrontmatterExternalLinks = false,
891
+ shouldSkipReference,
880
892
  shouldSkipReferencesInHeadings = false
881
893
  } = params;
882
894
  let { abortSignal } = params;
@@ -891,25 +903,29 @@ async function getFileChanges(params) {
891
903
  start: section.position.start.offset
892
904
  }));
893
905
  const getFileChangesDebugger = (0, import_debug.getObsidianLibDebugger)("Link:getFileChanges");
894
- for (const link of (0, import_metadata_cache.getReferences)({ cache, shouldIncludeExternalLinks, shouldIncludeFrontmatterExternalLinks, shouldIncludeMultiValueFrontmatterExternalLinks })) {
906
+ for (const reference of (0, import_metadata_cache.getReferences)({ cache, shouldIncludeExternalLinks, shouldIncludeFrontmatterExternalLinks, shouldIncludeMultiValueFrontmatterExternalLinks })) {
895
907
  abortSignal.throwIfAborted();
896
- if (offsetRange !== void 0 && !(0, import_reference.isReferenceInOffsetRange)(link, offsetRange)) {
908
+ if (offsetRange !== void 0 && !(0, import_reference.isReferenceInOffsetRange)(reference, offsetRange)) {
897
909
  getFileChangesDebugger(
898
- (0, import_implementations.isReferenceCache)(link) ? "Skipping a link that is not fully contained in the offset range" : "Skipping a link that carries no position within the content, so it can never be in the offset range",
899
- { link: link.original, offsetRange }
910
+ (0, import_implementations.isReferenceCache)(reference) ? "Skipping a link that is not fully contained in the offset range" : "Skipping a link that carries no position within the content, so it can never be in the offset range",
911
+ { link: reference.original, offsetRange }
900
912
  );
901
913
  continue;
902
914
  }
903
- if (shouldSkipReferencesInHeadings && (0, import_reference.isReferenceInHeading)(link, cache)) {
904
- getFileChangesDebugger("Skipping a link inside a heading", { link: link.original });
915
+ if (shouldSkipReferencesInHeadings && (0, import_reference.isReferenceInHeading)(reference, cache)) {
916
+ getFileChangesDebugger("Skipping a link inside a heading", { link: reference.original });
905
917
  continue;
906
918
  }
907
- const newContent = await referenceConverter(link, abortSignal);
919
+ if (shouldSkipReference?.(reference)) {
920
+ getFileChangesDebugger("Skipping a link the caller excluded", { link: reference.original });
921
+ continue;
922
+ }
923
+ const newContent = await referenceConverter(reference, abortSignal);
908
924
  abortSignal.throwIfAborted();
909
925
  if (newContent === void 0) {
910
926
  continue;
911
927
  }
912
- const fileChange = (0, import_reference.referenceToFileChange)(link, newContent);
928
+ const fileChange = (0, import_reference.referenceToFileChange)(reference, newContent);
913
929
  if (isCanvasFileCache) {
914
930
  if ((0, import_file_change.isCanvasChange)(fileChange)) {
915
931
  changes.push(fileChange);
@@ -973,14 +989,14 @@ function getLinkDisplayName(params) {
973
989
  }
974
990
  function getUndefinedPayload() {
975
991
  }
976
- function normalizeFileUrlLink(link, shouldUseAngleBrackets) {
977
- if ((0, import_parse_link.isParseLinkFrontmatterReference)(link)) {
978
- return link.parseLinkResult.isFileUrl ? (0, import_url.normalizeFileUrl)(link.parseLinkResult.url) : void 0;
992
+ function normalizeFileUrlLink(reference, shouldUseAngleBrackets) {
993
+ if ((0, import_parse_link.isParseLinkFrontmatterReference)(reference)) {
994
+ return reference.parseLinkResult.isFileUrl ? (0, import_url.normalizeFileUrl)(reference.parseLinkResult.url) : void 0;
979
995
  }
980
- if (!(0, import_parse_link.isParseLinkReference)(link)) {
996
+ if (!(0, import_parse_link.isParseLinkReference)(reference)) {
981
997
  return;
982
998
  }
983
- const { parseLinkResult } = link;
999
+ const { parseLinkResult } = reference;
984
1000
  return parseLinkResult.isFileUrl ? generateRawMarkdownLink((0, import_object_utils.normalizeOptionalProperties)({
985
1001
  alias: parseLinkResult.alias,
986
1002
  isEmbed: parseLinkResult.isEmbed,
@@ -1093,4 +1109,4 @@ function validateOffsetRange(offsetRange) {
1093
1109
  updateReferencesInContent,
1094
1110
  updateReferencesInFile
1095
1111
  });
1096
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9saW5rLnRzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGZpbGVcbiAqXG4gKiBUaGlzIG1vZHVsZSBwcm92aWRlcyB1dGlsaXRpZXMgZm9yIGhhbmRsaW5nIGFuZCB1cGRhdGluZyBsaW5rcyB3aXRoaW4gT2JzaWRpYW4gdmF1bHRzLiBJdCBpbmNsdWRlc1xuICogZnVuY3Rpb25zIHRvIHNwbGl0IHBhdGhzLCB1cGRhdGUgbGlua3MgaW4gZmlsZXMsIGFuZCBnZW5lcmF0ZSBtYXJrZG93biBsaW5rcyB3aXRoIHZhcmlvdXMgb3B0aW9ucy5cbiAqL1xuXG5pbXBvcnQgdHlwZSB7IE1heWJlUmV0dXJuIH0gZnJvbSAnQG1uYW91bW92L3R5cGVzY3JpcHQtbGliL3R5cGUnO1xuaW1wb3J0IHR5cGUge1xuICBBcHAsXG4gIENhY2hlZE1ldGFkYXRhLFxuICBSZWZlcmVuY2UsXG4gIFRGaWxlXG59IGZyb20gJ29ic2lkaWFuJztcbmltcG9ydCB0eXBlIHsgUHJvbWlzYWJsZSB9IGZyb20gJ3R5cGUtZmVzdCc7XG5cbmltcG9ydCB7IGFib3J0U2lnbmFsTmV2ZXIgfSBmcm9tICdAbW5hb3Vtb3YvdHlwZXNjcmlwdC1saWIvYWJvcnQtY29udHJvbGxlcic7XG5pbXBvcnQge1xuICBub3JtYWxpemVPcHRpb25hbFByb3BlcnRpZXMsXG4gIHJlbW92ZVVuZGVmaW5lZFByb3BlcnRpZXNcbn0gZnJvbSAnQG1uYW91bW92L3R5cGVzY3JpcHQtbGliL29iamVjdC11dGlscyc7XG5pbXBvcnQge1xuICBiYXNlbmFtZSxcbiAgZGlybmFtZSxcbiAgZXh0bmFtZSxcbiAgam9pbixcbiAgcmVsYXRpdmVcbn0gZnJvbSAnQG1uYW91bW92L3R5cGVzY3JpcHQtbGliL3BhdGgnO1xuaW1wb3J0IHtcbiAgbm9ybWFsaXplU3RyaW5nLFxuICByZXBsYWNlQWxsLFxuICB0cmltRW5kXG59IGZyb20gJ0BtbmFvdW1vdi90eXBlc2NyaXB0LWxpYi9zdHJpbmcnO1xuaW1wb3J0IHtcbiAgYXNzZXJ0TmV2ZXIsXG4gIGFzc2VydE5vbk51bGxhYmxlLFxuICBlbnN1cmVOb25OdWxsYWJsZVxufSBmcm9tICdAbW5hb3Vtb3YvdHlwZXNjcmlwdC1saWIvdHlwZS1ndWFyZHMnO1xuaW1wb3J0IHtcbiAgZW5jb2RlVXJsLFxuICBub3JtYWxpemVGaWxlVXJsXG59IGZyb20gJ0BtbmFvdW1vdi90eXBlc2NyaXB0LWxpYi91cmwnO1xuaW1wb3J0IHtcbiAgSW50ZXJuYWxQbHVnaW5OYW1lLFxuICBpc1JlZmVyZW5jZUNhY2hlXG59IGZyb20gJ0BvYnNpZGlhbi10eXBpbmdzL29ic2lkaWFuLXB1YmxpYy1sYXRlc3QvaW1wbGVtZW50YXRpb25zJztcbmltcG9ydCB7XG4gIG5vcm1hbGl6ZVBhdGgsXG4gIHBhcnNlTGlua3RleHRcbn0gZnJvbSAnb2JzaWRpYW4nO1xuXG5pbXBvcnQgdHlwZSB7IEZpbGVDaGFuZ2UgfSBmcm9tICcuL2ZpbGUtY2hhbmdlLnRzJztcbmltcG9ydCB0eXBlIHtcbiAgR2V0RmlsZVBhcmFtcyxcbiAgUGF0aE9yRmlsZVxufSBmcm9tICcuL2ZpbGUtc3lzdGVtLnRzJztcbmltcG9ydCB0eXBlIHsgR2V0Rm9sZGVyTm90ZUZvbGRlclBhcmFtcyB9IGZyb20gJy4vZm9sZGVyLW5vdGUudHMnO1xuaW1wb3J0IHR5cGUgeyBMaW5rVXBkYXRlUHJvZ3Jlc3NSZXBvcnRlciB9IGZyb20gJy4vbGluay11cGRhdGUtcHJvZ3Jlc3MudHMnO1xuaW1wb3J0IHR5cGUgeyBPZmZzZXRSYW5nZSB9IGZyb20gJy4vcmVmZXJlbmNlLnRzJztcbmltcG9ydCB0eXBlIHsgUHJvY2Vzc09wdGlvbnMgfSBmcm9tICcuL3ZhdWx0LnRzJztcblxuaW1wb3J0IHsgZ2V0T2JzaWRpYW5MaWJEZWJ1Z2dlciB9IGZyb20gJy4vZGVidWcudHMnO1xuaW1wb3J0IHtcbiAgYXBwbHlDb250ZW50Q2hhbmdlcyxcbiAgYXBwbHlGaWxlQ2hhbmdlcyxcbiAgaXNDYW52YXNDaGFuZ2UsXG4gIGlzQ29udGVudENoYW5nZVxufSBmcm9tICcuL2ZpbGUtY2hhbmdlLnRzJztcbmltcG9ydCB7XG4gIGdldEZpbGUsXG4gIGdldFBhdGgsXG4gIGlzQ2FudmFzRmlsZSxcbiAgaXNNYXJrZG93bkZpbGUsXG4gIE1BUktET1dOX0ZJTEVfRVhURU5TSU9OXG59IGZyb20gJy4vZmlsZS1zeXN0ZW0udHMnO1xuaW1wb3J0IHtcbiAgRm9sZGVyTm90ZUxvY2F0aW9uLFxuICBnZXRGb2xkZXJOb3RlRm9sZGVyLFxuICByZXNvbHZlRm9sZGVyTm90ZUNvbmZpZ1xufSBmcm9tICcuL2ZvbGRlci1ub3RlLnRzJztcbmltcG9ydCB7XG4gIGdldEJhY2tsaW5rc0ZvckZpbGVTYWZlLFxuICBnZXRDYWNoZVNhZmUsXG4gIGdldFJlZmVyZW5jZXMsXG4gIHBhcnNlTWV0YWRhdGEsXG4gIHJlZ2lzdGVyRmlsZXNcbn0gZnJvbSAnLi9tZXRhZGF0YS1jYWNoZS50cyc7XG5pbXBvcnQgeyBnZXRPYnNpZGlhbkxpYlN0YXRlIH0gZnJvbSAnLi9vYnNpZGlhbi1saWItc3RhdGUudHMnO1xuaW1wb3J0IHtcbiAgZ2V0TmV3TGlua0Zvcm1hdCxcbiAgc2hvdWxkVXNlV2lraWxpbmtzXG59IGZyb20gJy4vb2JzaWRpYW4tc2V0dGluZ3MudHMnO1xuaW1wb3J0IHtcbiAgZXNjYXBlQWxpYXMsXG4gIGlzUGFyc2VMaW5rRnJvbnRtYXR0ZXJSZWZlcmVuY2UsXG4gIGlzUGFyc2VMaW5rUmVmZXJlbmNlLFxuICBwYXJzZUxpbmtcbn0gZnJvbSAnLi9wYXJzZS1saW5rLnRzJztcbmltcG9ydCB7XG4gIGdldFJlZmVyZW5jZUxpbmtUZXh0LFxuICBpc0NhbnZhc0ZpbGVOb2RlUmVmZXJlbmNlLFxuICBpc1JlZmVyZW5jZUluSGVhZGluZyxcbiAgaXNSZWZlcmVuY2VJbk9mZnNldFJhbmdlLFxuICByZWZlcmVuY2VUb0ZpbGVDaGFuZ2Vcbn0gZnJvbSAnLi9yZWZlcmVuY2UudHMnO1xuXG5jb25zdCBFU0NBUEVEX1dJS0lMSU5LX0RJVklERVIgPSBTdHJpbmcucmF3YFxcfGA7XG5cbi8qKlxuICogTWF0Y2hlcyBhIHdpa2lsaW5rIGRpdmlkZXIgdG9nZXRoZXIgd2l0aCB0aGUgYmFja3NsYXNoIGVzY2FwaW5nIGl0LCBpZiBhbnkuIEEgbG9va2JlaGluZCB3b3VsZCBzYXkgXCJ1bmVzY2FwZWRcIlxuICogZGlyZWN0bHksIGJ1dCBpdCBpcyBhIHN5bnRheCBlcnJvciBvbiBpT1MgYmVmb3JlIDE2LjQsIGJlbG93IHRoZSBpT1MgMTUgT2JzaWRpYW4gbW9iaWxlIHN0aWxsIHN1cHBvcnRzLlxuICogUmVwbGFjaW5nIGV2ZXJ5IG1hdGNoIHdpdGggYW4gZXNjYXBlZCBkaXZpZGVyIGxlYXZlcyBhbiBlc2NhcGVkIG9uZSBhcyBpdCB3YXMgYW5kIGVzY2FwZXMgYSBiYXJlIG9uZS5cbiAqL1xuY29uc3QgT1BUSU9OQUxMWV9FU0NBUEVEX1dJS0lMSU5LX0RJVklERVJfUkVHRVhQID0gL1xcXFw/XFx8L2c7XG5cbi8qKlxuICogVGVzdHMgZm9yIGEgd2lraWxpbmsgZGl2aWRlciBubyBiYWNrc2xhc2ggZXNjYXBlcy4gTm90IGdsb2JhbCwgc28gYSBgdGVzdGAga2VlcHMgbm8gYGxhc3RJbmRleGAgYmV0d2VlbiBjYWxscy5cbiAqL1xuY29uc3QgVU5FU0NBUEVEX1dJS0lMSU5LX0RJVklERVJfUkVHRVhQID0gLyg/Ol58W15cXFxcXSlcXHwvO1xuXG4vKipcbiAqIFRoZSBsaW5rIGlkZW50aXR5IGtleSBwcm92aWRlciBlYWNoIHNuYXBzaG90IHdhcyBidWlsdCB3aXRoLiBLZXB0IGJlc2lkZSB0aGUgc25hcHNob3QgcmF0aGVyIHRoYW4gaW4gaXQsIHNvIGFcbiAqIHNuYXBzaG90IHN0YXlzIGEgcGxhaW4gbWFwIGFuZCB0aGUgb25lIGZ1bmN0aW9uIHRoYXQga2V5ZWQgaXQgaXMgYWxzbyB0aGUgb25lIHRoYXQgbG9va3MgaXQgdXAg4oCUIHBhc3NpbmcgYVxuICogcHJvdmlkZXIgdG8gb25seSBvbmUgb2Yge0BsaW5rIGJ1aWxkQmFja2xpbmtzU25hcHNob3R9IGFuZCB7QGxpbmsgZWRpdEJhY2tsaW5rc1NuYXBzaG90fSB1c2VkIHRvIGxlYXZlIGV2ZXJ5XG4gKiBsaW5rIHVubWF0Y2hlZCwgYW5kIHRoZSBlZGl0IHJld3JvdGUgbm90aGluZyB3aXRob3V0IGEgd29yZC5cbiAqL1xuY29uc3Qgc25hcHNob3RSZWZlcmVuY2VJZGVudGl0eUtleVByb3ZpZGVycyA9IG5ldyBXZWFrTWFwPEJhY2tsaW5rc1NuYXBzaG90PHVua25vd24+LCAobGluazogUmVmZXJlbmNlKSA9PiBzdHJpbmc+KCk7XG5cbi8qKlxuICogQSBzdHlsZSBvZiB0aGUgbGluayBwYXRoLlxuICovXG5leHBvcnQgZW51bSBMaW5rUGF0aFN0eWxlIHtcbiAgLyoqXG4gICAqIFVzZSB0aGUgYWJzb2x1dGUgcGF0aCBpbiB0aGUgdmF1bHQuXG4gICAqXG4gICAqIEBleGFtcGxlIGBbW3BhdGgvZnJvbS90aGUvdmF1bHQvcm9vdC90YXJnZXRdXWBcbiAgICovXG4gIEFic29sdXRlUGF0aEluVmF1bHQgPSAnQWJzb2x1dGVQYXRoSW5WYXVsdCcsXG5cbiAgLyoqXG4gICAqIFVzZSB0aGUgZGVmYXVsdCBsaW5rIHBhdGggc3R5bGUgZGVmaW5lZCBpbiBPYnNpZGlhbiBzZXR0aW5ncy5cbiAgICovXG4gIE9ic2lkaWFuU2V0dGluZ3NEZWZhdWx0ID0gJ09ic2lkaWFuU2V0dGluZ3NEZWZhdWx0JyxcblxuICAvKipcbiAgICogVXNlIHRoZSByZWxhdGl2ZSBwYXRoIHRvIHRoZSBzb3VyY2UuXG4gICAqXG4gICAqIEBleGFtcGxlIGBbWy4uLy4uL3JlbGF0aXZlL3BhdGgvdG8vdGFyZ2V0XV1gXG4gICAqL1xuICBSZWxhdGl2ZVBhdGhUb1RoZVNvdXJjZSA9ICdSZWxhdGl2ZVBhdGhUb1RoZVNvdXJjZScsXG5cbiAgLyoqXG4gICAqIFVzZSB0aGUgc2hvcnRlc3QgcGF0aCB3aGVuIHBvc3NpYmxlLlxuICAgKlxuICAgKiBAZXhhbXBsZSBgW1tzaG9ydGVzdC1wYXRoLXRvLXRhcmdldF1dYFxuICAgKi9cbiAgU2hvcnRlc3RQYXRoV2hlblBvc3NpYmxlID0gJ1Nob3J0ZXN0UGF0aFdoZW5Qb3NzaWJsZSdcbn1cblxuLyoqXG4gKiBBIHN0eWxlIG9mIHRoZSBsaW5rLlxuICovXG5leHBvcnQgZW51bSBMaW5rU3R5bGUge1xuICAvKipcbiAgICogRm9yY2UgdGhlIGxpbmsgdG8gYmUgaW4gbWFya2Rvd24gZm9ybWF0LlxuICAgKlxuICAgKiBAZXhhbXBsZSBgW2FsaWFzXShwYXRoL3RvL3RhcmdldC5tZClgXG4gICAqL1xuICBNYXJrZG93biA9ICdNYXJrZG93bicsXG5cbiAgLyoqXG4gICAqIFVzZSB0aGUgZGVmYXVsdCBsaW5rIHN0eWxlIGRlZmluZWQgaW4gT2JzaWRpYW4gc2V0dGluZ3MuXG4gICAqL1xuICBPYnNpZGlhblNldHRpbmdzRGVmYXVsdCA9ICdPYnNpZGlhblNldHRpbmdzRGVmYXVsdCcsXG5cbiAgLyoqXG4gICAqIFByZXNlcnZlIHRoZSBleGlzdGluZyBsaW5rIHN0eWxlLlxuICAgKi9cbiAgUHJlc2VydmVFeGlzdGluZyA9ICdQcmVzZXJ2ZUV4aXN0aW5nJyxcblxuICAvKipcbiAgICogRm9yY2UgdGhlIGxpbmsgdG8gYmUgaW4gd2lraWxpbmsgZm9ybWF0LlxuICAgKlxuICAgKiBAZXhhbXBsZSBgW1twYXRoL3RvL3RhcmdldF1dYFxuICAgKiBAZXhhbXBsZSBgW1twYXRoL3RvL3RhcmdldHxhbGlhc11dYFxuICAgKi9cbiAgV2lraWxpbmsgPSAnV2lraWxpbmsnXG59XG5cbmVudW0gRmluYWxMaW5rUGF0aFN0eWxlIHtcbiAgQWJzb2x1dGVQYXRoSW5WYXVsdCA9ICdBYnNvbHV0ZVBhdGhJblZhdWx0JyxcbiAgUmVsYXRpdmVQYXRoVG9UaGVTb3VyY2UgPSAnUmVsYXRpdmVQYXRoVG9UaGVOb3RlJyxcbiAgU2hvcnRlc3RQYXRoV2hlblBvc3NpYmxlID0gJ1Nob3J0ZXN0UGF0aFdoZW5Qb3NzaWJsZSdcbn1cblxuLyoqXG4gKiBQYXJhbXMgcGFzc2VkIHRvIHRoZSBsaW5rIGNvbnZlcnRlciBvZiB7QGxpbmsgZWRpdEJhY2tsaW5rc1NuYXBzaG90fS5cbiAqXG4gKiBAdHlwZVBhcmFtIFRQYXlsb2FkIC0gVGhlIHBheWxvYWQgcmVjb3JkZWQgZm9yIGVhY2ggbGluayB3aGVuIHRoZSBzbmFwc2hvdCB3YXMgYnVpbHQuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQmFja2xpbmtDb252ZXJzaW9uUGFyYW1zPFRQYXlsb2FkPiB7XG4gIC8qKlxuICAgKiBUaGUgcGF5bG9hZCBjYXB0dXJlZCBmb3IgdGhlIGxpbmsgd2hlbiB0aGUgc25hcHNob3Qgd2FzIGJ1aWx0LlxuICAgKlxuICAgKiBgdW5kZWZpbmVkYCB3aGVuIHRoZSBsaW5rIGlzIG5vdCBpbiB0aGUgc25hcHNob3QsIHdoaWNoIGNhbiBvbmx5IGhhcHBlbiBpZlxuICAgKiB7QGxpbmsgRWRpdEJhY2tsaW5rc1NuYXBzaG90UGFyYW1zLnNob3VsZFZpc2l0VW5tYXRjaGVkUmVmZXJlbmNlc30gaXMgYHRydWVgLlxuICAgKi9cbiAgcmVhZG9ubHkgcGF5bG9hZDogVFBheWxvYWQgfCB1bmRlZmluZWQ7XG5cbiAgLyoqXG4gICAqIFRoZSByZWZlcmVuY2UgYmVpbmcgY29udmVydGVkLlxuICAgKi9cbiAgcmVhZG9ubHkgcmVmZXJlbmNlOiBSZWZlcmVuY2U7XG5cbiAgLyoqXG4gICAqIFRoZSBwYXRoIG9mIHRoZSBub3RlIGhvbGRpbmcgdGhlIGxpbmsuXG4gICAqL1xuICByZWFkb25seSBzb3VyY2VQYXRoOiBzdHJpbmc7XG59XG5cbi8qKlxuICogVGhlIG1pbmltYWwgc2hhcGUge0BsaW5rIGJ1aWxkQmFja2xpbmtzU25hcHNob3R9IHJlYWRzIGEgc2V0IG9mIGJhY2tsaW5rcyBmcm9tLlxuICpcbiAqIEJvdGggYSBgQ3VzdG9tQXJyYXlEaWN0PFJlZmVyZW5jZT5gIOKAlCB3aGF0XG4gKiB7QGxpbmsgLi4vb2JzaWRpYW4vbWV0YWRhdGEtY2FjaGUhZ2V0QmFja2xpbmtzRm9yRmlsZVNhZmUgfCBnZXRCYWNrbGlua3NGb3JGaWxlU2FmZX0gcmV0dXJucyDigJQgYW5kIGEgcGxhaW5cbiAqIGBNYXA8c3RyaW5nLCBSZWZlcmVuY2VbXT5gIHNhdGlzZnkgaXQsIHNvIGEgY2FsbGVyIGNhbiBwYXNzIGVpdGhlciB3aXRob3V0IGNvbnZlcnRpbmcgZmlyc3QuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQmFja2xpbmtzTGlrZSB7XG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBsaW5rcyB0aGUgbm90ZSBhdCBga2V5YCBob2xkcywgb3IgYSBudWxsaXNoIHZhbHVlIHdoZW4gaXQgaG9sZHMgbm9uZS5cbiAgICpcbiAgICogQHBhcmFtIGtleSAtIFRoZSBwYXRoIG9mIHRoZSBiYWNrbGluay1ob2xkaW5nIG5vdGUuXG4gICAqIEByZXR1cm5zIFRoZSBsaW5rcywgb3IgYSBudWxsaXNoIHZhbHVlLlxuICAgKi9cbiAgcmVhZG9ubHkgZ2V0OiAoa2V5OiBzdHJpbmcpID0+IG51bGwgfCByZWFkb25seSBSZWZlcmVuY2VbXSB8IHVuZGVmaW5lZDtcblxuICAvKipcbiAgICogUmV0dXJucyB0aGUgcGF0aHMgb2YgdGhlIGJhY2tsaW5rLWhvbGRpbmcgbm90ZXMuXG4gICAqXG4gICAqIEByZXR1cm5zIFRoZSBwYXRocy5cbiAgICovXG4gIHJlYWRvbmx5IGtleXM6ICgpID0+IEl0ZXJhYmxlPHN0cmluZz47XG59XG5cbi8qKlxuICogQSBjYXB0dXJlZCBzbmFwc2hvdCBvZiBhIHNldCBvZiBiYWNrbGlua3M6IHRoZSBwYXRoIG9mIGVhY2ggYmFja2xpbmstaG9sZGluZyBub3RlLCBtYXBwZWQgdG8gdGhlIGlkZW50aXR5XG4gKiBrZXlzIG9mIHRoYXQgbm90ZSdzIG93biBsaW5rcyB0byB0aGUgdGFyZ2V0KHMpLCBlYWNoIG1hcHBlZCB0byB0aGUgcGF5bG9hZCByZWNvcmRlZCBmb3IgaXQuXG4gKlxuICogVGhlIHNuYXBzaG90IGV4aXN0cyBzbyB0aGF0IHRoZSBmZXRjaCBhbmQgdGhlIHJld3JpdGUgY2FuIGhhcHBlbiBhdCBkaWZmZXJlbnQgbW9tZW50cy4gQSByZW5hbWUgaW52YWxpZGF0ZXNcbiAqIHRoZSBtZXRhZGF0YSBjYWNoZSBmb3IgdGhlIG9sZCBwYXRoLCBzbyBhIGNhbGxlciB0aGF0IHJld3JpdGVzIGxpbmtzICoqYWZ0ZXIqKiByZW5hbWluZyBoYXMgdG8gY2FwdHVyZSB0aGVcbiAqIGJhY2tsaW5rcyAqKmJlZm9yZSoqIOKAlCB3aGljaCBpcyB3aHkge0BsaW5rIGVkaXRCYWNrbGlua3NTbmFwc2hvdH0gdGFrZXMgYSBzbmFwc2hvdCByYXRoZXIgdGhhbiBhIHBhdGguXG4gKlxuICogVGhlIHBheWxvYWQgaXMgd2hhdGV2ZXIgdGhlIGNhbGxlciBuZWVkcyB0byByZW1lbWJlciBwZXIgbGluay4gSXQgaXMgYHVuZGVmaW5lZGAgZm9yIGEgc2luZ2xlLXRhcmdldFxuICogcmV3cml0ZSAodGhlIHRhcmdldCBpcyBpbXBsaWVkKSwgYW5kIHRoZSBvbGQgdGFyZ2V0J3MgcGF0aCBmb3IgYSBtdWx0aS10YXJnZXQgb25lLCB3aGVyZSBvbmUgbm90ZSdzIGxpbmtzXG4gKiBtYXkgcG9pbnQgYXQgc2V2ZXJhbCBmaWxlcyB0aGF0IGFsbCBtb3ZlZCBhbmQgZWFjaCBsaW5rIGhhcyB0byBiZSByZXNvbHZlZCB0byBpdHMgb3duIG5ldyBwYXRoLlxuICpcbiAqIEB0eXBlUGFyYW0gVFBheWxvYWQgLSBUaGUgcGF5bG9hZCByZWNvcmRlZCBmb3IgZWFjaCBsaW5rLlxuICovXG5leHBvcnQgdHlwZSBCYWNrbGlua3NTbmFwc2hvdDxUUGF5bG9hZD4gPSBSZWFkb25seU1hcDxzdHJpbmcsIFJlYWRvbmx5TWFwPHN0cmluZywgVFBheWxvYWQ+PjtcblxuLyoqXG4gKiBQYXJhbXMgZm9yIHtAbGluayBidWlsZEJhY2tsaW5rc1NuYXBzaG90fS5cbiAqXG4gKiBAdHlwZVBhcmFtIFRQYXlsb2FkIC0gVGhlIHBheWxvYWQgcmVjb3JkZWQgZm9yIGVhY2ggbGluay5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBCdWlsZEJhY2tsaW5rc1NuYXBzaG90UGFyYW1zPFRQYXlsb2FkPiB7XG4gIC8qKlxuICAgKiBUaGUgYmFja2xpbmtzIHRvIHJlY29yZC5cbiAgICovXG4gIHJlYWRvbmx5IGJhY2tsaW5rczogQmFja2xpbmtzTGlrZTtcblxuICAvKipcbiAgICogUmV3cml0ZXMgdGhlIHBhdGggb2YgYSBiYWNrbGluay1ob2xkaW5nIG5vdGUgYXMgaXQgd2lsbCBiZSAqKmFmdGVyKiogdGhlIG9wZXJhdGlvbi5cbiAgICpcbiAgICogQSBub3RlIHRoYXQgaG9sZHMgYSBiYWNrbGluayBjYW4gaXRzZWxmIGJlIHJlbmFtZWQgb3IgbW92ZWQgYnkgdGhlIHNhbWUgb3BlcmF0aW9uIOKAlCBpbmNsdWRpbmcgdGhlXG4gICAqIHJlbmFtZWQgbm90ZSdzIG93biBzZWxmLWxpbmtzLiBSZW1hcHBpbmcgaGVyZSBrZXlzIHRoZSBzbmFwc2hvdCBieSB0aGUgcGF0aCB0aGUgcmV3cml0ZSB3aWxsIGFjdHVhbGx5XG4gICAqIG9wZW4uXG4gICAqXG4gICAqIEBkZWZhdWx0IHRoZSBpZGVudGl0eSBmdW5jdGlvblxuICAgKi9cbiAgcmVhZG9ubHkgcGF0aFJlbWFwcGVyPzogKGJhY2tsaW5rUGF0aDogc3RyaW5nKSA9PiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFByb2R1Y2VzIHRoZSBwYXlsb2FkIHRvIHJlY29yZCBmb3IgYSBsaW5rLiBTZWUge0BsaW5rIEJhY2tsaW5rc1NuYXBzaG90fSBmb3Igd2hhdCBhIHBheWxvYWQgaXMgZm9yLlxuICAgKlxuICAgKiBAcGFyYW0gbGluayAtIFRoZSBsaW5rIGJlaW5nIHJlY29yZGVkLlxuICAgKiBAcmV0dXJucyBUaGUgcGF5bG9hZC5cbiAgICovXG4gIHJlYWRvbmx5IHBheWxvYWRQcm92aWRlcjogKGxpbms6IFJlZmVyZW5jZSkgPT4gVFBheWxvYWQ7XG5cbiAgLyoqXG4gICAqIENvbXB1dGVzIHRoZSBpZGVudGl0eSBrZXkgb2YgYSBsaW5rLlxuICAgKlxuICAgKiBUaGUgc25hcHNob3QgcmVtZW1iZXJzIGl0LCBzbyB7QGxpbmsgZWRpdEJhY2tsaW5rc1NuYXBzaG90fSBsb29rcyB0aGUgbGlua3MgdXAgd2l0aCB0aGUgc2FtZSBmdW5jdGlvblxuICAgKiB3aXRob3V0IGJlaW5nIHRvbGQuIFdoZW4ge0BsaW5rIEJ1aWxkQmFja2xpbmtzU25hcHNob3RQYXJhbXMudGFyZ2V0fSB3YXMgYnVpbHQgd2l0aCBhIHByb3ZpZGVyLCBvbWl0dGluZ1xuICAgKiB0aGlzIHJldXNlcyB0aGF0IG9uZSwgYW5kIHBhc3NpbmcgYSBkaWZmZXJlbnQgb25lIHRocm93czogYSBzbmFwc2hvdCBrZXllZCBieSB0d28gZnVuY3Rpb25zIG1hdGNoZXNcbiAgICogbm90aGluZy5cbiAgICpcbiAgICogQGRlZmF1bHQgdGhlIHByb3ZpZGVyIGB0YXJnZXRgIHdhcyBidWlsdCB3aXRoLCBlbHNlIGBKU09OLnN0cmluZ2lmeWBcbiAgICovXG4gIHJlYWRvbmx5IHJlZmVyZW5jZUlkZW50aXR5S2V5UHJvdmlkZXI/OiAobGluazogUmVmZXJlbmNlKSA9PiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEFuIGV4aXN0aW5nIHNuYXBzaG90IHRvIG1lcmdlIGludG8sIHNvIHNldmVyYWwgc2V0cyBvZiBiYWNrbGlua3MgY2FuIGJlIGFjY3VtdWxhdGVkIGludG8gb25lLlxuICAgKlxuICAgKiBNZXJnaW5nIGlzIHdoYXQgbWFrZXMgYSBzaW5nbGUgcmV3cml0ZSBwYXNzIHBlciBub3RlIHBvc3NpYmxlIHdoZW4gYSBub3RlIGxpbmtzIHRvIHNldmVyYWwgbW92ZWRcbiAgICogdGFyZ2V0czogd2l0aG91dCBpdCwgY2FsbGluZyB0aGUgcmV3cml0ZSBvbmNlIHBlciB0YXJnZXQgd291bGQgb3BlbiDigJQgYW5kIHdyaXRlIOKAlCB0aGUgc2FtZSBub3RlXG4gICAqIHJlcGVhdGVkbHkuXG4gICAqXG4gICAqIFdoZW4gb21pdHRlZCwgYSBuZXcgc25hcHNob3QgaXMgY3JlYXRlZC5cbiAgICovXG4gIHJlYWRvbmx5IHRhcmdldD86IE11dGFibGVCYWNrbGlua3NTbmFwc2hvdDxUUGF5bG9hZD47XG59XG5cbi8qKlxuICogUGFyYW1zIGZvciB7QGxpbmsgY29udmVydExpbmt9LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIENvbnZlcnRMaW5rUGFyYW1zIHtcbiAgLyoqXG4gICAqIEFuIE9ic2lkaWFuIGFwcCBpbnN0YW5jZS5cbiAgICovXG4gIHJlYWRvbmx5IGFwcDogQXBwO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRvIGFsbG93IGFuIGVtcHR5IGFsaWFzIGZvciBlbWJlZHMuXG4gICAqXG4gICAqIEFwcGxpY2FibGUgb25seSBpZiB0aGUgcmVzdWx0IGxpbmsgc3R5bGUgaXMge0BsaW5rIExpbmtTdHlsZS5NYXJrZG93bn0uXG4gICAqXG4gICAqIElmIGB0cnVlYDogYCFbXShmb28ucG5nKWAuXG4gICAqXG4gICAqIElmIGBmYWxzZWA6IGAhW2Zvb10oZm9vLnBuZylgLlxuICAgKlxuICAgKiBAZGVmYXVsdCBgdHJ1ZWBcbiAgICovXG4gIHJlYWRvbmx5IGlzRW1wdHlFbWJlZEFsaWFzQWxsb3dlZD86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIEEgc3R5bGUgb2YgdGhlIGxpbmsgcGF0aC5cbiAgICovXG4gIHJlYWRvbmx5IGxpbmtQYXRoU3R5bGU/OiBMaW5rUGF0aFN0eWxlO1xuXG4gIC8qKlxuICAgKiBBIHN0eWxlIG9mIHRoZSBsaW5rLlxuICAgKi9cbiAgcmVhZG9ubHkgbGlua1N0eWxlPzogTGlua1N0eWxlO1xuXG4gIC8qKlxuICAgKiBBIHNvdXJjZSBmaWxlIGNvbnRhaW5pbmcgdGhlIGxpbmsuXG4gICAqL1xuICByZWFkb25seSBuZXdTb3VyY2VQYXRoT3JGaWxlOiBQYXRoT3JGaWxlO1xuXG4gIC8qKlxuICAgKiBBbiBvbGQgcGF0aCBvZiB0aGUgbGluay5cbiAgICovXG4gIHJlYWRvbmx5IG9sZFNvdXJjZVBhdGhPckZpbGU/OiBQYXRoT3JGaWxlO1xuXG4gIC8qKlxuICAgKiBUaGUgcmVmZXJlbmNlIHdob3NlIGxpbmsgaXMgY29udmVydGVkLlxuICAgKi9cbiAgcmVhZG9ubHkgcmVmZXJlbmNlOiBSZWZlcmVuY2U7XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdG8gZXNjYXBlIHRoZSBhbGlhcy5cbiAgICpcbiAgICogQXBwbGljYWJsZSBvbmx5IGlmIHRoZSByZXN1bHQgbGluayBzdHlsZSBpcyB7QGxpbmsgTGlua1N0eWxlLk1hcmtkb3dufS5cbiAgICpcbiAgICogSWYgYHRydWVgOiBgW1xcKlxcKmFsaWFzXFwqXFwqXShsaW5rLm1kKWAuXG4gICAqXG4gICAqIElmIGBmYWxzZWA6IGBbKiphbGlhcyoqXShsaW5rLm1kKWAuXG4gICAqXG4gICAqIEBkZWZhdWx0IGBmYWxzZWBcbiAgICovXG4gIHJlYWRvbmx5IHNob3VsZEVzY2FwZUFsaWFzPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogV2hldGhlciB0byBpbmNsdWRlIHRoZSBhdHRhY2htZW50IGV4dGVuc2lvbiBpbiB0aGUgZW1iZWQgYWxpYXMuXG4gICAqXG4gICAqIEFwcGxpY2FibGUgb25seSBpZiB7QGxpbmsgaXNFbXB0eUVtYmVkQWxpYXNBbGxvd2VkfSBpcyBgZmFsc2VgLlxuICAgKlxuICAgKiBJZiBgdHJ1ZWA6IGBbZm9vLnBuZ10oZm9vLnBuZylgLlxuICAgKlxuICAgKiBJZiBgZmFsc2VgOiBgW2Zvb10oZm9vLnBuZylgLlxuICAgKlxuICAgKiBAZGVmYXVsdCBgZmFsc2VgXG4gICAqL1xuICByZWFkb25seSBzaG91bGRJbmNsdWRlQXR0YWNobWVudEV4dGVuc2lvblRvRW1iZWRBbGlhcz86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdG8gdXBkYXRlIGZpbGUgbmFtZSBhbGlhcy5cbiAgICpcbiAgICogQGRlZmF1bHQgYHRydWVgXG4gICAqL1xuICByZWFkb25seSBzaG91bGRVcGRhdGVGaWxlTmFtZUFsaWFzPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogSW5kaWNhdGVzIGlmIHRoZSBsaW5rIHNob3VsZCB1c2UgYW5nbGUgYnJhY2tldHMuXG4gICAqXG4gICAqIEFwcGxpY2FibGUgb25seSBpZiB7QGxpbmsgbGlua1N0eWxlfSBpcyB7QGxpbmsgTGlua1N0eWxlLk1hcmtkb3dufS5cbiAgICpcbiAgICogSWYgYHRydWVgOiBgW2FsaWFzXSg8cGF0aCB3aXRoIHNwYWNlcy5tZD4pYC5cbiAgICpcbiAgICogSWYgYGZhbHNlYDogYFthbGlhc10ocGF0aCUyMHdpdGglMjBzcGFjZXMubWQpYC5cbiAgICpcbiAgICogQGRlZmF1bHQgYGZhbHNlYFxuICAgKi9cbiAgcmVhZG9ubHkgc2hvdWxkVXNlQW5nbGVCcmFja2V0cz86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIEluZGljYXRlcyBpZiB0aGUgbGluayBzaG91bGQgdXNlIGEgbGVhZGluZyBkb3QuXG4gICAqXG4gICAqIEFwcGxpY2FibGUgb25seSBpZiB7QGxpbmsgbGlua1BhdGhTdHlsZX0gaXMge0BsaW5rIExpbmtQYXRoU3R5bGUuUmVsYXRpdmVQYXRoVG9UaGVTb3VyY2V9LlxuICAgKlxuICAgKiBJZiBgdHJ1ZWA6IGBbWy4vcmVsYXRpdmUvcGF0aC90by90YXJnZXRdXWBcbiAgICpcbiAgICogSWYgYGZhbHNlYDogYFtbcmVsYXRpdmUvcGF0aC90by90YXJnZXRdXWBcbiAgICpcbiAgICogQGRlZmF1bHQgYGZhbHNlYFxuICAgKi9cbiAgcmVhZG9ubHkgc2hvdWxkVXNlTGVhZGluZ0RvdEZvclJlbGF0aXZlUGF0aHM/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBJbmRpY2F0ZXMgaWYgdGhlIGxpbmsgc2hvdWxkIHVzZSBhIGxlYWRpbmcgc2xhc2guXG4gICAqXG4gICAqIEFwcGxpY2FibGUgb25seSBpZiB7QGxpbmsgbGlua1BhdGhTdHlsZX0gaXMge0BsaW5rIExpbmtQYXRoU3R5bGUuQWJzb2x1dGVQYXRoSW5WYXVsdH0uXG4gICAqXG4gICAqIElmIGB0cnVlYDogYFtbL2Fic29sdXRlL3BhdGgvdG8vdGFyZ2V0XV1gXG4gICAqXG4gICAqIElmIGBmYWxzZWA6IGBbW2Fic29sdXRlL3BhdGgvdG8vdGFyZ2V0XV1gXG4gICAqXG4gICAqIEBkZWZhdWx0IGBmYWxzZWBcbiAgICovXG4gIHJlYWRvbmx5IHNob3VsZFVzZUxlYWRpbmdTbGFzaEZvckFic29sdXRlUGF0aHM/OiBib29sZWFuO1xufVxuXG4vKipcbiAqIE9wdGlvbnMgZm9yIHtAbGluayBlZGl0QmFja2xpbmtzfS5cbiAqL1xuZXhwb3J0IHR5cGUgRWRpdEJhY2tsaW5rc09wdGlvbnMgPSBQcm9jZXNzT3B0aW9ucztcblxuLyoqXG4gKiBQYXJhbWV0ZXJzIGZvciB7QGxpbmsgZWRpdEJhY2tsaW5rc30uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRWRpdEJhY2tsaW5rc1BhcmFtcyBleHRlbmRzIEVkaXRCYWNrbGlua3NPcHRpb25zIHtcbiAgLyoqXG4gICAqIFRoZSBPYnNpZGlhbiBhcHBsaWNhdGlvbiBpbnN0YW5jZS5cbiAgICovXG4gIHJlYWRvbmx5IGFwcDogQXBwO1xuXG4gIC8qKlxuICAgKiBBbiBvcHRpb25hbCByZXBvcnRlciBpbnZva2VkIG9uY2UgcGVyIGJhY2tsaW5rIGZpbGUgYWZ0ZXIgaXRzIGxpbmtzIGFyZSB1cGRhdGVkLCB3aXRoIHRoZSBydW5uaW5nXG4gICAqIGNvdW50IG9mIHByb2Nlc3NlZCBmaWxlcyBhbmQgdGhlIHRvdGFsLiBXaGVuIG9taXR0ZWQsIG5vIHByb2dyZXNzIGlzIHJlcG9ydGVkLlxuICAgKi9cbiAgcmVhZG9ubHkgbGlua1VwZGF0ZVByb2dyZXNzUmVwb3J0ZXI/OiBMaW5rVXBkYXRlUHJvZ3Jlc3NSZXBvcnRlcjtcblxuICAvKipcbiAgICogVGhlIHBhdGggb3IgZmlsZSB0byBlZGl0IHRoZSBiYWNrbGlua3MgZm9yLlxuICAgKi9cbiAgcmVhZG9ubHkgcGF0aE9yRmlsZTogUGF0aE9yRmlsZTtcblxuICAvKipcbiAgICogVGhlIGZ1bmN0aW9uIHRoYXQgY29udmVydHMgZWFjaCBsaW5rLlxuICAgKi9cbiAgcmVhZG9ubHkgcmVmZXJlbmNlQ29udmVydGVyOiAobGluazogUmVmZXJlbmNlKSA9PiBQcm9taXNhYmxlPE1heWJlUmV0dXJuPHN0cmluZz4+O1xufVxuXG4vKipcbiAqIE9wdGlvbnMgZm9yIHtAbGluayBlZGl0QmFja2xpbmtzU25hcHNob3R9LlxuICovXG5leHBvcnQgdHlwZSBFZGl0QmFja2xpbmtzU25hcHNob3RPcHRpb25zID0gUHJvY2Vzc09wdGlvbnM7XG5cbi8qKlxuICogUGFyYW1ldGVycyBmb3Ige0BsaW5rIGVkaXRCYWNrbGlua3NTbmFwc2hvdH0uXG4gKlxuICogQHR5cGVQYXJhbSBUUGF5bG9hZCAtIFRoZSBwYXlsb2FkIHJlY29yZGVkIGZvciBlYWNoIGxpbmsgd2hlbiB0aGUgc25hcHNob3Qgd2FzIGJ1aWx0LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEVkaXRCYWNrbGlua3NTbmFwc2hvdFBhcmFtczxUUGF5bG9hZD4gZXh0ZW5kcyBFZGl0QmFja2xpbmtzU25hcHNob3RPcHRpb25zIHtcbiAgLyoqXG4gICAqIFRoZSBPYnNpZGlhbiBhcHBsaWNhdGlvbiBpbnN0YW5jZS5cbiAgICovXG4gIHJlYWRvbmx5IGFwcDogQXBwO1xuXG4gIC8qKlxuICAgKiBBbiBvcHRpb25hbCByZXBvcnRlciBpbnZva2VkIG9uY2UgcGVyIGJhY2tsaW5rIGZpbGUgYWZ0ZXIgaXRzIGxpbmtzIGFyZSB1cGRhdGVkLCB3aXRoIHRoZSBydW5uaW5nXG4gICAqIGNvdW50IG9mIHByb2Nlc3NlZCBmaWxlcyBhbmQgdGhlIHRvdGFsLiBXaGVuIG9taXR0ZWQsIG5vIHByb2dyZXNzIGlzIHJlcG9ydGVkLlxuICAgKi9cbiAgcmVhZG9ubHkgbGlua1VwZGF0ZVByb2dyZXNzUmVwb3J0ZXI/OiBMaW5rVXBkYXRlUHJvZ3Jlc3NSZXBvcnRlcjtcblxuICAvKipcbiAgICogVGhlIGZ1bmN0aW9uIHRoYXQgY29udmVydHMgZWFjaCBsaW5rLlxuICAgKi9cbiAgcmVhZG9ubHkgcmVmZXJlbmNlQ29udmVydGVyOiAocGFyYW1zOiBCYWNrbGlua0NvbnZlcnNpb25QYXJhbXM8VFBheWxvYWQ+KSA9PiBQcm9taXNhYmxlPE1heWJlUmV0dXJuPHN0cmluZz4+O1xuXG4gIC8qKlxuICAgKiBDb21wdXRlcyB0aGUgaWRlbnRpdHkga2V5IG9mIGEgbGluay5cbiAgICpcbiAgICogTGVhdmUgaXQgb3V0IGZvciBhIHNuYXBzaG90IG1hZGUgYnkge0BsaW5rIGJ1aWxkQmFja2xpbmtzU25hcHNob3R9OiB0aGUgc25hcHNob3QgY2FycmllcyB0aGUgcHJvdmlkZXIgaXQgd2FzXG4gICAqIGJ1aWx0IHdpdGgsIGFuZCB0aGF0IG9uZSBpcyB1c2VkLiBQYXNzaW5nIGEgZGlmZmVyZW50IG9uZSB0aHJvd3MsIGJlY2F1c2UgdGhlIHNuYXBzaG90IGlzIGtleWVkIGJ5IHRoZVxuICAgKiBvdGhlciBhbmQgbm90IGEgc2luZ2xlIGxpbmsgd291bGQgbWF0Y2gg4oCUIHRoZSBlZGl0IHdvdWxkIGNvbXBsZXRlIGFuZCByZXdyaXRlIG5vdGhpbmcuIEl0IGlzIG5lZWRlZCBvbmx5XG4gICAqIGZvciBhIHNuYXBzaG90IGFzc2VtYmxlZCBieSBoYW5kLlxuICAgKlxuICAgKiBAZGVmYXVsdCB0aGUgcHJvdmlkZXIgdGhlIHNuYXBzaG90IHdhcyBidWlsdCB3aXRoLCBlbHNlIGBKU09OLnN0cmluZ2lmeWBcbiAgICovXG4gIHJlYWRvbmx5IHJlZmVyZW5jZUlkZW50aXR5S2V5UHJvdmlkZXI/OiAobGluazogUmVmZXJlbmNlKSA9PiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdGhlIGNvbnZlcnRlciBpcyBhbHNvIHNob3duIGxpbmtzIHRoYXQgYXJlICoqbm90KiogaW4gdGhlIHNuYXBzaG90LCB3aXRoIGFuIGB1bmRlZmluZWRgXG4gICAqIHtAbGluayBCYWNrbGlua0NvbnZlcnNpb25QYXJhbXMucGF5bG9hZH0uXG4gICAqXG4gICAqIFRoZSBkZWZhdWx0IGZpbHRlcnMgdGhlbSBvdXQsIHdoaWNoIGlzIHdoYXQgYSBwbGFpbiByZW5hbWUgd2FudHM6IGEgbGluayBhYnNlbnQgZnJvbSB0aGUgc25hcHNob3Qgd2FzXG4gICAqIGVpdGhlciBuZXZlciB0aGUgY2FsbGVyJ3MgdG8gcmV3cml0ZSwgb3IgaGFzIGFscmVhZHkgYmVlbiByZXdyaXR0ZW4gYnkgc29tZW9uZSBlbHNlLiBTZXQgdGhpcyB0byBgdHJ1ZWBcbiAgICogb25seSB3aGVuIHRoZSBjYWxsZXIgaGFzIGl0cyBvd24gcmVhc29uIHRvIGxvb2sgYXQgdGhlbSDigJQgYSB3aWRlbmVkIG1hdGNoIG9mIGl0cyBvd24sIG9yIGxvZ2dpbmcgYSBza2lwXG4gICAqIHRoYXQgd291bGQgb3RoZXJ3aXNlIGJlIHNpbGVudC5cbiAgICpcbiAgICogQGRlZmF1bHQgYGZhbHNlYFxuICAgKi9cbiAgcmVhZG9ubHkgc2hvdWxkVmlzaXRVbm1hdGNoZWRSZWZlcmVuY2VzPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogVGhlIGNhcHR1cmVkIGJhY2tsaW5rcyB0byBlZGl0LlxuICAgKi9cbiAgcmVhZG9ubHkgc25hcHNob3Q6IEJhY2tsaW5rc1NuYXBzaG90PFRQYXlsb2FkPjtcbn1cblxuLyoqXG4gKiBQYXJhbWV0ZXJzIGZvciB7QGxpbmsgZWRpdFJlZmVyZW5jZXNJbkNvbnRlbnR9LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEVkaXRSZWZlcmVuY2VzSW5Db250ZW50UGFyYW1zIHtcbiAgLyoqXG4gICAqIFRoZSBhYm9ydCBzaWduYWwgdG8gY29udHJvbCB0aGUgZXhlY3V0aW9uIG9mIHRoZSBmdW5jdGlvbi5cbiAgICovXG4gIHJlYWRvbmx5IGFib3J0U2lnbmFsPzogQWJvcnRTaWduYWw7XG5cbiAgLyoqXG4gICAqIFRoZSBPYnNpZGlhbiBhcHBsaWNhdGlvbiBpbnN0YW5jZS5cbiAgICovXG4gIHJlYWRvbmx5IGFwcDogQXBwO1xuXG4gIC8qKlxuICAgKiBUaGUgY29udGVudCB0byBlZGl0IHRoZSBsaW5rcyBpbi5cbiAgICovXG4gIHJlYWRvbmx5IGNvbnRlbnQ6IHN0cmluZztcblxuICAvKipcbiAgICogQSByYW5nZSB3aXRoaW4ge0BsaW5rIEVkaXRSZWZlcmVuY2VzSW5Db250ZW50UGFyYW1zLmNvbnRlbnR9LCBpbiBjaGFyYWN0ZXIgb2Zmc2V0cywgcmVzdHJpY3RpbmcgdGhlIHBhc3MgdG9cbiAgICogdGhlIGxpbmtzIGluc2lkZSBpdC4gV2hlbiBvbWl0dGVkLCBldmVyeSBsaW5rIGlzIHZpc2l0ZWQuXG4gICAqXG4gICAqIEEgbGluayBpcyBlZGl0ZWQgb25seSB3aGVuIGl0IGlzICoqZnVsbHkgY29udGFpbmVkKiogaW4gdGhlIHJhbmdlOyBvbmUgdGhhdCBtZXJlbHkgb3ZlcmxhcHMgaXQgaXMgbGVmdFxuICAgKiBhbG9uZSwgYmVjYXVzZSByZXdyaXRpbmcgcGFydCBvZiBhIGxpbmsgY29ycnVwdHMgaXQuIEJvdGggYm91bmRzIGFyZSBpbmNsdXNpdmUsIHNvIGEgcmFuZ2Ugd2hvc2VcbiAgICogb2Zmc2V0cyBjb2luY2lkZSBleGFjdGx5IHdpdGggYSBsaW5rJ3MgZG9lcyBpbmNsdWRlIHRoYXQgbGluay5cbiAgICpcbiAgICogQSByZWZlcmVuY2UgdGhhdCBjYXJyaWVzIG5vIHBvc2l0aW9uIHdpdGhpbiB0aGUgY29udGVudCDigJQgYSBmcm9udG1hdHRlciBsaW5rLCBhIG11bHRpLWxpbmsgZnJvbnRtYXR0ZXJcbiAgICogdmFsdWUgZW50cnksIG9yIGFueSBjYW52YXMgcmVmZXJlbmNlIOKAlCBpcyBuZXZlciBpbiByYW5nZSBhbmQgaXMgc2tpcHBlZCB3aGVuZXZlciBhIHJhbmdlIGlzIHN1cHBsaWVkLlxuICAgKlxuICAgKiBAZGVmYXVsdCBgdW5kZWZpbmVkYFxuICAgKi9cbiAgcmVhZG9ubHkgb2Zmc2V0UmFuZ2U/OiBPZmZzZXRSYW5nZTtcblxuICAvKipcbiAgICogVGhlIGZ1bmN0aW9uIHRoYXQgY29udmVydHMgZWFjaCBsaW5rLlxuICAgKi9cbiAgcmVhZG9ubHkgcmVmZXJlbmNlQ29udmVydGVyOiAobGluazogUmVmZXJlbmNlKSA9PiBQcm9taXNhYmxlPE1heWJlUmV0dXJuPHN0cmluZz4+O1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRvIGFsc28gZWRpdCBleHRlcm5hbCBsaW5rcyBwYXJzZWQgZnJvbSB0aGUgbm90ZSBib2R5LiBXaGVuIGB0cnVlYCwgdGhlIGNvbnZlcnRlciBhbHNvXG4gICAqIHJlY2VpdmVzIHJlZmVyZW5jZXMgZm9yIGV4dGVybmFsIGxpbmtzLlxuICAgKlxuICAgKiBAZGVmYXVsdCBgZmFsc2VgXG4gICAqL1xuICByZWFkb25seSBzaG91bGRFZGl0RXh0ZXJuYWxMaW5rcz86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdG8gYWxzbyBlZGl0IGV4dGVybmFsIGxpbmtzIHBhcnNlZCBmcm9tIGZyb250bWF0dGVyIHZhbHVlcy4gV2hlbiBgdHJ1ZWAsIHRoZSBjb252ZXJ0ZXIgYWxzb1xuICAgKiByZWNlaXZlcyByZWZlcmVuY2VzIGZvciBmcm9udG1hdHRlciBleHRlcm5hbCBsaW5rcy5cbiAgICpcbiAgICogQGRlZmF1bHQgYGZhbHNlYFxuICAgKi9cbiAgcmVhZG9ubHkgc2hvdWxkRWRpdEZyb250bWF0dGVyRXh0ZXJuYWxMaW5rcz86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdG8gYWxzbyBlZGl0IGV4dGVybmFsIGxpbmtzIHBhcnNlZCBmcm9tIG11bHRpLWxpbmsgKG11bHRpLXZhbHVlKSBmcm9udG1hdHRlciB2YWx1ZXMuIFdoZW5cbiAgICogYHRydWVgLCB0aGUgY29udmVydGVyIGFsc28gcmVjZWl2ZXMgcmVmZXJlbmNlcyBmb3IgZWFjaCBleHRlcm5hbCBsaW5rIHdpdGhpbiBhIG11bHRpLWxpbmsgZnJvbnRtYXR0ZXJcbiAgICogdmFsdWUgKGVhY2ggbG9jYXRlZCBieSBpdHMgb2Zmc2V0cywgc28gb25seSB0aGF0IGxpbmsgaXMgc3BsaWNlZCBiYWNrIGluIHBsYWNlKS5cbiAgICpcbiAgICogQGRlZmF1bHQgYGZhbHNlYFxuICAgKi9cbiAgcmVhZG9ubHkgc2hvdWxkRWRpdE11bHRpVmFsdWVGcm9udG1hdHRlckV4dGVybmFsTGlua3M/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRvIGxlYXZlIGV2ZXJ5IGxpbmsgaW5zaWRlIGEgaGVhZGluZyB1bmNoYW5nZWQ6IHRoZSBjb252ZXJ0ZXIgaXMgbm90IGNhbGxlZCBmb3IgaXQsIHNvIGl0IHN0YXlzXG4gICAqIGJ5dGUtZm9yLWJ5dGUgYXMgd3JpdHRlbi4gQSBsaW5rIGluIGEgaGVhZGluZyBpcyBwYXJ0IG9mIHRoZSBoZWFkaW5nJ3MgdGV4dCwgc28gcmV3cml0aW5nIGl0IGNoYW5nZXNcbiAgICogdGhhdCB0ZXh0IGFuZCBicmVha3MgZXZlcnkgYCNoZWFkaW5nYCBzdWJwYXRoIHBvaW50aW5nIGF0IHRoZSBoZWFkaW5nLiBTZWUge0BsaW5rIGlzUmVmZXJlbmNlSW5IZWFkaW5nfS5cbiAgICpcbiAgICogQGRlZmF1bHQgYGZhbHNlYFxuICAgKi9cbiAgcmVhZG9ubHkgc2hvdWxkU2tpcFJlZmVyZW5jZXNJbkhlYWRpbmdzPzogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBPcHRpb25zIGZvciB7QGxpbmsgZWRpdFJlZmVyZW5jZXN9LlxuICovXG5leHBvcnQgdHlwZSBFZGl0UmVmZXJlbmNlc09wdGlvbnMgPSBQcm9jZXNzT3B0aW9ucztcblxuLyoqXG4gKiBQYXJhbWV0ZXJzIGZvciB7QGxpbmsgZWRpdFJlZmVyZW5jZXN9LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEVkaXRSZWZlcmVuY2VzUGFyYW1zIGV4dGVuZHMgRWRpdFJlZmVyZW5jZXNPcHRpb25zIHtcbiAgLyoqXG4gICAqIFRoZSBPYnNpZGlhbiBhcHBsaWNhdGlvbiBpbnN0YW5jZS5cbiAgICovXG4gIHJlYWRvbmx5IGFwcDogQXBwO1xuXG4gIC8qKlxuICAgKiBBIHJhbmdlIHdpdGhpbiB0aGUgZmlsZSdzIGNvbnRlbnQsIGluIGNoYXJhY3RlciBvZmZzZXRzLCByZXN0cmljdGluZyB0aGUgcGFzcyB0byB0aGUgbGlua3MgaW5zaWRlIGl0LlxuICAgKiBXaGVuIG9taXR0ZWQsIGV2ZXJ5IGxpbmsgaXMgdmlzaXRlZC5cbiAgICpcbiAgICogQSBsaW5rIGlzIGVkaXRlZCBvbmx5IHdoZW4gaXQgaXMgKipmdWxseSBjb250YWluZWQqKiBpbiB0aGUgcmFuZ2U7IG9uZSB0aGF0IG1lcmVseSBvdmVybGFwcyBpdCBpcyBsZWZ0XG4gICAqIGFsb25lLCBiZWNhdXNlIHJld3JpdGluZyBwYXJ0IG9mIGEgbGluayBjb3JydXB0cyBpdC4gQm90aCBib3VuZHMgYXJlIGluY2x1c2l2ZSwgc28gYSByYW5nZSB3aG9zZVxuICAgKiBvZmZzZXRzIGNvaW5jaWRlIGV4YWN0bHkgd2l0aCBhIGxpbmsncyBkb2VzIGluY2x1ZGUgdGhhdCBsaW5rLlxuICAgKlxuICAgKiBBIHJlZmVyZW5jZSB0aGF0IGNhcnJpZXMgbm8gcG9zaXRpb24gd2l0aGluIHRoZSBmaWxlJ3MgY29udGVudCDigJQgYSBmcm9udG1hdHRlciBsaW5rLCBhIG11bHRpLWxpbmtcbiAgICogZnJvbnRtYXR0ZXIgdmFsdWUgZW50cnksIG9yIGFueSBjYW52YXMgcmVmZXJlbmNlIOKAlCBpcyBuZXZlciBpbiByYW5nZSBhbmQgaXMgc2tpcHBlZCB3aGVuZXZlciBhIHJhbmdlIGlzXG4gICAqIHN1cHBsaWVkLlxuICAgKlxuICAgKiBUaGUgb2Zmc2V0cyBhcmUgaW50byB0aGUgY29udGVudCB0aGlzIGZ1bmN0aW9uIHJlYWRzIGZyb20gdGhlIHZhdWx0LiBCZWZvcmUgcmVhZGluZywgaXQgc2F2ZXMgYW55XG4gICAqIHVuc2F2ZWQgZWRpdG9yIGJ1ZmZlciBmb3IgdGhlIGZpbGUsIHNvIGEgcmFuZ2UgdGFrZW4gZnJvbSBhbiBvcGVuIGVkaXRvciB2aWEgYEVkaXRvci5wb3NUb09mZnNldGAgaXNcbiAgICogdmFsaWQuIFRoZSBjYWxsZXIgb3ducyBvbmx5IHRoZSBjYXNlIHdoZXJlIHRoZSBidWZmZXIgY2hhbmdlcyBiZXR3ZWVuIGNvbXB1dGluZyB0aGUgcmFuZ2UgYW5kIHRoaXNcbiAgICogY2FsbC5cbiAgICpcbiAgICogQGRlZmF1bHQgYHVuZGVmaW5lZGBcbiAgICovXG4gIHJlYWRvbmx5IG9mZnNldFJhbmdlPzogT2Zmc2V0UmFuZ2U7XG5cbiAgLyoqXG4gICAqIFRoZSBwYXRoIG9yIGZpbGUgdG8gZWRpdCB0aGUgbGlua3MgZm9yLlxuICAgKi9cbiAgcmVhZG9ubHkgcGF0aE9yRmlsZTogUGF0aE9yRmlsZTtcblxuICAvKipcbiAgICogVGhlIGZ1bmN0aW9uIHRoYXQgY29udmVydHMgZWFjaCBsaW5rLlxuICAgKi9cbiAgcmVhZG9ubHkgcmVmZXJlbmNlQ29udmVydGVyOiAobGluazogUmVmZXJlbmNlKSA9PiBQcm9taXNhYmxlPE1heWJlUmV0dXJuPHN0cmluZz4+O1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRvIGFsc28gZWRpdCBleHRlcm5hbCBsaW5rcyBwYXJzZWQgZnJvbSB0aGUgbm90ZSBib2R5LiBXaGVuIGB0cnVlYCwgdGhlIGNvbnZlcnRlciBhbHNvXG4gICAqIHJlY2VpdmVzIHJlZmVyZW5jZXMgZm9yIGV4dGVybmFsIGxpbmtzLlxuICAgKlxuICAgKiBAZGVmYXVsdCBgZmFsc2VgXG4gICAqL1xuICByZWFkb25seSBzaG91bGRFZGl0RXh0ZXJuYWxMaW5rcz86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdG8gYWxzbyBlZGl0IGV4dGVybmFsIGxpbmtzIHBhcnNlZCBmcm9tIGZyb250bWF0dGVyIHZhbHVlcy4gV2hlbiBgdHJ1ZWAsIHRoZSBjb252ZXJ0ZXIgYWxzb1xuICAgKiByZWNlaXZlcyByZWZlcmVuY2VzIGZvciBmcm9udG1hdHRlciBleHRlcm5hbCBsaW5rcy5cbiAgICpcbiAgICogQGRlZmF1bHQgYGZhbHNlYFxuICAgKi9cbiAgcmVhZG9ubHkgc2hvdWxkRWRpdEZyb250bWF0dGVyRXh0ZXJuYWxMaW5rcz86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdG8gYWxzbyBlZGl0IGV4dGVybmFsIGxpbmtzIHBhcnNlZCBmcm9tIG11bHRpLWxpbmsgKG11bHRpLXZhbHVlKSBmcm9udG1hdHRlciB2YWx1ZXMuIFdoZW5cbiAgICogYHRydWVgLCB0aGUgY29udmVydGVyIGFsc28gcmVjZWl2ZXMgcmVmZXJlbmNlcyBmb3IgZWFjaCBleHRlcm5hbCBsaW5rIHdpdGhpbiBhIG11bHRpLWxpbmsgZnJvbnRtYXR0ZXJcbiAgICogdmFsdWUgKGVhY2ggbG9jYXRlZCBieSBpdHMgb2Zmc2V0cywgc28gb25seSB0aGF0IGxpbmsgaXMgc3BsaWNlZCBiYWNrIGluIHBsYWNlKS5cbiAgICpcbiAgICogQGRlZmF1bHQgYGZhbHNlYFxuICAgKi9cbiAgcmVhZG9ubHkgc2hvdWxkRWRpdE11bHRpVmFsdWVGcm9udG1hdHRlckV4dGVybmFsTGlua3M/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRvIGxlYXZlIGV2ZXJ5IGxpbmsgaW5zaWRlIGEgaGVhZGluZyB1bmNoYW5nZWQ6IHRoZSBjb252ZXJ0ZXIgaXMgbm90IGNhbGxlZCBmb3IgaXQsIHNvIGl0IHN0YXlzXG4gICAqIGJ5dGUtZm9yLWJ5dGUgYXMgd3JpdHRlbi4gQSBsaW5rIGluIGEgaGVhZGluZyBpcyBwYXJ0IG9mIHRoZSBoZWFkaW5nJ3MgdGV4dCwgc28gcmV3cml0aW5nIGl0IGNoYW5nZXNcbiAgICogdGhhdCB0ZXh0IGFuZCBicmVha3MgZXZlcnkgYCNoZWFkaW5nYCBzdWJwYXRoIHBvaW50aW5nIGF0IHRoZSBoZWFkaW5nLiBTZWUge0BsaW5rIGlzUmVmZXJlbmNlSW5IZWFkaW5nfS5cbiAgICpcbiAgICogQGRlZmF1bHQgYGZhbHNlYFxuICAgKi9cbiAgcmVhZG9ubHkgc2hvdWxkU2tpcFJlZmVyZW5jZXNJbkhlYWRpbmdzPzogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBQYXJhbWV0ZXJzIGZvciB7QGxpbmsgZXh0cmFjdFJlZmVyZW5jZUZpbGV9LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEV4dHJhY3RSZWZlcmVuY2VGaWxlUGFyYW1zIHtcbiAgLyoqXG4gICAqIFRoZSBPYnNpZGlhbiBhcHBsaWNhdGlvbiBpbnN0YW5jZS5cbiAgICovXG4gIHJlYWRvbmx5IGFwcDogQXBwO1xuXG4gIC8qKlxuICAgKiBUaGUgcmVmZXJlbmNlIHRvIHJlc29sdmUuXG4gICAqL1xuICByZWFkb25seSByZWZlcmVuY2U6IFJlZmVyZW5jZTtcblxuICAvKipcbiAgICogV2hldGhlciB0byBhbGxvdyBub24tZXhpc3RpbmcgZmlsZXMuXG4gICAqXG4gICAqIEBkZWZhdWx0IGBmYWxzZWBcbiAgICovXG4gIHJlYWRvbmx5IHNob3VsZEFsbG93Tm9uRXhpc3RpbmdGaWxlPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogVGhlIHNvdXJjZSBwYXRoIG9yIGZpbGUuXG4gICAqL1xuICByZWFkb25seSBzb3VyY2VQYXRoT3JGaWxlOiBQYXRoT3JGaWxlO1xufVxuXG4vKipcbiAqIFBhcmFtcyBmb3Ige0BsaW5rIGdlbmVyYXRlTWFya2Rvd25MaW5rfS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBHZW5lcmF0ZU1hcmtkb3duTGlua1BhcmFtcyB7XG4gIC8qKlxuICAgKiBBbiBhbGlhcyBmb3IgdGhlIGxpbmsuXG4gICAqXG4gICAqIEBleGFtcGxlIGBbW2FsaWFzfGxpbmtdXWBcbiAgICogQGV4YW1wbGUgYFthbGlhc10obGluay5tZClgXG4gICAqL1xuICByZWFkb25seSBhbGlhcz86IHN0cmluZztcblxuICAvKipcbiAgICogQW4gT2JzaWRpYW4gYXBwIGluc3RhbmNlLlxuICAgKi9cbiAgcmVhZG9ubHkgYXBwOiBBcHA7XG5cbiAgLyoqXG4gICAqIEluZGljYXRlcyBpZiB0aGUgbGluayBzaG91bGQgYmUgZW1iZWRkZWQuIElmIG5vdCBwcm92aWRlZCwgaXQgd2lsbCBiZSBpbmZlcnJlZCBiYXNlZCBvbiB0aGUgZmlsZSB0eXBlLlxuICAgKlxuICAgKiBJZiBgdHJ1ZWA6IGAhW1t0YXJnZXRdXWAuXG4gICAqXG4gICAqIElmIGBmYWxzZWA6IGBbW3RhcmdldF1dYC5cbiAgICovXG4gIHJlYWRvbmx5IGlzRW1iZWQ/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRvIGFsbG93IGFuIGVtcHR5IGFsaWFzIGZvciBlbWJlZHMuXG4gICAqXG4gICAqIEFwcGxpY2FibGUgb25seSBpZiB0aGUgcmVzdWx0IGxpbmsgc3R5bGUgaXMge0BsaW5rIExpbmtTdHlsZS5NYXJrZG93bn0uXG4gICAqXG4gICAqIElmIGB0cnVlYDogYCFbXShmb28ucG5nKWAuXG4gICAqXG4gICAqIElmIGBmYWxzZWA6IGAhW2Zvb10oZm9vLnBuZylgLlxuICAgKlxuICAgKiBAZGVmYXVsdCBgdHJ1ZWBcbiAgICovXG4gIHJlYWRvbmx5IGlzRW1wdHlFbWJlZEFsaWFzQWxsb3dlZD86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdG8gYWxsb3cgbm9uLWV4aXN0aW5nIGZpbGVzLlxuICAgKlxuICAgKiBJZiBgZmFsc2VgIGFuZCB7QGxpbmsgdGFyZ2V0UGF0aE9yRmlsZX0gaXMgYSBub24tZXhpc3RpbmcgZmlsZSwgYW4gZXJyb3Igd2lsbCBiZSB0aHJvd24uXG4gICAqXG4gICAqIEBkZWZhdWx0IGBmYWxzZWBcbiAgICovXG4gIHJlYWRvbmx5IGlzTm9uRXhpc3RpbmdGaWxlQWxsb3dlZD86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdG8gYWxsb3cgYSBzaW5nbGUgc3VicGF0aC5cbiAgICpcbiAgICogQXBwbGljYWJsZSBvbmx5IGlmIHtAbGluayB0YXJnZXRQYXRoT3JGaWxlfSBhbmQge0BsaW5rIHNvdXJjZVBhdGhPckZpbGV9IGFyZSB0aGUgc2FtZSBmaWxlLlxuICAgKlxuICAgKiBJZiBgdHJ1ZWA6IGBbWyNzdWJwYXRoXV1gLlxuICAgKlxuICAgKiBJZiBgZmFsc2VgOiBgW1tzb3VyY2Ujc3VicGF0aF1dYFxuICAgKlxuICAgKiBAZGVmYXVsdCBgdHJ1ZWBcbiAgICovXG4gIHJlYWRvbmx5IGlzU2luZ2xlU3VicGF0aEFsbG93ZWQ/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBBIHN0eWxlIG9mIHRoZSBsaW5rIHBhdGguXG4gICAqL1xuICByZWFkb25seSBsaW5rUGF0aFN0eWxlPzogTGlua1BhdGhTdHlsZTtcblxuICAvKipcbiAgICogQSBzdHlsZSBvZiB0aGUgbGluay5cbiAgICovXG4gIHJlYWRvbmx5IGxpbmtTdHlsZT86IExpbmtTdHlsZTtcblxuICAvKipcbiAgICogQW4gb3JpZ2luYWwgbGluayB0ZXh0LlxuICAgKlxuICAgKiBJZiBwcm92aWRlZCwgaXQgd2lsbCBiZSB1c2VkIHRvIGluZmVyIHRoZSB2YWx1ZXMgb2ZcbiAgICpcbiAgICogLSB7QGxpbmsgaGFzRW1iZWRTeW50YXh9XG4gICAqIC0ge0BsaW5rIGxpbmtTdHlsZX1cbiAgICogLSB7QGxpbmsgc2hvdWxkVXNlQW5nbGVCcmFja2V0c31cbiAgICogLSB7QGxpbmsgc2hvdWxkVXNlTGVhZGluZ0RvdEZvclJlbGF0aXZlUGF0aHN9XG4gICAqIC0ge0BsaW5rIHNob3VsZFVzZUxlYWRpbmdTbGFzaEZvckFic29sdXRlUGF0aHN9XG4gICAqXG4gICAqIFRoZXNlIGluZmVycmVkIHZhbHVlcyB3aWxsIGJlIG92ZXJyaWRkZW4gYnkgY29ycmVzcG9uZGluZyBzZXR0aW5ncyBpZiBzcGVjaWZpZWQuXG4gICAqL1xuICByZWFkb25seSBvcmlnaW5hbExpbms/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdG8gZXNjYXBlIHRoZSBhbGlhcy5cbiAgICpcbiAgICogQXBwbGljYWJsZSBvbmx5IGlmIHRoZSByZXN1bHQgbGluayBzdHlsZSBpcyB7QGxpbmsgTGlua1N0eWxlLk1hcmtkb3dufS5cbiAgICpcbiAgICogSWYgYHRydWVgOiBgW1xcKlxcKmFsaWFzXFwqXFwqXShsaW5rLm1kKWAuXG4gICAqXG4gICAqIElmIGBmYWxzZWA6IGBbKiphbGlhcyoqXShsaW5rLm1kKWAuXG4gICAqXG4gICAqIEBkZWZhdWx0IGBmYWxzZWBcbiAgICovXG4gIHJlYWRvbmx5IHNob3VsZEVzY2FwZUFsaWFzPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogV2hldGhlciB0byBpbmNsdWRlIHRoZSBhdHRhY2htZW50IGV4dGVuc2lvbiBpbiB0aGUgZW1iZWQgYWxpYXMuXG4gICAqXG4gICAqIEFwcGxpY2FibGUgb25seSBpZiB7QGxpbmsgaXNFbXB0eUVtYmVkQWxpYXNBbGxvd2VkfSBpcyBgZmFsc2VgLlxuICAgKlxuICAgKiBJZiBgdHJ1ZWA6IGBbZm9vLnBuZ10oZm9vLnBuZylgLlxuICAgKlxuICAgKiBJZiBgZmFsc2VgOiBgW2Zvb10oZm9vLnBuZylgLlxuICAgKlxuICAgKiBAZGVmYXVsdCBgZmFsc2VgXG4gICAqL1xuICByZWFkb25seSBzaG91bGRJbmNsdWRlQXR0YWNobWVudEV4dGVuc2lvblRvRW1iZWRBbGlhcz86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIEluZGljYXRlcyBpZiB0aGUgbGluayBzaG91bGQgdXNlIGFuZ2xlIGJyYWNrZXRzLlxuICAgKlxuICAgKiBBcHBsaWNhYmxlIG9ubHkgaWYge0BsaW5rIGxpbmtTdHlsZX0gaXMge0BsaW5rIExpbmtTdHlsZS5NYXJrZG93bn0uXG4gICAqXG4gICAqIElmIGB0cnVlYDogYFthbGlhc10oPHBhdGggd2l0aCBzcGFjZXMubWQ+KWAuXG4gICAqXG4gICAqIElmIGBmYWxzZWA6IGBbYWxpYXNdKHBhdGglMjB3aXRoJTIwc3BhY2VzLm1kKWAuXG4gICAqXG4gICAqIEBkZWZhdWx0IGBmYWxzZWBcbiAgICovXG4gIHJlYWRvbmx5IHNob3VsZFVzZUFuZ2xlQnJhY2tldHM/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBJbmRpY2F0ZXMgaWYgdGhlIGxpbmsgc2hvdWxkIHVzZSBhIGxlYWRpbmcgZG90LlxuICAgKlxuICAgKiBBcHBsaWNhYmxlIG9ubHkgaWYge0BsaW5rIGxpbmtQYXRoU3R5bGV9IGlzIHtAbGluayBMaW5rUGF0aFN0eWxlLlJlbGF0aXZlUGF0aFRvVGhlU291cmNlfS5cbiAgICpcbiAgICogSWYgYHRydWVgOiBgW1suL3JlbGF0aXZlL3BhdGgvdG8vdGFyZ2V0XV1gXG4gICAqXG4gICAqIElmIGBmYWxzZWA6IGBbW3JlbGF0aXZlL3BhdGgvdG8vdGFyZ2V0XV1gXG4gICAqXG4gICAqIEBkZWZhdWx0IGBmYWxzZWBcbiAgICovXG4gIHJlYWRvbmx5IHNob3VsZFVzZUxlYWRpbmdEb3RGb3JSZWxhdGl2ZVBhdGhzPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogSW5kaWNhdGVzIGlmIHRoZSBsaW5rIHNob3VsZCB1c2UgYSBsZWFkaW5nIHNsYXNoLlxuICAgKlxuICAgKiBBcHBsaWNhYmxlIG9ubHkgaWYge0BsaW5rIGxpbmtQYXRoU3R5bGV9IGlzIHtAbGluayBMaW5rUGF0aFN0eWxlLkFic29sdXRlUGF0aEluVmF1bHR9LlxuICAgKlxuICAgKiBJZiBgdHJ1ZWA6IGBbWy9hYnNvbHV0ZS9wYXRoL3RvL3RhcmdldF1dYFxuICAgKlxuICAgKiBJZiBgZmFsc2VgOiBgW1thYnNvbHV0ZS9wYXRoL3RvL3RhcmdldF1dYFxuICAgKlxuICAgKiBAZGVmYXVsdCBgZmFsc2VgXG4gICAqL1xuICByZWFkb25seSBzaG91bGRVc2VMZWFkaW5nU2xhc2hGb3JBYnNvbHV0ZVBhdGhzPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogQSBzb3VyY2UgcGF0aCBvZiB0aGUgbGluay5cbiAgICovXG4gIHJlYWRvbmx5IHNvdXJjZVBhdGhPckZpbGU6IFBhdGhPckZpbGU7XG5cbiAgLyoqXG4gICAqIEEgc3VicGF0aCBvZiB0aGUgbGluay5cbiAgICpcbiAgICogU2hvdWxkIGJlIGVtcHR5IG9yIHN0YXJ0IHdpdGggYCNgLlxuICAgKlxuICAgKiBAZXhhbXBsZSBgW1tsaW5rLXdpdGgtZW1wdHktc3VicGF0aF1dYFxuICAgKiBAZXhhbXBsZSBgW1tsaW5rLXdpdGgtc3VicGF0aCNzdWJwYXRoXV1gXG4gICAqIEBleGFtcGxlIGBbW2xpbmstd2l0aC1zdWJwYXRoI3N1YnBhdGgjbmVzdGVkLXN1YnBhdGhdXWBcbiAgICogQGRlZmF1bHQgYCcnYFxuICAgKi9cbiAgcmVhZG9ubHkgc3VicGF0aD86IHN0cmluZztcblxuICAvKipcbiAgICogQSB0YXJnZXQgcGF0aCBvciBmaWxlLlxuICAgKi9cbiAgcmVhZG9ubHkgdGFyZ2V0UGF0aE9yRmlsZTogUGF0aE9yRmlsZTtcbn1cblxuLyoqXG4gKiBQYXJhbXMgZm9yIHtAbGluayBnZW5lcmF0ZVJhd01hcmtkb3duTGlua30uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgR2VuZXJhdGVSYXdNYXJrZG93bkxpbmtQYXJhbXMge1xuICAvKipcbiAgICogQW4gYWxpYXMgb2YgdGhlIGxpbmsuIERlZmF1bHRzIHRvIGB1bmRlZmluZWRgLlxuICAgKi9cbiAgcmVhZG9ubHkgYWxpYXM/OiBzdHJpbmcgfCB1bmRlZmluZWQ7XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdGhlIGxpbmsgc2hvdWxkIGJlIGFuIGVtYmVkIGxpbmsuXG4gICAqXG4gICAqIEBkZWZhdWx0IGBmYWxzZWBcbiAgICovXG4gIHJlYWRvbmx5IGlzRW1iZWQ/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRoZSBsaW5rIHNob3VsZCBiZSBhIHdpa2lsaW5rLlxuICAgKi9cbiAgcmVhZG9ubHkgaXNXaWtpbGluazogYm9vbGVhbjtcblxuICAvKipcbiAgICogV2hldGhlciB0byBlc2NhcGUgdGhlIGFsaWFzLiBBcHBsaWNhYmxlIG9ubHkgaWYge0BsaW5rIGhhc1dpa2lsaW5rU3ludGF4fSBpcyBgZmFsc2VgLlxuICAgKlxuICAgKiBAZGVmYXVsdCBgZmFsc2VgXG4gICAqL1xuICByZWFkb25seSBzaG91bGRFc2NhcGVBbGlhcz86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdG8gdXNlIGFuZ2xlIGJyYWNrZXRzLiBBcHBsaWNhYmxlIG9ubHkgaWYge0BsaW5rIGhhc1dpa2lsaW5rU3ludGF4fSBpcyBgZmFsc2VgLlxuICAgKlxuICAgKiBAZGVmYXVsdCBgZmFsc2VgXG4gICAqL1xuICByZWFkb25seSBzaG91bGRVc2VBbmdsZUJyYWNrZXRzPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogQSB0aXRsZSBvZiB0aGUgbGluay5cbiAgICovXG4gIHJlYWRvbmx5IHRpdGxlPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBBbiBVUkwgb2YgdGhlIGxpbmsuXG4gICAqL1xuICByZWFkb25seSB1cmw6IHN0cmluZztcbn1cblxuLyoqXG4gKiBBIHtAbGluayBCYWNrbGlua3NTbmFwc2hvdH0gd2hpbGUgaXQgaXMgc3RpbGwgYmVpbmcgYWNjdW11bGF0ZWQgYnkge0BsaW5rIGJ1aWxkQmFja2xpbmtzU25hcHNob3R9LlxuICpcbiAqIEB0eXBlUGFyYW0gVFBheWxvYWQgLSBUaGUgcGF5bG9hZCByZWNvcmRlZCBmb3IgZWFjaCBsaW5rLlxuICovXG5leHBvcnQgdHlwZSBNdXRhYmxlQmFja2xpbmtzU25hcHNob3Q8VFBheWxvYWQ+ID0gTWFwPHN0cmluZywgTWFwPHN0cmluZywgVFBheWxvYWQ+PjtcblxuLyoqXG4gKiBQYXJhbXMgZm9yIHtAbGluayBzaG91bGRSZXNldEFsaWFzfS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTaG91bGRSZXNldEFsaWFzUGFyYW1zIHtcbiAgLyoqXG4gICAqIEFuIE9ic2lkaWFuIGFwcCBpbnN0YW5jZS5cbiAgICovXG4gIHJlYWRvbmx5IGFwcDogQXBwO1xuXG4gIC8qKlxuICAgKiBBIGRpc3BsYXkgdGV4dCBvZiB0aGUgbGluay5cbiAgICovXG4gIHJlYWRvbmx5IGRpc3BsYXlUZXh0OiBzdHJpbmcgfCB1bmRlZmluZWQ7XG5cbiAgLyoqXG4gICAqIEluZGljYXRlcyBpZiB0aGUgbGluayBpcyBhIHdpa2lsaW5rLlxuICAgKi9cbiAgcmVhZG9ubHkgaXNXaWtpbGluaz86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIEEgc291cmNlIHBhdGggb2YgdGhlIGxpbmsuXG4gICAqL1xuICByZWFkb25seSBuZXdTb3VyY2VQYXRoT3JGaWxlOiBQYXRoT3JGaWxlO1xuXG4gIC8qKlxuICAgKiBBbiBvbGQgc291cmNlIGZpbGUgY29udGFpbmluZyB0aGUgbGluay5cbiAgICovXG4gIHJlYWRvbmx5IG9sZFNvdXJjZVBhdGhPckZpbGU/OiBQYXRoT3JGaWxlO1xuXG4gIC8qKlxuICAgKiBBbiBvbGQgdGFyZ2V0IHBhdGggb2YgdGhlIGxpbmsuXG4gICAqL1xuICByZWFkb25seSBvbGRUYXJnZXRQYXRoOiBQYXRoT3JGaWxlO1xuXG4gIC8qKlxuICAgKiBBIHRhcmdldCBwYXRoIG9yIGZpbGUuXG4gICAqL1xuICByZWFkb25seSB0YXJnZXRQYXRoT3JGaWxlOiBQYXRoT3JGaWxlO1xufVxuXG4vKipcbiAqIFNwbGl0cyBhIGxpbmsgaW50byBpdHMgbGluayBwYXRoIGFuZCBzdWJwYXRoLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFNwbGl0U3VicGF0aFJlc3VsdCB7XG4gIC8qKlxuICAgKiBBIGxpbmsgcGF0aC5cbiAgICovXG4gIHJlYWRvbmx5IGxpbmtQYXRoOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEEgc3VicGF0aC5cbiAgICovXG4gIHJlYWRvbmx5IHN1YnBhdGg6IHN0cmluZztcbn1cblxuLyoqXG4gKiBQYXJhbXMgZm9yIHtAbGluayB1cGRhdGVGaWxlVXJsTGlua3NJbkNvbnRlbnR9LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFVwZGF0ZUZpbGVVcmxMaW5rc0luQ29udGVudFBhcmFtcyB7XG4gIC8qKlxuICAgKiBUaGUgYWJvcnQgc2lnbmFsIHRvIGNvbnRyb2wgdGhlIGV4ZWN1dGlvbiBvZiB0aGUgZnVuY3Rpb24uXG4gICAqL1xuICByZWFkb25seSBhYm9ydFNpZ25hbD86IEFib3J0U2lnbmFsO1xuXG4gIC8qKlxuICAgKiBBbiBPYnNpZGlhbiBhcHAgaW5zdGFuY2UuXG4gICAqL1xuICByZWFkb25seSBhcHA6IEFwcDtcblxuICAvKipcbiAgICogVGhlIGNvbnRlbnQgdG8gbm9ybWFsaXplIHRoZSBgZmlsZTovL2AgbGlua3MgaW4uXG4gICAqL1xuICByZWFkb25seSBjb250ZW50OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEEgcmFuZ2Ugd2l0aGluIHtAbGluayBVcGRhdGVGaWxlVXJsTGlua3NJbkNvbnRlbnRQYXJhbXMuY29udGVudH0sIGluIGNoYXJhY3RlciBvZmZzZXRzLCByZXN0cmljdGluZ1xuICAgKiB0aGUgcGFzcyB0byB0aGUgbGlua3MgaW5zaWRlIGl0LiBXaGVuIG9taXR0ZWQsIGV2ZXJ5IGxpbmsgaXMgdmlzaXRlZC5cbiAgICpcbiAgICogQSBsaW5rIGlzIG5vcm1hbGl6ZWQgb25seSB3aGVuIGl0IGlzICoqZnVsbHkgY29udGFpbmVkKiogaW4gdGhlIHJhbmdlOyBvbmUgdGhhdCBtZXJlbHkgb3ZlcmxhcHMgaXQgaXNcbiAgICogbGVmdCBhbG9uZSwgYmVjYXVzZSByZXdyaXRpbmcgcGFydCBvZiBhIGxpbmsgY29ycnVwdHMgaXQuIEJvdGggYm91bmRzIGFyZSBpbmNsdXNpdmUsIHNvIGEgcmFuZ2Ugd2hvc2VcbiAgICogb2Zmc2V0cyBjb2luY2lkZSBleGFjdGx5IHdpdGggYSBsaW5rJ3MgZG9lcyBpbmNsdWRlIHRoYXQgbGluay5cbiAgICpcbiAgICogQSByZWZlcmVuY2UgdGhhdCBjYXJyaWVzIG5vIHBvc2l0aW9uIHdpdGhpbiB0aGUgY29udGVudCDigJQgYSBmcm9udG1hdHRlciBsaW5rLCBhIG11bHRpLWxpbmsgZnJvbnRtYXR0ZXJcbiAgICogdmFsdWUgZW50cnksIG9yIGFueSBjYW52YXMgcmVmZXJlbmNlIOKAlCBpcyBuZXZlciBpbiByYW5nZSBhbmQgaXMgc2tpcHBlZCB3aGVuZXZlciBhIHJhbmdlIGlzIHN1cHBsaWVkLlxuICAgKlxuICAgKiBAZGVmYXVsdCBgdW5kZWZpbmVkYFxuICAgKi9cbiAgcmVhZG9ubHkgb2Zmc2V0UmFuZ2U/OiBPZmZzZXRSYW5nZTtcblxuICAvKipcbiAgICogV2hldGhlciB0byBsZWF2ZSBldmVyeSBsaW5rIGluc2lkZSBhIGhlYWRpbmcgdW5jaGFuZ2VkLiBTZWVcbiAgICoge0BsaW5rIEVkaXRSZWZlcmVuY2VzSW5Db250ZW50UGFyYW1zLnNob3VsZFNraXBSZWZlcmVuY2VzSW5IZWFkaW5nc30uXG4gICAqXG4gICAqIEBkZWZhdWx0IGBmYWxzZWBcbiAgICovXG4gIHJlYWRvbmx5IHNob3VsZFNraXBSZWZlcmVuY2VzSW5IZWFkaW5ncz86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdG8gZW1pdCB0aGUgbm9ybWFsaXplZCBsaW5rcyB3aXRoIGFuZ2xlIGJyYWNrZXRzIGFuZCByYXcgc3BhY2VzIGluc3RlYWQgb2YgYCUyMGAtZW5jb2RpbmcuXG4gICAqXG4gICAqIEBkZWZhdWx0IGBmYWxzZWBcbiAgICovXG4gIHJlYWRvbmx5IHNob3VsZFVzZUFuZ2xlQnJhY2tldHM/OiBib29sZWFuO1xufVxuXG4vKipcbiAqIFBhcmFtcyBmb3Ige0BsaW5rIHVwZGF0ZUZpbGVVcmxMaW5rc0luRmlsZX0uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVXBkYXRlRmlsZVVybExpbmtzSW5GaWxlUGFyYW1zIGV4dGVuZHMgUHJvY2Vzc09wdGlvbnMge1xuICAvKipcbiAgICogQW4gT2JzaWRpYW4gYXBwIGluc3RhbmNlLlxuICAgKi9cbiAgcmVhZG9ubHkgYXBwOiBBcHA7XG5cbiAgLyoqXG4gICAqIEEgcmFuZ2Ugd2l0aGluIHRoZSBmaWxlJ3MgY29udGVudCwgaW4gY2hhcmFjdGVyIG9mZnNldHMsIHJlc3RyaWN0aW5nIHRoZSBwYXNzIHRvIHRoZSBsaW5rcyBpbnNpZGUgaXQuXG4gICAqIFdoZW4gb21pdHRlZCwgZXZlcnkgbGluayBpcyB2aXNpdGVkLlxuICAgKlxuICAgKiBBIGxpbmsgaXMgbm9ybWFsaXplZCBvbmx5IHdoZW4gaXQgaXMgKipmdWxseSBjb250YWluZWQqKiBpbiB0aGUgcmFuZ2U7IG9uZSB0aGF0IG1lcmVseSBvdmVybGFwcyBpdCBpc1xuICAgKiBsZWZ0IGFsb25lLCBiZWNhdXNlIHJld3JpdGluZyBwYXJ0IG9mIGEgbGluayBjb3JydXB0cyBpdC4gQm90aCBib3VuZHMgYXJlIGluY2x1c2l2ZSwgc28gYSByYW5nZSB3aG9zZVxuICAgKiBvZmZzZXRzIGNvaW5jaWRlIGV4YWN0bHkgd2l0aCBhIGxpbmsncyBkb2VzIGluY2x1ZGUgdGhhdCBsaW5rLlxuICAgKlxuICAgKiBBIHJlZmVyZW5jZSB0aGF0IGNhcnJpZXMgbm8gcG9zaXRpb24gd2l0aGluIHRoZSBmaWxlJ3MgY29udGVudCDigJQgYSBmcm9udG1hdHRlciBsaW5rLCBhIG11bHRpLWxpbmtcbiAgICogZnJvbnRtYXR0ZXIgdmFsdWUgZW50cnksIG9yIGFueSBjYW52YXMgcmVmZXJlbmNlIOKAlCBpcyBuZXZlciBpbiByYW5nZSBhbmQgaXMgc2tpcHBlZCB3aGVuZXZlciBhIHJhbmdlIGlzXG4gICAqIHN1cHBsaWVkLlxuICAgKlxuICAgKiBUaGUgb2Zmc2V0cyBhcmUgaW50byB0aGUgY29udGVudCB0aGlzIGZ1bmN0aW9uIHJlYWRzIGZyb20gdGhlIHZhdWx0LiBCZWZvcmUgcmVhZGluZywgaXQgc2F2ZXMgYW55XG4gICAqIHVuc2F2ZWQgZWRpdG9yIGJ1ZmZlciBmb3IgdGhlIGZpbGUsIHNvIGEgcmFuZ2UgdGFrZW4gZnJvbSBhbiBvcGVuIGVkaXRvciB2aWEgYEVkaXRvci5wb3NUb09mZnNldGAgaXNcbiAgICogdmFsaWQuIFRoZSBjYWxsZXIgb3ducyBvbmx5IHRoZSBjYXNlIHdoZXJlIHRoZSBidWZmZXIgY2hhbmdlcyBiZXR3ZWVuIGNvbXB1dGluZyB0aGUgcmFuZ2UgYW5kIHRoaXNcbiAgICogY2FsbC5cbiAgICpcbiAgICogQGRlZmF1bHQgYHVuZGVmaW5lZGBcbiAgICovXG4gIHJlYWRvbmx5IG9mZnNldFJhbmdlPzogT2Zmc2V0UmFuZ2U7XG5cbiAgLyoqXG4gICAqIFRoZSBwYXRoIG9yIGZpbGUgdG8gbm9ybWFsaXplIHRoZSBgZmlsZTovL2AgbGlua3MgaW4uXG4gICAqL1xuICByZWFkb25seSBwYXRoT3JGaWxlOiBQYXRoT3JGaWxlO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRvIGxlYXZlIGV2ZXJ5IGxpbmsgaW5zaWRlIGEgaGVhZGluZyB1bmNoYW5nZWQuIFNlZSB7QGxpbmsgRWRpdFJlZmVyZW5jZXNQYXJhbXMuc2hvdWxkU2tpcFJlZmVyZW5jZXNJbkhlYWRpbmdzfS5cbiAgICpcbiAgICogQGRlZmF1bHQgYGZhbHNlYFxuICAgKi9cbiAgcmVhZG9ubHkgc2hvdWxkU2tpcFJlZmVyZW5jZXNJbkhlYWRpbmdzPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogV2hldGhlciB0byBlbWl0IHRoZSBub3JtYWxpemVkIGxpbmtzIHdpdGggYW5nbGUgYnJhY2tldHMgYW5kIHJhdyBzcGFjZXMgaW5zdGVhZCBvZiBgJTIwYC1lbmNvZGluZy5cbiAgICpcbiAgICogQGRlZmF1bHQgYGZhbHNlYFxuICAgKi9cbiAgcmVhZG9ubHkgc2hvdWxkVXNlQW5nbGVCcmFja2V0cz86IGJvb2xlYW47XG59XG5cbi8qKlxuICogUGFyYW1zIGZvciB7QGxpbmsgdXBkYXRlTGlua30uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVXBkYXRlTGlua1BhcmFtcyB7XG4gIC8qKlxuICAgKiBBbiBPYnNpZGlhbiBhcHAgaW5zdGFuY2UuXG4gICAqL1xuICByZWFkb25seSBhcHA6IEFwcDtcblxuICAvKipcbiAgICogV2hldGhlciB0byBhbGxvdyBhbiBlbXB0eSBhbGlhcyBmb3IgZW1iZWRzLlxuICAgKlxuICAgKiBBcHBsaWNhYmxlIG9ubHkgaWYgdGhlIHJlc3VsdCBsaW5rIHN0eWxlIGlzIHtAbGluayBMaW5rU3R5bGUuTWFya2Rvd259LlxuICAgKlxuICAgKiBJZiBgdHJ1ZWA6IGAhW10oZm9vLnBuZylgLlxuICAgKlxuICAgKiBJZiBgZmFsc2VgOiBgIVtmb29dKGZvby5wbmcpYC5cbiAgICpcbiAgICogQGRlZmF1bHQgYHRydWVgXG4gICAqL1xuICByZWFkb25seSBpc0VtcHR5RW1iZWRBbGlhc0FsbG93ZWQ/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBBIHN0eWxlIG9mIHRoZSBsaW5rIHBhdGguXG4gICAqL1xuICByZWFkb25seSBsaW5rUGF0aFN0eWxlPzogTGlua1BhdGhTdHlsZTtcblxuICAvKipcbiAgICogV2hldGhlciB0byBmb3JjZSBtYXJrZG93biBsaW5rcy5cbiAgICovXG4gIHJlYWRvbmx5IGxpbmtTdHlsZT86IExpbmtTdHlsZTtcblxuICAvKipcbiAgICogQSBzb3VyY2UgZmlsZSBjb250YWluaW5nIHRoZSBsaW5rLlxuICAgKi9cbiAgcmVhZG9ubHkgbmV3U291cmNlUGF0aE9yRmlsZTogUGF0aE9yRmlsZTtcblxuICAvKipcbiAgICogQSBmaWxlIGFzc29jaWF0ZWQgd2l0aCB0aGUgbGluay5cbiAgICovXG4gIHJlYWRvbmx5IG5ld1RhcmdldFBhdGhPckZpbGU6IFBhdGhPckZpbGU7XG5cbiAgLyoqXG4gICAqIEFuIG9sZCBzb3VyY2UgZmlsZSBjb250YWluaW5nIHRoZSBsaW5rLlxuICAgKi9cbiAgcmVhZG9ubHkgb2xkU291cmNlUGF0aE9yRmlsZT86IFBhdGhPckZpbGU7XG5cbiAgLyoqXG4gICAqIEFuIG9sZCBwYXRoIG9mIHRoZSBmaWxlLlxuICAgKi9cbiAgcmVhZG9ubHkgb2xkVGFyZ2V0UGF0aE9yRmlsZT86IFBhdGhPckZpbGU7XG5cbiAgLyoqXG4gICAqIFRoZSByZWZlcmVuY2Ugd2hvc2UgbGluayBpcyB1cGRhdGVkLlxuICAgKi9cbiAgcmVhZG9ubHkgcmVmZXJlbmNlOiBSZWZlcmVuY2U7XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdG8gZXNjYXBlIHRoZSBhbGlhcy5cbiAgICpcbiAgICogQXBwbGljYWJsZSBvbmx5IGlmIHRoZSByZXN1bHQgbGluayBzdHlsZSBpcyB7QGxpbmsgTGlua1N0eWxlLk1hcmtkb3dufS5cbiAgICpcbiAgICogSWYgYHRydWVgOiBgW1xcKlxcKmFsaWFzXFwqXFwqXShsaW5rLm1kKWAuXG4gICAqXG4gICAqIElmIGBmYWxzZWA6IGBbKiphbGlhcyoqXShsaW5rLm1kKWAuXG4gICAqXG4gICAqIEBkZWZhdWx0IGBmYWxzZWBcbiAgICovXG4gIHJlYWRvbmx5IHNob3VsZEVzY2FwZUFsaWFzPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogV2hldGhlciB0byBpbmNsdWRlIHRoZSBhdHRhY2htZW50IGV4dGVuc2lvbiBpbiB0aGUgZW1iZWQgYWxpYXMuXG4gICAqXG4gICAqIEFwcGxpY2FibGUgb25seSBpZiB7QGxpbmsgaXNFbXB0eUVtYmVkQWxpYXNBbGxvd2VkfSBpcyBgZmFsc2VgLlxuICAgKlxuICAgKiBJZiBgdHJ1ZWA6IGBbZm9vLnBuZ10oZm9vLnBuZylgLlxuICAgKlxuICAgKiBJZiBgZmFsc2VgOiBgW2Zvb10oZm9vLnBuZylgLlxuICAgKlxuICAgKiBAZGVmYXVsdCBgZmFsc2VgXG4gICAqL1xuICByZWFkb25seSBzaG91bGRJbmNsdWRlQXR0YWNobWVudEV4dGVuc2lvblRvRW1iZWRBbGlhcz86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdG8gdXBkYXRlIGZpbGUgbmFtZSBhbGlhcy5cbiAgICpcbiAgICogQGRlZmF1bHQgYHRydWVgXG4gICAqL1xuICByZWFkb25seSBzaG91bGRVcGRhdGVGaWxlTmFtZUFsaWFzPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogSW5kaWNhdGVzIGlmIHRoZSBsaW5rIHNob3VsZCB1c2UgYW5nbGUgYnJhY2tldHMuXG4gICAqXG4gICAqIEFwcGxpY2FibGUgb25seSBpZiB7QGxpbmsgbGlua1N0eWxlfSBpcyB7QGxpbmsgTGlua1N0eWxlLk1hcmtkb3dufS5cbiAgICpcbiAgICogSWYgYHRydWVgOiBgW2FsaWFzXSg8cGF0aCB3aXRoIHNwYWNlcy5tZD4pYC5cbiAgICpcbiAgICogSWYgYGZhbHNlYDogYFthbGlhc10ocGF0aCUyMHdpdGglMjBzcGFjZXMubWQpYC5cbiAgICpcbiAgICogQGRlZmF1bHQgYGZhbHNlYFxuICAgKi9cbiAgcmVhZG9ubHkgc2hvdWxkVXNlQW5nbGVCcmFja2V0cz86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIEluZGljYXRlcyBpZiB0aGUgbGluayBzaG91bGQgdXNlIGEgbGVhZGluZyBkb3QuXG4gICAqXG4gICAqIEFwcGxpY2FibGUgb25seSBpZiB7QGxpbmsgbGlua1BhdGhTdHlsZX0gaXMge0BsaW5rIExpbmtQYXRoU3R5bGUuUmVsYXRpdmVQYXRoVG9UaGVTb3VyY2V9LlxuICAgKlxuICAgKiBJZiBgdHJ1ZWA6IGBbWy4vcmVsYXRpdmUvcGF0aC90by90YXJnZXRdXWBcbiAgICpcbiAgICogSWYgYGZhbHNlYDogYFtbcmVsYXRpdmUvcGF0aC90by90YXJnZXRdXWBcbiAgICpcbiAgICogQGRlZmF1bHQgYGZhbHNlYFxuICAgKi9cbiAgcmVhZG9ubHkgc2hvdWxkVXNlTGVhZGluZ0RvdEZvclJlbGF0aXZlUGF0aHM/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBJbmRpY2F0ZXMgaWYgdGhlIGxpbmsgc2hvdWxkIHVzZSBhIGxlYWRpbmcgc2xhc2guXG4gICAqXG4gICAqIEFwcGxpY2FibGUgb25seSBpZiB7QGxpbmsgbGlua1BhdGhTdHlsZX0gaXMge0BsaW5rIExpbmtQYXRoU3R5bGUuQWJzb2x1dGVQYXRoSW5WYXVsdH0uXG4gICAqXG4gICAqIElmIGB0cnVlYDogYFtbL2Fic29sdXRlL3BhdGgvdG8vdGFyZ2V0XV1gXG4gICAqXG4gICAqIElmIGBmYWxzZWA6IGBbW2Fic29sdXRlL3BhdGgvdG8vdGFyZ2V0XV1gXG4gICAqXG4gICAqIEBkZWZhdWx0IGBmYWxzZWBcbiAgICovXG4gIHJlYWRvbmx5IHNob3VsZFVzZUxlYWRpbmdTbGFzaEZvckFic29sdXRlUGF0aHM/OiBib29sZWFuO1xufVxuXG4vKipcbiAqIFBhcmFtcyBmb3Ige0BsaW5rIHVwZGF0ZVJlZmVyZW5jZXNJbkZpbGV9LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFVwZGF0ZVJlZmVyZW5jZXNJbkZpbGVQYXJhbXMgZXh0ZW5kcyBQcm9jZXNzT3B0aW9ucyB7XG4gIC8qKlxuICAgKiBBbiBPYnNpZGlhbiBhcHAgaW5zdGFuY2UuXG4gICAqL1xuICByZWFkb25seSBhcHA6IEFwcDtcblxuICAvKipcbiAgICogV2hldGhlciB0byBhbGxvdyBhbiBlbXB0eSBhbGlhcyBmb3IgZW1iZWRzLlxuICAgKlxuICAgKiBBcHBsaWNhYmxlIG9ubHkgaWYgdGhlIHJlc3VsdCBsaW5rIHN0eWxlIGlzIHtAbGluayBMaW5rU3R5bGUuTWFya2Rvd259LlxuICAgKlxuICAgKiBJZiBgdHJ1ZWA6IGAhW10oZm9vLnBuZylgLlxuICAgKlxuICAgKiBJZiBgZmFsc2VgOiBgIVtmb29dKGZvby5wbmcpYC5cbiAgICpcbiAgICogQGRlZmF1bHQgYHRydWVgXG4gICAqL1xuICByZWFkb25seSBpc0VtcHR5RW1iZWRBbGlhc0FsbG93ZWQ/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBBIHN0eWxlIG9mIHRoZSBsaW5rIHBhdGguXG4gICAqL1xuICByZWFkb25seSBsaW5rUGF0aFN0eWxlPzogTGlua1BhdGhTdHlsZTtcblxuICAvKipcbiAgICogQSBzdHlsZSBvZiB0aGUgbGluay5cbiAgICovXG4gIHJlYWRvbmx5IGxpbmtTdHlsZT86IExpbmtTdHlsZTtcblxuICAvKipcbiAgICogRGVjaWRlcyB0aGUgc3R5bGUgb2Ygb25lIGxpbmssIG92ZXJyaWRpbmcge0BsaW5rIGxpbmtTdHlsZX0gZm9yIGl0LiBSZXR1cm5pbmcgYHVuZGVmaW5lZGAga2VlcHNcbiAgICoge0BsaW5rIGxpbmtTdHlsZX0uXG4gICAqXG4gICAqIFVzZSBpdCB3aGVuIG9uZSBzdHlsZSBmb3IgdGhlIHdob2xlIGZpbGUgaXMgd3JvbmcgZm9yIHNvbWUgb2YgaXRzIGxpbmtzLiBBIGNhbGxlciBmb3JjaW5nXG4gICAqIHtAbGluayBMaW5rU3R5bGUuTWFya2Rvd259IG92ZXIgYSBub3RlLCBmb3IgZXhhbXBsZSwga2VlcHMgYSBmcm9udG1hdHRlciB3aWtpbGluayBhIHdpa2lsaW5rLCBiZWNhdXNlXG4gICAqIE9ic2lkaWFuIHJlYWRzIGEgcHJvcGVydHkgdmFsdWUgYXMgYSBsaW5rIG9ubHkgaW4gdGhhdCBmb3JtLlxuICAgKlxuICAgKiBAZGVmYXVsdCBgdW5kZWZpbmVkYFxuICAgKi9cbiAgcmVhZG9ubHkgbGlua1N0eWxlUHJvdmlkZXI/OiAobGluazogUmVmZXJlbmNlKSA9PiBMaW5rU3R5bGUgfCB1bmRlZmluZWQ7XG5cbiAgLyoqXG4gICAqIEEgZmlsZSB0byB1cGRhdGUgdGhlIGxpbmtzIGluLlxuICAgKi9cbiAgcmVhZG9ubHkgbmV3U291cmNlUGF0aE9yRmlsZTogUGF0aE9yRmlsZTtcblxuICAvKipcbiAgICogQSByYW5nZSB3aXRoaW4gdGhlIGZpbGUncyBjb250ZW50LCBpbiBjaGFyYWN0ZXIgb2Zmc2V0cywgcmVzdHJpY3RpbmcgdGhlIHBhc3MgdG8gdGhlIGxpbmtzIGluc2lkZSBpdC5cbiAgICogV2hlbiBvbWl0dGVkLCBldmVyeSBsaW5rIGlzIHZpc2l0ZWQuXG4gICAqXG4gICAqIEEgbGluayBpcyB1cGRhdGVkIG9ubHkgd2hlbiBpdCBpcyAqKmZ1bGx5IGNvbnRhaW5lZCoqIGluIHRoZSByYW5nZTsgb25lIHRoYXQgbWVyZWx5IG92ZXJsYXBzIGl0IGlzIGxlZnRcbiAgICogYWxvbmUsIGJlY2F1c2UgcmV3cml0aW5nIHBhcnQgb2YgYSBsaW5rIGNvcnJ1cHRzIGl0LiBCb3RoIGJvdW5kcyBhcmUgaW5jbHVzaXZlLCBzbyBhIHJhbmdlIHdob3NlXG4gICAqIG9mZnNldHMgY29pbmNpZGUgZXhhY3RseSB3aXRoIGEgbGluaydzIGRvZXMgaW5jbHVkZSB0aGF0IGxpbmsuXG4gICAqXG4gICAqIEEgcmVmZXJlbmNlIHRoYXQgY2FycmllcyBubyBwb3NpdGlvbiB3aXRoaW4gdGhlIGZpbGUncyBjb250ZW50IOKAlCBhIGZyb250bWF0dGVyIGxpbmssIGEgbXVsdGktbGlua1xuICAgKiBmcm9udG1hdHRlciB2YWx1ZSBlbnRyeSwgb3IgYW55IGNhbnZhcyByZWZlcmVuY2Ug4oCUIGlzIG5ldmVyIGluIHJhbmdlIGFuZCBpcyBza2lwcGVkIHdoZW5ldmVyIGEgcmFuZ2UgaXNcbiAgICogc3VwcGxpZWQuXG4gICAqXG4gICAqIFRoZSBvZmZzZXRzIGFyZSBpbnRvIHRoZSBjb250ZW50IHRoaXMgZnVuY3Rpb24gcmVhZHMgZnJvbSB0aGUgdmF1bHQuIEJlZm9yZSByZWFkaW5nLCBpdCBzYXZlcyBhbnlcbiAgICogdW5zYXZlZCBlZGl0b3IgYnVmZmVyIGZvciB0aGUgZmlsZSwgc28gYSByYW5nZSB0YWtlbiBmcm9tIGFuIG9wZW4gZWRpdG9yIHZpYSBgRWRpdG9yLnBvc1RvT2Zmc2V0YCBpc1xuICAgKiB2YWxpZC4gVGhlIGNhbGxlciBvd25zIG9ubHkgdGhlIGNhc2Ugd2hlcmUgdGhlIGJ1ZmZlciBjaGFuZ2VzIGJldHdlZW4gY29tcHV0aW5nIHRoZSByYW5nZSBhbmQgdGhpc1xuICAgKiBjYWxsLlxuICAgKlxuICAgKiBAZGVmYXVsdCBgdW5kZWZpbmVkYFxuICAgKi9cbiAgcmVhZG9ubHkgb2Zmc2V0UmFuZ2U/OiBPZmZzZXRSYW5nZTtcblxuICAvKipcbiAgICogQW4gb2xkIHBhdGggb2YgdGhlIGZpbGUuXG4gICAqL1xuICByZWFkb25seSBvbGRTb3VyY2VQYXRoT3JGaWxlPzogUGF0aE9yRmlsZTtcblxuICAvKipcbiAgICogV2hldGhlciB0byBlc2NhcGUgdGhlIGFsaWFzLlxuICAgKlxuICAgKiBBcHBsaWNhYmxlIG9ubHkgaWYgdGhlIHJlc3VsdCBsaW5rIHN0eWxlIGlzIHtAbGluayBMaW5rU3R5bGUuTWFya2Rvd259LlxuICAgKlxuICAgKiBJZiBgdHJ1ZWA6IGBbXFwqXFwqYWxpYXNcXCpcXCpdKGxpbmsubWQpYC5cbiAgICpcbiAgICogSWYgYGZhbHNlYDogYFsqKmFsaWFzKipdKGxpbmsubWQpYC5cbiAgICpcbiAgICogQGRlZmF1bHQgYGZhbHNlYFxuICAgKi9cbiAgcmVhZG9ubHkgc2hvdWxkRXNjYXBlQWxpYXM/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRvIGluY2x1ZGUgdGhlIGF0dGFjaG1lbnQgZXh0ZW5zaW9uIGluIHRoZSBlbWJlZCBhbGlhcy5cbiAgICpcbiAgICogQXBwbGljYWJsZSBvbmx5IGlmIHtAbGluayBpc0VtcHR5RW1iZWRBbGlhc0FsbG93ZWR9IGlzIGBmYWxzZWAuXG4gICAqXG4gICAqIElmIGB0cnVlYDogYFtmb28ucG5nXShmb28ucG5nKWAuXG4gICAqXG4gICAqIElmIGBmYWxzZWA6IGBbZm9vXShmb28ucG5nKWAuXG4gICAqXG4gICAqIEBkZWZhdWx0IGBmYWxzZWBcbiAgICovXG4gIHJlYWRvbmx5IHNob3VsZEluY2x1ZGVBdHRhY2htZW50RXh0ZW5zaW9uVG9FbWJlZEFsaWFzPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogV2hldGhlciB0byBsZWF2ZSBldmVyeSBsaW5rIGluc2lkZSBhIGhlYWRpbmcgdW5jaGFuZ2VkOiBpdCBpcyBuZWl0aGVyIGNvbnZlcnRlZCBub3IgcmVzdHlsZWQsIHNvIGl0XG4gICAqIHN0YXlzIGJ5dGUtZm9yLWJ5dGUgYXMgd3JpdHRlbi4gQSBsaW5rIGluIGEgaGVhZGluZyBpcyBwYXJ0IG9mIHRoZSBoZWFkaW5nJ3MgdGV4dCwgc28gcmV3cml0aW5nIGl0XG4gICAqIGNoYW5nZXMgdGhhdCB0ZXh0IGFuZCBicmVha3MgZXZlcnkgYCNoZWFkaW5nYCBzdWJwYXRoIHBvaW50aW5nIGF0IHRoZSBoZWFkaW5nLiBTZWVcbiAgICoge0BsaW5rIGlzUmVmZXJlbmNlSW5IZWFkaW5nfS5cbiAgICpcbiAgICogQGRlZmF1bHQgYGZhbHNlYFxuICAgKi9cbiAgcmVhZG9ubHkgc2hvdWxkU2tpcFJlZmVyZW5jZXNJbkhlYWRpbmdzPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogV2hldGhlciB0byB1cGRhdGUgb25seSBlbWJlZGRlZCBsaW5rcy5cbiAgICovXG4gIHJlYWRvbmx5IHNob3VsZFVwZGF0ZUVtYmVkT25seUxpbmtzPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogV2hldGhlciB0byB1cGRhdGUgZmlsZSBuYW1lIGFsaWFzLlxuICAgKlxuICAgKiBAZGVmYXVsdCBgdHJ1ZWBcbiAgICovXG4gIHJlYWRvbmx5IHNob3VsZFVwZGF0ZUZpbGVOYW1lQWxpYXM/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBJbmRpY2F0ZXMgaWYgdGhlIGxpbmsgc2hvdWxkIHVzZSBhbmdsZSBicmFja2V0cy5cbiAgICpcbiAgICogQXBwbGljYWJsZSBvbmx5IGlmIHtAbGluayBsaW5rU3R5bGV9IGlzIHtAbGluayBMaW5rU3R5bGUuTWFya2Rvd259LlxuICAgKlxuICAgKiBJZiBgdHJ1ZWA6IGBbYWxpYXNdKDxwYXRoIHdpdGggc3BhY2VzLm1kPilgLlxuICAgKlxuICAgKiBJZiBgZmFsc2VgOiBgW2FsaWFzXShwYXRoJTIwd2l0aCUyMHNwYWNlcy5tZClgLlxuICAgKlxuICAgKiBAZGVmYXVsdCBgZmFsc2VgXG4gICAqL1xuICByZWFkb25seSBzaG91bGRVc2VBbmdsZUJyYWNrZXRzPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogSW5kaWNhdGVzIGlmIHRoZSBsaW5rIHNob3VsZCB1c2UgYSBsZWFkaW5nIGRvdC5cbiAgICpcbiAgICogQXBwbGljYWJsZSBvbmx5IGlmIHtAbGluayBsaW5rUGF0aFN0eWxlfSBpcyB7QGxpbmsgTGlua1BhdGhTdHlsZS5SZWxhdGl2ZVBhdGhUb1RoZVNvdXJjZX0uXG4gICAqXG4gICAqIElmIGB0cnVlYDogYFtbLi9yZWxhdGl2ZS9wYXRoL3RvL3RhcmdldF1dYFxuICAgKlxuICAgKiBJZiBgZmFsc2VgOiBgW1tyZWxhdGl2ZS9wYXRoL3RvL3RhcmdldF1dYFxuICAgKlxuICAgKiBAZGVmYXVsdCBgZmFsc2VgXG4gICAqL1xuICByZWFkb25seSBzaG91bGRVc2VMZWFkaW5nRG90Rm9yUmVsYXRpdmVQYXRocz86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIEluZGljYXRlcyBpZiB0aGUgbGluayBzaG91bGQgdXNlIGEgbGVhZGluZyBzbGFzaC5cbiAgICpcbiAgICogQXBwbGljYWJsZSBvbmx5IGlmIHtAbGluayBsaW5rUGF0aFN0eWxlfSBpcyB7QGxpbmsgTGlua1BhdGhTdHlsZS5BYnNvbHV0ZVBhdGhJblZhdWx0fS5cbiAgICpcbiAgICogSWYgYHRydWVgOiBgW1svYWJzb2x1dGUvcGF0aC90by90YXJnZXRdXWBcbiAgICpcbiAgICogSWYgYGZhbHNlYDogYFtbYWJzb2x1dGUvcGF0aC90by90YXJnZXRdXWBcbiAgICpcbiAgICogQGRlZmF1bHQgYGZhbHNlYFxuICAgKi9cbiAgcmVhZG9ubHkgc2hvdWxkVXNlTGVhZGluZ1NsYXNoRm9yQWJzb2x1dGVQYXRocz86IGJvb2xlYW47XG59XG5cbi8qKlxuICogUGFyYW1zIGZvciB7QGxpbmsgZ2VuZXJhdGVMaW5rVGV4dH0uXG4gKi9cbmludGVyZmFjZSBHZW5lcmF0ZUxpbmtUZXh0UGFyYW1zIHtcbiAgLyoqXG4gICAqIEFuIE9ic2lkaWFuIGFwcCBpbnN0YW5jZS5cbiAgICovXG4gIHJlYWRvbmx5IGFwcDogQXBwO1xuXG4gIC8qKlxuICAgKiBBIGNvbmZpZ3VyYXRpb24gb2YgdGhlIGxpbmsuXG4gICAqL1xuICByZWFkb25seSBjb25maWc6IExpbmtDb25maWc7XG5cbiAgLyoqXG4gICAqIEEgc291cmNlIHBhdGggb2YgdGhlIGxpbmsuXG4gICAqL1xuICByZWFkb25seSBzb3VyY2VQYXRoOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEEgc3VicGF0aCBvZiB0aGUgbGluay5cbiAgICovXG4gIHJlYWRvbmx5IHN1YnBhdGg6IHN0cmluZztcblxuICAvKipcbiAgICogQSB0YXJnZXQgZmlsZSBvZiB0aGUgbGluay5cbiAgICovXG4gIHJlYWRvbmx5IHRhcmdldEZpbGU6IFRGaWxlO1xufVxuXG4vKipcbiAqIFBhcmFtcyBmb3Ige0BsaW5rIGdlbmVyYXRlTWFya2Rvd25TdHlsZUxpbmt9LlxuICovXG5pbnRlcmZhY2UgR2VuZXJhdGVNYXJrZG93blN0eWxlTGlua1BhcmFtcyB7XG4gIC8qKlxuICAgKiBBIGNvbmZpZ3VyYXRpb24gb2YgdGhlIGxpbmsuXG4gICAqL1xuICByZWFkb25seSBjb25maWc6IExpbmtDb25maWc7XG5cbiAgLyoqXG4gICAqIEEgdGV4dCBvZiB0aGUgbGluay5cbiAgICovXG4gIHJlYWRvbmx5IGxpbmtUZXh0OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBwYXJhbXMgZm9yIGdlbmVyYXRpbmcgdGhlIG1hcmtkb3duIGxpbmsuXG4gICAqL1xuICByZWFkb25seSBtYXJrZG93bkxpbmtQYXJhbXM6IEdlbmVyYXRlTWFya2Rvd25MaW5rUGFyYW1zO1xuXG4gIC8qKlxuICAgKiBBIHRhcmdldCBmaWxlIG9mIHRoZSBsaW5rLlxuICAgKi9cbiAgcmVhZG9ubHkgdGFyZ2V0RmlsZTogVEZpbGU7XG59XG5cbi8qKlxuICogUGFyYW1zIGZvciB7QGxpbmsgZ2VuZXJhdGVXaWtpTGlua30uXG4gKi9cbmludGVyZmFjZSBHZW5lcmF0ZVdpa2lMaW5rUGFyYW1zIHtcbiAgLyoqXG4gICAqIEFuIGFsaWFzIG9mIHRoZSBsaW5rLlxuICAgKi9cbiAgcmVhZG9ubHkgYWxpYXM6IHN0cmluZyB8IHVuZGVmaW5lZDtcblxuICAvKipcbiAgICogV2hldGhlciB0aGUgbGluayBzaG91bGQgYmUgYW4gZW1iZWQgbGluay5cbiAgICovXG4gIHJlYWRvbmx5IGlzRW1iZWQ6IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIEEgdGV4dCBvZiB0aGUgbGluay5cbiAgICovXG4gIHJlYWRvbmx5IGxpbmtUZXh0OiBzdHJpbmc7XG59XG5cbi8qKlxuICogUGFyYW1zIGZvciB7QGxpbmsgZ2V0RmlsZUNoYW5nZXN9LlxuICovXG5pbnRlcmZhY2UgR2V0RmlsZUNoYW5nZXNQYXJhbXMge1xuICAvKipcbiAgICogQW4gYWJvcnQgc2lnbmFsIHRvIGNvbnRyb2wgdGhlIGV4ZWN1dGlvbiBvZiB0aGUgZnVuY3Rpb24uXG4gICAqL1xuICByZWFkb25seSBhYm9ydFNpZ25hbD86IEFib3J0U2lnbmFsO1xuXG4gIC8qKlxuICAgKiBBIG1ldGFkYXRhIGNhY2hlIHRvIGV4dHJhY3QgdGhlIGxpbmtzIGZyb20uXG4gICAqL1xuICByZWFkb25seSBjYWNoZTogQ2FjaGVkTWV0YWRhdGEgfCBudWxsO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRoZSBjYWNoZSBiZWxvbmdzIHRvIGEgY2FudmFzIGZpbGUuXG4gICAqL1xuICByZWFkb25seSBpc0NhbnZhc0ZpbGVDYWNoZTogYm9vbGVhbjtcblxuICAvKipcbiAgICogQSByYW5nZSB3aXRoaW4gdGhlIGNvbnRlbnQsIGluIGNoYXJhY3RlciBvZmZzZXRzLCByZXN0cmljdGluZyB0aGUgY2hhbmdlcyB0byB0aGUgbGlua3MgZnVsbHkgY29udGFpbmVkXG4gICAqIGluIGl0LiBXaGVuIG9taXR0ZWQsIGV2ZXJ5IGxpbmsgaXMgdmlzaXRlZC5cbiAgICpcbiAgICogQGRlZmF1bHQgYHVuZGVmaW5lZGBcbiAgICovXG4gIHJlYWRvbmx5IG9mZnNldFJhbmdlPzogT2Zmc2V0UmFuZ2U7XG5cbiAgLyoqXG4gICAqIEEgZnVuY3Rpb24gdGhhdCBjb252ZXJ0cyBlYWNoIGxpbmsuXG4gICAqL1xuICByZWFkb25seSByZWZlcmVuY2VDb252ZXJ0ZXI6IChsaW5rOiBSZWZlcmVuY2UsIGFib3J0U2lnbmFsOiBBYm9ydFNpZ25hbCkgPT4gUHJvbWlzYWJsZTxNYXliZVJldHVybjxzdHJpbmc+PjtcblxuICAvKipcbiAgICogV2hldGhlciB0byBpbmNsdWRlIGV4dGVybmFsIGxpbmtzIChwYXJzZWQgZnJvbSB0aGUgbm90ZSBib2R5KSBpbiB0aGUgY2hhbmdlcy5cbiAgICpcbiAgICogQGRlZmF1bHQgYGZhbHNlYFxuICAgKi9cbiAgcmVhZG9ubHkgc2hvdWxkSW5jbHVkZUV4dGVybmFsTGlua3M/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRvIGluY2x1ZGUgZXh0ZXJuYWwgbGlua3MgKHBhcnNlZCBmcm9tIGZyb250bWF0dGVyIHZhbHVlcykgaW4gdGhlIGNoYW5nZXMuXG4gICAqXG4gICAqIEBkZWZhdWx0IGBmYWxzZWBcbiAgICovXG4gIHJlYWRvbmx5IHNob3VsZEluY2x1ZGVGcm9udG1hdHRlckV4dGVybmFsTGlua3M/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRvIGluY2x1ZGUgZXh0ZXJuYWwgbGlua3MgKHBhcnNlZCBmcm9tIG11bHRpLWxpbmsgZnJvbnRtYXR0ZXIgdmFsdWVzKSBpbiB0aGUgY2hhbmdlcy5cbiAgICpcbiAgICogQGRlZmF1bHQgYGZhbHNlYFxuICAgKi9cbiAgcmVhZG9ubHkgc2hvdWxkSW5jbHVkZU11bHRpVmFsdWVGcm9udG1hdHRlckV4dGVybmFsTGlua3M/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRvIGxlYXZlIGV2ZXJ5IGxpbmsgaW5zaWRlIGEgaGVhZGluZyB1bmNoYW5nZWQsIHdpdGhvdXQgY2FsbGluZyB0aGUgY29udmVydGVyIGZvciBpdC5cbiAgICpcbiAgICogQGRlZmF1bHQgYGZhbHNlYFxuICAgKi9cbiAgcmVhZG9ubHkgc2hvdWxkU2tpcFJlZmVyZW5jZXNJbkhlYWRpbmdzPzogYm9vbGVhbjtcbn1cblxuaW50ZXJmYWNlIExpbmtDb25maWcge1xuICByZWFkb25seSBpc0VtYmVkOiBib29sZWFuO1xuICByZWFkb25seSBpc1NpbmdsZVN1YnBhdGhBbGxvd2VkOiBib29sZWFuO1xuICByZWFkb25seSBpc1dpa2lsaW5rOiBib29sZWFuO1xuICByZWFkb25seSBsaW5rUGF0aFN0eWxlOiBGaW5hbExpbmtQYXRoU3R5bGU7XG4gIHJlYWRvbmx5IHNob3VsZFVzZUFuZ2xlQnJhY2tldHM6IGJvb2xlYW47XG4gIHJlYWRvbmx5IHNob3VsZFVzZUxlYWRpbmdEb3RGb3JSZWxhdGl2ZVBhdGhzOiBib29sZWFuO1xuICByZWFkb25seSBzaG91bGRVc2VMZWFkaW5nU2xhc2hGb3JBYnNvbHV0ZVBhdGhzOiBib29sZWFuO1xufVxuXG4vKipcbiAqIFBhcmFtcyBmb3Ige0BsaW5rIHJlZnJlc2hGaWxlTmFtZUFsaWFzfS5cbiAqL1xuaW50ZXJmYWNlIFJlZnJlc2hGaWxlTmFtZUFsaWFzUGFyYW1zIHtcbiAgLyoqXG4gICAqIFRoZSBhbGlhcyB0aGUgbGluayBjYXJyaWVzLCBpZiBhbnkuXG4gICAqL1xuICByZWFkb25seSBhbGlhczogc3RyaW5nIHwgdW5kZWZpbmVkO1xuXG4gIC8qKlxuICAgKiBUaGUgT2JzaWRpYW4gYXBwIGluc3RhbmNlLlxuICAgKi9cbiAgcmVhZG9ubHkgYXBwOiBBcHA7XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgYW4gYWxpYXMgbWF5IGJlIGFkZGVkIHRvIGEgbGluayB0aGF0IGhhcyBub25lLlxuICAgKi9cbiAgcmVhZG9ubHkgY2FuQWRkQWxpYXM6IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFRoZSB0YXJnZXQgYWZ0ZXIgdGhlIHJlbmFtZS5cbiAgICovXG4gIHJlYWRvbmx5IG5ld1RhcmdldEZpbGU6IFRGaWxlO1xuXG4gIC8qKlxuICAgKiBUaGUgdGFyZ2V0J3MgcGF0aCBiZWZvcmUgdGhlIHJlbmFtZS5cbiAgICovXG4gIHJlYWRvbmx5IG9sZFRhcmdldFBhdGg6IHN0cmluZztcbn1cblxuLyoqXG4gKiBQYXJhbXMgZm9yIHtAbGluayByZXNvbHZlU25hcHNob3RSZWZlcmVuY2VJZGVudGl0eUtleVByb3ZpZGVyfS5cbiAqL1xuaW50ZXJmYWNlIFJlc29sdmVTbmFwc2hvdFJlZmVyZW5jZUlkZW50aXR5S2V5UHJvdmlkZXJQYXJhbXMge1xuICAvKipcbiAgICogVGhlIHB1YmxpYyBmdW5jdGlvbiBhc2tpbmcsIG5hbWVkIGluIHRoZSBlcnJvci5cbiAgICovXG4gIHJlYWRvbmx5IGNhbGxlck5hbWU6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIHByb3ZpZGVyIHRoZSBjYWxsZXIgcGFzc2VkLCBpZiBhbnkuXG4gICAqL1xuICByZWFkb25seSBleHBsaWNpdFJlZmVyZW5jZUlkZW50aXR5S2V5UHJvdmlkZXI6ICgobGluazogUmVmZXJlbmNlKSA9PiBzdHJpbmcpIHwgdW5kZWZpbmVkO1xuXG4gIC8qKlxuICAgKiBUaGUgc25hcHNob3Qgd2hvc2UgcmVjb3JkZWQgcHJvdmlkZXIgd2lucyB3aGVuIHRoZSBjYWxsZXIgcGFzc2VkIG5vbmUuXG4gICAqL1xuICByZWFkb25seSBzbmFwc2hvdDogQmFja2xpbmtzU25hcHNob3Q8dW5rbm93bj47XG59XG5cbi8qKlxuICogUGFyYW1zIGZvciB7QGxpbmsgc2hvdWxkVXNlV2lraWxpbmtTdHlsZX0uXG4gKi9cbmludGVyZmFjZSBTaG91bGRVc2VXaWtpbGlua1N0eWxlUGFyYW1zIHtcbiAgLyoqXG4gICAqIEFuIE9ic2lkaWFuIGFwcCBpbnN0YW5jZS5cbiAgICovXG4gIHJlYWRvbmx5IGFwcDogQXBwO1xuXG4gIC8qKlxuICAgKiBBIHN0eWxlIG9mIHRoZSBsaW5rLlxuICAgKi9cbiAgcmVhZG9ubHkgbGlua1N0eWxlPzogTGlua1N0eWxlO1xuXG4gIC8qKlxuICAgKiBBbiBvcmlnaW5hbCBsaW5rIHRleHQuXG4gICAqL1xuICByZWFkb25seSBvcmlnaW5hbExpbms/OiBzdHJpbmc7XG59XG5cbmludGVyZmFjZSBUYWJsZVBvc2l0aW9uIHtcbiAgcmVhZG9ubHkgZW5kOiBudW1iZXI7XG4gIHJlYWRvbmx5IHN0YXJ0OiBudW1iZXI7XG59XG5cbi8qKlxuICogUGFyYW1zIGZvciB7QGxpbmsgdXBkYXRlUmVmZXJlbmNlc0luQ29udGVudH0uXG4gKi9cbmludGVyZmFjZSBVcGRhdGVSZWZlcmVuY2VzSW5Db250ZW50UGFyYW1zIHtcbiAgLyoqXG4gICAqIEFuIE9ic2lkaWFuIGFwcCBpbnN0YW5jZS5cbiAgICovXG4gIHJlYWRvbmx5IGFwcDogQXBwO1xuXG4gIC8qKlxuICAgKiBBIGNvbnRlbnQgdG8gdXBkYXRlIHRoZSBsaW5rcyBpbi5cbiAgICovXG4gIHJlYWRvbmx5IGNvbnRlbnQ6IHN0cmluZztcblxuICAvKipcbiAgICogV2hldGhlciB0byBhbGxvdyBhbiBlbXB0eSBhbGlhcyBmb3IgZW1iZWRzLlxuICAgKlxuICAgKiBBcHBsaWNhYmxlIG9ubHkgaWYgdGhlIHJlc3VsdCBsaW5rIHN0eWxlIGlzIHtAbGluayBMaW5rU3R5bGUuTWFya2Rvd259LlxuICAgKlxuICAgKiBJZiBgdHJ1ZWA6IGAhW10oZm9vLnBuZylgLlxuICAgKlxuICAgKiBJZiBgZmFsc2VgOiBgIVtmb29dKGZvby5wbmcpYC5cbiAgICpcbiAgICogQGRlZmF1bHQgYHRydWVgXG4gICAqL1xuICByZWFkb25seSBpc0VtcHR5RW1iZWRBbGlhc0FsbG93ZWQ/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBBIHN0eWxlIG9mIHRoZSBsaW5rIHBhdGguXG4gICAqL1xuICByZWFkb25seSBsaW5rUGF0aFN0eWxlPzogTGlua1BhdGhTdHlsZTtcblxuICAvKipcbiAgICogQSBzdHlsZSBvZiB0aGUgbGluay5cbiAgICovXG4gIHJlYWRvbmx5IGxpbmtTdHlsZT86IExpbmtTdHlsZTtcblxuICAvKipcbiAgICogRGVjaWRlcyB0aGUgc3R5bGUgb2Ygb25lIGxpbmssIG92ZXJyaWRpbmcge0BsaW5rIGxpbmtTdHlsZX0gZm9yIGl0LiBSZXR1cm5pbmcgYHVuZGVmaW5lZGAga2VlcHNcbiAgICoge0BsaW5rIGxpbmtTdHlsZX0uXG4gICAqXG4gICAqIFVzZSBpdCB3aGVuIG9uZSBzdHlsZSBmb3IgdGhlIHdob2xlIGNvbnRlbnQgaXMgd3JvbmcgZm9yIHNvbWUgb2YgaXRzIGxpbmtzLiBBIGNhbGxlciBmb3JjaW5nXG4gICAqIHtAbGluayBMaW5rU3R5bGUuTWFya2Rvd259IG92ZXIgYSBub3RlLCBmb3IgZXhhbXBsZSwga2VlcHMgYSBmcm9udG1hdHRlciB3aWtpbGluayBhIHdpa2lsaW5rLCBiZWNhdXNlXG4gICAqIE9ic2lkaWFuIHJlYWRzIGEgcHJvcGVydHkgdmFsdWUgYXMgYSBsaW5rIG9ubHkgaW4gdGhhdCBmb3JtLlxuICAgKlxuICAgKiBAZGVmYXVsdCBgdW5kZWZpbmVkYFxuICAgKi9cbiAgcmVhZG9ubHkgbGlua1N0eWxlUHJvdmlkZXI/OiAobGluazogUmVmZXJlbmNlKSA9PiBMaW5rU3R5bGUgfCB1bmRlZmluZWQ7XG5cbiAgLyoqXG4gICAqIEEgbmV3IHNvdXJjZSBwYXRoIG9yIGZpbGUuXG4gICAqL1xuICByZWFkb25seSBuZXdTb3VyY2VQYXRoT3JGaWxlOiBQYXRoT3JGaWxlO1xuXG4gIC8qKlxuICAgKiBBIHJhbmdlIHdpdGhpbiB7QGxpbmsgVXBkYXRlUmVmZXJlbmNlc0luQ29udGVudFBhcmFtcy5jb250ZW50fSwgaW4gY2hhcmFjdGVyIG9mZnNldHMsIHJlc3RyaWN0aW5nIHRoZSBwYXNzXG4gICAqIHRvIHRoZSBsaW5rcyBpbnNpZGUgaXQuIFdoZW4gb21pdHRlZCwgZXZlcnkgbGluayBpcyB2aXNpdGVkLlxuICAgKlxuICAgKiBBIGxpbmsgaXMgdXBkYXRlZCBvbmx5IHdoZW4gaXQgaXMgKipmdWxseSBjb250YWluZWQqKiBpbiB0aGUgcmFuZ2U7IG9uZSB0aGF0IG1lcmVseSBvdmVybGFwcyBpdCBpcyBsZWZ0XG4gICAqIGFsb25lLCBiZWNhdXNlIHJld3JpdGluZyBwYXJ0IG9mIGEgbGluayBjb3JydXB0cyBpdC4gQm90aCBib3VuZHMgYXJlIGluY2x1c2l2ZSwgc28gYSByYW5nZSB3aG9zZVxuICAgKiBvZmZzZXRzIGNvaW5jaWRlIGV4YWN0bHkgd2l0aCBhIGxpbmsncyBkb2VzIGluY2x1ZGUgdGhhdCBsaW5rLlxuICAgKlxuICAgKiBBIHJlZmVyZW5jZSB0aGF0IGNhcnJpZXMgbm8gcG9zaXRpb24gd2l0aGluIHRoZSBjb250ZW50IOKAlCBhIGZyb250bWF0dGVyIGxpbmssIGEgbXVsdGktbGluayBmcm9udG1hdHRlclxuICAgKiB2YWx1ZSBlbnRyeSwgb3IgYW55IGNhbnZhcyByZWZlcmVuY2Ug4oCUIGlzIG5ldmVyIGluIHJhbmdlIGFuZCBpcyBza2lwcGVkIHdoZW5ldmVyIGEgcmFuZ2UgaXMgc3VwcGxpZWQuXG4gICAqXG4gICAqIEBkZWZhdWx0IGB1bmRlZmluZWRgXG4gICAqL1xuICByZWFkb25seSBvZmZzZXRSYW5nZT86IE9mZnNldFJhbmdlO1xuXG4gIC8qKlxuICAgKiBBbiBvbGQgc291cmNlIHBhdGggb3IgZmlsZS5cbiAgICovXG4gIHJlYWRvbmx5IG9sZFNvdXJjZVBhdGhPckZpbGU/OiBQYXRoT3JGaWxlO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRvIGVzY2FwZSB0aGUgYWxpYXMuXG4gICAqXG4gICAqIEFwcGxpY2FibGUgb25seSBpZiB0aGUgcmVzdWx0IGxpbmsgc3R5bGUgaXMge0BsaW5rIExpbmtTdHlsZS5NYXJrZG93bn0uXG4gICAqXG4gICAqIElmIGB0cnVlYDogYFtcXCpcXCphbGlhc1xcKlxcKl0obGluay5tZClgLlxuICAgKlxuICAgKiBJZiBgZmFsc2VgOiBgWyoqYWxpYXMqKl0obGluay5tZClgLlxuICAgKlxuICAgKiBAZGVmYXVsdCBgZmFsc2VgXG4gICAqL1xuICByZWFkb25seSBzaG91bGRFc2NhcGVBbGlhcz86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdG8gaW5jbHVkZSB0aGUgYXR0YWNobWVudCBleHRlbnNpb24gaW4gdGhlIGVtYmVkIGFsaWFzLlxuICAgKlxuICAgKiBBcHBsaWNhYmxlIG9ubHkgaWYge0BsaW5rIGlzRW1wdHlFbWJlZEFsaWFzQWxsb3dlZH0gaXMgYGZhbHNlYC5cbiAgICpcbiAgICogSWYgYHRydWVgOiBgW2Zvby5wbmddKGZvby5wbmcpYC5cbiAgICpcbiAgICogSWYgYGZhbHNlYDogYFtmb29dKGZvby5wbmcpYC5cbiAgICpcbiAgICogQGRlZmF1bHQgYGZhbHNlYFxuICAgKi9cbiAgcmVhZG9ubHkgc2hvdWxkSW5jbHVkZUF0dGFjaG1lbnRFeHRlbnNpb25Ub0VtYmVkQWxpYXM/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRvIGxlYXZlIGV2ZXJ5IGxpbmsgaW5zaWRlIGEgaGVhZGluZyB1bmNoYW5nZWQ6IGl0IGlzIG5laXRoZXIgY29udmVydGVkIG5vciByZXN0eWxlZCwgc28gaXRcbiAgICogc3RheXMgYnl0ZS1mb3ItYnl0ZSBhcyB3cml0dGVuLiBBIGxpbmsgaW4gYSBoZWFkaW5nIGlzIHBhcnQgb2YgdGhlIGhlYWRpbmcncyB0ZXh0LCBzbyByZXdyaXRpbmcgaXRcbiAgICogY2hhbmdlcyB0aGF0IHRleHQgYW5kIGJyZWFrcyBldmVyeSBgI2hlYWRpbmdgIHN1YnBhdGggcG9pbnRpbmcgYXQgdGhlIGhlYWRpbmcuIFNlZVxuICAgKiB7QGxpbmsgaXNSZWZlcmVuY2VJbkhlYWRpbmd9LlxuICAgKlxuICAgKiBAZGVmYXVsdCBgZmFsc2VgXG4gICAqL1xuICByZWFkb25seSBzaG91bGRTa2lwUmVmZXJlbmNlc0luSGVhZGluZ3M/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRvIHVwZGF0ZSBvbmx5IGVtYmVkZGVkIGxpbmtzLlxuICAgKi9cbiAgcmVhZG9ubHkgc2hvdWxkVXBkYXRlRW1iZWRPbmx5TGlua3M/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRvIHVwZGF0ZSBmaWxlIG5hbWUgYWxpYXMuXG4gICAqXG4gICAqIEBkZWZhdWx0IGB0cnVlYFxuICAgKi9cbiAgcmVhZG9ubHkgc2hvdWxkVXBkYXRlRmlsZU5hbWVBbGlhcz86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIEluZGljYXRlcyBpZiB0aGUgbGluayBzaG91bGQgdXNlIGFuZ2xlIGJyYWNrZXRzLlxuICAgKlxuICAgKiBBcHBsaWNhYmxlIG9ubHkgaWYge0BsaW5rIGxpbmtTdHlsZX0gaXMge0BsaW5rIExpbmtTdHlsZS5NYXJrZG93bn0uXG4gICAqXG4gICAqIElmIGB0cnVlYDogYFthbGlhc10oPHBhdGggd2l0aCBzcGFjZXMubWQ+KWAuXG4gICAqXG4gICAqIElmIGBmYWxzZWA6IGBbYWxpYXNdKHBhdGglMjB3aXRoJTIwc3BhY2VzLm1kKWAuXG4gICAqXG4gICAqIEBkZWZhdWx0IGBmYWxzZWBcbiAgICovXG4gIHJlYWRvbmx5IHNob3VsZFVzZUFuZ2xlQnJhY2tldHM/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBJbmRpY2F0ZXMgaWYgdGhlIGxpbmsgc2hvdWxkIHVzZSBhIGxlYWRpbmcgZG90LlxuICAgKlxuICAgKiBBcHBsaWNhYmxlIG9ubHkgaWYge0BsaW5rIGxpbmtQYXRoU3R5bGV9IGlzIHtAbGluayBMaW5rUGF0aFN0eWxlLlJlbGF0aXZlUGF0aFRvVGhlU291cmNlfS5cbiAgICpcbiAgICogSWYgYHRydWVgOiBgW1suL3JlbGF0aXZlL3BhdGgvdG8vdGFyZ2V0XV1gXG4gICAqXG4gICAqIElmIGBmYWxzZWA6IGBbW3JlbGF0aXZlL3BhdGgvdG8vdGFyZ2V0XV1gXG4gICAqXG4gICAqIEBkZWZhdWx0IGBmYWxzZWBcbiAgICovXG4gIHJlYWRvbmx5IHNob3VsZFVzZUxlYWRpbmdEb3RGb3JSZWxhdGl2ZVBhdGhzPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogSW5kaWNhdGVzIGlmIHRoZSBsaW5rIHNob3VsZCB1c2UgYSBsZWFkaW5nIHNsYXNoLlxuICAgKlxuICAgKiBBcHBsaWNhYmxlIG9ubHkgaWYge0BsaW5rIGxpbmtQYXRoU3R5bGV9IGlzIHtAbGluayBMaW5rUGF0aFN0eWxlLkFic29sdXRlUGF0aEluVmF1bHR9LlxuICAgKlxuICAgKiBJZiBgdHJ1ZWA6IGBbWy9hYnNvbHV0ZS9wYXRoL3RvL3RhcmdldF1dYFxuICAgKlxuICAgKiBJZiBgZmFsc2VgOiBgW1thYnNvbHV0ZS9wYXRoL3RvL3RhcmdldF1dYFxuICAgKlxuICAgKiBAZGVmYXVsdCBgZmFsc2VgXG4gICAqL1xuICByZWFkb25seSBzaG91bGRVc2VMZWFkaW5nU2xhc2hGb3JBYnNvbHV0ZVBhdGhzPzogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBSZWNvcmRzIGEgc2V0IG9mIGJhY2tsaW5rcyBpbnRvIGEgc25hcHNob3QgdGhhdCB7QGxpbmsgZWRpdEJhY2tsaW5rc1NuYXBzaG90fSBjYW4gcmV3cml0ZSBsYXRlci5cbiAqXG4gKiBDYWxsIGl0IG9uY2UgcGVyIHRhcmdldCBhbmQgcGFzcyB7QGxpbmsgQnVpbGRCYWNrbGlua3NTbmFwc2hvdFBhcmFtcy50YXJnZXR9IHRvIGFjY3VtdWxhdGUgc2V2ZXJhbCB0YXJnZXRzXG4gKiBpbnRvIG9uZSBzbmFwc2hvdCwgc28gdGhhdCBhIG5vdGUgbGlua2luZyB0byBzZXZlcmFsIG9mIHRoZW0gaXMgc3RpbGwgcmV3cml0dGVuIGV4YWN0bHkgb25jZS5cbiAqXG4gKiBAdHlwZVBhcmFtIFRQYXlsb2FkIC0gVGhlIHBheWxvYWQgcmVjb3JkZWQgZm9yIGVhY2ggbGluay5cbiAqIEBwYXJhbSBwYXJhbXMgLSBUaGUgcGFyYW1ldGVycyBmb3IgYnVpbGRpbmcgdGhlIHNuYXBzaG90LlxuICogQHJldHVybnMgVGhlIHNuYXBzaG90IOKAlCB7QGxpbmsgQnVpbGRCYWNrbGlua3NTbmFwc2hvdFBhcmFtcy50YXJnZXR9IGl0c2VsZiB3aGVuIG9uZSB3YXMgcGFzc2VkLlxuICovXG5leHBvcnQgZnVuY3Rpb24gYnVpbGRCYWNrbGlua3NTbmFwc2hvdDxUUGF5bG9hZD4ocGFyYW1zOiBCdWlsZEJhY2tsaW5rc1NuYXBzaG90UGFyYW1zPFRQYXlsb2FkPik6IE11dGFibGVCYWNrbGlua3NTbmFwc2hvdDxUUGF5bG9hZD4ge1xuICBjb25zdCB7XG4gICAgYmFja2xpbmtzLFxuICAgIHBhdGhSZW1hcHBlcixcbiAgICBwYXlsb2FkUHJvdmlkZXIsXG4gICAgcmVmZXJlbmNlSWRlbnRpdHlLZXlQcm92aWRlcjogZXhwbGljaXRSZWZlcmVuY2VJZGVudGl0eUtleVByb3ZpZGVyLFxuICAgIHRhcmdldFxuICB9ID0gcGFyYW1zO1xuXG4gIGNvbnN0IHNuYXBzaG90ID0gdGFyZ2V0ID8/IG5ldyBNYXA8c3RyaW5nLCBNYXA8c3RyaW5nLCBUUGF5bG9hZD4+KCk7XG4gIGNvbnN0IHJlZmVyZW5jZUlkZW50aXR5S2V5UHJvdmlkZXIgPSByZXNvbHZlU25hcHNob3RSZWZlcmVuY2VJZGVudGl0eUtleVByb3ZpZGVyKHtcbiAgICBjYWxsZXJOYW1lOiAnYnVpbGRCYWNrbGlua3NTbmFwc2hvdCcsXG4gICAgZXhwbGljaXRSZWZlcmVuY2VJZGVudGl0eUtleVByb3ZpZGVyLFxuICAgIHNuYXBzaG90XG4gIH0pO1xuICBzbmFwc2hvdFJlZmVyZW5jZUlkZW50aXR5S2V5UHJvdmlkZXJzLnNldChzbmFwc2hvdCwgcmVmZXJlbmNlSWRlbnRpdHlLZXlQcm92aWRlcik7XG5cbiAgZm9yIChjb25zdCBiYWNrbGlua1BhdGggb2YgYmFja2xpbmtzLmtleXMoKSkge1xuICAgIGNvbnN0IG5ld0JhY2tsaW5rUGF0aCA9IHBhdGhSZW1hcHBlcj8uKGJhY2tsaW5rUGF0aCkgPz8gYmFja2xpbmtQYXRoO1xuICAgIGxldCBwYXlsb2FkcyA9IHNuYXBzaG90LmdldChuZXdCYWNrbGlua1BhdGgpO1xuICAgIGlmICghcGF5bG9hZHMpIHtcbiAgICAgIHBheWxvYWRzID0gbmV3IE1hcDxzdHJpbmcsIFRQYXlsb2FkPigpO1xuICAgICAgc25hcHNob3Quc2V0KG5ld0JhY2tsaW5rUGF0aCwgcGF5bG9hZHMpO1xuICAgIH1cblxuICAgIC8qIHY4IGlnbm9yZSBuZXh0IC0tIEEga2V5IHlpZWxkZWQgYnkgYGtleXMoKWAgYWx3YXlzIHJlc29sdmVzOyB0aGUgYD8/IFtdYCBpcyBkZWZlbnNpdmUuICovXG4gICAgZm9yIChjb25zdCBsaW5rIG9mIGJhY2tsaW5rcy5nZXQoYmFja2xpbmtQYXRoKSA/PyBbXSkge1xuICAgICAgcGF5bG9hZHMuc2V0KHJlZmVyZW5jZUlkZW50aXR5S2V5UHJvdmlkZXIobGluayksIHBheWxvYWRQcm92aWRlcihsaW5rKSk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHNuYXBzaG90O1xufVxuXG4vKipcbiAqIENvbnZlcnRzIGEgbGluayB0byBhIG5ldyBwYXRoLlxuICpcbiAqIEBwYXJhbSBwYXJhbXMgLSBUaGUgcGFyYW1ldGVycyBmb3IgY29udmVydGluZyB0aGUgbGluay5cbiAqIEByZXR1cm5zIFRoZSBjb252ZXJ0ZWQgbGluay5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNvbnZlcnRMaW5rKHBhcmFtczogQ29udmVydExpbmtQYXJhbXMpOiBzdHJpbmcge1xuICBjb25zdCB0YXJnZXRGaWxlID0gZXh0cmFjdFJlZmVyZW5jZUZpbGUoe1xuICAgIGFwcDogcGFyYW1zLmFwcCxcbiAgICByZWZlcmVuY2U6IHBhcmFtcy5yZWZlcmVuY2UsXG4gICAgc291cmNlUGF0aE9yRmlsZTogcGFyYW1zLm9sZFNvdXJjZVBhdGhPckZpbGUgPz8gcGFyYW1zLm5ld1NvdXJjZVBhdGhPckZpbGVcbiAgfSk7XG4gIHJldHVybiB0YXJnZXRGaWxlXG4gICAgPyB1cGRhdGVMaW5rKG5vcm1hbGl6ZU9wdGlvbmFsUHJvcGVydGllczxVcGRhdGVMaW5rUGFyYW1zPih7XG4gICAgICBhcHA6IHBhcmFtcy5hcHAsXG4gICAgICBpc0VtcHR5RW1iZWRBbGlhc0FsbG93ZWQ6IHBhcmFtcy5pc0VtcHR5RW1iZWRBbGlhc0FsbG93ZWQsXG4gICAgICBsaW5rUGF0aFN0eWxlOiBwYXJhbXMubGlua1BhdGhTdHlsZSxcbiAgICAgIGxpbmtTdHlsZTogcGFyYW1zLmxpbmtTdHlsZSxcbiAgICAgIG5ld1NvdXJjZVBhdGhPckZpbGU6IHBhcmFtcy5uZXdTb3VyY2VQYXRoT3JGaWxlLFxuICAgICAgbmV3VGFyZ2V0UGF0aE9yRmlsZTogdGFyZ2V0RmlsZSxcbiAgICAgIG9sZFNvdXJjZVBhdGhPckZpbGU6IHBhcmFtcy5vbGRTb3VyY2VQYXRoT3JGaWxlLFxuICAgICAgcmVmZXJlbmNlOiBwYXJhbXMucmVmZXJlbmNlLFxuICAgICAgc2hvdWxkRXNjYXBlQWxpYXM6IHBhcmFtcy5zaG91bGRFc2NhcGVBbGlhcyxcbiAgICAgIHNob3VsZEluY2x1ZGVBdHRhY2htZW50RXh0ZW5zaW9uVG9FbWJlZEFsaWFzOiBwYXJhbXMuc2hvdWxkSW5jbHVkZUF0dGFjaG1lbnRFeHRlbnNpb25Ub0VtYmVkQWxpYXMsXG4gICAgICBzaG91bGRVcGRhdGVGaWxlTmFtZUFsaWFzOiBwYXJhbXMuc2hvdWxkVXBkYXRlRmlsZU5hbWVBbGlhcyxcbiAgICAgIHNob3VsZFVzZUFuZ2xlQnJhY2tldHM6IHBhcmFtcy5zaG91bGRVc2VBbmdsZUJyYWNrZXRzLFxuICAgICAgc2hvdWxkVXNlTGVhZGluZ0RvdEZvclJlbGF0aXZlUGF0aHM6IHBhcmFtcy5zaG91bGRVc2VMZWFkaW5nRG90Rm9yUmVsYXRpdmVQYXRocyxcbiAgICAgIHNob3VsZFVzZUxlYWRpbmdTbGFzaEZvckFic29sdXRlUGF0aHM6IHBhcmFtcy5zaG91bGRVc2VMZWFkaW5nU2xhc2hGb3JBYnNvbHV0ZVBhdGhzXG4gICAgfSkpXG4gICAgOiBnZXRSZWZlcmVuY2VMaW5rVGV4dChwYXJhbXMucmVmZXJlbmNlKTtcbn1cblxuLyoqXG4gKiBFZGl0cyB0aGUgYmFja2xpbmtzIGZvciBhIGZpbGUgb3IgcGF0aC5cbiAqXG4gKiBAcGFyYW0gcGFyYW1zIC0gVGhlIHBhcmFtZXRlcnMgZm9yIGVkaXRpbmcgdGhlIGJhY2tsaW5rcy5cbiAqIEByZXR1cm5zIEEge0BsaW5rIFByb21pc2V9IHRoYXQgcmVzb2x2ZXMgd2hlbiB0aGUgYmFja2xpbmtzIGhhdmUgYmVlbiBlZGl0ZWQuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBlZGl0QmFja2xpbmtzKHBhcmFtczogRWRpdEJhY2tsaW5rc1BhcmFtcyk6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCB7XG4gICAgYXBwLFxuICAgIGxpbmtVcGRhdGVQcm9ncmVzc1JlcG9ydGVyLFxuICAgIHBhdGhPckZpbGUsXG4gICAgcmVmZXJlbmNlQ29udmVydGVyLFxuICAgIC4uLm9wdGlvbnNcbiAgfSA9IHBhcmFtcztcbiAgY29uc3QgYmFja2xpbmtzID0gYXdhaXQgZ2V0QmFja2xpbmtzRm9yRmlsZVNhZmUoeyBhcHAsIHBhdGhPckZpbGUsIC4uLm9wdGlvbnMgfSk7XG4gIGNvbnN0IHNuYXBzaG90ID0gYnVpbGRCYWNrbGlua3NTbmFwc2hvdDx1bmRlZmluZWQ+KHtcbiAgICBiYWNrbGlua3MsXG4gICAgcGF5bG9hZFByb3ZpZGVyOiBnZXRVbmRlZmluZWRQYXlsb2FkXG4gIH0pO1xuICBhd2FpdCBlZGl0QmFja2xpbmtzU25hcHNob3Qobm9ybWFsaXplT3B0aW9uYWxQcm9wZXJ0aWVzPEVkaXRCYWNrbGlua3NTbmFwc2hvdFBhcmFtczx1bmRlZmluZWQ+Pih7XG4gICAgYXBwLFxuICAgIGxpbmtVcGRhdGVQcm9ncmVzc1JlcG9ydGVyLFxuICAgIHJlZmVyZW5jZUNvbnZlcnRlcjogKHsgcmVmZXJlbmNlIH0pID0+IHJlZmVyZW5jZUNvbnZlcnRlcihyZWZlcmVuY2UpLFxuICAgIHNuYXBzaG90LFxuICAgIC4uLm9wdGlvbnNcbiAgfSkpO1xufVxuXG4vKipcbiAqIEVkaXRzIGEgY2FwdHVyZWQgc25hcHNob3Qgb2YgYmFja2xpbmtzLCByZXdyaXRpbmcgZWFjaCBiYWNrbGluay1ob2xkaW5nIG5vdGUgZXhhY3RseSBvbmNlLlxuICpcbiAqIFRoZSBjb3VudGVycGFydCBvZiB7QGxpbmsgZWRpdEJhY2tsaW5rc30gZm9yIGNhbGxlcnMgdGhhdCBjYW5ub3QgZmV0Y2ggdGhlIGJhY2tsaW5rcyBhdCByZXdyaXRlIHRpbWUg4oCUXG4gKiBiZWNhdXNlIHRoZSByZW5hbWUgdGhhdCBpbnZhbGlkYXRlZCB0aGVtIGhhcyBhbHJlYWR5IGhhcHBlbmVkIOKAlCBvciB0aGF0IHJld3JpdGUgbGlua3MgdG8gc2V2ZXJhbCB0YXJnZXRzXG4gKiBhdCBvbmNlLiBTZWUge0BsaW5rIEJhY2tsaW5rc1NuYXBzaG90fSBmb3IgYm90aCBjYXNlcy5cbiAqXG4gKiBAdHlwZVBhcmFtIFRQYXlsb2FkIC0gVGhlIHBheWxvYWQgcmVjb3JkZWQgZm9yIGVhY2ggbGluayB3aGVuIHRoZSBzbmFwc2hvdCB3YXMgYnVpbHQuXG4gKiBAcGFyYW0gcGFyYW1zIC0gVGhlIHBhcmFtZXRlcnMgZm9yIGVkaXRpbmcgdGhlIGJhY2tsaW5rcy5cbiAqIEByZXR1cm5zIEEge0BsaW5rIFByb21pc2V9IHRoYXQgcmVzb2x2ZXMgd2hlbiB0aGUgYmFja2xpbmtzIGhhdmUgYmVlbiBlZGl0ZWQuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBlZGl0QmFja2xpbmtzU25hcHNob3Q8VFBheWxvYWQ+KHBhcmFtczogRWRpdEJhY2tsaW5rc1NuYXBzaG90UGFyYW1zPFRQYXlsb2FkPik6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCB7XG4gICAgYXBwLFxuICAgIGxpbmtVcGRhdGVQcm9ncmVzc1JlcG9ydGVyLFxuICAgIHJlZmVyZW5jZUNvbnZlcnRlcixcbiAgICByZWZlcmVuY2VJZGVudGl0eUtleVByb3ZpZGVyOiBleHBsaWNpdFJlZmVyZW5jZUlkZW50aXR5S2V5UHJvdmlkZXIsXG4gICAgc2hvdWxkVmlzaXRVbm1hdGNoZWRSZWZlcmVuY2VzID0gZmFsc2UsXG4gICAgc25hcHNob3QsXG4gICAgLi4ub3B0aW9uc1xuICB9ID0gcGFyYW1zO1xuICBjb25zdCByZWZlcmVuY2VJZGVudGl0eUtleVByb3ZpZGVyID0gcmVzb2x2ZVNuYXBzaG90UmVmZXJlbmNlSWRlbnRpdHlLZXlQcm92aWRlcih7XG4gICAgY2FsbGVyTmFtZTogJ2VkaXRCYWNrbGlua3NTbmFwc2hvdCcsXG4gICAgZXhwbGljaXRSZWZlcmVuY2VJZGVudGl0eUtleVByb3ZpZGVyLFxuICAgIHNuYXBzaG90XG4gIH0pO1xuXG4gIGNvbnN0IGJhY2tsaW5rTm90ZVBhdGhzID0gWy4uLnNuYXBzaG90LmtleXMoKV07XG4gIGxldCBwcm9jZXNzZWQgPSAwO1xuICBmb3IgKGNvbnN0IGJhY2tsaW5rTm90ZVBhdGggb2YgYmFja2xpbmtOb3RlUGF0aHMpIHtcbiAgICBjb25zdCBwYXlsb2FkcyA9IGVuc3VyZU5vbk51bGxhYmxlKHNuYXBzaG90LmdldChiYWNrbGlua05vdGVQYXRoKSk7XG4gICAgYXdhaXQgZWRpdFJlZmVyZW5jZXMoe1xuICAgICAgYXBwLFxuICAgICAgcGF0aE9yRmlsZTogYmFja2xpbmtOb3RlUGF0aCxcbiAgICAgIHJlZmVyZW5jZUNvbnZlcnRlcjogKGxpbmspID0+IHtcbiAgICAgICAgY29uc3QgcmVmZXJlbmNlSWRlbnRpdHlLZXkgPSByZWZlcmVuY2VJZGVudGl0eUtleVByb3ZpZGVyKGxpbmspO1xuICAgICAgICByZXR1cm4gIXBheWxvYWRzLmhhcyhyZWZlcmVuY2VJZGVudGl0eUtleSkgJiYgIXNob3VsZFZpc2l0VW5tYXRjaGVkUmVmZXJlbmNlc1xuICAgICAgICAgID8gdW5kZWZpbmVkXG4gICAgICAgICAgOiByZWZlcmVuY2VDb252ZXJ0ZXIoe1xuICAgICAgICAgICAgcGF5bG9hZDogcGF5bG9hZHMuZ2V0KHJlZmVyZW5jZUlkZW50aXR5S2V5KSxcbiAgICAgICAgICAgIHJlZmVyZW5jZTogbGluayxcbiAgICAgICAgICAgIHNvdXJjZVBhdGg6IGJhY2tsaW5rTm90ZVBhdGhcbiAgICAgICAgICB9KTtcbiAgICAgIH0sXG4gICAgICAuLi5vcHRpb25zXG4gICAgfSk7XG4gICAgcHJvY2Vzc2VkKys7XG4gICAgbGlua1VwZGF0ZVByb2dyZXNzUmVwb3J0ZXI/Lih7XG4gICAgICBjdXJyZW50UGF0aDogYmFja2xpbmtOb3RlUGF0aCxcbiAgICAgIHByb2Nlc3NlZCxcbiAgICAgIHRvdGFsOiBiYWNrbGlua05vdGVQYXRocy5sZW5ndGhcbiAgICB9KTtcbiAgfVxufVxuXG4vKipcbiAqIEVkaXRzIHRoZSBsaW5rcyBmb3IgYSBmaWxlIG9yIHBhdGguXG4gKlxuICogQHBhcmFtIHBhcmFtcyAtIFRoZSBwYXJhbWV0ZXJzIGZvciBlZGl0aW5nIHRoZSBsaW5rcy5cbiAqIEByZXR1cm5zIEEge0BsaW5rIFByb21pc2V9IHRoYXQgcmVzb2x2ZXMgd2hlbiB0aGUgbGlua3MgaGF2ZSBiZWVuIGVkaXRlZC5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGVkaXRSZWZlcmVuY2VzKHBhcmFtczogRWRpdFJlZmVyZW5jZXNQYXJhbXMpOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3Qge1xuICAgIGFwcCxcbiAgICBvZmZzZXRSYW5nZSxcbiAgICBwYXRoT3JGaWxlLFxuICAgIHJlZmVyZW5jZUNvbnZlcnRlcixcbiAgICBzaG91bGRFZGl0RXh0ZXJuYWxMaW5rcyA9IGZhbHNlLFxuICAgIHNob3VsZEVkaXRGcm9udG1hdHRlckV4dGVybmFsTGlua3MgPSBmYWxzZSxcbiAgICBzaG91bGRFZGl0TXVsdGlWYWx1ZUZyb250bWF0dGVyRXh0ZXJuYWxMaW5rcyA9IGZhbHNlLFxuICAgIHNob3VsZFNraXBSZWZlcmVuY2VzSW5IZWFkaW5ncyA9IGZhbHNlLFxuICAgIC4uLm9wdGlvbnNcbiAgfSA9IHBhcmFtcztcblxuICBpZiAob2Zmc2V0UmFuZ2UgIT09IHVuZGVmaW5lZCkge1xuICAgIHZhbGlkYXRlT2Zmc2V0UmFuZ2Uob2Zmc2V0UmFuZ2UpO1xuICB9XG5cbiAgYXdhaXQgYXBwbHlGaWxlQ2hhbmdlcyh7XG4gICAgYXBwLFxuICAgIGNoYW5nZXNQcm92aWRlcjogYXN5bmMgKHsgYWJvcnRTaWduYWwsIGNvbnRlbnQgfSkgPT4ge1xuICAgICAgY29uc3QgY2FjaGUgPSBhd2FpdCBnZXRDYWNoZVNhZmUoYXBwLCBwYXRoT3JGaWxlLCB7XG4gICAgICAgIHNob3VsZFBhcnNlRXh0ZXJuYWxMaW5rczogc2hvdWxkRWRpdEV4dGVybmFsTGlua3MsXG4gICAgICAgIHNob3VsZFBhcnNlRnJvbnRtYXR0ZXJFeHRlcm5hbExpbmtzOiBzaG91bGRFZGl0RnJvbnRtYXR0ZXJFeHRlcm5hbExpbmtzLFxuICAgICAgICBzaG91bGRQYXJzZU11bHRpVmFsdWVGcm9udG1hdHRlckV4dGVybmFsTGlua3M6IHNob3VsZEVkaXRNdWx0aVZhbHVlRnJvbnRtYXR0ZXJFeHRlcm5hbExpbmtzXG4gICAgICB9KTtcbiAgICAgIGFib3J0U2lnbmFsLnRocm93SWZBYm9ydGVkKCk7XG4gICAgICBjb25zdCBmaWxlID0gZ2V0RmlsZSh7IGFwcCwgcGF0aE9yRmlsZSB9KTtcbiAgICAgIGNvbnN0IGNhY2hlZENvbnRlbnQgPSBhd2FpdCBhcHAudmF1bHQuY2FjaGVkUmVhZChmaWxlKTtcbiAgICAgIGFib3J0U2lnbmFsLnRocm93SWZBYm9ydGVkKCk7XG4gICAgICByZXR1cm4gY29udGVudCA9PT0gY2FjaGVkQ29udGVudFxuICAgICAgICA/IChhd2FpdCBnZXRGaWxlQ2hhbmdlcyhub3JtYWxpemVPcHRpb25hbFByb3BlcnRpZXM8R2V0RmlsZUNoYW5nZXNQYXJhbXM+KHtcbiAgICAgICAgICBhYm9ydFNpZ25hbCxcbiAgICAgICAgICBjYWNoZSxcbiAgICAgICAgICBpc0NhbnZhc0ZpbGVDYWNoZTogaXNDYW52YXNGaWxlKHBhdGhPckZpbGUpLFxuICAgICAgICAgIG9mZnNldFJhbmdlLFxuICAgICAgICAgIHJlZmVyZW5jZUNvbnZlcnRlcixcbiAgICAgICAgICBzaG91bGRJbmNsdWRlRXh0ZXJuYWxMaW5rczogc2hvdWxkRWRpdEV4dGVybmFsTGlua3MsXG4gICAgICAgICAgc2hvdWxkSW5jbHVkZUZyb250bWF0dGVyRXh0ZXJuYWxMaW5rczogc2hvdWxkRWRpdEZyb250bWF0dGVyRXh0ZXJuYWxMaW5rcyxcbiAgICAgICAgICBzaG91bGRJbmNsdWRlTXVsdGlWYWx1ZUZyb250bWF0dGVyRXh0ZXJuYWxMaW5rczogc2hvdWxkRWRpdE11bHRpVmFsdWVGcm9udG1hdHRlckV4dGVybmFsTGlua3MsXG4gICAgICAgICAgc2hvdWxkU2tpcFJlZmVyZW5jZXNJbkhlYWRpbmdzXG4gICAgICAgIH0pKSlcbiAgICAgICAgOiBudWxsO1xuICAgIH0sXG4gICAgcGF0aE9yRmlsZSxcbiAgICAuLi5vcHRpb25zXG4gIH0pO1xufVxuXG4vKipcbiAqIEVkaXRzIHRoZSBsaW5rcyBpbiBhIGNvbnRlbnQgc3RyaW5nLlxuICpcbiAqIEBwYXJhbSBwYXJhbXMgLSBUaGUgcGFyYW1ldGVycyBmb3IgZWRpdGluZyB0aGUgbGlua3MgaW4gdGhlIGNvbnRlbnQuXG4gKiBAcmV0dXJucyBUaGUgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHRvIHRoZSB1cGRhdGVkIGNvbnRlbnQuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBlZGl0UmVmZXJlbmNlc0luQ29udGVudChwYXJhbXM6IEVkaXRSZWZlcmVuY2VzSW5Db250ZW50UGFyYW1zKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgY29uc3Qge1xuICAgIGFwcCxcbiAgICBjb250ZW50LFxuICAgIG9mZnNldFJhbmdlLFxuICAgIHJlZmVyZW5jZUNvbnZlcnRlcixcbiAgICBzaG91bGRFZGl0RXh0ZXJuYWxMaW5rcyA9IGZhbHNlLFxuICAgIHNob3VsZEVkaXRGcm9udG1hdHRlckV4dGVybmFsTGlua3MgPSBmYWxzZSxcbiAgICBzaG91bGRFZGl0TXVsdGlWYWx1ZUZyb250bWF0dGVyRXh0ZXJuYWxMaW5rcyA9IGZhbHNlLFxuICAgIHNob3VsZFNraXBSZWZlcmVuY2VzSW5IZWFkaW5ncyA9IGZhbHNlXG4gIH0gPSBwYXJhbXM7XG4gIGxldCB7IGFib3J0U2lnbmFsIH0gPSBwYXJhbXM7XG4gIGFib3J0U2lnbmFsID8/PSBhYm9ydFNpZ25hbE5ldmVyKCk7XG4gIGFib3J0U2lnbmFsLnRocm93SWZBYm9ydGVkKCk7XG5cbiAgaWYgKG9mZnNldFJhbmdlICE9PSB1bmRlZmluZWQpIHtcbiAgICB2YWxpZGF0ZU9mZnNldFJhbmdlKG9mZnNldFJhbmdlKTtcbiAgfVxuXG4gIGNvbnN0IG5ld0NvbnRlbnQgPSBhd2FpdCBhcHBseUNvbnRlbnRDaGFuZ2VzKHtcbiAgICBhYm9ydFNpZ25hbCxcbiAgICBjaGFuZ2VzUHJvdmlkZXI6IGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IGNhY2hlID0gYXdhaXQgcGFyc2VNZXRhZGF0YShhcHAsIGNvbnRlbnQsIHtcbiAgICAgICAgc2hvdWxkUGFyc2VFeHRlcm5hbExpbmtzOiBzaG91bGRFZGl0RXh0ZXJuYWxMaW5rcyxcbiAgICAgICAgc2hvdWxkUGFyc2VGcm9udG1hdHRlckV4dGVybmFsTGlua3M6IHNob3VsZEVkaXRGcm9udG1hdHRlckV4dGVybmFsTGlua3MsXG4gICAgICAgIHNob3VsZFBhcnNlTXVsdGlWYWx1ZUZyb250bWF0dGVyRXh0ZXJuYWxMaW5rczogc2hvdWxkRWRpdE11bHRpVmFsdWVGcm9udG1hdHRlckV4dGVybmFsTGlua3NcbiAgICAgIH0pO1xuICAgICAgYWJvcnRTaWduYWwudGhyb3dJZkFib3J0ZWQoKTtcbiAgICAgIGNvbnN0IGNoYW5nZXMgPSBhd2FpdCBnZXRGaWxlQ2hhbmdlcyhub3JtYWxpemVPcHRpb25hbFByb3BlcnRpZXM8R2V0RmlsZUNoYW5nZXNQYXJhbXM+KHtcbiAgICAgICAgYWJvcnRTaWduYWwsXG4gICAgICAgIGNhY2hlLFxuICAgICAgICBpc0NhbnZhc0ZpbGVDYWNoZTogZmFsc2UsXG4gICAgICAgIG9mZnNldFJhbmdlLFxuICAgICAgICByZWZlcmVuY2VDb252ZXJ0ZXIsXG4gICAgICAgIHNob3VsZEluY2x1ZGVFeHRlcm5hbExpbmtzOiBzaG91bGRFZGl0RXh0ZXJuYWxMaW5rcyxcbiAgICAgICAgc2hvdWxkSW5jbHVkZUZyb250bWF0dGVyRXh0ZXJuYWxMaW5rczogc2hvdWxkRWRpdEZyb250bWF0dGVyRXh0ZXJuYWxMaW5rcyxcbiAgICAgICAgc2hvdWxkSW5jbHVkZU11bHRpVmFsdWVGcm9udG1hdHRlckV4dGVybmFsTGlua3M6IHNob3VsZEVkaXRNdWx0aVZhbHVlRnJvbnRtYXR0ZXJFeHRlcm5hbExpbmtzLFxuICAgICAgICBzaG91bGRTa2lwUmVmZXJlbmNlc0luSGVhZGluZ3NcbiAgICAgIH0pKTtcbiAgICAgIGFib3J0U2lnbmFsLnRocm93SWZBYm9ydGVkKCk7XG4gICAgICByZXR1cm4gY2hhbmdlcztcbiAgICB9LFxuICAgIGNvbnRlbnQsXG4gICAgcGF0aDogJydcbiAgfSk7XG4gIGFib3J0U2lnbmFsLnRocm93SWZBYm9ydGVkKCk7XG5cbiAgYXNzZXJ0Tm9uTnVsbGFibGUobmV3Q29udGVudCwgJ0ZhaWxlZCB0byB1cGRhdGUgbGlua3MgaW4gY29udGVudCcpO1xuXG4gIHJldHVybiBuZXdDb250ZW50O1xufVxuXG4vKipcbiAqIEV4dHJhY3RzIHRoZSBmaWxlIGFzc29jaWF0ZWQgd2l0aCBhIGxpbmsuXG4gKlxuICogQHBhcmFtIHBhcmFtcyAtIFRoZSBwYXJhbWV0ZXJzIGZvciBleHRyYWN0aW5nIHRoZSBsaW5rIGZpbGUuXG4gKiBAcmV0dXJucyBUaGUgZmlsZSBhc3NvY2lhdGVkIHdpdGggdGhlIGxpbmssIG9yIGBudWxsYCBpZiBub3QgZm91bmQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBleHRyYWN0UmVmZXJlbmNlRmlsZShwYXJhbXM6IEV4dHJhY3RSZWZlcmVuY2VGaWxlUGFyYW1zKTogbnVsbCB8IFRGaWxlIHtcbiAgY29uc3Qge1xuICAgIGFwcCxcbiAgICByZWZlcmVuY2U6IGxpbmssXG4gICAgc2hvdWxkQWxsb3dOb25FeGlzdGluZ0ZpbGUgPSBmYWxzZSxcbiAgICBzb3VyY2VQYXRoT3JGaWxlXG4gIH0gPSBwYXJhbXM7XG4gIGNvbnN0IHsgbGlua1BhdGggfSA9IHNwbGl0U3VicGF0aChsaW5rLmxpbmspO1xuICBjb25zdCBzb3VyY2VQYXRoID0gZ2V0UGF0aChhcHAsIHNvdXJjZVBhdGhPckZpbGUpO1xuICBjb25zdCBmaWxlID0gYXBwLm1ldGFkYXRhQ2FjaGUuZ2V0Rmlyc3RMaW5rcGF0aERlc3QobGlua1BhdGgsIHNvdXJjZVBhdGgpO1xuICBpZiAoZmlsZSkge1xuICAgIHJldHVybiBmaWxlO1xuICB9XG5cbiAgaWYgKCFzaG91bGRBbGxvd05vbkV4aXN0aW5nRmlsZSkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgaWYgKGxpbmtQYXRoLnN0YXJ0c1dpdGgoJy8nKSkge1xuICAgIHJldHVybiBnZXRGaWxlKHsgYXBwLCBwYXRoT3JGaWxlOiBsaW5rUGF0aCwgc2hvdWxkSW5jbHVkZU5vbkV4aXN0aW5nOiB0cnVlIH0pO1xuICB9XG5cbiAgY29uc3QgZnVsbExpbmtQYXRoID0gam9pbihkaXJuYW1lKHNvdXJjZVBhdGgpLCBgLi8ke2xpbmtQYXRofWApO1xuXG4gIHJldHVybiBmdWxsTGlua1BhdGguc3RhcnRzV2l0aCgnLi4vJykgPyBudWxsIDogZ2V0RmlsZSh7IGFwcCwgcGF0aE9yRmlsZTogZnVsbExpbmtQYXRoLCBzaG91bGRJbmNsdWRlTm9uRXhpc3Rpbmc6IHRydWUgfSk7XG59XG5cbi8qKlxuICogR2VuZXJhdGVzIGEgbWFya2Rvd24gbGluayBiYXNlZCBvbiB0aGUgcHJvdmlkZWQgcGFyYW1ldGVycy5cbiAqXG4gKiBAcGFyYW0gcGFyYW1zIC0gVGhlIHBhcmFtZXRlcnMgZm9yIGdlbmVyYXRpbmcgdGhlIG1hcmtkb3duIGxpbmsuXG4gKiBAcmV0dXJucyBUaGUgZ2VuZXJhdGVkIG1hcmtkb3duIGxpbmsuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZW5lcmF0ZU1hcmtkb3duTGluayhwYXJhbXM6IEdlbmVyYXRlTWFya2Rvd25MaW5rUGFyYW1zKTogc3RyaW5nIHtcbiAgY29uc3QgeyBhcHAgfSA9IHBhcmFtcztcblxuICBjb25zdCBERUZBVUxUX1BBUkFNUzogUGFydGlhbDxHZW5lcmF0ZU1hcmtkb3duTGlua1BhcmFtcz4gPSB7XG4gICAgaXNFbXB0eUVtYmVkQWxpYXNBbGxvd2VkOiB0cnVlXG4gIH07XG5cbiAgY29uc3QgY3VzdG9tRGVmYXVsdFBhcmFtcyA9IGdldEdlbmVyYXRlTWFya2Rvd25MaW5rRGVmYXVsdFBhcmFtc0ZucygpLm1hcCgoZGVmYXVsdFBhcmFtc0Z1bmN0aW9uKSA9PiBkZWZhdWx0UGFyYW1zRnVuY3Rpb24oKSk7XG4gIC8vIFN0cmlwIGV4cGxpY2l0IGB1bmRlZmluZWRgcyBmaXJzdCwgb24gYSBjb3B5IHNvIHRoZSBjYWxsZXIncyBvYmplY3QgaXMgdW50b3VjaGVkLlxuICAvLyBBIGNhbGxlciBmb3J3YXJkaW5nIGV2ZXJ5IG9wdGlvbmFsIHBhcmFtIHNlbmRzIG93biBrZXlzIGhvbGRpbmcgYHVuZGVmaW5lZGAgZm9yIHRoZSBvbmVzIGl0IGRpZCBub3QgcmVjZWl2ZS5cbiAgLy8gVGhvc2UgYXJlIG5vdCByZW1vdmVkIGJ5IGBub3JtYWxpemVPcHRpb25hbFByb3BlcnRpZXNgLCB3aGljaCBpcyBhIHR5cGUtbGV2ZWwgbm8tb3AuXG4gIC8vIFdpdGhvdXQgdGhlIHN0cmlwLCBzdWNoIGEga2V5IG92ZXJ3cml0ZXMgYSBkZWZhdWx0IHdpdGggYHVuZGVmaW5lZGAgaW5zdGVhZCBvZiBmYWxsaW5nIHRocm91Z2ggdG8gaXQuXG4gIHBhcmFtcyA9IE9iamVjdC5hc3NpZ24oe30sIERFRkFVTFRfUEFSQU1TLCAuLi5jdXN0b21EZWZhdWx0UGFyYW1zLCByZW1vdmVVbmRlZmluZWRQcm9wZXJ0aWVzPEdlbmVyYXRlTWFya2Rvd25MaW5rUGFyYW1zPih7IC4uLnBhcmFtcyB9KSk7XG4gIGNvbnN0IHRhcmdldEZpbGUgPSBnZXRGaWxlKG5vcm1hbGl6ZU9wdGlvbmFsUHJvcGVydGllczxHZXRGaWxlUGFyYW1zPih7IGFwcCwgcGF0aE9yRmlsZTogcGFyYW1zLnRhcmdldFBhdGhPckZpbGUsIHNob3VsZEluY2x1ZGVOb25FeGlzdGluZzogcGFyYW1zLmlzTm9uRXhpc3RpbmdGaWxlQWxsb3dlZCB9KSk7XG5cbiAgdXNpbmcgX3JlZ2lzdHJhdGlvbiA9IHJlZ2lzdGVyRmlsZXMoYXBwLCBbdGFyZ2V0RmlsZV0pO1xuICByZXR1cm4gZ2VuZXJhdGVNYXJrZG93bkxpbmtJbXBsKHBhcmFtcyk7XG59XG5cbi8qKlxuICogR2VuZXJhdGVzIGEgcmF3IG1hcmtkb3duIGxpbmsgYmFzZWQgb24gdGhlIHByb3ZpZGVkIHBhcmFtcy5cbiAqXG4gKiBAcGFyYW0gcGFyYW1zIC0gVGhlIHBhcmFtZXRlcnMgZm9yIGdlbmVyYXRpbmcgYSByYXcgbWFya2Rvd24gbGluay5cbiAqIEByZXR1cm5zIEEgcmF3IG1hcmtkb3duIGxpbmsuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZW5lcmF0ZVJhd01hcmtkb3duTGluayhwYXJhbXM6IEdlbmVyYXRlUmF3TWFya2Rvd25MaW5rUGFyYW1zKTogc3RyaW5nIHtcbiAgY29uc3QgZW1iZWRQcmVmaXggPSBwYXJhbXMuaXNFbWJlZCA/ICchJyA6ICcnO1xuXG4gIGlmIChwYXJhbXMuaXNXaWtpbGluaykge1xuICAgIGNvbnN0IGFsaWFzUGFydCA9IHBhcmFtcy5hbGlhcyA/IGB8JHtwYXJhbXMuYWxpYXN9YCA6ICcnO1xuICAgIHJldHVybiBgJHtlbWJlZFByZWZpeH1bWyR7cGFyYW1zLnVybH0ke2FsaWFzUGFydH1dXWA7XG4gIH1cblxuICBjb25zdCBhbGlhcyA9IHBhcmFtcy5hbGlhcyA/PyAnJztcbiAgY29uc3Qgc2hvdWxkRXNjYXBlQWxpYXMgPSBwYXJhbXMuc2hvdWxkRXNjYXBlQWxpYXMgPz8gZmFsc2U7XG4gIGNvbnN0IGVzY2FwZWRBbGlhcyA9IHNob3VsZEVzY2FwZUFsaWFzID8gZXNjYXBlQWxpYXMoYWxpYXMpIDogYWxpYXM7XG5cbiAgY29uc3QgdXJsID0gcGFyYW1zLnNob3VsZFVzZUFuZ2xlQnJhY2tldHNcbiAgICA/IGA8JHtwYXJhbXMudXJsLnJlcGxhY2VBbGwoL1s8PlxcXFxcXHJcXG5dL2csIChjaGFyYWN0ZXIpID0+IGVuY29kZVVSSUNvbXBvbmVudChjaGFyYWN0ZXIpKX0+YFxuICAgIDogZW5jb2RlVXJsKHBhcmFtcy51cmwpO1xuXG4gIGNvbnN0IHRpdGxlUGFydCA9IHBhcmFtcy50aXRsZSA/IGAgJHtKU09OLnN0cmluZ2lmeShwYXJhbXMudGl0bGUpfWAgOiAnJztcblxuICByZXR1cm4gYCR7ZW1iZWRQcmVmaXh9WyR7ZXNjYXBlZEFsaWFzfV0oJHt1cmx9JHt0aXRsZVBhcnR9KWA7XG59XG5cbi8qKlxuICogUmV0dXJucyB0aGUgc2hhcmVkLCBtdXRhYmxlIGxpc3Qgb2YgZnVuY3Rpb25zIHRoYXQgcHJvdmlkZSBkZWZhdWx0IHBhcmFtcyBmb3Ige0BsaW5rIGdlbmVyYXRlTWFya2Rvd25MaW5rfS5cbiAqXG4gKiBFYWNoIGZ1bmN0aW9uIGlzIGludm9rZWQgb24gZXZlcnkge0BsaW5rIGdlbmVyYXRlTWFya2Rvd25MaW5rfSBjYWxsIGFuZCBpdHMgcmVzdWx0IGlzIG1lcmdlZCBpbnRvIHRoZSBwYXJhbXMgKGxhdGVyXG4gKiByZWdpc3RyYXRpb25zIHRha2UgcHJlY2VkZW5jZSBvdmVyIHRoZSBidWlsdC1pbiBkZWZhdWx0cywgYnV0IG5ldmVyIG92ZXIgZXhwbGljaXRseSBwYXNzZWQgcGFyYW1zKS4gUmVnaXN0ZXIgZW50cmllc1xuICogYnkgYWRkaW5nIGEgYEdlbmVyYXRlTWFya2Rvd25MaW5rRGVmYXVsdFBhcmFtc0NvbXBvbmVudGAgdG8gYSBjb21wb25lbnQgdHJlZSByYXRoZXIgdGhhbiBtdXRhdGluZyB0aGlzIGxpc3QgZGlyZWN0bHkuXG4gKlxuICogQHJldHVybnMgVGhlIG11dGFibGUgbGlzdCBvZiBkZWZhdWx0LXBhcmFtcyBmdW5jdGlvbnMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRHZW5lcmF0ZU1hcmtkb3duTGlua0RlZmF1bHRQYXJhbXNGbnMoKTogKCgpID0+IFBhcnRpYWw8R2VuZXJhdGVNYXJrZG93bkxpbmtQYXJhbXM+KVtdIHtcbiAgcmV0dXJuIGdldE9ic2lkaWFuTGliU3RhdGU8KCgpID0+IFBhcnRpYWw8R2VuZXJhdGVNYXJrZG93bkxpbmtQYXJhbXM+KVtdPignZ2VuZXJhdGVNYXJrZG93bkxpbmtEZWZhdWx0UGFyYW1zRm5zJywgW10pLnZhbHVlO1xufVxuXG4vKipcbiAqIFRlc3RzIHdoZXRoZXIgYSBsaW5rIHVzZXMgYW5nbGUgYnJhY2tldHMsIHBvc3NpYmx5IGVtYmVkOlxuICogYFt0aXRsZV0oPGxpbms+KWAsIGAhW3RpdGxlXSg8bGluaz4pYC5cbiAqXG4gKiBAcGFyYW0gbGluayAtIExpbmsgdG8gdGVzdFxuICogQHJldHVybnMgV2hldGhlciB0aGUgbGluayB1c2VzIGFuZ2xlIGJyYWNrZXRzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBoYXNBbmdsZUJyYWNrZXRzKGxpbms6IHN0cmluZyk6IGJvb2xlYW4ge1xuICBjb25zdCBwYXJzZUxpbmtSZXN1bHQgPSBwYXJzZUxpbmsobGluayk7XG4gIHJldHVybiBwYXJzZUxpbmtSZXN1bHQ/Lmhhc0FuZ2xlQnJhY2tldHMgPz8gZmFsc2U7XG59XG5cbi8qKlxuICogVGVzdHMgd2hldGhlciBhIGxpbmsgaXMgYW4gZW1iZWQgbGluazpcbiAqIGAhW1tsaW5rXV1gLCBgIVt0aXRsZV0obGluaylgLlxuICpcbiAqIEBwYXJhbSBsaW5rIC0gTGluayB0byB0ZXN0XG4gKiBAcmV0dXJucyBXaGV0aGVyIHRoZSBsaW5rIGlzIGFuIGVtYmVkIGxpbmtcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGhhc0VtYmVkU3ludGF4KGxpbms6IHN0cmluZyk6IGJvb2xlYW4ge1xuICBjb25zdCBwYXJzZUxpbmtSZXN1bHQgPSBwYXJzZUxpbmsobGluayk7XG4gIHJldHVybiBwYXJzZUxpbmtSZXN1bHQ/LmlzRW1iZWQgPz8gZmFsc2U7XG59XG5cbi8qKlxuICogVGVzdHMgd2hldGhlciBhIGxpbmsgaGFzIGEgbGVhZGluZyBkb3QsIHBvc3NpYmx5IGVtYmVkOlxuICogYFtbLi9saW5rXV1gLCBgW3RpdGxlXSguL2xpbmspYCwgYFt0aXRsZV0oPC4vbGluaz4pYCxcbiAqIGAhW1suL2xpbmtdXWAsIGAhW3RpdGxlXSguL2xpbmspYCwgYCFbdGl0bGVdKDwuL2xpbms+KWAuXG4gKlxuICogQHBhcmFtIGxpbmsgLSBMaW5rIHRvIHRlc3RcbiAqIEByZXR1cm5zIFdoZXRoZXIgdGhlIGxpbmsgaGFzIGEgbGVhZGluZyBkb3RcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGhhc0xlYWRpbmdEb3QobGluazogc3RyaW5nKTogYm9vbGVhbiB7XG4gIGNvbnN0IHBhcnNlTGlua1Jlc3VsdCA9IHBhcnNlTGluayhsaW5rKTtcbiAgcmV0dXJuIHBhcnNlTGlua1Jlc3VsdD8udXJsLnN0YXJ0c1dpdGgoJy4vJykgPz8gZmFsc2U7XG59XG5cbi8qKlxuICogVGVzdHMgd2hldGhlciBhIGxpbmsgaGFzIGEgbGVhZGluZyBzbGFzaCwgcG9zc2libHkgZW1iZWQ6XG4gKiBgW1svbGlua11dYCwgYFt0aXRsZV0oL2xpbmspYCwgYFt0aXRsZV0oPC9saW5rPilgLFxuICogYCFbWy9saW5rXV1gLCBgIVt0aXRsZV0oL2xpbmspYCwgYCFbdGl0bGVdKDwvbGluaz4pYC5cbiAqXG4gKiBAcGFyYW0gbGluayAtIExpbmsgdG8gdGVzdFxuICogQHJldHVybnMgV2hldGhlciB0aGUgbGluayBoYXMgYSBsZWFkaW5nIHNsYXNoXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBoYXNMZWFkaW5nU2xhc2gobGluazogc3RyaW5nKTogYm9vbGVhbiB7XG4gIGNvbnN0IHBhcnNlTGlua1Jlc3VsdCA9IHBhcnNlTGluayhsaW5rKTtcbiAgcmV0dXJuIHBhcnNlTGlua1Jlc3VsdD8udXJsLnN0YXJ0c1dpdGgoJy8nKSA/PyBmYWxzZTtcbn1cblxuLyoqXG4gKiBUZXN0cyB3aGV0aGVyIGEgbGluayBpcyBhIHdpa2lsaW5rLCBwb3NzaWJseSBlbWJlZDpcbiAqIGBbW2xpbmtdXWAsIGAhW1tsaW5rXV1gLlxuICpcbiAqIEBwYXJhbSBsaW5rIC0gTGluayB0byB0ZXN0XG4gKiBAcmV0dXJucyBXaGV0aGVyIHRoZSBsaW5rIGlzIGEgd2lraWxpbmtcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGhhc1dpa2lsaW5rU3ludGF4KGxpbms6IHN0cmluZyk6IGJvb2xlYW4ge1xuICBjb25zdCBwYXJzZUxpbmtSZXN1bHQgPSBwYXJzZUxpbmsobGluayk7XG4gIHJldHVybiBwYXJzZUxpbmtSZXN1bHQ/LmlzV2lraWxpbmsgPz8gZmFsc2U7XG59XG5cbi8qKlxuICogRGV0ZXJtaW5lcyBpZiB0aGUgYWxpYXMgb2YgYSBsaW5rIHNob3VsZCBiZSByZXNldC5cbiAqXG4gKiBAcGFyYW0gcGFyYW1zIC0gVGhlIHBhcmFtZXRlcnMgZm9yIGRldGVybWluaW5nIGlmIHRoZSBhbGlhcyBzaG91bGQgYmUgcmVzZXQuXG4gKiBAcmV0dXJucyBXaGV0aGVyIHRoZSBhbGlhcyBzaG91bGQgYmUgcmVzZXQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzaG91bGRSZXNldEFsaWFzKHBhcmFtczogU2hvdWxkUmVzZXRBbGlhc1BhcmFtcyk6IGJvb2xlYW4ge1xuICBjb25zdCB7XG4gICAgYXBwLFxuICAgIGRpc3BsYXlUZXh0LFxuICAgIGlzV2lraWxpbmssXG4gICAgbmV3U291cmNlUGF0aE9yRmlsZSxcbiAgICBvbGRTb3VyY2VQYXRoT3JGaWxlLFxuICAgIG9sZFRhcmdldFBhdGgsXG4gICAgdGFyZ2V0UGF0aE9yRmlsZVxuICB9ID0gcGFyYW1zO1xuICBpZiAoaXNXaWtpbGluayA9PT0gZmFsc2UpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBpZiAoIWRpc3BsYXlUZXh0KSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICBjb25zdCB0YXJnZXRGaWxlID0gZ2V0RmlsZSh7IGFwcCwgcGF0aE9yRmlsZTogdGFyZ2V0UGF0aE9yRmlsZSwgc2hvdWxkSW5jbHVkZU5vbkV4aXN0aW5nOiB0cnVlIH0pO1xuICBjb25zdCBuZXdTb3VyY2VQYXRoID0gZ2V0UGF0aChhcHAsIG5ld1NvdXJjZVBhdGhPckZpbGUpO1xuICBjb25zdCBvbGRTb3VyY2VQYXRoID0gZ2V0UGF0aChhcHAsIG9sZFNvdXJjZVBhdGhPckZpbGUgPz8gbmV3U291cmNlUGF0aE9yRmlsZSk7XG4gIGNvbnN0IG5ld1NvdXJjZUZvbGRlciA9IGRpcm5hbWUobmV3U291cmNlUGF0aCk7XG4gIGNvbnN0IG9sZFNvdXJjZUZvbGRlciA9IGRpcm5hbWUob2xkU291cmNlUGF0aCk7XG4gIGNvbnN0IGFsaWFzZXNUb1Jlc2V0ID0gbmV3IFNldDxzdHJpbmc+KCk7XG5cbiAgZm9yIChjb25zdCBwYXRoT3JGaWxlIG9mIFt0YXJnZXRGaWxlLnBhdGgsIG9sZFRhcmdldFBhdGhdKSB7XG4gICAgaWYgKCFwYXRoT3JGaWxlKSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICBjb25zdCBwYXRoID0gZ2V0UGF0aChhcHAsIHBhdGhPckZpbGUpO1xuICAgIGFsaWFzZXNUb1Jlc2V0LmFkZChwYXRoKTtcbiAgICBhbGlhc2VzVG9SZXNldC5hZGQoYmFzZW5hbWUocGF0aCkpO1xuICAgIGFsaWFzZXNUb1Jlc2V0LmFkZChyZWxhdGl2ZShuZXdTb3VyY2VGb2xkZXIsIHBhdGgpKTtcbiAgICBhbGlhc2VzVG9SZXNldC5hZGQocmVsYXRpdmUob2xkU291cmNlRm9sZGVyLCBwYXRoKSk7XG4gIH1cblxuICBmb3IgKGNvbnN0IHNvdXJjZVBhdGggb2YgW29sZFNvdXJjZVBhdGgsIG5ld1NvdXJjZVBhdGhdKSB7XG4gICAgYWxpYXNlc1RvUmVzZXQuYWRkKGFwcC5tZXRhZGF0YUNhY2hlLmZpbGVUb0xpbmt0ZXh0KHRhcmdldEZpbGUsIHNvdXJjZVBhdGgsIGZhbHNlKSk7XG4gIH1cblxuICBjb25zdCBjbGVhbkRpc3BsYXlUZXh0ID0gcmVwbGFjZUFsbCh7XG4gICAgJHN0cmluZzogbm9ybWFsaXplUGF0aChlbnN1cmVOb25OdWxsYWJsZShkaXNwbGF5VGV4dC5zcGxpdCgnID4gJywgMSlbMF0pKSxcbiAgICByZXBsYWNlcjogJycsXG4gICAgc2VhcmNoVmFsdWU6IC9eXFwuXFwvL2dcbiAgfSkudG9Mb3dlckNhc2UoKTtcblxuICBmb3IgKGNvbnN0IGFsaWFzIG9mIGFsaWFzZXNUb1Jlc2V0KSB7XG4gICAgaWYgKGFsaWFzLnRvTG93ZXJDYXNlKCkgPT09IGNsZWFuRGlzcGxheVRleHQpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIGNvbnN0IGZvbGRlciA9IGRpcm5hbWUoYWxpYXMpO1xuICAgIGNvbnN0IGJhc2UgPSBiYXNlbmFtZShhbGlhcywgZXh0bmFtZShhbGlhcykpO1xuICAgIGlmIChqb2luKGZvbGRlciwgYmFzZSkudG9Mb3dlckNhc2UoKSA9PT0gY2xlYW5EaXNwbGF5VGV4dCkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGZhbHNlO1xufVxuXG4vKipcbiAqIFNwbGl0cyBhIGxpbmsgaW50byBpdHMgbGluayBwYXRoIGFuZCBzdWJwYXRoLlxuICpcbiAqIEBwYXJhbSBsaW5rIC0gVGhlIGxpbmsgdG8gc3BsaXQuXG4gKiBAcmV0dXJucyBBbiBvYmplY3QgY29udGFpbmluZyB0aGUgbGluayBwYXRoIGFuZCBzdWJwYXRoLlxuICovXG5leHBvcnQgZnVuY3Rpb24gc3BsaXRTdWJwYXRoKGxpbms6IHN0cmluZyk6IFNwbGl0U3VicGF0aFJlc3VsdCB7XG4gIGNvbnN0IHBhcnNlZCA9IHBhcnNlTGlua3RleHQobm9ybWFsaXplU3RyaW5nKGxpbmspKTtcbiAgcmV0dXJuIHtcbiAgICBsaW5rUGF0aDogcGFyc2VkLnBhdGgsXG4gICAgc3VicGF0aDogcGFyc2VkLnN1YnBhdGhcbiAgfTtcbn1cblxuLyoqXG4gKiBOb3JtYWxpemVzIHRoZSBgZmlsZTovL2AgbGlua3MgaW4gYSBjb250ZW50IHN0cmluZyB0byBhIHByZXR0eSBmb3JtLCBjb252ZXJ0aW5nIGJhY2tzbGFzaGVzIHRvIGZvcndhcmRcbiAqIHNsYXNoZXMuIE90aGVyIGxpbmtzIGFyZSBsZWZ0IHVuY2hhbmdlZC5cbiAqXG4gKiBAcGFyYW0gcGFyYW1zIC0gVGhlIHBhcmFtZXRlcnMgZm9yIG5vcm1hbGl6aW5nIHRoZSBsaW5rcy5cbiAqIEByZXR1cm5zIEEge0BsaW5rIFByb21pc2V9IHRoYXQgcmVzb2x2ZXMgdG8gdGhlIGNvbnRlbnQgd2l0aCBub3JtYWxpemVkIGBmaWxlOi8vYCBsaW5rcy5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHVwZGF0ZUZpbGVVcmxMaW5rc0luQ29udGVudChwYXJhbXM6IFVwZGF0ZUZpbGVVcmxMaW5rc0luQ29udGVudFBhcmFtcyk6IFByb21pc2U8c3RyaW5nPiB7XG4gIGNvbnN0IHsgYXBwLCBjb250ZW50LCBvZmZzZXRSYW5nZSwgc2hvdWxkU2tpcFJlZmVyZW5jZXNJbkhlYWRpbmdzLCBzaG91bGRVc2VBbmdsZUJyYWNrZXRzID0gZmFsc2UgfSA9IHBhcmFtcztcbiAgcmV0dXJuIGF3YWl0IGVkaXRSZWZlcmVuY2VzSW5Db250ZW50KG5vcm1hbGl6ZU9wdGlvbmFsUHJvcGVydGllczxFZGl0UmVmZXJlbmNlc0luQ29udGVudFBhcmFtcz4oe1xuICAgIGFib3J0U2lnbmFsOiBwYXJhbXMuYWJvcnRTaWduYWwsXG4gICAgYXBwLFxuICAgIGNvbnRlbnQsXG4gICAgb2Zmc2V0UmFuZ2UsXG4gICAgcmVmZXJlbmNlQ29udmVydGVyOiAobGluaykgPT4gbm9ybWFsaXplRmlsZVVybExpbmsobGluaywgc2hvdWxkVXNlQW5nbGVCcmFja2V0cyksXG4gICAgc2hvdWxkRWRpdEV4dGVybmFsTGlua3M6IHRydWUsXG4gICAgc2hvdWxkRWRpdEZyb250bWF0dGVyRXh0ZXJuYWxMaW5rczogdHJ1ZSxcbiAgICBzaG91bGRFZGl0TXVsdGlWYWx1ZUZyb250bWF0dGVyRXh0ZXJuYWxMaW5rczogdHJ1ZSxcbiAgICBzaG91bGRTa2lwUmVmZXJlbmNlc0luSGVhZGluZ3NcbiAgfSkpO1xufVxuXG4vKipcbiAqIE5vcm1hbGl6ZXMgdGhlIGBmaWxlOi8vYCBsaW5rcyBpbiBhIGZpbGUgdG8gYSBwcmV0dHkgZm9ybSwgY29udmVydGluZyBiYWNrc2xhc2hlcyB0byBmb3J3YXJkIHNsYXNoZXMuXG4gKiBPdGhlciBsaW5rcyBhcmUgbGVmdCB1bmNoYW5nZWQuXG4gKlxuICogQHBhcmFtIHBhcmFtcyAtIFRoZSBwYXJhbWV0ZXJzIGZvciBub3JtYWxpemluZyB0aGUgbGlua3MuXG4gKiBAcmV0dXJucyBBIHtAbGluayBQcm9taXNlfSB0aGF0IHJlc29sdmVzIHdoZW4gdGhlIGxpbmtzIGFyZSBub3JtYWxpemVkLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gdXBkYXRlRmlsZVVybExpbmtzSW5GaWxlKHBhcmFtczogVXBkYXRlRmlsZVVybExpbmtzSW5GaWxlUGFyYW1zKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IHtcbiAgICBhcHAsXG4gICAgb2Zmc2V0UmFuZ2UsXG4gICAgcGF0aE9yRmlsZSxcbiAgICBzaG91bGRTa2lwUmVmZXJlbmNlc0luSGVhZGluZ3MsXG4gICAgc2hvdWxkVXNlQW5nbGVCcmFja2V0cyA9IGZhbHNlLFxuICAgIC4uLm9wdGlvbnNcbiAgfSA9IHBhcmFtcztcbiAgYXdhaXQgZWRpdFJlZmVyZW5jZXMobm9ybWFsaXplT3B0aW9uYWxQcm9wZXJ0aWVzPEVkaXRSZWZlcmVuY2VzUGFyYW1zPih7XG4gICAgYXBwLFxuICAgIC8vIEZvcndhcmRlZCBieSBuYW1lIHJhdGhlciB0aGFuIHRocm91Z2ggYG9wdGlvbnNgLCBzbyBhIGxhdGVyIHJlZmFjdG9yIGNhbm5vdCBkcm9wIGl0IHNpbGVudGx5LlxuICAgIG9mZnNldFJhbmdlLFxuICAgIHBhdGhPckZpbGUsXG4gICAgcmVmZXJlbmNlQ29udmVydGVyOiAobGluaykgPT4gbm9ybWFsaXplRmlsZVVybExpbmsobGluaywgc2hvdWxkVXNlQW5nbGVCcmFja2V0cyksXG4gICAgc2hvdWxkRWRpdEV4dGVybmFsTGlua3M6IHRydWUsXG4gICAgc2hvdWxkRWRpdEZyb250bWF0dGVyRXh0ZXJuYWxMaW5rczogdHJ1ZSxcbiAgICBzaG91bGRFZGl0TXVsdGlWYWx1ZUZyb250bWF0dGVyRXh0ZXJuYWxMaW5rczogdHJ1ZSxcbiAgICBzaG91bGRTa2lwUmVmZXJlbmNlc0luSGVhZGluZ3MsXG4gICAgLi4ub3B0aW9uc1xuICB9KSk7XG59XG5cbi8qKlxuICogVXBkYXRlcyBhIGxpbmsgYmFzZWQgb24gdGhlIHByb3ZpZGVkIHBhcmFtZXRlcnMuXG4gKlxuICogQHBhcmFtIHBhcmFtcyAtIFRoZSBwYXJhbWV0ZXJzIGZvciB1cGRhdGluZyB0aGUgbGluay5cbiAqIEByZXR1cm5zIFRoZSB1cGRhdGVkIGxpbmsuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB1cGRhdGVMaW5rKHBhcmFtczogVXBkYXRlTGlua1BhcmFtcyk6IHN0cmluZyB7XG4gIGNvbnN0IHtcbiAgICBhcHAsXG4gICAgaXNFbXB0eUVtYmVkQWxpYXNBbGxvd2VkLFxuICAgIGxpbmtQYXRoU3R5bGUsXG4gICAgbGlua1N0eWxlLFxuICAgIG5ld1NvdXJjZVBhdGhPckZpbGUsXG4gICAgbmV3VGFyZ2V0UGF0aE9yRmlsZSxcbiAgICBvbGRTb3VyY2VQYXRoT3JGaWxlLFxuICAgIG9sZFRhcmdldFBhdGhPckZpbGUsXG4gICAgcmVmZXJlbmNlOiBsaW5rLFxuICAgIHNob3VsZEVzY2FwZUFsaWFzLFxuICAgIHNob3VsZEluY2x1ZGVBdHRhY2htZW50RXh0ZW5zaW9uVG9FbWJlZEFsaWFzLFxuICAgIHNob3VsZFVwZGF0ZUZpbGVOYW1lQWxpYXMgPSB0cnVlLFxuICAgIHNob3VsZFVzZUFuZ2xlQnJhY2tldHMsXG4gICAgc2hvdWxkVXNlTGVhZGluZ0RvdEZvclJlbGF0aXZlUGF0aHMsXG4gICAgc2hvdWxkVXNlTGVhZGluZ1NsYXNoRm9yQWJzb2x1dGVQYXRoc1xuICB9ID0gcGFyYW1zO1xuICBjb25zdCBvcmlnaW5hbExpbmtUZXh0ID0gZ2V0UmVmZXJlbmNlTGlua1RleHQobGluayk7XG4gIGlmICghbmV3VGFyZ2V0UGF0aE9yRmlsZSkge1xuICAgIHJldHVybiBvcmlnaW5hbExpbmtUZXh0O1xuICB9XG4gIGNvbnN0IG5ld1RhcmdldEZpbGUgPSBnZXRGaWxlKHsgYXBwLCBwYXRoT3JGaWxlOiBuZXdUYXJnZXRQYXRoT3JGaWxlLCBzaG91bGRJbmNsdWRlTm9uRXhpc3Rpbmc6IHRydWUgfSk7XG4gIGNvbnN0IG9sZFNvdXJjZVBhdGggPSBnZXRQYXRoKGFwcCwgb2xkU291cmNlUGF0aE9yRmlsZSA/PyBuZXdTb3VyY2VQYXRoT3JGaWxlKTtcbiAgY29uc3Qgb2xkVGFyZ2V0UGF0aCA9IGdldFBhdGgoYXBwLCBvbGRUYXJnZXRQYXRoT3JGaWxlID8/IG5ld1RhcmdldFBhdGhPckZpbGUpO1xuICBjb25zdCBpc1dpa2lsaW5rID0gc2hvdWxkVXNlV2lraWxpbmtTdHlsZShub3JtYWxpemVPcHRpb25hbFByb3BlcnRpZXM8U2hvdWxkVXNlV2lraWxpbmtTdHlsZVBhcmFtcz4oe1xuICAgIGFwcCxcbiAgICBsaW5rU3R5bGUsXG4gICAgb3JpZ2luYWxMaW5rOiBvcmlnaW5hbExpbmtUZXh0XG4gIH0pKTtcblxuICBjb25zdCB7IHN1YnBhdGggfSA9IHNwbGl0U3VicGF0aChsaW5rLmxpbmspO1xuXG4gIC8qIHY4IGlnbm9yZSBzdGFydCAtLSBDYW52YXMgZmlsZSBub2RlIHJlZmVyZW5jZSBicmFuY2ggaXMgaGFyZCB0byByZXByb2R1Y2UgaW4gdW5pdCB0ZXN0cy4gKi9cbiAgaWYgKGlzQ2FudmFzRmlsZShuZXdTb3VyY2VQYXRoT3JGaWxlKSAmJiBpc0NhbnZhc0ZpbGVOb2RlUmVmZXJlbmNlKGxpbmspKSB7XG4gICAgcmV0dXJuIG5ld1RhcmdldEZpbGUucGF0aCArIHN1YnBhdGg7XG5cbiAgICAvKiB2OCBpZ25vcmUgc3RvcCAqL1xuICB9XG5cbiAgY29uc3QgcGFyc2VMaW5rUmVzdWx0ID0gcGFyc2VMaW5rKG9yaWdpbmFsTGlua1RleHQpO1xuICBsZXQgYWxpYXM6IHN0cmluZyB8IHVuZGVmaW5lZDtcblxuICBpZiAoaXNXaWtpbGluayAmJiBwYXJzZUxpbmtSZXN1bHQ/LmFsaWFzKSB7XG4gICAgYWxpYXMgPSBwYXJzZUxpbmtSZXN1bHQuYWxpYXM7XG4gIH1cblxuICBhbGlhcyA/Pz0gc2hvdWxkUmVzZXRBbGlhcyhub3JtYWxpemVPcHRpb25hbFByb3BlcnRpZXM8U2hvdWxkUmVzZXRBbGlhc1BhcmFtcz4oe1xuICAgICAgYXBwLFxuICAgICAgZGlzcGxheVRleHQ6IGxpbmsuZGlzcGxheVRleHQsXG4gICAgICBpc1dpa2lsaW5rLFxuICAgICAgbmV3U291cmNlUGF0aE9yRmlsZSxcbiAgICAgIG9sZFNvdXJjZVBhdGhPckZpbGUsXG4gICAgICBvbGRUYXJnZXRQYXRoLFxuICAgICAgdGFyZ2V0UGF0aE9yRmlsZTogbmV3VGFyZ2V0RmlsZVxuICAgIH0pKVxuICAgID8gdW5kZWZpbmVkXG4gICAgOiBwYXJzZUxpbmtSZXN1bHQ/LmFsaWFzO1xuXG4gIC8vIFJlZnJlc2ggYSBmaWxlLW5hbWUgYWxpYXMgdG8gdGhlIG5ldyBkaXNwbGF5IG5hbWUgd2hlbiB0aGUgZmxhZyBpcyBzZXQuXG4gIC8vIEEgZmlsZS1uYW1lIGFsaWFzIGVxdWFscyB0aGUgT0xEIGJhc2UgbmFtZSAod2l0aCBvciB3aXRob3V0IGV4dGVuc2lvbik7IGEgY3VzdG9tIGFsaWFzIGlzIGtlcHQuXG4gIC8vIEdhdGluZyBvbiB0aGUgZmxhZyBhbHNvIHJlZnJlc2hlcyB3aWtpbGlua3MgdGhhdCBjYXJyeSBhbiBleHBsaWNpdCBhbGlhcy5cbiAgLy8gVGhvc2UgcHJldmlvdXNseSBzaG9ydC1jaXJjdWl0ZWQgdGhlIHJlZnJlc2ggYW5kIGtlcHQgdGhlIHN0YWxlIG9sZCBiYXNlIG5hbWUuXG4gIC8vIFRoZSBkaXNwbGF5IG5hbWUgb2YgYSBmb2xkZXIgbm90ZSBpcyBpdHMgZm9sZGVyJ3MgbmFtZSwgc28gYGNoYXJsaWUubWRgIGJlY29taW5nIGBjaGFybGllLyEubWRgIGtlZXBzIGBjaGFybGllYC5cbiAgaWYgKHNob3VsZFVwZGF0ZUZpbGVOYW1lQWxpYXMpIHtcbiAgICBhbGlhcyA9IHJlZnJlc2hGaWxlTmFtZUFsaWFzKHtcbiAgICAgIGFsaWFzLFxuICAgICAgYXBwLFxuICAgICAgY2FuQWRkQWxpYXM6IGlzV2lraWxpbmsgJiYgIXN1YnBhdGggJiYgIWhhc0VtYmVkU3ludGF4KG9yaWdpbmFsTGlua1RleHQpLFxuICAgICAgbmV3VGFyZ2V0RmlsZSxcbiAgICAgIG9sZFRhcmdldFBhdGhcbiAgICB9KTtcbiAgfVxuXG4gIGNvbnN0IG5ld0xpbmsgPSBnZW5lcmF0ZU1hcmtkb3duTGluayhub3JtYWxpemVPcHRpb25hbFByb3BlcnRpZXM8R2VuZXJhdGVNYXJrZG93bkxpbmtQYXJhbXM+KHtcbiAgICBhbGlhcyxcbiAgICBhcHAsXG4gICAgaXNFbXB0eUVtYmVkQWxpYXNBbGxvd2VkLFxuICAgIGlzU2luZ2xlU3VicGF0aEFsbG93ZWQ6IG9sZFNvdXJjZVBhdGggPT09IG9sZFRhcmdldFBhdGggJiYgISFwYXJzZUxpbmtSZXN1bHQ/LmFsaWFzLFxuICAgIGxpbmtQYXRoU3R5bGUsXG4gICAgbGlua1N0eWxlLFxuICAgIG9yaWdpbmFsTGluazogb3JpZ2luYWxMaW5rVGV4dCxcbiAgICBzaG91bGRFc2NhcGVBbGlhcyxcbiAgICBzaG91bGRJbmNsdWRlQXR0YWNobWVudEV4dGVuc2lvblRvRW1iZWRBbGlhcyxcbiAgICBzaG91bGRVc2VBbmdsZUJyYWNrZXRzLFxuICAgIHNob3VsZFVzZUxlYWRpbmdEb3RGb3JSZWxhdGl2ZVBhdGhzLFxuICAgIHNob3VsZFVzZUxlYWRpbmdTbGFzaEZvckFic29sdXRlUGF0aHMsXG4gICAgc291cmNlUGF0aE9yRmlsZTogbmV3U291cmNlUGF0aE9yRmlsZSxcbiAgICBzdWJwYXRoLFxuICAgIHRhcmdldFBhdGhPckZpbGU6IG5ld1RhcmdldEZpbGVcbiAgfSkpO1xuICByZXR1cm4gbmV3TGluaztcbn1cblxuLyoqXG4gKiBVcGRhdGVzIHRoZSBsaW5rcyBpbiBhIGNvbnRlbnQgc3RyaW5nIGJhc2VkIG9uIHRoZSBwcm92aWRlZCBwYXJhbWV0ZXJzLlxuICpcbiAqIEBwYXJhbSBwYXJhbXMgLSBUaGUgcGFyYW1ldGVycyBmb3IgdXBkYXRpbmcgdGhlIGxpbmtzLlxuICogQHJldHVybnMgQSB7QGxpbmsgUHJvbWlzZX0gdGhhdCByZXNvbHZlcyB0byB0aGUgY29udGVudCB3aXRoIHVwZGF0ZWQgbGlua3MuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiB1cGRhdGVSZWZlcmVuY2VzSW5Db250ZW50KHBhcmFtczogVXBkYXRlUmVmZXJlbmNlc0luQ29udGVudFBhcmFtcyk6IFByb21pc2U8c3RyaW5nPiB7XG4gIGNvbnN0IHtcbiAgICBhcHAsXG4gICAgY29udGVudCxcbiAgICBpc0VtcHR5RW1iZWRBbGlhc0FsbG93ZWQsXG4gICAgbGlua1BhdGhTdHlsZSxcbiAgICBsaW5rU3R5bGUsXG4gICAgbGlua1N0eWxlUHJvdmlkZXIsXG4gICAgbmV3U291cmNlUGF0aE9yRmlsZSxcbiAgICBvZmZzZXRSYW5nZSxcbiAgICBvbGRTb3VyY2VQYXRoT3JGaWxlLFxuICAgIHNob3VsZEVzY2FwZUFsaWFzLFxuICAgIHNob3VsZEluY2x1ZGVBdHRhY2htZW50RXh0ZW5zaW9uVG9FbWJlZEFsaWFzLFxuICAgIHNob3VsZFNraXBSZWZlcmVuY2VzSW5IZWFkaW5ncyxcbiAgICBzaG91bGRVcGRhdGVFbWJlZE9ubHlMaW5rcyxcbiAgICBzaG91bGRVcGRhdGVGaWxlTmFtZUFsaWFzLFxuICAgIHNob3VsZFVzZUFuZ2xlQnJhY2tldHMsXG4gICAgc2hvdWxkVXNlTGVhZGluZ0RvdEZvclJlbGF0aXZlUGF0aHMsXG4gICAgc2hvdWxkVXNlTGVhZGluZ1NsYXNoRm9yQWJzb2x1dGVQYXRoc1xuICB9ID0gcGFyYW1zO1xuXG4gIHJldHVybiBhd2FpdCBlZGl0UmVmZXJlbmNlc0luQ29udGVudChub3JtYWxpemVPcHRpb25hbFByb3BlcnRpZXM8RWRpdFJlZmVyZW5jZXNJbkNvbnRlbnRQYXJhbXM+KHtcbiAgICBhcHAsXG4gICAgY29udGVudCxcbiAgICBvZmZzZXRSYW5nZSxcbiAgICByZWZlcmVuY2VDb252ZXJ0ZXI6IChsaW5rKSA9PiB7XG4gICAgICBjb25zdCBpc0VtYmVkTGluayA9IGhhc0VtYmVkU3ludGF4KGdldFJlZmVyZW5jZUxpbmtUZXh0KGxpbmspKTtcbiAgICAgIHJldHVybiBzaG91bGRVcGRhdGVFbWJlZE9ubHlMaW5rcyAhPT0gdW5kZWZpbmVkICYmIHNob3VsZFVwZGF0ZUVtYmVkT25seUxpbmtzICE9PSBpc0VtYmVkTGlua1xuICAgICAgICA/IHVuZGVmaW5lZFxuICAgICAgICA6IGNvbnZlcnRMaW5rKG5vcm1hbGl6ZU9wdGlvbmFsUHJvcGVydGllczxDb252ZXJ0TGlua1BhcmFtcz4oe1xuICAgICAgICAgIGFwcCxcbiAgICAgICAgICBpc0VtcHR5RW1iZWRBbGlhc0FsbG93ZWQsXG4gICAgICAgICAgbGlua1BhdGhTdHlsZSxcbiAgICAgICAgICBsaW5rU3R5bGU6IGxpbmtTdHlsZVByb3ZpZGVyPy4obGluaykgPz8gbGlua1N0eWxlLFxuICAgICAgICAgIG5ld1NvdXJjZVBhdGhPckZpbGUsXG4gICAgICAgICAgb2xkU291cmNlUGF0aE9yRmlsZSxcbiAgICAgICAgICByZWZlcmVuY2U6IGxpbmssXG4gICAgICAgICAgc2hvdWxkRXNjYXBlQWxpYXMsXG4gICAgICAgICAgc2hvdWxkSW5jbHVkZUF0dGFjaG1lbnRFeHRlbnNpb25Ub0VtYmVkQWxpYXMsXG4gICAgICAgICAgc2hvdWxkVXBkYXRlRmlsZU5hbWVBbGlhcyxcbiAgICAgICAgICBzaG91bGRVc2VBbmdsZUJyYWNrZXRzLFxuICAgICAgICAgIHNob3VsZFVzZUxlYWRpbmdEb3RGb3JSZWxhdGl2ZVBhdGhzLFxuICAgICAgICAgIHNob3VsZFVzZUxlYWRpbmdTbGFzaEZvckFic29sdXRlUGF0aHNcbiAgICAgICAgfSkpO1xuICAgIH0sXG4gICAgc2hvdWxkU2tpcFJlZmVyZW5jZXNJbkhlYWRpbmdzXG4gIH0pKTtcbn1cblxuLyoqXG4gKiBVcGRhdGVzIHRoZSBsaW5rcyBpbiBhIGZpbGUgYmFzZWQgb24gdGhlIHByb3ZpZGVkIHBhcmFtZXRlcnMuXG4gKlxuICogQHBhcmFtIHBhcmFtcyAtIFRoZSBwYXJhbWV0ZXJzIGZvciB1cGRhdGluZyB0aGUgbGlua3MuXG4gKiBAcmV0dXJucyBBIHtAbGluayBQcm9taXNlfSB0aGF0IHJlc29sdmVzIHdoZW4gdGhlIGxpbmtzIGFyZSB1cGRhdGVkLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gdXBkYXRlUmVmZXJlbmNlc0luRmlsZShwYXJhbXM6IFVwZGF0ZVJlZmVyZW5jZXNJbkZpbGVQYXJhbXMpOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3Qge1xuICAgIGFwcCxcbiAgICBpc0VtcHR5RW1iZWRBbGlhc0FsbG93ZWQsXG4gICAgbGlua1BhdGhTdHlsZSxcbiAgICBsaW5rU3R5bGUsXG4gICAgbGlua1N0eWxlUHJvdmlkZXIsXG4gICAgbmV3U291cmNlUGF0aE9yRmlsZSxcbiAgICBvZmZzZXRSYW5nZSxcbiAgICBvbGRTb3VyY2VQYXRoT3JGaWxlLFxuICAgIHNob3VsZEVzY2FwZUFsaWFzLFxuICAgIHNob3VsZEluY2x1ZGVBdHRhY2htZW50RXh0ZW5zaW9uVG9FbWJlZEFsaWFzLFxuICAgIHNob3VsZFNraXBSZWZlcmVuY2VzSW5IZWFkaW5ncyxcbiAgICBzaG91bGRVcGRhdGVFbWJlZE9ubHlMaW5rcyxcbiAgICBzaG91bGRVcGRhdGVGaWxlTmFtZUFsaWFzLFxuICAgIHNob3VsZFVzZUFuZ2xlQnJhY2tldHMsXG4gICAgc2hvdWxkVXNlTGVhZGluZ0RvdEZvclJlbGF0aXZlUGF0aHMsXG4gICAgc2hvdWxkVXNlTGVhZGluZ1NsYXNoRm9yQWJzb2x1dGVQYXRoc1xuICB9ID0gcGFyYW1zO1xuXG4gIGlmIChpc0NhbnZhc0ZpbGUobmV3U291cmNlUGF0aE9yRmlsZSkgJiYgIWFwcC5pbnRlcm5hbFBsdWdpbnMuZ2V0RW5hYmxlZFBsdWdpbkJ5SWQoSW50ZXJuYWxQbHVnaW5OYW1lLkNhbnZhcykpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICBhd2FpdCBlZGl0UmVmZXJlbmNlcyhub3JtYWxpemVPcHRpb25hbFByb3BlcnRpZXM8RWRpdFJlZmVyZW5jZXNQYXJhbXM+KHtcbiAgICAuLi5wYXJhbXMsXG4gICAgLy8gTmFtZWQgYmVzaWRlIHRoZSBgLi4ucGFyYW1zYCBzcHJlYWQsIHNvIGEgbGF0ZXIgcmVmYWN0b3IgdG8gZXhwbGljaXQgZm9yd2FyZGluZyBjYW5ub3QgZHJvcCBpdCBzaWxlbnRseS5cbiAgICBvZmZzZXRSYW5nZSxcbiAgICBwYXRoT3JGaWxlOiBuZXdTb3VyY2VQYXRoT3JGaWxlLFxuICAgIHJlZmVyZW5jZUNvbnZlcnRlcjogKGxpbmspID0+IHtcbiAgICAgIGNvbnN0IGlzRW1iZWRMaW5rID0gaGFzRW1iZWRTeW50YXgoZ2V0UmVmZXJlbmNlTGlua1RleHQobGluaykpO1xuICAgICAgcmV0dXJuIHNob3VsZFVwZGF0ZUVtYmVkT25seUxpbmtzICE9PSB1bmRlZmluZWQgJiYgc2hvdWxkVXBkYXRlRW1iZWRPbmx5TGlua3MgIT09IGlzRW1iZWRMaW5rXG4gICAgICAgID8gdW5kZWZpbmVkXG4gICAgICAgIDogY29udmVydExpbmsobm9ybWFsaXplT3B0aW9uYWxQcm9wZXJ0aWVzPENvbnZlcnRMaW5rUGFyYW1zPih7XG4gICAgICAgICAgYXBwLFxuICAgICAgICAgIGlzRW1wdHlFbWJlZEFsaWFzQWxsb3dlZCxcbiAgICAgICAgICBsaW5rUGF0aFN0eWxlLFxuICAgICAgICAgIGxpbmtTdHlsZTogbGlua1N0eWxlUHJvdmlkZXI/LihsaW5rKSA/PyBsaW5rU3R5bGUsXG4gICAgICAgICAgbmV3U291cmNlUGF0aE9yRmlsZSxcbiAgICAgICAgICBvbGRTb3VyY2VQYXRoT3JGaWxlLFxuICAgICAgICAgIHJlZmVyZW5jZTogbGluayxcbiAgICAgICAgICBzaG91bGRFc2NhcGVBbGlhcyxcbiAgICAgICAgICBzaG91bGRJbmNsdWRlQXR0YWNobWVudEV4dGVuc2lvblRvRW1iZWRBbGlhcyxcbiAgICAgICAgICBzaG91bGRVcGRhdGVGaWxlTmFtZUFsaWFzLFxuICAgICAgICAgIHNob3VsZFVzZUFuZ2xlQnJhY2tldHMsXG4gICAgICAgICAgc2hvdWxkVXNlTGVhZGluZ0RvdEZvclJlbGF0aXZlUGF0aHMsXG4gICAgICAgICAgc2hvdWxkVXNlTGVhZGluZ1NsYXNoRm9yQWJzb2x1dGVQYXRoc1xuICAgICAgICB9KSk7XG4gICAgfSxcbiAgICBzaG91bGRTa2lwUmVmZXJlbmNlc0luSGVhZGluZ3NcbiAgfSkpO1xufVxuXG5mdW5jdGlvbiBkZWZhdWx0UmVmZXJlbmNlSWRlbnRpdHlLZXlQcm92aWRlcihsaW5rOiBSZWZlcmVuY2UpOiBzdHJpbmcge1xuICByZXR1cm4gSlNPTi5zdHJpbmdpZnkobGluayk7XG59XG5cbmZ1bmN0aW9uIGdlbmVyYXRlTGlua1RleHQocGFyYW1zOiBHZW5lcmF0ZUxpbmtUZXh0UGFyYW1zKTogc3RyaW5nIHtcbiAgY29uc3QgeyBhcHAsIGNvbmZpZywgc3VicGF0aCwgdGFyZ2V0RmlsZSB9ID0gcGFyYW1zO1xuICBsZXQgeyBzb3VyY2VQYXRoIH0gPSBwYXJhbXM7XG4gIGlmIChzb3VyY2VQYXRoID09PSAnLycpIHtcbiAgICBzb3VyY2VQYXRoID0gJyc7XG4gIH1cblxuICBsZXQgbGlua1RleHQ6IHN0cmluZztcblxuICBpZiAodGFyZ2V0RmlsZS5wYXRoID09PSBzb3VyY2VQYXRoICYmIHN1YnBhdGggJiYgY29uZmlnLmlzU2luZ2xlU3VicGF0aEFsbG93ZWQpIHtcbiAgICBsaW5rVGV4dCA9ICcnO1xuICB9IGVsc2Uge1xuICAgIC8qIHY4IGlnbm9yZSBzdGFydCAtLSBBbGwgYnJhbmNoZXMgY292ZXJlZCBidXQgdjggcmVwb3J0cyBzd2l0Y2ggYXMgcGFydGlhbC4gKi9cbiAgICBzd2l0Y2ggKGNvbmZpZy5saW5rUGF0aFN0eWxlKSB7XG4gICAgICAvKiB2OCBpZ25vcmUgc3RvcCAqL1xuICAgICAgY2FzZSBGaW5hbExpbmtQYXRoU3R5bGUuQWJzb2x1dGVQYXRoSW5WYXVsdDoge1xuICAgICAgICBsaW5rVGV4dCA9IHRhcmdldEZpbGUucGF0aDtcbiAgICAgICAgaWYgKGNvbmZpZy5zaG91bGRVc2VMZWFkaW5nU2xhc2hGb3JBYnNvbHV0ZVBhdGhzICYmICFsaW5rVGV4dC5zdGFydHNXaXRoKCcvJykpIHtcbiAgICAgICAgICBsaW5rVGV4dCA9IGAvJHtsaW5rVGV4dH1gO1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgY2FzZSBGaW5hbExpbmtQYXRoU3R5bGUuUmVsYXRpdmVQYXRoVG9UaGVTb3VyY2U6IHtcbiAgICAgICAgbGlua1RleHQgPSByZWxhdGl2ZShkaXJuYW1lKHNvdXJjZVBhdGgpLCB0YXJnZXRGaWxlLnBhdGgpO1xuICAgICAgICBpZiAoY29uZmlnLnNob3VsZFVzZUxlYWRpbmdEb3RGb3JSZWxhdGl2ZVBhdGhzICYmICFsaW5rVGV4dC5zdGFydHNXaXRoKCcuJykpIHtcbiAgICAgICAgICBsaW5rVGV4dCA9IGAuLyR7bGlua1RleHR9YDtcbiAgICAgICAgfVxuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIGNhc2UgRmluYWxMaW5rUGF0aFN0eWxlLlNob3J0ZXN0UGF0aFdoZW5Qb3NzaWJsZToge1xuICAgICAgICBjb25zdCBzaG9ydGVzdE5hbWUgPSBpc01hcmtkb3duRmlsZSh0YXJnZXRGaWxlKSA/IHRhcmdldEZpbGUuYmFzZW5hbWUgOiB0YXJnZXRGaWxlLm5hbWU7XG4gICAgICAgIGNvbnN0IG1hdGNoZWRGaWxlcyA9IGFwcC5tZXRhZGF0YUNhY2hlLmdldExpbmtwYXRoRGVzdChzaG9ydGVzdE5hbWUsIHNvdXJjZVBhdGgpO1xuICAgICAgICBsaW5rVGV4dCA9IG1hdGNoZWRGaWxlcy5sZW5ndGggPT09IDEgJiYgbWF0Y2hlZEZpbGVzWzBdID09PSB0YXJnZXRGaWxlID8gdGFyZ2V0RmlsZS5uYW1lIDogdGFyZ2V0RmlsZS5wYXRoO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIC8qIHY4IGlnbm9yZSBzdGFydCAtLSBBbGwgdmFsaWQgRmluYWxMaW5rUGF0aFN0eWxlIHZhbHVlcyBhcmUgaGFuZGxlZCBhYm92ZS4gKi9cbiAgICAgIGRlZmF1bHQ6IHtcbiAgICAgICAgYXNzZXJ0TmV2ZXIoY29uZmlnLmxpbmtQYXRoU3R5bGUpO1xuICAgICAgfVxuICAgICAgICAvKiB2OCBpZ25vcmUgc3RvcCAqL1xuICAgIH1cbiAgfVxuXG4gIGxpbmtUZXh0ID0gY29uZmlnLmlzV2lraWxpbmtcbiAgICA/IHRyaW1FbmQoe1xuICAgICAgJHN0cmluZzogbGlua1RleHQsXG4gICAgICBzdWZmaXg6IGAuJHtNQVJLRE9XTl9GSUxFX0VYVEVOU0lPTn1gXG4gICAgfSlcbiAgICA6IGxpbmtUZXh0O1xuICBsaW5rVGV4dCArPSBzdWJwYXRoO1xuXG4gIHJldHVybiBsaW5rVGV4dDtcbn1cblxuZnVuY3Rpb24gZ2VuZXJhdGVNYXJrZG93bkxpbmtJbXBsKHBhcmFtczogR2VuZXJhdGVNYXJrZG93bkxpbmtQYXJhbXMpOiBzdHJpbmcge1xuICBjb25zdCB7IGFwcCB9ID0gcGFyYW1zO1xuICBjb25zdCB0YXJnZXRGaWxlID0gZ2V0RmlsZShub3JtYWxpemVPcHRpb25hbFByb3BlcnRpZXM8R2V0RmlsZVBhcmFtcz4oeyBhcHAsIHBhdGhPckZpbGU6IHBhcmFtcy50YXJnZXRQYXRoT3JGaWxlLCBzaG91bGRJbmNsdWRlTm9uRXhpc3Rpbmc6IHBhcmFtcy5pc05vbkV4aXN0aW5nRmlsZUFsbG93ZWQgfSkpO1xuICBjb25zdCBzb3VyY2VQYXRoID0gZ2V0UGF0aChhcHAsIHBhcmFtcy5zb3VyY2VQYXRoT3JGaWxlKTtcbiAgY29uc3Qgc3VicGF0aCA9IHBhcmFtcy5zdWJwYXRoID8/ICcnO1xuXG4gIGNvbnN0IGxpbmtDb25maWcgPSBnZXRMaW5rQ29uZmlnKHBhcmFtcyk7XG4gIGNvbnN0IGxpbmtUZXh0ID0gZ2VuZXJhdGVMaW5rVGV4dCh7XG4gICAgYXBwLFxuICAgIGNvbmZpZzogbGlua0NvbmZpZyxcbiAgICBzb3VyY2VQYXRoLFxuICAgIHN1YnBhdGgsXG4gICAgdGFyZ2V0RmlsZVxuICB9KTtcblxuICByZXR1cm4gbGlua0NvbmZpZy5pc1dpa2lsaW5rXG4gICAgPyBnZW5lcmF0ZVdpa2lMaW5rKHtcbiAgICAgIGFsaWFzOiBwYXJhbXMuYWxpYXMsXG4gICAgICBpc0VtYmVkOiBsaW5rQ29uZmlnLmlzRW1iZWQsXG4gICAgICBsaW5rVGV4dFxuICAgIH0pXG4gICAgOiBnZW5lcmF0ZU1hcmtkb3duU3R5bGVMaW5rKHtcbiAgICAgIGNvbmZpZzogbGlua0NvbmZpZyxcbiAgICAgIGxpbmtUZXh0LFxuICAgICAgbWFya2Rvd25MaW5rUGFyYW1zOiBwYXJhbXMsXG4gICAgICB0YXJnZXRGaWxlXG4gICAgfSk7XG59XG5cbmZ1bmN0aW9uIGdlbmVyYXRlTWFya2Rvd25TdHlsZUxpbmsocGFyYW1zOiBHZW5lcmF0ZU1hcmtkb3duU3R5bGVMaW5rUGFyYW1zKTogc3RyaW5nIHtcbiAgY29uc3QgeyBjb25maWcsIGxpbmtUZXh0LCBtYXJrZG93bkxpbmtQYXJhbXMsIHRhcmdldEZpbGUgfSA9IHBhcmFtcztcbiAgbGV0IGFsaWFzID0gbWFya2Rvd25MaW5rUGFyYW1zLmFsaWFzID8/ICcnO1xuICBsZXQgc2hvdWxkRXNjYXBlQWxpYXMgPSBtYXJrZG93bkxpbmtQYXJhbXMuc2hvdWxkRXNjYXBlQWxpYXMgPz8gZmFsc2U7XG4gIGlmICghYWxpYXMgJiYgKGlzTWFya2Rvd25GaWxlKHRhcmdldEZpbGUpIHx8ICFtYXJrZG93bkxpbmtQYXJhbXMuaXNFbXB0eUVtYmVkQWxpYXNBbGxvd2VkKSkge1xuICAgIGFsaWFzID0gIW1hcmtkb3duTGlua1BhcmFtcy5zaG91bGRJbmNsdWRlQXR0YWNobWVudEV4dGVuc2lvblRvRW1iZWRBbGlhcyB8fCBpc01hcmtkb3duRmlsZSh0YXJnZXRGaWxlKVxuICAgICAgPyBnZXRMaW5rRGlzcGxheU5hbWUoeyBhcHA6IG1hcmtkb3duTGlua1BhcmFtcy5hcHAsIGZpbGU6IHRhcmdldEZpbGUgfSlcbiAgICAgIDogdGFyZ2V0RmlsZS5uYW1lO1xuICAgIHNob3VsZEVzY2FwZUFsaWFzID0gdHJ1ZTtcbiAgfVxuXG4gIHJldHVybiBnZW5lcmF0ZVJhd01hcmtkb3duTGluayh7XG4gICAgYWxpYXMsXG4gICAgaXNFbWJlZDogY29uZmlnLmlzRW1iZWQsXG4gICAgaXNXaWtpbGluazogZmFsc2UsXG4gICAgc2hvdWxkRXNjYXBlQWxpYXMsXG4gICAgc2hvdWxkVXNlQW5nbGVCcmFja2V0czogY29uZmlnLnNob3VsZFVzZUFuZ2xlQnJhY2tldHMsXG4gICAgdXJsOiBsaW5rVGV4dFxuICB9KTtcbn1cblxuZnVuY3Rpb24gZ2VuZXJhdGVXaWtpTGluayhwYXJhbXM6IEdlbmVyYXRlV2lraUxpbmtQYXJhbXMpOiBzdHJpbmcge1xuICBjb25zdCB7IGFsaWFzLCBpc0VtYmVkLCBsaW5rVGV4dCB9ID0gcGFyYW1zO1xuICByZXR1cm4gZ2VuZXJhdGVSYXdNYXJrZG93bkxpbmsoe1xuICAgIGlzRW1iZWQsXG4gICAgaXNXaWtpbGluazogdHJ1ZSxcbiAgICAuLi4oYWxpYXM/LnRvTG93ZXJDYXNlKCkgPT09IGxpbmtUZXh0LnRvTG93ZXJDYXNlKClcbiAgICAgID8geyB1cmw6IGFsaWFzIH1cbiAgICAgIDoge1xuICAgICAgICBhbGlhcyxcbiAgICAgICAgdXJsOiBsaW5rVGV4dFxuICAgICAgfSlcbiAgfSk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGdldEZpbGVDaGFuZ2VzKHBhcmFtczogR2V0RmlsZUNoYW5nZXNQYXJhbXMpOiBQcm9taXNlPEZpbGVDaGFuZ2VbXT4ge1xuICBjb25zdCB7XG4gICAgY2FjaGUsXG4gICAgaXNDYW52YXNGaWxlQ2FjaGUsXG4gICAgb2Zmc2V0UmFuZ2UsXG4gICAgcmVmZXJlbmNlQ29udmVydGVyLFxuICAgIHNob3VsZEluY2x1ZGVFeHRlcm5hbExpbmtzID0gZmFsc2UsXG4gICAgc2hvdWxkSW5jbHVkZUZyb250bWF0dGVyRXh0ZXJuYWxMaW5rcyA9IGZhbHNlLFxuICAgIHNob3VsZEluY2x1ZGVNdWx0aVZhbHVlRnJvbnRtYXR0ZXJFeHRlcm5hbExpbmtzID0gZmFsc2UsXG4gICAgc2hvdWxkU2tpcFJlZmVyZW5jZXNJbkhlYWRpbmdzID0gZmFsc2VcbiAgfSA9IHBhcmFtcztcbiAgbGV0IHsgYWJvcnRTaWduYWwgfSA9IHBhcmFtcztcbiAgYWJvcnRTaWduYWwgPz89IGFib3J0U2lnbmFsTmV2ZXIoKTtcbiAgYWJvcnRTaWduYWwudGhyb3dJZkFib3J0ZWQoKTtcblxuICBpZiAoIWNhY2hlKSB7XG4gICAgcmV0dXJuIFtdO1xuICB9XG5cbiAgY29uc3QgY2hhbmdlczogRmlsZUNoYW5nZVtdID0gW107XG5cbiAgY29uc3QgdGFibGVQb3NpdGlvbnM6IFRhYmxlUG9zaXRpb25bXSA9IChjYWNoZS5zZWN0aW9ucyA/PyBbXSkuZmlsdGVyKChzZWN0aW9uKSA9PiBzZWN0aW9uLnR5cGUgPT09ICd0YWJsZScpLm1hcCgoc2VjdGlvbikgPT4gKHtcbiAgICBlbmQ6IHNlY3Rpb24ucG9zaXRpb24uZW5kLm9mZnNldCxcbiAgICBzdGFydDogc2VjdGlvbi5wb3NpdGlvbi5zdGFydC5vZmZzZXRcbiAgfSkpO1xuXG4gIGNvbnN0IGdldEZpbGVDaGFuZ2VzRGVidWdnZXIgPSBnZXRPYnNpZGlhbkxpYkRlYnVnZ2VyKCdMaW5rOmdldEZpbGVDaGFuZ2VzJyk7XG5cbiAgZm9yIChjb25zdCBsaW5rIG9mIGdldFJlZmVyZW5jZXMoeyBjYWNoZSwgc2hvdWxkSW5jbHVkZUV4dGVybmFsTGlua3MsIHNob3VsZEluY2x1ZGVGcm9udG1hdHRlckV4dGVybmFsTGlua3MsIHNob3VsZEluY2x1ZGVNdWx0aVZhbHVlRnJvbnRtYXR0ZXJFeHRlcm5hbExpbmtzIH0pKSB7XG4gICAgYWJvcnRTaWduYWwudGhyb3dJZkFib3J0ZWQoKTtcblxuICAgIGlmIChvZmZzZXRSYW5nZSAhPT0gdW5kZWZpbmVkICYmICFpc1JlZmVyZW5jZUluT2Zmc2V0UmFuZ2UobGluaywgb2Zmc2V0UmFuZ2UpKSB7XG4gICAgICBnZXRGaWxlQ2hhbmdlc0RlYnVnZ2VyKFxuICAgICAgICBpc1JlZmVyZW5jZUNhY2hlKGxpbmspXG4gICAgICAgICAgPyAnU2tpcHBpbmcgYSBsaW5rIHRoYXQgaXMgbm90IGZ1bGx5IGNvbnRhaW5lZCBpbiB0aGUgb2Zmc2V0IHJhbmdlJ1xuICAgICAgICAgIDogJ1NraXBwaW5nIGEgbGluayB0aGF0IGNhcnJpZXMgbm8gcG9zaXRpb24gd2l0aGluIHRoZSBjb250ZW50LCBzbyBpdCBjYW4gbmV2ZXIgYmUgaW4gdGhlIG9mZnNldCByYW5nZScsXG4gICAgICAgIHsgbGluazogbGluay5vcmlnaW5hbCwgb2Zmc2V0UmFuZ2UgfVxuICAgICAgKTtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIGlmIChzaG91bGRTa2lwUmVmZXJlbmNlc0luSGVhZGluZ3MgJiYgaXNSZWZlcmVuY2VJbkhlYWRpbmcobGluaywgY2FjaGUpKSB7XG4gICAgICBnZXRGaWxlQ2hhbmdlc0RlYnVnZ2VyKCdTa2lwcGluZyBhIGxpbmsgaW5zaWRlIGEgaGVhZGluZycsIHsgbGluazogbGluay5vcmlnaW5hbCB9KTtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIGNvbnN0IG5ld0NvbnRlbnQgPSBhd2FpdCByZWZlcmVuY2VDb252ZXJ0ZXIobGluaywgYWJvcnRTaWduYWwpO1xuICAgIGFib3J0U2lnbmFsLnRocm93SWZBYm9ydGVkKCk7XG4gICAgaWYgKG5ld0NvbnRlbnQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgY29uc3QgZmlsZUNoYW5nZSA9IHJlZmVyZW5jZVRvRmlsZUNoYW5nZShsaW5rLCBuZXdDb250ZW50KTtcblxuICAgIGlmIChpc0NhbnZhc0ZpbGVDYWNoZSkge1xuICAgICAgaWYgKGlzQ2FudmFzQ2hhbmdlKGZpbGVDaGFuZ2UpKSB7XG4gICAgICAgIGNoYW5nZXMucHVzaChmaWxlQ2hhbmdlKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoJ1Vuc3VwcG9ydGVkIGZpbGUgY2hhbmdlJywgZmlsZUNoYW5nZSk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmIChzaG91bGRFc2NhcGVXaWtpbGlua0RpdmlkZXIoZmlsZUNoYW5nZSwgdGFibGVQb3NpdGlvbnMpKSB7XG4gICAgICAgIGZpbGVDaGFuZ2UubmV3Q29udGVudCA9IGZpbGVDaGFuZ2UubmV3Q29udGVudC5yZXBsYWNlQWxsKE9QVElPTkFMTFlfRVNDQVBFRF9XSUtJTElOS19ESVZJREVSX1JFR0VYUCwgKCkgPT4gRVNDQVBFRF9XSUtJTElOS19ESVZJREVSKTtcbiAgICAgIH1cblxuICAgICAgY2hhbmdlcy5wdXNoKGZpbGVDaGFuZ2UpO1xuICAgIH1cbiAgfVxuICByZXR1cm4gY2hhbmdlcztcbn1cblxuZnVuY3Rpb24gZ2V0RmluYWxMaW5rUGF0aFN0eWxlKGFwcDogQXBwLCBsaW5rUGF0aFN0eWxlPzogTGlua1BhdGhTdHlsZSk6IEZpbmFsTGlua1BhdGhTdHlsZSB7XG4gIGNvbnN0IHJlc29sdmVkU3R5bGUgPSBsaW5rUGF0aFN0eWxlID8/IExpbmtQYXRoU3R5bGUuT2JzaWRpYW5TZXR0aW5nc0RlZmF1bHQ7XG4gIHN3aXRjaCAocmVzb2x2ZWRTdHlsZSkge1xuICAgIGNhc2UgTGlua1BhdGhTdHlsZS5BYnNvbHV0ZVBhdGhJblZhdWx0OiB7XG4gICAgICByZXR1cm4gRmluYWxMaW5rUGF0aFN0eWxlLkFic29sdXRlUGF0aEluVmF1bHQ7XG4gICAgfVxuICAgIGNhc2UgTGlua1BhdGhTdHlsZS5PYnNpZGlhblNldHRpbmdzRGVmYXVsdDoge1xuICAgICAgcmV0dXJuIHJlc29sdmVGaW5hbExpbmtQYXRoU3R5bGVGcm9tT2JzaWRpYW5TZXR0aW5ncyhhcHApO1xuICAgIH1cbiAgICBjYXNlIExpbmtQYXRoU3R5bGUuUmVsYXRpdmVQYXRoVG9UaGVTb3VyY2U6IHtcbiAgICAgIHJldHVybiBGaW5hbExpbmtQYXRoU3R5bGUuUmVsYXRpdmVQYXRoVG9UaGVTb3VyY2U7XG4gICAgfVxuICAgIGNhc2UgTGlua1BhdGhTdHlsZS5TaG9ydGVzdFBhdGhXaGVuUG9zc2libGU6IHtcbiAgICAgIHJldHVybiBGaW5hbExpbmtQYXRoU3R5bGUuU2hvcnRlc3RQYXRoV2hlblBvc3NpYmxlO1xuICAgIH1cbiAgICBkZWZhdWx0OiB7XG4gICAgICBhc3NlcnROZXZlcihyZXNvbHZlZFN0eWxlKTtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gZ2V0TGlua0NvbmZpZyhwYXJhbXM6IEdlbmVyYXRlTWFya2Rvd25MaW5rUGFyYW1zKTogTGlua0NvbmZpZyB7XG4gIGNvbnN0IHsgYXBwIH0gPSBwYXJhbXM7XG4gIHJldHVybiB7XG4gICAgaXNFbWJlZDogcGFyYW1zLmlzRW1iZWQgPz8gKHBhcmFtcy5vcmlnaW5hbExpbmsgPyBoYXNFbWJlZFN5bnRheChwYXJhbXMub3JpZ2luYWxMaW5rKSA6IGZhbHNlKSxcbiAgICBpc1NpbmdsZVN1YnBhdGhBbGxvd2VkOiBwYXJhbXMuaXNTaW5nbGVTdWJwYXRoQWxsb3dlZCA/PyB0cnVlLFxuICAgIGlzV2lraWxpbms6IHNob3VsZFVzZVdpa2lsaW5rU3R5bGUobm9ybWFsaXplT3B0aW9uYWxQcm9wZXJ0aWVzPFNob3VsZFVzZVdpa2lsaW5rU3R5bGVQYXJhbXM+KHtcbiAgICAgIGFwcCxcbiAgICAgIGxpbmtTdHlsZTogcGFyYW1zLmxpbmtTdHlsZSxcbiAgICAgIG9yaWdpbmFsTGluazogcGFyYW1zLm9yaWdpbmFsTGlua1xuICAgIH0pKSxcbiAgICBsaW5rUGF0aFN0eWxlOiBnZXRGaW5hbExpbmtQYXRoU3R5bGUoYXBwLCBwYXJhbXMubGlua1BhdGhTdHlsZSksXG4gICAgc2hvdWxkVXNlQW5nbGVCcmFja2V0czogcGFyYW1zLnNob3VsZFVzZUFuZ2xlQnJhY2tldHMgPz8gKHBhcmFtcy5vcmlnaW5hbExpbmsgPyBoYXNBbmdsZUJyYWNrZXRzKHBhcmFtcy5vcmlnaW5hbExpbmspIDogdW5kZWZpbmVkKSA/PyBmYWxzZSxcbiAgICBzaG91bGRVc2VMZWFkaW5nRG90Rm9yUmVsYXRpdmVQYXRoczogcGFyYW1zLnNob3VsZFVzZUxlYWRpbmdEb3RGb3JSZWxhdGl2ZVBhdGhzXG4gICAgICA/PyAocGFyYW1zLm9yaWdpbmFsTGluayA/IGhhc0xlYWRpbmdEb3QocGFyYW1zLm9yaWdpbmFsTGluaykgOiB1bmRlZmluZWQpID8/IGZhbHNlLFxuICAgIHNob3VsZFVzZUxlYWRpbmdTbGFzaEZvckFic29sdXRlUGF0aHM6IHBhcmFtcy5zaG91bGRVc2VMZWFkaW5nU2xhc2hGb3JBYnNvbHV0ZVBhdGhzXG4gICAgICA/PyAocGFyYW1zLm9yaWdpbmFsTGluayA/IGhhc0xlYWRpbmdTbGFzaChwYXJhbXMub3JpZ2luYWxMaW5rKSA6IHVuZGVmaW5lZCkgPz8gZmFsc2VcbiAgfTtcbn1cblxuLyoqXG4gKiBUaGUgbmFtZSBhIGxpbmsgY2FwdGlvbiBzaG93cyBmb3IgYSBmaWxlOiB0aGUgZm9sZGVyJ3MgbmFtZSBmb3IgYSBNYXJrZG93biBmb2xkZXIgbm90ZSwgdGhlIGJhc2UgbmFtZSBvdGhlcndpc2UuXG4gKlxuICogQHBhcmFtIHBhcmFtcyAtIFRoZSBmaWxlLCBhbmQgb3B0aW9uYWxseSB0aGUgZm9sZGVyLW5vdGUgc2V0dXAgdG8ganVkZ2UgaXQgYnkuXG4gKiBAcmV0dXJucyBUaGUgZGlzcGxheSBuYW1lLlxuICovXG5mdW5jdGlvbiBnZXRMaW5rRGlzcGxheU5hbWUocGFyYW1zOiBHZXRGb2xkZXJOb3RlRm9sZGVyUGFyYW1zKTogc3RyaW5nIHtcbiAgY29uc3QgeyBmaWxlIH0gPSBwYXJhbXM7XG4gIGlmIChpc01hcmtkb3duRmlsZShmaWxlKSkge1xuICAgIGNvbnN0IGZvbGRlciA9IGdldEZvbGRlck5vdGVGb2xkZXIocGFyYW1zKTtcbiAgICBpZiAoZm9sZGVyKSB7XG4gICAgICByZXR1cm4gZm9sZGVyLm5hbWU7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGZpbGUuYmFzZW5hbWU7XG59XG5cbmZ1bmN0aW9uIGdldFVuZGVmaW5lZFBheWxvYWQoKTogdW5kZWZpbmVkIHtcbiAgLy8gQSBzaW5nbGUtdGFyZ2V0IHJld3JpdGUgaGFzIG5vdGhpbmcgdG8gcmVtZW1iZXIgcGVyIGxpbms6IHRoZSB0YXJnZXQgaXMgaW1wbGllZC5cbn1cblxuZnVuY3Rpb24gbm9ybWFsaXplRmlsZVVybExpbmsobGluazogUmVmZXJlbmNlLCBzaG91bGRVc2VBbmdsZUJyYWNrZXRzOiBib29sZWFuKTogTWF5YmVSZXR1cm48c3RyaW5nPiB7XG4gIGlmIChpc1BhcnNlTGlua0Zyb250bWF0dGVyUmVmZXJlbmNlKGxpbmspKSB7XG4gICAgLy8gQSBmcm9udG1hdHRlciB2YWx1ZSBob2xkcyBhIGJhcmUgVVJMIChyZS1zZXJpYWxpemVkL3F1b3RlZCBhcyBZQU1MKSwgbm90IGEgYFthbGlhc10odXJsKWAgbWFya2Rvd24gbGluay5cbiAgICByZXR1cm4gbGluay5wYXJzZUxpbmtSZXN1bHQuaXNGaWxlVXJsID8gbm9ybWFsaXplRmlsZVVybChsaW5rLnBhcnNlTGlua1Jlc3VsdC51cmwpIDogdW5kZWZpbmVkO1xuICB9XG5cbiAgaWYgKCFpc1BhcnNlTGlua1JlZmVyZW5jZShsaW5rKSkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGNvbnN0IHsgcGFyc2VMaW5rUmVzdWx0IH0gPSBsaW5rO1xuICByZXR1cm4gcGFyc2VMaW5rUmVzdWx0LmlzRmlsZVVybFxuICAgID8gZ2VuZXJhdGVSYXdNYXJrZG93bkxpbmsobm9ybWFsaXplT3B0aW9uYWxQcm9wZXJ0aWVzPEdlbmVyYXRlUmF3TWFya2Rvd25MaW5rUGFyYW1zPih7XG4gICAgICBhbGlhczogcGFyc2VMaW5rUmVzdWx0LmFsaWFzLFxuICAgICAgaXNFbWJlZDogcGFyc2VMaW5rUmVzdWx0LmlzRW1iZWQsXG4gICAgICBpc1dpa2lsaW5rOiBmYWxzZSxcbiAgICAgIHNob3VsZFVzZUFuZ2xlQnJhY2tldHMsXG4gICAgICB1cmw6IG5vcm1hbGl6ZUZpbGVVcmwocGFyc2VMaW5rUmVzdWx0LnVybClcbiAgICB9KSlcbiAgICA6IHVuZGVmaW5lZDtcbn1cblxuLyoqXG4gKiBSZWZyZXNoZXMgYSBmaWxlLW5hbWUgYWxpYXMgdG8gdGhlIGRpc3BsYXkgbmFtZSBvZiB0aGUgcmVuYW1lZCB0YXJnZXQuXG4gKlxuICogQHBhcmFtIHBhcmFtcyAtIFRoZSBjdXJyZW50IGFsaWFzLCBhbmQgdGhlIHRhcmdldCBiZWZvcmUgYW5kIGFmdGVyLlxuICogQHJldHVybnMgVGhlIGFsaWFzIHRvIHVzZS5cbiAqL1xuZnVuY3Rpb24gcmVmcmVzaEZpbGVOYW1lQWxpYXMocGFyYW1zOiBSZWZyZXNoRmlsZU5hbWVBbGlhc1BhcmFtcyk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IHsgYWxpYXMsIGFwcCwgY2FuQWRkQWxpYXMsIG5ld1RhcmdldEZpbGUsIG9sZFRhcmdldFBhdGggfSA9IHBhcmFtcztcbiAgY29uc3Qgb2xkQmFzZU5hbWUgPSBiYXNlbmFtZShvbGRUYXJnZXRQYXRoLCBleHRuYW1lKG9sZFRhcmdldFBhdGgpKTtcbiAgY29uc3QgZm9sZGVyTm90ZUNvbmZpZyA9IHJlc29sdmVGb2xkZXJOb3RlQ29uZmlnKHsgYXBwIH0pO1xuICBjb25zdCBkaXNwbGF5TmFtZSA9IGdldExpbmtEaXNwbGF5TmFtZSh7IGFwcCwgY29uZmlnOiBmb2xkZXJOb3RlQ29uZmlnLCBmaWxlOiBuZXdUYXJnZXRGaWxlIH0pO1xuICBjb25zdCBpc0ZvbGRlck5vdGUgPSBkaXNwbGF5TmFtZSAhPT0gbmV3VGFyZ2V0RmlsZS5iYXNlbmFtZTtcbiAgLy8gQSBmb2xkZXIgcmVuYW1lIGxlYXZlcyB0aGUgbm90ZSBgY2hhcmxpZS8hLm1kYCBuYW1lZCBhcyBpdCB3YXMsIHNvIGl0cyBvbGQgZGlzcGxheSBuYW1lIHdhcyB0aGUgb2xkIGZvbGRlcidzIG5hbWUuXG4gIGNvbnN0IG9sZEZvbGRlck5vdGVEaXNwbGF5TmFtZSA9IGlzRm9sZGVyTm90ZSAmJiBmb2xkZXJOb3RlQ29uZmlnLmxvY2F0aW9uID09PSBGb2xkZXJOb3RlTG9jYXRpb24uSW5zaWRlRm9sZGVyXG4gICAgICAmJiBvbGRCYXNlTmFtZSA9PT0gbmV3VGFyZ2V0RmlsZS5iYXNlbmFtZVxuICAgID8gYmFzZW5hbWUoZGlybmFtZShvbGRUYXJnZXRQYXRoKSlcbiAgICA6IG51bGw7XG5cbiAgaWYgKGFsaWFzID09PSBvbGRCYXNlTmFtZSB8fCBhbGlhcyA9PT0gb2xkRm9sZGVyTm90ZURpc3BsYXlOYW1lKSB7XG4gICAgcmV0dXJuIGRpc3BsYXlOYW1lO1xuICB9XG5cbiAgaWYgKGFsaWFzID09PSBiYXNlbmFtZShvbGRUYXJnZXRQYXRoKSkge1xuICAgIHJldHVybiBpc0ZvbGRlck5vdGUgPyBgJHtkaXNwbGF5TmFtZX0uJHtuZXdUYXJnZXRGaWxlLmV4dGVuc2lvbn1gIDogbmV3VGFyZ2V0RmlsZS5uYW1lO1xuICB9XG5cbiAgLy8gQW4gYWxpYXMtbGVzcyB3aWtpbGluayB0byBgY2hhcmxpZS8hYCB3b3VsZCBkaXNwbGF5IGAhYCwgc28gaXQgdGFrZXMgdGhlIGZvbGRlcidzIG5hbWUgYXMgaXRzIGFsaWFzLlxuICByZXR1cm4gYWxpYXMgPT09IHVuZGVmaW5lZCAmJiBpc0ZvbGRlck5vdGUgJiYgY2FuQWRkQWxpYXMgPyBkaXNwbGF5TmFtZSA6IGFsaWFzO1xufVxuXG5mdW5jdGlvbiByZXNvbHZlRmluYWxMaW5rUGF0aFN0eWxlRnJvbU9ic2lkaWFuU2V0dGluZ3MoYXBwOiBBcHApOiBGaW5hbExpbmtQYXRoU3R5bGUge1xuICBjb25zdCBuZXdMaW5rRm9ybWF0ID0gZ2V0TmV3TGlua0Zvcm1hdChhcHApO1xuICBzd2l0Y2ggKG5ld0xpbmtGb3JtYXQpIHtcbiAgICBjYXNlICdhYnNvbHV0ZSc6IHtcbiAgICAgIHJldHVybiBGaW5hbExpbmtQYXRoU3R5bGUuQWJzb2x1dGVQYXRoSW5WYXVsdDtcbiAgICB9XG4gICAgY2FzZSAncmVsYXRpdmUnOiB7XG4gICAgICByZXR1cm4gRmluYWxMaW5rUGF0aFN0eWxlLlJlbGF0aXZlUGF0aFRvVGhlU291cmNlO1xuICAgIH1cbiAgICBjYXNlICdzaG9ydGVzdCc6IHtcbiAgICAgIHJldHVybiBGaW5hbExpbmtQYXRoU3R5bGUuU2hvcnRlc3RQYXRoV2hlblBvc3NpYmxlO1xuICAgIH1cbiAgICBkZWZhdWx0OiB7XG4gICAgICBhc3NlcnROZXZlcihuZXdMaW5rRm9ybWF0KTtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gcmVzb2x2ZVNuYXBzaG90UmVmZXJlbmNlSWRlbnRpdHlLZXlQcm92aWRlcihwYXJhbXM6IFJlc29sdmVTbmFwc2hvdFJlZmVyZW5jZUlkZW50aXR5S2V5UHJvdmlkZXJQYXJhbXMpOiAobGluazogUmVmZXJlbmNlKSA9PiBzdHJpbmcge1xuICBjb25zdCB7IGNhbGxlck5hbWUsIGV4cGxpY2l0UmVmZXJlbmNlSWRlbnRpdHlLZXlQcm92aWRlciwgc25hcHNob3QgfSA9IHBhcmFtcztcbiAgY29uc3QgcmVjb3JkZWRSZWZlcmVuY2VJZGVudGl0eUtleVByb3ZpZGVyID0gc25hcHNob3RSZWZlcmVuY2VJZGVudGl0eUtleVByb3ZpZGVycy5nZXQoc25hcHNob3QpO1xuICBpZiAoXG4gICAgZXhwbGljaXRSZWZlcmVuY2VJZGVudGl0eUtleVByb3ZpZGVyICYmIHJlY29yZGVkUmVmZXJlbmNlSWRlbnRpdHlLZXlQcm92aWRlclxuICAgICYmIGV4cGxpY2l0UmVmZXJlbmNlSWRlbnRpdHlLZXlQcm92aWRlciAhPT0gcmVjb3JkZWRSZWZlcmVuY2VJZGVudGl0eUtleVByb3ZpZGVyXG4gICkge1xuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgIGAke2NhbGxlck5hbWV9IHdhcyBwYXNzZWQgYSByZWZlcmVuY2VJZGVudGl0eUtleVByb3ZpZGVyIHRoYXQgZGlmZmVycyBmcm9tIHRoZSBvbmUgdGhlIHNuYXBzaG90IHdhcyBidWlsdCB3aXRoLiBgXG4gICAgICAgICsgJ1RoZSBzbmFwc2hvdCBpcyBrZXllZCBieSB0aGUgb3RoZXIsIHNvIG5vIGxpbmsgd291bGQgbWF0Y2guIE9taXQgdGhlIHBhcmFtZXRlciB0byB1c2UgdGhlIHNuYXBzaG90XFwncyBvd24uJ1xuICAgICk7XG4gIH1cbiAgcmV0dXJuIGV4cGxpY2l0UmVmZXJlbmNlSWRlbnRpdHlLZXlQcm92aWRlciA/PyByZWNvcmRlZFJlZmVyZW5jZUlkZW50aXR5S2V5UHJvdmlkZXIgPz8gZGVmYXVsdFJlZmVyZW5jZUlkZW50aXR5S2V5UHJvdmlkZXI7XG59XG5cbmZ1bmN0aW9uIHNob3VsZEVzY2FwZVdpa2lsaW5rRGl2aWRlcihmaWxlQ2hhbmdlOiBGaWxlQ2hhbmdlLCB0YWJsZVBvc2l0aW9uczogVGFibGVQb3NpdGlvbltdKTogYm9vbGVhbiB7XG4gIC8qIHY4IGlnbm9yZSBzdGFydCAtLSBnZXRGaWxlQ2hhbmdlcyBvbmx5IGNhbGxzIHRoaXMgZm9yIG5vbi1jYW52YXMgZmlsZXMgd2hpY2ggYWx3YXlzIGhhdmUgY29udGVudCBjaGFuZ2VzLiAqL1xuICBpZiAoIWlzQ29udGVudENoYW5nZShmaWxlQ2hhbmdlKSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICAvKiB2OCBpZ25vcmUgc3RvcCAqL1xuXG4gIHJldHVybiBVTkVTQ0FQRURfV0lLSUxJTktfRElWSURFUl9SRUdFWFAudGVzdChmaWxlQ2hhbmdlLm5ld0NvbnRlbnQpICYmIHRhYmxlUG9zaXRpb25zLnNvbWUoKHRhYmxlUG9zaXRpb24pID0+IHRhYmxlUG9zaXRpb24uc3RhcnQgPD0gZmlsZUNoYW5nZS5yZWZlcmVuY2UucG9zaXRpb24uc3RhcnQub2Zmc2V0ICYmIGZpbGVDaGFuZ2UucmVmZXJlbmNlLnBvc2l0aW9uLmVuZC5vZmZzZXQgPD0gdGFibGVQb3NpdGlvbi5lbmQpO1xufVxuXG5mdW5jdGlvbiBzaG91bGRVc2VXaWtpbGlua1N0eWxlKHBhcmFtczogU2hvdWxkVXNlV2lraWxpbmtTdHlsZVBhcmFtcyk6IGJvb2xlYW4ge1xuICBjb25zdCB7IGFwcCwgbGlua1N0eWxlLCBvcmlnaW5hbExpbmsgfSA9IHBhcmFtcztcbiAgY29uc3QgcmVzb2x2ZWRTdHlsZSA9IGxpbmtTdHlsZSA/PyBMaW5rU3R5bGUuUHJlc2VydmVFeGlzdGluZztcbiAgc3dpdGNoIChyZXNvbHZlZFN0eWxlKSB7XG4gICAgY2FzZSBMaW5rU3R5bGUuTWFya2Rvd246IHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgY2FzZSBMaW5rU3R5bGUuT2JzaWRpYW5TZXR0aW5nc0RlZmF1bHQ6IHtcbiAgICAgIHJldHVybiBzaG91bGRVc2VXaWtpbGlua3MoYXBwKTtcbiAgICB9XG4gICAgY2FzZSBMaW5rU3R5bGUuUHJlc2VydmVFeGlzdGluZzoge1xuICAgICAgcmV0dXJuIG9yaWdpbmFsTGluayA9PT0gdW5kZWZpbmVkID8gc2hvdWxkVXNlV2lraWxpbmtzKGFwcCkgOiBoYXNXaWtpbGlua1N5bnRheChvcmlnaW5hbExpbmspO1xuICAgIH1cbiAgICBjYXNlIExpbmtTdHlsZS5XaWtpbGluazoge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIGRlZmF1bHQ6IHtcbiAgICAgIGFzc2VydE5ldmVyKHJlc29sdmVkU3R5bGUpO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiB2YWxpZGF0ZU9mZnNldFJhbmdlKG9mZnNldFJhbmdlOiBPZmZzZXRSYW5nZSk6IHZvaWQge1xuICBpZiAob2Zmc2V0UmFuZ2Uuc3RhcnRPZmZzZXQgPCAwKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIG9mZnNldCByYW5nZTogdGhlIHN0YXJ0IG9mZnNldCAke1N0cmluZyhvZmZzZXRSYW5nZS5zdGFydE9mZnNldCl9IG11c3Qgbm90IGJlIG5lZ2F0aXZlLmApO1xuICB9XG5cbiAgaWYgKG9mZnNldFJhbmdlLmVuZE9mZnNldCA8IG9mZnNldFJhbmdlLnN0YXJ0T2Zmc2V0KSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIG9mZnNldCByYW5nZTogdGhlIGVuZCBvZmZzZXQgJHtTdHJpbmcob2Zmc2V0UmFuZ2UuZW5kT2Zmc2V0KX0gbXVzdCBub3QgYmUgbGVzcyB0aGFuIHRoZSBzdGFydCBvZmZzZXQgJHtTdHJpbmcob2Zmc2V0UmFuZ2Uuc3RhcnRPZmZzZXQpfS5gKTtcbiAgfVxufVxuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQWdCQSw4QkFBaUM7QUFDakMsMEJBR087QUFDUCxrQkFNTztBQUNQLG9CQUlPO0FBQ1AseUJBSU87QUFDUCxpQkFHTztBQUNQLDZCQUdPO0FBQ1Asc0JBR087QUFZUCxtQkFBdUM7QUFDdkMseUJBS087QUFDUCx5QkFNTztBQUNQLHlCQUlPO0FBQ1AsNEJBTU87QUFDUCxnQ0FBb0M7QUFDcEMsK0JBR087QUFDUCx3QkFLTztBQUNQLHVCQU1PO0FBRVAsTUFBTSwyQkFBMkIsT0FBTztBQU94QyxNQUFNLDZD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
1112
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9saW5rLnRzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGZpbGVcbiAqXG4gKiBUaGlzIG1vZHVsZSBwcm92aWRlcyB1dGlsaXRpZXMgZm9yIGhhbmRsaW5nIGFuZCB1cGRhdGluZyBsaW5rcyB3aXRoaW4gT2JzaWRpYW4gdmF1bHRzLiBJdCBpbmNsdWRlc1xuICogZnVuY3Rpb25zIHRvIHNwbGl0IHBhdGhzLCB1cGRhdGUgbGlua3MgaW4gZmlsZXMsIGFuZCBnZW5lcmF0ZSBtYXJrZG93biBsaW5rcyB3aXRoIHZhcmlvdXMgb3B0aW9ucy5cbiAqL1xuXG5pbXBvcnQgdHlwZSB7IE1heWJlUmV0dXJuIH0gZnJvbSAnQG1uYW91bW92L3R5cGVzY3JpcHQtbGliL3R5cGUnO1xuaW1wb3J0IHR5cGUge1xuICBBcHAsXG4gIENhY2hlZE1ldGFkYXRhLFxuICBSZWZlcmVuY2UsXG4gIFRGaWxlXG59IGZyb20gJ29ic2lkaWFuJztcbmltcG9ydCB0eXBlIHsgUHJvbWlzYWJsZSB9IGZyb20gJ3R5cGUtZmVzdCc7XG5cbmltcG9ydCB7IGFib3J0U2lnbmFsTmV2ZXIgfSBmcm9tICdAbW5hb3Vtb3YvdHlwZXNjcmlwdC1saWIvYWJvcnQtY29udHJvbGxlcic7XG5pbXBvcnQge1xuICBub3JtYWxpemVPcHRpb25hbFByb3BlcnRpZXMsXG4gIHJlbW92ZVVuZGVmaW5lZFByb3BlcnRpZXNcbn0gZnJvbSAnQG1uYW91bW92L3R5cGVzY3JpcHQtbGliL29iamVjdC11dGlscyc7XG5pbXBvcnQge1xuICBiYXNlbmFtZSxcbiAgZGlybmFtZSxcbiAgZXh0bmFtZSxcbiAgam9pbixcbiAgcmVsYXRpdmVcbn0gZnJvbSAnQG1uYW91bW92L3R5cGVzY3JpcHQtbGliL3BhdGgnO1xuaW1wb3J0IHtcbiAgbm9ybWFsaXplU3RyaW5nLFxuICByZXBsYWNlQWxsLFxuICB0cmltRW5kXG59IGZyb20gJ0BtbmFvdW1vdi90eXBlc2NyaXB0LWxpYi9zdHJpbmcnO1xuaW1wb3J0IHtcbiAgYXNzZXJ0TmV2ZXIsXG4gIGFzc2VydE5vbk51bGxhYmxlLFxuICBlbnN1cmVOb25OdWxsYWJsZVxufSBmcm9tICdAbW5hb3Vtb3YvdHlwZXNjcmlwdC1saWIvdHlwZS1ndWFyZHMnO1xuaW1wb3J0IHtcbiAgZW5jb2RlVXJsLFxuICBub3JtYWxpemVGaWxlVXJsXG59IGZyb20gJ0BtbmFvdW1vdi90eXBlc2NyaXB0LWxpYi91cmwnO1xuaW1wb3J0IHtcbiAgSW50ZXJuYWxQbHVnaW5OYW1lLFxuICBpc1JlZmVyZW5jZUNhY2hlXG59IGZyb20gJ0BvYnNpZGlhbi10eXBpbmdzL29ic2lkaWFuLXB1YmxpYy1sYXRlc3QvaW1wbGVtZW50YXRpb25zJztcbmltcG9ydCB7XG4gIG5vcm1hbGl6ZVBhdGgsXG4gIHBhcnNlTGlua3RleHRcbn0gZnJvbSAnb2JzaWRpYW4nO1xuXG5pbXBvcnQgdHlwZSB7IEZpbGVDaGFuZ2UgfSBmcm9tICcuL2ZpbGUtY2hhbmdlLnRzJztcbmltcG9ydCB0eXBlIHtcbiAgR2V0RmlsZVBhcmFtcyxcbiAgUGF0aE9yRmlsZVxufSBmcm9tICcuL2ZpbGUtc3lzdGVtLnRzJztcbmltcG9ydCB0eXBlIHsgR2V0Rm9sZGVyTm90ZUZvbGRlclBhcmFtcyB9IGZyb20gJy4vZm9sZGVyLW5vdGUudHMnO1xuaW1wb3J0IHR5cGUgeyBMaW5rVXBkYXRlUHJvZ3Jlc3NSZXBvcnRlciB9IGZyb20gJy4vbGluay11cGRhdGUtcHJvZ3Jlc3MudHMnO1xuaW1wb3J0IHR5cGUgeyBPZmZzZXRSYW5nZSB9IGZyb20gJy4vcmVmZXJlbmNlLnRzJztcbmltcG9ydCB0eXBlIHsgUHJvY2Vzc09wdGlvbnMgfSBmcm9tICcuL3ZhdWx0LnRzJztcblxuaW1wb3J0IHsgZ2V0T2JzaWRpYW5MaWJEZWJ1Z2dlciB9IGZyb20gJy4vZGVidWcudHMnO1xuaW1wb3J0IHtcbiAgYXBwbHlDb250ZW50Q2hhbmdlcyxcbiAgYXBwbHlGaWxlQ2hhbmdlcyxcbiAgaXNDYW52YXNDaGFuZ2UsXG4gIGlzQ29udGVudENoYW5nZVxufSBmcm9tICcuL2ZpbGUtY2hhbmdlLnRzJztcbmltcG9ydCB7XG4gIGdldEZpbGUsXG4gIGdldFBhdGgsXG4gIGlzQ2FudmFzRmlsZSxcbiAgaXNNYXJrZG93bkZpbGUsXG4gIE1BUktET1dOX0ZJTEVfRVhURU5TSU9OXG59IGZyb20gJy4vZmlsZS1zeXN0ZW0udHMnO1xuaW1wb3J0IHtcbiAgRm9sZGVyTm90ZUxvY2F0aW9uLFxuICBnZXRGb2xkZXJOb3RlRm9sZGVyLFxuICByZXNvbHZlRm9sZGVyTm90ZUNvbmZpZ1xufSBmcm9tICcuL2ZvbGRlci1ub3RlLnRzJztcbmltcG9ydCB7XG4gIGdldEJhY2tsaW5rc0ZvckZpbGVTYWZlLFxuICBnZXRDYWNoZVNhZmUsXG4gIGdldFJlZmVyZW5jZXMsXG4gIHBhcnNlTWV0YWRhdGEsXG4gIHJlZ2lzdGVyRmlsZXNcbn0gZnJvbSAnLi9tZXRhZGF0YS1jYWNoZS50cyc7XG5pbXBvcnQgeyBnZXRPYnNpZGlhbkxpYlN0YXRlIH0gZnJvbSAnLi9vYnNpZGlhbi1saWItc3RhdGUudHMnO1xuaW1wb3J0IHtcbiAgZ2V0TmV3TGlua0Zvcm1hdCxcbiAgc2hvdWxkVXNlV2lraWxpbmtzXG59IGZyb20gJy4vb2JzaWRpYW4tc2V0dGluZ3MudHMnO1xuaW1wb3J0IHtcbiAgZXNjYXBlQWxpYXMsXG4gIGlzUGFyc2VMaW5rRnJvbnRtYXR0ZXJSZWZlcmVuY2UsXG4gIGlzUGFyc2VMaW5rUmVmZXJlbmNlLFxuICBwYXJzZUxpbmtcbn0gZnJvbSAnLi9wYXJzZS1saW5rLnRzJztcbmltcG9ydCB7XG4gIGdldFJlZmVyZW5jZUxpbmtUZXh0LFxuICBpc0NhbnZhc0ZpbGVOb2RlUmVmZXJlbmNlLFxuICBpc1JlZmVyZW5jZUluSGVhZGluZyxcbiAgaXNSZWZlcmVuY2VJbk9mZnNldFJhbmdlLFxuICByZWZlcmVuY2VUb0ZpbGVDaGFuZ2Vcbn0gZnJvbSAnLi9yZWZlcmVuY2UudHMnO1xuXG5jb25zdCBFU0NBUEVEX1dJS0lMSU5LX0RJVklERVIgPSBTdHJpbmcucmF3YFxcfGA7XG5cbi8qKlxuICogTWF0Y2hlcyBhIHdpa2lsaW5rIGRpdmlkZXIgdG9nZXRoZXIgd2l0aCB0aGUgYmFja3NsYXNoIGVzY2FwaW5nIGl0LCBpZiBhbnkuIEEgbG9va2JlaGluZCB3b3VsZCBzYXkgXCJ1bmVzY2FwZWRcIlxuICogZGlyZWN0bHksIGJ1dCBpdCBpcyBhIHN5bnRheCBlcnJvciBvbiBpT1MgYmVmb3JlIDE2LjQsIGJlbG93IHRoZSBpT1MgMTUgT2JzaWRpYW4gbW9iaWxlIHN0aWxsIHN1cHBvcnRzLlxuICogUmVwbGFjaW5nIGV2ZXJ5IG1hdGNoIHdpdGggYW4gZXNjYXBlZCBkaXZpZGVyIGxlYXZlcyBhbiBlc2NhcGVkIG9uZSBhcyBpdCB3YXMgYW5kIGVzY2FwZXMgYSBiYXJlIG9uZS5cbiAqL1xuY29uc3QgT1BUSU9OQUxMWV9FU0NBUEVEX1dJS0lMSU5LX0RJVklERVJfUkVHRVhQID0gL1xcXFw/XFx8L2c7XG5cbi8qKlxuICogVGVzdHMgZm9yIGEgd2lraWxpbmsgZGl2aWRlciBubyBiYWNrc2xhc2ggZXNjYXBlcy4gTm90IGdsb2JhbCwgc28gYSBgdGVzdGAga2VlcHMgbm8gYGxhc3RJbmRleGAgYmV0d2VlbiBjYWxscy5cbiAqL1xuY29uc3QgVU5FU0NBUEVEX1dJS0lMSU5LX0RJVklERVJfUkVHRVhQID0gLyg/Ol58W15cXFxcXSlcXHwvO1xuXG4vKipcbiAqIFRoZSBsaW5rIGlkZW50aXR5IGtleSBwcm92aWRlciBlYWNoIHNuYXBzaG90IHdhcyBidWlsdCB3aXRoLiBLZXB0IGJlc2lkZSB0aGUgc25hcHNob3QgcmF0aGVyIHRoYW4gaW4gaXQsIHNvIGFcbiAqIHNuYXBzaG90IHN0YXlzIGEgcGxhaW4gbWFwIGFuZCB0aGUgb25lIGZ1bmN0aW9uIHRoYXQga2V5ZWQgaXQgaXMgYWxzbyB0aGUgb25lIHRoYXQgbG9va3MgaXQgdXAg4oCUIHBhc3NpbmcgYVxuICogcHJvdmlkZXIgdG8gb25seSBvbmUgb2Yge0BsaW5rIGJ1aWxkQmFja2xpbmtzU25hcHNob3R9IGFuZCB7QGxpbmsgZWRpdEJhY2tsaW5rc1NuYXBzaG90fSB1c2VkIHRvIGxlYXZlIGV2ZXJ5XG4gKiBsaW5rIHVubWF0Y2hlZCwgYW5kIHRoZSBlZGl0IHJld3JvdGUgbm90aGluZyB3aXRob3V0IGEgd29yZC5cbiAqL1xuY29uc3Qgc25hcHNob3RSZWZlcmVuY2VJZGVudGl0eUtleVByb3ZpZGVycyA9IG5ldyBXZWFrTWFwPEJhY2tsaW5rc1NuYXBzaG90PHVua25vd24+LCAocmVmZXJlbmNlOiBSZWZlcmVuY2UpID0+IHN0cmluZz4oKTtcblxuLyoqXG4gKiBBIHN0eWxlIG9mIHRoZSBsaW5rIHBhdGguXG4gKi9cbmV4cG9ydCBlbnVtIExpbmtQYXRoU3R5bGUge1xuICAvKipcbiAgICogVXNlIHRoZSBhYnNvbHV0ZSBwYXRoIGluIHRoZSB2YXVsdC5cbiAgICpcbiAgICogQGV4YW1wbGUgYFtbcGF0aC9mcm9tL3RoZS92YXVsdC9yb290L3RhcmdldF1dYFxuICAgKi9cbiAgQWJzb2x1dGVQYXRoSW5WYXVsdCA9ICdBYnNvbHV0ZVBhdGhJblZhdWx0JyxcblxuICAvKipcbiAgICogVXNlIHRoZSBkZWZhdWx0IGxpbmsgcGF0aCBzdHlsZSBkZWZpbmVkIGluIE9ic2lkaWFuIHNldHRpbmdzLlxuICAgKi9cbiAgT2JzaWRpYW5TZXR0aW5nc0RlZmF1bHQgPSAnT2JzaWRpYW5TZXR0aW5nc0RlZmF1bHQnLFxuXG4gIC8qKlxuICAgKiBVc2UgdGhlIHJlbGF0aXZlIHBhdGggdG8gdGhlIHNvdXJjZS5cbiAgICpcbiAgICogQGV4YW1wbGUgYFtbLi4vLi4vcmVsYXRpdmUvcGF0aC90by90YXJnZXRdXWBcbiAgICovXG4gIFJlbGF0aXZlUGF0aFRvVGhlU291cmNlID0gJ1JlbGF0aXZlUGF0aFRvVGhlU291cmNlJyxcblxuICAvKipcbiAgICogVXNlIHRoZSBzaG9ydGVzdCBwYXRoIHdoZW4gcG9zc2libGUuXG4gICAqXG4gICAqIEBleGFtcGxlIGBbW3Nob3J0ZXN0LXBhdGgtdG8tdGFyZ2V0XV1gXG4gICAqL1xuICBTaG9ydGVzdFBhdGhXaGVuUG9zc2libGUgPSAnU2hvcnRlc3RQYXRoV2hlblBvc3NpYmxlJ1xufVxuXG4vKipcbiAqIEEgc3R5bGUgb2YgdGhlIGxpbmsuXG4gKi9cbmV4cG9ydCBlbnVtIExpbmtTdHlsZSB7XG4gIC8qKlxuICAgKiBGb3JjZSB0aGUgbGluayB0byBiZSBpbiBtYXJrZG93biBmb3JtYXQuXG4gICAqXG4gICAqIEBleGFtcGxlIGBbYWxpYXNdKHBhdGgvdG8vdGFyZ2V0Lm1kKWBcbiAgICovXG4gIE1hcmtkb3duID0gJ01hcmtkb3duJyxcblxuICAvKipcbiAgICogVXNlIHRoZSBkZWZhdWx0IGxpbmsgc3R5bGUgZGVmaW5lZCBpbiBPYnNpZGlhbiBzZXR0aW5ncy5cbiAgICovXG4gIE9ic2lkaWFuU2V0dGluZ3NEZWZhdWx0ID0gJ09ic2lkaWFuU2V0dGluZ3NEZWZhdWx0JyxcblxuICAvKipcbiAgICogUHJlc2VydmUgdGhlIGV4aXN0aW5nIGxpbmsgc3R5bGUuXG4gICAqL1xuICBQcmVzZXJ2ZUV4aXN0aW5nID0gJ1ByZXNlcnZlRXhpc3RpbmcnLFxuXG4gIC8qKlxuICAgKiBGb3JjZSB0aGUgbGluayB0byBiZSBpbiB3aWtpbGluayBmb3JtYXQuXG4gICAqXG4gICAqIEBleGFtcGxlIGBbW3BhdGgvdG8vdGFyZ2V0XV1gXG4gICAqIEBleGFtcGxlIGBbW3BhdGgvdG8vdGFyZ2V0fGFsaWFzXV1gXG4gICAqL1xuICBXaWtpbGluayA9ICdXaWtpbGluaydcbn1cblxuZW51bSBGaW5hbExpbmtQYXRoU3R5bGUge1xuICBBYnNvbHV0ZVBhdGhJblZhdWx0ID0gJ0Fic29sdXRlUGF0aEluVmF1bHQnLFxuICBSZWxhdGl2ZVBhdGhUb1RoZVNvdXJjZSA9ICdSZWxhdGl2ZVBhdGhUb1RoZU5vdGUnLFxuICBTaG9ydGVzdFBhdGhXaGVuUG9zc2libGUgPSAnU2hvcnRlc3RQYXRoV2hlblBvc3NpYmxlJ1xufVxuXG4vKipcbiAqIFBhcmFtcyBwYXNzZWQgdG8gdGhlIGxpbmsgY29udmVydGVyIG9mIHtAbGluayBlZGl0QmFja2xpbmtzU25hcHNob3R9LlxuICpcbiAqIEB0eXBlUGFyYW0gVFBheWxvYWQgLSBUaGUgcGF5bG9hZCByZWNvcmRlZCBmb3IgZWFjaCByZWZlcmVuY2Ugd2hlbiB0aGUgc25hcHNob3Qgd2FzIGJ1aWx0LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEJhY2tsaW5rQ29udmVyc2lvblBhcmFtczxUUGF5bG9hZD4ge1xuICAvKipcbiAgICogVGhlIHBheWxvYWQgY2FwdHVyZWQgZm9yIHRoZSBsaW5rIHdoZW4gdGhlIHNuYXBzaG90IHdhcyBidWlsdC5cbiAgICpcbiAgICogYHVuZGVmaW5lZGAgd2hlbiB0aGUgbGluayBpcyBub3QgaW4gdGhlIHNuYXBzaG90LCB3aGljaCBjYW4gb25seSBoYXBwZW4gaWZcbiAgICoge0BsaW5rIEVkaXRCYWNrbGlua3NTbmFwc2hvdFBhcmFtcy5zaG91bGRWaXNpdFVubWF0Y2hlZFJlZmVyZW5jZXN9IGlzIGB0cnVlYC5cbiAgICovXG4gIHJlYWRvbmx5IHBheWxvYWQ6IFRQYXlsb2FkIHwgdW5kZWZpbmVkO1xuXG4gIC8qKlxuICAgKiBUaGUgcmVmZXJlbmNlIGJlaW5nIGNvbnZlcnRlZC5cbiAgICovXG4gIHJlYWRvbmx5IHJlZmVyZW5jZTogUmVmZXJlbmNlO1xuXG4gIC8qKlxuICAgKiBUaGUgcGF0aCBvZiB0aGUgbm90ZSBob2xkaW5nIHRoZSBsaW5rLlxuICAgKi9cbiAgcmVhZG9ubHkgc291cmNlUGF0aDogc3RyaW5nO1xufVxuXG4vKipcbiAqIFRoZSBtaW5pbWFsIHNoYXBlIHtAbGluayBidWlsZEJhY2tsaW5rc1NuYXBzaG90fSByZWFkcyBhIHNldCBvZiBiYWNrbGlua3MgZnJvbS5cbiAqXG4gKiBCb3RoIGEgYEN1c3RvbUFycmF5RGljdDxSZWZlcmVuY2U+YCDigJQgd2hhdFxuICoge0BsaW5rIC4uL29ic2lkaWFuL21ldGFkYXRhLWNhY2hlIWdldEJhY2tsaW5rc0ZvckZpbGVTYWZlIHwgZ2V0QmFja2xpbmtzRm9yRmlsZVNhZmV9IHJldHVybnMg4oCUIGFuZCBhIHBsYWluXG4gKiBgTWFwPHN0cmluZywgUmVmZXJlbmNlW10+YCBzYXRpc2Z5IGl0LCBzbyBhIGNhbGxlciBjYW4gcGFzcyBlaXRoZXIgd2l0aG91dCBjb252ZXJ0aW5nIGZpcnN0LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEJhY2tsaW5rc0xpa2Uge1xuICAvKipcbiAgICogUmV0dXJucyB0aGUgbGlua3MgdGhlIG5vdGUgYXQgYGtleWAgaG9sZHMsIG9yIGEgbnVsbGlzaCB2YWx1ZSB3aGVuIGl0IGhvbGRzIG5vbmUuXG4gICAqXG4gICAqIEBwYXJhbSBrZXkgLSBUaGUgcGF0aCBvZiB0aGUgYmFja2xpbmstaG9sZGluZyBub3RlLlxuICAgKiBAcmV0dXJucyBUaGUgbGlua3MsIG9yIGEgbnVsbGlzaCB2YWx1ZS5cbiAgICovXG4gIHJlYWRvbmx5IGdldDogKGtleTogc3RyaW5nKSA9PiBudWxsIHwgcmVhZG9ubHkgUmVmZXJlbmNlW10gfCB1bmRlZmluZWQ7XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIHBhdGhzIG9mIHRoZSBiYWNrbGluay1ob2xkaW5nIG5vdGVzLlxuICAgKlxuICAgKiBAcmV0dXJucyBUaGUgcGF0aHMuXG4gICAqL1xuICByZWFkb25seSBrZXlzOiAoKSA9PiBJdGVyYWJsZTxzdHJpbmc+O1xufVxuXG4vKipcbiAqIEEgY2FwdHVyZWQgc25hcHNob3Qgb2YgYSBzZXQgb2YgYmFja2xpbmtzOiB0aGUgcGF0aCBvZiBlYWNoIGJhY2tsaW5rLWhvbGRpbmcgbm90ZSwgbWFwcGVkIHRvIHRoZSBpZGVudGl0eVxuICoga2V5cyBvZiB0aGF0IG5vdGUncyBvd24gbGlua3MgdG8gdGhlIHRhcmdldChzKSwgZWFjaCBtYXBwZWQgdG8gdGhlIHBheWxvYWQgcmVjb3JkZWQgZm9yIGl0LlxuICpcbiAqIFRoZSBzbmFwc2hvdCBleGlzdHMgc28gdGhhdCB0aGUgZmV0Y2ggYW5kIHRoZSByZXdyaXRlIGNhbiBoYXBwZW4gYXQgZGlmZmVyZW50IG1vbWVudHMuIEEgcmVuYW1lIGludmFsaWRhdGVzXG4gKiB0aGUgbWV0YWRhdGEgY2FjaGUgZm9yIHRoZSBvbGQgcGF0aCwgc28gYSBjYWxsZXIgdGhhdCByZXdyaXRlcyBsaW5rcyAqKmFmdGVyKiogcmVuYW1pbmcgaGFzIHRvIGNhcHR1cmUgdGhlXG4gKiBiYWNrbGlua3MgKipiZWZvcmUqKiDigJQgd2hpY2ggaXMgd2h5IHtAbGluayBlZGl0QmFja2xpbmtzU25hcHNob3R9IHRha2VzIGEgc25hcHNob3QgcmF0aGVyIHRoYW4gYSBwYXRoLlxuICpcbiAqIFRoZSBwYXlsb2FkIGlzIHdoYXRldmVyIHRoZSBjYWxsZXIgbmVlZHMgdG8gcmVtZW1iZXIgcGVyIHJlZmVyZW5jZS4gSXQgaXMgYHVuZGVmaW5lZGAgZm9yIGEgc2luZ2xlLXRhcmdldFxuICogcmV3cml0ZSAodGhlIHRhcmdldCBpcyBpbXBsaWVkKSwgYW5kIHRoZSBvbGQgdGFyZ2V0J3MgcGF0aCBmb3IgYSBtdWx0aS10YXJnZXQgb25lLCB3aGVyZSBvbmUgbm90ZSdzIHJlZmVyZW5jZXNcbiAqIG1heSBwb2ludCBhdCBzZXZlcmFsIGZpbGVzIHRoYXQgYWxsIG1vdmVkIGFuZCBlYWNoIHJlZmVyZW5jZSBoYXMgdG8gYmUgcmVzb2x2ZWQgdG8gaXRzIG93biBuZXcgcGF0aC5cbiAqXG4gKiBAdHlwZVBhcmFtIFRQYXlsb2FkIC0gVGhlIHBheWxvYWQgcmVjb3JkZWQgZm9yIGVhY2ggcmVmZXJlbmNlLlxuICovXG5leHBvcnQgdHlwZSBCYWNrbGlua3NTbmFwc2hvdDxUUGF5bG9hZD4gPSBSZWFkb25seU1hcDxzdHJpbmcsIFJlYWRvbmx5TWFwPHN0cmluZywgVFBheWxvYWQ+PjtcblxuLyoqXG4gKiBQYXJhbXMgZm9yIHtAbGluayBidWlsZEJhY2tsaW5rc1NuYXBzaG90fS5cbiAqXG4gKiBAdHlwZVBhcmFtIFRQYXlsb2FkIC0gVGhlIHBheWxvYWQgcmVjb3JkZWQgZm9yIGVhY2ggcmVmZXJlbmNlLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEJ1aWxkQmFja2xpbmtzU25hcHNob3RQYXJhbXM8VFBheWxvYWQ+IHtcbiAgLyoqXG4gICAqIFRoZSBiYWNrbGlua3MgdG8gcmVjb3JkLlxuICAgKi9cbiAgcmVhZG9ubHkgYmFja2xpbmtzOiBCYWNrbGlua3NMaWtlO1xuXG4gIC8qKlxuICAgKiBSZXdyaXRlcyB0aGUgcGF0aCBvZiBhIGJhY2tsaW5rLWhvbGRpbmcgbm90ZSBhcyBpdCB3aWxsIGJlICoqYWZ0ZXIqKiB0aGUgb3BlcmF0aW9uLlxuICAgKlxuICAgKiBBIG5vdGUgdGhhdCBob2xkcyBhIGJhY2tsaW5rIGNhbiBpdHNlbGYgYmUgcmVuYW1lZCBvciBtb3ZlZCBieSB0aGUgc2FtZSBvcGVyYXRpb24g4oCUIGluY2x1ZGluZyB0aGVcbiAgICogcmVuYW1lZCBub3RlJ3Mgb3duIHNlbGYtbGlua3MuIFJlbWFwcGluZyBoZXJlIGtleXMgdGhlIHNuYXBzaG90IGJ5IHRoZSBwYXRoIHRoZSByZXdyaXRlIHdpbGwgYWN0dWFsbHlcbiAgICogb3Blbi5cbiAgICpcbiAgICogQGRlZmF1bHQgdGhlIGlkZW50aXR5IGZ1bmN0aW9uXG4gICAqL1xuICByZWFkb25seSBwYXRoUmVtYXBwZXI/OiAoYmFja2xpbmtQYXRoOiBzdHJpbmcpID0+IHN0cmluZztcblxuICAvKipcbiAgICogUHJvZHVjZXMgdGhlIHBheWxvYWQgdG8gcmVjb3JkIGZvciBhIGxpbmsuIFNlZSB7QGxpbmsgQmFja2xpbmtzU25hcHNob3R9IGZvciB3aGF0IGEgcGF5bG9hZCBpcyBmb3IuXG4gICAqXG4gICAqIEBwYXJhbSByZWZlcmVuY2UgLSBUaGUgcmVmZXJlbmNlIGJlaW5nIHJlY29yZGVkLlxuICAgKiBAcmV0dXJucyBUaGUgcGF5bG9hZC5cbiAgICovXG4gIHJlYWRvbmx5IHBheWxvYWRQcm92aWRlcjogKHJlZmVyZW5jZTogUmVmZXJlbmNlKSA9PiBUUGF5bG9hZDtcblxuICAvKipcbiAgICogQ29tcHV0ZXMgdGhlIGlkZW50aXR5IGtleSBvZiBhIGxpbmsuXG4gICAqXG4gICAqIFRoZSBzbmFwc2hvdCByZW1lbWJlcnMgaXQsIHNvIHtAbGluayBlZGl0QmFja2xpbmtzU25hcHNob3R9IGxvb2tzIHRoZSBsaW5rcyB1cCB3aXRoIHRoZSBzYW1lIGZ1bmN0aW9uXG4gICAqIHdpdGhvdXQgYmVpbmcgdG9sZC4gV2hlbiB7QGxpbmsgQnVpbGRCYWNrbGlua3NTbmFwc2hvdFBhcmFtcy50YXJnZXR9IHdhcyBidWlsdCB3aXRoIGEgcHJvdmlkZXIsIG9taXR0aW5nXG4gICAqIHRoaXMgcmV1c2VzIHRoYXQgb25lLCBhbmQgcGFzc2luZyBhIGRpZmZlcmVudCBvbmUgdGhyb3dzOiBhIHNuYXBzaG90IGtleWVkIGJ5IHR3byBmdW5jdGlvbnMgbWF0Y2hlc1xuICAgKiBub3RoaW5nLlxuICAgKlxuICAgKiBAZGVmYXVsdCB0aGUgcHJvdmlkZXIgYHRhcmdldGAgd2FzIGJ1aWx0IHdpdGgsIGVsc2UgYEpTT04uc3RyaW5naWZ5YFxuICAgKi9cbiAgcmVhZG9ubHkgcmVmZXJlbmNlSWRlbnRpdHlLZXlQcm92aWRlcj86IChyZWZlcmVuY2U6IFJlZmVyZW5jZSkgPT4gc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBBbiBleGlzdGluZyBzbmFwc2hvdCB0byBtZXJnZSBpbnRvLCBzbyBzZXZlcmFsIHNldHMgb2YgYmFja2xpbmtzIGNhbiBiZSBhY2N1bXVsYXRlZCBpbnRvIG9uZS5cbiAgICpcbiAgICogTWVyZ2luZyBpcyB3aGF0IG1ha2VzIGEgc2luZ2xlIHJld3JpdGUgcGFzcyBwZXIgbm90ZSBwb3NzaWJsZSB3aGVuIGEgbm90ZSBsaW5rcyB0byBzZXZlcmFsIG1vdmVkXG4gICAqIHRhcmdldHM6IHdpdGhvdXQgaXQsIGNhbGxpbmcgdGhlIHJld3JpdGUgb25jZSBwZXIgdGFyZ2V0IHdvdWxkIG9wZW4g4oCUIGFuZCB3cml0ZSDigJQgdGhlIHNhbWUgbm90ZVxuICAgKiByZXBlYXRlZGx5LlxuICAgKlxuICAgKiBXaGVuIG9taXR0ZWQsIGEgbmV3IHNuYXBzaG90IGlzIGNyZWF0ZWQuXG4gICAqL1xuICByZWFkb25seSB0YXJnZXQ/OiBNdXRhYmxlQmFja2xpbmtzU25hcHNob3Q8VFBheWxvYWQ+O1xufVxuXG4vKipcbiAqIFBhcmFtcyBmb3Ige0BsaW5rIGNvbnZlcnRMaW5rfS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDb252ZXJ0TGlua1BhcmFtcyB7XG4gIC8qKlxuICAgKiBBbiBPYnNpZGlhbiBhcHAgaW5zdGFuY2UuXG4gICAqL1xuICByZWFkb25seSBhcHA6IEFwcDtcblxuICAvKipcbiAgICogV2hldGhlciB0byBhbGxvdyBhbiBlbXB0eSBhbGlhcyBmb3IgZW1iZWRzLlxuICAgKlxuICAgKiBBcHBsaWNhYmxlIG9ubHkgaWYgdGhlIHJlc3VsdCBsaW5rIHN0eWxlIGlzIHtAbGluayBMaW5rU3R5bGUuTWFya2Rvd259LlxuICAgKlxuICAgKiBJZiBgdHJ1ZWA6IGAhW10oZm9vLnBuZylgLlxuICAgKlxuICAgKiBJZiBgZmFsc2VgOiBgIVtmb29dKGZvby5wbmcpYC5cbiAgICpcbiAgICogQGRlZmF1bHQgYHRydWVgXG4gICAqL1xuICByZWFkb25seSBpc0VtcHR5RW1iZWRBbGlhc0FsbG93ZWQ/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBBIHN0eWxlIG9mIHRoZSBsaW5rIHBhdGguXG4gICAqL1xuICByZWFkb25seSBsaW5rUGF0aFN0eWxlPzogTGlua1BhdGhTdHlsZTtcblxuICAvKipcbiAgICogQSBzdHlsZSBvZiB0aGUgbGluay5cbiAgICovXG4gIHJlYWRvbmx5IGxpbmtTdHlsZT86IExpbmtTdHlsZTtcblxuICAvKipcbiAgICogQSBzb3VyY2UgZmlsZSBjb250YWluaW5nIHRoZSBsaW5rLlxuICAgKi9cbiAgcmVhZG9ubHkgbmV3U291cmNlUGF0aE9yRmlsZTogUGF0aE9yRmlsZTtcblxuICAvKipcbiAgICogQW4gb2xkIHBhdGggb2YgdGhlIGxpbmsuXG4gICAqL1xuICByZWFkb25seSBvbGRTb3VyY2VQYXRoT3JGaWxlPzogUGF0aE9yRmlsZTtcblxuICAvKipcbiAgICogVGhlIHJlZmVyZW5jZSB3aG9zZSBsaW5rIGlzIGNvbnZlcnRlZC5cbiAgICovXG4gIHJlYWRvbmx5IHJlZmVyZW5jZTogUmVmZXJlbmNlO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRvIGVzY2FwZSB0aGUgYWxpYXMuXG4gICAqXG4gICAqIEFwcGxpY2FibGUgb25seSBpZiB0aGUgcmVzdWx0IGxpbmsgc3R5bGUgaXMge0BsaW5rIExpbmtTdHlsZS5NYXJrZG93bn0uXG4gICAqXG4gICAqIElmIGB0cnVlYDogYFtcXCpcXCphbGlhc1xcKlxcKl0obGluay5tZClgLlxuICAgKlxuICAgKiBJZiBgZmFsc2VgOiBgWyoqYWxpYXMqKl0obGluay5tZClgLlxuICAgKlxuICAgKiBAZGVmYXVsdCBgZmFsc2VgXG4gICAqL1xuICByZWFkb25seSBzaG91bGRFc2NhcGVBbGlhcz86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdG8gaW5jbHVkZSB0aGUgYXR0YWNobWVudCBleHRlbnNpb24gaW4gdGhlIGVtYmVkIGFsaWFzLlxuICAgKlxuICAgKiBBcHBsaWNhYmxlIG9ubHkgaWYge0BsaW5rIGlzRW1wdHlFbWJlZEFsaWFzQWxsb3dlZH0gaXMgYGZhbHNlYC5cbiAgICpcbiAgICogSWYgYHRydWVgOiBgW2Zvby5wbmddKGZvby5wbmcpYC5cbiAgICpcbiAgICogSWYgYGZhbHNlYDogYFtmb29dKGZvby5wbmcpYC5cbiAgICpcbiAgICogQGRlZmF1bHQgYGZhbHNlYFxuICAgKi9cbiAgcmVhZG9ubHkgc2hvdWxkSW5jbHVkZUF0dGFjaG1lbnRFeHRlbnNpb25Ub0VtYmVkQWxpYXM/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRvIHVwZGF0ZSBmaWxlIG5hbWUgYWxpYXMuXG4gICAqXG4gICAqIEBkZWZhdWx0IGB0cnVlYFxuICAgKi9cbiAgcmVhZG9ubHkgc2hvdWxkVXBkYXRlRmlsZU5hbWVBbGlhcz86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIEluZGljYXRlcyBpZiB0aGUgbGluayBzaG91bGQgdXNlIGFuZ2xlIGJyYWNrZXRzLlxuICAgKlxuICAgKiBBcHBsaWNhYmxlIG9ubHkgaWYge0BsaW5rIGxpbmtTdHlsZX0gaXMge0BsaW5rIExpbmtTdHlsZS5NYXJrZG93bn0uXG4gICAqXG4gICAqIElmIGB0cnVlYDogYFthbGlhc10oPHBhdGggd2l0aCBzcGFjZXMubWQ+KWAuXG4gICAqXG4gICAqIElmIGBmYWxzZWA6IGBbYWxpYXNdKHBhdGglMjB3aXRoJTIwc3BhY2VzLm1kKWAuXG4gICAqXG4gICAqIEBkZWZhdWx0IGBmYWxzZWBcbiAgICovXG4gIHJlYWRvbmx5IHNob3VsZFVzZUFuZ2xlQnJhY2tldHM/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBJbmRpY2F0ZXMgaWYgdGhlIGxpbmsgc2hvdWxkIHVzZSBhIGxlYWRpbmcgZG90LlxuICAgKlxuICAgKiBBcHBsaWNhYmxlIG9ubHkgaWYge0BsaW5rIGxpbmtQYXRoU3R5bGV9IGlzIHtAbGluayBMaW5rUGF0aFN0eWxlLlJlbGF0aXZlUGF0aFRvVGhlU291cmNlfS5cbiAgICpcbiAgICogSWYgYHRydWVgOiBgW1suL3JlbGF0aXZlL3BhdGgvdG8vdGFyZ2V0XV1gXG4gICAqXG4gICAqIElmIGBmYWxzZWA6IGBbW3JlbGF0aXZlL3BhdGgvdG8vdGFyZ2V0XV1gXG4gICAqXG4gICAqIEBkZWZhdWx0IGBmYWxzZWBcbiAgICovXG4gIHJlYWRvbmx5IHNob3VsZFVzZUxlYWRpbmdEb3RGb3JSZWxhdGl2ZVBhdGhzPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogSW5kaWNhdGVzIGlmIHRoZSBsaW5rIHNob3VsZCB1c2UgYSBsZWFkaW5nIHNsYXNoLlxuICAgKlxuICAgKiBBcHBsaWNhYmxlIG9ubHkgaWYge0BsaW5rIGxpbmtQYXRoU3R5bGV9IGlzIHtAbGluayBMaW5rUGF0aFN0eWxlLkFic29sdXRlUGF0aEluVmF1bHR9LlxuICAgKlxuICAgKiBJZiBgdHJ1ZWA6IGBbWy9hYnNvbHV0ZS9wYXRoL3RvL3RhcmdldF1dYFxuICAgKlxuICAgKiBJZiBgZmFsc2VgOiBgW1thYnNvbHV0ZS9wYXRoL3RvL3RhcmdldF1dYFxuICAgKlxuICAgKiBAZGVmYXVsdCBgZmFsc2VgXG4gICAqL1xuICByZWFkb25seSBzaG91bGRVc2VMZWFkaW5nU2xhc2hGb3JBYnNvbHV0ZVBhdGhzPzogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBPcHRpb25zIGZvciB7QGxpbmsgZWRpdEJhY2tsaW5rc30uXG4gKi9cbmV4cG9ydCB0eXBlIEVkaXRCYWNrbGlua3NPcHRpb25zID0gUHJvY2Vzc09wdGlvbnM7XG5cbi8qKlxuICogUGFyYW1ldGVycyBmb3Ige0BsaW5rIGVkaXRCYWNrbGlua3N9LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEVkaXRCYWNrbGlua3NQYXJhbXMgZXh0ZW5kcyBFZGl0QmFja2xpbmtzT3B0aW9ucyB7XG4gIC8qKlxuICAgKiBUaGUgT2JzaWRpYW4gYXBwbGljYXRpb24gaW5zdGFuY2UuXG4gICAqL1xuICByZWFkb25seSBhcHA6IEFwcDtcblxuICAvKipcbiAgICogQW4gb3B0aW9uYWwgcmVwb3J0ZXIgaW52b2tlZCBvbmNlIHBlciBiYWNrbGluayBmaWxlIGFmdGVyIGl0cyBsaW5rcyBhcmUgdXBkYXRlZCwgd2l0aCB0aGUgcnVubmluZ1xuICAgKiBjb3VudCBvZiBwcm9jZXNzZWQgZmlsZXMgYW5kIHRoZSB0b3RhbC4gV2hlbiBvbWl0dGVkLCBubyBwcm9ncmVzcyBpcyByZXBvcnRlZC5cbiAgICovXG4gIHJlYWRvbmx5IGxpbmtVcGRhdGVQcm9ncmVzc1JlcG9ydGVyPzogTGlua1VwZGF0ZVByb2dyZXNzUmVwb3J0ZXI7XG5cbiAgLyoqXG4gICAqIFRoZSBwYXRoIG9yIGZpbGUgdG8gZWRpdCB0aGUgYmFja2xpbmtzIGZvci5cbiAgICovXG4gIHJlYWRvbmx5IHBhdGhPckZpbGU6IFBhdGhPckZpbGU7XG5cbiAgLyoqXG4gICAqIFRoZSBmdW5jdGlvbiB0aGF0IGNvbnZlcnRzIGVhY2ggcmVmZXJlbmNlLlxuICAgKi9cbiAgcmVhZG9ubHkgcmVmZXJlbmNlQ29udmVydGVyOiAocmVmZXJlbmNlOiBSZWZlcmVuY2UpID0+IFByb21pc2FibGU8TWF5YmVSZXR1cm48c3RyaW5nPj47XG59XG5cbi8qKlxuICogT3B0aW9ucyBmb3Ige0BsaW5rIGVkaXRCYWNrbGlua3NTbmFwc2hvdH0uXG4gKi9cbmV4cG9ydCB0eXBlIEVkaXRCYWNrbGlua3NTbmFwc2hvdE9wdGlvbnMgPSBQcm9jZXNzT3B0aW9ucztcblxuLyoqXG4gKiBQYXJhbWV0ZXJzIGZvciB7QGxpbmsgZWRpdEJhY2tsaW5rc1NuYXBzaG90fS5cbiAqXG4gKiBAdHlwZVBhcmFtIFRQYXlsb2FkIC0gVGhlIHBheWxvYWQgcmVjb3JkZWQgZm9yIGVhY2ggcmVmZXJlbmNlIHdoZW4gdGhlIHNuYXBzaG90IHdhcyBidWlsdC5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBFZGl0QmFja2xpbmtzU25hcHNob3RQYXJhbXM8VFBheWxvYWQ+IGV4dGVuZHMgRWRpdEJhY2tsaW5rc1NuYXBzaG90T3B0aW9ucyB7XG4gIC8qKlxuICAgKiBUaGUgT2JzaWRpYW4gYXBwbGljYXRpb24gaW5zdGFuY2UuXG4gICAqL1xuICByZWFkb25seSBhcHA6IEFwcDtcblxuICAvKipcbiAgICogQW4gb3B0aW9uYWwgcmVwb3J0ZXIgaW52b2tlZCBvbmNlIHBlciBiYWNrbGluayBmaWxlIGFmdGVyIGl0cyBsaW5rcyBhcmUgdXBkYXRlZCwgd2l0aCB0aGUgcnVubmluZ1xuICAgKiBjb3VudCBvZiBwcm9jZXNzZWQgZmlsZXMgYW5kIHRoZSB0b3RhbC4gV2hlbiBvbWl0dGVkLCBubyBwcm9ncmVzcyBpcyByZXBvcnRlZC5cbiAgICovXG4gIHJlYWRvbmx5IGxpbmtVcGRhdGVQcm9ncmVzc1JlcG9ydGVyPzogTGlua1VwZGF0ZVByb2dyZXNzUmVwb3J0ZXI7XG5cbiAgLyoqXG4gICAqIFRoZSBmdW5jdGlvbiB0aGF0IGNvbnZlcnRzIGVhY2ggcmVmZXJlbmNlLlxuICAgKi9cbiAgcmVhZG9ubHkgcmVmZXJlbmNlQ29udmVydGVyOiAocGFyYW1zOiBCYWNrbGlua0NvbnZlcnNpb25QYXJhbXM8VFBheWxvYWQ+KSA9PiBQcm9taXNhYmxlPE1heWJlUmV0dXJuPHN0cmluZz4+O1xuXG4gIC8qKlxuICAgKiBDb21wdXRlcyB0aGUgaWRlbnRpdHkga2V5IG9mIGEgbGluay5cbiAgICpcbiAgICogTGVhdmUgaXQgb3V0IGZvciBhIHNuYXBzaG90IG1hZGUgYnkge0BsaW5rIGJ1aWxkQmFja2xpbmtzU25hcHNob3R9OiB0aGUgc25hcHNob3QgY2FycmllcyB0aGUgcHJvdmlkZXIgaXQgd2FzXG4gICAqIGJ1aWx0IHdpdGgsIGFuZCB0aGF0IG9uZSBpcyB1c2VkLiBQYXNzaW5nIGEgZGlmZmVyZW50IG9uZSB0aHJvd3MsIGJlY2F1c2UgdGhlIHNuYXBzaG90IGlzIGtleWVkIGJ5IHRoZVxuICAgKiBvdGhlciBhbmQgbm90IGEgc2luZ2xlIGxpbmsgd291bGQgbWF0Y2gg4oCUIHRoZSBlZGl0IHdvdWxkIGNvbXBsZXRlIGFuZCByZXdyaXRlIG5vdGhpbmcuIEl0IGlzIG5lZWRlZCBvbmx5XG4gICAqIGZvciBhIHNuYXBzaG90IGFzc2VtYmxlZCBieSBoYW5kLlxuICAgKlxuICAgKiBAZGVmYXVsdCB0aGUgcHJvdmlkZXIgdGhlIHNuYXBzaG90IHdhcyBidWlsdCB3aXRoLCBlbHNlIGBKU09OLnN0cmluZ2lmeWBcbiAgICovXG4gIHJlYWRvbmx5IHJlZmVyZW5jZUlkZW50aXR5S2V5UHJvdmlkZXI/OiAocmVmZXJlbmNlOiBSZWZlcmVuY2UpID0+IHN0cmluZztcblxuICAvKipcbiAgICogV2hldGhlciB0aGUgY29udmVydGVyIGlzIGFsc28gc2hvd24gbGlua3MgdGhhdCBhcmUgKipub3QqKiBpbiB0aGUgc25hcHNob3QsIHdpdGggYW4gYHVuZGVmaW5lZGBcbiAgICoge0BsaW5rIEJhY2tsaW5rQ29udmVyc2lvblBhcmFtcy5wYXlsb2FkfS5cbiAgICpcbiAgICogVGhlIGRlZmF1bHQgZmlsdGVycyB0aGVtIG91dCwgd2hpY2ggaXMgd2hhdCBhIHBsYWluIHJlbmFtZSB3YW50czogYSBsaW5rIGFic2VudCBmcm9tIHRoZSBzbmFwc2hvdCB3YXNcbiAgICogZWl0aGVyIG5ldmVyIHRoZSBjYWxsZXIncyB0byByZXdyaXRlLCBvciBoYXMgYWxyZWFkeSBiZWVuIHJld3JpdHRlbiBieSBzb21lb25lIGVsc2UuIFNldCB0aGlzIHRvIGB0cnVlYFxuICAgKiBvbmx5IHdoZW4gdGhlIGNhbGxlciBoYXMgaXRzIG93biByZWFzb24gdG8gbG9vayBhdCB0aGVtIOKAlCBhIHdpZGVuZWQgbWF0Y2ggb2YgaXRzIG93biwgb3IgbG9nZ2luZyBhIHNraXBcbiAgICogdGhhdCB3b3VsZCBvdGhlcndpc2UgYmUgc2lsZW50LlxuICAgKlxuICAgKiBAZGVmYXVsdCBgZmFsc2VgXG4gICAqL1xuICByZWFkb25seSBzaG91bGRWaXNpdFVubWF0Y2hlZFJlZmVyZW5jZXM/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBUaGUgY2FwdHVyZWQgYmFja2xpbmtzIHRvIGVkaXQuXG4gICAqL1xuICByZWFkb25seSBzbmFwc2hvdDogQmFja2xpbmtzU25hcHNob3Q8VFBheWxvYWQ+O1xufVxuXG4vKipcbiAqIFBhcmFtZXRlcnMgZm9yIHtAbGluayBlZGl0UmVmZXJlbmNlc0luQ29udGVudH0uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRWRpdFJlZmVyZW5jZXNJbkNvbnRlbnRQYXJhbXMge1xuICAvKipcbiAgICogVGhlIGFib3J0IHNpZ25hbCB0byBjb250cm9sIHRoZSBleGVjdXRpb24gb2YgdGhlIGZ1bmN0aW9uLlxuICAgKi9cbiAgcmVhZG9ubHkgYWJvcnRTaWduYWw/OiBBYm9ydFNpZ25hbDtcblxuICAvKipcbiAgICogVGhlIE9ic2lkaWFuIGFwcGxpY2F0aW9uIGluc3RhbmNlLlxuICAgKi9cbiAgcmVhZG9ubHkgYXBwOiBBcHA7XG5cbiAgLyoqXG4gICAqIFRoZSBjb250ZW50IHRvIGVkaXQgdGhlIGxpbmtzIGluLlxuICAgKi9cbiAgcmVhZG9ubHkgY29udGVudDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBBIHJhbmdlIHdpdGhpbiB7QGxpbmsgRWRpdFJlZmVyZW5jZXNJbkNvbnRlbnRQYXJhbXMuY29udGVudH0sIGluIGNoYXJhY3RlciBvZmZzZXRzLCByZXN0cmljdGluZyB0aGUgcGFzcyB0b1xuICAgKiB0aGUgbGlua3MgaW5zaWRlIGl0LiBXaGVuIG9taXR0ZWQsIGV2ZXJ5IGxpbmsgaXMgdmlzaXRlZC5cbiAgICpcbiAgICogQSBsaW5rIGlzIGVkaXRlZCBvbmx5IHdoZW4gaXQgaXMgKipmdWxseSBjb250YWluZWQqKiBpbiB0aGUgcmFuZ2U7IG9uZSB0aGF0IG1lcmVseSBvdmVybGFwcyBpdCBpcyBsZWZ0XG4gICAqIGFsb25lLCBiZWNhdXNlIHJld3JpdGluZyBwYXJ0IG9mIGEgbGluayBjb3JydXB0cyBpdC4gQm90aCBib3VuZHMgYXJlIGluY2x1c2l2ZSwgc28gYSByYW5nZSB3aG9zZVxuICAgKiBvZmZzZXRzIGNvaW5jaWRlIGV4YWN0bHkgd2l0aCBhIGxpbmsncyBkb2VzIGluY2x1ZGUgdGhhdCBsaW5rLlxuICAgKlxuICAgKiBBIHJlZmVyZW5jZSB0aGF0IGNhcnJpZXMgbm8gcG9zaXRpb24gd2l0aGluIHRoZSBjb250ZW50IOKAlCBhIGZyb250bWF0dGVyIGxpbmssIGEgbXVsdGktbGluayBmcm9udG1hdHRlclxuICAgKiB2YWx1ZSBlbnRyeSwgb3IgYW55IGNhbnZhcyByZWZlcmVuY2Ug4oCUIGlzIG5ldmVyIGluIHJhbmdlIGFuZCBpcyBza2lwcGVkIHdoZW5ldmVyIGEgcmFuZ2UgaXMgc3VwcGxpZWQuXG4gICAqXG4gICAqIEBkZWZhdWx0IGB1bmRlZmluZWRgXG4gICAqL1xuICByZWFkb25seSBvZmZzZXRSYW5nZT86IE9mZnNldFJhbmdlO1xuXG4gIC8qKlxuICAgKiBUaGUgZnVuY3Rpb24gdGhhdCBjb252ZXJ0cyBlYWNoIHJlZmVyZW5jZS5cbiAgICovXG4gIHJlYWRvbmx5IHJlZmVyZW5jZUNvbnZlcnRlcjogKHJlZmVyZW5jZTogUmVmZXJlbmNlKSA9PiBQcm9taXNhYmxlPE1heWJlUmV0dXJuPHN0cmluZz4+O1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRvIGFsc28gZWRpdCBleHRlcm5hbCBsaW5rcyBwYXJzZWQgZnJvbSB0aGUgbm90ZSBib2R5LiBXaGVuIGB0cnVlYCwgdGhlIGNvbnZlcnRlciBhbHNvXG4gICAqIHJlY2VpdmVzIHJlZmVyZW5jZXMgZm9yIGV4dGVybmFsIGxpbmtzLlxuICAgKlxuICAgKiBAZGVmYXVsdCBgZmFsc2VgXG4gICAqL1xuICByZWFkb25seSBzaG91bGRFZGl0RXh0ZXJuYWxMaW5rcz86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdG8gYWxzbyBlZGl0IGV4dGVybmFsIGxpbmtzIHBhcnNlZCBmcm9tIGZyb250bWF0dGVyIHZhbHVlcy4gV2hlbiBgdHJ1ZWAsIHRoZSBjb252ZXJ0ZXIgYWxzb1xuICAgKiByZWNlaXZlcyByZWZlcmVuY2VzIGZvciBmcm9udG1hdHRlciBleHRlcm5hbCBsaW5rcy5cbiAgICpcbiAgICogQGRlZmF1bHQgYGZhbHNlYFxuICAgKi9cbiAgcmVhZG9ubHkgc2hvdWxkRWRpdEZyb250bWF0dGVyRXh0ZXJuYWxMaW5rcz86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdG8gYWxzbyBlZGl0IGV4dGVybmFsIGxpbmtzIHBhcnNlZCBmcm9tIG11bHRpLWxpbmsgKG11bHRpLXZhbHVlKSBmcm9udG1hdHRlciB2YWx1ZXMuIFdoZW5cbiAgICogYHRydWVgLCB0aGUgY29udmVydGVyIGFsc28gcmVjZWl2ZXMgcmVmZXJlbmNlcyBmb3IgZWFjaCBleHRlcm5hbCBsaW5rIHdpdGhpbiBhIG11bHRpLWxpbmsgZnJvbnRtYXR0ZXJcbiAgICogdmFsdWUgKGVhY2ggbG9jYXRlZCBieSBpdHMgb2Zmc2V0cywgc28gb25seSB0aGF0IGxpbmsgaXMgc3BsaWNlZCBiYWNrIGluIHBsYWNlKS5cbiAgICpcbiAgICogQGRlZmF1bHQgYGZhbHNlYFxuICAgKi9cbiAgcmVhZG9ubHkgc2hvdWxkRWRpdE11bHRpVmFsdWVGcm9udG1hdHRlckV4dGVybmFsTGlua3M/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBBIHByZWRpY2F0ZSBjaG9vc2luZyBsaW5rcyB0byBsZWF2ZSB1bmNoYW5nZWQ6IGZvciBlYWNoIHJlZmVyZW5jZSBpdCByZXR1cm5zIGB0cnVlYCBmb3IsIHRoZSBjb252ZXJ0ZXIgaXNcbiAgICogbm90IGNhbGxlZCwgc28gdGhlIGxpbmsgc3RheXMgYnl0ZS1mb3ItYnl0ZSBhcyB3cml0dGVuIOKAlCBpdHMgcGF0aCwgc3R5bGUsIGFuZ2xlIGJyYWNrZXRzIGFuZCBsZWFkaW5nIGRvdFxuICAgKiBpbmNsdWRlZC4gVXNlIGl0IHRvIGV4Y2x1ZGUgbGlua3MgdGhlIGNhbGxlciBkZWNpZGVzIG9uLCBmb3IgZXhhbXBsZSBieSB0aGVpciByZXNvbHZlZCB0YXJnZXQgcGF0aC5cbiAgICpcbiAgICogQXBwbGllZCBhZnRlciB0aGUge0BsaW5rIGlzUmVmZXJlbmNlSW5IZWFkaW5nIHwgaGVhZGluZ30gc2tpcCBhbmQgdGhlIG9mZnNldCByYW5nZS5cbiAgICpcbiAgICogQGRlZmF1bHQgYHVuZGVmaW5lZGBcbiAgICovXG4gIHJlYWRvbmx5IHNob3VsZFNraXBSZWZlcmVuY2U/OiAocmVmZXJlbmNlOiBSZWZlcmVuY2UpID0+IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdG8gbGVhdmUgZXZlcnkgbGluayBpbnNpZGUgYSBoZWFkaW5nIHVuY2hhbmdlZDogdGhlIGNvbnZlcnRlciBpcyBub3QgY2FsbGVkIGZvciBpdCwgc28gaXQgc3RheXNcbiAgICogYnl0ZS1mb3ItYnl0ZSBhcyB3cml0dGVuLiBBIGxpbmsgaW4gYSBoZWFkaW5nIGlzIHBhcnQgb2YgdGhlIGhlYWRpbmcncyB0ZXh0LCBzbyByZXdyaXRpbmcgaXQgY2hhbmdlc1xuICAgKiB0aGF0IHRleHQgYW5kIGJyZWFrcyBldmVyeSBgI2hlYWRpbmdgIHN1YnBhdGggcG9pbnRpbmcgYXQgdGhlIGhlYWRpbmcuIFNlZSB7QGxpbmsgaXNSZWZlcmVuY2VJbkhlYWRpbmd9LlxuICAgKlxuICAgKiBAZGVmYXVsdCBgZmFsc2VgXG4gICAqL1xuICByZWFkb25seSBzaG91bGRTa2lwUmVmZXJlbmNlc0luSGVhZGluZ3M/OiBib29sZWFuO1xufVxuXG4vKipcbiAqIE9wdGlvbnMgZm9yIHtAbGluayBlZGl0UmVmZXJlbmNlc30uXG4gKi9cbmV4cG9ydCB0eXBlIEVkaXRSZWZlcmVuY2VzT3B0aW9ucyA9IFByb2Nlc3NPcHRpb25zO1xuXG4vKipcbiAqIFBhcmFtZXRlcnMgZm9yIHtAbGluayBlZGl0UmVmZXJlbmNlc30uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRWRpdFJlZmVyZW5jZXNQYXJhbXMgZXh0ZW5kcyBFZGl0UmVmZXJlbmNlc09wdGlvbnMge1xuICAvKipcbiAgICogVGhlIE9ic2lkaWFuIGFwcGxpY2F0aW9uIGluc3RhbmNlLlxuICAgKi9cbiAgcmVhZG9ubHkgYXBwOiBBcHA7XG5cbiAgLyoqXG4gICAqIEEgcmFuZ2Ugd2l0aGluIHRoZSBmaWxlJ3MgY29udGVudCwgaW4gY2hhcmFjdGVyIG9mZnNldHMsIHJlc3RyaWN0aW5nIHRoZSBwYXNzIHRvIHRoZSBsaW5rcyBpbnNpZGUgaXQuXG4gICAqIFdoZW4gb21pdHRlZCwgZXZlcnkgbGluayBpcyB2aXNpdGVkLlxuICAgKlxuICAgKiBBIGxpbmsgaXMgZWRpdGVkIG9ubHkgd2hlbiBpdCBpcyAqKmZ1bGx5IGNvbnRhaW5lZCoqIGluIHRoZSByYW5nZTsgb25lIHRoYXQgbWVyZWx5IG92ZXJsYXBzIGl0IGlzIGxlZnRcbiAgICogYWxvbmUsIGJlY2F1c2UgcmV3cml0aW5nIHBhcnQgb2YgYSBsaW5rIGNvcnJ1cHRzIGl0LiBCb3RoIGJvdW5kcyBhcmUgaW5jbHVzaXZlLCBzbyBhIHJhbmdlIHdob3NlXG4gICAqIG9mZnNldHMgY29pbmNpZGUgZXhhY3RseSB3aXRoIGEgbGluaydzIGRvZXMgaW5jbHVkZSB0aGF0IGxpbmsuXG4gICAqXG4gICAqIEEgcmVmZXJlbmNlIHRoYXQgY2FycmllcyBubyBwb3NpdGlvbiB3aXRoaW4gdGhlIGZpbGUncyBjb250ZW50IOKAlCBhIGZyb250bWF0dGVyIGxpbmssIGEgbXVsdGktbGlua1xuICAgKiBmcm9udG1hdHRlciB2YWx1ZSBlbnRyeSwgb3IgYW55IGNhbnZhcyByZWZlcmVuY2Ug4oCUIGlzIG5ldmVyIGluIHJhbmdlIGFuZCBpcyBza2lwcGVkIHdoZW5ldmVyIGEgcmFuZ2UgaXNcbiAgICogc3VwcGxpZWQuXG4gICAqXG4gICAqIFRoZSBvZmZzZXRzIGFyZSBpbnRvIHRoZSBjb250ZW50IHRoaXMgZnVuY3Rpb24gcmVhZHMgZnJvbSB0aGUgdmF1bHQuIEJlZm9yZSByZWFkaW5nLCBpdCBzYXZlcyBhbnlcbiAgICogdW5zYXZlZCBlZGl0b3IgYnVmZmVyIGZvciB0aGUgZmlsZSwgc28gYSByYW5nZSB0YWtlbiBmcm9tIGFuIG9wZW4gZWRpdG9yIHZpYSBgRWRpdG9yLnBvc1RvT2Zmc2V0YCBpc1xuICAgKiB2YWxpZC4gVGhlIGNhbGxlciBvd25zIG9ubHkgdGhlIGNhc2Ugd2hlcmUgdGhlIGJ1ZmZlciBjaGFuZ2VzIGJldHdlZW4gY29tcHV0aW5nIHRoZSByYW5nZSBhbmQgdGhpc1xuICAgKiBjYWxsLlxuICAgKlxuICAgKiBAZGVmYXVsdCBgdW5kZWZpbmVkYFxuICAgKi9cbiAgcmVhZG9ubHkgb2Zmc2V0UmFuZ2U/OiBPZmZzZXRSYW5nZTtcblxuICAvKipcbiAgICogVGhlIHBhdGggb3IgZmlsZSB0byBlZGl0IHRoZSBsaW5rcyBmb3IuXG4gICAqL1xuICByZWFkb25seSBwYXRoT3JGaWxlOiBQYXRoT3JGaWxlO1xuXG4gIC8qKlxuICAgKiBUaGUgZnVuY3Rpb24gdGhhdCBjb252ZXJ0cyBlYWNoIHJlZmVyZW5jZS5cbiAgICovXG4gIHJlYWRvbmx5IHJlZmVyZW5jZUNvbnZlcnRlcjogKHJlZmVyZW5jZTogUmVmZXJlbmNlKSA9PiBQcm9taXNhYmxlPE1heWJlUmV0dXJuPHN0cmluZz4+O1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRvIGFsc28gZWRpdCBleHRlcm5hbCBsaW5rcyBwYXJzZWQgZnJvbSB0aGUgbm90ZSBib2R5LiBXaGVuIGB0cnVlYCwgdGhlIGNvbnZlcnRlciBhbHNvXG4gICAqIHJlY2VpdmVzIHJlZmVyZW5jZXMgZm9yIGV4dGVybmFsIGxpbmtzLlxuICAgKlxuICAgKiBAZGVmYXVsdCBgZmFsc2VgXG4gICAqL1xuICByZWFkb25seSBzaG91bGRFZGl0RXh0ZXJuYWxMaW5rcz86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdG8gYWxzbyBlZGl0IGV4dGVybmFsIGxpbmtzIHBhcnNlZCBmcm9tIGZyb250bWF0dGVyIHZhbHVlcy4gV2hlbiBgdHJ1ZWAsIHRoZSBjb252ZXJ0ZXIgYWxzb1xuICAgKiByZWNlaXZlcyByZWZlcmVuY2VzIGZvciBmcm9udG1hdHRlciBleHRlcm5hbCBsaW5rcy5cbiAgICpcbiAgICogQGRlZmF1bHQgYGZhbHNlYFxuICAgKi9cbiAgcmVhZG9ubHkgc2hvdWxkRWRpdEZyb250bWF0dGVyRXh0ZXJuYWxMaW5rcz86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdG8gYWxzbyBlZGl0IGV4dGVybmFsIGxpbmtzIHBhcnNlZCBmcm9tIG11bHRpLWxpbmsgKG11bHRpLXZhbHVlKSBmcm9udG1hdHRlciB2YWx1ZXMuIFdoZW5cbiAgICogYHRydWVgLCB0aGUgY29udmVydGVyIGFsc28gcmVjZWl2ZXMgcmVmZXJlbmNlcyBmb3IgZWFjaCBleHRlcm5hbCBsaW5rIHdpdGhpbiBhIG11bHRpLWxpbmsgZnJvbnRtYXR0ZXJcbiAgICogdmFsdWUgKGVhY2ggbG9jYXRlZCBieSBpdHMgb2Zmc2V0cywgc28gb25seSB0aGF0IGxpbmsgaXMgc3BsaWNlZCBiYWNrIGluIHBsYWNlKS5cbiAgICpcbiAgICogQGRlZmF1bHQgYGZhbHNlYFxuICAgKi9cbiAgcmVhZG9ubHkgc2hvdWxkRWRpdE11bHRpVmFsdWVGcm9udG1hdHRlckV4dGVybmFsTGlua3M/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBBIHByZWRpY2F0ZSBjaG9vc2luZyBsaW5rcyB0byBsZWF2ZSB1bmNoYW5nZWQ6IGZvciBlYWNoIHJlZmVyZW5jZSBpdCByZXR1cm5zIGB0cnVlYCBmb3IsIHRoZSBjb252ZXJ0ZXIgaXNcbiAgICogbm90IGNhbGxlZCwgc28gdGhlIGxpbmsgc3RheXMgYnl0ZS1mb3ItYnl0ZSBhcyB3cml0dGVuIOKAlCBpdHMgcGF0aCwgc3R5bGUsIGFuZ2xlIGJyYWNrZXRzIGFuZCBsZWFkaW5nIGRvdFxuICAgKiBpbmNsdWRlZC4gVXNlIGl0IHRvIGV4Y2x1ZGUgbGlua3MgdGhlIGNhbGxlciBkZWNpZGVzIG9uLCBmb3IgZXhhbXBsZSBieSB0aGVpciByZXNvbHZlZCB0YXJnZXQgcGF0aC5cbiAgICpcbiAgICogQXBwbGllZCBhZnRlciB0aGUge0BsaW5rIGlzUmVmZXJlbmNlSW5IZWFkaW5nIHwgaGVhZGluZ30gc2tpcCBhbmQgdGhlIG9mZnNldCByYW5nZS5cbiAgICpcbiAgICogQGRlZmF1bHQgYHVuZGVmaW5lZGBcbiAgICovXG4gIHJlYWRvbmx5IHNob3VsZFNraXBSZWZlcmVuY2U/OiAocmVmZXJlbmNlOiBSZWZlcmVuY2UpID0+IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdG8gbGVhdmUgZXZlcnkgbGluayBpbnNpZGUgYSBoZWFkaW5nIHVuY2hhbmdlZDogdGhlIGNvbnZlcnRlciBpcyBub3QgY2FsbGVkIGZvciBpdCwgc28gaXQgc3RheXNcbiAgICogYnl0ZS1mb3ItYnl0ZSBhcyB3cml0dGVuLiBBIGxpbmsgaW4gYSBoZWFkaW5nIGlzIHBhcnQgb2YgdGhlIGhlYWRpbmcncyB0ZXh0LCBzbyByZXdyaXRpbmcgaXQgY2hhbmdlc1xuICAgKiB0aGF0IHRleHQgYW5kIGJyZWFrcyBldmVyeSBgI2hlYWRpbmdgIHN1YnBhdGggcG9pbnRpbmcgYXQgdGhlIGhlYWRpbmcuIFNlZSB7QGxpbmsgaXNSZWZlcmVuY2VJbkhlYWRpbmd9LlxuICAgKlxuICAgKiBAZGVmYXVsdCBgZmFsc2VgXG4gICAqL1xuICByZWFkb25seSBzaG91bGRTa2lwUmVmZXJlbmNlc0luSGVhZGluZ3M/OiBib29sZWFuO1xufVxuXG4vKipcbiAqIFBhcmFtZXRlcnMgZm9yIHtAbGluayBleHRyYWN0UmVmZXJlbmNlRmlsZX0uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRXh0cmFjdFJlZmVyZW5jZUZpbGVQYXJhbXMge1xuICAvKipcbiAgICogVGhlIE9ic2lkaWFuIGFwcGxpY2F0aW9uIGluc3RhbmNlLlxuICAgKi9cbiAgcmVhZG9ubHkgYXBwOiBBcHA7XG5cbiAgLyoqXG4gICAqIFRoZSByZWZlcmVuY2UgdG8gcmVzb2x2ZS5cbiAgICovXG4gIHJlYWRvbmx5IHJlZmVyZW5jZTogUmVmZXJlbmNlO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRvIGFsbG93IG5vbi1leGlzdGluZyBmaWxlcy5cbiAgICpcbiAgICogQGRlZmF1bHQgYGZhbHNlYFxuICAgKi9cbiAgcmVhZG9ubHkgc2hvdWxkQWxsb3dOb25FeGlzdGluZ0ZpbGU/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBUaGUgc291cmNlIHBhdGggb3IgZmlsZS5cbiAgICovXG4gIHJlYWRvbmx5IHNvdXJjZVBhdGhPckZpbGU6IFBhdGhPckZpbGU7XG59XG5cbi8qKlxuICogUGFyYW1zIGZvciB7QGxpbmsgZ2VuZXJhdGVNYXJrZG93bkxpbmt9LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEdlbmVyYXRlTWFya2Rvd25MaW5rUGFyYW1zIHtcbiAgLyoqXG4gICAqIEFuIGFsaWFzIGZvciB0aGUgbGluay5cbiAgICpcbiAgICogQGV4YW1wbGUgYFtbYWxpYXN8bGlua11dYFxuICAgKiBAZXhhbXBsZSBgW2FsaWFzXShsaW5rLm1kKWBcbiAgICovXG4gIHJlYWRvbmx5IGFsaWFzPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBBbiBPYnNpZGlhbiBhcHAgaW5zdGFuY2UuXG4gICAqL1xuICByZWFkb25seSBhcHA6IEFwcDtcblxuICAvKipcbiAgICogSW5kaWNhdGVzIGlmIHRoZSBsaW5rIHNob3VsZCBiZSBlbWJlZGRlZC4gSWYgbm90IHByb3ZpZGVkLCBpdCB3aWxsIGJlIGluZmVycmVkIGJhc2VkIG9uIHRoZSBmaWxlIHR5cGUuXG4gICAqXG4gICAqIElmIGB0cnVlYDogYCFbW3RhcmdldF1dYC5cbiAgICpcbiAgICogSWYgYGZhbHNlYDogYFtbdGFyZ2V0XV1gLlxuICAgKi9cbiAgcmVhZG9ubHkgaXNFbWJlZD86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdG8gYWxsb3cgYW4gZW1wdHkgYWxpYXMgZm9yIGVtYmVkcy5cbiAgICpcbiAgICogQXBwbGljYWJsZSBvbmx5IGlmIHRoZSByZXN1bHQgbGluayBzdHlsZSBpcyB7QGxpbmsgTGlua1N0eWxlLk1hcmtkb3dufS5cbiAgICpcbiAgICogSWYgYHRydWVgOiBgIVtdKGZvby5wbmcpYC5cbiAgICpcbiAgICogSWYgYGZhbHNlYDogYCFbZm9vXShmb28ucG5nKWAuXG4gICAqXG4gICAqIEBkZWZhdWx0IGB0cnVlYFxuICAgKi9cbiAgcmVhZG9ubHkgaXNFbXB0eUVtYmVkQWxpYXNBbGxvd2VkPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogV2hldGhlciB0byBhbGxvdyBub24tZXhpc3RpbmcgZmlsZXMuXG4gICAqXG4gICAqIElmIGBmYWxzZWAgYW5kIHtAbGluayB0YXJnZXRQYXRoT3JGaWxlfSBpcyBhIG5vbi1leGlzdGluZyBmaWxlLCBhbiBlcnJvciB3aWxsIGJlIHRocm93bi5cbiAgICpcbiAgICogQGRlZmF1bHQgYGZhbHNlYFxuICAgKi9cbiAgcmVhZG9ubHkgaXNOb25FeGlzdGluZ0ZpbGVBbGxvd2VkPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogV2hldGhlciB0byBhbGxvdyBhIHNpbmdsZSBzdWJwYXRoLlxuICAgKlxuICAgKiBBcHBsaWNhYmxlIG9ubHkgaWYge0BsaW5rIHRhcmdldFBhdGhPckZpbGV9IGFuZCB7QGxpbmsgc291cmNlUGF0aE9yRmlsZX0gYXJlIHRoZSBzYW1lIGZpbGUuXG4gICAqXG4gICAqIElmIGB0cnVlYDogYFtbI3N1YnBhdGhdXWAuXG4gICAqXG4gICAqIElmIGBmYWxzZWA6IGBbW3NvdXJjZSNzdWJwYXRoXV1gXG4gICAqXG4gICAqIEBkZWZhdWx0IGB0cnVlYFxuICAgKi9cbiAgcmVhZG9ubHkgaXNTaW5nbGVTdWJwYXRoQWxsb3dlZD86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIEEgc3R5bGUgb2YgdGhlIGxpbmsgcGF0aC5cbiAgICovXG4gIHJlYWRvbmx5IGxpbmtQYXRoU3R5bGU/OiBMaW5rUGF0aFN0eWxlO1xuXG4gIC8qKlxuICAgKiBBIHN0eWxlIG9mIHRoZSBsaW5rLlxuICAgKi9cbiAgcmVhZG9ubHkgbGlua1N0eWxlPzogTGlua1N0eWxlO1xuXG4gIC8qKlxuICAgKiBBbiBvcmlnaW5hbCBsaW5rIHRleHQuXG4gICAqXG4gICAqIElmIHByb3ZpZGVkLCBpdCB3aWxsIGJlIHVzZWQgdG8gaW5mZXIgdGhlIHZhbHVlcyBvZlxuICAgKlxuICAgKiAtIHtAbGluayBoYXNFbWJlZFN5bnRheH1cbiAgICogLSB7QGxpbmsgbGlua1N0eWxlfVxuICAgKiAtIHtAbGluayBzaG91bGRVc2VBbmdsZUJyYWNrZXRzfVxuICAgKiAtIHtAbGluayBzaG91bGRVc2VMZWFkaW5nRG90Rm9yUmVsYXRpdmVQYXRoc31cbiAgICogLSB7QGxpbmsgc2hvdWxkVXNlTGVhZGluZ1NsYXNoRm9yQWJzb2x1dGVQYXRoc31cbiAgICpcbiAgICogVGhlc2UgaW5mZXJyZWQgdmFsdWVzIHdpbGwgYmUgb3ZlcnJpZGRlbiBieSBjb3JyZXNwb25kaW5nIHNldHRpbmdzIGlmIHNwZWNpZmllZC5cbiAgICovXG4gIHJlYWRvbmx5IG9yaWdpbmFsTGluaz86IHN0cmluZztcblxuICAvKipcbiAgICogV2hldGhlciB0byBlc2NhcGUgdGhlIGFsaWFzLlxuICAgKlxuICAgKiBBcHBsaWNhYmxlIG9ubHkgaWYgdGhlIHJlc3VsdCBsaW5rIHN0eWxlIGlzIHtAbGluayBMaW5rU3R5bGUuTWFya2Rvd259LlxuICAgKlxuICAgKiBJZiBgdHJ1ZWA6IGBbXFwqXFwqYWxpYXNcXCpcXCpdKGxpbmsubWQpYC5cbiAgICpcbiAgICogSWYgYGZhbHNlYDogYFsqKmFsaWFzKipdKGxpbmsubWQpYC5cbiAgICpcbiAgICogQGRlZmF1bHQgYGZhbHNlYFxuICAgKi9cbiAgcmVhZG9ubHkgc2hvdWxkRXNjYXBlQWxpYXM/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRvIGluY2x1ZGUgdGhlIGF0dGFjaG1lbnQgZXh0ZW5zaW9uIGluIHRoZSBlbWJlZCBhbGlhcy5cbiAgICpcbiAgICogQXBwbGljYWJsZSBvbmx5IGlmIHtAbGluayBpc0VtcHR5RW1iZWRBbGlhc0FsbG93ZWR9IGlzIGBmYWxzZWAuXG4gICAqXG4gICAqIElmIGB0cnVlYDogYFtmb28ucG5nXShmb28ucG5nKWAuXG4gICAqXG4gICAqIElmIGBmYWxzZWA6IGBbZm9vXShmb28ucG5nKWAuXG4gICAqXG4gICAqIEBkZWZhdWx0IGBmYWxzZWBcbiAgICovXG4gIHJlYWRvbmx5IHNob3VsZEluY2x1ZGVBdHRhY2htZW50RXh0ZW5zaW9uVG9FbWJlZEFsaWFzPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogSW5kaWNhdGVzIGlmIHRoZSBsaW5rIHNob3VsZCB1c2UgYW5nbGUgYnJhY2tldHMuXG4gICAqXG4gICAqIEFwcGxpY2FibGUgb25seSBpZiB7QGxpbmsgbGlua1N0eWxlfSBpcyB7QGxpbmsgTGlua1N0eWxlLk1hcmtkb3dufS5cbiAgICpcbiAgICogSWYgYHRydWVgOiBgW2FsaWFzXSg8cGF0aCB3aXRoIHNwYWNlcy5tZD4pYC5cbiAgICpcbiAgICogSWYgYGZhbHNlYDogYFthbGlhc10ocGF0aCUyMHdpdGglMjBzcGFjZXMubWQpYC5cbiAgICpcbiAgICogQGRlZmF1bHQgYGZhbHNlYFxuICAgKi9cbiAgcmVhZG9ubHkgc2hvdWxkVXNlQW5nbGVCcmFja2V0cz86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIEluZGljYXRlcyBpZiB0aGUgbGluayBzaG91bGQgdXNlIGEgbGVhZGluZyBkb3QuXG4gICAqXG4gICAqIEFwcGxpY2FibGUgb25seSBpZiB7QGxpbmsgbGlua1BhdGhTdHlsZX0gaXMge0BsaW5rIExpbmtQYXRoU3R5bGUuUmVsYXRpdmVQYXRoVG9UaGVTb3VyY2V9LlxuICAgKlxuICAgKiBJZiBgdHJ1ZWA6IGBbWy4vcmVsYXRpdmUvcGF0aC90by90YXJnZXRdXWBcbiAgICpcbiAgICogSWYgYGZhbHNlYDogYFtbcmVsYXRpdmUvcGF0aC90by90YXJnZXRdXWBcbiAgICpcbiAgICogQGRlZmF1bHQgYGZhbHNlYFxuICAgKi9cbiAgcmVhZG9ubHkgc2hvdWxkVXNlTGVhZGluZ0RvdEZvclJlbGF0aXZlUGF0aHM/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBJbmRpY2F0ZXMgaWYgdGhlIGxpbmsgc2hvdWxkIHVzZSBhIGxlYWRpbmcgc2xhc2guXG4gICAqXG4gICAqIEFwcGxpY2FibGUgb25seSBpZiB7QGxpbmsgbGlua1BhdGhTdHlsZX0gaXMge0BsaW5rIExpbmtQYXRoU3R5bGUuQWJzb2x1dGVQYXRoSW5WYXVsdH0uXG4gICAqXG4gICAqIElmIGB0cnVlYDogYFtbL2Fic29sdXRlL3BhdGgvdG8vdGFyZ2V0XV1gXG4gICAqXG4gICAqIElmIGBmYWxzZWA6IGBbW2Fic29sdXRlL3BhdGgvdG8vdGFyZ2V0XV1gXG4gICAqXG4gICAqIEBkZWZhdWx0IGBmYWxzZWBcbiAgICovXG4gIHJlYWRvbmx5IHNob3VsZFVzZUxlYWRpbmdTbGFzaEZvckFic29sdXRlUGF0aHM/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBBIHNvdXJjZSBwYXRoIG9mIHRoZSBsaW5rLlxuICAgKi9cbiAgcmVhZG9ubHkgc291cmNlUGF0aE9yRmlsZTogUGF0aE9yRmlsZTtcblxuICAvKipcbiAgICogQSBzdWJwYXRoIG9mIHRoZSBsaW5rLlxuICAgKlxuICAgKiBTaG91bGQgYmUgZW1wdHkgb3Igc3RhcnQgd2l0aCBgI2AuXG4gICAqXG4gICAqIEBleGFtcGxlIGBbW2xpbmstd2l0aC1lbXB0eS1zdWJwYXRoXV1gXG4gICAqIEBleGFtcGxlIGBbW2xpbmstd2l0aC1zdWJwYXRoI3N1YnBhdGhdXWBcbiAgICogQGV4YW1wbGUgYFtbbGluay13aXRoLXN1YnBhdGgjc3VicGF0aCNuZXN0ZWQtc3VicGF0aF1dYFxuICAgKiBAZGVmYXVsdCBgJydgXG4gICAqL1xuICByZWFkb25seSBzdWJwYXRoPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBBIHRhcmdldCBwYXRoIG9yIGZpbGUuXG4gICAqL1xuICByZWFkb25seSB0YXJnZXRQYXRoT3JGaWxlOiBQYXRoT3JGaWxlO1xufVxuXG4vKipcbiAqIFBhcmFtcyBmb3Ige0BsaW5rIGdlbmVyYXRlUmF3TWFya2Rvd25MaW5rfS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBHZW5lcmF0ZVJhd01hcmtkb3duTGlua1BhcmFtcyB7XG4gIC8qKlxuICAgKiBBbiBhbGlhcyBvZiB0aGUgbGluay4gRGVmYXVsdHMgdG8gYHVuZGVmaW5lZGAuXG4gICAqL1xuICByZWFkb25seSBhbGlhcz86IHN0cmluZyB8IHVuZGVmaW5lZDtcblxuICAvKipcbiAgICogV2hldGhlciB0aGUgbGluayBzaG91bGQgYmUgYW4gZW1iZWQgbGluay5cbiAgICpcbiAgICogQGRlZmF1bHQgYGZhbHNlYFxuICAgKi9cbiAgcmVhZG9ubHkgaXNFbWJlZD86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdGhlIGxpbmsgc2hvdWxkIGJlIGEgd2lraWxpbmsuXG4gICAqL1xuICByZWFkb25seSBpc1dpa2lsaW5rOiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRvIGVzY2FwZSB0aGUgYWxpYXMuIEFwcGxpY2FibGUgb25seSBpZiB7QGxpbmsgaGFzV2lraWxpbmtTeW50YXh9IGlzIGBmYWxzZWAuXG4gICAqXG4gICAqIEBkZWZhdWx0IGBmYWxzZWBcbiAgICovXG4gIHJlYWRvbmx5IHNob3VsZEVzY2FwZUFsaWFzPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogV2hldGhlciB0byB1c2UgYW5nbGUgYnJhY2tldHMuIEFwcGxpY2FibGUgb25seSBpZiB7QGxpbmsgaGFzV2lraWxpbmtTeW50YXh9IGlzIGBmYWxzZWAuXG4gICAqXG4gICAqIEBkZWZhdWx0IGBmYWxzZWBcbiAgICovXG4gIHJlYWRvbmx5IHNob3VsZFVzZUFuZ2xlQnJhY2tldHM/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBBIHRpdGxlIG9mIHRoZSBsaW5rLlxuICAgKi9cbiAgcmVhZG9ubHkgdGl0bGU/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEFuIFVSTCBvZiB0aGUgbGluay5cbiAgICovXG4gIHJlYWRvbmx5IHVybDogc3RyaW5nO1xufVxuXG4vKipcbiAqIEEge0BsaW5rIEJhY2tsaW5rc1NuYXBzaG90fSB3aGlsZSBpdCBpcyBzdGlsbCBiZWluZyBhY2N1bXVsYXRlZCBieSB7QGxpbmsgYnVpbGRCYWNrbGlua3NTbmFwc2hvdH0uXG4gKlxuICogQHR5cGVQYXJhbSBUUGF5bG9hZCAtIFRoZSBwYXlsb2FkIHJlY29yZGVkIGZvciBlYWNoIHJlZmVyZW5jZS5cbiAqL1xuZXhwb3J0IHR5cGUgTXV0YWJsZUJhY2tsaW5rc1NuYXBzaG90PFRQYXlsb2FkPiA9IE1hcDxzdHJpbmcsIE1hcDxzdHJpbmcsIFRQYXlsb2FkPj47XG5cbi8qKlxuICogUGFyYW1zIGZvciB7QGxpbmsgc2hvdWxkUmVzZXRBbGlhc30uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU2hvdWxkUmVzZXRBbGlhc1BhcmFtcyB7XG4gIC8qKlxuICAgKiBBbiBPYnNpZGlhbiBhcHAgaW5zdGFuY2UuXG4gICAqL1xuICByZWFkb25seSBhcHA6IEFwcDtcblxuICAvKipcbiAgICogQSBkaXNwbGF5IHRleHQgb2YgdGhlIGxpbmsuXG4gICAqL1xuICByZWFkb25seSBkaXNwbGF5VGV4dDogc3RyaW5nIHwgdW5kZWZpbmVkO1xuXG4gIC8qKlxuICAgKiBJbmRpY2F0ZXMgaWYgdGhlIGxpbmsgaXMgYSB3aWtpbGluay5cbiAgICovXG4gIHJlYWRvbmx5IGlzV2lraWxpbms/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBBIHNvdXJjZSBwYXRoIG9mIHRoZSBsaW5rLlxuICAgKi9cbiAgcmVhZG9ubHkgbmV3U291cmNlUGF0aE9yRmlsZTogUGF0aE9yRmlsZTtcblxuICAvKipcbiAgICogQW4gb2xkIHNvdXJjZSBmaWxlIGNvbnRhaW5pbmcgdGhlIGxpbmsuXG4gICAqL1xuICByZWFkb25seSBvbGRTb3VyY2VQYXRoT3JGaWxlPzogUGF0aE9yRmlsZTtcblxuICAvKipcbiAgICogQW4gb2xkIHRhcmdldCBwYXRoIG9mIHRoZSBsaW5rLlxuICAgKi9cbiAgcmVhZG9ubHkgb2xkVGFyZ2V0UGF0aDogUGF0aE9yRmlsZTtcblxuICAvKipcbiAgICogQSB0YXJnZXQgcGF0aCBvciBmaWxlLlxuICAgKi9cbiAgcmVhZG9ubHkgdGFyZ2V0UGF0aE9yRmlsZTogUGF0aE9yRmlsZTtcbn1cblxuLyoqXG4gKiBTcGxpdHMgYSBsaW5rIGludG8gaXRzIGxpbmsgcGF0aCBhbmQgc3VicGF0aC5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTcGxpdFN1YnBhdGhSZXN1bHQge1xuICAvKipcbiAgICogQSBsaW5rIHBhdGguXG4gICAqL1xuICByZWFkb25seSBsaW5rUGF0aDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBBIHN1YnBhdGguXG4gICAqL1xuICByZWFkb25seSBzdWJwYXRoOiBzdHJpbmc7XG59XG5cbi8qKlxuICogUGFyYW1zIGZvciB7QGxpbmsgdXBkYXRlRmlsZVVybExpbmtzSW5Db250ZW50fS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBVcGRhdGVGaWxlVXJsTGlua3NJbkNvbnRlbnRQYXJhbXMge1xuICAvKipcbiAgICogVGhlIGFib3J0IHNpZ25hbCB0byBjb250cm9sIHRoZSBleGVjdXRpb24gb2YgdGhlIGZ1bmN0aW9uLlxuICAgKi9cbiAgcmVhZG9ubHkgYWJvcnRTaWduYWw/OiBBYm9ydFNpZ25hbDtcblxuICAvKipcbiAgICogQW4gT2JzaWRpYW4gYXBwIGluc3RhbmNlLlxuICAgKi9cbiAgcmVhZG9ubHkgYXBwOiBBcHA7XG5cbiAgLyoqXG4gICAqIFRoZSBjb250ZW50IHRvIG5vcm1hbGl6ZSB0aGUgYGZpbGU6Ly9gIGxpbmtzIGluLlxuICAgKi9cbiAgcmVhZG9ubHkgY29udGVudDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBBIHJhbmdlIHdpdGhpbiB7QGxpbmsgVXBkYXRlRmlsZVVybExpbmtzSW5Db250ZW50UGFyYW1zLmNvbnRlbnR9LCBpbiBjaGFyYWN0ZXIgb2Zmc2V0cywgcmVzdHJpY3RpbmdcbiAgICogdGhlIHBhc3MgdG8gdGhlIGxpbmtzIGluc2lkZSBpdC4gV2hlbiBvbWl0dGVkLCBldmVyeSBsaW5rIGlzIHZpc2l0ZWQuXG4gICAqXG4gICAqIEEgbGluayBpcyBub3JtYWxpemVkIG9ubHkgd2hlbiBpdCBpcyAqKmZ1bGx5IGNvbnRhaW5lZCoqIGluIHRoZSByYW5nZTsgb25lIHRoYXQgbWVyZWx5IG92ZXJsYXBzIGl0IGlzXG4gICAqIGxlZnQgYWxvbmUsIGJlY2F1c2UgcmV3cml0aW5nIHBhcnQgb2YgYSBsaW5rIGNvcnJ1cHRzIGl0LiBCb3RoIGJvdW5kcyBhcmUgaW5jbHVzaXZlLCBzbyBhIHJhbmdlIHdob3NlXG4gICAqIG9mZnNldHMgY29pbmNpZGUgZXhhY3RseSB3aXRoIGEgbGluaydzIGRvZXMgaW5jbHVkZSB0aGF0IGxpbmsuXG4gICAqXG4gICAqIEEgcmVmZXJlbmNlIHRoYXQgY2FycmllcyBubyBwb3NpdGlvbiB3aXRoaW4gdGhlIGNvbnRlbnQg4oCUIGEgZnJvbnRtYXR0ZXIgbGluaywgYSBtdWx0aS1saW5rIGZyb250bWF0dGVyXG4gICAqIHZhbHVlIGVudHJ5LCBvciBhbnkgY2FudmFzIHJlZmVyZW5jZSDigJQgaXMgbmV2ZXIgaW4gcmFuZ2UgYW5kIGlzIHNraXBwZWQgd2hlbmV2ZXIgYSByYW5nZSBpcyBzdXBwbGllZC5cbiAgICpcbiAgICogQGRlZmF1bHQgYHVuZGVmaW5lZGBcbiAgICovXG4gIHJlYWRvbmx5IG9mZnNldFJhbmdlPzogT2Zmc2V0UmFuZ2U7XG5cbiAgLyoqXG4gICAqIEEgcHJlZGljYXRlIGNob29zaW5nIGxpbmtzIHRvIGxlYXZlIHVuY2hhbmdlZDogZm9yIGVhY2ggcmVmZXJlbmNlIGl0IHJldHVybnMgYHRydWVgIGZvciwgdGhlIGNvbnZlcnRlciBpc1xuICAgKiBub3QgY2FsbGVkLCBzbyB0aGUgbGluayBzdGF5cyBieXRlLWZvci1ieXRlIGFzIHdyaXR0ZW4g4oCUIGl0cyBwYXRoLCBzdHlsZSwgYW5nbGUgYnJhY2tldHMgYW5kIGxlYWRpbmcgZG90XG4gICAqIGluY2x1ZGVkLiBVc2UgaXQgdG8gZXhjbHVkZSBsaW5rcyB0aGUgY2FsbGVyIGRlY2lkZXMgb24sIGZvciBleGFtcGxlIGJ5IHRoZWlyIHJlc29sdmVkIHRhcmdldCBwYXRoLlxuICAgKlxuICAgKiBBcHBsaWVkIGFmdGVyIHRoZSB7QGxpbmsgaXNSZWZlcmVuY2VJbkhlYWRpbmcgfCBoZWFkaW5nfSBza2lwIGFuZCB0aGUgb2Zmc2V0IHJhbmdlLlxuICAgKlxuICAgKiBAZGVmYXVsdCBgdW5kZWZpbmVkYFxuICAgKi9cbiAgcmVhZG9ubHkgc2hvdWxkU2tpcFJlZmVyZW5jZT86IChyZWZlcmVuY2U6IFJlZmVyZW5jZSkgPT4gYm9vbGVhbjtcblxuICAvKipcbiAgICogV2hldGhlciB0byBsZWF2ZSBldmVyeSBsaW5rIGluc2lkZSBhIGhlYWRpbmcgdW5jaGFuZ2VkLiBTZWVcbiAgICoge0BsaW5rIEVkaXRSZWZlcmVuY2VzSW5Db250ZW50UGFyYW1zLnNob3VsZFNraXBSZWZlcmVuY2VzSW5IZWFkaW5nc30uXG4gICAqXG4gICAqIEBkZWZhdWx0IGBmYWxzZWBcbiAgICovXG4gIHJlYWRvbmx5IHNob3VsZFNraXBSZWZlcmVuY2VzSW5IZWFkaW5ncz86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdG8gZW1pdCB0aGUgbm9ybWFsaXplZCBsaW5rcyB3aXRoIGFuZ2xlIGJyYWNrZXRzIGFuZCByYXcgc3BhY2VzIGluc3RlYWQgb2YgYCUyMGAtZW5jb2RpbmcuXG4gICAqXG4gICAqIEBkZWZhdWx0IGBmYWxzZWBcbiAgICovXG4gIHJlYWRvbmx5IHNob3VsZFVzZUFuZ2xlQnJhY2tldHM/OiBib29sZWFuO1xufVxuXG4vKipcbiAqIFBhcmFtcyBmb3Ige0BsaW5rIHVwZGF0ZUZpbGVVcmxMaW5rc0luRmlsZX0uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVXBkYXRlRmlsZVVybExpbmtzSW5GaWxlUGFyYW1zIGV4dGVuZHMgUHJvY2Vzc09wdGlvbnMge1xuICAvKipcbiAgICogQW4gT2JzaWRpYW4gYXBwIGluc3RhbmNlLlxuICAgKi9cbiAgcmVhZG9ubHkgYXBwOiBBcHA7XG5cbiAgLyoqXG4gICAqIEEgcmFuZ2Ugd2l0aGluIHRoZSBmaWxlJ3MgY29udGVudCwgaW4gY2hhcmFjdGVyIG9mZnNldHMsIHJlc3RyaWN0aW5nIHRoZSBwYXNzIHRvIHRoZSBsaW5rcyBpbnNpZGUgaXQuXG4gICAqIFdoZW4gb21pdHRlZCwgZXZlcnkgbGluayBpcyB2aXNpdGVkLlxuICAgKlxuICAgKiBBIGxpbmsgaXMgbm9ybWFsaXplZCBvbmx5IHdoZW4gaXQgaXMgKipmdWxseSBjb250YWluZWQqKiBpbiB0aGUgcmFuZ2U7IG9uZSB0aGF0IG1lcmVseSBvdmVybGFwcyBpdCBpc1xuICAgKiBsZWZ0IGFsb25lLCBiZWNhdXNlIHJld3JpdGluZyBwYXJ0IG9mIGEgbGluayBjb3JydXB0cyBpdC4gQm90aCBib3VuZHMgYXJlIGluY2x1c2l2ZSwgc28gYSByYW5nZSB3aG9zZVxuICAgKiBvZmZzZXRzIGNvaW5jaWRlIGV4YWN0bHkgd2l0aCBhIGxpbmsncyBkb2VzIGluY2x1ZGUgdGhhdCBsaW5rLlxuICAgKlxuICAgKiBBIHJlZmVyZW5jZSB0aGF0IGNhcnJpZXMgbm8gcG9zaXRpb24gd2l0aGluIHRoZSBmaWxlJ3MgY29udGVudCDigJQgYSBmcm9udG1hdHRlciBsaW5rLCBhIG11bHRpLWxpbmtcbiAgICogZnJvbnRtYXR0ZXIgdmFsdWUgZW50cnksIG9yIGFueSBjYW52YXMgcmVmZXJlbmNlIOKAlCBpcyBuZXZlciBpbiByYW5nZSBhbmQgaXMgc2tpcHBlZCB3aGVuZXZlciBhIHJhbmdlIGlzXG4gICAqIHN1cHBsaWVkLlxuICAgKlxuICAgKiBUaGUgb2Zmc2V0cyBhcmUgaW50byB0aGUgY29udGVudCB0aGlzIGZ1bmN0aW9uIHJlYWRzIGZyb20gdGhlIHZhdWx0LiBCZWZvcmUgcmVhZGluZywgaXQgc2F2ZXMgYW55XG4gICAqIHVuc2F2ZWQgZWRpdG9yIGJ1ZmZlciBmb3IgdGhlIGZpbGUsIHNvIGEgcmFuZ2UgdGFrZW4gZnJvbSBhbiBvcGVuIGVkaXRvciB2aWEgYEVkaXRvci5wb3NUb09mZnNldGAgaXNcbiAgICogdmFsaWQuIFRoZSBjYWxsZXIgb3ducyBvbmx5IHRoZSBjYXNlIHdoZXJlIHRoZSBidWZmZXIgY2hhbmdlcyBiZXR3ZWVuIGNvbXB1dGluZyB0aGUgcmFuZ2UgYW5kIHRoaXNcbiAgICogY2FsbC5cbiAgICpcbiAgICogQGRlZmF1bHQgYHVuZGVmaW5lZGBcbiAgICovXG4gIHJlYWRvbmx5IG9mZnNldFJhbmdlPzogT2Zmc2V0UmFuZ2U7XG5cbiAgLyoqXG4gICAqIFRoZSBwYXRoIG9yIGZpbGUgdG8gbm9ybWFsaXplIHRoZSBgZmlsZTovL2AgbGlua3MgaW4uXG4gICAqL1xuICByZWFkb25seSBwYXRoT3JGaWxlOiBQYXRoT3JGaWxlO1xuXG4gIC8qKlxuICAgKiBBIHByZWRpY2F0ZSBjaG9vc2luZyBsaW5rcyB0byBsZWF2ZSB1bmNoYW5nZWQ6IGZvciBlYWNoIHJlZmVyZW5jZSBpdCByZXR1cm5zIGB0cnVlYCBmb3IsIHRoZSBjb252ZXJ0ZXIgaXNcbiAgICogbm90IGNhbGxlZCwgc28gdGhlIGxpbmsgc3RheXMgYnl0ZS1mb3ItYnl0ZSBhcyB3cml0dGVuIOKAlCBpdHMgcGF0aCwgc3R5bGUsIGFuZ2xlIGJyYWNrZXRzIGFuZCBsZWFkaW5nIGRvdFxuICAgKiBpbmNsdWRlZC4gVXNlIGl0IHRvIGV4Y2x1ZGUgbGlua3MgdGhlIGNhbGxlciBkZWNpZGVzIG9uLCBmb3IgZXhhbXBsZSBieSB0aGVpciByZXNvbHZlZCB0YXJnZXQgcGF0aC5cbiAgICpcbiAgICogQXBwbGllZCBhZnRlciB0aGUge0BsaW5rIGlzUmVmZXJlbmNlSW5IZWFkaW5nIHwgaGVhZGluZ30gc2tpcCBhbmQgdGhlIG9mZnNldCByYW5nZS5cbiAgICpcbiAgICogQGRlZmF1bHQgYHVuZGVmaW5lZGBcbiAgICovXG4gIHJlYWRvbmx5IHNob3VsZFNraXBSZWZlcmVuY2U/OiAocmVmZXJlbmNlOiBSZWZlcmVuY2UpID0+IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdG8gbGVhdmUgZXZlcnkgbGluayBpbnNpZGUgYSBoZWFkaW5nIHVuY2hhbmdlZC4gU2VlIHtAbGluayBFZGl0UmVmZXJlbmNlc1BhcmFtcy5zaG91bGRTa2lwUmVmZXJlbmNlc0luSGVhZGluZ3N9LlxuICAgKlxuICAgKiBAZGVmYXVsdCBgZmFsc2VgXG4gICAqL1xuICByZWFkb25seSBzaG91bGRTa2lwUmVmZXJlbmNlc0luSGVhZGluZ3M/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRvIGVtaXQgdGhlIG5vcm1hbGl6ZWQgbGlua3Mgd2l0aCBhbmdsZSBicmFja2V0cyBhbmQgcmF3IHNwYWNlcyBpbnN0ZWFkIG9mIGAlMjBgLWVuY29kaW5nLlxuICAgKlxuICAgKiBAZGVmYXVsdCBgZmFsc2VgXG4gICAqL1xuICByZWFkb25seSBzaG91bGRVc2VBbmdsZUJyYWNrZXRzPzogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBQYXJhbXMgZm9yIHtAbGluayB1cGRhdGVMaW5rfS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBVcGRhdGVMaW5rUGFyYW1zIHtcbiAgLyoqXG4gICAqIEFuIE9ic2lkaWFuIGFwcCBpbnN0YW5jZS5cbiAgICovXG4gIHJlYWRvbmx5IGFwcDogQXBwO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRvIGFsbG93IGFuIGVtcHR5IGFsaWFzIGZvciBlbWJlZHMuXG4gICAqXG4gICAqIEFwcGxpY2FibGUgb25seSBpZiB0aGUgcmVzdWx0IGxpbmsgc3R5bGUgaXMge0BsaW5rIExpbmtTdHlsZS5NYXJrZG93bn0uXG4gICAqXG4gICAqIElmIGB0cnVlYDogYCFbXShmb28ucG5nKWAuXG4gICAqXG4gICAqIElmIGBmYWxzZWA6IGAhW2Zvb10oZm9vLnBuZylgLlxuICAgKlxuICAgKiBAZGVmYXVsdCBgdHJ1ZWBcbiAgICovXG4gIHJlYWRvbmx5IGlzRW1wdHlFbWJlZEFsaWFzQWxsb3dlZD86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIEEgc3R5bGUgb2YgdGhlIGxpbmsgcGF0aC5cbiAgICovXG4gIHJlYWRvbmx5IGxpbmtQYXRoU3R5bGU/OiBMaW5rUGF0aFN0eWxlO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRvIGZvcmNlIG1hcmtkb3duIGxpbmtzLlxuICAgKi9cbiAgcmVhZG9ubHkgbGlua1N0eWxlPzogTGlua1N0eWxlO1xuXG4gIC8qKlxuICAgKiBBIHNvdXJjZSBmaWxlIGNvbnRhaW5pbmcgdGhlIGxpbmsuXG4gICAqL1xuICByZWFkb25seSBuZXdTb3VyY2VQYXRoT3JGaWxlOiBQYXRoT3JGaWxlO1xuXG4gIC8qKlxuICAgKiBBIGZpbGUgYXNzb2NpYXRlZCB3aXRoIHRoZSBsaW5rLlxuICAgKi9cbiAgcmVhZG9ubHkgbmV3VGFyZ2V0UGF0aE9yRmlsZTogUGF0aE9yRmlsZTtcblxuICAvKipcbiAgICogQW4gb2xkIHNvdXJjZSBmaWxlIGNvbnRhaW5pbmcgdGhlIGxpbmsuXG4gICAqL1xuICByZWFkb25seSBvbGRTb3VyY2VQYXRoT3JGaWxlPzogUGF0aE9yRmlsZTtcblxuICAvKipcbiAgICogQW4gb2xkIHBhdGggb2YgdGhlIGZpbGUuXG4gICAqL1xuICByZWFkb25seSBvbGRUYXJnZXRQYXRoT3JGaWxlPzogUGF0aE9yRmlsZTtcblxuICAvKipcbiAgICogVGhlIHJlZmVyZW5jZSB3aG9zZSBsaW5rIGlzIHVwZGF0ZWQuXG4gICAqL1xuICByZWFkb25seSByZWZlcmVuY2U6IFJlZmVyZW5jZTtcblxuICAvKipcbiAgICogV2hldGhlciB0byBlc2NhcGUgdGhlIGFsaWFzLlxuICAgKlxuICAgKiBBcHBsaWNhYmxlIG9ubHkgaWYgdGhlIHJlc3VsdCBsaW5rIHN0eWxlIGlzIHtAbGluayBMaW5rU3R5bGUuTWFya2Rvd259LlxuICAgKlxuICAgKiBJZiBgdHJ1ZWA6IGBbXFwqXFwqYWxpYXNcXCpcXCpdKGxpbmsubWQpYC5cbiAgICpcbiAgICogSWYgYGZhbHNlYDogYFsqKmFsaWFzKipdKGxpbmsubWQpYC5cbiAgICpcbiAgICogQGRlZmF1bHQgYGZhbHNlYFxuICAgKi9cbiAgcmVhZG9ubHkgc2hvdWxkRXNjYXBlQWxpYXM/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRvIGluY2x1ZGUgdGhlIGF0dGFjaG1lbnQgZXh0ZW5zaW9uIGluIHRoZSBlbWJlZCBhbGlhcy5cbiAgICpcbiAgICogQXBwbGljYWJsZSBvbmx5IGlmIHtAbGluayBpc0VtcHR5RW1iZWRBbGlhc0FsbG93ZWR9IGlzIGBmYWxzZWAuXG4gICAqXG4gICAqIElmIGB0cnVlYDogYFtmb28ucG5nXShmb28ucG5nKWAuXG4gICAqXG4gICAqIElmIGBmYWxzZWA6IGBbZm9vXShmb28ucG5nKWAuXG4gICAqXG4gICAqIEBkZWZhdWx0IGBmYWxzZWBcbiAgICovXG4gIHJlYWRvbmx5IHNob3VsZEluY2x1ZGVBdHRhY2htZW50RXh0ZW5zaW9uVG9FbWJlZEFsaWFzPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogV2hldGhlciB0byB1cGRhdGUgZmlsZSBuYW1lIGFsaWFzLlxuICAgKlxuICAgKiBAZGVmYXVsdCBgdHJ1ZWBcbiAgICovXG4gIHJlYWRvbmx5IHNob3VsZFVwZGF0ZUZpbGVOYW1lQWxpYXM/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBJbmRpY2F0ZXMgaWYgdGhlIGxpbmsgc2hvdWxkIHVzZSBhbmdsZSBicmFja2V0cy5cbiAgICpcbiAgICogQXBwbGljYWJsZSBvbmx5IGlmIHtAbGluayBsaW5rU3R5bGV9IGlzIHtAbGluayBMaW5rU3R5bGUuTWFya2Rvd259LlxuICAgKlxuICAgKiBJZiBgdHJ1ZWA6IGBbYWxpYXNdKDxwYXRoIHdpdGggc3BhY2VzLm1kPilgLlxuICAgKlxuICAgKiBJZiBgZmFsc2VgOiBgW2FsaWFzXShwYXRoJTIwd2l0aCUyMHNwYWNlcy5tZClgLlxuICAgKlxuICAgKiBAZGVmYXVsdCBgZmFsc2VgXG4gICAqL1xuICByZWFkb25seSBzaG91bGRVc2VBbmdsZUJyYWNrZXRzPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogSW5kaWNhdGVzIGlmIHRoZSBsaW5rIHNob3VsZCB1c2UgYSBsZWFkaW5nIGRvdC5cbiAgICpcbiAgICogQXBwbGljYWJsZSBvbmx5IGlmIHtAbGluayBsaW5rUGF0aFN0eWxlfSBpcyB7QGxpbmsgTGlua1BhdGhTdHlsZS5SZWxhdGl2ZVBhdGhUb1RoZVNvdXJjZX0uXG4gICAqXG4gICAqIElmIGB0cnVlYDogYFtbLi9yZWxhdGl2ZS9wYXRoL3RvL3RhcmdldF1dYFxuICAgKlxuICAgKiBJZiBgZmFsc2VgOiBgW1tyZWxhdGl2ZS9wYXRoL3RvL3RhcmdldF1dYFxuICAgKlxuICAgKiBAZGVmYXVsdCBgZmFsc2VgXG4gICAqL1xuICByZWFkb25seSBzaG91bGRVc2VMZWFkaW5nRG90Rm9yUmVsYXRpdmVQYXRocz86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIEluZGljYXRlcyBpZiB0aGUgbGluayBzaG91bGQgdXNlIGEgbGVhZGluZyBzbGFzaC5cbiAgICpcbiAgICogQXBwbGljYWJsZSBvbmx5IGlmIHtAbGluayBsaW5rUGF0aFN0eWxlfSBpcyB7QGxpbmsgTGlua1BhdGhTdHlsZS5BYnNvbHV0ZVBhdGhJblZhdWx0fS5cbiAgICpcbiAgICogSWYgYHRydWVgOiBgW1svYWJzb2x1dGUvcGF0aC90by90YXJnZXRdXWBcbiAgICpcbiAgICogSWYgYGZhbHNlYDogYFtbYWJzb2x1dGUvcGF0aC90by90YXJnZXRdXWBcbiAgICpcbiAgICogQGRlZmF1bHQgYGZhbHNlYFxuICAgKi9cbiAgcmVhZG9ubHkgc2hvdWxkVXNlTGVhZGluZ1NsYXNoRm9yQWJzb2x1dGVQYXRocz86IGJvb2xlYW47XG59XG5cbi8qKlxuICogUGFyYW1zIGZvciB7QGxpbmsgdXBkYXRlUmVmZXJlbmNlc0luRmlsZX0uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVXBkYXRlUmVmZXJlbmNlc0luRmlsZVBhcmFtcyBleHRlbmRzIFByb2Nlc3NPcHRpb25zIHtcbiAgLyoqXG4gICAqIEFuIE9ic2lkaWFuIGFwcCBpbnN0YW5jZS5cbiAgICovXG4gIHJlYWRvbmx5IGFwcDogQXBwO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRvIGFsbG93IGFuIGVtcHR5IGFsaWFzIGZvciBlbWJlZHMuXG4gICAqXG4gICAqIEFwcGxpY2FibGUgb25seSBpZiB0aGUgcmVzdWx0IGxpbmsgc3R5bGUgaXMge0BsaW5rIExpbmtTdHlsZS5NYXJrZG93bn0uXG4gICAqXG4gICAqIElmIGB0cnVlYDogYCFbXShmb28ucG5nKWAuXG4gICAqXG4gICAqIElmIGBmYWxzZWA6IGAhW2Zvb10oZm9vLnBuZylgLlxuICAgKlxuICAgKiBAZGVmYXVsdCBgdHJ1ZWBcbiAgICovXG4gIHJlYWRvbmx5IGlzRW1wdHlFbWJlZEFsaWFzQWxsb3dlZD86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIEEgc3R5bGUgb2YgdGhlIGxpbmsgcGF0aC5cbiAgICovXG4gIHJlYWRvbmx5IGxpbmtQYXRoU3R5bGU/OiBMaW5rUGF0aFN0eWxlO1xuXG4gIC8qKlxuICAgKiBBIHN0eWxlIG9mIHRoZSBsaW5rLlxuICAgKi9cbiAgcmVhZG9ubHkgbGlua1N0eWxlPzogTGlua1N0eWxlO1xuXG4gIC8qKlxuICAgKiBEZWNpZGVzIHRoZSBzdHlsZSBvZiBvbmUgbGluaywgb3ZlcnJpZGluZyB7QGxpbmsgbGlua1N0eWxlfSBmb3IgaXQuIFJldHVybmluZyBgdW5kZWZpbmVkYCBrZWVwc1xuICAgKiB7QGxpbmsgbGlua1N0eWxlfS5cbiAgICpcbiAgICogVXNlIGl0IHdoZW4gb25lIHN0eWxlIGZvciB0aGUgd2hvbGUgZmlsZSBpcyB3cm9uZyBmb3Igc29tZSBvZiBpdHMgbGlua3MuIEEgY2FsbGVyIGZvcmNpbmdcbiAgICoge0BsaW5rIExpbmtTdHlsZS5NYXJrZG93bn0gb3ZlciBhIG5vdGUsIGZvciBleGFtcGxlLCBrZWVwcyBhIGZyb250bWF0dGVyIHdpa2lsaW5rIGEgd2lraWxpbmssIGJlY2F1c2VcbiAgICogT2JzaWRpYW4gcmVhZHMgYSBwcm9wZXJ0eSB2YWx1ZSBhcyBhIGxpbmsgb25seSBpbiB0aGF0IGZvcm0uXG4gICAqXG4gICAqIEBkZWZhdWx0IGB1bmRlZmluZWRgXG4gICAqL1xuICByZWFkb25seSBsaW5rU3R5bGVQcm92aWRlcj86IChyZWZlcmVuY2U6IFJlZmVyZW5jZSkgPT4gTGlua1N0eWxlIHwgdW5kZWZpbmVkO1xuXG4gIC8qKlxuICAgKiBBIGZpbGUgdG8gdXBkYXRlIHRoZSBsaW5rcyBpbi5cbiAgICovXG4gIHJlYWRvbmx5IG5ld1NvdXJjZVBhdGhPckZpbGU6IFBhdGhPckZpbGU7XG5cbiAgLyoqXG4gICAqIEEgcmFuZ2Ugd2l0aGluIHRoZSBmaWxlJ3MgY29udGVudCwgaW4gY2hhcmFjdGVyIG9mZnNldHMsIHJlc3RyaWN0aW5nIHRoZSBwYXNzIHRvIHRoZSBsaW5rcyBpbnNpZGUgaXQuXG4gICAqIFdoZW4gb21pdHRlZCwgZXZlcnkgbGluayBpcyB2aXNpdGVkLlxuICAgKlxuICAgKiBBIGxpbmsgaXMgdXBkYXRlZCBvbmx5IHdoZW4gaXQgaXMgKipmdWxseSBjb250YWluZWQqKiBpbiB0aGUgcmFuZ2U7IG9uZSB0aGF0IG1lcmVseSBvdmVybGFwcyBpdCBpcyBsZWZ0XG4gICAqIGFsb25lLCBiZWNhdXNlIHJld3JpdGluZyBwYXJ0IG9mIGEgbGluayBjb3JydXB0cyBpdC4gQm90aCBib3VuZHMgYXJlIGluY2x1c2l2ZSwgc28gYSByYW5nZSB3aG9zZVxuICAgKiBvZmZzZXRzIGNvaW5jaWRlIGV4YWN0bHkgd2l0aCBhIGxpbmsncyBkb2VzIGluY2x1ZGUgdGhhdCBsaW5rLlxuICAgKlxuICAgKiBBIHJlZmVyZW5jZSB0aGF0IGNhcnJpZXMgbm8gcG9zaXRpb24gd2l0aGluIHRoZSBmaWxlJ3MgY29udGVudCDigJQgYSBmcm9udG1hdHRlciBsaW5rLCBhIG11bHRpLWxpbmtcbiAgICogZnJvbnRtYXR0ZXIgdmFsdWUgZW50cnksIG9yIGFueSBjYW52YXMgcmVmZXJlbmNlIOKAlCBpcyBuZXZlciBpbiByYW5nZSBhbmQgaXMgc2tpcHBlZCB3aGVuZXZlciBhIHJhbmdlIGlzXG4gICAqIHN1cHBsaWVkLlxuICAgKlxuICAgKiBUaGUgb2Zmc2V0cyBhcmUgaW50byB0aGUgY29udGVudCB0aGlzIGZ1bmN0aW9uIHJlYWRzIGZyb20gdGhlIHZhdWx0LiBCZWZvcmUgcmVhZGluZywgaXQgc2F2ZXMgYW55XG4gICAqIHVuc2F2ZWQgZWRpdG9yIGJ1ZmZlciBmb3IgdGhlIGZpbGUsIHNvIGEgcmFuZ2UgdGFrZW4gZnJvbSBhbiBvcGVuIGVkaXRvciB2aWEgYEVkaXRvci5wb3NUb09mZnNldGAgaXNcbiAgICogdmFsaWQuIFRoZSBjYWxsZXIgb3ducyBvbmx5IHRoZSBjYXNlIHdoZXJlIHRoZSBidWZmZXIgY2hhbmdlcyBiZXR3ZWVuIGNvbXB1dGluZyB0aGUgcmFuZ2UgYW5kIHRoaXNcbiAgICogY2FsbC5cbiAgICpcbiAgICogQGRlZmF1bHQgYHVuZGVmaW5lZGBcbiAgICovXG4gIHJlYWRvbmx5IG9mZnNldFJhbmdlPzogT2Zmc2V0UmFuZ2U7XG5cbiAgLyoqXG4gICAqIEFuIG9sZCBwYXRoIG9mIHRoZSBmaWxlLlxuICAgKi9cbiAgcmVhZG9ubHkgb2xkU291cmNlUGF0aE9yRmlsZT86IFBhdGhPckZpbGU7XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdG8gZXNjYXBlIHRoZSBhbGlhcy5cbiAgICpcbiAgICogQXBwbGljYWJsZSBvbmx5IGlmIHRoZSByZXN1bHQgbGluayBzdHlsZSBpcyB7QGxpbmsgTGlua1N0eWxlLk1hcmtkb3dufS5cbiAgICpcbiAgICogSWYgYHRydWVgOiBgW1xcKlxcKmFsaWFzXFwqXFwqXShsaW5rLm1kKWAuXG4gICAqXG4gICAqIElmIGBmYWxzZWA6IGBbKiphbGlhcyoqXShsaW5rLm1kKWAuXG4gICAqXG4gICAqIEBkZWZhdWx0IGBmYWxzZWBcbiAgICovXG4gIHJlYWRvbmx5IHNob3VsZEVzY2FwZUFsaWFzPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogV2hldGhlciB0byBpbmNsdWRlIHRoZSBhdHRhY2htZW50IGV4dGVuc2lvbiBpbiB0aGUgZW1iZWQgYWxpYXMuXG4gICAqXG4gICAqIEFwcGxpY2FibGUgb25seSBpZiB7QGxpbmsgaXNFbXB0eUVtYmVkQWxpYXNBbGxvd2VkfSBpcyBgZmFsc2VgLlxuICAgKlxuICAgKiBJZiBgdHJ1ZWA6IGBbZm9vLnBuZ10oZm9vLnBuZylgLlxuICAgKlxuICAgKiBJZiBgZmFsc2VgOiBgW2Zvb10oZm9vLnBuZylgLlxuICAgKlxuICAgKiBAZGVmYXVsdCBgZmFsc2VgXG4gICAqL1xuICByZWFkb25seSBzaG91bGRJbmNsdWRlQXR0YWNobWVudEV4dGVuc2lvblRvRW1iZWRBbGlhcz86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIEEgcHJlZGljYXRlIGNob29zaW5nIGxpbmtzIHRvIGxlYXZlIHVuY2hhbmdlZDogZm9yIGVhY2ggcmVmZXJlbmNlIGl0IHJldHVybnMgYHRydWVgIGZvciwgdGhlIGNvbnZlcnRlciBpc1xuICAgKiBub3QgY2FsbGVkLCBzbyB0aGUgbGluayBzdGF5cyBieXRlLWZvci1ieXRlIGFzIHdyaXR0ZW4g4oCUIGl0cyBwYXRoLCBzdHlsZSwgYW5nbGUgYnJhY2tldHMgYW5kIGxlYWRpbmcgZG90XG4gICAqIGluY2x1ZGVkLiBVc2UgaXQgdG8gZXhjbHVkZSBsaW5rcyB0aGUgY2FsbGVyIGRlY2lkZXMgb24sIGZvciBleGFtcGxlIGJ5IHRoZWlyIHJlc29sdmVkIHRhcmdldCBwYXRoLlxuICAgKlxuICAgKiBBcHBsaWVkIGFmdGVyIHRoZSB7QGxpbmsgaXNSZWZlcmVuY2VJbkhlYWRpbmcgfCBoZWFkaW5nfSBza2lwIGFuZCB0aGUgb2Zmc2V0IHJhbmdlLlxuICAgKlxuICAgKiBAZGVmYXVsdCBgdW5kZWZpbmVkYFxuICAgKi9cbiAgcmVhZG9ubHkgc2hvdWxkU2tpcFJlZmVyZW5jZT86IChyZWZlcmVuY2U6IFJlZmVyZW5jZSkgPT4gYm9vbGVhbjtcblxuICAvKipcbiAgICogV2hldGhlciB0byBsZWF2ZSBldmVyeSBsaW5rIGluc2lkZSBhIGhlYWRpbmcgdW5jaGFuZ2VkOiBpdCBpcyBuZWl0aGVyIGNvbnZlcnRlZCBub3IgcmVzdHlsZWQsIHNvIGl0XG4gICAqIHN0YXlzIGJ5dGUtZm9yLWJ5dGUgYXMgd3JpdHRlbi4gQSBsaW5rIGluIGEgaGVhZGluZyBpcyBwYXJ0IG9mIHRoZSBoZWFkaW5nJ3MgdGV4dCwgc28gcmV3cml0aW5nIGl0XG4gICAqIGNoYW5nZXMgdGhhdCB0ZXh0IGFuZCBicmVha3MgZXZlcnkgYCNoZWFkaW5nYCBzdWJwYXRoIHBvaW50aW5nIGF0IHRoZSBoZWFkaW5nLiBTZWVcbiAgICoge0BsaW5rIGlzUmVmZXJlbmNlSW5IZWFkaW5nfS5cbiAgICpcbiAgICogQGRlZmF1bHQgYGZhbHNlYFxuICAgKi9cbiAgcmVhZG9ubHkgc2hvdWxkU2tpcFJlZmVyZW5jZXNJbkhlYWRpbmdzPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogV2hldGhlciB0byB1cGRhdGUgb25seSBlbWJlZGRlZCBsaW5rcy5cbiAgICovXG4gIHJlYWRvbmx5IHNob3VsZFVwZGF0ZUVtYmVkT25seUxpbmtzPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogV2hldGhlciB0byB1cGRhdGUgZmlsZSBuYW1lIGFsaWFzLlxuICAgKlxuICAgKiBAZGVmYXVsdCBgdHJ1ZWBcbiAgICovXG4gIHJlYWRvbmx5IHNob3VsZFVwZGF0ZUZpbGVOYW1lQWxpYXM/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBJbmRpY2F0ZXMgaWYgdGhlIGxpbmsgc2hvdWxkIHVzZSBhbmdsZSBicmFja2V0cy5cbiAgICpcbiAgICogQXBwbGljYWJsZSBvbmx5IGlmIHtAbGluayBsaW5rU3R5bGV9IGlzIHtAbGluayBMaW5rU3R5bGUuTWFya2Rvd259LlxuICAgKlxuICAgKiBJZiBgdHJ1ZWA6IGBbYWxpYXNdKDxwYXRoIHdpdGggc3BhY2VzLm1kPilgLlxuICAgKlxuICAgKiBJZiBgZmFsc2VgOiBgW2FsaWFzXShwYXRoJTIwd2l0aCUyMHNwYWNlcy5tZClgLlxuICAgKlxuICAgKiBAZGVmYXVsdCBgZmFsc2VgXG4gICAqL1xuICByZWFkb25seSBzaG91bGRVc2VBbmdsZUJyYWNrZXRzPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogSW5kaWNhdGVzIGlmIHRoZSBsaW5rIHNob3VsZCB1c2UgYSBsZWFkaW5nIGRvdC5cbiAgICpcbiAgICogQXBwbGljYWJsZSBvbmx5IGlmIHtAbGluayBsaW5rUGF0aFN0eWxlfSBpcyB7QGxpbmsgTGlua1BhdGhTdHlsZS5SZWxhdGl2ZVBhdGhUb1RoZVNvdXJjZX0uXG4gICAqXG4gICAqIElmIGB0cnVlYDogYFtbLi9yZWxhdGl2ZS9wYXRoL3RvL3RhcmdldF1dYFxuICAgKlxuICAgKiBJZiBgZmFsc2VgOiBgW1tyZWxhdGl2ZS9wYXRoL3RvL3RhcmdldF1dYFxuICAgKlxuICAgKiBAZGVmYXVsdCBgZmFsc2VgXG4gICAqL1xuICByZWFkb25seSBzaG91bGRVc2VMZWFkaW5nRG90Rm9yUmVsYXRpdmVQYXRocz86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIEluZGljYXRlcyBpZiB0aGUgbGluayBzaG91bGQgdXNlIGEgbGVhZGluZyBzbGFzaC5cbiAgICpcbiAgICogQXBwbGljYWJsZSBvbmx5IGlmIHtAbGluayBsaW5rUGF0aFN0eWxlfSBpcyB7QGxpbmsgTGlua1BhdGhTdHlsZS5BYnNvbHV0ZVBhdGhJblZhdWx0fS5cbiAgICpcbiAgICogSWYgYHRydWVgOiBgW1svYWJzb2x1dGUvcGF0aC90by90YXJnZXRdXWBcbiAgICpcbiAgICogSWYgYGZhbHNlYDogYFtbYWJzb2x1dGUvcGF0aC90by90YXJnZXRdXWBcbiAgICpcbiAgICogQGRlZmF1bHQgYGZhbHNlYFxuICAgKi9cbiAgcmVhZG9ubHkgc2hvdWxkVXNlTGVhZGluZ1NsYXNoRm9yQWJzb2x1dGVQYXRocz86IGJvb2xlYW47XG59XG5cbi8qKlxuICogUGFyYW1zIGZvciB7QGxpbmsgZ2VuZXJhdGVMaW5rVGV4dH0uXG4gKi9cbmludGVyZmFjZSBHZW5lcmF0ZUxpbmtUZXh0UGFyYW1zIHtcbiAgLyoqXG4gICAqIEFuIE9ic2lkaWFuIGFwcCBpbnN0YW5jZS5cbiAgICovXG4gIHJlYWRvbmx5IGFwcDogQXBwO1xuXG4gIC8qKlxuICAgKiBBIGNvbmZpZ3VyYXRpb24gb2YgdGhlIGxpbmsuXG4gICAqL1xuICByZWFkb25seSBjb25maWc6IExpbmtDb25maWc7XG5cbiAgLyoqXG4gICAqIEEgc291cmNlIHBhdGggb2YgdGhlIGxpbmsuXG4gICAqL1xuICByZWFkb25seSBzb3VyY2VQYXRoOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEEgc3VicGF0aCBvZiB0aGUgbGluay5cbiAgICovXG4gIHJlYWRvbmx5IHN1YnBhdGg6IHN0cmluZztcblxuICAvKipcbiAgICogQSB0YXJnZXQgZmlsZSBvZiB0aGUgbGluay5cbiAgICovXG4gIHJlYWRvbmx5IHRhcmdldEZpbGU6IFRGaWxlO1xufVxuXG4vKipcbiAqIFBhcmFtcyBmb3Ige0BsaW5rIGdlbmVyYXRlTWFya2Rvd25TdHlsZUxpbmt9LlxuICovXG5pbnRlcmZhY2UgR2VuZXJhdGVNYXJrZG93blN0eWxlTGlua1BhcmFtcyB7XG4gIC8qKlxuICAgKiBBIGNvbmZpZ3VyYXRpb24gb2YgdGhlIGxpbmsuXG4gICAqL1xuICByZWFkb25seSBjb25maWc6IExpbmtDb25maWc7XG5cbiAgLyoqXG4gICAqIEEgdGV4dCBvZiB0aGUgbGluay5cbiAgICovXG4gIHJlYWRvbmx5IGxpbmtUZXh0OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBwYXJhbXMgZm9yIGdlbmVyYXRpbmcgdGhlIG1hcmtkb3duIGxpbmsuXG4gICAqL1xuICByZWFkb25seSBtYXJrZG93bkxpbmtQYXJhbXM6IEdlbmVyYXRlTWFya2Rvd25MaW5rUGFyYW1zO1xuXG4gIC8qKlxuICAgKiBBIHRhcmdldCBmaWxlIG9mIHRoZSBsaW5rLlxuICAgKi9cbiAgcmVhZG9ubHkgdGFyZ2V0RmlsZTogVEZpbGU7XG59XG5cbi8qKlxuICogUGFyYW1zIGZvciB7QGxpbmsgZ2VuZXJhdGVXaWtpTGlua30uXG4gKi9cbmludGVyZmFjZSBHZW5lcmF0ZVdpa2lMaW5rUGFyYW1zIHtcbiAgLyoqXG4gICAqIEFuIGFsaWFzIG9mIHRoZSBsaW5rLlxuICAgKi9cbiAgcmVhZG9ubHkgYWxpYXM6IHN0cmluZyB8IHVuZGVmaW5lZDtcblxuICAvKipcbiAgICogV2hldGhlciB0aGUgbGluayBzaG91bGQgYmUgYW4gZW1iZWQgbGluay5cbiAgICovXG4gIHJlYWRvbmx5IGlzRW1iZWQ6IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIEEgdGV4dCBvZiB0aGUgbGluay5cbiAgICovXG4gIHJlYWRvbmx5IGxpbmtUZXh0OiBzdHJpbmc7XG59XG5cbi8qKlxuICogUGFyYW1zIGZvciB7QGxpbmsgZ2V0RmlsZUNoYW5nZXN9LlxuICovXG5pbnRlcmZhY2UgR2V0RmlsZUNoYW5nZXNQYXJhbXMge1xuICAvKipcbiAgICogQW4gYWJvcnQgc2lnbmFsIHRvIGNvbnRyb2wgdGhlIGV4ZWN1dGlvbiBvZiB0aGUgZnVuY3Rpb24uXG4gICAqL1xuICByZWFkb25seSBhYm9ydFNpZ25hbD86IEFib3J0U2lnbmFsO1xuXG4gIC8qKlxuICAgKiBBIG1ldGFkYXRhIGNhY2hlIHRvIGV4dHJhY3QgdGhlIGxpbmtzIGZyb20uXG4gICAqL1xuICByZWFkb25seSBjYWNoZTogQ2FjaGVkTWV0YWRhdGEgfCBudWxsO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRoZSBjYWNoZSBiZWxvbmdzIHRvIGEgY2FudmFzIGZpbGUuXG4gICAqL1xuICByZWFkb25seSBpc0NhbnZhc0ZpbGVDYWNoZTogYm9vbGVhbjtcblxuICAvKipcbiAgICogQSByYW5nZSB3aXRoaW4gdGhlIGNvbnRlbnQsIGluIGNoYXJhY3RlciBvZmZzZXRzLCByZXN0cmljdGluZyB0aGUgY2hhbmdlcyB0byB0aGUgbGlua3MgZnVsbHkgY29udGFpbmVkXG4gICAqIGluIGl0LiBXaGVuIG9taXR0ZWQsIGV2ZXJ5IGxpbmsgaXMgdmlzaXRlZC5cbiAgICpcbiAgICogQGRlZmF1bHQgYHVuZGVmaW5lZGBcbiAgICovXG4gIHJlYWRvbmx5IG9mZnNldFJhbmdlPzogT2Zmc2V0UmFuZ2U7XG5cbiAgLyoqXG4gICAqIEEgZnVuY3Rpb24gdGhhdCBjb252ZXJ0cyBlYWNoIHJlZmVyZW5jZS5cbiAgICovXG4gIHJlYWRvbmx5IHJlZmVyZW5jZUNvbnZlcnRlcjogKHJlZmVyZW5jZTogUmVmZXJlbmNlLCBhYm9ydFNpZ25hbDogQWJvcnRTaWduYWwpID0+IFByb21pc2FibGU8TWF5YmVSZXR1cm48c3RyaW5nPj47XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdG8gaW5jbHVkZSBleHRlcm5hbCBsaW5rcyAocGFyc2VkIGZyb20gdGhlIG5vdGUgYm9keSkgaW4gdGhlIGNoYW5nZXMuXG4gICAqXG4gICAqIEBkZWZhdWx0IGBmYWxzZWBcbiAgICovXG4gIHJlYWRvbmx5IHNob3VsZEluY2x1ZGVFeHRlcm5hbExpbmtzPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogV2hldGhlciB0byBpbmNsdWRlIGV4dGVybmFsIGxpbmtzIChwYXJzZWQgZnJvbSBmcm9udG1hdHRlciB2YWx1ZXMpIGluIHRoZSBjaGFuZ2VzLlxuICAgKlxuICAgKiBAZGVmYXVsdCBgZmFsc2VgXG4gICAqL1xuICByZWFkb25seSBzaG91bGRJbmNsdWRlRnJvbnRtYXR0ZXJFeHRlcm5hbExpbmtzPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogV2hldGhlciB0byBpbmNsdWRlIGV4dGVybmFsIGxpbmtzIChwYXJzZWQgZnJvbSBtdWx0aS1saW5rIGZyb250bWF0dGVyIHZhbHVlcykgaW4gdGhlIGNoYW5nZXMuXG4gICAqXG4gICAqIEBkZWZhdWx0IGBmYWxzZWBcbiAgICovXG4gIHJlYWRvbmx5IHNob3VsZEluY2x1ZGVNdWx0aVZhbHVlRnJvbnRtYXR0ZXJFeHRlcm5hbExpbmtzPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogQSBwcmVkaWNhdGUgY2hvb3NpbmcgbGlua3MgdG8gbGVhdmUgdW5jaGFuZ2VkOiBmb3IgZWFjaCByZWZlcmVuY2UgaXQgcmV0dXJucyBgdHJ1ZWAgZm9yLCB0aGUgY29udmVydGVyIGlzXG4gICAqIG5vdCBjYWxsZWQsIHNvIHRoZSBsaW5rIHN0YXlzIGJ5dGUtZm9yLWJ5dGUgYXMgd3JpdHRlbiDigJQgaXRzIHBhdGgsIHN0eWxlLCBhbmdsZSBicmFja2V0cyBhbmQgbGVhZGluZyBkb3RcbiAgICogaW5jbHVkZWQuIFVzZSBpdCB0byBleGNsdWRlIGxpbmtzIHRoZSBjYWxsZXIgZGVjaWRlcyBvbiwgZm9yIGV4YW1wbGUgYnkgdGhlaXIgcmVzb2x2ZWQgdGFyZ2V0IHBhdGguXG4gICAqXG4gICAqIEFwcGxpZWQgYWZ0ZXIgdGhlIHtAbGluayBpc1JlZmVyZW5jZUluSGVhZGluZyB8IGhlYWRpbmd9IHNraXAgYW5kIHRoZSBvZmZzZXQgcmFuZ2UuXG4gICAqXG4gICAqIEBkZWZhdWx0IGB1bmRlZmluZWRgXG4gICAqL1xuICByZWFkb25seSBzaG91bGRTa2lwUmVmZXJlbmNlPzogKHJlZmVyZW5jZTogUmVmZXJlbmNlKSA9PiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRvIGxlYXZlIGV2ZXJ5IGxpbmsgaW5zaWRlIGEgaGVhZGluZyB1bmNoYW5nZWQsIHdpdGhvdXQgY2FsbGluZyB0aGUgY29udmVydGVyIGZvciBpdC5cbiAgICpcbiAgICogQGRlZmF1bHQgYGZhbHNlYFxuICAgKi9cbiAgcmVhZG9ubHkgc2hvdWxkU2tpcFJlZmVyZW5jZXNJbkhlYWRpbmdzPzogYm9vbGVhbjtcbn1cblxuaW50ZXJmYWNlIExpbmtDb25maWcge1xuICByZWFkb25seSBpc0VtYmVkOiBib29sZWFuO1xuICByZWFkb25seSBpc1NpbmdsZVN1YnBhdGhBbGxvd2VkOiBib29sZWFuO1xuICByZWFkb25seSBpc1dpa2lsaW5rOiBib29sZWFuO1xuICByZWFkb25seSBsaW5rUGF0aFN0eWxlOiBGaW5hbExpbmtQYXRoU3R5bGU7XG4gIHJlYWRvbmx5IHNob3VsZFVzZUFuZ2xlQnJhY2tldHM6IGJvb2xlYW47XG4gIHJlYWRvbmx5IHNob3VsZFVzZUxlYWRpbmdEb3RGb3JSZWxhdGl2ZVBhdGhzOiBib29sZWFuO1xuICByZWFkb25seSBzaG91bGRVc2VMZWFkaW5nU2xhc2hGb3JBYnNvbHV0ZVBhdGhzOiBib29sZWFuO1xufVxuXG4vKipcbiAqIFBhcmFtcyBmb3Ige0BsaW5rIHJlZnJlc2hGaWxlTmFtZUFsaWFzfS5cbiAqL1xuaW50ZXJmYWNlIFJlZnJlc2hGaWxlTmFtZUFsaWFzUGFyYW1zIHtcbiAgLyoqXG4gICAqIFRoZSBhbGlhcyB0aGUgbGluayBjYXJyaWVzLCBpZiBhbnkuXG4gICAqL1xuICByZWFkb25seSBhbGlhczogc3RyaW5nIHwgdW5kZWZpbmVkO1xuXG4gIC8qKlxuICAgKiBUaGUgT2JzaWRpYW4gYXBwIGluc3RhbmNlLlxuICAgKi9cbiAgcmVhZG9ubHkgYXBwOiBBcHA7XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgYW4gYWxpYXMgbWF5IGJlIGFkZGVkIHRvIGEgbGluayB0aGF0IGhhcyBub25lLlxuICAgKi9cbiAgcmVhZG9ubHkgY2FuQWRkQWxpYXM6IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFRoZSB0YXJnZXQgYWZ0ZXIgdGhlIHJlbmFtZS5cbiAgICovXG4gIHJlYWRvbmx5IG5ld1RhcmdldEZpbGU6IFRGaWxlO1xuXG4gIC8qKlxuICAgKiBUaGUgdGFyZ2V0J3MgcGF0aCBiZWZvcmUgdGhlIHJlbmFtZS5cbiAgICovXG4gIHJlYWRvbmx5IG9sZFRhcmdldFBhdGg6IHN0cmluZztcbn1cblxuLyoqXG4gKiBQYXJhbXMgZm9yIHtAbGluayByZXNvbHZlU25hcHNob3RSZWZlcmVuY2VJZGVudGl0eUtleVByb3ZpZGVyfS5cbiAqL1xuaW50ZXJmYWNlIFJlc29sdmVTbmFwc2hvdFJlZmVyZW5jZUlkZW50aXR5S2V5UHJvdmlkZXJQYXJhbXMge1xuICAvKipcbiAgICogVGhlIHB1YmxpYyBmdW5jdGlvbiBhc2tpbmcsIG5hbWVkIGluIHRoZSBlcnJvci5cbiAgICovXG4gIHJlYWRvbmx5IGNhbGxlck5hbWU6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIHByb3ZpZGVyIHRoZSBjYWxsZXIgcGFzc2VkLCBpZiBhbnkuXG4gICAqL1xuICByZWFkb25seSBleHBsaWNpdFJlZmVyZW5jZUlkZW50aXR5S2V5UHJvdmlkZXI6ICgocmVmZXJlbmNlOiBSZWZlcmVuY2UpID0+IHN0cmluZykgfCB1bmRlZmluZWQ7XG5cbiAgLyoqXG4gICAqIFRoZSBzbmFwc2hvdCB3aG9zZSByZWNvcmRlZCBwcm92aWRlciB3aW5zIHdoZW4gdGhlIGNhbGxlciBwYXNzZWQgbm9uZS5cbiAgICovXG4gIHJlYWRvbmx5IHNuYXBzaG90OiBCYWNrbGlua3NTbmFwc2hvdDx1bmtub3duPjtcbn1cblxuLyoqXG4gKiBQYXJhbXMgZm9yIHtAbGluayBzaG91bGRVc2VXaWtpbGlua1N0eWxlfS5cbiAqL1xuaW50ZXJmYWNlIFNob3VsZFVzZVdpa2lsaW5rU3R5bGVQYXJhbXMge1xuICAvKipcbiAgICogQW4gT2JzaWRpYW4gYXBwIGluc3RhbmNlLlxuICAgKi9cbiAgcmVhZG9ubHkgYXBwOiBBcHA7XG5cbiAgLyoqXG4gICAqIEEgc3R5bGUgb2YgdGhlIGxpbmsuXG4gICAqL1xuICByZWFkb25seSBsaW5rU3R5bGU/OiBMaW5rU3R5bGU7XG5cbiAgLyoqXG4gICAqIEFuIG9yaWdpbmFsIGxpbmsgdGV4dC5cbiAgICovXG4gIHJlYWRvbmx5IG9yaWdpbmFsTGluaz86IHN0cmluZztcbn1cblxuaW50ZXJmYWNlIFRhYmxlUG9zaXRpb24ge1xuICByZWFkb25seSBlbmQ6IG51bWJlcjtcbiAgcmVhZG9ubHkgc3RhcnQ6IG51bWJlcjtcbn1cblxuLyoqXG4gKiBQYXJhbXMgZm9yIHtAbGluayB1cGRhdGVSZWZlcmVuY2VzSW5Db250ZW50fS5cbiAqL1xuaW50ZXJmYWNlIFVwZGF0ZVJlZmVyZW5jZXNJbkNvbnRlbnRQYXJhbXMge1xuICAvKipcbiAgICogQW4gT2JzaWRpYW4gYXBwIGluc3RhbmNlLlxuICAgKi9cbiAgcmVhZG9ubHkgYXBwOiBBcHA7XG5cbiAgLyoqXG4gICAqIEEgY29udGVudCB0byB1cGRhdGUgdGhlIGxpbmtzIGluLlxuICAgKi9cbiAgcmVhZG9ubHkgY29udGVudDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRvIGFsbG93IGFuIGVtcHR5IGFsaWFzIGZvciBlbWJlZHMuXG4gICAqXG4gICAqIEFwcGxpY2FibGUgb25seSBpZiB0aGUgcmVzdWx0IGxpbmsgc3R5bGUgaXMge0BsaW5rIExpbmtTdHlsZS5NYXJrZG93bn0uXG4gICAqXG4gICAqIElmIGB0cnVlYDogYCFbXShmb28ucG5nKWAuXG4gICAqXG4gICAqIElmIGBmYWxzZWA6IGAhW2Zvb10oZm9vLnBuZylgLlxuICAgKlxuICAgKiBAZGVmYXVsdCBgdHJ1ZWBcbiAgICovXG4gIHJlYWRvbmx5IGlzRW1wdHlFbWJlZEFsaWFzQWxsb3dlZD86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIEEgc3R5bGUgb2YgdGhlIGxpbmsgcGF0aC5cbiAgICovXG4gIHJlYWRvbmx5IGxpbmtQYXRoU3R5bGU/OiBMaW5rUGF0aFN0eWxlO1xuXG4gIC8qKlxuICAgKiBBIHN0eWxlIG9mIHRoZSBsaW5rLlxuICAgKi9cbiAgcmVhZG9ubHkgbGlua1N0eWxlPzogTGlua1N0eWxlO1xuXG4gIC8qKlxuICAgKiBEZWNpZGVzIHRoZSBzdHlsZSBvZiBvbmUgbGluaywgb3ZlcnJpZGluZyB7QGxpbmsgbGlua1N0eWxlfSBmb3IgaXQuIFJldHVybmluZyBgdW5kZWZpbmVkYCBrZWVwc1xuICAgKiB7QGxpbmsgbGlua1N0eWxlfS5cbiAgICpcbiAgICogVXNlIGl0IHdoZW4gb25lIHN0eWxlIGZvciB0aGUgd2hvbGUgY29udGVudCBpcyB3cm9uZyBmb3Igc29tZSBvZiBpdHMgbGlua3MuIEEgY2FsbGVyIGZvcmNpbmdcbiAgICoge0BsaW5rIExpbmtTdHlsZS5NYXJrZG93bn0gb3ZlciBhIG5vdGUsIGZvciBleGFtcGxlLCBrZWVwcyBhIGZyb250bWF0dGVyIHdpa2lsaW5rIGEgd2lraWxpbmssIGJlY2F1c2VcbiAgICogT2JzaWRpYW4gcmVhZHMgYSBwcm9wZXJ0eSB2YWx1ZSBhcyBhIGxpbmsgb25seSBpbiB0aGF0IGZvcm0uXG4gICAqXG4gICAqIEBkZWZhdWx0IGB1bmRlZmluZWRgXG4gICAqL1xuICByZWFkb25seSBsaW5rU3R5bGVQcm92aWRlcj86IChyZWZlcmVuY2U6IFJlZmVyZW5jZSkgPT4gTGlua1N0eWxlIHwgdW5kZWZpbmVkO1xuXG4gIC8qKlxuICAgKiBBIG5ldyBzb3VyY2UgcGF0aCBvciBmaWxlLlxuICAgKi9cbiAgcmVhZG9ubHkgbmV3U291cmNlUGF0aE9yRmlsZTogUGF0aE9yRmlsZTtcblxuICAvKipcbiAgICogQSByYW5nZSB3aXRoaW4ge0BsaW5rIFVwZGF0ZVJlZmVyZW5jZXNJbkNvbnRlbnRQYXJhbXMuY29udGVudH0sIGluIGNoYXJhY3RlciBvZmZzZXRzLCByZXN0cmljdGluZyB0aGUgcGFzc1xuICAgKiB0byB0aGUgbGlua3MgaW5zaWRlIGl0LiBXaGVuIG9taXR0ZWQsIGV2ZXJ5IGxpbmsgaXMgdmlzaXRlZC5cbiAgICpcbiAgICogQSBsaW5rIGlzIHVwZGF0ZWQgb25seSB3aGVuIGl0IGlzICoqZnVsbHkgY29udGFpbmVkKiogaW4gdGhlIHJhbmdlOyBvbmUgdGhhdCBtZXJlbHkgb3ZlcmxhcHMgaXQgaXMgbGVmdFxuICAgKiBhbG9uZSwgYmVjYXVzZSByZXdyaXRpbmcgcGFydCBvZiBhIGxpbmsgY29ycnVwdHMgaXQuIEJvdGggYm91bmRzIGFyZSBpbmNsdXNpdmUsIHNvIGEgcmFuZ2Ugd2hvc2VcbiAgICogb2Zmc2V0cyBjb2luY2lkZSBleGFjdGx5IHdpdGggYSBsaW5rJ3MgZG9lcyBpbmNsdWRlIHRoYXQgbGluay5cbiAgICpcbiAgICogQSByZWZlcmVuY2UgdGhhdCBjYXJyaWVzIG5vIHBvc2l0aW9uIHdpdGhpbiB0aGUgY29udGVudCDigJQgYSBmcm9udG1hdHRlciBsaW5rLCBhIG11bHRpLWxpbmsgZnJvbnRtYXR0ZXJcbiAgICogdmFsdWUgZW50cnksIG9yIGFueSBjYW52YXMgcmVmZXJlbmNlIOKAlCBpcyBuZXZlciBpbiByYW5nZSBhbmQgaXMgc2tpcHBlZCB3aGVuZXZlciBhIHJhbmdlIGlzIHN1cHBsaWVkLlxuICAgKlxuICAgKiBAZGVmYXVsdCBgdW5kZWZpbmVkYFxuICAgKi9cbiAgcmVhZG9ubHkgb2Zmc2V0UmFuZ2U/OiBPZmZzZXRSYW5nZTtcblxuICAvKipcbiAgICogQW4gb2xkIHNvdXJjZSBwYXRoIG9yIGZpbGUuXG4gICAqL1xuICByZWFkb25seSBvbGRTb3VyY2VQYXRoT3JGaWxlPzogUGF0aE9yRmlsZTtcblxuICAvKipcbiAgICogV2hldGhlciB0byBlc2NhcGUgdGhlIGFsaWFzLlxuICAgKlxuICAgKiBBcHBsaWNhYmxlIG9ubHkgaWYgdGhlIHJlc3VsdCBsaW5rIHN0eWxlIGlzIHtAbGluayBMaW5rU3R5bGUuTWFya2Rvd259LlxuICAgKlxuICAgKiBJZiBgdHJ1ZWA6IGBbXFwqXFwqYWxpYXNcXCpcXCpdKGxpbmsubWQpYC5cbiAgICpcbiAgICogSWYgYGZhbHNlYDogYFsqKmFsaWFzKipdKGxpbmsubWQpYC5cbiAgICpcbiAgICogQGRlZmF1bHQgYGZhbHNlYFxuICAgKi9cbiAgcmVhZG9ubHkgc2hvdWxkRXNjYXBlQWxpYXM/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRvIGluY2x1ZGUgdGhlIGF0dGFjaG1lbnQgZXh0ZW5zaW9uIGluIHRoZSBlbWJlZCBhbGlhcy5cbiAgICpcbiAgICogQXBwbGljYWJsZSBvbmx5IGlmIHtAbGluayBpc0VtcHR5RW1iZWRBbGlhc0FsbG93ZWR9IGlzIGBmYWxzZWAuXG4gICAqXG4gICAqIElmIGB0cnVlYDogYFtmb28ucG5nXShmb28ucG5nKWAuXG4gICAqXG4gICAqIElmIGBmYWxzZWA6IGBbZm9vXShmb28ucG5nKWAuXG4gICAqXG4gICAqIEBkZWZhdWx0IGBmYWxzZWBcbiAgICovXG4gIHJlYWRvbmx5IHNob3VsZEluY2x1ZGVBdHRhY2htZW50RXh0ZW5zaW9uVG9FbWJlZEFsaWFzPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogQSBwcmVkaWNhdGUgY2hvb3NpbmcgbGlua3MgdG8gbGVhdmUgdW5jaGFuZ2VkOiBmb3IgZWFjaCByZWZlcmVuY2UgaXQgcmV0dXJucyBgdHJ1ZWAgZm9yLCB0aGUgY29udmVydGVyIGlzXG4gICAqIG5vdCBjYWxsZWQsIHNvIHRoZSBsaW5rIHN0YXlzIGJ5dGUtZm9yLWJ5dGUgYXMgd3JpdHRlbiDigJQgaXRzIHBhdGgsIHN0eWxlLCBhbmdsZSBicmFja2V0cyBhbmQgbGVhZGluZyBkb3RcbiAgICogaW5jbHVkZWQuIFVzZSBpdCB0byBleGNsdWRlIGxpbmtzIHRoZSBjYWxsZXIgZGVjaWRlcyBvbiwgZm9yIGV4YW1wbGUgYnkgdGhlaXIgcmVzb2x2ZWQgdGFyZ2V0IHBhdGguXG4gICAqXG4gICAqIEFwcGxpZWQgYWZ0ZXIgdGhlIHtAbGluayBpc1JlZmVyZW5jZUluSGVhZGluZyB8IGhlYWRpbmd9IHNraXAgYW5kIHRoZSBvZmZzZXQgcmFuZ2UuXG4gICAqXG4gICAqIEBkZWZhdWx0IGB1bmRlZmluZWRgXG4gICAqL1xuICByZWFkb25seSBzaG91bGRTa2lwUmVmZXJlbmNlPzogKHJlZmVyZW5jZTogUmVmZXJlbmNlKSA9PiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRvIGxlYXZlIGV2ZXJ5IGxpbmsgaW5zaWRlIGEgaGVhZGluZyB1bmNoYW5nZWQ6IGl0IGlzIG5laXRoZXIgY29udmVydGVkIG5vciByZXN0eWxlZCwgc28gaXRcbiAgICogc3RheXMgYnl0ZS1mb3ItYnl0ZSBhcyB3cml0dGVuLiBBIGxpbmsgaW4gYSBoZWFkaW5nIGlzIHBhcnQgb2YgdGhlIGhlYWRpbmcncyB0ZXh0LCBzbyByZXdyaXRpbmcgaXRcbiAgICogY2hhbmdlcyB0aGF0IHRleHQgYW5kIGJyZWFrcyBldmVyeSBgI2hlYWRpbmdgIHN1YnBhdGggcG9pbnRpbmcgYXQgdGhlIGhlYWRpbmcuIFNlZVxuICAgKiB7QGxpbmsgaXNSZWZlcmVuY2VJbkhlYWRpbmd9LlxuICAgKlxuICAgKiBAZGVmYXVsdCBgZmFsc2VgXG4gICAqL1xuICByZWFkb25seSBzaG91bGRTa2lwUmVmZXJlbmNlc0luSGVhZGluZ3M/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRvIHVwZGF0ZSBvbmx5IGVtYmVkZGVkIGxpbmtzLlxuICAgKi9cbiAgcmVhZG9ubHkgc2hvdWxkVXBkYXRlRW1iZWRPbmx5TGlua3M/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRvIHVwZGF0ZSBmaWxlIG5hbWUgYWxpYXMuXG4gICAqXG4gICAqIEBkZWZhdWx0IGB0cnVlYFxuICAgKi9cbiAgcmVhZG9ubHkgc2hvdWxkVXBkYXRlRmlsZU5hbWVBbGlhcz86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIEluZGljYXRlcyBpZiB0aGUgbGluayBzaG91bGQgdXNlIGFuZ2xlIGJyYWNrZXRzLlxuICAgKlxuICAgKiBBcHBsaWNhYmxlIG9ubHkgaWYge0BsaW5rIGxpbmtTdHlsZX0gaXMge0BsaW5rIExpbmtTdHlsZS5NYXJrZG93bn0uXG4gICAqXG4gICAqIElmIGB0cnVlYDogYFthbGlhc10oPHBhdGggd2l0aCBzcGFjZXMubWQ+KWAuXG4gICAqXG4gICAqIElmIGBmYWxzZWA6IGBbYWxpYXNdKHBhdGglMjB3aXRoJTIwc3BhY2VzLm1kKWAuXG4gICAqXG4gICAqIEBkZWZhdWx0IGBmYWxzZWBcbiAgICovXG4gIHJlYWRvbmx5IHNob3VsZFVzZUFuZ2xlQnJhY2tldHM/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBJbmRpY2F0ZXMgaWYgdGhlIGxpbmsgc2hvdWxkIHVzZSBhIGxlYWRpbmcgZG90LlxuICAgKlxuICAgKiBBcHBsaWNhYmxlIG9ubHkgaWYge0BsaW5rIGxpbmtQYXRoU3R5bGV9IGlzIHtAbGluayBMaW5rUGF0aFN0eWxlLlJlbGF0aXZlUGF0aFRvVGhlU291cmNlfS5cbiAgICpcbiAgICogSWYgYHRydWVgOiBgW1suL3JlbGF0aXZlL3BhdGgvdG8vdGFyZ2V0XV1gXG4gICAqXG4gICAqIElmIGBmYWxzZWA6IGBbW3JlbGF0aXZlL3BhdGgvdG8vdGFyZ2V0XV1gXG4gICAqXG4gICAqIEBkZWZhdWx0IGBmYWxzZWBcbiAgICovXG4gIHJlYWRvbmx5IHNob3VsZFVzZUxlYWRpbmdEb3RGb3JSZWxhdGl2ZVBhdGhzPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogSW5kaWNhdGVzIGlmIHRoZSBsaW5rIHNob3VsZCB1c2UgYSBsZWFkaW5nIHNsYXNoLlxuICAgKlxuICAgKiBBcHBsaWNhYmxlIG9ubHkgaWYge0BsaW5rIGxpbmtQYXRoU3R5bGV9IGlzIHtAbGluayBMaW5rUGF0aFN0eWxlLkFic29sdXRlUGF0aEluVmF1bHR9LlxuICAgKlxuICAgKiBJZiBgdHJ1ZWA6IGBbWy9hYnNvbHV0ZS9wYXRoL3RvL3RhcmdldF1dYFxuICAgKlxuICAgKiBJZiBgZmFsc2VgOiBgW1thYnNvbHV0ZS9wYXRoL3RvL3RhcmdldF1dYFxuICAgKlxuICAgKiBAZGVmYXVsdCBgZmFsc2VgXG4gICAqL1xuICByZWFkb25seSBzaG91bGRVc2VMZWFkaW5nU2xhc2hGb3JBYnNvbHV0ZVBhdGhzPzogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBSZWNvcmRzIGEgc2V0IG9mIGJhY2tsaW5rcyBpbnRvIGEgc25hcHNob3QgdGhhdCB7QGxpbmsgZWRpdEJhY2tsaW5rc1NuYXBzaG90fSBjYW4gcmV3cml0ZSBsYXRlci5cbiAqXG4gKiBDYWxsIGl0IG9uY2UgcGVyIHRhcmdldCBhbmQgcGFzcyB7QGxpbmsgQnVpbGRCYWNrbGlua3NTbmFwc2hvdFBhcmFtcy50YXJnZXR9IHRvIGFjY3VtdWxhdGUgc2V2ZXJhbCB0YXJnZXRzXG4gKiBpbnRvIG9uZSBzbmFwc2hvdCwgc28gdGhhdCBhIG5vdGUgbGlua2luZyB0byBzZXZlcmFsIG9mIHRoZW0gaXMgc3RpbGwgcmV3cml0dGVuIGV4YWN0bHkgb25jZS5cbiAqXG4gKiBAdHlwZVBhcmFtIFRQYXlsb2FkIC0gVGhlIHBheWxvYWQgcmVjb3JkZWQgZm9yIGVhY2ggcmVmZXJlbmNlLlxuICogQHBhcmFtIHBhcmFtcyAtIFRoZSBwYXJhbWV0ZXJzIGZvciBidWlsZGluZyB0aGUgc25hcHNob3QuXG4gKiBAcmV0dXJucyBUaGUgc25hcHNob3Qg4oCUIHtAbGluayBCdWlsZEJhY2tsaW5rc1NuYXBzaG90UGFyYW1zLnRhcmdldH0gaXRzZWxmIHdoZW4gb25lIHdhcyBwYXNzZWQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBidWlsZEJhY2tsaW5rc1NuYXBzaG90PFRQYXlsb2FkPihwYXJhbXM6IEJ1aWxkQmFja2xpbmtzU25hcHNob3RQYXJhbXM8VFBheWxvYWQ+KTogTXV0YWJsZUJhY2tsaW5rc1NuYXBzaG90PFRQYXlsb2FkPiB7XG4gIGNvbnN0IHtcbiAgICBiYWNrbGlua3MsXG4gICAgcGF0aFJlbWFwcGVyLFxuICAgIHBheWxvYWRQcm92aWRlcixcbiAgICByZWZlcmVuY2VJZGVudGl0eUtleVByb3ZpZGVyOiBleHBsaWNpdFJlZmVyZW5jZUlkZW50aXR5S2V5UHJvdmlkZXIsXG4gICAgdGFyZ2V0XG4gIH0gPSBwYXJhbXM7XG5cbiAgY29uc3Qgc25hcHNob3QgPSB0YXJnZXQgPz8gbmV3IE1hcDxzdHJpbmcsIE1hcDxzdHJpbmcsIFRQYXlsb2FkPj4oKTtcbiAgY29uc3QgcmVmZXJlbmNlSWRlbnRpdHlLZXlQcm92aWRlciA9IHJlc29sdmVTbmFwc2hvdFJlZmVyZW5jZUlkZW50aXR5S2V5UHJvdmlkZXIoe1xuICAgIGNhbGxlck5hbWU6ICdidWlsZEJhY2tsaW5rc1NuYXBzaG90JyxcbiAgICBleHBsaWNpdFJlZmVyZW5jZUlkZW50aXR5S2V5UHJvdmlkZXIsXG4gICAgc25hcHNob3RcbiAgfSk7XG4gIHNuYXBzaG90UmVmZXJlbmNlSWRlbnRpdHlLZXlQcm92aWRlcnMuc2V0KHNuYXBzaG90LCByZWZlcmVuY2VJZGVudGl0eUtleVByb3ZpZGVyKTtcblxuICBmb3IgKGNvbnN0IGJhY2tsaW5rUGF0aCBvZiBiYWNrbGlua3Mua2V5cygpKSB7XG4gICAgY29uc3QgbmV3QmFja2xpbmtQYXRoID0gcGF0aFJlbWFwcGVyPy4oYmFja2xpbmtQYXRoKSA/PyBiYWNrbGlua1BhdGg7XG4gICAgbGV0IHBheWxvYWRzID0gc25hcHNob3QuZ2V0KG5ld0JhY2tsaW5rUGF0aCk7XG4gICAgaWYgKCFwYXlsb2Fkcykge1xuICAgICAgcGF5bG9hZHMgPSBuZXcgTWFwPHN0cmluZywgVFBheWxvYWQ+KCk7XG4gICAgICBzbmFwc2hvdC5zZXQobmV3QmFja2xpbmtQYXRoLCBwYXlsb2Fkcyk7XG4gICAgfVxuXG4gICAgLyogdjggaWdub3JlIG5leHQgLS0gQSBrZXkgeWllbGRlZCBieSBga2V5cygpYCBhbHdheXMgcmVzb2x2ZXM7IHRoZSBgPz8gW11gIGlzIGRlZmVuc2l2ZS4gKi9cbiAgICBmb3IgKGNvbnN0IHJlZmVyZW5jZSBvZiBiYWNrbGlua3MuZ2V0KGJhY2tsaW5rUGF0aCkgPz8gW10pIHtcbiAgICAgIHBheWxvYWRzLnNldChyZWZlcmVuY2VJZGVudGl0eUtleVByb3ZpZGVyKHJlZmVyZW5jZSksIHBheWxvYWRQcm92aWRlcihyZWZlcmVuY2UpKTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gc25hcHNob3Q7XG59XG5cbi8qKlxuICogQ29udmVydHMgYSBsaW5rIHRvIGEgbmV3IHBhdGguXG4gKlxuICogQHBhcmFtIHBhcmFtcyAtIFRoZSBwYXJhbWV0ZXJzIGZvciBjb252ZXJ0aW5nIHRoZSBsaW5rLlxuICogQHJldHVybnMgVGhlIGNvbnZlcnRlZCBsaW5rLlxuICovXG5leHBvcnQgZnVuY3Rpb24gY29udmVydExpbmsocGFyYW1zOiBDb252ZXJ0TGlua1BhcmFtcyk6IHN0cmluZyB7XG4gIGNvbnN0IHRhcmdldEZpbGUgPSBleHRyYWN0UmVmZXJlbmNlRmlsZSh7XG4gICAgYXBwOiBwYXJhbXMuYXBwLFxuICAgIHJlZmVyZW5jZTogcGFyYW1zLnJlZmVyZW5jZSxcbiAgICBzb3VyY2VQYXRoT3JGaWxlOiBwYXJhbXMub2xkU291cmNlUGF0aE9yRmlsZSA/PyBwYXJhbXMubmV3U291cmNlUGF0aE9yRmlsZVxuICB9KTtcbiAgcmV0dXJuIHRhcmdldEZpbGVcbiAgICA/IHVwZGF0ZUxpbmsobm9ybWFsaXplT3B0aW9uYWxQcm9wZXJ0aWVzPFVwZGF0ZUxpbmtQYXJhbXM+KHtcbiAgICAgIGFwcDogcGFyYW1zLmFwcCxcbiAgICAgIGlzRW1wdHlFbWJlZEFsaWFzQWxsb3dlZDogcGFyYW1zLmlzRW1wdHlFbWJlZEFsaWFzQWxsb3dlZCxcbiAgICAgIGxpbmtQYXRoU3R5bGU6IHBhcmFtcy5saW5rUGF0aFN0eWxlLFxuICAgICAgbGlua1N0eWxlOiBwYXJhbXMubGlua1N0eWxlLFxuICAgICAgbmV3U291cmNlUGF0aE9yRmlsZTogcGFyYW1zLm5ld1NvdXJjZVBhdGhPckZpbGUsXG4gICAgICBuZXdUYXJnZXRQYXRoT3JGaWxlOiB0YXJnZXRGaWxlLFxuICAgICAgb2xkU291cmNlUGF0aE9yRmlsZTogcGFyYW1zLm9sZFNvdXJjZVBhdGhPckZpbGUsXG4gICAgICByZWZlcmVuY2U6IHBhcmFtcy5yZWZlcmVuY2UsXG4gICAgICBzaG91bGRFc2NhcGVBbGlhczogcGFyYW1zLnNob3VsZEVzY2FwZUFsaWFzLFxuICAgICAgc2hvdWxkSW5jbHVkZUF0dGFjaG1lbnRFeHRlbnNpb25Ub0VtYmVkQWxpYXM6IHBhcmFtcy5zaG91bGRJbmNsdWRlQXR0YWNobWVudEV4dGVuc2lvblRvRW1iZWRBbGlhcyxcbiAgICAgIHNob3VsZFVwZGF0ZUZpbGVOYW1lQWxpYXM6IHBhcmFtcy5zaG91bGRVcGRhdGVGaWxlTmFtZUFsaWFzLFxuICAgICAgc2hvdWxkVXNlQW5nbGVCcmFja2V0czogcGFyYW1zLnNob3VsZFVzZUFuZ2xlQnJhY2tldHMsXG4gICAgICBzaG91bGRVc2VMZWFkaW5nRG90Rm9yUmVsYXRpdmVQYXRoczogcGFyYW1zLnNob3VsZFVzZUxlYWRpbmdEb3RGb3JSZWxhdGl2ZVBhdGhzLFxuICAgICAgc2hvdWxkVXNlTGVhZGluZ1NsYXNoRm9yQWJzb2x1dGVQYXRoczogcGFyYW1zLnNob3VsZFVzZUxlYWRpbmdTbGFzaEZvckFic29sdXRlUGF0aHNcbiAgICB9KSlcbiAgICA6IGdldFJlZmVyZW5jZUxpbmtUZXh0KHBhcmFtcy5yZWZlcmVuY2UpO1xufVxuXG4vKipcbiAqIEVkaXRzIHRoZSBiYWNrbGlua3MgZm9yIGEgZmlsZSBvciBwYXRoLlxuICpcbiAqIEBwYXJhbSBwYXJhbXMgLSBUaGUgcGFyYW1ldGVycyBmb3IgZWRpdGluZyB0aGUgYmFja2xpbmtzLlxuICogQHJldHVybnMgQSB7QGxpbmsgUHJvbWlzZX0gdGhhdCByZXNvbHZlcyB3aGVuIHRoZSBiYWNrbGlua3MgaGF2ZSBiZWVuIGVkaXRlZC5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGVkaXRCYWNrbGlua3MocGFyYW1zOiBFZGl0QmFja2xpbmtzUGFyYW1zKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IHtcbiAgICBhcHAsXG4gICAgbGlua1VwZGF0ZVByb2dyZXNzUmVwb3J0ZXIsXG4gICAgcGF0aE9yRmlsZSxcbiAgICByZWZlcmVuY2VDb252ZXJ0ZXIsXG4gICAgLi4ub3B0aW9uc1xuICB9ID0gcGFyYW1zO1xuICBjb25zdCBiYWNrbGlua3MgPSBhd2FpdCBnZXRCYWNrbGlua3NGb3JGaWxlU2FmZSh7IGFwcCwgcGF0aE9yRmlsZSwgLi4ub3B0aW9ucyB9KTtcbiAgY29uc3Qgc25hcHNob3QgPSBidWlsZEJhY2tsaW5rc1NuYXBzaG90PHVuZGVmaW5lZD4oe1xuICAgIGJhY2tsaW5rcyxcbiAgICBwYXlsb2FkUHJvdmlkZXI6IGdldFVuZGVmaW5lZFBheWxvYWRcbiAgfSk7XG4gIGF3YWl0IGVkaXRCYWNrbGlua3NTbmFwc2hvdChub3JtYWxpemVPcHRpb25hbFByb3BlcnRpZXM8RWRpdEJhY2tsaW5rc1NuYXBzaG90UGFyYW1zPHVuZGVmaW5lZD4+KHtcbiAgICBhcHAsXG4gICAgbGlua1VwZGF0ZVByb2dyZXNzUmVwb3J0ZXIsXG4gICAgcmVmZXJlbmNlQ29udmVydGVyOiAoeyByZWZlcmVuY2UgfSkgPT4gcmVmZXJlbmNlQ29udmVydGVyKHJlZmVyZW5jZSksXG4gICAgc25hcHNob3QsXG4gICAgLi4ub3B0aW9uc1xuICB9KSk7XG59XG5cbi8qKlxuICogRWRpdHMgYSBjYXB0dXJlZCBzbmFwc2hvdCBvZiBiYWNrbGlua3MsIHJld3JpdGluZyBlYWNoIGJhY2tsaW5rLWhvbGRpbmcgbm90ZSBleGFjdGx5IG9uY2UuXG4gKlxuICogVGhlIGNvdW50ZXJwYXJ0IG9mIHtAbGluayBlZGl0QmFja2xpbmtzfSBmb3IgY2FsbGVycyB0aGF0IGNhbm5vdCBmZXRjaCB0aGUgYmFja2xpbmtzIGF0IHJld3JpdGUgdGltZSDigJRcbiAqIGJlY2F1c2UgdGhlIHJlbmFtZSB0aGF0IGludmFsaWRhdGVkIHRoZW0gaGFzIGFscmVhZHkgaGFwcGVuZWQg4oCUIG9yIHRoYXQgcmV3cml0ZSBsaW5rcyB0byBzZXZlcmFsIHRhcmdldHNcbiAqIGF0IG9uY2UuIFNlZSB7QGxpbmsgQmFja2xpbmtzU25hcHNob3R9IGZvciBib3RoIGNhc2VzLlxuICpcbiAqIEB0eXBlUGFyYW0gVFBheWxvYWQgLSBUaGUgcGF5bG9hZCByZWNvcmRlZCBmb3IgZWFjaCByZWZlcmVuY2Ugd2hlbiB0aGUgc25hcHNob3Qgd2FzIGJ1aWx0LlxuICogQHBhcmFtIHBhcmFtcyAtIFRoZSBwYXJhbWV0ZXJzIGZvciBlZGl0aW5nIHRoZSBiYWNrbGlua3MuXG4gKiBAcmV0dXJucyBBIHtAbGluayBQcm9taXNlfSB0aGF0IHJlc29sdmVzIHdoZW4gdGhlIGJhY2tsaW5rcyBoYXZlIGJlZW4gZWRpdGVkLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZWRpdEJhY2tsaW5rc1NuYXBzaG90PFRQYXlsb2FkPihwYXJhbXM6IEVkaXRCYWNrbGlua3NTbmFwc2hvdFBhcmFtczxUUGF5bG9hZD4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3Qge1xuICAgIGFwcCxcbiAgICBsaW5rVXBkYXRlUHJvZ3Jlc3NSZXBvcnRlcixcbiAgICByZWZlcmVuY2VDb252ZXJ0ZXIsXG4gICAgcmVmZXJlbmNlSWRlbnRpdHlLZXlQcm92aWRlcjogZXhwbGljaXRSZWZlcmVuY2VJZGVudGl0eUtleVByb3ZpZGVyLFxuICAgIHNob3VsZFZpc2l0VW5tYXRjaGVkUmVmZXJlbmNlcyA9IGZhbHNlLFxuICAgIHNuYXBzaG90LFxuICAgIC4uLm9wdGlvbnNcbiAgfSA9IHBhcmFtcztcbiAgY29uc3QgcmVmZXJlbmNlSWRlbnRpdHlLZXlQcm92aWRlciA9IHJlc29sdmVTbmFwc2hvdFJlZmVyZW5jZUlkZW50aXR5S2V5UHJvdmlkZXIoe1xuICAgIGNhbGxlck5hbWU6ICdlZGl0QmFja2xpbmtzU25hcHNob3QnLFxuICAgIGV4cGxpY2l0UmVmZXJlbmNlSWRlbnRpdHlLZXlQcm92aWRlcixcbiAgICBzbmFwc2hvdFxuICB9KTtcblxuICBjb25zdCBiYWNrbGlua05vdGVQYXRocyA9IFsuLi5zbmFwc2hvdC5rZXlzKCldO1xuICBsZXQgcHJvY2Vzc2VkID0gMDtcbiAgZm9yIChjb25zdCBiYWNrbGlua05vdGVQYXRoIG9mIGJhY2tsaW5rTm90ZVBhdGhzKSB7XG4gICAgY29uc3QgcGF5bG9hZHMgPSBlbnN1cmVOb25OdWxsYWJsZShzbmFwc2hvdC5nZXQoYmFja2xpbmtOb3RlUGF0aCkpO1xuICAgIGF3YWl0IGVkaXRSZWZlcmVuY2VzKHtcbiAgICAgIGFwcCxcbiAgICAgIHBhdGhPckZpbGU6IGJhY2tsaW5rTm90ZVBhdGgsXG4gICAgICByZWZlcmVuY2VDb252ZXJ0ZXI6IChyZWZlcmVuY2UpID0+IHtcbiAgICAgICAgY29uc3QgcmVmZXJlbmNlSWRlbnRpdHlLZXkgPSByZWZlcmVuY2VJZGVudGl0eUtleVByb3ZpZGVyKHJlZmVyZW5jZSk7XG4gICAgICAgIHJldHVybiAhcGF5bG9hZHMuaGFzKHJlZmVyZW5jZUlkZW50aXR5S2V5KSAmJiAhc2hvdWxkVmlzaXRVbm1hdGNoZWRSZWZlcmVuY2VzXG4gICAgICAgICAgPyB1bmRlZmluZWRcbiAgICAgICAgICA6IHJlZmVyZW5jZUNvbnZlcnRlcih7XG4gICAgICAgICAgICBwYXlsb2FkOiBwYXlsb2Fkcy5nZXQocmVmZXJlbmNlSWRlbnRpdHlLZXkpLFxuICAgICAgICAgICAgcmVmZXJlbmNlLFxuICAgICAgICAgICAgc291cmNlUGF0aDogYmFja2xpbmtOb3RlUGF0aFxuICAgICAgICAgIH0pO1xuICAgICAgfSxcbiAgICAgIC4uLm9wdGlvbnNcbiAgICB9KTtcbiAgICBwcm9jZXNzZWQrKztcbiAgICBsaW5rVXBkYXRlUHJvZ3Jlc3NSZXBvcnRlcj8uKHtcbiAgICAgIGN1cnJlbnRQYXRoOiBiYWNrbGlua05vdGVQYXRoLFxuICAgICAgcHJvY2Vzc2VkLFxuICAgICAgdG90YWw6IGJhY2tsaW5rTm90ZVBhdGhzLmxlbmd0aFxuICAgIH0pO1xuICB9XG59XG5cbi8qKlxuICogRWRpdHMgdGhlIGxpbmtzIGZvciBhIGZpbGUgb3IgcGF0aC5cbiAqXG4gKiBAcGFyYW0gcGFyYW1zIC0gVGhlIHBhcmFtZXRlcnMgZm9yIGVkaXRpbmcgdGhlIGxpbmtzLlxuICogQHJldHVybnMgQSB7QGxpbmsgUHJvbWlzZX0gdGhhdCByZXNvbHZlcyB3aGVuIHRoZSBsaW5rcyBoYXZlIGJlZW4gZWRpdGVkLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZWRpdFJlZmVyZW5jZXMocGFyYW1zOiBFZGl0UmVmZXJlbmNlc1BhcmFtcyk6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCB7XG4gICAgYXBwLFxuICAgIG9mZnNldFJhbmdlLFxuICAgIHBhdGhPckZpbGUsXG4gICAgcmVmZXJlbmNlQ29udmVydGVyLFxuICAgIHNob3VsZEVkaXRFeHRlcm5hbExpbmtzID0gZmFsc2UsXG4gICAgc2hvdWxkRWRpdEZyb250bWF0dGVyRXh0ZXJuYWxMaW5rcyA9IGZhbHNlLFxuICAgIHNob3VsZEVkaXRNdWx0aVZhbHVlRnJvbnRtYXR0ZXJFeHRlcm5hbExpbmtzID0gZmFsc2UsXG4gICAgc2hvdWxkU2tpcFJlZmVyZW5jZSxcbiAgICBzaG91bGRTa2lwUmVmZXJlbmNlc0luSGVhZGluZ3MgPSBmYWxzZSxcbiAgICAuLi5vcHRpb25zXG4gIH0gPSBwYXJhbXM7XG5cbiAgaWYgKG9mZnNldFJhbmdlICE9PSB1bmRlZmluZWQpIHtcbiAgICB2YWxpZGF0ZU9mZnNldFJhbmdlKG9mZnNldFJhbmdlKTtcbiAgfVxuXG4gIGF3YWl0IGFwcGx5RmlsZUNoYW5nZXMoe1xuICAgIGFwcCxcbiAgICBjaGFuZ2VzUHJvdmlkZXI6IGFzeW5jICh7IGFib3J0U2lnbmFsLCBjb250ZW50IH0pID0+IHtcbiAgICAgIGNvbnN0IGNhY2hlID0gYXdhaXQgZ2V0Q2FjaGVTYWZlKGFwcCwgcGF0aE9yRmlsZSwge1xuICAgICAgICBzaG91bGRQYXJzZUV4dGVybmFsTGlua3M6IHNob3VsZEVkaXRFeHRlcm5hbExpbmtzLFxuICAgICAgICBzaG91bGRQYXJzZUZyb250bWF0dGVyRXh0ZXJuYWxMaW5rczogc2hvdWxkRWRpdEZyb250bWF0dGVyRXh0ZXJuYWxMaW5rcyxcbiAgICAgICAgc2hvdWxkUGFyc2VNdWx0aVZhbHVlRnJvbnRtYXR0ZXJFeHRlcm5hbExpbmtzOiBzaG91bGRFZGl0TXVsdGlWYWx1ZUZyb250bWF0dGVyRXh0ZXJuYWxMaW5rc1xuICAgICAgfSk7XG4gICAgICBhYm9ydFNpZ25hbC50aHJvd0lmQWJvcnRlZCgpO1xuICAgICAgY29uc3QgZmlsZSA9IGdldEZpbGUoeyBhcHAsIHBhdGhPckZpbGUgfSk7XG4gICAgICBjb25zdCBjYWNoZWRDb250ZW50ID0gYXdhaXQgYXBwLnZhdWx0LmNhY2hlZFJlYWQoZmlsZSk7XG4gICAgICBhYm9ydFNpZ25hbC50aHJvd0lmQWJvcnRlZCgpO1xuICAgICAgcmV0dXJuIGNvbnRlbnQgPT09IGNhY2hlZENvbnRlbnRcbiAgICAgICAgPyAoYXdhaXQgZ2V0RmlsZUNoYW5nZXMobm9ybWFsaXplT3B0aW9uYWxQcm9wZXJ0aWVzPEdldEZpbGVDaGFuZ2VzUGFyYW1zPih7XG4gICAgICAgICAgYWJvcnRTaWduYWwsXG4gICAgICAgICAgY2FjaGUsXG4gICAgICAgICAgaXNDYW52YXNGaWxlQ2FjaGU6IGlzQ2FudmFzRmlsZShwYXRoT3JGaWxlKSxcbiAgICAgICAgICBvZmZzZXRSYW5nZSxcbiAgICAgICAgICByZWZlcmVuY2VDb252ZXJ0ZXIsXG4gICAgICAgICAgc2hvdWxkSW5jbHVkZUV4dGVybmFsTGlua3M6IHNob3VsZEVkaXRFeHRlcm5hbExpbmtzLFxuICAgICAgICAgIHNob3VsZEluY2x1ZGVGcm9udG1hdHRlckV4dGVybmFsTGlua3M6IHNob3VsZEVkaXRGcm9udG1hdHRlckV4dGVybmFsTGlua3MsXG4gICAgICAgICAgc2hvdWxkSW5jbHVkZU11bHRpVmFsdWVGcm9udG1hdHRlckV4dGVybmFsTGlua3M6IHNob3VsZEVkaXRNdWx0aVZhbHVlRnJvbnRtYXR0ZXJFeHRlcm5hbExpbmtzLFxuICAgICAgICAgIHNob3VsZFNraXBSZWZlcmVuY2UsXG4gICAgICAgICAgc2hvdWxkU2tpcFJlZmVyZW5jZXNJbkhlYWRpbmdzXG4gICAgICAgIH0pKSlcbiAgICAgICAgOiBudWxsO1xuICAgIH0sXG4gICAgcGF0aE9yRmlsZSxcbiAgICAuLi5vcHRpb25zXG4gIH0pO1xufVxuXG4vKipcbiAqIEVkaXRzIHRoZSBsaW5rcyBpbiBhIGNvbnRlbnQgc3RyaW5nLlxuICpcbiAqIEBwYXJhbSBwYXJhbXMgLSBUaGUgcGFyYW1ldGVycyBmb3IgZWRpdGluZyB0aGUgbGlua3MgaW4gdGhlIGNvbnRlbnQuXG4gKiBAcmV0dXJucyBUaGUgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHRvIHRoZSB1cGRhdGVkIGNvbnRlbnQuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBlZGl0UmVmZXJlbmNlc0luQ29udGVudChwYXJhbXM6IEVkaXRSZWZlcmVuY2VzSW5Db250ZW50UGFyYW1zKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgY29uc3Qge1xuICAgIGFwcCxcbiAgICBjb250ZW50LFxuICAgIG9mZnNldFJhbmdlLFxuICAgIHJlZmVyZW5jZUNvbnZlcnRlcixcbiAgICBzaG91bGRFZGl0RXh0ZXJuYWxMaW5rcyA9IGZhbHNlLFxuICAgIHNob3VsZEVkaXRGcm9udG1hdHRlckV4dGVybmFsTGlua3MgPSBmYWxzZSxcbiAgICBzaG91bGRFZGl0TXVsdGlWYWx1ZUZyb250bWF0dGVyRXh0ZXJuYWxMaW5rcyA9IGZhbHNlLFxuICAgIHNob3VsZFNraXBSZWZlcmVuY2UsXG4gICAgc2hvdWxkU2tpcFJlZmVyZW5jZXNJbkhlYWRpbmdzID0gZmFsc2VcbiAgfSA9IHBhcmFtcztcbiAgbGV0IHsgYWJvcnRTaWduYWwgfSA9IHBhcmFtcztcbiAgYWJvcnRTaWduYWwgPz89IGFib3J0U2lnbmFsTmV2ZXIoKTtcbiAgYWJvcnRTaWduYWwudGhyb3dJZkFib3J0ZWQoKTtcblxuICBpZiAob2Zmc2V0UmFuZ2UgIT09IHVuZGVmaW5lZCkge1xuICAgIHZhbGlkYXRlT2Zmc2V0UmFuZ2Uob2Zmc2V0UmFuZ2UpO1xuICB9XG5cbiAgY29uc3QgbmV3Q29udGVudCA9IGF3YWl0IGFwcGx5Q29udGVudENoYW5nZXMoe1xuICAgIGFib3J0U2lnbmFsLFxuICAgIGNoYW5nZXNQcm92aWRlcjogYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgY2FjaGUgPSBhd2FpdCBwYXJzZU1ldGFkYXRhKGFwcCwgY29udGVudCwge1xuICAgICAgICBzaG91bGRQYXJzZUV4dGVybmFsTGlua3M6IHNob3VsZEVkaXRFeHRlcm5hbExpbmtzLFxuICAgICAgICBzaG91bGRQYXJzZUZyb250bWF0dGVyRXh0ZXJuYWxMaW5rczogc2hvdWxkRWRpdEZyb250bWF0dGVyRXh0ZXJuYWxMaW5rcyxcbiAgICAgICAgc2hvdWxkUGFyc2VNdWx0aVZhbHVlRnJvbnRtYXR0ZXJFeHRlcm5hbExpbmtzOiBzaG91bGRFZGl0TXVsdGlWYWx1ZUZyb250bWF0dGVyRXh0ZXJuYWxMaW5rc1xuICAgICAgfSk7XG4gICAgICBhYm9ydFNpZ25hbC50aHJvd0lmQWJvcnRlZCgpO1xuICAgICAgY29uc3QgY2hhbmdlcyA9IGF3YWl0IGdldEZpbGVDaGFuZ2VzKG5vcm1hbGl6ZU9wdGlvbmFsUHJvcGVydGllczxHZXRGaWxlQ2hhbmdlc1BhcmFtcz4oe1xuICAgICAgICBhYm9ydFNpZ25hbCxcbiAgICAgICAgY2FjaGUsXG4gICAgICAgIGlzQ2FudmFzRmlsZUNhY2hlOiBmYWxzZSxcbiAgICAgICAgb2Zmc2V0UmFuZ2UsXG4gICAgICAgIHJlZmVyZW5jZUNvbnZlcnRlcixcbiAgICAgICAgc2hvdWxkSW5jbHVkZUV4dGVybmFsTGlua3M6IHNob3VsZEVkaXRFeHRlcm5hbExpbmtzLFxuICAgICAgICBzaG91bGRJbmNsdWRlRnJvbnRtYXR0ZXJFeHRlcm5hbExpbmtzOiBzaG91bGRFZGl0RnJvbnRtYXR0ZXJFeHRlcm5hbExpbmtzLFxuICAgICAgICBzaG91bGRJbmNsdWRlTXVsdGlWYWx1ZUZyb250bWF0dGVyRXh0ZXJuYWxMaW5rczogc2hvdWxkRWRpdE11bHRpVmFsdWVGcm9udG1hdHRlckV4dGVybmFsTGlua3MsXG4gICAgICAgIHNob3VsZFNraXBSZWZlcmVuY2UsXG4gICAgICAgIHNob3VsZFNraXBSZWZlcmVuY2VzSW5IZWFkaW5nc1xuICAgICAgfSkpO1xuICAgICAgYWJvcnRTaWduYWwudGhyb3dJZkFib3J0ZWQoKTtcbiAgICAgIHJldHVybiBjaGFuZ2VzO1xuICAgIH0sXG4gICAgY29udGVudCxcbiAgICBwYXRoOiAnJ1xuICB9KTtcbiAgYWJvcnRTaWduYWwudGhyb3dJZkFib3J0ZWQoKTtcblxuICBhc3NlcnROb25OdWxsYWJsZShuZXdDb250ZW50LCAnRmFpbGVkIHRvIHVwZGF0ZSBsaW5rcyBpbiBjb250ZW50Jyk7XG5cbiAgcmV0dXJuIG5ld0NvbnRlbnQ7XG59XG5cbi8qKlxuICogRXh0cmFjdHMgdGhlIGZpbGUgYXNzb2NpYXRlZCB3aXRoIGEgbGluay5cbiAqXG4gKiBAcGFyYW0gcGFyYW1zIC0gVGhlIHBhcmFtZXRlcnMgZm9yIGV4dHJhY3RpbmcgdGhlIGxpbmsgZmlsZS5cbiAqIEByZXR1cm5zIFRoZSBmaWxlIGFzc29jaWF0ZWQgd2l0aCB0aGUgbGluaywgb3IgYG51bGxgIGlmIG5vdCBmb3VuZC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGV4dHJhY3RSZWZlcmVuY2VGaWxlKHBhcmFtczogRXh0cmFjdFJlZmVyZW5jZUZpbGVQYXJhbXMpOiBudWxsIHwgVEZpbGUge1xuICBjb25zdCB7XG4gICAgYXBwLFxuICAgIHJlZmVyZW5jZSxcbiAgICBzaG91bGRBbGxvd05vbkV4aXN0aW5nRmlsZSA9IGZhbHNlLFxuICAgIHNvdXJjZVBhdGhPckZpbGVcbiAgfSA9IHBhcmFtcztcbiAgY29uc3QgeyBsaW5rUGF0aCB9ID0gc3BsaXRTdWJwYXRoKHJlZmVyZW5jZS5saW5rKTtcbiAgY29uc3Qgc291cmNlUGF0aCA9IGdldFBhdGgoYXBwLCBzb3VyY2VQYXRoT3JGaWxlKTtcbiAgY29uc3QgZmlsZSA9IGFwcC5tZXRhZGF0YUNhY2hlLmdldEZpcnN0TGlua3BhdGhEZXN0KGxpbmtQYXRoLCBzb3VyY2VQYXRoKTtcbiAgaWYgKGZpbGUpIHtcbiAgICByZXR1cm4gZmlsZTtcbiAgfVxuXG4gIGlmICghc2hvdWxkQWxsb3dOb25FeGlzdGluZ0ZpbGUpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIGlmIChsaW5rUGF0aC5zdGFydHNXaXRoKCcvJykpIHtcbiAgICByZXR1cm4gZ2V0RmlsZSh7IGFwcCwgcGF0aE9yRmlsZTogbGlua1BhdGgsIHNob3VsZEluY2x1ZGVOb25FeGlzdGluZzogdHJ1ZSB9KTtcbiAgfVxuXG4gIGNvbnN0IGZ1bGxMaW5rUGF0aCA9IGpvaW4oZGlybmFtZShzb3VyY2VQYXRoKSwgYC4vJHtsaW5rUGF0aH1gKTtcblxuICByZXR1cm4gZnVsbExpbmtQYXRoLnN0YXJ0c1dpdGgoJy4uLycpID8gbnVsbCA6IGdldEZpbGUoeyBhcHAsIHBhdGhPckZpbGU6IGZ1bGxMaW5rUGF0aCwgc2hvdWxkSW5jbHVkZU5vbkV4aXN0aW5nOiB0cnVlIH0pO1xufVxuXG4vKipcbiAqIEdlbmVyYXRlcyBhIG1hcmtkb3duIGxpbmsgYmFzZWQgb24gdGhlIHByb3ZpZGVkIHBhcmFtZXRlcnMuXG4gKlxuICogQHBhcmFtIHBhcmFtcyAtIFRoZSBwYXJhbWV0ZXJzIGZvciBnZW5lcmF0aW5nIHRoZSBtYXJrZG93biBsaW5rLlxuICogQHJldHVybnMgVGhlIGdlbmVyYXRlZCBtYXJrZG93biBsaW5rLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2VuZXJhdGVNYXJrZG93bkxpbmsocGFyYW1zOiBHZW5lcmF0ZU1hcmtkb3duTGlua1BhcmFtcyk6IHN0cmluZyB7XG4gIGNvbnN0IHsgYXBwIH0gPSBwYXJhbXM7XG5cbiAgY29uc3QgREVGQVVMVF9QQVJBTVM6IFBhcnRpYWw8R2VuZXJhdGVNYXJrZG93bkxpbmtQYXJhbXM+ID0ge1xuICAgIGlzRW1wdHlFbWJlZEFsaWFzQWxsb3dlZDogdHJ1ZVxuICB9O1xuXG4gIGNvbnN0IGN1c3RvbURlZmF1bHRQYXJhbXMgPSBnZXRHZW5lcmF0ZU1hcmtkb3duTGlua0RlZmF1bHRQYXJhbXNGbnMoKS5tYXAoKGRlZmF1bHRQYXJhbXNGdW5jdGlvbikgPT4gZGVmYXVsdFBhcmFtc0Z1bmN0aW9uKCkpO1xuICAvLyBTdHJpcCBleHBsaWNpdCBgdW5kZWZpbmVkYHMgZmlyc3QsIG9uIGEgY29weSBzbyB0aGUgY2FsbGVyJ3Mgb2JqZWN0IGlzIHVudG91Y2hlZC5cbiAgLy8gQSBjYWxsZXIgZm9yd2FyZGluZyBldmVyeSBvcHRpb25hbCBwYXJhbSBzZW5kcyBvd24ga2V5cyBob2xkaW5nIGB1bmRlZmluZWRgIGZvciB0aGUgb25lcyBpdCBkaWQgbm90IHJlY2VpdmUuXG4gIC8vIFRob3NlIGFyZSBub3QgcmVtb3ZlZCBieSBgbm9ybWFsaXplT3B0aW9uYWxQcm9wZXJ0aWVzYCwgd2hpY2ggaXMgYSB0eXBlLWxldmVsIG5vLW9wLlxuICAvLyBXaXRob3V0IHRoZSBzdHJpcCwgc3VjaCBhIGtleSBvdmVyd3JpdGVzIGEgZGVmYXVsdCB3aXRoIGB1bmRlZmluZWRgIGluc3RlYWQgb2YgZmFsbGluZyB0aHJvdWdoIHRvIGl0LlxuICBwYXJhbXMgPSBPYmplY3QuYXNzaWduKHt9LCBERUZBVUxUX1BBUkFNUywgLi4uY3VzdG9tRGVmYXVsdFBhcmFtcywgcmVtb3ZlVW5kZWZpbmVkUHJvcGVydGllczxHZW5lcmF0ZU1hcmtkb3duTGlua1BhcmFtcz4oeyAuLi5wYXJhbXMgfSkpO1xuICBjb25zdCB0YXJnZXRGaWxlID0gZ2V0RmlsZShub3JtYWxpemVPcHRpb25hbFByb3BlcnRpZXM8R2V0RmlsZVBhcmFtcz4oeyBhcHAsIHBhdGhPckZpbGU6IHBhcmFtcy50YXJnZXRQYXRoT3JGaWxlLCBzaG91bGRJbmNsdWRlTm9uRXhpc3Rpbmc6IHBhcmFtcy5pc05vbkV4aXN0aW5nRmlsZUFsbG93ZWQgfSkpO1xuXG4gIHVzaW5nIF9yZWdpc3RyYXRpb24gPSByZWdpc3RlckZpbGVzKGFwcCwgW3RhcmdldEZpbGVdKTtcbiAgcmV0dXJuIGdlbmVyYXRlTWFya2Rvd25MaW5rSW1wbChwYXJhbXMpO1xufVxuXG4vKipcbiAqIEdlbmVyYXRlcyBhIHJhdyBtYXJrZG93biBsaW5rIGJhc2VkIG9uIHRoZSBwcm92aWRlZCBwYXJhbXMuXG4gKlxuICogQHBhcmFtIHBhcmFtcyAtIFRoZSBwYXJhbWV0ZXJzIGZvciBnZW5lcmF0aW5nIGEgcmF3IG1hcmtkb3duIGxpbmsuXG4gKiBAcmV0dXJucyBBIHJhdyBtYXJrZG93biBsaW5rLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2VuZXJhdGVSYXdNYXJrZG93bkxpbmsocGFyYW1zOiBHZW5lcmF0ZVJhd01hcmtkb3duTGlua1BhcmFtcyk6IHN0cmluZyB7XG4gIGNvbnN0IGVtYmVkUHJlZml4ID0gcGFyYW1zLmlzRW1iZWQgPyAnIScgOiAnJztcblxuICBpZiAocGFyYW1zLmlzV2lraWxpbmspIHtcbiAgICBjb25zdCBhbGlhc1BhcnQgPSBwYXJhbXMuYWxpYXMgPyBgfCR7cGFyYW1zLmFsaWFzfWAgOiAnJztcbiAgICByZXR1cm4gYCR7ZW1iZWRQcmVmaXh9W1ske3BhcmFtcy51cmx9JHthbGlhc1BhcnR9XV1gO1xuICB9XG5cbiAgY29uc3QgYWxpYXMgPSBwYXJhbXMuYWxpYXMgPz8gJyc7XG4gIGNvbnN0IHNob3VsZEVzY2FwZUFsaWFzID0gcGFyYW1zLnNob3VsZEVzY2FwZUFsaWFzID8/IGZhbHNlO1xuICBjb25zdCBlc2NhcGVkQWxpYXMgPSBzaG91bGRFc2NhcGVBbGlhcyA/IGVzY2FwZUFsaWFzKGFsaWFzKSA6IGFsaWFzO1xuXG4gIGNvbnN0IHVybCA9IHBhcmFtcy5zaG91bGRVc2VBbmdsZUJyYWNrZXRzXG4gICAgPyBgPCR7cGFyYW1zLnVybC5yZXBsYWNlQWxsKC9bPD5cXFxcXFxyXFxuXS9nLCAoY2hhcmFjdGVyKSA9PiBlbmNvZGVVUklDb21wb25lbnQoY2hhcmFjdGVyKSl9PmBcbiAgICA6IGVuY29kZVVybChwYXJhbXMudXJsKTtcblxuICBjb25zdCB0aXRsZVBhcnQgPSBwYXJhbXMudGl0bGUgPyBgICR7SlNPTi5zdHJpbmdpZnkocGFyYW1zLnRpdGxlKX1gIDogJyc7XG5cbiAgcmV0dXJuIGAke2VtYmVkUHJlZml4fVske2VzY2FwZWRBbGlhc31dKCR7dXJsfSR7dGl0bGVQYXJ0fSlgO1xufVxuXG4vKipcbiAqIFJldHVybnMgdGhlIHNoYXJlZCwgbXV0YWJsZSBsaXN0IG9mIGZ1bmN0aW9ucyB0aGF0IHByb3ZpZGUgZGVmYXVsdCBwYXJhbXMgZm9yIHtAbGluayBnZW5lcmF0ZU1hcmtkb3duTGlua30uXG4gKlxuICogRWFjaCBmdW5jdGlvbiBpcyBpbnZva2VkIG9uIGV2ZXJ5IHtAbGluayBnZW5lcmF0ZU1hcmtkb3duTGlua30gY2FsbCBhbmQgaXRzIHJlc3VsdCBpcyBtZXJnZWQgaW50byB0aGUgcGFyYW1zIChsYXRlclxuICogcmVnaXN0cmF0aW9ucyB0YWtlIHByZWNlZGVuY2Ugb3ZlciB0aGUgYnVpbHQtaW4gZGVmYXVsdHMsIGJ1dCBuZXZlciBvdmVyIGV4cGxpY2l0bHkgcGFzc2VkIHBhcmFtcykuIFJlZ2lzdGVyIGVudHJpZXNcbiAqIGJ5IGFkZGluZyBhIGBHZW5lcmF0ZU1hcmtkb3duTGlua0RlZmF1bHRQYXJhbXNDb21wb25lbnRgIHRvIGEgY29tcG9uZW50IHRyZWUgcmF0aGVyIHRoYW4gbXV0YXRpbmcgdGhpcyBsaXN0IGRpcmVjdGx5LlxuICpcbiAqIEByZXR1cm5zIFRoZSBtdXRhYmxlIGxpc3Qgb2YgZGVmYXVsdC1wYXJhbXMgZnVuY3Rpb25zLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0R2VuZXJhdGVNYXJrZG93bkxpbmtEZWZhdWx0UGFyYW1zRm5zKCk6ICgoKSA9PiBQYXJ0aWFsPEdlbmVyYXRlTWFya2Rvd25MaW5rUGFyYW1zPilbXSB7XG4gIHJldHVybiBnZXRPYnNpZGlhbkxpYlN0YXRlPCgoKSA9PiBQYXJ0aWFsPEdlbmVyYXRlTWFya2Rvd25MaW5rUGFyYW1zPilbXT4oJ2dlbmVyYXRlTWFya2Rvd25MaW5rRGVmYXVsdFBhcmFtc0ZucycsIFtdKS52YWx1ZTtcbn1cblxuLyoqXG4gKiBUZXN0cyB3aGV0aGVyIGEgbGluayB1c2VzIGFuZ2xlIGJyYWNrZXRzLCBwb3NzaWJseSBlbWJlZDpcbiAqIGBbdGl0bGVdKDxsaW5rPilgLCBgIVt0aXRsZV0oPGxpbms+KWAuXG4gKlxuICogQHBhcmFtIGxpbmsgLSBMaW5rIHRvIHRlc3RcbiAqIEByZXR1cm5zIFdoZXRoZXIgdGhlIGxpbmsgdXNlcyBhbmdsZSBicmFja2V0c1xuICovXG5leHBvcnQgZnVuY3Rpb24gaGFzQW5nbGVCcmFja2V0cyhsaW5rOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgY29uc3QgcGFyc2VMaW5rUmVzdWx0ID0gcGFyc2VMaW5rKGxpbmspO1xuICByZXR1cm4gcGFyc2VMaW5rUmVzdWx0Py5oYXNBbmdsZUJyYWNrZXRzID8/IGZhbHNlO1xufVxuXG4vKipcbiAqIFRlc3RzIHdoZXRoZXIgYSBsaW5rIGlzIGFuIGVtYmVkIGxpbms6XG4gKiBgIVtbbGlua11dYCwgYCFbdGl0bGVdKGxpbmspYC5cbiAqXG4gKiBAcGFyYW0gbGluayAtIExpbmsgdG8gdGVzdFxuICogQHJldHVybnMgV2hldGhlciB0aGUgbGluayBpcyBhbiBlbWJlZCBsaW5rXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBoYXNFbWJlZFN5bnRheChsaW5rOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgY29uc3QgcGFyc2VMaW5rUmVzdWx0ID0gcGFyc2VMaW5rKGxpbmspO1xuICByZXR1cm4gcGFyc2VMaW5rUmVzdWx0Py5pc0VtYmVkID8/IGZhbHNlO1xufVxuXG4vKipcbiAqIFRlc3RzIHdoZXRoZXIgYSBsaW5rIGhhcyBhIGxlYWRpbmcgZG90LCBwb3NzaWJseSBlbWJlZDpcbiAqIGBbWy4vbGlua11dYCwgYFt0aXRsZV0oLi9saW5rKWAsIGBbdGl0bGVdKDwuL2xpbms+KWAsXG4gKiBgIVtbLi9saW5rXV1gLCBgIVt0aXRsZV0oLi9saW5rKWAsIGAhW3RpdGxlXSg8Li9saW5rPilgLlxuICpcbiAqIEBwYXJhbSBsaW5rIC0gTGluayB0byB0ZXN0XG4gKiBAcmV0dXJucyBXaGV0aGVyIHRoZSBsaW5rIGhhcyBhIGxlYWRpbmcgZG90XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBoYXNMZWFkaW5nRG90KGxpbms6IHN0cmluZyk6IGJvb2xlYW4ge1xuICBjb25zdCBwYXJzZUxpbmtSZXN1bHQgPSBwYXJzZUxpbmsobGluayk7XG4gIHJldHVybiBwYXJzZUxpbmtSZXN1bHQ/LnVybC5zdGFydHNXaXRoKCcuLycpID8/IGZhbHNlO1xufVxuXG4vKipcbiAqIFRlc3RzIHdoZXRoZXIgYSBsaW5rIGhhcyBhIGxlYWRpbmcgc2xhc2gsIHBvc3NpYmx5IGVtYmVkOlxuICogYFtbL2xpbmtdXWAsIGBbdGl0bGVdKC9saW5rKWAsIGBbdGl0bGVdKDwvbGluaz4pYCxcbiAqIGAhW1svbGlua11dYCwgYCFbdGl0bGVdKC9saW5rKWAsIGAhW3RpdGxlXSg8L2xpbms+KWAuXG4gKlxuICogQHBhcmFtIGxpbmsgLSBMaW5rIHRvIHRlc3RcbiAqIEByZXR1cm5zIFdoZXRoZXIgdGhlIGxpbmsgaGFzIGEgbGVhZGluZyBzbGFzaFxuICovXG5leHBvcnQgZnVuY3Rpb24gaGFzTGVhZGluZ1NsYXNoKGxpbms6IHN0cmluZyk6IGJvb2xlYW4ge1xuICBjb25zdCBwYXJzZUxpbmtSZXN1bHQgPSBwYXJzZUxpbmsobGluayk7XG4gIHJldHVybiBwYXJzZUxpbmtSZXN1bHQ/LnVybC5zdGFydHNXaXRoKCcvJykgPz8gZmFsc2U7XG59XG5cbi8qKlxuICogVGVzdHMgd2hldGhlciBhIGxpbmsgaXMgYSB3aWtpbGluaywgcG9zc2libHkgZW1iZWQ6XG4gKiBgW1tsaW5rXV1gLCBgIVtbbGlua11dYC5cbiAqXG4gKiBAcGFyYW0gbGluayAtIExpbmsgdG8gdGVzdFxuICogQHJldHVybnMgV2hldGhlciB0aGUgbGluayBpcyBhIHdpa2lsaW5rXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBoYXNXaWtpbGlua1N5bnRheChsaW5rOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgY29uc3QgcGFyc2VMaW5rUmVzdWx0ID0gcGFyc2VMaW5rKGxpbmspO1xuICByZXR1cm4gcGFyc2VMaW5rUmVzdWx0Py5pc1dpa2lsaW5rID8/IGZhbHNlO1xufVxuXG4vKipcbiAqIERldGVybWluZXMgaWYgdGhlIGFsaWFzIG9mIGEgbGluayBzaG91bGQgYmUgcmVzZXQuXG4gKlxuICogQHBhcmFtIHBhcmFtcyAtIFRoZSBwYXJhbWV0ZXJzIGZvciBkZXRlcm1pbmluZyBpZiB0aGUgYWxpYXMgc2hvdWxkIGJlIHJlc2V0LlxuICogQHJldHVybnMgV2hldGhlciB0aGUgYWxpYXMgc2hvdWxkIGJlIHJlc2V0LlxuICovXG5leHBvcnQgZnVuY3Rpb24gc2hvdWxkUmVzZXRBbGlhcyhwYXJhbXM6IFNob3VsZFJlc2V0QWxpYXNQYXJhbXMpOiBib29sZWFuIHtcbiAgY29uc3Qge1xuICAgIGFwcCxcbiAgICBkaXNwbGF5VGV4dCxcbiAgICBpc1dpa2lsaW5rLFxuICAgIG5ld1NvdXJjZVBhdGhPckZpbGUsXG4gICAgb2xkU291cmNlUGF0aE9yRmlsZSxcbiAgICBvbGRUYXJnZXRQYXRoLFxuICAgIHRhcmdldFBhdGhPckZpbGVcbiAgfSA9IHBhcmFtcztcbiAgaWYgKGlzV2lraWxpbmsgPT09IGZhbHNlKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgaWYgKCFkaXNwbGF5VGV4dCkge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgY29uc3QgdGFyZ2V0RmlsZSA9IGdldEZpbGUoeyBhcHAsIHBhdGhPckZpbGU6IHRhcmdldFBhdGhPckZpbGUsIHNob3VsZEluY2x1ZGVOb25FeGlzdGluZzogdHJ1ZSB9KTtcbiAgY29uc3QgbmV3U291cmNlUGF0aCA9IGdldFBhdGgoYXBwLCBuZXdTb3VyY2VQYXRoT3JGaWxlKTtcbiAgY29uc3Qgb2xkU291cmNlUGF0aCA9IGdldFBhdGgoYXBwLCBvbGRTb3VyY2VQYXRoT3JGaWxlID8/IG5ld1NvdXJjZVBhdGhPckZpbGUpO1xuICBjb25zdCBuZXdTb3VyY2VGb2xkZXIgPSBkaXJuYW1lKG5ld1NvdXJjZVBhdGgpO1xuICBjb25zdCBvbGRTb3VyY2VGb2xkZXIgPSBkaXJuYW1lKG9sZFNvdXJjZVBhdGgpO1xuICBjb25zdCBhbGlhc2VzVG9SZXNldCA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuXG4gIGZvciAoY29uc3QgcGF0aE9yRmlsZSBvZiBbdGFyZ2V0RmlsZS5wYXRoLCBvbGRUYXJnZXRQYXRoXSkge1xuICAgIGlmICghcGF0aE9yRmlsZSkge1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgY29uc3QgcGF0aCA9IGdldFBhdGgoYXBwLCBwYXRoT3JGaWxlKTtcbiAgICBhbGlhc2VzVG9SZXNldC5hZGQocGF0aCk7XG4gICAgYWxpYXNlc1RvUmVzZXQuYWRkKGJhc2VuYW1lKHBhdGgpKTtcbiAgICBhbGlhc2VzVG9SZXNldC5hZGQocmVsYXRpdmUobmV3U291cmNlRm9sZGVyLCBwYXRoKSk7XG4gICAgYWxpYXNlc1RvUmVzZXQuYWRkKHJlbGF0aXZlKG9sZFNvdXJjZUZvbGRlciwgcGF0aCkpO1xuICB9XG5cbiAgZm9yIChjb25zdCBzb3VyY2VQYXRoIG9mIFtvbGRTb3VyY2VQYXRoLCBuZXdTb3VyY2VQYXRoXSkge1xuICAgIGFsaWFzZXNUb1Jlc2V0LmFkZChhcHAubWV0YWRhdGFDYWNoZS5maWxlVG9MaW5rdGV4dCh0YXJnZXRGaWxlLCBzb3VyY2VQYXRoLCBmYWxzZSkpO1xuICB9XG5cbiAgY29uc3QgY2xlYW5EaXNwbGF5VGV4dCA9IHJlcGxhY2VBbGwoe1xuICAgICRzdHJpbmc6IG5vcm1hbGl6ZVBhdGgoZW5zdXJlTm9uTnVsbGFibGUoZGlzcGxheVRleHQuc3BsaXQoJyA+ICcsIDEpWzBdKSksXG4gICAgcmVwbGFjZXI6ICcnLFxuICAgIHNlYXJjaFZhbHVlOiAvXlxcLlxcLy9nXG4gIH0pLnRvTG93ZXJDYXNlKCk7XG5cbiAgZm9yIChjb25zdCBhbGlhcyBvZiBhbGlhc2VzVG9SZXNldCkge1xuICAgIGlmIChhbGlhcy50b0xvd2VyQ2FzZSgpID09PSBjbGVhbkRpc3BsYXlUZXh0KSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICBjb25zdCBmb2xkZXIgPSBkaXJuYW1lKGFsaWFzKTtcbiAgICBjb25zdCBiYXNlID0gYmFzZW5hbWUoYWxpYXMsIGV4dG5hbWUoYWxpYXMpKTtcbiAgICBpZiAoam9pbihmb2xkZXIsIGJhc2UpLnRvTG93ZXJDYXNlKCkgPT09IGNsZWFuRGlzcGxheVRleHQpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBmYWxzZTtcbn1cblxuLyoqXG4gKiBTcGxpdHMgYSBsaW5rIGludG8gaXRzIGxpbmsgcGF0aCBhbmQgc3VicGF0aC5cbiAqXG4gKiBAcGFyYW0gbGluayAtIFRoZSBsaW5rIHRvIHNwbGl0LlxuICogQHJldHVybnMgQW4gb2JqZWN0IGNvbnRhaW5pbmcgdGhlIGxpbmsgcGF0aCBhbmQgc3VicGF0aC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNwbGl0U3VicGF0aChsaW5rOiBzdHJpbmcpOiBTcGxpdFN1YnBhdGhSZXN1bHQge1xuICBjb25zdCBwYXJzZWQgPSBwYXJzZUxpbmt0ZXh0KG5vcm1hbGl6ZVN0cmluZyhsaW5rKSk7XG4gIHJldHVybiB7XG4gICAgbGlua1BhdGg6IHBhcnNlZC5wYXRoLFxuICAgIHN1YnBhdGg6IHBhcnNlZC5zdWJwYXRoXG4gIH07XG59XG5cbi8qKlxuICogTm9ybWFsaXplcyB0aGUgYGZpbGU6Ly9gIGxpbmtzIGluIGEgY29udGVudCBzdHJpbmcgdG8gYSBwcmV0dHkgZm9ybSwgY29udmVydGluZyBiYWNrc2xhc2hlcyB0byBmb3J3YXJkXG4gKiBzbGFzaGVzLiBPdGhlciBsaW5rcyBhcmUgbGVmdCB1bmNoYW5nZWQuXG4gKlxuICogQHBhcmFtIHBhcmFtcyAtIFRoZSBwYXJhbWV0ZXJzIGZvciBub3JtYWxpemluZyB0aGUgbGlua3MuXG4gKiBAcmV0dXJucyBBIHtAbGluayBQcm9taXNlfSB0aGF0IHJlc29sdmVzIHRvIHRoZSBjb250ZW50IHdpdGggbm9ybWFsaXplZCBgZmlsZTovL2AgbGlua3MuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiB1cGRhdGVGaWxlVXJsTGlua3NJbkNvbnRlbnQocGFyYW1zOiBVcGRhdGVGaWxlVXJsTGlua3NJbkNvbnRlbnRQYXJhbXMpOiBQcm9taXNlPHN0cmluZz4ge1xuICBjb25zdCB7IGFwcCwgY29udGVudCwgb2Zmc2V0UmFuZ2UsIHNob3VsZFNraXBSZWZlcmVuY2UsIHNob3VsZFNraXBSZWZlcmVuY2VzSW5IZWFkaW5ncywgc2hvdWxkVXNlQW5nbGVCcmFja2V0cyA9IGZhbHNlIH0gPSBwYXJhbXM7XG4gIHJldHVybiBhd2FpdCBlZGl0UmVmZXJlbmNlc0luQ29udGVudChub3JtYWxpemVPcHRpb25hbFByb3BlcnRpZXM8RWRpdFJlZmVyZW5jZXNJbkNvbnRlbnRQYXJhbXM+KHtcbiAgICBhYm9ydFNpZ25hbDogcGFyYW1zLmFib3J0U2lnbmFsLFxuICAgIGFwcCxcbiAgICBjb250ZW50LFxuICAgIG9mZnNldFJhbmdlLFxuICAgIHJlZmVyZW5jZUNvbnZlcnRlcjogKHJlZmVyZW5jZSkgPT4gbm9ybWFsaXplRmlsZVVybExpbmsocmVmZXJlbmNlLCBzaG91bGRVc2VBbmdsZUJyYWNrZXRzKSxcbiAgICBzaG91bGRFZGl0RXh0ZXJuYWxMaW5rczogdHJ1ZSxcbiAgICBzaG91bGRFZGl0RnJvbnRtYXR0ZXJFeHRlcm5hbExpbmtzOiB0cnVlLFxuICAgIHNob3VsZEVkaXRNdWx0aVZhbHVlRnJvbnRtYXR0ZXJFeHRlcm5hbExpbmtzOiB0cnVlLFxuICAgIHNob3VsZFNraXBSZWZlcmVuY2UsXG4gICAgc2hvdWxkU2tpcFJlZmVyZW5jZXNJbkhlYWRpbmdzXG4gIH0pKTtcbn1cblxuLyoqXG4gKiBOb3JtYWxpemVzIHRoZSBgZmlsZTovL2AgbGlua3MgaW4gYSBmaWxlIHRvIGEgcHJldHR5IGZvcm0sIGNvbnZlcnRpbmcgYmFja3NsYXNoZXMgdG8gZm9yd2FyZCBzbGFzaGVzLlxuICogT3RoZXIgbGlua3MgYXJlIGxlZnQgdW5jaGFuZ2VkLlxuICpcbiAqIEBwYXJhbSBwYXJhbXMgLSBUaGUgcGFyYW1ldGVycyBmb3Igbm9ybWFsaXppbmcgdGhlIGxpbmtzLlxuICogQHJldHVybnMgQSB7QGxpbmsgUHJvbWlzZX0gdGhhdCByZXNvbHZlcyB3aGVuIHRoZSBsaW5rcyBhcmUgbm9ybWFsaXplZC5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHVwZGF0ZUZpbGVVcmxMaW5rc0luRmlsZShwYXJhbXM6IFVwZGF0ZUZpbGVVcmxMaW5rc0luRmlsZVBhcmFtcyk6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCB7XG4gICAgYXBwLFxuICAgIG9mZnNldFJhbmdlLFxuICAgIHBhdGhPckZpbGUsXG4gICAgc2hvdWxkU2tpcFJlZmVyZW5jZSxcbiAgICBzaG91bGRTa2lwUmVmZXJlbmNlc0luSGVhZGluZ3MsXG4gICAgc2hvdWxkVXNlQW5nbGVCcmFja2V0cyA9IGZhbHNlLFxuICAgIC4uLm9wdGlvbnNcbiAgfSA9IHBhcmFtcztcbiAgYXdhaXQgZWRpdFJlZmVyZW5jZXMobm9ybWFsaXplT3B0aW9uYWxQcm9wZXJ0aWVzPEVkaXRSZWZlcmVuY2VzUGFyYW1zPih7XG4gICAgYXBwLFxuICAgIC8vIEZvcndhcmRlZCBieSBuYW1lIHJhdGhlciB0aGFuIHRocm91Z2ggYG9wdGlvbnNgLCBzbyBhIGxhdGVyIHJlZmFjdG9yIGNhbm5vdCBkcm9wIGl0IHNpbGVudGx5LlxuICAgIG9mZnNldFJhbmdlLFxuICAgIHBhdGhPckZpbGUsXG4gICAgcmVmZXJlbmNlQ29udmVydGVyOiAocmVmZXJlbmNlKSA9PiBub3JtYWxpemVGaWxlVXJsTGluayhyZWZlcmVuY2UsIHNob3VsZFVzZUFuZ2xlQnJhY2tldHMpLFxuICAgIHNob3VsZEVkaXRFeHRlcm5hbExpbmtzOiB0cnVlLFxuICAgIHNob3VsZEVkaXRGcm9udG1hdHRlckV4dGVybmFsTGlua3M6IHRydWUsXG4gICAgc2hvdWxkRWRpdE11bHRpVmFsdWVGcm9udG1hdHRlckV4dGVybmFsTGlua3M6IHRydWUsXG4gICAgc2hvdWxkU2tpcFJlZmVyZW5jZSxcbiAgICBzaG91bGRTa2lwUmVmZXJlbmNlc0luSGVhZGluZ3MsXG4gICAgLi4ub3B0aW9uc1xuICB9KSk7XG59XG5cbi8qKlxuICogVXBkYXRlcyBhIGxpbmsgYmFzZWQgb24gdGhlIHByb3ZpZGVkIHBhcmFtZXRlcnMuXG4gKlxuICogQHBhcmFtIHBhcmFtcyAtIFRoZSBwYXJhbWV0ZXJzIGZvciB1cGRhdGluZyB0aGUgbGluay5cbiAqIEByZXR1cm5zIFRoZSB1cGRhdGVkIGxpbmsuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB1cGRhdGVMaW5rKHBhcmFtczogVXBkYXRlTGlua1BhcmFtcyk6IHN0cmluZyB7XG4gIGNvbnN0IHtcbiAgICBhcHAsXG4gICAgaXNFbXB0eUVtYmVkQWxpYXNBbGxvd2VkLFxuICAgIGxpbmtQYXRoU3R5bGUsXG4gICAgbGlua1N0eWxlLFxuICAgIG5ld1NvdXJjZVBhdGhPckZpbGUsXG4gICAgbmV3VGFyZ2V0UGF0aE9yRmlsZSxcbiAgICBvbGRTb3VyY2VQYXRoT3JGaWxlLFxuICAgIG9sZFRhcmdldFBhdGhPckZpbGUsXG4gICAgcmVmZXJlbmNlLFxuICAgIHNob3VsZEVzY2FwZUFsaWFzLFxuICAgIHNob3VsZEluY2x1ZGVBdHRhY2htZW50RXh0ZW5zaW9uVG9FbWJlZEFsaWFzLFxuICAgIHNob3VsZFVwZGF0ZUZpbGVOYW1lQWxpYXMgPSB0cnVlLFxuICAgIHNob3VsZFVzZUFuZ2xlQnJhY2tldHMsXG4gICAgc2hvdWxkVXNlTGVhZGluZ0RvdEZvclJlbGF0aXZlUGF0aHMsXG4gICAgc2hvdWxkVXNlTGVhZGluZ1NsYXNoRm9yQWJzb2x1dGVQYXRoc1xuICB9ID0gcGFyYW1zO1xuICBjb25zdCBvcmlnaW5hbExpbmtUZXh0ID0gZ2V0UmVmZXJlbmNlTGlua1RleHQocmVmZXJlbmNlKTtcbiAgaWYgKCFuZXdUYXJnZXRQYXRoT3JGaWxlKSB7XG4gICAgcmV0dXJuIG9yaWdpbmFsTGlua1RleHQ7XG4gIH1cbiAgY29uc3QgbmV3VGFyZ2V0RmlsZSA9IGdldEZpbGUoeyBhcHAsIHBhdGhPckZpbGU6IG5ld1RhcmdldFBhdGhPckZpbGUsIHNob3VsZEluY2x1ZGVOb25FeGlzdGluZzogdHJ1ZSB9KTtcbiAgY29uc3Qgb2xkU291cmNlUGF0aCA9IGdldFBhdGgoYXBwLCBvbGRTb3VyY2VQYXRoT3JGaWxlID8/IG5ld1NvdXJjZVBhdGhPckZpbGUpO1xuICBjb25zdCBvbGRUYXJnZXRQYXRoID0gZ2V0UGF0aChhcHAsIG9sZFRhcmdldFBhdGhPckZpbGUgPz8gbmV3VGFyZ2V0UGF0aE9yRmlsZSk7XG4gIGNvbnN0IGlzV2lraWxpbmsgPSBzaG91bGRVc2VXaWtpbGlua1N0eWxlKG5vcm1hbGl6ZU9wdGlvbmFsUHJvcGVydGllczxTaG91bGRVc2VXaWtpbGlua1N0eWxlUGFyYW1zPih7XG4gICAgYXBwLFxuICAgIGxpbmtTdHlsZSxcbiAgICBvcmlnaW5hbExpbms6IG9yaWdpbmFsTGlua1RleHRcbiAgfSkpO1xuXG4gIGNvbnN0IHsgc3VicGF0aCB9ID0gc3BsaXRTdWJwYXRoKHJlZmVyZW5jZS5saW5rKTtcblxuICAvKiB2OCBpZ25vcmUgc3RhcnQgLS0gQ2FudmFzIGZpbGUgbm9kZSByZWZlcmVuY2UgYnJhbmNoIGlzIGhhcmQgdG8gcmVwcm9kdWNlIGluIHVuaXQgdGVzdHMuICovXG4gIGlmIChpc0NhbnZhc0ZpbGUobmV3U291cmNlUGF0aE9yRmlsZSkgJiYgaXNDYW52YXNGaWxlTm9kZVJlZmVyZW5jZShyZWZlcmVuY2UpKSB7XG4gICAgcmV0dXJuIG5ld1RhcmdldEZpbGUucGF0aCArIHN1YnBhdGg7XG5cbiAgICAvKiB2OCBpZ25vcmUgc3RvcCAqL1xuICB9XG5cbiAgY29uc3QgcGFyc2VMaW5rUmVzdWx0ID0gcGFyc2VMaW5rKG9yaWdpbmFsTGlua1RleHQpO1xuICBsZXQgYWxpYXM6IHN0cmluZyB8IHVuZGVmaW5lZDtcblxuICBpZiAoaXNXaWtpbGluayAmJiBwYXJzZUxpbmtSZXN1bHQ/LmFsaWFzKSB7XG4gICAgYWxpYXMgPSBwYXJzZUxpbmtSZXN1bHQuYWxpYXM7XG4gIH1cblxuICBhbGlhcyA/Pz0gc2hvdWxkUmVzZXRBbGlhcyhub3JtYWxpemVPcHRpb25hbFByb3BlcnRpZXM8U2hvdWxkUmVzZXRBbGlhc1BhcmFtcz4oe1xuICAgICAgYXBwLFxuICAgICAgZGlzcGxheVRleHQ6IHJlZmVyZW5jZS5kaXNwbGF5VGV4dCxcbiAgICAgIGlzV2lraWxpbmssXG4gICAgICBuZXdTb3VyY2VQYXRoT3JGaWxlLFxuICAgICAgb2xkU291cmNlUGF0aE9yRmlsZSxcbiAgICAgIG9sZFRhcmdldFBhdGgsXG4gICAgICB0YXJnZXRQYXRoT3JGaWxlOiBuZXdUYXJnZXRGaWxlXG4gICAgfSkpXG4gICAgPyB1bmRlZmluZWRcbiAgICA6IHBhcnNlTGlua1Jlc3VsdD8uYWxpYXM7XG5cbiAgLy8gUmVmcmVzaCBhIGZpbGUtbmFtZSBhbGlhcyB0byB0aGUgbmV3IGRpc3BsYXkgbmFtZSB3aGVuIHRoZSBmbGFnIGlzIHNldC5cbiAgLy8gQSBmaWxlLW5hbWUgYWxpYXMgZXF1YWxzIHRoZSBPTEQgYmFzZSBuYW1lICh3aXRoIG9yIHdpdGhvdXQgZXh0ZW5zaW9uKTsgYSBjdXN0b20gYWxpYXMgaXMga2VwdC5cbiAgLy8gR2F0aW5nIG9uIHRoZSBmbGFnIGFsc28gcmVmcmVzaGVzIHdpa2lsaW5rcyB0aGF0IGNhcnJ5IGFuIGV4cGxpY2l0IGFsaWFzLlxuICAvLyBUaG9zZSBwcmV2aW91c2x5IHNob3J0LWNpcmN1aXRlZCB0aGUgcmVmcmVzaCBhbmQga2VwdCB0aGUgc3RhbGUgb2xkIGJhc2UgbmFtZS5cbiAgLy8gVGhlIGRpc3BsYXkgbmFtZSBvZiBhIGZvbGRlciBub3RlIGlzIGl0cyBmb2xkZXIncyBuYW1lLCBzbyBgY2hhcmxpZS5tZGAgYmVjb21pbmcgYGNoYXJsaWUvIS5tZGAga2VlcHMgYGNoYXJsaWVgLlxuICBpZiAoc2hvdWxkVXBkYXRlRmlsZU5hbWVBbGlhcykge1xuICAgIGFsaWFzID0gcmVmcmVzaEZpbGVOYW1lQWxpYXMoe1xuICAgICAgYWxpYXMsXG4gICAgICBhcHAsXG4gICAgICBjYW5BZGRBbGlhczogaXNXaWtpbGluayAmJiAhc3VicGF0aCAmJiAhaGFzRW1iZWRTeW50YXgob3JpZ2luYWxMaW5rVGV4dCksXG4gICAgICBuZXdUYXJnZXRGaWxlLFxuICAgICAgb2xkVGFyZ2V0UGF0aFxuICAgIH0pO1xuICB9XG5cbiAgY29uc3QgbmV3TGluayA9IGdlbmVyYXRlTWFya2Rvd25MaW5rKG5vcm1hbGl6ZU9wdGlvbmFsUHJvcGVydGllczxHZW5lcmF0ZU1hcmtkb3duTGlua1BhcmFtcz4oe1xuICAgIGFsaWFzLFxuICAgIGFwcCxcbiAgICBpc0VtcHR5RW1iZWRBbGlhc0FsbG93ZWQsXG4gICAgaXNTaW5nbGVTdWJwYXRoQWxsb3dlZDogb2xkU291cmNlUGF0aCA9PT0gb2xkVGFyZ2V0UGF0aCAmJiAhIXBhcnNlTGlua1Jlc3VsdD8uYWxpYXMsXG4gICAgbGlua1BhdGhTdHlsZSxcbiAgICBsaW5rU3R5bGUsXG4gICAgb3JpZ2luYWxMaW5rOiBvcmlnaW5hbExpbmtUZXh0LFxuICAgIHNob3VsZEVzY2FwZUFsaWFzLFxuICAgIHNob3VsZEluY2x1ZGVBdHRhY2htZW50RXh0ZW5zaW9uVG9FbWJlZEFsaWFzLFxuICAgIHNob3VsZFVzZUFuZ2xlQnJhY2tldHMsXG4gICAgc2hvdWxkVXNlTGVhZGluZ0RvdEZvclJlbGF0aXZlUGF0aHMsXG4gICAgc2hvdWxkVXNlTGVhZGluZ1NsYXNoRm9yQWJzb2x1dGVQYXRocyxcbiAgICBzb3VyY2VQYXRoT3JGaWxlOiBuZXdTb3VyY2VQYXRoT3JGaWxlLFxuICAgIHN1YnBhdGgsXG4gICAgdGFyZ2V0UGF0aE9yRmlsZTogbmV3VGFyZ2V0RmlsZVxuICB9KSk7XG4gIHJldHVybiBuZXdMaW5rO1xufVxuXG4vKipcbiAqIFVwZGF0ZXMgdGhlIGxpbmtzIGluIGEgY29udGVudCBzdHJpbmcgYmFzZWQgb24gdGhlIHByb3ZpZGVkIHBhcmFtZXRlcnMuXG4gKlxuICogQHBhcmFtIHBhcmFtcyAtIFRoZSBwYXJhbWV0ZXJzIGZvciB1cGRhdGluZyB0aGUgbGlua3MuXG4gKiBAcmV0dXJucyBBIHtAbGluayBQcm9taXNlfSB0aGF0IHJlc29sdmVzIHRvIHRoZSBjb250ZW50IHdpdGggdXBkYXRlZCBsaW5rcy5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHVwZGF0ZVJlZmVyZW5jZXNJbkNvbnRlbnQocGFyYW1zOiBVcGRhdGVSZWZlcmVuY2VzSW5Db250ZW50UGFyYW1zKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgY29uc3Qge1xuICAgIGFwcCxcbiAgICBjb250ZW50LFxuICAgIGlzRW1wdHlFbWJlZEFsaWFzQWxsb3dlZCxcbiAgICBsaW5rUGF0aFN0eWxlLFxuICAgIGxpbmtTdHlsZSxcbiAgICBsaW5rU3R5bGVQcm92aWRlcixcbiAgICBuZXdTb3VyY2VQYXRoT3JGaWxlLFxuICAgIG9mZnNldFJhbmdlLFxuICAgIG9sZFNvdXJjZVBhdGhPckZpbGUsXG4gICAgc2hvdWxkRXNjYXBlQWxpYXMsXG4gICAgc2hvdWxkSW5jbHVkZUF0dGFjaG1lbnRFeHRlbnNpb25Ub0VtYmVkQWxpYXMsXG4gICAgc2hvdWxkU2tpcFJlZmVyZW5jZSxcbiAgICBzaG91bGRTa2lwUmVmZXJlbmNlc0luSGVhZGluZ3MsXG4gICAgc2hvdWxkVXBkYXRlRW1iZWRPbmx5TGlua3MsXG4gICAgc2hvdWxkVXBkYXRlRmlsZU5hbWVBbGlhcyxcbiAgICBzaG91bGRVc2VBbmdsZUJyYWNrZXRzLFxuICAgIHNob3VsZFVzZUxlYWRpbmdEb3RGb3JSZWxhdGl2ZVBhdGhzLFxuICAgIHNob3VsZFVzZUxlYWRpbmdTbGFzaEZvckFic29sdXRlUGF0aHNcbiAgfSA9IHBhcmFtcztcblxuICByZXR1cm4gYXdhaXQgZWRpdFJlZmVyZW5jZXNJbkNvbnRlbnQobm9ybWFsaXplT3B0aW9uYWxQcm9wZXJ0aWVzPEVkaXRSZWZlcmVuY2VzSW5Db250ZW50UGFyYW1zPih7XG4gICAgYXBwLFxuICAgIGNvbnRlbnQsXG4gICAgb2Zmc2V0UmFuZ2UsXG4gICAgcmVmZXJlbmNlQ29udmVydGVyOiAocmVmZXJlbmNlKSA9PiB7XG4gICAgICBjb25zdCBpc0VtYmVkTGluayA9IGhhc0VtYmVkU3ludGF4KGdldFJlZmVyZW5jZUxpbmtUZXh0KHJlZmVyZW5jZSkpO1xuICAgICAgcmV0dXJuIHNob3VsZFVwZGF0ZUVtYmVkT25seUxpbmtzICE9PSB1bmRlZmluZWQgJiYgc2hvdWxkVXBkYXRlRW1iZWRPbmx5TGlua3MgIT09IGlzRW1iZWRMaW5rXG4gICAgICAgID8gdW5kZWZpbmVkXG4gICAgICAgIDogY29udmVydExpbmsobm9ybWFsaXplT3B0aW9uYWxQcm9wZXJ0aWVzPENvbnZlcnRMaW5rUGFyYW1zPih7XG4gICAgICAgICAgYXBwLFxuICAgICAgICAgIGlzRW1wdHlFbWJlZEFsaWFzQWxsb3dlZCxcbiAgICAgICAgICBsaW5rUGF0aFN0eWxlLFxuICAgICAgICAgIGxpbmtTdHlsZTogbGlua1N0eWxlUHJvdmlkZXI/LihyZWZlcmVuY2UpID8/IGxpbmtTdHlsZSxcbiAgICAgICAgICBuZXdTb3VyY2VQYXRoT3JGaWxlLFxuICAgICAgICAgIG9sZFNvdXJjZVBhdGhPckZpbGUsXG4gICAgICAgICAgcmVmZXJlbmNlLFxuICAgICAgICAgIHNob3VsZEVzY2FwZUFsaWFzLFxuICAgICAgICAgIHNob3VsZEluY2x1ZGVBdHRhY2htZW50RXh0ZW5zaW9uVG9FbWJlZEFsaWFzLFxuICAgICAgICAgIHNob3VsZFVwZGF0ZUZpbGVOYW1lQWxpYXMsXG4gICAgICAgICAgc2hvdWxkVXNlQW5nbGVCcmFja2V0cyxcbiAgICAgICAgICBzaG91bGRVc2VMZWFkaW5nRG90Rm9yUmVsYXRpdmVQYXRocyxcbiAgICAgICAgICBzaG91bGRVc2VMZWFkaW5nU2xhc2hGb3JBYnNvbHV0ZVBhdGhzXG4gICAgICAgIH0pKTtcbiAgICB9LFxuICAgIHNob3VsZFNraXBSZWZlcmVuY2UsXG4gICAgc2hvdWxkU2tpcFJlZmVyZW5jZXNJbkhlYWRpbmdzXG4gIH0pKTtcbn1cblxuLyoqXG4gKiBVcGRhdGVzIHRoZSBsaW5rcyBpbiBhIGZpbGUgYmFzZWQgb24gdGhlIHByb3ZpZGVkIHBhcmFtZXRlcnMuXG4gKlxuICogQHBhcmFtIHBhcmFtcyAtIFRoZSBwYXJhbWV0ZXJzIGZvciB1cGRhdGluZyB0aGUgbGlua3MuXG4gKiBAcmV0dXJucyBBIHtAbGluayBQcm9taXNlfSB0aGF0IHJlc29sdmVzIHdoZW4gdGhlIGxpbmtzIGFyZSB1cGRhdGVkLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gdXBkYXRlUmVmZXJlbmNlc0luRmlsZShwYXJhbXM6IFVwZGF0ZVJlZmVyZW5jZXNJbkZpbGVQYXJhbXMpOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3Qge1xuICAgIGFwcCxcbiAgICBpc0VtcHR5RW1iZWRBbGlhc0FsbG93ZWQsXG4gICAgbGlua1BhdGhTdHlsZSxcbiAgICBsaW5rU3R5bGUsXG4gICAgbGlua1N0eWxlUHJvdmlkZXIsXG4gICAgbmV3U291cmNlUGF0aE9yRmlsZSxcbiAgICBvZmZzZXRSYW5nZSxcbiAgICBvbGRTb3VyY2VQYXRoT3JGaWxlLFxuICAgIHNob3VsZEVzY2FwZUFsaWFzLFxuICAgIHNob3VsZEluY2x1ZGVBdHRhY2htZW50RXh0ZW5zaW9uVG9FbWJlZEFsaWFzLFxuICAgIHNob3VsZFNraXBSZWZlcmVuY2UsXG4gICAgc2hvdWxkU2tpcFJlZmVyZW5jZXNJbkhlYWRpbmdzLFxuICAgIHNob3VsZFVwZGF0ZUVtYmVkT25seUxpbmtzLFxuICAgIHNob3VsZFVwZGF0ZUZpbGVOYW1lQWxpYXMsXG4gICAgc2hvdWxkVXNlQW5nbGVCcmFja2V0cyxcbiAgICBzaG91bGRVc2VMZWFkaW5nRG90Rm9yUmVsYXRpdmVQYXRocyxcbiAgICBzaG91bGRVc2VMZWFkaW5nU2xhc2hGb3JBYnNvbHV0ZVBhdGhzXG4gIH0gPSBwYXJhbXM7XG5cbiAgaWYgKGlzQ2FudmFzRmlsZShuZXdTb3VyY2VQYXRoT3JGaWxlKSAmJiAhYXBwLmludGVybmFsUGx1Z2lucy5nZXRFbmFibGVkUGx1Z2luQnlJZChJbnRlcm5hbFBsdWdpbk5hbWUuQ2FudmFzKSkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGF3YWl0IGVkaXRSZWZlcmVuY2VzKG5vcm1hbGl6ZU9wdGlvbmFsUHJvcGVydGllczxFZGl0UmVmZXJlbmNlc1BhcmFtcz4oe1xuICAgIC4uLnBhcmFtcyxcbiAgICAvLyBOYW1lZCBiZXNpZGUgdGhlIGAuLi5wYXJhbXNgIHNwcmVhZCwgc28gYSBsYXRlciByZWZhY3RvciB0byBleHBsaWNpdCBmb3J3YXJkaW5nIGNhbm5vdCBkcm9wIGl0IHNpbGVudGx5LlxuICAgIG9mZnNldFJhbmdlLFxuICAgIHBhdGhPckZpbGU6IG5ld1NvdXJjZVBhdGhPckZpbGUsXG4gICAgcmVmZXJlbmNlQ29udmVydGVyOiAocmVmZXJlbmNlKSA9PiB7XG4gICAgICBjb25zdCBpc0VtYmVkTGluayA9IGhhc0VtYmVkU3ludGF4KGdldFJlZmVyZW5jZUxpbmtUZXh0KHJlZmVyZW5jZSkpO1xuICAgICAgcmV0dXJuIHNob3VsZFVwZGF0ZUVtYmVkT25seUxpbmtzICE9PSB1bmRlZmluZWQgJiYgc2hvdWxkVXBkYXRlRW1iZWRPbmx5TGlua3MgIT09IGlzRW1iZWRMaW5rXG4gICAgICAgID8gdW5kZWZpbmVkXG4gICAgICAgIDogY29udmVydExpbmsobm9ybWFsaXplT3B0aW9uYWxQcm9wZXJ0aWVzPENvbnZlcnRMaW5rUGFyYW1zPih7XG4gICAgICAgICAgYXBwLFxuICAgICAgICAgIGlzRW1wdHlFbWJlZEFsaWFzQWxsb3dlZCxcbiAgICAgICAgICBsaW5rUGF0aFN0eWxlLFxuICAgICAgICAgIGxpbmtTdHlsZTogbGlua1N0eWxlUHJvdmlkZXI/LihyZWZlcmVuY2UpID8/IGxpbmtTdHlsZSxcbiAgICAgICAgICBuZXdTb3VyY2VQYXRoT3JGaWxlLFxuICAgICAgICAgIG9sZFNvdXJjZVBhdGhPckZpbGUsXG4gICAgICAgICAgcmVmZXJlbmNlLFxuICAgICAgICAgIHNob3VsZEVzY2FwZUFsaWFzLFxuICAgICAgICAgIHNob3VsZEluY2x1ZGVBdHRhY2htZW50RXh0ZW5zaW9uVG9FbWJlZEFsaWFzLFxuICAgICAgICAgIHNob3VsZFVwZGF0ZUZpbGVOYW1lQWxpYXMsXG4gICAgICAgICAgc2hvdWxkVXNlQW5nbGVCcmFja2V0cyxcbiAgICAgICAgICBzaG91bGRVc2VMZWFkaW5nRG90Rm9yUmVsYXRpdmVQYXRocyxcbiAgICAgICAgICBzaG91bGRVc2VMZWFkaW5nU2xhc2hGb3JBYnNvbHV0ZVBhdGhzXG4gICAgICAgIH0pKTtcbiAgICB9LFxuICAgIHNob3VsZFNraXBSZWZlcmVuY2UsXG4gICAgc2hvdWxkU2tpcFJlZmVyZW5jZXNJbkhlYWRpbmdzXG4gIH0pKTtcbn1cblxuZnVuY3Rpb24gZGVmYXVsdFJlZmVyZW5jZUlkZW50aXR5S2V5UHJvdmlkZXIocmVmZXJlbmNlOiBSZWZlcmVuY2UpOiBzdHJpbmcge1xuICByZXR1cm4gSlNPTi5zdHJpbmdpZnkocmVmZXJlbmNlKTtcbn1cblxuZnVuY3Rpb24gZ2VuZXJhdGVMaW5rVGV4dChwYXJhbXM6IEdlbmVyYXRlTGlua1RleHRQYXJhbXMpOiBzdHJpbmcge1xuICBjb25zdCB7IGFwcCwgY29uZmlnLCBzdWJwYXRoLCB0YXJnZXRGaWxlIH0gPSBwYXJhbXM7XG4gIGxldCB7IHNvdXJjZVBhdGggfSA9IHBhcmFtcztcbiAgaWYgKHNvdXJjZVBhdGggPT09ICcvJykge1xuICAgIHNvdXJjZVBhdGggPSAnJztcbiAgfVxuXG4gIGxldCBsaW5rVGV4dDogc3RyaW5nO1xuXG4gIGlmICh0YXJnZXRGaWxlLnBhdGggPT09IHNvdXJjZVBhdGggJiYgc3VicGF0aCAmJiBjb25maWcuaXNTaW5nbGVTdWJwYXRoQWxsb3dlZCkge1xuICAgIGxpbmtUZXh0ID0gJyc7XG4gIH0gZWxzZSB7XG4gICAgLyogdjggaWdub3JlIHN0YXJ0IC0tIEFsbCBicmFuY2hlcyBjb3ZlcmVkIGJ1dCB2OCByZXBvcnRzIHN3aXRjaCBhcyBwYXJ0aWFsLiAqL1xuICAgIHN3aXRjaCAoY29uZmlnLmxpbmtQYXRoU3R5bGUpIHtcbiAgICAgIC8qIHY4IGlnbm9yZSBzdG9wICovXG4gICAgICBjYXNlIEZpbmFsTGlua1BhdGhTdHlsZS5BYnNvbHV0ZVBhdGhJblZhdWx0OiB7XG4gICAgICAgIGxpbmtUZXh0ID0gdGFyZ2V0RmlsZS5wYXRoO1xuICAgICAgICBpZiAoY29uZmlnLnNob3VsZFVzZUxlYWRpbmdTbGFzaEZvckFic29sdXRlUGF0aHMgJiYgIWxpbmtUZXh0LnN0YXJ0c1dpdGgoJy8nKSkge1xuICAgICAgICAgIGxpbmtUZXh0ID0gYC8ke2xpbmtUZXh0fWA7XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBjYXNlIEZpbmFsTGlua1BhdGhTdHlsZS5SZWxhdGl2ZVBhdGhUb1RoZVNvdXJjZToge1xuICAgICAgICBsaW5rVGV4dCA9IHJlbGF0aXZlKGRpcm5hbWUoc291cmNlUGF0aCksIHRhcmdldEZpbGUucGF0aCk7XG4gICAgICAgIGlmIChjb25maWcuc2hvdWxkVXNlTGVhZGluZ0RvdEZvclJlbGF0aXZlUGF0aHMgJiYgIWxpbmtUZXh0LnN0YXJ0c1dpdGgoJy4nKSkge1xuICAgICAgICAgIGxpbmtUZXh0ID0gYC4vJHtsaW5rVGV4dH1gO1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgY2FzZSBGaW5hbExpbmtQYXRoU3R5bGUuU2hvcnRlc3RQYXRoV2hlblBvc3NpYmxlOiB7XG4gICAgICAgIGNvbnN0IHNob3J0ZXN0TmFtZSA9IGlzTWFya2Rvd25GaWxlKHRhcmdldEZpbGUpID8gdGFyZ2V0RmlsZS5iYXNlbmFtZSA6IHRhcmdldEZpbGUubmFtZTtcbiAgICAgICAgY29uc3QgbWF0Y2hlZEZpbGVzID0gYXBwLm1ldGFkYXRhQ2FjaGUuZ2V0TGlua3BhdGhEZXN0KHNob3J0ZXN0TmFtZSwgc291cmNlUGF0aCk7XG4gICAgICAgIGxpbmtUZXh0ID0gbWF0Y2hlZEZpbGVzLmxlbmd0aCA9PT0gMSAmJiBtYXRjaGVkRmlsZXNbMF0gPT09IHRhcmdldEZpbGUgPyB0YXJnZXRGaWxlLm5hbWUgOiB0YXJnZXRGaWxlLnBhdGg7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgLyogdjggaWdub3JlIHN0YXJ0IC0tIEFsbCB2YWxpZCBGaW5hbExpbmtQYXRoU3R5bGUgdmFsdWVzIGFyZSBoYW5kbGVkIGFib3ZlLiAqL1xuICAgICAgZGVmYXVsdDoge1xuICAgICAgICBhc3NlcnROZXZlcihjb25maWcubGlua1BhdGhTdHlsZSk7XG4gICAgICB9XG4gICAgICAgIC8qIHY4IGlnbm9yZSBzdG9wICovXG4gICAgfVxuICB9XG5cbiAgbGlua1RleHQgPSBjb25maWcuaXNXaWtpbGlua1xuICAgID8gdHJpbUVuZCh7XG4gICAgICAkc3RyaW5nOiBsaW5rVGV4dCxcbiAgICAgIHN1ZmZpeDogYC4ke01BUktET1dOX0ZJTEVfRVhURU5TSU9OfWBcbiAgICB9KVxuICAgIDogbGlua1RleHQ7XG4gIGxpbmtUZXh0ICs9IHN1YnBhdGg7XG5cbiAgcmV0dXJuIGxpbmtUZXh0O1xufVxuXG5mdW5jdGlvbiBnZW5lcmF0ZU1hcmtkb3duTGlua0ltcGwocGFyYW1zOiBHZW5lcmF0ZU1hcmtkb3duTGlua1BhcmFtcyk6IHN0cmluZyB7XG4gIGNvbnN0IHsgYXBwIH0gPSBwYXJhbXM7XG4gIGNvbnN0IHRhcmdldEZpbGUgPSBnZXRGaWxlKG5vcm1hbGl6ZU9wdGlvbmFsUHJvcGVydGllczxHZXRGaWxlUGFyYW1zPih7IGFwcCwgcGF0aE9yRmlsZTogcGFyYW1zLnRhcmdldFBhdGhPckZpbGUsIHNob3VsZEluY2x1ZGVOb25FeGlzdGluZzogcGFyYW1zLmlzTm9uRXhpc3RpbmdGaWxlQWxsb3dlZCB9KSk7XG4gIGNvbnN0IHNvdXJjZVBhdGggPSBnZXRQYXRoKGFwcCwgcGFyYW1zLnNvdXJjZVBhdGhPckZpbGUpO1xuICBjb25zdCBzdWJwYXRoID0gcGFyYW1zLnN1YnBhdGggPz8gJyc7XG5cbiAgY29uc3QgbGlua0NvbmZpZyA9IGdldExpbmtDb25maWcocGFyYW1zKTtcbiAgY29uc3QgbGlua1RleHQgPSBnZW5lcmF0ZUxpbmtUZXh0KHtcbiAgICBhcHAsXG4gICAgY29uZmlnOiBsaW5rQ29uZmlnLFxuICAgIHNvdXJjZVBhdGgsXG4gICAgc3VicGF0aCxcbiAgICB0YXJnZXRGaWxlXG4gIH0pO1xuXG4gIHJldHVybiBsaW5rQ29uZmlnLmlzV2lraWxpbmtcbiAgICA/IGdlbmVyYXRlV2lraUxpbmsoe1xuICAgICAgYWxpYXM6IHBhcmFtcy5hbGlhcyxcbiAgICAgIGlzRW1iZWQ6IGxpbmtDb25maWcuaXNFbWJlZCxcbiAgICAgIGxpbmtUZXh0XG4gICAgfSlcbiAgICA6IGdlbmVyYXRlTWFya2Rvd25TdHlsZUxpbmsoe1xuICAgICAgY29uZmlnOiBsaW5rQ29uZmlnLFxuICAgICAgbGlua1RleHQsXG4gICAgICBtYXJrZG93bkxpbmtQYXJhbXM6IHBhcmFtcyxcbiAgICAgIHRhcmdldEZpbGVcbiAgICB9KTtcbn1cblxuZnVuY3Rpb24gZ2VuZXJhdGVNYXJrZG93blN0eWxlTGluayhwYXJhbXM6IEdlbmVyYXRlTWFya2Rvd25TdHlsZUxpbmtQYXJhbXMpOiBzdHJpbmcge1xuICBjb25zdCB7IGNvbmZpZywgbGlua1RleHQsIG1hcmtkb3duTGlua1BhcmFtcywgdGFyZ2V0RmlsZSB9ID0gcGFyYW1zO1xuICBsZXQgYWxpYXMgPSBtYXJrZG93bkxpbmtQYXJhbXMuYWxpYXMgPz8gJyc7XG4gIGxldCBzaG91bGRFc2NhcGVBbGlhcyA9IG1hcmtkb3duTGlua1BhcmFtcy5zaG91bGRFc2NhcGVBbGlhcyA/PyBmYWxzZTtcbiAgaWYgKCFhbGlhcyAmJiAoaXNNYXJrZG93bkZpbGUodGFyZ2V0RmlsZSkgfHwgIW1hcmtkb3duTGlua1BhcmFtcy5pc0VtcHR5RW1iZWRBbGlhc0FsbG93ZWQpKSB7XG4gICAgYWxpYXMgPSAhbWFya2Rvd25MaW5rUGFyYW1zLnNob3VsZEluY2x1ZGVBdHRhY2htZW50RXh0ZW5zaW9uVG9FbWJlZEFsaWFzIHx8IGlzTWFya2Rvd25GaWxlKHRhcmdldEZpbGUpXG4gICAgICA/IGdldExpbmtEaXNwbGF5TmFtZSh7IGFwcDogbWFya2Rvd25MaW5rUGFyYW1zLmFwcCwgZmlsZTogdGFyZ2V0RmlsZSB9KVxuICAgICAgOiB0YXJnZXRGaWxlLm5hbWU7XG4gICAgc2hvdWxkRXNjYXBlQWxpYXMgPSB0cnVlO1xuICB9XG5cbiAgcmV0dXJuIGdlbmVyYXRlUmF3TWFya2Rvd25MaW5rKHtcbiAgICBhbGlhcyxcbiAgICBpc0VtYmVkOiBjb25maWcuaXNFbWJlZCxcbiAgICBpc1dpa2lsaW5rOiBmYWxzZSxcbiAgICBzaG91bGRFc2NhcGVBbGlhcyxcbiAgICBzaG91bGRVc2VBbmdsZUJyYWNrZXRzOiBjb25maWcuc2hvdWxkVXNlQW5nbGVCcmFja2V0cyxcbiAgICB1cmw6IGxpbmtUZXh0XG4gIH0pO1xufVxuXG5mdW5jdGlvbiBnZW5lcmF0ZVdpa2lMaW5rKHBhcmFtczogR2VuZXJhdGVXaWtpTGlua1BhcmFtcyk6IHN0cmluZyB7XG4gIGNvbnN0IHsgYWxpYXMsIGlzRW1iZWQsIGxpbmtUZXh0IH0gPSBwYXJhbXM7XG4gIHJldHVybiBnZW5lcmF0ZVJhd01hcmtkb3duTGluayh7XG4gICAgaXNFbWJlZCxcbiAgICBpc1dpa2lsaW5rOiB0cnVlLFxuICAgIC4uLihhbGlhcz8udG9Mb3dlckNhc2UoKSA9PT0gbGlua1RleHQudG9Mb3dlckNhc2UoKVxuICAgICAgPyB7IHVybDogYWxpYXMgfVxuICAgICAgOiB7XG4gICAgICAgIGFsaWFzLFxuICAgICAgICB1cmw6IGxpbmtUZXh0XG4gICAgICB9KVxuICB9KTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gZ2V0RmlsZUNoYW5nZXMocGFyYW1zOiBHZXRGaWxlQ2hhbmdlc1BhcmFtcyk6IFByb21pc2U8RmlsZUNoYW5nZVtdPiB7XG4gIGNvbnN0IHtcbiAgICBjYWNoZSxcbiAgICBpc0NhbnZhc0ZpbGVDYWNoZSxcbiAgICBvZmZzZXRSYW5nZSxcbiAgICByZWZlcmVuY2VDb252ZXJ0ZXIsXG4gICAgc2hvdWxkSW5jbHVkZUV4dGVybmFsTGlua3MgPSBmYWxzZSxcbiAgICBzaG91bGRJbmNsdWRlRnJvbnRtYXR0ZXJFeHRlcm5hbExpbmtzID0gZmFsc2UsXG4gICAgc2hvdWxkSW5jbHVkZU11bHRpVmFsdWVGcm9udG1hdHRlckV4dGVybmFsTGlua3MgPSBmYWxzZSxcbiAgICBzaG91bGRTa2lwUmVmZXJlbmNlLFxuICAgIHNob3VsZFNraXBSZWZlcmVuY2VzSW5IZWFkaW5ncyA9IGZhbHNlXG4gIH0gPSBwYXJhbXM7XG4gIGxldCB7IGFib3J0U2lnbmFsIH0gPSBwYXJhbXM7XG4gIGFib3J0U2lnbmFsID8/PSBhYm9ydFNpZ25hbE5ldmVyKCk7XG4gIGFib3J0U2lnbmFsLnRocm93SWZBYm9ydGVkKCk7XG5cbiAgaWYgKCFjYWNoZSkge1xuICAgIHJldHVybiBbXTtcbiAgfVxuXG4gIGNvbnN0IGNoYW5nZXM6IEZpbGVDaGFuZ2VbXSA9IFtdO1xuXG4gIGNvbnN0IHRhYmxlUG9zaXRpb25zOiBUYWJsZVBvc2l0aW9uW10gPSAoY2FjaGUuc2VjdGlvbnMgPz8gW10pLmZpbHRlcigoc2VjdGlvbikgPT4gc2VjdGlvbi50eXBlID09PSAndGFibGUnKS5tYXAoKHNlY3Rpb24pID0+ICh7XG4gICAgZW5kOiBzZWN0aW9uLnBvc2l0aW9uLmVuZC5vZmZzZXQsXG4gICAgc3RhcnQ6IHNlY3Rpb24ucG9zaXRpb24uc3RhcnQub2Zmc2V0XG4gIH0pKTtcblxuICBjb25zdCBnZXRGaWxlQ2hhbmdlc0RlYnVnZ2VyID0gZ2V0T2JzaWRpYW5MaWJEZWJ1Z2dlcignTGluazpnZXRGaWxlQ2hhbmdlcycpO1xuXG4gIGZvciAoY29uc3QgcmVmZXJlbmNlIG9mIGdldFJlZmVyZW5jZXMoeyBjYWNoZSwgc2hvdWxkSW5jbHVkZUV4dGVybmFsTGlua3MsIHNob3VsZEluY2x1ZGVGcm9udG1hdHRlckV4dGVybmFsTGlua3MsIHNob3VsZEluY2x1ZGVNdWx0aVZhbHVlRnJvbnRtYXR0ZXJFeHRlcm5hbExpbmtzIH0pKSB7XG4gICAgYWJvcnRTaWduYWwudGhyb3dJZkFib3J0ZWQoKTtcblxuICAgIGlmIChvZmZzZXRSYW5nZSAhPT0gdW5kZWZpbmVkICYmICFpc1JlZmVyZW5jZUluT2Zmc2V0UmFuZ2UocmVmZXJlbmNlLCBvZmZzZXRSYW5nZSkpIHtcbiAgICAgIGdldEZpbGVDaGFuZ2VzRGVidWdnZXIoXG4gICAgICAgIGlzUmVmZXJlbmNlQ2FjaGUocmVmZXJlbmNlKVxuICAgICAgICAgID8gJ1NraXBwaW5nIGEgbGluayB0aGF0IGlzIG5vdCBmdWxseSBjb250YWluZWQgaW4gdGhlIG9mZnNldCByYW5nZSdcbiAgICAgICAgICA6ICdTa2lwcGluZyBhIGxpbmsgdGhhdCBjYXJyaWVzIG5vIHBvc2l0aW9uIHdpdGhpbiB0aGUgY29udGVudCwgc28gaXQgY2FuIG5ldmVyIGJlIGluIHRoZSBvZmZzZXQgcmFuZ2UnLFxuICAgICAgICB7IGxpbms6IHJlZmVyZW5jZS5vcmlnaW5hbCwgb2Zmc2V0UmFuZ2UgfVxuICAgICAgKTtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIGlmIChzaG91bGRTa2lwUmVmZXJlbmNlc0luSGVhZGluZ3MgJiYgaXNSZWZlcmVuY2VJbkhlYWRpbmcocmVmZXJlbmNlLCBjYWNoZSkpIHtcbiAgICAgIGdldEZpbGVDaGFuZ2VzRGVidWdnZXIoJ1NraXBwaW5nIGEgbGluayBpbnNpZGUgYSBoZWFkaW5nJywgeyBsaW5rOiByZWZlcmVuY2Uub3JpZ2luYWwgfSk7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICBpZiAoc2hvdWxkU2tpcFJlZmVyZW5jZT8uKHJlZmVyZW5jZSkpIHtcbiAgICAgIGdldEZpbGVDaGFuZ2VzRGVidWdnZXIoJ1NraXBwaW5nIGEgbGluayB0aGUgY2FsbGVyIGV4Y2x1ZGVkJywgeyBsaW5rOiByZWZlcmVuY2Uub3JpZ2luYWwgfSk7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICBjb25zdCBuZXdDb250ZW50ID0gYXdhaXQgcmVmZXJlbmNlQ29udmVydGVyKHJlZmVyZW5jZSwgYWJvcnRTaWduYWwpO1xuICAgIGFib3J0U2lnbmFsLnRocm93SWZBYm9ydGVkKCk7XG4gICAgaWYgKG5ld0NvbnRlbnQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgY29uc3QgZmlsZUNoYW5nZSA9IHJlZmVyZW5jZVRvRmlsZUNoYW5nZShyZWZlcmVuY2UsIG5ld0NvbnRlbnQpO1xuXG4gICAgaWYgKGlzQ2FudmFzRmlsZUNhY2hlKSB7XG4gICAgICBpZiAoaXNDYW52YXNDaGFuZ2UoZmlsZUNoYW5nZSkpIHtcbiAgICAgICAgY2hhbmdlcy5wdXNoKGZpbGVDaGFuZ2UpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc29sZS5lcnJvcignVW5zdXBwb3J0ZWQgZmlsZSBjaGFuZ2UnLCBmaWxlQ2hhbmdlKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKHNob3VsZEVzY2FwZVdpa2lsaW5rRGl2aWRlcihmaWxlQ2hhbmdlLCB0YWJsZVBvc2l0aW9ucykpIHtcbiAgICAgICAgZmlsZUNoYW5nZS5uZXdDb250ZW50ID0gZmlsZUNoYW5nZS5uZXdDb250ZW50LnJlcGxhY2VBbGwoT1BUSU9OQUxMWV9FU0NBUEVEX1dJS0lMSU5LX0RJVklERVJfUkVHRVhQLCAoKSA9PiBFU0NBUEVEX1dJS0lMSU5LX0RJVklERVIpO1xuICAgICAgfVxuXG4gICAgICBjaGFuZ2VzLnB1c2goZmlsZUNoYW5nZSk7XG4gICAgfVxuICB9XG4gIHJldHVybiBjaGFuZ2VzO1xufVxuXG5mdW5jdGlvbiBnZXRGaW5hbExpbmtQYXRoU3R5bGUoYXBwOiBBcHAsIGxpbmtQYXRoU3R5bGU/OiBMaW5rUGF0aFN0eWxlKTogRmluYWxMaW5rUGF0aFN0eWxlIHtcbiAgY29uc3QgcmVzb2x2ZWRTdHlsZSA9IGxpbmtQYXRoU3R5bGUgPz8gTGlua1BhdGhTdHlsZS5PYnNpZGlhblNldHRpbmdzRGVmYXVsdDtcbiAgc3dpdGNoIChyZXNvbHZlZFN0eWxlKSB7XG4gICAgY2FzZSBMaW5rUGF0aFN0eWxlLkFic29sdXRlUGF0aEluVmF1bHQ6IHtcbiAgICAgIHJldHVybiBGaW5hbExpbmtQYXRoU3R5bGUuQWJzb2x1dGVQYXRoSW5WYXVsdDtcbiAgICB9XG4gICAgY2FzZSBMaW5rUGF0aFN0eWxlLk9ic2lkaWFuU2V0dGluZ3NEZWZhdWx0OiB7XG4gICAgICByZXR1cm4gcmVzb2x2ZUZpbmFsTGlua1BhdGhTdHlsZUZyb21PYnNpZGlhblNldHRpbmdzKGFwcCk7XG4gICAgfVxuICAgIGNhc2UgTGlua1BhdGhTdHlsZS5SZWxhdGl2ZVBhdGhUb1RoZVNvdXJjZToge1xuICAgICAgcmV0dXJuIEZpbmFsTGlua1BhdGhTdHlsZS5SZWxhdGl2ZVBhdGhUb1RoZVNvdXJjZTtcbiAgICB9XG4gICAgY2FzZSBMaW5rUGF0aFN0eWxlLlNob3J0ZXN0UGF0aFdoZW5Qb3NzaWJsZToge1xuICAgICAgcmV0dXJuIEZpbmFsTGlua1BhdGhTdHlsZS5TaG9ydGVzdFBhdGhXaGVuUG9zc2libGU7XG4gICAgfVxuICAgIGRlZmF1bHQ6IHtcbiAgICAgIGFzc2VydE5ldmVyKHJlc29sdmVkU3R5bGUpO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBnZXRMaW5rQ29uZmlnKHBhcmFtczogR2VuZXJhdGVNYXJrZG93bkxpbmtQYXJhbXMpOiBMaW5rQ29uZmlnIHtcbiAgY29uc3QgeyBhcHAgfSA9IHBhcmFtcztcbiAgcmV0dXJuIHtcbiAgICBpc0VtYmVkOiBwYXJhbXMuaXNFbWJlZCA/PyAocGFyYW1zLm9yaWdpbmFsTGluayA/IGhhc0VtYmVkU3ludGF4KHBhcmFtcy5vcmlnaW5hbExpbmspIDogZmFsc2UpLFxuICAgIGlzU2luZ2xlU3VicGF0aEFsbG93ZWQ6IHBhcmFtcy5pc1NpbmdsZVN1YnBhdGhBbGxvd2VkID8/IHRydWUsXG4gICAgaXNXaWtpbGluazogc2hvdWxkVXNlV2lraWxpbmtTdHlsZShub3JtYWxpemVPcHRpb25hbFByb3BlcnRpZXM8U2hvdWxkVXNlV2lraWxpbmtTdHlsZVBhcmFtcz4oe1xuICAgICAgYXBwLFxuICAgICAgbGlua1N0eWxlOiBwYXJhbXMubGlua1N0eWxlLFxuICAgICAgb3JpZ2luYWxMaW5rOiBwYXJhbXMub3JpZ2luYWxMaW5rXG4gICAgfSkpLFxuICAgIGxpbmtQYXRoU3R5bGU6IGdldEZpbmFsTGlua1BhdGhTdHlsZShhcHAsIHBhcmFtcy5saW5rUGF0aFN0eWxlKSxcbiAgICBzaG91bGRVc2VBbmdsZUJyYWNrZXRzOiBwYXJhbXMuc2hvdWxkVXNlQW5nbGVCcmFja2V0cyA/PyAocGFyYW1zLm9yaWdpbmFsTGluayA/IGhhc0FuZ2xlQnJhY2tldHMocGFyYW1zLm9yaWdpbmFsTGluaykgOiB1bmRlZmluZWQpID8/IGZhbHNlLFxuICAgIHNob3VsZFVzZUxlYWRpbmdEb3RGb3JSZWxhdGl2ZVBhdGhzOiBwYXJhbXMuc2hvdWxkVXNlTGVhZGluZ0RvdEZvclJlbGF0aXZlUGF0aHNcbiAgICAgID8/IChwYXJhbXMub3JpZ2luYWxMaW5rID8gaGFzTGVhZGluZ0RvdChwYXJhbXMub3JpZ2luYWxMaW5rKSA6IHVuZGVmaW5lZCkgPz8gZmFsc2UsXG4gICAgc2hvdWxkVXNlTGVhZGluZ1NsYXNoRm9yQWJzb2x1dGVQYXRoczogcGFyYW1zLnNob3VsZFVzZUxlYWRpbmdTbGFzaEZvckFic29sdXRlUGF0aHNcbiAgICAgID8/IChwYXJhbXMub3JpZ2luYWxMaW5rID8gaGFzTGVhZGluZ1NsYXNoKHBhcmFtcy5vcmlnaW5hbExpbmspIDogdW5kZWZpbmVkKSA/PyBmYWxzZVxuICB9O1xufVxuXG4vKipcbiAqIFRoZSBuYW1lIGEgbGluayBjYXB0aW9uIHNob3dzIGZvciBhIGZpbGU6IHRoZSBmb2xkZXIncyBuYW1lIGZvciBhIE1hcmtkb3duIGZvbGRlciBub3RlLCB0aGUgYmFzZSBuYW1lIG90aGVyd2lzZS5cbiAqXG4gKiBAcGFyYW0gcGFyYW1zIC0gVGhlIGZpbGUsIGFuZCBvcHRpb25hbGx5IHRoZSBmb2xkZXItbm90ZSBzZXR1cCB0byBqdWRnZSBpdCBieS5cbiAqIEByZXR1cm5zIFRoZSBkaXNwbGF5IG5hbWUuXG4gKi9cbmZ1bmN0aW9uIGdldExpbmtEaXNwbGF5TmFtZShwYXJhbXM6IEdldEZvbGRlck5vdGVGb2xkZXJQYXJhbXMpOiBzdHJpbmcge1xuICBjb25zdCB7IGZpbGUgfSA9IHBhcmFtcztcbiAgaWYgKGlzTWFya2Rvd25GaWxlKGZpbGUpKSB7XG4gICAgY29uc3QgZm9sZGVyID0gZ2V0Rm9sZGVyTm90ZUZvbGRlcihwYXJhbXMpO1xuICAgIGlmIChmb2xkZXIpIHtcbiAgICAgIHJldHVybiBmb2xkZXIubmFtZTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gZmlsZS5iYXNlbmFtZTtcbn1cblxuZnVuY3Rpb24gZ2V0VW5kZWZpbmVkUGF5bG9hZCgpOiB1bmRlZmluZWQge1xuICAvLyBBIHNpbmdsZS10YXJnZXQgcmV3cml0ZSBoYXMgbm90aGluZyB0byByZW1lbWJlciBwZXIgbGluazogdGhlIHRhcmdldCBpcyBpbXBsaWVkLlxufVxuXG5mdW5jdGlvbiBub3JtYWxpemVGaWxlVXJsTGluayhyZWZlcmVuY2U6IFJlZmVyZW5jZSwgc2hvdWxkVXNlQW5nbGVCcmFja2V0czogYm9vbGVhbik6IE1heWJlUmV0dXJuPHN0cmluZz4ge1xuICBpZiAoaXNQYXJzZUxpbmtGcm9udG1hdHRlclJlZmVyZW5jZShyZWZlcmVuY2UpKSB7XG4gICAgLy8gQSBmcm9udG1hdHRlciB2YWx1ZSBob2xkcyBhIGJhcmUgVVJMIChyZS1zZXJpYWxpemVkL3F1b3RlZCBhcyBZQU1MKSwgbm90IGEgYFthbGlhc10odXJsKWAgbWFya2Rvd24gbGluay5cbiAgICByZXR1cm4gcmVmZXJlbmNlLnBhcnNlTGlua1Jlc3VsdC5pc0ZpbGVVcmwgPyBub3JtYWxpemVGaWxlVXJsKHJlZmVyZW5jZS5wYXJzZUxpbmtSZXN1bHQudXJsKSA6IHVuZGVmaW5lZDtcbiAgfVxuXG4gIGlmICghaXNQYXJzZUxpbmtSZWZlcmVuY2UocmVmZXJlbmNlKSkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGNvbnN0IHsgcGFyc2VMaW5rUmVzdWx0IH0gPSByZWZlcmVuY2U7XG4gIHJldHVybiBwYXJzZUxpbmtSZXN1bHQuaXNGaWxlVXJsXG4gICAgPyBnZW5lcmF0ZVJhd01hcmtkb3duTGluayhub3JtYWxpemVPcHRpb25hbFByb3BlcnRpZXM8R2VuZXJhdGVSYXdNYXJrZG93bkxpbmtQYXJhbXM+KHtcbiAgICAgIGFsaWFzOiBwYXJzZUxpbmtSZXN1bHQuYWxpYXMsXG4gICAgICBpc0VtYmVkOiBwYXJzZUxpbmtSZXN1bHQuaXNFbWJlZCxcbiAgICAgIGlzV2lraWxpbms6IGZhbHNlLFxuICAgICAgc2hvdWxkVXNlQW5nbGVCcmFja2V0cyxcbiAgICAgIHVybDogbm9ybWFsaXplRmlsZVVybChwYXJzZUxpbmtSZXN1bHQudXJsKVxuICAgIH0pKVxuICAgIDogdW5kZWZpbmVkO1xufVxuXG4vKipcbiAqIFJlZnJlc2hlcyBhIGZpbGUtbmFtZSBhbGlhcyB0byB0aGUgZGlzcGxheSBuYW1lIG9mIHRoZSByZW5hbWVkIHRhcmdldC5cbiAqXG4gKiBAcGFyYW0gcGFyYW1zIC0gVGhlIGN1cnJlbnQgYWxpYXMsIGFuZCB0aGUgdGFyZ2V0IGJlZm9yZSBhbmQgYWZ0ZXIuXG4gKiBAcmV0dXJucyBUaGUgYWxpYXMgdG8gdXNlLlxuICovXG5mdW5jdGlvbiByZWZyZXNoRmlsZU5hbWVBbGlhcyhwYXJhbXM6IFJlZnJlc2hGaWxlTmFtZUFsaWFzUGFyYW1zKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgY29uc3QgeyBhbGlhcywgYXBwLCBjYW5BZGRBbGlhcywgbmV3VGFyZ2V0RmlsZSwgb2xkVGFyZ2V0UGF0aCB9ID0gcGFyYW1zO1xuICBjb25zdCBvbGRCYXNlTmFtZSA9IGJhc2VuYW1lKG9sZFRhcmdldFBhdGgsIGV4dG5hbWUob2xkVGFyZ2V0UGF0aCkpO1xuICBjb25zdCBmb2xkZXJOb3RlQ29uZmlnID0gcmVzb2x2ZUZvbGRlck5vdGVDb25maWcoeyBhcHAgfSk7XG4gIGNvbnN0IGRpc3BsYXlOYW1lID0gZ2V0TGlua0Rpc3BsYXlOYW1lKHsgYXBwLCBjb25maWc6IGZvbGRlck5vdGVDb25maWcsIGZpbGU6IG5ld1RhcmdldEZpbGUgfSk7XG4gIGNvbnN0IGlzRm9sZGVyTm90ZSA9IGRpc3BsYXlOYW1lICE9PSBuZXdUYXJnZXRGaWxlLmJhc2VuYW1lO1xuICAvLyBBIGZvbGRlciByZW5hbWUgbGVhdmVzIHRoZSBub3RlIGBjaGFybGllLyEubWRgIG5hbWVkIGFzIGl0IHdhcywgc28gaXRzIG9sZCBkaXNwbGF5IG5hbWUgd2FzIHRoZSBvbGQgZm9sZGVyJ3MgbmFtZS5cbiAgY29uc3Qgb2xkRm9sZGVyTm90ZURpc3BsYXlOYW1lID0gaXNGb2xkZXJOb3RlICYmIGZvbGRlck5vdGVDb25maWcubG9jYXRpb24gPT09IEZvbGRlck5vdGVMb2NhdGlvbi5JbnNpZGVGb2xkZXJcbiAgICAgICYmIG9sZEJhc2VOYW1lID09PSBuZXdUYXJnZXRGaWxlLmJhc2VuYW1lXG4gICAgPyBiYXNlbmFtZShkaXJuYW1lKG9sZFRhcmdldFBhdGgpKVxuICAgIDogbnVsbDtcblxuICBpZiAoYWxpYXMgPT09IG9sZEJhc2VOYW1lIHx8IGFsaWFzID09PSBvbGRGb2xkZXJOb3RlRGlzcGxheU5hbWUpIHtcbiAgICByZXR1cm4gZGlzcGxheU5hbWU7XG4gIH1cblxuICBpZiAoYWxpYXMgPT09IGJhc2VuYW1lKG9sZFRhcmdldFBhdGgpKSB7XG4gICAgcmV0dXJuIGlzRm9sZGVyTm90ZSA/IGAke2Rpc3BsYXlOYW1lfS4ke25ld1RhcmdldEZpbGUuZXh0ZW5zaW9ufWAgOiBuZXdUYXJnZXRGaWxlLm5hbWU7XG4gIH1cblxuICAvLyBBbiBhbGlhcy1sZXNzIHdpa2lsaW5rIHRvIGBjaGFybGllLyFgIHdvdWxkIGRpc3BsYXkgYCFgLCBzbyBpdCB0YWtlcyB0aGUgZm9sZGVyJ3MgbmFtZSBhcyBpdHMgYWxpYXMuXG4gIHJldHVybiBhbGlhcyA9PT0gdW5kZWZpbmVkICYmIGlzRm9sZGVyTm90ZSAmJiBjYW5BZGRBbGlhcyA/IGRpc3BsYXlOYW1lIDogYWxpYXM7XG59XG5cbmZ1bmN0aW9uIHJlc29sdmVGaW5hbExpbmtQYXRoU3R5bGVGcm9tT2JzaWRpYW5TZXR0aW5ncyhhcHA6IEFwcCk6IEZpbmFsTGlua1BhdGhTdHlsZSB7XG4gIGNvbnN0IG5ld0xpbmtGb3JtYXQgPSBnZXROZXdMaW5rRm9ybWF0KGFwcCk7XG4gIHN3aXRjaCAobmV3TGlua0Zvcm1hdCkge1xuICAgIGNhc2UgJ2Fic29sdXRlJzoge1xuICAgICAgcmV0dXJuIEZpbmFsTGlua1BhdGhTdHlsZS5BYnNvbHV0ZVBhdGhJblZhdWx0O1xuICAgIH1cbiAgICBjYXNlICdyZWxhdGl2ZSc6IHtcbiAgICAgIHJldHVybiBGaW5hbExpbmtQYXRoU3R5bGUuUmVsYXRpdmVQYXRoVG9UaGVTb3VyY2U7XG4gICAgfVxuICAgIGNhc2UgJ3Nob3J0ZXN0Jzoge1xuICAgICAgcmV0dXJuIEZpbmFsTGlua1BhdGhTdHlsZS5TaG9ydGVzdFBhdGhXaGVuUG9zc2libGU7XG4gICAgfVxuICAgIGRlZmF1bHQ6IHtcbiAgICAgIGFzc2VydE5ldmVyKG5ld0xpbmtGb3JtYXQpO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiByZXNvbHZlU25hcHNob3RSZWZlcmVuY2VJZGVudGl0eUtleVByb3ZpZGVyKHBhcmFtczogUmVzb2x2ZVNuYXBzaG90UmVmZXJlbmNlSWRlbnRpdHlLZXlQcm92aWRlclBhcmFtcyk6IChyZWZlcmVuY2U6IFJlZmVyZW5jZSkgPT4gc3RyaW5nIHtcbiAgY29uc3QgeyBjYWxsZXJOYW1lLCBleHBsaWNpdFJlZmVyZW5jZUlkZW50aXR5S2V5UHJvdmlkZXIsIHNuYXBzaG90IH0gPSBwYXJhbXM7XG4gIGNvbnN0IHJlY29yZGVkUmVmZXJlbmNlSWRlbnRpdHlLZXlQcm92aWRlciA9IHNuYXBzaG90UmVmZXJlbmNlSWRlbnRpdHlLZXlQcm92aWRlcnMuZ2V0KHNuYXBzaG90KTtcbiAgaWYgKFxuICAgIGV4cGxpY2l0UmVmZXJlbmNlSWRlbnRpdHlLZXlQcm92aWRlciAmJiByZWNvcmRlZFJlZmVyZW5jZUlkZW50aXR5S2V5UHJvdmlkZXJcbiAgICAmJiBleHBsaWNpdFJlZmVyZW5jZUlkZW50aXR5S2V5UHJvdmlkZXIgIT09IHJlY29yZGVkUmVmZXJlbmNlSWRlbnRpdHlLZXlQcm92aWRlclxuICApIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICBgJHtjYWxsZXJOYW1lfSB3YXMgcGFzc2VkIGEgcmVmZXJlbmNlSWRlbnRpdHlLZXlQcm92aWRlciB0aGF0IGRpZmZlcnMgZnJvbSB0aGUgb25lIHRoZSBzbmFwc2hvdCB3YXMgYnVpbHQgd2l0aC4gYFxuICAgICAgICArICdUaGUgc25hcHNob3QgaXMga2V5ZWQgYnkgdGhlIG90aGVyLCBzbyBubyBsaW5rIHdvdWxkIG1hdGNoLiBPbWl0IHRoZSBwYXJhbWV0ZXIgdG8gdXNlIHRoZSBzbmFwc2hvdFxcJ3Mgb3duLidcbiAgICApO1xuICB9XG4gIHJldHVybiBleHBsaWNpdFJlZmVyZW5jZUlkZW50aXR5S2V5UHJvdmlkZXIgPz8gcmVjb3JkZWRSZWZlcmVuY2VJZGVudGl0eUtleVByb3ZpZGVyID8/IGRlZmF1bHRSZWZlcmVuY2VJZGVudGl0eUtleVByb3ZpZGVyO1xufVxuXG5mdW5jdGlvbiBzaG91bGRFc2NhcGVXaWtpbGlua0RpdmlkZXIoZmlsZUNoYW5nZTogRmlsZUNoYW5nZSwgdGFibGVQb3NpdGlvbnM6IFRhYmxlUG9zaXRpb25bXSk6IGJvb2xlYW4ge1xuICAvKiB2OCBpZ25vcmUgc3RhcnQgLS0gZ2V0RmlsZUNoYW5nZXMgb25seSBjYWxscyB0aGlzIGZvciBub24tY2FudmFzIGZpbGVzIHdoaWNoIGFsd2F5cyBoYXZlIGNvbnRlbnQgY2hhbmdlcy4gKi9cbiAgaWYgKCFpc0NvbnRlbnRDaGFuZ2UoZmlsZUNoYW5nZSkpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgLyogdjggaWdub3JlIHN0b3AgKi9cblxuICByZXR1cm4gVU5FU0NBUEVEX1dJS0lMSU5LX0RJVklERVJfUkVHRVhQLnRlc3QoZmlsZUNoYW5nZS5uZXdDb250ZW50KSAmJiB0YWJsZVBvc2l0aW9ucy5zb21lKCh0YWJsZVBvc2l0aW9uKSA9PiB0YWJsZVBvc2l0aW9uLnN0YXJ0IDw9IGZpbGVDaGFuZ2UucmVmZXJlbmNlLnBvc2l0aW9uLnN0YXJ0Lm9mZnNldCAmJiBmaWxlQ2hhbmdlLnJlZmVyZW5jZS5wb3NpdGlvbi5lbmQub2Zmc2V0IDw9IHRhYmxlUG9zaXRpb24uZW5kKTtcbn1cblxuZnVuY3Rpb24gc2hvdWxkVXNlV2lraWxpbmtTdHlsZShwYXJhbXM6IFNob3VsZFVzZVdpa2lsaW5rU3R5bGVQYXJhbXMpOiBib29sZWFuIHtcbiAgY29uc3QgeyBhcHAsIGxpbmtTdHlsZSwgb3JpZ2luYWxMaW5rIH0gPSBwYXJhbXM7XG4gIGNvbnN0IHJlc29sdmVkU3R5bGUgPSBsaW5rU3R5bGUgPz8gTGlua1N0eWxlLlByZXNlcnZlRXhpc3Rpbmc7XG4gIHN3aXRjaCAocmVzb2x2ZWRTdHlsZSkge1xuICAgIGNhc2UgTGlua1N0eWxlLk1hcmtkb3duOiB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGNhc2UgTGlua1N0eWxlLk9ic2lkaWFuU2V0dGluZ3NEZWZhdWx0OiB7XG4gICAgICByZXR1cm4gc2hvdWxkVXNlV2lraWxpbmtzKGFwcCk7XG4gICAgfVxuICAgIGNhc2UgTGlua1N0eWxlLlByZXNlcnZlRXhpc3Rpbmc6IHtcbiAgICAgIHJldHVybiBvcmlnaW5hbExpbmsgPT09IHVuZGVmaW5lZCA/IHNob3VsZFVzZVdpa2lsaW5rcyhhcHApIDogaGFzV2lraWxpbmtTeW50YXgob3JpZ2luYWxMaW5rKTtcbiAgICB9XG4gICAgY2FzZSBMaW5rU3R5bGUuV2lraWxpbms6IHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICBkZWZhdWx0OiB7XG4gICAgICBhc3NlcnROZXZlcihyZXNvbHZlZFN0eWxlKTtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gdmFsaWRhdGVPZmZzZXRSYW5nZShvZmZzZXRSYW5nZTogT2Zmc2V0UmFuZ2UpOiB2b2lkIHtcbiAgaWYgKG9mZnNldFJhbmdlLnN0YXJ0T2Zmc2V0IDwgMCkge1xuICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBvZmZzZXQgcmFuZ2U6IHRoZSBzdGFydCBvZmZzZXQgJHtTdHJpbmcob2Zmc2V0UmFuZ2Uuc3RhcnRPZmZzZXQpfSBtdXN0IG5vdCBiZSBuZWdhdGl2ZS5gKTtcbiAgfVxuXG4gIGlmIChvZmZzZXRSYW5nZS5lbmRPZmZzZXQgPCBvZmZzZXRSYW5nZS5zdGFydE9mZnNldCkge1xuICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBvZmZzZXQgcmFuZ2U6IHRoZSBlbmQgb2Zmc2V0ICR7U3RyaW5nKG9mZnNldFJhbmdlLmVuZE9mZnNldCl9IG11c3Qgbm90IGJlIGxlc3MgdGhhbiB0aGUgc3RhcnQgb2Zmc2V0ICR7U3RyaW5nKG9mZnNldFJhbmdlLnN0YXJ0T2Zmc2V0KX0uYCk7XG4gIH1cbn1cbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFnQkEsOEJBQWlDO0FBQ2pDLDBCQUdPO0FBQ1Asa0JBTU87QUFDUCxvQkFJTztBQUNQLHlCQUlPO0FBQ1AsaUJBR087QUFDUCw2QkFHTztBQUNQLHNCQUdPO0FBWVAsbUJBQXVDO0FB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QkFBZ0IsMkNBQWlCLEdBQUc7QUFDMUMsVUFBUSxlQUFlO0FBQUEsSUFDckIsS0FBSyxZQUFZO0FBQ2YsYUFBTztBQUFBLElBQ1Q7QUFBQSxJQUNBLEtBQUssWUFBWTtBQUNmLGFBQU87QUFBQSxJQUNUO0FBQUEsSUFDQSxLQUFLLFlBQVk7QUFDZixhQUFPO0FBQUEsSUFDVDtBQUFBLElBQ0EsU0FBUztBQUNQLDBDQUFZLGFBQWE7QUFBQSxJQUMzQjtBQUFBLEVBQ0Y7QUFDRjtBQUVBLFNBQVMsNENBQTRDLFFBQTZGO0FBQ2hKLFFBQU0sRUFBRSxZQUFZLHNDQUFzQyxTQUFTLElBQUk7QUFDdkUsUUFBTSx1Q0FBdUMsc0NBQXNDLElBQUksUUFBUTtBQUMvRixNQUNFLHdDQUF3Qyx3Q0FDckMseUNBQXlDLHNDQUM1QztBQUNBLFVBQU0sSUFBSTtBQUFBLE1BQ1IsR0FBRyxVQUFVO0FBQUEsSUFFZjtBQUFBLEVBQ0Y7QUFDQSxTQUFPLHdDQUF3Qyx3Q0FBd0M7QUFDekY7QUFFQSxTQUFTLDRCQUE0QixZQUF3QixnQkFBMEM7QUFFckcsTUFBSSxLQUFDLG9DQUFnQixVQUFVLEdBQUc7QUFDaEMsV0FBTztBQUFBLEVBQ1Q7QUFHQSxTQUFPLGtDQUFrQyxLQUFLLFdBQVcsVUFBVSxLQUFLLGVBQWUsS0FBSyxDQUFDLGtCQUFrQixjQUFjLFNBQVMsV0FBVyxVQUFVLFNBQVMsTUFBTSxVQUFVLFdBQVcsVUFBVSxTQUFTLElBQUksVUFBVSxjQUFjLEdBQUc7QUFDblA7QUFFQSxTQUFTLHVCQUF1QixRQUErQztBQUM3RSxRQUFNLEVBQUUsS0FBSyxXQUFXLGFBQWEsSUFBSTtBQUN6QyxRQUFNLGdCQUFnQixhQUFhO0FBQ25DLFVBQVEsZUFBZTtBQUFBLElBQ3JCLEtBQUssMkJBQW9CO0FBQ3ZCLGFBQU87QUFBQSxJQUNUO0FBQUEsSUFDQSxLQUFLLHlEQUFtQztBQUN0QyxpQkFBTyw2Q0FBbUIsR0FBRztBQUFBLElBQy9CO0FBQUEsSUFDQSxLQUFLLDJDQUE0QjtBQUMvQixhQUFPLGlCQUFpQixhQUFZLDZDQUFtQixHQUFHLElBQUksa0JBQWtCLFlBQVk7QUFBQSxJQUM5RjtBQUFBLElBQ0EsS0FBSywyQkFBb0I7QUFDdkIsYUFBTztBQUFBLElBQ1Q7QUFBQSxJQUNBLFNBQVM7QUFDUCwwQ0FBWSxhQUFhO0FBQUEsSUFDM0I7QUFBQSxFQUNGO0FBQ0Y7QUFFQSxTQUFTLG9CQUFvQixhQUFnQztBQUMzRCxNQUFJLFlBQVksY0FBYyxHQUFHO0FBQy9CLFVBQU0sSUFBSSxNQUFNLDBDQUEwQyxPQUFPLFlBQVksV0FBVyxDQUFDLHdCQUF3QjtBQUFBLEVBQ25IO0FBRUEsTUFBSSxZQUFZLFlBQVksWUFBWSxhQUFhO0FBQ25ELFVBQU0sSUFBSSxNQUFNLHdDQUF3QyxPQUFPLFlBQVksU0FBUyxDQUFDLDJDQUEyQyxPQUFPLFlBQVksV0FBVyxDQUFDLEdBQUc7QUFBQSxFQUNwSztBQUNGOyIsIm5hbWVzIjpbIkxpbmtQYXRoU3R5bGUiLCJMaW5rU3R5bGUiXX0=