@mnaoumov/obsidian-lib 6.0.0 → 6.0.1

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.
@@ -148,6 +148,7 @@ import {
148
148
  parseLink
149
149
  } from "./parse-link.mjs";
150
150
  import {
151
+ getReferenceLinkText,
151
152
  isCanvasFileNodeReference,
152
153
  isReferenceInOffsetRange,
153
154
  referenceToFileChange
@@ -219,7 +220,7 @@ function convertLink(params) {
219
220
  shouldUseAngleBrackets: params.shouldUseAngleBrackets,
220
221
  shouldUseLeadingDotForRelativePaths: params.shouldUseLeadingDotForRelativePaths,
221
222
  shouldUseLeadingSlashForAbsolutePaths: params.shouldUseLeadingSlashForAbsolutePaths
222
- })) : params.link.original;
223
+ })) : getReferenceLinkText(params.link);
223
224
  }
224
225
  async function editBacklinks(params) {
225
226
  const {
@@ -546,8 +547,9 @@ function updateLink(params) {
546
547
  shouldUseLeadingDotForRelativePaths,
547
548
  shouldUseLeadingSlashForAbsolutePaths
548
549
  } = params;
550
+ const originalLinkText = getReferenceLinkText(link);
549
551
  if (!newTargetPathOrFile) {
550
- return link.original;
552
+ return originalLinkText;
551
553
  }
552
554
  const newTargetFile = getFile({ app, pathOrFile: newTargetPathOrFile, shouldIncludeNonExisting: true });
553
555
  const oldSourcePath = getPath(app, oldSourcePathOrFile ?? newSourcePathOrFile);
@@ -555,13 +557,13 @@ function updateLink(params) {
555
557
  const isWikilink = shouldUseWikilinkStyle(normalizeOptionalProperties({
556
558
  app,
557
559
  linkStyle,
558
- originalLink: link.original
560
+ originalLink: originalLinkText
559
561
  }));
560
562
  const { subpath } = splitSubpath(link.link);
561
563
  if (isCanvasFile(newSourcePathOrFile) && isCanvasFileNodeReference(link)) {
562
564
  return newTargetFile.path + subpath;
563
565
  }
564
- const parseLinkResult = parseLink(link.original);
566
+ const parseLinkResult = parseLink(originalLinkText);
565
567
  let alias;
566
568
  if (isWikilink && parseLinkResult?.alias) {
567
569
  alias = parseLinkResult.alias;
@@ -589,7 +591,7 @@ function updateLink(params) {
589
591
  isSingleSubpathAllowed: oldSourcePath === oldTargetPath && !!parseLinkResult?.alias,
590
592
  linkPathStyle,
591
593
  linkStyle,
592
- originalLink: link.original,
594
+ originalLink: originalLinkText,
593
595
  shouldEscapeAlias,
594
596
  shouldIncludeAttachmentExtensionToEmbedAlias,
595
597
  shouldUseAngleBrackets,
@@ -624,7 +626,7 @@ async function updateLinksInContent(params) {
624
626
  app,
625
627
  content,
626
628
  linkConverter: (link) => {
627
- const isEmbedLink = hasEmbedSyntax(link.original);
629
+ const isEmbedLink = hasEmbedSyntax(getReferenceLinkText(link));
628
630
  return shouldUpdateEmbedOnlyLinks !== void 0 && shouldUpdateEmbedOnlyLinks !== isEmbedLink ? void 0 : convertLink(normalizeOptionalProperties({
629
631
  app,
630
632
  isEmptyEmbedAliasAllowed,
@@ -668,7 +670,7 @@ async function updateLinksInFile(params) {
668
670
  await editLinks(normalizeOptionalProperties({
669
671
  ...params,
670
672
  linkConverter: (link) => {
671
- const isEmbedLink = hasEmbedSyntax(link.original);
673
+ const isEmbedLink = hasEmbedSyntax(getReferenceLinkText(link));
672
674
  return shouldUpdateEmbedOnlyLinks !== void 0 && shouldUpdateEmbedOnlyLinks !== isEmbedLink ? void 0 : convertLink(normalizeOptionalProperties({
673
675
  app,
674
676
  isEmptyEmbedAliasAllowed,
@@ -984,4 +986,4 @@ export {
984
986
  updateLinksInContent,
985
987
  updateLinksInFile
986
988
  };
987
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9saW5rLnRzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGZpbGVcbiAqXG4gKiBUaGlzIG1vZHVsZSBwcm92aWRlcyB1dGlsaXRpZXMgZm9yIGhhbmRsaW5nIGFuZCB1cGRhdGluZyBsaW5rcyB3aXRoaW4gT2JzaWRpYW4gdmF1bHRzLiBJdCBpbmNsdWRlc1xuICogZnVuY3Rpb25zIHRvIHNwbGl0IHBhdGhzLCB1cGRhdGUgbGlua3MgaW4gZmlsZXMsIGFuZCBnZW5lcmF0ZSBtYXJrZG93biBsaW5rcyB3aXRoIHZhcmlvdXMgb3B0aW9ucy5cbiAqL1xuXG5pbXBvcnQgdHlwZSB7IE1heWJlUmV0dXJuIH0gZnJvbSAnQG1uYW91bW92L3R5cGVzY3JpcHQtbGliL3R5cGUnO1xuaW1wb3J0IHR5cGUge1xuICBBcHAsXG4gIENhY2hlZE1ldGFkYXRhLFxuICBSZWZlcmVuY2UsXG4gIFRGaWxlXG59IGZyb20gJ29ic2lkaWFuJztcbmltcG9ydCB0eXBlIHsgUHJvbWlzYWJsZSB9IGZyb20gJ3R5cGUtZmVzdCc7XG5cbmltcG9ydCB7IGFib3J0U2lnbmFsTmV2ZXIgfSBmcm9tICdAbW5hb3Vtb3YvdHlwZXNjcmlwdC1saWIvYWJvcnQtY29udHJvbGxlcic7XG5pbXBvcnQge1xuICBub3JtYWxpemVPcHRpb25hbFByb3BlcnRpZXMsXG4gIHJlbW92ZVVuZGVmaW5lZFByb3BlcnRpZXNcbn0gZnJvbSAnQG1uYW91bW92L3R5cGVzY3JpcHQtbGliL29iamVjdC11dGlscyc7XG5pbXBvcnQge1xuICBiYXNlbmFtZSxcbiAgZGlybmFtZSxcbiAgZXh0bmFtZSxcbiAgam9pbixcbiAgcmVsYXRpdmVcbn0gZnJvbSAnQG1uYW91bW92L3R5cGVzY3JpcHQtbGliL3BhdGgnO1xuaW1wb3J0IHtcbiAgbm9ybWFsaXplU3RyaW5nLFxuICByZXBsYWNlQWxsLFxuICB0cmltRW5kXG59IGZyb20gJ0BtbmFvdW1vdi90eXBlc2NyaXB0LWxpYi9zdHJpbmcnO1xuaW1wb3J0IHtcbiAgYXNzZXJ0TmV2ZXIsXG4gIGFzc2VydE5vbk51bGxhYmxlLFxuICBlbnN1cmVOb25OdWxsYWJsZVxufSBmcm9tICdAbW5hb3Vtb3YvdHlwZXNjcmlwdC1saWIvdHlwZS1ndWFyZHMnO1xuaW1wb3J0IHtcbiAgZW5jb2RlVXJsLFxuICBub3JtYWxpemVGaWxlVXJsXG59IGZyb20gJ0BtbmFvdW1vdi90eXBlc2NyaXB0LWxpYi91cmwnO1xuaW1wb3J0IHtcbiAgSW50ZXJuYWxQbHVnaW5OYW1lLFxuICBpc1JlZmVyZW5jZUNhY2hlXG59IGZyb20gJ0BvYnNpZGlhbi10eXBpbmdzL29ic2lkaWFuLXB1YmxpYy1sYXRlc3QvaW1wbGVtZW50YXRpb25zJztcbmltcG9ydCB7XG4gIG5vcm1hbGl6ZVBhdGgsXG4gIHBhcnNlTGlua3RleHRcbn0gZnJvbSAnb2JzaWRpYW4nO1xuXG5pbXBvcnQgdHlwZSB7IEZpbGVDaGFuZ2UgfSBmcm9tICcuL2ZpbGUtY2hhbmdlLnRzJztcbmltcG9ydCB0eXBlIHtcbiAgR2V0RmlsZVBhcmFtcyxcbiAgUGF0aE9yRmlsZVxufSBmcm9tICcuL2ZpbGUtc3lzdGVtLnRzJztcbmltcG9ydCB0eXBlIHsgTGlua1VwZGF0ZVByb2dyZXNzUmVwb3J0ZXIgfSBmcm9tICcuL2xpbmstdXBkYXRlLXByb2dyZXNzLnRzJztcbmltcG9ydCB0eXBlIHsgT2Zmc2V0UmFuZ2UgfSBmcm9tICcuL3JlZmVyZW5jZS50cyc7XG5pbXBvcnQgdHlwZSB7IFByb2Nlc3NPcHRpb25zIH0gZnJvbSAnLi92YXVsdC50cyc7XG5cbmltcG9ydCB7IGdldE9ic2lkaWFuTGliRGVidWdnZXIgfSBmcm9tICcuL2RlYnVnLnRzJztcbmltcG9ydCB7XG4gIGFwcGx5Q29udGVudENoYW5nZXMsXG4gIGFwcGx5RmlsZUNoYW5nZXMsXG4gIGlzQ2FudmFzQ2hhbmdlLFxuICBpc0NvbnRlbnRDaGFuZ2Vcbn0gZnJvbSAnLi9maWxlLWNoYW5nZS50cyc7XG5pbXBvcnQge1xuICBnZXRGaWxlLFxuICBnZXRQYXRoLFxuICBpc0NhbnZhc0ZpbGUsXG4gIGlzTWFya2Rvd25GaWxlLFxuICBNQVJLRE9XTl9GSUxFX0VYVEVOU0lPTlxufSBmcm9tICcuL2ZpbGUtc3lzdGVtLnRzJztcbmltcG9ydCB7XG4gIGdldEJhY2tsaW5rc0ZvckZpbGVTYWZlLFxuICBnZXRDYWNoZVNhZmUsXG4gIGdldExpbmtzLFxuICBwYXJzZU1ldGFkYXRhLFxuICByZWdpc3RlckZpbGVzXG59IGZyb20gJy4vbWV0YWRhdGEtY2FjaGUudHMnO1xuaW1wb3J0IHsgZ2V0T2JzaWRpYW5MaWJTdGF0ZSB9IGZyb20gJy4vb2JzaWRpYW4tbGliLXN0YXRlLnRzJztcbmltcG9ydCB7XG4gIGdldE5ld0xpbmtGb3JtYXQsXG4gIHNob3VsZFVzZVdpa2lsaW5rc1xufSBmcm9tICcuL29ic2lkaWFuLXNldHRpbmdzLnRzJztcbmltcG9ydCB7XG4gIGVzY2FwZUFsaWFzLFxuICBpc1BhcnNlTGlua0Zyb250bWF0dGVyUmVmZXJlbmNlLFxuICBpc1BhcnNlTGlua1JlZmVyZW5jZSxcbiAgcGFyc2VMaW5rXG59IGZyb20gJy4vcGFyc2UtbGluay50cyc7XG5pbXBvcnQge1xuICBpc0NhbnZhc0ZpbGVOb2RlUmVmZXJlbmNlLFxuICBpc1JlZmVyZW5jZUluT2Zmc2V0UmFuZ2UsXG4gIHJlZmVyZW5jZVRvRmlsZUNoYW5nZVxufSBmcm9tICcuL3JlZmVyZW5jZS50cyc7XG5cbmNvbnN0IEVTQ0FQRURfV0lLSUxJTktfRElWSURFUiA9IFN0cmluZy5yYXdgXFx8YDtcblxuLyoqXG4gKiBNYXRjaGVzIGEgd2lraWxpbmsgZGl2aWRlciB0b2dldGhlciB3aXRoIHRoZSBiYWNrc2xhc2ggZXNjYXBpbmcgaXQsIGlmIGFueS4gQSBsb29rYmVoaW5kIHdvdWxkIHNheSBcInVuZXNjYXBlZFwiXG4gKiBkaXJlY3RseSwgYnV0IGl0IGlzIGEgc3ludGF4IGVycm9yIG9uIGlPUyBiZWZvcmUgMTYuNCwgYmVsb3cgdGhlIGlPUyAxNSBPYnNpZGlhbiBtb2JpbGUgc3RpbGwgc3VwcG9ydHMuXG4gKiBSZXBsYWNpbmcgZXZlcnkgbWF0Y2ggd2l0aCBhbiBlc2NhcGVkIGRpdmlkZXIgbGVhdmVzIGFuIGVzY2FwZWQgb25lIGFzIGl0IHdhcyBhbmQgZXNjYXBlcyBhIGJhcmUgb25lLlxuICovXG5jb25zdCBPUFRJT05BTExZX0VTQ0FQRURfV0lLSUxJTktfRElWSURFUl9SRUdFWFAgPSAvXFxcXD9cXHwvZztcblxuLyoqXG4gKiBUZXN0cyBmb3IgYSB3aWtpbGluayBkaXZpZGVyIG5vIGJhY2tzbGFzaCBlc2NhcGVzLiBOb3QgZ2xvYmFsLCBzbyBhIGB0ZXN0YCBrZWVwcyBubyBgbGFzdEluZGV4YCBiZXR3ZWVuIGNhbGxzLlxuICovXG5jb25zdCBVTkVTQ0FQRURfV0lLSUxJTktfRElWSURFUl9SRUdFWFAgPSAvKD86XnxbXlxcXFxdKVxcfC87XG5cbi8qKlxuICogVGhlIGxpbmsgaWRlbnRpdHkga2V5IHByb3ZpZGVyIGVhY2ggc25hcHNob3Qgd2FzIGJ1aWx0IHdpdGguIEtlcHQgYmVzaWRlIHRoZSBzbmFwc2hvdCByYXRoZXIgdGhhbiBpbiBpdCwgc28gYVxuICogc25hcHNob3Qgc3RheXMgYSBwbGFpbiBtYXAgYW5kIHRoZSBvbmUgZnVuY3Rpb24gdGhhdCBrZXllZCBpdCBpcyBhbHNvIHRoZSBvbmUgdGhhdCBsb29rcyBpdCB1cCDigJQgcGFzc2luZyBhXG4gKiBwcm92aWRlciB0byBvbmx5IG9uZSBvZiB7QGxpbmsgYnVpbGRCYWNrbGlua3NTbmFwc2hvdH0gYW5kIHtAbGluayBlZGl0QmFja2xpbmtzU25hcHNob3R9IHVzZWQgdG8gbGVhdmUgZXZlcnlcbiAqIGxpbmsgdW5tYXRjaGVkLCBhbmQgdGhlIGVkaXQgcmV3cm90ZSBub3RoaW5nIHdpdGhvdXQgYSB3b3JkLlxuICovXG5jb25zdCBzbmFwc2hvdExpbmtJZGVudGl0eUtleVByb3ZpZGVycyA9IG5ldyBXZWFrTWFwPEJhY2tsaW5rc1NuYXBzaG90PHVua25vd24+LCAobGluazogUmVmZXJlbmNlKSA9PiBzdHJpbmc+KCk7XG5cbi8qKlxuICogQSBzdHlsZSBvZiB0aGUgbGluayBwYXRoLlxuICovXG5leHBvcnQgZW51bSBMaW5rUGF0aFN0eWxlIHtcbiAgLyoqXG4gICAqIFVzZSB0aGUgYWJzb2x1dGUgcGF0aCBpbiB0aGUgdmF1bHQuXG4gICAqXG4gICAqIEBleGFtcGxlIGBbW3BhdGgvZnJvbS90aGUvdmF1bHQvcm9vdC90YXJnZXRdXWBcbiAgICovXG4gIEFic29sdXRlUGF0aEluVmF1bHQgPSAnQWJzb2x1dGVQYXRoSW5WYXVsdCcsXG5cbiAgLyoqXG4gICAqIFVzZSB0aGUgZGVmYXVsdCBsaW5rIHBhdGggc3R5bGUgZGVmaW5lZCBpbiBPYnNpZGlhbiBzZXR0aW5ncy5cbiAgICovXG4gIE9ic2lkaWFuU2V0dGluZ3NEZWZhdWx0ID0gJ09ic2lkaWFuU2V0dGluZ3NEZWZhdWx0JyxcblxuICAvKipcbiAgICogVXNlIHRoZSByZWxhdGl2ZSBwYXRoIHRvIHRoZSBzb3VyY2UuXG4gICAqXG4gICAqIEBleGFtcGxlIGBbWy4uLy4uL3JlbGF0aXZlL3BhdGgvdG8vdGFyZ2V0XV1gXG4gICAqL1xuICBSZWxhdGl2ZVBhdGhUb1RoZVNvdXJjZSA9ICdSZWxhdGl2ZVBhdGhUb1RoZVNvdXJjZScsXG5cbiAgLyoqXG4gICAqIFVzZSB0aGUgc2hvcnRlc3QgcGF0aCB3aGVuIHBvc3NpYmxlLlxuICAgKlxuICAgKiBAZXhhbXBsZSBgW1tzaG9ydGVzdC1wYXRoLXRvLXRhcmdldF1dYFxuICAgKi9cbiAgU2hvcnRlc3RQYXRoV2hlblBvc3NpYmxlID0gJ1Nob3J0ZXN0UGF0aFdoZW5Qb3NzaWJsZSdcbn1cblxuLyoqXG4gKiBBIHN0eWxlIG9mIHRoZSBsaW5rLlxuICovXG5leHBvcnQgZW51bSBMaW5rU3R5bGUge1xuICAvKipcbiAgICogRm9yY2UgdGhlIGxpbmsgdG8gYmUgaW4gbWFya2Rvd24gZm9ybWF0LlxuICAgKlxuICAgKiBAZXhhbXBsZSBgW2FsaWFzXShwYXRoL3RvL3RhcmdldC5tZClgXG4gICAqL1xuICBNYXJrZG93biA9ICdNYXJrZG93bicsXG5cbiAgLyoqXG4gICAqIFVzZSB0aGUgZGVmYXVsdCBsaW5rIHN0eWxlIGRlZmluZWQgaW4gT2JzaWRpYW4gc2V0dGluZ3MuXG4gICAqL1xuICBPYnNpZGlhblNldHRpbmdzRGVmYXVsdCA9ICdPYnNpZGlhblNldHRpbmdzRGVmYXVsdCcsXG5cbiAgLyoqXG4gICAqIFByZXNlcnZlIHRoZSBleGlzdGluZyBsaW5rIHN0eWxlLlxuICAgKi9cbiAgUHJlc2VydmVFeGlzdGluZyA9ICdQcmVzZXJ2ZUV4aXN0aW5nJyxcblxuICAvKipcbiAgICogRm9yY2UgdGhlIGxpbmsgdG8gYmUgaW4gd2lraWxpbmsgZm9ybWF0LlxuICAgKlxuICAgKiBAZXhhbXBsZSBgW1twYXRoL3RvL3RhcmdldF1dYFxuICAgKiBAZXhhbXBsZSBgW1twYXRoL3RvL3RhcmdldHxhbGlhc11dYFxuICAgKi9cbiAgV2lraWxpbmsgPSAnV2lraWxpbmsnXG59XG5cbmVudW0gRmluYWxMaW5rUGF0aFN0eWxlIHtcbiAgQWJzb2x1dGVQYXRoSW5WYXVsdCA9ICdBYnNvbHV0ZVBhdGhJblZhdWx0JyxcbiAgUmVsYXRpdmVQYXRoVG9UaGVTb3VyY2UgPSAnUmVsYXRpdmVQYXRoVG9UaGVOb3RlJyxcbiAgU2hvcnRlc3RQYXRoV2hlblBvc3NpYmxlID0gJ1Nob3J0ZXN0UGF0aFdoZW5Qb3NzaWJsZSdcbn1cblxuLyoqXG4gKiBQYXJhbXMgcGFzc2VkIHRvIHRoZSBsaW5rIGNvbnZlcnRlciBvZiB7QGxpbmsgZWRpdEJhY2tsaW5rc1NuYXBzaG90fS5cbiAqXG4gKiBAdHlwZVBhcmFtIFRQYXlsb2FkIC0gVGhlIHBheWxvYWQgcmVjb3JkZWQgZm9yIGVhY2ggbGluayB3aGVuIHRoZSBzbmFwc2hvdCB3YXMgYnVpbHQuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQmFja2xpbmtDb252ZXJzaW9uUGFyYW1zPFRQYXlsb2FkPiB7XG4gIC8qKlxuICAgKiBUaGUgbGluayBiZWluZyBjb252ZXJ0ZWQuXG4gICAqL1xuICByZWFkb25seSBsaW5rOiBSZWZlcmVuY2U7XG5cbiAgLyoqXG4gICAqIFRoZSBwYXlsb2FkIGNhcHR1cmVkIGZvciB0aGUgbGluayB3aGVuIHRoZSBzbmFwc2hvdCB3YXMgYnVpbHQuXG4gICAqXG4gICAqIGB1bmRlZmluZWRgIHdoZW4gdGhlIGxpbmsgaXMgbm90IGluIHRoZSBzbmFwc2hvdCwgd2hpY2ggY2FuIG9ubHkgaGFwcGVuIGlmXG4gICAqIHtAbGluayBFZGl0QmFja2xpbmtzU25hcHNob3RQYXJhbXMuc2hvdWxkVmlzaXRVbm1hdGNoZWRMaW5rc30gaXMgYHRydWVgLlxuICAgKi9cbiAgcmVhZG9ubHkgcGF5bG9hZDogVFBheWxvYWQgfCB1bmRlZmluZWQ7XG5cbiAgLyoqXG4gICAqIFRoZSBwYXRoIG9mIHRoZSBub3RlIGhvbGRpbmcgdGhlIGxpbmsuXG4gICAqL1xuICByZWFkb25seSBzb3VyY2VQYXRoOiBzdHJpbmc7XG59XG5cbi8qKlxuICogVGhlIG1pbmltYWwgc2hhcGUge0BsaW5rIGJ1aWxkQmFja2xpbmtzU25hcHNob3R9IHJlYWRzIGEgc2V0IG9mIGJhY2tsaW5rcyBmcm9tLlxuICpcbiAqIEJvdGggYSBgQ3VzdG9tQXJyYXlEaWN0PFJlZmVyZW5jZT5gIOKAlCB3aGF0XG4gKiB7QGxpbmsgLi4vb2JzaWRpYW4vbWV0YWRhdGEtY2FjaGUhZ2V0QmFja2xpbmtzRm9yRmlsZVNhZmUgfCBnZXRCYWNrbGlua3NGb3JGaWxlU2FmZX0gcmV0dXJucyDigJQgYW5kIGEgcGxhaW5cbiAqIGBNYXA8c3RyaW5nLCBSZWZlcmVuY2VbXT5gIHNhdGlzZnkgaXQsIHNvIGEgY2FsbGVyIGNhbiBwYXNzIGVpdGhlciB3aXRob3V0IGNvbnZlcnRpbmcgZmlyc3QuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQmFja2xpbmtzTGlrZSB7XG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBsaW5rcyB0aGUgbm90ZSBhdCBga2V5YCBob2xkcywgb3IgYSBudWxsaXNoIHZhbHVlIHdoZW4gaXQgaG9sZHMgbm9uZS5cbiAgICpcbiAgICogQHBhcmFtIGtleSAtIFRoZSBwYXRoIG9mIHRoZSBiYWNrbGluay1ob2xkaW5nIG5vdGUuXG4gICAqIEByZXR1cm5zIFRoZSBsaW5rcywgb3IgYSBudWxsaXNoIHZhbHVlLlxuICAgKi9cbiAgZ2V0OiAoa2V5OiBzdHJpbmcpID0+IG51bGwgfCByZWFkb25seSBSZWZlcmVuY2VbXSB8IHVuZGVmaW5lZDtcblxuICAvKipcbiAgICogUmV0dXJucyB0aGUgcGF0aHMgb2YgdGhlIGJhY2tsaW5rLWhvbGRpbmcgbm90ZXMuXG4gICAqXG4gICAqIEByZXR1cm5zIFRoZSBwYXRocy5cbiAgICovXG4gIGtleXM6ICgpID0+IEl0ZXJhYmxlPHN0cmluZz47XG59XG5cbi8qKlxuICogQSBjYXB0dXJlZCBzbmFwc2hvdCBvZiBhIHNldCBvZiBiYWNrbGlua3M6IHRoZSBwYXRoIG9mIGVhY2ggYmFja2xpbmstaG9sZGluZyBub3RlLCBtYXBwZWQgdG8gdGhlIGlkZW50aXR5XG4gKiBrZXlzIG9mIHRoYXQgbm90ZSdzIG93biBsaW5rcyB0byB0aGUgdGFyZ2V0KHMpLCBlYWNoIG1hcHBlZCB0byB0aGUgcGF5bG9hZCByZWNvcmRlZCBmb3IgaXQuXG4gKlxuICogVGhlIHNuYXBzaG90IGV4aXN0cyBzbyB0aGF0IHRoZSBmZXRjaCBhbmQgdGhlIHJld3JpdGUgY2FuIGhhcHBlbiBhdCBkaWZmZXJlbnQgbW9tZW50cy4gQSByZW5hbWUgaW52YWxpZGF0ZXNcbiAqIHRoZSBtZXRhZGF0YSBjYWNoZSBmb3IgdGhlIG9sZCBwYXRoLCBzbyBhIGNhbGxlciB0aGF0IHJld3JpdGVzIGxpbmtzICoqYWZ0ZXIqKiByZW5hbWluZyBoYXMgdG8gY2FwdHVyZSB0aGVcbiAqIGJhY2tsaW5rcyAqKmJlZm9yZSoqIOKAlCB3aGljaCBpcyB3aHkge0BsaW5rIGVkaXRCYWNrbGlua3NTbmFwc2hvdH0gdGFrZXMgYSBzbmFwc2hvdCByYXRoZXIgdGhhbiBhIHBhdGguXG4gKlxuICogVGhlIHBheWxvYWQgaXMgd2hhdGV2ZXIgdGhlIGNhbGxlciBuZWVkcyB0byByZW1lbWJlciBwZXIgbGluay4gSXQgaXMgYHVuZGVmaW5lZGAgZm9yIGEgc2luZ2xlLXRhcmdldFxuICogcmV3cml0ZSAodGhlIHRhcmdldCBpcyBpbXBsaWVkKSwgYW5kIHRoZSBvbGQgdGFyZ2V0J3MgcGF0aCBmb3IgYSBtdWx0aS10YXJnZXQgb25lLCB3aGVyZSBvbmUgbm90ZSdzIGxpbmtzXG4gKiBtYXkgcG9pbnQgYXQgc2V2ZXJhbCBmaWxlcyB0aGF0IGFsbCBtb3ZlZCBhbmQgZWFjaCBsaW5rIGhhcyB0byBiZSByZXNvbHZlZCB0byBpdHMgb3duIG5ldyBwYXRoLlxuICpcbiAqIEB0eXBlUGFyYW0gVFBheWxvYWQgLSBUaGUgcGF5bG9hZCByZWNvcmRlZCBmb3IgZWFjaCBsaW5rLlxuICovXG5leHBvcnQgdHlwZSBCYWNrbGlua3NTbmFwc2hvdDxUUGF5bG9hZD4gPSBSZWFkb25seU1hcDxzdHJpbmcsIFJlYWRvbmx5TWFwPHN0cmluZywgVFBheWxvYWQ+PjtcblxuLyoqXG4gKiBQYXJhbXMgZm9yIHtAbGluayBidWlsZEJhY2tsaW5rc1NuYXBzaG90fS5cbiAqXG4gKiBAdHlwZVBhcmFtIFRQYXlsb2FkIC0gVGhlIHBheWxvYWQgcmVjb3JkZWQgZm9yIGVhY2ggbGluay5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBCdWlsZEJhY2tsaW5rc1NuYXBzaG90UGFyYW1zPFRQYXlsb2FkPiB7XG4gIC8qKlxuICAgKiBUaGUgYmFja2xpbmtzIHRvIHJlY29yZC5cbiAgICovXG4gIHJlYWRvbmx5IGJhY2tsaW5rczogQmFja2xpbmtzTGlrZTtcblxuICAvKipcbiAgICogQ29tcHV0ZXMgdGhlIGlkZW50aXR5IGtleSBvZiBhIGxpbmsuXG4gICAqXG4gICAqIFRoZSBzbmFwc2hvdCByZW1lbWJlcnMgaXQsIHNvIHtAbGluayBlZGl0QmFja2xpbmtzU25hcHNob3R9IGxvb2tzIHRoZSBsaW5rcyB1cCB3aXRoIHRoZSBzYW1lIGZ1bmN0aW9uXG4gICAqIHdpdGhvdXQgYmVpbmcgdG9sZC4gV2hlbiB7QGxpbmsgQnVpbGRCYWNrbGlua3NTbmFwc2hvdFBhcmFtcy50YXJnZXR9IHdhcyBidWlsdCB3aXRoIGEgcHJvdmlkZXIsIG9taXR0aW5nXG4gICAqIHRoaXMgcmV1c2VzIHRoYXQgb25lLCBhbmQgcGFzc2luZyBhIGRpZmZlcmVudCBvbmUgdGhyb3dzOiBhIHNuYXBzaG90IGtleWVkIGJ5IHR3byBmdW5jdGlvbnMgbWF0Y2hlc1xuICAgKiBub3RoaW5nLlxuICAgKlxuICAgKiBAZGVmYXVsdCB0aGUgcHJvdmlkZXIgYHRhcmdldGAgd2FzIGJ1aWx0IHdpdGgsIGVsc2UgYEpTT04uc3RyaW5naWZ5YFxuICAgKi9cbiAgcmVhZG9ubHkgbGlua0lkZW50aXR5S2V5UHJvdmlkZXI/OiAobGluazogUmVmZXJlbmNlKSA9PiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFJld3JpdGVzIHRoZSBwYXRoIG9mIGEgYmFja2xpbmstaG9sZGluZyBub3RlIGFzIGl0IHdpbGwgYmUgKiphZnRlcioqIHRoZSBvcGVyYXRpb24uXG4gICAqXG4gICAqIEEgbm90ZSB0aGF0IGhvbGRzIGEgYmFja2xpbmsgY2FuIGl0c2VsZiBiZSByZW5hbWVkIG9yIG1vdmVkIGJ5IHRoZSBzYW1lIG9wZXJhdGlvbiDigJQgaW5jbHVkaW5nIHRoZVxuICAgKiByZW5hbWVkIG5vdGUncyBvd24gc2VsZi1saW5rcy4gUmVtYXBwaW5nIGhlcmUga2V5cyB0aGUgc25hcHNob3QgYnkgdGhlIHBhdGggdGhlIHJld3JpdGUgd2lsbCBhY3R1YWxseVxuICAgKiBvcGVuLlxuICAgKlxuICAgKiBAZGVmYXVsdCB0aGUgaWRlbnRpdHkgZnVuY3Rpb25cbiAgICovXG4gIHJlYWRvbmx5IHBhdGhSZW1hcHBlcj86IChiYWNrbGlua1BhdGg6IHN0cmluZykgPT4gc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBQcm9kdWNlcyB0aGUgcGF5bG9hZCB0byByZWNvcmQgZm9yIGEgbGluay4gU2VlIHtAbGluayBCYWNrbGlua3NTbmFwc2hvdH0gZm9yIHdoYXQgYSBwYXlsb2FkIGlzIGZvci5cbiAgICpcbiAgICogQHBhcmFtIGxpbmsgLSBUaGUgbGluayBiZWluZyByZWNvcmRlZC5cbiAgICogQHJldHVybnMgVGhlIHBheWxvYWQuXG4gICAqL1xuICByZWFkb25seSBwYXlsb2FkUHJvdmlkZXI6IChsaW5rOiBSZWZlcmVuY2UpID0+IFRQYXlsb2FkO1xuXG4gIC8qKlxuICAgKiBBbiBleGlzdGluZyBzbmFwc2hvdCB0byBtZXJnZSBpbnRvLCBzbyBzZXZlcmFsIHNldHMgb2YgYmFja2xpbmtzIGNhbiBiZSBhY2N1bXVsYXRlZCBpbnRvIG9uZS5cbiAgICpcbiAgICogTWVyZ2luZyBpcyB3aGF0IG1ha2VzIGEgc2luZ2xlIHJld3JpdGUgcGFzcyBwZXIgbm90ZSBwb3NzaWJsZSB3aGVuIGEgbm90ZSBsaW5rcyB0byBzZXZlcmFsIG1vdmVkXG4gICAqIHRhcmdldHM6IHdpdGhvdXQgaXQsIGNhbGxpbmcgdGhlIHJld3JpdGUgb25jZSBwZXIgdGFyZ2V0IHdvdWxkIG9wZW4g4oCUIGFuZCB3cml0ZSDigJQgdGhlIHNhbWUgbm90ZVxuICAgKiByZXBlYXRlZGx5LlxuICAgKlxuICAgKiBXaGVuIG9taXR0ZWQsIGEgbmV3IHNuYXBzaG90IGlzIGNyZWF0ZWQuXG4gICAqL1xuICByZWFkb25seSB0YXJnZXQ/OiBNdXRhYmxlQmFja2xpbmtzU25hcHNob3Q8VFBheWxvYWQ+O1xufVxuXG4vKipcbiAqIFBhcmFtcyBmb3Ige0BsaW5rIGNvbnZlcnRMaW5rfS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDb252ZXJ0TGlua1BhcmFtcyB7XG4gIC8qKlxuICAgKiBBbiBPYnNpZGlhbiBhcHAgaW5zdGFuY2UuXG4gICAqL1xuICByZWFkb25seSBhcHA6IEFwcDtcblxuICAvKipcbiAgICogV2hldGhlciB0byBhbGxvdyBhbiBlbXB0eSBhbGlhcyBmb3IgZW1iZWRzLlxuICAgKlxuICAgKiBBcHBsaWNhYmxlIG9ubHkgaWYgdGhlIHJlc3VsdCBsaW5rIHN0eWxlIGlzIHtAbGluayBMaW5rU3R5bGUuTWFya2Rvd259LlxuICAgKlxuICAgKiBJZiBgdHJ1ZWA6IGAhW10oZm9vLnBuZylgLlxuICAgKlxuICAgKiBJZiBgZmFsc2VgOiBgIVtmb29dKGZvby5wbmcpYC5cbiAgICpcbiAgICogQGRlZmF1bHQgYHRydWVgXG4gICAqL1xuICByZWFkb25seSBpc0VtcHR5RW1iZWRBbGlhc0FsbG93ZWQ/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBBIHJlZmVyZW5jZSBmb3IgdGhlIGxpbmsuXG4gICAqL1xuICByZWFkb25seSBsaW5rOiBSZWZlcmVuY2U7XG5cbiAgLyoqXG4gICAqIEEgc3R5bGUgb2YgdGhlIGxpbmsgcGF0aC5cbiAgICovXG4gIHJlYWRvbmx5IGxpbmtQYXRoU3R5bGU/OiBMaW5rUGF0aFN0eWxlO1xuXG4gIC8qKlxuICAgKiBBIHN0eWxlIG9mIHRoZSBsaW5rLlxuICAgKi9cbiAgcmVhZG9ubHkgbGlua1N0eWxlPzogTGlua1N0eWxlO1xuXG4gIC8qKlxuICAgKiBBIHNvdXJjZSBmaWxlIGNvbnRhaW5pbmcgdGhlIGxpbmsuXG4gICAqL1xuICByZWFkb25seSBuZXdTb3VyY2VQYXRoT3JGaWxlOiBQYXRoT3JGaWxlO1xuXG4gIC8qKlxuICAgKiBBbiBvbGQgcGF0aCBvZiB0aGUgbGluay5cbiAgICovXG4gIHJlYWRvbmx5IG9sZFNvdXJjZVBhdGhPckZpbGU/OiBQYXRoT3JGaWxlO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRvIGVzY2FwZSB0aGUgYWxpYXMuXG4gICAqXG4gICAqIEFwcGxpY2FibGUgb25seSBpZiB0aGUgcmVzdWx0IGxpbmsgc3R5bGUgaXMge0BsaW5rIExpbmtTdHlsZS5NYXJrZG93bn0uXG4gICAqXG4gICAqIElmIGB0cnVlYDogYFtcXCpcXCphbGlhc1xcKlxcKl0obGluay5tZClgLlxuICAgKlxuICAgKiBJZiBgZmFsc2VgOiBgWyoqYWxpYXMqKl0obGluay5tZClgLlxuICAgKlxuICAgKiBAZGVmYXVsdCBgZmFsc2VgXG4gICAqL1xuICByZWFkb25seSBzaG91bGRFc2NhcGVBbGlhcz86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdG8gaW5jbHVkZSB0aGUgYXR0YWNobWVudCBleHRlbnNpb24gaW4gdGhlIGVtYmVkIGFsaWFzLlxuICAgKlxuICAgKiBBcHBsaWNhYmxlIG9ubHkgaWYge0BsaW5rIGlzRW1wdHlFbWJlZEFsaWFzQWxsb3dlZH0gaXMgYGZhbHNlYC5cbiAgICpcbiAgICogSWYgYHRydWVgOiBgW2Zvby5wbmddKGZvby5wbmcpYC5cbiAgICpcbiAgICogSWYgYGZhbHNlYDogYFtmb29dKGZvby5wbmcpYC5cbiAgICpcbiAgICogQGRlZmF1bHQgYGZhbHNlYFxuICAgKi9cbiAgcmVhZG9ubHkgc2hvdWxkSW5jbHVkZUF0dGFjaG1lbnRFeHRlbnNpb25Ub0VtYmVkQWxpYXM/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRvIHVwZGF0ZSBmaWxlIG5hbWUgYWxpYXMuXG4gICAqXG4gICAqIEBkZWZhdWx0IGB0cnVlYFxuICAgKi9cbiAgcmVhZG9ubHkgc2hvdWxkVXBkYXRlRmlsZU5hbWVBbGlhcz86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIEluZGljYXRlcyBpZiB0aGUgbGluayBzaG91bGQgdXNlIGFuZ2xlIGJyYWNrZXRzLlxuICAgKlxuICAgKiBBcHBsaWNhYmxlIG9ubHkgaWYge0BsaW5rIGxpbmtTdHlsZX0gaXMge0BsaW5rIExpbmtTdHlsZS5NYXJrZG93bn0uXG4gICAqXG4gICAqIElmIGB0cnVlYDogYFthbGlhc10oPHBhdGggd2l0aCBzcGFjZXMubWQ+KWAuXG4gICAqXG4gICAqIElmIGBmYWxzZWA6IGBbYWxpYXNdKHBhdGglMjB3aXRoJTIwc3BhY2VzLm1kKWAuXG4gICAqXG4gICAqIEBkZWZhdWx0IGBmYWxzZWBcbiAgICovXG4gIHJlYWRvbmx5IHNob3VsZFVzZUFuZ2xlQnJhY2tldHM/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBJbmRpY2F0ZXMgaWYgdGhlIGxpbmsgc2hvdWxkIHVzZSBhIGxlYWRpbmcgZG90LlxuICAgKlxuICAgKiBBcHBsaWNhYmxlIG9ubHkgaWYge0BsaW5rIGxpbmtQYXRoU3R5bGV9IGlzIHtAbGluayBMaW5rUGF0aFN0eWxlLlJlbGF0aXZlUGF0aFRvVGhlU291cmNlfS5cbiAgICpcbiAgICogSWYgYHRydWVgOiBgW1suL3JlbGF0aXZlL3BhdGgvdG8vdGFyZ2V0XV1gXG4gICAqXG4gICAqIElmIGBmYWxzZWA6IGBbW3JlbGF0aXZlL3BhdGgvdG8vdGFyZ2V0XV1gXG4gICAqXG4gICAqIEBkZWZhdWx0IGBmYWxzZWBcbiAgICovXG4gIHJlYWRvbmx5IHNob3VsZFVzZUxlYWRpbmdEb3RGb3JSZWxhdGl2ZVBhdGhzPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogSW5kaWNhdGVzIGlmIHRoZSBsaW5rIHNob3VsZCB1c2UgYSBsZWFkaW5nIHNsYXNoLlxuICAgKlxuICAgKiBBcHBsaWNhYmxlIG9ubHkgaWYge0BsaW5rIGxpbmtQYXRoU3R5bGV9IGlzIHtAbGluayBMaW5rUGF0aFN0eWxlLkFic29sdXRlUGF0aEluVmF1bHR9LlxuICAgKlxuICAgKiBJZiBgdHJ1ZWA6IGBbWy9hYnNvbHV0ZS9wYXRoL3RvL3RhcmdldF1dYFxuICAgKlxuICAgKiBJZiBgZmFsc2VgOiBgW1thYnNvbHV0ZS9wYXRoL3RvL3RhcmdldF1dYFxuICAgKlxuICAgKiBAZGVmYXVsdCBgZmFsc2VgXG4gICAqL1xuICByZWFkb25seSBzaG91bGRVc2VMZWFkaW5nU2xhc2hGb3JBYnNvbHV0ZVBhdGhzPzogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBPcHRpb25zIGZvciB7QGxpbmsgZWRpdEJhY2tsaW5rc30uXG4gKi9cbmV4cG9ydCB0eXBlIEVkaXRCYWNrbGlua3NPcHRpb25zID0gUHJvY2Vzc09wdGlvbnM7XG5cbi8qKlxuICogUGFyYW1ldGVycyBmb3Ige0BsaW5rIGVkaXRCYWNrbGlua3N9LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEVkaXRCYWNrbGlua3NQYXJhbXMgZXh0ZW5kcyBFZGl0QmFja2xpbmtzT3B0aW9ucyB7XG4gIC8qKlxuICAgKiBUaGUgT2JzaWRpYW4gYXBwbGljYXRpb24gaW5zdGFuY2UuXG4gICAqL1xuICByZWFkb25seSBhcHA6IEFwcDtcblxuICAvKipcbiAgICogVGhlIGZ1bmN0aW9uIHRoYXQgY29udmVydHMgZWFjaCBsaW5rLlxuICAgKi9cbiAgcmVhZG9ubHkgbGlua0NvbnZlcnRlcjogKGxpbms6IFJlZmVyZW5jZSkgPT4gUHJvbWlzYWJsZTxNYXliZVJldHVybjxzdHJpbmc+PjtcblxuICAvKipcbiAgICogQW4gb3B0aW9uYWwgcmVwb3J0ZXIgaW52b2tlZCBvbmNlIHBlciBiYWNrbGluayBmaWxlIGFmdGVyIGl0cyBsaW5rcyBhcmUgdXBkYXRlZCwgd2l0aCB0aGUgcnVubmluZ1xuICAgKiBjb3VudCBvZiBwcm9jZXNzZWQgZmlsZXMgYW5kIHRoZSB0b3RhbC4gV2hlbiBvbWl0dGVkLCBubyBwcm9ncmVzcyBpcyByZXBvcnRlZC5cbiAgICovXG4gIHJlYWRvbmx5IGxpbmtVcGRhdGVQcm9ncmVzc1JlcG9ydGVyPzogTGlua1VwZGF0ZVByb2dyZXNzUmVwb3J0ZXI7XG5cbiAgLyoqXG4gICAqIFRoZSBwYXRoIG9yIGZpbGUgdG8gZWRpdCB0aGUgYmFja2xpbmtzIGZvci5cbiAgICovXG4gIHJlYWRvbmx5IHBhdGhPckZpbGU6IFBhdGhPckZpbGU7XG59XG5cbi8qKlxuICogT3B0aW9ucyBmb3Ige0BsaW5rIGVkaXRCYWNrbGlua3NTbmFwc2hvdH0uXG4gKi9cbmV4cG9ydCB0eXBlIEVkaXRCYWNrbGlua3NTbmFwc2hvdE9wdGlvbnMgPSBQcm9jZXNzT3B0aW9ucztcblxuLyoqXG4gKiBQYXJhbWV0ZXJzIGZvciB7QGxpbmsgZWRpdEJhY2tsaW5rc1NuYXBzaG90fS5cbiAqXG4gKiBAdHlwZVBhcmFtIFRQYXlsb2FkIC0gVGhlIHBheWxvYWQgcmVjb3JkZWQgZm9yIGVhY2ggbGluayB3aGVuIHRoZSBzbmFwc2hvdCB3YXMgYnVpbHQuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRWRpdEJhY2tsaW5rc1NuYXBzaG90UGFyYW1zPFRQYXlsb2FkPiBleHRlbmRzIEVkaXRCYWNrbGlua3NTbmFwc2hvdE9wdGlvbnMge1xuICAvKipcbiAgICogVGhlIE9ic2lkaWFuIGFwcGxpY2F0aW9uIGluc3RhbmNlLlxuICAgKi9cbiAgcmVhZG9ubHkgYXBwOiBBcHA7XG5cbiAgLyoqXG4gICAqIFRoZSBmdW5jdGlvbiB0aGF0IGNvbnZlcnRzIGVhY2ggbGluay5cbiAgICovXG4gIHJlYWRvbmx5IGxpbmtDb252ZXJ0ZXI6IChwYXJhbXM6IEJhY2tsaW5rQ29udmVyc2lvblBhcmFtczxUUGF5bG9hZD4pID0+IFByb21pc2FibGU8TWF5YmVSZXR1cm48c3RyaW5nPj47XG5cbiAgLyoqXG4gICAqIENvbXB1dGVzIHRoZSBpZGVudGl0eSBrZXkgb2YgYSBsaW5rLlxuICAgKlxuICAgKiBMZWF2ZSBpdCBvdXQgZm9yIGEgc25hcHNob3QgbWFkZSBieSB7QGxpbmsgYnVpbGRCYWNrbGlua3NTbmFwc2hvdH06IHRoZSBzbmFwc2hvdCBjYXJyaWVzIHRoZSBwcm92aWRlciBpdCB3YXNcbiAgICogYnVpbHQgd2l0aCwgYW5kIHRoYXQgb25lIGlzIHVzZWQuIFBhc3NpbmcgYSBkaWZmZXJlbnQgb25lIHRocm93cywgYmVjYXVzZSB0aGUgc25hcHNob3QgaXMga2V5ZWQgYnkgdGhlXG4gICAqIG90aGVyIGFuZCBub3QgYSBzaW5nbGUgbGluayB3b3VsZCBtYXRjaCDigJQgdGhlIGVkaXQgd291bGQgY29tcGxldGUgYW5kIHJld3JpdGUgbm90aGluZy4gSXQgaXMgbmVlZGVkIG9ubHlcbiAgICogZm9yIGEgc25hcHNob3QgYXNzZW1ibGVkIGJ5IGhhbmQuXG4gICAqXG4gICAqIEBkZWZhdWx0IHRoZSBwcm92aWRlciB0aGUgc25hcHNob3Qgd2FzIGJ1aWx0IHdpdGgsIGVsc2UgYEpTT04uc3RyaW5naWZ5YFxuICAgKi9cbiAgcmVhZG9ubHkgbGlua0lkZW50aXR5S2V5UHJvdmlkZXI/OiAobGluazogUmVmZXJlbmNlKSA9PiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEFuIG9wdGlvbmFsIHJlcG9ydGVyIGludm9rZWQgb25jZSBwZXIgYmFja2xpbmsgZmlsZSBhZnRlciBpdHMgbGlua3MgYXJlIHVwZGF0ZWQsIHdpdGggdGhlIHJ1bm5pbmdcbiAgICogY291bnQgb2YgcHJvY2Vzc2VkIGZpbGVzIGFuZCB0aGUgdG90YWwuIFdoZW4gb21pdHRlZCwgbm8gcHJvZ3Jlc3MgaXMgcmVwb3J0ZWQuXG4gICAqL1xuICByZWFkb25seSBsaW5rVXBkYXRlUHJvZ3Jlc3NSZXBvcnRlcj86IExpbmtVcGRhdGVQcm9ncmVzc1JlcG9ydGVyO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRoZSBjb252ZXJ0ZXIgaXMgYWxzbyBzaG93biBsaW5rcyB0aGF0IGFyZSAqKm5vdCoqIGluIHRoZSBzbmFwc2hvdCwgd2l0aCBhbiBgdW5kZWZpbmVkYFxuICAgKiB7QGxpbmsgQmFja2xpbmtDb252ZXJzaW9uUGFyYW1zLnBheWxvYWR9LlxuICAgKlxuICAgKiBUaGUgZGVmYXVsdCBmaWx0ZXJzIHRoZW0gb3V0LCB3aGljaCBpcyB3aGF0IGEgcGxhaW4gcmVuYW1lIHdhbnRzOiBhIGxpbmsgYWJzZW50IGZyb20gdGhlIHNuYXBzaG90IHdhc1xuICAgKiBlaXRoZXIgbmV2ZXIgdGhlIGNhbGxlcidzIHRvIHJld3JpdGUsIG9yIGhhcyBhbHJlYWR5IGJlZW4gcmV3cml0dGVuIGJ5IHNvbWVvbmUgZWxzZS4gU2V0IHRoaXMgdG8gYHRydWVgXG4gICAqIG9ubHkgd2hlbiB0aGUgY2FsbGVyIGhhcyBpdHMgb3duIHJlYXNvbiB0byBsb29rIGF0IHRoZW0g4oCUIGEgd2lkZW5lZCBtYXRjaCBvZiBpdHMgb3duLCBvciBsb2dnaW5nIGEgc2tpcFxuICAgKiB0aGF0IHdvdWxkIG90aGVyd2lzZSBiZSBzaWxlbnQuXG4gICAqXG4gICAqIEBkZWZhdWx0IGBmYWxzZWBcbiAgICovXG4gIHJlYWRvbmx5IHNob3VsZFZpc2l0VW5tYXRjaGVkTGlua3M/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBUaGUgY2FwdHVyZWQgYmFja2xpbmtzIHRvIGVkaXQuXG4gICAqL1xuICByZWFkb25seSBzbmFwc2hvdDogQmFja2xpbmtzU25hcHNob3Q8VFBheWxvYWQ+O1xufVxuXG4vKipcbiAqIFBhcmFtZXRlcnMgZm9yIHtAbGluayBlZGl0TGlua3NJbkNvbnRlbnR9LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEVkaXRMaW5rc0luQ29udGVudFBhcmFtcyB7XG4gIC8qKlxuICAgKiBUaGUgYWJvcnQgc2lnbmFsIHRvIGNvbnRyb2wgdGhlIGV4ZWN1dGlvbiBvZiB0aGUgZnVuY3Rpb24uXG4gICAqL1xuICByZWFkb25seSBhYm9ydFNpZ25hbD86IEFib3J0U2lnbmFsO1xuXG4gIC8qKlxuICAgKiBUaGUgT2JzaWRpYW4gYXBwbGljYXRpb24gaW5zdGFuY2UuXG4gICAqL1xuICByZWFkb25seSBhcHA6IEFwcDtcblxuICAvKipcbiAgICogVGhlIGNvbnRlbnQgdG8gZWRpdCB0aGUgbGlua3MgaW4uXG4gICAqL1xuICByZWFkb25seSBjb250ZW50OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBmdW5jdGlvbiB0aGF0IGNvbnZlcnRzIGVhY2ggbGluay5cbiAgICovXG4gIHJlYWRvbmx5IGxpbmtDb252ZXJ0ZXI6IChsaW5rOiBSZWZlcmVuY2UpID0+IFByb21pc2FibGU8TWF5YmVSZXR1cm48c3RyaW5nPj47XG5cbiAgLyoqXG4gICAqIEEgcmFuZ2Ugd2l0aGluIHtAbGluayBFZGl0TGlua3NJbkNvbnRlbnRQYXJhbXMuY29udGVudH0sIGluIGNoYXJhY3RlciBvZmZzZXRzLCByZXN0cmljdGluZyB0aGUgcGFzcyB0b1xuICAgKiB0aGUgbGlua3MgaW5zaWRlIGl0LiBXaGVuIG9taXR0ZWQsIGV2ZXJ5IGxpbmsgaXMgdmlzaXRlZC5cbiAgICpcbiAgICogQSBsaW5rIGlzIGVkaXRlZCBvbmx5IHdoZW4gaXQgaXMgKipmdWxseSBjb250YWluZWQqKiBpbiB0aGUgcmFuZ2U7IG9uZSB0aGF0IG1lcmVseSBvdmVybGFwcyBpdCBpcyBsZWZ0XG4gICAqIGFsb25lLCBiZWNhdXNlIHJld3JpdGluZyBwYXJ0IG9mIGEgbGluayBjb3JydXB0cyBpdC4gQm90aCBib3VuZHMgYXJlIGluY2x1c2l2ZSwgc28gYSByYW5nZSB3aG9zZVxuICAgKiBvZmZzZXRzIGNvaW5jaWRlIGV4YWN0bHkgd2l0aCBhIGxpbmsncyBkb2VzIGluY2x1ZGUgdGhhdCBsaW5rLlxuICAgKlxuICAgKiBBIHJlZmVyZW5jZSB0aGF0IGNhcnJpZXMgbm8gcG9zaXRpb24gd2l0aGluIHRoZSBjb250ZW50IOKAlCBhIGZyb250bWF0dGVyIGxpbmssIGEgbXVsdGktbGluayBmcm9udG1hdHRlclxuICAgKiB2YWx1ZSBlbnRyeSwgb3IgYW55IGNhbnZhcyByZWZlcmVuY2Ug4oCUIGlzIG5ldmVyIGluIHJhbmdlIGFuZCBpcyBza2lwcGVkIHdoZW5ldmVyIGEgcmFuZ2UgaXMgc3VwcGxpZWQuXG4gICAqXG4gICAqIEBkZWZhdWx0IGB1bmRlZmluZWRgXG4gICAqL1xuICByZWFkb25seSBvZmZzZXRSYW5nZT86IE9mZnNldFJhbmdlO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRvIGFsc28gZWRpdCBleHRlcm5hbCBsaW5rcyBwYXJzZWQgZnJvbSB0aGUgbm90ZSBib2R5LiBXaGVuIGB0cnVlYCwgdGhlIGNvbnZlcnRlciBhbHNvXG4gICAqIHJlY2VpdmVzIHJlZmVyZW5jZXMgZm9yIGV4dGVybmFsIGxpbmtzLlxuICAgKlxuICAgKiBAZGVmYXVsdCBgZmFsc2VgXG4gICAqL1xuICByZWFkb25seSBzaG91bGRFZGl0RXh0ZXJuYWxMaW5rcz86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdG8gYWxzbyBlZGl0IGV4dGVybmFsIGxpbmtzIHBhcnNlZCBmcm9tIGZyb250bWF0dGVyIHZhbHVlcy4gV2hlbiBgdHJ1ZWAsIHRoZSBjb252ZXJ0ZXIgYWxzb1xuICAgKiByZWNlaXZlcyByZWZlcmVuY2VzIGZvciBmcm9udG1hdHRlciBleHRlcm5hbCBsaW5rcy5cbiAgICpcbiAgICogQGRlZmF1bHQgYGZhbHNlYFxuICAgKi9cbiAgcmVhZG9ubHkgc2hvdWxkRWRpdEZyb250bWF0dGVyRXh0ZXJuYWxMaW5rcz86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdG8gYWxzbyBlZGl0IGV4dGVybmFsIGxpbmtzIHBhcnNlZCBmcm9tIG11bHRpLWxpbmsgKG11bHRpLXZhbHVlKSBmcm9udG1hdHRlciB2YWx1ZXMuIFdoZW5cbiAgICogYHRydWVgLCB0aGUgY29udmVydGVyIGFsc28gcmVjZWl2ZXMgcmVmZXJlbmNlcyBmb3IgZWFjaCBleHRlcm5hbCBsaW5rIHdpdGhpbiBhIG11bHRpLWxpbmsgZnJvbnRtYXR0ZXJcbiAgICogdmFsdWUgKGVhY2ggbG9jYXRlZCBieSBpdHMgb2Zmc2V0cywgc28gb25seSB0aGF0IGxpbmsgaXMgc3BsaWNlZCBiYWNrIGluIHBsYWNlKS5cbiAgICpcbiAgICogQGRlZmF1bHQgYGZhbHNlYFxuICAgKi9cbiAgcmVhZG9ubHkgc2hvdWxkRWRpdE11bHRpVmFsdWVGcm9udG1hdHRlckV4dGVybmFsTGlua3M/OiBib29sZWFuO1xufVxuXG4vKipcbiAqIE9wdGlvbnMgZm9yIHtAbGluayBlZGl0TGlua3N9LlxuICovXG5leHBvcnQgdHlwZSBFZGl0TGlua3NPcHRpb25zID0gUHJvY2Vzc09wdGlvbnM7XG5cbi8qKlxuICogUGFyYW1ldGVycyBmb3Ige0BsaW5rIGVkaXRMaW5rc30uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRWRpdExpbmtzUGFyYW1zIGV4dGVuZHMgRWRpdExpbmtzT3B0aW9ucyB7XG4gIC8qKlxuICAgKiBUaGUgT2JzaWRpYW4gYXBwbGljYXRpb24gaW5zdGFuY2UuXG4gICAqL1xuICByZWFkb25seSBhcHA6IEFwcDtcblxuICAvKipcbiAgICogVGhlIGZ1bmN0aW9uIHRoYXQgY29udmVydHMgZWFjaCBsaW5rLlxuICAgKi9cbiAgcmVhZG9ubHkgbGlua0NvbnZlcnRlcjogKGxpbms6IFJlZmVyZW5jZSkgPT4gUHJvbWlzYWJsZTxNYXliZVJldHVybjxzdHJpbmc+PjtcblxuICAvKipcbiAgICogQSByYW5nZSB3aXRoaW4gdGhlIGZpbGUncyBjb250ZW50LCBpbiBjaGFyYWN0ZXIgb2Zmc2V0cywgcmVzdHJpY3RpbmcgdGhlIHBhc3MgdG8gdGhlIGxpbmtzIGluc2lkZSBpdC5cbiAgICogV2hlbiBvbWl0dGVkLCBldmVyeSBsaW5rIGlzIHZpc2l0ZWQuXG4gICAqXG4gICAqIEEgbGluayBpcyBlZGl0ZWQgb25seSB3aGVuIGl0IGlzICoqZnVsbHkgY29udGFpbmVkKiogaW4gdGhlIHJhbmdlOyBvbmUgdGhhdCBtZXJlbHkgb3ZlcmxhcHMgaXQgaXMgbGVmdFxuICAgKiBhbG9uZSwgYmVjYXVzZSByZXdyaXRpbmcgcGFydCBvZiBhIGxpbmsgY29ycnVwdHMgaXQuIEJvdGggYm91bmRzIGFyZSBpbmNsdXNpdmUsIHNvIGEgcmFuZ2Ugd2hvc2VcbiAgICogb2Zmc2V0cyBjb2luY2lkZSBleGFjdGx5IHdpdGggYSBsaW5rJ3MgZG9lcyBpbmNsdWRlIHRoYXQgbGluay5cbiAgICpcbiAgICogQSByZWZlcmVuY2UgdGhhdCBjYXJyaWVzIG5vIHBvc2l0aW9uIHdpdGhpbiB0aGUgZmlsZSdzIGNvbnRlbnQg4oCUIGEgZnJvbnRtYXR0ZXIgbGluaywgYSBtdWx0aS1saW5rXG4gICAqIGZyb250bWF0dGVyIHZhbHVlIGVudHJ5LCBvciBhbnkgY2FudmFzIHJlZmVyZW5jZSDigJQgaXMgbmV2ZXIgaW4gcmFuZ2UgYW5kIGlzIHNraXBwZWQgd2hlbmV2ZXIgYSByYW5nZSBpc1xuICAgKiBzdXBwbGllZC5cbiAgICpcbiAgICogVGhlIG9mZnNldHMgYXJlIGludG8gdGhlIGNvbnRlbnQgdGhpcyBmdW5jdGlvbiByZWFkcyBmcm9tIHRoZSB2YXVsdC4gQmVmb3JlIHJlYWRpbmcsIGl0IHNhdmVzIGFueVxuICAgKiB1bnNhdmVkIGVkaXRvciBidWZmZXIgZm9yIHRoZSBmaWxlLCBzbyBhIHJhbmdlIHRha2VuIGZyb20gYW4gb3BlbiBlZGl0b3IgdmlhIGBFZGl0b3IucG9zVG9PZmZzZXRgIGlzXG4gICAqIHZhbGlkLiBUaGUgY2FsbGVyIG93bnMgb25seSB0aGUgY2FzZSB3aGVyZSB0aGUgYnVmZmVyIGNoYW5nZXMgYmV0d2VlbiBjb21wdXRpbmcgdGhlIHJhbmdlIGFuZCB0aGlzXG4gICAqIGNhbGwuXG4gICAqXG4gICAqIEBkZWZhdWx0IGB1bmRlZmluZWRgXG4gICAqL1xuICByZWFkb25seSBvZmZzZXRSYW5nZT86IE9mZnNldFJhbmdlO1xuXG4gIC8qKlxuICAgKiBUaGUgcGF0aCBvciBmaWxlIHRvIGVkaXQgdGhlIGxpbmtzIGZvci5cbiAgICovXG4gIHJlYWRvbmx5IHBhdGhPckZpbGU6IFBhdGhPckZpbGU7XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdG8gYWxzbyBlZGl0IGV4dGVybmFsIGxpbmtzIHBhcnNlZCBmcm9tIHRoZSBub3RlIGJvZHkuIFdoZW4gYHRydWVgLCB0aGUgY29udmVydGVyIGFsc29cbiAgICogcmVjZWl2ZXMgcmVmZXJlbmNlcyBmb3IgZXh0ZXJuYWwgbGlua3MuXG4gICAqXG4gICAqIEBkZWZhdWx0IGBmYWxzZWBcbiAgICovXG4gIHJlYWRvbmx5IHNob3VsZEVkaXRFeHRlcm5hbExpbmtzPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogV2hldGhlciB0byBhbHNvIGVkaXQgZXh0ZXJuYWwgbGlua3MgcGFyc2VkIGZyb20gZnJvbnRtYXR0ZXIgdmFsdWVzLiBXaGVuIGB0cnVlYCwgdGhlIGNvbnZlcnRlciBhbHNvXG4gICAqIHJlY2VpdmVzIHJlZmVyZW5jZXMgZm9yIGZyb250bWF0dGVyIGV4dGVybmFsIGxpbmtzLlxuICAgKlxuICAgKiBAZGVmYXVsdCBgZmFsc2VgXG4gICAqL1xuICByZWFkb25seSBzaG91bGRFZGl0RnJvbnRtYXR0ZXJFeHRlcm5hbExpbmtzPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogV2hldGhlciB0byBhbHNvIGVkaXQgZXh0ZXJuYWwgbGlua3MgcGFyc2VkIGZyb20gbXVsdGktbGluayAobXVsdGktdmFsdWUpIGZyb250bWF0dGVyIHZhbHVlcy4gV2hlblxuICAgKiBgdHJ1ZWAsIHRoZSBjb252ZXJ0ZXIgYWxzbyByZWNlaXZlcyByZWZlcmVuY2VzIGZvciBlYWNoIGV4dGVybmFsIGxpbmsgd2l0aGluIGEgbXVsdGktbGluayBmcm9udG1hdHRlclxuICAgKiB2YWx1ZSAoZWFjaCBsb2NhdGVkIGJ5IGl0cyBvZmZzZXRzLCBzbyBvbmx5IHRoYXQgbGluayBpcyBzcGxpY2VkIGJhY2sgaW4gcGxhY2UpLlxuICAgKlxuICAgKiBAZGVmYXVsdCBgZmFsc2VgXG4gICAqL1xuICByZWFkb25seSBzaG91bGRFZGl0TXVsdGlWYWx1ZUZyb250bWF0dGVyRXh0ZXJuYWxMaW5rcz86IGJvb2xlYW47XG59XG5cbi8qKlxuICogUGFyYW1ldGVycyBmb3Ige0BsaW5rIGV4dHJhY3RMaW5rRmlsZX0uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRXh0cmFjdExpbmtGaWxlUGFyYW1zIHtcbiAgLyoqXG4gICAqIFRoZSBPYnNpZGlhbiBhcHBsaWNhdGlvbiBpbnN0YW5jZS5cbiAgICovXG4gIHJlYWRvbmx5IGFwcDogQXBwO1xuXG4gIC8qKlxuICAgKiBUaGUgcmVmZXJlbmNlIGNhY2hlIGZvciB0aGUgbGluay5cbiAgICovXG4gIHJlYWRvbmx5IGxpbms6IFJlZmVyZW5jZTtcblxuICAvKipcbiAgICogV2hldGhlciB0byBhbGxvdyBub24tZXhpc3RpbmcgZmlsZXMuXG4gICAqXG4gICAqIEBkZWZhdWx0IGBmYWxzZWBcbiAgICovXG4gIHJlYWRvbmx5IHNob3VsZEFsbG93Tm9uRXhpc3RpbmdGaWxlPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogVGhlIHNvdXJjZSBwYXRoIG9yIGZpbGUuXG4gICAqL1xuICByZWFkb25seSBzb3VyY2VQYXRoT3JGaWxlOiBQYXRoT3JGaWxlO1xufVxuXG4vKipcbiAqIFBhcmFtcyBmb3Ige0BsaW5rIGdlbmVyYXRlTWFya2Rvd25MaW5rfS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBHZW5lcmF0ZU1hcmtkb3duTGlua1BhcmFtcyB7XG4gIC8qKlxuICAgKiBBbiBhbGlhcyBmb3IgdGhlIGxpbmsuXG4gICAqXG4gICAqIEBleGFtcGxlIGBbW2FsaWFzfGxpbmtdXWBcbiAgICogQGV4YW1wbGUgYFthbGlhc10obGluay5tZClgXG4gICAqL1xuICByZWFkb25seSBhbGlhcz86IHN0cmluZztcblxuICAvKipcbiAgICogQW4gT2JzaWRpYW4gYXBwIGluc3RhbmNlLlxuICAgKi9cbiAgcmVhZG9ubHkgYXBwOiBBcHA7XG5cbiAgLyoqXG4gICAqIEluZGljYXRlcyBpZiB0aGUgbGluayBzaG91bGQgYmUgZW1iZWRkZWQuIElmIG5vdCBwcm92aWRlZCwgaXQgd2lsbCBiZSBpbmZlcnJlZCBiYXNlZCBvbiB0aGUgZmlsZSB0eXBlLlxuICAgKlxuICAgKiBJZiBgdHJ1ZWA6IGAhW1t0YXJnZXRdXWAuXG4gICAqXG4gICAqIElmIGBmYWxzZWA6IGBbW3RhcmdldF1dYC5cbiAgICovXG4gIHJlYWRvbmx5IGlzRW1iZWQ/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRvIGFsbG93IGFuIGVtcHR5IGFsaWFzIGZvciBlbWJlZHMuXG4gICAqXG4gICAqIEFwcGxpY2FibGUgb25seSBpZiB0aGUgcmVzdWx0IGxpbmsgc3R5bGUgaXMge0BsaW5rIExpbmtTdHlsZS5NYXJrZG93bn0uXG4gICAqXG4gICAqIElmIGB0cnVlYDogYCFbXShmb28ucG5nKWAuXG4gICAqXG4gICAqIElmIGBmYWxzZWA6IGAhW2Zvb10oZm9vLnBuZylgLlxuICAgKlxuICAgKiBAZGVmYXVsdCBgdHJ1ZWBcbiAgICovXG4gIHJlYWRvbmx5IGlzRW1wdHlFbWJlZEFsaWFzQWxsb3dlZD86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdG8gYWxsb3cgbm9uLWV4aXN0aW5nIGZpbGVzLlxuICAgKlxuICAgKiBJZiBgZmFsc2VgIGFuZCB7QGxpbmsgdGFyZ2V0UGF0aE9yRmlsZX0gaXMgYSBub24tZXhpc3RpbmcgZmlsZSwgYW4gZXJyb3Igd2lsbCBiZSB0aHJvd24uXG4gICAqXG4gICAqIEBkZWZhdWx0IGBmYWxzZWBcbiAgICovXG4gIHJlYWRvbmx5IGlzTm9uRXhpc3RpbmdGaWxlQWxsb3dlZD86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdG8gYWxsb3cgYSBzaW5nbGUgc3VicGF0aC5cbiAgICpcbiAgICogQXBwbGljYWJsZSBvbmx5IGlmIHtAbGluayB0YXJnZXRQYXRoT3JGaWxlfSBhbmQge0BsaW5rIHNvdXJjZVBhdGhPckZpbGV9IGFyZSB0aGUgc2FtZSBmaWxlLlxuICAgKlxuICAgKiBJZiBgdHJ1ZWA6IGBbWyNzdWJwYXRoXV1gLlxuICAgKlxuICAgKiBJZiBgZmFsc2VgOiBgW1tzb3VyY2Ujc3VicGF0aF1dYFxuICAgKlxuICAgKiBAZGVmYXVsdCBgdHJ1ZWBcbiAgICovXG4gIHJlYWRvbmx5IGlzU2luZ2xlU3VicGF0aEFsbG93ZWQ/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBBIHN0eWxlIG9mIHRoZSBsaW5rIHBhdGguXG4gICAqL1xuICByZWFkb25seSBsaW5rUGF0aFN0eWxlPzogTGlua1BhdGhTdHlsZTtcblxuICAvKipcbiAgICogQSBzdHlsZSBvZiB0aGUgbGluay5cbiAgICovXG4gIHJlYWRvbmx5IGxpbmtTdHlsZT86IExpbmtTdHlsZTtcblxuICAvKipcbiAgICogQW4gb3JpZ2luYWwgbGluayB0ZXh0LlxuICAgKlxuICAgKiBJZiBwcm92aWRlZCwgaXQgd2lsbCBiZSB1c2VkIHRvIGluZmVyIHRoZSB2YWx1ZXMgb2ZcbiAgICpcbiAgICogLSB7QGxpbmsgaGFzRW1iZWRTeW50YXh9XG4gICAqIC0ge0BsaW5rIGxpbmtTdHlsZX1cbiAgICogLSB7QGxpbmsgc2hvdWxkVXNlQW5nbGVCcmFja2V0c31cbiAgICogLSB7QGxpbmsgc2hvdWxkVXNlTGVhZGluZ0RvdEZvclJlbGF0aXZlUGF0aHN9XG4gICAqIC0ge0BsaW5rIHNob3VsZFVzZUxlYWRpbmdTbGFzaEZvckFic29sdXRlUGF0aHN9XG4gICAqXG4gICAqIFRoZXNlIGluZmVycmVkIHZhbHVlcyB3aWxsIGJlIG92ZXJyaWRkZW4gYnkgY29ycmVzcG9uZGluZyBzZXR0aW5ncyBpZiBzcGVjaWZpZWQuXG4gICAqL1xuICByZWFkb25seSBvcmlnaW5hbExpbms/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdG8gZXNjYXBlIHRoZSBhbGlhcy5cbiAgICpcbiAgICogQXBwbGljYWJsZSBvbmx5IGlmIHRoZSByZXN1bHQgbGluayBzdHlsZSBpcyB7QGxpbmsgTGlua1N0eWxlLk1hcmtkb3dufS5cbiAgICpcbiAgICogSWYgYHRydWVgOiBgW1xcKlxcKmFsaWFzXFwqXFwqXShsaW5rLm1kKWAuXG4gICAqXG4gICAqIElmIGBmYWxzZWA6IGBbKiphbGlhcyoqXShsaW5rLm1kKWAuXG4gICAqXG4gICAqIEBkZWZhdWx0IGBmYWxzZWBcbiAgICovXG4gIHJlYWRvbmx5IHNob3VsZEVzY2FwZUFsaWFzPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogV2hldGhlciB0byBpbmNsdWRlIHRoZSBhdHRhY2htZW50IGV4dGVuc2lvbiBpbiB0aGUgZW1iZWQgYWxpYXMuXG4gICAqXG4gICAqIEFwcGxpY2FibGUgb25seSBpZiB7QGxpbmsgaXNFbXB0eUVtYmVkQWxpYXNBbGxvd2VkfSBpcyBgZmFsc2VgLlxuICAgKlxuICAgKiBJZiBgdHJ1ZWA6IGBbZm9vLnBuZ10oZm9vLnBuZylgLlxuICAgKlxuICAgKiBJZiBgZmFsc2VgOiBgW2Zvb10oZm9vLnBuZylgLlxuICAgKlxuICAgKiBAZGVmYXVsdCBgZmFsc2VgXG4gICAqL1xuICByZWFkb25seSBzaG91bGRJbmNsdWRlQXR0YWNobWVudEV4dGVuc2lvblRvRW1iZWRBbGlhcz86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIEluZGljYXRlcyBpZiB0aGUgbGluayBzaG91bGQgdXNlIGFuZ2xlIGJyYWNrZXRzLlxuICAgKlxuICAgKiBBcHBsaWNhYmxlIG9ubHkgaWYge0BsaW5rIGxpbmtTdHlsZX0gaXMge0BsaW5rIExpbmtTdHlsZS5NYXJrZG93bn0uXG4gICAqXG4gICAqIElmIGB0cnVlYDogYFthbGlhc10oPHBhdGggd2l0aCBzcGFjZXMubWQ+KWAuXG4gICAqXG4gICAqIElmIGBmYWxzZWA6IGBbYWxpYXNdKHBhdGglMjB3aXRoJTIwc3BhY2VzLm1kKWAuXG4gICAqXG4gICAqIEBkZWZhdWx0IGBmYWxzZWBcbiAgICovXG4gIHJlYWRvbmx5IHNob3VsZFVzZUFuZ2xlQnJhY2tldHM/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBJbmRpY2F0ZXMgaWYgdGhlIGxpbmsgc2hvdWxkIHVzZSBhIGxlYWRpbmcgZG90LlxuICAgKlxuICAgKiBBcHBsaWNhYmxlIG9ubHkgaWYge0BsaW5rIGxpbmtQYXRoU3R5bGV9IGlzIHtAbGluayBMaW5rUGF0aFN0eWxlLlJlbGF0aXZlUGF0aFRvVGhlU291cmNlfS5cbiAgICpcbiAgICogSWYgYHRydWVgOiBgW1suL3JlbGF0aXZlL3BhdGgvdG8vdGFyZ2V0XV1gXG4gICAqXG4gICAqIElmIGBmYWxzZWA6IGBbW3JlbGF0aXZlL3BhdGgvdG8vdGFyZ2V0XV1gXG4gICAqXG4gICAqIEBkZWZhdWx0IGBmYWxzZWBcbiAgICovXG4gIHJlYWRvbmx5IHNob3VsZFVzZUxlYWRpbmdEb3RGb3JSZWxhdGl2ZVBhdGhzPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogSW5kaWNhdGVzIGlmIHRoZSBsaW5rIHNob3VsZCB1c2UgYSBsZWFkaW5nIHNsYXNoLlxuICAgKlxuICAgKiBBcHBsaWNhYmxlIG9ubHkgaWYge0BsaW5rIGxpbmtQYXRoU3R5bGV9IGlzIHtAbGluayBMaW5rUGF0aFN0eWxlLkFic29sdXRlUGF0aEluVmF1bHR9LlxuICAgKlxuICAgKiBJZiBgdHJ1ZWA6IGBbWy9hYnNvbHV0ZS9wYXRoL3RvL3RhcmdldF1dYFxuICAgKlxuICAgKiBJZiBgZmFsc2VgOiBgW1thYnNvbHV0ZS9wYXRoL3RvL3RhcmdldF1dYFxuICAgKlxuICAgKiBAZGVmYXVsdCBgZmFsc2VgXG4gICAqL1xuICByZWFkb25seSBzaG91bGRVc2VMZWFkaW5nU2xhc2hGb3JBYnNvbHV0ZVBhdGhzPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogQSBzb3VyY2UgcGF0aCBvZiB0aGUgbGluay5cbiAgICovXG4gIHJlYWRvbmx5IHNvdXJjZVBhdGhPckZpbGU6IFBhdGhPckZpbGU7XG5cbiAgLyoqXG4gICAqIEEgc3VicGF0aCBvZiB0aGUgbGluay5cbiAgICpcbiAgICogU2hvdWxkIGJlIGVtcHR5IG9yIHN0YXJ0IHdpdGggYCNgLlxuICAgKlxuICAgKiBAZXhhbXBsZSBgW1tsaW5rLXdpdGgtZW1wdHktc3VicGF0aF1dYFxuICAgKiBAZXhhbXBsZSBgW1tsaW5rLXdpdGgtc3VicGF0aCNzdWJwYXRoXV1gXG4gICAqIEBleGFtcGxlIGBbW2xpbmstd2l0aC1zdWJwYXRoI3N1YnBhdGgjbmVzdGVkLXN1YnBhdGhdXWBcbiAgICogQGRlZmF1bHQgYCcnYFxuICAgKi9cbiAgcmVhZG9ubHkgc3VicGF0aD86IHN0cmluZztcblxuICAvKipcbiAgICogQSB0YXJnZXQgcGF0aCBvciBmaWxlLlxuICAgKi9cbiAgcmVhZG9ubHkgdGFyZ2V0UGF0aE9yRmlsZTogUGF0aE9yRmlsZTtcbn1cblxuLyoqXG4gKiBQYXJhbXMgZm9yIHtAbGluayBnZW5lcmF0ZVJhd01hcmtkb3duTGlua30uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgR2VuZXJhdGVSYXdNYXJrZG93bkxpbmtQYXJhbXMge1xuICAvKipcbiAgICogQW4gYWxpYXMgb2YgdGhlIGxpbmsuIERlZmF1bHRzIHRvIGB1bmRlZmluZWRgLlxuICAgKi9cbiAgcmVhZG9ubHkgYWxpYXM/OiBzdHJpbmcgfCB1bmRlZmluZWQ7XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdGhlIGxpbmsgc2hvdWxkIGJlIGFuIGVtYmVkIGxpbmsuXG4gICAqXG4gICAqIEBkZWZhdWx0IGBmYWxzZWBcbiAgICovXG4gIHJlYWRvbmx5IGlzRW1iZWQ/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRoZSBsaW5rIHNob3VsZCBiZSBhIHdpa2lsaW5rLlxuICAgKi9cbiAgcmVhZG9ubHkgaXNXaWtpbGluazogYm9vbGVhbjtcblxuICAvKipcbiAgICogV2hldGhlciB0byBlc2NhcGUgdGhlIGFsaWFzLiBBcHBsaWNhYmxlIG9ubHkgaWYge0BsaW5rIGhhc1dpa2lsaW5rU3ludGF4fSBpcyBgZmFsc2VgLlxuICAgKlxuICAgKiBAZGVmYXVsdCBgZmFsc2VgXG4gICAqL1xuICByZWFkb25seSBzaG91bGRFc2NhcGVBbGlhcz86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdG8gdXNlIGFuZ2xlIGJyYWNrZXRzLiBBcHBsaWNhYmxlIG9ubHkgaWYge0BsaW5rIGhhc1dpa2lsaW5rU3ludGF4fSBpcyBgZmFsc2VgLlxuICAgKlxuICAgKiBAZGVmYXVsdCBgZmFsc2VgXG4gICAqL1xuICByZWFkb25seSBzaG91bGRVc2VBbmdsZUJyYWNrZXRzPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogQSB0aXRsZSBvZiB0aGUgbGluay5cbiAgICovXG4gIHJlYWRvbmx5IHRpdGxlPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBBbiBVUkwgb2YgdGhlIGxpbmsuXG4gICAqL1xuICByZWFkb25seSB1cmw6IHN0cmluZztcbn1cblxuLyoqXG4gKiBBIHtAbGluayBCYWNrbGlua3NTbmFwc2hvdH0gd2hpbGUgaXQgaXMgc3RpbGwgYmVpbmcgYWNjdW11bGF0ZWQgYnkge0BsaW5rIGJ1aWxkQmFja2xpbmtzU25hcHNob3R9LlxuICpcbiAqIEB0eXBlUGFyYW0gVFBheWxvYWQgLSBUaGUgcGF5bG9hZCByZWNvcmRlZCBmb3IgZWFjaCBsaW5rLlxuICovXG5leHBvcnQgdHlwZSBNdXRhYmxlQmFja2xpbmtzU25hcHNob3Q8VFBheWxvYWQ+ID0gTWFwPHN0cmluZywgTWFwPHN0cmluZywgVFBheWxvYWQ+PjtcblxuLyoqXG4gKiBQYXJhbXMgZm9yIHtAbGluayBzaG91bGRSZXNldEFsaWFzfS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTaG91bGRSZXNldEFsaWFzUGFyYW1zIHtcbiAgLyoqXG4gICAqIEFuIE9ic2lkaWFuIGFwcCBpbnN0YW5jZS5cbiAgICovXG4gIHJlYWRvbmx5IGFwcDogQXBwO1xuXG4gIC8qKlxuICAgKiBBIGRpc3BsYXkgdGV4dCBvZiB0aGUgbGluay5cbiAgICovXG4gIHJlYWRvbmx5IGRpc3BsYXlUZXh0OiBzdHJpbmcgfCB1bmRlZmluZWQ7XG5cbiAgLyoqXG4gICAqIEluZGljYXRlcyBpZiB0aGUgbGluayBpcyBhIHdpa2lsaW5rLlxuICAgKi9cbiAgcmVhZG9ubHkgaXNXaWtpbGluaz86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIEEgc291cmNlIHBhdGggb2YgdGhlIGxpbmsuXG4gICAqL1xuICByZWFkb25seSBuZXdTb3VyY2VQYXRoT3JGaWxlOiBQYXRoT3JGaWxlO1xuXG4gIC8qKlxuICAgKiBBbiBvbGQgc291cmNlIGZpbGUgY29udGFpbmluZyB0aGUgbGluay5cbiAgICovXG4gIHJlYWRvbmx5IG9sZFNvdXJjZVBhdGhPckZpbGU/OiBQYXRoT3JGaWxlO1xuXG4gIC8qKlxuICAgKiBBbiBvbGQgdGFyZ2V0IHBhdGggb2YgdGhlIGxpbmsuXG4gICAqL1xuICByZWFkb25seSBvbGRUYXJnZXRQYXRoOiBQYXRoT3JGaWxlO1xuXG4gIC8qKlxuICAgKiBBIHRhcmdldCBwYXRoIG9yIGZpbGUuXG4gICAqL1xuICByZWFkb25seSB0YXJnZXRQYXRoT3JGaWxlOiBQYXRoT3JGaWxlO1xufVxuXG4vKipcbiAqIFNwbGl0cyBhIGxpbmsgaW50byBpdHMgbGluayBwYXRoIGFuZCBzdWJwYXRoLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFNwbGl0U3VicGF0aFJlc3VsdCB7XG4gIC8qKlxuICAgKiBBIGxpbmsgcGF0aC5cbiAgICovXG4gIHJlYWRvbmx5IGxpbmtQYXRoOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEEgc3VicGF0aC5cbiAgICovXG4gIHJlYWRvbmx5IHN1YnBhdGg6IHN0cmluZztcbn1cblxuLyoqXG4gKiBQYXJhbXMgZm9yIHtAbGluayB1cGRhdGVGaWxlVXJsTGlua3NJbkNvbnRlbnR9LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFVwZGF0ZUZpbGVVcmxMaW5rc0luQ29udGVudFBhcmFtcyB7XG4gIC8qKlxuICAgKiBUaGUgYWJvcnQgc2lnbmFsIHRvIGNvbnRyb2wgdGhlIGV4ZWN1dGlvbiBvZiB0aGUgZnVuY3Rpb24uXG4gICAqL1xuICByZWFkb25seSBhYm9ydFNpZ25hbD86IEFib3J0U2lnbmFsO1xuXG4gIC8qKlxuICAgKiBBbiBPYnNpZGlhbiBhcHAgaW5zdGFuY2UuXG4gICAqL1xuICByZWFkb25seSBhcHA6IEFwcDtcblxuICAvKipcbiAgICogVGhlIGNvbnRlbnQgdG8gbm9ybWFsaXplIHRoZSBgZmlsZTovL2AgbGlua3MgaW4uXG4gICAqL1xuICByZWFkb25seSBjb250ZW50OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEEgcmFuZ2Ugd2l0aGluIHtAbGluayBVcGRhdGVGaWxlVXJsTGlua3NJbkNvbnRlbnRQYXJhbXMuY29udGVudH0sIGluIGNoYXJhY3RlciBvZmZzZXRzLCByZXN0cmljdGluZ1xuICAgKiB0aGUgcGFzcyB0byB0aGUgbGlua3MgaW5zaWRlIGl0LiBXaGVuIG9taXR0ZWQsIGV2ZXJ5IGxpbmsgaXMgdmlzaXRlZC5cbiAgICpcbiAgICogQSBsaW5rIGlzIG5vcm1hbGl6ZWQgb25seSB3aGVuIGl0IGlzICoqZnVsbHkgY29udGFpbmVkKiogaW4gdGhlIHJhbmdlOyBvbmUgdGhhdCBtZXJlbHkgb3ZlcmxhcHMgaXQgaXNcbiAgICogbGVmdCBhbG9uZSwgYmVjYXVzZSByZXdyaXRpbmcgcGFydCBvZiBhIGxpbmsgY29ycnVwdHMgaXQuIEJvdGggYm91bmRzIGFyZSBpbmNsdXNpdmUsIHNvIGEgcmFuZ2Ugd2hvc2VcbiAgICogb2Zmc2V0cyBjb2luY2lkZSBleGFjdGx5IHdpdGggYSBsaW5rJ3MgZG9lcyBpbmNsdWRlIHRoYXQgbGluay5cbiAgICpcbiAgICogQSByZWZlcmVuY2UgdGhhdCBjYXJyaWVzIG5vIHBvc2l0aW9uIHdpdGhpbiB0aGUgY29udGVudCDigJQgYSBmcm9udG1hdHRlciBsaW5rLCBhIG11bHRpLWxpbmsgZnJvbnRtYXR0ZXJcbiAgICogdmFsdWUgZW50cnksIG9yIGFueSBjYW52YXMgcmVmZXJlbmNlIOKAlCBpcyBuZXZlciBpbiByYW5nZSBhbmQgaXMgc2tpcHBlZCB3aGVuZXZlciBhIHJhbmdlIGlzIHN1cHBsaWVkLlxuICAgKlxuICAgKiBAZGVmYXVsdCBgdW5kZWZpbmVkYFxuICAgKi9cbiAgcmVhZG9ubHkgb2Zmc2V0UmFuZ2U/OiBPZmZzZXRSYW5nZTtcblxuICAvKipcbiAgICogV2hldGhlciB0byBlbWl0IHRoZSBub3JtYWxpemVkIGxpbmtzIHdpdGggYW5nbGUgYnJhY2tldHMgYW5kIHJhdyBzcGFjZXMgaW5zdGVhZCBvZiBgJTIwYC1lbmNvZGluZy5cbiAgICpcbiAgICogQGRlZmF1bHQgYGZhbHNlYFxuICAgKi9cbiAgcmVhZG9ubHkgc2hvdWxkVXNlQW5nbGVCcmFja2V0cz86IGJvb2xlYW47XG59XG5cbi8qKlxuICogUGFyYW1zIGZvciB7QGxpbmsgdXBkYXRlRmlsZVVybExpbmtzSW5GaWxlfS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBVcGRhdGVGaWxlVXJsTGlua3NJbkZpbGVQYXJhbXMgZXh0ZW5kcyBQcm9jZXNzT3B0aW9ucyB7XG4gIC8qKlxuICAgKiBBbiBPYnNpZGlhbiBhcHAgaW5zdGFuY2UuXG4gICAqL1xuICByZWFkb25seSBhcHA6IEFwcDtcblxuICAvKipcbiAgICogQSByYW5nZSB3aXRoaW4gdGhlIGZpbGUncyBjb250ZW50LCBpbiBjaGFyYWN0ZXIgb2Zmc2V0cywgcmVzdHJpY3RpbmcgdGhlIHBhc3MgdG8gdGhlIGxpbmtzIGluc2lkZSBpdC5cbiAgICogV2hlbiBvbWl0dGVkLCBldmVyeSBsaW5rIGlzIHZpc2l0ZWQuXG4gICAqXG4gICAqIEEgbGluayBpcyBub3JtYWxpemVkIG9ubHkgd2hlbiBpdCBpcyAqKmZ1bGx5IGNvbnRhaW5lZCoqIGluIHRoZSByYW5nZTsgb25lIHRoYXQgbWVyZWx5IG92ZXJsYXBzIGl0IGlzXG4gICAqIGxlZnQgYWxvbmUsIGJlY2F1c2UgcmV3cml0aW5nIHBhcnQgb2YgYSBsaW5rIGNvcnJ1cHRzIGl0LiBCb3RoIGJvdW5kcyBhcmUgaW5jbHVzaXZlLCBzbyBhIHJhbmdlIHdob3NlXG4gICAqIG9mZnNldHMgY29pbmNpZGUgZXhhY3RseSB3aXRoIGEgbGluaydzIGRvZXMgaW5jbHVkZSB0aGF0IGxpbmsuXG4gICAqXG4gICAqIEEgcmVmZXJlbmNlIHRoYXQgY2FycmllcyBubyBwb3NpdGlvbiB3aXRoaW4gdGhlIGZpbGUncyBjb250ZW50IOKAlCBhIGZyb250bWF0dGVyIGxpbmssIGEgbXVsdGktbGlua1xuICAgKiBmcm9udG1hdHRlciB2YWx1ZSBlbnRyeSwgb3IgYW55IGNhbnZhcyByZWZlcmVuY2Ug4oCUIGlzIG5ldmVyIGluIHJhbmdlIGFuZCBpcyBza2lwcGVkIHdoZW5ldmVyIGEgcmFuZ2UgaXNcbiAgICogc3VwcGxpZWQuXG4gICAqXG4gICAqIFRoZSBvZmZzZXRzIGFyZSBpbnRvIHRoZSBjb250ZW50IHRoaXMgZnVuY3Rpb24gcmVhZHMgZnJvbSB0aGUgdmF1bHQuIEJlZm9yZSByZWFkaW5nLCBpdCBzYXZlcyBhbnlcbiAgICogdW5zYXZlZCBlZGl0b3IgYnVmZmVyIGZvciB0aGUgZmlsZSwgc28gYSByYW5nZSB0YWtlbiBmcm9tIGFuIG9wZW4gZWRpdG9yIHZpYSBgRWRpdG9yLnBvc1RvT2Zmc2V0YCBpc1xuICAgKiB2YWxpZC4gVGhlIGNhbGxlciBvd25zIG9ubHkgdGhlIGNhc2Ugd2hlcmUgdGhlIGJ1ZmZlciBjaGFuZ2VzIGJldHdlZW4gY29tcHV0aW5nIHRoZSByYW5nZSBhbmQgdGhpc1xuICAgKiBjYWxsLlxuICAgKlxuICAgKiBAZGVmYXVsdCBgdW5kZWZpbmVkYFxuICAgKi9cbiAgcmVhZG9ubHkgb2Zmc2V0UmFuZ2U/OiBPZmZzZXRSYW5nZTtcblxuICAvKipcbiAgICogVGhlIHBhdGggb3IgZmlsZSB0byBub3JtYWxpemUgdGhlIGBmaWxlOi8vYCBsaW5rcyBpbi5cbiAgICovXG4gIHJlYWRvbmx5IHBhdGhPckZpbGU6IFBhdGhPckZpbGU7XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdG8gZW1pdCB0aGUgbm9ybWFsaXplZCBsaW5rcyB3aXRoIGFuZ2xlIGJyYWNrZXRzIGFuZCByYXcgc3BhY2VzIGluc3RlYWQgb2YgYCUyMGAtZW5jb2RpbmcuXG4gICAqXG4gICAqIEBkZWZhdWx0IGBmYWxzZWBcbiAgICovXG4gIHJlYWRvbmx5IHNob3VsZFVzZUFuZ2xlQnJhY2tldHM/OiBib29sZWFuO1xufVxuXG4vKipcbiAqIFBhcmFtcyBmb3Ige0BsaW5rIHVwZGF0ZUxpbmt9LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFVwZGF0ZUxpbmtQYXJhbXMge1xuICAvKipcbiAgICogQW4gT2JzaWRpYW4gYXBwIGluc3RhbmNlLlxuICAgKi9cbiAgcmVhZG9ubHkgYXBwOiBBcHA7XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdG8gYWxsb3cgYW4gZW1wdHkgYWxpYXMgZm9yIGVtYmVkcy5cbiAgICpcbiAgICogQXBwbGljYWJsZSBvbmx5IGlmIHRoZSByZXN1bHQgbGluayBzdHlsZSBpcyB7QGxpbmsgTGlua1N0eWxlLk1hcmtkb3dufS5cbiAgICpcbiAgICogSWYgYHRydWVgOiBgIVtdKGZvby5wbmcpYC5cbiAgICpcbiAgICogSWYgYGZhbHNlYDogYCFbZm9vXShmb28ucG5nKWAuXG4gICAqXG4gICAqIEBkZWZhdWx0IGB0cnVlYFxuICAgKi9cbiAgcmVhZG9ubHkgaXNFbXB0eUVtYmVkQWxpYXNBbGxvd2VkPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogQSByZWZlcmVuY2UgZm9yIHRoZSBsaW5rLlxuICAgKi9cbiAgcmVhZG9ubHkgbGluazogUmVmZXJlbmNlO1xuXG4gIC8qKlxuICAgKiBBIHN0eWxlIG9mIHRoZSBsaW5rIHBhdGguXG4gICAqL1xuICByZWFkb25seSBsaW5rUGF0aFN0eWxlPzogTGlua1BhdGhTdHlsZTtcblxuICAvKipcbiAgICogV2hldGhlciB0byBmb3JjZSBtYXJrZG93biBsaW5rcy5cbiAgICovXG4gIHJlYWRvbmx5IGxpbmtTdHlsZT86IExpbmtTdHlsZTtcblxuICAvKipcbiAgICogQSBzb3VyY2UgZmlsZSBjb250YWluaW5nIHRoZSBsaW5rLlxuICAgKi9cbiAgcmVhZG9ubHkgbmV3U291cmNlUGF0aE9yRmlsZTogUGF0aE9yRmlsZTtcblxuICAvKipcbiAgICogQSBmaWxlIGFzc29jaWF0ZWQgd2l0aCB0aGUgbGluay5cbiAgICovXG4gIHJlYWRvbmx5IG5ld1RhcmdldFBhdGhPckZpbGU6IFBhdGhPckZpbGU7XG5cbiAgLyoqXG4gICAqIEFuIG9sZCBzb3VyY2UgZmlsZSBjb250YWluaW5nIHRoZSBsaW5rLlxuICAgKi9cbiAgcmVhZG9ubHkgb2xkU291cmNlUGF0aE9yRmlsZT86IFBhdGhPckZpbGU7XG5cbiAgLyoqXG4gICAqIEFuIG9sZCBwYXRoIG9mIHRoZSBmaWxlLlxuICAgKi9cbiAgcmVhZG9ubHkgb2xkVGFyZ2V0UGF0aE9yRmlsZT86IFBhdGhPckZpbGU7XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdG8gZXNjYXBlIHRoZSBhbGlhcy5cbiAgICpcbiAgICogQXBwbGljYWJsZSBvbmx5IGlmIHRoZSByZXN1bHQgbGluayBzdHlsZSBpcyB7QGxpbmsgTGlua1N0eWxlLk1hcmtkb3dufS5cbiAgICpcbiAgICogSWYgYHRydWVgOiBgW1xcKlxcKmFsaWFzXFwqXFwqXShsaW5rLm1kKWAuXG4gICAqXG4gICAqIElmIGBmYWxzZWA6IGBbKiphbGlhcyoqXShsaW5rLm1kKWAuXG4gICAqXG4gICAqIEBkZWZhdWx0IGBmYWxzZWBcbiAgICovXG4gIHJlYWRvbmx5IHNob3VsZEVzY2FwZUFsaWFzPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogV2hldGhlciB0byBpbmNsdWRlIHRoZSBhdHRhY2htZW50IGV4dGVuc2lvbiBpbiB0aGUgZW1iZWQgYWxpYXMuXG4gICAqXG4gICAqIEFwcGxpY2FibGUgb25seSBpZiB7QGxpbmsgaXNFbXB0eUVtYmVkQWxpYXNBbGxvd2VkfSBpcyBgZmFsc2VgLlxuICAgKlxuICAgKiBJZiBgdHJ1ZWA6IGBbZm9vLnBuZ10oZm9vLnBuZylgLlxuICAgKlxuICAgKiBJZiBgZmFsc2VgOiBgW2Zvb10oZm9vLnBuZylgLlxuICAgKlxuICAgKiBAZGVmYXVsdCBgZmFsc2VgXG4gICAqL1xuICByZWFkb25seSBzaG91bGRJbmNsdWRlQXR0YWNobWVudEV4dGVuc2lvblRvRW1iZWRBbGlhcz86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdG8gdXBkYXRlIGZpbGUgbmFtZSBhbGlhcy5cbiAgICpcbiAgICogQGRlZmF1bHQgYHRydWVgXG4gICAqL1xuICByZWFkb25seSBzaG91bGRVcGRhdGVGaWxlTmFtZUFsaWFzPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogSW5kaWNhdGVzIGlmIHRoZSBsaW5rIHNob3VsZCB1c2UgYW5nbGUgYnJhY2tldHMuXG4gICAqXG4gICAqIEFwcGxpY2FibGUgb25seSBpZiB7QGxpbmsgbGlua1N0eWxlfSBpcyB7QGxpbmsgTGlua1N0eWxlLk1hcmtkb3dufS5cbiAgICpcbiAgICogSWYgYHRydWVgOiBgW2FsaWFzXSg8cGF0aCB3aXRoIHNwYWNlcy5tZD4pYC5cbiAgICpcbiAgICogSWYgYGZhbHNlYDogYFthbGlhc10ocGF0aCUyMHdpdGglMjBzcGFjZXMubWQpYC5cbiAgICpcbiAgICogQGRlZmF1bHQgYGZhbHNlYFxuICAgKi9cbiAgcmVhZG9ubHkgc2hvdWxkVXNlQW5nbGVCcmFja2V0cz86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIEluZGljYXRlcyBpZiB0aGUgbGluayBzaG91bGQgdXNlIGEgbGVhZGluZyBkb3QuXG4gICAqXG4gICAqIEFwcGxpY2FibGUgb25seSBpZiB7QGxpbmsgbGlua1BhdGhTdHlsZX0gaXMge0BsaW5rIExpbmtQYXRoU3R5bGUuUmVsYXRpdmVQYXRoVG9UaGVTb3VyY2V9LlxuICAgKlxuICAgKiBJZiBgdHJ1ZWA6IGBbWy4vcmVsYXRpdmUvcGF0aC90by90YXJnZXRdXWBcbiAgICpcbiAgICogSWYgYGZhbHNlYDogYFtbcmVsYXRpdmUvcGF0aC90by90YXJnZXRdXWBcbiAgICpcbiAgICogQGRlZmF1bHQgYGZhbHNlYFxuICAgKi9cbiAgcmVhZG9ubHkgc2hvdWxkVXNlTGVhZGluZ0RvdEZvclJlbGF0aXZlUGF0aHM/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBJbmRpY2F0ZXMgaWYgdGhlIGxpbmsgc2hvdWxkIHVzZSBhIGxlYWRpbmcgc2xhc2guXG4gICAqXG4gICAqIEFwcGxpY2FibGUgb25seSBpZiB7QGxpbmsgbGlua1BhdGhTdHlsZX0gaXMge0BsaW5rIExpbmtQYXRoU3R5bGUuQWJzb2x1dGVQYXRoSW5WYXVsdH0uXG4gICAqXG4gICAqIElmIGB0cnVlYDogYFtbL2Fic29sdXRlL3BhdGgvdG8vdGFyZ2V0XV1gXG4gICAqXG4gICAqIElmIGBmYWxzZWA6IGBbW2Fic29sdXRlL3BhdGgvdG8vdGFyZ2V0XV1gXG4gICAqXG4gICAqIEBkZWZhdWx0IGBmYWxzZWBcbiAgICovXG4gIHJlYWRvbmx5IHNob3VsZFVzZUxlYWRpbmdTbGFzaEZvckFic29sdXRlUGF0aHM/OiBib29sZWFuO1xufVxuXG4vKipcbiAqIFBhcmFtcyBmb3Ige0BsaW5rIHVwZGF0ZUxpbmtzSW5GaWxlfS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBVcGRhdGVMaW5rc0luRmlsZVBhcmFtcyBleHRlbmRzIFByb2Nlc3NPcHRpb25zIHtcbiAgLyoqXG4gICAqIEFuIE9ic2lkaWFuIGFwcCBpbnN0YW5jZS5cbiAgICovXG4gIHJlYWRvbmx5IGFwcDogQXBwO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRvIGFsbG93IGFuIGVtcHR5IGFsaWFzIGZvciBlbWJlZHMuXG4gICAqXG4gICAqIEFwcGxpY2FibGUgb25seSBpZiB0aGUgcmVzdWx0IGxpbmsgc3R5bGUgaXMge0BsaW5rIExpbmtTdHlsZS5NYXJrZG93bn0uXG4gICAqXG4gICAqIElmIGB0cnVlYDogYCFbXShmb28ucG5nKWAuXG4gICAqXG4gICAqIElmIGBmYWxzZWA6IGAhW2Zvb10oZm9vLnBuZylgLlxuICAgKlxuICAgKiBAZGVmYXVsdCBgdHJ1ZWBcbiAgICovXG4gIHJlYWRvbmx5IGlzRW1wdHlFbWJlZEFsaWFzQWxsb3dlZD86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIEEgc3R5bGUgb2YgdGhlIGxpbmsgcGF0aC5cbiAgICovXG4gIHJlYWRvbmx5IGxpbmtQYXRoU3R5bGU/OiBMaW5rUGF0aFN0eWxlO1xuXG4gIC8qKlxuICAgKiBBIHN0eWxlIG9mIHRoZSBsaW5rLlxuICAgKi9cbiAgcmVhZG9ubHkgbGlua1N0eWxlPzogTGlua1N0eWxlO1xuXG4gIC8qKlxuICAgKiBEZWNpZGVzIHRoZSBzdHlsZSBvZiBvbmUgbGluaywgb3ZlcnJpZGluZyB7QGxpbmsgbGlua1N0eWxlfSBmb3IgaXQuIFJldHVybmluZyBgdW5kZWZpbmVkYCBrZWVwc1xuICAgKiB7QGxpbmsgbGlua1N0eWxlfS5cbiAgICpcbiAgICogVXNlIGl0IHdoZW4gb25lIHN0eWxlIGZvciB0aGUgd2hvbGUgZmlsZSBpcyB3cm9uZyBmb3Igc29tZSBvZiBpdHMgbGlua3MuIEEgY2FsbGVyIGZvcmNpbmdcbiAgICoge0BsaW5rIExpbmtTdHlsZS5NYXJrZG93bn0gb3ZlciBhIG5vdGUsIGZvciBleGFtcGxlLCBrZWVwcyBhIGZyb250bWF0dGVyIHdpa2lsaW5rIGEgd2lraWxpbmssIGJlY2F1c2VcbiAgICogT2JzaWRpYW4gcmVhZHMgYSBwcm9wZXJ0eSB2YWx1ZSBhcyBhIGxpbmsgb25seSBpbiB0aGF0IGZvcm0uXG4gICAqXG4gICAqIEBkZWZhdWx0IGB1bmRlZmluZWRgXG4gICAqL1xuICByZWFkb25seSBsaW5rU3R5bGVQcm92aWRlcj86IChsaW5rOiBSZWZlcmVuY2UpID0+IExpbmtTdHlsZSB8IHVuZGVmaW5lZDtcblxuICAvKipcbiAgICogQSBmaWxlIHRvIHVwZGF0ZSB0aGUgbGlua3MgaW4uXG4gICAqL1xuICByZWFkb25seSBuZXdTb3VyY2VQYXRoT3JGaWxlOiBQYXRoT3JGaWxlO1xuXG4gIC8qKlxuICAgKiBBIHJhbmdlIHdpdGhpbiB0aGUgZmlsZSdzIGNvbnRlbnQsIGluIGNoYXJhY3RlciBvZmZzZXRzLCByZXN0cmljdGluZyB0aGUgcGFzcyB0byB0aGUgbGlua3MgaW5zaWRlIGl0LlxuICAgKiBXaGVuIG9taXR0ZWQsIGV2ZXJ5IGxpbmsgaXMgdmlzaXRlZC5cbiAgICpcbiAgICogQSBsaW5rIGlzIHVwZGF0ZWQgb25seSB3aGVuIGl0IGlzICoqZnVsbHkgY29udGFpbmVkKiogaW4gdGhlIHJhbmdlOyBvbmUgdGhhdCBtZXJlbHkgb3ZlcmxhcHMgaXQgaXMgbGVmdFxuICAgKiBhbG9uZSwgYmVjYXVzZSByZXdyaXRpbmcgcGFydCBvZiBhIGxpbmsgY29ycnVwdHMgaXQuIEJvdGggYm91bmRzIGFyZSBpbmNsdXNpdmUsIHNvIGEgcmFuZ2Ugd2hvc2VcbiAgICogb2Zmc2V0cyBjb2luY2lkZSBleGFjdGx5IHdpdGggYSBsaW5rJ3MgZG9lcyBpbmNsdWRlIHRoYXQgbGluay5cbiAgICpcbiAgICogQSByZWZlcmVuY2UgdGhhdCBjYXJyaWVzIG5vIHBvc2l0aW9uIHdpdGhpbiB0aGUgZmlsZSdzIGNvbnRlbnQg4oCUIGEgZnJvbnRtYXR0ZXIgbGluaywgYSBtdWx0aS1saW5rXG4gICAqIGZyb250bWF0dGVyIHZhbHVlIGVudHJ5LCBvciBhbnkgY2FudmFzIHJlZmVyZW5jZSDigJQgaXMgbmV2ZXIgaW4gcmFuZ2UgYW5kIGlzIHNraXBwZWQgd2hlbmV2ZXIgYSByYW5nZSBpc1xuICAgKiBzdXBwbGllZC5cbiAgICpcbiAgICogVGhlIG9mZnNldHMgYXJlIGludG8gdGhlIGNvbnRlbnQgdGhpcyBmdW5jdGlvbiByZWFkcyBmcm9tIHRoZSB2YXVsdC4gQmVmb3JlIHJlYWRpbmcsIGl0IHNhdmVzIGFueVxuICAgKiB1bnNhdmVkIGVkaXRvciBidWZmZXIgZm9yIHRoZSBmaWxlLCBzbyBhIHJhbmdlIHRha2VuIGZyb20gYW4gb3BlbiBlZGl0b3IgdmlhIGBFZGl0b3IucG9zVG9PZmZzZXRgIGlzXG4gICAqIHZhbGlkLiBUaGUgY2FsbGVyIG93bnMgb25seSB0aGUgY2FzZSB3aGVyZSB0aGUgYnVmZmVyIGNoYW5nZXMgYmV0d2VlbiBjb21wdXRpbmcgdGhlIHJhbmdlIGFuZCB0aGlzXG4gICAqIGNhbGwuXG4gICAqXG4gICAqIEBkZWZhdWx0IGB1bmRlZmluZWRgXG4gICAqL1xuICByZWFkb25seSBvZmZzZXRSYW5nZT86IE9mZnNldFJhbmdlO1xuXG4gIC8qKlxuICAgKiBBbiBvbGQgcGF0aCBvZiB0aGUgZmlsZS5cbiAgICovXG4gIHJlYWRvbmx5IG9sZFNvdXJjZVBhdGhPckZpbGU/OiBQYXRoT3JGaWxlO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRvIGVzY2FwZSB0aGUgYWxpYXMuXG4gICAqXG4gICAqIEFwcGxpY2FibGUgb25seSBpZiB0aGUgcmVzdWx0IGxpbmsgc3R5bGUgaXMge0BsaW5rIExpbmtTdHlsZS5NYXJrZG93bn0uXG4gICAqXG4gICAqIElmIGB0cnVlYDogYFtcXCpcXCphbGlhc1xcKlxcKl0obGluay5tZClgLlxuICAgKlxuICAgKiBJZiBgZmFsc2VgOiBgWyoqYWxpYXMqKl0obGluay5tZClgLlxuICAgKlxuICAgKiBAZGVmYXVsdCBgZmFsc2VgXG4gICAqL1xuICByZWFkb25seSBzaG91bGRFc2NhcGVBbGlhcz86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdG8gaW5jbHVkZSB0aGUgYXR0YWNobWVudCBleHRlbnNpb24gaW4gdGhlIGVtYmVkIGFsaWFzLlxuICAgKlxuICAgKiBBcHBsaWNhYmxlIG9ubHkgaWYge0BsaW5rIGlzRW1wdHlFbWJlZEFsaWFzQWxsb3dlZH0gaXMgYGZhbHNlYC5cbiAgICpcbiAgICogSWYgYHRydWVgOiBgW2Zvby5wbmddKGZvby5wbmcpYC5cbiAgICpcbiAgICogSWYgYGZhbHNlYDogYFtmb29dKGZvby5wbmcpYC5cbiAgICpcbiAgICogQGRlZmF1bHQgYGZhbHNlYFxuICAgKi9cbiAgcmVhZG9ubHkgc2hvdWxkSW5jbHVkZUF0dGFjaG1lbnRFeHRlbnNpb25Ub0VtYmVkQWxpYXM/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRvIHVwZGF0ZSBvbmx5IGVtYmVkZGVkIGxpbmtzLlxuICAgKi9cbiAgcmVhZG9ubHkgc2hvdWxkVXBkYXRlRW1iZWRPbmx5TGlua3M/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRvIHVwZGF0ZSBmaWxlIG5hbWUgYWxpYXMuXG4gICAqXG4gICAqIEBkZWZhdWx0IGB0cnVlYFxuICAgKi9cbiAgcmVhZG9ubHkgc2hvdWxkVXBkYXRlRmlsZU5hbWVBbGlhcz86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIEluZGljYXRlcyBpZiB0aGUgbGluayBzaG91bGQgdXNlIGFuZ2xlIGJyYWNrZXRzLlxuICAgKlxuICAgKiBBcHBsaWNhYmxlIG9ubHkgaWYge0BsaW5rIGxpbmtTdHlsZX0gaXMge0BsaW5rIExpbmtTdHlsZS5NYXJrZG93bn0uXG4gICAqXG4gICAqIElmIGB0cnVlYDogYFthbGlhc10oPHBhdGggd2l0aCBzcGFjZXMubWQ+KWAuXG4gICAqXG4gICAqIElmIGBmYWxzZWA6IGBbYWxpYXNdKHBhdGglMjB3aXRoJTIwc3BhY2VzLm1kKWAuXG4gICAqXG4gICAqIEBkZWZhdWx0IGBmYWxzZWBcbiAgICovXG4gIHJlYWRvbmx5IHNob3VsZFVzZUFuZ2xlQnJhY2tldHM/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBJbmRpY2F0ZXMgaWYgdGhlIGxpbmsgc2hvdWxkIHVzZSBhIGxlYWRpbmcgZG90LlxuICAgKlxuICAgKiBBcHBsaWNhYmxlIG9ubHkgaWYge0BsaW5rIGxpbmtQYXRoU3R5bGV9IGlzIHtAbGluayBMaW5rUGF0aFN0eWxlLlJlbGF0aXZlUGF0aFRvVGhlU291cmNlfS5cbiAgICpcbiAgICogSWYgYHRydWVgOiBgW1suL3JlbGF0aXZlL3BhdGgvdG8vdGFyZ2V0XV1gXG4gICAqXG4gICAqIElmIGBmYWxzZWA6IGBbW3JlbGF0aXZlL3BhdGgvdG8vdGFyZ2V0XV1gXG4gICAqXG4gICAqIEBkZWZhdWx0IGBmYWxzZWBcbiAgICovXG4gIHJlYWRvbmx5IHNob3VsZFVzZUxlYWRpbmdEb3RGb3JSZWxhdGl2ZVBhdGhzPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogSW5kaWNhdGVzIGlmIHRoZSBsaW5rIHNob3VsZCB1c2UgYSBsZWFkaW5nIHNsYXNoLlxuICAgKlxuICAgKiBBcHBsaWNhYmxlIG9ubHkgaWYge0BsaW5rIGxpbmtQYXRoU3R5bGV9IGlzIHtAbGluayBMaW5rUGF0aFN0eWxlLkFic29sdXRlUGF0aEluVmF1bHR9LlxuICAgKlxuICAgKiBJZiBgdHJ1ZWA6IGBbWy9hYnNvbHV0ZS9wYXRoL3RvL3RhcmdldF1dYFxuICAgKlxuICAgKiBJZiBgZmFsc2VgOiBgW1thYnNvbHV0ZS9wYXRoL3RvL3RhcmdldF1dYFxuICAgKlxuICAgKiBAZGVmYXVsdCBgZmFsc2VgXG4gICAqL1xuICByZWFkb25seSBzaG91bGRVc2VMZWFkaW5nU2xhc2hGb3JBYnNvbHV0ZVBhdGhzPzogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBQYXJhbXMgZm9yIHtAbGluayBnZW5lcmF0ZUxpbmtUZXh0fS5cbiAqL1xuaW50ZXJmYWNlIEdlbmVyYXRlTGlua1RleHRQYXJhbXMge1xuICAvKipcbiAgICogQW4gT2JzaWRpYW4gYXBwIGluc3RhbmNlLlxuICAgKi9cbiAgcmVhZG9ubHkgYXBwOiBBcHA7XG5cbiAgLyoqXG4gICAqIEEgY29uZmlndXJhdGlvbiBvZiB0aGUgbGluay5cbiAgICovXG4gIHJlYWRvbmx5IGNvbmZpZzogTGlua0NvbmZpZztcblxuICAvKipcbiAgICogQSBzb3VyY2UgcGF0aCBvZiB0aGUgbGluay5cbiAgICovXG4gIHJlYWRvbmx5IHNvdXJjZVBhdGg6IHN0cmluZztcblxuICAvKipcbiAgICogQSBzdWJwYXRoIG9mIHRoZSBsaW5rLlxuICAgKi9cbiAgcmVhZG9ubHkgc3VicGF0aDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBBIHRhcmdldCBmaWxlIG9mIHRoZSBsaW5rLlxuICAgKi9cbiAgcmVhZG9ubHkgdGFyZ2V0RmlsZTogVEZpbGU7XG59XG5cbi8qKlxuICogUGFyYW1zIGZvciB7QGxpbmsgZ2VuZXJhdGVNYXJrZG93blN0eWxlTGlua30uXG4gKi9cbmludGVyZmFjZSBHZW5lcmF0ZU1hcmtkb3duU3R5bGVMaW5rUGFyYW1zIHtcbiAgLyoqXG4gICAqIEEgY29uZmlndXJhdGlvbiBvZiB0aGUgbGluay5cbiAgICovXG4gIHJlYWRvbmx5IGNvbmZpZzogTGlua0NvbmZpZztcblxuICAvKipcbiAgICogQSB0ZXh0IG9mIHRoZSBsaW5rLlxuICAgKi9cbiAgcmVhZG9ubHkgbGlua1RleHQ6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIHBhcmFtcyBmb3IgZ2VuZXJhdGluZyB0aGUgbWFya2Rvd24gbGluay5cbiAgICovXG4gIHJlYWRvbmx5IG1hcmtkb3duTGlua1BhcmFtczogR2VuZXJhdGVNYXJrZG93bkxpbmtQYXJhbXM7XG5cbiAgLyoqXG4gICAqIEEgdGFyZ2V0IGZpbGUgb2YgdGhlIGxpbmsuXG4gICAqL1xuICByZWFkb25seSB0YXJnZXRGaWxlOiBURmlsZTtcbn1cblxuLyoqXG4gKiBQYXJhbXMgZm9yIHtAbGluayBnZW5lcmF0ZVdpa2lMaW5rfS5cbiAqL1xuaW50ZXJmYWNlIEdlbmVyYXRlV2lraUxpbmtQYXJhbXMge1xuICAvKipcbiAgICogQW4gYWxpYXMgb2YgdGhlIGxpbmsuXG4gICAqL1xuICByZWFkb25seSBhbGlhczogc3RyaW5nIHwgdW5kZWZpbmVkO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRoZSBsaW5rIHNob3VsZCBiZSBhbiBlbWJlZCBsaW5rLlxuICAgKi9cbiAgcmVhZG9ubHkgaXNFbWJlZDogYm9vbGVhbjtcblxuICAvKipcbiAgICogQSB0ZXh0IG9mIHRoZSBsaW5rLlxuICAgKi9cbiAgcmVhZG9ubHkgbGlua1RleHQ6IHN0cmluZztcbn1cblxuLyoqXG4gKiBQYXJhbXMgZm9yIHtAbGluayBnZXRGaWxlQ2hhbmdlc30uXG4gKi9cbmludGVyZmFjZSBHZXRGaWxlQ2hhbmdlc1BhcmFtcyB7XG4gIC8qKlxuICAgKiBBbiBhYm9ydCBzaWduYWwgdG8gY29udHJvbCB0aGUgZXhlY3V0aW9uIG9mIHRoZSBmdW5jdGlvbi5cbiAgICovXG4gIHJlYWRvbmx5IGFib3J0U2lnbmFsPzogQWJvcnRTaWduYWw7XG5cbiAgLyoqXG4gICAqIEEgbWV0YWRhdGEgY2FjaGUgdG8gZXh0cmFjdCB0aGUgbGlua3MgZnJvbS5cbiAgICovXG4gIHJlYWRvbmx5IGNhY2hlOiBDYWNoZWRNZXRhZGF0YSB8IG51bGw7XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdGhlIGNhY2hlIGJlbG9uZ3MgdG8gYSBjYW52YXMgZmlsZS5cbiAgICovXG4gIHJlYWRvbmx5IGlzQ2FudmFzRmlsZUNhY2hlOiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBBIGZ1bmN0aW9uIHRoYXQgY29udmVydHMgZWFjaCBsaW5rLlxuICAgKi9cbiAgcmVhZG9ubHkgbGlua0NvbnZlcnRlcjogKGxpbms6IFJlZmVyZW5jZSwgYWJvcnRTaWduYWw6IEFib3J0U2lnbmFsKSA9PiBQcm9taXNhYmxlPE1heWJlUmV0dXJuPHN0cmluZz4+O1xuXG4gIC8qKlxuICAgKiBBIHJhbmdlIHdpdGhpbiB0aGUgY29udGVudCwgaW4gY2hhcmFjdGVyIG9mZnNldHMsIHJlc3RyaWN0aW5nIHRoZSBjaGFuZ2VzIHRvIHRoZSBsaW5rcyBmdWxseSBjb250YWluZWRcbiAgICogaW4gaXQuIFdoZW4gb21pdHRlZCwgZXZlcnkgbGluayBpcyB2aXNpdGVkLlxuICAgKlxuICAgKiBAZGVmYXVsdCBgdW5kZWZpbmVkYFxuICAgKi9cbiAgcmVhZG9ubHkgb2Zmc2V0UmFuZ2U/OiBPZmZzZXRSYW5nZTtcblxuICAvKipcbiAgICogV2hldGhlciB0byBpbmNsdWRlIGV4dGVybmFsIGxpbmtzIChwYXJzZWQgZnJvbSB0aGUgbm90ZSBib2R5KSBpbiB0aGUgY2hhbmdlcy5cbiAgICpcbiAgICogQGRlZmF1bHQgYGZhbHNlYFxuICAgKi9cbiAgcmVhZG9ubHkgc2hvdWxkSW5jbHVkZUV4dGVybmFsTGlua3M/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRvIGluY2x1ZGUgZXh0ZXJuYWwgbGlua3MgKHBhcnNlZCBmcm9tIGZyb250bWF0dGVyIHZhbHVlcykgaW4gdGhlIGNoYW5nZXMuXG4gICAqXG4gICAqIEBkZWZhdWx0IGBmYWxzZWBcbiAgICovXG4gIHJlYWRvbmx5IHNob3VsZEluY2x1ZGVGcm9udG1hdHRlckV4dGVybmFsTGlua3M/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRvIGluY2x1ZGUgZXh0ZXJuYWwgbGlua3MgKHBhcnNlZCBmcm9tIG11bHRpLWxpbmsgZnJvbnRtYXR0ZXIgdmFsdWVzKSBpbiB0aGUgY2hhbmdlcy5cbiAgICpcbiAgICogQGRlZmF1bHQgYGZhbHNlYFxuICAgKi9cbiAgcmVhZG9ubHkgc2hvdWxkSW5jbHVkZU11bHRpVmFsdWVGcm9udG1hdHRlckV4dGVybmFsTGlua3M/OiBib29sZWFuO1xufVxuXG5pbnRlcmZhY2UgTGlua0NvbmZpZyB7XG4gIHJlYWRvbmx5IGlzRW1iZWQ6IGJvb2xlYW47XG4gIHJlYWRvbmx5IGlzU2luZ2xlU3VicGF0aEFsbG93ZWQ6IGJvb2xlYW47XG4gIHJlYWRvbmx5IGlzV2lraWxpbms6IGJvb2xlYW47XG4gIHJlYWRvbmx5IGxpbmtQYXRoU3R5bGU6IEZpbmFsTGlua1BhdGhTdHlsZTtcbiAgcmVhZG9ubHkgc2hvdWxkVXNlQW5nbGVCcmFja2V0czogYm9vbGVhbjtcbiAgcmVhZG9ubHkgc2hvdWxkVXNlTGVhZGluZ0RvdEZvclJlbGF0aXZlUGF0aHM6IGJvb2xlYW47XG4gIHJlYWRvbmx5IHNob3VsZFVzZUxlYWRpbmdTbGFzaEZvckFic29sdXRlUGF0aHM6IGJvb2xlYW47XG59XG5cbi8qKlxuICogUGFyYW1zIGZvciB7QGxpbmsgcmVzb2x2ZVNuYXBzaG90TGlua0lkZW50aXR5S2V5UHJvdmlkZXJ9LlxuICovXG5pbnRlcmZhY2UgUmVzb2x2ZVNuYXBzaG90TGlua0lkZW50aXR5S2V5UHJvdmlkZXJQYXJhbXMge1xuICAvKipcbiAgICogVGhlIHB1YmxpYyBmdW5jdGlvbiBhc2tpbmcsIG5hbWVkIGluIHRoZSBlcnJvci5cbiAgICovXG4gIHJlYWRvbmx5IGNhbGxlck5hbWU6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIHByb3ZpZGVyIHRoZSBjYWxsZXIgcGFzc2VkLCBpZiBhbnkuXG4gICAqL1xuICByZWFkb25seSBleHBsaWNpdExpbmtJZGVudGl0eUtleVByb3ZpZGVyOiAoKGxpbms6IFJlZmVyZW5jZSkgPT4gc3RyaW5nKSB8IHVuZGVmaW5lZDtcblxuICAvKipcbiAgICogVGhlIHNuYXBzaG90IHdob3NlIHJlY29yZGVkIHByb3ZpZGVyIHdpbnMgd2hlbiB0aGUgY2FsbGVyIHBhc3NlZCBub25lLlxuICAgKi9cbiAgcmVhZG9ubHkgc25hcHNob3Q6IEJhY2tsaW5rc1NuYXBzaG90PHVua25vd24+O1xufVxuXG4vKipcbiAqIFBhcmFtcyBmb3Ige0BsaW5rIHNob3VsZFVzZVdpa2lsaW5rU3R5bGV9LlxuICovXG5pbnRlcmZhY2UgU2hvdWxkVXNlV2lraWxpbmtTdHlsZVBhcmFtcyB7XG4gIC8qKlxuICAgKiBBbiBPYnNpZGlhbiBhcHAgaW5zdGFuY2UuXG4gICAqL1xuICByZWFkb25seSBhcHA6IEFwcDtcblxuICAvKipcbiAgICogQSBzdHlsZSBvZiB0aGUgbGluay5cbiAgICovXG4gIHJlYWRvbmx5IGxpbmtTdHlsZT86IExpbmtTdHlsZTtcblxuICAvKipcbiAgICogQW4gb3JpZ2luYWwgbGluayB0ZXh0LlxuICAgKi9cbiAgcmVhZG9ubHkgb3JpZ2luYWxMaW5rPzogc3RyaW5nO1xufVxuXG5pbnRlcmZhY2UgVGFibGVQb3NpdGlvbiB7XG4gIGVuZDogbnVtYmVyO1xuICBzdGFydDogbnVtYmVyO1xufVxuXG4vKipcbiAqIFBhcmFtcyBmb3Ige0BsaW5rIHVwZGF0ZUxpbmtzSW5Db250ZW50fS5cbiAqL1xuaW50ZXJmYWNlIFVwZGF0ZUxpbmtzSW5Db250ZW50UGFyYW1zIHtcbiAgLyoqXG4gICAqIEFuIE9ic2lkaWFuIGFwcCBpbnN0YW5jZS5cbiAgICovXG4gIHJlYWRvbmx5IGFwcDogQXBwO1xuXG4gIC8qKlxuICAgKiBBIGNvbnRlbnQgdG8gdXBkYXRlIHRoZSBsaW5rcyBpbi5cbiAgICovXG4gIHJlYWRvbmx5IGNvbnRlbnQ6IHN0cmluZztcblxuICAvKipcbiAgICogV2hldGhlciB0byBhbGxvdyBhbiBlbXB0eSBhbGlhcyBmb3IgZW1iZWRzLlxuICAgKlxuICAgKiBBcHBsaWNhYmxlIG9ubHkgaWYgdGhlIHJlc3VsdCBsaW5rIHN0eWxlIGlzIHtAbGluayBMaW5rU3R5bGUuTWFya2Rvd259LlxuICAgKlxuICAgKiBJZiBgdHJ1ZWA6IGAhW10oZm9vLnBuZylgLlxuICAgKlxuICAgKiBJZiBgZmFsc2VgOiBgIVtmb29dKGZvby5wbmcpYC5cbiAgICpcbiAgICogQGRlZmF1bHQgYHRydWVgXG4gICAqL1xuICByZWFkb25seSBpc0VtcHR5RW1iZWRBbGlhc0FsbG93ZWQ/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBBIHN0eWxlIG9mIHRoZSBsaW5rIHBhdGguXG4gICAqL1xuICByZWFkb25seSBsaW5rUGF0aFN0eWxlPzogTGlua1BhdGhTdHlsZTtcblxuICAvKipcbiAgICogQSBzdHlsZSBvZiB0aGUgbGluay5cbiAgICovXG4gIHJlYWRvbmx5IGxpbmtTdHlsZT86IExpbmtTdHlsZTtcblxuICAvKipcbiAgICogRGVjaWRlcyB0aGUgc3R5bGUgb2Ygb25lIGxpbmssIG92ZXJyaWRpbmcge0BsaW5rIGxpbmtTdHlsZX0gZm9yIGl0LiBSZXR1cm5pbmcgYHVuZGVmaW5lZGAga2VlcHNcbiAgICoge0BsaW5rIGxpbmtTdHlsZX0uXG4gICAqXG4gICAqIFVzZSBpdCB3aGVuIG9uZSBzdHlsZSBmb3IgdGhlIHdob2xlIGNvbnRlbnQgaXMgd3JvbmcgZm9yIHNvbWUgb2YgaXRzIGxpbmtzLiBBIGNhbGxlciBmb3JjaW5nXG4gICAqIHtAbGluayBMaW5rU3R5bGUuTWFya2Rvd259IG92ZXIgYSBub3RlLCBmb3IgZXhhbXBsZSwga2VlcHMgYSBmcm9udG1hdHRlciB3aWtpbGluayBhIHdpa2lsaW5rLCBiZWNhdXNlXG4gICAqIE9ic2lkaWFuIHJlYWRzIGEgcHJvcGVydHkgdmFsdWUgYXMgYSBsaW5rIG9ubHkgaW4gdGhhdCBmb3JtLlxuICAgKlxuICAgKiBAZGVmYXVsdCBgdW5kZWZpbmVkYFxuICAgKi9cbiAgcmVhZG9ubHkgbGlua1N0eWxlUHJvdmlkZXI/OiAobGluazogUmVmZXJlbmNlKSA9PiBMaW5rU3R5bGUgfCB1bmRlZmluZWQ7XG5cbiAgLyoqXG4gICAqIEEgbmV3IHNvdXJjZSBwYXRoIG9yIGZpbGUuXG4gICAqL1xuICByZWFkb25seSBuZXdTb3VyY2VQYXRoT3JGaWxlOiBQYXRoT3JGaWxlO1xuXG4gIC8qKlxuICAgKiBBIHJhbmdlIHdpdGhpbiB7QGxpbmsgVXBkYXRlTGlua3NJbkNvbnRlbnRQYXJhbXMuY29udGVudH0sIGluIGNoYXJhY3RlciBvZmZzZXRzLCByZXN0cmljdGluZyB0aGUgcGFzc1xuICAgKiB0byB0aGUgbGlua3MgaW5zaWRlIGl0LiBXaGVuIG9taXR0ZWQsIGV2ZXJ5IGxpbmsgaXMgdmlzaXRlZC5cbiAgICpcbiAgICogQSBsaW5rIGlzIHVwZGF0ZWQgb25seSB3aGVuIGl0IGlzICoqZnVsbHkgY29udGFpbmVkKiogaW4gdGhlIHJhbmdlOyBvbmUgdGhhdCBtZXJlbHkgb3ZlcmxhcHMgaXQgaXMgbGVmdFxuICAgKiBhbG9uZSwgYmVjYXVzZSByZXdyaXRpbmcgcGFydCBvZiBhIGxpbmsgY29ycnVwdHMgaXQuIEJvdGggYm91bmRzIGFyZSBpbmNsdXNpdmUsIHNvIGEgcmFuZ2Ugd2hvc2VcbiAgICogb2Zmc2V0cyBjb2luY2lkZSBleGFjdGx5IHdpdGggYSBsaW5rJ3MgZG9lcyBpbmNsdWRlIHRoYXQgbGluay5cbiAgICpcbiAgICogQSByZWZlcmVuY2UgdGhhdCBjYXJyaWVzIG5vIHBvc2l0aW9uIHdpdGhpbiB0aGUgY29udGVudCDigJQgYSBmcm9udG1hdHRlciBsaW5rLCBhIG11bHRpLWxpbmsgZnJvbnRtYXR0ZXJcbiAgICogdmFsdWUgZW50cnksIG9yIGFueSBjYW52YXMgcmVmZXJlbmNlIOKAlCBpcyBuZXZlciBpbiByYW5nZSBhbmQgaXMgc2tpcHBlZCB3aGVuZXZlciBhIHJhbmdlIGlzIHN1cHBsaWVkLlxuICAgKlxuICAgKiBAZGVmYXVsdCBgdW5kZWZpbmVkYFxuICAgKi9cbiAgcmVhZG9ubHkgb2Zmc2V0UmFuZ2U/OiBPZmZzZXRSYW5nZTtcblxuICAvKipcbiAgICogQW4gb2xkIHNvdXJjZSBwYXRoIG9yIGZpbGUuXG4gICAqL1xuICByZWFkb25seSBvbGRTb3VyY2VQYXRoT3JGaWxlPzogUGF0aE9yRmlsZTtcblxuICAvKipcbiAgICogV2hldGhlciB0byBlc2NhcGUgdGhlIGFsaWFzLlxuICAgKlxuICAgKiBBcHBsaWNhYmxlIG9ubHkgaWYgdGhlIHJlc3VsdCBsaW5rIHN0eWxlIGlzIHtAbGluayBMaW5rU3R5bGUuTWFya2Rvd259LlxuICAgKlxuICAgKiBJZiBgdHJ1ZWA6IGBbXFwqXFwqYWxpYXNcXCpcXCpdKGxpbmsubWQpYC5cbiAgICpcbiAgICogSWYgYGZhbHNlYDogYFsqKmFsaWFzKipdKGxpbmsubWQpYC5cbiAgICpcbiAgICogQGRlZmF1bHQgYGZhbHNlYFxuICAgKi9cbiAgcmVhZG9ubHkgc2hvdWxkRXNjYXBlQWxpYXM/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRvIGluY2x1ZGUgdGhlIGF0dGFjaG1lbnQgZXh0ZW5zaW9uIGluIHRoZSBlbWJlZCBhbGlhcy5cbiAgICpcbiAgICogQXBwbGljYWJsZSBvbmx5IGlmIHtAbGluayBpc0VtcHR5RW1iZWRBbGlhc0FsbG93ZWR9IGlzIGBmYWxzZWAuXG4gICAqXG4gICAqIElmIGB0cnVlYDogYFtmb28ucG5nXShmb28ucG5nKWAuXG4gICAqXG4gICAqIElmIGBmYWxzZWA6IGBbZm9vXShmb28ucG5nKWAuXG4gICAqXG4gICAqIEBkZWZhdWx0IGBmYWxzZWBcbiAgICovXG4gIHJlYWRvbmx5IHNob3VsZEluY2x1ZGVBdHRhY2htZW50RXh0ZW5zaW9uVG9FbWJlZEFsaWFzPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogV2hldGhlciB0byB1cGRhdGUgb25seSBlbWJlZGRlZCBsaW5rcy5cbiAgICovXG4gIHJlYWRvbmx5IHNob3VsZFVwZGF0ZUVtYmVkT25seUxpbmtzPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogV2hldGhlciB0byB1cGRhdGUgZmlsZSBuYW1lIGFsaWFzLlxuICAgKlxuICAgKiBAZGVmYXVsdCBgdHJ1ZWBcbiAgICovXG4gIHJlYWRvbmx5IHNob3VsZFVwZGF0ZUZpbGVOYW1lQWxpYXM/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBJbmRpY2F0ZXMgaWYgdGhlIGxpbmsgc2hvdWxkIHVzZSBhbmdsZSBicmFja2V0cy5cbiAgICpcbiAgICogQXBwbGljYWJsZSBvbmx5IGlmIHtAbGluayBsaW5rU3R5bGV9IGlzIHtAbGluayBMaW5rU3R5bGUuTWFya2Rvd259LlxuICAgKlxuICAgKiBJZiBgdHJ1ZWA6IGBbYWxpYXNdKDxwYXRoIHdpdGggc3BhY2VzLm1kPilgLlxuICAgKlxuICAgKiBJZiBgZmFsc2VgOiBgW2FsaWFzXShwYXRoJTIwd2l0aCUyMHNwYWNlcy5tZClgLlxuICAgKlxuICAgKiBAZGVmYXVsdCBgZmFsc2VgXG4gICAqL1xuICByZWFkb25seSBzaG91bGRVc2VBbmdsZUJyYWNrZXRzPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogSW5kaWNhdGVzIGlmIHRoZSBsaW5rIHNob3VsZCB1c2UgYSBsZWFkaW5nIGRvdC5cbiAgICpcbiAgICogQXBwbGljYWJsZSBvbmx5IGlmIHtAbGluayBsaW5rUGF0aFN0eWxlfSBpcyB7QGxpbmsgTGlua1BhdGhTdHlsZS5SZWxhdGl2ZVBhdGhUb1RoZVNvdXJjZX0uXG4gICAqXG4gICAqIElmIGB0cnVlYDogYFtbLi9yZWxhdGl2ZS9wYXRoL3RvL3RhcmdldF1dYFxuICAgKlxuICAgKiBJZiBgZmFsc2VgOiBgW1tyZWxhdGl2ZS9wYXRoL3RvL3RhcmdldF1dYFxuICAgKlxuICAgKiBAZGVmYXVsdCBgZmFsc2VgXG4gICAqL1xuICByZWFkb25seSBzaG91bGRVc2VMZWFkaW5nRG90Rm9yUmVsYXRpdmVQYXRocz86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIEluZGljYXRlcyBpZiB0aGUgbGluayBzaG91bGQgdXNlIGEgbGVhZGluZyBzbGFzaC5cbiAgICpcbiAgICogQXBwbGljYWJsZSBvbmx5IGlmIHtAbGluayBsaW5rUGF0aFN0eWxlfSBpcyB7QGxpbmsgTGlua1BhdGhTdHlsZS5BYnNvbHV0ZVBhdGhJblZhdWx0fS5cbiAgICpcbiAgICogSWYgYHRydWVgOiBgW1svYWJzb2x1dGUvcGF0aC90by90YXJnZXRdXWBcbiAgICpcbiAgICogSWYgYGZhbHNlYDogYFtbYWJzb2x1dGUvcGF0aC90by90YXJnZXRdXWBcbiAgICpcbiAgICogQGRlZmF1bHQgYGZhbHNlYFxuICAgKi9cbiAgcmVhZG9ubHkgc2hvdWxkVXNlTGVhZGluZ1NsYXNoRm9yQWJzb2x1dGVQYXRocz86IGJvb2xlYW47XG59XG5cbi8qKlxuICogUmVjb3JkcyBhIHNldCBvZiBiYWNrbGlua3MgaW50byBhIHNuYXBzaG90IHRoYXQge0BsaW5rIGVkaXRCYWNrbGlua3NTbmFwc2hvdH0gY2FuIHJld3JpdGUgbGF0ZXIuXG4gKlxuICogQ2FsbCBpdCBvbmNlIHBlciB0YXJnZXQgYW5kIHBhc3Mge0BsaW5rIEJ1aWxkQmFja2xpbmtzU25hcHNob3RQYXJhbXMudGFyZ2V0fSB0byBhY2N1bXVsYXRlIHNldmVyYWwgdGFyZ2V0c1xuICogaW50byBvbmUgc25hcHNob3QsIHNvIHRoYXQgYSBub3RlIGxpbmtpbmcgdG8gc2V2ZXJhbCBvZiB0aGVtIGlzIHN0aWxsIHJld3JpdHRlbiBleGFjdGx5IG9uY2UuXG4gKlxuICogQHR5cGVQYXJhbSBUUGF5bG9hZCAtIFRoZSBwYXlsb2FkIHJlY29yZGVkIGZvciBlYWNoIGxpbmsuXG4gKiBAcGFyYW0gcGFyYW1zIC0gVGhlIHBhcmFtZXRlcnMgZm9yIGJ1aWxkaW5nIHRoZSBzbmFwc2hvdC5cbiAqIEByZXR1cm5zIFRoZSBzbmFwc2hvdCDigJQge0BsaW5rIEJ1aWxkQmFja2xpbmtzU25hcHNob3RQYXJhbXMudGFyZ2V0fSBpdHNlbGYgd2hlbiBvbmUgd2FzIHBhc3NlZC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGJ1aWxkQmFja2xpbmtzU25hcHNob3Q8VFBheWxvYWQ+KHBhcmFtczogQnVpbGRCYWNrbGlua3NTbmFwc2hvdFBhcmFtczxUUGF5bG9hZD4pOiBNdXRhYmxlQmFja2xpbmtzU25hcHNob3Q8VFBheWxvYWQ+IHtcbiAgY29uc3Qge1xuICAgIGJhY2tsaW5rcyxcbiAgICBsaW5rSWRlbnRpdHlLZXlQcm92aWRlcjogZXhwbGljaXRMaW5rSWRlbnRpdHlLZXlQcm92aWRlcixcbiAgICBwYXRoUmVtYXBwZXIsXG4gICAgcGF5bG9hZFByb3ZpZGVyLFxuICAgIHRhcmdldFxuICB9ID0gcGFyYW1zO1xuXG4gIGNvbnN0IHNuYXBzaG90ID0gdGFyZ2V0ID8/IG5ldyBNYXA8c3RyaW5nLCBNYXA8c3RyaW5nLCBUUGF5bG9hZD4+KCk7XG4gIGNvbnN0IGxpbmtJZGVudGl0eUtleVByb3ZpZGVyID0gcmVzb2x2ZVNuYXBzaG90TGlua0lkZW50aXR5S2V5UHJvdmlkZXIoe1xuICAgIGNhbGxlck5hbWU6ICdidWlsZEJhY2tsaW5rc1NuYXBzaG90JyxcbiAgICBleHBsaWNpdExpbmtJZGVudGl0eUtleVByb3ZpZGVyLFxuICAgIHNuYXBzaG90XG4gIH0pO1xuICBzbmFwc2hvdExpbmtJZGVudGl0eUtleVByb3ZpZGVycy5zZXQoc25hcHNob3QsIGxpbmtJZGVudGl0eUtleVByb3ZpZGVyKTtcblxuICBmb3IgKGNvbnN0IGJhY2tsaW5rUGF0aCBvZiBiYWNrbGlua3Mua2V5cygpKSB7XG4gICAgY29uc3QgbmV3QmFja2xpbmtQYXRoID0gcGF0aFJlbWFwcGVyPy4oYmFja2xpbmtQYXRoKSA/PyBiYWNrbGlua1BhdGg7XG4gICAgbGV0IHBheWxvYWRzID0gc25hcHNob3QuZ2V0KG5ld0JhY2tsaW5rUGF0aCk7XG4gICAgaWYgKCFwYXlsb2Fkcykge1xuICAgICAgcGF5bG9hZHMgPSBuZXcgTWFwPHN0cmluZywgVFBheWxvYWQ+KCk7XG4gICAgICBzbmFwc2hvdC5zZXQobmV3QmFja2xpbmtQYXRoLCBwYXlsb2Fkcyk7XG4gICAgfVxuXG4gICAgLyogdjggaWdub3JlIG5leHQgLS0gQSBrZXkgeWllbGRlZCBieSBga2V5cygpYCBhbHdheXMgcmVzb2x2ZXM7IHRoZSBgPz8gW11gIGlzIGRlZmVuc2l2ZS4gKi9cbiAgICBmb3IgKGNvbnN0IGxpbmsgb2YgYmFja2xpbmtzLmdldChiYWNrbGlua1BhdGgpID8/IFtdKSB7XG4gICAgICBwYXlsb2Fkcy5zZXQobGlua0lkZW50aXR5S2V5UHJvdmlkZXIobGluayksIHBheWxvYWRQcm92aWRlcihsaW5rKSk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHNuYXBzaG90O1xufVxuXG4vKipcbiAqIENvbnZlcnRzIGEgbGluayB0byBhIG5ldyBwYXRoLlxuICpcbiAqIEBwYXJhbSBwYXJhbXMgLSBUaGUgcGFyYW1ldGVycyBmb3IgY29udmVydGluZyB0aGUgbGluay5cbiAqIEByZXR1cm5zIFRoZSBjb252ZXJ0ZWQgbGluay5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNvbnZlcnRMaW5rKHBhcmFtczogQ29udmVydExpbmtQYXJhbXMpOiBzdHJpbmcge1xuICBjb25zdCB0YXJnZXRGaWxlID0gZXh0cmFjdExpbmtGaWxlKHtcbiAgICBhcHA6IHBhcmFtcy5hcHAsXG4gICAgbGluazogcGFyYW1zLmxpbmssXG4gICAgc291cmNlUGF0aE9yRmlsZTogcGFyYW1zLm9sZFNvdXJjZVBhdGhPckZpbGUgPz8gcGFyYW1zLm5ld1NvdXJjZVBhdGhPckZpbGVcbiAgfSk7XG4gIHJldHVybiB0YXJnZXRGaWxlXG4gICAgPyB1cGRhdGVMaW5rKG5vcm1hbGl6ZU9wdGlvbmFsUHJvcGVydGllczxVcGRhdGVMaW5rUGFyYW1zPih7XG4gICAgICBhcHA6IHBhcmFtcy5hcHAsXG4gICAgICBpc0VtcHR5RW1iZWRBbGlhc0FsbG93ZWQ6IHBhcmFtcy5pc0VtcHR5RW1iZWRBbGlhc0FsbG93ZWQsXG4gICAgICBsaW5rOiBwYXJhbXMubGluayxcbiAgICAgIGxpbmtQYXRoU3R5bGU6IHBhcmFtcy5saW5rUGF0aFN0eWxlLFxuICAgICAgbGlua1N0eWxlOiBwYXJhbXMubGlua1N0eWxlLFxuICAgICAgbmV3U291cmNlUGF0aE9yRmlsZTogcGFyYW1zLm5ld1NvdXJjZVBhdGhPckZpbGUsXG4gICAgICBuZXdUYXJnZXRQYXRoT3JGaWxlOiB0YXJnZXRGaWxlLFxuICAgICAgb2xkU291cmNlUGF0aE9yRmlsZTogcGFyYW1zLm9sZFNvdXJjZVBhdGhPckZpbGUsXG4gICAgICBzaG91bGRFc2NhcGVBbGlhczogcGFyYW1zLnNob3VsZEVzY2FwZUFsaWFzLFxuICAgICAgc2hvdWxkSW5jbHVkZUF0dGFjaG1lbnRFeHRlbnNpb25Ub0VtYmVkQWxpYXM6IHBhcmFtcy5zaG91bGRJbmNsdWRlQXR0YWNobWVudEV4dGVuc2lvblRvRW1iZWRBbGlhcyxcbiAgICAgIHNob3VsZFVwZGF0ZUZpbGVOYW1lQWxpYXM6IHBhcmFtcy5zaG91bGRVcGRhdGVGaWxlTmFtZUFsaWFzLFxuICAgICAgc2hvdWxkVXNlQW5nbGVCcmFja2V0czogcGFyYW1zLnNob3VsZFVzZUFuZ2xlQnJhY2tldHMsXG4gICAgICBzaG91bGRVc2VMZWFkaW5nRG90Rm9yUmVsYXRpdmVQYXRoczogcGFyYW1zLnNob3VsZFVzZUxlYWRpbmdEb3RGb3JSZWxhdGl2ZVBhdGhzLFxuICAgICAgc2hvdWxkVXNlTGVhZGluZ1NsYXNoRm9yQWJzb2x1dGVQYXRoczogcGFyYW1zLnNob3VsZFVzZUxlYWRpbmdTbGFzaEZvckFic29sdXRlUGF0aHNcbiAgICB9KSlcbiAgICA6IHBhcmFtcy5saW5rLm9yaWdpbmFsO1xufVxuXG4vKipcbiAqIEVkaXRzIHRoZSBiYWNrbGlua3MgZm9yIGEgZmlsZSBvciBwYXRoLlxuICpcbiAqIEBwYXJhbSBwYXJhbXMgLSBUaGUgcGFyYW1ldGVycyBmb3IgZWRpdGluZyB0aGUgYmFja2xpbmtzLlxuICogQHJldHVybnMgQSB7QGxpbmsgUHJvbWlzZX0gdGhhdCByZXNvbHZlcyB3aGVuIHRoZSBiYWNrbGlua3MgaGF2ZSBiZWVuIGVkaXRlZC5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGVkaXRCYWNrbGlua3MocGFyYW1zOiBFZGl0QmFja2xpbmtzUGFyYW1zKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IHtcbiAgICBhcHAsXG4gICAgbGlua0NvbnZlcnRlcixcbiAgICBsaW5rVXBkYXRlUHJvZ3Jlc3NSZXBvcnRlcixcbiAgICBwYXRoT3JGaWxlLFxuICAgIC4uLm9wdGlvbnNcbiAgfSA9IHBhcmFtcztcbiAgY29uc3QgYmFja2xpbmtzID0gYXdhaXQgZ2V0QmFja2xpbmtzRm9yRmlsZVNhZmUoeyBhcHAsIHBhdGhPckZpbGUsIC4uLm9wdGlvbnMgfSk7XG4gIGNvbnN0IHNuYXBzaG90ID0gYnVpbGRCYWNrbGlua3NTbmFwc2hvdDx1bmRlZmluZWQ+KHtcbiAgICBiYWNrbGlua3MsXG4gICAgcGF5bG9hZFByb3ZpZGVyOiBnZXRVbmRlZmluZWRQYXlsb2FkXG4gIH0pO1xuICBhd2FpdCBlZGl0QmFja2xpbmtzU25hcHNob3Qobm9ybWFsaXplT3B0aW9uYWxQcm9wZXJ0aWVzPEVkaXRCYWNrbGlua3NTbmFwc2hvdFBhcmFtczx1bmRlZmluZWQ+Pih7XG4gICAgYXBwLFxuICAgIGxpbmtDb252ZXJ0ZXI6ICh7IGxpbmsgfSkgPT4gbGlua0NvbnZlcnRlcihsaW5rKSxcbiAgICBsaW5rVXBkYXRlUHJvZ3Jlc3NSZXBvcnRlcixcbiAgICBzbmFwc2hvdCxcbiAgICAuLi5vcHRpb25zXG4gIH0pKTtcbn1cblxuLyoqXG4gKiBFZGl0cyBhIGNhcHR1cmVkIHNuYXBzaG90IG9mIGJhY2tsaW5rcywgcmV3cml0aW5nIGVhY2ggYmFja2xpbmstaG9sZGluZyBub3RlIGV4YWN0bHkgb25jZS5cbiAqXG4gKiBUaGUgY291bnRlcnBhcnQgb2Yge0BsaW5rIGVkaXRCYWNrbGlua3N9IGZvciBjYWxsZXJzIHRoYXQgY2Fubm90IGZldGNoIHRoZSBiYWNrbGlua3MgYXQgcmV3cml0ZSB0aW1lIOKAlFxuICogYmVjYXVzZSB0aGUgcmVuYW1lIHRoYXQgaW52YWxpZGF0ZWQgdGhlbSBoYXMgYWxyZWFkeSBoYXBwZW5lZCDigJQgb3IgdGhhdCByZXdyaXRlIGxpbmtzIHRvIHNldmVyYWwgdGFyZ2V0c1xuICogYXQgb25jZS4gU2VlIHtAbGluayBCYWNrbGlua3NTbmFwc2hvdH0gZm9yIGJvdGggY2FzZXMuXG4gKlxuICogQHR5cGVQYXJhbSBUUGF5bG9hZCAtIFRoZSBwYXlsb2FkIHJlY29yZGVkIGZvciBlYWNoIGxpbmsgd2hlbiB0aGUgc25hcHNob3Qgd2FzIGJ1aWx0LlxuICogQHBhcmFtIHBhcmFtcyAtIFRoZSBwYXJhbWV0ZXJzIGZvciBlZGl0aW5nIHRoZSBiYWNrbGlua3MuXG4gKiBAcmV0dXJucyBBIHtAbGluayBQcm9taXNlfSB0aGF0IHJlc29sdmVzIHdoZW4gdGhlIGJhY2tsaW5rcyBoYXZlIGJlZW4gZWRpdGVkLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZWRpdEJhY2tsaW5rc1NuYXBzaG90PFRQYXlsb2FkPihwYXJhbXM6IEVkaXRCYWNrbGlua3NTbmFwc2hvdFBhcmFtczxUUGF5bG9hZD4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3Qge1xuICAgIGFwcCxcbiAgICBsaW5rQ29udmVydGVyLFxuICAgIGxpbmtJZGVudGl0eUtleVByb3ZpZGVyOiBleHBsaWNpdExpbmtJZGVudGl0eUtleVByb3ZpZGVyLFxuICAgIGxpbmtVcGRhdGVQcm9ncmVzc1JlcG9ydGVyLFxuICAgIHNob3VsZFZpc2l0VW5tYXRjaGVkTGlua3MgPSBmYWxzZSxcbiAgICBzbmFwc2hvdCxcbiAgICAuLi5vcHRpb25zXG4gIH0gPSBwYXJhbXM7XG4gIGNvbnN0IGxpbmtJZGVudGl0eUtleVByb3ZpZGVyID0gcmVzb2x2ZVNuYXBzaG90TGlua0lkZW50aXR5S2V5UHJvdmlkZXIoe1xuICAgIGNhbGxlck5hbWU6ICdlZGl0QmFja2xpbmtzU25hcHNob3QnLFxuICAgIGV4cGxpY2l0TGlua0lkZW50aXR5S2V5UHJvdmlkZXIsXG4gICAgc25hcHNob3RcbiAgfSk7XG5cbiAgY29uc3QgYmFja2xpbmtOb3RlUGF0aHMgPSBbLi4uc25hcHNob3Qua2V5cygpXTtcbiAgbGV0IHByb2Nlc3NlZCA9IDA7XG4gIGZvciAoY29uc3QgYmFja2xpbmtOb3RlUGF0aCBvZiBiYWNrbGlua05vdGVQYXRocykge1xuICAgIGNvbnN0IHBheWxvYWRzID0gZW5zdXJlTm9uTnVsbGFibGUoc25hcHNob3QuZ2V0KGJhY2tsaW5rTm90ZVBhdGgpKTtcbiAgICBhd2FpdCBlZGl0TGlua3Moe1xuICAgICAgYXBwLFxuICAgICAgbGlua0NvbnZlcnRlcjogKGxpbmspID0+IHtcbiAgICAgICAgY29uc3QgbGlua0lkZW50aXR5S2V5ID0gbGlua0lkZW50aXR5S2V5UHJvdmlkZXIobGluayk7XG4gICAgICAgIHJldHVybiAhcGF5bG9hZHMuaGFzKGxpbmtJZGVudGl0eUtleSkgJiYgIXNob3VsZFZpc2l0VW5tYXRjaGVkTGlua3NcbiAgICAgICAgICA/IHVuZGVmaW5lZFxuICAgICAgICAgIDogbGlua0NvbnZlcnRlcih7XG4gICAgICAgICAgICBsaW5rLFxuICAgICAgICAgICAgcGF5bG9hZDogcGF5bG9hZHMuZ2V0KGxpbmtJZGVudGl0eUtleSksXG4gICAgICAgICAgICBzb3VyY2VQYXRoOiBiYWNrbGlua05vdGVQYXRoXG4gICAgICAgICAgfSk7XG4gICAgICB9LFxuICAgICAgcGF0aE9yRmlsZTogYmFja2xpbmtOb3RlUGF0aCxcbiAgICAgIC4uLm9wdGlvbnNcbiAgICB9KTtcbiAgICBwcm9jZXNzZWQrKztcbiAgICBsaW5rVXBkYXRlUHJvZ3Jlc3NSZXBvcnRlcj8uKHtcbiAgICAgIGN1cnJlbnRQYXRoOiBiYWNrbGlua05vdGVQYXRoLFxuICAgICAgcHJvY2Vzc2VkLFxuICAgICAgdG90YWw6IGJhY2tsaW5rTm90ZVBhdGhzLmxlbmd0aFxuICAgIH0pO1xuICB9XG59XG5cbi8qKlxuICogRWRpdHMgdGhlIGxpbmtzIGZvciBhIGZpbGUgb3IgcGF0aC5cbiAqXG4gKiBAcGFyYW0gcGFyYW1zIC0gVGhlIHBhcmFtZXRlcnMgZm9yIGVkaXRpbmcgdGhlIGxpbmtzLlxuICogQHJldHVybnMgQSB7QGxpbmsgUHJvbWlzZX0gdGhhdCByZXNvbHZlcyB3aGVuIHRoZSBsaW5rcyBoYXZlIGJlZW4gZWRpdGVkLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZWRpdExpbmtzKHBhcmFtczogRWRpdExpbmtzUGFyYW1zKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IHtcbiAgICBhcHAsXG4gICAgbGlua0NvbnZlcnRlcixcbiAgICBvZmZzZXRSYW5nZSxcbiAgICBwYXRoT3JGaWxlLFxuICAgIHNob3VsZEVkaXRFeHRlcm5hbExpbmtzID0gZmFsc2UsXG4gICAgc2hvdWxkRWRpdEZyb250bWF0dGVyRXh0ZXJuYWxMaW5rcyA9IGZhbHNlLFxuICAgIHNob3VsZEVkaXRNdWx0aVZhbHVlRnJvbnRtYXR0ZXJFeHRlcm5hbExpbmtzID0gZmFsc2UsXG4gICAgLi4ub3B0aW9uc1xuICB9ID0gcGFyYW1zO1xuXG4gIGlmIChvZmZzZXRSYW5nZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgdmFsaWRhdGVPZmZzZXRSYW5nZShvZmZzZXRSYW5nZSk7XG4gIH1cblxuICBhd2FpdCBhcHBseUZpbGVDaGFuZ2VzKHtcbiAgICBhcHAsXG4gICAgY2hhbmdlc1Byb3ZpZGVyOiBhc3luYyAoeyBhYm9ydFNpZ25hbCwgY29udGVudCB9KSA9PiB7XG4gICAgICBjb25zdCBjYWNoZSA9IGF3YWl0IGdldENhY2hlU2FmZShhcHAsIHBhdGhPckZpbGUsIHtcbiAgICAgICAgc2hvdWxkUGFyc2VFeHRlcm5hbExpbmtzOiBzaG91bGRFZGl0RXh0ZXJuYWxMaW5rcyxcbiAgICAgICAgc2hvdWxkUGFyc2VGcm9udG1hdHRlckV4dGVybmFsTGlua3M6IHNob3VsZEVkaXRGcm9udG1hdHRlckV4dGVybmFsTGlua3MsXG4gICAgICAgIHNob3VsZFBhcnNlTXVsdGlWYWx1ZUZyb250bWF0dGVyRXh0ZXJuYWxMaW5rczogc2hvdWxkRWRpdE11bHRpVmFsdWVGcm9udG1hdHRlckV4dGVybmFsTGlua3NcbiAgICAgIH0pO1xuICAgICAgYWJvcnRTaWduYWwudGhyb3dJZkFib3J0ZWQoKTtcbiAgICAgIGNvbnN0IGZpbGUgPSBnZXRGaWxlKHsgYXBwLCBwYXRoT3JGaWxlIH0pO1xuICAgICAgY29uc3QgY2FjaGVkQ29udGVudCA9IGF3YWl0IGFwcC52YXVsdC5jYWNoZWRSZWFkKGZpbGUpO1xuICAgICAgYWJvcnRTaWduYWwudGhyb3dJZkFib3J0ZWQoKTtcbiAgICAgIHJldHVybiBjb250ZW50ID09PSBjYWNoZWRDb250ZW50XG4gICAgICAgID8gKGF3YWl0IGdldEZpbGVDaGFuZ2VzKG5vcm1hbGl6ZU9wdGlvbmFsUHJvcGVydGllczxHZXRGaWxlQ2hhbmdlc1BhcmFtcz4oe1xuICAgICAgICAgIGFib3J0U2lnbmFsLFxuICAgICAgICAgIGNhY2hlLFxuICAgICAgICAgIGlzQ2FudmFzRmlsZUNhY2hlOiBpc0NhbnZhc0ZpbGUocGF0aE9yRmlsZSksXG4gICAgICAgICAgbGlua0NvbnZlcnRlcixcbiAgICAgICAgICBvZmZzZXRSYW5nZSxcbiAgICAgICAgICBzaG91bGRJbmNsdWRlRXh0ZXJuYWxMaW5rczogc2hvdWxkRWRpdEV4dGVybmFsTGlua3MsXG4gICAgICAgICAgc2hvdWxkSW5jbHVkZUZyb250bWF0dGVyRXh0ZXJuYWxMaW5rczogc2hvdWxkRWRpdEZyb250bWF0dGVyRXh0ZXJuYWxMaW5rcyxcbiAgICAgICAgICBzaG91bGRJbmNsdWRlTXVsdGlWYWx1ZUZyb250bWF0dGVyRXh0ZXJuYWxMaW5rczogc2hvdWxkRWRpdE11bHRpVmFsdWVGcm9udG1hdHRlckV4dGVybmFsTGlua3NcbiAgICAgICAgfSkpKVxuICAgICAgICA6IG51bGw7XG4gICAgfSxcbiAgICBwYXRoT3JGaWxlLFxuICAgIC4uLm9wdGlvbnNcbiAgfSk7XG59XG5cbi8qKlxuICogRWRpdHMgdGhlIGxpbmtzIGluIGEgY29udGVudCBzdHJpbmcuXG4gKlxuICogQHBhcmFtIHBhcmFtcyAtIFRoZSBwYXJhbWV0ZXJzIGZvciBlZGl0aW5nIHRoZSBsaW5rcyBpbiB0aGUgY29udGVudC5cbiAqIEByZXR1cm5zIFRoZSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgdG8gdGhlIHVwZGF0ZWQgY29udGVudC5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGVkaXRMaW5rc0luQ29udGVudChwYXJhbXM6IEVkaXRMaW5rc0luQ29udGVudFBhcmFtcyk6IFByb21pc2U8c3RyaW5nPiB7XG4gIGNvbnN0IHsgYXBwLCBjb250ZW50LCBsaW5rQ29udmVydGVyLCBvZmZzZXRSYW5nZSwgc2hvdWxkRWRpdEV4dGVybmFsTGlua3MgPSBmYWxzZSwgc2hvdWxkRWRpdEZyb250bWF0dGVyRXh0ZXJuYWxMaW5rcyA9IGZhbHNlLCBzaG91bGRFZGl0TXVsdGlWYWx1ZUZyb250bWF0dGVyRXh0ZXJuYWxMaW5rcyA9IGZhbHNlIH0gPSBwYXJhbXM7XG4gIGxldCB7IGFib3J0U2lnbmFsIH0gPSBwYXJhbXM7XG4gIGFib3J0U2lnbmFsID8/PSBhYm9ydFNpZ25hbE5ldmVyKCk7XG4gIGFib3J0U2lnbmFsLnRocm93SWZBYm9ydGVkKCk7XG5cbiAgaWYgKG9mZnNldFJhbmdlICE9PSB1bmRlZmluZWQpIHtcbiAgICB2YWxpZGF0ZU9mZnNldFJhbmdlKG9mZnNldFJhbmdlKTtcbiAgfVxuXG4gIGNvbnN0IG5ld0NvbnRlbnQgPSBhd2FpdCBhcHBseUNvbnRlbnRDaGFuZ2VzKHtcbiAgICBhYm9ydFNpZ25hbCxcbiAgICBjaGFuZ2VzUHJvdmlkZXI6IGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IGNhY2hlID0gYXdhaXQgcGFyc2VNZXRhZGF0YShhcHAsIGNvbnRlbnQsIHtcbiAgICAgICAgc2hvdWxkUGFyc2VFeHRlcm5hbExpbmtzOiBzaG91bGRFZGl0RXh0ZXJuYWxMaW5rcyxcbiAgICAgICAgc2hvdWxkUGFyc2VGcm9udG1hdHRlckV4dGVybmFsTGlua3M6IHNob3VsZEVkaXRGcm9udG1hdHRlckV4dGVybmFsTGlua3MsXG4gICAgICAgIHNob3VsZFBhcnNlTXVsdGlWYWx1ZUZyb250bWF0dGVyRXh0ZXJuYWxMaW5rczogc2hvdWxkRWRpdE11bHRpVmFsdWVGcm9udG1hdHRlckV4dGVybmFsTGlua3NcbiAgICAgIH0pO1xuICAgICAgYWJvcnRTaWduYWwudGhyb3dJZkFib3J0ZWQoKTtcbiAgICAgIGNvbnN0IGNoYW5nZXMgPSBhd2FpdCBnZXRGaWxlQ2hhbmdlcyhub3JtYWxpemVPcHRpb25hbFByb3BlcnRpZXM8R2V0RmlsZUNoYW5nZXNQYXJhbXM+KHtcbiAgICAgICAgYWJvcnRTaWduYWwsXG4gICAgICAgIGNhY2hlLFxuICAgICAgICBpc0NhbnZhc0ZpbGVDYWNoZTogZmFsc2UsXG4gICAgICAgIGxpbmtDb252ZXJ0ZXIsXG4gICAgICAgIG9mZnNldFJhbmdlLFxuICAgICAgICBzaG91bGRJbmNsdWRlRXh0ZXJuYWxMaW5rczogc2hvdWxkRWRpdEV4dGVybmFsTGlua3MsXG4gICAgICAgIHNob3VsZEluY2x1ZGVGcm9udG1hdHRlckV4dGVybmFsTGlua3M6IHNob3VsZEVkaXRGcm9udG1hdHRlckV4dGVybmFsTGlua3MsXG4gICAgICAgIHNob3VsZEluY2x1ZGVNdWx0aVZhbHVlRnJvbnRtYXR0ZXJFeHRlcm5hbExpbmtzOiBzaG91bGRFZGl0TXVsdGlWYWx1ZUZyb250bWF0dGVyRXh0ZXJuYWxMaW5rc1xuICAgICAgfSkpO1xuICAgICAgYWJvcnRTaWduYWwudGhyb3dJZkFib3J0ZWQoKTtcbiAgICAgIHJldHVybiBjaGFuZ2VzO1xuICAgIH0sXG4gICAgY29udGVudCxcbiAgICBwYXRoOiAnJ1xuICB9KTtcbiAgYWJvcnRTaWduYWwudGhyb3dJZkFib3J0ZWQoKTtcblxuICBhc3NlcnROb25OdWxsYWJsZShuZXdDb250ZW50LCAnRmFpbGVkIHRvIHVwZGF0ZSBsaW5rcyBpbiBjb250ZW50Jyk7XG5cbiAgcmV0dXJuIG5ld0NvbnRlbnQ7XG59XG5cbi8qKlxuICogRXh0cmFjdHMgdGhlIGZpbGUgYXNzb2NpYXRlZCB3aXRoIGEgbGluay5cbiAqXG4gKiBAcGFyYW0gcGFyYW1zIC0gVGhlIHBhcmFtZXRlcnMgZm9yIGV4dHJhY3RpbmcgdGhlIGxpbmsgZmlsZS5cbiAqIEByZXR1cm5zIFRoZSBmaWxlIGFzc29jaWF0ZWQgd2l0aCB0aGUgbGluaywgb3IgYG51bGxgIGlmIG5vdCBmb3VuZC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGV4dHJhY3RMaW5rRmlsZShwYXJhbXM6IEV4dHJhY3RMaW5rRmlsZVBhcmFtcyk6IG51bGwgfCBURmlsZSB7XG4gIGNvbnN0IHtcbiAgICBhcHAsXG4gICAgbGluayxcbiAgICBzaG91bGRBbGxvd05vbkV4aXN0aW5nRmlsZSA9IGZhbHNlLFxuICAgIHNvdXJjZVBhdGhPckZpbGVcbiAgfSA9IHBhcmFtcztcbiAgY29uc3QgeyBsaW5rUGF0aCB9ID0gc3BsaXRTdWJwYXRoKGxpbmsubGluayk7XG4gIGNvbnN0IHNvdXJjZVBhdGggPSBnZXRQYXRoKGFwcCwgc291cmNlUGF0aE9yRmlsZSk7XG4gIGNvbnN0IGZpbGUgPSBhcHAubWV0YWRhdGFDYWNoZS5nZXRGaXJzdExpbmtwYXRoRGVzdChsaW5rUGF0aCwgc291cmNlUGF0aCk7XG4gIGlmIChmaWxlKSB7XG4gICAgcmV0dXJuIGZpbGU7XG4gIH1cblxuICBpZiAoIXNob3VsZEFsbG93Tm9uRXhpc3RpbmdGaWxlKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBpZiAobGlua1BhdGguc3RhcnRzV2l0aCgnLycpKSB7XG4gICAgcmV0dXJuIGdldEZpbGUoeyBhcHAsIHBhdGhPckZpbGU6IGxpbmtQYXRoLCBzaG91bGRJbmNsdWRlTm9uRXhpc3Rpbmc6IHRydWUgfSk7XG4gIH1cblxuICBjb25zdCBmdWxsTGlua1BhdGggPSBqb2luKGRpcm5hbWUoc291cmNlUGF0aCksIGAuLyR7bGlua1BhdGh9YCk7XG5cbiAgcmV0dXJuIGZ1bGxMaW5rUGF0aC5zdGFydHNXaXRoKCcuLi8nKSA/IG51bGwgOiBnZXRGaWxlKHsgYXBwLCBwYXRoT3JGaWxlOiBmdWxsTGlua1BhdGgsIHNob3VsZEluY2x1ZGVOb25FeGlzdGluZzogdHJ1ZSB9KTtcbn1cblxuLyoqXG4gKiBHZW5lcmF0ZXMgYSBtYXJrZG93biBsaW5rIGJhc2VkIG9uIHRoZSBwcm92aWRlZCBwYXJhbWV0ZXJzLlxuICpcbiAqIEBwYXJhbSBwYXJhbXMgLSBUaGUgcGFyYW1ldGVycyBmb3IgZ2VuZXJhdGluZyB0aGUgbWFya2Rvd24gbGluay5cbiAqIEByZXR1cm5zIFRoZSBnZW5lcmF0ZWQgbWFya2Rvd24gbGluay5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdlbmVyYXRlTWFya2Rvd25MaW5rKHBhcmFtczogR2VuZXJhdGVNYXJrZG93bkxpbmtQYXJhbXMpOiBzdHJpbmcge1xuICBjb25zdCB7IGFwcCB9ID0gcGFyYW1zO1xuXG4gIGNvbnN0IERFRkFVTFRfUEFSQU1TOiBQYXJ0aWFsPEdlbmVyYXRlTWFya2Rvd25MaW5rUGFyYW1zPiA9IHtcbiAgICBpc0VtcHR5RW1iZWRBbGlhc0FsbG93ZWQ6IHRydWVcbiAgfTtcblxuICBjb25zdCBjdXN0b21EZWZhdWx0UGFyYW1zID0gZ2V0R2VuZXJhdGVNYXJrZG93bkxpbmtEZWZhdWx0UGFyYW1zRm5zKCkubWFwKChkZWZhdWx0UGFyYW1zRnVuY3Rpb24pID0+IGRlZmF1bHRQYXJhbXNGdW5jdGlvbigpKTtcbiAgLy8gU3RyaXAgZXhwbGljaXQgYHVuZGVmaW5lZGBzIGZpcnN0LCBvbiBhIGNvcHkgc28gdGhlIGNhbGxlcidzIG9iamVjdCBpcyB1bnRvdWNoZWQuXG4gIC8vIEEgY2FsbGVyIGZvcndhcmRpbmcgZXZlcnkgb3B0aW9uYWwgcGFyYW0gc2VuZHMgb3duIGtleXMgaG9sZGluZyBgdW5kZWZpbmVkYCBmb3IgdGhlIG9uZXMgaXQgZGlkIG5vdCByZWNlaXZlLlxuICAvLyBUaG9zZSBhcmUgbm90IHJlbW92ZWQgYnkgYG5vcm1hbGl6ZU9wdGlvbmFsUHJvcGVydGllc2AsIHdoaWNoIGlzIGEgdHlwZS1sZXZlbCBuby1vcC5cbiAgLy8gV2l0aG91dCB0aGUgc3RyaXAsIHN1Y2ggYSBrZXkgb3ZlcndyaXRlcyBhIGRlZmF1bHQgd2l0aCBgdW5kZWZpbmVkYCBpbnN0ZWFkIG9mIGZhbGxpbmcgdGhyb3VnaCB0byBpdC5cbiAgcGFyYW1zID0gT2JqZWN0LmFzc2lnbih7fSwgREVGQVVMVF9QQVJBTVMsIC4uLmN1c3RvbURlZmF1bHRQYXJhbXMsIHJlbW92ZVVuZGVmaW5lZFByb3BlcnRpZXM8R2VuZXJhdGVNYXJrZG93bkxpbmtQYXJhbXM+KHsgLi4ucGFyYW1zIH0pKTtcbiAgY29uc3QgdGFyZ2V0RmlsZSA9IGdldEZpbGUobm9ybWFsaXplT3B0aW9uYWxQcm9wZXJ0aWVzPEdldEZpbGVQYXJhbXM+KHsgYXBwLCBwYXRoT3JGaWxlOiBwYXJhbXMudGFyZ2V0UGF0aE9yRmlsZSwgc2hvdWxkSW5jbHVkZU5vbkV4aXN0aW5nOiBwYXJhbXMuaXNOb25FeGlzdGluZ0ZpbGVBbGxvd2VkIH0pKTtcblxuICB1c2luZyBfcmVnaXN0cmF0aW9uID0gcmVnaXN0ZXJGaWxlcyhhcHAsIFt0YXJnZXRGaWxlXSk7XG4gIHJldHVybiBnZW5lcmF0ZU1hcmtkb3duTGlua0ltcGwocGFyYW1zKTtcbn1cblxuLyoqXG4gKiBHZW5lcmF0ZXMgYSByYXcgbWFya2Rvd24gbGluayBiYXNlZCBvbiB0aGUgcHJvdmlkZWQgcGFyYW1zLlxuICpcbiAqIEBwYXJhbSBwYXJhbXMgLSBUaGUgcGFyYW1ldGVycyBmb3IgZ2VuZXJhdGluZyBhIHJhdyBtYXJrZG93biBsaW5rLlxuICogQHJldHVybnMgQSByYXcgbWFya2Rvd24gbGluay5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdlbmVyYXRlUmF3TWFya2Rvd25MaW5rKHBhcmFtczogR2VuZXJhdGVSYXdNYXJrZG93bkxpbmtQYXJhbXMpOiBzdHJpbmcge1xuICBjb25zdCBlbWJlZFByZWZpeCA9IHBhcmFtcy5pc0VtYmVkID8gJyEnIDogJyc7XG5cbiAgaWYgKHBhcmFtcy5pc1dpa2lsaW5rKSB7XG4gICAgY29uc3QgYWxpYXNQYXJ0ID0gcGFyYW1zLmFsaWFzID8gYHwke3BhcmFtcy5hbGlhc31gIDogJyc7XG4gICAgcmV0dXJuIGAke2VtYmVkUHJlZml4fVtbJHtwYXJhbXMudXJsfSR7YWxpYXNQYXJ0fV1dYDtcbiAgfVxuXG4gIGNvbnN0IGFsaWFzID0gcGFyYW1zLmFsaWFzID8/ICcnO1xuICBjb25zdCBzaG91bGRFc2NhcGVBbGlhcyA9IHBhcmFtcy5zaG91bGRFc2NhcGVBbGlhcyA/PyBmYWxzZTtcbiAgY29uc3QgZXNjYXBlZEFsaWFzID0gc2hvdWxkRXNjYXBlQWxpYXMgPyBlc2NhcGVBbGlhcyhhbGlhcykgOiBhbGlhcztcblxuICBjb25zdCB1cmwgPSBwYXJhbXMuc2hvdWxkVXNlQW5nbGVCcmFja2V0c1xuICAgID8gYDwke3BhcmFtcy51cmx9PmBcbiAgICA6IGVuY29kZVVybChwYXJhbXMudXJsKTtcblxuICBjb25zdCB0aXRsZVBhcnQgPSBwYXJhbXMudGl0bGUgPyBgICR7SlNPTi5zdHJpbmdpZnkocGFyYW1zLnRpdGxlKX1gIDogJyc7XG5cbiAgcmV0dXJuIGAke2VtYmVkUHJlZml4fVske2VzY2FwZWRBbGlhc31dKCR7dXJsfSR7dGl0bGVQYXJ0fSlgO1xufVxuXG4vKipcbiAqIFJldHVybnMgdGhlIHNoYXJlZCwgbXV0YWJsZSBsaXN0IG9mIGZ1bmN0aW9ucyB0aGF0IHByb3ZpZGUgZGVmYXVsdCBwYXJhbXMgZm9yIHtAbGluayBnZW5lcmF0ZU1hcmtkb3duTGlua30uXG4gKlxuICogRWFjaCBmdW5jdGlvbiBpcyBpbnZva2VkIG9uIGV2ZXJ5IHtAbGluayBnZW5lcmF0ZU1hcmtkb3duTGlua30gY2FsbCBhbmQgaXRzIHJlc3VsdCBpcyBtZXJnZWQgaW50byB0aGUgcGFyYW1zIChsYXRlclxuICogcmVnaXN0cmF0aW9ucyB0YWtlIHByZWNlZGVuY2Ugb3ZlciB0aGUgYnVpbHQtaW4gZGVmYXVsdHMsIGJ1dCBuZXZlciBvdmVyIGV4cGxpY2l0bHkgcGFzc2VkIHBhcmFtcykuIFJlZ2lzdGVyIGVudHJpZXNcbiAqIGJ5IGFkZGluZyBhIGBHZW5lcmF0ZU1hcmtkb3duTGlua0RlZmF1bHRQYXJhbXNDb21wb25lbnRgIHRvIGEgY29tcG9uZW50IHRyZWUgcmF0aGVyIHRoYW4gbXV0YXRpbmcgdGhpcyBsaXN0IGRpcmVjdGx5LlxuICpcbiAqIEByZXR1cm5zIFRoZSBtdXRhYmxlIGxpc3Qgb2YgZGVmYXVsdC1wYXJhbXMgZnVuY3Rpb25zLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0R2VuZXJhdGVNYXJrZG93bkxpbmtEZWZhdWx0UGFyYW1zRm5zKCk6ICgoKSA9PiBQYXJ0aWFsPEdlbmVyYXRlTWFya2Rvd25MaW5rUGFyYW1zPilbXSB7XG4gIHJldHVybiBnZXRPYnNpZGlhbkxpYlN0YXRlPCgoKSA9PiBQYXJ0aWFsPEdlbmVyYXRlTWFya2Rvd25MaW5rUGFyYW1zPilbXT4oJ2dlbmVyYXRlTWFya2Rvd25MaW5rRGVmYXVsdFBhcmFtc0ZucycsIFtdKS52YWx1ZTtcbn1cblxuLyoqXG4gKiBUZXN0cyB3aGV0aGVyIGEgbGluayB1c2VzIGFuZ2xlIGJyYWNrZXRzLCBwb3NzaWJseSBlbWJlZDpcbiAqIGBbdGl0bGVdKDxsaW5rPilgLCBgIVt0aXRsZV0oPGxpbms+KWAuXG4gKlxuICogQHBhcmFtIGxpbmsgLSBMaW5rIHRvIHRlc3RcbiAqIEByZXR1cm5zIFdoZXRoZXIgdGhlIGxpbmsgdXNlcyBhbmdsZSBicmFja2V0c1xuICovXG5leHBvcnQgZnVuY3Rpb24gaGFzQW5nbGVCcmFja2V0cyhsaW5rOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgY29uc3QgcGFyc2VMaW5rUmVzdWx0ID0gcGFyc2VMaW5rKGxpbmspO1xuICByZXR1cm4gcGFyc2VMaW5rUmVzdWx0Py5oYXNBbmdsZUJyYWNrZXRzID8/IGZhbHNlO1xufVxuXG4vKipcbiAqIFRlc3RzIHdoZXRoZXIgYSBsaW5rIGlzIGFuIGVtYmVkIGxpbms6XG4gKiBgIVtbbGlua11dYCwgYCFbdGl0bGVdKGxpbmspYC5cbiAqXG4gKiBAcGFyYW0gbGluayAtIExpbmsgdG8gdGVzdFxuICogQHJldHVybnMgV2hldGhlciB0aGUgbGluayBpcyBhbiBlbWJlZCBsaW5rXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBoYXNFbWJlZFN5bnRheChsaW5rOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgY29uc3QgcGFyc2VMaW5rUmVzdWx0ID0gcGFyc2VMaW5rKGxpbmspO1xuICByZXR1cm4gcGFyc2VMaW5rUmVzdWx0Py5pc0VtYmVkID8/IGZhbHNlO1xufVxuXG4vKipcbiAqIFRlc3RzIHdoZXRoZXIgYSBsaW5rIGhhcyBhIGxlYWRpbmcgZG90LCBwb3NzaWJseSBlbWJlZDpcbiAqIGBbWy4vbGlua11dYCwgYFt0aXRsZV0oLi9saW5rKWAsIGBbdGl0bGVdKDwuL2xpbms+KWAsXG4gKiBgIVtbLi9saW5rXV1gLCBgIVt0aXRsZV0oLi9saW5rKWAsIGAhW3RpdGxlXSg8Li9saW5rPilgLlxuICpcbiAqIEBwYXJhbSBsaW5rIC0gTGluayB0byB0ZXN0XG4gKiBAcmV0dXJucyBXaGV0aGVyIHRoZSBsaW5rIGhhcyBhIGxlYWRpbmcgZG90XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBoYXNMZWFkaW5nRG90KGxpbms6IHN0cmluZyk6IGJvb2xlYW4ge1xuICBjb25zdCBwYXJzZUxpbmtSZXN1bHQgPSBwYXJzZUxpbmsobGluayk7XG4gIHJldHVybiBwYXJzZUxpbmtSZXN1bHQ/LnVybC5zdGFydHNXaXRoKCcuLycpID8/IGZhbHNlO1xufVxuXG4vKipcbiAqIFRlc3RzIHdoZXRoZXIgYSBsaW5rIGhhcyBhIGxlYWRpbmcgc2xhc2gsIHBvc3NpYmx5IGVtYmVkOlxuICogYFtbL2xpbmtdXWAsIGBbdGl0bGVdKC9saW5rKWAsIGBbdGl0bGVdKDwvbGluaz4pYCxcbiAqIGAhW1svbGlua11dYCwgYCFbdGl0bGVdKC9saW5rKWAsIGAhW3RpdGxlXSg8L2xpbms+KWAuXG4gKlxuICogQHBhcmFtIGxpbmsgLSBMaW5rIHRvIHRlc3RcbiAqIEByZXR1cm5zIFdoZXRoZXIgdGhlIGxpbmsgaGFzIGEgbGVhZGluZyBzbGFzaFxuICovXG5leHBvcnQgZnVuY3Rpb24gaGFzTGVhZGluZ1NsYXNoKGxpbms6IHN0cmluZyk6IGJvb2xlYW4ge1xuICBjb25zdCBwYXJzZUxpbmtSZXN1bHQgPSBwYXJzZUxpbmsobGluayk7XG4gIHJldHVybiBwYXJzZUxpbmtSZXN1bHQ/LnVybC5zdGFydHNXaXRoKCcvJykgPz8gZmFsc2U7XG59XG5cbi8qKlxuICogVGVzdHMgd2hldGhlciBhIGxpbmsgaXMgYSB3aWtpbGluaywgcG9zc2libHkgZW1iZWQ6XG4gKiBgW1tsaW5rXV1gLCBgIVtbbGlua11dYC5cbiAqXG4gKiBAcGFyYW0gbGluayAtIExpbmsgdG8gdGVzdFxuICogQHJldHVybnMgV2hldGhlciB0aGUgbGluayBpcyBhIHdpa2lsaW5rXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBoYXNXaWtpbGlua1N5bnRheChsaW5rOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgY29uc3QgcGFyc2VMaW5rUmVzdWx0ID0gcGFyc2VMaW5rKGxpbmspO1xuICByZXR1cm4gcGFyc2VMaW5rUmVzdWx0Py5pc1dpa2lsaW5rID8/IGZhbHNlO1xufVxuXG4vKipcbiAqIERldGVybWluZXMgaWYgdGhlIGFsaWFzIG9mIGEgbGluayBzaG91bGQgYmUgcmVzZXQuXG4gKlxuICogQHBhcmFtIHBhcmFtcyAtIFRoZSBwYXJhbWV0ZXJzIGZvciBkZXRlcm1pbmluZyBpZiB0aGUgYWxpYXMgc2hvdWxkIGJlIHJlc2V0LlxuICogQHJldHVybnMgV2hldGhlciB0aGUgYWxpYXMgc2hvdWxkIGJlIHJlc2V0LlxuICovXG5leHBvcnQgZnVuY3Rpb24gc2hvdWxkUmVzZXRBbGlhcyhwYXJhbXM6IFNob3VsZFJlc2V0QWxpYXNQYXJhbXMpOiBib29sZWFuIHtcbiAgY29uc3Qge1xuICAgIGFwcCxcbiAgICBkaXNwbGF5VGV4dCxcbiAgICBpc1dpa2lsaW5rLFxuICAgIG5ld1NvdXJjZVBhdGhPckZpbGUsXG4gICAgb2xkU291cmNlUGF0aE9yRmlsZSxcbiAgICBvbGRUYXJnZXRQYXRoLFxuICAgIHRhcmdldFBhdGhPckZpbGVcbiAgfSA9IHBhcmFtcztcbiAgaWYgKGlzV2lraWxpbmsgPT09IGZhbHNlKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgaWYgKCFkaXNwbGF5VGV4dCkge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgY29uc3QgdGFyZ2V0RmlsZSA9IGdldEZpbGUoeyBhcHAsIHBhdGhPckZpbGU6IHRhcmdldFBhdGhPckZpbGUsIHNob3VsZEluY2x1ZGVOb25FeGlzdGluZzogdHJ1ZSB9KTtcbiAgY29uc3QgbmV3U291cmNlUGF0aCA9IGdldFBhdGgoYXBwLCBuZXdTb3VyY2VQYXRoT3JGaWxlKTtcbiAgY29uc3Qgb2xkU291cmNlUGF0aCA9IGdldFBhdGgoYXBwLCBvbGRTb3VyY2VQYXRoT3JGaWxlID8/IG5ld1NvdXJjZVBhdGhPckZpbGUpO1xuICBjb25zdCBuZXdTb3VyY2VGb2xkZXIgPSBkaXJuYW1lKG5ld1NvdXJjZVBhdGgpO1xuICBjb25zdCBvbGRTb3VyY2VGb2xkZXIgPSBkaXJuYW1lKG9sZFNvdXJjZVBhdGgpO1xuICBjb25zdCBhbGlhc2VzVG9SZXNldCA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuXG4gIGZvciAoY29uc3QgcGF0aE9yRmlsZSBvZiBbdGFyZ2V0RmlsZS5wYXRoLCBvbGRUYXJnZXRQYXRoXSkge1xuICAgIGlmICghcGF0aE9yRmlsZSkge1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgY29uc3QgcGF0aCA9IGdldFBhdGgoYXBwLCBwYXRoT3JGaWxlKTtcbiAgICBhbGlhc2VzVG9SZXNldC5hZGQocGF0aCk7XG4gICAgYWxpYXNlc1RvUmVzZXQuYWRkKGJhc2VuYW1lKHBhdGgpKTtcbiAgICBhbGlhc2VzVG9SZXNldC5hZGQocmVsYXRpdmUobmV3U291cmNlRm9sZGVyLCBwYXRoKSk7XG4gICAgYWxpYXNlc1RvUmVzZXQuYWRkKHJlbGF0aXZlKG9sZFNvdXJjZUZvbGRlciwgcGF0aCkpO1xuICB9XG5cbiAgZm9yIChjb25zdCBzb3VyY2VQYXRoIG9mIFtvbGRTb3VyY2VQYXRoLCBuZXdTb3VyY2VQYXRoXSkge1xuICAgIGFsaWFzZXNUb1Jlc2V0LmFkZChhcHAubWV0YWRhdGFDYWNoZS5maWxlVG9MaW5rdGV4dCh0YXJnZXRGaWxlLCBzb3VyY2VQYXRoLCBmYWxzZSkpO1xuICB9XG5cbiAgY29uc3QgY2xlYW5EaXNwbGF5VGV4dCA9IHJlcGxhY2VBbGwoe1xuICAgICRzdHJpbmc6IG5vcm1hbGl6ZVBhdGgoZW5zdXJlTm9uTnVsbGFibGUoZGlzcGxheVRleHQuc3BsaXQoJyA+ICcsIDEpWzBdKSksXG4gICAgcmVwbGFjZXI6ICcnLFxuICAgIHNlYXJjaFZhbHVlOiAvXlxcLlxcLy9nXG4gIH0pLnRvTG93ZXJDYXNlKCk7XG5cbiAgZm9yIChjb25zdCBhbGlhcyBvZiBhbGlhc2VzVG9SZXNldCkge1xuICAgIGlmIChhbGlhcy50b0xvd2VyQ2FzZSgpID09PSBjbGVhbkRpc3BsYXlUZXh0KSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICBjb25zdCBmb2xkZXIgPSBkaXJuYW1lKGFsaWFzKTtcbiAgICBjb25zdCBiYXNlID0gYmFzZW5hbWUoYWxpYXMsIGV4dG5hbWUoYWxpYXMpKTtcbiAgICBpZiAoam9pbihmb2xkZXIsIGJhc2UpLnRvTG93ZXJDYXNlKCkgPT09IGNsZWFuRGlzcGxheVRleHQpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBmYWxzZTtcbn1cblxuLyoqXG4gKiBTcGxpdHMgYSBsaW5rIGludG8gaXRzIGxpbmsgcGF0aCBhbmQgc3VicGF0aC5cbiAqXG4gKiBAcGFyYW0gbGluayAtIFRoZSBsaW5rIHRvIHNwbGl0LlxuICogQHJldHVybnMgQW4gb2JqZWN0IGNvbnRhaW5pbmcgdGhlIGxpbmsgcGF0aCBhbmQgc3VicGF0aC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNwbGl0U3VicGF0aChsaW5rOiBzdHJpbmcpOiBTcGxpdFN1YnBhdGhSZXN1bHQge1xuICBjb25zdCBwYXJzZWQgPSBwYXJzZUxpbmt0ZXh0KG5vcm1hbGl6ZVN0cmluZyhsaW5rKSk7XG4gIHJldHVybiB7XG4gICAgbGlua1BhdGg6IHBhcnNlZC5wYXRoLFxuICAgIHN1YnBhdGg6IHBhcnNlZC5zdWJwYXRoXG4gIH07XG59XG5cbi8qKlxuICogTm9ybWFsaXplcyB0aGUgYGZpbGU6Ly9gIGxpbmtzIGluIGEgY29udGVudCBzdHJpbmcgdG8gYSBwcmV0dHkgZm9ybSwgY29udmVydGluZyBiYWNrc2xhc2hlcyB0byBmb3J3YXJkXG4gKiBzbGFzaGVzLiBPdGhlciBsaW5rcyBhcmUgbGVmdCB1bmNoYW5nZWQuXG4gKlxuICogQHBhcmFtIHBhcmFtcyAtIFRoZSBwYXJhbWV0ZXJzIGZvciBub3JtYWxpemluZyB0aGUgbGlua3MuXG4gKiBAcmV0dXJucyBBIHtAbGluayBQcm9taXNlfSB0aGF0IHJlc29sdmVzIHRvIHRoZSBjb250ZW50IHdpdGggbm9ybWFsaXplZCBgZmlsZTovL2AgbGlua3MuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiB1cGRhdGVGaWxlVXJsTGlua3NJbkNvbnRlbnQocGFyYW1zOiBVcGRhdGVGaWxlVXJsTGlua3NJbkNvbnRlbnRQYXJhbXMpOiBQcm9taXNlPHN0cmluZz4ge1xuICBjb25zdCB7IGFwcCwgY29udGVudCwgb2Zmc2V0UmFuZ2UsIHNob3VsZFVzZUFuZ2xlQnJhY2tldHMgPSBmYWxzZSB9ID0gcGFyYW1zO1xuICByZXR1cm4gYXdhaXQgZWRpdExpbmtzSW5Db250ZW50KG5vcm1hbGl6ZU9wdGlvbmFsUHJvcGVydGllczxFZGl0TGlua3NJbkNvbnRlbnRQYXJhbXM+KHtcbiAgICBhYm9ydFNpZ25hbDogcGFyYW1zLmFib3J0U2lnbmFsLFxuICAgIGFwcCxcbiAgICBjb250ZW50LFxuICAgIGxpbmtDb252ZXJ0ZXI6IChsaW5rKSA9PiBub3JtYWxpemVGaWxlVXJsTGluayhsaW5rLCBzaG91bGRVc2VBbmdsZUJyYWNrZXRzKSxcbiAgICBvZmZzZXRSYW5nZSxcbiAgICBzaG91bGRFZGl0RXh0ZXJuYWxMaW5rczogdHJ1ZSxcbiAgICBzaG91bGRFZGl0RnJvbnRtYXR0ZXJFeHRlcm5hbExpbmtzOiB0cnVlLFxuICAgIHNob3VsZEVkaXRNdWx0aVZhbHVlRnJvbnRtYXR0ZXJFeHRlcm5hbExpbmtzOiB0cnVlXG4gIH0pKTtcbn1cblxuLyoqXG4gKiBOb3JtYWxpemVzIHRoZSBgZmlsZTovL2AgbGlua3MgaW4gYSBmaWxlIHRvIGEgcHJldHR5IGZvcm0sIGNvbnZlcnRpbmcgYmFja3NsYXNoZXMgdG8gZm9yd2FyZCBzbGFzaGVzLlxuICogT3RoZXIgbGlua3MgYXJlIGxlZnQgdW5jaGFuZ2VkLlxuICpcbiAqIEBwYXJhbSBwYXJhbXMgLSBUaGUgcGFyYW1ldGVycyBmb3Igbm9ybWFsaXppbmcgdGhlIGxpbmtzLlxuICogQHJldHVybnMgQSB7QGxpbmsgUHJvbWlzZX0gdGhhdCByZXNvbHZlcyB3aGVuIHRoZSBsaW5rcyBhcmUgbm9ybWFsaXplZC5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHVwZGF0ZUZpbGVVcmxMaW5rc0luRmlsZShwYXJhbXM6IFVwZGF0ZUZpbGVVcmxMaW5rc0luRmlsZVBhcmFtcyk6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCB7XG4gICAgYXBwLFxuICAgIG9mZnNldFJhbmdlLFxuICAgIHBhdGhPckZpbGUsXG4gICAgc2hvdWxkVXNlQW5nbGVCcmFja2V0cyA9IGZhbHNlLFxuICAgIC4uLm9wdGlvbnNcbiAgfSA9IHBhcmFtcztcbiAgYXdhaXQgZWRpdExpbmtzKG5vcm1hbGl6ZU9wdGlvbmFsUHJvcGVydGllczxFZGl0TGlua3NQYXJhbXM+KHtcbiAgICBhcHAsXG4gICAgbGlua0NvbnZlcnRlcjogKGxpbmspID0+IG5vcm1hbGl6ZUZpbGVVcmxMaW5rKGxpbmssIHNob3VsZFVzZUFuZ2xlQnJhY2tldHMpLFxuICAgIC8vIEZvcndhcmRlZCBieSBuYW1lIHJhdGhlciB0aGFuIHRocm91Z2ggYG9wdGlvbnNgLCBzbyBhIGxhdGVyIHJlZmFjdG9yIGNhbm5vdCBkcm9wIGl0IHNpbGVudGx5LlxuICAgIG9mZnNldFJhbmdlLFxuICAgIHBhdGhPckZpbGUsXG4gICAgc2hvdWxkRWRpdEV4dGVybmFsTGlua3M6IHRydWUsXG4gICAgc2hvdWxkRWRpdEZyb250bWF0dGVyRXh0ZXJuYWxMaW5rczogdHJ1ZSxcbiAgICBzaG91bGRFZGl0TXVsdGlWYWx1ZUZyb250bWF0dGVyRXh0ZXJuYWxMaW5rczogdHJ1ZSxcbiAgICAuLi5vcHRpb25zXG4gIH0pKTtcbn1cblxuLyoqXG4gKiBVcGRhdGVzIGEgbGluayBiYXNlZCBvbiB0aGUgcHJvdmlkZWQgcGFyYW1ldGVycy5cbiAqXG4gKiBAcGFyYW0gcGFyYW1zIC0gVGhlIHBhcmFtZXRlcnMgZm9yIHVwZGF0aW5nIHRoZSBsaW5rLlxuICogQHJldHVybnMgVGhlIHVwZGF0ZWQgbGluay5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHVwZGF0ZUxpbmsocGFyYW1zOiBVcGRhdGVMaW5rUGFyYW1zKTogc3RyaW5nIHtcbiAgY29uc3Qge1xuICAgIGFwcCxcbiAgICBpc0VtcHR5RW1iZWRBbGlhc0FsbG93ZWQsXG4gICAgbGluayxcbiAgICBsaW5rUGF0aFN0eWxlLFxuICAgIGxpbmtTdHlsZSxcbiAgICBuZXdTb3VyY2VQYXRoT3JGaWxlLFxuICAgIG5ld1RhcmdldFBhdGhPckZpbGUsXG4gICAgb2xkU291cmNlUGF0aE9yRmlsZSxcbiAgICBvbGRUYXJnZXRQYXRoT3JGaWxlLFxuICAgIHNob3VsZEVzY2FwZUFsaWFzLFxuICAgIHNob3VsZEluY2x1ZGVBdHRhY2htZW50RXh0ZW5zaW9uVG9FbWJlZEFsaWFzLFxuICAgIHNob3VsZFVwZGF0ZUZpbGVOYW1lQWxpYXMgPSB0cnVlLFxuICAgIHNob3VsZFVzZUFuZ2xlQnJhY2tldHMsXG4gICAgc2hvdWxkVXNlTGVhZGluZ0RvdEZvclJlbGF0aXZlUGF0aHMsXG4gICAgc2hvdWxkVXNlTGVhZGluZ1NsYXNoRm9yQWJzb2x1dGVQYXRoc1xuICB9ID0gcGFyYW1zO1xuICBpZiAoIW5ld1RhcmdldFBhdGhPckZpbGUpIHtcbiAgICByZXR1cm4gbGluay5vcmlnaW5hbDtcbiAgfVxuICBjb25zdCBuZXdUYXJnZXRGaWxlID0gZ2V0RmlsZSh7IGFwcCwgcGF0aE9yRmlsZTogbmV3VGFyZ2V0UGF0aE9yRmlsZSwgc2hvdWxkSW5jbHVkZU5vbkV4aXN0aW5nOiB0cnVlIH0pO1xuICBjb25zdCBvbGRTb3VyY2VQYXRoID0gZ2V0UGF0aChhcHAsIG9sZFNvdXJjZVBhdGhPckZpbGUgPz8gbmV3U291cmNlUGF0aE9yRmlsZSk7XG4gIGNvbnN0IG9sZFRhcmdldFBhdGggPSBnZXRQYXRoKGFwcCwgb2xkVGFyZ2V0UGF0aE9yRmlsZSA/PyBuZXdUYXJnZXRQYXRoT3JGaWxlKTtcbiAgY29uc3QgaXNXaWtpbGluayA9IHNob3VsZFVzZVdpa2lsaW5rU3R5bGUobm9ybWFsaXplT3B0aW9uYWxQcm9wZXJ0aWVzPFNob3VsZFVzZVdpa2lsaW5rU3R5bGVQYXJhbXM+KHtcbiAgICBhcHAsXG4gICAgbGlua1N0eWxlLFxuICAgIG9yaWdpbmFsTGluazogbGluay5vcmlnaW5hbFxuICB9KSk7XG5cbiAgY29uc3QgeyBzdWJwYXRoIH0gPSBzcGxpdFN1YnBhdGgobGluay5saW5rKTtcblxuICAvKiB2OCBpZ25vcmUgc3RhcnQgLS0gQ2FudmFzIGZpbGUgbm9kZSByZWZlcmVuY2UgYnJhbmNoIGlzIGhhcmQgdG8gcmVwcm9kdWNlIGluIHVuaXQgdGVzdHMuICovXG4gIGlmIChpc0NhbnZhc0ZpbGUobmV3U291cmNlUGF0aE9yRmlsZSkgJiYgaXNDYW52YXNGaWxlTm9kZVJlZmVyZW5jZShsaW5rKSkge1xuICAgIHJldHVybiBuZXdUYXJnZXRGaWxlLnBhdGggKyBzdWJwYXRoO1xuXG4gICAgLyogdjggaWdub3JlIHN0b3AgKi9cbiAgfVxuXG4gIGNvbnN0IHBhcnNlTGlua1Jlc3VsdCA9IHBhcnNlTGluayhsaW5rLm9yaWdpbmFsKTtcbiAgbGV0IGFsaWFzOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG5cbiAgaWYgKGlzV2lraWxpbmsgJiYgcGFyc2VMaW5rUmVzdWx0Py5hbGlhcykge1xuICAgIGFsaWFzID0gcGFyc2VMaW5rUmVzdWx0LmFsaWFzO1xuICB9XG5cbiAgYWxpYXMgPz89IHNob3VsZFJlc2V0QWxpYXMobm9ybWFsaXplT3B0aW9uYWxQcm9wZXJ0aWVzPFNob3VsZFJlc2V0QWxpYXNQYXJhbXM+KHtcbiAgICAgIGFwcCxcbiAgICAgIGRpc3BsYXlUZXh0OiBsaW5rLmRpc3BsYXlUZXh0LFxuICAgICAgaXNXaWtpbGluayxcbiAgICAgIG5ld1NvdXJjZVBhdGhPckZpbGUsXG4gICAgICBvbGRTb3VyY2VQYXRoT3JGaWxlLFxuICAgICAgb2xkVGFyZ2V0UGF0aCxcbiAgICAgIHRhcmdldFBhdGhPckZpbGU6IG5ld1RhcmdldEZpbGVcbiAgICB9KSlcbiAgICA/IHVuZGVmaW5lZFxuICAgIDogcGFyc2VMaW5rUmVzdWx0Py5hbGlhcztcblxuICAvLyBSZWZyZXNoIGEgZmlsZS1uYW1lIGFsaWFzIHRvIHRoZSBuZXcgYmFzZSBuYW1lIHdoZW4gdGhlIGZsYWcgaXMgc2V0LlxuICAvLyBBIGZpbGUtbmFtZSBhbGlhcyBlcXVhbHMgdGhlIE9MRCBiYXNlIG5hbWUgKHdpdGggb3Igd2l0aG91dCBleHRlbnNpb24pOyBhIGN1c3RvbSBhbGlhcyBpcyBrZXB0LlxuICAvLyBHYXRpbmcgb24gdGhlIGZsYWcgYWxzbyByZWZyZXNoZXMgd2lraWxpbmtzIHRoYXQgY2FycnkgYW4gZXhwbGljaXQgYWxpYXMuXG4gIC8vIFRob3NlIHByZXZpb3VzbHkgc2hvcnQtY2lyY3VpdGVkIHRoZSByZWZyZXNoIGFuZCBrZXB0IHRoZSBzdGFsZSBvbGQgYmFzZSBuYW1lLlxuICBpZiAoc2hvdWxkVXBkYXRlRmlsZU5hbWVBbGlhcykge1xuICAgIGlmIChhbGlhcyA9PT0gYmFzZW5hbWUob2xkVGFyZ2V0UGF0aCwgZXh0bmFtZShvbGRUYXJnZXRQYXRoKSkpIHtcbiAgICAgIGFsaWFzID0gbmV3VGFyZ2V0RmlsZS5iYXNlbmFtZTtcbiAgICB9IGVsc2UgaWYgKGFsaWFzID09PSBiYXNlbmFtZShvbGRUYXJnZXRQYXRoKSkge1xuICAgICAgYWxpYXMgPSBuZXdUYXJnZXRGaWxlLm5hbWU7XG4gICAgfVxuICB9XG5cbiAgY29uc3QgbmV3TGluayA9IGdlbmVyYXRlTWFya2Rvd25MaW5rKG5vcm1hbGl6ZU9wdGlvbmFsUHJvcGVydGllczxHZW5lcmF0ZU1hcmtkb3duTGlua1BhcmFtcz4oe1xuICAgIGFsaWFzLFxuICAgIGFwcCxcbiAgICBpc0VtcHR5RW1iZWRBbGlhc0FsbG93ZWQsXG4gICAgaXNTaW5nbGVTdWJwYXRoQWxsb3dlZDogb2xkU291cmNlUGF0aCA9PT0gb2xkVGFyZ2V0UGF0aCAmJiAhIXBhcnNlTGlua1Jlc3VsdD8uYWxpYXMsXG4gICAgbGlua1BhdGhTdHlsZSxcbiAgICBsaW5rU3R5bGUsXG4gICAgb3JpZ2luYWxMaW5rOiBsaW5rLm9yaWdpbmFsLFxuICAgIHNob3VsZEVzY2FwZUFsaWFzLFxuICAgIHNob3VsZEluY2x1ZGVBdHRhY2htZW50RXh0ZW5zaW9uVG9FbWJlZEFsaWFzLFxuICAgIHNob3VsZFVzZUFuZ2xlQnJhY2tldHMsXG4gICAgc2hvdWxkVXNlTGVhZGluZ0RvdEZvclJlbGF0aXZlUGF0aHMsXG4gICAgc2hvdWxkVXNlTGVhZGluZ1NsYXNoRm9yQWJzb2x1dGVQYXRocyxcbiAgICBzb3VyY2VQYXRoT3JGaWxlOiBuZXdTb3VyY2VQYXRoT3JGaWxlLFxuICAgIHN1YnBhdGgsXG4gICAgdGFyZ2V0UGF0aE9yRmlsZTogbmV3VGFyZ2V0RmlsZVxuICB9KSk7XG4gIHJldHVybiBuZXdMaW5rO1xufVxuXG4vKipcbiAqIFVwZGF0ZXMgdGhlIGxpbmtzIGluIGEgY29udGVudCBzdHJpbmcgYmFzZWQgb24gdGhlIHByb3ZpZGVkIHBhcmFtZXRlcnMuXG4gKlxuICogQHBhcmFtIHBhcmFtcyAtIFRoZSBwYXJhbWV0ZXJzIGZvciB1cGRhdGluZyB0aGUgbGlua3MuXG4gKiBAcmV0dXJucyBBIHtAbGluayBQcm9taXNlfSB0aGF0IHJlc29sdmVzIHRvIHRoZSBjb250ZW50IHdpdGggdXBkYXRlZCBsaW5rcy5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHVwZGF0ZUxpbmtzSW5Db250ZW50KHBhcmFtczogVXBkYXRlTGlua3NJbkNvbnRlbnRQYXJhbXMpOiBQcm9taXNlPHN0cmluZz4ge1xuICBjb25zdCB7XG4gICAgYXBwLFxuICAgIGNvbnRlbnQsXG4gICAgaXNFbXB0eUVtYmVkQWxpYXNBbGxvd2VkLFxuICAgIGxpbmtQYXRoU3R5bGUsXG4gICAgbGlua1N0eWxlLFxuICAgIGxpbmtTdHlsZVByb3ZpZGVyLFxuICAgIG5ld1NvdXJjZVBhdGhPckZpbGUsXG4gICAgb2Zmc2V0UmFuZ2UsXG4gICAgb2xkU291cmNlUGF0aE9yRmlsZSxcbiAgICBzaG91bGRFc2NhcGVBbGlhcyxcbiAgICBzaG91bGRJbmNsdWRlQXR0YWNobWVudEV4dGVuc2lvblRvRW1iZWRBbGlhcyxcbiAgICBzaG91bGRVcGRhdGVFbWJlZE9ubHlMaW5rcyxcbiAgICBzaG91bGRVcGRhdGVGaWxlTmFtZUFsaWFzLFxuICAgIHNob3VsZFVzZUFuZ2xlQnJhY2tldHMsXG4gICAgc2hvdWxkVXNlTGVhZGluZ0RvdEZvclJlbGF0aXZlUGF0aHMsXG4gICAgc2hvdWxkVXNlTGVhZGluZ1NsYXNoRm9yQWJzb2x1dGVQYXRoc1xuICB9ID0gcGFyYW1zO1xuXG4gIHJldHVybiBhd2FpdCBlZGl0TGlua3NJbkNvbnRlbnQobm9ybWFsaXplT3B0aW9uYWxQcm9wZXJ0aWVzPEVkaXRMaW5rc0luQ29udGVudFBhcmFtcz4oe1xuICAgIGFwcCxcbiAgICBjb250ZW50LFxuICAgIGxpbmtDb252ZXJ0ZXI6IChsaW5rKSA9PiB7XG4gICAgICBjb25zdCBpc0VtYmVkTGluayA9IGhhc0VtYmVkU3ludGF4KGxpbmsub3JpZ2luYWwpO1xuICAgICAgcmV0dXJuIHNob3VsZFVwZGF0ZUVtYmVkT25seUxpbmtzICE9PSB1bmRlZmluZWQgJiYgc2hvdWxkVXBkYXRlRW1iZWRPbmx5TGlua3MgIT09IGlzRW1iZWRMaW5rXG4gICAgICAgID8gdW5kZWZpbmVkXG4gICAgICAgIDogY29udmVydExpbmsobm9ybWFsaXplT3B0aW9uYWxQcm9wZXJ0aWVzPENvbnZlcnRMaW5rUGFyYW1zPih7XG4gICAgICAgICAgYXBwLFxuICAgICAgICAgIGlzRW1wdHlFbWJlZEFsaWFzQWxsb3dlZCxcbiAgICAgICAgICBsaW5rLFxuICAgICAgICAgIGxpbmtQYXRoU3R5bGUsXG4gICAgICAgICAgbGlua1N0eWxlOiBsaW5rU3R5bGVQcm92aWRlcj8uKGxpbmspID8/IGxpbmtTdHlsZSxcbiAgICAgICAgICBuZXdTb3VyY2VQYXRoT3JGaWxlLFxuICAgICAgICAgIG9sZFNvdXJjZVBhdGhPckZpbGUsXG4gICAgICAgICAgc2hvdWxkRXNjYXBlQWxpYXMsXG4gICAgICAgICAgc2hvdWxkSW5jbHVkZUF0dGFjaG1lbnRFeHRlbnNpb25Ub0VtYmVkQWxpYXMsXG4gICAgICAgICAgc2hvdWxkVXBkYXRlRmlsZU5hbWVBbGlhcyxcbiAgICAgICAgICBzaG91bGRVc2VBbmdsZUJyYWNrZXRzLFxuICAgICAgICAgIHNob3VsZFVzZUxlYWRpbmdEb3RGb3JSZWxhdGl2ZVBhdGhzLFxuICAgICAgICAgIHNob3VsZFVzZUxlYWRpbmdTbGFzaEZvckFic29sdXRlUGF0aHNcbiAgICAgICAgfSkpO1xuICAgIH0sXG4gICAgb2Zmc2V0UmFuZ2VcbiAgfSkpO1xufVxuXG4vKipcbiAqIFVwZGF0ZXMgdGhlIGxpbmtzIGluIGEgZmlsZSBiYXNlZCBvbiB0aGUgcHJvdmlkZWQgcGFyYW1ldGVycy5cbiAqXG4gKiBAcGFyYW0gcGFyYW1zIC0gVGhlIHBhcmFtZXRlcnMgZm9yIHVwZGF0aW5nIHRoZSBsaW5rcy5cbiAqIEByZXR1cm5zIEEge0BsaW5rIFByb21pc2V9IHRoYXQgcmVzb2x2ZXMgd2hlbiB0aGUgbGlua3MgYXJlIHVwZGF0ZWQuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiB1cGRhdGVMaW5rc0luRmlsZShwYXJhbXM6IFVwZGF0ZUxpbmtzSW5GaWxlUGFyYW1zKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IHtcbiAgICBhcHAsXG4gICAgaXNFbXB0eUVtYmVkQWxpYXNBbGxvd2VkLFxuICAgIGxpbmtQYXRoU3R5bGUsXG4gICAgbGlua1N0eWxlLFxuICAgIGxpbmtTdHlsZVByb3ZpZGVyLFxuICAgIG5ld1NvdXJjZVBhdGhPckZpbGUsXG4gICAgb2Zmc2V0UmFuZ2UsXG4gICAgb2xkU291cmNlUGF0aE9yRmlsZSxcbiAgICBzaG91bGRFc2NhcGVBbGlhcyxcbiAgICBzaG91bGRJbmNsdWRlQXR0YWNobWVudEV4dGVuc2lvblRvRW1iZWRBbGlhcyxcbiAgICBzaG91bGRVcGRhdGVFbWJlZE9ubHlMaW5rcyxcbiAgICBzaG91bGRVcGRhdGVGaWxlTmFtZUFsaWFzLFxuICAgIHNob3VsZFVzZUFuZ2xlQnJhY2tldHMsXG4gICAgc2hvdWxkVXNlTGVhZGluZ0RvdEZvclJlbGF0aXZlUGF0aHMsXG4gICAgc2hvdWxkVXNlTGVhZGluZ1NsYXNoRm9yQWJzb2x1dGVQYXRoc1xuICB9ID0gcGFyYW1zO1xuXG4gIGlmIChpc0NhbnZhc0ZpbGUobmV3U291cmNlUGF0aE9yRmlsZSkgJiYgIWFwcC5pbnRlcm5hbFBsdWdpbnMuZ2V0RW5hYmxlZFBsdWdpbkJ5SWQoSW50ZXJuYWxQbHVnaW5OYW1lLkNhbnZhcykpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICBhd2FpdCBlZGl0TGlua3Mobm9ybWFsaXplT3B0aW9uYWxQcm9wZXJ0aWVzPEVkaXRMaW5rc1BhcmFtcz4oe1xuICAgIC4uLnBhcmFtcyxcbiAgICBsaW5rQ29udmVydGVyOiAobGluaykgPT4ge1xuICAgICAgY29uc3QgaXNFbWJlZExpbmsgPSBoYXNFbWJlZFN5bnRheChsaW5rLm9yaWdpbmFsKTtcbiAgICAgIHJldHVybiBzaG91bGRVcGRhdGVFbWJlZE9ubHlMaW5rcyAhPT0gdW5kZWZpbmVkICYmIHNob3VsZFVwZGF0ZUVtYmVkT25seUxpbmtzICE9PSBpc0VtYmVkTGlua1xuICAgICAgICA/IHVuZGVmaW5lZFxuICAgICAgICA6IGNvbnZlcnRMaW5rKG5vcm1hbGl6ZU9wdGlvbmFsUHJvcGVydGllczxDb252ZXJ0TGlua1BhcmFtcz4oe1xuICAgICAgICAgIGFwcCxcbiAgICAgICAgICBpc0VtcHR5RW1iZWRBbGlhc0FsbG93ZWQsXG4gICAgICAgICAgbGluayxcbiAgICAgICAgICBsaW5rUGF0aFN0eWxlLFxuICAgICAgICAgIGxpbmtTdHlsZTogbGlua1N0eWxlUHJvdmlkZXI/LihsaW5rKSA/PyBsaW5rU3R5bGUsXG4gICAgICAgICAgbmV3U291cmNlUGF0aE9yRmlsZSxcbiAgICAgICAgICBvbGRTb3VyY2VQYXRoT3JGaWxlLFxuICAgICAgICAgIHNob3VsZEVzY2FwZUFsaWFzLFxuICAgICAgICAgIHNob3VsZEluY2x1ZGVBdHRhY2htZW50RXh0ZW5zaW9uVG9FbWJlZEFsaWFzLFxuICAgICAgICAgIHNob3VsZFVwZGF0ZUZpbGVOYW1lQWxpYXMsXG4gICAgICAgICAgc2hvdWxkVXNlQW5nbGVCcmFja2V0cyxcbiAgICAgICAgICBzaG91bGRVc2VMZWFkaW5nRG90Rm9yUmVsYXRpdmVQYXRocyxcbiAgICAgICAgICBzaG91bGRVc2VMZWFkaW5nU2xhc2hGb3JBYnNvbHV0ZVBhdGhzXG4gICAgICAgIH0pKTtcbiAgICB9LFxuICAgIC8vIE5hbWVkIGJlc2lkZSB0aGUgYC4uLnBhcmFtc2Agc3ByZWFkLCBzbyBhIGxhdGVyIHJlZmFjdG9yIHRvIGV4cGxpY2l0IGZvcndhcmRpbmcgY2Fubm90IGRyb3AgaXQgc2lsZW50bHkuXG4gICAgb2Zmc2V0UmFuZ2UsXG4gICAgcGF0aE9yRmlsZTogbmV3U291cmNlUGF0aE9yRmlsZVxuICB9KSk7XG59XG5cbmZ1bmN0aW9uIGRlZmF1bHRMaW5rSWRlbnRpdHlLZXlQcm92aWRlcihsaW5rOiBSZWZlcmVuY2UpOiBzdHJpbmcge1xuICByZXR1cm4gSlNPTi5zdHJpbmdpZnkobGluayk7XG59XG5cbmZ1bmN0aW9uIGdlbmVyYXRlTGlua1RleHQocGFyYW1zOiBHZW5lcmF0ZUxpbmtUZXh0UGFyYW1zKTogc3RyaW5nIHtcbiAgY29uc3QgeyBhcHAsIGNvbmZpZywgc3VicGF0aCwgdGFyZ2V0RmlsZSB9ID0gcGFyYW1zO1xuICBsZXQgeyBzb3VyY2VQYXRoIH0gPSBwYXJhbXM7XG4gIGlmIChzb3VyY2VQYXRoID09PSAnLycpIHtcbiAgICBzb3VyY2VQYXRoID0gJyc7XG4gIH1cblxuICBsZXQgbGlua1RleHQ6IHN0cmluZztcblxuICBpZiAodGFyZ2V0RmlsZS5wYXRoID09PSBzb3VyY2VQYXRoICYmIHN1YnBhdGggJiYgY29uZmlnLmlzU2luZ2xlU3VicGF0aEFsbG93ZWQpIHtcbiAgICBsaW5rVGV4dCA9ICcnO1xuICB9IGVsc2Uge1xuICAgIC8qIHY4IGlnbm9yZSBzdGFydCAtLSBBbGwgYnJhbmNoZXMgY292ZXJlZCBidXQgdjggcmVwb3J0cyBzd2l0Y2ggYXMgcGFydGlhbC4gKi9cbiAgICBzd2l0Y2ggKGNvbmZpZy5saW5rUGF0aFN0eWxlKSB7XG4gICAgICAvKiB2OCBpZ25vcmUgc3RvcCAqL1xuICAgICAgY2FzZSBGaW5hbExpbmtQYXRoU3R5bGUuQWJzb2x1dGVQYXRoSW5WYXVsdDoge1xuICAgICAgICBsaW5rVGV4dCA9IHRhcmdldEZpbGUucGF0aDtcbiAgICAgICAgaWYgKGNvbmZpZy5zaG91bGRVc2VMZWFkaW5nU2xhc2hGb3JBYnNvbHV0ZVBhdGhzICYmICFsaW5rVGV4dC5zdGFydHNXaXRoKCcvJykpIHtcbiAgICAgICAgICBsaW5rVGV4dCA9IGAvJHtsaW5rVGV4dH1gO1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgY2FzZSBGaW5hbExpbmtQYXRoU3R5bGUuUmVsYXRpdmVQYXRoVG9UaGVTb3VyY2U6IHtcbiAgICAgICAgbGlua1RleHQgPSByZWxhdGl2ZShkaXJuYW1lKHNvdXJjZVBhdGgpLCB0YXJnZXRGaWxlLnBhdGgpO1xuICAgICAgICBpZiAoY29uZmlnLnNob3VsZFVzZUxlYWRpbmdEb3RGb3JSZWxhdGl2ZVBhdGhzICYmICFsaW5rVGV4dC5zdGFydHNXaXRoKCcuJykpIHtcbiAgICAgICAgICBsaW5rVGV4dCA9IGAuLyR7bGlua1RleHR9YDtcbiAgICAgICAgfVxuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIGNhc2UgRmluYWxMaW5rUGF0aFN0eWxlLlNob3J0ZXN0UGF0aFdoZW5Qb3NzaWJsZToge1xuICAgICAgICBjb25zdCBzaG9ydGVzdE5hbWUgPSBpc01hcmtkb3duRmlsZSh0YXJnZXRGaWxlKSA/IHRhcmdldEZpbGUuYmFzZW5hbWUgOiB0YXJnZXRGaWxlLm5hbWU7XG4gICAgICAgIGNvbnN0IG1hdGNoZWRGaWxlcyA9IGFwcC5tZXRhZGF0YUNhY2hlLmdldExpbmtwYXRoRGVzdChzaG9ydGVzdE5hbWUsIHNvdXJjZVBhdGgpO1xuICAgICAgICBsaW5rVGV4dCA9IG1hdGNoZWRGaWxlcy5sZW5ndGggPT09IDEgJiYgbWF0Y2hlZEZpbGVzWzBdID09PSB0YXJnZXRGaWxlID8gdGFyZ2V0RmlsZS5uYW1lIDogdGFyZ2V0RmlsZS5wYXRoO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIC8qIHY4IGlnbm9yZSBzdGFydCAtLSBBbGwgdmFsaWQgRmluYWxMaW5rUGF0aFN0eWxlIHZhbHVlcyBhcmUgaGFuZGxlZCBhYm92ZS4gKi9cbiAgICAgIGRlZmF1bHQ6IHtcbiAgICAgICAgYXNzZXJ0TmV2ZXIoY29uZmlnLmxpbmtQYXRoU3R5bGUpO1xuICAgICAgfVxuICAgICAgICAvKiB2OCBpZ25vcmUgc3RvcCAqL1xuICAgIH1cbiAgfVxuXG4gIGxpbmtUZXh0ID0gY29uZmlnLmlzV2lraWxpbmtcbiAgICA/IHRyaW1FbmQoe1xuICAgICAgJHN0cmluZzogbGlua1RleHQsXG4gICAgICBzdWZmaXg6IGAuJHtNQVJLRE9XTl9GSUxFX0VYVEVOU0lPTn1gXG4gICAgfSlcbiAgICA6IGxpbmtUZXh0O1xuICBsaW5rVGV4dCArPSBzdWJwYXRoO1xuXG4gIHJldHVybiBsaW5rVGV4dDtcbn1cblxuZnVuY3Rpb24gZ2VuZXJhdGVNYXJrZG93bkxpbmtJbXBsKHBhcmFtczogR2VuZXJhdGVNYXJrZG93bkxpbmtQYXJhbXMpOiBzdHJpbmcge1xuICBjb25zdCB7IGFwcCB9ID0gcGFyYW1zO1xuICBjb25zdCB0YXJnZXRGaWxlID0gZ2V0RmlsZShub3JtYWxpemVPcHRpb25hbFByb3BlcnRpZXM8R2V0RmlsZVBhcmFtcz4oeyBhcHAsIHBhdGhPckZpbGU6IHBhcmFtcy50YXJnZXRQYXRoT3JGaWxlLCBzaG91bGRJbmNsdWRlTm9uRXhpc3Rpbmc6IHBhcmFtcy5pc05vbkV4aXN0aW5nRmlsZUFsbG93ZWQgfSkpO1xuICBjb25zdCBzb3VyY2VQYXRoID0gZ2V0UGF0aChhcHAsIHBhcmFtcy5zb3VyY2VQYXRoT3JGaWxlKTtcbiAgY29uc3Qgc3VicGF0aCA9IHBhcmFtcy5zdWJwYXRoID8/ICcnO1xuXG4gIGNvbnN0IGxpbmtDb25maWcgPSBnZXRMaW5rQ29uZmlnKHBhcmFtcyk7XG4gIGNvbnN0IGxpbmtUZXh0ID0gZ2VuZXJhdGVMaW5rVGV4dCh7XG4gICAgYXBwLFxuICAgIGNvbmZpZzogbGlua0NvbmZpZyxcbiAgICBzb3VyY2VQYXRoLFxuICAgIHN1YnBhdGgsXG4gICAgdGFyZ2V0RmlsZVxuICB9KTtcblxuICByZXR1cm4gbGlua0NvbmZpZy5pc1dpa2lsaW5rXG4gICAgPyBnZW5lcmF0ZVdpa2lMaW5rKHtcbiAgICAgIGFsaWFzOiBwYXJhbXMuYWxpYXMsXG4gICAgICBpc0VtYmVkOiBsaW5rQ29uZmlnLmlzRW1iZWQsXG4gICAgICBsaW5rVGV4dFxuICAgIH0pXG4gICAgOiBnZW5lcmF0ZU1hcmtkb3duU3R5bGVMaW5rKHtcbiAgICAgIGNvbmZpZzogbGlua0NvbmZpZyxcbiAgICAgIGxpbmtUZXh0LFxuICAgICAgbWFya2Rvd25MaW5rUGFyYW1zOiBwYXJhbXMsXG4gICAgICB0YXJnZXRGaWxlXG4gICAgfSk7XG59XG5cbmZ1bmN0aW9uIGdlbmVyYXRlTWFya2Rvd25TdHlsZUxpbmsocGFyYW1zOiBHZW5lcmF0ZU1hcmtkb3duU3R5bGVMaW5rUGFyYW1zKTogc3RyaW5nIHtcbiAgY29uc3QgeyBjb25maWcsIGxpbmtUZXh0LCBtYXJrZG93bkxpbmtQYXJhbXMsIHRhcmdldEZpbGUgfSA9IHBhcmFtcztcbiAgbGV0IGFsaWFzID0gbWFya2Rvd25MaW5rUGFyYW1zLmFsaWFzID8/ICcnO1xuICBsZXQgc2hvdWxkRXNjYXBlQWxpYXMgPSBtYXJrZG93bkxpbmtQYXJhbXMuc2hvdWxkRXNjYXBlQWxpYXMgPz8gZmFsc2U7XG4gIGlmICghYWxpYXMgJiYgKGlzTWFya2Rvd25GaWxlKHRhcmdldEZpbGUpIHx8ICFtYXJrZG93bkxpbmtQYXJhbXMuaXNFbXB0eUVtYmVkQWxpYXNBbGxvd2VkKSkge1xuICAgIGFsaWFzID0gIW1hcmtkb3duTGlua1BhcmFtcy5zaG91bGRJbmNsdWRlQXR0YWNobWVudEV4dGVuc2lvblRvRW1iZWRBbGlhcyB8fCBpc01hcmtkb3duRmlsZSh0YXJnZXRGaWxlKVxuICAgICAgPyB0YXJnZXRGaWxlLmJhc2VuYW1lXG4gICAgICA6IHRhcmdldEZpbGUubmFtZTtcbiAgICBzaG91bGRFc2NhcGVBbGlhcyA9IHRydWU7XG4gIH1cblxuICByZXR1cm4gZ2VuZXJhdGVSYXdNYXJrZG93bkxpbmsoe1xuICAgIGFsaWFzLFxuICAgIGlzRW1iZWQ6IGNvbmZpZy5pc0VtYmVkLFxuICAgIGlzV2lraWxpbms6IGZhbHNlLFxuICAgIHNob3VsZEVzY2FwZUFsaWFzLFxuICAgIHNob3VsZFVzZUFuZ2xlQnJhY2tldHM6IGNvbmZpZy5zaG91bGRVc2VBbmdsZUJyYWNrZXRzLFxuICAgIHVybDogbGlua1RleHRcbiAgfSk7XG59XG5cbmZ1bmN0aW9uIGdlbmVyYXRlV2lraUxpbmsocGFyYW1zOiBHZW5lcmF0ZVdpa2lMaW5rUGFyYW1zKTogc3RyaW5nIHtcbiAgY29uc3QgeyBhbGlhcywgaXNFbWJlZCwgbGlua1RleHQgfSA9IHBhcmFtcztcbiAgcmV0dXJuIGdlbmVyYXRlUmF3TWFya2Rvd25MaW5rKHtcbiAgICBpc0VtYmVkLFxuICAgIGlzV2lraWxpbms6IHRydWUsXG4gICAgLi4uKGFsaWFzPy50b0xvd2VyQ2FzZSgpID09PSBsaW5rVGV4dC50b0xvd2VyQ2FzZSgpXG4gICAgICA/IHsgdXJsOiBhbGlhcyB9XG4gICAgICA6IHtcbiAgICAgICAgYWxpYXMsXG4gICAgICAgIHVybDogbGlua1RleHRcbiAgICAgIH0pXG4gIH0pO1xufVxuXG5hc3luYyBmdW5jdGlvbiBnZXRGaWxlQ2hhbmdlcyhwYXJhbXM6IEdldEZpbGVDaGFuZ2VzUGFyYW1zKTogUHJvbWlzZTxGaWxlQ2hhbmdlW10+IHtcbiAgY29uc3Qge1xuICAgIGNhY2hlLFxuICAgIGlzQ2FudmFzRmlsZUNhY2hlLFxuICAgIGxpbmtDb252ZXJ0ZXIsXG4gICAgb2Zmc2V0UmFuZ2UsXG4gICAgc2hvdWxkSW5jbHVkZUV4dGVybmFsTGlua3MgPSBmYWxzZSxcbiAgICBzaG91bGRJbmNsdWRlRnJvbnRtYXR0ZXJFeHRlcm5hbExpbmtzID0gZmFsc2UsXG4gICAgc2hvdWxkSW5jbHVkZU11bHRpVmFsdWVGcm9udG1hdHRlckV4dGVybmFsTGlua3MgPSBmYWxzZVxuICB9ID0gcGFyYW1zO1xuICBsZXQgeyBhYm9ydFNpZ25hbCB9ID0gcGFyYW1zO1xuICBhYm9ydFNpZ25hbCA/Pz0gYWJvcnRTaWduYWxOZXZlcigpO1xuICBhYm9ydFNpZ25hbC50aHJvd0lmQWJvcnRlZCgpO1xuXG4gIGlmICghY2FjaGUpIHtcbiAgICByZXR1cm4gW107XG4gIH1cblxuICBjb25zdCBjaGFuZ2VzOiBGaWxlQ2hhbmdlW10gPSBbXTtcblxuICBjb25zdCB0YWJsZVBvc2l0aW9uczogVGFibGVQb3NpdGlvbltdID0gKGNhY2hlLnNlY3Rpb25zID8/IFtdKS5maWx0ZXIoKHNlY3Rpb24pID0+IHNlY3Rpb24udHlwZSA9PT0gJ3RhYmxlJykubWFwKChzZWN0aW9uKSA9PiAoe1xuICAgIGVuZDogc2VjdGlvbi5wb3NpdGlvbi5lbmQub2Zmc2V0LFxuICAgIHN0YXJ0OiBzZWN0aW9uLnBvc2l0aW9uLnN0YXJ0Lm9mZnNldFxuICB9KSk7XG5cbiAgY29uc3QgZ2V0RmlsZUNoYW5nZXNEZWJ1Z2dlciA9IGdldE9ic2lkaWFuTGliRGVidWdnZXIoJ0xpbms6Z2V0RmlsZUNoYW5nZXMnKTtcblxuICBmb3IgKGNvbnN0IGxpbmsgb2YgZ2V0TGlua3MoeyBjYWNoZSwgc2hvdWxkSW5jbHVkZUV4dGVybmFsTGlua3MsIHNob3VsZEluY2x1ZGVGcm9udG1hdHRlckV4dGVybmFsTGlua3MsIHNob3VsZEluY2x1ZGVNdWx0aVZhbHVlRnJvbnRtYXR0ZXJFeHRlcm5hbExpbmtzIH0pKSB7XG4gICAgYWJvcnRTaWduYWwudGhyb3dJZkFib3J0ZWQoKTtcblxuICAgIGlmIChvZmZzZXRSYW5nZSAhPT0gdW5kZWZpbmVkICYmICFpc1JlZmVyZW5jZUluT2Zmc2V0UmFuZ2UobGluaywgb2Zmc2V0UmFuZ2UpKSB7XG4gICAgICBnZXRGaWxlQ2hhbmdlc0RlYnVnZ2VyKFxuICAgICAgICBpc1JlZmVyZW5jZUNhY2hlKGxpbmspXG4gICAgICAgICAgPyAnU2tpcHBpbmcgYSBsaW5rIHRoYXQgaXMgbm90IGZ1bGx5IGNvbnRhaW5lZCBpbiB0aGUgb2Zmc2V0IHJhbmdlJ1xuICAgICAgICAgIDogJ1NraXBwaW5nIGEgbGluayB0aGF0IGNhcnJpZXMgbm8gcG9zaXRpb24gd2l0aGluIHRoZSBjb250ZW50LCBzbyBpdCBjYW4gbmV2ZXIgYmUgaW4gdGhlIG9mZnNldCByYW5nZScsXG4gICAgICAgIHsgbGluazogbGluay5vcmlnaW5hbCwgb2Zmc2V0UmFuZ2UgfVxuICAgICAgKTtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIGNvbnN0IG5ld0NvbnRlbnQgPSBhd2FpdCBsaW5rQ29udmVydGVyKGxpbmssIGFib3J0U2lnbmFsKTtcbiAgICBhYm9ydFNpZ25hbC50aHJvd0lmQWJvcnRlZCgpO1xuICAgIGlmIChuZXdDb250ZW50ID09PSB1bmRlZmluZWQpIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIGNvbnN0IGZpbGVDaGFuZ2UgPSByZWZlcmVuY2VUb0ZpbGVDaGFuZ2UobGluaywgbmV3Q29udGVudCk7XG5cbiAgICBpZiAoaXNDYW52YXNGaWxlQ2FjaGUpIHtcbiAgICAgIGlmIChpc0NhbnZhc0NoYW5nZShmaWxlQ2hhbmdlKSkge1xuICAgICAgICBjaGFuZ2VzLnB1c2goZmlsZUNoYW5nZSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zb2xlLmVycm9yKCdVbnN1cHBvcnRlZCBmaWxlIGNoYW5nZScsIGZpbGVDaGFuZ2UpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBpZiAoc2hvdWxkRXNjYXBlV2lraWxpbmtEaXZpZGVyKGZpbGVDaGFuZ2UsIHRhYmxlUG9zaXRpb25zKSkge1xuICAgICAgICBmaWxlQ2hhbmdlLm5ld0NvbnRlbnQgPSBmaWxlQ2hhbmdlLm5ld0NvbnRlbnQucmVwbGFjZUFsbChPUFRJT05BTExZX0VTQ0FQRURfV0lLSUxJTktfRElWSURFUl9SRUdFWFAsICgpID0+IEVTQ0FQRURfV0lLSUxJTktfRElWSURFUik7XG4gICAgICB9XG5cbiAgICAgIGNoYW5nZXMucHVzaChmaWxlQ2hhbmdlKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGNoYW5nZXM7XG59XG5cbmZ1bmN0aW9uIGdldEZpbmFsTGlua1BhdGhTdHlsZShhcHA6IEFwcCwgbGlua1BhdGhTdHlsZT86IExpbmtQYXRoU3R5bGUpOiBGaW5hbExpbmtQYXRoU3R5bGUge1xuICBjb25zdCByZXNvbHZlZFN0eWxlID0gbGlua1BhdGhTdHlsZSA/PyBMaW5rUGF0aFN0eWxlLk9ic2lkaWFuU2V0dGluZ3NEZWZhdWx0O1xuICBzd2l0Y2ggKHJlc29sdmVkU3R5bGUpIHtcbiAgICBjYXNlIExpbmtQYXRoU3R5bGUuQWJzb2x1dGVQYXRoSW5WYXVsdDoge1xuICAgICAgcmV0dXJuIEZpbmFsTGlua1BhdGhTdHlsZS5BYnNvbHV0ZVBhdGhJblZhdWx0O1xuICAgIH1cbiAgICBjYXNlIExpbmtQYXRoU3R5bGUuT2JzaWRpYW5TZXR0aW5nc0RlZmF1bHQ6IHtcbiAgICAgIHJldHVybiByZXNvbHZlRmluYWxMaW5rUGF0aFN0eWxlRnJvbU9ic2lkaWFuU2V0dGluZ3MoYXBwKTtcbiAgICB9XG4gICAgY2FzZSBMaW5rUGF0aFN0eWxlLlJlbGF0aXZlUGF0aFRvVGhlU291cmNlOiB7XG4gICAgICByZXR1cm4gRmluYWxMaW5rUGF0aFN0eWxlLlJlbGF0aXZlUGF0aFRvVGhlU291cmNlO1xuICAgIH1cbiAgICBjYXNlIExpbmtQYXRoU3R5bGUuU2hvcnRlc3RQYXRoV2hlblBvc3NpYmxlOiB7XG4gICAgICByZXR1cm4gRmluYWxMaW5rUGF0aFN0eWxlLlNob3J0ZXN0UGF0aFdoZW5Qb3NzaWJsZTtcbiAgICB9XG4gICAgZGVmYXVsdDoge1xuICAgICAgYXNzZXJ0TmV2ZXIocmVzb2x2ZWRTdHlsZSk7XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIGdldExpbmtDb25maWcocGFyYW1zOiBHZW5lcmF0ZU1hcmtkb3duTGlua1BhcmFtcyk6IExpbmtDb25maWcge1xuICBjb25zdCB7IGFwcCB9ID0gcGFyYW1zO1xuICByZXR1cm4ge1xuICAgIGlzRW1iZWQ6IHBhcmFtcy5pc0VtYmVkID8/IChwYXJhbXMub3JpZ2luYWxMaW5rID8gaGFzRW1iZWRTeW50YXgocGFyYW1zLm9yaWdpbmFsTGluaykgOiBmYWxzZSksXG4gICAgaXNTaW5nbGVTdWJwYXRoQWxsb3dlZDogcGFyYW1zLmlzU2luZ2xlU3VicGF0aEFsbG93ZWQgPz8gdHJ1ZSxcbiAgICBpc1dpa2lsaW5rOiBzaG91bGRVc2VXaWtpbGlua1N0eWxlKG5vcm1hbGl6ZU9wdGlvbmFsUHJvcGVydGllczxTaG91bGRVc2VXaWtpbGlua1N0eWxlUGFyYW1zPih7XG4gICAgICBhcHAsXG4gICAgICBsaW5rU3R5bGU6IHBhcmFtcy5saW5rU3R5bGUsXG4gICAgICBvcmlnaW5hbExpbms6IHBhcmFtcy5vcmlnaW5hbExpbmtcbiAgICB9KSksXG4gICAgbGlua1BhdGhTdHlsZTogZ2V0RmluYWxMaW5rUGF0aFN0eWxlKGFwcCwgcGFyYW1zLmxpbmtQYXRoU3R5bGUpLFxuICAgIHNob3VsZFVzZUFuZ2xlQnJhY2tldHM6IHBhcmFtcy5zaG91bGRVc2VBbmdsZUJyYWNrZXRzID8/IChwYXJhbXMub3JpZ2luYWxMaW5rID8gaGFzQW5nbGVCcmFja2V0cyhwYXJhbXMub3JpZ2luYWxMaW5rKSA6IHVuZGVmaW5lZCkgPz8gZmFsc2UsXG4gICAgc2hvdWxkVXNlTGVhZGluZ0RvdEZvclJlbGF0aXZlUGF0aHM6IHBhcmFtcy5zaG91bGRVc2VMZWFkaW5nRG90Rm9yUmVsYXRpdmVQYXRoc1xuICAgICAgPz8gKHBhcmFtcy5vcmlnaW5hbExpbmsgPyBoYXNMZWFkaW5nRG90KHBhcmFtcy5vcmlnaW5hbExpbmspIDogdW5kZWZpbmVkKSA/PyBmYWxzZSxcbiAgICBzaG91bGRVc2VMZWFkaW5nU2xhc2hGb3JBYnNvbHV0ZVBhdGhzOiBwYXJhbXMuc2hvdWxkVXNlTGVhZGluZ1NsYXNoRm9yQWJzb2x1dGVQYXRoc1xuICAgICAgPz8gKHBhcmFtcy5vcmlnaW5hbExpbmsgPyBoYXNMZWFkaW5nU2xhc2gocGFyYW1zLm9yaWdpbmFsTGluaykgOiB1bmRlZmluZWQpID8/IGZhbHNlXG4gIH07XG59XG5cbmZ1bmN0aW9uIGdldFVuZGVmaW5lZFBheWxvYWQoKTogdW5kZWZpbmVkIHtcbiAgLy8gQSBzaW5nbGUtdGFyZ2V0IHJld3JpdGUgaGFzIG5vdGhpbmcgdG8gcmVtZW1iZXIgcGVyIGxpbms6IHRoZSB0YXJnZXQgaXMgaW1wbGllZC5cbn1cblxuZnVuY3Rpb24gbm9ybWFsaXplRmlsZVVybExpbmsobGluazogUmVmZXJlbmNlLCBzaG91bGRVc2VBbmdsZUJyYWNrZXRzOiBib29sZWFuKTogTWF5YmVSZXR1cm48c3RyaW5nPiB7XG4gIGlmIChpc1BhcnNlTGlua0Zyb250bWF0dGVyUmVmZXJlbmNlKGxpbmspKSB7XG4gICAgLy8gQSBmcm9udG1hdHRlciB2YWx1ZSBob2xkcyBhIGJhcmUgVVJMIChyZS1zZXJpYWxpemVkL3F1b3RlZCBhcyBZQU1MKSwgbm90IGEgYFthbGlhc10odXJsKWAgbWFya2Rvd24gbGluay5cbiAgICByZXR1cm4gbGluay5wYXJzZUxpbmtSZXN1bHQuaXNGaWxlVXJsID8gbm9ybWFsaXplRmlsZVVybChsaW5rLnBhcnNlTGlua1Jlc3VsdC51cmwpIDogdW5kZWZpbmVkO1xuICB9XG5cbiAgaWYgKCFpc1BhcnNlTGlua1JlZmVyZW5jZShsaW5rKSkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGNvbnN0IHsgcGFyc2VMaW5rUmVzdWx0IH0gPSBsaW5rO1xuICByZXR1cm4gcGFyc2VMaW5rUmVzdWx0LmlzRmlsZVVybFxuICAgID8gZ2VuZXJhdGVSYXdNYXJrZG93bkxpbmsobm9ybWFsaXplT3B0aW9uYWxQcm9wZXJ0aWVzPEdlbmVyYXRlUmF3TWFya2Rvd25MaW5rUGFyYW1zPih7XG4gICAgICBhbGlhczogcGFyc2VMaW5rUmVzdWx0LmFsaWFzLFxuICAgICAgaXNFbWJlZDogcGFyc2VMaW5rUmVzdWx0LmlzRW1iZWQsXG4gICAgICBpc1dpa2lsaW5rOiBmYWxzZSxcbiAgICAgIHNob3VsZFVzZUFuZ2xlQnJhY2tldHMsXG4gICAgICB1cmw6IG5vcm1hbGl6ZUZpbGVVcmwocGFyc2VMaW5rUmVzdWx0LnVybClcbiAgICB9KSlcbiAgICA6IHVuZGVmaW5lZDtcbn1cblxuZnVuY3Rpb24gcmVzb2x2ZUZpbmFsTGlua1BhdGhTdHlsZUZyb21PYnNpZGlhblNldHRpbmdzKGFwcDogQXBwKTogRmluYWxMaW5rUGF0aFN0eWxlIHtcbiAgY29uc3QgbmV3TGlua0Zvcm1hdCA9IGdldE5ld0xpbmtGb3JtYXQoYXBwKTtcbiAgc3dpdGNoIChuZXdMaW5rRm9ybWF0KSB7XG4gICAgY2FzZSAnYWJzb2x1dGUnOiB7XG4gICAgICByZXR1cm4gRmluYWxMaW5rUGF0aFN0eWxlLkFic29sdXRlUGF0aEluVmF1bHQ7XG4gICAgfVxuICAgIGNhc2UgJ3JlbGF0aXZlJzoge1xuICAgICAgcmV0dXJuIEZpbmFsTGlua1BhdGhTdHlsZS5SZWxhdGl2ZVBhdGhUb1RoZVNvdXJjZTtcbiAgICB9XG4gICAgY2FzZSAnc2hvcnRlc3QnOiB7XG4gICAgICByZXR1cm4gRmluYWxMaW5rUGF0aFN0eWxlLlNob3J0ZXN0UGF0aFdoZW5Qb3NzaWJsZTtcbiAgICB9XG4gICAgZGVmYXVsdDoge1xuICAgICAgYXNzZXJ0TmV2ZXIobmV3TGlua0Zvcm1hdCk7XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIHJlc29sdmVTbmFwc2hvdExpbmtJZGVudGl0eUtleVByb3ZpZGVyKHBhcmFtczogUmVzb2x2ZVNuYXBzaG90TGlua0lkZW50aXR5S2V5UHJvdmlkZXJQYXJhbXMpOiAobGluazogUmVmZXJlbmNlKSA9PiBzdHJpbmcge1xuICBjb25zdCB7IGNhbGxlck5hbWUsIGV4cGxpY2l0TGlua0lkZW50aXR5S2V5UHJvdmlkZXIsIHNuYXBzaG90IH0gPSBwYXJhbXM7XG4gIGNvbnN0IHJlY29yZGVkTGlua0lkZW50aXR5S2V5UHJvdmlkZXIgPSBzbmFwc2hvdExpbmtJZGVudGl0eUtleVByb3ZpZGVycy5nZXQoc25hcHNob3QpO1xuICBpZiAoXG4gICAgZXhwbGljaXRMaW5rSWRlbnRpdHlLZXlQcm92aWRlciAmJiByZWNvcmRlZExpbmtJZGVudGl0eUtleVByb3ZpZGVyXG4gICAgJiYgZXhwbGljaXRMaW5rSWRlbnRpdHlLZXlQcm92aWRlciAhPT0gcmVjb3JkZWRMaW5rSWRlbnRpdHlLZXlQcm92aWRlclxuICApIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICBgJHtjYWxsZXJOYW1lfSB3YXMgcGFzc2VkIGEgbGlua0lkZW50aXR5S2V5UHJvdmlkZXIgdGhhdCBkaWZmZXJzIGZyb20gdGhlIG9uZSB0aGUgc25hcHNob3Qgd2FzIGJ1aWx0IHdpdGguIGBcbiAgICAgICAgKyAnVGhlIHNuYXBzaG90IGlzIGtleWVkIGJ5IHRoZSBvdGhlciwgc28gbm8gbGluayB3b3VsZCBtYXRjaC4gT21pdCB0aGUgcGFyYW1ldGVyIHRvIHVzZSB0aGUgc25hcHNob3RcXCdzIG93bi4nXG4gICAgKTtcbiAgfVxuICByZXR1cm4gZXhwbGljaXRMaW5rSWRlbnRpdHlLZXlQcm92aWRlciA/PyByZWNvcmRlZExpbmtJZGVudGl0eUtleVByb3ZpZGVyID8/IGRlZmF1bHRMaW5rSWRlbnRpdHlLZXlQcm92aWRlcjtcbn1cblxuZnVuY3Rpb24gc2hvdWxkRXNjYXBlV2lraWxpbmtEaXZpZGVyKGZpbGVDaGFuZ2U6IEZpbGVDaGFuZ2UsIHRhYmxlUG9zaXRpb25zOiBUYWJsZVBvc2l0aW9uW10pOiBib29sZWFuIHtcbiAgLyogdjggaWdub3JlIHN0YXJ0IC0tIGdldEZpbGVDaGFuZ2VzIG9ubHkgY2FsbHMgdGhpcyBmb3Igbm9uLWNhbnZhcyBmaWxlcyB3aGljaCBhbHdheXMgaGF2ZSBjb250ZW50IGNoYW5nZXMuICovXG4gIGlmICghaXNDb250ZW50Q2hhbmdlKGZpbGVDaGFuZ2UpKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIC8qIHY4IGlnbm9yZSBzdG9wICovXG5cbiAgcmV0dXJuIFVORVNDQVBFRF9XSUtJTElOS19ESVZJREVSX1JFR0VYUC50ZXN0KGZpbGVDaGFuZ2UubmV3Q29udGVudCkgJiYgdGFibGVQb3NpdGlvbnMuc29tZSgodGFibGVQb3NpdGlvbikgPT4gdGFibGVQb3NpdGlvbi5zdGFydCA8PSBmaWxlQ2hhbmdlLnJlZmVyZW5jZS5wb3NpdGlvbi5zdGFydC5vZmZzZXQgJiYgZmlsZUNoYW5nZS5yZWZlcmVuY2UucG9zaXRpb24uZW5kLm9mZnNldCA8PSB0YWJsZVBvc2l0aW9uLmVuZCk7XG59XG5cbmZ1bmN0aW9uIHNob3VsZFVzZVdpa2lsaW5rU3R5bGUocGFyYW1zOiBTaG91bGRVc2VXaWtpbGlua1N0eWxlUGFyYW1zKTogYm9vbGVhbiB7XG4gIGNvbnN0IHsgYXBwLCBsaW5rU3R5bGUsIG9yaWdpbmFsTGluayB9ID0gcGFyYW1zO1xuICBjb25zdCByZXNvbHZlZFN0eWxlID0gbGlua1N0eWxlID8/IExpbmtTdHlsZS5QcmVzZXJ2ZUV4aXN0aW5nO1xuICBzd2l0Y2ggKHJlc29sdmVkU3R5bGUpIHtcbiAgICBjYXNlIExpbmtTdHlsZS5NYXJrZG93bjoge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBjYXNlIExpbmtTdHlsZS5PYnNpZGlhblNldHRpbmdzRGVmYXVsdDoge1xuICAgICAgcmV0dXJuIHNob3VsZFVzZVdpa2lsaW5rcyhhcHApO1xuICAgIH1cbiAgICBjYXNlIExpbmtTdHlsZS5QcmVzZXJ2ZUV4aXN0aW5nOiB7XG4gICAgICByZXR1cm4gb3JpZ2luYWxMaW5rID09PSB1bmRlZmluZWQgPyBzaG91bGRVc2VXaWtpbGlua3MoYXBwKSA6IGhhc1dpa2lsaW5rU3ludGF4KG9yaWdpbmFsTGluayk7XG4gICAgfVxuICAgIGNhc2UgTGlua1N0eWxlLldpa2lsaW5rOiB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgZGVmYXVsdDoge1xuICAgICAgYXNzZXJ0TmV2ZXIocmVzb2x2ZWRTdHlsZSk7XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIHZhbGlkYXRlT2Zmc2V0UmFuZ2Uob2Zmc2V0UmFuZ2U6IE9mZnNldFJhbmdlKTogdm9pZCB7XG4gIGlmIChvZmZzZXRSYW5nZS5zdGFydE9mZnNldCA8IDApIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgb2Zmc2V0IHJhbmdlOiB0aGUgc3RhcnQgb2Zmc2V0ICR7U3RyaW5nKG9mZnNldFJhbmdlLnN0YXJ0T2Zmc2V0KX0gbXVzdCBub3QgYmUgbmVnYXRpdmUuYCk7XG4gIH1cblxuICBpZiAob2Zmc2V0UmFuZ2UuZW5kT2Zmc2V0IDwgb2Zmc2V0UmFuZ2Uuc3RhcnRPZmZzZXQpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgb2Zmc2V0IHJhbmdlOiB0aGUgZW5kIG9mZnNldCAke1N0cmluZyhvZmZzZXRSYW5nZS5lbmRPZmZzZXQpfSBtdXN0IG5vdCBiZSBsZXNzIHRoYW4gdGhlIHN0YXJ0IG9mZnNldCAke1N0cmluZyhvZmZzZXRSYW5nZS5zdGFydE9mZnNldCl9LmApO1xuICB9XG59XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBZ0JBLFNBQVMsd0JBQXdCO0FBQ2pDO0FBQUEsRUFDRTtBQUFBLEVBQ0E7QUFBQSxPQUNLO0FBQ1A7QUFBQSxFQUNFO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLE9BQ0s7QUFDUDtBQUFBLEVBQ0U7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QUNUO0FBQUEsSUFDQSxLQUFLLFlBQVk7QUFDZixhQUFPO0FBQUEsSUFDVDtBQUFBLElBQ0EsS0FBSyxZQUFZO0FBQ2YsYUFBTztBQUFBLElBQ1Q7QUFBQSxJQUNBLFNBQVM7QUFDUCxrQkFBWSxhQUFhO0FBQUEsSUFDM0I7QUFBQSxFQUNGO0FBQ0Y7QUFFQSxTQUFTLHVDQUF1QyxRQUFtRjtBQUNqSSxRQUFNLEVBQUUsWUFBWSxpQ0FBaUMsU0FBUyxJQUFJO0FBQ2xFLFFBQU0sa0NBQWtDLGlDQUFpQyxJQUFJLFFBQVE7QUFDckYsTUFDRSxtQ0FBbUMsbUNBQ2hDLG9DQUFvQyxpQ0FDdkM7QUFDQSxVQUFNLElBQUk7QUFBQSxNQUNSLEdBQUcsVUFBVTtBQUFBLElBRWY7QUFBQSxFQUNGO0FBQ0EsU0FBTyxtQ0FBbUMsbUNBQW1DO0FBQy9FO0FBRUEsU0FBUyw0QkFBNEIsWUFBd0IsZ0JBQTBDO0FBRXJHLE1BQUksQ0FBQyxnQkFBZ0IsVUFBVSxHQUFHO0FBQ2hDLFdBQU87QUFBQSxFQUNUO0FBR0EsU0FBTyxrQ0FBa0MsS0FBSyxXQUFXLFVBQVUsS0FBSyxlQUFlLEtBQUssQ0FBQyxrQkFBa0IsY0FBYyxTQUFTLFdBQVcsVUFBVSxTQUFTLE1BQU0sVUFBVSxXQUFXLFVBQVUsU0FBUyxJQUFJLFVBQVUsY0FBYyxHQUFHO0FBQ25QO0FBRUEsU0FBUyx1QkFBdUIsUUFBK0M7QUFDN0UsUUFBTSxFQUFFLEtBQUssV0FBVyxhQUFhLElBQUk7QUFDekMsUUFBTSxnQkFBZ0IsYUFBYTtBQUNuQyxVQUFRLGVBQWU7QUFBQSxJQUNyQixLQUFLLDJCQUFvQjtBQUN2QixhQUFPO0FBQUEsSUFDVDtBQUFBLElBQ0EsS0FBSyx5REFBbUM7QUFDdEMsYUFBTyxtQkFBbUIsR0FBRztBQUFBLElBQy9CO0FBQUEsSUFDQSxLQUFLLDJDQUE0QjtBQUMvQixhQUFPLGlCQUFpQixTQUFZLG1CQUFtQixHQUFHLElBQUksa0JBQWtCLFlBQVk7QUFBQSxJQUM5RjtBQUFBLElBQ0EsS0FBSywyQkFBb0I7QUFDdkIsYUFBTztBQUFBLElBQ1Q7QUFBQSxJQUNBLFNBQVM7QUFDUCxrQkFBWSxhQUFhO0FBQUEsSUFDM0I7QUFBQSxFQUNGO0FBQ0Y7QUFFQSxTQUFTLG9CQUFvQixhQUFnQztBQUMzRCxNQUFJLFlBQVksY0FBYyxHQUFHO0FBQy9CLFVBQU0sSUFBSSxNQUFNLDBDQUEwQyxPQUFPLFlBQVksV0FBVyxDQUFDLHdCQUF3QjtBQUFBLEVBQ25IO0FBRUEsTUFBSSxZQUFZLFlBQVksWUFBWSxhQUFhO0FBQ25ELFVBQU0sSUFBSSxNQUFNLHdDQUF3QyxPQUFPLFlBQVksU0FBUyxDQUFDLDJDQUEyQyxPQUFPLFlBQVksV0FBVyxDQUFDLEdBQUc7QUFBQSxFQUNwSztBQUNGOyIsIm5hbWVzIjpbIkxpbmtQYXRoU3R5bGUiLCJMaW5rU3R5bGUiXX0=
989
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9saW5rLnRzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGZpbGVcbiAqXG4gKiBUaGlzIG1vZHVsZSBwcm92aWRlcyB1dGlsaXRpZXMgZm9yIGhhbmRsaW5nIGFuZCB1cGRhdGluZyBsaW5rcyB3aXRoaW4gT2JzaWRpYW4gdmF1bHRzLiBJdCBpbmNsdWRlc1xuICogZnVuY3Rpb25zIHRvIHNwbGl0IHBhdGhzLCB1cGRhdGUgbGlua3MgaW4gZmlsZXMsIGFuZCBnZW5lcmF0ZSBtYXJrZG93biBsaW5rcyB3aXRoIHZhcmlvdXMgb3B0aW9ucy5cbiAqL1xuXG5pbXBvcnQgdHlwZSB7IE1heWJlUmV0dXJuIH0gZnJvbSAnQG1uYW91bW92L3R5cGVzY3JpcHQtbGliL3R5cGUnO1xuaW1wb3J0IHR5cGUge1xuICBBcHAsXG4gIENhY2hlZE1ldGFkYXRhLFxuICBSZWZlcmVuY2UsXG4gIFRGaWxlXG59IGZyb20gJ29ic2lkaWFuJztcbmltcG9ydCB0eXBlIHsgUHJvbWlzYWJsZSB9IGZyb20gJ3R5cGUtZmVzdCc7XG5cbmltcG9ydCB7IGFib3J0U2lnbmFsTmV2ZXIgfSBmcm9tICdAbW5hb3Vtb3YvdHlwZXNjcmlwdC1saWIvYWJvcnQtY29udHJvbGxlcic7XG5pbXBvcnQge1xuICBub3JtYWxpemVPcHRpb25hbFByb3BlcnRpZXMsXG4gIHJlbW92ZVVuZGVmaW5lZFByb3BlcnRpZXNcbn0gZnJvbSAnQG1uYW91bW92L3R5cGVzY3JpcHQtbGliL29iamVjdC11dGlscyc7XG5pbXBvcnQge1xuICBiYXNlbmFtZSxcbiAgZGlybmFtZSxcbiAgZXh0bmFtZSxcbiAgam9pbixcbiAgcmVsYXRpdmVcbn0gZnJvbSAnQG1uYW91bW92L3R5cGVzY3JpcHQtbGliL3BhdGgnO1xuaW1wb3J0IHtcbiAgbm9ybWFsaXplU3RyaW5nLFxuICByZXBsYWNlQWxsLFxuICB0cmltRW5kXG59IGZyb20gJ0BtbmFvdW1vdi90eXBlc2NyaXB0LWxpYi9zdHJpbmcnO1xuaW1wb3J0IHtcbiAgYXNzZXJ0TmV2ZXIsXG4gIGFzc2VydE5vbk51bGxhYmxlLFxuICBlbnN1cmVOb25OdWxsYWJsZVxufSBmcm9tICdAbW5hb3Vtb3YvdHlwZXNjcmlwdC1saWIvdHlwZS1ndWFyZHMnO1xuaW1wb3J0IHtcbiAgZW5jb2RlVXJsLFxuICBub3JtYWxpemVGaWxlVXJsXG59IGZyb20gJ0BtbmFvdW1vdi90eXBlc2NyaXB0LWxpYi91cmwnO1xuaW1wb3J0IHtcbiAgSW50ZXJuYWxQbHVnaW5OYW1lLFxuICBpc1JlZmVyZW5jZUNhY2hlXG59IGZyb20gJ0BvYnNpZGlhbi10eXBpbmdzL29ic2lkaWFuLXB1YmxpYy1sYXRlc3QvaW1wbGVtZW50YXRpb25zJztcbmltcG9ydCB7XG4gIG5vcm1hbGl6ZVBhdGgsXG4gIHBhcnNlTGlua3RleHRcbn0gZnJvbSAnb2JzaWRpYW4nO1xuXG5pbXBvcnQgdHlwZSB7IEZpbGVDaGFuZ2UgfSBmcm9tICcuL2ZpbGUtY2hhbmdlLnRzJztcbmltcG9ydCB0eXBlIHtcbiAgR2V0RmlsZVBhcmFtcyxcbiAgUGF0aE9yRmlsZVxufSBmcm9tICcuL2ZpbGUtc3lzdGVtLnRzJztcbmltcG9ydCB0eXBlIHsgTGlua1VwZGF0ZVByb2dyZXNzUmVwb3J0ZXIgfSBmcm9tICcuL2xpbmstdXBkYXRlLXByb2dyZXNzLnRzJztcbmltcG9ydCB0eXBlIHsgT2Zmc2V0UmFuZ2UgfSBmcm9tICcuL3JlZmVyZW5jZS50cyc7XG5pbXBvcnQgdHlwZSB7IFByb2Nlc3NPcHRpb25zIH0gZnJvbSAnLi92YXVsdC50cyc7XG5cbmltcG9ydCB7IGdldE9ic2lkaWFuTGliRGVidWdnZXIgfSBmcm9tICcuL2RlYnVnLnRzJztcbmltcG9ydCB7XG4gIGFwcGx5Q29udGVudENoYW5nZXMsXG4gIGFwcGx5RmlsZUNoYW5nZXMsXG4gIGlzQ2FudmFzQ2hhbmdlLFxuICBpc0NvbnRlbnRDaGFuZ2Vcbn0gZnJvbSAnLi9maWxlLWNoYW5nZS50cyc7XG5pbXBvcnQge1xuICBnZXRGaWxlLFxuICBnZXRQYXRoLFxuICBpc0NhbnZhc0ZpbGUsXG4gIGlzTWFya2Rvd25GaWxlLFxuICBNQVJLRE9XTl9GSUxFX0VYVEVOU0lPTlxufSBmcm9tICcuL2ZpbGUtc3lzdGVtLnRzJztcbmltcG9ydCB7XG4gIGdldEJhY2tsaW5rc0ZvckZpbGVTYWZlLFxuICBnZXRDYWNoZVNhZmUsXG4gIGdldExpbmtzLFxuICBwYXJzZU1ldGFkYXRhLFxuICByZWdpc3RlckZpbGVzXG59IGZyb20gJy4vbWV0YWRhdGEtY2FjaGUudHMnO1xuaW1wb3J0IHsgZ2V0T2JzaWRpYW5MaWJTdGF0ZSB9IGZyb20gJy4vb2JzaWRpYW4tbGliLXN0YXRlLnRzJztcbmltcG9ydCB7XG4gIGdldE5ld0xpbmtGb3JtYXQsXG4gIHNob3VsZFVzZVdpa2lsaW5rc1xufSBmcm9tICcuL29ic2lkaWFuLXNldHRpbmdzLnRzJztcbmltcG9ydCB7XG4gIGVzY2FwZUFsaWFzLFxuICBpc1BhcnNlTGlua0Zyb250bWF0dGVyUmVmZXJlbmNlLFxuICBpc1BhcnNlTGlua1JlZmVyZW5jZSxcbiAgcGFyc2VMaW5rXG59IGZyb20gJy4vcGFyc2UtbGluay50cyc7XG5pbXBvcnQge1xuICBnZXRSZWZlcmVuY2VMaW5rVGV4dCxcbiAgaXNDYW52YXNGaWxlTm9kZVJlZmVyZW5jZSxcbiAgaXNSZWZlcmVuY2VJbk9mZnNldFJhbmdlLFxuICByZWZlcmVuY2VUb0ZpbGVDaGFuZ2Vcbn0gZnJvbSAnLi9yZWZlcmVuY2UudHMnO1xuXG5jb25zdCBFU0NBUEVEX1dJS0lMSU5LX0RJVklERVIgPSBTdHJpbmcucmF3YFxcfGA7XG5cbi8qKlxuICogTWF0Y2hlcyBhIHdpa2lsaW5rIGRpdmlkZXIgdG9nZXRoZXIgd2l0aCB0aGUgYmFja3NsYXNoIGVzY2FwaW5nIGl0LCBpZiBhbnkuIEEgbG9va2JlaGluZCB3b3VsZCBzYXkgXCJ1bmVzY2FwZWRcIlxuICogZGlyZWN0bHksIGJ1dCBpdCBpcyBhIHN5bnRheCBlcnJvciBvbiBpT1MgYmVmb3JlIDE2LjQsIGJlbG93IHRoZSBpT1MgMTUgT2JzaWRpYW4gbW9iaWxlIHN0aWxsIHN1cHBvcnRzLlxuICogUmVwbGFjaW5nIGV2ZXJ5IG1hdGNoIHdpdGggYW4gZXNjYXBlZCBkaXZpZGVyIGxlYXZlcyBhbiBlc2NhcGVkIG9uZSBhcyBpdCB3YXMgYW5kIGVzY2FwZXMgYSBiYXJlIG9uZS5cbiAqL1xuY29uc3QgT1BUSU9OQUxMWV9FU0NBUEVEX1dJS0lMSU5LX0RJVklERVJfUkVHRVhQID0gL1xcXFw/XFx8L2c7XG5cbi8qKlxuICogVGVzdHMgZm9yIGEgd2lraWxpbmsgZGl2aWRlciBubyBiYWNrc2xhc2ggZXNjYXBlcy4gTm90IGdsb2JhbCwgc28gYSBgdGVzdGAga2VlcHMgbm8gYGxhc3RJbmRleGAgYmV0d2VlbiBjYWxscy5cbiAqL1xuY29uc3QgVU5FU0NBUEVEX1dJS0lMSU5LX0RJVklERVJfUkVHRVhQID0gLyg/Ol58W15cXFxcXSlcXHwvO1xuXG4vKipcbiAqIFRoZSBsaW5rIGlkZW50aXR5IGtleSBwcm92aWRlciBlYWNoIHNuYXBzaG90IHdhcyBidWlsdCB3aXRoLiBLZXB0IGJlc2lkZSB0aGUgc25hcHNob3QgcmF0aGVyIHRoYW4gaW4gaXQsIHNvIGFcbiAqIHNuYXBzaG90IHN0YXlzIGEgcGxhaW4gbWFwIGFuZCB0aGUgb25lIGZ1bmN0aW9uIHRoYXQga2V5ZWQgaXQgaXMgYWxzbyB0aGUgb25lIHRoYXQgbG9va3MgaXQgdXAg4oCUIHBhc3NpbmcgYVxuICogcHJvdmlkZXIgdG8gb25seSBvbmUgb2Yge0BsaW5rIGJ1aWxkQmFja2xpbmtzU25hcHNob3R9IGFuZCB7QGxpbmsgZWRpdEJhY2tsaW5rc1NuYXBzaG90fSB1c2VkIHRvIGxlYXZlIGV2ZXJ5XG4gKiBsaW5rIHVubWF0Y2hlZCwgYW5kIHRoZSBlZGl0IHJld3JvdGUgbm90aGluZyB3aXRob3V0IGEgd29yZC5cbiAqL1xuY29uc3Qgc25hcHNob3RMaW5rSWRlbnRpdHlLZXlQcm92aWRlcnMgPSBuZXcgV2Vha01hcDxCYWNrbGlua3NTbmFwc2hvdDx1bmtub3duPiwgKGxpbms6IFJlZmVyZW5jZSkgPT4gc3RyaW5nPigpO1xuXG4vKipcbiAqIEEgc3R5bGUgb2YgdGhlIGxpbmsgcGF0aC5cbiAqL1xuZXhwb3J0IGVudW0gTGlua1BhdGhTdHlsZSB7XG4gIC8qKlxuICAgKiBVc2UgdGhlIGFic29sdXRlIHBhdGggaW4gdGhlIHZhdWx0LlxuICAgKlxuICAgKiBAZXhhbXBsZSBgW1twYXRoL2Zyb20vdGhlL3ZhdWx0L3Jvb3QvdGFyZ2V0XV1gXG4gICAqL1xuICBBYnNvbHV0ZVBhdGhJblZhdWx0ID0gJ0Fic29sdXRlUGF0aEluVmF1bHQnLFxuXG4gIC8qKlxuICAgKiBVc2UgdGhlIGRlZmF1bHQgbGluayBwYXRoIHN0eWxlIGRlZmluZWQgaW4gT2JzaWRpYW4gc2V0dGluZ3MuXG4gICAqL1xuICBPYnNpZGlhblNldHRpbmdzRGVmYXVsdCA9ICdPYnNpZGlhblNldHRpbmdzRGVmYXVsdCcsXG5cbiAgLyoqXG4gICAqIFVzZSB0aGUgcmVsYXRpdmUgcGF0aCB0byB0aGUgc291cmNlLlxuICAgKlxuICAgKiBAZXhhbXBsZSBgW1suLi8uLi9yZWxhdGl2ZS9wYXRoL3RvL3RhcmdldF1dYFxuICAgKi9cbiAgUmVsYXRpdmVQYXRoVG9UaGVTb3VyY2UgPSAnUmVsYXRpdmVQYXRoVG9UaGVTb3VyY2UnLFxuXG4gIC8qKlxuICAgKiBVc2UgdGhlIHNob3J0ZXN0IHBhdGggd2hlbiBwb3NzaWJsZS5cbiAgICpcbiAgICogQGV4YW1wbGUgYFtbc2hvcnRlc3QtcGF0aC10by10YXJnZXRdXWBcbiAgICovXG4gIFNob3J0ZXN0UGF0aFdoZW5Qb3NzaWJsZSA9ICdTaG9ydGVzdFBhdGhXaGVuUG9zc2libGUnXG59XG5cbi8qKlxuICogQSBzdHlsZSBvZiB0aGUgbGluay5cbiAqL1xuZXhwb3J0IGVudW0gTGlua1N0eWxlIHtcbiAgLyoqXG4gICAqIEZvcmNlIHRoZSBsaW5rIHRvIGJlIGluIG1hcmtkb3duIGZvcm1hdC5cbiAgICpcbiAgICogQGV4YW1wbGUgYFthbGlhc10ocGF0aC90by90YXJnZXQubWQpYFxuICAgKi9cbiAgTWFya2Rvd24gPSAnTWFya2Rvd24nLFxuXG4gIC8qKlxuICAgKiBVc2UgdGhlIGRlZmF1bHQgbGluayBzdHlsZSBkZWZpbmVkIGluIE9ic2lkaWFuIHNldHRpbmdzLlxuICAgKi9cbiAgT2JzaWRpYW5TZXR0aW5nc0RlZmF1bHQgPSAnT2JzaWRpYW5TZXR0aW5nc0RlZmF1bHQnLFxuXG4gIC8qKlxuICAgKiBQcmVzZXJ2ZSB0aGUgZXhpc3RpbmcgbGluayBzdHlsZS5cbiAgICovXG4gIFByZXNlcnZlRXhpc3RpbmcgPSAnUHJlc2VydmVFeGlzdGluZycsXG5cbiAgLyoqXG4gICAqIEZvcmNlIHRoZSBsaW5rIHRvIGJlIGluIHdpa2lsaW5rIGZvcm1hdC5cbiAgICpcbiAgICogQGV4YW1wbGUgYFtbcGF0aC90by90YXJnZXRdXWBcbiAgICogQGV4YW1wbGUgYFtbcGF0aC90by90YXJnZXR8YWxpYXNdXWBcbiAgICovXG4gIFdpa2lsaW5rID0gJ1dpa2lsaW5rJ1xufVxuXG5lbnVtIEZpbmFsTGlua1BhdGhTdHlsZSB7XG4gIEFic29sdXRlUGF0aEluVmF1bHQgPSAnQWJzb2x1dGVQYXRoSW5WYXVsdCcsXG4gIFJlbGF0aXZlUGF0aFRvVGhlU291cmNlID0gJ1JlbGF0aXZlUGF0aFRvVGhlTm90ZScsXG4gIFNob3J0ZXN0UGF0aFdoZW5Qb3NzaWJsZSA9ICdTaG9ydGVzdFBhdGhXaGVuUG9zc2libGUnXG59XG5cbi8qKlxuICogUGFyYW1zIHBhc3NlZCB0byB0aGUgbGluayBjb252ZXJ0ZXIgb2Yge0BsaW5rIGVkaXRCYWNrbGlua3NTbmFwc2hvdH0uXG4gKlxuICogQHR5cGVQYXJhbSBUUGF5bG9hZCAtIFRoZSBwYXlsb2FkIHJlY29yZGVkIGZvciBlYWNoIGxpbmsgd2hlbiB0aGUgc25hcHNob3Qgd2FzIGJ1aWx0LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEJhY2tsaW5rQ29udmVyc2lvblBhcmFtczxUUGF5bG9hZD4ge1xuICAvKipcbiAgICogVGhlIGxpbmsgYmVpbmcgY29udmVydGVkLlxuICAgKi9cbiAgcmVhZG9ubHkgbGluazogUmVmZXJlbmNlO1xuXG4gIC8qKlxuICAgKiBUaGUgcGF5bG9hZCBjYXB0dXJlZCBmb3IgdGhlIGxpbmsgd2hlbiB0aGUgc25hcHNob3Qgd2FzIGJ1aWx0LlxuICAgKlxuICAgKiBgdW5kZWZpbmVkYCB3aGVuIHRoZSBsaW5rIGlzIG5vdCBpbiB0aGUgc25hcHNob3QsIHdoaWNoIGNhbiBvbmx5IGhhcHBlbiBpZlxuICAgKiB7QGxpbmsgRWRpdEJhY2tsaW5rc1NuYXBzaG90UGFyYW1zLnNob3VsZFZpc2l0VW5tYXRjaGVkTGlua3N9IGlzIGB0cnVlYC5cbiAgICovXG4gIHJlYWRvbmx5IHBheWxvYWQ6IFRQYXlsb2FkIHwgdW5kZWZpbmVkO1xuXG4gIC8qKlxuICAgKiBUaGUgcGF0aCBvZiB0aGUgbm90ZSBob2xkaW5nIHRoZSBsaW5rLlxuICAgKi9cbiAgcmVhZG9ubHkgc291cmNlUGF0aDogc3RyaW5nO1xufVxuXG4vKipcbiAqIFRoZSBtaW5pbWFsIHNoYXBlIHtAbGluayBidWlsZEJhY2tsaW5rc1NuYXBzaG90fSByZWFkcyBhIHNldCBvZiBiYWNrbGlua3MgZnJvbS5cbiAqXG4gKiBCb3RoIGEgYEN1c3RvbUFycmF5RGljdDxSZWZlcmVuY2U+YCDigJQgd2hhdFxuICoge0BsaW5rIC4uL29ic2lkaWFuL21ldGFkYXRhLWNhY2hlIWdldEJhY2tsaW5rc0ZvckZpbGVTYWZlIHwgZ2V0QmFja2xpbmtzRm9yRmlsZVNhZmV9IHJldHVybnMg4oCUIGFuZCBhIHBsYWluXG4gKiBgTWFwPHN0cmluZywgUmVmZXJlbmNlW10+YCBzYXRpc2Z5IGl0LCBzbyBhIGNhbGxlciBjYW4gcGFzcyBlaXRoZXIgd2l0aG91dCBjb252ZXJ0aW5nIGZpcnN0LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEJhY2tsaW5rc0xpa2Uge1xuICAvKipcbiAgICogUmV0dXJucyB0aGUgbGlua3MgdGhlIG5vdGUgYXQgYGtleWAgaG9sZHMsIG9yIGEgbnVsbGlzaCB2YWx1ZSB3aGVuIGl0IGhvbGRzIG5vbmUuXG4gICAqXG4gICAqIEBwYXJhbSBrZXkgLSBUaGUgcGF0aCBvZiB0aGUgYmFja2xpbmstaG9sZGluZyBub3RlLlxuICAgKiBAcmV0dXJucyBUaGUgbGlua3MsIG9yIGEgbnVsbGlzaCB2YWx1ZS5cbiAgICovXG4gIGdldDogKGtleTogc3RyaW5nKSA9PiBudWxsIHwgcmVhZG9ubHkgUmVmZXJlbmNlW10gfCB1bmRlZmluZWQ7XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIHBhdGhzIG9mIHRoZSBiYWNrbGluay1ob2xkaW5nIG5vdGVzLlxuICAgKlxuICAgKiBAcmV0dXJucyBUaGUgcGF0aHMuXG4gICAqL1xuICBrZXlzOiAoKSA9PiBJdGVyYWJsZTxzdHJpbmc+O1xufVxuXG4vKipcbiAqIEEgY2FwdHVyZWQgc25hcHNob3Qgb2YgYSBzZXQgb2YgYmFja2xpbmtzOiB0aGUgcGF0aCBvZiBlYWNoIGJhY2tsaW5rLWhvbGRpbmcgbm90ZSwgbWFwcGVkIHRvIHRoZSBpZGVudGl0eVxuICoga2V5cyBvZiB0aGF0IG5vdGUncyBvd24gbGlua3MgdG8gdGhlIHRhcmdldChzKSwgZWFjaCBtYXBwZWQgdG8gdGhlIHBheWxvYWQgcmVjb3JkZWQgZm9yIGl0LlxuICpcbiAqIFRoZSBzbmFwc2hvdCBleGlzdHMgc28gdGhhdCB0aGUgZmV0Y2ggYW5kIHRoZSByZXdyaXRlIGNhbiBoYXBwZW4gYXQgZGlmZmVyZW50IG1vbWVudHMuIEEgcmVuYW1lIGludmFsaWRhdGVzXG4gKiB0aGUgbWV0YWRhdGEgY2FjaGUgZm9yIHRoZSBvbGQgcGF0aCwgc28gYSBjYWxsZXIgdGhhdCByZXdyaXRlcyBsaW5rcyAqKmFmdGVyKiogcmVuYW1pbmcgaGFzIHRvIGNhcHR1cmUgdGhlXG4gKiBiYWNrbGlua3MgKipiZWZvcmUqKiDigJQgd2hpY2ggaXMgd2h5IHtAbGluayBlZGl0QmFja2xpbmtzU25hcHNob3R9IHRha2VzIGEgc25hcHNob3QgcmF0aGVyIHRoYW4gYSBwYXRoLlxuICpcbiAqIFRoZSBwYXlsb2FkIGlzIHdoYXRldmVyIHRoZSBjYWxsZXIgbmVlZHMgdG8gcmVtZW1iZXIgcGVyIGxpbmsuIEl0IGlzIGB1bmRlZmluZWRgIGZvciBhIHNpbmdsZS10YXJnZXRcbiAqIHJld3JpdGUgKHRoZSB0YXJnZXQgaXMgaW1wbGllZCksIGFuZCB0aGUgb2xkIHRhcmdldCdzIHBhdGggZm9yIGEgbXVsdGktdGFyZ2V0IG9uZSwgd2hlcmUgb25lIG5vdGUncyBsaW5rc1xuICogbWF5IHBvaW50IGF0IHNldmVyYWwgZmlsZXMgdGhhdCBhbGwgbW92ZWQgYW5kIGVhY2ggbGluayBoYXMgdG8gYmUgcmVzb2x2ZWQgdG8gaXRzIG93biBuZXcgcGF0aC5cbiAqXG4gKiBAdHlwZVBhcmFtIFRQYXlsb2FkIC0gVGhlIHBheWxvYWQgcmVjb3JkZWQgZm9yIGVhY2ggbGluay5cbiAqL1xuZXhwb3J0IHR5cGUgQmFja2xpbmtzU25hcHNob3Q8VFBheWxvYWQ+ID0gUmVhZG9ubHlNYXA8c3RyaW5nLCBSZWFkb25seU1hcDxzdHJpbmcsIFRQYXlsb2FkPj47XG5cbi8qKlxuICogUGFyYW1zIGZvciB7QGxpbmsgYnVpbGRCYWNrbGlua3NTbmFwc2hvdH0uXG4gKlxuICogQHR5cGVQYXJhbSBUUGF5bG9hZCAtIFRoZSBwYXlsb2FkIHJlY29yZGVkIGZvciBlYWNoIGxpbmsuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQnVpbGRCYWNrbGlua3NTbmFwc2hvdFBhcmFtczxUUGF5bG9hZD4ge1xuICAvKipcbiAgICogVGhlIGJhY2tsaW5rcyB0byByZWNvcmQuXG4gICAqL1xuICByZWFkb25seSBiYWNrbGlua3M6IEJhY2tsaW5rc0xpa2U7XG5cbiAgLyoqXG4gICAqIENvbXB1dGVzIHRoZSBpZGVudGl0eSBrZXkgb2YgYSBsaW5rLlxuICAgKlxuICAgKiBUaGUgc25hcHNob3QgcmVtZW1iZXJzIGl0LCBzbyB7QGxpbmsgZWRpdEJhY2tsaW5rc1NuYXBzaG90fSBsb29rcyB0aGUgbGlua3MgdXAgd2l0aCB0aGUgc2FtZSBmdW5jdGlvblxuICAgKiB3aXRob3V0IGJlaW5nIHRvbGQuIFdoZW4ge0BsaW5rIEJ1aWxkQmFja2xpbmtzU25hcHNob3RQYXJhbXMudGFyZ2V0fSB3YXMgYnVpbHQgd2l0aCBhIHByb3ZpZGVyLCBvbWl0dGluZ1xuICAgKiB0aGlzIHJldXNlcyB0aGF0IG9uZSwgYW5kIHBhc3NpbmcgYSBkaWZmZXJlbnQgb25lIHRocm93czogYSBzbmFwc2hvdCBrZXllZCBieSB0d28gZnVuY3Rpb25zIG1hdGNoZXNcbiAgICogbm90aGluZy5cbiAgICpcbiAgICogQGRlZmF1bHQgdGhlIHByb3ZpZGVyIGB0YXJnZXRgIHdhcyBidWlsdCB3aXRoLCBlbHNlIGBKU09OLnN0cmluZ2lmeWBcbiAgICovXG4gIHJlYWRvbmx5IGxpbmtJZGVudGl0eUtleVByb3ZpZGVyPzogKGxpbms6IFJlZmVyZW5jZSkgPT4gc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBSZXdyaXRlcyB0aGUgcGF0aCBvZiBhIGJhY2tsaW5rLWhvbGRpbmcgbm90ZSBhcyBpdCB3aWxsIGJlICoqYWZ0ZXIqKiB0aGUgb3BlcmF0aW9uLlxuICAgKlxuICAgKiBBIG5vdGUgdGhhdCBob2xkcyBhIGJhY2tsaW5rIGNhbiBpdHNlbGYgYmUgcmVuYW1lZCBvciBtb3ZlZCBieSB0aGUgc2FtZSBvcGVyYXRpb24g4oCUIGluY2x1ZGluZyB0aGVcbiAgICogcmVuYW1lZCBub3RlJ3Mgb3duIHNlbGYtbGlua3MuIFJlbWFwcGluZyBoZXJlIGtleXMgdGhlIHNuYXBzaG90IGJ5IHRoZSBwYXRoIHRoZSByZXdyaXRlIHdpbGwgYWN0dWFsbHlcbiAgICogb3Blbi5cbiAgICpcbiAgICogQGRlZmF1bHQgdGhlIGlkZW50aXR5IGZ1bmN0aW9uXG4gICAqL1xuICByZWFkb25seSBwYXRoUmVtYXBwZXI/OiAoYmFja2xpbmtQYXRoOiBzdHJpbmcpID0+IHN0cmluZztcblxuICAvKipcbiAgICogUHJvZHVjZXMgdGhlIHBheWxvYWQgdG8gcmVjb3JkIGZvciBhIGxpbmsuIFNlZSB7QGxpbmsgQmFja2xpbmtzU25hcHNob3R9IGZvciB3aGF0IGEgcGF5bG9hZCBpcyBmb3IuXG4gICAqXG4gICAqIEBwYXJhbSBsaW5rIC0gVGhlIGxpbmsgYmVpbmcgcmVjb3JkZWQuXG4gICAqIEByZXR1cm5zIFRoZSBwYXlsb2FkLlxuICAgKi9cbiAgcmVhZG9ubHkgcGF5bG9hZFByb3ZpZGVyOiAobGluazogUmVmZXJlbmNlKSA9PiBUUGF5bG9hZDtcblxuICAvKipcbiAgICogQW4gZXhpc3Rpbmcgc25hcHNob3QgdG8gbWVyZ2UgaW50bywgc28gc2V2ZXJhbCBzZXRzIG9mIGJhY2tsaW5rcyBjYW4gYmUgYWNjdW11bGF0ZWQgaW50byBvbmUuXG4gICAqXG4gICAqIE1lcmdpbmcgaXMgd2hhdCBtYWtlcyBhIHNpbmdsZSByZXdyaXRlIHBhc3MgcGVyIG5vdGUgcG9zc2libGUgd2hlbiBhIG5vdGUgbGlua3MgdG8gc2V2ZXJhbCBtb3ZlZFxuICAgKiB0YXJnZXRzOiB3aXRob3V0IGl0LCBjYWxsaW5nIHRoZSByZXdyaXRlIG9uY2UgcGVyIHRhcmdldCB3b3VsZCBvcGVuIOKAlCBhbmQgd3JpdGUg4oCUIHRoZSBzYW1lIG5vdGVcbiAgICogcmVwZWF0ZWRseS5cbiAgICpcbiAgICogV2hlbiBvbWl0dGVkLCBhIG5ldyBzbmFwc2hvdCBpcyBjcmVhdGVkLlxuICAgKi9cbiAgcmVhZG9ubHkgdGFyZ2V0PzogTXV0YWJsZUJhY2tsaW5rc1NuYXBzaG90PFRQYXlsb2FkPjtcbn1cblxuLyoqXG4gKiBQYXJhbXMgZm9yIHtAbGluayBjb252ZXJ0TGlua30uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ29udmVydExpbmtQYXJhbXMge1xuICAvKipcbiAgICogQW4gT2JzaWRpYW4gYXBwIGluc3RhbmNlLlxuICAgKi9cbiAgcmVhZG9ubHkgYXBwOiBBcHA7XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdG8gYWxsb3cgYW4gZW1wdHkgYWxpYXMgZm9yIGVtYmVkcy5cbiAgICpcbiAgICogQXBwbGljYWJsZSBvbmx5IGlmIHRoZSByZXN1bHQgbGluayBzdHlsZSBpcyB7QGxpbmsgTGlua1N0eWxlLk1hcmtkb3dufS5cbiAgICpcbiAgICogSWYgYHRydWVgOiBgIVtdKGZvby5wbmcpYC5cbiAgICpcbiAgICogSWYgYGZhbHNlYDogYCFbZm9vXShmb28ucG5nKWAuXG4gICAqXG4gICAqIEBkZWZhdWx0IGB0cnVlYFxuICAgKi9cbiAgcmVhZG9ubHkgaXNFbXB0eUVtYmVkQWxpYXNBbGxvd2VkPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogQSByZWZlcmVuY2UgZm9yIHRoZSBsaW5rLlxuICAgKi9cbiAgcmVhZG9ubHkgbGluazogUmVmZXJlbmNlO1xuXG4gIC8qKlxuICAgKiBBIHN0eWxlIG9mIHRoZSBsaW5rIHBhdGguXG4gICAqL1xuICByZWFkb25seSBsaW5rUGF0aFN0eWxlPzogTGlua1BhdGhTdHlsZTtcblxuICAvKipcbiAgICogQSBzdHlsZSBvZiB0aGUgbGluay5cbiAgICovXG4gIHJlYWRvbmx5IGxpbmtTdHlsZT86IExpbmtTdHlsZTtcblxuICAvKipcbiAgICogQSBzb3VyY2UgZmlsZSBjb250YWluaW5nIHRoZSBsaW5rLlxuICAgKi9cbiAgcmVhZG9ubHkgbmV3U291cmNlUGF0aE9yRmlsZTogUGF0aE9yRmlsZTtcblxuICAvKipcbiAgICogQW4gb2xkIHBhdGggb2YgdGhlIGxpbmsuXG4gICAqL1xuICByZWFkb25seSBvbGRTb3VyY2VQYXRoT3JGaWxlPzogUGF0aE9yRmlsZTtcblxuICAvKipcbiAgICogV2hldGhlciB0byBlc2NhcGUgdGhlIGFsaWFzLlxuICAgKlxuICAgKiBBcHBsaWNhYmxlIG9ubHkgaWYgdGhlIHJlc3VsdCBsaW5rIHN0eWxlIGlzIHtAbGluayBMaW5rU3R5bGUuTWFya2Rvd259LlxuICAgKlxuICAgKiBJZiBgdHJ1ZWA6IGBbXFwqXFwqYWxpYXNcXCpcXCpdKGxpbmsubWQpYC5cbiAgICpcbiAgICogSWYgYGZhbHNlYDogYFsqKmFsaWFzKipdKGxpbmsubWQpYC5cbiAgICpcbiAgICogQGRlZmF1bHQgYGZhbHNlYFxuICAgKi9cbiAgcmVhZG9ubHkgc2hvdWxkRXNjYXBlQWxpYXM/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRvIGluY2x1ZGUgdGhlIGF0dGFjaG1lbnQgZXh0ZW5zaW9uIGluIHRoZSBlbWJlZCBhbGlhcy5cbiAgICpcbiAgICogQXBwbGljYWJsZSBvbmx5IGlmIHtAbGluayBpc0VtcHR5RW1iZWRBbGlhc0FsbG93ZWR9IGlzIGBmYWxzZWAuXG4gICAqXG4gICAqIElmIGB0cnVlYDogYFtmb28ucG5nXShmb28ucG5nKWAuXG4gICAqXG4gICAqIElmIGBmYWxzZWA6IGBbZm9vXShmb28ucG5nKWAuXG4gICAqXG4gICAqIEBkZWZhdWx0IGBmYWxzZWBcbiAgICovXG4gIHJlYWRvbmx5IHNob3VsZEluY2x1ZGVBdHRhY2htZW50RXh0ZW5zaW9uVG9FbWJlZEFsaWFzPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogV2hldGhlciB0byB1cGRhdGUgZmlsZSBuYW1lIGFsaWFzLlxuICAgKlxuICAgKiBAZGVmYXVsdCBgdHJ1ZWBcbiAgICovXG4gIHJlYWRvbmx5IHNob3VsZFVwZGF0ZUZpbGVOYW1lQWxpYXM/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBJbmRpY2F0ZXMgaWYgdGhlIGxpbmsgc2hvdWxkIHVzZSBhbmdsZSBicmFja2V0cy5cbiAgICpcbiAgICogQXBwbGljYWJsZSBvbmx5IGlmIHtAbGluayBsaW5rU3R5bGV9IGlzIHtAbGluayBMaW5rU3R5bGUuTWFya2Rvd259LlxuICAgKlxuICAgKiBJZiBgdHJ1ZWA6IGBbYWxpYXNdKDxwYXRoIHdpdGggc3BhY2VzLm1kPilgLlxuICAgKlxuICAgKiBJZiBgZmFsc2VgOiBgW2FsaWFzXShwYXRoJTIwd2l0aCUyMHNwYWNlcy5tZClgLlxuICAgKlxuICAgKiBAZGVmYXVsdCBgZmFsc2VgXG4gICAqL1xuICByZWFkb25seSBzaG91bGRVc2VBbmdsZUJyYWNrZXRzPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogSW5kaWNhdGVzIGlmIHRoZSBsaW5rIHNob3VsZCB1c2UgYSBsZWFkaW5nIGRvdC5cbiAgICpcbiAgICogQXBwbGljYWJsZSBvbmx5IGlmIHtAbGluayBsaW5rUGF0aFN0eWxlfSBpcyB7QGxpbmsgTGlua1BhdGhTdHlsZS5SZWxhdGl2ZVBhdGhUb1RoZVNvdXJjZX0uXG4gICAqXG4gICAqIElmIGB0cnVlYDogYFtbLi9yZWxhdGl2ZS9wYXRoL3RvL3RhcmdldF1dYFxuICAgKlxuICAgKiBJZiBgZmFsc2VgOiBgW1tyZWxhdGl2ZS9wYXRoL3RvL3RhcmdldF1dYFxuICAgKlxuICAgKiBAZGVmYXVsdCBgZmFsc2VgXG4gICAqL1xuICByZWFkb25seSBzaG91bGRVc2VMZWFkaW5nRG90Rm9yUmVsYXRpdmVQYXRocz86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIEluZGljYXRlcyBpZiB0aGUgbGluayBzaG91bGQgdXNlIGEgbGVhZGluZyBzbGFzaC5cbiAgICpcbiAgICogQXBwbGljYWJsZSBvbmx5IGlmIHtAbGluayBsaW5rUGF0aFN0eWxlfSBpcyB7QGxpbmsgTGlua1BhdGhTdHlsZS5BYnNvbHV0ZVBhdGhJblZhdWx0fS5cbiAgICpcbiAgICogSWYgYHRydWVgOiBgW1svYWJzb2x1dGUvcGF0aC90by90YXJnZXRdXWBcbiAgICpcbiAgICogSWYgYGZhbHNlYDogYFtbYWJzb2x1dGUvcGF0aC90by90YXJnZXRdXWBcbiAgICpcbiAgICogQGRlZmF1bHQgYGZhbHNlYFxuICAgKi9cbiAgcmVhZG9ubHkgc2hvdWxkVXNlTGVhZGluZ1NsYXNoRm9yQWJzb2x1dGVQYXRocz86IGJvb2xlYW47XG59XG5cbi8qKlxuICogT3B0aW9ucyBmb3Ige0BsaW5rIGVkaXRCYWNrbGlua3N9LlxuICovXG5leHBvcnQgdHlwZSBFZGl0QmFja2xpbmtzT3B0aW9ucyA9IFByb2Nlc3NPcHRpb25zO1xuXG4vKipcbiAqIFBhcmFtZXRlcnMgZm9yIHtAbGluayBlZGl0QmFja2xpbmtzfS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBFZGl0QmFja2xpbmtzUGFyYW1zIGV4dGVuZHMgRWRpdEJhY2tsaW5rc09wdGlvbnMge1xuICAvKipcbiAgICogVGhlIE9ic2lkaWFuIGFwcGxpY2F0aW9uIGluc3RhbmNlLlxuICAgKi9cbiAgcmVhZG9ubHkgYXBwOiBBcHA7XG5cbiAgLyoqXG4gICAqIFRoZSBmdW5jdGlvbiB0aGF0IGNvbnZlcnRzIGVhY2ggbGluay5cbiAgICovXG4gIHJlYWRvbmx5IGxpbmtDb252ZXJ0ZXI6IChsaW5rOiBSZWZlcmVuY2UpID0+IFByb21pc2FibGU8TWF5YmVSZXR1cm48c3RyaW5nPj47XG5cbiAgLyoqXG4gICAqIEFuIG9wdGlvbmFsIHJlcG9ydGVyIGludm9rZWQgb25jZSBwZXIgYmFja2xpbmsgZmlsZSBhZnRlciBpdHMgbGlua3MgYXJlIHVwZGF0ZWQsIHdpdGggdGhlIHJ1bm5pbmdcbiAgICogY291bnQgb2YgcHJvY2Vzc2VkIGZpbGVzIGFuZCB0aGUgdG90YWwuIFdoZW4gb21pdHRlZCwgbm8gcHJvZ3Jlc3MgaXMgcmVwb3J0ZWQuXG4gICAqL1xuICByZWFkb25seSBsaW5rVXBkYXRlUHJvZ3Jlc3NSZXBvcnRlcj86IExpbmtVcGRhdGVQcm9ncmVzc1JlcG9ydGVyO1xuXG4gIC8qKlxuICAgKiBUaGUgcGF0aCBvciBmaWxlIHRvIGVkaXQgdGhlIGJhY2tsaW5rcyBmb3IuXG4gICAqL1xuICByZWFkb25seSBwYXRoT3JGaWxlOiBQYXRoT3JGaWxlO1xufVxuXG4vKipcbiAqIE9wdGlvbnMgZm9yIHtAbGluayBlZGl0QmFja2xpbmtzU25hcHNob3R9LlxuICovXG5leHBvcnQgdHlwZSBFZGl0QmFja2xpbmtzU25hcHNob3RPcHRpb25zID0gUHJvY2Vzc09wdGlvbnM7XG5cbi8qKlxuICogUGFyYW1ldGVycyBmb3Ige0BsaW5rIGVkaXRCYWNrbGlua3NTbmFwc2hvdH0uXG4gKlxuICogQHR5cGVQYXJhbSBUUGF5bG9hZCAtIFRoZSBwYXlsb2FkIHJlY29yZGVkIGZvciBlYWNoIGxpbmsgd2hlbiB0aGUgc25hcHNob3Qgd2FzIGJ1aWx0LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEVkaXRCYWNrbGlua3NTbmFwc2hvdFBhcmFtczxUUGF5bG9hZD4gZXh0ZW5kcyBFZGl0QmFja2xpbmtzU25hcHNob3RPcHRpb25zIHtcbiAgLyoqXG4gICAqIFRoZSBPYnNpZGlhbiBhcHBsaWNhdGlvbiBpbnN0YW5jZS5cbiAgICovXG4gIHJlYWRvbmx5IGFwcDogQXBwO1xuXG4gIC8qKlxuICAgKiBUaGUgZnVuY3Rpb24gdGhhdCBjb252ZXJ0cyBlYWNoIGxpbmsuXG4gICAqL1xuICByZWFkb25seSBsaW5rQ29udmVydGVyOiAocGFyYW1zOiBCYWNrbGlua0NvbnZlcnNpb25QYXJhbXM8VFBheWxvYWQ+KSA9PiBQcm9taXNhYmxlPE1heWJlUmV0dXJuPHN0cmluZz4+O1xuXG4gIC8qKlxuICAgKiBDb21wdXRlcyB0aGUgaWRlbnRpdHkga2V5IG9mIGEgbGluay5cbiAgICpcbiAgICogTGVhdmUgaXQgb3V0IGZvciBhIHNuYXBzaG90IG1hZGUgYnkge0BsaW5rIGJ1aWxkQmFja2xpbmtzU25hcHNob3R9OiB0aGUgc25hcHNob3QgY2FycmllcyB0aGUgcHJvdmlkZXIgaXQgd2FzXG4gICAqIGJ1aWx0IHdpdGgsIGFuZCB0aGF0IG9uZSBpcyB1c2VkLiBQYXNzaW5nIGEgZGlmZmVyZW50IG9uZSB0aHJvd3MsIGJlY2F1c2UgdGhlIHNuYXBzaG90IGlzIGtleWVkIGJ5IHRoZVxuICAgKiBvdGhlciBhbmQgbm90IGEgc2luZ2xlIGxpbmsgd291bGQgbWF0Y2gg4oCUIHRoZSBlZGl0IHdvdWxkIGNvbXBsZXRlIGFuZCByZXdyaXRlIG5vdGhpbmcuIEl0IGlzIG5lZWRlZCBvbmx5XG4gICAqIGZvciBhIHNuYXBzaG90IGFzc2VtYmxlZCBieSBoYW5kLlxuICAgKlxuICAgKiBAZGVmYXVsdCB0aGUgcHJvdmlkZXIgdGhlIHNuYXBzaG90IHdhcyBidWlsdCB3aXRoLCBlbHNlIGBKU09OLnN0cmluZ2lmeWBcbiAgICovXG4gIHJlYWRvbmx5IGxpbmtJZGVudGl0eUtleVByb3ZpZGVyPzogKGxpbms6IFJlZmVyZW5jZSkgPT4gc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBBbiBvcHRpb25hbCByZXBvcnRlciBpbnZva2VkIG9uY2UgcGVyIGJhY2tsaW5rIGZpbGUgYWZ0ZXIgaXRzIGxpbmtzIGFyZSB1cGRhdGVkLCB3aXRoIHRoZSBydW5uaW5nXG4gICAqIGNvdW50IG9mIHByb2Nlc3NlZCBmaWxlcyBhbmQgdGhlIHRvdGFsLiBXaGVuIG9taXR0ZWQsIG5vIHByb2dyZXNzIGlzIHJlcG9ydGVkLlxuICAgKi9cbiAgcmVhZG9ubHkgbGlua1VwZGF0ZVByb2dyZXNzUmVwb3J0ZXI/OiBMaW5rVXBkYXRlUHJvZ3Jlc3NSZXBvcnRlcjtcblxuICAvKipcbiAgICogV2hldGhlciB0aGUgY29udmVydGVyIGlzIGFsc28gc2hvd24gbGlua3MgdGhhdCBhcmUgKipub3QqKiBpbiB0aGUgc25hcHNob3QsIHdpdGggYW4gYHVuZGVmaW5lZGBcbiAgICoge0BsaW5rIEJhY2tsaW5rQ29udmVyc2lvblBhcmFtcy5wYXlsb2FkfS5cbiAgICpcbiAgICogVGhlIGRlZmF1bHQgZmlsdGVycyB0aGVtIG91dCwgd2hpY2ggaXMgd2hhdCBhIHBsYWluIHJlbmFtZSB3YW50czogYSBsaW5rIGFic2VudCBmcm9tIHRoZSBzbmFwc2hvdCB3YXNcbiAgICogZWl0aGVyIG5ldmVyIHRoZSBjYWxsZXIncyB0byByZXdyaXRlLCBvciBoYXMgYWxyZWFkeSBiZWVuIHJld3JpdHRlbiBieSBzb21lb25lIGVsc2UuIFNldCB0aGlzIHRvIGB0cnVlYFxuICAgKiBvbmx5IHdoZW4gdGhlIGNhbGxlciBoYXMgaXRzIG93biByZWFzb24gdG8gbG9vayBhdCB0aGVtIOKAlCBhIHdpZGVuZWQgbWF0Y2ggb2YgaXRzIG93biwgb3IgbG9nZ2luZyBhIHNraXBcbiAgICogdGhhdCB3b3VsZCBvdGhlcndpc2UgYmUgc2lsZW50LlxuICAgKlxuICAgKiBAZGVmYXVsdCBgZmFsc2VgXG4gICAqL1xuICByZWFkb25seSBzaG91bGRWaXNpdFVubWF0Y2hlZExpbmtzPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogVGhlIGNhcHR1cmVkIGJhY2tsaW5rcyB0byBlZGl0LlxuICAgKi9cbiAgcmVhZG9ubHkgc25hcHNob3Q6IEJhY2tsaW5rc1NuYXBzaG90PFRQYXlsb2FkPjtcbn1cblxuLyoqXG4gKiBQYXJhbWV0ZXJzIGZvciB7QGxpbmsgZWRpdExpbmtzSW5Db250ZW50fS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBFZGl0TGlua3NJbkNvbnRlbnRQYXJhbXMge1xuICAvKipcbiAgICogVGhlIGFib3J0IHNpZ25hbCB0byBjb250cm9sIHRoZSBleGVjdXRpb24gb2YgdGhlIGZ1bmN0aW9uLlxuICAgKi9cbiAgcmVhZG9ubHkgYWJvcnRTaWduYWw/OiBBYm9ydFNpZ25hbDtcblxuICAvKipcbiAgICogVGhlIE9ic2lkaWFuIGFwcGxpY2F0aW9uIGluc3RhbmNlLlxuICAgKi9cbiAgcmVhZG9ubHkgYXBwOiBBcHA7XG5cbiAgLyoqXG4gICAqIFRoZSBjb250ZW50IHRvIGVkaXQgdGhlIGxpbmtzIGluLlxuICAgKi9cbiAgcmVhZG9ubHkgY29udGVudDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgZnVuY3Rpb24gdGhhdCBjb252ZXJ0cyBlYWNoIGxpbmsuXG4gICAqL1xuICByZWFkb25seSBsaW5rQ29udmVydGVyOiAobGluazogUmVmZXJlbmNlKSA9PiBQcm9taXNhYmxlPE1heWJlUmV0dXJuPHN0cmluZz4+O1xuXG4gIC8qKlxuICAgKiBBIHJhbmdlIHdpdGhpbiB7QGxpbmsgRWRpdExpbmtzSW5Db250ZW50UGFyYW1zLmNvbnRlbnR9LCBpbiBjaGFyYWN0ZXIgb2Zmc2V0cywgcmVzdHJpY3RpbmcgdGhlIHBhc3MgdG9cbiAgICogdGhlIGxpbmtzIGluc2lkZSBpdC4gV2hlbiBvbWl0dGVkLCBldmVyeSBsaW5rIGlzIHZpc2l0ZWQuXG4gICAqXG4gICAqIEEgbGluayBpcyBlZGl0ZWQgb25seSB3aGVuIGl0IGlzICoqZnVsbHkgY29udGFpbmVkKiogaW4gdGhlIHJhbmdlOyBvbmUgdGhhdCBtZXJlbHkgb3ZlcmxhcHMgaXQgaXMgbGVmdFxuICAgKiBhbG9uZSwgYmVjYXVzZSByZXdyaXRpbmcgcGFydCBvZiBhIGxpbmsgY29ycnVwdHMgaXQuIEJvdGggYm91bmRzIGFyZSBpbmNsdXNpdmUsIHNvIGEgcmFuZ2Ugd2hvc2VcbiAgICogb2Zmc2V0cyBjb2luY2lkZSBleGFjdGx5IHdpdGggYSBsaW5rJ3MgZG9lcyBpbmNsdWRlIHRoYXQgbGluay5cbiAgICpcbiAgICogQSByZWZlcmVuY2UgdGhhdCBjYXJyaWVzIG5vIHBvc2l0aW9uIHdpdGhpbiB0aGUgY29udGVudCDigJQgYSBmcm9udG1hdHRlciBsaW5rLCBhIG11bHRpLWxpbmsgZnJvbnRtYXR0ZXJcbiAgICogdmFsdWUgZW50cnksIG9yIGFueSBjYW52YXMgcmVmZXJlbmNlIOKAlCBpcyBuZXZlciBpbiByYW5nZSBhbmQgaXMgc2tpcHBlZCB3aGVuZXZlciBhIHJhbmdlIGlzIHN1cHBsaWVkLlxuICAgKlxuICAgKiBAZGVmYXVsdCBgdW5kZWZpbmVkYFxuICAgKi9cbiAgcmVhZG9ubHkgb2Zmc2V0UmFuZ2U/OiBPZmZzZXRSYW5nZTtcblxuICAvKipcbiAgICogV2hldGhlciB0byBhbHNvIGVkaXQgZXh0ZXJuYWwgbGlua3MgcGFyc2VkIGZyb20gdGhlIG5vdGUgYm9keS4gV2hlbiBgdHJ1ZWAsIHRoZSBjb252ZXJ0ZXIgYWxzb1xuICAgKiByZWNlaXZlcyByZWZlcmVuY2VzIGZvciBleHRlcm5hbCBsaW5rcy5cbiAgICpcbiAgICogQGRlZmF1bHQgYGZhbHNlYFxuICAgKi9cbiAgcmVhZG9ubHkgc2hvdWxkRWRpdEV4dGVybmFsTGlua3M/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRvIGFsc28gZWRpdCBleHRlcm5hbCBsaW5rcyBwYXJzZWQgZnJvbSBmcm9udG1hdHRlciB2YWx1ZXMuIFdoZW4gYHRydWVgLCB0aGUgY29udmVydGVyIGFsc29cbiAgICogcmVjZWl2ZXMgcmVmZXJlbmNlcyBmb3IgZnJvbnRtYXR0ZXIgZXh0ZXJuYWwgbGlua3MuXG4gICAqXG4gICAqIEBkZWZhdWx0IGBmYWxzZWBcbiAgICovXG4gIHJlYWRvbmx5IHNob3VsZEVkaXRGcm9udG1hdHRlckV4dGVybmFsTGlua3M/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRvIGFsc28gZWRpdCBleHRlcm5hbCBsaW5rcyBwYXJzZWQgZnJvbSBtdWx0aS1saW5rIChtdWx0aS12YWx1ZSkgZnJvbnRtYXR0ZXIgdmFsdWVzLiBXaGVuXG4gICAqIGB0cnVlYCwgdGhlIGNvbnZlcnRlciBhbHNvIHJlY2VpdmVzIHJlZmVyZW5jZXMgZm9yIGVhY2ggZXh0ZXJuYWwgbGluayB3aXRoaW4gYSBtdWx0aS1saW5rIGZyb250bWF0dGVyXG4gICAqIHZhbHVlIChlYWNoIGxvY2F0ZWQgYnkgaXRzIG9mZnNldHMsIHNvIG9ubHkgdGhhdCBsaW5rIGlzIHNwbGljZWQgYmFjayBpbiBwbGFjZSkuXG4gICAqXG4gICAqIEBkZWZhdWx0IGBmYWxzZWBcbiAgICovXG4gIHJlYWRvbmx5IHNob3VsZEVkaXRNdWx0aVZhbHVlRnJvbnRtYXR0ZXJFeHRlcm5hbExpbmtzPzogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBPcHRpb25zIGZvciB7QGxpbmsgZWRpdExpbmtzfS5cbiAqL1xuZXhwb3J0IHR5cGUgRWRpdExpbmtzT3B0aW9ucyA9IFByb2Nlc3NPcHRpb25zO1xuXG4vKipcbiAqIFBhcmFtZXRlcnMgZm9yIHtAbGluayBlZGl0TGlua3N9LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEVkaXRMaW5rc1BhcmFtcyBleHRlbmRzIEVkaXRMaW5rc09wdGlvbnMge1xuICAvKipcbiAgICogVGhlIE9ic2lkaWFuIGFwcGxpY2F0aW9uIGluc3RhbmNlLlxuICAgKi9cbiAgcmVhZG9ubHkgYXBwOiBBcHA7XG5cbiAgLyoqXG4gICAqIFRoZSBmdW5jdGlvbiB0aGF0IGNvbnZlcnRzIGVhY2ggbGluay5cbiAgICovXG4gIHJlYWRvbmx5IGxpbmtDb252ZXJ0ZXI6IChsaW5rOiBSZWZlcmVuY2UpID0+IFByb21pc2FibGU8TWF5YmVSZXR1cm48c3RyaW5nPj47XG5cbiAgLyoqXG4gICAqIEEgcmFuZ2Ugd2l0aGluIHRoZSBmaWxlJ3MgY29udGVudCwgaW4gY2hhcmFjdGVyIG9mZnNldHMsIHJlc3RyaWN0aW5nIHRoZSBwYXNzIHRvIHRoZSBsaW5rcyBpbnNpZGUgaXQuXG4gICAqIFdoZW4gb21pdHRlZCwgZXZlcnkgbGluayBpcyB2aXNpdGVkLlxuICAgKlxuICAgKiBBIGxpbmsgaXMgZWRpdGVkIG9ubHkgd2hlbiBpdCBpcyAqKmZ1bGx5IGNvbnRhaW5lZCoqIGluIHRoZSByYW5nZTsgb25lIHRoYXQgbWVyZWx5IG92ZXJsYXBzIGl0IGlzIGxlZnRcbiAgICogYWxvbmUsIGJlY2F1c2UgcmV3cml0aW5nIHBhcnQgb2YgYSBsaW5rIGNvcnJ1cHRzIGl0LiBCb3RoIGJvdW5kcyBhcmUgaW5jbHVzaXZlLCBzbyBhIHJhbmdlIHdob3NlXG4gICAqIG9mZnNldHMgY29pbmNpZGUgZXhhY3RseSB3aXRoIGEgbGluaydzIGRvZXMgaW5jbHVkZSB0aGF0IGxpbmsuXG4gICAqXG4gICAqIEEgcmVmZXJlbmNlIHRoYXQgY2FycmllcyBubyBwb3NpdGlvbiB3aXRoaW4gdGhlIGZpbGUncyBjb250ZW50IOKAlCBhIGZyb250bWF0dGVyIGxpbmssIGEgbXVsdGktbGlua1xuICAgKiBmcm9udG1hdHRlciB2YWx1ZSBlbnRyeSwgb3IgYW55IGNhbnZhcyByZWZlcmVuY2Ug4oCUIGlzIG5ldmVyIGluIHJhbmdlIGFuZCBpcyBza2lwcGVkIHdoZW5ldmVyIGEgcmFuZ2UgaXNcbiAgICogc3VwcGxpZWQuXG4gICAqXG4gICAqIFRoZSBvZmZzZXRzIGFyZSBpbnRvIHRoZSBjb250ZW50IHRoaXMgZnVuY3Rpb24gcmVhZHMgZnJvbSB0aGUgdmF1bHQuIEJlZm9yZSByZWFkaW5nLCBpdCBzYXZlcyBhbnlcbiAgICogdW5zYXZlZCBlZGl0b3IgYnVmZmVyIGZvciB0aGUgZmlsZSwgc28gYSByYW5nZSB0YWtlbiBmcm9tIGFuIG9wZW4gZWRpdG9yIHZpYSBgRWRpdG9yLnBvc1RvT2Zmc2V0YCBpc1xuICAgKiB2YWxpZC4gVGhlIGNhbGxlciBvd25zIG9ubHkgdGhlIGNhc2Ugd2hlcmUgdGhlIGJ1ZmZlciBjaGFuZ2VzIGJldHdlZW4gY29tcHV0aW5nIHRoZSByYW5nZSBhbmQgdGhpc1xuICAgKiBjYWxsLlxuICAgKlxuICAgKiBAZGVmYXVsdCBgdW5kZWZpbmVkYFxuICAgKi9cbiAgcmVhZG9ubHkgb2Zmc2V0UmFuZ2U/OiBPZmZzZXRSYW5nZTtcblxuICAvKipcbiAgICogVGhlIHBhdGggb3IgZmlsZSB0byBlZGl0IHRoZSBsaW5rcyBmb3IuXG4gICAqL1xuICByZWFkb25seSBwYXRoT3JGaWxlOiBQYXRoT3JGaWxlO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRvIGFsc28gZWRpdCBleHRlcm5hbCBsaW5rcyBwYXJzZWQgZnJvbSB0aGUgbm90ZSBib2R5LiBXaGVuIGB0cnVlYCwgdGhlIGNvbnZlcnRlciBhbHNvXG4gICAqIHJlY2VpdmVzIHJlZmVyZW5jZXMgZm9yIGV4dGVybmFsIGxpbmtzLlxuICAgKlxuICAgKiBAZGVmYXVsdCBgZmFsc2VgXG4gICAqL1xuICByZWFkb25seSBzaG91bGRFZGl0RXh0ZXJuYWxMaW5rcz86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdG8gYWxzbyBlZGl0IGV4dGVybmFsIGxpbmtzIHBhcnNlZCBmcm9tIGZyb250bWF0dGVyIHZhbHVlcy4gV2hlbiBgdHJ1ZWAsIHRoZSBjb252ZXJ0ZXIgYWxzb1xuICAgKiByZWNlaXZlcyByZWZlcmVuY2VzIGZvciBmcm9udG1hdHRlciBleHRlcm5hbCBsaW5rcy5cbiAgICpcbiAgICogQGRlZmF1bHQgYGZhbHNlYFxuICAgKi9cbiAgcmVhZG9ubHkgc2hvdWxkRWRpdEZyb250bWF0dGVyRXh0ZXJuYWxMaW5rcz86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdG8gYWxzbyBlZGl0IGV4dGVybmFsIGxpbmtzIHBhcnNlZCBmcm9tIG11bHRpLWxpbmsgKG11bHRpLXZhbHVlKSBmcm9udG1hdHRlciB2YWx1ZXMuIFdoZW5cbiAgICogYHRydWVgLCB0aGUgY29udmVydGVyIGFsc28gcmVjZWl2ZXMgcmVmZXJlbmNlcyBmb3IgZWFjaCBleHRlcm5hbCBsaW5rIHdpdGhpbiBhIG11bHRpLWxpbmsgZnJvbnRtYXR0ZXJcbiAgICogdmFsdWUgKGVhY2ggbG9jYXRlZCBieSBpdHMgb2Zmc2V0cywgc28gb25seSB0aGF0IGxpbmsgaXMgc3BsaWNlZCBiYWNrIGluIHBsYWNlKS5cbiAgICpcbiAgICogQGRlZmF1bHQgYGZhbHNlYFxuICAgKi9cbiAgcmVhZG9ubHkgc2hvdWxkRWRpdE11bHRpVmFsdWVGcm9udG1hdHRlckV4dGVybmFsTGlua3M/OiBib29sZWFuO1xufVxuXG4vKipcbiAqIFBhcmFtZXRlcnMgZm9yIHtAbGluayBleHRyYWN0TGlua0ZpbGV9LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEV4dHJhY3RMaW5rRmlsZVBhcmFtcyB7XG4gIC8qKlxuICAgKiBUaGUgT2JzaWRpYW4gYXBwbGljYXRpb24gaW5zdGFuY2UuXG4gICAqL1xuICByZWFkb25seSBhcHA6IEFwcDtcblxuICAvKipcbiAgICogVGhlIHJlZmVyZW5jZSBjYWNoZSBmb3IgdGhlIGxpbmsuXG4gICAqL1xuICByZWFkb25seSBsaW5rOiBSZWZlcmVuY2U7XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdG8gYWxsb3cgbm9uLWV4aXN0aW5nIGZpbGVzLlxuICAgKlxuICAgKiBAZGVmYXVsdCBgZmFsc2VgXG4gICAqL1xuICByZWFkb25seSBzaG91bGRBbGxvd05vbkV4aXN0aW5nRmlsZT86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFRoZSBzb3VyY2UgcGF0aCBvciBmaWxlLlxuICAgKi9cbiAgcmVhZG9ubHkgc291cmNlUGF0aE9yRmlsZTogUGF0aE9yRmlsZTtcbn1cblxuLyoqXG4gKiBQYXJhbXMgZm9yIHtAbGluayBnZW5lcmF0ZU1hcmtkb3duTGlua30uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgR2VuZXJhdGVNYXJrZG93bkxpbmtQYXJhbXMge1xuICAvKipcbiAgICogQW4gYWxpYXMgZm9yIHRoZSBsaW5rLlxuICAgKlxuICAgKiBAZXhhbXBsZSBgW1thbGlhc3xsaW5rXV1gXG4gICAqIEBleGFtcGxlIGBbYWxpYXNdKGxpbmsubWQpYFxuICAgKi9cbiAgcmVhZG9ubHkgYWxpYXM/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEFuIE9ic2lkaWFuIGFwcCBpbnN0YW5jZS5cbiAgICovXG4gIHJlYWRvbmx5IGFwcDogQXBwO1xuXG4gIC8qKlxuICAgKiBJbmRpY2F0ZXMgaWYgdGhlIGxpbmsgc2hvdWxkIGJlIGVtYmVkZGVkLiBJZiBub3QgcHJvdmlkZWQsIGl0IHdpbGwgYmUgaW5mZXJyZWQgYmFzZWQgb24gdGhlIGZpbGUgdHlwZS5cbiAgICpcbiAgICogSWYgYHRydWVgOiBgIVtbdGFyZ2V0XV1gLlxuICAgKlxuICAgKiBJZiBgZmFsc2VgOiBgW1t0YXJnZXRdXWAuXG4gICAqL1xuICByZWFkb25seSBpc0VtYmVkPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogV2hldGhlciB0byBhbGxvdyBhbiBlbXB0eSBhbGlhcyBmb3IgZW1iZWRzLlxuICAgKlxuICAgKiBBcHBsaWNhYmxlIG9ubHkgaWYgdGhlIHJlc3VsdCBsaW5rIHN0eWxlIGlzIHtAbGluayBMaW5rU3R5bGUuTWFya2Rvd259LlxuICAgKlxuICAgKiBJZiBgdHJ1ZWA6IGAhW10oZm9vLnBuZylgLlxuICAgKlxuICAgKiBJZiBgZmFsc2VgOiBgIVtmb29dKGZvby5wbmcpYC5cbiAgICpcbiAgICogQGRlZmF1bHQgYHRydWVgXG4gICAqL1xuICByZWFkb25seSBpc0VtcHR5RW1iZWRBbGlhc0FsbG93ZWQ/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRvIGFsbG93IG5vbi1leGlzdGluZyBmaWxlcy5cbiAgICpcbiAgICogSWYgYGZhbHNlYCBhbmQge0BsaW5rIHRhcmdldFBhdGhPckZpbGV9IGlzIGEgbm9uLWV4aXN0aW5nIGZpbGUsIGFuIGVycm9yIHdpbGwgYmUgdGhyb3duLlxuICAgKlxuICAgKiBAZGVmYXVsdCBgZmFsc2VgXG4gICAqL1xuICByZWFkb25seSBpc05vbkV4aXN0aW5nRmlsZUFsbG93ZWQ/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRvIGFsbG93IGEgc2luZ2xlIHN1YnBhdGguXG4gICAqXG4gICAqIEFwcGxpY2FibGUgb25seSBpZiB7QGxpbmsgdGFyZ2V0UGF0aE9yRmlsZX0gYW5kIHtAbGluayBzb3VyY2VQYXRoT3JGaWxlfSBhcmUgdGhlIHNhbWUgZmlsZS5cbiAgICpcbiAgICogSWYgYHRydWVgOiBgW1sjc3VicGF0aF1dYC5cbiAgICpcbiAgICogSWYgYGZhbHNlYDogYFtbc291cmNlI3N1YnBhdGhdXWBcbiAgICpcbiAgICogQGRlZmF1bHQgYHRydWVgXG4gICAqL1xuICByZWFkb25seSBpc1NpbmdsZVN1YnBhdGhBbGxvd2VkPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogQSBzdHlsZSBvZiB0aGUgbGluayBwYXRoLlxuICAgKi9cbiAgcmVhZG9ubHkgbGlua1BhdGhTdHlsZT86IExpbmtQYXRoU3R5bGU7XG5cbiAgLyoqXG4gICAqIEEgc3R5bGUgb2YgdGhlIGxpbmsuXG4gICAqL1xuICByZWFkb25seSBsaW5rU3R5bGU/OiBMaW5rU3R5bGU7XG5cbiAgLyoqXG4gICAqIEFuIG9yaWdpbmFsIGxpbmsgdGV4dC5cbiAgICpcbiAgICogSWYgcHJvdmlkZWQsIGl0IHdpbGwgYmUgdXNlZCB0byBpbmZlciB0aGUgdmFsdWVzIG9mXG4gICAqXG4gICAqIC0ge0BsaW5rIGhhc0VtYmVkU3ludGF4fVxuICAgKiAtIHtAbGluayBsaW5rU3R5bGV9XG4gICAqIC0ge0BsaW5rIHNob3VsZFVzZUFuZ2xlQnJhY2tldHN9XG4gICAqIC0ge0BsaW5rIHNob3VsZFVzZUxlYWRpbmdEb3RGb3JSZWxhdGl2ZVBhdGhzfVxuICAgKiAtIHtAbGluayBzaG91bGRVc2VMZWFkaW5nU2xhc2hGb3JBYnNvbHV0ZVBhdGhzfVxuICAgKlxuICAgKiBUaGVzZSBpbmZlcnJlZCB2YWx1ZXMgd2lsbCBiZSBvdmVycmlkZGVuIGJ5IGNvcnJlc3BvbmRpbmcgc2V0dGluZ3MgaWYgc3BlY2lmaWVkLlxuICAgKi9cbiAgcmVhZG9ubHkgb3JpZ2luYWxMaW5rPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRvIGVzY2FwZSB0aGUgYWxpYXMuXG4gICAqXG4gICAqIEFwcGxpY2FibGUgb25seSBpZiB0aGUgcmVzdWx0IGxpbmsgc3R5bGUgaXMge0BsaW5rIExpbmtTdHlsZS5NYXJrZG93bn0uXG4gICAqXG4gICAqIElmIGB0cnVlYDogYFtcXCpcXCphbGlhc1xcKlxcKl0obGluay5tZClgLlxuICAgKlxuICAgKiBJZiBgZmFsc2VgOiBgWyoqYWxpYXMqKl0obGluay5tZClgLlxuICAgKlxuICAgKiBAZGVmYXVsdCBgZmFsc2VgXG4gICAqL1xuICByZWFkb25seSBzaG91bGRFc2NhcGVBbGlhcz86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdG8gaW5jbHVkZSB0aGUgYXR0YWNobWVudCBleHRlbnNpb24gaW4gdGhlIGVtYmVkIGFsaWFzLlxuICAgKlxuICAgKiBBcHBsaWNhYmxlIG9ubHkgaWYge0BsaW5rIGlzRW1wdHlFbWJlZEFsaWFzQWxsb3dlZH0gaXMgYGZhbHNlYC5cbiAgICpcbiAgICogSWYgYHRydWVgOiBgW2Zvby5wbmddKGZvby5wbmcpYC5cbiAgICpcbiAgICogSWYgYGZhbHNlYDogYFtmb29dKGZvby5wbmcpYC5cbiAgICpcbiAgICogQGRlZmF1bHQgYGZhbHNlYFxuICAgKi9cbiAgcmVhZG9ubHkgc2hvdWxkSW5jbHVkZUF0dGFjaG1lbnRFeHRlbnNpb25Ub0VtYmVkQWxpYXM/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBJbmRpY2F0ZXMgaWYgdGhlIGxpbmsgc2hvdWxkIHVzZSBhbmdsZSBicmFja2V0cy5cbiAgICpcbiAgICogQXBwbGljYWJsZSBvbmx5IGlmIHtAbGluayBsaW5rU3R5bGV9IGlzIHtAbGluayBMaW5rU3R5bGUuTWFya2Rvd259LlxuICAgKlxuICAgKiBJZiBgdHJ1ZWA6IGBbYWxpYXNdKDxwYXRoIHdpdGggc3BhY2VzLm1kPilgLlxuICAgKlxuICAgKiBJZiBgZmFsc2VgOiBgW2FsaWFzXShwYXRoJTIwd2l0aCUyMHNwYWNlcy5tZClgLlxuICAgKlxuICAgKiBAZGVmYXVsdCBgZmFsc2VgXG4gICAqL1xuICByZWFkb25seSBzaG91bGRVc2VBbmdsZUJyYWNrZXRzPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogSW5kaWNhdGVzIGlmIHRoZSBsaW5rIHNob3VsZCB1c2UgYSBsZWFkaW5nIGRvdC5cbiAgICpcbiAgICogQXBwbGljYWJsZSBvbmx5IGlmIHtAbGluayBsaW5rUGF0aFN0eWxlfSBpcyB7QGxpbmsgTGlua1BhdGhTdHlsZS5SZWxhdGl2ZVBhdGhUb1RoZVNvdXJjZX0uXG4gICAqXG4gICAqIElmIGB0cnVlYDogYFtbLi9yZWxhdGl2ZS9wYXRoL3RvL3RhcmdldF1dYFxuICAgKlxuICAgKiBJZiBgZmFsc2VgOiBgW1tyZWxhdGl2ZS9wYXRoL3RvL3RhcmdldF1dYFxuICAgKlxuICAgKiBAZGVmYXVsdCBgZmFsc2VgXG4gICAqL1xuICByZWFkb25seSBzaG91bGRVc2VMZWFkaW5nRG90Rm9yUmVsYXRpdmVQYXRocz86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIEluZGljYXRlcyBpZiB0aGUgbGluayBzaG91bGQgdXNlIGEgbGVhZGluZyBzbGFzaC5cbiAgICpcbiAgICogQXBwbGljYWJsZSBvbmx5IGlmIHtAbGluayBsaW5rUGF0aFN0eWxlfSBpcyB7QGxpbmsgTGlua1BhdGhTdHlsZS5BYnNvbHV0ZVBhdGhJblZhdWx0fS5cbiAgICpcbiAgICogSWYgYHRydWVgOiBgW1svYWJzb2x1dGUvcGF0aC90by90YXJnZXRdXWBcbiAgICpcbiAgICogSWYgYGZhbHNlYDogYFtbYWJzb2x1dGUvcGF0aC90by90YXJnZXRdXWBcbiAgICpcbiAgICogQGRlZmF1bHQgYGZhbHNlYFxuICAgKi9cbiAgcmVhZG9ubHkgc2hvdWxkVXNlTGVhZGluZ1NsYXNoRm9yQWJzb2x1dGVQYXRocz86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIEEgc291cmNlIHBhdGggb2YgdGhlIGxpbmsuXG4gICAqL1xuICByZWFkb25seSBzb3VyY2VQYXRoT3JGaWxlOiBQYXRoT3JGaWxlO1xuXG4gIC8qKlxuICAgKiBBIHN1YnBhdGggb2YgdGhlIGxpbmsuXG4gICAqXG4gICAqIFNob3VsZCBiZSBlbXB0eSBvciBzdGFydCB3aXRoIGAjYC5cbiAgICpcbiAgICogQGV4YW1wbGUgYFtbbGluay13aXRoLWVtcHR5LXN1YnBhdGhdXWBcbiAgICogQGV4YW1wbGUgYFtbbGluay13aXRoLXN1YnBhdGgjc3VicGF0aF1dYFxuICAgKiBAZXhhbXBsZSBgW1tsaW5rLXdpdGgtc3VicGF0aCNzdWJwYXRoI25lc3RlZC1zdWJwYXRoXV1gXG4gICAqIEBkZWZhdWx0IGAnJ2BcbiAgICovXG4gIHJlYWRvbmx5IHN1YnBhdGg/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEEgdGFyZ2V0IHBhdGggb3IgZmlsZS5cbiAgICovXG4gIHJlYWRvbmx5IHRhcmdldFBhdGhPckZpbGU6IFBhdGhPckZpbGU7XG59XG5cbi8qKlxuICogUGFyYW1zIGZvciB7QGxpbmsgZ2VuZXJhdGVSYXdNYXJrZG93bkxpbmt9LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEdlbmVyYXRlUmF3TWFya2Rvd25MaW5rUGFyYW1zIHtcbiAgLyoqXG4gICAqIEFuIGFsaWFzIG9mIHRoZSBsaW5rLiBEZWZhdWx0cyB0byBgdW5kZWZpbmVkYC5cbiAgICovXG4gIHJlYWRvbmx5IGFsaWFzPzogc3RyaW5nIHwgdW5kZWZpbmVkO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRoZSBsaW5rIHNob3VsZCBiZSBhbiBlbWJlZCBsaW5rLlxuICAgKlxuICAgKiBAZGVmYXVsdCBgZmFsc2VgXG4gICAqL1xuICByZWFkb25seSBpc0VtYmVkPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogV2hldGhlciB0aGUgbGluayBzaG91bGQgYmUgYSB3aWtpbGluay5cbiAgICovXG4gIHJlYWRvbmx5IGlzV2lraWxpbms6IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdG8gZXNjYXBlIHRoZSBhbGlhcy4gQXBwbGljYWJsZSBvbmx5IGlmIHtAbGluayBoYXNXaWtpbGlua1N5bnRheH0gaXMgYGZhbHNlYC5cbiAgICpcbiAgICogQGRlZmF1bHQgYGZhbHNlYFxuICAgKi9cbiAgcmVhZG9ubHkgc2hvdWxkRXNjYXBlQWxpYXM/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRvIHVzZSBhbmdsZSBicmFja2V0cy4gQXBwbGljYWJsZSBvbmx5IGlmIHtAbGluayBoYXNXaWtpbGlua1N5bnRheH0gaXMgYGZhbHNlYC5cbiAgICpcbiAgICogQGRlZmF1bHQgYGZhbHNlYFxuICAgKi9cbiAgcmVhZG9ubHkgc2hvdWxkVXNlQW5nbGVCcmFja2V0cz86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIEEgdGl0bGUgb2YgdGhlIGxpbmsuXG4gICAqL1xuICByZWFkb25seSB0aXRsZT86IHN0cmluZztcblxuICAvKipcbiAgICogQW4gVVJMIG9mIHRoZSBsaW5rLlxuICAgKi9cbiAgcmVhZG9ubHkgdXJsOiBzdHJpbmc7XG59XG5cbi8qKlxuICogQSB7QGxpbmsgQmFja2xpbmtzU25hcHNob3R9IHdoaWxlIGl0IGlzIHN0aWxsIGJlaW5nIGFjY3VtdWxhdGVkIGJ5IHtAbGluayBidWlsZEJhY2tsaW5rc1NuYXBzaG90fS5cbiAqXG4gKiBAdHlwZVBhcmFtIFRQYXlsb2FkIC0gVGhlIHBheWxvYWQgcmVjb3JkZWQgZm9yIGVhY2ggbGluay5cbiAqL1xuZXhwb3J0IHR5cGUgTXV0YWJsZUJhY2tsaW5rc1NuYXBzaG90PFRQYXlsb2FkPiA9IE1hcDxzdHJpbmcsIE1hcDxzdHJpbmcsIFRQYXlsb2FkPj47XG5cbi8qKlxuICogUGFyYW1zIGZvciB7QGxpbmsgc2hvdWxkUmVzZXRBbGlhc30uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU2hvdWxkUmVzZXRBbGlhc1BhcmFtcyB7XG4gIC8qKlxuICAgKiBBbiBPYnNpZGlhbiBhcHAgaW5zdGFuY2UuXG4gICAqL1xuICByZWFkb25seSBhcHA6IEFwcDtcblxuICAvKipcbiAgICogQSBkaXNwbGF5IHRleHQgb2YgdGhlIGxpbmsuXG4gICAqL1xuICByZWFkb25seSBkaXNwbGF5VGV4dDogc3RyaW5nIHwgdW5kZWZpbmVkO1xuXG4gIC8qKlxuICAgKiBJbmRpY2F0ZXMgaWYgdGhlIGxpbmsgaXMgYSB3aWtpbGluay5cbiAgICovXG4gIHJlYWRvbmx5IGlzV2lraWxpbms/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBBIHNvdXJjZSBwYXRoIG9mIHRoZSBsaW5rLlxuICAgKi9cbiAgcmVhZG9ubHkgbmV3U291cmNlUGF0aE9yRmlsZTogUGF0aE9yRmlsZTtcblxuICAvKipcbiAgICogQW4gb2xkIHNvdXJjZSBmaWxlIGNvbnRhaW5pbmcgdGhlIGxpbmsuXG4gICAqL1xuICByZWFkb25seSBvbGRTb3VyY2VQYXRoT3JGaWxlPzogUGF0aE9yRmlsZTtcblxuICAvKipcbiAgICogQW4gb2xkIHRhcmdldCBwYXRoIG9mIHRoZSBsaW5rLlxuICAgKi9cbiAgcmVhZG9ubHkgb2xkVGFyZ2V0UGF0aDogUGF0aE9yRmlsZTtcblxuICAvKipcbiAgICogQSB0YXJnZXQgcGF0aCBvciBmaWxlLlxuICAgKi9cbiAgcmVhZG9ubHkgdGFyZ2V0UGF0aE9yRmlsZTogUGF0aE9yRmlsZTtcbn1cblxuLyoqXG4gKiBTcGxpdHMgYSBsaW5rIGludG8gaXRzIGxpbmsgcGF0aCBhbmQgc3VicGF0aC5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTcGxpdFN1YnBhdGhSZXN1bHQge1xuICAvKipcbiAgICogQSBsaW5rIHBhdGguXG4gICAqL1xuICByZWFkb25seSBsaW5rUGF0aDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBBIHN1YnBhdGguXG4gICAqL1xuICByZWFkb25seSBzdWJwYXRoOiBzdHJpbmc7XG59XG5cbi8qKlxuICogUGFyYW1zIGZvciB7QGxpbmsgdXBkYXRlRmlsZVVybExpbmtzSW5Db250ZW50fS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBVcGRhdGVGaWxlVXJsTGlua3NJbkNvbnRlbnRQYXJhbXMge1xuICAvKipcbiAgICogVGhlIGFib3J0IHNpZ25hbCB0byBjb250cm9sIHRoZSBleGVjdXRpb24gb2YgdGhlIGZ1bmN0aW9uLlxuICAgKi9cbiAgcmVhZG9ubHkgYWJvcnRTaWduYWw/OiBBYm9ydFNpZ25hbDtcblxuICAvKipcbiAgICogQW4gT2JzaWRpYW4gYXBwIGluc3RhbmNlLlxuICAgKi9cbiAgcmVhZG9ubHkgYXBwOiBBcHA7XG5cbiAgLyoqXG4gICAqIFRoZSBjb250ZW50IHRvIG5vcm1hbGl6ZSB0aGUgYGZpbGU6Ly9gIGxpbmtzIGluLlxuICAgKi9cbiAgcmVhZG9ubHkgY29udGVudDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBBIHJhbmdlIHdpdGhpbiB7QGxpbmsgVXBkYXRlRmlsZVVybExpbmtzSW5Db250ZW50UGFyYW1zLmNvbnRlbnR9LCBpbiBjaGFyYWN0ZXIgb2Zmc2V0cywgcmVzdHJpY3RpbmdcbiAgICogdGhlIHBhc3MgdG8gdGhlIGxpbmtzIGluc2lkZSBpdC4gV2hlbiBvbWl0dGVkLCBldmVyeSBsaW5rIGlzIHZpc2l0ZWQuXG4gICAqXG4gICAqIEEgbGluayBpcyBub3JtYWxpemVkIG9ubHkgd2hlbiBpdCBpcyAqKmZ1bGx5IGNvbnRhaW5lZCoqIGluIHRoZSByYW5nZTsgb25lIHRoYXQgbWVyZWx5IG92ZXJsYXBzIGl0IGlzXG4gICAqIGxlZnQgYWxvbmUsIGJlY2F1c2UgcmV3cml0aW5nIHBhcnQgb2YgYSBsaW5rIGNvcnJ1cHRzIGl0LiBCb3RoIGJvdW5kcyBhcmUgaW5jbHVzaXZlLCBzbyBhIHJhbmdlIHdob3NlXG4gICAqIG9mZnNldHMgY29pbmNpZGUgZXhhY3RseSB3aXRoIGEgbGluaydzIGRvZXMgaW5jbHVkZSB0aGF0IGxpbmsuXG4gICAqXG4gICAqIEEgcmVmZXJlbmNlIHRoYXQgY2FycmllcyBubyBwb3NpdGlvbiB3aXRoaW4gdGhlIGNvbnRlbnQg4oCUIGEgZnJvbnRtYXR0ZXIgbGluaywgYSBtdWx0aS1saW5rIGZyb250bWF0dGVyXG4gICAqIHZhbHVlIGVudHJ5LCBvciBhbnkgY2FudmFzIHJlZmVyZW5jZSDigJQgaXMgbmV2ZXIgaW4gcmFuZ2UgYW5kIGlzIHNraXBwZWQgd2hlbmV2ZXIgYSByYW5nZSBpcyBzdXBwbGllZC5cbiAgICpcbiAgICogQGRlZmF1bHQgYHVuZGVmaW5lZGBcbiAgICovXG4gIHJlYWRvbmx5IG9mZnNldFJhbmdlPzogT2Zmc2V0UmFuZ2U7XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdG8gZW1pdCB0aGUgbm9ybWFsaXplZCBsaW5rcyB3aXRoIGFuZ2xlIGJyYWNrZXRzIGFuZCByYXcgc3BhY2VzIGluc3RlYWQgb2YgYCUyMGAtZW5jb2RpbmcuXG4gICAqXG4gICAqIEBkZWZhdWx0IGBmYWxzZWBcbiAgICovXG4gIHJlYWRvbmx5IHNob3VsZFVzZUFuZ2xlQnJhY2tldHM/OiBib29sZWFuO1xufVxuXG4vKipcbiAqIFBhcmFtcyBmb3Ige0BsaW5rIHVwZGF0ZUZpbGVVcmxMaW5rc0luRmlsZX0uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVXBkYXRlRmlsZVVybExpbmtzSW5GaWxlUGFyYW1zIGV4dGVuZHMgUHJvY2Vzc09wdGlvbnMge1xuICAvKipcbiAgICogQW4gT2JzaWRpYW4gYXBwIGluc3RhbmNlLlxuICAgKi9cbiAgcmVhZG9ubHkgYXBwOiBBcHA7XG5cbiAgLyoqXG4gICAqIEEgcmFuZ2Ugd2l0aGluIHRoZSBmaWxlJ3MgY29udGVudCwgaW4gY2hhcmFjdGVyIG9mZnNldHMsIHJlc3RyaWN0aW5nIHRoZSBwYXNzIHRvIHRoZSBsaW5rcyBpbnNpZGUgaXQuXG4gICAqIFdoZW4gb21pdHRlZCwgZXZlcnkgbGluayBpcyB2aXNpdGVkLlxuICAgKlxuICAgKiBBIGxpbmsgaXMgbm9ybWFsaXplZCBvbmx5IHdoZW4gaXQgaXMgKipmdWxseSBjb250YWluZWQqKiBpbiB0aGUgcmFuZ2U7IG9uZSB0aGF0IG1lcmVseSBvdmVybGFwcyBpdCBpc1xuICAgKiBsZWZ0IGFsb25lLCBiZWNhdXNlIHJld3JpdGluZyBwYXJ0IG9mIGEgbGluayBjb3JydXB0cyBpdC4gQm90aCBib3VuZHMgYXJlIGluY2x1c2l2ZSwgc28gYSByYW5nZSB3aG9zZVxuICAgKiBvZmZzZXRzIGNvaW5jaWRlIGV4YWN0bHkgd2l0aCBhIGxpbmsncyBkb2VzIGluY2x1ZGUgdGhhdCBsaW5rLlxuICAgKlxuICAgKiBBIHJlZmVyZW5jZSB0aGF0IGNhcnJpZXMgbm8gcG9zaXRpb24gd2l0aGluIHRoZSBmaWxlJ3MgY29udGVudCDigJQgYSBmcm9udG1hdHRlciBsaW5rLCBhIG11bHRpLWxpbmtcbiAgICogZnJvbnRtYXR0ZXIgdmFsdWUgZW50cnksIG9yIGFueSBjYW52YXMgcmVmZXJlbmNlIOKAlCBpcyBuZXZlciBpbiByYW5nZSBhbmQgaXMgc2tpcHBlZCB3aGVuZXZlciBhIHJhbmdlIGlzXG4gICAqIHN1cHBsaWVkLlxuICAgKlxuICAgKiBUaGUgb2Zmc2V0cyBhcmUgaW50byB0aGUgY29udGVudCB0aGlzIGZ1bmN0aW9uIHJlYWRzIGZyb20gdGhlIHZhdWx0LiBCZWZvcmUgcmVhZGluZywgaXQgc2F2ZXMgYW55XG4gICAqIHVuc2F2ZWQgZWRpdG9yIGJ1ZmZlciBmb3IgdGhlIGZpbGUsIHNvIGEgcmFuZ2UgdGFrZW4gZnJvbSBhbiBvcGVuIGVkaXRvciB2aWEgYEVkaXRvci5wb3NUb09mZnNldGAgaXNcbiAgICogdmFsaWQuIFRoZSBjYWxsZXIgb3ducyBvbmx5IHRoZSBjYXNlIHdoZXJlIHRoZSBidWZmZXIgY2hhbmdlcyBiZXR3ZWVuIGNvbXB1dGluZyB0aGUgcmFuZ2UgYW5kIHRoaXNcbiAgICogY2FsbC5cbiAgICpcbiAgICogQGRlZmF1bHQgYHVuZGVmaW5lZGBcbiAgICovXG4gIHJlYWRvbmx5IG9mZnNldFJhbmdlPzogT2Zmc2V0UmFuZ2U7XG5cbiAgLyoqXG4gICAqIFRoZSBwYXRoIG9yIGZpbGUgdG8gbm9ybWFsaXplIHRoZSBgZmlsZTovL2AgbGlua3MgaW4uXG4gICAqL1xuICByZWFkb25seSBwYXRoT3JGaWxlOiBQYXRoT3JGaWxlO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRvIGVtaXQgdGhlIG5vcm1hbGl6ZWQgbGlua3Mgd2l0aCBhbmdsZSBicmFja2V0cyBhbmQgcmF3IHNwYWNlcyBpbnN0ZWFkIG9mIGAlMjBgLWVuY29kaW5nLlxuICAgKlxuICAgKiBAZGVmYXVsdCBgZmFsc2VgXG4gICAqL1xuICByZWFkb25seSBzaG91bGRVc2VBbmdsZUJyYWNrZXRzPzogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBQYXJhbXMgZm9yIHtAbGluayB1cGRhdGVMaW5rfS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBVcGRhdGVMaW5rUGFyYW1zIHtcbiAgLyoqXG4gICAqIEFuIE9ic2lkaWFuIGFwcCBpbnN0YW5jZS5cbiAgICovXG4gIHJlYWRvbmx5IGFwcDogQXBwO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRvIGFsbG93IGFuIGVtcHR5IGFsaWFzIGZvciBlbWJlZHMuXG4gICAqXG4gICAqIEFwcGxpY2FibGUgb25seSBpZiB0aGUgcmVzdWx0IGxpbmsgc3R5bGUgaXMge0BsaW5rIExpbmtTdHlsZS5NYXJrZG93bn0uXG4gICAqXG4gICAqIElmIGB0cnVlYDogYCFbXShmb28ucG5nKWAuXG4gICAqXG4gICAqIElmIGBmYWxzZWA6IGAhW2Zvb10oZm9vLnBuZylgLlxuICAgKlxuICAgKiBAZGVmYXVsdCBgdHJ1ZWBcbiAgICovXG4gIHJlYWRvbmx5IGlzRW1wdHlFbWJlZEFsaWFzQWxsb3dlZD86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIEEgcmVmZXJlbmNlIGZvciB0aGUgbGluay5cbiAgICovXG4gIHJlYWRvbmx5IGxpbms6IFJlZmVyZW5jZTtcblxuICAvKipcbiAgICogQSBzdHlsZSBvZiB0aGUgbGluayBwYXRoLlxuICAgKi9cbiAgcmVhZG9ubHkgbGlua1BhdGhTdHlsZT86IExpbmtQYXRoU3R5bGU7XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdG8gZm9yY2UgbWFya2Rvd24gbGlua3MuXG4gICAqL1xuICByZWFkb25seSBsaW5rU3R5bGU/OiBMaW5rU3R5bGU7XG5cbiAgLyoqXG4gICAqIEEgc291cmNlIGZpbGUgY29udGFpbmluZyB0aGUgbGluay5cbiAgICovXG4gIHJlYWRvbmx5IG5ld1NvdXJjZVBhdGhPckZpbGU6IFBhdGhPckZpbGU7XG5cbiAgLyoqXG4gICAqIEEgZmlsZSBhc3NvY2lhdGVkIHdpdGggdGhlIGxpbmsuXG4gICAqL1xuICByZWFkb25seSBuZXdUYXJnZXRQYXRoT3JGaWxlOiBQYXRoT3JGaWxlO1xuXG4gIC8qKlxuICAgKiBBbiBvbGQgc291cmNlIGZpbGUgY29udGFpbmluZyB0aGUgbGluay5cbiAgICovXG4gIHJlYWRvbmx5IG9sZFNvdXJjZVBhdGhPckZpbGU/OiBQYXRoT3JGaWxlO1xuXG4gIC8qKlxuICAgKiBBbiBvbGQgcGF0aCBvZiB0aGUgZmlsZS5cbiAgICovXG4gIHJlYWRvbmx5IG9sZFRhcmdldFBhdGhPckZpbGU/OiBQYXRoT3JGaWxlO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRvIGVzY2FwZSB0aGUgYWxpYXMuXG4gICAqXG4gICAqIEFwcGxpY2FibGUgb25seSBpZiB0aGUgcmVzdWx0IGxpbmsgc3R5bGUgaXMge0BsaW5rIExpbmtTdHlsZS5NYXJrZG93bn0uXG4gICAqXG4gICAqIElmIGB0cnVlYDogYFtcXCpcXCphbGlhc1xcKlxcKl0obGluay5tZClgLlxuICAgKlxuICAgKiBJZiBgZmFsc2VgOiBgWyoqYWxpYXMqKl0obGluay5tZClgLlxuICAgKlxuICAgKiBAZGVmYXVsdCBgZmFsc2VgXG4gICAqL1xuICByZWFkb25seSBzaG91bGRFc2NhcGVBbGlhcz86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdG8gaW5jbHVkZSB0aGUgYXR0YWNobWVudCBleHRlbnNpb24gaW4gdGhlIGVtYmVkIGFsaWFzLlxuICAgKlxuICAgKiBBcHBsaWNhYmxlIG9ubHkgaWYge0BsaW5rIGlzRW1wdHlFbWJlZEFsaWFzQWxsb3dlZH0gaXMgYGZhbHNlYC5cbiAgICpcbiAgICogSWYgYHRydWVgOiBgW2Zvby5wbmddKGZvby5wbmcpYC5cbiAgICpcbiAgICogSWYgYGZhbHNlYDogYFtmb29dKGZvby5wbmcpYC5cbiAgICpcbiAgICogQGRlZmF1bHQgYGZhbHNlYFxuICAgKi9cbiAgcmVhZG9ubHkgc2hvdWxkSW5jbHVkZUF0dGFjaG1lbnRFeHRlbnNpb25Ub0VtYmVkQWxpYXM/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRvIHVwZGF0ZSBmaWxlIG5hbWUgYWxpYXMuXG4gICAqXG4gICAqIEBkZWZhdWx0IGB0cnVlYFxuICAgKi9cbiAgcmVhZG9ubHkgc2hvdWxkVXBkYXRlRmlsZU5hbWVBbGlhcz86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIEluZGljYXRlcyBpZiB0aGUgbGluayBzaG91bGQgdXNlIGFuZ2xlIGJyYWNrZXRzLlxuICAgKlxuICAgKiBBcHBsaWNhYmxlIG9ubHkgaWYge0BsaW5rIGxpbmtTdHlsZX0gaXMge0BsaW5rIExpbmtTdHlsZS5NYXJrZG93bn0uXG4gICAqXG4gICAqIElmIGB0cnVlYDogYFthbGlhc10oPHBhdGggd2l0aCBzcGFjZXMubWQ+KWAuXG4gICAqXG4gICAqIElmIGBmYWxzZWA6IGBbYWxpYXNdKHBhdGglMjB3aXRoJTIwc3BhY2VzLm1kKWAuXG4gICAqXG4gICAqIEBkZWZhdWx0IGBmYWxzZWBcbiAgICovXG4gIHJlYWRvbmx5IHNob3VsZFVzZUFuZ2xlQnJhY2tldHM/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBJbmRpY2F0ZXMgaWYgdGhlIGxpbmsgc2hvdWxkIHVzZSBhIGxlYWRpbmcgZG90LlxuICAgKlxuICAgKiBBcHBsaWNhYmxlIG9ubHkgaWYge0BsaW5rIGxpbmtQYXRoU3R5bGV9IGlzIHtAbGluayBMaW5rUGF0aFN0eWxlLlJlbGF0aXZlUGF0aFRvVGhlU291cmNlfS5cbiAgICpcbiAgICogSWYgYHRydWVgOiBgW1suL3JlbGF0aXZlL3BhdGgvdG8vdGFyZ2V0XV1gXG4gICAqXG4gICAqIElmIGBmYWxzZWA6IGBbW3JlbGF0aXZlL3BhdGgvdG8vdGFyZ2V0XV1gXG4gICAqXG4gICAqIEBkZWZhdWx0IGBmYWxzZWBcbiAgICovXG4gIHJlYWRvbmx5IHNob3VsZFVzZUxlYWRpbmdEb3RGb3JSZWxhdGl2ZVBhdGhzPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogSW5kaWNhdGVzIGlmIHRoZSBsaW5rIHNob3VsZCB1c2UgYSBsZWFkaW5nIHNsYXNoLlxuICAgKlxuICAgKiBBcHBsaWNhYmxlIG9ubHkgaWYge0BsaW5rIGxpbmtQYXRoU3R5bGV9IGlzIHtAbGluayBMaW5rUGF0aFN0eWxlLkFic29sdXRlUGF0aEluVmF1bHR9LlxuICAgKlxuICAgKiBJZiBgdHJ1ZWA6IGBbWy9hYnNvbHV0ZS9wYXRoL3RvL3RhcmdldF1dYFxuICAgKlxuICAgKiBJZiBgZmFsc2VgOiBgW1thYnNvbHV0ZS9wYXRoL3RvL3RhcmdldF1dYFxuICAgKlxuICAgKiBAZGVmYXVsdCBgZmFsc2VgXG4gICAqL1xuICByZWFkb25seSBzaG91bGRVc2VMZWFkaW5nU2xhc2hGb3JBYnNvbHV0ZVBhdGhzPzogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBQYXJhbXMgZm9yIHtAbGluayB1cGRhdGVMaW5rc0luRmlsZX0uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVXBkYXRlTGlua3NJbkZpbGVQYXJhbXMgZXh0ZW5kcyBQcm9jZXNzT3B0aW9ucyB7XG4gIC8qKlxuICAgKiBBbiBPYnNpZGlhbiBhcHAgaW5zdGFuY2UuXG4gICAqL1xuICByZWFkb25seSBhcHA6IEFwcDtcblxuICAvKipcbiAgICogV2hldGhlciB0byBhbGxvdyBhbiBlbXB0eSBhbGlhcyBmb3IgZW1iZWRzLlxuICAgKlxuICAgKiBBcHBsaWNhYmxlIG9ubHkgaWYgdGhlIHJlc3VsdCBsaW5rIHN0eWxlIGlzIHtAbGluayBMaW5rU3R5bGUuTWFya2Rvd259LlxuICAgKlxuICAgKiBJZiBgdHJ1ZWA6IGAhW10oZm9vLnBuZylgLlxuICAgKlxuICAgKiBJZiBgZmFsc2VgOiBgIVtmb29dKGZvby5wbmcpYC5cbiAgICpcbiAgICogQGRlZmF1bHQgYHRydWVgXG4gICAqL1xuICByZWFkb25seSBpc0VtcHR5RW1iZWRBbGlhc0FsbG93ZWQ/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBBIHN0eWxlIG9mIHRoZSBsaW5rIHBhdGguXG4gICAqL1xuICByZWFkb25seSBsaW5rUGF0aFN0eWxlPzogTGlua1BhdGhTdHlsZTtcblxuICAvKipcbiAgICogQSBzdHlsZSBvZiB0aGUgbGluay5cbiAgICovXG4gIHJlYWRvbmx5IGxpbmtTdHlsZT86IExpbmtTdHlsZTtcblxuICAvKipcbiAgICogRGVjaWRlcyB0aGUgc3R5bGUgb2Ygb25lIGxpbmssIG92ZXJyaWRpbmcge0BsaW5rIGxpbmtTdHlsZX0gZm9yIGl0LiBSZXR1cm5pbmcgYHVuZGVmaW5lZGAga2VlcHNcbiAgICoge0BsaW5rIGxpbmtTdHlsZX0uXG4gICAqXG4gICAqIFVzZSBpdCB3aGVuIG9uZSBzdHlsZSBmb3IgdGhlIHdob2xlIGZpbGUgaXMgd3JvbmcgZm9yIHNvbWUgb2YgaXRzIGxpbmtzLiBBIGNhbGxlciBmb3JjaW5nXG4gICAqIHtAbGluayBMaW5rU3R5bGUuTWFya2Rvd259IG92ZXIgYSBub3RlLCBmb3IgZXhhbXBsZSwga2VlcHMgYSBmcm9udG1hdHRlciB3aWtpbGluayBhIHdpa2lsaW5rLCBiZWNhdXNlXG4gICAqIE9ic2lkaWFuIHJlYWRzIGEgcHJvcGVydHkgdmFsdWUgYXMgYSBsaW5rIG9ubHkgaW4gdGhhdCBmb3JtLlxuICAgKlxuICAgKiBAZGVmYXVsdCBgdW5kZWZpbmVkYFxuICAgKi9cbiAgcmVhZG9ubHkgbGlua1N0eWxlUHJvdmlkZXI/OiAobGluazogUmVmZXJlbmNlKSA9PiBMaW5rU3R5bGUgfCB1bmRlZmluZWQ7XG5cbiAgLyoqXG4gICAqIEEgZmlsZSB0byB1cGRhdGUgdGhlIGxpbmtzIGluLlxuICAgKi9cbiAgcmVhZG9ubHkgbmV3U291cmNlUGF0aE9yRmlsZTogUGF0aE9yRmlsZTtcblxuICAvKipcbiAgICogQSByYW5nZSB3aXRoaW4gdGhlIGZpbGUncyBjb250ZW50LCBpbiBjaGFyYWN0ZXIgb2Zmc2V0cywgcmVzdHJpY3RpbmcgdGhlIHBhc3MgdG8gdGhlIGxpbmtzIGluc2lkZSBpdC5cbiAgICogV2hlbiBvbWl0dGVkLCBldmVyeSBsaW5rIGlzIHZpc2l0ZWQuXG4gICAqXG4gICAqIEEgbGluayBpcyB1cGRhdGVkIG9ubHkgd2hlbiBpdCBpcyAqKmZ1bGx5IGNvbnRhaW5lZCoqIGluIHRoZSByYW5nZTsgb25lIHRoYXQgbWVyZWx5IG92ZXJsYXBzIGl0IGlzIGxlZnRcbiAgICogYWxvbmUsIGJlY2F1c2UgcmV3cml0aW5nIHBhcnQgb2YgYSBsaW5rIGNvcnJ1cHRzIGl0LiBCb3RoIGJvdW5kcyBhcmUgaW5jbHVzaXZlLCBzbyBhIHJhbmdlIHdob3NlXG4gICAqIG9mZnNldHMgY29pbmNpZGUgZXhhY3RseSB3aXRoIGEgbGluaydzIGRvZXMgaW5jbHVkZSB0aGF0IGxpbmsuXG4gICAqXG4gICAqIEEgcmVmZXJlbmNlIHRoYXQgY2FycmllcyBubyBwb3NpdGlvbiB3aXRoaW4gdGhlIGZpbGUncyBjb250ZW50IOKAlCBhIGZyb250bWF0dGVyIGxpbmssIGEgbXVsdGktbGlua1xuICAgKiBmcm9udG1hdHRlciB2YWx1ZSBlbnRyeSwgb3IgYW55IGNhbnZhcyByZWZlcmVuY2Ug4oCUIGlzIG5ldmVyIGluIHJhbmdlIGFuZCBpcyBza2lwcGVkIHdoZW5ldmVyIGEgcmFuZ2UgaXNcbiAgICogc3VwcGxpZWQuXG4gICAqXG4gICAqIFRoZSBvZmZzZXRzIGFyZSBpbnRvIHRoZSBjb250ZW50IHRoaXMgZnVuY3Rpb24gcmVhZHMgZnJvbSB0aGUgdmF1bHQuIEJlZm9yZSByZWFkaW5nLCBpdCBzYXZlcyBhbnlcbiAgICogdW5zYXZlZCBlZGl0b3IgYnVmZmVyIGZvciB0aGUgZmlsZSwgc28gYSByYW5nZSB0YWtlbiBmcm9tIGFuIG9wZW4gZWRpdG9yIHZpYSBgRWRpdG9yLnBvc1RvT2Zmc2V0YCBpc1xuICAgKiB2YWxpZC4gVGhlIGNhbGxlciBvd25zIG9ubHkgdGhlIGNhc2Ugd2hlcmUgdGhlIGJ1ZmZlciBjaGFuZ2VzIGJldHdlZW4gY29tcHV0aW5nIHRoZSByYW5nZSBhbmQgdGhpc1xuICAgKiBjYWxsLlxuICAgKlxuICAgKiBAZGVmYXVsdCBgdW5kZWZpbmVkYFxuICAgKi9cbiAgcmVhZG9ubHkgb2Zmc2V0UmFuZ2U/OiBPZmZzZXRSYW5nZTtcblxuICAvKipcbiAgICogQW4gb2xkIHBhdGggb2YgdGhlIGZpbGUuXG4gICAqL1xuICByZWFkb25seSBvbGRTb3VyY2VQYXRoT3JGaWxlPzogUGF0aE9yRmlsZTtcblxuICAvKipcbiAgICogV2hldGhlciB0byBlc2NhcGUgdGhlIGFsaWFzLlxuICAgKlxuICAgKiBBcHBsaWNhYmxlIG9ubHkgaWYgdGhlIHJlc3VsdCBsaW5rIHN0eWxlIGlzIHtAbGluayBMaW5rU3R5bGUuTWFya2Rvd259LlxuICAgKlxuICAgKiBJZiBgdHJ1ZWA6IGBbXFwqXFwqYWxpYXNcXCpcXCpdKGxpbmsubWQpYC5cbiAgICpcbiAgICogSWYgYGZhbHNlYDogYFsqKmFsaWFzKipdKGxpbmsubWQpYC5cbiAgICpcbiAgICogQGRlZmF1bHQgYGZhbHNlYFxuICAgKi9cbiAgcmVhZG9ubHkgc2hvdWxkRXNjYXBlQWxpYXM/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRvIGluY2x1ZGUgdGhlIGF0dGFjaG1lbnQgZXh0ZW5zaW9uIGluIHRoZSBlbWJlZCBhbGlhcy5cbiAgICpcbiAgICogQXBwbGljYWJsZSBvbmx5IGlmIHtAbGluayBpc0VtcHR5RW1iZWRBbGlhc0FsbG93ZWR9IGlzIGBmYWxzZWAuXG4gICAqXG4gICAqIElmIGB0cnVlYDogYFtmb28ucG5nXShmb28ucG5nKWAuXG4gICAqXG4gICAqIElmIGBmYWxzZWA6IGBbZm9vXShmb28ucG5nKWAuXG4gICAqXG4gICAqIEBkZWZhdWx0IGBmYWxzZWBcbiAgICovXG4gIHJlYWRvbmx5IHNob3VsZEluY2x1ZGVBdHRhY2htZW50RXh0ZW5zaW9uVG9FbWJlZEFsaWFzPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogV2hldGhlciB0byB1cGRhdGUgb25seSBlbWJlZGRlZCBsaW5rcy5cbiAgICovXG4gIHJlYWRvbmx5IHNob3VsZFVwZGF0ZUVtYmVkT25seUxpbmtzPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogV2hldGhlciB0byB1cGRhdGUgZmlsZSBuYW1lIGFsaWFzLlxuICAgKlxuICAgKiBAZGVmYXVsdCBgdHJ1ZWBcbiAgICovXG4gIHJlYWRvbmx5IHNob3VsZFVwZGF0ZUZpbGVOYW1lQWxpYXM/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBJbmRpY2F0ZXMgaWYgdGhlIGxpbmsgc2hvdWxkIHVzZSBhbmdsZSBicmFja2V0cy5cbiAgICpcbiAgICogQXBwbGljYWJsZSBvbmx5IGlmIHtAbGluayBsaW5rU3R5bGV9IGlzIHtAbGluayBMaW5rU3R5bGUuTWFya2Rvd259LlxuICAgKlxuICAgKiBJZiBgdHJ1ZWA6IGBbYWxpYXNdKDxwYXRoIHdpdGggc3BhY2VzLm1kPilgLlxuICAgKlxuICAgKiBJZiBgZmFsc2VgOiBgW2FsaWFzXShwYXRoJTIwd2l0aCUyMHNwYWNlcy5tZClgLlxuICAgKlxuICAgKiBAZGVmYXVsdCBgZmFsc2VgXG4gICAqL1xuICByZWFkb25seSBzaG91bGRVc2VBbmdsZUJyYWNrZXRzPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogSW5kaWNhdGVzIGlmIHRoZSBsaW5rIHNob3VsZCB1c2UgYSBsZWFkaW5nIGRvdC5cbiAgICpcbiAgICogQXBwbGljYWJsZSBvbmx5IGlmIHtAbGluayBsaW5rUGF0aFN0eWxlfSBpcyB7QGxpbmsgTGlua1BhdGhTdHlsZS5SZWxhdGl2ZVBhdGhUb1RoZVNvdXJjZX0uXG4gICAqXG4gICAqIElmIGB0cnVlYDogYFtbLi9yZWxhdGl2ZS9wYXRoL3RvL3RhcmdldF1dYFxuICAgKlxuICAgKiBJZiBgZmFsc2VgOiBgW1tyZWxhdGl2ZS9wYXRoL3RvL3RhcmdldF1dYFxuICAgKlxuICAgKiBAZGVmYXVsdCBgZmFsc2VgXG4gICAqL1xuICByZWFkb25seSBzaG91bGRVc2VMZWFkaW5nRG90Rm9yUmVsYXRpdmVQYXRocz86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIEluZGljYXRlcyBpZiB0aGUgbGluayBzaG91bGQgdXNlIGEgbGVhZGluZyBzbGFzaC5cbiAgICpcbiAgICogQXBwbGljYWJsZSBvbmx5IGlmIHtAbGluayBsaW5rUGF0aFN0eWxlfSBpcyB7QGxpbmsgTGlua1BhdGhTdHlsZS5BYnNvbHV0ZVBhdGhJblZhdWx0fS5cbiAgICpcbiAgICogSWYgYHRydWVgOiBgW1svYWJzb2x1dGUvcGF0aC90by90YXJnZXRdXWBcbiAgICpcbiAgICogSWYgYGZhbHNlYDogYFtbYWJzb2x1dGUvcGF0aC90by90YXJnZXRdXWBcbiAgICpcbiAgICogQGRlZmF1bHQgYGZhbHNlYFxuICAgKi9cbiAgcmVhZG9ubHkgc2hvdWxkVXNlTGVhZGluZ1NsYXNoRm9yQWJzb2x1dGVQYXRocz86IGJvb2xlYW47XG59XG5cbi8qKlxuICogUGFyYW1zIGZvciB7QGxpbmsgZ2VuZXJhdGVMaW5rVGV4dH0uXG4gKi9cbmludGVyZmFjZSBHZW5lcmF0ZUxpbmtUZXh0UGFyYW1zIHtcbiAgLyoqXG4gICAqIEFuIE9ic2lkaWFuIGFwcCBpbnN0YW5jZS5cbiAgICovXG4gIHJlYWRvbmx5IGFwcDogQXBwO1xuXG4gIC8qKlxuICAgKiBBIGNvbmZpZ3VyYXRpb24gb2YgdGhlIGxpbmsuXG4gICAqL1xuICByZWFkb25seSBjb25maWc6IExpbmtDb25maWc7XG5cbiAgLyoqXG4gICAqIEEgc291cmNlIHBhdGggb2YgdGhlIGxpbmsuXG4gICAqL1xuICByZWFkb25seSBzb3VyY2VQYXRoOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEEgc3VicGF0aCBvZiB0aGUgbGluay5cbiAgICovXG4gIHJlYWRvbmx5IHN1YnBhdGg6IHN0cmluZztcblxuICAvKipcbiAgICogQSB0YXJnZXQgZmlsZSBvZiB0aGUgbGluay5cbiAgICovXG4gIHJlYWRvbmx5IHRhcmdldEZpbGU6IFRGaWxlO1xufVxuXG4vKipcbiAqIFBhcmFtcyBmb3Ige0BsaW5rIGdlbmVyYXRlTWFya2Rvd25TdHlsZUxpbmt9LlxuICovXG5pbnRlcmZhY2UgR2VuZXJhdGVNYXJrZG93blN0eWxlTGlua1BhcmFtcyB7XG4gIC8qKlxuICAgKiBBIGNvbmZpZ3VyYXRpb24gb2YgdGhlIGxpbmsuXG4gICAqL1xuICByZWFkb25seSBjb25maWc6IExpbmtDb25maWc7XG5cbiAgLyoqXG4gICAqIEEgdGV4dCBvZiB0aGUgbGluay5cbiAgICovXG4gIHJlYWRvbmx5IGxpbmtUZXh0OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBwYXJhbXMgZm9yIGdlbmVyYXRpbmcgdGhlIG1hcmtkb3duIGxpbmsuXG4gICAqL1xuICByZWFkb25seSBtYXJrZG93bkxpbmtQYXJhbXM6IEdlbmVyYXRlTWFya2Rvd25MaW5rUGFyYW1zO1xuXG4gIC8qKlxuICAgKiBBIHRhcmdldCBmaWxlIG9mIHRoZSBsaW5rLlxuICAgKi9cbiAgcmVhZG9ubHkgdGFyZ2V0RmlsZTogVEZpbGU7XG59XG5cbi8qKlxuICogUGFyYW1zIGZvciB7QGxpbmsgZ2VuZXJhdGVXaWtpTGlua30uXG4gKi9cbmludGVyZmFjZSBHZW5lcmF0ZVdpa2lMaW5rUGFyYW1zIHtcbiAgLyoqXG4gICAqIEFuIGFsaWFzIG9mIHRoZSBsaW5rLlxuICAgKi9cbiAgcmVhZG9ubHkgYWxpYXM6IHN0cmluZyB8IHVuZGVmaW5lZDtcblxuICAvKipcbiAgICogV2hldGhlciB0aGUgbGluayBzaG91bGQgYmUgYW4gZW1iZWQgbGluay5cbiAgICovXG4gIHJlYWRvbmx5IGlzRW1iZWQ6IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIEEgdGV4dCBvZiB0aGUgbGluay5cbiAgICovXG4gIHJlYWRvbmx5IGxpbmtUZXh0OiBzdHJpbmc7XG59XG5cbi8qKlxuICogUGFyYW1zIGZvciB7QGxpbmsgZ2V0RmlsZUNoYW5nZXN9LlxuICovXG5pbnRlcmZhY2UgR2V0RmlsZUNoYW5nZXNQYXJhbXMge1xuICAvKipcbiAgICogQW4gYWJvcnQgc2lnbmFsIHRvIGNvbnRyb2wgdGhlIGV4ZWN1dGlvbiBvZiB0aGUgZnVuY3Rpb24uXG4gICAqL1xuICByZWFkb25seSBhYm9ydFNpZ25hbD86IEFib3J0U2lnbmFsO1xuXG4gIC8qKlxuICAgKiBBIG1ldGFkYXRhIGNhY2hlIHRvIGV4dHJhY3QgdGhlIGxpbmtzIGZyb20uXG4gICAqL1xuICByZWFkb25seSBjYWNoZTogQ2FjaGVkTWV0YWRhdGEgfCBudWxsO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRoZSBjYWNoZSBiZWxvbmdzIHRvIGEgY2FudmFzIGZpbGUuXG4gICAqL1xuICByZWFkb25seSBpc0NhbnZhc0ZpbGVDYWNoZTogYm9vbGVhbjtcblxuICAvKipcbiAgICogQSBmdW5jdGlvbiB0aGF0IGNvbnZlcnRzIGVhY2ggbGluay5cbiAgICovXG4gIHJlYWRvbmx5IGxpbmtDb252ZXJ0ZXI6IChsaW5rOiBSZWZlcmVuY2UsIGFib3J0U2lnbmFsOiBBYm9ydFNpZ25hbCkgPT4gUHJvbWlzYWJsZTxNYXliZVJldHVybjxzdHJpbmc+PjtcblxuICAvKipcbiAgICogQSByYW5nZSB3aXRoaW4gdGhlIGNvbnRlbnQsIGluIGNoYXJhY3RlciBvZmZzZXRzLCByZXN0cmljdGluZyB0aGUgY2hhbmdlcyB0byB0aGUgbGlua3MgZnVsbHkgY29udGFpbmVkXG4gICAqIGluIGl0LiBXaGVuIG9taXR0ZWQsIGV2ZXJ5IGxpbmsgaXMgdmlzaXRlZC5cbiAgICpcbiAgICogQGRlZmF1bHQgYHVuZGVmaW5lZGBcbiAgICovXG4gIHJlYWRvbmx5IG9mZnNldFJhbmdlPzogT2Zmc2V0UmFuZ2U7XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdG8gaW5jbHVkZSBleHRlcm5hbCBsaW5rcyAocGFyc2VkIGZyb20gdGhlIG5vdGUgYm9keSkgaW4gdGhlIGNoYW5nZXMuXG4gICAqXG4gICAqIEBkZWZhdWx0IGBmYWxzZWBcbiAgICovXG4gIHJlYWRvbmx5IHNob3VsZEluY2x1ZGVFeHRlcm5hbExpbmtzPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogV2hldGhlciB0byBpbmNsdWRlIGV4dGVybmFsIGxpbmtzIChwYXJzZWQgZnJvbSBmcm9udG1hdHRlciB2YWx1ZXMpIGluIHRoZSBjaGFuZ2VzLlxuICAgKlxuICAgKiBAZGVmYXVsdCBgZmFsc2VgXG4gICAqL1xuICByZWFkb25seSBzaG91bGRJbmNsdWRlRnJvbnRtYXR0ZXJFeHRlcm5hbExpbmtzPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogV2hldGhlciB0byBpbmNsdWRlIGV4dGVybmFsIGxpbmtzIChwYXJzZWQgZnJvbSBtdWx0aS1saW5rIGZyb250bWF0dGVyIHZhbHVlcykgaW4gdGhlIGNoYW5nZXMuXG4gICAqXG4gICAqIEBkZWZhdWx0IGBmYWxzZWBcbiAgICovXG4gIHJlYWRvbmx5IHNob3VsZEluY2x1ZGVNdWx0aVZhbHVlRnJvbnRtYXR0ZXJFeHRlcm5hbExpbmtzPzogYm9vbGVhbjtcbn1cblxuaW50ZXJmYWNlIExpbmtDb25maWcge1xuICByZWFkb25seSBpc0VtYmVkOiBib29sZWFuO1xuICByZWFkb25seSBpc1NpbmdsZVN1YnBhdGhBbGxvd2VkOiBib29sZWFuO1xuICByZWFkb25seSBpc1dpa2lsaW5rOiBib29sZWFuO1xuICByZWFkb25seSBsaW5rUGF0aFN0eWxlOiBGaW5hbExpbmtQYXRoU3R5bGU7XG4gIHJlYWRvbmx5IHNob3VsZFVzZUFuZ2xlQnJhY2tldHM6IGJvb2xlYW47XG4gIHJlYWRvbmx5IHNob3VsZFVzZUxlYWRpbmdEb3RGb3JSZWxhdGl2ZVBhdGhzOiBib29sZWFuO1xuICByZWFkb25seSBzaG91bGRVc2VMZWFkaW5nU2xhc2hGb3JBYnNvbHV0ZVBhdGhzOiBib29sZWFuO1xufVxuXG4vKipcbiAqIFBhcmFtcyBmb3Ige0BsaW5rIHJlc29sdmVTbmFwc2hvdExpbmtJZGVudGl0eUtleVByb3ZpZGVyfS5cbiAqL1xuaW50ZXJmYWNlIFJlc29sdmVTbmFwc2hvdExpbmtJZGVudGl0eUtleVByb3ZpZGVyUGFyYW1zIHtcbiAgLyoqXG4gICAqIFRoZSBwdWJsaWMgZnVuY3Rpb24gYXNraW5nLCBuYW1lZCBpbiB0aGUgZXJyb3IuXG4gICAqL1xuICByZWFkb25seSBjYWxsZXJOYW1lOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBwcm92aWRlciB0aGUgY2FsbGVyIHBhc3NlZCwgaWYgYW55LlxuICAgKi9cbiAgcmVhZG9ubHkgZXhwbGljaXRMaW5rSWRlbnRpdHlLZXlQcm92aWRlcjogKChsaW5rOiBSZWZlcmVuY2UpID0+IHN0cmluZykgfCB1bmRlZmluZWQ7XG5cbiAgLyoqXG4gICAqIFRoZSBzbmFwc2hvdCB3aG9zZSByZWNvcmRlZCBwcm92aWRlciB3aW5zIHdoZW4gdGhlIGNhbGxlciBwYXNzZWQgbm9uZS5cbiAgICovXG4gIHJlYWRvbmx5IHNuYXBzaG90OiBCYWNrbGlua3NTbmFwc2hvdDx1bmtub3duPjtcbn1cblxuLyoqXG4gKiBQYXJhbXMgZm9yIHtAbGluayBzaG91bGRVc2VXaWtpbGlua1N0eWxlfS5cbiAqL1xuaW50ZXJmYWNlIFNob3VsZFVzZVdpa2lsaW5rU3R5bGVQYXJhbXMge1xuICAvKipcbiAgICogQW4gT2JzaWRpYW4gYXBwIGluc3RhbmNlLlxuICAgKi9cbiAgcmVhZG9ubHkgYXBwOiBBcHA7XG5cbiAgLyoqXG4gICAqIEEgc3R5bGUgb2YgdGhlIGxpbmsuXG4gICAqL1xuICByZWFkb25seSBsaW5rU3R5bGU/OiBMaW5rU3R5bGU7XG5cbiAgLyoqXG4gICAqIEFuIG9yaWdpbmFsIGxpbmsgdGV4dC5cbiAgICovXG4gIHJlYWRvbmx5IG9yaWdpbmFsTGluaz86IHN0cmluZztcbn1cblxuaW50ZXJmYWNlIFRhYmxlUG9zaXRpb24ge1xuICBlbmQ6IG51bWJlcjtcbiAgc3RhcnQ6IG51bWJlcjtcbn1cblxuLyoqXG4gKiBQYXJhbXMgZm9yIHtAbGluayB1cGRhdGVMaW5rc0luQ29udGVudH0uXG4gKi9cbmludGVyZmFjZSBVcGRhdGVMaW5rc0luQ29udGVudFBhcmFtcyB7XG4gIC8qKlxuICAgKiBBbiBPYnNpZGlhbiBhcHAgaW5zdGFuY2UuXG4gICAqL1xuICByZWFkb25seSBhcHA6IEFwcDtcblxuICAvKipcbiAgICogQSBjb250ZW50IHRvIHVwZGF0ZSB0aGUgbGlua3MgaW4uXG4gICAqL1xuICByZWFkb25seSBjb250ZW50OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdG8gYWxsb3cgYW4gZW1wdHkgYWxpYXMgZm9yIGVtYmVkcy5cbiAgICpcbiAgICogQXBwbGljYWJsZSBvbmx5IGlmIHRoZSByZXN1bHQgbGluayBzdHlsZSBpcyB7QGxpbmsgTGlua1N0eWxlLk1hcmtkb3dufS5cbiAgICpcbiAgICogSWYgYHRydWVgOiBgIVtdKGZvby5wbmcpYC5cbiAgICpcbiAgICogSWYgYGZhbHNlYDogYCFbZm9vXShmb28ucG5nKWAuXG4gICAqXG4gICAqIEBkZWZhdWx0IGB0cnVlYFxuICAgKi9cbiAgcmVhZG9ubHkgaXNFbXB0eUVtYmVkQWxpYXNBbGxvd2VkPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogQSBzdHlsZSBvZiB0aGUgbGluayBwYXRoLlxuICAgKi9cbiAgcmVhZG9ubHkgbGlua1BhdGhTdHlsZT86IExpbmtQYXRoU3R5bGU7XG5cbiAgLyoqXG4gICAqIEEgc3R5bGUgb2YgdGhlIGxpbmsuXG4gICAqL1xuICByZWFkb25seSBsaW5rU3R5bGU/OiBMaW5rU3R5bGU7XG5cbiAgLyoqXG4gICAqIERlY2lkZXMgdGhlIHN0eWxlIG9mIG9uZSBsaW5rLCBvdmVycmlkaW5nIHtAbGluayBsaW5rU3R5bGV9IGZvciBpdC4gUmV0dXJuaW5nIGB1bmRlZmluZWRgIGtlZXBzXG4gICAqIHtAbGluayBsaW5rU3R5bGV9LlxuICAgKlxuICAgKiBVc2UgaXQgd2hlbiBvbmUgc3R5bGUgZm9yIHRoZSB3aG9sZSBjb250ZW50IGlzIHdyb25nIGZvciBzb21lIG9mIGl0cyBsaW5rcy4gQSBjYWxsZXIgZm9yY2luZ1xuICAgKiB7QGxpbmsgTGlua1N0eWxlLk1hcmtkb3dufSBvdmVyIGEgbm90ZSwgZm9yIGV4YW1wbGUsIGtlZXBzIGEgZnJvbnRtYXR0ZXIgd2lraWxpbmsgYSB3aWtpbGluaywgYmVjYXVzZVxuICAgKiBPYnNpZGlhbiByZWFkcyBhIHByb3BlcnR5IHZhbHVlIGFzIGEgbGluayBvbmx5IGluIHRoYXQgZm9ybS5cbiAgICpcbiAgICogQGRlZmF1bHQgYHVuZGVmaW5lZGBcbiAgICovXG4gIHJlYWRvbmx5IGxpbmtTdHlsZVByb3ZpZGVyPzogKGxpbms6IFJlZmVyZW5jZSkgPT4gTGlua1N0eWxlIHwgdW5kZWZpbmVkO1xuXG4gIC8qKlxuICAgKiBBIG5ldyBzb3VyY2UgcGF0aCBvciBmaWxlLlxuICAgKi9cbiAgcmVhZG9ubHkgbmV3U291cmNlUGF0aE9yRmlsZTogUGF0aE9yRmlsZTtcblxuICAvKipcbiAgICogQSByYW5nZSB3aXRoaW4ge0BsaW5rIFVwZGF0ZUxpbmtzSW5Db250ZW50UGFyYW1zLmNvbnRlbnR9LCBpbiBjaGFyYWN0ZXIgb2Zmc2V0cywgcmVzdHJpY3RpbmcgdGhlIHBhc3NcbiAgICogdG8gdGhlIGxpbmtzIGluc2lkZSBpdC4gV2hlbiBvbWl0dGVkLCBldmVyeSBsaW5rIGlzIHZpc2l0ZWQuXG4gICAqXG4gICAqIEEgbGluayBpcyB1cGRhdGVkIG9ubHkgd2hlbiBpdCBpcyAqKmZ1bGx5IGNvbnRhaW5lZCoqIGluIHRoZSByYW5nZTsgb25lIHRoYXQgbWVyZWx5IG92ZXJsYXBzIGl0IGlzIGxlZnRcbiAgICogYWxvbmUsIGJlY2F1c2UgcmV3cml0aW5nIHBhcnQgb2YgYSBsaW5rIGNvcnJ1cHRzIGl0LiBCb3RoIGJvdW5kcyBhcmUgaW5jbHVzaXZlLCBzbyBhIHJhbmdlIHdob3NlXG4gICAqIG9mZnNldHMgY29pbmNpZGUgZXhhY3RseSB3aXRoIGEgbGluaydzIGRvZXMgaW5jbHVkZSB0aGF0IGxpbmsuXG4gICAqXG4gICAqIEEgcmVmZXJlbmNlIHRoYXQgY2FycmllcyBubyBwb3NpdGlvbiB3aXRoaW4gdGhlIGNvbnRlbnQg4oCUIGEgZnJvbnRtYXR0ZXIgbGluaywgYSBtdWx0aS1saW5rIGZyb250bWF0dGVyXG4gICAqIHZhbHVlIGVudHJ5LCBvciBhbnkgY2FudmFzIHJlZmVyZW5jZSDigJQgaXMgbmV2ZXIgaW4gcmFuZ2UgYW5kIGlzIHNraXBwZWQgd2hlbmV2ZXIgYSByYW5nZSBpcyBzdXBwbGllZC5cbiAgICpcbiAgICogQGRlZmF1bHQgYHVuZGVmaW5lZGBcbiAgICovXG4gIHJlYWRvbmx5IG9mZnNldFJhbmdlPzogT2Zmc2V0UmFuZ2U7XG5cbiAgLyoqXG4gICAqIEFuIG9sZCBzb3VyY2UgcGF0aCBvciBmaWxlLlxuICAgKi9cbiAgcmVhZG9ubHkgb2xkU291cmNlUGF0aE9yRmlsZT86IFBhdGhPckZpbGU7XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdG8gZXNjYXBlIHRoZSBhbGlhcy5cbiAgICpcbiAgICogQXBwbGljYWJsZSBvbmx5IGlmIHRoZSByZXN1bHQgbGluayBzdHlsZSBpcyB7QGxpbmsgTGlua1N0eWxlLk1hcmtkb3dufS5cbiAgICpcbiAgICogSWYgYHRydWVgOiBgW1xcKlxcKmFsaWFzXFwqXFwqXShsaW5rLm1kKWAuXG4gICAqXG4gICAqIElmIGBmYWxzZWA6IGBbKiphbGlhcyoqXShsaW5rLm1kKWAuXG4gICAqXG4gICAqIEBkZWZhdWx0IGBmYWxzZWBcbiAgICovXG4gIHJlYWRvbmx5IHNob3VsZEVzY2FwZUFsaWFzPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogV2hldGhlciB0byBpbmNsdWRlIHRoZSBhdHRhY2htZW50IGV4dGVuc2lvbiBpbiB0aGUgZW1iZWQgYWxpYXMuXG4gICAqXG4gICAqIEFwcGxpY2FibGUgb25seSBpZiB7QGxpbmsgaXNFbXB0eUVtYmVkQWxpYXNBbGxvd2VkfSBpcyBgZmFsc2VgLlxuICAgKlxuICAgKiBJZiBgdHJ1ZWA6IGBbZm9vLnBuZ10oZm9vLnBuZylgLlxuICAgKlxuICAgKiBJZiBgZmFsc2VgOiBgW2Zvb10oZm9vLnBuZylgLlxuICAgKlxuICAgKiBAZGVmYXVsdCBgZmFsc2VgXG4gICAqL1xuICByZWFkb25seSBzaG91bGRJbmNsdWRlQXR0YWNobWVudEV4dGVuc2lvblRvRW1iZWRBbGlhcz86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdG8gdXBkYXRlIG9ubHkgZW1iZWRkZWQgbGlua3MuXG4gICAqL1xuICByZWFkb25seSBzaG91bGRVcGRhdGVFbWJlZE9ubHlMaW5rcz86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdG8gdXBkYXRlIGZpbGUgbmFtZSBhbGlhcy5cbiAgICpcbiAgICogQGRlZmF1bHQgYHRydWVgXG4gICAqL1xuICByZWFkb25seSBzaG91bGRVcGRhdGVGaWxlTmFtZUFsaWFzPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogSW5kaWNhdGVzIGlmIHRoZSBsaW5rIHNob3VsZCB1c2UgYW5nbGUgYnJhY2tldHMuXG4gICAqXG4gICAqIEFwcGxpY2FibGUgb25seSBpZiB7QGxpbmsgbGlua1N0eWxlfSBpcyB7QGxpbmsgTGlua1N0eWxlLk1hcmtkb3dufS5cbiAgICpcbiAgICogSWYgYHRydWVgOiBgW2FsaWFzXSg8cGF0aCB3aXRoIHNwYWNlcy5tZD4pYC5cbiAgICpcbiAgICogSWYgYGZhbHNlYDogYFthbGlhc10ocGF0aCUyMHdpdGglMjBzcGFjZXMubWQpYC5cbiAgICpcbiAgICogQGRlZmF1bHQgYGZhbHNlYFxuICAgKi9cbiAgcmVhZG9ubHkgc2hvdWxkVXNlQW5nbGVCcmFja2V0cz86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIEluZGljYXRlcyBpZiB0aGUgbGluayBzaG91bGQgdXNlIGEgbGVhZGluZyBkb3QuXG4gICAqXG4gICAqIEFwcGxpY2FibGUgb25seSBpZiB7QGxpbmsgbGlua1BhdGhTdHlsZX0gaXMge0BsaW5rIExpbmtQYXRoU3R5bGUuUmVsYXRpdmVQYXRoVG9UaGVTb3VyY2V9LlxuICAgKlxuICAgKiBJZiBgdHJ1ZWA6IGBbWy4vcmVsYXRpdmUvcGF0aC90by90YXJnZXRdXWBcbiAgICpcbiAgICogSWYgYGZhbHNlYDogYFtbcmVsYXRpdmUvcGF0aC90by90YXJnZXRdXWBcbiAgICpcbiAgICogQGRlZmF1bHQgYGZhbHNlYFxuICAgKi9cbiAgcmVhZG9ubHkgc2hvdWxkVXNlTGVhZGluZ0RvdEZvclJlbGF0aXZlUGF0aHM/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBJbmRpY2F0ZXMgaWYgdGhlIGxpbmsgc2hvdWxkIHVzZSBhIGxlYWRpbmcgc2xhc2guXG4gICAqXG4gICAqIEFwcGxpY2FibGUgb25seSBpZiB7QGxpbmsgbGlua1BhdGhTdHlsZX0gaXMge0BsaW5rIExpbmtQYXRoU3R5bGUuQWJzb2x1dGVQYXRoSW5WYXVsdH0uXG4gICAqXG4gICAqIElmIGB0cnVlYDogYFtbL2Fic29sdXRlL3BhdGgvdG8vdGFyZ2V0XV1gXG4gICAqXG4gICAqIElmIGBmYWxzZWA6IGBbW2Fic29sdXRlL3BhdGgvdG8vdGFyZ2V0XV1gXG4gICAqXG4gICAqIEBkZWZhdWx0IGBmYWxzZWBcbiAgICovXG4gIHJlYWRvbmx5IHNob3VsZFVzZUxlYWRpbmdTbGFzaEZvckFic29sdXRlUGF0aHM/OiBib29sZWFuO1xufVxuXG4vKipcbiAqIFJlY29yZHMgYSBzZXQgb2YgYmFja2xpbmtzIGludG8gYSBzbmFwc2hvdCB0aGF0IHtAbGluayBlZGl0QmFja2xpbmtzU25hcHNob3R9IGNhbiByZXdyaXRlIGxhdGVyLlxuICpcbiAqIENhbGwgaXQgb25jZSBwZXIgdGFyZ2V0IGFuZCBwYXNzIHtAbGluayBCdWlsZEJhY2tsaW5rc1NuYXBzaG90UGFyYW1zLnRhcmdldH0gdG8gYWNjdW11bGF0ZSBzZXZlcmFsIHRhcmdldHNcbiAqIGludG8gb25lIHNuYXBzaG90LCBzbyB0aGF0IGEgbm90ZSBsaW5raW5nIHRvIHNldmVyYWwgb2YgdGhlbSBpcyBzdGlsbCByZXdyaXR0ZW4gZXhhY3RseSBvbmNlLlxuICpcbiAqIEB0eXBlUGFyYW0gVFBheWxvYWQgLSBUaGUgcGF5bG9hZCByZWNvcmRlZCBmb3IgZWFjaCBsaW5rLlxuICogQHBhcmFtIHBhcmFtcyAtIFRoZSBwYXJhbWV0ZXJzIGZvciBidWlsZGluZyB0aGUgc25hcHNob3QuXG4gKiBAcmV0dXJucyBUaGUgc25hcHNob3Qg4oCUIHtAbGluayBCdWlsZEJhY2tsaW5rc1NuYXBzaG90UGFyYW1zLnRhcmdldH0gaXRzZWxmIHdoZW4gb25lIHdhcyBwYXNzZWQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBidWlsZEJhY2tsaW5rc1NuYXBzaG90PFRQYXlsb2FkPihwYXJhbXM6IEJ1aWxkQmFja2xpbmtzU25hcHNob3RQYXJhbXM8VFBheWxvYWQ+KTogTXV0YWJsZUJhY2tsaW5rc1NuYXBzaG90PFRQYXlsb2FkPiB7XG4gIGNvbnN0IHtcbiAgICBiYWNrbGlua3MsXG4gICAgbGlua0lkZW50aXR5S2V5UHJvdmlkZXI6IGV4cGxpY2l0TGlua0lkZW50aXR5S2V5UHJvdmlkZXIsXG4gICAgcGF0aFJlbWFwcGVyLFxuICAgIHBheWxvYWRQcm92aWRlcixcbiAgICB0YXJnZXRcbiAgfSA9IHBhcmFtcztcblxuICBjb25zdCBzbmFwc2hvdCA9IHRhcmdldCA/PyBuZXcgTWFwPHN0cmluZywgTWFwPHN0cmluZywgVFBheWxvYWQ+PigpO1xuICBjb25zdCBsaW5rSWRlbnRpdHlLZXlQcm92aWRlciA9IHJlc29sdmVTbmFwc2hvdExpbmtJZGVudGl0eUtleVByb3ZpZGVyKHtcbiAgICBjYWxsZXJOYW1lOiAnYnVpbGRCYWNrbGlua3NTbmFwc2hvdCcsXG4gICAgZXhwbGljaXRMaW5rSWRlbnRpdHlLZXlQcm92aWRlcixcbiAgICBzbmFwc2hvdFxuICB9KTtcbiAgc25hcHNob3RMaW5rSWRlbnRpdHlLZXlQcm92aWRlcnMuc2V0KHNuYXBzaG90LCBsaW5rSWRlbnRpdHlLZXlQcm92aWRlcik7XG5cbiAgZm9yIChjb25zdCBiYWNrbGlua1BhdGggb2YgYmFja2xpbmtzLmtleXMoKSkge1xuICAgIGNvbnN0IG5ld0JhY2tsaW5rUGF0aCA9IHBhdGhSZW1hcHBlcj8uKGJhY2tsaW5rUGF0aCkgPz8gYmFja2xpbmtQYXRoO1xuICAgIGxldCBwYXlsb2FkcyA9IHNuYXBzaG90LmdldChuZXdCYWNrbGlua1BhdGgpO1xuICAgIGlmICghcGF5bG9hZHMpIHtcbiAgICAgIHBheWxvYWRzID0gbmV3IE1hcDxzdHJpbmcsIFRQYXlsb2FkPigpO1xuICAgICAgc25hcHNob3Quc2V0KG5ld0JhY2tsaW5rUGF0aCwgcGF5bG9hZHMpO1xuICAgIH1cblxuICAgIC8qIHY4IGlnbm9yZSBuZXh0IC0tIEEga2V5IHlpZWxkZWQgYnkgYGtleXMoKWAgYWx3YXlzIHJlc29sdmVzOyB0aGUgYD8/IFtdYCBpcyBkZWZlbnNpdmUuICovXG4gICAgZm9yIChjb25zdCBsaW5rIG9mIGJhY2tsaW5rcy5nZXQoYmFja2xpbmtQYXRoKSA/PyBbXSkge1xuICAgICAgcGF5bG9hZHMuc2V0KGxpbmtJZGVudGl0eUtleVByb3ZpZGVyKGxpbmspLCBwYXlsb2FkUHJvdmlkZXIobGluaykpO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBzbmFwc2hvdDtcbn1cblxuLyoqXG4gKiBDb252ZXJ0cyBhIGxpbmsgdG8gYSBuZXcgcGF0aC5cbiAqXG4gKiBAcGFyYW0gcGFyYW1zIC0gVGhlIHBhcmFtZXRlcnMgZm9yIGNvbnZlcnRpbmcgdGhlIGxpbmsuXG4gKiBAcmV0dXJucyBUaGUgY29udmVydGVkIGxpbmsuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjb252ZXJ0TGluayhwYXJhbXM6IENvbnZlcnRMaW5rUGFyYW1zKTogc3RyaW5nIHtcbiAgY29uc3QgdGFyZ2V0RmlsZSA9IGV4dHJhY3RMaW5rRmlsZSh7XG4gICAgYXBwOiBwYXJhbXMuYXBwLFxuICAgIGxpbms6IHBhcmFtcy5saW5rLFxuICAgIHNvdXJjZVBhdGhPckZpbGU6IHBhcmFtcy5vbGRTb3VyY2VQYXRoT3JGaWxlID8/IHBhcmFtcy5uZXdTb3VyY2VQYXRoT3JGaWxlXG4gIH0pO1xuICByZXR1cm4gdGFyZ2V0RmlsZVxuICAgID8gdXBkYXRlTGluayhub3JtYWxpemVPcHRpb25hbFByb3BlcnRpZXM8VXBkYXRlTGlua1BhcmFtcz4oe1xuICAgICAgYXBwOiBwYXJhbXMuYXBwLFxuICAgICAgaXNFbXB0eUVtYmVkQWxpYXNBbGxvd2VkOiBwYXJhbXMuaXNFbXB0eUVtYmVkQWxpYXNBbGxvd2VkLFxuICAgICAgbGluazogcGFyYW1zLmxpbmssXG4gICAgICBsaW5rUGF0aFN0eWxlOiBwYXJhbXMubGlua1BhdGhTdHlsZSxcbiAgICAgIGxpbmtTdHlsZTogcGFyYW1zLmxpbmtTdHlsZSxcbiAgICAgIG5ld1NvdXJjZVBhdGhPckZpbGU6IHBhcmFtcy5uZXdTb3VyY2VQYXRoT3JGaWxlLFxuICAgICAgbmV3VGFyZ2V0UGF0aE9yRmlsZTogdGFyZ2V0RmlsZSxcbiAgICAgIG9sZFNvdXJjZVBhdGhPckZpbGU6IHBhcmFtcy5vbGRTb3VyY2VQYXRoT3JGaWxlLFxuICAgICAgc2hvdWxkRXNjYXBlQWxpYXM6IHBhcmFtcy5zaG91bGRFc2NhcGVBbGlhcyxcbiAgICAgIHNob3VsZEluY2x1ZGVBdHRhY2htZW50RXh0ZW5zaW9uVG9FbWJlZEFsaWFzOiBwYXJhbXMuc2hvdWxkSW5jbHVkZUF0dGFjaG1lbnRFeHRlbnNpb25Ub0VtYmVkQWxpYXMsXG4gICAgICBzaG91bGRVcGRhdGVGaWxlTmFtZUFsaWFzOiBwYXJhbXMuc2hvdWxkVXBkYXRlRmlsZU5hbWVBbGlhcyxcbiAgICAgIHNob3VsZFVzZUFuZ2xlQnJhY2tldHM6IHBhcmFtcy5zaG91bGRVc2VBbmdsZUJyYWNrZXRzLFxuICAgICAgc2hvdWxkVXNlTGVhZGluZ0RvdEZvclJlbGF0aXZlUGF0aHM6IHBhcmFtcy5zaG91bGRVc2VMZWFkaW5nRG90Rm9yUmVsYXRpdmVQYXRocyxcbiAgICAgIHNob3VsZFVzZUxlYWRpbmdTbGFzaEZvckFic29sdXRlUGF0aHM6IHBhcmFtcy5zaG91bGRVc2VMZWFkaW5nU2xhc2hGb3JBYnNvbHV0ZVBhdGhzXG4gICAgfSkpXG4gICAgOiBnZXRSZWZlcmVuY2VMaW5rVGV4dChwYXJhbXMubGluayk7XG59XG5cbi8qKlxuICogRWRpdHMgdGhlIGJhY2tsaW5rcyBmb3IgYSBmaWxlIG9yIHBhdGguXG4gKlxuICogQHBhcmFtIHBhcmFtcyAtIFRoZSBwYXJhbWV0ZXJzIGZvciBlZGl0aW5nIHRoZSBiYWNrbGlua3MuXG4gKiBAcmV0dXJucyBBIHtAbGluayBQcm9taXNlfSB0aGF0IHJlc29sdmVzIHdoZW4gdGhlIGJhY2tsaW5rcyBoYXZlIGJlZW4gZWRpdGVkLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZWRpdEJhY2tsaW5rcyhwYXJhbXM6IEVkaXRCYWNrbGlua3NQYXJhbXMpOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3Qge1xuICAgIGFwcCxcbiAgICBsaW5rQ29udmVydGVyLFxuICAgIGxpbmtVcGRhdGVQcm9ncmVzc1JlcG9ydGVyLFxuICAgIHBhdGhPckZpbGUsXG4gICAgLi4ub3B0aW9uc1xuICB9ID0gcGFyYW1zO1xuICBjb25zdCBiYWNrbGlua3MgPSBhd2FpdCBnZXRCYWNrbGlua3NGb3JGaWxlU2FmZSh7IGFwcCwgcGF0aE9yRmlsZSwgLi4ub3B0aW9ucyB9KTtcbiAgY29uc3Qgc25hcHNob3QgPSBidWlsZEJhY2tsaW5rc1NuYXBzaG90PHVuZGVmaW5lZD4oe1xuICAgIGJhY2tsaW5rcyxcbiAgICBwYXlsb2FkUHJvdmlkZXI6IGdldFVuZGVmaW5lZFBheWxvYWRcbiAgfSk7XG4gIGF3YWl0IGVkaXRCYWNrbGlua3NTbmFwc2hvdChub3JtYWxpemVPcHRpb25hbFByb3BlcnRpZXM8RWRpdEJhY2tsaW5rc1NuYXBzaG90UGFyYW1zPHVuZGVmaW5lZD4+KHtcbiAgICBhcHAsXG4gICAgbGlua0NvbnZlcnRlcjogKHsgbGluayB9KSA9PiBsaW5rQ29udmVydGVyKGxpbmspLFxuICAgIGxpbmtVcGRhdGVQcm9ncmVzc1JlcG9ydGVyLFxuICAgIHNuYXBzaG90LFxuICAgIC4uLm9wdGlvbnNcbiAgfSkpO1xufVxuXG4vKipcbiAqIEVkaXRzIGEgY2FwdHVyZWQgc25hcHNob3Qgb2YgYmFja2xpbmtzLCByZXdyaXRpbmcgZWFjaCBiYWNrbGluay1ob2xkaW5nIG5vdGUgZXhhY3RseSBvbmNlLlxuICpcbiAqIFRoZSBjb3VudGVycGFydCBvZiB7QGxpbmsgZWRpdEJhY2tsaW5rc30gZm9yIGNhbGxlcnMgdGhhdCBjYW5ub3QgZmV0Y2ggdGhlIGJhY2tsaW5rcyBhdCByZXdyaXRlIHRpbWUg4oCUXG4gKiBiZWNhdXNlIHRoZSByZW5hbWUgdGhhdCBpbnZhbGlkYXRlZCB0aGVtIGhhcyBhbHJlYWR5IGhhcHBlbmVkIOKAlCBvciB0aGF0IHJld3JpdGUgbGlua3MgdG8gc2V2ZXJhbCB0YXJnZXRzXG4gKiBhdCBvbmNlLiBTZWUge0BsaW5rIEJhY2tsaW5rc1NuYXBzaG90fSBmb3IgYm90aCBjYXNlcy5cbiAqXG4gKiBAdHlwZVBhcmFtIFRQYXlsb2FkIC0gVGhlIHBheWxvYWQgcmVjb3JkZWQgZm9yIGVhY2ggbGluayB3aGVuIHRoZSBzbmFwc2hvdCB3YXMgYnVpbHQuXG4gKiBAcGFyYW0gcGFyYW1zIC0gVGhlIHBhcmFtZXRlcnMgZm9yIGVkaXRpbmcgdGhlIGJhY2tsaW5rcy5cbiAqIEByZXR1cm5zIEEge0BsaW5rIFByb21pc2V9IHRoYXQgcmVzb2x2ZXMgd2hlbiB0aGUgYmFja2xpbmtzIGhhdmUgYmVlbiBlZGl0ZWQuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBlZGl0QmFja2xpbmtzU25hcHNob3Q8VFBheWxvYWQ+KHBhcmFtczogRWRpdEJhY2tsaW5rc1NuYXBzaG90UGFyYW1zPFRQYXlsb2FkPik6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCB7XG4gICAgYXBwLFxuICAgIGxpbmtDb252ZXJ0ZXIsXG4gICAgbGlua0lkZW50aXR5S2V5UHJvdmlkZXI6IGV4cGxpY2l0TGlua0lkZW50aXR5S2V5UHJvdmlkZXIsXG4gICAgbGlua1VwZGF0ZVByb2dyZXNzUmVwb3J0ZXIsXG4gICAgc2hvdWxkVmlzaXRVbm1hdGNoZWRMaW5rcyA9IGZhbHNlLFxuICAgIHNuYXBzaG90LFxuICAgIC4uLm9wdGlvbnNcbiAgfSA9IHBhcmFtcztcbiAgY29uc3QgbGlua0lkZW50aXR5S2V5UHJvdmlkZXIgPSByZXNvbHZlU25hcHNob3RMaW5rSWRlbnRpdHlLZXlQcm92aWRlcih7XG4gICAgY2FsbGVyTmFtZTogJ2VkaXRCYWNrbGlua3NTbmFwc2hvdCcsXG4gICAgZXhwbGljaXRMaW5rSWRlbnRpdHlLZXlQcm92aWRlcixcbiAgICBzbmFwc2hvdFxuICB9KTtcblxuICBjb25zdCBiYWNrbGlua05vdGVQYXRocyA9IFsuLi5zbmFwc2hvdC5rZXlzKCldO1xuICBsZXQgcHJvY2Vzc2VkID0gMDtcbiAgZm9yIChjb25zdCBiYWNrbGlua05vdGVQYXRoIG9mIGJhY2tsaW5rTm90ZVBhdGhzKSB7XG4gICAgY29uc3QgcGF5bG9hZHMgPSBlbnN1cmVOb25OdWxsYWJsZShzbmFwc2hvdC5nZXQoYmFja2xpbmtOb3RlUGF0aCkpO1xuICAgIGF3YWl0IGVkaXRMaW5rcyh7XG4gICAgICBhcHAsXG4gICAgICBsaW5rQ29udmVydGVyOiAobGluaykgPT4ge1xuICAgICAgICBjb25zdCBsaW5rSWRlbnRpdHlLZXkgPSBsaW5rSWRlbnRpdHlLZXlQcm92aWRlcihsaW5rKTtcbiAgICAgICAgcmV0dXJuICFwYXlsb2Fkcy5oYXMobGlua0lkZW50aXR5S2V5KSAmJiAhc2hvdWxkVmlzaXRVbm1hdGNoZWRMaW5rc1xuICAgICAgICAgID8gdW5kZWZpbmVkXG4gICAgICAgICAgOiBsaW5rQ29udmVydGVyKHtcbiAgICAgICAgICAgIGxpbmssXG4gICAgICAgICAgICBwYXlsb2FkOiBwYXlsb2Fkcy5nZXQobGlua0lkZW50aXR5S2V5KSxcbiAgICAgICAgICAgIHNvdXJjZVBhdGg6IGJhY2tsaW5rTm90ZVBhdGhcbiAgICAgICAgICB9KTtcbiAgICAgIH0sXG4gICAgICBwYXRoT3JGaWxlOiBiYWNrbGlua05vdGVQYXRoLFxuICAgICAgLi4ub3B0aW9uc1xuICAgIH0pO1xuICAgIHByb2Nlc3NlZCsrO1xuICAgIGxpbmtVcGRhdGVQcm9ncmVzc1JlcG9ydGVyPy4oe1xuICAgICAgY3VycmVudFBhdGg6IGJhY2tsaW5rTm90ZVBhdGgsXG4gICAgICBwcm9jZXNzZWQsXG4gICAgICB0b3RhbDogYmFja2xpbmtOb3RlUGF0aHMubGVuZ3RoXG4gICAgfSk7XG4gIH1cbn1cblxuLyoqXG4gKiBFZGl0cyB0aGUgbGlua3MgZm9yIGEgZmlsZSBvciBwYXRoLlxuICpcbiAqIEBwYXJhbSBwYXJhbXMgLSBUaGUgcGFyYW1ldGVycyBmb3IgZWRpdGluZyB0aGUgbGlua3MuXG4gKiBAcmV0dXJucyBBIHtAbGluayBQcm9taXNlfSB0aGF0IHJlc29sdmVzIHdoZW4gdGhlIGxpbmtzIGhhdmUgYmVlbiBlZGl0ZWQuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBlZGl0TGlua3MocGFyYW1zOiBFZGl0TGlua3NQYXJhbXMpOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3Qge1xuICAgIGFwcCxcbiAgICBsaW5rQ29udmVydGVyLFxuICAgIG9mZnNldFJhbmdlLFxuICAgIHBhdGhPckZpbGUsXG4gICAgc2hvdWxkRWRpdEV4dGVybmFsTGlua3MgPSBmYWxzZSxcbiAgICBzaG91bGRFZGl0RnJvbnRtYXR0ZXJFeHRlcm5hbExpbmtzID0gZmFsc2UsXG4gICAgc2hvdWxkRWRpdE11bHRpVmFsdWVGcm9udG1hdHRlckV4dGVybmFsTGlua3MgPSBmYWxzZSxcbiAgICAuLi5vcHRpb25zXG4gIH0gPSBwYXJhbXM7XG5cbiAgaWYgKG9mZnNldFJhbmdlICE9PSB1bmRlZmluZWQpIHtcbiAgICB2YWxpZGF0ZU9mZnNldFJhbmdlKG9mZnNldFJhbmdlKTtcbiAgfVxuXG4gIGF3YWl0IGFwcGx5RmlsZUNoYW5nZXMoe1xuICAgIGFwcCxcbiAgICBjaGFuZ2VzUHJvdmlkZXI6IGFzeW5jICh7IGFib3J0U2lnbmFsLCBjb250ZW50IH0pID0+IHtcbiAgICAgIGNvbnN0IGNhY2hlID0gYXdhaXQgZ2V0Q2FjaGVTYWZlKGFwcCwgcGF0aE9yRmlsZSwge1xuICAgICAgICBzaG91bGRQYXJzZUV4dGVybmFsTGlua3M6IHNob3VsZEVkaXRFeHRlcm5hbExpbmtzLFxuICAgICAgICBzaG91bGRQYXJzZUZyb250bWF0dGVyRXh0ZXJuYWxMaW5rczogc2hvdWxkRWRpdEZyb250bWF0dGVyRXh0ZXJuYWxMaW5rcyxcbiAgICAgICAgc2hvdWxkUGFyc2VNdWx0aVZhbHVlRnJvbnRtYXR0ZXJFeHRlcm5hbExpbmtzOiBzaG91bGRFZGl0TXVsdGlWYWx1ZUZyb250bWF0dGVyRXh0ZXJuYWxMaW5rc1xuICAgICAgfSk7XG4gICAgICBhYm9ydFNpZ25hbC50aHJvd0lmQWJvcnRlZCgpO1xuICAgICAgY29uc3QgZmlsZSA9IGdldEZpbGUoeyBhcHAsIHBhdGhPckZpbGUgfSk7XG4gICAgICBjb25zdCBjYWNoZWRDb250ZW50ID0gYXdhaXQgYXBwLnZhdWx0LmNhY2hlZFJlYWQoZmlsZSk7XG4gICAgICBhYm9ydFNpZ25hbC50aHJvd0lmQWJvcnRlZCgpO1xuICAgICAgcmV0dXJuIGNvbnRlbnQgPT09IGNhY2hlZENvbnRlbnRcbiAgICAgICAgPyAoYXdhaXQgZ2V0RmlsZUNoYW5nZXMobm9ybWFsaXplT3B0aW9uYWxQcm9wZXJ0aWVzPEdldEZpbGVDaGFuZ2VzUGFyYW1zPih7XG4gICAgICAgICAgYWJvcnRTaWduYWwsXG4gICAgICAgICAgY2FjaGUsXG4gICAgICAgICAgaXNDYW52YXNGaWxlQ2FjaGU6IGlzQ2FudmFzRmlsZShwYXRoT3JGaWxlKSxcbiAgICAgICAgICBsaW5rQ29udmVydGVyLFxuICAgICAgICAgIG9mZnNldFJhbmdlLFxuICAgICAgICAgIHNob3VsZEluY2x1ZGVFeHRlcm5hbExpbmtzOiBzaG91bGRFZGl0RXh0ZXJuYWxMaW5rcyxcbiAgICAgICAgICBzaG91bGRJbmNsdWRlRnJvbnRtYXR0ZXJFeHRlcm5hbExpbmtzOiBzaG91bGRFZGl0RnJvbnRtYXR0ZXJFeHRlcm5hbExpbmtzLFxuICAgICAgICAgIHNob3VsZEluY2x1ZGVNdWx0aVZhbHVlRnJvbnRtYXR0ZXJFeHRlcm5hbExpbmtzOiBzaG91bGRFZGl0TXVsdGlWYWx1ZUZyb250bWF0dGVyRXh0ZXJuYWxMaW5rc1xuICAgICAgICB9KSkpXG4gICAgICAgIDogbnVsbDtcbiAgICB9LFxuICAgIHBhdGhPckZpbGUsXG4gICAgLi4ub3B0aW9uc1xuICB9KTtcbn1cblxuLyoqXG4gKiBFZGl0cyB0aGUgbGlua3MgaW4gYSBjb250ZW50IHN0cmluZy5cbiAqXG4gKiBAcGFyYW0gcGFyYW1zIC0gVGhlIHBhcmFtZXRlcnMgZm9yIGVkaXRpbmcgdGhlIGxpbmtzIGluIHRoZSBjb250ZW50LlxuICogQHJldHVybnMgVGhlIHByb21pc2UgdGhhdCByZXNvbHZlcyB0byB0aGUgdXBkYXRlZCBjb250ZW50LlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZWRpdExpbmtzSW5Db250ZW50KHBhcmFtczogRWRpdExpbmtzSW5Db250ZW50UGFyYW1zKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgY29uc3QgeyBhcHAsIGNvbnRlbnQsIGxpbmtDb252ZXJ0ZXIsIG9mZnNldFJhbmdlLCBzaG91bGRFZGl0RXh0ZXJuYWxMaW5rcyA9IGZhbHNlLCBzaG91bGRFZGl0RnJvbnRtYXR0ZXJFeHRlcm5hbExpbmtzID0gZmFsc2UsIHNob3VsZEVkaXRNdWx0aVZhbHVlRnJvbnRtYXR0ZXJFeHRlcm5hbExpbmtzID0gZmFsc2UgfSA9IHBhcmFtcztcbiAgbGV0IHsgYWJvcnRTaWduYWwgfSA9IHBhcmFtcztcbiAgYWJvcnRTaWduYWwgPz89IGFib3J0U2lnbmFsTmV2ZXIoKTtcbiAgYWJvcnRTaWduYWwudGhyb3dJZkFib3J0ZWQoKTtcblxuICBpZiAob2Zmc2V0UmFuZ2UgIT09IHVuZGVmaW5lZCkge1xuICAgIHZhbGlkYXRlT2Zmc2V0UmFuZ2Uob2Zmc2V0UmFuZ2UpO1xuICB9XG5cbiAgY29uc3QgbmV3Q29udGVudCA9IGF3YWl0IGFwcGx5Q29udGVudENoYW5nZXMoe1xuICAgIGFib3J0U2lnbmFsLFxuICAgIGNoYW5nZXNQcm92aWRlcjogYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgY2FjaGUgPSBhd2FpdCBwYXJzZU1ldGFkYXRhKGFwcCwgY29udGVudCwge1xuICAgICAgICBzaG91bGRQYXJzZUV4dGVybmFsTGlua3M6IHNob3VsZEVkaXRFeHRlcm5hbExpbmtzLFxuICAgICAgICBzaG91bGRQYXJzZUZyb250bWF0dGVyRXh0ZXJuYWxMaW5rczogc2hvdWxkRWRpdEZyb250bWF0dGVyRXh0ZXJuYWxMaW5rcyxcbiAgICAgICAgc2hvdWxkUGFyc2VNdWx0aVZhbHVlRnJvbnRtYXR0ZXJFeHRlcm5hbExpbmtzOiBzaG91bGRFZGl0TXVsdGlWYWx1ZUZyb250bWF0dGVyRXh0ZXJuYWxMaW5rc1xuICAgICAgfSk7XG4gICAgICBhYm9ydFNpZ25hbC50aHJvd0lmQWJvcnRlZCgpO1xuICAgICAgY29uc3QgY2hhbmdlcyA9IGF3YWl0IGdldEZpbGVDaGFuZ2VzKG5vcm1hbGl6ZU9wdGlvbmFsUHJvcGVydGllczxHZXRGaWxlQ2hhbmdlc1BhcmFtcz4oe1xuICAgICAgICBhYm9ydFNpZ25hbCxcbiAgICAgICAgY2FjaGUsXG4gICAgICAgIGlzQ2FudmFzRmlsZUNhY2hlOiBmYWxzZSxcbiAgICAgICAgbGlua0NvbnZlcnRlcixcbiAgICAgICAgb2Zmc2V0UmFuZ2UsXG4gICAgICAgIHNob3VsZEluY2x1ZGVFeHRlcm5hbExpbmtzOiBzaG91bGRFZGl0RXh0ZXJuYWxMaW5rcyxcbiAgICAgICAgc2hvdWxkSW5jbHVkZUZyb250bWF0dGVyRXh0ZXJuYWxMaW5rczogc2hvdWxkRWRpdEZyb250bWF0dGVyRXh0ZXJuYWxMaW5rcyxcbiAgICAgICAgc2hvdWxkSW5jbHVkZU11bHRpVmFsdWVGcm9udG1hdHRlckV4dGVybmFsTGlua3M6IHNob3VsZEVkaXRNdWx0aVZhbHVlRnJvbnRtYXR0ZXJFeHRlcm5hbExpbmtzXG4gICAgICB9KSk7XG4gICAgICBhYm9ydFNpZ25hbC50aHJvd0lmQWJvcnRlZCgpO1xuICAgICAgcmV0dXJuIGNoYW5nZXM7XG4gICAgfSxcbiAgICBjb250ZW50LFxuICAgIHBhdGg6ICcnXG4gIH0pO1xuICBhYm9ydFNpZ25hbC50aHJvd0lmQWJvcnRlZCgpO1xuXG4gIGFzc2VydE5vbk51bGxhYmxlKG5ld0NvbnRlbnQsICdGYWlsZWQgdG8gdXBkYXRlIGxpbmtzIGluIGNvbnRlbnQnKTtcblxuICByZXR1cm4gbmV3Q29udGVudDtcbn1cblxuLyoqXG4gKiBFeHRyYWN0cyB0aGUgZmlsZSBhc3NvY2lhdGVkIHdpdGggYSBsaW5rLlxuICpcbiAqIEBwYXJhbSBwYXJhbXMgLSBUaGUgcGFyYW1ldGVycyBmb3IgZXh0cmFjdGluZyB0aGUgbGluayBmaWxlLlxuICogQHJldHVybnMgVGhlIGZpbGUgYXNzb2NpYXRlZCB3aXRoIHRoZSBsaW5rLCBvciBgbnVsbGAgaWYgbm90IGZvdW5kLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZXh0cmFjdExpbmtGaWxlKHBhcmFtczogRXh0cmFjdExpbmtGaWxlUGFyYW1zKTogbnVsbCB8IFRGaWxlIHtcbiAgY29uc3Qge1xuICAgIGFwcCxcbiAgICBsaW5rLFxuICAgIHNob3VsZEFsbG93Tm9uRXhpc3RpbmdGaWxlID0gZmFsc2UsXG4gICAgc291cmNlUGF0aE9yRmlsZVxuICB9ID0gcGFyYW1zO1xuICBjb25zdCB7IGxpbmtQYXRoIH0gPSBzcGxpdFN1YnBhdGgobGluay5saW5rKTtcbiAgY29uc3Qgc291cmNlUGF0aCA9IGdldFBhdGgoYXBwLCBzb3VyY2VQYXRoT3JGaWxlKTtcbiAgY29uc3QgZmlsZSA9IGFwcC5tZXRhZGF0YUNhY2hlLmdldEZpcnN0TGlua3BhdGhEZXN0KGxpbmtQYXRoLCBzb3VyY2VQYXRoKTtcbiAgaWYgKGZpbGUpIHtcbiAgICByZXR1cm4gZmlsZTtcbiAgfVxuXG4gIGlmICghc2hvdWxkQWxsb3dOb25FeGlzdGluZ0ZpbGUpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIGlmIChsaW5rUGF0aC5zdGFydHNXaXRoKCcvJykpIHtcbiAgICByZXR1cm4gZ2V0RmlsZSh7IGFwcCwgcGF0aE9yRmlsZTogbGlua1BhdGgsIHNob3VsZEluY2x1ZGVOb25FeGlzdGluZzogdHJ1ZSB9KTtcbiAgfVxuXG4gIGNvbnN0IGZ1bGxMaW5rUGF0aCA9IGpvaW4oZGlybmFtZShzb3VyY2VQYXRoKSwgYC4vJHtsaW5rUGF0aH1gKTtcblxuICByZXR1cm4gZnVsbExpbmtQYXRoLnN0YXJ0c1dpdGgoJy4uLycpID8gbnVsbCA6IGdldEZpbGUoeyBhcHAsIHBhdGhPckZpbGU6IGZ1bGxMaW5rUGF0aCwgc2hvdWxkSW5jbHVkZU5vbkV4aXN0aW5nOiB0cnVlIH0pO1xufVxuXG4vKipcbiAqIEdlbmVyYXRlcyBhIG1hcmtkb3duIGxpbmsgYmFzZWQgb24gdGhlIHByb3ZpZGVkIHBhcmFtZXRlcnMuXG4gKlxuICogQHBhcmFtIHBhcmFtcyAtIFRoZSBwYXJhbWV0ZXJzIGZvciBnZW5lcmF0aW5nIHRoZSBtYXJrZG93biBsaW5rLlxuICogQHJldHVybnMgVGhlIGdlbmVyYXRlZCBtYXJrZG93biBsaW5rLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2VuZXJhdGVNYXJrZG93bkxpbmsocGFyYW1zOiBHZW5lcmF0ZU1hcmtkb3duTGlua1BhcmFtcyk6IHN0cmluZyB7XG4gIGNvbnN0IHsgYXBwIH0gPSBwYXJhbXM7XG5cbiAgY29uc3QgREVGQVVMVF9QQVJBTVM6IFBhcnRpYWw8R2VuZXJhdGVNYXJrZG93bkxpbmtQYXJhbXM+ID0ge1xuICAgIGlzRW1wdHlFbWJlZEFsaWFzQWxsb3dlZDogdHJ1ZVxuICB9O1xuXG4gIGNvbnN0IGN1c3RvbURlZmF1bHRQYXJhbXMgPSBnZXRHZW5lcmF0ZU1hcmtkb3duTGlua0RlZmF1bHRQYXJhbXNGbnMoKS5tYXAoKGRlZmF1bHRQYXJhbXNGdW5jdGlvbikgPT4gZGVmYXVsdFBhcmFtc0Z1bmN0aW9uKCkpO1xuICAvLyBTdHJpcCBleHBsaWNpdCBgdW5kZWZpbmVkYHMgZmlyc3QsIG9uIGEgY29weSBzbyB0aGUgY2FsbGVyJ3Mgb2JqZWN0IGlzIHVudG91Y2hlZC5cbiAgLy8gQSBjYWxsZXIgZm9yd2FyZGluZyBldmVyeSBvcHRpb25hbCBwYXJhbSBzZW5kcyBvd24ga2V5cyBob2xkaW5nIGB1bmRlZmluZWRgIGZvciB0aGUgb25lcyBpdCBkaWQgbm90IHJlY2VpdmUuXG4gIC8vIFRob3NlIGFyZSBub3QgcmVtb3ZlZCBieSBgbm9ybWFsaXplT3B0aW9uYWxQcm9wZXJ0aWVzYCwgd2hpY2ggaXMgYSB0eXBlLWxldmVsIG5vLW9wLlxuICAvLyBXaXRob3V0IHRoZSBzdHJpcCwgc3VjaCBhIGtleSBvdmVyd3JpdGVzIGEgZGVmYXVsdCB3aXRoIGB1bmRlZmluZWRgIGluc3RlYWQgb2YgZmFsbGluZyB0aHJvdWdoIHRvIGl0LlxuICBwYXJhbXMgPSBPYmplY3QuYXNzaWduKHt9LCBERUZBVUxUX1BBUkFNUywgLi4uY3VzdG9tRGVmYXVsdFBhcmFtcywgcmVtb3ZlVW5kZWZpbmVkUHJvcGVydGllczxHZW5lcmF0ZU1hcmtkb3duTGlua1BhcmFtcz4oeyAuLi5wYXJhbXMgfSkpO1xuICBjb25zdCB0YXJnZXRGaWxlID0gZ2V0RmlsZShub3JtYWxpemVPcHRpb25hbFByb3BlcnRpZXM8R2V0RmlsZVBhcmFtcz4oeyBhcHAsIHBhdGhPckZpbGU6IHBhcmFtcy50YXJnZXRQYXRoT3JGaWxlLCBzaG91bGRJbmNsdWRlTm9uRXhpc3Rpbmc6IHBhcmFtcy5pc05vbkV4aXN0aW5nRmlsZUFsbG93ZWQgfSkpO1xuXG4gIHVzaW5nIF9yZWdpc3RyYXRpb24gPSByZWdpc3RlckZpbGVzKGFwcCwgW3RhcmdldEZpbGVdKTtcbiAgcmV0dXJuIGdlbmVyYXRlTWFya2Rvd25MaW5rSW1wbChwYXJhbXMpO1xufVxuXG4vKipcbiAqIEdlbmVyYXRlcyBhIHJhdyBtYXJrZG93biBsaW5rIGJhc2VkIG9uIHRoZSBwcm92aWRlZCBwYXJhbXMuXG4gKlxuICogQHBhcmFtIHBhcmFtcyAtIFRoZSBwYXJhbWV0ZXJzIGZvciBnZW5lcmF0aW5nIGEgcmF3IG1hcmtkb3duIGxpbmsuXG4gKiBAcmV0dXJucyBBIHJhdyBtYXJrZG93biBsaW5rLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2VuZXJhdGVSYXdNYXJrZG93bkxpbmsocGFyYW1zOiBHZW5lcmF0ZVJhd01hcmtkb3duTGlua1BhcmFtcyk6IHN0cmluZyB7XG4gIGNvbnN0IGVtYmVkUHJlZml4ID0gcGFyYW1zLmlzRW1iZWQgPyAnIScgOiAnJztcblxuICBpZiAocGFyYW1zLmlzV2lraWxpbmspIHtcbiAgICBjb25zdCBhbGlhc1BhcnQgPSBwYXJhbXMuYWxpYXMgPyBgfCR7cGFyYW1zLmFsaWFzfWAgOiAnJztcbiAgICByZXR1cm4gYCR7ZW1iZWRQcmVmaXh9W1ske3BhcmFtcy51cmx9JHthbGlhc1BhcnR9XV1gO1xuICB9XG5cbiAgY29uc3QgYWxpYXMgPSBwYXJhbXMuYWxpYXMgPz8gJyc7XG4gIGNvbnN0IHNob3VsZEVzY2FwZUFsaWFzID0gcGFyYW1zLnNob3VsZEVzY2FwZUFsaWFzID8/IGZhbHNlO1xuICBjb25zdCBlc2NhcGVkQWxpYXMgPSBzaG91bGRFc2NhcGVBbGlhcyA/IGVzY2FwZUFsaWFzKGFsaWFzKSA6IGFsaWFzO1xuXG4gIGNvbnN0IHVybCA9IHBhcmFtcy5zaG91bGRVc2VBbmdsZUJyYWNrZXRzXG4gICAgPyBgPCR7cGFyYW1zLnVybH0+YFxuICAgIDogZW5jb2RlVXJsKHBhcmFtcy51cmwpO1xuXG4gIGNvbnN0IHRpdGxlUGFydCA9IHBhcmFtcy50aXRsZSA/IGAgJHtKU09OLnN0cmluZ2lmeShwYXJhbXMudGl0bGUpfWAgOiAnJztcblxuICByZXR1cm4gYCR7ZW1iZWRQcmVmaXh9WyR7ZXNjYXBlZEFsaWFzfV0oJHt1cmx9JHt0aXRsZVBhcnR9KWA7XG59XG5cbi8qKlxuICogUmV0dXJucyB0aGUgc2hhcmVkLCBtdXRhYmxlIGxpc3Qgb2YgZnVuY3Rpb25zIHRoYXQgcHJvdmlkZSBkZWZhdWx0IHBhcmFtcyBmb3Ige0BsaW5rIGdlbmVyYXRlTWFya2Rvd25MaW5rfS5cbiAqXG4gKiBFYWNoIGZ1bmN0aW9uIGlzIGludm9rZWQgb24gZXZlcnkge0BsaW5rIGdlbmVyYXRlTWFya2Rvd25MaW5rfSBjYWxsIGFuZCBpdHMgcmVzdWx0IGlzIG1lcmdlZCBpbnRvIHRoZSBwYXJhbXMgKGxhdGVyXG4gKiByZWdpc3RyYXRpb25zIHRha2UgcHJlY2VkZW5jZSBvdmVyIHRoZSBidWlsdC1pbiBkZWZhdWx0cywgYnV0IG5ldmVyIG92ZXIgZXhwbGljaXRseSBwYXNzZWQgcGFyYW1zKS4gUmVnaXN0ZXIgZW50cmllc1xuICogYnkgYWRkaW5nIGEgYEdlbmVyYXRlTWFya2Rvd25MaW5rRGVmYXVsdFBhcmFtc0NvbXBvbmVudGAgdG8gYSBjb21wb25lbnQgdHJlZSByYXRoZXIgdGhhbiBtdXRhdGluZyB0aGlzIGxpc3QgZGlyZWN0bHkuXG4gKlxuICogQHJldHVybnMgVGhlIG11dGFibGUgbGlzdCBvZiBkZWZhdWx0LXBhcmFtcyBmdW5jdGlvbnMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRHZW5lcmF0ZU1hcmtkb3duTGlua0RlZmF1bHRQYXJhbXNGbnMoKTogKCgpID0+IFBhcnRpYWw8R2VuZXJhdGVNYXJrZG93bkxpbmtQYXJhbXM+KVtdIHtcbiAgcmV0dXJuIGdldE9ic2lkaWFuTGliU3RhdGU8KCgpID0+IFBhcnRpYWw8R2VuZXJhdGVNYXJrZG93bkxpbmtQYXJhbXM+KVtdPignZ2VuZXJhdGVNYXJrZG93bkxpbmtEZWZhdWx0UGFyYW1zRm5zJywgW10pLnZhbHVlO1xufVxuXG4vKipcbiAqIFRlc3RzIHdoZXRoZXIgYSBsaW5rIHVzZXMgYW5nbGUgYnJhY2tldHMsIHBvc3NpYmx5IGVtYmVkOlxuICogYFt0aXRsZV0oPGxpbms+KWAsIGAhW3RpdGxlXSg8bGluaz4pYC5cbiAqXG4gKiBAcGFyYW0gbGluayAtIExpbmsgdG8gdGVzdFxuICogQHJldHVybnMgV2hldGhlciB0aGUgbGluayB1c2VzIGFuZ2xlIGJyYWNrZXRzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBoYXNBbmdsZUJyYWNrZXRzKGxpbms6IHN0cmluZyk6IGJvb2xlYW4ge1xuICBjb25zdCBwYXJzZUxpbmtSZXN1bHQgPSBwYXJzZUxpbmsobGluayk7XG4gIHJldHVybiBwYXJzZUxpbmtSZXN1bHQ/Lmhhc0FuZ2xlQnJhY2tldHMgPz8gZmFsc2U7XG59XG5cbi8qKlxuICogVGVzdHMgd2hldGhlciBhIGxpbmsgaXMgYW4gZW1iZWQgbGluazpcbiAqIGAhW1tsaW5rXV1gLCBgIVt0aXRsZV0obGluaylgLlxuICpcbiAqIEBwYXJhbSBsaW5rIC0gTGluayB0byB0ZXN0XG4gKiBAcmV0dXJucyBXaGV0aGVyIHRoZSBsaW5rIGlzIGFuIGVtYmVkIGxpbmtcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGhhc0VtYmVkU3ludGF4KGxpbms6IHN0cmluZyk6IGJvb2xlYW4ge1xuICBjb25zdCBwYXJzZUxpbmtSZXN1bHQgPSBwYXJzZUxpbmsobGluayk7XG4gIHJldHVybiBwYXJzZUxpbmtSZXN1bHQ/LmlzRW1iZWQgPz8gZmFsc2U7XG59XG5cbi8qKlxuICogVGVzdHMgd2hldGhlciBhIGxpbmsgaGFzIGEgbGVhZGluZyBkb3QsIHBvc3NpYmx5IGVtYmVkOlxuICogYFtbLi9saW5rXV1gLCBgW3RpdGxlXSguL2xpbmspYCwgYFt0aXRsZV0oPC4vbGluaz4pYCxcbiAqIGAhW1suL2xpbmtdXWAsIGAhW3RpdGxlXSguL2xpbmspYCwgYCFbdGl0bGVdKDwuL2xpbms+KWAuXG4gKlxuICogQHBhcmFtIGxpbmsgLSBMaW5rIHRvIHRlc3RcbiAqIEByZXR1cm5zIFdoZXRoZXIgdGhlIGxpbmsgaGFzIGEgbGVhZGluZyBkb3RcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGhhc0xlYWRpbmdEb3QobGluazogc3RyaW5nKTogYm9vbGVhbiB7XG4gIGNvbnN0IHBhcnNlTGlua1Jlc3VsdCA9IHBhcnNlTGluayhsaW5rKTtcbiAgcmV0dXJuIHBhcnNlTGlua1Jlc3VsdD8udXJsLnN0YXJ0c1dpdGgoJy4vJykgPz8gZmFsc2U7XG59XG5cbi8qKlxuICogVGVzdHMgd2hldGhlciBhIGxpbmsgaGFzIGEgbGVhZGluZyBzbGFzaCwgcG9zc2libHkgZW1iZWQ6XG4gKiBgW1svbGlua11dYCwgYFt0aXRsZV0oL2xpbmspYCwgYFt0aXRsZV0oPC9saW5rPilgLFxuICogYCFbWy9saW5rXV1gLCBgIVt0aXRsZV0oL2xpbmspYCwgYCFbdGl0bGVdKDwvbGluaz4pYC5cbiAqXG4gKiBAcGFyYW0gbGluayAtIExpbmsgdG8gdGVzdFxuICogQHJldHVybnMgV2hldGhlciB0aGUgbGluayBoYXMgYSBsZWFkaW5nIHNsYXNoXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBoYXNMZWFkaW5nU2xhc2gobGluazogc3RyaW5nKTogYm9vbGVhbiB7XG4gIGNvbnN0IHBhcnNlTGlua1Jlc3VsdCA9IHBhcnNlTGluayhsaW5rKTtcbiAgcmV0dXJuIHBhcnNlTGlua1Jlc3VsdD8udXJsLnN0YXJ0c1dpdGgoJy8nKSA/PyBmYWxzZTtcbn1cblxuLyoqXG4gKiBUZXN0cyB3aGV0aGVyIGEgbGluayBpcyBhIHdpa2lsaW5rLCBwb3NzaWJseSBlbWJlZDpcbiAqIGBbW2xpbmtdXWAsIGAhW1tsaW5rXV1gLlxuICpcbiAqIEBwYXJhbSBsaW5rIC0gTGluayB0byB0ZXN0XG4gKiBAcmV0dXJucyBXaGV0aGVyIHRoZSBsaW5rIGlzIGEgd2lraWxpbmtcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGhhc1dpa2lsaW5rU3ludGF4KGxpbms6IHN0cmluZyk6IGJvb2xlYW4ge1xuICBjb25zdCBwYXJzZUxpbmtSZXN1bHQgPSBwYXJzZUxpbmsobGluayk7XG4gIHJldHVybiBwYXJzZUxpbmtSZXN1bHQ/LmlzV2lraWxpbmsgPz8gZmFsc2U7XG59XG5cbi8qKlxuICogRGV0ZXJtaW5lcyBpZiB0aGUgYWxpYXMgb2YgYSBsaW5rIHNob3VsZCBiZSByZXNldC5cbiAqXG4gKiBAcGFyYW0gcGFyYW1zIC0gVGhlIHBhcmFtZXRlcnMgZm9yIGRldGVybWluaW5nIGlmIHRoZSBhbGlhcyBzaG91bGQgYmUgcmVzZXQuXG4gKiBAcmV0dXJucyBXaGV0aGVyIHRoZSBhbGlhcyBzaG91bGQgYmUgcmVzZXQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzaG91bGRSZXNldEFsaWFzKHBhcmFtczogU2hvdWxkUmVzZXRBbGlhc1BhcmFtcyk6IGJvb2xlYW4ge1xuICBjb25zdCB7XG4gICAgYXBwLFxuICAgIGRpc3BsYXlUZXh0LFxuICAgIGlzV2lraWxpbmssXG4gICAgbmV3U291cmNlUGF0aE9yRmlsZSxcbiAgICBvbGRTb3VyY2VQYXRoT3JGaWxlLFxuICAgIG9sZFRhcmdldFBhdGgsXG4gICAgdGFyZ2V0UGF0aE9yRmlsZVxuICB9ID0gcGFyYW1zO1xuICBpZiAoaXNXaWtpbGluayA9PT0gZmFsc2UpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBpZiAoIWRpc3BsYXlUZXh0KSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICBjb25zdCB0YXJnZXRGaWxlID0gZ2V0RmlsZSh7IGFwcCwgcGF0aE9yRmlsZTogdGFyZ2V0UGF0aE9yRmlsZSwgc2hvdWxkSW5jbHVkZU5vbkV4aXN0aW5nOiB0cnVlIH0pO1xuICBjb25zdCBuZXdTb3VyY2VQYXRoID0gZ2V0UGF0aChhcHAsIG5ld1NvdXJjZVBhdGhPckZpbGUpO1xuICBjb25zdCBvbGRTb3VyY2VQYXRoID0gZ2V0UGF0aChhcHAsIG9sZFNvdXJjZVBhdGhPckZpbGUgPz8gbmV3U291cmNlUGF0aE9yRmlsZSk7XG4gIGNvbnN0IG5ld1NvdXJjZUZvbGRlciA9IGRpcm5hbWUobmV3U291cmNlUGF0aCk7XG4gIGNvbnN0IG9sZFNvdXJjZUZvbGRlciA9IGRpcm5hbWUob2xkU291cmNlUGF0aCk7XG4gIGNvbnN0IGFsaWFzZXNUb1Jlc2V0ID0gbmV3IFNldDxzdHJpbmc+KCk7XG5cbiAgZm9yIChjb25zdCBwYXRoT3JGaWxlIG9mIFt0YXJnZXRGaWxlLnBhdGgsIG9sZFRhcmdldFBhdGhdKSB7XG4gICAgaWYgKCFwYXRoT3JGaWxlKSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICBjb25zdCBwYXRoID0gZ2V0UGF0aChhcHAsIHBhdGhPckZpbGUpO1xuICAgIGFsaWFzZXNUb1Jlc2V0LmFkZChwYXRoKTtcbiAgICBhbGlhc2VzVG9SZXNldC5hZGQoYmFzZW5hbWUocGF0aCkpO1xuICAgIGFsaWFzZXNUb1Jlc2V0LmFkZChyZWxhdGl2ZShuZXdTb3VyY2VGb2xkZXIsIHBhdGgpKTtcbiAgICBhbGlhc2VzVG9SZXNldC5hZGQocmVsYXRpdmUob2xkU291cmNlRm9sZGVyLCBwYXRoKSk7XG4gIH1cblxuICBmb3IgKGNvbnN0IHNvdXJjZVBhdGggb2YgW29sZFNvdXJjZVBhdGgsIG5ld1NvdXJjZVBhdGhdKSB7XG4gICAgYWxpYXNlc1RvUmVzZXQuYWRkKGFwcC5tZXRhZGF0YUNhY2hlLmZpbGVUb0xpbmt0ZXh0KHRhcmdldEZpbGUsIHNvdXJjZVBhdGgsIGZhbHNlKSk7XG4gIH1cblxuICBjb25zdCBjbGVhbkRpc3BsYXlUZXh0ID0gcmVwbGFjZUFsbCh7XG4gICAgJHN0cmluZzogbm9ybWFsaXplUGF0aChlbnN1cmVOb25OdWxsYWJsZShkaXNwbGF5VGV4dC5zcGxpdCgnID4gJywgMSlbMF0pKSxcbiAgICByZXBsYWNlcjogJycsXG4gICAgc2VhcmNoVmFsdWU6IC9eXFwuXFwvL2dcbiAgfSkudG9Mb3dlckNhc2UoKTtcblxuICBmb3IgKGNvbnN0IGFsaWFzIG9mIGFsaWFzZXNUb1Jlc2V0KSB7XG4gICAgaWYgKGFsaWFzLnRvTG93ZXJDYXNlKCkgPT09IGNsZWFuRGlzcGxheVRleHQpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIGNvbnN0IGZvbGRlciA9IGRpcm5hbWUoYWxpYXMpO1xuICAgIGNvbnN0IGJhc2UgPSBiYXNlbmFtZShhbGlhcywgZXh0bmFtZShhbGlhcykpO1xuICAgIGlmIChqb2luKGZvbGRlciwgYmFzZSkudG9Mb3dlckNhc2UoKSA9PT0gY2xlYW5EaXNwbGF5VGV4dCkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGZhbHNlO1xufVxuXG4vKipcbiAqIFNwbGl0cyBhIGxpbmsgaW50byBpdHMgbGluayBwYXRoIGFuZCBzdWJwYXRoLlxuICpcbiAqIEBwYXJhbSBsaW5rIC0gVGhlIGxpbmsgdG8gc3BsaXQuXG4gKiBAcmV0dXJucyBBbiBvYmplY3QgY29udGFpbmluZyB0aGUgbGluayBwYXRoIGFuZCBzdWJwYXRoLlxuICovXG5leHBvcnQgZnVuY3Rpb24gc3BsaXRTdWJwYXRoKGxpbms6IHN0cmluZyk6IFNwbGl0U3VicGF0aFJlc3VsdCB7XG4gIGNvbnN0IHBhcnNlZCA9IHBhcnNlTGlua3RleHQobm9ybWFsaXplU3RyaW5nKGxpbmspKTtcbiAgcmV0dXJuIHtcbiAgICBsaW5rUGF0aDogcGFyc2VkLnBhdGgsXG4gICAgc3VicGF0aDogcGFyc2VkLnN1YnBhdGhcbiAgfTtcbn1cblxuLyoqXG4gKiBOb3JtYWxpemVzIHRoZSBgZmlsZTovL2AgbGlua3MgaW4gYSBjb250ZW50IHN0cmluZyB0byBhIHByZXR0eSBmb3JtLCBjb252ZXJ0aW5nIGJhY2tzbGFzaGVzIHRvIGZvcndhcmRcbiAqIHNsYXNoZXMuIE90aGVyIGxpbmtzIGFyZSBsZWZ0IHVuY2hhbmdlZC5cbiAqXG4gKiBAcGFyYW0gcGFyYW1zIC0gVGhlIHBhcmFtZXRlcnMgZm9yIG5vcm1hbGl6aW5nIHRoZSBsaW5rcy5cbiAqIEByZXR1cm5zIEEge0BsaW5rIFByb21pc2V9IHRoYXQgcmVzb2x2ZXMgdG8gdGhlIGNvbnRlbnQgd2l0aCBub3JtYWxpemVkIGBmaWxlOi8vYCBsaW5rcy5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHVwZGF0ZUZpbGVVcmxMaW5rc0luQ29udGVudChwYXJhbXM6IFVwZGF0ZUZpbGVVcmxMaW5rc0luQ29udGVudFBhcmFtcyk6IFByb21pc2U8c3RyaW5nPiB7XG4gIGNvbnN0IHsgYXBwLCBjb250ZW50LCBvZmZzZXRSYW5nZSwgc2hvdWxkVXNlQW5nbGVCcmFja2V0cyA9IGZhbHNlIH0gPSBwYXJhbXM7XG4gIHJldHVybiBhd2FpdCBlZGl0TGlua3NJbkNvbnRlbnQobm9ybWFsaXplT3B0aW9uYWxQcm9wZXJ0aWVzPEVkaXRMaW5rc0luQ29udGVudFBhcmFtcz4oe1xuICAgIGFib3J0U2lnbmFsOiBwYXJhbXMuYWJvcnRTaWduYWwsXG4gICAgYXBwLFxuICAgIGNvbnRlbnQsXG4gICAgbGlua0NvbnZlcnRlcjogKGxpbmspID0+IG5vcm1hbGl6ZUZpbGVVcmxMaW5rKGxpbmssIHNob3VsZFVzZUFuZ2xlQnJhY2tldHMpLFxuICAgIG9mZnNldFJhbmdlLFxuICAgIHNob3VsZEVkaXRFeHRlcm5hbExpbmtzOiB0cnVlLFxuICAgIHNob3VsZEVkaXRGcm9udG1hdHRlckV4dGVybmFsTGlua3M6IHRydWUsXG4gICAgc2hvdWxkRWRpdE11bHRpVmFsdWVGcm9udG1hdHRlckV4dGVybmFsTGlua3M6IHRydWVcbiAgfSkpO1xufVxuXG4vKipcbiAqIE5vcm1hbGl6ZXMgdGhlIGBmaWxlOi8vYCBsaW5rcyBpbiBhIGZpbGUgdG8gYSBwcmV0dHkgZm9ybSwgY29udmVydGluZyBiYWNrc2xhc2hlcyB0byBmb3J3YXJkIHNsYXNoZXMuXG4gKiBPdGhlciBsaW5rcyBhcmUgbGVmdCB1bmNoYW5nZWQuXG4gKlxuICogQHBhcmFtIHBhcmFtcyAtIFRoZSBwYXJhbWV0ZXJzIGZvciBub3JtYWxpemluZyB0aGUgbGlua3MuXG4gKiBAcmV0dXJucyBBIHtAbGluayBQcm9taXNlfSB0aGF0IHJlc29sdmVzIHdoZW4gdGhlIGxpbmtzIGFyZSBub3JtYWxpemVkLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gdXBkYXRlRmlsZVVybExpbmtzSW5GaWxlKHBhcmFtczogVXBkYXRlRmlsZVVybExpbmtzSW5GaWxlUGFyYW1zKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IHtcbiAgICBhcHAsXG4gICAgb2Zmc2V0UmFuZ2UsXG4gICAgcGF0aE9yRmlsZSxcbiAgICBzaG91bGRVc2VBbmdsZUJyYWNrZXRzID0gZmFsc2UsXG4gICAgLi4ub3B0aW9uc1xuICB9ID0gcGFyYW1zO1xuICBhd2FpdCBlZGl0TGlua3Mobm9ybWFsaXplT3B0aW9uYWxQcm9wZXJ0aWVzPEVkaXRMaW5rc1BhcmFtcz4oe1xuICAgIGFwcCxcbiAgICBsaW5rQ29udmVydGVyOiAobGluaykgPT4gbm9ybWFsaXplRmlsZVVybExpbmsobGluaywgc2hvdWxkVXNlQW5nbGVCcmFja2V0cyksXG4gICAgLy8gRm9yd2FyZGVkIGJ5IG5hbWUgcmF0aGVyIHRoYW4gdGhyb3VnaCBgb3B0aW9uc2AsIHNvIGEgbGF0ZXIgcmVmYWN0b3IgY2Fubm90IGRyb3AgaXQgc2lsZW50bHkuXG4gICAgb2Zmc2V0UmFuZ2UsXG4gICAgcGF0aE9yRmlsZSxcbiAgICBzaG91bGRFZGl0RXh0ZXJuYWxMaW5rczogdHJ1ZSxcbiAgICBzaG91bGRFZGl0RnJvbnRtYXR0ZXJFeHRlcm5hbExpbmtzOiB0cnVlLFxuICAgIHNob3VsZEVkaXRNdWx0aVZhbHVlRnJvbnRtYXR0ZXJFeHRlcm5hbExpbmtzOiB0cnVlLFxuICAgIC4uLm9wdGlvbnNcbiAgfSkpO1xufVxuXG4vKipcbiAqIFVwZGF0ZXMgYSBsaW5rIGJhc2VkIG9uIHRoZSBwcm92aWRlZCBwYXJhbWV0ZXJzLlxuICpcbiAqIEBwYXJhbSBwYXJhbXMgLSBUaGUgcGFyYW1ldGVycyBmb3IgdXBkYXRpbmcgdGhlIGxpbmsuXG4gKiBAcmV0dXJucyBUaGUgdXBkYXRlZCBsaW5rLlxuICovXG5leHBvcnQgZnVuY3Rpb24gdXBkYXRlTGluayhwYXJhbXM6IFVwZGF0ZUxpbmtQYXJhbXMpOiBzdHJpbmcge1xuICBjb25zdCB7XG4gICAgYXBwLFxuICAgIGlzRW1wdHlFbWJlZEFsaWFzQWxsb3dlZCxcbiAgICBsaW5rLFxuICAgIGxpbmtQYXRoU3R5bGUsXG4gICAgbGlua1N0eWxlLFxuICAgIG5ld1NvdXJjZVBhdGhPckZpbGUsXG4gICAgbmV3VGFyZ2V0UGF0aE9yRmlsZSxcbiAgICBvbGRTb3VyY2VQYXRoT3JGaWxlLFxuICAgIG9sZFRhcmdldFBhdGhPckZpbGUsXG4gICAgc2hvdWxkRXNjYXBlQWxpYXMsXG4gICAgc2hvdWxkSW5jbHVkZUF0dGFjaG1lbnRFeHRlbnNpb25Ub0VtYmVkQWxpYXMsXG4gICAgc2hvdWxkVXBkYXRlRmlsZU5hbWVBbGlhcyA9IHRydWUsXG4gICAgc2hvdWxkVXNlQW5nbGVCcmFja2V0cyxcbiAgICBzaG91bGRVc2VMZWFkaW5nRG90Rm9yUmVsYXRpdmVQYXRocyxcbiAgICBzaG91bGRVc2VMZWFkaW5nU2xhc2hGb3JBYnNvbHV0ZVBhdGhzXG4gIH0gPSBwYXJhbXM7XG4gIGNvbnN0IG9yaWdpbmFsTGlua1RleHQgPSBnZXRSZWZlcmVuY2VMaW5rVGV4dChsaW5rKTtcbiAgaWYgKCFuZXdUYXJnZXRQYXRoT3JGaWxlKSB7XG4gICAgcmV0dXJuIG9yaWdpbmFsTGlua1RleHQ7XG4gIH1cbiAgY29uc3QgbmV3VGFyZ2V0RmlsZSA9IGdldEZpbGUoeyBhcHAsIHBhdGhPckZpbGU6IG5ld1RhcmdldFBhdGhPckZpbGUsIHNob3VsZEluY2x1ZGVOb25FeGlzdGluZzogdHJ1ZSB9KTtcbiAgY29uc3Qgb2xkU291cmNlUGF0aCA9IGdldFBhdGgoYXBwLCBvbGRTb3VyY2VQYXRoT3JGaWxlID8/IG5ld1NvdXJjZVBhdGhPckZpbGUpO1xuICBjb25zdCBvbGRUYXJnZXRQYXRoID0gZ2V0UGF0aChhcHAsIG9sZFRhcmdldFBhdGhPckZpbGUgPz8gbmV3VGFyZ2V0UGF0aE9yRmlsZSk7XG4gIGNvbnN0IGlzV2lraWxpbmsgPSBzaG91bGRVc2VXaWtpbGlua1N0eWxlKG5vcm1hbGl6ZU9wdGlvbmFsUHJvcGVydGllczxTaG91bGRVc2VXaWtpbGlua1N0eWxlUGFyYW1zPih7XG4gICAgYXBwLFxuICAgIGxpbmtTdHlsZSxcbiAgICBvcmlnaW5hbExpbms6IG9yaWdpbmFsTGlua1RleHRcbiAgfSkpO1xuXG4gIGNvbnN0IHsgc3VicGF0aCB9ID0gc3BsaXRTdWJwYXRoKGxpbmsubGluayk7XG5cbiAgLyogdjggaWdub3JlIHN0YXJ0IC0tIENhbnZhcyBmaWxlIG5vZGUgcmVmZXJlbmNlIGJyYW5jaCBpcyBoYXJkIHRvIHJlcHJvZHVjZSBpbiB1bml0IHRlc3RzLiAqL1xuICBpZiAoaXNDYW52YXNGaWxlKG5ld1NvdXJjZVBhdGhPckZpbGUpICYmIGlzQ2FudmFzRmlsZU5vZGVSZWZlcmVuY2UobGluaykpIHtcbiAgICByZXR1cm4gbmV3VGFyZ2V0RmlsZS5wYXRoICsgc3VicGF0aDtcblxuICAgIC8qIHY4IGlnbm9yZSBzdG9wICovXG4gIH1cblxuICBjb25zdCBwYXJzZUxpbmtSZXN1bHQgPSBwYXJzZUxpbmsob3JpZ2luYWxMaW5rVGV4dCk7XG4gIGxldCBhbGlhczogc3RyaW5nIHwgdW5kZWZpbmVkO1xuXG4gIGlmIChpc1dpa2lsaW5rICYmIHBhcnNlTGlua1Jlc3VsdD8uYWxpYXMpIHtcbiAgICBhbGlhcyA9IHBhcnNlTGlua1Jlc3VsdC5hbGlhcztcbiAgfVxuXG4gIGFsaWFzID8/PSBzaG91bGRSZXNldEFsaWFzKG5vcm1hbGl6ZU9wdGlvbmFsUHJvcGVydGllczxTaG91bGRSZXNldEFsaWFzUGFyYW1zPih7XG4gICAgICBhcHAsXG4gICAgICBkaXNwbGF5VGV4dDogbGluay5kaXNwbGF5VGV4dCxcbiAgICAgIGlzV2lraWxpbmssXG4gICAgICBuZXdTb3VyY2VQYXRoT3JGaWxlLFxuICAgICAgb2xkU291cmNlUGF0aE9yRmlsZSxcbiAgICAgIG9sZFRhcmdldFBhdGgsXG4gICAgICB0YXJnZXRQYXRoT3JGaWxlOiBuZXdUYXJnZXRGaWxlXG4gICAgfSkpXG4gICAgPyB1bmRlZmluZWRcbiAgICA6IHBhcnNlTGlua1Jlc3VsdD8uYWxpYXM7XG5cbiAgLy8gUmVmcmVzaCBhIGZpbGUtbmFtZSBhbGlhcyB0byB0aGUgbmV3IGJhc2UgbmFtZSB3aGVuIHRoZSBmbGFnIGlzIHNldC5cbiAgLy8gQSBmaWxlLW5hbWUgYWxpYXMgZXF1YWxzIHRoZSBPTEQgYmFzZSBuYW1lICh3aXRoIG9yIHdpdGhvdXQgZXh0ZW5zaW9uKTsgYSBjdXN0b20gYWxpYXMgaXMga2VwdC5cbiAgLy8gR2F0aW5nIG9uIHRoZSBmbGFnIGFsc28gcmVmcmVzaGVzIHdpa2lsaW5rcyB0aGF0IGNhcnJ5IGFuIGV4cGxpY2l0IGFsaWFzLlxuICAvLyBUaG9zZSBwcmV2aW91c2x5IHNob3J0LWNpcmN1aXRlZCB0aGUgcmVmcmVzaCBhbmQga2VwdCB0aGUgc3RhbGUgb2xkIGJhc2UgbmFtZS5cbiAgaWYgKHNob3VsZFVwZGF0ZUZpbGVOYW1lQWxpYXMpIHtcbiAgICBpZiAoYWxpYXMgPT09IGJhc2VuYW1lKG9sZFRhcmdldFBhdGgsIGV4dG5hbWUob2xkVGFyZ2V0UGF0aCkpKSB7XG4gICAgICBhbGlhcyA9IG5ld1RhcmdldEZpbGUuYmFzZW5hbWU7XG4gICAgfSBlbHNlIGlmIChhbGlhcyA9PT0gYmFzZW5hbWUob2xkVGFyZ2V0UGF0aCkpIHtcbiAgICAgIGFsaWFzID0gbmV3VGFyZ2V0RmlsZS5uYW1lO1xuICAgIH1cbiAgfVxuXG4gIGNvbnN0IG5ld0xpbmsgPSBnZW5lcmF0ZU1hcmtkb3duTGluayhub3JtYWxpemVPcHRpb25hbFByb3BlcnRpZXM8R2VuZXJhdGVNYXJrZG93bkxpbmtQYXJhbXM+KHtcbiAgICBhbGlhcyxcbiAgICBhcHAsXG4gICAgaXNFbXB0eUVtYmVkQWxpYXNBbGxvd2VkLFxuICAgIGlzU2luZ2xlU3VicGF0aEFsbG93ZWQ6IG9sZFNvdXJjZVBhdGggPT09IG9sZFRhcmdldFBhdGggJiYgISFwYXJzZUxpbmtSZXN1bHQ/LmFsaWFzLFxuICAgIGxpbmtQYXRoU3R5bGUsXG4gICAgbGlua1N0eWxlLFxuICAgIG9yaWdpbmFsTGluazogb3JpZ2luYWxMaW5rVGV4dCxcbiAgICBzaG91bGRFc2NhcGVBbGlhcyxcbiAgICBzaG91bGRJbmNsdWRlQXR0YWNobWVudEV4dGVuc2lvblRvRW1iZWRBbGlhcyxcbiAgICBzaG91bGRVc2VBbmdsZUJyYWNrZXRzLFxuICAgIHNob3VsZFVzZUxlYWRpbmdEb3RGb3JSZWxhdGl2ZVBhdGhzLFxuICAgIHNob3VsZFVzZUxlYWRpbmdTbGFzaEZvckFic29sdXRlUGF0aHMsXG4gICAgc291cmNlUGF0aE9yRmlsZTogbmV3U291cmNlUGF0aE9yRmlsZSxcbiAgICBzdWJwYXRoLFxuICAgIHRhcmdldFBhdGhPckZpbGU6IG5ld1RhcmdldEZpbGVcbiAgfSkpO1xuICByZXR1cm4gbmV3TGluaztcbn1cblxuLyoqXG4gKiBVcGRhdGVzIHRoZSBsaW5rcyBpbiBhIGNvbnRlbnQgc3RyaW5nIGJhc2VkIG9uIHRoZSBwcm92aWRlZCBwYXJhbWV0ZXJzLlxuICpcbiAqIEBwYXJhbSBwYXJhbXMgLSBUaGUgcGFyYW1ldGVycyBmb3IgdXBkYXRpbmcgdGhlIGxpbmtzLlxuICogQHJldHVybnMgQSB7QGxpbmsgUHJvbWlzZX0gdGhhdCByZXNvbHZlcyB0byB0aGUgY29udGVudCB3aXRoIHVwZGF0ZWQgbGlua3MuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiB1cGRhdGVMaW5rc0luQ29udGVudChwYXJhbXM6IFVwZGF0ZUxpbmtzSW5Db250ZW50UGFyYW1zKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgY29uc3Qge1xuICAgIGFwcCxcbiAgICBjb250ZW50LFxuICAgIGlzRW1wdHlFbWJlZEFsaWFzQWxsb3dlZCxcbiAgICBsaW5rUGF0aFN0eWxlLFxuICAgIGxpbmtTdHlsZSxcbiAgICBsaW5rU3R5bGVQcm92aWRlcixcbiAgICBuZXdTb3VyY2VQYXRoT3JGaWxlLFxuICAgIG9mZnNldFJhbmdlLFxuICAgIG9sZFNvdXJjZVBhdGhPckZpbGUsXG4gICAgc2hvdWxkRXNjYXBlQWxpYXMsXG4gICAgc2hvdWxkSW5jbHVkZUF0dGFjaG1lbnRFeHRlbnNpb25Ub0VtYmVkQWxpYXMsXG4gICAgc2hvdWxkVXBkYXRlRW1iZWRPbmx5TGlua3MsXG4gICAgc2hvdWxkVXBkYXRlRmlsZU5hbWVBbGlhcyxcbiAgICBzaG91bGRVc2VBbmdsZUJyYWNrZXRzLFxuICAgIHNob3VsZFVzZUxlYWRpbmdEb3RGb3JSZWxhdGl2ZVBhdGhzLFxuICAgIHNob3VsZFVzZUxlYWRpbmdTbGFzaEZvckFic29sdXRlUGF0aHNcbiAgfSA9IHBhcmFtcztcblxuICByZXR1cm4gYXdhaXQgZWRpdExpbmtzSW5Db250ZW50KG5vcm1hbGl6ZU9wdGlvbmFsUHJvcGVydGllczxFZGl0TGlua3NJbkNvbnRlbnRQYXJhbXM+KHtcbiAgICBhcHAsXG4gICAgY29udGVudCxcbiAgICBsaW5rQ29udmVydGVyOiAobGluaykgPT4ge1xuICAgICAgY29uc3QgaXNFbWJlZExpbmsgPSBoYXNFbWJlZFN5bnRheChnZXRSZWZlcmVuY2VMaW5rVGV4dChsaW5rKSk7XG4gICAgICByZXR1cm4gc2hvdWxkVXBkYXRlRW1iZWRPbmx5TGlua3MgIT09IHVuZGVmaW5lZCAmJiBzaG91bGRVcGRhdGVFbWJlZE9ubHlMaW5rcyAhPT0gaXNFbWJlZExpbmtcbiAgICAgICAgPyB1bmRlZmluZWRcbiAgICAgICAgOiBjb252ZXJ0TGluayhub3JtYWxpemVPcHRpb25hbFByb3BlcnRpZXM8Q29udmVydExpbmtQYXJhbXM+KHtcbiAgICAgICAgICBhcHAsXG4gICAgICAgICAgaXNFbXB0eUVtYmVkQWxpYXNBbGxvd2VkLFxuICAgICAgICAgIGxpbmssXG4gICAgICAgICAgbGlua1BhdGhTdHlsZSxcbiAgICAgICAgICBsaW5rU3R5bGU6IGxpbmtTdHlsZVByb3ZpZGVyPy4obGluaykgPz8gbGlua1N0eWxlLFxuICAgICAgICAgIG5ld1NvdXJjZVBhdGhPckZpbGUsXG4gICAgICAgICAgb2xkU291cmNlUGF0aE9yRmlsZSxcbiAgICAgICAgICBzaG91bGRFc2NhcGVBbGlhcyxcbiAgICAgICAgICBzaG91bGRJbmNsdWRlQXR0YWNobWVudEV4dGVuc2lvblRvRW1iZWRBbGlhcyxcbiAgICAgICAgICBzaG91bGRVcGRhdGVGaWxlTmFtZUFsaWFzLFxuICAgICAgICAgIHNob3VsZFVzZUFuZ2xlQnJhY2tldHMsXG4gICAgICAgICAgc2hvdWxkVXNlTGVhZGluZ0RvdEZvclJlbGF0aXZlUGF0aHMsXG4gICAgICAgICAgc2hvdWxkVXNlTGVhZGluZ1NsYXNoRm9yQWJzb2x1dGVQYXRoc1xuICAgICAgICB9KSk7XG4gICAgfSxcbiAgICBvZmZzZXRSYW5nZVxuICB9KSk7XG59XG5cbi8qKlxuICogVXBkYXRlcyB0aGUgbGlua3MgaW4gYSBmaWxlIGJhc2VkIG9uIHRoZSBwcm92aWRlZCBwYXJhbWV0ZXJzLlxuICpcbiAqIEBwYXJhbSBwYXJhbXMgLSBUaGUgcGFyYW1ldGVycyBmb3IgdXBkYXRpbmcgdGhlIGxpbmtzLlxuICogQHJldHVybnMgQSB7QGxpbmsgUHJvbWlzZX0gdGhhdCByZXNvbHZlcyB3aGVuIHRoZSBsaW5rcyBhcmUgdXBkYXRlZC5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHVwZGF0ZUxpbmtzSW5GaWxlKHBhcmFtczogVXBkYXRlTGlua3NJbkZpbGVQYXJhbXMpOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3Qge1xuICAgIGFwcCxcbiAgICBpc0VtcHR5RW1iZWRBbGlhc0FsbG93ZWQsXG4gICAgbGlua1BhdGhTdHlsZSxcbiAgICBsaW5rU3R5bGUsXG4gICAgbGlua1N0eWxlUHJvdmlkZXIsXG4gICAgbmV3U291cmNlUGF0aE9yRmlsZSxcbiAgICBvZmZzZXRSYW5nZSxcbiAgICBvbGRTb3VyY2VQYXRoT3JGaWxlLFxuICAgIHNob3VsZEVzY2FwZUFsaWFzLFxuICAgIHNob3VsZEluY2x1ZGVBdHRhY2htZW50RXh0ZW5zaW9uVG9FbWJlZEFsaWFzLFxuICAgIHNob3VsZFVwZGF0ZUVtYmVkT25seUxpbmtzLFxuICAgIHNob3VsZFVwZGF0ZUZpbGVOYW1lQWxpYXMsXG4gICAgc2hvdWxkVXNlQW5nbGVCcmFja2V0cyxcbiAgICBzaG91bGRVc2VMZWFkaW5nRG90Rm9yUmVsYXRpdmVQYXRocyxcbiAgICBzaG91bGRVc2VMZWFkaW5nU2xhc2hGb3JBYnNvbHV0ZVBhdGhzXG4gIH0gPSBwYXJhbXM7XG5cbiAgaWYgKGlzQ2FudmFzRmlsZShuZXdTb3VyY2VQYXRoT3JGaWxlKSAmJiAhYXBwLmludGVybmFsUGx1Z2lucy5nZXRFbmFibGVkUGx1Z2luQnlJZChJbnRlcm5hbFBsdWdpbk5hbWUuQ2FudmFzKSkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGF3YWl0IGVkaXRMaW5rcyhub3JtYWxpemVPcHRpb25hbFByb3BlcnRpZXM8RWRpdExpbmtzUGFyYW1zPih7XG4gICAgLi4ucGFyYW1zLFxuICAgIGxpbmtDb252ZXJ0ZXI6IChsaW5rKSA9PiB7XG4gICAgICBjb25zdCBpc0VtYmVkTGluayA9IGhhc0VtYmVkU3ludGF4KGdldFJlZmVyZW5jZUxpbmtUZXh0KGxpbmspKTtcbiAgICAgIHJldHVybiBzaG91bGRVcGRhdGVFbWJlZE9ubHlMaW5rcyAhPT0gdW5kZWZpbmVkICYmIHNob3VsZFVwZGF0ZUVtYmVkT25seUxpbmtzICE9PSBpc0VtYmVkTGlua1xuICAgICAgICA/IHVuZGVmaW5lZFxuICAgICAgICA6IGNvbnZlcnRMaW5rKG5vcm1hbGl6ZU9wdGlvbmFsUHJvcGVydGllczxDb252ZXJ0TGlua1BhcmFtcz4oe1xuICAgICAgICAgIGFwcCxcbiAgICAgICAgICBpc0VtcHR5RW1iZWRBbGlhc0FsbG93ZWQsXG4gICAgICAgICAgbGluayxcbiAgICAgICAgICBsaW5rUGF0aFN0eWxlLFxuICAgICAgICAgIGxpbmtTdHlsZTogbGlua1N0eWxlUHJvdmlkZXI/LihsaW5rKSA/PyBsaW5rU3R5bGUsXG4gICAgICAgICAgbmV3U291cmNlUGF0aE9yRmlsZSxcbiAgICAgICAgICBvbGRTb3VyY2VQYXRoT3JGaWxlLFxuICAgICAgICAgIHNob3VsZEVzY2FwZUFsaWFzLFxuICAgICAgICAgIHNob3VsZEluY2x1ZGVBdHRhY2htZW50RXh0ZW5zaW9uVG9FbWJlZEFsaWFzLFxuICAgICAgICAgIHNob3VsZFVwZGF0ZUZpbGVOYW1lQWxpYXMsXG4gICAgICAgICAgc2hvdWxkVXNlQW5nbGVCcmFja2V0cyxcbiAgICAgICAgICBzaG91bGRVc2VMZWFkaW5nRG90Rm9yUmVsYXRpdmVQYXRocyxcbiAgICAgICAgICBzaG91bGRVc2VMZWFkaW5nU2xhc2hGb3JBYnNvbHV0ZVBhdGhzXG4gICAgICAgIH0pKTtcbiAgICB9LFxuICAgIC8vIE5hbWVkIGJlc2lkZSB0aGUgYC4uLnBhcmFtc2Agc3ByZWFkLCBzbyBhIGxhdGVyIHJlZmFjdG9yIHRvIGV4cGxpY2l0IGZvcndhcmRpbmcgY2Fubm90IGRyb3AgaXQgc2lsZW50bHkuXG4gICAgb2Zmc2V0UmFuZ2UsXG4gICAgcGF0aE9yRmlsZTogbmV3U291cmNlUGF0aE9yRmlsZVxuICB9KSk7XG59XG5cbmZ1bmN0aW9uIGRlZmF1bHRMaW5rSWRlbnRpdHlLZXlQcm92aWRlcihsaW5rOiBSZWZlcmVuY2UpOiBzdHJpbmcge1xuICByZXR1cm4gSlNPTi5zdHJpbmdpZnkobGluayk7XG59XG5cbmZ1bmN0aW9uIGdlbmVyYXRlTGlua1RleHQocGFyYW1zOiBHZW5lcmF0ZUxpbmtUZXh0UGFyYW1zKTogc3RyaW5nIHtcbiAgY29uc3QgeyBhcHAsIGNvbmZpZywgc3VicGF0aCwgdGFyZ2V0RmlsZSB9ID0gcGFyYW1zO1xuICBsZXQgeyBzb3VyY2VQYXRoIH0gPSBwYXJhbXM7XG4gIGlmIChzb3VyY2VQYXRoID09PSAnLycpIHtcbiAgICBzb3VyY2VQYXRoID0gJyc7XG4gIH1cblxuICBsZXQgbGlua1RleHQ6IHN0cmluZztcblxuICBpZiAodGFyZ2V0RmlsZS5wYXRoID09PSBzb3VyY2VQYXRoICYmIHN1YnBhdGggJiYgY29uZmlnLmlzU2luZ2xlU3VicGF0aEFsbG93ZWQpIHtcbiAgICBsaW5rVGV4dCA9ICcnO1xuICB9IGVsc2Uge1xuICAgIC8qIHY4IGlnbm9yZSBzdGFydCAtLSBBbGwgYnJhbmNoZXMgY292ZXJlZCBidXQgdjggcmVwb3J0cyBzd2l0Y2ggYXMgcGFydGlhbC4gKi9cbiAgICBzd2l0Y2ggKGNvbmZpZy5saW5rUGF0aFN0eWxlKSB7XG4gICAgICAvKiB2OCBpZ25vcmUgc3RvcCAqL1xuICAgICAgY2FzZSBGaW5hbExpbmtQYXRoU3R5bGUuQWJzb2x1dGVQYXRoSW5WYXVsdDoge1xuICAgICAgICBsaW5rVGV4dCA9IHRhcmdldEZpbGUucGF0aDtcbiAgICAgICAgaWYgKGNvbmZpZy5zaG91bGRVc2VMZWFkaW5nU2xhc2hGb3JBYnNvbHV0ZVBhdGhzICYmICFsaW5rVGV4dC5zdGFydHNXaXRoKCcvJykpIHtcbiAgICAgICAgICBsaW5rVGV4dCA9IGAvJHtsaW5rVGV4dH1gO1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgY2FzZSBGaW5hbExpbmtQYXRoU3R5bGUuUmVsYXRpdmVQYXRoVG9UaGVTb3VyY2U6IHtcbiAgICAgICAgbGlua1RleHQgPSByZWxhdGl2ZShkaXJuYW1lKHNvdXJjZVBhdGgpLCB0YXJnZXRGaWxlLnBhdGgpO1xuICAgICAgICBpZiAoY29uZmlnLnNob3VsZFVzZUxlYWRpbmdEb3RGb3JSZWxhdGl2ZVBhdGhzICYmICFsaW5rVGV4dC5zdGFydHNXaXRoKCcuJykpIHtcbiAgICAgICAgICBsaW5rVGV4dCA9IGAuLyR7bGlua1RleHR9YDtcbiAgICAgICAgfVxuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIGNhc2UgRmluYWxMaW5rUGF0aFN0eWxlLlNob3J0ZXN0UGF0aFdoZW5Qb3NzaWJsZToge1xuICAgICAgICBjb25zdCBzaG9ydGVzdE5hbWUgPSBpc01hcmtkb3duRmlsZSh0YXJnZXRGaWxlKSA/IHRhcmdldEZpbGUuYmFzZW5hbWUgOiB0YXJnZXRGaWxlLm5hbWU7XG4gICAgICAgIGNvbnN0IG1hdGNoZWRGaWxlcyA9IGFwcC5tZXRhZGF0YUNhY2hlLmdldExpbmtwYXRoRGVzdChzaG9ydGVzdE5hbWUsIHNvdXJjZVBhdGgpO1xuICAgICAgICBsaW5rVGV4dCA9IG1hdGNoZWRGaWxlcy5sZW5ndGggPT09IDEgJiYgbWF0Y2hlZEZpbGVzWzBdID09PSB0YXJnZXRGaWxlID8gdGFyZ2V0RmlsZS5uYW1lIDogdGFyZ2V0RmlsZS5wYXRoO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIC8qIHY4IGlnbm9yZSBzdGFydCAtLSBBbGwgdmFsaWQgRmluYWxMaW5rUGF0aFN0eWxlIHZhbHVlcyBhcmUgaGFuZGxlZCBhYm92ZS4gKi9cbiAgICAgIGRlZmF1bHQ6IHtcbiAgICAgICAgYXNzZXJ0TmV2ZXIoY29uZmlnLmxpbmtQYXRoU3R5bGUpO1xuICAgICAgfVxuICAgICAgICAvKiB2OCBpZ25vcmUgc3RvcCAqL1xuICAgIH1cbiAgfVxuXG4gIGxpbmtUZXh0ID0gY29uZmlnLmlzV2lraWxpbmtcbiAgICA/IHRyaW1FbmQoe1xuICAgICAgJHN0cmluZzogbGlua1RleHQsXG4gICAgICBzdWZmaXg6IGAuJHtNQVJLRE9XTl9GSUxFX0VYVEVOU0lPTn1gXG4gICAgfSlcbiAgICA6IGxpbmtUZXh0O1xuICBsaW5rVGV4dCArPSBzdWJwYXRoO1xuXG4gIHJldHVybiBsaW5rVGV4dDtcbn1cblxuZnVuY3Rpb24gZ2VuZXJhdGVNYXJrZG93bkxpbmtJbXBsKHBhcmFtczogR2VuZXJhdGVNYXJrZG93bkxpbmtQYXJhbXMpOiBzdHJpbmcge1xuICBjb25zdCB7IGFwcCB9ID0gcGFyYW1zO1xuICBjb25zdCB0YXJnZXRGaWxlID0gZ2V0RmlsZShub3JtYWxpemVPcHRpb25hbFByb3BlcnRpZXM8R2V0RmlsZVBhcmFtcz4oeyBhcHAsIHBhdGhPckZpbGU6IHBhcmFtcy50YXJnZXRQYXRoT3JGaWxlLCBzaG91bGRJbmNsdWRlTm9uRXhpc3Rpbmc6IHBhcmFtcy5pc05vbkV4aXN0aW5nRmlsZUFsbG93ZWQgfSkpO1xuICBjb25zdCBzb3VyY2VQYXRoID0gZ2V0UGF0aChhcHAsIHBhcmFtcy5zb3VyY2VQYXRoT3JGaWxlKTtcbiAgY29uc3Qgc3VicGF0aCA9IHBhcmFtcy5zdWJwYXRoID8/ICcnO1xuXG4gIGNvbnN0IGxpbmtDb25maWcgPSBnZXRMaW5rQ29uZmlnKHBhcmFtcyk7XG4gIGNvbnN0IGxpbmtUZXh0ID0gZ2VuZXJhdGVMaW5rVGV4dCh7XG4gICAgYXBwLFxuICAgIGNvbmZpZzogbGlua0NvbmZpZyxcbiAgICBzb3VyY2VQYXRoLFxuICAgIHN1YnBhdGgsXG4gICAgdGFyZ2V0RmlsZVxuICB9KTtcblxuICByZXR1cm4gbGlua0NvbmZpZy5pc1dpa2lsaW5rXG4gICAgPyBnZW5lcmF0ZVdpa2lMaW5rKHtcbiAgICAgIGFsaWFzOiBwYXJhbXMuYWxpYXMsXG4gICAgICBpc0VtYmVkOiBsaW5rQ29uZmlnLmlzRW1iZWQsXG4gICAgICBsaW5rVGV4dFxuICAgIH0pXG4gICAgOiBnZW5lcmF0ZU1hcmtkb3duU3R5bGVMaW5rKHtcbiAgICAgIGNvbmZpZzogbGlua0NvbmZpZyxcbiAgICAgIGxpbmtUZXh0LFxuICAgICAgbWFya2Rvd25MaW5rUGFyYW1zOiBwYXJhbXMsXG4gICAgICB0YXJnZXRGaWxlXG4gICAgfSk7XG59XG5cbmZ1bmN0aW9uIGdlbmVyYXRlTWFya2Rvd25TdHlsZUxpbmsocGFyYW1zOiBHZW5lcmF0ZU1hcmtkb3duU3R5bGVMaW5rUGFyYW1zKTogc3RyaW5nIHtcbiAgY29uc3QgeyBjb25maWcsIGxpbmtUZXh0LCBtYXJrZG93bkxpbmtQYXJhbXMsIHRhcmdldEZpbGUgfSA9IHBhcmFtcztcbiAgbGV0IGFsaWFzID0gbWFya2Rvd25MaW5rUGFyYW1zLmFsaWFzID8/ICcnO1xuICBsZXQgc2hvdWxkRXNjYXBlQWxpYXMgPSBtYXJrZG93bkxpbmtQYXJhbXMuc2hvdWxkRXNjYXBlQWxpYXMgPz8gZmFsc2U7XG4gIGlmICghYWxpYXMgJiYgKGlzTWFya2Rvd25GaWxlKHRhcmdldEZpbGUpIHx8ICFtYXJrZG93bkxpbmtQYXJhbXMuaXNFbXB0eUVtYmVkQWxpYXNBbGxvd2VkKSkge1xuICAgIGFsaWFzID0gIW1hcmtkb3duTGlua1BhcmFtcy5zaG91bGRJbmNsdWRlQXR0YWNobWVudEV4dGVuc2lvblRvRW1iZWRBbGlhcyB8fCBpc01hcmtkb3duRmlsZSh0YXJnZXRGaWxlKVxuICAgICAgPyB0YXJnZXRGaWxlLmJhc2VuYW1lXG4gICAgICA6IHRhcmdldEZpbGUubmFtZTtcbiAgICBzaG91bGRFc2NhcGVBbGlhcyA9IHRydWU7XG4gIH1cblxuICByZXR1cm4gZ2VuZXJhdGVSYXdNYXJrZG93bkxpbmsoe1xuICAgIGFsaWFzLFxuICAgIGlzRW1iZWQ6IGNvbmZpZy5pc0VtYmVkLFxuICAgIGlzV2lraWxpbms6IGZhbHNlLFxuICAgIHNob3VsZEVzY2FwZUFsaWFzLFxuICAgIHNob3VsZFVzZUFuZ2xlQnJhY2tldHM6IGNvbmZpZy5zaG91bGRVc2VBbmdsZUJyYWNrZXRzLFxuICAgIHVybDogbGlua1RleHRcbiAgfSk7XG59XG5cbmZ1bmN0aW9uIGdlbmVyYXRlV2lraUxpbmsocGFyYW1zOiBHZW5lcmF0ZVdpa2lMaW5rUGFyYW1zKTogc3RyaW5nIHtcbiAgY29uc3QgeyBhbGlhcywgaXNFbWJlZCwgbGlua1RleHQgfSA9IHBhcmFtcztcbiAgcmV0dXJuIGdlbmVyYXRlUmF3TWFya2Rvd25MaW5rKHtcbiAgICBpc0VtYmVkLFxuICAgIGlzV2lraWxpbms6IHRydWUsXG4gICAgLi4uKGFsaWFzPy50b0xvd2VyQ2FzZSgpID09PSBsaW5rVGV4dC50b0xvd2VyQ2FzZSgpXG4gICAgICA/IHsgdXJsOiBhbGlhcyB9XG4gICAgICA6IHtcbiAgICAgICAgYWxpYXMsXG4gICAgICAgIHVybDogbGlua1RleHRcbiAgICAgIH0pXG4gIH0pO1xufVxuXG5hc3luYyBmdW5jdGlvbiBnZXRGaWxlQ2hhbmdlcyhwYXJhbXM6IEdldEZpbGVDaGFuZ2VzUGFyYW1zKTogUHJvbWlzZTxGaWxlQ2hhbmdlW10+IHtcbiAgY29uc3Qge1xuICAgIGNhY2hlLFxuICAgIGlzQ2FudmFzRmlsZUNhY2hlLFxuICAgIGxpbmtDb252ZXJ0ZXIsXG4gICAgb2Zmc2V0UmFuZ2UsXG4gICAgc2hvdWxkSW5jbHVkZUV4dGVybmFsTGlua3MgPSBmYWxzZSxcbiAgICBzaG91bGRJbmNsdWRlRnJvbnRtYXR0ZXJFeHRlcm5hbExpbmtzID0gZmFsc2UsXG4gICAgc2hvdWxkSW5jbHVkZU11bHRpVmFsdWVGcm9udG1hdHRlckV4dGVybmFsTGlua3MgPSBmYWxzZVxuICB9ID0gcGFyYW1zO1xuICBsZXQgeyBhYm9ydFNpZ25hbCB9ID0gcGFyYW1zO1xuICBhYm9ydFNpZ25hbCA/Pz0gYWJvcnRTaWduYWxOZXZlcigpO1xuICBhYm9ydFNpZ25hbC50aHJvd0lmQWJvcnRlZCgpO1xuXG4gIGlmICghY2FjaGUpIHtcbiAgICByZXR1cm4gW107XG4gIH1cblxuICBjb25zdCBjaGFuZ2VzOiBGaWxlQ2hhbmdlW10gPSBbXTtcblxuICBjb25zdCB0YWJsZVBvc2l0aW9uczogVGFibGVQb3NpdGlvbltdID0gKGNhY2hlLnNlY3Rpb25zID8/IFtdKS5maWx0ZXIoKHNlY3Rpb24pID0+IHNlY3Rpb24udHlwZSA9PT0gJ3RhYmxlJykubWFwKChzZWN0aW9uKSA9PiAoe1xuICAgIGVuZDogc2VjdGlvbi5wb3NpdGlvbi5lbmQub2Zmc2V0LFxuICAgIHN0YXJ0OiBzZWN0aW9uLnBvc2l0aW9uLnN0YXJ0Lm9mZnNldFxuICB9KSk7XG5cbiAgY29uc3QgZ2V0RmlsZUNoYW5nZXNEZWJ1Z2dlciA9IGdldE9ic2lkaWFuTGliRGVidWdnZXIoJ0xpbms6Z2V0RmlsZUNoYW5nZXMnKTtcblxuICBmb3IgKGNvbnN0IGxpbmsgb2YgZ2V0TGlua3MoeyBjYWNoZSwgc2hvdWxkSW5jbHVkZUV4dGVybmFsTGlua3MsIHNob3VsZEluY2x1ZGVGcm9udG1hdHRlckV4dGVybmFsTGlua3MsIHNob3VsZEluY2x1ZGVNdWx0aVZhbHVlRnJvbnRtYXR0ZXJFeHRlcm5hbExpbmtzIH0pKSB7XG4gICAgYWJvcnRTaWduYWwudGhyb3dJZkFib3J0ZWQoKTtcblxuICAgIGlmIChvZmZzZXRSYW5nZSAhPT0gdW5kZWZpbmVkICYmICFpc1JlZmVyZW5jZUluT2Zmc2V0UmFuZ2UobGluaywgb2Zmc2V0UmFuZ2UpKSB7XG4gICAgICBnZXRGaWxlQ2hhbmdlc0RlYnVnZ2VyKFxuICAgICAgICBpc1JlZmVyZW5jZUNhY2hlKGxpbmspXG4gICAgICAgICAgPyAnU2tpcHBpbmcgYSBsaW5rIHRoYXQgaXMgbm90IGZ1bGx5IGNvbnRhaW5lZCBpbiB0aGUgb2Zmc2V0IHJhbmdlJ1xuICAgICAgICAgIDogJ1NraXBwaW5nIGEgbGluayB0aGF0IGNhcnJpZXMgbm8gcG9zaXRpb24gd2l0aGluIHRoZSBjb250ZW50LCBzbyBpdCBjYW4gbmV2ZXIgYmUgaW4gdGhlIG9mZnNldCByYW5nZScsXG4gICAgICAgIHsgbGluazogbGluay5vcmlnaW5hbCwgb2Zmc2V0UmFuZ2UgfVxuICAgICAgKTtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIGNvbnN0IG5ld0NvbnRlbnQgPSBhd2FpdCBsaW5rQ29udmVydGVyKGxpbmssIGFib3J0U2lnbmFsKTtcbiAgICBhYm9ydFNpZ25hbC50aHJvd0lmQWJvcnRlZCgpO1xuICAgIGlmIChuZXdDb250ZW50ID09PSB1bmRlZmluZWQpIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIGNvbnN0IGZpbGVDaGFuZ2UgPSByZWZlcmVuY2VUb0ZpbGVDaGFuZ2UobGluaywgbmV3Q29udGVudCk7XG5cbiAgICBpZiAoaXNDYW52YXNGaWxlQ2FjaGUpIHtcbiAgICAgIGlmIChpc0NhbnZhc0NoYW5nZShmaWxlQ2hhbmdlKSkge1xuICAgICAgICBjaGFuZ2VzLnB1c2goZmlsZUNoYW5nZSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zb2xlLmVycm9yKCdVbnN1cHBvcnRlZCBmaWxlIGNoYW5nZScsIGZpbGVDaGFuZ2UpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBpZiAoc2hvdWxkRXNjYXBlV2lraWxpbmtEaXZpZGVyKGZpbGVDaGFuZ2UsIHRhYmxlUG9zaXRpb25zKSkge1xuICAgICAgICBmaWxlQ2hhbmdlLm5ld0NvbnRlbnQgPSBmaWxlQ2hhbmdlLm5ld0NvbnRlbnQucmVwbGFjZUFsbChPUFRJT05BTExZX0VTQ0FQRURfV0lLSUxJTktfRElWSURFUl9SRUdFWFAsICgpID0+IEVTQ0FQRURfV0lLSUxJTktfRElWSURFUik7XG4gICAgICB9XG5cbiAgICAgIGNoYW5nZXMucHVzaChmaWxlQ2hhbmdlKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGNoYW5nZXM7XG59XG5cbmZ1bmN0aW9uIGdldEZpbmFsTGlua1BhdGhTdHlsZShhcHA6IEFwcCwgbGlua1BhdGhTdHlsZT86IExpbmtQYXRoU3R5bGUpOiBGaW5hbExpbmtQYXRoU3R5bGUge1xuICBjb25zdCByZXNvbHZlZFN0eWxlID0gbGlua1BhdGhTdHlsZSA/PyBMaW5rUGF0aFN0eWxlLk9ic2lkaWFuU2V0dGluZ3NEZWZhdWx0O1xuICBzd2l0Y2ggKHJlc29sdmVkU3R5bGUpIHtcbiAgICBjYXNlIExpbmtQYXRoU3R5bGUuQWJzb2x1dGVQYXRoSW5WYXVsdDoge1xuICAgICAgcmV0dXJuIEZpbmFsTGlua1BhdGhTdHlsZS5BYnNvbHV0ZVBhdGhJblZhdWx0O1xuICAgIH1cbiAgICBjYXNlIExpbmtQYXRoU3R5bGUuT2JzaWRpYW5TZXR0aW5nc0RlZmF1bHQ6IHtcbiAgICAgIHJldHVybiByZXNvbHZlRmluYWxMaW5rUGF0aFN0eWxlRnJvbU9ic2lkaWFuU2V0dGluZ3MoYXBwKTtcbiAgICB9XG4gICAgY2FzZSBMaW5rUGF0aFN0eWxlLlJlbGF0aXZlUGF0aFRvVGhlU291cmNlOiB7XG4gICAgICByZXR1cm4gRmluYWxMaW5rUGF0aFN0eWxlLlJlbGF0aXZlUGF0aFRvVGhlU291cmNlO1xuICAgIH1cbiAgICBjYXNlIExpbmtQYXRoU3R5bGUuU2hvcnRlc3RQYXRoV2hlblBvc3NpYmxlOiB7XG4gICAgICByZXR1cm4gRmluYWxMaW5rUGF0aFN0eWxlLlNob3J0ZXN0UGF0aFdoZW5Qb3NzaWJsZTtcbiAgICB9XG4gICAgZGVmYXVsdDoge1xuICAgICAgYXNzZXJ0TmV2ZXIocmVzb2x2ZWRTdHlsZSk7XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIGdldExpbmtDb25maWcocGFyYW1zOiBHZW5lcmF0ZU1hcmtkb3duTGlua1BhcmFtcyk6IExpbmtDb25maWcge1xuICBjb25zdCB7IGFwcCB9ID0gcGFyYW1zO1xuICByZXR1cm4ge1xuICAgIGlzRW1iZWQ6IHBhcmFtcy5pc0VtYmVkID8/IChwYXJhbXMub3JpZ2luYWxMaW5rID8gaGFzRW1iZWRTeW50YXgocGFyYW1zLm9yaWdpbmFsTGluaykgOiBmYWxzZSksXG4gICAgaXNTaW5nbGVTdWJwYXRoQWxsb3dlZDogcGFyYW1zLmlzU2luZ2xlU3VicGF0aEFsbG93ZWQgPz8gdHJ1ZSxcbiAgICBpc1dpa2lsaW5rOiBzaG91bGRVc2VXaWtpbGlua1N0eWxlKG5vcm1hbGl6ZU9wdGlvbmFsUHJvcGVydGllczxTaG91bGRVc2VXaWtpbGlua1N0eWxlUGFyYW1zPih7XG4gICAgICBhcHAsXG4gICAgICBsaW5rU3R5bGU6IHBhcmFtcy5saW5rU3R5bGUsXG4gICAgICBvcmlnaW5hbExpbms6IHBhcmFtcy5vcmlnaW5hbExpbmtcbiAgICB9KSksXG4gICAgbGlua1BhdGhTdHlsZTogZ2V0RmluYWxMaW5rUGF0aFN0eWxlKGFwcCwgcGFyYW1zLmxpbmtQYXRoU3R5bGUpLFxuICAgIHNob3VsZFVzZUFuZ2xlQnJhY2tldHM6IHBhcmFtcy5zaG91bGRVc2VBbmdsZUJyYWNrZXRzID8/IChwYXJhbXMub3JpZ2luYWxMaW5rID8gaGFzQW5nbGVCcmFja2V0cyhwYXJhbXMub3JpZ2luYWxMaW5rKSA6IHVuZGVmaW5lZCkgPz8gZmFsc2UsXG4gICAgc2hvdWxkVXNlTGVhZGluZ0RvdEZvclJlbGF0aXZlUGF0aHM6IHBhcmFtcy5zaG91bGRVc2VMZWFkaW5nRG90Rm9yUmVsYXRpdmVQYXRoc1xuICAgICAgPz8gKHBhcmFtcy5vcmlnaW5hbExpbmsgPyBoYXNMZWFkaW5nRG90KHBhcmFtcy5vcmlnaW5hbExpbmspIDogdW5kZWZpbmVkKSA/PyBmYWxzZSxcbiAgICBzaG91bGRVc2VMZWFkaW5nU2xhc2hGb3JBYnNvbHV0ZVBhdGhzOiBwYXJhbXMuc2hvdWxkVXNlTGVhZGluZ1NsYXNoRm9yQWJzb2x1dGVQYXRoc1xuICAgICAgPz8gKHBhcmFtcy5vcmlnaW5hbExpbmsgPyBoYXNMZWFkaW5nU2xhc2gocGFyYW1zLm9yaWdpbmFsTGluaykgOiB1bmRlZmluZWQpID8/IGZhbHNlXG4gIH07XG59XG5cbmZ1bmN0aW9uIGdldFVuZGVmaW5lZFBheWxvYWQoKTogdW5kZWZpbmVkIHtcbiAgLy8gQSBzaW5nbGUtdGFyZ2V0IHJld3JpdGUgaGFzIG5vdGhpbmcgdG8gcmVtZW1iZXIgcGVyIGxpbms6IHRoZSB0YXJnZXQgaXMgaW1wbGllZC5cbn1cblxuZnVuY3Rpb24gbm9ybWFsaXplRmlsZVVybExpbmsobGluazogUmVmZXJlbmNlLCBzaG91bGRVc2VBbmdsZUJyYWNrZXRzOiBib29sZWFuKTogTWF5YmVSZXR1cm48c3RyaW5nPiB7XG4gIGlmIChpc1BhcnNlTGlua0Zyb250bWF0dGVyUmVmZXJlbmNlKGxpbmspKSB7XG4gICAgLy8gQSBmcm9udG1hdHRlciB2YWx1ZSBob2xkcyBhIGJhcmUgVVJMIChyZS1zZXJpYWxpemVkL3F1b3RlZCBhcyBZQU1MKSwgbm90IGEgYFthbGlhc10odXJsKWAgbWFya2Rvd24gbGluay5cbiAgICByZXR1cm4gbGluay5wYXJzZUxpbmtSZXN1bHQuaXNGaWxlVXJsID8gbm9ybWFsaXplRmlsZVVybChsaW5rLnBhcnNlTGlua1Jlc3VsdC51cmwpIDogdW5kZWZpbmVkO1xuICB9XG5cbiAgaWYgKCFpc1BhcnNlTGlua1JlZmVyZW5jZShsaW5rKSkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGNvbnN0IHsgcGFyc2VMaW5rUmVzdWx0IH0gPSBsaW5rO1xuICByZXR1cm4gcGFyc2VMaW5rUmVzdWx0LmlzRmlsZVVybFxuICAgID8gZ2VuZXJhdGVSYXdNYXJrZG93bkxpbmsobm9ybWFsaXplT3B0aW9uYWxQcm9wZXJ0aWVzPEdlbmVyYXRlUmF3TWFya2Rvd25MaW5rUGFyYW1zPih7XG4gICAgICBhbGlhczogcGFyc2VMaW5rUmVzdWx0LmFsaWFzLFxuICAgICAgaXNFbWJlZDogcGFyc2VMaW5rUmVzdWx0LmlzRW1iZWQsXG4gICAgICBpc1dpa2lsaW5rOiBmYWxzZSxcbiAgICAgIHNob3VsZFVzZUFuZ2xlQnJhY2tldHMsXG4gICAgICB1cmw6IG5vcm1hbGl6ZUZpbGVVcmwocGFyc2VMaW5rUmVzdWx0LnVybClcbiAgICB9KSlcbiAgICA6IHVuZGVmaW5lZDtcbn1cblxuZnVuY3Rpb24gcmVzb2x2ZUZpbmFsTGlua1BhdGhTdHlsZUZyb21PYnNpZGlhblNldHRpbmdzKGFwcDogQXBwKTogRmluYWxMaW5rUGF0aFN0eWxlIHtcbiAgY29uc3QgbmV3TGlua0Zvcm1hdCA9IGdldE5ld0xpbmtGb3JtYXQoYXBwKTtcbiAgc3dpdGNoIChuZXdMaW5rRm9ybWF0KSB7XG4gICAgY2FzZSAnYWJzb2x1dGUnOiB7XG4gICAgICByZXR1cm4gRmluYWxMaW5rUGF0aFN0eWxlLkFic29sdXRlUGF0aEluVmF1bHQ7XG4gICAgfVxuICAgIGNhc2UgJ3JlbGF0aXZlJzoge1xuICAgICAgcmV0dXJuIEZpbmFsTGlua1BhdGhTdHlsZS5SZWxhdGl2ZVBhdGhUb1RoZVNvdXJjZTtcbiAgICB9XG4gICAgY2FzZSAnc2hvcnRlc3QnOiB7XG4gICAgICByZXR1cm4gRmluYWxMaW5rUGF0aFN0eWxlLlNob3J0ZXN0UGF0aFdoZW5Qb3NzaWJsZTtcbiAgICB9XG4gICAgZGVmYXVsdDoge1xuICAgICAgYXNzZXJ0TmV2ZXIobmV3TGlua0Zvcm1hdCk7XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIHJlc29sdmVTbmFwc2hvdExpbmtJZGVudGl0eUtleVByb3ZpZGVyKHBhcmFtczogUmVzb2x2ZVNuYXBzaG90TGlua0lkZW50aXR5S2V5UHJvdmlkZXJQYXJhbXMpOiAobGluazogUmVmZXJlbmNlKSA9PiBzdHJpbmcge1xuICBjb25zdCB7IGNhbGxlck5hbWUsIGV4cGxpY2l0TGlua0lkZW50aXR5S2V5UHJvdmlkZXIsIHNuYXBzaG90IH0gPSBwYXJhbXM7XG4gIGNvbnN0IHJlY29yZGVkTGlua0lkZW50aXR5S2V5UHJvdmlkZXIgPSBzbmFwc2hvdExpbmtJZGVudGl0eUtleVByb3ZpZGVycy5nZXQoc25hcHNob3QpO1xuICBpZiAoXG4gICAgZXhwbGljaXRMaW5rSWRlbnRpdHlLZXlQcm92aWRlciAmJiByZWNvcmRlZExpbmtJZGVudGl0eUtleVByb3ZpZGVyXG4gICAgJiYgZXhwbGljaXRMaW5rSWRlbnRpdHlLZXlQcm92aWRlciAhPT0gcmVjb3JkZWRMaW5rSWRlbnRpdHlLZXlQcm92aWRlclxuICApIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICBgJHtjYWxsZXJOYW1lfSB3YXMgcGFzc2VkIGEgbGlua0lkZW50aXR5S2V5UHJvdmlkZXIgdGhhdCBkaWZmZXJzIGZyb20gdGhlIG9uZSB0aGUgc25hcHNob3Qgd2FzIGJ1aWx0IHdpdGguIGBcbiAgICAgICAgKyAnVGhlIHNuYXBzaG90IGlzIGtleWVkIGJ5IHRoZSBvdGhlciwgc28gbm8gbGluayB3b3VsZCBtYXRjaC4gT21pdCB0aGUgcGFyYW1ldGVyIHRvIHVzZSB0aGUgc25hcHNob3RcXCdzIG93bi4nXG4gICAgKTtcbiAgfVxuICByZXR1cm4gZXhwbGljaXRMaW5rSWRlbnRpdHlLZXlQcm92aWRlciA/PyByZWNvcmRlZExpbmtJZGVudGl0eUtleVByb3ZpZGVyID8/IGRlZmF1bHRMaW5rSWRlbnRpdHlLZXlQcm92aWRlcjtcbn1cblxuZnVuY3Rpb24gc2hvdWxkRXNjYXBlV2lraWxpbmtEaXZpZGVyKGZpbGVDaGFuZ2U6IEZpbGVDaGFuZ2UsIHRhYmxlUG9zaXRpb25zOiBUYWJsZVBvc2l0aW9uW10pOiBib29sZWFuIHtcbiAgLyogdjggaWdub3JlIHN0YXJ0IC0tIGdldEZpbGVDaGFuZ2VzIG9ubHkgY2FsbHMgdGhpcyBmb3Igbm9uLWNhbnZhcyBmaWxlcyB3aGljaCBhbHdheXMgaGF2ZSBjb250ZW50IGNoYW5nZXMuICovXG4gIGlmICghaXNDb250ZW50Q2hhbmdlKGZpbGVDaGFuZ2UpKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIC8qIHY4IGlnbm9yZSBzdG9wICovXG5cbiAgcmV0dXJuIFVORVNDQVBFRF9XSUtJTElOS19ESVZJREVSX1JFR0VYUC50ZXN0KGZpbGVDaGFuZ2UubmV3Q29udGVudCkgJiYgdGFibGVQb3NpdGlvbnMuc29tZSgodGFibGVQb3NpdGlvbikgPT4gdGFibGVQb3NpdGlvbi5zdGFydCA8PSBmaWxlQ2hhbmdlLnJlZmVyZW5jZS5wb3NpdGlvbi5zdGFydC5vZmZzZXQgJiYgZmlsZUNoYW5nZS5yZWZlcmVuY2UucG9zaXRpb24uZW5kLm9mZnNldCA8PSB0YWJsZVBvc2l0aW9uLmVuZCk7XG59XG5cbmZ1bmN0aW9uIHNob3VsZFVzZVdpa2lsaW5rU3R5bGUocGFyYW1zOiBTaG91bGRVc2VXaWtpbGlua1N0eWxlUGFyYW1zKTogYm9vbGVhbiB7XG4gIGNvbnN0IHsgYXBwLCBsaW5rU3R5bGUsIG9yaWdpbmFsTGluayB9ID0gcGFyYW1zO1xuICBjb25zdCByZXNvbHZlZFN0eWxlID0gbGlua1N0eWxlID8/IExpbmtTdHlsZS5QcmVzZXJ2ZUV4aXN0aW5nO1xuICBzd2l0Y2ggKHJlc29sdmVkU3R5bGUpIHtcbiAgICBjYXNlIExpbmtTdHlsZS5NYXJrZG93bjoge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBjYXNlIExpbmtTdHlsZS5PYnNpZGlhblNldHRpbmdzRGVmYXVsdDoge1xuICAgICAgcmV0dXJuIHNob3VsZFVzZVdpa2lsaW5rcyhhcHApO1xuICAgIH1cbiAgICBjYXNlIExpbmtTdHlsZS5QcmVzZXJ2ZUV4aXN0aW5nOiB7XG4gICAgICByZXR1cm4gb3JpZ2luYWxMaW5rID09PSB1bmRlZmluZWQgPyBzaG91bGRVc2VXaWtpbGlua3MoYXBwKSA6IGhhc1dpa2lsaW5rU3ludGF4KG9yaWdpbmFsTGluayk7XG4gICAgfVxuICAgIGNhc2UgTGlua1N0eWxlLldpa2lsaW5rOiB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgZGVmYXVsdDoge1xuICAgICAgYXNzZXJ0TmV2ZXIocmVzb2x2ZWRTdHlsZSk7XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIHZhbGlkYXRlT2Zmc2V0UmFuZ2Uob2Zmc2V0UmFuZ2U6IE9mZnNldFJhbmdlKTogdm9pZCB7XG4gIGlmIChvZmZzZXRSYW5nZS5zdGFydE9mZnNldCA8IDApIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgb2Zmc2V0IHJhbmdlOiB0aGUgc3RhcnQgb2Zmc2V0ICR7U3RyaW5nKG9mZnNldFJhbmdlLnN0YXJ0T2Zmc2V0KX0gbXVzdCBub3QgYmUgbmVnYXRpdmUuYCk7XG4gIH1cblxuICBpZiAob2Zmc2V0UmFuZ2UuZW5kT2Zmc2V0IDwgb2Zmc2V0UmFuZ2Uuc3RhcnRPZmZzZXQpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgb2Zmc2V0IHJhbmdlOiB0aGUgZW5kIG9mZnNldCAke1N0cmluZyhvZmZzZXRSYW5nZS5lbmRPZmZzZXQpfSBtdXN0IG5vdCBiZSBsZXNzIHRoYW4gdGhlIHN0YXJ0IG9mZnNldCAke1N0cmluZyhvZmZzZXRSYW5nZS5zdGFydE9mZnNldCl9LmApO1xuICB9XG59XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FB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