@mnaoumov/obsidian-lib 6.0.4 → 6.2.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.
@@ -25,29 +25,85 @@ export declare function isValidationMessageHolder(value: unknown): value is Vali
25
25
  */
26
26
  export declare const OBSIDIAN_UNSAFE_FILENAME_CHARS: RegExp;
27
27
  /**
28
- * Windows-specific unsafe file name path characters.
28
+ * The characters Obsidian refuses in a file name on Windows.
29
+ *
30
+ * Read from Obsidian 1.15.0's `app.js`, whose name check throws on this set from `app.vault.create`, a
31
+ * rename and Sync alike.
29
32
  */
30
33
  export declare const WINDOWS_UNSAFE_PATH_CHARS: RegExp;
31
34
  /**
32
- * Unix-specific unsafe file name path characters.
35
+ * The characters Obsidian refuses in a file name on macOS, Linux and iOS, plus the NUL no file system stores.
36
+ *
37
+ * This is Obsidian's refusal set, not the file system's: macOS and Linux store `\` and `:`, but Obsidian
38
+ * refuses both, so a name holding either cannot be created through the vault there. Read from Obsidian
39
+ * 1.15.0's `app.js`.
33
40
  */
34
41
  export declare const UNIX_UNSAFE_PATH_CHARS: RegExp;
42
+ /**
43
+ * The characters Obsidian refuses in a file name on Android, plus the NUL no file system stores.
44
+ *
45
+ * Obsidian adds `* ? < > "` to the {@link UNIX_UNSAFE_PATH_CHARS} set there, because Android's shared
46
+ * storage refuses them. Read from Obsidian 1.15.0's `app.js`.
47
+ */
48
+ export declare const ANDROID_UNSAFE_PATH_CHARS: RegExp;
49
+ /**
50
+ * Validates a single file or folder name against every naming rule this module owns.
51
+ *
52
+ * The rules, checked in this order, and the first one broken names the message:
53
+ *
54
+ * 1. The name is not empty.
55
+ * 2. It holds no control character (U+0000 to U+001F).
56
+ * 3. It holds none of the characters {@link getOsAndObsidianUnsafePathCharsRegExp} matches.
57
+ * 4. It does not end with a dot or a space ({@link hasWindowsTrailingChars}).
58
+ * 5. It is not an MS-DOS device name ({@link isWindowsReservedName}), with or without an extension.
59
+ *
60
+ * Only rule 3 depends on the platform. Rules 2, 4 and 5 apply on every platform, because a vault is synced,
61
+ * and a name created on macOS or Linux that Windows refuses breaks the vault there. The character set follows
62
+ * the platform because it is Obsidian's own refusal set, which differs per platform: a name such as `a?b` is
63
+ * accepted on macOS, where Obsidian creates it.
64
+ *
65
+ * @param name - The name to validate. A single path segment, with or without its extension.
66
+ * @param isWindows - Whether to use the Windows character set. Defaults to `Platform.isWin`.
67
+ * @param isAndroid - Whether to use the Android character set when `isWindows` is false. Defaults to
68
+ * `Platform.isAndroidApp`.
69
+ * @returns A message describing the first broken rule, or an empty string if the name is valid.
70
+ */
71
+ export declare function getFileNameValidationMessage(name: string, isWindows?: boolean, isAndroid?: boolean): string;
35
72
  /**
36
73
  * Returns a regexp matching all unsafe characters in file names/paths.
37
74
  *
38
- * Includes both OS-specific restrictions and Obsidian-specific ones.
75
+ * Includes both the platform's refused characters ({@link getOsUnsafePathCharsRegExp}) and the ones that break
76
+ * links ({@link OBSIDIAN_UNSAFE_FILENAME_CHARS}).
39
77
  *
40
- * @param isWindows - Whether to include Windows-specific restrictions. Defaults to `Platform.isWin`.
78
+ * @param isWindows - Whether to use the Windows character set. Defaults to `Platform.isWin`.
79
+ * @param isAndroid - Whether to use the Android character set when `isWindows` is false. Defaults to
80
+ * `Platform.isAndroidApp`.
41
81
  * @returns A regexp matching all unsafe characters in file names/paths.
42
82
  */
43
- export declare function getOsAndObsidianUnsafePathCharsRegExp(isWindows?: boolean): RegExp;
83
+ export declare function getOsAndObsidianUnsafePathCharsRegExp(isWindows?: boolean, isAndroid?: boolean): RegExp;
84
+ /**
85
+ * Returns a regexp matching the characters Obsidian refuses in a file name on the given platform.
86
+ *
87
+ * That is {@link WINDOWS_UNSAFE_PATH_CHARS} on Windows, {@link ANDROID_UNSAFE_PATH_CHARS} on Android and
88
+ * {@link UNIX_UNSAFE_PATH_CHARS} everywhere else. It is Obsidian's set rather than the file system's, so a
89
+ * name it accepts can be created through the vault.
90
+ *
91
+ * @param isWindows - Whether to use the Windows character set. Defaults to `Platform.isWin`.
92
+ * @param isAndroid - Whether to use the Android character set when `isWindows` is false. Defaults to
93
+ * `Platform.isAndroidApp`.
94
+ * @returns A regexp matching the characters Obsidian refuses in a file name on the given platform.
95
+ */
96
+ export declare function getOsUnsafePathCharsRegExp(isWindows?: boolean, isAndroid?: boolean): RegExp;
44
97
  /**
45
- * Returns a regexp matching characters that are not safe to use in file names/paths at the OS level.
98
+ * Validates every segment of a vault path with {@link getFileNameValidationMessage}.
46
99
  *
47
- * @param isWindows - Whether to include Windows-specific restrictions. Defaults to `Platform.isWin`.
48
- * @returns A regexp matching characters that are not safe to use in file names/paths at the OS level.
100
+ * @param path - The vault-relative path to validate, with `/` as the separator.
101
+ * @param isWindows - Whether to use the Windows character set. Defaults to `Platform.isWin`.
102
+ * @param isAndroid - Whether to use the Android character set when `isWindows` is false. Defaults to
103
+ * `Platform.isAndroidApp`.
104
+ * @returns The message for the first invalid segment, or an empty string if every segment is valid.
49
105
  */
50
- export declare function getOsUnsafePathCharsRegExp(isWindows?: boolean): RegExp;
106
+ export declare function getPathValidationMessage(path: string, isWindows?: boolean, isAndroid?: boolean): string;
51
107
  /**
52
108
  * Checks whether a name ends with the dots or spaces Windows refuses.
53
109
  *
@@ -36,23 +36,49 @@ import {
36
36
  } from "@mnaoumov/typescript-lib/path";
37
37
  import { oneOf } from "@mnaoumov/typescript-lib/reg-exp";
38
38
  import { Platform } from "obsidian";
39
+ import { t } from "./i18n/i18n.mjs";
39
40
  function isValidationMessageHolder(value) {
40
41
  return value.validationMessage !== void 0;
41
42
  }
42
43
  const OBSIDIAN_UNSAFE_FILENAME_CHARS = /[#^[\]|]/g;
43
44
  const WINDOWS_UNSAFE_PATH_CHARS = /[*\\/<>:|?"]/g;
44
- const UNIX_UNSAFE_PATH_CHARS = /[\0/]/g;
45
+ const UNIX_UNSAFE_PATH_CHARS = /[\0\\/:]/g;
46
+ const ANDROID_UNSAFE_PATH_CHARS = /[\0*\\/<>:?"]/g;
45
47
  const WINDOWS_RESERVED_NAME_REG_EXP = /^(?:AUX|COM[1-9]|CON|LPT[1-9]|NUL|PRN)$/i;
46
48
  const WINDOWS_TRAILING_CHARS_REG_EXP = /[ .]+$/;
47
- function getOsAndObsidianUnsafePathCharsRegExp(isWindows) {
49
+ const FIRST_NON_CONTROL_CHAR = " ";
50
+ function getFileNameValidationMessage(name, isWindows, isAndroid) {
51
+ if (name === "") {
52
+ return t(($) => $.obsidianLib.validation.emptyName);
53
+ }
54
+ if (hasControlChars(name)) {
55
+ return t(($) => $.obsidianLib.validation.controlCharacter, { name });
56
+ }
57
+ const unsafeChars = new Set(name.match(getOsAndObsidianUnsafePathCharsRegExp(isWindows, isAndroid)));
58
+ if (unsafeChars.size > 0) {
59
+ return t(($) => $.obsidianLib.validation.unsafeCharacters, { characters: [...unsafeChars].join(" "), name });
60
+ }
61
+ if (hasWindowsTrailingChars(name)) {
62
+ return t(($) => $.obsidianLib.validation.trailingCharacters, { name });
63
+ }
64
+ return isWindowsReservedName(name) ? t(($) => $.obsidianLib.validation.windowsReservedName, { name }) : "";
65
+ }
66
+ function getOsAndObsidianUnsafePathCharsRegExp(isWindows, isAndroid) {
48
67
  return oneOf([
49
- getOsUnsafePathCharsRegExp(isWindows),
68
+ getOsUnsafePathCharsRegExp(isWindows, isAndroid),
50
69
  OBSIDIAN_UNSAFE_FILENAME_CHARS
51
70
  ]);
52
71
  }
53
- function getOsUnsafePathCharsRegExp(isWindows) {
72
+ function getOsUnsafePathCharsRegExp(isWindows, isAndroid) {
54
73
  isWindows ??= Platform.isWin;
55
- return isWindows ? WINDOWS_UNSAFE_PATH_CHARS : UNIX_UNSAFE_PATH_CHARS;
74
+ if (isWindows) {
75
+ return WINDOWS_UNSAFE_PATH_CHARS;
76
+ }
77
+ isAndroid ??= Platform.isAndroidApp;
78
+ return isAndroid ? ANDROID_UNSAFE_PATH_CHARS : UNIX_UNSAFE_PATH_CHARS;
79
+ }
80
+ function getPathValidationMessage(path, isWindows, isAndroid) {
81
+ return path.split("/").map((segment) => getFileNameValidationMessage(segment, isWindows, isAndroid)).find(Boolean) ?? "";
56
82
  }
57
83
  function hasWindowsTrailingChars(name) {
58
84
  return WINDOWS_TRAILING_CHARS_REG_EXP.test(name);
@@ -64,15 +90,26 @@ function isWindowsReservedName(name) {
64
90
  function trimWindowsTrailingChars(name) {
65
91
  return name.replace(WINDOWS_TRAILING_CHARS_REG_EXP, "");
66
92
  }
93
+ function hasControlChars(name) {
94
+ for (const char of name) {
95
+ if (char < FIRST_NON_CONTROL_CHAR) {
96
+ return true;
97
+ }
98
+ }
99
+ return false;
100
+ }
67
101
  export {
102
+ ANDROID_UNSAFE_PATH_CHARS,
68
103
  OBSIDIAN_UNSAFE_FILENAME_CHARS,
69
104
  UNIX_UNSAFE_PATH_CHARS,
70
105
  WINDOWS_UNSAFE_PATH_CHARS,
106
+ getFileNameValidationMessage,
71
107
  getOsAndObsidianUnsafePathCharsRegExp,
72
108
  getOsUnsafePathCharsRegExp,
109
+ getPathValidationMessage,
73
110
  hasWindowsTrailingChars,
74
111
  isValidationMessageHolder,
75
112
  isWindowsReservedName,
76
113
  trimWindowsTrailingChars
77
114
  };
78
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy92YWxpZGF0aW9uLnRzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGZpbGVcbiAqXG4gKiBWYWxpZGF0aW9uIHV0aWxpdGllcy5cbiAqL1xuXG5pbXBvcnQge1xuICBiYXNlbmFtZSxcbiAgZXh0bmFtZVxufSBmcm9tICdAbW5hb3Vtb3YvdHlwZXNjcmlwdC1saWIvcGF0aCc7XG5pbXBvcnQgeyBvbmVPZiB9IGZyb20gJ0BtbmFvdW1vdi90eXBlc2NyaXB0LWxpYi9yZWctZXhwJztcbmltcG9ydCB7IFBsYXRmb3JtIH0gZnJvbSAnb2JzaWRpYW4nO1xuXG4vKipcbiAqIEhvbGRzIGEgdmFsaWRhdGlvbiBtZXNzYWdlLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFZhbGlkYXRpb25NZXNzYWdlSG9sZGVyIHtcbiAgLyoqXG4gICAqIEEgdmFsaWRhdGlvbiBtZXNzYWdlLlxuICAgKi9cbiAgdmFsaWRhdGlvbk1lc3NhZ2U6IHN0cmluZztcbn1cblxuLyoqXG4gKiBUeXBlIGd1YXJkIHRvIGNoZWNrIGlmIGEgdmFsdWUgaXMgYSB2YWxpZGF0aW9uIG1lc3NhZ2UgaG9sZGVyLlxuICpcbiAqIEBwYXJhbSB2YWx1ZSAtIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAqIEByZXR1cm5zIGB0cnVlYCBpZiB0aGUgdmFsdWUgaXMgYSB2YWxpZGF0aW9uIG1lc3NhZ2UgaG9sZGVyLCBgZmFsc2VgIG90aGVyd2lzZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzVmFsaWRhdGlvbk1lc3NhZ2VIb2xkZXIodmFsdWU6IHVua25vd24pOiB2YWx1ZSBpcyBWYWxpZGF0aW9uTWVzc2FnZUhvbGRlciB7XG4gIHJldHVybiAodmFsdWUgYXMgUGFydGlhbDxWYWxpZGF0aW9uTWVzc2FnZUhvbGRlcj4pLnZhbGlkYXRpb25NZXNzYWdlICE9PSB1bmRlZmluZWQ7XG59XG5cbi8qKlxuICogTWF0Y2hlcyBjaGFyYWN0ZXJzIHRoYXQgYXJlIG5vdCBzYWZlIHRvIHVzZSBpbiBmaWxlIG5hbWVzIHdpdGhpbiBPYnNpZGlhbi5cbiAqL1xuZXhwb3J0IGNvbnN0IE9CU0lESUFOX1VOU0FGRV9GSUxFTkFNRV9DSEFSUyA9IC9bI15bXFxdfF0vZztcblxuLyoqXG4gKiBXaW5kb3dzLXNwZWNpZmljIHVuc2FmZSBmaWxlIG5hbWUgcGF0aCBjaGFyYWN0ZXJzLlxuICovXG5leHBvcnQgY29uc3QgV0lORE9XU19VTlNBRkVfUEFUSF9DSEFSUyA9IC9bKlxcXFwvPD46fD9cIl0vZztcblxuLyoqXG4gKiBVbml4LXNwZWNpZmljIHVuc2FmZSBmaWxlIG5hbWUgcGF0aCBjaGFyYWN0ZXJzLlxuICovXG5leHBvcnQgY29uc3QgVU5JWF9VTlNBRkVfUEFUSF9DSEFSUyA9IC9bXFwwL10vZztcblxuLyoqXG4gKiBUaGUgTVMtRE9TIGRldmljZSBuYW1lcyBXaW5kb3dzIHN0aWxsIHJlZnVzZXMgYXMgYSBmaWxlIG5hbWUsIHdpdGggb3Igd2l0aG91dCBhbiBleHRlbnNpb24uXG4gKlxuICogYENPTklOJGAgLyBgQ09OT1VUJGAgYW5kIHRoZSBzdXBlcnNjcmlwdCBgQ09NwrJgIGZvcm1zIGFyZSBkZWxpYmVyYXRlbHkgYWJzZW50OiB0aGV5IGFyZSBhY2NlcHRlZCBieVxuICogZXZlcnkgV2luZG93cyB2ZXJzaW9uIHRoYXQgcnVucyBPYnNpZGlhbiwgYW5kIG1hdGNoaW5nIHRoZW0gd291bGQgcmVuYW1lIGZpbGVzIHRoYXQgd29yay5cbiAqXG4gKiBVbmxpa2UgdGhlIGV4cG9ydGVkIGNoYXJhY3RlciBzZXRzIGFib3ZlLCB0aGlzIGNhcnJpZXMgbm8gYGdgIGZsYWcsIHNvIGB0ZXN0YCBtYXkgYmUgY2FsbGVkIG9uIGl0XG4gKiByZXBlYXRlZGx5IOKAlCBhIGBnYC1mbGFnZ2VkIHJlZ2V4cCBhZHZhbmNlcyBgbGFzdEluZGV4YCBhbmQgYW5zd2VycyBkaWZmZXJlbnRseSBvbiBjb25zZWN1dGl2ZSBjYWxscy5cbiAqL1xuY29uc3QgV0lORE9XU19SRVNFUlZFRF9OQU1FX1JFR19FWFAgPSAvXig/OkFVWHxDT01bMS05XXxDT058TFBUWzEtOV18TlVMfFBSTikkL2k7XG5cbi8qKlxuICogVGhlIHRyYWlsaW5nIGRvdHMgYW5kIHNwYWNlcyBXaW5kb3dzIHN0cmlwcyBmcm9tIGEgbmFtZSBiZWZvcmUgaXQgZG9lcyBhbnl0aGluZyBlbHNlIHdpdGggaXQuXG4gKi9cbmNvbnN0IFdJTkRPV1NfVFJBSUxJTkdfQ0hBUlNfUkVHX0VYUCA9IC9bIC5dKyQvO1xuXG4vKipcbiAqIFJldHVybnMgYSByZWdleHAgbWF0Y2hpbmcgYWxsIHVuc2FmZSBjaGFyYWN0ZXJzIGluIGZpbGUgbmFtZXMvcGF0aHMuXG4gKlxuICogSW5jbHVkZXMgYm90aCBPUy1zcGVjaWZpYyByZXN0cmljdGlvbnMgYW5kIE9ic2lkaWFuLXNwZWNpZmljIG9uZXMuXG4gKlxuICogQHBhcmFtIGlzV2luZG93cyAtIFdoZXRoZXIgdG8gaW5jbHVkZSBXaW5kb3dzLXNwZWNpZmljIHJlc3RyaWN0aW9ucy4gRGVmYXVsdHMgdG8gYFBsYXRmb3JtLmlzV2luYC5cbiAqIEByZXR1cm5zIEEgcmVnZXhwIG1hdGNoaW5nIGFsbCB1bnNhZmUgY2hhcmFjdGVycyBpbiBmaWxlIG5hbWVzL3BhdGhzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0T3NBbmRPYnNpZGlhblVuc2FmZVBhdGhDaGFyc1JlZ0V4cChpc1dpbmRvd3M/OiBib29sZWFuKTogUmVnRXhwIHtcbiAgcmV0dXJuIG9uZU9mKFtcbiAgICBnZXRPc1Vuc2FmZVBhdGhDaGFyc1JlZ0V4cChpc1dpbmRvd3MpLFxuICAgIE9CU0lESUFOX1VOU0FGRV9GSUxFTkFNRV9DSEFSU1xuICBdKTtcbn1cblxuLyoqXG4gKiBSZXR1cm5zIGEgcmVnZXhwIG1hdGNoaW5nIGNoYXJhY3RlcnMgdGhhdCBhcmUgbm90IHNhZmUgdG8gdXNlIGluIGZpbGUgbmFtZXMvcGF0aHMgYXQgdGhlIE9TIGxldmVsLlxuICpcbiAqIEBwYXJhbSBpc1dpbmRvd3MgLSBXaGV0aGVyIHRvIGluY2x1ZGUgV2luZG93cy1zcGVjaWZpYyByZXN0cmljdGlvbnMuIERlZmF1bHRzIHRvIGBQbGF0Zm9ybS5pc1dpbmAuXG4gKiBAcmV0dXJucyBBIHJlZ2V4cCBtYXRjaGluZyBjaGFyYWN0ZXJzIHRoYXQgYXJlIG5vdCBzYWZlIHRvIHVzZSBpbiBmaWxlIG5hbWVzL3BhdGhzIGF0IHRoZSBPUyBsZXZlbC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldE9zVW5zYWZlUGF0aENoYXJzUmVnRXhwKGlzV2luZG93cz86IGJvb2xlYW4pOiBSZWdFeHAge1xuICBpc1dpbmRvd3MgPz89IFBsYXRmb3JtLmlzV2luO1xuICByZXR1cm4gaXNXaW5kb3dzID8gV0lORE9XU19VTlNBRkVfUEFUSF9DSEFSUyA6IFVOSVhfVU5TQUZFX1BBVEhfQ0hBUlM7XG59XG5cbi8qKlxuICogQ2hlY2tzIHdoZXRoZXIgYSBuYW1lIGVuZHMgd2l0aCB0aGUgZG90cyBvciBzcGFjZXMgV2luZG93cyByZWZ1c2VzLlxuICpcbiAqIEFuc3dlcnMgZm9yIFdpbmRvd3MgcmVnYXJkbGVzcyBvZiB0aGUgcGxhdGZvcm0gaW4gdXNlOiBhIHZhdWx0IGlzIHN5bmNlZCwgc28gdGhlIHJ1bGVzIHRoYXQgbWF0dGVyIGFyZVxuICogbm90IG5lY2Vzc2FyaWx5IHRob3NlIG9mIHRoZSBtYWNoaW5lIGFza2luZy5cbiAqXG4gKiBAcGFyYW0gbmFtZSAtIFRoZSBuYW1lIHRvIGNoZWNrLiBBIHNpbmdsZSBwYXRoIHNlZ21lbnQsIG5vdCBhIHBhdGguXG4gKiBAcmV0dXJucyBgdHJ1ZWAgaWYgdGhlIG5hbWUgZW5kcyB3aXRoIGEgZG90IG9yIGEgc3BhY2UsIGBmYWxzZWAgb3RoZXJ3aXNlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gaGFzV2luZG93c1RyYWlsaW5nQ2hhcnMobmFtZTogc3RyaW5nKTogYm9vbGVhbiB7XG4gIHJldHVybiBXSU5ET1dTX1RSQUlMSU5HX0NIQVJTX1JFR19FWFAudGVzdChuYW1lKTtcbn1cblxuLyoqXG4gKiBDaGVja3Mgd2hldGhlciBhIG5hbWUgaXMgb25lIG9mIHRoZSBNUy1ET1MgZGV2aWNlIG5hbWVzIFdpbmRvd3MgcmVmdXNlcy5cbiAqXG4gKiBUd28gc3RlcHMgdGhlIGNhbGxlciB3b3VsZCBvdGhlcndpc2UgaGF2ZSB0byBrbm93IGFib3V0IGhhcHBlbiBoZXJlOiB0cmFpbGluZyBkb3RzIGFuZCBzcGFjZXMgYXJlXG4gKiB0cmltbWVkIEJFRk9SRSB0aGUgdGVzdCwgYmVjYXVzZSBXaW5kb3dzIHN0cmlwcyB0aGVtIGJlZm9yZSBkZWNpZGluZyBhbmQgYENPTiBgIGlzIHRoZXJlZm9yZSBhc1xuICogcmVzZXJ2ZWQgYXMgYENPTmA7IGFuZCB0aGUgZXh0ZW5zaW9uIGlzIGRyb3BwZWQsIGJlY2F1c2UgYENPTi5tZGAgaXMgcmVzZXJ2ZWQgdG9vLlxuICpcbiAqIGBDT05JTiRgIC8gYENPTk9VVCRgIGFuZCB0aGUgc3VwZXJzY3JpcHQgYENPTcKyYCBmb3JtcyBhcmUgZGVsaWJlcmF0ZWx5IE5PVCByZXNlcnZlZDogdGhleSBhcmUgYWNjZXB0ZWRcbiAqIGJ5IGV2ZXJ5IFdpbmRvd3MgdmVyc2lvbiB0aGF0IHJ1bnMgT2JzaWRpYW4sIGFuZCBtYXRjaGluZyB0aGVtIHdvdWxkIHJlbmFtZSBmaWxlcyB0aGF0IHdvcmsuXG4gKlxuICogQW5zd2VycyBmb3IgV2luZG93cyByZWdhcmRsZXNzIG9mIHRoZSBwbGF0Zm9ybSBpbiB1c2U6IGEgdmF1bHQgaXMgc3luY2VkLCBzbyB0aGUgcnVsZXMgdGhhdCBtYXR0ZXIgYXJlXG4gKiBub3QgbmVjZXNzYXJpbHkgdGhvc2Ugb2YgdGhlIG1hY2hpbmUgYXNraW5nLlxuICpcbiAqIEBwYXJhbSBuYW1lIC0gVGhlIG5hbWUgdG8gY2hlY2suIEEgc2luZ2xlIHBhdGggc2VnbWVudCwgd2l0aCBvciB3aXRob3V0IGl0cyBleHRlbnNpb24uXG4gKiBAcmV0dXJucyBgdHJ1ZWAgaWYgdGhlIG5hbWUgaXMgcmVzZXJ2ZWQsIGBmYWxzZWAgb3RoZXJ3aXNlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNXaW5kb3dzUmVzZXJ2ZWROYW1lKG5hbWU6IHN0cmluZyk6IGJvb2xlYW4ge1xuICBjb25zdCB0cmltbWVkTmFtZSA9IHRyaW1XaW5kb3dzVHJhaWxpbmdDaGFycyhuYW1lKTtcbiAgcmV0dXJuIFdJTkRPV1NfUkVTRVJWRURfTkFNRV9SRUdfRVhQLnRlc3QoYmFzZW5hbWUodHJpbW1lZE5hbWUsIGV4dG5hbWUodHJpbW1lZE5hbWUpKSk7XG59XG5cbi8qKlxuICogUmVtb3ZlcyB0aGUgdHJhaWxpbmcgZG90cyBhbmQgc3BhY2VzIFdpbmRvd3MgcmVmdXNlcyBmcm9tIHRoZSBlbmQgb2YgYSBuYW1lLlxuICpcbiAqIFRyaW0gYmVmb3JlIHRlc3RpbmcgZm9yIGEgcmVzZXJ2ZWQgbmFtZSwgbmV2ZXIgYWZ0ZXI6IHRyaW1taW5nIGFmdGVyd2FyZHMgdHVybnMgYW4gYWNjZXB0ZWQgYENPTiBgIGludG9cbiAqIGEgcmVqZWN0ZWQgYENPTmAuIHtAbGluayBpc1dpbmRvd3NSZXNlcnZlZE5hbWV9IGFscmVhZHkgZG9lcyB0aGlzIGludGVybmFsbHkuXG4gKlxuICogQHBhcmFtIG5hbWUgLSBUaGUgbmFtZSB0byB0cmltLiBBIHNpbmdsZSBwYXRoIHNlZ21lbnQsIG5vdCBhIHBhdGguXG4gKiBAcmV0dXJucyBUaGUgbmFtZSB3aXRob3V0IGl0cyB0cmFpbGluZyBkb3RzIGFuZCBzcGFjZXMsIHdoaWNoIG1heSBiZSBlbXB0eS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRyaW1XaW5kb3dzVHJhaWxpbmdDaGFycyhuYW1lOiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gbmFtZS5yZXBsYWNlKFdJTkRPV1NfVFJBSUxJTkdfQ0hBUlNfUkVHX0VYUCwgJycpO1xufVxuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQU1BO0FBQUEsRUFDRTtBQUFBLEVBQ0E7QUFBQSxPQUNLO0FBQ1AsU0FBUyxhQUFhO0FBQ3RCLFNBQVMsZ0JBQWdCO0FBa0JsQixTQUFTLDBCQUEwQixPQUFrRDtBQUMxRixTQUFRLE1BQTJDLHNCQUFzQjtBQUMzRTtBQUtPLE1BQU0saUNBQWlDO0FBS3ZDLE1BQU0sNEJBQTRCO0FBS2xDLE1BQU0seUJBQXlCO0FBV3RDLE1BQU0sZ0NBQWdDO0FBS3RDLE1BQU0saUNBQWlDO0FBVWhDLFNBQVMsc0NBQXNDLFdBQTZCO0FBQ2pGLFNBQU8sTUFBTTtBQUFBLElBQ1gsMkJBQTJCLFNBQVM7QUFBQSxJQUNwQztBQUFBLEVBQ0YsQ0FBQztBQUNIO0FBUU8sU0FBUywyQkFBMkIsV0FBNkI7QUFDdEUsZ0JBQWMsU0FBUztBQUN2QixTQUFPLFlBQVksNEJBQTRCO0FBQ2pEO0FBV08sU0FBUyx3QkFBd0IsTUFBdUI7QUFDN0QsU0FBTywrQkFBK0IsS0FBSyxJQUFJO0FBQ2pEO0FBa0JPLFNBQVMsc0JBQXNCLE1BQXVCO0FBQzNELFFBQU0sY0FBYyx5QkFBeUIsSUFBSTtBQUNqRCxTQUFPLDhCQUE4QixLQUFLLFNBQVMsYUFBYSxRQUFRLFdBQVcsQ0FBQyxDQUFDO0FBQ3ZGO0FBV08sU0FBUyx5QkFBeUIsTUFBc0I7QUFDN0QsU0FBTyxLQUFLLFFBQVEsZ0NBQWdDLEVBQUU7QUFDeEQ7IiwibmFtZXMiOltdfQ==
115
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy92YWxpZGF0aW9uLnRzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGZpbGVcbiAqXG4gKiBWYWxpZGF0aW9uIHV0aWxpdGllcy5cbiAqL1xuXG5pbXBvcnQge1xuICBiYXNlbmFtZSxcbiAgZXh0bmFtZVxufSBmcm9tICdAbW5hb3Vtb3YvdHlwZXNjcmlwdC1saWIvcGF0aCc7XG5pbXBvcnQgeyBvbmVPZiB9IGZyb20gJ0BtbmFvdW1vdi90eXBlc2NyaXB0LWxpYi9yZWctZXhwJztcbmltcG9ydCB7IFBsYXRmb3JtIH0gZnJvbSAnb2JzaWRpYW4nO1xuXG5pbXBvcnQgeyB0IH0gZnJvbSAnLi9pMThuL2kxOG4udHMnO1xuXG4vKipcbiAqIEhvbGRzIGEgdmFsaWRhdGlvbiBtZXNzYWdlLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFZhbGlkYXRpb25NZXNzYWdlSG9sZGVyIHtcbiAgLyoqXG4gICAqIEEgdmFsaWRhdGlvbiBtZXNzYWdlLlxuICAgKi9cbiAgdmFsaWRhdGlvbk1lc3NhZ2U6IHN0cmluZztcbn1cblxuLyoqXG4gKiBUeXBlIGd1YXJkIHRvIGNoZWNrIGlmIGEgdmFsdWUgaXMgYSB2YWxpZGF0aW9uIG1lc3NhZ2UgaG9sZGVyLlxuICpcbiAqIEBwYXJhbSB2YWx1ZSAtIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAqIEByZXR1cm5zIGB0cnVlYCBpZiB0aGUgdmFsdWUgaXMgYSB2YWxpZGF0aW9uIG1lc3NhZ2UgaG9sZGVyLCBgZmFsc2VgIG90aGVyd2lzZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzVmFsaWRhdGlvbk1lc3NhZ2VIb2xkZXIodmFsdWU6IHVua25vd24pOiB2YWx1ZSBpcyBWYWxpZGF0aW9uTWVzc2FnZUhvbGRlciB7XG4gIHJldHVybiAodmFsdWUgYXMgUGFydGlhbDxWYWxpZGF0aW9uTWVzc2FnZUhvbGRlcj4pLnZhbGlkYXRpb25NZXNzYWdlICE9PSB1bmRlZmluZWQ7XG59XG5cbi8qKlxuICogTWF0Y2hlcyBjaGFyYWN0ZXJzIHRoYXQgYXJlIG5vdCBzYWZlIHRvIHVzZSBpbiBmaWxlIG5hbWVzIHdpdGhpbiBPYnNpZGlhbi5cbiAqL1xuZXhwb3J0IGNvbnN0IE9CU0lESUFOX1VOU0FGRV9GSUxFTkFNRV9DSEFSUyA9IC9bI15bXFxdfF0vZztcblxuLyoqXG4gKiBUaGUgY2hhcmFjdGVycyBPYnNpZGlhbiByZWZ1c2VzIGluIGEgZmlsZSBuYW1lIG9uIFdpbmRvd3MuXG4gKlxuICogUmVhZCBmcm9tIE9ic2lkaWFuIDEuMTUuMCdzIGBhcHAuanNgLCB3aG9zZSBuYW1lIGNoZWNrIHRocm93cyBvbiB0aGlzIHNldCBmcm9tIGBhcHAudmF1bHQuY3JlYXRlYCwgYVxuICogcmVuYW1lIGFuZCBTeW5jIGFsaWtlLlxuICovXG5leHBvcnQgY29uc3QgV0lORE9XU19VTlNBRkVfUEFUSF9DSEFSUyA9IC9bKlxcXFwvPD46fD9cIl0vZztcblxuLyoqXG4gKiBUaGUgY2hhcmFjdGVycyBPYnNpZGlhbiByZWZ1c2VzIGluIGEgZmlsZSBuYW1lIG9uIG1hY09TLCBMaW51eCBhbmQgaU9TLCBwbHVzIHRoZSBOVUwgbm8gZmlsZSBzeXN0ZW0gc3RvcmVzLlxuICpcbiAqIFRoaXMgaXMgT2JzaWRpYW4ncyByZWZ1c2FsIHNldCwgbm90IHRoZSBmaWxlIHN5c3RlbSdzOiBtYWNPUyBhbmQgTGludXggc3RvcmUgYFxcYCBhbmQgYDpgLCBidXQgT2JzaWRpYW5cbiAqIHJlZnVzZXMgYm90aCwgc28gYSBuYW1lIGhvbGRpbmcgZWl0aGVyIGNhbm5vdCBiZSBjcmVhdGVkIHRocm91Z2ggdGhlIHZhdWx0IHRoZXJlLiBSZWFkIGZyb20gT2JzaWRpYW5cbiAqIDEuMTUuMCdzIGBhcHAuanNgLlxuICovXG5leHBvcnQgY29uc3QgVU5JWF9VTlNBRkVfUEFUSF9DSEFSUyA9IC9bXFwwXFxcXC86XS9nO1xuXG4vKipcbiAqIFRoZSBjaGFyYWN0ZXJzIE9ic2lkaWFuIHJlZnVzZXMgaW4gYSBmaWxlIG5hbWUgb24gQW5kcm9pZCwgcGx1cyB0aGUgTlVMIG5vIGZpbGUgc3lzdGVtIHN0b3Jlcy5cbiAqXG4gKiBPYnNpZGlhbiBhZGRzIGAqID8gPCA+IFwiYCB0byB0aGUge0BsaW5rIFVOSVhfVU5TQUZFX1BBVEhfQ0hBUlN9IHNldCB0aGVyZSwgYmVjYXVzZSBBbmRyb2lkJ3Mgc2hhcmVkXG4gKiBzdG9yYWdlIHJlZnVzZXMgdGhlbS4gUmVhZCBmcm9tIE9ic2lkaWFuIDEuMTUuMCdzIGBhcHAuanNgLlxuICovXG5leHBvcnQgY29uc3QgQU5EUk9JRF9VTlNBRkVfUEFUSF9DSEFSUyA9IC9bXFwwKlxcXFwvPD46P1wiXS9nO1xuXG4vKipcbiAqIFRoZSBNUy1ET1MgZGV2aWNlIG5hbWVzIFdpbmRvd3Mgc3RpbGwgcmVmdXNlcyBhcyBhIGZpbGUgbmFtZSwgd2l0aCBvciB3aXRob3V0IGFuIGV4dGVuc2lvbi5cbiAqXG4gKiBgQ09OSU4kYCAvIGBDT05PVVQkYCBhbmQgdGhlIHN1cGVyc2NyaXB0IGBDT03CsmAgZm9ybXMgYXJlIGRlbGliZXJhdGVseSBhYnNlbnQ6IHRoZXkgYXJlIGFjY2VwdGVkIGJ5XG4gKiBldmVyeSBXaW5kb3dzIHZlcnNpb24gdGhhdCBydW5zIE9ic2lkaWFuLCBhbmQgbWF0Y2hpbmcgdGhlbSB3b3VsZCByZW5hbWUgZmlsZXMgdGhhdCB3b3JrLlxuICpcbiAqIFVubGlrZSB0aGUgZXhwb3J0ZWQgY2hhcmFjdGVyIHNldHMgYWJvdmUsIHRoaXMgY2FycmllcyBubyBgZ2AgZmxhZywgc28gYHRlc3RgIG1heSBiZSBjYWxsZWQgb24gaXRcbiAqIHJlcGVhdGVkbHkg4oCUIGEgYGdgLWZsYWdnZWQgcmVnZXhwIGFkdmFuY2VzIGBsYXN0SW5kZXhgIGFuZCBhbnN3ZXJzIGRpZmZlcmVudGx5IG9uIGNvbnNlY3V0aXZlIGNhbGxzLlxuICovXG5jb25zdCBXSU5ET1dTX1JFU0VSVkVEX05BTUVfUkVHX0VYUCA9IC9eKD86QVVYfENPTVsxLTldfENPTnxMUFRbMS05XXxOVUx8UFJOKSQvaTtcblxuLyoqXG4gKiBUaGUgdHJhaWxpbmcgZG90cyBhbmQgc3BhY2VzIFdpbmRvd3Mgc3RyaXBzIGZyb20gYSBuYW1lIGJlZm9yZSBpdCBkb2VzIGFueXRoaW5nIGVsc2Ugd2l0aCBpdC5cbiAqL1xuY29uc3QgV0lORE9XU19UUkFJTElOR19DSEFSU19SRUdfRVhQID0gL1sgLl0rJC87XG5cbi8qKlxuICogVGhlIGZpcnN0IGNoYXJhY3RlciBhZnRlciB0aGUgQzAgY29udHJvbCByYW5nZSwgVSswMDAwIHRvIFUrMDAxRiwgd2hpY2ggV2luZG93cyByZWZ1c2VzIGluIGEgbmFtZS5cbiAqL1xuY29uc3QgRklSU1RfTk9OX0NPTlRST0xfQ0hBUiA9ICcgJztcblxuLyoqXG4gKiBWYWxpZGF0ZXMgYSBzaW5nbGUgZmlsZSBvciBmb2xkZXIgbmFtZSBhZ2FpbnN0IGV2ZXJ5IG5hbWluZyBydWxlIHRoaXMgbW9kdWxlIG93bnMuXG4gKlxuICogVGhlIHJ1bGVzLCBjaGVja2VkIGluIHRoaXMgb3JkZXIsIGFuZCB0aGUgZmlyc3Qgb25lIGJyb2tlbiBuYW1lcyB0aGUgbWVzc2FnZTpcbiAqXG4gKiAxLiBUaGUgbmFtZSBpcyBub3QgZW1wdHkuXG4gKiAyLiBJdCBob2xkcyBubyBjb250cm9sIGNoYXJhY3RlciAoVSswMDAwIHRvIFUrMDAxRikuXG4gKiAzLiBJdCBob2xkcyBub25lIG9mIHRoZSBjaGFyYWN0ZXJzIHtAbGluayBnZXRPc0FuZE9ic2lkaWFuVW5zYWZlUGF0aENoYXJzUmVnRXhwfSBtYXRjaGVzLlxuICogNC4gSXQgZG9lcyBub3QgZW5kIHdpdGggYSBkb3Qgb3IgYSBzcGFjZSAoe0BsaW5rIGhhc1dpbmRvd3NUcmFpbGluZ0NoYXJzfSkuXG4gKiA1LiBJdCBpcyBub3QgYW4gTVMtRE9TIGRldmljZSBuYW1lICh7QGxpbmsgaXNXaW5kb3dzUmVzZXJ2ZWROYW1lfSksIHdpdGggb3Igd2l0aG91dCBhbiBleHRlbnNpb24uXG4gKlxuICogT25seSBydWxlIDMgZGVwZW5kcyBvbiB0aGUgcGxhdGZvcm0uIFJ1bGVzIDIsIDQgYW5kIDUgYXBwbHkgb24gZXZlcnkgcGxhdGZvcm0sIGJlY2F1c2UgYSB2YXVsdCBpcyBzeW5jZWQsXG4gKiBhbmQgYSBuYW1lIGNyZWF0ZWQgb24gbWFjT1Mgb3IgTGludXggdGhhdCBXaW5kb3dzIHJlZnVzZXMgYnJlYWtzIHRoZSB2YXVsdCB0aGVyZS4gVGhlIGNoYXJhY3RlciBzZXQgZm9sbG93c1xuICogdGhlIHBsYXRmb3JtIGJlY2F1c2UgaXQgaXMgT2JzaWRpYW4ncyBvd24gcmVmdXNhbCBzZXQsIHdoaWNoIGRpZmZlcnMgcGVyIHBsYXRmb3JtOiBhIG5hbWUgc3VjaCBhcyBgYT9iYCBpc1xuICogYWNjZXB0ZWQgb24gbWFjT1MsIHdoZXJlIE9ic2lkaWFuIGNyZWF0ZXMgaXQuXG4gKlxuICogQHBhcmFtIG5hbWUgLSBUaGUgbmFtZSB0byB2YWxpZGF0ZS4gQSBzaW5nbGUgcGF0aCBzZWdtZW50LCB3aXRoIG9yIHdpdGhvdXQgaXRzIGV4dGVuc2lvbi5cbiAqIEBwYXJhbSBpc1dpbmRvd3MgLSBXaGV0aGVyIHRvIHVzZSB0aGUgV2luZG93cyBjaGFyYWN0ZXIgc2V0LiBEZWZhdWx0cyB0byBgUGxhdGZvcm0uaXNXaW5gLlxuICogQHBhcmFtIGlzQW5kcm9pZCAtIFdoZXRoZXIgdG8gdXNlIHRoZSBBbmRyb2lkIGNoYXJhY3RlciBzZXQgd2hlbiBgaXNXaW5kb3dzYCBpcyBmYWxzZS4gRGVmYXVsdHMgdG9cbiAqIGBQbGF0Zm9ybS5pc0FuZHJvaWRBcHBgLlxuICogQHJldHVybnMgQSBtZXNzYWdlIGRlc2NyaWJpbmcgdGhlIGZpcnN0IGJyb2tlbiBydWxlLCBvciBhbiBlbXB0eSBzdHJpbmcgaWYgdGhlIG5hbWUgaXMgdmFsaWQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRGaWxlTmFtZVZhbGlkYXRpb25NZXNzYWdlKG5hbWU6IHN0cmluZywgaXNXaW5kb3dzPzogYm9vbGVhbiwgaXNBbmRyb2lkPzogYm9vbGVhbik6IHN0cmluZyB7XG4gIGlmIChuYW1lID09PSAnJykge1xuICAgIHJldHVybiB0KCgkKSA9PiAkLm9ic2lkaWFuTGliLnZhbGlkYXRpb24uZW1wdHlOYW1lKTtcbiAgfVxuXG4gIGlmIChoYXNDb250cm9sQ2hhcnMobmFtZSkpIHtcbiAgICByZXR1cm4gdCgoJCkgPT4gJC5vYnNpZGlhbkxpYi52YWxpZGF0aW9uLmNvbnRyb2xDaGFyYWN0ZXIsIHsgbmFtZSB9KTtcbiAgfVxuXG4gIGNvbnN0IHVuc2FmZUNoYXJzID0gbmV3IFNldChuYW1lLm1hdGNoKGdldE9zQW5kT2JzaWRpYW5VbnNhZmVQYXRoQ2hhcnNSZWdFeHAoaXNXaW5kb3dzLCBpc0FuZHJvaWQpKSk7XG4gIGlmICh1bnNhZmVDaGFycy5zaXplID4gMCkge1xuICAgIHJldHVybiB0KCgkKSA9PiAkLm9ic2lkaWFuTGliLnZhbGlkYXRpb24udW5zYWZlQ2hhcmFjdGVycywgeyBjaGFyYWN0ZXJzOiBbLi4udW5zYWZlQ2hhcnNdLmpvaW4oJyAnKSwgbmFtZSB9KTtcbiAgfVxuXG4gIGlmIChoYXNXaW5kb3dzVHJhaWxpbmdDaGFycyhuYW1lKSkge1xuICAgIHJldHVybiB0KCgkKSA9PiAkLm9ic2lkaWFuTGliLnZhbGlkYXRpb24udHJhaWxpbmdDaGFyYWN0ZXJzLCB7IG5hbWUgfSk7XG4gIH1cblxuICByZXR1cm4gaXNXaW5kb3dzUmVzZXJ2ZWROYW1lKG5hbWUpID8gdCgoJCkgPT4gJC5vYnNpZGlhbkxpYi52YWxpZGF0aW9uLndpbmRvd3NSZXNlcnZlZE5hbWUsIHsgbmFtZSB9KSA6ICcnO1xufVxuXG4vKipcbiAqIFJldHVybnMgYSByZWdleHAgbWF0Y2hpbmcgYWxsIHVuc2FmZSBjaGFyYWN0ZXJzIGluIGZpbGUgbmFtZXMvcGF0aHMuXG4gKlxuICogSW5jbHVkZXMgYm90aCB0aGUgcGxhdGZvcm0ncyByZWZ1c2VkIGNoYXJhY3RlcnMgKHtAbGluayBnZXRPc1Vuc2FmZVBhdGhDaGFyc1JlZ0V4cH0pIGFuZCB0aGUgb25lcyB0aGF0IGJyZWFrXG4gKiBsaW5rcyAoe0BsaW5rIE9CU0lESUFOX1VOU0FGRV9GSUxFTkFNRV9DSEFSU30pLlxuICpcbiAqIEBwYXJhbSBpc1dpbmRvd3MgLSBXaGV0aGVyIHRvIHVzZSB0aGUgV2luZG93cyBjaGFyYWN0ZXIgc2V0LiBEZWZhdWx0cyB0byBgUGxhdGZvcm0uaXNXaW5gLlxuICogQHBhcmFtIGlzQW5kcm9pZCAtIFdoZXRoZXIgdG8gdXNlIHRoZSBBbmRyb2lkIGNoYXJhY3RlciBzZXQgd2hlbiBgaXNXaW5kb3dzYCBpcyBmYWxzZS4gRGVmYXVsdHMgdG9cbiAqIGBQbGF0Zm9ybS5pc0FuZHJvaWRBcHBgLlxuICogQHJldHVybnMgQSByZWdleHAgbWF0Y2hpbmcgYWxsIHVuc2FmZSBjaGFyYWN0ZXJzIGluIGZpbGUgbmFtZXMvcGF0aHMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRPc0FuZE9ic2lkaWFuVW5zYWZlUGF0aENoYXJzUmVnRXhwKGlzV2luZG93cz86IGJvb2xlYW4sIGlzQW5kcm9pZD86IGJvb2xlYW4pOiBSZWdFeHAge1xuICByZXR1cm4gb25lT2YoW1xuICAgIGdldE9zVW5zYWZlUGF0aENoYXJzUmVnRXhwKGlzV2luZG93cywgaXNBbmRyb2lkKSxcbiAgICBPQlNJRElBTl9VTlNBRkVfRklMRU5BTUVfQ0hBUlNcbiAgXSk7XG59XG5cbi8qKlxuICogUmV0dXJucyBhIHJlZ2V4cCBtYXRjaGluZyB0aGUgY2hhcmFjdGVycyBPYnNpZGlhbiByZWZ1c2VzIGluIGEgZmlsZSBuYW1lIG9uIHRoZSBnaXZlbiBwbGF0Zm9ybS5cbiAqXG4gKiBUaGF0IGlzIHtAbGluayBXSU5ET1dTX1VOU0FGRV9QQVRIX0NIQVJTfSBvbiBXaW5kb3dzLCB7QGxpbmsgQU5EUk9JRF9VTlNBRkVfUEFUSF9DSEFSU30gb24gQW5kcm9pZCBhbmRcbiAqIHtAbGluayBVTklYX1VOU0FGRV9QQVRIX0NIQVJTfSBldmVyeXdoZXJlIGVsc2UuIEl0IGlzIE9ic2lkaWFuJ3Mgc2V0IHJhdGhlciB0aGFuIHRoZSBmaWxlIHN5c3RlbSdzLCBzbyBhXG4gKiBuYW1lIGl0IGFjY2VwdHMgY2FuIGJlIGNyZWF0ZWQgdGhyb3VnaCB0aGUgdmF1bHQuXG4gKlxuICogQHBhcmFtIGlzV2luZG93cyAtIFdoZXRoZXIgdG8gdXNlIHRoZSBXaW5kb3dzIGNoYXJhY3RlciBzZXQuIERlZmF1bHRzIHRvIGBQbGF0Zm9ybS5pc1dpbmAuXG4gKiBAcGFyYW0gaXNBbmRyb2lkIC0gV2hldGhlciB0byB1c2UgdGhlIEFuZHJvaWQgY2hhcmFjdGVyIHNldCB3aGVuIGBpc1dpbmRvd3NgIGlzIGZhbHNlLiBEZWZhdWx0cyB0b1xuICogYFBsYXRmb3JtLmlzQW5kcm9pZEFwcGAuXG4gKiBAcmV0dXJucyBBIHJlZ2V4cCBtYXRjaGluZyB0aGUgY2hhcmFjdGVycyBPYnNpZGlhbiByZWZ1c2VzIGluIGEgZmlsZSBuYW1lIG9uIHRoZSBnaXZlbiBwbGF0Zm9ybS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldE9zVW5zYWZlUGF0aENoYXJzUmVnRXhwKGlzV2luZG93cz86IGJvb2xlYW4sIGlzQW5kcm9pZD86IGJvb2xlYW4pOiBSZWdFeHAge1xuICBpc1dpbmRvd3MgPz89IFBsYXRmb3JtLmlzV2luO1xuICBpZiAoaXNXaW5kb3dzKSB7XG4gICAgcmV0dXJuIFdJTkRPV1NfVU5TQUZFX1BBVEhfQ0hBUlM7XG4gIH1cblxuICBpc0FuZHJvaWQgPz89IFBsYXRmb3JtLmlzQW5kcm9pZEFwcDtcbiAgcmV0dXJuIGlzQW5kcm9pZCA/IEFORFJPSURfVU5TQUZFX1BBVEhfQ0hBUlMgOiBVTklYX1VOU0FGRV9QQVRIX0NIQVJTO1xufVxuXG4vKipcbiAqIFZhbGlkYXRlcyBldmVyeSBzZWdtZW50IG9mIGEgdmF1bHQgcGF0aCB3aXRoIHtAbGluayBnZXRGaWxlTmFtZVZhbGlkYXRpb25NZXNzYWdlfS5cbiAqXG4gKiBAcGFyYW0gcGF0aCAtIFRoZSB2YXVsdC1yZWxhdGl2ZSBwYXRoIHRvIHZhbGlkYXRlLCB3aXRoIGAvYCBhcyB0aGUgc2VwYXJhdG9yLlxuICogQHBhcmFtIGlzV2luZG93cyAtIFdoZXRoZXIgdG8gdXNlIHRoZSBXaW5kb3dzIGNoYXJhY3RlciBzZXQuIERlZmF1bHRzIHRvIGBQbGF0Zm9ybS5pc1dpbmAuXG4gKiBAcGFyYW0gaXNBbmRyb2lkIC0gV2hldGhlciB0byB1c2UgdGhlIEFuZHJvaWQgY2hhcmFjdGVyIHNldCB3aGVuIGBpc1dpbmRvd3NgIGlzIGZhbHNlLiBEZWZhdWx0cyB0b1xuICogYFBsYXRmb3JtLmlzQW5kcm9pZEFwcGAuXG4gKiBAcmV0dXJucyBUaGUgbWVzc2FnZSBmb3IgdGhlIGZpcnN0IGludmFsaWQgc2VnbWVudCwgb3IgYW4gZW1wdHkgc3RyaW5nIGlmIGV2ZXJ5IHNlZ21lbnQgaXMgdmFsaWQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRQYXRoVmFsaWRhdGlvbk1lc3NhZ2UocGF0aDogc3RyaW5nLCBpc1dpbmRvd3M/OiBib29sZWFuLCBpc0FuZHJvaWQ/OiBib29sZWFuKTogc3RyaW5nIHtcbiAgcmV0dXJuIHBhdGguc3BsaXQoJy8nKS5tYXAoKHNlZ21lbnQpID0+IGdldEZpbGVOYW1lVmFsaWRhdGlvbk1lc3NhZ2Uoc2VnbWVudCwgaXNXaW5kb3dzLCBpc0FuZHJvaWQpKS5maW5kKEJvb2xlYW4pID8/ICcnO1xufVxuXG4vKipcbiAqIENoZWNrcyB3aGV0aGVyIGEgbmFtZSBlbmRzIHdpdGggdGhlIGRvdHMgb3Igc3BhY2VzIFdpbmRvd3MgcmVmdXNlcy5cbiAqXG4gKiBBbnN3ZXJzIGZvciBXaW5kb3dzIHJlZ2FyZGxlc3Mgb2YgdGhlIHBsYXRmb3JtIGluIHVzZTogYSB2YXVsdCBpcyBzeW5jZWQsIHNvIHRoZSBydWxlcyB0aGF0IG1hdHRlciBhcmVcbiAqIG5vdCBuZWNlc3NhcmlseSB0aG9zZSBvZiB0aGUgbWFjaGluZSBhc2tpbmcuXG4gKlxuICogQHBhcmFtIG5hbWUgLSBUaGUgbmFtZSB0byBjaGVjay4gQSBzaW5nbGUgcGF0aCBzZWdtZW50LCBub3QgYSBwYXRoLlxuICogQHJldHVybnMgYHRydWVgIGlmIHRoZSBuYW1lIGVuZHMgd2l0aCBhIGRvdCBvciBhIHNwYWNlLCBgZmFsc2VgIG90aGVyd2lzZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGhhc1dpbmRvd3NUcmFpbGluZ0NoYXJzKG5hbWU6IHN0cmluZyk6IGJvb2xlYW4ge1xuICByZXR1cm4gV0lORE9XU19UUkFJTElOR19DSEFSU19SRUdfRVhQLnRlc3QobmFtZSk7XG59XG5cbi8qKlxuICogQ2hlY2tzIHdoZXRoZXIgYSBuYW1lIGlzIG9uZSBvZiB0aGUgTVMtRE9TIGRldmljZSBuYW1lcyBXaW5kb3dzIHJlZnVzZXMuXG4gKlxuICogVHdvIHN0ZXBzIHRoZSBjYWxsZXIgd291bGQgb3RoZXJ3aXNlIGhhdmUgdG8ga25vdyBhYm91dCBoYXBwZW4gaGVyZTogdHJhaWxpbmcgZG90cyBhbmQgc3BhY2VzIGFyZVxuICogdHJpbW1lZCBCRUZPUkUgdGhlIHRlc3QsIGJlY2F1c2UgV2luZG93cyBzdHJpcHMgdGhlbSBiZWZvcmUgZGVjaWRpbmcgYW5kIGBDT04gYCBpcyB0aGVyZWZvcmUgYXNcbiAqIHJlc2VydmVkIGFzIGBDT05gOyBhbmQgdGhlIGV4dGVuc2lvbiBpcyBkcm9wcGVkLCBiZWNhdXNlIGBDT04ubWRgIGlzIHJlc2VydmVkIHRvby5cbiAqXG4gKiBgQ09OSU4kYCAvIGBDT05PVVQkYCBhbmQgdGhlIHN1cGVyc2NyaXB0IGBDT03CsmAgZm9ybXMgYXJlIGRlbGliZXJhdGVseSBOT1QgcmVzZXJ2ZWQ6IHRoZXkgYXJlIGFjY2VwdGVkXG4gKiBieSBldmVyeSBXaW5kb3dzIHZlcnNpb24gdGhhdCBydW5zIE9ic2lkaWFuLCBhbmQgbWF0Y2hpbmcgdGhlbSB3b3VsZCByZW5hbWUgZmlsZXMgdGhhdCB3b3JrLlxuICpcbiAqIEFuc3dlcnMgZm9yIFdpbmRvd3MgcmVnYXJkbGVzcyBvZiB0aGUgcGxhdGZvcm0gaW4gdXNlOiBhIHZhdWx0IGlzIHN5bmNlZCwgc28gdGhlIHJ1bGVzIHRoYXQgbWF0dGVyIGFyZVxuICogbm90IG5lY2Vzc2FyaWx5IHRob3NlIG9mIHRoZSBtYWNoaW5lIGFza2luZy5cbiAqXG4gKiBAcGFyYW0gbmFtZSAtIFRoZSBuYW1lIHRvIGNoZWNrLiBBIHNpbmdsZSBwYXRoIHNlZ21lbnQsIHdpdGggb3Igd2l0aG91dCBpdHMgZXh0ZW5zaW9uLlxuICogQHJldHVybnMgYHRydWVgIGlmIHRoZSBuYW1lIGlzIHJlc2VydmVkLCBgZmFsc2VgIG90aGVyd2lzZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzV2luZG93c1Jlc2VydmVkTmFtZShuYW1lOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgY29uc3QgdHJpbW1lZE5hbWUgPSB0cmltV2luZG93c1RyYWlsaW5nQ2hhcnMobmFtZSk7XG4gIHJldHVybiBXSU5ET1dTX1JFU0VSVkVEX05BTUVfUkVHX0VYUC50ZXN0KGJhc2VuYW1lKHRyaW1tZWROYW1lLCBleHRuYW1lKHRyaW1tZWROYW1lKSkpO1xufVxuXG4vKipcbiAqIFJlbW92ZXMgdGhlIHRyYWlsaW5nIGRvdHMgYW5kIHNwYWNlcyBXaW5kb3dzIHJlZnVzZXMgZnJvbSB0aGUgZW5kIG9mIGEgbmFtZS5cbiAqXG4gKiBUcmltIGJlZm9yZSB0ZXN0aW5nIGZvciBhIHJlc2VydmVkIG5hbWUsIG5ldmVyIGFmdGVyOiB0cmltbWluZyBhZnRlcndhcmRzIHR1cm5zIGFuIGFjY2VwdGVkIGBDT04gYCBpbnRvXG4gKiBhIHJlamVjdGVkIGBDT05gLiB7QGxpbmsgaXNXaW5kb3dzUmVzZXJ2ZWROYW1lfSBhbHJlYWR5IGRvZXMgdGhpcyBpbnRlcm5hbGx5LlxuICpcbiAqIEBwYXJhbSBuYW1lIC0gVGhlIG5hbWUgdG8gdHJpbS4gQSBzaW5nbGUgcGF0aCBzZWdtZW50LCBub3QgYSBwYXRoLlxuICogQHJldHVybnMgVGhlIG5hbWUgd2l0aG91dCBpdHMgdHJhaWxpbmcgZG90cyBhbmQgc3BhY2VzLCB3aGljaCBtYXkgYmUgZW1wdHkuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB0cmltV2luZG93c1RyYWlsaW5nQ2hhcnMobmFtZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIG5hbWUucmVwbGFjZShXSU5ET1dTX1RSQUlMSU5HX0NIQVJTX1JFR19FWFAsICcnKTtcbn1cblxuLyoqXG4gKiBDaGVja3Mgd2hldGhlciBhIG5hbWUgaG9sZHMgYSBjb250cm9sIGNoYXJhY3RlciwgVSswMDAwIHRvIFUrMDAxRi5cbiAqXG4gKiBAcGFyYW0gbmFtZSAtIFRoZSBuYW1lIHRvIGNoZWNrLlxuICogQHJldHVybnMgYHRydWVgIGlmIHRoZSBuYW1lIGhvbGRzIGEgY29udHJvbCBjaGFyYWN0ZXIsIGBmYWxzZWAgb3RoZXJ3aXNlLlxuICovXG5mdW5jdGlvbiBoYXNDb250cm9sQ2hhcnMobmFtZTogc3RyaW5nKTogYm9vbGVhbiB7XG4gIGZvciAoY29uc3QgY2hhciBvZiBuYW1lKSB7XG4gICAgaWYgKGNoYXIgPCBGSVJTVF9OT05fQ09OVFJPTF9DSEFSKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gZmFsc2U7XG59XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBTUE7QUFBQSxFQUNFO0FBQUEsRUFDQTtBQUFBLE9BQ0s7QUFDUCxTQUFTLGFBQWE7QUFDdEIsU0FBUyxnQkFBZ0I7QUFFekIsU0FBUyxTQUFTO0FBa0JYLFNBQVMsMEJBQTBCLE9BQWtEO0FBQzFGLFNBQVEsTUFBMkMsc0JBQXNCO0FBQzNFO0FBS08sTUFBTSxpQ0FBaUM7QUFRdkMsTUFBTSw0QkFBNEI7QUFTbEMsTUFBTSx5QkFBeUI7QUFRL0IsTUFBTSw0QkFBNEI7QUFXekMsTUFBTSxnQ0FBZ0M7QUFLdEMsTUFBTSxpQ0FBaUM7QUFLdkMsTUFBTSx5QkFBeUI7QUF3QnhCLFNBQVMsNkJBQTZCLE1BQWMsV0FBcUIsV0FBNkI7QUFDM0csTUFBSSxTQUFTLElBQUk7QUFDZixXQUFPLEVBQUUsQ0FBQyxNQUFNLEVBQUUsWUFBWSxXQUFXLFNBQVM7QUFBQSxFQUNwRDtBQUVBLE1BQUksZ0JBQWdCLElBQUksR0FBRztBQUN6QixXQUFPLEVBQUUsQ0FBQyxNQUFNLEVBQUUsWUFBWSxXQUFXLGtCQUFrQixFQUFFLEtBQUssQ0FBQztBQUFBLEVBQ3JFO0FBRUEsUUFBTSxjQUFjLElBQUksSUFBSSxLQUFLLE1BQU0sc0NBQXNDLFdBQVcsU0FBUyxDQUFDLENBQUM7QUFDbkcsTUFBSSxZQUFZLE9BQU8sR0FBRztBQUN4QixXQUFPLEVBQUUsQ0FBQyxNQUFNLEVBQUUsWUFBWSxXQUFXLGtCQUFrQixFQUFFLFlBQVksQ0FBQyxHQUFHLFdBQVcsRUFBRSxLQUFLLEdBQUcsR0FBRyxLQUFLLENBQUM7QUFBQSxFQUM3RztBQUVBLE1BQUksd0JBQXdCLElBQUksR0FBRztBQUNqQyxXQUFPLEVBQUUsQ0FBQyxNQUFNLEVBQUUsWUFBWSxXQUFXLG9CQUFvQixFQUFFLEtBQUssQ0FBQztBQUFBLEVBQ3ZFO0FBRUEsU0FBTyxzQkFBc0IsSUFBSSxJQUFJLEVBQUUsQ0FBQyxNQUFNLEVBQUUsWUFBWSxXQUFXLHFCQUFxQixFQUFFLEtBQUssQ0FBQyxJQUFJO0FBQzFHO0FBYU8sU0FBUyxzQ0FBc0MsV0FBcUIsV0FBNkI7QUFDdEcsU0FBTyxNQUFNO0FBQUEsSUFDWCwyQkFBMkIsV0FBVyxTQUFTO0FBQUEsSUFDL0M7QUFBQSxFQUNGLENBQUM7QUFDSDtBQWNPLFNBQVMsMkJBQTJCLFdBQXFCLFdBQTZCO0FBQzNGLGdCQUFjLFNBQVM7QUFDdkIsTUFBSSxXQUFXO0FBQ2IsV0FBTztBQUFBLEVBQ1Q7QUFFQSxnQkFBYyxTQUFTO0FBQ3ZCLFNBQU8sWUFBWSw0QkFBNEI7QUFDakQ7QUFXTyxTQUFTLHlCQUF5QixNQUFjLFdBQXFCLFdBQTZCO0FBQ3ZHLFNBQU8sS0FBSyxNQUFNLEdBQUcsRUFBRSxJQUFJLENBQUMsWUFBWSw2QkFBNkIsU0FBUyxXQUFXLFNBQVMsQ0FBQyxFQUFFLEtBQUssT0FBTyxLQUFLO0FBQ3hIO0FBV08sU0FBUyx3QkFBd0IsTUFBdUI7QUFDN0QsU0FBTywrQkFBK0IsS0FBSyxJQUFJO0FBQ2pEO0FBa0JPLFNBQVMsc0JBQXNCLE1BQXVCO0FBQzNELFFBQU0sY0FBYyx5QkFBeUIsSUFBSTtBQUNqRCxTQUFPLDhCQUE4QixLQUFLLFNBQVMsYUFBYSxRQUFRLFdBQVcsQ0FBQyxDQUFDO0FBQ3ZGO0FBV08sU0FBUyx5QkFBeUIsTUFBc0I7QUFDN0QsU0FBTyxLQUFLLFFBQVEsZ0NBQWdDLEVBQUU7QUFDeEQ7QUFRQSxTQUFTLGdCQUFnQixNQUF1QjtBQUM5QyxhQUFXLFFBQVEsTUFBTTtBQUN2QixRQUFJLE9BQU8sd0JBQXdCO0FBQ2pDLGFBQU87QUFBQSxJQUNUO0FBQUEsRUFDRjtBQUVBLFNBQU87QUFDVDsiLCJuYW1lcyI6W119
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@mnaoumov/obsidian-lib",
3
- "version": "6.0.4",
3
+ "version": "6.2.0",
4
4
  "description": "Runtime library for Obsidian plugin development: plugin base classes, components, settings, modals, vault and metadata helpers.",
5
5
  "keywords": [
6
6
  "obsidian",
@@ -334,7 +334,7 @@
334
334
  "dependencies": {
335
335
  "@lezer/common": "1.5.2",
336
336
  "@mnaoumov/obsidian-dataview": "^1.0.0",
337
- "@mnaoumov/typescript-lib": "^1.6.2",
337
+ "@mnaoumov/typescript-lib": "^1.7.0",
338
338
  "@standard-schema/spec": "^1.1.0",
339
339
  "@types/react": "^19.3.0",
340
340
  "compare-versions": "^6.1.1",