@mnaoumov/obsidian-lib 10.11.0 → 10.12.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 (117) hide show
  1. package/README.md +26 -0
  2. package/components/all-windows-status-bar-item-component/package.json +6 -0
  3. package/components/shared-component-pool-component/package.json +6 -0
  4. package/components/workspace-layout-state-component/package.json +6 -0
  5. package/dist/lib/cjs/__merged.cjs +76 -1
  6. package/dist/lib/cjs/__merged.d.cts +11 -4
  7. package/dist/lib/cjs/bug-report-diagnostics.cjs +222 -0
  8. package/dist/lib/cjs/bug-report-diagnostics.d.cts +186 -0
  9. package/dist/lib/cjs/bug-report.cjs +36 -10
  10. package/dist/lib/cjs/bug-report.d.cts +65 -0
  11. package/dist/lib/cjs/command-handlers/open-bug-report-command-handler.cjs +93 -2
  12. package/dist/lib/cjs/command-handlers/open-bug-report-command-handler.d.cts +34 -2
  13. package/dist/lib/cjs/components/all-windows-status-bar-item-component.cjs +245 -0
  14. package/dist/lib/cjs/components/all-windows-status-bar-item-component.d.cts +146 -0
  15. package/dist/lib/cjs/components/embed-extensions-component.cjs +20 -3
  16. package/dist/lib/cjs/components/embed-extensions-component.d.cts +8 -0
  17. package/dist/lib/cjs/components/embeddable-markdown-editor-component.cjs +16 -2
  18. package/dist/lib/cjs/components/embeddable-markdown-editor-component.d.cts +9 -0
  19. package/dist/lib/cjs/components/index.cjs +12 -3
  20. package/dist/lib/cjs/components/index.d.cts +3 -0
  21. package/dist/lib/cjs/components/plugin-gate-component.cjs +2 -9
  22. package/dist/lib/cjs/components/plugin-settings-component.cjs +7 -2
  23. package/dist/lib/cjs/components/shared-component-pool-component.cjs +368 -0
  24. package/dist/lib/cjs/components/shared-component-pool-component.d.cts +129 -0
  25. package/dist/lib/cjs/components/workspace-layout-state-component.cjs +495 -0
  26. package/dist/lib/cjs/components/workspace-layout-state-component.d.cts +239 -0
  27. package/dist/lib/cjs/css-class.cjs +5 -1
  28. package/dist/lib/cjs/css-class.d.cts +16 -0
  29. package/dist/lib/cjs/data-handler.cjs +156 -5
  30. package/dist/lib/cjs/data-handler.d.cts +128 -2
  31. package/dist/lib/cjs/desktop-git-runner.cjs +4 -14
  32. package/dist/lib/cjs/desktop-git-runner.d.cts +8 -2
  33. package/dist/lib/cjs/generated-during-build.cjs +2 -2
  34. package/dist/lib/cjs/git-rename-history.cjs +1 -1
  35. package/dist/lib/cjs/git-rename-history.d.cts +2 -2
  36. package/dist/lib/cjs/i18n/locales/en.cjs +23 -1
  37. package/dist/lib/cjs/i18n/locales/en.d.cts +22 -0
  38. package/dist/lib/cjs/i18n/locales/translations-map.d.cts +22 -0
  39. package/dist/lib/cjs/index.cjs +4 -1
  40. package/dist/lib/cjs/index.d.cts +1 -0
  41. package/dist/lib/cjs/markdown-view.cjs +191 -3
  42. package/dist/lib/cjs/markdown-view.d.cts +48 -1
  43. package/dist/lib/cjs/modals/copy-text-manually.cjs +181 -0
  44. package/dist/lib/cjs/modals/copy-text-manually.d.cts +38 -0
  45. package/dist/lib/cjs/modals/index.cjs +7 -1
  46. package/dist/lib/cjs/modals/index.d.cts +2 -0
  47. package/dist/lib/cjs/modals/review-bug-report-diagnostics.cjs +202 -0
  48. package/dist/lib/cjs/modals/review-bug-report-diagnostics.d.cts +30 -0
  49. package/dist/lib/cjs/plugin/index.cjs +4 -1
  50. package/dist/lib/cjs/plugin/index.d.cts +1 -0
  51. package/dist/lib/cjs/plugin/plugin-api.cjs +13 -4
  52. package/dist/lib/cjs/plugin/plugin-api.d.cts +5 -1
  53. package/dist/lib/cjs/plugin/plugin-install-state.cjs +46 -1
  54. package/dist/lib/cjs/plugin/plugin-install-state.d.cts +30 -0
  55. package/dist/lib/cjs/plugin/plugin-instance.cjs +448 -0
  56. package/dist/lib/cjs/plugin/plugin-instance.d.cts +251 -0
  57. package/dist/lib/cjs/plugin/plugin.cjs +16 -1
  58. package/dist/lib/cjs/plugin/plugin.d.cts +7 -0
  59. package/dist/lib/esm/__merged.d.mts +11 -4
  60. package/dist/lib/esm/__merged.mjs +83 -3
  61. package/dist/lib/esm/bug-report-diagnostics.d.mts +186 -0
  62. package/dist/lib/esm/bug-report-diagnostics.mjs +127 -0
  63. package/dist/lib/esm/bug-report.d.mts +65 -0
  64. package/dist/lib/esm/bug-report.mjs +33 -10
  65. package/dist/lib/esm/command-handlers/open-bug-report-command-handler.d.mts +34 -2
  66. package/dist/lib/esm/command-handlers/open-bug-report-command-handler.mjs +99 -3
  67. package/dist/lib/esm/components/all-windows-status-bar-item-component.d.mts +146 -0
  68. package/dist/lib/esm/components/all-windows-status-bar-item-component.mjs +154 -0
  69. package/dist/lib/esm/components/embed-extensions-component.d.mts +8 -0
  70. package/dist/lib/esm/components/embed-extensions-component.mjs +20 -3
  71. package/dist/lib/esm/components/embeddable-markdown-editor-component.d.mts +9 -0
  72. package/dist/lib/esm/components/embeddable-markdown-editor-component.mjs +16 -2
  73. package/dist/lib/esm/components/index.d.mts +3 -0
  74. package/dist/lib/esm/components/index.mjs +8 -2
  75. package/dist/lib/esm/components/plugin-gate-component.mjs +5 -13
  76. package/dist/lib/esm/components/plugin-settings-component.mjs +7 -2
  77. package/dist/lib/esm/components/shared-component-pool-component.d.mts +129 -0
  78. package/dist/lib/esm/components/shared-component-pool-component.mjs +280 -0
  79. package/dist/lib/esm/components/workspace-layout-state-component.d.mts +239 -0
  80. package/dist/lib/esm/components/workspace-layout-state-component.mjs +404 -0
  81. package/dist/lib/esm/css-class.d.mts +16 -0
  82. package/dist/lib/esm/css-class.mjs +5 -1
  83. package/dist/lib/esm/data-handler.d.mts +128 -2
  84. package/dist/lib/esm/data-handler.mjs +152 -4
  85. package/dist/lib/esm/desktop-git-runner.d.mts +8 -2
  86. package/dist/lib/esm/desktop-git-runner.mjs +3 -3
  87. package/dist/lib/esm/generated-during-build.mjs +2 -2
  88. package/dist/lib/esm/git-rename-history.d.mts +2 -2
  89. package/dist/lib/esm/git-rename-history.mjs +1 -1
  90. package/dist/lib/esm/i18n/locales/en.d.mts +22 -0
  91. package/dist/lib/esm/i18n/locales/en.mjs +23 -1
  92. package/dist/lib/esm/i18n/locales/translations-map.d.mts +22 -0
  93. package/dist/lib/esm/index.d.mts +1 -0
  94. package/dist/lib/esm/index.mjs +3 -1
  95. package/dist/lib/esm/markdown-view.d.mts +48 -1
  96. package/dist/lib/esm/markdown-view.mjs +192 -2
  97. package/dist/lib/esm/modals/copy-text-manually.d.mts +38 -0
  98. package/dist/lib/esm/modals/copy-text-manually.mjs +99 -0
  99. package/dist/lib/esm/modals/index.d.mts +2 -0
  100. package/dist/lib/esm/modals/index.mjs +5 -1
  101. package/dist/lib/esm/modals/review-bug-report-diagnostics.d.mts +30 -0
  102. package/dist/lib/esm/modals/review-bug-report-diagnostics.mjs +120 -0
  103. package/dist/lib/esm/plugin/index.d.mts +1 -0
  104. package/dist/lib/esm/plugin/index.mjs +3 -1
  105. package/dist/lib/esm/plugin/plugin-api.d.mts +5 -1
  106. package/dist/lib/esm/plugin/plugin-api.mjs +13 -4
  107. package/dist/lib/esm/plugin/plugin-install-state.d.mts +30 -0
  108. package/dist/lib/esm/plugin/plugin-install-state.mjs +44 -1
  109. package/dist/lib/esm/plugin/plugin-instance.d.mts +251 -0
  110. package/dist/lib/esm/plugin/plugin-instance.mjs +366 -0
  111. package/dist/lib/esm/plugin/plugin.d.mts +7 -0
  112. package/dist/lib/esm/plugin/plugin.mjs +16 -1
  113. package/dist/styles.css +16 -1
  114. package/modals/copy-text-manually/package.json +6 -0
  115. package/modals/review-bug-report-diagnostics/package.json +6 -0
  116. package/package.json +2 -1
  117. package/plugin/plugin-instance/package.json +6 -0
@@ -0,0 +1,368 @@
1
+ /*
2
+ THIS IS A GENERATED/BUNDLED FILE BY ESBUILD
3
+ if you want to view the source, please visit the github repository of this plugin
4
+ */
5
+ (function () {
6
+ function ensureDisposeSymbols(symbolConstructor = Symbol) {
7
+ symbolConstructor.asyncDispose ??= symbolConstructor.for("Symbol.asyncDispose");
8
+ symbolConstructor.dispose ??= symbolConstructor.for("Symbol.dispose");
9
+ }
10
+
11
+ function ensureBrowserProcess() {
12
+ const browserProcess = {
13
+ browser: true,
14
+ cwd() {
15
+ return "/";
16
+ },
17
+ env: {},
18
+ platform: "android"
19
+ };
20
+ const existingProcess = globalThis.process;
21
+ if (!existingProcess) {
22
+ globalThis.process = browserProcess;
23
+ return;
24
+ }
25
+ if (existingProcess.versions?.node) {
26
+ return;
27
+ }
28
+ const existingProcessRecord = existingProcess;
29
+ for (const [key, value] of Object.entries(browserProcess)) {
30
+ existingProcessRecord[key] ??= value;
31
+ }
32
+ existingProcessRecord["browser"] = true;
33
+ }
34
+
35
+ ensureDisposeSymbols();
36
+ ensureBrowserProcess();
37
+ })();
38
+ (function patchObsidianRequire() {
39
+ const originalRequire = require;
40
+ if (!originalRequire || originalRequire.__isPatched) {
41
+ return;
42
+ }
43
+ require = Object.assign(
44
+ (id) => requirePatched(id),
45
+ originalRequire,
46
+ {
47
+ __isPatched: true
48
+ }
49
+ );
50
+ function extractDefault($module) {
51
+ return $module && $module.__esModule && "default" in $module ? $module.default : $module;
52
+ }
53
+ const OBSIDIAN_BUILT_IN_MODULE_NAMES = /* @__PURE__ */ new Set([
54
+ "@codemirror/autocomplete",
55
+ "@codemirror/collab",
56
+ "@codemirror/commands",
57
+ "@codemirror/language",
58
+ "@codemirror/lint",
59
+ "@codemirror/search",
60
+ "@codemirror/state",
61
+ "@codemirror/text",
62
+ "@codemirror/view",
63
+ "@lezer/common",
64
+ "@lezer/highlight",
65
+ "@lezer/lr",
66
+ "obsidian"
67
+ ]);
68
+ const DEPRECATED_OBSIDIAN_BUILT_IN_MODULE_NAMES = /* @__PURE__ */ new Set([
69
+ "@codemirror/closebrackets",
70
+ "@codemirror/comment",
71
+ "@codemirror/fold",
72
+ "@codemirror/gutter",
73
+ "@codemirror/highlight",
74
+ "@codemirror/history",
75
+ "@codemirror/matchbrackets",
76
+ "@codemirror/panel",
77
+ "@codemirror/rangeset",
78
+ "@codemirror/rectangular-selection",
79
+ "@codemirror/stream-parser",
80
+ "@codemirror/tooltip"
81
+ ]);
82
+ function requirePatched(id) {
83
+ if (OBSIDIAN_BUILT_IN_MODULE_NAMES.has(id) || DEPRECATED_OBSIDIAN_BUILT_IN_MODULE_NAMES.has(id)) {
84
+ return originalRequire?.(id);
85
+ }
86
+ const app = globalThis.app;
87
+ if (app?.isMobile) {
88
+ if (id === "process" || id === "node:process") {
89
+ console.debug(`The most likely you can safely ignore this error. Module not found: ${id}. Fake process object is returned instead.`);
90
+ return process;
91
+ }
92
+ } else {
93
+ const $module = originalRequire?.(id);
94
+ if ($module) {
95
+ return extractDefault($module);
96
+ }
97
+ }
98
+ console.debug(`The most likely you can safely ignore this error. Module not found: ${id}. Empty object is returned instead.`);
99
+ return {};
100
+ }
101
+ })();
102
+
103
+ "use strict";
104
+ var __defProp = Object.defineProperty;
105
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
106
+ var __getOwnPropNames = Object.getOwnPropertyNames;
107
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
108
+ var __knownSymbol = (name, symbol) => (symbol = Symbol[name]) ? symbol : /* @__PURE__ */ Symbol.for("Symbol." + name);
109
+ var __typeError = (msg) => {
110
+ throw TypeError(msg);
111
+ };
112
+ var __export = (target, all) => {
113
+ for (var name in all)
114
+ __defProp(target, name, { get: all[name], enumerable: true });
115
+ };
116
+ var __copyProps = (to, from, except, desc) => {
117
+ if (from && typeof from === "object" || typeof from === "function") {
118
+ for (let key of __getOwnPropNames(from))
119
+ if (!__hasOwnProp.call(to, key) && key !== except)
120
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
121
+ }
122
+ return to;
123
+ };
124
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
125
+ var __using = (stack, value, async) => {
126
+ if (value != null) {
127
+ if (typeof value !== "object" && typeof value !== "function") __typeError("Object expected");
128
+ var dispose, inner;
129
+ if (async) dispose = value[__knownSymbol("asyncDispose")];
130
+ if (dispose === void 0) {
131
+ dispose = value[__knownSymbol("dispose")];
132
+ if (async) inner = dispose;
133
+ }
134
+ if (typeof dispose !== "function") __typeError("Object not disposable");
135
+ if (inner) dispose = function() {
136
+ try {
137
+ inner.call(this);
138
+ } catch (e) {
139
+ return Promise.reject(e);
140
+ }
141
+ };
142
+ stack.push([async, dispose, value]);
143
+ } else if (async) {
144
+ stack.push([async]);
145
+ }
146
+ return value;
147
+ };
148
+ var __callDispose = (stack, error, hasError) => {
149
+ var E = typeof SuppressedError === "function" ? SuppressedError : function(e, s, m, _) {
150
+ return _ = Error(m), _.name = "SuppressedError", _.error = e, _.suppressed = s, _;
151
+ };
152
+ var fail = (e) => error = hasError ? new E(e, error, "An error was suppressed during disposal") : (hasError = true, e);
153
+ var next = (it) => {
154
+ while (it = stack.pop()) {
155
+ try {
156
+ var result = it[1] && it[1].call(it[2]);
157
+ if (it[0]) return Promise.resolve(result).then(next, (e) => (fail(e), next()));
158
+ } catch (e) {
159
+ fail(e);
160
+ }
161
+ }
162
+ if (hasError) throw error;
163
+ };
164
+ return next();
165
+ };
166
+ var shared_component_pool_component_exports = {};
167
+ __export(shared_component_pool_component_exports, {
168
+ SharedComponentPoolComponent: () => SharedComponentPoolComponent
169
+ });
170
+ module.exports = __toCommonJS(shared_component_pool_component_exports);
171
+ var import_abort_controller = require('@mnaoumov/typescript-lib/abort-controller');
172
+ var import_array = require('@mnaoumov/typescript-lib/array');
173
+ var import_error = require('@mnaoumov/typescript-lib/error');
174
+ var import_function = require('@mnaoumov/typescript-lib/function');
175
+ var import_obsidian = require('obsidian');
176
+ var import_component_ex = require('./component-ex.cjs');
177
+ class SharedComponentAcquisitionImpl {
178
+ constructor(component, onRelease) {
179
+ this.component = component;
180
+ this.onRelease = onRelease;
181
+ }
182
+ component;
183
+ onRelease;
184
+ get isReleased() {
185
+ return this._isReleased;
186
+ }
187
+ _isReleased = false;
188
+ unlinkConsumer = null;
189
+ dispose() {
190
+ this.release();
191
+ }
192
+ linkConsumer(consumer) {
193
+ const consumerLink = new import_obsidian.Component();
194
+ consumerLink.register(() => {
195
+ this.unlinkConsumer = null;
196
+ this.release();
197
+ });
198
+ consumer.addChild(consumerLink);
199
+ this.unlinkConsumer = () => {
200
+ consumer.removeChild(consumerLink);
201
+ };
202
+ }
203
+ release() {
204
+ if (this._isReleased) {
205
+ return;
206
+ }
207
+ this._isReleased = true;
208
+ const unlinkConsumer = this.unlinkConsumer;
209
+ this.unlinkConsumer = null;
210
+ unlinkConsumer?.();
211
+ this.onRelease();
212
+ }
213
+ [Symbol.dispose]() {
214
+ this.release();
215
+ }
216
+ }
217
+ class SharedComponentPoolComponent extends import_component_ex.ComponentEx {
218
+ /**
219
+ * Creates the component shared under a key; see {@link SharedComponentPoolComponentConstructorParams.createComponent}.
220
+ */
221
+ createComponent;
222
+ creatingKeys = /* @__PURE__ */ new Set();
223
+ entries = /* @__PURE__ */ new Map();
224
+ /**
225
+ * Creates a new pool.
226
+ *
227
+ * @param params - The pool parameters.
228
+ */
229
+ constructor(params) {
230
+ super();
231
+ this.createComponent = params.createComponent;
232
+ }
233
+ /**
234
+ * Acquires the component shared under a key, creating and loading it when the key has no consumer yet.
235
+ *
236
+ * @param key - The resource key.
237
+ * @param options - The acquisition options.
238
+ * @returns The acquisition, once the shared component has loaded.
239
+ * @throws An {@link Error} when the pool was never loaded, when the factory or the load fails, or when called for a
240
+ * key from inside that key's own factory or synchronous load; a {@link SilentError} when the pool is unloaded, or
241
+ * when the consumer unloads or the acquisition is released before the load completes; the abort reason when
242
+ * `abortSignal` aborts first.
243
+ */
244
+ async acquire(key, options = {}) {
245
+ var _stack = [];
246
+ try {
247
+ this.ensureLoaded();
248
+ options.abortSignal?.throwIfAborted();
249
+ if (this.creatingKeys.has(key)) {
250
+ throw new Error("A shared component cannot be acquired from inside its own creation");
251
+ }
252
+ const entry = this.entries.get(key) ?? this.createEntry(key);
253
+ entry.consumerCount++;
254
+ const cancellation = createDeferred();
255
+ const acquisition = new SharedComponentAcquisitionImpl(entry.component, () => {
256
+ cancellation.reject(new import_error.SilentError("The shared component acquisition was released"));
257
+ this.releaseReference(entry);
258
+ });
259
+ const _abortListener = __using(_stack, options.abortSignal ? (0, import_abort_controller.onAbort)(options.abortSignal, (abortSignal) => {
260
+ cancellation.reject(abortSignal.reason);
261
+ acquisition.release();
262
+ }) : null);
263
+ try {
264
+ if (options.consumer) {
265
+ acquisition.linkConsumer(options.consumer);
266
+ }
267
+ await Promise.race([entry.ready.promise, cancellation.promise]);
268
+ } catch (error) {
269
+ acquisition.release();
270
+ throw error;
271
+ }
272
+ if (acquisition.isReleased) {
273
+ throw new import_error.SilentError("The shared component acquisition was released");
274
+ }
275
+ return acquisition;
276
+ } catch (_) {
277
+ var _error = _, _hasError = true;
278
+ } finally {
279
+ __callDispose(_stack, _error, _hasError);
280
+ }
281
+ }
282
+ /**
283
+ * Returns how many acquisitions currently hold the component shared under a key, pending ones included.
284
+ *
285
+ * @param key - The resource key.
286
+ * @returns The number of consumers, `0` when the key has no shared component.
287
+ */
288
+ getConsumerCount(key) {
289
+ return this.entries.get(key)?.consumerCount ?? 0;
290
+ }
291
+ /**
292
+ * Registers the teardown that unloads every shared component when the pool unloads.
293
+ */
294
+ onload() {
295
+ this.register(() => {
296
+ for (const entry of (0, import_array.snapshot)([...this.entries.values()])) {
297
+ this.unloadEntry(entry, new import_error.SilentError("The shared component pool is unloaded"));
298
+ }
299
+ });
300
+ }
301
+ createEntry(key) {
302
+ this.creatingKeys.add(key);
303
+ try {
304
+ const component = this.createComponent(key);
305
+ const entry = {
306
+ component,
307
+ consumerCount: 0,
308
+ isUnloaded: false,
309
+ key,
310
+ ready: createDeferred()
311
+ };
312
+ this.entries.set(key, entry);
313
+ let loadPromise = null;
314
+ try {
315
+ if (component instanceof import_component_ex.ComponentEx) {
316
+ loadPromise = component.loadWithPromises();
317
+ } else {
318
+ component.load();
319
+ }
320
+ } catch (error) {
321
+ this.unloadEntry(entry, error);
322
+ throw error;
323
+ }
324
+ if (loadPromise) {
325
+ loadPromise.then(() => {
326
+ entry.ready.resolve();
327
+ }).catch((error) => {
328
+ this.unloadEntry(entry, error);
329
+ });
330
+ } else {
331
+ entry.ready.resolve();
332
+ }
333
+ return entry;
334
+ } finally {
335
+ this.creatingKeys.delete(key);
336
+ }
337
+ }
338
+ releaseReference(entry) {
339
+ entry.consumerCount--;
340
+ if (entry.consumerCount <= 0) {
341
+ this.unloadEntry(entry, new import_error.SilentError("The last consumer released the shared component before it loaded"));
342
+ }
343
+ }
344
+ unloadEntry(entry, reason) {
345
+ if (entry.isUnloaded) {
346
+ return;
347
+ }
348
+ entry.isUnloaded = true;
349
+ this.entries.delete(entry.key);
350
+ entry.ready.reject(reason);
351
+ entry.component.unload();
352
+ }
353
+ }
354
+ function createDeferred() {
355
+ let resolve = import_function.noop;
356
+ let reject = import_function.noop;
357
+ const promise = new Promise((resolvePromise, rejectPromise) => {
358
+ resolve = resolvePromise;
359
+ reject = rejectPromise;
360
+ });
361
+ promise.catch(import_function.noop);
362
+ return { promise, reject, resolve };
363
+ }
364
+ // Annotate the CommonJS export names for ESM import in node:
365
+ 0 && (module.exports = {
366
+ SharedComponentPoolComponent
367
+ });
368
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9jb21wb25lbnRzL3NoYXJlZC1jb21wb25lbnQtcG9vbC1jb21wb25lbnQudHMiXSwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAZmlsZVxuICpcbiAqIEEgcG9vbCB0aGF0IHNoYXJlcyBvbmUgbG9hZGVkIGNvbXBvbmVudCBwZXIgY2FsbGVyLWRlZmluZWQga2V5IGFtb25nIHNldmVyYWwgY29uc3VtZXJzLCBhbmQgdW5sb2FkcyBpdCB3aGVuIHRoZVxuICogbGFzdCBjb25zdW1lciByZWxlYXNlcyBpdC5cbiAqL1xuXG5pbXBvcnQgdHlwZSB7IERpc3Bvc2FibGVFeCB9IGZyb20gJ0BtbmFvdW1vdi90eXBlc2NyaXB0LWxpYi9kaXNwb3NhYmxlJztcblxuaW1wb3J0IHsgb25BYm9ydCB9IGZyb20gJ0BtbmFvdW1vdi90eXBlc2NyaXB0LWxpYi9hYm9ydC1jb250cm9sbGVyJztcbmltcG9ydCB7IHNuYXBzaG90IH0gZnJvbSAnQG1uYW91bW92L3R5cGVzY3JpcHQtbGliL2FycmF5JztcbmltcG9ydCB7IFNpbGVudEVycm9yIH0gZnJvbSAnQG1uYW91bW92L3R5cGVzY3JpcHQtbGliL2Vycm9yJztcbmltcG9ydCB7IG5vb3AgfSBmcm9tICdAbW5hb3Vtb3YvdHlwZXNjcmlwdC1saWIvZnVuY3Rpb24nO1xuaW1wb3J0IHsgQ29tcG9uZW50IH0gZnJvbSAnb2JzaWRpYW4nO1xuXG5pbXBvcnQgeyBDb21wb25lbnRFeCB9IGZyb20gJy4vY29tcG9uZW50LWV4LnRzJztcblxuLyoqXG4gKiBPbmUgY29uc3VtZXIncyBob2xkIG9uIGEgc2hhcmVkIGNvbXBvbmVudC5cbiAqXG4gKiBSZWxlYXNpbmcgaXQgaXMgaWRlbXBvdGVudDogdGhlIGZpcnN0IGNhbGwgZHJvcHMgdGhlIGhvbGQsIGFuZCBldmVyeSBsYXRlciBjYWxsIOKAlCBpbmNsdWRpbmcgdGhlIG9uZSB0aGUgY29uc3VtZXJcbiAqIGxpbmsgbWFrZXMgd2hlbiB0aGUgY29uc3VtZXIgdW5sb2FkcyDigJQgZG9lcyBub3RoaW5nLlxuICpcbiAqIEB0eXBlUGFyYW0gVENvbXBvbmVudCAtIFRoZSB0eXBlIG9mIHRoZSBzaGFyZWQgY29tcG9uZW50LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFNoYXJlZENvbXBvbmVudEFjcXVpc2l0aW9uPFRDb21wb25lbnQgZXh0ZW5kcyBDb21wb25lbnQ+IGV4dGVuZHMgRGlzcG9zYWJsZUV4IHtcbiAgLyoqXG4gICAqIFRoZSBzaGFyZWQgY29tcG9uZW50LCBsb2FkZWQuIEV2ZXJ5IGNvbnN1bWVyIG9mIHRoZSBzYW1lIGtleSByZWNlaXZlcyB0aGUgc2FtZSBpbnN0YW5jZS5cbiAgICovXG4gIHJlYWRvbmx5IGNvbXBvbmVudDogVENvbXBvbmVudDtcblxuICAvKipcbiAgICogV2hldGhlciB0aGlzIGFjcXVpc2l0aW9uIGhhcyBiZWVuIHJlbGVhc2VkLlxuICAgKi9cbiAgcmVhZG9ubHkgaXNSZWxlYXNlZDogYm9vbGVhbjtcblxuICAvKipcbiAgICogUmVsZWFzZXMgdGhpcyBhY3F1aXNpdGlvbi4gVGhlIHNoYXJlZCBjb21wb25lbnQgaXMgdW5sb2FkZWQgd2hlbiBpdHMgbGFzdCBhY3F1aXNpdGlvbiBpcyByZWxlYXNlZC5cbiAgICovXG4gIHJlYWRvbmx5IHJlbGVhc2U6ICgpID0+IHZvaWQ7XG59XG5cbi8qKlxuICogT3B0aW9ucyBvZiB7QGxpbmsgU2hhcmVkQ29tcG9uZW50UG9vbENvbXBvbmVudC5hY3F1aXJlfS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTaGFyZWRDb21wb25lbnRQb29sQ29tcG9uZW50QWNxdWlyZU9wdGlvbnMge1xuICAvKipcbiAgICogQ2FuY2VscyB0aGUgYWNxdWlzaXRpb24gd2hpbGUgdGhlIHNoYXJlZCBjb21wb25lbnQgaXMgc3RpbGwgbG9hZGluZy4gQW4gYWJvcnQgYWZ0ZXIgdGhlIGFjcXVpc2l0aW9uIHJlc29sdmVkIGRvZXNcbiAgICogbm90aGluZzsgcmVsZWFzZSB0aGUgYWNxdWlzaXRpb24gaW5zdGVhZC5cbiAgICovXG4gIHJlYWRvbmx5IGFib3J0U2lnbmFsPzogQWJvcnRTaWduYWw7XG5cbiAgLyoqXG4gICAqIEEgY29tcG9uZW50IHdob3NlIHVubG9hZCByZWxlYXNlcyB0aGUgYWNxdWlzaXRpb24gYXV0b21hdGljYWxseS5cbiAgICpcbiAgICogVGhlIGxpbmsgaXMgYSBjaGlsZCBjb21wb25lbnQgYWRkZWQgdG8gdGhlIGNvbnN1bWVyLCBzbyBpdCBmb2xsb3dzIE9ic2lkaWFuJ3Mgb3duIHJ1bGVzOiBhIGNvbnN1bWVyIHRoYXQgaXMgbm90XG4gICAqIGxvYWRlZCB5ZXQgc3RhcnRzIGhvbGRpbmcgdGhlIGxpbmsgd2hlbiBpdCBsb2FkcywgYW5kIGEge0BsaW5rIENvbXBvbmVudEV4fSBjb25zdW1lciB0aGF0IGlzIGFscmVhZHkgdW5sb2FkZWRcbiAgICogcmVmdXNlcyBpdCB3aXRoIGEge0BsaW5rIFNpbGVudEVycm9yfS4gUmVsZWFzaW5nIHRoZSBhY3F1aXNpdGlvbiBieSBoYW5kIHJlbW92ZXMgdGhlIGxpbmsgYWdhaW4sIHNvIGEgbG9uZy1saXZlZFxuICAgKiBjb25zdW1lciB0aGF0IGFjcXVpcmVzIGFuZCByZWxlYXNlcyBtYW55IHRpbWVzIGFjY3VtdWxhdGVzIG5vdGhpbmcuXG4gICAqL1xuICByZWFkb25seSBjb25zdW1lcj86IENvbXBvbmVudDtcbn1cblxuLyoqXG4gKiBQYXJhbWV0ZXJzIG9mIHtAbGluayBTaGFyZWRDb21wb25lbnRQb29sQ29tcG9uZW50fS5cbiAqXG4gKiBAdHlwZVBhcmFtIFRLZXkgLSBUaGUgdHlwZSBvZiB0aGUgcmVzb3VyY2Uga2V5LlxuICogQHR5cGVQYXJhbSBUQ29tcG9uZW50IC0gVGhlIHR5cGUgb2YgdGhlIHNoYXJlZCBjb21wb25lbnQuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU2hhcmVkQ29tcG9uZW50UG9vbENvbXBvbmVudENvbnN0cnVjdG9yUGFyYW1zPFRLZXksIFRDb21wb25lbnQgZXh0ZW5kcyBDb21wb25lbnQ+IHtcbiAgLyoqXG4gICAqIENyZWF0ZXMgdGhlIGNvbXBvbmVudCBzaGFyZWQgdW5kZXIgYSBrZXkuIENhbGxlZCBvbmNlIHBlciBrZXkgZWFjaCB0aW1lIHRoZSBrZXkgZ29lcyBmcm9tIG5vIGNvbnN1bWVyIHRvIG9uZTsgdGhlXG4gICAqIHBvb2wgbG9hZHMgdGhlIGNvbXBvbmVudCBpdHNlbGYsIHNvIHRoZSBmYWN0b3J5IG11c3QgcmV0dXJuIGl0IHVubG9hZGVkLlxuICAgKlxuICAgKiBAcGFyYW0ga2V5IC0gVGhlIHJlc291cmNlIGtleS5cbiAgICogQHJldHVybnMgVGhlIG5ldywgbm90IHlldCBsb2FkZWQgY29tcG9uZW50LlxuICAgKi9cbiAgcmVhZG9ubHkgY3JlYXRlQ29tcG9uZW50OiAoa2V5OiBUS2V5KSA9PiBUQ29tcG9uZW50O1xufVxuXG5pbnRlcmZhY2UgRGVmZXJyZWQge1xuICByZWFkb25seSBwcm9taXNlOiBQcm9taXNlPHZvaWQ+O1xuICByZWFkb25seSByZWplY3Q6IChyZWFzb246IHVua25vd24pID0+IHZvaWQ7XG4gIHJlYWRvbmx5IHJlc29sdmU6ICgpID0+IHZvaWQ7XG59XG5cbmludGVyZmFjZSBQb29sRW50cnk8VEtleSwgVENvbXBvbmVudCBleHRlbmRzIENvbXBvbmVudD4ge1xuICByZWFkb25seSBjb21wb25lbnQ6IFRDb21wb25lbnQ7XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSB0eXBlc2NyaXB0LWRldi10b29sa2l0L3JlYWRvbmx5LWludGVyZmFjZS1tZW1iZXJzIC0tIE11dGFibGUgYm9va2tlZXBpbmcgb2YgdGhlIHBvb2wuXG4gIGNvbnN1bWVyQ291bnQ6IG51bWJlcjtcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHR5cGVzY3JpcHQtZGV2LXRvb2xraXQvcmVhZG9ubHktaW50ZXJmYWNlLW1lbWJlcnMgLS0gTXV0YWJsZSBib29ra2VlcGluZyBvZiB0aGUgcG9vbC5cbiAgaXNVbmxvYWRlZDogYm9vbGVhbjtcbiAgcmVhZG9ubHkga2V5OiBUS2V5O1xuICByZWFkb25seSByZWFkeTogRGVmZXJyZWQ7XG59XG5cbmNsYXNzIFNoYXJlZENvbXBvbmVudEFjcXVpc2l0aW9uSW1wbDxUQ29tcG9uZW50IGV4dGVuZHMgQ29tcG9uZW50PiBpbXBsZW1lbnRzIFNoYXJlZENvbXBvbmVudEFjcXVpc2l0aW9uPFRDb21wb25lbnQ+IHtcbiAgcHVibGljIGdldCBpc1JlbGVhc2VkKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLl9pc1JlbGVhc2VkO1xuICB9XG5cbiAgcHJpdmF0ZSBfaXNSZWxlYXNlZCA9IGZhbHNlO1xuICBwcml2YXRlIHVubGlua0NvbnN1bWVyOiAoKCkgPT4gdm9pZCkgfCBudWxsID0gbnVsbDtcblxuICBwdWJsaWMgY29uc3RydWN0b3IocHVibGljIHJlYWRvbmx5IGNvbXBvbmVudDogVENvbXBvbmVudCwgcHJpdmF0ZSByZWFkb25seSBvblJlbGVhc2U6ICgpID0+IHZvaWQpIHt9XG5cbiAgcHVibGljIGRpc3Bvc2UoKTogdm9pZCB7XG4gICAgdGhpcy5yZWxlYXNlKCk7XG4gIH1cblxuICBwdWJsaWMgbGlua0NvbnN1bWVyKGNvbnN1bWVyOiBDb21wb25lbnQpOiB2b2lkIHtcbiAgICBjb25zdCBjb25zdW1lckxpbmsgPSBuZXcgQ29tcG9uZW50KCk7XG4gICAgY29uc3VtZXJMaW5rLnJlZ2lzdGVyKCgpID0+IHtcbiAgICAgIHRoaXMudW5saW5rQ29uc3VtZXIgPSBudWxsO1xuICAgICAgdGhpcy5yZWxlYXNlKCk7XG4gICAgfSk7XG4gICAgY29uc3VtZXIuYWRkQ2hpbGQoY29uc3VtZXJMaW5rKTtcbiAgICB0aGlzLnVubGlua0NvbnN1bWVyID0gKCk6IHZvaWQgPT4ge1xuICAgICAgY29uc3VtZXIucmVtb3ZlQ2hpbGQoY29uc3VtZXJMaW5rKTtcbiAgICB9O1xuICB9XG5cbiAgcHVibGljIHJlbGVhc2UoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuX2lzUmVsZWFzZWQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLl9pc1JlbGVhc2VkID0gdHJ1ZTtcbiAgICBjb25zdCB1bmxpbmtDb25zdW1lciA9IHRoaXMudW5saW5rQ29uc3VtZXI7XG4gICAgdGhpcy51bmxpbmtDb25zdW1lciA9IG51bGw7XG4gICAgdW5saW5rQ29uc3VtZXI/LigpO1xuICAgIHRoaXMub25SZWxlYXNlKCk7XG4gIH1cblxuICBwdWJsaWMgW1N5bWJvbC5kaXNwb3NlXSgpOiB2b2lkIHtcbiAgICB0aGlzLnJlbGVhc2UoKTtcbiAgfVxufVxuXG4vKipcbiAqIFNoYXJlcyBvbmUgbG9hZGVkIGNvbXBvbmVudCBwZXIgY2FsbGVyLWRlZmluZWQga2V5IGFtb25nIHNldmVyYWwgY29uc3VtZXJzLlxuICpcbiAqIFRoZSBmaXJzdCB7QGxpbmsgYWNxdWlyZX0gb2YgYSBrZXkgY3JlYXRlcyB0aGUgY29tcG9uZW50IHRocm91Z2ggdGhlIGZhY3RvcnkgYW5kIGxvYWRzIGl0OyBldmVyeSBmdXJ0aGVyIGFjcXVpcmUgb2ZcbiAqIHRoZSBzYW1lIGtleSwgY29uY3VycmVudCBvciBsYXRlciwgcmVjZWl2ZXMgdGhlIHNhbWUgaW5zdGFuY2U7IHRoZSByZWxlYXNlIG9mIHRoZSBsYXN0IGFjcXVpc2l0aW9uIHVubG9hZHMgaXQsIGFuZFxuICogdGhlIG5leHQgYWNxdWlyZSBjcmVhdGVzIGEgZnJlc2ggb25lLiBBIHtAbGluayBDb21wb25lbnRFeH0gaXMgbG9hZGVkIHRocm91Z2gge0BsaW5rIENvbXBvbmVudEV4LmxvYWRXaXRoUHJvbWlzZXN9LCBzb1xuICogYW4gYWNxdWlyZSByZXNvbHZlcyBvbmx5IG9uY2UgaXRzIGBvbmxvYWRBc3luY2AgYW5kIGNoaWxkcmVuIGhhdmUgc2V0dGxlZCwgYW5kIGEgZmFpbGVkIGxvYWQgcmVqZWN0cyBldmVyeSB3YWl0aW5nXG4gKiBhY3F1aXJlLCB1bmxvYWRzIHRoZSBjb21wb25lbnQgYW5kIGxlYXZlcyB0aGUga2V5IGZyZWUgZm9yIGEgZnJlc2ggYXR0ZW1wdC5cbiAqXG4gKiBUaGUgcG9vbCBpcyBpdHNlbGYgYSBjb21wb25lbnQsIGFuZCBpdHMgcGFyZW50IGlzIHRoZSBvd25lciBvZiBldmVyeSBzaGFyZWQgaW5zdGFuY2U6IGFkZCBpdCB3aXRoIGBhZGRDaGlsZGAgdG8gdGhlXG4gKiBwbHVnaW4gKG9yIGFueSBsb25nZXItbGl2ZWQgY29tcG9uZW50KS4gVW5sb2FkaW5nIHRoZSBvd25lciB1bmxvYWRzIGV2ZXJ5IHNoYXJlZCBjb21wb25lbnQgc3RpbGwgaGVsZCwgcmVqZWN0c1xuICogZXZlcnkgYWNxdWlyZSBzdGlsbCB3YWl0aW5nIHdpdGggYSB7QGxpbmsgU2lsZW50RXJyb3J9LCBhbmQgcmVmdXNlcyBsYXRlciBhY3F1aXJlcy4gS2V5cyBhcmUgY29tcGFyZWQgdGhlIHdheSBhXG4gKiB7QGxpbmsgTWFwfSBjb21wYXJlcyB0aGVtLCBzbyB0d28gZXF1YWwtbG9va2luZyBvYmplY3Qga2V5cyBhcmUgdHdvIHJlc291cmNlcy4gVGhlIGluc3RhbmNlcyBsaXZlIG9uIHRoZSBwb29sXG4gKiBvYmplY3Qgb25seSwgbmV2ZXIgaW4gdGhlIHNoYXJlZC1zdGF0ZSBiYWcsIHNvIHR3byBwbHVnaW5zIOKAlCBvciB0d28gcG9vbHMgb2Ygb25lIHBsdWdpbiDigJQgbmV2ZXIgc2hhcmUgYW55dGhpbmcuXG4gKlxuICogUmVhY2ggZm9yIGl0IG9ubHkgd2hlbiBTRVZFUkFMIGluZGVwZW5kZW50IGNvbnN1bWVycyB3YW50IHRoZSBzYW1lIGV4cGVuc2l2ZSBjb21wb25lbnQgYW5kIG5vbmUgb2YgdGhlbSBvd25zIGl0LlxuICogQSBjb21wb25lbnQgd2l0aCBhIHNpbmdsZSBvd25lciBpcyB0aGF0IG93bmVyJ3MgY2hpbGQ6IGBhZGRDaGlsZGAgaXMgc2ltcGxlciBhbmQgYWxyZWFkeSB1bmxvYWRzIGl0IHdpdGggaXRzIG93bmVyLlxuICpcbiAqIEB0eXBlUGFyYW0gVEtleSAtIFRoZSB0eXBlIG9mIHRoZSByZXNvdXJjZSBrZXkuXG4gKiBAdHlwZVBhcmFtIFRDb21wb25lbnQgLSBUaGUgdHlwZSBvZiB0aGUgc2hhcmVkIGNvbXBvbmVudC5cbiAqL1xuZXhwb3J0IGNsYXNzIFNoYXJlZENvbXBvbmVudFBvb2xDb21wb25lbnQ8VEtleSwgVENvbXBvbmVudCBleHRlbmRzIENvbXBvbmVudD4gZXh0ZW5kcyBDb21wb25lbnRFeCB7XG4gIC8qKlxuICAgKiBDcmVhdGVzIHRoZSBjb21wb25lbnQgc2hhcmVkIHVuZGVyIGEga2V5OyBzZWUge0BsaW5rIFNoYXJlZENvbXBvbmVudFBvb2xDb21wb25lbnRDb25zdHJ1Y3RvclBhcmFtcy5jcmVhdGVDb21wb25lbnR9LlxuICAgKi9cbiAgcHJvdGVjdGVkIHJlYWRvbmx5IGNyZWF0ZUNvbXBvbmVudDogKGtleTogVEtleSkgPT4gVENvbXBvbmVudDtcblxuICBwcml2YXRlIHJlYWRvbmx5IGNyZWF0aW5nS2V5cyA9IG5ldyBTZXQ8VEtleT4oKTtcbiAgcHJpdmF0ZSByZWFkb25seSBlbnRyaWVzID0gbmV3IE1hcDxUS2V5LCBQb29sRW50cnk8VEtleSwgVENvbXBvbmVudD4+KCk7XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgYSBuZXcgcG9vbC5cbiAgICpcbiAgICogQHBhcmFtIHBhcmFtcyAtIFRoZSBwb29sIHBhcmFtZXRlcnMuXG4gICAqL1xuICBwdWJsaWMgY29uc3RydWN0b3IocGFyYW1zOiBTaGFyZWRDb21wb25lbnRQb29sQ29tcG9uZW50Q29uc3RydWN0b3JQYXJhbXM8VEtleSwgVENvbXBvbmVudD4pIHtcbiAgICBzdXBlcigpO1xuICAgIHRoaXMuY3JlYXRlQ29tcG9uZW50ID0gcGFyYW1zLmNyZWF0ZUNvbXBvbmVudDtcbiAgfVxuXG4gIC8qKlxuICAgKiBBY3F1aXJlcyB0aGUgY29tcG9uZW50IHNoYXJlZCB1bmRlciBhIGtleSwgY3JlYXRpbmcgYW5kIGxvYWRpbmcgaXQgd2hlbiB0aGUga2V5IGhhcyBubyBjb25zdW1lciB5ZXQuXG4gICAqXG4gICAqIEBwYXJhbSBrZXkgLSBUaGUgcmVzb3VyY2Uga2V5LlxuICAgKiBAcGFyYW0gb3B0aW9ucyAtIFRoZSBhY3F1aXNpdGlvbiBvcHRpb25zLlxuICAgKiBAcmV0dXJucyBUaGUgYWNxdWlzaXRpb24sIG9uY2UgdGhlIHNoYXJlZCBjb21wb25lbnQgaGFzIGxvYWRlZC5cbiAgICogQHRocm93cyBBbiB7QGxpbmsgRXJyb3J9IHdoZW4gdGhlIHBvb2wgd2FzIG5ldmVyIGxvYWRlZCwgd2hlbiB0aGUgZmFjdG9yeSBvciB0aGUgbG9hZCBmYWlscywgb3Igd2hlbiBjYWxsZWQgZm9yIGFcbiAgICogICBrZXkgZnJvbSBpbnNpZGUgdGhhdCBrZXkncyBvd24gZmFjdG9yeSBvciBzeW5jaHJvbm91cyBsb2FkOyBhIHtAbGluayBTaWxlbnRFcnJvcn0gd2hlbiB0aGUgcG9vbCBpcyB1bmxvYWRlZCwgb3JcbiAgICogICB3aGVuIHRoZSBjb25zdW1lciB1bmxvYWRzIG9yIHRoZSBhY3F1aXNpdGlvbiBpcyByZWxlYXNlZCBiZWZvcmUgdGhlIGxvYWQgY29tcGxldGVzOyB0aGUgYWJvcnQgcmVhc29uIHdoZW5cbiAgICogICBgYWJvcnRTaWduYWxgIGFib3J0cyBmaXJzdC5cbiAgICovXG4gIHB1YmxpYyBhc3luYyBhY3F1aXJlKGtleTogVEtleSwgb3B0aW9uczogU2hhcmVkQ29tcG9uZW50UG9vbENvbXBvbmVudEFjcXVpcmVPcHRpb25zID0ge30pOiBQcm9taXNlPFNoYXJlZENvbXBvbmVudEFjcXVpc2l0aW9uPFRDb21wb25lbnQ+PiB7XG4gICAgdGhpcy5lbnN1cmVMb2FkZWQoKTtcbiAgICBvcHRpb25zLmFib3J0U2lnbmFsPy50aHJvd0lmQWJvcnRlZCgpO1xuXG4gICAgaWYgKHRoaXMuY3JlYXRpbmdLZXlzLmhhcyhrZXkpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0Egc2hhcmVkIGNvbXBvbmVudCBjYW5ub3QgYmUgYWNxdWlyZWQgZnJvbSBpbnNpZGUgaXRzIG93biBjcmVhdGlvbicpO1xuICAgIH1cblxuICAgIGNvbnN0IGVudHJ5ID0gdGhpcy5lbnRyaWVzLmdldChrZXkpID8/IHRoaXMuY3JlYXRlRW50cnkoa2V5KTtcbiAgICBlbnRyeS5jb25zdW1lckNvdW50Kys7XG5cbiAgICBjb25zdCBjYW5jZWxsYXRpb24gPSBjcmVhdGVEZWZlcnJlZCgpO1xuICAgIGNvbnN0IGFjcXVpc2l0aW9uID0gbmV3IFNoYXJlZENvbXBvbmVudEFjcXVpc2l0aW9uSW1wbChlbnRyeS5jb21wb25lbnQsICgpID0+IHtcbiAgICAgIGNhbmNlbGxhdGlvbi5yZWplY3QobmV3IFNpbGVudEVycm9yKCdUaGUgc2hhcmVkIGNvbXBvbmVudCBhY3F1aXNpdGlvbiB3YXMgcmVsZWFzZWQnKSk7XG4gICAgICB0aGlzLnJlbGVhc2VSZWZlcmVuY2UoZW50cnkpO1xuICAgIH0pO1xuXG4gICAgdXNpbmcgX2Fib3J0TGlzdGVuZXIgPSBvcHRpb25zLmFib3J0U2lnbmFsXG4gICAgICA/IG9uQWJvcnQob3B0aW9ucy5hYm9ydFNpZ25hbCwgKGFib3J0U2lnbmFsKSA9PiB7XG4gICAgICAgIGNhbmNlbGxhdGlvbi5yZWplY3QoYWJvcnRTaWduYWwucmVhc29uKTtcbiAgICAgICAgYWNxdWlzaXRpb24ucmVsZWFzZSgpO1xuICAgICAgfSlcbiAgICAgIDogbnVsbDtcblxuICAgIHRyeSB7XG4gICAgICBpZiAob3B0aW9ucy5jb25zdW1lcikge1xuICAgICAgICBhY3F1aXNpdGlvbi5saW5rQ29uc3VtZXIob3B0aW9ucy5jb25zdW1lcik7XG4gICAgICB9XG4gICAgICBhd2FpdCBQcm9taXNlLnJhY2UoW2VudHJ5LnJlYWR5LnByb21pc2UsIGNhbmNlbGxhdGlvbi5wcm9taXNlXSk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGFjcXVpc2l0aW9uLnJlbGVhc2UoKTtcbiAgICAgIHRocm93IGVycm9yO1xuICAgIH1cblxuICAgIGlmIChhY3F1aXNpdGlvbi5pc1JlbGVhc2VkKSB7XG4gICAgICB0aHJvdyBuZXcgU2lsZW50RXJyb3IoJ1RoZSBzaGFyZWQgY29tcG9uZW50IGFjcXVpc2l0aW9uIHdhcyByZWxlYXNlZCcpO1xuICAgIH1cblxuICAgIHJldHVybiBhY3F1aXNpdGlvbjtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIGhvdyBtYW55IGFjcXVpc2l0aW9ucyBjdXJyZW50bHkgaG9sZCB0aGUgY29tcG9uZW50IHNoYXJlZCB1bmRlciBhIGtleSwgcGVuZGluZyBvbmVzIGluY2x1ZGVkLlxuICAgKlxuICAgKiBAcGFyYW0ga2V5IC0gVGhlIHJlc291cmNlIGtleS5cbiAgICogQHJldHVybnMgVGhlIG51bWJlciBvZiBjb25zdW1lcnMsIGAwYCB3aGVuIHRoZSBrZXkgaGFzIG5vIHNoYXJlZCBjb21wb25lbnQuXG4gICAqL1xuICBwdWJsaWMgZ2V0Q29uc3VtZXJDb3VudChrZXk6IFRLZXkpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLmVudHJpZXMuZ2V0KGtleSk/LmNvbnN1bWVyQ291bnQgPz8gMDtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZWdpc3RlcnMgdGhlIHRlYXJkb3duIHRoYXQgdW5sb2FkcyBldmVyeSBzaGFyZWQgY29tcG9uZW50IHdoZW4gdGhlIHBvb2wgdW5sb2Fkcy5cbiAgICovXG4gIHB1YmxpYyBvdmVycmlkZSBvbmxvYWQoKTogdm9pZCB7XG4gICAgdGhpcy5yZWdpc3RlcigoKSA9PiB7XG4gICAgICBmb3IgKGNvbnN0IGVudHJ5IG9mIHNuYXBzaG90KFsuLi50aGlzLmVudHJpZXMudmFsdWVzKCldKSkge1xuICAgICAgICB0aGlzLnVubG9hZEVudHJ5KGVudHJ5LCBuZXcgU2lsZW50RXJyb3IoJ1RoZSBzaGFyZWQgY29tcG9uZW50IHBvb2wgaXMgdW5sb2FkZWQnKSk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIGNyZWF0ZUVudHJ5KGtleTogVEtleSk6IFBvb2xFbnRyeTxUS2V5LCBUQ29tcG9uZW50PiB7XG4gICAgdGhpcy5jcmVhdGluZ0tleXMuYWRkKGtleSk7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGNvbXBvbmVudCA9IHRoaXMuY3JlYXRlQ29tcG9uZW50KGtleSk7XG4gICAgICBjb25zdCBlbnRyeTogUG9vbEVudHJ5PFRLZXksIFRDb21wb25lbnQ+ID0ge1xuICAgICAgICBjb21wb25lbnQsXG4gICAgICAgIGNvbnN1bWVyQ291bnQ6IDAsXG4gICAgICAgIGlzVW5sb2FkZWQ6IGZhbHNlLFxuICAgICAgICBrZXksXG4gICAgICAgIHJlYWR5OiBjcmVhdGVEZWZlcnJlZCgpXG4gICAgICB9O1xuICAgICAgdGhpcy5lbnRyaWVzLnNldChrZXksIGVudHJ5KTtcblxuICAgICAgbGV0IGxvYWRQcm9taXNlOiBudWxsIHwgUHJvbWlzZTx2b2lkPiA9IG51bGw7XG4gICAgICB0cnkge1xuICAgICAgICBpZiAoY29tcG9uZW50IGluc3RhbmNlb2YgQ29tcG9uZW50RXgpIHtcbiAgICAgICAgICBsb2FkUHJvbWlzZSA9IGNvbXBvbmVudC5sb2FkV2l0aFByb21pc2VzKCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY29tcG9uZW50LmxvYWQoKTtcbiAgICAgICAgfVxuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgdGhpcy51bmxvYWRFbnRyeShlbnRyeSwgZXJyb3IpO1xuICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgIH1cblxuICAgICAgaWYgKGxvYWRQcm9taXNlKSB7XG4gICAgICAgIGxvYWRQcm9taXNlLnRoZW4oKCkgPT4ge1xuICAgICAgICAgIGVudHJ5LnJlYWR5LnJlc29sdmUoKTtcbiAgICAgICAgfSkuY2F0Y2goKGVycm9yOiB1bmtub3duKSA9PiB7XG4gICAgICAgICAgdGhpcy51bmxvYWRFbnRyeShlbnRyeSwgZXJyb3IpO1xuICAgICAgICB9KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGVudHJ5LnJlYWR5LnJlc29sdmUoKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGVudHJ5O1xuICAgIH0gZmluYWxseSB7XG4gICAgICB0aGlzLmNyZWF0aW5nS2V5cy5kZWxldGUoa2V5KTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHJlbGVhc2VSZWZlcmVuY2UoZW50cnk6IFBvb2xFbnRyeTxUS2V5LCBUQ29tcG9uZW50Pik6IHZvaWQge1xuICAgIGVudHJ5LmNvbnN1bWVyQ291bnQtLTtcbiAgICBpZiAoZW50cnkuY29uc3VtZXJDb3VudCA8PSAwKSB7XG4gICAgICB0aGlzLnVubG9hZEVudHJ5KGVudHJ5LCBuZXcgU2lsZW50RXJyb3IoJ1RoZSBsYXN0IGNvbnN1bWVyIHJlbGVhc2VkIHRoZSBzaGFyZWQgY29tcG9uZW50IGJlZm9yZSBpdCBsb2FkZWQnKSk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSB1bmxvYWRFbnRyeShlbnRyeTogUG9vbEVudHJ5PFRLZXksIFRDb21wb25lbnQ+LCByZWFzb246IHVua25vd24pOiB2b2lkIHtcbiAgICBpZiAoZW50cnkuaXNVbmxvYWRlZCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGVudHJ5LmlzVW5sb2FkZWQgPSB0cnVlO1xuICAgIC8vIEFuIGVudHJ5IHN0YXlzIGluIHRoZSBtYXAgdW50aWwgaXQgaXMgdW5sb2FkZWQsIGFuZCBvbmx5IG9uY2UsIHNvIHRoZSBrZXkgc3RpbGwgbWFwcyB0byB0aGlzIGVudHJ5LlxuICAgIHRoaXMuZW50cmllcy5kZWxldGUoZW50cnkua2V5KTtcbiAgICBlbnRyeS5yZWFkeS5yZWplY3QocmVhc29uKTtcbiAgICBlbnRyeS5jb21wb25lbnQudW5sb2FkKCk7XG4gIH1cbn1cblxuZnVuY3Rpb24gY3JlYXRlRGVmZXJyZWQoKTogRGVmZXJyZWQge1xuICBsZXQgcmVzb2x2ZTogKCkgPT4gdm9pZCA9IG5vb3A7XG4gIGxldCByZWplY3Q6IChyZWFzb246IHVua25vd24pID0+IHZvaWQgPSBub29wO1xuICBjb25zdCBwcm9taXNlID0gbmV3IFByb21pc2U8dm9pZD4oKHJlc29sdmVQcm9taXNlLCByZWplY3RQcm9taXNlKSA9PiB7XG4gICAgcmVzb2x2ZSA9IHJlc29sdmVQcm9taXNlO1xuICAgIHJlamVjdCA9IHJlamVjdFByb21pc2U7XG4gIH0pO1xuICAvLyBBIGRlZmVycmVkIG1heSBiZSByZWplY3RlZCB3aGlsZSBub2JvZHkgYXdhaXRzIGl0OyBtYXJrIGl0IGhhbmRsZWQgc28gdGhhdCBpcyBub3QgYW4gdW5oYW5kbGVkIHJlamVjdGlvbi5cbiAgcHJvbWlzZS5jYXRjaChub29wKTtcbiAgcmV0dXJuIHsgcHJvbWlzZSwgcmVqZWN0LCByZXNvbHZlIH07XG59XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFTQSw4QkFBd0I7QUFDeEIsbUJBQXlCO0FBQ3pCLG1CQUE0QjtBQUM1QixzQkFBcUI7QUFDckIsc0JBQTBCO0FBRTFCLDBCQUE0QjtBQWlGNUIsTUFBTSwrQkFBK0c7QUFBQSxFQVE1RyxZQUE0QixXQUF3QyxXQUF1QjtBQUEvRDtBQUF3QztBQUFBLEVBQXdCO0FBQUEsRUFBaEU7QUFBQSxFQUF3QztBQUFBLEVBUDNFLElBQVcsYUFBc0I7QUFDL0IsV0FBTyxLQUFLO0FBQUEsRUFDZDtBQUFBLEVBRVEsY0FBYztBQUFBLEVBQ2QsaUJBQXNDO0FBQUEsRUFJdkMsVUFBZ0I7QUFDckIsU0FBSyxRQUFRO0FBQUEsRUFDZjtBQUFBLEVBRU8sYUFBYSxVQUEyQjtBQUM3QyxVQUFNLGVBQWUsSUFBSSwwQkFBVTtBQUNuQyxpQkFBYSxTQUFTLE1BQU07QUFDMUIsV0FBSyxpQkFBaUI7QUFDdEIsV0FBSyxRQUFRO0FBQUEsSUFDZixDQUFDO0FBQ0QsYUFBUyxTQUFTLFlBQVk7QUFDOUIsU0FBSyxpQkFBaUIsTUFBWTtBQUNoQyxlQUFTLFlBQVks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
@@ -0,0 +1,129 @@
1
+ /// <reference path="../library-references.d.cts" />
2
+ /// <reference lib="dom" />
3
+ /**
4
+ * @file
5
+ *
6
+ * A pool that shares one loaded component per caller-defined key among several consumers, and unloads it when the
7
+ * last consumer releases it.
8
+ */
9
+ import type { DisposableEx } from '@mnaoumov/typescript-lib/disposable' with { 'resolution-mode': 'import' };
10
+ import { Component } from 'obsidian';
11
+ import { ComponentEx } from './component-ex.cjs';
12
+ /**
13
+ * One consumer's hold on a shared component.
14
+ *
15
+ * Releasing it is idempotent: the first call drops the hold, and every later call — including the one the consumer
16
+ * link makes when the consumer unloads — does nothing.
17
+ *
18
+ * @typeParam TComponent - The type of the shared component.
19
+ */
20
+ export interface SharedComponentAcquisition<TComponent extends Component> extends DisposableEx {
21
+ /**
22
+ * The shared component, loaded. Every consumer of the same key receives the same instance.
23
+ */
24
+ readonly component: TComponent;
25
+ /**
26
+ * Whether this acquisition has been released.
27
+ */
28
+ readonly isReleased: boolean;
29
+ /**
30
+ * Releases this acquisition. The shared component is unloaded when its last acquisition is released.
31
+ */
32
+ readonly release: () => void;
33
+ }
34
+ /**
35
+ * Options of {@link SharedComponentPoolComponent.acquire}.
36
+ */
37
+ export interface SharedComponentPoolComponentAcquireOptions {
38
+ /**
39
+ * Cancels the acquisition while the shared component is still loading. An abort after the acquisition resolved does
40
+ * nothing; release the acquisition instead.
41
+ */
42
+ readonly abortSignal?: AbortSignal;
43
+ /**
44
+ * A component whose unload releases the acquisition automatically.
45
+ *
46
+ * The link is a child component added to the consumer, so it follows Obsidian's own rules: a consumer that is not
47
+ * loaded yet starts holding the link when it loads, and a {@link ComponentEx} consumer that is already unloaded
48
+ * refuses it with a {@link SilentError}. Releasing the acquisition by hand removes the link again, so a long-lived
49
+ * consumer that acquires and releases many times accumulates nothing.
50
+ */
51
+ readonly consumer?: Component;
52
+ }
53
+ /**
54
+ * Parameters of {@link SharedComponentPoolComponent}.
55
+ *
56
+ * @typeParam TKey - The type of the resource key.
57
+ * @typeParam TComponent - The type of the shared component.
58
+ */
59
+ export interface SharedComponentPoolComponentConstructorParams<TKey, TComponent extends Component> {
60
+ /**
61
+ * Creates the component shared under a key. Called once per key each time the key goes from no consumer to one; the
62
+ * pool loads the component itself, so the factory must return it unloaded.
63
+ *
64
+ * @param key - The resource key.
65
+ * @returns The new, not yet loaded component.
66
+ */
67
+ readonly createComponent: (key: TKey) => TComponent;
68
+ }
69
+ /**
70
+ * Shares one loaded component per caller-defined key among several consumers.
71
+ *
72
+ * The first {@link acquire} of a key creates the component through the factory and loads it; every further acquire of
73
+ * the same key, concurrent or later, receives the same instance; the release of the last acquisition unloads it, and
74
+ * the next acquire creates a fresh one. A {@link ComponentEx} is loaded through {@link ComponentEx.loadWithPromises}, so
75
+ * an acquire resolves only once its `onloadAsync` and children have settled, and a failed load rejects every waiting
76
+ * acquire, unloads the component and leaves the key free for a fresh attempt.
77
+ *
78
+ * The pool is itself a component, and its parent is the owner of every shared instance: add it with `addChild` to the
79
+ * plugin (or any longer-lived component). Unloading the owner unloads every shared component still held, rejects
80
+ * every acquire still waiting with a {@link SilentError}, and refuses later acquires. Keys are compared the way a
81
+ * {@link Map} compares them, so two equal-looking object keys are two resources. The instances live on the pool
82
+ * object only, never in the shared-state bag, so two plugins — or two pools of one plugin — never share anything.
83
+ *
84
+ * Reach for it only when SEVERAL independent consumers want the same expensive component and none of them owns it.
85
+ * A component with a single owner is that owner's child: `addChild` is simpler and already unloads it with its owner.
86
+ *
87
+ * @typeParam TKey - The type of the resource key.
88
+ * @typeParam TComponent - The type of the shared component.
89
+ */
90
+ export declare class SharedComponentPoolComponent<TKey, TComponent extends Component> extends ComponentEx {
91
+ /**
92
+ * Creates the component shared under a key; see {@link SharedComponentPoolComponentConstructorParams.createComponent}.
93
+ */
94
+ protected readonly createComponent: (key: TKey) => TComponent;
95
+ private readonly creatingKeys;
96
+ private readonly entries;
97
+ /**
98
+ * Creates a new pool.
99
+ *
100
+ * @param params - The pool parameters.
101
+ */
102
+ constructor(params: SharedComponentPoolComponentConstructorParams<TKey, TComponent>);
103
+ /**
104
+ * Acquires the component shared under a key, creating and loading it when the key has no consumer yet.
105
+ *
106
+ * @param key - The resource key.
107
+ * @param options - The acquisition options.
108
+ * @returns The acquisition, once the shared component has loaded.
109
+ * @throws An {@link Error} when the pool was never loaded, when the factory or the load fails, or when called for a
110
+ * key from inside that key's own factory or synchronous load; a {@link SilentError} when the pool is unloaded, or
111
+ * when the consumer unloads or the acquisition is released before the load completes; the abort reason when
112
+ * `abortSignal` aborts first.
113
+ */
114
+ acquire(key: TKey, options?: SharedComponentPoolComponentAcquireOptions): Promise<SharedComponentAcquisition<TComponent>>;
115
+ /**
116
+ * Returns how many acquisitions currently hold the component shared under a key, pending ones included.
117
+ *
118
+ * @param key - The resource key.
119
+ * @returns The number of consumers, `0` when the key has no shared component.
120
+ */
121
+ getConsumerCount(key: TKey): number;
122
+ /**
123
+ * Registers the teardown that unloads every shared component when the pool unloads.
124
+ */
125
+ onload(): void;
126
+ private createEntry;
127
+ private releaseReference;
128
+ private unloadEntry;
129
+ }