@mnaoumov/typescript-dev-toolkit 3.8.0 → 3.9.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -522,9 +522,13 @@ function sidebarTreeToEntries(node, label) {
522
522
  return { collapsed: true, items, label };
523
523
  }
524
524
  function getApiIndexIntro(namespaces) {
525
- const { packageName } = (0, import_api_doc_settings.getApiDocSettings)();
525
+ const { packageName, publicApiEntry } = (0, import_api_doc_settings.getApiDocSettings)();
526
+ const intro = `The complete API reference for \`${packageName}\`, generated from its TSDoc. `;
527
+ if (publicApiEntry !== void 0) {
528
+ return `${intro}Every export is imported from the package root, \`${packageName}\`; the modules below group them by source module.`;
529
+ }
526
530
  const [exampleNamespace = "module"] = namespaces;
527
- return `The complete API reference for \`${packageName}\`, generated from its TSDoc. Each module below maps to an import subpath (e.g. the \`${exampleNamespace}\` module is \`${packageName}/${exampleNamespace}\`).`;
531
+ return `${intro}Each module below maps to an import subpath (e.g. the \`${exampleNamespace}\` module is \`${packageName}/${exampleNamespace}\`).`;
528
532
  }
529
533
  function getComponentImports(componentNames) {
530
534
  return componentNames.map((componentName) => `import ${componentName} from "${import_docs_site_assets.API_COMPONENTS_IMPORT_PREFIX}/${componentName}.astro";`);
@@ -561,4 +565,4 @@ function renderNamespaceTable(lines, heading, columnLabel, entries, allTypes, na
561
565
  renderVariablePage,
562
566
  sidebarTreeToEntries
563
567
  });
564
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9kb2NzLXNpdGUvYXBpLWRvYy1wYWdlLWdlbmVyYXRpb24udHMiXSwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAZmlsZVxuICpcbiAqIE1EWCBwYWdlICsgc2lkZWJhciBlbWlzc2lvbjogcmVuZGVycyBtb2R1bGUgaW5kZXggcGFnZXMsIHBlci10eXBlIG92ZXJ2aWV3IHBhZ2VzLCBwZXItbWVtYmVyIHBhZ2VzLFxuICogYmFja2xpbmtzLCBhbmQgdGhlIFN0YXJsaWdodCBzaWRlYmFyIEpTT04uXG4gKi9cblxuaW1wb3J0IHsgZ2V0TWFuZGF0b3J5TmFtZWRHcm91cCB9IGZyb20gJ0BtbmFvdW1vdi90eXBlc2NyaXB0LWxpYi9yZWctZXhwJztcbmltcG9ydCB7IGVuc3VyZU5vbk51bGxhYmxlIH0gZnJvbSAnQG1uYW91bW92L3R5cGVzY3JpcHQtbGliL3R5cGUtZ3VhcmRzJztcbmltcG9ydCB7IHdyaXRlRmlsZSB9IGZyb20gJ25vZGU6ZnMvcHJvbWlzZXMnO1xuaW1wb3J0IHsgam9pbiB9IGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCB0eXBlIHtcbiAgTWVtYmVySW5mbyxcbiAgUGFnZUNvbnRlbnQsXG4gIFBhZ2VGcm9udE1hdHRlcixcbiAgU2lkZWJhckVudHJ5LFxuICBTaWRlYmFyTGluayxcbiAgU2lkZWJhclRyZWVOb2RlLFxuICBUeXBlSW5mb1xufSBmcm9tICcuL2FwaS1kb2MtdHlwZXMudHMnO1xuXG5pbXBvcnQgeyBFVkVOVF9NRVRIT0RTIH0gZnJvbSAnLi9hcGktZG9jLWNvbnN0YW50cy50cyc7XG5pbXBvcnQge1xuICBsaW5rQmFzZVR5cGUsXG4gIG1hcmtkb3duVG9IdG1sLFxuICBtZW1iZXJIcmVmLFxuICByZW5kZXJFeGFtcGxlTWR4LFxuICByZW5kZXJNZHhQcm9zZSxcbiAgcmVuZGVyVHlwZVdpdGhMaW5rcyxcbiAgcmVzb2x2ZUxpbmtzLFxuICB0b1R5cGVGaWxlU2VnbWVudCxcbiAgdG9UeXBlUm91dGVTZWdtZW50LFxuICB0eXBlTGlua1xufSBmcm9tICcuL2FwaS1kb2MtbGluay1yZW5kZXJpbmcudHMnO1xuaW1wb3J0IHsgZ2V0QXBpRG9jU2V0dGluZ3MgfSBmcm9tICcuL2FwaS1kb2Mtc2V0dGluZ3MudHMnO1xuaW1wb3J0IHtcbiAgZW5zdXJlRGlyZWN0b3J5LFxuICBlc2NhcGVKc1N0cmluZyxcbiAgZXNjYXBlSnN4QXR0cmlidXRlLFxuICBlc2NhcGVNYXJrZG93bixcbiAgZXNjYXBlTWR4QW5nbGVCcmFja2V0cyxcbiAgZXNjYXBlTWR4QnJhY2VzLFxuICBlc2NhcGVNZHhQcm9zZSxcbiAgZXNjYXBlWWFtbCxcbiAgZ2V0RGlzcGxheU5hbWUsXG4gIGdldEltcG9ydFN0YXRlbWVudCxcbiAgZ2V0TmFtZXNwYWNlRGlyZWN0b3J5LFxuICBtZW1iZXJSb3V0ZVNlZ21lbnQsXG4gIG1lbWJlclNsdWcsXG4gIG92ZXJsb2FkUm91dGVTZWdtZW50LFxuICBvdmVybG9hZFNsdWcsXG4gIHN0cmlwTWFya2Rvd24sXG4gIHRydW5jYXRlU2lnbmF0dXJlXG59IGZyb20gJy4vYXBpLWRvYy10ZXh0LXV0aWxzLnRzJztcbmltcG9ydCB7IEFQSV9DT01QT05FTlRTX0lNUE9SVF9QUkVGSVggfSBmcm9tICcuL2RvY3Mtc2l0ZS1hc3NldHMudHMnO1xuXG5jb25zdCBKU09OX0lOREVOVCA9IDI7XG5cbi8qKlxuICogQXBwZW5kIGJhY2tsaW5rcyB0byBvdmVydmlldyBwYWdlcyBhbmQgd3JpdGUgYWxsIGZpbGVzLiBLZXllZCBieSBxdWFsaWZpZWQgYCR7bmFtZXNwYWNlfSMke25hbWV9YC5cbiAqXG4gKiBAcGFyYW0gcGFnZUNvbnRlbnRzIC0gRXZlcnkgb3ZlcnZpZXcgcGFnZSdzIGNvbnRlbnQgYW5kIHBhdGgsIGtleWVkIGJ5IHF1YWxpZmllZCBpZC5cbiAqIEBwYXJhbSBhbGxUeXBlcyAtIEV2ZXJ5IGRvY3VtZW50ZWQgdHlwZSwga2V5ZWQgYnkgYCR7bmFtZXNwYWNlfSMke25hbWV9YC5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGFwcGVuZEJhY2tsaW5rc0FuZFdyaXRlKFxuICBwYWdlQ29udGVudHM6IE1hcDxzdHJpbmcsIFBhZ2VDb250ZW50PixcbiAgYWxsVHlwZXM6IE1hcDxzdHJpbmcsIFR5cGVJbmZvPlxuKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IGJhY2tsaW5rcyA9IGJ1aWxkQmFja2xpbmtzRnJvbUNvbnRlbnQocGFnZUNvbnRlbnRzLCBhbGxUeXBlcyk7XG5cbiAgZm9yIChjb25zdCBba2V5LCB7IGNvbnRlbnQsIGZpbGVQYXRoIH1dIG9mIHBhZ2VDb250ZW50cykge1xuICAgIGNvbnN0IHR5cGVCYWNrbGlua3MgPSBiYWNrbGlua3MuZ2V0KGtleSkgPz8gW107XG4gICAgY29uc3QgbGluZXMgPSBbY29udGVudF07XG4gICAgaWYgKHR5cGVCYWNrbGlua3MubGVuZ3RoID4gMCkge1xuICAgICAgY29uc3Qgc29ydGVkQmFja2xpbmtzID0gWy4uLnR5cGVCYWNrbGlua3NdLnNvcnQoKGEsIGIpID0+IGEubG9jYWxlQ29tcGFyZShiKSk7XG4gICAgICBsaW5lcy5wdXNoKCcnLCAnLS0tJywgJycsICcqKkxpbmtzIHRvIHRoaXMgcGFnZToqKicsICcnKTtcbiAgICAgIGZvciAoY29uc3QgYmxLZXkgb2Ygc29ydGVkQmFja2xpbmtzKSB7XG4gICAgICAgIGNvbnN0IGJsSW5mbyA9IGVuc3VyZU5vbk51bGxhYmxlKGFsbFR5cGVzLmdldChibEtleSkpO1xuICAgICAgICBjb25zdCBibE5zRGlyZWN0b3J5ID0gZ2V0TmFtZXNwYWNlRGlyZWN0b3J5KGJsSW5mby5uYW1lc3BhY2UpO1xuICAgICAgICBsaW5lcy5wdXNoKGAtIFske2JsSW5mby5uYW1lfV0oJHtnZXRBcGlEb2NTZXR0aW5ncygpLmJhc2VQYXRofS9hcGkvJHtibE5zRGlyZWN0b3J5fS8ke3RvVHlwZVJvdXRlU2VnbWVudChibEluZm8ubmFtZXNwYWNlLCBibEluZm8ubmFtZSl9LylgKTtcbiAgICAgIH1cbiAgICB9XG4gICAgYXdhaXQgd3JpdGVGaWxlKGZpbGVQYXRoLCBsaW5lcy5qb2luKCdcXG4nKSwgJ3V0Zi04Jyk7XG4gIH1cbn1cblxuLyoqXG4gKiBCdWlsZCBiYWNrbGlua3MgYnkgc2Nhbm5pbmcgZ2VuZXJhdGVkIHBhZ2UgY29udGVudCBmb3IgaW50ZXJuYWwgQVBJIGxpbmtzLiBLZXllZCBieSBxdWFsaWZpZWQgaWQuXG4gKlxuICogQHBhcmFtIHBhZ2VDb250ZW50cyAtIEV2ZXJ5IG92ZXJ2aWV3IHBhZ2UncyBjb250ZW50IGFuZCBwYXRoLCBrZXllZCBieSBxdWFsaWZpZWQgaWQuXG4gKiBAcGFyYW0gYWxsVHlwZXMgLSBFdmVyeSBkb2N1bWVudGVkIHR5cGUsIGtleWVkIGJ5IGAke25hbWVzcGFjZX0jJHtuYW1lfWAuXG4gKiBAcmV0dXJucyBFYWNoIHJlZmVyZW5jZWQgdHlwZSdzIHF1YWxpZmllZCBpZCBtYXBwZWQgdG8gdGhlIGlkcyBvZiB0aGUgcGFnZXMgbGlua2luZyB0byBpdC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGJ1aWxkQmFja2xpbmtzRnJvbUNvbnRlbnQoXG4gIHBhZ2VDb250ZW50czogTWFwPHN0cmluZywgUGFnZUNvbnRlbnQ+LFxuICBhbGxUeXBlczogTWFwPHN0cmluZywgVHlwZUluZm8+XG4pOiBNYXA8c3RyaW5nLCBzdHJpbmdbXT4ge1xuICBjb25zdCBiYWNrbGlua3MgPSBuZXcgTWFwPHN0cmluZywgc3RyaW5nW10+KCk7XG4gIC8vIEVtaXR0ZWQgVVJMcyBsb3dlcmNhc2UgdGhlIHR5cGUgc2VnbWVudCAoc2VlIHRvUm91dGVTZWdtZW50KSwgc28gbWFwIGVhY2ggbG93ZXJjYXNlZCByb3V0ZVxuICAvLyBpZGVudGl0eSBiYWNrIHRvIGl0cyBvcmlnaW5hbCBxdWFsaWZpZWQgdHlwZSBrZXkuXG4gIGNvbnN0IHJvdXRlS2V5VG9UeXBlS2V5ID0gbmV3IE1hcDxzdHJpbmcsIHN0cmluZz4oKTtcbiAgZm9yIChjb25zdCBbdHlwZUtleSwgaW5mb10gb2YgYWxsVHlwZXMpIHtcbiAgICByb3V0ZUtleVRvVHlwZUtleS5zZXQoYCR7Z2V0TmFtZXNwYWNlRGlyZWN0b3J5KGluZm8ubmFtZXNwYWNlKX0jJHt0b1R5cGVSb3V0ZVNlZ21lbnQoaW5mby5uYW1lc3BhY2UsIGluZm8ubmFtZSl9YCwgdHlwZUtleSk7XG4gIH1cbiAgY29uc3QgZXNjYXBlZEJhc2UgPSBnZXRBcGlEb2NTZXR0aW5ncygpLmJhc2VQYXRoLnJlcGxhY2VBbGwoL1suKis/XiR7fSgpfFtcXF1cXFxcXS9nLCBTdHJpbmcucmF3YFxcJCZgKTtcbiAgY29uc3QgbGlua1BhdHRlcm4gPSBuZXcgUmVnRXhwKGAke2VzY2FwZWRCYXNlfS9hcGkvKD88cGF0aD4oPzpbYS16QS1aMC05X0AtXSsvKSspYCwgJ2cnKTtcbiAgZm9yIChjb25zdCBbc291cmNlS2V5LCB7IGNvbnRlbnQgfV0gb2YgcGFnZUNvbnRlbnRzKSB7XG4gICAgY29uc3QgcmVmZXJlbmNlZCA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuXG4gICAgZm9yIChjb25zdCBtYXRjaCBvZiBjb250ZW50Lm1hdGNoQWxsKGxpbmtQYXR0ZXJuKSkge1xuICAgICAgLy8gVGhlIHBhdHRlcm4gcmVxdWlyZXMgYXQgbGVhc3Qgb25lIHNlZ21lbnQuXG4gICAgICBjb25zdCBzZWdtZW50cyA9IGdldE1hbmRhdG9yeU5hbWVkR3JvdXAobWF0Y2gsICdwYXRoJykuc3BsaXQoJy8nKS5maWx0ZXIoQm9vbGVhbik7XG4gICAgICBjb25zdCB0eXBlTmFtZSA9IGVuc3VyZU5vbk51bGxhYmxlKHNlZ21lbnRzLmF0KC0xKSk7XG4gICAgICBjb25zdCBuYW1lc3BhY2UgPSBzZWdtZW50cy5zbGljZSgwLCAtMSkuam9pbignLycpO1xuICAgICAgY29uc3Qgcm91dGVLZXkgPSBgJHtuYW1lc3BhY2V9IyR7dHlwZU5hbWV9YDtcbiAgICAgIGNvbnN0IHJlc29sdmVkS2V5ID0gcm91dGVLZXlUb1R5cGVLZXkuZ2V0KHJvdXRlS2V5KTtcbiAgICAgIGlmIChyZXNvbHZlZEtleSAhPT0gdW5kZWZpbmVkICYmIHJlc29sdmVkS2V5ICE9PSBzb3VyY2VLZXkpIHtcbiAgICAgICAgcmVmZXJlbmNlZC5hZGQocmVzb2x2ZWRLZXkpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGZvciAoY29uc3QgcmVmZXJlbmNlIG9mIHJlZmVyZW5jZWQpIHtcbiAgICAgIGlmICghYmFja2xpbmtzLmhhcyhyZWZlcmVuY2UpKSB7XG4gICAgICAgIGJhY2tsaW5rcy5zZXQocmVmZXJlbmNlLCBbXSk7XG4gICAgICB9XG4gICAgICBiYWNrbGlua3MuZ2V0KHJlZmVyZW5jZSk/LnB1c2goc291cmNlS2V5KTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gYmFja2xpbmtzO1xufVxuXG4vKipcbiAqIEJ1aWxkcyB0aGUgbmFtZXNwYWNlIHRyZWUgdGhlIHNpZGViYXIgaXMgZ2VuZXJhdGVkIGZyb20uXG4gKlxuICogQHBhcmFtIHR5cGVzIC0gVGhlIGRvY3VtZW50ZWQgdHlwZXMsIGtleWVkIGJ5IHF1YWxpZmllZCBpZC5cbiAqIEByZXR1cm5zIFRoZSByb290IG9mIHRoZSB0cmVlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gYnVpbGRTaWRlYmFyVHJlZSh0eXBlczogTWFwPHN0cmluZywgVHlwZUluZm8+KTogU2lkZWJhclRyZWVOb2RlIHtcbiAgY29uc3Qgcm9vdDogU2lkZWJhclRyZWVOb2RlID0geyBjaGlsZHJlbjogbmV3IE1hcCgpLCB0eXBlczogW10gfTtcbiAgZm9yIChjb25zdCBbLCBpbmZvXSBvZiB0eXBlcykge1xuICAgIGNvbnN0IHBhcnRzID0gaW5mby5uYW1lc3BhY2Uuc3BsaXQoJy8nKTtcbiAgICBsZXQgbm9kZSA9IHJvb3Q7XG4gICAgZm9yIChjb25zdCBwYXJ0IG9mIHBhcnRzKSB7XG4gICAgICBsZXQgY2hpbGQgPSBub2RlLmNoaWxkcmVuLmdldChwYXJ0KTtcbiAgICAgIGlmICghY2hpbGQpIHtcbiAgICAgICAgY2hpbGQgPSB7IGNoaWxkcmVuOiBuZXcgTWFwKCksIHR5cGVzOiBbXSB9O1xuICAgICAgICBub2RlLmNoaWxkcmVuLnNldChwYXJ0LCBjaGlsZCk7XG4gICAgICB9XG4gICAgICBub2RlID0gY2hpbGQ7XG4gICAgfVxuICAgIG5vZGUudHlwZXMucHVzaChpbmZvKTtcbiAgfVxuICByZXR1cm4gcm9vdDtcbn1cblxuLyoqXG4gKiBUaGUgcmF3IGNvZGUgc2lnbmF0dXJlIHNob3duIG9uIGEgdHlwZS1vdmVydmlldyBwYWdlJ3MgT0cgY2FyZCwgZm9yIHRoZSBraW5kcyB0aGF0IHJlbmRlciBhIHNpbmdsZVxuICogc2lnbmF0dXJlIGxpbmUgKGZ1bmN0aW9uIC8gdHlwZSBhbGlhcyAvIHZhcmlhYmxlKS4gQ2xhc3NlcywgaW50ZXJmYWNlcyBhbmQgZW51bXMgcmVuZGVyIG1lbWJlclxuICogdGFibGVzIGluc3RlYWQsIHNvIHRoZXkgZ2V0IG5vIHNpZ25hdHVyZSBibG9jay5cbiAqXG4gKiBAcGFyYW0gbmFtZSAtIFRoZSB0eXBlJ3MgbmFtZS5cbiAqIEBwYXJhbSBpbmZvIC0gVGhlIGRvY3VtZW50ZWQgdHlwZS5cbiAqIEByZXR1cm5zIFRoZSBzaWduYXR1cmUsIG9yIGB1bmRlZmluZWRgIGZvciBhIGtpbmQgdGhhdCByZW5kZXJzIG1lbWJlciB0YWJsZXMgaW5zdGVhZC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNvbXB1dGVPdmVydmlld1NpZ25hdHVyZShuYW1lOiBzdHJpbmcsIGluZm86IFR5cGVJbmZvKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgaWYgKGluZm8ua2luZCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIGNvbnN0ICRmdW5jdGlvbiA9IGluZm8ubWV0aG9kc1swXTtcbiAgICByZXR1cm4gJGZ1bmN0aW9uID8gYGZ1bmN0aW9uICR7JGZ1bmN0aW9uLnNpZ25hdHVyZX06ICR7JGZ1bmN0aW9uLnJldHVyblR5cGV9YCA6IHVuZGVmaW5lZDtcbiAgfVxuICBpZiAoaW5mby5raW5kID09PSAndHlwZScpIHtcbiAgICByZXR1cm4gYHR5cGUgJHtnZXREaXNwbGF5TmFtZShpbmZvLm5hbWUsIGluZm8pfSA9ICR7aW5mby50eXBlQWxpYXNUZXh0ID8/ICd1bmtub3duJ31gO1xuICB9XG4gIHJldHVybiBpbmZvLmtpbmQgPT09ICd2YXJpYWJsZScgPyBgJHtpbmZvLnZhcmlhYmxlS2V5d29yZCA/PyAnbGV0J30gJHtuYW1lfTogJHtpbmZvLnZhcmlhYmxlVHlwZSA/PyAndW5rbm93bid9YCA6IHVuZGVmaW5lZDtcbn1cblxuLyoqXG4gKiBXcml0ZXMgb25lIHBhZ2UgcGVyIG93biBwcm9wZXJ0eSBhbmQgcGVyIG93biBtZXRob2Qgb3ZlcmxvYWQga2V5IG9mIGEgY2xhc3Mgb3IgaW50ZXJmYWNlLlxuICpcbiAqIEBwYXJhbSBuYW1lIC0gVGhlIHR5cGUncyBuYW1lLlxuICogQHBhcmFtIGluZm8gLSBUaGUgZG9jdW1lbnRlZCB0eXBlLlxuICogQHBhcmFtIGFsbFR5cGVzIC0gRXZlcnkgZG9jdW1lbnRlZCB0eXBlLCBrZXllZCBieSBgJHtuYW1lc3BhY2V9IyR7bmFtZX1gLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVNZW1iZXJQYWdlcyhuYW1lOiBzdHJpbmcsIGluZm86IFR5cGVJbmZvLCBhbGxUeXBlczogTWFwPHN0cmluZywgVHlwZUluZm8+KTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IG5zRGlyZWN0b3J5ID0gZ2V0TmFtZXNwYWNlRGlyZWN0b3J5KGluZm8ubmFtZXNwYWNlKTtcbiAgY29uc3QgdHlwZUZpbGVEaXJlY3RvcnkgPSB0b1R5cGVGaWxlU2VnbWVudChpbmZvLm5hbWVzcGFjZSwgbmFtZSk7XG4gIGNvbnN0IHR5cGVSb3V0ZURpcmVjdG9yeSA9IHRvVHlwZVJvdXRlU2VnbWVudChpbmZvLm5hbWVzcGFjZSwgbmFtZSk7XG4gIGNvbnN0IGNvbXBvbmVudEltcG9ydHMgPSBnZXRDb21wb25lbnRJbXBvcnRzKFsnTWVtYmVyRGV0YWlsJ10pO1xuXG4gIC8vIFByb3BlcnR5IHBhZ2VzIChza2lwIGluaGVyaXRlZCDigJQgdGhleSBsaXZlIG9uIHRoZSBwYXJlbnQgdHlwZSlcbiAgY29uc3QgcHJvcGVydGllcyA9IGluZm8ucHJvcGVydGllcy5maWx0ZXIoKHApID0+ICFwLmluaGVyaXRlZEZyb20pO1xuICBmb3IgKGNvbnN0IHByb3BlcnR5IG9mIHByb3BlcnRpZXMpIHtcbiAgICBjb25zdCBmaWxlUGF0aCA9IGpvaW4oZ2V0QXBpRG9jU2V0dGluZ3MoKS5vdXRwdXREaXJlY3RvcnksIG5zRGlyZWN0b3J5LCB0eXBlRmlsZURpcmVjdG9yeSwgYCR7bWVtYmVyU2x1Zyhwcm9wZXJ0eS5uYW1lKX0ubWR4YCk7XG4gICAgYXdhaXQgZW5zdXJlRGlyZWN0b3J5KGZpbGVQYXRoKTtcblxuICAgIGNvbnN0IHByb3BlcnR5VGl0bGUgPSBgJHtuYW1lfS4ke3Byb3BlcnR5Lm5hbWV9YDtcbiAgICBjb25zdCBsaW5lczogc3RyaW5nW10gPSByZW5kZXJGcm9udE1hdHRlcih7XG4gICAgICBkZXNjcmlwdGlvbjogcHJvcGVydHkuZGVzY3JpcHRpb24sXG4gICAgICBzaWRlYmFyTGFiZWw6IHByb3BlcnR5VGl0bGUsXG4gICAgICBzaWduYXR1cmU6IGAke3Byb3BlcnR5LnNpZ25hdHVyZX06ICR7cHJvcGVydHkudHlwZX1gLFxuICAgICAgc2x1ZzogYGFwaS8ke25zRGlyZWN0b3J5fS8ke3R5cGVSb3V0ZURpcmVjdG9yeX0vJHttZW1iZXJSb3V0ZVNlZ21lbnQocHJvcGVydHkubmFtZSl9YCxcbiAgICAgIHRpdGxlOiBwcm9wZXJ0eVRpdGxlXG4gICAgfSk7XG4gICAgbGluZXMucHVzaChcbiAgICAgIC4uLmNvbXBvbmVudEltcG9ydHMsXG4gICAgICAnJyxcbiAgICAgIC8vIEJyZWFkY3J1bWJcbiAgICAgIGBbJHtuYW1lfV0oJHtnZXRBcGlEb2NTZXR0aW5ncygpLmJhc2VQYXRofS9hcGkvJHtuc0RpcmVjdG9yeX0vJHt0eXBlUm91dGVEaXJlY3Rvcnl9Lykg4oC6ICR7cHJvcGVydHkubmFtZX1gLFxuICAgICAgJydcbiAgICApO1xuXG4gICAgY29uc3Qgc3RhdGljQXR0cmlidXRlID0gcHJvcGVydHkuaXNTdGF0aWMgPyAnIGlzU3RhdGljPXt0cnVlfScgOiAnJztcbiAgICBjb25zdCB0eXBlQXR0cmlidXRlID0gYCB0eXBlPVwiJHtlc2NhcGVKc3hBdHRyaWJ1dGUobWFya2Rvd25Ub0h0bWwocmVuZGVyVHlwZVdpdGhMaW5rcyhwcm9wZXJ0eS50eXBlLCBhbGxUeXBlcywgbmFtZSwgaW5mby5uYW1lc3BhY2UpKSl9XCJgO1xuICAgIGNvbnN0IGRlc2NBdHRyaWJ1dGUgPSBwcm9wZXJ0eS5kZXNjcmlwdGlvbiA/IGAgZGVzY3JpcHRpb249XCIke2VzY2FwZUpzeEF0dHJpYnV0ZShtYXJrZG93blRvSHRtbChyZXNvbHZlTGlua3MocHJvcGVydHkuZGVzY3JpcHRpb24sIGFsbFR5cGVzLCBpbmZvLm5hbWVzcGFjZSkpKX1cImAgOiAnJztcbiAgICBjb25zdCByZW1hcmtzQXR0cmlidXRlID0gcHJvcGVydHkucmVtYXJrcyA/IGAgcmVtYXJrcz1cIiR7ZXNjYXBlSnN4QXR0cmlidXRlKG1hcmtkb3duVG9IdG1sKHJlc29sdmVMaW5rcyhwcm9wZXJ0eS5yZW1hcmtzLCBhbGxUeXBlcywgaW5mby5uYW1lc3BhY2UpKSl9XCJgIDogJyc7XG4gICAgY29uc3Qgc2luY2VBdHRyaWJ1dGUgPSBwcm9wZXJ0eS5zaW5jZSA/IGAgc2luY2U9XCIke2VzY2FwZUpzeEF0dHJpYnV0ZShwcm9wZXJ0eS5zaW5jZSl9XCJgIDogJyc7XG4gICAgY29uc3QgZXhhbXBsZXNBdHRyaWJ1dGUgPSBwcm9wZXJ0eS5leGFtcGxlcy5sZW5ndGggPiAwID8gYCBleGFtcGxlcz17JHtKU09OLnN0cmluZ2lmeShwcm9wZXJ0eS5leGFtcGxlcyl9fWAgOiAnJztcblxuICAgIGxpbmVzLnB1c2goYDxNZW1iZXJEZXRhaWwke3N0YXRpY0F0dHJpYnV0ZX0ke3R5cGVBdHRyaWJ1dGV9JHtkZXNjQXR0cmlidXRlfSR7cmVtYXJrc0F0dHJpYnV0ZX0ke3NpbmNlQXR0cmlidXRlfSR7ZXhhbXBsZXNBdHRyaWJ1dGV9IC8+YCwgJycpO1xuXG4gICAgYXdhaXQgd3JpdGVGaWxlKGZpbGVQYXRoLCBsaW5lcy5qb2luKCdcXG4nKSwgJ3V0Zi04Jyk7XG4gIH1cblxuICAvLyBNZXRob2QgcGFnZXMg4oCUIGVhY2ggb3ZlcmxvYWQga2V5IGdldHMgaXRzIG93biBwYWdlIChza2lwIGluaGVyaXRlZClcbiAgY29uc3QgbWV0aG9kcyA9IGluZm8ubWV0aG9kcy5maWx0ZXIoKG0pID0+ICFtLmluaGVyaXRlZEZyb20pO1xuICBjb25zdCBvdmVybG9hZEdyb3VwcyA9IG5ldyBNYXA8c3RyaW5nLCBNZW1iZXJJbmZvW10+KCk7XG4gIGZvciAoY29uc3QgbWV0aG9kIG9mIG1ldGhvZHMpIHtcbiAgICBjb25zdCBrZXkgPSBtZXRob2Qub3ZlcmxvYWRLZXk7XG4gICAgaWYgKCFvdmVybG9hZEdyb3Vwcy5oYXMoa2V5KSkge1xuICAgICAgb3ZlcmxvYWRHcm91cHMuc2V0KGtleSwgW10pO1xuICAgIH1cbiAgICBvdmVybG9hZEdyb3Vwcy5nZXQoa2V5KT8ucHVzaChtZXRob2QpO1xuICB9XG5cbiAgZm9yIChjb25zdCBbb3ZlcmxvYWRLZXksIG92ZXJsb2Fkc10gb2Ygb3ZlcmxvYWRHcm91cHMpIHtcbiAgICBjb25zdCBmaWxlU2x1ZyA9IG92ZXJsb2FkU2x1ZyhvdmVybG9hZEtleSk7XG4gICAgY29uc3QgZmlsZVBhdGggPSBqb2luKGdldEFwaURvY1NldHRpbmdzKCkub3V0cHV0RGlyZWN0b3J5LCBuc0RpcmVjdG9yeSwgdHlwZUZpbGVEaXJlY3RvcnksIGAke2ZpbGVTbHVnfS5tZHhgKTtcbiAgICBhd2FpdCBlbnN1cmVEaXJlY3RvcnkoZmlsZVBhdGgpO1xuXG4gICAgY29uc3QgZGlzcGxheU5hbWUgPSBgJHtuYW1lfS4ke292ZXJsb2FkS2V5fSBtZXRob2RgO1xuICAgIC8vIEEgZ3JvdXAgaXMgY3JlYXRlZCBieSBpdHMgZmlyc3Qgb3ZlcmxvYWQuXG4gICAgY29uc3QgZmlyc3RPdmVybG9hZCA9IGVuc3VyZU5vbk51bGxhYmxlKG92ZXJsb2Fkc1swXSk7XG5cbiAgICBjb25zdCBsaW5lczogc3RyaW5nW10gPSByZW5kZXJGcm9udE1hdHRlcih7XG4gICAgICBkZXNjcmlwdGlvbjogZmlyc3RPdmVybG9hZC5kZXNjcmlwdGlvbixcbiAgICAgIHNpZGViYXJMYWJlbDogYCR7bmFtZX0uJHtvdmVybG9hZEtleX1gLFxuICAgICAgc2lnbmF0dXJlOiBgJHtmaXJzdE92ZXJsb2FkLnNpZ25hdHVyZX06ICR7Zmlyc3RPdmVybG9hZC5yZXR1cm5UeXBlfWAsXG4gICAgICBzbHVnOiBgYXBpLyR7bnNEaXJlY3Rvcnl9LyR7dHlwZVJvdXRlRGlyZWN0b3J5fS8ke292ZXJsb2FkUm91dGVTZWdtZW50KG92ZXJsb2FkS2V5KX1gLFxuICAgICAgdGl0bGU6IGRpc3BsYXlOYW1lXG4gICAgfSk7XG4gICAgbGluZXMucHVzaChcbiAgICAgIC4uLmNvbXBvbmVudEltcG9ydHMsXG4gICAgICAnJyxcbiAgICAgIC8vIEJyZWFkY3J1bWJcbiAgICAgIGBbJHtuYW1lfV0oJHtnZXRBcGlEb2NTZXR0aW5ncygpLmJhc2VQYXRofS9hcGkvJHtuc0RpcmVjdG9yeX0vJHt0eXBlUm91dGVEaXJlY3Rvcnl9Lykg4oC6ICR7b3ZlcmxvYWRLZXl9YCxcbiAgICAgICcnXG4gICAgKTtcblxuICAgIGZvciAoY29uc3Qgb3ZlcmxvYWQgb2Ygb3ZlcmxvYWRzKSB7XG4gICAgICByZW5kZXJNZXRob2RPdmVybG9hZE1keChsaW5lcywgb3ZlcmxvYWQsIG5hbWUsIGluZm8ubmFtZXNwYWNlLCBhbGxUeXBlcyk7XG4gICAgICBpZiAob3ZlcmxvYWRzLmxlbmd0aCA+IDEpIHtcbiAgICAgICAgbGluZXMucHVzaCgnLS0tJywgJycpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGF3YWl0IHdyaXRlRmlsZShmaWxlUGF0aCwgbGluZXMuam9pbignXFxuJyksICd1dGYtOCcpO1xuICB9XG59XG5cbi8qKlxuICogV3JpdGVzIGVhY2ggbW9kdWxlJ3MgaW5kZXggcGFnZSBhbmQgdGhlIHJvb3QgQVBJIGluZGV4LlxuICpcbiAqIEBwYXJhbSB0eXBlcyAtIFRoZSBkb2N1bWVudGVkIHR5cGVzLCBrZXllZCBieSBxdWFsaWZpZWQgaWQuXG4gKiBAcGFyYW0gYWxsVHlwZXMgLSBFdmVyeSBkb2N1bWVudGVkIHR5cGUsIGtleWVkIGJ5IGAke25hbWVzcGFjZX0jJHtuYW1lfWAuXG4gKiBAcGFyYW0gbW9kdWxlT3ZlcnZpZXdzIC0gRWFjaCBuYW1lc3BhY2UncyBgQGZpbGVgIG92ZXJ2aWV3LlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVOYW1lc3BhY2VJbmRleFBhZ2VzKFxuICB0eXBlczogTWFwPHN0cmluZywgVHlwZUluZm8+LFxuICBhbGxUeXBlczogTWFwPHN0cmluZywgVHlwZUluZm8+LFxuICBtb2R1bGVPdmVydmlld3M6IE1hcDxzdHJpbmcsIHN0cmluZz5cbik6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCBuYW1lc3BhY2VzID0gbmV3IE1hcDxzdHJpbmcsIFR5cGVJbmZvW10+KCk7XG4gIGZvciAoY29uc3QgWywgaW5mb10gb2YgdHlwZXMpIHtcbiAgICBpZiAoIW5hbWVzcGFjZXMuaGFzKGluZm8ubmFtZXNwYWNlKSkge1xuICAgICAgbmFtZXNwYWNlcy5zZXQoaW5mby5uYW1lc3BhY2UsIFtdKTtcbiAgICB9XG4gICAgbmFtZXNwYWNlcy5nZXQoaW5mby5uYW1lc3BhY2UpPy5wdXNoKGluZm8pO1xuICB9XG5cbiAgZm9yIChjb25zdCBbbmFtZXNwYWNlLCBuc1R5cGVzXSBvZiBuYW1lc3BhY2VzKSB7XG4gICAgY29uc3QgbnNEaXJlY3RvcnkgPSBnZXROYW1lc3BhY2VEaXJlY3RvcnkobmFtZXNwYWNlKTtcbiAgICBjb25zdCBmaWxlUGF0aCA9IGpvaW4oZ2V0QXBpRG9jU2V0dGluZ3MoKS5vdXRwdXREaXJlY3RvcnksIG5zRGlyZWN0b3J5LCAnaW5kZXgubWR4Jyk7XG4gICAgYXdhaXQgZW5zdXJlRGlyZWN0b3J5KGZpbGVQYXRoKTtcblxuICAgIC8vIFRoZSBtb2R1bGUncyBgQGZpbGVgIHRleHQgZG91YmxlcyBhcyBpdHMgZGVzY3JpcHRpb24uXG4gICAgLy8gV2l0aG91dCBpdCB0aGUgbW9kdWxlIGNhcmQgd2FzIHRpdGxlLW9ubHkgd2hpbGUgZXZlcnkgbWVtYmVyIGNhcmQgdW5kZXIgaXQgY2FycmllZCBvbmUuXG4gICAgY29uc3Qgb3ZlcnZpZXcgPSBtb2R1bGVPdmVydmlld3MuZ2V0KG5hbWVzcGFjZSk7XG4gICAgY29uc3QgbGluZXM6IHN0cmluZ1tdID0gcmVuZGVyRnJvbnRNYXR0ZXIoe1xuICAgICAgZGVzY3JpcHRpb246IG92ZXJ2aWV3LFxuICAgICAgc2lkZWJhckxhYmVsOiBuYW1lc3BhY2UsXG4gICAgICBzbHVnOiBgYXBpLyR7bnNEaXJlY3Rvcnl9YCxcbiAgICAgIHRpdGxlOiBuYW1lc3BhY2VcbiAgICB9KTtcblxuICAgIC8vIE1vZHVsZSBAZmlsZSBvdmVydmlldyB0ZXh0XG4gICAgaWYgKG92ZXJ2aWV3KSB7XG4gICAgICBsaW5lcy5wdXNoKHJlbmRlck1keFByb3NlKG92ZXJ2aWV3LCBhbGxUeXBlcywgbmFtZXNwYWNlKSwgJycpO1xuICAgIH1cblxuICAgIHJlbmRlck5hbWVzcGFjZVRhYmxlKGxpbmVzLCAnQ2xhc3NlcycsICdDbGFzcycsIG5zVHlwZXMuZmlsdGVyKCh0KSA9PiB0LmtpbmQgPT09ICdjbGFzcycpLCBhbGxUeXBlcywgbmFtZXNwYWNlKTtcbiAgICByZW5kZXJOYW1lc3BhY2VUYWJsZShsaW5lcywgJ0ludGVyZmFjZXMnLCAnSW50ZXJmYWNlJywgbnNUeXBlcy5maWx0ZXIoKHQpID0+IHQua2luZCA9PT0gJ2ludGVyZmFjZScpLCBhbGxUeXBlcywgbmFtZXNwYWNlKTtcbiAgICByZW5kZXJOYW1lc3BhY2VUYWJsZShsaW5lcywgJ0Z1bmN0aW9ucycsICdGdW5jdGlvbicsIG5zVHlwZXMuZmlsdGVyKCh0KSA9PiB0LmtpbmQgPT09ICdmdW5jdGlvbicpLCBhbGxUeXBlcywgbmFtZXNwYWNlKTtcbiAgICByZW5kZXJOYW1lc3BhY2VUYWJsZShsaW5lcywgJ1R5cGVzJywgJ1R5cGUnLCBuc1R5cGVzLmZpbHRlcigodCkgPT4gdC5raW5kID09PSAndHlwZScpLCBhbGxUeXBlcywgbmFtZXNwYWNlKTtcbiAgICByZW5kZXJOYW1lc3BhY2VUYWJsZShsaW5lcywgJ0VudW1zJywgJ0VudW0nLCBuc1R5cGVzLmZpbHRlcigodCkgPT4gdC5raW5kID09PSAnZW51bScpLCBhbGxUeXBlcywgbmFtZXNwYWNlKTtcbiAgICByZW5kZXJOYW1lc3BhY2VUYWJsZShsaW5lcywgJ1ZhcmlhYmxlcycsICdWYXJpYWJsZScsIG5zVHlwZXMuZmlsdGVyKCh0KSA9PiB0LmtpbmQgPT09ICd2YXJpYWJsZScpLCBhbGxUeXBlcywgbmFtZXNwYWNlKTtcblxuICAgIGF3YWl0IHdyaXRlRmlsZShmaWxlUGF0aCwgbGluZXMuam9pbignXFxuJyksICd1dGYtOCcpO1xuICB9XG5cbiAgLy8gUm9vdCBBUEkgaW5kZXggcGFnZSBsaXN0aW5nIGV2ZXJ5IG1vZHVsZS5cbiAgY29uc3Qgc29ydGVkTmFtZXNwYWNlcyA9IFsuLi5uYW1lc3BhY2VzLmtleXMoKV0uc29ydCgoYSwgYikgPT4gYS5sb2NhbGVDb21wYXJlKGIpKTtcbiAgY29uc3QgYXBpSW5kZXhJbnRybyA9IGdldEFwaUluZGV4SW50cm8oc29ydGVkTmFtZXNwYWNlcyk7XG4gIGNvbnN0IHJvb3RMaW5lczogc3RyaW5nW10gPSByZW5kZXJGcm9udE1hdHRlcih7XG4gICAgZGVzY3JpcHRpb246IGFwaUluZGV4SW50cm8sXG4gICAgc2lkZWJhckxhYmVsOiAnT3ZlcnZpZXcnLFxuICAgIHNsdWc6ICdhcGknLFxuICAgIHRpdGxlOiAnQVBJIHJlZmVyZW5jZSdcbiAgfSk7XG4gIHJvb3RMaW5lcy5wdXNoKGFwaUluZGV4SW50cm8sICcnLCAnIyMgTW9kdWxlcycsICcnKTtcbiAgZm9yIChjb25zdCBuYW1lc3BhY2Ugb2Ygc29ydGVkTmFtZXNwYWNlcykge1xuICAgIHJvb3RMaW5lcy5wdXNoKGAtIFske25hbWVzcGFjZX1dKCR7Z2V0QXBpRG9jU2V0dGluZ3MoKS5iYXNlUGF0aH0vYXBpLyR7Z2V0TmFtZXNwYWNlRGlyZWN0b3J5KG5hbWVzcGFjZSl9LylgKTtcbiAgfVxuICByb290TGluZXMucHVzaCgnJyk7XG4gIGNvbnN0IHJvb3RGaWxlUGF0aCA9IGpvaW4oZ2V0QXBpRG9jU2V0dGluZ3MoKS5vdXRwdXREaXJlY3RvcnksICdpbmRleC5tZHgnKTtcbiAgYXdhaXQgZW5zdXJlRGlyZWN0b3J5KHJvb3RGaWxlUGF0aCk7XG4gIGF3YWl0IHdyaXRlRmlsZShyb290RmlsZVBhdGgsIHJvb3RMaW5lcy5qb2luKCdcXG4nKSwgJ3V0Zi04Jyk7XG59XG5cbi8qKlxuICogUmVuZGVycyBhIHR5cGUncyBvdmVydmlldyBwYWdlLlxuICpcbiAqIEBwYXJhbSBuYW1lIC0gVGhlIHR5cGUncyBuYW1lLlxuICogQHBhcmFtIGluZm8gLSBUaGUgZG9jdW1lbnRlZCB0eXBlLlxuICogQHBhcmFtIGFsbFR5cGVzIC0gRXZlcnkgZG9jdW1lbnRlZCB0eXBlLCBrZXllZCBieSBgJHtuYW1lc3BhY2V9IyR7bmFtZX1gLlxuICogQHJldHVybnMgVGhlIHBhZ2UncyBjb250ZW50LCBiZWZvcmUgYmFja2xpbmtzLCBhbmQgdGhlIHBhdGggaXQgaXMgd3JpdHRlbiB0by5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdlbmVyYXRlT3ZlcnZpZXdQYWdlKG5hbWU6IHN0cmluZywgaW5mbzogVHlwZUluZm8sIGFsbFR5cGVzOiBNYXA8c3RyaW5nLCBUeXBlSW5mbz4pOiBQcm9taXNlPFBhZ2VDb250ZW50PiB7XG4gIGNvbnN0IG5zRGlyZWN0b3J5ID0gZ2V0TmFtZXNwYWNlRGlyZWN0b3J5KGluZm8ubmFtZXNwYWNlKTtcbiAgY29uc3QgdHlwZUZpbGVTbHVnID0gdG9UeXBlRmlsZVNlZ21lbnQoaW5mby5uYW1lc3BhY2UsIG5hbWUpO1xuICBjb25zdCB0eXBlUm91dGVTbHVnID0gdG9UeXBlUm91dGVTZWdtZW50KGluZm8ubmFtZXNwYWNlLCBuYW1lKTtcbiAgY29uc3QgZmlsZVBhdGggPSBqb2luKGdldEFwaURvY1NldHRpbmdzKCkub3V0cHV0RGlyZWN0b3J5LCBuc0RpcmVjdG9yeSwgdHlwZUZpbGVTbHVnLCAnaW5kZXgubWR4Jyk7XG4gIGF3YWl0IGVuc3VyZURpcmVjdG9yeShmaWxlUGF0aCk7XG5cbiAgLy8gRnJvbnRtYXR0ZXJcbiAgY29uc3QgZGlzcGxheU5hbWUgPSBnZXREaXNwbGF5TmFtZShuYW1lLCBpbmZvKTtcbiAgY29uc3QgbGluZXM6IHN0cmluZ1tdID0gcmVuZGVyRnJvbnRNYXR0ZXIoe1xuICAgIGRlc2NyaXB0aW9uOiBpbmZvLmRlc2NyaXB0aW9uLFxuICAgIHNpZGViYXJMYWJlbDogZGlzcGxheU5hbWUsXG4gICAgc2lnbmF0dXJlOiBjb21wdXRlT3ZlcnZpZXdTaWduYXR1cmUobmFtZSwgaW5mbyksXG4gICAgc2x1ZzogYGFwaS8ke25zRGlyZWN0b3J5fS8ke3R5cGVSb3V0ZVNsdWd9YCxcbiAgICB0aXRsZTogZGlzcGxheU5hbWVcbiAgfSk7XG5cbiAgLy8gQ29tcG9uZW50IGltcG9ydHMg4oCUIGNvbXB1dGUgcmVsYXRpdmUgcGF0aCBmcm9tIGdlbmVyYXRlZCBwYWdlIHRvIGNvbXBvbmVudHNcbiAgbGluZXMucHVzaCguLi5nZXRDb21wb25lbnRJbXBvcnRzKFsnQ29uc3RydWN0b3JCbG9jaycsICdJbXBvcnRTdGF0ZW1lbnQnLCAnTWV0aG9kVGFibGUnLCAnUHJvcGVydHlUYWJsZScsICdUeXBlU2lnbmF0dXJlJ10pLCAnJyk7XG5cbiAgLy8gRGVzY3JpcHRpb25cbiAgaWYgKGluZm8uZGVzY3JpcHRpb24pIHtcbiAgICBsaW5lcy5wdXNoKHJlbmRlck1keFByb3NlKGluZm8uZGVzY3JpcHRpb24sIGFsbFR5cGVzLCBpbmZvLm5hbWVzcGFjZSksICcnKTtcbiAgfVxuXG4gIC8vIFJlbWFya3NcbiAgaWYgKGluZm8ucmVtYXJrcykge1xuICAgIGNvbnN0IHJlbWFya3NCbG9jayA9IHJlbmRlck1keFByb3NlKGluZm8ucmVtYXJrcywgYWxsVHlwZXMsIGluZm8ubmFtZXNwYWNlKTtcbiAgICBsaW5lcy5wdXNoKHJlbWFya3NCbG9jay5zcGxpdCgnXFxuJykubWFwKChsaW5lKSA9PiAobGluZS5sZW5ndGggPiAwID8gYD4gJHtsaW5lfWAgOiAnPicpKS5qb2luKCdcXG4nKSwgJycpO1xuICB9XG5cbiAgLy8gSW1wb3J0IHN0YXRlbWVudFxuICBjb25zdCBpbXBvcnRTdGF0ZW1lbnQgPSBnZXRJbXBvcnRTdGF0ZW1lbnQoaW5mbyk7XG4gIGlmIChpbXBvcnRTdGF0ZW1lbnQgIT09IHVuZGVmaW5lZCkge1xuICAgIGxpbmVzLnB1c2goYDxJbXBvcnRTdGF0ZW1lbnQgdGV4dD1cIiR7ZXNjYXBlSnN4QXR0cmlidXRlKGltcG9ydFN0YXRlbWVudCl9XCIgLz5gLCAnJyk7XG4gIH1cblxuICAvLyBFeGFtcGxlc1xuICBmb3IgKGNvbnN0IGV4YW1wbGUgb2YgaW5mby5leGFtcGxlcykge1xuICAgIGxpbmVzLnB1c2goJyoqRXhhbXBsZToqKicsICcnLCByZW5kZXJFeGFtcGxlTWR4KGV4YW1wbGUsIGFsbFR5cGVzLCBpbmZvLm5hbWVzcGFjZSksICcnKTtcbiAgfVxuXG4gIC8vIEZ1bmN0aW9ucyByZW5kZXIgbGlrZSBtZXRob2QgZGV0YWlsIHBhZ2VzIOKAlCBzaWduYXR1cmUsIHBhcmFtcywgcmV0dXJuc1xuICBpZiAoaW5mby5raW5kID09PSAnZnVuY3Rpb24nKSB7XG4gICAgcmVuZGVyRnVuY3Rpb25QYWdlKGxpbmVzLCBpbmZvLCBhbGxUeXBlcyk7XG4gICAgcmV0dXJuIHsgY29udGVudDogbGluZXMuam9pbignXFxuJyksIGZpbGVQYXRoIH07XG4gIH1cblxuICAvLyBWYXJpYWJsZXMgcmVuZGVyIHdpdGggZGVjbGFyYXRpb24ga2V5d29yZCBhbmQgdHlwZVxuICBpZiAoaW5mby5raW5kID09PSAndmFyaWFibGUnKSB7XG4gICAgcmVuZGVyVmFyaWFibGVQYWdlKGxpbmVzLCBuYW1lLCBpbmZvLCBhbGxUeXBlcyk7XG4gICAgcmV0dXJuIHsgY29udGVudDogbGluZXMuam9pbignXFxuJyksIGZpbGVQYXRoIH07XG4gIH1cblxuICAvLyBFbnVtcyByZW5kZXIgdGhlaXIgbWVtYmVycyBsaXN0XG4gIGlmIChpbmZvLmtpbmQgPT09ICdlbnVtJykge1xuICAgIHJlbmRlckVudW1QYWdlKGxpbmVzLCBpbmZvLCBhbGxUeXBlcyk7XG4gICAgcmV0dXJuIHsgY29udGVudDogbGluZXMuam9pbignXFxuJyksIGZpbGVQYXRoIH07XG4gIH1cblxuICAvLyBUeXBlIGFsaWFzZXMgcmVuZGVyIHRoZWlyIHJpZ2h0LWhhbmQtc2lkZSBzaWduYXR1cmVcbiAgaWYgKGluZm8ua2luZCA9PT0gJ3R5cGUnKSB7XG4gICAgcmVuZGVyVHlwZUFsaWFzUGFnZShsaW5lcywgaW5mbywgYWxsVHlwZXMpO1xuICAgIHJldHVybiB7IGNvbnRlbnQ6IGxpbmVzLmpvaW4oJ1xcbicpLCBmaWxlUGF0aCB9O1xuICB9XG5cbiAgLy8gQ2xhc3NlcyAvIGludGVyZmFjZXM6IHNpZ25hdHVyZSArIGV4dGVuZHMvaW1wbGVtZW50cyArIGNvbnN0cnVjdG9yICsgbWVtYmVyIHRhYmxlc1xuICBjb25zdCB0eXBlUGFyYW1zQXR0cmlidXRlID0gaW5mby50eXBlUGFyYW1ldGVycy5sZW5ndGggPiAwID8gYCB0eXBlUGFyYW1zPXske0pTT04uc3RyaW5naWZ5KGluZm8udHlwZVBhcmFtZXRlcnMpfX1gIDogJyc7XG4gIGNvbnN0IGV4dGVuZHNBdHRyaWJ1dGUgPSBpbmZvLmJhc2VUeXBlcy5sZW5ndGggPiAwID8gYCBleHRlbmRzPXske0pTT04uc3RyaW5naWZ5KGluZm8uYmFzZVR5cGVzKX19YCA6ICcnO1xuICBjb25zdCBpbXBsZW1lbnRzQXR0cmlidXRlID0gaW5mby5pbXBsZW1lbnRzVHlwZXMubGVuZ3RoID4gMCA/IGAgaW1wbGVtZW50cz17JHtKU09OLnN0cmluZ2lmeShpbmZvLmltcGxlbWVudHNUeXBlcyl9fWAgOiAnJztcbiAgbGluZXMucHVzaChgPFR5cGVTaWduYXR1cmUga2luZD1cIiR7aW5mby5raW5kfVwiIG5hbWU9XCIke25hbWV9XCIke3R5cGVQYXJhbXNBdHRyaWJ1dGV9JHtleHRlbmRzQXR0cmlidXRlfSR7aW1wbGVtZW50c0F0dHJpYnV0ZX0gLz5gLCAnJyk7XG5cbiAgaWYgKGluZm8uYmFzZVR5cGVzLmxlbmd0aCA+IDApIHtcbiAgICBjb25zdCBsaW5rZWRUeXBlcyA9IGluZm8uYmFzZVR5cGVzLm1hcCgodCkgPT4gbGlua0Jhc2VUeXBlKHQsIGFsbFR5cGVzLCBpbmZvLm5hbWVzcGFjZSkpO1xuICAgIGxpbmVzLnB1c2goYCoqRXh0ZW5kczoqKiAke2xpbmtlZFR5cGVzLmpvaW4oJywgJyl9YCwgJycpO1xuICB9XG5cbiAgaWYgKGluZm8uaW1wbGVtZW50c1R5cGVzLmxlbmd0aCA+IDApIHtcbiAgICBjb25zdCBsaW5rZWRUeXBlcyA9IGluZm8uaW1wbGVtZW50c1R5cGVzLm1hcCgodCkgPT4gbGlua0Jhc2VUeXBlKHQsIGFsbFR5cGVzLCBpbmZvLm5hbWVzcGFjZSkpO1xuICAgIGxpbmVzLnB1c2goYCoqSW1wbGVtZW50czoqKiAke2xpbmtlZFR5cGVzLmpvaW4oJywgJyl9YCwgJycpO1xuICB9XG5cbiAgcmVuZGVyQ29uc3RydWN0b3JNZHgobGluZXMsIG5hbWUsIGluZm8sIGFsbFR5cGVzKTtcbiAgcmVuZGVyUHJvcGVydHlUYWJsZU1keChsaW5lcywgaW5mbywgYWxsVHlwZXMpO1xuICByZW5kZXJNZXRob2RUYWJsZU1keChsaW5lcywgaW5mbywgYWxsVHlwZXMpO1xuXG4gIHJldHVybiB7IGNvbnRlbnQ6IGxpbmVzLmpvaW4oJ1xcbicpLCBmaWxlUGF0aCB9O1xufVxuXG4vKipcbiAqIFdyaXRlcyB0aGUgU3RhcmxpZ2h0IHNpZGViYXIgb2YgdGhlIEFQSSByZWZlcmVuY2UuXG4gKlxuICogQHBhcmFtIHR5cGVzIC0gVGhlIGRvY3VtZW50ZWQgdHlwZXMsIGtleWVkIGJ5IHF1YWxpZmllZCBpZC5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdlbmVyYXRlU2lkZWJhckpzb24odHlwZXM6IE1hcDxzdHJpbmcsIFR5cGVJbmZvPik6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCByb290ID0gYnVpbGRTaWRlYmFyVHJlZSh0eXBlcyk7XG5cbiAgY29uc3QgZ3JvdXBzOiBTaWRlYmFyRW50cnlbXSA9IFtdO1xuICBjb25zdCB0b3BMZXZlbHMgPSBbLi4ucm9vdC5jaGlsZHJlbl0uc29ydCgoW2FdLCBbYl0pID0+IGEubG9jYWxlQ29tcGFyZShiKSk7XG4gIGZvciAoY29uc3QgW3RvcExldmVsLCBjaGlsZF0gb2YgdG9wTGV2ZWxzKSB7XG4gICAgZ3JvdXBzLnB1c2goc2lkZWJhclRyZWVUb0VudHJpZXMoY2hpbGQsIHRvcExldmVsKSk7XG4gIH1cblxuICBjb25zdCB3cmFwcGVkU2lkZWJhcjogU2lkZWJhckVudHJ5W10gPSBbe1xuICAgIGNvbGxhcHNlZDogZmFsc2UsXG4gICAgaXRlbXM6IGdyb3VwcyxcbiAgICBsYWJlbDogJ0FQSSByZWZlcmVuY2UnXG4gIH1dO1xuXG4gIGF3YWl0IHdyaXRlRmlsZShnZXRBcGlEb2NTZXR0aW5ncygpLnNpZGViYXJGaWxlLCBKU09OLnN0cmluZ2lmeSh3cmFwcGVkU2lkZWJhciwgbnVsbCwgSlNPTl9JTkRFTlQpLCAndXRmLTgnKTtcbiAgY29uc29sZS53YXJuKGBHZW5lcmF0ZWQgc2lkZWJhciB3aXRoICR7U3RyaW5nKGdyb3Vwcy5sZW5ndGgpfSB0b3AtbGV2ZWwgbW9kdWxlIGdyb3Vwc2ApO1xufVxuXG4vKipcbiAqIFJlbmRlcnMgYSBjbGFzcydzIGNvbnN0cnVjdG9yIGJsb2NrLlxuICpcbiAqIEBwYXJhbSBsaW5lcyAtIFRoZSBwYWdlIGxpbmVzIHRvIGFwcGVuZCB0by5cbiAqIEBwYXJhbSBuYW1lIC0gVGhlIHR5cGUncyBuYW1lLlxuICogQHBhcmFtIGluZm8gLSBUaGUgZG9jdW1lbnRlZCB0eXBlLlxuICogQHBhcmFtIGFsbFR5cGVzIC0gRXZlcnkgZG9jdW1lbnRlZCB0eXBlLCBrZXllZCBieSBgJHtuYW1lc3BhY2V9IyR7bmFtZX1gLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVuZGVyQ29uc3RydWN0b3JNZHgobGluZXM6IHN0cmluZ1tdLCBuYW1lOiBzdHJpbmcsIGluZm86IFR5cGVJbmZvLCBhbGxUeXBlczogTWFwPHN0cmluZywgVHlwZUluZm8+KTogdm9pZCB7XG4gIGNvbnN0IGNvbnN0cnVjdG9yID0gaW5mby5jb25zdHJ1Y3RvckluZm87XG4gIGlmICghY29uc3RydWN0b3IpIHtcbiAgICByZXR1cm47XG4gIH1cbiAgY29uc3QgY3RvclNpZyA9IGBuZXcgJHtuYW1lfSR7Y29uc3RydWN0b3Iuc2lnbmF0dXJlfWA7XG4gIGNvbnN0IGN0b3JEZXNjID0gY29uc3RydWN0b3IuZGVzY3JpcHRpb25cbiAgICA/IGAgZGVzY3JpcHRpb249XCIke2VzY2FwZUpzeEF0dHJpYnV0ZShtYXJrZG93blRvSHRtbChyZXNvbHZlTGlua3MoY29uc3RydWN0b3IuZGVzY3JpcHRpb24sIGFsbFR5cGVzLCBpbmZvLm5hbWVzcGFjZSkpKX1cImBcbiAgICA6ICcnO1xuICBsaW5lcy5wdXNoKGA8Q29uc3RydWN0b3JCbG9jayBzaWduYXR1cmU9XCIke2VzY2FwZUpzeEF0dHJpYnV0ZShjdG9yU2lnKX1cIiR7Y3RvckRlc2N9IC8+YCwgJycpO1xufVxuXG4vKipcbiAqIFJlbmRlcnMgYW4gZW51bSdzIG1lbWJlcnMuXG4gKlxuICogQHBhcmFtIGxpbmVzIC0gVGhlIHBhZ2UgbGluZXMgdG8gYXBwZW5kIHRvLlxuICogQHBhcmFtIGluZm8gLSBUaGUgZG9jdW1lbnRlZCB0eXBlLlxuICogQHBhcmFtIGFsbFR5cGVzIC0gRXZlcnkgZG9jdW1lbnRlZCB0eXBlLCBrZXllZCBieSBgJHtuYW1lc3BhY2V9IyR7bmFtZX1gLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVuZGVyRW51bVBhZ2UobGluZXM6IHN0cmluZ1tdLCBpbmZvOiBUeXBlSW5mbywgYWxsVHlwZXM6IE1hcDxzdHJpbmcsIFR5cGVJbmZvPik6IHZvaWQge1xuICBsaW5lcy5wdXNoKGA8VHlwZVNpZ25hdHVyZSBraW5kPVwiZW51bVwiIG5hbWU9XCIke2luZm8ubmFtZX1cIiAvPmAsICcnKTtcblxuICBpZiAoaW5mby5lbnVtTWVtYmVycy5sZW5ndGggPT09IDApIHtcbiAgICByZXR1cm47XG4gIH1cblxuICBsaW5lcy5wdXNoKCcqKk1lbWJlcnM6KionLCAnJywgJ3wgTWVtYmVyIHwgVmFsdWUgfCBEZXNjcmlwdGlvbiB8JywgJ3wgOi0tIHwgOi0tIHwgOi0tIHwnKTtcbiAgZm9yIChjb25zdCBtZW1iZXIgb2YgaW5mby5lbnVtTWVtYmVycykge1xuICAgIGNvbnN0IHZhbHVlID0gbWVtYmVyLnZhbHVlID8gYFxcYCR7ZXNjYXBlTWFya2Rvd24obWVtYmVyLnZhbHVlKX1cXGBgIDogJyc7XG4gICAgbGluZXMucHVzaChgfCBcXGAke21lbWJlci5uYW1lfVxcYCB8ICR7dmFsdWV9IHwgJHtlc2NhcGVNYXJrZG93bihyZXNvbHZlTGlua3MobWVtYmVyLmRlc2NyaXB0aW9uLCBhbGxUeXBlcywgaW5mby5uYW1lc3BhY2UpKX0gfGApO1xuICB9XG4gIGxpbmVzLnB1c2goJycpO1xufVxuXG4vKipcbiAqIFJlbmRlciB0aGUgU3RhcmxpZ2h0IGZyb250bWF0dGVyIGJsb2NrICh0aHJvdWdoIHRoZSBjbG9zaW5nIGAtLS1gIGFuZCBpdHMgYmxhbmsgbGluZSkgc2hhcmVkIGJ5IGV2ZXJ5XG4gKiBnZW5lcmF0ZWQgcGFnZSBraW5kOiBtb2R1bGUgaW5kZXgsIHR5cGUgb3ZlcnZpZXcsIHByb3BlcnR5LCBhbmQgbWV0aG9kLlxuICpcbiAqIEV2ZXJ5IHBhZ2Uga2luZCBnb2VzIHRocm91Z2ggaGVyZSBzbyBubyBmaWVsZCBjYW4gYmUgZW1pdHRlZCBvbiBzb21lIGtpbmRzIGFuZCBzaWxlbnRseSBkcm9wcGVkIG9uXG4gKiBvdGhlcnMuIGBkZXNjcmlwdGlvbmAgaW4gcGFydGljdWxhciBpcyBub3QganVzdCBTRU8gbWV0YWRhdGEg4oCUIGl0IGlzIHRoZSBsaW5lIHRoZSBPRyBjYXJkIHJlbmRlcnMgdW5kZXJcbiAqIHRoZSB0aXRsZSwgc28gYSBwYWdlIGtpbmQgdGhhdCBza2lwcGVkIGl0IHByb2R1Y2VkIGEgdGl0bGUtb25seSBjYXJkIG5leHQgdG8gZnVsbHkgcG9wdWxhdGVkIG9uZXMuXG4gKlxuICogQHBhcmFtIGZyb250TWF0dGVyIC0gVGhlIHBhZ2UncyBmcm9udG1hdHRlciBmaWVsZHMuXG4gKiBAcmV0dXJucyBUaGUgZnJvbnRtYXR0ZXIgbGluZXMsIHRocm91Z2ggdGhlIGNsb3NpbmcgYC0tLWAgYW5kIGl0cyBibGFuayBsaW5lLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVuZGVyRnJvbnRNYXR0ZXIoZnJvbnRNYXR0ZXI6IFBhZ2VGcm9udE1hdHRlcik6IHN0cmluZ1tdIHtcbiAgcmV0dXJuIFtcbiAgICAnLS0tJyxcbiAgICBgdGl0bGU6IFwiJHtlc2NhcGVZYW1sKGZyb250TWF0dGVyLnRpdGxlKX1cImAsXG4gICAgYHNsdWc6IFwiJHtmcm9udE1hdHRlci5zbHVnfVwiYCxcbiAgICAuLi4oZnJvbnRNYXR0ZXIuZGVzY3JpcHRpb24gPyBbYGRlc2NyaXB0aW9uOiBcIiR7ZXNjYXBlWWFtbChzdHJpcE1hcmtkb3duKGZyb250TWF0dGVyLmRlc2NyaXB0aW9uKSl9XCJgXSA6IFtdKSxcbiAgICAuLi4oZnJvbnRNYXR0ZXIuc2lnbmF0dXJlID8gW2BzaWduYXR1cmU6IFwiJHtlc2NhcGVZYW1sKHRydW5jYXRlU2lnbmF0dXJlKGZyb250TWF0dGVyLnNpZ25hdHVyZSkpfVwiYF0gOiBbXSksXG4gICAgJ2VkaXRVcmw6IGZhbHNlJyxcbiAgICAnc2lkZWJhcjonLFxuICAgIGAgIGxhYmVsOiBcIiR7ZXNjYXBlWWFtbChmcm9udE1hdHRlci5zaWRlYmFyTGFiZWwpfVwiYCxcbiAgICAnLS0tJyxcbiAgICAnJ1xuICBdO1xufVxuXG4vKipcbiAqIFJlbmRlcnMgYSBmdW5jdGlvbidzIHNpZ25hdHVyZSwgcGFyYW1ldGVycywgcmV0dXJuIHZhbHVlIGFuZCBleGFtcGxlcy5cbiAqXG4gKiBAcGFyYW0gbGluZXMgLSBUaGUgcGFnZSBsaW5lcyB0byBhcHBlbmQgdG8uXG4gKiBAcGFyYW0gaW5mbyAtIFRoZSBkb2N1bWVudGVkIHR5cGUuXG4gKiBAcGFyYW0gYWxsVHlwZXMgLSBFdmVyeSBkb2N1bWVudGVkIHR5cGUsIGtleWVkIGJ5IGAke25hbWVzcGFjZX0jJHtuYW1lfWAuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZW5kZXJGdW5jdGlvblBhZ2UobGluZXM6IHN0cmluZ1tdLCBpbmZvOiBUeXBlSW5mbywgYWxsVHlwZXM6IE1hcDxzdHJpbmcsIFR5cGVJbmZvPik6IHZvaWQge1xuICBjb25zdCAkZnVuY3Rpb24gPSBpbmZvLm1ldGhvZHNbMF07XG4gIGlmICghJGZ1bmN0aW9uKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgbGluZXMucHVzaCgnKipTaWduYXR1cmU6KionLCAnJywgJ2BgYHRzJywgYGZ1bmN0aW9uICR7JGZ1bmN0aW9uLnNpZ25hdHVyZX06ICR7JGZ1bmN0aW9uLnJldHVyblR5cGV9YCwgJ2BgYCcsICcnKTtcblxuICBpZiAoJGZ1bmN0aW9uLnBhcmFtZXRlcnMubGVuZ3RoID4gMCkge1xuICAgIGxpbmVzLnB1c2goJyoqUGFyYW1ldGVyczoqKicsICcnLCAnfCBQYXJhbWV0ZXIgfCBUeXBlIHwgRGVzY3JpcHRpb24gfCcsICd8IDotLSB8IDotLSB8IDotLSB8Jyk7XG4gICAgZm9yIChjb25zdCBwYXJhbWV0ZXIgb2YgJGZ1bmN0aW9uLnBhcmFtZXRlcnMpIHtcbiAgICAgIGxpbmVzLnB1c2goXG4gICAgICAgIGB8IFxcYCR7cGFyYW1ldGVyLm5hbWV9XFxgIHwgJHtlc2NhcGVNYXJrZG93bihlc2NhcGVNZHhBbmdsZUJyYWNrZXRzKHJlbmRlclR5cGVXaXRoTGlua3MocGFyYW1ldGVyLnR5cGUsIGFsbFR5cGVzLCBpbmZvLm5hbWUsIGluZm8ubmFtZXNwYWNlKSkpfSB8ICR7ZXNjYXBlTWFya2Rvd24ocmVzb2x2ZUxpbmtzKHBhcmFtZXRlci5kZXNjcmlwdGlvbiwgYWxsVHlwZXMsIGluZm8ubmFtZXNwYWNlKSl9IHxgXG4gICAgICApO1xuICAgIH1cbiAgICBsaW5lcy5wdXNoKCcnKTtcbiAgfVxuXG4gIGNvbnN0IHJldHVybkRlc2MgPSAkZnVuY3Rpb24ucmV0dXJuRGVzY3JpcHRpb24gPyBgIOKAlCAke2VzY2FwZU1keFByb3NlKHJlc29sdmVMaW5rcygkZnVuY3Rpb24ucmV0dXJuRGVzY3JpcHRpb24sIGFsbFR5cGVzLCBpbmZvLm5hbWVzcGFjZSkpfWAgOiAnJztcbiAgbGluZXMucHVzaChgKipSZXR1cm5zOioqICR7ZXNjYXBlTWR4QnJhY2VzKGVzY2FwZU1keEFuZ2xlQnJhY2tldHMocmVuZGVyVHlwZVdpdGhMaW5rcygkZnVuY3Rpb24ucmV0dXJuVHlwZSwgYWxsVHlwZXMsIGluZm8ubmFtZSwgaW5mby5uYW1lc3BhY2UpKSl9JHtyZXR1cm5EZXNjfWAsICcnKTtcblxuICBmb3IgKGNvbnN0IGV4YW1wbGUgb2YgJGZ1bmN0aW9uLmV4YW1wbGVzKSB7XG4gICAgbGluZXMucHVzaCgnKipFeGFtcGxlOioqJywgJycsIHJlbmRlckV4YW1wbGVNZHgoZXhhbXBsZSwgYWxsVHlwZXMsIGluZm8ubmFtZXNwYWNlKSwgJycpO1xuICB9XG59XG5cbi8qKlxuICogUmVuZGVycyBvbmUgbWV0aG9kIG92ZXJsb2FkLlxuICpcbiAqIEBwYXJhbSBsaW5lcyAtIFRoZSBwYWdlIGxpbmVzIHRvIGFwcGVuZCB0by5cbiAqIEBwYXJhbSBvdmVybG9hZCAtIFRoZSBvdmVybG9hZC5cbiAqIEBwYXJhbSB0eXBlTmFtZSAtIFRoZSBuYW1lIG9mIHRoZSB0eXBlIHRoZSBtZXRob2QgYmVsb25ncyB0by5cbiAqIEBwYXJhbSBuYW1lc3BhY2UgLSBUaGUgbmFtZXNwYWNlIG9mIHRoZSB0eXBlIHRoZSBtZXRob2QgYmVsb25ncyB0by5cbiAqIEBwYXJhbSBhbGxUeXBlcyAtIEV2ZXJ5IGRvY3VtZW50ZWQgdHlwZSwga2V5ZWQgYnkgYCR7bmFtZXNwYWNlfSMke25hbWV9YC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlbmRlck1ldGhvZE92ZXJsb2FkTWR4KGxpbmVzOiBzdHJpbmdbXSwgb3ZlcmxvYWQ6IE1lbWJlckluZm8sIHR5cGVOYW1lOiBzdHJpbmcsIG5hbWVzcGFjZTogc3RyaW5nLCBhbGxUeXBlczogTWFwPHN0cmluZywgVHlwZUluZm8+KTogdm9pZCB7XG4gIGNvbnN0IHNpZyA9IGAke292ZXJsb2FkLnNpZ25hdHVyZX06ICR7b3ZlcmxvYWQucmV0dXJuVHlwZX1gO1xuICBjb25zdCBzdGF0aWNBdHRyaWJ1dGUgPSBvdmVybG9hZC5pc1N0YXRpYyA/ICcgaXNTdGF0aWM9e3RydWV9JyA6ICcnO1xuICBjb25zdCBkZXNjQXR0cmlidXRlID0gb3ZlcmxvYWQuZGVzY3JpcHRpb24gPyBgIGRlc2NyaXB0aW9uPVwiJHtlc2NhcGVKc3hBdHRyaWJ1dGUobWFya2Rvd25Ub0h0bWwocmVzb2x2ZUxpbmtzKG92ZXJsb2FkLmRlc2NyaXB0aW9uLCBhbGxUeXBlcywgbmFtZXNwYWNlKSkpfVwiYCA6ICcnO1xuICBjb25zdCByZW1hcmtzQXR0cmlidXRlID0gb3ZlcmxvYWQucmVtYXJrcyA/IGAgcmVtYXJrcz1cIiR7ZXNjYXBlSnN4QXR0cmlidXRlKG1hcmtkb3duVG9IdG1sKHJlc29sdmVMaW5rcyhvdmVybG9hZC5yZW1hcmtzLCBhbGxUeXBlcywgbmFtZXNwYWNlKSkpfVwiYCA6ICcnO1xuICBjb25zdCBzaW5jZUF0dHJpYnV0ZSA9IG92ZXJsb2FkLnNpbmNlID8gYCBzaW5jZT1cIiR7ZXNjYXBlSnN4QXR0cmlidXRlKG92ZXJsb2FkLnNpbmNlKX1cImAgOiAnJztcbiAgY29uc3QgcmV0dXJuVHlwZUF0dHJpYnV0ZSA9IGAgcmV0dXJuVHlwZT1cIiR7ZXNjYXBlSnN4QXR0cmlidXRlKG1hcmtkb3duVG9IdG1sKHJlbmRlclR5cGVXaXRoTGlua3Mob3ZlcmxvYWQucmV0dXJuVHlwZSwgYWxsVHlwZXMsIHR5cGVOYW1lLCBuYW1lc3BhY2UpKSl9XCJgO1xuICBjb25zdCByZXR1cm5EZXNjQXR0cmlidXRlID0gb3ZlcmxvYWQucmV0dXJuRGVzY3JpcHRpb25cbiAgICA/IGAgcmV0dXJuRGVzY3JpcHRpb249XCIke2VzY2FwZUpzeEF0dHJpYnV0ZShtYXJrZG93blRvSHRtbChyZXNvbHZlTGlua3Mob3ZlcmxvYWQucmV0dXJuRGVzY3JpcHRpb24sIGFsbFR5cGVzLCBuYW1lc3BhY2UpKSl9XCJgXG4gICAgOiAnJztcbiAgY29uc3QgZXhhbXBsZXNBdHRyaWJ1dGUgPSBvdmVybG9hZC5leGFtcGxlcy5sZW5ndGggPiAwID8gYCBleGFtcGxlcz17JHtKU09OLnN0cmluZ2lmeShvdmVybG9hZC5leGFtcGxlcyl9fWAgOiAnJztcblxuICBjb25zdCBwYXJhbXMgPSBvdmVybG9hZC5wYXJhbWV0ZXJzLm1hcCgocCkgPT4gKHtcbiAgICBkZXNjcmlwdGlvbjogbWFya2Rvd25Ub0h0bWwocC5kZXNjcmlwdGlvbiB8fCAocC5uYW1lLmVuZHNXaXRoKCc/JykgPyAnKihPcHRpb25hbCkqJyA6ICcnKSksXG4gICAgbmFtZTogcC5uYW1lLFxuICAgIHR5cGU6IG1hcmtkb3duVG9IdG1sKHJlbmRlclR5cGVXaXRoTGlua3MocC50eXBlLCBhbGxUeXBlcywgdHlwZU5hbWUsIG5hbWVzcGFjZSkpXG4gIH0pKTtcbiAgY29uc3QgcGFyYW1zQXR0cmlidXRlID0gcGFyYW1zLmxlbmd0aCA+IDAgPyBgIHBhcmFtZXRlcnM9eyR7SlNPTi5zdHJpbmdpZnkocGFyYW1zKX19YCA6ICcnO1xuXG4gIGxpbmVzLnB1c2goXG4gICAgYDxNZW1iZXJEZXRhaWwke3N0YXRpY0F0dHJpYnV0ZX0gc2lnbmF0dXJlPVwiJHtlc2NhcGVKc3hBdHRyaWJ1dGUoc2lnKX1cIiR7ZGVzY0F0dHJpYnV0ZX0ke3JlbWFya3NBdHRyaWJ1dGV9JHtzaW5jZUF0dHJpYnV0ZX0ke3JldHVyblR5cGVBdHRyaWJ1dGV9JHtyZXR1cm5EZXNjQXR0cmlidXRlfSR7cGFyYW1zQXR0cmlidXRlfSR7ZXhhbXBsZXNBdHRyaWJ1dGV9IC8+YCxcbiAgICAnJ1xuICApO1xufVxuXG4vKipcbiAqIFJlbmRlcnMgYSB0eXBlJ3MgbWV0aG9kIHRhYmxlLlxuICpcbiAqIEBwYXJhbSBsaW5lcyAtIFRoZSBwYWdlIGxpbmVzIHRvIGFwcGVuZCB0by5cbiAqIEBwYXJhbSBpbmZvIC0gVGhlIGRvY3VtZW50ZWQgdHlwZS5cbiAqIEBwYXJhbSBhbGxUeXBlcyAtIEV2ZXJ5IGRvY3VtZW50ZWQgdHlwZSwga2V5ZWQgYnkgYCR7bmFtZXNwYWNlfSMke25hbWV9YC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlbmRlck1ldGhvZFRhYmxlTWR4KGxpbmVzOiBzdHJpbmdbXSwgaW5mbzogVHlwZUluZm8sIGFsbFR5cGVzOiBNYXA8c3RyaW5nLCBUeXBlSW5mbz4pOiB2b2lkIHtcbiAgY29uc3QgbWV0aG9kcyA9IFsuLi5pbmZvLm1ldGhvZHNdLnNvcnQoKGEsIGIpID0+IHtcbiAgICBpZiAoYS5pc1N0YXRpYyAhPT0gYi5pc1N0YXRpYykge1xuICAgICAgcmV0dXJuIGEuaXNTdGF0aWMgPyAxIDogLTE7XG4gICAgfVxuICAgIHJldHVybiBhLm5hbWUubG9jYWxlQ29tcGFyZShiLm5hbWUpO1xuICB9KTtcbiAgaWYgKG1ldGhvZHMubGVuZ3RoID09PSAwKSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIGxpbmVzLnB1c2goJzxNZXRob2RUYWJsZSByb3dzPXtbJyk7XG4gIGZvciAoY29uc3QgbWV0aG9kIG9mIG1ldGhvZHMpIHtcbiAgICBjb25zdCBkZXNjID0gZXNjYXBlSnNTdHJpbmcobWFya2Rvd25Ub0h0bWwocmVzb2x2ZUxpbmtzKG1ldGhvZC5kZXNjcmlwdGlvbiwgYWxsVHlwZXMsIGluZm8ubmFtZXNwYWNlKSkpO1xuICAgIGNvbnN0IHN0YXRpY1ByZWZpeCA9IG1ldGhvZC5pc1N0YXRpYyA/ICdzdGF0aWMgJyA6ICcnO1xuICAgIGNvbnN0IHNob3J0UGFyYW1zID0gbWV0aG9kLnBhcmFtZXRlcnMubWFwKChwLCBpbmRleCkgPT4ge1xuICAgICAgcmV0dXJuIGluZGV4ID09PSAwICYmIEVWRU5UX01FVEhPRFMuaGFzKG1ldGhvZC5uYW1lKSAmJiAocC50eXBlLnN0YXJ0c1dpdGgoJ1wiJykgfHwgcC50eXBlLnN0YXJ0c1dpdGgoJ1xcJycpKSA/IHAudHlwZS5yZXBsYWNlQWxsKCdcIicsICdcXCcnKSA6IHAubmFtZTtcbiAgICB9KS5qb2luKCcsICcpO1xuICAgIGNvbnN0IHNob3J0U2lnID0gYCR7c3RhdGljUHJlZml4fSR7bWV0aG9kLm5hbWV9KCR7c2hvcnRQYXJhbXN9KWA7XG4gICAgY29uc3Qgc2lnID0gZXNjYXBlSnNTdHJpbmcoc2hvcnRTaWcpO1xuICAgIGNvbnN0IHNsdWcgPSBvdmVybG9hZFJvdXRlU2VnbWVudChtZXRob2Qub3ZlcmxvYWRLZXkpO1xuICAgIGNvbnN0IHJldHVyblR5cGUgPSBtYXJrZG93blRvSHRtbChyZW5kZXJUeXBlV2l0aExpbmtzKG1ldGhvZC5yZXR1cm5UeXBlLCBhbGxUeXBlcywgaW5mby5uYW1lLCBpbmZvLm5hbWVzcGFjZSkpO1xuICAgIGNvbnN0IGluaGVyaXRlZEF0dHJpYnV0ZSA9IG1ldGhvZC5pbmhlcml0ZWRGcm9tXG4gICAgICA/IGAsIGluaGVyaXRlZEZyb206IFwiJHtlc2NhcGVKc1N0cmluZyhtYXJrZG93blRvSHRtbCh0eXBlTGluayhtZXRob2QuaW5oZXJpdGVkRnJvbSwgYWxsVHlwZXMsIGluZm8ubmFtZXNwYWNlKSkpfVwiYFxuICAgICAgOiAnJztcbiAgICBjb25zdCBocmVmID0gbWVtYmVySHJlZihzbHVnLCBtZXRob2QuaW5oZXJpdGVkRnJvbSwgYWxsVHlwZXMsIGluZm8ubmFtZXNwYWNlKTtcbiAgICBsaW5lcy5wdXNoKFxuICAgICAgYCAgeyBzaWduYXR1cmU6IFwiJHtzaWd9XCIsIGhyZWY6IFwiJHtlc2NhcGVKc1N0cmluZyhocmVmKX1cIiwgcmV0dXJuczogXCIke2VzY2FwZUpzU3RyaW5nKHJldHVyblR5cGUpfVwiLCBkZXNjcmlwdGlvbjogXCIke2Rlc2N9XCIke2luaGVyaXRlZEF0dHJpYnV0ZX0gfSxgXG4gICAgKTtcbiAgfVxuICBsaW5lcy5wdXNoKCddfSAvPicsICcnKTtcbn1cblxuLyoqXG4gKiBSZW5kZXJzIGEgdHlwZSdzIHByb3BlcnR5IHRhYmxlLlxuICpcbiAqIEBwYXJhbSBsaW5lcyAtIFRoZSBwYWdlIGxpbmVzIHRvIGFwcGVuZCB0by5cbiAqIEBwYXJhbSBpbmZvIC0gVGhlIGRvY3VtZW50ZWQgdHlwZS5cbiAqIEBwYXJhbSBhbGxUeXBlcyAtIEV2ZXJ5IGRvY3VtZW50ZWQgdHlwZSwga2V5ZWQgYnkgYCR7bmFtZXNwYWNlfSMke25hbWV9YC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlbmRlclByb3BlcnR5VGFibGVNZHgobGluZXM6IHN0cmluZ1tdLCBpbmZvOiBUeXBlSW5mbywgYWxsVHlwZXM6IE1hcDxzdHJpbmcsIFR5cGVJbmZvPik6IHZvaWQge1xuICBjb25zdCBwcm9wZXJ0aWVzID0gaW5mby5wcm9wZXJ0aWVzO1xuICBpZiAocHJvcGVydGllcy5sZW5ndGggPT09IDApIHtcbiAgICByZXR1cm47XG4gIH1cbiAgbGluZXMucHVzaCgnPFByb3BlcnR5VGFibGUgcm93cz17WycpO1xuICBmb3IgKGNvbnN0IHByb3BlcnR5IG9mIHByb3BlcnRpZXMpIHtcbiAgICBjb25zdCBkZXNjID0gZXNjYXBlSnNTdHJpbmcobWFya2Rvd25Ub0h0bWwocmVzb2x2ZUxpbmtzKHByb3BlcnR5LmRlc2NyaXB0aW9uLCBhbGxUeXBlcywgaW5mby5uYW1lc3BhY2UpKSk7XG4gICAgY29uc3QgdHlwZSA9IG1hcmtkb3duVG9IdG1sKHJlbmRlclR5cGVXaXRoTGlua3MocHJvcGVydHkudHlwZSwgYWxsVHlwZXMsIGluZm8ubmFtZSwgaW5mby5uYW1lc3BhY2UpKTtcbiAgICBjb25zdCBpbmhlcml0ZWRBdHRyaWJ1dGUgPSBwcm9wZXJ0eS5pbmhlcml0ZWRGcm9tXG4gICAgICA/IGAsIGluaGVyaXRlZEZyb206IFwiJHtlc2NhcGVKc1N0cmluZyhtYXJrZG93blRvSHRtbCh0eXBlTGluayhwcm9wZXJ0eS5pbmhlcml0ZWRGcm9tLCBhbGxUeXBlcywgaW5mby5uYW1lc3BhY2UpKSl9XCJgXG4gICAgICA6ICcnO1xuICAgIGNvbnN0IGhyZWYgPSBtZW1iZXJIcmVmKG1lbWJlclJvdXRlU2VnbWVudChwcm9wZXJ0eS5uYW1lKSwgcHJvcGVydHkuaW5oZXJpdGVkRnJvbSwgYWxsVHlwZXMsIGluZm8ubmFtZXNwYWNlKTtcbiAgICBsaW5lcy5wdXNoKFxuICAgICAgYCAgeyBuYW1lOiBcIiR7ZXNjYXBlSnNTdHJpbmcocHJvcGVydHkubmFtZSl9XCIsIGhyZWY6IFwiJHtlc2NhcGVKc1N0cmluZyhocmVmKX1cIiwgdHlwZTogXCIke2VzY2FwZUpzU3RyaW5nKHR5cGUpfVwiLCBkZXNjcmlwdGlvbjogXCIke2Rlc2N9XCIke2luaGVyaXRlZEF0dHJpYnV0ZX0gfSxgXG4gICAgKTtcbiAgfVxuICBsaW5lcy5wdXNoKCddfSAvPicsICcnKTtcbn1cblxuLyoqXG4gKiBSZW5kZXJzIGEgdHlwZSBhbGlhcydzIHNpZ25hdHVyZS5cbiAqXG4gKiBAcGFyYW0gbGluZXMgLSBUaGUgcGFnZSBsaW5lcyB0byBhcHBlbmQgdG8uXG4gKiBAcGFyYW0gaW5mbyAtIFRoZSBkb2N1bWVudGVkIHR5cGUuXG4gKiBAcGFyYW0gYWxsVHlwZXMgLSBFdmVyeSBkb2N1bWVudGVkIHR5cGUsIGtleWVkIGJ5IGAke25hbWVzcGFjZX0jJHtuYW1lfWAuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZW5kZXJUeXBlQWxpYXNQYWdlKGxpbmVzOiBzdHJpbmdbXSwgaW5mbzogVHlwZUluZm8sIGFsbFR5cGVzOiBNYXA8c3RyaW5nLCBUeXBlSW5mbz4pOiB2b2lkIHtcbiAgY29uc3QgdHlwZVBhcmFtc0F0dHJpYnV0ZSA9IGluZm8udHlwZVBhcmFtZXRlcnMubGVuZ3RoID4gMCA/IGAgdHlwZVBhcmFtcz17JHtKU09OLnN0cmluZ2lmeShpbmZvLnR5cGVQYXJhbWV0ZXJzKX19YCA6ICcnO1xuICBsaW5lcy5wdXNoKGA8VHlwZVNpZ25hdHVyZSBraW5kPVwidHlwZVwiIG5hbWU9XCIke2luZm8ubmFtZX1cIiR7dHlwZVBhcmFtc0F0dHJpYnV0ZX0gLz5gLCAnJyk7XG5cbiAgY29uc3QgcmhzID0gaW5mby50eXBlQWxpYXNUZXh0ID8/ICd1bmtub3duJztcbiAgbGluZXMucHVzaChcbiAgICAnKipTaWduYXR1cmU6KionLFxuICAgICcnLFxuICAgICdgYGB0cycsXG4gICAgYHR5cGUgJHtnZXREaXNwbGF5TmFtZShpbmZvLm5hbWUsIGluZm8pfSA9ICR7cmhzfWAsXG4gICAgJ2BgYCcsXG4gICAgJycsXG4gICAgYCoqVHlwZToqKiAke2VzY2FwZU1keEJyYWNlcyhlc2NhcGVNZHhBbmdsZUJyYWNrZXRzKHJlbmRlclR5cGVXaXRoTGlua3MocmhzLCBhbGxUeXBlcywgaW5mby5uYW1lLCBpbmZvLm5hbWVzcGFjZSkpKX1gLFxuICAgICcnXG4gICk7XG59XG5cbi8qKlxuICogUmVuZGVycyBhIHZhcmlhYmxlJ3MgZGVjbGFyYXRpb24gYW5kIHR5cGUuXG4gKlxuICogQHBhcmFtIGxpbmVzIC0gVGhlIHBhZ2UgbGluZXMgdG8gYXBwZW5kIHRvLlxuICogQHBhcmFtIG5hbWUgLSBUaGUgdHlwZSdzIG5hbWUuXG4gKiBAcGFyYW0gaW5mbyAtIFRoZSBkb2N1bWVudGVkIHR5cGUuXG4gKiBAcGFyYW0gYWxsVHlwZXMgLSBFdmVyeSBkb2N1bWVudGVkIHR5cGUsIGtleWVkIGJ5IGAke25hbWVzcGFjZX0jJHtuYW1lfWAuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZW5kZXJWYXJpYWJsZVBhZ2UobGluZXM6IHN0cmluZ1tdLCBuYW1lOiBzdHJpbmcsIGluZm86IFR5cGVJbmZvLCBhbGxUeXBlczogTWFwPHN0cmluZywgVHlwZUluZm8+KTogdm9pZCB7XG4gIGNvbnN0IGtleXdvcmQgPSBpbmZvLnZhcmlhYmxlS2V5d29yZCA/PyAnbGV0JztcbiAgY29uc3QgdmFyaWFibGVUeXBlID0gaW5mby52YXJpYWJsZVR5cGUgPz8gJ3Vua25vd24nO1xuICBsaW5lcy5wdXNoKFxuICAgICcqKlNpZ25hdHVyZToqKicsXG4gICAgJycsXG4gICAgJ2BgYHRzJyxcbiAgICBgJHtrZXl3b3JkfSAke25hbWV9OiAke3ZhcmlhYmxlVHlwZX1gLFxuICAgICdgYGAnLFxuICAgICcnLFxuICAgIGAqKlR5cGU6KiogJHtlc2NhcGVNZHhCcmFjZXMoZXNjYXBlTWR4QW5nbGVCcmFja2V0cyhyZW5kZXJUeXBlV2l0aExpbmtzKHZhcmlhYmxlVHlwZSwgYWxsVHlwZXMsIG5hbWUsIGluZm8ubmFtZXNwYWNlKSkpfWAsXG4gICAgJydcbiAgKTtcbn1cblxuLyoqXG4gKiBDb252ZXJ0cyBhIG5hbWVzcGFjZSB0cmVlIG5vZGUgaW50byBhIHNpZGViYXIgZ3JvdXAuXG4gKlxuICogQHBhcmFtIG5vZGUgLSBUaGUgbm9kZS5cbiAqIEBwYXJhbSBsYWJlbCAtIFRoZSBncm91cCdzIGxhYmVsLlxuICogQHJldHVybnMgVGhlIHNpZGViYXIgZ3JvdXAuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzaWRlYmFyVHJlZVRvRW50cmllcyhub2RlOiBTaWRlYmFyVHJlZU5vZGUsIGxhYmVsOiBzdHJpbmcpOiBTaWRlYmFyRW50cnkge1xuICBjb25zdCBpdGVtczogKFNpZGViYXJFbnRyeSB8IFNpZGViYXJMaW5rKVtdID0gW107XG5cbiAgLy8gQ2hpbGQgZGlyZWN0b3J5IGdyb3VwcyBmaXJzdCAoYmVmb3JlIHRoaXMgbW9kdWxlJ3Mgb3duIHBhZ2VzKVxuICBjb25zdCBzb3J0ZWRDaGlsZHJlbiA9IFsuLi5ub2RlLmNoaWxkcmVuXS5zb3J0KChbYV0sIFtiXSkgPT4gYS5sb2NhbGVDb21wYXJlKGIpKTtcbiAgZm9yIChjb25zdCBbY2hpbGROYW1lLCBjaGlsZF0gb2Ygc29ydGVkQ2hpbGRyZW4pIHtcbiAgICBpdGVtcy5wdXNoKHNpZGViYXJUcmVlVG9FbnRyaWVzKGNoaWxkLCBjaGlsZE5hbWUpKTtcbiAgfVxuXG4gIC8vIFRoaXMgbW9kdWxlJ3Mgb3duIG92ZXJ2aWV3IHBhZ2UgKyB0eXBlL2Z1bmN0aW9uIHBhZ2VzIChpbmRpdmlkdWFsIG1lbWJlcnMgYXJlIG5vdCBsaXN0ZWQpLlxuICAvLyBTaWRlYmFyIGBsaW5rYCBmaWVsZHMgbXVzdCBOT1QgZW1iZWQgQkFTRV9QQVRIOiBTdGFybGlnaHQgcHJlcGVuZHMgdGhlIGNvbmZpZyBgYmFzZWAgdG8gZXZlcnlcbiAgLy8gc2lkZWJhciBsaW5rIGl0c2VsZiwgc28gaW5jbHVkaW5nIGl0IGhlcmUgd291bGQgZG91YmxlIHRoZSBiYXNlIChlLmcuIGAvYmFzZS9iYXNlL2FwaS8uLi5gIOKGkiA0MDQpLlxuICAvLyBUaGlzIGRpZmZlcnMgZnJvbSBpbi1jb250ZW50IGxpbmtzLCB3aGljaCBhcmUgcmF3IGFuY2hvcnMgdGhhdCBTdGFybGlnaHQgZG9lcyBub3QgYmFzZS1wcmVwZW5kLlxuICBpZiAobm9kZS50eXBlcy5sZW5ndGggPiAwKSB7XG4gICAgY29uc3QgeyBuYW1lc3BhY2UgfSA9IGVuc3VyZU5vbk51bGxhYmxlKG5vZGUudHlwZXNbMF0pO1xuICAgIGl0ZW1zLnB1c2goeyBsYWJlbDogJ092ZXJ2aWV3JywgbGluazogYC9hcGkvJHtuYW1lc3BhY2V9L2AgfSk7XG4gICAgY29uc3Qgc29ydGVkVHlwZXMgPSBbLi4ubm9kZS50eXBlc10uc29ydCgoYSwgYikgPT4gYS5uYW1lLmxvY2FsZUNvbXBhcmUoYi5uYW1lKSk7XG4gICAgZm9yIChjb25zdCB0IG9mIHNvcnRlZFR5cGVzKSB7XG4gICAgICBpdGVtcy5wdXNoKHsgbGFiZWw6IHQubmFtZSwgbGluazogYC9hcGkvJHt0Lm5hbWVzcGFjZX0vJHt0b1R5cGVSb3V0ZVNlZ21lbnQodC5uYW1lc3BhY2UsIHQubmFtZSl9L2AgfSk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHsgY29sbGFwc2VkOiB0cnVlLCBpdGVtcywgbGFiZWwgfTtcbn1cblxuLy8gU2VydmVzIGJvdGggYXMgdGhlIHJvb3QgQVBJIHBhZ2UncyBwcm9zZSBhbmQgKHN0cmlwcGVkKSBhcyBpdHMgYGRlc2NyaXB0aW9uYCBmcm9udG1hdHRlci5cbi8vIFNoYXJpbmcgb25lIGZ1bmN0aW9uIGtlZXBzIHRoZSBwYWdlIGFuZCBpdHMgT0cgY2FyZCBmcm9tIGRyaWZ0aW5nIGFwYXJ0LlxuZnVuY3Rpb24gZ2V0QXBpSW5kZXhJbnRybyhuYW1lc3BhY2VzOiByZWFkb25seSBzdHJpbmdbXSk6IHN0cmluZyB7XG4gIGNvbnN0IHsgcGFja2FnZU5hbWUgfSA9IGdldEFwaURvY1NldHRpbmdzKCk7XG4gIGNvbnN0IFtleGFtcGxlTmFtZXNwYWNlID0gJ21vZHVsZSddID0gbmFtZXNwYWNlcztcbiAgcmV0dXJuIGBUaGUgY29tcGxldGUgQVBJIHJlZmVyZW5jZSBmb3IgXFxgJHtwYWNrYWdlTmFtZX1cXGAsIGdlbmVyYXRlZCBmcm9tIGl0cyBUU0RvYy4gYFxuICAgICsgYEVhY2ggbW9kdWxlIGJlbG93IG1hcHMgdG8gYW4gaW1wb3J0IHN1YnBhdGggKGUuZy4gdGhlIFxcYCR7ZXhhbXBsZU5hbWVzcGFjZX1cXGAgbW9kdWxlIGlzIFxcYCR7cGFja2FnZU5hbWV9LyR7ZXhhbXBsZU5hbWVzcGFjZX1cXGApLmA7XG59XG5cbmZ1bmN0aW9uIGdldENvbXBvbmVudEltcG9ydHMoY29tcG9uZW50TmFtZXM6IHJlYWRvbmx5IHN0cmluZ1tdKTogc3RyaW5nW10ge1xuICByZXR1cm4gY29tcG9uZW50TmFtZXMubWFwKChjb21wb25lbnROYW1lKSA9PiBgaW1wb3J0ICR7Y29tcG9uZW50TmFtZX0gZnJvbSBcIiR7QVBJX0NPTVBPTkVOVFNfSU1QT1JUX1BSRUZJWH0vJHtjb21wb25lbnROYW1lfS5hc3Ryb1wiO2ApO1xufVxuXG5mdW5jdGlvbiByZW5kZXJOYW1lc3BhY2VUYWJsZShcbiAgbGluZXM6IHN0cmluZ1tdLFxuICBoZWFkaW5nOiBzdHJpbmcsXG4gIGNvbHVtbkxhYmVsOiBzdHJpbmcsXG4gIGVudHJpZXM6IFR5cGVJbmZvW10sXG4gIGFsbFR5cGVzOiBNYXA8c3RyaW5nLCBUeXBlSW5mbz4sXG4gIG5hbWVzcGFjZTogc3RyaW5nXG4pOiB2b2lkIHtcbiAgaWYgKGVudHJpZXMubGVuZ3RoID09PSAwKSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIGNvbnN0IHNvcnRlZCA9IFsuLi5lbnRyaWVzXS5zb3J0KChhLCBiKSA9PiBhLm5hbWUubG9jYWxlQ29tcGFyZShiLm5hbWUpKTtcbiAgbGluZXMucHVzaChgIyMgJHtoZWFkaW5nfWAsICcnLCBgfCAke2NvbHVtbkxhYmVsfSB8IERlc2NyaXB0aW9uIHxgLCAnfCA6LS0gfCA6LS0gfCcpO1xuICBmb3IgKGNvbnN0IGVudHJ5IG9mIHNvcnRlZCkge1xuICAgIGxpbmVzLnB1c2goYHwgWyR7ZW50cnkubmFtZX1dKC4vJHt0b1R5cGVSb3V0ZVNlZ21lbnQoZW50cnkubmFtZXNwYWNlLCBlbnRyeS5uYW1lKX0vKSB8ICR7ZXNjYXBlTWFya2Rvd24ocmVzb2x2ZUxpbmtzKGVudHJ5LmRlc2NyaXB0aW9uLCBhbGxUeXBlcywgbmFtZXNwYWNlKSl9IHxgKTtcbiAgfVxuICBsaW5lcy5wdXNoKCcnKTtcbn1cbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQU9BLHFCQUF1QztBQUN2Qyx5QkFBa0M7QUFDbEMsc0JBQTBCO0FBQzFCLHVCQUFxQjtBQVlyQiwrQkFBOEI7QUFDOUIsb0NBV087QUFDUCw4QkFBa0M7QUFDbEMsZ0NBa0JPO0FBQ1AsOEJBQTZDO0FBRTdDLE1BQU0sY0FBYztBQVFwQixlQUFzQix3QkFDcEIsY0FDQSxVQUNlO0FBQ2YsUUFBTSxZQUFZLDBCQUEwQixjQUFjLFFBQVE7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
568
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9kb2NzLXNpdGUvYXBpLWRvYy1wYWdlLWdlbmVyYXRpb24udHMiXSwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAZmlsZVxuICpcbiAqIE1EWCBwYWdlICsgc2lkZWJhciBlbWlzc2lvbjogcmVuZGVycyBtb2R1bGUgaW5kZXggcGFnZXMsIHBlci10eXBlIG92ZXJ2aWV3IHBhZ2VzLCBwZXItbWVtYmVyIHBhZ2VzLFxuICogYmFja2xpbmtzLCBhbmQgdGhlIFN0YXJsaWdodCBzaWRlYmFyIEpTT04uXG4gKi9cblxuaW1wb3J0IHsgZ2V0TWFuZGF0b3J5TmFtZWRHcm91cCB9IGZyb20gJ0BtbmFvdW1vdi90eXBlc2NyaXB0LWxpYi9yZWctZXhwJztcbmltcG9ydCB7IGVuc3VyZU5vbk51bGxhYmxlIH0gZnJvbSAnQG1uYW91bW92L3R5cGVzY3JpcHQtbGliL3R5cGUtZ3VhcmRzJztcbmltcG9ydCB7IHdyaXRlRmlsZSB9IGZyb20gJ25vZGU6ZnMvcHJvbWlzZXMnO1xuaW1wb3J0IHsgam9pbiB9IGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCB0eXBlIHtcbiAgTWVtYmVySW5mbyxcbiAgUGFnZUNvbnRlbnQsXG4gIFBhZ2VGcm9udE1hdHRlcixcbiAgU2lkZWJhckVudHJ5LFxuICBTaWRlYmFyTGluayxcbiAgU2lkZWJhclRyZWVOb2RlLFxuICBUeXBlSW5mb1xufSBmcm9tICcuL2FwaS1kb2MtdHlwZXMudHMnO1xuXG5pbXBvcnQgeyBFVkVOVF9NRVRIT0RTIH0gZnJvbSAnLi9hcGktZG9jLWNvbnN0YW50cy50cyc7XG5pbXBvcnQge1xuICBsaW5rQmFzZVR5cGUsXG4gIG1hcmtkb3duVG9IdG1sLFxuICBtZW1iZXJIcmVmLFxuICByZW5kZXJFeGFtcGxlTWR4LFxuICByZW5kZXJNZHhQcm9zZSxcbiAgcmVuZGVyVHlwZVdpdGhMaW5rcyxcbiAgcmVzb2x2ZUxpbmtzLFxuICB0b1R5cGVGaWxlU2VnbWVudCxcbiAgdG9UeXBlUm91dGVTZWdtZW50LFxuICB0eXBlTGlua1xufSBmcm9tICcuL2FwaS1kb2MtbGluay1yZW5kZXJpbmcudHMnO1xuaW1wb3J0IHsgZ2V0QXBpRG9jU2V0dGluZ3MgfSBmcm9tICcuL2FwaS1kb2Mtc2V0dGluZ3MudHMnO1xuaW1wb3J0IHtcbiAgZW5zdXJlRGlyZWN0b3J5LFxuICBlc2NhcGVKc1N0cmluZyxcbiAgZXNjYXBlSnN4QXR0cmlidXRlLFxuICBlc2NhcGVNYXJrZG93bixcbiAgZXNjYXBlTWR4QW5nbGVCcmFja2V0cyxcbiAgZXNjYXBlTWR4QnJhY2VzLFxuICBlc2NhcGVNZHhQcm9zZSxcbiAgZXNjYXBlWWFtbCxcbiAgZ2V0RGlzcGxheU5hbWUsXG4gIGdldEltcG9ydFN0YXRlbWVudCxcbiAgZ2V0TmFtZXNwYWNlRGlyZWN0b3J5LFxuICBtZW1iZXJSb3V0ZVNlZ21lbnQsXG4gIG1lbWJlclNsdWcsXG4gIG92ZXJsb2FkUm91dGVTZWdtZW50LFxuICBvdmVybG9hZFNsdWcsXG4gIHN0cmlwTWFya2Rvd24sXG4gIHRydW5jYXRlU2lnbmF0dXJlXG59IGZyb20gJy4vYXBpLWRvYy10ZXh0LXV0aWxzLnRzJztcbmltcG9ydCB7IEFQSV9DT01QT05FTlRTX0lNUE9SVF9QUkVGSVggfSBmcm9tICcuL2RvY3Mtc2l0ZS1hc3NldHMudHMnO1xuXG5jb25zdCBKU09OX0lOREVOVCA9IDI7XG5cbi8qKlxuICogQXBwZW5kIGJhY2tsaW5rcyB0byBvdmVydmlldyBwYWdlcyBhbmQgd3JpdGUgYWxsIGZpbGVzLiBLZXllZCBieSBxdWFsaWZpZWQgYCR7bmFtZXNwYWNlfSMke25hbWV9YC5cbiAqXG4gKiBAcGFyYW0gcGFnZUNvbnRlbnRzIC0gRXZlcnkgb3ZlcnZpZXcgcGFnZSdzIGNvbnRlbnQgYW5kIHBhdGgsIGtleWVkIGJ5IHF1YWxpZmllZCBpZC5cbiAqIEBwYXJhbSBhbGxUeXBlcyAtIEV2ZXJ5IGRvY3VtZW50ZWQgdHlwZSwga2V5ZWQgYnkgYCR7bmFtZXNwYWNlfSMke25hbWV9YC5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGFwcGVuZEJhY2tsaW5rc0FuZFdyaXRlKFxuICBwYWdlQ29udGVudHM6IE1hcDxzdHJpbmcsIFBhZ2VDb250ZW50PixcbiAgYWxsVHlwZXM6IE1hcDxzdHJpbmcsIFR5cGVJbmZvPlxuKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IGJhY2tsaW5rcyA9IGJ1aWxkQmFja2xpbmtzRnJvbUNvbnRlbnQocGFnZUNvbnRlbnRzLCBhbGxUeXBlcyk7XG5cbiAgZm9yIChjb25zdCBba2V5LCB7IGNvbnRlbnQsIGZpbGVQYXRoIH1dIG9mIHBhZ2VDb250ZW50cykge1xuICAgIGNvbnN0IHR5cGVCYWNrbGlua3MgPSBiYWNrbGlua3MuZ2V0KGtleSkgPz8gW107XG4gICAgY29uc3QgbGluZXMgPSBbY29udGVudF07XG4gICAgaWYgKHR5cGVCYWNrbGlua3MubGVuZ3RoID4gMCkge1xuICAgICAgY29uc3Qgc29ydGVkQmFja2xpbmtzID0gWy4uLnR5cGVCYWNrbGlua3NdLnNvcnQoKGEsIGIpID0+IGEubG9jYWxlQ29tcGFyZShiKSk7XG4gICAgICBsaW5lcy5wdXNoKCcnLCAnLS0tJywgJycsICcqKkxpbmtzIHRvIHRoaXMgcGFnZToqKicsICcnKTtcbiAgICAgIGZvciAoY29uc3QgYmxLZXkgb2Ygc29ydGVkQmFja2xpbmtzKSB7XG4gICAgICAgIGNvbnN0IGJsSW5mbyA9IGVuc3VyZU5vbk51bGxhYmxlKGFsbFR5cGVzLmdldChibEtleSkpO1xuICAgICAgICBjb25zdCBibE5zRGlyZWN0b3J5ID0gZ2V0TmFtZXNwYWNlRGlyZWN0b3J5KGJsSW5mby5uYW1lc3BhY2UpO1xuICAgICAgICBsaW5lcy5wdXNoKGAtIFske2JsSW5mby5uYW1lfV0oJHtnZXRBcGlEb2NTZXR0aW5ncygpLmJhc2VQYXRofS9hcGkvJHtibE5zRGlyZWN0b3J5fS8ke3RvVHlwZVJvdXRlU2VnbWVudChibEluZm8ubmFtZXNwYWNlLCBibEluZm8ubmFtZSl9LylgKTtcbiAgICAgIH1cbiAgICB9XG4gICAgYXdhaXQgd3JpdGVGaWxlKGZpbGVQYXRoLCBsaW5lcy5qb2luKCdcXG4nKSwgJ3V0Zi04Jyk7XG4gIH1cbn1cblxuLyoqXG4gKiBCdWlsZCBiYWNrbGlua3MgYnkgc2Nhbm5pbmcgZ2VuZXJhdGVkIHBhZ2UgY29udGVudCBmb3IgaW50ZXJuYWwgQVBJIGxpbmtzLiBLZXllZCBieSBxdWFsaWZpZWQgaWQuXG4gKlxuICogQHBhcmFtIHBhZ2VDb250ZW50cyAtIEV2ZXJ5IG92ZXJ2aWV3IHBhZ2UncyBjb250ZW50IGFuZCBwYXRoLCBrZXllZCBieSBxdWFsaWZpZWQgaWQuXG4gKiBAcGFyYW0gYWxsVHlwZXMgLSBFdmVyeSBkb2N1bWVudGVkIHR5cGUsIGtleWVkIGJ5IGAke25hbWVzcGFjZX0jJHtuYW1lfWAuXG4gKiBAcmV0dXJucyBFYWNoIHJlZmVyZW5jZWQgdHlwZSdzIHF1YWxpZmllZCBpZCBtYXBwZWQgdG8gdGhlIGlkcyBvZiB0aGUgcGFnZXMgbGlua2luZyB0byBpdC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGJ1aWxkQmFja2xpbmtzRnJvbUNvbnRlbnQoXG4gIHBhZ2VDb250ZW50czogTWFwPHN0cmluZywgUGFnZUNvbnRlbnQ+LFxuICBhbGxUeXBlczogTWFwPHN0cmluZywgVHlwZUluZm8+XG4pOiBNYXA8c3RyaW5nLCBzdHJpbmdbXT4ge1xuICBjb25zdCBiYWNrbGlua3MgPSBuZXcgTWFwPHN0cmluZywgc3RyaW5nW10+KCk7XG4gIC8vIEVtaXR0ZWQgVVJMcyBsb3dlcmNhc2UgdGhlIHR5cGUgc2VnbWVudCAoc2VlIHRvUm91dGVTZWdtZW50KSwgc28gbWFwIGVhY2ggbG93ZXJjYXNlZCByb3V0ZVxuICAvLyBpZGVudGl0eSBiYWNrIHRvIGl0cyBvcmlnaW5hbCBxdWFsaWZpZWQgdHlwZSBrZXkuXG4gIGNvbnN0IHJvdXRlS2V5VG9UeXBlS2V5ID0gbmV3IE1hcDxzdHJpbmcsIHN0cmluZz4oKTtcbiAgZm9yIChjb25zdCBbdHlwZUtleSwgaW5mb10gb2YgYWxsVHlwZXMpIHtcbiAgICByb3V0ZUtleVRvVHlwZUtleS5zZXQoYCR7Z2V0TmFtZXNwYWNlRGlyZWN0b3J5KGluZm8ubmFtZXNwYWNlKX0jJHt0b1R5cGVSb3V0ZVNlZ21lbnQoaW5mby5uYW1lc3BhY2UsIGluZm8ubmFtZSl9YCwgdHlwZUtleSk7XG4gIH1cbiAgY29uc3QgZXNjYXBlZEJhc2UgPSBnZXRBcGlEb2NTZXR0aW5ncygpLmJhc2VQYXRoLnJlcGxhY2VBbGwoL1suKis/XiR7fSgpfFtcXF1cXFxcXS9nLCBTdHJpbmcucmF3YFxcJCZgKTtcbiAgY29uc3QgbGlua1BhdHRlcm4gPSBuZXcgUmVnRXhwKGAke2VzY2FwZWRCYXNlfS9hcGkvKD88cGF0aD4oPzpbYS16QS1aMC05X0AtXSsvKSspYCwgJ2cnKTtcbiAgZm9yIChjb25zdCBbc291cmNlS2V5LCB7IGNvbnRlbnQgfV0gb2YgcGFnZUNvbnRlbnRzKSB7XG4gICAgY29uc3QgcmVmZXJlbmNlZCA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuXG4gICAgZm9yIChjb25zdCBtYXRjaCBvZiBjb250ZW50Lm1hdGNoQWxsKGxpbmtQYXR0ZXJuKSkge1xuICAgICAgLy8gVGhlIHBhdHRlcm4gcmVxdWlyZXMgYXQgbGVhc3Qgb25lIHNlZ21lbnQuXG4gICAgICBjb25zdCBzZWdtZW50cyA9IGdldE1hbmRhdG9yeU5hbWVkR3JvdXAobWF0Y2gsICdwYXRoJykuc3BsaXQoJy8nKS5maWx0ZXIoQm9vbGVhbik7XG4gICAgICBjb25zdCB0eXBlTmFtZSA9IGVuc3VyZU5vbk51bGxhYmxlKHNlZ21lbnRzLmF0KC0xKSk7XG4gICAgICBjb25zdCBuYW1lc3BhY2UgPSBzZWdtZW50cy5zbGljZSgwLCAtMSkuam9pbignLycpO1xuICAgICAgY29uc3Qgcm91dGVLZXkgPSBgJHtuYW1lc3BhY2V9IyR7dHlwZU5hbWV9YDtcbiAgICAgIGNvbnN0IHJlc29sdmVkS2V5ID0gcm91dGVLZXlUb1R5cGVLZXkuZ2V0KHJvdXRlS2V5KTtcbiAgICAgIGlmIChyZXNvbHZlZEtleSAhPT0gdW5kZWZpbmVkICYmIHJlc29sdmVkS2V5ICE9PSBzb3VyY2VLZXkpIHtcbiAgICAgICAgcmVmZXJlbmNlZC5hZGQocmVzb2x2ZWRLZXkpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGZvciAoY29uc3QgcmVmZXJlbmNlIG9mIHJlZmVyZW5jZWQpIHtcbiAgICAgIGlmICghYmFja2xpbmtzLmhhcyhyZWZlcmVuY2UpKSB7XG4gICAgICAgIGJhY2tsaW5rcy5zZXQocmVmZXJlbmNlLCBbXSk7XG4gICAgICB9XG4gICAgICBiYWNrbGlua3MuZ2V0KHJlZmVyZW5jZSk/LnB1c2goc291cmNlS2V5KTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gYmFja2xpbmtzO1xufVxuXG4vKipcbiAqIEJ1aWxkcyB0aGUgbmFtZXNwYWNlIHRyZWUgdGhlIHNpZGViYXIgaXMgZ2VuZXJhdGVkIGZyb20uXG4gKlxuICogQHBhcmFtIHR5cGVzIC0gVGhlIGRvY3VtZW50ZWQgdHlwZXMsIGtleWVkIGJ5IHF1YWxpZmllZCBpZC5cbiAqIEByZXR1cm5zIFRoZSByb290IG9mIHRoZSB0cmVlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gYnVpbGRTaWRlYmFyVHJlZSh0eXBlczogTWFwPHN0cmluZywgVHlwZUluZm8+KTogU2lkZWJhclRyZWVOb2RlIHtcbiAgY29uc3Qgcm9vdDogU2lkZWJhclRyZWVOb2RlID0geyBjaGlsZHJlbjogbmV3IE1hcCgpLCB0eXBlczogW10gfTtcbiAgZm9yIChjb25zdCBbLCBpbmZvXSBvZiB0eXBlcykge1xuICAgIGNvbnN0IHBhcnRzID0gaW5mby5uYW1lc3BhY2Uuc3BsaXQoJy8nKTtcbiAgICBsZXQgbm9kZSA9IHJvb3Q7XG4gICAgZm9yIChjb25zdCBwYXJ0IG9mIHBhcnRzKSB7XG4gICAgICBsZXQgY2hpbGQgPSBub2RlLmNoaWxkcmVuLmdldChwYXJ0KTtcbiAgICAgIGlmICghY2hpbGQpIHtcbiAgICAgICAgY2hpbGQgPSB7IGNoaWxkcmVuOiBuZXcgTWFwKCksIHR5cGVzOiBbXSB9O1xuICAgICAgICBub2RlLmNoaWxkcmVuLnNldChwYXJ0LCBjaGlsZCk7XG4gICAgICB9XG4gICAgICBub2RlID0gY2hpbGQ7XG4gICAgfVxuICAgIG5vZGUudHlwZXMucHVzaChpbmZvKTtcbiAgfVxuICByZXR1cm4gcm9vdDtcbn1cblxuLyoqXG4gKiBUaGUgcmF3IGNvZGUgc2lnbmF0dXJlIHNob3duIG9uIGEgdHlwZS1vdmVydmlldyBwYWdlJ3MgT0cgY2FyZCwgZm9yIHRoZSBraW5kcyB0aGF0IHJlbmRlciBhIHNpbmdsZVxuICogc2lnbmF0dXJlIGxpbmUgKGZ1bmN0aW9uIC8gdHlwZSBhbGlhcyAvIHZhcmlhYmxlKS4gQ2xhc3NlcywgaW50ZXJmYWNlcyBhbmQgZW51bXMgcmVuZGVyIG1lbWJlclxuICogdGFibGVzIGluc3RlYWQsIHNvIHRoZXkgZ2V0IG5vIHNpZ25hdHVyZSBibG9jay5cbiAqXG4gKiBAcGFyYW0gbmFtZSAtIFRoZSB0eXBlJ3MgbmFtZS5cbiAqIEBwYXJhbSBpbmZvIC0gVGhlIGRvY3VtZW50ZWQgdHlwZS5cbiAqIEByZXR1cm5zIFRoZSBzaWduYXR1cmUsIG9yIGB1bmRlZmluZWRgIGZvciBhIGtpbmQgdGhhdCByZW5kZXJzIG1lbWJlciB0YWJsZXMgaW5zdGVhZC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNvbXB1dGVPdmVydmlld1NpZ25hdHVyZShuYW1lOiBzdHJpbmcsIGluZm86IFR5cGVJbmZvKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgaWYgKGluZm8ua2luZCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIGNvbnN0ICRmdW5jdGlvbiA9IGluZm8ubWV0aG9kc1swXTtcbiAgICByZXR1cm4gJGZ1bmN0aW9uID8gYGZ1bmN0aW9uICR7JGZ1bmN0aW9uLnNpZ25hdHVyZX06ICR7JGZ1bmN0aW9uLnJldHVyblR5cGV9YCA6IHVuZGVmaW5lZDtcbiAgfVxuICBpZiAoaW5mby5raW5kID09PSAndHlwZScpIHtcbiAgICByZXR1cm4gYHR5cGUgJHtnZXREaXNwbGF5TmFtZShpbmZvLm5hbWUsIGluZm8pfSA9ICR7aW5mby50eXBlQWxpYXNUZXh0ID8/ICd1bmtub3duJ31gO1xuICB9XG4gIHJldHVybiBpbmZvLmtpbmQgPT09ICd2YXJpYWJsZScgPyBgJHtpbmZvLnZhcmlhYmxlS2V5d29yZCA/PyAnbGV0J30gJHtuYW1lfTogJHtpbmZvLnZhcmlhYmxlVHlwZSA/PyAndW5rbm93bid9YCA6IHVuZGVmaW5lZDtcbn1cblxuLyoqXG4gKiBXcml0ZXMgb25lIHBhZ2UgcGVyIG93biBwcm9wZXJ0eSBhbmQgcGVyIG93biBtZXRob2Qgb3ZlcmxvYWQga2V5IG9mIGEgY2xhc3Mgb3IgaW50ZXJmYWNlLlxuICpcbiAqIEBwYXJhbSBuYW1lIC0gVGhlIHR5cGUncyBuYW1lLlxuICogQHBhcmFtIGluZm8gLSBUaGUgZG9jdW1lbnRlZCB0eXBlLlxuICogQHBhcmFtIGFsbFR5cGVzIC0gRXZlcnkgZG9jdW1lbnRlZCB0eXBlLCBrZXllZCBieSBgJHtuYW1lc3BhY2V9IyR7bmFtZX1gLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVNZW1iZXJQYWdlcyhuYW1lOiBzdHJpbmcsIGluZm86IFR5cGVJbmZvLCBhbGxUeXBlczogTWFwPHN0cmluZywgVHlwZUluZm8+KTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IG5zRGlyZWN0b3J5ID0gZ2V0TmFtZXNwYWNlRGlyZWN0b3J5KGluZm8ubmFtZXNwYWNlKTtcbiAgY29uc3QgdHlwZUZpbGVEaXJlY3RvcnkgPSB0b1R5cGVGaWxlU2VnbWVudChpbmZvLm5hbWVzcGFjZSwgbmFtZSk7XG4gIGNvbnN0IHR5cGVSb3V0ZURpcmVjdG9yeSA9IHRvVHlwZVJvdXRlU2VnbWVudChpbmZvLm5hbWVzcGFjZSwgbmFtZSk7XG4gIGNvbnN0IGNvbXBvbmVudEltcG9ydHMgPSBnZXRDb21wb25lbnRJbXBvcnRzKFsnTWVtYmVyRGV0YWlsJ10pO1xuXG4gIC8vIFByb3BlcnR5IHBhZ2VzIChza2lwIGluaGVyaXRlZCDigJQgdGhleSBsaXZlIG9uIHRoZSBwYXJlbnQgdHlwZSlcbiAgY29uc3QgcHJvcGVydGllcyA9IGluZm8ucHJvcGVydGllcy5maWx0ZXIoKHApID0+ICFwLmluaGVyaXRlZEZyb20pO1xuICBmb3IgKGNvbnN0IHByb3BlcnR5IG9mIHByb3BlcnRpZXMpIHtcbiAgICBjb25zdCBmaWxlUGF0aCA9IGpvaW4oZ2V0QXBpRG9jU2V0dGluZ3MoKS5vdXRwdXREaXJlY3RvcnksIG5zRGlyZWN0b3J5LCB0eXBlRmlsZURpcmVjdG9yeSwgYCR7bWVtYmVyU2x1Zyhwcm9wZXJ0eS5uYW1lKX0ubWR4YCk7XG4gICAgYXdhaXQgZW5zdXJlRGlyZWN0b3J5KGZpbGVQYXRoKTtcblxuICAgIGNvbnN0IHByb3BlcnR5VGl0bGUgPSBgJHtuYW1lfS4ke3Byb3BlcnR5Lm5hbWV9YDtcbiAgICBjb25zdCBsaW5lczogc3RyaW5nW10gPSByZW5kZXJGcm9udE1hdHRlcih7XG4gICAgICBkZXNjcmlwdGlvbjogcHJvcGVydHkuZGVzY3JpcHRpb24sXG4gICAgICBzaWRlYmFyTGFiZWw6IHByb3BlcnR5VGl0bGUsXG4gICAgICBzaWduYXR1cmU6IGAke3Byb3BlcnR5LnNpZ25hdHVyZX06ICR7cHJvcGVydHkudHlwZX1gLFxuICAgICAgc2x1ZzogYGFwaS8ke25zRGlyZWN0b3J5fS8ke3R5cGVSb3V0ZURpcmVjdG9yeX0vJHttZW1iZXJSb3V0ZVNlZ21lbnQocHJvcGVydHkubmFtZSl9YCxcbiAgICAgIHRpdGxlOiBwcm9wZXJ0eVRpdGxlXG4gICAgfSk7XG4gICAgbGluZXMucHVzaChcbiAgICAgIC4uLmNvbXBvbmVudEltcG9ydHMsXG4gICAgICAnJyxcbiAgICAgIC8vIEJyZWFkY3J1bWJcbiAgICAgIGBbJHtuYW1lfV0oJHtnZXRBcGlEb2NTZXR0aW5ncygpLmJhc2VQYXRofS9hcGkvJHtuc0RpcmVjdG9yeX0vJHt0eXBlUm91dGVEaXJlY3Rvcnl9Lykg4oC6ICR7cHJvcGVydHkubmFtZX1gLFxuICAgICAgJydcbiAgICApO1xuXG4gICAgY29uc3Qgc3RhdGljQXR0cmlidXRlID0gcHJvcGVydHkuaXNTdGF0aWMgPyAnIGlzU3RhdGljPXt0cnVlfScgOiAnJztcbiAgICBjb25zdCB0eXBlQXR0cmlidXRlID0gYCB0eXBlPVwiJHtlc2NhcGVKc3hBdHRyaWJ1dGUobWFya2Rvd25Ub0h0bWwocmVuZGVyVHlwZVdpdGhMaW5rcyhwcm9wZXJ0eS50eXBlLCBhbGxUeXBlcywgbmFtZSwgaW5mby5uYW1lc3BhY2UpKSl9XCJgO1xuICAgIGNvbnN0IGRlc2NBdHRyaWJ1dGUgPSBwcm9wZXJ0eS5kZXNjcmlwdGlvbiA/IGAgZGVzY3JpcHRpb249XCIke2VzY2FwZUpzeEF0dHJpYnV0ZShtYXJrZG93blRvSHRtbChyZXNvbHZlTGlua3MocHJvcGVydHkuZGVzY3JpcHRpb24sIGFsbFR5cGVzLCBpbmZvLm5hbWVzcGFjZSkpKX1cImAgOiAnJztcbiAgICBjb25zdCByZW1hcmtzQXR0cmlidXRlID0gcHJvcGVydHkucmVtYXJrcyA/IGAgcmVtYXJrcz1cIiR7ZXNjYXBlSnN4QXR0cmlidXRlKG1hcmtkb3duVG9IdG1sKHJlc29sdmVMaW5rcyhwcm9wZXJ0eS5yZW1hcmtzLCBhbGxUeXBlcywgaW5mby5uYW1lc3BhY2UpKSl9XCJgIDogJyc7XG4gICAgY29uc3Qgc2luY2VBdHRyaWJ1dGUgPSBwcm9wZXJ0eS5zaW5jZSA/IGAgc2luY2U9XCIke2VzY2FwZUpzeEF0dHJpYnV0ZShwcm9wZXJ0eS5zaW5jZSl9XCJgIDogJyc7XG4gICAgY29uc3QgZXhhbXBsZXNBdHRyaWJ1dGUgPSBwcm9wZXJ0eS5leGFtcGxlcy5sZW5ndGggPiAwID8gYCBleGFtcGxlcz17JHtKU09OLnN0cmluZ2lmeShwcm9wZXJ0eS5leGFtcGxlcyl9fWAgOiAnJztcblxuICAgIGxpbmVzLnB1c2goYDxNZW1iZXJEZXRhaWwke3N0YXRpY0F0dHJpYnV0ZX0ke3R5cGVBdHRyaWJ1dGV9JHtkZXNjQXR0cmlidXRlfSR7cmVtYXJrc0F0dHJpYnV0ZX0ke3NpbmNlQXR0cmlidXRlfSR7ZXhhbXBsZXNBdHRyaWJ1dGV9IC8+YCwgJycpO1xuXG4gICAgYXdhaXQgd3JpdGVGaWxlKGZpbGVQYXRoLCBsaW5lcy5qb2luKCdcXG4nKSwgJ3V0Zi04Jyk7XG4gIH1cblxuICAvLyBNZXRob2QgcGFnZXMg4oCUIGVhY2ggb3ZlcmxvYWQga2V5IGdldHMgaXRzIG93biBwYWdlIChza2lwIGluaGVyaXRlZClcbiAgY29uc3QgbWV0aG9kcyA9IGluZm8ubWV0aG9kcy5maWx0ZXIoKG0pID0+ICFtLmluaGVyaXRlZEZyb20pO1xuICBjb25zdCBvdmVybG9hZEdyb3VwcyA9IG5ldyBNYXA8c3RyaW5nLCBNZW1iZXJJbmZvW10+KCk7XG4gIGZvciAoY29uc3QgbWV0aG9kIG9mIG1ldGhvZHMpIHtcbiAgICBjb25zdCBrZXkgPSBtZXRob2Qub3ZlcmxvYWRLZXk7XG4gICAgaWYgKCFvdmVybG9hZEdyb3Vwcy5oYXMoa2V5KSkge1xuICAgICAgb3ZlcmxvYWRHcm91cHMuc2V0KGtleSwgW10pO1xuICAgIH1cbiAgICBvdmVybG9hZEdyb3Vwcy5nZXQoa2V5KT8ucHVzaChtZXRob2QpO1xuICB9XG5cbiAgZm9yIChjb25zdCBbb3ZlcmxvYWRLZXksIG92ZXJsb2Fkc10gb2Ygb3ZlcmxvYWRHcm91cHMpIHtcbiAgICBjb25zdCBmaWxlU2x1ZyA9IG92ZXJsb2FkU2x1ZyhvdmVybG9hZEtleSk7XG4gICAgY29uc3QgZmlsZVBhdGggPSBqb2luKGdldEFwaURvY1NldHRpbmdzKCkub3V0cHV0RGlyZWN0b3J5LCBuc0RpcmVjdG9yeSwgdHlwZUZpbGVEaXJlY3RvcnksIGAke2ZpbGVTbHVnfS5tZHhgKTtcbiAgICBhd2FpdCBlbnN1cmVEaXJlY3RvcnkoZmlsZVBhdGgpO1xuXG4gICAgY29uc3QgZGlzcGxheU5hbWUgPSBgJHtuYW1lfS4ke292ZXJsb2FkS2V5fSBtZXRob2RgO1xuICAgIC8vIEEgZ3JvdXAgaXMgY3JlYXRlZCBieSBpdHMgZmlyc3Qgb3ZlcmxvYWQuXG4gICAgY29uc3QgZmlyc3RPdmVybG9hZCA9IGVuc3VyZU5vbk51bGxhYmxlKG92ZXJsb2Fkc1swXSk7XG5cbiAgICBjb25zdCBsaW5lczogc3RyaW5nW10gPSByZW5kZXJGcm9udE1hdHRlcih7XG4gICAgICBkZXNjcmlwdGlvbjogZmlyc3RPdmVybG9hZC5kZXNjcmlwdGlvbixcbiAgICAgIHNpZGViYXJMYWJlbDogYCR7bmFtZX0uJHtvdmVybG9hZEtleX1gLFxuICAgICAgc2lnbmF0dXJlOiBgJHtmaXJzdE92ZXJsb2FkLnNpZ25hdHVyZX06ICR7Zmlyc3RPdmVybG9hZC5yZXR1cm5UeXBlfWAsXG4gICAgICBzbHVnOiBgYXBpLyR7bnNEaXJlY3Rvcnl9LyR7dHlwZVJvdXRlRGlyZWN0b3J5fS8ke292ZXJsb2FkUm91dGVTZWdtZW50KG92ZXJsb2FkS2V5KX1gLFxuICAgICAgdGl0bGU6IGRpc3BsYXlOYW1lXG4gICAgfSk7XG4gICAgbGluZXMucHVzaChcbiAgICAgIC4uLmNvbXBvbmVudEltcG9ydHMsXG4gICAgICAnJyxcbiAgICAgIC8vIEJyZWFkY3J1bWJcbiAgICAgIGBbJHtuYW1lfV0oJHtnZXRBcGlEb2NTZXR0aW5ncygpLmJhc2VQYXRofS9hcGkvJHtuc0RpcmVjdG9yeX0vJHt0eXBlUm91dGVEaXJlY3Rvcnl9Lykg4oC6ICR7b3ZlcmxvYWRLZXl9YCxcbiAgICAgICcnXG4gICAgKTtcblxuICAgIGZvciAoY29uc3Qgb3ZlcmxvYWQgb2Ygb3ZlcmxvYWRzKSB7XG4gICAgICByZW5kZXJNZXRob2RPdmVybG9hZE1keChsaW5lcywgb3ZlcmxvYWQsIG5hbWUsIGluZm8ubmFtZXNwYWNlLCBhbGxUeXBlcyk7XG4gICAgICBpZiAob3ZlcmxvYWRzLmxlbmd0aCA+IDEpIHtcbiAgICAgICAgbGluZXMucHVzaCgnLS0tJywgJycpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGF3YWl0IHdyaXRlRmlsZShmaWxlUGF0aCwgbGluZXMuam9pbignXFxuJyksICd1dGYtOCcpO1xuICB9XG59XG5cbi8qKlxuICogV3JpdGVzIGVhY2ggbW9kdWxlJ3MgaW5kZXggcGFnZSBhbmQgdGhlIHJvb3QgQVBJIGluZGV4LlxuICpcbiAqIEBwYXJhbSB0eXBlcyAtIFRoZSBkb2N1bWVudGVkIHR5cGVzLCBrZXllZCBieSBxdWFsaWZpZWQgaWQuXG4gKiBAcGFyYW0gYWxsVHlwZXMgLSBFdmVyeSBkb2N1bWVudGVkIHR5cGUsIGtleWVkIGJ5IGAke25hbWVzcGFjZX0jJHtuYW1lfWAuXG4gKiBAcGFyYW0gbW9kdWxlT3ZlcnZpZXdzIC0gRWFjaCBuYW1lc3BhY2UncyBgQGZpbGVgIG92ZXJ2aWV3LlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVOYW1lc3BhY2VJbmRleFBhZ2VzKFxuICB0eXBlczogTWFwPHN0cmluZywgVHlwZUluZm8+LFxuICBhbGxUeXBlczogTWFwPHN0cmluZywgVHlwZUluZm8+LFxuICBtb2R1bGVPdmVydmlld3M6IE1hcDxzdHJpbmcsIHN0cmluZz5cbik6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCBuYW1lc3BhY2VzID0gbmV3IE1hcDxzdHJpbmcsIFR5cGVJbmZvW10+KCk7XG4gIGZvciAoY29uc3QgWywgaW5mb10gb2YgdHlwZXMpIHtcbiAgICBpZiAoIW5hbWVzcGFjZXMuaGFzKGluZm8ubmFtZXNwYWNlKSkge1xuICAgICAgbmFtZXNwYWNlcy5zZXQoaW5mby5uYW1lc3BhY2UsIFtdKTtcbiAgICB9XG4gICAgbmFtZXNwYWNlcy5nZXQoaW5mby5uYW1lc3BhY2UpPy5wdXNoKGluZm8pO1xuICB9XG5cbiAgZm9yIChjb25zdCBbbmFtZXNwYWNlLCBuc1R5cGVzXSBvZiBuYW1lc3BhY2VzKSB7XG4gICAgY29uc3QgbnNEaXJlY3RvcnkgPSBnZXROYW1lc3BhY2VEaXJlY3RvcnkobmFtZXNwYWNlKTtcbiAgICBjb25zdCBmaWxlUGF0aCA9IGpvaW4oZ2V0QXBpRG9jU2V0dGluZ3MoKS5vdXRwdXREaXJlY3RvcnksIG5zRGlyZWN0b3J5LCAnaW5kZXgubWR4Jyk7XG4gICAgYXdhaXQgZW5zdXJlRGlyZWN0b3J5KGZpbGVQYXRoKTtcblxuICAgIC8vIFRoZSBtb2R1bGUncyBgQGZpbGVgIHRleHQgZG91YmxlcyBhcyBpdHMgZGVzY3JpcHRpb24uXG4gICAgLy8gV2l0aG91dCBpdCB0aGUgbW9kdWxlIGNhcmQgd2FzIHRpdGxlLW9ubHkgd2hpbGUgZXZlcnkgbWVtYmVyIGNhcmQgdW5kZXIgaXQgY2FycmllZCBvbmUuXG4gICAgY29uc3Qgb3ZlcnZpZXcgPSBtb2R1bGVPdmVydmlld3MuZ2V0KG5hbWVzcGFjZSk7XG4gICAgY29uc3QgbGluZXM6IHN0cmluZ1tdID0gcmVuZGVyRnJvbnRNYXR0ZXIoe1xuICAgICAgZGVzY3JpcHRpb246IG92ZXJ2aWV3LFxuICAgICAgc2lkZWJhckxhYmVsOiBuYW1lc3BhY2UsXG4gICAgICBzbHVnOiBgYXBpLyR7bnNEaXJlY3Rvcnl9YCxcbiAgICAgIHRpdGxlOiBuYW1lc3BhY2VcbiAgICB9KTtcblxuICAgIC8vIE1vZHVsZSBAZmlsZSBvdmVydmlldyB0ZXh0XG4gICAgaWYgKG92ZXJ2aWV3KSB7XG4gICAgICBsaW5lcy5wdXNoKHJlbmRlck1keFByb3NlKG92ZXJ2aWV3LCBhbGxUeXBlcywgbmFtZXNwYWNlKSwgJycpO1xuICAgIH1cblxuICAgIHJlbmRlck5hbWVzcGFjZVRhYmxlKGxpbmVzLCAnQ2xhc3NlcycsICdDbGFzcycsIG5zVHlwZXMuZmlsdGVyKCh0KSA9PiB0LmtpbmQgPT09ICdjbGFzcycpLCBhbGxUeXBlcywgbmFtZXNwYWNlKTtcbiAgICByZW5kZXJOYW1lc3BhY2VUYWJsZShsaW5lcywgJ0ludGVyZmFjZXMnLCAnSW50ZXJmYWNlJywgbnNUeXBlcy5maWx0ZXIoKHQpID0+IHQua2luZCA9PT0gJ2ludGVyZmFjZScpLCBhbGxUeXBlcywgbmFtZXNwYWNlKTtcbiAgICByZW5kZXJOYW1lc3BhY2VUYWJsZShsaW5lcywgJ0Z1bmN0aW9ucycsICdGdW5jdGlvbicsIG5zVHlwZXMuZmlsdGVyKCh0KSA9PiB0LmtpbmQgPT09ICdmdW5jdGlvbicpLCBhbGxUeXBlcywgbmFtZXNwYWNlKTtcbiAgICByZW5kZXJOYW1lc3BhY2VUYWJsZShsaW5lcywgJ1R5cGVzJywgJ1R5cGUnLCBuc1R5cGVzLmZpbHRlcigodCkgPT4gdC5raW5kID09PSAndHlwZScpLCBhbGxUeXBlcywgbmFtZXNwYWNlKTtcbiAgICByZW5kZXJOYW1lc3BhY2VUYWJsZShsaW5lcywgJ0VudW1zJywgJ0VudW0nLCBuc1R5cGVzLmZpbHRlcigodCkgPT4gdC5raW5kID09PSAnZW51bScpLCBhbGxUeXBlcywgbmFtZXNwYWNlKTtcbiAgICByZW5kZXJOYW1lc3BhY2VUYWJsZShsaW5lcywgJ1ZhcmlhYmxlcycsICdWYXJpYWJsZScsIG5zVHlwZXMuZmlsdGVyKCh0KSA9PiB0LmtpbmQgPT09ICd2YXJpYWJsZScpLCBhbGxUeXBlcywgbmFtZXNwYWNlKTtcblxuICAgIGF3YWl0IHdyaXRlRmlsZShmaWxlUGF0aCwgbGluZXMuam9pbignXFxuJyksICd1dGYtOCcpO1xuICB9XG5cbiAgLy8gUm9vdCBBUEkgaW5kZXggcGFnZSBsaXN0aW5nIGV2ZXJ5IG1vZHVsZS5cbiAgY29uc3Qgc29ydGVkTmFtZXNwYWNlcyA9IFsuLi5uYW1lc3BhY2VzLmtleXMoKV0uc29ydCgoYSwgYikgPT4gYS5sb2NhbGVDb21wYXJlKGIpKTtcbiAgY29uc3QgYXBpSW5kZXhJbnRybyA9IGdldEFwaUluZGV4SW50cm8oc29ydGVkTmFtZXNwYWNlcyk7XG4gIGNvbnN0IHJvb3RMaW5lczogc3RyaW5nW10gPSByZW5kZXJGcm9udE1hdHRlcih7XG4gICAgZGVzY3JpcHRpb246IGFwaUluZGV4SW50cm8sXG4gICAgc2lkZWJhckxhYmVsOiAnT3ZlcnZpZXcnLFxuICAgIHNsdWc6ICdhcGknLFxuICAgIHRpdGxlOiAnQVBJIHJlZmVyZW5jZSdcbiAgfSk7XG4gIHJvb3RMaW5lcy5wdXNoKGFwaUluZGV4SW50cm8sICcnLCAnIyMgTW9kdWxlcycsICcnKTtcbiAgZm9yIChjb25zdCBuYW1lc3BhY2Ugb2Ygc29ydGVkTmFtZXNwYWNlcykge1xuICAgIHJvb3RMaW5lcy5wdXNoKGAtIFske25hbWVzcGFjZX1dKCR7Z2V0QXBpRG9jU2V0dGluZ3MoKS5iYXNlUGF0aH0vYXBpLyR7Z2V0TmFtZXNwYWNlRGlyZWN0b3J5KG5hbWVzcGFjZSl9LylgKTtcbiAgfVxuICByb290TGluZXMucHVzaCgnJyk7XG4gIGNvbnN0IHJvb3RGaWxlUGF0aCA9IGpvaW4oZ2V0QXBpRG9jU2V0dGluZ3MoKS5vdXRwdXREaXJlY3RvcnksICdpbmRleC5tZHgnKTtcbiAgYXdhaXQgZW5zdXJlRGlyZWN0b3J5KHJvb3RGaWxlUGF0aCk7XG4gIGF3YWl0IHdyaXRlRmlsZShyb290RmlsZVBhdGgsIHJvb3RMaW5lcy5qb2luKCdcXG4nKSwgJ3V0Zi04Jyk7XG59XG5cbi8qKlxuICogUmVuZGVycyBhIHR5cGUncyBvdmVydmlldyBwYWdlLlxuICpcbiAqIEBwYXJhbSBuYW1lIC0gVGhlIHR5cGUncyBuYW1lLlxuICogQHBhcmFtIGluZm8gLSBUaGUgZG9jdW1lbnRlZCB0eXBlLlxuICogQHBhcmFtIGFsbFR5cGVzIC0gRXZlcnkgZG9jdW1lbnRlZCB0eXBlLCBrZXllZCBieSBgJHtuYW1lc3BhY2V9IyR7bmFtZX1gLlxuICogQHJldHVybnMgVGhlIHBhZ2UncyBjb250ZW50LCBiZWZvcmUgYmFja2xpbmtzLCBhbmQgdGhlIHBhdGggaXQgaXMgd3JpdHRlbiB0by5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdlbmVyYXRlT3ZlcnZpZXdQYWdlKG5hbWU6IHN0cmluZywgaW5mbzogVHlwZUluZm8sIGFsbFR5cGVzOiBNYXA8c3RyaW5nLCBUeXBlSW5mbz4pOiBQcm9taXNlPFBhZ2VDb250ZW50PiB7XG4gIGNvbnN0IG5zRGlyZWN0b3J5ID0gZ2V0TmFtZXNwYWNlRGlyZWN0b3J5KGluZm8ubmFtZXNwYWNlKTtcbiAgY29uc3QgdHlwZUZpbGVTbHVnID0gdG9UeXBlRmlsZVNlZ21lbnQoaW5mby5uYW1lc3BhY2UsIG5hbWUpO1xuICBjb25zdCB0eXBlUm91dGVTbHVnID0gdG9UeXBlUm91dGVTZWdtZW50KGluZm8ubmFtZXNwYWNlLCBuYW1lKTtcbiAgY29uc3QgZmlsZVBhdGggPSBqb2luKGdldEFwaURvY1NldHRpbmdzKCkub3V0cHV0RGlyZWN0b3J5LCBuc0RpcmVjdG9yeSwgdHlwZUZpbGVTbHVnLCAnaW5kZXgubWR4Jyk7XG4gIGF3YWl0IGVuc3VyZURpcmVjdG9yeShmaWxlUGF0aCk7XG5cbiAgLy8gRnJvbnRtYXR0ZXJcbiAgY29uc3QgZGlzcGxheU5hbWUgPSBnZXREaXNwbGF5TmFtZShuYW1lLCBpbmZvKTtcbiAgY29uc3QgbGluZXM6IHN0cmluZ1tdID0gcmVuZGVyRnJvbnRNYXR0ZXIoe1xuICAgIGRlc2NyaXB0aW9uOiBpbmZvLmRlc2NyaXB0aW9uLFxuICAgIHNpZGViYXJMYWJlbDogZGlzcGxheU5hbWUsXG4gICAgc2lnbmF0dXJlOiBjb21wdXRlT3ZlcnZpZXdTaWduYXR1cmUobmFtZSwgaW5mbyksXG4gICAgc2x1ZzogYGFwaS8ke25zRGlyZWN0b3J5fS8ke3R5cGVSb3V0ZVNsdWd9YCxcbiAgICB0aXRsZTogZGlzcGxheU5hbWVcbiAgfSk7XG5cbiAgLy8gQ29tcG9uZW50IGltcG9ydHMg4oCUIGNvbXB1dGUgcmVsYXRpdmUgcGF0aCBmcm9tIGdlbmVyYXRlZCBwYWdlIHRvIGNvbXBvbmVudHNcbiAgbGluZXMucHVzaCguLi5nZXRDb21wb25lbnRJbXBvcnRzKFsnQ29uc3RydWN0b3JCbG9jaycsICdJbXBvcnRTdGF0ZW1lbnQnLCAnTWV0aG9kVGFibGUnLCAnUHJvcGVydHlUYWJsZScsICdUeXBlU2lnbmF0dXJlJ10pLCAnJyk7XG5cbiAgLy8gRGVzY3JpcHRpb25cbiAgaWYgKGluZm8uZGVzY3JpcHRpb24pIHtcbiAgICBsaW5lcy5wdXNoKHJlbmRlck1keFByb3NlKGluZm8uZGVzY3JpcHRpb24sIGFsbFR5cGVzLCBpbmZvLm5hbWVzcGFjZSksICcnKTtcbiAgfVxuXG4gIC8vIFJlbWFya3NcbiAgaWYgKGluZm8ucmVtYXJrcykge1xuICAgIGNvbnN0IHJlbWFya3NCbG9jayA9IHJlbmRlck1keFByb3NlKGluZm8ucmVtYXJrcywgYWxsVHlwZXMsIGluZm8ubmFtZXNwYWNlKTtcbiAgICBsaW5lcy5wdXNoKHJlbWFya3NCbG9jay5zcGxpdCgnXFxuJykubWFwKChsaW5lKSA9PiAobGluZS5sZW5ndGggPiAwID8gYD4gJHtsaW5lfWAgOiAnPicpKS5qb2luKCdcXG4nKSwgJycpO1xuICB9XG5cbiAgLy8gSW1wb3J0IHN0YXRlbWVudFxuICBjb25zdCBpbXBvcnRTdGF0ZW1lbnQgPSBnZXRJbXBvcnRTdGF0ZW1lbnQoaW5mbyk7XG4gIGlmIChpbXBvcnRTdGF0ZW1lbnQgIT09IHVuZGVmaW5lZCkge1xuICAgIGxpbmVzLnB1c2goYDxJbXBvcnRTdGF0ZW1lbnQgdGV4dD1cIiR7ZXNjYXBlSnN4QXR0cmlidXRlKGltcG9ydFN0YXRlbWVudCl9XCIgLz5gLCAnJyk7XG4gIH1cblxuICAvLyBFeGFtcGxlc1xuICBmb3IgKGNvbnN0IGV4YW1wbGUgb2YgaW5mby5leGFtcGxlcykge1xuICAgIGxpbmVzLnB1c2goJyoqRXhhbXBsZToqKicsICcnLCByZW5kZXJFeGFtcGxlTWR4KGV4YW1wbGUsIGFsbFR5cGVzLCBpbmZvLm5hbWVzcGFjZSksICcnKTtcbiAgfVxuXG4gIC8vIEZ1bmN0aW9ucyByZW5kZXIgbGlrZSBtZXRob2QgZGV0YWlsIHBhZ2VzIOKAlCBzaWduYXR1cmUsIHBhcmFtcywgcmV0dXJuc1xuICBpZiAoaW5mby5raW5kID09PSAnZnVuY3Rpb24nKSB7XG4gICAgcmVuZGVyRnVuY3Rpb25QYWdlKGxpbmVzLCBpbmZvLCBhbGxUeXBlcyk7XG4gICAgcmV0dXJuIHsgY29udGVudDogbGluZXMuam9pbignXFxuJyksIGZpbGVQYXRoIH07XG4gIH1cblxuICAvLyBWYXJpYWJsZXMgcmVuZGVyIHdpdGggZGVjbGFyYXRpb24ga2V5d29yZCBhbmQgdHlwZVxuICBpZiAoaW5mby5raW5kID09PSAndmFyaWFibGUnKSB7XG4gICAgcmVuZGVyVmFyaWFibGVQYWdlKGxpbmVzLCBuYW1lLCBpbmZvLCBhbGxUeXBlcyk7XG4gICAgcmV0dXJuIHsgY29udGVudDogbGluZXMuam9pbignXFxuJyksIGZpbGVQYXRoIH07XG4gIH1cblxuICAvLyBFbnVtcyByZW5kZXIgdGhlaXIgbWVtYmVycyBsaXN0XG4gIGlmIChpbmZvLmtpbmQgPT09ICdlbnVtJykge1xuICAgIHJlbmRlckVudW1QYWdlKGxpbmVzLCBpbmZvLCBhbGxUeXBlcyk7XG4gICAgcmV0dXJuIHsgY29udGVudDogbGluZXMuam9pbignXFxuJyksIGZpbGVQYXRoIH07XG4gIH1cblxuICAvLyBUeXBlIGFsaWFzZXMgcmVuZGVyIHRoZWlyIHJpZ2h0LWhhbmQtc2lkZSBzaWduYXR1cmVcbiAgaWYgKGluZm8ua2luZCA9PT0gJ3R5cGUnKSB7XG4gICAgcmVuZGVyVHlwZUFsaWFzUGFnZShsaW5lcywgaW5mbywgYWxsVHlwZXMpO1xuICAgIHJldHVybiB7IGNvbnRlbnQ6IGxpbmVzLmpvaW4oJ1xcbicpLCBmaWxlUGF0aCB9O1xuICB9XG5cbiAgLy8gQ2xhc3NlcyAvIGludGVyZmFjZXM6IHNpZ25hdHVyZSArIGV4dGVuZHMvaW1wbGVtZW50cyArIGNvbnN0cnVjdG9yICsgbWVtYmVyIHRhYmxlc1xuICBjb25zdCB0eXBlUGFyYW1zQXR0cmlidXRlID0gaW5mby50eXBlUGFyYW1ldGVycy5sZW5ndGggPiAwID8gYCB0eXBlUGFyYW1zPXske0pTT04uc3RyaW5naWZ5KGluZm8udHlwZVBhcmFtZXRlcnMpfX1gIDogJyc7XG4gIGNvbnN0IGV4dGVuZHNBdHRyaWJ1dGUgPSBpbmZvLmJhc2VUeXBlcy5sZW5ndGggPiAwID8gYCBleHRlbmRzPXske0pTT04uc3RyaW5naWZ5KGluZm8uYmFzZVR5cGVzKX19YCA6ICcnO1xuICBjb25zdCBpbXBsZW1lbnRzQXR0cmlidXRlID0gaW5mby5pbXBsZW1lbnRzVHlwZXMubGVuZ3RoID4gMCA/IGAgaW1wbGVtZW50cz17JHtKU09OLnN0cmluZ2lmeShpbmZvLmltcGxlbWVudHNUeXBlcyl9fWAgOiAnJztcbiAgbGluZXMucHVzaChgPFR5cGVTaWduYXR1cmUga2luZD1cIiR7aW5mby5raW5kfVwiIG5hbWU9XCIke25hbWV9XCIke3R5cGVQYXJhbXNBdHRyaWJ1dGV9JHtleHRlbmRzQXR0cmlidXRlfSR7aW1wbGVtZW50c0F0dHJpYnV0ZX0gLz5gLCAnJyk7XG5cbiAgaWYgKGluZm8uYmFzZVR5cGVzLmxlbmd0aCA+IDApIHtcbiAgICBjb25zdCBsaW5rZWRUeXBlcyA9IGluZm8uYmFzZVR5cGVzLm1hcCgodCkgPT4gbGlua0Jhc2VUeXBlKHQsIGFsbFR5cGVzLCBpbmZvLm5hbWVzcGFjZSkpO1xuICAgIGxpbmVzLnB1c2goYCoqRXh0ZW5kczoqKiAke2xpbmtlZFR5cGVzLmpvaW4oJywgJyl9YCwgJycpO1xuICB9XG5cbiAgaWYgKGluZm8uaW1wbGVtZW50c1R5cGVzLmxlbmd0aCA+IDApIHtcbiAgICBjb25zdCBsaW5rZWRUeXBlcyA9IGluZm8uaW1wbGVtZW50c1R5cGVzLm1hcCgodCkgPT4gbGlua0Jhc2VUeXBlKHQsIGFsbFR5cGVzLCBpbmZvLm5hbWVzcGFjZSkpO1xuICAgIGxpbmVzLnB1c2goYCoqSW1wbGVtZW50czoqKiAke2xpbmtlZFR5cGVzLmpvaW4oJywgJyl9YCwgJycpO1xuICB9XG5cbiAgcmVuZGVyQ29uc3RydWN0b3JNZHgobGluZXMsIG5hbWUsIGluZm8sIGFsbFR5cGVzKTtcbiAgcmVuZGVyUHJvcGVydHlUYWJsZU1keChsaW5lcywgaW5mbywgYWxsVHlwZXMpO1xuICByZW5kZXJNZXRob2RUYWJsZU1keChsaW5lcywgaW5mbywgYWxsVHlwZXMpO1xuXG4gIHJldHVybiB7IGNvbnRlbnQ6IGxpbmVzLmpvaW4oJ1xcbicpLCBmaWxlUGF0aCB9O1xufVxuXG4vKipcbiAqIFdyaXRlcyB0aGUgU3RhcmxpZ2h0IHNpZGViYXIgb2YgdGhlIEFQSSByZWZlcmVuY2UuXG4gKlxuICogQHBhcmFtIHR5cGVzIC0gVGhlIGRvY3VtZW50ZWQgdHlwZXMsIGtleWVkIGJ5IHF1YWxpZmllZCBpZC5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdlbmVyYXRlU2lkZWJhckpzb24odHlwZXM6IE1hcDxzdHJpbmcsIFR5cGVJbmZvPik6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCByb290ID0gYnVpbGRTaWRlYmFyVHJlZSh0eXBlcyk7XG5cbiAgY29uc3QgZ3JvdXBzOiBTaWRlYmFyRW50cnlbXSA9IFtdO1xuICBjb25zdCB0b3BMZXZlbHMgPSBbLi4ucm9vdC5jaGlsZHJlbl0uc29ydCgoW2FdLCBbYl0pID0+IGEubG9jYWxlQ29tcGFyZShiKSk7XG4gIGZvciAoY29uc3QgW3RvcExldmVsLCBjaGlsZF0gb2YgdG9wTGV2ZWxzKSB7XG4gICAgZ3JvdXBzLnB1c2goc2lkZWJhclRyZWVUb0VudHJpZXMoY2hpbGQsIHRvcExldmVsKSk7XG4gIH1cblxuICBjb25zdCB3cmFwcGVkU2lkZWJhcjogU2lkZWJhckVudHJ5W10gPSBbe1xuICAgIGNvbGxhcHNlZDogZmFsc2UsXG4gICAgaXRlbXM6IGdyb3VwcyxcbiAgICBsYWJlbDogJ0FQSSByZWZlcmVuY2UnXG4gIH1dO1xuXG4gIGF3YWl0IHdyaXRlRmlsZShnZXRBcGlEb2NTZXR0aW5ncygpLnNpZGViYXJGaWxlLCBKU09OLnN0cmluZ2lmeSh3cmFwcGVkU2lkZWJhciwgbnVsbCwgSlNPTl9JTkRFTlQpLCAndXRmLTgnKTtcbiAgY29uc29sZS53YXJuKGBHZW5lcmF0ZWQgc2lkZWJhciB3aXRoICR7U3RyaW5nKGdyb3Vwcy5sZW5ndGgpfSB0b3AtbGV2ZWwgbW9kdWxlIGdyb3Vwc2ApO1xufVxuXG4vKipcbiAqIFJlbmRlcnMgYSBjbGFzcydzIGNvbnN0cnVjdG9yIGJsb2NrLlxuICpcbiAqIEBwYXJhbSBsaW5lcyAtIFRoZSBwYWdlIGxpbmVzIHRvIGFwcGVuZCB0by5cbiAqIEBwYXJhbSBuYW1lIC0gVGhlIHR5cGUncyBuYW1lLlxuICogQHBhcmFtIGluZm8gLSBUaGUgZG9jdW1lbnRlZCB0eXBlLlxuICogQHBhcmFtIGFsbFR5cGVzIC0gRXZlcnkgZG9jdW1lbnRlZCB0eXBlLCBrZXllZCBieSBgJHtuYW1lc3BhY2V9IyR7bmFtZX1gLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVuZGVyQ29uc3RydWN0b3JNZHgobGluZXM6IHN0cmluZ1tdLCBuYW1lOiBzdHJpbmcsIGluZm86IFR5cGVJbmZvLCBhbGxUeXBlczogTWFwPHN0cmluZywgVHlwZUluZm8+KTogdm9pZCB7XG4gIGNvbnN0IGNvbnN0cnVjdG9yID0gaW5mby5jb25zdHJ1Y3RvckluZm87XG4gIGlmICghY29uc3RydWN0b3IpIHtcbiAgICByZXR1cm47XG4gIH1cbiAgY29uc3QgY3RvclNpZyA9IGBuZXcgJHtuYW1lfSR7Y29uc3RydWN0b3Iuc2lnbmF0dXJlfWA7XG4gIGNvbnN0IGN0b3JEZXNjID0gY29uc3RydWN0b3IuZGVzY3JpcHRpb25cbiAgICA/IGAgZGVzY3JpcHRpb249XCIke2VzY2FwZUpzeEF0dHJpYnV0ZShtYXJrZG93blRvSHRtbChyZXNvbHZlTGlua3MoY29uc3RydWN0b3IuZGVzY3JpcHRpb24sIGFsbFR5cGVzLCBpbmZvLm5hbWVzcGFjZSkpKX1cImBcbiAgICA6ICcnO1xuICBsaW5lcy5wdXNoKGA8Q29uc3RydWN0b3JCbG9jayBzaWduYXR1cmU9XCIke2VzY2FwZUpzeEF0dHJpYnV0ZShjdG9yU2lnKX1cIiR7Y3RvckRlc2N9IC8+YCwgJycpO1xufVxuXG4vKipcbiAqIFJlbmRlcnMgYW4gZW51bSdzIG1lbWJlcnMuXG4gKlxuICogQHBhcmFtIGxpbmVzIC0gVGhlIHBhZ2UgbGluZXMgdG8gYXBwZW5kIHRvLlxuICogQHBhcmFtIGluZm8gLSBUaGUgZG9jdW1lbnRlZCB0eXBlLlxuICogQHBhcmFtIGFsbFR5cGVzIC0gRXZlcnkgZG9jdW1lbnRlZCB0eXBlLCBrZXllZCBieSBgJHtuYW1lc3BhY2V9IyR7bmFtZX1gLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVuZGVyRW51bVBhZ2UobGluZXM6IHN0cmluZ1tdLCBpbmZvOiBUeXBlSW5mbywgYWxsVHlwZXM6IE1hcDxzdHJpbmcsIFR5cGVJbmZvPik6IHZvaWQge1xuICBsaW5lcy5wdXNoKGA8VHlwZVNpZ25hdHVyZSBraW5kPVwiZW51bVwiIG5hbWU9XCIke2luZm8ubmFtZX1cIiAvPmAsICcnKTtcblxuICBpZiAoaW5mby5lbnVtTWVtYmVycy5sZW5ndGggPT09IDApIHtcbiAgICByZXR1cm47XG4gIH1cblxuICBsaW5lcy5wdXNoKCcqKk1lbWJlcnM6KionLCAnJywgJ3wgTWVtYmVyIHwgVmFsdWUgfCBEZXNjcmlwdGlvbiB8JywgJ3wgOi0tIHwgOi0tIHwgOi0tIHwnKTtcbiAgZm9yIChjb25zdCBtZW1iZXIgb2YgaW5mby5lbnVtTWVtYmVycykge1xuICAgIGNvbnN0IHZhbHVlID0gbWVtYmVyLnZhbHVlID8gYFxcYCR7ZXNjYXBlTWFya2Rvd24obWVtYmVyLnZhbHVlKX1cXGBgIDogJyc7XG4gICAgbGluZXMucHVzaChgfCBcXGAke21lbWJlci5uYW1lfVxcYCB8ICR7dmFsdWV9IHwgJHtlc2NhcGVNYXJrZG93bihyZXNvbHZlTGlua3MobWVtYmVyLmRlc2NyaXB0aW9uLCBhbGxUeXBlcywgaW5mby5uYW1lc3BhY2UpKX0gfGApO1xuICB9XG4gIGxpbmVzLnB1c2goJycpO1xufVxuXG4vKipcbiAqIFJlbmRlciB0aGUgU3RhcmxpZ2h0IGZyb250bWF0dGVyIGJsb2NrICh0aHJvdWdoIHRoZSBjbG9zaW5nIGAtLS1gIGFuZCBpdHMgYmxhbmsgbGluZSkgc2hhcmVkIGJ5IGV2ZXJ5XG4gKiBnZW5lcmF0ZWQgcGFnZSBraW5kOiBtb2R1bGUgaW5kZXgsIHR5cGUgb3ZlcnZpZXcsIHByb3BlcnR5LCBhbmQgbWV0aG9kLlxuICpcbiAqIEV2ZXJ5IHBhZ2Uga2luZCBnb2VzIHRocm91Z2ggaGVyZSBzbyBubyBmaWVsZCBjYW4gYmUgZW1pdHRlZCBvbiBzb21lIGtpbmRzIGFuZCBzaWxlbnRseSBkcm9wcGVkIG9uXG4gKiBvdGhlcnMuIGBkZXNjcmlwdGlvbmAgaW4gcGFydGljdWxhciBpcyBub3QganVzdCBTRU8gbWV0YWRhdGEg4oCUIGl0IGlzIHRoZSBsaW5lIHRoZSBPRyBjYXJkIHJlbmRlcnMgdW5kZXJcbiAqIHRoZSB0aXRsZSwgc28gYSBwYWdlIGtpbmQgdGhhdCBza2lwcGVkIGl0IHByb2R1Y2VkIGEgdGl0bGUtb25seSBjYXJkIG5leHQgdG8gZnVsbHkgcG9wdWxhdGVkIG9uZXMuXG4gKlxuICogQHBhcmFtIGZyb250TWF0dGVyIC0gVGhlIHBhZ2UncyBmcm9udG1hdHRlciBmaWVsZHMuXG4gKiBAcmV0dXJucyBUaGUgZnJvbnRtYXR0ZXIgbGluZXMsIHRocm91Z2ggdGhlIGNsb3NpbmcgYC0tLWAgYW5kIGl0cyBibGFuayBsaW5lLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVuZGVyRnJvbnRNYXR0ZXIoZnJvbnRNYXR0ZXI6IFBhZ2VGcm9udE1hdHRlcik6IHN0cmluZ1tdIHtcbiAgcmV0dXJuIFtcbiAgICAnLS0tJyxcbiAgICBgdGl0bGU6IFwiJHtlc2NhcGVZYW1sKGZyb250TWF0dGVyLnRpdGxlKX1cImAsXG4gICAgYHNsdWc6IFwiJHtmcm9udE1hdHRlci5zbHVnfVwiYCxcbiAgICAuLi4oZnJvbnRNYXR0ZXIuZGVzY3JpcHRpb24gPyBbYGRlc2NyaXB0aW9uOiBcIiR7ZXNjYXBlWWFtbChzdHJpcE1hcmtkb3duKGZyb250TWF0dGVyLmRlc2NyaXB0aW9uKSl9XCJgXSA6IFtdKSxcbiAgICAuLi4oZnJvbnRNYXR0ZXIuc2lnbmF0dXJlID8gW2BzaWduYXR1cmU6IFwiJHtlc2NhcGVZYW1sKHRydW5jYXRlU2lnbmF0dXJlKGZyb250TWF0dGVyLnNpZ25hdHVyZSkpfVwiYF0gOiBbXSksXG4gICAgJ2VkaXRVcmw6IGZhbHNlJyxcbiAgICAnc2lkZWJhcjonLFxuICAgIGAgIGxhYmVsOiBcIiR7ZXNjYXBlWWFtbChmcm9udE1hdHRlci5zaWRlYmFyTGFiZWwpfVwiYCxcbiAgICAnLS0tJyxcbiAgICAnJ1xuICBdO1xufVxuXG4vKipcbiAqIFJlbmRlcnMgYSBmdW5jdGlvbidzIHNpZ25hdHVyZSwgcGFyYW1ldGVycywgcmV0dXJuIHZhbHVlIGFuZCBleGFtcGxlcy5cbiAqXG4gKiBAcGFyYW0gbGluZXMgLSBUaGUgcGFnZSBsaW5lcyB0byBhcHBlbmQgdG8uXG4gKiBAcGFyYW0gaW5mbyAtIFRoZSBkb2N1bWVudGVkIHR5cGUuXG4gKiBAcGFyYW0gYWxsVHlwZXMgLSBFdmVyeSBkb2N1bWVudGVkIHR5cGUsIGtleWVkIGJ5IGAke25hbWVzcGFjZX0jJHtuYW1lfWAuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZW5kZXJGdW5jdGlvblBhZ2UobGluZXM6IHN0cmluZ1tdLCBpbmZvOiBUeXBlSW5mbywgYWxsVHlwZXM6IE1hcDxzdHJpbmcsIFR5cGVJbmZvPik6IHZvaWQge1xuICBjb25zdCAkZnVuY3Rpb24gPSBpbmZvLm1ldGhvZHNbMF07XG4gIGlmICghJGZ1bmN0aW9uKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgbGluZXMucHVzaCgnKipTaWduYXR1cmU6KionLCAnJywgJ2BgYHRzJywgYGZ1bmN0aW9uICR7JGZ1bmN0aW9uLnNpZ25hdHVyZX06ICR7JGZ1bmN0aW9uLnJldHVyblR5cGV9YCwgJ2BgYCcsICcnKTtcblxuICBpZiAoJGZ1bmN0aW9uLnBhcmFtZXRlcnMubGVuZ3RoID4gMCkge1xuICAgIGxpbmVzLnB1c2goJyoqUGFyYW1ldGVyczoqKicsICcnLCAnfCBQYXJhbWV0ZXIgfCBUeXBlIHwgRGVzY3JpcHRpb24gfCcsICd8IDotLSB8IDotLSB8IDotLSB8Jyk7XG4gICAgZm9yIChjb25zdCBwYXJhbWV0ZXIgb2YgJGZ1bmN0aW9uLnBhcmFtZXRlcnMpIHtcbiAgICAgIGxpbmVzLnB1c2goXG4gICAgICAgIGB8IFxcYCR7cGFyYW1ldGVyLm5hbWV9XFxgIHwgJHtlc2NhcGVNYXJrZG93bihlc2NhcGVNZHhBbmdsZUJyYWNrZXRzKHJlbmRlclR5cGVXaXRoTGlua3MocGFyYW1ldGVyLnR5cGUsIGFsbFR5cGVzLCBpbmZvLm5hbWUsIGluZm8ubmFtZXNwYWNlKSkpfSB8ICR7ZXNjYXBlTWFya2Rvd24ocmVzb2x2ZUxpbmtzKHBhcmFtZXRlci5kZXNjcmlwdGlvbiwgYWxsVHlwZXMsIGluZm8ubmFtZXNwYWNlKSl9IHxgXG4gICAgICApO1xuICAgIH1cbiAgICBsaW5lcy5wdXNoKCcnKTtcbiAgfVxuXG4gIGNvbnN0IHJldHVybkRlc2MgPSAkZnVuY3Rpb24ucmV0dXJuRGVzY3JpcHRpb24gPyBgIOKAlCAke2VzY2FwZU1keFByb3NlKHJlc29sdmVMaW5rcygkZnVuY3Rpb24ucmV0dXJuRGVzY3JpcHRpb24sIGFsbFR5cGVzLCBpbmZvLm5hbWVzcGFjZSkpfWAgOiAnJztcbiAgbGluZXMucHVzaChgKipSZXR1cm5zOioqICR7ZXNjYXBlTWR4QnJhY2VzKGVzY2FwZU1keEFuZ2xlQnJhY2tldHMocmVuZGVyVHlwZVdpdGhMaW5rcygkZnVuY3Rpb24ucmV0dXJuVHlwZSwgYWxsVHlwZXMsIGluZm8ubmFtZSwgaW5mby5uYW1lc3BhY2UpKSl9JHtyZXR1cm5EZXNjfWAsICcnKTtcblxuICBmb3IgKGNvbnN0IGV4YW1wbGUgb2YgJGZ1bmN0aW9uLmV4YW1wbGVzKSB7XG4gICAgbGluZXMucHVzaCgnKipFeGFtcGxlOioqJywgJycsIHJlbmRlckV4YW1wbGVNZHgoZXhhbXBsZSwgYWxsVHlwZXMsIGluZm8ubmFtZXNwYWNlKSwgJycpO1xuICB9XG59XG5cbi8qKlxuICogUmVuZGVycyBvbmUgbWV0aG9kIG92ZXJsb2FkLlxuICpcbiAqIEBwYXJhbSBsaW5lcyAtIFRoZSBwYWdlIGxpbmVzIHRvIGFwcGVuZCB0by5cbiAqIEBwYXJhbSBvdmVybG9hZCAtIFRoZSBvdmVybG9hZC5cbiAqIEBwYXJhbSB0eXBlTmFtZSAtIFRoZSBuYW1lIG9mIHRoZSB0eXBlIHRoZSBtZXRob2QgYmVsb25ncyB0by5cbiAqIEBwYXJhbSBuYW1lc3BhY2UgLSBUaGUgbmFtZXNwYWNlIG9mIHRoZSB0eXBlIHRoZSBtZXRob2QgYmVsb25ncyB0by5cbiAqIEBwYXJhbSBhbGxUeXBlcyAtIEV2ZXJ5IGRvY3VtZW50ZWQgdHlwZSwga2V5ZWQgYnkgYCR7bmFtZXNwYWNlfSMke25hbWV9YC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlbmRlck1ldGhvZE92ZXJsb2FkTWR4KGxpbmVzOiBzdHJpbmdbXSwgb3ZlcmxvYWQ6IE1lbWJlckluZm8sIHR5cGVOYW1lOiBzdHJpbmcsIG5hbWVzcGFjZTogc3RyaW5nLCBhbGxUeXBlczogTWFwPHN0cmluZywgVHlwZUluZm8+KTogdm9pZCB7XG4gIGNvbnN0IHNpZyA9IGAke292ZXJsb2FkLnNpZ25hdHVyZX06ICR7b3ZlcmxvYWQucmV0dXJuVHlwZX1gO1xuICBjb25zdCBzdGF0aWNBdHRyaWJ1dGUgPSBvdmVybG9hZC5pc1N0YXRpYyA/ICcgaXNTdGF0aWM9e3RydWV9JyA6ICcnO1xuICBjb25zdCBkZXNjQXR0cmlidXRlID0gb3ZlcmxvYWQuZGVzY3JpcHRpb24gPyBgIGRlc2NyaXB0aW9uPVwiJHtlc2NhcGVKc3hBdHRyaWJ1dGUobWFya2Rvd25Ub0h0bWwocmVzb2x2ZUxpbmtzKG92ZXJsb2FkLmRlc2NyaXB0aW9uLCBhbGxUeXBlcywgbmFtZXNwYWNlKSkpfVwiYCA6ICcnO1xuICBjb25zdCByZW1hcmtzQXR0cmlidXRlID0gb3ZlcmxvYWQucmVtYXJrcyA/IGAgcmVtYXJrcz1cIiR7ZXNjYXBlSnN4QXR0cmlidXRlKG1hcmtkb3duVG9IdG1sKHJlc29sdmVMaW5rcyhvdmVybG9hZC5yZW1hcmtzLCBhbGxUeXBlcywgbmFtZXNwYWNlKSkpfVwiYCA6ICcnO1xuICBjb25zdCBzaW5jZUF0dHJpYnV0ZSA9IG92ZXJsb2FkLnNpbmNlID8gYCBzaW5jZT1cIiR7ZXNjYXBlSnN4QXR0cmlidXRlKG92ZXJsb2FkLnNpbmNlKX1cImAgOiAnJztcbiAgY29uc3QgcmV0dXJuVHlwZUF0dHJpYnV0ZSA9IGAgcmV0dXJuVHlwZT1cIiR7ZXNjYXBlSnN4QXR0cmlidXRlKG1hcmtkb3duVG9IdG1sKHJlbmRlclR5cGVXaXRoTGlua3Mob3ZlcmxvYWQucmV0dXJuVHlwZSwgYWxsVHlwZXMsIHR5cGVOYW1lLCBuYW1lc3BhY2UpKSl9XCJgO1xuICBjb25zdCByZXR1cm5EZXNjQXR0cmlidXRlID0gb3ZlcmxvYWQucmV0dXJuRGVzY3JpcHRpb25cbiAgICA/IGAgcmV0dXJuRGVzY3JpcHRpb249XCIke2VzY2FwZUpzeEF0dHJpYnV0ZShtYXJrZG93blRvSHRtbChyZXNvbHZlTGlua3Mob3ZlcmxvYWQucmV0dXJuRGVzY3JpcHRpb24sIGFsbFR5cGVzLCBuYW1lc3BhY2UpKSl9XCJgXG4gICAgOiAnJztcbiAgY29uc3QgZXhhbXBsZXNBdHRyaWJ1dGUgPSBvdmVybG9hZC5leGFtcGxlcy5sZW5ndGggPiAwID8gYCBleGFtcGxlcz17JHtKU09OLnN0cmluZ2lmeShvdmVybG9hZC5leGFtcGxlcyl9fWAgOiAnJztcblxuICBjb25zdCBwYXJhbXMgPSBvdmVybG9hZC5wYXJhbWV0ZXJzLm1hcCgocCkgPT4gKHtcbiAgICBkZXNjcmlwdGlvbjogbWFya2Rvd25Ub0h0bWwocC5kZXNjcmlwdGlvbiB8fCAocC5uYW1lLmVuZHNXaXRoKCc/JykgPyAnKihPcHRpb25hbCkqJyA6ICcnKSksXG4gICAgbmFtZTogcC5uYW1lLFxuICAgIHR5cGU6IG1hcmtkb3duVG9IdG1sKHJlbmRlclR5cGVXaXRoTGlua3MocC50eXBlLCBhbGxUeXBlcywgdHlwZU5hbWUsIG5hbWVzcGFjZSkpXG4gIH0pKTtcbiAgY29uc3QgcGFyYW1zQXR0cmlidXRlID0gcGFyYW1zLmxlbmd0aCA+IDAgPyBgIHBhcmFtZXRlcnM9eyR7SlNPTi5zdHJpbmdpZnkocGFyYW1zKX19YCA6ICcnO1xuXG4gIGxpbmVzLnB1c2goXG4gICAgYDxNZW1iZXJEZXRhaWwke3N0YXRpY0F0dHJpYnV0ZX0gc2lnbmF0dXJlPVwiJHtlc2NhcGVKc3hBdHRyaWJ1dGUoc2lnKX1cIiR7ZGVzY0F0dHJpYnV0ZX0ke3JlbWFya3NBdHRyaWJ1dGV9JHtzaW5jZUF0dHJpYnV0ZX0ke3JldHVyblR5cGVBdHRyaWJ1dGV9JHtyZXR1cm5EZXNjQXR0cmlidXRlfSR7cGFyYW1zQXR0cmlidXRlfSR7ZXhhbXBsZXNBdHRyaWJ1dGV9IC8+YCxcbiAgICAnJ1xuICApO1xufVxuXG4vKipcbiAqIFJlbmRlcnMgYSB0eXBlJ3MgbWV0aG9kIHRhYmxlLlxuICpcbiAqIEBwYXJhbSBsaW5lcyAtIFRoZSBwYWdlIGxpbmVzIHRvIGFwcGVuZCB0by5cbiAqIEBwYXJhbSBpbmZvIC0gVGhlIGRvY3VtZW50ZWQgdHlwZS5cbiAqIEBwYXJhbSBhbGxUeXBlcyAtIEV2ZXJ5IGRvY3VtZW50ZWQgdHlwZSwga2V5ZWQgYnkgYCR7bmFtZXNwYWNlfSMke25hbWV9YC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlbmRlck1ldGhvZFRhYmxlTWR4KGxpbmVzOiBzdHJpbmdbXSwgaW5mbzogVHlwZUluZm8sIGFsbFR5cGVzOiBNYXA8c3RyaW5nLCBUeXBlSW5mbz4pOiB2b2lkIHtcbiAgY29uc3QgbWV0aG9kcyA9IFsuLi5pbmZvLm1ldGhvZHNdLnNvcnQoKGEsIGIpID0+IHtcbiAgICBpZiAoYS5pc1N0YXRpYyAhPT0gYi5pc1N0YXRpYykge1xuICAgICAgcmV0dXJuIGEuaXNTdGF0aWMgPyAxIDogLTE7XG4gICAgfVxuICAgIHJldHVybiBhLm5hbWUubG9jYWxlQ29tcGFyZShiLm5hbWUpO1xuICB9KTtcbiAgaWYgKG1ldGhvZHMubGVuZ3RoID09PSAwKSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIGxpbmVzLnB1c2goJzxNZXRob2RUYWJsZSByb3dzPXtbJyk7XG4gIGZvciAoY29uc3QgbWV0aG9kIG9mIG1ldGhvZHMpIHtcbiAgICBjb25zdCBkZXNjID0gZXNjYXBlSnNTdHJpbmcobWFya2Rvd25Ub0h0bWwocmVzb2x2ZUxpbmtzKG1ldGhvZC5kZXNjcmlwdGlvbiwgYWxsVHlwZXMsIGluZm8ubmFtZXNwYWNlKSkpO1xuICAgIGNvbnN0IHN0YXRpY1ByZWZpeCA9IG1ldGhvZC5pc1N0YXRpYyA/ICdzdGF0aWMgJyA6ICcnO1xuICAgIGNvbnN0IHNob3J0UGFyYW1zID0gbWV0aG9kLnBhcmFtZXRlcnMubWFwKChwLCBpbmRleCkgPT4ge1xuICAgICAgcmV0dXJuIGluZGV4ID09PSAwICYmIEVWRU5UX01FVEhPRFMuaGFzKG1ldGhvZC5uYW1lKSAmJiAocC50eXBlLnN0YXJ0c1dpdGgoJ1wiJykgfHwgcC50eXBlLnN0YXJ0c1dpdGgoJ1xcJycpKSA/IHAudHlwZS5yZXBsYWNlQWxsKCdcIicsICdcXCcnKSA6IHAubmFtZTtcbiAgICB9KS5qb2luKCcsICcpO1xuICAgIGNvbnN0IHNob3J0U2lnID0gYCR7c3RhdGljUHJlZml4fSR7bWV0aG9kLm5hbWV9KCR7c2hvcnRQYXJhbXN9KWA7XG4gICAgY29uc3Qgc2lnID0gZXNjYXBlSnNTdHJpbmcoc2hvcnRTaWcpO1xuICAgIGNvbnN0IHNsdWcgPSBvdmVybG9hZFJvdXRlU2VnbWVudChtZXRob2Qub3ZlcmxvYWRLZXkpO1xuICAgIGNvbnN0IHJldHVyblR5cGUgPSBtYXJrZG93blRvSHRtbChyZW5kZXJUeXBlV2l0aExpbmtzKG1ldGhvZC5yZXR1cm5UeXBlLCBhbGxUeXBlcywgaW5mby5uYW1lLCBpbmZvLm5hbWVzcGFjZSkpO1xuICAgIGNvbnN0IGluaGVyaXRlZEF0dHJpYnV0ZSA9IG1ldGhvZC5pbmhlcml0ZWRGcm9tXG4gICAgICA/IGAsIGluaGVyaXRlZEZyb206IFwiJHtlc2NhcGVKc1N0cmluZyhtYXJrZG93blRvSHRtbCh0eXBlTGluayhtZXRob2QuaW5oZXJpdGVkRnJvbSwgYWxsVHlwZXMsIGluZm8ubmFtZXNwYWNlKSkpfVwiYFxuICAgICAgOiAnJztcbiAgICBjb25zdCBocmVmID0gbWVtYmVySHJlZihzbHVnLCBtZXRob2QuaW5oZXJpdGVkRnJvbSwgYWxsVHlwZXMsIGluZm8ubmFtZXNwYWNlKTtcbiAgICBsaW5lcy5wdXNoKFxuICAgICAgYCAgeyBzaWduYXR1cmU6IFwiJHtzaWd9XCIsIGhyZWY6IFwiJHtlc2NhcGVKc1N0cmluZyhocmVmKX1cIiwgcmV0dXJuczogXCIke2VzY2FwZUpzU3RyaW5nKHJldHVyblR5cGUpfVwiLCBkZXNjcmlwdGlvbjogXCIke2Rlc2N9XCIke2luaGVyaXRlZEF0dHJpYnV0ZX0gfSxgXG4gICAgKTtcbiAgfVxuICBsaW5lcy5wdXNoKCddfSAvPicsICcnKTtcbn1cblxuLyoqXG4gKiBSZW5kZXJzIGEgdHlwZSdzIHByb3BlcnR5IHRhYmxlLlxuICpcbiAqIEBwYXJhbSBsaW5lcyAtIFRoZSBwYWdlIGxpbmVzIHRvIGFwcGVuZCB0by5cbiAqIEBwYXJhbSBpbmZvIC0gVGhlIGRvY3VtZW50ZWQgdHlwZS5cbiAqIEBwYXJhbSBhbGxUeXBlcyAtIEV2ZXJ5IGRvY3VtZW50ZWQgdHlwZSwga2V5ZWQgYnkgYCR7bmFtZXNwYWNlfSMke25hbWV9YC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlbmRlclByb3BlcnR5VGFibGVNZHgobGluZXM6IHN0cmluZ1tdLCBpbmZvOiBUeXBlSW5mbywgYWxsVHlwZXM6IE1hcDxzdHJpbmcsIFR5cGVJbmZvPik6IHZvaWQge1xuICBjb25zdCBwcm9wZXJ0aWVzID0gaW5mby5wcm9wZXJ0aWVzO1xuICBpZiAocHJvcGVydGllcy5sZW5ndGggPT09IDApIHtcbiAgICByZXR1cm47XG4gIH1cbiAgbGluZXMucHVzaCgnPFByb3BlcnR5VGFibGUgcm93cz17WycpO1xuICBmb3IgKGNvbnN0IHByb3BlcnR5IG9mIHByb3BlcnRpZXMpIHtcbiAgICBjb25zdCBkZXNjID0gZXNjYXBlSnNTdHJpbmcobWFya2Rvd25Ub0h0bWwocmVzb2x2ZUxpbmtzKHByb3BlcnR5LmRlc2NyaXB0aW9uLCBhbGxUeXBlcywgaW5mby5uYW1lc3BhY2UpKSk7XG4gICAgY29uc3QgdHlwZSA9IG1hcmtkb3duVG9IdG1sKHJlbmRlclR5cGVXaXRoTGlua3MocHJvcGVydHkudHlwZSwgYWxsVHlwZXMsIGluZm8ubmFtZSwgaW5mby5uYW1lc3BhY2UpKTtcbiAgICBjb25zdCBpbmhlcml0ZWRBdHRyaWJ1dGUgPSBwcm9wZXJ0eS5pbmhlcml0ZWRGcm9tXG4gICAgICA/IGAsIGluaGVyaXRlZEZyb206IFwiJHtlc2NhcGVKc1N0cmluZyhtYXJrZG93blRvSHRtbCh0eXBlTGluayhwcm9wZXJ0eS5pbmhlcml0ZWRGcm9tLCBhbGxUeXBlcywgaW5mby5uYW1lc3BhY2UpKSl9XCJgXG4gICAgICA6ICcnO1xuICAgIGNvbnN0IGhyZWYgPSBtZW1iZXJIcmVmKG1lbWJlclJvdXRlU2VnbWVudChwcm9wZXJ0eS5uYW1lKSwgcHJvcGVydHkuaW5oZXJpdGVkRnJvbSwgYWxsVHlwZXMsIGluZm8ubmFtZXNwYWNlKTtcbiAgICBsaW5lcy5wdXNoKFxuICAgICAgYCAgeyBuYW1lOiBcIiR7ZXNjYXBlSnNTdHJpbmcocHJvcGVydHkubmFtZSl9XCIsIGhyZWY6IFwiJHtlc2NhcGVKc1N0cmluZyhocmVmKX1cIiwgdHlwZTogXCIke2VzY2FwZUpzU3RyaW5nKHR5cGUpfVwiLCBkZXNjcmlwdGlvbjogXCIke2Rlc2N9XCIke2luaGVyaXRlZEF0dHJpYnV0ZX0gfSxgXG4gICAgKTtcbiAgfVxuICBsaW5lcy5wdXNoKCddfSAvPicsICcnKTtcbn1cblxuLyoqXG4gKiBSZW5kZXJzIGEgdHlwZSBhbGlhcydzIHNpZ25hdHVyZS5cbiAqXG4gKiBAcGFyYW0gbGluZXMgLSBUaGUgcGFnZSBsaW5lcyB0byBhcHBlbmQgdG8uXG4gKiBAcGFyYW0gaW5mbyAtIFRoZSBkb2N1bWVudGVkIHR5cGUuXG4gKiBAcGFyYW0gYWxsVHlwZXMgLSBFdmVyeSBkb2N1bWVudGVkIHR5cGUsIGtleWVkIGJ5IGAke25hbWVzcGFjZX0jJHtuYW1lfWAuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZW5kZXJUeXBlQWxpYXNQYWdlKGxpbmVzOiBzdHJpbmdbXSwgaW5mbzogVHlwZUluZm8sIGFsbFR5cGVzOiBNYXA8c3RyaW5nLCBUeXBlSW5mbz4pOiB2b2lkIHtcbiAgY29uc3QgdHlwZVBhcmFtc0F0dHJpYnV0ZSA9IGluZm8udHlwZVBhcmFtZXRlcnMubGVuZ3RoID4gMCA/IGAgdHlwZVBhcmFtcz17JHtKU09OLnN0cmluZ2lmeShpbmZvLnR5cGVQYXJhbWV0ZXJzKX19YCA6ICcnO1xuICBsaW5lcy5wdXNoKGA8VHlwZVNpZ25hdHVyZSBraW5kPVwidHlwZVwiIG5hbWU9XCIke2luZm8ubmFtZX1cIiR7dHlwZVBhcmFtc0F0dHJpYnV0ZX0gLz5gLCAnJyk7XG5cbiAgY29uc3QgcmhzID0gaW5mby50eXBlQWxpYXNUZXh0ID8/ICd1bmtub3duJztcbiAgbGluZXMucHVzaChcbiAgICAnKipTaWduYXR1cmU6KionLFxuICAgICcnLFxuICAgICdgYGB0cycsXG4gICAgYHR5cGUgJHtnZXREaXNwbGF5TmFtZShpbmZvLm5hbWUsIGluZm8pfSA9ICR7cmhzfWAsXG4gICAgJ2BgYCcsXG4gICAgJycsXG4gICAgYCoqVHlwZToqKiAke2VzY2FwZU1keEJyYWNlcyhlc2NhcGVNZHhBbmdsZUJyYWNrZXRzKHJlbmRlclR5cGVXaXRoTGlua3MocmhzLCBhbGxUeXBlcywgaW5mby5uYW1lLCBpbmZvLm5hbWVzcGFjZSkpKX1gLFxuICAgICcnXG4gICk7XG59XG5cbi8qKlxuICogUmVuZGVycyBhIHZhcmlhYmxlJ3MgZGVjbGFyYXRpb24gYW5kIHR5cGUuXG4gKlxuICogQHBhcmFtIGxpbmVzIC0gVGhlIHBhZ2UgbGluZXMgdG8gYXBwZW5kIHRvLlxuICogQHBhcmFtIG5hbWUgLSBUaGUgdHlwZSdzIG5hbWUuXG4gKiBAcGFyYW0gaW5mbyAtIFRoZSBkb2N1bWVudGVkIHR5cGUuXG4gKiBAcGFyYW0gYWxsVHlwZXMgLSBFdmVyeSBkb2N1bWVudGVkIHR5cGUsIGtleWVkIGJ5IGAke25hbWVzcGFjZX0jJHtuYW1lfWAuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZW5kZXJWYXJpYWJsZVBhZ2UobGluZXM6IHN0cmluZ1tdLCBuYW1lOiBzdHJpbmcsIGluZm86IFR5cGVJbmZvLCBhbGxUeXBlczogTWFwPHN0cmluZywgVHlwZUluZm8+KTogdm9pZCB7XG4gIGNvbnN0IGtleXdvcmQgPSBpbmZvLnZhcmlhYmxlS2V5d29yZCA/PyAnbGV0JztcbiAgY29uc3QgdmFyaWFibGVUeXBlID0gaW5mby52YXJpYWJsZVR5cGUgPz8gJ3Vua25vd24nO1xuICBsaW5lcy5wdXNoKFxuICAgICcqKlNpZ25hdHVyZToqKicsXG4gICAgJycsXG4gICAgJ2BgYHRzJyxcbiAgICBgJHtrZXl3b3JkfSAke25hbWV9OiAke3ZhcmlhYmxlVHlwZX1gLFxuICAgICdgYGAnLFxuICAgICcnLFxuICAgIGAqKlR5cGU6KiogJHtlc2NhcGVNZHhCcmFjZXMoZXNjYXBlTWR4QW5nbGVCcmFja2V0cyhyZW5kZXJUeXBlV2l0aExpbmtzKHZhcmlhYmxlVHlwZSwgYWxsVHlwZXMsIG5hbWUsIGluZm8ubmFtZXNwYWNlKSkpfWAsXG4gICAgJydcbiAgKTtcbn1cblxuLyoqXG4gKiBDb252ZXJ0cyBhIG5hbWVzcGFjZSB0cmVlIG5vZGUgaW50byBhIHNpZGViYXIgZ3JvdXAuXG4gKlxuICogQHBhcmFtIG5vZGUgLSBUaGUgbm9kZS5cbiAqIEBwYXJhbSBsYWJlbCAtIFRoZSBncm91cCdzIGxhYmVsLlxuICogQHJldHVybnMgVGhlIHNpZGViYXIgZ3JvdXAuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzaWRlYmFyVHJlZVRvRW50cmllcyhub2RlOiBTaWRlYmFyVHJlZU5vZGUsIGxhYmVsOiBzdHJpbmcpOiBTaWRlYmFyRW50cnkge1xuICBjb25zdCBpdGVtczogKFNpZGViYXJFbnRyeSB8IFNpZGViYXJMaW5rKVtdID0gW107XG5cbiAgLy8gQ2hpbGQgZGlyZWN0b3J5IGdyb3VwcyBmaXJzdCAoYmVmb3JlIHRoaXMgbW9kdWxlJ3Mgb3duIHBhZ2VzKVxuICBjb25zdCBzb3J0ZWRDaGlsZHJlbiA9IFsuLi5ub2RlLmNoaWxkcmVuXS5zb3J0KChbYV0sIFtiXSkgPT4gYS5sb2NhbGVDb21wYXJlKGIpKTtcbiAgZm9yIChjb25zdCBbY2hpbGROYW1lLCBjaGlsZF0gb2Ygc29ydGVkQ2hpbGRyZW4pIHtcbiAgICBpdGVtcy5wdXNoKHNpZGViYXJUcmVlVG9FbnRyaWVzKGNoaWxkLCBjaGlsZE5hbWUpKTtcbiAgfVxuXG4gIC8vIFRoaXMgbW9kdWxlJ3Mgb3duIG92ZXJ2aWV3IHBhZ2UgKyB0eXBlL2Z1bmN0aW9uIHBhZ2VzIChpbmRpdmlkdWFsIG1lbWJlcnMgYXJlIG5vdCBsaXN0ZWQpLlxuICAvLyBTaWRlYmFyIGBsaW5rYCBmaWVsZHMgbXVzdCBOT1QgZW1iZWQgQkFTRV9QQVRIOiBTdGFybGlnaHQgcHJlcGVuZHMgdGhlIGNvbmZpZyBgYmFzZWAgdG8gZXZlcnlcbiAgLy8gc2lkZWJhciBsaW5rIGl0c2VsZiwgc28gaW5jbHVkaW5nIGl0IGhlcmUgd291bGQgZG91YmxlIHRoZSBiYXNlIChlLmcuIGAvYmFzZS9iYXNlL2FwaS8uLi5gIOKGkiA0MDQpLlxuICAvLyBUaGlzIGRpZmZlcnMgZnJvbSBpbi1jb250ZW50IGxpbmtzLCB3aGljaCBhcmUgcmF3IGFuY2hvcnMgdGhhdCBTdGFybGlnaHQgZG9lcyBub3QgYmFzZS1wcmVwZW5kLlxuICBpZiAobm9kZS50eXBlcy5sZW5ndGggPiAwKSB7XG4gICAgY29uc3QgeyBuYW1lc3BhY2UgfSA9IGVuc3VyZU5vbk51bGxhYmxlKG5vZGUudHlwZXNbMF0pO1xuICAgIGl0ZW1zLnB1c2goeyBsYWJlbDogJ092ZXJ2aWV3JywgbGluazogYC9hcGkvJHtuYW1lc3BhY2V9L2AgfSk7XG4gICAgY29uc3Qgc29ydGVkVHlwZXMgPSBbLi4ubm9kZS50eXBlc10uc29ydCgoYSwgYikgPT4gYS5uYW1lLmxvY2FsZUNvbXBhcmUoYi5uYW1lKSk7XG4gICAgZm9yIChjb25zdCB0IG9mIHNvcnRlZFR5cGVzKSB7XG4gICAgICBpdGVtcy5wdXNoKHsgbGFiZWw6IHQubmFtZSwgbGluazogYC9hcGkvJHt0Lm5hbWVzcGFjZX0vJHt0b1R5cGVSb3V0ZVNlZ21lbnQodC5uYW1lc3BhY2UsIHQubmFtZSl9L2AgfSk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHsgY29sbGFwc2VkOiB0cnVlLCBpdGVtcywgbGFiZWwgfTtcbn1cblxuLy8gU2VydmVzIGJvdGggYXMgdGhlIHJvb3QgQVBJIHBhZ2UncyBwcm9zZSBhbmQgKHN0cmlwcGVkKSBhcyBpdHMgYGRlc2NyaXB0aW9uYCBmcm9udG1hdHRlci5cbi8vIFNoYXJpbmcgb25lIGZ1bmN0aW9uIGtlZXBzIHRoZSBwYWdlIGFuZCBpdHMgT0cgY2FyZCBmcm9tIGRyaWZ0aW5nIGFwYXJ0LlxuZnVuY3Rpb24gZ2V0QXBpSW5kZXhJbnRybyhuYW1lc3BhY2VzOiByZWFkb25seSBzdHJpbmdbXSk6IHN0cmluZyB7XG4gIGNvbnN0IHsgcGFja2FnZU5hbWUsIHB1YmxpY0FwaUVudHJ5IH0gPSBnZXRBcGlEb2NTZXR0aW5ncygpO1xuICBjb25zdCBpbnRybyA9IGBUaGUgY29tcGxldGUgQVBJIHJlZmVyZW5jZSBmb3IgXFxgJHtwYWNrYWdlTmFtZX1cXGAsIGdlbmVyYXRlZCBmcm9tIGl0cyBUU0RvYy4gYDtcbiAgaWYgKHB1YmxpY0FwaUVudHJ5ICE9PSB1bmRlZmluZWQpIHtcbiAgICByZXR1cm4gYCR7aW50cm99RXZlcnkgZXhwb3J0IGlzIGltcG9ydGVkIGZyb20gdGhlIHBhY2thZ2Ugcm9vdCwgXFxgJHtwYWNrYWdlTmFtZX1cXGA7IHRoZSBtb2R1bGVzIGJlbG93IGdyb3VwIHRoZW0gYnkgc291cmNlIG1vZHVsZS5gO1xuICB9XG4gIGNvbnN0IFtleGFtcGxlTmFtZXNwYWNlID0gJ21vZHVsZSddID0gbmFtZXNwYWNlcztcbiAgcmV0dXJuIGAke2ludHJvfUVhY2ggbW9kdWxlIGJlbG93IG1hcHMgdG8gYW4gaW1wb3J0IHN1YnBhdGggKGUuZy4gdGhlIFxcYCR7ZXhhbXBsZU5hbWVzcGFjZX1cXGAgbW9kdWxlIGlzIFxcYCR7cGFja2FnZU5hbWV9LyR7ZXhhbXBsZU5hbWVzcGFjZX1cXGApLmA7XG59XG5cbmZ1bmN0aW9uIGdldENvbXBvbmVudEltcG9ydHMoY29tcG9uZW50TmFtZXM6IHJlYWRvbmx5IHN0cmluZ1tdKTogc3RyaW5nW10ge1xuICByZXR1cm4gY29tcG9uZW50TmFtZXMubWFwKChjb21wb25lbnROYW1lKSA9PiBgaW1wb3J0ICR7Y29tcG9uZW50TmFtZX0gZnJvbSBcIiR7QVBJX0NPTVBPTkVOVFNfSU1QT1JUX1BSRUZJWH0vJHtjb21wb25lbnROYW1lfS5hc3Ryb1wiO2ApO1xufVxuXG5mdW5jdGlvbiByZW5kZXJOYW1lc3BhY2VUYWJsZShcbiAgbGluZXM6IHN0cmluZ1tdLFxuICBoZWFkaW5nOiBzdHJpbmcsXG4gIGNvbHVtbkxhYmVsOiBzdHJpbmcsXG4gIGVudHJpZXM6IFR5cGVJbmZvW10sXG4gIGFsbFR5cGVzOiBNYXA8c3RyaW5nLCBUeXBlSW5mbz4sXG4gIG5hbWVzcGFjZTogc3RyaW5nXG4pOiB2b2lkIHtcbiAgaWYgKGVudHJpZXMubGVuZ3RoID09PSAwKSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIGNvbnN0IHNvcnRlZCA9IFsuLi5lbnRyaWVzXS5zb3J0KChhLCBiKSA9PiBhLm5hbWUubG9jYWxlQ29tcGFyZShiLm5hbWUpKTtcbiAgbGluZXMucHVzaChgIyMgJHtoZWFkaW5nfWAsICcnLCBgfCAke2NvbHVtbkxhYmVsfSB8IERlc2NyaXB0aW9uIHxgLCAnfCA6LS0gfCA6LS0gfCcpO1xuICBmb3IgKGNvbnN0IGVudHJ5IG9mIHNvcnRlZCkge1xuICAgIGxpbmVzLnB1c2goYHwgWyR7ZW50cnkubmFtZX1dKC4vJHt0b1R5cGVSb3V0ZVNlZ21lbnQoZW50cnkubmFtZXNwYWNlLCBlbnRyeS5uYW1lKX0vKSB8ICR7ZXNjYXBlTWFya2Rvd24ocmVzb2x2ZUxpbmtzKGVudHJ5LmRlc2NyaXB0aW9uLCBhbGxUeXBlcywgbmFtZXNwYWNlKSl9IHxgKTtcbiAgfVxuICBsaW5lcy5wdXNoKCcnKTtcbn1cbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtB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
@@ -44,4 +44,4 @@ function getApiDocSettings() {
44
44
  configureApiDocs,
45
45
  getApiDocSettings
46
46
  });
47
- //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vLi4vc3JjL2RvY3Mtc2l0ZS9hcGktZG9jLXNldHRpbmdzLnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyIvKipcbiAqIEBmaWxlXG4gKlxuICogVGhlIHBlci1zaXRlIHNldHRpbmdzIG9mIHRoZSBBUEkgZG9jdW1lbnRhdGlvbiBnZW5lcmF0b3I6IHdoZXJlIGl0IHdyaXRlcywgd2hpY2ggcGFja2FnZSBpdCBkb2N1bWVudHMsIHRoZSBiYXNlXG4gKiBwYXRoIGl0cyBsaW5rcyBjYXJyeSwgYW5kIHRoZSBleHRlcm5hbCBsaW5rcyBhIHNpdGUgYWRkcyB0byB0aGUgZ2VuZXJpYyBvbmVzLlxuICovXG5cbi8qKlxuICogVGhlIHNldHRpbmdzIHRoZSBBUEkgZG9jdW1lbnRhdGlvbiBnZW5lcmF0b3IgcmVhZHMgd2hpbGUgaXQgcmVuZGVycyBwYWdlcyBhbmQgbGlua3MuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQXBpRG9jU2V0dGluZ3Mge1xuICAvKipcbiAgICogVGhlIHNpdGUncyBiYXNlIHBhdGgsIHdpdGggYSBsZWFkaW5nIHNsYXNoIGFuZCBubyB0cmFpbGluZyBvbmUsIGUuZy4gYC90eXBlc2NyaXB0LWxpYmAuIEV2ZXJ5IGluLWNvbnRlbnQgbGlua1xuICAgKiB0aGUgZ2VuZXJhdG9yIGVtaXRzIHN0YXJ0cyB3aXRoIGl0LlxuICAgKi9cbiAgcmVhZG9ubHkgYmFzZVBhdGg6IHN0cmluZztcblxuICAvKipcbiAgICogRm9sZGVyIG5hbWVzIHdob3NlIHN1YnRyZWUgaXMgbm90IGRvY3VtZW50ZWQsIGluIGFkZGl0aW9uIHRvIGBAdHlwZXNgLCBgc3R5bGVzYCBhbmQgYHRlc3QtaGVscGVyc2AuIEFwcGxpZXNcbiAgICogdG8gdGhpcyBzaXRlJ3Mgc291cmNlIHdhbGsgb25seTogYSBsaW5rIGludG8gYW5vdGhlciBwYWNrYWdlJ3Mgc2l0ZSBhc3N1bWVzIHRoYXQgc2l0ZSdzIGdlbmVyYXRvciBza2lwcGVkIHRoZVxuICAgKiBkZWZhdWx0IGZvbGRlcnMgYWxvbmUuXG4gICAqL1xuICByZWFkb25seSBleGNsdWRlZERpcmVjdG9yaWVzPzogcmVhZG9ubHkgc3RyaW5nW10gfCB1bmRlZmluZWQ7XG5cbiAgLyoqXG4gICAqIFR5cGUgbmFtZXMgbWFwcGVkIHRvIHRoZSBVUkwgdGhlaXIgcmVmZXJlbmNlcyBsaW5rIHRvLCBmb3IgdHlwZXMgbmVpdGhlciB0aGlzIHBhY2thZ2Ugbm9yIGEge0BsaW5rIHBhY2thZ2VTaXRlc31cbiAgICogcGFja2FnZSBkZWNsYXJlcywgZS5nLiBhbiBlY29zeXN0ZW0ncyBvd24gQVBJIHJlZmVyZW5jZS4gQ29uc3VsdGVkIGJlZm9yZSB0aGUgZ2VuZXJpYyBUeXBlU2NyaXB0LCBKYXZhU2NyaXB0IGFuZFxuICAgKiBXZWIgQVBJIGxpbmtzLCBzbyBhbiBlbnRyeSBoZXJlIHdpbnMgb3ZlciB0aGVtLlxuICAgKi9cbiAgcmVhZG9ubHkgZXh0ZXJuYWxUeXBlTGlua3M6IFJlYWRvbmx5TWFwPHN0cmluZywgc3RyaW5nPjtcblxuICAvKipcbiAgICogTmFtZXMgdGhhdCBhcmUgbmV2ZXIgbGlua2VkIGFzIHR5cGVzLCBpbiBhZGRpdGlvbiB0byB0aGUgYnVpbHQtaW4gZ2VuZXJpYyBwYXJhbWV0ZXIgbmFtZXMgYW5kIGV2ZXJ5IHR5cGVcbiAgICogcGFyYW1ldGVyIGEgZG9jdW1lbnRlZCB0eXBlIGRlY2xhcmVzOiB0eXBlIHBhcmFtZXRlcnMgdGhlIHNjYW4gZG9lcyBub3QgZmluZC5cbiAgICovXG4gIHJlYWRvbmx5IGdlbmVyaWNUeXBlUGFyYW1ldGVycz86IHJlYWRvbmx5IHN0cmluZ1tdIHwgdW5kZWZpbmVkO1xuXG4gIC8qKlxuICAgKiBCdWlsZHMgZWFjaCBleHBvcnQncyBpbXBvcnQgc3RhdGVtZW50LCBmb3IgYSBwYWNrYWdlIHdob3NlIGV4cG9ydHMgYXJlIG5vdCBpbXBvcnRlZCBmcm9tXG4gICAqIGA8cGFja2FnZU5hbWU+LzxuYW1lc3BhY2U+YCwgZS5nLiBvbmUgcHVibGlzaGluZyBiYXJyZWwgZW50cnkgcG9pbnRzLiBSZXR1cm5pbmcgYHVuZGVmaW5lZGAgc2hvd3Mgbm8gc3RhdGVtZW50LlxuICAgKiBVbnNldCwgZXZlcnkgc3RhdGVtZW50IGlzIHRoZSB7QGxpbmsgSW1wb3J0U3RhdGVtZW50Q29udGV4dC5kZWZhdWx0SW1wb3J0U3RhdGVtZW50fS5cbiAgICovXG4gIHJlYWRvbmx5IGltcG9ydFN0YXRlbWVudD86IEltcG9ydFN0YXRlbWVudFByb3ZpZGVyIHwgdW5kZWZpbmVkO1xuXG4gIC8qKlxuICAgKiBCdWlsZHMgdGhlIGNhc2UtcHJlc2VydmVkIHJvdXRlIHNlZ21lbnQgb2YgYSBtZW1iZXIncyBwYWdlLCBvdmVycmlkaW5nIHRoZSBnZW5lcmF0b3IncyBzbHVnIHdoZXJlIGl0IHJldHVybnMgYVxuICAgKiBzdHJpbmcuIFRoZSBmaWxlIGlzIHdyaXR0ZW4gdW5kZXIgdGhlIHNlZ21lbnQgbG93ZXJjYXNlZC4gVGhlIGdlbmVyYXRvcidzIG93biBzbHVnIGFscmVhZHkga2VlcHMgYSBuYW1lJ3NcbiAgICogdHJhaWxpbmcgdW5kZXJzY29yZXMsIHNvIGBjcmVhdGVfX2AgYW5kIGBjcmVhdGVgIG5ldmVyIHNoYXJlIGEgcGFnZS5cbiAgICovXG4gIHJlYWRvbmx5IG1lbWJlclJvdXRlU2VnbWVudD86IE1lbWJlclJvdXRlU2VnbWVudFByb3ZpZGVyIHwgdW5kZWZpbmVkO1xuXG4gIC8qKlxuICAgKiBUaGUgZm9sZGVyIHRoZSBnZW5lcmF0ZWQgQVBJIHBhZ2VzIGFyZSB3cml0dGVuIHRvLCBub3JtYWxseSBgPGRvY3M+L3NyYy9jb250ZW50L2RvY3MvYXBpYC5cbiAgICovXG4gIHJlYWRvbmx5IG91dHB1dERpcmVjdG9yeTogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgZG9jdW1lbnRlZCBwYWNrYWdlJ3MgbmFtZSwgZS5nLiBgQG1uYW91bW92L3R5cGVzY3JpcHQtbGliYC4gSW1wb3J0IHN0YXRlbWVudHMgYXJlIGJ1aWx0IGZyb20gaXQsIHVubGVzc1xuICAgKiB7QGxpbmsgaW1wb3J0U3RhdGVtZW50fSBidWlsZHMgdGhlbS5cbiAgICovXG4gIHJlYWRvbmx5IHBhY2thZ2VOYW1lOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFBhY2thZ2UgbmFtZXMgbWFwcGVkIHRvIHRoZSByb290IFVSTCBvZiB0aGVpciBkb2N1bWVudGF0aW9uIHNpdGUsIHdpdGggYSB0cmFpbGluZyBzbGFzaC4gQSB0eXBlIHdob3NlXG4gICAqIGRlY2xhcmF0aW9uIHJlc29sdmVzIGludG8gb25lIG9mIHRoZXNlIHBhY2thZ2VzIGxpbmtzIHRvIGl0cyBwYWdlIG9uIHRoYXQgc2l0ZS5cbiAgICovXG4gIHJlYWRvbmx5IHBhY2thZ2VTaXRlczogUmVhZG9ubHlNYXA8c3RyaW5nLCBzdHJpbmc+O1xuXG4gIC8qKlxuICAgKiBUaGUgSlNPTiBmaWxlIHRoZSBnZW5lcmF0ZWQgU3RhcmxpZ2h0IHNpZGViYXIgaXMgd3JpdHRlbiB0by5cbiAgICovXG4gIHJlYWRvbmx5IHNpZGViYXJGaWxlOiBzdHJpbmc7XG59XG5cbi8qKlxuICogV2hhdCB7QGxpbmsgQXBpRG9jU2V0dGluZ3MuaW1wb3J0U3RhdGVtZW50fSBpcyB0b2xkIGFib3V0IHRoZSBleHBvcnQgd2hvc2UgaW1wb3J0IHN0YXRlbWVudCBpdCBidWlsZHMuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSW1wb3J0U3RhdGVtZW50Q29udGV4dCB7XG4gIC8qKlxuICAgKiBUaGUgc3RhdGVtZW50IHRoZSBnZW5lcmF0b3Igd3JpdGVzIHdoZW4gbm8gaG9vayBpcyBzZXQsIGUuZy5cbiAgICogYGltcG9ydCB0eXBlIHsgQWxwaGEgfSBmcm9tICdAbW5hb3Vtb3YvdHlwZXNjcmlwdC1saWIvYWxwaGEnO2AuXG4gICAqL1xuICByZWFkb25seSBkZWZhdWx0SW1wb3J0U3RhdGVtZW50OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdGhlIGV4cG9ydCBpcyBhIHR5cGUgb25seSAoYW4gaW50ZXJmYWNlLCBhIHR5cGUgYWxpYXMgb3IgYW4gZW51bSksIGltcG9ydGVkIHdpdGggYGltcG9ydCB0eXBlYC5cbiAgICovXG4gIHJlYWRvbmx5IGlzVHlwZU9ubHk6IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFRoZSBleHBvcnQncyBraW5kLCBlLmcuIGBjbGFzc2AsIGBmdW5jdGlvbmAsIGBpbnRlcmZhY2VgLlxuICAgKi9cbiAgcmVhZG9ubHkga2luZDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgZXhwb3J0J3MgbmFtZS5cbiAgICovXG4gIHJlYWRvbmx5IG5hbWU6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIGV4cG9ydCdzIG5hbWVzcGFjZTogaXRzIHNvdXJjZSBwYXRoIHJlbGF0aXZlIHRvIHRoZSBzb3VyY2UgZm9sZGVyLCB3aXRob3V0IGl0cyBleHRlbnNpb24uXG4gICAqL1xuICByZWFkb25seSBuYW1lc3BhY2U6IHN0cmluZztcbn1cblxuLyoqXG4gKiBCdWlsZHMgdGhlIGltcG9ydCBzdGF0ZW1lbnQgb2YgYSBkb2N1bWVudGVkIGV4cG9ydC5cbiAqXG4gKiBAcGFyYW0gY29udGV4dCAtIFRoZSBleHBvcnQuXG4gKiBAcmV0dXJucyBUaGUgc3RhdGVtZW50LCBvciBgdW5kZWZpbmVkYCB0byBzaG93IG5vbmUuXG4gKi9cbmV4cG9ydCB0eXBlIEltcG9ydFN0YXRlbWVudFByb3ZpZGVyID0gKGNvbnRleHQ6IEltcG9ydFN0YXRlbWVudENvbnRleHQpID0+IHN0cmluZyB8IHVuZGVmaW5lZDtcblxuLyoqXG4gKiBCdWlsZHMgdGhlIGNhc2UtcHJlc2VydmVkIHJvdXRlIHNlZ21lbnQgb2YgYSBtZW1iZXIncyBwYWdlLlxuICpcbiAqIEBwYXJhbSBuYW1lIC0gQSBwcm9wZXJ0eSdzIG5hbWUsIG9yIGEgbWV0aG9kJ3Mgb3ZlcmxvYWQga2V5OiBpdHMgbmFtZSwgb3IgYG9uKCdjaGFuZ2VkJylgIGZvciBhbiBldmVudCBtZXRob2RcbiAqIGtleWVkIGJ5IGl0cyBmaXJzdCBhcmd1bWVudC5cbiAqIEByZXR1cm5zIFRoZSBzZWdtZW50LCBvciBgdW5kZWZpbmVkYCBmb3IgdGhlIGdlbmVyYXRvcidzIG93bi5cbiAqL1xuZXhwb3J0IHR5cGUgTWVtYmVyUm91dGVTZWdtZW50UHJvdmlkZXIgPSAobmFtZTogc3RyaW5nKSA9PiBzdHJpbmcgfCB1bmRlZmluZWQ7XG5cbmludGVyZmFjZSBNb2R1bGVTdGF0ZSB7XG4gIHNldHRpbmdzOiBBcGlEb2NTZXR0aW5ncyB8IHVuZGVmaW5lZDtcbn1cblxuY29uc3QgbW9kdWxlU3RhdGU6IE1vZHVsZVN0YXRlID0ge1xuICBzZXR0aW5nczogdW5kZWZpbmVkXG59O1xuXG4vKipcbiAqIFNldHMgdGhlIHNldHRpbmdzIGV2ZXJ5IGxhdGVyIHBhZ2UgYW5kIGxpbmsgcmVhZHMuXG4gKlxuICogQHBhcmFtIHNldHRpbmdzIC0gVGhlIHNldHRpbmdzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gY29uZmlndXJlQXBpRG9jcyhzZXR0aW5nczogQXBpRG9jU2V0dGluZ3MpOiB2b2lkIHtcbiAgbW9kdWxlU3RhdGUuc2V0dGluZ3MgPSBzZXR0aW5ncztcbn1cblxuLyoqXG4gKiBHZXRzIHRoZSBzZXR0aW5ncyBzZXQgYnkge0BsaW5rIGNvbmZpZ3VyZUFwaURvY3N9LlxuICpcbiAqIEByZXR1cm5zIFRoZSBzZXR0aW5ncy5cbiAqIEB0aHJvd3MgSWYge0BsaW5rIGNvbmZpZ3VyZUFwaURvY3N9IGhhcyBub3QgYmVlbiBjYWxsZWQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRBcGlEb2NTZXR0aW5ncygpOiBBcGlEb2NTZXR0aW5ncyB7XG4gIGlmIChtb2R1bGVTdGF0ZS5zZXR0aW5ncyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdUaGUgQVBJIGRvY3VtZW50YXRpb24gZ2VuZXJhdG9yIGlzIG5vdCBjb25maWd1cmVkOiBjYWxsIGNvbmZpZ3VyZUFwaURvY3MoKSBmaXJzdC4nKTtcbiAgfVxuXG4gIHJldHVybiBtb2R1bGVTdGF0ZS5zZXR0aW5ncztcbn1cbiJdLAogICJtYXBwaW5ncyI6ICI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBOEhBLE1BQU0sY0FBMkI7QUFBQSxFQUMvQixVQUFVO0FBQ1o7QUFPTyxTQUFTLGlCQUFpQixVQUFnQztBQUMvRCxjQUFZLFdBQVc7QUFDekI7QUFRTyxTQUFTLG9CQUFvQztBQUNsRCxNQUFJLFlBQVksYUFBYSxRQUFXO0FBQ3RDLFVBQU0sSUFBSSxNQUFNLG1GQUFtRjtBQUFBLEVBQ3JHO0FBRUEsU0FBTyxZQUFZO0FBQ3JCOyIsCiAgIm5hbWVzIjogW10KfQo=
47
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vLi4vc3JjL2RvY3Mtc2l0ZS9hcGktZG9jLXNldHRpbmdzLnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyIvKipcbiAqIEBmaWxlXG4gKlxuICogVGhlIHBlci1zaXRlIHNldHRpbmdzIG9mIHRoZSBBUEkgZG9jdW1lbnRhdGlvbiBnZW5lcmF0b3I6IHdoZXJlIGl0IHdyaXRlcywgd2hpY2ggcGFja2FnZSBpdCBkb2N1bWVudHMsIHRoZSBiYXNlXG4gKiBwYXRoIGl0cyBsaW5rcyBjYXJyeSwgYW5kIHRoZSBleHRlcm5hbCBsaW5rcyBhIHNpdGUgYWRkcyB0byB0aGUgZ2VuZXJpYyBvbmVzLlxuICovXG5cbi8qKlxuICogVGhlIHNldHRpbmdzIHRoZSBBUEkgZG9jdW1lbnRhdGlvbiBnZW5lcmF0b3IgcmVhZHMgd2hpbGUgaXQgcmVuZGVycyBwYWdlcyBhbmQgbGlua3MuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQXBpRG9jU2V0dGluZ3Mge1xuICAvKipcbiAgICogVGhlIHNpdGUncyBiYXNlIHBhdGgsIHdpdGggYSBsZWFkaW5nIHNsYXNoIGFuZCBubyB0cmFpbGluZyBvbmUsIGUuZy4gYC90eXBlc2NyaXB0LWxpYmAuIEV2ZXJ5IGluLWNvbnRlbnQgbGlua1xuICAgKiB0aGUgZ2VuZXJhdG9yIGVtaXRzIHN0YXJ0cyB3aXRoIGl0LlxuICAgKi9cbiAgcmVhZG9ubHkgYmFzZVBhdGg6IHN0cmluZztcblxuICAvKipcbiAgICogRm9sZGVyIG5hbWVzIHdob3NlIHN1YnRyZWUgaXMgbm90IGRvY3VtZW50ZWQsIGluIGFkZGl0aW9uIHRvIGBAdHlwZXNgLCBgc3R5bGVzYCBhbmQgYHRlc3QtaGVscGVyc2AuIEFwcGxpZXNcbiAgICogdG8gdGhpcyBzaXRlJ3Mgc291cmNlIHdhbGsgb25seTogYSBsaW5rIGludG8gYW5vdGhlciBwYWNrYWdlJ3Mgc2l0ZSBhc3N1bWVzIHRoYXQgc2l0ZSdzIGdlbmVyYXRvciBza2lwcGVkIHRoZVxuICAgKiBkZWZhdWx0IGZvbGRlcnMgYWxvbmUuXG4gICAqL1xuICByZWFkb25seSBleGNsdWRlZERpcmVjdG9yaWVzPzogcmVhZG9ubHkgc3RyaW5nW10gfCB1bmRlZmluZWQ7XG5cbiAgLyoqXG4gICAqIFR5cGUgbmFtZXMgbWFwcGVkIHRvIHRoZSBVUkwgdGhlaXIgcmVmZXJlbmNlcyBsaW5rIHRvLCBmb3IgdHlwZXMgbmVpdGhlciB0aGlzIHBhY2thZ2Ugbm9yIGEge0BsaW5rIHBhY2thZ2VTaXRlc31cbiAgICogcGFja2FnZSBkZWNsYXJlcywgZS5nLiBhbiBlY29zeXN0ZW0ncyBvd24gQVBJIHJlZmVyZW5jZS4gQ29uc3VsdGVkIGJlZm9yZSB0aGUgZ2VuZXJpYyBUeXBlU2NyaXB0LCBKYXZhU2NyaXB0IGFuZFxuICAgKiBXZWIgQVBJIGxpbmtzLCBzbyBhbiBlbnRyeSBoZXJlIHdpbnMgb3ZlciB0aGVtLlxuICAgKi9cbiAgcmVhZG9ubHkgZXh0ZXJuYWxUeXBlTGlua3M6IFJlYWRvbmx5TWFwPHN0cmluZywgc3RyaW5nPjtcblxuICAvKipcbiAgICogTmFtZXMgdGhhdCBhcmUgbmV2ZXIgbGlua2VkIGFzIHR5cGVzLCBpbiBhZGRpdGlvbiB0byB0aGUgYnVpbHQtaW4gZ2VuZXJpYyBwYXJhbWV0ZXIgbmFtZXMgYW5kIGV2ZXJ5IHR5cGVcbiAgICogcGFyYW1ldGVyIGEgZG9jdW1lbnRlZCB0eXBlIGRlY2xhcmVzOiB0eXBlIHBhcmFtZXRlcnMgdGhlIHNjYW4gZG9lcyBub3QgZmluZC5cbiAgICovXG4gIHJlYWRvbmx5IGdlbmVyaWNUeXBlUGFyYW1ldGVycz86IHJlYWRvbmx5IHN0cmluZ1tdIHwgdW5kZWZpbmVkO1xuXG4gIC8qKlxuICAgKiBCdWlsZHMgZWFjaCBleHBvcnQncyBpbXBvcnQgc3RhdGVtZW50LCBmb3IgYSBwYWNrYWdlIHdob3NlIGV4cG9ydHMgYXJlIG5vdCBpbXBvcnRlZCBmcm9tXG4gICAqIGA8cGFja2FnZU5hbWU+LzxuYW1lc3BhY2U+YCwgZS5nLiBvbmUgcHVibGlzaGluZyBiYXJyZWwgZW50cnkgcG9pbnRzLiBSZXR1cm5pbmcgYHVuZGVmaW5lZGAgc2hvd3Mgbm8gc3RhdGVtZW50LlxuICAgKiBVbnNldCwgZXZlcnkgc3RhdGVtZW50IGlzIHRoZSB7QGxpbmsgSW1wb3J0U3RhdGVtZW50Q29udGV4dC5kZWZhdWx0SW1wb3J0U3RhdGVtZW50fS5cbiAgICovXG4gIHJlYWRvbmx5IGltcG9ydFN0YXRlbWVudD86IEltcG9ydFN0YXRlbWVudFByb3ZpZGVyIHwgdW5kZWZpbmVkO1xuXG4gIC8qKlxuICAgKiBCdWlsZHMgdGhlIGNhc2UtcHJlc2VydmVkIHJvdXRlIHNlZ21lbnQgb2YgYSBtZW1iZXIncyBwYWdlLCBvdmVycmlkaW5nIHRoZSBnZW5lcmF0b3IncyBzbHVnIHdoZXJlIGl0IHJldHVybnMgYVxuICAgKiBzdHJpbmcuIFRoZSBmaWxlIGlzIHdyaXR0ZW4gdW5kZXIgdGhlIHNlZ21lbnQgbG93ZXJjYXNlZC4gVGhlIGdlbmVyYXRvcidzIG93biBzbHVnIGFscmVhZHkga2VlcHMgYSBuYW1lJ3NcbiAgICogdHJhaWxpbmcgdW5kZXJzY29yZXMsIHNvIGBjcmVhdGVfX2AgYW5kIGBjcmVhdGVgIG5ldmVyIHNoYXJlIGEgcGFnZS5cbiAgICovXG4gIHJlYWRvbmx5IG1lbWJlclJvdXRlU2VnbWVudD86IE1lbWJlclJvdXRlU2VnbWVudFByb3ZpZGVyIHwgdW5kZWZpbmVkO1xuXG4gIC8qKlxuICAgKiBUaGUgZm9sZGVyIHRoZSBnZW5lcmF0ZWQgQVBJIHBhZ2VzIGFyZSB3cml0dGVuIHRvLCBub3JtYWxseSBgPGRvY3M+L3NyYy9jb250ZW50L2RvY3MvYXBpYC5cbiAgICovXG4gIHJlYWRvbmx5IG91dHB1dERpcmVjdG9yeTogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgZG9jdW1lbnRlZCBwYWNrYWdlJ3MgbmFtZSwgZS5nLiBgQG1uYW91bW92L3R5cGVzY3JpcHQtbGliYC4gSW1wb3J0IHN0YXRlbWVudHMgYXJlIGJ1aWx0IGZyb20gaXQsIHVubGVzc1xuICAgKiB7QGxpbmsgaW1wb3J0U3RhdGVtZW50fSBidWlsZHMgdGhlbS5cbiAgICovXG4gIHJlYWRvbmx5IHBhY2thZ2VOYW1lOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFBhY2thZ2UgbmFtZXMgbWFwcGVkIHRvIHRoZSByb290IFVSTCBvZiB0aGVpciBkb2N1bWVudGF0aW9uIHNpdGUsIHdpdGggYSB0cmFpbGluZyBzbGFzaC4gQSB0eXBlIHdob3NlXG4gICAqIGRlY2xhcmF0aW9uIHJlc29sdmVzIGludG8gb25lIG9mIHRoZXNlIHBhY2thZ2VzIGxpbmtzIHRvIGl0cyBwYWdlIG9uIHRoYXQgc2l0ZS5cbiAgICovXG4gIHJlYWRvbmx5IHBhY2thZ2VTaXRlczogUmVhZG9ubHlNYXA8c3RyaW5nLCBzdHJpbmc+O1xuXG4gIC8qKlxuICAgKiBUaGUgYWJzb2x1dGUgcGF0aCBvZiB0aGUgcGFja2FnZSdzIG9uZSBwdWJsaWMgZW50cnkgcG9pbnQsIGZvciBhIHBhY2thZ2UgdGhhdCBwdWJsaXNoZXMgaXRzIEFQSSBmcm9tIGEgYmFycmVsXG4gICAqIHJhdGhlciB0aGFuIG9uZSBpbXBvcnQgc3VicGF0aCBwZXIgbW9kdWxlLiBTZXQsIHRoZSByZWZlcmVuY2UgZG9jdW1lbnRzIG9ubHkgdGhlIGV4cG9ydHMgdGhhdCBiYXJyZWwgcmUtZXhwb3J0cyxcbiAgICogZm91bmQgYnkgZm9sbG93aW5nIGl0cyBgZXhwb3J0IC4uLiBmcm9tYCBzdGF0ZW1lbnRzIHJhdGhlciB0aGFuIGJ5IHdhbGtpbmcgdGhlIHNvdXJjZSBmb2xkZXIsIGFuZCBldmVyeSBpbXBvcnRcbiAgICogc3RhdGVtZW50IGltcG9ydHMgZnJvbSB0aGUgcGFja2FnZSByb290LiBBIG5hbWVzcGFjZSBzdGlsbCBncm91cHMgdGhlIHJlZmVyZW5jZSBieSBzb3VyY2UgbW9kdWxlLlxuICAgKi9cbiAgcmVhZG9ubHkgcHVibGljQXBpRW50cnk/OiBzdHJpbmcgfCB1bmRlZmluZWQ7XG5cbiAgLyoqXG4gICAqIFRoZSBKU09OIGZpbGUgdGhlIGdlbmVyYXRlZCBTdGFybGlnaHQgc2lkZWJhciBpcyB3cml0dGVuIHRvLlxuICAgKi9cbiAgcmVhZG9ubHkgc2lkZWJhckZpbGU6IHN0cmluZztcbn1cblxuLyoqXG4gKiBXaGF0IHtAbGluayBBcGlEb2NTZXR0aW5ncy5pbXBvcnRTdGF0ZW1lbnR9IGlzIHRvbGQgYWJvdXQgdGhlIGV4cG9ydCB3aG9zZSBpbXBvcnQgc3RhdGVtZW50IGl0IGJ1aWxkcy5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJbXBvcnRTdGF0ZW1lbnRDb250ZXh0IHtcbiAgLyoqXG4gICAqIFRoZSBzdGF0ZW1lbnQgdGhlIGdlbmVyYXRvciB3cml0ZXMgd2hlbiBubyBob29rIGlzIHNldCwgZS5nLlxuICAgKiBgaW1wb3J0IHR5cGUgeyBBbHBoYSB9IGZyb20gJ0BtbmFvdW1vdi90eXBlc2NyaXB0LWxpYi9hbHBoYSc7YC5cbiAgICovXG4gIHJlYWRvbmx5IGRlZmF1bHRJbXBvcnRTdGF0ZW1lbnQ6IHN0cmluZztcblxuICAvKipcbiAgICogV2hldGhlciB0aGUgZXhwb3J0IGlzIGEgdHlwZSBvbmx5IChhbiBpbnRlcmZhY2UsIGEgdHlwZSBhbGlhcyBvciBhbiBlbnVtKSwgaW1wb3J0ZWQgd2l0aCBgaW1wb3J0IHR5cGVgLlxuICAgKi9cbiAgcmVhZG9ubHkgaXNUeXBlT25seTogYm9vbGVhbjtcblxuICAvKipcbiAgICogVGhlIGV4cG9ydCdzIGtpbmQsIGUuZy4gYGNsYXNzYCwgYGZ1bmN0aW9uYCwgYGludGVyZmFjZWAuXG4gICAqL1xuICByZWFkb25seSBraW5kOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBleHBvcnQncyBuYW1lLlxuICAgKi9cbiAgcmVhZG9ubHkgbmFtZTogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgZXhwb3J0J3MgbmFtZXNwYWNlOiBpdHMgc291cmNlIHBhdGggcmVsYXRpdmUgdG8gdGhlIHNvdXJjZSBmb2xkZXIsIHdpdGhvdXQgaXRzIGV4dGVuc2lvbi5cbiAgICovXG4gIHJlYWRvbmx5IG5hbWVzcGFjZTogc3RyaW5nO1xufVxuXG4vKipcbiAqIEJ1aWxkcyB0aGUgaW1wb3J0IHN0YXRlbWVudCBvZiBhIGRvY3VtZW50ZWQgZXhwb3J0LlxuICpcbiAqIEBwYXJhbSBjb250ZXh0IC0gVGhlIGV4cG9ydC5cbiAqIEByZXR1cm5zIFRoZSBzdGF0ZW1lbnQsIG9yIGB1bmRlZmluZWRgIHRvIHNob3cgbm9uZS5cbiAqL1xuZXhwb3J0IHR5cGUgSW1wb3J0U3RhdGVtZW50UHJvdmlkZXIgPSAoY29udGV4dDogSW1wb3J0U3RhdGVtZW50Q29udGV4dCkgPT4gc3RyaW5nIHwgdW5kZWZpbmVkO1xuXG4vKipcbiAqIEJ1aWxkcyB0aGUgY2FzZS1wcmVzZXJ2ZWQgcm91dGUgc2VnbWVudCBvZiBhIG1lbWJlcidzIHBhZ2UuXG4gKlxuICogQHBhcmFtIG5hbWUgLSBBIHByb3BlcnR5J3MgbmFtZSwgb3IgYSBtZXRob2QncyBvdmVybG9hZCBrZXk6IGl0cyBuYW1lLCBvciBgb24oJ2NoYW5nZWQnKWAgZm9yIGFuIGV2ZW50IG1ldGhvZFxuICoga2V5ZWQgYnkgaXRzIGZpcnN0IGFyZ3VtZW50LlxuICogQHJldHVybnMgVGhlIHNlZ21lbnQsIG9yIGB1bmRlZmluZWRgIGZvciB0aGUgZ2VuZXJhdG9yJ3Mgb3duLlxuICovXG5leHBvcnQgdHlwZSBNZW1iZXJSb3V0ZVNlZ21lbnRQcm92aWRlciA9IChuYW1lOiBzdHJpbmcpID0+IHN0cmluZyB8IHVuZGVmaW5lZDtcblxuaW50ZXJmYWNlIE1vZHVsZVN0YXRlIHtcbiAgc2V0dGluZ3M6IEFwaURvY1NldHRpbmdzIHwgdW5kZWZpbmVkO1xufVxuXG5jb25zdCBtb2R1bGVTdGF0ZTogTW9kdWxlU3RhdGUgPSB7XG4gIHNldHRpbmdzOiB1bmRlZmluZWRcbn07XG5cbi8qKlxuICogU2V0cyB0aGUgc2V0dGluZ3MgZXZlcnkgbGF0ZXIgcGFnZSBhbmQgbGluayByZWFkcy5cbiAqXG4gKiBAcGFyYW0gc2V0dGluZ3MgLSBUaGUgc2V0dGluZ3MuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjb25maWd1cmVBcGlEb2NzKHNldHRpbmdzOiBBcGlEb2NTZXR0aW5ncyk6IHZvaWQge1xuICBtb2R1bGVTdGF0ZS5zZXR0aW5ncyA9IHNldHRpbmdzO1xufVxuXG4vKipcbiAqIEdldHMgdGhlIHNldHRpbmdzIHNldCBieSB7QGxpbmsgY29uZmlndXJlQXBpRG9jc30uXG4gKlxuICogQHJldHVybnMgVGhlIHNldHRpbmdzLlxuICogQHRocm93cyBJZiB7QGxpbmsgY29uZmlndXJlQXBpRG9jc30gaGFzIG5vdCBiZWVuIGNhbGxlZC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldEFwaURvY1NldHRpbmdzKCk6IEFwaURvY1NldHRpbmdzIHtcbiAgaWYgKG1vZHVsZVN0YXRlLnNldHRpbmdzID09PSB1bmRlZmluZWQpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ1RoZSBBUEkgZG9jdW1lbnRhdGlvbiBnZW5lcmF0b3IgaXMgbm90IGNvbmZpZ3VyZWQ6IGNhbGwgY29uZmlndXJlQXBpRG9jcygpIGZpcnN0LicpO1xuICB9XG5cbiAgcmV0dXJuIG1vZHVsZVN0YXRlLnNldHRpbmdzO1xufVxuIl0sCiAgIm1hcHBpbmdzIjogIjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFzSUEsTUFBTSxjQUEyQjtBQUFBLEVBQy9CLFVBQVU7QUFDWjtBQU9PLFNBQVMsaUJBQWlCLFVBQWdDO0FBQy9ELGNBQVksV0FBVztBQUN6QjtBQVFPLFNBQVMsb0JBQW9DO0FBQ2xELE1BQUksWUFBWSxhQUFhLFFBQVc7QUFDdEMsVUFBTSxJQUFJLE1BQU0sbUZBQW1GO0FBQUEsRUFDckc7QUFFQSxTQUFPLFlBQVk7QUFDckI7IiwKICAibmFtZXMiOiBbXQp9Cg==
@@ -57,6 +57,13 @@ export interface ApiDocSettings {
57
57
  * declaration resolves into one of these packages links to its page on that site.
58
58
  */
59
59
  readonly packageSites: ReadonlyMap<string, string>;
60
+ /**
61
+ * The absolute path of the package's one public entry point, for a package that publishes its API from a barrel
62
+ * rather than one import subpath per module. Set, the reference documents only the exports that barrel re-exports,
63
+ * found by following its `export ... from` statements rather than by walking the source folder, and every import
64
+ * statement imports from the package root. A namespace still groups the reference by source module.
65
+ */
66
+ readonly publicApiEntry?: string | undefined;
60
67
  /**
61
68
  * The JSON file the generated Starlight sidebar is written to.
62
69
  */
@@ -62,7 +62,9 @@ __export(api_doc_source_processing_exports, {
62
62
  computeCacheHash: () => computeCacheHash,
63
63
  computeNamespace: () => computeNamespace,
64
64
  findEntryFiles: () => findEntryFiles,
65
+ keepPublicApi: () => keepPublicApi,
65
66
  processSourceFile: () => processSourceFile,
67
+ readPublicApiBarrel: () => readPublicApiBarrel,
66
68
  registerGenericTypeParams: () => registerGenericTypeParams
67
69
  });
68
70
  module.exports = __toCommonJS(api_doc_source_processing_exports);
@@ -70,6 +72,7 @@ var import_node_crypto = require('node:crypto');
70
72
  var import_node_fs = require('node:fs');
71
73
  var import_node_path = require('node:path');
72
74
  var import_ts_morph = require('ts-morph');
75
+ var import_typescript = require('typescript');
73
76
  var import_api_doc_constants = require('./api-doc-constants.cjs');
74
77
  var import_api_doc_documented_files = require('./api-doc-documented-files.cjs');
75
78
  var import_api_doc_jsdoc = require('./api-doc-jsdoc.cjs');
@@ -211,6 +214,13 @@ function findEntryFiles(directory, excludedDirectories = []) {
211
214
  }
212
215
  return results;
213
216
  }
217
+ function keepPublicApi(types, barrel) {
218
+ for (const [key, info] of types) {
219
+ if (!barrel.wholeNamespaces.has(info.namespace) && !barrel.publicKeys.has(key)) {
220
+ types.delete(key);
221
+ }
222
+ }
223
+ }
214
224
  function processSourceFile(src, types, namespace) {
215
225
  for (const alias of src.getTypeAliases()) {
216
226
  if (!alias.isExported()) {
@@ -253,6 +263,42 @@ function processSourceFile(src, types, namespace) {
253
263
  }
254
264
  }
255
265
  }
266
+ function readPublicApiBarrel(entryFile, sourceDirectory) {
267
+ const sourceFile = (0, import_typescript.createSourceFile)(entryFile, (0, import_node_fs.readFileSync)(entryFile, "utf-8"), import_typescript.ScriptTarget.Latest);
268
+ const files = /* @__PURE__ */ new Set();
269
+ const publicKeys = /* @__PURE__ */ new Set();
270
+ const wholeNamespaces = /* @__PURE__ */ new Set();
271
+ for (const statement of sourceFile.statements) {
272
+ if (!(0, import_typescript.isExportDeclaration)(statement) || statement.moduleSpecifier === void 0 || !(0, import_typescript.isStringLiteral)(statement.moduleSpecifier)) {
273
+ continue;
274
+ }
275
+ const moduleSpecifier = statement.moduleSpecifier.text;
276
+ if (!moduleSpecifier.startsWith(".")) {
277
+ throw new Error(`${entryFile} re-exports '${moduleSpecifier}', which is not a module of this package.`);
278
+ }
279
+ const filePath = (0, import_node_path.resolve)((0, import_node_path.dirname)(entryFile), moduleSpecifier);
280
+ if (!(0, import_node_fs.existsSync)(filePath)) {
281
+ throw new Error(`${entryFile} re-exports '${moduleSpecifier}', which does not exist.`);
282
+ }
283
+ files.add(filePath);
284
+ const namespace = computeNamespace(sourceDirectory, filePath);
285
+ const { exportClause } = statement;
286
+ if (exportClause === void 0) {
287
+ wholeNamespaces.add(namespace);
288
+ continue;
289
+ }
290
+ if ((0, import_typescript.isNamespaceExport)(exportClause)) {
291
+ throw new Error(`${entryFile} re-exports '${moduleSpecifier}' as a namespace, which the API reference cannot document.`);
292
+ }
293
+ for (const element of exportClause.elements) {
294
+ if (element.propertyName !== void 0) {
295
+ throw new Error(`${entryFile} renames '${element.propertyName.text}' to '${element.name.text}', which the API reference cannot document.`);
296
+ }
297
+ publicKeys.add(qualifiedKey(namespace, element.name.text));
298
+ }
299
+ }
300
+ return { files: [...files], publicKeys, wholeNamespaces };
301
+ }
256
302
  function registerGenericTypeParams(types) {
257
303
  for (const name of (0, import_api_doc_settings.getApiDocSettings)().genericTypeParameters ?? []) {
258
304
  import_api_doc_constants.GENERIC_TYPE_PARAMS.add(name);
@@ -284,7 +330,9 @@ function qualifiedKey(namespace, name) {
284
330
  computeCacheHash,
285
331
  computeNamespace,
286
332
  findEntryFiles,
333
+ keepPublicApi,
287
334
  processSourceFile,
335
+ readPublicApiBarrel,
288
336
  registerGenericTypeParams
289
337
  });
290
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9kb2NzLXNpdGUvYXBpLWRvYy1zb3VyY2UtcHJvY2Vzc2luZy50cyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBmaWxlXG4gKlxuICogU291cmNlIGRpc2NvdmVyeSArIGV4dHJhY3Rpb246IHdhbGtzIGBzcmNgLCBmaWx0ZXJzIHRvIGRvY3VtZW50YWJsZSBlbnRyeSBmaWxlcywgYW5kIHR1cm5zIGVhY2hcbiAqIGZpbGUncyBleHBvcnRlZCBkZWNsYXJhdGlvbnMgaW50byBgVHlwZUluZm9gIGVudHJpZXMga2V5ZWQgYnkgYSBxdWFsaWZpZWQgYCR7bmFtZXNwYWNlfSMke25hbWV9YC5cbiAqL1xuXG5pbXBvcnQgdHlwZSB7IFNvdXJjZUZpbGUgfSBmcm9tICd0cy1tb3JwaCc7XG5cbmltcG9ydCB7IGNyZWF0ZUhhc2ggfSBmcm9tICdub2RlOmNyeXB0byc7XG5pbXBvcnQge1xuICByZWFkZGlyU3luYyxcbiAgcmVhZEZpbGVTeW5jXG59IGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHtcbiAgam9pbixcbiAgcmVsYXRpdmVcbn0gZnJvbSAnbm9kZTpwYXRoJztcbmltcG9ydCB7IE5vZGUgfSBmcm9tICd0cy1tb3JwaCc7XG5cbmltcG9ydCB0eXBlIHsgVHlwZUluZm8gfSBmcm9tICcuL2FwaS1kb2MtdHlwZXMudHMnO1xuXG5pbXBvcnQgeyBHRU5FUklDX1RZUEVfUEFSQU1TIH0gZnJvbSAnLi9hcGktZG9jLWNvbnN0YW50cy50cyc7XG5pbXBvcnQge1xuICBpc0RvY3VtZW50ZWREaXJlY3RvcnlOYW1lLFxuICBpc0RvY3VtZW50ZWRGaWxlTmFtZVxufSBmcm9tICcuL2FwaS1kb2MtZG9jdW1lbnRlZC1maWxlcy50cyc7XG5pbXBvcnQge1xuICBleHRyYWN0Q2xhc3NJbmZvLFxuICBleHRyYWN0RW51bUluZm8sXG4gIGV4dHJhY3RJbnRlcmZhY2VJbmZvLFxuICBleHRyYWN0VHlwZUFsaWFzSW5mbyxcbiAgZ2V0RGVzY3JpcHRpb24sXG4gIGdldEV4YW1wbGVzLFxuICBnZXRQYXJhbWV0ZXJEZXNjcmlwdGlvbnMsXG4gIGdldFJlbWFya3MsXG4gIGdldFJldHVybkRlc2NyaXB0aW9uLFxuICBnZXRTaW5jZVxufSBmcm9tICcuL2FwaS1kb2MtanNkb2MudHMnO1xuaW1wb3J0IHsgcmVnaXN0ZXJQYWNrYWdlRGVjbGFyYXRpb24gfSBmcm9tICcuL2FwaS1kb2MtcGFja2FnZS1zaXRlcy50cyc7XG5pbXBvcnQgeyBnZXRBcGlEb2NTZXR0aW5ncyB9IGZyb20gJy4vYXBpLWRvYy1zZXR0aW5ncy50cyc7XG5pbXBvcnQgeyBzaW1wbGlmeVR5cGUgfSBmcm9tICcuL2FwaS1kb2MtdGV4dC11dGlscy50cyc7XG5cbi8qKlxuICogQ29sbGVjdCB0b3AtbGV2ZWwgZXhwb3J0ZWQgZnVuY3Rpb25zLlxuICpcbiAqIEBwYXJhbSBzcmMgLSBUaGUgc291cmNlIGZpbGUuXG4gKiBAcGFyYW0gdHlwZXMgLSBUaGUgZG9jdW1lbnRlZCB0eXBlcywga2V5ZWQgYnkgcXVhbGlmaWVkIGlkLlxuICogQHBhcmFtIG5hbWVzcGFjZSAtIFRoZSB0eXBlJ3MgbmFtZXNwYWNlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gY29sbGVjdEZ1bmN0aW9ucyhzcmM6IFNvdXJjZUZpbGUsIHR5cGVzOiBNYXA8c3RyaW5nLCBUeXBlSW5mbz4sIG5hbWVzcGFjZTogc3RyaW5nKTogdm9pZCB7XG4gIGZvciAoY29uc3QgJGZ1bmN0aW9uIG9mIHNyYy5nZXRGdW5jdGlvbnMoKSkge1xuICAgIGlmICghJGZ1bmN0aW9uLmlzRXhwb3J0ZWQoKSkge1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIGNvbnN0IG5hbWUgPSAkZnVuY3Rpb24uZ2V0TmFtZSgpO1xuICAgIGlmICghbmFtZSkge1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIGNvbnN0IGtleSA9IHF1YWxpZmllZEtleShuYW1lc3BhY2UsIG5hbWUpO1xuICAgIGlmICh0eXBlcy5oYXMoa2V5KSkge1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIGNvbnN0IHBhcmFtZXRlckRlc2NyaXB0aW9ucyA9IGdldFBhcmFtZXRlckRlc2NyaXB0aW9ucygkZnVuY3Rpb24pO1xuICAgIGNvbnN0IHBhcmFtcyA9ICRmdW5jdGlvbi5nZXRQYXJhbWV0ZXJzKCkubWFwKChwKSA9PiAoe1xuICAgICAgZGVzY3JpcHRpb246IHBhcmFtZXRlckRlc2NyaXB0aW9ucy5nZXQocC5nZXROYW1lKCkpID8/ICcnLFxuICAgICAgbmFtZTogcC5nZXROYW1lKCksXG4gICAgICB0eXBlOiBzaW1wbGlmeVR5cGUocC5nZXRUeXBlKCkuZ2V0VGV4dCgpKVxuICAgIH0pKTtcbiAgICBjb25zdCBwYXJhbWV0ZXJTdHJpbmcgPSBwYXJhbXMubWFwKChwKSA9PiBgJHtwLm5hbWV9OiAke3AudHlwZX1gKS5qb2luKCcsICcpO1xuICAgIGNvbnN0IHJldHVyblR5cGUgPSBzaW1wbGlmeVR5cGUoJGZ1bmN0aW9uLmdldFJldHVyblR5cGUoKS5nZXRUZXh0KCkpO1xuICAgIGNvbnN0IHNpZ25hdHVyZSA9IGAke25hbWV9KCR7cGFyYW1ldGVyU3RyaW5nfSlgO1xuICAgIHR5cGVzLnNldChrZXksIHtcbiAgICAgIGJhc2VUeXBlczogW10sXG4gICAgICBkZXNjcmlwdGlvbjogZ2V0RGVzY3JpcHRpb24oJGZ1bmN0aW9uKSxcbiAgICAgIGVudW1NZW1iZXJzOiBbXSxcbiAgICAgIGV4YW1wbGVzOiBnZXRFeGFtcGxlcygkZnVuY3Rpb24pLFxuICAgICAgaW1wbGVtZW50c1R5cGVzOiBbXSxcbiAgICAgIGtpbmQ6ICdmdW5jdGlvbicsXG4gICAgICBtZXRob2RzOiBbe1xuICAgICAgICBkZXNjcmlwdGlvbjogZ2V0RGVzY3JpcHRpb24oJGZ1bmN0aW9uKSxcbiAgICAgICAgZXhhbXBsZXM6IGdldEV4YW1wbGVzKCRmdW5jdGlvbiksXG4gICAgICAgIGluaGVyaXRlZEZyb206ICcnLFxuICAgICAgICBpc1N0YXRpYzogZmFsc2UsXG4gICAgICAgIG5hbWUsXG4gICAgICAgIG92ZXJsb2FkS2V5OiBuYW1lLFxuICAgICAgICBwYXJhbWV0ZXJzOiBwYXJhbXMsXG4gICAgICAgIHJlbWFya3M6IGdldFJlbWFya3MoJGZ1bmN0aW9uKSxcbiAgICAgICAgcmV0dXJuRGVzY3JpcHRpb246IGdldFJldHVybkRlc2NyaXB0aW9uKCRmdW5jdGlvbiksXG4gICAgICAgIHJldHVyblR5cGUsXG4gICAgICAgIHNpZ25hdHVyZSxcbiAgICAgICAgc2luY2U6IGdldFNpbmNlKCRmdW5jdGlvbiksXG4gICAgICAgIHR5cGU6ICcnXG4gICAgICB9XSxcbiAgICAgIG5hbWUsXG4gICAgICBuYW1lc3BhY2UsXG4gICAgICBwcm9wZXJ0aWVzOiBbXSxcbiAgICAgIHJlbWFya3M6IGdldFJlbWFya3MoJGZ1bmN0aW9uKSxcbiAgICAgIHR5cGVQYXJhbWV0ZXJzOiAkZnVuY3Rpb24uZ2V0VHlwZVBhcmFtZXRlcnMoKS5tYXAoKHRwKSA9PiB0cC5nZXRUZXh0KCkpXG4gICAgfSk7XG4gIH1cbn1cblxuLyoqXG4gKiBSZWNvcmRzIHdoZXJlIGV2ZXJ5IHN5bWJvbCBhIHNvdXJjZSBmaWxlIGltcG9ydHMgaXMgZGVjbGFyZWQsIHNvIGEgdHlwZSBhbm90aGVyIGRvY3VtZW50ZWQgcGFja2FnZSBkZWNsYXJlc1xuICogbGlua3MgdG8gdGhhdCBwYWNrYWdlJ3Mgc2l0ZS5cbiAqXG4gKiBAcGFyYW0gc3JjIC0gVGhlIHNvdXJjZSBmaWxlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gY29sbGVjdFBhY2thZ2VEZWNsYXJhdGlvbnMoc3JjOiBTb3VyY2VGaWxlKTogdm9pZCB7XG4gIGZvciAoY29uc3QgaW1wb3J0RGVjbGFyYXRpb24gb2Ygc3JjLmdldEltcG9ydERlY2xhcmF0aW9ucygpKSB7XG4gICAgZm9yIChjb25zdCBuYW1lZEltcG9ydCBvZiBpbXBvcnREZWNsYXJhdGlvbi5nZXROYW1lZEltcG9ydHMoKSkge1xuICAgICAgLy8gQW4gdW5yZXNvbHZlZCBpbXBvcnQgYWxpYXNlcyB0aGUgY2hlY2tlcidzIHVua25vd24gc3ltYm9sLCB3aGljaCBoYXMgbm8gZGVjbGFyYXRpb25zLlxuICAgICAgLy8gQSByZW5hbWVkIGltcG9ydCBjYXJyaWVzIGl0cyBzeW1ib2wgb24gdGhlIGxvY2FsIG5hbWUuXG4gICAgICBjb25zdCBsb2NhbE5hbWVOb2RlID0gbmFtZWRJbXBvcnQuZ2V0QWxpYXNOb2RlKCkgPz8gbmFtZWRJbXBvcnQuZ2V0TmFtZU5vZGUoKTtcbiAgICAgIGNvbnN0IGRlY2xhcmF0aW9ucyA9IGxvY2FsTmFtZU5vZGUuZ2V0U3ltYm9sT3JUaHJvdygpLmdldEFsaWFzZWRTeW1ib2xPclRocm93KCkuZ2V0RGVjbGFyYXRpb25zKCk7XG4gICAgICBmb3IgKGNvbnN0IGRlY2xhcmF0aW9uIG9mIGRlY2xhcmF0aW9ucykge1xuICAgICAgICAvLyBPbmx5IGEgdHlwZSBpcyBsaW5rZWQgZnJvbSB0eXBlIHRleHQ7IGEgZnVuY3Rpb24ncyBuYW1lIGFsc28gbWF0Y2hlcyB3b3JkcyB0aGF0IGFyZSBub3QgcmVmZXJlbmNlcyB0byBpdC5cbiAgICAgICAgaWYgKGlzVHlwZURlY2xhcmF0aW9uKGRlY2xhcmF0aW9uKSkge1xuICAgICAgICAgIHJlZ2lzdGVyUGFja2FnZURlY2xhcmF0aW9uKG5hbWVkSW1wb3J0LmdldE5hbWUoKSwgZGVjbGFyYXRpb24uZ2V0U291cmNlRmlsZSgpLmdldEZpbGVQYXRoKCkpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG59XG5cbi8qKlxuICogQ29sbGVjdCB0b3AtbGV2ZWwgZXhwb3J0ZWQgdmFyaWFibGUgZGVjbGFyYXRpb25zIChlLmcuIGBleHBvcnQgY29uc3QgRU1QVFkgPSAnJ2ApLlxuICpcbiAqIEBwYXJhbSBzcmMgLSBUaGUgc291cmNlIGZpbGUuXG4gKiBAcGFyYW0gdHlwZXMgLSBUaGUgZG9jdW1lbnRlZCB0eXBlcywga2V5ZWQgYnkgcXVhbGlmaWVkIGlkLlxuICogQHBhcmFtIG5hbWVzcGFjZSAtIFRoZSB0eXBlJ3MgbmFtZXNwYWNlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gY29sbGVjdFZhcmlhYmxlcyhzcmM6IFNvdXJjZUZpbGUsIHR5cGVzOiBNYXA8c3RyaW5nLCBUeXBlSW5mbz4sIG5hbWVzcGFjZTogc3RyaW5nKTogdm9pZCB7XG4gIGZvciAoY29uc3QgdmFyaWFibGVTdGF0ZW1lbnQgb2Ygc3JjLmdldFZhcmlhYmxlU3RhdGVtZW50cygpKSB7XG4gICAgaWYgKCF2YXJpYWJsZVN0YXRlbWVudC5pc0V4cG9ydGVkKCkpIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICBjb25zdCBkZWNsYXJhdGlvbktpbmQgPSB2YXJpYWJsZVN0YXRlbWVudC5nZXREZWNsYXJhdGlvbktpbmQoKTtcbiAgICBmb3IgKGNvbnN0IGRlY2xhcmF0aW9uIG9mIHZhcmlhYmxlU3RhdGVtZW50LmdldERlY2xhcmF0aW9ucygpKSB7XG4gICAgICBjb25zdCBuYW1lID0gZGVjbGFyYXRpb24uZ2V0TmFtZSgpO1xuICAgICAgY29uc3Qga2V5ID0gcXVhbGlmaWVkS2V5KG5hbWVzcGFjZSwgbmFtZSk7XG4gICAgICBpZiAodHlwZXMuaGFzKGtleSkpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICB0eXBlcy5zZXQoa2V5LCB7XG4gICAgICAgIGJhc2VUeXBlczogW10sXG4gICAgICAgIGRlc2NyaXB0aW9uOiBnZXREZXNjcmlwdGlvbih2YXJpYWJsZVN0YXRlbWVudCksXG4gICAgICAgIGVudW1NZW1iZXJzOiBbXSxcbiAgICAgICAgZXhhbXBsZXM6IGdldEV4YW1wbGVzKHZhcmlhYmxlU3RhdGVtZW50KSxcbiAgICAgICAgaW1wbGVtZW50c1R5cGVzOiBbXSxcbiAgICAgICAga2luZDogJ3ZhcmlhYmxlJyxcbiAgICAgICAgbWV0aG9kczogW10sXG4gICAgICAgIG5hbWUsXG4gICAgICAgIG5hbWVzcGFjZSxcbiAgICAgICAgcHJvcGVydGllczogW10sXG4gICAgICAgIHJlbWFya3M6IGdldFJlbWFya3ModmFyaWFibGVTdGF0ZW1lbnQpLFxuICAgICAgICB0eXBlUGFyYW1ldGVyczogW10sXG4gICAgICAgIHZhcmlhYmxlS2V5d29yZDogZGVjbGFyYXRpb25LaW5kLFxuICAgICAgICB2YXJpYWJsZVR5cGU6IHNpbXBsaWZ5VHlwZShkZWNsYXJhdGlvbi5nZXRUeXBlKCkuZ2V0VGV4dCgpKVxuICAgICAgfSk7XG4gICAgfVxuICB9XG59XG5cbi8qKlxuICogQ29tcHV0ZSBhIGhhc2ggb2YgZXZlcnkgaW5wdXQgdGhhdCBkZWNpZGVzIHRoZSBnZW5lcmF0ZWQgcGFnZXM6IHRoZSBnZW5lcmF0b3IncyBvd24gbW9kdWxlcywgdGhlIHNldHRpbmdzIGFuZFxuICogdGhlIGVudHJ5IHNvdXJjZSBmaWxlcy4gQW4gdW5jaGFuZ2VkIGhhc2ggbGV0cyBhIHJ1biBza2lwIHRoZSBnZW5lcmF0aW9uLlxuICpcbiAqIEBwYXJhbSBlbnRyeUZpbGVzIC0gVGhlIGVudHJ5IHNvdXJjZSBmaWxlcy5cbiAqIEBwYXJhbSBnZW5lcmF0b3JEaXJlY3RvcnkgLSBUaGUgZm9sZGVyIGhvbGRpbmcgdGhlIGdlbmVyYXRvcidzIG1vZHVsZXMuXG4gKiBAcmV0dXJucyBUaGUgaGFzaCwgYXMgaGV4LlxuICovXG5leHBvcnQgZnVuY3Rpb24gY29tcHV0ZUNhY2hlSGFzaChlbnRyeUZpbGVzOiBzdHJpbmdbXSwgZ2VuZXJhdG9yRGlyZWN0b3J5OiBzdHJpbmcpOiBzdHJpbmcge1xuICBjb25zdCBoYXNoID0gY3JlYXRlSGFzaCgnc2hhMjU2Jyk7XG5cbiAgLy8gVGhlIGdlbmVyYXRvciBpdHNlbGZcbiAgY29uc3QgZ2VuZXJhdG9yRmlsZXMgPSByZWFkZGlyU3luYyhnZW5lcmF0b3JEaXJlY3RvcnkpLmZpbHRlcigobmFtZSkgPT4gIW5hbWUuZW5kc1dpdGgoJy50ZXN0LnRzJykpLnNvcnQoKTtcbiAgZm9yIChjb25zdCBnZW5lcmF0b3JGaWxlIG9mIGdlbmVyYXRvckZpbGVzKSB7XG4gICAgaGFzaC51cGRhdGUoZ2VuZXJhdG9yRmlsZSk7XG4gICAgaGFzaC51cGRhdGUocmVhZEZpbGVTeW5jKGpvaW4oZ2VuZXJhdG9yRGlyZWN0b3J5LCBnZW5lcmF0b3JGaWxlKSwgJ3V0Zi04JykpO1xuICB9XG5cbiAgLy8gVGhlIHNldHRpbmdzLCB3aGljaCBldmVyeSBsaW5rIGFuZCBwYXRoIGRlcGVuZHMgb24uIEEgaG9vayBpcyBoYXNoZWQgYnkgaXRzIHNvdXJjZSwgd2hpY2ggYEpTT04uc3RyaW5naWZ5YCBkcm9wcy5cbiAgY29uc3Qgc2V0dGluZ3MgPSBnZXRBcGlEb2NTZXR0aW5ncygpO1xuICBoYXNoLnVwZGF0ZShKU09OLnN0cmluZ2lmeSh7XG4gICAgLi4uc2V0dGluZ3MsXG4gICAgZXh0ZXJuYWxUeXBlTGlua3M6IFsuLi5zZXR0aW5ncy5leHRlcm5hbFR5cGVMaW5rc10sXG4gICAgaW1wb3J0U3RhdGVtZW50OiBzZXR0aW5ncy5pbXBvcnRTdGF0ZW1lbnQgJiYgU3RyaW5nKHNldHRpbmdzLmltcG9ydFN0YXRlbWVudCksXG4gICAgbWVtYmVyUm91dGVTZWdtZW50OiBzZXR0aW5ncy5tZW1iZXJSb3V0ZVNlZ21lbnQgJiYgU3RyaW5nKHNldHRpbmdzLm1lbWJlclJvdXRlU2VnbWVudCksXG4gICAgcGFja2FnZVNpdGVzOiBbLi4uc2V0dGluZ3MucGFja2FnZVNpdGVzXVxuICB9KSk7XG5cbiAgLy8gSGFzaCBhbGwgZW50cnkgc291cmNlIGZpbGVzXG4gIGZvciAoY29uc3QgZmlsZVBhdGggb2YgWy4uLmVudHJ5RmlsZXNdLnNvcnQoKSkge1xuICAgIGhhc2gudXBkYXRlKGZpbGVQYXRoKTtcbiAgICBoYXNoLnVwZGF0ZShyZWFkRmlsZVN5bmMoZmlsZVBhdGgsICd1dGYtOCcpKTtcbiAgfVxuXG4gIHJldHVybiBoYXNoLmRpZ2VzdCgnaGV4Jyk7XG59XG5cbi8qKlxuICogQ29tcHV0ZSB0aGUgbmFtZXNwYWNlIChQT1NJWCBwYXRoIHJlbGF0aXZlIHRvIGBzcmNgLCBubyBleHRlbnNpb24pIGZvciBhIHNvdXJjZSBmaWxlLlxuICpcbiAqIEBwYXJhbSBzcmNEaXJlY3RvcnkgLSBUaGUgc291cmNlIGZvbGRlciB0aGUgbmFtZXNwYWNlIGlzIHJlbGF0aXZlIHRvLlxuICogQHBhcmFtIGZpbGVQYXRoIC0gVGhlIGZpbGUncyBwYXRoLlxuICogQHJldHVybnMgVGhlIG5hbWVzcGFjZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNvbXB1dGVOYW1lc3BhY2Uoc3JjRGlyZWN0b3J5OiBzdHJpbmcsIGZpbGVQYXRoOiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gcmVsYXRpdmUoc3JjRGlyZWN0b3J5LCBmaWxlUGF0aCkucmVwbGFjZUFsbCgnXFxcXCcsICcvJykucmVwbGFjZSgvXFwudHMkLywgJycpO1xufVxuXG4vKipcbiAqIFJlY3Vyc2l2ZWx5IGZpbmQgYWxsIGRvY3VtZW50YWJsZSBgKi50c2AgZW50cnkgZmlsZXMgdW5kZXIgYHNyY2AuXG4gKlxuICogRXhjbHVkZXM6IGAqLnRlc3QudHNgIChpbmNsLiBgKi5icm93c2VyLnRlc3QudHNgIC8gYCouaW50ZWdyYXRpb24udGVzdC50c2ApLCBgKi5kLnRzYCxcbiAqIGBpbmRleC50c2AsIGBfX21lcmdlZC50c2AsIGBzZXR1cC50c2AsIGAqLXNldHVwLnRzYCwgYW5kIGFueSBzdWJ0cmVlIHVuZGVyIGEgYEB0eXBlc2AsXG4gKiBgc3R5bGVzYCwgb3IgYHRlc3QtaGVscGVyc2AgZGlyZWN0b3J5LCBvciBvbmUgb2YgYGV4Y2x1ZGVkRGlyZWN0b3JpZXNgLlxuICpcbiAqIEBwYXJhbSBkaXJlY3RvcnkgLSBUaGUgZm9sZGVyIHRvIHNlYXJjaC5cbiAqIEBwYXJhbSBleGNsdWRlZERpcmVjdG9yaWVzIC0gRGlyZWN0b3J5IG5hbWVzIGV4Y2x1ZGVkIGluIGFkZGl0aW9uIHRvIHRoZSBkZWZhdWx0cy5cbiAqIEByZXR1cm5zIFRoZSBlbnRyeSBmaWxlcycgcGF0aHMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBmaW5kRW50cnlGaWxlcyhkaXJlY3Rvcnk6IHN0cmluZywgZXhjbHVkZWREaXJlY3RvcmllczogcmVhZG9ubHkgc3RyaW5nW10gPSBbXSk6IHN0cmluZ1tdIHtcbiAgY29uc3QgcmVzdWx0czogc3RyaW5nW10gPSBbXTtcbiAgZm9yIChjb25zdCBlbnRyeSBvZiByZWFkZGlyU3luYyhkaXJlY3RvcnksIHsgd2l0aEZpbGVUeXBlczogdHJ1ZSB9KSkge1xuICAgIGNvbnN0IGZ1bGxQYXRoID0gam9pbihkaXJlY3RvcnksIGVudHJ5Lm5hbWUpO1xuICAgIGlmIChlbnRyeS5pc0RpcmVjdG9yeSgpKSB7XG4gICAgICBpZiAoIWlzRG9jdW1lbnRlZERpcmVjdG9yeU5hbWUoZW50cnkubmFtZSwgZXhjbHVkZWREaXJlY3RvcmllcykpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICByZXN1bHRzLnB1c2goLi4uZmluZEVudHJ5RmlsZXMoZnVsbFBhdGgsIGV4Y2x1ZGVkRGlyZWN0b3JpZXMpKTtcbiAgICB9IGVsc2UgaWYgKGlzRG9jdW1lbnRlZEZpbGVOYW1lKGVudHJ5Lm5hbWUpKSB7XG4gICAgICByZXN1bHRzLnB1c2goZnVsbFBhdGgpO1xuICAgIH1cbiAgfVxuICByZXR1cm4gcmVzdWx0cztcbn1cblxuLyoqXG4gKiBDb2xsZWN0cyBhIHNvdXJjZSBmaWxlJ3MgZXhwb3J0ZWQgdHlwZSBhbGlhc2VzLCBlbnVtcywgaW50ZXJmYWNlcyBhbmQgY2xhc3Nlcy5cbiAqXG4gKiBAcGFyYW0gc3JjIC0gVGhlIHNvdXJjZSBmaWxlLlxuICogQHBhcmFtIHR5cGVzIC0gVGhlIGRvY3VtZW50ZWQgdHlwZXMsIGtleWVkIGJ5IHF1YWxpZmllZCBpZC5cbiAqIEBwYXJhbSBuYW1lc3BhY2UgLSBUaGUgdHlwZSdzIG5hbWVzcGFjZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHByb2Nlc3NTb3VyY2VGaWxlKHNyYzogU291cmNlRmlsZSwgdHlwZXM6IE1hcDxzdHJpbmcsIFR5cGVJbmZvPiwgbmFtZXNwYWNlOiBzdHJpbmcpOiB2b2lkIHtcbiAgZm9yIChjb25zdCBhbGlhcyBvZiBzcmMuZ2V0VHlwZUFsaWFzZXMoKSkge1xuICAgIGlmICghYWxpYXMuaXNFeHBvcnRlZCgpKSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgY29uc3Qga2V5ID0gcXVhbGlmaWVkS2V5KG5hbWVzcGFjZSwgYWxpYXMuZ2V0TmFtZSgpKTtcbiAgICBpZiAoIXR5cGVzLmhhcyhrZXkpKSB7XG4gICAgICB0eXBlcy5zZXQoa2V5LCBleHRyYWN0VHlwZUFsaWFzSW5mbyhhbGlhcywgbmFtZXNwYWNlKSk7XG4gICAgfVxuICB9XG5cbiAgZm9yIChjb25zdCBlbnVtRGVjbGFyYXRpb24gb2Ygc3JjLmdldEVudW1zKCkpIHtcbiAgICBpZiAoIWVudW1EZWNsYXJhdGlvbi5pc0V4cG9ydGVkKCkpIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICBjb25zdCBrZXkgPSBxdWFsaWZpZWRLZXkobmFtZXNwYWNlLCBlbnVtRGVjbGFyYXRpb24uZ2V0TmFtZSgpKTtcbiAgICBpZiAoIXR5cGVzLmhhcyhrZXkpKSB7XG4gICAgICB0eXBlcy5zZXQoa2V5LCBleHRyYWN0RW51bUluZm8oZW51bURlY2xhcmF0aW9uLCBuYW1lc3BhY2UpKTtcbiAgICB9XG4gIH1cblxuICBmb3IgKGNvbnN0IGlmYWNlIG9mIHNyYy5nZXRJbnRlcmZhY2VzKCkpIHtcbiAgICBpZiAoIWlmYWNlLmlzRXhwb3J0ZWQoKSkge1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIGNvbnN0IGtleSA9IHF1YWxpZmllZEtleShuYW1lc3BhY2UsIGlmYWNlLmdldE5hbWUoKSk7XG4gICAgaWYgKCF0eXBlcy5oYXMoa2V5KSkge1xuICAgICAgdHlwZXMuc2V0KGtleSwgZXh0cmFjdEludGVyZmFjZUluZm8oaWZhY2UsIG5hbWVzcGFjZSkpO1xuICAgIH1cbiAgfVxuXG4gIGZvciAoY29uc3QgY2xzIG9mIHNyYy5nZXRDbGFzc2VzKCkpIHtcbiAgICBpZiAoIWNscy5pc0V4cG9ydGVkKCkpIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICBjb25zdCBuYW1lID0gY2xzLmdldE5hbWUoKTtcbiAgICBpZiAoIW5hbWUpIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICBjb25zdCBrZXkgPSBxdWFsaWZpZWRLZXkobmFtZXNwYWNlLCBuYW1lKTtcbiAgICBpZiAoIXR5cGVzLmhhcyhrZXkpKSB7XG4gICAgICB0eXBlcy5zZXQoa2V5LCBleHRyYWN0Q2xhc3NJbmZvKGNscywgbmFtZXNwYWNlKSk7XG4gICAgfVxuICB9XG59XG5cbi8qKlxuICogUmVnaXN0ZXIgYWxsIHR5cGUgcGFyYW1ldGVyIG5hbWVzIHNvIHJlbmRlclR5cGVXaXRoTGlua3Mgd29uJ3QgaHlwZXJsaW5rIHRoZW0uXG4gKiBTa2lwIG5hbWVzIHRoYXQgYXJlIGFsc28ga25vd24gdHlwZXMg4oCUIHRob3NlIHNob3VsZCBzdGlsbCBiZSBsaW5rYWJsZS4gVGhlIHNpdGUncyBgZ2VuZXJpY1R5cGVQYXJhbWV0ZXJzYFxuICogYXJlIHJlZ2lzdGVyZWQgYXMgZ2l2ZW4uXG4gKlxuICogQHBhcmFtIHR5cGVzIC0gVGhlIGRvY3VtZW50ZWQgdHlwZXMsIGtleWVkIGJ5IHF1YWxpZmllZCBpZC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlZ2lzdGVyR2VuZXJpY1R5cGVQYXJhbXModHlwZXM6IE1hcDxzdHJpbmcsIFR5cGVJbmZvPik6IHZvaWQge1xuICBmb3IgKGNvbnN0IG5hbWUgb2YgZ2V0QXBpRG9jU2V0dGluZ3MoKS5nZW5lcmljVHlwZVBhcmFtZXRlcnMgPz8gW10pIHtcbiAgICBHRU5FUklDX1RZUEVfUEFSQU1TLmFkZChuYW1lKTtcbiAgfVxuICBjb25zdCBrbm93bk5hbWVzID0gbmV3IFNldDxzdHJpbmc+KCk7XG4gIGZvciAoY29uc3QgWywgaW5mb10gb2YgdHlwZXMpIHtcbiAgICBrbm93bk5hbWVzLmFkZChpbmZvLm5hbWUpO1xuICB9XG4gIGZvciAoY29uc3QgWywgaW5mb10gb2YgdHlwZXMpIHtcbiAgICBmb3IgKGNvbnN0IHRwIG9mIGluZm8udHlwZVBhcmFtZXRlcnMpIHtcbiAgICAgIGNvbnN0IGJhcmVQYXJhbWV0ZXIgPSB0cC5yZXBsYWNlKC9cXHMrZXh0ZW5kc1xccysuKiQvLCAnJyk7XG4gICAgICBpZiAoIWtub3duTmFtZXMuaGFzKGJhcmVQYXJhbWV0ZXIpKSB7XG4gICAgICAgIEdFTkVSSUNfVFlQRV9QQVJBTVMuYWRkKGJhcmVQYXJhbWV0ZXIpO1xuICAgICAgfVxuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBpc1R5cGVEZWNsYXJhdGlvbihkZWNsYXJhdGlvbjogTm9kZSk6IGJvb2xlYW4ge1xuICByZXR1cm4gTm9kZS5pc0NsYXNzRGVjbGFyYXRpb24oZGVjbGFyYXRpb24pIHx8IE5vZGUuaXNJbnRlcmZhY2VEZWNsYXJhdGlvbihkZWNsYXJhdGlvbikgfHwgTm9kZS5pc1R5cGVBbGlhc0RlY2xhcmF0aW9uKGRlY2xhcmF0aW9uKSB8fCBOb2RlLmlzRW51bURlY2xhcmF0aW9uKGRlY2xhcmF0aW9uKTtcbn1cblxuZnVuY3Rpb24gcXVhbGlmaWVkS2V5KG5hbWVzcGFjZTogc3RyaW5nLCBuYW1lOiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gYCR7bmFtZXNwYWNlfSMke25hbWV9YDtcbn1cbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFTQSx5QkFBMkI7QUFDM0IscUJBR087QUFDUCx1QkFHTztBQUNQLHNCQUFxQjtBQUlyQiwrQkFBb0M7QUFDcEMsc0NBR087QUFDUCwyQkFXTztBQUNQLG1DQUEyQztBQUMzQyw4QkFBa0M7QUFDbEMsZ0NBQTZCO0FBU3RCLFNBQVMsaUJBQWlCLEtBQWlCLE9BQThCLFdBQXlCO0FBQ3ZHLGFBQVcsYUFBYSxJQUFJLGFBQWEsR0FBRztBQUMxQyxRQUFJLENBQUMsVUFBVSxXQUFXLEdBQUc7QUFDM0I7QUFBQSxJQUNGO0FBQ0EsVUFBTSxPQUFPLFVBQVUsUUFBUTtBQUMvQixRQUFJLENBQUMsTUFBTTtBQUNUO0FBQUEsSUFDRjtBQUNBLFVBQU0sTUFBTSxhQUFhLFdBQVcsSUFBSTtBQUN4QyxRQUFJLE1BQU0sSUFBSSxHQUFHLEdBQUc7QUFDbEI7QUFBQSxJQUNGO0FBQ0EsVUFBTSw0QkFBd0IsK0NBQXlCLFNBQVM7QUFDaEUsVUFBTSxTQUFTLFVBQVUsY0FBYyxFQUFFLElBQUksQ0FBQyxPQUFPO0FBQUEsTUFDbkQsYUFBYSxzQkFBc0IsSUFBSSxFQUFFLFFBQVEsQ0FBQyxLQUFLO0FBQUEsTUFDdkQsTUFBTSxFQUFFLFFBQVE7QUFBQSxNQUNoQixVQUFNLHdDQUFhLEVBQUUsUUFBUSxFQUFFLFFBQVEsQ0FBQztBQUFBLElBQzFDLEVBQUU7QUFDRixVQUFNLGtCQUFrQixPQUFPLElBQUksQ0FBQyxNQUFNLEdBQUcsRUFBRSxJQUFJLEtBQUssRUFBRSxJQUFJLEVBQUUsRUFBRSxLQUFLLElBQUk7QUFDM0UsVUFBTSxpQkFBYSx3Q0FBYSxVQUFVLGNBQWMsRUFBRSxRQUFRLENBQUM7QUFDbkUsVUFBTSxZQUFZLEdBQUcsSUFBSSxJQUFJLGVBQWU7QUFDNUMsVUFBTSxJQUFJLEtBQUs7QUFBQSxNQUNiLFdBQVcsQ0FBQztBQUFBLE1BQ1osaUJBQWEscUNBQWUsU0FBUztBQUFBLE1BQ3JDLGFBQWEsQ0FBQztBQUFBLE1BQ2QsY0FBVSxrQ0FBWSxTQUFTO0FBQUEsTUFDL0IsaUJBQWlCLENBQUM7QUFBQSxNQUNsQixNQUFNO0FBQUEsTUFDTixTQUFTLENBQUM7QUFBQSxRQUNSLGlCQUFhLHFDQUFlLFNBQVM7QUFBQSxRQUNyQyxjQUFVLGtDQUFZLFNBQVM7QUFBQSxRQUMvQixlQUFlO0FBQUEsUUFDZixVQUFVO0FBQUEsUUFDVjtBQUFBLFFBQ0EsYUFBYTtBQUFBLFFBQ2IsWUFBWTtBQUFBLFFBQ1osYUFBUyxpQ0FBVyxTQUFTO0FBQUEsUUFDN0IsdUJBQW1CLDJDQUFxQixTQUFTO0FBQUEsUUFDakQ7QUFBQSxRQUNBO0FBQUEsUUFDQSxXQUFPLCtCQUFTLFNBQVM7QUFBQSxRQUN6QixNQUFNO0FBQUEsTUFDUixDQUFDO0FBQUEsTUFDRDtBQUFBLE1BQ0E7QUFBQSxNQUNBLFlBQVksQ0FBQztBQUFBLE1BQ2IsYUFBUyxpQ0FBVyxTQUFTO0FBQUEsTUFDN0IsZ0JBQWdCLFVBQVUsa0JBQWtCLEVBQUUsSUFBSSxDQUFDLE9BQU8sR0FBRyxRQUFRLENBQUM7QUFBQSxJQUN4RSxDQUFDO0FBQUEsRUFDSDtBQUNGO0FBUU8sU0FBUywyQkFBMkIsS0FBdUI7QUFDaEUsYUFBVyxxQkFBcUIsSUFBSSxzQkFBc0IsR0FBRztBQUMzRCxlQUFXLGVBQWUsa0JBQWtCLGdCQUFnQixHQUFHO0FBRzdELFlBQU0sZ0JBQWdCLFlBQVksYUFBYSxLQUFLLFlBQVksWUFBWTtBQUM1RSxZQUFNLGVBQWUsY0FBYyxpQkFBaUIsRUFBRSx3QkFBd0IsRUFBRSxnQkFBZ0I7QUFDaEcsaUJBQVcsZUFBZSxjQUFjO0FBRXRDLFlBQUksa0JBQWtCLFdBQVcsR0FBRztBQUNsQyx1RUFBMkIsWUFBWSxRQUFRLEdBQUcsWUFBWSxjQUFjLEVBQUUsWUFBWSxDQUFDO0FBQUEsUUFDN0Y7QUFBQSxNQUNGO0FBQUEsSUFDRjtBQUFBLEVBQ0Y7QUFDRjtBQVNPLFNBQVMsaUJBQWlCLEtBQWlCLE9BQThCLFdBQXlCO0FBQ3ZHLGFBQVcscUJBQXFCLElBQUksc0JBQXNCLEdBQUc7QUFDM0QsUUFBSSxDQUFDLGtCQUFrQixXQUFXLEdBQUc7QUFDbkM7QUFBQSxJQUNGO0FBQ0EsVUFBTSxrQkFBa0Isa0JBQWtCLG1CQUFtQjtBQUM3RCxlQUFXLGVBQWUsa0JBQWtCLGdCQUFnQixHQUFHO0FBQzdELFlBQU0sT0FBTyxZQUFZLFFBQVE7QUFDakMsWUFBTSxNQUFNLGFBQWEsV0FBVyxJQUFJO0FBQ3hDLFVBQUksTUFBTSxJQUFJLEdBQUcsR0FBRztBQUNsQjtBQUFBLE1BQ0Y7QUFDQSxZQUFNLElBQUksS0FBSztBQUFBLFFBQ2IsV0FBVyxDQUFDO0FBQUEsUUFDWixpQkFBYSxxQ0FBZSxpQkFBaUI7QUFBQSxRQUM3QyxhQUFhLENBQUM7QUFBQSxRQUNkLGNBQVUsa0NBQVksaUJBQWlCO0FBQUEsUUFDdkMsaUJBQWlCLENBQUM7QUFBQSxRQUNsQixNQUFNO0FBQUEsUUFDTixTQUFTLENBQUM7QUFBQSxRQUNWO0FBQUEsUUFDQTtBQUFBLFFBQ0EsWUFBWSxDQUFDO0FBQUEsUUFDYixhQUFTLGlDQUFXLGlCQUFpQjtBQUFBLFFBQ3JDLGdCQUFnQixDQUFDO0FBQUEsUUFDakIsaUJBQWlCO0FBQUEsUUFDakIsa0JBQWMsd0NBQWEsWUFBWSxRQUFRLEVBQUUsUUFBUSxDQUFDO0FBQUEsTUFDNUQsQ0FBQztBQUFBLElBQ0g7QUFBQSxFQUNGO0FBQ0Y7QUFVTyxTQUFTLGlCQUFpQixZQUFzQixvQkFBb0M7QUFDekYsUUFBTSxXQUFPLCtCQUFXLFFBQVE7QUFHaEMsUUFBTSxxQkFBaUIsNEJBQVksa0JBQWtCLEVBQUUsT0FBTyxDQUFDLFNBQVMsQ0FBQyxLQUFLLFNBQVMsVUFBVSxDQUFDLEVBQUUsS0FBSztBQUN6RyxhQUFXLGlCQUFpQixnQkFBZ0I7QUFDMUMsU0FBSyxPQUFPLGFBQWE7QUFDekIsU0FBSyxXQUFPLGlDQUFhLHVCQUFLLG9CQUFvQixhQUFhLEdBQUcsT0FBTyxDQUFDO0FBQUEsRUFDNUU7QUFHQSxRQUFNLGVBQVcsMkNBQWtCO0FBQ25DLE9BQUssT0FBTyxLQUFLLFVBQVU7QUFBQSxJQUN6QixHQUFHO0FBQUEsSUFDSCxtQkFBbUIsQ0FBQyxHQUFHLFNBQVMsaUJBQWlCO0FBQUEsSUFDakQsaUJBQWlCLFNBQVMsbUJBQW1CLE9BQU8sU0FBUyxlQUFlO0FBQUEsSUFDNUUsb0JBQW9CLFNBQVMsc0JBQXNCLE9BQU8sU0FBUyxrQkFBa0I7QUFBQSxJQUNyRixjQUFjLENBQUMsR0FBRyxTQUFTLFlBQVk7QUFBQSxFQUN6QyxDQUFDLENBQUM7QUFHRixhQUFXLFlBQVksQ0FBQyxHQUFHLFVBQVUsRUFBRSxLQUFLLEdBQUc7QUFDN0MsU0FBSyxPQUFPLFFBQVE7QUFDcEIsU0FBSyxXQUFPLDZCQUFhLFVBQVUsT0FBTyxDQUFDO0FBQUEsRUFDN0M7QUFFQSxTQUFPLEtBQUssT0FBTyxLQUFLO0FBQzFCO0FBU08sU0FBUyxpQkFBaUIsY0FBc0IsVUFBMEI7QUFDL0UsYUFBTywyQkFBUyxjQUFjLFFBQVEsRUFBRSxXQUFXLE1BQU0sR0FBRyxFQUFFLFFBQVEsU0FBUyxFQUFFO0FBQ25GO0FBYU8sU0FBUyxlQUFlLFdBQW1CLHNCQUF5QyxDQUFDLEdBQWE7QUFDdkcsUUFBTSxVQUFvQixDQUFDO0FBQzNCLGFBQVcsYUFBUyw0QkFBWSxXQUFXLEVBQUUsZUFBZSxLQUFLLENBQUMsR0FBRztBQUNuRSxVQUFNLGVBQVcsdUJBQUssV0FBVyxNQUFNLElBQUk7QUFDM0MsUUFBSSxNQUFNLFlBQVksR0FBRztBQUN2QixVQUFJLEtBQUMsMkRBQTBCLE1BQU0sTUFBTSxtQkFBbUIsR0FBRztBQUMvRDtBQUFBLE1BQ0Y7QUFDQSxjQUFRLEtBQUssR0FBRyxlQUFlLFVBQVUsbUJBQW1CLENBQUM7QUFBQSxJQUMvRCxlQUFXLHNEQUFxQixNQUFNLElBQUksR0FBRztBQUMzQyxjQUFRLEtBQUssUUFBUTtBQUFBLElBQ3ZCO0FBQUEsRUFDRjtBQUNBLFNBQU87QUFDVDtBQVNPLFNBQVMsa0JBQWtCLEtBQWlCLE9BQThCLFdBQXlCO0FBQ3hHLGFBQVcsU0FBUyxJQUFJLGVBQWUsR0FBRztBQUN4QyxRQUFJLENBQUMsTUFBTSxXQUFXLEdBQUc7QUFDdkI7QUFBQSxJQUNGO0FBQ0EsVUFBTSxNQUFNLGFBQWEsV0FBVyxNQUFNLFFBQVEsQ0FBQztBQUNuRCxRQUFJLENBQUMsTUFBTSxJQUFJLEdBQUcsR0FBRztBQUNuQixZQUFNLElBQUksU0FBSywyQ0FBcUIsT0FBTyxTQUFTLENBQUM7QUFBQSxJQUN2RDtBQUFBLEVBQ0Y7QUFFQSxhQUFXLG1CQUFtQixJQUFJLFNBQVMsR0FBRztBQUM1QyxRQUFJLENBQUMsZ0JBQWdCLFdBQVcsR0FBRztBQUNqQztBQUFBLElBQ0Y7QUFDQSxVQUFNLE1BQU0sYUFBYSxXQUFXLGdCQUFnQixRQUFRLENBQUM7QUFDN0QsUUFBSSxDQUFDLE1BQU0sSUFBSSxHQUFHLEdBQUc7QUFDbkIsWUFBTSxJQUFJLFNBQUssc0NBQWdCLGlCQUFpQixTQUFTLENBQUM7QUFBQSxJQUM1RDtBQUFBLEVBQ0Y7QUFFQSxhQUFXLFNBQVMsSUFBSSxjQUFjLEdBQUc7QUFDdkMsUUFBSSxDQUFDLE1BQU0sV0FBVyxHQUFHO0FBQ3ZCO0FBQUEsSUFDRjtBQUNBLFVBQU0sTUFBTSxhQUFhLFdBQVcsTUFBTSxRQUFRLENBQUM7QUFDbkQsUUFBSSxDQUFDLE1BQU0sSUFBSSxHQUFHLEdBQUc7QUFDbkIsWUFBTSxJQUFJLFNBQUssMkNBQXFCLE9BQU8sU0FBUyxDQUFDO0FBQUEsSUFDdkQ7QUFBQSxFQUNGO0FBRUEsYUFBVyxPQUFPLElBQUksV0FBVyxHQUFHO0FBQ2xDLFFBQUksQ0FBQyxJQUFJLFdBQVcsR0FBRztBQUNyQjtBQUFBLElBQ0Y7QUFDQSxVQUFNLE9BQU8sSUFBSSxRQUFRO0FBQ3pCLFFBQUksQ0FBQyxNQUFNO0FBQ1Q7QUFBQSxJQUNGO0FBQ0EsVUFBTSxNQUFNLGFBQWEsV0FBVyxJQUFJO0FBQ3hDLFFBQUksQ0FBQyxNQUFNLElBQUksR0FBRyxHQUFHO0FBQ25CLFlBQU0sSUFBSSxTQUFLLHVDQUFpQixLQUFLLFNBQVMsQ0FBQztBQUFBLElBQ2pEO0FBQUEsRUFDRjtBQUNGO0FBU08sU0FBUywwQkFBMEIsT0FBb0M7QUFDNUUsYUFBVyxZQUFRLDJDQUFrQixFQUFFLHlCQUF5QixDQUFDLEdBQUc7QUFDbEUsaURBQW9CLElBQUksSUFBSTtBQUFBLEVBQzlCO0FBQ0EsUUFBTSxhQUFhLG9CQUFJLElBQVk7QUFDbkMsYUFBVyxDQUFDLEVBQUUsSUFBSSxLQUFLLE9BQU87QUFDNUIsZUFBVyxJQUFJLEtBQUssSUFBSTtBQUFBLEVBQzFCO0FBQ0EsYUFBVyxDQUFDLEVBQUUsSUFBSSxLQUFLLE9BQU87QUFDNUIsZUFBVyxNQUFNLEtBQUssZ0JBQWdCO0FBQ3BDLFlBQU0sZ0JBQWdCLEdBQUcsUUFBUSxvQkFBb0IsRUFBRTtBQUN2RCxVQUFJLENBQUMsV0FBVyxJQUFJLGFBQWEsR0FBRztBQUNsQyxxREFBb0IsSUFBSSxhQUFhO0FBQUEsTUFDdkM7QUFBQSxJQUNGO0FBQUEsRUFDRjtBQUNGO0FBRUEsU0FBUyxrQkFBa0IsYUFBNEI7QUFDckQsU0FBTyxxQkFBSyxtQkFBbUIsV0FBVyxLQUFLLHFCQUFLLHVCQUF1QixXQUFXLEtBQUsscUJBQUssdUJBQXVCLFdBQVcsS0FBSyxxQkFBSyxrQkFBa0IsV0FBVztBQUMzSztBQUVBLFNBQVMsYUFBYSxXQUFtQixNQUFzQjtBQUM3RCxTQUFPLEdBQUcsU0FBUyxJQUFJLElBQUk7QUFDN0I7IiwibmFtZXMiOltdfQ==
338
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9kb2NzLXNpdGUvYXBpLWRvYy1zb3VyY2UtcHJvY2Vzc2luZy50cyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBmaWxlXG4gKlxuICogU291cmNlIGRpc2NvdmVyeSArIGV4dHJhY3Rpb246IHdhbGtzIGBzcmNgLCBmaWx0ZXJzIHRvIGRvY3VtZW50YWJsZSBlbnRyeSBmaWxlcywgYW5kIHR1cm5zIGVhY2hcbiAqIGZpbGUncyBleHBvcnRlZCBkZWNsYXJhdGlvbnMgaW50byBgVHlwZUluZm9gIGVudHJpZXMga2V5ZWQgYnkgYSBxdWFsaWZpZWQgYCR7bmFtZXNwYWNlfSMke25hbWV9YC5cbiAqL1xuXG5pbXBvcnQgdHlwZSB7IFNvdXJjZUZpbGUgfSBmcm9tICd0cy1tb3JwaCc7XG5cbmltcG9ydCB7IGNyZWF0ZUhhc2ggfSBmcm9tICdub2RlOmNyeXB0byc7XG5pbXBvcnQge1xuICBleGlzdHNTeW5jLFxuICByZWFkZGlyU3luYyxcbiAgcmVhZEZpbGVTeW5jXG59IGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHtcbiAgZGlybmFtZSxcbiAgam9pbixcbiAgcmVsYXRpdmUsXG4gIHJlc29sdmVcbn0gZnJvbSAnbm9kZTpwYXRoJztcbmltcG9ydCB7IE5vZGUgfSBmcm9tICd0cy1tb3JwaCc7XG5pbXBvcnQge1xuICBjcmVhdGVTb3VyY2VGaWxlLFxuICBpc0V4cG9ydERlY2xhcmF0aW9uLFxuICBpc05hbWVzcGFjZUV4cG9ydCxcbiAgaXNTdHJpbmdMaXRlcmFsLFxuICBTY3JpcHRUYXJnZXRcbn0gZnJvbSAndHlwZXNjcmlwdCc7XG5cbmltcG9ydCB0eXBlIHsgVHlwZUluZm8gfSBmcm9tICcuL2FwaS1kb2MtdHlwZXMudHMnO1xuXG5pbXBvcnQgeyBHRU5FUklDX1RZUEVfUEFSQU1TIH0gZnJvbSAnLi9hcGktZG9jLWNvbnN0YW50cy50cyc7XG5pbXBvcnQge1xuICBpc0RvY3VtZW50ZWREaXJlY3RvcnlOYW1lLFxuICBpc0RvY3VtZW50ZWRGaWxlTmFtZVxufSBmcm9tICcuL2FwaS1kb2MtZG9jdW1lbnRlZC1maWxlcy50cyc7XG5pbXBvcnQge1xuICBleHRyYWN0Q2xhc3NJbmZvLFxuICBleHRyYWN0RW51bUluZm8sXG4gIGV4dHJhY3RJbnRlcmZhY2VJbmZvLFxuICBleHRyYWN0VHlwZUFsaWFzSW5mbyxcbiAgZ2V0RGVzY3JpcHRpb24sXG4gIGdldEV4YW1wbGVzLFxuICBnZXRQYXJhbWV0ZXJEZXNjcmlwdGlvbnMsXG4gIGdldFJlbWFya3MsXG4gIGdldFJldHVybkRlc2NyaXB0aW9uLFxuICBnZXRTaW5jZVxufSBmcm9tICcuL2FwaS1kb2MtanNkb2MudHMnO1xuaW1wb3J0IHsgcmVnaXN0ZXJQYWNrYWdlRGVjbGFyYXRpb24gfSBmcm9tICcuL2FwaS1kb2MtcGFja2FnZS1zaXRlcy50cyc7XG5pbXBvcnQgeyBnZXRBcGlEb2NTZXR0aW5ncyB9IGZyb20gJy4vYXBpLWRvYy1zZXR0aW5ncy50cyc7XG5pbXBvcnQgeyBzaW1wbGlmeVR5cGUgfSBmcm9tICcuL2FwaS1kb2MtdGV4dC11dGlscy50cyc7XG5cbi8qKlxuICogQSBwYWNrYWdlJ3MgcHVibGljIEFQSSBiYXJyZWwsIHJlYWQgYnkge0BsaW5rIHJlYWRQdWJsaWNBcGlCYXJyZWx9LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFB1YmxpY0FwaUJhcnJlbCB7XG4gIC8qKlxuICAgKiBUaGUgbW9kdWxlcyB0aGUgYmFycmVsIHJlLWV4cG9ydHMgZnJvbSwgaW4gYmFycmVsIG9yZGVyOiB0aGUgZW50cnkgZmlsZXMgb2YgdGhlIEFQSSByZWZlcmVuY2UuXG4gICAqL1xuICByZWFkb25seSBmaWxlczogcmVhZG9ubHkgc3RyaW5nW107XG5cbiAgLyoqXG4gICAqIFRoZSBxdWFsaWZpZWQgaWRzIChgPG5hbWVzcGFjZT4jPG5hbWU+YCkgb2YgdGhlIGV4cG9ydHMgdGhlIGJhcnJlbCBmb3J3YXJkcyBieSBuYW1lLlxuICAgKi9cbiAgcmVhZG9ubHkgcHVibGljS2V5czogUmVhZG9ubHlTZXQ8c3RyaW5nPjtcblxuICAvKipcbiAgICogVGhlIG5hbWVzcGFjZXMgb2YgdGhlIG1vZHVsZXMgdGhlIGJhcnJlbCByZS1leHBvcnRzIHdob2xlIChgZXhwb3J0ICogZnJvbWApLlxuICAgKi9cbiAgcmVhZG9ubHkgd2hvbGVOYW1lc3BhY2VzOiBSZWFkb25seVNldDxzdHJpbmc+O1xufVxuXG4vKipcbiAqIENvbGxlY3QgdG9wLWxldmVsIGV4cG9ydGVkIGZ1bmN0aW9ucy5cbiAqXG4gKiBAcGFyYW0gc3JjIC0gVGhlIHNvdXJjZSBmaWxlLlxuICogQHBhcmFtIHR5cGVzIC0gVGhlIGRvY3VtZW50ZWQgdHlwZXMsIGtleWVkIGJ5IHF1YWxpZmllZCBpZC5cbiAqIEBwYXJhbSBuYW1lc3BhY2UgLSBUaGUgdHlwZSdzIG5hbWVzcGFjZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNvbGxlY3RGdW5jdGlvbnMoc3JjOiBTb3VyY2VGaWxlLCB0eXBlczogTWFwPHN0cmluZywgVHlwZUluZm8+LCBuYW1lc3BhY2U6IHN0cmluZyk6IHZvaWQge1xuICBmb3IgKGNvbnN0ICRmdW5jdGlvbiBvZiBzcmMuZ2V0RnVuY3Rpb25zKCkpIHtcbiAgICBpZiAoISRmdW5jdGlvbi5pc0V4cG9ydGVkKCkpIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICBjb25zdCBuYW1lID0gJGZ1bmN0aW9uLmdldE5hbWUoKTtcbiAgICBpZiAoIW5hbWUpIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICBjb25zdCBrZXkgPSBxdWFsaWZpZWRLZXkobmFtZXNwYWNlLCBuYW1lKTtcbiAgICBpZiAodHlwZXMuaGFzKGtleSkpIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICBjb25zdCBwYXJhbWV0ZXJEZXNjcmlwdGlvbnMgPSBnZXRQYXJhbWV0ZXJEZXNjcmlwdGlvbnMoJGZ1bmN0aW9uKTtcbiAgICBjb25zdCBwYXJhbXMgPSAkZnVuY3Rpb24uZ2V0UGFyYW1ldGVycygpLm1hcCgocCkgPT4gKHtcbiAgICAgIGRlc2NyaXB0aW9uOiBwYXJhbWV0ZXJEZXNjcmlwdGlvbnMuZ2V0KHAuZ2V0TmFtZSgpKSA/PyAnJyxcbiAgICAgIG5hbWU6IHAuZ2V0TmFtZSgpLFxuICAgICAgdHlwZTogc2ltcGxpZnlUeXBlKHAuZ2V0VHlwZSgpLmdldFRleHQoKSlcbiAgICB9KSk7XG4gICAgY29uc3QgcGFyYW1ldGVyU3RyaW5nID0gcGFyYW1zLm1hcCgocCkgPT4gYCR7cC5uYW1lfTogJHtwLnR5cGV9YCkuam9pbignLCAnKTtcbiAgICBjb25zdCByZXR1cm5UeXBlID0gc2ltcGxpZnlUeXBlKCRmdW5jdGlvbi5nZXRSZXR1cm5UeXBlKCkuZ2V0VGV4dCgpKTtcbiAgICBjb25zdCBzaWduYXR1cmUgPSBgJHtuYW1lfSgke3BhcmFtZXRlclN0cmluZ30pYDtcbiAgICB0eXBlcy5zZXQoa2V5LCB7XG4gICAgICBiYXNlVHlwZXM6IFtdLFxuICAgICAgZGVzY3JpcHRpb246IGdldERlc2NyaXB0aW9uKCRmdW5jdGlvbiksXG4gICAgICBlbnVtTWVtYmVyczogW10sXG4gICAgICBleGFtcGxlczogZ2V0RXhhbXBsZXMoJGZ1bmN0aW9uKSxcbiAgICAgIGltcGxlbWVudHNUeXBlczogW10sXG4gICAgICBraW5kOiAnZnVuY3Rpb24nLFxuICAgICAgbWV0aG9kczogW3tcbiAgICAgICAgZGVzY3JpcHRpb246IGdldERlc2NyaXB0aW9uKCRmdW5jdGlvbiksXG4gICAgICAgIGV4YW1wbGVzOiBnZXRFeGFtcGxlcygkZnVuY3Rpb24pLFxuICAgICAgICBpbmhlcml0ZWRGcm9tOiAnJyxcbiAgICAgICAgaXNTdGF0aWM6IGZhbHNlLFxuICAgICAgICBuYW1lLFxuICAgICAgICBvdmVybG9hZEtleTogbmFtZSxcbiAgICAgICAgcGFyYW1ldGVyczogcGFyYW1zLFxuICAgICAgICByZW1hcmtzOiBnZXRSZW1hcmtzKCRmdW5jdGlvbiksXG4gICAgICAgIHJldHVybkRlc2NyaXB0aW9uOiBnZXRSZXR1cm5EZXNjcmlwdGlvbigkZnVuY3Rpb24pLFxuICAgICAgICByZXR1cm5UeXBlLFxuICAgICAgICBzaWduYXR1cmUsXG4gICAgICAgIHNpbmNlOiBnZXRTaW5jZSgkZnVuY3Rpb24pLFxuICAgICAgICB0eXBlOiAnJ1xuICAgICAgfV0sXG4gICAgICBuYW1lLFxuICAgICAgbmFtZXNwYWNlLFxuICAgICAgcHJvcGVydGllczogW10sXG4gICAgICByZW1hcmtzOiBnZXRSZW1hcmtzKCRmdW5jdGlvbiksXG4gICAgICB0eXBlUGFyYW1ldGVyczogJGZ1bmN0aW9uLmdldFR5cGVQYXJhbWV0ZXJzKCkubWFwKCh0cCkgPT4gdHAuZ2V0VGV4dCgpKVxuICAgIH0pO1xuICB9XG59XG5cbi8qKlxuICogUmVjb3JkcyB3aGVyZSBldmVyeSBzeW1ib2wgYSBzb3VyY2UgZmlsZSBpbXBvcnRzIGlzIGRlY2xhcmVkLCBzbyBhIHR5cGUgYW5vdGhlciBkb2N1bWVudGVkIHBhY2thZ2UgZGVjbGFyZXNcbiAqIGxpbmtzIHRvIHRoYXQgcGFja2FnZSdzIHNpdGUuXG4gKlxuICogQHBhcmFtIHNyYyAtIFRoZSBzb3VyY2UgZmlsZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNvbGxlY3RQYWNrYWdlRGVjbGFyYXRpb25zKHNyYzogU291cmNlRmlsZSk6IHZvaWQge1xuICBmb3IgKGNvbnN0IGltcG9ydERlY2xhcmF0aW9uIG9mIHNyYy5nZXRJbXBvcnREZWNsYXJhdGlvbnMoKSkge1xuICAgIGZvciAoY29uc3QgbmFtZWRJbXBvcnQgb2YgaW1wb3J0RGVjbGFyYXRpb24uZ2V0TmFtZWRJbXBvcnRzKCkpIHtcbiAgICAgIC8vIEFuIHVucmVzb2x2ZWQgaW1wb3J0IGFsaWFzZXMgdGhlIGNoZWNrZXIncyB1bmtub3duIHN5bWJvbCwgd2hpY2ggaGFzIG5vIGRlY2xhcmF0aW9ucy5cbiAgICAgIC8vIEEgcmVuYW1lZCBpbXBvcnQgY2FycmllcyBpdHMgc3ltYm9sIG9uIHRoZSBsb2NhbCBuYW1lLlxuICAgICAgY29uc3QgbG9jYWxOYW1lTm9kZSA9IG5hbWVkSW1wb3J0LmdldEFsaWFzTm9kZSgpID8/IG5hbWVkSW1wb3J0LmdldE5hbWVOb2RlKCk7XG4gICAgICBjb25zdCBkZWNsYXJhdGlvbnMgPSBsb2NhbE5hbWVOb2RlLmdldFN5bWJvbE9yVGhyb3coKS5nZXRBbGlhc2VkU3ltYm9sT3JUaHJvdygpLmdldERlY2xhcmF0aW9ucygpO1xuICAgICAgZm9yIChjb25zdCBkZWNsYXJhdGlvbiBvZiBkZWNsYXJhdGlvbnMpIHtcbiAgICAgICAgLy8gT25seSBhIHR5cGUgaXMgbGlua2VkIGZyb20gdHlwZSB0ZXh0OyBhIGZ1bmN0aW9uJ3MgbmFtZSBhbHNvIG1hdGNoZXMgd29yZHMgdGhhdCBhcmUgbm90IHJlZmVyZW5jZXMgdG8gaXQuXG4gICAgICAgIGlmIChpc1R5cGVEZWNsYXJhdGlvbihkZWNsYXJhdGlvbikpIHtcbiAgICAgICAgICByZWdpc3RlclBhY2thZ2VEZWNsYXJhdGlvbihuYW1lZEltcG9ydC5nZXROYW1lKCksIGRlY2xhcmF0aW9uLmdldFNvdXJjZUZpbGUoKS5nZXRGaWxlUGF0aCgpKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxufVxuXG4vKipcbiAqIENvbGxlY3QgdG9wLWxldmVsIGV4cG9ydGVkIHZhcmlhYmxlIGRlY2xhcmF0aW9ucyAoZS5nLiBgZXhwb3J0IGNvbnN0IEVNUFRZID0gJydgKS5cbiAqXG4gKiBAcGFyYW0gc3JjIC0gVGhlIHNvdXJjZSBmaWxlLlxuICogQHBhcmFtIHR5cGVzIC0gVGhlIGRvY3VtZW50ZWQgdHlwZXMsIGtleWVkIGJ5IHF1YWxpZmllZCBpZC5cbiAqIEBwYXJhbSBuYW1lc3BhY2UgLSBUaGUgdHlwZSdzIG5hbWVzcGFjZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNvbGxlY3RWYXJpYWJsZXMoc3JjOiBTb3VyY2VGaWxlLCB0eXBlczogTWFwPHN0cmluZywgVHlwZUluZm8+LCBuYW1lc3BhY2U6IHN0cmluZyk6IHZvaWQge1xuICBmb3IgKGNvbnN0IHZhcmlhYmxlU3RhdGVtZW50IG9mIHNyYy5nZXRWYXJpYWJsZVN0YXRlbWVudHMoKSkge1xuICAgIGlmICghdmFyaWFibGVTdGF0ZW1lbnQuaXNFeHBvcnRlZCgpKSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgY29uc3QgZGVjbGFyYXRpb25LaW5kID0gdmFyaWFibGVTdGF0ZW1lbnQuZ2V0RGVjbGFyYXRpb25LaW5kKCk7XG4gICAgZm9yIChjb25zdCBkZWNsYXJhdGlvbiBvZiB2YXJpYWJsZVN0YXRlbWVudC5nZXREZWNsYXJhdGlvbnMoKSkge1xuICAgICAgY29uc3QgbmFtZSA9IGRlY2xhcmF0aW9uLmdldE5hbWUoKTtcbiAgICAgIGNvbnN0IGtleSA9IHF1YWxpZmllZEtleShuYW1lc3BhY2UsIG5hbWUpO1xuICAgICAgaWYgKHR5cGVzLmhhcyhrZXkpKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgdHlwZXMuc2V0KGtleSwge1xuICAgICAgICBiYXNlVHlwZXM6IFtdLFxuICAgICAgICBkZXNjcmlwdGlvbjogZ2V0RGVzY3JpcHRpb24odmFyaWFibGVTdGF0ZW1lbnQpLFxuICAgICAgICBlbnVtTWVtYmVyczogW10sXG4gICAgICAgIGV4YW1wbGVzOiBnZXRFeGFtcGxlcyh2YXJpYWJsZVN0YXRlbWVudCksXG4gICAgICAgIGltcGxlbWVudHNUeXBlczogW10sXG4gICAgICAgIGtpbmQ6ICd2YXJpYWJsZScsXG4gICAgICAgIG1ldGhvZHM6IFtdLFxuICAgICAgICBuYW1lLFxuICAgICAgICBuYW1lc3BhY2UsXG4gICAgICAgIHByb3BlcnRpZXM6IFtdLFxuICAgICAgICByZW1hcmtzOiBnZXRSZW1hcmtzKHZhcmlhYmxlU3RhdGVtZW50KSxcbiAgICAgICAgdHlwZVBhcmFtZXRlcnM6IFtdLFxuICAgICAgICB2YXJpYWJsZUtleXdvcmQ6IGRlY2xhcmF0aW9uS2luZCxcbiAgICAgICAgdmFyaWFibGVUeXBlOiBzaW1wbGlmeVR5cGUoZGVjbGFyYXRpb24uZ2V0VHlwZSgpLmdldFRleHQoKSlcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxufVxuXG4vKipcbiAqIENvbXB1dGUgYSBoYXNoIG9mIGV2ZXJ5IGlucHV0IHRoYXQgZGVjaWRlcyB0aGUgZ2VuZXJhdGVkIHBhZ2VzOiB0aGUgZ2VuZXJhdG9yJ3Mgb3duIG1vZHVsZXMsIHRoZSBzZXR0aW5ncyBhbmRcbiAqIHRoZSBlbnRyeSBzb3VyY2UgZmlsZXMuIEFuIHVuY2hhbmdlZCBoYXNoIGxldHMgYSBydW4gc2tpcCB0aGUgZ2VuZXJhdGlvbi5cbiAqXG4gKiBAcGFyYW0gZW50cnlGaWxlcyAtIFRoZSBlbnRyeSBzb3VyY2UgZmlsZXMuXG4gKiBAcGFyYW0gZ2VuZXJhdG9yRGlyZWN0b3J5IC0gVGhlIGZvbGRlciBob2xkaW5nIHRoZSBnZW5lcmF0b3IncyBtb2R1bGVzLlxuICogQHJldHVybnMgVGhlIGhhc2gsIGFzIGhleC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNvbXB1dGVDYWNoZUhhc2goZW50cnlGaWxlczogc3RyaW5nW10sIGdlbmVyYXRvckRpcmVjdG9yeTogc3RyaW5nKTogc3RyaW5nIHtcbiAgY29uc3QgaGFzaCA9IGNyZWF0ZUhhc2goJ3NoYTI1NicpO1xuXG4gIC8vIFRoZSBnZW5lcmF0b3IgaXRzZWxmXG4gIGNvbnN0IGdlbmVyYXRvckZpbGVzID0gcmVhZGRpclN5bmMoZ2VuZXJhdG9yRGlyZWN0b3J5KS5maWx0ZXIoKG5hbWUpID0+ICFuYW1lLmVuZHNXaXRoKCcudGVzdC50cycpKS5zb3J0KCk7XG4gIGZvciAoY29uc3QgZ2VuZXJhdG9yRmlsZSBvZiBnZW5lcmF0b3JGaWxlcykge1xuICAgIGhhc2gudXBkYXRlKGdlbmVyYXRvckZpbGUpO1xuICAgIGhhc2gudXBkYXRlKHJlYWRGaWxlU3luYyhqb2luKGdlbmVyYXRvckRpcmVjdG9yeSwgZ2VuZXJhdG9yRmlsZSksICd1dGYtOCcpKTtcbiAgfVxuXG4gIC8vIFRoZSBzZXR0aW5ncywgd2hpY2ggZXZlcnkgbGluayBhbmQgcGF0aCBkZXBlbmRzIG9uLiBBIGhvb2sgaXMgaGFzaGVkIGJ5IGl0cyBzb3VyY2UsIHdoaWNoIGBKU09OLnN0cmluZ2lmeWAgZHJvcHMuXG4gIGNvbnN0IHNldHRpbmdzID0gZ2V0QXBpRG9jU2V0dGluZ3MoKTtcbiAgaGFzaC51cGRhdGUoSlNPTi5zdHJpbmdpZnkoe1xuICAgIC4uLnNldHRpbmdzLFxuICAgIGV4dGVybmFsVHlwZUxpbmtzOiBbLi4uc2V0dGluZ3MuZXh0ZXJuYWxUeXBlTGlua3NdLFxuICAgIGltcG9ydFN0YXRlbWVudDogc2V0dGluZ3MuaW1wb3J0U3RhdGVtZW50ICYmIFN0cmluZyhzZXR0aW5ncy5pbXBvcnRTdGF0ZW1lbnQpLFxuICAgIG1lbWJlclJvdXRlU2VnbWVudDogc2V0dGluZ3MubWVtYmVyUm91dGVTZWdtZW50ICYmIFN0cmluZyhzZXR0aW5ncy5tZW1iZXJSb3V0ZVNlZ21lbnQpLFxuICAgIHBhY2thZ2VTaXRlczogWy4uLnNldHRpbmdzLnBhY2thZ2VTaXRlc11cbiAgfSkpO1xuXG4gIC8vIEhhc2ggYWxsIGVudHJ5IHNvdXJjZSBmaWxlc1xuICBmb3IgKGNvbnN0IGZpbGVQYXRoIG9mIFsuLi5lbnRyeUZpbGVzXS5zb3J0KCkpIHtcbiAgICBoYXNoLnVwZGF0ZShmaWxlUGF0aCk7XG4gICAgaGFzaC51cGRhdGUocmVhZEZpbGVTeW5jKGZpbGVQYXRoLCAndXRmLTgnKSk7XG4gIH1cblxuICByZXR1cm4gaGFzaC5kaWdlc3QoJ2hleCcpO1xufVxuXG4vKipcbiAqIENvbXB1dGUgdGhlIG5hbWVzcGFjZSAoUE9TSVggcGF0aCByZWxhdGl2ZSB0byBgc3JjYCwgbm8gZXh0ZW5zaW9uKSBmb3IgYSBzb3VyY2UgZmlsZS5cbiAqXG4gKiBAcGFyYW0gc3JjRGlyZWN0b3J5IC0gVGhlIHNvdXJjZSBmb2xkZXIgdGhlIG5hbWVzcGFjZSBpcyByZWxhdGl2ZSB0by5cbiAqIEBwYXJhbSBmaWxlUGF0aCAtIFRoZSBmaWxlJ3MgcGF0aC5cbiAqIEByZXR1cm5zIFRoZSBuYW1lc3BhY2UuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjb21wdXRlTmFtZXNwYWNlKHNyY0RpcmVjdG9yeTogc3RyaW5nLCBmaWxlUGF0aDogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIHJlbGF0aXZlKHNyY0RpcmVjdG9yeSwgZmlsZVBhdGgpLnJlcGxhY2VBbGwoJ1xcXFwnLCAnLycpLnJlcGxhY2UoL1xcLnRzJC8sICcnKTtcbn1cblxuLyoqXG4gKiBSZWN1cnNpdmVseSBmaW5kIGFsbCBkb2N1bWVudGFibGUgYCoudHNgIGVudHJ5IGZpbGVzIHVuZGVyIGBzcmNgLlxuICpcbiAqIEV4Y2x1ZGVzOiBgKi50ZXN0LnRzYCAoaW5jbC4gYCouYnJvd3Nlci50ZXN0LnRzYCAvIGAqLmludGVncmF0aW9uLnRlc3QudHNgKSwgYCouZC50c2AsXG4gKiBgaW5kZXgudHNgLCBgX19tZXJnZWQudHNgLCBgc2V0dXAudHNgLCBgKi1zZXR1cC50c2AsIGFuZCBhbnkgc3VidHJlZSB1bmRlciBhIGBAdHlwZXNgLFxuICogYHN0eWxlc2AsIG9yIGB0ZXN0LWhlbHBlcnNgIGRpcmVjdG9yeSwgb3Igb25lIG9mIGBleGNsdWRlZERpcmVjdG9yaWVzYC5cbiAqXG4gKiBAcGFyYW0gZGlyZWN0b3J5IC0gVGhlIGZvbGRlciB0byBzZWFyY2guXG4gKiBAcGFyYW0gZXhjbHVkZWREaXJlY3RvcmllcyAtIERpcmVjdG9yeSBuYW1lcyBleGNsdWRlZCBpbiBhZGRpdGlvbiB0byB0aGUgZGVmYXVsdHMuXG4gKiBAcmV0dXJucyBUaGUgZW50cnkgZmlsZXMnIHBhdGhzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZmluZEVudHJ5RmlsZXMoZGlyZWN0b3J5OiBzdHJpbmcsIGV4Y2x1ZGVkRGlyZWN0b3JpZXM6IHJlYWRvbmx5IHN0cmluZ1tdID0gW10pOiBzdHJpbmdbXSB7XG4gIGNvbnN0IHJlc3VsdHM6IHN0cmluZ1tdID0gW107XG4gIGZvciAoY29uc3QgZW50cnkgb2YgcmVhZGRpclN5bmMoZGlyZWN0b3J5LCB7IHdpdGhGaWxlVHlwZXM6IHRydWUgfSkpIHtcbiAgICBjb25zdCBmdWxsUGF0aCA9IGpvaW4oZGlyZWN0b3J5LCBlbnRyeS5uYW1lKTtcbiAgICBpZiAoZW50cnkuaXNEaXJlY3RvcnkoKSkge1xuICAgICAgaWYgKCFpc0RvY3VtZW50ZWREaXJlY3RvcnlOYW1lKGVudHJ5Lm5hbWUsIGV4Y2x1ZGVkRGlyZWN0b3JpZXMpKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgcmVzdWx0cy5wdXNoKC4uLmZpbmRFbnRyeUZpbGVzKGZ1bGxQYXRoLCBleGNsdWRlZERpcmVjdG9yaWVzKSk7XG4gICAgfSBlbHNlIGlmIChpc0RvY3VtZW50ZWRGaWxlTmFtZShlbnRyeS5uYW1lKSkge1xuICAgICAgcmVzdWx0cy5wdXNoKGZ1bGxQYXRoKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHJlc3VsdHM7XG59XG5cbi8qKlxuICogRHJvcHMgZXZlcnkgZG9jdW1lbnRlZCB0eXBlIHRoZSBwdWJsaWMgQVBJIGJhcnJlbCBkb2VzIG5vdCByZS1leHBvcnQuIFJ1biBpdCBhZnRlciBgcmVzb2x2ZUluaGVyaXRlZE1lbWJlcnNgLCBzb1xuICogYSBwdWJsaWMgY2xhc3Mgc3RpbGwgaW5oZXJpdHMgdGhlIG1lbWJlcnMgb2YgYW4gaW50ZXJuYWwgYmFzZSBjbGFzcy5cbiAqXG4gKiBAcGFyYW0gdHlwZXMgLSBUaGUgZG9jdW1lbnRlZCB0eXBlcywga2V5ZWQgYnkgcXVhbGlmaWVkIGlkLlxuICogQHBhcmFtIGJhcnJlbCAtIFRoZSBiYXJyZWwsIHJlYWQgYnkge0BsaW5rIHJlYWRQdWJsaWNBcGlCYXJyZWx9LlxuICovXG5leHBvcnQgZnVuY3Rpb24ga2VlcFB1YmxpY0FwaSh0eXBlczogTWFwPHN0cmluZywgVHlwZUluZm8+LCBiYXJyZWw6IFB1YmxpY0FwaUJhcnJlbCk6IHZvaWQge1xuICBmb3IgKGNvbnN0IFtrZXksIGluZm9dIG9mIHR5cGVzKSB7XG4gICAgaWYgKCFiYXJyZWwud2hvbGVOYW1lc3BhY2VzLmhhcyhpbmZvLm5hbWVzcGFjZSkgJiYgIWJhcnJlbC5wdWJsaWNLZXlzLmhhcyhrZXkpKSB7XG4gICAgICB0eXBlcy5kZWxldGUoa2V5KTtcbiAgICB9XG4gIH1cbn1cblxuLyoqXG4gKiBDb2xsZWN0cyBhIHNvdXJjZSBmaWxlJ3MgZXhwb3J0ZWQgdHlwZSBhbGlhc2VzLCBlbnVtcywgaW50ZXJmYWNlcyBhbmQgY2xhc3Nlcy5cbiAqXG4gKiBAcGFyYW0gc3JjIC0gVGhlIHNvdXJjZSBmaWxlLlxuICogQHBhcmFtIHR5cGVzIC0gVGhlIGRvY3VtZW50ZWQgdHlwZXMsIGtleWVkIGJ5IHF1YWxpZmllZCBpZC5cbiAqIEBwYXJhbSBuYW1lc3BhY2UgLSBUaGUgdHlwZSdzIG5hbWVzcGFjZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHByb2Nlc3NTb3VyY2VGaWxlKHNyYzogU291cmNlRmlsZSwgdHlwZXM6IE1hcDxzdHJpbmcsIFR5cGVJbmZvPiwgbmFtZXNwYWNlOiBzdHJpbmcpOiB2b2lkIHtcbiAgZm9yIChjb25zdCBhbGlhcyBvZiBzcmMuZ2V0VHlwZUFsaWFzZXMoKSkge1xuICAgIGlmICghYWxpYXMuaXNFeHBvcnRlZCgpKSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgY29uc3Qga2V5ID0gcXVhbGlmaWVkS2V5KG5hbWVzcGFjZSwgYWxpYXMuZ2V0TmFtZSgpKTtcbiAgICBpZiAoIXR5cGVzLmhhcyhrZXkpKSB7XG4gICAgICB0eXBlcy5zZXQoa2V5LCBleHRyYWN0VHlwZUFsaWFzSW5mbyhhbGlhcywgbmFtZXNwYWNlKSk7XG4gICAgfVxuICB9XG5cbiAgZm9yIChjb25zdCBlbnVtRGVjbGFyYXRpb24gb2Ygc3JjLmdldEVudW1zKCkpIHtcbiAgICBpZiAoIWVudW1EZWNsYXJhdGlvbi5pc0V4cG9ydGVkKCkpIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICBjb25zdCBrZXkgPSBxdWFsaWZpZWRLZXkobmFtZXNwYWNlLCBlbnVtRGVjbGFyYXRpb24uZ2V0TmFtZSgpKTtcbiAgICBpZiAoIXR5cGVzLmhhcyhrZXkpKSB7XG4gICAgICB0eXBlcy5zZXQoa2V5LCBleHRyYWN0RW51bUluZm8oZW51bURlY2xhcmF0aW9uLCBuYW1lc3BhY2UpKTtcbiAgICB9XG4gIH1cblxuICBmb3IgKGNvbnN0IGlmYWNlIG9mIHNyYy5nZXRJbnRlcmZhY2VzKCkpIHtcbiAgICBpZiAoIWlmYWNlLmlzRXhwb3J0ZWQoKSkge1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIGNvbnN0IGtleSA9IHF1YWxpZmllZEtleShuYW1lc3BhY2UsIGlmYWNlLmdldE5hbWUoKSk7XG4gICAgaWYgKCF0eXBlcy5oYXMoa2V5KSkge1xuICAgICAgdHlwZXMuc2V0KGtleSwgZXh0cmFjdEludGVyZmFjZUluZm8oaWZhY2UsIG5hbWVzcGFjZSkpO1xuICAgIH1cbiAgfVxuXG4gIGZvciAoY29uc3QgY2xzIG9mIHNyYy5nZXRDbGFzc2VzKCkpIHtcbiAgICBpZiAoIWNscy5pc0V4cG9ydGVkKCkpIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICBjb25zdCBuYW1lID0gY2xzLmdldE5hbWUoKTtcbiAgICBpZiAoIW5hbWUpIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICBjb25zdCBrZXkgPSBxdWFsaWZpZWRLZXkobmFtZXNwYWNlLCBuYW1lKTtcbiAgICBpZiAoIXR5cGVzLmhhcyhrZXkpKSB7XG4gICAgICB0eXBlcy5zZXQoa2V5LCBleHRyYWN0Q2xhc3NJbmZvKGNscywgbmFtZXNwYWNlKSk7XG4gICAgfVxuICB9XG59XG5cbi8qKlxuICogUmVhZHMgYSBwYWNrYWdlJ3MgcHVibGljIEFQSSBiYXJyZWw6IHRoZSBtb2R1bGVzIGl0IHJlLWV4cG9ydHMgZnJvbSBhbmQgdGhlIG5hbWVzIGl0IGZvcndhcmRzLlxuICpcbiAqIEl0IGlzIHBhcnNlZCBvbiBpdHMgb3duIHJhdGhlciB0aGFuIHRocm91Z2ggdGhlIHRzLW1vcnBoIHByb2plY3QsIGJlY2F1c2UgdGhlIGNhY2hlIGNoZWNrIG5lZWRzIHRoZSBlbnRyeSBmaWxlc1xuICogYmVmb3JlIHRoYXQgcHJvamVjdCBleGlzdHMsIGFuZCBhIGNhY2hlIGhpdCBtdXN0IG5vdCBwYXkgZm9yIGxvYWRpbmcgaXQuXG4gKlxuICogQHBhcmFtIGVudHJ5RmlsZSAtIFRoZSBiYXJyZWwsIGUuZy4gYDxyb290Pi9zcmMvaW5kZXgudHNgLlxuICogQHBhcmFtIHNvdXJjZURpcmVjdG9yeSAtIFRoZSBmb2xkZXIgbmFtZXNwYWNlcyBhcmUgcmVsYXRpdmUgdG8uXG4gKiBAcmV0dXJucyBUaGUgYmFycmVsLlxuICogQHRocm93cyBJZiB0aGUgYmFycmVsIHJlLWV4cG9ydHMgYSBtb2R1bGUgdGhhdCBkb2VzIG5vdCBleGlzdCBvciBiZWxvbmdzIHRvIGFub3RoZXIgcGFja2FnZSwgcmVuYW1lcyBhbiBleHBvcnQsXG4gKiBvciByZS1leHBvcnRzIGEgbW9kdWxlIGFzIGEgbmFtZXNwYWNlOiBub25lIG9mIHRoZXNlIGNhbiBiZSBkb2N1bWVudGVkIHVuZGVyIHRoZSBuYW1lIGEgY29uc3VtZXIgaW1wb3J0cy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlYWRQdWJsaWNBcGlCYXJyZWwoZW50cnlGaWxlOiBzdHJpbmcsIHNvdXJjZURpcmVjdG9yeTogc3RyaW5nKTogUHVibGljQXBpQmFycmVsIHtcbiAgY29uc3Qgc291cmNlRmlsZSA9IGNyZWF0ZVNvdXJjZUZpbGUoZW50cnlGaWxlLCByZWFkRmlsZVN5bmMoZW50cnlGaWxlLCAndXRmLTgnKSwgU2NyaXB0VGFyZ2V0LkxhdGVzdCk7XG4gIGNvbnN0IGZpbGVzID0gbmV3IFNldDxzdHJpbmc+KCk7XG4gIGNvbnN0IHB1YmxpY0tleXMgPSBuZXcgU2V0PHN0cmluZz4oKTtcbiAgY29uc3Qgd2hvbGVOYW1lc3BhY2VzID0gbmV3IFNldDxzdHJpbmc+KCk7XG5cbiAgZm9yIChjb25zdCBzdGF0ZW1lbnQgb2Ygc291cmNlRmlsZS5zdGF0ZW1lbnRzKSB7XG4gICAgaWYgKCFpc0V4cG9ydERlY2xhcmF0aW9uKHN0YXRlbWVudCkgfHwgc3RhdGVtZW50Lm1vZHVsZVNwZWNpZmllciA9PT0gdW5kZWZpbmVkIHx8ICFpc1N0cmluZ0xpdGVyYWwoc3RhdGVtZW50Lm1vZHVsZVNwZWNpZmllcikpIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICBjb25zdCBtb2R1bGVTcGVjaWZpZXIgPSBzdGF0ZW1lbnQubW9kdWxlU3BlY2lmaWVyLnRleHQ7XG4gICAgaWYgKCFtb2R1bGVTcGVjaWZpZXIuc3RhcnRzV2l0aCgnLicpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYCR7ZW50cnlGaWxlfSByZS1leHBvcnRzICcke21vZHVsZVNwZWNpZmllcn0nLCB3aGljaCBpcyBub3QgYSBtb2R1bGUgb2YgdGhpcyBwYWNrYWdlLmApO1xuICAgIH1cbiAgICBjb25zdCBmaWxlUGF0aCA9IHJlc29sdmUoZGlybmFtZShlbnRyeUZpbGUpLCBtb2R1bGVTcGVjaWZpZXIpO1xuICAgIGlmICghZXhpc3RzU3luYyhmaWxlUGF0aCkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgJHtlbnRyeUZpbGV9IHJlLWV4cG9ydHMgJyR7bW9kdWxlU3BlY2lmaWVyfScsIHdoaWNoIGRvZXMgbm90IGV4aXN0LmApO1xuICAgIH1cbiAgICBmaWxlcy5hZGQoZmlsZVBhdGgpO1xuICAgIGNvbnN0IG5hbWVzcGFjZSA9IGNvbXB1dGVOYW1lc3BhY2Uoc291cmNlRGlyZWN0b3J5LCBmaWxlUGF0aCk7XG5cbiAgICBjb25zdCB7IGV4cG9ydENsYXVzZSB9ID0gc3RhdGVtZW50O1xuICAgIGlmIChleHBvcnRDbGF1c2UgPT09IHVuZGVmaW5lZCkge1xuICAgICAgd2hvbGVOYW1lc3BhY2VzLmFkZChuYW1lc3BhY2UpO1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIGlmIChpc05hbWVzcGFjZUV4cG9ydChleHBvcnRDbGF1c2UpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYCR7ZW50cnlGaWxlfSByZS1leHBvcnRzICcke21vZHVsZVNwZWNpZmllcn0nIGFzIGEgbmFtZXNwYWNlLCB3aGljaCB0aGUgQVBJIHJlZmVyZW5jZSBjYW5ub3QgZG9jdW1lbnQuYCk7XG4gICAgfVxuICAgIGZvciAoY29uc3QgZWxlbWVudCBvZiBleHBvcnRDbGF1c2UuZWxlbWVudHMpIHtcbiAgICAgIGlmIChlbGVtZW50LnByb3BlcnR5TmFtZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgJHtlbnRyeUZpbGV9IHJlbmFtZXMgJyR7ZWxlbWVudC5wcm9wZXJ0eU5hbWUudGV4dH0nIHRvICcke2VsZW1lbnQubmFtZS50ZXh0fScsIHdoaWNoIHRoZSBBUEkgcmVmZXJlbmNlIGNhbm5vdCBkb2N1bWVudC5gKTtcbiAgICAgIH1cbiAgICAgIHB1YmxpY0tleXMuYWRkKHF1YWxpZmllZEtleShuYW1lc3BhY2UsIGVsZW1lbnQubmFtZS50ZXh0KSk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHsgZmlsZXM6IFsuLi5maWxlc10sIHB1YmxpY0tleXMsIHdob2xlTmFtZXNwYWNlcyB9O1xufVxuXG4vKipcbiAqIFJlZ2lzdGVyIGFsbCB0eXBlIHBhcmFtZXRlciBuYW1lcyBzbyByZW5kZXJUeXBlV2l0aExpbmtzIHdvbid0IGh5cGVybGluayB0aGVtLlxuICogU2tpcCBuYW1lcyB0aGF0IGFyZSBhbHNvIGtub3duIHR5cGVzIOKAlCB0aG9zZSBzaG91bGQgc3RpbGwgYmUgbGlua2FibGUuIFRoZSBzaXRlJ3MgYGdlbmVyaWNUeXBlUGFyYW1ldGVyc2BcbiAqIGFyZSByZWdpc3RlcmVkIGFzIGdpdmVuLlxuICpcbiAqIEBwYXJhbSB0eXBlcyAtIFRoZSBkb2N1bWVudGVkIHR5cGVzLCBrZXllZCBieSBxdWFsaWZpZWQgaWQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZWdpc3RlckdlbmVyaWNUeXBlUGFyYW1zKHR5cGVzOiBNYXA8c3RyaW5nLCBUeXBlSW5mbz4pOiB2b2lkIHtcbiAgZm9yIChjb25zdCBuYW1lIG9mIGdldEFwaURvY1NldHRpbmdzKCkuZ2VuZXJpY1R5cGVQYXJhbWV0ZXJzID8/IFtdKSB7XG4gICAgR0VORVJJQ19UWVBFX1BBUkFNUy5hZGQobmFtZSk7XG4gIH1cbiAgY29uc3Qga25vd25OYW1lcyA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuICBmb3IgKGNvbnN0IFssIGluZm9dIG9mIHR5cGVzKSB7XG4gICAga25vd25OYW1lcy5hZGQoaW5mby5uYW1lKTtcbiAgfVxuICBmb3IgKGNvbnN0IFssIGluZm9dIG9mIHR5cGVzKSB7XG4gICAgZm9yIChjb25zdCB0cCBvZiBpbmZvLnR5cGVQYXJhbWV0ZXJzKSB7XG4gICAgICBjb25zdCBiYXJlUGFyYW1ldGVyID0gdHAucmVwbGFjZSgvXFxzK2V4dGVuZHNcXHMrLiokLywgJycpO1xuICAgICAgaWYgKCFrbm93bk5hbWVzLmhhcyhiYXJlUGFyYW1ldGVyKSkge1xuICAgICAgICBHRU5FUklDX1RZUEVfUEFSQU1TLmFkZChiYXJlUGFyYW1ldGVyKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gaXNUeXBlRGVjbGFyYXRpb24oZGVjbGFyYXRpb246IE5vZGUpOiBib29sZWFuIHtcbiAgcmV0dXJuIE5vZGUuaXNDbGFzc0RlY2xhcmF0aW9uKGRlY2xhcmF0aW9uKSB8fCBOb2RlLmlzSW50ZXJmYWNlRGVjbGFyYXRpb24oZGVjbGFyYXRpb24pIHx8IE5vZGUuaXNUeXBlQWxpYXNEZWNsYXJhdGlvbihkZWNsYXJhdGlvbikgfHwgTm9kZS5pc0VudW1EZWNsYXJhdGlvbihkZWNsYXJhdGlvbik7XG59XG5cbmZ1bmN0aW9uIHF1YWxpZmllZEtleShuYW1lc3BhY2U6IHN0cmluZywgbmFtZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIGAke25hbWVzcGFjZX0jJHtuYW1lfWA7XG59XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFB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