obsidian-dev-utils 101.6.0 → 101.7.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.
- package/CHANGELOG.md +5 -0
- package/dist/integration-test-plugin/main.js +4410 -3705
- package/dist/lib/cjs/__merged.cjs +26 -1
- package/dist/lib/cjs/__merged.d.cts +4 -1
- package/dist/lib/cjs/generated-during-build.cjs +1 -1
- package/dist/lib/cjs/obsidian/components/component-ex.cjs +14 -1
- package/dist/lib/cjs/obsidian/components/component-ex.d.cts +11 -0
- package/dist/lib/cjs/obsidian/components/index.cjs +4 -1
- package/dist/lib/cjs/obsidian/components/index.d.cts +1 -0
- package/dist/lib/cjs/obsidian/components/plugin-gate-component.cjs +520 -0
- package/dist/lib/cjs/obsidian/components/plugin-gate-component.d.cts +299 -0
- package/dist/lib/cjs/obsidian/components/plugin-suggestion-component.cjs +17 -38
- package/dist/lib/cjs/obsidian/components/plugin-suggestion-component.d.cts +25 -18
- package/dist/lib/cjs/obsidian/components/rename-delete-handler-component.cjs +7 -2
- package/dist/lib/cjs/obsidian/css-class.cjs +3 -1
- package/dist/lib/cjs/obsidian/css-class.d.cts +9 -0
- package/dist/lib/cjs/obsidian/html-element.cjs +27 -3
- package/dist/lib/cjs/obsidian/html-element.d.cts +36 -0
- package/dist/lib/cjs/obsidian/i18n/locales/en.cjs +15 -1
- package/dist/lib/cjs/obsidian/i18n/locales/en.d.cts +14 -0
- package/dist/lib/cjs/obsidian/i18n/locales/translations-map.d.cts +14 -0
- package/dist/lib/cjs/obsidian/plugin/index.cjs +7 -1
- package/dist/lib/cjs/obsidian/plugin/index.d.cts +2 -0
- package/dist/lib/cjs/obsidian/plugin/plugin-api.cjs +2 -2
- package/dist/lib/cjs/obsidian/plugin/plugin-api.d.cts +34 -15
- package/dist/lib/cjs/obsidian/plugin/plugin-install-state.cjs +208 -0
- package/dist/lib/cjs/obsidian/plugin/plugin-install-state.d.cts +113 -0
- package/dist/lib/cjs/obsidian/plugin/plugin-lifecycle-events.cjs +161 -0
- package/dist/lib/cjs/obsidian/plugin/plugin-lifecycle-events.d.cts +119 -0
- package/dist/lib/cjs/obsidian/plugin/plugin.cjs +241 -21
- package/dist/lib/cjs/obsidian/plugin/plugin.d.cts +133 -4
- package/dist/lib/esm/__merged.d.mts +4 -1
- package/dist/lib/esm/__merged.mjs +30 -2
- package/dist/lib/esm/generated-during-build.mjs +1 -1
- package/dist/lib/esm/obsidian/components/component-ex.d.mts +11 -0
- package/dist/lib/esm/obsidian/components/component-ex.mjs +14 -1
- package/dist/lib/esm/obsidian/components/index.d.mts +1 -0
- package/dist/lib/esm/obsidian/components/index.mjs +3 -1
- package/dist/lib/esm/obsidian/components/plugin-gate-component.d.mts +299 -0
- package/dist/lib/esm/obsidian/components/plugin-gate-component.mjs +428 -0
- package/dist/lib/esm/obsidian/components/plugin-suggestion-component.d.mts +25 -18
- package/dist/lib/esm/obsidian/components/plugin-suggestion-component.mjs +21 -41
- package/dist/lib/esm/obsidian/components/rename-delete-handler-component.mjs +7 -2
- package/dist/lib/esm/obsidian/css-class.d.mts +9 -0
- package/dist/lib/esm/obsidian/css-class.mjs +3 -1
- package/dist/lib/esm/obsidian/html-element.d.mts +36 -0
- package/dist/lib/esm/obsidian/html-element.mjs +24 -2
- package/dist/lib/esm/obsidian/i18n/locales/en.d.mts +14 -0
- package/dist/lib/esm/obsidian/i18n/locales/en.mjs +15 -1
- package/dist/lib/esm/obsidian/i18n/locales/translations-map.d.mts +14 -0
- package/dist/lib/esm/obsidian/plugin/index.d.mts +2 -0
- package/dist/lib/esm/obsidian/plugin/index.mjs +5 -1
- package/dist/lib/esm/obsidian/plugin/plugin-api.d.mts +34 -15
- package/dist/lib/esm/obsidian/plugin/plugin-api.mjs +2 -2
- package/dist/lib/esm/obsidian/plugin/plugin-install-state.d.mts +113 -0
- package/dist/lib/esm/obsidian/plugin/plugin-install-state.mjs +106 -0
- package/dist/lib/esm/obsidian/plugin/plugin-lifecycle-events.d.mts +119 -0
- package/dist/lib/esm/obsidian/plugin/plugin-lifecycle-events.mjs +54 -0
- package/dist/lib/esm/obsidian/plugin/plugin.d.mts +133 -4
- package/dist/lib/esm/obsidian/plugin/plugin.mjs +245 -21
- package/obsidian/components/plugin-gate-component/package.json +6 -0
- package/obsidian/plugin/plugin-install-state/package.json +6 -0
- package/obsidian/plugin/plugin-lifecycle-events/package.json +6 -0
- package/package.json +1 -1
|
@@ -57,13 +57,20 @@ import { ConsoleDebugComponent } from "../components/console-debug-component.mjs
|
|
|
57
57
|
import { MenuEventRegistrarComponent } from "../components/menu-event-registrar-component.mjs";
|
|
58
58
|
import { NotebookNavigatorMenuEventRegistrarComponent } from "../components/notebook-navigator-menu-event-registrar-component.mjs";
|
|
59
59
|
import { PluginContextComponent } from "../components/plugin-context-component.mjs";
|
|
60
|
+
import { PluginGateComponent } from "../components/plugin-gate-component.mjs";
|
|
60
61
|
import { PluginNoticeComponent } from "../components/plugin-notice-component.mjs";
|
|
61
62
|
import { PluginSettingsComponentBase } from "../components/plugin-settings-component.mjs";
|
|
62
63
|
import { PluginDataHandler } from "../data-handler.mjs";
|
|
63
64
|
import { initI18N } from "../i18n/i18n.mjs";
|
|
64
65
|
import { defaultTranslationsMap } from "../i18n/locales/translations-map.mjs";
|
|
65
66
|
import { ResourceLockComponent } from "../resource-lock.mjs";
|
|
67
|
+
import { publishPluginApi } from "./plugin-api.mjs";
|
|
66
68
|
import { PluginEventSourceImpl } from "./plugin-event-source.mjs";
|
|
69
|
+
import {
|
|
70
|
+
PLUGIN_LOADED_EVENT_NAME,
|
|
71
|
+
PLUGIN_UNLOADED_EVENT_NAME,
|
|
72
|
+
triggerPluginLifecycleEvent
|
|
73
|
+
} from "./plugin-lifecycle-events.mjs";
|
|
67
74
|
class PluginBase extends mixinAsyncEvents()(Plugin) {
|
|
68
75
|
/**
|
|
69
76
|
* Gets abort signal component.
|
|
@@ -148,6 +155,26 @@ class PluginBase extends mixinAsyncEvents()(Plugin) {
|
|
|
148
155
|
set pluginContextComponent(value) {
|
|
149
156
|
this.setComponent("pluginContextComponent", value);
|
|
150
157
|
}
|
|
158
|
+
/**
|
|
159
|
+
* Gets the gate holding the plugin's feature surface up or down.
|
|
160
|
+
*
|
|
161
|
+
* Reach for it from a settings tab to render the overlap banner for a
|
|
162
|
+
* {@link obsidian/components/plugin-gate-component!PluginConflictSeverity.Warn} conflict — the one
|
|
163
|
+
* banner the library cannot place itself, because a running plugin builds its own settings tab.
|
|
164
|
+
*
|
|
165
|
+
* @returns The plugin gate component.
|
|
166
|
+
*/
|
|
167
|
+
get pluginGateComponent() {
|
|
168
|
+
return ensureNonNullable(this.components.pluginGateComponent);
|
|
169
|
+
}
|
|
170
|
+
/**
|
|
171
|
+
* Sets the plugin gate component.
|
|
172
|
+
*
|
|
173
|
+
* @param value - The plugin gate component.
|
|
174
|
+
*/
|
|
175
|
+
set pluginGateComponent(value) {
|
|
176
|
+
this.setComponent("pluginGateComponent", value);
|
|
177
|
+
}
|
|
151
178
|
/**
|
|
152
179
|
* Gets plugin notice component.
|
|
153
180
|
*
|
|
@@ -198,20 +225,45 @@ class PluginBase extends mixinAsyncEvents()(Plugin) {
|
|
|
198
225
|
this.setComponent("resourceLockComponent", value);
|
|
199
226
|
}
|
|
200
227
|
components = {};
|
|
201
|
-
|
|
228
|
+
// Everything the SUBCLASS owns: what `onloadImpl` adds, and what it adds later.
|
|
229
|
+
//
|
|
230
|
+
// A second wrapper rather than one, because the two tiers have opposite lifetimes. The universal
|
|
231
|
+
// Components have to OUTLIVE a lost dependency — they are what shows the notice naming the plugin that
|
|
232
|
+
// Went away and renders the button that brings it back — while the subclass's surface is exactly what
|
|
233
|
+
// Must stop running. Unloading one wrapper holding both would silence the plugin at the moment it most
|
|
234
|
+
// Needs to speak.
|
|
235
|
+
//
|
|
236
|
+
// Always present, never null, and REPLACED rather than emptied when the surface is torn down. That keeps
|
|
237
|
+
// `addChild` callable at every point in the plugin's life, exactly as it was before the tiers existed:
|
|
238
|
+
// A child added before the gate opens is queued and loaded when it does, which is what `ComponentEx`
|
|
239
|
+
// Already does for any child added to a not-yet-loaded component.
|
|
240
|
+
gatedWrapperComponent = new ComponentEx();
|
|
241
|
+
// The payload broadcast when this plugin finished loading, kept so the matching unloaded broadcast
|
|
242
|
+
// Describes the same plugin without re-deriving it from a surface that has since been torn down. Null
|
|
243
|
+
// Whenever no loaded broadcast is outstanding, which is what keeps the two events paired.
|
|
244
|
+
lifecycleEventPayload = null;
|
|
245
|
+
// The library's own components, which outlive any dependency.
|
|
246
|
+
universalWrapperComponent = new ComponentEx();
|
|
202
247
|
/**
|
|
203
248
|
* Adds a child component.
|
|
204
249
|
*
|
|
205
|
-
* The child is added to
|
|
206
|
-
* before
|
|
207
|
-
* children-first, and is usable by the time this method returns.
|
|
250
|
+
* The child is added to the internal wrapper holding the subclass's own surface, which {@link onload}
|
|
251
|
+
* creates and loads before calling {@link onloadImpl}. So a child added during {@link onloadImpl} is
|
|
252
|
+
* loaded immediately, children-first, and is usable by the time this method returns.
|
|
253
|
+
*
|
|
254
|
+
* That wrapper is torn down and rebuilt whenever the gate closes and opens again — a dependency declared
|
|
255
|
+
* by {@link getPluginDependencies} going away and coming back, or a conflict declared by
|
|
256
|
+
* {@link getPluginConflicts} appearing and being resolved — so a child added here lives exactly as long
|
|
257
|
+
* as the plugin's feature surface does. Adding one while the surface is down is still legitimate — it is
|
|
258
|
+
* queued and loaded when the surface next comes up, the way {@link ComponentEx.addChild} already queues
|
|
259
|
+
* a child added to a not-yet-loaded component.
|
|
208
260
|
*
|
|
209
261
|
* @typeParam TComponent - The type of component to add.
|
|
210
262
|
* @param component - The component instance to add.
|
|
211
263
|
* @returns The added component.
|
|
212
264
|
*/
|
|
213
265
|
addChild(component) {
|
|
214
|
-
return this.
|
|
266
|
+
return this.gatedWrapperComponent.addChild(component);
|
|
215
267
|
}
|
|
216
268
|
/**
|
|
217
269
|
* Called when the external settings change.
|
|
@@ -233,38 +285,38 @@ class PluginBase extends mixinAsyncEvents()(Plugin) {
|
|
|
233
285
|
*/
|
|
234
286
|
async onload() {
|
|
235
287
|
try {
|
|
236
|
-
super.addChild(this.
|
|
237
|
-
this.
|
|
288
|
+
super.addChild(this.universalWrapperComponent);
|
|
289
|
+
this.universalWrapperComponent.load();
|
|
238
290
|
await initI18N(this.createTranslationsMap());
|
|
239
|
-
this.pluginContextComponent = this.
|
|
291
|
+
this.pluginContextComponent = this.addUniversalChild(
|
|
240
292
|
new PluginContextComponent({
|
|
241
293
|
app: this.app,
|
|
242
294
|
pluginId: this.manifest.id
|
|
243
295
|
})
|
|
244
296
|
);
|
|
245
|
-
this.pluginNoticeComponent = this.
|
|
297
|
+
this.pluginNoticeComponent = this.addUniversalChild(
|
|
246
298
|
new PluginNoticeComponent({
|
|
247
299
|
app: this.app,
|
|
248
300
|
pluginName: this.manifest.name
|
|
249
301
|
})
|
|
250
302
|
);
|
|
251
|
-
this.asyncErrorHandlerComponent = this.
|
|
252
|
-
this.abortSignalComponent = this.
|
|
253
|
-
this.consoleDebugComponent = this.
|
|
254
|
-
this.resourceLockComponent = this.
|
|
255
|
-
const notebookNavigatorMenuEventRegistrarComponent = this.
|
|
303
|
+
this.asyncErrorHandlerComponent = this.addUniversalChild(new AsyncErrorHandlerComponent(this.pluginNoticeComponent));
|
|
304
|
+
this.abortSignalComponent = this.addUniversalChild(new AbortSignalComponent(this.manifest.id));
|
|
305
|
+
this.consoleDebugComponent = this.addUniversalChild(new ConsoleDebugComponent(this.manifest.id));
|
|
306
|
+
this.resourceLockComponent = this.addUniversalChild(new ResourceLockComponent(this.app, this.manifest.id));
|
|
307
|
+
const notebookNavigatorMenuEventRegistrarComponent = this.addUniversalChild(
|
|
256
308
|
new NotebookNavigatorMenuEventRegistrarComponent({
|
|
257
309
|
app: this.app,
|
|
258
310
|
pluginName: this.manifest.name,
|
|
259
311
|
submenuIcon: this.getNotebookNavigatorMenuSubmenuIcon()
|
|
260
312
|
})
|
|
261
313
|
);
|
|
262
|
-
this.commandHandlerComponent = this.
|
|
314
|
+
this.commandHandlerComponent = this.addUniversalChild(
|
|
263
315
|
new CommandHandlerComponent({
|
|
264
316
|
activeFileProvider: new AppActiveFileProvider(this.app),
|
|
265
317
|
additionalMenuEventRegistrars: [notebookNavigatorMenuEventRegistrarComponent],
|
|
266
318
|
commandRegistrar: new PluginCommandRegistrar(this),
|
|
267
|
-
menuEventRegistrar: this.
|
|
319
|
+
menuEventRegistrar: this.addUniversalChild(new MenuEventRegistrarComponent(this.app)),
|
|
268
320
|
pluginName: this.manifest.name
|
|
269
321
|
})
|
|
270
322
|
);
|
|
@@ -274,20 +326,43 @@ class PluginBase extends mixinAsyncEvents()(Plugin) {
|
|
|
274
326
|
resourceLockComponent: this.resourceLockComponent
|
|
275
327
|
})
|
|
276
328
|
]);
|
|
277
|
-
this.pluginSettingsComponent = this.
|
|
329
|
+
this.pluginSettingsComponent = this.addUniversalChild(
|
|
278
330
|
new PluginSettingsComponentBase({
|
|
279
331
|
dataHandler: new PluginDataHandler(this),
|
|
280
332
|
pluginEventSource: new PluginEventSourceImpl(this),
|
|
281
333
|
pluginSettingsClass: Object
|
|
282
334
|
})
|
|
283
335
|
);
|
|
284
|
-
|
|
285
|
-
|
|
336
|
+
this.pluginGateComponent = this.addUniversalChild(
|
|
337
|
+
new PluginGateComponent({
|
|
338
|
+
conflicts: this.getPluginConflicts(),
|
|
339
|
+
dependencies: this.getPluginDependencies(),
|
|
340
|
+
loadFeatureSurface: () => this.loadFeatureSurface(),
|
|
341
|
+
plugin: this,
|
|
342
|
+
pluginNoticeComponent: this.pluginNoticeComponent,
|
|
343
|
+
unloadFeatureSurface: () => {
|
|
344
|
+
this.unloadFeatureSurface();
|
|
345
|
+
}
|
|
346
|
+
})
|
|
347
|
+
);
|
|
348
|
+
await this.universalWrapperComponent.loadWithPromises();
|
|
286
349
|
} catch (error) {
|
|
287
350
|
printError(new Error(`Error loading plugin ${this.manifest.name} (${this.manifest.id})`, { cause: error }));
|
|
288
351
|
throw error;
|
|
289
352
|
}
|
|
290
353
|
}
|
|
354
|
+
/**
|
|
355
|
+
* Called when the plugin is unloaded.
|
|
356
|
+
*
|
|
357
|
+
* Announces the departure on `app.workspace` so anything depending on this plugin learns of it at the
|
|
358
|
+
* moment it happens, rather than discovering it later through behavior that quietly stopped.
|
|
359
|
+
*
|
|
360
|
+
* Do NOT override this method; put teardown on a component instead, which unloads with the plugin.
|
|
361
|
+
*/
|
|
362
|
+
onunload() {
|
|
363
|
+
this.broadcastUnloaded();
|
|
364
|
+
super.onunload();
|
|
365
|
+
}
|
|
291
366
|
/**
|
|
292
367
|
* Removes a child component.
|
|
293
368
|
*
|
|
@@ -296,7 +371,10 @@ class PluginBase extends mixinAsyncEvents()(Plugin) {
|
|
|
296
371
|
* @returns The removed component.
|
|
297
372
|
*/
|
|
298
373
|
removeChild(component) {
|
|
299
|
-
|
|
374
|
+
if (this.gatedWrapperComponent.hasChild(component)) {
|
|
375
|
+
return this.gatedWrapperComponent.removeChild(component);
|
|
376
|
+
}
|
|
377
|
+
return this.universalWrapperComponent.removeChild(component);
|
|
300
378
|
}
|
|
301
379
|
/**
|
|
302
380
|
* Provides the translations map used to initialize i18n during {@link onload}.
|
|
@@ -321,6 +399,68 @@ class PluginBase extends mixinAsyncEvents()(Plugin) {
|
|
|
321
399
|
getNotebookNavigatorMenuSubmenuIcon() {
|
|
322
400
|
return "";
|
|
323
401
|
}
|
|
402
|
+
/**
|
|
403
|
+
* Provides the APIs this plugin exposes to other plugins.
|
|
404
|
+
*
|
|
405
|
+
* Override in subclass to publish one. The default publishes none. Called after {@link onloadImpl}, so a
|
|
406
|
+
* declaration may reference anything it created; the returned declarations are published through
|
|
407
|
+
* `publishPluginApi` and revoked when the plugin's feature surface unloads.
|
|
408
|
+
*
|
|
409
|
+
* Returning a LIST rather than a single API is deliberate: the registry supports several contract
|
|
410
|
+
* versions published side by side, which is how a provider ships a breaking `2.0.0` without stranding
|
|
411
|
+
* consumers still pinned to `^1`.
|
|
412
|
+
*
|
|
413
|
+
* Every declaration here is published BEFORE the `obsidian-dev-utils:plugin-loaded` broadcast, which is
|
|
414
|
+
* what lets a listener call these APIs the moment it hears that event.
|
|
415
|
+
*
|
|
416
|
+
* @returns The API declarations.
|
|
417
|
+
*/
|
|
418
|
+
getPluginApis() {
|
|
419
|
+
return [];
|
|
420
|
+
}
|
|
421
|
+
/**
|
|
422
|
+
* Provides the plugins this one refuses, or warns about, running beside.
|
|
423
|
+
*
|
|
424
|
+
* Override in subclass to declare an overlap. The default declares none.
|
|
425
|
+
*
|
|
426
|
+
* A `Block` conflict is the mirror image of a dependency: while a conflicting plugin is enabled at a
|
|
427
|
+
* conflicting version, {@link onloadImpl} does not run at all and the plugin registers nothing. Declare
|
|
428
|
+
* it when both plugins acting on the same operation damages the vault — there is no reliable way to win
|
|
429
|
+
* that race, because whichever plugin loaded first keeps a hand on the wheel, so refusing deterministically
|
|
430
|
+
* beats competing unpredictably. A `Warn` conflict declares an overlap that is merely annoying, such as a
|
|
431
|
+
* duplicated command: both plugins keep running and the user is told.
|
|
432
|
+
*
|
|
433
|
+
* Unlike a dependency, a conflicting plugin need not publish anything — it is detected by reading its
|
|
434
|
+
* installed version, which is the only thing about another plugin that reads the same regardless of load
|
|
435
|
+
* order.
|
|
436
|
+
*
|
|
437
|
+
* @returns The declared conflicts.
|
|
438
|
+
*/
|
|
439
|
+
getPluginConflicts() {
|
|
440
|
+
return [];
|
|
441
|
+
}
|
|
442
|
+
/**
|
|
443
|
+
* Provides the plugins this one cannot work without.
|
|
444
|
+
*
|
|
445
|
+
* Override in subclass to declare a mandatory dependency. The default declares none, and such a plugin
|
|
446
|
+
* loads exactly as it always has.
|
|
447
|
+
*
|
|
448
|
+
* A declared dependency is MANDATORY, unlike the offer `PluginSuggestionComponent` makes: while one is
|
|
449
|
+
* missing, disabled, or too old, {@link onloadImpl} does not run at all and the plugin registers nothing
|
|
450
|
+
* — no commands, no handlers, no patches. It stays enabled in Obsidian's list rather than disabling
|
|
451
|
+
* itself, because the enabled set is the user's to change, and it explains itself through a notice and a
|
|
452
|
+
* settings banner that installs the missing plugin in one click. The load completes the moment the
|
|
453
|
+
* dependency arrives, with no restart.
|
|
454
|
+
*
|
|
455
|
+
* A dependency must publish an API through `publishPluginApi`, which is what makes its presence,
|
|
456
|
+
* absence, version and departure all observable through one mechanism. A plugin with nothing to expose
|
|
457
|
+
* can publish an empty API purely so it can be depended upon.
|
|
458
|
+
*
|
|
459
|
+
* @returns The declared dependencies.
|
|
460
|
+
*/
|
|
461
|
+
getPluginDependencies() {
|
|
462
|
+
return [];
|
|
463
|
+
}
|
|
324
464
|
/**
|
|
325
465
|
* Called during {@link onload} to wire plugin-specific child components.
|
|
326
466
|
*
|
|
@@ -343,6 +483,81 @@ class PluginBase extends mixinAsyncEvents()(Plugin) {
|
|
|
343
483
|
* @param key - The key of the component to store.
|
|
344
484
|
* @param value - The component to store.
|
|
345
485
|
*/
|
|
486
|
+
/**
|
|
487
|
+
* Adds a component to the universal tier, which outlives any dependency.
|
|
488
|
+
*
|
|
489
|
+
* Private on purpose: only this class decides what is universal. A subclass adding one of its own goes
|
|
490
|
+
* through {@link addChild} and lands in the gated tier, where it belongs.
|
|
491
|
+
*
|
|
492
|
+
* @typeParam TComponent - The type of component to add.
|
|
493
|
+
* @param component - The component instance to add.
|
|
494
|
+
* @returns The added component.
|
|
495
|
+
*/
|
|
496
|
+
addUniversalChild(component) {
|
|
497
|
+
return this.universalWrapperComponent.addChild(component);
|
|
498
|
+
}
|
|
499
|
+
/**
|
|
500
|
+
* Announces on `app.workspace` that this plugin is loaded and its APIs are callable.
|
|
501
|
+
*/
|
|
502
|
+
broadcastLoaded() {
|
|
503
|
+
this.lifecycleEventPayload = {
|
|
504
|
+
apiVersions: this.getPluginApis().map((declaration) => declaration.apiVersion),
|
|
505
|
+
dependencyPluginIds: this.getPluginDependencies().map((dependency) => dependency.pluginId),
|
|
506
|
+
pluginId: this.manifest.id,
|
|
507
|
+
pluginName: this.manifest.name,
|
|
508
|
+
pluginVersion: this.manifest.version
|
|
509
|
+
};
|
|
510
|
+
triggerPluginLifecycleEvent({
|
|
511
|
+
app: this.app,
|
|
512
|
+
name: PLUGIN_LOADED_EVENT_NAME,
|
|
513
|
+
payload: this.lifecycleEventPayload
|
|
514
|
+
});
|
|
515
|
+
}
|
|
516
|
+
/**
|
|
517
|
+
* Announces on `app.workspace` that this plugin's surface has gone away.
|
|
518
|
+
*
|
|
519
|
+
* Silent unless a loaded broadcast is outstanding, so the two events stay paired: a plugin that never
|
|
520
|
+
* got past its dependency gate never announced itself, and must not announce a departure either.
|
|
521
|
+
*/
|
|
522
|
+
broadcastUnloaded() {
|
|
523
|
+
const payload = this.lifecycleEventPayload;
|
|
524
|
+
if (!payload) {
|
|
525
|
+
return;
|
|
526
|
+
}
|
|
527
|
+
this.lifecycleEventPayload = null;
|
|
528
|
+
triggerPluginLifecycleEvent({
|
|
529
|
+
app: this.app,
|
|
530
|
+
name: PLUGIN_UNLOADED_EVENT_NAME,
|
|
531
|
+
payload
|
|
532
|
+
});
|
|
533
|
+
}
|
|
534
|
+
/**
|
|
535
|
+
* Builds and loads the subclass's feature surface, then publishes its APIs and announces itself.
|
|
536
|
+
*
|
|
537
|
+
* NOT idempotent, deliberately. `PluginGateComponent` owns the up/down state machine and calls
|
|
538
|
+
* this only on a real transition; a second guard here would be a second copy of that state, which is the
|
|
539
|
+
* kind of duplicate that drifts.
|
|
540
|
+
*
|
|
541
|
+
* @returns A {@link Promise} that resolves once the surface is loaded and the broadcast has been made.
|
|
542
|
+
*/
|
|
543
|
+
async loadFeatureSurface() {
|
|
544
|
+
const gatedWrapperComponent = this.gatedWrapperComponent;
|
|
545
|
+
this.universalWrapperComponent.addChild(gatedWrapperComponent);
|
|
546
|
+
gatedWrapperComponent.load();
|
|
547
|
+
await this.onloadImpl();
|
|
548
|
+
await gatedWrapperComponent.loadWithPromises();
|
|
549
|
+
for (const declaration of this.getPluginApis()) {
|
|
550
|
+
publishPluginApi({
|
|
551
|
+
...declaration,
|
|
552
|
+
// Revoked with the SURFACE, not with the plugin: a plugin whose dependency goes away keeps running
|
|
553
|
+
// Its universal components, and a consumer must not be left holding a handle into the half of it
|
|
554
|
+
// That was just torn down.
|
|
555
|
+
component: gatedWrapperComponent,
|
|
556
|
+
plugin: this
|
|
557
|
+
});
|
|
558
|
+
}
|
|
559
|
+
this.broadcastLoaded();
|
|
560
|
+
}
|
|
346
561
|
setComponent(key, value) {
|
|
347
562
|
const oldComponent = this.components[key];
|
|
348
563
|
if (oldComponent) {
|
|
@@ -350,6 +565,15 @@ class PluginBase extends mixinAsyncEvents()(Plugin) {
|
|
|
350
565
|
}
|
|
351
566
|
this.components[key] = value;
|
|
352
567
|
}
|
|
568
|
+
/**
|
|
569
|
+
* Tears the subclass's feature surface down, leaving the universal components running.
|
|
570
|
+
*/
|
|
571
|
+
unloadFeatureSurface() {
|
|
572
|
+
const gatedWrapperComponent = this.gatedWrapperComponent;
|
|
573
|
+
this.gatedWrapperComponent = new ComponentEx();
|
|
574
|
+
this.universalWrapperComponent.removeChild(gatedWrapperComponent);
|
|
575
|
+
this.broadcastUnloaded();
|
|
576
|
+
}
|
|
353
577
|
}
|
|
354
578
|
async function reloadPlugin(plugin) {
|
|
355
579
|
const plugins = plugin.app.plugins;
|
|
@@ -371,4 +595,4 @@ export {
|
|
|
371
595
|
reloadPlugin,
|
|
372
596
|
showErrorAndDisablePlugin
|
|
373
597
|
};
|
|
374
|
-
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vLi4vLi4vc3JjL29ic2lkaWFuL3BsdWdpbi9wbHVnaW4udHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbIi8qKlxuICogQGZpbGVcbiAqXG4gKiBCYXNlIGNsYXNzIGZvciBPYnNpZGlhbiBwbHVnaW5zIHVzaW5nIGEgY29tcG9uZW50LWJhc2VkIGFyY2hpdGVjdHVyZS5cbiAqXG4gKiBQbHVnaW5CYXNlIHJlZ2lzdGVycyB1bml2ZXJzYWwgY29tcG9uZW50cyAoY29udGV4dCwgaTE4biwgZXJyb3IgaGFuZGxpbmcsIGFib3J0IHNpZ25hbCwgbGlmZWN5Y2xlIGV2ZW50cywgZGVidWcpLlxuICovXG5cbmltcG9ydCB0eXBlIHtcbiAgQ29tcG9uZW50LFxuICBJY29uTmFtZVxufSBmcm9tICdvYnNpZGlhbic7XG5pbXBvcnQgdHlwZSB7IFByb21pc2FibGUgfSBmcm9tICd0eXBlLWZlc3QnO1xuXG5pbXBvcnQgeyBQbHVnaW4gfSBmcm9tICdvYnNpZGlhbic7XG5cbmltcG9ydCB0eXBlIHsgVHJhbnNsYXRpb25zTWFwIH0gZnJvbSAnLi4vaTE4bi9pMThuLnRzJztcbmltcG9ydCB0eXBlIHtcbiAgUGx1Z2luRXZlbnRNYXAsXG4gIFBsdWdpbkV2ZW50U291cmNlXG59IGZyb20gJy4vcGx1Z2luLWV2ZW50LXNvdXJjZS50cyc7XG5cbmltcG9ydCB7IG1peGluQXN5bmNFdmVudHMgfSBmcm9tICcuLi8uLi9hc3luYy1ldmVudHMudHMnO1xuaW1wb3J0IHsgcHJpbnRFcnJvciB9IGZyb20gJy4uLy4uL2Vycm9yLnRzJztcbmltcG9ydCB7IG5vb3BBc3luYyB9IGZyb20gJy4uLy4uL2Z1bmN0aW9uLnRzJztcbmltcG9ydCB7IGVuc3VyZU5vbk51bGxhYmxlIH0gZnJvbSAnLi4vLi4vdHlwZS1ndWFyZHMudHMnO1xuaW1wb3J0IHsgQXBwQWN0aXZlRmlsZVByb3ZpZGVyIH0gZnJvbSAnLi4vYWN0aXZlLWZpbGUtcHJvdmlkZXIudHMnO1xuaW1wb3J0IHsgQ29tbWFuZEhhbmRsZXJDb21wb25lbnQgfSBmcm9tICcuLi9jb21tYW5kLWhhbmRsZXJzL2NvbW1hbmQtaGFuZGxlci1jb21wb25lbnQudHMnO1xuaW1wb3J0IHsgVW5sb2NrQWN0aXZlTm90ZUNvbW1hbmRIYW5kbGVyIH0gZnJvbSAnLi4vY29tbWFuZC1oYW5kbGVycy91bmxvY2stYWN0aXZlLW5vdGUtY29tbWFuZC1oYW5kbGVyLnRzJztcbmltcG9ydCB7IFBsdWdpbkNvbW1hbmRSZWdpc3RyYXIgfSBmcm9tICcuLi9jb21tYW5kLXJlZ2lzdHJhci50cyc7XG5pbXBvcnQgeyBBYm9ydFNpZ25hbENvbXBvbmVudCB9IGZyb20gJy4uL2NvbXBvbmVudHMvYWJvcnQtc2lnbmFsLWNvbXBvbmVudC50cyc7XG5pbXBvcnQgeyBBc3luY0Vycm9ySGFuZGxlckNvbXBvbmVudCB9IGZyb20gJy4uL2NvbXBvbmVudHMvYXN5bmMtZXJyb3ItaGFuZGxlci1jb21wb25lbnQudHMnO1xuaW1wb3J0IHsgQ29tcG9uZW50RXggfSBmcm9tICcuLi9jb21wb25lbnRzL2NvbXBvbmVudC1leC50cyc7XG5pbXBvcnQgeyBDb25zb2xlRGVidWdDb21wb25lbnQgfSBmcm9tICcuLi9jb21wb25lbnRzL2NvbnNvbGUtZGVidWctY29tcG9uZW50LnRzJztcbmltcG9ydCB7IE1lbnVFdmVudFJlZ2lzdHJhckNvbXBvbmVudCB9IGZyb20gJy4uL2NvbXBvbmVudHMvbWVudS1ldmVudC1yZWdpc3RyYXItY29tcG9uZW50LnRzJztcbmltcG9ydCB7IE5vdGVib29rTmF2aWdhdG9yTWVudUV2ZW50UmVnaXN0cmFyQ29tcG9uZW50IH0gZnJvbSAnLi4vY29tcG9uZW50cy9ub3RlYm9vay1uYXZpZ2F0b3ItbWVudS1ldmVudC1yZWdpc3RyYXItY29tcG9uZW50LnRzJztcbmltcG9ydCB7IFBsdWdpbkNvbnRleHRDb21wb25lbnQgfSBmcm9tICcuLi9jb21wb25lbnRzL3BsdWdpbi1jb250ZXh0LWNvbXBvbmVudC50cyc7XG5pbXBvcnQgeyBQbHVnaW5Ob3RpY2VDb21wb25lbnQgfSBmcm9tICcuLi9jb21wb25lbnRzL3BsdWdpbi1ub3RpY2UtY29tcG9uZW50LnRzJztcbmltcG9ydCB7IFBsdWdpblNldHRpbmdzQ29tcG9uZW50QmFzZSB9IGZyb20gJy4uL2NvbXBvbmVudHMvcGx1Z2luLXNldHRpbmdzLWNvbXBvbmVudC50cyc7XG5pbXBvcnQgeyBQbHVnaW5EYXRhSGFuZGxlciB9IGZyb20gJy4uL2RhdGEtaGFuZGxlci50cyc7XG5pbXBvcnQgeyBpbml0STE4TiB9IGZyb20gJy4uL2kxOG4vaTE4bi50cyc7XG5pbXBvcnQgeyBkZWZhdWx0VHJhbnNsYXRpb25zTWFwIH0gZnJvbSAnLi4vaTE4bi9sb2NhbGVzL3RyYW5zbGF0aW9ucy1tYXAudHMnO1xuaW1wb3J0IHsgUmVzb3VyY2VMb2NrQ29tcG9uZW50IH0gZnJvbSAnLi4vcmVzb3VyY2UtbG9jay50cyc7XG5pbXBvcnQgeyBQbHVnaW5FdmVudFNvdXJjZUltcGwgfSBmcm9tICcuL3BsdWdpbi1ldmVudC1zb3VyY2UudHMnO1xuXG4vKipcbiAqIFRoZSB1bml2ZXJzYWwgY29tcG9uZW50cyBvd25lZCBieSB7QGxpbmsgUGx1Z2luQmFzZX0sIGtleWVkIGJ5IHRoZSBuYW1lIG9mIHRoZSBhY2Nlc3NvciBleHBvc2luZ1xuICogZWFjaCBvbmUuIEV2ZXJ5IG1lbWJlciBpcyBvcHRpb25hbCBiZWNhdXNlIGEgY29tcG9uZW50IG9ubHkgZXhpc3RzIG9uY2Uge0BsaW5rIFBsdWdpbkJhc2Uub25sb2FkfVxuICogaGFzIGNyZWF0ZWQgaXQuXG4gKi9cbmludGVyZmFjZSBQbHVnaW5CYXNlQ29tcG9uZW50cyB7XG4gIGFib3J0U2lnbmFsQ29tcG9uZW50PzogQWJvcnRTaWduYWxDb21wb25lbnQ7XG4gIGFzeW5jRXJyb3JIYW5kbGVyQ29tcG9uZW50PzogQXN5bmNFcnJvckhhbmRsZXJDb21wb25lbnQ7XG4gIGNvbW1hbmRIYW5kbGVyQ29tcG9uZW50PzogQ29tbWFuZEhhbmRsZXJDb21wb25lbnQ7XG4gIGNvbnNvbGVEZWJ1Z0NvbXBvbmVudD86IENvbnNvbGVEZWJ1Z0NvbXBvbmVudDtcbiAgcGx1Z2luQ29udGV4dENvbXBvbmVudD86IFBsdWdpbkNvbnRleHRDb21wb25lbnQ7XG4gIHBsdWdpbk5vdGljZUNvbXBvbmVudD86IFBsdWdpbk5vdGljZUNvbXBvbmVudDtcbiAgcGx1Z2luU2V0dGluZ3NDb21wb25lbnQ/OiBQbHVnaW5TZXR0aW5nc0NvbXBvbmVudEJhc2U8b2JqZWN0PjtcbiAgcmVzb3VyY2VMb2NrQ29tcG9uZW50PzogUmVzb3VyY2VMb2NrQ29tcG9uZW50O1xufVxuXG4vKipcbiAqIEJhc2UgY2xhc3MgZm9yIGNyZWF0aW5nIE9ic2lkaWFuIHBsdWdpbnMgd2l0aCBhIGNvbXBvbmVudC1iYXNlZCBhcmNoaXRlY3R1cmUuXG4gKlxuICogUmVnaXN0ZXJzIHVuaXZlcnNhbCBjb21wb25lbnRzIGF1dG9tYXRpY2FsbHkuIFN1YmNsYXNzZXMgYWRkIG9yIHJlcGxhY2UgY29tcG9uZW50c1xuICogdmlhIHtAbGluayByZW1vdmVDaGlsZH0gLyB7QGxpbmsgYWRkQ2hpbGR9LlxuICovXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgUGx1Z2luQmFzZSBleHRlbmRzIG1peGluQXN5bmNFdmVudHM8UGx1Z2luRXZlbnRNYXA+KCkoUGx1Z2luKSBpbXBsZW1lbnRzIFBsdWdpbkV2ZW50U291cmNlIHtcbiAgLyoqXG4gICAqIEdldHMgYWJvcnQgc2lnbmFsIGNvbXBvbmVudC5cbiAgICpcbiAgICogQHJldHVybnMgYWJvcnQgc2lnbmFsIGNvbXBvbmVudC5cbiAgICovXG4gIHByb3RlY3RlZCBnZXQgYWJvcnRTaWduYWxDb21wb25lbnQoKTogQWJvcnRTaWduYWxDb21wb25lbnQge1xuICAgIHJldHVybiBlbnN1cmVOb25OdWxsYWJsZSh0aGlzLmNvbXBvbmVudHMuYWJvcnRTaWduYWxDb21wb25lbnQpO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldHMgYWJvcnQgc2lnbmFsIGNvbXBvbmVudC5cbiAgICpcbiAgICogQHBhcmFtIHZhbHVlIC0gQWJvcnQgc2lnbmFsIGNvbXBvbmVudC5cbiAgICovXG4gIHByb3RlY3RlZCBzZXQgYWJvcnRTaWduYWxDb21wb25lbnQodmFsdWU6IEFib3J0U2lnbmFsQ29tcG9uZW50KSB7XG4gICAgdGhpcy5zZXRDb21wb25lbnQoJ2Fib3J0U2lnbmFsQ29tcG9uZW50JywgdmFsdWUpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldHMgYXN5bmMgZXJyb3IgaGFuZGxlciBjb21wb25lbnQuXG4gICAqXG4gICAqIEByZXR1cm5zIGFzeW5jIGVycm9yIGhhbmRsZXIgY29tcG9uZW50LlxuICAgKi9cbiAgcHJvdGVjdGVkIGdldCBhc3luY0Vycm9ySGFuZGxlckNvbXBvbmVudCgpOiBBc3luY0Vycm9ySGFuZGxlckNvbXBvbmVudCB7XG4gICAgcmV0dXJuIGVuc3VyZU5vbk51bGxhYmxlKHRoaXMuY29tcG9uZW50cy5hc3luY0Vycm9ySGFuZGxlckNvbXBvbmVudCk7XG4gIH1cblxuICAvKipcbiAgICogU2V0cyBhc3luYyBlcnJvciBoYW5kbGVyIGNvbXBvbmVudC5cbiAgICpcbiAgICogQHBhcmFtIHZhbHVlIC0gQXN5bmMgZXJyb3IgaGFuZGxlciBjb21wb25lbnQuXG4gICAqL1xuICBwcm90ZWN0ZWQgc2V0IGFzeW5jRXJyb3JIYW5kbGVyQ29tcG9uZW50KHZhbHVlOiBBc3luY0Vycm9ySGFuZGxlckNvbXBvbmVudCkge1xuICAgIHRoaXMuc2V0Q29tcG9uZW50KCdhc3luY0Vycm9ySGFuZGxlckNvbXBvbmVudCcsIHZhbHVlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXRzIHRoZSBzaGFyZWQgY29tbWFuZCBoYW5kbGVyIGNvbXBvbmVudC4gUmVnaXN0ZXIgYSBwbHVnaW4ncyBjb21tYW5kcyBvbiBpdCB2aWFcbiAgICoge0BsaW5rIENvbW1hbmRIYW5kbGVyQ29tcG9uZW50LnJlZ2lzdGVyQ29tbWFuZEhhbmRsZXJzfSByYXRoZXIgdGhhbiBjb25zdHJ1Y3RpbmcgeW91ciBvd25cbiAgICoge0BsaW5rIENvbW1hbmRIYW5kbGVyQ29tcG9uZW50fSBcdTIwMTQgdGhlIGFwcC1iYWNrZWQgYWN0aXZlLWZpbGUgcHJvdmlkZXIsIGNvbW1hbmQgcmVnaXN0cmFyLCBtZW51XG4gICAqIGV2ZW50IHJlZ2lzdHJhciwgYW5kIHBsdWdpbiBuYW1lIGFyZSBhbHJlYWR5IHdpcmVkLlxuICAgKlxuICAgKiBAcmV0dXJucyBUaGUgY29tbWFuZCBoYW5kbGVyIGNvbXBvbmVudC5cbiAgICovXG4gIHByb3RlY3RlZCBnZXQgY29tbWFuZEhhbmRsZXJDb21wb25lbnQoKTogQ29tbWFuZEhhbmRsZXJDb21wb25lbnQge1xuICAgIHJldHVybiBlbnN1cmVOb25OdWxsYWJsZSh0aGlzLmNvbXBvbmVudHMuY29tbWFuZEhhbmRsZXJDb21wb25lbnQpO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldHMgdGhlIGNvbW1hbmQgaGFuZGxlciBjb21wb25lbnQuXG4gICAqXG4gICAqIEBwYXJhbSB2YWx1ZSAtIFRoZSBjb21tYW5kIGhhbmRsZXIgY29tcG9uZW50LlxuICAgKi9cbiAgcHJvdGVjdGVkIHNldCBjb21tYW5kSGFuZGxlckNvbXBvbmVudCh2YWx1ZTogQ29tbWFuZEhhbmRsZXJDb21wb25lbnQpIHtcbiAgICB0aGlzLnNldENvbXBvbmVudCgnY29tbWFuZEhhbmRsZXJDb21wb25lbnQnLCB2YWx1ZSk7XG4gIH1cblxuICAvKipcbiAgICogR2V0cyBjb25zb2xlIGRlYnVnIGNvbXBvbmVudC5cbiAgICpcbiAgICogQHJldHVybnMgY29uc29sZSBkZWJ1ZyBjb21wb25lbnQuXG4gICAqL1xuICBwcm90ZWN0ZWQgZ2V0IGNvbnNvbGVEZWJ1Z0NvbXBvbmVudCgpOiBDb25zb2xlRGVidWdDb21wb25lbnQge1xuICAgIHJldHVybiBlbnN1cmVOb25OdWxsYWJsZSh0aGlzLmNvbXBvbmVudHMuY29uc29sZURlYnVnQ29tcG9uZW50KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXRzIGNvbnNvbGUgZGVidWcgY29tcG9uZW50LlxuICAgKlxuICAgKiBAcGFyYW0gdmFsdWUgLSBDb25zb2xlIGRlYnVnIGNvbXBvbmVudC5cbiAgICovXG4gIHByb3RlY3RlZCBzZXQgY29uc29sZURlYnVnQ29tcG9uZW50KHZhbHVlOiBDb25zb2xlRGVidWdDb21wb25lbnQpIHtcbiAgICB0aGlzLnNldENvbXBvbmVudCgnY29uc29sZURlYnVnQ29tcG9uZW50JywgdmFsdWUpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldHMgcGx1Z2luIGNvbnRleHQgY29tcG9uZW50IChwbHVnaW4gSUQsIGRlYnVnIGNvbnRyb2xsZXIsIGxpYnJhcnkgc3R5bGVzKS5cbiAgICpcbiAgICogQHJldHVybnMgcGx1Z2luIGNvbnRleHQgY29tcG9uZW50LlxuICAgKi9cbiAgcHJvdGVjdGVkIGdldCBwbHVnaW5Db250ZXh0Q29tcG9uZW50KCk6IFBsdWdpbkNvbnRleHRDb21wb25lbnQge1xuICAgIHJldHVybiBlbnN1cmVOb25OdWxsYWJsZSh0aGlzLmNvbXBvbmVudHMucGx1Z2luQ29udGV4dENvbXBvbmVudCk7XG4gIH1cblxuICAvKipcbiAgICogU2V0cyBwbHVnaW4gY29udGV4dCBjb21wb25lbnQuXG4gICAqXG4gICAqIEBwYXJhbSB2YWx1ZSAtIFBsdWdpbiBjb250ZXh0IGNvbXBvbmVudC5cbiAgICovXG4gIHByb3RlY3RlZCBzZXQgcGx1Z2luQ29udGV4dENvbXBvbmVudCh2YWx1ZTogUGx1Z2luQ29udGV4dENvbXBvbmVudCkge1xuICAgIHRoaXMuc2V0Q29tcG9uZW50KCdwbHVnaW5Db250ZXh0Q29tcG9uZW50JywgdmFsdWUpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldHMgcGx1Z2luIG5vdGljZSBjb21wb25lbnQuXG4gICAqXG4gICAqIEByZXR1cm5zIHBsdWdpbiBub3RpY2UgY29tcG9uZW50LlxuICAgKi9cbiAgcHJvdGVjdGVkIGdldCBwbHVnaW5Ob3RpY2VDb21wb25lbnQoKTogUGx1Z2luTm90aWNlQ29tcG9uZW50IHtcbiAgICByZXR1cm4gZW5zdXJlTm9uTnVsbGFibGUodGhpcy5jb21wb25lbnRzLnBsdWdpbk5vdGljZUNvbXBvbmVudCk7XG4gIH1cblxuICAvKipcbiAgICogU2V0cyBwbHVnaW4gbm90aWNlIGNvbXBvbmVudC5cbiAgICpcbiAgICogQHBhcmFtIHZhbHVlIC0gUGx1Z2luIG5vdGljZSBjb21wb25lbnQuXG4gICAqL1xuICBwcm90ZWN0ZWQgc2V0IHBsdWdpbk5vdGljZUNvbXBvbmVudCh2YWx1ZTogUGx1Z2luTm90aWNlQ29tcG9uZW50KSB7XG4gICAgdGhpcy5zZXRDb21wb25lbnQoJ3BsdWdpbk5vdGljZUNvbXBvbmVudCcsIHZhbHVlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXRzIHBsdWdpbiBzZXR0aW5ncyBjb21wb25lbnQuXG4gICAqXG4gICAqIEByZXR1cm5zIHBsdWdpbiBzZXR0aW5ncyBjb21wb25lbnQuXG4gICAqL1xuICBwcm90ZWN0ZWQgZ2V0IHBsdWdpblNldHRpbmdzQ29tcG9uZW50KCk6IFBsdWdpblNldHRpbmdzQ29tcG9uZW50QmFzZTxvYmplY3Q+IHtcbiAgICByZXR1cm4gZW5zdXJlTm9uTnVsbGFibGUodGhpcy5jb21wb25lbnRzLnBsdWdpblNldHRpbmdzQ29tcG9uZW50KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXRzIHBsdWdpbiBzZXR0aW5ncyBjb21wb25lbnQuXG4gICAqXG4gICAqIEBwYXJhbSB2YWx1ZSAtIFBsdWdpbiBzZXR0aW5ncyBjb21wb25lbnQuXG4gICAqL1xuICBwcm90ZWN0ZWQgc2V0IHBsdWdpblNldHRpbmdzQ29tcG9uZW50KHZhbHVlOiBQbHVnaW5TZXR0aW5nc0NvbXBvbmVudEJhc2U8b2JqZWN0Pikge1xuICAgIHRoaXMuc2V0Q29tcG9uZW50KCdwbHVnaW5TZXR0aW5nc0NvbXBvbmVudCcsIHZhbHVlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXRzIHRoZSBlZGl0b3IgbG9jayBjb21wb25lbnQsIHVzZWQgdG8gbG9jayBub3RlcyByZWFkLW9ubHkgZHVyaW5nIGxvbmcgb3BlcmF0aW9ucy4gT3duZWQgYnlcbiAgICogdGhlIHBsdWdpbiwgc28gaXRzIGxvY2tzIGFyZSByZWxlYXNlZCBhdXRvbWF0aWNhbGx5IHdoZW4gdGhlIHBsdWdpbiB1bmxvYWRzLlxuICAgKlxuICAgKiBAcmV0dXJucyBFZGl0b3IgbG9jayBjb21wb25lbnQuXG4gICAqL1xuICBwcm90ZWN0ZWQgZ2V0IHJlc291cmNlTG9ja0NvbXBvbmVudCgpOiBSZXNvdXJjZUxvY2tDb21wb25lbnQge1xuICAgIHJldHVybiBlbnN1cmVOb25OdWxsYWJsZSh0aGlzLmNvbXBvbmVudHMucmVzb3VyY2VMb2NrQ29tcG9uZW50KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXRzIHRoZSBlZGl0b3IgbG9jayBjb21wb25lbnQuXG4gICAqXG4gICAqIEBwYXJhbSB2YWx1ZSAtIEVkaXRvciBsb2NrIGNvbXBvbmVudC5cbiAgICovXG4gIHByb3RlY3RlZCBzZXQgcmVzb3VyY2VMb2NrQ29tcG9uZW50KHZhbHVlOiBSZXNvdXJjZUxvY2tDb21wb25lbnQpIHtcbiAgICB0aGlzLnNldENvbXBvbmVudCgncmVzb3VyY2VMb2NrQ29tcG9uZW50JywgdmFsdWUpO1xuICB9XG5cbiAgcHJpdmF0ZSByZWFkb25seSBjb21wb25lbnRzOiBQbHVnaW5CYXNlQ29tcG9uZW50cyA9IHt9O1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgd3JhcHBlckNvbXBvbmVudCA9IG5ldyBDb21wb25lbnRFeCgpO1xuXG4gIC8qKlxuICAgKiBBZGRzIGEgY2hpbGQgY29tcG9uZW50LlxuICAgKlxuICAgKiBUaGUgY2hpbGQgaXMgYWRkZWQgdG8gYW4gaW50ZXJuYWwgd3JhcHBlciBjb21wb25lbnQsIHdoaWNoIHtAbGluayBvbmxvYWR9IGF0dGFjaGVzIGFuZCBsb2Fkc1xuICAgKiBiZWZvcmUgd2lyaW5nIGFueXRoaW5nIHVwLiBTbyBhIGNoaWxkIGFkZGVkIGR1cmluZyB7QGxpbmsgb25sb2FkSW1wbH0gaXMgbG9hZGVkIGltbWVkaWF0ZWx5LFxuICAgKiBjaGlsZHJlbi1maXJzdCwgYW5kIGlzIHVzYWJsZSBieSB0aGUgdGltZSB0aGlzIG1ldGhvZCByZXR1cm5zLlxuICAgKlxuICAgKiBAdHlwZVBhcmFtIFRDb21wb25lbnQgLSBUaGUgdHlwZSBvZiBjb21wb25lbnQgdG8gYWRkLlxuICAgKiBAcGFyYW0gY29tcG9uZW50IC0gVGhlIGNvbXBvbmVudCBpbnN0YW5jZSB0byBhZGQuXG4gICAqIEByZXR1cm5zIFRoZSBhZGRlZCBjb21wb25lbnQuXG4gICAqL1xuICBwdWJsaWMgb3ZlcnJpZGUgYWRkQ2hpbGQ8VENvbXBvbmVudCBleHRlbmRzIENvbXBvbmVudD4oY29tcG9uZW50OiBUQ29tcG9uZW50KTogVENvbXBvbmVudCB7XG4gICAgcmV0dXJuIHRoaXMud3JhcHBlckNvbXBvbmVudC5hZGRDaGlsZChjb21wb25lbnQpO1xuICB9XG5cbiAgLyoqXG4gICAqIENhbGxlZCB3aGVuIHRoZSBleHRlcm5hbCBzZXR0aW5ncyBjaGFuZ2UuXG4gICAqXG4gICAqIE92ZXJyaWRlIGluIHN1YmNsYXNzIGlmIG5lZWRlZC4gTWFrZSBzdXJlIHRvIGNhbGwgYGF3YWl0IHN1cGVyLm9uRXh0ZXJuYWxTZXR0aW5nc0NoYW5nZSgpYCBmaXJzdC5cbiAgICovXG4gIHB1YmxpYyBvdmVycmlkZSBhc3luYyBvbkV4dGVybmFsU2V0dGluZ3NDaGFuZ2UoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgYXdhaXQgc3VwZXIub25FeHRlcm5hbFNldHRpbmdzQ2hhbmdlPy4oKTtcbiAgICBhd2FpdCB0aGlzLnRyaWdnZXJBc3luYygnZXh0ZXJuYWxTZXR0aW5nc0NoYW5nZScpO1xuICB9XG5cbiAgLyoqXG4gICAqIENhbGxlZCB3aGVuIHRoZSBwbHVnaW4gaXMgbG9hZGVkLlxuICAgKlxuICAgKiBPcmNoZXN0cmF0ZXMgbG9hZGluZzogcmVnaXN0ZXJzIHRoZSB1bml2ZXJzYWwgY29tcG9uZW50cywgbGV0cyB0aGUgc3ViY2xhc3Mgd2lyZSBpdHMgb3duXG4gICAqIGNvbXBvbmVudHMgdmlhIHtAbGluayBvbmxvYWRJbXBsfSwgdGhlbiBhd2FpdHMgdGhlIGFzeW5jIHRhaWwgb2YgZXZlcnkgbG9hZC5cbiAgICogRWFjaCBjb21wb25lbnQgbG9hZHMgYXMgaXQgaXMgYWRkZWQsIGNoaWxkcmVuLWZpcnN0LlxuICAgKlxuICAgKiBEbyBOT1Qgb3ZlcnJpZGUgdGhpcyBtZXRob2QuIE92ZXJyaWRlIHtAbGluayBvbmxvYWRJbXBsfSBpbnN0ZWFkLlxuICAgKi9cbiAgcHVibGljIG92ZXJyaWRlIGFzeW5jIG9ubG9hZCgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICB0cnkge1xuICAgICAgLy8gVGhlIHdyYXBwZXIgaXMgYXR0YWNoZWQgYW5kIGxvYWRlZCBiZWZvcmUgYW55dGhpbmcgaXMgd2lyZWQgdXAsIHNvIGV2ZXJ5IGBhZGRDaGlsZGAgYmVsb3dcbiAgICAgIC8vIExvYWRzIGl0cyBjaGlsZCBzdHJhaWdodCBhd2F5IHJhdGhlciB0aGFuIHF1ZXVpbmcgaXQuXG4gICAgICAvLyBUaGF0IGlzIHdoYXQgbGV0cyBhIGNvbW1hbmQgaGFuZGxlciByZWdpc3RlciBpdHMgbWVudSBldmVudHMgZnJvbSBgb25SZWdpc3RlcmVkYCwgd2hpY2hcbiAgICAgIC8vIGByZWdpc3RlckNvbW1hbmRIYW5kbGVyc2AgYXdhaXRzIGFuZCB3aGljaCBhIHJlZ2lzdHJhciByZWZ1c2VzIHdoaWxlIHVubG9hZGVkLlxuICAgICAgLy8gQXR0YWNoaW5nIGl0IHVwIGZyb250IGFsc28gcmVnaXN0ZXJzIHRoZSB3cmFwcGVyIGZvciB0ZWFyZG93biBiZWZvcmUgYW55dGhpbmcgY2FuIHRocm93LlxuICAgICAgLy8gVGhlIGxvYWQgaXMgZXhwbGljaXQgcmF0aGVyIHRoYW4gbGVmdCB0byBgYWRkQ2hpbGRgLCB3aGljaCBsb2FkcyB0aGUgY2hpbGQgb25seSB3aGVuIHRoZVxuICAgICAgLy8gUGx1Z2luIGl0c2VsZiBpcyBsb2FkZWQgXHUyMDE0IHRydWUgd2hlbiBPYnNpZGlhbiBjYWxscyBgbG9hZCgpYCwgYnV0IG5vdCB3aGVuIGEgY2FsbGVyIGludm9rZXNcbiAgICAgIC8vIGBvbmxvYWQoKWAgZGlyZWN0bHkuXG4gICAgICBzdXBlci5hZGRDaGlsZCh0aGlzLndyYXBwZXJDb21wb25lbnQpO1xuICAgICAgdGhpcy53cmFwcGVyQ29tcG9uZW50LmxvYWQoKTtcblxuICAgICAgYXdhaXQgaW5pdEkxOE4odGhpcy5jcmVhdGVUcmFuc2xhdGlvbnNNYXAoKSk7XG4gICAgICB0aGlzLnBsdWdpbkNvbnRleHRDb21wb25lbnQgPSB0aGlzLmFkZENoaWxkKFxuICAgICAgICBuZXcgUGx1Z2luQ29udGV4dENvbXBvbmVudCh7XG4gICAgICAgICAgYXBwOiB0aGlzLmFwcCxcbiAgICAgICAgICBwbHVnaW5JZDogdGhpcy5tYW5pZmVzdC5pZFxuICAgICAgICB9KVxuICAgICAgKTtcbiAgICAgIHRoaXMucGx1Z2luTm90aWNlQ29tcG9uZW50ID0gdGhpcy5hZGRDaGlsZChcbiAgICAgICAgbmV3IFBsdWdpbk5vdGljZUNvbXBvbmVudCh7XG4gICAgICAgICAgYXBwOiB0aGlzLmFwcCxcbiAgICAgICAgICBwbHVnaW5OYW1lOiB0aGlzLm1hbmlmZXN0Lm5hbWVcbiAgICAgICAgfSlcbiAgICAgICk7XG4gICAgICB0aGlzLmFzeW5jRXJyb3JIYW5kbGVyQ29tcG9uZW50ID0gdGhpcy5hZGRDaGlsZChuZXcgQXN5bmNFcnJvckhhbmRsZXJDb21wb25lbnQodGhpcy5wbHVnaW5Ob3RpY2VDb21wb25lbnQpKTtcbiAgICAgIHRoaXMuYWJvcnRTaWduYWxDb21wb25lbnQgPSB0aGlzLmFkZENoaWxkKG5ldyBBYm9ydFNpZ25hbENvbXBvbmVudCh0aGlzLm1hbmlmZXN0LmlkKSk7XG4gICAgICB0aGlzLmNvbnNvbGVEZWJ1Z0NvbXBvbmVudCA9IHRoaXMuYWRkQ2hpbGQobmV3IENvbnNvbGVEZWJ1Z0NvbXBvbmVudCh0aGlzLm1hbmlmZXN0LmlkKSk7XG4gICAgICB0aGlzLnJlc291cmNlTG9ja0NvbXBvbmVudCA9IHRoaXMuYWRkQ2hpbGQobmV3IFJlc291cmNlTG9ja0NvbXBvbmVudCh0aGlzLmFwcCwgdGhpcy5tYW5pZmVzdC5pZCkpO1xuICAgICAgLy8gTm90ZWJvb2sgTmF2aWdhdG9yIGRyYXdzIGl0cyBvd24gZmlsZSB0cmVlIGFuZCBuZXZlciByYWlzZXMgT2JzaWRpYW4ncyBgZmlsZS1tZW51YCAvXG4gICAgICAvLyBgZmlsZXMtbWVudWAgZXZlbnRzLCBzbyBldmVyeSBwbHVnaW4ncyBjb250ZXh0LW1lbnUgaXRlbXMgd291bGQgdmFuaXNoIGZvciBhbnlvbmUgYnJvd3NpbmdcbiAgICAgIC8vIFRocm91Z2ggaXQuIFdpcmVkIGhlcmUgcmF0aGVyIHRoYW4gcGVyLXBsdWdpbjogdGhlIGJyaWRnZSBzdGF5cyBkb3JtYW50IHdoZW4gTm90ZWJvb2tcbiAgICAgIC8vIE5hdmlnYXRvciBpcyBub3QgaW5zdGFsbGVkLCBhbmQgYSBwbHVnaW4gd2l0aCBubyBmaWxlL2ZvbGRlciBoYW5kbGVycyBjb250cmlidXRlcyBub3RoaW5nLlxuICAgICAgY29uc3Qgbm90ZWJvb2tOYXZpZ2F0b3JNZW51RXZlbnRSZWdpc3RyYXJDb21wb25lbnQgPSB0aGlzLmFkZENoaWxkKFxuICAgICAgICBuZXcgTm90ZWJvb2tOYXZpZ2F0b3JNZW51RXZlbnRSZWdpc3RyYXJDb21wb25lbnQoe1xuICAgICAgICAgIGFwcDogdGhpcy5hcHAsXG4gICAgICAgICAgcGx1Z2luTmFtZTogdGhpcy5tYW5pZmVzdC5uYW1lLFxuICAgICAgICAgIHN1Ym1lbnVJY29uOiB0aGlzLmdldE5vdGVib29rTmF2aWdhdG9yTWVudVN1Ym1lbnVJY29uKClcbiAgICAgICAgfSlcbiAgICAgICk7XG4gICAgICB0aGlzLmNvbW1hbmRIYW5kbGVyQ29tcG9uZW50ID0gdGhpcy5hZGRDaGlsZChcbiAgICAgICAgbmV3IENvbW1hbmRIYW5kbGVyQ29tcG9uZW50KHtcbiAgICAgICAgICBhY3RpdmVGaWxlUHJvdmlkZXI6IG5ldyBBcHBBY3RpdmVGaWxlUHJvdmlkZXIodGhpcy5hcHApLFxuICAgICAgICAgIGFkZGl0aW9uYWxNZW51RXZlbnRSZWdpc3RyYXJzOiBbbm90ZWJvb2tOYXZpZ2F0b3JNZW51RXZlbnRSZWdpc3RyYXJDb21wb25lbnRdLFxuICAgICAgICAgIGNvbW1hbmRSZWdpc3RyYXI6IG5ldyBQbHVnaW5Db21tYW5kUmVnaXN0cmFyKHRoaXMpLFxuICAgICAgICAgIG1lbnVFdmVudFJlZ2lzdHJhcjogdGhpcy5hZGRDaGlsZChuZXcgTWVudUV2ZW50UmVnaXN0cmFyQ29tcG9uZW50KHRoaXMuYXBwKSksXG4gICAgICAgICAgcGx1Z2luTmFtZTogdGhpcy5tYW5pZmVzdC5uYW1lXG4gICAgICAgIH0pXG4gICAgICApO1xuICAgICAgLy8gQWx3YXlzIGF2YWlsYWJsZTsgdGhlIGNvbW1hbmQncyBvd24gYGNhbkV4ZWN1dGVgIGhpZGVzIGl0IHVubGVzcyB0aGUgYWN0aXZlIG5vdGUgaXMgbG9ja2VkLlxuICAgICAgYXdhaXQgdGhpcy5jb21tYW5kSGFuZGxlckNvbXBvbmVudC5yZWdpc3RlckNvbW1hbmRIYW5kbGVycygoKSA9PiBbXG4gICAgICAgIG5ldyBVbmxvY2tBY3RpdmVOb3RlQ29tbWFuZEhhbmRsZXIoe1xuICAgICAgICAgIGFwcDogdGhpcy5hcHAsXG4gICAgICAgICAgcmVzb3VyY2VMb2NrQ29tcG9uZW50OiB0aGlzLnJlc291cmNlTG9ja0NvbXBvbmVudFxuICAgICAgICB9KVxuICAgICAgXSk7XG5cbiAgICAgIHRoaXMucGx1Z2luU2V0dGluZ3NDb21wb25lbnQgPSB0aGlzLmFkZENoaWxkKFxuICAgICAgICBuZXcgUGx1Z2luU2V0dGluZ3NDb21wb25lbnRCYXNlPG9iamVjdD4oe1xuICAgICAgICAgIGRhdGFIYW5kbGVyOiBuZXcgUGx1Z2luRGF0YUhhbmRsZXIodGhpcyksXG4gICAgICAgICAgcGx1Z2luRXZlbnRTb3VyY2U6IG5ldyBQbHVnaW5FdmVudFNvdXJjZUltcGwodGhpcyksXG4gICAgICAgICAgcGx1Z2luU2V0dGluZ3NDbGFzczogT2JqZWN0XG4gICAgICAgIH0pXG4gICAgICApO1xuXG4gICAgICBhd2FpdCB0aGlzLm9ubG9hZEltcGwoKTtcblxuICAgICAgLy8gRXZlcnkgY2hpbGQgaGFzIGFscmVhZHkgbG9hZGVkIGFzIGl0IHdhcyBhZGRlZDsgdGhpcyBhd2FpdHMgdGhlaXIgYWNjdW11bGF0ZWQgYXN5bmMgdGFpbHMgYW5kXG4gICAgICAvLyBSZXBvcnRzIGFueSBmYWlsdXJlIGFzIGEgc2luZ2xlIGBBZ2dyZWdhdGVFcnJvcmAuXG4gICAgICBhd2FpdCB0aGlzLndyYXBwZXJDb21wb25lbnQubG9hZFdpdGhQcm9taXNlcygpO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBwcmludEVycm9yKG5ldyBFcnJvcihgRXJyb3IgbG9hZGluZyBwbHVnaW4gJHt0aGlzLm1hbmlmZXN0Lm5hbWV9ICgke3RoaXMubWFuaWZlc3QuaWR9KWAsIHsgY2F1c2U6IGVycm9yIH0pKTtcbiAgICAgIHRocm93IGVycm9yO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBSZW1vdmVzIGEgY2hpbGQgY29tcG9uZW50LlxuICAgKlxuICAgKiBAdHlwZVBhcmFtIFRDb21wb25lbnQgLSBUaGUgdHlwZSBvZiBjb21wb25lbnQgdG8gcmVtb3ZlLlxuICAgKiBAcGFyYW0gY29tcG9uZW50IC0gVGhlIGNvbXBvbmVudCBpbnN0YW5jZSB0byByZW1vdmUuXG4gICAqIEByZXR1cm5zIFRoZSByZW1vdmVkIGNvbXBvbmVudC5cbiAgICovXG4gIHB1YmxpYyBvdmVycmlkZSByZW1vdmVDaGlsZDxUQ29tcG9uZW50IGV4dGVuZHMgQ29tcG9uZW50Pihjb21wb25lbnQ6IFRDb21wb25lbnQpOiBUQ29tcG9uZW50IHtcbiAgICByZXR1cm4gdGhpcy53cmFwcGVyQ29tcG9uZW50LnJlbW92ZUNoaWxkKGNvbXBvbmVudCk7XG4gIH1cblxuICAvKipcbiAgICogUHJvdmlkZXMgdGhlIHRyYW5zbGF0aW9ucyBtYXAgdXNlZCB0byBpbml0aWFsaXplIGkxOG4gZHVyaW5nIHtAbGluayBvbmxvYWR9LlxuICAgKlxuICAgKiBPdmVycmlkZSBpbiBzdWJjbGFzcyB0byBzdXBwbHkgcGx1Z2luLXNwZWNpZmljIHRyYW5zbGF0aW9ucy4gVGhlIGRlZmF1bHQgcmV0dXJucyB0aGUgYnVpbHQtaW5cbiAgICogYG9ic2lkaWFuLWRldi11dGlsc2AgdHJhbnNsYXRpb25zLlxuICAgKlxuICAgKiBAcmV0dXJucyBUaGUgdHJhbnNsYXRpb25zIG1hcC5cbiAgICovXG4gIHByb3RlY3RlZCBjcmVhdGVUcmFuc2xhdGlvbnNNYXAoKTogVHJhbnNsYXRpb25zTWFwIHtcbiAgICByZXR1cm4gZGVmYXVsdFRyYW5zbGF0aW9uc01hcDtcbiAgfVxuXG4gIC8qKlxuICAgKiBQcm92aWRlcyB0aGUgaWNvbiBzaG93biBvbiB0aGUgcGx1Z2luJ3MgcGFyZW50IGVudHJ5IGluIE5vdGVib29rIE5hdmlnYXRvcidzIGNvbnRleHQgbWVudXMuXG4gICAqXG4gICAqIE92ZXJyaWRlIGluIHN1YmNsYXNzIHRvIGJyYW5kIHRoYXQgZW50cnk7IHRoZSBkZWZhdWx0IGxlYXZlcyBpdCB3aXRob3V0IGFuIGljb24uIFRoZSBlbnRyeSBpc1xuICAgKiB0aXRsZWQgd2l0aCB0aGUgcGx1Z2luIG5hbWUgYW5kIGlzIGFkZGVkIGF1dG9tYXRpY2FsbHkgXHUyMDE0IHNlZVxuICAgKiB7QGxpbmsgTm90ZWJvb2tOYXZpZ2F0b3JNZW51RXZlbnRSZWdpc3RyYXJDb21wb25lbnR9LlxuICAgKlxuICAgKiBAcmV0dXJucyBUaGUgaWNvbiwgb3IgYCcnYCBmb3Igbm8gaWNvbi5cbiAgICovXG4gIHByb3RlY3RlZCBnZXROb3RlYm9va05hdmlnYXRvck1lbnVTdWJtZW51SWNvbigpOiBJY29uTmFtZSB7XG4gICAgcmV0dXJuICcnO1xuICB9XG5cbiAgLyoqXG4gICAqIENhbGxlZCBkdXJpbmcge0BsaW5rIG9ubG9hZH0gdG8gd2lyZSBwbHVnaW4tc3BlY2lmaWMgY2hpbGQgY29tcG9uZW50cy5cbiAgICpcbiAgICogT3ZlcnJpZGUgaW4gc3ViY2xhc3MgdG8gYWRkIGNoaWxkIGNvbXBvbmVudHMgdmlhIHtAbGluayBhZGRDaGlsZH0uIFRoZSB1bml2ZXJzYWwgY29tcG9uZW50cyBhcmVcbiAgICogYXZhaWxhYmxlIGhlcmUuIENoaWxkcmVuIGFyZSBsb2FkZWQgc2VxdWVudGlhbGx5IGluIHRoZSBvcmRlciB0aGV5IGFyZSBhZGRlZCAoY2hpbGRyZW4tZmlyc3QpLlxuICAgKlxuICAgKiBAcmV0dXJucyBBIHtAbGluayBQcm9taXNlfSB0aGF0IHJlc29sdmVzIHdoZW4gdGhlIHN1YmNsYXNzIGxvYWQgbG9naWMgaXMgY29tcGxldGUuXG4gICAqL1xuICBwcm90ZWN0ZWQgb25sb2FkSW1wbCgpOiBQcm9taXNhYmxlPHZvaWQ+IHtcbiAgICByZXR1cm4gbm9vcEFzeW5jKCk7XG4gIH1cblxuICAvKipcbiAgICogU3RvcmVzIGEgdW5pdmVyc2FsIGNvbXBvbmVudCwgdW5sb2FkaW5nIHdoaWNoZXZlciBjb21wb25lbnQgdGhlIGtleSBoZWxkIGJlZm9yZS5cbiAgICpcbiAgICogS2V5ZWQgYnkgbmFtZSByYXRoZXIgdGhhbiBoYW5kZWQgdGhlIHByZXZpb3VzIHZhbHVlIGJlY2F1c2UgYGtleW9mIHRoaXNgIGV4Y2x1ZGVzIHByaXZhdGVcbiAgICogbWVtYmVycywgc28gdGhlIGNvbXBvbmVudHMgbGl2ZSBpbiBhIHNpbmdsZSB7QGxpbmsgUGx1Z2luQmFzZUNvbXBvbmVudHN9IGJhZyB3aG9zZSBrZXlzIEFSRVxuICAgKiBpbmRleGFibGUuXG4gICAqXG4gICAqIEB0eXBlUGFyYW0gVEtleSAtIFRoZSBrZXkgb2YgdGhlIGNvbXBvbmVudCB0byBzdG9yZS5cbiAgICogQHBhcmFtIGtleSAtIFRoZSBrZXkgb2YgdGhlIGNvbXBvbmVudCB0byBzdG9yZS5cbiAgICogQHBhcmFtIHZhbHVlIC0gVGhlIGNvbXBvbmVudCB0byBzdG9yZS5cbiAgICovXG4gIHByaXZhdGUgc2V0Q29tcG9uZW50PFRLZXkgZXh0ZW5kcyBrZXlvZiBQbHVnaW5CYXNlQ29tcG9uZW50cz4oa2V5OiBUS2V5LCB2YWx1ZTogTm9uTnVsbGFibGU8UGx1Z2luQmFzZUNvbXBvbmVudHNbVEtleV0+KTogdm9pZCB7XG4gICAgY29uc3Qgb2xkQ29tcG9uZW50ID0gdGhpcy5jb21wb25lbnRzW2tleV07XG4gICAgaWYgKG9sZENvbXBvbmVudCkge1xuICAgICAgdGhpcy5yZW1vdmVDaGlsZChvbGRDb21wb25lbnQpO1xuICAgIH1cbiAgICB0aGlzLmNvbXBvbmVudHNba2V5XSA9IHZhbHVlO1xuICB9XG59XG5cbi8qKlxuICogUmVsb2FkcyB0aGUgc3BlY2lmaWVkIHBsdWdpbiBieSBkaXNhYmxpbmcgYW5kIHRoZW4gcmUtZW5hYmxpbmcgaXQuXG4gKlxuICogQHBhcmFtIHBsdWdpbiAtIFRoZSBwbHVnaW4gdG8gcmVsb2FkLlxuICogQHJldHVybnMgQSB7QGxpbmsgUHJvbWlzZX0gdGhhdCByZXNvbHZlcyB3aGVuIHRoZSBwbHVnaW4gaXMgcmVsb2FkZWQuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiByZWxvYWRQbHVnaW4ocGx1Z2luOiBQbHVnaW4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgcGx1Z2lucyA9IHBsdWdpbi5hcHAucGx1Z2lucztcbiAgY29uc3QgcGx1Z2luSWQgPSBwbHVnaW4ubWFuaWZlc3QuaWQ7XG4gIGF3YWl0IHBsdWdpbnMuZGlzYWJsZVBsdWdpbihwbHVnaW5JZCk7XG4gIGF3YWl0IHBsdWdpbnMuZW5hYmxlUGx1Z2luKHBsdWdpbklkKTtcbn1cblxuLyoqXG4gKiBEaXNwbGF5cyBhbiBlcnJvciBtZXNzYWdlIGFzIGEgbm90aWNlLCBsb2dzIGl0IHRvIHRoZSBjb25zb2xlLCBhbmQgZGlzYWJsZXMgdGhlIHNwZWNpZmllZCBwbHVnaW4uXG4gKlxuICogQHBhcmFtIHBsdWdpbiAtIFRoZSBwbHVnaW4gdG8gZGlzYWJsZS5cbiAqIEBwYXJhbSBtZXNzYWdlIC0gVGhlIGVycm9yIG1lc3NhZ2UgdG8gZGlzcGxheSBhbmQgbG9nLlxuICogQHJldHVybnMgQSB7QGxpbmsgUHJvbWlzZX0gdGhhdCByZXNvbHZlcyB3aGVuIHRoZSBwbHVnaW4gaXMgZGlzYWJsZWQuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBzaG93RXJyb3JBbmREaXNhYmxlUGx1Z2luKHBsdWdpbjogUGx1Z2luLCBtZXNzYWdlOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgcGx1Z2luTm90aWNlQ29tcG9uZW50ID0gbmV3IFBsdWdpbk5vdGljZUNvbXBvbmVudCh7XG4gICAgYXBwOiBwbHVnaW4uYXBwLFxuICAgIHBsdWdpbk5hbWU6IHBsdWdpbi5tYW5pZmVzdC5uYW1lXG4gIH0pO1xuICBwbHVnaW5Ob3RpY2VDb21wb25lbnQuc2hvd05vdGljZShtZXNzYWdlKTtcbiAgcHJpbnRFcnJvcihuZXcgRXJyb3IobWVzc2FnZSkpO1xuICBhd2FpdCBwbHVnaW4uYXBwLnBsdWdpbnMuZGlzYWJsZVBsdWdpbihwbHVnaW4ubWFuaWZlc3QuaWQpO1xufVxuIl0sCiAgIm1hcHBpbmdzIjogIjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQWNBLFNBQVMsY0FBYztBQVF2QixTQUFTLHdCQUF3QjtBQUNqQyxTQUFTLGtCQUFrQjtBQUMzQixTQUFTLGlCQUFpQjtBQUMxQixTQUFTLHlCQUF5QjtBQUNsQyxTQUFTLDZCQUE2QjtBQUN0QyxTQUFTLCtCQUErQjtBQUN4QyxTQUFTLHNDQUFzQztBQUMvQyxTQUFTLDhCQUE4QjtBQUN2QyxTQUFTLDRCQUE0QjtBQUNyQyxTQUFTLGtDQUFrQztBQUMzQyxTQUFTLG1CQUFtQjtBQUM1QixTQUFTLDZCQUE2QjtBQUN0QyxTQUFTLG1DQUFtQztBQUM1QyxTQUFTLG9EQUFvRDtBQUM3RCxTQUFTLDhCQUE4QjtBQUN2QyxTQUFTLDZCQUE2QjtBQUN0QyxTQUFTLG1DQUFtQztBQUM1QyxTQUFTLHlCQUF5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
|
|
598
|
+
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vLi4vLi4vc3JjL29ic2lkaWFuL3BsdWdpbi9wbHVnaW4udHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbIi8qKlxuICogQGZpbGVcbiAqXG4gKiBCYXNlIGNsYXNzIGZvciBPYnNpZGlhbiBwbHVnaW5zIHVzaW5nIGEgY29tcG9uZW50LWJhc2VkIGFyY2hpdGVjdHVyZS5cbiAqXG4gKiBQbHVnaW5CYXNlIHJlZ2lzdGVycyB1bml2ZXJzYWwgY29tcG9uZW50cyAoY29udGV4dCwgaTE4biwgZXJyb3IgaGFuZGxpbmcsIGFib3J0IHNpZ25hbCwgbGlmZWN5Y2xlIGV2ZW50cywgZGVidWcpLlxuICovXG5cbmltcG9ydCB0eXBlIHtcbiAgQ29tcG9uZW50LFxuICBJY29uTmFtZVxufSBmcm9tICdvYnNpZGlhbic7XG5pbXBvcnQgdHlwZSB7IFByb21pc2FibGUgfSBmcm9tICd0eXBlLWZlc3QnO1xuXG5pbXBvcnQgeyBQbHVnaW4gfSBmcm9tICdvYnNpZGlhbic7XG5cbmltcG9ydCB0eXBlIHtcbiAgUGx1Z2luQ29uZmxpY3QsXG4gIFBsdWdpbkRlcGVuZGVuY3lcbn0gZnJvbSAnLi4vY29tcG9uZW50cy9wbHVnaW4tZ2F0ZS1jb21wb25lbnQudHMnO1xuaW1wb3J0IHR5cGUgeyBUcmFuc2xhdGlvbnNNYXAgfSBmcm9tICcuLi9pMThuL2kxOG4udHMnO1xuaW1wb3J0IHR5cGUgeyBQbHVnaW5BcGlEZWNsYXJhdGlvbiB9IGZyb20gJy4vcGx1Z2luLWFwaS50cyc7XG5pbXBvcnQgdHlwZSB7XG4gIFBsdWdpbkV2ZW50TWFwLFxuICBQbHVnaW5FdmVudFNvdXJjZVxufSBmcm9tICcuL3BsdWdpbi1ldmVudC1zb3VyY2UudHMnO1xuaW1wb3J0IHR5cGUgeyBQbHVnaW5MaWZlY3ljbGVFdmVudFBheWxvYWQgfSBmcm9tICcuL3BsdWdpbi1saWZlY3ljbGUtZXZlbnRzLnRzJztcblxuaW1wb3J0IHsgbWl4aW5Bc3luY0V2ZW50cyB9IGZyb20gJy4uLy4uL2FzeW5jLWV2ZW50cy50cyc7XG5pbXBvcnQgeyBwcmludEVycm9yIH0gZnJvbSAnLi4vLi4vZXJyb3IudHMnO1xuaW1wb3J0IHsgbm9vcEFzeW5jIH0gZnJvbSAnLi4vLi4vZnVuY3Rpb24udHMnO1xuaW1wb3J0IHsgZW5zdXJlTm9uTnVsbGFibGUgfSBmcm9tICcuLi8uLi90eXBlLWd1YXJkcy50cyc7XG5pbXBvcnQgeyBBcHBBY3RpdmVGaWxlUHJvdmlkZXIgfSBmcm9tICcuLi9hY3RpdmUtZmlsZS1wcm92aWRlci50cyc7XG5pbXBvcnQgeyBDb21tYW5kSGFuZGxlckNvbXBvbmVudCB9IGZyb20gJy4uL2NvbW1hbmQtaGFuZGxlcnMvY29tbWFuZC1oYW5kbGVyLWNvbXBvbmVudC50cyc7XG5pbXBvcnQgeyBVbmxvY2tBY3RpdmVOb3RlQ29tbWFuZEhhbmRsZXIgfSBmcm9tICcuLi9jb21tYW5kLWhhbmRsZXJzL3VubG9jay1hY3RpdmUtbm90ZS1jb21tYW5kLWhhbmRsZXIudHMnO1xuaW1wb3J0IHsgUGx1Z2luQ29tbWFuZFJlZ2lzdHJhciB9IGZyb20gJy4uL2NvbW1hbmQtcmVnaXN0cmFyLnRzJztcbmltcG9ydCB7IEFib3J0U2lnbmFsQ29tcG9uZW50IH0gZnJvbSAnLi4vY29tcG9uZW50cy9hYm9ydC1zaWduYWwtY29tcG9uZW50LnRzJztcbmltcG9ydCB7IEFzeW5jRXJyb3JIYW5kbGVyQ29tcG9uZW50IH0gZnJvbSAnLi4vY29tcG9uZW50cy9hc3luYy1lcnJvci1oYW5kbGVyLWNvbXBvbmVudC50cyc7XG5pbXBvcnQgeyBDb21wb25lbnRFeCB9IGZyb20gJy4uL2NvbXBvbmVudHMvY29tcG9uZW50LWV4LnRzJztcbmltcG9ydCB7IENvbnNvbGVEZWJ1Z0NvbXBvbmVudCB9IGZyb20gJy4uL2NvbXBvbmVudHMvY29uc29sZS1kZWJ1Zy1jb21wb25lbnQudHMnO1xuaW1wb3J0IHsgTWVudUV2ZW50UmVnaXN0cmFyQ29tcG9uZW50IH0gZnJvbSAnLi4vY29tcG9uZW50cy9tZW51LWV2ZW50LXJlZ2lzdHJhci1jb21wb25lbnQudHMnO1xuaW1wb3J0IHsgTm90ZWJvb2tOYXZpZ2F0b3JNZW51RXZlbnRSZWdpc3RyYXJDb21wb25lbnQgfSBmcm9tICcuLi9jb21wb25lbnRzL25vdGVib29rLW5hdmlnYXRvci1tZW51LWV2ZW50LXJlZ2lzdHJhci1jb21wb25lbnQudHMnO1xuaW1wb3J0IHsgUGx1Z2luQ29udGV4dENvbXBvbmVudCB9IGZyb20gJy4uL2NvbXBvbmVudHMvcGx1Z2luLWNvbnRleHQtY29tcG9uZW50LnRzJztcbmltcG9ydCB7IFBsdWdpbkdhdGVDb21wb25lbnQgfSBmcm9tICcuLi9jb21wb25lbnRzL3BsdWdpbi1nYXRlLWNvbXBvbmVudC50cyc7XG5pbXBvcnQgeyBQbHVnaW5Ob3RpY2VDb21wb25lbnQgfSBmcm9tICcuLi9jb21wb25lbnRzL3BsdWdpbi1ub3RpY2UtY29tcG9uZW50LnRzJztcbmltcG9ydCB7IFBsdWdpblNldHRpbmdzQ29tcG9uZW50QmFzZSB9IGZyb20gJy4uL2NvbXBvbmVudHMvcGx1Z2luLXNldHRpbmdzLWNvbXBvbmVudC50cyc7XG5pbXBvcnQgeyBQbHVnaW5EYXRhSGFuZGxlciB9IGZyb20gJy4uL2RhdGEtaGFuZGxlci50cyc7XG5pbXBvcnQgeyBpbml0STE4TiB9IGZyb20gJy4uL2kxOG4vaTE4bi50cyc7XG5pbXBvcnQgeyBkZWZhdWx0VHJhbnNsYXRpb25zTWFwIH0gZnJvbSAnLi4vaTE4bi9sb2NhbGVzL3RyYW5zbGF0aW9ucy1tYXAudHMnO1xuaW1wb3J0IHsgUmVzb3VyY2VMb2NrQ29tcG9uZW50IH0gZnJvbSAnLi4vcmVzb3VyY2UtbG9jay50cyc7XG5pbXBvcnQgeyBwdWJsaXNoUGx1Z2luQXBpIH0gZnJvbSAnLi9wbHVnaW4tYXBpLnRzJztcbmltcG9ydCB7IFBsdWdpbkV2ZW50U291cmNlSW1wbCB9IGZyb20gJy4vcGx1Z2luLWV2ZW50LXNvdXJjZS50cyc7XG5pbXBvcnQge1xuICBQTFVHSU5fTE9BREVEX0VWRU5UX05BTUUsXG4gIFBMVUdJTl9VTkxPQURFRF9FVkVOVF9OQU1FLFxuICB0cmlnZ2VyUGx1Z2luTGlmZWN5Y2xlRXZlbnRcbn0gZnJvbSAnLi9wbHVnaW4tbGlmZWN5Y2xlLWV2ZW50cy50cyc7XG5cbi8qKlxuICogVGhlIHVuaXZlcnNhbCBjb21wb25lbnRzIG93bmVkIGJ5IHtAbGluayBQbHVnaW5CYXNlfSwga2V5ZWQgYnkgdGhlIG5hbWUgb2YgdGhlIGFjY2Vzc29yIGV4cG9zaW5nXG4gKiBlYWNoIG9uZS4gRXZlcnkgbWVtYmVyIGlzIG9wdGlvbmFsIGJlY2F1c2UgYSBjb21wb25lbnQgb25seSBleGlzdHMgb25jZSB7QGxpbmsgUGx1Z2luQmFzZS5vbmxvYWR9XG4gKiBoYXMgY3JlYXRlZCBpdC5cbiAqL1xuaW50ZXJmYWNlIFBsdWdpbkJhc2VDb21wb25lbnRzIHtcbiAgYWJvcnRTaWduYWxDb21wb25lbnQ/OiBBYm9ydFNpZ25hbENvbXBvbmVudDtcbiAgYXN5bmNFcnJvckhhbmRsZXJDb21wb25lbnQ/OiBBc3luY0Vycm9ySGFuZGxlckNvbXBvbmVudDtcbiAgY29tbWFuZEhhbmRsZXJDb21wb25lbnQ/OiBDb21tYW5kSGFuZGxlckNvbXBvbmVudDtcbiAgY29uc29sZURlYnVnQ29tcG9uZW50PzogQ29uc29sZURlYnVnQ29tcG9uZW50O1xuICBwbHVnaW5Db250ZXh0Q29tcG9uZW50PzogUGx1Z2luQ29udGV4dENvbXBvbmVudDtcbiAgcGx1Z2luR2F0ZUNvbXBvbmVudD86IFBsdWdpbkdhdGVDb21wb25lbnQ7XG4gIHBsdWdpbk5vdGljZUNvbXBvbmVudD86IFBsdWdpbk5vdGljZUNvbXBvbmVudDtcbiAgcGx1Z2luU2V0dGluZ3NDb21wb25lbnQ/OiBQbHVnaW5TZXR0aW5nc0NvbXBvbmVudEJhc2U8b2JqZWN0PjtcbiAgcmVzb3VyY2VMb2NrQ29tcG9uZW50PzogUmVzb3VyY2VMb2NrQ29tcG9uZW50O1xufVxuXG4vKipcbiAqIEJhc2UgY2xhc3MgZm9yIGNyZWF0aW5nIE9ic2lkaWFuIHBsdWdpbnMgd2l0aCBhIGNvbXBvbmVudC1iYXNlZCBhcmNoaXRlY3R1cmUuXG4gKlxuICogUmVnaXN0ZXJzIHVuaXZlcnNhbCBjb21wb25lbnRzIGF1dG9tYXRpY2FsbHkuIFN1YmNsYXNzZXMgYWRkIG9yIHJlcGxhY2UgY29tcG9uZW50c1xuICogdmlhIHtAbGluayByZW1vdmVDaGlsZH0gLyB7QGxpbmsgYWRkQ2hpbGR9LlxuICovXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgUGx1Z2luQmFzZSBleHRlbmRzIG1peGluQXN5bmNFdmVudHM8UGx1Z2luRXZlbnRNYXA+KCkoUGx1Z2luKSBpbXBsZW1lbnRzIFBsdWdpbkV2ZW50U291cmNlIHtcbiAgLyoqXG4gICAqIEdldHMgYWJvcnQgc2lnbmFsIGNvbXBvbmVudC5cbiAgICpcbiAgICogQHJldHVybnMgYWJvcnQgc2lnbmFsIGNvbXBvbmVudC5cbiAgICovXG4gIHByb3RlY3RlZCBnZXQgYWJvcnRTaWduYWxDb21wb25lbnQoKTogQWJvcnRTaWduYWxDb21wb25lbnQge1xuICAgIHJldHVybiBlbnN1cmVOb25OdWxsYWJsZSh0aGlzLmNvbXBvbmVudHMuYWJvcnRTaWduYWxDb21wb25lbnQpO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldHMgYWJvcnQgc2lnbmFsIGNvbXBvbmVudC5cbiAgICpcbiAgICogQHBhcmFtIHZhbHVlIC0gQWJvcnQgc2lnbmFsIGNvbXBvbmVudC5cbiAgICovXG4gIHByb3RlY3RlZCBzZXQgYWJvcnRTaWduYWxDb21wb25lbnQodmFsdWU6IEFib3J0U2lnbmFsQ29tcG9uZW50KSB7XG4gICAgdGhpcy5zZXRDb21wb25lbnQoJ2Fib3J0U2lnbmFsQ29tcG9uZW50JywgdmFsdWUpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldHMgYXN5bmMgZXJyb3IgaGFuZGxlciBjb21wb25lbnQuXG4gICAqXG4gICAqIEByZXR1cm5zIGFzeW5jIGVycm9yIGhhbmRsZXIgY29tcG9uZW50LlxuICAgKi9cbiAgcHJvdGVjdGVkIGdldCBhc3luY0Vycm9ySGFuZGxlckNvbXBvbmVudCgpOiBBc3luY0Vycm9ySGFuZGxlckNvbXBvbmVudCB7XG4gICAgcmV0dXJuIGVuc3VyZU5vbk51bGxhYmxlKHRoaXMuY29tcG9uZW50cy5hc3luY0Vycm9ySGFuZGxlckNvbXBvbmVudCk7XG4gIH1cblxuICAvKipcbiAgICogU2V0cyBhc3luYyBlcnJvciBoYW5kbGVyIGNvbXBvbmVudC5cbiAgICpcbiAgICogQHBhcmFtIHZhbHVlIC0gQXN5bmMgZXJyb3IgaGFuZGxlciBjb21wb25lbnQuXG4gICAqL1xuICBwcm90ZWN0ZWQgc2V0IGFzeW5jRXJyb3JIYW5kbGVyQ29tcG9uZW50KHZhbHVlOiBBc3luY0Vycm9ySGFuZGxlckNvbXBvbmVudCkge1xuICAgIHRoaXMuc2V0Q29tcG9uZW50KCdhc3luY0Vycm9ySGFuZGxlckNvbXBvbmVudCcsIHZhbHVlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXRzIHRoZSBzaGFyZWQgY29tbWFuZCBoYW5kbGVyIGNvbXBvbmVudC4gUmVnaXN0ZXIgYSBwbHVnaW4ncyBjb21tYW5kcyBvbiBpdCB2aWFcbiAgICoge0BsaW5rIENvbW1hbmRIYW5kbGVyQ29tcG9uZW50LnJlZ2lzdGVyQ29tbWFuZEhhbmRsZXJzfSByYXRoZXIgdGhhbiBjb25zdHJ1Y3RpbmcgeW91ciBvd25cbiAgICoge0BsaW5rIENvbW1hbmRIYW5kbGVyQ29tcG9uZW50fSBcdTIwMTQgdGhlIGFwcC1iYWNrZWQgYWN0aXZlLWZpbGUgcHJvdmlkZXIsIGNvbW1hbmQgcmVnaXN0cmFyLCBtZW51XG4gICAqIGV2ZW50IHJlZ2lzdHJhciwgYW5kIHBsdWdpbiBuYW1lIGFyZSBhbHJlYWR5IHdpcmVkLlxuICAgKlxuICAgKiBAcmV0dXJucyBUaGUgY29tbWFuZCBoYW5kbGVyIGNvbXBvbmVudC5cbiAgICovXG4gIHByb3RlY3RlZCBnZXQgY29tbWFuZEhhbmRsZXJDb21wb25lbnQoKTogQ29tbWFuZEhhbmRsZXJDb21wb25lbnQge1xuICAgIHJldHVybiBlbnN1cmVOb25OdWxsYWJsZSh0aGlzLmNvbXBvbmVudHMuY29tbWFuZEhhbmRsZXJDb21wb25lbnQpO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldHMgdGhlIGNvbW1hbmQgaGFuZGxlciBjb21wb25lbnQuXG4gICAqXG4gICAqIEBwYXJhbSB2YWx1ZSAtIFRoZSBjb21tYW5kIGhhbmRsZXIgY29tcG9uZW50LlxuICAgKi9cbiAgcHJvdGVjdGVkIHNldCBjb21tYW5kSGFuZGxlckNvbXBvbmVudCh2YWx1ZTogQ29tbWFuZEhhbmRsZXJDb21wb25lbnQpIHtcbiAgICB0aGlzLnNldENvbXBvbmVudCgnY29tbWFuZEhhbmRsZXJDb21wb25lbnQnLCB2YWx1ZSk7XG4gIH1cblxuICAvKipcbiAgICogR2V0cyBjb25zb2xlIGRlYnVnIGNvbXBvbmVudC5cbiAgICpcbiAgICogQHJldHVybnMgY29uc29sZSBkZWJ1ZyBjb21wb25lbnQuXG4gICAqL1xuICBwcm90ZWN0ZWQgZ2V0IGNvbnNvbGVEZWJ1Z0NvbXBvbmVudCgpOiBDb25zb2xlRGVidWdDb21wb25lbnQge1xuICAgIHJldHVybiBlbnN1cmVOb25OdWxsYWJsZSh0aGlzLmNvbXBvbmVudHMuY29uc29sZURlYnVnQ29tcG9uZW50KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXRzIGNvbnNvbGUgZGVidWcgY29tcG9uZW50LlxuICAgKlxuICAgKiBAcGFyYW0gdmFsdWUgLSBDb25zb2xlIGRlYnVnIGNvbXBvbmVudC5cbiAgICovXG4gIHByb3RlY3RlZCBzZXQgY29uc29sZURlYnVnQ29tcG9uZW50KHZhbHVlOiBDb25zb2xlRGVidWdDb21wb25lbnQpIHtcbiAgICB0aGlzLnNldENvbXBvbmVudCgnY29uc29sZURlYnVnQ29tcG9uZW50JywgdmFsdWUpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldHMgcGx1Z2luIGNvbnRleHQgY29tcG9uZW50IChwbHVnaW4gSUQsIGRlYnVnIGNvbnRyb2xsZXIsIGxpYnJhcnkgc3R5bGVzKS5cbiAgICpcbiAgICogQHJldHVybnMgcGx1Z2luIGNvbnRleHQgY29tcG9uZW50LlxuICAgKi9cbiAgcHJvdGVjdGVkIGdldCBwbHVnaW5Db250ZXh0Q29tcG9uZW50KCk6IFBsdWdpbkNvbnRleHRDb21wb25lbnQge1xuICAgIHJldHVybiBlbnN1cmVOb25OdWxsYWJsZSh0aGlzLmNvbXBvbmVudHMucGx1Z2luQ29udGV4dENvbXBvbmVudCk7XG4gIH1cblxuICAvKipcbiAgICogU2V0cyBwbHVnaW4gY29udGV4dCBjb21wb25lbnQuXG4gICAqXG4gICAqIEBwYXJhbSB2YWx1ZSAtIFBsdWdpbiBjb250ZXh0IGNvbXBvbmVudC5cbiAgICovXG4gIHByb3RlY3RlZCBzZXQgcGx1Z2luQ29udGV4dENvbXBvbmVudCh2YWx1ZTogUGx1Z2luQ29udGV4dENvbXBvbmVudCkge1xuICAgIHRoaXMuc2V0Q29tcG9uZW50KCdwbHVnaW5Db250ZXh0Q29tcG9uZW50JywgdmFsdWUpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldHMgdGhlIGdhdGUgaG9sZGluZyB0aGUgcGx1Z2luJ3MgZmVhdHVyZSBzdXJmYWNlIHVwIG9yIGRvd24uXG4gICAqXG4gICAqIFJlYWNoIGZvciBpdCBmcm9tIGEgc2V0dGluZ3MgdGFiIHRvIHJlbmRlciB0aGUgb3ZlcmxhcCBiYW5uZXIgZm9yIGFcbiAgICoge0BsaW5rIG9ic2lkaWFuL2NvbXBvbmVudHMvcGx1Z2luLWdhdGUtY29tcG9uZW50IVBsdWdpbkNvbmZsaWN0U2V2ZXJpdHkuV2Fybn0gY29uZmxpY3QgXHUyMDE0IHRoZSBvbmVcbiAgICogYmFubmVyIHRoZSBsaWJyYXJ5IGNhbm5vdCBwbGFjZSBpdHNlbGYsIGJlY2F1c2UgYSBydW5uaW5nIHBsdWdpbiBidWlsZHMgaXRzIG93biBzZXR0aW5ncyB0YWIuXG4gICAqXG4gICAqIEByZXR1cm5zIFRoZSBwbHVnaW4gZ2F0ZSBjb21wb25lbnQuXG4gICAqL1xuICBwcm90ZWN0ZWQgZ2V0IHBsdWdpbkdhdGVDb21wb25lbnQoKTogUGx1Z2luR2F0ZUNvbXBvbmVudCB7XG4gICAgcmV0dXJuIGVuc3VyZU5vbk51bGxhYmxlKHRoaXMuY29tcG9uZW50cy5wbHVnaW5HYXRlQ29tcG9uZW50KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXRzIHRoZSBwbHVnaW4gZ2F0ZSBjb21wb25lbnQuXG4gICAqXG4gICAqIEBwYXJhbSB2YWx1ZSAtIFRoZSBwbHVnaW4gZ2F0ZSBjb21wb25lbnQuXG4gICAqL1xuICBwcm90ZWN0ZWQgc2V0IHBsdWdpbkdhdGVDb21wb25lbnQodmFsdWU6IFBsdWdpbkdhdGVDb21wb25lbnQpIHtcbiAgICB0aGlzLnNldENvbXBvbmVudCgncGx1Z2luR2F0ZUNvbXBvbmVudCcsIHZhbHVlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXRzIHBsdWdpbiBub3RpY2UgY29tcG9uZW50LlxuICAgKlxuICAgKiBAcmV0dXJucyBwbHVnaW4gbm90aWNlIGNvbXBvbmVudC5cbiAgICovXG4gIHByb3RlY3RlZCBnZXQgcGx1Z2luTm90aWNlQ29tcG9uZW50KCk6IFBsdWdpbk5vdGljZUNvbXBvbmVudCB7XG4gICAgcmV0dXJuIGVuc3VyZU5vbk51bGxhYmxlKHRoaXMuY29tcG9uZW50cy5wbHVnaW5Ob3RpY2VDb21wb25lbnQpO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldHMgcGx1Z2luIG5vdGljZSBjb21wb25lbnQuXG4gICAqXG4gICAqIEBwYXJhbSB2YWx1ZSAtIFBsdWdpbiBub3RpY2UgY29tcG9uZW50LlxuICAgKi9cbiAgcHJvdGVjdGVkIHNldCBwbHVnaW5Ob3RpY2VDb21wb25lbnQodmFsdWU6IFBsdWdpbk5vdGljZUNvbXBvbmVudCkge1xuICAgIHRoaXMuc2V0Q29tcG9uZW50KCdwbHVnaW5Ob3RpY2VDb21wb25lbnQnLCB2YWx1ZSk7XG4gIH1cblxuICAvKipcbiAgICogR2V0cyBwbHVnaW4gc2V0dGluZ3MgY29tcG9uZW50LlxuICAgKlxuICAgKiBAcmV0dXJucyBwbHVnaW4gc2V0dGluZ3MgY29tcG9uZW50LlxuICAgKi9cbiAgcHJvdGVjdGVkIGdldCBwbHVnaW5TZXR0aW5nc0NvbXBvbmVudCgpOiBQbHVnaW5TZXR0aW5nc0NvbXBvbmVudEJhc2U8b2JqZWN0PiB7XG4gICAgcmV0dXJuIGVuc3VyZU5vbk51bGxhYmxlKHRoaXMuY29tcG9uZW50cy5wbHVnaW5TZXR0aW5nc0NvbXBvbmVudCk7XG4gIH1cblxuICAvKipcbiAgICogU2V0cyBwbHVnaW4gc2V0dGluZ3MgY29tcG9uZW50LlxuICAgKlxuICAgKiBAcGFyYW0gdmFsdWUgLSBQbHVnaW4gc2V0dGluZ3MgY29tcG9uZW50LlxuICAgKi9cbiAgcHJvdGVjdGVkIHNldCBwbHVnaW5TZXR0aW5nc0NvbXBvbmVudCh2YWx1ZTogUGx1Z2luU2V0dGluZ3NDb21wb25lbnRCYXNlPG9iamVjdD4pIHtcbiAgICB0aGlzLnNldENvbXBvbmVudCgncGx1Z2luU2V0dGluZ3NDb21wb25lbnQnLCB2YWx1ZSk7XG4gIH1cblxuICAvKipcbiAgICogR2V0cyB0aGUgZWRpdG9yIGxvY2sgY29tcG9uZW50LCB1c2VkIHRvIGxvY2sgbm90ZXMgcmVhZC1vbmx5IGR1cmluZyBsb25nIG9wZXJhdGlvbnMuIE93bmVkIGJ5XG4gICAqIHRoZSBwbHVnaW4sIHNvIGl0cyBsb2NrcyBhcmUgcmVsZWFzZWQgYXV0b21hdGljYWxseSB3aGVuIHRoZSBwbHVnaW4gdW5sb2Fkcy5cbiAgICpcbiAgICogQHJldHVybnMgRWRpdG9yIGxvY2sgY29tcG9uZW50LlxuICAgKi9cbiAgcHJvdGVjdGVkIGdldCByZXNvdXJjZUxvY2tDb21wb25lbnQoKTogUmVzb3VyY2VMb2NrQ29tcG9uZW50IHtcbiAgICByZXR1cm4gZW5zdXJlTm9uTnVsbGFibGUodGhpcy5jb21wb25lbnRzLnJlc291cmNlTG9ja0NvbXBvbmVudCk7XG4gIH1cblxuICAvKipcbiAgICogU2V0cyB0aGUgZWRpdG9yIGxvY2sgY29tcG9uZW50LlxuICAgKlxuICAgKiBAcGFyYW0gdmFsdWUgLSBFZGl0b3IgbG9jayBjb21wb25lbnQuXG4gICAqL1xuICBwcm90ZWN0ZWQgc2V0IHJlc291cmNlTG9ja0NvbXBvbmVudCh2YWx1ZTogUmVzb3VyY2VMb2NrQ29tcG9uZW50KSB7XG4gICAgdGhpcy5zZXRDb21wb25lbnQoJ3Jlc291cmNlTG9ja0NvbXBvbmVudCcsIHZhbHVlKTtcbiAgfVxuXG4gIHByaXZhdGUgcmVhZG9ubHkgY29tcG9uZW50czogUGx1Z2luQmFzZUNvbXBvbmVudHMgPSB7fTtcblxuICAvLyBFdmVyeXRoaW5nIHRoZSBTVUJDTEFTUyBvd25zOiB3aGF0IGBvbmxvYWRJbXBsYCBhZGRzLCBhbmQgd2hhdCBpdCBhZGRzIGxhdGVyLlxuICAvL1xuICAvLyBBIHNlY29uZCB3cmFwcGVyIHJhdGhlciB0aGFuIG9uZSwgYmVjYXVzZSB0aGUgdHdvIHRpZXJzIGhhdmUgb3Bwb3NpdGUgbGlmZXRpbWVzLiBUaGUgdW5pdmVyc2FsXG4gIC8vIENvbXBvbmVudHMgaGF2ZSB0byBPVVRMSVZFIGEgbG9zdCBkZXBlbmRlbmN5IFx1MjAxNCB0aGV5IGFyZSB3aGF0IHNob3dzIHRoZSBub3RpY2UgbmFtaW5nIHRoZSBwbHVnaW4gdGhhdFxuICAvLyBXZW50IGF3YXkgYW5kIHJlbmRlcnMgdGhlIGJ1dHRvbiB0aGF0IGJyaW5ncyBpdCBiYWNrIFx1MjAxNCB3aGlsZSB0aGUgc3ViY2xhc3MncyBzdXJmYWNlIGlzIGV4YWN0bHkgd2hhdFxuICAvLyBNdXN0IHN0b3AgcnVubmluZy4gVW5sb2FkaW5nIG9uZSB3cmFwcGVyIGhvbGRpbmcgYm90aCB3b3VsZCBzaWxlbmNlIHRoZSBwbHVnaW4gYXQgdGhlIG1vbWVudCBpdCBtb3N0XG4gIC8vIE5lZWRzIHRvIHNwZWFrLlxuICAvL1xuICAvLyBBbHdheXMgcHJlc2VudCwgbmV2ZXIgbnVsbCwgYW5kIFJFUExBQ0VEIHJhdGhlciB0aGFuIGVtcHRpZWQgd2hlbiB0aGUgc3VyZmFjZSBpcyB0b3JuIGRvd24uIFRoYXQga2VlcHNcbiAgLy8gYGFkZENoaWxkYCBjYWxsYWJsZSBhdCBldmVyeSBwb2ludCBpbiB0aGUgcGx1Z2luJ3MgbGlmZSwgZXhhY3RseSBhcyBpdCB3YXMgYmVmb3JlIHRoZSB0aWVycyBleGlzdGVkOlxuICAvLyBBIGNoaWxkIGFkZGVkIGJlZm9yZSB0aGUgZ2F0ZSBvcGVucyBpcyBxdWV1ZWQgYW5kIGxvYWRlZCB3aGVuIGl0IGRvZXMsIHdoaWNoIGlzIHdoYXQgYENvbXBvbmVudEV4YFxuICAvLyBBbHJlYWR5IGRvZXMgZm9yIGFueSBjaGlsZCBhZGRlZCB0byBhIG5vdC15ZXQtbG9hZGVkIGNvbXBvbmVudC5cbiAgcHJpdmF0ZSBnYXRlZFdyYXBwZXJDb21wb25lbnQgPSBuZXcgQ29tcG9uZW50RXgoKTtcblxuICAvLyBUaGUgcGF5bG9hZCBicm9hZGNhc3Qgd2hlbiB0aGlzIHBsdWdpbiBmaW5pc2hlZCBsb2FkaW5nLCBrZXB0IHNvIHRoZSBtYXRjaGluZyB1bmxvYWRlZCBicm9hZGNhc3RcbiAgLy8gRGVzY3JpYmVzIHRoZSBzYW1lIHBsdWdpbiB3aXRob3V0IHJlLWRlcml2aW5nIGl0IGZyb20gYSBzdXJmYWNlIHRoYXQgaGFzIHNpbmNlIGJlZW4gdG9ybiBkb3duLiBOdWxsXG4gIC8vIFdoZW5ldmVyIG5vIGxvYWRlZCBicm9hZGNhc3QgaXMgb3V0c3RhbmRpbmcsIHdoaWNoIGlzIHdoYXQga2VlcHMgdGhlIHR3byBldmVudHMgcGFpcmVkLlxuICBwcml2YXRlIGxpZmVjeWNsZUV2ZW50UGF5bG9hZDogbnVsbCB8IFBsdWdpbkxpZmVjeWNsZUV2ZW50UGF5bG9hZCA9IG51bGw7XG5cbiAgLy8gVGhlIGxpYnJhcnkncyBvd24gY29tcG9uZW50cywgd2hpY2ggb3V0bGl2ZSBhbnkgZGVwZW5kZW5jeS5cbiAgcHJpdmF0ZSByZWFkb25seSB1bml2ZXJzYWxXcmFwcGVyQ29tcG9uZW50ID0gbmV3IENvbXBvbmVudEV4KCk7XG5cbiAgLyoqXG4gICAqIEFkZHMgYSBjaGlsZCBjb21wb25lbnQuXG4gICAqXG4gICAqIFRoZSBjaGlsZCBpcyBhZGRlZCB0byB0aGUgaW50ZXJuYWwgd3JhcHBlciBob2xkaW5nIHRoZSBzdWJjbGFzcydzIG93biBzdXJmYWNlLCB3aGljaCB7QGxpbmsgb25sb2FkfVxuICAgKiBjcmVhdGVzIGFuZCBsb2FkcyBiZWZvcmUgY2FsbGluZyB7QGxpbmsgb25sb2FkSW1wbH0uIFNvIGEgY2hpbGQgYWRkZWQgZHVyaW5nIHtAbGluayBvbmxvYWRJbXBsfSBpc1xuICAgKiBsb2FkZWQgaW1tZWRpYXRlbHksIGNoaWxkcmVuLWZpcnN0LCBhbmQgaXMgdXNhYmxlIGJ5IHRoZSB0aW1lIHRoaXMgbWV0aG9kIHJldHVybnMuXG4gICAqXG4gICAqIFRoYXQgd3JhcHBlciBpcyB0b3JuIGRvd24gYW5kIHJlYnVpbHQgd2hlbmV2ZXIgdGhlIGdhdGUgY2xvc2VzIGFuZCBvcGVucyBhZ2FpbiBcdTIwMTQgYSBkZXBlbmRlbmN5IGRlY2xhcmVkXG4gICAqIGJ5IHtAbGluayBnZXRQbHVnaW5EZXBlbmRlbmNpZXN9IGdvaW5nIGF3YXkgYW5kIGNvbWluZyBiYWNrLCBvciBhIGNvbmZsaWN0IGRlY2xhcmVkIGJ5XG4gICAqIHtAbGluayBnZXRQbHVnaW5Db25mbGljdHN9IGFwcGVhcmluZyBhbmQgYmVpbmcgcmVzb2x2ZWQgXHUyMDE0IHNvIGEgY2hpbGQgYWRkZWQgaGVyZSBsaXZlcyBleGFjdGx5IGFzIGxvbmdcbiAgICogYXMgdGhlIHBsdWdpbidzIGZlYXR1cmUgc3VyZmFjZSBkb2VzLiBBZGRpbmcgb25lIHdoaWxlIHRoZSBzdXJmYWNlIGlzIGRvd24gaXMgc3RpbGwgbGVnaXRpbWF0ZSBcdTIwMTQgaXQgaXNcbiAgICogcXVldWVkIGFuZCBsb2FkZWQgd2hlbiB0aGUgc3VyZmFjZSBuZXh0IGNvbWVzIHVwLCB0aGUgd2F5IHtAbGluayBDb21wb25lbnRFeC5hZGRDaGlsZH0gYWxyZWFkeSBxdWV1ZXNcbiAgICogYSBjaGlsZCBhZGRlZCB0byBhIG5vdC15ZXQtbG9hZGVkIGNvbXBvbmVudC5cbiAgICpcbiAgICogQHR5cGVQYXJhbSBUQ29tcG9uZW50IC0gVGhlIHR5cGUgb2YgY29tcG9uZW50IHRvIGFkZC5cbiAgICogQHBhcmFtIGNvbXBvbmVudCAtIFRoZSBjb21wb25lbnQgaW5zdGFuY2UgdG8gYWRkLlxuICAgKiBAcmV0dXJucyBUaGUgYWRkZWQgY29tcG9uZW50LlxuICAgKi9cbiAgcHVibGljIG92ZXJyaWRlIGFkZENoaWxkPFRDb21wb25lbnQgZXh0ZW5kcyBDb21wb25lbnQ+KGNvbXBvbmVudDogVENvbXBvbmVudCk6IFRDb21wb25lbnQge1xuICAgIHJldHVybiB0aGlzLmdhdGVkV3JhcHBlckNvbXBvbmVudC5hZGRDaGlsZChjb21wb25lbnQpO1xuICB9XG5cbiAgLyoqXG4gICAqIENhbGxlZCB3aGVuIHRoZSBleHRlcm5hbCBzZXR0aW5ncyBjaGFuZ2UuXG4gICAqXG4gICAqIE92ZXJyaWRlIGluIHN1YmNsYXNzIGlmIG5lZWRlZC4gTWFrZSBzdXJlIHRvIGNhbGwgYGF3YWl0IHN1cGVyLm9uRXh0ZXJuYWxTZXR0aW5nc0NoYW5nZSgpYCBmaXJzdC5cbiAgICovXG4gIHB1YmxpYyBvdmVycmlkZSBhc3luYyBvbkV4dGVybmFsU2V0dGluZ3NDaGFuZ2UoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgYXdhaXQgc3VwZXIub25FeHRlcm5hbFNldHRpbmdzQ2hhbmdlPy4oKTtcbiAgICBhd2FpdCB0aGlzLnRyaWdnZXJBc3luYygnZXh0ZXJuYWxTZXR0aW5nc0NoYW5nZScpO1xuICB9XG5cbiAgLyoqXG4gICAqIENhbGxlZCB3aGVuIHRoZSBwbHVnaW4gaXMgbG9hZGVkLlxuICAgKlxuICAgKiBPcmNoZXN0cmF0ZXMgbG9hZGluZzogcmVnaXN0ZXJzIHRoZSB1bml2ZXJzYWwgY29tcG9uZW50cywgbGV0cyB0aGUgc3ViY2xhc3Mgd2lyZSBpdHMgb3duXG4gICAqIGNvbXBvbmVudHMgdmlhIHtAbGluayBvbmxvYWRJbXBsfSwgdGhlbiBhd2FpdHMgdGhlIGFzeW5jIHRhaWwgb2YgZXZlcnkgbG9hZC5cbiAgICogRWFjaCBjb21wb25lbnQgbG9hZHMgYXMgaXQgaXMgYWRkZWQsIGNoaWxkcmVuLWZpcnN0LlxuICAgKlxuICAgKiBEbyBOT1Qgb3ZlcnJpZGUgdGhpcyBtZXRob2QuIE92ZXJyaWRlIHtAbGluayBvbmxvYWRJbXBsfSBpbnN0ZWFkLlxuICAgKi9cbiAgcHVibGljIG92ZXJyaWRlIGFzeW5jIG9ubG9hZCgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICB0cnkge1xuICAgICAgLy8gVGhlIHdyYXBwZXIgaXMgYXR0YWNoZWQgYW5kIGxvYWRlZCBiZWZvcmUgYW55dGhpbmcgaXMgd2lyZWQgdXAsIHNvIGV2ZXJ5IGBhZGRDaGlsZGAgYmVsb3dcbiAgICAgIC8vIExvYWRzIGl0cyBjaGlsZCBzdHJhaWdodCBhd2F5IHJhdGhlciB0aGFuIHF1ZXVpbmcgaXQuXG4gICAgICAvLyBUaGF0IGlzIHdoYXQgbGV0cyBhIGNvbW1hbmQgaGFuZGxlciByZWdpc3RlciBpdHMgbWVudSBldmVudHMgZnJvbSBgb25SZWdpc3RlcmVkYCwgd2hpY2hcbiAgICAgIC8vIGByZWdpc3RlckNvbW1hbmRIYW5kbGVyc2AgYXdhaXRzIGFuZCB3aGljaCBhIHJlZ2lzdHJhciByZWZ1c2VzIHdoaWxlIHVubG9hZGVkLlxuICAgICAgLy8gQXR0YWNoaW5nIGl0IHVwIGZyb250IGFsc28gcmVnaXN0ZXJzIHRoZSB3cmFwcGVyIGZvciB0ZWFyZG93biBiZWZvcmUgYW55dGhpbmcgY2FuIHRocm93LlxuICAgICAgLy8gVGhlIGxvYWQgaXMgZXhwbGljaXQgcmF0aGVyIHRoYW4gbGVmdCB0byBgYWRkQ2hpbGRgLCB3aGljaCBsb2FkcyB0aGUgY2hpbGQgb25seSB3aGVuIHRoZVxuICAgICAgLy8gUGx1Z2luIGl0c2VsZiBpcyBsb2FkZWQgXHUyMDE0IHRydWUgd2hlbiBPYnNpZGlhbiBjYWxscyBgbG9hZCgpYCwgYnV0IG5vdCB3aGVuIGEgY2FsbGVyIGludm9rZXNcbiAgICAgIC8vIGBvbmxvYWQoKWAgZGlyZWN0bHkuXG4gICAgICBzdXBlci5hZGRDaGlsZCh0aGlzLnVuaXZlcnNhbFdyYXBwZXJDb21wb25lbnQpO1xuICAgICAgdGhpcy51bml2ZXJzYWxXcmFwcGVyQ29tcG9uZW50LmxvYWQoKTtcblxuICAgICAgYXdhaXQgaW5pdEkxOE4odGhpcy5jcmVhdGVUcmFuc2xhdGlvbnNNYXAoKSk7XG4gICAgICB0aGlzLnBsdWdpbkNvbnRleHRDb21wb25lbnQgPSB0aGlzLmFkZFVuaXZlcnNhbENoaWxkKFxuICAgICAgICBuZXcgUGx1Z2luQ29udGV4dENvbXBvbmVudCh7XG4gICAgICAgICAgYXBwOiB0aGlzLmFwcCxcbiAgICAgICAgICBwbHVnaW5JZDogdGhpcy5tYW5pZmVzdC5pZFxuICAgICAgICB9KVxuICAgICAgKTtcbiAgICAgIHRoaXMucGx1Z2luTm90aWNlQ29tcG9uZW50ID0gdGhpcy5hZGRVbml2ZXJzYWxDaGlsZChcbiAgICAgICAgbmV3IFBsdWdpbk5vdGljZUNvbXBvbmVudCh7XG4gICAgICAgICAgYXBwOiB0aGlzLmFwcCxcbiAgICAgICAgICBwbHVnaW5OYW1lOiB0aGlzLm1hbmlmZXN0Lm5hbWVcbiAgICAgICAgfSlcbiAgICAgICk7XG4gICAgICB0aGlzLmFzeW5jRXJyb3JIYW5kbGVyQ29tcG9uZW50ID0gdGhpcy5hZGRVbml2ZXJzYWxDaGlsZChuZXcgQXN5bmNFcnJvckhhbmRsZXJDb21wb25lbnQodGhpcy5wbHVnaW5Ob3RpY2VDb21wb25lbnQpKTtcbiAgICAgIHRoaXMuYWJvcnRTaWduYWxDb21wb25lbnQgPSB0aGlzLmFkZFVuaXZlcnNhbENoaWxkKG5ldyBBYm9ydFNpZ25hbENvbXBvbmVudCh0aGlzLm1hbmlmZXN0LmlkKSk7XG4gICAgICB0aGlzLmNvbnNvbGVEZWJ1Z0NvbXBvbmVudCA9IHRoaXMuYWRkVW5pdmVyc2FsQ2hpbGQobmV3IENvbnNvbGVEZWJ1Z0NvbXBvbmVudCh0aGlzLm1hbmlmZXN0LmlkKSk7XG4gICAgICB0aGlzLnJlc291cmNlTG9ja0NvbXBvbmVudCA9IHRoaXMuYWRkVW5pdmVyc2FsQ2hpbGQobmV3IFJlc291cmNlTG9ja0NvbXBvbmVudCh0aGlzLmFwcCwgdGhpcy5tYW5pZmVzdC5pZCkpO1xuICAgICAgLy8gTm90ZWJvb2sgTmF2aWdhdG9yIGRyYXdzIGl0cyBvd24gZmlsZSB0cmVlIGFuZCBuZXZlciByYWlzZXMgT2JzaWRpYW4ncyBgZmlsZS1tZW51YCAvXG4gICAgICAvLyBgZmlsZXMtbWVudWAgZXZlbnRzLCBzbyBldmVyeSBwbHVnaW4ncyBjb250ZXh0LW1lbnUgaXRlbXMgd291bGQgdmFuaXNoIGZvciBhbnlvbmUgYnJvd3NpbmdcbiAgICAgIC8vIFRocm91Z2ggaXQuIFdpcmVkIGhlcmUgcmF0aGVyIHRoYW4gcGVyLXBsdWdpbjogdGhlIGJyaWRnZSBzdGF5cyBkb3JtYW50IHdoZW4gTm90ZWJvb2tcbiAgICAgIC8vIE5hdmlnYXRvciBpcyBub3QgaW5zdGFsbGVkLCBhbmQgYSBwbHVnaW4gd2l0aCBubyBmaWxlL2ZvbGRlciBoYW5kbGVycyBjb250cmlidXRlcyBub3RoaW5nLlxuICAgICAgY29uc3Qgbm90ZWJvb2tOYXZpZ2F0b3JNZW51RXZlbnRSZWdpc3RyYXJDb21wb25lbnQgPSB0aGlzLmFkZFVuaXZlcnNhbENoaWxkKFxuICAgICAgICBuZXcgTm90ZWJvb2tOYXZpZ2F0b3JNZW51RXZlbnRSZWdpc3RyYXJDb21wb25lbnQoe1xuICAgICAgICAgIGFwcDogdGhpcy5hcHAsXG4gICAgICAgICAgcGx1Z2luTmFtZTogdGhpcy5tYW5pZmVzdC5uYW1lLFxuICAgICAgICAgIHN1Ym1lbnVJY29uOiB0aGlzLmdldE5vdGVib29rTmF2aWdhdG9yTWVudVN1Ym1lbnVJY29uKClcbiAgICAgICAgfSlcbiAgICAgICk7XG4gICAgICB0aGlzLmNvbW1hbmRIYW5kbGVyQ29tcG9uZW50ID0gdGhpcy5hZGRVbml2ZXJzYWxDaGlsZChcbiAgICAgICAgbmV3IENvbW1hbmRIYW5kbGVyQ29tcG9uZW50KHtcbiAgICAgICAgICBhY3RpdmVGaWxlUHJvdmlkZXI6IG5ldyBBcHBBY3RpdmVGaWxlUHJvdmlkZXIodGhpcy5hcHApLFxuICAgICAgICAgIGFkZGl0aW9uYWxNZW51RXZlbnRSZWdpc3RyYXJzOiBbbm90ZWJvb2tOYXZpZ2F0b3JNZW51RXZlbnRSZWdpc3RyYXJDb21wb25lbnRdLFxuICAgICAgICAgIGNvbW1hbmRSZWdpc3RyYXI6IG5ldyBQbHVnaW5Db21tYW5kUmVnaXN0cmFyKHRoaXMpLFxuICAgICAgICAgIG1lbnVFdmVudFJlZ2lzdHJhcjogdGhpcy5hZGRVbml2ZXJzYWxDaGlsZChuZXcgTWVudUV2ZW50UmVnaXN0cmFyQ29tcG9uZW50KHRoaXMuYXBwKSksXG4gICAgICAgICAgcGx1Z2luTmFtZTogdGhpcy5tYW5pZmVzdC5uYW1lXG4gICAgICAgIH0pXG4gICAgICApO1xuICAgICAgLy8gQWx3YXlzIGF2YWlsYWJsZTsgdGhlIGNvbW1hbmQncyBvd24gYGNhbkV4ZWN1dGVgIGhpZGVzIGl0IHVubGVzcyB0aGUgYWN0aXZlIG5vdGUgaXMgbG9ja2VkLlxuICAgICAgYXdhaXQgdGhpcy5jb21tYW5kSGFuZGxlckNvbXBvbmVudC5yZWdpc3RlckNvbW1hbmRIYW5kbGVycygoKSA9PiBbXG4gICAgICAgIG5ldyBVbmxvY2tBY3RpdmVOb3RlQ29tbWFuZEhhbmRsZXIoe1xuICAgICAgICAgIGFwcDogdGhpcy5hcHAsXG4gICAgICAgICAgcmVzb3VyY2VMb2NrQ29tcG9uZW50OiB0aGlzLnJlc291cmNlTG9ja0NvbXBvbmVudFxuICAgICAgICB9KVxuICAgICAgXSk7XG5cbiAgICAgIHRoaXMucGx1Z2luU2V0dGluZ3NDb21wb25lbnQgPSB0aGlzLmFkZFVuaXZlcnNhbENoaWxkKFxuICAgICAgICBuZXcgUGx1Z2luU2V0dGluZ3NDb21wb25lbnRCYXNlPG9iamVjdD4oe1xuICAgICAgICAgIGRhdGFIYW5kbGVyOiBuZXcgUGx1Z2luRGF0YUhhbmRsZXIodGhpcyksXG4gICAgICAgICAgcGx1Z2luRXZlbnRTb3VyY2U6IG5ldyBQbHVnaW5FdmVudFNvdXJjZUltcGwodGhpcyksXG4gICAgICAgICAgcGx1Z2luU2V0dGluZ3NDbGFzczogT2JqZWN0XG4gICAgICAgIH0pXG4gICAgICApO1xuXG4gICAgICAvLyBUaGUgZ2F0ZS4gSXQgbG9hZHMgdGhlIGZlYXR1cmUgc3VyZmFjZSBpdHNlbGYgb25jZSBldmVyeSBkZWNsYXJlZCBkZXBlbmRlbmN5IGlzIHNhdGlzZmllZCBhbmQgbm9cbiAgICAgIC8vIERlY2xhcmVkIGNvbmZsaWN0IGhvbGRzIFx1MjAxNCB3aGljaCBmb3IgYSBwbHVnaW4gZGVjbGFyaW5nIG5laXRoZXIgaXMgaW1tZWRpYXRlbHksIHN5bmNocm9ub3VzbHksXG4gICAgICAvLyBCZWZvcmUgdGhpcyBsaW5lIHJldHVybnMgXHUyMDE0IGFuZCB1bmxvYWRzIGl0IGFnYWluIGlmIGEgZGVwZW5kZW5jeSBpcyBsYXRlciBkaXNhYmxlZCBvciB1bmluc3RhbGxlZCxcbiAgICAgIC8vIE9yIGEgY29uZmxpY3RpbmcgcGx1Z2luIGlzIGVuYWJsZWQuIEEgcGx1Z2luIHRoYXQgaXMgYmxvY2tlZCB0aGVyZWZvcmUgcmVhY2hlcyBgbG9hZFdpdGhQcm9taXNlc2BcbiAgICAgIC8vIEJlbG93IGhhdmluZyByZWdpc3RlcmVkIG5vdGhpbmcgb2YgaXRzIG93biwgd2l0aCBvbmx5IHRoZSB1bml2ZXJzYWwgY29tcG9uZW50cyBhYm92ZSBydW5uaW5nIHRvXG4gICAgICAvLyBFeHBsYWluIHdoeSBhbmQgdG8gb2ZmZXIgdGhlIHJlcGFpci5cbiAgICAgIHRoaXMucGx1Z2luR2F0ZUNvbXBvbmVudCA9IHRoaXMuYWRkVW5pdmVyc2FsQ2hpbGQoXG4gICAgICAgIG5ldyBQbHVnaW5HYXRlQ29tcG9uZW50KHtcbiAgICAgICAgICBjb25mbGljdHM6IHRoaXMuZ2V0UGx1Z2luQ29uZmxpY3RzKCksXG4gICAgICAgICAgZGVwZW5kZW5jaWVzOiB0aGlzLmdldFBsdWdpbkRlcGVuZGVuY2llcygpLFxuICAgICAgICAgIGxvYWRGZWF0dXJlU3VyZmFjZTogKCk6IFByb21pc2U8dm9pZD4gPT4gdGhpcy5sb2FkRmVhdHVyZVN1cmZhY2UoKSxcbiAgICAgICAgICBwbHVnaW46IHRoaXMsXG4gICAgICAgICAgcGx1Z2luTm90aWNlQ29tcG9uZW50OiB0aGlzLnBsdWdpbk5vdGljZUNvbXBvbmVudCxcbiAgICAgICAgICB1bmxvYWRGZWF0dXJlU3VyZmFjZTogKCk6IHZvaWQgPT4ge1xuICAgICAgICAgICAgdGhpcy51bmxvYWRGZWF0dXJlU3VyZmFjZSgpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSlcbiAgICAgICk7XG5cbiAgICAgIC8vIEV2ZXJ5IGNoaWxkIGhhcyBhbHJlYWR5IGxvYWRlZCBhcyBpdCB3YXMgYWRkZWQ7IHRoaXMgYXdhaXRzIHRoZWlyIGFjY3VtdWxhdGVkIGFzeW5jIHRhaWxzIGFuZFxuICAgICAgLy8gUmVwb3J0cyBhbnkgZmFpbHVyZSBhcyBhIHNpbmdsZSBgQWdncmVnYXRlRXJyb3JgLlxuICAgICAgYXdhaXQgdGhpcy51bml2ZXJzYWxXcmFwcGVyQ29tcG9uZW50LmxvYWRXaXRoUHJvbWlzZXMoKTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgcHJpbnRFcnJvcihuZXcgRXJyb3IoYEVycm9yIGxvYWRpbmcgcGx1Z2luICR7dGhpcy5tYW5pZmVzdC5uYW1lfSAoJHt0aGlzLm1hbmlmZXN0LmlkfSlgLCB7IGNhdXNlOiBlcnJvciB9KSk7XG4gICAgICB0aHJvdyBlcnJvcjtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQ2FsbGVkIHdoZW4gdGhlIHBsdWdpbiBpcyB1bmxvYWRlZC5cbiAgICpcbiAgICogQW5ub3VuY2VzIHRoZSBkZXBhcnR1cmUgb24gYGFwcC53b3Jrc3BhY2VgIHNvIGFueXRoaW5nIGRlcGVuZGluZyBvbiB0aGlzIHBsdWdpbiBsZWFybnMgb2YgaXQgYXQgdGhlXG4gICAqIG1vbWVudCBpdCBoYXBwZW5zLCByYXRoZXIgdGhhbiBkaXNjb3ZlcmluZyBpdCBsYXRlciB0aHJvdWdoIGJlaGF2aW9yIHRoYXQgcXVpZXRseSBzdG9wcGVkLlxuICAgKlxuICAgKiBEbyBOT1Qgb3ZlcnJpZGUgdGhpcyBtZXRob2Q7IHB1dCB0ZWFyZG93biBvbiBhIGNvbXBvbmVudCBpbnN0ZWFkLCB3aGljaCB1bmxvYWRzIHdpdGggdGhlIHBsdWdpbi5cbiAgICovXG4gIHB1YmxpYyBvdmVycmlkZSBvbnVubG9hZCgpOiB2b2lkIHtcbiAgICB0aGlzLmJyb2FkY2FzdFVubG9hZGVkKCk7XG4gICAgc3VwZXIub251bmxvYWQoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZW1vdmVzIGEgY2hpbGQgY29tcG9uZW50LlxuICAgKlxuICAgKiBAdHlwZVBhcmFtIFRDb21wb25lbnQgLSBUaGUgdHlwZSBvZiBjb21wb25lbnQgdG8gcmVtb3ZlLlxuICAgKiBAcGFyYW0gY29tcG9uZW50IC0gVGhlIGNvbXBvbmVudCBpbnN0YW5jZSB0byByZW1vdmUuXG4gICAqIEByZXR1cm5zIFRoZSByZW1vdmVkIGNvbXBvbmVudC5cbiAgICovXG4gIHB1YmxpYyBvdmVycmlkZSByZW1vdmVDaGlsZDxUQ29tcG9uZW50IGV4dGVuZHMgQ29tcG9uZW50Pihjb21wb25lbnQ6IFRDb21wb25lbnQpOiBUQ29tcG9uZW50IHtcbiAgICAvLyBSb3V0ZWQgYnkgb3duZXJzaGlwIHJhdGhlciB0aGFuIGJ5IHdoaWNoIHRpZXIgYGFkZENoaWxkYCB3b3VsZCBoYXZlIGNob3NlbiwgYmVjYXVzZSB0aGUgdHdvIGRvIG5vdFxuICAgIC8vIEFsd2F5cyBhZ3JlZTogYSB1bml2ZXJzYWwgY29tcG9uZW50IGlzIHBhcmVudGVkIGRpcmVjdGx5IG9uIHRoZSB1bml2ZXJzYWwgd3JhcHBlciwgeWV0IGEgc3ViY2xhc3NcbiAgICAvLyBSZXBsYWNpbmcgb25lIGdvZXMgdGhyb3VnaCB0aGUgc2FtZSBwdWJsaWMgYHJlbW92ZUNoaWxkYCBhcyBpdCB3b3VsZCBmb3IgaXRzIG93biBjaGlsZHJlbi5cbiAgICBpZiAodGhpcy5nYXRlZFdyYXBwZXJDb21wb25lbnQuaGFzQ2hpbGQoY29tcG9uZW50KSkge1xuICAgICAgcmV0dXJuIHRoaXMuZ2F0ZWRXcmFwcGVyQ29tcG9uZW50LnJlbW92ZUNoaWxkKGNvbXBvbmVudCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMudW5pdmVyc2FsV3JhcHBlckNvbXBvbmVudC5yZW1vdmVDaGlsZChjb21wb25lbnQpO1xuICB9XG5cbiAgLyoqXG4gICAqIFByb3ZpZGVzIHRoZSB0cmFuc2xhdGlvbnMgbWFwIHVzZWQgdG8gaW5pdGlhbGl6ZSBpMThuIGR1cmluZyB7QGxpbmsgb25sb2FkfS5cbiAgICpcbiAgICogT3ZlcnJpZGUgaW4gc3ViY2xhc3MgdG8gc3VwcGx5IHBsdWdpbi1zcGVjaWZpYyB0cmFuc2xhdGlvbnMuIFRoZSBkZWZhdWx0IHJldHVybnMgdGhlIGJ1aWx0LWluXG4gICAqIGBvYnNpZGlhbi1kZXYtdXRpbHNgIHRyYW5zbGF0aW9ucy5cbiAgICpcbiAgICogQHJldHVybnMgVGhlIHRyYW5zbGF0aW9ucyBtYXAuXG4gICAqL1xuICBwcm90ZWN0ZWQgY3JlYXRlVHJhbnNsYXRpb25zTWFwKCk6IFRyYW5zbGF0aW9uc01hcCB7XG4gICAgcmV0dXJuIGRlZmF1bHRUcmFuc2xhdGlvbnNNYXA7XG4gIH1cblxuICAvKipcbiAgICogUHJvdmlkZXMgdGhlIGljb24gc2hvd24gb24gdGhlIHBsdWdpbidzIHBhcmVudCBlbnRyeSBpbiBOb3RlYm9vayBOYXZpZ2F0b3IncyBjb250ZXh0IG1lbnVzLlxuICAgKlxuICAgKiBPdmVycmlkZSBpbiBzdWJjbGFzcyB0byBicmFuZCB0aGF0IGVudHJ5OyB0aGUgZGVmYXVsdCBsZWF2ZXMgaXQgd2l0aG91dCBhbiBpY29uLiBUaGUgZW50cnkgaXNcbiAgICogdGl0bGVkIHdpdGggdGhlIHBsdWdpbiBuYW1lIGFuZCBpcyBhZGRlZCBhdXRvbWF0aWNhbGx5IFx1MjAxNCBzZWVcbiAgICoge0BsaW5rIE5vdGVib29rTmF2aWdhdG9yTWVudUV2ZW50UmVnaXN0cmFyQ29tcG9uZW50fS5cbiAgICpcbiAgICogQHJldHVybnMgVGhlIGljb24sIG9yIGAnJ2AgZm9yIG5vIGljb24uXG4gICAqL1xuICBwcm90ZWN0ZWQgZ2V0Tm90ZWJvb2tOYXZpZ2F0b3JNZW51U3VibWVudUljb24oKTogSWNvbk5hbWUge1xuICAgIHJldHVybiAnJztcbiAgfVxuXG4gIC8qKlxuICAgKiBQcm92aWRlcyB0aGUgQVBJcyB0aGlzIHBsdWdpbiBleHBvc2VzIHRvIG90aGVyIHBsdWdpbnMuXG4gICAqXG4gICAqIE92ZXJyaWRlIGluIHN1YmNsYXNzIHRvIHB1Ymxpc2ggb25lLiBUaGUgZGVmYXVsdCBwdWJsaXNoZXMgbm9uZS4gQ2FsbGVkIGFmdGVyIHtAbGluayBvbmxvYWRJbXBsfSwgc28gYVxuICAgKiBkZWNsYXJhdGlvbiBtYXkgcmVmZXJlbmNlIGFueXRoaW5nIGl0IGNyZWF0ZWQ7IHRoZSByZXR1cm5lZCBkZWNsYXJhdGlvbnMgYXJlIHB1Ymxpc2hlZCB0aHJvdWdoXG4gICAqIGBwdWJsaXNoUGx1Z2luQXBpYCBhbmQgcmV2b2tlZCB3aGVuIHRoZSBwbHVnaW4ncyBmZWF0dXJlIHN1cmZhY2UgdW5sb2Fkcy5cbiAgICpcbiAgICogUmV0dXJuaW5nIGEgTElTVCByYXRoZXIgdGhhbiBhIHNpbmdsZSBBUEkgaXMgZGVsaWJlcmF0ZTogdGhlIHJlZ2lzdHJ5IHN1cHBvcnRzIHNldmVyYWwgY29udHJhY3RcbiAgICogdmVyc2lvbnMgcHVibGlzaGVkIHNpZGUgYnkgc2lkZSwgd2hpY2ggaXMgaG93IGEgcHJvdmlkZXIgc2hpcHMgYSBicmVha2luZyBgMi4wLjBgIHdpdGhvdXQgc3RyYW5kaW5nXG4gICAqIGNvbnN1bWVycyBzdGlsbCBwaW5uZWQgdG8gYF4xYC5cbiAgICpcbiAgICogRXZlcnkgZGVjbGFyYXRpb24gaGVyZSBpcyBwdWJsaXNoZWQgQkVGT1JFIHRoZSBgb2JzaWRpYW4tZGV2LXV0aWxzOnBsdWdpbi1sb2FkZWRgIGJyb2FkY2FzdCwgd2hpY2ggaXNcbiAgICogd2hhdCBsZXRzIGEgbGlzdGVuZXIgY2FsbCB0aGVzZSBBUElzIHRoZSBtb21lbnQgaXQgaGVhcnMgdGhhdCBldmVudC5cbiAgICpcbiAgICogQHJldHVybnMgVGhlIEFQSSBkZWNsYXJhdGlvbnMuXG4gICAqL1xuICBwcm90ZWN0ZWQgZ2V0UGx1Z2luQXBpcygpOiBQbHVnaW5BcGlEZWNsYXJhdGlvbltdIHtcbiAgICByZXR1cm4gW107XG4gIH1cblxuICAvKipcbiAgICogUHJvdmlkZXMgdGhlIHBsdWdpbnMgdGhpcyBvbmUgcmVmdXNlcywgb3Igd2FybnMgYWJvdXQsIHJ1bm5pbmcgYmVzaWRlLlxuICAgKlxuICAgKiBPdmVycmlkZSBpbiBzdWJjbGFzcyB0byBkZWNsYXJlIGFuIG92ZXJsYXAuIFRoZSBkZWZhdWx0IGRlY2xhcmVzIG5vbmUuXG4gICAqXG4gICAqIEEgYEJsb2NrYCBjb25mbGljdCBpcyB0aGUgbWlycm9yIGltYWdlIG9mIGEgZGVwZW5kZW5jeTogd2hpbGUgYSBjb25mbGljdGluZyBwbHVnaW4gaXMgZW5hYmxlZCBhdCBhXG4gICAqIGNvbmZsaWN0aW5nIHZlcnNpb24sIHtAbGluayBvbmxvYWRJbXBsfSBkb2VzIG5vdCBydW4gYXQgYWxsIGFuZCB0aGUgcGx1Z2luIHJlZ2lzdGVycyBub3RoaW5nLiBEZWNsYXJlXG4gICAqIGl0IHdoZW4gYm90aCBwbHVnaW5zIGFjdGluZyBvbiB0aGUgc2FtZSBvcGVyYXRpb24gZGFtYWdlcyB0aGUgdmF1bHQgXHUyMDE0IHRoZXJlIGlzIG5vIHJlbGlhYmxlIHdheSB0byB3aW5cbiAgICogdGhhdCByYWNlLCBiZWNhdXNlIHdoaWNoZXZlciBwbHVnaW4gbG9hZGVkIGZpcnN0IGtlZXBzIGEgaGFuZCBvbiB0aGUgd2hlZWwsIHNvIHJlZnVzaW5nIGRldGVybWluaXN0aWNhbGx5XG4gICAqIGJlYXRzIGNvbXBldGluZyB1bnByZWRpY3RhYmx5LiBBIGBXYXJuYCBjb25mbGljdCBkZWNsYXJlcyBhbiBvdmVybGFwIHRoYXQgaXMgbWVyZWx5IGFubm95aW5nLCBzdWNoIGFzIGFcbiAgICogZHVwbGljYXRlZCBjb21tYW5kOiBib3RoIHBsdWdpbnMga2VlcCBydW5uaW5nIGFuZCB0aGUgdXNlciBpcyB0b2xkLlxuICAgKlxuICAgKiBVbmxpa2UgYSBkZXBlbmRlbmN5LCBhIGNvbmZsaWN0aW5nIHBsdWdpbiBuZWVkIG5vdCBwdWJsaXNoIGFueXRoaW5nIFx1MjAxNCBpdCBpcyBkZXRlY3RlZCBieSByZWFkaW5nIGl0c1xuICAgKiBpbnN0YWxsZWQgdmVyc2lvbiwgd2hpY2ggaXMgdGhlIG9ubHkgdGhpbmcgYWJvdXQgYW5vdGhlciBwbHVnaW4gdGhhdCByZWFkcyB0aGUgc2FtZSByZWdhcmRsZXNzIG9mIGxvYWRcbiAgICogb3JkZXIuXG4gICAqXG4gICAqIEByZXR1cm5zIFRoZSBkZWNsYXJlZCBjb25mbGljdHMuXG4gICAqL1xuICBwcm90ZWN0ZWQgZ2V0UGx1Z2luQ29uZmxpY3RzKCk6IFBsdWdpbkNvbmZsaWN0W10ge1xuICAgIHJldHVybiBbXTtcbiAgfVxuXG4gIC8qKlxuICAgKiBQcm92aWRlcyB0aGUgcGx1Z2lucyB0aGlzIG9uZSBjYW5ub3Qgd29yayB3aXRob3V0LlxuICAgKlxuICAgKiBPdmVycmlkZSBpbiBzdWJjbGFzcyB0byBkZWNsYXJlIGEgbWFuZGF0b3J5IGRlcGVuZGVuY3kuIFRoZSBkZWZhdWx0IGRlY2xhcmVzIG5vbmUsIGFuZCBzdWNoIGEgcGx1Z2luXG4gICAqIGxvYWRzIGV4YWN0bHkgYXMgaXQgYWx3YXlzIGhhcy5cbiAgICpcbiAgICogQSBkZWNsYXJlZCBkZXBlbmRlbmN5IGlzIE1BTkRBVE9SWSwgdW5saWtlIHRoZSBvZmZlciBgUGx1Z2luU3VnZ2VzdGlvbkNvbXBvbmVudGAgbWFrZXM6IHdoaWxlIG9uZSBpc1xuICAgKiBtaXNzaW5nLCBkaXNhYmxlZCwgb3IgdG9vIG9sZCwge0BsaW5rIG9ubG9hZEltcGx9IGRvZXMgbm90IHJ1biBhdCBhbGwgYW5kIHRoZSBwbHVnaW4gcmVnaXN0ZXJzIG5vdGhpbmdcbiAgICogXHUyMDE0IG5vIGNvbW1hbmRzLCBubyBoYW5kbGVycywgbm8gcGF0Y2hlcy4gSXQgc3RheXMgZW5hYmxlZCBpbiBPYnNpZGlhbidzIGxpc3QgcmF0aGVyIHRoYW4gZGlzYWJsaW5nXG4gICAqIGl0c2VsZiwgYmVjYXVzZSB0aGUgZW5hYmxlZCBzZXQgaXMgdGhlIHVzZXIncyB0byBjaGFuZ2UsIGFuZCBpdCBleHBsYWlucyBpdHNlbGYgdGhyb3VnaCBhIG5vdGljZSBhbmQgYVxuICAgKiBzZXR0aW5ncyBiYW5uZXIgdGhhdCBpbnN0YWxscyB0aGUgbWlzc2luZyBwbHVnaW4gaW4gb25lIGNsaWNrLiBUaGUgbG9hZCBjb21wbGV0ZXMgdGhlIG1vbWVudCB0aGVcbiAgICogZGVwZW5kZW5jeSBhcnJpdmVzLCB3aXRoIG5vIHJlc3RhcnQuXG4gICAqXG4gICAqIEEgZGVwZW5kZW5jeSBtdXN0IHB1Ymxpc2ggYW4gQVBJIHRocm91Z2ggYHB1Ymxpc2hQbHVnaW5BcGlgLCB3aGljaCBpcyB3aGF0IG1ha2VzIGl0cyBwcmVzZW5jZSxcbiAgICogYWJzZW5jZSwgdmVyc2lvbiBhbmQgZGVwYXJ0dXJlIGFsbCBvYnNlcnZhYmxlIHRocm91Z2ggb25lIG1lY2hhbmlzbS4gQSBwbHVnaW4gd2l0aCBub3RoaW5nIHRvIGV4cG9zZVxuICAgKiBjYW4gcHVibGlzaCBhbiBlbXB0eSBBUEkgcHVyZWx5IHNvIGl0IGNhbiBiZSBkZXBlbmRlZCB1cG9uLlxuICAgKlxuICAgKiBAcmV0dXJucyBUaGUgZGVjbGFyZWQgZGVwZW5kZW5jaWVzLlxuICAgKi9cbiAgcHJvdGVjdGVkIGdldFBsdWdpbkRlcGVuZGVuY2llcygpOiBQbHVnaW5EZXBlbmRlbmN5W10ge1xuICAgIHJldHVybiBbXTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDYWxsZWQgZHVyaW5nIHtAbGluayBvbmxvYWR9IHRvIHdpcmUgcGx1Z2luLXNwZWNpZmljIGNoaWxkIGNvbXBvbmVudHMuXG4gICAqXG4gICAqIE92ZXJyaWRlIGluIHN1YmNsYXNzIHRvIGFkZCBjaGlsZCBjb21wb25lbnRzIHZpYSB7QGxpbmsgYWRkQ2hpbGR9LiBUaGUgdW5pdmVyc2FsIGNvbXBvbmVudHMgYXJlXG4gICAqIGF2YWlsYWJsZSBoZXJlLiBDaGlsZHJlbiBhcmUgbG9hZGVkIHNlcXVlbnRpYWxseSBpbiB0aGUgb3JkZXIgdGhleSBhcmUgYWRkZWQgKGNoaWxkcmVuLWZpcnN0KS5cbiAgICpcbiAgICogQHJldHVybnMgQSB7QGxpbmsgUHJvbWlzZX0gdGhhdCByZXNvbHZlcyB3aGVuIHRoZSBzdWJjbGFzcyBsb2FkIGxvZ2ljIGlzIGNvbXBsZXRlLlxuICAgKi9cbiAgcHJvdGVjdGVkIG9ubG9hZEltcGwoKTogUHJvbWlzYWJsZTx2b2lkPiB7XG4gICAgcmV0dXJuIG5vb3BBc3luYygpO1xuICB9XG5cbiAgLyoqXG4gICAqIFN0b3JlcyBhIHVuaXZlcnNhbCBjb21wb25lbnQsIHVubG9hZGluZyB3aGljaGV2ZXIgY29tcG9uZW50IHRoZSBrZXkgaGVsZCBiZWZvcmUuXG4gICAqXG4gICAqIEtleWVkIGJ5IG5hbWUgcmF0aGVyIHRoYW4gaGFuZGVkIHRoZSBwcmV2aW91cyB2YWx1ZSBiZWNhdXNlIGBrZXlvZiB0aGlzYCBleGNsdWRlcyBwcml2YXRlXG4gICAqIG1lbWJlcnMsIHNvIHRoZSBjb21wb25lbnRzIGxpdmUgaW4gYSBzaW5nbGUge0BsaW5rIFBsdWdpbkJhc2VDb21wb25lbnRzfSBiYWcgd2hvc2Uga2V5cyBBUkVcbiAgICogaW5kZXhhYmxlLlxuICAgKlxuICAgKiBAdHlwZVBhcmFtIFRLZXkgLSBUaGUga2V5IG9mIHRoZSBjb21wb25lbnQgdG8gc3RvcmUuXG4gICAqIEBwYXJhbSBrZXkgLSBUaGUga2V5IG9mIHRoZSBjb21wb25lbnQgdG8gc3RvcmUuXG4gICAqIEBwYXJhbSB2YWx1ZSAtIFRoZSBjb21wb25lbnQgdG8gc3RvcmUuXG4gICAqL1xuICAvKipcbiAgICogQWRkcyBhIGNvbXBvbmVudCB0byB0aGUgdW5pdmVyc2FsIHRpZXIsIHdoaWNoIG91dGxpdmVzIGFueSBkZXBlbmRlbmN5LlxuICAgKlxuICAgKiBQcml2YXRlIG9uIHB1cnBvc2U6IG9ubHkgdGhpcyBjbGFzcyBkZWNpZGVzIHdoYXQgaXMgdW5pdmVyc2FsLiBBIHN1YmNsYXNzIGFkZGluZyBvbmUgb2YgaXRzIG93biBnb2VzXG4gICAqIHRocm91Z2gge0BsaW5rIGFkZENoaWxkfSBhbmQgbGFuZHMgaW4gdGhlIGdhdGVkIHRpZXIsIHdoZXJlIGl0IGJlbG9uZ3MuXG4gICAqXG4gICAqIEB0eXBlUGFyYW0gVENvbXBvbmVudCAtIFRoZSB0eXBlIG9mIGNvbXBvbmVudCB0byBhZGQuXG4gICAqIEBwYXJhbSBjb21wb25lbnQgLSBUaGUgY29tcG9uZW50IGluc3RhbmNlIHRvIGFkZC5cbiAgICogQHJldHVybnMgVGhlIGFkZGVkIGNvbXBvbmVudC5cbiAgICovXG4gIHByaXZhdGUgYWRkVW5pdmVyc2FsQ2hpbGQ8VENvbXBvbmVudCBleHRlbmRzIENvbXBvbmVudD4oY29tcG9uZW50OiBUQ29tcG9uZW50KTogVENvbXBvbmVudCB7XG4gICAgcmV0dXJuIHRoaXMudW5pdmVyc2FsV3JhcHBlckNvbXBvbmVudC5hZGRDaGlsZChjb21wb25lbnQpO1xuICB9XG5cbiAgLyoqXG4gICAqIEFubm91bmNlcyBvbiBgYXBwLndvcmtzcGFjZWAgdGhhdCB0aGlzIHBsdWdpbiBpcyBsb2FkZWQgYW5kIGl0cyBBUElzIGFyZSBjYWxsYWJsZS5cbiAgICovXG4gIHByaXZhdGUgYnJvYWRjYXN0TG9hZGVkKCk6IHZvaWQge1xuICAgIHRoaXMubGlmZWN5Y2xlRXZlbnRQYXlsb2FkID0ge1xuICAgICAgYXBpVmVyc2lvbnM6IHRoaXMuZ2V0UGx1Z2luQXBpcygpLm1hcCgoZGVjbGFyYXRpb24pID0+IGRlY2xhcmF0aW9uLmFwaVZlcnNpb24pLFxuICAgICAgZGVwZW5kZW5jeVBsdWdpbklkczogdGhpcy5nZXRQbHVnaW5EZXBlbmRlbmNpZXMoKS5tYXAoKGRlcGVuZGVuY3kpID0+IGRlcGVuZGVuY3kucGx1Z2luSWQpLFxuICAgICAgcGx1Z2luSWQ6IHRoaXMubWFuaWZlc3QuaWQsXG4gICAgICBwbHVnaW5OYW1lOiB0aGlzLm1hbmlmZXN0Lm5hbWUsXG4gICAgICBwbHVnaW5WZXJzaW9uOiB0aGlzLm1hbmlmZXN0LnZlcnNpb25cbiAgICB9O1xuXG4gICAgdHJpZ2dlclBsdWdpbkxpZmVjeWNsZUV2ZW50KHtcbiAgICAgIGFwcDogdGhpcy5hcHAsXG4gICAgICBuYW1lOiBQTFVHSU5fTE9BREVEX0VWRU5UX05BTUUsXG4gICAgICBwYXlsb2FkOiB0aGlzLmxpZmVjeWNsZUV2ZW50UGF5bG9hZFxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEFubm91bmNlcyBvbiBgYXBwLndvcmtzcGFjZWAgdGhhdCB0aGlzIHBsdWdpbidzIHN1cmZhY2UgaGFzIGdvbmUgYXdheS5cbiAgICpcbiAgICogU2lsZW50IHVubGVzcyBhIGxvYWRlZCBicm9hZGNhc3QgaXMgb3V0c3RhbmRpbmcsIHNvIHRoZSB0d28gZXZlbnRzIHN0YXkgcGFpcmVkOiBhIHBsdWdpbiB0aGF0IG5ldmVyXG4gICAqIGdvdCBwYXN0IGl0cyBkZXBlbmRlbmN5IGdhdGUgbmV2ZXIgYW5ub3VuY2VkIGl0c2VsZiwgYW5kIG11c3Qgbm90IGFubm91bmNlIGEgZGVwYXJ0dXJlIGVpdGhlci5cbiAgICovXG4gIHByaXZhdGUgYnJvYWRjYXN0VW5sb2FkZWQoKTogdm9pZCB7XG4gICAgY29uc3QgcGF5bG9hZCA9IHRoaXMubGlmZWN5Y2xlRXZlbnRQYXlsb2FkO1xuICAgIGlmICghcGF5bG9hZCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMubGlmZWN5Y2xlRXZlbnRQYXlsb2FkID0gbnVsbDtcbiAgICB0cmlnZ2VyUGx1Z2luTGlmZWN5Y2xlRXZlbnQoe1xuICAgICAgYXBwOiB0aGlzLmFwcCxcbiAgICAgIG5hbWU6IFBMVUdJTl9VTkxPQURFRF9FVkVOVF9OQU1FLFxuICAgICAgcGF5bG9hZFxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEJ1aWxkcyBhbmQgbG9hZHMgdGhlIHN1YmNsYXNzJ3MgZmVhdHVyZSBzdXJmYWNlLCB0aGVuIHB1Ymxpc2hlcyBpdHMgQVBJcyBhbmQgYW5ub3VuY2VzIGl0c2VsZi5cbiAgICpcbiAgICogTk9UIGlkZW1wb3RlbnQsIGRlbGliZXJhdGVseS4gYFBsdWdpbkdhdGVDb21wb25lbnRgIG93bnMgdGhlIHVwL2Rvd24gc3RhdGUgbWFjaGluZSBhbmQgY2FsbHNcbiAgICogdGhpcyBvbmx5IG9uIGEgcmVhbCB0cmFuc2l0aW9uOyBhIHNlY29uZCBndWFyZCBoZXJlIHdvdWxkIGJlIGEgc2Vjb25kIGNvcHkgb2YgdGhhdCBzdGF0ZSwgd2hpY2ggaXMgdGhlXG4gICAqIGtpbmQgb2YgZHVwbGljYXRlIHRoYXQgZHJpZnRzLlxuICAgKlxuICAgKiBAcmV0dXJucyBBIHtAbGluayBQcm9taXNlfSB0aGF0IHJlc29sdmVzIG9uY2UgdGhlIHN1cmZhY2UgaXMgbG9hZGVkIGFuZCB0aGUgYnJvYWRjYXN0IGhhcyBiZWVuIG1hZGUuXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIGxvYWRGZWF0dXJlU3VyZmFjZSgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAvLyBMb2FkZWQgZXhwbGljaXRseSBmb3IgdGhlIHNhbWUgcmVhc29uIHRoZSB1bml2ZXJzYWwgd3JhcHBlciBpczogYGFkZENoaWxkYCBsb2FkcyBhIGNoaWxkIG9ubHkgb25jZVxuICAgIC8vIEl0cyBwYXJlbnQgaXMgbG9hZGVkLCBhbmQgdGhlIHN1cmZhY2UgaGFzIHRvIGJlIGxpdmUgYmVmb3JlIGBvbmxvYWRJbXBsYCBzdGFydHMgYWRkaW5nIHRvIGl0LlxuICAgIGNvbnN0IGdhdGVkV3JhcHBlckNvbXBvbmVudCA9IHRoaXMuZ2F0ZWRXcmFwcGVyQ29tcG9uZW50O1xuICAgIHRoaXMudW5pdmVyc2FsV3JhcHBlckNvbXBvbmVudC5hZGRDaGlsZChnYXRlZFdyYXBwZXJDb21wb25lbnQpO1xuICAgIGdhdGVkV3JhcHBlckNvbXBvbmVudC5sb2FkKCk7XG5cbiAgICBhd2FpdCB0aGlzLm9ubG9hZEltcGwoKTtcbiAgICBhd2FpdCBnYXRlZFdyYXBwZXJDb21wb25lbnQubG9hZFdpdGhQcm9taXNlcygpO1xuXG4gICAgZm9yIChjb25zdCBkZWNsYXJhdGlvbiBvZiB0aGlzLmdldFBsdWdpbkFwaXMoKSkge1xuICAgICAgcHVibGlzaFBsdWdpbkFwaSh7XG4gICAgICAgIC4uLmRlY2xhcmF0aW9uLFxuICAgICAgICAvLyBSZXZva2VkIHdpdGggdGhlIFNVUkZBQ0UsIG5vdCB3aXRoIHRoZSBwbHVnaW46IGEgcGx1Z2luIHdob3NlIGRlcGVuZGVuY3kgZ29lcyBhd2F5IGtlZXBzIHJ1bm5pbmdcbiAgICAgICAgLy8gSXRzIHVuaXZlcnNhbCBjb21wb25lbnRzLCBhbmQgYSBjb25zdW1lciBtdXN0IG5vdCBiZSBsZWZ0IGhvbGRpbmcgYSBoYW5kbGUgaW50byB0aGUgaGFsZiBvZiBpdFxuICAgICAgICAvLyBUaGF0IHdhcyBqdXN0IHRvcm4gZG93bi5cbiAgICAgICAgY29tcG9uZW50OiBnYXRlZFdyYXBwZXJDb21wb25lbnQsXG4gICAgICAgIHBsdWdpbjogdGhpc1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgdGhpcy5icm9hZGNhc3RMb2FkZWQoKTtcbiAgfVxuXG4gIHByaXZhdGUgc2V0Q29tcG9uZW50PFRLZXkgZXh0ZW5kcyBrZXlvZiBQbHVnaW5CYXNlQ29tcG9uZW50cz4oa2V5OiBUS2V5LCB2YWx1ZTogTm9uTnVsbGFibGU8UGx1Z2luQmFzZUNvbXBvbmVudHNbVEtleV0+KTogdm9pZCB7XG4gICAgY29uc3Qgb2xkQ29tcG9uZW50ID0gdGhpcy5jb21wb25lbnRzW2tleV07XG4gICAgaWYgKG9sZENvbXBvbmVudCkge1xuICAgICAgdGhpcy5yZW1vdmVDaGlsZChvbGRDb21wb25lbnQpO1xuICAgIH1cbiAgICB0aGlzLmNvbXBvbmVudHNba2V5XSA9IHZhbHVlO1xuICB9XG5cbiAgLyoqXG4gICAqIFRlYXJzIHRoZSBzdWJjbGFzcydzIGZlYXR1cmUgc3VyZmFjZSBkb3duLCBsZWF2aW5nIHRoZSB1bml2ZXJzYWwgY29tcG9uZW50cyBydW5uaW5nLlxuICAgKi9cbiAgcHJpdmF0ZSB1bmxvYWRGZWF0dXJlU3VyZmFjZSgpOiB2b2lkIHtcbiAgICBjb25zdCBnYXRlZFdyYXBwZXJDb21wb25lbnQgPSB0aGlzLmdhdGVkV3JhcHBlckNvbXBvbmVudDtcblxuICAgIC8vIFJlcGxhY2VkIEJFRk9SRSB0aGUgb2xkIG9uZSBpcyB1bmxvYWRlZCwgc28gYW55dGhpbmcgdGhhdCByZXN1bWVzIG1pZC10ZWFyZG93biBhbmQgY2FsbHMgYGFkZENoaWxkYFxuICAgIC8vIFBhcmtzIGl0cyBjaGlsZCBvbiB0aGUgZnJlc2ggc3VyZmFjZSByYXRoZXIgdGhhbiBvbiB0aGUgb25lIGJlaW5nIHRvcm4gZG93biBcdTIwMTQgd2hlcmUgYENvbXBvbmVudEV4YFxuICAgIC8vIFdvdWxkIHJlZnVzZSBpdCBvdXRyaWdodCwgc2luY2UgaXQgcmVmdXNlcyBjaGlsZHJlbiBhZGRlZCB0byBhbiBhbHJlYWR5LXVubG9hZGVkIGNvbXBvbmVudC5cbiAgICB0aGlzLmdhdGVkV3JhcHBlckNvbXBvbmVudCA9IG5ldyBDb21wb25lbnRFeCgpO1xuICAgIHRoaXMudW5pdmVyc2FsV3JhcHBlckNvbXBvbmVudC5yZW1vdmVDaGlsZChnYXRlZFdyYXBwZXJDb21wb25lbnQpO1xuXG4gICAgdGhpcy5icm9hZGNhc3RVbmxvYWRlZCgpO1xuICB9XG59XG5cbi8qKlxuICogUmVsb2FkcyB0aGUgc3BlY2lmaWVkIHBsdWdpbiBieSBkaXNhYmxpbmcgYW5kIHRoZW4gcmUtZW5hYmxpbmcgaXQuXG4gKlxuICogQHBhcmFtIHBsdWdpbiAtIFRoZSBwbHVnaW4gdG8gcmVsb2FkLlxuICogQHJldHVybnMgQSB7QGxpbmsgUHJvbWlzZX0gdGhhdCByZXNvbHZlcyB3aGVuIHRoZSBwbHVnaW4gaXMgcmVsb2FkZWQuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiByZWxvYWRQbHVnaW4ocGx1Z2luOiBQbHVnaW4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgcGx1Z2lucyA9IHBsdWdpbi5hcHAucGx1Z2lucztcbiAgY29uc3QgcGx1Z2luSWQgPSBwbHVnaW4ubWFuaWZlc3QuaWQ7XG4gIGF3YWl0IHBsdWdpbnMuZGlzYWJsZVBsdWdpbihwbHVnaW5JZCk7XG4gIGF3YWl0IHBsdWdpbnMuZW5hYmxlUGx1Z2luKHBsdWdpbklkKTtcbn1cblxuLyoqXG4gKiBEaXNwbGF5cyBhbiBlcnJvciBtZXNzYWdlIGFzIGEgbm90aWNlLCBsb2dzIGl0IHRvIHRoZSBjb25zb2xlLCBhbmQgZGlzYWJsZXMgdGhlIHNwZWNpZmllZCBwbHVnaW4uXG4gKlxuICogQHBhcmFtIHBsdWdpbiAtIFRoZSBwbHVnaW4gdG8gZGlzYWJsZS5cbiAqIEBwYXJhbSBtZXNzYWdlIC0gVGhlIGVycm9yIG1lc3NhZ2UgdG8gZGlzcGxheSBhbmQgbG9nLlxuICogQHJldHVybnMgQSB7QGxpbmsgUHJvbWlzZX0gdGhhdCByZXNvbHZlcyB3aGVuIHRoZSBwbHVnaW4gaXMgZGlzYWJsZWQuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBzaG93RXJyb3JBbmREaXNhYmxlUGx1Z2luKHBsdWdpbjogUGx1Z2luLCBtZXNzYWdlOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgcGx1Z2luTm90aWNlQ29tcG9uZW50ID0gbmV3IFBsdWdpbk5vdGljZUNvbXBvbmVudCh7XG4gICAgYXBwOiBwbHVnaW4uYXBwLFxuICAgIHBsdWdpbk5hbWU6IHBsdWdpbi5tYW5pZmVzdC5uYW1lXG4gIH0pO1xuICBwbHVnaW5Ob3RpY2VDb21wb25lbnQuc2hvd05vdGljZShtZXNzYWdlKTtcbiAgcHJpbnRFcnJvcihuZXcgRXJyb3IobWVzc2FnZSkpO1xuICBhd2FpdCBwbHVnaW4uYXBwLnBsdWdpbnMuZGlzYWJsZVBsdWdpbihwbHVnaW4ubWFuaWZlc3QuaWQpO1xufVxuIl0sCiAgIm1hcHBpbmdzIjogIjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQWNBLFNBQVMsY0FBYztBQWN2QixTQUFTLHdCQUF3QjtBQUNqQyxTQUFTLGtCQUFrQjtBQUMz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
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
{
|
|
2
|
+
"main": "../../../dist/lib/cjs/obsidian/components/plugin-gate-component.cjs",
|
|
3
|
+
"module": "../../../dist/lib/esm/obsidian/components/plugin-gate-component.mjs",
|
|
4
|
+
"type": "module",
|
|
5
|
+
"types": "../../../dist/lib/cjs/obsidian/components/plugin-gate-component.d.cts"
|
|
6
|
+
}
|