@mnaoumov/typescript-dev-toolkit 3.6.1 → 3.6.3
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.
- package/dist/lib/cjs/docs-site/api-doc-page-generation.cjs +3 -3
- package/dist/lib/cjs/docs-site/og-images.cjs +18 -7
- package/dist/lib/cjs/docs-site/og-images.d.cts +1 -1
- package/dist/lib/esm/docs-site/api-doc-page-generation.mjs +4 -3
- package/dist/lib/esm/docs-site/og-images.d.mts +1 -1
- package/dist/lib/esm/docs-site/og-images.mjs +18 -7
- package/package.json +1 -1
|
@@ -401,8 +401,8 @@ function renderFunctionPage(lines, info, allTypes) {
|
|
|
401
401
|
}
|
|
402
402
|
lines.push("");
|
|
403
403
|
}
|
|
404
|
-
const returnDesc = $function.returnDescription ? ` \u2014 ${(0, import_api_doc_text_utils.
|
|
405
|
-
lines.push(`**Returns:** ${(0, import_api_doc_text_utils.escapeMdxAngleBrackets)((0, import_api_doc_link_rendering.renderTypeWithLinks)($function.returnType, allTypes, info.name, info.namespace))}${returnDesc}`, "");
|
|
404
|
+
const returnDesc = $function.returnDescription ? ` \u2014 ${(0, import_api_doc_text_utils.escapeMdxProse)((0, import_api_doc_link_rendering.resolveLinks)($function.returnDescription, allTypes, info.namespace))}` : "";
|
|
405
|
+
lines.push(`**Returns:** ${(0, import_api_doc_text_utils.escapeMdxBraces)((0, import_api_doc_text_utils.escapeMdxAngleBrackets)((0, import_api_doc_link_rendering.renderTypeWithLinks)($function.returnType, allTypes, info.name, info.namespace)))}${returnDesc}`, "");
|
|
406
406
|
for (const example of $function.examples) {
|
|
407
407
|
lines.push("**Example:**", "", (0, import_api_doc_link_rendering.renderExampleMdx)(example, allTypes, info.namespace), "");
|
|
408
408
|
}
|
|
@@ -558,4 +558,4 @@ function renderNamespaceTable(lines, heading, columnLabel, entries, allTypes, na
|
|
|
558
558
|
renderVariablePage,
|
|
559
559
|
sidebarTreeToEntries
|
|
560
560
|
});
|
|
561
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9kb2NzLXNpdGUvYXBpLWRvYy1wYWdlLWdlbmVyYXRpb24udHMiXSwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAZmlsZVxuICpcbiAqIE1EWCBwYWdlICsgc2lkZWJhciBlbWlzc2lvbjogcmVuZGVycyBtb2R1bGUgaW5kZXggcGFnZXMsIHBlci10eXBlIG92ZXJ2aWV3IHBhZ2VzLCBwZXItbWVtYmVyIHBhZ2VzLFxuICogYmFja2xpbmtzLCBhbmQgdGhlIFN0YXJsaWdodCBzaWRlYmFyIEpTT04uXG4gKi9cblxuaW1wb3J0IHsgZ2V0TWFuZGF0b3J5TmFtZWRHcm91cCB9IGZyb20gJ0BtbmFvdW1vdi90eXBlc2NyaXB0LWxpYi9yZWctZXhwJztcbmltcG9ydCB7IGVuc3VyZU5vbk51bGxhYmxlIH0gZnJvbSAnQG1uYW91bW92L3R5cGVzY3JpcHQtbGliL3R5cGUtZ3VhcmRzJztcbmltcG9ydCB7IHdyaXRlRmlsZSB9IGZyb20gJ25vZGU6ZnMvcHJvbWlzZXMnO1xuaW1wb3J0IHsgam9pbiB9IGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCB0eXBlIHtcbiAgTWVtYmVySW5mbyxcbiAgUGFnZUNvbnRlbnQsXG4gIFBhZ2VGcm9udE1hdHRlcixcbiAgU2lkZWJhckVudHJ5LFxuICBTaWRlYmFyTGluayxcbiAgU2lkZWJhclRyZWVOb2RlLFxuICBUeXBlSW5mb1xufSBmcm9tICcuL2FwaS1kb2MtdHlwZXMudHMnO1xuXG5pbXBvcnQgeyBFVkVOVF9NRVRIT0RTIH0gZnJvbSAnLi9hcGktZG9jLWNvbnN0YW50cy50cyc7XG5pbXBvcnQge1xuICBsaW5rQmFzZVR5cGUsXG4gIG1hcmtkb3duVG9IdG1sLFxuICBtZW1iZXJIcmVmLFxuICByZW5kZXJFeGFtcGxlTWR4LFxuICByZW5kZXJNZHhQcm9zZSxcbiAgcmVuZGVyVHlwZVdpdGhMaW5rcyxcbiAgcmVzb2x2ZUxpbmtzLFxuICB0b1R5cGVGaWxlU2VnbWVudCxcbiAgdG9UeXBlUm91dGVTZWdtZW50LFxuICB0eXBlTGlua1xufSBmcm9tICcuL2FwaS1kb2MtbGluay1yZW5kZXJpbmcudHMnO1xuaW1wb3J0IHsgZ2V0QXBpRG9jU2V0dGluZ3MgfSBmcm9tICcuL2FwaS1kb2Mtc2V0dGluZ3MudHMnO1xuaW1wb3J0IHtcbiAgZW5zdXJlRGlyZWN0b3J5LFxuICBlc2NhcGVKc1N0cmluZyxcbiAgZXNjYXBlSnN4QXR0cmlidXRlLFxuICBlc2NhcGVNYXJrZG93bixcbiAgZXNjYXBlTWR4QW5nbGVCcmFja2V0cyxcbiAgZXNjYXBlTWR4QnJhY2VzLFxuICBlc2NhcGVZYW1sLFxuICBnZXREaXNwbGF5TmFtZSxcbiAgZ2V0SW1wb3J0U3RhdGVtZW50LFxuICBnZXROYW1lc3BhY2VEaXJlY3RvcnksXG4gIG1lbWJlclJvdXRlU2VnbWVudCxcbiAgbWVtYmVyU2x1ZyxcbiAgb3ZlcmxvYWRSb3V0ZVNlZ21lbnQsXG4gIG92ZXJsb2FkU2x1ZyxcbiAgc3RyaXBNYXJrZG93bixcbiAgdHJ1bmNhdGVTaWduYXR1cmVcbn0gZnJvbSAnLi9hcGktZG9jLXRleHQtdXRpbHMudHMnO1xuaW1wb3J0IHsgQVBJX0NPTVBPTkVOVFNfSU1QT1JUX1BSRUZJWCB9IGZyb20gJy4vZG9jcy1zaXRlLWFzc2V0cy50cyc7XG5cbmNvbnN0IEpTT05fSU5ERU5UID0gMjtcblxuLyoqXG4gKiBBcHBlbmQgYmFja2xpbmtzIHRvIG92ZXJ2aWV3IHBhZ2VzIGFuZCB3cml0ZSBhbGwgZmlsZXMuIEtleWVkIGJ5IHF1YWxpZmllZCBgJHtuYW1lc3BhY2V9IyR7bmFtZX1gLlxuICpcbiAqIEBwYXJhbSBwYWdlQ29udGVudHMgLSBFdmVyeSBvdmVydmlldyBwYWdlJ3MgY29udGVudCBhbmQgcGF0aCwga2V5ZWQgYnkgcXVhbGlmaWVkIGlkLlxuICogQHBhcmFtIGFsbFR5cGVzIC0gRXZlcnkgZG9jdW1lbnRlZCB0eXBlLCBrZXllZCBieSBgJHtuYW1lc3BhY2V9IyR7bmFtZX1gLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gYXBwZW5kQmFja2xpbmtzQW5kV3JpdGUoXG4gIHBhZ2VDb250ZW50czogTWFwPHN0cmluZywgUGFnZUNvbnRlbnQ+LFxuICBhbGxUeXBlczogTWFwPHN0cmluZywgVHlwZUluZm8+XG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgYmFja2xpbmtzID0gYnVpbGRCYWNrbGlua3NGcm9tQ29udGVudChwYWdlQ29udGVudHMsIGFsbFR5cGVzKTtcblxuICBmb3IgKGNvbnN0IFtrZXksIHsgY29udGVudCwgZmlsZVBhdGggfV0gb2YgcGFnZUNvbnRlbnRzKSB7XG4gICAgY29uc3QgdHlwZUJhY2tsaW5rcyA9IGJhY2tsaW5rcy5nZXQoa2V5KSA/PyBbXTtcbiAgICBjb25zdCBsaW5lcyA9IFtjb250ZW50XTtcbiAgICBpZiAodHlwZUJhY2tsaW5rcy5sZW5ndGggPiAwKSB7XG4gICAgICBjb25zdCBzb3J0ZWRCYWNrbGlua3MgPSBbLi4udHlwZUJhY2tsaW5rc10uc29ydCgoYSwgYikgPT4gYS5sb2NhbGVDb21wYXJlKGIpKTtcbiAgICAgIGxpbmVzLnB1c2goJycsICctLS0nLCAnJywgJyoqTGlua3MgdG8gdGhpcyBwYWdlOioqJywgJycpO1xuICAgICAgZm9yIChjb25zdCBibEtleSBvZiBzb3J0ZWRCYWNrbGlua3MpIHtcbiAgICAgICAgY29uc3QgYmxJbmZvID0gZW5zdXJlTm9uTnVsbGFibGUoYWxsVHlwZXMuZ2V0KGJsS2V5KSk7XG4gICAgICAgIGNvbnN0IGJsTnNEaXJlY3RvcnkgPSBnZXROYW1lc3BhY2VEaXJlY3RvcnkoYmxJbmZvLm5hbWVzcGFjZSk7XG4gICAgICAgIGxpbmVzLnB1c2goYC0gWyR7YmxJbmZvLm5hbWV9XSgke2dldEFwaURvY1NldHRpbmdzKCkuYmFzZVBhdGh9L2FwaS8ke2JsTnNEaXJlY3Rvcnl9LyR7dG9UeXBlUm91dGVTZWdtZW50KGJsSW5mby5uYW1lc3BhY2UsIGJsSW5mby5uYW1lKX0vKWApO1xuICAgICAgfVxuICAgIH1cbiAgICBhd2FpdCB3cml0ZUZpbGUoZmlsZVBhdGgsIGxpbmVzLmpvaW4oJ1xcbicpLCAndXRmLTgnKTtcbiAgfVxufVxuXG4vKipcbiAqIEJ1aWxkIGJhY2tsaW5rcyBieSBzY2FubmluZyBnZW5lcmF0ZWQgcGFnZSBjb250ZW50IGZvciBpbnRlcm5hbCBBUEkgbGlua3MuIEtleWVkIGJ5IHF1YWxpZmllZCBpZC5cbiAqXG4gKiBAcGFyYW0gcGFnZUNvbnRlbnRzIC0gRXZlcnkgb3ZlcnZpZXcgcGFnZSdzIGNvbnRlbnQgYW5kIHBhdGgsIGtleWVkIGJ5IHF1YWxpZmllZCBpZC5cbiAqIEBwYXJhbSBhbGxUeXBlcyAtIEV2ZXJ5IGRvY3VtZW50ZWQgdHlwZSwga2V5ZWQgYnkgYCR7bmFtZXNwYWNlfSMke25hbWV9YC5cbiAqIEByZXR1cm5zIEVhY2ggcmVmZXJlbmNlZCB0eXBlJ3MgcXVhbGlmaWVkIGlkIG1hcHBlZCB0byB0aGUgaWRzIG9mIHRoZSBwYWdlcyBsaW5raW5nIHRvIGl0LlxuICovXG5leHBvcnQgZnVuY3Rpb24gYnVpbGRCYWNrbGlua3NGcm9tQ29udGVudChcbiAgcGFnZUNvbnRlbnRzOiBNYXA8c3RyaW5nLCBQYWdlQ29udGVudD4sXG4gIGFsbFR5cGVzOiBNYXA8c3RyaW5nLCBUeXBlSW5mbz5cbik6IE1hcDxzdHJpbmcsIHN0cmluZ1tdPiB7XG4gIGNvbnN0IGJhY2tsaW5rcyA9IG5ldyBNYXA8c3RyaW5nLCBzdHJpbmdbXT4oKTtcbiAgLy8gRW1pdHRlZCBVUkxzIGxvd2VyY2FzZSB0aGUgdHlwZSBzZWdtZW50IChzZWUgdG9Sb3V0ZVNlZ21lbnQpLCBzbyBtYXAgZWFjaCBsb3dlcmNhc2VkIHJvdXRlXG4gIC8vIGlkZW50aXR5IGJhY2sgdG8gaXRzIG9yaWdpbmFsIHF1YWxpZmllZCB0eXBlIGtleS5cbiAgY29uc3Qgcm91dGVLZXlUb1R5cGVLZXkgPSBuZXcgTWFwPHN0cmluZywgc3RyaW5nPigpO1xuICBmb3IgKGNvbnN0IFt0eXBlS2V5LCBpbmZvXSBvZiBhbGxUeXBlcykge1xuICAgIHJvdXRlS2V5VG9UeXBlS2V5LnNldChgJHtnZXROYW1lc3BhY2VEaXJlY3RvcnkoaW5mby5uYW1lc3BhY2UpfSMke3RvVHlwZVJvdXRlU2VnbWVudChpbmZvLm5hbWVzcGFjZSwgaW5mby5uYW1lKX1gLCB0eXBlS2V5KTtcbiAgfVxuICBjb25zdCBlc2NhcGVkQmFzZSA9IGdldEFwaURvY1NldHRpbmdzKCkuYmFzZVBhdGgucmVwbGFjZUFsbCgvWy4qKz9eJHt9KCl8W1xcXVxcXFxdL2csIFN0cmluZy5yYXdgXFwkJmApO1xuICBjb25zdCBsaW5rUGF0dGVybiA9IG5ldyBSZWdFeHAoYCR7ZXNjYXBlZEJhc2V9L2FwaS8oPzxwYXRoPig/OlthLXpBLVowLTlfQC1dKy8pKylgLCAnZycpO1xuICBmb3IgKGNvbnN0IFtzb3VyY2VLZXksIHsgY29udGVudCB9XSBvZiBwYWdlQ29udGVudHMpIHtcbiAgICBjb25zdCByZWZlcmVuY2VkID0gbmV3IFNldDxzdHJpbmc+KCk7XG5cbiAgICBmb3IgKGNvbnN0IG1hdGNoIG9mIGNvbnRlbnQubWF0Y2hBbGwobGlua1BhdHRlcm4pKSB7XG4gICAgICAvLyBUaGUgcGF0dGVybiByZXF1aXJlcyBhdCBsZWFzdCBvbmUgc2VnbWVudC5cbiAgICAgIGNvbnN0IHNlZ21lbnRzID0gZ2V0TWFuZGF0b3J5TmFtZWRHcm91cChtYXRjaCwgJ3BhdGgnKS5zcGxpdCgnLycpLmZpbHRlcihCb29sZWFuKTtcbiAgICAgIGNvbnN0IHR5cGVOYW1lID0gZW5zdXJlTm9uTnVsbGFibGUoc2VnbWVudHMuYXQoLTEpKTtcbiAgICAgIGNvbnN0IG5hbWVzcGFjZSA9IHNlZ21lbnRzLnNsaWNlKDAsIC0xKS5qb2luKCcvJyk7XG4gICAgICBjb25zdCByb3V0ZUtleSA9IGAke25hbWVzcGFjZX0jJHt0eXBlTmFtZX1gO1xuICAgICAgY29uc3QgcmVzb2x2ZWRLZXkgPSByb3V0ZUtleVRvVHlwZUtleS5nZXQocm91dGVLZXkpO1xuICAgICAgaWYgKHJlc29sdmVkS2V5ICE9PSB1bmRlZmluZWQgJiYgcmVzb2x2ZWRLZXkgIT09IHNvdXJjZUtleSkge1xuICAgICAgICByZWZlcmVuY2VkLmFkZChyZXNvbHZlZEtleSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgZm9yIChjb25zdCByZWZlcmVuY2Ugb2YgcmVmZXJlbmNlZCkge1xuICAgICAgaWYgKCFiYWNrbGlua3MuaGFzKHJlZmVyZW5jZSkpIHtcbiAgICAgICAgYmFja2xpbmtzLnNldChyZWZlcmVuY2UsIFtdKTtcbiAgICAgIH1cbiAgICAgIGJhY2tsaW5rcy5nZXQocmVmZXJlbmNlKT8ucHVzaChzb3VyY2VLZXkpO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBiYWNrbGlua3M7XG59XG5cbi8qKlxuICogQnVpbGRzIHRoZSBuYW1lc3BhY2UgdHJlZSB0aGUgc2lkZWJhciBpcyBnZW5lcmF0ZWQgZnJvbS5cbiAqXG4gKiBAcGFyYW0gdHlwZXMgLSBUaGUgZG9jdW1lbnRlZCB0eXBlcywga2V5ZWQgYnkgcXVhbGlmaWVkIGlkLlxuICogQHJldHVybnMgVGhlIHJvb3Qgb2YgdGhlIHRyZWUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBidWlsZFNpZGViYXJUcmVlKHR5cGVzOiBNYXA8c3RyaW5nLCBUeXBlSW5mbz4pOiBTaWRlYmFyVHJlZU5vZGUge1xuICBjb25zdCByb290OiBTaWRlYmFyVHJlZU5vZGUgPSB7IGNoaWxkcmVuOiBuZXcgTWFwKCksIHR5cGVzOiBbXSB9O1xuICBmb3IgKGNvbnN0IFssIGluZm9dIG9mIHR5cGVzKSB7XG4gICAgY29uc3QgcGFydHMgPSBpbmZvLm5hbWVzcGFjZS5zcGxpdCgnLycpO1xuICAgIGxldCBub2RlID0gcm9vdDtcbiAgICBmb3IgKGNvbnN0IHBhcnQgb2YgcGFydHMpIHtcbiAgICAgIGxldCBjaGlsZCA9IG5vZGUuY2hpbGRyZW4uZ2V0KHBhcnQpO1xuICAgICAgaWYgKCFjaGlsZCkge1xuICAgICAgICBjaGlsZCA9IHsgY2hpbGRyZW46IG5ldyBNYXAoKSwgdHlwZXM6IFtdIH07XG4gICAgICAgIG5vZGUuY2hpbGRyZW4uc2V0KHBhcnQsIGNoaWxkKTtcbiAgICAgIH1cbiAgICAgIG5vZGUgPSBjaGlsZDtcbiAgICB9XG4gICAgbm9kZS50eXBlcy5wdXNoKGluZm8pO1xuICB9XG4gIHJldHVybiByb290O1xufVxuXG4vKipcbiAqIFRoZSByYXcgY29kZSBzaWduYXR1cmUgc2hvd24gb24gYSB0eXBlLW92ZXJ2aWV3IHBhZ2UncyBPRyBjYXJkLCBmb3IgdGhlIGtpbmRzIHRoYXQgcmVuZGVyIGEgc2luZ2xlXG4gKiBzaWduYXR1cmUgbGluZSAoZnVuY3Rpb24gLyB0eXBlIGFsaWFzIC8gdmFyaWFibGUpLiBDbGFzc2VzLCBpbnRlcmZhY2VzIGFuZCBlbnVtcyByZW5kZXIgbWVtYmVyXG4gKiB0YWJsZXMgaW5zdGVhZCwgc28gdGhleSBnZXQgbm8gc2lnbmF0dXJlIGJsb2NrLlxuICpcbiAqIEBwYXJhbSBuYW1lIC0gVGhlIHR5cGUncyBuYW1lLlxuICogQHBhcmFtIGluZm8gLSBUaGUgZG9jdW1lbnRlZCB0eXBlLlxuICogQHJldHVybnMgVGhlIHNpZ25hdHVyZSwgb3IgYHVuZGVmaW5lZGAgZm9yIGEga2luZCB0aGF0IHJlbmRlcnMgbWVtYmVyIHRhYmxlcyBpbnN0ZWFkLlxuICovXG5leHBvcnQgZnVuY3Rpb24gY29tcHV0ZU92ZXJ2aWV3U2lnbmF0dXJlKG5hbWU6IHN0cmluZywgaW5mbzogVHlwZUluZm8pOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICBpZiAoaW5mby5raW5kID09PSAnZnVuY3Rpb24nKSB7XG4gICAgY29uc3QgJGZ1bmN0aW9uID0gaW5mby5tZXRob2RzWzBdO1xuICAgIHJldHVybiAkZnVuY3Rpb24gPyBgZnVuY3Rpb24gJHskZnVuY3Rpb24uc2lnbmF0dXJlfTogJHskZnVuY3Rpb24ucmV0dXJuVHlwZX1gIDogdW5kZWZpbmVkO1xuICB9XG4gIGlmIChpbmZvLmtpbmQgPT09ICd0eXBlJykge1xuICAgIHJldHVybiBgdHlwZSAke2dldERpc3BsYXlOYW1lKGluZm8ubmFtZSwgaW5mbyl9ID0gJHtpbmZvLnR5cGVBbGlhc1RleHQgPz8gJ3Vua25vd24nfWA7XG4gIH1cbiAgcmV0dXJuIGluZm8ua2luZCA9PT0gJ3ZhcmlhYmxlJyA/IGAke2luZm8udmFyaWFibGVLZXl3b3JkID8/ICdsZXQnfSAke25hbWV9OiAke2luZm8udmFyaWFibGVUeXBlID8/ICd1bmtub3duJ31gIDogdW5kZWZpbmVkO1xufVxuXG4vKipcbiAqIFdyaXRlcyBvbmUgcGFnZSBwZXIgb3duIHByb3BlcnR5IGFuZCBwZXIgb3duIG1ldGhvZCBvdmVybG9hZCBrZXkgb2YgYSBjbGFzcyBvciBpbnRlcmZhY2UuXG4gKlxuICogQHBhcmFtIG5hbWUgLSBUaGUgdHlwZSdzIG5hbWUuXG4gKiBAcGFyYW0gaW5mbyAtIFRoZSBkb2N1bWVudGVkIHR5cGUuXG4gKiBAcGFyYW0gYWxsVHlwZXMgLSBFdmVyeSBkb2N1bWVudGVkIHR5cGUsIGtleWVkIGJ5IGAke25hbWVzcGFjZX0jJHtuYW1lfWAuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZW5lcmF0ZU1lbWJlclBhZ2VzKG5hbWU6IHN0cmluZywgaW5mbzogVHlwZUluZm8sIGFsbFR5cGVzOiBNYXA8c3RyaW5nLCBUeXBlSW5mbz4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgbnNEaXJlY3RvcnkgPSBnZXROYW1lc3BhY2VEaXJlY3RvcnkoaW5mby5uYW1lc3BhY2UpO1xuICBjb25zdCB0eXBlRmlsZURpcmVjdG9yeSA9IHRvVHlwZUZpbGVTZWdtZW50KGluZm8ubmFtZXNwYWNlLCBuYW1lKTtcbiAgY29uc3QgdHlwZVJvdXRlRGlyZWN0b3J5ID0gdG9UeXBlUm91dGVTZWdtZW50KGluZm8ubmFtZXNwYWNlLCBuYW1lKTtcbiAgY29uc3QgY29tcG9uZW50SW1wb3J0cyA9IGdldENvbXBvbmVudEltcG9ydHMoWydNZW1iZXJEZXRhaWwnXSk7XG5cbiAgLy8gUHJvcGVydHkgcGFnZXMgKHNraXAgaW5oZXJpdGVkIOKAlCB0aGV5IGxpdmUgb24gdGhlIHBhcmVudCB0eXBlKVxuICBjb25zdCBwcm9wZXJ0aWVzID0gaW5mby5wcm9wZXJ0aWVzLmZpbHRlcigocCkgPT4gIXAuaW5oZXJpdGVkRnJvbSk7XG4gIGZvciAoY29uc3QgcHJvcGVydHkgb2YgcHJvcGVydGllcykge1xuICAgIGNvbnN0IGZpbGVQYXRoID0gam9pbihnZXRBcGlEb2NTZXR0aW5ncygpLm91dHB1dERpcmVjdG9yeSwgbnNEaXJlY3RvcnksIHR5cGVGaWxlRGlyZWN0b3J5LCBgJHttZW1iZXJTbHVnKHByb3BlcnR5Lm5hbWUpfS5tZHhgKTtcbiAgICBhd2FpdCBlbnN1cmVEaXJlY3RvcnkoZmlsZVBhdGgpO1xuXG4gICAgY29uc3QgcHJvcGVydHlUaXRsZSA9IGAke25hbWV9LiR7cHJvcGVydHkubmFtZX1gO1xuICAgIGNvbnN0IGxpbmVzOiBzdHJpbmdbXSA9IHJlbmRlckZyb250TWF0dGVyKHtcbiAgICAgIGRlc2NyaXB0aW9uOiBwcm9wZXJ0eS5kZXNjcmlwdGlvbixcbiAgICAgIHNpZGViYXJMYWJlbDogcHJvcGVydHlUaXRsZSxcbiAgICAgIHNpZ25hdHVyZTogYCR7cHJvcGVydHkuc2lnbmF0dXJlfTogJHtwcm9wZXJ0eS50eXBlfWAsXG4gICAgICBzbHVnOiBgYXBpLyR7bnNEaXJlY3Rvcnl9LyR7dHlwZVJvdXRlRGlyZWN0b3J5fS8ke21lbWJlclJvdXRlU2VnbWVudChwcm9wZXJ0eS5uYW1lKX1gLFxuICAgICAgdGl0bGU6IHByb3BlcnR5VGl0bGVcbiAgICB9KTtcbiAgICBsaW5lcy5wdXNoKFxuICAgICAgLi4uY29tcG9uZW50SW1wb3J0cyxcbiAgICAgICcnLFxuICAgICAgLy8gQnJlYWRjcnVtYlxuICAgICAgYFske25hbWV9XSgke2dldEFwaURvY1NldHRpbmdzKCkuYmFzZVBhdGh9L2FwaS8ke25zRGlyZWN0b3J5fS8ke3R5cGVSb3V0ZURpcmVjdG9yeX0vKSDigLogJHtwcm9wZXJ0eS5uYW1lfWAsXG4gICAgICAnJ1xuICAgICk7XG5cbiAgICBjb25zdCBzdGF0aWNBdHRyaWJ1dGUgPSBwcm9wZXJ0eS5pc1N0YXRpYyA/ICcgaXNTdGF0aWM9e3RydWV9JyA6ICcnO1xuICAgIGNvbnN0IHR5cGVBdHRyaWJ1dGUgPSBgIHR5cGU9XCIke2VzY2FwZUpzeEF0dHJpYnV0ZShtYXJrZG93blRvSHRtbChyZW5kZXJUeXBlV2l0aExpbmtzKHByb3BlcnR5LnR5cGUsIGFsbFR5cGVzLCBuYW1lLCBpbmZvLm5hbWVzcGFjZSkpKX1cImA7XG4gICAgY29uc3QgZGVzY0F0dHJpYnV0ZSA9IHByb3BlcnR5LmRlc2NyaXB0aW9uID8gYCBkZXNjcmlwdGlvbj1cIiR7ZXNjYXBlSnN4QXR0cmlidXRlKG1hcmtkb3duVG9IdG1sKHJlc29sdmVMaW5rcyhwcm9wZXJ0eS5kZXNjcmlwdGlvbiwgYWxsVHlwZXMsIGluZm8ubmFtZXNwYWNlKSkpfVwiYCA6ICcnO1xuICAgIGNvbnN0IHJlbWFya3NBdHRyaWJ1dGUgPSBwcm9wZXJ0eS5yZW1hcmtzID8gYCByZW1hcmtzPVwiJHtlc2NhcGVKc3hBdHRyaWJ1dGUobWFya2Rvd25Ub0h0bWwocmVzb2x2ZUxpbmtzKHByb3BlcnR5LnJlbWFya3MsIGFsbFR5cGVzLCBpbmZvLm5hbWVzcGFjZSkpKX1cImAgOiAnJztcbiAgICBjb25zdCBzaW5jZUF0dHJpYnV0ZSA9IHByb3BlcnR5LnNpbmNlID8gYCBzaW5jZT1cIiR7ZXNjYXBlSnN4QXR0cmlidXRlKHByb3BlcnR5LnNpbmNlKX1cImAgOiAnJztcbiAgICBjb25zdCBleGFtcGxlc0F0dHJpYnV0ZSA9IHByb3BlcnR5LmV4YW1wbGVzLmxlbmd0aCA+IDAgPyBgIGV4YW1wbGVzPXske0pTT04uc3RyaW5naWZ5KHByb3BlcnR5LmV4YW1wbGVzKX19YCA6ICcnO1xuXG4gICAgbGluZXMucHVzaChgPE1lbWJlckRldGFpbCR7c3RhdGljQXR0cmlidXRlfSR7dHlwZUF0dHJpYnV0ZX0ke2Rlc2NBdHRyaWJ1dGV9JHtyZW1hcmtzQXR0cmlidXRlfSR7c2luY2VBdHRyaWJ1dGV9JHtleGFtcGxlc0F0dHJpYnV0ZX0gLz5gLCAnJyk7XG5cbiAgICBhd2FpdCB3cml0ZUZpbGUoZmlsZVBhdGgsIGxpbmVzLmpvaW4oJ1xcbicpLCAndXRmLTgnKTtcbiAgfVxuXG4gIC8vIE1ldGhvZCBwYWdlcyDigJQgZWFjaCBvdmVybG9hZCBrZXkgZ2V0cyBpdHMgb3duIHBhZ2UgKHNraXAgaW5oZXJpdGVkKVxuICBjb25zdCBtZXRob2RzID0gaW5mby5tZXRob2RzLmZpbHRlcigobSkgPT4gIW0uaW5oZXJpdGVkRnJvbSk7XG4gIGNvbnN0IG92ZXJsb2FkR3JvdXBzID0gbmV3IE1hcDxzdHJpbmcsIE1lbWJlckluZm9bXT4oKTtcbiAgZm9yIChjb25zdCBtZXRob2Qgb2YgbWV0aG9kcykge1xuICAgIGNvbnN0IGtleSA9IG1ldGhvZC5vdmVybG9hZEtleTtcbiAgICBpZiAoIW92ZXJsb2FkR3JvdXBzLmhhcyhrZXkpKSB7XG4gICAgICBvdmVybG9hZEdyb3Vwcy5zZXQoa2V5LCBbXSk7XG4gICAgfVxuICAgIG92ZXJsb2FkR3JvdXBzLmdldChrZXkpPy5wdXNoKG1ldGhvZCk7XG4gIH1cblxuICBmb3IgKGNvbnN0IFtvdmVybG9hZEtleSwgb3ZlcmxvYWRzXSBvZiBvdmVybG9hZEdyb3Vwcykge1xuICAgIGNvbnN0IGZpbGVTbHVnID0gb3ZlcmxvYWRTbHVnKG92ZXJsb2FkS2V5KTtcbiAgICBjb25zdCBmaWxlUGF0aCA9IGpvaW4oZ2V0QXBpRG9jU2V0dGluZ3MoKS5vdXRwdXREaXJlY3RvcnksIG5zRGlyZWN0b3J5LCB0eXBlRmlsZURpcmVjdG9yeSwgYCR7ZmlsZVNsdWd9Lm1keGApO1xuICAgIGF3YWl0IGVuc3VyZURpcmVjdG9yeShmaWxlUGF0aCk7XG5cbiAgICBjb25zdCBkaXNwbGF5TmFtZSA9IGAke25hbWV9LiR7b3ZlcmxvYWRLZXl9IG1ldGhvZGA7XG4gICAgLy8gQSBncm91cCBpcyBjcmVhdGVkIGJ5IGl0cyBmaXJzdCBvdmVybG9hZC5cbiAgICBjb25zdCBmaXJzdE92ZXJsb2FkID0gZW5zdXJlTm9uTnVsbGFibGUob3ZlcmxvYWRzWzBdKTtcblxuICAgIGNvbnN0IGxpbmVzOiBzdHJpbmdbXSA9IHJlbmRlckZyb250TWF0dGVyKHtcbiAgICAgIGRlc2NyaXB0aW9uOiBmaXJzdE92ZXJsb2FkLmRlc2NyaXB0aW9uLFxuICAgICAgc2lkZWJhckxhYmVsOiBgJHtuYW1lfS4ke292ZXJsb2FkS2V5fWAsXG4gICAgICBzaWduYXR1cmU6IGAke2ZpcnN0T3ZlcmxvYWQuc2lnbmF0dXJlfTogJHtmaXJzdE92ZXJsb2FkLnJldHVyblR5cGV9YCxcbiAgICAgIHNsdWc6IGBhcGkvJHtuc0RpcmVjdG9yeX0vJHt0eXBlUm91dGVEaXJlY3Rvcnl9LyR7b3ZlcmxvYWRSb3V0ZVNlZ21lbnQob3ZlcmxvYWRLZXkpfWAsXG4gICAgICB0aXRsZTogZGlzcGxheU5hbWVcbiAgICB9KTtcbiAgICBsaW5lcy5wdXNoKFxuICAgICAgLi4uY29tcG9uZW50SW1wb3J0cyxcbiAgICAgICcnLFxuICAgICAgLy8gQnJlYWRjcnVtYlxuICAgICAgYFske25hbWV9XSgke2dldEFwaURvY1NldHRpbmdzKCkuYmFzZVBhdGh9L2FwaS8ke25zRGlyZWN0b3J5fS8ke3R5cGVSb3V0ZURpcmVjdG9yeX0vKSDigLogJHtvdmVybG9hZEtleX1gLFxuICAgICAgJydcbiAgICApO1xuXG4gICAgZm9yIChjb25zdCBvdmVybG9hZCBvZiBvdmVybG9hZHMpIHtcbiAgICAgIHJlbmRlck1ldGhvZE92ZXJsb2FkTWR4KGxpbmVzLCBvdmVybG9hZCwgbmFtZSwgaW5mby5uYW1lc3BhY2UsIGFsbFR5cGVzKTtcbiAgICAgIGlmIChvdmVybG9hZHMubGVuZ3RoID4gMSkge1xuICAgICAgICBsaW5lcy5wdXNoKCctLS0nLCAnJyk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgYXdhaXQgd3JpdGVGaWxlKGZpbGVQYXRoLCBsaW5lcy5qb2luKCdcXG4nKSwgJ3V0Zi04Jyk7XG4gIH1cbn1cblxuLyoqXG4gKiBXcml0ZXMgZWFjaCBtb2R1bGUncyBpbmRleCBwYWdlIGFuZCB0aGUgcm9vdCBBUEkgaW5kZXguXG4gKlxuICogQHBhcmFtIHR5cGVzIC0gVGhlIGRvY3VtZW50ZWQgdHlwZXMsIGtleWVkIGJ5IHF1YWxpZmllZCBpZC5cbiAqIEBwYXJhbSBhbGxUeXBlcyAtIEV2ZXJ5IGRvY3VtZW50ZWQgdHlwZSwga2V5ZWQgYnkgYCR7bmFtZXNwYWNlfSMke25hbWV9YC5cbiAqIEBwYXJhbSBtb2R1bGVPdmVydmlld3MgLSBFYWNoIG5hbWVzcGFjZSdzIGBAZmlsZWAgb3ZlcnZpZXcuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZW5lcmF0ZU5hbWVzcGFjZUluZGV4UGFnZXMoXG4gIHR5cGVzOiBNYXA8c3RyaW5nLCBUeXBlSW5mbz4sXG4gIGFsbFR5cGVzOiBNYXA8c3RyaW5nLCBUeXBlSW5mbz4sXG4gIG1vZHVsZU92ZXJ2aWV3czogTWFwPHN0cmluZywgc3RyaW5nPlxuKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IG5hbWVzcGFjZXMgPSBuZXcgTWFwPHN0cmluZywgVHlwZUluZm9bXT4oKTtcbiAgZm9yIChjb25zdCBbLCBpbmZvXSBvZiB0eXBlcykge1xuICAgIGlmICghbmFtZXNwYWNlcy5oYXMoaW5mby5uYW1lc3BhY2UpKSB7XG4gICAgICBuYW1lc3BhY2VzLnNldChpbmZvLm5hbWVzcGFjZSwgW10pO1xuICAgIH1cbiAgICBuYW1lc3BhY2VzLmdldChpbmZvLm5hbWVzcGFjZSk/LnB1c2goaW5mbyk7XG4gIH1cblxuICBmb3IgKGNvbnN0IFtuYW1lc3BhY2UsIG5zVHlwZXNdIG9mIG5hbWVzcGFjZXMpIHtcbiAgICBjb25zdCBuc0RpcmVjdG9yeSA9IGdldE5hbWVzcGFjZURpcmVjdG9yeShuYW1lc3BhY2UpO1xuICAgIGNvbnN0IGZpbGVQYXRoID0gam9pbihnZXRBcGlEb2NTZXR0aW5ncygpLm91dHB1dERpcmVjdG9yeSwgbnNEaXJlY3RvcnksICdpbmRleC5tZHgnKTtcbiAgICBhd2FpdCBlbnN1cmVEaXJlY3RvcnkoZmlsZVBhdGgpO1xuXG4gICAgLy8gVGhlIG1vZHVsZSdzIGBAZmlsZWAgdGV4dCBkb3VibGVzIGFzIGl0cyBkZXNjcmlwdGlvbi5cbiAgICAvLyBXaXRob3V0IGl0IHRoZSBtb2R1bGUgY2FyZCB3YXMgdGl0bGUtb25seSB3aGlsZSBldmVyeSBtZW1iZXIgY2FyZCB1bmRlciBpdCBjYXJyaWVkIG9uZS5cbiAgICBjb25zdCBvdmVydmlldyA9IG1vZHVsZU92ZXJ2aWV3cy5nZXQobmFtZXNwYWNlKTtcbiAgICBjb25zdCBsaW5lczogc3RyaW5nW10gPSByZW5kZXJGcm9udE1hdHRlcih7XG4gICAgICBkZXNjcmlwdGlvbjogb3ZlcnZpZXcsXG4gICAgICBzaWRlYmFyTGFiZWw6IG5hbWVzcGFjZSxcbiAgICAgIHNsdWc6IGBhcGkvJHtuc0RpcmVjdG9yeX1gLFxuICAgICAgdGl0bGU6IG5hbWVzcGFjZVxuICAgIH0pO1xuXG4gICAgLy8gTW9kdWxlIEBmaWxlIG92ZXJ2aWV3IHRleHRcbiAgICBpZiAob3ZlcnZpZXcpIHtcbiAgICAgIGxpbmVzLnB1c2gocmVuZGVyTWR4UHJvc2Uob3ZlcnZpZXcsIGFsbFR5cGVzLCBuYW1lc3BhY2UpLCAnJyk7XG4gICAgfVxuXG4gICAgcmVuZGVyTmFtZXNwYWNlVGFibGUobGluZXMsICdDbGFzc2VzJywgJ0NsYXNzJywgbnNUeXBlcy5maWx0ZXIoKHQpID0+IHQua2luZCA9PT0gJ2NsYXNzJyksIGFsbFR5cGVzLCBuYW1lc3BhY2UpO1xuICAgIHJlbmRlck5hbWVzcGFjZVRhYmxlKGxpbmVzLCAnSW50ZXJmYWNlcycsICdJbnRlcmZhY2UnLCBuc1R5cGVzLmZpbHRlcigodCkgPT4gdC5raW5kID09PSAnaW50ZXJmYWNlJyksIGFsbFR5cGVzLCBuYW1lc3BhY2UpO1xuICAgIHJlbmRlck5hbWVzcGFjZVRhYmxlKGxpbmVzLCAnRnVuY3Rpb25zJywgJ0Z1bmN0aW9uJywgbnNUeXBlcy5maWx0ZXIoKHQpID0+IHQua2luZCA9PT0gJ2Z1bmN0aW9uJyksIGFsbFR5cGVzLCBuYW1lc3BhY2UpO1xuICAgIHJlbmRlck5hbWVzcGFjZVRhYmxlKGxpbmVzLCAnVHlwZXMnLCAnVHlwZScsIG5zVHlwZXMuZmlsdGVyKCh0KSA9PiB0LmtpbmQgPT09ICd0eXBlJyksIGFsbFR5cGVzLCBuYW1lc3BhY2UpO1xuICAgIHJlbmRlck5hbWVzcGFjZVRhYmxlKGxpbmVzLCAnRW51bXMnLCAnRW51bScsIG5zVHlwZXMuZmlsdGVyKCh0KSA9PiB0LmtpbmQgPT09ICdlbnVtJyksIGFsbFR5cGVzLCBuYW1lc3BhY2UpO1xuICAgIHJlbmRlck5hbWVzcGFjZVRhYmxlKGxpbmVzLCAnVmFyaWFibGVzJywgJ1ZhcmlhYmxlJywgbnNUeXBlcy5maWx0ZXIoKHQpID0+IHQua2luZCA9PT0gJ3ZhcmlhYmxlJyksIGFsbFR5cGVzLCBuYW1lc3BhY2UpO1xuXG4gICAgYXdhaXQgd3JpdGVGaWxlKGZpbGVQYXRoLCBsaW5lcy5qb2luKCdcXG4nKSwgJ3V0Zi04Jyk7XG4gIH1cblxuICAvLyBSb290IEFQSSBpbmRleCBwYWdlIGxpc3RpbmcgZXZlcnkgbW9kdWxlLlxuICBjb25zdCBzb3J0ZWROYW1lc3BhY2VzID0gWy4uLm5hbWVzcGFjZXMua2V5cygpXS5zb3J0KChhLCBiKSA9PiBhLmxvY2FsZUNvbXBhcmUoYikpO1xuICBjb25zdCBhcGlJbmRleEludHJvID0gZ2V0QXBpSW5kZXhJbnRybyhzb3J0ZWROYW1lc3BhY2VzKTtcbiAgY29uc3Qgcm9vdExpbmVzOiBzdHJpbmdbXSA9IHJlbmRlckZyb250TWF0dGVyKHtcbiAgICBkZXNjcmlwdGlvbjogYXBpSW5kZXhJbnRybyxcbiAgICBzaWRlYmFyTGFiZWw6ICdPdmVydmlldycsXG4gICAgc2x1ZzogJ2FwaScsXG4gICAgdGl0bGU6ICdBUEkgcmVmZXJlbmNlJ1xuICB9KTtcbiAgcm9vdExpbmVzLnB1c2goYXBpSW5kZXhJbnRybywgJycsICcjIyBNb2R1bGVzJywgJycpO1xuICBmb3IgKGNvbnN0IG5hbWVzcGFjZSBvZiBzb3J0ZWROYW1lc3BhY2VzKSB7XG4gICAgcm9vdExpbmVzLnB1c2goYC0gWyR7bmFtZXNwYWNlfV0oJHtnZXRBcGlEb2NTZXR0aW5ncygpLmJhc2VQYXRofS9hcGkvJHtnZXROYW1lc3BhY2VEaXJlY3RvcnkobmFtZXNwYWNlKX0vKWApO1xuICB9XG4gIHJvb3RMaW5lcy5wdXNoKCcnKTtcbiAgY29uc3Qgcm9vdEZpbGVQYXRoID0gam9pbihnZXRBcGlEb2NTZXR0aW5ncygpLm91dHB1dERpcmVjdG9yeSwgJ2luZGV4Lm1keCcpO1xuICBhd2FpdCBlbnN1cmVEaXJlY3Rvcnkocm9vdEZpbGVQYXRoKTtcbiAgYXdhaXQgd3JpdGVGaWxlKHJvb3RGaWxlUGF0aCwgcm9vdExpbmVzLmpvaW4oJ1xcbicpLCAndXRmLTgnKTtcbn1cblxuLyoqXG4gKiBSZW5kZXJzIGEgdHlwZSdzIG92ZXJ2aWV3IHBhZ2UuXG4gKlxuICogQHBhcmFtIG5hbWUgLSBUaGUgdHlwZSdzIG5hbWUuXG4gKiBAcGFyYW0gaW5mbyAtIFRoZSBkb2N1bWVudGVkIHR5cGUuXG4gKiBAcGFyYW0gYWxsVHlwZXMgLSBFdmVyeSBkb2N1bWVudGVkIHR5cGUsIGtleWVkIGJ5IGAke25hbWVzcGFjZX0jJHtuYW1lfWAuXG4gKiBAcmV0dXJucyBUaGUgcGFnZSdzIGNvbnRlbnQsIGJlZm9yZSBiYWNrbGlua3MsIGFuZCB0aGUgcGF0aCBpdCBpcyB3cml0dGVuIHRvLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVPdmVydmlld1BhZ2UobmFtZTogc3RyaW5nLCBpbmZvOiBUeXBlSW5mbywgYWxsVHlwZXM6IE1hcDxzdHJpbmcsIFR5cGVJbmZvPik6IFByb21pc2U8UGFnZUNvbnRlbnQ+IHtcbiAgY29uc3QgbnNEaXJlY3RvcnkgPSBnZXROYW1lc3BhY2VEaXJlY3RvcnkoaW5mby5uYW1lc3BhY2UpO1xuICBjb25zdCB0eXBlRmlsZVNsdWcgPSB0b1R5cGVGaWxlU2VnbWVudChpbmZvLm5hbWVzcGFjZSwgbmFtZSk7XG4gIGNvbnN0IHR5cGVSb3V0ZVNsdWcgPSB0b1R5cGVSb3V0ZVNlZ21lbnQoaW5mby5uYW1lc3BhY2UsIG5hbWUpO1xuICBjb25zdCBmaWxlUGF0aCA9IGpvaW4oZ2V0QXBpRG9jU2V0dGluZ3MoKS5vdXRwdXREaXJlY3RvcnksIG5zRGlyZWN0b3J5LCB0eXBlRmlsZVNsdWcsICdpbmRleC5tZHgnKTtcbiAgYXdhaXQgZW5zdXJlRGlyZWN0b3J5KGZpbGVQYXRoKTtcblxuICAvLyBGcm9udG1hdHRlclxuICBjb25zdCBkaXNwbGF5TmFtZSA9IGdldERpc3BsYXlOYW1lKG5hbWUsIGluZm8pO1xuICBjb25zdCBsaW5lczogc3RyaW5nW10gPSByZW5kZXJGcm9udE1hdHRlcih7XG4gICAgZGVzY3JpcHRpb246IGluZm8uZGVzY3JpcHRpb24sXG4gICAgc2lkZWJhckxhYmVsOiBkaXNwbGF5TmFtZSxcbiAgICBzaWduYXR1cmU6IGNvbXB1dGVPdmVydmlld1NpZ25hdHVyZShuYW1lLCBpbmZvKSxcbiAgICBzbHVnOiBgYXBpLyR7bnNEaXJlY3Rvcnl9LyR7dHlwZVJvdXRlU2x1Z31gLFxuICAgIHRpdGxlOiBkaXNwbGF5TmFtZVxuICB9KTtcblxuICAvLyBDb21wb25lbnQgaW1wb3J0cyDigJQgY29tcHV0ZSByZWxhdGl2ZSBwYXRoIGZyb20gZ2VuZXJhdGVkIHBhZ2UgdG8gY29tcG9uZW50c1xuICBsaW5lcy5wdXNoKC4uLmdldENvbXBvbmVudEltcG9ydHMoWydDb25zdHJ1Y3RvckJsb2NrJywgJ0ltcG9ydFN0YXRlbWVudCcsICdNZXRob2RUYWJsZScsICdQcm9wZXJ0eVRhYmxlJywgJ1R5cGVTaWduYXR1cmUnXSksICcnKTtcblxuICAvLyBEZXNjcmlwdGlvblxuICBpZiAoaW5mby5kZXNjcmlwdGlvbikge1xuICAgIGxpbmVzLnB1c2gocmVuZGVyTWR4UHJvc2UoaW5mby5kZXNjcmlwdGlvbiwgYWxsVHlwZXMsIGluZm8ubmFtZXNwYWNlKSwgJycpO1xuICB9XG5cbiAgLy8gUmVtYXJrc1xuICBpZiAoaW5mby5yZW1hcmtzKSB7XG4gICAgY29uc3QgcmVtYXJrc0Jsb2NrID0gcmVuZGVyTWR4UHJvc2UoaW5mby5yZW1hcmtzLCBhbGxUeXBlcywgaW5mby5uYW1lc3BhY2UpO1xuICAgIGxpbmVzLnB1c2gocmVtYXJrc0Jsb2NrLnNwbGl0KCdcXG4nKS5tYXAoKGxpbmUpID0+IChsaW5lLmxlbmd0aCA+IDAgPyBgPiAke2xpbmV9YCA6ICc+JykpLmpvaW4oJ1xcbicpLCAnJyk7XG4gIH1cblxuICAvLyBJbXBvcnQgc3RhdGVtZW50XG4gIGxpbmVzLnB1c2goYDxJbXBvcnRTdGF0ZW1lbnQgdGV4dD1cIiR7ZXNjYXBlSnN4QXR0cmlidXRlKGdldEltcG9ydFN0YXRlbWVudChpbmZvKSl9XCIgLz5gLCAnJyk7XG5cbiAgLy8gRXhhbXBsZXNcbiAgZm9yIChjb25zdCBleGFtcGxlIG9mIGluZm8uZXhhbXBsZXMpIHtcbiAgICBsaW5lcy5wdXNoKCcqKkV4YW1wbGU6KionLCAnJywgcmVuZGVyRXhhbXBsZU1keChleGFtcGxlLCBhbGxUeXBlcywgaW5mby5uYW1lc3BhY2UpLCAnJyk7XG4gIH1cblxuICAvLyBGdW5jdGlvbnMgcmVuZGVyIGxpa2UgbWV0aG9kIGRldGFpbCBwYWdlcyDigJQgc2lnbmF0dXJlLCBwYXJhbXMsIHJldHVybnNcbiAgaWYgKGluZm8ua2luZCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIHJlbmRlckZ1bmN0aW9uUGFnZShsaW5lcywgaW5mbywgYWxsVHlwZXMpO1xuICAgIHJldHVybiB7IGNvbnRlbnQ6IGxpbmVzLmpvaW4oJ1xcbicpLCBmaWxlUGF0aCB9O1xuICB9XG5cbiAgLy8gVmFyaWFibGVzIHJlbmRlciB3aXRoIGRlY2xhcmF0aW9uIGtleXdvcmQgYW5kIHR5cGVcbiAgaWYgKGluZm8ua2luZCA9PT0gJ3ZhcmlhYmxlJykge1xuICAgIHJlbmRlclZhcmlhYmxlUGFnZShsaW5lcywgbmFtZSwgaW5mbywgYWxsVHlwZXMpO1xuICAgIHJldHVybiB7IGNvbnRlbnQ6IGxpbmVzLmpvaW4oJ1xcbicpLCBmaWxlUGF0aCB9O1xuICB9XG5cbiAgLy8gRW51bXMgcmVuZGVyIHRoZWlyIG1lbWJlcnMgbGlzdFxuICBpZiAoaW5mby5raW5kID09PSAnZW51bScpIHtcbiAgICByZW5kZXJFbnVtUGFnZShsaW5lcywgaW5mbywgYWxsVHlwZXMpO1xuICAgIHJldHVybiB7IGNvbnRlbnQ6IGxpbmVzLmpvaW4oJ1xcbicpLCBmaWxlUGF0aCB9O1xuICB9XG5cbiAgLy8gVHlwZSBhbGlhc2VzIHJlbmRlciB0aGVpciByaWdodC1oYW5kLXNpZGUgc2lnbmF0dXJlXG4gIGlmIChpbmZvLmtpbmQgPT09ICd0eXBlJykge1xuICAgIHJlbmRlclR5cGVBbGlhc1BhZ2UobGluZXMsIGluZm8sIGFsbFR5cGVzKTtcbiAgICByZXR1cm4geyBjb250ZW50OiBsaW5lcy5qb2luKCdcXG4nKSwgZmlsZVBhdGggfTtcbiAgfVxuXG4gIC8vIENsYXNzZXMgLyBpbnRlcmZhY2VzOiBzaWduYXR1cmUgKyBleHRlbmRzL2ltcGxlbWVudHMgKyBjb25zdHJ1Y3RvciArIG1lbWJlciB0YWJsZXNcbiAgY29uc3QgdHlwZVBhcmFtc0F0dHJpYnV0ZSA9IGluZm8udHlwZVBhcmFtZXRlcnMubGVuZ3RoID4gMCA/IGAgdHlwZVBhcmFtcz17JHtKU09OLnN0cmluZ2lmeShpbmZvLnR5cGVQYXJhbWV0ZXJzKX19YCA6ICcnO1xuICBjb25zdCBleHRlbmRzQXR0cmlidXRlID0gaW5mby5iYXNlVHlwZXMubGVuZ3RoID4gMCA/IGAgZXh0ZW5kcz17JHtKU09OLnN0cmluZ2lmeShpbmZvLmJhc2VUeXBlcyl9fWAgOiAnJztcbiAgY29uc3QgaW1wbGVtZW50c0F0dHJpYnV0ZSA9IGluZm8uaW1wbGVtZW50c1R5cGVzLmxlbmd0aCA+IDAgPyBgIGltcGxlbWVudHM9eyR7SlNPTi5zdHJpbmdpZnkoaW5mby5pbXBsZW1lbnRzVHlwZXMpfX1gIDogJyc7XG4gIGxpbmVzLnB1c2goYDxUeXBlU2lnbmF0dXJlIGtpbmQ9XCIke2luZm8ua2luZH1cIiBuYW1lPVwiJHtuYW1lfVwiJHt0eXBlUGFyYW1zQXR0cmlidXRlfSR7ZXh0ZW5kc0F0dHJpYnV0ZX0ke2ltcGxlbWVudHNBdHRyaWJ1dGV9IC8+YCwgJycpO1xuXG4gIGlmIChpbmZvLmJhc2VUeXBlcy5sZW5ndGggPiAwKSB7XG4gICAgY29uc3QgbGlua2VkVHlwZXMgPSBpbmZvLmJhc2VUeXBlcy5tYXAoKHQpID0+IGxpbmtCYXNlVHlwZSh0LCBhbGxUeXBlcywgaW5mby5uYW1lc3BhY2UpKTtcbiAgICBsaW5lcy5wdXNoKGAqKkV4dGVuZHM6KiogJHtsaW5rZWRUeXBlcy5qb2luKCcsICcpfWAsICcnKTtcbiAgfVxuXG4gIGlmIChpbmZvLmltcGxlbWVudHNUeXBlcy5sZW5ndGggPiAwKSB7XG4gICAgY29uc3QgbGlua2VkVHlwZXMgPSBpbmZvLmltcGxlbWVudHNUeXBlcy5tYXAoKHQpID0+IGxpbmtCYXNlVHlwZSh0LCBhbGxUeXBlcywgaW5mby5uYW1lc3BhY2UpKTtcbiAgICBsaW5lcy5wdXNoKGAqKkltcGxlbWVudHM6KiogJHtsaW5rZWRUeXBlcy5qb2luKCcsICcpfWAsICcnKTtcbiAgfVxuXG4gIHJlbmRlckNvbnN0cnVjdG9yTWR4KGxpbmVzLCBuYW1lLCBpbmZvLCBhbGxUeXBlcyk7XG4gIHJlbmRlclByb3BlcnR5VGFibGVNZHgobGluZXMsIGluZm8sIGFsbFR5cGVzKTtcbiAgcmVuZGVyTWV0aG9kVGFibGVNZHgobGluZXMsIGluZm8sIGFsbFR5cGVzKTtcblxuICByZXR1cm4geyBjb250ZW50OiBsaW5lcy5qb2luKCdcXG4nKSwgZmlsZVBhdGggfTtcbn1cblxuLyoqXG4gKiBXcml0ZXMgdGhlIFN0YXJsaWdodCBzaWRlYmFyIG9mIHRoZSBBUEkgcmVmZXJlbmNlLlxuICpcbiAqIEBwYXJhbSB0eXBlcyAtIFRoZSBkb2N1bWVudGVkIHR5cGVzLCBrZXllZCBieSBxdWFsaWZpZWQgaWQuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZW5lcmF0ZVNpZGViYXJKc29uKHR5cGVzOiBNYXA8c3RyaW5nLCBUeXBlSW5mbz4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3Qgcm9vdCA9IGJ1aWxkU2lkZWJhclRyZWUodHlwZXMpO1xuXG4gIGNvbnN0IGdyb3VwczogU2lkZWJhckVudHJ5W10gPSBbXTtcbiAgY29uc3QgdG9wTGV2ZWxzID0gWy4uLnJvb3QuY2hpbGRyZW5dLnNvcnQoKFthXSwgW2JdKSA9PiBhLmxvY2FsZUNvbXBhcmUoYikpO1xuICBmb3IgKGNvbnN0IFt0b3BMZXZlbCwgY2hpbGRdIG9mIHRvcExldmVscykge1xuICAgIGdyb3Vwcy5wdXNoKHNpZGViYXJUcmVlVG9FbnRyaWVzKGNoaWxkLCB0b3BMZXZlbCkpO1xuICB9XG5cbiAgY29uc3Qgd3JhcHBlZFNpZGViYXI6IFNpZGViYXJFbnRyeVtdID0gW3tcbiAgICBjb2xsYXBzZWQ6IGZhbHNlLFxuICAgIGl0ZW1zOiBncm91cHMsXG4gICAgbGFiZWw6ICdBUEkgcmVmZXJlbmNlJ1xuICB9XTtcblxuICBhd2FpdCB3cml0ZUZpbGUoZ2V0QXBpRG9jU2V0dGluZ3MoKS5zaWRlYmFyRmlsZSwgSlNPTi5zdHJpbmdpZnkod3JhcHBlZFNpZGViYXIsIG51bGwsIEpTT05fSU5ERU5UKSwgJ3V0Zi04Jyk7XG4gIGNvbnNvbGUud2FybihgR2VuZXJhdGVkIHNpZGViYXIgd2l0aCAke1N0cmluZyhncm91cHMubGVuZ3RoKX0gdG9wLWxldmVsIG1vZHVsZSBncm91cHNgKTtcbn1cblxuLyoqXG4gKiBSZW5kZXJzIGEgY2xhc3MncyBjb25zdHJ1Y3RvciBibG9jay5cbiAqXG4gKiBAcGFyYW0gbGluZXMgLSBUaGUgcGFnZSBsaW5lcyB0byBhcHBlbmQgdG8uXG4gKiBAcGFyYW0gbmFtZSAtIFRoZSB0eXBlJ3MgbmFtZS5cbiAqIEBwYXJhbSBpbmZvIC0gVGhlIGRvY3VtZW50ZWQgdHlwZS5cbiAqIEBwYXJhbSBhbGxUeXBlcyAtIEV2ZXJ5IGRvY3VtZW50ZWQgdHlwZSwga2V5ZWQgYnkgYCR7bmFtZXNwYWNlfSMke25hbWV9YC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlbmRlckNvbnN0cnVjdG9yTWR4KGxpbmVzOiBzdHJpbmdbXSwgbmFtZTogc3RyaW5nLCBpbmZvOiBUeXBlSW5mbywgYWxsVHlwZXM6IE1hcDxzdHJpbmcsIFR5cGVJbmZvPik6IHZvaWQge1xuICBjb25zdCBjb25zdHJ1Y3RvciA9IGluZm8uY29uc3RydWN0b3JJbmZvO1xuICBpZiAoIWNvbnN0cnVjdG9yKSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIGNvbnN0IGN0b3JTaWcgPSBgbmV3ICR7bmFtZX0ke2NvbnN0cnVjdG9yLnNpZ25hdHVyZX1gO1xuICBjb25zdCBjdG9yRGVzYyA9IGNvbnN0cnVjdG9yLmRlc2NyaXB0aW9uXG4gICAgPyBgIGRlc2NyaXB0aW9uPVwiJHtlc2NhcGVKc3hBdHRyaWJ1dGUobWFya2Rvd25Ub0h0bWwocmVzb2x2ZUxpbmtzKGNvbnN0cnVjdG9yLmRlc2NyaXB0aW9uLCBhbGxUeXBlcywgaW5mby5uYW1lc3BhY2UpKSl9XCJgXG4gICAgOiAnJztcbiAgbGluZXMucHVzaChgPENvbnN0cnVjdG9yQmxvY2sgc2lnbmF0dXJlPVwiJHtlc2NhcGVKc3hBdHRyaWJ1dGUoY3RvclNpZyl9XCIke2N0b3JEZXNjfSAvPmAsICcnKTtcbn1cblxuLyoqXG4gKiBSZW5kZXJzIGFuIGVudW0ncyBtZW1iZXJzLlxuICpcbiAqIEBwYXJhbSBsaW5lcyAtIFRoZSBwYWdlIGxpbmVzIHRvIGFwcGVuZCB0by5cbiAqIEBwYXJhbSBpbmZvIC0gVGhlIGRvY3VtZW50ZWQgdHlwZS5cbiAqIEBwYXJhbSBhbGxUeXBlcyAtIEV2ZXJ5IGRvY3VtZW50ZWQgdHlwZSwga2V5ZWQgYnkgYCR7bmFtZXNwYWNlfSMke25hbWV9YC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlbmRlckVudW1QYWdlKGxpbmVzOiBzdHJpbmdbXSwgaW5mbzogVHlwZUluZm8sIGFsbFR5cGVzOiBNYXA8c3RyaW5nLCBUeXBlSW5mbz4pOiB2b2lkIHtcbiAgbGluZXMucHVzaChgPFR5cGVTaWduYXR1cmUga2luZD1cImVudW1cIiBuYW1lPVwiJHtpbmZvLm5hbWV9XCIgLz5gLCAnJyk7XG5cbiAgaWYgKGluZm8uZW51bU1lbWJlcnMubGVuZ3RoID09PSAwKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgbGluZXMucHVzaCgnKipNZW1iZXJzOioqJywgJycsICd8IE1lbWJlciB8IFZhbHVlIHwgRGVzY3JpcHRpb24gfCcsICd8IDotLSB8IDotLSB8IDotLSB8Jyk7XG4gIGZvciAoY29uc3QgbWVtYmVyIG9mIGluZm8uZW51bU1lbWJlcnMpIHtcbiAgICBjb25zdCB2YWx1ZSA9IG1lbWJlci52YWx1ZSA/IGBcXGAke2VzY2FwZU1hcmtkb3duKG1lbWJlci52YWx1ZSl9XFxgYCA6ICcnO1xuICAgIGxpbmVzLnB1c2goYHwgXFxgJHttZW1iZXIubmFtZX1cXGAgfCAke3ZhbHVlfSB8ICR7ZXNjYXBlTWFya2Rvd24ocmVzb2x2ZUxpbmtzKG1lbWJlci5kZXNjcmlwdGlvbiwgYWxsVHlwZXMsIGluZm8ubmFtZXNwYWNlKSl9IHxgKTtcbiAgfVxuICBsaW5lcy5wdXNoKCcnKTtcbn1cblxuLyoqXG4gKiBSZW5kZXIgdGhlIFN0YXJsaWdodCBmcm9udG1hdHRlciBibG9jayAodGhyb3VnaCB0aGUgY2xvc2luZyBgLS0tYCBhbmQgaXRzIGJsYW5rIGxpbmUpIHNoYXJlZCBieSBldmVyeVxuICogZ2VuZXJhdGVkIHBhZ2Uga2luZDogbW9kdWxlIGluZGV4LCB0eXBlIG92ZXJ2aWV3LCBwcm9wZXJ0eSwgYW5kIG1ldGhvZC5cbiAqXG4gKiBFdmVyeSBwYWdlIGtpbmQgZ29lcyB0aHJvdWdoIGhlcmUgc28gbm8gZmllbGQgY2FuIGJlIGVtaXR0ZWQgb24gc29tZSBraW5kcyBhbmQgc2lsZW50bHkgZHJvcHBlZCBvblxuICogb3RoZXJzLiBgZGVzY3JpcHRpb25gIGluIHBhcnRpY3VsYXIgaXMgbm90IGp1c3QgU0VPIG1ldGFkYXRhIOKAlCBpdCBpcyB0aGUgbGluZSB0aGUgT0cgY2FyZCByZW5kZXJzIHVuZGVyXG4gKiB0aGUgdGl0bGUsIHNvIGEgcGFnZSBraW5kIHRoYXQgc2tpcHBlZCBpdCBwcm9kdWNlZCBhIHRpdGxlLW9ubHkgY2FyZCBuZXh0IHRvIGZ1bGx5IHBvcHVsYXRlZCBvbmVzLlxuICpcbiAqIEBwYXJhbSBmcm9udE1hdHRlciAtIFRoZSBwYWdlJ3MgZnJvbnRtYXR0ZXIgZmllbGRzLlxuICogQHJldHVybnMgVGhlIGZyb250bWF0dGVyIGxpbmVzLCB0aHJvdWdoIHRoZSBjbG9zaW5nIGAtLS1gIGFuZCBpdHMgYmxhbmsgbGluZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlbmRlckZyb250TWF0dGVyKGZyb250TWF0dGVyOiBQYWdlRnJvbnRNYXR0ZXIpOiBzdHJpbmdbXSB7XG4gIHJldHVybiBbXG4gICAgJy0tLScsXG4gICAgYHRpdGxlOiBcIiR7ZXNjYXBlWWFtbChmcm9udE1hdHRlci50aXRsZSl9XCJgLFxuICAgIGBzbHVnOiBcIiR7ZnJvbnRNYXR0ZXIuc2x1Z31cImAsXG4gICAgLi4uKGZyb250TWF0dGVyLmRlc2NyaXB0aW9uID8gW2BkZXNjcmlwdGlvbjogXCIke2VzY2FwZVlhbWwoc3RyaXBNYXJrZG93bihmcm9udE1hdHRlci5kZXNjcmlwdGlvbikpfVwiYF0gOiBbXSksXG4gICAgLi4uKGZyb250TWF0dGVyLnNpZ25hdHVyZSA/IFtgc2lnbmF0dXJlOiBcIiR7ZXNjYXBlWWFtbCh0cnVuY2F0ZVNpZ25hdHVyZShmcm9udE1hdHRlci5zaWduYXR1cmUpKX1cImBdIDogW10pLFxuICAgICdlZGl0VXJsOiBmYWxzZScsXG4gICAgJ3NpZGViYXI6JyxcbiAgICBgICBsYWJlbDogXCIke2VzY2FwZVlhbWwoZnJvbnRNYXR0ZXIuc2lkZWJhckxhYmVsKX1cImAsXG4gICAgJy0tLScsXG4gICAgJydcbiAgXTtcbn1cblxuLyoqXG4gKiBSZW5kZXJzIGEgZnVuY3Rpb24ncyBzaWduYXR1cmUsIHBhcmFtZXRlcnMsIHJldHVybiB2YWx1ZSBhbmQgZXhhbXBsZXMuXG4gKlxuICogQHBhcmFtIGxpbmVzIC0gVGhlIHBhZ2UgbGluZXMgdG8gYXBwZW5kIHRvLlxuICogQHBhcmFtIGluZm8gLSBUaGUgZG9jdW1lbnRlZCB0eXBlLlxuICogQHBhcmFtIGFsbFR5cGVzIC0gRXZlcnkgZG9jdW1lbnRlZCB0eXBlLCBrZXllZCBieSBgJHtuYW1lc3BhY2V9IyR7bmFtZX1gLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVuZGVyRnVuY3Rpb25QYWdlKGxpbmVzOiBzdHJpbmdbXSwgaW5mbzogVHlwZUluZm8sIGFsbFR5cGVzOiBNYXA8c3RyaW5nLCBUeXBlSW5mbz4pOiB2b2lkIHtcbiAgY29uc3QgJGZ1bmN0aW9uID0gaW5mby5tZXRob2RzWzBdO1xuICBpZiAoISRmdW5jdGlvbikge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGxpbmVzLnB1c2goJyoqU2lnbmF0dXJlOioqJywgJycsICdgYGB0cycsIGBmdW5jdGlvbiAkeyRmdW5jdGlvbi5zaWduYXR1cmV9OiAkeyRmdW5jdGlvbi5yZXR1cm5UeXBlfWAsICdgYGAnLCAnJyk7XG5cbiAgaWYgKCRmdW5jdGlvbi5wYXJhbWV0ZXJzLmxlbmd0aCA+IDApIHtcbiAgICBsaW5lcy5wdXNoKCcqKlBhcmFtZXRlcnM6KionLCAnJywgJ3wgUGFyYW1ldGVyIHwgVHlwZSB8IERlc2NyaXB0aW9uIHwnLCAnfCA6LS0gfCA6LS0gfCA6LS0gfCcpO1xuICAgIGZvciAoY29uc3QgcGFyYW1ldGVyIG9mICRmdW5jdGlvbi5wYXJhbWV0ZXJzKSB7XG4gICAgICBsaW5lcy5wdXNoKFxuICAgICAgICBgfCBcXGAke3BhcmFtZXRlci5uYW1lfVxcYCB8ICR7ZXNjYXBlTWFya2Rvd24oZXNjYXBlTWR4QW5nbGVCcmFja2V0cyhyZW5kZXJUeXBlV2l0aExpbmtzKHBhcmFtZXRlci50eXBlLCBhbGxUeXBlcywgaW5mby5uYW1lLCBpbmZvLm5hbWVzcGFjZSkpKX0gfCAke2VzY2FwZU1hcmtkb3duKHJlc29sdmVMaW5rcyhwYXJhbWV0ZXIuZGVzY3JpcHRpb24sIGFsbFR5cGVzLCBpbmZvLm5hbWVzcGFjZSkpfSB8YFxuICAgICAgKTtcbiAgICB9XG4gICAgbGluZXMucHVzaCgnJyk7XG4gIH1cblxuICBjb25zdCByZXR1cm5EZXNjID0gJGZ1bmN0aW9uLnJldHVybkRlc2NyaXB0aW9uID8gYCDigJQgJHtlc2NhcGVNZHhBbmdsZUJyYWNrZXRzKHJlc29sdmVMaW5rcygkZnVuY3Rpb24ucmV0dXJuRGVzY3JpcHRpb24sIGFsbFR5cGVzLCBpbmZvLm5hbWVzcGFjZSkpfWAgOiAnJztcbiAgbGluZXMucHVzaChgKipSZXR1cm5zOioqICR7ZXNjYXBlTWR4QW5nbGVCcmFja2V0cyhyZW5kZXJUeXBlV2l0aExpbmtzKCRmdW5jdGlvbi5yZXR1cm5UeXBlLCBhbGxUeXBlcywgaW5mby5uYW1lLCBpbmZvLm5hbWVzcGFjZSkpfSR7cmV0dXJuRGVzY31gLCAnJyk7XG5cbiAgZm9yIChjb25zdCBleGFtcGxlIG9mICRmdW5jdGlvbi5leGFtcGxlcykge1xuICAgIGxpbmVzLnB1c2goJyoqRXhhbXBsZToqKicsICcnLCByZW5kZXJFeGFtcGxlTWR4KGV4YW1wbGUsIGFsbFR5cGVzLCBpbmZvLm5hbWVzcGFjZSksICcnKTtcbiAgfVxufVxuXG4vKipcbiAqIFJlbmRlcnMgb25lIG1ldGhvZCBvdmVybG9hZC5cbiAqXG4gKiBAcGFyYW0gbGluZXMgLSBUaGUgcGFnZSBsaW5lcyB0byBhcHBlbmQgdG8uXG4gKiBAcGFyYW0gb3ZlcmxvYWQgLSBUaGUgb3ZlcmxvYWQuXG4gKiBAcGFyYW0gdHlwZU5hbWUgLSBUaGUgbmFtZSBvZiB0aGUgdHlwZSB0aGUgbWV0aG9kIGJlbG9uZ3MgdG8uXG4gKiBAcGFyYW0gbmFtZXNwYWNlIC0gVGhlIG5hbWVzcGFjZSBvZiB0aGUgdHlwZSB0aGUgbWV0aG9kIGJlbG9uZ3MgdG8uXG4gKiBAcGFyYW0gYWxsVHlwZXMgLSBFdmVyeSBkb2N1bWVudGVkIHR5cGUsIGtleWVkIGJ5IGAke25hbWVzcGFjZX0jJHtuYW1lfWAuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZW5kZXJNZXRob2RPdmVybG9hZE1keChsaW5lczogc3RyaW5nW10sIG92ZXJsb2FkOiBNZW1iZXJJbmZvLCB0eXBlTmFtZTogc3RyaW5nLCBuYW1lc3BhY2U6IHN0cmluZywgYWxsVHlwZXM6IE1hcDxzdHJpbmcsIFR5cGVJbmZvPik6IHZvaWQge1xuICBjb25zdCBzaWcgPSBgJHtvdmVybG9hZC5zaWduYXR1cmV9OiAke292ZXJsb2FkLnJldHVyblR5cGV9YDtcbiAgY29uc3Qgc3RhdGljQXR0cmlidXRlID0gb3ZlcmxvYWQuaXNTdGF0aWMgPyAnIGlzU3RhdGljPXt0cnVlfScgOiAnJztcbiAgY29uc3QgZGVzY0F0dHJpYnV0ZSA9IG92ZXJsb2FkLmRlc2NyaXB0aW9uID8gYCBkZXNjcmlwdGlvbj1cIiR7ZXNjYXBlSnN4QXR0cmlidXRlKG1hcmtkb3duVG9IdG1sKHJlc29sdmVMaW5rcyhvdmVybG9hZC5kZXNjcmlwdGlvbiwgYWxsVHlwZXMsIG5hbWVzcGFjZSkpKX1cImAgOiAnJztcbiAgY29uc3QgcmVtYXJrc0F0dHJpYnV0ZSA9IG92ZXJsb2FkLnJlbWFya3MgPyBgIHJlbWFya3M9XCIke2VzY2FwZUpzeEF0dHJpYnV0ZShtYXJrZG93blRvSHRtbChyZXNvbHZlTGlua3Mob3ZlcmxvYWQucmVtYXJrcywgYWxsVHlwZXMsIG5hbWVzcGFjZSkpKX1cImAgOiAnJztcbiAgY29uc3Qgc2luY2VBdHRyaWJ1dGUgPSBvdmVybG9hZC5zaW5jZSA/IGAgc2luY2U9XCIke2VzY2FwZUpzeEF0dHJpYnV0ZShvdmVybG9hZC5zaW5jZSl9XCJgIDogJyc7XG4gIGNvbnN0IHJldHVyblR5cGVBdHRyaWJ1dGUgPSBgIHJldHVyblR5cGU9XCIke2VzY2FwZUpzeEF0dHJpYnV0ZShtYXJrZG93blRvSHRtbChyZW5kZXJUeXBlV2l0aExpbmtzKG92ZXJsb2FkLnJldHVyblR5cGUsIGFsbFR5cGVzLCB0eXBlTmFtZSwgbmFtZXNwYWNlKSkpfVwiYDtcbiAgY29uc3QgcmV0dXJuRGVzY0F0dHJpYnV0ZSA9IG92ZXJsb2FkLnJldHVybkRlc2NyaXB0aW9uXG4gICAgPyBgIHJldHVybkRlc2NyaXB0aW9uPVwiJHtlc2NhcGVKc3hBdHRyaWJ1dGUobWFya2Rvd25Ub0h0bWwocmVzb2x2ZUxpbmtzKG92ZXJsb2FkLnJldHVybkRlc2NyaXB0aW9uLCBhbGxUeXBlcywgbmFtZXNwYWNlKSkpfVwiYFxuICAgIDogJyc7XG4gIGNvbnN0IGV4YW1wbGVzQXR0cmlidXRlID0gb3ZlcmxvYWQuZXhhbXBsZXMubGVuZ3RoID4gMCA/IGAgZXhhbXBsZXM9eyR7SlNPTi5zdHJpbmdpZnkob3ZlcmxvYWQuZXhhbXBsZXMpfX1gIDogJyc7XG5cbiAgY29uc3QgcGFyYW1zID0gb3ZlcmxvYWQucGFyYW1ldGVycy5tYXAoKHApID0+ICh7XG4gICAgZGVzY3JpcHRpb246IG1hcmtkb3duVG9IdG1sKHAuZGVzY3JpcHRpb24gfHwgKHAubmFtZS5lbmRzV2l0aCgnPycpID8gJyooT3B0aW9uYWwpKicgOiAnJykpLFxuICAgIG5hbWU6IHAubmFtZSxcbiAgICB0eXBlOiBtYXJrZG93blRvSHRtbChyZW5kZXJUeXBlV2l0aExpbmtzKHAudHlwZSwgYWxsVHlwZXMsIHR5cGVOYW1lLCBuYW1lc3BhY2UpKVxuICB9KSk7XG4gIGNvbnN0IHBhcmFtc0F0dHJpYnV0ZSA9IHBhcmFtcy5sZW5ndGggPiAwID8gYCBwYXJhbWV0ZXJzPXske0pTT04uc3RyaW5naWZ5KHBhcmFtcyl9fWAgOiAnJztcblxuICBsaW5lcy5wdXNoKFxuICAgIGA8TWVtYmVyRGV0YWlsJHtzdGF0aWNBdHRyaWJ1dGV9IHNpZ25hdHVyZT1cIiR7ZXNjYXBlSnN4QXR0cmlidXRlKHNpZyl9XCIke2Rlc2NBdHRyaWJ1dGV9JHtyZW1hcmtzQXR0cmlidXRlfSR7c2luY2VBdHRyaWJ1dGV9JHtyZXR1cm5UeXBlQXR0cmlidXRlfSR7cmV0dXJuRGVzY0F0dHJpYnV0ZX0ke3BhcmFtc0F0dHJpYnV0ZX0ke2V4YW1wbGVzQXR0cmlidXRlfSAvPmAsXG4gICAgJydcbiAgKTtcbn1cblxuLyoqXG4gKiBSZW5kZXJzIGEgdHlwZSdzIG1ldGhvZCB0YWJsZS5cbiAqXG4gKiBAcGFyYW0gbGluZXMgLSBUaGUgcGFnZSBsaW5lcyB0byBhcHBlbmQgdG8uXG4gKiBAcGFyYW0gaW5mbyAtIFRoZSBkb2N1bWVudGVkIHR5cGUuXG4gKiBAcGFyYW0gYWxsVHlwZXMgLSBFdmVyeSBkb2N1bWVudGVkIHR5cGUsIGtleWVkIGJ5IGAke25hbWVzcGFjZX0jJHtuYW1lfWAuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZW5kZXJNZXRob2RUYWJsZU1keChsaW5lczogc3RyaW5nW10sIGluZm86IFR5cGVJbmZvLCBhbGxUeXBlczogTWFwPHN0cmluZywgVHlwZUluZm8+KTogdm9pZCB7XG4gIGNvbnN0IG1ldGhvZHMgPSBbLi4uaW5mby5tZXRob2RzXS5zb3J0KChhLCBiKSA9PiB7XG4gICAgaWYgKGEuaXNTdGF0aWMgIT09IGIuaXNTdGF0aWMpIHtcbiAgICAgIHJldHVybiBhLmlzU3RhdGljID8gMSA6IC0xO1xuICAgIH1cbiAgICByZXR1cm4gYS5uYW1lLmxvY2FsZUNvbXBhcmUoYi5uYW1lKTtcbiAgfSk7XG4gIGlmIChtZXRob2RzLmxlbmd0aCA9PT0gMCkge1xuICAgIHJldHVybjtcbiAgfVxuICBsaW5lcy5wdXNoKCc8TWV0aG9kVGFibGUgcm93cz17WycpO1xuICBmb3IgKGNvbnN0IG1ldGhvZCBvZiBtZXRob2RzKSB7XG4gICAgY29uc3QgZGVzYyA9IGVzY2FwZUpzU3RyaW5nKG1hcmtkb3duVG9IdG1sKHJlc29sdmVMaW5rcyhtZXRob2QuZGVzY3JpcHRpb24sIGFsbFR5cGVzLCBpbmZvLm5hbWVzcGFjZSkpKTtcbiAgICBjb25zdCBzdGF0aWNQcmVmaXggPSBtZXRob2QuaXNTdGF0aWMgPyAnc3RhdGljICcgOiAnJztcbiAgICBjb25zdCBzaG9ydFBhcmFtcyA9IG1ldGhvZC5wYXJhbWV0ZXJzLm1hcCgocCwgaW5kZXgpID0+IHtcbiAgICAgIHJldHVybiBpbmRleCA9PT0gMCAmJiBFVkVOVF9NRVRIT0RTLmhhcyhtZXRob2QubmFtZSkgJiYgKHAudHlwZS5zdGFydHNXaXRoKCdcIicpIHx8IHAudHlwZS5zdGFydHNXaXRoKCdcXCcnKSkgPyBwLnR5cGUucmVwbGFjZUFsbCgnXCInLCAnXFwnJykgOiBwLm5hbWU7XG4gICAgfSkuam9pbignLCAnKTtcbiAgICBjb25zdCBzaG9ydFNpZyA9IGAke3N0YXRpY1ByZWZpeH0ke21ldGhvZC5uYW1lfSgke3Nob3J0UGFyYW1zfSlgO1xuICAgIGNvbnN0IHNpZyA9IGVzY2FwZUpzU3RyaW5nKHNob3J0U2lnKTtcbiAgICBjb25zdCBzbHVnID0gb3ZlcmxvYWRSb3V0ZVNlZ21lbnQobWV0aG9kLm92ZXJsb2FkS2V5KTtcbiAgICBjb25zdCByZXR1cm5UeXBlID0gbWFya2Rvd25Ub0h0bWwocmVuZGVyVHlwZVdpdGhMaW5rcyhtZXRob2QucmV0dXJuVHlwZSwgYWxsVHlwZXMsIGluZm8ubmFtZSwgaW5mby5uYW1lc3BhY2UpKTtcbiAgICBjb25zdCBpbmhlcml0ZWRBdHRyaWJ1dGUgPSBtZXRob2QuaW5oZXJpdGVkRnJvbVxuICAgICAgPyBgLCBpbmhlcml0ZWRGcm9tOiBcIiR7ZXNjYXBlSnNTdHJpbmcobWFya2Rvd25Ub0h0bWwodHlwZUxpbmsobWV0aG9kLmluaGVyaXRlZEZyb20sIGFsbFR5cGVzLCBpbmZvLm5hbWVzcGFjZSkpKX1cImBcbiAgICAgIDogJyc7XG4gICAgY29uc3QgaHJlZiA9IG1lbWJlckhyZWYoc2x1ZywgbWV0aG9kLmluaGVyaXRlZEZyb20sIGFsbFR5cGVzLCBpbmZvLm5hbWVzcGFjZSk7XG4gICAgbGluZXMucHVzaChcbiAgICAgIGAgIHsgc2lnbmF0dXJlOiBcIiR7c2lnfVwiLCBocmVmOiBcIiR7ZXNjYXBlSnNTdHJpbmcoaHJlZil9XCIsIHJldHVybnM6IFwiJHtlc2NhcGVKc1N0cmluZyhyZXR1cm5UeXBlKX1cIiwgZGVzY3JpcHRpb246IFwiJHtkZXNjfVwiJHtpbmhlcml0ZWRBdHRyaWJ1dGV9IH0sYFxuICAgICk7XG4gIH1cbiAgbGluZXMucHVzaCgnXX0gLz4nLCAnJyk7XG59XG5cbi8qKlxuICogUmVuZGVycyBhIHR5cGUncyBwcm9wZXJ0eSB0YWJsZS5cbiAqXG4gKiBAcGFyYW0gbGluZXMgLSBUaGUgcGFnZSBsaW5lcyB0byBhcHBlbmQgdG8uXG4gKiBAcGFyYW0gaW5mbyAtIFRoZSBkb2N1bWVudGVkIHR5cGUuXG4gKiBAcGFyYW0gYWxsVHlwZXMgLSBFdmVyeSBkb2N1bWVudGVkIHR5cGUsIGtleWVkIGJ5IGAke25hbWVzcGFjZX0jJHtuYW1lfWAuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZW5kZXJQcm9wZXJ0eVRhYmxlTWR4KGxpbmVzOiBzdHJpbmdbXSwgaW5mbzogVHlwZUluZm8sIGFsbFR5cGVzOiBNYXA8c3RyaW5nLCBUeXBlSW5mbz4pOiB2b2lkIHtcbiAgY29uc3QgcHJvcGVydGllcyA9IGluZm8ucHJvcGVydGllcztcbiAgaWYgKHByb3BlcnRpZXMubGVuZ3RoID09PSAwKSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIGxpbmVzLnB1c2goJzxQcm9wZXJ0eVRhYmxlIHJvd3M9e1snKTtcbiAgZm9yIChjb25zdCBwcm9wZXJ0eSBvZiBwcm9wZXJ0aWVzKSB7XG4gICAgY29uc3QgZGVzYyA9IGVzY2FwZUpzU3RyaW5nKG1hcmtkb3duVG9IdG1sKHJlc29sdmVMaW5rcyhwcm9wZXJ0eS5kZXNjcmlwdGlvbiwgYWxsVHlwZXMsIGluZm8ubmFtZXNwYWNlKSkpO1xuICAgIGNvbnN0IHR5cGUgPSBtYXJrZG93blRvSHRtbChyZW5kZXJUeXBlV2l0aExpbmtzKHByb3BlcnR5LnR5cGUsIGFsbFR5cGVzLCBpbmZvLm5hbWUsIGluZm8ubmFtZXNwYWNlKSk7XG4gICAgY29uc3QgaW5oZXJpdGVkQXR0cmlidXRlID0gcHJvcGVydHkuaW5oZXJpdGVkRnJvbVxuICAgICAgPyBgLCBpbmhlcml0ZWRGcm9tOiBcIiR7ZXNjYXBlSnNTdHJpbmcobWFya2Rvd25Ub0h0bWwodHlwZUxpbmsocHJvcGVydHkuaW5oZXJpdGVkRnJvbSwgYWxsVHlwZXMsIGluZm8ubmFtZXNwYWNlKSkpfVwiYFxuICAgICAgOiAnJztcbiAgICBjb25zdCBocmVmID0gbWVtYmVySHJlZihtZW1iZXJSb3V0ZVNlZ21lbnQocHJvcGVydHkubmFtZSksIHByb3BlcnR5LmluaGVyaXRlZEZyb20sIGFsbFR5cGVzLCBpbmZvLm5hbWVzcGFjZSk7XG4gICAgbGluZXMucHVzaChcbiAgICAgIGAgIHsgbmFtZTogXCIke2VzY2FwZUpzU3RyaW5nKHByb3BlcnR5Lm5hbWUpfVwiLCBocmVmOiBcIiR7ZXNjYXBlSnNTdHJpbmcoaHJlZil9XCIsIHR5cGU6IFwiJHtlc2NhcGVKc1N0cmluZyh0eXBlKX1cIiwgZGVzY3JpcHRpb246IFwiJHtkZXNjfVwiJHtpbmhlcml0ZWRBdHRyaWJ1dGV9IH0sYFxuICAgICk7XG4gIH1cbiAgbGluZXMucHVzaCgnXX0gLz4nLCAnJyk7XG59XG5cbi8qKlxuICogUmVuZGVycyBhIHR5cGUgYWxpYXMncyBzaWduYXR1cmUuXG4gKlxuICogQHBhcmFtIGxpbmVzIC0gVGhlIHBhZ2UgbGluZXMgdG8gYXBwZW5kIHRvLlxuICogQHBhcmFtIGluZm8gLSBUaGUgZG9jdW1lbnRlZCB0eXBlLlxuICogQHBhcmFtIGFsbFR5cGVzIC0gRXZlcnkgZG9jdW1lbnRlZCB0eXBlLCBrZXllZCBieSBgJHtuYW1lc3BhY2V9IyR7bmFtZX1gLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVuZGVyVHlwZUFsaWFzUGFnZShsaW5lczogc3RyaW5nW10sIGluZm86IFR5cGVJbmZvLCBhbGxUeXBlczogTWFwPHN0cmluZywgVHlwZUluZm8+KTogdm9pZCB7XG4gIGNvbnN0IHR5cGVQYXJhbXNBdHRyaWJ1dGUgPSBpbmZvLnR5cGVQYXJhbWV0ZXJzLmxlbmd0aCA+IDAgPyBgIHR5cGVQYXJhbXM9eyR7SlNPTi5zdHJpbmdpZnkoaW5mby50eXBlUGFyYW1ldGVycyl9fWAgOiAnJztcbiAgbGluZXMucHVzaChgPFR5cGVTaWduYXR1cmUga2luZD1cInR5cGVcIiBuYW1lPVwiJHtpbmZvLm5hbWV9XCIke3R5cGVQYXJhbXNBdHRyaWJ1dGV9IC8+YCwgJycpO1xuXG4gIGNvbnN0IHJocyA9IGluZm8udHlwZUFsaWFzVGV4dCA/PyAndW5rbm93bic7XG4gIGxpbmVzLnB1c2goXG4gICAgJyoqU2lnbmF0dXJlOioqJyxcbiAgICAnJyxcbiAgICAnYGBgdHMnLFxuICAgIGB0eXBlICR7Z2V0RGlzcGxheU5hbWUoaW5mby5uYW1lLCBpbmZvKX0gPSAke3Joc31gLFxuICAgICdgYGAnLFxuICAgICcnLFxuICAgIGAqKlR5cGU6KiogJHtlc2NhcGVNZHhCcmFjZXMoZXNjYXBlTWR4QW5nbGVCcmFja2V0cyhyZW5kZXJUeXBlV2l0aExpbmtzKHJocywgYWxsVHlwZXMsIGluZm8ubmFtZSwgaW5mby5uYW1lc3BhY2UpKSl9YCxcbiAgICAnJ1xuICApO1xufVxuXG4vKipcbiAqIFJlbmRlcnMgYSB2YXJpYWJsZSdzIGRlY2xhcmF0aW9uIGFuZCB0eXBlLlxuICpcbiAqIEBwYXJhbSBsaW5lcyAtIFRoZSBwYWdlIGxpbmVzIHRvIGFwcGVuZCB0by5cbiAqIEBwYXJhbSBuYW1lIC0gVGhlIHR5cGUncyBuYW1lLlxuICogQHBhcmFtIGluZm8gLSBUaGUgZG9jdW1lbnRlZCB0eXBlLlxuICogQHBhcmFtIGFsbFR5cGVzIC0gRXZlcnkgZG9jdW1lbnRlZCB0eXBlLCBrZXllZCBieSBgJHtuYW1lc3BhY2V9IyR7bmFtZX1gLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVuZGVyVmFyaWFibGVQYWdlKGxpbmVzOiBzdHJpbmdbXSwgbmFtZTogc3RyaW5nLCBpbmZvOiBUeXBlSW5mbywgYWxsVHlwZXM6IE1hcDxzdHJpbmcsIFR5cGVJbmZvPik6IHZvaWQge1xuICBjb25zdCBrZXl3b3JkID0gaW5mby52YXJpYWJsZUtleXdvcmQgPz8gJ2xldCc7XG4gIGNvbnN0IHZhcmlhYmxlVHlwZSA9IGluZm8udmFyaWFibGVUeXBlID8/ICd1bmtub3duJztcbiAgbGluZXMucHVzaChcbiAgICAnKipTaWduYXR1cmU6KionLFxuICAgICcnLFxuICAgICdgYGB0cycsXG4gICAgYCR7a2V5d29yZH0gJHtuYW1lfTogJHt2YXJpYWJsZVR5cGV9YCxcbiAgICAnYGBgJyxcbiAgICAnJyxcbiAgICBgKipUeXBlOioqICR7ZXNjYXBlTWR4QnJhY2VzKGVzY2FwZU1keEFuZ2xlQnJhY2tldHMocmVuZGVyVHlwZVdpdGhMaW5rcyh2YXJpYWJsZVR5cGUsIGFsbFR5cGVzLCBuYW1lLCBpbmZvLm5hbWVzcGFjZSkpKX1gLFxuICAgICcnXG4gICk7XG59XG5cbi8qKlxuICogQ29udmVydHMgYSBuYW1lc3BhY2UgdHJlZSBub2RlIGludG8gYSBzaWRlYmFyIGdyb3VwLlxuICpcbiAqIEBwYXJhbSBub2RlIC0gVGhlIG5vZGUuXG4gKiBAcGFyYW0gbGFiZWwgLSBUaGUgZ3JvdXAncyBsYWJlbC5cbiAqIEByZXR1cm5zIFRoZSBzaWRlYmFyIGdyb3VwLlxuICovXG5leHBvcnQgZnVuY3Rpb24gc2lkZWJhclRyZWVUb0VudHJpZXMobm9kZTogU2lkZWJhclRyZWVOb2RlLCBsYWJlbDogc3RyaW5nKTogU2lkZWJhckVudHJ5IHtcbiAgY29uc3QgaXRlbXM6IChTaWRlYmFyRW50cnkgfCBTaWRlYmFyTGluaylbXSA9IFtdO1xuXG4gIC8vIENoaWxkIGRpcmVjdG9yeSBncm91cHMgZmlyc3QgKGJlZm9yZSB0aGlzIG1vZHVsZSdzIG93biBwYWdlcylcbiAgY29uc3Qgc29ydGVkQ2hpbGRyZW4gPSBbLi4ubm9kZS5jaGlsZHJlbl0uc29ydCgoW2FdLCBbYl0pID0+IGEubG9jYWxlQ29tcGFyZShiKSk7XG4gIGZvciAoY29uc3QgW2NoaWxkTmFtZSwgY2hpbGRdIG9mIHNvcnRlZENoaWxkcmVuKSB7XG4gICAgaXRlbXMucHVzaChzaWRlYmFyVHJlZVRvRW50cmllcyhjaGlsZCwgY2hpbGROYW1lKSk7XG4gIH1cblxuICAvLyBUaGlzIG1vZHVsZSdzIG93biBvdmVydmlldyBwYWdlICsgdHlwZS9mdW5jdGlvbiBwYWdlcyAoaW5kaXZpZHVhbCBtZW1iZXJzIGFyZSBub3QgbGlzdGVkKS5cbiAgLy8gU2lkZWJhciBgbGlua2AgZmllbGRzIG11c3QgTk9UIGVtYmVkIEJBU0VfUEFUSDogU3RhcmxpZ2h0IHByZXBlbmRzIHRoZSBjb25maWcgYGJhc2VgIHRvIGV2ZXJ5XG4gIC8vIHNpZGViYXIgbGluayBpdHNlbGYsIHNvIGluY2x1ZGluZyBpdCBoZXJlIHdvdWxkIGRvdWJsZSB0aGUgYmFzZSAoZS5nLiBgL2Jhc2UvYmFzZS9hcGkvLi4uYCDihpIgNDA0KS5cbiAgLy8gVGhpcyBkaWZmZXJzIGZyb20gaW4tY29udGVudCBsaW5rcywgd2hpY2ggYXJlIHJhdyBhbmNob3JzIHRoYXQgU3RhcmxpZ2h0IGRvZXMgbm90IGJhc2UtcHJlcGVuZC5cbiAgaWYgKG5vZGUudHlwZXMubGVuZ3RoID4gMCkge1xuICAgIGNvbnN0IHsgbmFtZXNwYWNlIH0gPSBlbnN1cmVOb25OdWxsYWJsZShub2RlLnR5cGVzWzBdKTtcbiAgICBpdGVtcy5wdXNoKHsgbGFiZWw6ICdPdmVydmlldycsIGxpbms6IGAvYXBpLyR7bmFtZXNwYWNlfS9gIH0pO1xuICAgIGNvbnN0IHNvcnRlZFR5cGVzID0gWy4uLm5vZGUudHlwZXNdLnNvcnQoKGEsIGIpID0+IGEubmFtZS5sb2NhbGVDb21wYXJlKGIubmFtZSkpO1xuICAgIGZvciAoY29uc3QgdCBvZiBzb3J0ZWRUeXBlcykge1xuICAgICAgaXRlbXMucHVzaCh7IGxhYmVsOiB0Lm5hbWUsIGxpbms6IGAvYXBpLyR7dC5uYW1lc3BhY2V9LyR7dG9UeXBlUm91dGVTZWdtZW50KHQubmFtZXNwYWNlLCB0Lm5hbWUpfS9gIH0pO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiB7IGNvbGxhcHNlZDogdHJ1ZSwgaXRlbXMsIGxhYmVsIH07XG59XG5cbi8vIFNlcnZlcyBib3RoIGFzIHRoZSByb290IEFQSSBwYWdlJ3MgcHJvc2UgYW5kIChzdHJpcHBlZCkgYXMgaXRzIGBkZXNjcmlwdGlvbmAgZnJvbnRtYXR0ZXIuXG4vLyBTaGFyaW5nIG9uZSBmdW5jdGlvbiBrZWVwcyB0aGUgcGFnZSBhbmQgaXRzIE9HIGNhcmQgZnJvbSBkcmlmdGluZyBhcGFydC5cbmZ1bmN0aW9uIGdldEFwaUluZGV4SW50cm8obmFtZXNwYWNlczogcmVhZG9ubHkgc3RyaW5nW10pOiBzdHJpbmcge1xuICBjb25zdCB7IHBhY2thZ2VOYW1lIH0gPSBnZXRBcGlEb2NTZXR0aW5ncygpO1xuICBjb25zdCBbZXhhbXBsZU5hbWVzcGFjZSA9ICdtb2R1bGUnXSA9IG5hbWVzcGFjZXM7XG4gIHJldHVybiBgVGhlIGNvbXBsZXRlIEFQSSByZWZlcmVuY2UgZm9yIFxcYCR7cGFja2FnZU5hbWV9XFxgLCBnZW5lcmF0ZWQgZnJvbSBpdHMgVFNEb2MuIGBcbiAgICArIGBFYWNoIG1vZHVsZSBiZWxvdyBtYXBzIHRvIGFuIGltcG9ydCBzdWJwYXRoIChlLmcuIHRoZSBcXGAke2V4YW1wbGVOYW1lc3BhY2V9XFxgIG1vZHVsZSBpcyBcXGAke3BhY2thZ2VOYW1lfS8ke2V4YW1wbGVOYW1lc3BhY2V9XFxgKS5gO1xufVxuXG5mdW5jdGlvbiBnZXRDb21wb25lbnRJbXBvcnRzKGNvbXBvbmVudE5hbWVzOiByZWFkb25seSBzdHJpbmdbXSk6IHN0cmluZ1tdIHtcbiAgcmV0dXJuIGNvbXBvbmVudE5hbWVzLm1hcCgoY29tcG9uZW50TmFtZSkgPT4gYGltcG9ydCAke2NvbXBvbmVudE5hbWV9IGZyb20gXCIke0FQSV9DT01QT05FTlRTX0lNUE9SVF9QUkVGSVh9LyR7Y29tcG9uZW50TmFtZX0uYXN0cm9cIjtgKTtcbn1cblxuZnVuY3Rpb24gcmVuZGVyTmFtZXNwYWNlVGFibGUoXG4gIGxpbmVzOiBzdHJpbmdbXSxcbiAgaGVhZGluZzogc3RyaW5nLFxuICBjb2x1bW5MYWJlbDogc3RyaW5nLFxuICBlbnRyaWVzOiBUeXBlSW5mb1tdLFxuICBhbGxUeXBlczogTWFwPHN0cmluZywgVHlwZUluZm8+LFxuICBuYW1lc3BhY2U6IHN0cmluZ1xuKTogdm9pZCB7XG4gIGlmIChlbnRyaWVzLmxlbmd0aCA9PT0gMCkge1xuICAgIHJldHVybjtcbiAgfVxuICBjb25zdCBzb3J0ZWQgPSBbLi4uZW50cmllc10uc29ydCgoYSwgYikgPT4gYS5uYW1lLmxvY2FsZUNvbXBhcmUoYi5uYW1lKSk7XG4gIGxpbmVzLnB1c2goYCMjICR7aGVhZGluZ31gLCAnJywgYHwgJHtjb2x1bW5MYWJlbH0gfCBEZXNjcmlwdGlvbiB8YCwgJ3wgOi0tIHwgOi0tIHwnKTtcbiAgZm9yIChjb25zdCBlbnRyeSBvZiBzb3J0ZWQpIHtcbiAgICBsaW5lcy5wdXNoKGB8IFske2VudHJ5Lm5hbWV9XSguLyR7dG9UeXBlUm91dGVTZWdtZW50KGVudHJ5Lm5hbWVzcGFjZSwgZW50cnkubmFtZSl9LykgfCAke2VzY2FwZU1hcmtkb3duKHJlc29sdmVMaW5rcyhlbnRyeS5kZXNjcmlwdGlvbiwgYWxsVHlwZXMsIG5hbWVzcGFjZSkpfSB8YCk7XG4gIH1cbiAgbGluZXMucHVzaCgnJyk7XG59XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFPQSxxQkFBdUM7QUFDdkMseUJBQWtDO0FBQ2xDLHNCQUEwQjtBQUMxQix1QkFBcUI7QUFZckIsK0JBQThCO0FBQzlCLG9DQVdPO0FBQ1AsOEJBQWtDO0FBQ2xDLGdDQWlCTztBQUNQLDhCQUE2QztBQUU3QyxNQUFNLGNBQWM7QUFRcEIsZUFBc0Isd0JBQ3BCLGNBQ0EsVUFDZTtBQUNmLFFBQU0sWUFBWSwwQkFBMEIsY0FBYyxRQUFRO0FBRWxFLGFBQVcsQ0FBQyxLQUFLLEVBQUUsU0FBUyxTQUFTLENBQUMsS0FBSyxjQUFjO0FBQ3ZELFVBQU0sZ0JBQWdCLFVBQVUsSUFBSSxHQUFHLEtBQUssQ0FBQztBQUM3QyxVQUFNLFFBQVEsQ0FBQyxPQUFP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
|
|
561
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9kb2NzLXNpdGUvYXBpLWRvYy1wYWdlLWdlbmVyYXRpb24udHMiXSwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAZmlsZVxuICpcbiAqIE1EWCBwYWdlICsgc2lkZWJhciBlbWlzc2lvbjogcmVuZGVycyBtb2R1bGUgaW5kZXggcGFnZXMsIHBlci10eXBlIG92ZXJ2aWV3IHBhZ2VzLCBwZXItbWVtYmVyIHBhZ2VzLFxuICogYmFja2xpbmtzLCBhbmQgdGhlIFN0YXJsaWdodCBzaWRlYmFyIEpTT04uXG4gKi9cblxuaW1wb3J0IHsgZ2V0TWFuZGF0b3J5TmFtZWRHcm91cCB9IGZyb20gJ0BtbmFvdW1vdi90eXBlc2NyaXB0LWxpYi9yZWctZXhwJztcbmltcG9ydCB7IGVuc3VyZU5vbk51bGxhYmxlIH0gZnJvbSAnQG1uYW91bW92L3R5cGVzY3JpcHQtbGliL3R5cGUtZ3VhcmRzJztcbmltcG9ydCB7IHdyaXRlRmlsZSB9IGZyb20gJ25vZGU6ZnMvcHJvbWlzZXMnO1xuaW1wb3J0IHsgam9pbiB9IGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCB0eXBlIHtcbiAgTWVtYmVySW5mbyxcbiAgUGFnZUNvbnRlbnQsXG4gIFBhZ2VGcm9udE1hdHRlcixcbiAgU2lkZWJhckVudHJ5LFxuICBTaWRlYmFyTGluayxcbiAgU2lkZWJhclRyZWVOb2RlLFxuICBUeXBlSW5mb1xufSBmcm9tICcuL2FwaS1kb2MtdHlwZXMudHMnO1xuXG5pbXBvcnQgeyBFVkVOVF9NRVRIT0RTIH0gZnJvbSAnLi9hcGktZG9jLWNvbnN0YW50cy50cyc7XG5pbXBvcnQge1xuICBsaW5rQmFzZVR5cGUsXG4gIG1hcmtkb3duVG9IdG1sLFxuICBtZW1iZXJIcmVmLFxuICByZW5kZXJFeGFtcGxlTWR4LFxuICByZW5kZXJNZHhQcm9zZSxcbiAgcmVuZGVyVHlwZVdpdGhMaW5rcyxcbiAgcmVzb2x2ZUxpbmtzLFxuICB0b1R5cGVGaWxlU2VnbWVudCxcbiAgdG9UeXBlUm91dGVTZWdtZW50LFxuICB0eXBlTGlua1xufSBmcm9tICcuL2FwaS1kb2MtbGluay1yZW5kZXJpbmcudHMnO1xuaW1wb3J0IHsgZ2V0QXBpRG9jU2V0dGluZ3MgfSBmcm9tICcuL2FwaS1kb2Mtc2V0dGluZ3MudHMnO1xuaW1wb3J0IHtcbiAgZW5zdXJlRGlyZWN0b3J5LFxuICBlc2NhcGVKc1N0cmluZyxcbiAgZXNjYXBlSnN4QXR0cmlidXRlLFxuICBlc2NhcGVNYXJrZG93bixcbiAgZXNjYXBlTWR4QW5nbGVCcmFja2V0cyxcbiAgZXNjYXBlTWR4QnJhY2VzLFxuICBlc2NhcGVNZHhQcm9zZSxcbiAgZXNjYXBlWWFtbCxcbiAgZ2V0RGlzcGxheU5hbWUsXG4gIGdldEltcG9ydFN0YXRlbWVudCxcbiAgZ2V0TmFtZXNwYWNlRGlyZWN0b3J5LFxuICBtZW1iZXJSb3V0ZVNlZ21lbnQsXG4gIG1lbWJlclNsdWcsXG4gIG92ZXJsb2FkUm91dGVTZWdtZW50LFxuICBvdmVybG9hZFNsdWcsXG4gIHN0cmlwTWFya2Rvd24sXG4gIHRydW5jYXRlU2lnbmF0dXJlXG59IGZyb20gJy4vYXBpLWRvYy10ZXh0LXV0aWxzLnRzJztcbmltcG9ydCB7IEFQSV9DT01QT05FTlRTX0lNUE9SVF9QUkVGSVggfSBmcm9tICcuL2RvY3Mtc2l0ZS1hc3NldHMudHMnO1xuXG5jb25zdCBKU09OX0lOREVOVCA9IDI7XG5cbi8qKlxuICogQXBwZW5kIGJhY2tsaW5rcyB0byBvdmVydmlldyBwYWdlcyBhbmQgd3JpdGUgYWxsIGZpbGVzLiBLZXllZCBieSBxdWFsaWZpZWQgYCR7bmFtZXNwYWNlfSMke25hbWV9YC5cbiAqXG4gKiBAcGFyYW0gcGFnZUNvbnRlbnRzIC0gRXZlcnkgb3ZlcnZpZXcgcGFnZSdzIGNvbnRlbnQgYW5kIHBhdGgsIGtleWVkIGJ5IHF1YWxpZmllZCBpZC5cbiAqIEBwYXJhbSBhbGxUeXBlcyAtIEV2ZXJ5IGRvY3VtZW50ZWQgdHlwZSwga2V5ZWQgYnkgYCR7bmFtZXNwYWNlfSMke25hbWV9YC5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGFwcGVuZEJhY2tsaW5rc0FuZFdyaXRlKFxuICBwYWdlQ29udGVudHM6IE1hcDxzdHJpbmcsIFBhZ2VDb250ZW50PixcbiAgYWxsVHlwZXM6IE1hcDxzdHJpbmcsIFR5cGVJbmZvPlxuKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IGJhY2tsaW5rcyA9IGJ1aWxkQmFja2xpbmtzRnJvbUNvbnRlbnQocGFnZUNvbnRlbnRzLCBhbGxUeXBlcyk7XG5cbiAgZm9yIChjb25zdCBba2V5LCB7IGNvbnRlbnQsIGZpbGVQYXRoIH1dIG9mIHBhZ2VDb250ZW50cykge1xuICAgIGNvbnN0IHR5cGVCYWNrbGlua3MgPSBiYWNrbGlua3MuZ2V0KGtleSkgPz8gW107XG4gICAgY29uc3QgbGluZXMgPSBbY29udGVudF07XG4gICAgaWYgKHR5cGVCYWNrbGlua3MubGVuZ3RoID4gMCkge1xuICAgICAgY29uc3Qgc29ydGVkQmFja2xpbmtzID0gWy4uLnR5cGVCYWNrbGlua3NdLnNvcnQoKGEsIGIpID0+IGEubG9jYWxlQ29tcGFyZShiKSk7XG4gICAgICBsaW5lcy5wdXNoKCcnLCAnLS0tJywgJycsICcqKkxpbmtzIHRvIHRoaXMgcGFnZToqKicsICcnKTtcbiAgICAgIGZvciAoY29uc3QgYmxLZXkgb2Ygc29ydGVkQmFja2xpbmtzKSB7XG4gICAgICAgIGNvbnN0IGJsSW5mbyA9IGVuc3VyZU5vbk51bGxhYmxlKGFsbFR5cGVzLmdldChibEtleSkpO1xuICAgICAgICBjb25zdCBibE5zRGlyZWN0b3J5ID0gZ2V0TmFtZXNwYWNlRGlyZWN0b3J5KGJsSW5mby5uYW1lc3BhY2UpO1xuICAgICAgICBsaW5lcy5wdXNoKGAtIFske2JsSW5mby5uYW1lfV0oJHtnZXRBcGlEb2NTZXR0aW5ncygpLmJhc2VQYXRofS9hcGkvJHtibE5zRGlyZWN0b3J5fS8ke3RvVHlwZVJvdXRlU2VnbWVudChibEluZm8ubmFtZXNwYWNlLCBibEluZm8ubmFtZSl9LylgKTtcbiAgICAgIH1cbiAgICB9XG4gICAgYXdhaXQgd3JpdGVGaWxlKGZpbGVQYXRoLCBsaW5lcy5qb2luKCdcXG4nKSwgJ3V0Zi04Jyk7XG4gIH1cbn1cblxuLyoqXG4gKiBCdWlsZCBiYWNrbGlua3MgYnkgc2Nhbm5pbmcgZ2VuZXJhdGVkIHBhZ2UgY29udGVudCBmb3IgaW50ZXJuYWwgQVBJIGxpbmtzLiBLZXllZCBieSBxdWFsaWZpZWQgaWQuXG4gKlxuICogQHBhcmFtIHBhZ2VDb250ZW50cyAtIEV2ZXJ5IG92ZXJ2aWV3IHBhZ2UncyBjb250ZW50IGFuZCBwYXRoLCBrZXllZCBieSBxdWFsaWZpZWQgaWQuXG4gKiBAcGFyYW0gYWxsVHlwZXMgLSBFdmVyeSBkb2N1bWVudGVkIHR5cGUsIGtleWVkIGJ5IGAke25hbWVzcGFjZX0jJHtuYW1lfWAuXG4gKiBAcmV0dXJucyBFYWNoIHJlZmVyZW5jZWQgdHlwZSdzIHF1YWxpZmllZCBpZCBtYXBwZWQgdG8gdGhlIGlkcyBvZiB0aGUgcGFnZXMgbGlua2luZyB0byBpdC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGJ1aWxkQmFja2xpbmtzRnJvbUNvbnRlbnQoXG4gIHBhZ2VDb250ZW50czogTWFwPHN0cmluZywgUGFnZUNvbnRlbnQ+LFxuICBhbGxUeXBlczogTWFwPHN0cmluZywgVHlwZUluZm8+XG4pOiBNYXA8c3RyaW5nLCBzdHJpbmdbXT4ge1xuICBjb25zdCBiYWNrbGlua3MgPSBuZXcgTWFwPHN0cmluZywgc3RyaW5nW10+KCk7XG4gIC8vIEVtaXR0ZWQgVVJMcyBsb3dlcmNhc2UgdGhlIHR5cGUgc2VnbWVudCAoc2VlIHRvUm91dGVTZWdtZW50KSwgc28gbWFwIGVhY2ggbG93ZXJjYXNlZCByb3V0ZVxuICAvLyBpZGVudGl0eSBiYWNrIHRvIGl0cyBvcmlnaW5hbCBxdWFsaWZpZWQgdHlwZSBrZXkuXG4gIGNvbnN0IHJvdXRlS2V5VG9UeXBlS2V5ID0gbmV3IE1hcDxzdHJpbmcsIHN0cmluZz4oKTtcbiAgZm9yIChjb25zdCBbdHlwZUtleSwgaW5mb10gb2YgYWxsVHlwZXMpIHtcbiAgICByb3V0ZUtleVRvVHlwZUtleS5zZXQoYCR7Z2V0TmFtZXNwYWNlRGlyZWN0b3J5KGluZm8ubmFtZXNwYWNlKX0jJHt0b1R5cGVSb3V0ZVNlZ21lbnQoaW5mby5uYW1lc3BhY2UsIGluZm8ubmFtZSl9YCwgdHlwZUtleSk7XG4gIH1cbiAgY29uc3QgZXNjYXBlZEJhc2UgPSBnZXRBcGlEb2NTZXR0aW5ncygpLmJhc2VQYXRoLnJlcGxhY2VBbGwoL1suKis/XiR7fSgpfFtcXF1cXFxcXS9nLCBTdHJpbmcucmF3YFxcJCZgKTtcbiAgY29uc3QgbGlua1BhdHRlcm4gPSBuZXcgUmVnRXhwKGAke2VzY2FwZWRCYXNlfS9hcGkvKD88cGF0aD4oPzpbYS16QS1aMC05X0AtXSsvKSspYCwgJ2cnKTtcbiAgZm9yIChjb25zdCBbc291cmNlS2V5LCB7IGNvbnRlbnQgfV0gb2YgcGFnZUNvbnRlbnRzKSB7XG4gICAgY29uc3QgcmVmZXJlbmNlZCA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuXG4gICAgZm9yIChjb25zdCBtYXRjaCBvZiBjb250ZW50Lm1hdGNoQWxsKGxpbmtQYXR0ZXJuKSkge1xuICAgICAgLy8gVGhlIHBhdHRlcm4gcmVxdWlyZXMgYXQgbGVhc3Qgb25lIHNlZ21lbnQuXG4gICAgICBjb25zdCBzZWdtZW50cyA9IGdldE1hbmRhdG9yeU5hbWVkR3JvdXAobWF0Y2gsICdwYXRoJykuc3BsaXQoJy8nKS5maWx0ZXIoQm9vbGVhbik7XG4gICAgICBjb25zdCB0eXBlTmFtZSA9IGVuc3VyZU5vbk51bGxhYmxlKHNlZ21lbnRzLmF0KC0xKSk7XG4gICAgICBjb25zdCBuYW1lc3BhY2UgPSBzZWdtZW50cy5zbGljZSgwLCAtMSkuam9pbignLycpO1xuICAgICAgY29uc3Qgcm91dGVLZXkgPSBgJHtuYW1lc3BhY2V9IyR7dHlwZU5hbWV9YDtcbiAgICAgIGNvbnN0IHJlc29sdmVkS2V5ID0gcm91dGVLZXlUb1R5cGVLZXkuZ2V0KHJvdXRlS2V5KTtcbiAgICAgIGlmIChyZXNvbHZlZEtleSAhPT0gdW5kZWZpbmVkICYmIHJlc29sdmVkS2V5ICE9PSBzb3VyY2VLZXkpIHtcbiAgICAgICAgcmVmZXJlbmNlZC5hZGQocmVzb2x2ZWRLZXkpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGZvciAoY29uc3QgcmVmZXJlbmNlIG9mIHJlZmVyZW5jZWQpIHtcbiAgICAgIGlmICghYmFja2xpbmtzLmhhcyhyZWZlcmVuY2UpKSB7XG4gICAgICAgIGJhY2tsaW5rcy5zZXQocmVmZXJlbmNlLCBbXSk7XG4gICAgICB9XG4gICAgICBiYWNrbGlua3MuZ2V0KHJlZmVyZW5jZSk/LnB1c2goc291cmNlS2V5KTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gYmFja2xpbmtzO1xufVxuXG4vKipcbiAqIEJ1aWxkcyB0aGUgbmFtZXNwYWNlIHRyZWUgdGhlIHNpZGViYXIgaXMgZ2VuZXJhdGVkIGZyb20uXG4gKlxuICogQHBhcmFtIHR5cGVzIC0gVGhlIGRvY3VtZW50ZWQgdHlwZXMsIGtleWVkIGJ5IHF1YWxpZmllZCBpZC5cbiAqIEByZXR1cm5zIFRoZSByb290IG9mIHRoZSB0cmVlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gYnVpbGRTaWRlYmFyVHJlZSh0eXBlczogTWFwPHN0cmluZywgVHlwZUluZm8+KTogU2lkZWJhclRyZWVOb2RlIHtcbiAgY29uc3Qgcm9vdDogU2lkZWJhclRyZWVOb2RlID0geyBjaGlsZHJlbjogbmV3IE1hcCgpLCB0eXBlczogW10gfTtcbiAgZm9yIChjb25zdCBbLCBpbmZvXSBvZiB0eXBlcykge1xuICAgIGNvbnN0IHBhcnRzID0gaW5mby5uYW1lc3BhY2Uuc3BsaXQoJy8nKTtcbiAgICBsZXQgbm9kZSA9IHJvb3Q7XG4gICAgZm9yIChjb25zdCBwYXJ0IG9mIHBhcnRzKSB7XG4gICAgICBsZXQgY2hpbGQgPSBub2RlLmNoaWxkcmVuLmdldChwYXJ0KTtcbiAgICAgIGlmICghY2hpbGQpIHtcbiAgICAgICAgY2hpbGQgPSB7IGNoaWxkcmVuOiBuZXcgTWFwKCksIHR5cGVzOiBbXSB9O1xuICAgICAgICBub2RlLmNoaWxkcmVuLnNldChwYXJ0LCBjaGlsZCk7XG4gICAgICB9XG4gICAgICBub2RlID0gY2hpbGQ7XG4gICAgfVxuICAgIG5vZGUudHlwZXMucHVzaChpbmZvKTtcbiAgfVxuICByZXR1cm4gcm9vdDtcbn1cblxuLyoqXG4gKiBUaGUgcmF3IGNvZGUgc2lnbmF0dXJlIHNob3duIG9uIGEgdHlwZS1vdmVydmlldyBwYWdlJ3MgT0cgY2FyZCwgZm9yIHRoZSBraW5kcyB0aGF0IHJlbmRlciBhIHNpbmdsZVxuICogc2lnbmF0dXJlIGxpbmUgKGZ1bmN0aW9uIC8gdHlwZSBhbGlhcyAvIHZhcmlhYmxlKS4gQ2xhc3NlcywgaW50ZXJmYWNlcyBhbmQgZW51bXMgcmVuZGVyIG1lbWJlclxuICogdGFibGVzIGluc3RlYWQsIHNvIHRoZXkgZ2V0IG5vIHNpZ25hdHVyZSBibG9jay5cbiAqXG4gKiBAcGFyYW0gbmFtZSAtIFRoZSB0eXBlJ3MgbmFtZS5cbiAqIEBwYXJhbSBpbmZvIC0gVGhlIGRvY3VtZW50ZWQgdHlwZS5cbiAqIEByZXR1cm5zIFRoZSBzaWduYXR1cmUsIG9yIGB1bmRlZmluZWRgIGZvciBhIGtpbmQgdGhhdCByZW5kZXJzIG1lbWJlciB0YWJsZXMgaW5zdGVhZC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNvbXB1dGVPdmVydmlld1NpZ25hdHVyZShuYW1lOiBzdHJpbmcsIGluZm86IFR5cGVJbmZvKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgaWYgKGluZm8ua2luZCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIGNvbnN0ICRmdW5jdGlvbiA9IGluZm8ubWV0aG9kc1swXTtcbiAgICByZXR1cm4gJGZ1bmN0aW9uID8gYGZ1bmN0aW9uICR7JGZ1bmN0aW9uLnNpZ25hdHVyZX06ICR7JGZ1bmN0aW9uLnJldHVyblR5cGV9YCA6IHVuZGVmaW5lZDtcbiAgfVxuICBpZiAoaW5mby5raW5kID09PSAndHlwZScpIHtcbiAgICByZXR1cm4gYHR5cGUgJHtnZXREaXNwbGF5TmFtZShpbmZvLm5hbWUsIGluZm8pfSA9ICR7aW5mby50eXBlQWxpYXNUZXh0ID8/ICd1bmtub3duJ31gO1xuICB9XG4gIHJldHVybiBpbmZvLmtpbmQgPT09ICd2YXJpYWJsZScgPyBgJHtpbmZvLnZhcmlhYmxlS2V5d29yZCA/PyAnbGV0J30gJHtuYW1lfTogJHtpbmZvLnZhcmlhYmxlVHlwZSA/PyAndW5rbm93bid9YCA6IHVuZGVmaW5lZDtcbn1cblxuLyoqXG4gKiBXcml0ZXMgb25lIHBhZ2UgcGVyIG93biBwcm9wZXJ0eSBhbmQgcGVyIG93biBtZXRob2Qgb3ZlcmxvYWQga2V5IG9mIGEgY2xhc3Mgb3IgaW50ZXJmYWNlLlxuICpcbiAqIEBwYXJhbSBuYW1lIC0gVGhlIHR5cGUncyBuYW1lLlxuICogQHBhcmFtIGluZm8gLSBUaGUgZG9jdW1lbnRlZCB0eXBlLlxuICogQHBhcmFtIGFsbFR5cGVzIC0gRXZlcnkgZG9jdW1lbnRlZCB0eXBlLCBrZXllZCBieSBgJHtuYW1lc3BhY2V9IyR7bmFtZX1gLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVNZW1iZXJQYWdlcyhuYW1lOiBzdHJpbmcsIGluZm86IFR5cGVJbmZvLCBhbGxUeXBlczogTWFwPHN0cmluZywgVHlwZUluZm8+KTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IG5zRGlyZWN0b3J5ID0gZ2V0TmFtZXNwYWNlRGlyZWN0b3J5KGluZm8ubmFtZXNwYWNlKTtcbiAgY29uc3QgdHlwZUZpbGVEaXJlY3RvcnkgPSB0b1R5cGVGaWxlU2VnbWVudChpbmZvLm5hbWVzcGFjZSwgbmFtZSk7XG4gIGNvbnN0IHR5cGVSb3V0ZURpcmVjdG9yeSA9IHRvVHlwZVJvdXRlU2VnbWVudChpbmZvLm5hbWVzcGFjZSwgbmFtZSk7XG4gIGNvbnN0IGNvbXBvbmVudEltcG9ydHMgPSBnZXRDb21wb25lbnRJbXBvcnRzKFsnTWVtYmVyRGV0YWlsJ10pO1xuXG4gIC8vIFByb3BlcnR5IHBhZ2VzIChza2lwIGluaGVyaXRlZCDigJQgdGhleSBsaXZlIG9uIHRoZSBwYXJlbnQgdHlwZSlcbiAgY29uc3QgcHJvcGVydGllcyA9IGluZm8ucHJvcGVydGllcy5maWx0ZXIoKHApID0+ICFwLmluaGVyaXRlZEZyb20pO1xuICBmb3IgKGNvbnN0IHByb3BlcnR5IG9mIHByb3BlcnRpZXMpIHtcbiAgICBjb25zdCBmaWxlUGF0aCA9IGpvaW4oZ2V0QXBpRG9jU2V0dGluZ3MoKS5vdXRwdXREaXJlY3RvcnksIG5zRGlyZWN0b3J5LCB0eXBlRmlsZURpcmVjdG9yeSwgYCR7bWVtYmVyU2x1Zyhwcm9wZXJ0eS5uYW1lKX0ubWR4YCk7XG4gICAgYXdhaXQgZW5zdXJlRGlyZWN0b3J5KGZpbGVQYXRoKTtcblxuICAgIGNvbnN0IHByb3BlcnR5VGl0bGUgPSBgJHtuYW1lfS4ke3Byb3BlcnR5Lm5hbWV9YDtcbiAgICBjb25zdCBsaW5lczogc3RyaW5nW10gPSByZW5kZXJGcm9udE1hdHRlcih7XG4gICAgICBkZXNjcmlwdGlvbjogcHJvcGVydHkuZGVzY3JpcHRpb24sXG4gICAgICBzaWRlYmFyTGFiZWw6IHByb3BlcnR5VGl0bGUsXG4gICAgICBzaWduYXR1cmU6IGAke3Byb3BlcnR5LnNpZ25hdHVyZX06ICR7cHJvcGVydHkudHlwZX1gLFxuICAgICAgc2x1ZzogYGFwaS8ke25zRGlyZWN0b3J5fS8ke3R5cGVSb3V0ZURpcmVjdG9yeX0vJHttZW1iZXJSb3V0ZVNlZ21lbnQocHJvcGVydHkubmFtZSl9YCxcbiAgICAgIHRpdGxlOiBwcm9wZXJ0eVRpdGxlXG4gICAgfSk7XG4gICAgbGluZXMucHVzaChcbiAgICAgIC4uLmNvbXBvbmVudEltcG9ydHMsXG4gICAgICAnJyxcbiAgICAgIC8vIEJyZWFkY3J1bWJcbiAgICAgIGBbJHtuYW1lfV0oJHtnZXRBcGlEb2NTZXR0aW5ncygpLmJhc2VQYXRofS9hcGkvJHtuc0RpcmVjdG9yeX0vJHt0eXBlUm91dGVEaXJlY3Rvcnl9Lykg4oC6ICR7cHJvcGVydHkubmFtZX1gLFxuICAgICAgJydcbiAgICApO1xuXG4gICAgY29uc3Qgc3RhdGljQXR0cmlidXRlID0gcHJvcGVydHkuaXNTdGF0aWMgPyAnIGlzU3RhdGljPXt0cnVlfScgOiAnJztcbiAgICBjb25zdCB0eXBlQXR0cmlidXRlID0gYCB0eXBlPVwiJHtlc2NhcGVKc3hBdHRyaWJ1dGUobWFya2Rvd25Ub0h0bWwocmVuZGVyVHlwZVdpdGhMaW5rcyhwcm9wZXJ0eS50eXBlLCBhbGxUeXBlcywgbmFtZSwgaW5mby5uYW1lc3BhY2UpKSl9XCJgO1xuICAgIGNvbnN0IGRlc2NBdHRyaWJ1dGUgPSBwcm9wZXJ0eS5kZXNjcmlwdGlvbiA/IGAgZGVzY3JpcHRpb249XCIke2VzY2FwZUpzeEF0dHJpYnV0ZShtYXJrZG93blRvSHRtbChyZXNvbHZlTGlua3MocHJvcGVydHkuZGVzY3JpcHRpb24sIGFsbFR5cGVzLCBpbmZvLm5hbWVzcGFjZSkpKX1cImAgOiAnJztcbiAgICBjb25zdCByZW1hcmtzQXR0cmlidXRlID0gcHJvcGVydHkucmVtYXJrcyA/IGAgcmVtYXJrcz1cIiR7ZXNjYXBlSnN4QXR0cmlidXRlKG1hcmtkb3duVG9IdG1sKHJlc29sdmVMaW5rcyhwcm9wZXJ0eS5yZW1hcmtzLCBhbGxUeXBlcywgaW5mby5uYW1lc3BhY2UpKSl9XCJgIDogJyc7XG4gICAgY29uc3Qgc2luY2VBdHRyaWJ1dGUgPSBwcm9wZXJ0eS5zaW5jZSA/IGAgc2luY2U9XCIke2VzY2FwZUpzeEF0dHJpYnV0ZShwcm9wZXJ0eS5zaW5jZSl9XCJgIDogJyc7XG4gICAgY29uc3QgZXhhbXBsZXNBdHRyaWJ1dGUgPSBwcm9wZXJ0eS5leGFtcGxlcy5sZW5ndGggPiAwID8gYCBleGFtcGxlcz17JHtKU09OLnN0cmluZ2lmeShwcm9wZXJ0eS5leGFtcGxlcyl9fWAgOiAnJztcblxuICAgIGxpbmVzLnB1c2goYDxNZW1iZXJEZXRhaWwke3N0YXRpY0F0dHJpYnV0ZX0ke3R5cGVBdHRyaWJ1dGV9JHtkZXNjQXR0cmlidXRlfSR7cmVtYXJrc0F0dHJpYnV0ZX0ke3NpbmNlQXR0cmlidXRlfSR7ZXhhbXBsZXNBdHRyaWJ1dGV9IC8+YCwgJycpO1xuXG4gICAgYXdhaXQgd3JpdGVGaWxlKGZpbGVQYXRoLCBsaW5lcy5qb2luKCdcXG4nKSwgJ3V0Zi04Jyk7XG4gIH1cblxuICAvLyBNZXRob2QgcGFnZXMg4oCUIGVhY2ggb3ZlcmxvYWQga2V5IGdldHMgaXRzIG93biBwYWdlIChza2lwIGluaGVyaXRlZClcbiAgY29uc3QgbWV0aG9kcyA9IGluZm8ubWV0aG9kcy5maWx0ZXIoKG0pID0+ICFtLmluaGVyaXRlZEZyb20pO1xuICBjb25zdCBvdmVybG9hZEdyb3VwcyA9IG5ldyBNYXA8c3RyaW5nLCBNZW1iZXJJbmZvW10+KCk7XG4gIGZvciAoY29uc3QgbWV0aG9kIG9mIG1ldGhvZHMpIHtcbiAgICBjb25zdCBrZXkgPSBtZXRob2Qub3ZlcmxvYWRLZXk7XG4gICAgaWYgKCFvdmVybG9hZEdyb3Vwcy5oYXMoa2V5KSkge1xuICAgICAgb3ZlcmxvYWRHcm91cHMuc2V0KGtleSwgW10pO1xuICAgIH1cbiAgICBvdmVybG9hZEdyb3Vwcy5nZXQoa2V5KT8ucHVzaChtZXRob2QpO1xuICB9XG5cbiAgZm9yIChjb25zdCBbb3ZlcmxvYWRLZXksIG92ZXJsb2Fkc10gb2Ygb3ZlcmxvYWRHcm91cHMpIHtcbiAgICBjb25zdCBmaWxlU2x1ZyA9IG92ZXJsb2FkU2x1ZyhvdmVybG9hZEtleSk7XG4gICAgY29uc3QgZmlsZVBhdGggPSBqb2luKGdldEFwaURvY1NldHRpbmdzKCkub3V0cHV0RGlyZWN0b3J5LCBuc0RpcmVjdG9yeSwgdHlwZUZpbGVEaXJlY3RvcnksIGAke2ZpbGVTbHVnfS5tZHhgKTtcbiAgICBhd2FpdCBlbnN1cmVEaXJlY3RvcnkoZmlsZVBhdGgpO1xuXG4gICAgY29uc3QgZGlzcGxheU5hbWUgPSBgJHtuYW1lfS4ke292ZXJsb2FkS2V5fSBtZXRob2RgO1xuICAgIC8vIEEgZ3JvdXAgaXMgY3JlYXRlZCBieSBpdHMgZmlyc3Qgb3ZlcmxvYWQuXG4gICAgY29uc3QgZmlyc3RPdmVybG9hZCA9IGVuc3VyZU5vbk51bGxhYmxlKG92ZXJsb2Fkc1swXSk7XG5cbiAgICBjb25zdCBsaW5lczogc3RyaW5nW10gPSByZW5kZXJGcm9udE1hdHRlcih7XG4gICAgICBkZXNjcmlwdGlvbjogZmlyc3RPdmVybG9hZC5kZXNjcmlwdGlvbixcbiAgICAgIHNpZGViYXJMYWJlbDogYCR7bmFtZX0uJHtvdmVybG9hZEtleX1gLFxuICAgICAgc2lnbmF0dXJlOiBgJHtmaXJzdE92ZXJsb2FkLnNpZ25hdHVyZX06ICR7Zmlyc3RPdmVybG9hZC5yZXR1cm5UeXBlfWAsXG4gICAgICBzbHVnOiBgYXBpLyR7bnNEaXJlY3Rvcnl9LyR7dHlwZVJvdXRlRGlyZWN0b3J5fS8ke292ZXJsb2FkUm91dGVTZWdtZW50KG92ZXJsb2FkS2V5KX1gLFxuICAgICAgdGl0bGU6IGRpc3BsYXlOYW1lXG4gICAgfSk7XG4gICAgbGluZXMucHVzaChcbiAgICAgIC4uLmNvbXBvbmVudEltcG9ydHMsXG4gICAgICAnJyxcbiAgICAgIC8vIEJyZWFkY3J1bWJcbiAgICAgIGBbJHtuYW1lfV0oJHtnZXRBcGlEb2NTZXR0aW5ncygpLmJhc2VQYXRofS9hcGkvJHtuc0RpcmVjdG9yeX0vJHt0eXBlUm91dGVEaXJlY3Rvcnl9Lykg4oC6ICR7b3ZlcmxvYWRLZXl9YCxcbiAgICAgICcnXG4gICAgKTtcblxuICAgIGZvciAoY29uc3Qgb3ZlcmxvYWQgb2Ygb3ZlcmxvYWRzKSB7XG4gICAgICByZW5kZXJNZXRob2RPdmVybG9hZE1keChsaW5lcywgb3ZlcmxvYWQsIG5hbWUsIGluZm8ubmFtZXNwYWNlLCBhbGxUeXBlcyk7XG4gICAgICBpZiAob3ZlcmxvYWRzLmxlbmd0aCA+IDEpIHtcbiAgICAgICAgbGluZXMucHVzaCgnLS0tJywgJycpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGF3YWl0IHdyaXRlRmlsZShmaWxlUGF0aCwgbGluZXMuam9pbignXFxuJyksICd1dGYtOCcpO1xuICB9XG59XG5cbi8qKlxuICogV3JpdGVzIGVhY2ggbW9kdWxlJ3MgaW5kZXggcGFnZSBhbmQgdGhlIHJvb3QgQVBJIGluZGV4LlxuICpcbiAqIEBwYXJhbSB0eXBlcyAtIFRoZSBkb2N1bWVudGVkIHR5cGVzLCBrZXllZCBieSBxdWFsaWZpZWQgaWQuXG4gKiBAcGFyYW0gYWxsVHlwZXMgLSBFdmVyeSBkb2N1bWVudGVkIHR5cGUsIGtleWVkIGJ5IGAke25hbWVzcGFjZX0jJHtuYW1lfWAuXG4gKiBAcGFyYW0gbW9kdWxlT3ZlcnZpZXdzIC0gRWFjaCBuYW1lc3BhY2UncyBgQGZpbGVgIG92ZXJ2aWV3LlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVOYW1lc3BhY2VJbmRleFBhZ2VzKFxuICB0eXBlczogTWFwPHN0cmluZywgVHlwZUluZm8+LFxuICBhbGxUeXBlczogTWFwPHN0cmluZywgVHlwZUluZm8+LFxuICBtb2R1bGVPdmVydmlld3M6IE1hcDxzdHJpbmcsIHN0cmluZz5cbik6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCBuYW1lc3BhY2VzID0gbmV3IE1hcDxzdHJpbmcsIFR5cGVJbmZvW10+KCk7XG4gIGZvciAoY29uc3QgWywgaW5mb10gb2YgdHlwZXMpIHtcbiAgICBpZiAoIW5hbWVzcGFjZXMuaGFzKGluZm8ubmFtZXNwYWNlKSkge1xuICAgICAgbmFtZXNwYWNlcy5zZXQoaW5mby5uYW1lc3BhY2UsIFtdKTtcbiAgICB9XG4gICAgbmFtZXNwYWNlcy5nZXQoaW5mby5uYW1lc3BhY2UpPy5wdXNoKGluZm8pO1xuICB9XG5cbiAgZm9yIChjb25zdCBbbmFtZXNwYWNlLCBuc1R5cGVzXSBvZiBuYW1lc3BhY2VzKSB7XG4gICAgY29uc3QgbnNEaXJlY3RvcnkgPSBnZXROYW1lc3BhY2VEaXJlY3RvcnkobmFtZXNwYWNlKTtcbiAgICBjb25zdCBmaWxlUGF0aCA9IGpvaW4oZ2V0QXBpRG9jU2V0dGluZ3MoKS5vdXRwdXREaXJlY3RvcnksIG5zRGlyZWN0b3J5LCAnaW5kZXgubWR4Jyk7XG4gICAgYXdhaXQgZW5zdXJlRGlyZWN0b3J5KGZpbGVQYXRoKTtcblxuICAgIC8vIFRoZSBtb2R1bGUncyBgQGZpbGVgIHRleHQgZG91YmxlcyBhcyBpdHMgZGVzY3JpcHRpb24uXG4gICAgLy8gV2l0aG91dCBpdCB0aGUgbW9kdWxlIGNhcmQgd2FzIHRpdGxlLW9ubHkgd2hpbGUgZXZlcnkgbWVtYmVyIGNhcmQgdW5kZXIgaXQgY2FycmllZCBvbmUuXG4gICAgY29uc3Qgb3ZlcnZpZXcgPSBtb2R1bGVPdmVydmlld3MuZ2V0KG5hbWVzcGFjZSk7XG4gICAgY29uc3QgbGluZXM6IHN0cmluZ1tdID0gcmVuZGVyRnJvbnRNYXR0ZXIoe1xuICAgICAgZGVzY3JpcHRpb246IG92ZXJ2aWV3LFxuICAgICAgc2lkZWJhckxhYmVsOiBuYW1lc3BhY2UsXG4gICAgICBzbHVnOiBgYXBpLyR7bnNEaXJlY3Rvcnl9YCxcbiAgICAgIHRpdGxlOiBuYW1lc3BhY2VcbiAgICB9KTtcblxuICAgIC8vIE1vZHVsZSBAZmlsZSBvdmVydmlldyB0ZXh0XG4gICAgaWYgKG92ZXJ2aWV3KSB7XG4gICAgICBsaW5lcy5wdXNoKHJlbmRlck1keFByb3NlKG92ZXJ2aWV3LCBhbGxUeXBlcywgbmFtZXNwYWNlKSwgJycpO1xuICAgIH1cblxuICAgIHJlbmRlck5hbWVzcGFjZVRhYmxlKGxpbmVzLCAnQ2xhc3NlcycsICdDbGFzcycsIG5zVHlwZXMuZmlsdGVyKCh0KSA9PiB0LmtpbmQgPT09ICdjbGFzcycpLCBhbGxUeXBlcywgbmFtZXNwYWNlKTtcbiAgICByZW5kZXJOYW1lc3BhY2VUYWJsZShsaW5lcywgJ0ludGVyZmFjZXMnLCAnSW50ZXJmYWNlJywgbnNUeXBlcy5maWx0ZXIoKHQpID0+IHQua2luZCA9PT0gJ2ludGVyZmFjZScpLCBhbGxUeXBlcywgbmFtZXNwYWNlKTtcbiAgICByZW5kZXJOYW1lc3BhY2VUYWJsZShsaW5lcywgJ0Z1bmN0aW9ucycsICdGdW5jdGlvbicsIG5zVHlwZXMuZmlsdGVyKCh0KSA9PiB0LmtpbmQgPT09ICdmdW5jdGlvbicpLCBhbGxUeXBlcywgbmFtZXNwYWNlKTtcbiAgICByZW5kZXJOYW1lc3BhY2VUYWJsZShsaW5lcywgJ1R5cGVzJywgJ1R5cGUnLCBuc1R5cGVzLmZpbHRlcigodCkgPT4gdC5raW5kID09PSAndHlwZScpLCBhbGxUeXBlcywgbmFtZXNwYWNlKTtcbiAgICByZW5kZXJOYW1lc3BhY2VUYWJsZShsaW5lcywgJ0VudW1zJywgJ0VudW0nLCBuc1R5cGVzLmZpbHRlcigodCkgPT4gdC5raW5kID09PSAnZW51bScpLCBhbGxUeXBlcywgbmFtZXNwYWNlKTtcbiAgICByZW5kZXJOYW1lc3BhY2VUYWJsZShsaW5lcywgJ1ZhcmlhYmxlcycsICdWYXJpYWJsZScsIG5zVHlwZXMuZmlsdGVyKCh0KSA9PiB0LmtpbmQgPT09ICd2YXJpYWJsZScpLCBhbGxUeXBlcywgbmFtZXNwYWNlKTtcblxuICAgIGF3YWl0IHdyaXRlRmlsZShmaWxlUGF0aCwgbGluZXMuam9pbignXFxuJyksICd1dGYtOCcpO1xuICB9XG5cbiAgLy8gUm9vdCBBUEkgaW5kZXggcGFnZSBsaXN0aW5nIGV2ZXJ5IG1vZHVsZS5cbiAgY29uc3Qgc29ydGVkTmFtZXNwYWNlcyA9IFsuLi5uYW1lc3BhY2VzLmtleXMoKV0uc29ydCgoYSwgYikgPT4gYS5sb2NhbGVDb21wYXJlKGIpKTtcbiAgY29uc3QgYXBpSW5kZXhJbnRybyA9IGdldEFwaUluZGV4SW50cm8oc29ydGVkTmFtZXNwYWNlcyk7XG4gIGNvbnN0IHJvb3RMaW5lczogc3RyaW5nW10gPSByZW5kZXJGcm9udE1hdHRlcih7XG4gICAgZGVzY3JpcHRpb246IGFwaUluZGV4SW50cm8sXG4gICAgc2lkZWJhckxhYmVsOiAnT3ZlcnZpZXcnLFxuICAgIHNsdWc6ICdhcGknLFxuICAgIHRpdGxlOiAnQVBJIHJlZmVyZW5jZSdcbiAgfSk7XG4gIHJvb3RMaW5lcy5wdXNoKGFwaUluZGV4SW50cm8sICcnLCAnIyMgTW9kdWxlcycsICcnKTtcbiAgZm9yIChjb25zdCBuYW1lc3BhY2Ugb2Ygc29ydGVkTmFtZXNwYWNlcykge1xuICAgIHJvb3RMaW5lcy5wdXNoKGAtIFske25hbWVzcGFjZX1dKCR7Z2V0QXBpRG9jU2V0dGluZ3MoKS5iYXNlUGF0aH0vYXBpLyR7Z2V0TmFtZXNwYWNlRGlyZWN0b3J5KG5hbWVzcGFjZSl9LylgKTtcbiAgfVxuICByb290TGluZXMucHVzaCgnJyk7XG4gIGNvbnN0IHJvb3RGaWxlUGF0aCA9IGpvaW4oZ2V0QXBpRG9jU2V0dGluZ3MoKS5vdXRwdXREaXJlY3RvcnksICdpbmRleC5tZHgnKTtcbiAgYXdhaXQgZW5zdXJlRGlyZWN0b3J5KHJvb3RGaWxlUGF0aCk7XG4gIGF3YWl0IHdyaXRlRmlsZShyb290RmlsZVBhdGgsIHJvb3RMaW5lcy5qb2luKCdcXG4nKSwgJ3V0Zi04Jyk7XG59XG5cbi8qKlxuICogUmVuZGVycyBhIHR5cGUncyBvdmVydmlldyBwYWdlLlxuICpcbiAqIEBwYXJhbSBuYW1lIC0gVGhlIHR5cGUncyBuYW1lLlxuICogQHBhcmFtIGluZm8gLSBUaGUgZG9jdW1lbnRlZCB0eXBlLlxuICogQHBhcmFtIGFsbFR5cGVzIC0gRXZlcnkgZG9jdW1lbnRlZCB0eXBlLCBrZXllZCBieSBgJHtuYW1lc3BhY2V9IyR7bmFtZX1gLlxuICogQHJldHVybnMgVGhlIHBhZ2UncyBjb250ZW50LCBiZWZvcmUgYmFja2xpbmtzLCBhbmQgdGhlIHBhdGggaXQgaXMgd3JpdHRlbiB0by5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdlbmVyYXRlT3ZlcnZpZXdQYWdlKG5hbWU6IHN0cmluZywgaW5mbzogVHlwZUluZm8sIGFsbFR5cGVzOiBNYXA8c3RyaW5nLCBUeXBlSW5mbz4pOiBQcm9taXNlPFBhZ2VDb250ZW50PiB7XG4gIGNvbnN0IG5zRGlyZWN0b3J5ID0gZ2V0TmFtZXNwYWNlRGlyZWN0b3J5KGluZm8ubmFtZXNwYWNlKTtcbiAgY29uc3QgdHlwZUZpbGVTbHVnID0gdG9UeXBlRmlsZVNlZ21lbnQoaW5mby5uYW1lc3BhY2UsIG5hbWUpO1xuICBjb25zdCB0eXBlUm91dGVTbHVnID0gdG9UeXBlUm91dGVTZWdtZW50KGluZm8ubmFtZXNwYWNlLCBuYW1lKTtcbiAgY29uc3QgZmlsZVBhdGggPSBqb2luKGdldEFwaURvY1NldHRpbmdzKCkub3V0cHV0RGlyZWN0b3J5LCBuc0RpcmVjdG9yeSwgdHlwZUZpbGVTbHVnLCAnaW5kZXgubWR4Jyk7XG4gIGF3YWl0IGVuc3VyZURpcmVjdG9yeShmaWxlUGF0aCk7XG5cbiAgLy8gRnJvbnRtYXR0ZXJcbiAgY29uc3QgZGlzcGxheU5hbWUgPSBnZXREaXNwbGF5TmFtZShuYW1lLCBpbmZvKTtcbiAgY29uc3QgbGluZXM6IHN0cmluZ1tdID0gcmVuZGVyRnJvbnRNYXR0ZXIoe1xuICAgIGRlc2NyaXB0aW9uOiBpbmZvLmRlc2NyaXB0aW9uLFxuICAgIHNpZGViYXJMYWJlbDogZGlzcGxheU5hbWUsXG4gICAgc2lnbmF0dXJlOiBjb21wdXRlT3ZlcnZpZXdTaWduYXR1cmUobmFtZSwgaW5mbyksXG4gICAgc2x1ZzogYGFwaS8ke25zRGlyZWN0b3J5fS8ke3R5cGVSb3V0ZVNsdWd9YCxcbiAgICB0aXRsZTogZGlzcGxheU5hbWVcbiAgfSk7XG5cbiAgLy8gQ29tcG9uZW50IGltcG9ydHMg4oCUIGNvbXB1dGUgcmVsYXRpdmUgcGF0aCBmcm9tIGdlbmVyYXRlZCBwYWdlIHRvIGNvbXBvbmVudHNcbiAgbGluZXMucHVzaCguLi5nZXRDb21wb25lbnRJbXBvcnRzKFsnQ29uc3RydWN0b3JCbG9jaycsICdJbXBvcnRTdGF0ZW1lbnQnLCAnTWV0aG9kVGFibGUnLCAnUHJvcGVydHlUYWJsZScsICdUeXBlU2lnbmF0dXJlJ10pLCAnJyk7XG5cbiAgLy8gRGVzY3JpcHRpb25cbiAgaWYgKGluZm8uZGVzY3JpcHRpb24pIHtcbiAgICBsaW5lcy5wdXNoKHJlbmRlck1keFByb3NlKGluZm8uZGVzY3JpcHRpb24sIGFsbFR5cGVzLCBpbmZvLm5hbWVzcGFjZSksICcnKTtcbiAgfVxuXG4gIC8vIFJlbWFya3NcbiAgaWYgKGluZm8ucmVtYXJrcykge1xuICAgIGNvbnN0IHJlbWFya3NCbG9jayA9IHJlbmRlck1keFByb3NlKGluZm8ucmVtYXJrcywgYWxsVHlwZXMsIGluZm8ubmFtZXNwYWNlKTtcbiAgICBsaW5lcy5wdXNoKHJlbWFya3NCbG9jay5zcGxpdCgnXFxuJykubWFwKChsaW5lKSA9PiAobGluZS5sZW5ndGggPiAwID8gYD4gJHtsaW5lfWAgOiAnPicpKS5qb2luKCdcXG4nKSwgJycpO1xuICB9XG5cbiAgLy8gSW1wb3J0IHN0YXRlbWVudFxuICBsaW5lcy5wdXNoKGA8SW1wb3J0U3RhdGVtZW50IHRleHQ9XCIke2VzY2FwZUpzeEF0dHJpYnV0ZShnZXRJbXBvcnRTdGF0ZW1lbnQoaW5mbykpfVwiIC8+YCwgJycpO1xuXG4gIC8vIEV4YW1wbGVzXG4gIGZvciAoY29uc3QgZXhhbXBsZSBvZiBpbmZvLmV4YW1wbGVzKSB7XG4gICAgbGluZXMucHVzaCgnKipFeGFtcGxlOioqJywgJycsIHJlbmRlckV4YW1wbGVNZHgoZXhhbXBsZSwgYWxsVHlwZXMsIGluZm8ubmFtZXNwYWNlKSwgJycpO1xuICB9XG5cbiAgLy8gRnVuY3Rpb25zIHJlbmRlciBsaWtlIG1ldGhvZCBkZXRhaWwgcGFnZXMg4oCUIHNpZ25hdHVyZSwgcGFyYW1zLCByZXR1cm5zXG4gIGlmIChpbmZvLmtpbmQgPT09ICdmdW5jdGlvbicpIHtcbiAgICByZW5kZXJGdW5jdGlvblBhZ2UobGluZXMsIGluZm8sIGFsbFR5cGVzKTtcbiAgICByZXR1cm4geyBjb250ZW50OiBsaW5lcy5qb2luKCdcXG4nKSwgZmlsZVBhdGggfTtcbiAgfVxuXG4gIC8vIFZhcmlhYmxlcyByZW5kZXIgd2l0aCBkZWNsYXJhdGlvbiBrZXl3b3JkIGFuZCB0eXBlXG4gIGlmIChpbmZvLmtpbmQgPT09ICd2YXJpYWJsZScpIHtcbiAgICByZW5kZXJWYXJpYWJsZVBhZ2UobGluZXMsIG5hbWUsIGluZm8sIGFsbFR5cGVzKTtcbiAgICByZXR1cm4geyBjb250ZW50OiBsaW5lcy5qb2luKCdcXG4nKSwgZmlsZVBhdGggfTtcbiAgfVxuXG4gIC8vIEVudW1zIHJlbmRlciB0aGVpciBtZW1iZXJzIGxpc3RcbiAgaWYgKGluZm8ua2luZCA9PT0gJ2VudW0nKSB7XG4gICAgcmVuZGVyRW51bVBhZ2UobGluZXMsIGluZm8sIGFsbFR5cGVzKTtcbiAgICByZXR1cm4geyBjb250ZW50OiBsaW5lcy5qb2luKCdcXG4nKSwgZmlsZVBhdGggfTtcbiAgfVxuXG4gIC8vIFR5cGUgYWxpYXNlcyByZW5kZXIgdGhlaXIgcmlnaHQtaGFuZC1zaWRlIHNpZ25hdHVyZVxuICBpZiAoaW5mby5raW5kID09PSAndHlwZScpIHtcbiAgICByZW5kZXJUeXBlQWxpYXNQYWdlKGxpbmVzLCBpbmZvLCBhbGxUeXBlcyk7XG4gICAgcmV0dXJuIHsgY29udGVudDogbGluZXMuam9pbignXFxuJyksIGZpbGVQYXRoIH07XG4gIH1cblxuICAvLyBDbGFzc2VzIC8gaW50ZXJmYWNlczogc2lnbmF0dXJlICsgZXh0ZW5kcy9pbXBsZW1lbnRzICsgY29uc3RydWN0b3IgKyBtZW1iZXIgdGFibGVzXG4gIGNvbnN0IHR5cGVQYXJhbXNBdHRyaWJ1dGUgPSBpbmZvLnR5cGVQYXJhbWV0ZXJzLmxlbmd0aCA+IDAgPyBgIHR5cGVQYXJhbXM9eyR7SlNPTi5zdHJpbmdpZnkoaW5mby50eXBlUGFyYW1ldGVycyl9fWAgOiAnJztcbiAgY29uc3QgZXh0ZW5kc0F0dHJpYnV0ZSA9IGluZm8uYmFzZVR5cGVzLmxlbmd0aCA+IDAgPyBgIGV4dGVuZHM9eyR7SlNPTi5zdHJpbmdpZnkoaW5mby5iYXNlVHlwZXMpfX1gIDogJyc7XG4gIGNvbnN0IGltcGxlbWVudHNBdHRyaWJ1dGUgPSBpbmZvLmltcGxlbWVudHNUeXBlcy5sZW5ndGggPiAwID8gYCBpbXBsZW1lbnRzPXske0pTT04uc3RyaW5naWZ5KGluZm8uaW1wbGVtZW50c1R5cGVzKX19YCA6ICcnO1xuICBsaW5lcy5wdXNoKGA8VHlwZVNpZ25hdHVyZSBraW5kPVwiJHtpbmZvLmtpbmR9XCIgbmFtZT1cIiR7bmFtZX1cIiR7dHlwZVBhcmFtc0F0dHJpYnV0ZX0ke2V4dGVuZHNBdHRyaWJ1dGV9JHtpbXBsZW1lbnRzQXR0cmlidXRlfSAvPmAsICcnKTtcblxuICBpZiAoaW5mby5iYXNlVHlwZXMubGVuZ3RoID4gMCkge1xuICAgIGNvbnN0IGxpbmtlZFR5cGVzID0gaW5mby5iYXNlVHlwZXMubWFwKCh0KSA9PiBsaW5rQmFzZVR5cGUodCwgYWxsVHlwZXMsIGluZm8ubmFtZXNwYWNlKSk7XG4gICAgbGluZXMucHVzaChgKipFeHRlbmRzOioqICR7bGlua2VkVHlwZXMuam9pbignLCAnKX1gLCAnJyk7XG4gIH1cblxuICBpZiAoaW5mby5pbXBsZW1lbnRzVHlwZXMubGVuZ3RoID4gMCkge1xuICAgIGNvbnN0IGxpbmtlZFR5cGVzID0gaW5mby5pbXBsZW1lbnRzVHlwZXMubWFwKCh0KSA9PiBsaW5rQmFzZVR5cGUodCwgYWxsVHlwZXMsIGluZm8ubmFtZXNwYWNlKSk7XG4gICAgbGluZXMucHVzaChgKipJbXBsZW1lbnRzOioqICR7bGlua2VkVHlwZXMuam9pbignLCAnKX1gLCAnJyk7XG4gIH1cblxuICByZW5kZXJDb25zdHJ1Y3Rvck1keChsaW5lcywgbmFtZSwgaW5mbywgYWxsVHlwZXMpO1xuICByZW5kZXJQcm9wZXJ0eVRhYmxlTWR4KGxpbmVzLCBpbmZvLCBhbGxUeXBlcyk7XG4gIHJlbmRlck1ldGhvZFRhYmxlTWR4KGxpbmVzLCBpbmZvLCBhbGxUeXBlcyk7XG5cbiAgcmV0dXJuIHsgY29udGVudDogbGluZXMuam9pbignXFxuJyksIGZpbGVQYXRoIH07XG59XG5cbi8qKlxuICogV3JpdGVzIHRoZSBTdGFybGlnaHQgc2lkZWJhciBvZiB0aGUgQVBJIHJlZmVyZW5jZS5cbiAqXG4gKiBAcGFyYW0gdHlwZXMgLSBUaGUgZG9jdW1lbnRlZCB0eXBlcywga2V5ZWQgYnkgcXVhbGlmaWVkIGlkLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVTaWRlYmFySnNvbih0eXBlczogTWFwPHN0cmluZywgVHlwZUluZm8+KTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IHJvb3QgPSBidWlsZFNpZGViYXJUcmVlKHR5cGVzKTtcblxuICBjb25zdCBncm91cHM6IFNpZGViYXJFbnRyeVtdID0gW107XG4gIGNvbnN0IHRvcExldmVscyA9IFsuLi5yb290LmNoaWxkcmVuXS5zb3J0KChbYV0sIFtiXSkgPT4gYS5sb2NhbGVDb21wYXJlKGIpKTtcbiAgZm9yIChjb25zdCBbdG9wTGV2ZWwsIGNoaWxkXSBvZiB0b3BMZXZlbHMpIHtcbiAgICBncm91cHMucHVzaChzaWRlYmFyVHJlZVRvRW50cmllcyhjaGlsZCwgdG9wTGV2ZWwpKTtcbiAgfVxuXG4gIGNvbnN0IHdyYXBwZWRTaWRlYmFyOiBTaWRlYmFyRW50cnlbXSA9IFt7XG4gICAgY29sbGFwc2VkOiBmYWxzZSxcbiAgICBpdGVtczogZ3JvdXBzLFxuICAgIGxhYmVsOiAnQVBJIHJlZmVyZW5jZSdcbiAgfV07XG5cbiAgYXdhaXQgd3JpdGVGaWxlKGdldEFwaURvY1NldHRpbmdzKCkuc2lkZWJhckZpbGUsIEpTT04uc3RyaW5naWZ5KHdyYXBwZWRTaWRlYmFyLCBudWxsLCBKU09OX0lOREVOVCksICd1dGYtOCcpO1xuICBjb25zb2xlLndhcm4oYEdlbmVyYXRlZCBzaWRlYmFyIHdpdGggJHtTdHJpbmcoZ3JvdXBzLmxlbmd0aCl9IHRvcC1sZXZlbCBtb2R1bGUgZ3JvdXBzYCk7XG59XG5cbi8qKlxuICogUmVuZGVycyBhIGNsYXNzJ3MgY29uc3RydWN0b3IgYmxvY2suXG4gKlxuICogQHBhcmFtIGxpbmVzIC0gVGhlIHBhZ2UgbGluZXMgdG8gYXBwZW5kIHRvLlxuICogQHBhcmFtIG5hbWUgLSBUaGUgdHlwZSdzIG5hbWUuXG4gKiBAcGFyYW0gaW5mbyAtIFRoZSBkb2N1bWVudGVkIHR5cGUuXG4gKiBAcGFyYW0gYWxsVHlwZXMgLSBFdmVyeSBkb2N1bWVudGVkIHR5cGUsIGtleWVkIGJ5IGAke25hbWVzcGFjZX0jJHtuYW1lfWAuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZW5kZXJDb25zdHJ1Y3Rvck1keChsaW5lczogc3RyaW5nW10sIG5hbWU6IHN0cmluZywgaW5mbzogVHlwZUluZm8sIGFsbFR5cGVzOiBNYXA8c3RyaW5nLCBUeXBlSW5mbz4pOiB2b2lkIHtcbiAgY29uc3QgY29uc3RydWN0b3IgPSBpbmZvLmNvbnN0cnVjdG9ySW5mbztcbiAgaWYgKCFjb25zdHJ1Y3Rvcikge1xuICAgIHJldHVybjtcbiAgfVxuICBjb25zdCBjdG9yU2lnID0gYG5ldyAke25hbWV9JHtjb25zdHJ1Y3Rvci5zaWduYXR1cmV9YDtcbiAgY29uc3QgY3RvckRlc2MgPSBjb25zdHJ1Y3Rvci5kZXNjcmlwdGlvblxuICAgID8gYCBkZXNjcmlwdGlvbj1cIiR7ZXNjYXBlSnN4QXR0cmlidXRlKG1hcmtkb3duVG9IdG1sKHJlc29sdmVMaW5rcyhjb25zdHJ1Y3Rvci5kZXNjcmlwdGlvbiwgYWxsVHlwZXMsIGluZm8ubmFtZXNwYWNlKSkpfVwiYFxuICAgIDogJyc7XG4gIGxpbmVzLnB1c2goYDxDb25zdHJ1Y3RvckJsb2NrIHNpZ25hdHVyZT1cIiR7ZXNjYXBlSnN4QXR0cmlidXRlKGN0b3JTaWcpfVwiJHtjdG9yRGVzY30gLz5gLCAnJyk7XG59XG5cbi8qKlxuICogUmVuZGVycyBhbiBlbnVtJ3MgbWVtYmVycy5cbiAqXG4gKiBAcGFyYW0gbGluZXMgLSBUaGUgcGFnZSBsaW5lcyB0byBhcHBlbmQgdG8uXG4gKiBAcGFyYW0gaW5mbyAtIFRoZSBkb2N1bWVudGVkIHR5cGUuXG4gKiBAcGFyYW0gYWxsVHlwZXMgLSBFdmVyeSBkb2N1bWVudGVkIHR5cGUsIGtleWVkIGJ5IGAke25hbWVzcGFjZX0jJHtuYW1lfWAuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZW5kZXJFbnVtUGFnZShsaW5lczogc3RyaW5nW10sIGluZm86IFR5cGVJbmZvLCBhbGxUeXBlczogTWFwPHN0cmluZywgVHlwZUluZm8+KTogdm9pZCB7XG4gIGxpbmVzLnB1c2goYDxUeXBlU2lnbmF0dXJlIGtpbmQ9XCJlbnVtXCIgbmFtZT1cIiR7aW5mby5uYW1lfVwiIC8+YCwgJycpO1xuXG4gIGlmIChpbmZvLmVudW1NZW1iZXJzLmxlbmd0aCA9PT0gMCkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGxpbmVzLnB1c2goJyoqTWVtYmVyczoqKicsICcnLCAnfCBNZW1iZXIgfCBWYWx1ZSB8IERlc2NyaXB0aW9uIHwnLCAnfCA6LS0gfCA6LS0gfCA6LS0gfCcpO1xuICBmb3IgKGNvbnN0IG1lbWJlciBvZiBpbmZvLmVudW1NZW1iZXJzKSB7XG4gICAgY29uc3QgdmFsdWUgPSBtZW1iZXIudmFsdWUgPyBgXFxgJHtlc2NhcGVNYXJrZG93bihtZW1iZXIudmFsdWUpfVxcYGAgOiAnJztcbiAgICBsaW5lcy5wdXNoKGB8IFxcYCR7bWVtYmVyLm5hbWV9XFxgIHwgJHt2YWx1ZX0gfCAke2VzY2FwZU1hcmtkb3duKHJlc29sdmVMaW5rcyhtZW1iZXIuZGVzY3JpcHRpb24sIGFsbFR5cGVzLCBpbmZvLm5hbWVzcGFjZSkpfSB8YCk7XG4gIH1cbiAgbGluZXMucHVzaCgnJyk7XG59XG5cbi8qKlxuICogUmVuZGVyIHRoZSBTdGFybGlnaHQgZnJvbnRtYXR0ZXIgYmxvY2sgKHRocm91Z2ggdGhlIGNsb3NpbmcgYC0tLWAgYW5kIGl0cyBibGFuayBsaW5lKSBzaGFyZWQgYnkgZXZlcnlcbiAqIGdlbmVyYXRlZCBwYWdlIGtpbmQ6IG1vZHVsZSBpbmRleCwgdHlwZSBvdmVydmlldywgcHJvcGVydHksIGFuZCBtZXRob2QuXG4gKlxuICogRXZlcnkgcGFnZSBraW5kIGdvZXMgdGhyb3VnaCBoZXJlIHNvIG5vIGZpZWxkIGNhbiBiZSBlbWl0dGVkIG9uIHNvbWUga2luZHMgYW5kIHNpbGVudGx5IGRyb3BwZWQgb25cbiAqIG90aGVycy4gYGRlc2NyaXB0aW9uYCBpbiBwYXJ0aWN1bGFyIGlzIG5vdCBqdXN0IFNFTyBtZXRhZGF0YSDigJQgaXQgaXMgdGhlIGxpbmUgdGhlIE9HIGNhcmQgcmVuZGVycyB1bmRlclxuICogdGhlIHRpdGxlLCBzbyBhIHBhZ2Uga2luZCB0aGF0IHNraXBwZWQgaXQgcHJvZHVjZWQgYSB0aXRsZS1vbmx5IGNhcmQgbmV4dCB0byBmdWxseSBwb3B1bGF0ZWQgb25lcy5cbiAqXG4gKiBAcGFyYW0gZnJvbnRNYXR0ZXIgLSBUaGUgcGFnZSdzIGZyb250bWF0dGVyIGZpZWxkcy5cbiAqIEByZXR1cm5zIFRoZSBmcm9udG1hdHRlciBsaW5lcywgdGhyb3VnaCB0aGUgY2xvc2luZyBgLS0tYCBhbmQgaXRzIGJsYW5rIGxpbmUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZW5kZXJGcm9udE1hdHRlcihmcm9udE1hdHRlcjogUGFnZUZyb250TWF0dGVyKTogc3RyaW5nW10ge1xuICByZXR1cm4gW1xuICAgICctLS0nLFxuICAgIGB0aXRsZTogXCIke2VzY2FwZVlhbWwoZnJvbnRNYXR0ZXIudGl0bGUpfVwiYCxcbiAgICBgc2x1ZzogXCIke2Zyb250TWF0dGVyLnNsdWd9XCJgLFxuICAgIC4uLihmcm9udE1hdHRlci5kZXNjcmlwdGlvbiA/IFtgZGVzY3JpcHRpb246IFwiJHtlc2NhcGVZYW1sKHN0cmlwTWFya2Rvd24oZnJvbnRNYXR0ZXIuZGVzY3JpcHRpb24pKX1cImBdIDogW10pLFxuICAgIC4uLihmcm9udE1hdHRlci5zaWduYXR1cmUgPyBbYHNpZ25hdHVyZTogXCIke2VzY2FwZVlhbWwodHJ1bmNhdGVTaWduYXR1cmUoZnJvbnRNYXR0ZXIuc2lnbmF0dXJlKSl9XCJgXSA6IFtdKSxcbiAgICAnZWRpdFVybDogZmFsc2UnLFxuICAgICdzaWRlYmFyOicsXG4gICAgYCAgbGFiZWw6IFwiJHtlc2NhcGVZYW1sKGZyb250TWF0dGVyLnNpZGViYXJMYWJlbCl9XCJgLFxuICAgICctLS0nLFxuICAgICcnXG4gIF07XG59XG5cbi8qKlxuICogUmVuZGVycyBhIGZ1bmN0aW9uJ3Mgc2lnbmF0dXJlLCBwYXJhbWV0ZXJzLCByZXR1cm4gdmFsdWUgYW5kIGV4YW1wbGVzLlxuICpcbiAqIEBwYXJhbSBsaW5lcyAtIFRoZSBwYWdlIGxpbmVzIHRvIGFwcGVuZCB0by5cbiAqIEBwYXJhbSBpbmZvIC0gVGhlIGRvY3VtZW50ZWQgdHlwZS5cbiAqIEBwYXJhbSBhbGxUeXBlcyAtIEV2ZXJ5IGRvY3VtZW50ZWQgdHlwZSwga2V5ZWQgYnkgYCR7bmFtZXNwYWNlfSMke25hbWV9YC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlbmRlckZ1bmN0aW9uUGFnZShsaW5lczogc3RyaW5nW10sIGluZm86IFR5cGVJbmZvLCBhbGxUeXBlczogTWFwPHN0cmluZywgVHlwZUluZm8+KTogdm9pZCB7XG4gIGNvbnN0ICRmdW5jdGlvbiA9IGluZm8ubWV0aG9kc1swXTtcbiAgaWYgKCEkZnVuY3Rpb24pIHtcbiAgICByZXR1cm47XG4gIH1cblxuICBsaW5lcy5wdXNoKCcqKlNpZ25hdHVyZToqKicsICcnLCAnYGBgdHMnLCBgZnVuY3Rpb24gJHskZnVuY3Rpb24uc2lnbmF0dXJlfTogJHskZnVuY3Rpb24ucmV0dXJuVHlwZX1gLCAnYGBgJywgJycpO1xuXG4gIGlmICgkZnVuY3Rpb24ucGFyYW1ldGVycy5sZW5ndGggPiAwKSB7XG4gICAgbGluZXMucHVzaCgnKipQYXJhbWV0ZXJzOioqJywgJycsICd8IFBhcmFtZXRlciB8IFR5cGUgfCBEZXNjcmlwdGlvbiB8JywgJ3wgOi0tIHwgOi0tIHwgOi0tIHwnKTtcbiAgICBmb3IgKGNvbnN0IHBhcmFtZXRlciBvZiAkZnVuY3Rpb24ucGFyYW1ldGVycykge1xuICAgICAgbGluZXMucHVzaChcbiAgICAgICAgYHwgXFxgJHtwYXJhbWV0ZXIubmFtZX1cXGAgfCAke2VzY2FwZU1hcmtkb3duKGVzY2FwZU1keEFuZ2xlQnJhY2tldHMocmVuZGVyVHlwZVdpdGhMaW5rcyhwYXJhbWV0ZXIudHlwZSwgYWxsVHlwZXMsIGluZm8ubmFtZSwgaW5mby5uYW1lc3BhY2UpKSl9IHwgJHtlc2NhcGVNYXJrZG93bihyZXNvbHZlTGlua3MocGFyYW1ldGVyLmRlc2NyaXB0aW9uLCBhbGxUeXBlcywgaW5mby5uYW1lc3BhY2UpKX0gfGBcbiAgICAgICk7XG4gICAgfVxuICAgIGxpbmVzLnB1c2goJycpO1xuICB9XG5cbiAgY29uc3QgcmV0dXJuRGVzYyA9ICRmdW5jdGlvbi5yZXR1cm5EZXNjcmlwdGlvbiA/IGAg4oCUICR7ZXNjYXBlTWR4UHJvc2UocmVzb2x2ZUxpbmtzKCRmdW5jdGlvbi5yZXR1cm5EZXNjcmlwdGlvbiwgYWxsVHlwZXMsIGluZm8ubmFtZXNwYWNlKSl9YCA6ICcnO1xuICBsaW5lcy5wdXNoKGAqKlJldHVybnM6KiogJHtlc2NhcGVNZHhCcmFjZXMoZXNjYXBlTWR4QW5nbGVCcmFja2V0cyhyZW5kZXJUeXBlV2l0aExpbmtzKCRmdW5jdGlvbi5yZXR1cm5UeXBlLCBhbGxUeXBlcywgaW5mby5uYW1lLCBpbmZvLm5hbWVzcGFjZSkpKX0ke3JldHVybkRlc2N9YCwgJycpO1xuXG4gIGZvciAoY29uc3QgZXhhbXBsZSBvZiAkZnVuY3Rpb24uZXhhbXBsZXMpIHtcbiAgICBsaW5lcy5wdXNoKCcqKkV4YW1wbGU6KionLCAnJywgcmVuZGVyRXhhbXBsZU1keChleGFtcGxlLCBhbGxUeXBlcywgaW5mby5uYW1lc3BhY2UpLCAnJyk7XG4gIH1cbn1cblxuLyoqXG4gKiBSZW5kZXJzIG9uZSBtZXRob2Qgb3ZlcmxvYWQuXG4gKlxuICogQHBhcmFtIGxpbmVzIC0gVGhlIHBhZ2UgbGluZXMgdG8gYXBwZW5kIHRvLlxuICogQHBhcmFtIG92ZXJsb2FkIC0gVGhlIG92ZXJsb2FkLlxuICogQHBhcmFtIHR5cGVOYW1lIC0gVGhlIG5hbWUgb2YgdGhlIHR5cGUgdGhlIG1ldGhvZCBiZWxvbmdzIHRvLlxuICogQHBhcmFtIG5hbWVzcGFjZSAtIFRoZSBuYW1lc3BhY2Ugb2YgdGhlIHR5cGUgdGhlIG1ldGhvZCBiZWxvbmdzIHRvLlxuICogQHBhcmFtIGFsbFR5cGVzIC0gRXZlcnkgZG9jdW1lbnRlZCB0eXBlLCBrZXllZCBieSBgJHtuYW1lc3BhY2V9IyR7bmFtZX1gLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVuZGVyTWV0aG9kT3ZlcmxvYWRNZHgobGluZXM6IHN0cmluZ1tdLCBvdmVybG9hZDogTWVtYmVySW5mbywgdHlwZU5hbWU6IHN0cmluZywgbmFtZXNwYWNlOiBzdHJpbmcsIGFsbFR5cGVzOiBNYXA8c3RyaW5nLCBUeXBlSW5mbz4pOiB2b2lkIHtcbiAgY29uc3Qgc2lnID0gYCR7b3ZlcmxvYWQuc2lnbmF0dXJlfTogJHtvdmVybG9hZC5yZXR1cm5UeXBlfWA7XG4gIGNvbnN0IHN0YXRpY0F0dHJpYnV0ZSA9IG92ZXJsb2FkLmlzU3RhdGljID8gJyBpc1N0YXRpYz17dHJ1ZX0nIDogJyc7XG4gIGNvbnN0IGRlc2NBdHRyaWJ1dGUgPSBvdmVybG9hZC5kZXNjcmlwdGlvbiA/IGAgZGVzY3JpcHRpb249XCIke2VzY2FwZUpzeEF0dHJpYnV0ZShtYXJrZG93blRvSHRtbChyZXNvbHZlTGlua3Mob3ZlcmxvYWQuZGVzY3JpcHRpb24sIGFsbFR5cGVzLCBuYW1lc3BhY2UpKSl9XCJgIDogJyc7XG4gIGNvbnN0IHJlbWFya3NBdHRyaWJ1dGUgPSBvdmVybG9hZC5yZW1hcmtzID8gYCByZW1hcmtzPVwiJHtlc2NhcGVKc3hBdHRyaWJ1dGUobWFya2Rvd25Ub0h0bWwocmVzb2x2ZUxpbmtzKG92ZXJsb2FkLnJlbWFya3MsIGFsbFR5cGVzLCBuYW1lc3BhY2UpKSl9XCJgIDogJyc7XG4gIGNvbnN0IHNpbmNlQXR0cmlidXRlID0gb3ZlcmxvYWQuc2luY2UgPyBgIHNpbmNlPVwiJHtlc2NhcGVKc3hBdHRyaWJ1dGUob3ZlcmxvYWQuc2luY2UpfVwiYCA6ICcnO1xuICBjb25zdCByZXR1cm5UeXBlQXR0cmlidXRlID0gYCByZXR1cm5UeXBlPVwiJHtlc2NhcGVKc3hBdHRyaWJ1dGUobWFya2Rvd25Ub0h0bWwocmVuZGVyVHlwZVdpdGhMaW5rcyhvdmVybG9hZC5yZXR1cm5UeXBlLCBhbGxUeXBlcywgdHlwZU5hbWUsIG5hbWVzcGFjZSkpKX1cImA7XG4gIGNvbnN0IHJldHVybkRlc2NBdHRyaWJ1dGUgPSBvdmVybG9hZC5yZXR1cm5EZXNjcmlwdGlvblxuICAgID8gYCByZXR1cm5EZXNjcmlwdGlvbj1cIiR7ZXNjYXBlSnN4QXR0cmlidXRlKG1hcmtkb3duVG9IdG1sKHJlc29sdmVMaW5rcyhvdmVybG9hZC5yZXR1cm5EZXNjcmlwdGlvbiwgYWxsVHlwZXMsIG5hbWVzcGFjZSkpKX1cImBcbiAgICA6ICcnO1xuICBjb25zdCBleGFtcGxlc0F0dHJpYnV0ZSA9IG92ZXJsb2FkLmV4YW1wbGVzLmxlbmd0aCA+IDAgPyBgIGV4YW1wbGVzPXske0pTT04uc3RyaW5naWZ5KG92ZXJsb2FkLmV4YW1wbGVzKX19YCA6ICcnO1xuXG4gIGNvbnN0IHBhcmFtcyA9IG92ZXJsb2FkLnBhcmFtZXRlcnMubWFwKChwKSA9PiAoe1xuICAgIGRlc2NyaXB0aW9uOiBtYXJrZG93blRvSHRtbChwLmRlc2NyaXB0aW9uIHx8IChwLm5hbWUuZW5kc1dpdGgoJz8nKSA/ICcqKE9wdGlvbmFsKSonIDogJycpKSxcbiAgICBuYW1lOiBwLm5hbWUsXG4gICAgdHlwZTogbWFya2Rvd25Ub0h0bWwocmVuZGVyVHlwZVdpdGhMaW5rcyhwLnR5cGUsIGFsbFR5cGVzLCB0eXBlTmFtZSwgbmFtZXNwYWNlKSlcbiAgfSkpO1xuICBjb25zdCBwYXJhbXNBdHRyaWJ1dGUgPSBwYXJhbXMubGVuZ3RoID4gMCA/IGAgcGFyYW1ldGVycz17JHtKU09OLnN0cmluZ2lmeShwYXJhbXMpfX1gIDogJyc7XG5cbiAgbGluZXMucHVzaChcbiAgICBgPE1lbWJlckRldGFpbCR7c3RhdGljQXR0cmlidXRlfSBzaWduYXR1cmU9XCIke2VzY2FwZUpzeEF0dHJpYnV0ZShzaWcpfVwiJHtkZXNjQXR0cmlidXRlfSR7cmVtYXJrc0F0dHJpYnV0ZX0ke3NpbmNlQXR0cmlidXRlfSR7cmV0dXJuVHlwZUF0dHJpYnV0ZX0ke3JldHVybkRlc2NBdHRyaWJ1dGV9JHtwYXJhbXNBdHRyaWJ1dGV9JHtleGFtcGxlc0F0dHJpYnV0ZX0gLz5gLFxuICAgICcnXG4gICk7XG59XG5cbi8qKlxuICogUmVuZGVycyBhIHR5cGUncyBtZXRob2QgdGFibGUuXG4gKlxuICogQHBhcmFtIGxpbmVzIC0gVGhlIHBhZ2UgbGluZXMgdG8gYXBwZW5kIHRvLlxuICogQHBhcmFtIGluZm8gLSBUaGUgZG9jdW1lbnRlZCB0eXBlLlxuICogQHBhcmFtIGFsbFR5cGVzIC0gRXZlcnkgZG9jdW1lbnRlZCB0eXBlLCBrZXllZCBieSBgJHtuYW1lc3BhY2V9IyR7bmFtZX1gLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVuZGVyTWV0aG9kVGFibGVNZHgobGluZXM6IHN0cmluZ1tdLCBpbmZvOiBUeXBlSW5mbywgYWxsVHlwZXM6IE1hcDxzdHJpbmcsIFR5cGVJbmZvPik6IHZvaWQge1xuICBjb25zdCBtZXRob2RzID0gWy4uLmluZm8ubWV0aG9kc10uc29ydCgoYSwgYikgPT4ge1xuICAgIGlmIChhLmlzU3RhdGljICE9PSBiLmlzU3RhdGljKSB7XG4gICAgICByZXR1cm4gYS5pc1N0YXRpYyA/IDEgOiAtMTtcbiAgICB9XG4gICAgcmV0dXJuIGEubmFtZS5sb2NhbGVDb21wYXJlKGIubmFtZSk7XG4gIH0pO1xuICBpZiAobWV0aG9kcy5sZW5ndGggPT09IDApIHtcbiAgICByZXR1cm47XG4gIH1cbiAgbGluZXMucHVzaCgnPE1ldGhvZFRhYmxlIHJvd3M9e1snKTtcbiAgZm9yIChjb25zdCBtZXRob2Qgb2YgbWV0aG9kcykge1xuICAgIGNvbnN0IGRlc2MgPSBlc2NhcGVKc1N0cmluZyhtYXJrZG93blRvSHRtbChyZXNvbHZlTGlua3MobWV0aG9kLmRlc2NyaXB0aW9uLCBhbGxUeXBlcywgaW5mby5uYW1lc3BhY2UpKSk7XG4gICAgY29uc3Qgc3RhdGljUHJlZml4ID0gbWV0aG9kLmlzU3RhdGljID8gJ3N0YXRpYyAnIDogJyc7XG4gICAgY29uc3Qgc2hvcnRQYXJhbXMgPSBtZXRob2QucGFyYW1ldGVycy5tYXAoKHAsIGluZGV4KSA9PiB7XG4gICAgICByZXR1cm4gaW5kZXggPT09IDAgJiYgRVZFTlRfTUVUSE9EUy5oYXMobWV0aG9kLm5hbWUpICYmIChwLnR5cGUuc3RhcnRzV2l0aCgnXCInKSB8fCBwLnR5cGUuc3RhcnRzV2l0aCgnXFwnJykpID8gcC50eXBlLnJlcGxhY2VBbGwoJ1wiJywgJ1xcJycpIDogcC5uYW1lO1xuICAgIH0pLmpvaW4oJywgJyk7XG4gICAgY29uc3Qgc2hvcnRTaWcgPSBgJHtzdGF0aWNQcmVmaXh9JHttZXRob2QubmFtZX0oJHtzaG9ydFBhcmFtc30pYDtcbiAgICBjb25zdCBzaWcgPSBlc2NhcGVKc1N0cmluZyhzaG9ydFNpZyk7XG4gICAgY29uc3Qgc2x1ZyA9IG92ZXJsb2FkUm91dGVTZWdtZW50KG1ldGhvZC5vdmVybG9hZEtleSk7XG4gICAgY29uc3QgcmV0dXJuVHlwZSA9IG1hcmtkb3duVG9IdG1sKHJlbmRlclR5cGVXaXRoTGlua3MobWV0aG9kLnJldHVyblR5cGUsIGFsbFR5cGVzLCBpbmZvLm5hbWUsIGluZm8ubmFtZXNwYWNlKSk7XG4gICAgY29uc3QgaW5oZXJpdGVkQXR0cmlidXRlID0gbWV0aG9kLmluaGVyaXRlZEZyb21cbiAgICAgID8gYCwgaW5oZXJpdGVkRnJvbTogXCIke2VzY2FwZUpzU3RyaW5nKG1hcmtkb3duVG9IdG1sKHR5cGVMaW5rKG1ldGhvZC5pbmhlcml0ZWRGcm9tLCBhbGxUeXBlcywgaW5mby5uYW1lc3BhY2UpKSl9XCJgXG4gICAgICA6ICcnO1xuICAgIGNvbnN0IGhyZWYgPSBtZW1iZXJIcmVmKHNsdWcsIG1ldGhvZC5pbmhlcml0ZWRGcm9tLCBhbGxUeXBlcywgaW5mby5uYW1lc3BhY2UpO1xuICAgIGxpbmVzLnB1c2goXG4gICAgICBgICB7IHNpZ25hdHVyZTogXCIke3NpZ31cIiwgaHJlZjogXCIke2VzY2FwZUpzU3RyaW5nKGhyZWYpfVwiLCByZXR1cm5zOiBcIiR7ZXNjYXBlSnNTdHJpbmcocmV0dXJuVHlwZSl9XCIsIGRlc2NyaXB0aW9uOiBcIiR7ZGVzY31cIiR7aW5oZXJpdGVkQXR0cmlidXRlfSB9LGBcbiAgICApO1xuICB9XG4gIGxpbmVzLnB1c2goJ119IC8+JywgJycpO1xufVxuXG4vKipcbiAqIFJlbmRlcnMgYSB0eXBlJ3MgcHJvcGVydHkgdGFibGUuXG4gKlxuICogQHBhcmFtIGxpbmVzIC0gVGhlIHBhZ2UgbGluZXMgdG8gYXBwZW5kIHRvLlxuICogQHBhcmFtIGluZm8gLSBUaGUgZG9jdW1lbnRlZCB0eXBlLlxuICogQHBhcmFtIGFsbFR5cGVzIC0gRXZlcnkgZG9jdW1lbnRlZCB0eXBlLCBrZXllZCBieSBgJHtuYW1lc3BhY2V9IyR7bmFtZX1gLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVuZGVyUHJvcGVydHlUYWJsZU1keChsaW5lczogc3RyaW5nW10sIGluZm86IFR5cGVJbmZvLCBhbGxUeXBlczogTWFwPHN0cmluZywgVHlwZUluZm8+KTogdm9pZCB7XG4gIGNvbnN0IHByb3BlcnRpZXMgPSBpbmZvLnByb3BlcnRpZXM7XG4gIGlmIChwcm9wZXJ0aWVzLmxlbmd0aCA9PT0gMCkge1xuICAgIHJldHVybjtcbiAgfVxuICBsaW5lcy5wdXNoKCc8UHJvcGVydHlUYWJsZSByb3dzPXtbJyk7XG4gIGZvciAoY29uc3QgcHJvcGVydHkgb2YgcHJvcGVydGllcykge1xuICAgIGNvbnN0IGRlc2MgPSBlc2NhcGVKc1N0cmluZyhtYXJrZG93blRvSHRtbChyZXNvbHZlTGlua3MocHJvcGVydHkuZGVzY3JpcHRpb24sIGFsbFR5cGVzLCBpbmZvLm5hbWVzcGFjZSkpKTtcbiAgICBjb25zdCB0eXBlID0gbWFya2Rvd25Ub0h0bWwocmVuZGVyVHlwZVdpdGhMaW5rcyhwcm9wZXJ0eS50eXBlLCBhbGxUeXBlcywgaW5mby5uYW1lLCBpbmZvLm5hbWVzcGFjZSkpO1xuICAgIGNvbnN0IGluaGVyaXRlZEF0dHJpYnV0ZSA9IHByb3BlcnR5LmluaGVyaXRlZEZyb21cbiAgICAgID8gYCwgaW5oZXJpdGVkRnJvbTogXCIke2VzY2FwZUpzU3RyaW5nKG1hcmtkb3duVG9IdG1sKHR5cGVMaW5rKHByb3BlcnR5LmluaGVyaXRlZEZyb20sIGFsbFR5cGVzLCBpbmZvLm5hbWVzcGFjZSkpKX1cImBcbiAgICAgIDogJyc7XG4gICAgY29uc3QgaHJlZiA9IG1lbWJlckhyZWYobWVtYmVyUm91dGVTZWdtZW50KHByb3BlcnR5Lm5hbWUpLCBwcm9wZXJ0eS5pbmhlcml0ZWRGcm9tLCBhbGxUeXBlcywgaW5mby5uYW1lc3BhY2UpO1xuICAgIGxpbmVzLnB1c2goXG4gICAgICBgICB7IG5hbWU6IFwiJHtlc2NhcGVKc1N0cmluZyhwcm9wZXJ0eS5uYW1lKX1cIiwgaHJlZjogXCIke2VzY2FwZUpzU3RyaW5nKGhyZWYpfVwiLCB0eXBlOiBcIiR7ZXNjYXBlSnNTdHJpbmcodHlwZSl9XCIsIGRlc2NyaXB0aW9uOiBcIiR7ZGVzY31cIiR7aW5oZXJpdGVkQXR0cmlidXRlfSB9LGBcbiAgICApO1xuICB9XG4gIGxpbmVzLnB1c2goJ119IC8+JywgJycpO1xufVxuXG4vKipcbiAqIFJlbmRlcnMgYSB0eXBlIGFsaWFzJ3Mgc2lnbmF0dXJlLlxuICpcbiAqIEBwYXJhbSBsaW5lcyAtIFRoZSBwYWdlIGxpbmVzIHRvIGFwcGVuZCB0by5cbiAqIEBwYXJhbSBpbmZvIC0gVGhlIGRvY3VtZW50ZWQgdHlwZS5cbiAqIEBwYXJhbSBhbGxUeXBlcyAtIEV2ZXJ5IGRvY3VtZW50ZWQgdHlwZSwga2V5ZWQgYnkgYCR7bmFtZXNwYWNlfSMke25hbWV9YC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlbmRlclR5cGVBbGlhc1BhZ2UobGluZXM6IHN0cmluZ1tdLCBpbmZvOiBUeXBlSW5mbywgYWxsVHlwZXM6IE1hcDxzdHJpbmcsIFR5cGVJbmZvPik6IHZvaWQge1xuICBjb25zdCB0eXBlUGFyYW1zQXR0cmlidXRlID0gaW5mby50eXBlUGFyYW1ldGVycy5sZW5ndGggPiAwID8gYCB0eXBlUGFyYW1zPXske0pTT04uc3RyaW5naWZ5KGluZm8udHlwZVBhcmFtZXRlcnMpfX1gIDogJyc7XG4gIGxpbmVzLnB1c2goYDxUeXBlU2lnbmF0dXJlIGtpbmQ9XCJ0eXBlXCIgbmFtZT1cIiR7aW5mby5uYW1lfVwiJHt0eXBlUGFyYW1zQXR0cmlidXRlfSAvPmAsICcnKTtcblxuICBjb25zdCByaHMgPSBpbmZvLnR5cGVBbGlhc1RleHQgPz8gJ3Vua25vd24nO1xuICBsaW5lcy5wdXNoKFxuICAgICcqKlNpZ25hdHVyZToqKicsXG4gICAgJycsXG4gICAgJ2BgYHRzJyxcbiAgICBgdHlwZSAke2dldERpc3BsYXlOYW1lKGluZm8ubmFtZSwgaW5mbyl9ID0gJHtyaHN9YCxcbiAgICAnYGBgJyxcbiAgICAnJyxcbiAgICBgKipUeXBlOioqICR7ZXNjYXBlTWR4QnJhY2VzKGVzY2FwZU1keEFuZ2xlQnJhY2tldHMocmVuZGVyVHlwZVdpdGhMaW5rcyhyaHMsIGFsbFR5cGVzLCBpbmZvLm5hbWUsIGluZm8ubmFtZXNwYWNlKSkpfWAsXG4gICAgJydcbiAgKTtcbn1cblxuLyoqXG4gKiBSZW5kZXJzIGEgdmFyaWFibGUncyBkZWNsYXJhdGlvbiBhbmQgdHlwZS5cbiAqXG4gKiBAcGFyYW0gbGluZXMgLSBUaGUgcGFnZSBsaW5lcyB0byBhcHBlbmQgdG8uXG4gKiBAcGFyYW0gbmFtZSAtIFRoZSB0eXBlJ3MgbmFtZS5cbiAqIEBwYXJhbSBpbmZvIC0gVGhlIGRvY3VtZW50ZWQgdHlwZS5cbiAqIEBwYXJhbSBhbGxUeXBlcyAtIEV2ZXJ5IGRvY3VtZW50ZWQgdHlwZSwga2V5ZWQgYnkgYCR7bmFtZXNwYWNlfSMke25hbWV9YC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlbmRlclZhcmlhYmxlUGFnZShsaW5lczogc3RyaW5nW10sIG5hbWU6IHN0cmluZywgaW5mbzogVHlwZUluZm8sIGFsbFR5cGVzOiBNYXA8c3RyaW5nLCBUeXBlSW5mbz4pOiB2b2lkIHtcbiAgY29uc3Qga2V5d29yZCA9IGluZm8udmFyaWFibGVLZXl3b3JkID8/ICdsZXQnO1xuICBjb25zdCB2YXJpYWJsZVR5cGUgPSBpbmZvLnZhcmlhYmxlVHlwZSA/PyAndW5rbm93bic7XG4gIGxpbmVzLnB1c2goXG4gICAgJyoqU2lnbmF0dXJlOioqJyxcbiAgICAnJyxcbiAgICAnYGBgdHMnLFxuICAgIGAke2tleXdvcmR9ICR7bmFtZX06ICR7dmFyaWFibGVUeXBlfWAsXG4gICAgJ2BgYCcsXG4gICAgJycsXG4gICAgYCoqVHlwZToqKiAke2VzY2FwZU1keEJyYWNlcyhlc2NhcGVNZHhBbmdsZUJyYWNrZXRzKHJlbmRlclR5cGVXaXRoTGlua3ModmFyaWFibGVUeXBlLCBhbGxUeXBlcywgbmFtZSwgaW5mby5uYW1lc3BhY2UpKSl9YCxcbiAgICAnJ1xuICApO1xufVxuXG4vKipcbiAqIENvbnZlcnRzIGEgbmFtZXNwYWNlIHRyZWUgbm9kZSBpbnRvIGEgc2lkZWJhciBncm91cC5cbiAqXG4gKiBAcGFyYW0gbm9kZSAtIFRoZSBub2RlLlxuICogQHBhcmFtIGxhYmVsIC0gVGhlIGdyb3VwJ3MgbGFiZWwuXG4gKiBAcmV0dXJucyBUaGUgc2lkZWJhciBncm91cC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNpZGViYXJUcmVlVG9FbnRyaWVzKG5vZGU6IFNpZGViYXJUcmVlTm9kZSwgbGFiZWw6IHN0cmluZyk6IFNpZGViYXJFbnRyeSB7XG4gIGNvbnN0IGl0ZW1zOiAoU2lkZWJhckVudHJ5IHwgU2lkZWJhckxpbmspW10gPSBbXTtcblxuICAvLyBDaGlsZCBkaXJlY3RvcnkgZ3JvdXBzIGZpcnN0IChiZWZvcmUgdGhpcyBtb2R1bGUncyBvd24gcGFnZXMpXG4gIGNvbnN0IHNvcnRlZENoaWxkcmVuID0gWy4uLm5vZGUuY2hpbGRyZW5dLnNvcnQoKFthXSwgW2JdKSA9PiBhLmxvY2FsZUNvbXBhcmUoYikpO1xuICBmb3IgKGNvbnN0IFtjaGlsZE5hbWUsIGNoaWxkXSBvZiBzb3J0ZWRDaGlsZHJlbikge1xuICAgIGl0ZW1zLnB1c2goc2lkZWJhclRyZWVUb0VudHJpZXMoY2hpbGQsIGNoaWxkTmFtZSkpO1xuICB9XG5cbiAgLy8gVGhpcyBtb2R1bGUncyBvd24gb3ZlcnZpZXcgcGFnZSArIHR5cGUvZnVuY3Rpb24gcGFnZXMgKGluZGl2aWR1YWwgbWVtYmVycyBhcmUgbm90IGxpc3RlZCkuXG4gIC8vIFNpZGViYXIgYGxpbmtgIGZpZWxkcyBtdXN0IE5PVCBlbWJlZCBCQVNFX1BBVEg6IFN0YXJsaWdodCBwcmVwZW5kcyB0aGUgY29uZmlnIGBiYXNlYCB0byBldmVyeVxuICAvLyBzaWRlYmFyIGxpbmsgaXRzZWxmLCBzbyBpbmNsdWRpbmcgaXQgaGVyZSB3b3VsZCBkb3VibGUgdGhlIGJhc2UgKGUuZy4gYC9iYXNlL2Jhc2UvYXBpLy4uLmAg4oaSIDQwNCkuXG4gIC8vIFRoaXMgZGlmZmVycyBmcm9tIGluLWNvbnRlbnQgbGlua3MsIHdoaWNoIGFyZSByYXcgYW5jaG9ycyB0aGF0IFN0YXJsaWdodCBkb2VzIG5vdCBiYXNlLXByZXBlbmQuXG4gIGlmIChub2RlLnR5cGVzLmxlbmd0aCA+IDApIHtcbiAgICBjb25zdCB7IG5hbWVzcGFjZSB9ID0gZW5zdXJlTm9uTnVsbGFibGUobm9kZS50eXBlc1swXSk7XG4gICAgaXRlbXMucHVzaCh7IGxhYmVsOiAnT3ZlcnZpZXcnLCBsaW5rOiBgL2FwaS8ke25hbWVzcGFjZX0vYCB9KTtcbiAgICBjb25zdCBzb3J0ZWRUeXBlcyA9IFsuLi5ub2RlLnR5cGVzXS5zb3J0KChhLCBiKSA9PiBhLm5hbWUubG9jYWxlQ29tcGFyZShiLm5hbWUpKTtcbiAgICBmb3IgKGNvbnN0IHQgb2Ygc29ydGVkVHlwZXMpIHtcbiAgICAgIGl0ZW1zLnB1c2goeyBsYWJlbDogdC5uYW1lLCBsaW5rOiBgL2FwaS8ke3QubmFtZXNwYWNlfS8ke3RvVHlwZVJvdXRlU2VnbWVudCh0Lm5hbWVzcGFjZSwgdC5uYW1lKX0vYCB9KTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4geyBjb2xsYXBzZWQ6IHRydWUsIGl0ZW1zLCBsYWJlbCB9O1xufVxuXG4vLyBTZXJ2ZXMgYm90aCBhcyB0aGUgcm9vdCBBUEkgcGFnZSdzIHByb3NlIGFuZCAoc3RyaXBwZWQpIGFzIGl0cyBgZGVzY3JpcHRpb25gIGZyb250bWF0dGVyLlxuLy8gU2hhcmluZyBvbmUgZnVuY3Rpb24ga2VlcHMgdGhlIHBhZ2UgYW5kIGl0cyBPRyBjYXJkIGZyb20gZHJpZnRpbmcgYXBhcnQuXG5mdW5jdGlvbiBnZXRBcGlJbmRleEludHJvKG5hbWVzcGFjZXM6IHJlYWRvbmx5IHN0cmluZ1tdKTogc3RyaW5nIHtcbiAgY29uc3QgeyBwYWNrYWdlTmFtZSB9ID0gZ2V0QXBpRG9jU2V0dGluZ3MoKTtcbiAgY29uc3QgW2V4YW1wbGVOYW1lc3BhY2UgPSAnbW9kdWxlJ10gPSBuYW1lc3BhY2VzO1xuICByZXR1cm4gYFRoZSBjb21wbGV0ZSBBUEkgcmVmZXJlbmNlIGZvciBcXGAke3BhY2thZ2VOYW1lfVxcYCwgZ2VuZXJhdGVkIGZyb20gaXRzIFRTRG9jLiBgXG4gICAgKyBgRWFjaCBtb2R1bGUgYmVsb3cgbWFwcyB0byBhbiBpbXBvcnQgc3VicGF0aCAoZS5nLiB0aGUgXFxgJHtleGFtcGxlTmFtZXNwYWNlfVxcYCBtb2R1bGUgaXMgXFxgJHtwYWNrYWdlTmFtZX0vJHtleGFtcGxlTmFtZXNwYWNlfVxcYCkuYDtcbn1cblxuZnVuY3Rpb24gZ2V0Q29tcG9uZW50SW1wb3J0cyhjb21wb25lbnROYW1lczogcmVhZG9ubHkgc3RyaW5nW10pOiBzdHJpbmdbXSB7XG4gIHJldHVybiBjb21wb25lbnROYW1lcy5tYXAoKGNvbXBvbmVudE5hbWUpID0+IGBpbXBvcnQgJHtjb21wb25lbnROYW1lfSBmcm9tIFwiJHtBUElfQ09NUE9ORU5UU19JTVBPUlRfUFJFRklYfS8ke2NvbXBvbmVudE5hbWV9LmFzdHJvXCI7YCk7XG59XG5cbmZ1bmN0aW9uIHJlbmRlck5hbWVzcGFjZVRhYmxlKFxuICBsaW5lczogc3RyaW5nW10sXG4gIGhlYWRpbmc6IHN0cmluZyxcbiAgY29sdW1uTGFiZWw6IHN0cmluZyxcbiAgZW50cmllczogVHlwZUluZm9bXSxcbiAgYWxsVHlwZXM6IE1hcDxzdHJpbmcsIFR5cGVJbmZvPixcbiAgbmFtZXNwYWNlOiBzdHJpbmdcbik6IHZvaWQge1xuICBpZiAoZW50cmllcy5sZW5ndGggPT09IDApIHtcbiAgICByZXR1cm47XG4gIH1cbiAgY29uc3Qgc29ydGVkID0gWy4uLmVudHJpZXNdLnNvcnQoKGEsIGIpID0+IGEubmFtZS5sb2NhbGVDb21wYXJlKGIubmFtZSkpO1xuICBsaW5lcy5wdXNoKGAjIyAke2hlYWRpbmd9YCwgJycsIGB8ICR7Y29sdW1uTGFiZWx9IHwgRGVzY3JpcHRpb24gfGAsICd8IDotLSB8IDotLSB8Jyk7XG4gIGZvciAoY29uc3QgZW50cnkgb2Ygc29ydGVkKSB7XG4gICAgbGluZXMucHVzaChgfCBbJHtlbnRyeS5uYW1lfV0oLi8ke3RvVHlwZVJvdXRlU2VnbWVudChlbnRyeS5uYW1lc3BhY2UsIGVudHJ5Lm5hbWUpfS8pIHwgJHtlc2NhcGVNYXJrZG93bihyZXNvbHZlTGlua3MoZW50cnkuZGVzY3JpcHRpb24sIGFsbFR5cGVzLCBuYW1lc3BhY2UpKX0gfGApO1xuICB9XG4gIGxpbmVzLnB1c2goJycpO1xufVxuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBT0EscUJBQXVDO0FBQ3ZDLHlCQUFrQztBQUNsQyxzQkFBMEI7QUFDMUIsdUJBQXFCO0FBWXJCLCtCQUE4QjtBQUM5QixvQ0FXTztBQUNQLDhCQUFrQztBQUNsQyxnQ0FrQk87QUFDUCw4QkFBNkM7QUFFN0MsTUFBTSxjQUFjO0FBUXBCLGVBQXNCLHdCQUNwQixjQUNBLFVBQ2U7QUFDZixRQUFNLFlBQVksMEJBQTBCLGNBQWMsUUFBUTtBQUVsRSxhQUFXLENBQUMsS0FBSyxFQUFFLFNBQVMsU0FBUyxDQUFDLEtBQUssY0FBYztBQUN2RCxVQUFNLGdCQUFnQixVQUFVLElBQUksR0FBRyxLQUFLLENB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QixVQUFNLEVBQUUsVUFBVSxRQUFJLHNDQUFrQixLQUFLLE1BQU0sQ0FBQyxDQUFDO0FBQ3JELFVBQU0sS0FBSyxFQUFFLE9BQU8sWUFBWSxNQUFNLFFBQVEsU0FBUyxJQUFJLENBQUM7QUFDNUQsVUFBTSxjQUFjLENBQUMsR0FBRyxLQUFLLEtBQUssRUFBRSxLQUFLLENBQUMsR0FBRyxNQUFNLEVBQUUsS0FBSyxjQUFjLEVBQUUsSUFBSSxDQUFDO0FBQy9FLGVBQVcsS0FBSyxhQUFhO0FBQzNCLFlBQU0sS0FBSyxFQUFFLE9BQU8sRUFBRSxNQUFNLE1BQU0sUUFBUSxFQUFFLFNBQVMsUUFBSSxrREFBbUIsRUFBRSxXQUFXLEVBQUUsSUFBSSxDQUFDLElBQUksQ0FBQztBQUFBLElBQ3ZHO0FBQUEsRUFDRjtBQUVBLFNBQU8sRUFBRSxXQUFXLE1BQU0sT0FBTyxNQUFNO0FBQ3pDO0FBSUEsU0FBUyxpQkFBaUIsWUFBdUM7QUFDL0QsUUFBTSxFQUFFLFlBQVksUUFBSSwyQ0FBa0I7QUFDMUMsUUFBTSxDQUFDLG1CQUFtQixRQUFRLElBQUk7QUFDdEMsU0FBTyxvQ0FBb0MsV0FBVyx5RkFDUyxnQkFBZ0Isa0JBQWtCLFdBQVcsSUFBSSxnQkFBZ0I7QUFDbEk7QUFFQSxTQUFTLG9CQUFvQixnQkFBNkM7QUFDeEUsU0FBTyxlQUFlLElBQUksQ0FBQyxrQkFBa0IsVUFBVSxhQUFhLFVBQVUsb0RBQTRCLElBQUksYUFBYSxVQUFVO0FBQ3ZJO0FBRUEsU0FBUyxxQkFDUCxPQUNBLFNBQ0EsYUFDQSxTQUNBLFVBQ0EsV0FDTTtBQUNOLE1BQUksUUFBUSxXQUFXLEdBQUc7QUFDeEI7QUFBQSxFQUNGO0FBQ0EsUUFBTSxTQUFTLENBQUMsR0FBRyxPQUFPLEVBQUUsS0FBSyxDQUFDLEdBQUcsTUFBTSxFQUFFLEtBQUssY0FBYyxFQUFFLElBQUksQ0FBQztBQUN2RSxRQUFNLEtBQUssTUFBTSxPQUFPLElBQUksSUFBSSxLQUFLLFdBQVcsb0JBQW9CLGVBQWU7QUFDbkYsYUFBVyxTQUFTLFFBQVE7QUFDMUIsVUFBTSxLQUFLLE1BQU0sTUFBTSxJQUFJLFdBQU8sa0RBQW1CLE1BQU0sV0FBVyxNQUFNLElBQUksQ0FBQyxZQUFRLDhDQUFlLDRDQUFhLE1BQU0sYUFBYSxVQUFVLFNBQVMsQ0FBQyxDQUFDLElBQUk7QUFBQSxFQUNuSztBQUNBLFFBQU0sS0FBSyxFQUFFO0FBQ2Y7IiwibmFtZXMiOltdfQ==
|
|
@@ -59,6 +59,7 @@ __export(og_images_exports, {
|
|
|
59
59
|
generateOgImages: () => generateOgImages
|
|
60
60
|
});
|
|
61
61
|
module.exports = __toCommonJS(og_images_exports);
|
|
62
|
+
var import_node_crypto = require('node:crypto');
|
|
62
63
|
var import_node_fs = require('node:fs');
|
|
63
64
|
var import_promises = require('node:fs/promises');
|
|
64
65
|
var import_posix = require('node:path/posix');
|
|
@@ -84,8 +85,10 @@ async function generateOgImages(options) {
|
|
|
84
85
|
const pages = [];
|
|
85
86
|
await walkDirectory(contentDocsDirectory, contentDocsDirectory, pages);
|
|
86
87
|
console.warn(`OG images: found ${String(pages.length)} pages`);
|
|
88
|
+
const logoHash = await computeLogoHash(faviconPath);
|
|
87
89
|
const manifest = await loadCacheManifest(manifestPath);
|
|
88
|
-
const
|
|
90
|
+
const cards = manifest?.logoHash === logoHash ? { ...manifest.cards } : {};
|
|
91
|
+
const changedPages = pages.filter((page) => cards[page.slug] !== page.hash);
|
|
89
92
|
console.warn(`OG images: ${String(changedPages.length)} changed / ${String(pages.length)} total`);
|
|
90
93
|
if (changedPages.length === 0) {
|
|
91
94
|
console.warn("All OG images up to date.");
|
|
@@ -95,13 +98,17 @@ async function generateOgImages(options) {
|
|
|
95
98
|
if (!logoDataUri) {
|
|
96
99
|
console.warn(`OG images: favicon not found (${faviconPath}); rendering cards without a logo.`);
|
|
97
100
|
}
|
|
98
|
-
await generateImagesWithPool({ brandText, changedPages, fonts, logoDataUri,
|
|
101
|
+
await generateImagesWithPool({ brandText, cards, changedPages, fonts, logoDataUri, outputDirectory });
|
|
102
|
+
const newManifest = { cards, logoHash };
|
|
99
103
|
await (0, import_promises.mkdir)((0, import_posix.dirname)(manifestPath), { recursive: true });
|
|
100
|
-
await (0, import_promises.writeFile)(manifestPath, JSON.stringify(
|
|
104
|
+
await (0, import_promises.writeFile)(manifestPath, JSON.stringify(newManifest, null, MANIFEST_INDENT));
|
|
101
105
|
console.warn(`OG images: done. Generated ${String(changedPages.length)} images.`);
|
|
102
106
|
}
|
|
107
|
+
async function computeLogoHash(faviconPath) {
|
|
108
|
+
return (0, import_node_fs.existsSync)(faviconPath) ? (0, import_node_crypto.createHash)("sha256").update(await (0, import_promises.readFile)(faviconPath)).digest("hex") : "";
|
|
109
|
+
}
|
|
103
110
|
async function generateImagesWithPool(options) {
|
|
104
|
-
const { brandText, changedPages, fonts, logoDataUri,
|
|
111
|
+
const { brandText, cards, changedPages, fonts, logoDataUri, outputDirectory } = options;
|
|
105
112
|
let completed = 0;
|
|
106
113
|
let index = 0;
|
|
107
114
|
async function processNext() {
|
|
@@ -109,7 +116,7 @@ async function generateImagesWithPool(options) {
|
|
|
109
116
|
const outputPath = `${outputDirectory}/${page.slug}.png`;
|
|
110
117
|
await (0, import_promises.mkdir)((0, import_posix.dirname)(outputPath), { recursive: true });
|
|
111
118
|
await (0, import_promises.writeFile)(outputPath, await (0, import_og_image.renderOgImage)(page.params, { brandText, fonts, logoDataUri }));
|
|
112
|
-
|
|
119
|
+
cards[page.slug] = page.hash;
|
|
113
120
|
completed++;
|
|
114
121
|
if (completed % PROGRESS_LOG_INTERVAL === 0) {
|
|
115
122
|
console.warn(` ${String(completed)}/${String(changedPages.length)} images generated...`);
|
|
@@ -121,7 +128,11 @@ async function generateImagesWithPool(options) {
|
|
|
121
128
|
}));
|
|
122
129
|
}
|
|
123
130
|
async function loadCacheManifest(manifestPath) {
|
|
124
|
-
|
|
131
|
+
if (!(0, import_node_fs.existsSync)(manifestPath)) {
|
|
132
|
+
return null;
|
|
133
|
+
}
|
|
134
|
+
const manifest = JSON.parse(await (0, import_promises.readFile)(manifestPath, "utf-8"));
|
|
135
|
+
return typeof manifest.logoHash === "string" && typeof manifest.cards === "object" ? { cards: manifest.cards, logoHash: manifest.logoHash } : null;
|
|
125
136
|
}
|
|
126
137
|
function parseFrontMatter(content) {
|
|
127
138
|
const frontMatter = FRONT_MATTER_REG_EXP.exec(content)?.groups?.["FrontMatter"];
|
|
@@ -167,4 +178,4 @@ async function walkDirectory(directory, contentDocsDirectory, pages) {
|
|
|
167
178
|
0 && (module.exports = {
|
|
168
179
|
generateOgImages
|
|
169
180
|
});
|
|
170
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9kb2NzLXNpdGUvb2ctaW1hZ2VzLnRzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGZpbGVcbiAqXG4gKiBHZW5lcmF0ZXMgYW4gT3BlbiBHcmFwaCBjYXJkIGZvciBldmVyeSBkb2N1bWVudGF0aW9uIHBhZ2UsIHJldXNpbmcgdGhlIGNhcmRzIHdob3NlIGlucHV0cyBkaWQgbm90IGNoYW5nZS5cbiAqL1xuXG5pbXBvcnQgdHlwZSB7IEZvbnQgfSBmcm9tICdzYXRvcmknO1xuXG5pbXBvcnQgeyBleGlzdHNTeW5jIH0gZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQge1xuICBta2RpcixcbiAgcmVhZGRpcixcbiAgcmVhZEZpbGUsXG4gIHdyaXRlRmlsZVxufSBmcm9tICdub2RlOmZzL3Byb21pc2VzJztcbmltcG9ydCB7IGRpcm5hbWUgfSBmcm9tICdub2RlOnBhdGgvcG9zaXgnO1xuaW1wb3J0IHsgcGFyc2UgYXMgcGFyc2VZYW1sIH0gZnJvbSAneWFtbCc7XG5cbmltcG9ydCB0eXBlIHsgT2dDYXJkQ29udGVudCB9IGZyb20gJy4vb2ctaW1hZ2UudHMnO1xuXG5pbXBvcnQgeyBnZXRPZ0ltYWdlUGFnZVNsdWcgfSBmcm9tICcuL29nLWltYWdlLXBhZ2UudHMnO1xuaW1wb3J0IHtcbiAgY29tcHV0ZU9nSGFzaCxcbiAgbG9hZEZvbnRzLFxuICBsb2FkTG9nb0RhdGFVcmksXG4gIHJlbmRlck9nSW1hZ2Vcbn0gZnJvbSAnLi9vZy1pbWFnZS50cyc7XG5cbi8qKlxuICogT3B0aW9ucyBmb3Ige0BsaW5rIGdlbmVyYXRlT2dJbWFnZXN9LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEdlbmVyYXRlT2dJbWFnZXNQYXJhbXMge1xuICAvKipcbiAgICogVGhlIHRleHQgZXZlcnkgY2FyZCdzIGZvb3RlciBjYXJyaWVzLCBub3JtYWxseSB0aGUgcGFja2FnZSdzIG5hbWUuXG4gICAqL1xuICByZWFkb25seSBicmFuZFRleHQ6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIGRvY3VtZW50YXRpb24gY29udGVudCByb290LCBub3JtYWxseSBgPGRvY3M+L3NyYy9jb250ZW50L2RvY3NgLiBFdmVyeSBgLm1kYCAvIGAubWR4YCBwYWdlIHVuZGVyIGl0IHdpdGggYVxuICAgKiBgdGl0bGVgIGdldHMgYSBjYXJkLlxuICAgKi9cbiAgcmVhZG9ubHkgY29udGVudERvY3NEaXJlY3Rvcnk6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIFNWRyBsb2dvIGRyYXduIG9uIGV2ZXJ5IGNhcmQuIEEgbWlzc2luZyBmaWxlIHJlbmRlcnMgdGhlIGNhcmRzIHdpdGhvdXQgb25lLlxuICAgKi9cbiAgcmVhZG9ubHkgZmF2aWNvblBhdGg6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIGZvbGRlciBob2xkaW5nIHRoZSBmb250cyB0aGUgY2FyZHMgYXJlIHJlbmRlcmVkIHdpdGguXG4gICAqL1xuICByZWFkb25seSBmb250c0RpcmVjdG9yeTogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgZm9sZGVyIHRoZSBjYXJkcyBhcmUgd3JpdHRlbiB0bywgbm9ybWFsbHkgYDxkb2NzPi9wdWJsaWMvb2dgLCBzZXJ2ZWQgYXQgYDxiYXNlPi9vZy88c2x1Zz4ucG5nYC5cbiAgICovXG4gIHJlYWRvbmx5IG91dHB1dERpcmVjdG9yeTogc3RyaW5nO1xufVxuXG50eXBlIENhY2hlTWFuaWZlc3QgPSBQYXJ0aWFsPFJlY29yZDxzdHJpbmcsIHN0cmluZz4+O1xuXG5pbnRlcmZhY2UgR2VuZXJhdGVJbWFnZXNXaXRoUG9vbE9wdGlvbnMge1xuICByZWFkb25seSBicmFuZFRleHQ6IHN0cmluZztcbiAgcmVhZG9ubHkgY2hhbmdlZFBhZ2VzOiBQYWdlRW50cnlbXTtcbiAgcmVhZG9ubHkgZm9udHM6IEZvbnRbXTtcbiAgcmVhZG9ubHkgbG9nb0RhdGFVcmk6IG51bGwgfCBzdHJpbmc7XG4gIHJlYWRvbmx5IG1hbmlmZXN0OiBDYWNoZU1hbmlmZXN0O1xuICByZWFkb25seSBvdXRwdXREaXJlY3Rvcnk6IHN0cmluZztcbn1cblxuaW50ZXJmYWNlIFBhZ2VFbnRyeSB7XG4gIGhhc2g6IHN0cmluZztcbiAgcGFyYW1zOiBPZ0NhcmRDb250ZW50O1xuICBzbHVnOiBzdHJpbmc7XG59XG5cbmNvbnN0IENPTkNVUlJFTkNZID0gMTA7XG5jb25zdCBQUk9HUkVTU19MT0dfSU5URVJWQUwgPSAxMDA7XG5jb25zdCBNQU5JRkVTVF9JTkRFTlQgPSAyO1xuXG4vLyBGcm9udG1hdHRlciBpcyBwYXJzZWQgaGVyZSByYXRoZXIgdGhhbiB3aXRoIGBncmF5LW1hdHRlcmAuIEl0cyBgbGliL2VuZ2luZXMuanNgIGJpbmRzIGpzLXlhbWwnc1xuLy8gYHNhZmVMb2FkYC9gc2FmZUR1bXBgIGF0IE1PRFVMRS1MT0FEIHRpbWUsIGFuZCBib3RoIHdlcmUgcmVtb3ZlZCBpbiBqcy15YW1sIHY0IOKAlCBzbyBtZXJlbHlcbi8vIElNUE9SVElORyBgZ3JheS1tYXR0ZXJgIHRocm93cyBgQ2Fubm90IHJlYWQgcHJvcGVydGllcyBvZiB1bmRlZmluZWQgKHJlYWRpbmcgJ2JpbmQnKWAsIGJlZm9yZSBhblxuLy8gYGVuZ2luZXNgIG9wdGlvbiBjb3VsZCBvdmVycmlkZSB0aGUgZGVmYXVsdC4gT25seSB0aGUgZnJvbnRtYXR0ZXIgb2JqZWN0IGlzIG5lZWRlZCBoZXJlLlxuY29uc3QgRlJPTlRfTUFUVEVSX1JFR19FWFAgPSAvXi0tLVxccj9cXG4oPzxGcm9udE1hdHRlcj5bXFxzXFxTXSo/KVxccj9cXG4tLS0oPzpcXHI/XFxufCQpLztcblxuLyoqXG4gKiBHZW5lcmF0ZXMgdGhlIE9wZW4gR3JhcGggY2FyZHMuXG4gKlxuICogQSBjYXJkIGlzIHJlLXJlbmRlcmVkIG9ubHkgd2hlbiBpdHMgdGl0bGUsIGRlc2NyaXB0aW9uLCBzaWduYXR1cmUgb3IgYmFkZ2UgY2hhbmdlZCwgdHJhY2tlZCBieSBhIGhhc2ggbWFuaWZlc3RcbiAqIGJlc2lkZSB0aGUgY2FyZHMuIE1pc3NpbmcgY29udGVudCBvciBmb250cyBza2lwIHRoZSBzdGVwIHdpdGggYSB3YXJuaW5nIHJhdGhlciB0aGFuIGZhaWxpbmcgdGhlIGJ1aWxkLlxuICpcbiAqIEBwYXJhbSBvcHRpb25zIC0gVGhlIG9wdGlvbnMuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZW5lcmF0ZU9nSW1hZ2VzKG9wdGlvbnM6IEdlbmVyYXRlT2dJbWFnZXNQYXJhbXMpOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgeyBicmFuZFRleHQsIGNvbnRlbnREb2NzRGlyZWN0b3J5LCBmYXZpY29uUGF0aCwgZm9udHNEaXJlY3RvcnksIG91dHB1dERpcmVjdG9yeSB9ID0gb3B0aW9ucztcbiAgY29uc3QgbWFuaWZlc3RQYXRoID0gYCR7b3V0cHV0RGlyZWN0b3J5fS8uY2FjaGUtbWFuaWZlc3QuanNvbmA7XG5cbiAgaWYgKCFleGlzdHNTeW5jKGNvbnRlbnREb2NzRGlyZWN0b3J5KSkge1xuICAgIGNvbnNvbGUud2FybihgT0cgaW1hZ2VzOiBjb250ZW50IGRpciBub3QgZm91bmQgKCR7Y29udGVudERvY3NEaXJlY3Rvcnl9KTsgc2tpcHBpbmcuYCk7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgLy8gTG9hZCBmb250cyBmaXJzdCDigJQgc2F0b3JpIGNhbm5vdCByZW5kZXIgd2l0aG91dCB0aGVtLlxuICBjb25zdCBmb250cyA9IGF3YWl0IGxvYWRGb250cyhmb250c0RpcmVjdG9yeSk7XG4gIGlmICghZm9udHMpIHtcbiAgICBjb25zb2xlLndhcm4oYE9HIGltYWdlczogbm8gZm9udHMgYXZhaWxhYmxlIGluICR7Zm9udHNEaXJlY3Rvcnl9OyBza2lwcGluZyBPRyBpbWFnZSBnZW5lcmF0aW9uLmApO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGNvbnN0IHBhZ2VzOiBQYWdlRW50cnlbXSA9IFtdO1xuICBhd2FpdCB3YWxrRGlyZWN0b3J5KGNvbnRlbnREb2NzRGlyZWN0b3J5LCBjb250ZW50RG9jc0RpcmVjdG9yeSwgcGFnZXMpO1xuICBjb25zb2xlLndhcm4oYE9HIGltYWdlczogZm91bmQgJHtTdHJpbmcocGFnZXMubGVuZ3RoKX0gcGFnZXNgKTtcblxuICBjb25zdCBtYW5pZmVzdCA9IGF3YWl0IGxvYWRDYWNoZU1hbmlmZXN0KG1hbmlmZXN0UGF0aCk7XG4gIGNvbnN0IGNoYW5nZWRQYWdlcyA9IHBhZ2VzLmZpbHRlcigocGFnZSkgPT4gbWFuaWZlc3RbcGFnZS5zbHVnXSAhPT0gcGFnZS5oYXNoKTtcbiAgY29uc29sZS53YXJuKGBPRyBpbWFnZXM6ICR7U3RyaW5nKGNoYW5nZWRQYWdlcy5sZW5ndGgpfSBjaGFuZ2VkIC8gJHtTdHJpbmcocGFnZXMubGVuZ3RoKX0gdG90YWxgKTtcblxuICBpZiAoY2hhbmdlZFBhZ2VzLmxlbmd0aCA9PT0gMCkge1xuICAgIGNvbnNvbGUud2FybignQWxsIE9HIGltYWdlcyB1cCB0byBkYXRlLicpO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIC8vIFJhc3Rlcml6ZSB0aGUgc2l0ZSBsb2dvIG9uY2UgKHNoYXJlZCBhY3Jvc3MgZXZlcnkgY2FyZCk7IGRlZ3JhZGUgZ3JhY2VmdWxseSBpZiBhYnNlbnQuXG4gIGNvbnN0IGxvZ29EYXRhVXJpID0gYXdhaXQgbG9hZExvZ29EYXRhVXJpKGZhdmljb25QYXRoKTtcbiAgaWYgKCFsb2dvRGF0YVVyaSkge1xuICAgIGNvbnNvbGUud2FybihgT0cgaW1hZ2VzOiBmYXZpY29uIG5vdCBmb3VuZCAoJHtmYXZpY29uUGF0aH0pOyByZW5kZXJpbmcgY2FyZHMgd2l0aG91dCBhIGxvZ28uYCk7XG4gIH1cblxuICBhd2FpdCBnZW5lcmF0ZUltYWdlc1dpdGhQb29sKHsgYnJhbmRUZXh0LCBjaGFuZ2VkUGFnZXMsIGZvbnRzLCBsb2dvRGF0YVVyaSwgbWFuaWZlc3QsIG91dHB1dERpcmVjdG9yeSB9KTtcblxuICBhd2FpdCBta2RpcihkaXJuYW1lKG1hbmlmZXN0UGF0aCksIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICBhd2FpdCB3cml0ZUZpbGUobWFuaWZlc3RQYXRoLCBKU09OLnN0cmluZ2lmeShtYW5pZmVzdCwgbnVsbCwgTUFOSUZFU1RfSU5ERU5UKSk7XG4gIGNvbnNvbGUud2FybihgT0cgaW1hZ2VzOiBkb25lLiBHZW5lcmF0ZWQgJHtTdHJpbmcoY2hhbmdlZFBhZ2VzLmxlbmd0aCl9IGltYWdlcy5gKTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVJbWFnZXNXaXRoUG9vbChvcHRpb25zOiBHZW5lcmF0ZUltYWdlc1dpdGhQb29sT3B0aW9ucyk6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCB7IGJyYW5kVGV4dCwgY2hhbmdlZFBhZ2VzLCBmb250cywgbG9nb0RhdGFVcmksIG1hbmlmZXN0LCBvdXRwdXREaXJlY3RvcnkgfSA9IG9wdGlvbnM7XG4gIGxldCBjb21wbGV0ZWQgPSAwO1xuICBsZXQgaW5kZXggPSAwO1xuXG4gIGFzeW5jIGZ1bmN0aW9uIHByb2Nlc3NOZXh0KCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGZvciAobGV0IHBhZ2UgPSBjaGFuZ2VkUGFnZXNbaW5kZXgrK107IHBhZ2UgIT09IHVuZGVmaW5lZDsgcGFnZSA9IGNoYW5nZWRQYWdlc1tpbmRleCsrXSkge1xuICAgICAgY29uc3Qgb3V0cHV0UGF0aCA9IGAke291dHB1dERpcmVjdG9yeX0vJHtwYWdlLnNsdWd9LnBuZ2A7XG4gICAgICBhd2FpdCBta2RpcihkaXJuYW1lKG91dHB1dFBhdGgpLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgICAgIGF3YWl0IHdyaXRlRmlsZShvdXRwdXRQYXRoLCBhd2FpdCByZW5kZXJPZ0ltYWdlKHBhZ2UucGFyYW1zLCB7IGJyYW5kVGV4dCwgZm9udHMsIGxvZ29EYXRhVXJpIH0pKTtcbiAgICAgIG1hbmlmZXN0W3BhZ2Uuc2x1Z10gPSBwYWdlLmhhc2g7XG4gICAgICBjb21wbGV0ZWQrKztcbiAgICAgIGlmIChjb21wbGV0ZWQgJSBQUk9HUkVTU19MT0dfSU5URVJWQUwgPT09IDApIHtcbiAgICAgICAgY29uc29sZS53YXJuKGAgICR7U3RyaW5nKGNvbXBsZXRlZCl9LyR7U3RyaW5nKGNoYW5nZWRQYWdlcy5sZW5ndGgpfSBpbWFnZXMgZ2VuZXJhdGVkLi4uYCk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgYXdhaXQgUHJvbWlzZS5hbGwoQXJyYXkuZnJvbSh7IGxlbmd0aDogQ09OQ1VSUkVOQ1kgfSwgYXN5bmMgKCkgPT4ge1xuICAgIGF3YWl0IHByb2Nlc3NOZXh0KCk7XG4gIH0pKTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gbG9hZENhY2hlTWFuaWZlc3QobWFuaWZlc3RQYXRoOiBzdHJpbmcpOiBQcm9taXNlPENhY2hlTWFuaWZlc3Q+IHtcbiAgcmV0dXJuIGV4aXN0c1N5bmMobWFuaWZlc3RQYXRoKSA/IChKU09OLnBhcnNlKGF3YWl0IHJlYWRGaWxlKG1hbmlmZXN0UGF0aCwgJ3V0Zi04JykpIGFzIENhY2hlTWFuaWZlc3QpIDoge307XG59XG5cbmZ1bmN0aW9uIHBhcnNlRnJvbnRNYXR0ZXIoY29udGVudDogc3RyaW5nKTogUGFydGlhbDxSZWNvcmQ8c3RyaW5nLCB1bmtub3duPj4ge1xuICBjb25zdCBmcm9udE1hdHRlciA9IEZST05UX01BVFRFUl9SRUdfRVhQLmV4ZWMoY29udGVudCk/Lmdyb3Vwcz8uWydGcm9udE1hdHRlciddO1xuICByZXR1cm4gZnJvbnRNYXR0ZXIgPT09IHVuZGVmaW5lZCA/IHt9IDogKHBhcnNlWWFtbChmcm9udE1hdHRlcikgYXMgbnVsbCB8IFBhcnRpYWw8UmVjb3JkPHN0cmluZywgdW5rbm93bj4+KSA/PyB7fTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gcGFyc2VQYWdlKGZpbGVQYXRoOiBzdHJpbmcsIGNvbnRlbnREb2NzRGlyZWN0b3J5OiBzdHJpbmcpOiBQcm9taXNlPG51bGwgfCBQYWdlRW50cnk+IHtcbiAgY29uc3QgZGF0YSA9IHBhcnNlRnJvbnRNYXR0ZXIoYXdhaXQgcmVhZEZpbGUoZmlsZVBhdGgsICd1dGYtOCcpKTtcblxuICBjb25zdCB0aXRsZSA9IHRvT3B0aW9uYWxTdHJpbmcoZGF0YVsndGl0bGUnXSk7XG4gIGlmICghdGl0bGUpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIGNvbnN0IGJhZGdlID0gZGF0YVsnc2lkZWJhciddIGFzIFBhcnRpYWw8UmVjb3JkPHN0cmluZywgUGFydGlhbDxSZWNvcmQ8c3RyaW5nLCB1bmtub3duPj4+PiB8IHVuZGVmaW5lZDtcbiAgY29uc3QgcGFyYW1zOiBPZ0NhcmRDb250ZW50ID0ge1xuICAgIGJhZGdlOiB0b09wdGlvbmFsU3RyaW5nKGJhZGdlPy5bJ2JhZGdlJ10/LlsndGV4dCddKSxcbiAgICBkZXNjcmlwdGlvbjogdG9PcHRpb25hbFN0cmluZyhkYXRhWydkZXNjcmlwdGlvbiddKSA/PyAnJyxcbiAgICBzaWduYXR1cmU6IHRvT3B0aW9uYWxTdHJpbmcoZGF0YVsnc2lnbmF0dXJlJ10pID8/ICcnLFxuICAgIHRpdGxlXG4gIH07XG5cbiAgcmV0dXJuIHtcbiAgICBoYXNoOiBjb21wdXRlT2dIYXNoKHBhcmFtcyksXG4gICAgcGFyYW1zLFxuICAgIHNsdWc6IGdldE9nSW1hZ2VQYWdlU2x1ZyhkYXRhLCBmaWxlUGF0aCwgY29udGVudERvY3NEaXJlY3RvcnkpXG4gIH07XG59XG5cbmZ1bmN0aW9uIHRvT3B0aW9uYWxTdHJpbmcodmFsdWU6IHVua25vd24pOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICByZXR1cm4gdHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJyA/IHZhbHVlIDogdW5kZWZpbmVkO1xufVxuXG5hc3luYyBmdW5jdGlvbiB3YWxrRGlyZWN0b3J5KGRpcmVjdG9yeTogc3RyaW5nLCBjb250ZW50RG9jc0RpcmVjdG9yeTogc3RyaW5nLCBwYWdlczogUGFnZUVudHJ5W10pOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgZW50cmllcyA9IGF3YWl0IHJlYWRkaXIoZGlyZWN0b3J5LCB7IHdpdGhGaWxlVHlwZXM6IHRydWUgfSk7XG4gIGZvciAoY29uc3QgZW50cnkgb2YgZW50cmllcykge1xuICAgIGNvbnN0IGZ1bGxQYXRoID0gYCR7ZGlyZWN0b3J5fS8ke2VudHJ5Lm5hbWV9YDtcbiAgICBpZiAoZW50cnkuaXNEaXJlY3RvcnkoKSkge1xuICAgICAgYXdhaXQgd2Fsa0RpcmVjdG9yeShmdWxsUGF0aCwgY29udGVudERvY3NEaXJlY3RvcnksIHBhZ2VzKTtcbiAgICB9IGVsc2UgaWYgKGVudHJ5Lm5hbWUuZW5kc1dpdGgoJy5tZCcpIHx8IGVudHJ5Lm5hbWUuZW5kc1dpdGgoJy5tZHgnKSkge1xuICAgICAgY29uc3QgcGFnZSA9IGF3YWl0IHBhcnNlUGFnZShmdWxsUGF0aCwgY29udGVudERvY3NEaXJlY3RvcnkpO1xuICAgICAgaWYgKHBhZ2UpIHtcbiAgICAgICAgcGFnZXMucHVzaChwYWdlKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBUUEscUJBQTJCO0FBQzNCLHNCQUtPO0FBQ1AsbUJBQXdCO0FBQ3hCLGtCQUFtQztBQUluQywyQkFBbUM7QUFDbkMsc0JBS087QUFrRFAsTUFBTSxjQUFjO0FBQ3BCLE1BQU0sd0JBQXdCO0FBQzlCLE1BQU0sa0JBQWtCO0FBTXhCLE1BQU0sdUJBQXVCO0FBVTdCLGVBQXNCLGlCQUFpQixTQUFnRDtBQUNyRixRQUFNLEVBQUUsV0FBVyxzQkFBc0IsYUFBYSxnQkFBZ0IsZ0JBQWdCLElBQUk7QUFDMUYsUUFBTSxlQUFlLEdBQUcsZUFBZTtBQUV2QyxNQUFJLEtBQUMsMkJBQVcsb0JBQW9CLEdBQUc7QUFDckMsWUFBUSxLQUFLLHFDQUFxQyxvQkFBb0IsY0FBYztBQUNwRjtBQUFBLEVBQ0Y7QUFHQSxRQUFNLFFBQVEsVUFBTSwyQkFBVSxjQUFjO0FBQzVDLE1BQUksQ0FBQyxPQUFPO0FBQ1YsWUFBUSxLQUFLLG9DQUFvQyxjQUFjLGlDQUFpQztBQUNoRztBQUFBLEVBQ0Y7QUFFQSxRQUFNLFFBQXFCLENBQUM7QUFDNUIs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
|
|
181
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9kb2NzLXNpdGUvb2ctaW1hZ2VzLnRzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGZpbGVcbiAqXG4gKiBHZW5lcmF0ZXMgYW4gT3BlbiBHcmFwaCBjYXJkIGZvciBldmVyeSBkb2N1bWVudGF0aW9uIHBhZ2UsIHJldXNpbmcgdGhlIGNhcmRzIHdob3NlIGlucHV0cyBkaWQgbm90IGNoYW5nZS5cbiAqL1xuXG5pbXBvcnQgdHlwZSB7IEZvbnQgfSBmcm9tICdzYXRvcmknO1xuXG5pbXBvcnQgeyBjcmVhdGVIYXNoIH0gZnJvbSAnbm9kZTpjcnlwdG8nO1xuaW1wb3J0IHsgZXhpc3RzU3luYyB9IGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHtcbiAgbWtkaXIsXG4gIHJlYWRkaXIsXG4gIHJlYWRGaWxlLFxuICB3cml0ZUZpbGVcbn0gZnJvbSAnbm9kZTpmcy9wcm9taXNlcyc7XG5pbXBvcnQgeyBkaXJuYW1lIH0gZnJvbSAnbm9kZTpwYXRoL3Bvc2l4JztcbmltcG9ydCB7IHBhcnNlIGFzIHBhcnNlWWFtbCB9IGZyb20gJ3lhbWwnO1xuXG5pbXBvcnQgdHlwZSB7IE9nQ2FyZENvbnRlbnQgfSBmcm9tICcuL29nLWltYWdlLnRzJztcblxuaW1wb3J0IHsgZ2V0T2dJbWFnZVBhZ2VTbHVnIH0gZnJvbSAnLi9vZy1pbWFnZS1wYWdlLnRzJztcbmltcG9ydCB7XG4gIGNvbXB1dGVPZ0hhc2gsXG4gIGxvYWRGb250cyxcbiAgbG9hZExvZ29EYXRhVXJpLFxuICByZW5kZXJPZ0ltYWdlXG59IGZyb20gJy4vb2ctaW1hZ2UudHMnO1xuXG4vKipcbiAqIE9wdGlvbnMgZm9yIHtAbGluayBnZW5lcmF0ZU9nSW1hZ2VzfS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBHZW5lcmF0ZU9nSW1hZ2VzUGFyYW1zIHtcbiAgLyoqXG4gICAqIFRoZSB0ZXh0IGV2ZXJ5IGNhcmQncyBmb290ZXIgY2Fycmllcywgbm9ybWFsbHkgdGhlIHBhY2thZ2UncyBuYW1lLlxuICAgKi9cbiAgcmVhZG9ubHkgYnJhbmRUZXh0OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBkb2N1bWVudGF0aW9uIGNvbnRlbnQgcm9vdCwgbm9ybWFsbHkgYDxkb2NzPi9zcmMvY29udGVudC9kb2NzYC4gRXZlcnkgYC5tZGAgLyBgLm1keGAgcGFnZSB1bmRlciBpdCB3aXRoIGFcbiAgICogYHRpdGxlYCBnZXRzIGEgY2FyZC5cbiAgICovXG4gIHJlYWRvbmx5IGNvbnRlbnREb2NzRGlyZWN0b3J5OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBTVkcgbG9nbyBkcmF3biBvbiBldmVyeSBjYXJkLiBBIG1pc3NpbmcgZmlsZSByZW5kZXJzIHRoZSBjYXJkcyB3aXRob3V0IG9uZS5cbiAgICovXG4gIHJlYWRvbmx5IGZhdmljb25QYXRoOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBmb2xkZXIgaG9sZGluZyB0aGUgZm9udHMgdGhlIGNhcmRzIGFyZSByZW5kZXJlZCB3aXRoLlxuICAgKi9cbiAgcmVhZG9ubHkgZm9udHNEaXJlY3Rvcnk6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIGZvbGRlciB0aGUgY2FyZHMgYXJlIHdyaXR0ZW4gdG8sIG5vcm1hbGx5IGA8ZG9jcz4vcHVibGljL29nYCwgc2VydmVkIGF0IGA8YmFzZT4vb2cvPHNsdWc+LnBuZ2AuXG4gICAqL1xuICByZWFkb25seSBvdXRwdXREaXJlY3Rvcnk6IHN0cmluZztcbn1cblxuaW50ZXJmYWNlIENhY2hlTWFuaWZlc3Qge1xuICAvLyBFYWNoIHBhZ2UncyBjb250ZW50IGhhc2gsIGJ5IHNsdWcuXG4gIHJlYWRvbmx5IGNhcmRzOiBDYXJkSGFzaGVzO1xuICAvLyBUaGUgaGFzaCBvZiB0aGUgbG9nbyBldmVyeSBjYXJkIGNhcnJpZXMuIFRoZSBwYWdlIGhhc2hlcyBjYW5ub3Qgc2VlIGl0LCBzbyBhIGRpZmZlcmVudCBsb2dvIGRyb3BzIHRoZW0gYWxsLlxuICByZWFkb25seSBsb2dvSGFzaDogc3RyaW5nO1xufVxuXG50eXBlIENhcmRIYXNoZXMgPSBQYXJ0aWFsPFJlY29yZDxzdHJpbmcsIHN0cmluZz4+O1xuXG5pbnRlcmZhY2UgR2VuZXJhdGVJbWFnZXNXaXRoUG9vbE9wdGlvbnMge1xuICByZWFkb25seSBicmFuZFRleHQ6IHN0cmluZztcbiAgcmVhZG9ubHkgY2FyZHM6IENhcmRIYXNoZXM7XG4gIHJlYWRvbmx5IGNoYW5nZWRQYWdlczogUGFnZUVudHJ5W107XG4gIHJlYWRvbmx5IGZvbnRzOiBGb250W107XG4gIHJlYWRvbmx5IGxvZ29EYXRhVXJpOiBudWxsIHwgc3RyaW5nO1xuICByZWFkb25seSBvdXRwdXREaXJlY3Rvcnk6IHN0cmluZztcbn1cblxuaW50ZXJmYWNlIFBhZ2VFbnRyeSB7XG4gIGhhc2g6IHN0cmluZztcbiAgcGFyYW1zOiBPZ0NhcmRDb250ZW50O1xuICBzbHVnOiBzdHJpbmc7XG59XG5cbmNvbnN0IENPTkNVUlJFTkNZID0gMTA7XG5jb25zdCBQUk9HUkVTU19MT0dfSU5URVJWQUwgPSAxMDA7XG5jb25zdCBNQU5JRkVTVF9JTkRFTlQgPSAyO1xuXG4vLyBGcm9udG1hdHRlciBpcyBwYXJzZWQgaGVyZSByYXRoZXIgdGhhbiB3aXRoIGBncmF5LW1hdHRlcmAuIEl0cyBgbGliL2VuZ2luZXMuanNgIGJpbmRzIGpzLXlhbWwnc1xuLy8gYHNhZmVMb2FkYC9gc2FmZUR1bXBgIGF0IE1PRFVMRS1MT0FEIHRpbWUsIGFuZCBib3RoIHdlcmUgcmVtb3ZlZCBpbiBqcy15YW1sIHY0IOKAlCBzbyBtZXJlbHlcbi8vIElNUE9SVElORyBgZ3JheS1tYXR0ZXJgIHRocm93cyBgQ2Fubm90IHJlYWQgcHJvcGVydGllcyBvZiB1bmRlZmluZWQgKHJlYWRpbmcgJ2JpbmQnKWAsIGJlZm9yZSBhblxuLy8gYGVuZ2luZXNgIG9wdGlvbiBjb3VsZCBvdmVycmlkZSB0aGUgZGVmYXVsdC4gT25seSB0aGUgZnJvbnRtYXR0ZXIgb2JqZWN0IGlzIG5lZWRlZCBoZXJlLlxuY29uc3QgRlJPTlRfTUFUVEVSX1JFR19FWFAgPSAvXi0tLVxccj9cXG4oPzxGcm9udE1hdHRlcj5bXFxzXFxTXSo/KVxccj9cXG4tLS0oPzpcXHI/XFxufCQpLztcblxuLyoqXG4gKiBHZW5lcmF0ZXMgdGhlIE9wZW4gR3JhcGggY2FyZHMuXG4gKlxuICogQSBjYXJkIGlzIHJlLXJlbmRlcmVkIG9ubHkgd2hlbiBpdHMgdGl0bGUsIGRlc2NyaXB0aW9uLCBzaWduYXR1cmUgb3IgYmFkZ2UgY2hhbmdlZCwgdHJhY2tlZCBieSBhIGhhc2ggbWFuaWZlc3RcbiAqIGJlc2lkZSB0aGUgY2FyZHMuIEEgZGlmZmVyZW50IGxvZ28gZmlsZSByZS1yZW5kZXJzIGV2ZXJ5IGNhcmQuIE1pc3NpbmcgY29udGVudCBvciBmb250cyBza2lwIHRoZSBzdGVwIHdpdGggYSB3YXJuaW5nIHJhdGhlciB0aGFuIGZhaWxpbmcgdGhlIGJ1aWxkLlxuICpcbiAqIEBwYXJhbSBvcHRpb25zIC0gVGhlIG9wdGlvbnMuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZW5lcmF0ZU9nSW1hZ2VzKG9wdGlvbnM6IEdlbmVyYXRlT2dJbWFnZXNQYXJhbXMpOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgeyBicmFuZFRleHQsIGNvbnRlbnREb2NzRGlyZWN0b3J5LCBmYXZpY29uUGF0aCwgZm9udHNEaXJlY3RvcnksIG91dHB1dERpcmVjdG9yeSB9ID0gb3B0aW9ucztcbiAgY29uc3QgbWFuaWZlc3RQYXRoID0gYCR7b3V0cHV0RGlyZWN0b3J5fS8uY2FjaGUtbWFuaWZlc3QuanNvbmA7XG5cbiAgaWYgKCFleGlzdHNTeW5jKGNvbnRlbnREb2NzRGlyZWN0b3J5KSkge1xuICAgIGNvbnNvbGUud2FybihgT0cgaW1hZ2VzOiBjb250ZW50IGRpciBub3QgZm91bmQgKCR7Y29udGVudERvY3NEaXJlY3Rvcnl9KTsgc2tpcHBpbmcuYCk7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgLy8gTG9hZCBmb250cyBmaXJzdCDigJQgc2F0b3JpIGNhbm5vdCByZW5kZXIgd2l0aG91dCB0aGVtLlxuICBjb25zdCBmb250cyA9IGF3YWl0IGxvYWRGb250cyhmb250c0RpcmVjdG9yeSk7XG4gIGlmICghZm9udHMpIHtcbiAgICBjb25zb2xlLndhcm4oYE9HIGltYWdlczogbm8gZm9udHMgYXZhaWxhYmxlIGluICR7Zm9udHNEaXJlY3Rvcnl9OyBza2lwcGluZyBPRyBpbWFnZSBnZW5lcmF0aW9uLmApO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGNvbnN0IHBhZ2VzOiBQYWdlRW50cnlbXSA9IFtdO1xuICBhd2FpdCB3YWxrRGlyZWN0b3J5KGNvbnRlbnREb2NzRGlyZWN0b3J5LCBjb250ZW50RG9jc0RpcmVjdG9yeSwgcGFnZXMpO1xuICBjb25zb2xlLndhcm4oYE9HIGltYWdlczogZm91bmQgJHtTdHJpbmcocGFnZXMubGVuZ3RoKX0gcGFnZXNgKTtcblxuICBjb25zdCBsb2dvSGFzaCA9IGF3YWl0IGNvbXB1dGVMb2dvSGFzaChmYXZpY29uUGF0aCk7XG4gIGNvbnN0IG1hbmlmZXN0ID0gYXdhaXQgbG9hZENhY2hlTWFuaWZlc3QobWFuaWZlc3RQYXRoKTtcbiAgY29uc3QgY2FyZHMgPSBtYW5pZmVzdD8ubG9nb0hhc2ggPT09IGxvZ29IYXNoID8geyAuLi5tYW5pZmVzdC5jYXJkcyB9IDoge307XG4gIGNvbnN0IGNoYW5nZWRQYWdlcyA9IHBhZ2VzLmZpbHRlcigocGFnZSkgPT4gY2FyZHNbcGFnZS5zbHVnXSAhPT0gcGFnZS5oYXNoKTtcbiAgY29uc29sZS53YXJuKGBPRyBpbWFnZXM6ICR7U3RyaW5nKGNoYW5nZWRQYWdlcy5sZW5ndGgpfSBjaGFuZ2VkIC8gJHtTdHJpbmcocGFnZXMubGVuZ3RoKX0gdG90YWxgKTtcblxuICBpZiAoY2hhbmdlZFBhZ2VzLmxlbmd0aCA9PT0gMCkge1xuICAgIGNvbnNvbGUud2FybignQWxsIE9HIGltYWdlcyB1cCB0byBkYXRlLicpO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIC8vIFJhc3Rlcml6ZSB0aGUgc2l0ZSBsb2dvIG9uY2UgKHNoYXJlZCBhY3Jvc3MgZXZlcnkgY2FyZCk7IGRlZ3JhZGUgZ3JhY2VmdWxseSBpZiBhYnNlbnQuXG4gIGNvbnN0IGxvZ29EYXRhVXJpID0gYXdhaXQgbG9hZExvZ29EYXRhVXJpKGZhdmljb25QYXRoKTtcbiAgaWYgKCFsb2dvRGF0YVVyaSkge1xuICAgIGNvbnNvbGUud2FybihgT0cgaW1hZ2VzOiBmYXZpY29uIG5vdCBmb3VuZCAoJHtmYXZpY29uUGF0aH0pOyByZW5kZXJpbmcgY2FyZHMgd2l0aG91dCBhIGxvZ28uYCk7XG4gIH1cblxuICBhd2FpdCBnZW5lcmF0ZUltYWdlc1dpdGhQb29sKHsgYnJhbmRUZXh0LCBjYXJkcywgY2hhbmdlZFBhZ2VzLCBmb250cywgbG9nb0RhdGFVcmksIG91dHB1dERpcmVjdG9yeSB9KTtcblxuICBjb25zdCBuZXdNYW5pZmVzdDogQ2FjaGVNYW5pZmVzdCA9IHsgY2FyZHMsIGxvZ29IYXNoIH07XG4gIGF3YWl0IG1rZGlyKGRpcm5hbWUobWFuaWZlc3RQYXRoKSwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG4gIGF3YWl0IHdyaXRlRmlsZShtYW5pZmVzdFBhdGgsIEpTT04uc3RyaW5naWZ5KG5ld01hbmlmZXN0LCBudWxsLCBNQU5JRkVTVF9JTkRFTlQpKTtcbiAgY29uc29sZS53YXJuKGBPRyBpbWFnZXM6IGRvbmUuIEdlbmVyYXRlZCAke1N0cmluZyhjaGFuZ2VkUGFnZXMubGVuZ3RoKX0gaW1hZ2VzLmApO1xufVxuXG5hc3luYyBmdW5jdGlvbiBjb21wdXRlTG9nb0hhc2goZmF2aWNvblBhdGg6IHN0cmluZyk6IFByb21pc2U8c3RyaW5nPiB7XG4gIHJldHVybiBleGlzdHNTeW5jKGZhdmljb25QYXRoKSA/IGNyZWF0ZUhhc2goJ3NoYTI1NicpLnVwZGF0ZShhd2FpdCByZWFkRmlsZShmYXZpY29uUGF0aCkpLmRpZ2VzdCgnaGV4JykgOiAnJztcbn1cblxuYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVJbWFnZXNXaXRoUG9vbChvcHRpb25zOiBHZW5lcmF0ZUltYWdlc1dpdGhQb29sT3B0aW9ucyk6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCB7IGJyYW5kVGV4dCwgY2FyZHMsIGNoYW5nZWRQYWdlcywgZm9udHMsIGxvZ29EYXRhVXJpLCBvdXRwdXREaXJlY3RvcnkgfSA9IG9wdGlvbnM7XG4gIGxldCBjb21wbGV0ZWQgPSAwO1xuICBsZXQgaW5kZXggPSAwO1xuXG4gIGFzeW5jIGZ1bmN0aW9uIHByb2Nlc3NOZXh0KCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGZvciAobGV0IHBhZ2UgPSBjaGFuZ2VkUGFnZXNbaW5kZXgrK107IHBhZ2UgIT09IHVuZGVmaW5lZDsgcGFnZSA9IGNoYW5nZWRQYWdlc1tpbmRleCsrXSkge1xuICAgICAgY29uc3Qgb3V0cHV0UGF0aCA9IGAke291dHB1dERpcmVjdG9yeX0vJHtwYWdlLnNsdWd9LnBuZ2A7XG4gICAgICBhd2FpdCBta2RpcihkaXJuYW1lKG91dHB1dFBhdGgpLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgICAgIGF3YWl0IHdyaXRlRmlsZShvdXRwdXRQYXRoLCBhd2FpdCByZW5kZXJPZ0ltYWdlKHBhZ2UucGFyYW1zLCB7IGJyYW5kVGV4dCwgZm9udHMsIGxvZ29EYXRhVXJpIH0pKTtcbiAgICAgIGNhcmRzW3BhZ2Uuc2x1Z10gPSBwYWdlLmhhc2g7XG4gICAgICBjb21wbGV0ZWQrKztcbiAgICAgIGlmIChjb21wbGV0ZWQgJSBQUk9HUkVTU19MT0dfSU5URVJWQUwgPT09IDApIHtcbiAgICAgICAgY29uc29sZS53YXJuKGAgICR7U3RyaW5nKGNvbXBsZXRlZCl9LyR7U3RyaW5nKGNoYW5nZWRQYWdlcy5sZW5ndGgpfSBpbWFnZXMgZ2VuZXJhdGVkLi4uYCk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgYXdhaXQgUHJvbWlzZS5hbGwoQXJyYXkuZnJvbSh7IGxlbmd0aDogQ09OQ1VSUkVOQ1kgfSwgYXN5bmMgKCkgPT4ge1xuICAgIGF3YWl0IHByb2Nlc3NOZXh0KCk7XG4gIH0pKTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gbG9hZENhY2hlTWFuaWZlc3QobWFuaWZlc3RQYXRoOiBzdHJpbmcpOiBQcm9taXNlPENhY2hlTWFuaWZlc3QgfCBudWxsPiB7XG4gIGlmICghZXhpc3RzU3luYyhtYW5pZmVzdFBhdGgpKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbiAgLy8gQSBtYW5pZmVzdCB3cml0dGVuIGJlZm9yZSB0aGUgbG9nbyB3YXMgdHJhY2tlZCBpcyBhIGZsYXQgc2x1Zy10by1oYXNoIG1hcDogaXQgaGFzIG5vIGBsb2dvSGFzaGAsIHNvIGV2ZXJ5IGNhcmRcbiAgLy8gcmUtcmVuZGVycyBvbmNlLlxuICBjb25zdCBtYW5pZmVzdCA9IEpTT04ucGFyc2UoYXdhaXQgcmVhZEZpbGUobWFuaWZlc3RQYXRoLCAndXRmLTgnKSkgYXMgUGFydGlhbDxDYWNoZU1hbmlmZXN0PjtcbiAgcmV0dXJuIHR5cGVvZiBtYW5pZmVzdC5sb2dvSGFzaCA9PT0gJ3N0cmluZycgJiYgdHlwZW9mIG1hbmlmZXN0LmNhcmRzID09PSAnb2JqZWN0J1xuICAgID8geyBjYXJkczogbWFuaWZlc3QuY2FyZHMsIGxvZ29IYXNoOiBtYW5pZmVzdC5sb2dvSGFzaCB9XG4gICAgOiBudWxsO1xufVxuXG5mdW5jdGlvbiBwYXJzZUZyb250TWF0dGVyKGNvbnRlbnQ6IHN0cmluZyk6IFBhcnRpYWw8UmVjb3JkPHN0cmluZywgdW5rbm93bj4+IHtcbiAgY29uc3QgZnJvbnRNYXR0ZXIgPSBGUk9OVF9NQVRURVJfUkVHX0VYUC5leGVjKGNvbnRlbnQpPy5ncm91cHM/LlsnRnJvbnRNYXR0ZXInXTtcbiAgcmV0dXJuIGZyb250TWF0dGVyID09PSB1bmRlZmluZWQgPyB7fSA6IChwYXJzZVlhbWwoZnJvbnRNYXR0ZXIpIGFzIG51bGwgfCBQYXJ0aWFsPFJlY29yZDxzdHJpbmcsIHVua25vd24+PikgPz8ge307XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHBhcnNlUGFnZShmaWxlUGF0aDogc3RyaW5nLCBjb250ZW50RG9jc0RpcmVjdG9yeTogc3RyaW5nKTogUHJvbWlzZTxudWxsIHwgUGFnZUVudHJ5PiB7XG4gIGNvbnN0IGRhdGEgPSBwYXJzZUZyb250TWF0dGVyKGF3YWl0IHJlYWRGaWxlKGZpbGVQYXRoLCAndXRmLTgnKSk7XG5cbiAgY29uc3QgdGl0bGUgPSB0b09wdGlvbmFsU3RyaW5nKGRhdGFbJ3RpdGxlJ10pO1xuICBpZiAoIXRpdGxlKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBjb25zdCBiYWRnZSA9IGRhdGFbJ3NpZGViYXInXSBhcyBQYXJ0aWFsPFJlY29yZDxzdHJpbmcsIFBhcnRpYWw8UmVjb3JkPHN0cmluZywgdW5rbm93bj4+Pj4gfCB1bmRlZmluZWQ7XG4gIGNvbnN0IHBhcmFtczogT2dDYXJkQ29udGVudCA9IHtcbiAgICBiYWRnZTogdG9PcHRpb25hbFN0cmluZyhiYWRnZT8uWydiYWRnZSddPy5bJ3RleHQnXSksXG4gICAgZGVzY3JpcHRpb246IHRvT3B0aW9uYWxTdHJpbmcoZGF0YVsnZGVzY3JpcHRpb24nXSkgPz8gJycsXG4gICAgc2lnbmF0dXJlOiB0b09wdGlvbmFsU3RyaW5nKGRhdGFbJ3NpZ25hdHVyZSddKSA/PyAnJyxcbiAgICB0aXRsZVxuICB9O1xuXG4gIHJldHVybiB7XG4gICAgaGFzaDogY29tcHV0ZU9nSGFzaChwYXJhbXMpLFxuICAgIHBhcmFtcyxcbiAgICBzbHVnOiBnZXRPZ0ltYWdlUGFnZVNsdWcoZGF0YSwgZmlsZVBhdGgsIGNvbnRlbnREb2NzRGlyZWN0b3J5KVxuICB9O1xufVxuXG5mdW5jdGlvbiB0b09wdGlvbmFsU3RyaW5nKHZhbHVlOiB1bmtub3duKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycgPyB2YWx1ZSA6IHVuZGVmaW5lZDtcbn1cblxuYXN5bmMgZnVuY3Rpb24gd2Fsa0RpcmVjdG9yeShkaXJlY3Rvcnk6IHN0cmluZywgY29udGVudERvY3NEaXJlY3Rvcnk6IHN0cmluZywgcGFnZXM6IFBhZ2VFbnRyeVtdKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IGVudHJpZXMgPSBhd2FpdCByZWFkZGlyKGRpcmVjdG9yeSwgeyB3aXRoRmlsZVR5cGVzOiB0cnVlIH0pO1xuICBmb3IgKGNvbnN0IGVudHJ5IG9mIGVudHJpZXMpIHtcbiAgICBjb25zdCBmdWxsUGF0aCA9IGAke2RpcmVjdG9yeX0vJHtlbnRyeS5uYW1lfWA7XG4gICAgaWYgKGVudHJ5LmlzRGlyZWN0b3J5KCkpIHtcbiAgICAgIGF3YWl0IHdhbGtEaXJlY3RvcnkoZnVsbFBhdGgsIGNvbnRlbnREb2NzRGlyZWN0b3J5LCBwYWdlcyk7XG4gICAgfSBlbHNlIGlmIChlbnRyeS5uYW1lLmVuZHNXaXRoKCcubWQnKSB8fCBlbnRyeS5uYW1lLmVuZHNXaXRoKCcubWR4JykpIHtcbiAgICAgIGNvbnN0IHBhZ2UgPSBhd2FpdCBwYXJzZVBhZ2UoZnVsbFBhdGgsIGNvbnRlbnREb2NzRGlyZWN0b3J5KTtcbiAgICAgIGlmIChwYWdlKSB7XG4gICAgICAgIHBhZ2VzLnB1c2gocGFnZSk7XG4gICAgICB9XG4gICAgfVxuICB9XG59XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQVFBLHlCQUEyQjtBQUMzQixxQkFBMkI7QUFDM0Isc0JBS087QUFDUCxtQkFBd0I7QUFDeEIsa0JBQW1DO0FBSW5DLDJCQUFtQztBQUNuQyxzQkFLTztBQXlEUCxNQUFNLGNBQWM7QUFDcEIsTUFBTSx3QkFBd0I7QUFDOUIsTUFBTSxrQkFBa0I7QUFNeEIsTUFBTSx1QkFBdUI7QUFVN0IsZUFBc0IsaUJBQWlCLFNBQWdEO0FBQ3JGLFFBQU0sRUFBRSxXQUFXLHNCQUFzQixhQUFhLGdCQUFnQixnQkFBZ0IsSUFBSTtBQUMxRixRQUFNLGVBQWUsR0FBRyxlQUFlO0FBRXZDLE1BQUksS0FBQywyQkFBVyxvQkFBb0IsR0FBRztBQUNyQyxZQUFRLEtB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QUFTLGFBQWEsWUFBWSxPQUFPLFNBQVMsVUFBVSxXQUN0RSxFQUFFLE9BQU8sU0FBUyxPQUFPLFVBQVUsU0FBUyxTQUFTLElBQ3JEO0FBQ047QUFFQSxTQUFTLGlCQUFpQixTQUFtRDtBQUMzRSxRQUFNLGNBQWMscUJBQXFCLEtBQUssT0FBTyxHQUFHLFNBQVMsYUFBYTtBQUM5RSxTQUFPLGdCQUFnQixTQUFZLENBQUMsUUFBSyxZQUFBQSxPQUFVLFdBQVcsS0FBaUQsQ0FBQztBQUNsSDtBQUVBLGVBQWUsVUFBVSxVQUFrQixzQkFBeUQ7QUFDbEcsUUFBTSxPQUFPLGlCQUFpQixVQUFNLDBCQUFTLFVBQVUsT0FBTyxDQUFDO0FBRS9ELFFBQU0sUUFBUSxpQkFBaUIsS0FBSyxPQUFPLENBQUM7QUFDNUMsTUFBSSxDQUFDLE9BQU87QUFDVixXQUFPO0FBQUEsRUFDVDtBQUVBLFFBQU0sUUFBUSxLQUFLLFNBQVM7QUFDNUIsUUFBTSxTQUF3QjtBQUFBLElBQzVCLE9BQU8saUJBQWlCLFFBQVEsT0FBTyxJQUFJLE1BQU0sQ0FBQztBQUFBLElBQ2xELGFBQWEsaUJBQWlCLEtBQUssYUFBYSxDQUFDLEtBQUs7QUFBQSxJQUN0RCxXQUFXLGlCQUFpQixLQUFLLFdBQVcsQ0FBQyxLQUFLO0FBQUEsSUFDbEQ7QUFBQSxFQUNGO0FBRUEsU0FBTztBQUFBLElBQ0wsVUFBTSwrQkFBYyxNQUFNO0FBQUEsSUFDMUI7QUFBQSxJQUNBLFVBQU0seUNBQW1CLE1BQU0sVUFBVSxvQkFBb0I7QUFBQSxFQUMvRDtBQUNGO0FBRUEsU0FBUyxpQkFBaUIsT0FBb0M7QUFDNUQsU0FBTyxPQUFPLFVBQVUsV0FBVyxRQUFRO0FBQzdDO0FBRUEsZUFBZSxjQUFjLFdBQW1CLHNCQUE4QixPQUFtQztBQUMvRyxRQUFNLFVBQVUsVUFBTSx5QkFBUSxXQUFXLEVBQUUsZUFBZSxLQUFLLENBQUM7QUFDaEUsYUFBVyxTQUFTLFNBQVM7QUFDM0IsVUFBTSxXQUFXLEdBQUcsU0FBUyxJQUFJLE1BQU0sSUFBSTtBQUMzQyxRQUFJLE1BQU0sWUFBWSxHQUFHO0FBQ3ZCLFlBQU0sY0FBYyxVQUFVLHNCQUFzQixLQUFLO0FBQUEsSUFDM0QsV0FBVyxNQUFNLEtBQUssU0FBUyxLQUFLLEtBQUssTUFBTSxLQUFLLFNBQVMsTUFBTSxHQUFHO0FBQ3BFLFlBQU0sT0FBTyxNQUFNLFVBQVUsVUFBVSxvQkFBb0I7QUFDM0QsVUFBSSxNQUFNO0FBQ1IsY0FBTSxLQUFLLElBQUk7QUFBQSxNQUNqQjtBQUFBLElBQ0Y7QUFBQSxFQUNGO0FBQ0Y7IiwibmFtZXMiOlsicGFyc2VZYW1sIl19
|
|
@@ -34,7 +34,7 @@ export interface GenerateOgImagesParams {
|
|
|
34
34
|
* Generates the Open Graph cards.
|
|
35
35
|
*
|
|
36
36
|
* A card is re-rendered only when its title, description, signature or badge changed, tracked by a hash manifest
|
|
37
|
-
* beside the cards. Missing content or fonts skip the step with a warning rather than failing the build.
|
|
37
|
+
* beside the cards. A different logo file re-renders every card. Missing content or fonts skip the step with a warning rather than failing the build.
|
|
38
38
|
*
|
|
39
39
|
* @param options - The options.
|
|
40
40
|
*/
|
|
@@ -61,6 +61,7 @@ import {
|
|
|
61
61
|
escapeMarkdown,
|
|
62
62
|
escapeMdxAngleBrackets,
|
|
63
63
|
escapeMdxBraces,
|
|
64
|
+
escapeMdxProse,
|
|
64
65
|
escapeYaml,
|
|
65
66
|
getDisplayName,
|
|
66
67
|
getImportStatement,
|
|
@@ -389,8 +390,8 @@ function renderFunctionPage(lines, info, allTypes) {
|
|
|
389
390
|
}
|
|
390
391
|
lines.push("");
|
|
391
392
|
}
|
|
392
|
-
const returnDesc = $function.returnDescription ? ` \u2014 ${
|
|
393
|
-
lines.push(`**Returns:** ${escapeMdxAngleBrackets(renderTypeWithLinks($function.returnType, allTypes, info.name, info.namespace))}${returnDesc}`, "");
|
|
393
|
+
const returnDesc = $function.returnDescription ? ` \u2014 ${escapeMdxProse(resolveLinks($function.returnDescription, allTypes, info.namespace))}` : "";
|
|
394
|
+
lines.push(`**Returns:** ${escapeMdxBraces(escapeMdxAngleBrackets(renderTypeWithLinks($function.returnType, allTypes, info.name, info.namespace)))}${returnDesc}`, "");
|
|
394
395
|
for (const example of $function.examples) {
|
|
395
396
|
lines.push("**Example:**", "", renderExampleMdx(example, allTypes, info.namespace), "");
|
|
396
397
|
}
|
|
@@ -545,4 +546,4 @@ export {
|
|
|
545
546
|
renderVariablePage,
|
|
546
547
|
sidebarTreeToEntries
|
|
547
548
|
};
|
|
548
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9kb2NzLXNpdGUvYXBpLWRvYy1wYWdlLWdlbmVyYXRpb24udHMiXSwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAZmlsZVxuICpcbiAqIE1EWCBwYWdlICsgc2lkZWJhciBlbWlzc2lvbjogcmVuZGVycyBtb2R1bGUgaW5kZXggcGFnZXMsIHBlci10eXBlIG92ZXJ2aWV3IHBhZ2VzLCBwZXItbWVtYmVyIHBhZ2VzLFxuICogYmFja2xpbmtzLCBhbmQgdGhlIFN0YXJsaWdodCBzaWRlYmFyIEpTT04uXG4gKi9cblxuaW1wb3J0IHsgZ2V0TWFuZGF0b3J5TmFtZWRHcm91cCB9IGZyb20gJ0BtbmFvdW1vdi90eXBlc2NyaXB0LWxpYi9yZWctZXhwJztcbmltcG9ydCB7IGVuc3VyZU5vbk51bGxhYmxlIH0gZnJvbSAnQG1uYW91bW92L3R5cGVzY3JpcHQtbGliL3R5cGUtZ3VhcmRzJztcbmltcG9ydCB7IHdyaXRlRmlsZSB9IGZyb20gJ25vZGU6ZnMvcHJvbWlzZXMnO1xuaW1wb3J0IHsgam9pbiB9IGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCB0eXBlIHtcbiAgTWVtYmVySW5mbyxcbiAgUGFnZUNvbnRlbnQsXG4gIFBhZ2VGcm9udE1hdHRlcixcbiAgU2lkZWJhckVudHJ5LFxuICBTaWRlYmFyTGluayxcbiAgU2lkZWJhclRyZWVOb2RlLFxuICBUeXBlSW5mb1xufSBmcm9tICcuL2FwaS1kb2MtdHlwZXMudHMnO1xuXG5pbXBvcnQgeyBFVkVOVF9NRVRIT0RTIH0gZnJvbSAnLi9hcGktZG9jLWNvbnN0YW50cy50cyc7XG5pbXBvcnQge1xuICBsaW5rQmFzZVR5cGUsXG4gIG1hcmtkb3duVG9IdG1sLFxuICBtZW1iZXJIcmVmLFxuICByZW5kZXJFeGFtcGxlTWR4LFxuICByZW5kZXJNZHhQcm9zZSxcbiAgcmVuZGVyVHlwZVdpdGhMaW5rcyxcbiAgcmVzb2x2ZUxpbmtzLFxuICB0b1R5cGVGaWxlU2VnbWVudCxcbiAgdG9UeXBlUm91dGVTZWdtZW50LFxuICB0eXBlTGlua1xufSBmcm9tICcuL2FwaS1kb2MtbGluay1yZW5kZXJpbmcudHMnO1xuaW1wb3J0IHsgZ2V0QXBpRG9jU2V0dGluZ3MgfSBmcm9tICcuL2FwaS1kb2Mtc2V0dGluZ3MudHMnO1xuaW1wb3J0IHtcbiAgZW5zdXJlRGlyZWN0b3J5LFxuICBlc2NhcGVKc1N0cmluZyxcbiAgZXNjYXBlSnN4QXR0cmlidXRlLFxuICBlc2NhcGVNYXJrZG93bixcbiAgZXNjYXBlTWR4QW5nbGVCcmFja2V0cyxcbiAgZXNjYXBlTWR4QnJhY2VzLFxuICBlc2NhcGVZYW1sLFxuICBnZXREaXNwbGF5TmFtZSxcbiAgZ2V0SW1wb3J0U3RhdGVtZW50LFxuICBnZXROYW1lc3BhY2VEaXJlY3RvcnksXG4gIG1lbWJlclJvdXRlU2VnbWVudCxcbiAgbWVtYmVyU2x1ZyxcbiAgb3ZlcmxvYWRSb3V0ZVNlZ21lbnQsXG4gIG92ZXJsb2FkU2x1ZyxcbiAgc3RyaXBNYXJrZG93bixcbiAgdHJ1bmNhdGVTaWduYXR1cmVcbn0gZnJvbSAnLi9hcGktZG9jLXRleHQtdXRpbHMudHMnO1xuaW1wb3J0IHsgQVBJX0NPTVBPTkVOVFNfSU1QT1JUX1BSRUZJWCB9IGZyb20gJy4vZG9jcy1zaXRlLWFzc2V0cy50cyc7XG5cbmNvbnN0IEpTT05fSU5ERU5UID0gMjtcblxuLyoqXG4gKiBBcHBlbmQgYmFja2xpbmtzIHRvIG92ZXJ2aWV3IHBhZ2VzIGFuZCB3cml0ZSBhbGwgZmlsZXMuIEtleWVkIGJ5IHF1YWxpZmllZCBgJHtuYW1lc3BhY2V9IyR7bmFtZX1gLlxuICpcbiAqIEBwYXJhbSBwYWdlQ29udGVudHMgLSBFdmVyeSBvdmVydmlldyBwYWdlJ3MgY29udGVudCBhbmQgcGF0aCwga2V5ZWQgYnkgcXVhbGlmaWVkIGlkLlxuICogQHBhcmFtIGFsbFR5cGVzIC0gRXZlcnkgZG9jdW1lbnRlZCB0eXBlLCBrZXllZCBieSBgJHtuYW1lc3BhY2V9IyR7bmFtZX1gLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gYXBwZW5kQmFja2xpbmtzQW5kV3JpdGUoXG4gIHBhZ2VDb250ZW50czogTWFwPHN0cmluZywgUGFnZUNvbnRlbnQ+LFxuICBhbGxUeXBlczogTWFwPHN0cmluZywgVHlwZUluZm8+XG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgYmFja2xpbmtzID0gYnVpbGRCYWNrbGlua3NGcm9tQ29udGVudChwYWdlQ29udGVudHMsIGFsbFR5cGVzKTtcblxuICBmb3IgKGNvbnN0IFtrZXksIHsgY29udGVudCwgZmlsZVBhdGggfV0gb2YgcGFnZUNvbnRlbnRzKSB7XG4gICAgY29uc3QgdHlwZUJhY2tsaW5rcyA9IGJhY2tsaW5rcy5nZXQoa2V5KSA/PyBbXTtcbiAgICBjb25zdCBsaW5lcyA9IFtjb250ZW50XTtcbiAgICBpZiAodHlwZUJhY2tsaW5rcy5sZW5ndGggPiAwKSB7XG4gICAgICBjb25zdCBzb3J0ZWRCYWNrbGlua3MgPSBbLi4udHlwZUJhY2tsaW5rc10uc29ydCgoYSwgYikgPT4gYS5sb2NhbGVDb21wYXJlKGIpKTtcbiAgICAgIGxpbmVzLnB1c2goJycsICctLS0nLCAnJywgJyoqTGlua3MgdG8gdGhpcyBwYWdlOioqJywgJycpO1xuICAgICAgZm9yIChjb25zdCBibEtleSBvZiBzb3J0ZWRCYWNrbGlua3MpIHtcbiAgICAgICAgY29uc3QgYmxJbmZvID0gZW5zdXJlTm9uTnVsbGFibGUoYWxsVHlwZXMuZ2V0KGJsS2V5KSk7XG4gICAgICAgIGNvbnN0IGJsTnNEaXJlY3RvcnkgPSBnZXROYW1lc3BhY2VEaXJlY3RvcnkoYmxJbmZvLm5hbWVzcGFjZSk7XG4gICAgICAgIGxpbmVzLnB1c2goYC0gWyR7YmxJbmZvLm5hbWV9XSgke2dldEFwaURvY1NldHRpbmdzKCkuYmFzZVBhdGh9L2FwaS8ke2JsTnNEaXJlY3Rvcnl9LyR7dG9UeXBlUm91dGVTZWdtZW50KGJsSW5mby5uYW1lc3BhY2UsIGJsSW5mby5uYW1lKX0vKWApO1xuICAgICAgfVxuICAgIH1cbiAgICBhd2FpdCB3cml0ZUZpbGUoZmlsZVBhdGgsIGxpbmVzLmpvaW4oJ1xcbicpLCAndXRmLTgnKTtcbiAgfVxufVxuXG4vKipcbiAqIEJ1aWxkIGJhY2tsaW5rcyBieSBzY2FubmluZyBnZW5lcmF0ZWQgcGFnZSBjb250ZW50IGZvciBpbnRlcm5hbCBBUEkgbGlua3MuIEtleWVkIGJ5IHF1YWxpZmllZCBpZC5cbiAqXG4gKiBAcGFyYW0gcGFnZUNvbnRlbnRzIC0gRXZlcnkgb3ZlcnZpZXcgcGFnZSdzIGNvbnRlbnQgYW5kIHBhdGgsIGtleWVkIGJ5IHF1YWxpZmllZCBpZC5cbiAqIEBwYXJhbSBhbGxUeXBlcyAtIEV2ZXJ5IGRvY3VtZW50ZWQgdHlwZSwga2V5ZWQgYnkgYCR7bmFtZXNwYWNlfSMke25hbWV9YC5cbiAqIEByZXR1cm5zIEVhY2ggcmVmZXJlbmNlZCB0eXBlJ3MgcXVhbGlmaWVkIGlkIG1hcHBlZCB0byB0aGUgaWRzIG9mIHRoZSBwYWdlcyBsaW5raW5nIHRvIGl0LlxuICovXG5leHBvcnQgZnVuY3Rpb24gYnVpbGRCYWNrbGlua3NGcm9tQ29udGVudChcbiAgcGFnZUNvbnRlbnRzOiBNYXA8c3RyaW5nLCBQYWdlQ29udGVudD4sXG4gIGFsbFR5cGVzOiBNYXA8c3RyaW5nLCBUeXBlSW5mbz5cbik6IE1hcDxzdHJpbmcsIHN0cmluZ1tdPiB7XG4gIGNvbnN0IGJhY2tsaW5rcyA9IG5ldyBNYXA8c3RyaW5nLCBzdHJpbmdbXT4oKTtcbiAgLy8gRW1pdHRlZCBVUkxzIGxvd2VyY2FzZSB0aGUgdHlwZSBzZWdtZW50IChzZWUgdG9Sb3V0ZVNlZ21lbnQpLCBzbyBtYXAgZWFjaCBsb3dlcmNhc2VkIHJvdXRlXG4gIC8vIGlkZW50aXR5IGJhY2sgdG8gaXRzIG9yaWdpbmFsIHF1YWxpZmllZCB0eXBlIGtleS5cbiAgY29uc3Qgcm91dGVLZXlUb1R5cGVLZXkgPSBuZXcgTWFwPHN0cmluZywgc3RyaW5nPigpO1xuICBmb3IgKGNvbnN0IFt0eXBlS2V5LCBpbmZvXSBvZiBhbGxUeXBlcykge1xuICAgIHJvdXRlS2V5VG9UeXBlS2V5LnNldChgJHtnZXROYW1lc3BhY2VEaXJlY3RvcnkoaW5mby5uYW1lc3BhY2UpfSMke3RvVHlwZVJvdXRlU2VnbWVudChpbmZvLm5hbWVzcGFjZSwgaW5mby5uYW1lKX1gLCB0eXBlS2V5KTtcbiAgfVxuICBjb25zdCBlc2NhcGVkQmFzZSA9IGdldEFwaURvY1NldHRpbmdzKCkuYmFzZVBhdGgucmVwbGFjZUFsbCgvWy4qKz9eJHt9KCl8W1xcXVxcXFxdL2csIFN0cmluZy5yYXdgXFwkJmApO1xuICBjb25zdCBsaW5rUGF0dGVybiA9IG5ldyBSZWdFeHAoYCR7ZXNjYXBlZEJhc2V9L2FwaS8oPzxwYXRoPig/OlthLXpBLVowLTlfQC1dKy8pKylgLCAnZycpO1xuICBmb3IgKGNvbnN0IFtzb3VyY2VLZXksIHsgY29udGVudCB9XSBvZiBwYWdlQ29udGVudHMpIHtcbiAgICBjb25zdCByZWZlcmVuY2VkID0gbmV3IFNldDxzdHJpbmc+KCk7XG5cbiAgICBmb3IgKGNvbnN0IG1hdGNoIG9mIGNvbnRlbnQubWF0Y2hBbGwobGlua1BhdHRlcm4pKSB7XG4gICAgICAvLyBUaGUgcGF0dGVybiByZXF1aXJlcyBhdCBsZWFzdCBvbmUgc2VnbWVudC5cbiAgICAgIGNvbnN0IHNlZ21lbnRzID0gZ2V0TWFuZGF0b3J5TmFtZWRHcm91cChtYXRjaCwgJ3BhdGgnKS5zcGxpdCgnLycpLmZpbHRlcihCb29sZWFuKTtcbiAgICAgIGNvbnN0IHR5cGVOYW1lID0gZW5zdXJlTm9uTnVsbGFibGUoc2VnbWVudHMuYXQoLTEpKTtcbiAgICAgIGNvbnN0IG5hbWVzcGFjZSA9IHNlZ21lbnRzLnNsaWNlKDAsIC0xKS5qb2luKCcvJyk7XG4gICAgICBjb25zdCByb3V0ZUtleSA9IGAke25hbWVzcGFjZX0jJHt0eXBlTmFtZX1gO1xuICAgICAgY29uc3QgcmVzb2x2ZWRLZXkgPSByb3V0ZUtleVRvVHlwZUtleS5nZXQocm91dGVLZXkpO1xuICAgICAgaWYgKHJlc29sdmVkS2V5ICE9PSB1bmRlZmluZWQgJiYgcmVzb2x2ZWRLZXkgIT09IHNvdXJjZUtleSkge1xuICAgICAgICByZWZlcmVuY2VkLmFkZChyZXNvbHZlZEtleSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgZm9yIChjb25zdCByZWZlcmVuY2Ugb2YgcmVmZXJlbmNlZCkge1xuICAgICAgaWYgKCFiYWNrbGlua3MuaGFzKHJlZmVyZW5jZSkpIHtcbiAgICAgICAgYmFja2xpbmtzLnNldChyZWZlcmVuY2UsIFtdKTtcbiAgICAgIH1cbiAgICAgIGJhY2tsaW5rcy5nZXQocmVmZXJlbmNlKT8ucHVzaChzb3VyY2VLZXkpO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBiYWNrbGlua3M7XG59XG5cbi8qKlxuICogQnVpbGRzIHRoZSBuYW1lc3BhY2UgdHJlZSB0aGUgc2lkZWJhciBpcyBnZW5lcmF0ZWQgZnJvbS5cbiAqXG4gKiBAcGFyYW0gdHlwZXMgLSBUaGUgZG9jdW1lbnRlZCB0eXBlcywga2V5ZWQgYnkgcXVhbGlmaWVkIGlkLlxuICogQHJldHVybnMgVGhlIHJvb3Qgb2YgdGhlIHRyZWUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBidWlsZFNpZGViYXJUcmVlKHR5cGVzOiBNYXA8c3RyaW5nLCBUeXBlSW5mbz4pOiBTaWRlYmFyVHJlZU5vZGUge1xuICBjb25zdCByb290OiBTaWRlYmFyVHJlZU5vZGUgPSB7IGNoaWxkcmVuOiBuZXcgTWFwKCksIHR5cGVzOiBbXSB9O1xuICBmb3IgKGNvbnN0IFssIGluZm9dIG9mIHR5cGVzKSB7XG4gICAgY29uc3QgcGFydHMgPSBpbmZvLm5hbWVzcGFjZS5zcGxpdCgnLycpO1xuICAgIGxldCBub2RlID0gcm9vdDtcbiAgICBmb3IgKGNvbnN0IHBhcnQgb2YgcGFydHMpIHtcbiAgICAgIGxldCBjaGlsZCA9IG5vZGUuY2hpbGRyZW4uZ2V0KHBhcnQpO1xuICAgICAgaWYgKCFjaGlsZCkge1xuICAgICAgICBjaGlsZCA9IHsgY2hpbGRyZW46IG5ldyBNYXAoKSwgdHlwZXM6IFtdIH07XG4gICAgICAgIG5vZGUuY2hpbGRyZW4uc2V0KHBhcnQsIGNoaWxkKTtcbiAgICAgIH1cbiAgICAgIG5vZGUgPSBjaGlsZDtcbiAgICB9XG4gICAgbm9kZS50eXBlcy5wdXNoKGluZm8pO1xuICB9XG4gIHJldHVybiByb290O1xufVxuXG4vKipcbiAqIFRoZSByYXcgY29kZSBzaWduYXR1cmUgc2hvd24gb24gYSB0eXBlLW92ZXJ2aWV3IHBhZ2UncyBPRyBjYXJkLCBmb3IgdGhlIGtpbmRzIHRoYXQgcmVuZGVyIGEgc2luZ2xlXG4gKiBzaWduYXR1cmUgbGluZSAoZnVuY3Rpb24gLyB0eXBlIGFsaWFzIC8gdmFyaWFibGUpLiBDbGFzc2VzLCBpbnRlcmZhY2VzIGFuZCBlbnVtcyByZW5kZXIgbWVtYmVyXG4gKiB0YWJsZXMgaW5zdGVhZCwgc28gdGhleSBnZXQgbm8gc2lnbmF0dXJlIGJsb2NrLlxuICpcbiAqIEBwYXJhbSBuYW1lIC0gVGhlIHR5cGUncyBuYW1lLlxuICogQHBhcmFtIGluZm8gLSBUaGUgZG9jdW1lbnRlZCB0eXBlLlxuICogQHJldHVybnMgVGhlIHNpZ25hdHVyZSwgb3IgYHVuZGVmaW5lZGAgZm9yIGEga2luZCB0aGF0IHJlbmRlcnMgbWVtYmVyIHRhYmxlcyBpbnN0ZWFkLlxuICovXG5leHBvcnQgZnVuY3Rpb24gY29tcHV0ZU92ZXJ2aWV3U2lnbmF0dXJlKG5hbWU6IHN0cmluZywgaW5mbzogVHlwZUluZm8pOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICBpZiAoaW5mby5raW5kID09PSAnZnVuY3Rpb24nKSB7XG4gICAgY29uc3QgJGZ1bmN0aW9uID0gaW5mby5tZXRob2RzWzBdO1xuICAgIHJldHVybiAkZnVuY3Rpb24gPyBgZnVuY3Rpb24gJHskZnVuY3Rpb24uc2lnbmF0dXJlfTogJHskZnVuY3Rpb24ucmV0dXJuVHlwZX1gIDogdW5kZWZpbmVkO1xuICB9XG4gIGlmIChpbmZvLmtpbmQgPT09ICd0eXBlJykge1xuICAgIHJldHVybiBgdHlwZSAke2dldERpc3BsYXlOYW1lKGluZm8ubmFtZSwgaW5mbyl9ID0gJHtpbmZvLnR5cGVBbGlhc1RleHQgPz8gJ3Vua25vd24nfWA7XG4gIH1cbiAgcmV0dXJuIGluZm8ua2luZCA9PT0gJ3ZhcmlhYmxlJyA/IGAke2luZm8udmFyaWFibGVLZXl3b3JkID8/ICdsZXQnfSAke25hbWV9OiAke2luZm8udmFyaWFibGVUeXBlID8/ICd1bmtub3duJ31gIDogdW5kZWZpbmVkO1xufVxuXG4vKipcbiAqIFdyaXRlcyBvbmUgcGFnZSBwZXIgb3duIHByb3BlcnR5IGFuZCBwZXIgb3duIG1ldGhvZCBvdmVybG9hZCBrZXkgb2YgYSBjbGFzcyBvciBpbnRlcmZhY2UuXG4gKlxuICogQHBhcmFtIG5hbWUgLSBUaGUgdHlwZSdzIG5hbWUuXG4gKiBAcGFyYW0gaW5mbyAtIFRoZSBkb2N1bWVudGVkIHR5cGUuXG4gKiBAcGFyYW0gYWxsVHlwZXMgLSBFdmVyeSBkb2N1bWVudGVkIHR5cGUsIGtleWVkIGJ5IGAke25hbWVzcGFjZX0jJHtuYW1lfWAuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZW5lcmF0ZU1lbWJlclBhZ2VzKG5hbWU6IHN0cmluZywgaW5mbzogVHlwZUluZm8sIGFsbFR5cGVzOiBNYXA8c3RyaW5nLCBUeXBlSW5mbz4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgbnNEaXJlY3RvcnkgPSBnZXROYW1lc3BhY2VEaXJlY3RvcnkoaW5mby5uYW1lc3BhY2UpO1xuICBjb25zdCB0eXBlRmlsZURpcmVjdG9yeSA9IHRvVHlwZUZpbGVTZWdtZW50KGluZm8ubmFtZXNwYWNlLCBuYW1lKTtcbiAgY29uc3QgdHlwZVJvdXRlRGlyZWN0b3J5ID0gdG9UeXBlUm91dGVTZWdtZW50KGluZm8ubmFtZXNwYWNlLCBuYW1lKTtcbiAgY29uc3QgY29tcG9uZW50SW1wb3J0cyA9IGdldENvbXBvbmVudEltcG9ydHMoWydNZW1iZXJEZXRhaWwnXSk7XG5cbiAgLy8gUHJvcGVydHkgcGFnZXMgKHNraXAgaW5oZXJpdGVkIOKAlCB0aGV5IGxpdmUgb24gdGhlIHBhcmVudCB0eXBlKVxuICBjb25zdCBwcm9wZXJ0aWVzID0gaW5mby5wcm9wZXJ0aWVzLmZpbHRlcigocCkgPT4gIXAuaW5oZXJpdGVkRnJvbSk7XG4gIGZvciAoY29uc3QgcHJvcGVydHkgb2YgcHJvcGVydGllcykge1xuICAgIGNvbnN0IGZpbGVQYXRoID0gam9pbihnZXRBcGlEb2NTZXR0aW5ncygpLm91dHB1dERpcmVjdG9yeSwgbnNEaXJlY3RvcnksIHR5cGVGaWxlRGlyZWN0b3J5LCBgJHttZW1iZXJTbHVnKHByb3BlcnR5Lm5hbWUpfS5tZHhgKTtcbiAgICBhd2FpdCBlbnN1cmVEaXJlY3RvcnkoZmlsZVBhdGgpO1xuXG4gICAgY29uc3QgcHJvcGVydHlUaXRsZSA9IGAke25hbWV9LiR7cHJvcGVydHkubmFtZX1gO1xuICAgIGNvbnN0IGxpbmVzOiBzdHJpbmdbXSA9IHJlbmRlckZyb250TWF0dGVyKHtcbiAgICAgIGRlc2NyaXB0aW9uOiBwcm9wZXJ0eS5kZXNjcmlwdGlvbixcbiAgICAgIHNpZGViYXJMYWJlbDogcHJvcGVydHlUaXRsZSxcbiAgICAgIHNpZ25hdHVyZTogYCR7cHJvcGVydHkuc2lnbmF0dXJlfTogJHtwcm9wZXJ0eS50eXBlfWAsXG4gICAgICBzbHVnOiBgYXBpLyR7bnNEaXJlY3Rvcnl9LyR7dHlwZVJvdXRlRGlyZWN0b3J5fS8ke21lbWJlclJvdXRlU2VnbWVudChwcm9wZXJ0eS5uYW1lKX1gLFxuICAgICAgdGl0bGU6IHByb3BlcnR5VGl0bGVcbiAgICB9KTtcbiAgICBsaW5lcy5wdXNoKFxuICAgICAgLi4uY29tcG9uZW50SW1wb3J0cyxcbiAgICAgICcnLFxuICAgICAgLy8gQnJlYWRjcnVtYlxuICAgICAgYFske25hbWV9XSgke2dldEFwaURvY1NldHRpbmdzKCkuYmFzZVBhdGh9L2FwaS8ke25zRGlyZWN0b3J5fS8ke3R5cGVSb3V0ZURpcmVjdG9yeX0vKSDigLogJHtwcm9wZXJ0eS5uYW1lfWAsXG4gICAgICAnJ1xuICAgICk7XG5cbiAgICBjb25zdCBzdGF0aWNBdHRyaWJ1dGUgPSBwcm9wZXJ0eS5pc1N0YXRpYyA/ICcgaXNTdGF0aWM9e3RydWV9JyA6ICcnO1xuICAgIGNvbnN0IHR5cGVBdHRyaWJ1dGUgPSBgIHR5cGU9XCIke2VzY2FwZUpzeEF0dHJpYnV0ZShtYXJrZG93blRvSHRtbChyZW5kZXJUeXBlV2l0aExpbmtzKHByb3BlcnR5LnR5cGUsIGFsbFR5cGVzLCBuYW1lLCBpbmZvLm5hbWVzcGFjZSkpKX1cImA7XG4gICAgY29uc3QgZGVzY0F0dHJpYnV0ZSA9IHByb3BlcnR5LmRlc2NyaXB0aW9uID8gYCBkZXNjcmlwdGlvbj1cIiR7ZXNjYXBlSnN4QXR0cmlidXRlKG1hcmtkb3duVG9IdG1sKHJlc29sdmVMaW5rcyhwcm9wZXJ0eS5kZXNjcmlwdGlvbiwgYWxsVHlwZXMsIGluZm8ubmFtZXNwYWNlKSkpfVwiYCA6ICcnO1xuICAgIGNvbnN0IHJlbWFya3NBdHRyaWJ1dGUgPSBwcm9wZXJ0eS5yZW1hcmtzID8gYCByZW1hcmtzPVwiJHtlc2NhcGVKc3hBdHRyaWJ1dGUobWFya2Rvd25Ub0h0bWwocmVzb2x2ZUxpbmtzKHByb3BlcnR5LnJlbWFya3MsIGFsbFR5cGVzLCBpbmZvLm5hbWVzcGFjZSkpKX1cImAgOiAnJztcbiAgICBjb25zdCBzaW5jZUF0dHJpYnV0ZSA9IHByb3BlcnR5LnNpbmNlID8gYCBzaW5jZT1cIiR7ZXNjYXBlSnN4QXR0cmlidXRlKHByb3BlcnR5LnNpbmNlKX1cImAgOiAnJztcbiAgICBjb25zdCBleGFtcGxlc0F0dHJpYnV0ZSA9IHByb3BlcnR5LmV4YW1wbGVzLmxlbmd0aCA+IDAgPyBgIGV4YW1wbGVzPXske0pTT04uc3RyaW5naWZ5KHByb3BlcnR5LmV4YW1wbGVzKX19YCA6ICcnO1xuXG4gICAgbGluZXMucHVzaChgPE1lbWJlckRldGFpbCR7c3RhdGljQXR0cmlidXRlfSR7dHlwZUF0dHJpYnV0ZX0ke2Rlc2NBdHRyaWJ1dGV9JHtyZW1hcmtzQXR0cmlidXRlfSR7c2luY2VBdHRyaWJ1dGV9JHtleGFtcGxlc0F0dHJpYnV0ZX0gLz5gLCAnJyk7XG5cbiAgICBhd2FpdCB3cml0ZUZpbGUoZmlsZVBhdGgsIGxpbmVzLmpvaW4oJ1xcbicpLCAndXRmLTgnKTtcbiAgfVxuXG4gIC8vIE1ldGhvZCBwYWdlcyDigJQgZWFjaCBvdmVybG9hZCBrZXkgZ2V0cyBpdHMgb3duIHBhZ2UgKHNraXAgaW5oZXJpdGVkKVxuICBjb25zdCBtZXRob2RzID0gaW5mby5tZXRob2RzLmZpbHRlcigobSkgPT4gIW0uaW5oZXJpdGVkRnJvbSk7XG4gIGNvbnN0IG92ZXJsb2FkR3JvdXBzID0gbmV3IE1hcDxzdHJpbmcsIE1lbWJlckluZm9bXT4oKTtcbiAgZm9yIChjb25zdCBtZXRob2Qgb2YgbWV0aG9kcykge1xuICAgIGNvbnN0IGtleSA9IG1ldGhvZC5vdmVybG9hZEtleTtcbiAgICBpZiAoIW92ZXJsb2FkR3JvdXBzLmhhcyhrZXkpKSB7XG4gICAgICBvdmVybG9hZEdyb3Vwcy5zZXQoa2V5LCBbXSk7XG4gICAgfVxuICAgIG92ZXJsb2FkR3JvdXBzLmdldChrZXkpPy5wdXNoKG1ldGhvZCk7XG4gIH1cblxuICBmb3IgKGNvbnN0IFtvdmVybG9hZEtleSwgb3ZlcmxvYWRzXSBvZiBvdmVybG9hZEdyb3Vwcykge1xuICAgIGNvbnN0IGZpbGVTbHVnID0gb3ZlcmxvYWRTbHVnKG92ZXJsb2FkS2V5KTtcbiAgICBjb25zdCBmaWxlUGF0aCA9IGpvaW4oZ2V0QXBpRG9jU2V0dGluZ3MoKS5vdXRwdXREaXJlY3RvcnksIG5zRGlyZWN0b3J5LCB0eXBlRmlsZURpcmVjdG9yeSwgYCR7ZmlsZVNsdWd9Lm1keGApO1xuICAgIGF3YWl0IGVuc3VyZURpcmVjdG9yeShmaWxlUGF0aCk7XG5cbiAgICBjb25zdCBkaXNwbGF5TmFtZSA9IGAke25hbWV9LiR7b3ZlcmxvYWRLZXl9IG1ldGhvZGA7XG4gICAgLy8gQSBncm91cCBpcyBjcmVhdGVkIGJ5IGl0cyBmaXJzdCBvdmVybG9hZC5cbiAgICBjb25zdCBmaXJzdE92ZXJsb2FkID0gZW5zdXJlTm9uTnVsbGFibGUob3ZlcmxvYWRzWzBdKTtcblxuICAgIGNvbnN0IGxpbmVzOiBzdHJpbmdbXSA9IHJlbmRlckZyb250TWF0dGVyKHtcbiAgICAgIGRlc2NyaXB0aW9uOiBmaXJzdE92ZXJsb2FkLmRlc2NyaXB0aW9uLFxuICAgICAgc2lkZWJhckxhYmVsOiBgJHtuYW1lfS4ke292ZXJsb2FkS2V5fWAsXG4gICAgICBzaWduYXR1cmU6IGAke2ZpcnN0T3ZlcmxvYWQuc2lnbmF0dXJlfTogJHtmaXJzdE92ZXJsb2FkLnJldHVyblR5cGV9YCxcbiAgICAgIHNsdWc6IGBhcGkvJHtuc0RpcmVjdG9yeX0vJHt0eXBlUm91dGVEaXJlY3Rvcnl9LyR7b3ZlcmxvYWRSb3V0ZVNlZ21lbnQob3ZlcmxvYWRLZXkpfWAsXG4gICAgICB0aXRsZTogZGlzcGxheU5hbWVcbiAgICB9KTtcbiAgICBsaW5lcy5wdXNoKFxuICAgICAgLi4uY29tcG9uZW50SW1wb3J0cyxcbiAgICAgICcnLFxuICAgICAgLy8gQnJlYWRjcnVtYlxuICAgICAgYFske25hbWV9XSgke2dldEFwaURvY1NldHRpbmdzKCkuYmFzZVBhdGh9L2FwaS8ke25zRGlyZWN0b3J5fS8ke3R5cGVSb3V0ZURpcmVjdG9yeX0vKSDigLogJHtvdmVybG9hZEtleX1gLFxuICAgICAgJydcbiAgICApO1xuXG4gICAgZm9yIChjb25zdCBvdmVybG9hZCBvZiBvdmVybG9hZHMpIHtcbiAgICAgIHJlbmRlck1ldGhvZE92ZXJsb2FkTWR4KGxpbmVzLCBvdmVybG9hZCwgbmFtZSwgaW5mby5uYW1lc3BhY2UsIGFsbFR5cGVzKTtcbiAgICAgIGlmIChvdmVybG9hZHMubGVuZ3RoID4gMSkge1xuICAgICAgICBsaW5lcy5wdXNoKCctLS0nLCAnJyk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgYXdhaXQgd3JpdGVGaWxlKGZpbGVQYXRoLCBsaW5lcy5qb2luKCdcXG4nKSwgJ3V0Zi04Jyk7XG4gIH1cbn1cblxuLyoqXG4gKiBXcml0ZXMgZWFjaCBtb2R1bGUncyBpbmRleCBwYWdlIGFuZCB0aGUgcm9vdCBBUEkgaW5kZXguXG4gKlxuICogQHBhcmFtIHR5cGVzIC0gVGhlIGRvY3VtZW50ZWQgdHlwZXMsIGtleWVkIGJ5IHF1YWxpZmllZCBpZC5cbiAqIEBwYXJhbSBhbGxUeXBlcyAtIEV2ZXJ5IGRvY3VtZW50ZWQgdHlwZSwga2V5ZWQgYnkgYCR7bmFtZXNwYWNlfSMke25hbWV9YC5cbiAqIEBwYXJhbSBtb2R1bGVPdmVydmlld3MgLSBFYWNoIG5hbWVzcGFjZSdzIGBAZmlsZWAgb3ZlcnZpZXcuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZW5lcmF0ZU5hbWVzcGFjZUluZGV4UGFnZXMoXG4gIHR5cGVzOiBNYXA8c3RyaW5nLCBUeXBlSW5mbz4sXG4gIGFsbFR5cGVzOiBNYXA8c3RyaW5nLCBUeXBlSW5mbz4sXG4gIG1vZHVsZU92ZXJ2aWV3czogTWFwPHN0cmluZywgc3RyaW5nPlxuKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IG5hbWVzcGFjZXMgPSBuZXcgTWFwPHN0cmluZywgVHlwZUluZm9bXT4oKTtcbiAgZm9yIChjb25zdCBbLCBpbmZvXSBvZiB0eXBlcykge1xuICAgIGlmICghbmFtZXNwYWNlcy5oYXMoaW5mby5uYW1lc3BhY2UpKSB7XG4gICAgICBuYW1lc3BhY2VzLnNldChpbmZvLm5hbWVzcGFjZSwgW10pO1xuICAgIH1cbiAgICBuYW1lc3BhY2VzLmdldChpbmZvLm5hbWVzcGFjZSk/LnB1c2goaW5mbyk7XG4gIH1cblxuICBmb3IgKGNvbnN0IFtuYW1lc3BhY2UsIG5zVHlwZXNdIG9mIG5hbWVzcGFjZXMpIHtcbiAgICBjb25zdCBuc0RpcmVjdG9yeSA9IGdldE5hbWVzcGFjZURpcmVjdG9yeShuYW1lc3BhY2UpO1xuICAgIGNvbnN0IGZpbGVQYXRoID0gam9pbihnZXRBcGlEb2NTZXR0aW5ncygpLm91dHB1dERpcmVjdG9yeSwgbnNEaXJlY3RvcnksICdpbmRleC5tZHgnKTtcbiAgICBhd2FpdCBlbnN1cmVEaXJlY3RvcnkoZmlsZVBhdGgpO1xuXG4gICAgLy8gVGhlIG1vZHVsZSdzIGBAZmlsZWAgdGV4dCBkb3VibGVzIGFzIGl0cyBkZXNjcmlwdGlvbi5cbiAgICAvLyBXaXRob3V0IGl0IHRoZSBtb2R1bGUgY2FyZCB3YXMgdGl0bGUtb25seSB3aGlsZSBldmVyeSBtZW1iZXIgY2FyZCB1bmRlciBpdCBjYXJyaWVkIG9uZS5cbiAgICBjb25zdCBvdmVydmlldyA9IG1vZHVsZU92ZXJ2aWV3cy5nZXQobmFtZXNwYWNlKTtcbiAgICBjb25zdCBsaW5lczogc3RyaW5nW10gPSByZW5kZXJGcm9udE1hdHRlcih7XG4gICAgICBkZXNjcmlwdGlvbjogb3ZlcnZpZXcsXG4gICAgICBzaWRlYmFyTGFiZWw6IG5hbWVzcGFjZSxcbiAgICAgIHNsdWc6IGBhcGkvJHtuc0RpcmVjdG9yeX1gLFxuICAgICAgdGl0bGU6IG5hbWVzcGFjZVxuICAgIH0pO1xuXG4gICAgLy8gTW9kdWxlIEBmaWxlIG92ZXJ2aWV3IHRleHRcbiAgICBpZiAob3ZlcnZpZXcpIHtcbiAgICAgIGxpbmVzLnB1c2gocmVuZGVyTWR4UHJvc2Uob3ZlcnZpZXcsIGFsbFR5cGVzLCBuYW1lc3BhY2UpLCAnJyk7XG4gICAgfVxuXG4gICAgcmVuZGVyTmFtZXNwYWNlVGFibGUobGluZXMsICdDbGFzc2VzJywgJ0NsYXNzJywgbnNUeXBlcy5maWx0ZXIoKHQpID0+IHQua2luZCA9PT0gJ2NsYXNzJyksIGFsbFR5cGVzLCBuYW1lc3BhY2UpO1xuICAgIHJlbmRlck5hbWVzcGFjZVRhYmxlKGxpbmVzLCAnSW50ZXJmYWNlcycsICdJbnRlcmZhY2UnLCBuc1R5cGVzLmZpbHRlcigodCkgPT4gdC5raW5kID09PSAnaW50ZXJmYWNlJyksIGFsbFR5cGVzLCBuYW1lc3BhY2UpO1xuICAgIHJlbmRlck5hbWVzcGFjZVRhYmxlKGxpbmVzLCAnRnVuY3Rpb25zJywgJ0Z1bmN0aW9uJywgbnNUeXBlcy5maWx0ZXIoKHQpID0+IHQua2luZCA9PT0gJ2Z1bmN0aW9uJyksIGFsbFR5cGVzLCBuYW1lc3BhY2UpO1xuICAgIHJlbmRlck5hbWVzcGFjZVRhYmxlKGxpbmVzLCAnVHlwZXMnLCAnVHlwZScsIG5zVHlwZXMuZmlsdGVyKCh0KSA9PiB0LmtpbmQgPT09ICd0eXBlJyksIGFsbFR5cGVzLCBuYW1lc3BhY2UpO1xuICAgIHJlbmRlck5hbWVzcGFjZVRhYmxlKGxpbmVzLCAnRW51bXMnLCAnRW51bScsIG5zVHlwZXMuZmlsdGVyKCh0KSA9PiB0LmtpbmQgPT09ICdlbnVtJyksIGFsbFR5cGVzLCBuYW1lc3BhY2UpO1xuICAgIHJlbmRlck5hbWVzcGFjZVRhYmxlKGxpbmVzLCAnVmFyaWFibGVzJywgJ1ZhcmlhYmxlJywgbnNUeXBlcy5maWx0ZXIoKHQpID0+IHQua2luZCA9PT0gJ3ZhcmlhYmxlJyksIGFsbFR5cGVzLCBuYW1lc3BhY2UpO1xuXG4gICAgYXdhaXQgd3JpdGVGaWxlKGZpbGVQYXRoLCBsaW5lcy5qb2luKCdcXG4nKSwgJ3V0Zi04Jyk7XG4gIH1cblxuICAvLyBSb290IEFQSSBpbmRleCBwYWdlIGxpc3RpbmcgZXZlcnkgbW9kdWxlLlxuICBjb25zdCBzb3J0ZWROYW1lc3BhY2VzID0gWy4uLm5hbWVzcGFjZXMua2V5cygpXS5zb3J0KChhLCBiKSA9PiBhLmxvY2FsZUNvbXBhcmUoYikpO1xuICBjb25zdCBhcGlJbmRleEludHJvID0gZ2V0QXBpSW5kZXhJbnRybyhzb3J0ZWROYW1lc3BhY2VzKTtcbiAgY29uc3Qgcm9vdExpbmVzOiBzdHJpbmdbXSA9IHJlbmRlckZyb250TWF0dGVyKHtcbiAgICBkZXNjcmlwdGlvbjogYXBpSW5kZXhJbnRybyxcbiAgICBzaWRlYmFyTGFiZWw6ICdPdmVydmlldycsXG4gICAgc2x1ZzogJ2FwaScsXG4gICAgdGl0bGU6ICdBUEkgcmVmZXJlbmNlJ1xuICB9KTtcbiAgcm9vdExpbmVzLnB1c2goYXBpSW5kZXhJbnRybywgJycsICcjIyBNb2R1bGVzJywgJycpO1xuICBmb3IgKGNvbnN0IG5hbWVzcGFjZSBvZiBzb3J0ZWROYW1lc3BhY2VzKSB7XG4gICAgcm9vdExpbmVzLnB1c2goYC0gWyR7bmFtZXNwYWNlfV0oJHtnZXRBcGlEb2NTZXR0aW5ncygpLmJhc2VQYXRofS9hcGkvJHtnZXROYW1lc3BhY2VEaXJlY3RvcnkobmFtZXNwYWNlKX0vKWApO1xuICB9XG4gIHJvb3RMaW5lcy5wdXNoKCcnKTtcbiAgY29uc3Qgcm9vdEZpbGVQYXRoID0gam9pbihnZXRBcGlEb2NTZXR0aW5ncygpLm91dHB1dERpcmVjdG9yeSwgJ2luZGV4Lm1keCcpO1xuICBhd2FpdCBlbnN1cmVEaXJlY3Rvcnkocm9vdEZpbGVQYXRoKTtcbiAgYXdhaXQgd3JpdGVGaWxlKHJvb3RGaWxlUGF0aCwgcm9vdExpbmVzLmpvaW4oJ1xcbicpLCAndXRmLTgnKTtcbn1cblxuLyoqXG4gKiBSZW5kZXJzIGEgdHlwZSdzIG92ZXJ2aWV3IHBhZ2UuXG4gKlxuICogQHBhcmFtIG5hbWUgLSBUaGUgdHlwZSdzIG5hbWUuXG4gKiBAcGFyYW0gaW5mbyAtIFRoZSBkb2N1bWVudGVkIHR5cGUuXG4gKiBAcGFyYW0gYWxsVHlwZXMgLSBFdmVyeSBkb2N1bWVudGVkIHR5cGUsIGtleWVkIGJ5IGAke25hbWVzcGFjZX0jJHtuYW1lfWAuXG4gKiBAcmV0dXJucyBUaGUgcGFnZSdzIGNvbnRlbnQsIGJlZm9yZSBiYWNrbGlua3MsIGFuZCB0aGUgcGF0aCBpdCBpcyB3cml0dGVuIHRvLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVPdmVydmlld1BhZ2UobmFtZTogc3RyaW5nLCBpbmZvOiBUeXBlSW5mbywgYWxsVHlwZXM6IE1hcDxzdHJpbmcsIFR5cGVJbmZvPik6IFByb21pc2U8UGFnZUNvbnRlbnQ+IHtcbiAgY29uc3QgbnNEaXJlY3RvcnkgPSBnZXROYW1lc3BhY2VEaXJlY3RvcnkoaW5mby5uYW1lc3BhY2UpO1xuICBjb25zdCB0eXBlRmlsZVNsdWcgPSB0b1R5cGVGaWxlU2VnbWVudChpbmZvLm5hbWVzcGFjZSwgbmFtZSk7XG4gIGNvbnN0IHR5cGVSb3V0ZVNsdWcgPSB0b1R5cGVSb3V0ZVNlZ21lbnQoaW5mby5uYW1lc3BhY2UsIG5hbWUpO1xuICBjb25zdCBmaWxlUGF0aCA9IGpvaW4oZ2V0QXBpRG9jU2V0dGluZ3MoKS5vdXRwdXREaXJlY3RvcnksIG5zRGlyZWN0b3J5LCB0eXBlRmlsZVNsdWcsICdpbmRleC5tZHgnKTtcbiAgYXdhaXQgZW5zdXJlRGlyZWN0b3J5KGZpbGVQYXRoKTtcblxuICAvLyBGcm9udG1hdHRlclxuICBjb25zdCBkaXNwbGF5TmFtZSA9IGdldERpc3BsYXlOYW1lKG5hbWUsIGluZm8pO1xuICBjb25zdCBsaW5lczogc3RyaW5nW10gPSByZW5kZXJGcm9udE1hdHRlcih7XG4gICAgZGVzY3JpcHRpb246IGluZm8uZGVzY3JpcHRpb24sXG4gICAgc2lkZWJhckxhYmVsOiBkaXNwbGF5TmFtZSxcbiAgICBzaWduYXR1cmU6IGNvbXB1dGVPdmVydmlld1NpZ25hdHVyZShuYW1lLCBpbmZvKSxcbiAgICBzbHVnOiBgYXBpLyR7bnNEaXJlY3Rvcnl9LyR7dHlwZVJvdXRlU2x1Z31gLFxuICAgIHRpdGxlOiBkaXNwbGF5TmFtZVxuICB9KTtcblxuICAvLyBDb21wb25lbnQgaW1wb3J0cyDigJQgY29tcHV0ZSByZWxhdGl2ZSBwYXRoIGZyb20gZ2VuZXJhdGVkIHBhZ2UgdG8gY29tcG9uZW50c1xuICBsaW5lcy5wdXNoKC4uLmdldENvbXBvbmVudEltcG9ydHMoWydDb25zdHJ1Y3RvckJsb2NrJywgJ0ltcG9ydFN0YXRlbWVudCcsICdNZXRob2RUYWJsZScsICdQcm9wZXJ0eVRhYmxlJywgJ1R5cGVTaWduYXR1cmUnXSksICcnKTtcblxuICAvLyBEZXNjcmlwdGlvblxuICBpZiAoaW5mby5kZXNjcmlwdGlvbikge1xuICAgIGxpbmVzLnB1c2gocmVuZGVyTWR4UHJvc2UoaW5mby5kZXNjcmlwdGlvbiwgYWxsVHlwZXMsIGluZm8ubmFtZXNwYWNlKSwgJycpO1xuICB9XG5cbiAgLy8gUmVtYXJrc1xuICBpZiAoaW5mby5yZW1hcmtzKSB7XG4gICAgY29uc3QgcmVtYXJrc0Jsb2NrID0gcmVuZGVyTWR4UHJvc2UoaW5mby5yZW1hcmtzLCBhbGxUeXBlcywgaW5mby5uYW1lc3BhY2UpO1xuICAgIGxpbmVzLnB1c2gocmVtYXJrc0Jsb2NrLnNwbGl0KCdcXG4nKS5tYXAoKGxpbmUpID0+IChsaW5lLmxlbmd0aCA+IDAgPyBgPiAke2xpbmV9YCA6ICc+JykpLmpvaW4oJ1xcbicpLCAnJyk7XG4gIH1cblxuICAvLyBJbXBvcnQgc3RhdGVtZW50XG4gIGxpbmVzLnB1c2goYDxJbXBvcnRTdGF0ZW1lbnQgdGV4dD1cIiR7ZXNjYXBlSnN4QXR0cmlidXRlKGdldEltcG9ydFN0YXRlbWVudChpbmZvKSl9XCIgLz5gLCAnJyk7XG5cbiAgLy8gRXhhbXBsZXNcbiAgZm9yIChjb25zdCBleGFtcGxlIG9mIGluZm8uZXhhbXBsZXMpIHtcbiAgICBsaW5lcy5wdXNoKCcqKkV4YW1wbGU6KionLCAnJywgcmVuZGVyRXhhbXBsZU1keChleGFtcGxlLCBhbGxUeXBlcywgaW5mby5uYW1lc3BhY2UpLCAnJyk7XG4gIH1cblxuICAvLyBGdW5jdGlvbnMgcmVuZGVyIGxpa2UgbWV0aG9kIGRldGFpbCBwYWdlcyDigJQgc2lnbmF0dXJlLCBwYXJhbXMsIHJldHVybnNcbiAgaWYgKGluZm8ua2luZCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIHJlbmRlckZ1bmN0aW9uUGFnZShsaW5lcywgaW5mbywgYWxsVHlwZXMpO1xuICAgIHJldHVybiB7IGNvbnRlbnQ6IGxpbmVzLmpvaW4oJ1xcbicpLCBmaWxlUGF0aCB9O1xuICB9XG5cbiAgLy8gVmFyaWFibGVzIHJlbmRlciB3aXRoIGRlY2xhcmF0aW9uIGtleXdvcmQgYW5kIHR5cGVcbiAgaWYgKGluZm8ua2luZCA9PT0gJ3ZhcmlhYmxlJykge1xuICAgIHJlbmRlclZhcmlhYmxlUGFnZShsaW5lcywgbmFtZSwgaW5mbywgYWxsVHlwZXMpO1xuICAgIHJldHVybiB7IGNvbnRlbnQ6IGxpbmVzLmpvaW4oJ1xcbicpLCBmaWxlUGF0aCB9O1xuICB9XG5cbiAgLy8gRW51bXMgcmVuZGVyIHRoZWlyIG1lbWJlcnMgbGlzdFxuICBpZiAoaW5mby5raW5kID09PSAnZW51bScpIHtcbiAgICByZW5kZXJFbnVtUGFnZShsaW5lcywgaW5mbywgYWxsVHlwZXMpO1xuICAgIHJldHVybiB7IGNvbnRlbnQ6IGxpbmVzLmpvaW4oJ1xcbicpLCBmaWxlUGF0aCB9O1xuICB9XG5cbiAgLy8gVHlwZSBhbGlhc2VzIHJlbmRlciB0aGVpciByaWdodC1oYW5kLXNpZGUgc2lnbmF0dXJlXG4gIGlmIChpbmZvLmtpbmQgPT09ICd0eXBlJykge1xuICAgIHJlbmRlclR5cGVBbGlhc1BhZ2UobGluZXMsIGluZm8sIGFsbFR5cGVzKTtcbiAgICByZXR1cm4geyBjb250ZW50OiBsaW5lcy5qb2luKCdcXG4nKSwgZmlsZVBhdGggfTtcbiAgfVxuXG4gIC8vIENsYXNzZXMgLyBpbnRlcmZhY2VzOiBzaWduYXR1cmUgKyBleHRlbmRzL2ltcGxlbWVudHMgKyBjb25zdHJ1Y3RvciArIG1lbWJlciB0YWJsZXNcbiAgY29uc3QgdHlwZVBhcmFtc0F0dHJpYnV0ZSA9IGluZm8udHlwZVBhcmFtZXRlcnMubGVuZ3RoID4gMCA/IGAgdHlwZVBhcmFtcz17JHtKU09OLnN0cmluZ2lmeShpbmZvLnR5cGVQYXJhbWV0ZXJzKX19YCA6ICcnO1xuICBjb25zdCBleHRlbmRzQXR0cmlidXRlID0gaW5mby5iYXNlVHlwZXMubGVuZ3RoID4gMCA/IGAgZXh0ZW5kcz17JHtKU09OLnN0cmluZ2lmeShpbmZvLmJhc2VUeXBlcyl9fWAgOiAnJztcbiAgY29uc3QgaW1wbGVtZW50c0F0dHJpYnV0ZSA9IGluZm8uaW1wbGVtZW50c1R5cGVzLmxlbmd0aCA+IDAgPyBgIGltcGxlbWVudHM9eyR7SlNPTi5zdHJpbmdpZnkoaW5mby5pbXBsZW1lbnRzVHlwZXMpfX1gIDogJyc7XG4gIGxpbmVzLnB1c2goYDxUeXBlU2lnbmF0dXJlIGtpbmQ9XCIke2luZm8ua2luZH1cIiBuYW1lPVwiJHtuYW1lfVwiJHt0eXBlUGFyYW1zQXR0cmlidXRlfSR7ZXh0ZW5kc0F0dHJpYnV0ZX0ke2ltcGxlbWVudHNBdHRyaWJ1dGV9IC8+YCwgJycpO1xuXG4gIGlmIChpbmZvLmJhc2VUeXBlcy5sZW5ndGggPiAwKSB7XG4gICAgY29uc3QgbGlua2VkVHlwZXMgPSBpbmZvLmJhc2VUeXBlcy5tYXAoKHQpID0+IGxpbmtCYXNlVHlwZSh0LCBhbGxUeXBlcywgaW5mby5uYW1lc3BhY2UpKTtcbiAgICBsaW5lcy5wdXNoKGAqKkV4dGVuZHM6KiogJHtsaW5rZWRUeXBlcy5qb2luKCcsICcpfWAsICcnKTtcbiAgfVxuXG4gIGlmIChpbmZvLmltcGxlbWVudHNUeXBlcy5sZW5ndGggPiAwKSB7XG4gICAgY29uc3QgbGlua2VkVHlwZXMgPSBpbmZvLmltcGxlbWVudHNUeXBlcy5tYXAoKHQpID0+IGxpbmtCYXNlVHlwZSh0LCBhbGxUeXBlcywgaW5mby5uYW1lc3BhY2UpKTtcbiAgICBsaW5lcy5wdXNoKGAqKkltcGxlbWVudHM6KiogJHtsaW5rZWRUeXBlcy5qb2luKCcsICcpfWAsICcnKTtcbiAgfVxuXG4gIHJlbmRlckNvbnN0cnVjdG9yTWR4KGxpbmVzLCBuYW1lLCBpbmZvLCBhbGxUeXBlcyk7XG4gIHJlbmRlclByb3BlcnR5VGFibGVNZHgobGluZXMsIGluZm8sIGFsbFR5cGVzKTtcbiAgcmVuZGVyTWV0aG9kVGFibGVNZHgobGluZXMsIGluZm8sIGFsbFR5cGVzKTtcblxuICByZXR1cm4geyBjb250ZW50OiBsaW5lcy5qb2luKCdcXG4nKSwgZmlsZVBhdGggfTtcbn1cblxuLyoqXG4gKiBXcml0ZXMgdGhlIFN0YXJsaWdodCBzaWRlYmFyIG9mIHRoZSBBUEkgcmVmZXJlbmNlLlxuICpcbiAqIEBwYXJhbSB0eXBlcyAtIFRoZSBkb2N1bWVudGVkIHR5cGVzLCBrZXllZCBieSBxdWFsaWZpZWQgaWQuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZW5lcmF0ZVNpZGViYXJKc29uKHR5cGVzOiBNYXA8c3RyaW5nLCBUeXBlSW5mbz4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3Qgcm9vdCA9IGJ1aWxkU2lkZWJhclRyZWUodHlwZXMpO1xuXG4gIGNvbnN0IGdyb3VwczogU2lkZWJhckVudHJ5W10gPSBbXTtcbiAgY29uc3QgdG9wTGV2ZWxzID0gWy4uLnJvb3QuY2hpbGRyZW5dLnNvcnQoKFthXSwgW2JdKSA9PiBhLmxvY2FsZUNvbXBhcmUoYikpO1xuICBmb3IgKGNvbnN0IFt0b3BMZXZlbCwgY2hpbGRdIG9mIHRvcExldmVscykge1xuICAgIGdyb3Vwcy5wdXNoKHNpZGViYXJUcmVlVG9FbnRyaWVzKGNoaWxkLCB0b3BMZXZlbCkpO1xuICB9XG5cbiAgY29uc3Qgd3JhcHBlZFNpZGViYXI6IFNpZGViYXJFbnRyeVtdID0gW3tcbiAgICBjb2xsYXBzZWQ6IGZhbHNlLFxuICAgIGl0ZW1zOiBncm91cHMsXG4gICAgbGFiZWw6ICdBUEkgcmVmZXJlbmNlJ1xuICB9XTtcblxuICBhd2FpdCB3cml0ZUZpbGUoZ2V0QXBpRG9jU2V0dGluZ3MoKS5zaWRlYmFyRmlsZSwgSlNPTi5zdHJpbmdpZnkod3JhcHBlZFNpZGViYXIsIG51bGwsIEpTT05fSU5ERU5UKSwgJ3V0Zi04Jyk7XG4gIGNvbnNvbGUud2FybihgR2VuZXJhdGVkIHNpZGViYXIgd2l0aCAke1N0cmluZyhncm91cHMubGVuZ3RoKX0gdG9wLWxldmVsIG1vZHVsZSBncm91cHNgKTtcbn1cblxuLyoqXG4gKiBSZW5kZXJzIGEgY2xhc3MncyBjb25zdHJ1Y3RvciBibG9jay5cbiAqXG4gKiBAcGFyYW0gbGluZXMgLSBUaGUgcGFnZSBsaW5lcyB0byBhcHBlbmQgdG8uXG4gKiBAcGFyYW0gbmFtZSAtIFRoZSB0eXBlJ3MgbmFtZS5cbiAqIEBwYXJhbSBpbmZvIC0gVGhlIGRvY3VtZW50ZWQgdHlwZS5cbiAqIEBwYXJhbSBhbGxUeXBlcyAtIEV2ZXJ5IGRvY3VtZW50ZWQgdHlwZSwga2V5ZWQgYnkgYCR7bmFtZXNwYWNlfSMke25hbWV9YC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlbmRlckNvbnN0cnVjdG9yTWR4KGxpbmVzOiBzdHJpbmdbXSwgbmFtZTogc3RyaW5nLCBpbmZvOiBUeXBlSW5mbywgYWxsVHlwZXM6IE1hcDxzdHJpbmcsIFR5cGVJbmZvPik6IHZvaWQge1xuICBjb25zdCBjb25zdHJ1Y3RvciA9IGluZm8uY29uc3RydWN0b3JJbmZvO1xuICBpZiAoIWNvbnN0cnVjdG9yKSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIGNvbnN0IGN0b3JTaWcgPSBgbmV3ICR7bmFtZX0ke2NvbnN0cnVjdG9yLnNpZ25hdHVyZX1gO1xuICBjb25zdCBjdG9yRGVzYyA9IGNvbnN0cnVjdG9yLmRlc2NyaXB0aW9uXG4gICAgPyBgIGRlc2NyaXB0aW9uPVwiJHtlc2NhcGVKc3hBdHRyaWJ1dGUobWFya2Rvd25Ub0h0bWwocmVzb2x2ZUxpbmtzKGNvbnN0cnVjdG9yLmRlc2NyaXB0aW9uLCBhbGxUeXBlcywgaW5mby5uYW1lc3BhY2UpKSl9XCJgXG4gICAgOiAnJztcbiAgbGluZXMucHVzaChgPENvbnN0cnVjdG9yQmxvY2sgc2lnbmF0dXJlPVwiJHtlc2NhcGVKc3hBdHRyaWJ1dGUoY3RvclNpZyl9XCIke2N0b3JEZXNjfSAvPmAsICcnKTtcbn1cblxuLyoqXG4gKiBSZW5kZXJzIGFuIGVudW0ncyBtZW1iZXJzLlxuICpcbiAqIEBwYXJhbSBsaW5lcyAtIFRoZSBwYWdlIGxpbmVzIHRvIGFwcGVuZCB0by5cbiAqIEBwYXJhbSBpbmZvIC0gVGhlIGRvY3VtZW50ZWQgdHlwZS5cbiAqIEBwYXJhbSBhbGxUeXBlcyAtIEV2ZXJ5IGRvY3VtZW50ZWQgdHlwZSwga2V5ZWQgYnkgYCR7bmFtZXNwYWNlfSMke25hbWV9YC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlbmRlckVudW1QYWdlKGxpbmVzOiBzdHJpbmdbXSwgaW5mbzogVHlwZUluZm8sIGFsbFR5cGVzOiBNYXA8c3RyaW5nLCBUeXBlSW5mbz4pOiB2b2lkIHtcbiAgbGluZXMucHVzaChgPFR5cGVTaWduYXR1cmUga2luZD1cImVudW1cIiBuYW1lPVwiJHtpbmZvLm5hbWV9XCIgLz5gLCAnJyk7XG5cbiAgaWYgKGluZm8uZW51bU1lbWJlcnMubGVuZ3RoID09PSAwKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgbGluZXMucHVzaCgnKipNZW1iZXJzOioqJywgJycsICd8IE1lbWJlciB8IFZhbHVlIHwgRGVzY3JpcHRpb24gfCcsICd8IDotLSB8IDotLSB8IDotLSB8Jyk7XG4gIGZvciAoY29uc3QgbWVtYmVyIG9mIGluZm8uZW51bU1lbWJlcnMpIHtcbiAgICBjb25zdCB2YWx1ZSA9IG1lbWJlci52YWx1ZSA/IGBcXGAke2VzY2FwZU1hcmtkb3duKG1lbWJlci52YWx1ZSl9XFxgYCA6ICcnO1xuICAgIGxpbmVzLnB1c2goYHwgXFxgJHttZW1iZXIubmFtZX1cXGAgfCAke3ZhbHVlfSB8ICR7ZXNjYXBlTWFya2Rvd24ocmVzb2x2ZUxpbmtzKG1lbWJlci5kZXNjcmlwdGlvbiwgYWxsVHlwZXMsIGluZm8ubmFtZXNwYWNlKSl9IHxgKTtcbiAgfVxuICBsaW5lcy5wdXNoKCcnKTtcbn1cblxuLyoqXG4gKiBSZW5kZXIgdGhlIFN0YXJsaWdodCBmcm9udG1hdHRlciBibG9jayAodGhyb3VnaCB0aGUgY2xvc2luZyBgLS0tYCBhbmQgaXRzIGJsYW5rIGxpbmUpIHNoYXJlZCBieSBldmVyeVxuICogZ2VuZXJhdGVkIHBhZ2Uga2luZDogbW9kdWxlIGluZGV4LCB0eXBlIG92ZXJ2aWV3LCBwcm9wZXJ0eSwgYW5kIG1ldGhvZC5cbiAqXG4gKiBFdmVyeSBwYWdlIGtpbmQgZ29lcyB0aHJvdWdoIGhlcmUgc28gbm8gZmllbGQgY2FuIGJlIGVtaXR0ZWQgb24gc29tZSBraW5kcyBhbmQgc2lsZW50bHkgZHJvcHBlZCBvblxuICogb3RoZXJzLiBgZGVzY3JpcHRpb25gIGluIHBhcnRpY3VsYXIgaXMgbm90IGp1c3QgU0VPIG1ldGFkYXRhIOKAlCBpdCBpcyB0aGUgbGluZSB0aGUgT0cgY2FyZCByZW5kZXJzIHVuZGVyXG4gKiB0aGUgdGl0bGUsIHNvIGEgcGFnZSBraW5kIHRoYXQgc2tpcHBlZCBpdCBwcm9kdWNlZCBhIHRpdGxlLW9ubHkgY2FyZCBuZXh0IHRvIGZ1bGx5IHBvcHVsYXRlZCBvbmVzLlxuICpcbiAqIEBwYXJhbSBmcm9udE1hdHRlciAtIFRoZSBwYWdlJ3MgZnJvbnRtYXR0ZXIgZmllbGRzLlxuICogQHJldHVybnMgVGhlIGZyb250bWF0dGVyIGxpbmVzLCB0aHJvdWdoIHRoZSBjbG9zaW5nIGAtLS1gIGFuZCBpdHMgYmxhbmsgbGluZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlbmRlckZyb250TWF0dGVyKGZyb250TWF0dGVyOiBQYWdlRnJvbnRNYXR0ZXIpOiBzdHJpbmdbXSB7XG4gIHJldHVybiBbXG4gICAgJy0tLScsXG4gICAgYHRpdGxlOiBcIiR7ZXNjYXBlWWFtbChmcm9udE1hdHRlci50aXRsZSl9XCJgLFxuICAgIGBzbHVnOiBcIiR7ZnJvbnRNYXR0ZXIuc2x1Z31cImAsXG4gICAgLi4uKGZyb250TWF0dGVyLmRlc2NyaXB0aW9uID8gW2BkZXNjcmlwdGlvbjogXCIke2VzY2FwZVlhbWwoc3RyaXBNYXJrZG93bihmcm9udE1hdHRlci5kZXNjcmlwdGlvbikpfVwiYF0gOiBbXSksXG4gICAgLi4uKGZyb250TWF0dGVyLnNpZ25hdHVyZSA/IFtgc2lnbmF0dXJlOiBcIiR7ZXNjYXBlWWFtbCh0cnVuY2F0ZVNpZ25hdHVyZShmcm9udE1hdHRlci5zaWduYXR1cmUpKX1cImBdIDogW10pLFxuICAgICdlZGl0VXJsOiBmYWxzZScsXG4gICAgJ3NpZGViYXI6JyxcbiAgICBgICBsYWJlbDogXCIke2VzY2FwZVlhbWwoZnJvbnRNYXR0ZXIuc2lkZWJhckxhYmVsKX1cImAsXG4gICAgJy0tLScsXG4gICAgJydcbiAgXTtcbn1cblxuLyoqXG4gKiBSZW5kZXJzIGEgZnVuY3Rpb24ncyBzaWduYXR1cmUsIHBhcmFtZXRlcnMsIHJldHVybiB2YWx1ZSBhbmQgZXhhbXBsZXMuXG4gKlxuICogQHBhcmFtIGxpbmVzIC0gVGhlIHBhZ2UgbGluZXMgdG8gYXBwZW5kIHRvLlxuICogQHBhcmFtIGluZm8gLSBUaGUgZG9jdW1lbnRlZCB0eXBlLlxuICogQHBhcmFtIGFsbFR5cGVzIC0gRXZlcnkgZG9jdW1lbnRlZCB0eXBlLCBrZXllZCBieSBgJHtuYW1lc3BhY2V9IyR7bmFtZX1gLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVuZGVyRnVuY3Rpb25QYWdlKGxpbmVzOiBzdHJpbmdbXSwgaW5mbzogVHlwZUluZm8sIGFsbFR5cGVzOiBNYXA8c3RyaW5nLCBUeXBlSW5mbz4pOiB2b2lkIHtcbiAgY29uc3QgJGZ1bmN0aW9uID0gaW5mby5tZXRob2RzWzBdO1xuICBpZiAoISRmdW5jdGlvbikge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGxpbmVzLnB1c2goJyoqU2lnbmF0dXJlOioqJywgJycsICdgYGB0cycsIGBmdW5jdGlvbiAkeyRmdW5jdGlvbi5zaWduYXR1cmV9OiAkeyRmdW5jdGlvbi5yZXR1cm5UeXBlfWAsICdgYGAnLCAnJyk7XG5cbiAgaWYgKCRmdW5jdGlvbi5wYXJhbWV0ZXJzLmxlbmd0aCA+IDApIHtcbiAgICBsaW5lcy5wdXNoKCcqKlBhcmFtZXRlcnM6KionLCAnJywgJ3wgUGFyYW1ldGVyIHwgVHlwZSB8IERlc2NyaXB0aW9uIHwnLCAnfCA6LS0gfCA6LS0gfCA6LS0gfCcpO1xuICAgIGZvciAoY29uc3QgcGFyYW1ldGVyIG9mICRmdW5jdGlvbi5wYXJhbWV0ZXJzKSB7XG4gICAgICBsaW5lcy5wdXNoKFxuICAgICAgICBgfCBcXGAke3BhcmFtZXRlci5uYW1lfVxcYCB8ICR7ZXNjYXBlTWFya2Rvd24oZXNjYXBlTWR4QW5nbGVCcmFja2V0cyhyZW5kZXJUeXBlV2l0aExpbmtzKHBhcmFtZXRlci50eXBlLCBhbGxUeXBlcywgaW5mby5uYW1lLCBpbmZvLm5hbWVzcGFjZSkpKX0gfCAke2VzY2FwZU1hcmtkb3duKHJlc29sdmVMaW5rcyhwYXJhbWV0ZXIuZGVzY3JpcHRpb24sIGFsbFR5cGVzLCBpbmZvLm5hbWVzcGFjZSkpfSB8YFxuICAgICAgKTtcbiAgICB9XG4gICAgbGluZXMucHVzaCgnJyk7XG4gIH1cblxuICBjb25zdCByZXR1cm5EZXNjID0gJGZ1bmN0aW9uLnJldHVybkRlc2NyaXB0aW9uID8gYCDigJQgJHtlc2NhcGVNZHhBbmdsZUJyYWNrZXRzKHJlc29sdmVMaW5rcygkZnVuY3Rpb24ucmV0dXJuRGVzY3JpcHRpb24sIGFsbFR5cGVzLCBpbmZvLm5hbWVzcGFjZSkpfWAgOiAnJztcbiAgbGluZXMucHVzaChgKipSZXR1cm5zOioqICR7ZXNjYXBlTWR4QW5nbGVCcmFja2V0cyhyZW5kZXJUeXBlV2l0aExpbmtzKCRmdW5jdGlvbi5yZXR1cm5UeXBlLCBhbGxUeXBlcywgaW5mby5uYW1lLCBpbmZvLm5hbWVzcGFjZSkpfSR7cmV0dXJuRGVzY31gLCAnJyk7XG5cbiAgZm9yIChjb25zdCBleGFtcGxlIG9mICRmdW5jdGlvbi5leGFtcGxlcykge1xuICAgIGxpbmVzLnB1c2goJyoqRXhhbXBsZToqKicsICcnLCByZW5kZXJFeGFtcGxlTWR4KGV4YW1wbGUsIGFsbFR5cGVzLCBpbmZvLm5hbWVzcGFjZSksICcnKTtcbiAgfVxufVxuXG4vKipcbiAqIFJlbmRlcnMgb25lIG1ldGhvZCBvdmVybG9hZC5cbiAqXG4gKiBAcGFyYW0gbGluZXMgLSBUaGUgcGFnZSBsaW5lcyB0byBhcHBlbmQgdG8uXG4gKiBAcGFyYW0gb3ZlcmxvYWQgLSBUaGUgb3ZlcmxvYWQuXG4gKiBAcGFyYW0gdHlwZU5hbWUgLSBUaGUgbmFtZSBvZiB0aGUgdHlwZSB0aGUgbWV0aG9kIGJlbG9uZ3MgdG8uXG4gKiBAcGFyYW0gbmFtZXNwYWNlIC0gVGhlIG5hbWVzcGFjZSBvZiB0aGUgdHlwZSB0aGUgbWV0aG9kIGJlbG9uZ3MgdG8uXG4gKiBAcGFyYW0gYWxsVHlwZXMgLSBFdmVyeSBkb2N1bWVudGVkIHR5cGUsIGtleWVkIGJ5IGAke25hbWVzcGFjZX0jJHtuYW1lfWAuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZW5kZXJNZXRob2RPdmVybG9hZE1keChsaW5lczogc3RyaW5nW10sIG92ZXJsb2FkOiBNZW1iZXJJbmZvLCB0eXBlTmFtZTogc3RyaW5nLCBuYW1lc3BhY2U6IHN0cmluZywgYWxsVHlwZXM6IE1hcDxzdHJpbmcsIFR5cGVJbmZvPik6IHZvaWQge1xuICBjb25zdCBzaWcgPSBgJHtvdmVybG9hZC5zaWduYXR1cmV9OiAke292ZXJsb2FkLnJldHVyblR5cGV9YDtcbiAgY29uc3Qgc3RhdGljQXR0cmlidXRlID0gb3ZlcmxvYWQuaXNTdGF0aWMgPyAnIGlzU3RhdGljPXt0cnVlfScgOiAnJztcbiAgY29uc3QgZGVzY0F0dHJpYnV0ZSA9IG92ZXJsb2FkLmRlc2NyaXB0aW9uID8gYCBkZXNjcmlwdGlvbj1cIiR7ZXNjYXBlSnN4QXR0cmlidXRlKG1hcmtkb3duVG9IdG1sKHJlc29sdmVMaW5rcyhvdmVybG9hZC5kZXNjcmlwdGlvbiwgYWxsVHlwZXMsIG5hbWVzcGFjZSkpKX1cImAgOiAnJztcbiAgY29uc3QgcmVtYXJrc0F0dHJpYnV0ZSA9IG92ZXJsb2FkLnJlbWFya3MgPyBgIHJlbWFya3M9XCIke2VzY2FwZUpzeEF0dHJpYnV0ZShtYXJrZG93blRvSHRtbChyZXNvbHZlTGlua3Mob3ZlcmxvYWQucmVtYXJrcywgYWxsVHlwZXMsIG5hbWVzcGFjZSkpKX1cImAgOiAnJztcbiAgY29uc3Qgc2luY2VBdHRyaWJ1dGUgPSBvdmVybG9hZC5zaW5jZSA/IGAgc2luY2U9XCIke2VzY2FwZUpzeEF0dHJpYnV0ZShvdmVybG9hZC5zaW5jZSl9XCJgIDogJyc7XG4gIGNvbnN0IHJldHVyblR5cGVBdHRyaWJ1dGUgPSBgIHJldHVyblR5cGU9XCIke2VzY2FwZUpzeEF0dHJpYnV0ZShtYXJrZG93blRvSHRtbChyZW5kZXJUeXBlV2l0aExpbmtzKG92ZXJsb2FkLnJldHVyblR5cGUsIGFsbFR5cGVzLCB0eXBlTmFtZSwgbmFtZXNwYWNlKSkpfVwiYDtcbiAgY29uc3QgcmV0dXJuRGVzY0F0dHJpYnV0ZSA9IG92ZXJsb2FkLnJldHVybkRlc2NyaXB0aW9uXG4gICAgPyBgIHJldHVybkRlc2NyaXB0aW9uPVwiJHtlc2NhcGVKc3hBdHRyaWJ1dGUobWFya2Rvd25Ub0h0bWwocmVzb2x2ZUxpbmtzKG92ZXJsb2FkLnJldHVybkRlc2NyaXB0aW9uLCBhbGxUeXBlcywgbmFtZXNwYWNlKSkpfVwiYFxuICAgIDogJyc7XG4gIGNvbnN0IGV4YW1wbGVzQXR0cmlidXRlID0gb3ZlcmxvYWQuZXhhbXBsZXMubGVuZ3RoID4gMCA/IGAgZXhhbXBsZXM9eyR7SlNPTi5zdHJpbmdpZnkob3ZlcmxvYWQuZXhhbXBsZXMpfX1gIDogJyc7XG5cbiAgY29uc3QgcGFyYW1zID0gb3ZlcmxvYWQucGFyYW1ldGVycy5tYXAoKHApID0+ICh7XG4gICAgZGVzY3JpcHRpb246IG1hcmtkb3duVG9IdG1sKHAuZGVzY3JpcHRpb24gfHwgKHAubmFtZS5lbmRzV2l0aCgnPycpID8gJyooT3B0aW9uYWwpKicgOiAnJykpLFxuICAgIG5hbWU6IHAubmFtZSxcbiAgICB0eXBlOiBtYXJrZG93blRvSHRtbChyZW5kZXJUeXBlV2l0aExpbmtzKHAudHlwZSwgYWxsVHlwZXMsIHR5cGVOYW1lLCBuYW1lc3BhY2UpKVxuICB9KSk7XG4gIGNvbnN0IHBhcmFtc0F0dHJpYnV0ZSA9IHBhcmFtcy5sZW5ndGggPiAwID8gYCBwYXJhbWV0ZXJzPXske0pTT04uc3RyaW5naWZ5KHBhcmFtcyl9fWAgOiAnJztcblxuICBsaW5lcy5wdXNoKFxuICAgIGA8TWVtYmVyRGV0YWlsJHtzdGF0aWNBdHRyaWJ1dGV9IHNpZ25hdHVyZT1cIiR7ZXNjYXBlSnN4QXR0cmlidXRlKHNpZyl9XCIke2Rlc2NBdHRyaWJ1dGV9JHtyZW1hcmtzQXR0cmlidXRlfSR7c2luY2VBdHRyaWJ1dGV9JHtyZXR1cm5UeXBlQXR0cmlidXRlfSR7cmV0dXJuRGVzY0F0dHJpYnV0ZX0ke3BhcmFtc0F0dHJpYnV0ZX0ke2V4YW1wbGVzQXR0cmlidXRlfSAvPmAsXG4gICAgJydcbiAgKTtcbn1cblxuLyoqXG4gKiBSZW5kZXJzIGEgdHlwZSdzIG1ldGhvZCB0YWJsZS5cbiAqXG4gKiBAcGFyYW0gbGluZXMgLSBUaGUgcGFnZSBsaW5lcyB0byBhcHBlbmQgdG8uXG4gKiBAcGFyYW0gaW5mbyAtIFRoZSBkb2N1bWVudGVkIHR5cGUuXG4gKiBAcGFyYW0gYWxsVHlwZXMgLSBFdmVyeSBkb2N1bWVudGVkIHR5cGUsIGtleWVkIGJ5IGAke25hbWVzcGFjZX0jJHtuYW1lfWAuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZW5kZXJNZXRob2RUYWJsZU1keChsaW5lczogc3RyaW5nW10sIGluZm86IFR5cGVJbmZvLCBhbGxUeXBlczogTWFwPHN0cmluZywgVHlwZUluZm8+KTogdm9pZCB7XG4gIGNvbnN0IG1ldGhvZHMgPSBbLi4uaW5mby5tZXRob2RzXS5zb3J0KChhLCBiKSA9PiB7XG4gICAgaWYgKGEuaXNTdGF0aWMgIT09IGIuaXNTdGF0aWMpIHtcbiAgICAgIHJldHVybiBhLmlzU3RhdGljID8gMSA6IC0xO1xuICAgIH1cbiAgICByZXR1cm4gYS5uYW1lLmxvY2FsZUNvbXBhcmUoYi5uYW1lKTtcbiAgfSk7XG4gIGlmIChtZXRob2RzLmxlbmd0aCA9PT0gMCkge1xuICAgIHJldHVybjtcbiAgfVxuICBsaW5lcy5wdXNoKCc8TWV0aG9kVGFibGUgcm93cz17WycpO1xuICBmb3IgKGNvbnN0IG1ldGhvZCBvZiBtZXRob2RzKSB7XG4gICAgY29uc3QgZGVzYyA9IGVzY2FwZUpzU3RyaW5nKG1hcmtkb3duVG9IdG1sKHJlc29sdmVMaW5rcyhtZXRob2QuZGVzY3JpcHRpb24sIGFsbFR5cGVzLCBpbmZvLm5hbWVzcGFjZSkpKTtcbiAgICBjb25zdCBzdGF0aWNQcmVmaXggPSBtZXRob2QuaXNTdGF0aWMgPyAnc3RhdGljICcgOiAnJztcbiAgICBjb25zdCBzaG9ydFBhcmFtcyA9IG1ldGhvZC5wYXJhbWV0ZXJzLm1hcCgocCwgaW5kZXgpID0+IHtcbiAgICAgIHJldHVybiBpbmRleCA9PT0gMCAmJiBFVkVOVF9NRVRIT0RTLmhhcyhtZXRob2QubmFtZSkgJiYgKHAudHlwZS5zdGFydHNXaXRoKCdcIicpIHx8IHAudHlwZS5zdGFydHNXaXRoKCdcXCcnKSkgPyBwLnR5cGUucmVwbGFjZUFsbCgnXCInLCAnXFwnJykgOiBwLm5hbWU7XG4gICAgfSkuam9pbignLCAnKTtcbiAgICBjb25zdCBzaG9ydFNpZyA9IGAke3N0YXRpY1ByZWZpeH0ke21ldGhvZC5uYW1lfSgke3Nob3J0UGFyYW1zfSlgO1xuICAgIGNvbnN0IHNpZyA9IGVzY2FwZUpzU3RyaW5nKHNob3J0U2lnKTtcbiAgICBjb25zdCBzbHVnID0gb3ZlcmxvYWRSb3V0ZVNlZ21lbnQobWV0aG9kLm92ZXJsb2FkS2V5KTtcbiAgICBjb25zdCByZXR1cm5UeXBlID0gbWFya2Rvd25Ub0h0bWwocmVuZGVyVHlwZVdpdGhMaW5rcyhtZXRob2QucmV0dXJuVHlwZSwgYWxsVHlwZXMsIGluZm8ubmFtZSwgaW5mby5uYW1lc3BhY2UpKTtcbiAgICBjb25zdCBpbmhlcml0ZWRBdHRyaWJ1dGUgPSBtZXRob2QuaW5oZXJpdGVkRnJvbVxuICAgICAgPyBgLCBpbmhlcml0ZWRGcm9tOiBcIiR7ZXNjYXBlSnNTdHJpbmcobWFya2Rvd25Ub0h0bWwodHlwZUxpbmsobWV0aG9kLmluaGVyaXRlZEZyb20sIGFsbFR5cGVzLCBpbmZvLm5hbWVzcGFjZSkpKX1cImBcbiAgICAgIDogJyc7XG4gICAgY29uc3QgaHJlZiA9IG1lbWJlckhyZWYoc2x1ZywgbWV0aG9kLmluaGVyaXRlZEZyb20sIGFsbFR5cGVzLCBpbmZvLm5hbWVzcGFjZSk7XG4gICAgbGluZXMucHVzaChcbiAgICAgIGAgIHsgc2lnbmF0dXJlOiBcIiR7c2lnfVwiLCBocmVmOiBcIiR7ZXNjYXBlSnNTdHJpbmcoaHJlZil9XCIsIHJldHVybnM6IFwiJHtlc2NhcGVKc1N0cmluZyhyZXR1cm5UeXBlKX1cIiwgZGVzY3JpcHRpb246IFwiJHtkZXNjfVwiJHtpbmhlcml0ZWRBdHRyaWJ1dGV9IH0sYFxuICAgICk7XG4gIH1cbiAgbGluZXMucHVzaCgnXX0gLz4nLCAnJyk7XG59XG5cbi8qKlxuICogUmVuZGVycyBhIHR5cGUncyBwcm9wZXJ0eSB0YWJsZS5cbiAqXG4gKiBAcGFyYW0gbGluZXMgLSBUaGUgcGFnZSBsaW5lcyB0byBhcHBlbmQgdG8uXG4gKiBAcGFyYW0gaW5mbyAtIFRoZSBkb2N1bWVudGVkIHR5cGUuXG4gKiBAcGFyYW0gYWxsVHlwZXMgLSBFdmVyeSBkb2N1bWVudGVkIHR5cGUsIGtleWVkIGJ5IGAke25hbWVzcGFjZX0jJHtuYW1lfWAuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZW5kZXJQcm9wZXJ0eVRhYmxlTWR4KGxpbmVzOiBzdHJpbmdbXSwgaW5mbzogVHlwZUluZm8sIGFsbFR5cGVzOiBNYXA8c3RyaW5nLCBUeXBlSW5mbz4pOiB2b2lkIHtcbiAgY29uc3QgcHJvcGVydGllcyA9IGluZm8ucHJvcGVydGllcztcbiAgaWYgKHByb3BlcnRpZXMubGVuZ3RoID09PSAwKSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIGxpbmVzLnB1c2goJzxQcm9wZXJ0eVRhYmxlIHJvd3M9e1snKTtcbiAgZm9yIChjb25zdCBwcm9wZXJ0eSBvZiBwcm9wZXJ0aWVzKSB7XG4gICAgY29uc3QgZGVzYyA9IGVzY2FwZUpzU3RyaW5nKG1hcmtkb3duVG9IdG1sKHJlc29sdmVMaW5rcyhwcm9wZXJ0eS5kZXNjcmlwdGlvbiwgYWxsVHlwZXMsIGluZm8ubmFtZXNwYWNlKSkpO1xuICAgIGNvbnN0IHR5cGUgPSBtYXJrZG93blRvSHRtbChyZW5kZXJUeXBlV2l0aExpbmtzKHByb3BlcnR5LnR5cGUsIGFsbFR5cGVzLCBpbmZvLm5hbWUsIGluZm8ubmFtZXNwYWNlKSk7XG4gICAgY29uc3QgaW5oZXJpdGVkQXR0cmlidXRlID0gcHJvcGVydHkuaW5oZXJpdGVkRnJvbVxuICAgICAgPyBgLCBpbmhlcml0ZWRGcm9tOiBcIiR7ZXNjYXBlSnNTdHJpbmcobWFya2Rvd25Ub0h0bWwodHlwZUxpbmsocHJvcGVydHkuaW5oZXJpdGVkRnJvbSwgYWxsVHlwZXMsIGluZm8ubmFtZXNwYWNlKSkpfVwiYFxuICAgICAgOiAnJztcbiAgICBjb25zdCBocmVmID0gbWVtYmVySHJlZihtZW1iZXJSb3V0ZVNlZ21lbnQocHJvcGVydHkubmFtZSksIHByb3BlcnR5LmluaGVyaXRlZEZyb20sIGFsbFR5cGVzLCBpbmZvLm5hbWVzcGFjZSk7XG4gICAgbGluZXMucHVzaChcbiAgICAgIGAgIHsgbmFtZTogXCIke2VzY2FwZUpzU3RyaW5nKHByb3BlcnR5Lm5hbWUpfVwiLCBocmVmOiBcIiR7ZXNjYXBlSnNTdHJpbmcoaHJlZil9XCIsIHR5cGU6IFwiJHtlc2NhcGVKc1N0cmluZyh0eXBlKX1cIiwgZGVzY3JpcHRpb246IFwiJHtkZXNjfVwiJHtpbmhlcml0ZWRBdHRyaWJ1dGV9IH0sYFxuICAgICk7XG4gIH1cbiAgbGluZXMucHVzaCgnXX0gLz4nLCAnJyk7XG59XG5cbi8qKlxuICogUmVuZGVycyBhIHR5cGUgYWxpYXMncyBzaWduYXR1cmUuXG4gKlxuICogQHBhcmFtIGxpbmVzIC0gVGhlIHBhZ2UgbGluZXMgdG8gYXBwZW5kIHRvLlxuICogQHBhcmFtIGluZm8gLSBUaGUgZG9jdW1lbnRlZCB0eXBlLlxuICogQHBhcmFtIGFsbFR5cGVzIC0gRXZlcnkgZG9jdW1lbnRlZCB0eXBlLCBrZXllZCBieSBgJHtuYW1lc3BhY2V9IyR7bmFtZX1gLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVuZGVyVHlwZUFsaWFzUGFnZShsaW5lczogc3RyaW5nW10sIGluZm86IFR5cGVJbmZvLCBhbGxUeXBlczogTWFwPHN0cmluZywgVHlwZUluZm8+KTogdm9pZCB7XG4gIGNvbnN0IHR5cGVQYXJhbXNBdHRyaWJ1dGUgPSBpbmZvLnR5cGVQYXJhbWV0ZXJzLmxlbmd0aCA+IDAgPyBgIHR5cGVQYXJhbXM9eyR7SlNPTi5zdHJpbmdpZnkoaW5mby50eXBlUGFyYW1ldGVycyl9fWAgOiAnJztcbiAgbGluZXMucHVzaChgPFR5cGVTaWduYXR1cmUga2luZD1cInR5cGVcIiBuYW1lPVwiJHtpbmZvLm5hbWV9XCIke3R5cGVQYXJhbXNBdHRyaWJ1dGV9IC8+YCwgJycpO1xuXG4gIGNvbnN0IHJocyA9IGluZm8udHlwZUFsaWFzVGV4dCA/PyAndW5rbm93bic7XG4gIGxpbmVzLnB1c2goXG4gICAgJyoqU2lnbmF0dXJlOioqJyxcbiAgICAnJyxcbiAgICAnYGBgdHMnLFxuICAgIGB0eXBlICR7Z2V0RGlzcGxheU5hbWUoaW5mby5uYW1lLCBpbmZvKX0gPSAke3Joc31gLFxuICAgICdgYGAnLFxuICAgICcnLFxuICAgIGAqKlR5cGU6KiogJHtlc2NhcGVNZHhCcmFjZXMoZXNjYXBlTWR4QW5nbGVCcmFja2V0cyhyZW5kZXJUeXBlV2l0aExpbmtzKHJocywgYWxsVHlwZXMsIGluZm8ubmFtZSwgaW5mby5uYW1lc3BhY2UpKSl9YCxcbiAgICAnJ1xuICApO1xufVxuXG4vKipcbiAqIFJlbmRlcnMgYSB2YXJpYWJsZSdzIGRlY2xhcmF0aW9uIGFuZCB0eXBlLlxuICpcbiAqIEBwYXJhbSBsaW5lcyAtIFRoZSBwYWdlIGxpbmVzIHRvIGFwcGVuZCB0by5cbiAqIEBwYXJhbSBuYW1lIC0gVGhlIHR5cGUncyBuYW1lLlxuICogQHBhcmFtIGluZm8gLSBUaGUgZG9jdW1lbnRlZCB0eXBlLlxuICogQHBhcmFtIGFsbFR5cGVzIC0gRXZlcnkgZG9jdW1lbnRlZCB0eXBlLCBrZXllZCBieSBgJHtuYW1lc3BhY2V9IyR7bmFtZX1gLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVuZGVyVmFyaWFibGVQYWdlKGxpbmVzOiBzdHJpbmdbXSwgbmFtZTogc3RyaW5nLCBpbmZvOiBUeXBlSW5mbywgYWxsVHlwZXM6IE1hcDxzdHJpbmcsIFR5cGVJbmZvPik6IHZvaWQge1xuICBjb25zdCBrZXl3b3JkID0gaW5mby52YXJpYWJsZUtleXdvcmQgPz8gJ2xldCc7XG4gIGNvbnN0IHZhcmlhYmxlVHlwZSA9IGluZm8udmFyaWFibGVUeXBlID8/ICd1bmtub3duJztcbiAgbGluZXMucHVzaChcbiAgICAnKipTaWduYXR1cmU6KionLFxuICAgICcnLFxuICAgICdgYGB0cycsXG4gICAgYCR7a2V5d29yZH0gJHtuYW1lfTogJHt2YXJpYWJsZVR5cGV9YCxcbiAgICAnYGBgJyxcbiAgICAnJyxcbiAgICBgKipUeXBlOioqICR7ZXNjYXBlTWR4QnJhY2VzKGVzY2FwZU1keEFuZ2xlQnJhY2tldHMocmVuZGVyVHlwZVdpdGhMaW5rcyh2YXJpYWJsZVR5cGUsIGFsbFR5cGVzLCBuYW1lLCBpbmZvLm5hbWVzcGFjZSkpKX1gLFxuICAgICcnXG4gICk7XG59XG5cbi8qKlxuICogQ29udmVydHMgYSBuYW1lc3BhY2UgdHJlZSBub2RlIGludG8gYSBzaWRlYmFyIGdyb3VwLlxuICpcbiAqIEBwYXJhbSBub2RlIC0gVGhlIG5vZGUuXG4gKiBAcGFyYW0gbGFiZWwgLSBUaGUgZ3JvdXAncyBsYWJlbC5cbiAqIEByZXR1cm5zIFRoZSBzaWRlYmFyIGdyb3VwLlxuICovXG5leHBvcnQgZnVuY3Rpb24gc2lkZWJhclRyZWVUb0VudHJpZXMobm9kZTogU2lkZWJhclRyZWVOb2RlLCBsYWJlbDogc3RyaW5nKTogU2lkZWJhckVudHJ5IHtcbiAgY29uc3QgaXRlbXM6IChTaWRlYmFyRW50cnkgfCBTaWRlYmFyTGluaylbXSA9IFtdO1xuXG4gIC8vIENoaWxkIGRpcmVjdG9yeSBncm91cHMgZmlyc3QgKGJlZm9yZSB0aGlzIG1vZHVsZSdzIG93biBwYWdlcylcbiAgY29uc3Qgc29ydGVkQ2hpbGRyZW4gPSBbLi4ubm9kZS5jaGlsZHJlbl0uc29ydCgoW2FdLCBbYl0pID0+IGEubG9jYWxlQ29tcGFyZShiKSk7XG4gIGZvciAoY29uc3QgW2NoaWxkTmFtZSwgY2hpbGRdIG9mIHNvcnRlZENoaWxkcmVuKSB7XG4gICAgaXRlbXMucHVzaChzaWRlYmFyVHJlZVRvRW50cmllcyhjaGlsZCwgY2hpbGROYW1lKSk7XG4gIH1cblxuICAvLyBUaGlzIG1vZHVsZSdzIG93biBvdmVydmlldyBwYWdlICsgdHlwZS9mdW5jdGlvbiBwYWdlcyAoaW5kaXZpZHVhbCBtZW1iZXJzIGFyZSBub3QgbGlzdGVkKS5cbiAgLy8gU2lkZWJhciBgbGlua2AgZmllbGRzIG11c3QgTk9UIGVtYmVkIEJBU0VfUEFUSDogU3RhcmxpZ2h0IHByZXBlbmRzIHRoZSBjb25maWcgYGJhc2VgIHRvIGV2ZXJ5XG4gIC8vIHNpZGViYXIgbGluayBpdHNlbGYsIHNvIGluY2x1ZGluZyBpdCBoZXJlIHdvdWxkIGRvdWJsZSB0aGUgYmFzZSAoZS5nLiBgL2Jhc2UvYmFzZS9hcGkvLi4uYCDihpIgNDA0KS5cbiAgLy8gVGhpcyBkaWZmZXJzIGZyb20gaW4tY29udGVudCBsaW5rcywgd2hpY2ggYXJlIHJhdyBhbmNob3JzIHRoYXQgU3RhcmxpZ2h0IGRvZXMgbm90IGJhc2UtcHJlcGVuZC5cbiAgaWYgKG5vZGUudHlwZXMubGVuZ3RoID4gMCkge1xuICAgIGNvbnN0IHsgbmFtZXNwYWNlIH0gPSBlbnN1cmVOb25OdWxsYWJsZShub2RlLnR5cGVzWzBdKTtcbiAgICBpdGVtcy5wdXNoKHsgbGFiZWw6ICdPdmVydmlldycsIGxpbms6IGAvYXBpLyR7bmFtZXNwYWNlfS9gIH0pO1xuICAgIGNvbnN0IHNvcnRlZFR5cGVzID0gWy4uLm5vZGUudHlwZXNdLnNvcnQoKGEsIGIpID0+IGEubmFtZS5sb2NhbGVDb21wYXJlKGIubmFtZSkpO1xuICAgIGZvciAoY29uc3QgdCBvZiBzb3J0ZWRUeXBlcykge1xuICAgICAgaXRlbXMucHVzaCh7IGxhYmVsOiB0Lm5hbWUsIGxpbms6IGAvYXBpLyR7dC5uYW1lc3BhY2V9LyR7dG9UeXBlUm91dGVTZWdtZW50KHQubmFtZXNwYWNlLCB0Lm5hbWUpfS9gIH0pO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiB7IGNvbGxhcHNlZDogdHJ1ZSwgaXRlbXMsIGxhYmVsIH07XG59XG5cbi8vIFNlcnZlcyBib3RoIGFzIHRoZSByb290IEFQSSBwYWdlJ3MgcHJvc2UgYW5kIChzdHJpcHBlZCkgYXMgaXRzIGBkZXNjcmlwdGlvbmAgZnJvbnRtYXR0ZXIuXG4vLyBTaGFyaW5nIG9uZSBmdW5jdGlvbiBrZWVwcyB0aGUgcGFnZSBhbmQgaXRzIE9HIGNhcmQgZnJvbSBkcmlmdGluZyBhcGFydC5cbmZ1bmN0aW9uIGdldEFwaUluZGV4SW50cm8obmFtZXNwYWNlczogcmVhZG9ubHkgc3RyaW5nW10pOiBzdHJpbmcge1xuICBjb25zdCB7IHBhY2thZ2VOYW1lIH0gPSBnZXRBcGlEb2NTZXR0aW5ncygpO1xuICBjb25zdCBbZXhhbXBsZU5hbWVzcGFjZSA9ICdtb2R1bGUnXSA9IG5hbWVzcGFjZXM7XG4gIHJldHVybiBgVGhlIGNvbXBsZXRlIEFQSSByZWZlcmVuY2UgZm9yIFxcYCR7cGFja2FnZU5hbWV9XFxgLCBnZW5lcmF0ZWQgZnJvbSBpdHMgVFNEb2MuIGBcbiAgICArIGBFYWNoIG1vZHVsZSBiZWxvdyBtYXBzIHRvIGFuIGltcG9ydCBzdWJwYXRoIChlLmcuIHRoZSBcXGAke2V4YW1wbGVOYW1lc3BhY2V9XFxgIG1vZHVsZSBpcyBcXGAke3BhY2thZ2VOYW1lfS8ke2V4YW1wbGVOYW1lc3BhY2V9XFxgKS5gO1xufVxuXG5mdW5jdGlvbiBnZXRDb21wb25lbnRJbXBvcnRzKGNvbXBvbmVudE5hbWVzOiByZWFkb25seSBzdHJpbmdbXSk6IHN0cmluZ1tdIHtcbiAgcmV0dXJuIGNvbXBvbmVudE5hbWVzLm1hcCgoY29tcG9uZW50TmFtZSkgPT4gYGltcG9ydCAke2NvbXBvbmVudE5hbWV9IGZyb20gXCIke0FQSV9DT01QT05FTlRTX0lNUE9SVF9QUkVGSVh9LyR7Y29tcG9uZW50TmFtZX0uYXN0cm9cIjtgKTtcbn1cblxuZnVuY3Rpb24gcmVuZGVyTmFtZXNwYWNlVGFibGUoXG4gIGxpbmVzOiBzdHJpbmdbXSxcbiAgaGVhZGluZzogc3RyaW5nLFxuICBjb2x1bW5MYWJlbDogc3RyaW5nLFxuICBlbnRyaWVzOiBUeXBlSW5mb1tdLFxuICBhbGxUeXBlczogTWFwPHN0cmluZywgVHlwZUluZm8+LFxuICBuYW1lc3BhY2U6IHN0cmluZ1xuKTogdm9pZCB7XG4gIGlmIChlbnRyaWVzLmxlbmd0aCA9PT0gMCkge1xuICAgIHJldHVybjtcbiAgfVxuICBjb25zdCBzb3J0ZWQgPSBbLi4uZW50cmllc10uc29ydCgoYSwgYikgPT4gYS5uYW1lLmxvY2FsZUNvbXBhcmUoYi5uYW1lKSk7XG4gIGxpbmVzLnB1c2goYCMjICR7aGVhZGluZ31gLCAnJywgYHwgJHtjb2x1bW5MYWJlbH0gfCBEZXNjcmlwdGlvbiB8YCwgJ3wgOi0tIHwgOi0tIHwnKTtcbiAgZm9yIChjb25zdCBlbnRyeSBvZiBzb3J0ZWQpIHtcbiAgICBsaW5lcy5wdXNoKGB8IFske2VudHJ5Lm5hbWV9XSguLyR7dG9UeXBlUm91dGVTZWdtZW50KGVudHJ5Lm5hbWVzcGFjZSwgZW50cnkubmFtZSl9LykgfCAke2VzY2FwZU1hcmtkb3duKHJlc29sdmVMaW5rcyhlbnRyeS5kZXNjcmlwdGlvbiwgYWxsVHlwZXMsIG5hbWVzcGFjZSkpfSB8YCk7XG4gIH1cbiAgbGluZXMucHVzaCgnJyk7XG59XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBT0EsU0FBUyw4QkFBOEI7QUFDdkMsU0FBUyx5QkFBeUI7QUFDbEMsU0FBUyxpQkFBaUI7QUFDMUIsU0FBUyxZQUFZO0FBWXJCLFNBQVMscUJBQXFCO0FBQzlCO0FBQUEsRUFDRTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLE9BQ0s7QUFDUCxTQUFTLHlCQUF5QjtBQUNsQztBQUFBLEVBQ0U7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxPQUNLO0FBQ1AsU0FBUyxvQ0FBb0M7QUFFN0MsTUFBTSxjQUFjO0FBUXBCLGVB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
|
|
549
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9kb2NzLXNpdGUvYXBpLWRvYy1wYWdlLWdlbmVyYXRpb24udHMiXSwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAZmlsZVxuICpcbiAqIE1EWCBwYWdlICsgc2lkZWJhciBlbWlzc2lvbjogcmVuZGVycyBtb2R1bGUgaW5kZXggcGFnZXMsIHBlci10eXBlIG92ZXJ2aWV3IHBhZ2VzLCBwZXItbWVtYmVyIHBhZ2VzLFxuICogYmFja2xpbmtzLCBhbmQgdGhlIFN0YXJsaWdodCBzaWRlYmFyIEpTT04uXG4gKi9cblxuaW1wb3J0IHsgZ2V0TWFuZGF0b3J5TmFtZWRHcm91cCB9IGZyb20gJ0BtbmFvdW1vdi90eXBlc2NyaXB0LWxpYi9yZWctZXhwJztcbmltcG9ydCB7IGVuc3VyZU5vbk51bGxhYmxlIH0gZnJvbSAnQG1uYW91bW92L3R5cGVzY3JpcHQtbGliL3R5cGUtZ3VhcmRzJztcbmltcG9ydCB7IHdyaXRlRmlsZSB9IGZyb20gJ25vZGU6ZnMvcHJvbWlzZXMnO1xuaW1wb3J0IHsgam9pbiB9IGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCB0eXBlIHtcbiAgTWVtYmVySW5mbyxcbiAgUGFnZUNvbnRlbnQsXG4gIFBhZ2VGcm9udE1hdHRlcixcbiAgU2lkZWJhckVudHJ5LFxuICBTaWRlYmFyTGluayxcbiAgU2lkZWJhclRyZWVOb2RlLFxuICBUeXBlSW5mb1xufSBmcm9tICcuL2FwaS1kb2MtdHlwZXMudHMnO1xuXG5pbXBvcnQgeyBFVkVOVF9NRVRIT0RTIH0gZnJvbSAnLi9hcGktZG9jLWNvbnN0YW50cy50cyc7XG5pbXBvcnQge1xuICBsaW5rQmFzZVR5cGUsXG4gIG1hcmtkb3duVG9IdG1sLFxuICBtZW1iZXJIcmVmLFxuICByZW5kZXJFeGFtcGxlTWR4LFxuICByZW5kZXJNZHhQcm9zZSxcbiAgcmVuZGVyVHlwZVdpdGhMaW5rcyxcbiAgcmVzb2x2ZUxpbmtzLFxuICB0b1R5cGVGaWxlU2VnbWVudCxcbiAgdG9UeXBlUm91dGVTZWdtZW50LFxuICB0eXBlTGlua1xufSBmcm9tICcuL2FwaS1kb2MtbGluay1yZW5kZXJpbmcudHMnO1xuaW1wb3J0IHsgZ2V0QXBpRG9jU2V0dGluZ3MgfSBmcm9tICcuL2FwaS1kb2Mtc2V0dGluZ3MudHMnO1xuaW1wb3J0IHtcbiAgZW5zdXJlRGlyZWN0b3J5LFxuICBlc2NhcGVKc1N0cmluZyxcbiAgZXNjYXBlSnN4QXR0cmlidXRlLFxuICBlc2NhcGVNYXJrZG93bixcbiAgZXNjYXBlTWR4QW5nbGVCcmFja2V0cyxcbiAgZXNjYXBlTWR4QnJhY2VzLFxuICBlc2NhcGVNZHhQcm9zZSxcbiAgZXNjYXBlWWFtbCxcbiAgZ2V0RGlzcGxheU5hbWUsXG4gIGdldEltcG9ydFN0YXRlbWVudCxcbiAgZ2V0TmFtZXNwYWNlRGlyZWN0b3J5LFxuICBtZW1iZXJSb3V0ZVNlZ21lbnQsXG4gIG1lbWJlclNsdWcsXG4gIG92ZXJsb2FkUm91dGVTZWdtZW50LFxuICBvdmVybG9hZFNsdWcsXG4gIHN0cmlwTWFya2Rvd24sXG4gIHRydW5jYXRlU2lnbmF0dXJlXG59IGZyb20gJy4vYXBpLWRvYy10ZXh0LXV0aWxzLnRzJztcbmltcG9ydCB7IEFQSV9DT01QT05FTlRTX0lNUE9SVF9QUkVGSVggfSBmcm9tICcuL2RvY3Mtc2l0ZS1hc3NldHMudHMnO1xuXG5jb25zdCBKU09OX0lOREVOVCA9IDI7XG5cbi8qKlxuICogQXBwZW5kIGJhY2tsaW5rcyB0byBvdmVydmlldyBwYWdlcyBhbmQgd3JpdGUgYWxsIGZpbGVzLiBLZXllZCBieSBxdWFsaWZpZWQgYCR7bmFtZXNwYWNlfSMke25hbWV9YC5cbiAqXG4gKiBAcGFyYW0gcGFnZUNvbnRlbnRzIC0gRXZlcnkgb3ZlcnZpZXcgcGFnZSdzIGNvbnRlbnQgYW5kIHBhdGgsIGtleWVkIGJ5IHF1YWxpZmllZCBpZC5cbiAqIEBwYXJhbSBhbGxUeXBlcyAtIEV2ZXJ5IGRvY3VtZW50ZWQgdHlwZSwga2V5ZWQgYnkgYCR7bmFtZXNwYWNlfSMke25hbWV9YC5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGFwcGVuZEJhY2tsaW5rc0FuZFdyaXRlKFxuICBwYWdlQ29udGVudHM6IE1hcDxzdHJpbmcsIFBhZ2VDb250ZW50PixcbiAgYWxsVHlwZXM6IE1hcDxzdHJpbmcsIFR5cGVJbmZvPlxuKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IGJhY2tsaW5rcyA9IGJ1aWxkQmFja2xpbmtzRnJvbUNvbnRlbnQocGFnZUNvbnRlbnRzLCBhbGxUeXBlcyk7XG5cbiAgZm9yIChjb25zdCBba2V5LCB7IGNvbnRlbnQsIGZpbGVQYXRoIH1dIG9mIHBhZ2VDb250ZW50cykge1xuICAgIGNvbnN0IHR5cGVCYWNrbGlua3MgPSBiYWNrbGlua3MuZ2V0KGtleSkgPz8gW107XG4gICAgY29uc3QgbGluZXMgPSBbY29udGVudF07XG4gICAgaWYgKHR5cGVCYWNrbGlua3MubGVuZ3RoID4gMCkge1xuICAgICAgY29uc3Qgc29ydGVkQmFja2xpbmtzID0gWy4uLnR5cGVCYWNrbGlua3NdLnNvcnQoKGEsIGIpID0+IGEubG9jYWxlQ29tcGFyZShiKSk7XG4gICAgICBsaW5lcy5wdXNoKCcnLCAnLS0tJywgJycsICcqKkxpbmtzIHRvIHRoaXMgcGFnZToqKicsICcnKTtcbiAgICAgIGZvciAoY29uc3QgYmxLZXkgb2Ygc29ydGVkQmFja2xpbmtzKSB7XG4gICAgICAgIGNvbnN0IGJsSW5mbyA9IGVuc3VyZU5vbk51bGxhYmxlKGFsbFR5cGVzLmdldChibEtleSkpO1xuICAgICAgICBjb25zdCBibE5zRGlyZWN0b3J5ID0gZ2V0TmFtZXNwYWNlRGlyZWN0b3J5KGJsSW5mby5uYW1lc3BhY2UpO1xuICAgICAgICBsaW5lcy5wdXNoKGAtIFske2JsSW5mby5uYW1lfV0oJHtnZXRBcGlEb2NTZXR0aW5ncygpLmJhc2VQYXRofS9hcGkvJHtibE5zRGlyZWN0b3J5fS8ke3RvVHlwZVJvdXRlU2VnbWVudChibEluZm8ubmFtZXNwYWNlLCBibEluZm8ubmFtZSl9LylgKTtcbiAgICAgIH1cbiAgICB9XG4gICAgYXdhaXQgd3JpdGVGaWxlKGZpbGVQYXRoLCBsaW5lcy5qb2luKCdcXG4nKSwgJ3V0Zi04Jyk7XG4gIH1cbn1cblxuLyoqXG4gKiBCdWlsZCBiYWNrbGlua3MgYnkgc2Nhbm5pbmcgZ2VuZXJhdGVkIHBhZ2UgY29udGVudCBmb3IgaW50ZXJuYWwgQVBJIGxpbmtzLiBLZXllZCBieSBxdWFsaWZpZWQgaWQuXG4gKlxuICogQHBhcmFtIHBhZ2VDb250ZW50cyAtIEV2ZXJ5IG92ZXJ2aWV3IHBhZ2UncyBjb250ZW50IGFuZCBwYXRoLCBrZXllZCBieSBxdWFsaWZpZWQgaWQuXG4gKiBAcGFyYW0gYWxsVHlwZXMgLSBFdmVyeSBkb2N1bWVudGVkIHR5cGUsIGtleWVkIGJ5IGAke25hbWVzcGFjZX0jJHtuYW1lfWAuXG4gKiBAcmV0dXJucyBFYWNoIHJlZmVyZW5jZWQgdHlwZSdzIHF1YWxpZmllZCBpZCBtYXBwZWQgdG8gdGhlIGlkcyBvZiB0aGUgcGFnZXMgbGlua2luZyB0byBpdC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGJ1aWxkQmFja2xpbmtzRnJvbUNvbnRlbnQoXG4gIHBhZ2VDb250ZW50czogTWFwPHN0cmluZywgUGFnZUNvbnRlbnQ+LFxuICBhbGxUeXBlczogTWFwPHN0cmluZywgVHlwZUluZm8+XG4pOiBNYXA8c3RyaW5nLCBzdHJpbmdbXT4ge1xuICBjb25zdCBiYWNrbGlua3MgPSBuZXcgTWFwPHN0cmluZywgc3RyaW5nW10+KCk7XG4gIC8vIEVtaXR0ZWQgVVJMcyBsb3dlcmNhc2UgdGhlIHR5cGUgc2VnbWVudCAoc2VlIHRvUm91dGVTZWdtZW50KSwgc28gbWFwIGVhY2ggbG93ZXJjYXNlZCByb3V0ZVxuICAvLyBpZGVudGl0eSBiYWNrIHRvIGl0cyBvcmlnaW5hbCBxdWFsaWZpZWQgdHlwZSBrZXkuXG4gIGNvbnN0IHJvdXRlS2V5VG9UeXBlS2V5ID0gbmV3IE1hcDxzdHJpbmcsIHN0cmluZz4oKTtcbiAgZm9yIChjb25zdCBbdHlwZUtleSwgaW5mb10gb2YgYWxsVHlwZXMpIHtcbiAgICByb3V0ZUtleVRvVHlwZUtleS5zZXQoYCR7Z2V0TmFtZXNwYWNlRGlyZWN0b3J5KGluZm8ubmFtZXNwYWNlKX0jJHt0b1R5cGVSb3V0ZVNlZ21lbnQoaW5mby5uYW1lc3BhY2UsIGluZm8ubmFtZSl9YCwgdHlwZUtleSk7XG4gIH1cbiAgY29uc3QgZXNjYXBlZEJhc2UgPSBnZXRBcGlEb2NTZXR0aW5ncygpLmJhc2VQYXRoLnJlcGxhY2VBbGwoL1suKis/XiR7fSgpfFtcXF1cXFxcXS9nLCBTdHJpbmcucmF3YFxcJCZgKTtcbiAgY29uc3QgbGlua1BhdHRlcm4gPSBuZXcgUmVnRXhwKGAke2VzY2FwZWRCYXNlfS9hcGkvKD88cGF0aD4oPzpbYS16QS1aMC05X0AtXSsvKSspYCwgJ2cnKTtcbiAgZm9yIChjb25zdCBbc291cmNlS2V5LCB7IGNvbnRlbnQgfV0gb2YgcGFnZUNvbnRlbnRzKSB7XG4gICAgY29uc3QgcmVmZXJlbmNlZCA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuXG4gICAgZm9yIChjb25zdCBtYXRjaCBvZiBjb250ZW50Lm1hdGNoQWxsKGxpbmtQYXR0ZXJuKSkge1xuICAgICAgLy8gVGhlIHBhdHRlcm4gcmVxdWlyZXMgYXQgbGVhc3Qgb25lIHNlZ21lbnQuXG4gICAgICBjb25zdCBzZWdtZW50cyA9IGdldE1hbmRhdG9yeU5hbWVkR3JvdXAobWF0Y2gsICdwYXRoJykuc3BsaXQoJy8nKS5maWx0ZXIoQm9vbGVhbik7XG4gICAgICBjb25zdCB0eXBlTmFtZSA9IGVuc3VyZU5vbk51bGxhYmxlKHNlZ21lbnRzLmF0KC0xKSk7XG4gICAgICBjb25zdCBuYW1lc3BhY2UgPSBzZWdtZW50cy5zbGljZSgwLCAtMSkuam9pbignLycpO1xuICAgICAgY29uc3Qgcm91dGVLZXkgPSBgJHtuYW1lc3BhY2V9IyR7dHlwZU5hbWV9YDtcbiAgICAgIGNvbnN0IHJlc29sdmVkS2V5ID0gcm91dGVLZXlUb1R5cGVLZXkuZ2V0KHJvdXRlS2V5KTtcbiAgICAgIGlmIChyZXNvbHZlZEtleSAhPT0gdW5kZWZpbmVkICYmIHJlc29sdmVkS2V5ICE9PSBzb3VyY2VLZXkpIHtcbiAgICAgICAgcmVmZXJlbmNlZC5hZGQocmVzb2x2ZWRLZXkpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGZvciAoY29uc3QgcmVmZXJlbmNlIG9mIHJlZmVyZW5jZWQpIHtcbiAgICAgIGlmICghYmFja2xpbmtzLmhhcyhyZWZlcmVuY2UpKSB7XG4gICAgICAgIGJhY2tsaW5rcy5zZXQocmVmZXJlbmNlLCBbXSk7XG4gICAgICB9XG4gICAgICBiYWNrbGlua3MuZ2V0KHJlZmVyZW5jZSk/LnB1c2goc291cmNlS2V5KTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gYmFja2xpbmtzO1xufVxuXG4vKipcbiAqIEJ1aWxkcyB0aGUgbmFtZXNwYWNlIHRyZWUgdGhlIHNpZGViYXIgaXMgZ2VuZXJhdGVkIGZyb20uXG4gKlxuICogQHBhcmFtIHR5cGVzIC0gVGhlIGRvY3VtZW50ZWQgdHlwZXMsIGtleWVkIGJ5IHF1YWxpZmllZCBpZC5cbiAqIEByZXR1cm5zIFRoZSByb290IG9mIHRoZSB0cmVlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gYnVpbGRTaWRlYmFyVHJlZSh0eXBlczogTWFwPHN0cmluZywgVHlwZUluZm8+KTogU2lkZWJhclRyZWVOb2RlIHtcbiAgY29uc3Qgcm9vdDogU2lkZWJhclRyZWVOb2RlID0geyBjaGlsZHJlbjogbmV3IE1hcCgpLCB0eXBlczogW10gfTtcbiAgZm9yIChjb25zdCBbLCBpbmZvXSBvZiB0eXBlcykge1xuICAgIGNvbnN0IHBhcnRzID0gaW5mby5uYW1lc3BhY2Uuc3BsaXQoJy8nKTtcbiAgICBsZXQgbm9kZSA9IHJvb3Q7XG4gICAgZm9yIChjb25zdCBwYXJ0IG9mIHBhcnRzKSB7XG4gICAgICBsZXQgY2hpbGQgPSBub2RlLmNoaWxkcmVuLmdldChwYXJ0KTtcbiAgICAgIGlmICghY2hpbGQpIHtcbiAgICAgICAgY2hpbGQgPSB7IGNoaWxkcmVuOiBuZXcgTWFwKCksIHR5cGVzOiBbXSB9O1xuICAgICAgICBub2RlLmNoaWxkcmVuLnNldChwYXJ0LCBjaGlsZCk7XG4gICAgICB9XG4gICAgICBub2RlID0gY2hpbGQ7XG4gICAgfVxuICAgIG5vZGUudHlwZXMucHVzaChpbmZvKTtcbiAgfVxuICByZXR1cm4gcm9vdDtcbn1cblxuLyoqXG4gKiBUaGUgcmF3IGNvZGUgc2lnbmF0dXJlIHNob3duIG9uIGEgdHlwZS1vdmVydmlldyBwYWdlJ3MgT0cgY2FyZCwgZm9yIHRoZSBraW5kcyB0aGF0IHJlbmRlciBhIHNpbmdsZVxuICogc2lnbmF0dXJlIGxpbmUgKGZ1bmN0aW9uIC8gdHlwZSBhbGlhcyAvIHZhcmlhYmxlKS4gQ2xhc3NlcywgaW50ZXJmYWNlcyBhbmQgZW51bXMgcmVuZGVyIG1lbWJlclxuICogdGFibGVzIGluc3RlYWQsIHNvIHRoZXkgZ2V0IG5vIHNpZ25hdHVyZSBibG9jay5cbiAqXG4gKiBAcGFyYW0gbmFtZSAtIFRoZSB0eXBlJ3MgbmFtZS5cbiAqIEBwYXJhbSBpbmZvIC0gVGhlIGRvY3VtZW50ZWQgdHlwZS5cbiAqIEByZXR1cm5zIFRoZSBzaWduYXR1cmUsIG9yIGB1bmRlZmluZWRgIGZvciBhIGtpbmQgdGhhdCByZW5kZXJzIG1lbWJlciB0YWJsZXMgaW5zdGVhZC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNvbXB1dGVPdmVydmlld1NpZ25hdHVyZShuYW1lOiBzdHJpbmcsIGluZm86IFR5cGVJbmZvKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgaWYgKGluZm8ua2luZCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIGNvbnN0ICRmdW5jdGlvbiA9IGluZm8ubWV0aG9kc1swXTtcbiAgICByZXR1cm4gJGZ1bmN0aW9uID8gYGZ1bmN0aW9uICR7JGZ1bmN0aW9uLnNpZ25hdHVyZX06ICR7JGZ1bmN0aW9uLnJldHVyblR5cGV9YCA6IHVuZGVmaW5lZDtcbiAgfVxuICBpZiAoaW5mby5raW5kID09PSAndHlwZScpIHtcbiAgICByZXR1cm4gYHR5cGUgJHtnZXREaXNwbGF5TmFtZShpbmZvLm5hbWUsIGluZm8pfSA9ICR7aW5mby50eXBlQWxpYXNUZXh0ID8/ICd1bmtub3duJ31gO1xuICB9XG4gIHJldHVybiBpbmZvLmtpbmQgPT09ICd2YXJpYWJsZScgPyBgJHtpbmZvLnZhcmlhYmxlS2V5d29yZCA/PyAnbGV0J30gJHtuYW1lfTogJHtpbmZvLnZhcmlhYmxlVHlwZSA/PyAndW5rbm93bid9YCA6IHVuZGVmaW5lZDtcbn1cblxuLyoqXG4gKiBXcml0ZXMgb25lIHBhZ2UgcGVyIG93biBwcm9wZXJ0eSBhbmQgcGVyIG93biBtZXRob2Qgb3ZlcmxvYWQga2V5IG9mIGEgY2xhc3Mgb3IgaW50ZXJmYWNlLlxuICpcbiAqIEBwYXJhbSBuYW1lIC0gVGhlIHR5cGUncyBuYW1lLlxuICogQHBhcmFtIGluZm8gLSBUaGUgZG9jdW1lbnRlZCB0eXBlLlxuICogQHBhcmFtIGFsbFR5cGVzIC0gRXZlcnkgZG9jdW1lbnRlZCB0eXBlLCBrZXllZCBieSBgJHtuYW1lc3BhY2V9IyR7bmFtZX1gLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVNZW1iZXJQYWdlcyhuYW1lOiBzdHJpbmcsIGluZm86IFR5cGVJbmZvLCBhbGxUeXBlczogTWFwPHN0cmluZywgVHlwZUluZm8+KTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IG5zRGlyZWN0b3J5ID0gZ2V0TmFtZXNwYWNlRGlyZWN0b3J5KGluZm8ubmFtZXNwYWNlKTtcbiAgY29uc3QgdHlwZUZpbGVEaXJlY3RvcnkgPSB0b1R5cGVGaWxlU2VnbWVudChpbmZvLm5hbWVzcGFjZSwgbmFtZSk7XG4gIGNvbnN0IHR5cGVSb3V0ZURpcmVjdG9yeSA9IHRvVHlwZVJvdXRlU2VnbWVudChpbmZvLm5hbWVzcGFjZSwgbmFtZSk7XG4gIGNvbnN0IGNvbXBvbmVudEltcG9ydHMgPSBnZXRDb21wb25lbnRJbXBvcnRzKFsnTWVtYmVyRGV0YWlsJ10pO1xuXG4gIC8vIFByb3BlcnR5IHBhZ2VzIChza2lwIGluaGVyaXRlZCDigJQgdGhleSBsaXZlIG9uIHRoZSBwYXJlbnQgdHlwZSlcbiAgY29uc3QgcHJvcGVydGllcyA9IGluZm8ucHJvcGVydGllcy5maWx0ZXIoKHApID0+ICFwLmluaGVyaXRlZEZyb20pO1xuICBmb3IgKGNvbnN0IHByb3BlcnR5IG9mIHByb3BlcnRpZXMpIHtcbiAgICBjb25zdCBmaWxlUGF0aCA9IGpvaW4oZ2V0QXBpRG9jU2V0dGluZ3MoKS5vdXRwdXREaXJlY3RvcnksIG5zRGlyZWN0b3J5LCB0eXBlRmlsZURpcmVjdG9yeSwgYCR7bWVtYmVyU2x1Zyhwcm9wZXJ0eS5uYW1lKX0ubWR4YCk7XG4gICAgYXdhaXQgZW5zdXJlRGlyZWN0b3J5KGZpbGVQYXRoKTtcblxuICAgIGNvbnN0IHByb3BlcnR5VGl0bGUgPSBgJHtuYW1lfS4ke3Byb3BlcnR5Lm5hbWV9YDtcbiAgICBjb25zdCBsaW5lczogc3RyaW5nW10gPSByZW5kZXJGcm9udE1hdHRlcih7XG4gICAgICBkZXNjcmlwdGlvbjogcHJvcGVydHkuZGVzY3JpcHRpb24sXG4gICAgICBzaWRlYmFyTGFiZWw6IHByb3BlcnR5VGl0bGUsXG4gICAgICBzaWduYXR1cmU6IGAke3Byb3BlcnR5LnNpZ25hdHVyZX06ICR7cHJvcGVydHkudHlwZX1gLFxuICAgICAgc2x1ZzogYGFwaS8ke25zRGlyZWN0b3J5fS8ke3R5cGVSb3V0ZURpcmVjdG9yeX0vJHttZW1iZXJSb3V0ZVNlZ21lbnQocHJvcGVydHkubmFtZSl9YCxcbiAgICAgIHRpdGxlOiBwcm9wZXJ0eVRpdGxlXG4gICAgfSk7XG4gICAgbGluZXMucHVzaChcbiAgICAgIC4uLmNvbXBvbmVudEltcG9ydHMsXG4gICAgICAnJyxcbiAgICAgIC8vIEJyZWFkY3J1bWJcbiAgICAgIGBbJHtuYW1lfV0oJHtnZXRBcGlEb2NTZXR0aW5ncygpLmJhc2VQYXRofS9hcGkvJHtuc0RpcmVjdG9yeX0vJHt0eXBlUm91dGVEaXJlY3Rvcnl9Lykg4oC6ICR7cHJvcGVydHkubmFtZX1gLFxuICAgICAgJydcbiAgICApO1xuXG4gICAgY29uc3Qgc3RhdGljQXR0cmlidXRlID0gcHJvcGVydHkuaXNTdGF0aWMgPyAnIGlzU3RhdGljPXt0cnVlfScgOiAnJztcbiAgICBjb25zdCB0eXBlQXR0cmlidXRlID0gYCB0eXBlPVwiJHtlc2NhcGVKc3hBdHRyaWJ1dGUobWFya2Rvd25Ub0h0bWwocmVuZGVyVHlwZVdpdGhMaW5rcyhwcm9wZXJ0eS50eXBlLCBhbGxUeXBlcywgbmFtZSwgaW5mby5uYW1lc3BhY2UpKSl9XCJgO1xuICAgIGNvbnN0IGRlc2NBdHRyaWJ1dGUgPSBwcm9wZXJ0eS5kZXNjcmlwdGlvbiA/IGAgZGVzY3JpcHRpb249XCIke2VzY2FwZUpzeEF0dHJpYnV0ZShtYXJrZG93blRvSHRtbChyZXNvbHZlTGlua3MocHJvcGVydHkuZGVzY3JpcHRpb24sIGFsbFR5cGVzLCBpbmZvLm5hbWVzcGFjZSkpKX1cImAgOiAnJztcbiAgICBjb25zdCByZW1hcmtzQXR0cmlidXRlID0gcHJvcGVydHkucmVtYXJrcyA/IGAgcmVtYXJrcz1cIiR7ZXNjYXBlSnN4QXR0cmlidXRlKG1hcmtkb3duVG9IdG1sKHJlc29sdmVMaW5rcyhwcm9wZXJ0eS5yZW1hcmtzLCBhbGxUeXBlcywgaW5mby5uYW1lc3BhY2UpKSl9XCJgIDogJyc7XG4gICAgY29uc3Qgc2luY2VBdHRyaWJ1dGUgPSBwcm9wZXJ0eS5zaW5jZSA/IGAgc2luY2U9XCIke2VzY2FwZUpzeEF0dHJpYnV0ZShwcm9wZXJ0eS5zaW5jZSl9XCJgIDogJyc7XG4gICAgY29uc3QgZXhhbXBsZXNBdHRyaWJ1dGUgPSBwcm9wZXJ0eS5leGFtcGxlcy5sZW5ndGggPiAwID8gYCBleGFtcGxlcz17JHtKU09OLnN0cmluZ2lmeShwcm9wZXJ0eS5leGFtcGxlcyl9fWAgOiAnJztcblxuICAgIGxpbmVzLnB1c2goYDxNZW1iZXJEZXRhaWwke3N0YXRpY0F0dHJpYnV0ZX0ke3R5cGVBdHRyaWJ1dGV9JHtkZXNjQXR0cmlidXRlfSR7cmVtYXJrc0F0dHJpYnV0ZX0ke3NpbmNlQXR0cmlidXRlfSR7ZXhhbXBsZXNBdHRyaWJ1dGV9IC8+YCwgJycpO1xuXG4gICAgYXdhaXQgd3JpdGVGaWxlKGZpbGVQYXRoLCBsaW5lcy5qb2luKCdcXG4nKSwgJ3V0Zi04Jyk7XG4gIH1cblxuICAvLyBNZXRob2QgcGFnZXMg4oCUIGVhY2ggb3ZlcmxvYWQga2V5IGdldHMgaXRzIG93biBwYWdlIChza2lwIGluaGVyaXRlZClcbiAgY29uc3QgbWV0aG9kcyA9IGluZm8ubWV0aG9kcy5maWx0ZXIoKG0pID0+ICFtLmluaGVyaXRlZEZyb20pO1xuICBjb25zdCBvdmVybG9hZEdyb3VwcyA9IG5ldyBNYXA8c3RyaW5nLCBNZW1iZXJJbmZvW10+KCk7XG4gIGZvciAoY29uc3QgbWV0aG9kIG9mIG1ldGhvZHMpIHtcbiAgICBjb25zdCBrZXkgPSBtZXRob2Qub3ZlcmxvYWRLZXk7XG4gICAgaWYgKCFvdmVybG9hZEdyb3Vwcy5oYXMoa2V5KSkge1xuICAgICAgb3ZlcmxvYWRHcm91cHMuc2V0KGtleSwgW10pO1xuICAgIH1cbiAgICBvdmVybG9hZEdyb3Vwcy5nZXQoa2V5KT8ucHVzaChtZXRob2QpO1xuICB9XG5cbiAgZm9yIChjb25zdCBbb3ZlcmxvYWRLZXksIG92ZXJsb2Fkc10gb2Ygb3ZlcmxvYWRHcm91cHMpIHtcbiAgICBjb25zdCBmaWxlU2x1ZyA9IG92ZXJsb2FkU2x1ZyhvdmVybG9hZEtleSk7XG4gICAgY29uc3QgZmlsZVBhdGggPSBqb2luKGdldEFwaURvY1NldHRpbmdzKCkub3V0cHV0RGlyZWN0b3J5LCBuc0RpcmVjdG9yeSwgdHlwZUZpbGVEaXJlY3RvcnksIGAke2ZpbGVTbHVnfS5tZHhgKTtcbiAgICBhd2FpdCBlbnN1cmVEaXJlY3RvcnkoZmlsZVBhdGgpO1xuXG4gICAgY29uc3QgZGlzcGxheU5hbWUgPSBgJHtuYW1lfS4ke292ZXJsb2FkS2V5fSBtZXRob2RgO1xuICAgIC8vIEEgZ3JvdXAgaXMgY3JlYXRlZCBieSBpdHMgZmlyc3Qgb3ZlcmxvYWQuXG4gICAgY29uc3QgZmlyc3RPdmVybG9hZCA9IGVuc3VyZU5vbk51bGxhYmxlKG92ZXJsb2Fkc1swXSk7XG5cbiAgICBjb25zdCBsaW5lczogc3RyaW5nW10gPSByZW5kZXJGcm9udE1hdHRlcih7XG4gICAgICBkZXNjcmlwdGlvbjogZmlyc3RPdmVybG9hZC5kZXNjcmlwdGlvbixcbiAgICAgIHNpZGViYXJMYWJlbDogYCR7bmFtZX0uJHtvdmVybG9hZEtleX1gLFxuICAgICAgc2lnbmF0dXJlOiBgJHtmaXJzdE92ZXJsb2FkLnNpZ25hdHVyZX06ICR7Zmlyc3RPdmVybG9hZC5yZXR1cm5UeXBlfWAsXG4gICAgICBzbHVnOiBgYXBpLyR7bnNEaXJlY3Rvcnl9LyR7dHlwZVJvdXRlRGlyZWN0b3J5fS8ke292ZXJsb2FkUm91dGVTZWdtZW50KG92ZXJsb2FkS2V5KX1gLFxuICAgICAgdGl0bGU6IGRpc3BsYXlOYW1lXG4gICAgfSk7XG4gICAgbGluZXMucHVzaChcbiAgICAgIC4uLmNvbXBvbmVudEltcG9ydHMsXG4gICAgICAnJyxcbiAgICAgIC8vIEJyZWFkY3J1bWJcbiAgICAgIGBbJHtuYW1lfV0oJHtnZXRBcGlEb2NTZXR0aW5ncygpLmJhc2VQYXRofS9hcGkvJHtuc0RpcmVjdG9yeX0vJHt0eXBlUm91dGVEaXJlY3Rvcnl9Lykg4oC6ICR7b3ZlcmxvYWRLZXl9YCxcbiAgICAgICcnXG4gICAgKTtcblxuICAgIGZvciAoY29uc3Qgb3ZlcmxvYWQgb2Ygb3ZlcmxvYWRzKSB7XG4gICAgICByZW5kZXJNZXRob2RPdmVybG9hZE1keChsaW5lcywgb3ZlcmxvYWQsIG5hbWUsIGluZm8ubmFtZXNwYWNlLCBhbGxUeXBlcyk7XG4gICAgICBpZiAob3ZlcmxvYWRzLmxlbmd0aCA+IDEpIHtcbiAgICAgICAgbGluZXMucHVzaCgnLS0tJywgJycpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGF3YWl0IHdyaXRlRmlsZShmaWxlUGF0aCwgbGluZXMuam9pbignXFxuJyksICd1dGYtOCcpO1xuICB9XG59XG5cbi8qKlxuICogV3JpdGVzIGVhY2ggbW9kdWxlJ3MgaW5kZXggcGFnZSBhbmQgdGhlIHJvb3QgQVBJIGluZGV4LlxuICpcbiAqIEBwYXJhbSB0eXBlcyAtIFRoZSBkb2N1bWVudGVkIHR5cGVzLCBrZXllZCBieSBxdWFsaWZpZWQgaWQuXG4gKiBAcGFyYW0gYWxsVHlwZXMgLSBFdmVyeSBkb2N1bWVudGVkIHR5cGUsIGtleWVkIGJ5IGAke25hbWVzcGFjZX0jJHtuYW1lfWAuXG4gKiBAcGFyYW0gbW9kdWxlT3ZlcnZpZXdzIC0gRWFjaCBuYW1lc3BhY2UncyBgQGZpbGVgIG92ZXJ2aWV3LlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVOYW1lc3BhY2VJbmRleFBhZ2VzKFxuICB0eXBlczogTWFwPHN0cmluZywgVHlwZUluZm8+LFxuICBhbGxUeXBlczogTWFwPHN0cmluZywgVHlwZUluZm8+LFxuICBtb2R1bGVPdmVydmlld3M6IE1hcDxzdHJpbmcsIHN0cmluZz5cbik6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCBuYW1lc3BhY2VzID0gbmV3IE1hcDxzdHJpbmcsIFR5cGVJbmZvW10+KCk7XG4gIGZvciAoY29uc3QgWywgaW5mb10gb2YgdHlwZXMpIHtcbiAgICBpZiAoIW5hbWVzcGFjZXMuaGFzKGluZm8ubmFtZXNwYWNlKSkge1xuICAgICAgbmFtZXNwYWNlcy5zZXQoaW5mby5uYW1lc3BhY2UsIFtdKTtcbiAgICB9XG4gICAgbmFtZXNwYWNlcy5nZXQoaW5mby5uYW1lc3BhY2UpPy5wdXNoKGluZm8pO1xuICB9XG5cbiAgZm9yIChjb25zdCBbbmFtZXNwYWNlLCBuc1R5cGVzXSBvZiBuYW1lc3BhY2VzKSB7XG4gICAgY29uc3QgbnNEaXJlY3RvcnkgPSBnZXROYW1lc3BhY2VEaXJlY3RvcnkobmFtZXNwYWNlKTtcbiAgICBjb25zdCBmaWxlUGF0aCA9IGpvaW4oZ2V0QXBpRG9jU2V0dGluZ3MoKS5vdXRwdXREaXJlY3RvcnksIG5zRGlyZWN0b3J5LCAnaW5kZXgubWR4Jyk7XG4gICAgYXdhaXQgZW5zdXJlRGlyZWN0b3J5KGZpbGVQYXRoKTtcblxuICAgIC8vIFRoZSBtb2R1bGUncyBgQGZpbGVgIHRleHQgZG91YmxlcyBhcyBpdHMgZGVzY3JpcHRpb24uXG4gICAgLy8gV2l0aG91dCBpdCB0aGUgbW9kdWxlIGNhcmQgd2FzIHRpdGxlLW9ubHkgd2hpbGUgZXZlcnkgbWVtYmVyIGNhcmQgdW5kZXIgaXQgY2FycmllZCBvbmUuXG4gICAgY29uc3Qgb3ZlcnZpZXcgPSBtb2R1bGVPdmVydmlld3MuZ2V0KG5hbWVzcGFjZSk7XG4gICAgY29uc3QgbGluZXM6IHN0cmluZ1tdID0gcmVuZGVyRnJvbnRNYXR0ZXIoe1xuICAgICAgZGVzY3JpcHRpb246IG92ZXJ2aWV3LFxuICAgICAgc2lkZWJhckxhYmVsOiBuYW1lc3BhY2UsXG4gICAgICBzbHVnOiBgYXBpLyR7bnNEaXJlY3Rvcnl9YCxcbiAgICAgIHRpdGxlOiBuYW1lc3BhY2VcbiAgICB9KTtcblxuICAgIC8vIE1vZHVsZSBAZmlsZSBvdmVydmlldyB0ZXh0XG4gICAgaWYgKG92ZXJ2aWV3KSB7XG4gICAgICBsaW5lcy5wdXNoKHJlbmRlck1keFByb3NlKG92ZXJ2aWV3LCBhbGxUeXBlcywgbmFtZXNwYWNlKSwgJycpO1xuICAgIH1cblxuICAgIHJlbmRlck5hbWVzcGFjZVRhYmxlKGxpbmVzLCAnQ2xhc3NlcycsICdDbGFzcycsIG5zVHlwZXMuZmlsdGVyKCh0KSA9PiB0LmtpbmQgPT09ICdjbGFzcycpLCBhbGxUeXBlcywgbmFtZXNwYWNlKTtcbiAgICByZW5kZXJOYW1lc3BhY2VUYWJsZShsaW5lcywgJ0ludGVyZmFjZXMnLCAnSW50ZXJmYWNlJywgbnNUeXBlcy5maWx0ZXIoKHQpID0+IHQua2luZCA9PT0gJ2ludGVyZmFjZScpLCBhbGxUeXBlcywgbmFtZXNwYWNlKTtcbiAgICByZW5kZXJOYW1lc3BhY2VUYWJsZShsaW5lcywgJ0Z1bmN0aW9ucycsICdGdW5jdGlvbicsIG5zVHlwZXMuZmlsdGVyKCh0KSA9PiB0LmtpbmQgPT09ICdmdW5jdGlvbicpLCBhbGxUeXBlcywgbmFtZXNwYWNlKTtcbiAgICByZW5kZXJOYW1lc3BhY2VUYWJsZShsaW5lcywgJ1R5cGVzJywgJ1R5cGUnLCBuc1R5cGVzLmZpbHRlcigodCkgPT4gdC5raW5kID09PSAndHlwZScpLCBhbGxUeXBlcywgbmFtZXNwYWNlKTtcbiAgICByZW5kZXJOYW1lc3BhY2VUYWJsZShsaW5lcywgJ0VudW1zJywgJ0VudW0nLCBuc1R5cGVzLmZpbHRlcigodCkgPT4gdC5raW5kID09PSAnZW51bScpLCBhbGxUeXBlcywgbmFtZXNwYWNlKTtcbiAgICByZW5kZXJOYW1lc3BhY2VUYWJsZShsaW5lcywgJ1ZhcmlhYmxlcycsICdWYXJpYWJsZScsIG5zVHlwZXMuZmlsdGVyKCh0KSA9PiB0LmtpbmQgPT09ICd2YXJpYWJsZScpLCBhbGxUeXBlcywgbmFtZXNwYWNlKTtcblxuICAgIGF3YWl0IHdyaXRlRmlsZShmaWxlUGF0aCwgbGluZXMuam9pbignXFxuJyksICd1dGYtOCcpO1xuICB9XG5cbiAgLy8gUm9vdCBBUEkgaW5kZXggcGFnZSBsaXN0aW5nIGV2ZXJ5IG1vZHVsZS5cbiAgY29uc3Qgc29ydGVkTmFtZXNwYWNlcyA9IFsuLi5uYW1lc3BhY2VzLmtleXMoKV0uc29ydCgoYSwgYikgPT4gYS5sb2NhbGVDb21wYXJlKGIpKTtcbiAgY29uc3QgYXBpSW5kZXhJbnRybyA9IGdldEFwaUluZGV4SW50cm8oc29ydGVkTmFtZXNwYWNlcyk7XG4gIGNvbnN0IHJvb3RMaW5lczogc3RyaW5nW10gPSByZW5kZXJGcm9udE1hdHRlcih7XG4gICAgZGVzY3JpcHRpb246IGFwaUluZGV4SW50cm8sXG4gICAgc2lkZWJhckxhYmVsOiAnT3ZlcnZpZXcnLFxuICAgIHNsdWc6ICdhcGknLFxuICAgIHRpdGxlOiAnQVBJIHJlZmVyZW5jZSdcbiAgfSk7XG4gIHJvb3RMaW5lcy5wdXNoKGFwaUluZGV4SW50cm8sICcnLCAnIyMgTW9kdWxlcycsICcnKTtcbiAgZm9yIChjb25zdCBuYW1lc3BhY2Ugb2Ygc29ydGVkTmFtZXNwYWNlcykge1xuICAgIHJvb3RMaW5lcy5wdXNoKGAtIFske25hbWVzcGFjZX1dKCR7Z2V0QXBpRG9jU2V0dGluZ3MoKS5iYXNlUGF0aH0vYXBpLyR7Z2V0TmFtZXNwYWNlRGlyZWN0b3J5KG5hbWVzcGFjZSl9LylgKTtcbiAgfVxuICByb290TGluZXMucHVzaCgnJyk7XG4gIGNvbnN0IHJvb3RGaWxlUGF0aCA9IGpvaW4oZ2V0QXBpRG9jU2V0dGluZ3MoKS5vdXRwdXREaXJlY3RvcnksICdpbmRleC5tZHgnKTtcbiAgYXdhaXQgZW5zdXJlRGlyZWN0b3J5KHJvb3RGaWxlUGF0aCk7XG4gIGF3YWl0IHdyaXRlRmlsZShyb290RmlsZVBhdGgsIHJvb3RMaW5lcy5qb2luKCdcXG4nKSwgJ3V0Zi04Jyk7XG59XG5cbi8qKlxuICogUmVuZGVycyBhIHR5cGUncyBvdmVydmlldyBwYWdlLlxuICpcbiAqIEBwYXJhbSBuYW1lIC0gVGhlIHR5cGUncyBuYW1lLlxuICogQHBhcmFtIGluZm8gLSBUaGUgZG9jdW1lbnRlZCB0eXBlLlxuICogQHBhcmFtIGFsbFR5cGVzIC0gRXZlcnkgZG9jdW1lbnRlZCB0eXBlLCBrZXllZCBieSBgJHtuYW1lc3BhY2V9IyR7bmFtZX1gLlxuICogQHJldHVybnMgVGhlIHBhZ2UncyBjb250ZW50LCBiZWZvcmUgYmFja2xpbmtzLCBhbmQgdGhlIHBhdGggaXQgaXMgd3JpdHRlbiB0by5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdlbmVyYXRlT3ZlcnZpZXdQYWdlKG5hbWU6IHN0cmluZywgaW5mbzogVHlwZUluZm8sIGFsbFR5cGVzOiBNYXA8c3RyaW5nLCBUeXBlSW5mbz4pOiBQcm9taXNlPFBhZ2VDb250ZW50PiB7XG4gIGNvbnN0IG5zRGlyZWN0b3J5ID0gZ2V0TmFtZXNwYWNlRGlyZWN0b3J5KGluZm8ubmFtZXNwYWNlKTtcbiAgY29uc3QgdHlwZUZpbGVTbHVnID0gdG9UeXBlRmlsZVNlZ21lbnQoaW5mby5uYW1lc3BhY2UsIG5hbWUpO1xuICBjb25zdCB0eXBlUm91dGVTbHVnID0gdG9UeXBlUm91dGVTZWdtZW50KGluZm8ubmFtZXNwYWNlLCBuYW1lKTtcbiAgY29uc3QgZmlsZVBhdGggPSBqb2luKGdldEFwaURvY1NldHRpbmdzKCkub3V0cHV0RGlyZWN0b3J5LCBuc0RpcmVjdG9yeSwgdHlwZUZpbGVTbHVnLCAnaW5kZXgubWR4Jyk7XG4gIGF3YWl0IGVuc3VyZURpcmVjdG9yeShmaWxlUGF0aCk7XG5cbiAgLy8gRnJvbnRtYXR0ZXJcbiAgY29uc3QgZGlzcGxheU5hbWUgPSBnZXREaXNwbGF5TmFtZShuYW1lLCBpbmZvKTtcbiAgY29uc3QgbGluZXM6IHN0cmluZ1tdID0gcmVuZGVyRnJvbnRNYXR0ZXIoe1xuICAgIGRlc2NyaXB0aW9uOiBpbmZvLmRlc2NyaXB0aW9uLFxuICAgIHNpZGViYXJMYWJlbDogZGlzcGxheU5hbWUsXG4gICAgc2lnbmF0dXJlOiBjb21wdXRlT3ZlcnZpZXdTaWduYXR1cmUobmFtZSwgaW5mbyksXG4gICAgc2x1ZzogYGFwaS8ke25zRGlyZWN0b3J5fS8ke3R5cGVSb3V0ZVNsdWd9YCxcbiAgICB0aXRsZTogZGlzcGxheU5hbWVcbiAgfSk7XG5cbiAgLy8gQ29tcG9uZW50IGltcG9ydHMg4oCUIGNvbXB1dGUgcmVsYXRpdmUgcGF0aCBmcm9tIGdlbmVyYXRlZCBwYWdlIHRvIGNvbXBvbmVudHNcbiAgbGluZXMucHVzaCguLi5nZXRDb21wb25lbnRJbXBvcnRzKFsnQ29uc3RydWN0b3JCbG9jaycsICdJbXBvcnRTdGF0ZW1lbnQnLCAnTWV0aG9kVGFibGUnLCAnUHJvcGVydHlUYWJsZScsICdUeXBlU2lnbmF0dXJlJ10pLCAnJyk7XG5cbiAgLy8gRGVzY3JpcHRpb25cbiAgaWYgKGluZm8uZGVzY3JpcHRpb24pIHtcbiAgICBsaW5lcy5wdXNoKHJlbmRlck1keFByb3NlKGluZm8uZGVzY3JpcHRpb24sIGFsbFR5cGVzLCBpbmZvLm5hbWVzcGFjZSksICcnKTtcbiAgfVxuXG4gIC8vIFJlbWFya3NcbiAgaWYgKGluZm8ucmVtYXJrcykge1xuICAgIGNvbnN0IHJlbWFya3NCbG9jayA9IHJlbmRlck1keFByb3NlKGluZm8ucmVtYXJrcywgYWxsVHlwZXMsIGluZm8ubmFtZXNwYWNlKTtcbiAgICBsaW5lcy5wdXNoKHJlbWFya3NCbG9jay5zcGxpdCgnXFxuJykubWFwKChsaW5lKSA9PiAobGluZS5sZW5ndGggPiAwID8gYD4gJHtsaW5lfWAgOiAnPicpKS5qb2luKCdcXG4nKSwgJycpO1xuICB9XG5cbiAgLy8gSW1wb3J0IHN0YXRlbWVudFxuICBsaW5lcy5wdXNoKGA8SW1wb3J0U3RhdGVtZW50IHRleHQ9XCIke2VzY2FwZUpzeEF0dHJpYnV0ZShnZXRJbXBvcnRTdGF0ZW1lbnQoaW5mbykpfVwiIC8+YCwgJycpO1xuXG4gIC8vIEV4YW1wbGVzXG4gIGZvciAoY29uc3QgZXhhbXBsZSBvZiBpbmZvLmV4YW1wbGVzKSB7XG4gICAgbGluZXMucHVzaCgnKipFeGFtcGxlOioqJywgJycsIHJlbmRlckV4YW1wbGVNZHgoZXhhbXBsZSwgYWxsVHlwZXMsIGluZm8ubmFtZXNwYWNlKSwgJycpO1xuICB9XG5cbiAgLy8gRnVuY3Rpb25zIHJlbmRlciBsaWtlIG1ldGhvZCBkZXRhaWwgcGFnZXMg4oCUIHNpZ25hdHVyZSwgcGFyYW1zLCByZXR1cm5zXG4gIGlmIChpbmZvLmtpbmQgPT09ICdmdW5jdGlvbicpIHtcbiAgICByZW5kZXJGdW5jdGlvblBhZ2UobGluZXMsIGluZm8sIGFsbFR5cGVzKTtcbiAgICByZXR1cm4geyBjb250ZW50OiBsaW5lcy5qb2luKCdcXG4nKSwgZmlsZVBhdGggfTtcbiAgfVxuXG4gIC8vIFZhcmlhYmxlcyByZW5kZXIgd2l0aCBkZWNsYXJhdGlvbiBrZXl3b3JkIGFuZCB0eXBlXG4gIGlmIChpbmZvLmtpbmQgPT09ICd2YXJpYWJsZScpIHtcbiAgICByZW5kZXJWYXJpYWJsZVBhZ2UobGluZXMsIG5hbWUsIGluZm8sIGFsbFR5cGVzKTtcbiAgICByZXR1cm4geyBjb250ZW50OiBsaW5lcy5qb2luKCdcXG4nKSwgZmlsZVBhdGggfTtcbiAgfVxuXG4gIC8vIEVudW1zIHJlbmRlciB0aGVpciBtZW1iZXJzIGxpc3RcbiAgaWYgKGluZm8ua2luZCA9PT0gJ2VudW0nKSB7XG4gICAgcmVuZGVyRW51bVBhZ2UobGluZXMsIGluZm8sIGFsbFR5cGVzKTtcbiAgICByZXR1cm4geyBjb250ZW50OiBsaW5lcy5qb2luKCdcXG4nKSwgZmlsZVBhdGggfTtcbiAgfVxuXG4gIC8vIFR5cGUgYWxpYXNlcyByZW5kZXIgdGhlaXIgcmlnaHQtaGFuZC1zaWRlIHNpZ25hdHVyZVxuICBpZiAoaW5mby5raW5kID09PSAndHlwZScpIHtcbiAgICByZW5kZXJUeXBlQWxpYXNQYWdlKGxpbmVzLCBpbmZvLCBhbGxUeXBlcyk7XG4gICAgcmV0dXJuIHsgY29udGVudDogbGluZXMuam9pbignXFxuJyksIGZpbGVQYXRoIH07XG4gIH1cblxuICAvLyBDbGFzc2VzIC8gaW50ZXJmYWNlczogc2lnbmF0dXJlICsgZXh0ZW5kcy9pbXBsZW1lbnRzICsgY29uc3RydWN0b3IgKyBtZW1iZXIgdGFibGVzXG4gIGNvbnN0IHR5cGVQYXJhbXNBdHRyaWJ1dGUgPSBpbmZvLnR5cGVQYXJhbWV0ZXJzLmxlbmd0aCA+IDAgPyBgIHR5cGVQYXJhbXM9eyR7SlNPTi5zdHJpbmdpZnkoaW5mby50eXBlUGFyYW1ldGVycyl9fWAgOiAnJztcbiAgY29uc3QgZXh0ZW5kc0F0dHJpYnV0ZSA9IGluZm8uYmFzZVR5cGVzLmxlbmd0aCA+IDAgPyBgIGV4dGVuZHM9eyR7SlNPTi5zdHJpbmdpZnkoaW5mby5iYXNlVHlwZXMpfX1gIDogJyc7XG4gIGNvbnN0IGltcGxlbWVudHNBdHRyaWJ1dGUgPSBpbmZvLmltcGxlbWVudHNUeXBlcy5sZW5ndGggPiAwID8gYCBpbXBsZW1lbnRzPXske0pTT04uc3RyaW5naWZ5KGluZm8uaW1wbGVtZW50c1R5cGVzKX19YCA6ICcnO1xuICBsaW5lcy5wdXNoKGA8VHlwZVNpZ25hdHVyZSBraW5kPVwiJHtpbmZvLmtpbmR9XCIgbmFtZT1cIiR7bmFtZX1cIiR7dHlwZVBhcmFtc0F0dHJpYnV0ZX0ke2V4dGVuZHNBdHRyaWJ1dGV9JHtpbXBsZW1lbnRzQXR0cmlidXRlfSAvPmAsICcnKTtcblxuICBpZiAoaW5mby5iYXNlVHlwZXMubGVuZ3RoID4gMCkge1xuICAgIGNvbnN0IGxpbmtlZFR5cGVzID0gaW5mby5iYXNlVHlwZXMubWFwKCh0KSA9PiBsaW5rQmFzZVR5cGUodCwgYWxsVHlwZXMsIGluZm8ubmFtZXNwYWNlKSk7XG4gICAgbGluZXMucHVzaChgKipFeHRlbmRzOioqICR7bGlua2VkVHlwZXMuam9pbignLCAnKX1gLCAnJyk7XG4gIH1cblxuICBpZiAoaW5mby5pbXBsZW1lbnRzVHlwZXMubGVuZ3RoID4gMCkge1xuICAgIGNvbnN0IGxpbmtlZFR5cGVzID0gaW5mby5pbXBsZW1lbnRzVHlwZXMubWFwKCh0KSA9PiBsaW5rQmFzZVR5cGUodCwgYWxsVHlwZXMsIGluZm8ubmFtZXNwYWNlKSk7XG4gICAgbGluZXMucHVzaChgKipJbXBsZW1lbnRzOioqICR7bGlua2VkVHlwZXMuam9pbignLCAnKX1gLCAnJyk7XG4gIH1cblxuICByZW5kZXJDb25zdHJ1Y3Rvck1keChsaW5lcywgbmFtZSwgaW5mbywgYWxsVHlwZXMpO1xuICByZW5kZXJQcm9wZXJ0eVRhYmxlTWR4KGxpbmVzLCBpbmZvLCBhbGxUeXBlcyk7XG4gIHJlbmRlck1ldGhvZFRhYmxlTWR4KGxpbmVzLCBpbmZvLCBhbGxUeXBlcyk7XG5cbiAgcmV0dXJuIHsgY29udGVudDogbGluZXMuam9pbignXFxuJyksIGZpbGVQYXRoIH07XG59XG5cbi8qKlxuICogV3JpdGVzIHRoZSBTdGFybGlnaHQgc2lkZWJhciBvZiB0aGUgQVBJIHJlZmVyZW5jZS5cbiAqXG4gKiBAcGFyYW0gdHlwZXMgLSBUaGUgZG9jdW1lbnRlZCB0eXBlcywga2V5ZWQgYnkgcXVhbGlmaWVkIGlkLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVTaWRlYmFySnNvbih0eXBlczogTWFwPHN0cmluZywgVHlwZUluZm8+KTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IHJvb3QgPSBidWlsZFNpZGViYXJUcmVlKHR5cGVzKTtcblxuICBjb25zdCBncm91cHM6IFNpZGViYXJFbnRyeVtdID0gW107XG4gIGNvbnN0IHRvcExldmVscyA9IFsuLi5yb290LmNoaWxkcmVuXS5zb3J0KChbYV0sIFtiXSkgPT4gYS5sb2NhbGVDb21wYXJlKGIpKTtcbiAgZm9yIChjb25zdCBbdG9wTGV2ZWwsIGNoaWxkXSBvZiB0b3BMZXZlbHMpIHtcbiAgICBncm91cHMucHVzaChzaWRlYmFyVHJlZVRvRW50cmllcyhjaGlsZCwgdG9wTGV2ZWwpKTtcbiAgfVxuXG4gIGNvbnN0IHdyYXBwZWRTaWRlYmFyOiBTaWRlYmFyRW50cnlbXSA9IFt7XG4gICAgY29sbGFwc2VkOiBmYWxzZSxcbiAgICBpdGVtczogZ3JvdXBzLFxuICAgIGxhYmVsOiAnQVBJIHJlZmVyZW5jZSdcbiAgfV07XG5cbiAgYXdhaXQgd3JpdGVGaWxlKGdldEFwaURvY1NldHRpbmdzKCkuc2lkZWJhckZpbGUsIEpTT04uc3RyaW5naWZ5KHdyYXBwZWRTaWRlYmFyLCBudWxsLCBKU09OX0lOREVOVCksICd1dGYtOCcpO1xuICBjb25zb2xlLndhcm4oYEdlbmVyYXRlZCBzaWRlYmFyIHdpdGggJHtTdHJpbmcoZ3JvdXBzLmxlbmd0aCl9IHRvcC1sZXZlbCBtb2R1bGUgZ3JvdXBzYCk7XG59XG5cbi8qKlxuICogUmVuZGVycyBhIGNsYXNzJ3MgY29uc3RydWN0b3IgYmxvY2suXG4gKlxuICogQHBhcmFtIGxpbmVzIC0gVGhlIHBhZ2UgbGluZXMgdG8gYXBwZW5kIHRvLlxuICogQHBhcmFtIG5hbWUgLSBUaGUgdHlwZSdzIG5hbWUuXG4gKiBAcGFyYW0gaW5mbyAtIFRoZSBkb2N1bWVudGVkIHR5cGUuXG4gKiBAcGFyYW0gYWxsVHlwZXMgLSBFdmVyeSBkb2N1bWVudGVkIHR5cGUsIGtleWVkIGJ5IGAke25hbWVzcGFjZX0jJHtuYW1lfWAuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZW5kZXJDb25zdHJ1Y3Rvck1keChsaW5lczogc3RyaW5nW10sIG5hbWU6IHN0cmluZywgaW5mbzogVHlwZUluZm8sIGFsbFR5cGVzOiBNYXA8c3RyaW5nLCBUeXBlSW5mbz4pOiB2b2lkIHtcbiAgY29uc3QgY29uc3RydWN0b3IgPSBpbmZvLmNvbnN0cnVjdG9ySW5mbztcbiAgaWYgKCFjb25zdHJ1Y3Rvcikge1xuICAgIHJldHVybjtcbiAgfVxuICBjb25zdCBjdG9yU2lnID0gYG5ldyAke25hbWV9JHtjb25zdHJ1Y3Rvci5zaWduYXR1cmV9YDtcbiAgY29uc3QgY3RvckRlc2MgPSBjb25zdHJ1Y3Rvci5kZXNjcmlwdGlvblxuICAgID8gYCBkZXNjcmlwdGlvbj1cIiR7ZXNjYXBlSnN4QXR0cmlidXRlKG1hcmtkb3duVG9IdG1sKHJlc29sdmVMaW5rcyhjb25zdHJ1Y3Rvci5kZXNjcmlwdGlvbiwgYWxsVHlwZXMsIGluZm8ubmFtZXNwYWNlKSkpfVwiYFxuICAgIDogJyc7XG4gIGxpbmVzLnB1c2goYDxDb25zdHJ1Y3RvckJsb2NrIHNpZ25hdHVyZT1cIiR7ZXNjYXBlSnN4QXR0cmlidXRlKGN0b3JTaWcpfVwiJHtjdG9yRGVzY30gLz5gLCAnJyk7XG59XG5cbi8qKlxuICogUmVuZGVycyBhbiBlbnVtJ3MgbWVtYmVycy5cbiAqXG4gKiBAcGFyYW0gbGluZXMgLSBUaGUgcGFnZSBsaW5lcyB0byBhcHBlbmQgdG8uXG4gKiBAcGFyYW0gaW5mbyAtIFRoZSBkb2N1bWVudGVkIHR5cGUuXG4gKiBAcGFyYW0gYWxsVHlwZXMgLSBFdmVyeSBkb2N1bWVudGVkIHR5cGUsIGtleWVkIGJ5IGAke25hbWVzcGFjZX0jJHtuYW1lfWAuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZW5kZXJFbnVtUGFnZShsaW5lczogc3RyaW5nW10sIGluZm86IFR5cGVJbmZvLCBhbGxUeXBlczogTWFwPHN0cmluZywgVHlwZUluZm8+KTogdm9pZCB7XG4gIGxpbmVzLnB1c2goYDxUeXBlU2lnbmF0dXJlIGtpbmQ9XCJlbnVtXCIgbmFtZT1cIiR7aW5mby5uYW1lfVwiIC8+YCwgJycpO1xuXG4gIGlmIChpbmZvLmVudW1NZW1iZXJzLmxlbmd0aCA9PT0gMCkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGxpbmVzLnB1c2goJyoqTWVtYmVyczoqKicsICcnLCAnfCBNZW1iZXIgfCBWYWx1ZSB8IERlc2NyaXB0aW9uIHwnLCAnfCA6LS0gfCA6LS0gfCA6LS0gfCcpO1xuICBmb3IgKGNvbnN0IG1lbWJlciBvZiBpbmZvLmVudW1NZW1iZXJzKSB7XG4gICAgY29uc3QgdmFsdWUgPSBtZW1iZXIudmFsdWUgPyBgXFxgJHtlc2NhcGVNYXJrZG93bihtZW1iZXIudmFsdWUpfVxcYGAgOiAnJztcbiAgICBsaW5lcy5wdXNoKGB8IFxcYCR7bWVtYmVyLm5hbWV9XFxgIHwgJHt2YWx1ZX0gfCAke2VzY2FwZU1hcmtkb3duKHJlc29sdmVMaW5rcyhtZW1iZXIuZGVzY3JpcHRpb24sIGFsbFR5cGVzLCBpbmZvLm5hbWVzcGFjZSkpfSB8YCk7XG4gIH1cbiAgbGluZXMucHVzaCgnJyk7XG59XG5cbi8qKlxuICogUmVuZGVyIHRoZSBTdGFybGlnaHQgZnJvbnRtYXR0ZXIgYmxvY2sgKHRocm91Z2ggdGhlIGNsb3NpbmcgYC0tLWAgYW5kIGl0cyBibGFuayBsaW5lKSBzaGFyZWQgYnkgZXZlcnlcbiAqIGdlbmVyYXRlZCBwYWdlIGtpbmQ6IG1vZHVsZSBpbmRleCwgdHlwZSBvdmVydmlldywgcHJvcGVydHksIGFuZCBtZXRob2QuXG4gKlxuICogRXZlcnkgcGFnZSBraW5kIGdvZXMgdGhyb3VnaCBoZXJlIHNvIG5vIGZpZWxkIGNhbiBiZSBlbWl0dGVkIG9uIHNvbWUga2luZHMgYW5kIHNpbGVudGx5IGRyb3BwZWQgb25cbiAqIG90aGVycy4gYGRlc2NyaXB0aW9uYCBpbiBwYXJ0aWN1bGFyIGlzIG5vdCBqdXN0IFNFTyBtZXRhZGF0YSDigJQgaXQgaXMgdGhlIGxpbmUgdGhlIE9HIGNhcmQgcmVuZGVycyB1bmRlclxuICogdGhlIHRpdGxlLCBzbyBhIHBhZ2Uga2luZCB0aGF0IHNraXBwZWQgaXQgcHJvZHVjZWQgYSB0aXRsZS1vbmx5IGNhcmQgbmV4dCB0byBmdWxseSBwb3B1bGF0ZWQgb25lcy5cbiAqXG4gKiBAcGFyYW0gZnJvbnRNYXR0ZXIgLSBUaGUgcGFnZSdzIGZyb250bWF0dGVyIGZpZWxkcy5cbiAqIEByZXR1cm5zIFRoZSBmcm9udG1hdHRlciBsaW5lcywgdGhyb3VnaCB0aGUgY2xvc2luZyBgLS0tYCBhbmQgaXRzIGJsYW5rIGxpbmUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZW5kZXJGcm9udE1hdHRlcihmcm9udE1hdHRlcjogUGFnZUZyb250TWF0dGVyKTogc3RyaW5nW10ge1xuICByZXR1cm4gW1xuICAgICctLS0nLFxuICAgIGB0aXRsZTogXCIke2VzY2FwZVlhbWwoZnJvbnRNYXR0ZXIudGl0bGUpfVwiYCxcbiAgICBgc2x1ZzogXCIke2Zyb250TWF0dGVyLnNsdWd9XCJgLFxuICAgIC4uLihmcm9udE1hdHRlci5kZXNjcmlwdGlvbiA/IFtgZGVzY3JpcHRpb246IFwiJHtlc2NhcGVZYW1sKHN0cmlwTWFya2Rvd24oZnJvbnRNYXR0ZXIuZGVzY3JpcHRpb24pKX1cImBdIDogW10pLFxuICAgIC4uLihmcm9udE1hdHRlci5zaWduYXR1cmUgPyBbYHNpZ25hdHVyZTogXCIke2VzY2FwZVlhbWwodHJ1bmNhdGVTaWduYXR1cmUoZnJvbnRNYXR0ZXIuc2lnbmF0dXJlKSl9XCJgXSA6IFtdKSxcbiAgICAnZWRpdFVybDogZmFsc2UnLFxuICAgICdzaWRlYmFyOicsXG4gICAgYCAgbGFiZWw6IFwiJHtlc2NhcGVZYW1sKGZyb250TWF0dGVyLnNpZGViYXJMYWJlbCl9XCJgLFxuICAgICctLS0nLFxuICAgICcnXG4gIF07XG59XG5cbi8qKlxuICogUmVuZGVycyBhIGZ1bmN0aW9uJ3Mgc2lnbmF0dXJlLCBwYXJhbWV0ZXJzLCByZXR1cm4gdmFsdWUgYW5kIGV4YW1wbGVzLlxuICpcbiAqIEBwYXJhbSBsaW5lcyAtIFRoZSBwYWdlIGxpbmVzIHRvIGFwcGVuZCB0by5cbiAqIEBwYXJhbSBpbmZvIC0gVGhlIGRvY3VtZW50ZWQgdHlwZS5cbiAqIEBwYXJhbSBhbGxUeXBlcyAtIEV2ZXJ5IGRvY3VtZW50ZWQgdHlwZSwga2V5ZWQgYnkgYCR7bmFtZXNwYWNlfSMke25hbWV9YC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlbmRlckZ1bmN0aW9uUGFnZShsaW5lczogc3RyaW5nW10sIGluZm86IFR5cGVJbmZvLCBhbGxUeXBlczogTWFwPHN0cmluZywgVHlwZUluZm8+KTogdm9pZCB7XG4gIGNvbnN0ICRmdW5jdGlvbiA9IGluZm8ubWV0aG9kc1swXTtcbiAgaWYgKCEkZnVuY3Rpb24pIHtcbiAgICByZXR1cm47XG4gIH1cblxuICBsaW5lcy5wdXNoKCcqKlNpZ25hdHVyZToqKicsICcnLCAnYGBgdHMnLCBgZnVuY3Rpb24gJHskZnVuY3Rpb24uc2lnbmF0dXJlfTogJHskZnVuY3Rpb24ucmV0dXJuVHlwZX1gLCAnYGBgJywgJycpO1xuXG4gIGlmICgkZnVuY3Rpb24ucGFyYW1ldGVycy5sZW5ndGggPiAwKSB7XG4gICAgbGluZXMucHVzaCgnKipQYXJhbWV0ZXJzOioqJywgJycsICd8IFBhcmFtZXRlciB8IFR5cGUgfCBEZXNjcmlwdGlvbiB8JywgJ3wgOi0tIHwgOi0tIHwgOi0tIHwnKTtcbiAgICBmb3IgKGNvbnN0IHBhcmFtZXRlciBvZiAkZnVuY3Rpb24ucGFyYW1ldGVycykge1xuICAgICAgbGluZXMucHVzaChcbiAgICAgICAgYHwgXFxgJHtwYXJhbWV0ZXIubmFtZX1cXGAgfCAke2VzY2FwZU1hcmtkb3duKGVzY2FwZU1keEFuZ2xlQnJhY2tldHMocmVuZGVyVHlwZVdpdGhMaW5rcyhwYXJhbWV0ZXIudHlwZSwgYWxsVHlwZXMsIGluZm8ubmFtZSwgaW5mby5uYW1lc3BhY2UpKSl9IHwgJHtlc2NhcGVNYXJrZG93bihyZXNvbHZlTGlua3MocGFyYW1ldGVyLmRlc2NyaXB0aW9uLCBhbGxUeXBlcywgaW5mby5uYW1lc3BhY2UpKX0gfGBcbiAgICAgICk7XG4gICAgfVxuICAgIGxpbmVzLnB1c2goJycpO1xuICB9XG5cbiAgY29uc3QgcmV0dXJuRGVzYyA9ICRmdW5jdGlvbi5yZXR1cm5EZXNjcmlwdGlvbiA/IGAg4oCUICR7ZXNjYXBlTWR4UHJvc2UocmVzb2x2ZUxpbmtzKCRmdW5jdGlvbi5yZXR1cm5EZXNjcmlwdGlvbiwgYWxsVHlwZXMsIGluZm8ubmFtZXNwYWNlKSl9YCA6ICcnO1xuICBsaW5lcy5wdXNoKGAqKlJldHVybnM6KiogJHtlc2NhcGVNZHhCcmFjZXMoZXNjYXBlTWR4QW5nbGVCcmFja2V0cyhyZW5kZXJUeXBlV2l0aExpbmtzKCRmdW5jdGlvbi5yZXR1cm5UeXBlLCBhbGxUeXBlcywgaW5mby5uYW1lLCBpbmZvLm5hbWVzcGFjZSkpKX0ke3JldHVybkRlc2N9YCwgJycpO1xuXG4gIGZvciAoY29uc3QgZXhhbXBsZSBvZiAkZnVuY3Rpb24uZXhhbXBsZXMpIHtcbiAgICBsaW5lcy5wdXNoKCcqKkV4YW1wbGU6KionLCAnJywgcmVuZGVyRXhhbXBsZU1keChleGFtcGxlLCBhbGxUeXBlcywgaW5mby5uYW1lc3BhY2UpLCAnJyk7XG4gIH1cbn1cblxuLyoqXG4gKiBSZW5kZXJzIG9uZSBtZXRob2Qgb3ZlcmxvYWQuXG4gKlxuICogQHBhcmFtIGxpbmVzIC0gVGhlIHBhZ2UgbGluZXMgdG8gYXBwZW5kIHRvLlxuICogQHBhcmFtIG92ZXJsb2FkIC0gVGhlIG92ZXJsb2FkLlxuICogQHBhcmFtIHR5cGVOYW1lIC0gVGhlIG5hbWUgb2YgdGhlIHR5cGUgdGhlIG1ldGhvZCBiZWxvbmdzIHRvLlxuICogQHBhcmFtIG5hbWVzcGFjZSAtIFRoZSBuYW1lc3BhY2Ugb2YgdGhlIHR5cGUgdGhlIG1ldGhvZCBiZWxvbmdzIHRvLlxuICogQHBhcmFtIGFsbFR5cGVzIC0gRXZlcnkgZG9jdW1lbnRlZCB0eXBlLCBrZXllZCBieSBgJHtuYW1lc3BhY2V9IyR7bmFtZX1gLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVuZGVyTWV0aG9kT3ZlcmxvYWRNZHgobGluZXM6IHN0cmluZ1tdLCBvdmVybG9hZDogTWVtYmVySW5mbywgdHlwZU5hbWU6IHN0cmluZywgbmFtZXNwYWNlOiBzdHJpbmcsIGFsbFR5cGVzOiBNYXA8c3RyaW5nLCBUeXBlSW5mbz4pOiB2b2lkIHtcbiAgY29uc3Qgc2lnID0gYCR7b3ZlcmxvYWQuc2lnbmF0dXJlfTogJHtvdmVybG9hZC5yZXR1cm5UeXBlfWA7XG4gIGNvbnN0IHN0YXRpY0F0dHJpYnV0ZSA9IG92ZXJsb2FkLmlzU3RhdGljID8gJyBpc1N0YXRpYz17dHJ1ZX0nIDogJyc7XG4gIGNvbnN0IGRlc2NBdHRyaWJ1dGUgPSBvdmVybG9hZC5kZXNjcmlwdGlvbiA/IGAgZGVzY3JpcHRpb249XCIke2VzY2FwZUpzeEF0dHJpYnV0ZShtYXJrZG93blRvSHRtbChyZXNvbHZlTGlua3Mob3ZlcmxvYWQuZGVzY3JpcHRpb24sIGFsbFR5cGVzLCBuYW1lc3BhY2UpKSl9XCJgIDogJyc7XG4gIGNvbnN0IHJlbWFya3NBdHRyaWJ1dGUgPSBvdmVybG9hZC5yZW1hcmtzID8gYCByZW1hcmtzPVwiJHtlc2NhcGVKc3hBdHRyaWJ1dGUobWFya2Rvd25Ub0h0bWwocmVzb2x2ZUxpbmtzKG92ZXJsb2FkLnJlbWFya3MsIGFsbFR5cGVzLCBuYW1lc3BhY2UpKSl9XCJgIDogJyc7XG4gIGNvbnN0IHNpbmNlQXR0cmlidXRlID0gb3ZlcmxvYWQuc2luY2UgPyBgIHNpbmNlPVwiJHtlc2NhcGVKc3hBdHRyaWJ1dGUob3ZlcmxvYWQuc2luY2UpfVwiYCA6ICcnO1xuICBjb25zdCByZXR1cm5UeXBlQXR0cmlidXRlID0gYCByZXR1cm5UeXBlPVwiJHtlc2NhcGVKc3hBdHRyaWJ1dGUobWFya2Rvd25Ub0h0bWwocmVuZGVyVHlwZVdpdGhMaW5rcyhvdmVybG9hZC5yZXR1cm5UeXBlLCBhbGxUeXBlcywgdHlwZU5hbWUsIG5hbWVzcGFjZSkpKX1cImA7XG4gIGNvbnN0IHJldHVybkRlc2NBdHRyaWJ1dGUgPSBvdmVybG9hZC5yZXR1cm5EZXNjcmlwdGlvblxuICAgID8gYCByZXR1cm5EZXNjcmlwdGlvbj1cIiR7ZXNjYXBlSnN4QXR0cmlidXRlKG1hcmtkb3duVG9IdG1sKHJlc29sdmVMaW5rcyhvdmVybG9hZC5yZXR1cm5EZXNjcmlwdGlvbiwgYWxsVHlwZXMsIG5hbWVzcGFjZSkpKX1cImBcbiAgICA6ICcnO1xuICBjb25zdCBleGFtcGxlc0F0dHJpYnV0ZSA9IG92ZXJsb2FkLmV4YW1wbGVzLmxlbmd0aCA+IDAgPyBgIGV4YW1wbGVzPXske0pTT04uc3RyaW5naWZ5KG92ZXJsb2FkLmV4YW1wbGVzKX19YCA6ICcnO1xuXG4gIGNvbnN0IHBhcmFtcyA9IG92ZXJsb2FkLnBhcmFtZXRlcnMubWFwKChwKSA9PiAoe1xuICAgIGRlc2NyaXB0aW9uOiBtYXJrZG93blRvSHRtbChwLmRlc2NyaXB0aW9uIHx8IChwLm5hbWUuZW5kc1dpdGgoJz8nKSA/ICcqKE9wdGlvbmFsKSonIDogJycpKSxcbiAgICBuYW1lOiBwLm5hbWUsXG4gICAgdHlwZTogbWFya2Rvd25Ub0h0bWwocmVuZGVyVHlwZVdpdGhMaW5rcyhwLnR5cGUsIGFsbFR5cGVzLCB0eXBlTmFtZSwgbmFtZXNwYWNlKSlcbiAgfSkpO1xuICBjb25zdCBwYXJhbXNBdHRyaWJ1dGUgPSBwYXJhbXMubGVuZ3RoID4gMCA/IGAgcGFyYW1ldGVycz17JHtKU09OLnN0cmluZ2lmeShwYXJhbXMpfX1gIDogJyc7XG5cbiAgbGluZXMucHVzaChcbiAgICBgPE1lbWJlckRldGFpbCR7c3RhdGljQXR0cmlidXRlfSBzaWduYXR1cmU9XCIke2VzY2FwZUpzeEF0dHJpYnV0ZShzaWcpfVwiJHtkZXNjQXR0cmlidXRlfSR7cmVtYXJrc0F0dHJpYnV0ZX0ke3NpbmNlQXR0cmlidXRlfSR7cmV0dXJuVHlwZUF0dHJpYnV0ZX0ke3JldHVybkRlc2NBdHRyaWJ1dGV9JHtwYXJhbXNBdHRyaWJ1dGV9JHtleGFtcGxlc0F0dHJpYnV0ZX0gLz5gLFxuICAgICcnXG4gICk7XG59XG5cbi8qKlxuICogUmVuZGVycyBhIHR5cGUncyBtZXRob2QgdGFibGUuXG4gKlxuICogQHBhcmFtIGxpbmVzIC0gVGhlIHBhZ2UgbGluZXMgdG8gYXBwZW5kIHRvLlxuICogQHBhcmFtIGluZm8gLSBUaGUgZG9jdW1lbnRlZCB0eXBlLlxuICogQHBhcmFtIGFsbFR5cGVzIC0gRXZlcnkgZG9jdW1lbnRlZCB0eXBlLCBrZXllZCBieSBgJHtuYW1lc3BhY2V9IyR7bmFtZX1gLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVuZGVyTWV0aG9kVGFibGVNZHgobGluZXM6IHN0cmluZ1tdLCBpbmZvOiBUeXBlSW5mbywgYWxsVHlwZXM6IE1hcDxzdHJpbmcsIFR5cGVJbmZvPik6IHZvaWQge1xuICBjb25zdCBtZXRob2RzID0gWy4uLmluZm8ubWV0aG9kc10uc29ydCgoYSwgYikgPT4ge1xuICAgIGlmIChhLmlzU3RhdGljICE9PSBiLmlzU3RhdGljKSB7XG4gICAgICByZXR1cm4gYS5pc1N0YXRpYyA/IDEgOiAtMTtcbiAgICB9XG4gICAgcmV0dXJuIGEubmFtZS5sb2NhbGVDb21wYXJlKGIubmFtZSk7XG4gIH0pO1xuICBpZiAobWV0aG9kcy5sZW5ndGggPT09IDApIHtcbiAgICByZXR1cm47XG4gIH1cbiAgbGluZXMucHVzaCgnPE1ldGhvZFRhYmxlIHJvd3M9e1snKTtcbiAgZm9yIChjb25zdCBtZXRob2Qgb2YgbWV0aG9kcykge1xuICAgIGNvbnN0IGRlc2MgPSBlc2NhcGVKc1N0cmluZyhtYXJrZG93blRvSHRtbChyZXNvbHZlTGlua3MobWV0aG9kLmRlc2NyaXB0aW9uLCBhbGxUeXBlcywgaW5mby5uYW1lc3BhY2UpKSk7XG4gICAgY29uc3Qgc3RhdGljUHJlZml4ID0gbWV0aG9kLmlzU3RhdGljID8gJ3N0YXRpYyAnIDogJyc7XG4gICAgY29uc3Qgc2hvcnRQYXJhbXMgPSBtZXRob2QucGFyYW1ldGVycy5tYXAoKHAsIGluZGV4KSA9PiB7XG4gICAgICByZXR1cm4gaW5kZXggPT09IDAgJiYgRVZFTlRfTUVUSE9EUy5oYXMobWV0aG9kLm5hbWUpICYmIChwLnR5cGUuc3RhcnRzV2l0aCgnXCInKSB8fCBwLnR5cGUuc3RhcnRzV2l0aCgnXFwnJykpID8gcC50eXBlLnJlcGxhY2VBbGwoJ1wiJywgJ1xcJycpIDogcC5uYW1lO1xuICAgIH0pLmpvaW4oJywgJyk7XG4gICAgY29uc3Qgc2hvcnRTaWcgPSBgJHtzdGF0aWNQcmVmaXh9JHttZXRob2QubmFtZX0oJHtzaG9ydFBhcmFtc30pYDtcbiAgICBjb25zdCBzaWcgPSBlc2NhcGVKc1N0cmluZyhzaG9ydFNpZyk7XG4gICAgY29uc3Qgc2x1ZyA9IG92ZXJsb2FkUm91dGVTZWdtZW50KG1ldGhvZC5vdmVybG9hZEtleSk7XG4gICAgY29uc3QgcmV0dXJuVHlwZSA9IG1hcmtkb3duVG9IdG1sKHJlbmRlclR5cGVXaXRoTGlua3MobWV0aG9kLnJldHVyblR5cGUsIGFsbFR5cGVzLCBpbmZvLm5hbWUsIGluZm8ubmFtZXNwYWNlKSk7XG4gICAgY29uc3QgaW5oZXJpdGVkQXR0cmlidXRlID0gbWV0aG9kLmluaGVyaXRlZEZyb21cbiAgICAgID8gYCwgaW5oZXJpdGVkRnJvbTogXCIke2VzY2FwZUpzU3RyaW5nKG1hcmtkb3duVG9IdG1sKHR5cGVMaW5rKG1ldGhvZC5pbmhlcml0ZWRGcm9tLCBhbGxUeXBlcywgaW5mby5uYW1lc3BhY2UpKSl9XCJgXG4gICAgICA6ICcnO1xuICAgIGNvbnN0IGhyZWYgPSBtZW1iZXJIcmVmKHNsdWcsIG1ldGhvZC5pbmhlcml0ZWRGcm9tLCBhbGxUeXBlcywgaW5mby5uYW1lc3BhY2UpO1xuICAgIGxpbmVzLnB1c2goXG4gICAgICBgICB7IHNpZ25hdHVyZTogXCIke3NpZ31cIiwgaHJlZjogXCIke2VzY2FwZUpzU3RyaW5nKGhyZWYpfVwiLCByZXR1cm5zOiBcIiR7ZXNjYXBlSnNTdHJpbmcocmV0dXJuVHlwZSl9XCIsIGRlc2NyaXB0aW9uOiBcIiR7ZGVzY31cIiR7aW5oZXJpdGVkQXR0cmlidXRlfSB9LGBcbiAgICApO1xuICB9XG4gIGxpbmVzLnB1c2goJ119IC8+JywgJycpO1xufVxuXG4vKipcbiAqIFJlbmRlcnMgYSB0eXBlJ3MgcHJvcGVydHkgdGFibGUuXG4gKlxuICogQHBhcmFtIGxpbmVzIC0gVGhlIHBhZ2UgbGluZXMgdG8gYXBwZW5kIHRvLlxuICogQHBhcmFtIGluZm8gLSBUaGUgZG9jdW1lbnRlZCB0eXBlLlxuICogQHBhcmFtIGFsbFR5cGVzIC0gRXZlcnkgZG9jdW1lbnRlZCB0eXBlLCBrZXllZCBieSBgJHtuYW1lc3BhY2V9IyR7bmFtZX1gLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVuZGVyUHJvcGVydHlUYWJsZU1keChsaW5lczogc3RyaW5nW10sIGluZm86IFR5cGVJbmZvLCBhbGxUeXBlczogTWFwPHN0cmluZywgVHlwZUluZm8+KTogdm9pZCB7XG4gIGNvbnN0IHByb3BlcnRpZXMgPSBpbmZvLnByb3BlcnRpZXM7XG4gIGlmIChwcm9wZXJ0aWVzLmxlbmd0aCA9PT0gMCkge1xuICAgIHJldHVybjtcbiAgfVxuICBsaW5lcy5wdXNoKCc8UHJvcGVydHlUYWJsZSByb3dzPXtbJyk7XG4gIGZvciAoY29uc3QgcHJvcGVydHkgb2YgcHJvcGVydGllcykge1xuICAgIGNvbnN0IGRlc2MgPSBlc2NhcGVKc1N0cmluZyhtYXJrZG93blRvSHRtbChyZXNvbHZlTGlua3MocHJvcGVydHkuZGVzY3JpcHRpb24sIGFsbFR5cGVzLCBpbmZvLm5hbWVzcGFjZSkpKTtcbiAgICBjb25zdCB0eXBlID0gbWFya2Rvd25Ub0h0bWwocmVuZGVyVHlwZVdpdGhMaW5rcyhwcm9wZXJ0eS50eXBlLCBhbGxUeXBlcywgaW5mby5uYW1lLCBpbmZvLm5hbWVzcGFjZSkpO1xuICAgIGNvbnN0IGluaGVyaXRlZEF0dHJpYnV0ZSA9IHByb3BlcnR5LmluaGVyaXRlZEZyb21cbiAgICAgID8gYCwgaW5oZXJpdGVkRnJvbTogXCIke2VzY2FwZUpzU3RyaW5nKG1hcmtkb3duVG9IdG1sKHR5cGVMaW5rKHByb3BlcnR5LmluaGVyaXRlZEZyb20sIGFsbFR5cGVzLCBpbmZvLm5hbWVzcGFjZSkpKX1cImBcbiAgICAgIDogJyc7XG4gICAgY29uc3QgaHJlZiA9IG1lbWJlckhyZWYobWVtYmVyUm91dGVTZWdtZW50KHByb3BlcnR5Lm5hbWUpLCBwcm9wZXJ0eS5pbmhlcml0ZWRGcm9tLCBhbGxUeXBlcywgaW5mby5uYW1lc3BhY2UpO1xuICAgIGxpbmVzLnB1c2goXG4gICAgICBgICB7IG5hbWU6IFwiJHtlc2NhcGVKc1N0cmluZyhwcm9wZXJ0eS5uYW1lKX1cIiwgaHJlZjogXCIke2VzY2FwZUpzU3RyaW5nKGhyZWYpfVwiLCB0eXBlOiBcIiR7ZXNjYXBlSnNTdHJpbmcodHlwZSl9XCIsIGRlc2NyaXB0aW9uOiBcIiR7ZGVzY31cIiR7aW5oZXJpdGVkQXR0cmlidXRlfSB9LGBcbiAgICApO1xuICB9XG4gIGxpbmVzLnB1c2goJ119IC8+JywgJycpO1xufVxuXG4vKipcbiAqIFJlbmRlcnMgYSB0eXBlIGFsaWFzJ3Mgc2lnbmF0dXJlLlxuICpcbiAqIEBwYXJhbSBsaW5lcyAtIFRoZSBwYWdlIGxpbmVzIHRvIGFwcGVuZCB0by5cbiAqIEBwYXJhbSBpbmZvIC0gVGhlIGRvY3VtZW50ZWQgdHlwZS5cbiAqIEBwYXJhbSBhbGxUeXBlcyAtIEV2ZXJ5IGRvY3VtZW50ZWQgdHlwZSwga2V5ZWQgYnkgYCR7bmFtZXNwYWNlfSMke25hbWV9YC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlbmRlclR5cGVBbGlhc1BhZ2UobGluZXM6IHN0cmluZ1tdLCBpbmZvOiBUeXBlSW5mbywgYWxsVHlwZXM6IE1hcDxzdHJpbmcsIFR5cGVJbmZvPik6IHZvaWQge1xuICBjb25zdCB0eXBlUGFyYW1zQXR0cmlidXRlID0gaW5mby50eXBlUGFyYW1ldGVycy5sZW5ndGggPiAwID8gYCB0eXBlUGFyYW1zPXske0pTT04uc3RyaW5naWZ5KGluZm8udHlwZVBhcmFtZXRlcnMpfX1gIDogJyc7XG4gIGxpbmVzLnB1c2goYDxUeXBlU2lnbmF0dXJlIGtpbmQ9XCJ0eXBlXCIgbmFtZT1cIiR7aW5mby5uYW1lfVwiJHt0eXBlUGFyYW1zQXR0cmlidXRlfSAvPmAsICcnKTtcblxuICBjb25zdCByaHMgPSBpbmZvLnR5cGVBbGlhc1RleHQgPz8gJ3Vua25vd24nO1xuICBsaW5lcy5wdXNoKFxuICAgICcqKlNpZ25hdHVyZToqKicsXG4gICAgJycsXG4gICAgJ2BgYHRzJyxcbiAgICBgdHlwZSAke2dldERpc3BsYXlOYW1lKGluZm8ubmFtZSwgaW5mbyl9ID0gJHtyaHN9YCxcbiAgICAnYGBgJyxcbiAgICAnJyxcbiAgICBgKipUeXBlOioqICR7ZXNjYXBlTWR4QnJhY2VzKGVzY2FwZU1keEFuZ2xlQnJhY2tldHMocmVuZGVyVHlwZVdpdGhMaW5rcyhyaHMsIGFsbFR5cGVzLCBpbmZvLm5hbWUsIGluZm8ubmFtZXNwYWNlKSkpfWAsXG4gICAgJydcbiAgKTtcbn1cblxuLyoqXG4gKiBSZW5kZXJzIGEgdmFyaWFibGUncyBkZWNsYXJhdGlvbiBhbmQgdHlwZS5cbiAqXG4gKiBAcGFyYW0gbGluZXMgLSBUaGUgcGFnZSBsaW5lcyB0byBhcHBlbmQgdG8uXG4gKiBAcGFyYW0gbmFtZSAtIFRoZSB0eXBlJ3MgbmFtZS5cbiAqIEBwYXJhbSBpbmZvIC0gVGhlIGRvY3VtZW50ZWQgdHlwZS5cbiAqIEBwYXJhbSBhbGxUeXBlcyAtIEV2ZXJ5IGRvY3VtZW50ZWQgdHlwZSwga2V5ZWQgYnkgYCR7bmFtZXNwYWNlfSMke25hbWV9YC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlbmRlclZhcmlhYmxlUGFnZShsaW5lczogc3RyaW5nW10sIG5hbWU6IHN0cmluZywgaW5mbzogVHlwZUluZm8sIGFsbFR5cGVzOiBNYXA8c3RyaW5nLCBUeXBlSW5mbz4pOiB2b2lkIHtcbiAgY29uc3Qga2V5d29yZCA9IGluZm8udmFyaWFibGVLZXl3b3JkID8/ICdsZXQnO1xuICBjb25zdCB2YXJpYWJsZVR5cGUgPSBpbmZvLnZhcmlhYmxlVHlwZSA/PyAndW5rbm93bic7XG4gIGxpbmVzLnB1c2goXG4gICAgJyoqU2lnbmF0dXJlOioqJyxcbiAgICAnJyxcbiAgICAnYGBgdHMnLFxuICAgIGAke2tleXdvcmR9ICR7bmFtZX06ICR7dmFyaWFibGVUeXBlfWAsXG4gICAgJ2BgYCcsXG4gICAgJycsXG4gICAgYCoqVHlwZToqKiAke2VzY2FwZU1keEJyYWNlcyhlc2NhcGVNZHhBbmdsZUJyYWNrZXRzKHJlbmRlclR5cGVXaXRoTGlua3ModmFyaWFibGVUeXBlLCBhbGxUeXBlcywgbmFtZSwgaW5mby5uYW1lc3BhY2UpKSl9YCxcbiAgICAnJ1xuICApO1xufVxuXG4vKipcbiAqIENvbnZlcnRzIGEgbmFtZXNwYWNlIHRyZWUgbm9kZSBpbnRvIGEgc2lkZWJhciBncm91cC5cbiAqXG4gKiBAcGFyYW0gbm9kZSAtIFRoZSBub2RlLlxuICogQHBhcmFtIGxhYmVsIC0gVGhlIGdyb3VwJ3MgbGFiZWwuXG4gKiBAcmV0dXJucyBUaGUgc2lkZWJhciBncm91cC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNpZGViYXJUcmVlVG9FbnRyaWVzKG5vZGU6IFNpZGViYXJUcmVlTm9kZSwgbGFiZWw6IHN0cmluZyk6IFNpZGViYXJFbnRyeSB7XG4gIGNvbnN0IGl0ZW1zOiAoU2lkZWJhckVudHJ5IHwgU2lkZWJhckxpbmspW10gPSBbXTtcblxuICAvLyBDaGlsZCBkaXJlY3RvcnkgZ3JvdXBzIGZpcnN0IChiZWZvcmUgdGhpcyBtb2R1bGUncyBvd24gcGFnZXMpXG4gIGNvbnN0IHNvcnRlZENoaWxkcmVuID0gWy4uLm5vZGUuY2hpbGRyZW5dLnNvcnQoKFthXSwgW2JdKSA9PiBhLmxvY2FsZUNvbXBhcmUoYikpO1xuICBmb3IgKGNvbnN0IFtjaGlsZE5hbWUsIGNoaWxkXSBvZiBzb3J0ZWRDaGlsZHJlbikge1xuICAgIGl0ZW1zLnB1c2goc2lkZWJhclRyZWVUb0VudHJpZXMoY2hpbGQsIGNoaWxkTmFtZSkpO1xuICB9XG5cbiAgLy8gVGhpcyBtb2R1bGUncyBvd24gb3ZlcnZpZXcgcGFnZSArIHR5cGUvZnVuY3Rpb24gcGFnZXMgKGluZGl2aWR1YWwgbWVtYmVycyBhcmUgbm90IGxpc3RlZCkuXG4gIC8vIFNpZGViYXIgYGxpbmtgIGZpZWxkcyBtdXN0IE5PVCBlbWJlZCBCQVNFX1BBVEg6IFN0YXJsaWdodCBwcmVwZW5kcyB0aGUgY29uZmlnIGBiYXNlYCB0byBldmVyeVxuICAvLyBzaWRlYmFyIGxpbmsgaXRzZWxmLCBzbyBpbmNsdWRpbmcgaXQgaGVyZSB3b3VsZCBkb3VibGUgdGhlIGJhc2UgKGUuZy4gYC9iYXNlL2Jhc2UvYXBpLy4uLmAg4oaSIDQwNCkuXG4gIC8vIFRoaXMgZGlmZmVycyBmcm9tIGluLWNvbnRlbnQgbGlua3MsIHdoaWNoIGFyZSByYXcgYW5jaG9ycyB0aGF0IFN0YXJsaWdodCBkb2VzIG5vdCBiYXNlLXByZXBlbmQuXG4gIGlmIChub2RlLnR5cGVzLmxlbmd0aCA+IDApIHtcbiAgICBjb25zdCB7IG5hbWVzcGFjZSB9ID0gZW5zdXJlTm9uTnVsbGFibGUobm9kZS50eXBlc1swXSk7XG4gICAgaXRlbXMucHVzaCh7IGxhYmVsOiAnT3ZlcnZpZXcnLCBsaW5rOiBgL2FwaS8ke25hbWVzcGFjZX0vYCB9KTtcbiAgICBjb25zdCBzb3J0ZWRUeXBlcyA9IFsuLi5ub2RlLnR5cGVzXS5zb3J0KChhLCBiKSA9PiBhLm5hbWUubG9jYWxlQ29tcGFyZShiLm5hbWUpKTtcbiAgICBmb3IgKGNvbnN0IHQgb2Ygc29ydGVkVHlwZXMpIHtcbiAgICAgIGl0ZW1zLnB1c2goeyBsYWJlbDogdC5uYW1lLCBsaW5rOiBgL2FwaS8ke3QubmFtZXNwYWNlfS8ke3RvVHlwZVJvdXRlU2VnbWVudCh0Lm5hbWVzcGFjZSwgdC5uYW1lKX0vYCB9KTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4geyBjb2xsYXBzZWQ6IHRydWUsIGl0ZW1zLCBsYWJlbCB9O1xufVxuXG4vLyBTZXJ2ZXMgYm90aCBhcyB0aGUgcm9vdCBBUEkgcGFnZSdzIHByb3NlIGFuZCAoc3RyaXBwZWQpIGFzIGl0cyBgZGVzY3JpcHRpb25gIGZyb250bWF0dGVyLlxuLy8gU2hhcmluZyBvbmUgZnVuY3Rpb24ga2VlcHMgdGhlIHBhZ2UgYW5kIGl0cyBPRyBjYXJkIGZyb20gZHJpZnRpbmcgYXBhcnQuXG5mdW5jdGlvbiBnZXRBcGlJbmRleEludHJvKG5hbWVzcGFjZXM6IHJlYWRvbmx5IHN0cmluZ1tdKTogc3RyaW5nIHtcbiAgY29uc3QgeyBwYWNrYWdlTmFtZSB9ID0gZ2V0QXBpRG9jU2V0dGluZ3MoKTtcbiAgY29uc3QgW2V4YW1wbGVOYW1lc3BhY2UgPSAnbW9kdWxlJ10gPSBuYW1lc3BhY2VzO1xuICByZXR1cm4gYFRoZSBjb21wbGV0ZSBBUEkgcmVmZXJlbmNlIGZvciBcXGAke3BhY2thZ2VOYW1lfVxcYCwgZ2VuZXJhdGVkIGZyb20gaXRzIFRTRG9jLiBgXG4gICAgKyBgRWFjaCBtb2R1bGUgYmVsb3cgbWFwcyB0byBhbiBpbXBvcnQgc3VicGF0aCAoZS5nLiB0aGUgXFxgJHtleGFtcGxlTmFtZXNwYWNlfVxcYCBtb2R1bGUgaXMgXFxgJHtwYWNrYWdlTmFtZX0vJHtleGFtcGxlTmFtZXNwYWNlfVxcYCkuYDtcbn1cblxuZnVuY3Rpb24gZ2V0Q29tcG9uZW50SW1wb3J0cyhjb21wb25lbnROYW1lczogcmVhZG9ubHkgc3RyaW5nW10pOiBzdHJpbmdbXSB7XG4gIHJldHVybiBjb21wb25lbnROYW1lcy5tYXAoKGNvbXBvbmVudE5hbWUpID0+IGBpbXBvcnQgJHtjb21wb25lbnROYW1lfSBmcm9tIFwiJHtBUElfQ09NUE9ORU5UU19JTVBPUlRfUFJFRklYfS8ke2NvbXBvbmVudE5hbWV9LmFzdHJvXCI7YCk7XG59XG5cbmZ1bmN0aW9uIHJlbmRlck5hbWVzcGFjZVRhYmxlKFxuICBsaW5lczogc3RyaW5nW10sXG4gIGhlYWRpbmc6IHN0cmluZyxcbiAgY29sdW1uTGFiZWw6IHN0cmluZyxcbiAgZW50cmllczogVHlwZUluZm9bXSxcbiAgYWxsVHlwZXM6IE1hcDxzdHJpbmcsIFR5cGVJbmZvPixcbiAgbmFtZXNwYWNlOiBzdHJpbmdcbik6IHZvaWQge1xuICBpZiAoZW50cmllcy5sZW5ndGggPT09IDApIHtcbiAgICByZXR1cm47XG4gIH1cbiAgY29uc3Qgc29ydGVkID0gWy4uLmVudHJpZXNdLnNvcnQoKGEsIGIpID0+IGEubmFtZS5sb2NhbGVDb21wYXJlKGIubmFtZSkpO1xuICBsaW5lcy5wdXNoKGAjIyAke2hlYWRpbmd9YCwgJycsIGB8ICR7Y29sdW1uTGFiZWx9IHwgRGVzY3JpcHRpb24gfGAsICd8IDotLSB8IDotLSB8Jyk7XG4gIGZvciAoY29uc3QgZW50cnkgb2Ygc29ydGVkKSB7XG4gICAgbGluZXMucHVzaChgfCBbJHtlbnRyeS5uYW1lfV0oLi8ke3RvVHlwZVJvdXRlU2VnbWVudChlbnRyeS5uYW1lc3BhY2UsIGVudHJ5Lm5hbWUpfS8pIHwgJHtlc2NhcGVNYXJrZG93bihyZXNvbHZlTGlua3MoZW50cnkuZGVzY3JpcHRpb24sIGFsbFR5cGVzLCBuYW1lc3BhY2UpKX0gfGApO1xuICB9XG4gIGxpbmVzLnB1c2goJycpO1xufVxuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQU9BLFNBQVMsOEJBQThCO0FBQ3ZDLFNBQVMseUJBQXlCO0FBQ2xDLFNBQVMsaUJBQWlCO0FBQzFCLFNBQVMsWUFBWTtBQVlyQixTQUFTLHFCQUFxQjtBQUM5QjtBQUFBLEVBQ0U7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxPQUNLO0FBQ1AsU0FBUyx5QkFBeUI7QUFDbEM7QUFBQSxFQUNFO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLE9BQ0s7QUFD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
|
|
@@ -34,7 +34,7 @@ export interface GenerateOgImagesParams {
|
|
|
34
34
|
* Generates the Open Graph cards.
|
|
35
35
|
*
|
|
36
36
|
* A card is re-rendered only when its title, description, signature or badge changed, tracked by a hash manifest
|
|
37
|
-
* beside the cards. Missing content or fonts skip the step with a warning rather than failing the build.
|
|
37
|
+
* beside the cards. A different logo file re-renders every card. Missing content or fonts skip the step with a warning rather than failing the build.
|
|
38
38
|
*
|
|
39
39
|
* @param options - The options.
|
|
40
40
|
*/
|
|
@@ -36,6 +36,7 @@ function ensureBrowserProcess() {
|
|
|
36
36
|
ensureBrowserProcess();
|
|
37
37
|
})();
|
|
38
38
|
|
|
39
|
+
import { createHash } from "node:crypto";
|
|
39
40
|
import { existsSync } from "node:fs";
|
|
40
41
|
import {
|
|
41
42
|
mkdir,
|
|
@@ -71,8 +72,10 @@ async function generateOgImages(options) {
|
|
|
71
72
|
const pages = [];
|
|
72
73
|
await walkDirectory(contentDocsDirectory, contentDocsDirectory, pages);
|
|
73
74
|
console.warn(`OG images: found ${String(pages.length)} pages`);
|
|
75
|
+
const logoHash = await computeLogoHash(faviconPath);
|
|
74
76
|
const manifest = await loadCacheManifest(manifestPath);
|
|
75
|
-
const
|
|
77
|
+
const cards = manifest?.logoHash === logoHash ? { ...manifest.cards } : {};
|
|
78
|
+
const changedPages = pages.filter((page) => cards[page.slug] !== page.hash);
|
|
76
79
|
console.warn(`OG images: ${String(changedPages.length)} changed / ${String(pages.length)} total`);
|
|
77
80
|
if (changedPages.length === 0) {
|
|
78
81
|
console.warn("All OG images up to date.");
|
|
@@ -82,13 +85,17 @@ async function generateOgImages(options) {
|
|
|
82
85
|
if (!logoDataUri) {
|
|
83
86
|
console.warn(`OG images: favicon not found (${faviconPath}); rendering cards without a logo.`);
|
|
84
87
|
}
|
|
85
|
-
await generateImagesWithPool({ brandText, changedPages, fonts, logoDataUri,
|
|
88
|
+
await generateImagesWithPool({ brandText, cards, changedPages, fonts, logoDataUri, outputDirectory });
|
|
89
|
+
const newManifest = { cards, logoHash };
|
|
86
90
|
await mkdir(dirname(manifestPath), { recursive: true });
|
|
87
|
-
await writeFile(manifestPath, JSON.stringify(
|
|
91
|
+
await writeFile(manifestPath, JSON.stringify(newManifest, null, MANIFEST_INDENT));
|
|
88
92
|
console.warn(`OG images: done. Generated ${String(changedPages.length)} images.`);
|
|
89
93
|
}
|
|
94
|
+
async function computeLogoHash(faviconPath) {
|
|
95
|
+
return existsSync(faviconPath) ? createHash("sha256").update(await readFile(faviconPath)).digest("hex") : "";
|
|
96
|
+
}
|
|
90
97
|
async function generateImagesWithPool(options) {
|
|
91
|
-
const { brandText, changedPages, fonts, logoDataUri,
|
|
98
|
+
const { brandText, cards, changedPages, fonts, logoDataUri, outputDirectory } = options;
|
|
92
99
|
let completed = 0;
|
|
93
100
|
let index = 0;
|
|
94
101
|
async function processNext() {
|
|
@@ -96,7 +103,7 @@ async function generateImagesWithPool(options) {
|
|
|
96
103
|
const outputPath = `${outputDirectory}/${page.slug}.png`;
|
|
97
104
|
await mkdir(dirname(outputPath), { recursive: true });
|
|
98
105
|
await writeFile(outputPath, await renderOgImage(page.params, { brandText, fonts, logoDataUri }));
|
|
99
|
-
|
|
106
|
+
cards[page.slug] = page.hash;
|
|
100
107
|
completed++;
|
|
101
108
|
if (completed % PROGRESS_LOG_INTERVAL === 0) {
|
|
102
109
|
console.warn(` ${String(completed)}/${String(changedPages.length)} images generated...`);
|
|
@@ -108,7 +115,11 @@ async function generateImagesWithPool(options) {
|
|
|
108
115
|
}));
|
|
109
116
|
}
|
|
110
117
|
async function loadCacheManifest(manifestPath) {
|
|
111
|
-
|
|
118
|
+
if (!existsSync(manifestPath)) {
|
|
119
|
+
return null;
|
|
120
|
+
}
|
|
121
|
+
const manifest = JSON.parse(await readFile(manifestPath, "utf-8"));
|
|
122
|
+
return typeof manifest.logoHash === "string" && typeof manifest.cards === "object" ? { cards: manifest.cards, logoHash: manifest.logoHash } : null;
|
|
112
123
|
}
|
|
113
124
|
function parseFrontMatter(content) {
|
|
114
125
|
const frontMatter = FRONT_MATTER_REG_EXP.exec(content)?.groups?.["FrontMatter"];
|
|
@@ -153,4 +164,4 @@ async function walkDirectory(directory, contentDocsDirectory, pages) {
|
|
|
153
164
|
export {
|
|
154
165
|
generateOgImages
|
|
155
166
|
};
|
|
156
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9kb2NzLXNpdGUvb2ctaW1hZ2VzLnRzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGZpbGVcbiAqXG4gKiBHZW5lcmF0ZXMgYW4gT3BlbiBHcmFwaCBjYXJkIGZvciBldmVyeSBkb2N1bWVudGF0aW9uIHBhZ2UsIHJldXNpbmcgdGhlIGNhcmRzIHdob3NlIGlucHV0cyBkaWQgbm90IGNoYW5nZS5cbiAqL1xuXG5pbXBvcnQgdHlwZSB7IEZvbnQgfSBmcm9tICdzYXRvcmknO1xuXG5pbXBvcnQgeyBleGlzdHNTeW5jIH0gZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQge1xuICBta2RpcixcbiAgcmVhZGRpcixcbiAgcmVhZEZpbGUsXG4gIHdyaXRlRmlsZVxufSBmcm9tICdub2RlOmZzL3Byb21pc2VzJztcbmltcG9ydCB7IGRpcm5hbWUgfSBmcm9tICdub2RlOnBhdGgvcG9zaXgnO1xuaW1wb3J0IHsgcGFyc2UgYXMgcGFyc2VZYW1sIH0gZnJvbSAneWFtbCc7XG5cbmltcG9ydCB0eXBlIHsgT2dDYXJkQ29udGVudCB9IGZyb20gJy4vb2ctaW1hZ2UudHMnO1xuXG5pbXBvcnQgeyBnZXRPZ0ltYWdlUGFnZVNsdWcgfSBmcm9tICcuL29nLWltYWdlLXBhZ2UudHMnO1xuaW1wb3J0IHtcbiAgY29tcHV0ZU9nSGFzaCxcbiAgbG9hZEZvbnRzLFxuICBsb2FkTG9nb0RhdGFVcmksXG4gIHJlbmRlck9nSW1hZ2Vcbn0gZnJvbSAnLi9vZy1pbWFnZS50cyc7XG5cbi8qKlxuICogT3B0aW9ucyBmb3Ige0BsaW5rIGdlbmVyYXRlT2dJbWFnZXN9LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEdlbmVyYXRlT2dJbWFnZXNQYXJhbXMge1xuICAvKipcbiAgICogVGhlIHRleHQgZXZlcnkgY2FyZCdzIGZvb3RlciBjYXJyaWVzLCBub3JtYWxseSB0aGUgcGFja2FnZSdzIG5hbWUuXG4gICAqL1xuICByZWFkb25seSBicmFuZFRleHQ6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIGRvY3VtZW50YXRpb24gY29udGVudCByb290LCBub3JtYWxseSBgPGRvY3M+L3NyYy9jb250ZW50L2RvY3NgLiBFdmVyeSBgLm1kYCAvIGAubWR4YCBwYWdlIHVuZGVyIGl0IHdpdGggYVxuICAgKiBgdGl0bGVgIGdldHMgYSBjYXJkLlxuICAgKi9cbiAgcmVhZG9ubHkgY29udGVudERvY3NEaXJlY3Rvcnk6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIFNWRyBsb2dvIGRyYXduIG9uIGV2ZXJ5IGNhcmQuIEEgbWlzc2luZyBmaWxlIHJlbmRlcnMgdGhlIGNhcmRzIHdpdGhvdXQgb25lLlxuICAgKi9cbiAgcmVhZG9ubHkgZmF2aWNvblBhdGg6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIGZvbGRlciBob2xkaW5nIHRoZSBmb250cyB0aGUgY2FyZHMgYXJlIHJlbmRlcmVkIHdpdGguXG4gICAqL1xuICByZWFkb25seSBmb250c0RpcmVjdG9yeTogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgZm9sZGVyIHRoZSBjYXJkcyBhcmUgd3JpdHRlbiB0bywgbm9ybWFsbHkgYDxkb2NzPi9wdWJsaWMvb2dgLCBzZXJ2ZWQgYXQgYDxiYXNlPi9vZy88c2x1Zz4ucG5nYC5cbiAgICovXG4gIHJlYWRvbmx5IG91dHB1dERpcmVjdG9yeTogc3RyaW5nO1xufVxuXG50eXBlIENhY2hlTWFuaWZlc3QgPSBQYXJ0aWFsPFJlY29yZDxzdHJpbmcsIHN0cmluZz4+O1xuXG5pbnRlcmZhY2UgR2VuZXJhdGVJbWFnZXNXaXRoUG9vbE9wdGlvbnMge1xuICByZWFkb25seSBicmFuZFRleHQ6IHN0cmluZztcbiAgcmVhZG9ubHkgY2hhbmdlZFBhZ2VzOiBQYWdlRW50cnlbXTtcbiAgcmVhZG9ubHkgZm9udHM6IEZvbnRbXTtcbiAgcmVhZG9ubHkgbG9nb0RhdGFVcmk6IG51bGwgfCBzdHJpbmc7XG4gIHJlYWRvbmx5IG1hbmlmZXN0OiBDYWNoZU1hbmlmZXN0O1xuICByZWFkb25seSBvdXRwdXREaXJlY3Rvcnk6IHN0cmluZztcbn1cblxuaW50ZXJmYWNlIFBhZ2VFbnRyeSB7XG4gIGhhc2g6IHN0cmluZztcbiAgcGFyYW1zOiBPZ0NhcmRDb250ZW50O1xuICBzbHVnOiBzdHJpbmc7XG59XG5cbmNvbnN0IENPTkNVUlJFTkNZID0gMTA7XG5jb25zdCBQUk9HUkVTU19MT0dfSU5URVJWQUwgPSAxMDA7XG5jb25zdCBNQU5JRkVTVF9JTkRFTlQgPSAyO1xuXG4vLyBGcm9udG1hdHRlciBpcyBwYXJzZWQgaGVyZSByYXRoZXIgdGhhbiB3aXRoIGBncmF5LW1hdHRlcmAuIEl0cyBgbGliL2VuZ2luZXMuanNgIGJpbmRzIGpzLXlhbWwnc1xuLy8gYHNhZmVMb2FkYC9gc2FmZUR1bXBgIGF0IE1PRFVMRS1MT0FEIHRpbWUsIGFuZCBib3RoIHdlcmUgcmVtb3ZlZCBpbiBqcy15YW1sIHY0IOKAlCBzbyBtZXJlbHlcbi8vIElNUE9SVElORyBgZ3JheS1tYXR0ZXJgIHRocm93cyBgQ2Fubm90IHJlYWQgcHJvcGVydGllcyBvZiB1bmRlZmluZWQgKHJlYWRpbmcgJ2JpbmQnKWAsIGJlZm9yZSBhblxuLy8gYGVuZ2luZXNgIG9wdGlvbiBjb3VsZCBvdmVycmlkZSB0aGUgZGVmYXVsdC4gT25seSB0aGUgZnJvbnRtYXR0ZXIgb2JqZWN0IGlzIG5lZWRlZCBoZXJlLlxuY29uc3QgRlJPTlRfTUFUVEVSX1JFR19FWFAgPSAvXi0tLVxccj9cXG4oPzxGcm9udE1hdHRlcj5bXFxzXFxTXSo/KVxccj9cXG4tLS0oPzpcXHI/XFxufCQpLztcblxuLyoqXG4gKiBHZW5lcmF0ZXMgdGhlIE9wZW4gR3JhcGggY2FyZHMuXG4gKlxuICogQSBjYXJkIGlzIHJlLXJlbmRlcmVkIG9ubHkgd2hlbiBpdHMgdGl0bGUsIGRlc2NyaXB0aW9uLCBzaWduYXR1cmUgb3IgYmFkZ2UgY2hhbmdlZCwgdHJhY2tlZCBieSBhIGhhc2ggbWFuaWZlc3RcbiAqIGJlc2lkZSB0aGUgY2FyZHMuIE1pc3NpbmcgY29udGVudCBvciBmb250cyBza2lwIHRoZSBzdGVwIHdpdGggYSB3YXJuaW5nIHJhdGhlciB0aGFuIGZhaWxpbmcgdGhlIGJ1aWxkLlxuICpcbiAqIEBwYXJhbSBvcHRpb25zIC0gVGhlIG9wdGlvbnMuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZW5lcmF0ZU9nSW1hZ2VzKG9wdGlvbnM6IEdlbmVyYXRlT2dJbWFnZXNQYXJhbXMpOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgeyBicmFuZFRleHQsIGNvbnRlbnREb2NzRGlyZWN0b3J5LCBmYXZpY29uUGF0aCwgZm9udHNEaXJlY3RvcnksIG91dHB1dERpcmVjdG9yeSB9ID0gb3B0aW9ucztcbiAgY29uc3QgbWFuaWZlc3RQYXRoID0gYCR7b3V0cHV0RGlyZWN0b3J5fS8uY2FjaGUtbWFuaWZlc3QuanNvbmA7XG5cbiAgaWYgKCFleGlzdHNTeW5jKGNvbnRlbnREb2NzRGlyZWN0b3J5KSkge1xuICAgIGNvbnNvbGUud2FybihgT0cgaW1hZ2VzOiBjb250ZW50IGRpciBub3QgZm91bmQgKCR7Y29udGVudERvY3NEaXJlY3Rvcnl9KTsgc2tpcHBpbmcuYCk7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgLy8gTG9hZCBmb250cyBmaXJzdCDigJQgc2F0b3JpIGNhbm5vdCByZW5kZXIgd2l0aG91dCB0aGVtLlxuICBjb25zdCBmb250cyA9IGF3YWl0IGxvYWRGb250cyhmb250c0RpcmVjdG9yeSk7XG4gIGlmICghZm9udHMpIHtcbiAgICBjb25zb2xlLndhcm4oYE9HIGltYWdlczogbm8gZm9udHMgYXZhaWxhYmxlIGluICR7Zm9udHNEaXJlY3Rvcnl9OyBza2lwcGluZyBPRyBpbWFnZSBnZW5lcmF0aW9uLmApO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGNvbnN0IHBhZ2VzOiBQYWdlRW50cnlbXSA9IFtdO1xuICBhd2FpdCB3YWxrRGlyZWN0b3J5KGNvbnRlbnREb2NzRGlyZWN0b3J5LCBjb250ZW50RG9jc0RpcmVjdG9yeSwgcGFnZXMpO1xuICBjb25zb2xlLndhcm4oYE9HIGltYWdlczogZm91bmQgJHtTdHJpbmcocGFnZXMubGVuZ3RoKX0gcGFnZXNgKTtcblxuICBjb25zdCBtYW5pZmVzdCA9IGF3YWl0IGxvYWRDYWNoZU1hbmlmZXN0KG1hbmlmZXN0UGF0aCk7XG4gIGNvbnN0IGNoYW5nZWRQYWdlcyA9IHBhZ2VzLmZpbHRlcigocGFnZSkgPT4gbWFuaWZlc3RbcGFnZS5zbHVnXSAhPT0gcGFnZS5oYXNoKTtcbiAgY29uc29sZS53YXJuKGBPRyBpbWFnZXM6ICR7U3RyaW5nKGNoYW5nZWRQYWdlcy5sZW5ndGgpfSBjaGFuZ2VkIC8gJHtTdHJpbmcocGFnZXMubGVuZ3RoKX0gdG90YWxgKTtcblxuICBpZiAoY2hhbmdlZFBhZ2VzLmxlbmd0aCA9PT0gMCkge1xuICAgIGNvbnNvbGUud2FybignQWxsIE9HIGltYWdlcyB1cCB0byBkYXRlLicpO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIC8vIFJhc3Rlcml6ZSB0aGUgc2l0ZSBsb2dvIG9uY2UgKHNoYXJlZCBhY3Jvc3MgZXZlcnkgY2FyZCk7IGRlZ3JhZGUgZ3JhY2VmdWxseSBpZiBhYnNlbnQuXG4gIGNvbnN0IGxvZ29EYXRhVXJpID0gYXdhaXQgbG9hZExvZ29EYXRhVXJpKGZhdmljb25QYXRoKTtcbiAgaWYgKCFsb2dvRGF0YVVyaSkge1xuICAgIGNvbnNvbGUud2FybihgT0cgaW1hZ2VzOiBmYXZpY29uIG5vdCBmb3VuZCAoJHtmYXZpY29uUGF0aH0pOyByZW5kZXJpbmcgY2FyZHMgd2l0aG91dCBhIGxvZ28uYCk7XG4gIH1cblxuICBhd2FpdCBnZW5lcmF0ZUltYWdlc1dpdGhQb29sKHsgYnJhbmRUZXh0LCBjaGFuZ2VkUGFnZXMsIGZvbnRzLCBsb2dvRGF0YVVyaSwgbWFuaWZlc3QsIG91dHB1dERpcmVjdG9yeSB9KTtcblxuICBhd2FpdCBta2RpcihkaXJuYW1lKG1hbmlmZXN0UGF0aCksIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICBhd2FpdCB3cml0ZUZpbGUobWFuaWZlc3RQYXRoLCBKU09OLnN0cmluZ2lmeShtYW5pZmVzdCwgbnVsbCwgTUFOSUZFU1RfSU5ERU5UKSk7XG4gIGNvbnNvbGUud2FybihgT0cgaW1hZ2VzOiBkb25lLiBHZW5lcmF0ZWQgJHtTdHJpbmcoY2hhbmdlZFBhZ2VzLmxlbmd0aCl9IGltYWdlcy5gKTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVJbWFnZXNXaXRoUG9vbChvcHRpb25zOiBHZW5lcmF0ZUltYWdlc1dpdGhQb29sT3B0aW9ucyk6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCB7IGJyYW5kVGV4dCwgY2hhbmdlZFBhZ2VzLCBmb250cywgbG9nb0RhdGFVcmksIG1hbmlmZXN0LCBvdXRwdXREaXJlY3RvcnkgfSA9IG9wdGlvbnM7XG4gIGxldCBjb21wbGV0ZWQgPSAwO1xuICBsZXQgaW5kZXggPSAwO1xuXG4gIGFzeW5jIGZ1bmN0aW9uIHByb2Nlc3NOZXh0KCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGZvciAobGV0IHBhZ2UgPSBjaGFuZ2VkUGFnZXNbaW5kZXgrK107IHBhZ2UgIT09IHVuZGVmaW5lZDsgcGFnZSA9IGNoYW5nZWRQYWdlc1tpbmRleCsrXSkge1xuICAgICAgY29uc3Qgb3V0cHV0UGF0aCA9IGAke291dHB1dERpcmVjdG9yeX0vJHtwYWdlLnNsdWd9LnBuZ2A7XG4gICAgICBhd2FpdCBta2RpcihkaXJuYW1lKG91dHB1dFBhdGgpLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgICAgIGF3YWl0IHdyaXRlRmlsZShvdXRwdXRQYXRoLCBhd2FpdCByZW5kZXJPZ0ltYWdlKHBhZ2UucGFyYW1zLCB7IGJyYW5kVGV4dCwgZm9udHMsIGxvZ29EYXRhVXJpIH0pKTtcbiAgICAgIG1hbmlmZXN0W3BhZ2Uuc2x1Z10gPSBwYWdlLmhhc2g7XG4gICAgICBjb21wbGV0ZWQrKztcbiAgICAgIGlmIChjb21wbGV0ZWQgJSBQUk9HUkVTU19MT0dfSU5URVJWQUwgPT09IDApIHtcbiAgICAgICAgY29uc29sZS53YXJuKGAgICR7U3RyaW5nKGNvbXBsZXRlZCl9LyR7U3RyaW5nKGNoYW5nZWRQYWdlcy5sZW5ndGgpfSBpbWFnZXMgZ2VuZXJhdGVkLi4uYCk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgYXdhaXQgUHJvbWlzZS5hbGwoQXJyYXkuZnJvbSh7IGxlbmd0aDogQ09OQ1VSUkVOQ1kgfSwgYXN5bmMgKCkgPT4ge1xuICAgIGF3YWl0IHByb2Nlc3NOZXh0KCk7XG4gIH0pKTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gbG9hZENhY2hlTWFuaWZlc3QobWFuaWZlc3RQYXRoOiBzdHJpbmcpOiBQcm9taXNlPENhY2hlTWFuaWZlc3Q+IHtcbiAgcmV0dXJuIGV4aXN0c1N5bmMobWFuaWZlc3RQYXRoKSA/IChKU09OLnBhcnNlKGF3YWl0IHJlYWRGaWxlKG1hbmlmZXN0UGF0aCwgJ3V0Zi04JykpIGFzIENhY2hlTWFuaWZlc3QpIDoge307XG59XG5cbmZ1bmN0aW9uIHBhcnNlRnJvbnRNYXR0ZXIoY29udGVudDogc3RyaW5nKTogUGFydGlhbDxSZWNvcmQ8c3RyaW5nLCB1bmtub3duPj4ge1xuICBjb25zdCBmcm9udE1hdHRlciA9IEZST05UX01BVFRFUl9SRUdfRVhQLmV4ZWMoY29udGVudCk/Lmdyb3Vwcz8uWydGcm9udE1hdHRlciddO1xuICByZXR1cm4gZnJvbnRNYXR0ZXIgPT09IHVuZGVmaW5lZCA/IHt9IDogKHBhcnNlWWFtbChmcm9udE1hdHRlcikgYXMgbnVsbCB8IFBhcnRpYWw8UmVjb3JkPHN0cmluZywgdW5rbm93bj4+KSA/PyB7fTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gcGFyc2VQYWdlKGZpbGVQYXRoOiBzdHJpbmcsIGNvbnRlbnREb2NzRGlyZWN0b3J5OiBzdHJpbmcpOiBQcm9taXNlPG51bGwgfCBQYWdlRW50cnk+IHtcbiAgY29uc3QgZGF0YSA9IHBhcnNlRnJvbnRNYXR0ZXIoYXdhaXQgcmVhZEZpbGUoZmlsZVBhdGgsICd1dGYtOCcpKTtcblxuICBjb25zdCB0aXRsZSA9IHRvT3B0aW9uYWxTdHJpbmcoZGF0YVsndGl0bGUnXSk7XG4gIGlmICghdGl0bGUpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIGNvbnN0IGJhZGdlID0gZGF0YVsnc2lkZWJhciddIGFzIFBhcnRpYWw8UmVjb3JkPHN0cmluZywgUGFydGlhbDxSZWNvcmQ8c3RyaW5nLCB1bmtub3duPj4+PiB8IHVuZGVmaW5lZDtcbiAgY29uc3QgcGFyYW1zOiBPZ0NhcmRDb250ZW50ID0ge1xuICAgIGJhZGdlOiB0b09wdGlvbmFsU3RyaW5nKGJhZGdlPy5bJ2JhZGdlJ10/LlsndGV4dCddKSxcbiAgICBkZXNjcmlwdGlvbjogdG9PcHRpb25hbFN0cmluZyhkYXRhWydkZXNjcmlwdGlvbiddKSA/PyAnJyxcbiAgICBzaWduYXR1cmU6IHRvT3B0aW9uYWxTdHJpbmcoZGF0YVsnc2lnbmF0dXJlJ10pID8/ICcnLFxuICAgIHRpdGxlXG4gIH07XG5cbiAgcmV0dXJuIHtcbiAgICBoYXNoOiBjb21wdXRlT2dIYXNoKHBhcmFtcyksXG4gICAgcGFyYW1zLFxuICAgIHNsdWc6IGdldE9nSW1hZ2VQYWdlU2x1ZyhkYXRhLCBmaWxlUGF0aCwgY29udGVudERvY3NEaXJlY3RvcnkpXG4gIH07XG59XG5cbmZ1bmN0aW9uIHRvT3B0aW9uYWxTdHJpbmcodmFsdWU6IHVua25vd24pOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICByZXR1cm4gdHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJyA/IHZhbHVlIDogdW5kZWZpbmVkO1xufVxuXG5hc3luYyBmdW5jdGlvbiB3YWxrRGlyZWN0b3J5KGRpcmVjdG9yeTogc3RyaW5nLCBjb250ZW50RG9jc0RpcmVjdG9yeTogc3RyaW5nLCBwYWdlczogUGFnZUVudHJ5W10pOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgZW50cmllcyA9IGF3YWl0IHJlYWRkaXIoZGlyZWN0b3J5LCB7IHdpdGhGaWxlVHlwZXM6IHRydWUgfSk7XG4gIGZvciAoY29uc3QgZW50cnkgb2YgZW50cmllcykge1xuICAgIGNvbnN0IGZ1bGxQYXRoID0gYCR7ZGlyZWN0b3J5fS8ke2VudHJ5Lm5hbWV9YDtcbiAgICBpZiAoZW50cnkuaXNEaXJlY3RvcnkoKSkge1xuICAgICAgYXdhaXQgd2Fsa0RpcmVjdG9yeShmdWxsUGF0aCwgY29udGVudERvY3NEaXJlY3RvcnksIHBhZ2VzKTtcbiAgICB9IGVsc2UgaWYgKGVudHJ5Lm5hbWUuZW5kc1dpdGgoJy5tZCcpIHx8IGVudHJ5Lm5hbWUuZW5kc1dpdGgoJy5tZHgnKSkge1xuICAgICAgY29uc3QgcGFnZSA9IGF3YWl0IHBhcnNlUGFnZShmdWxsUGF0aCwgY29udGVudERvY3NEaXJlY3RvcnkpO1xuICAgICAgaWYgKHBhZ2UpIHtcbiAgICAgICAgcGFnZXMucHVzaChwYWdlKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFRQSxTQUFTLGtCQUFrQjtBQUMzQjtBQUFBLEVBQ0U7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxPQUNLO0FBQ1AsU0FBUyxlQUFlO0FBQ3hCLFNBQVMsU0FBUyxpQkFBaUI7QUFJbkMsU0FBUywwQkFBMEI7QUFDbkM7QUFBQSxFQUNFO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsT0FDSztBQWtEUCxNQUFNLGNBQWM7QUFDcEIsTUFBTSx3QkFBd0I7QUFDOUIsTUFBTSxrQkFBa0I7QUFNeEIsTUFBTSx1QkFBdUI7QUFVN0IsZUFBc0IsaUJBQWlCLFNBQWdEO0FBQ3JGLFFBQU0sRUFBRSxXQUFXLHNCQUFzQixhQUFhLGdCQUFnQixnQkFBZ0IsSUFBSTtBQUMxRixRQUFNLGVBQWUsR0FBRyxlQUFlO0FBRXZDLE1BQUksQ0FBQyxXQUFXLG9CQUFvQixHQUFHO0FBQ3JDLFlBQVEsS0FBSyxxQ0FBcUMsb0JBQW9CLGNBQWM7QUFDcEY7QUFBQSxFQUNGO0FBR0EsUUFBTSxRQUFRLE1BQU0sVUFBVSxjQUFjO0FBQzVDLE1BQUksQ0FBQyxPQUFPO0FBQ1YsWUFBUSxL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
|
|
167
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9kb2NzLXNpdGUvb2ctaW1hZ2VzLnRzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGZpbGVcbiAqXG4gKiBHZW5lcmF0ZXMgYW4gT3BlbiBHcmFwaCBjYXJkIGZvciBldmVyeSBkb2N1bWVudGF0aW9uIHBhZ2UsIHJldXNpbmcgdGhlIGNhcmRzIHdob3NlIGlucHV0cyBkaWQgbm90IGNoYW5nZS5cbiAqL1xuXG5pbXBvcnQgdHlwZSB7IEZvbnQgfSBmcm9tICdzYXRvcmknO1xuXG5pbXBvcnQgeyBjcmVhdGVIYXNoIH0gZnJvbSAnbm9kZTpjcnlwdG8nO1xuaW1wb3J0IHsgZXhpc3RzU3luYyB9IGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHtcbiAgbWtkaXIsXG4gIHJlYWRkaXIsXG4gIHJlYWRGaWxlLFxuICB3cml0ZUZpbGVcbn0gZnJvbSAnbm9kZTpmcy9wcm9taXNlcyc7XG5pbXBvcnQgeyBkaXJuYW1lIH0gZnJvbSAnbm9kZTpwYXRoL3Bvc2l4JztcbmltcG9ydCB7IHBhcnNlIGFzIHBhcnNlWWFtbCB9IGZyb20gJ3lhbWwnO1xuXG5pbXBvcnQgdHlwZSB7IE9nQ2FyZENvbnRlbnQgfSBmcm9tICcuL29nLWltYWdlLnRzJztcblxuaW1wb3J0IHsgZ2V0T2dJbWFnZVBhZ2VTbHVnIH0gZnJvbSAnLi9vZy1pbWFnZS1wYWdlLnRzJztcbmltcG9ydCB7XG4gIGNvbXB1dGVPZ0hhc2gsXG4gIGxvYWRGb250cyxcbiAgbG9hZExvZ29EYXRhVXJpLFxuICByZW5kZXJPZ0ltYWdlXG59IGZyb20gJy4vb2ctaW1hZ2UudHMnO1xuXG4vKipcbiAqIE9wdGlvbnMgZm9yIHtAbGluayBnZW5lcmF0ZU9nSW1hZ2VzfS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBHZW5lcmF0ZU9nSW1hZ2VzUGFyYW1zIHtcbiAgLyoqXG4gICAqIFRoZSB0ZXh0IGV2ZXJ5IGNhcmQncyBmb290ZXIgY2Fycmllcywgbm9ybWFsbHkgdGhlIHBhY2thZ2UncyBuYW1lLlxuICAgKi9cbiAgcmVhZG9ubHkgYnJhbmRUZXh0OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBkb2N1bWVudGF0aW9uIGNvbnRlbnQgcm9vdCwgbm9ybWFsbHkgYDxkb2NzPi9zcmMvY29udGVudC9kb2NzYC4gRXZlcnkgYC5tZGAgLyBgLm1keGAgcGFnZSB1bmRlciBpdCB3aXRoIGFcbiAgICogYHRpdGxlYCBnZXRzIGEgY2FyZC5cbiAgICovXG4gIHJlYWRvbmx5IGNvbnRlbnREb2NzRGlyZWN0b3J5OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBTVkcgbG9nbyBkcmF3biBvbiBldmVyeSBjYXJkLiBBIG1pc3NpbmcgZmlsZSByZW5kZXJzIHRoZSBjYXJkcyB3aXRob3V0IG9uZS5cbiAgICovXG4gIHJlYWRvbmx5IGZhdmljb25QYXRoOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBmb2xkZXIgaG9sZGluZyB0aGUgZm9udHMgdGhlIGNhcmRzIGFyZSByZW5kZXJlZCB3aXRoLlxuICAgKi9cbiAgcmVhZG9ubHkgZm9udHNEaXJlY3Rvcnk6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIGZvbGRlciB0aGUgY2FyZHMgYXJlIHdyaXR0ZW4gdG8sIG5vcm1hbGx5IGA8ZG9jcz4vcHVibGljL29nYCwgc2VydmVkIGF0IGA8YmFzZT4vb2cvPHNsdWc+LnBuZ2AuXG4gICAqL1xuICByZWFkb25seSBvdXRwdXREaXJlY3Rvcnk6IHN0cmluZztcbn1cblxuaW50ZXJmYWNlIENhY2hlTWFuaWZlc3Qge1xuICAvLyBFYWNoIHBhZ2UncyBjb250ZW50IGhhc2gsIGJ5IHNsdWcuXG4gIHJlYWRvbmx5IGNhcmRzOiBDYXJkSGFzaGVzO1xuICAvLyBUaGUgaGFzaCBvZiB0aGUgbG9nbyBldmVyeSBjYXJkIGNhcnJpZXMuIFRoZSBwYWdlIGhhc2hlcyBjYW5ub3Qgc2VlIGl0LCBzbyBhIGRpZmZlcmVudCBsb2dvIGRyb3BzIHRoZW0gYWxsLlxuICByZWFkb25seSBsb2dvSGFzaDogc3RyaW5nO1xufVxuXG50eXBlIENhcmRIYXNoZXMgPSBQYXJ0aWFsPFJlY29yZDxzdHJpbmcsIHN0cmluZz4+O1xuXG5pbnRlcmZhY2UgR2VuZXJhdGVJbWFnZXNXaXRoUG9vbE9wdGlvbnMge1xuICByZWFkb25seSBicmFuZFRleHQ6IHN0cmluZztcbiAgcmVhZG9ubHkgY2FyZHM6IENhcmRIYXNoZXM7XG4gIHJlYWRvbmx5IGNoYW5nZWRQYWdlczogUGFnZUVudHJ5W107XG4gIHJlYWRvbmx5IGZvbnRzOiBGb250W107XG4gIHJlYWRvbmx5IGxvZ29EYXRhVXJpOiBudWxsIHwgc3RyaW5nO1xuICByZWFkb25seSBvdXRwdXREaXJlY3Rvcnk6IHN0cmluZztcbn1cblxuaW50ZXJmYWNlIFBhZ2VFbnRyeSB7XG4gIGhhc2g6IHN0cmluZztcbiAgcGFyYW1zOiBPZ0NhcmRDb250ZW50O1xuICBzbHVnOiBzdHJpbmc7XG59XG5cbmNvbnN0IENPTkNVUlJFTkNZID0gMTA7XG5jb25zdCBQUk9HUkVTU19MT0dfSU5URVJWQUwgPSAxMDA7XG5jb25zdCBNQU5JRkVTVF9JTkRFTlQgPSAyO1xuXG4vLyBGcm9udG1hdHRlciBpcyBwYXJzZWQgaGVyZSByYXRoZXIgdGhhbiB3aXRoIGBncmF5LW1hdHRlcmAuIEl0cyBgbGliL2VuZ2luZXMuanNgIGJpbmRzIGpzLXlhbWwnc1xuLy8gYHNhZmVMb2FkYC9gc2FmZUR1bXBgIGF0IE1PRFVMRS1MT0FEIHRpbWUsIGFuZCBib3RoIHdlcmUgcmVtb3ZlZCBpbiBqcy15YW1sIHY0IOKAlCBzbyBtZXJlbHlcbi8vIElNUE9SVElORyBgZ3JheS1tYXR0ZXJgIHRocm93cyBgQ2Fubm90IHJlYWQgcHJvcGVydGllcyBvZiB1bmRlZmluZWQgKHJlYWRpbmcgJ2JpbmQnKWAsIGJlZm9yZSBhblxuLy8gYGVuZ2luZXNgIG9wdGlvbiBjb3VsZCBvdmVycmlkZSB0aGUgZGVmYXVsdC4gT25seSB0aGUgZnJvbnRtYXR0ZXIgb2JqZWN0IGlzIG5lZWRlZCBoZXJlLlxuY29uc3QgRlJPTlRfTUFUVEVSX1JFR19FWFAgPSAvXi0tLVxccj9cXG4oPzxGcm9udE1hdHRlcj5bXFxzXFxTXSo/KVxccj9cXG4tLS0oPzpcXHI/XFxufCQpLztcblxuLyoqXG4gKiBHZW5lcmF0ZXMgdGhlIE9wZW4gR3JhcGggY2FyZHMuXG4gKlxuICogQSBjYXJkIGlzIHJlLXJlbmRlcmVkIG9ubHkgd2hlbiBpdHMgdGl0bGUsIGRlc2NyaXB0aW9uLCBzaWduYXR1cmUgb3IgYmFkZ2UgY2hhbmdlZCwgdHJhY2tlZCBieSBhIGhhc2ggbWFuaWZlc3RcbiAqIGJlc2lkZSB0aGUgY2FyZHMuIEEgZGlmZmVyZW50IGxvZ28gZmlsZSByZS1yZW5kZXJzIGV2ZXJ5IGNhcmQuIE1pc3NpbmcgY29udGVudCBvciBmb250cyBza2lwIHRoZSBzdGVwIHdpdGggYSB3YXJuaW5nIHJhdGhlciB0aGFuIGZhaWxpbmcgdGhlIGJ1aWxkLlxuICpcbiAqIEBwYXJhbSBvcHRpb25zIC0gVGhlIG9wdGlvbnMuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZW5lcmF0ZU9nSW1hZ2VzKG9wdGlvbnM6IEdlbmVyYXRlT2dJbWFnZXNQYXJhbXMpOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgeyBicmFuZFRleHQsIGNvbnRlbnREb2NzRGlyZWN0b3J5LCBmYXZpY29uUGF0aCwgZm9udHNEaXJlY3RvcnksIG91dHB1dERpcmVjdG9yeSB9ID0gb3B0aW9ucztcbiAgY29uc3QgbWFuaWZlc3RQYXRoID0gYCR7b3V0cHV0RGlyZWN0b3J5fS8uY2FjaGUtbWFuaWZlc3QuanNvbmA7XG5cbiAgaWYgKCFleGlzdHNTeW5jKGNvbnRlbnREb2NzRGlyZWN0b3J5KSkge1xuICAgIGNvbnNvbGUud2FybihgT0cgaW1hZ2VzOiBjb250ZW50IGRpciBub3QgZm91bmQgKCR7Y29udGVudERvY3NEaXJlY3Rvcnl9KTsgc2tpcHBpbmcuYCk7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgLy8gTG9hZCBmb250cyBmaXJzdCDigJQgc2F0b3JpIGNhbm5vdCByZW5kZXIgd2l0aG91dCB0aGVtLlxuICBjb25zdCBmb250cyA9IGF3YWl0IGxvYWRGb250cyhmb250c0RpcmVjdG9yeSk7XG4gIGlmICghZm9udHMpIHtcbiAgICBjb25zb2xlLndhcm4oYE9HIGltYWdlczogbm8gZm9udHMgYXZhaWxhYmxlIGluICR7Zm9udHNEaXJlY3Rvcnl9OyBza2lwcGluZyBPRyBpbWFnZSBnZW5lcmF0aW9uLmApO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGNvbnN0IHBhZ2VzOiBQYWdlRW50cnlbXSA9IFtdO1xuICBhd2FpdCB3YWxrRGlyZWN0b3J5KGNvbnRlbnREb2NzRGlyZWN0b3J5LCBjb250ZW50RG9jc0RpcmVjdG9yeSwgcGFnZXMpO1xuICBjb25zb2xlLndhcm4oYE9HIGltYWdlczogZm91bmQgJHtTdHJpbmcocGFnZXMubGVuZ3RoKX0gcGFnZXNgKTtcblxuICBjb25zdCBsb2dvSGFzaCA9IGF3YWl0IGNvbXB1dGVMb2dvSGFzaChmYXZpY29uUGF0aCk7XG4gIGNvbnN0IG1hbmlmZXN0ID0gYXdhaXQgbG9hZENhY2hlTWFuaWZlc3QobWFuaWZlc3RQYXRoKTtcbiAgY29uc3QgY2FyZHMgPSBtYW5pZmVzdD8ubG9nb0hhc2ggPT09IGxvZ29IYXNoID8geyAuLi5tYW5pZmVzdC5jYXJkcyB9IDoge307XG4gIGNvbnN0IGNoYW5nZWRQYWdlcyA9IHBhZ2VzLmZpbHRlcigocGFnZSkgPT4gY2FyZHNbcGFnZS5zbHVnXSAhPT0gcGFnZS5oYXNoKTtcbiAgY29uc29sZS53YXJuKGBPRyBpbWFnZXM6ICR7U3RyaW5nKGNoYW5nZWRQYWdlcy5sZW5ndGgpfSBjaGFuZ2VkIC8gJHtTdHJpbmcocGFnZXMubGVuZ3RoKX0gdG90YWxgKTtcblxuICBpZiAoY2hhbmdlZFBhZ2VzLmxlbmd0aCA9PT0gMCkge1xuICAgIGNvbnNvbGUud2FybignQWxsIE9HIGltYWdlcyB1cCB0byBkYXRlLicpO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIC8vIFJhc3Rlcml6ZSB0aGUgc2l0ZSBsb2dvIG9uY2UgKHNoYXJlZCBhY3Jvc3MgZXZlcnkgY2FyZCk7IGRlZ3JhZGUgZ3JhY2VmdWxseSBpZiBhYnNlbnQuXG4gIGNvbnN0IGxvZ29EYXRhVXJpID0gYXdhaXQgbG9hZExvZ29EYXRhVXJpKGZhdmljb25QYXRoKTtcbiAgaWYgKCFsb2dvRGF0YVVyaSkge1xuICAgIGNvbnNvbGUud2FybihgT0cgaW1hZ2VzOiBmYXZpY29uIG5vdCBmb3VuZCAoJHtmYXZpY29uUGF0aH0pOyByZW5kZXJpbmcgY2FyZHMgd2l0aG91dCBhIGxvZ28uYCk7XG4gIH1cblxuICBhd2FpdCBnZW5lcmF0ZUltYWdlc1dpdGhQb29sKHsgYnJhbmRUZXh0LCBjYXJkcywgY2hhbmdlZFBhZ2VzLCBmb250cywgbG9nb0RhdGFVcmksIG91dHB1dERpcmVjdG9yeSB9KTtcblxuICBjb25zdCBuZXdNYW5pZmVzdDogQ2FjaGVNYW5pZmVzdCA9IHsgY2FyZHMsIGxvZ29IYXNoIH07XG4gIGF3YWl0IG1rZGlyKGRpcm5hbWUobWFuaWZlc3RQYXRoKSwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG4gIGF3YWl0IHdyaXRlRmlsZShtYW5pZmVzdFBhdGgsIEpTT04uc3RyaW5naWZ5KG5ld01hbmlmZXN0LCBudWxsLCBNQU5JRkVTVF9JTkRFTlQpKTtcbiAgY29uc29sZS53YXJuKGBPRyBpbWFnZXM6IGRvbmUuIEdlbmVyYXRlZCAke1N0cmluZyhjaGFuZ2VkUGFnZXMubGVuZ3RoKX0gaW1hZ2VzLmApO1xufVxuXG5hc3luYyBmdW5jdGlvbiBjb21wdXRlTG9nb0hhc2goZmF2aWNvblBhdGg6IHN0cmluZyk6IFByb21pc2U8c3RyaW5nPiB7XG4gIHJldHVybiBleGlzdHNTeW5jKGZhdmljb25QYXRoKSA/IGNyZWF0ZUhhc2goJ3NoYTI1NicpLnVwZGF0ZShhd2FpdCByZWFkRmlsZShmYXZpY29uUGF0aCkpLmRpZ2VzdCgnaGV4JykgOiAnJztcbn1cblxuYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVJbWFnZXNXaXRoUG9vbChvcHRpb25zOiBHZW5lcmF0ZUltYWdlc1dpdGhQb29sT3B0aW9ucyk6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCB7IGJyYW5kVGV4dCwgY2FyZHMsIGNoYW5nZWRQYWdlcywgZm9udHMsIGxvZ29EYXRhVXJpLCBvdXRwdXREaXJlY3RvcnkgfSA9IG9wdGlvbnM7XG4gIGxldCBjb21wbGV0ZWQgPSAwO1xuICBsZXQgaW5kZXggPSAwO1xuXG4gIGFzeW5jIGZ1bmN0aW9uIHByb2Nlc3NOZXh0KCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGZvciAobGV0IHBhZ2UgPSBjaGFuZ2VkUGFnZXNbaW5kZXgrK107IHBhZ2UgIT09IHVuZGVmaW5lZDsgcGFnZSA9IGNoYW5nZWRQYWdlc1tpbmRleCsrXSkge1xuICAgICAgY29uc3Qgb3V0cHV0UGF0aCA9IGAke291dHB1dERpcmVjdG9yeX0vJHtwYWdlLnNsdWd9LnBuZ2A7XG4gICAgICBhd2FpdCBta2RpcihkaXJuYW1lKG91dHB1dFBhdGgpLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgICAgIGF3YWl0IHdyaXRlRmlsZShvdXRwdXRQYXRoLCBhd2FpdCByZW5kZXJPZ0ltYWdlKHBhZ2UucGFyYW1zLCB7IGJyYW5kVGV4dCwgZm9udHMsIGxvZ29EYXRhVXJpIH0pKTtcbiAgICAgIGNhcmRzW3BhZ2Uuc2x1Z10gPSBwYWdlLmhhc2g7XG4gICAgICBjb21wbGV0ZWQrKztcbiAgICAgIGlmIChjb21wbGV0ZWQgJSBQUk9HUkVTU19MT0dfSU5URVJWQUwgPT09IDApIHtcbiAgICAgICAgY29uc29sZS53YXJuKGAgICR7U3RyaW5nKGNvbXBsZXRlZCl9LyR7U3RyaW5nKGNoYW5nZWRQYWdlcy5sZW5ndGgpfSBpbWFnZXMgZ2VuZXJhdGVkLi4uYCk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgYXdhaXQgUHJvbWlzZS5hbGwoQXJyYXkuZnJvbSh7IGxlbmd0aDogQ09OQ1VSUkVOQ1kgfSwgYXN5bmMgKCkgPT4ge1xuICAgIGF3YWl0IHByb2Nlc3NOZXh0KCk7XG4gIH0pKTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gbG9hZENhY2hlTWFuaWZlc3QobWFuaWZlc3RQYXRoOiBzdHJpbmcpOiBQcm9taXNlPENhY2hlTWFuaWZlc3QgfCBudWxsPiB7XG4gIGlmICghZXhpc3RzU3luYyhtYW5pZmVzdFBhdGgpKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbiAgLy8gQSBtYW5pZmVzdCB3cml0dGVuIGJlZm9yZSB0aGUgbG9nbyB3YXMgdHJhY2tlZCBpcyBhIGZsYXQgc2x1Zy10by1oYXNoIG1hcDogaXQgaGFzIG5vIGBsb2dvSGFzaGAsIHNvIGV2ZXJ5IGNhcmRcbiAgLy8gcmUtcmVuZGVycyBvbmNlLlxuICBjb25zdCBtYW5pZmVzdCA9IEpTT04ucGFyc2UoYXdhaXQgcmVhZEZpbGUobWFuaWZlc3RQYXRoLCAndXRmLTgnKSkgYXMgUGFydGlhbDxDYWNoZU1hbmlmZXN0PjtcbiAgcmV0dXJuIHR5cGVvZiBtYW5pZmVzdC5sb2dvSGFzaCA9PT0gJ3N0cmluZycgJiYgdHlwZW9mIG1hbmlmZXN0LmNhcmRzID09PSAnb2JqZWN0J1xuICAgID8geyBjYXJkczogbWFuaWZlc3QuY2FyZHMsIGxvZ29IYXNoOiBtYW5pZmVzdC5sb2dvSGFzaCB9XG4gICAgOiBudWxsO1xufVxuXG5mdW5jdGlvbiBwYXJzZUZyb250TWF0dGVyKGNvbnRlbnQ6IHN0cmluZyk6IFBhcnRpYWw8UmVjb3JkPHN0cmluZywgdW5rbm93bj4+IHtcbiAgY29uc3QgZnJvbnRNYXR0ZXIgPSBGUk9OVF9NQVRURVJfUkVHX0VYUC5leGVjKGNvbnRlbnQpPy5ncm91cHM/LlsnRnJvbnRNYXR0ZXInXTtcbiAgcmV0dXJuIGZyb250TWF0dGVyID09PSB1bmRlZmluZWQgPyB7fSA6IChwYXJzZVlhbWwoZnJvbnRNYXR0ZXIpIGFzIG51bGwgfCBQYXJ0aWFsPFJlY29yZDxzdHJpbmcsIHVua25vd24+PikgPz8ge307XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHBhcnNlUGFnZShmaWxlUGF0aDogc3RyaW5nLCBjb250ZW50RG9jc0RpcmVjdG9yeTogc3RyaW5nKTogUHJvbWlzZTxudWxsIHwgUGFnZUVudHJ5PiB7XG4gIGNvbnN0IGRhdGEgPSBwYXJzZUZyb250TWF0dGVyKGF3YWl0IHJlYWRGaWxlKGZpbGVQYXRoLCAndXRmLTgnKSk7XG5cbiAgY29uc3QgdGl0bGUgPSB0b09wdGlvbmFsU3RyaW5nKGRhdGFbJ3RpdGxlJ10pO1xuICBpZiAoIXRpdGxlKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBjb25zdCBiYWRnZSA9IGRhdGFbJ3NpZGViYXInXSBhcyBQYXJ0aWFsPFJlY29yZDxzdHJpbmcsIFBhcnRpYWw8UmVjb3JkPHN0cmluZywgdW5rbm93bj4+Pj4gfCB1bmRlZmluZWQ7XG4gIGNvbnN0IHBhcmFtczogT2dDYXJkQ29udGVudCA9IHtcbiAgICBiYWRnZTogdG9PcHRpb25hbFN0cmluZyhiYWRnZT8uWydiYWRnZSddPy5bJ3RleHQnXSksXG4gICAgZGVzY3JpcHRpb246IHRvT3B0aW9uYWxTdHJpbmcoZGF0YVsnZGVzY3JpcHRpb24nXSkgPz8gJycsXG4gICAgc2lnbmF0dXJlOiB0b09wdGlvbmFsU3RyaW5nKGRhdGFbJ3NpZ25hdHVyZSddKSA/PyAnJyxcbiAgICB0aXRsZVxuICB9O1xuXG4gIHJldHVybiB7XG4gICAgaGFzaDogY29tcHV0ZU9nSGFzaChwYXJhbXMpLFxuICAgIHBhcmFtcyxcbiAgICBzbHVnOiBnZXRPZ0ltYWdlUGFnZVNsdWcoZGF0YSwgZmlsZVBhdGgsIGNvbnRlbnREb2NzRGlyZWN0b3J5KVxuICB9O1xufVxuXG5mdW5jdGlvbiB0b09wdGlvbmFsU3RyaW5nKHZhbHVlOiB1bmtub3duKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycgPyB2YWx1ZSA6IHVuZGVmaW5lZDtcbn1cblxuYXN5bmMgZnVuY3Rpb24gd2Fsa0RpcmVjdG9yeShkaXJlY3Rvcnk6IHN0cmluZywgY29udGVudERvY3NEaXJlY3Rvcnk6IHN0cmluZywgcGFnZXM6IFBhZ2VFbnRyeVtdKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IGVudHJpZXMgPSBhd2FpdCByZWFkZGlyKGRpcmVjdG9yeSwgeyB3aXRoRmlsZVR5cGVzOiB0cnVlIH0pO1xuICBmb3IgKGNvbnN0IGVudHJ5IG9mIGVudHJpZXMpIHtcbiAgICBjb25zdCBmdWxsUGF0aCA9IGAke2RpcmVjdG9yeX0vJHtlbnRyeS5uYW1lfWA7XG4gICAgaWYgKGVudHJ5LmlzRGlyZWN0b3J5KCkpIHtcbiAgICAgIGF3YWl0IHdhbGtEaXJlY3RvcnkoZnVsbFBhdGgsIGNvbnRlbnREb2NzRGlyZWN0b3J5LCBwYWdlcyk7XG4gICAgfSBlbHNlIGlmIChlbnRyeS5uYW1lLmVuZHNXaXRoKCcubWQnKSB8fCBlbnRyeS5uYW1lLmVuZHNXaXRoKCcubWR4JykpIHtcbiAgICAgIGNvbnN0IHBhZ2UgPSBhd2FpdCBwYXJzZVBhZ2UoZnVsbFBhdGgsIGNvbnRlbnREb2NzRGlyZWN0b3J5KTtcbiAgICAgIGlmIChwYWdlKSB7XG4gICAgICAgIHBhZ2VzLnB1c2gocGFnZSk7XG4gICAgICB9XG4gICAgfVxuICB9XG59XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBUUEsU0FBUyxrQkFBa0I7QUFDM0IsU0FBUyxrQkFBa0I7QUFDM0I7QUFBQSxFQUNFO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsT0FDSztBQUNQLFNBQVMsZUFBZTtBQUN4QixTQUFTLFNBQVMsaUJBQWlCO0FBSW5DLFNBQVMsMEJBQTBCO0FBQ25DO0FBQUEsRUFDRTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLE9BQ0s7QUF5RFAsTUFBTSxjQUFjO0FBQ3BCLE1BQU0sd0JBQXdCO0FBQzlCLE1BQU0sa0JBQWtCO0FBTXhCLE1BQU0sdUJBQXVCO0FBVTdCLGVBQXNCLGlCQUFpQixTQUFnRDtBQUNyRixRQUFNLEVBQUUsV0FBVyxzQkFBc0IsYUFBYSxnQkFBZ0IsZ0JBQWdCLElBQUk7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
|
package/package.json
CHANGED