@mnaoumov/typescript-dev-toolkit 3.6.3 → 3.7.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -241,7 +241,11 @@ function slugifyOverloadKey(overloadKey) {
241
241
  }
242
242
  const OG_DESCRIPTION_MAX_LENGTH = 160;
243
243
  function stripMarkdown(text) {
244
- const plain = replaceRegExpMatches(text, /\{@link\s+(?:[^|}]+?)(?:\s*\|\s*(?<display>[^}]+?))?\}/g, (match) => (0, import_reg_exp.getOptionalNamedGroup)(match, "display") ?? "").replaceAll(/\[(?<text>[^\]]+)\]\([^)]+\)/g, "$<text>").replaceAll(/[`*_~]/g, "").replaceAll(/\s+/g, " ").trim();
244
+ const plain = replaceRegExpMatches(
245
+ text,
246
+ /\{@link\s+(?<target>[^|}]+?)(?:\s*\|\s*(?<display>[^}]+?))?\s*\}/g,
247
+ (match) => (0, import_reg_exp.getOptionalNamedGroup)(match, "display") ?? (0, import_reg_exp.getMandatoryNamedGroup)(match, "target")
248
+ ).replaceAll(/\[(?<text>[^\]]+)\]\([^)]+\)/g, "$<text>").replaceAll(/[`*_~]/g, "").replaceAll(/\s+/g, " ").trim();
245
249
  if (plain.length <= OG_DESCRIPTION_MAX_LENGTH) {
246
250
  return plain;
247
251
  }
@@ -278,4 +282,4 @@ function escapeMdxProseChars(chunk) {
278
282
  stripMarkdown,
279
283
  truncateSignature
280
284
  });
281
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9kb2NzLXNpdGUvYXBpLWRvYy10ZXh0LXV0aWxzLnRzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGZpbGVcbiAqXG4gKiBUZXh0L21hcmtkb3duL2VzY2FwaW5nIHV0aWxpdGllcyBhbmQgaWRlbnRpZmllciBoZWxwZXJzIGZvciB0aGUgQVBJIGRvY3VtZW50YXRpb24gZ2VuZXJhdG9yLlxuICovXG5cbmltcG9ydCB7XG4gIGdldE1hbmRhdG9yeU5hbWVkR3JvdXAsXG4gIGdldE9wdGlvbmFsTmFtZWRHcm91cFxufSBmcm9tICdAbW5hb3Vtb3YvdHlwZXNjcmlwdC1saWIvcmVnLWV4cCc7XG5pbXBvcnQgeyBta2RpciB9IGZyb20gJ25vZGU6ZnMvcHJvbWlzZXMnO1xuaW1wb3J0IHsgZGlybmFtZSB9IGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCB0eXBlIHtcbiAgTWFya2Rvd25TZWdtZW50LFxuICBNZW1iZXJJbmZvLFxuICBUeXBlSW5mb1xufSBmcm9tICcuL2FwaS1kb2MtdHlwZXMudHMnO1xuXG5pbXBvcnQgeyBFVkVOVF9NRVRIT0RTIH0gZnJvbSAnLi9hcGktZG9jLWNvbnN0YW50cy50cyc7XG5pbXBvcnQgeyByZWdpc3RlclBhY2thZ2VEZWNsYXJhdGlvbiB9IGZyb20gJy4vYXBpLWRvYy1wYWNrYWdlLXNpdGVzLnRzJztcbmltcG9ydCB7IHRvUm91dGVTZWdtZW50IH0gZnJvbSAnLi9hcGktZG9jLXJvdXRlLXNlZ21lbnRzLnRzJztcbmltcG9ydCB7IGdldEFwaURvY1NldHRpbmdzIH0gZnJvbSAnLi9hcGktZG9jLXNldHRpbmdzLnRzJztcblxuaW50ZXJmYWNlIE9wZW5GZW5jZSB7XG4gIHJlYWRvbmx5IGNsb3NlUmU6IFJlZ0V4cDtcbiAgcmVhZG9ubHkgbGFuZzogc3RyaW5nO1xufVxuXG4vKipcbiAqIENvbXB1dGUgYW4gb3ZlcmxvYWQga2V5IGZvciBtZXRob2RzIHdpdGggZGlzdGluZ3Vpc2hpbmcgZmlyc3QgcGFyYW0gKGUuZy4gb24oJ2NoYW5nZWQnLC4uLikpXG4gKlxuICogQHBhcmFtIG1ldGhvZCAtIFRoZSBtZXRob2QuXG4gKiBAcmV0dXJucyBUaGUgb3ZlcmxvYWQga2V5LlxuICovXG5leHBvcnQgZnVuY3Rpb24gY29tcHV0ZU92ZXJsb2FkS2V5KG1ldGhvZDogTWVtYmVySW5mbyk6IHN0cmluZyB7XG4gIGlmIChFVkVOVF9NRVRIT0RTLmhhcyhtZXRob2QubmFtZSkgJiYgbWV0aG9kLnBhcmFtZXRlcnMubGVuZ3RoID4gMCkge1xuICAgIGNvbnN0IGZpcnN0UGFyYW1ldGVyID0gbWV0aG9kLnBhcmFtZXRlcnNbMF07XG4gICAgaWYgKGZpcnN0UGFyYW1ldGVyPy50eXBlLnN0YXJ0c1dpdGgoJ1wiJykgfHwgZmlyc3RQYXJhbWV0ZXI/LnR5cGUuc3RhcnRzV2l0aCgnXFwnJykpIHtcbiAgICAgIGNvbnN0IG5vcm1hbGl6ZWRUeXBlID0gZmlyc3RQYXJhbWV0ZXIudHlwZS5yZXBsYWNlQWxsKCdcIicsICdcXCcnKTtcbiAgICAgIHJldHVybiBgJHttZXRob2QubmFtZX0oJHtub3JtYWxpemVkVHlwZX0pYDtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIG1ldGhvZC5uYW1lO1xufVxuXG4vKipcbiAqIENyZWF0ZXMgdGhlIGZvbGRlciBhIGZpbGUgaXMgYWJvdXQgdG8gYmUgd3JpdHRlbiB0by5cbiAqXG4gKiBAcGFyYW0gZmlsZVBhdGggLSBUaGUgcGF0aCBvZiB0aGUgZmlsZSBhYm91dCB0byBiZSB3cml0dGVuLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZW5zdXJlRGlyZWN0b3J5KGZpbGVQYXRoOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgYXdhaXQgbWtkaXIoZGlybmFtZShmaWxlUGF0aCksIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xufVxuXG4vKipcbiAqIEVzY2FwZSB0ZXh0IGZvciB1c2UgaW5zaWRlIGEgSlMgc3RyaW5nIHdpdGhpbiBhIEpTWCBleHByZXNzaW9uOiB7Li4ue2tleTogXCIuLi5cIn19XG4gKlxuICogQHBhcmFtIHRleHQgLSBUaGUgdGV4dCB0byBlc2NhcGUuXG4gKiBAcmV0dXJucyBUaGUgZXNjYXBlZCB0ZXh0LlxuICovXG5leHBvcnQgZnVuY3Rpb24gZXNjYXBlSnNTdHJpbmcodGV4dDogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIHRleHQucmVwbGFjZUFsbCgnXFxcXCcsICdcXFxcXFxcXCcpLnJlcGxhY2VBbGwoJ1wiJywgU3RyaW5nLnJhd2BcXFwiYCkucmVwbGFjZUFsbCgnXFxuJywgJyAnKTtcbn1cblxuLyoqXG4gKiBFc2NhcGUgdGV4dCBmb3IgdXNlIGluc2lkZSBhIEpTWCBhdHRyaWJ1dGU6IGF0dHI9XCIuLi5cIiAoTURYIHVzZXMgSFRNTC1zdHlsZSBwYXJzaW5nKVxuICpcbiAqIEBwYXJhbSB0ZXh0IC0gVGhlIHRleHQgdG8gZXNjYXBlLlxuICogQHJldHVybnMgVGhlIGVzY2FwZWQgdGV4dC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGVzY2FwZUpzeEF0dHJpYnV0ZSh0ZXh0OiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gdGV4dC5yZXBsYWNlQWxsKCcmJywgJyZhbXA7JykucmVwbGFjZUFsbCgnXCInLCAnJnF1b3Q7JykucmVwbGFjZUFsbCgnXFxuJywgJyAnKTtcbn1cblxuLyoqXG4gKiBFc2NhcGUgdGV4dCBmb3IgYSBtYXJrZG93biB0YWJsZSBjZWxsLlxuICpcbiAqIEBwYXJhbSB0ZXh0IC0gVGhlIHRleHQgdG8gZXNjYXBlLlxuICogQHJldHVybnMgVGhlIGVzY2FwZWQgdGV4dC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGVzY2FwZU1hcmtkb3duKHRleHQ6IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiB0ZXh0LnJlcGxhY2VBbGwoJ3wnLCBTdHJpbmcucmF3YFxcfGApLnJlcGxhY2VBbGwoJ1xcbicsICcgJykucmVwbGFjZUFsbCgneycsIFN0cmluZy5yYXdgXFx7YCkucmVwbGFjZUFsbCgnfScsIFN0cmluZy5yYXdgXFx9YCk7XG59XG5cbi8qKlxuICogRXNjYXBlIGFuZ2xlIGJyYWNrZXRzIHNvIE1EWCBkb2VzIG5vdCByZWFkIHRoZW0gYXMgSlNYLlxuICpcbiAqIEBwYXJhbSB0ZXh0IC0gVGhlIHRleHQgdG8gZXNjYXBlLlxuICogQHJldHVybnMgVGhlIGVzY2FwZWQgdGV4dC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGVzY2FwZU1keEFuZ2xlQnJhY2tldHModGV4dDogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIHRleHQucmVwbGFjZUFsbCgnPCcsIFN0cmluZy5yYXdgXFw8YCkucmVwbGFjZUFsbCgnPicsIFN0cmluZy5yYXdgXFw+YCk7XG59XG5cbi8qKlxuICogRXNjYXBlIGN1cmx5IGJyYWNlcyBpbiBNRFggbWFya2Rvd24gY29udGVudCB0byBwcmV2ZW50IEpTWCBleHByZXNzaW9uIHBhcnNpbmdcbiAqXG4gKiBAcGFyYW0gdGV4dCAtIFRoZSB0ZXh0IHRvIGVzY2FwZS5cbiAqIEByZXR1cm5zIFRoZSBlc2NhcGVkIHRleHQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBlc2NhcGVNZHhCcmFjZXModGV4dDogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIHRleHQucmVwbGFjZUFsbCgneycsIFN0cmluZy5yYXdgXFx7YCkucmVwbGFjZUFsbCgnfScsIFN0cmluZy5yYXdgXFx9YCk7XG59XG5cbi8qKlxuICogRXNjYXBlIHRleHQgZm9yIGEgZG91YmxlLXF1b3RlZCBZQU1MIHZhbHVlLlxuICpcbiAqIEBwYXJhbSB0ZXh0IC0gVGhlIHRleHQgdG8gZXNjYXBlLlxuICogQHJldHVybnMgVGhlIGVzY2FwZWQgdGV4dC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGVzY2FwZVlhbWwodGV4dDogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIHRleHQucmVwbGFjZUFsbCgnXCInLCBTdHJpbmcucmF3YFxcXCJgKTtcbn1cblxuY29uc3QgU0lHTkFUVVJFX01BWF9MRU5HVEggPSAxNjA7XG5jb25zdCBJTVBPUlRfUVVBTElGSUVSX1JFR19FWFAgPSAvaW1wb3J0XFwoKD88UXVvdGU+W1wiJ10pW15cIiddK1xcazxRdW90ZT5cXClcXC4vZztcbmNvbnN0IElNUE9SVF9UWVBFX1JFR19FWFAgPSAvaW1wb3J0XFwoKD88UXVvdGU+W1wiJ10pKD88UGF0aD5bXlwiJ10rKVxcazxRdW90ZT5cXClcXC4oPzxOYW1lPltBLVphLXpfJF1bXFx3JF0qKS9nO1xuXG4vKipcbiAqIEVzY2FwZSBNRFgtdW5zYWZlIGNoYXJhY3RlcnMgKGA8YCwgYHtgLCBgfWApIGluIHByb3NlIHRleHQsIHdoaWxlIGxlYXZpbmcgaW5saW5lIGNvZGUgc3BhbnNcbiAqIChgYCBgY29kZWAgYGApIGFuZCBtYXJrZG93biBsaW5rcyAoYFt0ZXh0XSh1cmwpYCkgdW50b3VjaGVkLiBNRFggcGFyc2VzIGJhcmUgYDxgL2B7YCBpbiBwcm9zZSBhc1xuICogSlNYL2V4cHJlc3Npb25zLCBzbyB0aGV5IG11c3QgYmUgYmFja3NsYXNoLWVzY2FwZWQgdG8gcmVuZGVyIGFzIGxpdGVyYWwgdGV4dC5cbiAqXG4gKiBAcGFyYW0gdGV4dCAtIFRoZSBwcm9zZSB0byBlc2NhcGUuXG4gKiBAcmV0dXJucyBUaGUgZXNjYXBlZCBwcm9zZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGVzY2FwZU1keFByb3NlKHRleHQ6IHN0cmluZyk6IHN0cmluZyB7XG4gIGNvbnN0IHByb3RlY3RlZFBhdHRlcm4gPSAvYFteYF0qYHxcXFtbXlxcXV0qXFxdXFwoW14pXSpcXCkvZztcbiAgbGV0IHJlc3VsdCA9ICcnO1xuICBsZXQgbGFzdEluZGV4ID0gMDtcbiAgZm9yIChjb25zdCBtYXRjaCBvZiB0ZXh0Lm1hdGNoQWxsKHByb3RlY3RlZFBhdHRlcm4pKSB7XG4gICAgY29uc3QgaW5kZXggPSBtYXRjaC5pbmRleDtcbiAgICByZXN1bHQgKz0gZXNjYXBlTWR4UHJvc2VDaGFycyh0ZXh0LnNsaWNlKGxhc3RJbmRleCwgaW5kZXgpKTtcbiAgICByZXN1bHQgKz0gbWF0Y2hbMF07XG4gICAgbGFzdEluZGV4ID0gaW5kZXggKyBtYXRjaFswXS5sZW5ndGg7XG4gIH1cbiAgcmVzdWx0ICs9IGVzY2FwZU1keFByb3NlQ2hhcnModGV4dC5zbGljZShsYXN0SW5kZXgpKTtcbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuLyoqXG4gKiBDb2xsYXBzZSBzaW5nbGUgbmV3bGluZXMgd2l0aGluIHBhcmFncmFwaHMgdG8gc3BhY2VzLCBwcmVzZXJ2ZSBkb3VibGUgbmV3bGluZXMgYXMgcGFyYWdyYXBoIGJyZWFrcy5cbiAqIEZlbmNlZCBjb2RlIGJsb2NrcyAoYmFja3RpY2sgb3IgdGlsZGUgZmVuY2VzKSBhcmUgcHJlc2VydmVkIHZlcmJhdGltIOKAlCB0aGVpciBpbnRlcm5hbCBuZXdsaW5lcyBhcmUgTk9UIGZvbGRlZCxcbiAqIHNvIGVtYmVkZGVkIGNvZGUgc3Vydml2ZXMgdG8gYmUgcmUtZW1pdHRlZCBhcyBhIHJlYWwgY29kZSBmZW5jZSBkb3duc3RyZWFtLlxuICpcbiAqIEBwYXJhbSB0ZXh0IC0gVGhlIHRleHQuXG4gKiBAcmV0dXJucyBUaGUgZm9sZGVkIHRleHQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBmb2xkVHNEb2NQYXJhZ3JhcGhzKHRleHQ6IHN0cmluZyk6IHN0cmluZyB7XG4gIGNvbnN0IHNlZ21lbnRzID0gc2VnbWVudE1hcmtkb3duKHRleHQpO1xuICByZXR1cm4gc2VnbWVudHNcbiAgICAubWFwKChzZWcpID0+IHtcbiAgICAgIHJldHVybiBzZWcudHlwZSA9PT0gJ2NvZGUnXG4gICAgICAgID8gYFxcYFxcYFxcYCR7c2VnLmxhbmd9XFxuJHtzZWcudGV4dH1cXG5cXGBcXGBcXGBgXG4gICAgICAgIDogc2VnLnRleHRcbiAgICAgICAgICAuc3BsaXQoL1xcbnsyLH0vKVxuICAgICAgICAgIC5tYXAoKHBhcmFncmFwaCkgPT4gcGFyYWdyYXBoLnJlcGxhY2VBbGwoJ1xcbicsICcgJykpXG4gICAgICAgICAgLmpvaW4oJ1xcblxcbicpO1xuICAgIH0pXG4gICAgLm1hcCgoc2VnbWVudCkgPT4gc2VnbWVudC50cmltKCkpXG4gICAgLmZpbHRlcihCb29sZWFuKVxuICAgIC5qb2luKCdcXG5cXG4nKTtcbn1cblxuLyoqXG4gKiBUaGUgdHlwZSdzIG5hbWUgd2l0aCBpdHMgdHlwZSBwYXJhbWV0ZXJzLCB3aXRob3V0IHRoZWlyIGNvbnN0cmFpbnRzLlxuICpcbiAqIEBwYXJhbSBuYW1lIC0gVGhlIHR5cGUncyBuYW1lLlxuICogQHBhcmFtIGluZm8gLSBUaGUgZG9jdW1lbnRlZCB0eXBlLlxuICogQHJldHVybnMgVGhlIG5hbWUgd2l0aCBpdHMgYmFyZSB0eXBlIHBhcmFtZXRlcnMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXREaXNwbGF5TmFtZShuYW1lOiBzdHJpbmcsIGluZm86IFR5cGVJbmZvKTogc3RyaW5nIHtcbiAgaWYgKGluZm8udHlwZVBhcmFtZXRlcnMubGVuZ3RoID09PSAwKSB7XG4gICAgcmV0dXJuIG5hbWU7XG4gIH1cbiAgY29uc3QgYmFyZVBhcmFtcyA9IGluZm8udHlwZVBhcmFtZXRlcnMubWFwKCh0cCkgPT4gdHAucmVwbGFjZSgvXFxzK2V4dGVuZHNcXHMrLiokLywgJycpKTtcbiAgcmV0dXJuIGAke25hbWV9PCR7YmFyZVBhcmFtcy5qb2luKCcsICcpfT5gO1xufVxuXG4vKipcbiAqIEVtaXQgdGhlIGltcG9ydCBzdGF0ZW1lbnQgZm9yIGEgZG9jdW1lbnRlZCBleHBvcnQuXG4gKlxuICogVGhlIHN1YnBhdGggZXF1YWxzIHRoZSB0eXBlJ3MgbmFtZXNwYWNlIChpdHMgc291cmNlIHBhdGggcmVsYXRpdmUgdG8gYHNyY2ApLCBzbyBgc3JjL3N0cmluZy50c2Agb2ZcbiAqIGBAbW5hb3Vtb3YvdHlwZXNjcmlwdC1saWJgIGlzIGBAbW5hb3Vtb3YvdHlwZXNjcmlwdC1saWIvc3RyaW5nYC5cbiAqXG4gKiBJbnRlcmZhY2VzIC8gdHlwZSBhbGlhc2VzIC8gZW51bXMgYXJlIGltcG9ydGVkIHdpdGggYGltcG9ydCB0eXBlYDsgY2xhc3NlcyAvIGZ1bmN0aW9ucyAvXG4gKiB2YXJpYWJsZXMgd2l0aCBhIHZhbHVlIGBpbXBvcnRgLlxuICpcbiAqIEBwYXJhbSBpbmZvIC0gVGhlIGRvY3VtZW50ZWQgdHlwZS5cbiAqIEByZXR1cm5zIFRoZSBpbXBvcnQgc3RhdGVtZW50LlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0SW1wb3J0U3RhdGVtZW50KGluZm86IFR5cGVJbmZvKTogc3RyaW5nIHtcbiAgY29uc3QgaXNUeXBlT25seSA9IFsnZW51bScsICdpbnRlcmZhY2UnLCAndHlwZSddLmluY2x1ZGVzKGluZm8ua2luZCk7XG4gIGNvbnN0IGltcG9ydEtleXdvcmQgPSBpc1R5cGVPbmx5ID8gJ2ltcG9ydCB0eXBlJyA6ICdpbXBvcnQnO1xuICByZXR1cm4gYCR7aW1wb3J0S2V5d29yZH0geyAke2luZm8ubmFtZX0gfSBmcm9tICcke2dldEFwaURvY1NldHRpbmdzKCkucGFja2FnZU5hbWV9LyR7aW5mby5uYW1lc3BhY2V9JztgO1xufVxuXG4vKipcbiAqIFRoZSBmb2xkZXIgYSBuYW1lc3BhY2UncyBwYWdlcyBhcmUgd3JpdHRlbiB0by5cbiAqXG4gKiBAcGFyYW0gbmFtZXNwYWNlIC0gVGhlIHR5cGUncyBuYW1lc3BhY2UuXG4gKiBAcmV0dXJucyBUaGUgZm9sZGVyLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0TmFtZXNwYWNlRGlyZWN0b3J5KG5hbWVzcGFjZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIG5hbWVzcGFjZTtcbn1cblxuLyoqXG4gKiBTYW5pdGl6ZSBhIG1lbWJlciBuYW1lIGZvciB1c2UgaW4gYSBjYXNlLVBSRVNFUlZFRCBVUkwvcm91dGUgc2VnbWVudCAoZS5nLiBgc2hvd05vdGljZWApLlxuICpcbiAqIEBwYXJhbSBuYW1lIC0gVGhlIG1lbWJlcidzIG5hbWUuXG4gKiBAcmV0dXJucyBUaGUgY2FzZS1wcmVzZXJ2ZWQgc2VnbWVudC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG1lbWJlclJvdXRlU2VnbWVudChuYW1lOiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gc2x1Z2lmeU1lbWJlck5hbWUobmFtZSk7XG59XG5cbi8qKlxuICogU2FuaXRpemUgYSBtZW1iZXIgbmFtZSBmb3IgdXNlIGFzIGFuIG9uLWRpc2sgRklMRU5BTUUgKGxvd2VyY2FzZWQsIGNvbGxpc2lvbi1zYWZlKS5cbiAqXG4gKiBAcGFyYW0gbmFtZSAtIFRoZSBtZW1iZXIncyBuYW1lLlxuICogQHJldHVybnMgVGhlIGxvd2VyY2FzZWQgZmlsZSBuYW1lIHNlZ21lbnQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBtZW1iZXJTbHVnKG5hbWU6IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiB0b1JvdXRlU2VnbWVudChzbHVnaWZ5TWVtYmVyTmFtZShuYW1lKSk7XG59XG5cbi8qKlxuICogU2x1Z2lmeSBhbiBvdmVybG9hZCBrZXkgZm9yIGEgY2FzZS1QUkVTRVJWRUQgVVJML3JvdXRlIHNlZ21lbnQ6IG9uKFwiY2hhbmdlZFwiKSAtPiBvbi1jaGFuZ2VkLlxuICpcbiAqIEBwYXJhbSBvdmVybG9hZEtleSAtIFRoZSBvdmVybG9hZCBrZXksIGUuZy4gYG9uKCdjaGFuZ2VkJylgLlxuICogQHJldHVybnMgVGhlIGNhc2UtcHJlc2VydmVkIHNlZ21lbnQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBvdmVybG9hZFJvdXRlU2VnbWVudChvdmVybG9hZEtleTogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIHNsdWdpZnlPdmVybG9hZEtleShvdmVybG9hZEtleSk7XG59XG5cbi8qKlxuICogU2x1Z2lmeSBhbiBvdmVybG9hZCBrZXkgZm9yIGFuIG9uLWRpc2sgRklMRU5BTUU6IG9uKFwiY2hhbmdlZFwiKSAtPiBvbi1jaGFuZ2VkIChsb3dlcmNhc2VkKS5cbiAqXG4gKiBAcGFyYW0gb3ZlcmxvYWRLZXkgLSBUaGUgb3ZlcmxvYWQga2V5LCBlLmcuIGBvbignY2hhbmdlZCcpYC5cbiAqIEByZXR1cm5zIFRoZSBsb3dlcmNhc2VkIGZpbGUgbmFtZSBzZWdtZW50LlxuICovXG5leHBvcnQgZnVuY3Rpb24gb3ZlcmxvYWRTbHVnKG92ZXJsb2FkS2V5OiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gdG9Sb3V0ZVNlZ21lbnQoc2x1Z2lmeU92ZXJsb2FkS2V5KG92ZXJsb2FkS2V5KSk7XG59XG5cbi8qKlxuICogUmVwbGFjZSBldmVyeSBtYXRjaCBvZiBhIGdsb2JhbCByZWd1bGFyIGV4cHJlc3Npb24gd2l0aCB3aGF0IGEgcmVwbGFjZXIgYnVpbGRzIGZyb20gdGhlIG1hdGNoLiBUaGUgdHlwZWRcbiAqIGNvdW50ZXJwYXJ0IG9mIGBTdHJpbmcucHJvdG90eXBlLnJlcGxhY2VBbGxgIHdpdGggYSBjYWxsYmFjaywgd2hvc2UgYXJndW1lbnRzIGFyZSB0eXBlZCBvbmx5IHBvc2l0aW9uYWxseS5cbiAqXG4gKiBAcGFyYW0gdGV4dCAtIFRoZSB0ZXh0LlxuICogQHBhcmFtIHJlZ0V4cCAtIFRoZSByZWd1bGFyIGV4cHJlc3Npb247IGl0IG11c3QgY2FycnkgdGhlIGBnYCBmbGFnLlxuICogQHBhcmFtIHJlcGxhY2VyIC0gQnVpbGRzIHRoZSByZXBsYWNlbWVudCBvZiBvbmUgbWF0Y2guXG4gKiBAcmV0dXJucyBUaGUgdGV4dCB3aXRoIGV2ZXJ5IG1hdGNoIHJlcGxhY2VkLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVwbGFjZVJlZ0V4cE1hdGNoZXModGV4dDogc3RyaW5nLCByZWdFeHA6IFJlZ0V4cCwgcmVwbGFjZXI6IChtYXRjaDogUmVnRXhwTWF0Y2hBcnJheSkgPT4gc3RyaW5nKTogc3RyaW5nIHtcbiAgbGV0IHJlc3VsdCA9ICcnO1xuICBsZXQgbGFzdEluZGV4ID0gMDtcbiAgZm9yIChjb25zdCBtYXRjaCBvZiB0ZXh0Lm1hdGNoQWxsKHJlZ0V4cCkpIHtcbiAgICByZXN1bHQgKz0gdGV4dC5zbGljZShsYXN0SW5kZXgsIG1hdGNoLmluZGV4KSArIHJlcGxhY2VyKG1hdGNoKTtcbiAgICBsYXN0SW5kZXggPSBtYXRjaC5pbmRleCArIG1hdGNoWzBdLmxlbmd0aDtcbiAgfVxuICByZXR1cm4gcmVzdWx0ICsgdGV4dC5zbGljZShsYXN0SW5kZXgpO1xufVxuXG4vKipcbiAqIFNwbGl0IG1hcmtkb3duIHRleHQgaW50byBhbiBvcmRlcmVkIGxpc3Qgb2YgcHJvc2UgYW5kIGZlbmNlZC1jb2RlIHNlZ21lbnRzLlxuICogQSBmZW5jZWQtY29kZSBzZWdtZW50IGlzIGRlbGltaXRlZCBieSBhIGxpbmUgb2YgMysgYmFja3RpY2tzIG9yIHRpbGRlczsgaXRzIGNvbnRlbnQgaXMgY2FwdHVyZWRcbiAqIHJhdyAobmV2ZXIgZXNjYXBlZCkgc28gaXQgY2FuIGJlIHJlLWVtaXR0ZWQgYXMgYSBsaXRlcmFsIE1EWCBjb2RlIGZlbmNlLlxuICpcbiAqIEBwYXJhbSB0ZXh0IC0gVGhlIHRleHQuXG4gKiBAcmV0dXJucyBUaGUgc2VnbWVudHMsIGluIG9yZGVyLlxuICovXG5leHBvcnQgZnVuY3Rpb24gc2VnbWVudE1hcmtkb3duKHRleHQ6IHN0cmluZyk6IE1hcmtkb3duU2VnbWVudFtdIHtcbiAgY29uc3QgbGluZXMgPSB0ZXh0LnNwbGl0KCdcXG4nKTtcbiAgY29uc3Qgc2VnbWVudHM6IE1hcmtkb3duU2VnbWVudFtdID0gW107XG4gIGxldCBwcm9zZUJ1ZmZlcjogc3RyaW5nW10gPSBbXTtcbiAgbGV0IGNvZGVMaW5lczogc3RyaW5nW10gPSBbXTtcbiAgbGV0IG9wZW5GZW5jZTogbnVsbCB8IE9wZW5GZW5jZSA9IG51bGw7XG4gIGZvciAoY29uc3QgbGluZSBvZiBsaW5lcykge1xuICAgIGlmIChvcGVuRmVuY2UpIHtcbiAgICAgIGlmIChvcGVuRmVuY2UuY2xvc2VSZS50ZXN0KGxpbmUpKSB7XG4gICAgICAgIHNlZ21lbnRzLnB1c2goeyBsYW5nOiBvcGVuRmVuY2UubGFuZywgdGV4dDogY29kZUxpbmVzLmpvaW4oJ1xcbicpLCB0eXBlOiAnY29kZScgfSk7XG4gICAgICAgIG9wZW5GZW5jZSA9IG51bGw7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb2RlTGluZXMucHVzaChsaW5lKTtcbiAgICAgIH1cbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIGNvbnN0IG9wZW5NYXRjaCA9IC9eXFxzKig/PGZlbmNlPig/PGZlbmNlQ2hhcj5bYH5dKVxcazxmZW5jZUNoYXI+ezIsfSkoPzxsYW5nPi4qKSQvLmV4ZWMobGluZSk7XG4gICAgaWYgKG9wZW5NYXRjaCkge1xuICAgICAgY29uc3QgZmVuY2VDaGFycyA9IGdldE1hbmRhdG9yeU5hbWVkR3JvdXAob3Blbk1hdGNoLCAnZmVuY2UnKTtcbiAgICAgIGNvbnN0IGZlbmNlQ2hhciA9IGdldE1hbmRhdG9yeU5hbWVkR3JvdXAob3Blbk1hdGNoLCAnZmVuY2VDaGFyJyk7XG4gICAgICBmbHVzaFByb3NlKCk7XG4gICAgICBjb2RlTGluZXMgPSBbXTtcbiAgICAgIG9wZW5GZW5jZSA9IHtcbiAgICAgICAgY2xvc2VSZTogbmV3IFJlZ0V4cChgXlxcXFxzKlxcXFwke2ZlbmNlQ2hhcn17JHtTdHJpbmcoZmVuY2VDaGFycy5sZW5ndGgpfSx9XFxcXHMqJGApLFxuICAgICAgICBsYW5nOiBnZXRNYW5kYXRvcnlOYW1lZEdyb3VwKG9wZW5NYXRjaCwgJ2xhbmcnKS50cmltKClcbiAgICAgIH07XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgcHJvc2VCdWZmZXIucHVzaChsaW5lKTtcbiAgfVxuICAvLyBBbiB1bmNsb3NlZCBmZW5jZSBydW5zIHRvIHRoZSBlbmQgb2YgdGhlIHRleHQuXG4gIGlmIChvcGVuRmVuY2UpIHtcbiAgICBzZWdtZW50cy5wdXNoKHsgbGFuZzogb3BlbkZlbmNlLmxhbmcsIHRleHQ6IGNvZGVMaW5lcy5qb2luKCdcXG4nKSwgdHlwZTogJ2NvZGUnIH0pO1xuICB9XG4gIGZsdXNoUHJvc2UoKTtcbiAgcmV0dXJuIHNlZ21lbnRzO1xuXG4gIGZ1bmN0aW9uIGZsdXNoUHJvc2UoKTogdm9pZCB7XG4gICAgaWYgKHByb3NlQnVmZmVyLmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHNlZ21lbnRzLnB1c2goeyB0ZXh0OiBwcm9zZUJ1ZmZlci5qb2luKCdcXG4nKSwgdHlwZTogJ3Byb3NlJyB9KTtcbiAgICBwcm9zZUJ1ZmZlciA9IFtdO1xuICB9XG59XG5cbi8qKlxuICogU3RyaXAgdGhlIGBpbXBvcnQoXCLigKZcIilgIHF1YWxpZmllcnMgdHMtbW9ycGggcHJpbnRzIGJlZm9yZSBhIHR5cGUgdGhhdCBpcyBub3QgaW4gc2NvcGUsIHJlY29yZGluZyBlYWNoIG9uZSdzXG4gKiBkZWNsYXJhdGlvbiBmaWxlIGZpcnN0LCBzaW5jZSBpdCBpcyB0aGUgb25lIHBsYWNlIGEgcHJpbnRlZCB0eXBlIG5hbWVzIHdoZXJlIGl0IHdhcyBkZWNsYXJlZC5cbiAqXG4gKiBAcGFyYW0gdHlwZVRleHQgLSBUaGUgcHJpbnRlZCB0eXBlLlxuICogQHJldHVybnMgVGhlIHR5cGUgd2l0aG91dCBpdHMgaW1wb3J0IHF1YWxpZmllcnMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzaW1wbGlmeVR5cGUodHlwZVRleHQ6IHN0cmluZyk6IHN0cmluZyB7XG4gIGZvciAoY29uc3QgbWF0Y2ggb2YgdHlwZVRleHQubWF0Y2hBbGwoSU1QT1JUX1RZUEVfUkVHX0VYUCkpIHtcbiAgICByZWdpc3RlclBhY2thZ2VEZWNsYXJhdGlvbihnZXRNYW5kYXRvcnlOYW1lZEdyb3VwKG1hdGNoLCAnTmFtZScpLCBnZXRNYW5kYXRvcnlOYW1lZEdyb3VwKG1hdGNoLCAnUGF0aCcpKTtcbiAgfVxuXG4gIHJldHVybiB0eXBlVGV4dC5yZXBsYWNlQWxsKElNUE9SVF9RVUFMSUZJRVJfUkVHX0VYUCwgJycpO1xufVxuXG4vKipcbiAqIE5vcm1hbGl6ZSBhIGNvZGUgc2lnbmF0dXJlIGZvciB0aGUgYHNpZ25hdHVyZTpgIGZyb250bWF0dGVyIC8gT0cgY2FyZDogY29sbGFwc2Ugd2hpdGVzcGFjZSB0b1xuICogc2luZ2xlIHNwYWNlcyBhbmQgdHJ1bmNhdGUgdG8gYSBjYXJkLWZyaWVuZGx5IGxlbmd0aCB3aXRoIGFuIGVsbGlwc2lzLlxuICpcbiAqIEBwYXJhbSBzaWduYXR1cmUgLSBUaGUgc2lnbmF0dXJlLlxuICogQHJldHVybnMgVGhlIG5vcm1hbGl6ZWQgc2lnbmF0dXJlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gdHJ1bmNhdGVTaWduYXR1cmUoc2lnbmF0dXJlOiBzdHJpbmcpOiBzdHJpbmcge1xuICBjb25zdCBjb2xsYXBzZWQgPSBzaWduYXR1cmUucmVwbGFjZUFsbCgvXFxzKy9nLCAnICcpLnRyaW0oKTtcbiAgcmV0dXJuIGNvbGxhcHNlZC5sZW5ndGggPD0gU0lHTkFUVVJFX01BWF9MRU5HVEggPyBjb2xsYXBzZWQgOiBgJHtjb2xsYXBzZWQuc2xpY2UoMCwgU0lHTkFUVVJFX01BWF9MRU5HVEggLSAxKS50cmltRW5kKCl94oCmYDtcbn1cblxuZnVuY3Rpb24gc2x1Z2lmeU1lbWJlck5hbWUobmFtZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgY29uc3QgY2xlYW5lZCA9IG5hbWVcbiAgICAucmVwbGFjZUFsbCgvXltcIiddfFtcIiddJC9nLCAnJylcbiAgICAucmVwbGFjZUFsbCgvW15hLXpBLVowLTldL2csICctJylcbiAgICAucmVwbGFjZUFsbCgvLSsvZywgJy0nKVxuICAgIC5yZXBsYWNlQWxsKC9eLXwtJC9nLCAnJyk7XG4gIC8vIEEgbWVtYmVyIGxpdGVyYWxseSBuYW1lZCBgaW5kZXhgIHdvdWxkIHdyaXRlIGBpbmRleC5tZHhgLCBjb2xsaWRpbmcgd2l0aCB0aGUgdHlwZS1vdmVydmlld1xuICAvLyBgaW5kZXgubWR4YCBpbiB0aGUgc2FtZSBkaXJlY3RvcnkgKG9uZSBzaWxlbnRseSBvdmVyd3JpdGVzIHRoZSBvdGhlciwgNDA0LWluZyB0aGUgbG9zZXIpLlxuICByZXR1cm4gY2xlYW5lZCA9PT0gJ2luZGV4JyA/ICdpbmRleC1tZW1iZXInIDogKGNsZWFuZWQgfHwgJ3VubmFtZWQnKTtcbn1cblxuZnVuY3Rpb24gc2x1Z2lmeU92ZXJsb2FkS2V5KG92ZXJsb2FkS2V5OiBzdHJpbmcpOiBzdHJpbmcge1xuICBjb25zdCBzbHVnID0gb3ZlcmxvYWRLZXlcbiAgICAucmVwbGFjZUFsbCgvW1wiJygpXS9nLCAnICcpXG4gICAgLnJlcGxhY2VBbGwoL1teYS16QS1aMC05XFxzXS9nLCAnJylcbiAgICAudHJpbSgpXG4gICAgLnJlcGxhY2VBbGwoL1xccysvZywgJy0nKTtcbiAgLy8gQSBtZXRob2QgbmFtZWQgYGluZGV4YCB3b3VsZCB3cml0ZSBgaW5kZXgubWR4YCBvdmVyIHRoZSB0eXBlLW92ZXJ2aWV3IHBhZ2UsIGV4YWN0bHkgYXMgYSBwcm9wZXJ0eSB3b3VsZC5cbiAgcmV0dXJuIHNsdWcgPT09ICdpbmRleCcgPyAnaW5kZXgtbWVtYmVyJyA6IHNsdWc7XG59XG5cbmNvbnN0IE9HX0RFU0NSSVBUSU9OX01BWF9MRU5HVEggPSAxNjA7XG5cbi8qKlxuICogU3RyaXAgbWFya2Rvd24gZm9ybWF0dGluZyB0byBwbGFpbiB0ZXh0IGZvciB1c2UgaW4gbWV0YSBkZXNjcmlwdGlvbnNcbiAqXG4gKiBAcGFyYW0gdGV4dCAtIFRoZSB0ZXh0LlxuICogQHJldHVybnMgVGhlIHBsYWluIHRleHQsIGF0IG1vc3QgMTYwIGNoYXJhY3RlcnMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzdHJpcE1hcmtkb3duKHRleHQ6IHN0cmluZyk6IHN0cmluZyB7XG4gIGNvbnN0IHBsYWluID0gcmVwbGFjZVJlZ0V4cE1hdGNoZXModGV4dCwgL1xce0BsaW5rXFxzKyg/OltefH1dKz8pKD86XFxzKlxcfFxccyooPzxkaXNwbGF5PltefV0rPykpP1xcfS9nLCAobWF0Y2gpID0+IGdldE9wdGlvbmFsTmFtZWRHcm91cChtYXRjaCwgJ2Rpc3BsYXknKSA/PyAnJylcbiAgICAucmVwbGFjZUFsbCgvXFxbKD88dGV4dD5bXlxcXV0rKVxcXVxcKFteKV0rXFwpL2csICckPHRleHQ+JylcbiAgICAucmVwbGFjZUFsbCgvW2AqX35dL2csICcnKVxuICAgIC5yZXBsYWNlQWxsKC9cXHMrL2csICcgJylcbiAgICAudHJpbSgpO1xuXG4gIGlmIChwbGFpbi5sZW5ndGggPD0gT0dfREVTQ1JJUFRJT05fTUFYX0xFTkdUSCkge1xuICAgIHJldHVybiBwbGFpbjtcbiAgfVxuXG4gIC8vIEN1dCBiYWNrIHRvIGEgd29yZCBib3VuZGFyeTogYSByYXcgc2xpY2UgZW5kcyBkZXNjcmlwdGlvbnMgbWlkLXdvcmQgKGDigKYgdGhlIHN0cmluZyBtb2R1bGUgaXMgb2JgKS5cbiAgLy8gVGhhdCBmcmFnbWVudCBpcyB3aGF0IHJlYWRlcnMgc2VlIG9uIHRoZSBPRyBjYXJkIGFuZCBpbiBzZWFyY2ggcmVzdWx0cy5cbiAgY29uc3QgY2xpcHBlZCA9IHBsYWluLnNsaWNlKDAsIE9HX0RFU0NSSVBUSU9OX01BWF9MRU5HVEggLSAxKTtcbiAgY29uc3QgbGFzdFNwYWNlSW5kZXggPSBjbGlwcGVkLmxhc3RJbmRleE9mKCcgJyk7XG4gIGNvbnN0IHRydW5jYXRlZCA9IGxhc3RTcGFjZUluZGV4ID4gMCA/IGNsaXBwZWQuc2xpY2UoMCwgbGFzdFNwYWNlSW5kZXgpIDogY2xpcHBlZDtcbiAgcmV0dXJuIGAke3RydW5jYXRlZC5yZXBsYWNlKC9bLDs6Llxcc10rJC8sICcnKX3igKZgO1xufVxuXG5mdW5jdGlvbiBlc2NhcGVNZHhQcm9zZUNoYXJzKGNodW5rOiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gY2h1bmsucmVwbGFjZUFsbCgvWzx7fV0vZywgKGNoYXIpID0+IGBcXFxcJHtjaGFyfWApO1xufVxuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFNQSxxQkFHTztBQUNQLHNCQUFzQjtBQUN0Qix1QkFBd0I7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
285
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9kb2NzLXNpdGUvYXBpLWRvYy10ZXh0LXV0aWxzLnRzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGZpbGVcbiAqXG4gKiBUZXh0L21hcmtkb3duL2VzY2FwaW5nIHV0aWxpdGllcyBhbmQgaWRlbnRpZmllciBoZWxwZXJzIGZvciB0aGUgQVBJIGRvY3VtZW50YXRpb24gZ2VuZXJhdG9yLlxuICovXG5cbmltcG9ydCB7XG4gIGdldE1hbmRhdG9yeU5hbWVkR3JvdXAsXG4gIGdldE9wdGlvbmFsTmFtZWRHcm91cFxufSBmcm9tICdAbW5hb3Vtb3YvdHlwZXNjcmlwdC1saWIvcmVnLWV4cCc7XG5pbXBvcnQgeyBta2RpciB9IGZyb20gJ25vZGU6ZnMvcHJvbWlzZXMnO1xuaW1wb3J0IHsgZGlybmFtZSB9IGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCB0eXBlIHtcbiAgTWFya2Rvd25TZWdtZW50LFxuICBNZW1iZXJJbmZvLFxuICBUeXBlSW5mb1xufSBmcm9tICcuL2FwaS1kb2MtdHlwZXMudHMnO1xuXG5pbXBvcnQgeyBFVkVOVF9NRVRIT0RTIH0gZnJvbSAnLi9hcGktZG9jLWNvbnN0YW50cy50cyc7XG5pbXBvcnQgeyByZWdpc3RlclBhY2thZ2VEZWNsYXJhdGlvbiB9IGZyb20gJy4vYXBpLWRvYy1wYWNrYWdlLXNpdGVzLnRzJztcbmltcG9ydCB7IHRvUm91dGVTZWdtZW50IH0gZnJvbSAnLi9hcGktZG9jLXJvdXRlLXNlZ21lbnRzLnRzJztcbmltcG9ydCB7IGdldEFwaURvY1NldHRpbmdzIH0gZnJvbSAnLi9hcGktZG9jLXNldHRpbmdzLnRzJztcblxuaW50ZXJmYWNlIE9wZW5GZW5jZSB7XG4gIHJlYWRvbmx5IGNsb3NlUmU6IFJlZ0V4cDtcbiAgcmVhZG9ubHkgbGFuZzogc3RyaW5nO1xufVxuXG4vKipcbiAqIENvbXB1dGUgYW4gb3ZlcmxvYWQga2V5IGZvciBtZXRob2RzIHdpdGggZGlzdGluZ3Vpc2hpbmcgZmlyc3QgcGFyYW0gKGUuZy4gb24oJ2NoYW5nZWQnLC4uLikpXG4gKlxuICogQHBhcmFtIG1ldGhvZCAtIFRoZSBtZXRob2QuXG4gKiBAcmV0dXJucyBUaGUgb3ZlcmxvYWQga2V5LlxuICovXG5leHBvcnQgZnVuY3Rpb24gY29tcHV0ZU92ZXJsb2FkS2V5KG1ldGhvZDogTWVtYmVySW5mbyk6IHN0cmluZyB7XG4gIGlmIChFVkVOVF9NRVRIT0RTLmhhcyhtZXRob2QubmFtZSkgJiYgbWV0aG9kLnBhcmFtZXRlcnMubGVuZ3RoID4gMCkge1xuICAgIGNvbnN0IGZpcnN0UGFyYW1ldGVyID0gbWV0aG9kLnBhcmFtZXRlcnNbMF07XG4gICAgaWYgKGZpcnN0UGFyYW1ldGVyPy50eXBlLnN0YXJ0c1dpdGgoJ1wiJykgfHwgZmlyc3RQYXJhbWV0ZXI/LnR5cGUuc3RhcnRzV2l0aCgnXFwnJykpIHtcbiAgICAgIGNvbnN0IG5vcm1hbGl6ZWRUeXBlID0gZmlyc3RQYXJhbWV0ZXIudHlwZS5yZXBsYWNlQWxsKCdcIicsICdcXCcnKTtcbiAgICAgIHJldHVybiBgJHttZXRob2QubmFtZX0oJHtub3JtYWxpemVkVHlwZX0pYDtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIG1ldGhvZC5uYW1lO1xufVxuXG4vKipcbiAqIENyZWF0ZXMgdGhlIGZvbGRlciBhIGZpbGUgaXMgYWJvdXQgdG8gYmUgd3JpdHRlbiB0by5cbiAqXG4gKiBAcGFyYW0gZmlsZVBhdGggLSBUaGUgcGF0aCBvZiB0aGUgZmlsZSBhYm91dCB0byBiZSB3cml0dGVuLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZW5zdXJlRGlyZWN0b3J5KGZpbGVQYXRoOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgYXdhaXQgbWtkaXIoZGlybmFtZShmaWxlUGF0aCksIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xufVxuXG4vKipcbiAqIEVzY2FwZSB0ZXh0IGZvciB1c2UgaW5zaWRlIGEgSlMgc3RyaW5nIHdpdGhpbiBhIEpTWCBleHByZXNzaW9uOiB7Li4ue2tleTogXCIuLi5cIn19XG4gKlxuICogQHBhcmFtIHRleHQgLSBUaGUgdGV4dCB0byBlc2NhcGUuXG4gKiBAcmV0dXJucyBUaGUgZXNjYXBlZCB0ZXh0LlxuICovXG5leHBvcnQgZnVuY3Rpb24gZXNjYXBlSnNTdHJpbmcodGV4dDogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIHRleHQucmVwbGFjZUFsbCgnXFxcXCcsICdcXFxcXFxcXCcpLnJlcGxhY2VBbGwoJ1wiJywgU3RyaW5nLnJhd2BcXFwiYCkucmVwbGFjZUFsbCgnXFxuJywgJyAnKTtcbn1cblxuLyoqXG4gKiBFc2NhcGUgdGV4dCBmb3IgdXNlIGluc2lkZSBhIEpTWCBhdHRyaWJ1dGU6IGF0dHI9XCIuLi5cIiAoTURYIHVzZXMgSFRNTC1zdHlsZSBwYXJzaW5nKVxuICpcbiAqIEBwYXJhbSB0ZXh0IC0gVGhlIHRleHQgdG8gZXNjYXBlLlxuICogQHJldHVybnMgVGhlIGVzY2FwZWQgdGV4dC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGVzY2FwZUpzeEF0dHJpYnV0ZSh0ZXh0OiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gdGV4dC5yZXBsYWNlQWxsKCcmJywgJyZhbXA7JykucmVwbGFjZUFsbCgnXCInLCAnJnF1b3Q7JykucmVwbGFjZUFsbCgnXFxuJywgJyAnKTtcbn1cblxuLyoqXG4gKiBFc2NhcGUgdGV4dCBmb3IgYSBtYXJrZG93biB0YWJsZSBjZWxsLlxuICpcbiAqIEBwYXJhbSB0ZXh0IC0gVGhlIHRleHQgdG8gZXNjYXBlLlxuICogQHJldHVybnMgVGhlIGVzY2FwZWQgdGV4dC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGVzY2FwZU1hcmtkb3duKHRleHQ6IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiB0ZXh0LnJlcGxhY2VBbGwoJ3wnLCBTdHJpbmcucmF3YFxcfGApLnJlcGxhY2VBbGwoJ1xcbicsICcgJykucmVwbGFjZUFsbCgneycsIFN0cmluZy5yYXdgXFx7YCkucmVwbGFjZUFsbCgnfScsIFN0cmluZy5yYXdgXFx9YCk7XG59XG5cbi8qKlxuICogRXNjYXBlIGFuZ2xlIGJyYWNrZXRzIHNvIE1EWCBkb2VzIG5vdCByZWFkIHRoZW0gYXMgSlNYLlxuICpcbiAqIEBwYXJhbSB0ZXh0IC0gVGhlIHRleHQgdG8gZXNjYXBlLlxuICogQHJldHVybnMgVGhlIGVzY2FwZWQgdGV4dC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGVzY2FwZU1keEFuZ2xlQnJhY2tldHModGV4dDogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIHRleHQucmVwbGFjZUFsbCgnPCcsIFN0cmluZy5yYXdgXFw8YCkucmVwbGFjZUFsbCgnPicsIFN0cmluZy5yYXdgXFw+YCk7XG59XG5cbi8qKlxuICogRXNjYXBlIGN1cmx5IGJyYWNlcyBpbiBNRFggbWFya2Rvd24gY29udGVudCB0byBwcmV2ZW50IEpTWCBleHByZXNzaW9uIHBhcnNpbmdcbiAqXG4gKiBAcGFyYW0gdGV4dCAtIFRoZSB0ZXh0IHRvIGVzY2FwZS5cbiAqIEByZXR1cm5zIFRoZSBlc2NhcGVkIHRleHQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBlc2NhcGVNZHhCcmFjZXModGV4dDogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIHRleHQucmVwbGFjZUFsbCgneycsIFN0cmluZy5yYXdgXFx7YCkucmVwbGFjZUFsbCgnfScsIFN0cmluZy5yYXdgXFx9YCk7XG59XG5cbi8qKlxuICogRXNjYXBlIHRleHQgZm9yIGEgZG91YmxlLXF1b3RlZCBZQU1MIHZhbHVlLlxuICpcbiAqIEBwYXJhbSB0ZXh0IC0gVGhlIHRleHQgdG8gZXNjYXBlLlxuICogQHJldHVybnMgVGhlIGVzY2FwZWQgdGV4dC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGVzY2FwZVlhbWwodGV4dDogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIHRleHQucmVwbGFjZUFsbCgnXCInLCBTdHJpbmcucmF3YFxcXCJgKTtcbn1cblxuY29uc3QgU0lHTkFUVVJFX01BWF9MRU5HVEggPSAxNjA7XG5jb25zdCBJTVBPUlRfUVVBTElGSUVSX1JFR19FWFAgPSAvaW1wb3J0XFwoKD88UXVvdGU+W1wiJ10pW15cIiddK1xcazxRdW90ZT5cXClcXC4vZztcbmNvbnN0IElNUE9SVF9UWVBFX1JFR19FWFAgPSAvaW1wb3J0XFwoKD88UXVvdGU+W1wiJ10pKD88UGF0aD5bXlwiJ10rKVxcazxRdW90ZT5cXClcXC4oPzxOYW1lPltBLVphLXpfJF1bXFx3JF0qKS9nO1xuXG4vKipcbiAqIEVzY2FwZSBNRFgtdW5zYWZlIGNoYXJhY3RlcnMgKGA8YCwgYHtgLCBgfWApIGluIHByb3NlIHRleHQsIHdoaWxlIGxlYXZpbmcgaW5saW5lIGNvZGUgc3BhbnNcbiAqIChgYCBgY29kZWAgYGApIGFuZCBtYXJrZG93biBsaW5rcyAoYFt0ZXh0XSh1cmwpYCkgdW50b3VjaGVkLiBNRFggcGFyc2VzIGJhcmUgYDxgL2B7YCBpbiBwcm9zZSBhc1xuICogSlNYL2V4cHJlc3Npb25zLCBzbyB0aGV5IG11c3QgYmUgYmFja3NsYXNoLWVzY2FwZWQgdG8gcmVuZGVyIGFzIGxpdGVyYWwgdGV4dC5cbiAqXG4gKiBAcGFyYW0gdGV4dCAtIFRoZSBwcm9zZSB0byBlc2NhcGUuXG4gKiBAcmV0dXJucyBUaGUgZXNjYXBlZCBwcm9zZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGVzY2FwZU1keFByb3NlKHRleHQ6IHN0cmluZyk6IHN0cmluZyB7XG4gIGNvbnN0IHByb3RlY3RlZFBhdHRlcm4gPSAvYFteYF0qYHxcXFtbXlxcXV0qXFxdXFwoW14pXSpcXCkvZztcbiAgbGV0IHJlc3VsdCA9ICcnO1xuICBsZXQgbGFzdEluZGV4ID0gMDtcbiAgZm9yIChjb25zdCBtYXRjaCBvZiB0ZXh0Lm1hdGNoQWxsKHByb3RlY3RlZFBhdHRlcm4pKSB7XG4gICAgY29uc3QgaW5kZXggPSBtYXRjaC5pbmRleDtcbiAgICByZXN1bHQgKz0gZXNjYXBlTWR4UHJvc2VDaGFycyh0ZXh0LnNsaWNlKGxhc3RJbmRleCwgaW5kZXgpKTtcbiAgICByZXN1bHQgKz0gbWF0Y2hbMF07XG4gICAgbGFzdEluZGV4ID0gaW5kZXggKyBtYXRjaFswXS5sZW5ndGg7XG4gIH1cbiAgcmVzdWx0ICs9IGVzY2FwZU1keFByb3NlQ2hhcnModGV4dC5zbGljZShsYXN0SW5kZXgpKTtcbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuLyoqXG4gKiBDb2xsYXBzZSBzaW5nbGUgbmV3bGluZXMgd2l0aGluIHBhcmFncmFwaHMgdG8gc3BhY2VzLCBwcmVzZXJ2ZSBkb3VibGUgbmV3bGluZXMgYXMgcGFyYWdyYXBoIGJyZWFrcy5cbiAqIEZlbmNlZCBjb2RlIGJsb2NrcyAoYmFja3RpY2sgb3IgdGlsZGUgZmVuY2VzKSBhcmUgcHJlc2VydmVkIHZlcmJhdGltIOKAlCB0aGVpciBpbnRlcm5hbCBuZXdsaW5lcyBhcmUgTk9UIGZvbGRlZCxcbiAqIHNvIGVtYmVkZGVkIGNvZGUgc3Vydml2ZXMgdG8gYmUgcmUtZW1pdHRlZCBhcyBhIHJlYWwgY29kZSBmZW5jZSBkb3duc3RyZWFtLlxuICpcbiAqIEBwYXJhbSB0ZXh0IC0gVGhlIHRleHQuXG4gKiBAcmV0dXJucyBUaGUgZm9sZGVkIHRleHQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBmb2xkVHNEb2NQYXJhZ3JhcGhzKHRleHQ6IHN0cmluZyk6IHN0cmluZyB7XG4gIGNvbnN0IHNlZ21lbnRzID0gc2VnbWVudE1hcmtkb3duKHRleHQpO1xuICByZXR1cm4gc2VnbWVudHNcbiAgICAubWFwKChzZWcpID0+IHtcbiAgICAgIHJldHVybiBzZWcudHlwZSA9PT0gJ2NvZGUnXG4gICAgICAgID8gYFxcYFxcYFxcYCR7c2VnLmxhbmd9XFxuJHtzZWcudGV4dH1cXG5cXGBcXGBcXGBgXG4gICAgICAgIDogc2VnLnRleHRcbiAgICAgICAgICAuc3BsaXQoL1xcbnsyLH0vKVxuICAgICAgICAgIC5tYXAoKHBhcmFncmFwaCkgPT4gcGFyYWdyYXBoLnJlcGxhY2VBbGwoJ1xcbicsICcgJykpXG4gICAgICAgICAgLmpvaW4oJ1xcblxcbicpO1xuICAgIH0pXG4gICAgLm1hcCgoc2VnbWVudCkgPT4gc2VnbWVudC50cmltKCkpXG4gICAgLmZpbHRlcihCb29sZWFuKVxuICAgIC5qb2luKCdcXG5cXG4nKTtcbn1cblxuLyoqXG4gKiBUaGUgdHlwZSdzIG5hbWUgd2l0aCBpdHMgdHlwZSBwYXJhbWV0ZXJzLCB3aXRob3V0IHRoZWlyIGNvbnN0cmFpbnRzLlxuICpcbiAqIEBwYXJhbSBuYW1lIC0gVGhlIHR5cGUncyBuYW1lLlxuICogQHBhcmFtIGluZm8gLSBUaGUgZG9jdW1lbnRlZCB0eXBlLlxuICogQHJldHVybnMgVGhlIG5hbWUgd2l0aCBpdHMgYmFyZSB0eXBlIHBhcmFtZXRlcnMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXREaXNwbGF5TmFtZShuYW1lOiBzdHJpbmcsIGluZm86IFR5cGVJbmZvKTogc3RyaW5nIHtcbiAgaWYgKGluZm8udHlwZVBhcmFtZXRlcnMubGVuZ3RoID09PSAwKSB7XG4gICAgcmV0dXJuIG5hbWU7XG4gIH1cbiAgY29uc3QgYmFyZVBhcmFtcyA9IGluZm8udHlwZVBhcmFtZXRlcnMubWFwKCh0cCkgPT4gdHAucmVwbGFjZSgvXFxzK2V4dGVuZHNcXHMrLiokLywgJycpKTtcbiAgcmV0dXJuIGAke25hbWV9PCR7YmFyZVBhcmFtcy5qb2luKCcsICcpfT5gO1xufVxuXG4vKipcbiAqIEVtaXQgdGhlIGltcG9ydCBzdGF0ZW1lbnQgZm9yIGEgZG9jdW1lbnRlZCBleHBvcnQuXG4gKlxuICogVGhlIHN1YnBhdGggZXF1YWxzIHRoZSB0eXBlJ3MgbmFtZXNwYWNlIChpdHMgc291cmNlIHBhdGggcmVsYXRpdmUgdG8gYHNyY2ApLCBzbyBgc3JjL3N0cmluZy50c2Agb2ZcbiAqIGBAbW5hb3Vtb3YvdHlwZXNjcmlwdC1saWJgIGlzIGBAbW5hb3Vtb3YvdHlwZXNjcmlwdC1saWIvc3RyaW5nYC5cbiAqXG4gKiBJbnRlcmZhY2VzIC8gdHlwZSBhbGlhc2VzIC8gZW51bXMgYXJlIGltcG9ydGVkIHdpdGggYGltcG9ydCB0eXBlYDsgY2xhc3NlcyAvIGZ1bmN0aW9ucyAvXG4gKiB2YXJpYWJsZXMgd2l0aCBhIHZhbHVlIGBpbXBvcnRgLlxuICpcbiAqIEBwYXJhbSBpbmZvIC0gVGhlIGRvY3VtZW50ZWQgdHlwZS5cbiAqIEByZXR1cm5zIFRoZSBpbXBvcnQgc3RhdGVtZW50LlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0SW1wb3J0U3RhdGVtZW50KGluZm86IFR5cGVJbmZvKTogc3RyaW5nIHtcbiAgY29uc3QgaXNUeXBlT25seSA9IFsnZW51bScsICdpbnRlcmZhY2UnLCAndHlwZSddLmluY2x1ZGVzKGluZm8ua2luZCk7XG4gIGNvbnN0IGltcG9ydEtleXdvcmQgPSBpc1R5cGVPbmx5ID8gJ2ltcG9ydCB0eXBlJyA6ICdpbXBvcnQnO1xuICByZXR1cm4gYCR7aW1wb3J0S2V5d29yZH0geyAke2luZm8ubmFtZX0gfSBmcm9tICcke2dldEFwaURvY1NldHRpbmdzKCkucGFja2FnZU5hbWV9LyR7aW5mby5uYW1lc3BhY2V9JztgO1xufVxuXG4vKipcbiAqIFRoZSBmb2xkZXIgYSBuYW1lc3BhY2UncyBwYWdlcyBhcmUgd3JpdHRlbiB0by5cbiAqXG4gKiBAcGFyYW0gbmFtZXNwYWNlIC0gVGhlIHR5cGUncyBuYW1lc3BhY2UuXG4gKiBAcmV0dXJucyBUaGUgZm9sZGVyLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0TmFtZXNwYWNlRGlyZWN0b3J5KG5hbWVzcGFjZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIG5hbWVzcGFjZTtcbn1cblxuLyoqXG4gKiBTYW5pdGl6ZSBhIG1lbWJlciBuYW1lIGZvciB1c2UgaW4gYSBjYXNlLVBSRVNFUlZFRCBVUkwvcm91dGUgc2VnbWVudCAoZS5nLiBgc2hvd05vdGljZWApLlxuICpcbiAqIEBwYXJhbSBuYW1lIC0gVGhlIG1lbWJlcidzIG5hbWUuXG4gKiBAcmV0dXJucyBUaGUgY2FzZS1wcmVzZXJ2ZWQgc2VnbWVudC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG1lbWJlclJvdXRlU2VnbWVudChuYW1lOiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gc2x1Z2lmeU1lbWJlck5hbWUobmFtZSk7XG59XG5cbi8qKlxuICogU2FuaXRpemUgYSBtZW1iZXIgbmFtZSBmb3IgdXNlIGFzIGFuIG9uLWRpc2sgRklMRU5BTUUgKGxvd2VyY2FzZWQsIGNvbGxpc2lvbi1zYWZlKS5cbiAqXG4gKiBAcGFyYW0gbmFtZSAtIFRoZSBtZW1iZXIncyBuYW1lLlxuICogQHJldHVybnMgVGhlIGxvd2VyY2FzZWQgZmlsZSBuYW1lIHNlZ21lbnQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBtZW1iZXJTbHVnKG5hbWU6IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiB0b1JvdXRlU2VnbWVudChzbHVnaWZ5TWVtYmVyTmFtZShuYW1lKSk7XG59XG5cbi8qKlxuICogU2x1Z2lmeSBhbiBvdmVybG9hZCBrZXkgZm9yIGEgY2FzZS1QUkVTRVJWRUQgVVJML3JvdXRlIHNlZ21lbnQ6IG9uKFwiY2hhbmdlZFwiKSAtPiBvbi1jaGFuZ2VkLlxuICpcbiAqIEBwYXJhbSBvdmVybG9hZEtleSAtIFRoZSBvdmVybG9hZCBrZXksIGUuZy4gYG9uKCdjaGFuZ2VkJylgLlxuICogQHJldHVybnMgVGhlIGNhc2UtcHJlc2VydmVkIHNlZ21lbnQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBvdmVybG9hZFJvdXRlU2VnbWVudChvdmVybG9hZEtleTogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIHNsdWdpZnlPdmVybG9hZEtleShvdmVybG9hZEtleSk7XG59XG5cbi8qKlxuICogU2x1Z2lmeSBhbiBvdmVybG9hZCBrZXkgZm9yIGFuIG9uLWRpc2sgRklMRU5BTUU6IG9uKFwiY2hhbmdlZFwiKSAtPiBvbi1jaGFuZ2VkIChsb3dlcmNhc2VkKS5cbiAqXG4gKiBAcGFyYW0gb3ZlcmxvYWRLZXkgLSBUaGUgb3ZlcmxvYWQga2V5LCBlLmcuIGBvbignY2hhbmdlZCcpYC5cbiAqIEByZXR1cm5zIFRoZSBsb3dlcmNhc2VkIGZpbGUgbmFtZSBzZWdtZW50LlxuICovXG5leHBvcnQgZnVuY3Rpb24gb3ZlcmxvYWRTbHVnKG92ZXJsb2FkS2V5OiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gdG9Sb3V0ZVNlZ21lbnQoc2x1Z2lmeU92ZXJsb2FkS2V5KG92ZXJsb2FkS2V5KSk7XG59XG5cbi8qKlxuICogUmVwbGFjZSBldmVyeSBtYXRjaCBvZiBhIGdsb2JhbCByZWd1bGFyIGV4cHJlc3Npb24gd2l0aCB3aGF0IGEgcmVwbGFjZXIgYnVpbGRzIGZyb20gdGhlIG1hdGNoLiBUaGUgdHlwZWRcbiAqIGNvdW50ZXJwYXJ0IG9mIGBTdHJpbmcucHJvdG90eXBlLnJlcGxhY2VBbGxgIHdpdGggYSBjYWxsYmFjaywgd2hvc2UgYXJndW1lbnRzIGFyZSB0eXBlZCBvbmx5IHBvc2l0aW9uYWxseS5cbiAqXG4gKiBAcGFyYW0gdGV4dCAtIFRoZSB0ZXh0LlxuICogQHBhcmFtIHJlZ0V4cCAtIFRoZSByZWd1bGFyIGV4cHJlc3Npb247IGl0IG11c3QgY2FycnkgdGhlIGBnYCBmbGFnLlxuICogQHBhcmFtIHJlcGxhY2VyIC0gQnVpbGRzIHRoZSByZXBsYWNlbWVudCBvZiBvbmUgbWF0Y2guXG4gKiBAcmV0dXJucyBUaGUgdGV4dCB3aXRoIGV2ZXJ5IG1hdGNoIHJlcGxhY2VkLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVwbGFjZVJlZ0V4cE1hdGNoZXModGV4dDogc3RyaW5nLCByZWdFeHA6IFJlZ0V4cCwgcmVwbGFjZXI6IChtYXRjaDogUmVnRXhwTWF0Y2hBcnJheSkgPT4gc3RyaW5nKTogc3RyaW5nIHtcbiAgbGV0IHJlc3VsdCA9ICcnO1xuICBsZXQgbGFzdEluZGV4ID0gMDtcbiAgZm9yIChjb25zdCBtYXRjaCBvZiB0ZXh0Lm1hdGNoQWxsKHJlZ0V4cCkpIHtcbiAgICByZXN1bHQgKz0gdGV4dC5zbGljZShsYXN0SW5kZXgsIG1hdGNoLmluZGV4KSArIHJlcGxhY2VyKG1hdGNoKTtcbiAgICBsYXN0SW5kZXggPSBtYXRjaC5pbmRleCArIG1hdGNoWzBdLmxlbmd0aDtcbiAgfVxuICByZXR1cm4gcmVzdWx0ICsgdGV4dC5zbGljZShsYXN0SW5kZXgpO1xufVxuXG4vKipcbiAqIFNwbGl0IG1hcmtkb3duIHRleHQgaW50byBhbiBvcmRlcmVkIGxpc3Qgb2YgcHJvc2UgYW5kIGZlbmNlZC1jb2RlIHNlZ21lbnRzLlxuICogQSBmZW5jZWQtY29kZSBzZWdtZW50IGlzIGRlbGltaXRlZCBieSBhIGxpbmUgb2YgMysgYmFja3RpY2tzIG9yIHRpbGRlczsgaXRzIGNvbnRlbnQgaXMgY2FwdHVyZWRcbiAqIHJhdyAobmV2ZXIgZXNjYXBlZCkgc28gaXQgY2FuIGJlIHJlLWVtaXR0ZWQgYXMgYSBsaXRlcmFsIE1EWCBjb2RlIGZlbmNlLlxuICpcbiAqIEBwYXJhbSB0ZXh0IC0gVGhlIHRleHQuXG4gKiBAcmV0dXJucyBUaGUgc2VnbWVudHMsIGluIG9yZGVyLlxuICovXG5leHBvcnQgZnVuY3Rpb24gc2VnbWVudE1hcmtkb3duKHRleHQ6IHN0cmluZyk6IE1hcmtkb3duU2VnbWVudFtdIHtcbiAgY29uc3QgbGluZXMgPSB0ZXh0LnNwbGl0KCdcXG4nKTtcbiAgY29uc3Qgc2VnbWVudHM6IE1hcmtkb3duU2VnbWVudFtdID0gW107XG4gIGxldCBwcm9zZUJ1ZmZlcjogc3RyaW5nW10gPSBbXTtcbiAgbGV0IGNvZGVMaW5lczogc3RyaW5nW10gPSBbXTtcbiAgbGV0IG9wZW5GZW5jZTogbnVsbCB8IE9wZW5GZW5jZSA9IG51bGw7XG4gIGZvciAoY29uc3QgbGluZSBvZiBsaW5lcykge1xuICAgIGlmIChvcGVuRmVuY2UpIHtcbiAgICAgIGlmIChvcGVuRmVuY2UuY2xvc2VSZS50ZXN0KGxpbmUpKSB7XG4gICAgICAgIHNlZ21lbnRzLnB1c2goeyBsYW5nOiBvcGVuRmVuY2UubGFuZywgdGV4dDogY29kZUxpbmVzLmpvaW4oJ1xcbicpLCB0eXBlOiAnY29kZScgfSk7XG4gICAgICAgIG9wZW5GZW5jZSA9IG51bGw7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb2RlTGluZXMucHVzaChsaW5lKTtcbiAgICAgIH1cbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIGNvbnN0IG9wZW5NYXRjaCA9IC9eXFxzKig/PGZlbmNlPig/PGZlbmNlQ2hhcj5bYH5dKVxcazxmZW5jZUNoYXI+ezIsfSkoPzxsYW5nPi4qKSQvLmV4ZWMobGluZSk7XG4gICAgaWYgKG9wZW5NYXRjaCkge1xuICAgICAgY29uc3QgZmVuY2VDaGFycyA9IGdldE1hbmRhdG9yeU5hbWVkR3JvdXAob3Blbk1hdGNoLCAnZmVuY2UnKTtcbiAgICAgIGNvbnN0IGZlbmNlQ2hhciA9IGdldE1hbmRhdG9yeU5hbWVkR3JvdXAob3Blbk1hdGNoLCAnZmVuY2VDaGFyJyk7XG4gICAgICBmbHVzaFByb3NlKCk7XG4gICAgICBjb2RlTGluZXMgPSBbXTtcbiAgICAgIG9wZW5GZW5jZSA9IHtcbiAgICAgICAgY2xvc2VSZTogbmV3IFJlZ0V4cChgXlxcXFxzKlxcXFwke2ZlbmNlQ2hhcn17JHtTdHJpbmcoZmVuY2VDaGFycy5sZW5ndGgpfSx9XFxcXHMqJGApLFxuICAgICAgICBsYW5nOiBnZXRNYW5kYXRvcnlOYW1lZEdyb3VwKG9wZW5NYXRjaCwgJ2xhbmcnKS50cmltKClcbiAgICAgIH07XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgcHJvc2VCdWZmZXIucHVzaChsaW5lKTtcbiAgfVxuICAvLyBBbiB1bmNsb3NlZCBmZW5jZSBydW5zIHRvIHRoZSBlbmQgb2YgdGhlIHRleHQuXG4gIGlmIChvcGVuRmVuY2UpIHtcbiAgICBzZWdtZW50cy5wdXNoKHsgbGFuZzogb3BlbkZlbmNlLmxhbmcsIHRleHQ6IGNvZGVMaW5lcy5qb2luKCdcXG4nKSwgdHlwZTogJ2NvZGUnIH0pO1xuICB9XG4gIGZsdXNoUHJvc2UoKTtcbiAgcmV0dXJuIHNlZ21lbnRzO1xuXG4gIGZ1bmN0aW9uIGZsdXNoUHJvc2UoKTogdm9pZCB7XG4gICAgaWYgKHByb3NlQnVmZmVyLmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHNlZ21lbnRzLnB1c2goeyB0ZXh0OiBwcm9zZUJ1ZmZlci5qb2luKCdcXG4nKSwgdHlwZTogJ3Byb3NlJyB9KTtcbiAgICBwcm9zZUJ1ZmZlciA9IFtdO1xuICB9XG59XG5cbi8qKlxuICogU3RyaXAgdGhlIGBpbXBvcnQoXCLigKZcIilgIHF1YWxpZmllcnMgdHMtbW9ycGggcHJpbnRzIGJlZm9yZSBhIHR5cGUgdGhhdCBpcyBub3QgaW4gc2NvcGUsIHJlY29yZGluZyBlYWNoIG9uZSdzXG4gKiBkZWNsYXJhdGlvbiBmaWxlIGZpcnN0LCBzaW5jZSBpdCBpcyB0aGUgb25lIHBsYWNlIGEgcHJpbnRlZCB0eXBlIG5hbWVzIHdoZXJlIGl0IHdhcyBkZWNsYXJlZC5cbiAqXG4gKiBAcGFyYW0gdHlwZVRleHQgLSBUaGUgcHJpbnRlZCB0eXBlLlxuICogQHJldHVybnMgVGhlIHR5cGUgd2l0aG91dCBpdHMgaW1wb3J0IHF1YWxpZmllcnMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzaW1wbGlmeVR5cGUodHlwZVRleHQ6IHN0cmluZyk6IHN0cmluZyB7XG4gIGZvciAoY29uc3QgbWF0Y2ggb2YgdHlwZVRleHQubWF0Y2hBbGwoSU1QT1JUX1RZUEVfUkVHX0VYUCkpIHtcbiAgICByZWdpc3RlclBhY2thZ2VEZWNsYXJhdGlvbihnZXRNYW5kYXRvcnlOYW1lZEdyb3VwKG1hdGNoLCAnTmFtZScpLCBnZXRNYW5kYXRvcnlOYW1lZEdyb3VwKG1hdGNoLCAnUGF0aCcpKTtcbiAgfVxuXG4gIHJldHVybiB0eXBlVGV4dC5yZXBsYWNlQWxsKElNUE9SVF9RVUFMSUZJRVJfUkVHX0VYUCwgJycpO1xufVxuXG4vKipcbiAqIE5vcm1hbGl6ZSBhIGNvZGUgc2lnbmF0dXJlIGZvciB0aGUgYHNpZ25hdHVyZTpgIGZyb250bWF0dGVyIC8gT0cgY2FyZDogY29sbGFwc2Ugd2hpdGVzcGFjZSB0b1xuICogc2luZ2xlIHNwYWNlcyBhbmQgdHJ1bmNhdGUgdG8gYSBjYXJkLWZyaWVuZGx5IGxlbmd0aCB3aXRoIGFuIGVsbGlwc2lzLlxuICpcbiAqIEBwYXJhbSBzaWduYXR1cmUgLSBUaGUgc2lnbmF0dXJlLlxuICogQHJldHVybnMgVGhlIG5vcm1hbGl6ZWQgc2lnbmF0dXJlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gdHJ1bmNhdGVTaWduYXR1cmUoc2lnbmF0dXJlOiBzdHJpbmcpOiBzdHJpbmcge1xuICBjb25zdCBjb2xsYXBzZWQgPSBzaWduYXR1cmUucmVwbGFjZUFsbCgvXFxzKy9nLCAnICcpLnRyaW0oKTtcbiAgcmV0dXJuIGNvbGxhcHNlZC5sZW5ndGggPD0gU0lHTkFUVVJFX01BWF9MRU5HVEggPyBjb2xsYXBzZWQgOiBgJHtjb2xsYXBzZWQuc2xpY2UoMCwgU0lHTkFUVVJFX01BWF9MRU5HVEggLSAxKS50cmltRW5kKCl94oCmYDtcbn1cblxuZnVuY3Rpb24gc2x1Z2lmeU1lbWJlck5hbWUobmFtZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgY29uc3QgY2xlYW5lZCA9IG5hbWVcbiAgICAucmVwbGFjZUFsbCgvXltcIiddfFtcIiddJC9nLCAnJylcbiAgICAucmVwbGFjZUFsbCgvW15hLXpBLVowLTldL2csICctJylcbiAgICAucmVwbGFjZUFsbCgvLSsvZywgJy0nKVxuICAgIC5yZXBsYWNlQWxsKC9eLXwtJC9nLCAnJyk7XG4gIC8vIEEgbWVtYmVyIGxpdGVyYWxseSBuYW1lZCBgaW5kZXhgIHdvdWxkIHdyaXRlIGBpbmRleC5tZHhgLCBjb2xsaWRpbmcgd2l0aCB0aGUgdHlwZS1vdmVydmlld1xuICAvLyBgaW5kZXgubWR4YCBpbiB0aGUgc2FtZSBkaXJlY3RvcnkgKG9uZSBzaWxlbnRseSBvdmVyd3JpdGVzIHRoZSBvdGhlciwgNDA0LWluZyB0aGUgbG9zZXIpLlxuICByZXR1cm4gY2xlYW5lZCA9PT0gJ2luZGV4JyA/ICdpbmRleC1tZW1iZXInIDogKGNsZWFuZWQgfHwgJ3VubmFtZWQnKTtcbn1cblxuZnVuY3Rpb24gc2x1Z2lmeU92ZXJsb2FkS2V5KG92ZXJsb2FkS2V5OiBzdHJpbmcpOiBzdHJpbmcge1xuICBjb25zdCBzbHVnID0gb3ZlcmxvYWRLZXlcbiAgICAucmVwbGFjZUFsbCgvW1wiJygpXS9nLCAnICcpXG4gICAgLnJlcGxhY2VBbGwoL1teYS16QS1aMC05XFxzXS9nLCAnJylcbiAgICAudHJpbSgpXG4gICAgLnJlcGxhY2VBbGwoL1xccysvZywgJy0nKTtcbiAgLy8gQSBtZXRob2QgbmFtZWQgYGluZGV4YCB3b3VsZCB3cml0ZSBgaW5kZXgubWR4YCBvdmVyIHRoZSB0eXBlLW92ZXJ2aWV3IHBhZ2UsIGV4YWN0bHkgYXMgYSBwcm9wZXJ0eSB3b3VsZC5cbiAgcmV0dXJuIHNsdWcgPT09ICdpbmRleCcgPyAnaW5kZXgtbWVtYmVyJyA6IHNsdWc7XG59XG5cbmNvbnN0IE9HX0RFU0NSSVBUSU9OX01BWF9MRU5HVEggPSAxNjA7XG5cbi8qKlxuICogU3RyaXAgbWFya2Rvd24gZm9ybWF0dGluZyB0byBwbGFpbiB0ZXh0IGZvciB1c2UgaW4gbWV0YSBkZXNjcmlwdGlvbnNcbiAqXG4gKiBAcGFyYW0gdGV4dCAtIFRoZSB0ZXh0LlxuICogQHJldHVybnMgVGhlIHBsYWluIHRleHQsIGF0IG1vc3QgMTYwIGNoYXJhY3RlcnMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzdHJpcE1hcmtkb3duKHRleHQ6IHN0cmluZyk6IHN0cmluZyB7XG4gIC8vIEEgYmFyZSBge0BsaW5rIFRhcmdldH1gIHJlYWRzIGFzIGl0cyB0YXJnZXQsIGFzIGByZXNvbHZlTGlua3NgIHJlbmRlcnMgaXQ7IGRyb3BwaW5nIGl0IGxlYXZlcyBhIGhvbGUgaW4gdGhlIHNlbnRlbmNlLlxuICBjb25zdCBwbGFpbiA9IHJlcGxhY2VSZWdFeHBNYXRjaGVzKFxuICAgIHRleHQsXG4gICAgL1xce0BsaW5rXFxzKyg/PHRhcmdldD5bXnx9XSs/KSg/OlxccypcXHxcXHMqKD88ZGlzcGxheT5bXn1dKz8pKT9cXHMqXFx9L2csXG4gICAgKG1hdGNoKSA9PiBnZXRPcHRpb25hbE5hbWVkR3JvdXAobWF0Y2gsICdkaXNwbGF5JykgPz8gZ2V0TWFuZGF0b3J5TmFtZWRHcm91cChtYXRjaCwgJ3RhcmdldCcpXG4gIClcbiAgICAucmVwbGFjZUFsbCgvXFxbKD88dGV4dD5bXlxcXV0rKVxcXVxcKFteKV0rXFwpL2csICckPHRleHQ+JylcbiAgICAucmVwbGFjZUFsbCgvW2AqX35dL2csICcnKVxuICAgIC5yZXBsYWNlQWxsKC9cXHMrL2csICcgJylcbiAgICAudHJpbSgpO1xuXG4gIGlmIChwbGFpbi5sZW5ndGggPD0gT0dfREVTQ1JJUFRJT05fTUFYX0xFTkdUSCkge1xuICAgIHJldHVybiBwbGFpbjtcbiAgfVxuXG4gIC8vIEN1dCBiYWNrIHRvIGEgd29yZCBib3VuZGFyeTogYSByYXcgc2xpY2UgZW5kcyBkZXNjcmlwdGlvbnMgbWlkLXdvcmQgKGDigKYgdGhlIHN0cmluZyBtb2R1bGUgaXMgb2JgKS5cbiAgLy8gVGhhdCBmcmFnbWVudCBpcyB3aGF0IHJlYWRlcnMgc2VlIG9uIHRoZSBPRyBjYXJkIGFuZCBpbiBzZWFyY2ggcmVzdWx0cy5cbiAgY29uc3QgY2xpcHBlZCA9IHBsYWluLnNsaWNlKDAsIE9HX0RFU0NSSVBUSU9OX01BWF9MRU5HVEggLSAxKTtcbiAgY29uc3QgbGFzdFNwYWNlSW5kZXggPSBjbGlwcGVkLmxhc3RJbmRleE9mKCcgJyk7XG4gIGNvbnN0IHRydW5jYXRlZCA9IGxhc3RTcGFjZUluZGV4ID4gMCA/IGNsaXBwZWQuc2xpY2UoMCwgbGFzdFNwYWNlSW5kZXgpIDogY2xpcHBlZDtcbiAgcmV0dXJuIGAke3RydW5jYXRlZC5yZXBsYWNlKC9bLDs6Llxcc10rJC8sICcnKX3igKZgO1xufVxuXG5mdW5jdGlvbiBlc2NhcGVNZHhQcm9zZUNoYXJzKGNodW5rOiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gY2h1bmsucmVwbGFjZUFsbCgvWzx7fV0vZywgKGNoYXIpID0+IGBcXFxcJHtjaGFyfWApO1xufVxuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7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
@@ -0,0 +1,310 @@
1
+ /*
2
+ THIS IS A GENERATED/BUNDLED FILE BY ESBUILD
3
+ if you want to view the source, please visit the github repository of this plugin
4
+ */
5
+ (function () {
6
+ function ensureBrowserProcess() {
7
+ const browserProcess = {
8
+ browser: true,
9
+ cwd() {
10
+ return '/';
11
+ },
12
+ env: {},
13
+ platform: 'android'
14
+ };
15
+
16
+ const existingProcess = globalThis.process;
17
+
18
+ if (!existingProcess) {
19
+ globalThis.process = browserProcess;
20
+ return;
21
+ }
22
+
23
+ if (existingProcess.versions?.node) {
24
+ return;
25
+ }
26
+
27
+ const existingProcessRecord = existingProcess;
28
+
29
+ for (const [key, value] of Object.entries(browserProcess)) {
30
+ existingProcessRecord[key] ??= value;
31
+ }
32
+
33
+ existingProcessRecord['browser'] = true;
34
+ }
35
+
36
+ ensureBrowserProcess();
37
+ })();
38
+
39
+ "use strict";
40
+ var __defProp = Object.defineProperty;
41
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
42
+ var __getOwnPropNames = Object.getOwnPropertyNames;
43
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
44
+ var __export = (target, all) => {
45
+ for (var name in all)
46
+ __defProp(target, name, { get: all[name], enumerable: true });
47
+ };
48
+ var __copyProps = (to, from, except, desc) => {
49
+ if (from && typeof from === "object" || typeof from === "function") {
50
+ for (let key of __getOwnPropNames(from))
51
+ if (!__hasOwnProp.call(to, key) && key !== except)
52
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
53
+ }
54
+ return to;
55
+ };
56
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
57
+ var docs_snippets_exports = {};
58
+ __export(docs_snippets_exports, {
59
+ assertDocsSnippetsCompile: () => assertDocsSnippetsCompile,
60
+ extractDocsSnippets: () => extractDocsSnippets,
61
+ findDocsSnippetProblems: () => findDocsSnippetProblems,
62
+ formatDocsSnippetProblems: () => formatDocsSnippetProblems
63
+ });
64
+ module.exports = __toCommonJS(docs_snippets_exports);
65
+ var import_promises = require('node:fs/promises');
66
+ var import_node_path = require('node:path');
67
+ var import_typescript = require('typescript');
68
+ const CHECKED_LANGUAGES = /* @__PURE__ */ new Map([
69
+ ["javascript", true],
70
+ ["js", true],
71
+ ["ts", false],
72
+ ["typescript", false]
73
+ ]);
74
+ const LINE_AFTER_FENCE_OFFSET = 2;
75
+ const MARKER_REG_EXP = /^<!--\s*snippet-check:\s*(?<kind>[a-z]+)\b(?<text>.*?)-->$/su;
76
+ const DIAGNOSTIC_DECLARED_BUT_VALUE_NEVER_READ = 6133;
77
+ const DIAGNOSTIC_ALL_IMPORTS_UNUSED = 6192;
78
+ const DIAGNOSTIC_DECLARED_BUT_NEVER_USED = 6196;
79
+ const DIAGNOSTIC_ALL_DESTRUCTURED_ELEMENTS_UNUSED = 6198;
80
+ const IGNORED_DIAGNOSTIC_CODES = /* @__PURE__ */ new Set([
81
+ DIAGNOSTIC_ALL_DESTRUCTURED_ELEMENTS_UNUSED,
82
+ DIAGNOSTIC_ALL_IMPORTS_UNUSED,
83
+ DIAGNOSTIC_DECLARED_BUT_NEVER_USED,
84
+ DIAGNOSTIC_DECLARED_BUT_VALUE_NEVER_READ
85
+ ]);
86
+ const DIAGNOSTIC_VARIABLE_IMPLICITLY_ANY = 7005;
87
+ const DIAGNOSTIC_PARAMETER_IMPLICITLY_ANY = 7006;
88
+ const DIAGNOSTIC_MEMBER_IMPLICITLY_ANY = 7008;
89
+ const DIAGNOSTIC_BINDING_ELEMENT_IMPLICITLY_ANY = 7031;
90
+ const DIAGNOSTIC_VARIABLE_IMPLICITLY_ANY_IN_SOME_LOCATIONS = 7034;
91
+ const DIAGNOSTIC_ARROW_FUNCTION_CAPTURES_GLOBAL_THIS = 7041;
92
+ const DIAGNOSTIC_ELEMENT_IMPLICITLY_ANY = 7053;
93
+ const JAVASCRIPT_IGNORED_DIAGNOSTIC_CODES = /* @__PURE__ */ new Set([
94
+ DIAGNOSTIC_ARROW_FUNCTION_CAPTURES_GLOBAL_THIS,
95
+ DIAGNOSTIC_BINDING_ELEMENT_IMPLICITLY_ANY,
96
+ DIAGNOSTIC_ELEMENT_IMPLICITLY_ANY,
97
+ DIAGNOSTIC_MEMBER_IMPLICITLY_ANY,
98
+ DIAGNOSTIC_PARAMETER_IMPLICITLY_ANY,
99
+ DIAGNOSTIC_VARIABLE_IMPLICITLY_ANY,
100
+ DIAGNOSTIC_VARIABLE_IMPLICITLY_ANY_IN_SOME_LOCATIONS
101
+ ]);
102
+ async function assertDocsSnippetsCompile(params) {
103
+ const problems = await findDocsSnippetProblems(params);
104
+ if (problems.length > 0) {
105
+ throw new Error(`${String(problems.length)} problem(s) in the documentation snippets:
106
+ ${formatDocsSnippetProblems(problems)}`);
107
+ }
108
+ }
109
+ function extractDocsSnippets(markdown) {
110
+ const lines = markdown.split(/\r?\n/u);
111
+ const snippets = [];
112
+ let openFence = null;
113
+ let codeLines = [];
114
+ let pendingSkipReason = null;
115
+ let pendingContext = [];
116
+ for (const [index, line] of lines.entries()) {
117
+ if (openFence) {
118
+ const content = stripPrefix(line, openFence.prefix);
119
+ if (content.trimEnd() === openFence.fence) {
120
+ const isJavaScript = CHECKED_LANGUAGES.get(openFence.language);
121
+ if (isJavaScript !== void 0) {
122
+ snippets.push({
123
+ code: codeLines.join("\n"),
124
+ codeStartLine: openFence.startLine,
125
+ context: openFence.context.join("\n"),
126
+ isJavaScript,
127
+ language: openFence.language,
128
+ skipReason: openFence.skipReason
129
+ });
130
+ }
131
+ openFence = null;
132
+ codeLines = [];
133
+ } else {
134
+ codeLines.push(content);
135
+ }
136
+ continue;
137
+ }
138
+ const fenceMatch = /^(?<prefix>(?:\s*>)*\s*)(?<fence>`{3,}|~{3,})(?<language>[\w-]*)/u.exec(line);
139
+ if (fenceMatch?.groups) {
140
+ openFence = {
141
+ context: pendingContext,
142
+ fence: fenceMatch.groups["fence"] ?? "",
143
+ language: (fenceMatch.groups["language"] ?? "").toLowerCase(),
144
+ prefix: fenceMatch.groups["prefix"] ?? "",
145
+ skipReason: pendingSkipReason,
146
+ startLine: index + LINE_AFTER_FENCE_OFFSET
147
+ };
148
+ pendingSkipReason = null;
149
+ pendingContext = [];
150
+ continue;
151
+ }
152
+ const text = line.replace(/^(?:\s*>)*\s*/u, "").trim();
153
+ const markerMatch = MARKER_REG_EXP.exec(text);
154
+ const kind = markerMatch?.groups?.["kind"];
155
+ const markerText = (markerMatch?.groups?.["text"] ?? "").trim();
156
+ if (kind === "skip") {
157
+ pendingSkipReason = markerText.replace(/^[-—:]\s*/u, "");
158
+ } else if (kind === "context") {
159
+ pendingContext.push(markerText);
160
+ } else if (text !== "") {
161
+ pendingSkipReason = null;
162
+ pendingContext = [];
163
+ }
164
+ }
165
+ return snippets;
166
+ }
167
+ async function findDocsSnippetProblems(params) {
168
+ const rootDirectory = (0, import_node_path.resolve)(params.rootDirectory);
169
+ const docsDirectory = (0, import_node_path.join)(rootDirectory, params.docsDirectory ?? "docs/src/content/docs");
170
+ const problems = [];
171
+ const virtualFiles = /* @__PURE__ */ new Map();
172
+ const rootNames = [];
173
+ const snippetsDirectory = (0, import_node_path.join)(rootDirectory, "docs", "__snippets__");
174
+ function addVirtualFile(path, file) {
175
+ virtualFiles.set(normalizePath(path), file);
176
+ rootNames.push(path);
177
+ }
178
+ const prelude = params.prelude ?? "";
179
+ if (prelude !== "") {
180
+ addVirtualFile((0, import_node_path.join)(snippetsDirectory, "prelude.ts"), { code: prelude, codeStartLine: 1, contextLineCount: 0, filePath: "<prelude>" });
181
+ }
182
+ for (const guidePath of await listGuides(docsDirectory)) {
183
+ const filePath = toPosix((0, import_node_path.relative)(rootDirectory, guidePath));
184
+ const markdown = await (0, import_promises.readFile)(guidePath, "utf-8");
185
+ for (const snippet of extractDocsSnippets(markdown)) {
186
+ if (snippet.skipReason === "") {
187
+ problems.push({
188
+ filePath,
189
+ line: snippet.codeStartLine - 1,
190
+ message: "A `snippet-check: skip` marker must give its reason."
191
+ });
192
+ continue;
193
+ }
194
+ if (snippet.skipReason !== null) {
195
+ continue;
196
+ }
197
+ const extension = snippet.isJavaScript ? "js" : "ts";
198
+ const baseName = `${toPosix((0, import_node_path.relative)(docsDirectory, guidePath)).replaceAll("/", "__")}.L${String(snippet.codeStartLine)}.${extension}`;
199
+ const context = snippet.context === "" ? "" : `${snippet.context}
200
+ `;
201
+ addVirtualFile((0, import_node_path.join)(snippetsDirectory, baseName), {
202
+ code: `${context}${snippet.code}
203
+ export {};
204
+ `,
205
+ codeStartLine: snippet.codeStartLine,
206
+ contextLineCount: context === "" ? 0 : context.split("\n").length - 1,
207
+ filePath
208
+ });
209
+ }
210
+ }
211
+ problems.push(...compileSnippets({ compilerOptions: params.compilerOptions ?? {}, rootDirectory, rootNames, virtualFiles }));
212
+ return problems;
213
+ }
214
+ function formatDocsSnippetProblems(problems) {
215
+ return problems.map((problem) => `${problem.filePath}:${String(problem.line)} - ${problem.message}`).join("\n");
216
+ }
217
+ function compileSnippets(params) {
218
+ const { rootDirectory, rootNames, virtualFiles } = params;
219
+ const configPath = (0, import_node_path.join)(rootDirectory, "tsconfig.json");
220
+ const parsed = (0, import_typescript.getParsedCommandLineOfConfigFile)(configPath, {}, {
221
+ ...import_typescript.sys,
222
+ onUnRecoverableConfigFileDiagnostic(diagnostic) {
223
+ throw new Error((0, import_typescript.flattenDiagnosticMessageText)(diagnostic.messageText, "\n"));
224
+ }
225
+ });
226
+ if (!parsed) {
227
+ throw new Error(`Cannot read ${configPath}`);
228
+ }
229
+ const compilerOptions = {
230
+ ...parsed.options,
231
+ ...params.compilerOptions,
232
+ allowJs: true,
233
+ checkJs: true,
234
+ composite: false,
235
+ incremental: false,
236
+ noEmit: true,
237
+ noUnusedLocals: false,
238
+ noUnusedParameters: false
239
+ };
240
+ delete compilerOptions.tsBuildInfoFile;
241
+ const host = (0, import_typescript.createCompilerHost)(compilerOptions, true);
242
+ const originalGetSourceFile = host.getSourceFile.bind(host);
243
+ const originalFileExists = host.fileExists.bind(host);
244
+ const originalReadFile = host.readFile.bind(host);
245
+ host.fileExists = (fileName) => virtualFiles.has(normalizePath(fileName)) || originalFileExists(fileName);
246
+ host.readFile = (fileName) => virtualFiles.get(normalizePath(fileName))?.code ?? originalReadFile(fileName);
247
+ host.getSourceFile = (fileName, languageVersionOrOptions, onError, shouldCreateNewSourceFile) => {
248
+ const virtualFile = virtualFiles.get(normalizePath(fileName));
249
+ if (virtualFile) {
250
+ const scriptKind = fileName.endsWith(".js") ? import_typescript.ScriptKind.JS : import_typescript.ScriptKind.TS;
251
+ return (0, import_typescript.createSourceFile)(fileName, virtualFile.code, languageVersionOrOptions, true, scriptKind);
252
+ }
253
+ return originalGetSourceFile(fileName, languageVersionOrOptions, onError, shouldCreateNewSourceFile);
254
+ };
255
+ const program = (0, import_typescript.createProgram)({ host, options: compilerOptions, rootNames });
256
+ const problems = [];
257
+ for (const rootName of rootNames) {
258
+ const sourceFile = program.getSourceFile(rootName);
259
+ const virtualFile = virtualFiles.get(normalizePath(rootName));
260
+ if (!sourceFile || !virtualFile) {
261
+ continue;
262
+ }
263
+ const isJavaScript = rootName.endsWith(".js");
264
+ const diagnostics = [...program.getSyntacticDiagnostics(sourceFile), ...program.getSemanticDiagnostics(sourceFile)];
265
+ for (const diagnostic of diagnostics) {
266
+ if (IGNORED_DIAGNOSTIC_CODES.has(diagnostic.code) || isJavaScript && JAVASCRIPT_IGNORED_DIAGNOSTIC_CODES.has(diagnostic.code)) {
267
+ continue;
268
+ }
269
+ const fileLine = diagnostic.start === void 0 ? 0 : sourceFile.getLineAndCharacterOfPosition(diagnostic.start).line;
270
+ const snippetLine = Math.max(0, fileLine - virtualFile.contextLineCount);
271
+ problems.push({
272
+ filePath: virtualFile.filePath,
273
+ line: virtualFile.codeStartLine + snippetLine,
274
+ message: `TS${String(diagnostic.code)}: ${(0, import_typescript.flattenDiagnosticMessageText)(diagnostic.messageText, " ")}`
275
+ });
276
+ }
277
+ }
278
+ return problems;
279
+ }
280
+ async function listGuides(directory) {
281
+ const guides = [];
282
+ for (const entry of await (0, import_promises.readdir)(directory, { withFileTypes: true })) {
283
+ const entryPath = (0, import_node_path.join)(directory, entry.name);
284
+ if (entry.isDirectory()) {
285
+ if (entry.name !== "api") {
286
+ guides.push(...await listGuides(entryPath));
287
+ }
288
+ } else if (/\.mdx?$/u.test(entry.name)) {
289
+ guides.push(entryPath);
290
+ }
291
+ }
292
+ return guides.sort();
293
+ }
294
+ function normalizePath(path) {
295
+ return toPosix((0, import_node_path.resolve)(path)).toLowerCase();
296
+ }
297
+ function stripPrefix(line, prefix) {
298
+ return line.startsWith(prefix) ? line.slice(prefix.length) : line.replace(/^(?:\s*>)*\s?/u, "");
299
+ }
300
+ function toPosix(path) {
301
+ return path.replaceAll("\\", "/");
302
+ }
303
+ // Annotate the CommonJS export names for ESM import in node:
304
+ 0 && (module.exports = {
305
+ assertDocsSnippetsCompile,
306
+ extractDocsSnippets,
307
+ findDocsSnippetProblems,
308
+ formatDocsSnippetProblems
309
+ });
310
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9kb2NzLXNpdGUvZG9jcy1zbmlwcGV0cy50cyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBmaWxlXG4gKlxuICogRXh0cmFjdHMgdGhlIGNvZGUgc25pcHBldHMgb2YgYSBwYWNrYWdlJ3MgZG9jdW1lbnRhdGlvbiBndWlkZXMgYW5kIHR5cGUtY2hlY2tzIHRoZW0gYWdhaW5zdCBpdHMgc291cmNlcy5cbiAqXG4gKiBBIGd1aWRlJ3Mgc25pcHBldCBpcyBjb2RlIGEgcmVhZGVyIGNvcGllcywgc28gYSByZW5hbWVkIG1lbWJlciBvciBhIHN0YWxlIGltcG9ydCBwYXRoIGluIGl0IGlzIGEgYnVnIHRoYXQgc2hpcHNcbiAqIHRvIHRoZSBzaXRlIHdpdGggZXZlcnkgY2hlY2sgZ3JlZW4uIEV2ZXJ5IGZlbmNlZCBgdHNgLCBgdHlwZXNjcmlwdGAsIGBqc2Agb3IgYGphdmFzY3JpcHRgIGJsb2NrIGluXG4gKiBgZG9jcy9zcmMvY29udGVudC9kb2NzYCBpcyBjb21waWxlZCBhcyBpdHMgb3duIG1vZHVsZSwgd2l0aCB0aGUgcHJvamVjdCdzIGB0c2NvbmZpZy5qc29uYCwgc28gYW4gaW1wb3J0IG9mIHRoZVxuICogcGFja2FnZSdzIG93biBuYW1lIHJlc29sdmVzIHdoZXJldmVyIHRoYXQgY29uZmlndXJhdGlvbiBzZW5kcyBpdCAoaXRzIGBwYXRoc2AsIG9yIHRoZSBgY29tcGlsZXJPcHRpb25zYCBwYXNzZWRcbiAqIGhlcmUpIGFuZCBhIHdyb25nIG5hbWUgZmFpbHMuIEEgYHRzYCAvIGB0eXBlc2NyaXB0YCBibG9jayBpcyBjb21waWxlZCBhcyBUeXBlU2NyaXB0OyBhIGBqc2AgLyBgamF2YXNjcmlwdGAgYmxvY2ssXG4gKiBvZnRlbiBhIGRldnRvb2xzLWNvbnNvbGUgcmVjaXBlLCBpcyBjb21waWxlZCBhcyBKYXZhU2NyaXB0IHdpdGggYGNoZWNrSnNgLCBzbyBhIHdyb25nIG1lbWJlciBvZiBhIHR5cGVkIG9iamVjdFxuICogc3RpbGwgZmFpbHMgd2hpbGUgYW4gdW50eXBlZCBsb29rdXAgZG9lcyBub3QuIFRoZSBnZW5lcmF0ZWQgQVBJIHJlZmVyZW5jZSAoYGRvY3Mvc3JjL2NvbnRlbnQvZG9jcy9hcGlgKSBpc1xuICogc2tpcHBlZDogaXQgaXMgcmVuZGVyZWQgZnJvbSB0aGUgVFNEb2MuXG4gKlxuICogVGhyZWUgdGhpbmdzIHNoYXBlIHdoYXQgYSBzbmlwcGV0IGlzIGNvbXBpbGVkIHdpdGgsIGVhY2ggYnV0IHRoZSBmaXJzdCB3cml0dGVuIGluIHRoZSBndWlkZSBhcyBhbiBIVE1MIGNvbW1lbnQsXG4gKiBpbnZpc2libGUgb24gdGhlIHNpdGUsIG9uIHRoZSBsaW5lcyByaWdodCBhYm92ZSB0aGUgZmVuY2U6XG4gKlxuICogLSBUaGUgbmFtZXMgZXZlcnkgZ3VpZGUgbWF5IHVzZSB3aXRob3V0IGRlY2xhcmluZyB0aGVtIGFyZSB0aGUgcGFja2FnZSdzIGBwcmVsdWRlYCwgY29tcGlsZWQgYXMgYSBtb2R1bGUgb2YgaXRzXG4gKiAgIG93biAoYSBgZGVjbGFyZSBnbG9iYWxgIGJsb2NrLCB3aXRoIHRoZSBpbXBvcnRzIGl0IG5lZWRzKS5cbiAqIC0gYDwhLS0gc25pcHBldC1jaGVjazogY29udGV4dCA8VHlwZVNjcmlwdD4gLS0+YCBwcmVwZW5kcyBkZWNsYXJhdGlvbnMgdG8gdGhhdCBvbmUgc25pcHBldCwgZm9yIHRoZSBuYW1lcyBpdHNcbiAqICAgcHJvc2UgaGFzIGFscmVhZHkgaW50cm9kdWNlZCAoYGRlY2xhcmUgY29uc3QgbGlua0VsOiBIVE1MQW5jaG9yRWxlbWVudDtgKS4gU2V2ZXJhbCBzdWNoIGxpbmVzIGFkZCB1cC5cbiAqIC0gYDwhLS0gc25pcHBldC1jaGVjazogc2tpcCA8cmVhc29uPiAtLT5gIGV4ZW1wdHMgYSBzbmlwcGV0IHRoYXQgaXMgZGVsaWJlcmF0ZWx5IG5vdCBjb21waWxhYmxlLCBzdWNoIGFzXG4gKiAgIHBzZXVkby1jb2RlLiBUaGUgcmVhc29uIGlzIHJlcXVpcmVkLCBzbyBhIHNraXAgaXMgYSBkZWNpc2lvbiBzb21lYm9keSB3cm90ZSBkb3duLCBuZXZlciBhIHNpbGVudCBob2xlLlxuICovXG5cbmltcG9ydCB0eXBlIHtcbiAgQ29tcGlsZXJPcHRpb25zLFxuICBTb3VyY2VGaWxlXG59IGZyb20gJ3R5cGVzY3JpcHQnO1xuXG5pbXBvcnQge1xuICByZWFkZGlyLFxuICByZWFkRmlsZVxufSBmcm9tICdub2RlOmZzL3Byb21pc2VzJztcbmltcG9ydCB7XG4gIGpvaW4sXG4gIHJlbGF0aXZlLFxuICByZXNvbHZlXG59IGZyb20gJ25vZGU6cGF0aCc7XG5pbXBvcnQge1xuICBjcmVhdGVDb21waWxlckhvc3QsXG4gIGNyZWF0ZVByb2dyYW0sXG4gIGNyZWF0ZVNvdXJjZUZpbGUsXG4gIGZsYXR0ZW5EaWFnbm9zdGljTWVzc2FnZVRleHQsXG4gIGdldFBhcnNlZENvbW1hbmRMaW5lT2ZDb25maWdGaWxlLFxuICBTY3JpcHRLaW5kLFxuICBzeXNcbn0gZnJvbSAndHlwZXNjcmlwdCc7XG5cbi8qKlxuICogVGhlIGxhbmd1YWdlcyBvZiB0aGUgZmVuY2VkIGJsb2NrcyB0aGF0IGFyZSB0eXBlLWNoZWNrZWQsIGFuZCB3aGV0aGVyIGVhY2ggaXMgSmF2YVNjcmlwdC5cbiAqL1xuY29uc3QgQ0hFQ0tFRF9MQU5HVUFHRVM6IFJlYWRvbmx5TWFwPHN0cmluZywgYm9vbGVhbj4gPSBuZXcgTWFwKFtcbiAgWydqYXZhc2NyaXB0JywgdHJ1ZV0sXG4gIFsnanMnLCB0cnVlXSxcbiAgWyd0cycsIGZhbHNlXSxcbiAgWyd0eXBlc2NyaXB0JywgZmFsc2VdXG5dKTtcblxuLyoqXG4gKiBUaGUgb2Zmc2V0IGZyb20gYSBmZW5jZSBsaW5lJ3MgMC1iYXNlZCBpbmRleCB0byB0aGUgMS1iYXNlZCBsaW5lIG9mIHRoZSBjb2RlIGFmdGVyIGl0LlxuICovXG5jb25zdCBMSU5FX0FGVEVSX0ZFTkNFX09GRlNFVCA9IDI7XG5cbmNvbnN0IE1BUktFUl9SRUdfRVhQID0gL148IS0tXFxzKnNuaXBwZXQtY2hlY2s6XFxzKig/PGtpbmQ+W2Etel0rKVxcYig/PHRleHQ+Lio/KS0tPiQvc3U7XG5cbi8qKlxuICogRGlhZ25vc3RpY3MgYSBzbmlwcGV0IGlzIG5vdCBoZWxkIHRvOiBhbiBpbGx1c3RyYXRpb24gZGVjbGFyZXMgbmFtZXMgaXQgbmV2ZXIgcmVhZHMuXG4gKi9cbmNvbnN0IERJQUdOT1NUSUNfREVDTEFSRURfQlVUX1ZBTFVFX05FVkVSX1JFQUQgPSA2MTMzO1xuY29uc3QgRElBR05PU1RJQ19BTExfSU1QT1JUU19VTlVTRUQgPSA2MTkyO1xuY29uc3QgRElBR05PU1RJQ19ERUNMQVJFRF9CVVRfTkVWRVJfVVNFRCA9IDYxOTY7XG5jb25zdCBESUFHTk9TVElDX0FMTF9ERVNUUlVDVFVSRURfRUxFTUVOVFNfVU5VU0VEID0gNjE5ODtcbmNvbnN0IElHTk9SRURfRElBR05PU1RJQ19DT0RFUyA9IG5ldyBTZXQoW1xuICBESUFHTk9TVElDX0FMTF9ERVNUUlVDVFVSRURfRUxFTUVOVFNfVU5VU0VELFxuICBESUFHTk9TVElDX0FMTF9JTVBPUlRTX1VOVVNFRCxcbiAgRElBR05PU1RJQ19ERUNMQVJFRF9CVVRfTkVWRVJfVVNFRCxcbiAgRElBR05PU1RJQ19ERUNMQVJFRF9CVVRfVkFMVUVfTkVWRVJfUkVBRFxuXSk7XG5cbi8qKlxuICogVGhlIGltcGxpY2l0LWBhbnlgIGRpYWdub3N0aWNzLCB3aGljaCBhIEphdmFTY3JpcHQgc25pcHBldCBpcyBub3QgaGVsZCB0bzogYSBjb25zb2xlIHJlY2lwZSBoYXMgbm8gYW5ub3RhdGlvbnMgdG9cbiAqIGdpdmUsIGFuZCBhbiB1bnR5cGVkIGxvb2t1cCBzdWNoIGFzIGEgYFN5bWJvbC5mb3JgIHNsb3Qgb24gYGdsb2JhbFRoaXNgIGlzIHdoYXQgcGxhaW4gSmF2YVNjcmlwdCBkb2VzLlxuICovXG5jb25zdCBESUFHTk9TVElDX1ZBUklBQkxFX0lNUExJQ0lUTFlfQU5ZID0gNzAwNTtcbmNvbnN0IERJQUdOT1NUSUNfUEFSQU1FVEVSX0lNUExJQ0lUTFlfQU5ZID0gNzAwNjtcbmNvbnN0IERJQUdOT1NUSUNfTUVNQkVSX0lNUExJQ0lUTFlfQU5ZID0gNzAwODtcbmNvbnN0IERJQUdOT1NUSUNfQklORElOR19FTEVNRU5UX0lNUExJQ0lUTFlfQU5ZID0gNzAzMTtcbmNvbnN0IERJQUdOT1NUSUNfVkFSSUFCTEVfSU1QTElDSVRMWV9BTllfSU5fU09NRV9MT0NBVElPTlMgPSA3MDM0O1xuY29uc3QgRElBR05PU1RJQ19BUlJPV19GVU5DVElPTl9DQVBUVVJFU19HTE9CQUxfVEhJUyA9IDcwNDE7XG5jb25zdCBESUFHTk9TVElDX0VMRU1FTlRfSU1QTElDSVRMWV9BTlkgPSA3MDUzO1xuY29uc3QgSkFWQVNDUklQVF9JR05PUkVEX0RJQUdOT1NUSUNfQ09ERVMgPSBuZXcgU2V0KFtcbiAgRElBR05PU1RJQ19BUlJPV19GVU5DVElPTl9DQVBUVVJFU19HTE9CQUxfVEhJUyxcbiAgRElBR05PU1RJQ19CSU5ESU5HX0VMRU1FTlRfSU1QTElDSVRMWV9BTlksXG4gIERJQUdOT1NUSUNfRUxFTUVOVF9JTVBMSUNJVExZX0FOWSxcbiAgRElBR05PU1RJQ19NRU1CRVJfSU1QTElDSVRMWV9BTlksXG4gIERJQUdOT1NUSUNfUEFSQU1FVEVSX0lNUExJQ0lUTFlfQU5ZLFxuICBESUFHTk9TVElDX1ZBUklBQkxFX0lNUExJQ0lUTFlfQU5ZLFxuICBESUFHTk9TVElDX1ZBUklBQkxFX0lNUExJQ0lUTFlfQU5ZX0lOX1NPTUVfTE9DQVRJT05TXG5dKTtcblxuLyoqXG4gKiBQYXJhbWV0ZXJzIGZvciB7QGxpbmsgYXNzZXJ0RG9jc1NuaXBwZXRzQ29tcGlsZX06IHRoZSBzYW1lIGFzIHtAbGluayBmaW5kRG9jc1NuaXBwZXRQcm9ibGVtc30gdGFrZXMuXG4gKi9cbmV4cG9ydCB0eXBlIEFzc2VydERvY3NTbmlwcGV0c0NvbXBpbGVQYXJhbXMgPSBGaW5kRG9jc1NuaXBwZXRQcm9ibGVtc1BhcmFtcztcblxuLyoqXG4gKiBPbmUgZmVuY2VkIGNvZGUgYmxvY2sgb2YgYSBndWlkZS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBEb2NzU25pcHBldCB7XG4gIC8qKlxuICAgKiBUaGUgY29kZSwgd2l0aCBhbnkgYmxvY2txdW90ZSBvciBpbmRlbnRhdGlvbiBwcmVmaXggb2YgdGhlIGZlbmNlIHN0cmlwcGVkLlxuICAgKi9cbiAgcmVhZG9ubHkgY29kZTogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgMS1iYXNlZCBsaW5lIG9mIHRoZSBndWlkZSBvbiB3aGljaCB0aGUgY29kZSBzdGFydHMgKHRoZSBsaW5lIGFmdGVyIHRoZSBvcGVuaW5nIGZlbmNlKS5cbiAgICovXG4gIHJlYWRvbmx5IGNvZGVTdGFydExpbmU6IG51bWJlcjtcblxuICAvKipcbiAgICogVGhlIGRlY2xhcmF0aW9ucyBvZiB0aGUgYHNuaXBwZXQtY2hlY2s6IGNvbnRleHRgIG1hcmtlcnMgYWJvdmUgdGhlIGZlbmNlLCBqb2luZWQgYnkgbmV3bGluZXMuXG4gICAqL1xuICByZWFkb25seSBjb250ZXh0OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdGhlIHNuaXBwZXQgaXMgSmF2YVNjcmlwdCByYXRoZXIgdGhhbiBUeXBlU2NyaXB0LlxuICAgKi9cbiAgcmVhZG9ubHkgaXNKYXZhU2NyaXB0OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBUaGUgbGFuZ3VhZ2Ugb2YgdGhlIGZlbmNlLlxuICAgKi9cbiAgcmVhZG9ubHkgbGFuZ3VhZ2U6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIHJlYXNvbiBnaXZlbiBieSBhIGBzbmlwcGV0LWNoZWNrOiBza2lwYCBtYXJrZXIsIG9yIGBudWxsYCB3aGVuIHRoZSBzbmlwcGV0IGlzIGNoZWNrZWQuXG4gICAqL1xuICByZWFkb25seSBza2lwUmVhc29uOiBudWxsIHwgc3RyaW5nO1xufVxuXG4vKipcbiAqIEEgcHJvYmxlbSBmb3VuZCBpbiBhIGd1aWRlJ3Mgc25pcHBldC5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBEb2NzU25pcHBldFByb2JsZW0ge1xuICAvKipcbiAgICogVGhlIGd1aWRlJ3MgcGF0aCwgcmVsYXRpdmUgdG8gdGhlIHBhY2thZ2Ugcm9vdC5cbiAgICovXG4gIHJlYWRvbmx5IGZpbGVQYXRoOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSAxLWJhc2VkIGxpbmUgb2YgdGhlIGd1aWRlLlxuICAgKi9cbiAgcmVhZG9ubHkgbGluZTogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBXaGF0IGlzIHdyb25nLlxuICAgKi9cbiAgcmVhZG9ubHkgbWVzc2FnZTogc3RyaW5nO1xufVxuXG4vKipcbiAqIFBhcmFtZXRlcnMgZm9yIHtAbGluayBmaW5kRG9jc1NuaXBwZXRQcm9ibGVtc30uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRmluZERvY3NTbmlwcGV0UHJvYmxlbXNQYXJhbXMge1xuICAvKipcbiAgICogQ29tcGlsZXIgb3B0aW9ucyBsYWlkIG92ZXIgdGhlIG9uZXMgYHRzY29uZmlnLmpzb25gIGdpdmVzLCBmb3IgaW5zdGFuY2UgYHBhdGhzYCB0aGF0IHJlc29sdmUgdGhlIHBhY2thZ2UncyBvd25cbiAgICogbmFtZSBvbnRvIGl0cyBzb3VyY2VzIHdoZW4gaXRzIGB0c2NvbmZpZy5qc29uYCBoYXMgbm9uZS4gQSByZWxhdGl2ZSBwYXRoIGluIHRoZW0gaXMgbm90IHJlc29sdmVkLCBzbyBwYXNzXG4gICAqIGFic29sdXRlIG9uZXMuXG4gICAqL1xuICByZWFkb25seSBjb21waWxlck9wdGlvbnM/OiBDb21waWxlck9wdGlvbnM7XG5cbiAgLyoqXG4gICAqIFRoZSBndWlkZXMgZGlyZWN0b3J5LCByZWxhdGl2ZSB0byB7QGxpbmsgRmluZERvY3NTbmlwcGV0UHJvYmxlbXNQYXJhbXMucm9vdERpcmVjdG9yeX0uXG4gICAqXG4gICAqIEBkZWZhdWx0IGAnZG9jcy9zcmMvY29udGVudC9kb2NzJ2BcbiAgICovXG4gIHJlYWRvbmx5IGRvY3NEaXJlY3Rvcnk/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBhbWJpZW50IGNvbnRleHQgZXZlcnkgc25pcHBldCBpcyBjb21waWxlZCB3aXRoOiB0aGUgbmFtZXMgYSBndWlkZSBtYXkgdXNlIHdpdGhvdXQgZGVjbGFyaW5nIHRoZW0sIHdyaXR0ZW4gYXNcbiAgICogYSBtb2R1bGUgKGBkZWNsYXJlIGdsb2JhbCB7IC4uLiB9YCwgd2l0aCB0aGUgaW1wb3J0cyBpdCBuZWVkcykuXG4gICAqXG4gICAqIEBkZWZhdWx0IGAnJ2AsIG5vIHByZWx1ZGUuXG4gICAqL1xuICByZWFkb25seSBwcmVsdWRlPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgcGFja2FnZSByb290LCBob2xkaW5nIGB0c2NvbmZpZy5qc29uYC5cbiAgICovXG4gIHJlYWRvbmx5IHJvb3REaXJlY3Rvcnk6IHN0cmluZztcbn1cblxuaW50ZXJmYWNlIENvbXBpbGVTbmlwcGV0c1BhcmFtcyB7XG4gIHJlYWRvbmx5IGNvbXBpbGVyT3B0aW9uczogQ29tcGlsZXJPcHRpb25zO1xuICByZWFkb25seSByb290RGlyZWN0b3J5OiBzdHJpbmc7XG4gIHJlYWRvbmx5IHJvb3ROYW1lczogcmVhZG9ubHkgc3RyaW5nW107XG4gIHJlYWRvbmx5IHZpcnR1YWxGaWxlczogUmVhZG9ubHlNYXA8c3RyaW5nLCBWaXJ0dWFsU25pcHBldEZpbGU+O1xufVxuXG5pbnRlcmZhY2UgT3BlbkZlbmNlIHtcbiAgcmVhZG9ubHkgY29udGV4dDogc3RyaW5nW107XG4gIHJlYWRvbmx5IGZlbmNlOiBzdHJpbmc7XG4gIHJlYWRvbmx5IGxhbmd1YWdlOiBzdHJpbmc7XG4gIHJlYWRvbmx5IHByZWZpeDogc3RyaW5nO1xuICByZWFkb25seSBza2lwUmVhc29uOiBudWxsIHwgc3RyaW5nO1xuICByZWFkb25seSBzdGFydExpbmU6IG51bWJlcjtcbn1cblxuaW50ZXJmYWNlIFZpcnR1YWxTbmlwcGV0RmlsZSB7XG4gIHJlYWRvbmx5IGNvZGU6IHN0cmluZztcbiAgcmVhZG9ubHkgY29kZVN0YXJ0TGluZTogbnVtYmVyO1xuICByZWFkb25seSBjb250ZXh0TGluZUNvdW50OiBudW1iZXI7XG4gIHJlYWRvbmx5IGZpbGVQYXRoOiBzdHJpbmc7XG59XG5cbi8qKlxuICogVHlwZS1jaGVja3MgZXZlcnkgc25pcHBldCBvZiB0aGUgZ3VpZGVzIGFuZCB0aHJvd3Mgd2hlbiBvbmUgZmFpbHMsIGZvciBhIGBkb2NzOmNoZWNrLXNuaXBwZXRzYCBzY3JpcHQuXG4gKlxuICogQHBhcmFtIHBhcmFtcyAtIFRoZSB7QGxpbmsgQXNzZXJ0RG9jc1NuaXBwZXRzQ29tcGlsZVBhcmFtc30uXG4gKiBAcmV0dXJucyBBIHByb21pc2UgdGhhdCByZXNvbHZlcyB3aGVuIGV2ZXJ5IHNuaXBwZXQgY29tcGlsZXMuXG4gKiBAdGhyb3dzIHtFcnJvcn0gTGlzdGluZyBldmVyeSBwcm9ibGVtLCBvbmUgcGVyIGxpbmUuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBhc3NlcnREb2NzU25pcHBldHNDb21waWxlKHBhcmFtczogQXNzZXJ0RG9jc1NuaXBwZXRzQ29tcGlsZVBhcmFtcyk6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCBwcm9ibGVtcyA9IGF3YWl0IGZpbmREb2NzU25pcHBldFByb2JsZW1zKHBhcmFtcyk7XG4gIGlmIChwcm9ibGVtcy5sZW5ndGggPiAwKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGAke1N0cmluZyhwcm9ibGVtcy5sZW5ndGgpfSBwcm9ibGVtKHMpIGluIHRoZSBkb2N1bWVudGF0aW9uIHNuaXBwZXRzOlxcbiR7Zm9ybWF0RG9jc1NuaXBwZXRQcm9ibGVtcyhwcm9ibGVtcyl9YCk7XG4gIH1cbn1cblxuLyoqXG4gKiBFeHRyYWN0cyB0aGUgZmVuY2VkIGNvZGUgYmxvY2tzIG9mIHRoZSBjaGVja2VkIGxhbmd1YWdlcyBmcm9tIGEgbWFya2Rvd24gZG9jdW1lbnQuXG4gKlxuICogQSBmZW5jZSBpbnNpZGUgYSBibG9ja3F1b3RlIG9yIGEgbGlzdCBpdGVtIGlzIHJlY29nbml6ZWQgdG9vOiBpdHMgcHJlZml4IChgPiBgLCBpbmRlbnRhdGlvbikgaXMgc3RyaXBwZWQgZnJvbVxuICogZXZlcnkgbGluZSBvZiBpdHMgY29kZS5cbiAqXG4gKiBAcGFyYW0gbWFya2Rvd24gLSBUaGUgbWFya2Rvd24gZG9jdW1lbnQuXG4gKiBAcmV0dXJucyBUaGUgc25pcHBldHMsIGluIGRvY3VtZW50IG9yZGVyLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZXh0cmFjdERvY3NTbmlwcGV0cyhtYXJrZG93bjogc3RyaW5nKTogRG9jc1NuaXBwZXRbXSB7XG4gIGNvbnN0IGxpbmVzID0gbWFya2Rvd24uc3BsaXQoL1xccj9cXG4vdSk7XG4gIGNvbnN0IHNuaXBwZXRzOiBEb2NzU25pcHBldFtdID0gW107XG4gIGxldCBvcGVuRmVuY2U6IG51bGwgfCBPcGVuRmVuY2UgPSBudWxsO1xuICBsZXQgY29kZUxpbmVzOiBzdHJpbmdbXSA9IFtdO1xuICBsZXQgcGVuZGluZ1NraXBSZWFzb246IG51bGwgfCBzdHJpbmcgPSBudWxsO1xuICBsZXQgcGVuZGluZ0NvbnRleHQ6IHN0cmluZ1tdID0gW107XG5cbiAgZm9yIChjb25zdCBbaW5kZXgsIGxpbmVdIG9mIGxpbmVzLmVudHJpZXMoKSkge1xuICAgIGlmIChvcGVuRmVuY2UpIHtcbiAgICAgIGNvbnN0IGNvbnRlbnQgPSBzdHJpcFByZWZpeChsaW5lLCBvcGVuRmVuY2UucHJlZml4KTtcbiAgICAgIGlmIChjb250ZW50LnRyaW1FbmQoKSA9PT0gb3BlbkZlbmNlLmZlbmNlKSB7XG4gICAgICAgIGNvbnN0IGlzSmF2YVNjcmlwdCA9IENIRUNLRURfTEFOR1VBR0VTLmdldChvcGVuRmVuY2UubGFuZ3VhZ2UpO1xuICAgICAgICBpZiAoaXNKYXZhU2NyaXB0ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICBzbmlwcGV0cy5wdXNoKHtcbiAgICAgICAgICAgIGNvZGU6IGNvZGVMaW5lcy5qb2luKCdcXG4nKSxcbiAgICAgICAgICAgIGNvZGVTdGFydExpbmU6IG9wZW5GZW5jZS5zdGFydExpbmUsXG4gICAgICAgICAgICBjb250ZXh0OiBvcGVuRmVuY2UuY29udGV4dC5qb2luKCdcXG4nKSxcbiAgICAgICAgICAgIGlzSmF2YVNjcmlwdCxcbiAgICAgICAgICAgIGxhbmd1YWdlOiBvcGVuRmVuY2UubGFuZ3VhZ2UsXG4gICAgICAgICAgICBza2lwUmVhc29uOiBvcGVuRmVuY2Uuc2tpcFJlYXNvblxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIG9wZW5GZW5jZSA9IG51bGw7XG4gICAgICAgIGNvZGVMaW5lcyA9IFtdO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29kZUxpbmVzLnB1c2goY29udGVudCk7XG4gICAgICB9XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICBjb25zdCBmZW5jZU1hdGNoID0gL14oPzxwcmVmaXg+KD86XFxzKj4pKlxccyopKD88ZmVuY2U+YHszLH18fnszLH0pKD88bGFuZ3VhZ2U+W1xcdy1dKikvdS5leGVjKGxpbmUpO1xuICAgIGlmIChmZW5jZU1hdGNoPy5ncm91cHMpIHtcbiAgICAgIC8qIHY4IGlnbm9yZSBzdGFydCAtLSBFdmVyeSBncm91cCBvZiB0aGUgZmVuY2UgcGF0dGVybiB0YWtlcyBwYXJ0IGluIGEgbWF0Y2gsIHNvIHRoZSBmYWxsYmFja3MgbmV2ZXIgYXBwbHkuICovXG4gICAgICBvcGVuRmVuY2UgPSB7XG4gICAgICAgIGNvbnRleHQ6IHBlbmRpbmdDb250ZXh0LFxuICAgICAgICBmZW5jZTogZmVuY2VNYXRjaC5ncm91cHNbJ2ZlbmNlJ10gPz8gJycsXG4gICAgICAgIGxhbmd1YWdlOiAoZmVuY2VNYXRjaC5ncm91cHNbJ2xhbmd1YWdlJ10gPz8gJycpLnRvTG93ZXJDYXNlKCksXG4gICAgICAgIHByZWZpeDogZmVuY2VNYXRjaC5ncm91cHNbJ3ByZWZpeCddID8/ICcnLFxuICAgICAgICBza2lwUmVhc29uOiBwZW5kaW5nU2tpcFJlYXNvbixcbiAgICAgICAgc3RhcnRMaW5lOiBpbmRleCArIExJTkVfQUZURVJfRkVOQ0VfT0ZGU0VUXG4gICAgICB9O1xuICAgICAgLyogdjggaWdub3JlIHN0b3AgKi9cbiAgICAgIHBlbmRpbmdTa2lwUmVhc29uID0gbnVsbDtcbiAgICAgIHBlbmRpbmdDb250ZXh0ID0gW107XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICBjb25zdCB0ZXh0ID0gbGluZS5yZXBsYWNlKC9eKD86XFxzKj4pKlxccyovdSwgJycpLnRyaW0oKTtcbiAgICBjb25zdCBtYXJrZXJNYXRjaCA9IE1BUktFUl9SRUdfRVhQLmV4ZWModGV4dCk7XG4gICAgY29uc3Qga2luZCA9IG1hcmtlck1hdGNoPy5ncm91cHM/Llsna2luZCddO1xuICAgIGNvbnN0IG1hcmtlclRleHQgPSAobWFya2VyTWF0Y2g/Lmdyb3Vwcz8uWyd0ZXh0J10gPz8gJycpLnRyaW0oKTtcbiAgICBpZiAoa2luZCA9PT0gJ3NraXAnKSB7XG4gICAgICBwZW5kaW5nU2tpcFJlYXNvbiA9IG1hcmtlclRleHQucmVwbGFjZSgvXlst4oCUOl1cXHMqL3UsICcnKTtcbiAgICB9IGVsc2UgaWYgKGtpbmQgPT09ICdjb250ZXh0Jykge1xuICAgICAgcGVuZGluZ0NvbnRleHQucHVzaChtYXJrZXJUZXh0KTtcbiAgICB9IGVsc2UgaWYgKHRleHQgIT09ICcnKSB7XG4gICAgICBwZW5kaW5nU2tpcFJlYXNvbiA9IG51bGw7XG4gICAgICBwZW5kaW5nQ29udGV4dCA9IFtdO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBzbmlwcGV0cztcbn1cblxuLyoqXG4gKiBUeXBlLWNoZWNrcyBldmVyeSBzbmlwcGV0IG9mIHRoZSBndWlkZXMuXG4gKlxuICogQHBhcmFtIHBhcmFtcyAtIFRoZSB7QGxpbmsgRmluZERvY3NTbmlwcGV0UHJvYmxlbXNQYXJhbXN9LlxuICogQHJldHVybnMgVGhlIHByb2JsZW1zIGZvdW5kLCBlbXB0eSB3aGVuIGV2ZXJ5IHNuaXBwZXQgY29tcGlsZXMuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBmaW5kRG9jc1NuaXBwZXRQcm9ibGVtcyhwYXJhbXM6IEZpbmREb2NzU25pcHBldFByb2JsZW1zUGFyYW1zKTogUHJvbWlzZTxEb2NzU25pcHBldFByb2JsZW1bXT4ge1xuICBjb25zdCByb290RGlyZWN0b3J5ID0gcmVzb2x2ZShwYXJhbXMucm9vdERpcmVjdG9yeSk7XG4gIGNvbnN0IGRvY3NEaXJlY3RvcnkgPSBqb2luKHJvb3REaXJlY3RvcnksIHBhcmFtcy5kb2NzRGlyZWN0b3J5ID8/ICdkb2NzL3NyYy9jb250ZW50L2RvY3MnKTtcbiAgY29uc3QgcHJvYmxlbXM6IERvY3NTbmlwcGV0UHJvYmxlbVtdID0gW107XG4gIGNvbnN0IHZpcnR1YWxGaWxlcyA9IG5ldyBNYXA8c3RyaW5nLCBWaXJ0dWFsU25pcHBldEZpbGU+KCk7XG4gIGNvbnN0IHJvb3ROYW1lczogc3RyaW5nW10gPSBbXTtcbiAgY29uc3Qgc25pcHBldHNEaXJlY3RvcnkgPSBqb2luKHJvb3REaXJlY3RvcnksICdkb2NzJywgJ19fc25pcHBldHNfXycpO1xuXG4gIGZ1bmN0aW9uIGFkZFZpcnR1YWxGaWxlKHBhdGg6IHN0cmluZywgZmlsZTogVmlydHVhbFNuaXBwZXRGaWxlKTogdm9pZCB7XG4gICAgdmlydHVhbEZpbGVzLnNldChub3JtYWxpemVQYXRoKHBhdGgpLCBmaWxlKTtcbiAgICByb290TmFtZXMucHVzaChwYXRoKTtcbiAgfVxuXG4gIGNvbnN0IHByZWx1ZGUgPSBwYXJhbXMucHJlbHVkZSA/PyAnJztcbiAgaWYgKHByZWx1ZGUgIT09ICcnKSB7XG4gICAgYWRkVmlydHVhbEZpbGUoam9pbihzbmlwcGV0c0RpcmVjdG9yeSwgJ3ByZWx1ZGUudHMnKSwgeyBjb2RlOiBwcmVsdWRlLCBjb2RlU3RhcnRMaW5lOiAxLCBjb250ZXh0TGluZUNvdW50OiAwLCBmaWxlUGF0aDogJzxwcmVsdWRlPicgfSk7XG4gIH1cblxuICBmb3IgKGNvbnN0IGd1aWRlUGF0aCBvZiBhd2FpdCBsaXN0R3VpZGVzKGRvY3NEaXJlY3RvcnkpKSB7XG4gICAgY29uc3QgZmlsZVBhdGggPSB0b1Bvc2l4KHJlbGF0aXZlKHJvb3REaXJlY3RvcnksIGd1aWRlUGF0aCkpO1xuICAgIGNvbnN0IG1hcmtkb3duID0gYXdhaXQgcmVhZEZpbGUoZ3VpZGVQYXRoLCAndXRmLTgnKTtcbiAgICBmb3IgKGNvbnN0IHNuaXBwZXQgb2YgZXh0cmFjdERvY3NTbmlwcGV0cyhtYXJrZG93bikpIHtcbiAgICAgIGlmIChzbmlwcGV0LnNraXBSZWFzb24gPT09ICcnKSB7XG4gICAgICAgIHByb2JsZW1zLnB1c2goe1xuICAgICAgICAgIGZpbGVQYXRoLFxuICAgICAgICAgIGxpbmU6IHNuaXBwZXQuY29kZVN0YXJ0TGluZSAtIDEsXG4gICAgICAgICAgbWVzc2FnZTogJ0EgYHNuaXBwZXQtY2hlY2s6IHNraXBgIG1hcmtlciBtdXN0IGdpdmUgaXRzIHJlYXNvbi4nXG4gICAgICAgIH0pO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIGlmIChzbmlwcGV0LnNraXBSZWFzb24gIT09IG51bGwpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBjb25zdCBleHRlbnNpb24gPSBzbmlwcGV0LmlzSmF2YVNjcmlwdCA/ICdqcycgOiAndHMnO1xuICAgICAgY29uc3QgYmFzZU5hbWUgPSBgJHt0b1Bvc2l4KHJlbGF0aXZlKGRvY3NEaXJlY3RvcnksIGd1aWRlUGF0aCkpLnJlcGxhY2VBbGwoJy8nLCAnX18nKX0uTCR7U3RyaW5nKHNuaXBwZXQuY29kZVN0YXJ0TGluZSl9LiR7ZXh0ZW5zaW9ufWA7XG4gICAgICBjb25zdCBjb250ZXh0ID0gc25pcHBldC5jb250ZXh0ID09PSAnJyA/ICcnIDogYCR7c25pcHBldC5jb250ZXh0fVxcbmA7XG4gICAgICBhZGRWaXJ0dWFsRmlsZShqb2luKHNuaXBwZXRzRGlyZWN0b3J5LCBiYXNlTmFtZSksIHtcbiAgICAgICAgY29kZTogYCR7Y29udGV4dH0ke3NuaXBwZXQuY29kZX1cXG5leHBvcnQge307XFxuYCxcbiAgICAgICAgY29kZVN0YXJ0TGluZTogc25pcHBldC5jb2RlU3RhcnRMaW5lLFxuICAgICAgICBjb250ZXh0TGluZUNvdW50OiBjb250ZXh0ID09PSAnJyA/IDAgOiBjb250ZXh0LnNwbGl0KCdcXG4nKS5sZW5ndGggLSAxLFxuICAgICAgICBmaWxlUGF0aFxuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgcHJvYmxlbXMucHVzaCguLi5jb21waWxlU25pcHBldHMoeyBjb21waWxlck9wdGlvbnM6IHBhcmFtcy5jb21waWxlck9wdGlvbnMgPz8ge30sIHJvb3REaXJlY3RvcnksIHJvb3ROYW1lcywgdmlydHVhbEZpbGVzIH0pKTtcbiAgcmV0dXJuIHByb2JsZW1zO1xufVxuXG4vKipcbiAqIEZvcm1hdHMgcHJvYmxlbXMgb25lIHBlciBsaW5lLCBhcyBgcGF0aDpsaW5lIC0gbWVzc2FnZWAuXG4gKlxuICogQHBhcmFtIHByb2JsZW1zIC0gVGhlIHByb2JsZW1zLlxuICogQHJldHVybnMgVGhlIGZvcm1hdHRlZCB0ZXh0LlxuICovXG5leHBvcnQgZnVuY3Rpb24gZm9ybWF0RG9jc1NuaXBwZXRQcm9ibGVtcyhwcm9ibGVtczogcmVhZG9ubHkgRG9jc1NuaXBwZXRQcm9ibGVtW10pOiBzdHJpbmcge1xuICByZXR1cm4gcHJvYmxlbXMubWFwKChwcm9ibGVtKSA9PiBgJHtwcm9ibGVtLmZpbGVQYXRofToke1N0cmluZyhwcm9ibGVtLmxpbmUpfSAtICR7cHJvYmxlbS5tZXNzYWdlfWApLmpvaW4oJ1xcbicpO1xufVxuXG5mdW5jdGlvbiBjb21waWxlU25pcHBldHMocGFyYW1zOiBDb21waWxlU25pcHBldHNQYXJhbXMpOiBEb2NzU25pcHBldFByb2JsZW1bXSB7XG4gIGNvbnN0IHsgcm9vdERpcmVjdG9yeSwgcm9vdE5hbWVzLCB2aXJ0dWFsRmlsZXMgfSA9IHBhcmFtcztcbiAgY29uc3QgY29uZmlnUGF0aCA9IGpvaW4ocm9vdERpcmVjdG9yeSwgJ3RzY29uZmlnLmpzb24nKTtcbiAgY29uc3QgcGFyc2VkID0gZ2V0UGFyc2VkQ29tbWFuZExpbmVPZkNvbmZpZ0ZpbGUoY29uZmlnUGF0aCwge30sIHtcbiAgICAuLi5zeXMsXG4gICAgb25VblJlY292ZXJhYmxlQ29uZmlnRmlsZURpYWdub3N0aWMoZGlhZ25vc3RpYykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGZsYXR0ZW5EaWFnbm9zdGljTWVzc2FnZVRleHQoZGlhZ25vc3RpYy5tZXNzYWdlVGV4dCwgJ1xcbicpKTtcbiAgICB9XG4gIH0pO1xuICAvKiB2OCBpZ25vcmUgc3RhcnQgLS0gQW4gdW5yZWFkYWJsZSBjb25maWd1cmF0aW9uIHRocm93cyBpbiB0aGUgaGFuZGxlciBhYm92ZSBiZWZvcmUgdGhpcyBjYW4gYmUgcmVhY2hlZC4gKi9cbiAgaWYgKCFwYXJzZWQpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYENhbm5vdCByZWFkICR7Y29uZmlnUGF0aH1gKTtcbiAgfVxuICAvKiB2OCBpZ25vcmUgc3RvcCAqL1xuXG4gIGNvbnN0IGNvbXBpbGVyT3B0aW9uczogQ29tcGlsZXJPcHRpb25zID0ge1xuICAgIC4uLnBhcnNlZC5vcHRpb25zLFxuICAgIC4uLnBhcmFtcy5jb21waWxlck9wdGlvbnMsXG4gICAgYWxsb3dKczogdHJ1ZSxcbiAgICBjaGVja0pzOiB0cnVlLFxuICAgIGNvbXBvc2l0ZTogZmFsc2UsXG4gICAgaW5jcmVtZW50YWw6IGZhbHNlLFxuICAgIG5vRW1pdDogdHJ1ZSxcbiAgICBub1VudXNlZExvY2FsczogZmFsc2UsXG4gICAgbm9VbnVzZWRQYXJhbWV0ZXJzOiBmYWxzZVxuICB9O1xuICBkZWxldGUgY29tcGlsZXJPcHRpb25zLnRzQnVpbGRJbmZvRmlsZTtcblxuICBjb25zdCBob3N0ID0gY3JlYXRlQ29tcGlsZXJIb3N0KGNvbXBpbGVyT3B0aW9ucywgdHJ1ZSk7XG4gIGNvbnN0IG9yaWdpbmFsR2V0U291cmNlRmlsZSA9IGhvc3QuZ2V0U291cmNlRmlsZS5iaW5kKGhvc3QpO1xuICBjb25zdCBvcmlnaW5hbEZpbGVFeGlzdHMgPSBob3N0LmZpbGVFeGlzdHMuYmluZChob3N0KTtcbiAgY29uc3Qgb3JpZ2luYWxSZWFkRmlsZSA9IGhvc3QucmVhZEZpbGUuYmluZChob3N0KTtcbiAgaG9zdC5maWxlRXhpc3RzID0gKGZpbGVOYW1lKTogYm9vbGVhbiA9PiB2aXJ0dWFsRmlsZXMuaGFzKG5vcm1hbGl6ZVBhdGgoZmlsZU5hbWUpKSB8fCBvcmlnaW5hbEZpbGVFeGlzdHMoZmlsZU5hbWUpO1xuICBob3N0LnJlYWRGaWxlID0gKGZpbGVOYW1lKTogc3RyaW5nIHwgdW5kZWZpbmVkID0+IHZpcnR1YWxGaWxlcy5nZXQobm9ybWFsaXplUGF0aChmaWxlTmFtZSkpPy5jb2RlID8/IG9yaWdpbmFsUmVhZEZpbGUoZmlsZU5hbWUpO1xuICBob3N0LmdldFNvdXJjZUZpbGUgPSAoZmlsZU5hbWUsIGxhbmd1YWdlVmVyc2lvbk9yT3B0aW9ucywgb25FcnJvciwgc2hvdWxkQ3JlYXRlTmV3U291cmNlRmlsZSk6IFNvdXJjZUZpbGUgfCB1bmRlZmluZWQgPT4ge1xuICAgIGNvbnN0IHZpcnR1YWxGaWxlID0gdmlydHVhbEZpbGVzLmdldChub3JtYWxpemVQYXRoKGZpbGVOYW1lKSk7XG4gICAgaWYgKHZpcnR1YWxGaWxlKSB7XG4gICAgICBjb25zdCBzY3JpcHRLaW5kID0gZmlsZU5hbWUuZW5kc1dpdGgoJy5qcycpID8gU2NyaXB0S2luZC5KUyA6IFNjcmlwdEtpbmQuVFM7XG4gICAgICByZXR1cm4gY3JlYXRlU291cmNlRmlsZShmaWxlTmFtZSwgdmlydHVhbEZpbGUuY29kZSwgbGFuZ3VhZ2VWZXJzaW9uT3JPcHRpb25zLCB0cnVlLCBzY3JpcHRLaW5kKTtcbiAgICB9XG4gICAgcmV0dXJuIG9yaWdpbmFsR2V0U291cmNlRmlsZShmaWxlTmFtZSwgbGFuZ3VhZ2VWZXJzaW9uT3JPcHRpb25zLCBvbkVycm9yLCBzaG91bGRDcmVhdGVOZXdTb3VyY2VGaWxlKTtcbiAgfTtcblxuICBjb25zdCBwcm9ncmFtID0gY3JlYXRlUHJvZ3JhbSh7IGhvc3QsIG9wdGlvbnM6IGNvbXBpbGVyT3B0aW9ucywgcm9vdE5hbWVzIH0pO1xuICBjb25zdCBwcm9ibGVtczogRG9jc1NuaXBwZXRQcm9ibGVtW10gPSBbXTtcbiAgZm9yIChjb25zdCByb290TmFtZSBvZiByb290TmFtZXMpIHtcbiAgICBjb25zdCBzb3VyY2VGaWxlID0gcHJvZ3JhbS5nZXRTb3VyY2VGaWxlKHJvb3ROYW1lKTtcbiAgICBjb25zdCB2aXJ0dWFsRmlsZSA9IHZpcnR1YWxGaWxlcy5nZXQobm9ybWFsaXplUGF0aChyb290TmFtZSkpO1xuICAgIC8qIHY4IGlnbm9yZSBzdGFydCAtLSBFdmVyeSByb290IG5hbWUgaXMgYSB2aXJ0dWFsIGZpbGUgdGhlIHByb2dyYW0gd2FzIGJ1aWx0IGZyb20uICovXG4gICAgaWYgKCFzb3VyY2VGaWxlIHx8ICF2aXJ0dWFsRmlsZSkge1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIC8qIHY4IGlnbm9yZSBzdG9wICovXG4gICAgY29uc3QgaXNKYXZhU2NyaXB0ID0gcm9vdE5hbWUuZW5kc1dpdGgoJy5qcycpO1xuICAgIGNvbnN0IGRpYWdub3N0aWNzID0gWy4uLnByb2dyYW0uZ2V0U3ludGFjdGljRGlhZ25vc3RpY3Moc291cmNlRmlsZSksIC4uLnByb2dyYW0uZ2V0U2VtYW50aWNEaWFnbm9zdGljcyhzb3VyY2VGaWxlKV07XG4gICAgZm9yIChjb25zdCBkaWFnbm9zdGljIG9mIGRpYWdub3N0aWNzKSB7XG4gICAgICBpZiAoSUdOT1JFRF9ESUFHTk9TVElDX0NPREVTLmhhcyhkaWFnbm9zdGljLmNvZGUpIHx8IChpc0phdmFTY3JpcHQgJiYgSkFWQVNDUklQVF9JR05PUkVEX0RJQUdOT1NUSUNfQ09ERVMuaGFzKGRpYWdub3N0aWMuY29kZSkpKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgLyogdjggaWdub3JlIG5leHQgLS0gQSBkaWFnbm9zdGljIG9mIG9uZSBzb3VyY2UgZmlsZSBhbHdheXMgY2FycmllcyBpdHMgcG9zaXRpb24uICovXG4gICAgICBjb25zdCBmaWxlTGluZSA9IGRpYWdub3N0aWMuc3RhcnQgPT09IHVuZGVmaW5lZCA/IDAgOiBzb3VyY2VGaWxlLmdldExpbmVBbmRDaGFyYWN0ZXJPZlBvc2l0aW9uKGRpYWdub3N0aWMuc3RhcnQpLmxpbmU7XG4gICAgICBjb25zdCBzbmlwcGV0TGluZSA9IE1hdGgubWF4KDAsIGZpbGVMaW5lIC0gdmlydHVhbEZpbGUuY29udGV4dExpbmVDb3VudCk7XG4gICAgICBwcm9ibGVtcy5wdXNoKHtcbiAgICAgICAgZmlsZVBhdGg6IHZpcnR1YWxGaWxlLmZpbGVQYXRoLFxuICAgICAgICBsaW5lOiB2aXJ0dWFsRmlsZS5jb2RlU3RhcnRMaW5lICsgc25pcHBldExpbmUsXG4gICAgICAgIG1lc3NhZ2U6IGBUUyR7U3RyaW5nKGRpYWdub3N0aWMuY29kZSl9OiAke2ZsYXR0ZW5EaWFnbm9zdGljTWVzc2FnZVRleHQoZGlhZ25vc3RpYy5tZXNzYWdlVGV4dCwgJyAnKX1gXG4gICAgICB9KTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHByb2JsZW1zO1xufVxuXG5hc3luYyBmdW5jdGlvbiBsaXN0R3VpZGVzKGRpcmVjdG9yeTogc3RyaW5nKTogUHJvbWlzZTxzdHJpbmdbXT4ge1xuICBjb25zdCBndWlkZXM6IHN0cmluZ1tdID0gW107XG4gIGZvciAoY29uc3QgZW50cnkgb2YgYXdhaXQgcmVhZGRpcihkaXJlY3RvcnksIHsgd2l0aEZpbGVUeXBlczogdHJ1ZSB9KSkge1xuICAgIGNvbnN0IGVudHJ5UGF0aCA9IGpvaW4oZGlyZWN0b3J5LCBlbnRyeS5uYW1lKTtcbiAgICBpZiAoZW50cnkuaXNEaXJlY3RvcnkoKSkge1xuICAgICAgaWYgKGVudHJ5Lm5hbWUgIT09ICdhcGknKSB7XG4gICAgICAgIGd1aWRlcy5wdXNoKC4uLmF3YWl0IGxpc3RHdWlkZXMoZW50cnlQYXRoKSk7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmICgvXFwubWR4PyQvdS50ZXN0KGVudHJ5Lm5hbWUpKSB7XG4gICAgICBndWlkZXMucHVzaChlbnRyeVBhdGgpO1xuICAgIH1cbiAgfVxuICByZXR1cm4gZ3VpZGVzLnNvcnQoKTtcbn1cblxuZnVuY3Rpb24gbm9ybWFsaXplUGF0aChwYXRoOiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gdG9Qb3NpeChyZXNvbHZlKHBhdGgpKS50b0xvd2VyQ2FzZSgpO1xufVxuXG5mdW5jdGlvbiBzdHJpcFByZWZpeChsaW5lOiBzdHJpbmcsIHByZWZpeDogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIGxpbmUuc3RhcnRzV2l0aChwcmVmaXgpID8gbGluZS5zbGljZShwcmVmaXgubGVuZ3RoKSA6IGxpbmUucmVwbGFjZSgvXig/Olxccyo+KSpcXHM/L3UsICcnKTtcbn1cblxuZnVuY3Rpb24gdG9Qb3NpeChwYXRoOiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gcGF0aC5yZXBsYWNlQWxsKCdcXFxcJywgJy8nKTtcbn1cbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBOEJBLHNCQUdPO0FBQ1AsdUJBSU87QUFDUCx3QkFRTztBQUtQLE1BQU0sb0JBQWtELG9CQUFJLElBQUk7QUFBQSxFQUM5RCxDQUFDLGNBQWMsSUFBSTtBQUFBLEVBQ25CLENBQUMsTUFBTSxJQUFJO0FBQUEsRUFDWCxDQUFDLE1BQU0sS0FBSztBQUFBLEVBQ1osQ0FBQyxjQUFjLEtBQUs7QUFDdEIsQ0FBQztBQUtELE1BQU0sMEJBQTBCO0FBRWhDLE1BQU0saUJBQWlCO0FBS3ZCLE1BQU0sMkNBQTJDO0FBQ2pELE1BQU0sZ0NBQWdDO0FBQ3RDLE1BQU0scUNBQXFDO0FBQzNDLE1BQU0sOENBQThDO0FBQ3BELE1BQU0sMkJBQTJCLG9CQUFJLElBQUk7QUFBQSxFQUN2QztBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUNGLENBQUM7QUFNRCxNQUFNLHFDQUFxQztBQUMz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
@@ -0,0 +1,136 @@
1
+ /// <reference path="../library-references.d.cts" />
2
+ /**
3
+ * @file
4
+ *
5
+ * Extracts the code snippets of a package's documentation guides and type-checks them against its sources.
6
+ *
7
+ * A guide's snippet is code a reader copies, so a renamed member or a stale import path in it is a bug that ships
8
+ * to the site with every check green. Every fenced `ts`, `typescript`, `js` or `javascript` block in
9
+ * `docs/src/content/docs` is compiled as its own module, with the project's `tsconfig.json`, so an import of the
10
+ * package's own name resolves wherever that configuration sends it (its `paths`, or the `compilerOptions` passed
11
+ * here) and a wrong name fails. A `ts` / `typescript` block is compiled as TypeScript; a `js` / `javascript` block,
12
+ * often a devtools-console recipe, is compiled as JavaScript with `checkJs`, so a wrong member of a typed object
13
+ * still fails while an untyped lookup does not. The generated API reference (`docs/src/content/docs/api`) is
14
+ * skipped: it is rendered from the TSDoc.
15
+ *
16
+ * Three things shape what a snippet is compiled with, each but the first written in the guide as an HTML comment,
17
+ * invisible on the site, on the lines right above the fence:
18
+ *
19
+ * - The names every guide may use without declaring them are the package's `prelude`, compiled as a module of its
20
+ * own (a `declare global` block, with the imports it needs).
21
+ * - `<!-- snippet-check: context <TypeScript> -->` prepends declarations to that one snippet, for the names its
22
+ * prose has already introduced (`declare const linkEl: HTMLAnchorElement;`). Several such lines add up.
23
+ * - `<!-- snippet-check: skip <reason> -->` exempts a snippet that is deliberately not compilable, such as
24
+ * pseudo-code. The reason is required, so a skip is a decision somebody wrote down, never a silent hole.
25
+ */
26
+ import type { CompilerOptions } from 'typescript' with { 'resolution-mode': 'import' };
27
+ /**
28
+ * Parameters for {@link assertDocsSnippetsCompile}: the same as {@link findDocsSnippetProblems} takes.
29
+ */
30
+ export type AssertDocsSnippetsCompileParams = FindDocsSnippetProblemsParams;
31
+ /**
32
+ * One fenced code block of a guide.
33
+ */
34
+ export interface DocsSnippet {
35
+ /**
36
+ * The code, with any blockquote or indentation prefix of the fence stripped.
37
+ */
38
+ readonly code: string;
39
+ /**
40
+ * The 1-based line of the guide on which the code starts (the line after the opening fence).
41
+ */
42
+ readonly codeStartLine: number;
43
+ /**
44
+ * The declarations of the `snippet-check: context` markers above the fence, joined by newlines.
45
+ */
46
+ readonly context: string;
47
+ /**
48
+ * Whether the snippet is JavaScript rather than TypeScript.
49
+ */
50
+ readonly isJavaScript: boolean;
51
+ /**
52
+ * The language of the fence.
53
+ */
54
+ readonly language: string;
55
+ /**
56
+ * The reason given by a `snippet-check: skip` marker, or `null` when the snippet is checked.
57
+ */
58
+ readonly skipReason: null | string;
59
+ }
60
+ /**
61
+ * A problem found in a guide's snippet.
62
+ */
63
+ export interface DocsSnippetProblem {
64
+ /**
65
+ * The guide's path, relative to the package root.
66
+ */
67
+ readonly filePath: string;
68
+ /**
69
+ * The 1-based line of the guide.
70
+ */
71
+ readonly line: number;
72
+ /**
73
+ * What is wrong.
74
+ */
75
+ readonly message: string;
76
+ }
77
+ /**
78
+ * Parameters for {@link findDocsSnippetProblems}.
79
+ */
80
+ export interface FindDocsSnippetProblemsParams {
81
+ /**
82
+ * Compiler options laid over the ones `tsconfig.json` gives, for instance `paths` that resolve the package's own
83
+ * name onto its sources when its `tsconfig.json` has none. A relative path in them is not resolved, so pass
84
+ * absolute ones.
85
+ */
86
+ readonly compilerOptions?: CompilerOptions;
87
+ /**
88
+ * The guides directory, relative to {@link FindDocsSnippetProblemsParams.rootDirectory}.
89
+ *
90
+ * @default `'docs/src/content/docs'`
91
+ */
92
+ readonly docsDirectory?: string;
93
+ /**
94
+ * The ambient context every snippet is compiled with: the names a guide may use without declaring them, written as
95
+ * a module (`declare global { ... }`, with the imports it needs).
96
+ *
97
+ * @default `''`, no prelude.
98
+ */
99
+ readonly prelude?: string;
100
+ /**
101
+ * The package root, holding `tsconfig.json`.
102
+ */
103
+ readonly rootDirectory: string;
104
+ }
105
+ /**
106
+ * Type-checks every snippet of the guides and throws when one fails, for a `docs:check-snippets` script.
107
+ *
108
+ * @param params - The {@link AssertDocsSnippetsCompileParams}.
109
+ * @returns A promise that resolves when every snippet compiles.
110
+ * @throws {Error} Listing every problem, one per line.
111
+ */
112
+ export declare function assertDocsSnippetsCompile(params: AssertDocsSnippetsCompileParams): Promise<void>;
113
+ /**
114
+ * Extracts the fenced code blocks of the checked languages from a markdown document.
115
+ *
116
+ * A fence inside a blockquote or a list item is recognized too: its prefix (`> `, indentation) is stripped from
117
+ * every line of its code.
118
+ *
119
+ * @param markdown - The markdown document.
120
+ * @returns The snippets, in document order.
121
+ */
122
+ export declare function extractDocsSnippets(markdown: string): DocsSnippet[];
123
+ /**
124
+ * Type-checks every snippet of the guides.
125
+ *
126
+ * @param params - The {@link FindDocsSnippetProblemsParams}.
127
+ * @returns The problems found, empty when every snippet compiles.
128
+ */
129
+ export declare function findDocsSnippetProblems(params: FindDocsSnippetProblemsParams): Promise<DocsSnippetProblem[]>;
130
+ /**
131
+ * Formats problems one per line, as `path:line - message`.
132
+ *
133
+ * @param problems - The problems.
134
+ * @returns The formatted text.
135
+ */
136
+ export declare function formatDocsSnippetProblems(problems: readonly DocsSnippetProblem[]): string;