@mnaoumov/typescript-dev-toolkit 6.0.1 → 6.0.2

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.
@@ -141,7 +141,16 @@ function memberHref(memberSlugString, inheritedFrom, allTypes, currentNamespace)
141
141
  if (!inheritedFrom) {
142
142
  return `./${memberSlugString}/`;
143
143
  }
144
- const parentInfo = findType(allTypes, inheritedFrom, currentNamespace);
144
+ let parentInfo = findType(allTypes, inheritedFrom, currentNamespace);
145
+ const visited = /* @__PURE__ */ new Set();
146
+ while (parentInfo && !doesMemberPageExist(parentInfo.namespace, parentInfo.name, memberSlugString)) {
147
+ if (visited.has(parentInfo)) {
148
+ return "";
149
+ }
150
+ visited.add(parentInfo);
151
+ const member = parentInfo.properties.find((property) => (0, import_api_doc_text_utils.memberRouteSegment)(property.name) === memberSlugString) ?? parentInfo.methods.find((method) => (0, import_api_doc_text_utils.overloadRouteSegment)(method.overloadKey) === memberSlugString);
152
+ parentInfo = member?.inheritedFrom ? findType(allTypes, member.inheritedFrom, parentInfo.namespace) : void 0;
153
+ }
145
154
  if (!parentInfo || !doesMemberPageExist(parentInfo.namespace, parentInfo.name, memberSlugString)) {
146
155
  return "";
147
156
  }
@@ -374,4 +383,4 @@ function warnMemberSlugCollisions(info, namespace) {
374
383
  typeHref,
375
384
  typeLink
376
385
  });
377
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9kb2NzLXNpdGUvYXBpLWRvYy1saW5rLXJlbmRlcmluZy50cyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBmaWxlXG4gKlxuICogVHlwZS1saW5rIHJlbmRlcmluZzogdHVybnMgdHlwZSB0ZXh0IGFuZCBpbmxpbmUgbGluayB0YWdzIGludG8gbWFya2Rvd24gbGlua3MgdG8gZ2VuZXJhdGVkIHBhZ2VzXG4gKiBvciBleHRlcm5hbCByZWZlcmVuY2VzIChUeXBlU2NyaXB0IGhhbmRib29rLCBNRE4gV2ViIEFQSSwgSlMgZ2xvYmFscykuXG4gKi9cblxuaW1wb3J0IHtcbiAgZ2V0TWFuZGF0b3J5TmFtZWRHcm91cCxcbiAgZ2V0T3B0aW9uYWxOYW1lZEdyb3VwXG59IGZyb20gJ0BtbmFvdW1vdi90eXBlc2NyaXB0LWxpYi9yZWctZXhwJztcbmltcG9ydCB7IHJlYWRGaWxlU3luYyB9IGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHsgam9pbiB9IGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCB0eXBlIHtcbiAgVHlwZUluZm8sXG4gIFdlYkFwaUVudHJ5XG59IGZyb20gJy4vYXBpLWRvYy10eXBlcy50cyc7XG5cbmltcG9ydCB7XG4gIEdFTkVSSUNfVFlQRV9QQVJBTVMsXG4gIFRTX0dMT0JBTF9UWVBFUyxcbiAgVFNfUFJJTUlUSVZFX1RZUEVTLFxuICBUU19VVElMSVRZX1RZUEVTXG59IGZyb20gJy4vYXBpLWRvYy1jb25zdGFudHMudHMnO1xuaW1wb3J0IHsgZ2V0UGFja2FnZVR5cGVVcmwgfSBmcm9tICcuL2FwaS1kb2MtcGFja2FnZS1zaXRlcy50cyc7XG5pbXBvcnQge1xuICB0b1JvdXRlU2VnbWVudCxcbiAgdG9Sb3V0ZVNlZ21lbnRQcmVzZXJ2ZUNhc2Vcbn0gZnJvbSAnLi9hcGktZG9jLXJvdXRlLXNlZ21lbnRzLnRzJztcbmltcG9ydCB7IGdldEFwaURvY1NldHRpbmdzIH0gZnJvbSAnLi9hcGktZG9jLXNldHRpbmdzLnRzJztcbmltcG9ydCB7XG4gIGVzY2FwZU1keEFuZ2xlQnJhY2tldHMsXG4gIGVzY2FwZU1keFByb3NlLFxuICBnZXROYW1lc3BhY2VEaXJlY3RvcnksXG4gIG1lbWJlclJvdXRlU2VnbWVudCxcbiAgbWVtYmVyU2x1ZyxcbiAgb3ZlcmxvYWRSb3V0ZVNlZ21lbnQsXG4gIG92ZXJsb2FkU2x1ZyxcbiAgcmVwbGFjZVJlZ0V4cE1hdGNoZXMsXG4gIHNlZ21lbnRNYXJrZG93blxufSBmcm9tICcuL2FwaS1kb2MtdGV4dC11dGlscy50cyc7XG5cbi8qKlxuTG9hZGVkIGZyb20gdHlwZWRvYy1wbHVnaW4tbWRuLWxpbmtzIGRhdGEgYXQgcnVudGltZVxuICovXG4vKipcbk1vZHVsZS1sZXZlbCBtdXRhYmxlIHN0YXRlLCBoZWxkIGluIG9uZSBvYmplY3Qgc28gZWFjaCBtdXRhdGlvbiBuYW1lcyBpdCBleHBsaWNpdGx5LlxuICovXG5pbnRlcmZhY2UgTW9kdWxlU3RhdGUge1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgdHlwZXNjcmlwdC1kZXYtdG9vbGtpdC9yZWFkb25seS1pbnRlcmZhY2UtbWVtYmVycyAtLSBUaGUgV2ViIEFQSSBtZXRhZGF0YSBjYWNoZSBpcyByZXBsYWNlZCBhZnRlciBsb2FkaW5nLlxuICB3ZWJBcGlUeXBlczogUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG59XG5cbmNvbnN0IG1vZHVsZVN0YXRlOiBNb2R1bGVTdGF0ZSA9IHtcbiAgd2ViQXBpVHlwZXM6IHt9XG59O1xuLyoqXG5Mb3dlcmNhc2VkLCBjb2xsaXNpb24tZGlzYW1iaWd1YXRlZCBPTi1ESVNLIHNlZ21lbnQgcGVyIHF1YWxpZmllZCB0eXBlIGtleSAoYCR7bmFtZXNwYWNlfSMke25hbWV9YCkuXG4gKi9cbmNvbnN0IHR5cGVGaWxlU2VnbWVudHMgPSBuZXcgTWFwPHN0cmluZywgc3RyaW5nPigpO1xuLyoqXG5DYXNlLXByZXNlcnZlZCBVUkwvcm91dGUgc2VnbWVudCBwZXIgcXVhbGlmaWVkIHR5cGUga2V5IChgJHtuYW1lc3BhY2V9IyR7bmFtZX1gKS5cbiAqL1xuY29uc3QgdHlwZVJvdXRlU2VnbWVudHMgPSBuZXcgTWFwPHN0cmluZywgc3RyaW5nPigpO1xuXG4vKipcbiAqIFJvdXRlLXNlZ21lbnQga2V5cyBvZiB0aGUgbWVtYmVyIHBhZ2VzIHRoYXQgYGdlbmVyYXRlTWVtYmVyUGFnZXNgIHdpbGwgYWN0dWFsbHkgZW1pdCwgYXNcbiAqIGAke25hbWVzcGFjZX0jJHtUeXBlTmFtZX0jJHtyb3V0ZVNlZ21lbnR9YC4gT25seSBOT04taW5oZXJpdGVkIHByb3BlcnRpZXMgYW5kIG5vbi1pbmhlcml0ZWQgbWV0aG9kXG4gKiBvdmVybG9hZCBrZXlzIGdldCBhIHBhZ2UsIHNvIHRoaXMgbGV0cyBsaW5rIGVtaXR0ZXJzIGF2b2lkIHBvaW50aW5nIGF0IGEgbWVtYmVyIHBhZ2UgdGhhdCBpcyBuZXZlclxuICogZ2VuZXJhdGVkIChhbiBpbmhlcml0ZWQgbWVtYmVyLCBhbiBlbnVtIG1lbWJlciwgYW4gb3B0aW9ucy1pbnRlcmZhY2UgbWVtYmVyKSDigJQgd2hpY2ggd291bGQgNDA0LlxuICovXG5jb25zdCBnZW5lcmF0ZWRNZW1iZXJQYWdlcyA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuXG4vKipcbiAqIFdoZXRoZXIgYSBtZW1iZXIgcGFnZSB3aWxsIGJlIGdlbmVyYXRlZCBmb3IgYHJvdXRlU2VnbWVudGAgb24gdGhlIGdpdmVuIHR5cGUuXG4gKlxuICogQHBhcmFtIG5hbWVzcGFjZSAtIFRoZSB0eXBlJ3MgbmFtZXNwYWNlLlxuICogQHBhcmFtIHR5cGVOYW1lIC0gVGhlIHR5cGUncyBuYW1lLlxuICogQHBhcmFtIHJvdXRlU2VnbWVudCAtIFRoZSBtZW1iZXIncyByb3V0ZSBzZWdtZW50LlxuICogQHJldHVybnMgV2hldGhlciB0aGUgcGFnZSBpcyBnZW5lcmF0ZWQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBkb2VzTWVtYmVyUGFnZUV4aXN0KG5hbWVzcGFjZTogc3RyaW5nLCB0eXBlTmFtZTogc3RyaW5nLCByb3V0ZVNlZ21lbnQ6IHN0cmluZyk6IGJvb2xlYW4ge1xuICByZXR1cm4gZ2VuZXJhdGVkTWVtYmVyUGFnZXMuaGFzKGAke25hbWVzcGFjZX0jJHt0eXBlTmFtZX0jJHtyb3V0ZVNlZ21lbnR9YCk7XG59XG5cbi8qKlxuICogUmVzb2x2ZSBhIGJhcmUgdHlwZSBuYW1lIHRvIGEgZG9jdW1lbnRlZCBgVHlwZUluZm9gLlxuICpcbiAqIFRoZSBtb2RlbCBtYXAgaXMga2V5ZWQgYnkgYSBxdWFsaWZpZWQgYCR7bmFtZXNwYWNlfSMke25hbWV9YCBpZGVudGl0eSwgYmVjYXVzZSBhIHBhY2thZ2VcbiAqIGNhbiBleHBvcnQgdGhlIHNhbWUgc2ltcGxlIG5hbWUgZnJvbSBkaWZmZXJlbnQgbW9kdWxlcy4gUmVzb2x1dGlvbiBpcyBiZXN0LWVmZm9ydDpcbiAqICAgMS4gUHJlZmVyIGEgdHlwZSBpbiBgY3VycmVudE5hbWVzcGFjZWAgKHRoZSByZWZlcmVuY2luZyBwYWdlJ3MgbW9kdWxlKS5cbiAqICAgMi4gT3RoZXJ3aXNlLCBpZiBleGFjdGx5IG9uZSB0eXBlIGFjcm9zcyBhbGwgbW9kdWxlcyBoYXMgdGhhdCBiYXJlIG5hbWUsIHVzZSBpdC5cbiAqICAgMy4gSWYgdGhlIGJhcmUgbmFtZSBpcyBhbWJpZ3VvdXMgKG11bHRpcGxlIG1vZHVsZXMpLCBnaXZlIHVwIChjYWxsZXIgcmVuZGVycyBwbGFpbiBjb2RlKS5cbiAqXG4gKiBAcGFyYW0gYWxsVHlwZXMgLSBFdmVyeSBkb2N1bWVudGVkIHR5cGUsIGtleWVkIGJ5IGAke25hbWVzcGFjZX0jJHtuYW1lfWAuXG4gKiBAcGFyYW0gbmFtZSAtIFRoZSB0eXBlJ3MgbmFtZS5cbiAqIEBwYXJhbSBjdXJyZW50TmFtZXNwYWNlIC0gVGhlIG5hbWVzcGFjZSBvZiB0aGUgcmVmZXJlbmNpbmcgcGFnZSwgcHJlZmVycmVkIHdoZW4gdGhlIG5hbWUgaXMgYW1iaWd1b3VzLlxuICogQHJldHVybnMgVGhlIHR5cGUsIG9yIGB1bmRlZmluZWRgIHdoZW4gbm8gdHlwZSBvciBtb3JlIHRoYW4gb25lIGhhcyB0aGF0IG5hbWUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBmaW5kVHlwZShhbGxUeXBlczogTWFwPHN0cmluZywgVHlwZUluZm8+LCBuYW1lOiBzdHJpbmcsIGN1cnJlbnROYW1lc3BhY2U/OiBzdHJpbmcpOiBUeXBlSW5mbyB8IHVuZGVmaW5lZCB7XG4gIGlmIChjdXJyZW50TmFtZXNwYWNlICE9PSB1bmRlZmluZWQpIHtcbiAgICBjb25zdCBxdWFsaWZpZWQgPSBhbGxUeXBlcy5nZXQoYCR7Y3VycmVudE5hbWVzcGFjZX0jJHtuYW1lfWApO1xuICAgIGlmIChxdWFsaWZpZWQpIHtcbiAgICAgIHJldHVybiBxdWFsaWZpZWQ7XG4gICAgfVxuICB9XG4gIGxldCBmb3VuZDogVHlwZUluZm8gfCB1bmRlZmluZWQ7XG4gIGxldCBtYXRjaENvdW50ID0gMDtcbiAgZm9yIChjb25zdCBpbmZvIG9mIGFsbFR5cGVzLnZhbHVlcygpKSB7XG4gICAgaWYgKGluZm8ubmFtZSAhPT0gbmFtZSkge1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgZm91bmQgPSBpbmZvO1xuICAgIG1hdGNoQ291bnQrKztcbiAgICBpZiAobWF0Y2hDb3VudCA+IDEpIHtcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuICB9XG4gIHJldHVybiBtYXRjaENvdW50ID09PSAxID8gZm91bmQgOiB1bmRlZmluZWQ7XG59XG5cbi8qKlxuICogTGluayBhIGJhc2UgdHlwZSBleHByZXNzaW9uIGZvciB0aGUgXCJFeHRlbmRzOlwiIGxpbmUuXG4gKiBTaW1wbGUgdHlwZSByZWZlcmVuY2VzIChpZGVudGlmaWVyICsgb3B0aW9uYWwgZ2VuZXJpY3MpIHVzZSByZW5kZXJUeXBlV2l0aExpbmtzXG4gKiBzbyBlYWNoIHR5cGUgYXJndW1lbnQgZ2V0cyBpdHMgb3duIGxpbmsuXG4gKiBDb21wbGV4IGV4cHJlc3Npb25zIChvYmplY3QgdHlwZXMsIGludGVyc2VjdGlvbnMsIGV0Yy4pIGZhbGwgYmFjayB0byB0eXBlTGlua1xuICogdG8gYXZvaWQgTURYIHBhcnNpbmcgaXNzdWVzIHdpdGggYHtgLCBgfWAsIGB8YCBldGMuXG4gKlxuICogQHBhcmFtIHR5cGVOYW1lIC0gVGhlIHR5cGUncyBuYW1lLlxuICogQHBhcmFtIGFsbFR5cGVzIC0gRXZlcnkgZG9jdW1lbnRlZCB0eXBlLCBrZXllZCBieSBgJHtuYW1lc3BhY2V9IyR7bmFtZX1gLlxuICogQHBhcmFtIGN1cnJlbnROYW1lc3BhY2UgLSBUaGUgbmFtZXNwYWNlIG9mIHRoZSByZWZlcmVuY2luZyBwYWdlLCBwcmVmZXJyZWQgd2hlbiB0aGUgbmFtZSBpcyBhbWJpZ3VvdXMuXG4gKiBAcmV0dXJucyBUaGUgbGlua2VkIHR5cGUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBsaW5rQmFzZVR5cGUodHlwZU5hbWU6IHN0cmluZywgYWxsVHlwZXM6IE1hcDxzdHJpbmcsIFR5cGVJbmZvPiwgY3VycmVudE5hbWVzcGFjZT86IHN0cmluZyk6IHN0cmluZyB7XG4gIGNvbnN0IGlzU2ltcGxlVHlwZVJlZiA9IC9eW2EtekEtWl1bYS16QS1aMC05XSooPzo8Lio+KT8kLy50ZXN0KHR5cGVOYW1lLnRyaW0oKSk7XG4gIHJldHVybiBpc1NpbXBsZVR5cGVSZWYgPyBlc2NhcGVNZHhBbmdsZUJyYWNrZXRzKHJlbmRlclR5cGVXaXRoTGlua3ModHlwZU5hbWUsIGFsbFR5cGVzLCB1bmRlZmluZWQsIGN1cnJlbnROYW1lc3BhY2UpKSA6IHR5cGVMaW5rKHR5cGVOYW1lLCBhbGxUeXBlcywgY3VycmVudE5hbWVzcGFjZSk7XG59XG5cbi8qKlxuICogTG9hZHMgdGhlIFdlYiBBUEkgbGlua3MgYHR5cGVkb2MtcGx1Z2luLW1kbi1saW5rc2Agc2hpcHMsIGlmIGl0IGlzIGluc3RhbGxlZC4gV2l0aG91dCBpdCwgV2ViIEFQSSB0eXBlcyByZW5kZXJcbiAqIHVubGlua2VkLlxuICpcbiAqIEBwYXJhbSByb290RGlyZWN0b3J5IC0gVGhlIGZvbGRlciB3aG9zZSBgbm9kZV9tb2R1bGVzYCBob2xkcyB0aGUgcGFja2FnZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGxvYWRFeHRlcm5hbFR5cGVNYXBzKHJvb3REaXJlY3Rvcnk6IHN0cmluZyk6IHZvaWQge1xuICB0cnkge1xuICAgIGNvbnN0IGRhdGFQYXRoID0gam9pbihyb290RGlyZWN0b3J5LCAnbm9kZV9tb2R1bGVzL3R5cGVkb2MtcGx1Z2luLW1kbi1saW5rcy9kYXRhL3dlYi1hcGkuanNvbicpO1xuICAgIG1vZHVsZVN0YXRlLndlYkFwaVR5cGVzID0gSlNPTi5wYXJzZShyZWFkRmlsZVN5bmMoZGF0YVBhdGgsICd1dGYtOCcpKSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgICBjb25zb2xlLndhcm4oYExvYWRlZCAke1N0cmluZyhPYmplY3Qua2V5cyhtb2R1bGVTdGF0ZS53ZWJBcGlUeXBlcykubGVuZ3RoKX0gV2ViIEFQSSB0eXBlIGxpbmtzYCk7XG4gIH0gY2F0Y2gge1xuICAgIG1vZHVsZVN0YXRlLndlYkFwaVR5cGVzID0ge307XG4gICAgY29uc29sZS53YXJuKCd0eXBlZG9jLXBsdWdpbi1tZG4tbGlua3MgZGF0YSBub3QgZm91bmQg4oCUIFdlYiBBUEkgbGlua3Mgd2lsbCBiZSB1bmF2YWlsYWJsZS4nKTtcbiAgfVxufVxuXG4vKipcbiAqIENvbnZlcnQgaW5saW5lIG1hcmtkb3duIHRvIEhUTUwgZm9yIHVzZSBpbiBjb21wb25lbnQgcHJvcHMgd2l0aCBzZXQ6aHRtbFxuICpcbiAqIEBwYXJhbSB0ZXh0IC0gVGhlIHRleHQuXG4gKiBAcmV0dXJucyBUaGUgSFRNTC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG1hcmtkb3duVG9IdG1sKHRleHQ6IHN0cmluZyk6IHN0cmluZyB7XG4gIGNvbnN0IGVzY2FwZWQgPSB0ZXh0XG4gICAgLnJlcGxhY2VBbGwoJyYnLCAnJmFtcDsnKVxuICAgIC5yZXBsYWNlQWxsKCc8JywgJyZsdDsnKVxuICAgIC5yZXBsYWNlQWxsKCc+JywgJyZndDsnKTtcbiAgcmV0dXJuIHJlcGxhY2VSZWdFeHBNYXRjaGVzKGVzY2FwZWQsIC9cXFsoPzx0ZXh0PlteXFxdXSspXFxdXFwoKD88dXJsPlteKV0rKVxcKS9nLCAobWF0Y2gpID0+IHtcbiAgICBjb25zdCBsaW5rVGV4dCA9IGdldE1hbmRhdG9yeU5hbWVkR3JvdXAobWF0Y2gsICd0ZXh0Jyk7XG4gICAgY29uc3QgdXJsID0gZ2V0TWFuZGF0b3J5TmFtZWRHcm91cChtYXRjaCwgJ3VybCcpO1xuICAgIC8vIEEgcmVsYXRpdmUgVVJMIGhlcmUgaXMgYW4gaWxsdXN0cmF0aXZlIGV4YW1wbGUgcGF0aCBpbiBUU0RvYyAoZS5nLiBgW2Zvb10oZm9vLnBuZylgKSwgbm90IGFcbiAgICAvLyByZWFsIG5hdmlnYWJsZSBsaW5rIOKAlCByZW5kZXIgaXQgYXMgbGl0ZXJhbCBpbmxpbmUgY29kZSBzbyBpdCBuZWl0aGVyIDQwNHMgbm9yIGxvc2VzIG1lYW5pbmcuXG4gICAgcmV0dXJuIC9eKD86aHR0cHM/OlxcL1xcL3xcXC98I3xtYWlsdG86KS8udGVzdCh1cmwpID8gYDxhIGhyZWY9XCIke3VybH1cIj4ke2xpbmtUZXh0fTwvYT5gIDogYDxjb2RlPlske2xpbmtUZXh0fV0oJHt1cmx9KTwvY29kZT5gO1xuICB9KVxuICAgIC5yZXBsYWNlQWxsKC9gKD88Y29kZT5bXmBdKylgL2csICc8Y29kZT4kPGNvZGU+PC9jb2RlPicpXG4gICAgLnJlcGxhY2VBbGwoJ1xcbicsICc8YnIvPicpO1xufVxuXG4vKipcbiAqIEJ1aWxkIHRoZSBocmVmIGZvciBhIG1lbWJlciwgcG9pbnRpbmcgdG8gdGhlIHBhcmVudCB0eXBlJ3MgcGFnZSBpZiBpbmhlcml0ZWRcbiAqXG4gKiBAcGFyYW0gbWVtYmVyU2x1Z1N0cmluZyAtIFRoZSBtZW1iZXIncyByb3V0ZSBzZWdtZW50LlxuICogQHBhcmFtIGluaGVyaXRlZEZyb20gLSBUaGUgbmFtZSBvZiB0aGUgdHlwZSB0aGUgbWVtYmVyIGlzIGluaGVyaXRlZCBmcm9tLCBvciBhbiBlbXB0eSBzdHJpbmcgZm9yIGFuIG93biBtZW1iZXIuXG4gKiBAcGFyYW0gYWxsVHlwZXMgLSBFdmVyeSBkb2N1bWVudGVkIHR5cGUsIGtleWVkIGJ5IGAke25hbWVzcGFjZX0jJHtuYW1lfWAuXG4gKiBAcGFyYW0gY3VycmVudE5hbWVzcGFjZSAtIFRoZSBuYW1lc3BhY2Ugb2YgdGhlIHJlZmVyZW5jaW5nIHBhZ2UsIHByZWZlcnJlZCB3aGVuIHRoZSBuYW1lIGlzIGFtYmlndW91cy5cbiAqIEByZXR1cm5zIFRoZSBsaW5rLCBvciBhbiBlbXB0eSBzdHJpbmcgd2hlbiBubyBwYWdlIGRvY3VtZW50cyB0aGUgbWVtYmVyLlxuICovXG5leHBvcnQgZnVuY3Rpb24gbWVtYmVySHJlZihtZW1iZXJTbHVnU3RyaW5nOiBzdHJpbmcsIGluaGVyaXRlZEZyb206IHN0cmluZywgYWxsVHlwZXM6IE1hcDxzdHJpbmcsIFR5cGVJbmZvPiwgY3VycmVudE5hbWVzcGFjZT86IHN0cmluZyk6IHN0cmluZyB7XG4gIGlmICghaW5oZXJpdGVkRnJvbSkge1xuICAgIC8vIE93biAobm9uLWluaGVyaXRlZCkgbWVtYmVyIOKAlCBgZ2VuZXJhdGVNZW1iZXJQYWdlc2AgYWx3YXlzIGVtaXRzIGl0cyBwYWdlIG9uIHRoaXMgc2FtZSBwYWdlLlxuICAgIHJldHVybiBgLi8ke21lbWJlclNsdWdTdHJpbmd9L2A7XG4gIH1cbiAgY29uc3QgcGFyZW50SW5mbyA9IGZpbmRUeXBlKGFsbFR5cGVzLCBpbmhlcml0ZWRGcm9tLCBjdXJyZW50TmFtZXNwYWNlKTtcbiAgaWYgKCFwYXJlbnRJbmZvIHx8ICFkb2VzTWVtYmVyUGFnZUV4aXN0KHBhcmVudEluZm8ubmFtZXNwYWNlLCBwYXJlbnRJbmZvLm5hbWUsIG1lbWJlclNsdWdTdHJpbmcpKSB7XG4gICAgLy8gVGhlIGRlY2xhcmluZyBwYXJlbnQgaGFzIG5vIGdlbmVyYXRlZCBwYWdlIGZvciB0aGlzIG1lbWJlciAoaXQgaW5oZXJpdGVkIHRoZSBtZW1iZXIgdG9vLCBvciBpc1xuICAgIC8vIHVuZG9jdW1lbnRlZCkuIFJldHVybiBubyBocmVmIHNvIHRoZSBjYWxsZXIgcmVuZGVycyBwbGFpbiB0ZXh0IGluc3RlYWQgb2YgYSBicm9rZW4gbGluay5cbiAgICByZXR1cm4gJyc7XG4gIH1cbiAgY29uc3QgcGFyZW50TnNEaXJlY3RvcnkgPSBnZXROYW1lc3BhY2VEaXJlY3RvcnkocGFyZW50SW5mby5uYW1lc3BhY2UpO1xuICByZXR1cm4gYCR7Z2V0QmFzZVBhdGgoKX0vYXBpLyR7cGFyZW50TnNEaXJlY3Rvcnl9LyR7dG9UeXBlUm91dGVTZWdtZW50KHBhcmVudEluZm8ubmFtZXNwYWNlLCBwYXJlbnRJbmZvLm5hbWUpfS8ke21lbWJlclNsdWdTdHJpbmd9L2A7XG59XG5cbi8qKlxuICogUG9wdWxhdGUge0BsaW5rIGRvZXNNZW1iZXJQYWdlRXhpc3R9LiBNaXJyb3JzIGBnZW5lcmF0ZU1lbWJlclBhZ2VzYCdzIG93biBmaWx0ZXJpbmcgZXhhY3RseSAob25lIHBhZ2VcbiAqIHBlciBub24taW5oZXJpdGVkIHByb3BlcnR5LCBvbmUgcGVyIG5vbi1pbmhlcml0ZWQgbWV0aG9kIG92ZXJsb2FkIGtleSkuIE11c3QgcnVuIG9uY2UgYmVmb3JlIGFueVxuICogbGluayBpcyByZW5kZXJlZC5cbiAqXG4gKiBAcGFyYW0gdHlwZXMgLSBUaGUgZG9jdW1lbnRlZCB0eXBlcywga2V5ZWQgYnkgcXVhbGlmaWVkIGlkLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVnaXN0ZXJNZW1iZXJQYWdlcyh0eXBlczogTWFwPHN0cmluZywgVHlwZUluZm8+KTogdm9pZCB7XG4gIGdlbmVyYXRlZE1lbWJlclBhZ2VzLmNsZWFyKCk7XG4gIGZvciAoY29uc3QgaW5mbyBvZiB0eXBlcy52YWx1ZXMoKSkge1xuICAgIGZvciAoY29uc3QgcHJvcGVydHkgb2YgaW5mby5wcm9wZXJ0aWVzKSB7XG4gICAgICBpZiAoIXByb3BlcnR5LmluaGVyaXRlZEZyb20pIHtcbiAgICAgICAgZ2VuZXJhdGVkTWVtYmVyUGFnZXMuYWRkKGAke2luZm8ubmFtZXNwYWNlfSMke2luZm8ubmFtZX0jJHttZW1iZXJSb3V0ZVNlZ21lbnQocHJvcGVydHkubmFtZSl9YCk7XG4gICAgICB9XG4gICAgfVxuICAgIGNvbnN0IG92ZXJsb2FkS2V5cyA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuICAgIGZvciAoY29uc3QgbWV0aG9kIG9mIGluZm8ubWV0aG9kcykge1xuICAgICAgaWYgKCFtZXRob2QuaW5oZXJpdGVkRnJvbSkge1xuICAgICAgICBvdmVybG9hZEtleXMuYWRkKG1ldGhvZC5vdmVybG9hZEtleSk7XG4gICAgICB9XG4gICAgfVxuICAgIGZvciAoY29uc3Qgb3ZlcmxvYWRLZXkgb2Ygb3ZlcmxvYWRLZXlzKSB7XG4gICAgICBnZW5lcmF0ZWRNZW1iZXJQYWdlcy5hZGQoYCR7aW5mby5uYW1lc3BhY2V9IyR7aW5mby5uYW1lfSMke292ZXJsb2FkUm91dGVTZWdtZW50KG92ZXJsb2FkS2V5KX1gKTtcbiAgICB9XG4gIH1cbn1cblxuLyoqXG4gKiBGb3IgZXZlcnkgZG9jdW1lbnRlZCB0eXBlIGFzc2lnbiBCT1RIOlxuICogIC0gYSBsb3dlcmNhc2VkLCBudW1lcmljYWxseS1kaXNhbWJpZ3VhdGVkIEZJTEUgc2VnbWVudCAoc28gYFR5cGVBc3NlcnRlcmAgdnMgYHR5cGVBc3NlcnRlcmAsIHdoaWNoXG4gKiAgICBib3RoIGxvd2VyY2FzZSB0byBgdHlwZWFzc2VydGVyYCwgYmVjb21lIGB0eXBlYXNzZXJ0ZXJgIC8gYHR5cGVhc3NlcnRlci0yYCBvbiBkaXNrIGFuZCBuZXZlclxuICogICAgY29sbGlkZSBvbiBXaW5kb3dzJyBjYXNlLWluc2Vuc2l0aXZlIGZpbGVzeXN0ZW0pLCBhbmRcbiAqICAtIGEgY2FzZS1QUkVTRVJWRUQgUk9VVEUgc2VnbWVudCAoYFR5cGVBc3NlcnRlcmAgLyBgdHlwZUFzc2VydGVyYCkgdXNlZCBmb3IgdGhlIGV4cGxpY2l0IGBzbHVnOmBcbiAqICAgIGZyb250bWF0dGVyIGFuZCBldmVyeSBpbnRlcm5hbCBsaW5rLCBzbyB0aGUgVVJMcyBzdGF5IHByZXR0eSBhbmQgbmF0dXJhbGx5IGRpc3RpbmN0LlxuICogVGhlIHJvdXRlIGRlY291cGxlcyBmcm9tIHRoZSBmaWxlIHBhdGggdmlhIHRoZSBgc2x1ZzpgIGZyb250bWF0dGVyLCBzbyBubyBgLTJgIHN1ZmZpeCBsZWFrcyBpbnRvXG4gKiBVUkxzLiBBbHNvIHdhcm5zIGFib3V0IG1lbWJlci1zbHVnIGNvbGxpc2lvbnMgd2l0aGluIGEgdHlwZS4gTXVzdCBydW4gb25jZSBiZWZvcmUgYW55IHBhZ2UvbGluay5cbiAqXG4gKiBAcGFyYW0gdHlwZXMgLSBUaGUgZG9jdW1lbnRlZCB0eXBlcywga2V5ZWQgYnkgcXVhbGlmaWVkIGlkLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVnaXN0ZXJSb3V0ZVNlZ21lbnRzKHR5cGVzOiBNYXA8c3RyaW5nLCBUeXBlSW5mbz4pOiB2b2lkIHtcbiAgdHlwZUZpbGVTZWdtZW50cy5jbGVhcigpO1xuICB0eXBlUm91dGVTZWdtZW50cy5jbGVhcigpO1xuICBjb25zdCBieU5hbWVzcGFjZSA9IG5ldyBNYXA8c3RyaW5nLCBUeXBlSW5mb1tdPigpO1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgdW5pY29ybi9wcmVmZXItZ3JvdXAtYnkgLS0gYE1hcC5ncm91cEJ5YCBpcyBFUzIwMjQsIGFuZCB0aGUgc2hhcmVkIGB0c2NvbmZpZy5qc29uYCB0eXBlcyBvbmx5IEVTMjAyMi5cbiAgZm9yIChjb25zdCBpbmZvIG9mIHR5cGVzLnZhbHVlcygpKSB7XG4gICAgY29uc3QgbGlzdCA9IGJ5TmFtZXNwYWNlLmdldChpbmZvLm5hbWVzcGFjZSkgPz8gW107XG4gICAgbGlzdC5wdXNoKGluZm8pO1xuICAgIGJ5TmFtZXNwYWNlLnNldChpbmZvLm5hbWVzcGFjZSwgbGlzdCk7XG4gIH1cbiAgZm9yIChjb25zdCBbbmFtZXNwYWNlLCBpbmZvc10gb2YgYnlOYW1lc3BhY2UpIHtcbiAgICBjb25zdCB1c2VkRmlsZVNlZ21lbnRzID0gbmV3IFNldDxzdHJpbmc+KCk7XG4gICAgY29uc3QgdXNlZFJvdXRlU2VnbWVudHMgPSBuZXcgU2V0PHN0cmluZz4oKTtcbiAgICBjb25zdCBzb3J0ZWQgPSBbLi4uaW5mb3NdLnNvcnQoKGFscGhhLCBicmF2bykgPT4gYWxwaGEubmFtZS5sb2NhbGVDb21wYXJlKGJyYXZvLm5hbWUpKTtcbiAgICBmb3IgKGNvbnN0IGluZm8gb2Ygc29ydGVkKSB7XG4gICAgICB0eXBlRmlsZVNlZ21lbnRzLnNldChgJHtuYW1lc3BhY2V9IyR7aW5mby5uYW1lfWAsIGRpc2FtYmlndWF0ZSh0b1JvdXRlU2VnbWVudChpbmZvLm5hbWUpLCB1c2VkRmlsZVNlZ21lbnRzLCAoc2VnbWVudCkgPT4gc2VnbWVudCkpO1xuXG4gICAgICBjb25zdCByb3V0ZUJhc2UgPSB0b1JvdXRlU2VnbWVudFByZXNlcnZlQ2FzZShpbmZvLm5hbWUpO1xuICAgICAgLy8gRGlzYW1iaWd1YXRlIFJPVVRFUyBjYXNlLUlOU0VOU0lUSVZFTFk6IHRoZSBzbHVnIGJlY29tZXMgQXN0cm8ncyBvbi1kaXNrIG91dHB1dCBwYXRoLCBzb1xuICAgICAgLy8gYFR5cGVBc3NlcnRlcmAgYW5kIGB0eXBlQXNzZXJ0ZXJgIChzYW1lIG5hbWUgbW9kdWxvIGNhc2UpIHdvdWxkIGNvbGxpZGUgd2hlbiB0aGUgc2l0ZSBpcyBidWlsdFxuICAgICAgLy8gb24gYSBjYXNlLWluc2Vuc2l0aXZlIGZpbGVzeXN0ZW0gKFdpbmRvd3MvbWFjT1MpLCBzaWxlbnRseSBvdmVyd3JpdGluZyBvbmUgcGFnZSBzbyBldmVyeSBsaW5rXG4gICAgICAvLyB0byBpdCA0MDRzLiBDb21wYXJpbmcgbG93ZXJjYXNlZCBrZXlzIGZvcmNlcyB0aGUgc2Vjb25kIG9jY3VycmVuY2UgdG8gdGFrZSBhIGAtMmAgc3VmZml4LlxuICAgICAgY29uc3Qgcm91dGVTZWdtZW50ID0gZGlzYW1iaWd1YXRlKHJvdXRlQmFzZSwgdXNlZFJvdXRlU2VnbWVudHMsIChzZWdtZW50KSA9PiBzZWdtZW50LnRvTG93ZXJDYXNlKCkpO1xuICAgICAgdHlwZVJvdXRlU2VnbWVudHMuc2V0KGAke25hbWVzcGFjZX0jJHtpbmZvLm5hbWV9YCwgcm91dGVTZWdtZW50KTtcbiAgICAgIGlmIChyb3V0ZVNlZ21lbnQgIT09IHJvdXRlQmFzZSkge1xuICAgICAgICBjb25zb2xlLndhcm4oYERpc2FtYmlndWF0ZWQgUk9VVEUgZm9yIFwiJHtuYW1lc3BhY2V9IyR7aW5mby5uYW1lfVwiOiBcIiR7cm91dGVCYXNlfVwiIC0+IFwiJHtyb3V0ZVNlZ21lbnR9XCIgKHNsdWcgY29sbGlzaW9uKS5gKTtcbiAgICAgIH1cbiAgICAgIHdhcm5NZW1iZXJTbHVnQ29sbGlzaW9ucyhpbmZvLCBuYW1lc3BhY2UpO1xuICAgIH1cbiAgfVxufVxuXG4vKipcbiAqIFJlbmRlciBhbiBgQGV4YW1wbGVgIGJsb2NrIGFzIE1EWC4gSWYgdGhlIGV4YW1wbGUgYWxyZWFkeSBjb250YWlucyBhIGZlbmNlZCBjb2RlIGJsb2NrLCBpdCBpc1xuICogbm9ybWFsaXplZCB0aHJvdWdoIHtAbGluayByZW5kZXJNZHhQcm9zZX0gKGNvZGUgcHJlc2VydmVkIHJhdywgc3Vycm91bmRpbmcgcHJvc2UgZXNjYXBlZCk7XG4gKiBvdGhlcndpc2UgdGhlIHJhdyBleGFtcGxlIHRleHQgaXMgd3JhcHBlZCBpbiBhIGB0c2AgY29kZSBmZW5jZSBzbyBpdCBpcyBlbWl0dGVkIGxpdGVyYWxseS5cbiAqXG4gKiBAcGFyYW0gZXhhbXBsZSAtIFRoZSBgQGV4YW1wbGVgIHRleHQuXG4gKiBAcGFyYW0gYWxsVHlwZXMgLSBFdmVyeSBkb2N1bWVudGVkIHR5cGUsIGtleWVkIGJ5IGAke25hbWVzcGFjZX0jJHtuYW1lfWAuXG4gKiBAcGFyYW0gc2VsZk5hbWVzcGFjZSAtIFRoZSBuYW1lc3BhY2Ugb2YgdGhlIHBhZ2UgYmVpbmcgcmVuZGVyZWQsIHByZWZlcnJlZCB3aGVuIGEgbmFtZSBpcyBhbWJpZ3VvdXMuXG4gKiBAcmV0dXJucyBUaGUgTURYLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVuZGVyRXhhbXBsZU1keChleGFtcGxlOiBzdHJpbmcsIGFsbFR5cGVzOiBNYXA8c3RyaW5nLCBUeXBlSW5mbz4sIHNlbGZOYW1lc3BhY2U/OiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gLyg/Ol58XFxuKVxccyooPzpgYGB8fn5+KS8udGVzdChleGFtcGxlKSA/IHJlbmRlck1keFByb3NlKGV4YW1wbGUsIGFsbFR5cGVzLCBzZWxmTmFtZXNwYWNlKSA6IGBcXGBcXGBcXGB0c1xcbiR7ZXhhbXBsZX1cXG5cXGBcXGBcXGBgO1xufVxuXG4vKipcbiAqIFJlbmRlciBtYXJrZG93biBibG9jayB0ZXh0IChhIGRlc2NyaXB0aW9uLCByZW1hcmtzLCBvciBtb2R1bGUgb3ZlcnZpZXcpIGFzIE1EWC1zYWZlIG1hcmtkb3duLlxuICogRmVuY2VkIGNvZGUgYmxvY2tzIGFyZSByZS1lbWl0dGVkIHZlcmJhdGltIChzdXJyb3VuZGVkIGJ5IGJsYW5rIGxpbmVzLCB3aXRoIGEgbGFuZ3VhZ2UpOyBwcm9zZVxuICogc2VnbWVudHMgaGF2ZSB0aGVpciBpbmxpbmUgbGluayB0YWdzIHJlc29sdmVkIGFuZCB0aGVpciBNRFgtdW5zYWZlIGNoYXJhY3RlcnMgZXNjYXBlZC5cbiAqXG4gKiBAcGFyYW0gdGV4dCAtIFRoZSB0ZXh0LlxuICogQHBhcmFtIGFsbFR5cGVzIC0gRXZlcnkgZG9jdW1lbnRlZCB0eXBlLCBrZXllZCBieSBgJHtuYW1lc3BhY2V9IyR7bmFtZX1gLlxuICogQHBhcmFtIHNlbGZOYW1lc3BhY2UgLSBUaGUgbmFtZXNwYWNlIG9mIHRoZSBwYWdlIGJlaW5nIHJlbmRlcmVkLCBwcmVmZXJyZWQgd2hlbiBhIG5hbWUgaXMgYW1iaWd1b3VzLlxuICogQHJldHVybnMgVGhlIE1EWC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlbmRlck1keFByb3NlKHRleHQ6IHN0cmluZywgYWxsVHlwZXM6IE1hcDxzdHJpbmcsIFR5cGVJbmZvPiwgc2VsZk5hbWVzcGFjZT86IHN0cmluZyk6IHN0cmluZyB7XG4gIGNvbnN0IG91dDogc3RyaW5nW10gPSBbXTtcbiAgZm9yIChjb25zdCBzZWcgb2Ygc2VnbWVudE1hcmtkb3duKHRleHQpKSB7XG4gICAgaWYgKHNlZy50eXBlID09PSAnY29kZScpIHtcbiAgICAgIG91dC5wdXNoKCcnLCBgXFxgXFxgXFxgJHtzZWcubGFuZyB8fCAndHMnfWAsIHNlZy50ZXh0LCAnYGBgJywgJycpO1xuICAgIH0gZWxzZSB7XG4gICAgICBvdXQucHVzaChlc2NhcGVNZHhQcm9zZShyZXNvbHZlTGlua3Moc2VnLnRleHQsIGFsbFR5cGVzLCBzZWxmTmFtZXNwYWNlKSkpO1xuICAgIH1cbiAgfVxuICByZXR1cm4gb3V0LmpvaW4oJ1xcbicpLnJlcGxhY2VBbGwoL1xcbnszLH0vZywgJ1xcblxcbicpLnRyaW0oKTtcbn1cblxuLyoqXG4gKiBSZW5kZXIgYSB0eXBlIHN0cmluZyB3aXRoIGNsaWNrYWJsZSBsaW5rcyBmb3Iga25vd24gdHlwZXNcbiAqXG4gKiBAcGFyYW0gdHlwZVRleHQgLSBUaGUgdHlwZSB0ZXh0LlxuICogQHBhcmFtIGFsbFR5cGVzIC0gRXZlcnkgZG9jdW1lbnRlZCB0eXBlLCBrZXllZCBieSBgJHtuYW1lc3BhY2V9IyR7bmFtZX1gLlxuICogQHBhcmFtIHNlbGZUeXBlTmFtZSAtIFRoZSBuYW1lIG9mIHRoZSB0eXBlIHRoZSBwYWdlIGRvY3VtZW50cywgd2hpY2ggYHRoaXNgIGxpbmtzIHRvLlxuICogQHBhcmFtIHNlbGZOYW1lc3BhY2UgLSBUaGUgbmFtZXNwYWNlIG9mIHRoZSBwYWdlIGJlaW5nIHJlbmRlcmVkLCBwcmVmZXJyZWQgd2hlbiBhIG5hbWUgaXMgYW1iaWd1b3VzLlxuICogQHJldHVybnMgVGhlIHR5cGUgdGV4dCB3aXRoIG1hcmtkb3duIGxpbmtzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVuZGVyVHlwZVdpdGhMaW5rcyh0eXBlVGV4dDogc3RyaW5nLCBhbGxUeXBlczogTWFwPHN0cmluZywgVHlwZUluZm8+LCBzZWxmVHlwZU5hbWU/OiBzdHJpbmcsIHNlbGZOYW1lc3BhY2U/OiBzdHJpbmcpOiBzdHJpbmcge1xuICAvLyBQcmUtcGFzczogbGluayBPYmplY3QubWV0aG9kIHBhdHRlcm5zIHRvIE1ETiBiZWZvcmUgd29yZC1ieS13b3JkIGxpbmtpbmdcbiAgY29uc3QgTUROX09CSkVDVF9CQVNFID0gJ2h0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2RvY3MvV2ViL0phdmFTY3JpcHQvUmVmZXJlbmNlL0dsb2JhbF9PYmplY3RzL09iamVjdCc7XG4gIGNvbnN0IHdpdGhPYmplY3RNZXRob2RzID0gcmVwbGFjZVJlZ0V4cE1hdGNoZXModHlwZVRleHQsIC9cXGJPYmplY3RcXC4oPzxtZXRob2Q+W2EtekEtWl1bYS16QS1aMC05XSopXFxiL2csIChtYXRjaCkgPT4ge1xuICAgIGNvbnN0IG1ldGhvZCA9IGdldE1hbmRhdG9yeU5hbWVkR3JvdXAobWF0Y2gsICdtZXRob2QnKTtcbiAgICByZXR1cm4gYFtPYmplY3RdKCR7TUROX09CSkVDVF9CQVNFfSkuWyR7bWV0aG9kfV0oJHtNRE5fT0JKRUNUX0JBU0V9LyR7bWV0aG9kfSlgO1xuICB9KTtcbiAgLy8gTWFpbiBwYXNzOiBsaW5rIGluZGl2aWR1YWwgdHlwZSBuYW1lcywgc2tpcHBpbmcgdGV4dCBhbHJlYWR5IGluc2lkZSBtYXJrZG93biBsaW5rc1xuICByZXR1cm4gcmVwbGFjZVJlZ0V4cE1hdGNoZXMoXG4gICAgd2l0aE9iamVjdE1ldGhvZHMsXG4gICAgL1xcW1teXFxdXStcXF1cXChbXildK1xcKXxcXGIoPzx0eXBlTmFtZT5bYS16QS1aXVthLXpBLVowLTldKilcXGIvZyxcbiAgICAobWF0Y2gpID0+IHtcbiAgICAgIGNvbnN0IHR5cGVOYW1lID0gZ2V0T3B0aW9uYWxOYW1lZEdyb3VwKG1hdGNoLCAndHlwZU5hbWUnKTtcbiAgICAgIGlmICh0eXBlTmFtZSA9PT0gbnVsbCkge1xuICAgICAgICByZXR1cm4gbWF0Y2hbMF07XG4gICAgICB9XG4gICAgICAvLyBMaW5rIGB0aGlzYCByZXR1cm4gdHlwZSB0byB0aGUgY3VycmVudCB0eXBlJ3MgcGFnZVxuICAgICAgaWYgKHR5cGVOYW1lID09PSAndGhpcycgJiYgc2VsZlR5cGVOYW1lKSB7XG4gICAgICAgIGNvbnN0IHNlbGZJbmZvID0gZmluZFR5cGUoYWxsVHlwZXMsIHNlbGZUeXBlTmFtZSwgc2VsZk5hbWVzcGFjZSk7XG4gICAgICAgIGlmIChzZWxmSW5mbykge1xuICAgICAgICAgIHJldHVybiBgWyR7dHlwZU5hbWV9XSgke3R5cGVIcmVmKHNlbGZJbmZvKX0pYDtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBTa2lwIGdlbmVyaWMgdHlwZSBwYXJhbWV0ZXJzXG4gICAgICBpZiAoR0VORVJJQ19UWVBFX1BBUkFNUy5oYXModHlwZU5hbWUpKSB7XG4gICAgICAgIHJldHVybiB0eXBlTmFtZTtcbiAgICAgIH1cblxuICAgICAgLy8gQ2hlY2sgb3VyIG93biB0eXBlcyBmaXJzdFxuICAgICAgY29uc3QgaW5mbyA9IGZpbmRUeXBlKGFsbFR5cGVzLCB0eXBlTmFtZSwgc2VsZk5hbWVzcGFjZSk7XG4gICAgICBpZiAoaW5mbykge1xuICAgICAgICByZXR1cm4gYFske3R5cGVOYW1lfV0oJHt0eXBlSHJlZihpbmZvKX0pYDtcbiAgICAgIH1cblxuICAgICAgLy8gQSB0eXBlIGFub3RoZXIgZG9jdW1lbnRlZCBwYWNrYWdlIGRlY2xhcmVzLCBvciBvbmUgdGhlIHNpdGUgbWFwcyBpdHNlbGZcbiAgICAgIGNvbnN0IGV4dGVybmFsVXJsID0gcmVzb2x2ZUV4dGVybmFsVHlwZVVybCh0eXBlTmFtZSk7XG4gICAgICBpZiAoZXh0ZXJuYWxVcmwpIHtcbiAgICAgICAgcmV0dXJuIGBbJHt0eXBlTmFtZX1dKCR7ZXh0ZXJuYWxVcmx9KWA7XG4gICAgICB9XG5cbiAgICAgIC8vIFR5cGVTY3JpcHQgdXRpbGl0eSB0eXBlc1xuICAgICAgY29uc3QgdHNVcmwgPSByZXNvbHZlVHNVdGlsaXR5VXJsKHR5cGVOYW1lKTtcbiAgICAgIGlmICh0c1VybCkge1xuICAgICAgICByZXR1cm4gYFske3R5cGVOYW1lfV0oJHt0c1VybH0pYDtcbiAgICAgIH1cblxuICAgICAgLy8gSlMgZ2xvYmFsIHR5cGVzIChBcnJheSwgUHJvbWlzZSwgTWFwLCBldGMuKVxuICAgICAgY29uc3QgZ2xvYmFsVXJsID0gT2JqZWN0Lmhhc093bihUU19HTE9CQUxfVFlQRVMsIHR5cGVOYW1lKSA/IFRTX0dMT0JBTF9UWVBFU1t0eXBlTmFtZV0gOiB1bmRlZmluZWQ7XG4gICAgICBpZiAoZ2xvYmFsVXJsKSB7XG4gICAgICAgIHJldHVybiBgWyR7dHlwZU5hbWV9XSgke2dsb2JhbFVybH0pYDtcbiAgICAgIH1cblxuICAgICAgLy8gV2ViIEFQSSAvIE1ETiB0eXBlc1xuICAgICAgY29uc3QgbWRuVXJsID0gcmVzb2x2ZVdlYkFwaVVybCh0eXBlTmFtZSk7XG4gICAgICBpZiAobWRuVXJsKSB7XG4gICAgICAgIHJldHVybiBgWyR7dHlwZU5hbWV9XSgke21kblVybH0pYDtcbiAgICAgIH1cblxuICAgICAgLy8gVHlwZVNjcmlwdCBwcmltaXRpdmUgdHlwZXNcbiAgICAgIGNvbnN0IHByaW1pdGl2ZVVybCA9IE9iamVjdC5oYXNPd24oVFNfUFJJTUlUSVZFX1RZUEVTLCB0eXBlTmFtZSkgPyBUU19QUklNSVRJVkVfVFlQRVNbdHlwZU5hbWVdIDogdW5kZWZpbmVkO1xuICAgICAgcmV0dXJuIHByaW1pdGl2ZVVybCA/IGBbJHt0eXBlTmFtZX1dKCR7cHJpbWl0aXZlVXJsfSlgIDogdHlwZU5hbWU7XG4gICAgfVxuICApO1xufVxuXG4vKipcbiAqIFJlc29sdmUgYSB0eXBlIG5vIHBhZ2Ugb2YgdGhpcyBzaXRlIGRvY3VtZW50cyB0byB0aGUgcGFnZSB0aGF0IGRvZXM6IGFub3RoZXIgZG9jdW1lbnRlZCBwYWNrYWdlJ3Mgc2l0ZSwgb3IgYW5cbiAqIGVudHJ5IG9mIHRoZSBzaXRlJ3Mgb3duIGBleHRlcm5hbFR5cGVMaW5rc2Agc2V0dGluZy5cbiAqXG4gKiBAcGFyYW0gbmFtZSAtIFRoZSB0eXBlJ3MgbmFtZS5cbiAqIEByZXR1cm5zIFRoZSBVUkwsIG9yIGB1bmRlZmluZWRgIHdoZW4gbmVpdGhlciBrbm93cyB0aGUgdHlwZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlc29sdmVFeHRlcm5hbFR5cGVVcmwobmFtZTogc3RyaW5nKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgcmV0dXJuIGdldFBhY2thZ2VUeXBlVXJsKG5hbWUpID8/IGdldEFwaURvY1NldHRpbmdzKCkuZXh0ZXJuYWxUeXBlTGlua3MuZ2V0KG5hbWUpO1xufVxuXG4vKipcbiAqIFJlc29sdmUgYEBsaW5rYCB0YWdzLCB3aXRoIG9yIHdpdGhvdXQgYSBgfCBkaXNwbGF5IHRleHRgIHBhcnQsIGluIGRlc2NyaXB0aW9uIHRleHRcbiAqXG4gKiBAcGFyYW0gdGV4dCAtIFRoZSB0ZXh0LlxuICogQHBhcmFtIGFsbFR5cGVzIC0gRXZlcnkgZG9jdW1lbnRlZCB0eXBlLCBrZXllZCBieSBgJHtuYW1lc3BhY2V9IyR7bmFtZX1gLlxuICogQHBhcmFtIHNlbGZOYW1lc3BhY2UgLSBUaGUgbmFtZXNwYWNlIG9mIHRoZSBwYWdlIGJlaW5nIHJlbmRlcmVkLCBwcmVmZXJyZWQgd2hlbiBhIG5hbWUgaXMgYW1iaWd1b3VzLlxuICogQHJldHVybnMgVGhlIHRleHQgd2l0aCBtYXJrZG93biBsaW5rcy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlc29sdmVMaW5rcyh0ZXh0OiBzdHJpbmcsIGFsbFR5cGVzOiBNYXA8c3RyaW5nLCBUeXBlSW5mbz4sIHNlbGZOYW1lc3BhY2U/OiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gcmVwbGFjZVJlZ0V4cE1hdGNoZXModGV4dCwgL1xce0BsaW5rXFxzKyg/PHRhcmdldD5bXnx9XSs/KSg/OlxccypcXHxcXHMqKD88ZGlzcGxheT5bXn1dKz8pKT9cXH0vZywgKG1hdGNoKSA9PiB7XG4gICAgY29uc3QgdGFyZ2V0ID0gZ2V0TWFuZGF0b3J5TmFtZWRHcm91cChtYXRjaCwgJ3RhcmdldCcpLnRyaW0oKTtcbiAgICBjb25zdCBkaXNwbGF5ID0gKGdldE9wdGlvbmFsTmFtZWRHcm91cChtYXRjaCwgJ2Rpc3BsYXknKT8udHJpbSgpID8/IHRhcmdldCkucmVwbGFjZUFsbCgvXFxcXCg/PVs8Pnt9XSkvZywgJycpO1xuXG4gICAgLy8gSGFuZGxlIFR5cGUubWVtYmVyIHJlZmVyZW5jZXMgKGUuZy4sIFBsdWdpbk5vdGljZUNvbXBvbmVudC5zaG93Tm90aWNlKVxuICAgIGNvbnN0IGRvdE1hdGNoID0gL14oPzx0eXBlTmFtZT5bQS1aYS16XVxcdyopXFwuKD88bWVtYmVyTmFtZT5cXHcrKSQvLmV4ZWModGFyZ2V0KTtcbiAgICBpZiAoZG90TWF0Y2gpIHtcbiAgICAgIGNvbnN0IHR5cGVOYW1lID0gZ2V0TWFuZGF0b3J5TmFtZWRHcm91cChkb3RNYXRjaCwgJ3R5cGVOYW1lJyk7XG4gICAgICBjb25zdCBtZW1iZXJOYW1lID0gZ2V0TWFuZGF0b3J5TmFtZWRHcm91cChkb3RNYXRjaCwgJ21lbWJlck5hbWUnKTtcbiAgICAgIGNvbnN0IHR5cGVJbmZvID0gZmluZFR5cGUoYWxsVHlwZXMsIHR5cGVOYW1lLCBzZWxmTmFtZXNwYWNlKTtcbiAgICAgIGlmICh0eXBlSW5mbyAmJiBkb2VzTWVtYmVyUGFnZUV4aXN0KHR5cGVJbmZvLm5hbWVzcGFjZSwgdHlwZUluZm8ubmFtZSwgbWVtYmVyUm91dGVTZWdtZW50KG1lbWJlck5hbWUpKSkge1xuICAgICAgICBjb25zdCB0YXJnZXROc0RpcmVjdG9yeSA9IGdldE5hbWVzcGFjZURpcmVjdG9yeSh0eXBlSW5mby5uYW1lc3BhY2UpO1xuICAgICAgICByZXR1cm4gYFske2Rpc3BsYXl9XSgke2dldEJhc2VQYXRoKCl9L2FwaS8ke3RhcmdldE5zRGlyZWN0b3J5fS8ke3RvVHlwZVJvdXRlU2VnbWVudCh0eXBlSW5mby5uYW1lc3BhY2UsIHR5cGVJbmZvLm5hbWUpfS8ke21lbWJlclJvdXRlU2VnbWVudChtZW1iZXJOYW1lKX0vKWA7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gSGFuZGxlIHNpbXBsZSB0eXBlIHJlZmVyZW5jZXMg4oCUIGlmIGRpc3BsYXkgY29udGFpbnMgZ2VuZXJpYyBhcmdzLCBsaW5rIGVhY2ggdHlwZSBpbmRpdmlkdWFsbHlcbiAgICBjb25zdCBpbmZvID0gZmluZFR5cGUoYWxsVHlwZXMsIHRhcmdldCwgc2VsZk5hbWVzcGFjZSk7XG4gICAgaWYgKGluZm8pIHtcbiAgICAgIHJldHVybiBkaXNwbGF5ICE9PSB0YXJnZXQgJiYgZGlzcGxheS5pbmNsdWRlcygnPCcpID8gcmVuZGVyVHlwZVdpdGhMaW5rcyhkaXNwbGF5LCBhbGxUeXBlcywgdW5kZWZpbmVkLCBzZWxmTmFtZXNwYWNlKSA6IGBbJHtkaXNwbGF5fV0oJHt0eXBlSHJlZihpbmZvKX0pYDtcbiAgICB9XG5cbiAgICBjb25zdCBleHRlcm5hbFVybCA9IHJlc29sdmVFeHRlcm5hbFR5cGVVcmwodGFyZ2V0KTtcbiAgICByZXR1cm4gZXh0ZXJuYWxVcmwgPyBgWyR7ZGlzcGxheX1dKCR7ZXh0ZXJuYWxVcmx9KWAgOiBgXFxgJHtkaXNwbGF5fVxcYGA7XG4gIH0pO1xufVxuXG4vKipcbiAqIFJlc29sdmVzIGEgVHlwZVNjcmlwdCB1dGlsaXR5IHR5cGUgdG8gaXRzIGhhbmRib29rIGVudHJ5LlxuICpcbiAqIEBwYXJhbSBuYW1lIC0gVGhlIHR5cGUncyBuYW1lLlxuICogQHJldHVybnMgVGhlIGhhbmRib29rIFVSTCwgb3IgYHVuZGVmaW5lZGAgd2hlbiBpdCBpcyBub3QgYSB1dGlsaXR5IHR5cGUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZXNvbHZlVHNVdGlsaXR5VXJsKG5hbWU6IHN0cmluZyk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IGhhc2ggPSBUU19VVElMSVRZX1RZUEVTLmdldChuYW1lKTtcbiAgaWYgKGhhc2gpIHtcbiAgICBpZiAoWydJdGVyYWJsZSddLmluY2x1ZGVzKG5hbWUpKSB7XG4gICAgICByZXR1cm4gYGh0dHBzOi8vd3d3LnR5cGVzY3JpcHRsYW5nLm9yZy9kb2NzL2hhbmRib29rL2l0ZXJhdG9ycy1hbmQtZ2VuZXJhdG9ycy5odG1sIyR7aGFzaH1gO1xuICAgIH1cbiAgICBjb25zdCBoYW5kYm9va1BhZ2UgPSBbJ0NhcGl0YWxpemUnLCAnTG93ZXJjYXNlJywgJ1VuY2FwaXRhbGl6ZScsICdVcHBlcmNhc2UnXS5pbmNsdWRlcyhuYW1lKSA/ICcyL3RlbXBsYXRlLWxpdGVyYWwtdHlwZXMnIDogJ3V0aWxpdHktdHlwZXMnOyAvLyBDc3BlbGw6ZGlzYWJsZS1saW5lXG4gICAgcmV0dXJuIGBodHRwczovL3d3dy50eXBlc2NyaXB0bGFuZy5vcmcvZG9jcy9oYW5kYm9vay8ke2hhbmRib29rUGFnZX0uaHRtbCMke2hhc2h9YDtcbiAgfVxuICByZXR1cm4gdW5kZWZpbmVkO1xufVxuXG4vKipcbiAqIFJlc29sdmVzIGEgV2ViIEFQSSB0eXBlIHRvIGl0cyBNRE4gcGFnZS5cbiAqXG4gKiBAcGFyYW0gbmFtZSAtIFRoZSB0eXBlJ3MgbmFtZS5cbiAqIEByZXR1cm5zIFRoZSBNRE4gVVJMLCBvciBgdW5kZWZpbmVkYCB3aGVuIGl0IGlzIG5vdCBhIGtub3duIFdlYiBBUEkgdHlwZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlc29sdmVXZWJBcGlVcmwobmFtZTogc3RyaW5nKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgaWYgKCFPYmplY3QuaGFzT3duKG1vZHVsZVN0YXRlLndlYkFwaVR5cGVzLCBuYW1lKSkge1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cbiAgY29uc3QgZW50cnkgPSBtb2R1bGVTdGF0ZS53ZWJBcGlUeXBlc1tuYW1lXTtcbiAgaWYgKHR5cGVvZiBlbnRyeSA9PT0gJ3N0cmluZycpIHtcbiAgICByZXR1cm4gZW50cnk7XG4gIH1cbiAgaWYgKHR5cGVvZiBlbnRyeSA9PT0gJ29iamVjdCcgJiYgZW50cnkgIT09IG51bGwgJiYgJ3VybCcgaW4gZW50cnkpIHtcbiAgICBjb25zdCB0eXBlZEVudHJ5ID0gZW50cnkgYXMgV2ViQXBpRW50cnk7XG4gICAgcmV0dXJuIHR5cGVkRW50cnkudXJsO1xuICB9XG4gIHJldHVybiB1bmRlZmluZWQ7XG59XG5cbi8qKlxuICogUmVzb2x2ZSB0aGUgbG93ZXJjYXNlZCBPTi1ESVNLIHNlZ21lbnQgZm9yIGEgdHlwZSAoZmlsZSBwYXRoICsgY29tcG9uZW50LWltcG9ydCByZWxhdGl2ZSBwYXRoKS5cbiAqXG4gKiBAcGFyYW0gbmFtZXNwYWNlIC0gVGhlIHR5cGUncyBuYW1lc3BhY2UuXG4gKiBAcGFyYW0gbmFtZSAtIFRoZSB0eXBlJ3MgbmFtZS5cbiAqIEByZXR1cm5zIFRoZSBzZWdtZW50LlxuICovXG5leHBvcnQgZnVuY3Rpb24gdG9UeXBlRmlsZVNlZ21lbnQobmFtZXNwYWNlOiBzdHJpbmcsIG5hbWU6IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiB0eXBlRmlsZVNlZ21lbnRzLmdldChgJHtuYW1lc3BhY2V9IyR7bmFtZX1gKSA/PyB0b1JvdXRlU2VnbWVudChuYW1lKTtcbn1cblxuLyoqXG4gKiBSZXNvbHZlIHRoZSBjYXNlLXByZXNlcnZlZCBVUkwvUk9VVEUgc2VnbWVudCBmb3IgYSB0eXBlIChzbHVnIGZyb250bWF0dGVyICsgaW50ZXJuYWwgbGlua3MpLlxuICpcbiAqIEBwYXJhbSBuYW1lc3BhY2UgLSBUaGUgdHlwZSdzIG5hbWVzcGFjZS5cbiAqIEBwYXJhbSBuYW1lIC0gVGhlIHR5cGUncyBuYW1lLlxuICogQHJldHVybnMgVGhlIHNlZ21lbnQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB0b1R5cGVSb3V0ZVNlZ21lbnQobmFtZXNwYWNlOiBzdHJpbmcsIG5hbWU6IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiB0eXBlUm91dGVTZWdtZW50cy5nZXQoYCR7bmFtZXNwYWNlfSMke25hbWV9YCkgPz8gdG9Sb3V0ZVNlZ21lbnRQcmVzZXJ2ZUNhc2UobmFtZSk7XG59XG5cbi8qKlxuICogQWJzb2x1dGUgbGluayB0byBhIHR5cGUncyBvdmVydmlldyBwYWdlLlxuICpcbiAqIEBwYXJhbSBpbmZvIC0gVGhlIGRvY3VtZW50ZWQgdHlwZS5cbiAqIEByZXR1cm5zIFRoZSBsaW5rLlxuICovXG5leHBvcnQgZnVuY3Rpb24gdHlwZUhyZWYoaW5mbzogVHlwZUluZm8pOiBzdHJpbmcge1xuICByZXR1cm4gYCR7Z2V0QmFzZVBhdGgoKX0vYXBpLyR7Z2V0TmFtZXNwYWNlRGlyZWN0b3J5KGluZm8ubmFtZXNwYWNlKX0vJHt0b1R5cGVSb3V0ZVNlZ21lbnQoaW5mby5uYW1lc3BhY2UsIGluZm8ubmFtZSl9L2A7XG59XG5cbi8qKlxuICogQ3JlYXRlIGFuIGFic29sdXRlIGxpbmsgdG8gYSB0eXBlIHBhZ2VcbiAqXG4gKiBAcGFyYW0gdHlwZU5hbWUgLSBUaGUgdHlwZSdzIG5hbWUuXG4gKiBAcGFyYW0gYWxsVHlwZXMgLSBFdmVyeSBkb2N1bWVudGVkIHR5cGUsIGtleWVkIGJ5IGAke25hbWVzcGFjZX0jJHtuYW1lfWAuXG4gKiBAcGFyYW0gY3VycmVudE5hbWVzcGFjZSAtIFRoZSBuYW1lc3BhY2Ugb2YgdGhlIHJlZmVyZW5jaW5nIHBhZ2UsIHByZWZlcnJlZCB3aGVuIHRoZSBuYW1lIGlzIGFtYmlndW91cy5cbiAqIEByZXR1cm5zIEEgbWFya2Rvd24gbGluaywgb3IgaW5saW5lIGNvZGUgd2hlbiB0aGUgdHlwZSBpcyBub3QgZG9jdW1lbnRlZC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHR5cGVMaW5rKHR5cGVOYW1lOiBzdHJpbmcsIGFsbFR5cGVzOiBNYXA8c3RyaW5nLCBUeXBlSW5mbz4sIGN1cnJlbnROYW1lc3BhY2U/OiBzdHJpbmcpOiBzdHJpbmcge1xuICBjb25zdCBjbGVhbk5hbWUgPSB0eXBlTmFtZS5yZXBsYWNlKC88Lio+JC8sICcnKS50cmltKCk7XG4gIGNvbnN0IGluZm8gPSBmaW5kVHlwZShhbGxUeXBlcywgY2xlYW5OYW1lLCBjdXJyZW50TmFtZXNwYWNlKTtcbiAgcmV0dXJuIGluZm8gPyBgWyR7ZXNjYXBlTWR4QW5nbGVCcmFja2V0cyh0eXBlTmFtZSl9XSgke3R5cGVIcmVmKGluZm8pfSlgIDogYFxcYCR7dHlwZU5hbWV9XFxgYDtcbn1cblxuZnVuY3Rpb24gZGlzYW1iaWd1YXRlKGJhc2U6IHN0cmluZywgdXNlZDogU2V0PHN0cmluZz4sIGtleU9mOiAoc2VnbWVudDogc3RyaW5nKSA9PiBzdHJpbmcpOiBzdHJpbmcge1xuICBsZXQgc2VnbWVudCA9IGJhc2U7XG4gIGNvbnN0IEZJUlNUX0RJU0FNQklHVUFUSU9OX1NVRkZJWCA9IDI7XG4gIGxldCBzdWZmaXggPSBGSVJTVF9ESVNBTUJJR1VBVElPTl9TVUZGSVg7XG4gIHdoaWxlICh1c2VkLmhhcyhrZXlPZihzZWdtZW50KSkpIHtcbiAgICBzZWdtZW50ID0gYCR7YmFzZX0tJHtTdHJpbmcoc3VmZml4KX1gO1xuICAgIHN1ZmZpeCsrO1xuICB9XG4gIHVzZWQuYWRkKGtleU9mKHNlZ21lbnQpKTtcbiAgcmV0dXJuIHNlZ21lbnQ7XG59XG5cbmZ1bmN0aW9uIGdldEJhc2VQYXRoKCk6IHN0cmluZyB7XG4gIHJldHVybiBnZXRBcGlEb2NTZXR0aW5ncygpLmJhc2VQYXRoO1xufVxuXG4vKipcbiAqIFdhcm4gd2hlbiB0d28gZGlzdGluY3QgbWVtYmVycyBvZiBhIHR5cGUgcHJvZHVjZSB0aGUgc2FtZSBtZW1iZXIgc2x1ZyAoVVJML2ZpbGUgc2VnbWVudCkuIFRoZVxuICogb3B0aW9uYWwtYD9gIHN1ZmZpeCBpcyBzdHJpcHBlZCBmaXJzdCwgc28gYSBwcm9wZXJ0eSBhcHBlYXJpbmcgYXMgYm90aCByZXF1aXJlZCBhbmQgb3B0aW9uYWwgaXMgbm90XG4gKiBhIGZhbHNlIHBvc2l0aXZlLlxuICpcbiAqIEBwYXJhbSBpbmZvIC0gVGhlIHR5cGUuXG4gKiBAcGFyYW0gbmFtZXNwYWNlIC0gVGhlIHR5cGUncyBuYW1lc3BhY2UuXG4gKi9cbmZ1bmN0aW9uIHdhcm5NZW1iZXJTbHVnQ29sbGlzaW9ucyhpbmZvOiBUeXBlSW5mbywgbmFtZXNwYWNlOiBzdHJpbmcpOiB2b2lkIHtcbiAgY29uc3Qgc2VlbiA9IG5ldyBNYXA8c3RyaW5nLCBzdHJpbmc+KCk7XG4gIGZ1bmN0aW9uIGNoZWNrKHNsdWc6IHN0cmluZywgb3JpZ2luYWw6IHN0cmluZyk6IHZvaWQge1xuICAgIGNvbnN0IG5vcm1hbGl6ZWQgPSBvcmlnaW5hbC5yZXBsYWNlKC9cXD8kLywgJycpO1xuICAgIGNvbnN0IGV4aXN0aW5nID0gc2Vlbi5nZXQoc2x1Zyk7XG4gICAgaWYgKGV4aXN0aW5nICE9PSB1bmRlZmluZWQgJiYgZXhpc3RpbmcgIT09IG5vcm1hbGl6ZWQpIHtcbiAgICAgIGNvbnNvbGUud2FybihgTWVtYmVyIHJvdXRlIGNvbGxpc2lvbiBpbiBcIiR7bmFtZXNwYWNlfSMke2luZm8ubmFtZX1cIjogXCIke2V4aXN0aW5nfVwiIGFuZCBcIiR7bm9ybWFsaXplZH1cIiBib3RoIG1hcCB0byBcIi8ke3NsdWd9L1wiLmApO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBzZWVuLnNldChzbHVnLCBub3JtYWxpemVkKTtcbiAgfVxuICBmb3IgKGNvbnN0IHByb3BlcnR5IG9mIGluZm8ucHJvcGVydGllcykge1xuICAgIGNoZWNrKG1lbWJlclNsdWcocHJvcGVydHkubmFtZSksIHByb3BlcnR5Lm5hbWUpO1xuICB9XG4gIGZvciAoY29uc3QgbWV0aG9kIG9mIGluZm8ubWV0aG9kcykge1xuICAgIGNoZWNrKG92ZXJsb2FkU2x1ZyhtZXRob2Qub3ZlcmxvYWRLZXkpLCBtZXRob2Qub3ZlcmxvYWRLZXkpO1xuICB9XG59XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQU9BLHFCQUdPO0FBQ1AscUJBQTZCO0FB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
386
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9kb2NzLXNpdGUvYXBpLWRvYy1saW5rLXJlbmRlcmluZy50cyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBmaWxlXG4gKlxuICogVHlwZS1saW5rIHJlbmRlcmluZzogdHVybnMgdHlwZSB0ZXh0IGFuZCBpbmxpbmUgbGluayB0YWdzIGludG8gbWFya2Rvd24gbGlua3MgdG8gZ2VuZXJhdGVkIHBhZ2VzXG4gKiBvciBleHRlcm5hbCByZWZlcmVuY2VzIChUeXBlU2NyaXB0IGhhbmRib29rLCBNRE4gV2ViIEFQSSwgSlMgZ2xvYmFscykuXG4gKi9cblxuaW1wb3J0IHtcbiAgZ2V0TWFuZGF0b3J5TmFtZWRHcm91cCxcbiAgZ2V0T3B0aW9uYWxOYW1lZEdyb3VwXG59IGZyb20gJ0BtbmFvdW1vdi90eXBlc2NyaXB0LWxpYi9yZWctZXhwJztcbmltcG9ydCB7IHJlYWRGaWxlU3luYyB9IGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHsgam9pbiB9IGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCB0eXBlIHtcbiAgVHlwZUluZm8sXG4gIFdlYkFwaUVudHJ5XG59IGZyb20gJy4vYXBpLWRvYy10eXBlcy50cyc7XG5cbmltcG9ydCB7XG4gIEdFTkVSSUNfVFlQRV9QQVJBTVMsXG4gIFRTX0dMT0JBTF9UWVBFUyxcbiAgVFNfUFJJTUlUSVZFX1RZUEVTLFxuICBUU19VVElMSVRZX1RZUEVTXG59IGZyb20gJy4vYXBpLWRvYy1jb25zdGFudHMudHMnO1xuaW1wb3J0IHsgZ2V0UGFja2FnZVR5cGVVcmwgfSBmcm9tICcuL2FwaS1kb2MtcGFja2FnZS1zaXRlcy50cyc7XG5pbXBvcnQge1xuICB0b1JvdXRlU2VnbWVudCxcbiAgdG9Sb3V0ZVNlZ21lbnRQcmVzZXJ2ZUNhc2Vcbn0gZnJvbSAnLi9hcGktZG9jLXJvdXRlLXNlZ21lbnRzLnRzJztcbmltcG9ydCB7IGdldEFwaURvY1NldHRpbmdzIH0gZnJvbSAnLi9hcGktZG9jLXNldHRpbmdzLnRzJztcbmltcG9ydCB7XG4gIGVzY2FwZU1keEFuZ2xlQnJhY2tldHMsXG4gIGVzY2FwZU1keFByb3NlLFxuICBnZXROYW1lc3BhY2VEaXJlY3RvcnksXG4gIG1lbWJlclJvdXRlU2VnbWVudCxcbiAgbWVtYmVyU2x1ZyxcbiAgb3ZlcmxvYWRSb3V0ZVNlZ21lbnQsXG4gIG92ZXJsb2FkU2x1ZyxcbiAgcmVwbGFjZVJlZ0V4cE1hdGNoZXMsXG4gIHNlZ21lbnRNYXJrZG93blxufSBmcm9tICcuL2FwaS1kb2MtdGV4dC11dGlscy50cyc7XG5cbi8qKlxuTG9hZGVkIGZyb20gdHlwZWRvYy1wbHVnaW4tbWRuLWxpbmtzIGRhdGEgYXQgcnVudGltZVxuICovXG4vKipcbk1vZHVsZS1sZXZlbCBtdXRhYmxlIHN0YXRlLCBoZWxkIGluIG9uZSBvYmplY3Qgc28gZWFjaCBtdXRhdGlvbiBuYW1lcyBpdCBleHBsaWNpdGx5LlxuICovXG5pbnRlcmZhY2UgTW9kdWxlU3RhdGUge1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgdHlwZXNjcmlwdC1kZXYtdG9vbGtpdC9yZWFkb25seS1pbnRlcmZhY2UtbWVtYmVycyAtLSBUaGUgV2ViIEFQSSBtZXRhZGF0YSBjYWNoZSBpcyByZXBsYWNlZCBhZnRlciBsb2FkaW5nLlxuICB3ZWJBcGlUeXBlczogUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG59XG5cbmNvbnN0IG1vZHVsZVN0YXRlOiBNb2R1bGVTdGF0ZSA9IHtcbiAgd2ViQXBpVHlwZXM6IHt9XG59O1xuLyoqXG5Mb3dlcmNhc2VkLCBjb2xsaXNpb24tZGlzYW1iaWd1YXRlZCBPTi1ESVNLIHNlZ21lbnQgcGVyIHF1YWxpZmllZCB0eXBlIGtleSAoYCR7bmFtZXNwYWNlfSMke25hbWV9YCkuXG4gKi9cbmNvbnN0IHR5cGVGaWxlU2VnbWVudHMgPSBuZXcgTWFwPHN0cmluZywgc3RyaW5nPigpO1xuLyoqXG5DYXNlLXByZXNlcnZlZCBVUkwvcm91dGUgc2VnbWVudCBwZXIgcXVhbGlmaWVkIHR5cGUga2V5IChgJHtuYW1lc3BhY2V9IyR7bmFtZX1gKS5cbiAqL1xuY29uc3QgdHlwZVJvdXRlU2VnbWVudHMgPSBuZXcgTWFwPHN0cmluZywgc3RyaW5nPigpO1xuXG4vKipcbiAqIFJvdXRlLXNlZ21lbnQga2V5cyBvZiB0aGUgbWVtYmVyIHBhZ2VzIHRoYXQgYGdlbmVyYXRlTWVtYmVyUGFnZXNgIHdpbGwgYWN0dWFsbHkgZW1pdCwgYXNcbiAqIGAke25hbWVzcGFjZX0jJHtUeXBlTmFtZX0jJHtyb3V0ZVNlZ21lbnR9YC4gT25seSBOT04taW5oZXJpdGVkIHByb3BlcnRpZXMgYW5kIG5vbi1pbmhlcml0ZWQgbWV0aG9kXG4gKiBvdmVybG9hZCBrZXlzIGdldCBhIHBhZ2UsIHNvIHRoaXMgbGV0cyBsaW5rIGVtaXR0ZXJzIGF2b2lkIHBvaW50aW5nIGF0IGEgbWVtYmVyIHBhZ2UgdGhhdCBpcyBuZXZlclxuICogZ2VuZXJhdGVkIChhbiBpbmhlcml0ZWQgbWVtYmVyLCBhbiBlbnVtIG1lbWJlciwgYW4gb3B0aW9ucy1pbnRlcmZhY2UgbWVtYmVyKSDigJQgd2hpY2ggd291bGQgNDA0LlxuICovXG5jb25zdCBnZW5lcmF0ZWRNZW1iZXJQYWdlcyA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuXG4vKipcbiAqIFdoZXRoZXIgYSBtZW1iZXIgcGFnZSB3aWxsIGJlIGdlbmVyYXRlZCBmb3IgYHJvdXRlU2VnbWVudGAgb24gdGhlIGdpdmVuIHR5cGUuXG4gKlxuICogQHBhcmFtIG5hbWVzcGFjZSAtIFRoZSB0eXBlJ3MgbmFtZXNwYWNlLlxuICogQHBhcmFtIHR5cGVOYW1lIC0gVGhlIHR5cGUncyBuYW1lLlxuICogQHBhcmFtIHJvdXRlU2VnbWVudCAtIFRoZSBtZW1iZXIncyByb3V0ZSBzZWdtZW50LlxuICogQHJldHVybnMgV2hldGhlciB0aGUgcGFnZSBpcyBnZW5lcmF0ZWQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBkb2VzTWVtYmVyUGFnZUV4aXN0KG5hbWVzcGFjZTogc3RyaW5nLCB0eXBlTmFtZTogc3RyaW5nLCByb3V0ZVNlZ21lbnQ6IHN0cmluZyk6IGJvb2xlYW4ge1xuICByZXR1cm4gZ2VuZXJhdGVkTWVtYmVyUGFnZXMuaGFzKGAke25hbWVzcGFjZX0jJHt0eXBlTmFtZX0jJHtyb3V0ZVNlZ21lbnR9YCk7XG59XG5cbi8qKlxuICogUmVzb2x2ZSBhIGJhcmUgdHlwZSBuYW1lIHRvIGEgZG9jdW1lbnRlZCBgVHlwZUluZm9gLlxuICpcbiAqIFRoZSBtb2RlbCBtYXAgaXMga2V5ZWQgYnkgYSBxdWFsaWZpZWQgYCR7bmFtZXNwYWNlfSMke25hbWV9YCBpZGVudGl0eSwgYmVjYXVzZSBhIHBhY2thZ2VcbiAqIGNhbiBleHBvcnQgdGhlIHNhbWUgc2ltcGxlIG5hbWUgZnJvbSBkaWZmZXJlbnQgbW9kdWxlcy4gUmVzb2x1dGlvbiBpcyBiZXN0LWVmZm9ydDpcbiAqICAgMS4gUHJlZmVyIGEgdHlwZSBpbiBgY3VycmVudE5hbWVzcGFjZWAgKHRoZSByZWZlcmVuY2luZyBwYWdlJ3MgbW9kdWxlKS5cbiAqICAgMi4gT3RoZXJ3aXNlLCBpZiBleGFjdGx5IG9uZSB0eXBlIGFjcm9zcyBhbGwgbW9kdWxlcyBoYXMgdGhhdCBiYXJlIG5hbWUsIHVzZSBpdC5cbiAqICAgMy4gSWYgdGhlIGJhcmUgbmFtZSBpcyBhbWJpZ3VvdXMgKG11bHRpcGxlIG1vZHVsZXMpLCBnaXZlIHVwIChjYWxsZXIgcmVuZGVycyBwbGFpbiBjb2RlKS5cbiAqXG4gKiBAcGFyYW0gYWxsVHlwZXMgLSBFdmVyeSBkb2N1bWVudGVkIHR5cGUsIGtleWVkIGJ5IGAke25hbWVzcGFjZX0jJHtuYW1lfWAuXG4gKiBAcGFyYW0gbmFtZSAtIFRoZSB0eXBlJ3MgbmFtZS5cbiAqIEBwYXJhbSBjdXJyZW50TmFtZXNwYWNlIC0gVGhlIG5hbWVzcGFjZSBvZiB0aGUgcmVmZXJlbmNpbmcgcGFnZSwgcHJlZmVycmVkIHdoZW4gdGhlIG5hbWUgaXMgYW1iaWd1b3VzLlxuICogQHJldHVybnMgVGhlIHR5cGUsIG9yIGB1bmRlZmluZWRgIHdoZW4gbm8gdHlwZSBvciBtb3JlIHRoYW4gb25lIGhhcyB0aGF0IG5hbWUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBmaW5kVHlwZShhbGxUeXBlczogTWFwPHN0cmluZywgVHlwZUluZm8+LCBuYW1lOiBzdHJpbmcsIGN1cnJlbnROYW1lc3BhY2U/OiBzdHJpbmcpOiBUeXBlSW5mbyB8IHVuZGVmaW5lZCB7XG4gIGlmIChjdXJyZW50TmFtZXNwYWNlICE9PSB1bmRlZmluZWQpIHtcbiAgICBjb25zdCBxdWFsaWZpZWQgPSBhbGxUeXBlcy5nZXQoYCR7Y3VycmVudE5hbWVzcGFjZX0jJHtuYW1lfWApO1xuICAgIGlmIChxdWFsaWZpZWQpIHtcbiAgICAgIHJldHVybiBxdWFsaWZpZWQ7XG4gICAgfVxuICB9XG4gIGxldCBmb3VuZDogVHlwZUluZm8gfCB1bmRlZmluZWQ7XG4gIGxldCBtYXRjaENvdW50ID0gMDtcbiAgZm9yIChjb25zdCBpbmZvIG9mIGFsbFR5cGVzLnZhbHVlcygpKSB7XG4gICAgaWYgKGluZm8ubmFtZSAhPT0gbmFtZSkge1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgZm91bmQgPSBpbmZvO1xuICAgIG1hdGNoQ291bnQrKztcbiAgICBpZiAobWF0Y2hDb3VudCA+IDEpIHtcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuICB9XG4gIHJldHVybiBtYXRjaENvdW50ID09PSAxID8gZm91bmQgOiB1bmRlZmluZWQ7XG59XG5cbi8qKlxuICogTGluayBhIGJhc2UgdHlwZSBleHByZXNzaW9uIGZvciB0aGUgXCJFeHRlbmRzOlwiIGxpbmUuXG4gKiBTaW1wbGUgdHlwZSByZWZlcmVuY2VzIChpZGVudGlmaWVyICsgb3B0aW9uYWwgZ2VuZXJpY3MpIHVzZSByZW5kZXJUeXBlV2l0aExpbmtzXG4gKiBzbyBlYWNoIHR5cGUgYXJndW1lbnQgZ2V0cyBpdHMgb3duIGxpbmsuXG4gKiBDb21wbGV4IGV4cHJlc3Npb25zIChvYmplY3QgdHlwZXMsIGludGVyc2VjdGlvbnMsIGV0Yy4pIGZhbGwgYmFjayB0byB0eXBlTGlua1xuICogdG8gYXZvaWQgTURYIHBhcnNpbmcgaXNzdWVzIHdpdGggYHtgLCBgfWAsIGB8YCBldGMuXG4gKlxuICogQHBhcmFtIHR5cGVOYW1lIC0gVGhlIHR5cGUncyBuYW1lLlxuICogQHBhcmFtIGFsbFR5cGVzIC0gRXZlcnkgZG9jdW1lbnRlZCB0eXBlLCBrZXllZCBieSBgJHtuYW1lc3BhY2V9IyR7bmFtZX1gLlxuICogQHBhcmFtIGN1cnJlbnROYW1lc3BhY2UgLSBUaGUgbmFtZXNwYWNlIG9mIHRoZSByZWZlcmVuY2luZyBwYWdlLCBwcmVmZXJyZWQgd2hlbiB0aGUgbmFtZSBpcyBhbWJpZ3VvdXMuXG4gKiBAcmV0dXJucyBUaGUgbGlua2VkIHR5cGUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBsaW5rQmFzZVR5cGUodHlwZU5hbWU6IHN0cmluZywgYWxsVHlwZXM6IE1hcDxzdHJpbmcsIFR5cGVJbmZvPiwgY3VycmVudE5hbWVzcGFjZT86IHN0cmluZyk6IHN0cmluZyB7XG4gIGNvbnN0IGlzU2ltcGxlVHlwZVJlZiA9IC9eW2EtekEtWl1bYS16QS1aMC05XSooPzo8Lio+KT8kLy50ZXN0KHR5cGVOYW1lLnRyaW0oKSk7XG4gIHJldHVybiBpc1NpbXBsZVR5cGVSZWYgPyBlc2NhcGVNZHhBbmdsZUJyYWNrZXRzKHJlbmRlclR5cGVXaXRoTGlua3ModHlwZU5hbWUsIGFsbFR5cGVzLCB1bmRlZmluZWQsIGN1cnJlbnROYW1lc3BhY2UpKSA6IHR5cGVMaW5rKHR5cGVOYW1lLCBhbGxUeXBlcywgY3VycmVudE5hbWVzcGFjZSk7XG59XG5cbi8qKlxuICogTG9hZHMgdGhlIFdlYiBBUEkgbGlua3MgYHR5cGVkb2MtcGx1Z2luLW1kbi1saW5rc2Agc2hpcHMsIGlmIGl0IGlzIGluc3RhbGxlZC4gV2l0aG91dCBpdCwgV2ViIEFQSSB0eXBlcyByZW5kZXJcbiAqIHVubGlua2VkLlxuICpcbiAqIEBwYXJhbSByb290RGlyZWN0b3J5IC0gVGhlIGZvbGRlciB3aG9zZSBgbm9kZV9tb2R1bGVzYCBob2xkcyB0aGUgcGFja2FnZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGxvYWRFeHRlcm5hbFR5cGVNYXBzKHJvb3REaXJlY3Rvcnk6IHN0cmluZyk6IHZvaWQge1xuICB0cnkge1xuICAgIGNvbnN0IGRhdGFQYXRoID0gam9pbihyb290RGlyZWN0b3J5LCAnbm9kZV9tb2R1bGVzL3R5cGVkb2MtcGx1Z2luLW1kbi1saW5rcy9kYXRhL3dlYi1hcGkuanNvbicpO1xuICAgIG1vZHVsZVN0YXRlLndlYkFwaVR5cGVzID0gSlNPTi5wYXJzZShyZWFkRmlsZVN5bmMoZGF0YVBhdGgsICd1dGYtOCcpKSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgICBjb25zb2xlLndhcm4oYExvYWRlZCAke1N0cmluZyhPYmplY3Qua2V5cyhtb2R1bGVTdGF0ZS53ZWJBcGlUeXBlcykubGVuZ3RoKX0gV2ViIEFQSSB0eXBlIGxpbmtzYCk7XG4gIH0gY2F0Y2gge1xuICAgIG1vZHVsZVN0YXRlLndlYkFwaVR5cGVzID0ge307XG4gICAgY29uc29sZS53YXJuKCd0eXBlZG9jLXBsdWdpbi1tZG4tbGlua3MgZGF0YSBub3QgZm91bmQg4oCUIFdlYiBBUEkgbGlua3Mgd2lsbCBiZSB1bmF2YWlsYWJsZS4nKTtcbiAgfVxufVxuXG4vKipcbiAqIENvbnZlcnQgaW5saW5lIG1hcmtkb3duIHRvIEhUTUwgZm9yIHVzZSBpbiBjb21wb25lbnQgcHJvcHMgd2l0aCBzZXQ6aHRtbFxuICpcbiAqIEBwYXJhbSB0ZXh0IC0gVGhlIHRleHQuXG4gKiBAcmV0dXJucyBUaGUgSFRNTC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG1hcmtkb3duVG9IdG1sKHRleHQ6IHN0cmluZyk6IHN0cmluZyB7XG4gIGNvbnN0IGVzY2FwZWQgPSB0ZXh0XG4gICAgLnJlcGxhY2VBbGwoJyYnLCAnJmFtcDsnKVxuICAgIC5yZXBsYWNlQWxsKCc8JywgJyZsdDsnKVxuICAgIC5yZXBsYWNlQWxsKCc+JywgJyZndDsnKTtcbiAgcmV0dXJuIHJlcGxhY2VSZWdFeHBNYXRjaGVzKGVzY2FwZWQsIC9cXFsoPzx0ZXh0PlteXFxdXSspXFxdXFwoKD88dXJsPlteKV0rKVxcKS9nLCAobWF0Y2gpID0+IHtcbiAgICBjb25zdCBsaW5rVGV4dCA9IGdldE1hbmRhdG9yeU5hbWVkR3JvdXAobWF0Y2gsICd0ZXh0Jyk7XG4gICAgY29uc3QgdXJsID0gZ2V0TWFuZGF0b3J5TmFtZWRHcm91cChtYXRjaCwgJ3VybCcpO1xuICAgIC8vIEEgcmVsYXRpdmUgVVJMIGhlcmUgaXMgYW4gaWxsdXN0cmF0aXZlIGV4YW1wbGUgcGF0aCBpbiBUU0RvYyAoZS5nLiBgW2Zvb10oZm9vLnBuZylgKSwgbm90IGFcbiAgICAvLyByZWFsIG5hdmlnYWJsZSBsaW5rIOKAlCByZW5kZXIgaXQgYXMgbGl0ZXJhbCBpbmxpbmUgY29kZSBzbyBpdCBuZWl0aGVyIDQwNHMgbm9yIGxvc2VzIG1lYW5pbmcuXG4gICAgcmV0dXJuIC9eKD86aHR0cHM/OlxcL1xcL3xcXC98I3xtYWlsdG86KS8udGVzdCh1cmwpID8gYDxhIGhyZWY9XCIke3VybH1cIj4ke2xpbmtUZXh0fTwvYT5gIDogYDxjb2RlPlske2xpbmtUZXh0fV0oJHt1cmx9KTwvY29kZT5gO1xuICB9KVxuICAgIC5yZXBsYWNlQWxsKC9gKD88Y29kZT5bXmBdKylgL2csICc8Y29kZT4kPGNvZGU+PC9jb2RlPicpXG4gICAgLnJlcGxhY2VBbGwoJ1xcbicsICc8YnIvPicpO1xufVxuXG4vKipcbiAqIEJ1aWxkIHRoZSBocmVmIGZvciBhIG1lbWJlciwgcG9pbnRpbmcgdG8gdGhlIHBhcmVudCB0eXBlJ3MgcGFnZSBpZiBpbmhlcml0ZWRcbiAqXG4gKiBAcGFyYW0gbWVtYmVyU2x1Z1N0cmluZyAtIFRoZSBtZW1iZXIncyByb3V0ZSBzZWdtZW50LlxuICogQHBhcmFtIGluaGVyaXRlZEZyb20gLSBUaGUgbmFtZSBvZiB0aGUgdHlwZSB0aGUgbWVtYmVyIGlzIGluaGVyaXRlZCBmcm9tLCBvciBhbiBlbXB0eSBzdHJpbmcgZm9yIGFuIG93biBtZW1iZXIuXG4gKiBAcGFyYW0gYWxsVHlwZXMgLSBFdmVyeSBkb2N1bWVudGVkIHR5cGUsIGtleWVkIGJ5IGAke25hbWVzcGFjZX0jJHtuYW1lfWAuXG4gKiBAcGFyYW0gY3VycmVudE5hbWVzcGFjZSAtIFRoZSBuYW1lc3BhY2Ugb2YgdGhlIHJlZmVyZW5jaW5nIHBhZ2UsIHByZWZlcnJlZCB3aGVuIHRoZSBuYW1lIGlzIGFtYmlndW91cy5cbiAqIEByZXR1cm5zIFRoZSBsaW5rLCBvciBhbiBlbXB0eSBzdHJpbmcgd2hlbiBubyBwYWdlIGRvY3VtZW50cyB0aGUgbWVtYmVyLlxuICovXG5leHBvcnQgZnVuY3Rpb24gbWVtYmVySHJlZihtZW1iZXJTbHVnU3RyaW5nOiBzdHJpbmcsIGluaGVyaXRlZEZyb206IHN0cmluZywgYWxsVHlwZXM6IE1hcDxzdHJpbmcsIFR5cGVJbmZvPiwgY3VycmVudE5hbWVzcGFjZT86IHN0cmluZyk6IHN0cmluZyB7XG4gIGlmICghaW5oZXJpdGVkRnJvbSkge1xuICAgIC8vIE93biAobm9uLWluaGVyaXRlZCkgbWVtYmVyIOKAlCBgZ2VuZXJhdGVNZW1iZXJQYWdlc2AgYWx3YXlzIGVtaXRzIGl0cyBwYWdlIG9uIHRoaXMgc2FtZSBwYWdlLlxuICAgIHJldHVybiBgLi8ke21lbWJlclNsdWdTdHJpbmd9L2A7XG4gIH1cbiAgbGV0IHBhcmVudEluZm8gPSBmaW5kVHlwZShhbGxUeXBlcywgaW5oZXJpdGVkRnJvbSwgY3VycmVudE5hbWVzcGFjZSk7XG4gIGNvbnN0IHZpc2l0ZWQgPSBuZXcgU2V0PFR5cGVJbmZvPigpO1xuICB3aGlsZSAocGFyZW50SW5mbyAmJiAhZG9lc01lbWJlclBhZ2VFeGlzdChwYXJlbnRJbmZvLm5hbWVzcGFjZSwgcGFyZW50SW5mby5uYW1lLCBtZW1iZXJTbHVnU3RyaW5nKSkge1xuICAgIGlmICh2aXNpdGVkLmhhcyhwYXJlbnRJbmZvKSkge1xuICAgICAgcmV0dXJuICcnO1xuICAgIH1cbiAgICB2aXNpdGVkLmFkZChwYXJlbnRJbmZvKTtcbiAgICBjb25zdCBtZW1iZXIgPSBwYXJlbnRJbmZvLnByb3BlcnRpZXMuZmluZCgocHJvcGVydHkpID0+IG1lbWJlclJvdXRlU2VnbWVudChwcm9wZXJ0eS5uYW1lKSA9PT0gbWVtYmVyU2x1Z1N0cmluZylcbiAgICAgID8/IHBhcmVudEluZm8ubWV0aG9kcy5maW5kKChtZXRob2QpID0+IG92ZXJsb2FkUm91dGVTZWdtZW50KG1ldGhvZC5vdmVybG9hZEtleSkgPT09IG1lbWJlclNsdWdTdHJpbmcpO1xuICAgIHBhcmVudEluZm8gPSBtZW1iZXI/LmluaGVyaXRlZEZyb20gPyBmaW5kVHlwZShhbGxUeXBlcywgbWVtYmVyLmluaGVyaXRlZEZyb20sIHBhcmVudEluZm8ubmFtZXNwYWNlKSA6IHVuZGVmaW5lZDtcbiAgfVxuICBpZiAoIXBhcmVudEluZm8gfHwgIWRvZXNNZW1iZXJQYWdlRXhpc3QocGFyZW50SW5mby5uYW1lc3BhY2UsIHBhcmVudEluZm8ubmFtZSwgbWVtYmVyU2x1Z1N0cmluZykpIHtcbiAgICAvLyBBbiB1bmRvY3VtZW50ZWQgb3IgYW1iaWd1b3VzIGFuY2VzdG9yIGhhcyBubyBzYWZlIG1lbWJlciBkZXN0aW5hdGlvbi5cbiAgICByZXR1cm4gJyc7XG4gIH1cbiAgY29uc3QgcGFyZW50TnNEaXJlY3RvcnkgPSBnZXROYW1lc3BhY2VEaXJlY3RvcnkocGFyZW50SW5mby5uYW1lc3BhY2UpO1xuICByZXR1cm4gYCR7Z2V0QmFzZVBhdGgoKX0vYXBpLyR7cGFyZW50TnNEaXJlY3Rvcnl9LyR7dG9UeXBlUm91dGVTZWdtZW50KHBhcmVudEluZm8ubmFtZXNwYWNlLCBwYXJlbnRJbmZvLm5hbWUpfS8ke21lbWJlclNsdWdTdHJpbmd9L2A7XG59XG5cbi8qKlxuICogUG9wdWxhdGUge0BsaW5rIGRvZXNNZW1iZXJQYWdlRXhpc3R9LiBNaXJyb3JzIGBnZW5lcmF0ZU1lbWJlclBhZ2VzYCdzIG93biBmaWx0ZXJpbmcgZXhhY3RseSAob25lIHBhZ2VcbiAqIHBlciBub24taW5oZXJpdGVkIHByb3BlcnR5LCBvbmUgcGVyIG5vbi1pbmhlcml0ZWQgbWV0aG9kIG92ZXJsb2FkIGtleSkuIE11c3QgcnVuIG9uY2UgYmVmb3JlIGFueVxuICogbGluayBpcyByZW5kZXJlZC5cbiAqXG4gKiBAcGFyYW0gdHlwZXMgLSBUaGUgZG9jdW1lbnRlZCB0eXBlcywga2V5ZWQgYnkgcXVhbGlmaWVkIGlkLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVnaXN0ZXJNZW1iZXJQYWdlcyh0eXBlczogTWFwPHN0cmluZywgVHlwZUluZm8+KTogdm9pZCB7XG4gIGdlbmVyYXRlZE1lbWJlclBhZ2VzLmNsZWFyKCk7XG4gIGZvciAoY29uc3QgaW5mbyBvZiB0eXBlcy52YWx1ZXMoKSkge1xuICAgIGZvciAoY29uc3QgcHJvcGVydHkgb2YgaW5mby5wcm9wZXJ0aWVzKSB7XG4gICAgICBpZiAoIXByb3BlcnR5LmluaGVyaXRlZEZyb20pIHtcbiAgICAgICAgZ2VuZXJhdGVkTWVtYmVyUGFnZXMuYWRkKGAke2luZm8ubmFtZXNwYWNlfSMke2luZm8ubmFtZX0jJHttZW1iZXJSb3V0ZVNlZ21lbnQocHJvcGVydHkubmFtZSl9YCk7XG4gICAgICB9XG4gICAgfVxuICAgIGNvbnN0IG92ZXJsb2FkS2V5cyA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuICAgIGZvciAoY29uc3QgbWV0aG9kIG9mIGluZm8ubWV0aG9kcykge1xuICAgICAgaWYgKCFtZXRob2QuaW5oZXJpdGVkRnJvbSkge1xuICAgICAgICBvdmVybG9hZEtleXMuYWRkKG1ldGhvZC5vdmVybG9hZEtleSk7XG4gICAgICB9XG4gICAgfVxuICAgIGZvciAoY29uc3Qgb3ZlcmxvYWRLZXkgb2Ygb3ZlcmxvYWRLZXlzKSB7XG4gICAgICBnZW5lcmF0ZWRNZW1iZXJQYWdlcy5hZGQoYCR7aW5mby5uYW1lc3BhY2V9IyR7aW5mby5uYW1lfSMke292ZXJsb2FkUm91dGVTZWdtZW50KG92ZXJsb2FkS2V5KX1gKTtcbiAgICB9XG4gIH1cbn1cblxuLyoqXG4gKiBGb3IgZXZlcnkgZG9jdW1lbnRlZCB0eXBlIGFzc2lnbiBCT1RIOlxuICogIC0gYSBsb3dlcmNhc2VkLCBudW1lcmljYWxseS1kaXNhbWJpZ3VhdGVkIEZJTEUgc2VnbWVudCAoc28gYFR5cGVBc3NlcnRlcmAgdnMgYHR5cGVBc3NlcnRlcmAsIHdoaWNoXG4gKiAgICBib3RoIGxvd2VyY2FzZSB0byBgdHlwZWFzc2VydGVyYCwgYmVjb21lIGB0eXBlYXNzZXJ0ZXJgIC8gYHR5cGVhc3NlcnRlci0yYCBvbiBkaXNrIGFuZCBuZXZlclxuICogICAgY29sbGlkZSBvbiBXaW5kb3dzJyBjYXNlLWluc2Vuc2l0aXZlIGZpbGVzeXN0ZW0pLCBhbmRcbiAqICAtIGEgY2FzZS1QUkVTRVJWRUQgUk9VVEUgc2VnbWVudCAoYFR5cGVBc3NlcnRlcmAgLyBgdHlwZUFzc2VydGVyYCkgdXNlZCBmb3IgdGhlIGV4cGxpY2l0IGBzbHVnOmBcbiAqICAgIGZyb250bWF0dGVyIGFuZCBldmVyeSBpbnRlcm5hbCBsaW5rLCBzbyB0aGUgVVJMcyBzdGF5IHByZXR0eSBhbmQgbmF0dXJhbGx5IGRpc3RpbmN0LlxuICogVGhlIHJvdXRlIGRlY291cGxlcyBmcm9tIHRoZSBmaWxlIHBhdGggdmlhIHRoZSBgc2x1ZzpgIGZyb250bWF0dGVyLCBzbyBubyBgLTJgIHN1ZmZpeCBsZWFrcyBpbnRvXG4gKiBVUkxzLiBBbHNvIHdhcm5zIGFib3V0IG1lbWJlci1zbHVnIGNvbGxpc2lvbnMgd2l0aGluIGEgdHlwZS4gTXVzdCBydW4gb25jZSBiZWZvcmUgYW55IHBhZ2UvbGluay5cbiAqXG4gKiBAcGFyYW0gdHlwZXMgLSBUaGUgZG9jdW1lbnRlZCB0eXBlcywga2V5ZWQgYnkgcXVhbGlmaWVkIGlkLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVnaXN0ZXJSb3V0ZVNlZ21lbnRzKHR5cGVzOiBNYXA8c3RyaW5nLCBUeXBlSW5mbz4pOiB2b2lkIHtcbiAgdHlwZUZpbGVTZWdtZW50cy5jbGVhcigpO1xuICB0eXBlUm91dGVTZWdtZW50cy5jbGVhcigpO1xuICBjb25zdCBieU5hbWVzcGFjZSA9IG5ldyBNYXA8c3RyaW5nLCBUeXBlSW5mb1tdPigpO1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgdW5pY29ybi9wcmVmZXItZ3JvdXAtYnkgLS0gYE1hcC5ncm91cEJ5YCBpcyBFUzIwMjQsIGFuZCB0aGUgc2hhcmVkIGB0c2NvbmZpZy5qc29uYCB0eXBlcyBvbmx5IEVTMjAyMi5cbiAgZm9yIChjb25zdCBpbmZvIG9mIHR5cGVzLnZhbHVlcygpKSB7XG4gICAgY29uc3QgbGlzdCA9IGJ5TmFtZXNwYWNlLmdldChpbmZvLm5hbWVzcGFjZSkgPz8gW107XG4gICAgbGlzdC5wdXNoKGluZm8pO1xuICAgIGJ5TmFtZXNwYWNlLnNldChpbmZvLm5hbWVzcGFjZSwgbGlzdCk7XG4gIH1cbiAgZm9yIChjb25zdCBbbmFtZXNwYWNlLCBpbmZvc10gb2YgYnlOYW1lc3BhY2UpIHtcbiAgICBjb25zdCB1c2VkRmlsZVNlZ21lbnRzID0gbmV3IFNldDxzdHJpbmc+KCk7XG4gICAgY29uc3QgdXNlZFJvdXRlU2VnbWVudHMgPSBuZXcgU2V0PHN0cmluZz4oKTtcbiAgICBjb25zdCBzb3J0ZWQgPSBbLi4uaW5mb3NdLnNvcnQoKGFscGhhLCBicmF2bykgPT4gYWxwaGEubmFtZS5sb2NhbGVDb21wYXJlKGJyYXZvLm5hbWUpKTtcbiAgICBmb3IgKGNvbnN0IGluZm8gb2Ygc29ydGVkKSB7XG4gICAgICB0eXBlRmlsZVNlZ21lbnRzLnNldChgJHtuYW1lc3BhY2V9IyR7aW5mby5uYW1lfWAsIGRpc2FtYmlndWF0ZSh0b1JvdXRlU2VnbWVudChpbmZvLm5hbWUpLCB1c2VkRmlsZVNlZ21lbnRzLCAoc2VnbWVudCkgPT4gc2VnbWVudCkpO1xuXG4gICAgICBjb25zdCByb3V0ZUJhc2UgPSB0b1JvdXRlU2VnbWVudFByZXNlcnZlQ2FzZShpbmZvLm5hbWUpO1xuICAgICAgLy8gRGlzYW1iaWd1YXRlIFJPVVRFUyBjYXNlLUlOU0VOU0lUSVZFTFk6IHRoZSBzbHVnIGJlY29tZXMgQXN0cm8ncyBvbi1kaXNrIG91dHB1dCBwYXRoLCBzb1xuICAgICAgLy8gYFR5cGVBc3NlcnRlcmAgYW5kIGB0eXBlQXNzZXJ0ZXJgIChzYW1lIG5hbWUgbW9kdWxvIGNhc2UpIHdvdWxkIGNvbGxpZGUgd2hlbiB0aGUgc2l0ZSBpcyBidWlsdFxuICAgICAgLy8gb24gYSBjYXNlLWluc2Vuc2l0aXZlIGZpbGVzeXN0ZW0gKFdpbmRvd3MvbWFjT1MpLCBzaWxlbnRseSBvdmVyd3JpdGluZyBvbmUgcGFnZSBzbyBldmVyeSBsaW5rXG4gICAgICAvLyB0byBpdCA0MDRzLiBDb21wYXJpbmcgbG93ZXJjYXNlZCBrZXlzIGZvcmNlcyB0aGUgc2Vjb25kIG9jY3VycmVuY2UgdG8gdGFrZSBhIGAtMmAgc3VmZml4LlxuICAgICAgY29uc3Qgcm91dGVTZWdtZW50ID0gZGlzYW1iaWd1YXRlKHJvdXRlQmFzZSwgdXNlZFJvdXRlU2VnbWVudHMsIChzZWdtZW50KSA9PiBzZWdtZW50LnRvTG93ZXJDYXNlKCkpO1xuICAgICAgdHlwZVJvdXRlU2VnbWVudHMuc2V0KGAke25hbWVzcGFjZX0jJHtpbmZvLm5hbWV9YCwgcm91dGVTZWdtZW50KTtcbiAgICAgIGlmIChyb3V0ZVNlZ21lbnQgIT09IHJvdXRlQmFzZSkge1xuICAgICAgICBjb25zb2xlLndhcm4oYERpc2FtYmlndWF0ZWQgUk9VVEUgZm9yIFwiJHtuYW1lc3BhY2V9IyR7aW5mby5uYW1lfVwiOiBcIiR7cm91dGVCYXNlfVwiIC0+IFwiJHtyb3V0ZVNlZ21lbnR9XCIgKHNsdWcgY29sbGlzaW9uKS5gKTtcbiAgICAgIH1cbiAgICAgIHdhcm5NZW1iZXJTbHVnQ29sbGlzaW9ucyhpbmZvLCBuYW1lc3BhY2UpO1xuICAgIH1cbiAgfVxufVxuXG4vKipcbiAqIFJlbmRlciBhbiBgQGV4YW1wbGVgIGJsb2NrIGFzIE1EWC4gSWYgdGhlIGV4YW1wbGUgYWxyZWFkeSBjb250YWlucyBhIGZlbmNlZCBjb2RlIGJsb2NrLCBpdCBpc1xuICogbm9ybWFsaXplZCB0aHJvdWdoIHtAbGluayByZW5kZXJNZHhQcm9zZX0gKGNvZGUgcHJlc2VydmVkIHJhdywgc3Vycm91bmRpbmcgcHJvc2UgZXNjYXBlZCk7XG4gKiBvdGhlcndpc2UgdGhlIHJhdyBleGFtcGxlIHRleHQgaXMgd3JhcHBlZCBpbiBhIGB0c2AgY29kZSBmZW5jZSBzbyBpdCBpcyBlbWl0dGVkIGxpdGVyYWxseS5cbiAqXG4gKiBAcGFyYW0gZXhhbXBsZSAtIFRoZSBgQGV4YW1wbGVgIHRleHQuXG4gKiBAcGFyYW0gYWxsVHlwZXMgLSBFdmVyeSBkb2N1bWVudGVkIHR5cGUsIGtleWVkIGJ5IGAke25hbWVzcGFjZX0jJHtuYW1lfWAuXG4gKiBAcGFyYW0gc2VsZk5hbWVzcGFjZSAtIFRoZSBuYW1lc3BhY2Ugb2YgdGhlIHBhZ2UgYmVpbmcgcmVuZGVyZWQsIHByZWZlcnJlZCB3aGVuIGEgbmFtZSBpcyBhbWJpZ3VvdXMuXG4gKiBAcmV0dXJucyBUaGUgTURYLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVuZGVyRXhhbXBsZU1keChleGFtcGxlOiBzdHJpbmcsIGFsbFR5cGVzOiBNYXA8c3RyaW5nLCBUeXBlSW5mbz4sIHNlbGZOYW1lc3BhY2U/OiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gLyg/Ol58XFxuKVxccyooPzpgYGB8fn5+KS8udGVzdChleGFtcGxlKSA/IHJlbmRlck1keFByb3NlKGV4YW1wbGUsIGFsbFR5cGVzLCBzZWxmTmFtZXNwYWNlKSA6IGBcXGBcXGBcXGB0c1xcbiR7ZXhhbXBsZX1cXG5cXGBcXGBcXGBgO1xufVxuXG4vKipcbiAqIFJlbmRlciBtYXJrZG93biBibG9jayB0ZXh0IChhIGRlc2NyaXB0aW9uLCByZW1hcmtzLCBvciBtb2R1bGUgb3ZlcnZpZXcpIGFzIE1EWC1zYWZlIG1hcmtkb3duLlxuICogRmVuY2VkIGNvZGUgYmxvY2tzIGFyZSByZS1lbWl0dGVkIHZlcmJhdGltIChzdXJyb3VuZGVkIGJ5IGJsYW5rIGxpbmVzLCB3aXRoIGEgbGFuZ3VhZ2UpOyBwcm9zZVxuICogc2VnbWVudHMgaGF2ZSB0aGVpciBpbmxpbmUgbGluayB0YWdzIHJlc29sdmVkIGFuZCB0aGVpciBNRFgtdW5zYWZlIGNoYXJhY3RlcnMgZXNjYXBlZC5cbiAqXG4gKiBAcGFyYW0gdGV4dCAtIFRoZSB0ZXh0LlxuICogQHBhcmFtIGFsbFR5cGVzIC0gRXZlcnkgZG9jdW1lbnRlZCB0eXBlLCBrZXllZCBieSBgJHtuYW1lc3BhY2V9IyR7bmFtZX1gLlxuICogQHBhcmFtIHNlbGZOYW1lc3BhY2UgLSBUaGUgbmFtZXNwYWNlIG9mIHRoZSBwYWdlIGJlaW5nIHJlbmRlcmVkLCBwcmVmZXJyZWQgd2hlbiBhIG5hbWUgaXMgYW1iaWd1b3VzLlxuICogQHJldHVybnMgVGhlIE1EWC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlbmRlck1keFByb3NlKHRleHQ6IHN0cmluZywgYWxsVHlwZXM6IE1hcDxzdHJpbmcsIFR5cGVJbmZvPiwgc2VsZk5hbWVzcGFjZT86IHN0cmluZyk6IHN0cmluZyB7XG4gIGNvbnN0IG91dDogc3RyaW5nW10gPSBbXTtcbiAgZm9yIChjb25zdCBzZWcgb2Ygc2VnbWVudE1hcmtkb3duKHRleHQpKSB7XG4gICAgaWYgKHNlZy50eXBlID09PSAnY29kZScpIHtcbiAgICAgIG91dC5wdXNoKCcnLCBgXFxgXFxgXFxgJHtzZWcubGFuZyB8fCAndHMnfWAsIHNlZy50ZXh0LCAnYGBgJywgJycpO1xuICAgIH0gZWxzZSB7XG4gICAgICBvdXQucHVzaChlc2NhcGVNZHhQcm9zZShyZXNvbHZlTGlua3Moc2VnLnRleHQsIGFsbFR5cGVzLCBzZWxmTmFtZXNwYWNlKSkpO1xuICAgIH1cbiAgfVxuICByZXR1cm4gb3V0LmpvaW4oJ1xcbicpLnJlcGxhY2VBbGwoL1xcbnszLH0vZywgJ1xcblxcbicpLnRyaW0oKTtcbn1cblxuLyoqXG4gKiBSZW5kZXIgYSB0eXBlIHN0cmluZyB3aXRoIGNsaWNrYWJsZSBsaW5rcyBmb3Iga25vd24gdHlwZXNcbiAqXG4gKiBAcGFyYW0gdHlwZVRleHQgLSBUaGUgdHlwZSB0ZXh0LlxuICogQHBhcmFtIGFsbFR5cGVzIC0gRXZlcnkgZG9jdW1lbnRlZCB0eXBlLCBrZXllZCBieSBgJHtuYW1lc3BhY2V9IyR7bmFtZX1gLlxuICogQHBhcmFtIHNlbGZUeXBlTmFtZSAtIFRoZSBuYW1lIG9mIHRoZSB0eXBlIHRoZSBwYWdlIGRvY3VtZW50cywgd2hpY2ggYHRoaXNgIGxpbmtzIHRvLlxuICogQHBhcmFtIHNlbGZOYW1lc3BhY2UgLSBUaGUgbmFtZXNwYWNlIG9mIHRoZSBwYWdlIGJlaW5nIHJlbmRlcmVkLCBwcmVmZXJyZWQgd2hlbiBhIG5hbWUgaXMgYW1iaWd1b3VzLlxuICogQHJldHVybnMgVGhlIHR5cGUgdGV4dCB3aXRoIG1hcmtkb3duIGxpbmtzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVuZGVyVHlwZVdpdGhMaW5rcyh0eXBlVGV4dDogc3RyaW5nLCBhbGxUeXBlczogTWFwPHN0cmluZywgVHlwZUluZm8+LCBzZWxmVHlwZU5hbWU/OiBzdHJpbmcsIHNlbGZOYW1lc3BhY2U/OiBzdHJpbmcpOiBzdHJpbmcge1xuICAvLyBQcmUtcGFzczogbGluayBPYmplY3QubWV0aG9kIHBhdHRlcm5zIHRvIE1ETiBiZWZvcmUgd29yZC1ieS13b3JkIGxpbmtpbmdcbiAgY29uc3QgTUROX09CSkVDVF9CQVNFID0gJ2h0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2RvY3MvV2ViL0phdmFTY3JpcHQvUmVmZXJlbmNlL0dsb2JhbF9PYmplY3RzL09iamVjdCc7XG4gIGNvbnN0IHdpdGhPYmplY3RNZXRob2RzID0gcmVwbGFjZVJlZ0V4cE1hdGNoZXModHlwZVRleHQsIC9cXGJPYmplY3RcXC4oPzxtZXRob2Q+W2EtekEtWl1bYS16QS1aMC05XSopXFxiL2csIChtYXRjaCkgPT4ge1xuICAgIGNvbnN0IG1ldGhvZCA9IGdldE1hbmRhdG9yeU5hbWVkR3JvdXAobWF0Y2gsICdtZXRob2QnKTtcbiAgICByZXR1cm4gYFtPYmplY3RdKCR7TUROX09CSkVDVF9CQVNFfSkuWyR7bWV0aG9kfV0oJHtNRE5fT0JKRUNUX0JBU0V9LyR7bWV0aG9kfSlgO1xuICB9KTtcbiAgLy8gTWFpbiBwYXNzOiBsaW5rIGluZGl2aWR1YWwgdHlwZSBuYW1lcywgc2tpcHBpbmcgdGV4dCBhbHJlYWR5IGluc2lkZSBtYXJrZG93biBsaW5rc1xuICByZXR1cm4gcmVwbGFjZVJlZ0V4cE1hdGNoZXMoXG4gICAgd2l0aE9iamVjdE1ldGhvZHMsXG4gICAgL1xcW1teXFxdXStcXF1cXChbXildK1xcKXxcXGIoPzx0eXBlTmFtZT5bYS16QS1aXVthLXpBLVowLTldKilcXGIvZyxcbiAgICAobWF0Y2gpID0+IHtcbiAgICAgIGNvbnN0IHR5cGVOYW1lID0gZ2V0T3B0aW9uYWxOYW1lZEdyb3VwKG1hdGNoLCAndHlwZU5hbWUnKTtcbiAgICAgIGlmICh0eXBlTmFtZSA9PT0gbnVsbCkge1xuICAgICAgICByZXR1cm4gbWF0Y2hbMF07XG4gICAgICB9XG4gICAgICAvLyBMaW5rIGB0aGlzYCByZXR1cm4gdHlwZSB0byB0aGUgY3VycmVudCB0eXBlJ3MgcGFnZVxuICAgICAgaWYgKHR5cGVOYW1lID09PSAndGhpcycgJiYgc2VsZlR5cGVOYW1lKSB7XG4gICAgICAgIGNvbnN0IHNlbGZJbmZvID0gZmluZFR5cGUoYWxsVHlwZXMsIHNlbGZUeXBlTmFtZSwgc2VsZk5hbWVzcGFjZSk7XG4gICAgICAgIGlmIChzZWxmSW5mbykge1xuICAgICAgICAgIHJldHVybiBgWyR7dHlwZU5hbWV9XSgke3R5cGVIcmVmKHNlbGZJbmZvKX0pYDtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBTa2lwIGdlbmVyaWMgdHlwZSBwYXJhbWV0ZXJzXG4gICAgICBpZiAoR0VORVJJQ19UWVBFX1BBUkFNUy5oYXModHlwZU5hbWUpKSB7XG4gICAgICAgIHJldHVybiB0eXBlTmFtZTtcbiAgICAgIH1cblxuICAgICAgLy8gQ2hlY2sgb3VyIG93biB0eXBlcyBmaXJzdFxuICAgICAgY29uc3QgaW5mbyA9IGZpbmRUeXBlKGFsbFR5cGVzLCB0eXBlTmFtZSwgc2VsZk5hbWVzcGFjZSk7XG4gICAgICBpZiAoaW5mbykge1xuICAgICAgICByZXR1cm4gYFske3R5cGVOYW1lfV0oJHt0eXBlSHJlZihpbmZvKX0pYDtcbiAgICAgIH1cblxuICAgICAgLy8gQSB0eXBlIGFub3RoZXIgZG9jdW1lbnRlZCBwYWNrYWdlIGRlY2xhcmVzLCBvciBvbmUgdGhlIHNpdGUgbWFwcyBpdHNlbGZcbiAgICAgIGNvbnN0IGV4dGVybmFsVXJsID0gcmVzb2x2ZUV4dGVybmFsVHlwZVVybCh0eXBlTmFtZSk7XG4gICAgICBpZiAoZXh0ZXJuYWxVcmwpIHtcbiAgICAgICAgcmV0dXJuIGBbJHt0eXBlTmFtZX1dKCR7ZXh0ZXJuYWxVcmx9KWA7XG4gICAgICB9XG5cbiAgICAgIC8vIFR5cGVTY3JpcHQgdXRpbGl0eSB0eXBlc1xuICAgICAgY29uc3QgdHNVcmwgPSByZXNvbHZlVHNVdGlsaXR5VXJsKHR5cGVOYW1lKTtcbiAgICAgIGlmICh0c1VybCkge1xuICAgICAgICByZXR1cm4gYFske3R5cGVOYW1lfV0oJHt0c1VybH0pYDtcbiAgICAgIH1cblxuICAgICAgLy8gSlMgZ2xvYmFsIHR5cGVzIChBcnJheSwgUHJvbWlzZSwgTWFwLCBldGMuKVxuICAgICAgY29uc3QgZ2xvYmFsVXJsID0gT2JqZWN0Lmhhc093bihUU19HTE9CQUxfVFlQRVMsIHR5cGVOYW1lKSA/IFRTX0dMT0JBTF9UWVBFU1t0eXBlTmFtZV0gOiB1bmRlZmluZWQ7XG4gICAgICBpZiAoZ2xvYmFsVXJsKSB7XG4gICAgICAgIHJldHVybiBgWyR7dHlwZU5hbWV9XSgke2dsb2JhbFVybH0pYDtcbiAgICAgIH1cblxuICAgICAgLy8gV2ViIEFQSSAvIE1ETiB0eXBlc1xuICAgICAgY29uc3QgbWRuVXJsID0gcmVzb2x2ZVdlYkFwaVVybCh0eXBlTmFtZSk7XG4gICAgICBpZiAobWRuVXJsKSB7XG4gICAgICAgIHJldHVybiBgWyR7dHlwZU5hbWV9XSgke21kblVybH0pYDtcbiAgICAgIH1cblxuICAgICAgLy8gVHlwZVNjcmlwdCBwcmltaXRpdmUgdHlwZXNcbiAgICAgIGNvbnN0IHByaW1pdGl2ZVVybCA9IE9iamVjdC5oYXNPd24oVFNfUFJJTUlUSVZFX1RZUEVTLCB0eXBlTmFtZSkgPyBUU19QUklNSVRJVkVfVFlQRVNbdHlwZU5hbWVdIDogdW5kZWZpbmVkO1xuICAgICAgcmV0dXJuIHByaW1pdGl2ZVVybCA/IGBbJHt0eXBlTmFtZX1dKCR7cHJpbWl0aXZlVXJsfSlgIDogdHlwZU5hbWU7XG4gICAgfVxuICApO1xufVxuXG4vKipcbiAqIFJlc29sdmUgYSB0eXBlIG5vIHBhZ2Ugb2YgdGhpcyBzaXRlIGRvY3VtZW50cyB0byB0aGUgcGFnZSB0aGF0IGRvZXM6IGFub3RoZXIgZG9jdW1lbnRlZCBwYWNrYWdlJ3Mgc2l0ZSwgb3IgYW5cbiAqIGVudHJ5IG9mIHRoZSBzaXRlJ3Mgb3duIGBleHRlcm5hbFR5cGVMaW5rc2Agc2V0dGluZy5cbiAqXG4gKiBAcGFyYW0gbmFtZSAtIFRoZSB0eXBlJ3MgbmFtZS5cbiAqIEByZXR1cm5zIFRoZSBVUkwsIG9yIGB1bmRlZmluZWRgIHdoZW4gbmVpdGhlciBrbm93cyB0aGUgdHlwZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlc29sdmVFeHRlcm5hbFR5cGVVcmwobmFtZTogc3RyaW5nKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgcmV0dXJuIGdldFBhY2thZ2VUeXBlVXJsKG5hbWUpID8/IGdldEFwaURvY1NldHRpbmdzKCkuZXh0ZXJuYWxUeXBlTGlua3MuZ2V0KG5hbWUpO1xufVxuXG4vKipcbiAqIFJlc29sdmUgYEBsaW5rYCB0YWdzLCB3aXRoIG9yIHdpdGhvdXQgYSBgfCBkaXNwbGF5IHRleHRgIHBhcnQsIGluIGRlc2NyaXB0aW9uIHRleHRcbiAqXG4gKiBAcGFyYW0gdGV4dCAtIFRoZSB0ZXh0LlxuICogQHBhcmFtIGFsbFR5cGVzIC0gRXZlcnkgZG9jdW1lbnRlZCB0eXBlLCBrZXllZCBieSBgJHtuYW1lc3BhY2V9IyR7bmFtZX1gLlxuICogQHBhcmFtIHNlbGZOYW1lc3BhY2UgLSBUaGUgbmFtZXNwYWNlIG9mIHRoZSBwYWdlIGJlaW5nIHJlbmRlcmVkLCBwcmVmZXJyZWQgd2hlbiBhIG5hbWUgaXMgYW1iaWd1b3VzLlxuICogQHJldHVybnMgVGhlIHRleHQgd2l0aCBtYXJrZG93biBsaW5rcy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlc29sdmVMaW5rcyh0ZXh0OiBzdHJpbmcsIGFsbFR5cGVzOiBNYXA8c3RyaW5nLCBUeXBlSW5mbz4sIHNlbGZOYW1lc3BhY2U/OiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gcmVwbGFjZVJlZ0V4cE1hdGNoZXModGV4dCwgL1xce0BsaW5rXFxzKyg/PHRhcmdldD5bXnx9XSs/KSg/OlxccypcXHxcXHMqKD88ZGlzcGxheT5bXn1dKz8pKT9cXH0vZywgKG1hdGNoKSA9PiB7XG4gICAgY29uc3QgdGFyZ2V0ID0gZ2V0TWFuZGF0b3J5TmFtZWRHcm91cChtYXRjaCwgJ3RhcmdldCcpLnRyaW0oKTtcbiAgICBjb25zdCBkaXNwbGF5ID0gKGdldE9wdGlvbmFsTmFtZWRHcm91cChtYXRjaCwgJ2Rpc3BsYXknKT8udHJpbSgpID8/IHRhcmdldCkucmVwbGFjZUFsbCgvXFxcXCg/PVs8Pnt9XSkvZywgJycpO1xuXG4gICAgLy8gSGFuZGxlIFR5cGUubWVtYmVyIHJlZmVyZW5jZXMgKGUuZy4sIFBsdWdpbk5vdGljZUNvbXBvbmVudC5zaG93Tm90aWNlKVxuICAgIGNvbnN0IGRvdE1hdGNoID0gL14oPzx0eXBlTmFtZT5bQS1aYS16XVxcdyopXFwuKD88bWVtYmVyTmFtZT5cXHcrKSQvLmV4ZWModGFyZ2V0KTtcbiAgICBpZiAoZG90TWF0Y2gpIHtcbiAgICAgIGNvbnN0IHR5cGVOYW1lID0gZ2V0TWFuZGF0b3J5TmFtZWRHcm91cChkb3RNYXRjaCwgJ3R5cGVOYW1lJyk7XG4gICAgICBjb25zdCBtZW1iZXJOYW1lID0gZ2V0TWFuZGF0b3J5TmFtZWRHcm91cChkb3RNYXRjaCwgJ21lbWJlck5hbWUnKTtcbiAgICAgIGNvbnN0IHR5cGVJbmZvID0gZmluZFR5cGUoYWxsVHlwZXMsIHR5cGVOYW1lLCBzZWxmTmFtZXNwYWNlKTtcbiAgICAgIGlmICh0eXBlSW5mbyAmJiBkb2VzTWVtYmVyUGFnZUV4aXN0KHR5cGVJbmZvLm5hbWVzcGFjZSwgdHlwZUluZm8ubmFtZSwgbWVtYmVyUm91dGVTZWdtZW50KG1lbWJlck5hbWUpKSkge1xuICAgICAgICBjb25zdCB0YXJnZXROc0RpcmVjdG9yeSA9IGdldE5hbWVzcGFjZURpcmVjdG9yeSh0eXBlSW5mby5uYW1lc3BhY2UpO1xuICAgICAgICByZXR1cm4gYFske2Rpc3BsYXl9XSgke2dldEJhc2VQYXRoKCl9L2FwaS8ke3RhcmdldE5zRGlyZWN0b3J5fS8ke3RvVHlwZVJvdXRlU2VnbWVudCh0eXBlSW5mby5uYW1lc3BhY2UsIHR5cGVJbmZvLm5hbWUpfS8ke21lbWJlclJvdXRlU2VnbWVudChtZW1iZXJOYW1lKX0vKWA7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gSGFuZGxlIHNpbXBsZSB0eXBlIHJlZmVyZW5jZXMg4oCUIGlmIGRpc3BsYXkgY29udGFpbnMgZ2VuZXJpYyBhcmdzLCBsaW5rIGVhY2ggdHlwZSBpbmRpdmlkdWFsbHlcbiAgICBjb25zdCBpbmZvID0gZmluZFR5cGUoYWxsVHlwZXMsIHRhcmdldCwgc2VsZk5hbWVzcGFjZSk7XG4gICAgaWYgKGluZm8pIHtcbiAgICAgIHJldHVybiBkaXNwbGF5ICE9PSB0YXJnZXQgJiYgZGlzcGxheS5pbmNsdWRlcygnPCcpID8gcmVuZGVyVHlwZVdpdGhMaW5rcyhkaXNwbGF5LCBhbGxUeXBlcywgdW5kZWZpbmVkLCBzZWxmTmFtZXNwYWNlKSA6IGBbJHtkaXNwbGF5fV0oJHt0eXBlSHJlZihpbmZvKX0pYDtcbiAgICB9XG5cbiAgICBjb25zdCBleHRlcm5hbFVybCA9IHJlc29sdmVFeHRlcm5hbFR5cGVVcmwodGFyZ2V0KTtcbiAgICByZXR1cm4gZXh0ZXJuYWxVcmwgPyBgWyR7ZGlzcGxheX1dKCR7ZXh0ZXJuYWxVcmx9KWAgOiBgXFxgJHtkaXNwbGF5fVxcYGA7XG4gIH0pO1xufVxuXG4vKipcbiAqIFJlc29sdmVzIGEgVHlwZVNjcmlwdCB1dGlsaXR5IHR5cGUgdG8gaXRzIGhhbmRib29rIGVudHJ5LlxuICpcbiAqIEBwYXJhbSBuYW1lIC0gVGhlIHR5cGUncyBuYW1lLlxuICogQHJldHVybnMgVGhlIGhhbmRib29rIFVSTCwgb3IgYHVuZGVmaW5lZGAgd2hlbiBpdCBpcyBub3QgYSB1dGlsaXR5IHR5cGUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZXNvbHZlVHNVdGlsaXR5VXJsKG5hbWU6IHN0cmluZyk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IGhhc2ggPSBUU19VVElMSVRZX1RZUEVTLmdldChuYW1lKTtcbiAgaWYgKGhhc2gpIHtcbiAgICBpZiAoWydJdGVyYWJsZSddLmluY2x1ZGVzKG5hbWUpKSB7XG4gICAgICByZXR1cm4gYGh0dHBzOi8vd3d3LnR5cGVzY3JpcHRsYW5nLm9yZy9kb2NzL2hhbmRib29rL2l0ZXJhdG9ycy1hbmQtZ2VuZXJhdG9ycy5odG1sIyR7aGFzaH1gO1xuICAgIH1cbiAgICBjb25zdCBoYW5kYm9va1BhZ2UgPSBbJ0NhcGl0YWxpemUnLCAnTG93ZXJjYXNlJywgJ1VuY2FwaXRhbGl6ZScsICdVcHBlcmNhc2UnXS5pbmNsdWRlcyhuYW1lKSA/ICcyL3RlbXBsYXRlLWxpdGVyYWwtdHlwZXMnIDogJ3V0aWxpdHktdHlwZXMnOyAvLyBDc3BlbGw6ZGlzYWJsZS1saW5lXG4gICAgcmV0dXJuIGBodHRwczovL3d3dy50eXBlc2NyaXB0bGFuZy5vcmcvZG9jcy9oYW5kYm9vay8ke2hhbmRib29rUGFnZX0uaHRtbCMke2hhc2h9YDtcbiAgfVxuICByZXR1cm4gdW5kZWZpbmVkO1xufVxuXG4vKipcbiAqIFJlc29sdmVzIGEgV2ViIEFQSSB0eXBlIHRvIGl0cyBNRE4gcGFnZS5cbiAqXG4gKiBAcGFyYW0gbmFtZSAtIFRoZSB0eXBlJ3MgbmFtZS5cbiAqIEByZXR1cm5zIFRoZSBNRE4gVVJMLCBvciBgdW5kZWZpbmVkYCB3aGVuIGl0IGlzIG5vdCBhIGtub3duIFdlYiBBUEkgdHlwZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlc29sdmVXZWJBcGlVcmwobmFtZTogc3RyaW5nKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgaWYgKCFPYmplY3QuaGFzT3duKG1vZHVsZVN0YXRlLndlYkFwaVR5cGVzLCBuYW1lKSkge1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cbiAgY29uc3QgZW50cnkgPSBtb2R1bGVTdGF0ZS53ZWJBcGlUeXBlc1tuYW1lXTtcbiAgaWYgKHR5cGVvZiBlbnRyeSA9PT0gJ3N0cmluZycpIHtcbiAgICByZXR1cm4gZW50cnk7XG4gIH1cbiAgaWYgKHR5cGVvZiBlbnRyeSA9PT0gJ29iamVjdCcgJiYgZW50cnkgIT09IG51bGwgJiYgJ3VybCcgaW4gZW50cnkpIHtcbiAgICBjb25zdCB0eXBlZEVudHJ5ID0gZW50cnkgYXMgV2ViQXBpRW50cnk7XG4gICAgcmV0dXJuIHR5cGVkRW50cnkudXJsO1xuICB9XG4gIHJldHVybiB1bmRlZmluZWQ7XG59XG5cbi8qKlxuICogUmVzb2x2ZSB0aGUgbG93ZXJjYXNlZCBPTi1ESVNLIHNlZ21lbnQgZm9yIGEgdHlwZSAoZmlsZSBwYXRoICsgY29tcG9uZW50LWltcG9ydCByZWxhdGl2ZSBwYXRoKS5cbiAqXG4gKiBAcGFyYW0gbmFtZXNwYWNlIC0gVGhlIHR5cGUncyBuYW1lc3BhY2UuXG4gKiBAcGFyYW0gbmFtZSAtIFRoZSB0eXBlJ3MgbmFtZS5cbiAqIEByZXR1cm5zIFRoZSBzZWdtZW50LlxuICovXG5leHBvcnQgZnVuY3Rpb24gdG9UeXBlRmlsZVNlZ21lbnQobmFtZXNwYWNlOiBzdHJpbmcsIG5hbWU6IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiB0eXBlRmlsZVNlZ21lbnRzLmdldChgJHtuYW1lc3BhY2V9IyR7bmFtZX1gKSA/PyB0b1JvdXRlU2VnbWVudChuYW1lKTtcbn1cblxuLyoqXG4gKiBSZXNvbHZlIHRoZSBjYXNlLXByZXNlcnZlZCBVUkwvUk9VVEUgc2VnbWVudCBmb3IgYSB0eXBlIChzbHVnIGZyb250bWF0dGVyICsgaW50ZXJuYWwgbGlua3MpLlxuICpcbiAqIEBwYXJhbSBuYW1lc3BhY2UgLSBUaGUgdHlwZSdzIG5hbWVzcGFjZS5cbiAqIEBwYXJhbSBuYW1lIC0gVGhlIHR5cGUncyBuYW1lLlxuICogQHJldHVybnMgVGhlIHNlZ21lbnQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB0b1R5cGVSb3V0ZVNlZ21lbnQobmFtZXNwYWNlOiBzdHJpbmcsIG5hbWU6IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiB0eXBlUm91dGVTZWdtZW50cy5nZXQoYCR7bmFtZXNwYWNlfSMke25hbWV9YCkgPz8gdG9Sb3V0ZVNlZ21lbnRQcmVzZXJ2ZUNhc2UobmFtZSk7XG59XG5cbi8qKlxuICogQWJzb2x1dGUgbGluayB0byBhIHR5cGUncyBvdmVydmlldyBwYWdlLlxuICpcbiAqIEBwYXJhbSBpbmZvIC0gVGhlIGRvY3VtZW50ZWQgdHlwZS5cbiAqIEByZXR1cm5zIFRoZSBsaW5rLlxuICovXG5leHBvcnQgZnVuY3Rpb24gdHlwZUhyZWYoaW5mbzogVHlwZUluZm8pOiBzdHJpbmcge1xuICByZXR1cm4gYCR7Z2V0QmFzZVBhdGgoKX0vYXBpLyR7Z2V0TmFtZXNwYWNlRGlyZWN0b3J5KGluZm8ubmFtZXNwYWNlKX0vJHt0b1R5cGVSb3V0ZVNlZ21lbnQoaW5mby5uYW1lc3BhY2UsIGluZm8ubmFtZSl9L2A7XG59XG5cbi8qKlxuICogQ3JlYXRlIGFuIGFic29sdXRlIGxpbmsgdG8gYSB0eXBlIHBhZ2VcbiAqXG4gKiBAcGFyYW0gdHlwZU5hbWUgLSBUaGUgdHlwZSdzIG5hbWUuXG4gKiBAcGFyYW0gYWxsVHlwZXMgLSBFdmVyeSBkb2N1bWVudGVkIHR5cGUsIGtleWVkIGJ5IGAke25hbWVzcGFjZX0jJHtuYW1lfWAuXG4gKiBAcGFyYW0gY3VycmVudE5hbWVzcGFjZSAtIFRoZSBuYW1lc3BhY2Ugb2YgdGhlIHJlZmVyZW5jaW5nIHBhZ2UsIHByZWZlcnJlZCB3aGVuIHRoZSBuYW1lIGlzIGFtYmlndW91cy5cbiAqIEByZXR1cm5zIEEgbWFya2Rvd24gbGluaywgb3IgaW5saW5lIGNvZGUgd2hlbiB0aGUgdHlwZSBpcyBub3QgZG9jdW1lbnRlZC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHR5cGVMaW5rKHR5cGVOYW1lOiBzdHJpbmcsIGFsbFR5cGVzOiBNYXA8c3RyaW5nLCBUeXBlSW5mbz4sIGN1cnJlbnROYW1lc3BhY2U/OiBzdHJpbmcpOiBzdHJpbmcge1xuICBjb25zdCBjbGVhbk5hbWUgPSB0eXBlTmFtZS5yZXBsYWNlKC88Lio+JC8sICcnKS50cmltKCk7XG4gIGNvbnN0IGluZm8gPSBmaW5kVHlwZShhbGxUeXBlcywgY2xlYW5OYW1lLCBjdXJyZW50TmFtZXNwYWNlKTtcbiAgcmV0dXJuIGluZm8gPyBgWyR7ZXNjYXBlTWR4QW5nbGVCcmFja2V0cyh0eXBlTmFtZSl9XSgke3R5cGVIcmVmKGluZm8pfSlgIDogYFxcYCR7dHlwZU5hbWV9XFxgYDtcbn1cblxuZnVuY3Rpb24gZGlzYW1iaWd1YXRlKGJhc2U6IHN0cmluZywgdXNlZDogU2V0PHN0cmluZz4sIGtleU9mOiAoc2VnbWVudDogc3RyaW5nKSA9PiBzdHJpbmcpOiBzdHJpbmcge1xuICBsZXQgc2VnbWVudCA9IGJhc2U7XG4gIGNvbnN0IEZJUlNUX0RJU0FNQklHVUFUSU9OX1NVRkZJWCA9IDI7XG4gIGxldCBzdWZmaXggPSBGSVJTVF9ESVNBTUJJR1VBVElPTl9TVUZGSVg7XG4gIHdoaWxlICh1c2VkLmhhcyhrZXlPZihzZWdtZW50KSkpIHtcbiAgICBzZWdtZW50ID0gYCR7YmFzZX0tJHtTdHJpbmcoc3VmZml4KX1gO1xuICAgIHN1ZmZpeCsrO1xuICB9XG4gIHVzZWQuYWRkKGtleU9mKHNlZ21lbnQpKTtcbiAgcmV0dXJuIHNlZ21lbnQ7XG59XG5cbmZ1bmN0aW9uIGdldEJhc2VQYXRoKCk6IHN0cmluZyB7XG4gIHJldHVybiBnZXRBcGlEb2NTZXR0aW5ncygpLmJhc2VQYXRoO1xufVxuXG4vKipcbiAqIFdhcm4gd2hlbiB0d28gZGlzdGluY3QgbWVtYmVycyBvZiBhIHR5cGUgcHJvZHVjZSB0aGUgc2FtZSBtZW1iZXIgc2x1ZyAoVVJML2ZpbGUgc2VnbWVudCkuIFRoZVxuICogb3B0aW9uYWwtYD9gIHN1ZmZpeCBpcyBzdHJpcHBlZCBmaXJzdCwgc28gYSBwcm9wZXJ0eSBhcHBlYXJpbmcgYXMgYm90aCByZXF1aXJlZCBhbmQgb3B0aW9uYWwgaXMgbm90XG4gKiBhIGZhbHNlIHBvc2l0aXZlLlxuICpcbiAqIEBwYXJhbSBpbmZvIC0gVGhlIHR5cGUuXG4gKiBAcGFyYW0gbmFtZXNwYWNlIC0gVGhlIHR5cGUncyBuYW1lc3BhY2UuXG4gKi9cbmZ1bmN0aW9uIHdhcm5NZW1iZXJTbHVnQ29sbGlzaW9ucyhpbmZvOiBUeXBlSW5mbywgbmFtZXNwYWNlOiBzdHJpbmcpOiB2b2lkIHtcbiAgY29uc3Qgc2VlbiA9IG5ldyBNYXA8c3RyaW5nLCBzdHJpbmc+KCk7XG4gIGZ1bmN0aW9uIGNoZWNrKHNsdWc6IHN0cmluZywgb3JpZ2luYWw6IHN0cmluZyk6IHZvaWQge1xuICAgIGNvbnN0IG5vcm1hbGl6ZWQgPSBvcmlnaW5hbC5yZXBsYWNlKC9cXD8kLywgJycpO1xuICAgIGNvbnN0IGV4aXN0aW5nID0gc2Vlbi5nZXQoc2x1Zyk7XG4gICAgaWYgKGV4aXN0aW5nICE9PSB1bmRlZmluZWQgJiYgZXhpc3RpbmcgIT09IG5vcm1hbGl6ZWQpIHtcbiAgICAgIGNvbnNvbGUud2FybihgTWVtYmVyIHJvdXRlIGNvbGxpc2lvbiBpbiBcIiR7bmFtZXNwYWNlfSMke2luZm8ubmFtZX1cIjogXCIke2V4aXN0aW5nfVwiIGFuZCBcIiR7bm9ybWFsaXplZH1cIiBib3RoIG1hcCB0byBcIi8ke3NsdWd9L1wiLmApO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBzZWVuLnNldChzbHVnLCBub3JtYWxpemVkKTtcbiAgfVxuICBmb3IgKGNvbnN0IHByb3BlcnR5IG9mIGluZm8ucHJvcGVydGllcykge1xuICAgIGNoZWNrKG1lbWJlclNsdWcocHJvcGVydHkubmFtZSksIHByb3BlcnR5Lm5hbWUpO1xuICB9XG4gIGZvciAoY29uc3QgbWV0aG9kIG9mIGluZm8ubWV0aG9kcykge1xuICAgIGNoZWNrKG92ZXJsb2FkU2x1ZyhtZXRob2Qub3ZlcmxvYWRLZXkpLCBtZXRob2Qub3ZlcmxvYWRLZXkpO1xuICB9XG59XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQU9BLHFCQUdPO0FBQ1AscUJBQTZCO0FBQzdCLHVCQUFxQjtBQU9yQiwrQkFLTztBQUNQLG1DQUFrQztBQUNsQyxvQ0FHTztBQUNQLDhCQUFrQztBQUNsQyxnQ0FVTztBQWFQLE1BQU0sY0FBMkI7QUFBQSxFQUMvQixhQUFhLENBQUM7QUFDaEI7QUFJQSxNQUFNLG1CQUFtQixvQkFBSSxJQUFvQjtBQUlqRCxNQUFNLG9CQUFvQixvQkFBSSxJQUFvQjtBQVFsRCxNQUFNLHVCQUF1QixvQkFBSSxJQUFZO0FBVXRDLFNBQVMsb0JBQW9CLFdBQW1CLFVBQWtCLGNBQStCO0FBQ3RHLFNBQU8scUJBQXFCLElBQUksR0FBRyxTQUFTLElBQUksUUFBUSxJQUFJLFlBQVksRUFBRTtBQUM1RTtBQWdCTyxTQUFTLFNBQVMsVUFBaUMsTUFBYyxrQkFBaUQ7QUFDdkgsTUFBSSxxQkFBcUIsUUFBVztBQUNsQyxVQUFNLFlBQVksU0FBUyxJQUFJLEdBQUcsZ0JBQWdCLElBQUksSUFBSSxFQUFFO0FBQzVELFFBQUksV0FBVztBQUNiLGFBQU87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
@@ -105,13 +105,23 @@ function parseTypeArguments(baseTypeName) {
105
105
  return $arguments;
106
106
  }
107
107
  function resolveInheritedMembers(types) {
108
- for (const [, info] of types) {
108
+ const resolved = /* @__PURE__ */ new Set();
109
+ const resolving = /* @__PURE__ */ new Set();
110
+ for (const info of types.values()) {
111
+ resolve(info);
112
+ }
113
+ function resolve(info) {
114
+ if (resolved.has(info)) {
115
+ return;
116
+ }
117
+ resolving.add(info);
109
118
  for (const baseTypeName of [...info.baseTypes, ...info.implementsTypes]) {
110
119
  const cleanBase = baseTypeName.replace(/<.*>$/, "").trim();
111
120
  const baseInfo = (0, import_api_doc_link_rendering.findType)(types, cleanBase, info.namespace);
112
- if (!baseInfo) {
121
+ if (!baseInfo || resolving.has(baseInfo)) {
113
122
  continue;
114
123
  }
124
+ resolve(baseInfo);
115
125
  const typeArguments = parseTypeArguments(baseTypeName);
116
126
  const typeParameterMap = buildTypeParameterMap(baseInfo, typeArguments);
117
127
  for (const property of baseInfo.properties) {
@@ -120,13 +130,15 @@ function resolveInheritedMembers(types) {
120
130
  }
121
131
  }
122
132
  for (const method of baseInfo.methods) {
123
- const hasOwnMethod = info.methods.some((m) => m.name === method.name && m.signature === method.signature);
124
- const hasInheritedMethod = info.methods.some((m) => m.inheritedFrom === baseInfo.name && m.overloadKey === method.overloadKey);
125
- if (!hasOwnMethod && !hasInheritedMethod) {
126
- info.methods.push(substituteMemberTypes({ ...method, inheritedFrom: baseInfo.name }, typeParameterMap));
133
+ const inheritedMethod = substituteMemberTypes({ ...method, inheritedFrom: baseInfo.name }, typeParameterMap);
134
+ const hasMethod = info.methods.some((m) => m.name === inheritedMethod.name && m.signature === inheritedMethod.signature);
135
+ if (!hasMethod) {
136
+ info.methods.push(inheritedMethod);
127
137
  }
128
138
  }
129
139
  }
140
+ resolving.delete(info);
141
+ resolved.add(info);
130
142
  }
131
143
  }
132
144
  function substituteMemberTypes(member, mapping) {
@@ -154,4 +166,4 @@ function substituteTypeParams(typeText, mapping) {
154
166
  substituteMemberTypes,
155
167
  substituteTypeParams
156
168
  });
157
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9kb2NzLXNpdGUvYXBpLWRvYy10eXBlLW1lcmdpbmcudHMiXSwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAZmlsZVxuICpcbiAqIEluaGVyaXRhbmNlIHJlc29sdXRpb246IGNvcGllcyBpbmhlcml0ZWQgbWVtYmVycyBvbnRvIHN1YnR5cGVzLCBzdWJzdGl0dXRpbmcgZ2VuZXJpYyB0eXBlIGFyZ3MuXG4gKlxuICogKEEgZG9jdW1lbnRlZCBwYWNrYWdlIGlzIGEgbm9ybWFsIGxpYnJhcnksIG5vdCBhbiBhdWdtZW50YXRpb24gb2YgYW5vdGhlciBwYWNrYWdlJ3MgZGVjbGFyYXRpb25zLCBzbyB0aGVyZSBpcyBub1xuICogb2ZmaWNpYWwtdnMtdW5vZmZpY2lhbCBtZXJnZSBtYWNoaW5lcnkgaGVyZSDigJQgb25seSB0aGUgZ2VuZXJpYyBpbmhlcml0YW5jZSBoZWxwZXJzLilcbiAqL1xuXG5pbXBvcnQgeyBlbnN1cmVOb25OdWxsYWJsZSB9IGZyb20gJ0BtbmFvdW1vdi90eXBlc2NyaXB0LWxpYi90eXBlLWd1YXJkcyc7XG5cbmltcG9ydCB0eXBlIHtcbiAgTWVtYmVySW5mbyxcbiAgVHlwZUluZm9cbn0gZnJvbSAnLi9hcGktZG9jLXR5cGVzLnRzJztcblxuaW1wb3J0IHsgZmluZFR5cGUgfSBmcm9tICcuL2FwaS1kb2MtbGluay1yZW5kZXJpbmcudHMnO1xuXG4vKipcbiAqIEJ1aWxkIGEgbWFwcGluZyBmcm9tIHBhcmVudCB0eXBlIHBhcmFtZXRlciBuYW1lcyB0byBjb25jcmV0ZSB0eXBlIGFyZ3VtZW50cy5cbiAqIEUuZy4sIHBhcmVudCBoYXMgYHR5cGVQYXJhbWV0ZXJzOiBbJ0luc3RhbmNlIGV4dGVuZHMgQmFzZUluc3RhbmNlJ11gIGFuZFxuICogY2hpbGQgZXh0ZW5kcyBgUGFyZW50PENhbnZhc1BsdWdpbkluc3RhbmNlPmAg4oaSIGB7SW5zdGFuY2U6ICdDYW52YXNQbHVnaW5JbnN0YW5jZSd9YFxuICpcbiAqIEBwYXJhbSBiYXNlSW5mbyAtIFRoZSBiYXNlIHR5cGUuXG4gKiBAcGFyYW0gdHlwZUFyZ3VtZW50cyAtIFRoZSB0eXBlIGFyZ3VtZW50cyB0aGUgYmFzZSB0eXBlIGlzIGdpdmVuLlxuICogQHJldHVybnMgVGhlIHBhcmFtZXRlciBuYW1lcyBtYXBwZWQgdG8gdGhlaXIgYXJndW1lbnRzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gYnVpbGRUeXBlUGFyYW1ldGVyTWFwKGJhc2VJbmZvOiBUeXBlSW5mbywgdHlwZUFyZ3VtZW50czogc3RyaW5nW10pOiBNYXA8c3RyaW5nLCBzdHJpbmc+IHtcbiAgY29uc3QgbWFwcGluZyA9IG5ldyBNYXA8c3RyaW5nLCBzdHJpbmc+KCk7XG4gIGNvbnN0IGNvdW50ID0gTWF0aC5taW4oYmFzZUluZm8udHlwZVBhcmFtZXRlcnMubGVuZ3RoLCB0eXBlQXJndW1lbnRzLmxlbmd0aCk7XG4gIGZvciAobGV0IGluZGV4ID0gMDsgaW5kZXggPCBjb3VudDsgaW5kZXgrKykge1xuICAgIC8vIEJvdGggbGlzdHMgYXJlIGxvbmdlciB0aGFuIGBpbmRleGAuXG4gICAgY29uc3QgcGFyYW1ldGVyID0gZW5zdXJlTm9uTnVsbGFibGUoYmFzZUluZm8udHlwZVBhcmFtZXRlcnNbaW5kZXhdKTtcbiAgICBjb25zdCBhcmd1bWVudCA9IGVuc3VyZU5vbk51bGxhYmxlKHR5cGVBcmd1bWVudHNbaW5kZXhdKTtcbiAgICBjb25zdCBiYXJlUGFyYW1ldGVyID0gcGFyYW1ldGVyLnJlcGxhY2UoL1xccytleHRlbmRzXFxzKy4qJC8sICcnKTtcbiAgICBtYXBwaW5nLnNldChiYXJlUGFyYW1ldGVyLCBhcmd1bWVudCk7XG4gIH1cbiAgcmV0dXJuIG1hcHBpbmc7XG59XG5cbi8qKlxuICogUGFyc2UgZ2VuZXJpYyB0eXBlIGFyZ3VtZW50cyBmcm9tIGEgYmFzZSB0eXBlIGV4cHJlc3Npb24uXG4gKiBFLmcuLCBgSW50ZXJuYWxQbHVnaW48Q2FudmFzUGx1Z2luSW5zdGFuY2U+YCDihpIgYFsnQ2FudmFzUGx1Z2luSW5zdGFuY2UnXWBcbiAqIEhhbmRsZXMgbmVzdGVkIGFuZ2xlIGJyYWNrZXRzOiBgRm9vPEJhcjxCYXo+LCBRdXg+YCDihpIgYFsnQmFyPEJhej4nLCAnUXV4J11gXG4gKlxuICogQHBhcmFtIGJhc2VUeXBlTmFtZSAtIFRoZSBiYXNlIHR5cGUgZXhwcmVzc2lvbiwgZS5nLiBgRm9vPEJhciwgQmF6PmAuXG4gKiBAcmV0dXJucyBUaGUgdHlwZSBhcmd1bWVudHMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBwYXJzZVR5cGVBcmd1bWVudHMoYmFzZVR5cGVOYW1lOiBzdHJpbmcpOiBzdHJpbmdbXSB7XG4gIGNvbnN0IG9wZW5JbmRleCA9IGJhc2VUeXBlTmFtZS5pbmRleE9mKCc8Jyk7XG4gIGlmIChvcGVuSW5kZXggPT09IC0xKSB7XG4gICAgcmV0dXJuIFtdO1xuICB9XG4gIGNvbnN0IGlubmVyID0gYmFzZVR5cGVOYW1lLnNsaWNlKG9wZW5JbmRleCArIDEsIC0xKTtcbiAgY29uc3QgJGFyZ3VtZW50czogc3RyaW5nW10gPSBbXTtcbiAgbGV0IGRlcHRoID0gMDtcbiAgbGV0IGN1cnJlbnQgPSAnJztcbiAgZm9yIChjb25zdCBjaCBvZiBpbm5lcikge1xuICAgIGlmIChjaCA9PT0gJzwnKSB7XG4gICAgICBkZXB0aCsrO1xuICAgICAgY3VycmVudCArPSBjaDtcbiAgICB9IGVsc2UgaWYgKGNoID09PSAnPicpIHtcbiAgICAgIGRlcHRoLS07XG4gICAgICBjdXJyZW50ICs9IGNoO1xuICAgIH0gZWxzZSBpZiAoY2ggPT09ICcsJyAmJiBkZXB0aCA9PT0gMCkge1xuICAgICAgJGFyZ3VtZW50cy5wdXNoKGN1cnJlbnQudHJpbSgpKTtcbiAgICAgIGN1cnJlbnQgPSAnJztcbiAgICB9IGVsc2Uge1xuICAgICAgY3VycmVudCArPSBjaDtcbiAgICB9XG4gIH1cbiAgaWYgKGN1cnJlbnQudHJpbSgpKSB7XG4gICAgJGFyZ3VtZW50cy5wdXNoKGN1cnJlbnQudHJpbSgpKTtcbiAgfVxuICByZXR1cm4gJGFyZ3VtZW50cztcbn1cblxuLyoqXG4gKiBDb3BpZXMgZXZlcnkgaW5oZXJpdGVkIG1lbWJlciBvbnRvIGl0cyBzdWJ0eXBlcywgc3Vic3RpdHV0aW5nIHRoZSB0eXBlIGFyZ3VtZW50cyB0aGUgc3VidHlwZSBwYXNzZXMuXG4gKlxuICogQHBhcmFtIHR5cGVzIC0gVGhlIGRvY3VtZW50ZWQgdHlwZXMsIGtleWVkIGJ5IHF1YWxpZmllZCBpZC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlc29sdmVJbmhlcml0ZWRNZW1iZXJzKHR5cGVzOiBNYXA8c3RyaW5nLCBUeXBlSW5mbz4pOiB2b2lkIHtcbiAgZm9yIChjb25zdCBbLCBpbmZvXSBvZiB0eXBlcykge1xuICAgIGZvciAoY29uc3QgYmFzZVR5cGVOYW1lIG9mIFsuLi5pbmZvLmJhc2VUeXBlcywgLi4uaW5mby5pbXBsZW1lbnRzVHlwZXNdKSB7XG4gICAgICBjb25zdCBjbGVhbkJhc2UgPSBiYXNlVHlwZU5hbWUucmVwbGFjZSgvPC4qPiQvLCAnJykudHJpbSgpO1xuICAgICAgY29uc3QgYmFzZUluZm8gPSBmaW5kVHlwZSh0eXBlcywgY2xlYW5CYXNlLCBpbmZvLm5hbWVzcGFjZSk7XG4gICAgICBpZiAoIWJhc2VJbmZvKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICBjb25zdCB0eXBlQXJndW1lbnRzID0gcGFyc2VUeXBlQXJndW1lbnRzKGJhc2VUeXBlTmFtZSk7XG4gICAgICBjb25zdCB0eXBlUGFyYW1ldGVyTWFwID0gYnVpbGRUeXBlUGFyYW1ldGVyTWFwKGJhc2VJbmZvLCB0eXBlQXJndW1lbnRzKTtcblxuICAgICAgZm9yIChjb25zdCBwcm9wZXJ0eSBvZiBiYXNlSW5mby5wcm9wZXJ0aWVzKSB7XG4gICAgICAgIGlmIChpbmZvLnByb3BlcnRpZXMuZXZlcnkoKHApID0+IHAubmFtZSAhPT0gcHJvcGVydHkubmFtZSkpIHtcbiAgICAgICAgICBpbmZvLnByb3BlcnRpZXMucHVzaChzdWJzdGl0dXRlTWVtYmVyVHlwZXMoeyAuLi5wcm9wZXJ0eSwgaW5oZXJpdGVkRnJvbTogYmFzZUluZm8ubmFtZSB9LCB0eXBlUGFyYW1ldGVyTWFwKSk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgZm9yIChjb25zdCBtZXRob2Qgb2YgYmFzZUluZm8ubWV0aG9kcykge1xuICAgICAgICBjb25zdCBoYXNPd25NZXRob2QgPSBpbmZvLm1ldGhvZHMuc29tZSgobSkgPT4gbS5uYW1lID09PSBtZXRob2QubmFtZSAmJiBtLnNpZ25hdHVyZSA9PT0gbWV0aG9kLnNpZ25hdHVyZSk7XG4gICAgICAgIGNvbnN0IGhhc0luaGVyaXRlZE1ldGhvZCA9IGluZm8ubWV0aG9kcy5zb21lKChtKSA9PiBtLmluaGVyaXRlZEZyb20gPT09IGJhc2VJbmZvLm5hbWUgJiYgbS5vdmVybG9hZEtleSA9PT0gbWV0aG9kLm92ZXJsb2FkS2V5KTtcbiAgICAgICAgaWYgKCFoYXNPd25NZXRob2QgJiYgIWhhc0luaGVyaXRlZE1ldGhvZCkge1xuICAgICAgICAgIGluZm8ubWV0aG9kcy5wdXNoKHN1YnN0aXR1dGVNZW1iZXJUeXBlcyh7IC4uLm1ldGhvZCwgaW5oZXJpdGVkRnJvbTogYmFzZUluZm8ubmFtZSB9LCB0eXBlUGFyYW1ldGVyTWFwKSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cblxuLyoqXG4gKiBBcHBseSB0eXBlIHBhcmFtZXRlciBzdWJzdGl0dXRpb24gdG8gYWxsIHR5cGUtYmVhcmluZyBmaWVsZHMgb2YgYSBtZW1iZXJcbiAqXG4gKiBAcGFyYW0gbWVtYmVyIC0gVGhlIG1lbWJlci5cbiAqIEBwYXJhbSBtYXBwaW5nIC0gVHlwZSBwYXJhbWV0ZXIgbmFtZXMgbWFwcGVkIHRvIHRoZWlyIGFyZ3VtZW50cy5cbiAqIEByZXR1cm5zIFRoZSBtZW1iZXIgd2l0aCBpdHMgdHlwZXMgc3Vic3RpdHV0ZWQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzdWJzdGl0dXRlTWVtYmVyVHlwZXMobWVtYmVyOiBNZW1iZXJJbmZvLCBtYXBwaW5nOiBNYXA8c3RyaW5nLCBzdHJpbmc+KTogTWVtYmVySW5mbyB7XG4gIHJldHVybiBtYXBwaW5nLnNpemUgPT09IDBcbiAgICA/IG1lbWJlclxuICAgIDoge1xuICAgICAgLi4ubWVtYmVyLFxuICAgICAgcGFyYW1ldGVyczogbWVtYmVyLnBhcmFtZXRlcnMubWFwKChwKSA9PiAoe1xuICAgICAgICAuLi5wLFxuICAgICAgICB0eXBlOiBzdWJzdGl0dXRlVHlwZVBhcmFtcyhwLnR5cGUsIG1hcHBpbmcpXG4gICAgICB9KSksXG4gICAgICByZXR1cm5UeXBlOiBzdWJzdGl0dXRlVHlwZVBhcmFtcyhtZW1iZXIucmV0dXJuVHlwZSwgbWFwcGluZyksXG4gICAgICBzaWduYXR1cmU6IHN1YnN0aXR1dGVUeXBlUGFyYW1zKG1lbWJlci5zaWduYXR1cmUsIG1hcHBpbmcpLFxuICAgICAgdHlwZTogc3Vic3RpdHV0ZVR5cGVQYXJhbXMobWVtYmVyLnR5cGUsIG1hcHBpbmcpXG4gICAgfTtcbn1cblxuLyoqXG4gKiBTdWJzdGl0dXRlIGdlbmVyaWMgdHlwZSBwYXJhbWV0ZXJzIGluIGEgdHlwZSBzdHJpbmcgdXNpbmcgYSBtYXBwaW5nXG4gKlxuICogQHBhcmFtIHR5cGVUZXh0IC0gVGhlIHR5cGUgdGV4dC5cbiAqIEBwYXJhbSBtYXBwaW5nIC0gVHlwZSBwYXJhbWV0ZXIgbmFtZXMgbWFwcGVkIHRvIHRoZWlyIGFyZ3VtZW50cy5cbiAqIEByZXR1cm5zIFRoZSBzdWJzdGl0dXRlZCB0eXBlIHRleHQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzdWJzdGl0dXRlVHlwZVBhcmFtcyh0eXBlVGV4dDogc3RyaW5nLCBtYXBwaW5nOiBNYXA8c3RyaW5nLCBzdHJpbmc+KTogc3RyaW5nIHtcbiAgcmV0dXJuIG1hcHBpbmcuc2l6ZSA9PT0gMFxuICAgID8gdHlwZVRleHRcbiAgICA6IHR5cGVUZXh0LnJlcGxhY2VBbGwoL1xcYig/PHR5cGVOYW1lPlthLXpBLVpdW2EtekEtWjAtOV0qKVxcYi9nLCAobWF0Y2gpID0+IHtcbiAgICAgIHJldHVybiBtYXBwaW5nLmdldChtYXRjaCkgPz8gbWF0Y2g7XG4gICAgfSk7XG59XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBU0EseUJBQWtDO0FBT2xDLG9DQUF5QjtBQVdsQixTQUFTLHNCQUFzQixVQUFvQixlQUE4QztBQUN0RyxRQUFNLFVBQVUsb0JBQUksSUFBb0I7QUFDeEMsUUFBTSxRQUFRLEtBQUssSUFBSSxTQUFTLGVBQWUsUUFBUSxjQUFjLE1BQU07QUFDM0UsV0FBUyxRQUFRLEdBQUcsUUFBUSxPQUFPLFNBQVM7QUFFMUMsVUFBTSxnQkFBWSxzQ0FBa0IsU0FBUyxlQUFlLEtBQUssQ0FBQztBQUNsRSxVQUFNLGVBQVcsc0NBQWtCLGNBQWMsS0FBSyxDQUFDO0FBQ3ZELFVBQU0sZ0JBQWdCLFVBQVUsUUFBUSxvQkFBb0IsRUFBRTtBQUM5RCxZQUFRLElBQUksZUFBZSxRQUFRO0FBQUEsRUFDckM7QUFDQSxTQUFPO0FBQ1Q7QUFVTyxTQUFTLG1CQUFtQixjQUFnQztBQUNqRSxRQUFNLFlBQVksYUFBYSxRQUFRLEdBQUc7QUFDMUMsTUFBSSxjQUFjLElBQUk7QUFDcEIsV0FBTyxDQUFDO0FBQUEsRUFDVjtBQUNBLFFBQU0sUUFBUSxhQUFhLE1BQU0sWUFBWSxHQUFHLEVBQUU7QUFDbEQsUUFBTSxhQUF1QixDQUFDO0FBQzlCLE1BQUksUUFBUTtBQUNaLE1BQUksVUFBVTtBQUNkLGFBQVcsTUFBTSxPQUFPO0FBQ3RCLFFBQUksT0FBTyxLQUFLO0FBQ2Q7QUFDQSxpQkFBVztBQUFBLElBQ2IsV0FBVyxPQUFPLEtBQUs7QUFDckI7QUFDQSxpQkFBVztBQUFBLElBQ2IsV0FBVyxPQUFPLE9BQU8sVUFBVSxHQUFHO0FBQ3BDLGlCQUFXLEtBQUssUUFBUSxLQUFLLENBQUM7QUFDOUIsZ0JBQVU7QUFBQSxJQUNaLE9BQU87QUFDTCxpQkFBVztBQUFBLElBQ2I7QUFBQSxFQUNGO0FBQ0EsTUFBSSxRQUFRLEtBQUssR0FBRztBQUNsQixlQUFXLEtBQUssUUFBUSxLQUFLLENBQUM7QUFBQSxFQUNoQztBQUNBLFNBQU87QUFDVDtBQU9PLFNBQVMsd0JBQXdCLE9BQW9DO0FBQzFFLGFBQVcsQ0FBQyxFQUFFLElBQUksS0FBSyxPQUFPO0FBQzVCLGVBQVcsZ0JBQWdCLENBQUMsR0FBRyxLQUFLLFdBQVcsR0FBRyxLQUFLLGVBQWUsR0FBRztBQUN2RSxZQUFNLFlBQVksYUFBYSxRQUFRLFNBQVMsRUFBRSxFQUFFLEtBQUs7QUFDekQsWUFBTSxlQUFXLHdDQUFTLE9BQU8sV0FBVyxLQUFLLFNBQVM7QUFDMUQsVUFBSSxDQUFDLFVBQVU7QUFDYjtBQUFBLE1BQ0Y7QUFFQSxZQUFNLGdCQUFnQixtQkFBbUIsWUFBWTtBQUNyRCxZQUFNLG1CQUFtQixzQkFBc0IsVUFBVSxhQUFhO0FBRXRFLGlCQUFXLFlBQVksU0FBUyxZQUFZO0FBQzFDLFlBQUksS0FBSyxXQUFXLE1BQU0sQ0FBQyxNQUFNLEVBQUUsU0FBUyxTQUFTLElBQUksR0FBRztBQUMxRCxlQUFLLFdBQVcsS0FBSyxzQkFBc0IsRUFBRSxHQUFHLFVBQVUsZUFBZSxTQUFTLEtBQUssR0FBRyxnQkFBZ0IsQ0FBQztBQUFBLFFBQzdHO0FBQUEsTUFDRjtBQUVBLGlCQUFXLFVBQVUsU0FBUyxTQUFTO0FBQ3JDLGNBQU0sZUFBZSxLQUFLLFFBQVEsS0FBSyxDQUFDLE1BQU0sRUFBRSxTQUFTLE9BQU8sUUFBUSxFQUFFLGNBQWMsT0FBTyxTQUFTO0FBQ3hHLGNBQU0scUJBQXFCLEtBQUssUUFBUSxLQUFLLENBQUMsTUFBTSxFQUFFLGtCQUFrQixTQUFTLFFBQVEsRUFBRSxnQkFBZ0IsT0FBTyxXQUFXO0FBQzdILFlBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxvQkFBb0I7QUFDeEMsZUFBSyxRQUFRLEtBQUssc0JBQXNCLEVBQUUsR0FBRyxRQUFRLGVBQWUsU0FBUyxLQUFLLEdBQUcsZ0JBQWdCLENBQUM7QUFBQSxRQUN4RztBQUFBLE1BQ0Y7QUFBQSxJQUNGO0FBQUEsRUFDRjtBQUNGO0FBU08sU0FBUyxzQkFBc0IsUUFBb0IsU0FBMEM7QUFDbEcsU0FBTyxRQUFRLFNBQVMsSUFDcEIsU0FDQTtBQUFBLElBQ0EsR0FBRztBQUFBLElBQ0gsWUFBWSxPQUFPLFdBQVcsSUFBSSxDQUFDLE9BQU87QUFBQSxNQUN4QyxHQUFHO0FBQUEsTUFDSCxNQUFNLHFCQUFxQixFQUFFLE1BQU0sT0FBTztBQUFBLElBQzVDLEVBQUU7QUFBQSxJQUNGLFlBQVkscUJBQXFCLE9BQU8sWUFBWSxPQUFPO0FBQUEsSUFDM0QsV0FBVyxxQkFBcUIsT0FBTyxXQUFXLE9BQU87QUFBQSxJQUN6RCxNQUFNLHFCQUFxQixPQUFPLE1BQU0sT0FBTztBQUFBLEVBQ2pEO0FBQ0o7QUFTTyxTQUFTLHFCQUFxQixVQUFrQixTQUFzQztBQUMzRixTQUFPLFFBQVEsU0FBUyxJQUNwQixXQUNBLFNBQVMsV0FBVywwQ0FBMEMsQ0FBQyxVQUFVO0FBQ3pFLFdBQU8sUUFBUSxJQUFJLEtBQUssS0FBSztBQUFBLEVBQy9CLENBQUM7QUFDTDsiLCJuYW1lcyI6W119
169
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9kb2NzLXNpdGUvYXBpLWRvYy10eXBlLW1lcmdpbmcudHMiXSwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAZmlsZVxuICpcbiAqIEluaGVyaXRhbmNlIHJlc29sdXRpb246IGNvcGllcyBpbmhlcml0ZWQgbWVtYmVycyBvbnRvIHN1YnR5cGVzLCBzdWJzdGl0dXRpbmcgZ2VuZXJpYyB0eXBlIGFyZ3MuXG4gKlxuICogKEEgZG9jdW1lbnRlZCBwYWNrYWdlIGlzIGEgbm9ybWFsIGxpYnJhcnksIG5vdCBhbiBhdWdtZW50YXRpb24gb2YgYW5vdGhlciBwYWNrYWdlJ3MgZGVjbGFyYXRpb25zLCBzbyB0aGVyZSBpcyBub1xuICogb2ZmaWNpYWwtdnMtdW5vZmZpY2lhbCBtZXJnZSBtYWNoaW5lcnkgaGVyZSDigJQgb25seSB0aGUgZ2VuZXJpYyBpbmhlcml0YW5jZSBoZWxwZXJzLilcbiAqL1xuXG5pbXBvcnQgeyBlbnN1cmVOb25OdWxsYWJsZSB9IGZyb20gJ0BtbmFvdW1vdi90eXBlc2NyaXB0LWxpYi90eXBlLWd1YXJkcyc7XG5cbmltcG9ydCB0eXBlIHtcbiAgTWVtYmVySW5mbyxcbiAgVHlwZUluZm9cbn0gZnJvbSAnLi9hcGktZG9jLXR5cGVzLnRzJztcblxuaW1wb3J0IHsgZmluZFR5cGUgfSBmcm9tICcuL2FwaS1kb2MtbGluay1yZW5kZXJpbmcudHMnO1xuXG4vKipcbiAqIEJ1aWxkIGEgbWFwcGluZyBmcm9tIHBhcmVudCB0eXBlIHBhcmFtZXRlciBuYW1lcyB0byBjb25jcmV0ZSB0eXBlIGFyZ3VtZW50cy5cbiAqIEUuZy4sIHBhcmVudCBoYXMgYHR5cGVQYXJhbWV0ZXJzOiBbJ0luc3RhbmNlIGV4dGVuZHMgQmFzZUluc3RhbmNlJ11gIGFuZFxuICogY2hpbGQgZXh0ZW5kcyBgUGFyZW50PENhbnZhc1BsdWdpbkluc3RhbmNlPmAg4oaSIGB7SW5zdGFuY2U6ICdDYW52YXNQbHVnaW5JbnN0YW5jZSd9YFxuICpcbiAqIEBwYXJhbSBiYXNlSW5mbyAtIFRoZSBiYXNlIHR5cGUuXG4gKiBAcGFyYW0gdHlwZUFyZ3VtZW50cyAtIFRoZSB0eXBlIGFyZ3VtZW50cyB0aGUgYmFzZSB0eXBlIGlzIGdpdmVuLlxuICogQHJldHVybnMgVGhlIHBhcmFtZXRlciBuYW1lcyBtYXBwZWQgdG8gdGhlaXIgYXJndW1lbnRzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gYnVpbGRUeXBlUGFyYW1ldGVyTWFwKGJhc2VJbmZvOiBUeXBlSW5mbywgdHlwZUFyZ3VtZW50czogc3RyaW5nW10pOiBNYXA8c3RyaW5nLCBzdHJpbmc+IHtcbiAgY29uc3QgbWFwcGluZyA9IG5ldyBNYXA8c3RyaW5nLCBzdHJpbmc+KCk7XG4gIGNvbnN0IGNvdW50ID0gTWF0aC5taW4oYmFzZUluZm8udHlwZVBhcmFtZXRlcnMubGVuZ3RoLCB0eXBlQXJndW1lbnRzLmxlbmd0aCk7XG4gIGZvciAobGV0IGluZGV4ID0gMDsgaW5kZXggPCBjb3VudDsgaW5kZXgrKykge1xuICAgIC8vIEJvdGggbGlzdHMgYXJlIGxvbmdlciB0aGFuIGBpbmRleGAuXG4gICAgY29uc3QgcGFyYW1ldGVyID0gZW5zdXJlTm9uTnVsbGFibGUoYmFzZUluZm8udHlwZVBhcmFtZXRlcnNbaW5kZXhdKTtcbiAgICBjb25zdCBhcmd1bWVudCA9IGVuc3VyZU5vbk51bGxhYmxlKHR5cGVBcmd1bWVudHNbaW5kZXhdKTtcbiAgICBjb25zdCBiYXJlUGFyYW1ldGVyID0gcGFyYW1ldGVyLnJlcGxhY2UoL1xccytleHRlbmRzXFxzKy4qJC8sICcnKTtcbiAgICBtYXBwaW5nLnNldChiYXJlUGFyYW1ldGVyLCBhcmd1bWVudCk7XG4gIH1cbiAgcmV0dXJuIG1hcHBpbmc7XG59XG5cbi8qKlxuICogUGFyc2UgZ2VuZXJpYyB0eXBlIGFyZ3VtZW50cyBmcm9tIGEgYmFzZSB0eXBlIGV4cHJlc3Npb24uXG4gKiBFLmcuLCBgSW50ZXJuYWxQbHVnaW48Q2FudmFzUGx1Z2luSW5zdGFuY2U+YCDihpIgYFsnQ2FudmFzUGx1Z2luSW5zdGFuY2UnXWBcbiAqIEhhbmRsZXMgbmVzdGVkIGFuZ2xlIGJyYWNrZXRzOiBgRm9vPEJhcjxCYXo+LCBRdXg+YCDihpIgYFsnQmFyPEJhej4nLCAnUXV4J11gXG4gKlxuICogQHBhcmFtIGJhc2VUeXBlTmFtZSAtIFRoZSBiYXNlIHR5cGUgZXhwcmVzc2lvbiwgZS5nLiBgRm9vPEJhciwgQmF6PmAuXG4gKiBAcmV0dXJucyBUaGUgdHlwZSBhcmd1bWVudHMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBwYXJzZVR5cGVBcmd1bWVudHMoYmFzZVR5cGVOYW1lOiBzdHJpbmcpOiBzdHJpbmdbXSB7XG4gIGNvbnN0IG9wZW5JbmRleCA9IGJhc2VUeXBlTmFtZS5pbmRleE9mKCc8Jyk7XG4gIGlmIChvcGVuSW5kZXggPT09IC0xKSB7XG4gICAgcmV0dXJuIFtdO1xuICB9XG4gIGNvbnN0IGlubmVyID0gYmFzZVR5cGVOYW1lLnNsaWNlKG9wZW5JbmRleCArIDEsIC0xKTtcbiAgY29uc3QgJGFyZ3VtZW50czogc3RyaW5nW10gPSBbXTtcbiAgbGV0IGRlcHRoID0gMDtcbiAgbGV0IGN1cnJlbnQgPSAnJztcbiAgZm9yIChjb25zdCBjaCBvZiBpbm5lcikge1xuICAgIGlmIChjaCA9PT0gJzwnKSB7XG4gICAgICBkZXB0aCsrO1xuICAgICAgY3VycmVudCArPSBjaDtcbiAgICB9IGVsc2UgaWYgKGNoID09PSAnPicpIHtcbiAgICAgIGRlcHRoLS07XG4gICAgICBjdXJyZW50ICs9IGNoO1xuICAgIH0gZWxzZSBpZiAoY2ggPT09ICcsJyAmJiBkZXB0aCA9PT0gMCkge1xuICAgICAgJGFyZ3VtZW50cy5wdXNoKGN1cnJlbnQudHJpbSgpKTtcbiAgICAgIGN1cnJlbnQgPSAnJztcbiAgICB9IGVsc2Uge1xuICAgICAgY3VycmVudCArPSBjaDtcbiAgICB9XG4gIH1cbiAgaWYgKGN1cnJlbnQudHJpbSgpKSB7XG4gICAgJGFyZ3VtZW50cy5wdXNoKGN1cnJlbnQudHJpbSgpKTtcbiAgfVxuICByZXR1cm4gJGFyZ3VtZW50cztcbn1cblxuLyoqXG4gKiBDb3BpZXMgZXZlcnkgaW5oZXJpdGVkIG1lbWJlciBvbnRvIGl0cyBzdWJ0eXBlcywgc3Vic3RpdHV0aW5nIHRoZSB0eXBlIGFyZ3VtZW50cyB0aGUgc3VidHlwZSBwYXNzZXMuXG4gKlxuICogQHBhcmFtIHR5cGVzIC0gVGhlIGRvY3VtZW50ZWQgdHlwZXMsIGtleWVkIGJ5IHF1YWxpZmllZCBpZC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlc29sdmVJbmhlcml0ZWRNZW1iZXJzKHR5cGVzOiBNYXA8c3RyaW5nLCBUeXBlSW5mbz4pOiB2b2lkIHtcbiAgY29uc3QgcmVzb2x2ZWQgPSBuZXcgU2V0PFR5cGVJbmZvPigpO1xuICBjb25zdCByZXNvbHZpbmcgPSBuZXcgU2V0PFR5cGVJbmZvPigpO1xuXG4gIGZvciAoY29uc3QgaW5mbyBvZiB0eXBlcy52YWx1ZXMoKSkge1xuICAgIHJlc29sdmUoaW5mbyk7XG4gIH1cblxuICBmdW5jdGlvbiByZXNvbHZlKGluZm86IFR5cGVJbmZvKTogdm9pZCB7XG4gICAgaWYgKHJlc29sdmVkLmhhcyhpbmZvKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICByZXNvbHZpbmcuYWRkKGluZm8pO1xuICAgIGZvciAoY29uc3QgYmFzZVR5cGVOYW1lIG9mIFsuLi5pbmZvLmJhc2VUeXBlcywgLi4uaW5mby5pbXBsZW1lbnRzVHlwZXNdKSB7XG4gICAgICBjb25zdCBjbGVhbkJhc2UgPSBiYXNlVHlwZU5hbWUucmVwbGFjZSgvPC4qPiQvLCAnJykudHJpbSgpO1xuICAgICAgY29uc3QgYmFzZUluZm8gPSBmaW5kVHlwZSh0eXBlcywgY2xlYW5CYXNlLCBpbmZvLm5hbWVzcGFjZSk7XG4gICAgICBpZiAoIWJhc2VJbmZvIHx8IHJlc29sdmluZy5oYXMoYmFzZUluZm8pKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICByZXNvbHZlKGJhc2VJbmZvKTtcblxuICAgICAgY29uc3QgdHlwZUFyZ3VtZW50cyA9IHBhcnNlVHlwZUFyZ3VtZW50cyhiYXNlVHlwZU5hbWUpO1xuICAgICAgY29uc3QgdHlwZVBhcmFtZXRlck1hcCA9IGJ1aWxkVHlwZVBhcmFtZXRlck1hcChiYXNlSW5mbywgdHlwZUFyZ3VtZW50cyk7XG5cbiAgICAgIGZvciAoY29uc3QgcHJvcGVydHkgb2YgYmFzZUluZm8ucHJvcGVydGllcykge1xuICAgICAgICBpZiAoaW5mby5wcm9wZXJ0aWVzLmV2ZXJ5KChwKSA9PiBwLm5hbWUgIT09IHByb3BlcnR5Lm5hbWUpKSB7XG4gICAgICAgICAgaW5mby5wcm9wZXJ0aWVzLnB1c2goc3Vic3RpdHV0ZU1lbWJlclR5cGVzKHsgLi4ucHJvcGVydHksIGluaGVyaXRlZEZyb206IGJhc2VJbmZvLm5hbWUgfSwgdHlwZVBhcmFtZXRlck1hcCkpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGZvciAoY29uc3QgbWV0aG9kIG9mIGJhc2VJbmZvLm1ldGhvZHMpIHtcbiAgICAgICAgY29uc3QgaW5oZXJpdGVkTWV0aG9kID0gc3Vic3RpdHV0ZU1lbWJlclR5cGVzKHsgLi4ubWV0aG9kLCBpbmhlcml0ZWRGcm9tOiBiYXNlSW5mby5uYW1lIH0sIHR5cGVQYXJhbWV0ZXJNYXApO1xuICAgICAgICBjb25zdCBoYXNNZXRob2QgPSBpbmZvLm1ldGhvZHMuc29tZSgobSkgPT4gbS5uYW1lID09PSBpbmhlcml0ZWRNZXRob2QubmFtZSAmJiBtLnNpZ25hdHVyZSA9PT0gaW5oZXJpdGVkTWV0aG9kLnNpZ25hdHVyZSk7XG4gICAgICAgIGlmICghaGFzTWV0aG9kKSB7XG4gICAgICAgICAgaW5mby5tZXRob2RzLnB1c2goaW5oZXJpdGVkTWV0aG9kKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICByZXNvbHZpbmcuZGVsZXRlKGluZm8pO1xuICAgIHJlc29sdmVkLmFkZChpbmZvKTtcbiAgfVxufVxuXG4vKipcbiAqIEFwcGx5IHR5cGUgcGFyYW1ldGVyIHN1YnN0aXR1dGlvbiB0byBhbGwgdHlwZS1iZWFyaW5nIGZpZWxkcyBvZiBhIG1lbWJlclxuICpcbiAqIEBwYXJhbSBtZW1iZXIgLSBUaGUgbWVtYmVyLlxuICogQHBhcmFtIG1hcHBpbmcgLSBUeXBlIHBhcmFtZXRlciBuYW1lcyBtYXBwZWQgdG8gdGhlaXIgYXJndW1lbnRzLlxuICogQHJldHVybnMgVGhlIG1lbWJlciB3aXRoIGl0cyB0eXBlcyBzdWJzdGl0dXRlZC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHN1YnN0aXR1dGVNZW1iZXJUeXBlcyhtZW1iZXI6IE1lbWJlckluZm8sIG1hcHBpbmc6IE1hcDxzdHJpbmcsIHN0cmluZz4pOiBNZW1iZXJJbmZvIHtcbiAgcmV0dXJuIG1hcHBpbmcuc2l6ZSA9PT0gMFxuICAgID8gbWVtYmVyXG4gICAgOiB7XG4gICAgICAuLi5tZW1iZXIsXG4gICAgICBwYXJhbWV0ZXJzOiBtZW1iZXIucGFyYW1ldGVycy5tYXAoKHApID0+ICh7XG4gICAgICAgIC4uLnAsXG4gICAgICAgIHR5cGU6IHN1YnN0aXR1dGVUeXBlUGFyYW1zKHAudHlwZSwgbWFwcGluZylcbiAgICAgIH0pKSxcbiAgICAgIHJldHVyblR5cGU6IHN1YnN0aXR1dGVUeXBlUGFyYW1zKG1lbWJlci5yZXR1cm5UeXBlLCBtYXBwaW5nKSxcbiAgICAgIHNpZ25hdHVyZTogc3Vic3RpdHV0ZVR5cGVQYXJhbXMobWVtYmVyLnNpZ25hdHVyZSwgbWFwcGluZyksXG4gICAgICB0eXBlOiBzdWJzdGl0dXRlVHlwZVBhcmFtcyhtZW1iZXIudHlwZSwgbWFwcGluZylcbiAgICB9O1xufVxuXG4vKipcbiAqIFN1YnN0aXR1dGUgZ2VuZXJpYyB0eXBlIHBhcmFtZXRlcnMgaW4gYSB0eXBlIHN0cmluZyB1c2luZyBhIG1hcHBpbmdcbiAqXG4gKiBAcGFyYW0gdHlwZVRleHQgLSBUaGUgdHlwZSB0ZXh0LlxuICogQHBhcmFtIG1hcHBpbmcgLSBUeXBlIHBhcmFtZXRlciBuYW1lcyBtYXBwZWQgdG8gdGhlaXIgYXJndW1lbnRzLlxuICogQHJldHVybnMgVGhlIHN1YnN0aXR1dGVkIHR5cGUgdGV4dC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHN1YnN0aXR1dGVUeXBlUGFyYW1zKHR5cGVUZXh0OiBzdHJpbmcsIG1hcHBpbmc6IE1hcDxzdHJpbmcsIHN0cmluZz4pOiBzdHJpbmcge1xuICByZXR1cm4gbWFwcGluZy5zaXplID09PSAwXG4gICAgPyB0eXBlVGV4dFxuICAgIDogdHlwZVRleHQucmVwbGFjZUFsbCgvXFxiKD88dHlwZU5hbWU+W2EtekEtWl1bYS16QS1aMC05XSopXFxiL2csIChtYXRjaCkgPT4ge1xuICAgICAgcmV0dXJuIG1hcHBpbmcuZ2V0KG1hdGNoKSA/PyBtYXRjaDtcbiAgICB9KTtcbn1cbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFTQSx5QkFBa0M7QUFPbEMsb0NBQXlCO0FBV2xCLFNBQVMsc0JBQXNCLFVBQW9CLGVBQThDO0FBQ3RHLFFBQU0sVUFBVSxvQkFBSSxJQUFvQjtBQUN4QyxRQUFNLFFBQVEsS0FBSyxJQUFJLFNBQVMsZUFBZSxRQUFRLGNBQWMsTUFBTTtBQUMzRSxXQUFTLFFBQVEsR0FBRyxRQUFRLE9BQU8sU0FBUztBQUUxQyxVQUFNLGdCQUFZLHNDQUFrQixTQUFTLGVBQWUsS0FBSyxDQUFDO0FBQ2xFLFVBQU0sZUFBVyxzQ0FBa0IsY0FBYyxLQUFLLENBQUM7QUFDdkQsVUFBTSxnQkFBZ0IsVUFBVSxRQUFRLG9CQUFvQixFQUFFO0FBQzlELFlBQVEsSUFBSSxlQUFlLFFBQVE7QUFBQSxFQUNyQztBQUNBLFNBQU87QUFDVDtBQVVPLFNBQVMsbUJBQW1CLGNBQWdDO0FBQ2pFLFFBQU0sWUFBWSxhQUFhLFFBQVEsR0FBRztBQUMxQyxNQUFJLGNBQWMsSUFBSTtBQUNwQixXQUFPLENBQUM7QUFBQSxFQUNWO0FBQ0EsUUFB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
@@ -121,7 +121,16 @@ function memberHref(memberSlugString, inheritedFrom, allTypes, currentNamespace)
121
121
  if (!inheritedFrom) {
122
122
  return `./${memberSlugString}/`;
123
123
  }
124
- const parentInfo = findType(allTypes, inheritedFrom, currentNamespace);
124
+ let parentInfo = findType(allTypes, inheritedFrom, currentNamespace);
125
+ const visited = /* @__PURE__ */ new Set();
126
+ while (parentInfo && !doesMemberPageExist(parentInfo.namespace, parentInfo.name, memberSlugString)) {
127
+ if (visited.has(parentInfo)) {
128
+ return "";
129
+ }
130
+ visited.add(parentInfo);
131
+ const member = parentInfo.properties.find((property) => memberRouteSegment(property.name) === memberSlugString) ?? parentInfo.methods.find((method) => overloadRouteSegment(method.overloadKey) === memberSlugString);
132
+ parentInfo = member?.inheritedFrom ? findType(allTypes, member.inheritedFrom, parentInfo.namespace) : void 0;
133
+ }
125
134
  if (!parentInfo || !doesMemberPageExist(parentInfo.namespace, parentInfo.name, memberSlugString)) {
126
135
  return "";
127
136
  }
@@ -353,4 +362,4 @@ export {
353
362
  typeHref,
354
363
  typeLink
355
364
  };
356
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9kb2NzLXNpdGUvYXBpLWRvYy1saW5rLXJlbmRlcmluZy50cyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBmaWxlXG4gKlxuICogVHlwZS1saW5rIHJlbmRlcmluZzogdHVybnMgdHlwZSB0ZXh0IGFuZCBpbmxpbmUgbGluayB0YWdzIGludG8gbWFya2Rvd24gbGlua3MgdG8gZ2VuZXJhdGVkIHBhZ2VzXG4gKiBvciBleHRlcm5hbCByZWZlcmVuY2VzIChUeXBlU2NyaXB0IGhhbmRib29rLCBNRE4gV2ViIEFQSSwgSlMgZ2xvYmFscykuXG4gKi9cblxuaW1wb3J0IHtcbiAgZ2V0TWFuZGF0b3J5TmFtZWRHcm91cCxcbiAgZ2V0T3B0aW9uYWxOYW1lZEdyb3VwXG59IGZyb20gJ0BtbmFvdW1vdi90eXBlc2NyaXB0LWxpYi9yZWctZXhwJztcbmltcG9ydCB7IHJlYWRGaWxlU3luYyB9IGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHsgam9pbiB9IGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCB0eXBlIHtcbiAgVHlwZUluZm8sXG4gIFdlYkFwaUVudHJ5XG59IGZyb20gJy4vYXBpLWRvYy10eXBlcy50cyc7XG5cbmltcG9ydCB7XG4gIEdFTkVSSUNfVFlQRV9QQVJBTVMsXG4gIFRTX0dMT0JBTF9UWVBFUyxcbiAgVFNfUFJJTUlUSVZFX1RZUEVTLFxuICBUU19VVElMSVRZX1RZUEVTXG59IGZyb20gJy4vYXBpLWRvYy1jb25zdGFudHMudHMnO1xuaW1wb3J0IHsgZ2V0UGFja2FnZVR5cGVVcmwgfSBmcm9tICcuL2FwaS1kb2MtcGFja2FnZS1zaXRlcy50cyc7XG5pbXBvcnQge1xuICB0b1JvdXRlU2VnbWVudCxcbiAgdG9Sb3V0ZVNlZ21lbnRQcmVzZXJ2ZUNhc2Vcbn0gZnJvbSAnLi9hcGktZG9jLXJvdXRlLXNlZ21lbnRzLnRzJztcbmltcG9ydCB7IGdldEFwaURvY1NldHRpbmdzIH0gZnJvbSAnLi9hcGktZG9jLXNldHRpbmdzLnRzJztcbmltcG9ydCB7XG4gIGVzY2FwZU1keEFuZ2xlQnJhY2tldHMsXG4gIGVzY2FwZU1keFByb3NlLFxuICBnZXROYW1lc3BhY2VEaXJlY3RvcnksXG4gIG1lbWJlclJvdXRlU2VnbWVudCxcbiAgbWVtYmVyU2x1ZyxcbiAgb3ZlcmxvYWRSb3V0ZVNlZ21lbnQsXG4gIG92ZXJsb2FkU2x1ZyxcbiAgcmVwbGFjZVJlZ0V4cE1hdGNoZXMsXG4gIHNlZ21lbnRNYXJrZG93blxufSBmcm9tICcuL2FwaS1kb2MtdGV4dC11dGlscy50cyc7XG5cbi8qKlxuTG9hZGVkIGZyb20gdHlwZWRvYy1wbHVnaW4tbWRuLWxpbmtzIGRhdGEgYXQgcnVudGltZVxuICovXG4vKipcbk1vZHVsZS1sZXZlbCBtdXRhYmxlIHN0YXRlLCBoZWxkIGluIG9uZSBvYmplY3Qgc28gZWFjaCBtdXRhdGlvbiBuYW1lcyBpdCBleHBsaWNpdGx5LlxuICovXG5pbnRlcmZhY2UgTW9kdWxlU3RhdGUge1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgdHlwZXNjcmlwdC1kZXYtdG9vbGtpdC9yZWFkb25seS1pbnRlcmZhY2UtbWVtYmVycyAtLSBUaGUgV2ViIEFQSSBtZXRhZGF0YSBjYWNoZSBpcyByZXBsYWNlZCBhZnRlciBsb2FkaW5nLlxuICB3ZWJBcGlUeXBlczogUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG59XG5cbmNvbnN0IG1vZHVsZVN0YXRlOiBNb2R1bGVTdGF0ZSA9IHtcbiAgd2ViQXBpVHlwZXM6IHt9XG59O1xuLyoqXG5Mb3dlcmNhc2VkLCBjb2xsaXNpb24tZGlzYW1iaWd1YXRlZCBPTi1ESVNLIHNlZ21lbnQgcGVyIHF1YWxpZmllZCB0eXBlIGtleSAoYCR7bmFtZXNwYWNlfSMke25hbWV9YCkuXG4gKi9cbmNvbnN0IHR5cGVGaWxlU2VnbWVudHMgPSBuZXcgTWFwPHN0cmluZywgc3RyaW5nPigpO1xuLyoqXG5DYXNlLXByZXNlcnZlZCBVUkwvcm91dGUgc2VnbWVudCBwZXIgcXVhbGlmaWVkIHR5cGUga2V5IChgJHtuYW1lc3BhY2V9IyR7bmFtZX1gKS5cbiAqL1xuY29uc3QgdHlwZVJvdXRlU2VnbWVudHMgPSBuZXcgTWFwPHN0cmluZywgc3RyaW5nPigpO1xuXG4vKipcbiAqIFJvdXRlLXNlZ21lbnQga2V5cyBvZiB0aGUgbWVtYmVyIHBhZ2VzIHRoYXQgYGdlbmVyYXRlTWVtYmVyUGFnZXNgIHdpbGwgYWN0dWFsbHkgZW1pdCwgYXNcbiAqIGAke25hbWVzcGFjZX0jJHtUeXBlTmFtZX0jJHtyb3V0ZVNlZ21lbnR9YC4gT25seSBOT04taW5oZXJpdGVkIHByb3BlcnRpZXMgYW5kIG5vbi1pbmhlcml0ZWQgbWV0aG9kXG4gKiBvdmVybG9hZCBrZXlzIGdldCBhIHBhZ2UsIHNvIHRoaXMgbGV0cyBsaW5rIGVtaXR0ZXJzIGF2b2lkIHBvaW50aW5nIGF0IGEgbWVtYmVyIHBhZ2UgdGhhdCBpcyBuZXZlclxuICogZ2VuZXJhdGVkIChhbiBpbmhlcml0ZWQgbWVtYmVyLCBhbiBlbnVtIG1lbWJlciwgYW4gb3B0aW9ucy1pbnRlcmZhY2UgbWVtYmVyKSDigJQgd2hpY2ggd291bGQgNDA0LlxuICovXG5jb25zdCBnZW5lcmF0ZWRNZW1iZXJQYWdlcyA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuXG4vKipcbiAqIFdoZXRoZXIgYSBtZW1iZXIgcGFnZSB3aWxsIGJlIGdlbmVyYXRlZCBmb3IgYHJvdXRlU2VnbWVudGAgb24gdGhlIGdpdmVuIHR5cGUuXG4gKlxuICogQHBhcmFtIG5hbWVzcGFjZSAtIFRoZSB0eXBlJ3MgbmFtZXNwYWNlLlxuICogQHBhcmFtIHR5cGVOYW1lIC0gVGhlIHR5cGUncyBuYW1lLlxuICogQHBhcmFtIHJvdXRlU2VnbWVudCAtIFRoZSBtZW1iZXIncyByb3V0ZSBzZWdtZW50LlxuICogQHJldHVybnMgV2hldGhlciB0aGUgcGFnZSBpcyBnZW5lcmF0ZWQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBkb2VzTWVtYmVyUGFnZUV4aXN0KG5hbWVzcGFjZTogc3RyaW5nLCB0eXBlTmFtZTogc3RyaW5nLCByb3V0ZVNlZ21lbnQ6IHN0cmluZyk6IGJvb2xlYW4ge1xuICByZXR1cm4gZ2VuZXJhdGVkTWVtYmVyUGFnZXMuaGFzKGAke25hbWVzcGFjZX0jJHt0eXBlTmFtZX0jJHtyb3V0ZVNlZ21lbnR9YCk7XG59XG5cbi8qKlxuICogUmVzb2x2ZSBhIGJhcmUgdHlwZSBuYW1lIHRvIGEgZG9jdW1lbnRlZCBgVHlwZUluZm9gLlxuICpcbiAqIFRoZSBtb2RlbCBtYXAgaXMga2V5ZWQgYnkgYSBxdWFsaWZpZWQgYCR7bmFtZXNwYWNlfSMke25hbWV9YCBpZGVudGl0eSwgYmVjYXVzZSBhIHBhY2thZ2VcbiAqIGNhbiBleHBvcnQgdGhlIHNhbWUgc2ltcGxlIG5hbWUgZnJvbSBkaWZmZXJlbnQgbW9kdWxlcy4gUmVzb2x1dGlvbiBpcyBiZXN0LWVmZm9ydDpcbiAqICAgMS4gUHJlZmVyIGEgdHlwZSBpbiBgY3VycmVudE5hbWVzcGFjZWAgKHRoZSByZWZlcmVuY2luZyBwYWdlJ3MgbW9kdWxlKS5cbiAqICAgMi4gT3RoZXJ3aXNlLCBpZiBleGFjdGx5IG9uZSB0eXBlIGFjcm9zcyBhbGwgbW9kdWxlcyBoYXMgdGhhdCBiYXJlIG5hbWUsIHVzZSBpdC5cbiAqICAgMy4gSWYgdGhlIGJhcmUgbmFtZSBpcyBhbWJpZ3VvdXMgKG11bHRpcGxlIG1vZHVsZXMpLCBnaXZlIHVwIChjYWxsZXIgcmVuZGVycyBwbGFpbiBjb2RlKS5cbiAqXG4gKiBAcGFyYW0gYWxsVHlwZXMgLSBFdmVyeSBkb2N1bWVudGVkIHR5cGUsIGtleWVkIGJ5IGAke25hbWVzcGFjZX0jJHtuYW1lfWAuXG4gKiBAcGFyYW0gbmFtZSAtIFRoZSB0eXBlJ3MgbmFtZS5cbiAqIEBwYXJhbSBjdXJyZW50TmFtZXNwYWNlIC0gVGhlIG5hbWVzcGFjZSBvZiB0aGUgcmVmZXJlbmNpbmcgcGFnZSwgcHJlZmVycmVkIHdoZW4gdGhlIG5hbWUgaXMgYW1iaWd1b3VzLlxuICogQHJldHVybnMgVGhlIHR5cGUsIG9yIGB1bmRlZmluZWRgIHdoZW4gbm8gdHlwZSBvciBtb3JlIHRoYW4gb25lIGhhcyB0aGF0IG5hbWUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBmaW5kVHlwZShhbGxUeXBlczogTWFwPHN0cmluZywgVHlwZUluZm8+LCBuYW1lOiBzdHJpbmcsIGN1cnJlbnROYW1lc3BhY2U/OiBzdHJpbmcpOiBUeXBlSW5mbyB8IHVuZGVmaW5lZCB7XG4gIGlmIChjdXJyZW50TmFtZXNwYWNlICE9PSB1bmRlZmluZWQpIHtcbiAgICBjb25zdCBxdWFsaWZpZWQgPSBhbGxUeXBlcy5nZXQoYCR7Y3VycmVudE5hbWVzcGFjZX0jJHtuYW1lfWApO1xuICAgIGlmIChxdWFsaWZpZWQpIHtcbiAgICAgIHJldHVybiBxdWFsaWZpZWQ7XG4gICAgfVxuICB9XG4gIGxldCBmb3VuZDogVHlwZUluZm8gfCB1bmRlZmluZWQ7XG4gIGxldCBtYXRjaENvdW50ID0gMDtcbiAgZm9yIChjb25zdCBpbmZvIG9mIGFsbFR5cGVzLnZhbHVlcygpKSB7XG4gICAgaWYgKGluZm8ubmFtZSAhPT0gbmFtZSkge1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgZm91bmQgPSBpbmZvO1xuICAgIG1hdGNoQ291bnQrKztcbiAgICBpZiAobWF0Y2hDb3VudCA+IDEpIHtcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuICB9XG4gIHJldHVybiBtYXRjaENvdW50ID09PSAxID8gZm91bmQgOiB1bmRlZmluZWQ7XG59XG5cbi8qKlxuICogTGluayBhIGJhc2UgdHlwZSBleHByZXNzaW9uIGZvciB0aGUgXCJFeHRlbmRzOlwiIGxpbmUuXG4gKiBTaW1wbGUgdHlwZSByZWZlcmVuY2VzIChpZGVudGlmaWVyICsgb3B0aW9uYWwgZ2VuZXJpY3MpIHVzZSByZW5kZXJUeXBlV2l0aExpbmtzXG4gKiBzbyBlYWNoIHR5cGUgYXJndW1lbnQgZ2V0cyBpdHMgb3duIGxpbmsuXG4gKiBDb21wbGV4IGV4cHJlc3Npb25zIChvYmplY3QgdHlwZXMsIGludGVyc2VjdGlvbnMsIGV0Yy4pIGZhbGwgYmFjayB0byB0eXBlTGlua1xuICogdG8gYXZvaWQgTURYIHBhcnNpbmcgaXNzdWVzIHdpdGggYHtgLCBgfWAsIGB8YCBldGMuXG4gKlxuICogQHBhcmFtIHR5cGVOYW1lIC0gVGhlIHR5cGUncyBuYW1lLlxuICogQHBhcmFtIGFsbFR5cGVzIC0gRXZlcnkgZG9jdW1lbnRlZCB0eXBlLCBrZXllZCBieSBgJHtuYW1lc3BhY2V9IyR7bmFtZX1gLlxuICogQHBhcmFtIGN1cnJlbnROYW1lc3BhY2UgLSBUaGUgbmFtZXNwYWNlIG9mIHRoZSByZWZlcmVuY2luZyBwYWdlLCBwcmVmZXJyZWQgd2hlbiB0aGUgbmFtZSBpcyBhbWJpZ3VvdXMuXG4gKiBAcmV0dXJucyBUaGUgbGlua2VkIHR5cGUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBsaW5rQmFzZVR5cGUodHlwZU5hbWU6IHN0cmluZywgYWxsVHlwZXM6IE1hcDxzdHJpbmcsIFR5cGVJbmZvPiwgY3VycmVudE5hbWVzcGFjZT86IHN0cmluZyk6IHN0cmluZyB7XG4gIGNvbnN0IGlzU2ltcGxlVHlwZVJlZiA9IC9eW2EtekEtWl1bYS16QS1aMC05XSooPzo8Lio+KT8kLy50ZXN0KHR5cGVOYW1lLnRyaW0oKSk7XG4gIHJldHVybiBpc1NpbXBsZVR5cGVSZWYgPyBlc2NhcGVNZHhBbmdsZUJyYWNrZXRzKHJlbmRlclR5cGVXaXRoTGlua3ModHlwZU5hbWUsIGFsbFR5cGVzLCB1bmRlZmluZWQsIGN1cnJlbnROYW1lc3BhY2UpKSA6IHR5cGVMaW5rKHR5cGVOYW1lLCBhbGxUeXBlcywgY3VycmVudE5hbWVzcGFjZSk7XG59XG5cbi8qKlxuICogTG9hZHMgdGhlIFdlYiBBUEkgbGlua3MgYHR5cGVkb2MtcGx1Z2luLW1kbi1saW5rc2Agc2hpcHMsIGlmIGl0IGlzIGluc3RhbGxlZC4gV2l0aG91dCBpdCwgV2ViIEFQSSB0eXBlcyByZW5kZXJcbiAqIHVubGlua2VkLlxuICpcbiAqIEBwYXJhbSByb290RGlyZWN0b3J5IC0gVGhlIGZvbGRlciB3aG9zZSBgbm9kZV9tb2R1bGVzYCBob2xkcyB0aGUgcGFja2FnZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGxvYWRFeHRlcm5hbFR5cGVNYXBzKHJvb3REaXJlY3Rvcnk6IHN0cmluZyk6IHZvaWQge1xuICB0cnkge1xuICAgIGNvbnN0IGRhdGFQYXRoID0gam9pbihyb290RGlyZWN0b3J5LCAnbm9kZV9tb2R1bGVzL3R5cGVkb2MtcGx1Z2luLW1kbi1saW5rcy9kYXRhL3dlYi1hcGkuanNvbicpO1xuICAgIG1vZHVsZVN0YXRlLndlYkFwaVR5cGVzID0gSlNPTi5wYXJzZShyZWFkRmlsZVN5bmMoZGF0YVBhdGgsICd1dGYtOCcpKSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgICBjb25zb2xlLndhcm4oYExvYWRlZCAke1N0cmluZyhPYmplY3Qua2V5cyhtb2R1bGVTdGF0ZS53ZWJBcGlUeXBlcykubGVuZ3RoKX0gV2ViIEFQSSB0eXBlIGxpbmtzYCk7XG4gIH0gY2F0Y2gge1xuICAgIG1vZHVsZVN0YXRlLndlYkFwaVR5cGVzID0ge307XG4gICAgY29uc29sZS53YXJuKCd0eXBlZG9jLXBsdWdpbi1tZG4tbGlua3MgZGF0YSBub3QgZm91bmQg4oCUIFdlYiBBUEkgbGlua3Mgd2lsbCBiZSB1bmF2YWlsYWJsZS4nKTtcbiAgfVxufVxuXG4vKipcbiAqIENvbnZlcnQgaW5saW5lIG1hcmtkb3duIHRvIEhUTUwgZm9yIHVzZSBpbiBjb21wb25lbnQgcHJvcHMgd2l0aCBzZXQ6aHRtbFxuICpcbiAqIEBwYXJhbSB0ZXh0IC0gVGhlIHRleHQuXG4gKiBAcmV0dXJucyBUaGUgSFRNTC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG1hcmtkb3duVG9IdG1sKHRleHQ6IHN0cmluZyk6IHN0cmluZyB7XG4gIGNvbnN0IGVzY2FwZWQgPSB0ZXh0XG4gICAgLnJlcGxhY2VBbGwoJyYnLCAnJmFtcDsnKVxuICAgIC5yZXBsYWNlQWxsKCc8JywgJyZsdDsnKVxuICAgIC5yZXBsYWNlQWxsKCc+JywgJyZndDsnKTtcbiAgcmV0dXJuIHJlcGxhY2VSZWdFeHBNYXRjaGVzKGVzY2FwZWQsIC9cXFsoPzx0ZXh0PlteXFxdXSspXFxdXFwoKD88dXJsPlteKV0rKVxcKS9nLCAobWF0Y2gpID0+IHtcbiAgICBjb25zdCBsaW5rVGV4dCA9IGdldE1hbmRhdG9yeU5hbWVkR3JvdXAobWF0Y2gsICd0ZXh0Jyk7XG4gICAgY29uc3QgdXJsID0gZ2V0TWFuZGF0b3J5TmFtZWRHcm91cChtYXRjaCwgJ3VybCcpO1xuICAgIC8vIEEgcmVsYXRpdmUgVVJMIGhlcmUgaXMgYW4gaWxsdXN0cmF0aXZlIGV4YW1wbGUgcGF0aCBpbiBUU0RvYyAoZS5nLiBgW2Zvb10oZm9vLnBuZylgKSwgbm90IGFcbiAgICAvLyByZWFsIG5hdmlnYWJsZSBsaW5rIOKAlCByZW5kZXIgaXQgYXMgbGl0ZXJhbCBpbmxpbmUgY29kZSBzbyBpdCBuZWl0aGVyIDQwNHMgbm9yIGxvc2VzIG1lYW5pbmcuXG4gICAgcmV0dXJuIC9eKD86aHR0cHM/OlxcL1xcL3xcXC98I3xtYWlsdG86KS8udGVzdCh1cmwpID8gYDxhIGhyZWY9XCIke3VybH1cIj4ke2xpbmtUZXh0fTwvYT5gIDogYDxjb2RlPlske2xpbmtUZXh0fV0oJHt1cmx9KTwvY29kZT5gO1xuICB9KVxuICAgIC5yZXBsYWNlQWxsKC9gKD88Y29kZT5bXmBdKylgL2csICc8Y29kZT4kPGNvZGU+PC9jb2RlPicpXG4gICAgLnJlcGxhY2VBbGwoJ1xcbicsICc8YnIvPicpO1xufVxuXG4vKipcbiAqIEJ1aWxkIHRoZSBocmVmIGZvciBhIG1lbWJlciwgcG9pbnRpbmcgdG8gdGhlIHBhcmVudCB0eXBlJ3MgcGFnZSBpZiBpbmhlcml0ZWRcbiAqXG4gKiBAcGFyYW0gbWVtYmVyU2x1Z1N0cmluZyAtIFRoZSBtZW1iZXIncyByb3V0ZSBzZWdtZW50LlxuICogQHBhcmFtIGluaGVyaXRlZEZyb20gLSBUaGUgbmFtZSBvZiB0aGUgdHlwZSB0aGUgbWVtYmVyIGlzIGluaGVyaXRlZCBmcm9tLCBvciBhbiBlbXB0eSBzdHJpbmcgZm9yIGFuIG93biBtZW1iZXIuXG4gKiBAcGFyYW0gYWxsVHlwZXMgLSBFdmVyeSBkb2N1bWVudGVkIHR5cGUsIGtleWVkIGJ5IGAke25hbWVzcGFjZX0jJHtuYW1lfWAuXG4gKiBAcGFyYW0gY3VycmVudE5hbWVzcGFjZSAtIFRoZSBuYW1lc3BhY2Ugb2YgdGhlIHJlZmVyZW5jaW5nIHBhZ2UsIHByZWZlcnJlZCB3aGVuIHRoZSBuYW1lIGlzIGFtYmlndW91cy5cbiAqIEByZXR1cm5zIFRoZSBsaW5rLCBvciBhbiBlbXB0eSBzdHJpbmcgd2hlbiBubyBwYWdlIGRvY3VtZW50cyB0aGUgbWVtYmVyLlxuICovXG5leHBvcnQgZnVuY3Rpb24gbWVtYmVySHJlZihtZW1iZXJTbHVnU3RyaW5nOiBzdHJpbmcsIGluaGVyaXRlZEZyb206IHN0cmluZywgYWxsVHlwZXM6IE1hcDxzdHJpbmcsIFR5cGVJbmZvPiwgY3VycmVudE5hbWVzcGFjZT86IHN0cmluZyk6IHN0cmluZyB7XG4gIGlmICghaW5oZXJpdGVkRnJvbSkge1xuICAgIC8vIE93biAobm9uLWluaGVyaXRlZCkgbWVtYmVyIOKAlCBgZ2VuZXJhdGVNZW1iZXJQYWdlc2AgYWx3YXlzIGVtaXRzIGl0cyBwYWdlIG9uIHRoaXMgc2FtZSBwYWdlLlxuICAgIHJldHVybiBgLi8ke21lbWJlclNsdWdTdHJpbmd9L2A7XG4gIH1cbiAgY29uc3QgcGFyZW50SW5mbyA9IGZpbmRUeXBlKGFsbFR5cGVzLCBpbmhlcml0ZWRGcm9tLCBjdXJyZW50TmFtZXNwYWNlKTtcbiAgaWYgKCFwYXJlbnRJbmZvIHx8ICFkb2VzTWVtYmVyUGFnZUV4aXN0KHBhcmVudEluZm8ubmFtZXNwYWNlLCBwYXJlbnRJbmZvLm5hbWUsIG1lbWJlclNsdWdTdHJpbmcpKSB7XG4gICAgLy8gVGhlIGRlY2xhcmluZyBwYXJlbnQgaGFzIG5vIGdlbmVyYXRlZCBwYWdlIGZvciB0aGlzIG1lbWJlciAoaXQgaW5oZXJpdGVkIHRoZSBtZW1iZXIgdG9vLCBvciBpc1xuICAgIC8vIHVuZG9jdW1lbnRlZCkuIFJldHVybiBubyBocmVmIHNvIHRoZSBjYWxsZXIgcmVuZGVycyBwbGFpbiB0ZXh0IGluc3RlYWQgb2YgYSBicm9rZW4gbGluay5cbiAgICByZXR1cm4gJyc7XG4gIH1cbiAgY29uc3QgcGFyZW50TnNEaXJlY3RvcnkgPSBnZXROYW1lc3BhY2VEaXJlY3RvcnkocGFyZW50SW5mby5uYW1lc3BhY2UpO1xuICByZXR1cm4gYCR7Z2V0QmFzZVBhdGgoKX0vYXBpLyR7cGFyZW50TnNEaXJlY3Rvcnl9LyR7dG9UeXBlUm91dGVTZWdtZW50KHBhcmVudEluZm8ubmFtZXNwYWNlLCBwYXJlbnRJbmZvLm5hbWUpfS8ke21lbWJlclNsdWdTdHJpbmd9L2A7XG59XG5cbi8qKlxuICogUG9wdWxhdGUge0BsaW5rIGRvZXNNZW1iZXJQYWdlRXhpc3R9LiBNaXJyb3JzIGBnZW5lcmF0ZU1lbWJlclBhZ2VzYCdzIG93biBmaWx0ZXJpbmcgZXhhY3RseSAob25lIHBhZ2VcbiAqIHBlciBub24taW5oZXJpdGVkIHByb3BlcnR5LCBvbmUgcGVyIG5vbi1pbmhlcml0ZWQgbWV0aG9kIG92ZXJsb2FkIGtleSkuIE11c3QgcnVuIG9uY2UgYmVmb3JlIGFueVxuICogbGluayBpcyByZW5kZXJlZC5cbiAqXG4gKiBAcGFyYW0gdHlwZXMgLSBUaGUgZG9jdW1lbnRlZCB0eXBlcywga2V5ZWQgYnkgcXVhbGlmaWVkIGlkLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVnaXN0ZXJNZW1iZXJQYWdlcyh0eXBlczogTWFwPHN0cmluZywgVHlwZUluZm8+KTogdm9pZCB7XG4gIGdlbmVyYXRlZE1lbWJlclBhZ2VzLmNsZWFyKCk7XG4gIGZvciAoY29uc3QgaW5mbyBvZiB0eXBlcy52YWx1ZXMoKSkge1xuICAgIGZvciAoY29uc3QgcHJvcGVydHkgb2YgaW5mby5wcm9wZXJ0aWVzKSB7XG4gICAgICBpZiAoIXByb3BlcnR5LmluaGVyaXRlZEZyb20pIHtcbiAgICAgICAgZ2VuZXJhdGVkTWVtYmVyUGFnZXMuYWRkKGAke2luZm8ubmFtZXNwYWNlfSMke2luZm8ubmFtZX0jJHttZW1iZXJSb3V0ZVNlZ21lbnQocHJvcGVydHkubmFtZSl9YCk7XG4gICAgICB9XG4gICAgfVxuICAgIGNvbnN0IG92ZXJsb2FkS2V5cyA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuICAgIGZvciAoY29uc3QgbWV0aG9kIG9mIGluZm8ubWV0aG9kcykge1xuICAgICAgaWYgKCFtZXRob2QuaW5oZXJpdGVkRnJvbSkge1xuICAgICAgICBvdmVybG9hZEtleXMuYWRkKG1ldGhvZC5vdmVybG9hZEtleSk7XG4gICAgICB9XG4gICAgfVxuICAgIGZvciAoY29uc3Qgb3ZlcmxvYWRLZXkgb2Ygb3ZlcmxvYWRLZXlzKSB7XG4gICAgICBnZW5lcmF0ZWRNZW1iZXJQYWdlcy5hZGQoYCR7aW5mby5uYW1lc3BhY2V9IyR7aW5mby5uYW1lfSMke292ZXJsb2FkUm91dGVTZWdtZW50KG92ZXJsb2FkS2V5KX1gKTtcbiAgICB9XG4gIH1cbn1cblxuLyoqXG4gKiBGb3IgZXZlcnkgZG9jdW1lbnRlZCB0eXBlIGFzc2lnbiBCT1RIOlxuICogIC0gYSBsb3dlcmNhc2VkLCBudW1lcmljYWxseS1kaXNhbWJpZ3VhdGVkIEZJTEUgc2VnbWVudCAoc28gYFR5cGVBc3NlcnRlcmAgdnMgYHR5cGVBc3NlcnRlcmAsIHdoaWNoXG4gKiAgICBib3RoIGxvd2VyY2FzZSB0byBgdHlwZWFzc2VydGVyYCwgYmVjb21lIGB0eXBlYXNzZXJ0ZXJgIC8gYHR5cGVhc3NlcnRlci0yYCBvbiBkaXNrIGFuZCBuZXZlclxuICogICAgY29sbGlkZSBvbiBXaW5kb3dzJyBjYXNlLWluc2Vuc2l0aXZlIGZpbGVzeXN0ZW0pLCBhbmRcbiAqICAtIGEgY2FzZS1QUkVTRVJWRUQgUk9VVEUgc2VnbWVudCAoYFR5cGVBc3NlcnRlcmAgLyBgdHlwZUFzc2VydGVyYCkgdXNlZCBmb3IgdGhlIGV4cGxpY2l0IGBzbHVnOmBcbiAqICAgIGZyb250bWF0dGVyIGFuZCBldmVyeSBpbnRlcm5hbCBsaW5rLCBzbyB0aGUgVVJMcyBzdGF5IHByZXR0eSBhbmQgbmF0dXJhbGx5IGRpc3RpbmN0LlxuICogVGhlIHJvdXRlIGRlY291cGxlcyBmcm9tIHRoZSBmaWxlIHBhdGggdmlhIHRoZSBgc2x1ZzpgIGZyb250bWF0dGVyLCBzbyBubyBgLTJgIHN1ZmZpeCBsZWFrcyBpbnRvXG4gKiBVUkxzLiBBbHNvIHdhcm5zIGFib3V0IG1lbWJlci1zbHVnIGNvbGxpc2lvbnMgd2l0aGluIGEgdHlwZS4gTXVzdCBydW4gb25jZSBiZWZvcmUgYW55IHBhZ2UvbGluay5cbiAqXG4gKiBAcGFyYW0gdHlwZXMgLSBUaGUgZG9jdW1lbnRlZCB0eXBlcywga2V5ZWQgYnkgcXVhbGlmaWVkIGlkLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVnaXN0ZXJSb3V0ZVNlZ21lbnRzKHR5cGVzOiBNYXA8c3RyaW5nLCBUeXBlSW5mbz4pOiB2b2lkIHtcbiAgdHlwZUZpbGVTZWdtZW50cy5jbGVhcigpO1xuICB0eXBlUm91dGVTZWdtZW50cy5jbGVhcigpO1xuICBjb25zdCBieU5hbWVzcGFjZSA9IG5ldyBNYXA8c3RyaW5nLCBUeXBlSW5mb1tdPigpO1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgdW5pY29ybi9wcmVmZXItZ3JvdXAtYnkgLS0gYE1hcC5ncm91cEJ5YCBpcyBFUzIwMjQsIGFuZCB0aGUgc2hhcmVkIGB0c2NvbmZpZy5qc29uYCB0eXBlcyBvbmx5IEVTMjAyMi5cbiAgZm9yIChjb25zdCBpbmZvIG9mIHR5cGVzLnZhbHVlcygpKSB7XG4gICAgY29uc3QgbGlzdCA9IGJ5TmFtZXNwYWNlLmdldChpbmZvLm5hbWVzcGFjZSkgPz8gW107XG4gICAgbGlzdC5wdXNoKGluZm8pO1xuICAgIGJ5TmFtZXNwYWNlLnNldChpbmZvLm5hbWVzcGFjZSwgbGlzdCk7XG4gIH1cbiAgZm9yIChjb25zdCBbbmFtZXNwYWNlLCBpbmZvc10gb2YgYnlOYW1lc3BhY2UpIHtcbiAgICBjb25zdCB1c2VkRmlsZVNlZ21lbnRzID0gbmV3IFNldDxzdHJpbmc+KCk7XG4gICAgY29uc3QgdXNlZFJvdXRlU2VnbWVudHMgPSBuZXcgU2V0PHN0cmluZz4oKTtcbiAgICBjb25zdCBzb3J0ZWQgPSBbLi4uaW5mb3NdLnNvcnQoKGFscGhhLCBicmF2bykgPT4gYWxwaGEubmFtZS5sb2NhbGVDb21wYXJlKGJyYXZvLm5hbWUpKTtcbiAgICBmb3IgKGNvbnN0IGluZm8gb2Ygc29ydGVkKSB7XG4gICAgICB0eXBlRmlsZVNlZ21lbnRzLnNldChgJHtuYW1lc3BhY2V9IyR7aW5mby5uYW1lfWAsIGRpc2FtYmlndWF0ZSh0b1JvdXRlU2VnbWVudChpbmZvLm5hbWUpLCB1c2VkRmlsZVNlZ21lbnRzLCAoc2VnbWVudCkgPT4gc2VnbWVudCkpO1xuXG4gICAgICBjb25zdCByb3V0ZUJhc2UgPSB0b1JvdXRlU2VnbWVudFByZXNlcnZlQ2FzZShpbmZvLm5hbWUpO1xuICAgICAgLy8gRGlzYW1iaWd1YXRlIFJPVVRFUyBjYXNlLUlOU0VOU0lUSVZFTFk6IHRoZSBzbHVnIGJlY29tZXMgQXN0cm8ncyBvbi1kaXNrIG91dHB1dCBwYXRoLCBzb1xuICAgICAgLy8gYFR5cGVBc3NlcnRlcmAgYW5kIGB0eXBlQXNzZXJ0ZXJgIChzYW1lIG5hbWUgbW9kdWxvIGNhc2UpIHdvdWxkIGNvbGxpZGUgd2hlbiB0aGUgc2l0ZSBpcyBidWlsdFxuICAgICAgLy8gb24gYSBjYXNlLWluc2Vuc2l0aXZlIGZpbGVzeXN0ZW0gKFdpbmRvd3MvbWFjT1MpLCBzaWxlbnRseSBvdmVyd3JpdGluZyBvbmUgcGFnZSBzbyBldmVyeSBsaW5rXG4gICAgICAvLyB0byBpdCA0MDRzLiBDb21wYXJpbmcgbG93ZXJjYXNlZCBrZXlzIGZvcmNlcyB0aGUgc2Vjb25kIG9jY3VycmVuY2UgdG8gdGFrZSBhIGAtMmAgc3VmZml4LlxuICAgICAgY29uc3Qgcm91dGVTZWdtZW50ID0gZGlzYW1iaWd1YXRlKHJvdXRlQmFzZSwgdXNlZFJvdXRlU2VnbWVudHMsIChzZWdtZW50KSA9PiBzZWdtZW50LnRvTG93ZXJDYXNlKCkpO1xuICAgICAgdHlwZVJvdXRlU2VnbWVudHMuc2V0KGAke25hbWVzcGFjZX0jJHtpbmZvLm5hbWV9YCwgcm91dGVTZWdtZW50KTtcbiAgICAgIGlmIChyb3V0ZVNlZ21lbnQgIT09IHJvdXRlQmFzZSkge1xuICAgICAgICBjb25zb2xlLndhcm4oYERpc2FtYmlndWF0ZWQgUk9VVEUgZm9yIFwiJHtuYW1lc3BhY2V9IyR7aW5mby5uYW1lfVwiOiBcIiR7cm91dGVCYXNlfVwiIC0+IFwiJHtyb3V0ZVNlZ21lbnR9XCIgKHNsdWcgY29sbGlzaW9uKS5gKTtcbiAgICAgIH1cbiAgICAgIHdhcm5NZW1iZXJTbHVnQ29sbGlzaW9ucyhpbmZvLCBuYW1lc3BhY2UpO1xuICAgIH1cbiAgfVxufVxuXG4vKipcbiAqIFJlbmRlciBhbiBgQGV4YW1wbGVgIGJsb2NrIGFzIE1EWC4gSWYgdGhlIGV4YW1wbGUgYWxyZWFkeSBjb250YWlucyBhIGZlbmNlZCBjb2RlIGJsb2NrLCBpdCBpc1xuICogbm9ybWFsaXplZCB0aHJvdWdoIHtAbGluayByZW5kZXJNZHhQcm9zZX0gKGNvZGUgcHJlc2VydmVkIHJhdywgc3Vycm91bmRpbmcgcHJvc2UgZXNjYXBlZCk7XG4gKiBvdGhlcndpc2UgdGhlIHJhdyBleGFtcGxlIHRleHQgaXMgd3JhcHBlZCBpbiBhIGB0c2AgY29kZSBmZW5jZSBzbyBpdCBpcyBlbWl0dGVkIGxpdGVyYWxseS5cbiAqXG4gKiBAcGFyYW0gZXhhbXBsZSAtIFRoZSBgQGV4YW1wbGVgIHRleHQuXG4gKiBAcGFyYW0gYWxsVHlwZXMgLSBFdmVyeSBkb2N1bWVudGVkIHR5cGUsIGtleWVkIGJ5IGAke25hbWVzcGFjZX0jJHtuYW1lfWAuXG4gKiBAcGFyYW0gc2VsZk5hbWVzcGFjZSAtIFRoZSBuYW1lc3BhY2Ugb2YgdGhlIHBhZ2UgYmVpbmcgcmVuZGVyZWQsIHByZWZlcnJlZCB3aGVuIGEgbmFtZSBpcyBhbWJpZ3VvdXMuXG4gKiBAcmV0dXJucyBUaGUgTURYLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVuZGVyRXhhbXBsZU1keChleGFtcGxlOiBzdHJpbmcsIGFsbFR5cGVzOiBNYXA8c3RyaW5nLCBUeXBlSW5mbz4sIHNlbGZOYW1lc3BhY2U/OiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gLyg/Ol58XFxuKVxccyooPzpgYGB8fn5+KS8udGVzdChleGFtcGxlKSA/IHJlbmRlck1keFByb3NlKGV4YW1wbGUsIGFsbFR5cGVzLCBzZWxmTmFtZXNwYWNlKSA6IGBcXGBcXGBcXGB0c1xcbiR7ZXhhbXBsZX1cXG5cXGBcXGBcXGBgO1xufVxuXG4vKipcbiAqIFJlbmRlciBtYXJrZG93biBibG9jayB0ZXh0IChhIGRlc2NyaXB0aW9uLCByZW1hcmtzLCBvciBtb2R1bGUgb3ZlcnZpZXcpIGFzIE1EWC1zYWZlIG1hcmtkb3duLlxuICogRmVuY2VkIGNvZGUgYmxvY2tzIGFyZSByZS1lbWl0dGVkIHZlcmJhdGltIChzdXJyb3VuZGVkIGJ5IGJsYW5rIGxpbmVzLCB3aXRoIGEgbGFuZ3VhZ2UpOyBwcm9zZVxuICogc2VnbWVudHMgaGF2ZSB0aGVpciBpbmxpbmUgbGluayB0YWdzIHJlc29sdmVkIGFuZCB0aGVpciBNRFgtdW5zYWZlIGNoYXJhY3RlcnMgZXNjYXBlZC5cbiAqXG4gKiBAcGFyYW0gdGV4dCAtIFRoZSB0ZXh0LlxuICogQHBhcmFtIGFsbFR5cGVzIC0gRXZlcnkgZG9jdW1lbnRlZCB0eXBlLCBrZXllZCBieSBgJHtuYW1lc3BhY2V9IyR7bmFtZX1gLlxuICogQHBhcmFtIHNlbGZOYW1lc3BhY2UgLSBUaGUgbmFtZXNwYWNlIG9mIHRoZSBwYWdlIGJlaW5nIHJlbmRlcmVkLCBwcmVmZXJyZWQgd2hlbiBhIG5hbWUgaXMgYW1iaWd1b3VzLlxuICogQHJldHVybnMgVGhlIE1EWC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlbmRlck1keFByb3NlKHRleHQ6IHN0cmluZywgYWxsVHlwZXM6IE1hcDxzdHJpbmcsIFR5cGVJbmZvPiwgc2VsZk5hbWVzcGFjZT86IHN0cmluZyk6IHN0cmluZyB7XG4gIGNvbnN0IG91dDogc3RyaW5nW10gPSBbXTtcbiAgZm9yIChjb25zdCBzZWcgb2Ygc2VnbWVudE1hcmtkb3duKHRleHQpKSB7XG4gICAgaWYgKHNlZy50eXBlID09PSAnY29kZScpIHtcbiAgICAgIG91dC5wdXNoKCcnLCBgXFxgXFxgXFxgJHtzZWcubGFuZyB8fCAndHMnfWAsIHNlZy50ZXh0LCAnYGBgJywgJycpO1xuICAgIH0gZWxzZSB7XG4gICAgICBvdXQucHVzaChlc2NhcGVNZHhQcm9zZShyZXNvbHZlTGlua3Moc2VnLnRleHQsIGFsbFR5cGVzLCBzZWxmTmFtZXNwYWNlKSkpO1xuICAgIH1cbiAgfVxuICByZXR1cm4gb3V0LmpvaW4oJ1xcbicpLnJlcGxhY2VBbGwoL1xcbnszLH0vZywgJ1xcblxcbicpLnRyaW0oKTtcbn1cblxuLyoqXG4gKiBSZW5kZXIgYSB0eXBlIHN0cmluZyB3aXRoIGNsaWNrYWJsZSBsaW5rcyBmb3Iga25vd24gdHlwZXNcbiAqXG4gKiBAcGFyYW0gdHlwZVRleHQgLSBUaGUgdHlwZSB0ZXh0LlxuICogQHBhcmFtIGFsbFR5cGVzIC0gRXZlcnkgZG9jdW1lbnRlZCB0eXBlLCBrZXllZCBieSBgJHtuYW1lc3BhY2V9IyR7bmFtZX1gLlxuICogQHBhcmFtIHNlbGZUeXBlTmFtZSAtIFRoZSBuYW1lIG9mIHRoZSB0eXBlIHRoZSBwYWdlIGRvY3VtZW50cywgd2hpY2ggYHRoaXNgIGxpbmtzIHRvLlxuICogQHBhcmFtIHNlbGZOYW1lc3BhY2UgLSBUaGUgbmFtZXNwYWNlIG9mIHRoZSBwYWdlIGJlaW5nIHJlbmRlcmVkLCBwcmVmZXJyZWQgd2hlbiBhIG5hbWUgaXMgYW1iaWd1b3VzLlxuICogQHJldHVybnMgVGhlIHR5cGUgdGV4dCB3aXRoIG1hcmtkb3duIGxpbmtzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVuZGVyVHlwZVdpdGhMaW5rcyh0eXBlVGV4dDogc3RyaW5nLCBhbGxUeXBlczogTWFwPHN0cmluZywgVHlwZUluZm8+LCBzZWxmVHlwZU5hbWU/OiBzdHJpbmcsIHNlbGZOYW1lc3BhY2U/OiBzdHJpbmcpOiBzdHJpbmcge1xuICAvLyBQcmUtcGFzczogbGluayBPYmplY3QubWV0aG9kIHBhdHRlcm5zIHRvIE1ETiBiZWZvcmUgd29yZC1ieS13b3JkIGxpbmtpbmdcbiAgY29uc3QgTUROX09CSkVDVF9CQVNFID0gJ2h0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2RvY3MvV2ViL0phdmFTY3JpcHQvUmVmZXJlbmNlL0dsb2JhbF9PYmplY3RzL09iamVjdCc7XG4gIGNvbnN0IHdpdGhPYmplY3RNZXRob2RzID0gcmVwbGFjZVJlZ0V4cE1hdGNoZXModHlwZVRleHQsIC9cXGJPYmplY3RcXC4oPzxtZXRob2Q+W2EtekEtWl1bYS16QS1aMC05XSopXFxiL2csIChtYXRjaCkgPT4ge1xuICAgIGNvbnN0IG1ldGhvZCA9IGdldE1hbmRhdG9yeU5hbWVkR3JvdXAobWF0Y2gsICdtZXRob2QnKTtcbiAgICByZXR1cm4gYFtPYmplY3RdKCR7TUROX09CSkVDVF9CQVNFfSkuWyR7bWV0aG9kfV0oJHtNRE5fT0JKRUNUX0JBU0V9LyR7bWV0aG9kfSlgO1xuICB9KTtcbiAgLy8gTWFpbiBwYXNzOiBsaW5rIGluZGl2aWR1YWwgdHlwZSBuYW1lcywgc2tpcHBpbmcgdGV4dCBhbHJlYWR5IGluc2lkZSBtYXJrZG93biBsaW5rc1xuICByZXR1cm4gcmVwbGFjZVJlZ0V4cE1hdGNoZXMoXG4gICAgd2l0aE9iamVjdE1ldGhvZHMsXG4gICAgL1xcW1teXFxdXStcXF1cXChbXildK1xcKXxcXGIoPzx0eXBlTmFtZT5bYS16QS1aXVthLXpBLVowLTldKilcXGIvZyxcbiAgICAobWF0Y2gpID0+IHtcbiAgICAgIGNvbnN0IHR5cGVOYW1lID0gZ2V0T3B0aW9uYWxOYW1lZEdyb3VwKG1hdGNoLCAndHlwZU5hbWUnKTtcbiAgICAgIGlmICh0eXBlTmFtZSA9PT0gbnVsbCkge1xuICAgICAgICByZXR1cm4gbWF0Y2hbMF07XG4gICAgICB9XG4gICAgICAvLyBMaW5rIGB0aGlzYCByZXR1cm4gdHlwZSB0byB0aGUgY3VycmVudCB0eXBlJ3MgcGFnZVxuICAgICAgaWYgKHR5cGVOYW1lID09PSAndGhpcycgJiYgc2VsZlR5cGVOYW1lKSB7XG4gICAgICAgIGNvbnN0IHNlbGZJbmZvID0gZmluZFR5cGUoYWxsVHlwZXMsIHNlbGZUeXBlTmFtZSwgc2VsZk5hbWVzcGFjZSk7XG4gICAgICAgIGlmIChzZWxmSW5mbykge1xuICAgICAgICAgIHJldHVybiBgWyR7dHlwZU5hbWV9XSgke3R5cGVIcmVmKHNlbGZJbmZvKX0pYDtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBTa2lwIGdlbmVyaWMgdHlwZSBwYXJhbWV0ZXJzXG4gICAgICBpZiAoR0VORVJJQ19UWVBFX1BBUkFNUy5oYXModHlwZU5hbWUpKSB7XG4gICAgICAgIHJldHVybiB0eXBlTmFtZTtcbiAgICAgIH1cblxuICAgICAgLy8gQ2hlY2sgb3VyIG93biB0eXBlcyBmaXJzdFxuICAgICAgY29uc3QgaW5mbyA9IGZpbmRUeXBlKGFsbFR5cGVzLCB0eXBlTmFtZSwgc2VsZk5hbWVzcGFjZSk7XG4gICAgICBpZiAoaW5mbykge1xuICAgICAgICByZXR1cm4gYFske3R5cGVOYW1lfV0oJHt0eXBlSHJlZihpbmZvKX0pYDtcbiAgICAgIH1cblxuICAgICAgLy8gQSB0eXBlIGFub3RoZXIgZG9jdW1lbnRlZCBwYWNrYWdlIGRlY2xhcmVzLCBvciBvbmUgdGhlIHNpdGUgbWFwcyBpdHNlbGZcbiAgICAgIGNvbnN0IGV4dGVybmFsVXJsID0gcmVzb2x2ZUV4dGVybmFsVHlwZVVybCh0eXBlTmFtZSk7XG4gICAgICBpZiAoZXh0ZXJuYWxVcmwpIHtcbiAgICAgICAgcmV0dXJuIGBbJHt0eXBlTmFtZX1dKCR7ZXh0ZXJuYWxVcmx9KWA7XG4gICAgICB9XG5cbiAgICAgIC8vIFR5cGVTY3JpcHQgdXRpbGl0eSB0eXBlc1xuICAgICAgY29uc3QgdHNVcmwgPSByZXNvbHZlVHNVdGlsaXR5VXJsKHR5cGVOYW1lKTtcbiAgICAgIGlmICh0c1VybCkge1xuICAgICAgICByZXR1cm4gYFske3R5cGVOYW1lfV0oJHt0c1VybH0pYDtcbiAgICAgIH1cblxuICAgICAgLy8gSlMgZ2xvYmFsIHR5cGVzIChBcnJheSwgUHJvbWlzZSwgTWFwLCBldGMuKVxuICAgICAgY29uc3QgZ2xvYmFsVXJsID0gT2JqZWN0Lmhhc093bihUU19HTE9CQUxfVFlQRVMsIHR5cGVOYW1lKSA/IFRTX0dMT0JBTF9UWVBFU1t0eXBlTmFtZV0gOiB1bmRlZmluZWQ7XG4gICAgICBpZiAoZ2xvYmFsVXJsKSB7XG4gICAgICAgIHJldHVybiBgWyR7dHlwZU5hbWV9XSgke2dsb2JhbFVybH0pYDtcbiAgICAgIH1cblxuICAgICAgLy8gV2ViIEFQSSAvIE1ETiB0eXBlc1xuICAgICAgY29uc3QgbWRuVXJsID0gcmVzb2x2ZVdlYkFwaVVybCh0eXBlTmFtZSk7XG4gICAgICBpZiAobWRuVXJsKSB7XG4gICAgICAgIHJldHVybiBgWyR7dHlwZU5hbWV9XSgke21kblVybH0pYDtcbiAgICAgIH1cblxuICAgICAgLy8gVHlwZVNjcmlwdCBwcmltaXRpdmUgdHlwZXNcbiAgICAgIGNvbnN0IHByaW1pdGl2ZVVybCA9IE9iamVjdC5oYXNPd24oVFNfUFJJTUlUSVZFX1RZUEVTLCB0eXBlTmFtZSkgPyBUU19QUklNSVRJVkVfVFlQRVNbdHlwZU5hbWVdIDogdW5kZWZpbmVkO1xuICAgICAgcmV0dXJuIHByaW1pdGl2ZVVybCA/IGBbJHt0eXBlTmFtZX1dKCR7cHJpbWl0aXZlVXJsfSlgIDogdHlwZU5hbWU7XG4gICAgfVxuICApO1xufVxuXG4vKipcbiAqIFJlc29sdmUgYSB0eXBlIG5vIHBhZ2Ugb2YgdGhpcyBzaXRlIGRvY3VtZW50cyB0byB0aGUgcGFnZSB0aGF0IGRvZXM6IGFub3RoZXIgZG9jdW1lbnRlZCBwYWNrYWdlJ3Mgc2l0ZSwgb3IgYW5cbiAqIGVudHJ5IG9mIHRoZSBzaXRlJ3Mgb3duIGBleHRlcm5hbFR5cGVMaW5rc2Agc2V0dGluZy5cbiAqXG4gKiBAcGFyYW0gbmFtZSAtIFRoZSB0eXBlJ3MgbmFtZS5cbiAqIEByZXR1cm5zIFRoZSBVUkwsIG9yIGB1bmRlZmluZWRgIHdoZW4gbmVpdGhlciBrbm93cyB0aGUgdHlwZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlc29sdmVFeHRlcm5hbFR5cGVVcmwobmFtZTogc3RyaW5nKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgcmV0dXJuIGdldFBhY2thZ2VUeXBlVXJsKG5hbWUpID8/IGdldEFwaURvY1NldHRpbmdzKCkuZXh0ZXJuYWxUeXBlTGlua3MuZ2V0KG5hbWUpO1xufVxuXG4vKipcbiAqIFJlc29sdmUgYEBsaW5rYCB0YWdzLCB3aXRoIG9yIHdpdGhvdXQgYSBgfCBkaXNwbGF5IHRleHRgIHBhcnQsIGluIGRlc2NyaXB0aW9uIHRleHRcbiAqXG4gKiBAcGFyYW0gdGV4dCAtIFRoZSB0ZXh0LlxuICogQHBhcmFtIGFsbFR5cGVzIC0gRXZlcnkgZG9jdW1lbnRlZCB0eXBlLCBrZXllZCBieSBgJHtuYW1lc3BhY2V9IyR7bmFtZX1gLlxuICogQHBhcmFtIHNlbGZOYW1lc3BhY2UgLSBUaGUgbmFtZXNwYWNlIG9mIHRoZSBwYWdlIGJlaW5nIHJlbmRlcmVkLCBwcmVmZXJyZWQgd2hlbiBhIG5hbWUgaXMgYW1iaWd1b3VzLlxuICogQHJldHVybnMgVGhlIHRleHQgd2l0aCBtYXJrZG93biBsaW5rcy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlc29sdmVMaW5rcyh0ZXh0OiBzdHJpbmcsIGFsbFR5cGVzOiBNYXA8c3RyaW5nLCBUeXBlSW5mbz4sIHNlbGZOYW1lc3BhY2U/OiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gcmVwbGFjZVJlZ0V4cE1hdGNoZXModGV4dCwgL1xce0BsaW5rXFxzKyg/PHRhcmdldD5bXnx9XSs/KSg/OlxccypcXHxcXHMqKD88ZGlzcGxheT5bXn1dKz8pKT9cXH0vZywgKG1hdGNoKSA9PiB7XG4gICAgY29uc3QgdGFyZ2V0ID0gZ2V0TWFuZGF0b3J5TmFtZWRHcm91cChtYXRjaCwgJ3RhcmdldCcpLnRyaW0oKTtcbiAgICBjb25zdCBkaXNwbGF5ID0gKGdldE9wdGlvbmFsTmFtZWRHcm91cChtYXRjaCwgJ2Rpc3BsYXknKT8udHJpbSgpID8/IHRhcmdldCkucmVwbGFjZUFsbCgvXFxcXCg/PVs8Pnt9XSkvZywgJycpO1xuXG4gICAgLy8gSGFuZGxlIFR5cGUubWVtYmVyIHJlZmVyZW5jZXMgKGUuZy4sIFBsdWdpbk5vdGljZUNvbXBvbmVudC5zaG93Tm90aWNlKVxuICAgIGNvbnN0IGRvdE1hdGNoID0gL14oPzx0eXBlTmFtZT5bQS1aYS16XVxcdyopXFwuKD88bWVtYmVyTmFtZT5cXHcrKSQvLmV4ZWModGFyZ2V0KTtcbiAgICBpZiAoZG90TWF0Y2gpIHtcbiAgICAgIGNvbnN0IHR5cGVOYW1lID0gZ2V0TWFuZGF0b3J5TmFtZWRHcm91cChkb3RNYXRjaCwgJ3R5cGVOYW1lJyk7XG4gICAgICBjb25zdCBtZW1iZXJOYW1lID0gZ2V0TWFuZGF0b3J5TmFtZWRHcm91cChkb3RNYXRjaCwgJ21lbWJlck5hbWUnKTtcbiAgICAgIGNvbnN0IHR5cGVJbmZvID0gZmluZFR5cGUoYWxsVHlwZXMsIHR5cGVOYW1lLCBzZWxmTmFtZXNwYWNlKTtcbiAgICAgIGlmICh0eXBlSW5mbyAmJiBkb2VzTWVtYmVyUGFnZUV4aXN0KHR5cGVJbmZvLm5hbWVzcGFjZSwgdHlwZUluZm8ubmFtZSwgbWVtYmVyUm91dGVTZWdtZW50KG1lbWJlck5hbWUpKSkge1xuICAgICAgICBjb25zdCB0YXJnZXROc0RpcmVjdG9yeSA9IGdldE5hbWVzcGFjZURpcmVjdG9yeSh0eXBlSW5mby5uYW1lc3BhY2UpO1xuICAgICAgICByZXR1cm4gYFske2Rpc3BsYXl9XSgke2dldEJhc2VQYXRoKCl9L2FwaS8ke3RhcmdldE5zRGlyZWN0b3J5fS8ke3RvVHlwZVJvdXRlU2VnbWVudCh0eXBlSW5mby5uYW1lc3BhY2UsIHR5cGVJbmZvLm5hbWUpfS8ke21lbWJlclJvdXRlU2VnbWVudChtZW1iZXJOYW1lKX0vKWA7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gSGFuZGxlIHNpbXBsZSB0eXBlIHJlZmVyZW5jZXMg4oCUIGlmIGRpc3BsYXkgY29udGFpbnMgZ2VuZXJpYyBhcmdzLCBsaW5rIGVhY2ggdHlwZSBpbmRpdmlkdWFsbHlcbiAgICBjb25zdCBpbmZvID0gZmluZFR5cGUoYWxsVHlwZXMsIHRhcmdldCwgc2VsZk5hbWVzcGFjZSk7XG4gICAgaWYgKGluZm8pIHtcbiAgICAgIHJldHVybiBkaXNwbGF5ICE9PSB0YXJnZXQgJiYgZGlzcGxheS5pbmNsdWRlcygnPCcpID8gcmVuZGVyVHlwZVdpdGhMaW5rcyhkaXNwbGF5LCBhbGxUeXBlcywgdW5kZWZpbmVkLCBzZWxmTmFtZXNwYWNlKSA6IGBbJHtkaXNwbGF5fV0oJHt0eXBlSHJlZihpbmZvKX0pYDtcbiAgICB9XG5cbiAgICBjb25zdCBleHRlcm5hbFVybCA9IHJlc29sdmVFeHRlcm5hbFR5cGVVcmwodGFyZ2V0KTtcbiAgICByZXR1cm4gZXh0ZXJuYWxVcmwgPyBgWyR7ZGlzcGxheX1dKCR7ZXh0ZXJuYWxVcmx9KWAgOiBgXFxgJHtkaXNwbGF5fVxcYGA7XG4gIH0pO1xufVxuXG4vKipcbiAqIFJlc29sdmVzIGEgVHlwZVNjcmlwdCB1dGlsaXR5IHR5cGUgdG8gaXRzIGhhbmRib29rIGVudHJ5LlxuICpcbiAqIEBwYXJhbSBuYW1lIC0gVGhlIHR5cGUncyBuYW1lLlxuICogQHJldHVybnMgVGhlIGhhbmRib29rIFVSTCwgb3IgYHVuZGVmaW5lZGAgd2hlbiBpdCBpcyBub3QgYSB1dGlsaXR5IHR5cGUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZXNvbHZlVHNVdGlsaXR5VXJsKG5hbWU6IHN0cmluZyk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IGhhc2ggPSBUU19VVElMSVRZX1RZUEVTLmdldChuYW1lKTtcbiAgaWYgKGhhc2gpIHtcbiAgICBpZiAoWydJdGVyYWJsZSddLmluY2x1ZGVzKG5hbWUpKSB7XG4gICAgICByZXR1cm4gYGh0dHBzOi8vd3d3LnR5cGVzY3JpcHRsYW5nLm9yZy9kb2NzL2hhbmRib29rL2l0ZXJhdG9ycy1hbmQtZ2VuZXJhdG9ycy5odG1sIyR7aGFzaH1gO1xuICAgIH1cbiAgICBjb25zdCBoYW5kYm9va1BhZ2UgPSBbJ0NhcGl0YWxpemUnLCAnTG93ZXJjYXNlJywgJ1VuY2FwaXRhbGl6ZScsICdVcHBlcmNhc2UnXS5pbmNsdWRlcyhuYW1lKSA/ICcyL3RlbXBsYXRlLWxpdGVyYWwtdHlwZXMnIDogJ3V0aWxpdHktdHlwZXMnOyAvLyBDc3BlbGw6ZGlzYWJsZS1saW5lXG4gICAgcmV0dXJuIGBodHRwczovL3d3dy50eXBlc2NyaXB0bGFuZy5vcmcvZG9jcy9oYW5kYm9vay8ke2hhbmRib29rUGFnZX0uaHRtbCMke2hhc2h9YDtcbiAgfVxuICByZXR1cm4gdW5kZWZpbmVkO1xufVxuXG4vKipcbiAqIFJlc29sdmVzIGEgV2ViIEFQSSB0eXBlIHRvIGl0cyBNRE4gcGFnZS5cbiAqXG4gKiBAcGFyYW0gbmFtZSAtIFRoZSB0eXBlJ3MgbmFtZS5cbiAqIEByZXR1cm5zIFRoZSBNRE4gVVJMLCBvciBgdW5kZWZpbmVkYCB3aGVuIGl0IGlzIG5vdCBhIGtub3duIFdlYiBBUEkgdHlwZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlc29sdmVXZWJBcGlVcmwobmFtZTogc3RyaW5nKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgaWYgKCFPYmplY3QuaGFzT3duKG1vZHVsZVN0YXRlLndlYkFwaVR5cGVzLCBuYW1lKSkge1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cbiAgY29uc3QgZW50cnkgPSBtb2R1bGVTdGF0ZS53ZWJBcGlUeXBlc1tuYW1lXTtcbiAgaWYgKHR5cGVvZiBlbnRyeSA9PT0gJ3N0cmluZycpIHtcbiAgICByZXR1cm4gZW50cnk7XG4gIH1cbiAgaWYgKHR5cGVvZiBlbnRyeSA9PT0gJ29iamVjdCcgJiYgZW50cnkgIT09IG51bGwgJiYgJ3VybCcgaW4gZW50cnkpIHtcbiAgICBjb25zdCB0eXBlZEVudHJ5ID0gZW50cnkgYXMgV2ViQXBpRW50cnk7XG4gICAgcmV0dXJuIHR5cGVkRW50cnkudXJsO1xuICB9XG4gIHJldHVybiB1bmRlZmluZWQ7XG59XG5cbi8qKlxuICogUmVzb2x2ZSB0aGUgbG93ZXJjYXNlZCBPTi1ESVNLIHNlZ21lbnQgZm9yIGEgdHlwZSAoZmlsZSBwYXRoICsgY29tcG9uZW50LWltcG9ydCByZWxhdGl2ZSBwYXRoKS5cbiAqXG4gKiBAcGFyYW0gbmFtZXNwYWNlIC0gVGhlIHR5cGUncyBuYW1lc3BhY2UuXG4gKiBAcGFyYW0gbmFtZSAtIFRoZSB0eXBlJ3MgbmFtZS5cbiAqIEByZXR1cm5zIFRoZSBzZWdtZW50LlxuICovXG5leHBvcnQgZnVuY3Rpb24gdG9UeXBlRmlsZVNlZ21lbnQobmFtZXNwYWNlOiBzdHJpbmcsIG5hbWU6IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiB0eXBlRmlsZVNlZ21lbnRzLmdldChgJHtuYW1lc3BhY2V9IyR7bmFtZX1gKSA/PyB0b1JvdXRlU2VnbWVudChuYW1lKTtcbn1cblxuLyoqXG4gKiBSZXNvbHZlIHRoZSBjYXNlLXByZXNlcnZlZCBVUkwvUk9VVEUgc2VnbWVudCBmb3IgYSB0eXBlIChzbHVnIGZyb250bWF0dGVyICsgaW50ZXJuYWwgbGlua3MpLlxuICpcbiAqIEBwYXJhbSBuYW1lc3BhY2UgLSBUaGUgdHlwZSdzIG5hbWVzcGFjZS5cbiAqIEBwYXJhbSBuYW1lIC0gVGhlIHR5cGUncyBuYW1lLlxuICogQHJldHVybnMgVGhlIHNlZ21lbnQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB0b1R5cGVSb3V0ZVNlZ21lbnQobmFtZXNwYWNlOiBzdHJpbmcsIG5hbWU6IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiB0eXBlUm91dGVTZWdtZW50cy5nZXQoYCR7bmFtZXNwYWNlfSMke25hbWV9YCkgPz8gdG9Sb3V0ZVNlZ21lbnRQcmVzZXJ2ZUNhc2UobmFtZSk7XG59XG5cbi8qKlxuICogQWJzb2x1dGUgbGluayB0byBhIHR5cGUncyBvdmVydmlldyBwYWdlLlxuICpcbiAqIEBwYXJhbSBpbmZvIC0gVGhlIGRvY3VtZW50ZWQgdHlwZS5cbiAqIEByZXR1cm5zIFRoZSBsaW5rLlxuICovXG5leHBvcnQgZnVuY3Rpb24gdHlwZUhyZWYoaW5mbzogVHlwZUluZm8pOiBzdHJpbmcge1xuICByZXR1cm4gYCR7Z2V0QmFzZVBhdGgoKX0vYXBpLyR7Z2V0TmFtZXNwYWNlRGlyZWN0b3J5KGluZm8ubmFtZXNwYWNlKX0vJHt0b1R5cGVSb3V0ZVNlZ21lbnQoaW5mby5uYW1lc3BhY2UsIGluZm8ubmFtZSl9L2A7XG59XG5cbi8qKlxuICogQ3JlYXRlIGFuIGFic29sdXRlIGxpbmsgdG8gYSB0eXBlIHBhZ2VcbiAqXG4gKiBAcGFyYW0gdHlwZU5hbWUgLSBUaGUgdHlwZSdzIG5hbWUuXG4gKiBAcGFyYW0gYWxsVHlwZXMgLSBFdmVyeSBkb2N1bWVudGVkIHR5cGUsIGtleWVkIGJ5IGAke25hbWVzcGFjZX0jJHtuYW1lfWAuXG4gKiBAcGFyYW0gY3VycmVudE5hbWVzcGFjZSAtIFRoZSBuYW1lc3BhY2Ugb2YgdGhlIHJlZmVyZW5jaW5nIHBhZ2UsIHByZWZlcnJlZCB3aGVuIHRoZSBuYW1lIGlzIGFtYmlndW91cy5cbiAqIEByZXR1cm5zIEEgbWFya2Rvd24gbGluaywgb3IgaW5saW5lIGNvZGUgd2hlbiB0aGUgdHlwZSBpcyBub3QgZG9jdW1lbnRlZC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHR5cGVMaW5rKHR5cGVOYW1lOiBzdHJpbmcsIGFsbFR5cGVzOiBNYXA8c3RyaW5nLCBUeXBlSW5mbz4sIGN1cnJlbnROYW1lc3BhY2U/OiBzdHJpbmcpOiBzdHJpbmcge1xuICBjb25zdCBjbGVhbk5hbWUgPSB0eXBlTmFtZS5yZXBsYWNlKC88Lio+JC8sICcnKS50cmltKCk7XG4gIGNvbnN0IGluZm8gPSBmaW5kVHlwZShhbGxUeXBlcywgY2xlYW5OYW1lLCBjdXJyZW50TmFtZXNwYWNlKTtcbiAgcmV0dXJuIGluZm8gPyBgWyR7ZXNjYXBlTWR4QW5nbGVCcmFja2V0cyh0eXBlTmFtZSl9XSgke3R5cGVIcmVmKGluZm8pfSlgIDogYFxcYCR7dHlwZU5hbWV9XFxgYDtcbn1cblxuZnVuY3Rpb24gZGlzYW1iaWd1YXRlKGJhc2U6IHN0cmluZywgdXNlZDogU2V0PHN0cmluZz4sIGtleU9mOiAoc2VnbWVudDogc3RyaW5nKSA9PiBzdHJpbmcpOiBzdHJpbmcge1xuICBsZXQgc2VnbWVudCA9IGJhc2U7XG4gIGNvbnN0IEZJUlNUX0RJU0FNQklHVUFUSU9OX1NVRkZJWCA9IDI7XG4gIGxldCBzdWZmaXggPSBGSVJTVF9ESVNBTUJJR1VBVElPTl9TVUZGSVg7XG4gIHdoaWxlICh1c2VkLmhhcyhrZXlPZihzZWdtZW50KSkpIHtcbiAgICBzZWdtZW50ID0gYCR7YmFzZX0tJHtTdHJpbmcoc3VmZml4KX1gO1xuICAgIHN1ZmZpeCsrO1xuICB9XG4gIHVzZWQuYWRkKGtleU9mKHNlZ21lbnQpKTtcbiAgcmV0dXJuIHNlZ21lbnQ7XG59XG5cbmZ1bmN0aW9uIGdldEJhc2VQYXRoKCk6IHN0cmluZyB7XG4gIHJldHVybiBnZXRBcGlEb2NTZXR0aW5ncygpLmJhc2VQYXRoO1xufVxuXG4vKipcbiAqIFdhcm4gd2hlbiB0d28gZGlzdGluY3QgbWVtYmVycyBvZiBhIHR5cGUgcHJvZHVjZSB0aGUgc2FtZSBtZW1iZXIgc2x1ZyAoVVJML2ZpbGUgc2VnbWVudCkuIFRoZVxuICogb3B0aW9uYWwtYD9gIHN1ZmZpeCBpcyBzdHJpcHBlZCBmaXJzdCwgc28gYSBwcm9wZXJ0eSBhcHBlYXJpbmcgYXMgYm90aCByZXF1aXJlZCBhbmQgb3B0aW9uYWwgaXMgbm90XG4gKiBhIGZhbHNlIHBvc2l0aXZlLlxuICpcbiAqIEBwYXJhbSBpbmZvIC0gVGhlIHR5cGUuXG4gKiBAcGFyYW0gbmFtZXNwYWNlIC0gVGhlIHR5cGUncyBuYW1lc3BhY2UuXG4gKi9cbmZ1bmN0aW9uIHdhcm5NZW1iZXJTbHVnQ29sbGlzaW9ucyhpbmZvOiBUeXBlSW5mbywgbmFtZXNwYWNlOiBzdHJpbmcpOiB2b2lkIHtcbiAgY29uc3Qgc2VlbiA9IG5ldyBNYXA8c3RyaW5nLCBzdHJpbmc+KCk7XG4gIGZ1bmN0aW9uIGNoZWNrKHNsdWc6IHN0cmluZywgb3JpZ2luYWw6IHN0cmluZyk6IHZvaWQge1xuICAgIGNvbnN0IG5vcm1hbGl6ZWQgPSBvcmlnaW5hbC5yZXBsYWNlKC9cXD8kLywgJycpO1xuICAgIGNvbnN0IGV4aXN0aW5nID0gc2Vlbi5nZXQoc2x1Zyk7XG4gICAgaWYgKGV4aXN0aW5nICE9PSB1bmRlZmluZWQgJiYgZXhpc3RpbmcgIT09IG5vcm1hbGl6ZWQpIHtcbiAgICAgIGNvbnNvbGUud2FybihgTWVtYmVyIHJvdXRlIGNvbGxpc2lvbiBpbiBcIiR7bmFtZXNwYWNlfSMke2luZm8ubmFtZX1cIjogXCIke2V4aXN0aW5nfVwiIGFuZCBcIiR7bm9ybWFsaXplZH1cIiBib3RoIG1hcCB0byBcIi8ke3NsdWd9L1wiLmApO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBzZWVuLnNldChzbHVnLCBub3JtYWxpemVkKTtcbiAgfVxuICBmb3IgKGNvbnN0IHByb3BlcnR5IG9mIGluZm8ucHJvcGVydGllcykge1xuICAgIGNoZWNrKG1lbWJlclNsdWcocHJvcGVydHkubmFtZSksIHByb3BlcnR5Lm5hbWUpO1xuICB9XG4gIGZvciAoY29uc3QgbWV0aG9kIG9mIGluZm8ubWV0aG9kcykge1xuICAgIGNoZWNrKG92ZXJsb2FkU2x1ZyhtZXRob2Qub3ZlcmxvYWRLZXkpLCBtZXRob2Qub3ZlcmxvYWRLZXkpO1xuICB9XG59XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBT0E7QUFBQSxFQUNFO0FBQUEsRUFDQTtBQUFBLE9BQ0s7QUFDUCxTQUFTLG9CQUFvQjtBQUM3QixTQUFTLFlBQVk7QUFPckI7QUFBQSxFQUNFO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsT0FDSztBQUNQLFNBQVMseUJBQXlCO0FBQ2xDO0FBQUEsRUFDRTtB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
365
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9kb2NzLXNpdGUvYXBpLWRvYy1saW5rLXJlbmRlcmluZy50cyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBmaWxlXG4gKlxuICogVHlwZS1saW5rIHJlbmRlcmluZzogdHVybnMgdHlwZSB0ZXh0IGFuZCBpbmxpbmUgbGluayB0YWdzIGludG8gbWFya2Rvd24gbGlua3MgdG8gZ2VuZXJhdGVkIHBhZ2VzXG4gKiBvciBleHRlcm5hbCByZWZlcmVuY2VzIChUeXBlU2NyaXB0IGhhbmRib29rLCBNRE4gV2ViIEFQSSwgSlMgZ2xvYmFscykuXG4gKi9cblxuaW1wb3J0IHtcbiAgZ2V0TWFuZGF0b3J5TmFtZWRHcm91cCxcbiAgZ2V0T3B0aW9uYWxOYW1lZEdyb3VwXG59IGZyb20gJ0BtbmFvdW1vdi90eXBlc2NyaXB0LWxpYi9yZWctZXhwJztcbmltcG9ydCB7IHJlYWRGaWxlU3luYyB9IGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHsgam9pbiB9IGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCB0eXBlIHtcbiAgVHlwZUluZm8sXG4gIFdlYkFwaUVudHJ5XG59IGZyb20gJy4vYXBpLWRvYy10eXBlcy50cyc7XG5cbmltcG9ydCB7XG4gIEdFTkVSSUNfVFlQRV9QQVJBTVMsXG4gIFRTX0dMT0JBTF9UWVBFUyxcbiAgVFNfUFJJTUlUSVZFX1RZUEVTLFxuICBUU19VVElMSVRZX1RZUEVTXG59IGZyb20gJy4vYXBpLWRvYy1jb25zdGFudHMudHMnO1xuaW1wb3J0IHsgZ2V0UGFja2FnZVR5cGVVcmwgfSBmcm9tICcuL2FwaS1kb2MtcGFja2FnZS1zaXRlcy50cyc7XG5pbXBvcnQge1xuICB0b1JvdXRlU2VnbWVudCxcbiAgdG9Sb3V0ZVNlZ21lbnRQcmVzZXJ2ZUNhc2Vcbn0gZnJvbSAnLi9hcGktZG9jLXJvdXRlLXNlZ21lbnRzLnRzJztcbmltcG9ydCB7IGdldEFwaURvY1NldHRpbmdzIH0gZnJvbSAnLi9hcGktZG9jLXNldHRpbmdzLnRzJztcbmltcG9ydCB7XG4gIGVzY2FwZU1keEFuZ2xlQnJhY2tldHMsXG4gIGVzY2FwZU1keFByb3NlLFxuICBnZXROYW1lc3BhY2VEaXJlY3RvcnksXG4gIG1lbWJlclJvdXRlU2VnbWVudCxcbiAgbWVtYmVyU2x1ZyxcbiAgb3ZlcmxvYWRSb3V0ZVNlZ21lbnQsXG4gIG92ZXJsb2FkU2x1ZyxcbiAgcmVwbGFjZVJlZ0V4cE1hdGNoZXMsXG4gIHNlZ21lbnRNYXJrZG93blxufSBmcm9tICcuL2FwaS1kb2MtdGV4dC11dGlscy50cyc7XG5cbi8qKlxuTG9hZGVkIGZyb20gdHlwZWRvYy1wbHVnaW4tbWRuLWxpbmtzIGRhdGEgYXQgcnVudGltZVxuICovXG4vKipcbk1vZHVsZS1sZXZlbCBtdXRhYmxlIHN0YXRlLCBoZWxkIGluIG9uZSBvYmplY3Qgc28gZWFjaCBtdXRhdGlvbiBuYW1lcyBpdCBleHBsaWNpdGx5LlxuICovXG5pbnRlcmZhY2UgTW9kdWxlU3RhdGUge1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgdHlwZXNjcmlwdC1kZXYtdG9vbGtpdC9yZWFkb25seS1pbnRlcmZhY2UtbWVtYmVycyAtLSBUaGUgV2ViIEFQSSBtZXRhZGF0YSBjYWNoZSBpcyByZXBsYWNlZCBhZnRlciBsb2FkaW5nLlxuICB3ZWJBcGlUeXBlczogUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG59XG5cbmNvbnN0IG1vZHVsZVN0YXRlOiBNb2R1bGVTdGF0ZSA9IHtcbiAgd2ViQXBpVHlwZXM6IHt9XG59O1xuLyoqXG5Mb3dlcmNhc2VkLCBjb2xsaXNpb24tZGlzYW1iaWd1YXRlZCBPTi1ESVNLIHNlZ21lbnQgcGVyIHF1YWxpZmllZCB0eXBlIGtleSAoYCR7bmFtZXNwYWNlfSMke25hbWV9YCkuXG4gKi9cbmNvbnN0IHR5cGVGaWxlU2VnbWVudHMgPSBuZXcgTWFwPHN0cmluZywgc3RyaW5nPigpO1xuLyoqXG5DYXNlLXByZXNlcnZlZCBVUkwvcm91dGUgc2VnbWVudCBwZXIgcXVhbGlmaWVkIHR5cGUga2V5IChgJHtuYW1lc3BhY2V9IyR7bmFtZX1gKS5cbiAqL1xuY29uc3QgdHlwZVJvdXRlU2VnbWVudHMgPSBuZXcgTWFwPHN0cmluZywgc3RyaW5nPigpO1xuXG4vKipcbiAqIFJvdXRlLXNlZ21lbnQga2V5cyBvZiB0aGUgbWVtYmVyIHBhZ2VzIHRoYXQgYGdlbmVyYXRlTWVtYmVyUGFnZXNgIHdpbGwgYWN0dWFsbHkgZW1pdCwgYXNcbiAqIGAke25hbWVzcGFjZX0jJHtUeXBlTmFtZX0jJHtyb3V0ZVNlZ21lbnR9YC4gT25seSBOT04taW5oZXJpdGVkIHByb3BlcnRpZXMgYW5kIG5vbi1pbmhlcml0ZWQgbWV0aG9kXG4gKiBvdmVybG9hZCBrZXlzIGdldCBhIHBhZ2UsIHNvIHRoaXMgbGV0cyBsaW5rIGVtaXR0ZXJzIGF2b2lkIHBvaW50aW5nIGF0IGEgbWVtYmVyIHBhZ2UgdGhhdCBpcyBuZXZlclxuICogZ2VuZXJhdGVkIChhbiBpbmhlcml0ZWQgbWVtYmVyLCBhbiBlbnVtIG1lbWJlciwgYW4gb3B0aW9ucy1pbnRlcmZhY2UgbWVtYmVyKSDigJQgd2hpY2ggd291bGQgNDA0LlxuICovXG5jb25zdCBnZW5lcmF0ZWRNZW1iZXJQYWdlcyA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuXG4vKipcbiAqIFdoZXRoZXIgYSBtZW1iZXIgcGFnZSB3aWxsIGJlIGdlbmVyYXRlZCBmb3IgYHJvdXRlU2VnbWVudGAgb24gdGhlIGdpdmVuIHR5cGUuXG4gKlxuICogQHBhcmFtIG5hbWVzcGFjZSAtIFRoZSB0eXBlJ3MgbmFtZXNwYWNlLlxuICogQHBhcmFtIHR5cGVOYW1lIC0gVGhlIHR5cGUncyBuYW1lLlxuICogQHBhcmFtIHJvdXRlU2VnbWVudCAtIFRoZSBtZW1iZXIncyByb3V0ZSBzZWdtZW50LlxuICogQHJldHVybnMgV2hldGhlciB0aGUgcGFnZSBpcyBnZW5lcmF0ZWQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBkb2VzTWVtYmVyUGFnZUV4aXN0KG5hbWVzcGFjZTogc3RyaW5nLCB0eXBlTmFtZTogc3RyaW5nLCByb3V0ZVNlZ21lbnQ6IHN0cmluZyk6IGJvb2xlYW4ge1xuICByZXR1cm4gZ2VuZXJhdGVkTWVtYmVyUGFnZXMuaGFzKGAke25hbWVzcGFjZX0jJHt0eXBlTmFtZX0jJHtyb3V0ZVNlZ21lbnR9YCk7XG59XG5cbi8qKlxuICogUmVzb2x2ZSBhIGJhcmUgdHlwZSBuYW1lIHRvIGEgZG9jdW1lbnRlZCBgVHlwZUluZm9gLlxuICpcbiAqIFRoZSBtb2RlbCBtYXAgaXMga2V5ZWQgYnkgYSBxdWFsaWZpZWQgYCR7bmFtZXNwYWNlfSMke25hbWV9YCBpZGVudGl0eSwgYmVjYXVzZSBhIHBhY2thZ2VcbiAqIGNhbiBleHBvcnQgdGhlIHNhbWUgc2ltcGxlIG5hbWUgZnJvbSBkaWZmZXJlbnQgbW9kdWxlcy4gUmVzb2x1dGlvbiBpcyBiZXN0LWVmZm9ydDpcbiAqICAgMS4gUHJlZmVyIGEgdHlwZSBpbiBgY3VycmVudE5hbWVzcGFjZWAgKHRoZSByZWZlcmVuY2luZyBwYWdlJ3MgbW9kdWxlKS5cbiAqICAgMi4gT3RoZXJ3aXNlLCBpZiBleGFjdGx5IG9uZSB0eXBlIGFjcm9zcyBhbGwgbW9kdWxlcyBoYXMgdGhhdCBiYXJlIG5hbWUsIHVzZSBpdC5cbiAqICAgMy4gSWYgdGhlIGJhcmUgbmFtZSBpcyBhbWJpZ3VvdXMgKG11bHRpcGxlIG1vZHVsZXMpLCBnaXZlIHVwIChjYWxsZXIgcmVuZGVycyBwbGFpbiBjb2RlKS5cbiAqXG4gKiBAcGFyYW0gYWxsVHlwZXMgLSBFdmVyeSBkb2N1bWVudGVkIHR5cGUsIGtleWVkIGJ5IGAke25hbWVzcGFjZX0jJHtuYW1lfWAuXG4gKiBAcGFyYW0gbmFtZSAtIFRoZSB0eXBlJ3MgbmFtZS5cbiAqIEBwYXJhbSBjdXJyZW50TmFtZXNwYWNlIC0gVGhlIG5hbWVzcGFjZSBvZiB0aGUgcmVmZXJlbmNpbmcgcGFnZSwgcHJlZmVycmVkIHdoZW4gdGhlIG5hbWUgaXMgYW1iaWd1b3VzLlxuICogQHJldHVybnMgVGhlIHR5cGUsIG9yIGB1bmRlZmluZWRgIHdoZW4gbm8gdHlwZSBvciBtb3JlIHRoYW4gb25lIGhhcyB0aGF0IG5hbWUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBmaW5kVHlwZShhbGxUeXBlczogTWFwPHN0cmluZywgVHlwZUluZm8+LCBuYW1lOiBzdHJpbmcsIGN1cnJlbnROYW1lc3BhY2U/OiBzdHJpbmcpOiBUeXBlSW5mbyB8IHVuZGVmaW5lZCB7XG4gIGlmIChjdXJyZW50TmFtZXNwYWNlICE9PSB1bmRlZmluZWQpIHtcbiAgICBjb25zdCBxdWFsaWZpZWQgPSBhbGxUeXBlcy5nZXQoYCR7Y3VycmVudE5hbWVzcGFjZX0jJHtuYW1lfWApO1xuICAgIGlmIChxdWFsaWZpZWQpIHtcbiAgICAgIHJldHVybiBxdWFsaWZpZWQ7XG4gICAgfVxuICB9XG4gIGxldCBmb3VuZDogVHlwZUluZm8gfCB1bmRlZmluZWQ7XG4gIGxldCBtYXRjaENvdW50ID0gMDtcbiAgZm9yIChjb25zdCBpbmZvIG9mIGFsbFR5cGVzLnZhbHVlcygpKSB7XG4gICAgaWYgKGluZm8ubmFtZSAhPT0gbmFtZSkge1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgZm91bmQgPSBpbmZvO1xuICAgIG1hdGNoQ291bnQrKztcbiAgICBpZiAobWF0Y2hDb3VudCA+IDEpIHtcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuICB9XG4gIHJldHVybiBtYXRjaENvdW50ID09PSAxID8gZm91bmQgOiB1bmRlZmluZWQ7XG59XG5cbi8qKlxuICogTGluayBhIGJhc2UgdHlwZSBleHByZXNzaW9uIGZvciB0aGUgXCJFeHRlbmRzOlwiIGxpbmUuXG4gKiBTaW1wbGUgdHlwZSByZWZlcmVuY2VzIChpZGVudGlmaWVyICsgb3B0aW9uYWwgZ2VuZXJpY3MpIHVzZSByZW5kZXJUeXBlV2l0aExpbmtzXG4gKiBzbyBlYWNoIHR5cGUgYXJndW1lbnQgZ2V0cyBpdHMgb3duIGxpbmsuXG4gKiBDb21wbGV4IGV4cHJlc3Npb25zIChvYmplY3QgdHlwZXMsIGludGVyc2VjdGlvbnMsIGV0Yy4pIGZhbGwgYmFjayB0byB0eXBlTGlua1xuICogdG8gYXZvaWQgTURYIHBhcnNpbmcgaXNzdWVzIHdpdGggYHtgLCBgfWAsIGB8YCBldGMuXG4gKlxuICogQHBhcmFtIHR5cGVOYW1lIC0gVGhlIHR5cGUncyBuYW1lLlxuICogQHBhcmFtIGFsbFR5cGVzIC0gRXZlcnkgZG9jdW1lbnRlZCB0eXBlLCBrZXllZCBieSBgJHtuYW1lc3BhY2V9IyR7bmFtZX1gLlxuICogQHBhcmFtIGN1cnJlbnROYW1lc3BhY2UgLSBUaGUgbmFtZXNwYWNlIG9mIHRoZSByZWZlcmVuY2luZyBwYWdlLCBwcmVmZXJyZWQgd2hlbiB0aGUgbmFtZSBpcyBhbWJpZ3VvdXMuXG4gKiBAcmV0dXJucyBUaGUgbGlua2VkIHR5cGUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBsaW5rQmFzZVR5cGUodHlwZU5hbWU6IHN0cmluZywgYWxsVHlwZXM6IE1hcDxzdHJpbmcsIFR5cGVJbmZvPiwgY3VycmVudE5hbWVzcGFjZT86IHN0cmluZyk6IHN0cmluZyB7XG4gIGNvbnN0IGlzU2ltcGxlVHlwZVJlZiA9IC9eW2EtekEtWl1bYS16QS1aMC05XSooPzo8Lio+KT8kLy50ZXN0KHR5cGVOYW1lLnRyaW0oKSk7XG4gIHJldHVybiBpc1NpbXBsZVR5cGVSZWYgPyBlc2NhcGVNZHhBbmdsZUJyYWNrZXRzKHJlbmRlclR5cGVXaXRoTGlua3ModHlwZU5hbWUsIGFsbFR5cGVzLCB1bmRlZmluZWQsIGN1cnJlbnROYW1lc3BhY2UpKSA6IHR5cGVMaW5rKHR5cGVOYW1lLCBhbGxUeXBlcywgY3VycmVudE5hbWVzcGFjZSk7XG59XG5cbi8qKlxuICogTG9hZHMgdGhlIFdlYiBBUEkgbGlua3MgYHR5cGVkb2MtcGx1Z2luLW1kbi1saW5rc2Agc2hpcHMsIGlmIGl0IGlzIGluc3RhbGxlZC4gV2l0aG91dCBpdCwgV2ViIEFQSSB0eXBlcyByZW5kZXJcbiAqIHVubGlua2VkLlxuICpcbiAqIEBwYXJhbSByb290RGlyZWN0b3J5IC0gVGhlIGZvbGRlciB3aG9zZSBgbm9kZV9tb2R1bGVzYCBob2xkcyB0aGUgcGFja2FnZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGxvYWRFeHRlcm5hbFR5cGVNYXBzKHJvb3REaXJlY3Rvcnk6IHN0cmluZyk6IHZvaWQge1xuICB0cnkge1xuICAgIGNvbnN0IGRhdGFQYXRoID0gam9pbihyb290RGlyZWN0b3J5LCAnbm9kZV9tb2R1bGVzL3R5cGVkb2MtcGx1Z2luLW1kbi1saW5rcy9kYXRhL3dlYi1hcGkuanNvbicpO1xuICAgIG1vZHVsZVN0YXRlLndlYkFwaVR5cGVzID0gSlNPTi5wYXJzZShyZWFkRmlsZVN5bmMoZGF0YVBhdGgsICd1dGYtOCcpKSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgICBjb25zb2xlLndhcm4oYExvYWRlZCAke1N0cmluZyhPYmplY3Qua2V5cyhtb2R1bGVTdGF0ZS53ZWJBcGlUeXBlcykubGVuZ3RoKX0gV2ViIEFQSSB0eXBlIGxpbmtzYCk7XG4gIH0gY2F0Y2gge1xuICAgIG1vZHVsZVN0YXRlLndlYkFwaVR5cGVzID0ge307XG4gICAgY29uc29sZS53YXJuKCd0eXBlZG9jLXBsdWdpbi1tZG4tbGlua3MgZGF0YSBub3QgZm91bmQg4oCUIFdlYiBBUEkgbGlua3Mgd2lsbCBiZSB1bmF2YWlsYWJsZS4nKTtcbiAgfVxufVxuXG4vKipcbiAqIENvbnZlcnQgaW5saW5lIG1hcmtkb3duIHRvIEhUTUwgZm9yIHVzZSBpbiBjb21wb25lbnQgcHJvcHMgd2l0aCBzZXQ6aHRtbFxuICpcbiAqIEBwYXJhbSB0ZXh0IC0gVGhlIHRleHQuXG4gKiBAcmV0dXJucyBUaGUgSFRNTC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG1hcmtkb3duVG9IdG1sKHRleHQ6IHN0cmluZyk6IHN0cmluZyB7XG4gIGNvbnN0IGVzY2FwZWQgPSB0ZXh0XG4gICAgLnJlcGxhY2VBbGwoJyYnLCAnJmFtcDsnKVxuICAgIC5yZXBsYWNlQWxsKCc8JywgJyZsdDsnKVxuICAgIC5yZXBsYWNlQWxsKCc+JywgJyZndDsnKTtcbiAgcmV0dXJuIHJlcGxhY2VSZWdFeHBNYXRjaGVzKGVzY2FwZWQsIC9cXFsoPzx0ZXh0PlteXFxdXSspXFxdXFwoKD88dXJsPlteKV0rKVxcKS9nLCAobWF0Y2gpID0+IHtcbiAgICBjb25zdCBsaW5rVGV4dCA9IGdldE1hbmRhdG9yeU5hbWVkR3JvdXAobWF0Y2gsICd0ZXh0Jyk7XG4gICAgY29uc3QgdXJsID0gZ2V0TWFuZGF0b3J5TmFtZWRHcm91cChtYXRjaCwgJ3VybCcpO1xuICAgIC8vIEEgcmVsYXRpdmUgVVJMIGhlcmUgaXMgYW4gaWxsdXN0cmF0aXZlIGV4YW1wbGUgcGF0aCBpbiBUU0RvYyAoZS5nLiBgW2Zvb10oZm9vLnBuZylgKSwgbm90IGFcbiAgICAvLyByZWFsIG5hdmlnYWJsZSBsaW5rIOKAlCByZW5kZXIgaXQgYXMgbGl0ZXJhbCBpbmxpbmUgY29kZSBzbyBpdCBuZWl0aGVyIDQwNHMgbm9yIGxvc2VzIG1lYW5pbmcuXG4gICAgcmV0dXJuIC9eKD86aHR0cHM/OlxcL1xcL3xcXC98I3xtYWlsdG86KS8udGVzdCh1cmwpID8gYDxhIGhyZWY9XCIke3VybH1cIj4ke2xpbmtUZXh0fTwvYT5gIDogYDxjb2RlPlske2xpbmtUZXh0fV0oJHt1cmx9KTwvY29kZT5gO1xuICB9KVxuICAgIC5yZXBsYWNlQWxsKC9gKD88Y29kZT5bXmBdKylgL2csICc8Y29kZT4kPGNvZGU+PC9jb2RlPicpXG4gICAgLnJlcGxhY2VBbGwoJ1xcbicsICc8YnIvPicpO1xufVxuXG4vKipcbiAqIEJ1aWxkIHRoZSBocmVmIGZvciBhIG1lbWJlciwgcG9pbnRpbmcgdG8gdGhlIHBhcmVudCB0eXBlJ3MgcGFnZSBpZiBpbmhlcml0ZWRcbiAqXG4gKiBAcGFyYW0gbWVtYmVyU2x1Z1N0cmluZyAtIFRoZSBtZW1iZXIncyByb3V0ZSBzZWdtZW50LlxuICogQHBhcmFtIGluaGVyaXRlZEZyb20gLSBUaGUgbmFtZSBvZiB0aGUgdHlwZSB0aGUgbWVtYmVyIGlzIGluaGVyaXRlZCBmcm9tLCBvciBhbiBlbXB0eSBzdHJpbmcgZm9yIGFuIG93biBtZW1iZXIuXG4gKiBAcGFyYW0gYWxsVHlwZXMgLSBFdmVyeSBkb2N1bWVudGVkIHR5cGUsIGtleWVkIGJ5IGAke25hbWVzcGFjZX0jJHtuYW1lfWAuXG4gKiBAcGFyYW0gY3VycmVudE5hbWVzcGFjZSAtIFRoZSBuYW1lc3BhY2Ugb2YgdGhlIHJlZmVyZW5jaW5nIHBhZ2UsIHByZWZlcnJlZCB3aGVuIHRoZSBuYW1lIGlzIGFtYmlndW91cy5cbiAqIEByZXR1cm5zIFRoZSBsaW5rLCBvciBhbiBlbXB0eSBzdHJpbmcgd2hlbiBubyBwYWdlIGRvY3VtZW50cyB0aGUgbWVtYmVyLlxuICovXG5leHBvcnQgZnVuY3Rpb24gbWVtYmVySHJlZihtZW1iZXJTbHVnU3RyaW5nOiBzdHJpbmcsIGluaGVyaXRlZEZyb206IHN0cmluZywgYWxsVHlwZXM6IE1hcDxzdHJpbmcsIFR5cGVJbmZvPiwgY3VycmVudE5hbWVzcGFjZT86IHN0cmluZyk6IHN0cmluZyB7XG4gIGlmICghaW5oZXJpdGVkRnJvbSkge1xuICAgIC8vIE93biAobm9uLWluaGVyaXRlZCkgbWVtYmVyIOKAlCBgZ2VuZXJhdGVNZW1iZXJQYWdlc2AgYWx3YXlzIGVtaXRzIGl0cyBwYWdlIG9uIHRoaXMgc2FtZSBwYWdlLlxuICAgIHJldHVybiBgLi8ke21lbWJlclNsdWdTdHJpbmd9L2A7XG4gIH1cbiAgbGV0IHBhcmVudEluZm8gPSBmaW5kVHlwZShhbGxUeXBlcywgaW5oZXJpdGVkRnJvbSwgY3VycmVudE5hbWVzcGFjZSk7XG4gIGNvbnN0IHZpc2l0ZWQgPSBuZXcgU2V0PFR5cGVJbmZvPigpO1xuICB3aGlsZSAocGFyZW50SW5mbyAmJiAhZG9lc01lbWJlclBhZ2VFeGlzdChwYXJlbnRJbmZvLm5hbWVzcGFjZSwgcGFyZW50SW5mby5uYW1lLCBtZW1iZXJTbHVnU3RyaW5nKSkge1xuICAgIGlmICh2aXNpdGVkLmhhcyhwYXJlbnRJbmZvKSkge1xuICAgICAgcmV0dXJuICcnO1xuICAgIH1cbiAgICB2aXNpdGVkLmFkZChwYXJlbnRJbmZvKTtcbiAgICBjb25zdCBtZW1iZXIgPSBwYXJlbnRJbmZvLnByb3BlcnRpZXMuZmluZCgocHJvcGVydHkpID0+IG1lbWJlclJvdXRlU2VnbWVudChwcm9wZXJ0eS5uYW1lKSA9PT0gbWVtYmVyU2x1Z1N0cmluZylcbiAgICAgID8/IHBhcmVudEluZm8ubWV0aG9kcy5maW5kKChtZXRob2QpID0+IG92ZXJsb2FkUm91dGVTZWdtZW50KG1ldGhvZC5vdmVybG9hZEtleSkgPT09IG1lbWJlclNsdWdTdHJpbmcpO1xuICAgIHBhcmVudEluZm8gPSBtZW1iZXI/LmluaGVyaXRlZEZyb20gPyBmaW5kVHlwZShhbGxUeXBlcywgbWVtYmVyLmluaGVyaXRlZEZyb20sIHBhcmVudEluZm8ubmFtZXNwYWNlKSA6IHVuZGVmaW5lZDtcbiAgfVxuICBpZiAoIXBhcmVudEluZm8gfHwgIWRvZXNNZW1iZXJQYWdlRXhpc3QocGFyZW50SW5mby5uYW1lc3BhY2UsIHBhcmVudEluZm8ubmFtZSwgbWVtYmVyU2x1Z1N0cmluZykpIHtcbiAgICAvLyBBbiB1bmRvY3VtZW50ZWQgb3IgYW1iaWd1b3VzIGFuY2VzdG9yIGhhcyBubyBzYWZlIG1lbWJlciBkZXN0aW5hdGlvbi5cbiAgICByZXR1cm4gJyc7XG4gIH1cbiAgY29uc3QgcGFyZW50TnNEaXJlY3RvcnkgPSBnZXROYW1lc3BhY2VEaXJlY3RvcnkocGFyZW50SW5mby5uYW1lc3BhY2UpO1xuICByZXR1cm4gYCR7Z2V0QmFzZVBhdGgoKX0vYXBpLyR7cGFyZW50TnNEaXJlY3Rvcnl9LyR7dG9UeXBlUm91dGVTZWdtZW50KHBhcmVudEluZm8ubmFtZXNwYWNlLCBwYXJlbnRJbmZvLm5hbWUpfS8ke21lbWJlclNsdWdTdHJpbmd9L2A7XG59XG5cbi8qKlxuICogUG9wdWxhdGUge0BsaW5rIGRvZXNNZW1iZXJQYWdlRXhpc3R9LiBNaXJyb3JzIGBnZW5lcmF0ZU1lbWJlclBhZ2VzYCdzIG93biBmaWx0ZXJpbmcgZXhhY3RseSAob25lIHBhZ2VcbiAqIHBlciBub24taW5oZXJpdGVkIHByb3BlcnR5LCBvbmUgcGVyIG5vbi1pbmhlcml0ZWQgbWV0aG9kIG92ZXJsb2FkIGtleSkuIE11c3QgcnVuIG9uY2UgYmVmb3JlIGFueVxuICogbGluayBpcyByZW5kZXJlZC5cbiAqXG4gKiBAcGFyYW0gdHlwZXMgLSBUaGUgZG9jdW1lbnRlZCB0eXBlcywga2V5ZWQgYnkgcXVhbGlmaWVkIGlkLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVnaXN0ZXJNZW1iZXJQYWdlcyh0eXBlczogTWFwPHN0cmluZywgVHlwZUluZm8+KTogdm9pZCB7XG4gIGdlbmVyYXRlZE1lbWJlclBhZ2VzLmNsZWFyKCk7XG4gIGZvciAoY29uc3QgaW5mbyBvZiB0eXBlcy52YWx1ZXMoKSkge1xuICAgIGZvciAoY29uc3QgcHJvcGVydHkgb2YgaW5mby5wcm9wZXJ0aWVzKSB7XG4gICAgICBpZiAoIXByb3BlcnR5LmluaGVyaXRlZEZyb20pIHtcbiAgICAgICAgZ2VuZXJhdGVkTWVtYmVyUGFnZXMuYWRkKGAke2luZm8ubmFtZXNwYWNlfSMke2luZm8ubmFtZX0jJHttZW1iZXJSb3V0ZVNlZ21lbnQocHJvcGVydHkubmFtZSl9YCk7XG4gICAgICB9XG4gICAgfVxuICAgIGNvbnN0IG92ZXJsb2FkS2V5cyA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuICAgIGZvciAoY29uc3QgbWV0aG9kIG9mIGluZm8ubWV0aG9kcykge1xuICAgICAgaWYgKCFtZXRob2QuaW5oZXJpdGVkRnJvbSkge1xuICAgICAgICBvdmVybG9hZEtleXMuYWRkKG1ldGhvZC5vdmVybG9hZEtleSk7XG4gICAgICB9XG4gICAgfVxuICAgIGZvciAoY29uc3Qgb3ZlcmxvYWRLZXkgb2Ygb3ZlcmxvYWRLZXlzKSB7XG4gICAgICBnZW5lcmF0ZWRNZW1iZXJQYWdlcy5hZGQoYCR7aW5mby5uYW1lc3BhY2V9IyR7aW5mby5uYW1lfSMke292ZXJsb2FkUm91dGVTZWdtZW50KG92ZXJsb2FkS2V5KX1gKTtcbiAgICB9XG4gIH1cbn1cblxuLyoqXG4gKiBGb3IgZXZlcnkgZG9jdW1lbnRlZCB0eXBlIGFzc2lnbiBCT1RIOlxuICogIC0gYSBsb3dlcmNhc2VkLCBudW1lcmljYWxseS1kaXNhbWJpZ3VhdGVkIEZJTEUgc2VnbWVudCAoc28gYFR5cGVBc3NlcnRlcmAgdnMgYHR5cGVBc3NlcnRlcmAsIHdoaWNoXG4gKiAgICBib3RoIGxvd2VyY2FzZSB0byBgdHlwZWFzc2VydGVyYCwgYmVjb21lIGB0eXBlYXNzZXJ0ZXJgIC8gYHR5cGVhc3NlcnRlci0yYCBvbiBkaXNrIGFuZCBuZXZlclxuICogICAgY29sbGlkZSBvbiBXaW5kb3dzJyBjYXNlLWluc2Vuc2l0aXZlIGZpbGVzeXN0ZW0pLCBhbmRcbiAqICAtIGEgY2FzZS1QUkVTRVJWRUQgUk9VVEUgc2VnbWVudCAoYFR5cGVBc3NlcnRlcmAgLyBgdHlwZUFzc2VydGVyYCkgdXNlZCBmb3IgdGhlIGV4cGxpY2l0IGBzbHVnOmBcbiAqICAgIGZyb250bWF0dGVyIGFuZCBldmVyeSBpbnRlcm5hbCBsaW5rLCBzbyB0aGUgVVJMcyBzdGF5IHByZXR0eSBhbmQgbmF0dXJhbGx5IGRpc3RpbmN0LlxuICogVGhlIHJvdXRlIGRlY291cGxlcyBmcm9tIHRoZSBmaWxlIHBhdGggdmlhIHRoZSBgc2x1ZzpgIGZyb250bWF0dGVyLCBzbyBubyBgLTJgIHN1ZmZpeCBsZWFrcyBpbnRvXG4gKiBVUkxzLiBBbHNvIHdhcm5zIGFib3V0IG1lbWJlci1zbHVnIGNvbGxpc2lvbnMgd2l0aGluIGEgdHlwZS4gTXVzdCBydW4gb25jZSBiZWZvcmUgYW55IHBhZ2UvbGluay5cbiAqXG4gKiBAcGFyYW0gdHlwZXMgLSBUaGUgZG9jdW1lbnRlZCB0eXBlcywga2V5ZWQgYnkgcXVhbGlmaWVkIGlkLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVnaXN0ZXJSb3V0ZVNlZ21lbnRzKHR5cGVzOiBNYXA8c3RyaW5nLCBUeXBlSW5mbz4pOiB2b2lkIHtcbiAgdHlwZUZpbGVTZWdtZW50cy5jbGVhcigpO1xuICB0eXBlUm91dGVTZWdtZW50cy5jbGVhcigpO1xuICBjb25zdCBieU5hbWVzcGFjZSA9IG5ldyBNYXA8c3RyaW5nLCBUeXBlSW5mb1tdPigpO1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgdW5pY29ybi9wcmVmZXItZ3JvdXAtYnkgLS0gYE1hcC5ncm91cEJ5YCBpcyBFUzIwMjQsIGFuZCB0aGUgc2hhcmVkIGB0c2NvbmZpZy5qc29uYCB0eXBlcyBvbmx5IEVTMjAyMi5cbiAgZm9yIChjb25zdCBpbmZvIG9mIHR5cGVzLnZhbHVlcygpKSB7XG4gICAgY29uc3QgbGlzdCA9IGJ5TmFtZXNwYWNlLmdldChpbmZvLm5hbWVzcGFjZSkgPz8gW107XG4gICAgbGlzdC5wdXNoKGluZm8pO1xuICAgIGJ5TmFtZXNwYWNlLnNldChpbmZvLm5hbWVzcGFjZSwgbGlzdCk7XG4gIH1cbiAgZm9yIChjb25zdCBbbmFtZXNwYWNlLCBpbmZvc10gb2YgYnlOYW1lc3BhY2UpIHtcbiAgICBjb25zdCB1c2VkRmlsZVNlZ21lbnRzID0gbmV3IFNldDxzdHJpbmc+KCk7XG4gICAgY29uc3QgdXNlZFJvdXRlU2VnbWVudHMgPSBuZXcgU2V0PHN0cmluZz4oKTtcbiAgICBjb25zdCBzb3J0ZWQgPSBbLi4uaW5mb3NdLnNvcnQoKGFscGhhLCBicmF2bykgPT4gYWxwaGEubmFtZS5sb2NhbGVDb21wYXJlKGJyYXZvLm5hbWUpKTtcbiAgICBmb3IgKGNvbnN0IGluZm8gb2Ygc29ydGVkKSB7XG4gICAgICB0eXBlRmlsZVNlZ21lbnRzLnNldChgJHtuYW1lc3BhY2V9IyR7aW5mby5uYW1lfWAsIGRpc2FtYmlndWF0ZSh0b1JvdXRlU2VnbWVudChpbmZvLm5hbWUpLCB1c2VkRmlsZVNlZ21lbnRzLCAoc2VnbWVudCkgPT4gc2VnbWVudCkpO1xuXG4gICAgICBjb25zdCByb3V0ZUJhc2UgPSB0b1JvdXRlU2VnbWVudFByZXNlcnZlQ2FzZShpbmZvLm5hbWUpO1xuICAgICAgLy8gRGlzYW1iaWd1YXRlIFJPVVRFUyBjYXNlLUlOU0VOU0lUSVZFTFk6IHRoZSBzbHVnIGJlY29tZXMgQXN0cm8ncyBvbi1kaXNrIG91dHB1dCBwYXRoLCBzb1xuICAgICAgLy8gYFR5cGVBc3NlcnRlcmAgYW5kIGB0eXBlQXNzZXJ0ZXJgIChzYW1lIG5hbWUgbW9kdWxvIGNhc2UpIHdvdWxkIGNvbGxpZGUgd2hlbiB0aGUgc2l0ZSBpcyBidWlsdFxuICAgICAgLy8gb24gYSBjYXNlLWluc2Vuc2l0aXZlIGZpbGVzeXN0ZW0gKFdpbmRvd3MvbWFjT1MpLCBzaWxlbnRseSBvdmVyd3JpdGluZyBvbmUgcGFnZSBzbyBldmVyeSBsaW5rXG4gICAgICAvLyB0byBpdCA0MDRzLiBDb21wYXJpbmcgbG93ZXJjYXNlZCBrZXlzIGZvcmNlcyB0aGUgc2Vjb25kIG9jY3VycmVuY2UgdG8gdGFrZSBhIGAtMmAgc3VmZml4LlxuICAgICAgY29uc3Qgcm91dGVTZWdtZW50ID0gZGlzYW1iaWd1YXRlKHJvdXRlQmFzZSwgdXNlZFJvdXRlU2VnbWVudHMsIChzZWdtZW50KSA9PiBzZWdtZW50LnRvTG93ZXJDYXNlKCkpO1xuICAgICAgdHlwZVJvdXRlU2VnbWVudHMuc2V0KGAke25hbWVzcGFjZX0jJHtpbmZvLm5hbWV9YCwgcm91dGVTZWdtZW50KTtcbiAgICAgIGlmIChyb3V0ZVNlZ21lbnQgIT09IHJvdXRlQmFzZSkge1xuICAgICAgICBjb25zb2xlLndhcm4oYERpc2FtYmlndWF0ZWQgUk9VVEUgZm9yIFwiJHtuYW1lc3BhY2V9IyR7aW5mby5uYW1lfVwiOiBcIiR7cm91dGVCYXNlfVwiIC0+IFwiJHtyb3V0ZVNlZ21lbnR9XCIgKHNsdWcgY29sbGlzaW9uKS5gKTtcbiAgICAgIH1cbiAgICAgIHdhcm5NZW1iZXJTbHVnQ29sbGlzaW9ucyhpbmZvLCBuYW1lc3BhY2UpO1xuICAgIH1cbiAgfVxufVxuXG4vKipcbiAqIFJlbmRlciBhbiBgQGV4YW1wbGVgIGJsb2NrIGFzIE1EWC4gSWYgdGhlIGV4YW1wbGUgYWxyZWFkeSBjb250YWlucyBhIGZlbmNlZCBjb2RlIGJsb2NrLCBpdCBpc1xuICogbm9ybWFsaXplZCB0aHJvdWdoIHtAbGluayByZW5kZXJNZHhQcm9zZX0gKGNvZGUgcHJlc2VydmVkIHJhdywgc3Vycm91bmRpbmcgcHJvc2UgZXNjYXBlZCk7XG4gKiBvdGhlcndpc2UgdGhlIHJhdyBleGFtcGxlIHRleHQgaXMgd3JhcHBlZCBpbiBhIGB0c2AgY29kZSBmZW5jZSBzbyBpdCBpcyBlbWl0dGVkIGxpdGVyYWxseS5cbiAqXG4gKiBAcGFyYW0gZXhhbXBsZSAtIFRoZSBgQGV4YW1wbGVgIHRleHQuXG4gKiBAcGFyYW0gYWxsVHlwZXMgLSBFdmVyeSBkb2N1bWVudGVkIHR5cGUsIGtleWVkIGJ5IGAke25hbWVzcGFjZX0jJHtuYW1lfWAuXG4gKiBAcGFyYW0gc2VsZk5hbWVzcGFjZSAtIFRoZSBuYW1lc3BhY2Ugb2YgdGhlIHBhZ2UgYmVpbmcgcmVuZGVyZWQsIHByZWZlcnJlZCB3aGVuIGEgbmFtZSBpcyBhbWJpZ3VvdXMuXG4gKiBAcmV0dXJucyBUaGUgTURYLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVuZGVyRXhhbXBsZU1keChleGFtcGxlOiBzdHJpbmcsIGFsbFR5cGVzOiBNYXA8c3RyaW5nLCBUeXBlSW5mbz4sIHNlbGZOYW1lc3BhY2U/OiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gLyg/Ol58XFxuKVxccyooPzpgYGB8fn5+KS8udGVzdChleGFtcGxlKSA/IHJlbmRlck1keFByb3NlKGV4YW1wbGUsIGFsbFR5cGVzLCBzZWxmTmFtZXNwYWNlKSA6IGBcXGBcXGBcXGB0c1xcbiR7ZXhhbXBsZX1cXG5cXGBcXGBcXGBgO1xufVxuXG4vKipcbiAqIFJlbmRlciBtYXJrZG93biBibG9jayB0ZXh0IChhIGRlc2NyaXB0aW9uLCByZW1hcmtzLCBvciBtb2R1bGUgb3ZlcnZpZXcpIGFzIE1EWC1zYWZlIG1hcmtkb3duLlxuICogRmVuY2VkIGNvZGUgYmxvY2tzIGFyZSByZS1lbWl0dGVkIHZlcmJhdGltIChzdXJyb3VuZGVkIGJ5IGJsYW5rIGxpbmVzLCB3aXRoIGEgbGFuZ3VhZ2UpOyBwcm9zZVxuICogc2VnbWVudHMgaGF2ZSB0aGVpciBpbmxpbmUgbGluayB0YWdzIHJlc29sdmVkIGFuZCB0aGVpciBNRFgtdW5zYWZlIGNoYXJhY3RlcnMgZXNjYXBlZC5cbiAqXG4gKiBAcGFyYW0gdGV4dCAtIFRoZSB0ZXh0LlxuICogQHBhcmFtIGFsbFR5cGVzIC0gRXZlcnkgZG9jdW1lbnRlZCB0eXBlLCBrZXllZCBieSBgJHtuYW1lc3BhY2V9IyR7bmFtZX1gLlxuICogQHBhcmFtIHNlbGZOYW1lc3BhY2UgLSBUaGUgbmFtZXNwYWNlIG9mIHRoZSBwYWdlIGJlaW5nIHJlbmRlcmVkLCBwcmVmZXJyZWQgd2hlbiBhIG5hbWUgaXMgYW1iaWd1b3VzLlxuICogQHJldHVybnMgVGhlIE1EWC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlbmRlck1keFByb3NlKHRleHQ6IHN0cmluZywgYWxsVHlwZXM6IE1hcDxzdHJpbmcsIFR5cGVJbmZvPiwgc2VsZk5hbWVzcGFjZT86IHN0cmluZyk6IHN0cmluZyB7XG4gIGNvbnN0IG91dDogc3RyaW5nW10gPSBbXTtcbiAgZm9yIChjb25zdCBzZWcgb2Ygc2VnbWVudE1hcmtkb3duKHRleHQpKSB7XG4gICAgaWYgKHNlZy50eXBlID09PSAnY29kZScpIHtcbiAgICAgIG91dC5wdXNoKCcnLCBgXFxgXFxgXFxgJHtzZWcubGFuZyB8fCAndHMnfWAsIHNlZy50ZXh0LCAnYGBgJywgJycpO1xuICAgIH0gZWxzZSB7XG4gICAgICBvdXQucHVzaChlc2NhcGVNZHhQcm9zZShyZXNvbHZlTGlua3Moc2VnLnRleHQsIGFsbFR5cGVzLCBzZWxmTmFtZXNwYWNlKSkpO1xuICAgIH1cbiAgfVxuICByZXR1cm4gb3V0LmpvaW4oJ1xcbicpLnJlcGxhY2VBbGwoL1xcbnszLH0vZywgJ1xcblxcbicpLnRyaW0oKTtcbn1cblxuLyoqXG4gKiBSZW5kZXIgYSB0eXBlIHN0cmluZyB3aXRoIGNsaWNrYWJsZSBsaW5rcyBmb3Iga25vd24gdHlwZXNcbiAqXG4gKiBAcGFyYW0gdHlwZVRleHQgLSBUaGUgdHlwZSB0ZXh0LlxuICogQHBhcmFtIGFsbFR5cGVzIC0gRXZlcnkgZG9jdW1lbnRlZCB0eXBlLCBrZXllZCBieSBgJHtuYW1lc3BhY2V9IyR7bmFtZX1gLlxuICogQHBhcmFtIHNlbGZUeXBlTmFtZSAtIFRoZSBuYW1lIG9mIHRoZSB0eXBlIHRoZSBwYWdlIGRvY3VtZW50cywgd2hpY2ggYHRoaXNgIGxpbmtzIHRvLlxuICogQHBhcmFtIHNlbGZOYW1lc3BhY2UgLSBUaGUgbmFtZXNwYWNlIG9mIHRoZSBwYWdlIGJlaW5nIHJlbmRlcmVkLCBwcmVmZXJyZWQgd2hlbiBhIG5hbWUgaXMgYW1iaWd1b3VzLlxuICogQHJldHVybnMgVGhlIHR5cGUgdGV4dCB3aXRoIG1hcmtkb3duIGxpbmtzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVuZGVyVHlwZVdpdGhMaW5rcyh0eXBlVGV4dDogc3RyaW5nLCBhbGxUeXBlczogTWFwPHN0cmluZywgVHlwZUluZm8+LCBzZWxmVHlwZU5hbWU/OiBzdHJpbmcsIHNlbGZOYW1lc3BhY2U/OiBzdHJpbmcpOiBzdHJpbmcge1xuICAvLyBQcmUtcGFzczogbGluayBPYmplY3QubWV0aG9kIHBhdHRlcm5zIHRvIE1ETiBiZWZvcmUgd29yZC1ieS13b3JkIGxpbmtpbmdcbiAgY29uc3QgTUROX09CSkVDVF9CQVNFID0gJ2h0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2RvY3MvV2ViL0phdmFTY3JpcHQvUmVmZXJlbmNlL0dsb2JhbF9PYmplY3RzL09iamVjdCc7XG4gIGNvbnN0IHdpdGhPYmplY3RNZXRob2RzID0gcmVwbGFjZVJlZ0V4cE1hdGNoZXModHlwZVRleHQsIC9cXGJPYmplY3RcXC4oPzxtZXRob2Q+W2EtekEtWl1bYS16QS1aMC05XSopXFxiL2csIChtYXRjaCkgPT4ge1xuICAgIGNvbnN0IG1ldGhvZCA9IGdldE1hbmRhdG9yeU5hbWVkR3JvdXAobWF0Y2gsICdtZXRob2QnKTtcbiAgICByZXR1cm4gYFtPYmplY3RdKCR7TUROX09CSkVDVF9CQVNFfSkuWyR7bWV0aG9kfV0oJHtNRE5fT0JKRUNUX0JBU0V9LyR7bWV0aG9kfSlgO1xuICB9KTtcbiAgLy8gTWFpbiBwYXNzOiBsaW5rIGluZGl2aWR1YWwgdHlwZSBuYW1lcywgc2tpcHBpbmcgdGV4dCBhbHJlYWR5IGluc2lkZSBtYXJrZG93biBsaW5rc1xuICByZXR1cm4gcmVwbGFjZVJlZ0V4cE1hdGNoZXMoXG4gICAgd2l0aE9iamVjdE1ldGhvZHMsXG4gICAgL1xcW1teXFxdXStcXF1cXChbXildK1xcKXxcXGIoPzx0eXBlTmFtZT5bYS16QS1aXVthLXpBLVowLTldKilcXGIvZyxcbiAgICAobWF0Y2gpID0+IHtcbiAgICAgIGNvbnN0IHR5cGVOYW1lID0gZ2V0T3B0aW9uYWxOYW1lZEdyb3VwKG1hdGNoLCAndHlwZU5hbWUnKTtcbiAgICAgIGlmICh0eXBlTmFtZSA9PT0gbnVsbCkge1xuICAgICAgICByZXR1cm4gbWF0Y2hbMF07XG4gICAgICB9XG4gICAgICAvLyBMaW5rIGB0aGlzYCByZXR1cm4gdHlwZSB0byB0aGUgY3VycmVudCB0eXBlJ3MgcGFnZVxuICAgICAgaWYgKHR5cGVOYW1lID09PSAndGhpcycgJiYgc2VsZlR5cGVOYW1lKSB7XG4gICAgICAgIGNvbnN0IHNlbGZJbmZvID0gZmluZFR5cGUoYWxsVHlwZXMsIHNlbGZUeXBlTmFtZSwgc2VsZk5hbWVzcGFjZSk7XG4gICAgICAgIGlmIChzZWxmSW5mbykge1xuICAgICAgICAgIHJldHVybiBgWyR7dHlwZU5hbWV9XSgke3R5cGVIcmVmKHNlbGZJbmZvKX0pYDtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBTa2lwIGdlbmVyaWMgdHlwZSBwYXJhbWV0ZXJzXG4gICAgICBpZiAoR0VORVJJQ19UWVBFX1BBUkFNUy5oYXModHlwZU5hbWUpKSB7XG4gICAgICAgIHJldHVybiB0eXBlTmFtZTtcbiAgICAgIH1cblxuICAgICAgLy8gQ2hlY2sgb3VyIG93biB0eXBlcyBmaXJzdFxuICAgICAgY29uc3QgaW5mbyA9IGZpbmRUeXBlKGFsbFR5cGVzLCB0eXBlTmFtZSwgc2VsZk5hbWVzcGFjZSk7XG4gICAgICBpZiAoaW5mbykge1xuICAgICAgICByZXR1cm4gYFske3R5cGVOYW1lfV0oJHt0eXBlSHJlZihpbmZvKX0pYDtcbiAgICAgIH1cblxuICAgICAgLy8gQSB0eXBlIGFub3RoZXIgZG9jdW1lbnRlZCBwYWNrYWdlIGRlY2xhcmVzLCBvciBvbmUgdGhlIHNpdGUgbWFwcyBpdHNlbGZcbiAgICAgIGNvbnN0IGV4dGVybmFsVXJsID0gcmVzb2x2ZUV4dGVybmFsVHlwZVVybCh0eXBlTmFtZSk7XG4gICAgICBpZiAoZXh0ZXJuYWxVcmwpIHtcbiAgICAgICAgcmV0dXJuIGBbJHt0eXBlTmFtZX1dKCR7ZXh0ZXJuYWxVcmx9KWA7XG4gICAgICB9XG5cbiAgICAgIC8vIFR5cGVTY3JpcHQgdXRpbGl0eSB0eXBlc1xuICAgICAgY29uc3QgdHNVcmwgPSByZXNvbHZlVHNVdGlsaXR5VXJsKHR5cGVOYW1lKTtcbiAgICAgIGlmICh0c1VybCkge1xuICAgICAgICByZXR1cm4gYFske3R5cGVOYW1lfV0oJHt0c1VybH0pYDtcbiAgICAgIH1cblxuICAgICAgLy8gSlMgZ2xvYmFsIHR5cGVzIChBcnJheSwgUHJvbWlzZSwgTWFwLCBldGMuKVxuICAgICAgY29uc3QgZ2xvYmFsVXJsID0gT2JqZWN0Lmhhc093bihUU19HTE9CQUxfVFlQRVMsIHR5cGVOYW1lKSA/IFRTX0dMT0JBTF9UWVBFU1t0eXBlTmFtZV0gOiB1bmRlZmluZWQ7XG4gICAgICBpZiAoZ2xvYmFsVXJsKSB7XG4gICAgICAgIHJldHVybiBgWyR7dHlwZU5hbWV9XSgke2dsb2JhbFVybH0pYDtcbiAgICAgIH1cblxuICAgICAgLy8gV2ViIEFQSSAvIE1ETiB0eXBlc1xuICAgICAgY29uc3QgbWRuVXJsID0gcmVzb2x2ZVdlYkFwaVVybCh0eXBlTmFtZSk7XG4gICAgICBpZiAobWRuVXJsKSB7XG4gICAgICAgIHJldHVybiBgWyR7dHlwZU5hbWV9XSgke21kblVybH0pYDtcbiAgICAgIH1cblxuICAgICAgLy8gVHlwZVNjcmlwdCBwcmltaXRpdmUgdHlwZXNcbiAgICAgIGNvbnN0IHByaW1pdGl2ZVVybCA9IE9iamVjdC5oYXNPd24oVFNfUFJJTUlUSVZFX1RZUEVTLCB0eXBlTmFtZSkgPyBUU19QUklNSVRJVkVfVFlQRVNbdHlwZU5hbWVdIDogdW5kZWZpbmVkO1xuICAgICAgcmV0dXJuIHByaW1pdGl2ZVVybCA/IGBbJHt0eXBlTmFtZX1dKCR7cHJpbWl0aXZlVXJsfSlgIDogdHlwZU5hbWU7XG4gICAgfVxuICApO1xufVxuXG4vKipcbiAqIFJlc29sdmUgYSB0eXBlIG5vIHBhZ2Ugb2YgdGhpcyBzaXRlIGRvY3VtZW50cyB0byB0aGUgcGFnZSB0aGF0IGRvZXM6IGFub3RoZXIgZG9jdW1lbnRlZCBwYWNrYWdlJ3Mgc2l0ZSwgb3IgYW5cbiAqIGVudHJ5IG9mIHRoZSBzaXRlJ3Mgb3duIGBleHRlcm5hbFR5cGVMaW5rc2Agc2V0dGluZy5cbiAqXG4gKiBAcGFyYW0gbmFtZSAtIFRoZSB0eXBlJ3MgbmFtZS5cbiAqIEByZXR1cm5zIFRoZSBVUkwsIG9yIGB1bmRlZmluZWRgIHdoZW4gbmVpdGhlciBrbm93cyB0aGUgdHlwZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlc29sdmVFeHRlcm5hbFR5cGVVcmwobmFtZTogc3RyaW5nKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgcmV0dXJuIGdldFBhY2thZ2VUeXBlVXJsKG5hbWUpID8/IGdldEFwaURvY1NldHRpbmdzKCkuZXh0ZXJuYWxUeXBlTGlua3MuZ2V0KG5hbWUpO1xufVxuXG4vKipcbiAqIFJlc29sdmUgYEBsaW5rYCB0YWdzLCB3aXRoIG9yIHdpdGhvdXQgYSBgfCBkaXNwbGF5IHRleHRgIHBhcnQsIGluIGRlc2NyaXB0aW9uIHRleHRcbiAqXG4gKiBAcGFyYW0gdGV4dCAtIFRoZSB0ZXh0LlxuICogQHBhcmFtIGFsbFR5cGVzIC0gRXZlcnkgZG9jdW1lbnRlZCB0eXBlLCBrZXllZCBieSBgJHtuYW1lc3BhY2V9IyR7bmFtZX1gLlxuICogQHBhcmFtIHNlbGZOYW1lc3BhY2UgLSBUaGUgbmFtZXNwYWNlIG9mIHRoZSBwYWdlIGJlaW5nIHJlbmRlcmVkLCBwcmVmZXJyZWQgd2hlbiBhIG5hbWUgaXMgYW1iaWd1b3VzLlxuICogQHJldHVybnMgVGhlIHRleHQgd2l0aCBtYXJrZG93biBsaW5rcy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlc29sdmVMaW5rcyh0ZXh0OiBzdHJpbmcsIGFsbFR5cGVzOiBNYXA8c3RyaW5nLCBUeXBlSW5mbz4sIHNlbGZOYW1lc3BhY2U/OiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gcmVwbGFjZVJlZ0V4cE1hdGNoZXModGV4dCwgL1xce0BsaW5rXFxzKyg/PHRhcmdldD5bXnx9XSs/KSg/OlxccypcXHxcXHMqKD88ZGlzcGxheT5bXn1dKz8pKT9cXH0vZywgKG1hdGNoKSA9PiB7XG4gICAgY29uc3QgdGFyZ2V0ID0gZ2V0TWFuZGF0b3J5TmFtZWRHcm91cChtYXRjaCwgJ3RhcmdldCcpLnRyaW0oKTtcbiAgICBjb25zdCBkaXNwbGF5ID0gKGdldE9wdGlvbmFsTmFtZWRHcm91cChtYXRjaCwgJ2Rpc3BsYXknKT8udHJpbSgpID8/IHRhcmdldCkucmVwbGFjZUFsbCgvXFxcXCg/PVs8Pnt9XSkvZywgJycpO1xuXG4gICAgLy8gSGFuZGxlIFR5cGUubWVtYmVyIHJlZmVyZW5jZXMgKGUuZy4sIFBsdWdpbk5vdGljZUNvbXBvbmVudC5zaG93Tm90aWNlKVxuICAgIGNvbnN0IGRvdE1hdGNoID0gL14oPzx0eXBlTmFtZT5bQS1aYS16XVxcdyopXFwuKD88bWVtYmVyTmFtZT5cXHcrKSQvLmV4ZWModGFyZ2V0KTtcbiAgICBpZiAoZG90TWF0Y2gpIHtcbiAgICAgIGNvbnN0IHR5cGVOYW1lID0gZ2V0TWFuZGF0b3J5TmFtZWRHcm91cChkb3RNYXRjaCwgJ3R5cGVOYW1lJyk7XG4gICAgICBjb25zdCBtZW1iZXJOYW1lID0gZ2V0TWFuZGF0b3J5TmFtZWRHcm91cChkb3RNYXRjaCwgJ21lbWJlck5hbWUnKTtcbiAgICAgIGNvbnN0IHR5cGVJbmZvID0gZmluZFR5cGUoYWxsVHlwZXMsIHR5cGVOYW1lLCBzZWxmTmFtZXNwYWNlKTtcbiAgICAgIGlmICh0eXBlSW5mbyAmJiBkb2VzTWVtYmVyUGFnZUV4aXN0KHR5cGVJbmZvLm5hbWVzcGFjZSwgdHlwZUluZm8ubmFtZSwgbWVtYmVyUm91dGVTZWdtZW50KG1lbWJlck5hbWUpKSkge1xuICAgICAgICBjb25zdCB0YXJnZXROc0RpcmVjdG9yeSA9IGdldE5hbWVzcGFjZURpcmVjdG9yeSh0eXBlSW5mby5uYW1lc3BhY2UpO1xuICAgICAgICByZXR1cm4gYFske2Rpc3BsYXl9XSgke2dldEJhc2VQYXRoKCl9L2FwaS8ke3RhcmdldE5zRGlyZWN0b3J5fS8ke3RvVHlwZVJvdXRlU2VnbWVudCh0eXBlSW5mby5uYW1lc3BhY2UsIHR5cGVJbmZvLm5hbWUpfS8ke21lbWJlclJvdXRlU2VnbWVudChtZW1iZXJOYW1lKX0vKWA7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gSGFuZGxlIHNpbXBsZSB0eXBlIHJlZmVyZW5jZXMg4oCUIGlmIGRpc3BsYXkgY29udGFpbnMgZ2VuZXJpYyBhcmdzLCBsaW5rIGVhY2ggdHlwZSBpbmRpdmlkdWFsbHlcbiAgICBjb25zdCBpbmZvID0gZmluZFR5cGUoYWxsVHlwZXMsIHRhcmdldCwgc2VsZk5hbWVzcGFjZSk7XG4gICAgaWYgKGluZm8pIHtcbiAgICAgIHJldHVybiBkaXNwbGF5ICE9PSB0YXJnZXQgJiYgZGlzcGxheS5pbmNsdWRlcygnPCcpID8gcmVuZGVyVHlwZVdpdGhMaW5rcyhkaXNwbGF5LCBhbGxUeXBlcywgdW5kZWZpbmVkLCBzZWxmTmFtZXNwYWNlKSA6IGBbJHtkaXNwbGF5fV0oJHt0eXBlSHJlZihpbmZvKX0pYDtcbiAgICB9XG5cbiAgICBjb25zdCBleHRlcm5hbFVybCA9IHJlc29sdmVFeHRlcm5hbFR5cGVVcmwodGFyZ2V0KTtcbiAgICByZXR1cm4gZXh0ZXJuYWxVcmwgPyBgWyR7ZGlzcGxheX1dKCR7ZXh0ZXJuYWxVcmx9KWAgOiBgXFxgJHtkaXNwbGF5fVxcYGA7XG4gIH0pO1xufVxuXG4vKipcbiAqIFJlc29sdmVzIGEgVHlwZVNjcmlwdCB1dGlsaXR5IHR5cGUgdG8gaXRzIGhhbmRib29rIGVudHJ5LlxuICpcbiAqIEBwYXJhbSBuYW1lIC0gVGhlIHR5cGUncyBuYW1lLlxuICogQHJldHVybnMgVGhlIGhhbmRib29rIFVSTCwgb3IgYHVuZGVmaW5lZGAgd2hlbiBpdCBpcyBub3QgYSB1dGlsaXR5IHR5cGUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZXNvbHZlVHNVdGlsaXR5VXJsKG5hbWU6IHN0cmluZyk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IGhhc2ggPSBUU19VVElMSVRZX1RZUEVTLmdldChuYW1lKTtcbiAgaWYgKGhhc2gpIHtcbiAgICBpZiAoWydJdGVyYWJsZSddLmluY2x1ZGVzKG5hbWUpKSB7XG4gICAgICByZXR1cm4gYGh0dHBzOi8vd3d3LnR5cGVzY3JpcHRsYW5nLm9yZy9kb2NzL2hhbmRib29rL2l0ZXJhdG9ycy1hbmQtZ2VuZXJhdG9ycy5odG1sIyR7aGFzaH1gO1xuICAgIH1cbiAgICBjb25zdCBoYW5kYm9va1BhZ2UgPSBbJ0NhcGl0YWxpemUnLCAnTG93ZXJjYXNlJywgJ1VuY2FwaXRhbGl6ZScsICdVcHBlcmNhc2UnXS5pbmNsdWRlcyhuYW1lKSA/ICcyL3RlbXBsYXRlLWxpdGVyYWwtdHlwZXMnIDogJ3V0aWxpdHktdHlwZXMnOyAvLyBDc3BlbGw6ZGlzYWJsZS1saW5lXG4gICAgcmV0dXJuIGBodHRwczovL3d3dy50eXBlc2NyaXB0bGFuZy5vcmcvZG9jcy9oYW5kYm9vay8ke2hhbmRib29rUGFnZX0uaHRtbCMke2hhc2h9YDtcbiAgfVxuICByZXR1cm4gdW5kZWZpbmVkO1xufVxuXG4vKipcbiAqIFJlc29sdmVzIGEgV2ViIEFQSSB0eXBlIHRvIGl0cyBNRE4gcGFnZS5cbiAqXG4gKiBAcGFyYW0gbmFtZSAtIFRoZSB0eXBlJ3MgbmFtZS5cbiAqIEByZXR1cm5zIFRoZSBNRE4gVVJMLCBvciBgdW5kZWZpbmVkYCB3aGVuIGl0IGlzIG5vdCBhIGtub3duIFdlYiBBUEkgdHlwZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlc29sdmVXZWJBcGlVcmwobmFtZTogc3RyaW5nKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgaWYgKCFPYmplY3QuaGFzT3duKG1vZHVsZVN0YXRlLndlYkFwaVR5cGVzLCBuYW1lKSkge1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cbiAgY29uc3QgZW50cnkgPSBtb2R1bGVTdGF0ZS53ZWJBcGlUeXBlc1tuYW1lXTtcbiAgaWYgKHR5cGVvZiBlbnRyeSA9PT0gJ3N0cmluZycpIHtcbiAgICByZXR1cm4gZW50cnk7XG4gIH1cbiAgaWYgKHR5cGVvZiBlbnRyeSA9PT0gJ29iamVjdCcgJiYgZW50cnkgIT09IG51bGwgJiYgJ3VybCcgaW4gZW50cnkpIHtcbiAgICBjb25zdCB0eXBlZEVudHJ5ID0gZW50cnkgYXMgV2ViQXBpRW50cnk7XG4gICAgcmV0dXJuIHR5cGVkRW50cnkudXJsO1xuICB9XG4gIHJldHVybiB1bmRlZmluZWQ7XG59XG5cbi8qKlxuICogUmVzb2x2ZSB0aGUgbG93ZXJjYXNlZCBPTi1ESVNLIHNlZ21lbnQgZm9yIGEgdHlwZSAoZmlsZSBwYXRoICsgY29tcG9uZW50LWltcG9ydCByZWxhdGl2ZSBwYXRoKS5cbiAqXG4gKiBAcGFyYW0gbmFtZXNwYWNlIC0gVGhlIHR5cGUncyBuYW1lc3BhY2UuXG4gKiBAcGFyYW0gbmFtZSAtIFRoZSB0eXBlJ3MgbmFtZS5cbiAqIEByZXR1cm5zIFRoZSBzZWdtZW50LlxuICovXG5leHBvcnQgZnVuY3Rpb24gdG9UeXBlRmlsZVNlZ21lbnQobmFtZXNwYWNlOiBzdHJpbmcsIG5hbWU6IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiB0eXBlRmlsZVNlZ21lbnRzLmdldChgJHtuYW1lc3BhY2V9IyR7bmFtZX1gKSA/PyB0b1JvdXRlU2VnbWVudChuYW1lKTtcbn1cblxuLyoqXG4gKiBSZXNvbHZlIHRoZSBjYXNlLXByZXNlcnZlZCBVUkwvUk9VVEUgc2VnbWVudCBmb3IgYSB0eXBlIChzbHVnIGZyb250bWF0dGVyICsgaW50ZXJuYWwgbGlua3MpLlxuICpcbiAqIEBwYXJhbSBuYW1lc3BhY2UgLSBUaGUgdHlwZSdzIG5hbWVzcGFjZS5cbiAqIEBwYXJhbSBuYW1lIC0gVGhlIHR5cGUncyBuYW1lLlxuICogQHJldHVybnMgVGhlIHNlZ21lbnQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB0b1R5cGVSb3V0ZVNlZ21lbnQobmFtZXNwYWNlOiBzdHJpbmcsIG5hbWU6IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiB0eXBlUm91dGVTZWdtZW50cy5nZXQoYCR7bmFtZXNwYWNlfSMke25hbWV9YCkgPz8gdG9Sb3V0ZVNlZ21lbnRQcmVzZXJ2ZUNhc2UobmFtZSk7XG59XG5cbi8qKlxuICogQWJzb2x1dGUgbGluayB0byBhIHR5cGUncyBvdmVydmlldyBwYWdlLlxuICpcbiAqIEBwYXJhbSBpbmZvIC0gVGhlIGRvY3VtZW50ZWQgdHlwZS5cbiAqIEByZXR1cm5zIFRoZSBsaW5rLlxuICovXG5leHBvcnQgZnVuY3Rpb24gdHlwZUhyZWYoaW5mbzogVHlwZUluZm8pOiBzdHJpbmcge1xuICByZXR1cm4gYCR7Z2V0QmFzZVBhdGgoKX0vYXBpLyR7Z2V0TmFtZXNwYWNlRGlyZWN0b3J5KGluZm8ubmFtZXNwYWNlKX0vJHt0b1R5cGVSb3V0ZVNlZ21lbnQoaW5mby5uYW1lc3BhY2UsIGluZm8ubmFtZSl9L2A7XG59XG5cbi8qKlxuICogQ3JlYXRlIGFuIGFic29sdXRlIGxpbmsgdG8gYSB0eXBlIHBhZ2VcbiAqXG4gKiBAcGFyYW0gdHlwZU5hbWUgLSBUaGUgdHlwZSdzIG5hbWUuXG4gKiBAcGFyYW0gYWxsVHlwZXMgLSBFdmVyeSBkb2N1bWVudGVkIHR5cGUsIGtleWVkIGJ5IGAke25hbWVzcGFjZX0jJHtuYW1lfWAuXG4gKiBAcGFyYW0gY3VycmVudE5hbWVzcGFjZSAtIFRoZSBuYW1lc3BhY2Ugb2YgdGhlIHJlZmVyZW5jaW5nIHBhZ2UsIHByZWZlcnJlZCB3aGVuIHRoZSBuYW1lIGlzIGFtYmlndW91cy5cbiAqIEByZXR1cm5zIEEgbWFya2Rvd24gbGluaywgb3IgaW5saW5lIGNvZGUgd2hlbiB0aGUgdHlwZSBpcyBub3QgZG9jdW1lbnRlZC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHR5cGVMaW5rKHR5cGVOYW1lOiBzdHJpbmcsIGFsbFR5cGVzOiBNYXA8c3RyaW5nLCBUeXBlSW5mbz4sIGN1cnJlbnROYW1lc3BhY2U/OiBzdHJpbmcpOiBzdHJpbmcge1xuICBjb25zdCBjbGVhbk5hbWUgPSB0eXBlTmFtZS5yZXBsYWNlKC88Lio+JC8sICcnKS50cmltKCk7XG4gIGNvbnN0IGluZm8gPSBmaW5kVHlwZShhbGxUeXBlcywgY2xlYW5OYW1lLCBjdXJyZW50TmFtZXNwYWNlKTtcbiAgcmV0dXJuIGluZm8gPyBgWyR7ZXNjYXBlTWR4QW5nbGVCcmFja2V0cyh0eXBlTmFtZSl9XSgke3R5cGVIcmVmKGluZm8pfSlgIDogYFxcYCR7dHlwZU5hbWV9XFxgYDtcbn1cblxuZnVuY3Rpb24gZGlzYW1iaWd1YXRlKGJhc2U6IHN0cmluZywgdXNlZDogU2V0PHN0cmluZz4sIGtleU9mOiAoc2VnbWVudDogc3RyaW5nKSA9PiBzdHJpbmcpOiBzdHJpbmcge1xuICBsZXQgc2VnbWVudCA9IGJhc2U7XG4gIGNvbnN0IEZJUlNUX0RJU0FNQklHVUFUSU9OX1NVRkZJWCA9IDI7XG4gIGxldCBzdWZmaXggPSBGSVJTVF9ESVNBTUJJR1VBVElPTl9TVUZGSVg7XG4gIHdoaWxlICh1c2VkLmhhcyhrZXlPZihzZWdtZW50KSkpIHtcbiAgICBzZWdtZW50ID0gYCR7YmFzZX0tJHtTdHJpbmcoc3VmZml4KX1gO1xuICAgIHN1ZmZpeCsrO1xuICB9XG4gIHVzZWQuYWRkKGtleU9mKHNlZ21lbnQpKTtcbiAgcmV0dXJuIHNlZ21lbnQ7XG59XG5cbmZ1bmN0aW9uIGdldEJhc2VQYXRoKCk6IHN0cmluZyB7XG4gIHJldHVybiBnZXRBcGlEb2NTZXR0aW5ncygpLmJhc2VQYXRoO1xufVxuXG4vKipcbiAqIFdhcm4gd2hlbiB0d28gZGlzdGluY3QgbWVtYmVycyBvZiBhIHR5cGUgcHJvZHVjZSB0aGUgc2FtZSBtZW1iZXIgc2x1ZyAoVVJML2ZpbGUgc2VnbWVudCkuIFRoZVxuICogb3B0aW9uYWwtYD9gIHN1ZmZpeCBpcyBzdHJpcHBlZCBmaXJzdCwgc28gYSBwcm9wZXJ0eSBhcHBlYXJpbmcgYXMgYm90aCByZXF1aXJlZCBhbmQgb3B0aW9uYWwgaXMgbm90XG4gKiBhIGZhbHNlIHBvc2l0aXZlLlxuICpcbiAqIEBwYXJhbSBpbmZvIC0gVGhlIHR5cGUuXG4gKiBAcGFyYW0gbmFtZXNwYWNlIC0gVGhlIHR5cGUncyBuYW1lc3BhY2UuXG4gKi9cbmZ1bmN0aW9uIHdhcm5NZW1iZXJTbHVnQ29sbGlzaW9ucyhpbmZvOiBUeXBlSW5mbywgbmFtZXNwYWNlOiBzdHJpbmcpOiB2b2lkIHtcbiAgY29uc3Qgc2VlbiA9IG5ldyBNYXA8c3RyaW5nLCBzdHJpbmc+KCk7XG4gIGZ1bmN0aW9uIGNoZWNrKHNsdWc6IHN0cmluZywgb3JpZ2luYWw6IHN0cmluZyk6IHZvaWQge1xuICAgIGNvbnN0IG5vcm1hbGl6ZWQgPSBvcmlnaW5hbC5yZXBsYWNlKC9cXD8kLywgJycpO1xuICAgIGNvbnN0IGV4aXN0aW5nID0gc2Vlbi5nZXQoc2x1Zyk7XG4gICAgaWYgKGV4aXN0aW5nICE9PSB1bmRlZmluZWQgJiYgZXhpc3RpbmcgIT09IG5vcm1hbGl6ZWQpIHtcbiAgICAgIGNvbnNvbGUud2FybihgTWVtYmVyIHJvdXRlIGNvbGxpc2lvbiBpbiBcIiR7bmFtZXNwYWNlfSMke2luZm8ubmFtZX1cIjogXCIke2V4aXN0aW5nfVwiIGFuZCBcIiR7bm9ybWFsaXplZH1cIiBib3RoIG1hcCB0byBcIi8ke3NsdWd9L1wiLmApO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBzZWVuLnNldChzbHVnLCBub3JtYWxpemVkKTtcbiAgfVxuICBmb3IgKGNvbnN0IHByb3BlcnR5IG9mIGluZm8ucHJvcGVydGllcykge1xuICAgIGNoZWNrKG1lbWJlclNsdWcocHJvcGVydHkubmFtZSksIHByb3BlcnR5Lm5hbWUpO1xuICB9XG4gIGZvciAoY29uc3QgbWV0aG9kIG9mIGluZm8ubWV0aG9kcykge1xuICAgIGNoZWNrKG92ZXJsb2FkU2x1ZyhtZXRob2Qub3ZlcmxvYWRLZXkpLCBtZXRob2Qub3ZlcmxvYWRLZXkpO1xuICB9XG59XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBT0E7QUFBQSxFQUNFO0FBQUEsRUFDQTtBQUFBLE9BQ0s7QUFDUCxTQUFTLG9CQUFvQjtBQUM3QixTQUFTLFlBQVk7QUFPckI7QUFBQSxFQUNFO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsT0FDSztBQUNQLFNBQVMseUJBQXlCO0FBQ2xDO0FBQUEsRUFDRTtBQUFBLEVBQ0E7QUFBQSxPQUNLO0FBQ1AsU0FBUyx5QkFBeUI7QUFDbEM7QUFBQSxFQUNFO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxPQUNLO0FBYVAsTUFBTSxjQUEyQjtBQUFBLEVBQy9CLGFBQWEsQ0FBQztBQUNoQjtBQUlBLE1BQU0sbUJBQW1CLG9CQUFJLElBQW9CO0FBSWpELE1BQU0sb0JBQW9CLG9CQUFJLElBQW9CO0FBUWxELE1BQU0sdUJBQXVCLG9CQUFJLElBQVk7QUFVdEMsU0FBUyxvQkFBb0IsV0FBbUIsVUFBa0IsY0FBK0I7QUFDdEcsU0FBTyxxQkFBcUIsSUFBSSxHQUFHLFNBQVMsSUFBSSxRQUFRLElBQUksWUFBWSxFQUFFO0FBQzVFO0FBZ0JPLFNBQVMsU0FBUyxVQUFpQyxNQUFjLGtCQUFpRDtBQUN2SCxNQUFJLHFCQUFxQixRQUFXO0FBQ2xDLFVBQU0sWUFBWSxTQUFTLElBQUksR0FBRyxnQkFBZ0IsSUFBSSxJQUFJLEVBQUU7QUFDNUQsUUFBSSxXQUFXO0FBQ2IsYUFBTztBQUFBLElBQ1Q7QUFBQSxFQUNGO0FBQ0EsTUFBSTtBQUNKLE1BQUksYUFBYTtBQUNqQixhQUFXLFFBQVEsU0FBUyxPQUFPLEdBQUc7QUFDcEMsUUFBSSxLQUFLLFNBQVMsTUFBTTtBQUN0QjtBQUFBLElBQ0Y7QUFFQSxZQUFRO0FBQ1I7QUFDQSxRQUFJLGFBQWEsR0FBRztBQUNsQixhQUFPO0FBQUEsSUFDVDtBQUFBLEVBQ0Y7QUFDQSxTQUFPLGVBQWUsSUFBSSxRQUFRO0FBQ3BDO0FBY08sU0FBUyxhQUFhLFVBQWtCLFVBQWlDLGtCQUFtQztBQUNqSCxRQUFNLGtCQUFrQixrQ0FBa0MsS0FBSyxTQUFTLEtBQUssQ0FBQztBQUM5RSxTQUFPLGtCQUFrQix1QkFBdUIsb0JBQW9CLFVBQVUsVUFBVSxRQUFXLGdCQUFnQixDQUFDLElBQUksU0FBUyxVQUFVLFVBQVUsZ0JBQWdCO0FBQ3ZLO0FBUU8sU0FBUyxxQkFBcUIsZUFBNkI7QUFDaEUsTUFBSTtBQUNGLFVBQU0sV0FBVyxLQUFLLGVBQWUseURBQXlEO0FBQzlGLGdCQUFZLGNBQWMsS0FBSyxNQUFNLGFBQWEsVUFBVSxPQUFPLENBQUM7QUFDcEUsWUFBUSxLQUFLLFVBQVUsT0FBTyxPQUFPLEtBQUssWUFBWSxXQUFXLEVBQUUsTUFBTSxDQUFDLHFCQUFxQjtBQUFBLEVBQ2pHLFFBQVE7QUFDTixnQkFBWSxjQUFjLENBQUM7QUFDM0IsWUFBUSxLQUFLLG1GQUE4RTtBQUFBLEVBQzdGO0FBQ0Y7QUFRTyxTQUFTLGVBQWUsTUFBc0I7QUFDbkQsUUFBTSxVQUFVLEtBQ2IsV0FBVyxLQUFLLE9BQU8sRUFDdkIsV0FBVyxLQUFLLE1BQU0sRUFDdEIsV0FBVyxLQUFLLE1BQU07QUFDekIsU0FBTyxxQkFBcUIsU0FBUyx5Q0FBeUMsQ0FBQyxVQUFVO0FBQ3ZGLFVBQU0sV0FBVyx1QkFBdUIsT0FBTyxNQUFNO0FBQ3JELFVBQU0sTUFBTSx1QkFBdUIsT0FBTyxLQUFLO0FBRy9DLFdBQU8sZ0NBQWdDLEtBQUssR0FBRyxJQUFJLFlBQVksR0FBRyxLQUFLLFFBQVEsU0FBUyxVQUFVLFFBQVEsS0FBSyxHQUFHO0FBQUEsRUFDcEgsQ0FBQyxFQUNFLFdBQVcscUJBQXFCLHNCQUFzQixFQUN0RCxXQUFXLE1BQU0sT0FBTztBQUM3QjtBQVdPLFNBQVMsV0FBVyxrQkFBMEIsZUFBdUIsVUFBaUMsa0JBQW1DO0FBQzlJLE1BQUksQ0FBQyxlQUFlO0FBRWxCLFdBQU8sS0FBSyxnQkFBZ0I7QUFBQSxFQUM5QjtBQUNBLE1BQUksYUFBYSxTQUFTLFVBQVUsZUFBZSxnQkFBZ0I7QUFDbkUsUUFBTSxVQUFVLG9CQUFJLElBQWM7QUFDbEMsU0FBTyxjQUFjLENBQUMsb0JBQW9CLFdBQVcsV0FBVyxXQUFXLE1BQU0sZ0JBQWdCLEdBQUc7QUFDbEcsUUFBSSxRQUFRLElBQUksVUFBVSxHQUFHO0FBQzNCLGFBQU87QUFBQSxJQUNUO0FBQ0EsWUFBUSxJQUFJLFVBQVU7QUFDdEIsVUFBTSxTQUFTLFdBQVcsV0FBVyxLQUFLLENBQUMsYUFBYSxtQkFBbUIsU0FBUyxJQUFJLE1BQU0sZ0JBQWdCLEtBQ3pHLFdBQVcsUUFBUSxLQUFLLENBQUMsV0FBVyxxQkFBcUIsT0FBTyxXQUFXLE1BQU0sZ0JBQWdCO0FBQ3RHLGlCQUFhLFFBQVEsZ0JBQWdCLFNBQVMsVUFBVSxPQUFPLGVBQWUsV0FBVyxTQUFTLElBQUk7QUFBQSxFQUN4RztBQUNBLE1BQUksQ0FBQyxjQUFjLENBQUMsb0JBQW9CLFdBQVcsV0FBVyxXQUFXLE1BQU0sZ0JBQWdCLEdBQUc7QUFFaEcsV0FBTztBQUFBLEVBQ1Q7QUFDQSxRQUFNLG9CQUFvQixzQkFBc0IsV0FBVyxTQUFTO0FBQ3BFLFNBQU8sR0FBRyxZQUFZLENBQUMsUUFBUSxpQkFBaUIsSUFBSSxtQkFBbUIsV0FBVyxXQUFXLFdBQVcsSUFBSSxDQUFDLElBQUksZ0JBQWdCO0FBQ25JO0FBU08sU0FBUyxvQkFBb0IsT0FBb0M7QUFDdEUsdUJBQXFCLE1BQU07QUFDM0IsYUFBVyxRQUFRLE1BQU0sT0FBTyxHQUFHO0FBQ2pDLGVBQVcsWUFBWSxLQUFLLFlBQVk7QUFDdEMsVUFBSSxDQUFDLFNBQVMsZUFBZTtBQUMzQiw2QkFBcUIsSUFBSSxHQUFHLEtBQUssU0FBUyxJQUFJLEtBQUssSUFBSSxJQUFJLG1CQUFtQixTQUFTLElBQUksQ0FBQyxFQUFFO0FBQUEsTUFDaEc7QUFBQSxJQUNGO0FBQ0EsVUFBTSxlQUFlLG9CQUFJLElBQVk7QUFDckMsZUFBVyxVQUFVLEtBQUssU0FBUztBQUNqQyxVQUFJLENBQUMsT0FBTyxlQUFlO0FBQ3pCLHFCQUFhLElBQUksT0FBTyxXQUFXO0FBQUEsTUFDckM7QUFBQSxJQUNGO0FBQ0EsZUFBVyxlQUFlLGNBQWM7QUFDdEMsMkJBQXFCLElBQUksR0FBRyxLQUFLLFNBQVMsSUFBSSxLQUFLLElBQUksSUFBSSxxQkFBcUIsV0FBVyxDQUFDLEVBQUU7QUFBQSxJQUNoRztBQUFBLEVBQ0Y7QUFDRjtBQWNPLFNBQVMsc0JBQXNCLE9BQW9DO0FBQ3hFLG1CQUFpQixNQUFNO0FBQ3ZCLG9CQUFrQixNQUFNO0FBQ3hCLFFBQU0sY0FBYyxvQkFBSSxJQUF3QjtBQUVoRCxhQUFXLFFBQVEsTUFBTSxPQUFPLEdBQUc7QUFDakMsVUFBTSxPQUFPLFlBQVksSUFBSSxLQUFLLFNBQVMsS0FBSyxDQUFDO0FBQ2pELFNBQUssS0FBSyxJQUFJO0FBQ2QsZ0JBQVksSUFBSSxLQUFLLFdBQVcsSUFBSTtBQUFBLEVBQ3RDO0FBQ0EsYUFBVyxDQUFDLFdBQVcsS0FBSyxLQUFLLGFBQWE7QUFDNUMsVUFBTSxtQkFBbUIsb0JBQUksSUFBWTtBQUN6QyxVQUFNLG9CQUFvQixvQkFBSSxJQUFZO0FBQzFDLFVBQU0sU0FBUyxDQUFDLEdBQUcsS0FBSyxFQUFFLEtBQUssQ0FBQyxPQUFPLFVBQVUsTUFBTSxLQUFLLGNBQWMsTUFBTSxJQUFJLENBQUM7QUFDckYsZUFBVyxRQUFRLFFBQVE7QUFDekIsdUJBQWlCLElBQUksR0FBRyxTQUFTLElBQUksS0FBSyxJQUFJLElBQUksYUFBYSxlQUFlLEtBQUssSUFBSSxHQUFHLGtCQUFrQixDQUFDLFlBQVksT0FBTyxDQUFDO0FBRWpJLFlBQU0sWUFBWSwyQkFBMkIsS0FBSyxJQUFJO0FBS3RELFlBQU0sZUFBZSxhQUFhLFdBQVcsbUJBQW1CLENBQUMsWUFBWSxRQUFRLFlBQVksQ0FBQztBQUNsRyx3QkFBa0IsSUFBSSxHQUFHLFNBQVMsSUFBSSxLQUFLLElBQUksSUFBSSxZQUFZO0FBQy9ELFVBQUksaUJBQWlCLFdBQVc7QUFDOUIsZ0JBQVEsS0FBSyw0QkFBNEIsU0FBUyxJQUFJLEtBQUssSUFBSSxPQUFPLFNBQVMsU0FBUyxZQUFZLHFCQUFxQjtBQUFBLE1BQzNIO0FBQ0EsK0JBQXlCLE1BQU0sU0FBUztBQUFBLElBQzFDO0FBQUEsRUFDRjtBQUNGO0FBWU8sU0FBUyxpQkFBaUIsU0FBaUIsVUFBaUMsZUFBZ0M7QUFDakgsU0FBTyx5QkFBeUIsS0FBSyxPQUFPLElBQUksZUFBZSxTQUFTLFVBQVUsYUFBYSxJQUFJO0FBQUEsRUFBYSxPQUFPO0FBQUE7QUFDekg7QUFZTyxTQUFTLGVBQWUsTUFBYyxVQUFpQyxlQUFnQztBQUM1RyxRQUFNLE1BQWdCLENBQUM7QUFDdkIsYUFBVyxPQUFPLGdCQUFnQixJQUFJLEdBQUc7QUFDdkMsUUFBSSxJQUFJLFNBQVMsUUFBUTtBQUN2QixVQUFJLEtBQUssSUFBSSxTQUFTLElBQUksUUFBUSxJQUFJLElBQUksSUFBSSxNQUFNLE9BQU8sRUFBRTtBQUFBLElBQy9ELE9BQU87QUFDTCxVQUFJLEtBQUssZUFBZSxhQUFhLElBQUksTUFBTSxVQUFVLGFBQWEsQ0FBQyxDQUFDO0FBQUEsSUFDMUU7QUFBQSxFQUNGO0FBQ0EsU0FBTyxJQUFJLEtBQUssSUFBSSxFQUFFLFdBQVcsV0FBVyxNQUFNLEVBQUUsS0FBSztBQUMzRDtBQVdPLFNBQVMsb0JBQW9CLFVBQWtCLFVBQWlDLGNBQXVCLGVBQWdDO0FBRTVJLFFBQU0sa0JBQWtCO0FBQ3hCLFFBQU0sb0JBQW9CLHFCQUFxQixVQUFVLGdEQUFnRCxDQUFDLFVBQVU7QUFDbEgsVUFBTSxTQUFTLHVCQUF1QixPQUFPLFFBQVE7QUFDckQsV0FBTyxZQUFZLGVBQWUsTUFBTSxNQUFNLEtBQUssZUFBZSxJQUFJLE1BQU07QUFBQSxFQUM5RSxDQUFDO0FBRUQsU0FBTztBQUFBLElBQ0w7QUFBQSxJQUNBO0FBQUEsSUFDQSxDQUFDLFVBQVU7QUFDVCxZQUFNLFdBQVcsc0JBQXNCLE9BQU8sVUFBVTtBQUN4RCxVQUFJLGFBQWEsTUFBTTtBQUNyQixlQUFPLE1BQU0sQ0FBQztBQUFBLE1BQ2hCO0FBRUEsVUFBSSxhQUFhLFVBQVUsY0FBYztBQUN2QyxjQUFNLFdBQVcsU0FBUyxVQUFVLGNBQWMsYUFBYTtBQUMvRCxZQUFJLFVBQVU7QUFDWixpQkFBTyxJQUFJLFFBQVEsS0FBSyxTQUFTLFFBQVEsQ0FBQztBQUFBLFFBQzVDO0FBQUEsTUFDRjtBQUdBLFVBQUksb0JBQW9CLElBQUksUUFBUSxHQUFHO0FBQ3JDLGVBQU87QUFBQSxNQUNUO0FBR0EsWUFBTSxPQUFPLFNBQVMsVUFBVSxVQUFVLGFBQWE7QUFDdkQsVUFBSSxNQUFNO0FBQ1IsZUFBTyxJQUFJLFFBQVEsS0FBSyxTQUFTLElBQUksQ0FBQztBQUFBLE1BQ3hDO0FBR0EsWUFBTSxjQUFjLHVCQUF1QixRQUFRO0FBQ25ELFVBQUksYUFBYTtBQUNmLGVBQU8sSUFBSSxRQUFRLEtBQUssV0FBVztBQUFBLE1BQ3JDO0FBR0EsWUFBTSxRQUFRLG9CQUFvQixRQUFRO0FBQzFDLFVBQUksT0FBTztBQUNULGVBQU8sSUFBSSxRQUFRLEtBQUssS0FBSztBQUFBLE1BQy9CO0FBR0EsWUFBTSxZQUFZLE9BQU8sT0FBTyxpQkFBaUIsUUFBUSxJQUFJLGdCQUFnQixRQUFRLElBQUk7QUFDekYsVUFBSSxXQUFXO0FBQ2IsZUFBTyxJQUFJLFFBQVEsS0FBSyxTQUFTO0FBQUEsTUFDbkM7QUFHQSxZQUFNLFNBQVMsaUJBQWlCLFFBQVE7QUFDeEMsVUFBSSxRQUFRO0FBQ1YsZUFBTyxJQUFJLFFBQVEsS0FBSyxNQUFNO0FBQUEsTUFDaEM7QUFHQSxZQUFNLGVBQWUsT0FBTyxPQUFPLG9CQUFvQixRQUFRLElBQUksbUJBQW1CLFFBQVEsSUFBSTtBQUNsRyxhQUFPLGVBQWUsSUFBSSxRQUFRLEtBQUssWUFBWSxNQUFNO0FBQUEsSUFDM0Q7QUFBQSxFQUNGO0FBQ0Y7QUFTTyxTQUFTLHVCQUF1QixNQUFrQztBQUN2RSxTQUFPLGtCQUFrQixJQUFJLEtBQUssa0JBQWtCLEVBQUUsa0JBQWtCLElBQUksSUFBSTtBQUNsRjtBQVVPLFNBQVMsYUFBYSxNQUFjLFVBQWlDLGVBQWdDO0FBQzFHLFNBQU8scUJBQXFCLE1BQU0sa0VBQWtFLENBQUMsVUFBVTtBQUM3RyxVQUFNLFNBQVMsdUJBQXVCLE9BQU8sUUFBUSxFQUFFLEtBQUs7QUFDNUQsVUFBTSxXQUFXLHNCQUFzQixPQUFPLFNBQVMsR0FBRyxLQUFLLEtBQUssUUFBUSxXQUFXLGlCQUFpQixFQUFFO0FBRzFHLFVBQU0sV0FBVyxpREFBaUQsS0FBSyxNQUFNO0FBQzdFLFFBQUksVUFBVTtBQUNaLFlBQU0sV0FBVyx1QkFBdUIsVUFBVSxVQUFVO0FBQzVELFlBQU0sYUFBYSx1QkFBdUIsVUFBVSxZQUFZO0FBQ2hFLFlBQU0sV0FBVyxTQUFTLFVBQVUsVUFBVSxhQUFhO0FBQzNELFVBQUksWUFBWSxvQkFBb0IsU0FBUyxXQUFXLFNBQVMsTUFBTSxtQkFBbUIsVUFBVSxDQUFDLEdBQUc7QUFDdEcsY0FBTSxvQkFBb0Isc0JBQXNCLFNBQVMsU0FBUztBQUNsRSxlQUFPLElBQUksT0FBTyxLQUFLLFlBQVksQ0FBQyxRQUFRLGlCQUFpQixJQUFJLG1CQUFtQixTQUFTLFdBQVcsU0FBUyxJQUFJLENBQUMsSUFBSSxtQkFBbUIsVUFBVSxDQUFDO0FBQUEsTUFDMUo7QUFBQSxJQUNGO0FBR0EsVUFBTSxPQUFPLFNBQVMsVUFBVSxRQUFRLGFBQWE7QUFDckQsUUFBSSxNQUFNO0FBQ1IsYUFBTyxZQUFZLFVBQVUsUUFBUSxTQUFTLEdBQUcsSUFBSSxvQkFBb0IsU0FBUyxVQUFVLFFBQVcsYUFBYSxJQUFJLElBQUksT0FBTyxLQUFLLFNBQVMsSUFBSSxDQUFDO0FBQUEsSUFDeEo7QUFFQSxVQUFNLGNBQWMsdUJBQXVCLE1BQU07QUFDakQsV0FBTyxjQUFjLElBQUksT0FBTyxLQUFLLFdBQVcsTUFBTSxLQUFLLE9BQU87QUFBQSxFQUNwRSxDQUFDO0FBQ0g7QUFRTyxTQUFTLG9CQUFvQixNQUFrQztBQUNwRSxRQUFNLE9BQU8saUJBQWlCLElBQUksSUFBSTtBQUN0QyxNQUFJLE1BQU07QUFDUixRQUFJLENBQUMsVUFBVSxFQUFFLFNBQVMsSUFBSSxHQUFHO0FBQy9CLGFBQU8sOEVBQThFLElBQUk7QUFBQSxJQUMzRjtBQUNBLFVBQU0sZUFBZSxDQUFDLGNBQWMsYUFBYSxnQkFBZ0IsV0FBVyxFQUFFLFNBQVMsSUFBSSxJQUFJLDZCQUE2QjtBQUM1SCxXQUFPLGdEQUFnRCxZQUFZLFNBQVMsSUFBSTtBQUFBLEVBQ2xGO0FBQ0EsU0FBTztBQUNUO0FBUU8sU0FBUyxpQkFBaUIsTUFBa0M7QUFDakUsTUFBSSxDQUFDLE9BQU8sT0FBTyxZQUFZLGFBQWEsSUFBSSxHQUFHO0FBQ2pELFdBQU87QUFBQSxFQUNUO0FBQ0EsUUFBTSxRQUFRLFlBQVksWUFBWSxJQUFJO0FBQzFDLE1BQUksT0FBTyxVQUFVLFVBQVU7QUFDN0IsV0FBTztBQUFBLEVBQ1Q7QUFDQSxNQUFJLE9BQU8sVUFBVSxZQUFZLFVBQVUsUUFBUSxTQUFTLE9BQU87QUFDakUsVUFBTSxhQUFhO0FBQ25CLFdBQU8sV0FBVztBQUFBLEVBQ3BCO0FBQ0EsU0FBTztBQUNUO0FBU08sU0FBUyxrQkFBa0IsV0FBbUIsTUFBc0I7QUFDekUsU0FBTyxpQkFBaUIsSUFBSSxHQUFHLFNBQVMsSUFBSSxJQUFJLEVBQUUsS0FBSyxlQUFlLElBQUk7QUFDNUU7QUFTTyxTQUFTLG1CQUFtQixXQUFtQixNQUFzQjtBQUMxRSxTQUFPLGtCQUFrQixJQUFJLEdBQUcsU0FBUyxJQUFJLElBQUksRUFBRSxLQUFLLDJCQUEyQixJQUFJO0FBQ3pGO0FBUU8sU0FBUyxTQUFTLE1BQXdCO0FBQy9DLFNBQU8sR0FBRyxZQUFZLENBQUMsUUFBUSxzQkFBc0IsS0FBSyxTQUFTLENBQUMsSUFBSSxtQkFBbUIsS0FBSyxXQUFXLEtBQUssSUFBSSxDQUFDO0FBQ3ZIO0FBVU8sU0FBUyxTQUFTLFVBQWtCLFVBQWlDLGtCQUFtQztBQUM3RyxRQUFNLFlBQVksU0FBUyxRQUFRLFNBQVMsRUFBRSxFQUFFLEtBQUs7QUFDckQsUUFBTSxPQUFPLFNBQVMsVUFBVSxXQUFXLGdCQUFnQjtBQUMzRCxTQUFPLE9BQU8sSUFBSSx1QkFBdUIsUUFBUSxDQUFDLEtBQUssU0FBUyxJQUFJLENBQUMsTUFBTSxLQUFLLFFBQVE7QUFDMUY7QUFFQSxTQUFTLGFBQWEsTUFBYyxNQUFtQixPQUE0QztBQUNqRyxNQUFJLFVBQVU7QUFDZCxRQUFNLDhCQUE4QjtBQUNwQyxNQUFJLFNBQVM7QUFDYixTQUFPLEtBQUssSUFBSSxNQUFNLE9BQU8sQ0FBQyxHQUFHO0FBQy9CLGNBQVUsR0FBRyxJQUFJLElBQUksT0FBTyxNQUFNLENBQUM7QUFDbkM7QUFBQSxFQUNGO0FBQ0EsT0FBSyxJQUFJLE1BQU0sT0FBTyxDQUFDO0FBQ3ZCLFNBQU87QUFDVDtBQUVBLFNBQVMsY0FBc0I7QUFDN0IsU0FBTyxrQkFBa0IsRUFBRTtBQUM3QjtBQVVBLFNBQVMseUJBQXlCLE1BQWdCLFdBQXlCO0FBQ3pFLFFBQU0sT0FBTyxvQkFBSSxJQUFvQjtBQUNyQyxXQUFTLE1BQU0sTUFBYyxVQUF3QjtBQUNuRCxVQUFNLGFBQWEsU0FBUyxRQUFRLE9BQU8sRUFBRTtBQUM3QyxVQUFNLFdBQVcsS0FBSyxJQUFJLElBQUk7QUFDOUIsUUFBSSxhQUFhLFVBQWEsYUFBYSxZQUFZO0FBQ3JELGNBQVEsS0FBSyw4QkFBOEIsU0FBUyxJQUFJLEtBQUssSUFBSSxPQUFPLFFBQVEsVUFBVSxVQUFVLG1CQUFtQixJQUFJLEtBQUs7QUFDaEk7QUFBQSxJQUNGO0FBQ0EsU0FBSyxJQUFJLE1BQU0sVUFBVTtBQUFBLEVBQzNCO0FBQ0EsYUFBVyxZQUFZLEtBQUssWUFBWTtBQUN0QyxVQUFNLFdBQVcsU0FBUyxJQUFJLEdBQUcsU0FBUyxJQUFJO0FBQUEsRUFDaEQ7QUFDQSxhQUFXLFVBQVUsS0FBSyxTQUFTO0FBQ2pDLFVBQU0sYUFBYSxPQUFPLFdBQVcsR0FBRyxPQUFPLFdBQVc7QUFBQSxFQUM1RDtBQUNGOyIsIm5hbWVzIjpbXX0=
@@ -78,13 +78,23 @@ function parseTypeArguments(baseTypeName) {
78
78
  return $arguments;
79
79
  }
80
80
  function resolveInheritedMembers(types) {
81
- for (const [, info] of types) {
81
+ const resolved = /* @__PURE__ */ new Set();
82
+ const resolving = /* @__PURE__ */ new Set();
83
+ for (const info of types.values()) {
84
+ resolve(info);
85
+ }
86
+ function resolve(info) {
87
+ if (resolved.has(info)) {
88
+ return;
89
+ }
90
+ resolving.add(info);
82
91
  for (const baseTypeName of [...info.baseTypes, ...info.implementsTypes]) {
83
92
  const cleanBase = baseTypeName.replace(/<.*>$/, "").trim();
84
93
  const baseInfo = findType(types, cleanBase, info.namespace);
85
- if (!baseInfo) {
94
+ if (!baseInfo || resolving.has(baseInfo)) {
86
95
  continue;
87
96
  }
97
+ resolve(baseInfo);
88
98
  const typeArguments = parseTypeArguments(baseTypeName);
89
99
  const typeParameterMap = buildTypeParameterMap(baseInfo, typeArguments);
90
100
  for (const property of baseInfo.properties) {
@@ -93,13 +103,15 @@ function resolveInheritedMembers(types) {
93
103
  }
94
104
  }
95
105
  for (const method of baseInfo.methods) {
96
- const hasOwnMethod = info.methods.some((m) => m.name === method.name && m.signature === method.signature);
97
- const hasInheritedMethod = info.methods.some((m) => m.inheritedFrom === baseInfo.name && m.overloadKey === method.overloadKey);
98
- if (!hasOwnMethod && !hasInheritedMethod) {
99
- info.methods.push(substituteMemberTypes({ ...method, inheritedFrom: baseInfo.name }, typeParameterMap));
106
+ const inheritedMethod = substituteMemberTypes({ ...method, inheritedFrom: baseInfo.name }, typeParameterMap);
107
+ const hasMethod = info.methods.some((m) => m.name === inheritedMethod.name && m.signature === inheritedMethod.signature);
108
+ if (!hasMethod) {
109
+ info.methods.push(inheritedMethod);
100
110
  }
101
111
  }
102
112
  }
113
+ resolving.delete(info);
114
+ resolved.add(info);
103
115
  }
104
116
  }
105
117
  function substituteMemberTypes(member, mapping) {
@@ -126,4 +138,4 @@ export {
126
138
  substituteMemberTypes,
127
139
  substituteTypeParams
128
140
  };
129
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9kb2NzLXNpdGUvYXBpLWRvYy10eXBlLW1lcmdpbmcudHMiXSwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAZmlsZVxuICpcbiAqIEluaGVyaXRhbmNlIHJlc29sdXRpb246IGNvcGllcyBpbmhlcml0ZWQgbWVtYmVycyBvbnRvIHN1YnR5cGVzLCBzdWJzdGl0dXRpbmcgZ2VuZXJpYyB0eXBlIGFyZ3MuXG4gKlxuICogKEEgZG9jdW1lbnRlZCBwYWNrYWdlIGlzIGEgbm9ybWFsIGxpYnJhcnksIG5vdCBhbiBhdWdtZW50YXRpb24gb2YgYW5vdGhlciBwYWNrYWdlJ3MgZGVjbGFyYXRpb25zLCBzbyB0aGVyZSBpcyBub1xuICogb2ZmaWNpYWwtdnMtdW5vZmZpY2lhbCBtZXJnZSBtYWNoaW5lcnkgaGVyZSDigJQgb25seSB0aGUgZ2VuZXJpYyBpbmhlcml0YW5jZSBoZWxwZXJzLilcbiAqL1xuXG5pbXBvcnQgeyBlbnN1cmVOb25OdWxsYWJsZSB9IGZyb20gJ0BtbmFvdW1vdi90eXBlc2NyaXB0LWxpYi90eXBlLWd1YXJkcyc7XG5cbmltcG9ydCB0eXBlIHtcbiAgTWVtYmVySW5mbyxcbiAgVHlwZUluZm9cbn0gZnJvbSAnLi9hcGktZG9jLXR5cGVzLnRzJztcblxuaW1wb3J0IHsgZmluZFR5cGUgfSBmcm9tICcuL2FwaS1kb2MtbGluay1yZW5kZXJpbmcudHMnO1xuXG4vKipcbiAqIEJ1aWxkIGEgbWFwcGluZyBmcm9tIHBhcmVudCB0eXBlIHBhcmFtZXRlciBuYW1lcyB0byBjb25jcmV0ZSB0eXBlIGFyZ3VtZW50cy5cbiAqIEUuZy4sIHBhcmVudCBoYXMgYHR5cGVQYXJhbWV0ZXJzOiBbJ0luc3RhbmNlIGV4dGVuZHMgQmFzZUluc3RhbmNlJ11gIGFuZFxuICogY2hpbGQgZXh0ZW5kcyBgUGFyZW50PENhbnZhc1BsdWdpbkluc3RhbmNlPmAg4oaSIGB7SW5zdGFuY2U6ICdDYW52YXNQbHVnaW5JbnN0YW5jZSd9YFxuICpcbiAqIEBwYXJhbSBiYXNlSW5mbyAtIFRoZSBiYXNlIHR5cGUuXG4gKiBAcGFyYW0gdHlwZUFyZ3VtZW50cyAtIFRoZSB0eXBlIGFyZ3VtZW50cyB0aGUgYmFzZSB0eXBlIGlzIGdpdmVuLlxuICogQHJldHVybnMgVGhlIHBhcmFtZXRlciBuYW1lcyBtYXBwZWQgdG8gdGhlaXIgYXJndW1lbnRzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gYnVpbGRUeXBlUGFyYW1ldGVyTWFwKGJhc2VJbmZvOiBUeXBlSW5mbywgdHlwZUFyZ3VtZW50czogc3RyaW5nW10pOiBNYXA8c3RyaW5nLCBzdHJpbmc+IHtcbiAgY29uc3QgbWFwcGluZyA9IG5ldyBNYXA8c3RyaW5nLCBzdHJpbmc+KCk7XG4gIGNvbnN0IGNvdW50ID0gTWF0aC5taW4oYmFzZUluZm8udHlwZVBhcmFtZXRlcnMubGVuZ3RoLCB0eXBlQXJndW1lbnRzLmxlbmd0aCk7XG4gIGZvciAobGV0IGluZGV4ID0gMDsgaW5kZXggPCBjb3VudDsgaW5kZXgrKykge1xuICAgIC8vIEJvdGggbGlzdHMgYXJlIGxvbmdlciB0aGFuIGBpbmRleGAuXG4gICAgY29uc3QgcGFyYW1ldGVyID0gZW5zdXJlTm9uTnVsbGFibGUoYmFzZUluZm8udHlwZVBhcmFtZXRlcnNbaW5kZXhdKTtcbiAgICBjb25zdCBhcmd1bWVudCA9IGVuc3VyZU5vbk51bGxhYmxlKHR5cGVBcmd1bWVudHNbaW5kZXhdKTtcbiAgICBjb25zdCBiYXJlUGFyYW1ldGVyID0gcGFyYW1ldGVyLnJlcGxhY2UoL1xccytleHRlbmRzXFxzKy4qJC8sICcnKTtcbiAgICBtYXBwaW5nLnNldChiYXJlUGFyYW1ldGVyLCBhcmd1bWVudCk7XG4gIH1cbiAgcmV0dXJuIG1hcHBpbmc7XG59XG5cbi8qKlxuICogUGFyc2UgZ2VuZXJpYyB0eXBlIGFyZ3VtZW50cyBmcm9tIGEgYmFzZSB0eXBlIGV4cHJlc3Npb24uXG4gKiBFLmcuLCBgSW50ZXJuYWxQbHVnaW48Q2FudmFzUGx1Z2luSW5zdGFuY2U+YCDihpIgYFsnQ2FudmFzUGx1Z2luSW5zdGFuY2UnXWBcbiAqIEhhbmRsZXMgbmVzdGVkIGFuZ2xlIGJyYWNrZXRzOiBgRm9vPEJhcjxCYXo+LCBRdXg+YCDihpIgYFsnQmFyPEJhej4nLCAnUXV4J11gXG4gKlxuICogQHBhcmFtIGJhc2VUeXBlTmFtZSAtIFRoZSBiYXNlIHR5cGUgZXhwcmVzc2lvbiwgZS5nLiBgRm9vPEJhciwgQmF6PmAuXG4gKiBAcmV0dXJucyBUaGUgdHlwZSBhcmd1bWVudHMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBwYXJzZVR5cGVBcmd1bWVudHMoYmFzZVR5cGVOYW1lOiBzdHJpbmcpOiBzdHJpbmdbXSB7XG4gIGNvbnN0IG9wZW5JbmRleCA9IGJhc2VUeXBlTmFtZS5pbmRleE9mKCc8Jyk7XG4gIGlmIChvcGVuSW5kZXggPT09IC0xKSB7XG4gICAgcmV0dXJuIFtdO1xuICB9XG4gIGNvbnN0IGlubmVyID0gYmFzZVR5cGVOYW1lLnNsaWNlKG9wZW5JbmRleCArIDEsIC0xKTtcbiAgY29uc3QgJGFyZ3VtZW50czogc3RyaW5nW10gPSBbXTtcbiAgbGV0IGRlcHRoID0gMDtcbiAgbGV0IGN1cnJlbnQgPSAnJztcbiAgZm9yIChjb25zdCBjaCBvZiBpbm5lcikge1xuICAgIGlmIChjaCA9PT0gJzwnKSB7XG4gICAgICBkZXB0aCsrO1xuICAgICAgY3VycmVudCArPSBjaDtcbiAgICB9IGVsc2UgaWYgKGNoID09PSAnPicpIHtcbiAgICAgIGRlcHRoLS07XG4gICAgICBjdXJyZW50ICs9IGNoO1xuICAgIH0gZWxzZSBpZiAoY2ggPT09ICcsJyAmJiBkZXB0aCA9PT0gMCkge1xuICAgICAgJGFyZ3VtZW50cy5wdXNoKGN1cnJlbnQudHJpbSgpKTtcbiAgICAgIGN1cnJlbnQgPSAnJztcbiAgICB9IGVsc2Uge1xuICAgICAgY3VycmVudCArPSBjaDtcbiAgICB9XG4gIH1cbiAgaWYgKGN1cnJlbnQudHJpbSgpKSB7XG4gICAgJGFyZ3VtZW50cy5wdXNoKGN1cnJlbnQudHJpbSgpKTtcbiAgfVxuICByZXR1cm4gJGFyZ3VtZW50cztcbn1cblxuLyoqXG4gKiBDb3BpZXMgZXZlcnkgaW5oZXJpdGVkIG1lbWJlciBvbnRvIGl0cyBzdWJ0eXBlcywgc3Vic3RpdHV0aW5nIHRoZSB0eXBlIGFyZ3VtZW50cyB0aGUgc3VidHlwZSBwYXNzZXMuXG4gKlxuICogQHBhcmFtIHR5cGVzIC0gVGhlIGRvY3VtZW50ZWQgdHlwZXMsIGtleWVkIGJ5IHF1YWxpZmllZCBpZC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlc29sdmVJbmhlcml0ZWRNZW1iZXJzKHR5cGVzOiBNYXA8c3RyaW5nLCBUeXBlSW5mbz4pOiB2b2lkIHtcbiAgZm9yIChjb25zdCBbLCBpbmZvXSBvZiB0eXBlcykge1xuICAgIGZvciAoY29uc3QgYmFzZVR5cGVOYW1lIG9mIFsuLi5pbmZvLmJhc2VUeXBlcywgLi4uaW5mby5pbXBsZW1lbnRzVHlwZXNdKSB7XG4gICAgICBjb25zdCBjbGVhbkJhc2UgPSBiYXNlVHlwZU5hbWUucmVwbGFjZSgvPC4qPiQvLCAnJykudHJpbSgpO1xuICAgICAgY29uc3QgYmFzZUluZm8gPSBmaW5kVHlwZSh0eXBlcywgY2xlYW5CYXNlLCBpbmZvLm5hbWVzcGFjZSk7XG4gICAgICBpZiAoIWJhc2VJbmZvKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICBjb25zdCB0eXBlQXJndW1lbnRzID0gcGFyc2VUeXBlQXJndW1lbnRzKGJhc2VUeXBlTmFtZSk7XG4gICAgICBjb25zdCB0eXBlUGFyYW1ldGVyTWFwID0gYnVpbGRUeXBlUGFyYW1ldGVyTWFwKGJhc2VJbmZvLCB0eXBlQXJndW1lbnRzKTtcblxuICAgICAgZm9yIChjb25zdCBwcm9wZXJ0eSBvZiBiYXNlSW5mby5wcm9wZXJ0aWVzKSB7XG4gICAgICAgIGlmIChpbmZvLnByb3BlcnRpZXMuZXZlcnkoKHApID0+IHAubmFtZSAhPT0gcHJvcGVydHkubmFtZSkpIHtcbiAgICAgICAgICBpbmZvLnByb3BlcnRpZXMucHVzaChzdWJzdGl0dXRlTWVtYmVyVHlwZXMoeyAuLi5wcm9wZXJ0eSwgaW5oZXJpdGVkRnJvbTogYmFzZUluZm8ubmFtZSB9LCB0eXBlUGFyYW1ldGVyTWFwKSk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgZm9yIChjb25zdCBtZXRob2Qgb2YgYmFzZUluZm8ubWV0aG9kcykge1xuICAgICAgICBjb25zdCBoYXNPd25NZXRob2QgPSBpbmZvLm1ldGhvZHMuc29tZSgobSkgPT4gbS5uYW1lID09PSBtZXRob2QubmFtZSAmJiBtLnNpZ25hdHVyZSA9PT0gbWV0aG9kLnNpZ25hdHVyZSk7XG4gICAgICAgIGNvbnN0IGhhc0luaGVyaXRlZE1ldGhvZCA9IGluZm8ubWV0aG9kcy5zb21lKChtKSA9PiBtLmluaGVyaXRlZEZyb20gPT09IGJhc2VJbmZvLm5hbWUgJiYgbS5vdmVybG9hZEtleSA9PT0gbWV0aG9kLm92ZXJsb2FkS2V5KTtcbiAgICAgICAgaWYgKCFoYXNPd25NZXRob2QgJiYgIWhhc0luaGVyaXRlZE1ldGhvZCkge1xuICAgICAgICAgIGluZm8ubWV0aG9kcy5wdXNoKHN1YnN0aXR1dGVNZW1iZXJUeXBlcyh7IC4uLm1ldGhvZCwgaW5oZXJpdGVkRnJvbTogYmFzZUluZm8ubmFtZSB9LCB0eXBlUGFyYW1ldGVyTWFwKSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cblxuLyoqXG4gKiBBcHBseSB0eXBlIHBhcmFtZXRlciBzdWJzdGl0dXRpb24gdG8gYWxsIHR5cGUtYmVhcmluZyBmaWVsZHMgb2YgYSBtZW1iZXJcbiAqXG4gKiBAcGFyYW0gbWVtYmVyIC0gVGhlIG1lbWJlci5cbiAqIEBwYXJhbSBtYXBwaW5nIC0gVHlwZSBwYXJhbWV0ZXIgbmFtZXMgbWFwcGVkIHRvIHRoZWlyIGFyZ3VtZW50cy5cbiAqIEByZXR1cm5zIFRoZSBtZW1iZXIgd2l0aCBpdHMgdHlwZXMgc3Vic3RpdHV0ZWQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzdWJzdGl0dXRlTWVtYmVyVHlwZXMobWVtYmVyOiBNZW1iZXJJbmZvLCBtYXBwaW5nOiBNYXA8c3RyaW5nLCBzdHJpbmc+KTogTWVtYmVySW5mbyB7XG4gIHJldHVybiBtYXBwaW5nLnNpemUgPT09IDBcbiAgICA/IG1lbWJlclxuICAgIDoge1xuICAgICAgLi4ubWVtYmVyLFxuICAgICAgcGFyYW1ldGVyczogbWVtYmVyLnBhcmFtZXRlcnMubWFwKChwKSA9PiAoe1xuICAgICAgICAuLi5wLFxuICAgICAgICB0eXBlOiBzdWJzdGl0dXRlVHlwZVBhcmFtcyhwLnR5cGUsIG1hcHBpbmcpXG4gICAgICB9KSksXG4gICAgICByZXR1cm5UeXBlOiBzdWJzdGl0dXRlVHlwZVBhcmFtcyhtZW1iZXIucmV0dXJuVHlwZSwgbWFwcGluZyksXG4gICAgICBzaWduYXR1cmU6IHN1YnN0aXR1dGVUeXBlUGFyYW1zKG1lbWJlci5zaWduYXR1cmUsIG1hcHBpbmcpLFxuICAgICAgdHlwZTogc3Vic3RpdHV0ZVR5cGVQYXJhbXMobWVtYmVyLnR5cGUsIG1hcHBpbmcpXG4gICAgfTtcbn1cblxuLyoqXG4gKiBTdWJzdGl0dXRlIGdlbmVyaWMgdHlwZSBwYXJhbWV0ZXJzIGluIGEgdHlwZSBzdHJpbmcgdXNpbmcgYSBtYXBwaW5nXG4gKlxuICogQHBhcmFtIHR5cGVUZXh0IC0gVGhlIHR5cGUgdGV4dC5cbiAqIEBwYXJhbSBtYXBwaW5nIC0gVHlwZSBwYXJhbWV0ZXIgbmFtZXMgbWFwcGVkIHRvIHRoZWlyIGFyZ3VtZW50cy5cbiAqIEByZXR1cm5zIFRoZSBzdWJzdGl0dXRlZCB0eXBlIHRleHQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzdWJzdGl0dXRlVHlwZVBhcmFtcyh0eXBlVGV4dDogc3RyaW5nLCBtYXBwaW5nOiBNYXA8c3RyaW5nLCBzdHJpbmc+KTogc3RyaW5nIHtcbiAgcmV0dXJuIG1hcHBpbmcuc2l6ZSA9PT0gMFxuICAgID8gdHlwZVRleHRcbiAgICA6IHR5cGVUZXh0LnJlcGxhY2VBbGwoL1xcYig/PHR5cGVOYW1lPlthLXpBLVpdW2EtekEtWjAtOV0qKVxcYi9nLCAobWF0Y2gpID0+IHtcbiAgICAgIHJldHVybiBtYXBwaW5nLmdldChtYXRjaCkgPz8gbWF0Y2g7XG4gICAgfSk7XG59XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBU0EsU0FBUyx5QkFBeUI7QUFPbEMsU0FBUyxnQkFBZ0I7QUFXbEIsU0FBUyxzQkFBc0IsVUFBb0IsZUFBOEM7QUFDdEcsUUFBTSxVQUFVLG9CQUFJLElBQW9CO0FBQ3hDLFFBQU0sUUFBUSxLQUFLLElBQUksU0FBUyxlQUFlLFFBQVEsY0FBYyxNQUFNO0FBQzNFLFdBQVMsUUFBUSxHQUFHLFFBQVEsT0FBTyxTQUFTO0FBRTFDLFVBQU0sWUFBWSxrQkFBa0IsU0FBUyxlQUFlLEtBQUssQ0FBQztBQUNsRSxVQUFNLFdBQVcsa0JBQWtCLGNBQWMsS0FBSyxDQUFDO0FBQ3ZELFVBQU0sZ0JBQWdCLFVBQVUsUUFBUSxvQkFBb0IsRUFBRTtBQUM5RCxZQUFRLElBQUksZUFBZSxRQUFRO0FBQUEsRUFDckM7QUFDQSxTQUFPO0FBQ1Q7QUFVTyxTQUFTLG1CQUFtQixjQUFnQztBQUNqRSxRQUFNLFlBQVksYUFBYSxRQUFRLEdBQUc7QUFDMUMsTUFBSSxjQUFjLElBQUk7QUFDcEIsV0FBTyxDQUFDO0FBQUEsRUFDVjtBQUNBLFFBQU0sUUFBUSxhQUFhLE1BQU0sWUFBWSxHQUFHLEVBQUU7QUFDbEQsUUFBTSxhQUF1QixDQUFDO0FBQzlCLE1BQUksUUFBUTtBQUNaLE1BQUksVUFBVTtBQUNkLGFBQVcsTUFBTSxPQUFPO0FBQ3RCLFFBQUksT0FBTyxLQUFLO0FBQ2Q7QUFDQSxpQkFBVztBQUFBLElBQ2IsV0FBVyxPQUFPLEtBQUs7QUFDckI7QUFDQSxpQkFBVztBQUFBLElBQ2IsV0FBVyxPQUFPLE9BQU8sVUFBVSxHQUFHO0FBQ3BDLGlCQUFXLEtBQUssUUFBUSxLQUFLLENBQUM7QUFDOUIsZ0JBQVU7QUFBQSxJQUNaLE9BQU87QUFDTCxpQkFBVztBQUFBLElBQ2I7QUFBQSxFQUNGO0FBQ0EsTUFBSSxRQUFRLEtBQUssR0FBRztBQUNsQixlQUFXLEtBQUssUUFBUSxLQUFLLENBQUM7QUFBQSxFQUNoQztBQUNBLFNBQU87QUFDVDtBQU9PLFNBQVMsd0JBQXdCLE9BQW9DO0FBQzFFLGFBQVcsQ0FBQyxFQUFFLElBQUksS0FBSyxPQUFPO0FBQzVCLGVBQVcsZ0JBQWdCLENBQUMsR0FBRyxLQUFLLFdBQVcsR0FBRyxLQUFLLGVBQWUsR0FBRztBQUN2RSxZQUFNLFlBQVksYUFBYSxRQUFRLFNBQVMsRUFBRSxFQUFFLEtBQUs7QUFDekQsWUFBTSxXQUFXLFNBQVMsT0FBTyxXQUFXLEtBQUssU0FBUztBQUMxRCxVQUFJLENBQUMsVUFBVTtBQUNiO0FBQUEsTUFDRjtBQUVBLFlBQU0sZ0JBQWdCLG1CQUFtQixZQUFZO0FBQ3JELFlBQU0sbUJBQW1CLHNCQUFzQixVQUFVLGFBQWE7QUFFdEUsaUJBQVcsWUFBWSxTQUFTLFlBQVk7QUFDMUMsWUFBSSxLQUFLLFdBQVcsTUFBTSxDQUFDLE1BQU0sRUFBRSxTQUFTLFNBQVMsSUFBSSxHQUFHO0FBQzFELGVBQUssV0FBVyxLQUFLLHNCQUFzQixFQUFFLEdBQUcsVUFBVSxlQUFlLFNBQVMsS0FBSyxHQUFHLGdCQUFnQixDQUFDO0FBQUEsUUFDN0c7QUFBQSxNQUNGO0FBRUEsaUJBQVcsVUFBVSxTQUFTLFNBQVM7QUFDckMsY0FBTSxlQUFlLEtBQUssUUFBUSxLQUFLLENBQUMsTUFBTSxFQUFFLFNBQVMsT0FBTyxRQUFRLEVBQUUsY0FBYyxPQUFPLFNBQVM7QUFDeEcsY0FBTSxxQkFBcUIsS0FBSyxRQUFRLEtBQUssQ0FBQyxNQUFNLEVBQUUsa0JBQWtCLFNBQVMsUUFBUSxFQUFFLGdCQUFnQixPQUFPLFdBQVc7QUFDN0gsWUFBSSxDQUFDLGdCQUFnQixDQUFDLG9CQUFvQjtBQUN4QyxlQUFLLFFBQVEsS0FBSyxzQkFBc0IsRUFBRSxHQUFHLFFBQVEsZUFBZSxTQUFTLEtBQUssR0FBRyxnQkFBZ0IsQ0FBQztBQUFBLFFBQ3hHO0FBQUEsTUFDRjtBQUFBLElBQ0Y7QUFBQSxFQUNGO0FBQ0Y7QUFTTyxTQUFTLHNCQUFzQixRQUFvQixTQUEwQztBQUNsRyxTQUFPLFFBQVEsU0FBUyxJQUNwQixTQUNBO0FBQUEsSUFDQSxHQUFHO0FBQUEsSUFDSCxZQUFZLE9BQU8sV0FBVyxJQUFJLENBQUMsT0FBTztBQUFBLE1BQ3hDLEdBQUc7QUFBQSxNQUNILE1BQU0scUJBQXFCLEVBQUUsTUFBTSxPQUFPO0FBQUEsSUFDNUMsRUFBRTtBQUFBLElBQ0YsWUFBWSxxQkFBcUIsT0FBTyxZQUFZLE9BQU87QUFBQSxJQUMzRCxXQUFXLHFCQUFxQixPQUFPLFdBQVcsT0FBTztBQUFBLElBQ3pELE1BQU0scUJBQXFCLE9BQU8sTUFBTSxPQUFPO0FBQUEsRUFDakQ7QUFDSjtBQVNPLFNBQVMscUJBQXFCLFVBQWtCLFNBQXNDO0FBQzNGLFNBQU8sUUFBUSxTQUFTLElBQ3BCLFdBQ0EsU0FBUyxXQUFXLDBDQUEwQyxDQUFDLFVBQVU7QUFDekUsV0FBTyxRQUFRLElBQUksS0FBSyxLQUFLO0FBQUEsRUFDL0IsQ0FBQztBQUNMOyIsIm5hbWVzIjpbXX0=
141
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9kb2NzLXNpdGUvYXBpLWRvYy10eXBlLW1lcmdpbmcudHMiXSwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAZmlsZVxuICpcbiAqIEluaGVyaXRhbmNlIHJlc29sdXRpb246IGNvcGllcyBpbmhlcml0ZWQgbWVtYmVycyBvbnRvIHN1YnR5cGVzLCBzdWJzdGl0dXRpbmcgZ2VuZXJpYyB0eXBlIGFyZ3MuXG4gKlxuICogKEEgZG9jdW1lbnRlZCBwYWNrYWdlIGlzIGEgbm9ybWFsIGxpYnJhcnksIG5vdCBhbiBhdWdtZW50YXRpb24gb2YgYW5vdGhlciBwYWNrYWdlJ3MgZGVjbGFyYXRpb25zLCBzbyB0aGVyZSBpcyBub1xuICogb2ZmaWNpYWwtdnMtdW5vZmZpY2lhbCBtZXJnZSBtYWNoaW5lcnkgaGVyZSDigJQgb25seSB0aGUgZ2VuZXJpYyBpbmhlcml0YW5jZSBoZWxwZXJzLilcbiAqL1xuXG5pbXBvcnQgeyBlbnN1cmVOb25OdWxsYWJsZSB9IGZyb20gJ0BtbmFvdW1vdi90eXBlc2NyaXB0LWxpYi90eXBlLWd1YXJkcyc7XG5cbmltcG9ydCB0eXBlIHtcbiAgTWVtYmVySW5mbyxcbiAgVHlwZUluZm9cbn0gZnJvbSAnLi9hcGktZG9jLXR5cGVzLnRzJztcblxuaW1wb3J0IHsgZmluZFR5cGUgfSBmcm9tICcuL2FwaS1kb2MtbGluay1yZW5kZXJpbmcudHMnO1xuXG4vKipcbiAqIEJ1aWxkIGEgbWFwcGluZyBmcm9tIHBhcmVudCB0eXBlIHBhcmFtZXRlciBuYW1lcyB0byBjb25jcmV0ZSB0eXBlIGFyZ3VtZW50cy5cbiAqIEUuZy4sIHBhcmVudCBoYXMgYHR5cGVQYXJhbWV0ZXJzOiBbJ0luc3RhbmNlIGV4dGVuZHMgQmFzZUluc3RhbmNlJ11gIGFuZFxuICogY2hpbGQgZXh0ZW5kcyBgUGFyZW50PENhbnZhc1BsdWdpbkluc3RhbmNlPmAg4oaSIGB7SW5zdGFuY2U6ICdDYW52YXNQbHVnaW5JbnN0YW5jZSd9YFxuICpcbiAqIEBwYXJhbSBiYXNlSW5mbyAtIFRoZSBiYXNlIHR5cGUuXG4gKiBAcGFyYW0gdHlwZUFyZ3VtZW50cyAtIFRoZSB0eXBlIGFyZ3VtZW50cyB0aGUgYmFzZSB0eXBlIGlzIGdpdmVuLlxuICogQHJldHVybnMgVGhlIHBhcmFtZXRlciBuYW1lcyBtYXBwZWQgdG8gdGhlaXIgYXJndW1lbnRzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gYnVpbGRUeXBlUGFyYW1ldGVyTWFwKGJhc2VJbmZvOiBUeXBlSW5mbywgdHlwZUFyZ3VtZW50czogc3RyaW5nW10pOiBNYXA8c3RyaW5nLCBzdHJpbmc+IHtcbiAgY29uc3QgbWFwcGluZyA9IG5ldyBNYXA8c3RyaW5nLCBzdHJpbmc+KCk7XG4gIGNvbnN0IGNvdW50ID0gTWF0aC5taW4oYmFzZUluZm8udHlwZVBhcmFtZXRlcnMubGVuZ3RoLCB0eXBlQXJndW1lbnRzLmxlbmd0aCk7XG4gIGZvciAobGV0IGluZGV4ID0gMDsgaW5kZXggPCBjb3VudDsgaW5kZXgrKykge1xuICAgIC8vIEJvdGggbGlzdHMgYXJlIGxvbmdlciB0aGFuIGBpbmRleGAuXG4gICAgY29uc3QgcGFyYW1ldGVyID0gZW5zdXJlTm9uTnVsbGFibGUoYmFzZUluZm8udHlwZVBhcmFtZXRlcnNbaW5kZXhdKTtcbiAgICBjb25zdCBhcmd1bWVudCA9IGVuc3VyZU5vbk51bGxhYmxlKHR5cGVBcmd1bWVudHNbaW5kZXhdKTtcbiAgICBjb25zdCBiYXJlUGFyYW1ldGVyID0gcGFyYW1ldGVyLnJlcGxhY2UoL1xccytleHRlbmRzXFxzKy4qJC8sICcnKTtcbiAgICBtYXBwaW5nLnNldChiYXJlUGFyYW1ldGVyLCBhcmd1bWVudCk7XG4gIH1cbiAgcmV0dXJuIG1hcHBpbmc7XG59XG5cbi8qKlxuICogUGFyc2UgZ2VuZXJpYyB0eXBlIGFyZ3VtZW50cyBmcm9tIGEgYmFzZSB0eXBlIGV4cHJlc3Npb24uXG4gKiBFLmcuLCBgSW50ZXJuYWxQbHVnaW48Q2FudmFzUGx1Z2luSW5zdGFuY2U+YCDihpIgYFsnQ2FudmFzUGx1Z2luSW5zdGFuY2UnXWBcbiAqIEhhbmRsZXMgbmVzdGVkIGFuZ2xlIGJyYWNrZXRzOiBgRm9vPEJhcjxCYXo+LCBRdXg+YCDihpIgYFsnQmFyPEJhej4nLCAnUXV4J11gXG4gKlxuICogQHBhcmFtIGJhc2VUeXBlTmFtZSAtIFRoZSBiYXNlIHR5cGUgZXhwcmVzc2lvbiwgZS5nLiBgRm9vPEJhciwgQmF6PmAuXG4gKiBAcmV0dXJucyBUaGUgdHlwZSBhcmd1bWVudHMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBwYXJzZVR5cGVBcmd1bWVudHMoYmFzZVR5cGVOYW1lOiBzdHJpbmcpOiBzdHJpbmdbXSB7XG4gIGNvbnN0IG9wZW5JbmRleCA9IGJhc2VUeXBlTmFtZS5pbmRleE9mKCc8Jyk7XG4gIGlmIChvcGVuSW5kZXggPT09IC0xKSB7XG4gICAgcmV0dXJuIFtdO1xuICB9XG4gIGNvbnN0IGlubmVyID0gYmFzZVR5cGVOYW1lLnNsaWNlKG9wZW5JbmRleCArIDEsIC0xKTtcbiAgY29uc3QgJGFyZ3VtZW50czogc3RyaW5nW10gPSBbXTtcbiAgbGV0IGRlcHRoID0gMDtcbiAgbGV0IGN1cnJlbnQgPSAnJztcbiAgZm9yIChjb25zdCBjaCBvZiBpbm5lcikge1xuICAgIGlmIChjaCA9PT0gJzwnKSB7XG4gICAgICBkZXB0aCsrO1xuICAgICAgY3VycmVudCArPSBjaDtcbiAgICB9IGVsc2UgaWYgKGNoID09PSAnPicpIHtcbiAgICAgIGRlcHRoLS07XG4gICAgICBjdXJyZW50ICs9IGNoO1xuICAgIH0gZWxzZSBpZiAoY2ggPT09ICcsJyAmJiBkZXB0aCA9PT0gMCkge1xuICAgICAgJGFyZ3VtZW50cy5wdXNoKGN1cnJlbnQudHJpbSgpKTtcbiAgICAgIGN1cnJlbnQgPSAnJztcbiAgICB9IGVsc2Uge1xuICAgICAgY3VycmVudCArPSBjaDtcbiAgICB9XG4gIH1cbiAgaWYgKGN1cnJlbnQudHJpbSgpKSB7XG4gICAgJGFyZ3VtZW50cy5wdXNoKGN1cnJlbnQudHJpbSgpKTtcbiAgfVxuICByZXR1cm4gJGFyZ3VtZW50cztcbn1cblxuLyoqXG4gKiBDb3BpZXMgZXZlcnkgaW5oZXJpdGVkIG1lbWJlciBvbnRvIGl0cyBzdWJ0eXBlcywgc3Vic3RpdHV0aW5nIHRoZSB0eXBlIGFyZ3VtZW50cyB0aGUgc3VidHlwZSBwYXNzZXMuXG4gKlxuICogQHBhcmFtIHR5cGVzIC0gVGhlIGRvY3VtZW50ZWQgdHlwZXMsIGtleWVkIGJ5IHF1YWxpZmllZCBpZC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlc29sdmVJbmhlcml0ZWRNZW1iZXJzKHR5cGVzOiBNYXA8c3RyaW5nLCBUeXBlSW5mbz4pOiB2b2lkIHtcbiAgY29uc3QgcmVzb2x2ZWQgPSBuZXcgU2V0PFR5cGVJbmZvPigpO1xuICBjb25zdCByZXNvbHZpbmcgPSBuZXcgU2V0PFR5cGVJbmZvPigpO1xuXG4gIGZvciAoY29uc3QgaW5mbyBvZiB0eXBlcy52YWx1ZXMoKSkge1xuICAgIHJlc29sdmUoaW5mbyk7XG4gIH1cblxuICBmdW5jdGlvbiByZXNvbHZlKGluZm86IFR5cGVJbmZvKTogdm9pZCB7XG4gICAgaWYgKHJlc29sdmVkLmhhcyhpbmZvKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICByZXNvbHZpbmcuYWRkKGluZm8pO1xuICAgIGZvciAoY29uc3QgYmFzZVR5cGVOYW1lIG9mIFsuLi5pbmZvLmJhc2VUeXBlcywgLi4uaW5mby5pbXBsZW1lbnRzVHlwZXNdKSB7XG4gICAgICBjb25zdCBjbGVhbkJhc2UgPSBiYXNlVHlwZU5hbWUucmVwbGFjZSgvPC4qPiQvLCAnJykudHJpbSgpO1xuICAgICAgY29uc3QgYmFzZUluZm8gPSBmaW5kVHlwZSh0eXBlcywgY2xlYW5CYXNlLCBpbmZvLm5hbWVzcGFjZSk7XG4gICAgICBpZiAoIWJhc2VJbmZvIHx8IHJlc29sdmluZy5oYXMoYmFzZUluZm8pKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICByZXNvbHZlKGJhc2VJbmZvKTtcblxuICAgICAgY29uc3QgdHlwZUFyZ3VtZW50cyA9IHBhcnNlVHlwZUFyZ3VtZW50cyhiYXNlVHlwZU5hbWUpO1xuICAgICAgY29uc3QgdHlwZVBhcmFtZXRlck1hcCA9IGJ1aWxkVHlwZVBhcmFtZXRlck1hcChiYXNlSW5mbywgdHlwZUFyZ3VtZW50cyk7XG5cbiAgICAgIGZvciAoY29uc3QgcHJvcGVydHkgb2YgYmFzZUluZm8ucHJvcGVydGllcykge1xuICAgICAgICBpZiAoaW5mby5wcm9wZXJ0aWVzLmV2ZXJ5KChwKSA9PiBwLm5hbWUgIT09IHByb3BlcnR5Lm5hbWUpKSB7XG4gICAgICAgICAgaW5mby5wcm9wZXJ0aWVzLnB1c2goc3Vic3RpdHV0ZU1lbWJlclR5cGVzKHsgLi4ucHJvcGVydHksIGluaGVyaXRlZEZyb206IGJhc2VJbmZvLm5hbWUgfSwgdHlwZVBhcmFtZXRlck1hcCkpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGZvciAoY29uc3QgbWV0aG9kIG9mIGJhc2VJbmZvLm1ldGhvZHMpIHtcbiAgICAgICAgY29uc3QgaW5oZXJpdGVkTWV0aG9kID0gc3Vic3RpdHV0ZU1lbWJlclR5cGVzKHsgLi4ubWV0aG9kLCBpbmhlcml0ZWRGcm9tOiBiYXNlSW5mby5uYW1lIH0sIHR5cGVQYXJhbWV0ZXJNYXApO1xuICAgICAgICBjb25zdCBoYXNNZXRob2QgPSBpbmZvLm1ldGhvZHMuc29tZSgobSkgPT4gbS5uYW1lID09PSBpbmhlcml0ZWRNZXRob2QubmFtZSAmJiBtLnNpZ25hdHVyZSA9PT0gaW5oZXJpdGVkTWV0aG9kLnNpZ25hdHVyZSk7XG4gICAgICAgIGlmICghaGFzTWV0aG9kKSB7XG4gICAgICAgICAgaW5mby5tZXRob2RzLnB1c2goaW5oZXJpdGVkTWV0aG9kKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICByZXNvbHZpbmcuZGVsZXRlKGluZm8pO1xuICAgIHJlc29sdmVkLmFkZChpbmZvKTtcbiAgfVxufVxuXG4vKipcbiAqIEFwcGx5IHR5cGUgcGFyYW1ldGVyIHN1YnN0aXR1dGlvbiB0byBhbGwgdHlwZS1iZWFyaW5nIGZpZWxkcyBvZiBhIG1lbWJlclxuICpcbiAqIEBwYXJhbSBtZW1iZXIgLSBUaGUgbWVtYmVyLlxuICogQHBhcmFtIG1hcHBpbmcgLSBUeXBlIHBhcmFtZXRlciBuYW1lcyBtYXBwZWQgdG8gdGhlaXIgYXJndW1lbnRzLlxuICogQHJldHVybnMgVGhlIG1lbWJlciB3aXRoIGl0cyB0eXBlcyBzdWJzdGl0dXRlZC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHN1YnN0aXR1dGVNZW1iZXJUeXBlcyhtZW1iZXI6IE1lbWJlckluZm8sIG1hcHBpbmc6IE1hcDxzdHJpbmcsIHN0cmluZz4pOiBNZW1iZXJJbmZvIHtcbiAgcmV0dXJuIG1hcHBpbmcuc2l6ZSA9PT0gMFxuICAgID8gbWVtYmVyXG4gICAgOiB7XG4gICAgICAuLi5tZW1iZXIsXG4gICAgICBwYXJhbWV0ZXJzOiBtZW1iZXIucGFyYW1ldGVycy5tYXAoKHApID0+ICh7XG4gICAgICAgIC4uLnAsXG4gICAgICAgIHR5cGU6IHN1YnN0aXR1dGVUeXBlUGFyYW1zKHAudHlwZSwgbWFwcGluZylcbiAgICAgIH0pKSxcbiAgICAgIHJldHVyblR5cGU6IHN1YnN0aXR1dGVUeXBlUGFyYW1zKG1lbWJlci5yZXR1cm5UeXBlLCBtYXBwaW5nKSxcbiAgICAgIHNpZ25hdHVyZTogc3Vic3RpdHV0ZVR5cGVQYXJhbXMobWVtYmVyLnNpZ25hdHVyZSwgbWFwcGluZyksXG4gICAgICB0eXBlOiBzdWJzdGl0dXRlVHlwZVBhcmFtcyhtZW1iZXIudHlwZSwgbWFwcGluZylcbiAgICB9O1xufVxuXG4vKipcbiAqIFN1YnN0aXR1dGUgZ2VuZXJpYyB0eXBlIHBhcmFtZXRlcnMgaW4gYSB0eXBlIHN0cmluZyB1c2luZyBhIG1hcHBpbmdcbiAqXG4gKiBAcGFyYW0gdHlwZVRleHQgLSBUaGUgdHlwZSB0ZXh0LlxuICogQHBhcmFtIG1hcHBpbmcgLSBUeXBlIHBhcmFtZXRlciBuYW1lcyBtYXBwZWQgdG8gdGhlaXIgYXJndW1lbnRzLlxuICogQHJldHVybnMgVGhlIHN1YnN0aXR1dGVkIHR5cGUgdGV4dC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHN1YnN0aXR1dGVUeXBlUGFyYW1zKHR5cGVUZXh0OiBzdHJpbmcsIG1hcHBpbmc6IE1hcDxzdHJpbmcsIHN0cmluZz4pOiBzdHJpbmcge1xuICByZXR1cm4gbWFwcGluZy5zaXplID09PSAwXG4gICAgPyB0eXBlVGV4dFxuICAgIDogdHlwZVRleHQucmVwbGFjZUFsbCgvXFxiKD88dHlwZU5hbWU+W2EtekEtWl1bYS16QS1aMC05XSopXFxiL2csIChtYXRjaCkgPT4ge1xuICAgICAgcmV0dXJuIG1hcHBpbmcuZ2V0KG1hdGNoKSA/PyBtYXRjaDtcbiAgICB9KTtcbn1cbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFTQSxTQUFTLHlCQUF5QjtBQU9sQyxTQUFTLGdCQUFnQjtBQVdsQixTQUFTLHNCQUFzQixVQUFvQixlQUE4QztBQUN0RyxRQUFNLFVBQVUsb0JBQUksSUFBb0I7QUFDeEMsUUFBTSxRQUFRLEtBQUssSUFBSSxTQUFTLGVBQWUsUUFBUSxjQUFjLE1BQU07QUFDM0UsV0FBUyxRQUFRLEdBQUcsUUFBUSxPQUFPLFNBQVM7QUFFMUMsVUFBTSxZQUFZLGtCQUFrQixTQUFTLGVBQWUsS0FBSyxDQUFDO0FBQ2xFLFVBQU0sV0FBVyxrQkFBa0IsY0FBYyxLQUFLLENBQUM7QUFDdkQsVUFBTSxnQkFBZ0IsVUFBVSxRQUFRLG9CQUFvQixFQUFFO0FBQzlELFlBQVEsSUFBSSxlQUFlLFFBQVE7QUFBQSxFQUNyQztBQUNBLFNBQU87QUFDVDtBQVVPLFNBQVMsbUJBQW1CLGNBQWdDO0FBQ2pFLFFBQU0sWUFBWSxhQUFhLFFBQVEsR0FBRztBQUMxQyxNQUFJLGNBQWMsSUFBSTtBQUNwQixXQUFPLENBQUM7QUFBQSxFQUNWO0FBQ0EsUUFBTSxRQUFRLGFBQWEsTUFBTSxZQUFZLEdBQUcsRUFBRTtBQUNsRCxRQUFNLGFBQXVCLENBQUM7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
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@mnaoumov/typescript-dev-toolkit",
3
- "version": "6.0.1",
3
+ "version": "6.0.2",
4
4
  "description": "Generic TypeScript project tooling: build, lint, format, spellcheck, test, gate and release scripts.",
5
5
  "keywords": [
6
6
  "typescript",