obsidian-dev-utils 3.39.0 → 3.41.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.
@@ -2,9 +2,6 @@
2
2
  * @packageDocumentation FrontMatter
3
3
  * This module provides utility functions for processing and managing YAML front matter in Obsidian notes.
4
4
  */
5
- import { App } from 'obsidian';
6
- import type { MaybePromise, RetryOptions } from '../Async.ts';
7
- import type { PathOrFile } from './FileSystem.ts';
8
5
  /**
9
6
  * Represents the front matter of an Obsidian file.
10
7
  * @see {@link https://help.obsidian.md/Editing+and+formatting/Properties#Default+properties}
@@ -56,31 +53,17 @@ export interface ObsidianPublishFrontMatter {
56
53
  */
57
54
  export type CombinedFrontMatter<CustomFrontMatter> = CustomFrontMatter & ObsidianFrontMatter & Record<string, unknown>;
58
55
  /**
59
- * Processes the front matter of a given file, allowing modifications via a provided function.
56
+ * Parses the front matter of a given content string.
60
57
  *
61
- * @typeParam CustomFrontMatter - The type of custom front matter.
62
- * @param app - The Obsidian app instance.
63
- * @param pathOrFile - The path or TFile object representing the note.
64
- * @param frontMatterFn - A function that modifies the front matter.
65
- * @param retryOptions - Optional. Configuration options for retrying the process. If not provided, default options will be used.
66
- * @returns A promise that resolves when the front matter has been processed and saved.
67
- */
68
- export declare function processFrontMatter<CustomFrontMatter = unknown>(app: App, pathOrFile: PathOrFile, frontMatterFn: (frontMatter: CombinedFrontMatter<CustomFrontMatter>) => MaybePromise<void | null>, retryOptions?: Partial<RetryOptions>): Promise<void>;
69
- /**
70
- * Adds an alias to the front matter of a given file if it does not already exist.
71
- *
72
- * @param app - The Obsidian app instance.
73
- * @param pathOrFile - The path or TFile object representing the note.
74
- * @param alias - The alias to add.
75
- * @returns A promise that resolves when the alias has been added.
58
+ * @param content - The content string to parse.
59
+ * @returns The parsed front matter.
76
60
  */
77
- export declare function addAlias(app: App, pathOrFile: PathOrFile, alias?: string): Promise<void>;
61
+ export declare function parseFrontMatter<CustomFrontMatter = unknown>(content: string): CombinedFrontMatter<CustomFrontMatter>;
78
62
  /**
79
- * Deletes an alias from the front matter of a given file if it exists.
63
+ * Sets the front matter of a given content string.
80
64
  *
81
- * @param app - The Obsidian app instance.
82
- * @param pathOrFile - The path or TFile object representing the note.
83
- * @param alias - The alias to delete.
84
- * @returns A promise that resolves when the alias has been deleted.
65
+ * @param content - The content string to set the front matter in.
66
+ * @param newFrontMatter - The new front matter to set.
67
+ * @returns The new content string with the front matter set.
85
68
  */
86
- export declare function deleteAlias(app: App, pathOrFile: PathOrFile, alias?: string): Promise<void>;
69
+ export declare function setFrontMatter(content: string, newFrontMatter: object): string;
@@ -40,12 +40,13 @@ __export(Link_exports, {
40
40
  });
41
41
  module.exports = __toCommonJS(Link_exports);
42
42
  var import_obsidian = require('obsidian');
43
+ var import_implementations = require('obsidian-typings/implementations');
43
44
  var import_Path = require('../Path.cjs');
44
45
  var import_String = require('../String.cjs');
46
+ var import_FileChange = require('./FileChange.cjs');
45
47
  var import_FileSystem = require('./FileSystem.cjs');
46
48
  var import_MetadataCache = require('./MetadataCache.cjs');
47
49
  var import_ObsidianSettings = require('./ObsidianSettings.cjs');
48
- var import_Vault = require('./Vault.cjs');
49
50
  const SPECIAL_LINK_SYMBOLS_REGEXP = /[\\\x00\x08\x0B\x0C\x0E-\x1F ]/g;
50
51
  const SPECIAL_MARKDOWN_LINK_SYMBOLS_REGEX = /[\\[\]<>_*~=`$]/g;
51
52
  function splitSubpath(link) {
@@ -234,7 +235,7 @@ function generateMarkdownLink(options) {
234
235
  });
235
236
  }
236
237
  async function editLinks(app, pathOrFile, linkConverter, retryOptions = {}) {
237
- await (0, import_Vault.applyFileChanges)(app, pathOrFile, async () => {
238
+ await (0, import_FileChange.applyFileChanges)(app, pathOrFile, async () => {
238
239
  const cache = await (0, import_MetadataCache.getCacheSafe)(app, pathOrFile);
239
240
  if (!cache) {
240
241
  return [];
@@ -245,12 +246,20 @@ async function editLinks(app, pathOrFile, linkConverter, retryOptions = {}) {
245
246
  if (newContent === void 0) {
246
247
  continue;
247
248
  }
248
- changes.push({
249
- startIndex: link.position.start.offset,
250
- endIndex: link.position.end.offset,
251
- oldContent: link.original,
252
- newContent
253
- });
249
+ if ((0, import_implementations.isReferenceCache)(link)) {
250
+ changes.push({
251
+ startIndex: link.position.start.offset,
252
+ endIndex: link.position.end.offset,
253
+ oldContent: link.original,
254
+ newContent
255
+ });
256
+ } else if ((0, import_implementations.isFrontmatterLinkCache)(link)) {
257
+ changes.push({
258
+ oldContent: link.original,
259
+ newContent,
260
+ frontMatterKey: link.key
261
+ });
262
+ }
254
263
  }
255
264
  return changes;
256
265
  }, retryOptions);
@@ -282,4 +291,4 @@ function testAngleBrackets(link) {
282
291
  updateLink,
283
292
  updateLinksInFile
284
293
  });
285
- //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL29ic2lkaWFuL0xpbmsudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbIi8qKlxuICogQHBhY2thZ2VEb2N1bWVudGF0aW9uIExpbmtcbiAqIFRoaXMgbW9kdWxlIHByb3ZpZGVzIHV0aWxpdGllcyBmb3IgaGFuZGxpbmcgYW5kIHVwZGF0aW5nIGxpbmtzIHdpdGhpbiBPYnNpZGlhbiB2YXVsdHMuIEl0IGluY2x1ZGVzXG4gKiBmdW5jdGlvbnMgdG8gc3BsaXQgcGF0aHMsIHVwZGF0ZSBsaW5rcyBpbiBmaWxlcywgYW5kIGdlbmVyYXRlIG1hcmtkb3duIGxpbmtzIHdpdGggdmFyaW91cyBvcHRpb25zLlxuICogVGhlIGZ1bmN0aW9ucyBpbnRlZ3JhdGUgd2l0aCBPYnNpZGlhbidzIEFQSSB0byBlbnN1cmUgdGhhdCBsaW5rcyBhcmUgbWFuYWdlZCBjb3JyZWN0bHkgd2l0aGluIHRoZSB2YXVsdC5cbiAqKi9cblxuaW1wb3J0IHR5cGUge1xuICBBcHAsXG4gIFJlZmVyZW5jZUNhY2hlLFxuICBURmlsZVxufSBmcm9tICdvYnNpZGlhbic7XG5pbXBvcnQge1xuICBub3JtYWxpemVQYXRoLFxuICBwYXJzZUxpbmt0ZXh0XG59IGZyb20gJ29ic2lkaWFuJztcblxuaW1wb3J0IHR5cGUge1xuICBNYXliZVByb21pc2UsXG4gIFJldHJ5T3B0aW9uc1xufSBmcm9tICcuLi9Bc3luYy50cyc7XG5pbXBvcnQge1xuICBiYXNlbmFtZSxcbiAgZGlybmFtZSxcbiAgZXh0bmFtZSxcbiAgam9pbixcbiAgcmVsYXRpdmVcbn0gZnJvbSAnLi4vUGF0aC50cyc7XG5pbXBvcnQgeyBub3JtYWxpemUgfSBmcm9tICcuLi9TdHJpbmcudHMnO1xuaW1wb3J0IHR5cGUgeyBQYXRoT3JGaWxlIH0gZnJvbSAnLi9GaWxlU3lzdGVtLnRzJztcbmltcG9ydCB7XG4gIGdldEZpbGUsXG4gIGdldFBhdGgsXG4gIGlzTWFya2Rvd25GaWxlLFxuICB0cmltTWFya2Rvd25FeHRlbnNpb25cbn0gZnJvbSAnLi9GaWxlU3lzdGVtLnRzJztcbmltcG9ydCB7XG4gIGdldEFsbExpbmtzLFxuICBnZXRDYWNoZVNhZmUsXG4gIHRlbXBSZWdpc3RlckZpbGVBbmRSdW5cbn0gZnJvbSAnLi9NZXRhZGF0YUNhY2hlLnRzJztcbmltcG9ydCB7XG4gIHNob3VsZFVzZVJlbGF0aXZlTGlua3MsXG4gIHNob3VsZFVzZVdpa2lsaW5rc1xufSBmcm9tICcuL09ic2lkaWFuU2V0dGluZ3MudHMnO1xuaW1wb3J0IHR5cGUgeyBGaWxlQ2hhbmdlIH0gZnJvbSAnLi9WYXVsdC50cyc7XG5pbXBvcnQgeyBhcHBseUZpbGVDaGFuZ2VzIH0gZnJvbSAnLi9WYXVsdC50cyc7XG5cbi8qKlxuICogUmVndWxhciBleHByZXNzaW9uIGZvciBzcGVjaWFsIGxpbmsgc3ltYm9scy5cbiAqL1xuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWNvbnRyb2wtcmVnZXhcbmNvbnN0IFNQRUNJQUxfTElOS19TWU1CT0xTX1JFR0VYUCA9IC9bXFxcXFxceDAwXFx4MDhcXHgwQlxceDBDXFx4MEUtXFx4MUYgXS9nO1xuXG4vKipcbiAqIFJlZ3VsYXIgZXhwcmVzc2lvbiBmb3Igc3BlY2lhbCBtYXJrZG93biBsaW5rIHN5bWJvbHMuXG4gKi9cbmNvbnN0IFNQRUNJQUxfTUFSS0RPV05fTElOS19TWU1CT0xTX1JFR0VYID0gL1tcXFxcW1xcXTw+Xyp+PWAkXS9nO1xuXG4vKipcbiAqIFNwbGl0cyBhIGxpbmsgaW50byBpdHMgbGluayBwYXRoIGFuZCBzdWJwYXRoLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFNwbGl0U3VicGF0aFJlc3VsdCB7XG4gIC8qKlxuICAgKiBUaGUgbGluayBwYXRoLlxuICAgKi9cbiAgbGlua1BhdGg6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIHN1YnBhdGguXG4gICAqL1xuICBzdWJwYXRoOiBzdHJpbmc7XG59XG5cbi8qKlxuICogU3BsaXRzIGEgbGluayBpbnRvIGl0cyBsaW5rIHBhdGggYW5kIHN1YnBhdGguXG4gKlxuICogQHBhcmFtIGxpbmsgLSBUaGUgbGluayB0byBzcGxpdC5cbiAqIEByZXR1cm5zIEFuIG9iamVjdCBjb250YWluaW5nIHRoZSBsaW5rIHBhdGggYW5kIHN1YnBhdGguXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzcGxpdFN1YnBhdGgobGluazogc3RyaW5nKTogU3BsaXRTdWJwYXRoUmVzdWx0IHtcbiAgY29uc3QgcGFyc2VkID0gcGFyc2VMaW5rdGV4dChub3JtYWxpemUobGluaykpO1xuICByZXR1cm4ge1xuICAgIGxpbmtQYXRoOiBwYXJzZWQucGF0aCxcbiAgICBzdWJwYXRoOiBwYXJzZWQuc3VicGF0aFxuICB9O1xufVxuXG4vKipcbiAqIE9wdGlvbnMgZm9yIHVwZGF0aW5nIGxpbmtzIGluIGEgZmlsZS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBVcGRhdGVMaW5rc0luRmlsZU9wdGlvbnMge1xuICAvKipcbiAgICogVGhlIG9ic2lkaWFuIGFwcCBpbnN0YW5jZS5cbiAgICovXG4gIGFwcDogQXBwO1xuXG4gIC8qKlxuICAgKiBUaGUgZmlsZSB0byB1cGRhdGUgdGhlIGxpbmtzIGluLlxuICAgKi9cbiAgcGF0aE9yRmlsZTogUGF0aE9yRmlsZTtcblxuICAvKipcbiAgICogVGhlIG9sZCBwYXRoIG9mIHRoZSBmaWxlLlxuICAgKi9cbiAgb2xkUGF0aE9yRmlsZT86IFBhdGhPckZpbGUgfCB1bmRlZmluZWQ7XG5cbiAgLyoqXG4gICAqIEEgbWFwIG9mIG9sZCBhbmQgbmV3IHBhdGhzIGZvciByZW5hbWluZyBsaW5rcy5cbiAgICovXG4gIHJlbmFtZU1hcD86IE1hcDxzdHJpbmcsIHN0cmluZz4gfCB1bmRlZmluZWQ7XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdG8gZm9yY2UgdGhlIGxpbmtzIHRvIGJlIGluIE1hcmtkb3duIGZvcm1hdC5cbiAgICovXG4gIGZvcmNlTWFya2Rvd25MaW5rcz86IGJvb2xlYW4gfCB1bmRlZmluZWQ7XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdG8gdXBkYXRlIG9ubHkgZW1iZWRkZWQgbGlua3MuXG4gICAqL1xuICBlbWJlZE9ubHlMaW5rcz86IGJvb2xlYW4gfCB1bmRlZmluZWQ7XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdG8gdXBkYXRlIGZpbGVuYW1lIGFsaWFzLiBEZWZhdWx0cyB0byBgdHJ1ZWAuXG4gICAqL1xuICBzaG91bGRVcGRhdGVGaWxlbmFtZUFsaWFzPzogYm9vbGVhbiB8IHVuZGVmaW5lZDtcbn1cblxuLyoqXG4gKiBVcGRhdGVzIHRoZSBsaW5rcyBpbiBhIGZpbGUgYmFzZWQgb24gdGhlIHByb3ZpZGVkIHBhcmFtZXRlcnMuXG4gKlxuICogQHBhcmFtIG9wdGlvbnMgLSBUaGUgb3B0aW9ucyBmb3IgdXBkYXRpbmcgdGhlIGxpbmtzLlxuICogQHJldHVybnMgQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgd2hlbiB0aGUgbGlua3MgYXJlIHVwZGF0ZWQuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiB1cGRhdGVMaW5rc0luRmlsZShvcHRpb25zOiBVcGRhdGVMaW5rc0luRmlsZU9wdGlvbnMpOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3Qge1xuICAgIGFwcCxcbiAgICBwYXRoT3JGaWxlLFxuICAgIG9sZFBhdGhPckZpbGUsXG4gICAgcmVuYW1lTWFwLFxuICAgIGZvcmNlTWFya2Rvd25MaW5rcyxcbiAgICBlbWJlZE9ubHlMaW5rcyxcbiAgICBzaG91bGRVcGRhdGVGaWxlbmFtZUFsaWFzXG4gIH0gPSBvcHRpb25zO1xuICBhd2FpdCBlZGl0TGlua3MoYXBwLCBwYXRoT3JGaWxlLCAobGluaykgPT4ge1xuICAgIGNvbnN0IGlzRW1iZWRMaW5rID0gdGVzdEVtYmVkKGxpbmsub3JpZ2luYWwpO1xuICAgIGlmIChlbWJlZE9ubHlMaW5rcyAhPT0gdW5kZWZpbmVkICYmIGVtYmVkT25seUxpbmtzICE9PSBpc0VtYmVkTGluaykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICByZXR1cm4gY29udmVydExpbmsoe1xuICAgICAgYXBwLFxuICAgICAgbGluayxcbiAgICAgIHNvdXJjZVBhdGhPckZpbGU6IHBhdGhPckZpbGUsXG4gICAgICBvbGRQYXRoT3JGaWxlLFxuICAgICAgcmVuYW1lTWFwLFxuICAgICAgZm9yY2VNYXJrZG93bkxpbmtzLFxuICAgICAgc2hvdWxkVXBkYXRlRmlsZW5hbWVBbGlhc1xuICAgIH0pO1xuICB9KTtcbn1cblxuLyoqXG4gKiBPcHRpb25zIGZvciBjb252ZXJ0aW5nIGEgbGluay5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDb252ZXJ0TGlua09wdGlvbnMge1xuICAvKipcbiAgICogVGhlIE9ic2lkaWFuIGFwcCBpbnN0YW5jZS5cbiAgICovXG4gIGFwcDogQXBwO1xuXG4gIC8qKlxuICAgKiBUaGUgcmVmZXJlbmNlIGNhY2hlIGZvciB0aGUgbGluay5cbiAgICovXG4gIGxpbms6IFJlZmVyZW5jZUNhY2hlO1xuXG4gIC8qKlxuICAgKiBUaGUgc291cmNlIGZpbGUgY29udGFpbmluZyB0aGUgbGluay5cbiAgICovXG4gIHNvdXJjZVBhdGhPckZpbGU6IFBhdGhPckZpbGU7XG5cbiAgLyoqXG4gICAqIFRoZSBvbGQgcGF0aCBvZiB0aGUgbGluay5cbiAgICovXG4gIG9sZFBhdGhPckZpbGU/OiBQYXRoT3JGaWxlIHwgdW5kZWZpbmVkO1xuXG4gIC8qKlxuICAgKiBBIG1hcCBvZiBvbGQgYW5kIG5ldyBmaWxlIHBhdGhzLlxuICAgKi9cbiAgcmVuYW1lTWFwPzogTWFwPHN0cmluZywgc3RyaW5nPiB8IHVuZGVmaW5lZDtcblxuICAvKipcbiAgICogV2hldGhlciB0byBmb3JjZSBtYXJrZG93biBsaW5rcy5cbiAgICovXG4gIGZvcmNlTWFya2Rvd25MaW5rcz86IGJvb2xlYW4gfCB1bmRlZmluZWQ7XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdG8gdXBkYXRlIGZpbGVuYW1lIGFsaWFzLiBEZWZhdWx0cyB0byBgdHJ1ZWAuXG4gICAqL1xuICBzaG91bGRVcGRhdGVGaWxlbmFtZUFsaWFzPzogYm9vbGVhbiB8IHVuZGVmaW5lZDtcbn1cblxuLyoqXG4gKiBDb252ZXJ0cyBhIGxpbmsgdG8gYSBuZXcgcGF0aC5cbiAqXG4gKiBAcGFyYW0gb3B0aW9ucyAtIFRoZSBvcHRpb25zIGZvciBjb252ZXJ0aW5nIHRoZSBsaW5rLlxuICogQHJldHVybnMgVGhlIGNvbnZlcnRlZCBsaW5rLlxuICovXG5leHBvcnQgZnVuY3Rpb24gY29udmVydExpbmsob3B0aW9uczogQ29udmVydExpbmtPcHRpb25zKTogc3RyaW5nIHtcbiAgcmV0dXJuIHVwZGF0ZUxpbmsoe1xuICAgIGFwcDogb3B0aW9ucy5hcHAsXG4gICAgbGluazogb3B0aW9ucy5saW5rLFxuICAgIHBhdGhPckZpbGU6IGV4dHJhY3RMaW5rRmlsZShvcHRpb25zLmFwcCwgb3B0aW9ucy5saW5rLCBvcHRpb25zLnNvdXJjZVBhdGhPckZpbGUpLFxuICAgIG9sZFBhdGhPckZpbGU6IG9wdGlvbnMub2xkUGF0aE9yRmlsZSxcbiAgICBzb3VyY2VQYXRoT3JGaWxlOiBvcHRpb25zLnNvdXJjZVBhdGhPckZpbGUsXG4gICAgcmVuYW1lTWFwOiBvcHRpb25zLnJlbmFtZU1hcCxcbiAgICBmb3JjZU1hcmtkb3duTGlua3M6IG9wdGlvbnMuZm9yY2VNYXJrZG93bkxpbmtzLFxuICAgIHNob3VsZFVwZGF0ZUZpbGVuYW1lQWxpYXM6IG9wdGlvbnMuc2hvdWxkVXBkYXRlRmlsZW5hbWVBbGlhc1xuICB9KTtcbn1cblxuLyoqXG4gKiBFeHRyYWN0cyB0aGUgZmlsZSBhc3NvY2lhdGVkIHdpdGggYSBsaW5rLlxuICpcbiAqIEBwYXJhbSBhcHAgLSBUaGUgT2JzaWRpYW4gYXBwbGljYXRpb24gaW5zdGFuY2UuXG4gKiBAcGFyYW0gbGluayAtIFRoZSByZWZlcmVuY2UgY2FjaGUgZm9yIHRoZSBsaW5rLlxuICogQHBhcmFtIG5vdGVQYXRoT3JGaWxlIC0gVGhlIHBhdGggb3IgZmlsZSBvZiB0aGUgbm90ZSBjb250YWluaW5nIHRoZSBsaW5rLlxuICogQHJldHVybnMgVGhlIGZpbGUgYXNzb2NpYXRlZCB3aXRoIHRoZSBsaW5rLCBvciBudWxsIGlmIG5vdCBmb3VuZC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGV4dHJhY3RMaW5rRmlsZShhcHA6IEFwcCwgbGluazogUmVmZXJlbmNlQ2FjaGUsIG5vdGVQYXRoT3JGaWxlOiBQYXRoT3JGaWxlKTogVEZpbGUgfCBudWxsIHtcbiAgY29uc3QgeyBsaW5rUGF0aCB9ID0gc3BsaXRTdWJwYXRoKGxpbmsubGluayk7XG4gIHJldHVybiBhcHAubWV0YWRhdGFDYWNoZS5nZXRGaXJzdExpbmtwYXRoRGVzdChsaW5rUGF0aCwgZ2V0UGF0aChub3RlUGF0aE9yRmlsZSkpO1xufVxuXG4vKipcbiAqIE9wdGlvbnMgZm9yIHVwZGF0aW5nIGEgbGluay5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBVcGRhdGVMaW5rT3B0aW9ucyB7XG4gIC8qKlxuICAgKiBUaGUgT2JzaWRpYW4gYXBwIGluc3RhbmNlLlxuICAgKi9cbiAgYXBwOiBBcHA7XG5cbiAgLyoqXG4gICAqIFRoZSByZWZlcmVuY2UgY2FjaGUgZm9yIHRoZSBsaW5rLlxuICAgKi9cbiAgbGluazogUmVmZXJlbmNlQ2FjaGU7XG5cbiAgLyoqXG4gICAqIFRoZSBmaWxlIGFzc29jaWF0ZWQgd2l0aCB0aGUgbGluay5cbiAgICovXG4gIHBhdGhPckZpbGU6IFBhdGhPckZpbGUgfCBudWxsO1xuXG4gIC8qKlxuICAgKiBUaGUgb2xkIHBhdGggb2YgdGhlIGZpbGUuXG4gICAqL1xuICBvbGRQYXRoT3JGaWxlPzogUGF0aE9yRmlsZSB8IHVuZGVmaW5lZDtcblxuICAvKipcbiAgICogVGhlIHNvdXJjZSBmaWxlIGNvbnRhaW5pbmcgdGhlIGxpbmsuXG4gICAqL1xuICBzb3VyY2VQYXRoT3JGaWxlOiBQYXRoT3JGaWxlO1xuXG4gIC8qKlxuICAgKiBBIG1hcCBvZiBvbGQgYW5kIG5ldyBmaWxlIHBhdGhzLlxuICAgKi9cbiAgcmVuYW1lTWFwPzogTWFwPHN0cmluZywgc3RyaW5nPiB8IHVuZGVmaW5lZDtcblxuICAvKipcbiAgICogV2hldGhlciB0byBmb3JjZSBtYXJrZG93biBsaW5rcy5cbiAgICovXG4gIGZvcmNlTWFya2Rvd25MaW5rcz86IGJvb2xlYW4gfCB1bmRlZmluZWQ7XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdG8gdXBkYXRlIGZpbGVuYW1lIGFsaWFzLiBEZWZhdWx0cyB0byBgdHJ1ZWAuXG4gICAqL1xuICBzaG91bGRVcGRhdGVGaWxlbmFtZUFsaWFzPzogYm9vbGVhbiB8IHVuZGVmaW5lZDtcbn1cblxuLyoqXG4gKiBVcGRhdGVzIGEgbGluayBiYXNlZCBvbiB0aGUgcHJvdmlkZWQgcGFyYW1ldGVycy5cbiAqXG4gKiBAcGFyYW0gb3B0aW9ucyAtIFRoZSBvcHRpb25zIGZvciB1cGRhdGluZyB0aGUgbGluay5cbiAqIEByZXR1cm5zIFRoZSB1cGRhdGVkIGxpbmsuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB1cGRhdGVMaW5rKG9wdGlvbnM6IFVwZGF0ZUxpbmtPcHRpb25zKTogc3RyaW5nIHtcbiAgY29uc3Qge1xuICAgIGFwcCxcbiAgICBsaW5rLFxuICAgIHBhdGhPckZpbGUsXG4gICAgb2xkUGF0aE9yRmlsZSxcbiAgICBzb3VyY2VQYXRoT3JGaWxlLFxuICAgIHJlbmFtZU1hcCxcbiAgICBmb3JjZU1hcmtkb3duTGlua3MsXG4gICAgc2hvdWxkVXBkYXRlRmlsZW5hbWVBbGlhc1xuICB9ID0gb3B0aW9ucztcbiAgaWYgKCFwYXRoT3JGaWxlKSB7XG4gICAgcmV0dXJuIGxpbmsub3JpZ2luYWw7XG4gIH1cbiAgbGV0IGZpbGUgPSBnZXRGaWxlKGFwcCwgcGF0aE9yRmlsZSk7XG4gIGNvbnN0IG9sZFBhdGggPSBnZXRQYXRoKG9sZFBhdGhPckZpbGUgPz8gc291cmNlUGF0aE9yRmlsZSk7XG4gIGNvbnN0IGlzV2lraWxpbmsgPSB0ZXN0V2lraWxpbmsobGluay5vcmlnaW5hbCkgJiYgZm9yY2VNYXJrZG93bkxpbmtzICE9PSB0cnVlO1xuICBjb25zdCB7IHN1YnBhdGggfSA9IHNwbGl0U3VicGF0aChsaW5rLmxpbmspO1xuXG4gIGNvbnN0IG5ld1BhdGggPSByZW5hbWVNYXA/LmdldChmaWxlLnBhdGgpO1xuICBsZXQgYWxpYXMgPSBzaG91bGRSZXNldEFsaWFzKHtcbiAgICBhcHAsXG4gICAgZGlzcGxheVRleHQ6IGxpbmsuZGlzcGxheVRleHQsXG4gICAgcGF0aE9yRmlsZSxcbiAgICBvdGhlclBhdGhPckZpbGVzOiBbb2xkUGF0aCwgbmV3UGF0aF0sXG4gICAgc291cmNlUGF0aE9yRmlsZSxcbiAgICBpc1dpa2lsaW5rXG4gIH0pXG4gICAgPyB1bmRlZmluZWRcbiAgICA6IGxpbmsuZGlzcGxheVRleHQ7XG5cbiAgaWYgKHNob3VsZFVwZGF0ZUZpbGVuYW1lQWxpYXMgPz8gdHJ1ZSkge1xuICAgIGlmIChhbGlhcz8udG9Mb3dlckNhc2UoKSA9PT0gYmFzZW5hbWUob2xkUGF0aCwgZXh0bmFtZShvbGRQYXRoKSkudG9Mb3dlckNhc2UoKSkge1xuICAgICAgYWxpYXMgPSBmaWxlLmJhc2VuYW1lO1xuICAgIH0gZWxzZSBpZiAoYWxpYXM/LnRvTG93ZXJDYXNlKCkgPT09IGJhc2VuYW1lKG9sZFBhdGgpLnRvTG93ZXJDYXNlKCkpIHtcbiAgICAgIGFsaWFzID0gZmlsZS5uYW1lO1xuICAgIH1cbiAgfVxuXG4gIGlmIChuZXdQYXRoKSB7XG4gICAgZmlsZSA9IGdldEZpbGUoYXBwLCBuZXdQYXRoLCB0cnVlKTtcbiAgfVxuXG4gIGNvbnN0IG5ld0xpbmsgPSBnZW5lcmF0ZU1hcmtkb3duTGluayh7XG4gICAgYXBwLFxuICAgIHBhdGhPckZpbGU6IGZpbGUsXG4gICAgc291cmNlUGF0aE9yRmlsZSxcbiAgICBzdWJwYXRoLFxuICAgIGFsaWFzLFxuICAgIGlzV2lraWxpbms6IGZvcmNlTWFya2Rvd25MaW5rcyA/IGZhbHNlIDogdW5kZWZpbmVkLFxuICAgIG9yaWdpbmFsTGluazogbGluay5vcmlnaW5hbFxuICB9KTtcbiAgcmV0dXJuIG5ld0xpbms7XG59XG5cbi8qKlxuICogT3B0aW9ucyBmb3IgZGV0ZXJtaW5pbmcgaWYgdGhlIGFsaWFzIG9mIGEgbGluayBzaG91bGQgYmUgcmVzZXQuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU2hvdWxkUmVzZXRBbGlhc09wdGlvbnMge1xuICAvKipcbiAgICogVGhlIE9ic2lkaWFuIGFwcCBpbnN0YW5jZS5cbiAgICovXG4gIGFwcDogQXBwO1xuXG4gIC8qKlxuICAgKiBUaGUgZGlzcGxheSB0ZXh0IG9mIHRoZSBsaW5rLlxuICAgKi9cbiAgZGlzcGxheVRleHQ6IHN0cmluZyB8IHVuZGVmaW5lZDtcblxuICAvKipcbiAgICogVGhlIHBhdGggb3IgZmlsZSBvZiB0aGUgbGluay5cbiAgICovXG4gIHBhdGhPckZpbGU6IFBhdGhPckZpbGU7XG5cbiAgLyoqXG4gICAqIE90aGVyIHBhdGhzIGFzc29jaWF0ZWQgd2l0aCB0aGUgbGluay5cbiAgICovXG4gIG90aGVyUGF0aE9yRmlsZXM6IChQYXRoT3JGaWxlIHwgdW5kZWZpbmVkKVtdO1xuXG4gIC8qKlxuICAgKiBUaGUgc291cmNlIHBhdGggb2YgdGhlIGxpbmsuXG4gICAqL1xuICBzb3VyY2VQYXRoT3JGaWxlOiBQYXRoT3JGaWxlO1xuXG4gIC8qKlxuICAgKiBJbmRpY2F0ZXMgaWYgdGhlIGxpbmsgaXMgYSB3aWtpbGluay5cbiAgICovXG4gIGlzV2lraWxpbms/OiBib29sZWFuIHwgdW5kZWZpbmVkO1xufVxuXG4vKipcbiAqIERldGVybWluZXMgaWYgdGhlIGFsaWFzIG9mIGEgbGluayBzaG91bGQgYmUgcmVzZXQuXG4gKlxuICogQHBhcmFtIG9wdGlvbnMgLSBUaGUgb3B0aW9ucyBmb3IgZGV0ZXJtaW5pbmcgaWYgdGhlIGFsaWFzIHNob3VsZCBiZSByZXNldC5cbiAqIEByZXR1cm5zIFdoZXRoZXIgdGhlIGFsaWFzIHNob3VsZCBiZSByZXNldC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNob3VsZFJlc2V0QWxpYXMob3B0aW9uczogU2hvdWxkUmVzZXRBbGlhc09wdGlvbnMpOiBib29sZWFuIHtcbiAgY29uc3Qge1xuICAgIGFwcCxcbiAgICBkaXNwbGF5VGV4dCxcbiAgICBwYXRoT3JGaWxlLFxuICAgIG90aGVyUGF0aE9yRmlsZXMsXG4gICAgc291cmNlUGF0aE9yRmlsZSxcbiAgICBpc1dpa2lsaW5rXG4gIH0gPSBvcHRpb25zO1xuICBpZiAoaXNXaWtpbGluayA9PT0gZmFsc2UpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBjb25zdCBmaWxlID0gZ2V0RmlsZShhcHAsIHBhdGhPckZpbGUpO1xuXG4gIGlmICghZGlzcGxheVRleHQpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIGNvbnN0IHNvdXJjZVBhdGggPSBnZXRQYXRoKHNvdXJjZVBhdGhPckZpbGUpO1xuICBjb25zdCBzb3VyY2VEaXIgPSBkaXJuYW1lKHNvdXJjZVBhdGgpO1xuXG4gIGNvbnN0IGFsaWFzZXNUb1Jlc2V0ID0gbmV3IFNldDxzdHJpbmc+KCk7XG5cbiAgZm9yIChjb25zdCBwYXRoT3JGaWxlIG9mIFtmaWxlLnBhdGgsIC4uLm90aGVyUGF0aE9yRmlsZXNdKSB7XG4gICAgaWYgKCFwYXRoT3JGaWxlKSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICBjb25zdCBwYXRoID0gZ2V0UGF0aChwYXRoT3JGaWxlKTtcbiAgICBhbGlhc2VzVG9SZXNldC5hZGQocGF0aCk7XG4gICAgYWxpYXNlc1RvUmVzZXQuYWRkKGJhc2VuYW1lKHBhdGgpKTtcbiAgICBhbGlhc2VzVG9SZXNldC5hZGQocmVsYXRpdmUoc291cmNlRGlyLCBwYXRoKSk7XG4gIH1cblxuICBhbGlhc2VzVG9SZXNldC5hZGQoYXBwLm1ldGFkYXRhQ2FjaGUuZmlsZVRvTGlua3RleHQoZmlsZSwgc291cmNlUGF0aCwgZmFsc2UpKTtcblxuICBjb25zdCBjbGVhbkRpc3BsYXlUZXh0ID0gbm9ybWFsaXplUGF0aChkaXNwbGF5VGV4dC5zcGxpdCgnID4gJylbMF0gPz8gJycpLnJlcGxhY2UoL15cXC5cXC8vLCAnJykudG9Mb3dlckNhc2UoKTtcblxuICBmb3IgKGNvbnN0IGFsaWFzIG9mIGFsaWFzZXNUb1Jlc2V0KSB7XG4gICAgaWYgKGFsaWFzLnRvTG93ZXJDYXNlKCkgPT09IGNsZWFuRGlzcGxheVRleHQpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIGNvbnN0IGRpciA9IGRpcm5hbWUoYWxpYXMpO1xuICAgIGNvbnN0IGJhc2UgPSBiYXNlbmFtZShhbGlhcywgZXh0bmFtZShhbGlhcykpO1xuICAgIGlmIChqb2luKGRpciwgYmFzZSkudG9Mb3dlckNhc2UoKSA9PT0gY2xlYW5EaXNwbGF5VGV4dCkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGZhbHNlO1xufVxuXG4vKipcbiAqIFdyYXBwZXIgZm9yIGRlZmF1bHQgb3B0aW9ucyBmb3IgZ2VuZXJhdGluZyBtYXJrZG93biBsaW5rcy5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBHZW5lcmF0ZU1hcmtkb3duTGlua0RlZmF1bHRPcHRpb25zV3JhcHBlciB7XG4gIC8qKlxuICAgKiBUaGUgZGVmYXVsdCBvcHRpb25zIGZvciBnZW5lcmF0aW5nIG1hcmtkb3duIGxpbmtzLlxuICAgKi9cbiAgZGVmYXVsdE9wdGlvbnNGbjogKCkgPT4gUGFydGlhbDxHZW5lcmF0ZU1hcmtkb3duTGlua09wdGlvbnM+O1xufVxuXG4vKipcbiAqIE9wdGlvbnMgZm9yIGdlbmVyYXRpbmcgYSBtYXJrZG93biBsaW5rLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEdlbmVyYXRlTWFya2Rvd25MaW5rT3B0aW9ucyB7XG4gIC8qKlxuICAgKiBUaGUgT2JzaWRpYW4gYXBwIGluc3RhbmNlLlxuICAgKi9cbiAgYXBwOiBBcHA7XG5cbiAgLyoqXG4gICAqIFRoZSBmaWxlIHRvIGxpbmsgdG8uXG4gICAqL1xuICBwYXRoT3JGaWxlOiBQYXRoT3JGaWxlO1xuXG4gIC8qKlxuICAgKiBUaGUgc291cmNlIHBhdGggb2YgdGhlIGxpbmsuXG4gICAqL1xuICBzb3VyY2VQYXRoT3JGaWxlOiBQYXRoT3JGaWxlO1xuXG4gIC8qKlxuICAgKiBUaGUgc3VicGF0aCBvZiB0aGUgbGluay5cbiAgICovXG4gIHN1YnBhdGg/OiBzdHJpbmcgfCB1bmRlZmluZWQ7XG5cbiAgLyoqXG4gICAqIFRoZSBhbGlhcyBmb3IgdGhlIGxpbmsuXG4gICAqL1xuICBhbGlhcz86IHN0cmluZyB8IHVuZGVmaW5lZDtcblxuICAvKipcbiAgICogSW5kaWNhdGVzIGlmIHRoZSBsaW5rIHNob3VsZCBiZSBlbWJlZGRlZC4gSWYgbm90IHByb3ZpZGVkLCBpdCB3aWxsIGJlIGluZmVycmVkIGJhc2VkIG9uIHRoZSBmaWxlIHR5cGUuXG4gICAqL1xuICBpc0VtYmVkPzogYm9vbGVhbiB8IHVuZGVmaW5lZDtcblxuICAvKipcbiAgICogSW5kaWNhdGVzIGlmIHRoZSBsaW5rIHNob3VsZCBiZSBhIHdpa2lsaW5rLiBJZiBub3QgcHJvdmlkZWQsIGl0IHdpbGwgYmUgaW5mZXJyZWQgYmFzZWQgb24gdGhlIE9ic2lkaWFuIHNldHRpbmdzLlxuICAgKi9cbiAgaXNXaWtpbGluaz86IGJvb2xlYW4gfCB1bmRlZmluZWQ7XG5cbiAgLyoqXG4gICAqIEluZGljYXRlcyBpZiB0aGUgbGluayBzaG91bGQgYmUgcmVsYXRpdmUuIElmIG5vdCBwcm92aWRlZCBvciBgZmFsc2VgLCBpdCB3aWxsIGJlIGluZmVycmVkIGJhc2VkIG9uIHRoZSBPYnNpZGlhbiBzZXR0aW5ncy5cbiAgICovXG4gIGZvcmNlUmVsYXRpdmVQYXRoPzogYm9vbGVhbiB8IHVuZGVmaW5lZDtcblxuICAvKipcbiAgICogSW5kaWNhdGVzIGlmIHRoZSBsaW5rIHNob3VsZCB1c2UgYSBsZWFkaW5nIGRvdC4gRGVmYXVsdHMgdG8gYGZhbHNlYC4gSGFzIG5vIGVmZmVjdCBpZiBgaXNXaWtpbGlua2AgaXMgYHRydWVgIG9yIGBpc1JlbGF0aXZlYCBpcyBgZmFsc2VgLlxuICAgKi9cbiAgdXNlTGVhZGluZ0RvdD86IGJvb2xlYW4gfCB1bmRlZmluZWQ7XG5cbiAgLyoqXG4gICAqIEluZGljYXRlcyBpZiB0aGUgbGluayBzaG91bGQgdXNlIGFuZ2xlIGJyYWNrZXRzLiBEZWZhdWx0cyB0byBgZmFsc2VgLiBIYXMgbm8gZWZmZWN0IGlmIGBpc1dpa2lsaW5rYCBpcyBgdHJ1ZWBcbiAgICovXG4gIHVzZUFuZ2xlQnJhY2tldHM/OiBib29sZWFuIHwgdW5kZWZpbmVkO1xuXG4gIC8qKlxuICAgICogVGhlIG9yaWdpbmFsIGxpbmsgdGV4dC4gSWYgcHJvdmlkZWQsIGl0IHdpbGwgYmUgdXNlZCB0byBpbmZlciB0aGUgdmFsdWVzIG9mIGBpc0VtYmVkYCwgYGlzV2lraWxpbmtgLCBgdXNlTGVhZGluZ0RvdGAsIGFuZCBgdXNlQW5nbGVCcmFja2V0c2AuXG4gICAgKiBUaGVzZSBpbmZlcnJlZCB2YWx1ZXMgd2lsbCBiZSBvdmVycmlkZGVuIGJ5IGNvcnJlc3BvbmRpbmcgc2V0dGluZ3MgaWYgc3BlY2lmaWVkLlxuICAgICovXG4gIG9yaWdpbmFsTGluaz86IHN0cmluZyB8IHVuZGVmaW5lZDtcblxuICAvKipcbiAgICogV2hldGhlciB0byBhbGxvdyBub24tZXhpc3RpbmcgZmlsZXMuIElmIGBmYWxzZWAgYW5kIGBwYXRoT3JGaWxlYCBpcyBhIG5vbi1leGlzdGluZyBmaWxlLCBhbiBlcnJvciB3aWxsIGJlIHRocm93bi4gRGVmYXVsdHMgdG8gYGZhbHNlYC5cbiAgICovXG4gIGFsbG93Tm9uRXhpc3RpbmdGaWxlPzogYm9vbGVhbiB8IHVuZGVmaW5lZDtcblxuICAvKipcbiAgICogV2hldGhlciB0byBhbGxvdyBhbiBlbXB0eSBhbGlhcyBmb3IgZW1iZWRzLiBEZWZhdWx0cyB0byBgdHJ1ZWAuXG4gICAqL1xuICBhbGxvd0VtcHR5RW1iZWRBbGlhcz86IGJvb2xlYW4gfCB1bmRlZmluZWQ7XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdG8gaW5jbHVkZSB0aGUgYXR0YWNobWVudCBleHRlbnNpb24gaW4gdGhlIGVtYmVkIGFsaWFzLiBIYXMgbm8gZWZmZWN0IGlmIGBhbGxvd0VtcHR5RW1iZWRBbGlhc2AgaXMgYHRydWVgLiBEZWZhdWx0cyB0byBgZmFsc2VgLlxuICAgKi9cbiAgaW5jbHVkZUF0dGFjaG1lbnRFeHRlbnNpb25Ub0VtYmVkQWxpYXM/OiBib29sZWFuIHwgdW5kZWZpbmVkO1xufVxuXG4vKipcbiAqIEdlbmVyYXRlcyBhIG1hcmtkb3duIGxpbmsgYmFzZWQgb24gdGhlIHByb3ZpZGVkIHBhcmFtZXRlcnMuXG4gKlxuICogQHBhcmFtIG9wdGlvbnMgLSBUaGUgb3B0aW9ucyBmb3IgZ2VuZXJhdGluZyB0aGUgbWFya2Rvd24gbGluay5cbiAqIEByZXR1cm5zIFRoZSBnZW5lcmF0ZWQgbWFya2Rvd24gbGluay5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdlbmVyYXRlTWFya2Rvd25MaW5rKG9wdGlvbnM6IEdlbmVyYXRlTWFya2Rvd25MaW5rT3B0aW9ucyk6IHN0cmluZyB7XG4gIGNvbnN0IHsgYXBwIH0gPSBvcHRpb25zO1xuXG4gIGNvbnN0IGNvbmZpZ3VyYWJsZURlZmF1bHRPcHRpb25zRm4gPSAoYXBwLmZpbGVNYW5hZ2VyLmdlbmVyYXRlTWFya2Rvd25MaW5rIGFzIFBhcnRpYWw8R2VuZXJhdGVNYXJrZG93bkxpbmtEZWZhdWx0T3B0aW9uc1dyYXBwZXI+KS5kZWZhdWx0T3B0aW9uc0ZuID8/ICgoKTogUGFydGlhbDxHZW5lcmF0ZU1hcmtkb3duTGlua09wdGlvbnM+ID0+ICh7fSkpO1xuICBjb25zdCBjb25maWd1cmFibGVEZWZhdWx0T3B0aW9ucyA9IGNvbmZpZ3VyYWJsZURlZmF1bHRPcHRpb25zRm4oKTtcblxuICBjb25zdCBERUZBVUxUX09QVElPTlM6IFBhcnRpYWw8R2VuZXJhdGVNYXJrZG93bkxpbmtPcHRpb25zPiA9IHtcbiAgICBhbGxvd0VtcHR5RW1iZWRBbGlhczogdHJ1ZVxuICB9O1xuXG4gIG9wdGlvbnMgPSB7IC4uLkRFRkFVTFRfT1BUSU9OUywgLi4uY29uZmlndXJhYmxlRGVmYXVsdE9wdGlvbnMsIC4uLm9wdGlvbnMgfTtcblxuICBjb25zdCBmaWxlID0gZ2V0RmlsZShhcHAsIG9wdGlvbnMucGF0aE9yRmlsZSwgb3B0aW9ucy5hbGxvd05vbkV4aXN0aW5nRmlsZSk7XG5cbiAgcmV0dXJuIHRlbXBSZWdpc3RlckZpbGVBbmRSdW4oYXBwLCBmaWxlLCAoKSA9PiB7XG4gICAgY29uc3Qgc291cmNlUGF0aCA9IGdldFBhdGgob3B0aW9ucy5zb3VyY2VQYXRoT3JGaWxlKTtcbiAgICBjb25zdCBzdWJwYXRoID0gb3B0aW9ucy5zdWJwYXRoID8/ICcnO1xuICAgIGxldCBhbGlhcyA9IG9wdGlvbnMuYWxpYXMgPz8gJyc7XG4gICAgY29uc3QgaXNFbWJlZCA9IG9wdGlvbnMuaXNFbWJlZCA/PyAob3B0aW9ucy5vcmlnaW5hbExpbmsgPyB0ZXN0RW1iZWQob3B0aW9ucy5vcmlnaW5hbExpbmspIDogdW5kZWZpbmVkKSA/PyAhaXNNYXJrZG93bkZpbGUoZmlsZSk7XG4gICAgY29uc3QgaXNXaWtpbGluayA9IG9wdGlvbnMuaXNXaWtpbGluayA/PyAob3B0aW9ucy5vcmlnaW5hbExpbmsgPyB0ZXN0V2lraWxpbmsob3B0aW9ucy5vcmlnaW5hbExpbmspIDogdW5kZWZpbmVkKSA/PyBzaG91bGRVc2VXaWtpbGlua3MoYXBwKTtcbiAgICBjb25zdCBmb3JjZVJlbGF0aXZlUGF0aCA9IG9wdGlvbnMuZm9yY2VSZWxhdGl2ZVBhdGggPz8gc2hvdWxkVXNlUmVsYXRpdmVMaW5rcyhhcHApO1xuICAgIGNvbnN0IHVzZUxlYWRpbmdEb3QgPSBvcHRpb25zLnVzZUxlYWRpbmdEb3QgPz8gKG9wdGlvbnMub3JpZ2luYWxMaW5rID8gdGVzdExlYWRpbmdEb3Qob3B0aW9ucy5vcmlnaW5hbExpbmspIDogdW5kZWZpbmVkKSA/PyBmYWxzZTtcbiAgICBjb25zdCB1c2VBbmdsZUJyYWNrZXRzID0gb3B0aW9ucy51c2VBbmdsZUJyYWNrZXRzID8/IChvcHRpb25zLm9yaWdpbmFsTGluayA/IHRlc3RBbmdsZUJyYWNrZXRzKG9wdGlvbnMub3JpZ2luYWxMaW5rKSA6IHVuZGVmaW5lZCkgPz8gZmFsc2U7XG5cbiAgICBsZXQgbGlua1RleHQgPSBmaWxlLnBhdGggPT09IHNvdXJjZVBhdGggJiYgc3VicGF0aFxuICAgICAgPyBzdWJwYXRoXG4gICAgICA6IGZvcmNlUmVsYXRpdmVQYXRoXG4gICAgICAgID8gcmVsYXRpdmUoZGlybmFtZShzb3VyY2VQYXRoKSwgaXNXaWtpbGluayA/IHRyaW1NYXJrZG93bkV4dGVuc2lvbihmaWxlKSA6IGZpbGUucGF0aCkgKyBzdWJwYXRoXG4gICAgICAgIDogYXBwLm1ldGFkYXRhQ2FjaGUuZmlsZVRvTGlua3RleHQoZmlsZSwgc291cmNlUGF0aCwgaXNXaWtpbGluaykgKyBzdWJwYXRoO1xuXG4gICAgaWYgKGZvcmNlUmVsYXRpdmVQYXRoICYmIHVzZUxlYWRpbmdEb3QgJiYgIWxpbmtUZXh0LnN0YXJ0c1dpdGgoJy4nKSAmJiAhbGlua1RleHQuc3RhcnRzV2l0aCgnIycpKSB7XG4gICAgICBsaW5rVGV4dCA9ICcuLycgKyBsaW5rVGV4dDtcbiAgICB9XG5cbiAgICBjb25zdCBlbWJlZFByZWZpeCA9IGlzRW1iZWQgPyAnIScgOiAnJztcblxuICAgIGlmICghaXNXaWtpbGluaykge1xuICAgICAgaWYgKHVzZUFuZ2xlQnJhY2tldHMpIHtcbiAgICAgICAgbGlua1RleHQgPSBgPCR7bGlua1RleHR9PmA7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBsaW5rVGV4dCA9IGxpbmtUZXh0LnJlcGxhY2UoU1BFQ0lBTF9MSU5LX1NZTUJPTFNfUkVHRVhQLCBmdW5jdGlvbiAoc3BlY2lhbExpbmtTeW1ib2wpIHtcbiAgICAgICAgICByZXR1cm4gZW5jb2RlVVJJQ29tcG9uZW50KHNwZWNpYWxMaW5rU3ltYm9sKTtcbiAgICAgICAgfSk7XG4gICAgICB9XG5cbiAgICAgIGlmICghYWxpYXMgJiYgKCFpc0VtYmVkIHx8ICFvcHRpb25zLmFsbG93RW1wdHlFbWJlZEFsaWFzKSkge1xuICAgICAgICBhbGlhcyA9ICFvcHRpb25zLmluY2x1ZGVBdHRhY2htZW50RXh0ZW5zaW9uVG9FbWJlZEFsaWFzIHx8IGlzTWFya2Rvd25GaWxlKGZpbGUpID8gZmlsZS5iYXNlbmFtZSA6IGZpbGUubmFtZTtcbiAgICAgIH1cblxuICAgICAgYWxpYXMgPSBhbGlhcy5yZXBsYWNlKFNQRUNJQUxfTUFSS0RPV05fTElOS19TWU1CT0xTX1JFR0VYLCAnXFxcXCQmJyk7XG5cbiAgICAgIHJldHVybiBgJHtlbWJlZFByZWZpeH1bJHthbGlhc31dKCR7bGlua1RleHR9KWA7XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmIChhbGlhcyAmJiBhbGlhcy50b0xvd2VyQ2FzZSgpID09PSBsaW5rVGV4dC50b0xvd2VyQ2FzZSgpKSB7XG4gICAgICAgIGxpbmtUZXh0ID0gYWxpYXM7XG4gICAgICAgIGFsaWFzID0gJyc7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGFsaWFzUGFydCA9IGFsaWFzID8gYHwke2FsaWFzfWAgOiAnJztcbiAgICAgIHJldHVybiBgJHtlbWJlZFByZWZpeH1bWyR7bGlua1RleHR9JHthbGlhc1BhcnR9XV1gO1xuICAgIH1cbiAgfSk7XG59XG5cbi8qKlxuICogRWRpdHMgdGhlIGxpbmtzIGluIHRoZSBzcGVjaWZpZWQgZmlsZSBvciBwYXRoIHVzaW5nIHRoZSBwcm92aWRlZCBsaW5rIGNvbnZlcnRlciBmdW5jdGlvbi5cbiAqXG4gKiBAcGFyYW0gYXBwIC0gVGhlIE9ic2lkaWFuIGFwcGxpY2F0aW9uIGluc3RhbmNlLlxuICogQHBhcmFtIHBhdGhPckZpbGUgLSBUaGUgcGF0aCBvciBmaWxlIHRvIGVkaXQgdGhlIGxpbmtzIGluLlxuICogQHBhcmFtIGxpbmtDb252ZXJ0ZXIgLSBUaGUgZnVuY3Rpb24gdGhhdCBjb252ZXJ0cyBlYWNoIGxpbmsuXG4gKiBAcGFyYW0gcmV0cnlPcHRpb25zIC0gT3B0aW9uYWwgb3B0aW9ucyBmb3IgcmV0cnlpbmcgdGhlIG9wZXJhdGlvbi5cbiAqIEByZXR1cm5zIEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHdoZW4gdGhlIGxpbmtzIGhhdmUgYmVlbiBlZGl0ZWQuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBlZGl0TGlua3MoXG4gIGFwcDogQXBwLFxuICBwYXRoT3JGaWxlOiBQYXRoT3JGaWxlLFxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWludmFsaWQtdm9pZC10eXBlXG4gIGxpbmtDb252ZXJ0ZXI6IChsaW5rOiBSZWZlcmVuY2VDYWNoZSkgPT4gTWF5YmVQcm9taXNlPHN0cmluZyB8IHZvaWQ+LFxuICByZXRyeU9wdGlvbnM6IFBhcnRpYWw8UmV0cnlPcHRpb25zPiA9IHt9KTogUHJvbWlzZTx2b2lkPiB7XG4gIGF3YWl0IGFwcGx5RmlsZUNoYW5nZXMoYXBwLCBwYXRoT3JGaWxlLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgY2FjaGUgPSBhd2FpdCBnZXRDYWNoZVNhZmUoYXBwLCBwYXRoT3JGaWxlKTtcbiAgICBpZiAoIWNhY2hlKSB7XG4gICAgICByZXR1cm4gW107XG4gICAgfVxuXG4gICAgY29uc3QgY2hhbmdlczogRmlsZUNoYW5nZVtdID0gW107XG5cbiAgICBmb3IgKGNvbnN0IGxpbmsgb2YgZ2V0QWxsTGlua3MoY2FjaGUpKSB7XG4gICAgICBjb25zdCBuZXdDb250ZW50ID0gYXdhaXQgbGlua0NvbnZlcnRlcihsaW5rKTtcbiAgICAgIGlmIChuZXdDb250ZW50ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIGNoYW5nZXMucHVzaCh7XG4gICAgICAgIHN0YXJ0SW5kZXg6IGxpbmsucG9zaXRpb24uc3RhcnQub2Zmc2V0LFxuICAgICAgICBlbmRJbmRleDogbGluay5wb3NpdGlvbi5lbmQub2Zmc2V0LFxuICAgICAgICBvbGRDb250ZW50OiBsaW5rLm9yaWdpbmFsLFxuICAgICAgICBuZXdDb250ZW50XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICByZXR1cm4gY2hhbmdlcztcbiAgfSwgcmV0cnlPcHRpb25zKTtcbn1cblxuLyoqXG4gKiBUZXN0cyB3aGV0aGVyIGEgbGluayBpcyBhbiBlbWJlZCBsaW5rOlxuICogYCFbW2xpbmtdXWAsIGAhW3RpdGxlXShsaW5rKWAuXG4gKlxuICogQHBhcmFtIGxpbmsgLSBMaW5rIHRvIHRlc3RcbiAqIEByZXR1cm5zIFdoZXRoZXIgdGhlIGxpbmsgaXMgYW4gZW1iZWQgbGlua1xuICovXG5leHBvcnQgZnVuY3Rpb24gdGVzdEVtYmVkKGxpbms6IHN0cmluZyk6IGJvb2xlYW4ge1xuICByZXR1cm4gbGluay5zdGFydHNXaXRoKCchWycpO1xufVxuXG4vKipcbiAqIFRlc3RzIHdoZXRoZXIgYSBsaW5rIGlzIGEgd2lraWxpbmssIHBvc3NpYmx5IGVtYmVkOlxuICogYFtbbGlua11dYCwgYCFbW2xpbmtdXWAuXG4gKlxuICogQHBhcmFtIGxpbmsgLSBMaW5rIHRvIHRlc3RcbiAqIEByZXR1cm5zIFdoZXRoZXIgdGhlIGxpbmsgaXMgYSB3aWtpbGlua1xuICovXG5leHBvcnQgZnVuY3Rpb24gdGVzdFdpa2lsaW5rKGxpbms6IHN0cmluZyk6IGJvb2xlYW4ge1xuICByZXR1cm4gbGluay5pbmNsdWRlcygnW1snKTtcbn1cblxuLyoqXG4gKiBUZXN0cyB3aGV0aGVyIGEgbGluayBoYXMgYSBsZWFkaW5nIGRvdCwgcG9zc2libHkgZW1iZWQ6XG4gKiBgW1suL2xpbmtdXWAsIGBbdGl0bGVdKC4vbGluaylgLCBgW3RpdGxlXSg8Li9saW5rPilgLFxuICogYCFbWy4vbGlua11dYCwgYCFbdGl0bGVdKC4vbGluaylgLCBgIVt0aXRsZV0oPC4vbGluaz4pYC5cbiAqXG4gKiBAcGFyYW0gbGluayAtIExpbmsgdG8gdGVzdFxuICogQHJldHVybnMgV2hldGhlciB0aGUgbGluayBoYXMgYSBsZWFkaW5nIGRvdFxuICovXG5leHBvcnQgZnVuY3Rpb24gdGVzdExlYWRpbmdEb3QobGluazogc3RyaW5nKTogYm9vbGVhbiB7XG4gIHJldHVybiBsaW5rLmluY2x1ZGVzKCdbWy4vJykgfHwgbGluay5pbmNsdWRlcygnXSguLycpIHx8IGxpbmsuaW5jbHVkZXMoJ10oPC4vJyk7XG59XG5cbi8qKlxuICogVGVzdHMgd2hldGhlciBhIGxpbmsgdXNlcyBhbmdsZSBicmFja2V0cywgcG9zc2libHkgZW1iZWQ6XG4gKiBgW3RpdGxlXSg8bGluaz4pYCwgYCFbdGl0bGVdKDxsaW5rPilgLlxuICpcbiAqIEBwYXJhbSBsaW5rIC0gTGluayB0byB0ZXN0XG4gKiBAcmV0dXJucyBXaGV0aGVyIHRoZSBsaW5rIHVzZXMgYW5nbGUgYnJhY2tldHNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRlc3RBbmdsZUJyYWNrZXRzKGxpbms6IHN0cmluZyk6IGJvb2xlYW4ge1xuICByZXR1cm4gbGluay5pbmNsdWRlcygnXSg8Jyk7XG59XG4iXSwKICAibWFwcGluZ3MiOiAiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFZQSxzQkFHTztBQU1QLGtCQU1PO0FBQ1Asb0JBQTBCO0FBRTFCLHdCQUtPO0FBQ1AsMkJBSU87QUFDUCw4QkFHTztBQUVQLG1CQUFpQztBQU1qQyxNQUFNLDhCQUE4QjtBQUtwQyxNQUFNLHNDQUFzQztBQXVCckMsU0FBUyxhQUFhLE1BQWtDO0FBQzdELFFBQU0sYUFBUyxtQ0FBYyx5QkFBVSxJQUFJLENBQUM7QUFDNUMsU0FBTztBQUFBLElBQ0wsVUFBVSxPQUFPO0FBQUEsSUFDakIsU0FBUyxPQUFPO0FBQUEsRUFDbEI7QUFDRjtBQWdEQSxlQUFzQixrQkFBa0IsU0FBa0Q7QUFDeEYsUUFBTTtBQUFBLElBQ0o7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxFQUNGLElBQUk7QUFDSixRQUFNLFVBQVUsS0FB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QUFDO0FBQUEsTUFDSDtBQUVBLFVBQUksQ0FBQyxVQUFVLENBQUMsV0FBVyxDQUFDLFFBQVEsdUJBQXVCO0FBQ3pELGdCQUFRLENBQUMsUUFBUSw4Q0FBMEMsa0NBQWUsSUFBSSxJQUFJLEtBQUssV0FBVyxLQUFLO0FBQUEsTUFDekc7QUFFQSxjQUFRLE1BQU0sUUFBUSxxQ0FBcUMsTUFBTTtBQUVqRSxhQUFPLEdBQUcsV0FBVyxJQUFJLEtBQUssS0FBSyxRQUFRO0FBQUEsSUFDN0MsT0FBTztBQUNMLFVBQUksU0FBUyxNQUFNLFlBQVksTUFBTSxTQUFTLFlBQVksR0FBRztBQUMzRCxtQkFBVztBQUNYLGdCQUFRO0FBQUEsTUFDVjtBQUVBLFlBQU0sWUFBWSxRQUFRLElBQUksS0FBSyxLQUFLO0FBQ3hDLGFBQU8sR0FBRyxXQUFXLEtBQUssUUFBUSxHQUFHLFNBQVM7QUFBQSxJQUNoRDtBQUFBLEVBQ0YsQ0FBQztBQUNIO0FBV0EsZUFBc0IsVUFDcEIsS0FDQSxZQUVBLGVBQ0EsZUFBc0MsQ0FBQyxHQUFrQjtBQUN6RCxZQUFNLCtCQUFpQixLQUFLLFlBQVksWUFBWTtBQUNsRCxVQUFNLFFBQVEsVUFBTSxtQ0FBYSxLQUFLLFVBQVU7QUFDaEQsUUFBSSxDQUFDLE9BQU87QUFDVixhQUFPLENBQUM7QUFBQSxJQUNWO0FBRUEsVUFBTSxVQUF3QixDQUFDO0FBRS9CLGVBQVcsWUFBUSxrQ0FBWSxLQUFLLEdBQUc7QUFDckMsWUFBTSxhQUFhLE1BQU0sY0FBYyxJQUFJO0FBQzNDLFVBQUksZUFBZSxRQUFXO0FBQzVCO0FBQUEsTUFDRjtBQUVBLGNBQVEsS0FBSztBQUFBLFFBQ1gsWUFBWSxLQUFLLFNBQVMsTUFBTTtBQUFBLFFBQ2hDLFVBQVUsS0FBSyxTQUFTLElBQUk7QUFBQSxRQUM1QixZQUFZLEtBQUs7QUFBQSxRQUNqQjtBQUFBLE1BQ0YsQ0FBQztBQUFBLElBQ0g7QUFFQSxXQUFPO0FBQUEsRUFDVCxHQUFHLFlBQVk7QUFDakI7QUFTTyxTQUFTLFVBQVUsTUFBdUI7QUFDL0MsU0FBTyxLQUFLLFdBQVcsSUFBSTtBQUM3QjtBQVNPLFNBQVMsYUFBYSxNQUF1QjtBQUNsRCxTQUFPLEtBQUssU0FBUyxJQUFJO0FBQzNCO0FBVU8sU0FBUyxlQUFlLE1BQXVCO0FBQ3BELFNBQU8sS0FBSyxTQUFTLE1BQU0sS0FBSyxLQUFLLFNBQVMsTUFBTSxLQUFLLEtBQUssU0FBUyxPQUFPO0FBQ2hGO0FBU08sU0FBUyxrQkFBa0IsTUFBdUI7QUFDdkQsU0FBTyxLQUFLLFNBQVMsS0FBSztBQUM1QjsiLAogICJuYW1lcyI6IFsicGF0aE9yRmlsZSJdCn0K
294
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL29ic2lkaWFuL0xpbmsudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbIi8qKlxuICogQHBhY2thZ2VEb2N1bWVudGF0aW9uIExpbmtcbiAqIFRoaXMgbW9kdWxlIHByb3ZpZGVzIHV0aWxpdGllcyBmb3IgaGFuZGxpbmcgYW5kIHVwZGF0aW5nIGxpbmtzIHdpdGhpbiBPYnNpZGlhbiB2YXVsdHMuIEl0IGluY2x1ZGVzXG4gKiBmdW5jdGlvbnMgdG8gc3BsaXQgcGF0aHMsIHVwZGF0ZSBsaW5rcyBpbiBmaWxlcywgYW5kIGdlbmVyYXRlIG1hcmtkb3duIGxpbmtzIHdpdGggdmFyaW91cyBvcHRpb25zLlxuICogVGhlIGZ1bmN0aW9ucyBpbnRlZ3JhdGUgd2l0aCBPYnNpZGlhbidzIEFQSSB0byBlbnN1cmUgdGhhdCBsaW5rcyBhcmUgbWFuYWdlZCBjb3JyZWN0bHkgd2l0aGluIHRoZSB2YXVsdC5cbiAqKi9cblxuaW1wb3J0IHR5cGUge1xuICBBcHAsXG4gIFJlZmVyZW5jZSxcbiAgVEZpbGVcbn0gZnJvbSAnb2JzaWRpYW4nO1xuaW1wb3J0IHtcbiAgbm9ybWFsaXplUGF0aCxcbiAgcGFyc2VMaW5rdGV4dFxufSBmcm9tICdvYnNpZGlhbic7XG5pbXBvcnQge1xuICBpc0Zyb250bWF0dGVyTGlua0NhY2hlLFxuICBpc1JlZmVyZW5jZUNhY2hlXG59IGZyb20gJ29ic2lkaWFuLXR5cGluZ3MvaW1wbGVtZW50YXRpb25zJztcblxuaW1wb3J0IHR5cGUge1xuICBNYXliZVByb21pc2UsXG4gIFJldHJ5T3B0aW9uc1xufSBmcm9tICcuLi9Bc3luYy50cyc7XG5pbXBvcnQge1xuICBiYXNlbmFtZSxcbiAgZGlybmFtZSxcbiAgZXh0bmFtZSxcbiAgam9pbixcbiAgcmVsYXRpdmVcbn0gZnJvbSAnLi4vUGF0aC50cyc7XG5pbXBvcnQgeyBub3JtYWxpemUgfSBmcm9tICcuLi9TdHJpbmcudHMnO1xuaW1wb3J0IHR5cGUge1xuICBDb250ZW50Q2hhbmdlLFxuICBGaWxlQ2hhbmdlLFxuICBGcm9udG1hdHRlckNoYW5nZVxufSBmcm9tICcuL0ZpbGVDaGFuZ2UudHMnO1xuaW1wb3J0IHsgYXBwbHlGaWxlQ2hhbmdlcyB9IGZyb20gJy4vRmlsZUNoYW5nZS50cyc7XG5pbXBvcnQgdHlwZSB7IFBhdGhPckZpbGUgfSBmcm9tICcuL0ZpbGVTeXN0ZW0udHMnO1xuaW1wb3J0IHtcbiAgZ2V0RmlsZSxcbiAgZ2V0UGF0aCxcbiAgaXNNYXJrZG93bkZpbGUsXG4gIHRyaW1NYXJrZG93bkV4dGVuc2lvblxufSBmcm9tICcuL0ZpbGVTeXN0ZW0udHMnO1xuaW1wb3J0IHtcbiAgZ2V0QWxsTGlua3MsXG4gIGdldENhY2hlU2FmZSxcbiAgdGVtcFJlZ2lzdGVyRmlsZUFuZFJ1blxufSBmcm9tICcuL01ldGFkYXRhQ2FjaGUudHMnO1xuaW1wb3J0IHtcbiAgc2hvdWxkVXNlUmVsYXRpdmVMaW5rcyxcbiAgc2hvdWxkVXNlV2lraWxpbmtzXG59IGZyb20gJy4vT2JzaWRpYW5TZXR0aW5ncy50cyc7XG5cbi8qKlxuICogUmVndWxhciBleHByZXNzaW9uIGZvciBzcGVjaWFsIGxpbmsgc3ltYm9scy5cbiAqL1xuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWNvbnRyb2wtcmVnZXhcbmNvbnN0IFNQRUNJQUxfTElOS19TWU1CT0xTX1JFR0VYUCA9IC9bXFxcXFxceDAwXFx4MDhcXHgwQlxceDBDXFx4MEUtXFx4MUYgXS9nO1xuXG4vKipcbiAqIFJlZ3VsYXIgZXhwcmVzc2lvbiBmb3Igc3BlY2lhbCBtYXJrZG93biBsaW5rIHN5bWJvbHMuXG4gKi9cbmNvbnN0IFNQRUNJQUxfTUFSS0RPV05fTElOS19TWU1CT0xTX1JFR0VYID0gL1tcXFxcW1xcXTw+Xyp+PWAkXS9nO1xuXG4vKipcbiAqIFNwbGl0cyBhIGxpbmsgaW50byBpdHMgbGluayBwYXRoIGFuZCBzdWJwYXRoLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFNwbGl0U3VicGF0aFJlc3VsdCB7XG4gIC8qKlxuICAgKiBUaGUgbGluayBwYXRoLlxuICAgKi9cbiAgbGlua1BhdGg6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIHN1YnBhdGguXG4gICAqL1xuICBzdWJwYXRoOiBzdHJpbmc7XG59XG5cbi8qKlxuICogU3BsaXRzIGEgbGluayBpbnRvIGl0cyBsaW5rIHBhdGggYW5kIHN1YnBhdGguXG4gKlxuICogQHBhcmFtIGxpbmsgLSBUaGUgbGluayB0byBzcGxpdC5cbiAqIEByZXR1cm5zIEFuIG9iamVjdCBjb250YWluaW5nIHRoZSBsaW5rIHBhdGggYW5kIHN1YnBhdGguXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzcGxpdFN1YnBhdGgobGluazogc3RyaW5nKTogU3BsaXRTdWJwYXRoUmVzdWx0IHtcbiAgY29uc3QgcGFyc2VkID0gcGFyc2VMaW5rdGV4dChub3JtYWxpemUobGluaykpO1xuICByZXR1cm4ge1xuICAgIGxpbmtQYXRoOiBwYXJzZWQucGF0aCxcbiAgICBzdWJwYXRoOiBwYXJzZWQuc3VicGF0aFxuICB9O1xufVxuXG4vKipcbiAqIE9wdGlvbnMgZm9yIHVwZGF0aW5nIGxpbmtzIGluIGEgZmlsZS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBVcGRhdGVMaW5rc0luRmlsZU9wdGlvbnMge1xuICAvKipcbiAgICogVGhlIG9ic2lkaWFuIGFwcCBpbnN0YW5jZS5cbiAgICovXG4gIGFwcDogQXBwO1xuXG4gIC8qKlxuICAgKiBUaGUgZmlsZSB0byB1cGRhdGUgdGhlIGxpbmtzIGluLlxuICAgKi9cbiAgcGF0aE9yRmlsZTogUGF0aE9yRmlsZTtcblxuICAvKipcbiAgICogVGhlIG9sZCBwYXRoIG9mIHRoZSBmaWxlLlxuICAgKi9cbiAgb2xkUGF0aE9yRmlsZT86IFBhdGhPckZpbGUgfCB1bmRlZmluZWQ7XG5cbiAgLyoqXG4gICAqIEEgbWFwIG9mIG9sZCBhbmQgbmV3IHBhdGhzIGZvciByZW5hbWluZyBsaW5rcy5cbiAgICovXG4gIHJlbmFtZU1hcD86IE1hcDxzdHJpbmcsIHN0cmluZz4gfCB1bmRlZmluZWQ7XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdG8gZm9yY2UgdGhlIGxpbmtzIHRvIGJlIGluIE1hcmtkb3duIGZvcm1hdC5cbiAgICovXG4gIGZvcmNlTWFya2Rvd25MaW5rcz86IGJvb2xlYW4gfCB1bmRlZmluZWQ7XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdG8gdXBkYXRlIG9ubHkgZW1iZWRkZWQgbGlua3MuXG4gICAqL1xuICBlbWJlZE9ubHlMaW5rcz86IGJvb2xlYW4gfCB1bmRlZmluZWQ7XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdG8gdXBkYXRlIGZpbGVuYW1lIGFsaWFzLiBEZWZhdWx0cyB0byBgdHJ1ZWAuXG4gICAqL1xuICBzaG91bGRVcGRhdGVGaWxlbmFtZUFsaWFzPzogYm9vbGVhbiB8IHVuZGVmaW5lZDtcbn1cblxuLyoqXG4gKiBVcGRhdGVzIHRoZSBsaW5rcyBpbiBhIGZpbGUgYmFzZWQgb24gdGhlIHByb3ZpZGVkIHBhcmFtZXRlcnMuXG4gKlxuICogQHBhcmFtIG9wdGlvbnMgLSBUaGUgb3B0aW9ucyBmb3IgdXBkYXRpbmcgdGhlIGxpbmtzLlxuICogQHJldHVybnMgQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgd2hlbiB0aGUgbGlua3MgYXJlIHVwZGF0ZWQuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiB1cGRhdGVMaW5rc0luRmlsZShvcHRpb25zOiBVcGRhdGVMaW5rc0luRmlsZU9wdGlvbnMpOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3Qge1xuICAgIGFwcCxcbiAgICBwYXRoT3JGaWxlLFxuICAgIG9sZFBhdGhPckZpbGUsXG4gICAgcmVuYW1lTWFwLFxuICAgIGZvcmNlTWFya2Rvd25MaW5rcyxcbiAgICBlbWJlZE9ubHlMaW5rcyxcbiAgICBzaG91bGRVcGRhdGVGaWxlbmFtZUFsaWFzXG4gIH0gPSBvcHRpb25zO1xuICBhd2FpdCBlZGl0TGlua3MoYXBwLCBwYXRoT3JGaWxlLCAobGluaykgPT4ge1xuICAgIGNvbnN0IGlzRW1iZWRMaW5rID0gdGVzdEVtYmVkKGxpbmsub3JpZ2luYWwpO1xuICAgIGlmIChlbWJlZE9ubHlMaW5rcyAhPT0gdW5kZWZpbmVkICYmIGVtYmVkT25seUxpbmtzICE9PSBpc0VtYmVkTGluaykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICByZXR1cm4gY29udmVydExpbmsoe1xuICAgICAgYXBwLFxuICAgICAgbGluayxcbiAgICAgIHNvdXJjZVBhdGhPckZpbGU6IHBhdGhPckZpbGUsXG4gICAgICBvbGRQYXRoT3JGaWxlLFxuICAgICAgcmVuYW1lTWFwLFxuICAgICAgZm9yY2VNYXJrZG93bkxpbmtzLFxuICAgICAgc2hvdWxkVXBkYXRlRmlsZW5hbWVBbGlhc1xuICAgIH0pO1xuICB9KTtcbn1cblxuLyoqXG4gKiBPcHRpb25zIGZvciBjb252ZXJ0aW5nIGEgbGluay5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDb252ZXJ0TGlua09wdGlvbnMge1xuICAvKipcbiAgICogVGhlIE9ic2lkaWFuIGFwcCBpbnN0YW5jZS5cbiAgICovXG4gIGFwcDogQXBwO1xuXG4gIC8qKlxuICAgKiBUaGUgcmVmZXJlbmNlIGZvciB0aGUgbGluay5cbiAgICovXG4gIGxpbms6IFJlZmVyZW5jZTtcblxuICAvKipcbiAgICogVGhlIHNvdXJjZSBmaWxlIGNvbnRhaW5pbmcgdGhlIGxpbmsuXG4gICAqL1xuICBzb3VyY2VQYXRoT3JGaWxlOiBQYXRoT3JGaWxlO1xuXG4gIC8qKlxuICAgKiBUaGUgb2xkIHBhdGggb2YgdGhlIGxpbmsuXG4gICAqL1xuICBvbGRQYXRoT3JGaWxlPzogUGF0aE9yRmlsZSB8IHVuZGVmaW5lZDtcblxuICAvKipcbiAgICogQSBtYXAgb2Ygb2xkIGFuZCBuZXcgZmlsZSBwYXRocy5cbiAgICovXG4gIHJlbmFtZU1hcD86IE1hcDxzdHJpbmcsIHN0cmluZz4gfCB1bmRlZmluZWQ7XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdG8gZm9yY2UgbWFya2Rvd24gbGlua3MuXG4gICAqL1xuICBmb3JjZU1hcmtkb3duTGlua3M/OiBib29sZWFuIHwgdW5kZWZpbmVkO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRvIHVwZGF0ZSBmaWxlbmFtZSBhbGlhcy4gRGVmYXVsdHMgdG8gYHRydWVgLlxuICAgKi9cbiAgc2hvdWxkVXBkYXRlRmlsZW5hbWVBbGlhcz86IGJvb2xlYW4gfCB1bmRlZmluZWQ7XG59XG5cbi8qKlxuICogQ29udmVydHMgYSBsaW5rIHRvIGEgbmV3IHBhdGguXG4gKlxuICogQHBhcmFtIG9wdGlvbnMgLSBUaGUgb3B0aW9ucyBmb3IgY29udmVydGluZyB0aGUgbGluay5cbiAqIEByZXR1cm5zIFRoZSBjb252ZXJ0ZWQgbGluay5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNvbnZlcnRMaW5rKG9wdGlvbnM6IENvbnZlcnRMaW5rT3B0aW9ucyk6IHN0cmluZyB7XG4gIHJldHVybiB1cGRhdGVMaW5rKHtcbiAgICBhcHA6IG9wdGlvbnMuYXBwLFxuICAgIGxpbms6IG9wdGlvbnMubGluayxcbiAgICBwYXRoT3JGaWxlOiBleHRyYWN0TGlua0ZpbGUob3B0aW9ucy5hcHAsIG9wdGlvbnMubGluaywgb3B0aW9ucy5zb3VyY2VQYXRoT3JGaWxlKSxcbiAgICBvbGRQYXRoT3JGaWxlOiBvcHRpb25zLm9sZFBhdGhPckZpbGUsXG4gICAgc291cmNlUGF0aE9yRmlsZTogb3B0aW9ucy5zb3VyY2VQYXRoT3JGaWxlLFxuICAgIHJlbmFtZU1hcDogb3B0aW9ucy5yZW5hbWVNYXAsXG4gICAgZm9yY2VNYXJrZG93bkxpbmtzOiBvcHRpb25zLmZvcmNlTWFya2Rvd25MaW5rcyxcbiAgICBzaG91bGRVcGRhdGVGaWxlbmFtZUFsaWFzOiBvcHRpb25zLnNob3VsZFVwZGF0ZUZpbGVuYW1lQWxpYXNcbiAgfSk7XG59XG5cbi8qKlxuICogRXh0cmFjdHMgdGhlIGZpbGUgYXNzb2NpYXRlZCB3aXRoIGEgbGluay5cbiAqXG4gKiBAcGFyYW0gYXBwIC0gVGhlIE9ic2lkaWFuIGFwcGxpY2F0aW9uIGluc3RhbmNlLlxuICogQHBhcmFtIGxpbmsgLSBUaGUgcmVmZXJlbmNlIGNhY2hlIGZvciB0aGUgbGluay5cbiAqIEBwYXJhbSBub3RlUGF0aE9yRmlsZSAtIFRoZSBwYXRoIG9yIGZpbGUgb2YgdGhlIG5vdGUgY29udGFpbmluZyB0aGUgbGluay5cbiAqIEByZXR1cm5zIFRoZSBmaWxlIGFzc29jaWF0ZWQgd2l0aCB0aGUgbGluaywgb3IgbnVsbCBpZiBub3QgZm91bmQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBleHRyYWN0TGlua0ZpbGUoYXBwOiBBcHAsIGxpbms6IFJlZmVyZW5jZSwgbm90ZVBhdGhPckZpbGU6IFBhdGhPckZpbGUpOiBURmlsZSB8IG51bGwge1xuICBjb25zdCB7IGxpbmtQYXRoIH0gPSBzcGxpdFN1YnBhdGgobGluay5saW5rKTtcbiAgcmV0dXJuIGFwcC5tZXRhZGF0YUNhY2hlLmdldEZpcnN0TGlua3BhdGhEZXN0KGxpbmtQYXRoLCBnZXRQYXRoKG5vdGVQYXRoT3JGaWxlKSk7XG59XG5cbi8qKlxuICogT3B0aW9ucyBmb3IgdXBkYXRpbmcgYSBsaW5rLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFVwZGF0ZUxpbmtPcHRpb25zIHtcbiAgLyoqXG4gICAqIFRoZSBPYnNpZGlhbiBhcHAgaW5zdGFuY2UuXG4gICAqL1xuICBhcHA6IEFwcDtcblxuICAvKipcbiAgICogVGhlIHJlZmVyZW5jZSBmb3IgdGhlIGxpbmsuXG4gICAqL1xuICBsaW5rOiBSZWZlcmVuY2U7XG5cbiAgLyoqXG4gICAqIFRoZSBmaWxlIGFzc29jaWF0ZWQgd2l0aCB0aGUgbGluay5cbiAgICovXG4gIHBhdGhPckZpbGU6IFBhdGhPckZpbGUgfCBudWxsO1xuXG4gIC8qKlxuICAgKiBUaGUgb2xkIHBhdGggb2YgdGhlIGZpbGUuXG4gICAqL1xuICBvbGRQYXRoT3JGaWxlPzogUGF0aE9yRmlsZSB8IHVuZGVmaW5lZDtcblxuICAvKipcbiAgICogVGhlIHNvdXJjZSBmaWxlIGNvbnRhaW5pbmcgdGhlIGxpbmsuXG4gICAqL1xuICBzb3VyY2VQYXRoT3JGaWxlOiBQYXRoT3JGaWxlO1xuXG4gIC8qKlxuICAgKiBBIG1hcCBvZiBvbGQgYW5kIG5ldyBmaWxlIHBhdGhzLlxuICAgKi9cbiAgcmVuYW1lTWFwPzogTWFwPHN0cmluZywgc3RyaW5nPiB8IHVuZGVmaW5lZDtcblxuICAvKipcbiAgICogV2hldGhlciB0byBmb3JjZSBtYXJrZG93biBsaW5rcy5cbiAgICovXG4gIGZvcmNlTWFya2Rvd25MaW5rcz86IGJvb2xlYW4gfCB1bmRlZmluZWQ7XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdG8gdXBkYXRlIGZpbGVuYW1lIGFsaWFzLiBEZWZhdWx0cyB0byBgdHJ1ZWAuXG4gICAqL1xuICBzaG91bGRVcGRhdGVGaWxlbmFtZUFsaWFzPzogYm9vbGVhbiB8IHVuZGVmaW5lZDtcbn1cblxuLyoqXG4gKiBVcGRhdGVzIGEgbGluayBiYXNlZCBvbiB0aGUgcHJvdmlkZWQgcGFyYW1ldGVycy5cbiAqXG4gKiBAcGFyYW0gb3B0aW9ucyAtIFRoZSBvcHRpb25zIGZvciB1cGRhdGluZyB0aGUgbGluay5cbiAqIEByZXR1cm5zIFRoZSB1cGRhdGVkIGxpbmsuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB1cGRhdGVMaW5rKG9wdGlvbnM6IFVwZGF0ZUxpbmtPcHRpb25zKTogc3RyaW5nIHtcbiAgY29uc3Qge1xuICAgIGFwcCxcbiAgICBsaW5rLFxuICAgIHBhdGhPckZpbGUsXG4gICAgb2xkUGF0aE9yRmlsZSxcbiAgICBzb3VyY2VQYXRoT3JGaWxlLFxuICAgIHJlbmFtZU1hcCxcbiAgICBmb3JjZU1hcmtkb3duTGlua3MsXG4gICAgc2hvdWxkVXBkYXRlRmlsZW5hbWVBbGlhc1xuICB9ID0gb3B0aW9ucztcbiAgaWYgKCFwYXRoT3JGaWxlKSB7XG4gICAgcmV0dXJuIGxpbmsub3JpZ2luYWw7XG4gIH1cbiAgbGV0IGZpbGUgPSBnZXRGaWxlKGFwcCwgcGF0aE9yRmlsZSk7XG4gIGNvbnN0IG9sZFBhdGggPSBnZXRQYXRoKG9sZFBhdGhPckZpbGUgPz8gc291cmNlUGF0aE9yRmlsZSk7XG4gIGNvbnN0IGlzV2lraWxpbmsgPSB0ZXN0V2lraWxpbmsobGluay5vcmlnaW5hbCkgJiYgZm9yY2VNYXJrZG93bkxpbmtzICE9PSB0cnVlO1xuICBjb25zdCB7IHN1YnBhdGggfSA9IHNwbGl0U3VicGF0aChsaW5rLmxpbmspO1xuXG4gIGNvbnN0IG5ld1BhdGggPSByZW5hbWVNYXA/LmdldChmaWxlLnBhdGgpO1xuICBsZXQgYWxpYXMgPSBzaG91bGRSZXNldEFsaWFzKHtcbiAgICBhcHAsXG4gICAgZGlzcGxheVRleHQ6IGxpbmsuZGlzcGxheVRleHQsXG4gICAgcGF0aE9yRmlsZSxcbiAgICBvdGhlclBhdGhPckZpbGVzOiBbb2xkUGF0aCwgbmV3UGF0aF0sXG4gICAgc291cmNlUGF0aE9yRmlsZSxcbiAgICBpc1dpa2lsaW5rXG4gIH0pXG4gICAgPyB1bmRlZmluZWRcbiAgICA6IGxpbmsuZGlzcGxheVRleHQ7XG5cbiAgaWYgKHNob3VsZFVwZGF0ZUZpbGVuYW1lQWxpYXMgPz8gdHJ1ZSkge1xuICAgIGlmIChhbGlhcz8udG9Mb3dlckNhc2UoKSA9PT0gYmFzZW5hbWUob2xkUGF0aCwgZXh0bmFtZShvbGRQYXRoKSkudG9Mb3dlckNhc2UoKSkge1xuICAgICAgYWxpYXMgPSBmaWxlLmJhc2VuYW1lO1xuICAgIH0gZWxzZSBpZiAoYWxpYXM/LnRvTG93ZXJDYXNlKCkgPT09IGJhc2VuYW1lKG9sZFBhdGgpLnRvTG93ZXJDYXNlKCkpIHtcbiAgICAgIGFsaWFzID0gZmlsZS5uYW1lO1xuICAgIH1cbiAgfVxuXG4gIGlmIChuZXdQYXRoKSB7XG4gICAgZmlsZSA9IGdldEZpbGUoYXBwLCBuZXdQYXRoLCB0cnVlKTtcbiAgfVxuXG4gIGNvbnN0IG5ld0xpbmsgPSBnZW5lcmF0ZU1hcmtkb3duTGluayh7XG4gICAgYXBwLFxuICAgIHBhdGhPckZpbGU6IGZpbGUsXG4gICAgc291cmNlUGF0aE9yRmlsZSxcbiAgICBzdWJwYXRoLFxuICAgIGFsaWFzLFxuICAgIGlzV2lraWxpbms6IGZvcmNlTWFya2Rvd25MaW5rcyA/IGZhbHNlIDogdW5kZWZpbmVkLFxuICAgIG9yaWdpbmFsTGluazogbGluay5vcmlnaW5hbFxuICB9KTtcbiAgcmV0dXJuIG5ld0xpbms7XG59XG5cbi8qKlxuICogT3B0aW9ucyBmb3IgZGV0ZXJtaW5pbmcgaWYgdGhlIGFsaWFzIG9mIGEgbGluayBzaG91bGQgYmUgcmVzZXQuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU2hvdWxkUmVzZXRBbGlhc09wdGlvbnMge1xuICAvKipcbiAgICogVGhlIE9ic2lkaWFuIGFwcCBpbnN0YW5jZS5cbiAgICovXG4gIGFwcDogQXBwO1xuXG4gIC8qKlxuICAgKiBUaGUgZGlzcGxheSB0ZXh0IG9mIHRoZSBsaW5rLlxuICAgKi9cbiAgZGlzcGxheVRleHQ6IHN0cmluZyB8IHVuZGVmaW5lZDtcblxuICAvKipcbiAgICogVGhlIHBhdGggb3IgZmlsZSBvZiB0aGUgbGluay5cbiAgICovXG4gIHBhdGhPckZpbGU6IFBhdGhPckZpbGU7XG5cbiAgLyoqXG4gICAqIE90aGVyIHBhdGhzIGFzc29jaWF0ZWQgd2l0aCB0aGUgbGluay5cbiAgICovXG4gIG90aGVyUGF0aE9yRmlsZXM6IChQYXRoT3JGaWxlIHwgdW5kZWZpbmVkKVtdO1xuXG4gIC8qKlxuICAgKiBUaGUgc291cmNlIHBhdGggb2YgdGhlIGxpbmsuXG4gICAqL1xuICBzb3VyY2VQYXRoT3JGaWxlOiBQYXRoT3JGaWxlO1xuXG4gIC8qKlxuICAgKiBJbmRpY2F0ZXMgaWYgdGhlIGxpbmsgaXMgYSB3aWtpbGluay5cbiAgICovXG4gIGlzV2lraWxpbms/OiBib29sZWFuIHwgdW5kZWZpbmVkO1xufVxuXG4vKipcbiAqIERldGVybWluZXMgaWYgdGhlIGFsaWFzIG9mIGEgbGluayBzaG91bGQgYmUgcmVzZXQuXG4gKlxuICogQHBhcmFtIG9wdGlvbnMgLSBUaGUgb3B0aW9ucyBmb3IgZGV0ZXJtaW5pbmcgaWYgdGhlIGFsaWFzIHNob3VsZCBiZSByZXNldC5cbiAqIEByZXR1cm5zIFdoZXRoZXIgdGhlIGFsaWFzIHNob3VsZCBiZSByZXNldC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNob3VsZFJlc2V0QWxpYXMob3B0aW9uczogU2hvdWxkUmVzZXRBbGlhc09wdGlvbnMpOiBib29sZWFuIHtcbiAgY29uc3Qge1xuICAgIGFwcCxcbiAgICBkaXNwbGF5VGV4dCxcbiAgICBwYXRoT3JGaWxlLFxuICAgIG90aGVyUGF0aE9yRmlsZXMsXG4gICAgc291cmNlUGF0aE9yRmlsZSxcbiAgICBpc1dpa2lsaW5rXG4gIH0gPSBvcHRpb25zO1xuICBpZiAoaXNXaWtpbGluayA9PT0gZmFsc2UpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBjb25zdCBmaWxlID0gZ2V0RmlsZShhcHAsIHBhdGhPckZpbGUpO1xuXG4gIGlmICghZGlzcGxheVRleHQpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIGNvbnN0IHNvdXJjZVBhdGggPSBnZXRQYXRoKHNvdXJjZVBhdGhPckZpbGUpO1xuICBjb25zdCBzb3VyY2VEaXIgPSBkaXJuYW1lKHNvdXJjZVBhdGgpO1xuXG4gIGNvbnN0IGFsaWFzZXNUb1Jlc2V0ID0gbmV3IFNldDxzdHJpbmc+KCk7XG5cbiAgZm9yIChjb25zdCBwYXRoT3JGaWxlIG9mIFtmaWxlLnBhdGgsIC4uLm90aGVyUGF0aE9yRmlsZXNdKSB7XG4gICAgaWYgKCFwYXRoT3JGaWxlKSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICBjb25zdCBwYXRoID0gZ2V0UGF0aChwYXRoT3JGaWxlKTtcbiAgICBhbGlhc2VzVG9SZXNldC5hZGQocGF0aCk7XG4gICAgYWxpYXNlc1RvUmVzZXQuYWRkKGJhc2VuYW1lKHBhdGgpKTtcbiAgICBhbGlhc2VzVG9SZXNldC5hZGQocmVsYXRpdmUoc291cmNlRGlyLCBwYXRoKSk7XG4gIH1cblxuICBhbGlhc2VzVG9SZXNldC5hZGQoYXBwLm1ldGFkYXRhQ2FjaGUuZmlsZVRvTGlua3RleHQoZmlsZSwgc291cmNlUGF0aCwgZmFsc2UpKTtcblxuICBjb25zdCBjbGVhbkRpc3BsYXlUZXh0ID0gbm9ybWFsaXplUGF0aChkaXNwbGF5VGV4dC5zcGxpdCgnID4gJylbMF0gPz8gJycpLnJlcGxhY2UoL15cXC5cXC8vLCAnJykudG9Mb3dlckNhc2UoKTtcblxuICBmb3IgKGNvbnN0IGFsaWFzIG9mIGFsaWFzZXNUb1Jlc2V0KSB7XG4gICAgaWYgKGFsaWFzLnRvTG93ZXJDYXNlKCkgPT09IGNsZWFuRGlzcGxheVRleHQpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIGNvbnN0IGRpciA9IGRpcm5hbWUoYWxpYXMpO1xuICAgIGNvbnN0IGJhc2UgPSBiYXNlbmFtZShhbGlhcywgZXh0bmFtZShhbGlhcykpO1xuICAgIGlmIChqb2luKGRpciwgYmFzZSkudG9Mb3dlckNhc2UoKSA9PT0gY2xlYW5EaXNwbGF5VGV4dCkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGZhbHNlO1xufVxuXG4vKipcbiAqIFdyYXBwZXIgZm9yIGRlZmF1bHQgb3B0aW9ucyBmb3IgZ2VuZXJhdGluZyBtYXJrZG93biBsaW5rcy5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBHZW5lcmF0ZU1hcmtkb3duTGlua0RlZmF1bHRPcHRpb25zV3JhcHBlciB7XG4gIC8qKlxuICAgKiBUaGUgZGVmYXVsdCBvcHRpb25zIGZvciBnZW5lcmF0aW5nIG1hcmtkb3duIGxpbmtzLlxuICAgKi9cbiAgZGVmYXVsdE9wdGlvbnNGbjogKCkgPT4gUGFydGlhbDxHZW5lcmF0ZU1hcmtkb3duTGlua09wdGlvbnM+O1xufVxuXG4vKipcbiAqIE9wdGlvbnMgZm9yIGdlbmVyYXRpbmcgYSBtYXJrZG93biBsaW5rLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEdlbmVyYXRlTWFya2Rvd25MaW5rT3B0aW9ucyB7XG4gIC8qKlxuICAgKiBUaGUgT2JzaWRpYW4gYXBwIGluc3RhbmNlLlxuICAgKi9cbiAgYXBwOiBBcHA7XG5cbiAgLyoqXG4gICAqIFRoZSBmaWxlIHRvIGxpbmsgdG8uXG4gICAqL1xuICBwYXRoT3JGaWxlOiBQYXRoT3JGaWxlO1xuXG4gIC8qKlxuICAgKiBUaGUgc291cmNlIHBhdGggb2YgdGhlIGxpbmsuXG4gICAqL1xuICBzb3VyY2VQYXRoT3JGaWxlOiBQYXRoT3JGaWxlO1xuXG4gIC8qKlxuICAgKiBUaGUgc3VicGF0aCBvZiB0aGUgbGluay5cbiAgICovXG4gIHN1YnBhdGg/OiBzdHJpbmcgfCB1bmRlZmluZWQ7XG5cbiAgLyoqXG4gICAqIFRoZSBhbGlhcyBmb3IgdGhlIGxpbmsuXG4gICAqL1xuICBhbGlhcz86IHN0cmluZyB8IHVuZGVmaW5lZDtcblxuICAvKipcbiAgICogSW5kaWNhdGVzIGlmIHRoZSBsaW5rIHNob3VsZCBiZSBlbWJlZGRlZC4gSWYgbm90IHByb3ZpZGVkLCBpdCB3aWxsIGJlIGluZmVycmVkIGJhc2VkIG9uIHRoZSBmaWxlIHR5cGUuXG4gICAqL1xuICBpc0VtYmVkPzogYm9vbGVhbiB8IHVuZGVmaW5lZDtcblxuICAvKipcbiAgICogSW5kaWNhdGVzIGlmIHRoZSBsaW5rIHNob3VsZCBiZSBhIHdpa2lsaW5rLiBJZiBub3QgcHJvdmlkZWQsIGl0IHdpbGwgYmUgaW5mZXJyZWQgYmFzZWQgb24gdGhlIE9ic2lkaWFuIHNldHRpbmdzLlxuICAgKi9cbiAgaXNXaWtpbGluaz86IGJvb2xlYW4gfCB1bmRlZmluZWQ7XG5cbiAgLyoqXG4gICAqIEluZGljYXRlcyBpZiB0aGUgbGluayBzaG91bGQgYmUgcmVsYXRpdmUuIElmIG5vdCBwcm92aWRlZCBvciBgZmFsc2VgLCBpdCB3aWxsIGJlIGluZmVycmVkIGJhc2VkIG9uIHRoZSBPYnNpZGlhbiBzZXR0aW5ncy5cbiAgICovXG4gIGZvcmNlUmVsYXRpdmVQYXRoPzogYm9vbGVhbiB8IHVuZGVmaW5lZDtcblxuICAvKipcbiAgICogSW5kaWNhdGVzIGlmIHRoZSBsaW5rIHNob3VsZCB1c2UgYSBsZWFkaW5nIGRvdC4gRGVmYXVsdHMgdG8gYGZhbHNlYC4gSGFzIG5vIGVmZmVjdCBpZiBgaXNXaWtpbGlua2AgaXMgYHRydWVgIG9yIGBpc1JlbGF0aXZlYCBpcyBgZmFsc2VgLlxuICAgKi9cbiAgdXNlTGVhZGluZ0RvdD86IGJvb2xlYW4gfCB1bmRlZmluZWQ7XG5cbiAgLyoqXG4gICAqIEluZGljYXRlcyBpZiB0aGUgbGluayBzaG91bGQgdXNlIGFuZ2xlIGJyYWNrZXRzLiBEZWZhdWx0cyB0byBgZmFsc2VgLiBIYXMgbm8gZWZmZWN0IGlmIGBpc1dpa2lsaW5rYCBpcyBgdHJ1ZWBcbiAgICovXG4gIHVzZUFuZ2xlQnJhY2tldHM/OiBib29sZWFuIHwgdW5kZWZpbmVkO1xuXG4gIC8qKlxuICAgICogVGhlIG9yaWdpbmFsIGxpbmsgdGV4dC4gSWYgcHJvdmlkZWQsIGl0IHdpbGwgYmUgdXNlZCB0byBpbmZlciB0aGUgdmFsdWVzIG9mIGBpc0VtYmVkYCwgYGlzV2lraWxpbmtgLCBgdXNlTGVhZGluZ0RvdGAsIGFuZCBgdXNlQW5nbGVCcmFja2V0c2AuXG4gICAgKiBUaGVzZSBpbmZlcnJlZCB2YWx1ZXMgd2lsbCBiZSBvdmVycmlkZGVuIGJ5IGNvcnJlc3BvbmRpbmcgc2V0dGluZ3MgaWYgc3BlY2lmaWVkLlxuICAgICovXG4gIG9yaWdpbmFsTGluaz86IHN0cmluZyB8IHVuZGVmaW5lZDtcblxuICAvKipcbiAgICogV2hldGhlciB0byBhbGxvdyBub24tZXhpc3RpbmcgZmlsZXMuIElmIGBmYWxzZWAgYW5kIGBwYXRoT3JGaWxlYCBpcyBhIG5vbi1leGlzdGluZyBmaWxlLCBhbiBlcnJvciB3aWxsIGJlIHRocm93bi4gRGVmYXVsdHMgdG8gYGZhbHNlYC5cbiAgICovXG4gIGFsbG93Tm9uRXhpc3RpbmdGaWxlPzogYm9vbGVhbiB8IHVuZGVmaW5lZDtcblxuICAvKipcbiAgICogV2hldGhlciB0byBhbGxvdyBhbiBlbXB0eSBhbGlhcyBmb3IgZW1iZWRzLiBEZWZhdWx0cyB0byBgdHJ1ZWAuXG4gICAqL1xuICBhbGxvd0VtcHR5RW1iZWRBbGlhcz86IGJvb2xlYW4gfCB1bmRlZmluZWQ7XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdG8gaW5jbHVkZSB0aGUgYXR0YWNobWVudCBleHRlbnNpb24gaW4gdGhlIGVtYmVkIGFsaWFzLiBIYXMgbm8gZWZmZWN0IGlmIGBhbGxvd0VtcHR5RW1iZWRBbGlhc2AgaXMgYHRydWVgLiBEZWZhdWx0cyB0byBgZmFsc2VgLlxuICAgKi9cbiAgaW5jbHVkZUF0dGFjaG1lbnRFeHRlbnNpb25Ub0VtYmVkQWxpYXM/OiBib29sZWFuIHwgdW5kZWZpbmVkO1xufVxuXG4vKipcbiAqIEdlbmVyYXRlcyBhIG1hcmtkb3duIGxpbmsgYmFzZWQgb24gdGhlIHByb3ZpZGVkIHBhcmFtZXRlcnMuXG4gKlxuICogQHBhcmFtIG9wdGlvbnMgLSBUaGUgb3B0aW9ucyBmb3IgZ2VuZXJhdGluZyB0aGUgbWFya2Rvd24gbGluay5cbiAqIEByZXR1cm5zIFRoZSBnZW5lcmF0ZWQgbWFya2Rvd24gbGluay5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdlbmVyYXRlTWFya2Rvd25MaW5rKG9wdGlvbnM6IEdlbmVyYXRlTWFya2Rvd25MaW5rT3B0aW9ucyk6IHN0cmluZyB7XG4gIGNvbnN0IHsgYXBwIH0gPSBvcHRpb25zO1xuXG4gIGNvbnN0IGNvbmZpZ3VyYWJsZURlZmF1bHRPcHRpb25zRm4gPSAoYXBwLmZpbGVNYW5hZ2VyLmdlbmVyYXRlTWFya2Rvd25MaW5rIGFzIFBhcnRpYWw8R2VuZXJhdGVNYXJrZG93bkxpbmtEZWZhdWx0T3B0aW9uc1dyYXBwZXI+KS5kZWZhdWx0T3B0aW9uc0ZuID8/ICgoKTogUGFydGlhbDxHZW5lcmF0ZU1hcmtkb3duTGlua09wdGlvbnM+ID0+ICh7fSkpO1xuICBjb25zdCBjb25maWd1cmFibGVEZWZhdWx0T3B0aW9ucyA9IGNvbmZpZ3VyYWJsZURlZmF1bHRPcHRpb25zRm4oKTtcblxuICBjb25zdCBERUZBVUxUX09QVElPTlM6IFBhcnRpYWw8R2VuZXJhdGVNYXJrZG93bkxpbmtPcHRpb25zPiA9IHtcbiAgICBhbGxvd0VtcHR5RW1iZWRBbGlhczogdHJ1ZVxuICB9O1xuXG4gIG9wdGlvbnMgPSB7IC4uLkRFRkFVTFRfT1BUSU9OUywgLi4uY29uZmlndXJhYmxlRGVmYXVsdE9wdGlvbnMsIC4uLm9wdGlvbnMgfTtcblxuICBjb25zdCBmaWxlID0gZ2V0RmlsZShhcHAsIG9wdGlvbnMucGF0aE9yRmlsZSwgb3B0aW9ucy5hbGxvd05vbkV4aXN0aW5nRmlsZSk7XG5cbiAgcmV0dXJuIHRlbXBSZWdpc3RlckZpbGVBbmRSdW4oYXBwLCBmaWxlLCAoKSA9PiB7XG4gICAgY29uc3Qgc291cmNlUGF0aCA9IGdldFBhdGgob3B0aW9ucy5zb3VyY2VQYXRoT3JGaWxlKTtcbiAgICBjb25zdCBzdWJwYXRoID0gb3B0aW9ucy5zdWJwYXRoID8/ICcnO1xuICAgIGxldCBhbGlhcyA9IG9wdGlvbnMuYWxpYXMgPz8gJyc7XG4gICAgY29uc3QgaXNFbWJlZCA9IG9wdGlvbnMuaXNFbWJlZCA/PyAob3B0aW9ucy5vcmlnaW5hbExpbmsgPyB0ZXN0RW1iZWQob3B0aW9ucy5vcmlnaW5hbExpbmspIDogdW5kZWZpbmVkKSA/PyAhaXNNYXJrZG93bkZpbGUoZmlsZSk7XG4gICAgY29uc3QgaXNXaWtpbGluayA9IG9wdGlvbnMuaXNXaWtpbGluayA/PyAob3B0aW9ucy5vcmlnaW5hbExpbmsgPyB0ZXN0V2lraWxpbmsob3B0aW9ucy5vcmlnaW5hbExpbmspIDogdW5kZWZpbmVkKSA/PyBzaG91bGRVc2VXaWtpbGlua3MoYXBwKTtcbiAgICBjb25zdCBmb3JjZVJlbGF0aXZlUGF0aCA9IG9wdGlvbnMuZm9yY2VSZWxhdGl2ZVBhdGggPz8gc2hvdWxkVXNlUmVsYXRpdmVMaW5rcyhhcHApO1xuICAgIGNvbnN0IHVzZUxlYWRpbmdEb3QgPSBvcHRpb25zLnVzZUxlYWRpbmdEb3QgPz8gKG9wdGlvbnMub3JpZ2luYWxMaW5rID8gdGVzdExlYWRpbmdEb3Qob3B0aW9ucy5vcmlnaW5hbExpbmspIDogdW5kZWZpbmVkKSA/PyBmYWxzZTtcbiAgICBjb25zdCB1c2VBbmdsZUJyYWNrZXRzID0gb3B0aW9ucy51c2VBbmdsZUJyYWNrZXRzID8/IChvcHRpb25zLm9yaWdpbmFsTGluayA/IHRlc3RBbmdsZUJyYWNrZXRzKG9wdGlvbnMub3JpZ2luYWxMaW5rKSA6IHVuZGVmaW5lZCkgPz8gZmFsc2U7XG5cbiAgICBsZXQgbGlua1RleHQgPSBmaWxlLnBhdGggPT09IHNvdXJjZVBhdGggJiYgc3VicGF0aFxuICAgICAgPyBzdWJwYXRoXG4gICAgICA6IGZvcmNlUmVsYXRpdmVQYXRoXG4gICAgICAgID8gcmVsYXRpdmUoZGlybmFtZShzb3VyY2VQYXRoKSwgaXNXaWtpbGluayA/IHRyaW1NYXJrZG93bkV4dGVuc2lvbihmaWxlKSA6IGZpbGUucGF0aCkgKyBzdWJwYXRoXG4gICAgICAgIDogYXBwLm1ldGFkYXRhQ2FjaGUuZmlsZVRvTGlua3RleHQoZmlsZSwgc291cmNlUGF0aCwgaXNXaWtpbGluaykgKyBzdWJwYXRoO1xuXG4gICAgaWYgKGZvcmNlUmVsYXRpdmVQYXRoICYmIHVzZUxlYWRpbmdEb3QgJiYgIWxpbmtUZXh0LnN0YXJ0c1dpdGgoJy4nKSAmJiAhbGlua1RleHQuc3RhcnRzV2l0aCgnIycpKSB7XG4gICAgICBsaW5rVGV4dCA9ICcuLycgKyBsaW5rVGV4dDtcbiAgICB9XG5cbiAgICBjb25zdCBlbWJlZFByZWZpeCA9IGlzRW1iZWQgPyAnIScgOiAnJztcblxuICAgIGlmICghaXNXaWtpbGluaykge1xuICAgICAgaWYgKHVzZUFuZ2xlQnJhY2tldHMpIHtcbiAgICAgICAgbGlua1RleHQgPSBgPCR7bGlua1RleHR9PmA7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBsaW5rVGV4dCA9IGxpbmtUZXh0LnJlcGxhY2UoU1BFQ0lBTF9MSU5LX1NZTUJPTFNfUkVHRVhQLCBmdW5jdGlvbiAoc3BlY2lhbExpbmtTeW1ib2wpIHtcbiAgICAgICAgICByZXR1cm4gZW5jb2RlVVJJQ29tcG9uZW50KHNwZWNpYWxMaW5rU3ltYm9sKTtcbiAgICAgICAgfSk7XG4gICAgICB9XG5cbiAgICAgIGlmICghYWxpYXMgJiYgKCFpc0VtYmVkIHx8ICFvcHRpb25zLmFsbG93RW1wdHlFbWJlZEFsaWFzKSkge1xuICAgICAgICBhbGlhcyA9ICFvcHRpb25zLmluY2x1ZGVBdHRhY2htZW50RXh0ZW5zaW9uVG9FbWJlZEFsaWFzIHx8IGlzTWFya2Rvd25GaWxlKGZpbGUpID8gZmlsZS5iYXNlbmFtZSA6IGZpbGUubmFtZTtcbiAgICAgIH1cblxuICAgICAgYWxpYXMgPSBhbGlhcy5yZXBsYWNlKFNQRUNJQUxfTUFSS0RPV05fTElOS19TWU1CT0xTX1JFR0VYLCAnXFxcXCQmJyk7XG5cbiAgICAgIHJldHVybiBgJHtlbWJlZFByZWZpeH1bJHthbGlhc31dKCR7bGlua1RleHR9KWA7XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmIChhbGlhcyAmJiBhbGlhcy50b0xvd2VyQ2FzZSgpID09PSBsaW5rVGV4dC50b0xvd2VyQ2FzZSgpKSB7XG4gICAgICAgIGxpbmtUZXh0ID0gYWxpYXM7XG4gICAgICAgIGFsaWFzID0gJyc7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGFsaWFzUGFydCA9IGFsaWFzID8gYHwke2FsaWFzfWAgOiAnJztcbiAgICAgIHJldHVybiBgJHtlbWJlZFByZWZpeH1bWyR7bGlua1RleHR9JHthbGlhc1BhcnR9XV1gO1xuICAgIH1cbiAgfSk7XG59XG5cbi8qKlxuICogRWRpdHMgdGhlIGxpbmtzIGluIHRoZSBzcGVjaWZpZWQgZmlsZSBvciBwYXRoIHVzaW5nIHRoZSBwcm92aWRlZCBsaW5rIGNvbnZlcnRlciBmdW5jdGlvbi5cbiAqXG4gKiBAcGFyYW0gYXBwIC0gVGhlIE9ic2lkaWFuIGFwcGxpY2F0aW9uIGluc3RhbmNlLlxuICogQHBhcmFtIHBhdGhPckZpbGUgLSBUaGUgcGF0aCBvciBmaWxlIHRvIGVkaXQgdGhlIGxpbmtzIGluLlxuICogQHBhcmFtIGxpbmtDb252ZXJ0ZXIgLSBUaGUgZnVuY3Rpb24gdGhhdCBjb252ZXJ0cyBlYWNoIGxpbmsuXG4gKiBAcGFyYW0gcmV0cnlPcHRpb25zIC0gT3B0aW9uYWwgb3B0aW9ucyBmb3IgcmV0cnlpbmcgdGhlIG9wZXJhdGlvbi5cbiAqIEByZXR1cm5zIEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHdoZW4gdGhlIGxpbmtzIGhhdmUgYmVlbiBlZGl0ZWQuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBlZGl0TGlua3MoXG4gIGFwcDogQXBwLFxuICBwYXRoT3JGaWxlOiBQYXRoT3JGaWxlLFxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWludmFsaWQtdm9pZC10eXBlXG4gIGxpbmtDb252ZXJ0ZXI6IChsaW5rOiBSZWZlcmVuY2UpID0+IE1heWJlUHJvbWlzZTxzdHJpbmcgfCB2b2lkPixcbiAgcmV0cnlPcHRpb25zOiBQYXJ0aWFsPFJldHJ5T3B0aW9ucz4gPSB7fSk6IFByb21pc2U8dm9pZD4ge1xuICBhd2FpdCBhcHBseUZpbGVDaGFuZ2VzKGFwcCwgcGF0aE9yRmlsZSwgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IGNhY2hlID0gYXdhaXQgZ2V0Q2FjaGVTYWZlKGFwcCwgcGF0aE9yRmlsZSk7XG4gICAgaWYgKCFjYWNoZSkge1xuICAgICAgcmV0dXJuIFtdO1xuICAgIH1cblxuICAgIGNvbnN0IGNoYW5nZXM6IEZpbGVDaGFuZ2VbXSA9IFtdO1xuXG4gICAgZm9yIChjb25zdCBsaW5rIG9mIGdldEFsbExpbmtzKGNhY2hlKSkge1xuICAgICAgY29uc3QgbmV3Q29udGVudCA9IGF3YWl0IGxpbmtDb252ZXJ0ZXIobGluayk7XG4gICAgICBpZiAobmV3Q29udGVudCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICBpZiAoaXNSZWZlcmVuY2VDYWNoZShsaW5rKSkge1xuICAgICAgICBjaGFuZ2VzLnB1c2goe1xuICAgICAgICAgIHN0YXJ0SW5kZXg6IGxpbmsucG9zaXRpb24uc3RhcnQub2Zmc2V0LFxuICAgICAgICAgIGVuZEluZGV4OiBsaW5rLnBvc2l0aW9uLmVuZC5vZmZzZXQsXG4gICAgICAgICAgb2xkQ29udGVudDogbGluay5vcmlnaW5hbCxcbiAgICAgICAgICBuZXdDb250ZW50XG4gICAgICAgIH0gYXMgQ29udGVudENoYW5nZSk7XG4gICAgICB9IGVsc2UgaWYgKGlzRnJvbnRtYXR0ZXJMaW5rQ2FjaGUobGluaykpIHtcbiAgICAgICAgY2hhbmdlcy5wdXNoKHtcbiAgICAgICAgICBvbGRDb250ZW50OiBsaW5rLm9yaWdpbmFsLFxuICAgICAgICAgIG5ld0NvbnRlbnQsXG4gICAgICAgICAgZnJvbnRNYXR0ZXJLZXk6IGxpbmsua2V5XG4gICAgICAgIH0gYXMgRnJvbnRtYXR0ZXJDaGFuZ2UpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBjaGFuZ2VzO1xuICB9LCByZXRyeU9wdGlvbnMpO1xufVxuXG4vKipcbiAqIFRlc3RzIHdoZXRoZXIgYSBsaW5rIGlzIGFuIGVtYmVkIGxpbms6XG4gKiBgIVtbbGlua11dYCwgYCFbdGl0bGVdKGxpbmspYC5cbiAqXG4gKiBAcGFyYW0gbGluayAtIExpbmsgdG8gdGVzdFxuICogQHJldHVybnMgV2hldGhlciB0aGUgbGluayBpcyBhbiBlbWJlZCBsaW5rXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB0ZXN0RW1iZWQobGluazogc3RyaW5nKTogYm9vbGVhbiB7XG4gIHJldHVybiBsaW5rLnN0YXJ0c1dpdGgoJyFbJyk7XG59XG5cbi8qKlxuICogVGVzdHMgd2hldGhlciBhIGxpbmsgaXMgYSB3aWtpbGluaywgcG9zc2libHkgZW1iZWQ6XG4gKiBgW1tsaW5rXV1gLCBgIVtbbGlua11dYC5cbiAqXG4gKiBAcGFyYW0gbGluayAtIExpbmsgdG8gdGVzdFxuICogQHJldHVybnMgV2hldGhlciB0aGUgbGluayBpcyBhIHdpa2lsaW5rXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB0ZXN0V2lraWxpbmsobGluazogc3RyaW5nKTogYm9vbGVhbiB7XG4gIHJldHVybiBsaW5rLmluY2x1ZGVzKCdbWycpO1xufVxuXG4vKipcbiAqIFRlc3RzIHdoZXRoZXIgYSBsaW5rIGhhcyBhIGxlYWRpbmcgZG90LCBwb3NzaWJseSBlbWJlZDpcbiAqIGBbWy4vbGlua11dYCwgYFt0aXRsZV0oLi9saW5rKWAsIGBbdGl0bGVdKDwuL2xpbms+KWAsXG4gKiBgIVtbLi9saW5rXV1gLCBgIVt0aXRsZV0oLi9saW5rKWAsIGAhW3RpdGxlXSg8Li9saW5rPilgLlxuICpcbiAqIEBwYXJhbSBsaW5rIC0gTGluayB0byB0ZXN0XG4gKiBAcmV0dXJucyBXaGV0aGVyIHRoZSBsaW5rIGhhcyBhIGxlYWRpbmcgZG90XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB0ZXN0TGVhZGluZ0RvdChsaW5rOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgcmV0dXJuIGxpbmsuaW5jbHVkZXMoJ1tbLi8nKSB8fCBsaW5rLmluY2x1ZGVzKCddKC4vJykgfHwgbGluay5pbmNsdWRlcygnXSg8Li8nKTtcbn1cblxuLyoqXG4gKiBUZXN0cyB3aGV0aGVyIGEgbGluayB1c2VzIGFuZ2xlIGJyYWNrZXRzLCBwb3NzaWJseSBlbWJlZDpcbiAqIGBbdGl0bGVdKDxsaW5rPilgLCBgIVt0aXRsZV0oPGxpbms+KWAuXG4gKlxuICogQHBhcmFtIGxpbmsgLSBMaW5rIHRvIHRlc3RcbiAqIEByZXR1cm5zIFdoZXRoZXIgdGhlIGxpbmsgdXNlcyBhbmdsZSBicmFja2V0c1xuICovXG5leHBvcnQgZnVuY3Rpb24gdGVzdEFuZ2xlQnJhY2tldHMobGluazogc3RyaW5nKTogYm9vbGVhbiB7XG4gIHJldHVybiBsaW5rLmluY2x1ZGVzKCddKDwnKTtcbn1cbiJdLAogICJtYXBwaW5ncyI6ICI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtB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
@@ -4,7 +4,7 @@
4
4
  * functions to split paths, update links in files, and generate markdown links with various options.
5
5
  * The functions integrate with Obsidian's API to ensure that links are managed correctly within the vault.
6
6
  **/
7
- import type { App, ReferenceCache, TFile } from 'obsidian';
7
+ import type { App, Reference, TFile } from 'obsidian';
8
8
  import type { MaybePromise, RetryOptions } from '../Async.ts';
9
9
  import type { PathOrFile } from './FileSystem.ts';
10
10
  /**
@@ -76,9 +76,9 @@ export interface ConvertLinkOptions {
76
76
  */
77
77
  app: App;
78
78
  /**
79
- * The reference cache for the link.
79
+ * The reference for the link.
80
80
  */
81
- link: ReferenceCache;
81
+ link: Reference;
82
82
  /**
83
83
  * The source file containing the link.
84
84
  */
@@ -115,7 +115,7 @@ export declare function convertLink(options: ConvertLinkOptions): string;
115
115
  * @param notePathOrFile - The path or file of the note containing the link.
116
116
  * @returns The file associated with the link, or null if not found.
117
117
  */
118
- export declare function extractLinkFile(app: App, link: ReferenceCache, notePathOrFile: PathOrFile): TFile | null;
118
+ export declare function extractLinkFile(app: App, link: Reference, notePathOrFile: PathOrFile): TFile | null;
119
119
  /**
120
120
  * Options for updating a link.
121
121
  */
@@ -125,9 +125,9 @@ export interface UpdateLinkOptions {
125
125
  */
126
126
  app: App;
127
127
  /**
128
- * The reference cache for the link.
128
+ * The reference for the link.
129
129
  */
130
- link: ReferenceCache;
130
+ link: Reference;
131
131
  /**
132
132
  * The file associated with the link.
133
133
  */
@@ -283,7 +283,7 @@ export declare function generateMarkdownLink(options: GenerateMarkdownLinkOption
283
283
  * @param retryOptions - Optional options for retrying the operation.
284
284
  * @returns A promise that resolves when the links have been edited.
285
285
  */
286
- export declare function editLinks(app: App, pathOrFile: PathOrFile, linkConverter: (link: ReferenceCache) => MaybePromise<string | void>, retryOptions?: Partial<RetryOptions>): Promise<void>;
286
+ export declare function editLinks(app: App, pathOrFile: PathOrFile, linkConverter: (link: Reference) => MaybePromise<string | void>, retryOptions?: Partial<RetryOptions>): Promise<void>;
287
287
  /**
288
288
  * Tests whether a link is an embed link:
289
289
  * `![[link]]`, `![title](link)`.
@@ -38,9 +38,10 @@ __export(MetadataCache_exports, {
38
38
  module.exports = __toCommonJS(MetadataCache_exports);
39
39
  var import_implementations = require('obsidian-typings/implementations');
40
40
  var import_Async = require('../Async.cjs');
41
- var import_Error = require('../Error.cjs');
42
41
  var import_Function = require('../Function.cjs');
42
+ var import_Object = require('../Object.cjs');
43
43
  var import_FileSystem = require('./FileSystem.cjs');
44
+ var import_FrontMatter = require('./FrontMatter.cjs');
44
45
  var __process = globalThis["process"] ?? {
45
46
  "cwd": () => "/",
46
47
  "env": {},
@@ -92,13 +93,33 @@ function getAllLinks(cache) {
92
93
  if (cache.embeds) {
93
94
  links.push(...cache.embeds);
94
95
  }
95
- links.sort((a, b) => a.position.start.offset - b.position.start.offset);
96
+ if (cache.frontmatterLinks) {
97
+ links.push(...cache.frontmatterLinks);
98
+ }
99
+ links.sort((a, b) => {
100
+ if ((0, import_implementations.isFrontmatterLinkCache)(a) && (0, import_implementations.isFrontmatterLinkCache)(b)) {
101
+ return a.key.localeCompare(b.key);
102
+ }
103
+ if ((0, import_implementations.isReferenceCache)(a) && (0, import_implementations.isReferenceCache)(b)) {
104
+ return a.position.start.offset - b.position.start.offset;
105
+ }
106
+ return (0, import_implementations.isFrontmatterLinkCache)(a) ? 1 : -1;
107
+ });
96
108
  links = links.filter((link, index) => {
97
109
  if (index === 0) {
98
110
  return true;
99
111
  }
100
- const previousLink = links[index - 1] ?? (0, import_Error.throwExpression)(new Error("Previous link not found"));
101
- return link.position.start.offset !== previousLink.position.start.offset;
112
+ const previousLink = links[index - 1];
113
+ if (!previousLink) {
114
+ return true;
115
+ }
116
+ if ((0, import_implementations.isReferenceCache)(link) && (0, import_implementations.isReferenceCache)(previousLink)) {
117
+ return link.position.start.offset !== previousLink.position.start.offset;
118
+ }
119
+ if ((0, import_implementations.isFrontmatterLinkCache)(link) && (0, import_implementations.isFrontmatterLinkCache)(previousLink)) {
120
+ return link.key !== previousLink.key;
121
+ }
122
+ return true;
102
123
  });
103
124
  return links;
104
125
  }
@@ -125,9 +146,24 @@ async function getBacklinksForFileSafe(app, pathOrFile, retryOptions = {}) {
125
146
  }
126
147
  await saveNote(app, note);
127
148
  const content = await app.vault.read(note);
128
- const links = backlinks.get(notePath) ?? (0, import_Error.throwExpression)(new Error("Backlinks not found"));
149
+ const frontMatter = (0, import_FrontMatter.parseFrontMatter)(content);
150
+ const links = backlinks.get(notePath);
151
+ if (!links) {
152
+ return false;
153
+ }
129
154
  for (const link of links) {
130
- const actualLink = content.slice(link.position.start.offset, link.position.end.offset);
155
+ let actualLink;
156
+ if ((0, import_implementations.isReferenceCache)(link)) {
157
+ actualLink = content.slice(link.position.start.offset, link.position.end.offset);
158
+ } else if ((0, import_implementations.isFrontmatterLinkCache)(link)) {
159
+ const linkValue = (0, import_Object.getNestedPropertyValue)(frontMatter, link.key);
160
+ if (typeof linkValue !== "string") {
161
+ return false;
162
+ }
163
+ actualLink = linkValue;
164
+ } else {
165
+ return true;
166
+ }
131
167
  if (actualLink !== link.original) {
132
168
  return false;
133
169
  }
@@ -220,4 +256,4 @@ async function ensureMetadataCacheReady(app) {
220
256
  registerFile,
221
257
  tempRegisterFileAndRun
222
258
  });
223
- //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL29ic2lkaWFuL01ldGFkYXRhQ2FjaGUudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbInZhciBfX3Byb2Nlc3MgPSBnbG9iYWxUaGlzWydwcm9jZXNzJ10gPz8ge1xuICBcImN3ZFwiOiAoKT0+XCIvXCIsXG4gIFwiZW52XCI6IHt9LFxuICBcInBsYXRmb3JtXCI6IFwiYW5kcm9pZFwiXG59O1xuLyoqXG4gKiBAcGFja2FnZURvY3VtZW50YXRpb24gTWV0YWRhdGFDYWNoZVxuICogVGhpcyBtb2R1bGUgcHJvdmlkZXMgdXRpbGl0eSBmdW5jdGlvbnMgZm9yIHdvcmtpbmcgd2l0aCB0aGUgbWV0YWRhdGEgY2FjaGUgaW4gT2JzaWRpYW4uXG4gKi9cblxuaW1wb3J0IHR5cGUge1xuICBBcHAsXG4gIENhY2hlZE1ldGFkYXRhLFxuICBNYXJrZG93blZpZXcsXG4gIFJlZmVyZW5jZUNhY2hlLFxuICBUQWJzdHJhY3RGaWxlXG59IGZyb20gJ29ic2lkaWFuJztcbmltcG9ydCB0eXBlIHsgQ3VzdG9tQXJyYXlEaWN0IH0gZnJvbSAnb2JzaWRpYW4tdHlwaW5ncyc7XG5pbXBvcnQgeyBwYXJlbnRGb2xkZXJQYXRoIH0gZnJvbSAnb2JzaWRpYW4tdHlwaW5ncy9pbXBsZW1lbnRhdGlvbnMnO1xuXG5pbXBvcnQgdHlwZSB7IFJldHJ5T3B0aW9ucyB9IGZyb20gJy4uL0FzeW5jLnRzJztcbmltcG9ydCB7IHJldHJ5V2l0aFRpbWVvdXQgfSBmcm9tICcuLi9Bc3luYy50cyc7XG5pbXBvcnQgeyB0aHJvd0V4cHJlc3Npb24gfSBmcm9tICcuLi9FcnJvci50cyc7XG5pbXBvcnQgeyBub29wIH0gZnJvbSAnLi4vRnVuY3Rpb24udHMnO1xuaW1wb3J0IHR5cGUgeyBQYXRoT3JGaWxlIH0gZnJvbSAnLi9GaWxlU3lzdGVtLnRzJztcbmltcG9ydCB7XG4gIGdldEZpbGUsXG4gIGdldEZpbGVPck51bGwsXG4gIGdldEZvbGRlcixcbiAgZ2V0UGF0aCxcbiAgaXNGaWxlLFxuICBpc01hcmtkb3duRmlsZVxufSBmcm9tICcuL0ZpbGVTeXN0ZW0udHMnO1xuaW1wb3J0IHR5cGUgeyBDb21iaW5lZEZyb250TWF0dGVyIH0gZnJvbSAnLi9Gcm9udE1hdHRlci50cyc7XG5cbi8qKlxuICogUmV0cmlldmVzIHRoZSBjYWNoZWQgbWV0YWRhdGEgZm9yIGEgZ2l2ZW4gZmlsZSBvciBwYXRoLlxuICpcbiAqIEBwYXJhbSBhcHAgLSBUaGUgT2JzaWRpYW4gYXBwIGluc3RhbmNlLlxuICogQHBhcmFtIGZpbGVPclBhdGggLSBUaGUgZmlsZSBvciBwYXRoIHRvIHJldHJpZXZlIHRoZSBtZXRhZGF0YSBmb3IuXG4gKiBAcGFyYW0gcmV0cnlPcHRpb25zIC0gT3B0aW9uYWwgcmV0cnkgb3B0aW9ucyBmb3IgdGhlIHJldHJpZXZhbCBwcm9jZXNzLlxuICogQHJldHVybnMgVGhlIGNhY2hlZCBtZXRhZGF0YSBmb3IgdGhlIGZpbGUsIG9yIG51bGwgaWYgaXQgZG9lc24ndCBleGlzdC5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdldENhY2hlU2FmZShhcHA6IEFwcCwgZmlsZU9yUGF0aDogUGF0aE9yRmlsZSwgcmV0cnlPcHRpb25zOiBQYXJ0aWFsPFJldHJ5T3B0aW9ucz4gPSB7fSk6IFByb21pc2U8Q2FjaGVkTWV0YWRhdGEgfCBudWxsPiB7XG4gIGNvbnN0IERFRkFVTFRfUkVUUllfT1BUSU9OUzogUGFydGlhbDxSZXRyeU9wdGlvbnM+ID0geyB0aW1lb3V0SW5NaWxsaXNlY29uZHM6IDYwMDAwIH07XG4gIGNvbnN0IG92ZXJyaWRkZW5PcHRpb25zOiBQYXJ0aWFsPFJldHJ5T3B0aW9ucz4gPSB7IC4uLkRFRkFVTFRfUkVUUllfT1BUSU9OUywgLi4ucmV0cnlPcHRpb25zIH07XG4gIGxldCBjYWNoZTogQ2FjaGVkTWV0YWRhdGEgfCBudWxsID0gbnVsbDtcblxuICBhd2FpdCByZXRyeVdpdGhUaW1lb3V0KGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBmaWxlID0gZ2V0RmlsZU9yTnVsbChhcHAsIGZpbGVPclBhdGgpO1xuXG4gICAgaWYgKCFmaWxlIHx8IGZpbGUuZGVsZXRlZCkge1xuICAgICAgY2FjaGUgPSBudWxsO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgYXdhaXQgc2F2ZU5vdGUoYXBwLCBmaWxlKTtcblxuICAgIGNvbnN0IGZpbGVJbmZvID0gYXBwLm1ldGFkYXRhQ2FjaGUuZ2V0RmlsZUluZm8oZmlsZS5wYXRoKTtcbiAgICBjb25zdCBzdGF0ID0gYXdhaXQgYXBwLnZhdWx0LmFkYXB0ZXIuc3RhdChmaWxlLnBhdGgpO1xuXG4gICAgaWYgKCFmaWxlSW5mbykge1xuICAgICAgY29uc29sZS5kZWJ1ZyhgRmlsZSBjYWNoZSBpbmZvIGZvciAke2ZpbGUucGF0aH0gaXMgbWlzc2luZ2ApO1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH0gZWxzZSBpZiAoIXN0YXQpIHtcbiAgICAgIGNvbnNvbGUuZGVidWcoYEZpbGUgc3RhdCBmb3IgJHtmaWxlLnBhdGh9IGlzIG1pc3NpbmdgKTtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9IGVsc2UgaWYgKGZpbGUuc3RhdC5tdGltZSA8IHN0YXQubXRpbWUpIHtcbiAgICAgIGFwcC52YXVsdC5vbkNoYW5nZSgnbW9kaWZpZWQnLCBmaWxlLnBhdGgsIHVuZGVmaW5lZCwgc3RhdCk7XG4gICAgICBjb25zb2xlLmRlYnVnKGBDYWNoZWQgdGltZXN0YW1wIGZvciAke2ZpbGUucGF0aH0gaXMgZnJvbSAke25ldyBEYXRlKGZpbGUuc3RhdC5tdGltZSkudG9TdHJpbmcoKX0gd2hpY2ggaXMgb2xkZXIgdGhhbiB0aGUgZmlsZSBzeXN0ZW0gbW9kaWZpY2F0aW9uIHRpbWVzdGFtcCAke25ldyBEYXRlKHN0YXQubXRpbWUpLnRvU3RyaW5nKCl9YCk7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfSBlbHNlIGlmIChmaWxlSW5mby5tdGltZSA8IHN0YXQubXRpbWUpIHtcbiAgICAgIGNvbnNvbGUuZGVidWcoYEZpbGUgY2FjaGUgaW5mbyBmb3IgJHtmaWxlLnBhdGh9IGlzIGZyb20gJHtuZXcgRGF0ZShmaWxlSW5mby5tdGltZSkudG9TdHJpbmcoKX0gd2hpY2ggaXMgb2xkZXIgdGhhbiB0aGUgZmlsZSBtb2RpZmljYXRpb24gdGltZXN0YW1wICR7bmV3IERhdGUoc3RhdC5tdGltZSkudG9TdHJpbmcoKX1gKTtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9IGVsc2Uge1xuICAgICAgY2FjaGUgPSBhcHAubWV0YWRhdGFDYWNoZS5nZXRGaWxlQ2FjaGUoZmlsZSk7XG4gICAgICBpZiAoIWNhY2hlKSB7XG4gICAgICAgIGNvbnNvbGUuZGVidWcoYEZpbGUgY2FjaGUgZm9yICR7ZmlsZS5wYXRofSBpcyBtaXNzaW5nYCk7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuICAgIH1cbiAgfSwgb3ZlcnJpZGRlbk9wdGlvbnMpO1xuXG4gIHJldHVybiBjYWNoZTtcbn1cblxuLyoqXG4gKiBSZXRyaWV2ZXMgYWxsIGxpbmtzIGZyb20gdGhlIHByb3ZpZGVkIGNhY2hlLlxuICpcbiAqIEBwYXJhbSBjYWNoZSAtIFRoZSBjYWNoZWQgbWV0YWRhdGEuXG4gKiBAcmV0dXJucyBBbiBhcnJheSBvZiByZWZlcmVuY2UgY2FjaGVzIHJlcHJlc2VudGluZyB0aGUgbGlua3MuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRBbGxMaW5rcyhjYWNoZTogQ2FjaGVkTWV0YWRhdGEpOiBSZWZlcmVuY2VDYWNoZVtdIHtcbiAgbGV0IGxpbmtzOiBSZWZlcmVuY2VDYWNoZVtdID0gW107XG5cbiAgaWYgKGNhY2hlLmxpbmtzKSB7XG4gICAgbGlua3MucHVzaCguLi5jYWNoZS5saW5rcyk7XG4gIH1cblxuICBpZiAoY2FjaGUuZW1iZWRzKSB7XG4gICAgbGlua3MucHVzaCguLi5jYWNoZS5lbWJlZHMpO1xuICB9XG5cbiAgbGlua3Muc29ydCgoYSwgYikgPT4gYS5wb3NpdGlvbi5zdGFydC5vZmZzZXQgLSBiLnBvc2l0aW9uLnN0YXJ0Lm9mZnNldCk7XG5cbiAgLy8gQlVHOiBodHRwczovL2ZvcnVtLm9ic2lkaWFuLm1kL3QvYnVnLWR1cGxpY2F0ZWQtbGlua3MtaW4tbWV0YWRhdGFjYWNoZS1pbnNpZGUtZm9vdG5vdGVzLzg1NTUxXG4gIGxpbmtzID0gbGlua3MuZmlsdGVyKChsaW5rLCBpbmRleCkgPT4ge1xuICAgIGlmIChpbmRleCA9PT0gMCkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIGNvbnN0IHByZXZpb3VzTGluayA9IGxpbmtzW2luZGV4IC0gMV0gPz8gdGhyb3dFeHByZXNzaW9uKG5ldyBFcnJvcignUHJldmlvdXMgbGluayBub3QgZm91bmQnKSk7XG4gICAgcmV0dXJuIGxpbmsucG9zaXRpb24uc3RhcnQub2Zmc2V0ICE9PSBwcmV2aW91c0xpbmsucG9zaXRpb24uc3RhcnQub2Zmc2V0O1xuICB9KTtcblxuICByZXR1cm4gbGlua3M7XG59XG5cbi8qKlxuICogV3JhcHBlciBmb3IgdGhlIGdldEJhY2tsaW5rc0ZvckZpbGUgbWV0aG9kIHRoYXQgcHJvdmlkZXMgYSBzYWZlIG92ZXJsb2FkLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEdldEJhY2tsaW5rc0ZvckZpbGVTYWZlV3JhcHBlciB7XG4gIC8qKlxuICAgKiBSZXRyaWV2ZXMgdGhlIGJhY2tsaW5rcyBmb3IgYSBmaWxlIHNhZmVseS5cbiAgICpcbiAgICogQHBhcmFtIHBhdGhPckZpbGUgLSBUaGUgcGF0aCBvciBmaWxlIG9iamVjdC5cbiAgICogQHJldHVybnMgQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgdG8gYW4gYXJyYXkgZGljdGlvbmFyeSBvZiBiYWNrbGlua3MuXG4gICAqL1xuICBzYWZlKHBhdGhPckZpbGU6IFBhdGhPckZpbGUpOiBQcm9taXNlPEN1c3RvbUFycmF5RGljdDxSZWZlcmVuY2VDYWNoZT4+O1xufVxuXG4vKipcbiAqIFJldHJpZXZlcyB0aGUgYmFja2xpbmtzIGZvciBhIGZpbGUgb3IgcGF0aC5cbiAqIE5PVEU6IFRoZSBmaWxlIG1heSBiZSBub24tZXhpc3RlbnQuXG4gKlxuICogQHBhcmFtIGFwcCAtIFRoZSBPYnNpZGlhbiBhcHBsaWNhdGlvbiBpbnN0YW5jZS5cbiAqIEBwYXJhbSBwYXRoT3JGaWxlIC0gVGhlIHBhdGggb3IgZmlsZSBvYmplY3QuXG4gKiBAcmV0dXJucyBUaGUgYmFja2xpbmtzIGZvciB0aGUgZmlsZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldEJhY2tsaW5rc0ZvckZpbGVPclBhdGgoYXBwOiBBcHAsIHBhdGhPckZpbGU6IFBhdGhPckZpbGUpOiBDdXN0b21BcnJheURpY3Q8UmVmZXJlbmNlQ2FjaGU+IHtcbiAgY29uc3QgZmlsZSA9IGdldEZpbGUoYXBwLCBwYXRoT3JGaWxlLCB0cnVlKTtcbiAgcmV0dXJuIHRlbXBSZWdpc3RlckZpbGVBbmRSdW4oYXBwLCBmaWxlLCAoKSA9PiBhcHAubWV0YWRhdGFDYWNoZS5nZXRCYWNrbGlua3NGb3JGaWxlKGZpbGUpKTtcbn1cblxuLyoqXG4gKiBSZXRyaWV2ZXMgdGhlIGJhY2tsaW5rcyBmb3IgYSBmaWxlIHNhZmVseS5cbiAqXG4gKiBAcGFyYW0gYXBwIC0gVGhlIE9ic2lkaWFuIGFwcGxpY2F0aW9uIGluc3RhbmNlLlxuICogQHBhcmFtIHBhdGhPckZpbGUgLSBUaGUgcGF0aCBvciBmaWxlIG9iamVjdC5cbiAqIEBwYXJhbSByZXRyeU9wdGlvbnMgLSBPcHRpb25hbCByZXRyeSBvcHRpb25zLlxuICogQHJldHVybnMgQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgdG8gYW4gYXJyYXkgZGljdGlvbmFyeSBvZiBiYWNrbGlua3MuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZXRCYWNrbGlua3NGb3JGaWxlU2FmZShhcHA6IEFwcCwgcGF0aE9yRmlsZTogUGF0aE9yRmlsZSwgcmV0cnlPcHRpb25zOiBQYXJ0aWFsPFJldHJ5T3B0aW9ucz4gPSB7fSk6IFByb21pc2U8Q3VzdG9tQXJyYXlEaWN0PFJlZmVyZW5jZUNhY2hlPj4ge1xuICBjb25zdCBzYWZlT3ZlcmxvYWQgPSAoYXBwLm1ldGFkYXRhQ2FjaGUuZ2V0QmFja2xpbmtzRm9yRmlsZSBhcyBQYXJ0aWFsPEdldEJhY2tsaW5rc0ZvckZpbGVTYWZlV3JhcHBlcj4pLnNhZmU7XG4gIGlmIChzYWZlT3ZlcmxvYWQpIHtcbiAgICByZXR1cm4gc2FmZU92ZXJsb2FkKHBhdGhPckZpbGUpO1xuICB9XG4gIGNvbnN0IERFRkFVTFRfUkVUUllfT1BUSU9OUzogUGFydGlhbDxSZXRyeU9wdGlvbnM+ID0geyB0aW1lb3V0SW5NaWxsaXNlY29uZHM6IDYwMDAwIH07XG4gIGNvbnN0IG92ZXJyaWRkZW5PcHRpb25zOiBQYXJ0aWFsPFJldHJ5T3B0aW9ucz4gPSB7IC4uLkRFRkFVTFRfUkVUUllfT1BUSU9OUywgLi4ucmV0cnlPcHRpb25zIH07XG4gIGxldCBiYWNrbGlua3M6IEN1c3RvbUFycmF5RGljdDxSZWZlcmVuY2VDYWNoZT4gPSBudWxsIGFzIHVua25vd24gYXMgQ3VzdG9tQXJyYXlEaWN0PFJlZmVyZW5jZUNhY2hlPjtcbiAgYXdhaXQgcmV0cnlXaXRoVGltZW91dChhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgZmlsZSA9IGdldEZpbGUoYXBwLCBwYXRoT3JGaWxlKTtcbiAgICBhd2FpdCBlbnN1cmVNZXRhZGF0YUNhY2hlUmVhZHkoYXBwKTtcbiAgICBiYWNrbGlua3MgPSBnZXRCYWNrbGlua3NGb3JGaWxlT3JQYXRoKGFwcCwgZmlsZSk7XG4gICAgZm9yIChjb25zdCBub3RlUGF0aCBvZiBiYWNrbGlua3Mua2V5cygpKSB7XG4gICAgICBjb25zdCBub3RlID0gZ2V0RmlsZU9yTnVsbChhcHAsIG5vdGVQYXRoKTtcbiAgICAgIGlmICghbm90ZSkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG5cbiAgICAgIGF3YWl0IHNhdmVOb3RlKGFwcCwgbm90ZSk7XG5cbiAgICAgIGNvbnN0IGNvbnRlbnQgPSBhd2FpdCBhcHAudmF1bHQucmVhZChub3RlKTtcbiAgICAgIGNvbnN0IGxpbmtzID0gYmFja2xpbmtzLmdldChub3RlUGF0aCkgPz8gdGhyb3dFeHByZXNzaW9uKG5ldyBFcnJvcignQmFja2xpbmtzIG5vdCBmb3VuZCcpKTtcbiAgICAgIGZvciAoY29uc3QgbGluayBvZiBsaW5rcykge1xuICAgICAgICBjb25zdCBhY3R1YWxMaW5rID0gY29udGVudC5zbGljZShsaW5rLnBvc2l0aW9uLnN0YXJ0Lm9mZnNldCwgbGluay5wb3NpdGlvbi5lbmQub2Zmc2V0KTtcbiAgICAgICAgaWYgKGFjdHVhbExpbmsgIT09IGxpbmsub3JpZ2luYWwpIHtcbiAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfSwgb3ZlcnJpZGRlbk9wdGlvbnMpO1xuXG4gIHJldHVybiBiYWNrbGlua3M7XG59XG5cbi8qKlxuICogR2V0cyB0aGUgYmFja2xpbmtzIG1hcCBmb3IgdGhlIHNwZWNpZmllZCBmaWxlcy5cbiAqXG4gKiBAcGFyYW0gYXBwIC0gVGhlIE9ic2lkaWFuIGFwcCBpbnN0YW5jZS5cbiAqIEBwYXJhbSBwYXRoT3JGaWxlcyAtIFRoZSBwYXRocyBvciBmaWxlcyB0byBnZXQgdGhlIGJhY2tsaW5rcyBmb3IuXG4gKiBAcGFyYW0gcmV0cnlPcHRpb25zIC0gT3B0aW9uYWwgcmV0cnkgb3B0aW9ucy5cbiAqIEByZXR1cm5zIEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHRvIGEgbWFwIG9mIGJhY2tsaW5rcy5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdldEJhY2tsaW5rc01hcChhcHA6IEFwcCwgcGF0aE9yRmlsZXM6IFBhdGhPckZpbGVbXSwgcmV0cnlPcHRpb25zOiBQYXJ0aWFsPFJldHJ5T3B0aW9ucz4gPSB7fSk6IFByb21pc2U8TWFwPHN0cmluZywgUmVmZXJlbmNlQ2FjaGVbXT4+IHtcbiAgY29uc3QgbWFwID0gbmV3IE1hcDxzdHJpbmcsIFJlZmVyZW5jZUNhY2hlW10+KCk7XG4gIGZvciAoY29uc3QgcGF0aE9yRmlsZSBvZiBwYXRoT3JGaWxlcykge1xuICAgIGNvbnN0IGN1c3RvbUFycmF5RGljdCA9IGF3YWl0IGdldEJhY2tsaW5rc0ZvckZpbGVTYWZlKGFwcCwgcGF0aE9yRmlsZSwgcmV0cnlPcHRpb25zKTtcbiAgICBmb3IgKGNvbnN0IHBhdGggb2YgY3VzdG9tQXJyYXlEaWN0LmtleXMoKSkge1xuICAgICAgY29uc3QgbWFwTGlua3MgPSBtYXAuZ2V0KHBhdGgpID8/IFtdO1xuICAgICAgY29uc3QgcGF0aExpbmtzID0gY3VzdG9tQXJyYXlEaWN0LmdldChwYXRoKSA/PyBbXTtcbiAgICAgIG1hcExpbmtzLnB1c2goLi4ucGF0aExpbmtzKTtcbiAgICAgIG1hcC5zZXQocGF0aCwgbWFwTGlua3MpO1xuICAgIH1cbiAgfVxuICByZXR1cm4gbWFwO1xufVxuXG4vKipcbiAqIFNhdmVzIHRoZSBzcGVjaWZpZWQgbm90ZSBpbiB0aGUgT2JzaWRpYW4gYXBwLlxuICpcbiAqIEBwYXJhbSBhcHAgLSBUaGUgT2JzaWRpYW4gYXBwIGluc3RhbmNlLlxuICogQHBhcmFtIHBhdGhPckZpbGUgLSBUaGUgbm90ZSB0byBiZSBzYXZlZC5cbiAqIEByZXR1cm5zIEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHdoZW4gdGhlIG5vdGUgaXMgc2F2ZWQuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIHNhdmVOb3RlKGFwcDogQXBwLCBwYXRoT3JGaWxlOiBQYXRoT3JGaWxlKTogUHJvbWlzZTx2b2lkPiB7XG4gIGlmICghaXNNYXJrZG93bkZpbGUocGF0aE9yRmlsZSkpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICBjb25zdCBwYXRoID0gZ2V0UGF0aChwYXRoT3JGaWxlKTtcblxuICBmb3IgKGNvbnN0IGxlYWYgb2YgYXBwLndvcmtzcGFjZS5nZXRMZWF2ZXNPZlR5cGUoJ21hcmtkb3duJykpIHtcbiAgICBjb25zdCB2aWV3ID0gbGVhZi52aWV3IGFzIE1hcmtkb3duVmlldztcbiAgICBpZiAodmlldy5maWxlPy5wYXRoID09PSBwYXRoKSB7XG4gICAgICBhd2FpdCB2aWV3LnNhdmUoKTtcbiAgICB9XG4gIH1cbn1cblxuLyoqXG4gKiBSZXRyaWV2ZXMgdGhlIGZyb250IG1hdHRlciBmcm9tIHRoZSBtZXRhZGF0YSBjYWNoZSBzYWZlbHkuXG4gKlxuICogQHR5cGVQYXJhbSBDdXN0b21Gcm9udE1hdHRlciAtIFRoZSB0eXBlIG9mIGN1c3RvbSBmcm9udCBtYXR0ZXIuXG4gKiBAcGFyYW0gYXBwIC0gVGhlIE9ic2lkaWFuIGFwcCBpbnN0YW5jZS5cbiAqIEBwYXJhbSBwYXRoT3JGaWxlIC0gVGhlIHBhdGggb3IgZmlsZSB0byByZXRyaWV2ZSB0aGUgZnJvbnQgbWF0dGVyIGZyb20uXG4gKiBAcmV0dXJucyBUaGUgY29tYmluZWQgZnJvbnQgbWF0dGVyLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2V0RnJvbnRNYXR0ZXJTYWZlPEN1c3RvbUZyb250TWF0dGVyID0gdW5rbm93bj4oYXBwOiBBcHAsIHBhdGhPckZpbGU6IFBhdGhPckZpbGUpOiBQcm9taXNlPENvbWJpbmVkRnJvbnRNYXR0ZXI8Q3VzdG9tRnJvbnRNYXR0ZXI+PiB7XG4gIGNvbnN0IGNhY2hlID0gYXdhaXQgZ2V0Q2FjaGVTYWZlKGFwcCwgcGF0aE9yRmlsZSk7XG4gIHJldHVybiAoY2FjaGU/LmZyb250bWF0dGVyID8/IHt9KSBhcyBDb21iaW5lZEZyb250TWF0dGVyPEN1c3RvbUZyb250TWF0dGVyPjtcbn1cblxuLyoqXG4gKiBUZW1wb3JhcmlseSByZWdpc3RlcnMgYSBmaWxlIGFuZCBydW5zIGEgZnVuY3Rpb24uXG4gKlxuICogQHBhcmFtIGFwcCAtIFRoZSBPYnNpZGlhbiBhcHAgaW5zdGFuY2UuXG4gKiBAcGFyYW0gZmlsZSAtIFRoZSBmaWxlIHRvIHRlbXBvcmFyaWx5IHJlZ2lzdGVyLlxuICogQHBhcmFtIGZuIC0gVGhlIGZ1bmN0aW9uIHRvIHJ1bi5cbiAqIEByZXR1cm5zIFRoZSByZXN1bHQgb2YgdGhlIGZ1bmN0aW9uLlxuICovXG5leHBvcnQgZnVuY3Rpb24gdGVtcFJlZ2lzdGVyRmlsZUFuZFJ1bjxUPihhcHA6IEFwcCwgZmlsZTogVEFic3RyYWN0RmlsZSwgZm46ICgpID0+IFQpOiBUIHtcbiAgY29uc3QgdW5yZWdpc3RlciA9IHJlZ2lzdGVyRmlsZShhcHAsIGZpbGUpO1xuXG4gIHRyeSB7XG4gICAgcmV0dXJuIGZuKCk7XG4gIH0gZmluYWxseSB7XG4gICAgdW5yZWdpc3RlcigpO1xuICB9XG59XG5cbi8qKipcbiAqIFJlZ2lzdGVycyBhIGZpbGUgaW4gdGhlIE9ic2lkaWFuIGFwcC5cbiAqXG4gKiBAcGFyYW0gYXBwIC0gVGhlIE9ic2lkaWFuIGFwcCBpbnN0YW5jZS5cbiAqIEBwYXJhbSBmaWxlIC0gVGhlIGZpbGUgdG8gcmVnaXN0ZXIuXG4gKiBAcmV0dXJucyBBIGZ1bmN0aW9uIHRoYXQgdW5yZWdpc3RlcnMgdGhlIGZpbGUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZWdpc3RlckZpbGUoYXBwOiBBcHAsIGZpbGU6IFRBYnN0cmFjdEZpbGUpOiAoKSA9PiB2b2lkIHtcbiAgaWYgKCFmaWxlLmRlbGV0ZWQpIHtcbiAgICByZXR1cm4gbm9vcDtcbiAgfVxuXG4gIGNvbnN0IGRlbGV0ZWRQYXRoczogc3RyaW5nW10gPSBbXTtcblxuICBsZXQgZGVsZXRlZEZpbGU6IFRBYnN0cmFjdEZpbGUgPSBmaWxlO1xuXG4gIHdoaWxlIChkZWxldGVkRmlsZS5kZWxldGVkKSB7XG4gICAgZGVsZXRlZFBhdGhzLnB1c2goZGVsZXRlZEZpbGUucGF0aCk7XG4gICAgYXBwLnZhdWx0LmZpbGVNYXBbZGVsZXRlZEZpbGUucGF0aF0gPSBkZWxldGVkRmlsZTtcbiAgICBkZWxldGVkRmlsZSA9IGRlbGV0ZWRGaWxlLnBhcmVudCA/PyBnZXRGb2xkZXIoYXBwLCBwYXJlbnRGb2xkZXJQYXRoKGRlbGV0ZWRGaWxlLnBhdGgpLCB0cnVlKTtcbiAgfVxuXG4gIGlmIChpc0ZpbGUoZmlsZSkpIHtcbiAgICBhcHAubWV0YWRhdGFDYWNoZS51bmlxdWVGaWxlTG9va3VwLmFkZChmaWxlLm5hbWUudG9Mb3dlckNhc2UoKSwgZmlsZSk7XG4gIH1cblxuICByZXR1cm4gKCkgPT4ge1xuICAgIGZvciAoY29uc3QgcGF0aCBvZiBkZWxldGVkUGF0aHMpIHtcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZHluYW1pYy1kZWxldGVcbiAgICAgIGRlbGV0ZSBhcHAudmF1bHQuZmlsZU1hcFtwYXRoXTtcbiAgICB9XG5cbiAgICBpZiAoaXNGaWxlKGZpbGUpKSB7XG4gICAgICBhcHAubWV0YWRhdGFDYWNoZS51bmlxdWVGaWxlTG9va3VwLnJlbW92ZShmaWxlLm5hbWUudG9Mb3dlckNhc2UoKSwgZmlsZSk7XG4gICAgfVxuICB9O1xufVxuXG4vKipcbiAqIEVuc3VyZXMgdGhhdCB0aGUgbWV0YWRhdGEgY2FjaGUgaXMgcmVhZHkgZm9yIGFsbCBmaWxlcy5cbiAqIEBwYXJhbSBhcHAgLSBUaGUgT2JzaWRpYW4gYXBwIGluc3RhbmNlLlxuICogQHJldHVybnMgQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgd2hlbiB0aGUgbWV0YWRhdGEgY2FjaGUgaXMgcmVhZHkuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBlbnN1cmVNZXRhZGF0YUNhY2hlUmVhZHkoYXBwOiBBcHApOiBQcm9taXNlPHZvaWQ+IHtcbiAgZm9yIChjb25zdCBbcGF0aCwgY2FjaGVdIG9mIE9iamVjdC5lbnRyaWVzKGFwcC5tZXRhZGF0YUNhY2hlLmZpbGVDYWNoZSkpIHtcbiAgICBpZiAoIWNhY2hlLmhhc2gpIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIGlmIChhcHAubWV0YWRhdGFDYWNoZS5tZXRhZGF0YUNhY2hlW2NhY2hlLmhhc2hdKSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICBhd2FpdCBnZXRDYWNoZVNhZmUo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
259
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL29ic2lkaWFuL01ldGFkYXRhQ2FjaGUudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbInZhciBfX3Byb2Nlc3MgPSBnbG9iYWxUaGlzWydwcm9jZXNzJ10gPz8ge1xuICBcImN3ZFwiOiAoKT0+XCIvXCIsXG4gIFwiZW52XCI6IHt9LFxuICBcInBsYXRmb3JtXCI6IFwiYW5kcm9pZFwiXG59O1xuLyoqXG4gKiBAcGFja2FnZURvY3VtZW50YXRpb24gTWV0YWRhdGFDYWNoZVxuICogVGhpcyBtb2R1bGUgcHJvdmlkZXMgdXRpbGl0eSBmdW5jdGlvbnMgZm9yIHdvcmtpbmcgd2l0aCB0aGUgbWV0YWRhdGEgY2FjaGUgaW4gT2JzaWRpYW4uXG4gKi9cblxuaW1wb3J0IHR5cGUge1xuICBBcHAsXG4gIENhY2hlZE1ldGFkYXRhLFxuICBNYXJrZG93blZpZXcsXG4gIFJlZmVyZW5jZSxcbiAgVEFic3RyYWN0RmlsZVxufSBmcm9tICdvYnNpZGlhbic7XG5pbXBvcnQgdHlwZSB7IEN1c3RvbUFycmF5RGljdCB9IGZyb20gJ29ic2lkaWFuLXR5cGluZ3MnO1xuaW1wb3J0IHtcbiAgaXNGcm9udG1hdHRlckxpbmtDYWNoZSxcbiAgaXNSZWZlcmVuY2VDYWNoZSxcbiAgcGFyZW50Rm9sZGVyUGF0aFxufSBmcm9tICdvYnNpZGlhbi10eXBpbmdzL2ltcGxlbWVudGF0aW9ucyc7XG5cbmltcG9ydCB0eXBlIHsgUmV0cnlPcHRpb25zIH0gZnJvbSAnLi4vQXN5bmMudHMnO1xuaW1wb3J0IHsgcmV0cnlXaXRoVGltZW91dCB9IGZyb20gJy4uL0FzeW5jLnRzJztcbmltcG9ydCB7IG5vb3AgfSBmcm9tICcuLi9GdW5jdGlvbi50cyc7XG5pbXBvcnQgeyBnZXROZXN0ZWRQcm9wZXJ0eVZhbHVlIH0gZnJvbSAnLi4vT2JqZWN0LnRzJztcbmltcG9ydCB0eXBlIHsgUGF0aE9yRmlsZSB9IGZyb20gJy4vRmlsZVN5c3RlbS50cyc7XG5pbXBvcnQge1xuICBnZXRGaWxlLFxuICBnZXRGaWxlT3JOdWxsLFxuICBnZXRGb2xkZXIsXG4gIGdldFBhdGgsXG4gIGlzRmlsZSxcbiAgaXNNYXJrZG93bkZpbGVcbn0gZnJvbSAnLi9GaWxlU3lzdGVtLnRzJztcbmltcG9ydCB0eXBlIHsgQ29tYmluZWRGcm9udE1hdHRlciB9IGZyb20gJy4vRnJvbnRNYXR0ZXIudHMnO1xuaW1wb3J0IHsgcGFyc2VGcm9udE1hdHRlciB9IGZyb20gJy4vRnJvbnRNYXR0ZXIudHMnO1xuXG4vKipcbiAqIFJldHJpZXZlcyB0aGUgY2FjaGVkIG1ldGFkYXRhIGZvciBhIGdpdmVuIGZpbGUgb3IgcGF0aC5cbiAqXG4gKiBAcGFyYW0gYXBwIC0gVGhlIE9ic2lkaWFuIGFwcCBpbnN0YW5jZS5cbiAqIEBwYXJhbSBmaWxlT3JQYXRoIC0gVGhlIGZpbGUgb3IgcGF0aCB0byByZXRyaWV2ZSB0aGUgbWV0YWRhdGEgZm9yLlxuICogQHBhcmFtIHJldHJ5T3B0aW9ucyAtIE9wdGlvbmFsIHJldHJ5IG9wdGlvbnMgZm9yIHRoZSByZXRyaWV2YWwgcHJvY2Vzcy5cbiAqIEByZXR1cm5zIFRoZSBjYWNoZWQgbWV0YWRhdGEgZm9yIHRoZSBmaWxlLCBvciBudWxsIGlmIGl0IGRvZXNuJ3QgZXhpc3QuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZXRDYWNoZVNhZmUoYXBwOiBBcHAsIGZpbGVPclBhdGg6IFBhdGhPckZpbGUsIHJldHJ5T3B0aW9uczogUGFydGlhbDxSZXRyeU9wdGlvbnM+ID0ge30pOiBQcm9taXNlPENhY2hlZE1ldGFkYXRhIHwgbnVsbD4ge1xuICBjb25zdCBERUZBVUxUX1JFVFJZX09QVElPTlM6IFBhcnRpYWw8UmV0cnlPcHRpb25zPiA9IHsgdGltZW91dEluTWlsbGlzZWNvbmRzOiA2MDAwMCB9O1xuICBjb25zdCBvdmVycmlkZGVuT3B0aW9uczogUGFydGlhbDxSZXRyeU9wdGlvbnM+ID0geyAuLi5ERUZBVUxUX1JFVFJZX09QVElPTlMsIC4uLnJldHJ5T3B0aW9ucyB9O1xuICBsZXQgY2FjaGU6IENhY2hlZE1ldGFkYXRhIHwgbnVsbCA9IG51bGw7XG5cbiAgYXdhaXQgcmV0cnlXaXRoVGltZW91dChhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgZmlsZSA9IGdldEZpbGVPck51bGwoYXBwLCBmaWxlT3JQYXRoKTtcblxuICAgIGlmICghZmlsZSB8fCBmaWxlLmRlbGV0ZWQpIHtcbiAgICAgIGNhY2hlID0gbnVsbDtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIGF3YWl0IHNhdmVOb3RlKGFwcCwgZmlsZSk7XG5cbiAgICBjb25zdCBmaWxlSW5mbyA9IGFwcC5tZXRhZGF0YUNhY2hlLmdldEZpbGVJbmZvKGZpbGUucGF0aCk7XG4gICAgY29uc3Qgc3RhdCA9IGF3YWl0IGFwcC52YXVsdC5hZGFwdGVyLnN0YXQoZmlsZS5wYXRoKTtcblxuICAgIGlmICghZmlsZUluZm8pIHtcbiAgICAgIGNvbnNvbGUuZGVidWcoYEZpbGUgY2FjaGUgaW5mbyBmb3IgJHtmaWxlLnBhdGh9IGlzIG1pc3NpbmdgKTtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9IGVsc2UgaWYgKCFzdGF0KSB7XG4gICAgICBjb25zb2xlLmRlYnVnKGBGaWxlIHN0YXQgZm9yICR7ZmlsZS5wYXRofSBpcyBtaXNzaW5nYCk7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfSBlbHNlIGlmIChmaWxlLnN0YXQubXRpbWUgPCBzdGF0Lm10aW1lKSB7XG4gICAgICBhcHAudmF1bHQub25DaGFuZ2UoJ21vZGlmaWVkJywgZmlsZS5wYXRoLCB1bmRlZmluZWQsIHN0YXQpO1xuICAgICAgY29uc29sZS5kZWJ1ZyhgQ2FjaGVkIHRpbWVzdGFtcCBmb3IgJHtmaWxlLnBhdGh9IGlzIGZyb20gJHtuZXcgRGF0ZShmaWxlLnN0YXQubXRpbWUpLnRvU3RyaW5nKCl9IHdoaWNoIGlzIG9sZGVyIHRoYW4gdGhlIGZpbGUgc3lzdGVtIG1vZGlmaWNhdGlvbiB0aW1lc3RhbXAgJHtuZXcgRGF0ZShzdGF0Lm10aW1lKS50b1N0cmluZygpfWApO1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH0gZWxzZSBpZiAoZmlsZUluZm8ubXRpbWUgPCBzdGF0Lm10aW1lKSB7XG4gICAgICBjb25zb2xlLmRlYnVnKGBGaWxlIGNhY2hlIGluZm8gZm9yICR7ZmlsZS5wYXRofSBpcyBmcm9tICR7bmV3IERhdGUoZmlsZUluZm8ubXRpbWUpLnRvU3RyaW5nKCl9IHdoaWNoIGlzIG9sZGVyIHRoYW4gdGhlIGZpbGUgbW9kaWZpY2F0aW9uIHRpbWVzdGFtcCAke25ldyBEYXRlKHN0YXQubXRpbWUpLnRvU3RyaW5nKCl9YCk7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNhY2hlID0gYXBwLm1ldGFkYXRhQ2FjaGUuZ2V0RmlsZUNhY2hlKGZpbGUpO1xuICAgICAgaWYgKCFjYWNoZSkge1xuICAgICAgICBjb25zb2xlLmRlYnVnKGBGaWxlIGNhY2hlIGZvciAke2ZpbGUucGF0aH0gaXMgbWlzc2luZ2ApO1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG4gIH0sIG92ZXJyaWRkZW5PcHRpb25zKTtcblxuICByZXR1cm4gY2FjaGU7XG59XG5cbi8qKlxuICogUmV0cmlldmVzIGFsbCBsaW5rcyBmcm9tIHRoZSBwcm92aWRlZCBjYWNoZS5cbiAqXG4gKiBAcGFyYW0gY2FjaGUgLSBUaGUgY2FjaGVkIG1ldGFkYXRhLlxuICogQHJldHVybnMgQW4gYXJyYXkgb2YgcmVmZXJlbmNlIGNhY2hlcyByZXByZXNlbnRpbmcgdGhlIGxpbmtzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0QWxsTGlua3MoY2FjaGU6IENhY2hlZE1ldGFkYXRhKTogUmVmZXJlbmNlW10ge1xuICBsZXQgbGlua3M6IFJlZmVyZW5jZVtdID0gW107XG5cbiAgaWYgKGNhY2hlLmxpbmtzKSB7XG4gICAgbGlua3MucHVzaCguLi5jYWNoZS5saW5rcyk7XG4gIH1cblxuICBpZiAoY2FjaGUuZW1iZWRzKSB7XG4gICAgbGlua3MucHVzaCguLi5jYWNoZS5lbWJlZHMpO1xuICB9XG5cbiAgaWYgKGNhY2hlLmZyb250bWF0dGVyTGlua3MpIHtcbiAgICBsaW5rcy5wdXNoKC4uLmNhY2hlLmZyb250bWF0dGVyTGlua3MpO1xuICB9XG5cbiAgbGlua3Muc29ydCgoYSwgYikgPT4ge1xuICAgIGlmIChpc0Zyb250bWF0dGVyTGlua0NhY2hlKGEpICYmIGlzRnJvbnRtYXR0ZXJMaW5rQ2FjaGUoYikpIHtcbiAgICAgIHJldHVybiBhLmtleS5sb2NhbGVDb21wYXJlKGIua2V5KTtcbiAgICB9XG5cbiAgICBpZiAoaXNSZWZlcmVuY2VDYWNoZShhKSAmJiBpc1JlZmVyZW5jZUNhY2hlKGIpKSB7XG4gICAgICByZXR1cm4gYS5wb3NpdGlvbi5zdGFydC5vZmZzZXQgLSBiLnBvc2l0aW9uLnN0YXJ0Lm9mZnNldDtcbiAgICB9XG5cbiAgICByZXR1cm4gaXNGcm9udG1hdHRlckxpbmtDYWNoZShhKSA/IDEgOiAtMTtcbiAgfSk7XG5cbiAgLy8gQlVHOiBodHRwczovL2ZvcnVtLm9ic2lkaWFuLm1kL3QvYnVnLWR1cGxpY2F0ZWQtbGlua3MtaW4tbWV0YWRhdGFjYWNoZS1pbnNpZGUtZm9vdG5vdGVzLzg1NTUxXG4gIGxpbmtzID0gbGlua3MuZmlsdGVyKChsaW5rLCBpbmRleCkgPT4ge1xuICAgIGlmIChpbmRleCA9PT0gMCkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgY29uc3QgcHJldmlvdXNMaW5rID0gbGlua3NbaW5kZXggLSAxXTtcbiAgICBpZiAoIXByZXZpb3VzTGluaykge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgaWYgKGlzUmVmZXJlbmNlQ2FjaGUobGluaykgJiYgaXNSZWZlcmVuY2VDYWNoZShwcmV2aW91c0xpbmspKSB7XG4gICAgICByZXR1cm4gbGluay5wb3NpdGlvbi5zdGFydC5vZmZzZXQgIT09IHByZXZpb3VzTGluay5wb3NpdGlvbi5zdGFydC5vZmZzZXQ7XG4gICAgfVxuXG4gICAgaWYgKGlzRnJvbnRtYXR0ZXJMaW5rQ2FjaGUobGluaykgJiYgaXNGcm9udG1hdHRlckxpbmtDYWNoZShwcmV2aW91c0xpbmspKSB7XG4gICAgICByZXR1cm4gbGluay5rZXkgIT09IHByZXZpb3VzTGluay5rZXk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRydWU7XG4gIH0pO1xuXG4gIHJldHVybiBsaW5rcztcbn1cblxuLyoqXG4gKiBXcmFwcGVyIGZvciB0aGUgZ2V0QmFja2xpbmtzRm9yRmlsZSBtZXRob2QgdGhhdCBwcm92aWRlcyBhIHNhZmUgb3ZlcmxvYWQuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgR2V0QmFja2xpbmtzRm9yRmlsZVNhZmVXcmFwcGVyIHtcbiAgLyoqXG4gICAqIFJldHJpZXZlcyB0aGUgYmFja2xpbmtzIGZvciBhIGZpbGUgc2FmZWx5LlxuICAgKlxuICAgKiBAcGFyYW0gcGF0aE9yRmlsZSAtIFRoZSBwYXRoIG9yIGZpbGUgb2JqZWN0LlxuICAgKiBAcmV0dXJucyBBIHByb21pc2UgdGhhdCByZXNvbHZlcyB0byBhbiBhcnJheSBkaWN0aW9uYXJ5IG9mIGJhY2tsaW5rcy5cbiAgICovXG4gIHNhZmUocGF0aE9yRmlsZTogUGF0aE9yRmlsZSk6IFByb21pc2U8Q3VzdG9tQXJyYXlEaWN0PFJlZmVyZW5jZT4+O1xufVxuXG4vKipcbiAqIFJldHJpZXZlcyB0aGUgYmFja2xpbmtzIGZvciBhIGZpbGUgb3IgcGF0aC5cbiAqIE5PVEU6IFRoZSBmaWxlIG1heSBiZSBub24tZXhpc3RlbnQuXG4gKlxuICogQHBhcmFtIGFwcCAtIFRoZSBPYnNpZGlhbiBhcHBsaWNhdGlvbiBpbnN0YW5jZS5cbiAqIEBwYXJhbSBwYXRoT3JGaWxlIC0gVGhlIHBhdGggb3IgZmlsZSBvYmplY3QuXG4gKiBAcmV0dXJucyBUaGUgYmFja2xpbmtzIGZvciB0aGUgZmlsZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldEJhY2tsaW5rc0ZvckZpbGVPclBhdGgoYXBwOiBBcHAsIHBhdGhPckZpbGU6IFBhdGhPckZpbGUpOiBDdXN0b21BcnJheURpY3Q8UmVmZXJlbmNlPiB7XG4gIGNvbnN0IGZpbGUgPSBnZXRGaWxlKGFwcCwgcGF0aE9yRmlsZSwgdHJ1ZSk7XG4gIHJldHVybiB0ZW1wUmVnaXN0ZXJGaWxlQW5kUnVuKGFwcCwgZmlsZSwgKCkgPT4gYXBwLm1ldGFkYXRhQ2FjaGUuZ2V0QmFja2xpbmtzRm9yRmlsZShmaWxlKSk7XG59XG5cbi8qKlxuICogUmV0cmlldmVzIHRoZSBiYWNrbGlua3MgZm9yIGEgZmlsZSBzYWZlbHkuXG4gKlxuICogQHBhcmFtIGFwcCAtIFRoZSBPYnNpZGlhbiBhcHBsaWNhdGlvbiBpbnN0YW5jZS5cbiAqIEBwYXJhbSBwYXRoT3JGaWxlIC0gVGhlIHBhdGggb3IgZmlsZSBvYmplY3QuXG4gKiBAcGFyYW0gcmV0cnlPcHRpb25zIC0gT3B0aW9uYWwgcmV0cnkgb3B0aW9ucy5cbiAqIEByZXR1cm5zIEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHRvIGFuIGFycmF5IGRpY3Rpb25hcnkgb2YgYmFja2xpbmtzLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2V0QmFja2xpbmtzRm9yRmlsZVNhZmUoYXBwOiBBcHAsIHBhdGhPckZpbGU6IFBhdGhPckZpbGUsIHJldHJ5T3B0aW9uczogUGFydGlhbDxSZXRyeU9wdGlvbnM+ID0ge30pOiBQcm9taXNlPEN1c3RvbUFycmF5RGljdDxSZWZlcmVuY2U+PiB7XG4gIGNvbnN0IHNhZmVPdmVybG9hZCA9IChhcHAubWV0YWRhdGFDYWNoZS5nZXRCYWNrbGlua3NGb3JGaWxlIGFzIFBhcnRpYWw8R2V0QmFja2xpbmtzRm9yRmlsZVNhZmVXcmFwcGVyPikuc2FmZTtcbiAgaWYgKHNhZmVPdmVybG9hZCkge1xuICAgIHJldHVybiBzYWZlT3ZlcmxvYWQocGF0aE9yRmlsZSk7XG4gIH1cbiAgY29uc3QgREVGQVVMVF9SRVRSWV9PUFRJT05TOiBQYXJ0aWFsPFJldHJ5T3B0aW9ucz4gPSB7IHRpbWVvdXRJbk1pbGxpc2Vjb25kczogNjAwMDAgfTtcbiAgY29uc3Qgb3ZlcnJpZGRlbk9wdGlvbnM6IFBhcnRpYWw8UmV0cnlPcHRpb25zPiA9IHsgLi4uREVGQVVMVF9SRVRSWV9PUFRJT05TLCAuLi5yZXRyeU9wdGlvbnMgfTtcbiAgbGV0IGJhY2tsaW5rczogQ3VzdG9tQXJyYXlEaWN0PFJlZmVyZW5jZT4gPSBudWxsIGFzIHVua25vd24gYXMgQ3VzdG9tQXJyYXlEaWN0PFJlZmVyZW5jZT47XG4gIGF3YWl0IHJldHJ5V2l0aFRpbWVvdXQoYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IGZpbGUgPSBnZXRGaWxlKGFwcCwgcGF0aE9yRmlsZSk7XG4gICAgYXdhaXQgZW5zdXJlTWV0YWRhdGFDYWNoZVJlYWR5KGFwcCk7XG4gICAgYmFja2xpbmtzID0gZ2V0QmFja2xpbmtzRm9yRmlsZU9yUGF0aChhcHAsIGZpbGUpO1xuICAgIGZvciAoY29uc3Qgbm90ZVBhdGggb2YgYmFja2xpbmtzLmtleXMoKSkge1xuICAgICAgY29uc3Qgbm90ZSA9IGdldEZpbGVPck51bGwoYXBwLCBub3RlUGF0aCk7XG4gICAgICBpZiAoIW5vdGUpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuXG4gICAgICBhd2FpdCBzYXZlTm90ZShhcHAsIG5vdGUpO1xuXG4gICAgICBjb25zdCBjb250ZW50ID0gYXdhaXQgYXBwLnZhdWx0LnJlYWQobm90ZSk7XG4gICAgICBjb25zdCBmcm9udE1hdHRlciA9IHBhcnNlRnJvbnRNYXR0ZXIoY29udGVudCk7XG4gICAgICBjb25zdCBsaW5rcyA9IGJhY2tsaW5rcy5nZXQobm90ZVBhdGgpO1xuICAgICAgaWYgKCFsaW5rcykge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG5cbiAgICAgIGZvciAoY29uc3QgbGluayBvZiBsaW5rcykge1xuICAgICAgICBsZXQgYWN0dWFsTGluazogc3RyaW5nO1xuICAgICAgICBpZiAoaXNSZWZlcmVuY2VDYWNoZShsaW5rKSkge1xuICAgICAgICAgIGFjdHVhbExpbmsgPSBjb250ZW50LnNsaWNlKGxpbmsucG9zaXRpb24uc3RhcnQub2Zmc2V0LCBsaW5rLnBvc2l0aW9uLmVuZC5vZmZzZXQpO1xuICAgICAgICB9IGVsc2UgaWYgKGlzRnJvbnRtYXR0ZXJMaW5rQ2FjaGUobGluaykpIHtcbiAgICAgICAgICBjb25zdCBsaW5rVmFsdWUgPSBnZXROZXN0ZWRQcm9wZXJ0eVZhbHVlKGZyb250TWF0dGVyLCBsaW5rLmtleSk7XG4gICAgICAgICAgaWYgKHR5cGVvZiBsaW5rVmFsdWUgIT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgfVxuICAgICAgICAgIGFjdHVhbExpbmsgPSBsaW5rVmFsdWU7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGFjdHVhbExpbmsgIT09IGxpbmsub3JpZ2luYWwpIHtcbiAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfSwgb3ZlcnJpZGRlbk9wdGlvbnMpO1xuXG4gIHJldHVybiBiYWNrbGlua3M7XG59XG5cbi8qKlxuICogR2V0cyB0aGUgYmFja2xpbmtzIG1hcCBmb3IgdGhlIHNwZWNpZmllZCBmaWxlcy5cbiAqXG4gKiBAcGFyYW0gYXBwIC0gVGhlIE9ic2lkaWFuIGFwcCBpbnN0YW5jZS5cbiAqIEBwYXJhbSBwYXRoT3JGaWxlcyAtIFRoZSBwYXRocyBvciBmaWxlcyB0byBnZXQgdGhlIGJhY2tsaW5rcyBmb3IuXG4gKiBAcGFyYW0gcmV0cnlPcHRpb25zIC0gT3B0aW9uYWwgcmV0cnkgb3B0aW9ucy5cbiAqIEByZXR1cm5zIEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHRvIGEgbWFwIG9mIGJhY2tsaW5rcy5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdldEJhY2tsaW5rc01hcChhcHA6IEFwcCwgcGF0aE9yRmlsZXM6IFBhdGhPckZpbGVbXSwgcmV0cnlPcHRpb25zOiBQYXJ0aWFsPFJldHJ5T3B0aW9ucz4gPSB7fSk6IFByb21pc2U8TWFwPHN0cmluZywgUmVmZXJlbmNlW10+PiB7XG4gIGNvbnN0IG1hcCA9IG5ldyBNYXA8c3RyaW5nLCBSZWZlcmVuY2VbXT4oKTtcbiAgZm9yIChjb25zdCBwYXRoT3JGaWxlIG9mIHBhdGhPckZpbGVzKSB7XG4gICAgY29uc3QgY3VzdG9tQXJyYXlEaWN0ID0gYXdhaXQgZ2V0QmFja2xpbmtzRm9yRmlsZVNhZmUoYXBwLCBwYXRoT3JGaWxlLCByZXRyeU9wdGlvbnMpO1xuICAgIGZvciAoY29uc3QgcGF0aCBvZiBjdXN0b21BcnJheURpY3Qua2V5cygpKSB7XG4gICAgICBjb25zdCBtYXBMaW5rcyA9IG1hcC5nZXQocGF0aCkgPz8gW107XG4gICAgICBjb25zdCBwYXRoTGlua3MgPSBjdXN0b21BcnJheURpY3QuZ2V0KHBhdGgpID8/IFtdO1xuICAgICAgbWFwTGlua3MucHVzaCguLi5wYXRoTGlua3MpO1xuICAgICAgbWFwLnNldChwYXRoLCBtYXBMaW5rcyk7XG4gICAgfVxuICB9XG4gIHJldHVybiBtYXA7XG59XG5cbi8qKlxuICogU2F2ZXMgdGhlIHNwZWNpZmllZCBub3RlIGluIHRoZSBPYnNpZGlhbiBhcHAuXG4gKlxuICogQHBhcmFtIGFwcCAtIFRoZSBPYnNpZGlhbiBhcHAgaW5zdGFuY2UuXG4gKiBAcGFyYW0gcGF0aE9yRmlsZSAtIFRoZSBub3RlIHRvIGJlIHNhdmVkLlxuICogQHJldHVybnMgQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgd2hlbiB0aGUgbm90ZSBpcyBzYXZlZC5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gc2F2ZU5vdGUoYXBwOiBBcHAsIHBhdGhPckZpbGU6IFBhdGhPckZpbGUpOiBQcm9taXNlPHZvaWQ+IHtcbiAgaWYgKCFpc01hcmtkb3duRmlsZShwYXRoT3JGaWxlKSkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGNvbnN0IHBhdGggPSBnZXRQYXRoKHBhdGhPckZpbGUpO1xuXG4gIGZvciAoY29uc3QgbGVhZiBvZiBhcHAud29ya3NwYWNlLmdldExlYXZlc09mVHlwZSgnbWFya2Rvd24nKSkge1xuICAgIGNvbnN0IHZpZXcgPSBsZWFmLnZpZXcgYXMgTWFya2Rvd25WaWV3O1xuICAgIGlmICh2aWV3LmZpbGU/LnBhdGggPT09IHBhdGgpIHtcbiAgICAgIGF3YWl0IHZpZXcuc2F2ZSgpO1xuICAgIH1cbiAgfVxufVxuXG4vKipcbiAqIFJldHJpZXZlcyB0aGUgZnJvbnQgbWF0dGVyIGZyb20gdGhlIG1ldGFkYXRhIGNhY2hlIHNhZmVseS5cbiAqXG4gKiBAdHlwZVBhcmFtIEN1c3RvbUZyb250TWF0dGVyIC0gVGhlIHR5cGUgb2YgY3VzdG9tIGZyb250IG1hdHRlci5cbiAqIEBwYXJhbSBhcHAgLSBUaGUgT2JzaWRpYW4gYXBwIGluc3RhbmNlLlxuICogQHBhcmFtIHBhdGhPckZpbGUgLSBUaGUgcGF0aCBvciBmaWxlIHRvIHJldHJpZXZlIHRoZSBmcm9udCBtYXR0ZXIgZnJvbS5cbiAqIEByZXR1cm5zIFRoZSBjb21iaW5lZCBmcm9udCBtYXR0ZXIuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZXRGcm9udE1hdHRlclNhZmU8Q3VzdG9tRnJvbnRNYXR0ZXIgPSB1bmtub3duPihhcHA6IEFwcCwgcGF0aE9yRmlsZTogUGF0aE9yRmlsZSk6IFByb21pc2U8Q29tYmluZWRGcm9udE1hdHRlcjxDdXN0b21Gcm9udE1hdHRlcj4+IHtcbiAgY29uc3QgY2FjaGUgPSBhd2FpdCBnZXRDYWNoZVNhZmUoYXBwLCBwYXRoT3JGaWxlKTtcbiAgcmV0dXJuIChjYWNoZT8uZnJvbnRtYXR0ZXIgPz8ge30pIGFzIENvbWJpbmVkRnJvbnRNYXR0ZXI8Q3VzdG9tRnJvbnRNYXR0ZXI+O1xufVxuXG4vKipcbiAqIFRlbXBvcmFyaWx5IHJlZ2lzdGVycyBhIGZpbGUgYW5kIHJ1bnMgYSBmdW5jdGlvbi5cbiAqXG4gKiBAcGFyYW0gYXBwIC0gVGhlIE9ic2lkaWFuIGFwcCBpbnN0YW5jZS5cbiAqIEBwYXJhbSBmaWxlIC0gVGhlIGZpbGUgdG8gdGVtcG9yYXJpbHkgcmVnaXN0ZXIuXG4gKiBAcGFyYW0gZm4gLSBUaGUgZnVuY3Rpb24gdG8gcnVuLlxuICogQHJldHVybnMgVGhlIHJlc3VsdCBvZiB0aGUgZnVuY3Rpb24uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB0ZW1wUmVnaXN0ZXJGaWxlQW5kUnVuPFQ+KGFwcDogQXBwLCBmaWxlOiBUQWJzdHJhY3RGaWxlLCBmbjogKCkgPT4gVCk6IFQge1xuICBjb25zdCB1bnJlZ2lzdGVyID0gcmVnaXN0ZXJGaWxlKGFwcCwgZmlsZSk7XG5cbiAgdHJ5IHtcbiAgICByZXR1cm4gZm4oKTtcbiAgfSBmaW5hbGx5IHtcbiAgICB1bnJlZ2lzdGVyKCk7XG4gIH1cbn1cblxuLyoqKlxuICogUmVnaXN0ZXJzIGEgZmlsZSBpbiB0aGUgT2JzaWRpYW4gYXBwLlxuICpcbiAqIEBwYXJhbSBhcHAgLSBUaGUgT2JzaWRpYW4gYXBwIGluc3RhbmNlLlxuICogQHBhcmFtIGZpbGUgLSBUaGUgZmlsZSB0byByZWdpc3Rlci5cbiAqIEByZXR1cm5zIEEgZnVuY3Rpb24gdGhhdCB1bnJlZ2lzdGVycyB0aGUgZmlsZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlZ2lzdGVyRmlsZShhcHA6IEFwcCwgZmlsZTogVEFic3RyYWN0RmlsZSk6ICgpID0+IHZvaWQge1xuICBpZiAoIWZpbGUuZGVsZXRlZCkge1xuICAgIHJldHVybiBub29wO1xuICB9XG5cbiAgY29uc3QgZGVsZXRlZFBhdGhzOiBzdHJpbmdbXSA9IFtdO1xuXG4gIGxldCBkZWxldGVkRmlsZTogVEFic3RyYWN0RmlsZSA9IGZpbGU7XG5cbiAgd2hpbGUgKGRlbGV0ZWRGaWxlLmRlbGV0ZWQpIHtcbiAgICBkZWxldGVkUGF0aHMucHVzaChkZWxldGVkRmlsZS5wYXRoKTtcbiAgICBhcHAudmF1bHQuZmlsZU1hcFtkZWxldGVkRmlsZS5wYXRoXSA9IGRlbGV0ZWRGaWxlO1xuICAgIGRlbGV0ZWRGaWxlID0gZGVsZXRlZEZpbGUucGFyZW50ID8/IGdldEZvbGRlcihhcHAsIHBhcmVudEZvbGRlclBhdGgoZGVsZXRlZEZpbGUucGF0aCksIHRydWUpO1xuICB9XG5cbiAgaWYgKGlzRmlsZShmaWxlKSkge1xuICAgIGFwcC5tZXRhZGF0YUNhY2hlLnVuaXF1ZUZpbGVMb29rdXAuYWRkKGZpbGUubmFtZS50b0xvd2VyQ2FzZSgpLCBmaWxlKTtcbiAgfVxuXG4gIHJldHVybiAoKSA9PiB7XG4gICAgZm9yIChjb25zdCBwYXRoIG9mIGRlbGV0ZWRQYXRocykge1xuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1keW5hbWljLWRlbGV0ZVxuICAgICAgZGVsZXRlIGFwcC52YXVsdC5maWxlTWFwW3BhdGhdO1xuICAgIH1cblxuICAgIGlmIChpc0ZpbGUoZmlsZSkpIHtcbiAgICAgIGFwcC5tZXRhZGF0YUNhY2hlLnVuaXF1ZUZpbGVMb29rdXAucmVtb3ZlKGZpbGUubmFtZS50b0xvd2VyQ2FzZSgpLCBmaWxlKTtcbiAgICB9XG4gIH07XG59XG5cbi8qKlxuICogRW5zdXJlcyB0aGF0IHRoZSBtZXRhZGF0YSBjYWNoZSBpcyByZWFkeSBmb3IgYWxsIGZpbGVzLlxuICogQHBhcmFtIGFwcCAtIFRoZSBPYnNpZGlhbiBhcHAgaW5zdGFuY2UuXG4gKiBAcmV0dXJucyBBIHByb21pc2UgdGhhdCByZXNvbHZlcyB3aGVuIHRoZSBtZXRhZGF0YSBjYWNoZSBpcyByZWFkeS5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGVuc3VyZU1ldGFkYXRhQ2FjaGVSZWFkeShhcHA6IEFwcCk6IFByb21pc2U8dm9pZD4ge1xuICBmb3IgKGNvbnN0IFtwYXRoLCBjYWNoZV0gb2YgT2JqZWN0LmVudHJpZXMoYXBwLm1ldGFkYXRhQ2FjaGUuZmlsZUNhY2hlKSkge1xuICAgIGlmICghY2FjaGUuaGFzaCkge1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgaWYgKGFwcC5tZXRhZGF0YUNhY2hlLm1ldGFkYXRhQ2FjaGVbY2FjaGUuaGFzaF0pIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIGF3YWl0IGdldENhY2hlU2FmZShhcHAsIHBhdGgpO1xuICB9XG59XG4iXSwKICAibWFwcGluZ3MiOiAiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFrQkEsNkJBSU87QUFHUCxtQkFBaUM7QUFDakMsc0JBQXFCO0FBQ3JCLG9CQUF1QztBQUV2Qyx3QkFPTztBQUVQLHlCQUFpQztBQXRDakMsSUFBSSxZQUFZLFdBQVcsU0FBUyxLQUFLO0FBQUEsRUFDdkMsT0FBTyxNQUFJO0FBQUEsRUFDWCxPQUFPLENBQUM7QUFBQSxFQUNSLFlBQVk7QUFDZDtBQTRDQSxlQUFzQixhQUFhLEtBQVUsWUFBd0IsZUFBc0MsQ0FBQyxHQUFtQztBQUM3SSxRQUFNLHdCQUErQyxFQUFFLHVCQUF1QixJQUFNO0FBQ3BGLFFBQU0sb0JBQTJDLEVBQUUsR0FBRyx1QkFBdUIsR0FBRyxhQUFhO0FBQzdGLE1BQUksUUFBK0I7QUFFbkMsWUFBTSwrQkFBaUIsWUFBWTtBQUNqQyxVQUFNLFdBQU8saUNBQWMsS0FBSyxVQUFVO0FBRTFDLFFBQUksQ0FBQyxRQUFRLEtBQUssU0FBUztBQUN6QixjQUFRO0FBQ1IsYUFBTztBQUFBLElBQ1Q7QUFFQSxVQUFNLFNBQVMsS0FBSyxJQUFJO0FBRXhCLFVBQU0sV0FBVyxJQUFJLGNBQWMsWUFBWSxLQUFLLElBQUk7QUFDeEQsVUFBTSxPQUFPLE1BQU0sSUFBSSxNQUFNLFFBQVEsS0FBSyxLQUFLLElBQUk7QUFFbkQsUUFBSSxDQUFDLFVBQVU7QUFDYixjQUFRLE1BQU0sdUJBQXVCLEtBQUssSUFBSSxhQUFhO0FBQzNELGFB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
@@ -2,7 +2,7 @@
2
2
  * @packageDocumentation MetadataCache
3
3
  * This module provides utility functions for working with the metadata cache in Obsidian.
4
4
  */
5
- import type { App, CachedMetadata, ReferenceCache, TAbstractFile } from 'obsidian';
5
+ import type { App, CachedMetadata, Reference, TAbstractFile } from 'obsidian';
6
6
  import type { CustomArrayDict } from 'obsidian-typings';
7
7
  import type { RetryOptions } from '../Async.ts';
8
8
  import type { PathOrFile } from './FileSystem.ts';
@@ -22,7 +22,7 @@ export declare function getCacheSafe(app: App, fileOrPath: PathOrFile, retryOpti
22
22
  * @param cache - The cached metadata.
23
23
  * @returns An array of reference caches representing the links.
24
24
  */
25
- export declare function getAllLinks(cache: CachedMetadata): ReferenceCache[];
25
+ export declare function getAllLinks(cache: CachedMetadata): Reference[];
26
26
  /**
27
27
  * Wrapper for the getBacklinksForFile method that provides a safe overload.
28
28
  */
@@ -33,7 +33,7 @@ export interface GetBacklinksForFileSafeWrapper {
33
33
  * @param pathOrFile - The path or file object.
34
34
  * @returns A promise that resolves to an array dictionary of backlinks.
35
35
  */
36
- safe(pathOrFile: PathOrFile): Promise<CustomArrayDict<ReferenceCache>>;
36
+ safe(pathOrFile: PathOrFile): Promise<CustomArrayDict<Reference>>;
37
37
  }
38
38
  /**
39
39
  * Retrieves the backlinks for a file or path.
@@ -43,7 +43,7 @@ export interface GetBacklinksForFileSafeWrapper {
43
43
  * @param pathOrFile - The path or file object.
44
44
  * @returns The backlinks for the file.
45
45
  */
46
- export declare function getBacklinksForFileOrPath(app: App, pathOrFile: PathOrFile): CustomArrayDict<ReferenceCache>;
46
+ export declare function getBacklinksForFileOrPath(app: App, pathOrFile: PathOrFile): CustomArrayDict<Reference>;
47
47
  /**
48
48
  * Retrieves the backlinks for a file safely.
49
49
  *
@@ -52,7 +52,7 @@ export declare function getBacklinksForFileOrPath(app: App, pathOrFile: PathOrFi
52
52
  * @param retryOptions - Optional retry options.
53
53
  * @returns A promise that resolves to an array dictionary of backlinks.
54
54
  */
55
- export declare function getBacklinksForFileSafe(app: App, pathOrFile: PathOrFile, retryOptions?: Partial<RetryOptions>): Promise<CustomArrayDict<ReferenceCache>>;
55
+ export declare function getBacklinksForFileSafe(app: App, pathOrFile: PathOrFile, retryOptions?: Partial<RetryOptions>): Promise<CustomArrayDict<Reference>>;
56
56
  /**
57
57
  * Gets the backlinks map for the specified files.
58
58
  *
@@ -61,7 +61,7 @@ export declare function getBacklinksForFileSafe(app: App, pathOrFile: PathOrFile
61
61
  * @param retryOptions - Optional retry options.
62
62
  * @returns A promise that resolves to a map of backlinks.
63
63
  */
64
- export declare function getBacklinksMap(app: App, pathOrFiles: PathOrFile[], retryOptions?: Partial<RetryOptions>): Promise<Map<string, ReferenceCache[]>>;
64
+ export declare function getBacklinksMap(app: App, pathOrFiles: PathOrFile[], retryOptions?: Partial<RetryOptions>): Promise<Map<string, Reference[]>>;
65
65
  /**
66
66
  * Retrieves the front matter from the metadata cache safely.
67
67
  *