obsidian-dev-utils 97.0.0 → 98.0.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.
Files changed (113) hide show
  1. package/CHANGELOG.md +17 -0
  2. package/LICENSE +1 -1
  3. package/dist/integration-test-plugin/main.js +624 -483
  4. package/dist/lib/cjs/__merged.cjs +14 -9
  5. package/dist/lib/cjs/__merged.d.cts +2 -1
  6. package/dist/lib/cjs/generated-during-build.cjs +1 -1
  7. package/dist/lib/cjs/obsidian/components/rename-delete-handler-component.cjs +38 -38
  8. package/dist/lib/cjs/obsidian/demo-vault-naming.cjs +167 -0
  9. package/dist/lib/cjs/obsidian/demo-vault-naming.d.cts +54 -0
  10. package/dist/lib/cjs/obsidian/desktop-demo-vault-opener.cjs +11 -5
  11. package/dist/lib/cjs/obsidian/desktop-demo-vault-opener.d.cts +10 -8
  12. package/dist/lib/cjs/obsidian/desktop-trusted-input.cjs +9 -9
  13. package/dist/lib/cjs/obsidian/desktop-trusted-input.d.cts +23 -4
  14. package/dist/lib/cjs/obsidian/index.cjs +10 -1
  15. package/dist/lib/cjs/obsidian/index.d.cts +3 -0
  16. package/dist/lib/cjs/obsidian/mobile-trusted-input.cjs +195 -0
  17. package/dist/lib/cjs/obsidian/mobile-trusted-input.d.cts +93 -0
  18. package/dist/lib/cjs/obsidian/plugin/obsidian-plugin-repo-paths.cjs +2 -1
  19. package/dist/lib/cjs/obsidian/plugin/obsidian-plugin-repo-paths.d.cts +4 -0
  20. package/dist/lib/cjs/obsidian/resource-lock.cjs +122 -122
  21. package/dist/lib/cjs/obsidian/trusted-input.cjs +206 -0
  22. package/dist/lib/cjs/obsidian/trusted-input.d.cts +126 -0
  23. package/dist/lib/cjs/script-utils/build.cjs +30 -6
  24. package/dist/lib/cjs/script-utils/build.d.cts +5 -0
  25. package/dist/lib/cjs/script-utils/demo-vault.cjs +26 -6
  26. package/dist/lib/cjs/script-utils/demo-vault.d.cts +12 -8
  27. package/dist/lib/cjs/script-utils/exec.cjs +1 -1
  28. package/dist/lib/cjs/script-utils/formatters/dprint.cjs +3 -2
  29. package/dist/lib/cjs/script-utils/index.cjs +4 -1
  30. package/dist/lib/cjs/script-utils/index.d.cts +1 -0
  31. package/dist/lib/cjs/script-utils/linters/cspell.cjs +3 -3
  32. package/dist/lib/cjs/script-utils/linters/eslint-config.cjs +39 -1
  33. package/dist/lib/cjs/script-utils/linters/eslint-rules/index.cjs +16 -1
  34. package/dist/lib/cjs/script-utils/linters/eslint-rules/index.d.cts +5 -0
  35. package/dist/lib/cjs/script-utils/linters/eslint-rules/manifest-description.cjs +254 -0
  36. package/dist/lib/cjs/script-utils/linters/eslint-rules/manifest-description.d.cts +54 -0
  37. package/dist/lib/cjs/script-utils/linters/eslint-rules/manifest-helpers.cjs +217 -0
  38. package/dist/lib/cjs/script-utils/linters/eslint-rules/manifest-helpers.d.cts +141 -0
  39. package/dist/lib/cjs/script-utils/linters/eslint-rules/manifest-id.cjs +214 -0
  40. package/dist/lib/cjs/script-utils/linters/eslint-rules/manifest-id.d.cts +32 -0
  41. package/dist/lib/cjs/script-utils/linters/eslint-rules/manifest-name.cjs +215 -0
  42. package/dist/lib/cjs/script-utils/linters/eslint-rules/manifest-name.d.cts +30 -0
  43. package/dist/lib/cjs/script-utils/linters/eslint-rules/manifest-schema.cjs +318 -0
  44. package/dist/lib/cjs/script-utils/linters/eslint-rules/manifest-schema.d.cts +45 -0
  45. package/dist/lib/cjs/script-utils/linters/eslint-rules/obsidian-dev-utils-plugin.cjs +9 -1
  46. package/dist/lib/cjs/script-utils/linters/eslint.cjs +3 -2
  47. package/dist/lib/cjs/script-utils/linters/markdownlint.cjs +4 -4
  48. package/dist/lib/cjs/script-utils/npm-run.cjs +4 -3
  49. package/dist/lib/cjs/script-utils/obsidian-dev-utils-repo-paths.cjs +10 -1
  50. package/dist/lib/cjs/script-utils/obsidian-dev-utils-repo-paths.d.cts +37 -1
  51. package/dist/lib/cjs/script-utils/package-manager.cjs +287 -0
  52. package/dist/lib/cjs/script-utils/package-manager.d.cts +77 -0
  53. package/dist/lib/cjs/script-utils/version.cjs +21 -9
  54. package/dist/lib/esm/__merged.d.mts +2 -1
  55. package/dist/lib/esm/__merged.mjs +16 -10
  56. package/dist/lib/esm/generated-during-build.mjs +1 -1
  57. package/dist/lib/esm/obsidian/components/rename-delete-handler-component.mjs +38 -38
  58. package/dist/lib/esm/obsidian/demo-vault-naming.d.mts +54 -0
  59. package/dist/lib/esm/obsidian/demo-vault-naming.mjs +61 -0
  60. package/dist/lib/esm/obsidian/desktop-demo-vault-opener.d.mts +10 -8
  61. package/dist/lib/esm/obsidian/desktop-demo-vault-opener.mjs +14 -5
  62. package/dist/lib/esm/obsidian/desktop-trusted-input.d.mts +23 -4
  63. package/dist/lib/esm/obsidian/desktop-trusted-input.mjs +9 -9
  64. package/dist/lib/esm/obsidian/index.d.mts +3 -0
  65. package/dist/lib/esm/obsidian/index.mjs +7 -1
  66. package/dist/lib/esm/obsidian/mobile-trusted-input.d.mts +93 -0
  67. package/dist/lib/esm/obsidian/mobile-trusted-input.mjs +84 -0
  68. package/dist/lib/esm/obsidian/plugin/obsidian-plugin-repo-paths.d.mts +4 -0
  69. package/dist/lib/esm/obsidian/plugin/obsidian-plugin-repo-paths.mjs +2 -1
  70. package/dist/lib/esm/obsidian/resource-lock.mjs +122 -122
  71. package/dist/lib/esm/obsidian/trusted-input.d.mts +126 -0
  72. package/dist/lib/esm/obsidian/trusted-input.mjs +85 -0
  73. package/dist/lib/esm/script-utils/build.d.mts +5 -0
  74. package/dist/lib/esm/script-utils/build.mjs +30 -6
  75. package/dist/lib/esm/script-utils/demo-vault.d.mts +12 -8
  76. package/dist/lib/esm/script-utils/demo-vault.mjs +29 -6
  77. package/dist/lib/esm/script-utils/exec.mjs +1 -1
  78. package/dist/lib/esm/script-utils/formatters/dprint.mjs +3 -2
  79. package/dist/lib/esm/script-utils/index.d.mts +1 -0
  80. package/dist/lib/esm/script-utils/index.mjs +3 -1
  81. package/dist/lib/esm/script-utils/linters/cspell.mjs +3 -3
  82. package/dist/lib/esm/script-utils/linters/eslint-config.mjs +39 -1
  83. package/dist/lib/esm/script-utils/linters/eslint-rules/index.d.mts +5 -0
  84. package/dist/lib/esm/script-utils/linters/eslint-rules/index.mjs +11 -1
  85. package/dist/lib/esm/script-utils/linters/eslint-rules/manifest-description.d.mts +54 -0
  86. package/dist/lib/esm/script-utils/linters/eslint-rules/manifest-description.mjs +148 -0
  87. package/dist/lib/esm/script-utils/linters/eslint-rules/manifest-helpers.d.mts +141 -0
  88. package/dist/lib/esm/script-utils/linters/eslint-rules/manifest-helpers.mjs +92 -0
  89. package/dist/lib/esm/script-utils/linters/eslint-rules/manifest-id.d.mts +32 -0
  90. package/dist/lib/esm/script-utils/linters/eslint-rules/manifest-id.mjs +111 -0
  91. package/dist/lib/esm/script-utils/linters/eslint-rules/manifest-name.d.mts +30 -0
  92. package/dist/lib/esm/script-utils/linters/eslint-rules/manifest-name.mjs +112 -0
  93. package/dist/lib/esm/script-utils/linters/eslint-rules/manifest-schema.d.mts +45 -0
  94. package/dist/lib/esm/script-utils/linters/eslint-rules/manifest-schema.mjs +217 -0
  95. package/dist/lib/esm/script-utils/linters/eslint-rules/obsidian-dev-utils-plugin.mjs +9 -1
  96. package/dist/lib/esm/script-utils/linters/eslint.mjs +3 -2
  97. package/dist/lib/esm/script-utils/linters/markdownlint.mjs +4 -4
  98. package/dist/lib/esm/script-utils/npm-run.mjs +4 -3
  99. package/dist/lib/esm/script-utils/obsidian-dev-utils-repo-paths.d.mts +37 -1
  100. package/dist/lib/esm/script-utils/obsidian-dev-utils-repo-paths.mjs +10 -1
  101. package/dist/lib/esm/script-utils/package-manager.d.mts +77 -0
  102. package/dist/lib/esm/script-utils/package-manager.mjs +173 -0
  103. package/dist/lib/esm/script-utils/version.mjs +21 -9
  104. package/obsidian/demo-vault-naming/package.json +6 -0
  105. package/obsidian/mobile-trusted-input/package.json +6 -0
  106. package/obsidian/trusted-input/package.json +6 -0
  107. package/package.json +19 -17
  108. package/script-utils/linters/eslint-rules/manifest-description/package.json +6 -0
  109. package/script-utils/linters/eslint-rules/manifest-helpers/package.json +6 -0
  110. package/script-utils/linters/eslint-rules/manifest-id/package.json +6 -0
  111. package/script-utils/linters/eslint-rules/manifest-name/package.json +6 -0
  112. package/script-utils/linters/eslint-rules/manifest-schema/package.json +6 -0
  113. package/script-utils/package-manager/package.json +6 -0
@@ -0,0 +1,254 @@
1
+ /*
2
+ THIS IS A GENERATED/BUNDLED FILE BY ESBUILD
3
+ if you want to view the source, please visit the github repository of this plugin
4
+ */
5
+
6
+ (function () {
7
+ function ensureBrowserProcess() {
8
+ const browserProcess = {
9
+ browser: true,
10
+ cwd() {
11
+ return '/';
12
+ },
13
+ env: {},
14
+ platform: 'android'
15
+ };
16
+
17
+ // eslint-disable-next-line obsidianmd/no-global-this, unicorn/no-unnecessary-global-this -- Must stay `globalThis`-qualified: in the emitted banner a bare `process` is a free identifier, so reading it where the host has none throws a ReferenceError instead of yielding `undefined`. That is the very case this function exists to handle.
18
+ const existingProcess = globalThis.process;
19
+
20
+ if (!existingProcess) {
21
+ // eslint-disable-next-line obsidianmd/no-global-this -- Actively use globalThis.
22
+ globalThis.process = browserProcess;
23
+ return;
24
+ }
25
+
26
+ if (existingProcess.versions?.node) {
27
+ return;
28
+ }
29
+
30
+ const existingProcessRecord = existingProcess;
31
+
32
+ for (const [key, value] of Object.entries(browserProcess)) {
33
+ existingProcessRecord[key] ??= value;
34
+ }
35
+
36
+ existingProcessRecord['browser'] = true;
37
+ }
38
+
39
+ function keepName($unknown) {
40
+ return $unknown;
41
+ }
42
+
43
+ (function initCjs() {
44
+ // eslint-disable-next-line obsidianmd/no-global-this -- Actively use globalThis.
45
+ const globalThisRecord = globalThis;
46
+ globalThisRecord['__name'] ??= keepName;
47
+ const originalRequire = require;
48
+ if (originalRequire && !originalRequire.__isPatched) {
49
+ // eslint-disable-next-line no-global-assign, no-implicit-globals -- We need to patch the `require()` function.
50
+ require = Object.assign(
51
+ (id) => requirePatched(id),
52
+ originalRequire,
53
+ {
54
+ __isPatched: true
55
+ }
56
+ );
57
+ }
58
+
59
+ globalThisRecord['__extractDefault'] ??= extractDefault;
60
+
61
+ ensureBrowserProcess();
62
+
63
+ function extractDefault(module) {
64
+ return module && module.__esModule && 'default' in module ? module.default : module;
65
+ }
66
+
67
+ const OBSIDIAN_BUILT_IN_MODULE_NAMES = new Set([
68
+ '@codemirror/autocomplete',
69
+ '@codemirror/collab',
70
+ '@codemirror/commands',
71
+ '@codemirror/language',
72
+ '@codemirror/lint',
73
+ '@codemirror/search',
74
+ '@codemirror/state',
75
+ '@codemirror/text',
76
+ '@codemirror/view',
77
+ '@lezer/common',
78
+ '@lezer/highlight',
79
+ '@lezer/lr',
80
+ 'obsidian']
81
+ );
82
+
83
+ const DEPRECATED_OBSIDIAN_BUILT_IN_MODULE_NAMES = new Set([
84
+ '@codemirror/closebrackets',
85
+ '@codemirror/comment',
86
+ '@codemirror/fold',
87
+ '@codemirror/gutter',
88
+ '@codemirror/highlight',
89
+ '@codemirror/history',
90
+ '@codemirror/matchbrackets',
91
+ '@codemirror/panel',
92
+ '@codemirror/rangeset',
93
+ '@codemirror/rectangular-selection',
94
+ '@codemirror/stream-parser',
95
+ '@codemirror/tooltip']
96
+ );
97
+
98
+ function requirePatched(id) {
99
+ if (OBSIDIAN_BUILT_IN_MODULE_NAMES.has(id) || DEPRECATED_OBSIDIAN_BUILT_IN_MODULE_NAMES.has(id)) {
100
+ return originalRequire?.(id);
101
+ }
102
+
103
+ // eslint-disable-next-line @typescript-eslint/no-deprecated, obsidianmd/no-global-this -- Need access to app. Actively use globalThis.
104
+ if (globalThis.app.isMobile) {
105
+ if (id === 'process' || id === 'node:process') {
106
+ // eslint-disable-next-line no-console -- Valid usage.
107
+ console.debug(`The most likely you can safely ignore this error. Module not found: ${id}. Fake process object is returned instead.`);
108
+
109
+ return process;
110
+ }
111
+ } else {
112
+ const module = originalRequire?.(id);
113
+ if (module) {
114
+ return extractDefault(module);
115
+ }
116
+ }
117
+
118
+ // eslint-disable-next-line no-console -- Valid usage.
119
+ console.debug(`The most likely you can safely ignore this error. Module not found: ${id}. Empty object is returned instead.`);
120
+ return {};
121
+ }
122
+ })();
123
+ })();
124
+
125
+ "use strict";
126
+ var __defProp = Object.defineProperty;
127
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
128
+ var __getOwnPropNames = Object.getOwnPropertyNames;
129
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
130
+ var __export = (target, all) => {
131
+ for (var name in all)
132
+ __defProp(target, name, { get: all[name], enumerable: true });
133
+ };
134
+ var __copyProps = (to, from, except, desc) => {
135
+ if (from && typeof from === "object" || typeof from === "function") {
136
+ for (let key of __getOwnPropNames(from))
137
+ if (!__hasOwnProp.call(to, key) && key !== except)
138
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
139
+ }
140
+ return to;
141
+ };
142
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
143
+ var manifest_description_exports = {};
144
+ __export(manifest_description_exports, {
145
+ MESSAGE_ID_CONTAINS_OBSIDIAN: () => MESSAGE_ID_CONTAINS_OBSIDIAN,
146
+ MESSAGE_ID_MISSING_PERIOD: () => MESSAGE_ID_MISSING_PERIOD,
147
+ MESSAGE_ID_NOT_CAPITALIZED: () => MESSAGE_ID_NOT_CAPITALIZED,
148
+ MESSAGE_ID_SELF_REFERENCE: () => MESSAGE_ID_SELF_REFERENCE,
149
+ MESSAGE_ID_TOO_LONG: () => MESSAGE_ID_TOO_LONG,
150
+ MESSAGE_ID_TOO_SHORT: () => MESSAGE_ID_TOO_SHORT,
151
+ manifestDescription: () => manifestDescription
152
+ });
153
+ module.exports = __toCommonJS(manifest_description_exports);
154
+ var import_manifest_helpers = require('./manifest-helpers.cjs');
155
+ const MESSAGE_ID_CONTAINS_OBSIDIAN = "descriptionContainsObsidian";
156
+ const MESSAGE_ID_MISSING_PERIOD = "descriptionMissingPeriod";
157
+ const MESSAGE_ID_NOT_CAPITALIZED = "descriptionNotCapitalized";
158
+ const MESSAGE_ID_SELF_REFERENCE = "descriptionSelfReference";
159
+ const MESSAGE_ID_TOO_LONG = "descriptionTooLong";
160
+ const MESSAGE_ID_TOO_SHORT = "descriptionTooShort";
161
+ const MAX_DESCRIPTION_LENGTH = 250;
162
+ const MIN_DESCRIPTION_LENGTH = 10;
163
+ const OBSIDIAN_WORD = /\bobsidian\b/i;
164
+ const SELF_REFERENCE_PATTERNS = [
165
+ /\bthis plugin\b/i,
166
+ /\bthis is a plugin\b/i,
167
+ /\ba plugin (?:that|which)\b/i,
168
+ /^the plugin\b/i,
169
+ /^plugin\b/i
170
+ ];
171
+ const manifestDescription = {
172
+ create(context) {
173
+ return {
174
+ Document(node) {
175
+ const manifestObject = (0, import_manifest_helpers.getManifestObject)(node);
176
+ if (!manifestObject) {
177
+ return;
178
+ }
179
+ const member = (0, import_manifest_helpers.findManifestMember)(manifestObject, "description");
180
+ if (!member) {
181
+ return;
182
+ }
183
+ const description = (0, import_manifest_helpers.getStringValue)(member.value);
184
+ if (description === null) {
185
+ return;
186
+ }
187
+ const reportNode = (0, import_manifest_helpers.toReportNode)(member.value);
188
+ if (OBSIDIAN_WORD.test(description)) {
189
+ context.report({
190
+ messageId: MESSAGE_ID_CONTAINS_OBSIDIAN,
191
+ node: reportNode
192
+ });
193
+ }
194
+ if (SELF_REFERENCE_PATTERNS.some((pattern) => pattern.test(description))) {
195
+ context.report({
196
+ messageId: MESSAGE_ID_SELF_REFERENCE,
197
+ node: reportNode
198
+ });
199
+ }
200
+ if (description.length < MIN_DESCRIPTION_LENGTH) {
201
+ context.report({
202
+ messageId: MESSAGE_ID_TOO_SHORT,
203
+ node: reportNode
204
+ });
205
+ }
206
+ if (description.length > MAX_DESCRIPTION_LENGTH) {
207
+ context.report({
208
+ data: { maxLength: MAX_DESCRIPTION_LENGTH.toString() },
209
+ messageId: MESSAGE_ID_TOO_LONG,
210
+ node: reportNode
211
+ });
212
+ }
213
+ if (!/^[A-Z]/.test(description)) {
214
+ context.report({
215
+ messageId: MESSAGE_ID_NOT_CAPITALIZED,
216
+ node: reportNode
217
+ });
218
+ }
219
+ if (!description.endsWith(".")) {
220
+ context.report({
221
+ messageId: MESSAGE_ID_MISSING_PERIOD,
222
+ node: reportNode
223
+ });
224
+ }
225
+ }
226
+ };
227
+ },
228
+ meta: {
229
+ docs: {
230
+ description: "Enforce the Community directory's constraints on a plugin's `manifest.json` `description`"
231
+ },
232
+ messages: {
233
+ [MESSAGE_ID_CONTAINS_OBSIDIAN]: "The `description` must not contain the word `Obsidian`. It is implied by the context of the plugin directory.",
234
+ [MESSAGE_ID_MISSING_PERIOD]: "The `description` must end with a period.",
235
+ [MESSAGE_ID_NOT_CAPITALIZED]: "The `description` must start with a capital letter.",
236
+ [MESSAGE_ID_SELF_REFERENCE]: "The `description` must not refer to itself, e.g. `this plugin` or `a plugin that`. Describe what it does instead.",
237
+ [MESSAGE_ID_TOO_LONG]: "The `description` must be at most {{ maxLength }} characters.",
238
+ [MESSAGE_ID_TOO_SHORT]: "The `description` is too short to say what the plugin does."
239
+ },
240
+ schema: [],
241
+ type: "problem"
242
+ }
243
+ };
244
+ // Annotate the CommonJS export names for ESM import in node:
245
+ 0 && (module.exports = {
246
+ MESSAGE_ID_CONTAINS_OBSIDIAN,
247
+ MESSAGE_ID_MISSING_PERIOD,
248
+ MESSAGE_ID_NOT_CAPITALIZED,
249
+ MESSAGE_ID_SELF_REFERENCE,
250
+ MESSAGE_ID_TOO_LONG,
251
+ MESSAGE_ID_TOO_SHORT,
252
+ manifestDescription
253
+ });
254
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vLi4vLi4vLi4vc3JjL3NjcmlwdC11dGlscy9saW50ZXJzL2VzbGludC1ydWxlcy9tYW5pZmVzdC1kZXNjcmlwdGlvbi50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiLyoqXG4gKiBAZmlsZVxuICpcbiAqIEVTTGludCBydWxlOiBtYW5pZmVzdC1kZXNjcmlwdGlvblxuICpcbiAqIEVuZm9yY2VzIHRoZSBDb21tdW5pdHkgZGlyZWN0b3J5J3MgY29uc3RyYWludHMgb24gYSBwbHVnaW4ncyBgbWFuaWZlc3QuanNvbmAgYGRlc2NyaXB0aW9uYC5cbiAqXG4gKiBUd28gb2YgdGhlc2UgY2hlY2tzIGRlbGliZXJhdGVseSBkaXZlcmdlIGZyb20gYG9ic2lkaWFubWQvdmFsaWRhdGUtbWFuaWZlc3RgOlxuICpcbiAqIC0gKipTZWxmLXJlZmVyZW5jZSwgbm90IHRoZSB3b3JkIGBwbHVnaW5gLioqIFVwc3RyZWFtJ3MgYEZPUkJJRERFTl9XT1JEU2AgYmFucyB0aGUgYmFyZSBzdWJzdHJpbmdcbiAqICAgYHBsdWdpbmAgaW4gdGhlIGRlc2NyaXB0aW9uLCB3aGljaCByZWplY3RzIHR3byBkZXNjcmlwdGlvbnMgdGhlIGRpcmVjdG9yeSBpdHNlbGYgcGFzc2VkIHVudG91Y2hlZCAtXG4gKiAgIGBFbmhhbmNlcyBOb3RlIGNvbXBvc2VyIGNvcmUgcGx1Z2luLmAgYW5kIGAuLi5ub3QgcGx1Z2luIHVwZGF0ZXMuLi5gIC0gYmVjYXVzZSBlYWNoIG5hbWVzIHNvbWV0aGluZ1xuICogICBvdGhlciB0aGFuIGl0c2VsZi4gVGhlIGRpcmVjdG9yeSdzIGFjdHVhbCBvYmplY3Rpb24gaXMgc2VsZi1yZWZlcmVuY2UsIHNvIG9ubHkgc2VsZi1yZWZlcmVudGlhbFxuICogICBwaHJhc2VzIGFyZSBtYXRjaGVkIGhlcmUuXG4gKiAtICoqTm8gY2hhcmFjdGVyIHdoaXRlbGlzdC4qKiBVcHN0cmVhbSdzIGZvcm1hdCBjaGVjayByZWplY3RzIGFueXRoaW5nIG91dHNpZGVcbiAqICAgYFtBLVphLXowLTlcXHMuLCE/J1wiLV1gLCB3aGljaCBmYWlscyBiYWNrdGlja3MsIGVtIGRhc2hlcywgcGFyZW50aGVzZXMsIGNvbG9ucyBhbmQgc2xhc2hlcy4gU2V2ZW5cbiAqICAgbGl2ZSBsaXN0aW5ncyBjYXJyeSB0aG9zZSBhbmQgdGhlIGRpcmVjdG9yeSBmbGFnZ2VkIG5vbmUsIHNvIHRoZSBjaGVjayBpcyBub2lzZSByYXRoZXIgdGhhbiBhIGdhdGUuXG4gKlxuICogVGhlIG5vLWBPYnNpZGlhbmAgY2hlY2sgaGFzIHRoZSBvcHBvc2l0ZSBwcm92ZW5hbmNlOiB0aGUgZGlyZWN0b3J5IGVuZm9yY2VzIGl0IGFuZCBubyBPYnNpZGlhblxuICogZG9jdW1lbnQgc3RhdGVzIGl0LCB3aGljaCBpcyB3aGF0IGNvc3QgYSByZWxlYXNlZCBwbHVnaW4gYSB2ZXJzaW9uIGJ1bXAgZm9yIG9uZSB3b3JkLlxuICpcbiAqIFJ1bnMgb24gdGhlIGBAZXNsaW50L2pzb25gIGBqc29uL2pzb25gIGxhbmd1YWdlOyBzZWUgYG1hbmlmZXN0LWhlbHBlcnMudHNgIGZvciB3aHkgdGhlIEFTVCBpcyBNb21vYVxuICogcmF0aGVyIHRoYW4gRVNUcmVlLlxuICovXG5cbmltcG9ydCB0eXBlIHsgUnVsZSB9IGZyb20gJ2VzbGludCc7XG5cbmltcG9ydCB7XG4gIGZpbmRNYW5pZmVzdE1lbWJlcixcbiAgZ2V0TWFuaWZlc3RPYmplY3QsXG4gIGdldFN0cmluZ1ZhbHVlLFxuICB0b1JlcG9ydE5vZGVcbn0gZnJvbSAnLi9tYW5pZmVzdC1oZWxwZXJzLnRzJztcblxuLyoqXG5NZXNzYWdlIElEIHJlcG9ydGVkIHdoZW4gdGhlIGRlc2NyaXB0aW9uIGNvbnRhaW5zIHRoZSB3b3JkIGBPYnNpZGlhbmAuXG4gKi9cbmV4cG9ydCBjb25zdCBNRVNTQUdFX0lEX0NPTlRBSU5TX09CU0lESUFOID0gJ2Rlc2NyaXB0aW9uQ29udGFpbnNPYnNpZGlhbic7XG5cbi8qKlxuTWVzc2FnZSBJRCByZXBvcnRlZCB3aGVuIHRoZSBkZXNjcmlwdGlvbiBkb2VzIG5vdCBlbmQgd2l0aCBhIHBlcmlvZC5cbiAqL1xuZXhwb3J0IGNvbnN0IE1FU1NBR0VfSURfTUlTU0lOR19QRVJJT0QgPSAnZGVzY3JpcHRpb25NaXNzaW5nUGVyaW9kJztcblxuLyoqXG5NZXNzYWdlIElEIHJlcG9ydGVkIHdoZW4gdGhlIGRlc2NyaXB0aW9uIGRvZXMgbm90IHN0YXJ0IHdpdGggYSBjYXBpdGFsIGxldHRlci5cbiAqL1xuZXhwb3J0IGNvbnN0IE1FU1NBR0VfSURfTk9UX0NBUElUQUxJWkVEID0gJ2Rlc2NyaXB0aW9uTm90Q2FwaXRhbGl6ZWQnO1xuXG4vKipcbk1lc3NhZ2UgSUQgcmVwb3J0ZWQgd2hlbiB0aGUgZGVzY3JpcHRpb24gcmVmZXJzIHRvIGl0c2VsZi5cbiAqL1xuZXhwb3J0IGNvbnN0IE1FU1NBR0VfSURfU0VMRl9SRUZFUkVOQ0UgPSAnZGVzY3JpcHRpb25TZWxmUmVmZXJlbmNlJztcblxuLyoqXG5NZXNzYWdlIElEIHJlcG9ydGVkIHdoZW4gdGhlIGRlc2NyaXB0aW9uIGlzIGxvbmdlciB0aGFuIHRoZSBkaXJlY3RvcnkgYWxsb3dzLlxuICovXG5leHBvcnQgY29uc3QgTUVTU0FHRV9JRF9UT09fTE9ORyA9ICdkZXNjcmlwdGlvblRvb0xvbmcnO1xuXG4vKipcbk1lc3NhZ2UgSUQgcmVwb3J0ZWQgd2hlbiB0aGUgZGVzY3JpcHRpb24gaXMgdG9vIHNob3J0IHRvIGRlc2NyaWJlIGFueXRoaW5nLlxuICovXG5leHBvcnQgY29uc3QgTUVTU0FHRV9JRF9UT09fU0hPUlQgPSAnZGVzY3JpcHRpb25Ub29TaG9ydCc7XG5cbi8qKlxuVGhlIGxvbmdlc3QgZGVzY3JpcHRpb24gdGhlIENvbW11bml0eSBkaXJlY3RvcnkgYWNjZXB0cy5cbiAqL1xuY29uc3QgTUFYX0RFU0NSSVBUSU9OX0xFTkdUSCA9IDI1MDtcblxuLyoqXG5UaGUgc2hvcnRlc3QgZGVzY3JpcHRpb24gdGhhdCBjYW4gcGxhdXNpYmx5IHNheSB3aGF0IGEgcGx1Z2luIGRvZXMuXG4gKi9cbmNvbnN0IE1JTl9ERVNDUklQVElPTl9MRU5HVEggPSAxMDtcblxuLyoqXG5UaGUgd29yZCBgT2JzaWRpYW5gLCB3aGljaCB0aGUgZGlyZWN0b3J5IHJlamVjdHMgaW4gYSBkZXNjcmlwdGlvbiBldmVuIHRob3VnaCBubyBPYnNpZGlhbiBkb2N1bWVudCBzYXlzIHNvLlxuICovXG5jb25zdCBPQlNJRElBTl9XT1JEID0gL1xcYm9ic2lkaWFuXFxiL2k7XG5cbi8qKlxuVGhlIHBocmFzaW5ncyB0aGUgZGlyZWN0b3J5IGNhbGxzIG91dCBhcyBzZWxmLXJlZmVyZW5jZS4gQSBiYXJlIGBwbHVnaW5gIGlzIGRlbGliZXJhdGVseSBub3QgYW1vbmcgdGhlbTpcbm5hbWluZyBhbm90aGVyIHBsdWdpbiwgb3IgcGx1Z2lucyBpbiBnZW5lcmFsLCBpcyBub3QgcmVmZXJyaW5nIHRvIG9uZXNlbGYuXG4gKi9cbmNvbnN0IFNFTEZfUkVGRVJFTkNFX1BBVFRFUk5TID0gW1xuICAvXFxidGhpcyBwbHVnaW5cXGIvaSxcbiAgL1xcYnRoaXMgaXMgYSBwbHVnaW5cXGIvaSxcbiAgL1xcYmEgcGx1Z2luICg/OnRoYXR8d2hpY2gpXFxiL2ksXG4gIC9edGhlIHBsdWdpblxcYi9pLFxuICAvXnBsdWdpblxcYi9pXG5dO1xuXG4vKipcbiAqIEVTTGludCBydWxlIGVuZm9yY2luZyB0aGUgQ29tbXVuaXR5IGRpcmVjdG9yeSdzIGNvbnN0cmFpbnRzIG9uIGEgcGx1Z2luJ3MgYG1hbmlmZXN0Lmpzb25gIGBkZXNjcmlwdGlvbmAuXG4gKi9cbmV4cG9ydCBjb25zdCBtYW5pZmVzdERlc2NyaXB0aW9uOiBSdWxlLlJ1bGVNb2R1bGUgPSB7XG4gIGNyZWF0ZShjb250ZXh0KSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIERvY3VtZW50KG5vZGU6IHVua25vd24pOiB2b2lkIHtcbiAgICAgICAgY29uc3QgbWFuaWZlc3RPYmplY3QgPSBnZXRNYW5pZmVzdE9iamVjdChub2RlKTtcblxuICAgICAgICBpZiAoIW1hbmlmZXN0T2JqZWN0KSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgbWVtYmVyID0gZmluZE1hbmlmZXN0TWVtYmVyKG1hbmlmZXN0T2JqZWN0LCAnZGVzY3JpcHRpb24nKTtcblxuICAgICAgICBpZiAoIW1lbWJlcikge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGRlc2NyaXB0aW9uID0gZ2V0U3RyaW5nVmFsdWUobWVtYmVyLnZhbHVlKTtcblxuICAgICAgICBpZiAoZGVzY3JpcHRpb24gPT09IG51bGwpIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCByZXBvcnROb2RlID0gdG9SZXBvcnROb2RlKG1lbWJlci52YWx1ZSk7XG5cbiAgICAgICAgaWYgKE9CU0lESUFOX1dPUkQudGVzdChkZXNjcmlwdGlvbikpIHtcbiAgICAgICAgICBjb250ZXh0LnJlcG9ydCh7XG4gICAgICAgICAgICBtZXNzYWdlSWQ6IE1FU1NBR0VfSURfQ09OVEFJTlNfT0JTSURJQU4sXG4gICAgICAgICAgICBub2RlOiByZXBvcnROb2RlXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoU0VMRl9SRUZFUkVOQ0VfUEFUVEVSTlMuc29tZSgocGF0dGVybikgPT4gcGF0dGVybi50ZXN0KGRlc2NyaXB0aW9uKSkpIHtcbiAgICAgICAgICBjb250ZXh0LnJlcG9ydCh7XG4gICAgICAgICAgICBtZXNzYWdlSWQ6IE1FU1NBR0VfSURfU0VMRl9SRUZFUkVOQ0UsXG4gICAgICAgICAgICBub2RlOiByZXBvcnROb2RlXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoZGVzY3JpcHRpb24ubGVuZ3RoIDwgTUlOX0RFU0NSSVBUSU9OX0xFTkdUSCkge1xuICAgICAgICAgIGNvbnRleHQucmVwb3J0KHtcbiAgICAgICAgICAgIG1lc3NhZ2VJZDogTUVTU0FHRV9JRF9UT09fU0hPUlQsXG4gICAgICAgICAgICBub2RlOiByZXBvcnROb2RlXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoZGVzY3JpcHRpb24ubGVuZ3RoID4gTUFYX0RFU0NSSVBUSU9OX0xFTkdUSCkge1xuICAgICAgICAgIGNvbnRleHQucmVwb3J0KHtcbiAgICAgICAgICAgIGRhdGE6IHsgbWF4TGVuZ3RoOiBNQVhfREVTQ1JJUFRJT05fTEVOR1RILnRvU3RyaW5nKCkgfSxcbiAgICAgICAgICAgIG1lc3NhZ2VJZDogTUVTU0FHRV9JRF9UT09fTE9ORyxcbiAgICAgICAgICAgIG5vZGU6IHJlcG9ydE5vZGVcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghL15bQS1aXS8udGVzdChkZXNjcmlwdGlvbikpIHtcbiAgICAgICAgICBjb250ZXh0LnJlcG9ydCh7XG4gICAgICAgICAgICBtZXNzYWdlSWQ6IE1FU1NBR0VfSURfTk9UX0NBUElUQUxJWkVELFxuICAgICAgICAgICAgbm9kZTogcmVwb3J0Tm9kZVxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCFkZXNjcmlwdGlvbi5lbmRzV2l0aCgnLicpKSB7XG4gICAgICAgICAgY29udGV4dC5yZXBvcnQoe1xuICAgICAgICAgICAgbWVzc2FnZUlkOiBNRVNTQUdFX0lEX01JU1NJTkdfUEVSSU9ELFxuICAgICAgICAgICAgbm9kZTogcmVwb3J0Tm9kZVxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfTtcbiAgfSxcbiAgbWV0YToge1xuICAgIGRvY3M6IHtcbiAgICAgIGRlc2NyaXB0aW9uOiAnRW5mb3JjZSB0aGUgQ29tbXVuaXR5IGRpcmVjdG9yeVxcJ3MgY29uc3RyYWludHMgb24gYSBwbHVnaW5cXCdzIGBtYW5pZmVzdC5qc29uYCBgZGVzY3JpcHRpb25gJ1xuICAgIH0sXG4gICAgbWVzc2FnZXM6IHtcbiAgICAgIFtNRVNTQUdFX0lEX0NPTlRBSU5TX09CU0lESUFOXTogJ1RoZSBgZGVzY3JpcHRpb25gIG11c3Qgbm90IGNvbnRhaW4gdGhlIHdvcmQgYE9ic2lkaWFuYC4gSXQgaXMgaW1wbGllZCBieSB0aGUgY29udGV4dCBvZiB0aGUgcGx1Z2luIGRpcmVjdG9yeS4nLFxuICAgICAgW01FU1NBR0VfSURfTUlTU0lOR19QRVJJT0RdOiAnVGhlIGBkZXNjcmlwdGlvbmAgbXVzdCBlbmQgd2l0aCBhIHBlcmlvZC4nLFxuICAgICAgW01FU1NBR0VfSURfTk9UX0NBUElUQUxJWkVEXTogJ1RoZSBgZGVzY3JpcHRpb25gIG11c3Qgc3RhcnQgd2l0aCBhIGNhcGl0YWwgbGV0dGVyLicsXG4gICAgICBbTUVTU0FHRV9JRF9TRUxGX1JFRkVSRU5DRV06ICdUaGUgYGRlc2NyaXB0aW9uYCBtdXN0IG5vdCByZWZlciB0byBpdHNlbGYsIGUuZy4gYHRoaXMgcGx1Z2luYCBvciBgYSBwbHVnaW4gdGhhdGAuIERlc2NyaWJlIHdoYXQgaXQgZG9lcyBpbnN0ZWFkLicsXG4gICAgICBbTUVTU0FHRV9JRF9UT09fTE9OR106ICdUaGUgYGRlc2NyaXB0aW9uYCBtdXN0IGJlIGF0IG1vc3Qge3sgbWF4TGVuZ3RoIH19IGNoYXJhY3RlcnMuJyxcbiAgICAgIFtNRVNTQUdFX0lEX1RPT19TSE9SVF06ICdUaGUgYGRlc2NyaXB0aW9uYCBpcyB0b28gc2hvcnQgdG8gc2F5IHdoYXQgdGhlIHBsdWdpbiBkb2VzLidcbiAgICB9LFxuICAgIHNjaGVtYTogW10sXG4gICAgdHlwZTogJ3Byb2JsZW0nXG4gIH1cbn07XG4iXSwKICAibWFwcGluZ3MiOiAiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtB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
@@ -0,0 +1,54 @@
1
+ /// <reference path="../../../library.d.cts" />
2
+ /**
3
+ * @file
4
+ *
5
+ * ESLint rule: manifest-description
6
+ *
7
+ * Enforces the Community directory's constraints on a plugin's `manifest.json` `description`.
8
+ *
9
+ * Two of these checks deliberately diverge from `obsidianmd/validate-manifest`:
10
+ *
11
+ * - **Self-reference, not the word `plugin`.** Upstream's `FORBIDDEN_WORDS` bans the bare substring
12
+ * `plugin` in the description, which rejects two descriptions the directory itself passed untouched -
13
+ * `Enhances Note composer core plugin.` and `...not plugin updates...` - because each names something
14
+ * other than itself. The directory's actual objection is self-reference, so only self-referential
15
+ * phrases are matched here.
16
+ * - **No character whitelist.** Upstream's format check rejects anything outside
17
+ * `[A-Za-z0-9\s.,!?'"-]`, which fails backticks, em dashes, parentheses, colons and slashes. Seven
18
+ * live listings carry those and the directory flagged none, so the check is noise rather than a gate.
19
+ *
20
+ * The no-`Obsidian` check has the opposite provenance: the directory enforces it and no Obsidian
21
+ * document states it, which is what cost a released plugin a version bump for one word.
22
+ *
23
+ * Runs on the `@eslint/json` `json/json` language; see `manifest-helpers.ts` for why the AST is Momoa
24
+ * rather than ESTree.
25
+ */
26
+ import type { Rule } from 'eslint' with { 'resolution-mode': 'import' };
27
+ /**
28
+ Message ID reported when the description contains the word `Obsidian`.
29
+ */
30
+ export declare const MESSAGE_ID_CONTAINS_OBSIDIAN = "descriptionContainsObsidian";
31
+ /**
32
+ Message ID reported when the description does not end with a period.
33
+ */
34
+ export declare const MESSAGE_ID_MISSING_PERIOD = "descriptionMissingPeriod";
35
+ /**
36
+ Message ID reported when the description does not start with a capital letter.
37
+ */
38
+ export declare const MESSAGE_ID_NOT_CAPITALIZED = "descriptionNotCapitalized";
39
+ /**
40
+ Message ID reported when the description refers to itself.
41
+ */
42
+ export declare const MESSAGE_ID_SELF_REFERENCE = "descriptionSelfReference";
43
+ /**
44
+ Message ID reported when the description is longer than the directory allows.
45
+ */
46
+ export declare const MESSAGE_ID_TOO_LONG = "descriptionTooLong";
47
+ /**
48
+ Message ID reported when the description is too short to describe anything.
49
+ */
50
+ export declare const MESSAGE_ID_TOO_SHORT = "descriptionTooShort";
51
+ /**
52
+ * ESLint rule enforcing the Community directory's constraints on a plugin's `manifest.json` `description`.
53
+ */
54
+ export declare const manifestDescription: Rule.RuleModule;
@@ -0,0 +1,217 @@
1
+ /*
2
+ THIS IS A GENERATED/BUNDLED FILE BY ESBUILD
3
+ if you want to view the source, please visit the github repository of this plugin
4
+ */
5
+
6
+ (function () {
7
+ function ensureBrowserProcess() {
8
+ const browserProcess = {
9
+ browser: true,
10
+ cwd() {
11
+ return '/';
12
+ },
13
+ env: {},
14
+ platform: 'android'
15
+ };
16
+
17
+ // eslint-disable-next-line obsidianmd/no-global-this, unicorn/no-unnecessary-global-this -- Must stay `globalThis`-qualified: in the emitted banner a bare `process` is a free identifier, so reading it where the host has none throws a ReferenceError instead of yielding `undefined`. That is the very case this function exists to handle.
18
+ const existingProcess = globalThis.process;
19
+
20
+ if (!existingProcess) {
21
+ // eslint-disable-next-line obsidianmd/no-global-this -- Actively use globalThis.
22
+ globalThis.process = browserProcess;
23
+ return;
24
+ }
25
+
26
+ if (existingProcess.versions?.node) {
27
+ return;
28
+ }
29
+
30
+ const existingProcessRecord = existingProcess;
31
+
32
+ for (const [key, value] of Object.entries(browserProcess)) {
33
+ existingProcessRecord[key] ??= value;
34
+ }
35
+
36
+ existingProcessRecord['browser'] = true;
37
+ }
38
+
39
+ function keepName($unknown) {
40
+ return $unknown;
41
+ }
42
+
43
+ (function initCjs() {
44
+ // eslint-disable-next-line obsidianmd/no-global-this -- Actively use globalThis.
45
+ const globalThisRecord = globalThis;
46
+ globalThisRecord['__name'] ??= keepName;
47
+ const originalRequire = require;
48
+ if (originalRequire && !originalRequire.__isPatched) {
49
+ // eslint-disable-next-line no-global-assign, no-implicit-globals -- We need to patch the `require()` function.
50
+ require = Object.assign(
51
+ (id) => requirePatched(id),
52
+ originalRequire,
53
+ {
54
+ __isPatched: true
55
+ }
56
+ );
57
+ }
58
+
59
+ globalThisRecord['__extractDefault'] ??= extractDefault;
60
+
61
+ ensureBrowserProcess();
62
+
63
+ function extractDefault(module) {
64
+ return module && module.__esModule && 'default' in module ? module.default : module;
65
+ }
66
+
67
+ const OBSIDIAN_BUILT_IN_MODULE_NAMES = new Set([
68
+ '@codemirror/autocomplete',
69
+ '@codemirror/collab',
70
+ '@codemirror/commands',
71
+ '@codemirror/language',
72
+ '@codemirror/lint',
73
+ '@codemirror/search',
74
+ '@codemirror/state',
75
+ '@codemirror/text',
76
+ '@codemirror/view',
77
+ '@lezer/common',
78
+ '@lezer/highlight',
79
+ '@lezer/lr',
80
+ 'obsidian']
81
+ );
82
+
83
+ const DEPRECATED_OBSIDIAN_BUILT_IN_MODULE_NAMES = new Set([
84
+ '@codemirror/closebrackets',
85
+ '@codemirror/comment',
86
+ '@codemirror/fold',
87
+ '@codemirror/gutter',
88
+ '@codemirror/highlight',
89
+ '@codemirror/history',
90
+ '@codemirror/matchbrackets',
91
+ '@codemirror/panel',
92
+ '@codemirror/rangeset',
93
+ '@codemirror/rectangular-selection',
94
+ '@codemirror/stream-parser',
95
+ '@codemirror/tooltip']
96
+ );
97
+
98
+ function requirePatched(id) {
99
+ if (OBSIDIAN_BUILT_IN_MODULE_NAMES.has(id) || DEPRECATED_OBSIDIAN_BUILT_IN_MODULE_NAMES.has(id)) {
100
+ return originalRequire?.(id);
101
+ }
102
+
103
+ // eslint-disable-next-line @typescript-eslint/no-deprecated, obsidianmd/no-global-this -- Need access to app. Actively use globalThis.
104
+ if (globalThis.app.isMobile) {
105
+ if (id === 'process' || id === 'node:process') {
106
+ // eslint-disable-next-line no-console -- Valid usage.
107
+ console.debug(`The most likely you can safely ignore this error. Module not found: ${id}. Fake process object is returned instead.`);
108
+
109
+ return process;
110
+ }
111
+ } else {
112
+ const module = originalRequire?.(id);
113
+ if (module) {
114
+ return extractDefault(module);
115
+ }
116
+ }
117
+
118
+ // eslint-disable-next-line no-console -- Valid usage.
119
+ console.debug(`The most likely you can safely ignore this error. Module not found: ${id}. Empty object is returned instead.`);
120
+ return {};
121
+ }
122
+ })();
123
+ })();
124
+
125
+ "use strict";
126
+ var __create = Object.create;
127
+ var __defProp = Object.defineProperty;
128
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
129
+ var __getOwnPropNames = Object.getOwnPropertyNames;
130
+ var __getProtoOf = Object.getPrototypeOf;
131
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
132
+ var __export = (target, all) => {
133
+ for (var name in all)
134
+ __defProp(target, name, { get: all[name], enumerable: true });
135
+ };
136
+ var __copyProps = (to, from, except, desc) => {
137
+ if (from && typeof from === "object" || typeof from === "function") {
138
+ for (let key of __getOwnPropNames(from))
139
+ if (!__hasOwnProp.call(to, key) && key !== except)
140
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
141
+ }
142
+ return to;
143
+ };
144
+ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
145
+ // If the importer is in node compatibility mode or this is not an ESM
146
+ // file that has been converted to a CommonJS file using a Babel-
147
+ // compatible transform (i.e. "__esModule" has not been set), then set
148
+ // "default" to the CommonJS "module.exports" for node compatibility.
149
+ isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
150
+ mod
151
+ ));
152
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
153
+ var manifest_helpers_exports = {};
154
+ __export(manifest_helpers_exports, {
155
+ JSON_NODE_TYPE_BOOLEAN: () => JSON_NODE_TYPE_BOOLEAN,
156
+ JSON_NODE_TYPE_OBJECT: () => JSON_NODE_TYPE_OBJECT,
157
+ JSON_NODE_TYPE_STRING: () => JSON_NODE_TYPE_STRING,
158
+ UNRELEASED_VERSION: () => UNRELEASED_VERSION,
159
+ findManifestMember: () => findManifestMember,
160
+ getManifestObject: () => getManifestObject,
161
+ getManifestStringValue: () => getManifestStringValue,
162
+ getMemberKey: () => getMemberKey,
163
+ getStringValue: () => getStringValue,
164
+ jsonPlugin: () => jsonPlugin,
165
+ toReportNode: () => toReportNode
166
+ });
167
+ module.exports = __toCommonJS(manifest_helpers_exports);
168
+ var import_json = __toESM(__extractDefault(require('@eslint/json')), 1);
169
+ const JSON_NODE_TYPE_BOOLEAN = "Boolean";
170
+ const JSON_NODE_TYPE_OBJECT = "Object";
171
+ const JSON_NODE_TYPE_STRING = "String";
172
+ const jsonPlugin = bridgeJsonPlugin();
173
+ const UNRELEASED_VERSION = "0.0.0";
174
+ function findManifestMember(manifestObject, key) {
175
+ return manifestObject.members.find((member) => getMemberKey(member) === key) ?? null;
176
+ }
177
+ function getManifestObject(node) {
178
+ const document = node;
179
+ return document.body.type === JSON_NODE_TYPE_OBJECT ? document.body : null;
180
+ }
181
+ function getManifestStringValue(manifestObject, key) {
182
+ const member = findManifestMember(manifestObject, key);
183
+ return member ? getStringValue(member.value) : null;
184
+ }
185
+ function getMemberKey(member) {
186
+ return member.name.value;
187
+ }
188
+ function getStringValue(node) {
189
+ if (node.type !== JSON_NODE_TYPE_STRING) {
190
+ return null;
191
+ }
192
+ const literal = node;
193
+ return literal.value;
194
+ }
195
+ function toReportNode(node) {
196
+ const bridged = node;
197
+ return bridged;
198
+ }
199
+ function bridgeJsonPlugin() {
200
+ const bridged = import_json.default;
201
+ return bridged;
202
+ }
203
+ // Annotate the CommonJS export names for ESM import in node:
204
+ 0 && (module.exports = {
205
+ JSON_NODE_TYPE_BOOLEAN,
206
+ JSON_NODE_TYPE_OBJECT,
207
+ JSON_NODE_TYPE_STRING,
208
+ UNRELEASED_VERSION,
209
+ findManifestMember,
210
+ getManifestObject,
211
+ getManifestStringValue,
212
+ getMemberKey,
213
+ getStringValue,
214
+ jsonPlugin,
215
+ toReportNode
216
+ });
217
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vLi4vLi4vLi4vc3JjL3NjcmlwdC11dGlscy9saW50ZXJzL2VzbGludC1ydWxlcy9tYW5pZmVzdC1oZWxwZXJzLnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyIvKipcbiAqIEBmaWxlXG4gKlxuICogU2hhcmVkIGhlbHBlcnMgZm9yIHRoZSBgbWFuaWZlc3QuanNvbmAgRVNMaW50IHJ1bGVzLlxuICpcbiAqIFRoZSBtYW5pZmVzdCBpcyBsaW50ZWQgdGhyb3VnaCBgQGVzbGludC9qc29uYCdzIGBqc29uL2pzb25gIGxhbmd1YWdlLCB3aG9zZSBBU1QgaXMgTW9tb2FcbiAqIChgRG9jdW1lbnRgIC0+IGBPYmplY3RgIC0+IGBNZW1iZXJgKSByYXRoZXIgdGhhbiBFU1RyZWUsIHNvIHRoZXNlIHJ1bGVzIHZpc2l0IGBEb2N1bWVudGAgaW5zdGVhZCBvZlxuICogYFByb2dyYW1gLiBUaGF0IGRpZmZlcmVuY2UgaXMgZXhhY3RseSB3aHkgYG9ic2lkaWFubWQvdmFsaWRhdGUtbWFuaWZlc3RgIGNhbiBuZXZlciBmaXJlOiBpdCByZWdpc3RlcnMgYVxuICogYFByb2dyYW1gIHZpc2l0b3IgYW5kIGV4cGVjdHMgYW4gRVNUcmVlIGBPYmplY3RFeHByZXNzaW9uYCwgd2hpY2ggbm8gc2hpcHBlZCBKU09OIHBhcnNlciBwcm9kdWNlcy5cbiAqXG4gKiBUaGUgTW9tb2Egbm9kZSBzaGFwZXMgYXJlIGRlY2xhcmVkIHN0cnVjdHVyYWxseSBoZXJlIHJhdGhlciB0aGFuIGltcG9ydGVkIGZyb20gYEBodW1hbndob2NvZGVzL21vbW9hYCxcbiAqIHdoaWNoIGlzIG9ubHkgYSB0cmFuc2l0aXZlIGRlcGVuZGVuY3kgb2YgYEBlc2xpbnQvanNvbmAuIEEgdHlwZS1vbmx5IGltcG9ydCB3b3VsZCBsZWFrIGludG8gdGhlXG4gKiBwdWJsaXNoZWQgZGVjbGFyYXRpb25zIGFuZCBmb3JjZSBldmVyeSBjb25zdW1lciB0byByZXNvbHZlIGEgcGFja2FnZSBpdCBuZXZlciBpbnN0YWxsZWQuXG4gKi9cblxuaW1wb3J0IHR5cGUge1xuICBFU0xpbnQsXG4gIFJ1bGVcbn0gZnJvbSAnZXNsaW50JztcblxuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGltcG9ydC14L25vLXJlbmFtZS1kZWZhdWx0IC0tIFRoZSBkZWZhdWx0IGV4cG9ydCBuYW1lIGBwbHVnaW5gIGlzIHRvbyBjb25mdXNpbmcuXG5pbXBvcnQganNvbiBmcm9tICdAZXNsaW50L2pzb24nO1xuXG4vKipcbiAqIFRoZSBNb21vYSBub2RlIHR5cGUgb2YgYSBKU09OIGJvb2xlYW4gdmFsdWUuXG4gKi9cbmV4cG9ydCBjb25zdCBKU09OX05PREVfVFlQRV9CT09MRUFOID0gJ0Jvb2xlYW4nO1xuXG4vKipcbiAqIFRoZSBNb21vYSBub2RlIHR5cGUgb2YgYSBKU09OIG9iamVjdCB2YWx1ZS5cbiAqL1xuZXhwb3J0IGNvbnN0IEpTT05fTk9ERV9UWVBFX09CSkVDVCA9ICdPYmplY3QnO1xuXG4vKipcbiAqIFRoZSBNb21vYSBub2RlIHR5cGUgb2YgYSBKU09OIHN0cmluZyB2YWx1ZS5cbiAqL1xuZXhwb3J0IGNvbnN0IEpTT05fTk9ERV9UWVBFX1NUUklORyA9ICdTdHJpbmcnO1xuXG4vKipcbiAqIGBAZXNsaW50L2pzb25gLCB0eXBlZCBhcyB0aGUgcGx1Z2luIHR5cGUgYSBmbGF0IGNvbmZpZyBhbmQgYFJ1bGVUZXN0ZXJgIGFyZSB3cml0dGVuIGFnYWluc3QuXG4gKlxuICogVGhlIHBhY2thZ2UncyBydWxlIGRlZmluaXRpb25zIGFyZSBnZW5lcmljIG92ZXIgaXRzIG93biBKU09OIGxhbmd1YWdlLCB3aGljaCBgQHR5cGVzL2VzbGludGAnc1xuICogYEVTTGludC5QbHVnaW5gIC0gd3JpdHRlbiBhZ2FpbnN0IEVTVHJlZSBydWxlcyAtIGNhbm5vdCBleHByZXNzLCBzbyB0aGUgdHdvIGFyZSBub21pbmFsbHkgaW5jb21wYXRpYmxlXG4gKiB3aGlsZSBiZWluZyBleGFjdGx5IGNvbXBhdGlibGUgYXQgcnVudGltZS4gUmVnaXN0ZXJpbmcgaXQgaXMgd2hhdCBtYWtlcyBgbGFuZ3VhZ2U6ICdqc29uL2pzb24nYFxuICogcmVzb2x2YWJsZSwgc28gdGhlcmUgaXMgbm8gd2F5IHRvIGF2b2lkIHRoZSBicmlkZ2UuXG4gKi9cbmV4cG9ydCBjb25zdCBqc29uUGx1Z2luOiBFU0xpbnQuUGx1Z2luID0gYnJpZGdlSnNvblBsdWdpbigpO1xuXG4vKipcbiAqIFRoZSBgdmVyc2lvbmAgYSBwbHVnaW4gcmVwbyBjYXJyaWVzIGJlZm9yZSBpdHMgZmlyc3QgcmVsZWFzZSwgd2hlbiBgbWluQXBwVmVyc2lvbmAgaXMgbGVnaXRpbWF0ZWx5IGFic2VudC5cbiAqL1xuZXhwb3J0IGNvbnN0IFVOUkVMRUFTRURfVkVSU0lPTiA9ICcwLjAuMCc7XG5cbi8qKlxuICogVGhlIHJvb3Qgbm9kZSBvZiBhIHBhcnNlZCBKU09OIGRvY3VtZW50LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEpzb25Eb2N1bWVudE5vZGUgZXh0ZW5kcyBKc29uTm9kZSB7XG4gIC8qKlxuICAgKiBUaGUgZG9jdW1lbnQncyBzaW5nbGUgdG9wLWxldmVsIHZhbHVlLlxuICAgKi9cbiAgcmVhZG9ubHkgYm9keTogSnNvbk5vZGU7XG59XG5cbi8qKlxuICogQSBKU09OIGxpdGVyYWwgLSBhIHN0cmluZywgbnVtYmVyLCBib29sZWFuIG9yIG51bGwuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSnNvbkxpdGVyYWxOb2RlIGV4dGVuZHMgSnNvbk5vZGUge1xuICAvKipcbiAgICogVGhlIGxpdGVyYWwncyBwYXJzZWQgdmFsdWUuXG4gICAqL1xuICByZWFkb25seSB2YWx1ZTogYm9vbGVhbiB8IG51bGwgfCBudW1iZXIgfCBzdHJpbmc7XG59XG5cbi8qKlxuICogQSBzaW5nbGUgYFwia2V5XCI6IHZhbHVlYCBwYWlyIG9mIGEgSlNPTiBvYmplY3QuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSnNvbk1lbWJlck5vZGUgZXh0ZW5kcyBKc29uTm9kZSB7XG4gIC8qKlxuICAgKiBUaGUgbWVtYmVyJ3Mga2V5LlxuICAgKi9cbiAgcmVhZG9ubHkgbmFtZTogSnNvbkxpdGVyYWxOb2RlO1xuXG4gIC8qKlxuICAgKiBUaGUgbWVtYmVyJ3MgdmFsdWUuXG4gICAqL1xuICByZWFkb25seSB2YWx1ZTogSnNvbk5vZGU7XG59XG5cbi8qKlxuICogQW55IG5vZGUgb2YgdGhlIE1vbW9hIEpTT04gQVNULlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEpzb25Ob2RlIHtcbiAgLyoqXG4gICAqIFRoZSBub2RlIHR5cGUsIGUuZy4gYERvY3VtZW50YCwgYE9iamVjdGAsIGBNZW1iZXJgLCBgU3RyaW5nYC5cbiAgICovXG4gIHJlYWRvbmx5IHR5cGU6IHN0cmluZztcbn1cblxuLyoqXG4gKiBBIEpTT04gb2JqZWN0IHZhbHVlLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEpzb25PYmplY3ROb2RlIGV4dGVuZHMgSnNvbk5vZGUge1xuICAvKipcbiAgICogVGhlIG9iamVjdCdzIG1lbWJlcnMsIGluIHNvdXJjZSBvcmRlciwgaW5jbHVkaW5nIGFueSBkdXBsaWNhdGUga2V5cy5cbiAgICovXG4gIHJlYWRvbmx5IG1lbWJlcnM6IHJlYWRvbmx5IEpzb25NZW1iZXJOb2RlW107XG59XG5cbi8qKlxuICogRmluZHMgYSB0b3AtbGV2ZWwgbWVtYmVyIG9mIHRoZSBtYW5pZmVzdCBieSBrZXkuXG4gKlxuICogQHBhcmFtIG1hbmlmZXN0T2JqZWN0IC0gVGhlIG1hbmlmZXN0J3Mgcm9vdCBvYmplY3Qgbm9kZS5cbiAqIEBwYXJhbSBrZXkgLSBUaGUga2V5IHRvIGxvb2sgZm9yLlxuICogQHJldHVybnMgVGhlIGZpcnN0IG1lbWJlciB3aXRoIHRoYXQga2V5LCBvciBgbnVsbGAgd2hlbiB0aGUgbWFuaWZlc3QgaGFzIG5vbmUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBmaW5kTWFuaWZlc3RNZW1iZXIobWFuaWZlc3RPYmplY3Q6IEpzb25PYmplY3ROb2RlLCBrZXk6IHN0cmluZyk6IEpzb25NZW1iZXJOb2RlIHwgbnVsbCB7XG4gIHJldHVybiBtYW5pZmVzdE9iamVjdC5tZW1iZXJzLmZpbmQoKG1lbWJlcikgPT4gZ2V0TWVtYmVyS2V5KG1lbWJlcikgPT09IGtleSkgPz8gbnVsbDtcbn1cblxuLyoqXG4gKiBSZWFkcyB0aGUgbWFuaWZlc3QncyByb290IG9iamVjdCBvdXQgb2YgdGhlIHZpc2l0ZWQgYERvY3VtZW50YCBub2RlLlxuICpcbiAqIEBwYXJhbSBub2RlIC0gVGhlIGBEb2N1bWVudGAgbm9kZSBoYW5kZWQgdG8gdGhlIHJ1bGUncyB2aXNpdG9yLlxuICogQHJldHVybnMgVGhlIHJvb3Qgb2JqZWN0IG5vZGUsIG9yIGBudWxsYCB3aGVuIHRoZSBkb2N1bWVudCdzIHRvcC1sZXZlbCB2YWx1ZSBpcyBub3QgYW4gb2JqZWN0LlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0TWFuaWZlc3RPYmplY3Qobm9kZTogdW5rbm93bik6IEpzb25PYmplY3ROb2RlIHwgbnVsbCB7XG4gIGNvbnN0IGRvY3VtZW50ID0gbm9kZSBhcyBKc29uRG9jdW1lbnROb2RlO1xuICByZXR1cm4gZG9jdW1lbnQuYm9keS50eXBlID09PSBKU09OX05PREVfVFlQRV9PQkpFQ1QgPyBkb2N1bWVudC5ib2R5IGFzIEpzb25PYmplY3ROb2RlIDogbnVsbDtcbn1cblxuLyoqXG4gKiBSZWFkcyB0aGUgdmFsdWUgb2YgYSB0b3AtbGV2ZWwgc3RyaW5nIG1lbWJlciBvZiB0aGUgbWFuaWZlc3QuXG4gKlxuICogQHBhcmFtIG1hbmlmZXN0T2JqZWN0IC0gVGhlIG1hbmlmZXN0J3Mgcm9vdCBvYmplY3Qgbm9kZS5cbiAqIEBwYXJhbSBrZXkgLSBUaGUga2V5IHRvIGxvb2sgZm9yLlxuICogQHJldHVybnMgVGhlIG1lbWJlcidzIHZhbHVlLCBvciBgbnVsbGAgd2hlbiBpdCBpcyBhYnNlbnQgb3Igbm90IGEgc3RyaW5nLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0TWFuaWZlc3RTdHJpbmdWYWx1ZShtYW5pZmVzdE9iamVjdDogSnNvbk9iamVjdE5vZGUsIGtleTogc3RyaW5nKTogbnVsbCB8IHN0cmluZyB7XG4gIGNvbnN0IG1lbWJlciA9IGZpbmRNYW5pZmVzdE1lbWJlcihtYW5pZmVzdE9iamVjdCwga2V5KTtcbiAgcmV0dXJuIG1lbWJlciA/IGdldFN0cmluZ1ZhbHVlKG1lbWJlci52YWx1ZSkgOiBudWxsO1xufVxuXG4vKipcbiAqIFJlYWRzIGEgbWVtYmVyJ3Mga2V5LlxuICpcbiAqIFVuZGVyIHRoZSBganNvbi9qc29uYCBsYW5ndWFnZSBhIG1lbWJlcidzIG5hbWUgaXMgYWx3YXlzIGEgc3RyaW5nIG5vZGUgLSBpZGVudGlmaWVyIGtleXMgZXhpc3Qgb25seSBpblxuICogSlNPTjUgLSBzbyB0aGlzIG5ldmVyIGhhcyB0byBhY2NvdW50IGZvciBhIG1pc3Npbmcga2V5LlxuICpcbiAqIEBwYXJhbSBtZW1iZXIgLSBUaGUgbWVtYmVyIHRvIHJlYWQuXG4gKiBAcmV0dXJucyBUaGUgbWVtYmVyJ3Mga2V5LlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0TWVtYmVyS2V5KG1lbWJlcjogSnNvbk1lbWJlck5vZGUpOiBzdHJpbmcge1xuICByZXR1cm4gbWVtYmVyLm5hbWUudmFsdWUgYXMgc3RyaW5nO1xufVxuXG4vKipcbiAqIFJlYWRzIHRoZSB2YWx1ZSBvZiBhIE1vbW9hIHN0cmluZyBub2RlLlxuICpcbiAqIEBwYXJhbSBub2RlIC0gVGhlIG5vZGUgdG8gcmVhZC5cbiAqIEByZXR1cm5zIFRoZSBzdHJpbmcgdmFsdWUsIG9yIGBudWxsYCB3aGVuIHRoZSBub2RlIGlzIG5vdCBhIHN0cmluZy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldFN0cmluZ1ZhbHVlKG5vZGU6IEpzb25Ob2RlKTogbnVsbCB8IHN0cmluZyB7XG4gIGlmIChub2RlLnR5cGUgIT09IEpTT05fTk9ERV9UWVBFX1NUUklORykge1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgY29uc3QgbGl0ZXJhbCA9IG5vZGUgYXMgSnNvbkxpdGVyYWxOb2RlO1xuICByZXR1cm4gbGl0ZXJhbC52YWx1ZSBhcyBzdHJpbmc7XG59XG5cbi8qKlxuICogQnJpZGdlcyBhIE1vbW9hIG5vZGUgdG8gdGhlIG5vZGUgdHlwZSBgY29udGV4dC5yZXBvcnQoKWAgaXMgdHlwZWQgYWdhaW5zdC5cbiAqXG4gKiBUaGUgdHdvIGFyZSBzdHJ1Y3R1cmFsbHkgaW5jb21wYXRpYmxlIC0gRVNMaW50J3MgcnVsZSB0eXBlcyBkZXNjcmliZSBFU1RyZWUgLSBidXQgdGhlIGBqc29uL2pzb25gXG4gKiBsYW5ndWFnZSdzIHNvdXJjZSBjb2RlIGFkYXB0ZXIgcmVzb2x2ZXMgYSBNb21vYSBub2RlJ3MgcG9zaXRpb24gYXQgcmVwb3J0IHRpbWUsIHNvIHRoZXkgYXJlIGNvbXBhdGlibGVcbiAqIGF0IHJ1bnRpbWUuIFRoaXMgbWlycm9ycyB0aGUgYnJpZGdlIGBydWxlLXRlc3Rlci1oZWxwZXIudHNgIG1ha2VzIG92ZXIgdGhlIHNhbWUga2luZCBvZiB0eXBlLWxldmVsIGdhcC5cbiAqXG4gKiBAcGFyYW0gbm9kZSAtIFRoZSBNb21vYSBub2RlIHRvIHJlcG9ydCBvbi5cbiAqIEByZXR1cm5zIFRoZSBzYW1lIG5vZGUsIHR5cGVkIGZvciBgY29udGV4dC5yZXBvcnQoKWAuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB0b1JlcG9ydE5vZGUobm9kZTogdW5rbm93bik6IFJ1bGUuTm9kZSB7XG4gIGNvbnN0IGJyaWRnZWQ6IHVua25vd24gPSBub2RlO1xuICByZXR1cm4gYnJpZGdlZCBhcyBSdWxlLk5vZGU7XG59XG5cbi8qKlxuICogQ2FzdHMgYEBlc2xpbnQvanNvbmAgdG8gdGhlIHBsdWdpbiB0eXBlIGBAdHlwZXMvZXNsaW50YCBkZWNsYXJlcy5cbiAqXG4gKiBAcmV0dXJucyBUaGUgYEBlc2xpbnQvanNvbmAgcGx1Z2luLCB0eXBlZCBmb3IgYSBmbGF0IGNvbmZpZy5cbiAqL1xuZnVuY3Rpb24gYnJpZGdlSnNvblBsdWdpbigpOiBFU0xpbnQuUGx1Z2luIHtcbiAgY29uc3QgYnJpZGdlZDogdW5rbm93biA9IGpzb247XG4gIHJldHVybiBicmlkZ2VkIGFzIEVTTGludC5QbHVnaW47XG59XG4iXSwKICAibWFwcGluZ3MiOiAiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQXFCQSxrQkFBaUI7QUFLVixNQUFNLHlCQUF5QjtBQUsvQixNQUFNLHdCQUF3QjtBQUs5QixNQUFNLHdCQUF3QjtBQVU5QixNQUFNLGFBQTRCLGlCQUFpQjtBQUtuRCxNQUFNLHFCQUFxQjtBQWdFM0IsU0FBUyxtQkFBbUIsZ0JBQWdDLEtBQW9DO0FBQ3JHLFNBQU8sZUFBZSxRQUFRLEtBQUssQ0FBQyxXQUFXLGFBQWEsTUFBTSxNQUFNLEdBQUcsS0FBSztBQUNsRjtBQVFPLFNBQVMsa0JBQWtCLE1BQXNDO0FBQ3RFLFFBQU0sV0FBVztBQUNqQixTQUFPLFNBQVMsS0FBSyxTQUFTLHdCQUF3QixTQUFTLE9BQXlCO0FBQzFGO0FBU08sU0FBUyx1QkFBdUIsZ0JBQWdDLEtBQTRCO0FBQ2pHLFFBQU0sU0FBUyxtQkFBbUIsZ0JBQWdCLEdBQUc7QUFDckQsU0FBTyxTQUFTLGVBQWUsT0FBTyxLQUFLLElBQUk7QUFDakQ7QUFXTyxTQUFTLGFBQWEsUUFBZ0M7QUFDM0QsU0FBTyxPQUFPLEtBQUs7QUFDckI7QUFRTyxTQUFTLGVBQWUsTUFBK0I7QUFDNUQsTUFBSSxLQUFLLFNBQVMsdUJBQXVCO0FBQ3ZDLFdBQU87QUFBQSxFQUNUO0FBRUEsUUFBTSxVQUFVO0FBQ2hCLFNBQU8sUUFBUTtBQUNqQjtBQVlPLFNBQVMsYUFBYSxNQUEwQjtBQUNyRCxRQUFNLFVBQW1CO0FBQ3pCLFNBQU87QUFDVDtBQU9BLFNBQVMsbUJBQWtDO0FBQ3pDLFFBQU0sVUFBbUIsWUFBQUE7QUFDekIsU0FBTztBQUNUOyIsCiAgIm5hbWVzIjogWyJqc29uIl0KfQo=