@mnaoumov/obsidian-lib 10.3.0 → 10.4.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 (49) hide show
  1. package/command-handlers/undo-bulk-operation-command-handler/package.json +6 -0
  2. package/components/bulk-operation-commit-component/package.json +6 -0
  3. package/dist/lib/cjs/__merged.cjs +42 -1
  4. package/dist/lib/cjs/__merged.d.cts +5 -0
  5. package/dist/lib/cjs/bulk-operation-progress.cjs +120 -0
  6. package/dist/lib/cjs/bulk-operation-progress.d.cts +33 -0
  7. package/dist/lib/cjs/bulk-operation.cjs +220 -0
  8. package/dist/lib/cjs/bulk-operation.d.cts +237 -0
  9. package/dist/lib/cjs/command-handlers/index.cjs +4 -1
  10. package/dist/lib/cjs/command-handlers/index.d.cts +1 -0
  11. package/dist/lib/cjs/command-handlers/undo-bulk-operation-command-handler.cjs +164 -0
  12. package/dist/lib/cjs/command-handlers/undo-bulk-operation-command-handler.d.cts +51 -0
  13. package/dist/lib/cjs/components/bulk-operation-commit-component.cjs +337 -0
  14. package/dist/lib/cjs/components/bulk-operation-commit-component.d.cts +152 -0
  15. package/dist/lib/cjs/components/index.cjs +4 -1
  16. package/dist/lib/cjs/components/index.d.cts +1 -0
  17. package/dist/lib/cjs/desktop-bulk-operation-git.cjs +534 -0
  18. package/dist/lib/cjs/desktop-bulk-operation-git.d.cts +196 -0
  19. package/dist/lib/cjs/generated-during-build.cjs +1 -1
  20. package/dist/lib/cjs/i18n/locales/en.cjs +10 -1
  21. package/dist/lib/cjs/i18n/locales/en.d.cts +9 -0
  22. package/dist/lib/cjs/i18n/locales/translations-map.d.cts +9 -0
  23. package/dist/lib/cjs/index.cjs +10 -1
  24. package/dist/lib/cjs/index.d.cts +3 -0
  25. package/dist/lib/cjs/loop.cjs +3 -1
  26. package/dist/lib/esm/__merged.d.mts +5 -0
  27. package/dist/lib/esm/__merged.mjs +43 -1
  28. package/dist/lib/esm/bulk-operation-progress.d.mts +33 -0
  29. package/dist/lib/esm/bulk-operation-progress.mjs +31 -0
  30. package/dist/lib/esm/bulk-operation.d.mts +237 -0
  31. package/dist/lib/esm/bulk-operation.mjs +125 -0
  32. package/dist/lib/esm/command-handlers/index.d.mts +1 -0
  33. package/dist/lib/esm/command-handlers/index.mjs +3 -1
  34. package/dist/lib/esm/command-handlers/undo-bulk-operation-command-handler.d.mts +51 -0
  35. package/dist/lib/esm/command-handlers/undo-bulk-operation-command-handler.mjs +76 -0
  36. package/dist/lib/esm/components/bulk-operation-commit-component.d.mts +152 -0
  37. package/dist/lib/esm/components/bulk-operation-commit-component.mjs +245 -0
  38. package/dist/lib/esm/components/index.d.mts +1 -0
  39. package/dist/lib/esm/components/index.mjs +3 -1
  40. package/dist/lib/esm/desktop-bulk-operation-git.d.mts +196 -0
  41. package/dist/lib/esm/desktop-bulk-operation-git.mjs +463 -0
  42. package/dist/lib/esm/generated-during-build.mjs +1 -1
  43. package/dist/lib/esm/i18n/locales/en.d.mts +9 -0
  44. package/dist/lib/esm/i18n/locales/en.mjs +10 -1
  45. package/dist/lib/esm/i18n/locales/translations-map.d.mts +9 -0
  46. package/dist/lib/esm/index.d.mts +3 -0
  47. package/dist/lib/esm/index.mjs +7 -1
  48. package/dist/lib/esm/loop.mjs +3 -1
  49. package/package.json +1 -1
@@ -0,0 +1,164 @@
1
+ /*
2
+ THIS IS A GENERATED/BUNDLED FILE BY ESBUILD
3
+ if you want to view the source, please visit the github repository of this plugin
4
+ */
5
+ (function () {
6
+ function ensureBrowserProcess() {
7
+ const browserProcess = {
8
+ browser: true,
9
+ cwd() {
10
+ return "/";
11
+ },
12
+ env: {},
13
+ platform: "android"
14
+ };
15
+ const existingProcess = globalThis.process;
16
+ if (!existingProcess) {
17
+ globalThis.process = browserProcess;
18
+ return;
19
+ }
20
+ if (existingProcess.versions?.node) {
21
+ return;
22
+ }
23
+ const existingProcessRecord = existingProcess;
24
+ for (const [key, value] of Object.entries(browserProcess)) {
25
+ existingProcessRecord[key] ??= value;
26
+ }
27
+ existingProcessRecord["browser"] = true;
28
+ }
29
+
30
+ ensureBrowserProcess();
31
+ })();
32
+ (function patchObsidianRequire() {
33
+ const originalRequire = require;
34
+ if (!originalRequire || originalRequire.__isPatched) {
35
+ return;
36
+ }
37
+ require = Object.assign(
38
+ (id) => requirePatched(id),
39
+ originalRequire,
40
+ {
41
+ __isPatched: true
42
+ }
43
+ );
44
+ function extractDefault($module) {
45
+ return $module && $module.__esModule && "default" in $module ? $module.default : $module;
46
+ }
47
+ const OBSIDIAN_BUILT_IN_MODULE_NAMES = /* @__PURE__ */ new Set([
48
+ "@codemirror/autocomplete",
49
+ "@codemirror/collab",
50
+ "@codemirror/commands",
51
+ "@codemirror/language",
52
+ "@codemirror/lint",
53
+ "@codemirror/search",
54
+ "@codemirror/state",
55
+ "@codemirror/text",
56
+ "@codemirror/view",
57
+ "@lezer/common",
58
+ "@lezer/highlight",
59
+ "@lezer/lr",
60
+ "obsidian"
61
+ ]);
62
+ const DEPRECATED_OBSIDIAN_BUILT_IN_MODULE_NAMES = /* @__PURE__ */ new Set([
63
+ "@codemirror/closebrackets",
64
+ "@codemirror/comment",
65
+ "@codemirror/fold",
66
+ "@codemirror/gutter",
67
+ "@codemirror/highlight",
68
+ "@codemirror/history",
69
+ "@codemirror/matchbrackets",
70
+ "@codemirror/panel",
71
+ "@codemirror/rangeset",
72
+ "@codemirror/rectangular-selection",
73
+ "@codemirror/stream-parser",
74
+ "@codemirror/tooltip"
75
+ ]);
76
+ function requirePatched(id) {
77
+ if (OBSIDIAN_BUILT_IN_MODULE_NAMES.has(id) || DEPRECATED_OBSIDIAN_BUILT_IN_MODULE_NAMES.has(id)) {
78
+ return originalRequire?.(id);
79
+ }
80
+ const app = globalThis.app;
81
+ if (app?.isMobile) {
82
+ if (id === "process" || id === "node:process") {
83
+ console.debug(`The most likely you can safely ignore this error. Module not found: ${id}. Fake process object is returned instead.`);
84
+ return process;
85
+ }
86
+ } else {
87
+ const $module = originalRequire?.(id);
88
+ if ($module) {
89
+ return extractDefault($module);
90
+ }
91
+ }
92
+ console.debug(`The most likely you can safely ignore this error. Module not found: ${id}. Empty object is returned instead.`);
93
+ return {};
94
+ }
95
+ })();
96
+
97
+ "use strict";
98
+ var __defProp = Object.defineProperty;
99
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
100
+ var __getOwnPropNames = Object.getOwnPropertyNames;
101
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
102
+ var __export = (target, all) => {
103
+ for (var name in all)
104
+ __defProp(target, name, { get: all[name], enumerable: true });
105
+ };
106
+ var __copyProps = (to, from, except, desc) => {
107
+ if (from && typeof from === "object" || typeof from === "function") {
108
+ for (let key of __getOwnPropNames(from))
109
+ if (!__hasOwnProp.call(to, key) && key !== except)
110
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
111
+ }
112
+ return to;
113
+ };
114
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
115
+ var undo_bulk_operation_command_handler_exports = {};
116
+ __export(undo_bulk_operation_command_handler_exports, {
117
+ UndoBulkOperationCommandHandler: () => UndoBulkOperationCommandHandler
118
+ });
119
+ module.exports = __toCommonJS(undo_bulk_operation_command_handler_exports);
120
+ var import_obsidian = require('obsidian');
121
+ var import_global_command_handler = require('./global-command-handler.cjs');
122
+ class UndoBulkOperationCommandHandler extends import_global_command_handler.GlobalCommandHandler {
123
+ /**
124
+ * The component that commits the plugin's bulk operations.
125
+ */
126
+ bulkOperationCommitComponent;
127
+ /**
128
+ * Whether the plugin's opt-in setting for bulk-operation commits is on.
129
+ */
130
+ isEnabled;
131
+ /**
132
+ * Creates a new instance.
133
+ *
134
+ * @param params - Constructor parameters.
135
+ */
136
+ constructor(params) {
137
+ super({
138
+ icon: "undo-2",
139
+ id: "undo-bulk-operation",
140
+ name: "Undo a bulk operation..."
141
+ });
142
+ this.bulkOperationCommitComponent = params.bulkOperationCommitComponent;
143
+ this.isEnabled = params.isEnabled;
144
+ }
145
+ /**
146
+ * Executes the command, letting the user pick a bulk operation to revert.
147
+ */
148
+ async execute() {
149
+ await this.bulkOperationCommitComponent.undoBulkOperation();
150
+ }
151
+ /**
152
+ * Checks whether the command can currently execute: on desktop, with bulk-operation commits enabled.
153
+ *
154
+ * @returns Whether the command can execute.
155
+ */
156
+ canExecute() {
157
+ return import_obsidian.Platform.isDesktopApp && this.isEnabled();
158
+ }
159
+ }
160
+ // Annotate the CommonJS export names for ESM import in node:
161
+ 0 && (module.exports = {
162
+ UndoBulkOperationCommandHandler
163
+ });
164
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9jb21tYW5kLWhhbmRsZXJzL3VuZG8tYnVsay1vcGVyYXRpb24tY29tbWFuZC1oYW5kbGVyLnRzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGZpbGVcbiAqXG4gKiBIYW5kbGVzIHRoZSBcIlVuZG8gYSBidWxrIG9wZXJhdGlvbi4uLlwiIGNvbW1hbmQuXG4gKi9cblxuaW1wb3J0IHsgUGxhdGZvcm0gfSBmcm9tICdvYnNpZGlhbic7XG5cbmltcG9ydCB0eXBlIHsgQnVsa09wZXJhdGlvbkNvbW1pdENvbXBvbmVudCB9IGZyb20gJy4uL2NvbXBvbmVudHMvYnVsay1vcGVyYXRpb24tY29tbWl0LWNvbXBvbmVudC50cyc7XG5cbmltcG9ydCB7IEdsb2JhbENvbW1hbmRIYW5kbGVyIH0gZnJvbSAnLi9nbG9iYWwtY29tbWFuZC1oYW5kbGVyLnRzJztcblxuLyoqXG4gKiBDb25zdHJ1Y3RvciBwYXJhbWV0ZXJzIGZvciB7QGxpbmsgVW5kb0J1bGtPcGVyYXRpb25Db21tYW5kSGFuZGxlcn0uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVW5kb0J1bGtPcGVyYXRpb25Db21tYW5kSGFuZGxlckNvbnN0cnVjdG9yUGFyYW1zIHtcbiAgLyoqXG4gICAqIFRoZSBjb21wb25lbnQgdGhhdCBjb21taXRzIHRoZSBwbHVnaW4ncyBidWxrIG9wZXJhdGlvbnMuXG4gICAqL1xuICByZWFkb25seSBidWxrT3BlcmF0aW9uQ29tbWl0Q29tcG9uZW50OiBCdWxrT3BlcmF0aW9uQ29tbWl0Q29tcG9uZW50O1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRoZSBwbHVnaW4ncyBvcHQtaW4gc2V0dGluZyBmb3IgYnVsay1vcGVyYXRpb24gY29tbWl0cyBpcyBvbi4gVGhlIGNvbW1hbmQgaXMgaGlkZGVuIHdoaWxlIGl0IGlzIG9mZi5cbiAgICovXG4gIHJlYWRvbmx5IGlzRW5hYmxlZDogKCkgPT4gYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBBIGNvbW1hbmQgaGFuZGxlciB0aGF0IGxpc3RzIHRoZSBwbHVnaW4ncyBidWxrIG9wZXJhdGlvbnMgcmVjb3JkZWQgaW4gdGhlIHZhdWx0IHJlcG9zaXRvcnkgYW5kIHJldmVydHMgdGhlIG9uZVxuICogdGhlIHVzZXIgcGlja3MuIEF2YWlsYWJsZSBvbmx5IG9uIGRlc2t0b3AsIHdoaWxlIHRoZSBwbHVnaW4ncyBidWxrLW9wZXJhdGlvbiBjb21taXRzIGFyZSBlbmFibGVkLlxuICovXG5leHBvcnQgY2xhc3MgVW5kb0J1bGtPcGVyYXRpb25Db21tYW5kSGFuZGxlciBleHRlbmRzIEdsb2JhbENvbW1hbmRIYW5kbGVyIHtcbiAgLyoqXG4gICAqIFRoZSBjb21wb25lbnQgdGhhdCBjb21taXRzIHRoZSBwbHVnaW4ncyBidWxrIG9wZXJhdGlvbnMuXG4gICAqL1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgYnVsa09wZXJhdGlvbkNvbW1pdENvbXBvbmVudDogQnVsa09wZXJhdGlvbkNvbW1pdENvbXBvbmVudDtcblxuICAvKipcbiAgICogV2hldGhlciB0aGUgcGx1Z2luJ3Mgb3B0LWluIHNldHRpbmcgZm9yIGJ1bGstb3BlcmF0aW9uIGNvbW1pdHMgaXMgb24uXG4gICAqL1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgaXNFbmFibGVkOiAoKSA9PiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLlxuICAgKlxuICAgKiBAcGFyYW0gcGFyYW1zIC0gQ29uc3RydWN0b3IgcGFyYW1ldGVycy5cbiAgICovXG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihwYXJhbXM6IFVuZG9CdWxrT3BlcmF0aW9uQ29tbWFuZEhhbmRsZXJDb25zdHJ1Y3RvclBhcmFtcykge1xuICAgIHN1cGVyKHtcbiAgICAgIGljb246ICd1bmRvLTInLFxuICAgICAgaWQ6ICd1bmRvLWJ1bGstb3BlcmF0aW9uJyxcbiAgICAgIG5hbWU6ICdVbmRvIGEgYnVsayBvcGVyYXRpb24uLi4nXG4gICAgfSk7XG4gICAgdGhpcy5idWxrT3BlcmF0aW9uQ29tbWl0Q29tcG9uZW50ID0gcGFyYW1zLmJ1bGtPcGVyYXRpb25Db21taXRDb21wb25lbnQ7XG4gICAgdGhpcy5pc0VuYWJsZWQgPSBwYXJhbXMuaXNFbmFibGVkO1xuICB9XG5cbiAgLyoqXG4gICAqIEV4ZWN1dGVzIHRoZSBjb21tYW5kLCBsZXR0aW5nIHRoZSB1c2VyIHBpY2sgYSBidWxrIG9wZXJhdGlvbiB0byByZXZlcnQuXG4gICAqL1xuICBwdWJsaWMgb3ZlcnJpZGUgYXN5bmMgZXhlY3V0ZSgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBhd2FpdCB0aGlzLmJ1bGtPcGVyYXRpb25Db21taXRDb21wb25lbnQudW5kb0J1bGtPcGVyYXRpb24oKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVja3Mgd2hldGhlciB0aGUgY29tbWFuZCBjYW4gY3VycmVudGx5IGV4ZWN1dGU6IG9uIGRlc2t0b3AsIHdpdGggYnVsay1vcGVyYXRpb24gY29tbWl0cyBlbmFibGVkLlxuICAgKlxuICAgKiBAcmV0dXJucyBXaGV0aGVyIHRoZSBjb21tYW5kIGNhbiBleGVjdXRlLlxuICAgKi9cbiAgcHJvdGVjdGVkIG92ZXJyaWRlIGNhbkV4ZWN1dGUoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIFBsYXRmb3JtLmlzRGVza3RvcEFwcCAmJiB0aGlzLmlzRW5hYmxlZCgpO1xuICB9XG59XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFNQSxzQkFBeUI7QUFJekIsb0NBQXFDO0FBcUI5QixNQUFNLHdDQUF3QyxtREFBcUI7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQUlyRDtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBS0E7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFPWixZQUFZLFFBQTBEO0FBQzNFLFVBQU07QUFBQSxNQUNKLE1BQU07QUFBQSxNQUNOLElBQUk7QUFBQSxNQUNKLE1BQU07QUFBQSxJQUNSLENBQUM7QUFDRCxTQUFLLCtCQUErQixPQUFPO0FBQzNDLFNBQUssWUFBWSxPQUFPO0FBQUEsRUFDMUI7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQUtBLE1BQXNCLFVBQXlCO0FBQzdDLFVBQU0sS0FBSyw2QkFBNkIsa0JBQWtCO0FBQUEsRUFDNUQ7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFPbUIsYUFBc0I7QUFDdkMsV0FBTyx5QkFBUyxnQkFBZ0IsS0FBSyxVQUFVO0FBQUEsRUFDakQ7QUFDRjsiLCJuYW1lcyI6W119
@@ -0,0 +1,51 @@
1
+ /// <reference path="../library-references.d.cts" />
2
+ /**
3
+ * @file
4
+ *
5
+ * Handles the "Undo a bulk operation..." command.
6
+ */
7
+ import type { BulkOperationCommitComponent } from '../components/bulk-operation-commit-component.cjs';
8
+ import { GlobalCommandHandler } from './global-command-handler.cjs';
9
+ /**
10
+ * Constructor parameters for {@link UndoBulkOperationCommandHandler}.
11
+ */
12
+ export interface UndoBulkOperationCommandHandlerConstructorParams {
13
+ /**
14
+ * The component that commits the plugin's bulk operations.
15
+ */
16
+ readonly bulkOperationCommitComponent: BulkOperationCommitComponent;
17
+ /**
18
+ * Whether the plugin's opt-in setting for bulk-operation commits is on. The command is hidden while it is off.
19
+ */
20
+ readonly isEnabled: () => boolean;
21
+ }
22
+ /**
23
+ * A command handler that lists the plugin's bulk operations recorded in the vault repository and reverts the one
24
+ * the user picks. Available only on desktop, while the plugin's bulk-operation commits are enabled.
25
+ */
26
+ export declare class UndoBulkOperationCommandHandler extends GlobalCommandHandler {
27
+ /**
28
+ * The component that commits the plugin's bulk operations.
29
+ */
30
+ protected readonly bulkOperationCommitComponent: BulkOperationCommitComponent;
31
+ /**
32
+ * Whether the plugin's opt-in setting for bulk-operation commits is on.
33
+ */
34
+ protected readonly isEnabled: () => boolean;
35
+ /**
36
+ * Creates a new instance.
37
+ *
38
+ * @param params - Constructor parameters.
39
+ */
40
+ constructor(params: UndoBulkOperationCommandHandlerConstructorParams);
41
+ /**
42
+ * Executes the command, letting the user pick a bulk operation to revert.
43
+ */
44
+ execute(): Promise<void>;
45
+ /**
46
+ * Checks whether the command can currently execute: on desktop, with bulk-operation commits enabled.
47
+ *
48
+ * @returns Whether the command can execute.
49
+ */
50
+ protected canExecute(): boolean;
51
+ }
@@ -0,0 +1,337 @@
1
+ /*
2
+ THIS IS A GENERATED/BUNDLED FILE BY ESBUILD
3
+ if you want to view the source, please visit the github repository of this plugin
4
+ */
5
+ (function () {
6
+ function ensureBrowserProcess() {
7
+ const browserProcess = {
8
+ browser: true,
9
+ cwd() {
10
+ return "/";
11
+ },
12
+ env: {},
13
+ platform: "android"
14
+ };
15
+ const existingProcess = globalThis.process;
16
+ if (!existingProcess) {
17
+ globalThis.process = browserProcess;
18
+ return;
19
+ }
20
+ if (existingProcess.versions?.node) {
21
+ return;
22
+ }
23
+ const existingProcessRecord = existingProcess;
24
+ for (const [key, value] of Object.entries(browserProcess)) {
25
+ existingProcessRecord[key] ??= value;
26
+ }
27
+ existingProcessRecord["browser"] = true;
28
+ }
29
+
30
+ ensureBrowserProcess();
31
+ })();
32
+ (function patchObsidianRequire() {
33
+ const originalRequire = require;
34
+ if (!originalRequire || originalRequire.__isPatched) {
35
+ return;
36
+ }
37
+ require = Object.assign(
38
+ (id) => requirePatched(id),
39
+ originalRequire,
40
+ {
41
+ __isPatched: true
42
+ }
43
+ );
44
+ function extractDefault($module) {
45
+ return $module && $module.__esModule && "default" in $module ? $module.default : $module;
46
+ }
47
+ const OBSIDIAN_BUILT_IN_MODULE_NAMES = /* @__PURE__ */ new Set([
48
+ "@codemirror/autocomplete",
49
+ "@codemirror/collab",
50
+ "@codemirror/commands",
51
+ "@codemirror/language",
52
+ "@codemirror/lint",
53
+ "@codemirror/search",
54
+ "@codemirror/state",
55
+ "@codemirror/text",
56
+ "@codemirror/view",
57
+ "@lezer/common",
58
+ "@lezer/highlight",
59
+ "@lezer/lr",
60
+ "obsidian"
61
+ ]);
62
+ const DEPRECATED_OBSIDIAN_BUILT_IN_MODULE_NAMES = /* @__PURE__ */ new Set([
63
+ "@codemirror/closebrackets",
64
+ "@codemirror/comment",
65
+ "@codemirror/fold",
66
+ "@codemirror/gutter",
67
+ "@codemirror/highlight",
68
+ "@codemirror/history",
69
+ "@codemirror/matchbrackets",
70
+ "@codemirror/panel",
71
+ "@codemirror/rangeset",
72
+ "@codemirror/rectangular-selection",
73
+ "@codemirror/stream-parser",
74
+ "@codemirror/tooltip"
75
+ ]);
76
+ function requirePatched(id) {
77
+ if (OBSIDIAN_BUILT_IN_MODULE_NAMES.has(id) || DEPRECATED_OBSIDIAN_BUILT_IN_MODULE_NAMES.has(id)) {
78
+ return originalRequire?.(id);
79
+ }
80
+ const app = globalThis.app;
81
+ if (app?.isMobile) {
82
+ if (id === "process" || id === "node:process") {
83
+ console.debug(`The most likely you can safely ignore this error. Module not found: ${id}. Fake process object is returned instead.`);
84
+ return process;
85
+ }
86
+ } else {
87
+ const $module = originalRequire?.(id);
88
+ if ($module) {
89
+ return extractDefault($module);
90
+ }
91
+ }
92
+ console.debug(`The most likely you can safely ignore this error. Module not found: ${id}. Empty object is returned instead.`);
93
+ return {};
94
+ }
95
+ })();
96
+
97
+ "use strict";
98
+ var __create = Object.create;
99
+ var __defProp = Object.defineProperty;
100
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
101
+ var __getOwnPropNames = Object.getOwnPropertyNames;
102
+ var __getProtoOf = Object.getPrototypeOf;
103
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
104
+ var __export = (target, all) => {
105
+ for (var name in all)
106
+ __defProp(target, name, { get: all[name], enumerable: true });
107
+ };
108
+ var __copyProps = (to, from, except, desc) => {
109
+ if (from && typeof from === "object" || typeof from === "function") {
110
+ for (let key of __getOwnPropNames(from))
111
+ if (!__hasOwnProp.call(to, key) && key !== except)
112
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
113
+ }
114
+ return to;
115
+ };
116
+ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
117
+ // If the importer is in node compatibility mode or this is not an ESM
118
+ // file that has been converted to a CommonJS file using a Babel-
119
+ // compatible transform (i.e. "__esModule" has not been set), then set
120
+ // "default" to the CommonJS "module.exports" for node compatibility.
121
+ isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
122
+ mod
123
+ ));
124
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
125
+ var bulk_operation_commit_component_exports = {};
126
+ __export(bulk_operation_commit_component_exports, {
127
+ BulkOperationCommitComponent: () => BulkOperationCommitComponent
128
+ });
129
+ module.exports = __toCommonJS(bulk_operation_commit_component_exports);
130
+ var import_async = require('@mnaoumov/typescript-lib/async');
131
+ var import_error = require('@mnaoumov/typescript-lib/error');
132
+ var import_type_guards = require('@mnaoumov/typescript-lib/type-guards');
133
+ var import_obsidian = require('obsidian');
134
+ var import_bulk_operation_progress = require('../bulk-operation-progress.cjs');
135
+ var import_debug = require('../debug.cjs');
136
+ var import_file_manager = require('../file-manager.cjs');
137
+ var import_i18n = require('../i18n/i18n.cjs');
138
+ var import_metadata_cache = require('../metadata-cache.cjs');
139
+ var import_select_item = require('../modals/select-item.cjs');
140
+ var import_queue = require('../queue.cjs');
141
+ var import_component_ex = require('./component-ex.cjs');
142
+ const DEFAULT_MAX_SETTLE_TIME_IN_MILLISECONDS = 6e4;
143
+ const DEFAULT_QUIET_PERIOD_IN_MILLISECONDS = 2e3;
144
+ const SHORT_SHA_LENGTH = 8;
145
+ class BulkOperationCommitComponent extends import_component_ex.ComponentEx {
146
+ /**
147
+ * The Obsidian app instance.
148
+ */
149
+ app;
150
+ /**
151
+ * Whether the plugin's opt-in setting is on.
152
+ */
153
+ isEnabled;
154
+ /**
155
+ * The id of the plugin whose operations are committed.
156
+ */
157
+ pluginId;
158
+ /**
159
+ * The notice component used to report problems.
160
+ */
161
+ pluginNoticeComponent;
162
+ maxSettleTimeInMilliseconds;
163
+ quietPeriodInMilliseconds;
164
+ repoPromise = null;
165
+ /**
166
+ * Creates a new instance.
167
+ *
168
+ * @param params - The constructor parameters.
169
+ */
170
+ constructor(params) {
171
+ super();
172
+ this.app = params.app;
173
+ this.isEnabled = params.isEnabled;
174
+ this.pluginId = params.pluginId;
175
+ this.pluginNoticeComponent = params.pluginNoticeComponent;
176
+ this.maxSettleTimeInMilliseconds = params.maxSettleTimeInMilliseconds ?? DEFAULT_MAX_SETTLE_TIME_IN_MILLISECONDS;
177
+ this.quietPeriodInMilliseconds = params.quietPeriodInMilliseconds ?? DEFAULT_QUIET_PERIOD_IN_MILLISECONDS;
178
+ }
179
+ /**
180
+ * Checks whether bulk operations are currently committed: the setting is on, the app is desktop and the vault is
181
+ * inside a git work tree.
182
+ *
183
+ * @returns Whether bulk operations are committed.
184
+ */
185
+ async checkActive() {
186
+ return await this.getRepo() !== null;
187
+ }
188
+ /**
189
+ * Recovers a stale lock left by a crashed operation once the component loads.
190
+ */
191
+ onload() {
192
+ super.onload();
193
+ (0, import_async.invokeAsyncSafely)(() => this.recoverStaleLock());
194
+ }
195
+ /**
196
+ * Runs a bulk operation, wrapped in git commits when bulk-operation commits are active.
197
+ *
198
+ * @typeParam T - The type of the operation's result.
199
+ * @param params - The parameters.
200
+ * @returns The operation's result.
201
+ */
202
+ async runBulkOperation(params) {
203
+ const repo = await this.getRepo();
204
+ if (!repo) {
205
+ return await params.operation();
206
+ }
207
+ const { commitSha, operationId, result } = await repo.runBulkOperation({
208
+ operation: async () => await params.operation(),
209
+ pluginId: this.pluginId,
210
+ settle: () => this.settle(),
211
+ summary: params.summary
212
+ });
213
+ (0, import_debug.getObsidianLibDebugger)("BulkOperationCommitComponent")(
214
+ commitSha === null ? `${operationId} changed nothing` : `${operationId} committed as ${commitSha}`
215
+ );
216
+ return result;
217
+ }
218
+ /**
219
+ * Lets the user pick one of the plugin's bulk operations and reverts its commit.
220
+ *
221
+ * A conflict is reported and left for the user to resolve; the revert is never aborted.
222
+ *
223
+ * @param operationId - The operation to undo, such as `OP12`. When omitted, the user picks from every operation
224
+ * of the plugin. When two commits share the id (two machines minted it before syncing), the user picks between
225
+ * them.
226
+ */
227
+ async undoBulkOperation(operationId) {
228
+ const repo = await this.getRepo();
229
+ if (!repo) {
230
+ this.pluginNoticeComponent.showNotice((0, import_i18n.t)(($) => $.obsidianLib.bulkOperation.notActive));
231
+ return;
232
+ }
233
+ let commits = await repo.listBulkOperationCommits(this.pluginId);
234
+ if (operationId !== void 0) {
235
+ commits = commits.filter((commit2) => commit2.operationId === operationId);
236
+ }
237
+ if (commits.length === 0) {
238
+ this.pluginNoticeComponent.showNotice((0, import_i18n.t)(($) => $.obsidianLib.bulkOperation.noOperations));
239
+ return;
240
+ }
241
+ const commit = commits.length === 1 && operationId !== void 0 ? (0, import_type_guards.ensureNonNullable)(commits[0]) : await (0, import_select_item.selectItem)({
242
+ app: this.app,
243
+ items: commits,
244
+ itemTextFunction: formatCommit,
245
+ placeholder: (0, import_i18n.t)(($) => $.obsidianLib.bulkOperation.selectOperation)
246
+ });
247
+ if (!commit) {
248
+ return;
249
+ }
250
+ let revertResult;
251
+ try {
252
+ revertResult = await repo.revertBulkOperationCommit(commit);
253
+ } catch (error) {
254
+ this.pluginNoticeComponent.showNotice(
255
+ (0, import_i18n.t)(($) => $.obsidianLib.bulkOperation.revertFailed, { error: (0, import_error.errorToString)(error), operationId: commit.operationId })
256
+ );
257
+ return;
258
+ }
259
+ if (revertResult.isConflict) {
260
+ this.pluginNoticeComponent.showNotice((0, import_i18n.t)(($) => $.obsidianLib.bulkOperation.revertConflict, { operationId: commit.operationId }), {
261
+ isPermanent: true
262
+ });
263
+ return;
264
+ }
265
+ this.pluginNoticeComponent.showNotice((0, import_i18n.t)(($) => $.obsidianLib.bulkOperation.reverted, { operationId: commit.operationId }));
266
+ }
267
+ async findRepo() {
268
+ if (!import_obsidian.Platform.isDesktopApp) {
269
+ return null;
270
+ }
271
+ const adapter = this.app.vault.adapter;
272
+ if (!(adapter instanceof import_obsidian.FileSystemAdapter)) {
273
+ return null;
274
+ }
275
+ const { BulkOperationGitRepo: GitRepo } = await import("../desktop-bulk-operation-git.cjs");
276
+ return await GitRepo.open(adapter.getBasePath());
277
+ }
278
+ async getRepo() {
279
+ if (!this.isEnabled()) {
280
+ return null;
281
+ }
282
+ this.repoPromise ??= this.findRepo();
283
+ return await this.repoPromise;
284
+ }
285
+ async recoverStaleLock() {
286
+ const repo = await this.getRepo();
287
+ if (!repo) {
288
+ return;
289
+ }
290
+ const operationId = await repo.recoverStaleLock();
291
+ if (operationId !== null) {
292
+ this.pluginNoticeComponent.showNotice((0, import_i18n.t)(($) => $.obsidianLib.bulkOperation.recoveredInterrupted, { operationId }));
293
+ }
294
+ }
295
+ async settle() {
296
+ await (0, import_queue.flushQueue)();
297
+ await (0, import_file_manager.waitForPendingLinkUpdates)(this.app);
298
+ await (0, import_metadata_cache.ensureMetadataCacheReady)(this.app);
299
+ await this.waitForQuietVault();
300
+ }
301
+ async waitForQuietVault() {
302
+ let lastChangeAt = performance.now();
303
+ const deadline = lastChangeAt + this.maxSettleTimeInMilliseconds;
304
+ function onChange() {
305
+ lastChangeAt = performance.now();
306
+ }
307
+ const eventRefs = [
308
+ this.app.vault.on("create", onChange),
309
+ this.app.vault.on("delete", onChange),
310
+ this.app.vault.on("modify", onChange),
311
+ this.app.vault.on("rename", onChange)
312
+ ];
313
+ try {
314
+ for (; ; ) {
315
+ const now = performance.now();
316
+ const quietRemaining = lastChangeAt + this.quietPeriodInMilliseconds - now;
317
+ if (quietRemaining <= 0 || now >= deadline) {
318
+ return;
319
+ }
320
+ (0, import_bulk_operation_progress.reportBulkOperationProgress)();
321
+ await (0, import_async.setTimeoutAsync)(Math.min(quietRemaining, deadline - now));
322
+ }
323
+ } finally {
324
+ for (const eventRef of eventRefs) {
325
+ this.app.vault.offref(eventRef);
326
+ }
327
+ }
328
+ }
329
+ }
330
+ function formatCommit(commit) {
331
+ return `${commit.subject} (${commit.date}, ${commit.sha.slice(0, SHORT_SHA_LENGTH)})`;
332
+ }
333
+ // Annotate the CommonJS export names for ESM import in node:
334
+ 0 && (module.exports = {
335
+ BulkOperationCommitComponent
336
+ });
337
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9jb21wb25lbnRzL2J1bGstb3BlcmF0aW9uLWNvbW1pdC1jb21wb25lbnQudHMiXSwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAZmlsZVxuICpcbiAqIENvbnRhaW5zIGNsYXNzIHtAbGluayBCdWxrT3BlcmF0aW9uQ29tbWl0Q29tcG9uZW50fSB0aGF0IHdyYXBzIGEgcGx1Z2luJ3MgYnVsayBvcGVyYXRpb25zIGluIGdpdCBjb21taXRzLCBzb1xuICogYGdpdCByZXZlcnRgIHVuZG9lcyBvbmUuXG4gKi9cblxuaW1wb3J0IHR5cGUge1xuICBBcHAsXG4gIEV2ZW50UmVmXG59IGZyb20gJ29ic2lkaWFuJztcbmltcG9ydCB0eXBlIHsgUHJvbWlzYWJsZSB9IGZyb20gJ3R5cGUtZmVzdCc7XG5cbmltcG9ydCB7XG4gIGludm9rZUFzeW5jU2FmZWx5LFxuICBzZXRUaW1lb3V0QXN5bmNcbn0gZnJvbSAnQG1uYW91bW92L3R5cGVzY3JpcHQtbGliL2FzeW5jJztcbmltcG9ydCB7IGVycm9yVG9TdHJpbmcgfSBmcm9tICdAbW5hb3Vtb3YvdHlwZXNjcmlwdC1saWIvZXJyb3InO1xuaW1wb3J0IHsgZW5zdXJlTm9uTnVsbGFibGUgfSBmcm9tICdAbW5hb3Vtb3YvdHlwZXNjcmlwdC1saWIvdHlwZS1ndWFyZHMnO1xuaW1wb3J0IHtcbiAgRmlsZVN5c3RlbUFkYXB0ZXIsXG4gIFBsYXRmb3JtXG59IGZyb20gJ29ic2lkaWFuJztcblxuaW1wb3J0IHR5cGUgeyBCdWxrT3BlcmF0aW9uQ29tbWl0IH0gZnJvbSAnLi4vYnVsay1vcGVyYXRpb24udHMnO1xuaW1wb3J0IHR5cGUgeyBCdWxrT3BlcmF0aW9uR2l0UmVwbyB9IGZyb20gJy4uL2Rlc2t0b3AtYnVsay1vcGVyYXRpb24tZ2l0LnRzJztcbmltcG9ydCB0eXBlIHsgUGx1Z2luTm90aWNlQ29tcG9uZW50IH0gZnJvbSAnLi9wbHVnaW4tbm90aWNlLWNvbXBvbmVudC50cyc7XG5cbmltcG9ydCB7IHJlcG9ydEJ1bGtPcGVyYXRpb25Qcm9ncmVzcyB9IGZyb20gJy4uL2J1bGstb3BlcmF0aW9uLXByb2dyZXNzLnRzJztcbmltcG9ydCB7IGdldE9ic2lkaWFuTGliRGVidWdnZXIgfSBmcm9tICcuLi9kZWJ1Zy50cyc7XG5pbXBvcnQgeyB3YWl0Rm9yUGVuZGluZ0xpbmtVcGRhdGVzIH0gZnJvbSAnLi4vZmlsZS1tYW5hZ2VyLnRzJztcbmltcG9ydCB7IHQgfSBmcm9tICcuLi9pMThuL2kxOG4udHMnO1xuaW1wb3J0IHsgZW5zdXJlTWV0YWRhdGFDYWNoZVJlYWR5IH0gZnJvbSAnLi4vbWV0YWRhdGEtY2FjaGUudHMnO1xuaW1wb3J0IHsgc2VsZWN0SXRlbSB9IGZyb20gJy4uL21vZGFscy9zZWxlY3QtaXRlbS50cyc7XG5pbXBvcnQgeyBmbHVzaFF1ZXVlIH0gZnJvbSAnLi4vcXVldWUudHMnO1xuaW1wb3J0IHsgQ29tcG9uZW50RXggfSBmcm9tICcuL2NvbXBvbmVudC1leC50cyc7XG5cbi8qKlxuICogQ29uc3RydWN0b3IgcGFyYW1ldGVycyBmb3Ige0BsaW5rIEJ1bGtPcGVyYXRpb25Db21taXRDb21wb25lbnR9LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEJ1bGtPcGVyYXRpb25Db21taXRDb21wb25lbnRDb25zdHJ1Y3RvclBhcmFtcyB7XG4gIC8qKlxuICAgKiBUaGUgT2JzaWRpYW4gYXBwIGluc3RhbmNlLlxuICAgKi9cbiAgcmVhZG9ubHkgYXBwOiBBcHA7XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdGhlIHBsdWdpbidzIG9wdC1pbiBzZXR0aW5nIGZvciBidWxrLW9wZXJhdGlvbiBjb21taXRzIGlzIG9uLiBSZWFkIG9uIGV2ZXJ5IG9wZXJhdGlvbiwgc28gYSBzZXR0aW5nc1xuICAgKiBjaGFuZ2UgYXBwbGllcyB0byB0aGUgbmV4dCBvbmUuXG4gICAqL1xuICByZWFkb25seSBpc0VuYWJsZWQ6ICgpID0+IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFRoZSBsb25nZXN0IHRoZSBzZXR0bGUgc3RlcCB3YWl0cyBmb3IgdGhlIHZhdWx0IHRvIGdvIHF1aWV0IGFmdGVyIGFuIG9wZXJhdGlvbi5cbiAgICpcbiAgICogQGRlZmF1bHQgYDYwXzAwMGBcbiAgICovXG4gIHJlYWRvbmx5IG1heFNldHRsZVRpbWVJbk1pbGxpc2Vjb25kcz86IG51bWJlcjtcblxuICAvKipcbiAgICogVGhlIGlkIG9mIHRoZSBwbHVnaW4gd2hvc2Ugb3BlcmF0aW9ucyBhcmUgY29tbWl0dGVkLlxuICAgKi9cbiAgcmVhZG9ubHkgcGx1Z2luSWQ6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIG5vdGljZSBjb21wb25lbnQgdXNlZCB0byByZXBvcnQgcHJvYmxlbXMuXG4gICAqL1xuICByZWFkb25seSBwbHVnaW5Ob3RpY2VDb21wb25lbnQ6IFBsdWdpbk5vdGljZUNvbXBvbmVudDtcblxuICAvKipcbiAgICogSG93IGxvbmcgdGhlIHZhdWx0IG11c3QgZ28gd2l0aG91dCBhIGNoYW5nZSBhZnRlciBhbiBvcGVyYXRpb24gYmVmb3JlIGl0cyBjb21taXQgaXMgbWFkZS5cbiAgICpcbiAgICogQGRlZmF1bHQgYDIwMDBgXG4gICAqL1xuICByZWFkb25seSBxdWlldFBlcmlvZEluTWlsbGlzZWNvbmRzPzogbnVtYmVyO1xufVxuXG4vKipcbiAqIFBhcmFtZXRlcnMgZm9yIHtAbGluayBCdWxrT3BlcmF0aW9uQ29tbWl0Q29tcG9uZW50LnJ1bkJ1bGtPcGVyYXRpb259LlxuICpcbiAqIEB0eXBlUGFyYW0gVCAtIFRoZSB0eXBlIG9mIHRoZSBvcGVyYXRpb24ncyByZXN1bHQuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQnVsa09wZXJhdGlvbkNvbW1pdENvbXBvbmVudFJ1bkJ1bGtPcGVyYXRpb25QYXJhbXM8VD4ge1xuICAvKipcbiAgICogUnVucyB0aGUgYnVsayBvcGVyYXRpb24uXG4gICAqXG4gICAqIEByZXR1cm5zIFRoZSBvcGVyYXRpb24ncyByZXN1bHQuXG4gICAqL1xuICByZWFkb25seSBvcGVyYXRpb246ICgpID0+IFByb21pc2FibGU8VD47XG5cbiAgLyoqXG4gICAqIEEgb25lLWxpbmUgZGVzY3JpcHRpb24gb2YgdGhlIG9wZXJhdGlvbiwgdXNlZCBpbiB0aGUgY29tbWl0IHN1YmplY3QsIHN1Y2ggYXMgYENvbGxlY3QgYXR0YWNobWVudHMgaW4gTm90ZXNgLlxuICAgKi9cbiAgcmVhZG9ubHkgc3VtbWFyeTogc3RyaW5nO1xufVxuXG5jb25zdCBERUZBVUxUX01BWF9TRVRUTEVfVElNRV9JTl9NSUxMSVNFQ09ORFMgPSA2MF8wMDA7XG5jb25zdCBERUZBVUxUX1FVSUVUX1BFUklPRF9JTl9NSUxMSVNFQ09ORFMgPSAyMDAwO1xuY29uc3QgU0hPUlRfU0hBX0xFTkdUSCA9IDg7XG5cbi8qKlxuICogV3JhcHMgYSBwbHVnaW4ncyBidWxrIG9wZXJhdGlvbnMgaW4gZ2l0IGNvbW1pdHMsIHNvIGBnaXQgcmV2ZXJ0YCBvZiBvbmUgY29tbWl0IHVuZG9lcyBvbmUgb3BlcmF0aW9uLlxuICpcbiAqIEByZW1hcmtzXG4gKiBPcHQtaW4gdGhyb3VnaCB0aGUgcGx1Z2luJ3Mgb3duIHNldHRpbmcsIGFuZCBhY3RpdmUgb25seSBvbiBkZXNrdG9wLCBmb3IgYSB2YXVsdCBpbnNpZGUgYSBnaXQgd29yayB0cmVlLiBXaGVuIGl0XG4gKiBpcyBub3QgYWN0aXZlLCB7QGxpbmsgcnVuQnVsa09wZXJhdGlvbn0gc2ltcGx5IHJ1bnMgdGhlIG9wZXJhdGlvbi4gV2hlbiBpdCBpcywgdGhlIG9wZXJhdGlvbiBydW5zIGJldHdlZW4gYVxuICogYGNob3JlOiBiZWZvcmUgT1A8bj5gIGNvbW1pdCBvZiB3aGF0ZXZlciB3YXMgcGVuZGluZyBhbmQgYW4gYE9QPG4+OiA8c3VtbWFyeT5gIGNvbW1pdCBvZiB3aGF0IGl0IGNoYW5nZWQsIHVuZGVyXG4gKiBhIGxlYXNlIGxvY2sgaW4gdGhlIHJlcG8ncyBnaXQgZGlyZWN0b3J5IHRoYXQgdGhlIHNjaGVkdWxlZCB2YXVsdCBhdXRvY29tbWl0IGhvbm9ycy4gVGhlIGxvY2sncyBoZWFydGJlYXRcbiAqIGlzIHJlZnJlc2hlZCBieSB0aGUgb3BlcmF0aW9uJ3MgcHJvZ3Jlc3M6IGV2ZXJ5IGBsb29wKClgIGl0ZW0sIG9yIGFuIGV4cGxpY2l0IGByZXBvcnRCdWxrT3BlcmF0aW9uUHJvZ3Jlc3MoKWAuXG4gKlxuICogT24gbG9hZCBpdCByZWNvdmVycyBhIGxvY2sgbGVmdCBzdGFsZSBieSBhIGNyYXNoLCBjb21taXR0aW5nIHRoZSBsZWZ0b3ZlcnMgYXMgYE9QPG4+IGludGVycnVwdGVkYC5cbiAqXG4gKiBQYWlyIGl0IHdpdGggYFVuZG9CdWxrT3BlcmF0aW9uQ29tbWFuZEhhbmRsZXJgLCB3aGljaCBsaXN0cyB0aGUgcGx1Z2luJ3Mgb3BlcmF0aW9ucyBhbmQgcmV2ZXJ0cyBvbmUuXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHRzXG4gKiB0aGlzLmJ1bGtPcGVyYXRpb25Db21taXRDb21wb25lbnQgPSB0aGlzLmFkZENoaWxkKG5ldyBCdWxrT3BlcmF0aW9uQ29tbWl0Q29tcG9uZW50KHtcbiAqICAgYXBwOiB0aGlzLmFwcCxcbiAqICAgaXNFbmFibGVkOiAoKSA9PiB0aGlzLnNldHRpbmdzLnNob3VsZENvbW1pdEJ1bGtPcGVyYXRpb25zLFxuICogICBwbHVnaW5JZDogdGhpcy5tYW5pZmVzdC5pZCxcbiAqICAgcGx1Z2luTm90aWNlQ29tcG9uZW50OiB0aGlzLnBsdWdpbk5vdGljZUNvbXBvbmVudFxuICogfSkpO1xuICpcbiAqIGF3YWl0IHRoaXMuYnVsa09wZXJhdGlvbkNvbW1pdENvbXBvbmVudC5ydW5CdWxrT3BlcmF0aW9uKHtcbiAqICAgb3BlcmF0aW9uOiAoKSA9PiBjb2xsZWN0QXR0YWNobWVudHNJbkZvbGRlcihmb2xkZXIpLFxuICogICBzdW1tYXJ5OiBgQ29sbGVjdCBhdHRhY2htZW50cyBpbiAke2ZvbGRlci5wYXRofWBcbiAqIH0pO1xuICogYGBgXG4gKi9cbmV4cG9ydCBjbGFzcyBCdWxrT3BlcmF0aW9uQ29tbWl0Q29tcG9uZW50IGV4dGVuZHMgQ29tcG9uZW50RXgge1xuICAvKipcbiAgICogVGhlIE9ic2lkaWFuIGFwcCBpbnN0YW5jZS5cbiAgICovXG4gIHByb3RlY3RlZCByZWFkb25seSBhcHA6IEFwcDtcblxuICAvKipcbiAgICogV2hldGhlciB0aGUgcGx1Z2luJ3Mgb3B0LWluIHNldHRpbmcgaXMgb24uXG4gICAqL1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgaXNFbmFibGVkOiAoKSA9PiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBUaGUgaWQgb2YgdGhlIHBsdWdpbiB3aG9zZSBvcGVyYXRpb25zIGFyZSBjb21taXR0ZWQuXG4gICAqL1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgcGx1Z2luSWQ6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIG5vdGljZSBjb21wb25lbnQgdXNlZCB0byByZXBvcnQgcHJvYmxlbXMuXG4gICAqL1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgcGx1Z2luTm90aWNlQ29tcG9uZW50OiBQbHVnaW5Ob3RpY2VDb21wb25lbnQ7XG5cbiAgcHJpdmF0ZSByZWFkb25seSBtYXhTZXR0bGVUaW1lSW5NaWxsaXNlY29uZHM6IG51bWJlcjtcbiAgcHJpdmF0ZSByZWFkb25seSBxdWlldFBlcmlvZEluTWlsbGlzZWNvbmRzOiBudW1iZXI7XG4gIHByaXZhdGUgcmVwb1Byb21pc2U6IG51bGwgfCBQcm9taXNlPEJ1bGtPcGVyYXRpb25HaXRSZXBvIHwgbnVsbD4gPSBudWxsO1xuXG4gIC8qKlxuICAgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLlxuICAgKlxuICAgKiBAcGFyYW0gcGFyYW1zIC0gVGhlIGNvbnN0cnVjdG9yIHBhcmFtZXRlcnMuXG4gICAqL1xuICBwdWJsaWMgY29uc3RydWN0b3IocGFyYW1zOiBCdWxrT3BlcmF0aW9uQ29tbWl0Q29tcG9uZW50Q29uc3RydWN0b3JQYXJhbXMpIHtcbiAgICBzdXBlcigpO1xuICAgIHRoaXMuYXBwID0gcGFyYW1zLmFwcDtcbiAgICB0aGlzLmlzRW5hYmxlZCA9IHBhcmFtcy5pc0VuYWJsZWQ7XG4gICAgdGhpcy5wbHVnaW5JZCA9IHBhcmFtcy5wbHVnaW5JZDtcbiAgICB0aGlzLnBsdWdpbk5vdGljZUNvbXBvbmVudCA9IHBhcmFtcy5wbHVnaW5Ob3RpY2VDb21wb25lbnQ7XG4gICAgdGhpcy5tYXhTZXR0bGVUaW1lSW5NaWxsaXNlY29uZHMgPSBwYXJhbXMubWF4U2V0dGxlVGltZUluTWlsbGlzZWNvbmRzID8/IERFRkFVTFRfTUFYX1NFVFRMRV9USU1FX0lOX01JTExJU0VDT05EUztcbiAgICB0aGlzLnF1aWV0UGVyaW9kSW5NaWxsaXNlY29uZHMgPSBwYXJhbXMucXVpZXRQZXJpb2RJbk1pbGxpc2Vjb25kcyA/PyBERUZBVUxUX1FVSUVUX1BFUklPRF9JTl9NSUxMSVNFQ09ORFM7XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2tzIHdoZXRoZXIgYnVsayBvcGVyYXRpb25zIGFyZSBjdXJyZW50bHkgY29tbWl0dGVkOiB0aGUgc2V0dGluZyBpcyBvbiwgdGhlIGFwcCBpcyBkZXNrdG9wIGFuZCB0aGUgdmF1bHQgaXNcbiAgICogaW5zaWRlIGEgZ2l0IHdvcmsgdHJlZS5cbiAgICpcbiAgICogQHJldHVybnMgV2hldGhlciBidWxrIG9wZXJhdGlvbnMgYXJlIGNvbW1pdHRlZC5cbiAgICovXG4gIHB1YmxpYyBhc3luYyBjaGVja0FjdGl2ZSgpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICByZXR1cm4gYXdhaXQgdGhpcy5nZXRSZXBvKCkgIT09IG51bGw7XG4gIH1cblxuICAvKipcbiAgICogUmVjb3ZlcnMgYSBzdGFsZSBsb2NrIGxlZnQgYnkgYSBjcmFzaGVkIG9wZXJhdGlvbiBvbmNlIHRoZSBjb21wb25lbnQgbG9hZHMuXG4gICAqL1xuICBwdWJsaWMgb3ZlcnJpZGUgb25sb2FkKCk6IHZvaWQge1xuICAgIHN1cGVyLm9ubG9hZCgpO1xuICAgIGludm9rZUFzeW5jU2FmZWx5KCgpID0+IHRoaXMucmVjb3ZlclN0YWxlTG9jaygpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIGEgYnVsayBvcGVyYXRpb24sIHdyYXBwZWQgaW4gZ2l0IGNvbW1pdHMgd2hlbiBidWxrLW9wZXJhdGlvbiBjb21taXRzIGFyZSBhY3RpdmUuXG4gICAqXG4gICAqIEB0eXBlUGFyYW0gVCAtIFRoZSB0eXBlIG9mIHRoZSBvcGVyYXRpb24ncyByZXN1bHQuXG4gICAqIEBwYXJhbSBwYXJhbXMgLSBUaGUgcGFyYW1ldGVycy5cbiAgICogQHJldHVybnMgVGhlIG9wZXJhdGlvbidzIHJlc3VsdC5cbiAgICovXG4gIHB1YmxpYyBhc3luYyBydW5CdWxrT3BlcmF0aW9uPFQ+KHBhcmFtczogQnVsa09wZXJhdGlvbkNvbW1pdENvbXBvbmVudFJ1bkJ1bGtPcGVyYXRpb25QYXJhbXM8VD4pOiBQcm9taXNlPFQ+IHtcbiAgICBjb25zdCByZXBvID0gYXdhaXQgdGhpcy5nZXRSZXBvKCk7XG4gICAgaWYgKCFyZXBvKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcGFyYW1zLm9wZXJhdGlvbigpO1xuICAgIH1cblxuICAgIGNvbnN0IHsgY29tbWl0U2hhLCBvcGVyYXRpb25JZCwgcmVzdWx0IH0gPSBhd2FpdCByZXBvLnJ1bkJ1bGtPcGVyYXRpb24oe1xuICAgICAgb3BlcmF0aW9uOiBhc3luYyAoKSA9PiBhd2FpdCBwYXJhbXMub3BlcmF0aW9uKCksXG4gICAgICBwbHVnaW5JZDogdGhpcy5wbHVnaW5JZCxcbiAgICAgIHNldHRsZTogKCkgPT4gdGhpcy5zZXR0bGUoKSxcbiAgICAgIHN1bW1hcnk6IHBhcmFtcy5zdW1tYXJ5XG4gICAgfSk7XG4gICAgZ2V0T2JzaWRpYW5MaWJEZWJ1Z2dlcignQnVsa09wZXJhdGlvbkNvbW1pdENvbXBvbmVudCcpKFxuICAgICAgY29tbWl0U2hhID09PSBudWxsID8gYCR7b3BlcmF0aW9uSWR9IGNoYW5nZWQgbm90aGluZ2AgOiBgJHtvcGVyYXRpb25JZH0gY29tbWl0dGVkIGFzICR7Y29tbWl0U2hhfWBcbiAgICApO1xuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICAvKipcbiAgICogTGV0cyB0aGUgdXNlciBwaWNrIG9uZSBvZiB0aGUgcGx1Z2luJ3MgYnVsayBvcGVyYXRpb25zIGFuZCByZXZlcnRzIGl0cyBjb21taXQuXG4gICAqXG4gICAqIEEgY29uZmxpY3QgaXMgcmVwb3J0ZWQgYW5kIGxlZnQgZm9yIHRoZSB1c2VyIHRvIHJlc29sdmU7IHRoZSByZXZlcnQgaXMgbmV2ZXIgYWJvcnRlZC5cbiAgICpcbiAgICogQHBhcmFtIG9wZXJhdGlvbklkIC0gVGhlIG9wZXJhdGlvbiB0byB1bmRvLCBzdWNoIGFzIGBPUDEyYC4gV2hlbiBvbWl0dGVkLCB0aGUgdXNlciBwaWNrcyBmcm9tIGV2ZXJ5IG9wZXJhdGlvblxuICAgKiBvZiB0aGUgcGx1Z2luLiBXaGVuIHR3byBjb21taXRzIHNoYXJlIHRoZSBpZCAodHdvIG1hY2hpbmVzIG1pbnRlZCBpdCBiZWZvcmUgc3luY2luZyksIHRoZSB1c2VyIHBpY2tzIGJldHdlZW5cbiAgICogdGhlbS5cbiAgICovXG4gIHB1YmxpYyBhc3luYyB1bmRvQnVsa09wZXJhdGlvbihvcGVyYXRpb25JZD86IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHJlcG8gPSBhd2FpdCB0aGlzLmdldFJlcG8oKTtcbiAgICBpZiAoIXJlcG8pIHtcbiAgICAgIHRoaXMucGx1Z2luTm90aWNlQ29tcG9uZW50LnNob3dOb3RpY2UodCgoJCkgPT4gJC5vYnNpZGlhbkxpYi5idWxrT3BlcmF0aW9uLm5vdEFjdGl2ZSkpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGxldCBjb21taXRzID0gYXdhaXQgcmVwby5saXN0QnVsa09wZXJhdGlvbkNvbW1pdHModGhpcy5wbHVnaW5JZCk7XG4gICAgaWYgKG9wZXJhdGlvbklkICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGNvbW1pdHMgPSBjb21taXRzLmZpbHRlcigoY29tbWl0KSA9PiBjb21taXQub3BlcmF0aW9uSWQgPT09IG9wZXJhdGlvbklkKTtcbiAgICB9XG5cbiAgICBpZiAoY29tbWl0cy5sZW5ndGggPT09IDApIHtcbiAgICAgIHRoaXMucGx1Z2luTm90aWNlQ29tcG9uZW50LnNob3dOb3RpY2UodCgoJCkgPT4gJC5vYnNpZGlhbkxpYi5idWxrT3BlcmF0aW9uLm5vT3BlcmF0aW9ucykpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IGNvbW1pdCA9IGNvbW1pdHMubGVuZ3RoID09PSAxICYmIG9wZXJhdGlvbklkICE9PSB1bmRlZmluZWRcbiAgICAgID8gZW5zdXJlTm9uTnVsbGFibGUoY29tbWl0c1swXSlcbiAgICAgIDogYXdhaXQgc2VsZWN0SXRlbSh7XG4gICAgICAgIGFwcDogdGhpcy5hcHAsXG4gICAgICAgIGl0ZW1zOiBjb21taXRzLFxuICAgICAgICBpdGVtVGV4dEZ1bmN0aW9uOiBmb3JtYXRDb21taXQsXG4gICAgICAgIHBsYWNlaG9sZGVyOiB0KCgkKSA9PiAkLm9ic2lkaWFuTGliLmJ1bGtPcGVyYXRpb24uc2VsZWN0T3BlcmF0aW9uKVxuICAgICAgfSk7XG4gICAgaWYgKCFjb21taXQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBsZXQgcmV2ZXJ0UmVzdWx0O1xuICAgIHRyeSB7XG4gICAgICByZXZlcnRSZXN1bHQgPSBhd2FpdCByZXBvLnJldmVydEJ1bGtPcGVyYXRpb25Db21taXQoY29tbWl0KTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgdGhpcy5wbHVnaW5Ob3RpY2VDb21wb25lbnQuc2hvd05vdGljZShcbiAgICAgICAgdCgoJCkgPT4gJC5vYnNpZGlhbkxpYi5idWxrT3BlcmF0aW9uLnJldmVydEZhaWxlZCwgeyBlcnJvcjogZXJyb3JUb1N0cmluZyhlcnJvciksIG9wZXJhdGlvbklkOiBjb21taXQub3BlcmF0aW9uSWQgfSlcbiAgICAgICk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKHJldmVydFJlc3VsdC5pc0NvbmZsaWN0KSB7XG4gICAgICB0aGlzLnBsdWdpbk5vdGljZUNvbXBvbmVudC5zaG93Tm90aWNlKHQoKCQpID0+ICQub2JzaWRpYW5MaWIuYnVsa09wZXJhdGlvbi5yZXZlcnRDb25mbGljdCwgeyBvcGVyYXRpb25JZDogY29tbWl0Lm9wZXJhdGlvbklkIH0pLCB7XG4gICAgICAgIGlzUGVybWFuZW50OiB0cnVlXG4gICAgICB9KTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLnBsdWdpbk5vdGljZUNvbXBvbmVudC5zaG93Tm90aWNlKHQoKCQpID0+ICQub2JzaWRpYW5MaWIuYnVsa09wZXJhdGlvbi5yZXZlcnRlZCwgeyBvcGVyYXRpb25JZDogY29tbWl0Lm9wZXJhdGlvbklkIH0pKTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgZmluZFJlcG8oKTogUHJvbWlzZTxCdWxrT3BlcmF0aW9uR2l0UmVwbyB8IG51bGw+IHtcbiAgICBpZiAoIVBsYXRmb3JtLmlzRGVza3RvcEFwcCkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIGNvbnN0IGFkYXB0ZXIgPSB0aGlzLmFwcC52YXVsdC5hZGFwdGVyO1xuICAgIGlmICghKGFkYXB0ZXIgaW5zdGFuY2VvZiBGaWxlU3lzdGVtQWRhcHRlcikpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICAvLyBDb25kaXRpb25hbCBpbXBvcnQgb2YgdGhlIGRlc2t0b3Atb25seSBnaXQgbGF5ZXI7IHRoaXMgcnVucyBvbmx5IG9uIGRlc2t0b3AsIGtlZXBpbmcgaXRzIE5vZGUgYnVpbHRpbnMgb2ZmXG4gICAgLy8gdGhlIG1vYmlsZSBsb2FkIHBhdGguXG4gICAgY29uc3QgeyBCdWxrT3BlcmF0aW9uR2l0UmVwbzogR2l0UmVwbyB9ID0gYXdhaXQgaW1wb3J0KCcuLi9kZXNrdG9wLWJ1bGstb3BlcmF0aW9uLWdpdC50cycpO1xuICAgIHJldHVybiBhd2FpdCBHaXRSZXBvLm9wZW4oYWRhcHRlci5nZXRCYXNlUGF0aCgpKTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgZ2V0UmVwbygpOiBQcm9taXNlPEJ1bGtPcGVyYXRpb25HaXRSZXBvIHwgbnVsbD4ge1xuICAgIGlmICghdGhpcy5pc0VuYWJsZWQoKSkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIHRoaXMucmVwb1Byb21pc2UgPz89IHRoaXMuZmluZFJlcG8oKTtcbiAgICByZXR1cm4gYXdhaXQgdGhpcy5yZXBvUHJvbWlzZTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgcmVjb3ZlclN0YWxlTG9jaygpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCByZXBvID0gYXdhaXQgdGhpcy5nZXRSZXBvKCk7XG4gICAgaWYgKCFyZXBvKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IG9wZXJhdGlvbklkID0gYXdhaXQgcmVwby5yZWNvdmVyU3RhbGVMb2NrKCk7XG4gICAgaWYgKG9wZXJhdGlvbklkICE9PSBudWxsKSB7XG4gICAgICB0aGlzLnBsdWdpbk5vdGljZUNvbXBvbmVudC5zaG93Tm90aWNlKHQoKCQpID0+ICQub2JzaWRpYW5MaWIuYnVsa09wZXJhdGlvbi5yZWNvdmVyZWRJbnRlcnJ1cHRlZCwgeyBvcGVyYXRpb25JZCB9KSk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBzZXR0bGUoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgYXdhaXQgZmx1c2hRdWV1ZSgpO1xuICAgIGF3YWl0IHdhaXRGb3JQZW5kaW5nTGlua1VwZGF0ZXModGhpcy5hcHApO1xuICAgIGF3YWl0IGVuc3VyZU1ldGFkYXRhQ2FjaGVSZWFkeSh0aGlzLmFwcCk7XG4gICAgYXdhaXQgdGhpcy53YWl0Rm9yUXVpZXRWYXVsdCgpO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyB3YWl0Rm9yUXVpZXRWYXVsdCgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBsZXQgbGFzdENoYW5nZUF0ID0gcGVyZm9ybWFuY2Uubm93KCk7XG4gICAgY29uc3QgZGVhZGxpbmUgPSBsYXN0Q2hhbmdlQXQgKyB0aGlzLm1heFNldHRsZVRpbWVJbk1pbGxpc2Vjb25kcztcbiAgICBmdW5jdGlvbiBvbkNoYW5nZSgpOiB2b2lkIHtcbiAgICAgIGxhc3RDaGFuZ2VBdCA9IHBlcmZvcm1hbmNlLm5vdygpO1xuICAgIH1cbiAgICBjb25zdCBldmVudFJlZnM6IEV2ZW50UmVmW10gPSBbXG4gICAgICB0aGlzLmFwcC52YXVsdC5vbignY3JlYXRlJywgb25DaGFuZ2UpLFxuICAgICAgdGhpcy5hcHAudmF1bHQub24oJ2RlbGV0ZScsIG9uQ2hhbmdlKSxcbiAgICAgIHRoaXMuYXBwLnZhdWx0Lm9uKCdtb2RpZnknLCBvbkNoYW5nZSksXG4gICAgICB0aGlzLmFwcC52YXVsdC5vbigncmVuYW1lJywgb25DaGFuZ2UpXG4gICAgXTtcbiAgICB0cnkge1xuICAgICAgZm9yICg7Oykge1xuICAgICAgICBjb25zdCBub3cgPSBwZXJmb3JtYW5jZS5ub3coKTtcbiAgICAgICAgY29uc3QgcXVpZXRSZW1haW5pbmcgPSBsYXN0Q2hhbmdlQXQgKyB0aGlzLnF1aWV0UGVyaW9kSW5NaWxsaXNlY29uZHMgLSBub3c7XG4gICAgICAgIGlmIChxdWlldFJlbWFpbmluZyA8PSAwIHx8IG5vdyA+PSBkZWFkbGluZSkge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICByZXBvcnRCdWxrT3BlcmF0aW9uUHJvZ3Jlc3MoKTtcbiAgICAgICAgYXdhaXQgc2V0VGltZW91dEFzeW5jKE1hdGgubWluKHF1aWV0UmVtYWluaW5nLCBkZWFkbGluZSAtIG5vdykpO1xuICAgICAgfVxuICAgIH0gZmluYWxseSB7XG4gICAgICBmb3IgKGNvbnN0IGV2ZW50UmVmIG9mIGV2ZW50UmVmcykge1xuICAgICAgICB0aGlzLmFwcC52YXVsdC5vZmZyZWYoZXZlbnRSZWYpO1xuICAgICAgfVxuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBmb3JtYXRDb21taXQoY29tbWl0OiBCdWxrT3BlcmF0aW9uQ29tbWl0KTogc3RyaW5nIHtcbiAgcmV0dXJuIGAke2NvbW1pdC5zdWJqZWN0fSAoJHtjb21taXQuZGF0ZX0sICR7Y29tbWl0LnNoYS5zbGljZSgwLCBTSE9SVF9TSEFfTEVOR1RIKX0pYDtcbn1cbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFhQSxtQkFHTztBQUNQLG1CQUE4QjtBQUM5Qix5QkFBa0M7QUFDbEMsc0JBR087QUFNUCxxQ0FBNEM7QUFDNUMsbUJBQXVDO0FBQ3ZDLDBCQUEwQztBQUMxQyxrQkFBa0I7QUFDbEIsNEJBQXlDO0FBQ3pDLHlCQUEyQjtBQUMzQixtQkFBMkI7QUFDM0IsMEJBQTRCO0FBNkQ1QixNQUFNLDBDQUEwQztBQUNoRCxNQUFNLHVDQUF1QztBQUM3QyxNQUFNLG1CQUFtQjtBQStCbEIsTUFBTSxxQ0FBcUMsZ0NBQVk7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQUl6QztBQUFBO0FBQUE7QUFBQTtBQUFBLEVBS0E7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQUtBO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFLQTtBQUFBLEVBRUY7QUFBQSxFQUNBO0FBQUEsRUFDVCxjQUEyRDtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQU81RCxZQUFZLFFBQXVEO0FBQ3hFLFVBQU07QUFDTixTQUFLLE1BQU0sT0FBTztBQUNsQixTQUFLLFlBQVksT0FBTztBQUN4QixTQUFLLFdBQVcsT0FBTztBQUN2QixTQUFLLHdCQUF3QixPQUFPO0FBQ3BDLFNBQUssOEJBQThCLE9BQU8sK0JBQStCO0FBQ3pFLFNBQUssNEJBQTRCLE9BQU8sNkJBQTZCO0FBQUEsRUFDdkU7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQVFBLE1BQWEsY0FBZ0M7QUFDM0MsV0FBTyxNQUFNLEtBQUssUUFBUSxNQUFNO0FBQUEs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