velocious 1.0.504 → 1.0.506
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/build/configuration-types.js +2 -0
- package/build/configuration.js +11 -3
- package/build/database/drivers/sqlite/table-rebuilder.js +35 -0
- package/build/src/configuration-types.d.ts +10 -0
- package/build/src/configuration-types.d.ts.map +1 -1
- package/build/src/configuration-types.js +3 -1
- package/build/src/configuration.d.ts.map +1 -1
- package/build/src/configuration.js +12 -4
- package/build/src/database/drivers/sqlite/table-rebuilder.d.ts.map +1 -1
- package/build/src/database/drivers/sqlite/table-rebuilder.js +31 -1
- package/build/src/sync/query-scope.d.ts +6 -1
- package/build/src/sync/query-scope.d.ts.map +1 -1
- package/build/src/sync/query-scope.js +9 -3
- package/build/src/sync/sync-client-types.d.ts +18 -0
- package/build/src/sync/sync-client-types.d.ts.map +1 -1
- package/build/src/sync/sync-client-types.js +1 -1
- package/build/src/sync/sync-client.d.ts +61 -0
- package/build/src/sync/sync-client.d.ts.map +1 -1
- package/build/src/sync/sync-client.js +112 -2
- package/build/src/sync/sync-realtime-bridge.d.ts +20 -6
- package/build/src/sync/sync-realtime-bridge.d.ts.map +1 -1
- package/build/src/sync/sync-realtime-bridge.js +52 -18
- package/build/src/sync/sync-resource-base.d.ts +20 -0
- package/build/src/sync/sync-resource-base.d.ts.map +1 -1
- package/build/src/sync/sync-resource-base.js +19 -1
- package/build/src/sync/sync-websocket-channel.d.ts +32 -0
- package/build/src/sync/sync-websocket-channel.d.ts.map +1 -1
- package/build/src/sync/sync-websocket-channel.js +73 -2
- package/build/sync/query-scope.js +9 -2
- package/build/sync/sync-client-types.js +10 -0
- package/build/sync/sync-client.js +125 -1
- package/build/sync/sync-realtime-bridge.js +52 -17
- package/build/sync/sync-resource-base.js +21 -0
- package/build/sync/sync-websocket-channel.js +80 -1
- package/package.json +1 -1
- package/src/configuration-types.js +2 -0
- package/src/configuration.js +11 -3
- package/src/database/drivers/sqlite/table-rebuilder.js +35 -0
- package/src/sync/query-scope.js +9 -2
- package/src/sync/sync-client-types.js +10 -0
- package/src/sync/sync-client.js +125 -1
- package/src/sync/sync-realtime-bridge.js +52 -17
- package/src/sync/sync-resource-base.js +21 -0
- package/src/sync/sync-websocket-channel.js +80 -1
|
@@ -3,6 +3,7 @@ import Configuration from "../configuration.js";
|
|
|
3
3
|
import { isBooleanColumnType } from "../database/column-types.js";
|
|
4
4
|
import Logger from "../logger.js";
|
|
5
5
|
import restArgsError from "../utils/rest-args-error.js";
|
|
6
|
+
import VelociousWebsocketClient from "../http-client/websocket-client.js";
|
|
6
7
|
import { serializedScopeFromQuery } from "./query-scope.js";
|
|
7
8
|
import SyncApiClient from "./sync-api-client.js";
|
|
8
9
|
import SyncRealtimeBridge from "./sync-realtime-bridge.js";
|
|
@@ -81,11 +82,19 @@ export default class SyncClient {
|
|
|
81
82
|
postReplay: transportPoster({ path: `${clientConfiguration.mountPath}/replay`, transport: clientConfiguration.transport }),
|
|
82
83
|
realtime: clientConfiguration.realtime,
|
|
83
84
|
resources,
|
|
84
|
-
syncModel: resolvedSyncModel
|
|
85
|
+
syncModel: resolvedSyncModel,
|
|
86
|
+
websocketClient: clientConfiguration.websocketClient,
|
|
87
|
+
websocketUrl: clientConfiguration.websocketUrl
|
|
85
88
|
};
|
|
86
89
|
this._clientNumber = ++clientCounter;
|
|
87
90
|
/** @type {SyncRealtimeBridge | null} */
|
|
88
91
|
this._realtimeBridge = null;
|
|
92
|
+
/** @type {import("./sync-client-types.js").SyncClientSharedConnection | null | undefined} Shared app-lifetime websocket connection (undefined until first resolved, null when none is configured). */
|
|
93
|
+
this._syncConnection = undefined;
|
|
94
|
+
/** @type {Promise<void> | null} */
|
|
95
|
+
this._subscribeUserScopePromise = null;
|
|
96
|
+
/** @type {"subscribed" | "subscribing" | "unsubscribed"} */
|
|
97
|
+
this._userScopeState = "unsubscribed";
|
|
89
98
|
/** @type {import("./sync-scope-store.js").default | null} */
|
|
90
99
|
this._scopeStore = scopeStore || null;
|
|
91
100
|
/** @type {Promise<void> | null} */
|
|
@@ -391,6 +400,32 @@ export default class SyncClient {
|
|
|
391
400
|
return await applier(sync);
|
|
392
401
|
};
|
|
393
402
|
}
|
|
403
|
+
/**
|
|
404
|
+
* Resolves the shared app-lifetime websocket connection all sync traffic
|
|
405
|
+
* rides, or null when none is configured. Built once and memoized (per
|
|
406
|
+
* client): an app-provided `sync.client.websocketClient` instance wins (the
|
|
407
|
+
* frontend-model transport can pass its own client so one socket carries
|
|
408
|
+
* everything), else a framework-owned reconnecting {@link VelociousWebsocketClient}
|
|
409
|
+
* built from `sync.client.websocketUrl`. The realtime bridge rides this
|
|
410
|
+
* connection without owning its lifecycle; when neither is configured the
|
|
411
|
+
* bridge falls back to the deprecated per-cycle `realtime.createClient`.
|
|
412
|
+
* @returns {import("./sync-client-types.js").SyncClientSharedConnection | null} Shared websocket connection, or null.
|
|
413
|
+
*/
|
|
414
|
+
syncConnection() {
|
|
415
|
+
if (this._syncConnection !== undefined)
|
|
416
|
+
return this._syncConnection;
|
|
417
|
+
if (this.config.websocketClient) {
|
|
418
|
+
this._syncConnection = this.config.websocketClient;
|
|
419
|
+
}
|
|
420
|
+
else if (this.config.websocketUrl) {
|
|
421
|
+
const url = typeof this.config.websocketUrl === "function" ? this.config.websocketUrl() : this.config.websocketUrl;
|
|
422
|
+
this._syncConnection = url ? new VelociousWebsocketClient({ url }) : null;
|
|
423
|
+
}
|
|
424
|
+
else {
|
|
425
|
+
this._syncConnection = null;
|
|
426
|
+
}
|
|
427
|
+
return this._syncConnection;
|
|
428
|
+
}
|
|
394
429
|
/**
|
|
395
430
|
* Subscribes the derived realtime channels so pushed websocket changes apply
|
|
396
431
|
* through the same derived applier as pulls (idempotent, single-flighted).
|
|
@@ -400,6 +435,81 @@ export default class SyncClient {
|
|
|
400
435
|
async subscribeRealtime(context) {
|
|
401
436
|
await this.realtimeBridge().subscribe(context);
|
|
402
437
|
}
|
|
438
|
+
/**
|
|
439
|
+
* Subscribes the server-enumerated user scope: "everything my ability can
|
|
440
|
+
* see". Declares a user scope (empty conditions) for every pullable synced
|
|
441
|
+
* resource type, subscribes realtime so their framework sync channel
|
|
442
|
+
* subscriptions go live, and pulls so the device catches up. The server
|
|
443
|
+
* authorizes each empty-conditions scope through the app sync resource's
|
|
444
|
+
* `authorizeChanges` and re-checks record access per delivery, so the client
|
|
445
|
+
* subscribes with just its token and the server decides membership.
|
|
446
|
+
* Idempotent and single-flighted like {@link SyncClient#subscribeRealtime}.
|
|
447
|
+
* @returns {Promise<void>}
|
|
448
|
+
*/
|
|
449
|
+
async subscribeUserScope() {
|
|
450
|
+
if (this._userScopeState === "subscribed")
|
|
451
|
+
return;
|
|
452
|
+
if (!this._subscribeUserScopePromise) {
|
|
453
|
+
this._subscribeUserScopePromise = this._subscribeUserScope().finally(() => {
|
|
454
|
+
this._subscribeUserScopePromise = null;
|
|
455
|
+
});
|
|
456
|
+
}
|
|
457
|
+
await this._subscribeUserScopePromise;
|
|
458
|
+
}
|
|
459
|
+
/**
|
|
460
|
+
* Declares and activates the user scope for every pullable resource, then
|
|
461
|
+
* subscribes realtime and pulls.
|
|
462
|
+
* @returns {Promise<void>}
|
|
463
|
+
*/
|
|
464
|
+
async _subscribeUserScope() {
|
|
465
|
+
this._userScopeState = "subscribing";
|
|
466
|
+
const scopeStore = this.scopeStore();
|
|
467
|
+
const owner = await this.userScopeOwner();
|
|
468
|
+
for (const resourceType of this.userScopeResourceTypes()) {
|
|
469
|
+
await scopeStore.findOrCreateScope({ conditions: {}, owner, resourceType });
|
|
470
|
+
}
|
|
471
|
+
await this.subscribeRealtime();
|
|
472
|
+
await this.pull();
|
|
473
|
+
this._userScopeState = "subscribed";
|
|
474
|
+
}
|
|
475
|
+
/**
|
|
476
|
+
* Unsubscribes the user scope: deactivates the per-resource user scopes and
|
|
477
|
+
* closes the realtime channel subscriptions. The shared websocket connection
|
|
478
|
+
* stays open when one is configured (sign-out drops subscriptions without
|
|
479
|
+
* disconnecting), so a subsequent sign-in resubscribes over the same socket.
|
|
480
|
+
* @returns {Promise<void>}
|
|
481
|
+
*/
|
|
482
|
+
async unsubscribeUserScope() {
|
|
483
|
+
const scopeStore = this.scopeStore();
|
|
484
|
+
const owner = await this.userScopeOwner();
|
|
485
|
+
for (const resourceType of this.userScopeResourceTypes()) {
|
|
486
|
+
await scopeStore.deactivate({ conditions: {}, owner, resourceType });
|
|
487
|
+
}
|
|
488
|
+
await this.unsubscribeRealtime();
|
|
489
|
+
this._userScopeState = "unsubscribed";
|
|
490
|
+
this._subscribeUserScopePromise = null;
|
|
491
|
+
}
|
|
492
|
+
/**
|
|
493
|
+
* The resource types a user scope covers: every declared resource that
|
|
494
|
+
* receives pulled changes (has pull `attributes`).
|
|
495
|
+
* @returns {string[]} Pullable resource type names.
|
|
496
|
+
*/
|
|
497
|
+
userScopeResourceTypes() {
|
|
498
|
+
return Object.keys(this.pullResourceConfigs());
|
|
499
|
+
}
|
|
500
|
+
/**
|
|
501
|
+
* Resolves the local partition key for the user scope: the currently
|
|
502
|
+
* configured authenticated identity (the sync auth token). Partitioning the
|
|
503
|
+
* user scope's local scope/cursor rows by this owner keeps the
|
|
504
|
+
* empty-conditions cursor from leaking across accounts on a shared device
|
|
505
|
+
* (account B signing in after account A gets a fresh cursor) while the same
|
|
506
|
+
* account reconnecting keeps its cursor continuity. The owner is a local
|
|
507
|
+
* partition key only — pulls still post empty conditions to the server.
|
|
508
|
+
* @returns {Promise<string>} User-scope owner partition key.
|
|
509
|
+
*/
|
|
510
|
+
async userScopeOwner() {
|
|
511
|
+
return String(await this.config.authenticationToken());
|
|
512
|
+
}
|
|
403
513
|
/**
|
|
404
514
|
* Unsubscribes the realtime channels and disconnects the websocket client (idempotent).
|
|
405
515
|
* @returns {Promise<void>}
|
|
@@ -699,4 +809,4 @@ export function syncClient(configuration = Configuration.current()) {
|
|
|
699
809
|
export async function sync(query) {
|
|
700
810
|
return await SyncClient.current().sync(query);
|
|
701
811
|
}
|
|
702
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3luYy1jbGllbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvc3luYy9zeW5jLWNsaWVudC5qcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxZQUFZO0FBRVosT0FBTyxhQUFhLE1BQU0scUJBQXFCLENBQUE7QUFDL0MsT0FBTyxFQUFDLG1CQUFtQixFQUFDLE1BQU0sNkJBQTZCLENBQUE7QUFDL0QsT0FBTyxNQUFNLE1BQU0sY0FBYyxDQUFBO0FBQ2pDLE9BQU8sYUFBYSxNQUFNLDZCQUE2QixDQUFBO0FBRXZELE9BQU8sRUFBQyx3QkFBd0IsRUFBQyxNQUFNLGtCQUFrQixDQUFBO0FBQ3pELE9BQU8sYUFBYSxNQUFNLHNCQUFzQixDQUFBO0FBQ2hELE9BQU8sa0JBQWtCLE1BQU0sMkJBQTJCLENBQUE7QUFDMUQsT0FBTyxjQUFjLE1BQU0sdUJBQXVCLENBQUE7QUFDbEQsT0FBTyxFQUFDLGlCQUFpQixFQUFFLG9CQUFvQixFQUFDLE1BQU0sMkJBQTJCLENBQUE7QUFFakYsSUFBSSxhQUFhLEdBQUcsQ0FBQyxDQUFBO0FBRXJCLHNGQUFzRjtBQUN0RixNQUFNLHNCQUFzQixHQUFHLEVBQUMsTUFBTSxFQUFFLGFBQWEsRUFBRSxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sRUFBRSxhQUFhLEVBQUMsQ0FBQTtBQUV0Rzs7Ozs7b0RBS29EO0FBQ3BELE1BQU0sMEJBQTBCLEdBQUcsQ0FBQyxRQUFRLEVBQUUsUUFBUSxDQUFDLENBQUE7QUFFdkQsa0dBQWtHO0FBQ2xHLE1BQU0saUNBQWlDLEdBQUcsQ0FBQyxXQUFXLEVBQUUsV0FBVyxFQUFFLGtCQUFrQixDQUFDLENBQUE7QUFFeEYsaURBQWlEO0FBQ2pELE1BQU0sMEJBQTBCLEdBQUcsSUFBSSxPQUFPLEVBQUUsQ0FBQTtBQUVoRDs7Ozs7Ozs7Ozs7R0FXRztBQUNILE1BQU0sQ0FBQyxPQUFPLE9BQU8sVUFBVTtJQUM3Qjs7Ozs7Ozs7OztPQVVHO0lBQ0gsWUFBWSxP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LE9BQU8sS0FBSyxFQUFFLE9BQU8sRUFBRSxFQUFFO1FBQ3ZCLE1BQU0sUUFBUSxHQUFHLE1BQU0sU0FBUyxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsT0FBTyxDQUFDLENBQUE7UUFFcEQsSUFBSSxDQUFDLFFBQVEsSUFBSSxPQUFPLFFBQVEsQ0FBQyxJQUFJLEtBQUssVUFBVSxFQUFFLENBQUM7WUFDckQsTUFBTSxJQUFJLEtBQUssQ0FBQyxrRkFBa0YsSUFBSSw2Q0FBNkMsQ0FBQyxDQUFBO1FBQ3RKLENBQUM7UUFFRCxPQUFPLE1BQU0sUUFBUSxDQUFDLElBQUksRUFBRSxDQUFBO0lBQzlCLENBQUMsQ0FBQTtBQUNILENBQUM7QUFFRDs7Ozs7R0FLRztBQUNILE1BQU0sVUFBVSxVQUFVLENBQUMsYUFBYSxHQUFHLGFBQWEsQ0FBQyxPQUFPLEVBQUU7SUFDaEUsSUFBSSxNQUFNLEdBQUcsMEJBQTBCLENBQUMsR0FBRyxDQUFDLGFBQWEsQ0FBQyxDQUFBO0lBRTFELElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQztRQUNaLE1BQU0sR0FBRyxVQUFVLENBQUMsaUJBQWlCLENBQUMsYUFBYSxDQUFDLENBQUE7UUFDcEQsMEJBQTBCLENBQUMsR0FBRyxDQUFDLGFBQWEsRUFBRSxNQUFNLENBQUMsQ0FBQTtRQUNyRCxNQUFNLENBQUMsVUFBVSxFQUFFLENBQUE7SUFDckIsQ0FBQztJQUVELE9BQU8sTUFBTSxDQUFBO0FBQ2YsQ0FBQztBQUVEOzs7O0dBSUc7QUFDSCxNQUFNLENBQUMsS0FBSyxVQUFVLElBQUksQ0FBQyxLQUFLO0lBQzlCLE9BQU8sTUFBTSxVQUFVLENBQUMsT0FBTyxFQUFFLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFBO0FBQy9DLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBAdHMtY2hlY2tcblxuaW1wb3J0IENvbmZpZ3VyYXRpb24gZnJvbSBcIi4uL2NvbmZpZ3VyYXRpb24uanNcIlxuaW1wb3J0IHtpc0Jvb2xlYW5Db2x1bW5UeXBlfSBmcm9tIFwiLi4vZGF0YWJhc2UvY29sdW1uLXR5cGVzLmpzXCJcbmltcG9ydCBMb2dnZXIgZnJvbSBcIi4uL2xvZ2dlci5qc1wiXG5pbXBvcnQgcmVzdEFyZ3NFcnJvciBmcm9tIFwiLi4vdXRpbHMvcmVzdC1hcmdzLWVycm9yLmpzXCJcblxuaW1wb3J0IHtzZXJpYWxpemVkU2NvcGVGcm9tUXVlcnl9IGZyb20gXCIuL3F1ZXJ5LXNjb3BlLmpzXCJcbmltcG9ydCBTeW5jQXBpQ2xpZW50IGZyb20gXCIuL3N5bmMtYXBpLWNsaWVudC5qc1wiXG5pbXBvcnQgU3luY1JlYWx0aW1lQnJpZGdlIGZyb20gXCIuL3N5bmMtcmVhbHRpbWUtYnJpZGdlLmpzXCJcbmltcG9ydCBTeW5jU2NvcGVTdG9yZSBmcm9tIFwiLi9zeW5jLXNjb3BlLXN0b3JlLmpzXCJcbmltcG9ydCB7Y3VycmVudFN5bmNDbGllbnQsIHNldEN1cnJlbnRTeW5jQ2xpZW50fSBmcm9tIFwiLi9zeW5jLWNsaWVudC1yZWdpc3RyeS5qc1wiXG5cbmxldCBjbGllbnRDb3VudGVyID0gMFxuXG4vKiogQHR5cGUge3tjcmVhdGU6IFwiYWZ0ZXJDcmVhdGVcIiwgdXBkYXRlOiBcImFmdGVyVXBkYXRlXCIsIGRlc3Ryb3k6IFwiYWZ0ZXJEZXN0cm95XCJ9fSAqL1xuY29uc3QgVFJBQ0tFRF9DQUxMQkFDS19OQU1FUyA9IHtjcmVhdGU6IFwiYWZ0ZXJDcmVhdGVcIiwgZGVzdHJveTogXCJhZnRlckRlc3Ryb3lcIiwgdXBkYXRlOiBcImFmdGVyVXBkYXRlXCJ9XG5cbi8qKlxuICogT3BlcmF0aW9ucyB0cmFja2VkIGJ5IGRlZmF1bHQgZm9yIG1vZGVscyBkZWNsYXJpbmcgYHN0YXRpYyBzeW5jYCB3aXRob3V0IGFcbiAqIGB0cmFja2Aga2V5OiBsb2NhbCBjcmVhdGVzIGFuZCB1cGRhdGVzIHF1ZXVlIGF1dG9tYXRpY2FsbHkuIERlc3Ryb3lzIGFyZSBub3RcbiAqIHRyYWNrZWQgYnkgZGVmYXVsdCBiZWNhdXNlIGEgbG9jYWwgZGVzdHJveSBpcyBvZnRlbiBjYWNoZSBldmljdGlvbiByYXRoZXJcbiAqIHRoYW4gYSBzZXJ2ZXIgZGVsZXRlOyBvcHQgaW4gd2l0aCBgdHJhY2s6IHRydWVgIG9yIGFuIG9wZXJhdGlvbnMgbGlzdC5cbiAqIEB0eXBlIHtBcnJheTxcImNyZWF0ZVwiIHwgXCJ1cGRhdGVcIiB8IFwiZGVzdHJveVwiPn0gKi9cbmNvbnN0IERFRkFVTFRfVFJBQ0tFRF9PUEVSQVRJT05TID0gW1wiY3JlYXRlXCIsIFwidXBkYXRlXCJdXG5cbi8qKiBBdHRyaWJ1dGUgbmFtZXMgdHJlYXRlZCBhcyBjbGllbnQtbG9jYWwgc3luYyBib29ra2VlcGluZyB3aGVuIGRlcml2aW5nIGxvY2FsT25seUF0dHJpYnV0ZXMuICovXG5jb25zdCBMT0NBTF9CT09LS0VFUElOR19BVFRSSUJVVEVfTkFNRVMgPSBbXCJjcmVhdGVkQXRcIiwgXCJ1cGRhdGVkQXRcIiwgXCJsYXN0U3luY0NoYW5nZUF0XCJdXG5cbi8qKiBAdHlwZSB7V2Vha01hcDxDb25maWd1cmF0aW9uLCBTeW5jQ2xpZW50Pn0gKi9cbmNvbnN0IHN5bmNDbGllbnRzQnlDb25maWd1cmF0aW9uID0gbmV3IFdlYWtNYXAoKVxuXG4vKipcbiAqIERlY2xhcmF0aXZlIGNsaWVudC1zaWRlIHN5bmMgZHJpdmVyLlxuICpcbiAqIEV2ZXJ5dGhpbmcgaXMgZGVyaXZlZCBmcm9tIHRoZSBhcHAncyBWZWxvY2lvdXMgY29uZmlndXJhdGlvbjogbW9kZWxzIGRlY2xhcmVcbiAqIGBzdGF0aWMgc3luY2AsIHRyYW5zcG9ydC9hdXRoL2Nvbm5lY3Rpdml0eSBjb21lIGZyb20gdGhlIGBzeW5jLmNsaWVudGBcbiAqIGNvbmZpZ3VyYXRpb24gYmxvY2ssIGFuZCBWZWxvY2lvdXMgb3ducyBzY29wZSBwZXJzaXN0ZW5jZSwgcGVyLXNjb3BlIGN1cnNvcnMsXG4gKiBwdWxsIHBhZ2luZy9hcHBseSwgbG9jYWwgcXVldWVpbmcsIGFuZCBvbmxpbmUtZ2F0ZWQgcmVwbGF5LiBEZWNsYXJlIHN5bmNcbiAqIGludGVyZXN0IGZyb20gcXVlcmllczpcbiAqXG4gKiAgICAgYXdhaXQgc3luY0NsaWVudCgpLnN0YXJ0KClcbiAqICAgICBhd2FpdCBzeW5jQ2xpZW50KCkuc3luYyhFdmVudC53aGVyZSh7cGFydG5lcklkfSkpXG4gKi9cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFN5bmNDbGllbnQge1xuICAvKipcbiAgICogQnVpbGRzIHRoZSBzeW5jIGNsaWVudCBieSBkZXJpdmluZyBldmVyeXRoaW5nIGZyb20gdGhlIGFwcCdzIFZlbG9jaW91c1xuICAgKiBjb25maWd1cmF0aW9uOiBldmVyeSByZWdpc3RlcmVkIG1vZGVsIGRlY2xhcmluZyBgc3RhdGljIHN5bmNgIGJlY29tZXMgYVxuICAgKiByZXNvdXJjZSB3aXRoIGJvb2xlYW5BdHRyaWJ1dGVzIGRlcml2ZWQgZnJvbSBjb2x1bW4gdHlwZXMgYW5kXG4gICAqIGxvY2FsT25seUF0dHJpYnV0ZXMgZGVyaXZlZCBmcm9tIHRoZSBwcmltYXJ5IGtleSwgY3JlYXRlZEF0L3VwZGF0ZWRBdCwgYW5kXG4gICAqIHN5bmMgYm9va2tlZXBpbmcgY29sdW1uczsgdGhlIHBlbmRpbmctc3luYyBtb2RlbCBpcyB0aGUgcmVnaXN0ZXJlZCBcIlN5bmNcIlxuICAgKiBtb2RlbDsgdHJhbnNwb3J0LCBhdXRoLCBjb25uZWN0aXZpdHksIGFuZCBlcnJvciByZXBvcnRpbmcgY29tZSBmcm9tIHRoZVxuICAgKiBgc3luYy5jbGllbnRgIGNvbmZpZ3VyYXRpb24gYmxvY2ssIHdpdGggdGhlIGZyYW1ld29yayBvd25pbmcgdGhlXG4gICAqIGAke21vdW50UGF0aH0vY2hhbmdlc2AgYW5kIGAke21vdW50UGF0aH0vcmVwbGF5YCBQT1NUZXJzLlxuICAgKiBAcGFyYW0ge2ltcG9ydChcIi4vc3luYy1jbGllbnQtdHlwZXMuanNcIikuU3luY0NsaWVudE9wdGlvbnN9IFtvcHRpb25zXSAtIE9wdGlvbmFsIG92ZXJyaWRlcy5cbiAgICovXG4gIGNvbnN0cnVjdG9yKG9wdGlvbnMgPSB7fSkge1xuICAgIGNvbnN0IHtjb25maWd1cmF0aW9uID0gQ29uZmlndXJhdGlvbi5jdXJyZW50KCksIGxlZ2FjeUN1cnNvciwgc2NvcGVTdG9yZSwgc3luY01vZGVsLCAuLi5yZXN0T3B0aW9uc30gPSBvcHRpb25zXG5cbiAgICByZXN0QXJnc0Vycm9yKHJlc3RPcHRpb25zKVxuXG4gICAgY29uc3QgY2xpZW50Q29uZmlndXJhdGlvbiA9IGNvbmZpZ3VyYXRpb24uZ2V0U3luY0NvbmZpZ3VyYXRpb24oKS5jbGllbnRcblxuICAgIGlmICghY2xpZW50Q29uZmlndXJhdGlvbikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiU3luY0NsaWVudCByZXF1aXJlcyBhIHN5bmMuY2xpZW50IGNvbmZpZ3VyYXRpb24gYmxvY2s6IG5ldyBDb25maWd1cmF0aW9uKHtzeW5jOiB7Y2xpZW50OiB7YXV0aGVudGljYXRpb25Ub2tlbiwgdHJhbnNwb3J0fX19KVwiKVxuICAgIH1cblxuICAgIGNvbnN0IG1vZGVsQ2xhc3NlcyA9IGNvbmZpZ3VyYXRpb24uZ2V0TW9kZWxDbGFzc2VzKClcbiAgICAvKiogQHR5cGUge1JlY29yZDxzdHJpbmcsIGltcG9ydChcIi4vc3luYy1jbGllbnQtdHlwZXMuanNcIikuU3luY0NsaWVudFJlc291cmNlQ29uZmlnPn0gKi9cbiAgICBjb25zdCByZXNvdXJjZXMgPSB7fVxuXG4gICAgZm9yIChjb25zdCBtb2RlbENsYXNzIG9mIE9iamVjdC52YWx1ZXMobW9kZWxDbGFzc2VzKSkge1xuICAgICAgaWYgKCFtb2RlbENsYXNzLnN5bmMpIGNvbnRpbnVlXG5cbiAgICAgIGNvbnN0IHJlc291cmNlVHlwZSA9IG1vZGVsQ2xhc3MuZ2V0TW9kZWxOYW1lKClcblxuICAgICAgcmVzb3VyY2VzW3Jlc291cmNlVHlwZV0gPSByZXNvdXJjZUNvbmZpZ0Zyb21TeW5jRGVjbGFyYXRpb24oe2RlY2xhcmF0aW9uOiBtb2RlbENsYXNzLnN5bmMsIG1vZGVsQ2xhc3MsIHJlc291cmNlVHlwZX0pXG4gICAgfVxuXG4gICAgaWYgKE9iamVjdC5rZXlzKHJlc291cmNlcykubGVuZ3RoID09PSAwKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJTeW5jQ2xpZW50IGZvdW5kIG5vIHJlZ2lzdGVyZWQgbW9kZWxzIGRlY2xhcmluZyBzdGF0aWMgc3luYyAtIGRlY2xhcmUgYHN0YXRpYyBzeW5jID0gdHJ1ZWAgKG9yIGEgc3luYyBkZWNsYXJhdGlvbiBvYmplY3QpIG9uIHRoZSBtb2RlbHMgdGhhdCBzaG91bGQgc3luY1wiKVxuICAgIH1cblxuICAgIGNvbnN0IHJlc29sdmVkU3luY01vZGVsID0gc3luY01vZGVsIHx8IG1vZGVsQ2xhc3Nlcy5TeW5jXG5cbiAgICBpZiAoIXJlc29sdmVkU3luY01vZGVsKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJTeW5jQ2xpZW50IHJlcXVpcmVzIGEgcmVnaXN0ZXJlZCBcXFwiU3luY1xcXCIgbW9kZWwgZm9yIHBlbmRpbmcgbG9jYWwgc3luYyByb3dzIChvciBwYXNzIG9wdGlvbnMuc3luY01vZGVsKVwiKVxuICAgIH1cblxuICAgIC8qKiBAdHlwZSB7aW1wb3J0KFwiLi9zeW5jLWNsaWVudC10eXBlcy5qc1wiKS5TeW5jQ2xpZW50Q29uZmlnfSAqL1xuICAgIHRoaXMuY29uZmlnID0ge1xuICAgICAgYXV0aGVudGljYXRpb25Ub2tlbjogY2xpZW50Q29uZmlndXJhdGlvbi5hdXRoZW50aWNhdGlvblRva2VuLFxuICAgICAgYmF0Y2hTaXplOiBjbGllbnRDb25maWd1cmF0aW9uLmJhdGNoU2l6ZSxcbiAgICAgIGNvbmZpZ3VyYXRpb24sXG4gICAgICBpc09ubGluZTogY2xpZW50Q29uZmlndXJhdGlvbi5pc09ubGluZSxcbiAgICAgIGxlZ2FjeUN1cnNvcixcbiAgICAgIG9uRXJyb3I6IGNsaWVudENvbmZpZ3VyYXRpb24ub25FcnJvcixcbiAgICAgIHBvc3RDaGFuZ2VzOiB0cmFuc3BvcnRQb3N0ZXIoe3BhdGg6IGAke2NsaWVudENvbmZpZ3VyYXRpb24ubW91bnRQYXRofS9jaGFuZ2VzYCwgdHJhbnNwb3J0OiBjbGllbnRDb25maWd1cmF0aW9uLnRyYW5zcG9ydH0pLFxuICAgICAgcG9zdFJlcGxheTogdHJhbnNwb3J0UG9zdGVyKHtwYXRoOiBgJHtjbGllbnRDb25maWd1cmF0aW9uLm1vdW50UGF0aH0vcmVwbGF5YCwgdHJhbnNwb3J0OiBjbGllbnRDb25maWd1cmF0aW9uLnRyYW5zcG9ydH0pLFxuICAgICAgcmVhbHRpbWU6IGNsaWVudENvbmZpZ3VyYXRpb24ucmVhbHRpbWUsXG4gICAgICByZXNvdXJjZXMsXG4gICAgICBzeW5jTW9kZWw6IHJlc29sdmVkU3luY01vZGVsXG4gICAgfVxuICAgIHRoaXMuX2NsaWVudE51bWJlciA9ICsrY2xpZW50Q291bnRlclxuICAgIC8qKiBAdHlwZSB7U3luY1JlYWx0aW1lQnJpZGdlIHwgbnVsbH0gKi9cbiAgICB0aGlzLl9yZWFsdGltZUJyaWRnZSA9IG51bGxcbiAgICAvKiogQHR5cGUge2ltcG9ydChcIi4vc3luYy1zY29wZS1zdG9yZS5qc1wiKS5kZWZhdWx0IHwgbnVsbH0gKi9cbiAgICB0aGlzLl9zY29wZVN0b3JlID0gc2NvcGVTdG9yZSB8fCBudWxsXG4gICAgLyoqIEB0eXBlIHtQcm9taXNlPHZvaWQ+IHwgbnVsbH0gKi9cbiAgICB0aGlzLl9zY2hlZHVsZWRSZXBsYXkgPSBudWxsXG4gICAgLyoqIEB0eXBlIHtSZWNvcmQ8c3RyaW5nLCBpbXBvcnQoXCIuL3N5bmMtYXBpLWNsaWVudC10eXBlcy5qc1wiKS5TeW5jUmVzb3VyY2VDb25maWc+IHwgbnVsbH0gKi9cbiAgICB0aGlzLl9wdWxsUmVzb3VyY2VDb25maWdzID0gbnVsbFxuICAgIC8qKiBAdHlwZSB7QXJyYXk8e2NhbGxiYWNrOiAocmVjb3JkOiA/KSA9PiBQcm9taXNlPHZvaWQ+LCBjYWxsYmFja05hbWU6IFwiYWZ0ZXJDcmVhdGVcIiB8IFwiYWZ0ZXJVcGRhdGVcIiB8IFwiYWZ0ZXJEZXN0cm95XCIsIG1vZGVsQ2xhc3M6ID99Pn0gKi9cbiAgICB0aGlzLl90cmFja2VkQ2FsbGJhY2tzID0gW11cbiAgICAvKiogQHR5cGUge1dlYWtTZXQ8b2JqZWN0Pn0gKi9cbiAgICB0aGlzLl9yZW1vdGVBcHBseVJlY29yZHMgPSBuZXcgV2Vha1NldCgpXG4gICAgdGhpcy5fd2l0aG91dFRyYWNraW5nRGVwdGggPSAwXG4gICAgLyoqIEB0eXBlIHtMb2dnZXIgfCB7ZXJyb3I6ICguLi5tZXNzYWdlczogQXJyYXk8Pz4pID0+IFByb21pc2U8dm9pZD59IHwgbnVsbH0gKi9cbiAgICB0aGlzLl9sb2dnZXIgPSBudWxsXG4gICAgdGhpcy5fc3RhcnRlZCA9IGZhbHNlXG4gIH1cblxuICAvKipcbiAgICogUmVnaXN0ZXJzIGF1dG9tYXRpYyBtdXRhdGlvbiB0cmFja2luZyBmb3IgZXZlcnkgZGVjbGFyZWQgcmVzb3VyY2UgKG9uIGJ5XG4gICAqIGRlZmF1bHQ6IGxvY2FsIGNyZWF0ZXMgYW5kIHVwZGF0ZXMgcXVldWUgcGVuZGluZyBzeW5jIHJvd3Mgb25jZSB0aGVpclxuICAgKiB0cmFuc2FjdGlvbiBjb21taXRzIGFuZCBzY2hlZHVsZSBhbiBpbW1lZGlhdGUgcmVwbGF5IGF0dGVtcHQsIHdpdGhvdXRcbiAgICogYXBwLXNpZGUgcXVldWUgY2FsbHMpLiBgdHJhY2s6IGZhbHNlYCByZXNvdXJjZXMgYXJlIHNraXBwZWQ7IGB0cmFjazogdHJ1ZWBcbiAgICogYWRkcyBkZXN0cm95czsgYW4gb3BlcmF0aW9ucyBsaXN0IG5hcnJvd3MgdGhlIHRyYWNrZWQgb3BlcmF0aW9ucy5cbiAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59XG4gICAqL1xuICBhc3luYyBzdGFydCgpIHtcbiAgICBpZiAodGhpcy5fc3RhcnRlZCkgcmV0dXJuXG5cbiAgICB0aGlzLl9zdGFydGVkID0gdHJ1ZVxuXG4gICAgZm9yIChjb25zdCBbcmVzb3VyY2VUeXBlLCByZXNvdXJjZUNvbmZpZ10gb2YgT2JqZWN0LmVudHJpZXModGhpcy5jb25maWcucmVzb3VyY2VzKSkge1xuICAgICAgY29uc3Qgb3BlcmF0aW9ucyA9IHRoaXMudHJhY2tlZE9wZXJhdGlvbnMoe3Jlc291cmNlQ29uZmlnLCByZXNvdXJjZVR5cGV9KVxuXG4gICAgICBmb3IgKGNvbnN0IG9wZXJhdGlvbiBvZiBvcGVyYXRpb25zKSB7XG4gICAgICAgIGNvbnN0IGNhbGxiYWNrTmFtZSA9IFRSQUNLRURfQ0FMTEJBQ0tfTkFNRVNbb3BlcmF0aW9uXVxuICAgICAgICBjb25zdCBjYWxsYmFjayA9IHRoaXMudHJhY2tlZE11dGF0aW9uQ2FsbGJhY2soe29wZXJhdGlvbiwgcmVzb3VyY2VDb25maWd9KVxuXG4gICAgICAgIHJlc291cmNlQ29uZmlnLm1vZGVsQ2xhc3NbY2FsbGJhY2tOYW1lXShjYWxsYmFjaylcbiAgICAgICAgdGhpcy5fdHJhY2tlZENhbGxiYWNrcy5wdXNoKHtjYWxsYmFjaywgY2FsbGJhY2tOYW1lLCBtb2RlbENsYXNzOiByZXNvdXJjZUNvbmZpZy5tb2RlbENsYXNzfSlcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogVW5yZWdpc3RlcnMgYWxsIHRyYWNraW5nIGNhbGxiYWNrcyAodGVzdHMsIHNpZ24tb3V0LCBob3QgcmVsb2FkKS5cbiAgICogQHJldHVybnMge3ZvaWR9XG4gICAqL1xuICBzdG9wKCkge1xuICAgIGZvciAoY29uc3Qge2NhbGxiYWNrLCBjYWxsYmFja05hbWUsIG1vZGVsQ2xhc3N9IG9mIHRoaXMuX3RyYWNrZWRDYWxsYmFja3MpIHtcbiAgICAgIG1vZGVsQ2xhc3MudW5yZWdpc3RlckxpZmVjeWNsZUNhbGxiYWNrKGNhbGxiYWNrTmFtZSwgY2FsbGJhY2spXG4gICAgfVxuXG4gICAgdGhpcy5fdHJhY2tlZENhbGxiYWNrcyA9IFtdXG4gICAgdGhpcy5fc3RhcnRlZCA9IGZhbHNlXG4gIH1cblxuICAvKipcbiAgICogUmVzb2x2ZXMgYW5kIHZhbGlkYXRlcyB0aGUgdHJhY2tlZCBvcGVyYXRpb25zIGZvciBhIHJlc291cmNlIGNvbmZpZy5cbiAgICogVHJhY2tpbmcgaXMgb24gYnkgZGVmYXVsdDogbW9kZWxzIGRlY2xhcmluZyBgc3RhdGljIHN5bmNgIHdpdGhvdXQgYSBgdHJhY2tgXG4gICAqIGtleSBxdWV1ZSBsb2NhbCBjcmVhdGVzIGFuZCB1cGRhdGVzIGF1dG9tYXRpY2FsbHk7IGB0cmFjazogZmFsc2VgIG9wdHMgYVxuICAgKiBtb2RlbCBvdXQgKGZvciBtb2RlbHMgd3JpdHRlbiBieSBub24tdXNlciBmbG93cykuXG4gICAqIEBwYXJhbSB7e3Jlc291cmNlQ29uZmlnOiBpbXBvcnQoXCIuL3N5bmMtY2xpZW50LXR5cGVzLmpzXCIpLlN5bmNDbGllbnRSZXNvdXJjZUNvbmZpZywgcmVzb3VyY2VUeXBlOiBzdHJpbmd9fSBhcmdzIC0gUmVzb3VyY2UgY29uZmlnIGFuZCBuYW1lLlxuICAgKiBAcmV0dXJucyB7QXJyYXk8XCJjcmVhdGVcIiB8IFwidXBkYXRlXCIgfCBcImRlc3Ryb3lcIj59IFRyYWNrZWQgb3BlcmF0aW9ucy5cbiAgICovXG4gIHRyYWNrZWRPcGVyYXRpb25zKHtyZXNvdXJjZUNvbmZpZywgcmVzb3VyY2VUeXBlfSkge1xuICAgIGNvbnN0IHRyYWNrID0gcmVzb3VyY2VDb25maWcudHJhY2tcblxuICAgIGlmICh0cmFjayA9PT0gZmFsc2UpIHJldHVybiBbXVxuICAgIGlmICh0cmFjayA9PT0gdW5kZWZpbmVkKSByZXR1cm4gREVGQVVMVF9UUkFDS0VEX09QRVJBVElPTlNcbiAgICBpZiAodHJhY2sgPT09IHRydWUpIHJldHVybiBbXCJjcmVhdGVcIiwgXCJ1cGRhdGVcIiwgXCJkZXN0cm95XCJdXG5cbiAgICBpZiAoIXRyYWNrIHx8IHR5cGVvZiB0cmFjayAhPT0gXCJvYmplY3RcIiB8fCAhQXJyYXkuaXNBcnJheSh0cmFjay5vcGVyYXRpb25zKSB8fCB0cmFjay5vcGVyYXRpb25zLmxlbmd0aCA9PT0gMCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBTeW5jQ2xpZW50IHJlc291cmNlICR7cmVzb3VyY2VUeXBlfSB0cmFjayBtdXN0IGJlIHRydWUgb3Ige29wZXJhdGlvbnM6IFsuLi5dfWApXG4gICAgfVxuXG4gICAgZm9yIChjb25zdCBvcGVyYXRpb24gb2YgdHJhY2sub3BlcmF0aW9ucykge1xuICAgICAgaWYgKCEob3BlcmF0aW9uIGluIFRSQUNLRURfQ0FMTEJBQ0tfTkFNRVMpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgU3luY0NsaWVudCByZXNvdXJjZSAke3Jlc291cmNlVHlwZX0gdHJhY2sub3BlcmF0aW9ucyBtdXN0IGJlIGNyZWF0ZS91cGRhdGUvZGVzdHJveSwgZ290OiAke1N0cmluZyhvcGVyYXRpb24pfWApXG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHRyYWNrLm9wZXJhdGlvbnNcbiAgfVxuXG4gIC8qKlxuICAgKiBCdWlsZHMgdGhlIGxpZmVjeWNsZSBjYWxsYmFjayBxdWV1ZWluZyBvbmUgdHJhY2tlZCBtdXRhdGlvbi4gVGhlIHF1ZXVlZFxuICAgKiBwYXlsb2FkIGFuZCBzeW5jIHR5cGUgYXJlIHNuYXBzaG90dGVkIGF0IG11dGF0aW9uLWNhbGxiYWNrIHRpbWUsIHNvXG4gICAqIGFmdGVyU2F2ZSBob29rcyBhc3NpZ25pbmcgdW5zYXZlZCBhdHRyaWJ1dGVzIChvciBhbnkgbGF0ZXIgZHJpZnQgb24gdGhlXG4gICAqIHJlY29yZCkgY2Fubm90IGNoYW5nZSB3aGF0IGdldHMgcXVldWVkIHZzIHdoYXQgd2FzIGNvbW1pdHRlZC4gUXVldWVpbmcgaXNcbiAgICogZGVmZXJyZWQgdGhyb3VnaCB0aGUgbW9kZWwgY29ubmVjdGlvbidzIGFmdGVyQ29tbWl0IGhvb2sgc28gaXQgb25seSBydW5zXG4gICAqIG9uY2UgdGhlIG11dGF0aW9uJ3MgdHJhbnNhY3Rpb24gaGFzIGNvbW1pdHRlZCAoaW1tZWRpYXRlbHkgd2hlbiBub1xuICAgKiB0cmFuc2FjdGlvbiBpcyBvcGVuKSAtIHF1ZXVlZCBzeW5jcyBuZXZlciByZWZlcmVuY2Ugcm9sbGVkLWJhY2sgcm93cy5cbiAgICogUG9zdC1jb21taXQgcXVldWUgZmFpbHVyZXMgYXJlIHJlcG9ydGVkIHdpdGhvdXQgcmV0aHJvd2luZyBpbnRvIHRoZVxuICAgKiBkcml2ZXIncyBhZnRlckNvbW1pdCBjaGFpbiAoc2VlIHJlcG9ydEFmdGVyQ29tbWl0RXJyb3IpLlxuICAgKiBAcGFyYW0ge3tvcGVyYXRpb246IFwiY3JlYXRlXCIgfCBcInVwZGF0ZVwiIHwgXCJkZXN0cm95XCIsIHJlc291cmNlQ29uZmlnOiBpbXBvcnQoXCIuL3N5bmMtY2xpZW50LXR5cGVzLmpzXCIpLlN5bmNDbGllbnRSZXNvdXJjZUNvbmZpZ319IGFyZ3MgLSBPcGVyYXRpb24gYW5kIHJlc291cmNlIGNvbmZpZy5cbiAgICogQHJldHVybnMgeyhyZWNvcmQ6ID8pID0+IFByb21pc2U8dm9pZD59IExpZmVjeWNsZSBjYWxsYmFjay5cbiAgICovXG4gIHRyYWNrZWRNdXRhdGlvbkNhbGxiYWNrKHtvcGVyYXRpb24sIHJlc291cmNlQ29uZmlnfSkge1xuICAgIHJldHVybiBhc3luYyAocmVjb3JkKSA9PiB7XG4gICAgICBpZiAodGhpcy5pc1RyYWNraW5nU3VwcHJlc3NlZChyZWNvcmQpKSByZXR1cm5cblxuICAgICAgY29uc3QgZGF0YSA9IFN5bmNBcGlDbGllbnQucXVldWVkU3luY0RhdGEoe1xuICAgICAgICBib29sZWFuQXR0cmlidXRlczogcmVzb3VyY2VDb25maWcuYm9vbGVhbkF0dHJpYnV0ZXMgfHwgW10sXG4gICAgICAgIGRhdGE6IHJlc291cmNlQ29uZmlnLnRyYWNrZWREYXRhID8gcmVzb3VyY2VDb25maWcudHJhY2tlZERhdGEoe29wZXJhdGlvbiwgcmVjb3JkfSkgOiB1bmRlZmluZWQsXG4gICAgICAgIGxvY2FsT25seUF0dHJpYnV0ZXM6IHJlc291cmNlQ29uZmlnLmxvY2FsT25seUF0dHJpYnV0ZXMgfHwgW10sXG4gICAgICAgIHJlc291cmNlOiByZWNvcmRcbiAgICAgIH0pXG4gICAgICBjb25zdCBzeW5jVHlwZSA9IHRoaXMuZGVmYXVsdFN5bmNUeXBlKHtvcGVyYXRpb24sIHJlY29yZCwgcmVzb3VyY2VDb25maWd9KVxuXG4gICAgICBhd2FpdCByZXNvdXJjZUNvbmZpZy5tb2RlbENsYXNzLmNvbm5lY3Rpb24oKS5hZnRlckNvbW1pdChhc3luYyAoKSA9PiB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgYXdhaXQgU3luY0FwaUNsaWVudC5xdWV1ZUxvY2FsU3luYyh7XG4gICAgICAgICAgICBkYXRhLFxuICAgICAgICAgICAgcmVzb3VyY2U6IHJlY29yZCxcbiAgICAgICAgICAgIHN5bmNNb2RlbDogdGhpcy5jb25maWcuc3luY01vZGVsLFxuICAgICAgICAgICAgc3luY1R5cGVcbiAgICAgICAgICB9KVxuICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgIGF3YWl0IHRoaXMucmVwb3J0QWZ0ZXJDb21taXRFcnJvcigvKiogQHR5cGUge0Vycm9yfSAqLyAoZXJyb3IpKVxuXG4gICAgICAgICAgcmV0dXJuXG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLnNjaGVkdWxlUmVwbGF5KClcbiAgICAgIH0pXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJlcG9ydHMgYSBwb3N0LWNvbW1pdCB0cmFja2VkLXF1ZXVlaW5nIGZhaWx1cmUuIFRoZSB0cmFuc2FjdGlvbiBoYXMgYWxyZWFkeVxuICAgKiBjb21taXR0ZWQgd2hlbiBhZnRlckNvbW1pdCBjYWxsYmFja3MgcnVuLCBzbyByZXRocm93aW5nIGhlcmUgd291bGQgcG9pc29uXG4gICAqIHRoZSBkcml2ZXIncyBhd2FpdGVkIGFmdGVyQ29tbWl0IGNoYWluIChicmVha2luZyB1bnJlbGF0ZWQgY2FsbGJhY2tzKSAtXG4gICAqIGluc3RlYWQgdGhlIGZhaWx1cmUgZ29lcyB0byB0aGUgY29uZmlndXJlZCBzeW5jLmNsaWVudC5vbkVycm9yIGhvb2ssIG9yIGlzXG4gICAqIGxvZ2dlZCBsb3VkbHkgdGhyb3VnaCB0aGUgY2xpZW50J3MgbG9nZ2VyIHdoZW4gbm9uZSBpcyBjb25maWd1cmVkLlxuICAgKiBAcGFyYW0ge0Vycm9yfSBlcnJvciAtIFBvc3QtY29tbWl0IHF1ZXVlaW5nIGZhaWx1cmUuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fVxuICAgKi9cbiAgYXN5bmMgcmVwb3J0QWZ0ZXJDb21taXRFcnJvcihlcnJvcikge1xuICAgIGlmICh0aGlzLmNvbmZpZy5vbkVycm9yKSB7XG4gICAgICB0aGlzLmNvbmZpZy5vbkVycm9yKGVycm9yKVxuXG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBhd2FpdCB0aGlzLmxvZ2dlcigpLmVycm9yKFwiU3luY0NsaWVudCBmYWlsZWQgdG8gcXVldWUgYSB0cmFja2VkIG11dGF0aW9uIGFmdGVyIGNvbW1pdFwiLCBlcnJvcilcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBsYXppbHkgYnVpbHQgY2xpZW50IGxvZ2dlci5cbiAgICogQHJldHVybnMge0xvZ2dlciB8IHtlcnJvcjogKC4uLm1lc3NhZ2VzOiBBcnJheTw/PikgPT4gUHJvbWlzZTx2b2lkPn19IENsaWVudCBsb2dnZXIuXG4gICAqL1xuICBsb2dnZXIoKSB7XG4gICAgdGhpcy5fbG9nZ2VyIHx8PSBuZXcgTG9nZ2VyKFwiU3luY0NsaWVudFwiLCB7Y29uZmlndXJhdGlvbjogdGhpcy5jb25maWcuY29uZmlndXJhdGlvbn0pXG5cbiAgICByZXR1cm4gdGhpcy5fbG9nZ2VyXG4gIH1cblxuICAvKipcbiAgICogV2hldGhlciBhIHJlY29yZCBpcyBjdXJyZW50bHkgYmVpbmcgd3JpdHRlbiBieSBwdWxsLWFwcGx5IChlY2hvIHN1cHByZXNzaW9uKS5cbiAgICogQHBhcmFtIHs/fSByZWNvcmQgLSBMb2NhbCBtb2RlbCByZWNvcmQuXG4gICAqIEByZXR1cm5zIHtib29sZWFufSBXaGV0aGVyIHRoZSByZWNvcmQgd3JpdGUgb3JpZ2luYXRlcyBmcm9tIGEgcmVtb3RlIGNoYW5nZS5cbiAgICovXG4gIGlzUmVtb3RlQXBwbHkocmVjb3JkKSB7XG4gICAgcmV0dXJuIHRoaXMuX3JlbW90ZUFwcGx5UmVjb3Jkcy5oYXMocmVjb3JkKVxuICB9XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdHJhY2tlZCBtdXRhdGlvbiBxdWV1ZWluZyBpcyBjdXJyZW50bHkgc3VwcHJlc3NlZCBmb3IgYSByZWNvcmQ6XG4gICAqIGVpdGhlciB0aGUgcmVjb3JkIHdhcyBtYXJrZWQgYXMgYSByZW1vdGUgYXBwbHkgKGBtYXJrUmVtb3RlQXBwbHlgLCB1c2VkIGJ5XG4gICAqIHB1bGwgYW5kIHJlYWx0aW1lIGFwcGxpZXMpIG9yIGEgYHdpdGhvdXRUcmFja2luZ2AgY2FsbGJhY2sgaXMgcnVubmluZyBvblxuICAgKiB0aGlzIGNsaWVudC5cbiAgICogQHBhcmFtIHs/fSByZWNvcmQgLSBMb2NhbCBtb2RlbCByZWNvcmQuXG4gICAqIEByZXR1cm5zIHtib29sZWFufSBXaGV0aGVyIHRyYWNrZWQgcXVldWVpbmcgaXMgc3VwcHJlc3NlZCBmb3IgdGhlIHJlY29yZC5cbiAgICovXG4gIGlzVHJhY2tpbmdTdXBwcmVzc2VkKHJlY29yZCkge1xuICAgIHJldHVybiB0aGlzLl93aXRob3V0VHJhY2tpbmdEZXB0aCA+IDAgfHwgdGhpcy5pc1JlbW90ZUFwcGx5KHJlY29yZClcbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIGEgY2FsbGJhY2sgd2l0aCB0cmFja2VkIG11dGF0aW9uIHF1ZXVlaW5nIHN1cHByZXNzZWQgb24gdGhpcyBjbGllbnQgLVxuICAgKiBmb3IgY29kZSBhcHBseWluZyBzZXJ2ZXItb3JpZ2luYXRlZCBkYXRhIG91dHNpZGUgdGhlIGRlcml2ZWQgcHVsbC9yZWFsdGltZVxuICAgKiBhcHBsaWVycyAobGVnYWN5IHB1bGwgcGF0aHMsIGltcG9ydGVycywgc2lnbi1pbiBiYWNrZmlsbHMpLCBzbyB0aGVpciB3cml0ZXNcbiAgICogYXJlIG5vdCBlY2hvZWQgYmFjayB0byB0aGUgc2VydmVyIGFzIGRldmljZSBjaGFuZ2VzLiBTdXBwcmVzc2lvbiBjb3ZlcnMgdGhlXG4gICAqIHdob2xlIGFzeW5jIGR1cmF0aW9uIG9mIHRoZSBjYWxsYmFjayAobmVzdGVkIGNhbGxzIHN0YWNrKSBhbmQgaXNcbiAgICogY2xpZW50LXdpZGUgd2hpbGUgaXQgcnVuczogbXV0YXRpb25zIGZyb20gY29uY3VycmVudGx5IHJ1bm5pbmcgdGFza3MgYXJlXG4gICAqIGFsc28gc3VwcHJlc3NlZCBmb3IgdGhhdCB3aW5kb3csIHNvIHByZWZlciBgbWFya1JlbW90ZUFwcGx5KHJlY29yZClgIHdoZW5cbiAgICogd3JpdGVzIGZyb20gb3RoZXIgZmxvd3MgY2FuIGludGVybGVhdmUuXG4gICAqIEB0ZW1wbGF0ZSBUXG4gICAqIEBwYXJhbSB7KCkgPT4gUHJvbWlzZTxUPiB8IFR9IGNhbGxiYWNrIC0gV29yayB3aG9zZSBtb2RlbCB3cml0ZXMgc2hvdWxkIG5vdCBxdWV1ZSB0cmFja2VkIHN5bmNzLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxUPn0gVGhlIGNhbGxiYWNrIHJlc3VsdC5cbiAgICovXG4gIGFzeW5jIHdpdGhvdXRUcmFja2luZyhjYWxsYmFjaykge1xuICAgIHRoaXMuX3dpdGhvdXRUcmFja2luZ0RlcHRoKytcblxuICAgIHRyeSB7XG4gICAgICByZXR1cm4gYXdhaXQgY2FsbGJhY2soKVxuICAgIH0gZmluYWxseSB7XG4gICAgICB0aGlzLl93aXRob3V0VHJhY2tpbmdEZXB0aC0tXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIE1hcmtzIG9uZSByZWNvcmQgYXMgYmVpbmcgd3JpdHRlbiBmcm9tIHNlcnZlci1vcmlnaW5hdGVkIGRhdGEgc28gdHJhY2tlZFxuICAgKiBtdXRhdGlvbiBxdWV1ZWluZyBza2lwcyBpdCAocmVjb3JkLXByZWNpc2Ugc3VwcHJlc3Npb24pLiBUaGUgZGVyaXZlZCBwdWxsXG4gICAqIGFuZCByZWFsdGltZSBhcHBsaWVycyB1c2UgdGhpcyBpbnRlcm5hbGx5IGFyb3VuZCBldmVyeSBhcHBsaWVkIHdyaXRlLlxuICAgKiBAcGFyYW0gez99IHJlY29yZCAtIExvY2FsIG1vZGVsIHJlY29yZCBhYm91dCB0byBiZSB3cml0dGVuLlxuICAgKiBAcmV0dXJucyB7KCkgPT4gdm9pZH0gUmVsZWFzZSBjYWxsYmFjayByZS1lbmFibGluZyB0cmFja2luZyBmb3IgdGhlIHJlY29yZC5cbiAgICovXG4gIG1hcmtSZW1vdGVBcHBseShyZWNvcmQpIHtcbiAgICB0aGlzLl9yZW1vdGVBcHBseVJlY29yZHMuYWRkKHJlY29yZClcblxuICAgIHJldHVybiAoKSA9PiB0aGlzLl9yZW1vdGVBcHBseVJlY29yZHMuZGVsZXRlKHJlY29yZClcbiAgfVxuXG4gIC8qKlxuICAgKiBSZWdpc3RlcnMgdGhpcyBjbGllbnQgYXMgdGhlIGFwcCdzIGN1cnJlbnQgc3luYyBjbGllbnQuXG4gICAqIEByZXR1cm5zIHt2b2lkfVxuICAgKi9cbiAgc2V0Q3VycmVudCgpIHtcbiAgICBzZXRDdXJyZW50U3luY0NsaWVudCh0aGlzKVxuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIGFwcCdzIGN1cnJlbnQgc3luYyBjbGllbnQuXG4gICAqIEByZXR1cm5zIHtTeW5jQ2xpZW50fSBDdXJyZW50IHN5bmMgY2xpZW50LlxuICAgKi9cbiAgc3RhdGljIGN1cnJlbnQoKSB7XG4gICAgcmV0dXJuIC8qKiBAdHlwZSB7U3luY0NsaWVudH0gKi8gKGN1cnJlbnRTeW5jQ2xpZW50KCkpXG4gIH1cblxuICAvKipcbiAgICogQnVpbGRzIGEgc3luYyBjbGllbnQgZGVyaXZlZCBmcm9tIHRoZSBnaXZlbiBjb25maWd1cmF0aW9uLiBBbGlhcyBmb3JcbiAgICogYG5ldyBTeW5jQ2xpZW50KHtjb25maWd1cmF0aW9uLCAuLi5vcHRpb25zfSlgLlxuICAgKiBAcGFyYW0ge0NvbmZpZ3VyYXRpb259IFtjb25maWd1cmF0aW9uXSAtIENvbmZpZ3VyYXRpb24gb3duaW5nIHRoZSByZWdpc3RlcmVkIG1vZGVscyBhbmQgdGhlIHN5bmMuY2xpZW50IGJsb2NrLiBEZWZhdWx0cyB0byB0aGUgY3VycmVudCBjb25maWd1cmF0aW9uLlxuICAgKiBAcGFyYW0ge09taXQ8aW1wb3J0KFwiLi9zeW5jLWNsaWVudC10eXBlcy5qc1wiKS5TeW5jQ2xpZW50T3B0aW9ucywgXCJjb25maWd1cmF0aW9uXCI+fSBbb3B0aW9uc10gLSBPcHRpb25hbCBvdmVycmlkZXMuXG4gICAqIEByZXR1cm5zIHtTeW5jQ2xpZW50fSBTeW5jIGNsaWVudCBkZXJpdmVkIGZyb20gdGhlIGNvbmZpZ3VyYXRpb24uXG4gICAqL1xuICBzdGF0aWMgZnJvbUNvbmZpZ3VyYXRpb24oY29uZmlndXJhdGlvbiA9IENvbmZpZ3VyYXRpb24uY3VycmVudCgpLCBvcHRpb25zID0ge30pIHtcbiAgICByZXR1cm4gbmV3IFN5bmNDbGllbnQoey4uLm9wdGlvbnMsIGNvbmZpZ3VyYXRpb259KVxuICB9XG5cbiAgLyoqXG4gICAqIERlY2xhcmVzIChvciByZS1hY3RpdmF0ZXMpIGEgc3luYyBzY29wZSBmcm9tIGEgbW9kZWwgcXVlcnkgYW5kIHB1bGxzIGl0IHdoZW4gb25saW5lLlxuICAgKiBAcGFyYW0ge2ltcG9ydChcIi4uL2RhdGFiYXNlL3F1ZXJ5L21vZGVsLWNsYXNzLXF1ZXJ5LmpzXCIpLmRlZmF1bHQ8Pz59IHF1ZXJ5IC0gUXVlcnkgZGVjbGFyaW5nIHRoZSBzeW5jIHNjb3BlLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx7c2NvcGU6IGltcG9ydChcIi4vc3luYy1jbGllbnQtdHlwZXMuanNcIikuU2VyaWFsaXplZFN5bmNTY29wZSwgcHVsbGVkOiBpbXBvcnQoXCIuL3N5bmMtYXBpLWNsaWVudC10eXBlcy5qc1wiKS5TeW5jQ2hhbmdlc1Jlc3VsdCB8IG51bGx9Pn0gRGVjbGFyZWQgc2NvcGUgYW5kIHB1bGwgcmVzdWx0IChudWxsIHdoaWxlIG9mZmxpbmUpLlxuICAgKi9cbiAgYXN5bmMgc3luYyhxdWVyeSkge1xuICAgIGNvbnN0IHNjb3BlID0gc2VyaWFsaXplZFNjb3BlRnJvbVF1ZXJ5KHF1ZXJ5KVxuICAgIGNvbnN0IHNjb3BlU3RvcmUgPSB0aGlzLnNjb3BlU3RvcmUoKVxuICAgIGNvbnN0IHNjb3BlUm93ID0gYXdhaXQgc2NvcGVTdG9yZS5maW5kT3JDcmVhdGVTY29wZShzY29wZSlcblxuICAgIGlmICghc2NvcGVSb3cuY3Vyc29yUGF5bG9hZCAmJiB0aGlzLmNvbmZpZy5sZWdhY3lDdXJzb3IpIHtcbiAgICAgIGNvbnN0IGxlZ2FjeUN1cnNvclBheWxvYWQgPSBhd2FpdCB0aGlzLmNvbmZpZy5sZWdhY3lDdXJzb3Ioe3Njb3BlfSlcbiAgICAgIGNvbnN0IGxlZ2FjeUN1cnNvciA9IFN5bmNBcGlDbGllbnQuc3luY0N1cnNvckZyb21QYXlsb2FkKGxlZ2FjeUN1cnNvclBheWxvYWQpXG5cbiAgICAgIGlmIChsZWdhY3lDdXJzb3IpIGF3YWl0IHNjb3BlU3RvcmUuc2F2ZUN1cnNvcihzY29wZVJvdywgbGVnYWN5Q3Vyc29yKVxuICAgIH1cblxuICAgIHJldHVybiB7cHVsbGVkOiBhd2FpdCB0aGlzLnB1bGwoKSwgc2NvcGV9XG4gIH1cblxuICAvKipcbiAgICogRGVhY3RpdmF0ZXMgdGhlIHN5bmMgc2NvcGUgZGVjbGFyZWQgYnkgYSBtb2RlbCBxdWVyeS5cbiAgICogQHBhcmFtIHtpbXBvcnQoXCIuLi9kYXRhYmFzZS9xdWVyeS9tb2RlbC1jbGFzcy1xdWVyeS5qc1wiKS5kZWZhdWx0PD8+fSBxdWVyeSAtIFF1ZXJ5IHdob3NlIHNjb3BlIHNob3VsZCBzdG9wIHN5bmNpbmcuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fVxuICAgKi9cbiAgYXN5bmMgdW5zeW5jKHF1ZXJ5KSB7XG4gICAgYXdhaXQgdGhpcy5zY29wZVN0b3JlKCkuZGVhY3RpdmF0ZShzZXJpYWxpemVkU2NvcGVGcm9tUXVlcnkocXVlcnkpKVxuICB9XG5cbiAgLyoqXG4gICAqIFB1bGxzIGNoYW5nZXMgZm9yIGV2ZXJ5IGFjdGl2ZSBzY29wZSB3aXRoIHBlci1zY29wZSBjdXJzb3JzIChzaW5nbGUtZmxpZ2h0ZWQsIG9ubGluZS1nYXRlZCkuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPGltcG9ydChcIi4vc3luYy1hcGktY2xpZW50LXR5cGVzLmpzXCIpLlN5bmNDaGFuZ2VzUmVzdWx0IHwgbnVsbD59IENvbWJpbmVkIHB1bGwgcmVzdWx0LCBvciBudWxsIHdoaWxlIG9mZmxpbmUuXG4gICAqL1xuICBhc3luYyBwdWxsKCkge1xuICAgIGlmICghKGF3YWl0IHRoaXMuaXNPbmxpbmUoKSkpIHJldHVybiBudWxsXG5cbiAgICAvKiogQHR5cGUge2ltcG9ydChcIi4vc3luYy1hcGktY2xpZW50LXR5cGVzLmpzXCIpLlN5bmNDaGFuZ2VzUmVzdWx0IHwgbnVsbH0gKi9cbiAgICBsZXQgY29tYmluZWRSZXN1bHQgPSBudWxsXG5cbiAgICBhd2FpdCBTeW5jQXBpQ2xpZW50LnNpbmdsZUZsaWdodChgdmVsb2Npb3VzLXN5bmMtY2xpZW50LXB1bGwtJHt0aGlzLl9jbGllbnROdW1iZXJ9YCwgYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgYXV0aGVudGljYXRpb25Ub2tlbiA9IGF3YWl0IHRoaXMuY29uZmlnLmF1dGhlbnRpY2F0aW9uVG9rZW4oKVxuICAgICAgY29uc3Qgc2NvcGVTdG9yZSA9IHRoaXMuc2NvcGVTdG9yZSgpXG4gICAgICBjb25zdCBhcHBseVN5bmMgPSB0aGlzLnJlbW90ZUFwcGx5U3luYygpXG4gICAgICBjb25zdCByZXN1bHQgPSB7XG4gICAgICAgIGNoYW5nZWQ6IGZhbHNlLFxuICAgICAgICBwYWdlczogMCxcbiAgICAgICAgcmVzb3VyY2VDaGFuZ2VkOiAvKiogQHR5cGUge1JlY29yZDxzdHJpbmcsIGJvb2xlYW4+fSAqLyAoe30pLFxuICAgICAgICByZXNvdXJjZUNvdW50czogLyoqIEB0eXBlIHtSZWNvcmQ8c3RyaW5nLCBudW1iZXI+fSAqLyAoe30pLFxuICAgICAgICBzeW5jZWRDb3VudDogMFxuICAgICAgfVxuXG4gICAgICBmb3IgKGNvbnN0IHNjb3BlUm93IG9mIGF3YWl0IHNjb3BlU3RvcmUuYWN0aXZlU2NvcGVzKCkpIHtcbiAgICAgICAgY29uc3Qgc2NvcGVSZXN1bHQgPSBhd2FpdCBTeW5jQXBpQ2xpZW50LnB1bGxDaGFuZ2VzKHtcbiAgICAgICAgICBhcHBseVN5bmMsXG4gICAgICAgICAgYXV0aGVudGljYXRpb25Ub2tlbixcbiAgICAgICAgICBiYXRjaFNpemU6IHRoaXMuY29uZmlnLmJhdGNoU2l6ZSxcbiAgICAgICAgICBsb2FkQ3Vyc29yOiBhc3luYyAoKSA9PiBhd2FpdCBzY29wZVN0b3JlLmxvYWRDdXJzb3Ioc2NvcGVSb3cpLFxuICAgICAgICAgIHBvc3RDaGFuZ2VzOiBhc3luYyAocGF5bG9hZCkgPT4gYXdhaXQgdGhpcy5jb25maWcucG9zdENoYW5nZXMoe1xuICAgICAgICAgICAgLi4ucGF5bG9hZCxcbiAgICAgICAgICAgIHNjb3BlOiB7Y29uZGl0aW9uczogc2NvcGVSb3cuY29uZGl0aW9ucywgcmVzb3VyY2VUeXBlOiBzY29wZVJvdy5yZXNvdXJjZVR5cGV9XG4gICAgICAgICAgfSksXG4gICAgICAgICAgc2F2ZUN1cnNvcjogYXN5bmMgKGN1cnNvcikgPT4gYXdhaXQgc2NvcGVTdG9yZS5zYXZlQ3Vyc29yKHNjb3BlUm93LCBjdXJzb3IpXG4gICAgICAgIH0pXG5cbiAgICAgICAgcmVzdWx0LmNoYW5nZWQgfHw9IHNjb3BlUmVzdWx0LmNoYW5nZWRcbiAgICAgICAgcmVzdWx0LnBhZ2VzICs9IHNjb3BlUmVzdWx0LnBhZ2VzXG4gICAgICAgIHJlc3VsdC5zeW5jZWRDb3VudCArPSBzY29wZVJlc3VsdC5zeW5jZWRDb3VudFxuXG4gICAgICAgIGZvciAoY29uc3QgW3Jlc291cmNlVHlwZSwgY291bnRdIG9mIE9iamVjdC5lbnRyaWVzKHNjb3BlUmVzdWx0LnJlc291cmNlQ291bnRzKSkge1xuICAgICAgICAgIHJlc3VsdC5yZXNvdXJjZUNvdW50c1tyZXNvdXJjZVR5cGVdID0gKHJlc3VsdC5yZXNvdXJjZUNvdW50c1tyZXNvdXJjZVR5cGVdIHx8IDApICsgY291bnRcbiAgICAgICAgfVxuICAgICAgICBmb3IgKGNvbnN0IFtyZXNvdXJjZVR5cGUsIGNoYW5nZWRdIG9mIE9iamVjdC5lbnRyaWVzKHNjb3BlUmVzdWx0LnJlc291cmNlQ2hhbmdlZCkpIHtcbiAgICAgICAgICByZXN1bHQucmVzb3VyY2VDaGFuZ2VkW3Jlc291cmNlVHlwZV0gfHw9IGNoYW5nZWRcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBjb21iaW5lZFJlc3VsdCA9IHJlc3VsdFxuICAgIH0pXG5cbiAgICByZXR1cm4gY29tYmluZWRSZXN1bHRcbiAgfVxuXG4gIC8qKlxuICAgKiBCdWlsZHMgdGhlIGRlcml2ZWQgcmVtb3RlLWNoYW5nZSBhcHBsaWVyIHNoYXJlZCBieSBwdWxscyBhbmQgcmVhbHRpbWUgcHVzaGVzOlxuICAgKiBhcHBsaWVzIHRocm91Z2ggdGhlIGRlY2xhcmVkIHJlc291cmNlIGNvbmZpZ3MsIHJlZ2lzdGVycyBlYWNoIHdyaXR0ZW4gcmVjb3JkXG4gICAqIGZvciBlY2hvIHN1cHByZXNzaW9uICh0cmFja2VkIHJlc291cmNlcyBkbyBub3QgcmUtcXVldWUgYXBwbGllZCBjaGFuZ2VzKSwgYW5kXG4gICAqIGZhaWxzIGxvdWRseSBpbnN0ZWFkIG9mIHNpbGVudGx5IHNraXBwaW5nIHVuY29uZmlndXJlZCByZXNvdXJjZXMuXG4gICAqIEBwYXJhbSB7e3NvdXJjZT86IHN0cmluZ319IFthcmdzXSAtIEVycm9yIGNvbnRleHQgZGVzY3JpYmluZyB3aGVyZSB0aGUgY2hhbmdlIGNhbWUgZnJvbS5cbiAgICogQHJldHVybnMgeyhzeW5jOiBpbXBvcnQoXCIuL3N5bmMtYXBpLWNsaWVudC10eXBlcy5qc1wiKS5TeW5jQ2hhbmdlRW52ZWxvcGUpID0+IFByb21pc2U8aW1wb3J0KFwiLi9zeW5jLWFwaS1jbGllbnQtdHlwZXMuanNcIikuU3luY0NoYW5nZUFwcGx5UmVzdWx0Pn0gTG91ZCByZW1vdGUtY2hhbmdlIGFwcGxpZXIuXG4gICAqL1xuICByZW1vdGVBcHBseVN5bmMoe3NvdXJjZSA9IFwicHVsbGVkIGNoYW5nZVwifSA9IHt9KSB7XG4gICAgY29uc3QgcHVsbFJlc291cmNlQ29uZmlncyA9IHRoaXMucHVsbFJlc291cmNlQ29uZmlncygpXG4gICAgY29uc3QgYXBwbGllciA9IFN5bmNBcGlDbGllbnQucmVzb3VyY2VBcHBsaWVyKHB1bGxSZXNvdXJjZUNvbmZpZ3MsIChyZWNvcmQpID0+IHRoaXMubWFya1JlbW90ZUFwcGx5KHJlY29yZCkpXG5cbiAgICByZXR1cm4gYXN5bmMgKHN5bmMpID0+IHtcbiAgICAgIGNvbnN0IHJlc291cmNlVHlwZSA9IHN5bmMucmVzb3VyY2VUeXBlKClcblxuICAgICAgaWYgKCFyZXNvdXJjZVR5cGUgfHwgIXB1bGxSZXNvdXJjZUNvbmZpZ3NbcmVzb3VyY2VUeXBlXSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYE5vIHN5bmMgcmVzb3VyY2Ugd2l0aCBwdWxsIGF0dHJpYnV0ZXMgY29uZmlndXJlZCBmb3IgJHtzb3VyY2V9OiAke1N0cmluZyhyZXNvdXJjZVR5cGUpfWApXG4gICAgICB9XG5cbiAgICAgIHJldHVybiBhd2FpdCBhcHBsaWVyKHN5bmMpXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFN1YnNjcmliZXMgdGhlIGRlcml2ZWQgcmVhbHRpbWUgY2hhbm5lbHMgc28gcHVzaGVkIHdlYnNvY2tldCBjaGFuZ2VzIGFwcGx5XG4gICAqIHRocm91Z2ggdGhlIHNhbWUgZGVyaXZlZCBhcHBsaWVyIGFzIHB1bGxzIChpZGVtcG90ZW50LCBzaW5nbGUtZmxpZ2h0ZWQpLlxuICAgKiBAcGFyYW0gez99IFtjb250ZXh0XSAtIEFwcCBjb250ZXh0IHBhc3NlZCB0byB0aGUgZGVwcmVjYXRlZCBgc3luYy5jbGllbnQucmVhbHRpbWUuY2hhbm5lbHNgIGNhbGxiYWNrIChydW50aW1lIHNjb3BlIHZhbHVlcykuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fVxuICAgKi9cbiAgYXN5bmMgc3Vic2NyaWJlUmVhbHRpbWUoY29udGV4dCkge1xuICAgIGF3YWl0IHRoaXMucmVhbHRpbWVCcmlkZ2UoKS5zdWJzY3JpYmUoY29udGV4dClcbiAgfVxuXG4gIC8qKlxuICAgKiBVbnN1YnNjcmliZXMgdGhlIHJlYWx0aW1lIGNoYW5uZWxzIGFuZCBkaXNjb25uZWN0cyB0aGUgd2Vic29ja2V0IGNsaWVudCAoaWRlbXBvdGVudCkuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fVxuICAgKi9cbiAgYXN5bmMgdW5zdWJzY3JpYmVSZWFsdGltZSgpIHtcbiAgICBhd2FpdCB0aGlzLnJlYWx0aW1lQnJpZGdlKCkudW5zdWJzY3JpYmUoKVxuICB9XG5cbiAgLyoqXG4gICAqIFJlcG9ydHMgdGhlIHJlYWx0aW1lIHN1YnNjcmlwdGlvbiBzdGF0ZSBhbmQgcGVyLWNoYW5uZWwgcmVhZGluZXNzLlxuICAgKiBAcmV0dXJucyB7UmV0dXJuVHlwZTxTeW5jUmVhbHRpbWVCcmlkZ2VbXCJzdGF0dXNcIl0+fSBSZWFsdGltZSBzdGF0dXMuXG4gICAqL1xuICByZWFsdGltZVN0YXR1cygpIHtcbiAgICByZXR1cm4gdGhpcy5yZWFsdGltZUJyaWRnZSgpLnN0YXR1cygpXG4gIH1cblxuICAvKipcbiAgICogQXdhaXRzIGFsbCBwZW5kaW5nIHJlYWx0aW1lIG1lc3NhZ2UgYXBwbGllcyBhbmQgYW55IHNjaGVkdWxlZFxuICAgKiBwdWxsLW9uLXJlY29ubmVjdCAodXNlZnVsIGluIHRlc3RzIGFuZCBzaHV0ZG93biBmbG93cykuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fVxuICAgKi9cbiAgYXN5bmMgd2FpdEZvclJlYWx0aW1lQXBwbGllZCgpIHtcbiAgICBhd2FpdCB0aGlzLnJlYWx0aW1lQnJpZGdlKCkud2FpdEZvckFwcGxpZWQoKVxuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIGxhemlseSBidWlsdCByZWFsdGltZSBicmlkZ2UuXG4gICAqIEByZXR1cm5zIHtTeW5jUmVhbHRpbWVCcmlkZ2V9IFJlYWx0aW1lIGJyaWRnZS5cbiAgICovXG4gIHJlYWx0aW1lQnJpZGdlKCkge1xuICAgIHRoaXMuX3JlYWx0aW1lQnJpZGdlIHx8PSBuZXcgU3luY1JlYWx0aW1lQnJpZGdlKHtzeW5jQ2xpZW50OiB0aGlzfSlcblxuICAgIHJldHVybiB0aGlzLl9yZWFsdGltZUJyaWRnZVxuICB9XG5cbiAgLyoqXG4gICAqIFF1ZXVlcyBhIGxvY2FsIG1vZGVsIGNoYW5nZSBhcyBhIHBlbmRpbmcgc3luYyByb3cgYW5kIHNjaGVkdWxlcyBhbiBpbW1lZGlhdGVcbiAgICogcmVwbGF5IGF0dGVtcHQgKGtlcHQgcGVuZGluZyB3aGlsZSBvZmZsaW5lIG9yIHdoZW4gdGhlIGJhY2tlbmQgcmVqZWN0cyBpdCkuXG4gICAqIEBwYXJhbSB7e3Jlc291cmNlOiA/LCBkYXRhPzogUmVjb3JkPHN0cmluZywgPz4sIHN5bmNUeXBlPzogc3RyaW5nfX0gYXJncyAtIFF1ZXVlIGFyZ3MuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPD8+fSBQZW5kaW5nIGxvY2FsIHN5bmMgcm93LlxuICAgKi9cbiAgYXN5bmMgcXVldWUoe2RhdGEsIHJlc291cmNlLCBzeW5jVHlwZX0pIHtcbiAgICBjb25zdCByZXNvdXJjZUNvbmZpZyA9IHRoaXMucmVzb3VyY2VDb25maWdGb3IocmVzb3VyY2UpXG4gICAgY29uc3Qgc3luY1JvdyA9IGF3YWl0IFN5bmNBcGlDbGllbnQucXVldWVMb2NhbFN5bmMoe1xuICAgICAgYm9vbGVhbkF0dHJpYnV0ZXM6IHJlc291cmNlQ29uZmlnLmJvb2xlYW5BdHRyaWJ1dGVzIHx8IFtdLFxuICAgICAgZGF0YSxcbiAgICAgIGxvY2FsT25seUF0dHJpYnV0ZXM6IHJlc291cmNlQ29uZmlnLmxvY2FsT25seUF0dHJpYnV0ZXMgfHwgW10sXG4gICAgICByZXNvdXJjZSxcbiAgICAgIHN5bmNNb2RlbDogdGhpcy5jb25maWcuc3luY01vZGVsLFxuICAgICAgc3luY1R5cGU6IHN5bmNUeXBlID8/IHRoaXMuZGVmYXVsdFN5bmNUeXBlKHtvcGVyYXRpb246IFwidXBkYXRlXCIsIHJlY29yZDogcmVzb3VyY2UsIHJlc291cmNlQ29uZmlnfSlcbiAgICB9KVxuXG4gICAgdGhpcy5zY2hlZHVsZVJlcGxheSgpXG5cbiAgICByZXR1cm4gc3luY1Jvd1xuICB9XG5cbiAgLyoqXG4gICAqIERyYWlucyBwZW5kaW5nIGxvY2FsIHN5bmMgcm93cyB0byB0aGUgYmFja2VuZCAoc2luZ2xlLWZsaWdodGVkLCBvbmxpbmUtZ2F0ZWQpLlxuICAgKiBSb3dzIGFyZSBvbmx5IG1hcmtlZCBzdWNjZXNzZnVsIGFmdGVyIHRoZSBiYWNrZW5kIGFja25vd2xlZGdlcyB0aGVtLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn1cbiAgICovXG4gIGFzeW5jIHJlcGxheVBlbmRpbmcoKSB7XG4gICAgaWYgKCEoYXdhaXQgdGhpcy5pc09ubGluZSgpKSkgcmV0dXJuXG5cbiAgICBhd2FpdCBTeW5jQXBpQ2xpZW50LnNpbmdsZUZsaWdodChgdmVsb2Npb3VzLXN5bmMtY2xpZW50LXJlcGxheS0ke3RoaXMuX2NsaWVudE51bWJlcn1gLCBhc3luYyAoKSA9PiB7XG4gICAgICBhd2FpdCBTeW5jQXBpQ2xpZW50LnJlcGxheUxvY2FsU3luY3Moe1xuICAgICAgICBhdXRoZW50aWNhdGlvblRva2VuOiBhd2FpdCB0aGlzLmNvbmZpZy5hdXRoZW50aWNhdGlvblRva2VuKCksXG4gICAgICAgIGJhdGNoU2l6ZTogdGhpcy5jb25maWcuYmF0Y2hTaXplLFxuICAgICAgICBwb3N0UmVwbGF5OiB0aGlzLmNvbmZpZy5wb3N0UmVwbGF5LFxuICAgICAgICBzeW5jTW9kZWw6IHRoaXMuY29uZmlnLnN5bmNNb2RlbFxuICAgICAgfSlcbiAgICB9KVxuICB9XG5cbiAgLyoqXG4gICAqIFNjaGVkdWxlcyBhIGJhY2tncm91bmQgcmVwbGF5IGF0dGVtcHQgd2l0aG91dCBibG9ja2luZyB0aGUgY2FsbGVyLlxuICAgKiBGYWlsdXJlcyBnbyB0byBjb25maWcub25FcnJvciAob3IgcmV0aHJvdyB3aGVuIG5vbmUgaXMgY29uZmlndXJlZCkuXG4gICAqIEByZXR1cm5zIHt2b2lkfVxuICAgKi9cbiAgc2NoZWR1bGVSZXBsYXkoKSB7XG4gICAgdGhpcy5fc2NoZWR1bGVkUmVwbGF5ID0gKGFzeW5jICgpID0+IHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGF3YWl0IHRoaXMucmVwbGF5UGVuZGluZygpXG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICB0aGlzLnJlcG9ydEVycm9yKC8qKiBAdHlwZSB7RXJyb3J9ICovIChlcnJvcikpXG4gICAgICB9XG4gICAgfSkoKVxuICB9XG5cbiAgLyoqXG4gICAqIEF3YWl0cyB0aGUgbGFzdCBzY2hlZHVsZWQgYmFja2dyb3VuZCByZXBsYXkgKHVzZWZ1bCBpbiB0ZXN0cyBhbmQgc2h1dGRvd24gZmxvd3MpLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn1cbiAgICovXG4gIGFzeW5jIHdhaXRGb3JTY2hlZHVsZWRSZXBsYXkoKSB7XG4gICAgaWYgKHRoaXMuX3NjaGVkdWxlZFJlcGxheSkgYXdhaXQgdGhpcy5fc2NoZWR1bGVkUmVwbGF5XG4gIH1cblxuICAvKipcbiAgICogUmVwb3J0cyBhIGJhY2tncm91bmQgc3luYyBmYWlsdXJlLlxuICAgKiBAcGFyYW0ge0Vycm9yfSBlcnJvciAtIEJhY2tncm91bmQgZmFpbHVyZS5cbiAgICogQHJldHVybnMge3ZvaWR9XG4gICAqL1xuICByZXBvcnRFcnJvcihlcnJvcikge1xuICAgIGlmICh0aGlzLmNvbmZpZy5vbkVycm9yKSB7XG4gICAgICB0aGlzLmNvbmZpZy5vbkVycm9yKGVycm9yKVxuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgdGhyb3cgZXJyb3JcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXNvbHZlcyBjb25uZWN0aXZpdHkgdGhyb3VnaCB0aGUgY29uZmlndXJlZCBnYXRlLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxib29sZWFuPn0gV2hldGhlciB0aGUgYmFja2VuZCBpcyBjb25zaWRlcmVkIHJlYWNoYWJsZS5cbiAgICovXG4gIGFzeW5jIGlzT25saW5lKCkge1xuICAgIGlmICghdGhpcy5jb25maWcuaXNPbmxpbmUpIHJldHVybiB0cnVlXG5cbiAgICByZXR1cm4gKGF3YWl0IHRoaXMuY29uZmlnLmlzT25saW5lKCkpICE9PSBmYWxzZVxuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIHNjb3BlIHN0b3JlIGJhY2tpbmcgZGVjbGFyZWQgc2NvcGVzIGFuZCBjdXJzb3JzLlxuICAgKiBAcmV0dXJucyB7aW1wb3J0KFwiLi9zeW5jLXNjb3BlLXN0b3JlLmpzXCIpLmRlZmF1bHR9IFNjb3BlIHN0b3JlLlxuICAgKi9cbiAgc2NvcGVTdG9yZSgpIHtcbiAgICB0aGlzLl9zY29wZVN0b3JlIHx8PSBuZXcgU3luY1Njb3BlU3RvcmUoe2NvbmZpZ3VyYXRpb246IHRoaXMuY29uZmlnLmNvbmZpZ3VyYXRpb259KVxuXG4gICAgcmV0dXJuIHRoaXMuX3Njb3BlU3RvcmVcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXNvbHZlcyB0aGUgZGVjbGFyZWQgcmVzb3VyY2UgY29uZmlnIGZvciBhIGxvY2FsIHJlY29yZC5cbiAgICogQHBhcmFtIHs/fSByZXNvdXJjZSAtIExvY2FsIG1vZGVsIHJlY29yZC5cbiAgICogQHJldHVybnMge2ltcG9ydChcIi4vc3luYy1jbGllbnQtdHlwZXMuanNcIikuU3luY0NsaWVudFJlc291cmNlQ29uZmlnfSBEZWNsYXJlZCByZXNvdXJjZSBjb25maWcuXG4gICAqL1xuICByZXNvdXJjZUNvbmZpZ0ZvcihyZXNvdXJjZSkge1xuICAgIGNvbnN0IG1vZGVsQ2xhc3MgPSByZXNvdXJjZT8uY29uc3RydWN0b3JcblxuICAgIGlmICh0eXBlb2YgbW9kZWxDbGFzcz8uZ2V0TW9kZWxOYW1lICE9PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgU3luYyByZXNvdXJjZXMgbXVzdCBiZSBtb2RlbCByZWNvcmRzIHdpdGggYSBzdGF0aWMgZ2V0TW9kZWxOYW1lKCksIGdvdDogJHtTdHJpbmcocmVzb3VyY2UpfWApXG4gICAgfVxuXG4gICAgY29uc3QgcmVzb3VyY2VUeXBlID0gbW9kZWxDbGFzcy5nZXRNb2RlbE5hbWUoKVxuICAgIGNvbnN0IHJlc291cmNlQ29uZmlnID0gdGhpcy5jb25maWcucmVzb3VyY2VzW3Jlc291cmNlVHlwZV1cblxuICAgIGlmICghcmVzb3VyY2VDb25maWcpIHRocm93IG5ldyBFcnJvcihgTm8gc3luYyByZXNvdXJjZSBjb25maWd1cmVkIGZvcjogJHtyZXNvdXJjZVR5cGV9YClcblxuICAgIHJldHVybiByZXNvdXJjZUNvbmZpZ1xuICB9XG5cbiAgLyoqXG4gICAqIFJlc29sdmVzIHRoZSBzeW5jIHR5cGUgZm9yIGEgbXV0YXRpb24gdGhyb3VnaCB0aGUgcmVzb3VyY2UgY29uZmlnLiBUaGVcbiAgICogXCJ1cHNlcnRcIiBmbGFnIHF1ZXVlcyBjcmVhdGVzIGFuZCB1cGRhdGVzIGFzIFwidXBkYXRlXCIgcm93cyAodGhlIHNlcnZlclxuICAgKiB1cHNlcnRzIGJ5IHJlc291cmNlIGlkKSBhbmQgZGVzdHJveXMgYXMgXCJkZWxldGVcIiByb3dzLlxuICAgKiBAcGFyYW0ge3tvcGVyYXRpb246IFwiY3JlYXRlXCIgfCBcInVwZGF0ZVwiIHwgXCJkZXN0cm95XCIsIHJlY29yZDogPywgcmVzb3VyY2VDb25maWc6IGltcG9ydChcIi4vc3luYy1jbGllbnQtdHlwZXMuanNcIikuU3luY0NsaWVudFJlc291cmNlQ29uZmlnfX0gYXJncyAtIE11dGF0aW9uIGFyZ3MuXG4gICAqIEByZXR1cm5zIHtzdHJpbmd9IFN5bmMgdHlwZS5cbiAgICovXG4gIGRlZmF1bHRTeW5jVHlwZSh7b3BlcmF0aW9uLCByZWNvcmQsIHJlc291cmNlQ29uZmlnfSkge1xuICAgIGlmICh0eXBlb2YgcmVzb3VyY2VDb25maWcuc3luY1R5cGUgPT09IFwiZnVuY3Rpb25cIikgcmV0dXJuIHJlc291cmNlQ29uZmlnLnN5bmNUeXBlKHtvcGVyYXRpb24sIHJlY29yZH0pXG4gICAgaWYgKG9wZXJhdGlvbiA9PT0gXCJkZXN0cm95XCIpIHJldHVybiBcImRlbGV0ZVwiXG4gICAgaWYgKHJlc291cmNlQ29uZmlnLnN5bmNUeXBlID09PSBcInVwc2VydFwiKSByZXR1cm4gXCJ1cGRhdGVcIlxuXG4gICAgcmV0dXJuIG9wZXJhdGlvblxuICB9XG5cbiAgLyoqXG4gICAqIERlcml2ZXMgdGhlIHB1bGwtYXBwbHkgcmVzb3VyY2UgY29uZmlncyBmcm9tIHRoZSBkZWNsYXJlZCByZXNvdXJjZXMuXG4gICAqIEByZXR1cm5zIHtSZWNvcmQ8c3RyaW5nLCBpbXBvcnQoXCIuL3N5bmMtYXBpLWNsaWVudC10eXBlcy5qc1wiKS5TeW5jUmVzb3VyY2VDb25maWc+fSBQdWxsLWFwcGx5IHJlc291cmNlIGNvbmZpZ3MuXG4gICAqL1xuICBwdWxsUmVzb3VyY2VDb25maWdzKCkge1xuICAgIHRoaXMuX3B1bGxSZXNvdXJjZUNvbmZpZ3MgfHw9IC8qKiBAdHlwZSB7UmVjb3JkPHN0cmluZywgaW1wb3J0KFwiLi9zeW5jLWFwaS1jbGllbnQtdHlwZXMuanNcIikuU3luY1Jlc291cmNlQ29uZmlnPn0gKi8gKE9iamVjdC5mcm9tRW50cmllcyhcbiAgICAgIE9iamVjdC5lbnRyaWVzKHRoaXMuY29uZmlnLnJlc291cmNlcylcbiAgICAgICAgLmZpbHRlcigoWywgcmVzb3VyY2VdKSA9PiBCb29sZWFuKHJlc291cmNlLmF0dHJpYnV0ZXMpKVxuICAgICAgICAubWFwKChbcmVzb3VyY2VUeXBlLCByZXNvdXJjZV0pID0+IFtyZXNvdXJjZVR5cGUsIHtcbiAgICAgICAgICBhZnRlckFwcGx5OiByZXNvdXJjZS5hZnRlckFwcGx5LFxuICAgICAgICAgIGF0dHJpYnV0ZXM6IC8qKiBAdHlwZSB7aW1wb3J0KFwiLi9zeW5jLWFwaS1jbGllbnQtdHlwZXMuanNcIikuU3luY1Jlc291cmNlQ29uZmlnW1wiYXR0cmlidXRlc1wiXX0gKi8gKHJlc291cmNlLmF0dHJpYnV0ZXMpLFxuICAgICAgICAgIGVuYWJsZWQ6IHRydWUsXG4gICAgICAgICAgZmluZFJlY29yZDogcmVzb3VyY2UuZmluZFJlY29yZCxcbiAgICAgICAgICBmaW5kUmVjb3JkRm9yRGVsZXRlOiByZXNvdXJjZS5maW5kUmVjb3JkRm9yRGVsZXRlLFxuICAgICAgICAgIG1vZGVsQ2xhc3M6IHJlc291cmNlLm1vZGVsQ2xhc3NcbiAgICAgICAgfV0pXG4gICAgKSlcblxuICAgIHJldHVybiB0aGlzLl9wdWxsUmVzb3VyY2VDb25maWdzXG4gIH1cbn1cblxuLyoqXG4gKiBCdWlsZHMgb25lIHJlc291cmNlIGNvbmZpZyBmcm9tIGEgbW9kZWwncyBgc3RhdGljIHN5bmNgIGRlY2xhcmF0aW9uIHBsdXMgaXRzXG4gKiBkZXJpdmVkIGNvbHVtbiBtZXRhZGF0YS5cbiAqIEBwYXJhbSB7e2RlY2xhcmF0aW9uOiBpbXBvcnQoXCIuL3N5bmMtY2xpZW50LXR5cGVzLmpzXCIpLk1vZGVsU3luY0RlY2xhcmF0aW9uLCBtb2RlbENsYXNzOiA/LCByZXNvdXJjZVR5cGU6IHN0cmluZ319IGFyZ3MgLSBEZWNsYXJhdGlvbiBhcmdzLlxuICogQHJldHVybnMge2ltcG9ydChcIi4vc3luYy1jbGllbnQtdHlwZXMuanNcIikuU3luY0NsaWVudFJlc291cmNlQ29uZmlnfSBEZXJpdmVkIHJlc291cmNlIGNvbmZpZy5cbiAqL1xuZnVuY3Rpb24gcmVzb3VyY2VDb25maWdGcm9tU3luY0RlY2xhcmF0aW9uKHtkZWNsYXJhdGlvbiwgbW9kZWxDbGFzcywgcmVzb3VyY2VUeXBlfSkge1xuICBjb25zdCBub3JtYWxpemVkRGVjbGFyYXRpb24gPSBkZWNsYXJhdGlvbiA9PT0gdHJ1ZSA/IHt9IDogZGVjbGFyYXRpb25cblxuICBpZiAoIW5vcm1hbGl6ZWREZWNsYXJhdGlvbiB8fCB0eXBlb2Ygbm9ybWFsaXplZERlY2xhcmF0aW9uICE9PSBcIm9iamVjdFwiIHx8IEFycmF5LmlzQXJyYXkobm9ybWFsaXplZERlY2xhcmF0aW9uKSkge1xuICAgIHRocm93IG5ldyBFcnJvcihgJHtyZXNvdXJjZVR5cGV9IHN0YXRpYyBzeW5jIG11c3QgYmUgdHJ1ZSBvciBhIHN5bmMgZGVjbGFyYXRpb24gb2JqZWN0LCBnb3Q6ICR7U3RyaW5nKGRlY2xhcmF0aW9uKX1gKVxuICB9XG5cbiAgY29uc3Qge2FmdGVyQXBwbHksIGF0dHJpYnV0ZXMsIGJvb2xlYW5BdHRyaWJ1dGVzLCBmaW5kUmVjb3JkLCBmaW5kUmVjb3JkRm9yRGVsZXRlLCBsb2NhbE9ubHlBdHRyaWJ1dGVzLCBwdWJsaXNoLCByZWFsdGltZSwgc3luY1R5cGUsIHRyYWNrLCB0cmFja2VkRGF0YSwgLi4ucmVzdERlY2xhcmF0aW9ufSA9IG5vcm1hbGl6ZWREZWNsYXJhdGlvblxuICBjb25zdCB1bmtub3duS2V5cyA9IE9iamVjdC5rZXlzKHJlc3REZWNsYXJhdGlvbilcblxuICAvLyBgcHVibGlzaGAgaXMgdGhlIHNlcnZlci1zaWRlIGhhbGYgb2YgdGhlIHNoYXJlZCBgc3RhdGljIHN5bmNgIGRlY2xhcmF0aW9uXG4gIC8vIChjb25zdW1lZCBieSBTeW5jUHVibGlzaGVyIG9uIHRoZSBiYWNrZW5kKSAtIHRoZSBjbGllbnQgZGVyaXZlcyBub3RoaW5nXG4gIC8vIGZyb20gaXQsIGJ1dCBtb2RlbHMgZGVjbGFyZWQgb25jZSBmb3IgYm90aCBzaWRlcyBtdXN0IHN0YXkgdmFsaWQgaGVyZS5cbiAgdm9pZCBwdWJsaXNoXG5cbiAgaWYgKHVua25vd25LZXlzLmxlbmd0aCA+IDApIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYCR7cmVzb3VyY2VUeXBlfSBzdGF0aWMgc3luYyByZWNlaXZlZCB1bmtub3duIGtleXM6ICR7dW5rbm93bktleXMuam9pbihcIiwgXCIpfSAoc3VwcG9ydGVkOiBhZnRlckFwcGx5LCBhdHRyaWJ1dGVzLCBib29sZWFuQXR0cmlidXRlcywgZmluZFJlY29yZCwgZmluZFJlY29yZEZvckRlbGV0ZSwgbG9jYWxPbmx5QXR0cmlidXRlcywgcHVibGlzaCwgcmVhbHRpbWUsIHN5bmNUeXBlLCB0cmFjaywgdHJhY2tlZERhdGEpYClcbiAgfVxuICBpZiAoc3luY1R5cGUgIT09IHVuZGVmaW5lZCAmJiB0eXBlb2Ygc3luY1R5cGUgIT09IFwiZnVuY3Rpb25cIiAmJiBzeW5jVHlwZSAhPT0gXCJ1cHNlcnRcIikge1xuICAgIHRocm93IG5ldyBFcnJvcihgJHtyZXNvdXJjZVR5cGV9IHN0YXRpYyBzeW5jIHN5bmNUeXBlIG11c3QgYmUgYSBmdW5jdGlvbiBvciB0aGUgc3RyaW5nIFwidXBzZXJ0XCIsIGdvdDogJHtTdHJpbmcoc3luY1R5cGUpfWApXG4gIH1cblxuICBjb25zdCBkZXJpdmVkID0gZGVyaXZlZFN5bmNBdHRyaWJ1dGVzKHttb2RlbENsYXNzLCByZXNvdXJjZVR5cGV9KVxuXG4gIHJldHVybiB7XG4gICAgYWZ0ZXJBcHBseSxcbiAgICBhdHRyaWJ1dGVzLFxuICAgIGJvb2xlYW5BdHRyaWJ1dGVzOiBtZXJnZWRBdHRyaWJ1dGVOYW1lcyhkZXJpdmVkLmJvb2xlYW5BdHRyaWJ1dGVzLCBib29sZWFuQXR0cmlidXRlcyksXG4gICAgZmluZFJlY29yZCxcbiAgICBmaW5kUmVjb3JkRm9yRGVsZXRlLFxuICAgIGxvY2FsT25seUF0dHJpYnV0ZXM6IG1lcmdlZEF0dHJpYnV0ZU5hbWVzKGRlcml2ZWQubG9jYWxPbmx5QXR0cmlidXRlcywgbG9jYWxPbmx5QXR0cmlidXRlcyksXG4gICAgbW9kZWxDbGFzcyxcbiAgICByZWFsdGltZSxcbiAgICBzeW5jVHlwZSxcbiAgICB0cmFjazogbm9ybWFsaXplZFRyYWNrKHRyYWNrKSxcbiAgICB0cmFja2VkRGF0YVxuICB9XG59XG5cbi8qKlxuICogRGVyaXZlcyBib29sZWFuIGFuZCBsb2NhbC1vbmx5IGF0dHJpYnV0ZSBuYW1lcyBmcm9tIGEgbW9kZWwncyBjb2x1bW4gbWV0YWRhdGE6XG4gKiBib29sZWFucyBmcm9tIGJvb2xlYW4gY29sdW1uIHR5cGVzOyBsb2NhbC1vbmx5IGZyb20gdGhlIHByaW1hcnkga2V5LFxuICogY3JlYXRlZEF0L3VwZGF0ZWRBdCwgYW5kIHN5bmMgYm9va2tlZXBpbmcgY29sdW1ucy5cbiAqIEBwYXJhbSB7e21vZGVsQ2xhc3M6ID8sIHJlc291cmNlVHlwZTogc3RyaW5nfX0gYXJncyAtIERlcml2YXRpb24gYXJncy5cbiAqIEByZXR1cm5zIHt7Ym9vbGVhbkF0dHJpYnV0ZXM6IHN0cmluZ1tdLCBsb2NhbE9ubHlBdHRyaWJ1dGVzOiBzdHJpbmdbXX19IERlcml2ZWQgYXR0cmlidXRlIG5hbWVzLlxuICovXG5mdW5jdGlvbiBkZXJpdmVkU3luY0F0dHJpYnV0ZXMoe21vZGVsQ2xhc3MsIHJlc291cmNlVHlwZX0pIHtcbiAgaWYgKFxuICAgIHR5cGVvZiBtb2RlbENsYXNzLmdldENvbHVtbk5hbWVzICE9PSBcImZ1bmN0aW9uXCIgfHxcbiAgICB0eXBlb2YgbW9kZWxDbGFzcy5nZXRDb2x1bW5OYW1lVG9BdHRyaWJ1dGVOYW1lTWFwICE9PSBcImZ1bmN0aW9uXCIgfHxcbiAgICB0eXBlb2YgbW9kZWxDbGFzcy5nZXRDb2x1bW5UeXBlQnlOYW1lICE9PSBcImZ1bmN0aW9uXCIgfHxcbiAgICB0eXBlb2YgbW9kZWxDbGFzcy5wcmltYXJ5S2V5ICE9PSBcImZ1bmN0aW9uXCIgfHxcbiAgICB0eXBlb2YgbW9kZWxDbGFzcy5oYXNQcmltYXJ5S2V5ICE9PSBcImZ1bmN0aW9uXCJcbiAgKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGAke3Jlc291cmNlVHlwZX0gc3RhdGljIHN5bmMgcmVxdWlyZXMgYSBWZWxvY2lvdXMgbW9kZWwgY2xhc3Mgd2l0aCBjb2x1bW4gbWV0YWRhdGEgKGdldENvbHVtbk5hbWVzLCBnZXRDb2x1bW5OYW1lVG9BdHRyaWJ1dGVOYW1lTWFwLCBnZXRDb2x1bW5UeXBlQnlOYW1lLCBwcmltYXJ5S2V5LCBoYXNQcmltYXJ5S2V5KWApXG4gIH1cblxuICBjb25zdCBjb2x1bW5OYW1lVG9BdHRyaWJ1dGVOYW1lID0gbW9kZWxDbGFzcy5nZXRDb2x1bW5OYW1lVG9BdHRyaWJ1dGVOYW1lTWFwKClcbiAgLyoqIEB0eXBlIHtzdHJpbmdbXX0gKi9cbiAgY29uc3QgYm9vbGVhbkF0dHJpYnV0ZXMgPSBbXVxuICAvKiogQHR5cGUge3N0cmluZ1tdfSAqL1xuICBjb25zdCBsb2NhbE9ubHlBdHRyaWJ1dGVzID0gW11cblxuICBpZiAobW9kZWxDbGFzcy5oYXNQcmltYXJ5S2V5KCkpIHtcbiAgICBjb25zdCBwcmltYXJ5S2V5Q29sdW1uID0gbW9kZWxDbGFzcy5wcmltYXJ5S2V5KClcblxuICAgIGxvY2FsT25seUF0dHJpYnV0ZXMucHVzaChjb2x1bW5OYW1lVG9BdHRyaWJ1dGVOYW1lW3ByaW1hcnlLZXlDb2x1bW5dIHx8IHByaW1hcnlLZXlDb2x1bW4pXG4gIH1cblxuICBmb3IgKGNvbnN0IGNvbHVtbk5hbWUgb2YgbW9kZWxDbGFzcy5nZXRDb2x1bW5OYW1lcygpKSB7XG4gICAgY29uc3QgYXR0cmlidXRlTmFtZSA9IGNvbHVtbk5hbWVUb0F0dHJpYnV0ZU5hbWVbY29sdW1uTmFtZV0gfHwgY29sdW1uTmFtZVxuICAgIGNvbnN0IGNvbHVtblR5cGUgPSBtb2RlbENsYXNzLmdldENvbHVtblR5cGVCeU5hbWUoY29sdW1uTmFtZSlcblxuICAgIGlmIChMT0NBTF9CT09LS0VFUElOR19BVFRSSUJVVEVfTkFNRVMuaW5jbHVkZXMoYXR0cmlidXRlTmFtZSkgJiYgIWxvY2FsT25seUF0dHJpYnV0ZXMuaW5jbHVkZXMoYXR0cmlidXRlTmFtZSkpIHtcbiAgICAgIGxvY2FsT25seUF0dHJpYnV0ZXMucHVzaChhdHRyaWJ1dGVOYW1lKVxuICAgIH1cbiAgICBpZiAoY29sdW1uVHlwZSAmJiBpc0Jvb2xlYW5Db2x1bW5UeXBlKGNvbHVtblR5cGUpKSB7XG4gICAgICBib29sZWFuQXR0cmlidXRlcy5wdXNoKGF0dHJpYnV0ZU5hbWUpXG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHtib29sZWFuQXR0cmlidXRlcywgbG9jYWxPbmx5QXR0cmlidXRlc31cbn1cblxuLyoqXG4gKiBNZXJnZXMgZGVyaXZlZCBhdHRyaWJ1dGUgbmFtZXMgd2l0aCBkZWNsYXJlZCBleHRyYXMgaW50byBhIHNvcnRlZCwgZHVwbGljYXRlLWZyZWUgbGlzdC5cbiAqIEBwYXJhbSB7c3RyaW5nW119IGRlcml2ZWQgLSBEZXJpdmVkIGF0dHJpYnV0ZSBuYW1lcy5cbiAqIEBwYXJhbSB7c3RyaW5nW10gfCB1bmRlZmluZWR9IGRlY2xhcmVkIC0gRGVjbGFyZWQgZXh0cmEgYXR0cmlidXRlIG5hbWVzLlxuICogQHJldHVybnMge3N0cmluZ1tdfSBNZXJnZWQgYXR0cmlidXRlIG5hbWVzLlxuICovXG5mdW5jdGlvbiBtZXJnZWRBdHRyaWJ1dGVOYW1lcyhkZXJpdmVkLCBkZWNsYXJlZCkge1xuICByZXR1cm4gWy4uLm5ldyBTZXQoWy4uLmRlcml2ZWQsIC4uLihkZWNsYXJlZCB8fCBbXSldKV0uc29ydCgpXG59XG5cbi8qKlxuICogTm9ybWFsaXplcyBhIGRlY2xhcmF0aW9uJ3MgdHJhY2sgdmFsdWU6IGFuIG9wZXJhdGlvbnMgYXJyYXkgaXMgc2hvcnRoYW5kIGZvclxuICogdGhlIHtvcGVyYXRpb25zfSBmb3JtLlxuICogQHBhcmFtIHtpbXBvcnQoXCIuL3N5bmMtY2xpZW50LXR5cGVzLmpzXCIpLk1vZGVsU3luY0RlY2xhcmF0aW9uQ29uZmlnW1widHJhY2tcIl19IHRyYWNrIC0gRGVjbGFyZWQgdHJhY2sgdmFsdWUuXG4gKiBAcmV0dXJucyB7aW1wb3J0KFwiLi9zeW5jLWNsaWVudC10eXBlcy5qc1wiKS5TeW5jQ2xpZW50UmVzb3VyY2VDb25maWdbXCJ0cmFja1wiXX0gTm9ybWFsaXplZCB0cmFjayB2YWx1ZS5cbiAqL1xuZnVuY3Rpb24gbm9ybWFsaXplZFRyYWNrKHRyYWNrKSB7XG4gIGlmIChBcnJheS5pc0FycmF5KHRyYWNrKSkgcmV0dXJuIHtvcGVyYXRpb25zOiB0cmFja31cblxuICByZXR1cm4gdHJhY2tcbn1cblxuLyoqXG4gKiBCdWlsZHMgYSBmcmFtZXdvcmstb3duZWQgc3luYyBlbmRwb2ludCBQT1NUZXIgb3ZlciB0aGUgY29uZmlndXJlZCB0cmFuc3BvcnQuXG4gKiBAcGFyYW0ge3twYXRoOiBzdHJpbmcsIHRyYW5zcG9ydDogaW1wb3J0KFwiLi4vY29uZmlndXJhdGlvbi10eXBlcy5qc1wiKS5WZWxvY2lvdXNTeW5jQ2xpZW50VHJhbnNwb3J0fX0gYXJncyAtIFBvc3RlciBhcmdzLlxuICogQHJldHVybnMgeyhwYXlsb2FkOiBSZWNvcmQ8c3RyaW5nLCA/PikgPT4gUHJvbWlzZTw/Pn0gU3luYyBlbmRwb2ludCBQT1NUZXIuXG4gKi9cbmZ1bmN0aW9uIHRyYW5zcG9ydFBvc3Rlcih7cGF0aCwgdHJhbnNwb3J0fSkge1xuICByZXR1cm4gYXN5bmMgKHBheWxvYWQpID0+IHtcbiAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IHRyYW5zcG9ydC5wb3N0KHBhdGgsIHBheWxvYWQpXG5cbiAgICBpZiAoIXJlc3BvbnNlIHx8IHR5cGVvZiByZXNwb25zZS5qc29uICE9PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgc3luYy5jbGllbnQgdHJhbnNwb3J0LnBvc3QgbXVzdCByZXNvbHZlIHRvIGEgcmVzcG9uc2Ugd2l0aCBhIGpzb24oKSBtZXRob2QgZm9yICR7cGF0aH0gKGxpa2UgdGhlIGZyb250ZW5kLW1vZGVsIHdlYnNvY2tldCBjbGllbnQpYClcbiAgICB9XG5cbiAgICByZXR1cm4gYXdhaXQgcmVzcG9uc2UuanNvbigpXG4gIH1cbn1cblxuLyoqXG4gKiBMYXppbHkgYnVpbGRzIChhbmQgbWVtb2l6ZXMgcGVyIGNvbmZpZ3VyYXRpb24pIHRoZSBzeW5jIGNsaWVudCBkZXJpdmVkIGZyb20gdGhlXG4gKiBhcHAncyBWZWxvY2lvdXMgY29uZmlndXJhdGlvbiBhbmQgcmVnaXN0ZXJzIGl0IGFzIHRoZSBjdXJyZW50IHN5bmMgY2xpZW50LlxuICogQHBhcmFtIHtDb25maWd1cmF0aW9ufSBbY29uZmlndXJhdGlvbl0gLSBDb25maWd1cmF0aW9uIG93bmluZyB0aGUgcmVnaXN0ZXJlZCBtb2RlbHMgYW5kIHRoZSBzeW5jLmNsaWVudCBibG9jay4gRGVmYXVsdHMgdG8gdGhlIGN1cnJlbnQgY29uZmlndXJhdGlvbi5cbiAqIEByZXR1cm5zIHtTeW5jQ2xpZW50fSBNZW1vaXplZCBzeW5jIGNsaWVudCBmb3IgdGhlIGNvbmZpZ3VyYXRpb24uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzeW5jQ2xpZW50KGNvbmZpZ3VyYXRpb24gPSBDb25maWd1cmF0aW9uLmN1cnJlbnQoKSkge1xuICBsZXQgY2xpZW50ID0gc3luY0NsaWVudHNCeUNvbmZpZ3VyYXRpb24uZ2V0KGNvbmZpZ3VyYXRpb24pXG5cbiAgaWYgKCFjbGllbnQpIHtcbiAgICBjbGllbnQgPSBTeW5jQ2xpZW50LmZyb21Db25maWd1cmF0aW9uKGNvbmZpZ3VyYXRpb24pXG4gICAgc3luY0NsaWVudHNCeUNvbmZpZ3VyYXRpb24uc2V0KGNvbmZpZ3VyYXRpb24sIGNsaWVudClcbiAgICBjbGllbnQuc2V0Q3VycmVudCgpXG4gIH1cblxuICByZXR1cm4gY2xpZW50XG59XG5cbi8qKlxuICogRGVjbGFyZXMgYSBzeW5jIHNjb3BlIG9uIHRoZSBjdXJyZW50IHN5bmMgY2xpZW50LlxuICogQHBhcmFtIHtpbXBvcnQoXCIuLi9kYXRhYmFzZS9xdWVyeS9tb2RlbC1jbGFzcy1xdWVyeS5qc1wiKS5kZWZhdWx0PD8+fSBxdWVyeSAtIFF1ZXJ5IGRlY2xhcmluZyB0aGUgc3luYyBzY29wZS5cbiAqIEByZXR1cm5zIHtQcm9taXNlPHtzY29wZTogaW1wb3J0KFwiLi9zeW5jLWNsaWVudC10eXBlcy5qc1wiKS5TZXJpYWxpemVkU3luY1Njb3BlLCBwdWxsZWQ6IGltcG9ydChcIi4vc3luYy1hcGktY2xpZW50LXR5cGVzLmpzXCIpLlN5bmNDaGFuZ2VzUmVzdWx0IHwgbnVsbH0+fSBEZWNsYXJlZCBzY29wZSBhbmQgcHVsbCByZXN1bHQuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBzeW5jKHF1ZXJ5KSB7XG4gIHJldHVybiBhd2FpdCBTeW5jQ2xpZW50LmN1cnJlbnQoKS5zeW5jKHF1ZXJ5KVxufVxuIl19
|
|
812
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3luYy1jbGllbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvc3luYy9zeW5jLWNsaWVudC5qcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxZQUFZO0FBRVosT0FBTyxhQUFhLE1BQU0scUJBQXFCLENBQUE7QUFDL0MsT0FBTyxFQUFDLG1CQUFtQixFQUFDLE1BQU0sNkJBQTZCLENBQUE7QUFDL0QsT0FBTyxNQUFNLE1BQU0sY0FBYyxDQUFBO0FBQ2pDLE9BQU8sYUFBYSxNQUFNLDZCQUE2QixDQUFBO0FBQ3ZELE9BQU8sd0JBQXdCLE1BQU0sb0NBQW9DLENBQUE7QUFFekUsT0FBTyxFQUFDLHdCQUF3QixFQUFDLE1BQU0sa0JBQWtCLENBQUE7QUFDekQsT0FBTyxhQUFhLE1BQU0sc0JBQXNCLENBQUE7QUFDaEQsT0FBTyxrQkFBa0IsTUFBTSwyQkFBMkIsQ0FBQTtBQUMxRCxPQUFPLGNBQWMsTUFBTSx1QkFBdUIsQ0FBQTtBQUNsRCxPQUFPLEVBQUMsaUJBQWlCLEVBQUUsb0JBQW9CLEVBQUMsTUFBTSwyQkFBMkIsQ0FBQTtBQUVqRixJQUFJLGFBQWEsR0FBRyxDQUFDLENBQUE7QUFFckIsc0ZBQXNGO0FBQ3RGLE1BQU0sc0JBQXNCLEdBQUcsRUFBQyxNQUFNLEVBQUUsYUFBYSxFQUFFLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxFQUFFLGFBQWEsRUFBQyxDQUFBO0FBRXRHOzs7OztvREFLb0Q7QUFDcEQsTUFBTSwwQkFBMEIsR0FBRyxDQUFDLFFBQVEsRUFBRSxRQUFRLENBQUMsQ0FBQTtBQUV2RCxrR0FBa0c7QUFDbEcsTUFBTSxpQ0FBaUMsR0FBRyxDQUFDLFdBQVcsRUFBRSxXQUFXLEVBQUUsa0JBQWtCLENBQUMsQ0FBQTtBQUV4RixpREFBaUQ7QUFDakQsTUFBTSwwQkFBMEIsR0FBRyxJQUFJLE9BQU8sRUFBRSxDQUFBO0FBRWhEOzs7Ozs7Ozs7OztHQVdHO0FBQ0gsTUFBTSxDQUFDLE9BQU8sT0FBTyxV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QyxNQUFNLEVBQUUsQ0FBQztRQUNaLE1BQU0sR0FBRyxVQUFVLENBQUMsaUJBQWlCLENBQUMsYUFBYSxDQUFDLENBQUE7UUFDcEQsMEJBQTBCLENBQUMsR0FBRyxDQUFDLGFBQWEsRUFBRSxNQUFNLENBQUMsQ0FBQTtRQUNyRCxNQUFNLENBQUMsVUFBVSxFQUFFLENBQUE7SUFDckIsQ0FBQztJQUVELE9BQU8sTUFBTSxDQUFBO0FBQ2YsQ0FBQztBQUVEOzs7O0dBSUc7QUFDSCxNQUFNLENBQUMsS0FBSyxVQUFVLElBQUksQ0FBQyxLQUFLO0lBQzlCLE9BQU8sTUFBTSxVQUFVLENBQUMsT0FBTyxFQUFFLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFBO0FBQy9DLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBAdHMtY2hlY2tcblxuaW1wb3J0IENvbmZpZ3VyYXRpb24gZnJvbSBcIi4uL2NvbmZpZ3VyYXRpb24uanNcIlxuaW1wb3J0IHtpc0Jvb2xlYW5Db2x1bW5UeXBlfSBmcm9tIFwiLi4vZGF0YWJhc2UvY29sdW1uLXR5cGVzLmpzXCJcbmltcG9ydCBMb2dnZXIgZnJvbSBcIi4uL2xvZ2dlci5qc1wiXG5pbXBvcnQgcmVzdEFyZ3NFcnJvciBmcm9tIFwiLi4vdXRpbHMvcmVzdC1hcmdzLWVycm9yLmpzXCJcbmltcG9ydCBWZWxvY2lvdXNXZWJzb2NrZXRDbGllbnQgZnJvbSBcIi4uL2h0dHAtY2xpZW50L3dlYnNvY2tldC1jbGllbnQuanNcIlxuXG5pbXBvcnQge3NlcmlhbGl6ZWRTY29wZUZyb21RdWVyeX0gZnJvbSBcIi4vcXVlcnktc2NvcGUuanNcIlxuaW1wb3J0IFN5bmNBcGlDbGllbnQgZnJvbSBcIi4vc3luYy1hcGktY2xpZW50LmpzXCJcbmltcG9ydCBTeW5jUmVhbHRpbWVCcmlkZ2UgZnJvbSBcIi4vc3luYy1yZWFsdGltZS1icmlkZ2UuanNcIlxuaW1wb3J0IFN5bmNTY29wZVN0b3JlIGZyb20gXCIuL3N5bmMtc2NvcGUtc3RvcmUuanNcIlxuaW1wb3J0IHtjdXJyZW50U3luY0NsaWVudCwgc2V0Q3VycmVudFN5bmNDbGllbnR9IGZyb20gXCIuL3N5bmMtY2xpZW50LXJlZ2lzdHJ5LmpzXCJcblxubGV0IGNsaWVudENvdW50ZXIgPSAwXG5cbi8qKiBAdHlwZSB7e2NyZWF0ZTogXCJhZnRlckNyZWF0ZVwiLCB1cGRhdGU6IFwiYWZ0ZXJVcGRhdGVcIiwgZGVzdHJveTogXCJhZnRlckRlc3Ryb3lcIn19ICovXG5jb25zdCBUUkFDS0VEX0NBTExCQUNLX05BTUVTID0ge2NyZWF0ZTogXCJhZnRlckNyZWF0ZVwiLCBkZXN0cm95OiBcImFmdGVyRGVzdHJveVwiLCB1cGRhdGU6IFwiYWZ0ZXJVcGRhdGVcIn1cblxuLyoqXG4gKiBPcGVyYXRpb25zIHRyYWNrZWQgYnkgZGVmYXVsdCBmb3IgbW9kZWxzIGRlY2xhcmluZyBgc3RhdGljIHN5bmNgIHdpdGhvdXQgYVxuICogYHRyYWNrYCBrZXk6IGxvY2FsIGNyZWF0ZXMgYW5kIHVwZGF0ZXMgcXVldWUgYXV0b21hdGljYWxseS4gRGVzdHJveXMgYXJlIG5vdFxuICogdHJhY2tlZCBieSBkZWZhdWx0IGJlY2F1c2UgYSBsb2NhbCBkZXN0cm95IGlzIG9mdGVuIGNhY2hlIGV2aWN0aW9uIHJhdGhlclxuICogdGhhbiBhIHNlcnZlciBkZWxldGU7IG9wdCBpbiB3aXRoIGB0cmFjazogdHJ1ZWAgb3IgYW4gb3BlcmF0aW9ucyBsaXN0LlxuICogQHR5cGUge0FycmF5PFwiY3JlYXRlXCIgfCBcInVwZGF0ZVwiIHwgXCJkZXN0cm95XCI+fSAqL1xuY29uc3QgREVGQVVMVF9UUkFDS0VEX09QRVJBVElPTlMgPSBbXCJjcmVhdGVcIiwgXCJ1cGRhdGVcIl1cblxuLyoqIEF0dHJpYnV0ZSBuYW1lcyB0cmVhdGVkIGFzIGNsaWVudC1sb2NhbCBzeW5jIGJvb2trZWVwaW5nIHdoZW4gZGVyaXZpbmcgbG9jYWxPbmx5QXR0cmlidXRlcy4gKi9cbmNvbnN0IExPQ0FMX0JPT0tLRUVQSU5HX0FUVFJJQlVURV9OQU1FUyA9IFtcImNyZWF0ZWRBdFwiLCBcInVwZGF0ZWRBdFwiLCBcImxhc3RTeW5jQ2hhbmdlQXRcIl1cblxuLyoqIEB0eXBlIHtXZWFrTWFwPENvbmZpZ3VyYXRpb24sIFN5bmNDbGllbnQ+fSAqL1xuY29uc3Qgc3luY0NsaWVudHNCeUNvbmZpZ3VyYXRpb24gPSBuZXcgV2Vha01hcCgpXG5cbi8qKlxuICogRGVjbGFyYXRpdmUgY2xpZW50LXNpZGUgc3luYyBkcml2ZXIuXG4gKlxuICogRXZlcnl0aGluZyBpcyBkZXJpdmVkIGZyb20gdGhlIGFwcCdzIFZlbG9jaW91cyBjb25maWd1cmF0aW9uOiBtb2RlbHMgZGVjbGFyZVxuICogYHN0YXRpYyBzeW5jYCwgdHJhbnNwb3J0L2F1dGgvY29ubmVjdGl2aXR5IGNvbWUgZnJvbSB0aGUgYHN5bmMuY2xpZW50YFxuICogY29uZmlndXJhdGlvbiBibG9jaywgYW5kIFZlbG9jaW91cyBvd25zIHNjb3BlIHBlcnNpc3RlbmNlLCBwZXItc2NvcGUgY3Vyc29ycyxcbiAqIHB1bGwgcGFnaW5nL2FwcGx5LCBsb2NhbCBxdWV1ZWluZywgYW5kIG9ubGluZS1nYXRlZCByZXBsYXkuIERlY2xhcmUgc3luY1xuICogaW50ZXJlc3QgZnJvbSBxdWVyaWVzOlxuICpcbiAqICAgICBhd2FpdCBzeW5jQ2xpZW50KCkuc3RhcnQoKVxuICogICAgIGF3YWl0IHN5bmNDbGllbnQoKS5zeW5jKEV2ZW50LndoZXJlKHtwYXJ0bmVySWR9KSlcbiAqL1xuZXhwb3J0IGRlZmF1bHQgY2xhc3MgU3luY0NsaWVudCB7XG4gIC8qKlxuICAgKiBCdWlsZHMgdGhlIHN5bmMgY2xpZW50IGJ5IGRlcml2aW5nIGV2ZXJ5dGhpbmcgZnJvbSB0aGUgYXBwJ3MgVmVsb2Npb3VzXG4gICAqIGNvbmZpZ3VyYXRpb246IGV2ZXJ5IHJlZ2lzdGVyZWQgbW9kZWwgZGVjbGFyaW5nIGBzdGF0aWMgc3luY2AgYmVjb21lcyBhXG4gICAqIHJlc291cmNlIHdpdGggYm9vbGVhbkF0dHJpYnV0ZXMgZGVyaXZlZCBmcm9tIGNvbHVtbiB0eXBlcyBhbmRcbiAgICogbG9jYWxPbmx5QXR0cmlidXRlcyBkZXJpdmVkIGZyb20gdGhlIHByaW1hcnkga2V5LCBjcmVhdGVkQXQvdXBkYXRlZEF0LCBhbmRcbiAgICogc3luYyBib29ra2VlcGluZyBjb2x1bW5zOyB0aGUgcGVuZGluZy1zeW5jIG1vZGVsIGlzIHRoZSByZWdpc3RlcmVkIFwiU3luY1wiXG4gICAqIG1vZGVsOyB0cmFuc3BvcnQsIGF1dGgsIGNvbm5lY3Rpdml0eSwgYW5kIGVycm9yIHJlcG9ydGluZyBjb21lIGZyb20gdGhlXG4gICAqIGBzeW5jLmNsaWVudGAgY29uZmlndXJhdGlvbiBibG9jaywgd2l0aCB0aGUgZnJhbWV3b3JrIG93bmluZyB0aGVcbiAgICogYCR7bW91bnRQYXRofS9jaGFuZ2VzYCBhbmQgYCR7bW91bnRQYXRofS9yZXBsYXlgIFBPU1RlcnMuXG4gICAqIEBwYXJhbSB7aW1wb3J0KFwiLi9zeW5jLWNsaWVudC10eXBlcy5qc1wiKS5TeW5jQ2xpZW50T3B0aW9uc30gW29wdGlvbnNdIC0gT3B0aW9uYWwgb3ZlcnJpZGVzLlxuICAgKi9cbiAgY29uc3RydWN0b3Iob3B0aW9ucyA9IHt9KSB7XG4gICAgY29uc3Qge2NvbmZpZ3VyYXRpb24gPSBDb25maWd1cmF0aW9uLmN1cnJlbnQoKSwgbGVnYWN5Q3Vyc29yLCBzY29wZVN0b3JlLCBzeW5jTW9kZWwsIC4uLnJlc3RPcHRpb25zfSA9IG9wdGlvbnNcblxuICAgIHJlc3RBcmdzRXJyb3IocmVzdE9wdGlvbnMpXG5cbiAgICBjb25zdCBjbGllbnRDb25maWd1cmF0aW9uID0gY29uZmlndXJhdGlvbi5nZXRTeW5jQ29uZmlndXJhdGlvbigpLmNsaWVudFxuXG4gICAgaWYgKCFjbGllbnRDb25maWd1cmF0aW9uKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJTeW5jQ2xpZW50IHJlcXVpcmVzIGEgc3luYy5jbGllbnQgY29uZmlndXJhdGlvbiBibG9jazogbmV3IENvbmZpZ3VyYXRpb24oe3N5bmM6IHtjbGllbnQ6IHthdXRoZW50aWNhdGlvblRva2VuLCB0cmFuc3BvcnR9fX0pXCIpXG4gICAgfVxuXG4gICAgY29uc3QgbW9kZWxDbGFzc2VzID0gY29uZmlndXJhdGlvbi5nZXRNb2RlbENsYXNzZXMoKVxuICAgIC8qKiBAdHlwZSB7UmVjb3JkPHN0cmluZywgaW1wb3J0KFwiLi9zeW5jLWNsaWVudC10eXBlcy5qc1wiKS5TeW5jQ2xpZW50UmVzb3VyY2VDb25maWc+fSAqL1xuICAgIGNvbnN0IHJlc291cmNlcyA9IHt9XG5cbiAgICBmb3IgKGNvbnN0IG1vZGVsQ2xhc3Mgb2YgT2JqZWN0LnZhbHVlcyhtb2RlbENsYXNzZXMpKSB7XG4gICAgICBpZiAoIW1vZGVsQ2xhc3Muc3luYykgY29udGludWVcblxuICAgICAgY29uc3QgcmVzb3VyY2VUeXBlID0gbW9kZWxDbGFzcy5nZXRNb2RlbE5hbWUoKVxuXG4gICAgICByZXNvdXJjZXNbcmVzb3VyY2VUeXBlXSA9IHJlc291cmNlQ29uZmlnRnJvbVN5bmNEZWNsYXJhdGlvbih7ZGVjbGFyYXRpb246IG1vZGVsQ2xhc3Muc3luYywgbW9kZWxDbGFzcywgcmVzb3VyY2VUeXBlfSlcbiAgICB9XG5cbiAgICBpZiAoT2JqZWN0LmtleXMocmVzb3VyY2VzKS5sZW5ndGggPT09IDApIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIlN5bmNDbGllbnQgZm91bmQgbm8gcmVnaXN0ZXJlZCBtb2RlbHMgZGVjbGFyaW5nIHN0YXRpYyBzeW5jIC0gZGVjbGFyZSBgc3RhdGljIHN5bmMgPSB0cnVlYCAob3IgYSBzeW5jIGRlY2xhcmF0aW9uIG9iamVjdCkgb24gdGhlIG1vZGVscyB0aGF0IHNob3VsZCBzeW5jXCIpXG4gICAgfVxuXG4gICAgY29uc3QgcmVzb2x2ZWRTeW5jTW9kZWwgPSBzeW5jTW9kZWwgfHwgbW9kZWxDbGFzc2VzLlN5bmNcblxuICAgIGlmICghcmVzb2x2ZWRTeW5jTW9kZWwpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIlN5bmNDbGllbnQgcmVxdWlyZXMgYSByZWdpc3RlcmVkIFxcXCJTeW5jXFxcIiBtb2RlbCBmb3IgcGVuZGluZyBsb2NhbCBzeW5jIHJvd3MgKG9yIHBhc3Mgb3B0aW9ucy5zeW5jTW9kZWwpXCIpXG4gICAgfVxuXG4gICAgLyoqIEB0eXBlIHtpbXBvcnQoXCIuL3N5bmMtY2xpZW50LXR5cGVzLmpzXCIpLlN5bmNDbGllbnRDb25maWd9ICovXG4gICAgdGhpcy5jb25maWcgPSB7XG4gICAgICBhdXRoZW50aWNhdGlvblRva2VuOiBjbGllbnRDb25maWd1cmF0aW9uLmF1dGhlbnRpY2F0aW9uVG9rZW4sXG4gICAgICBiYXRjaFNpemU6IGNsaWVudENvbmZpZ3VyYXRpb24uYmF0Y2hTaXplLFxuICAgICAgY29uZmlndXJhdGlvbixcbiAgICAgIGlzT25saW5lOiBjbGllbnRDb25maWd1cmF0aW9uLmlzT25saW5lLFxuICAgICAgbGVnYWN5Q3Vyc29yLFxuICAgICAgb25FcnJvcjogY2xpZW50Q29uZmlndXJhdGlvbi5vbkVycm9yLFxuICAgICAgcG9zdENoYW5nZXM6IHRyYW5zcG9ydFBvc3Rlcih7cGF0aDogYCR7Y2xpZW50Q29uZmlndXJhdGlvbi5tb3VudFBhdGh9L2NoYW5nZXNgLCB0cmFuc3BvcnQ6IGNsaWVudENvbmZpZ3VyYXRpb24udHJhbnNwb3J0fSksXG4gICAgICBwb3N0UmVwbGF5OiB0cmFuc3BvcnRQb3N0ZXIoe3BhdGg6IGAke2NsaWVudENvbmZpZ3VyYXRpb24ubW91bnRQYXRofS9yZXBsYXlgLCB0cmFuc3BvcnQ6IGNsaWVudENvbmZpZ3VyYXRpb24udHJhbnNwb3J0fSksXG4gICAgICByZWFsdGltZTogY2xpZW50Q29uZmlndXJhdGlvbi5yZWFsdGltZSxcbiAgICAgIHJlc291cmNlcyxcbiAgICAgIHN5bmNNb2RlbDogcmVzb2x2ZWRTeW5jTW9kZWwsXG4gICAgICB3ZWJzb2NrZXRDbGllbnQ6IGNsaWVudENvbmZpZ3VyYXRpb24ud2Vic29ja2V0Q2xpZW50LFxuICAgICAgd2Vic29ja2V0VXJsOiBjbGllbnRDb25maWd1cmF0aW9uLndlYnNvY2tldFVybFxuICAgIH1cbiAgICB0aGlzLl9jbGllbnROdW1iZXIgPSArK2NsaWVudENvdW50ZXJcbiAgICAvKiogQHR5cGUge1N5bmNSZWFsdGltZUJyaWRnZSB8IG51bGx9ICovXG4gICAgdGhpcy5fcmVhbHRpbWVCcmlkZ2UgPSBudWxsXG4gICAgLyoqIEB0eXBlIHtpbXBvcnQoXCIuL3N5bmMtY2xpZW50LXR5cGVzLmpzXCIpLlN5bmNDbGllbnRTaGFyZWRDb25uZWN0aW9uIHwgbnVsbCB8IHVuZGVmaW5lZH0gU2hhcmVkIGFwcC1saWZldGltZSB3ZWJzb2NrZXQgY29ubmVjdGlvbiAodW5kZWZpbmVkIHVudGlsIGZpcnN0IHJlc29sdmVkLCBudWxsIHdoZW4gbm9uZSBpcyBjb25maWd1cmVkKS4gKi9cbiAgICB0aGlzLl9zeW5jQ29ubmVjdGlvbiA9IHVuZGVmaW5lZFxuICAgIC8qKiBAdHlwZSB7UHJvbWlzZTx2b2lkPiB8IG51bGx9ICovXG4gICAgdGhpcy5fc3Vic2NyaWJlVXNlclNjb3BlUHJvbWlzZSA9IG51bGxcbiAgICAvKiogQHR5cGUge1wic3Vic2NyaWJlZFwiIHwgXCJzdWJzY3JpYmluZ1wiIHwgXCJ1bnN1YnNjcmliZWRcIn0gKi9cbiAgICB0aGlzLl91c2VyU2NvcGVTdGF0ZSA9IFwidW5zdWJzY3JpYmVkXCJcbiAgICAvKiogQHR5cGUge2ltcG9ydChcIi4vc3luYy1zY29wZS1zdG9yZS5qc1wiKS5kZWZhdWx0IHwgbnVsbH0gKi9cbiAgICB0aGlzLl9zY29wZVN0b3JlID0gc2NvcGVTdG9yZSB8fCBudWxsXG4gICAgLyoqIEB0eXBlIHtQcm9taXNlPHZvaWQ+IHwgbnVsbH0gKi9cbiAgICB0aGlzLl9zY2hlZHVsZWRSZXBsYXkgPSBudWxsXG4gICAgLyoqIEB0eXBlIHtSZWNvcmQ8c3RyaW5nLCBpbXBvcnQoXCIuL3N5bmMtYXBpLWNsaWVudC10eXBlcy5qc1wiKS5TeW5jUmVzb3VyY2VDb25maWc+IHwgbnVsbH0gKi9cbiAgICB0aGlzLl9wdWxsUmVzb3VyY2VDb25maWdzID0gbnVsbFxuICAgIC8qKiBAdHlwZSB7QXJyYXk8e2NhbGxiYWNrOiAocmVjb3JkOiA/KSA9PiBQcm9taXNlPHZvaWQ+LCBjYWxsYmFja05hbWU6IFwiYWZ0ZXJDcmVhdGVcIiB8IFwiYWZ0ZXJVcGRhdGVcIiB8IFwiYWZ0ZXJEZXN0cm95XCIsIG1vZGVsQ2xhc3M6ID99Pn0gKi9cbiAgICB0aGlzLl90cmFja2VkQ2FsbGJhY2tzID0gW11cbiAgICAvKiogQHR5cGUge1dlYWtTZXQ8b2JqZWN0Pn0gKi9cbiAgICB0aGlzLl9yZW1vdGVBcHBseVJlY29yZHMgPSBuZXcgV2Vha1NldCgpXG4gICAgdGhpcy5fd2l0aG91dFRyYWNraW5nRGVwdGggPSAwXG4gICAgLyoqIEB0eXBlIHtMb2dnZXIgfCB7ZXJyb3I6ICguLi5tZXNzYWdlczogQXJyYXk8Pz4pID0+IFByb21pc2U8dm9pZD59IHwgbnVsbH0gKi9cbiAgICB0aGlzLl9sb2dnZXIgPSBudWxsXG4gICAgdGhpcy5fc3RhcnRlZCA9IGZhbHNlXG4gIH1cblxuICAvKipcbiAgICogUmVnaXN0ZXJzIGF1dG9tYXRpYyBtdXRhdGlvbiB0cmFja2luZyBmb3IgZXZlcnkgZGVjbGFyZWQgcmVzb3VyY2UgKG9uIGJ5XG4gICAqIGRlZmF1bHQ6IGxvY2FsIGNyZWF0ZXMgYW5kIHVwZGF0ZXMgcXVldWUgcGVuZGluZyBzeW5jIHJvd3Mgb25jZSB0aGVpclxuICAgKiB0cmFuc2FjdGlvbiBjb21taXRzIGFuZCBzY2hlZHVsZSBhbiBpbW1lZGlhdGUgcmVwbGF5IGF0dGVtcHQsIHdpdGhvdXRcbiAgICogYXBwLXNpZGUgcXVldWUgY2FsbHMpLiBgdHJhY2s6IGZhbHNlYCByZXNvdXJjZXMgYXJlIHNraXBwZWQ7IGB0cmFjazogdHJ1ZWBcbiAgICogYWRkcyBkZXN0cm95czsgYW4gb3BlcmF0aW9ucyBsaXN0IG5hcnJvd3MgdGhlIHRyYWNrZWQgb3BlcmF0aW9ucy5cbiAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59XG4gICAqL1xuICBhc3luYyBzdGFydCgpIHtcbiAgICBpZiAodGhpcy5fc3RhcnRlZCkgcmV0dXJuXG5cbiAgICB0aGlzLl9zdGFydGVkID0gdHJ1ZVxuXG4gICAgZm9yIChjb25zdCBbcmVzb3VyY2VUeXBlLCByZXNvdXJjZUNvbmZpZ10gb2YgT2JqZWN0LmVudHJpZXModGhpcy5jb25maWcucmVzb3VyY2VzKSkge1xuICAgICAgY29uc3Qgb3BlcmF0aW9ucyA9IHRoaXMudHJhY2tlZE9wZXJhdGlvbnMoe3Jlc291cmNlQ29uZmlnLCByZXNvdXJjZVR5cGV9KVxuXG4gICAgICBmb3IgKGNvbnN0IG9wZXJhdGlvbiBvZiBvcGVyYXRpb25zKSB7XG4gICAgICAgIGNvbnN0IGNhbGxiYWNrTmFtZSA9IFRSQUNLRURfQ0FMTEJBQ0tfTkFNRVNbb3BlcmF0aW9uXVxuICAgICAgICBjb25zdCBjYWxsYmFjayA9IHRoaXMudHJhY2tlZE11dGF0aW9uQ2FsbGJhY2soe29wZXJhdGlvbiwgcmVzb3VyY2VDb25maWd9KVxuXG4gICAgICAgIHJlc291cmNlQ29uZmlnLm1vZGVsQ2xhc3NbY2FsbGJhY2tOYW1lXShjYWxsYmFjaylcbiAgICAgICAgdGhpcy5fdHJhY2tlZENhbGxiYWNrcy5wdXNoKHtjYWxsYmFjaywgY2FsbGJhY2tOYW1lLCBtb2RlbENsYXNzOiByZXNvdXJjZUNvbmZpZy5tb2RlbENsYXNzfSlcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogVW5yZWdpc3RlcnMgYWxsIHRyYWNraW5nIGNhbGxiYWNrcyAodGVzdHMsIHNpZ24tb3V0LCBob3QgcmVsb2FkKS5cbiAgICogQHJldHVybnMge3ZvaWR9XG4gICAqL1xuICBzdG9wKCkge1xuICAgIGZvciAoY29uc3Qge2NhbGxiYWNrLCBjYWxsYmFja05hbWUsIG1vZGVsQ2xhc3N9IG9mIHRoaXMuX3RyYWNrZWRDYWxsYmFja3MpIHtcbiAgICAgIG1vZGVsQ2xhc3MudW5yZWdpc3RlckxpZmVjeWNsZUNhbGxiYWNrKGNhbGxiYWNrTmFtZSwgY2FsbGJhY2spXG4gICAgfVxuXG4gICAgdGhpcy5fdHJhY2tlZENhbGxiYWNrcyA9IFtdXG4gICAgdGhpcy5fc3RhcnRlZCA9IGZhbHNlXG4gIH1cblxuICAvKipcbiAgICogUmVzb2x2ZXMgYW5kIHZhbGlkYXRlcyB0aGUgdHJhY2tlZCBvcGVyYXRpb25zIGZvciBhIHJlc291cmNlIGNvbmZpZy5cbiAgICogVHJhY2tpbmcgaXMgb24gYnkgZGVmYXVsdDogbW9kZWxzIGRlY2xhcmluZyBgc3RhdGljIHN5bmNgIHdpdGhvdXQgYSBgdHJhY2tgXG4gICAqIGtleSBxdWV1ZSBsb2NhbCBjcmVhdGVzIGFuZCB1cGRhdGVzIGF1dG9tYXRpY2FsbHk7IGB0cmFjazogZmFsc2VgIG9wdHMgYVxuICAgKiBtb2RlbCBvdXQgKGZvciBtb2RlbHMgd3JpdHRlbiBieSBub24tdXNlciBmbG93cykuXG4gICAqIEBwYXJhbSB7e3Jlc291cmNlQ29uZmlnOiBpbXBvcnQoXCIuL3N5bmMtY2xpZW50LXR5cGVzLmpzXCIpLlN5bmNDbGllbnRSZXNvdXJjZUNvbmZpZywgcmVzb3VyY2VUeXBlOiBzdHJpbmd9fSBhcmdzIC0gUmVzb3VyY2UgY29uZmlnIGFuZCBuYW1lLlxuICAgKiBAcmV0dXJucyB7QXJyYXk8XCJjcmVhdGVcIiB8IFwidXBkYXRlXCIgfCBcImRlc3Ryb3lcIj59IFRyYWNrZWQgb3BlcmF0aW9ucy5cbiAgICovXG4gIHRyYWNrZWRPcGVyYXRpb25zKHtyZXNvdXJjZUNvbmZpZywgcmVzb3VyY2VUeXBlfSkge1xuICAgIGNvbnN0IHRyYWNrID0gcmVzb3VyY2VDb25maWcudHJhY2tcblxuICAgIGlmICh0cmFjayA9PT0gZmFsc2UpIHJldHVybiBbXVxuICAgIGlmICh0cmFjayA9PT0gdW5kZWZpbmVkKSByZXR1cm4gREVGQVVMVF9UUkFDS0VEX09QRVJBVElPTlNcbiAgICBpZiAodHJhY2sgPT09IHRydWUpIHJldHVybiBbXCJjcmVhdGVcIiwgXCJ1cGRhdGVcIiwgXCJkZXN0cm95XCJdXG5cbiAgICBpZiAoIXRyYWNrIHx8IHR5cGVvZiB0cmFjayAhPT0gXCJvYmplY3RcIiB8fCAhQXJyYXkuaXNBcnJheSh0cmFjay5vcGVyYXRpb25zKSB8fCB0cmFjay5vcGVyYXRpb25zLmxlbmd0aCA9PT0gMCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBTeW5jQ2xpZW50IHJlc291cmNlICR7cmVzb3VyY2VUeXBlfSB0cmFjayBtdXN0IGJlIHRydWUgb3Ige29wZXJhdGlvbnM6IFsuLi5dfWApXG4gICAgfVxuXG4gICAgZm9yIChjb25zdCBvcGVyYXRpb24gb2YgdHJhY2sub3BlcmF0aW9ucykge1xuICAgICAgaWYgKCEob3BlcmF0aW9uIGluIFRSQUNLRURfQ0FMTEJBQ0tfTkFNRVMpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgU3luY0NsaWVudCByZXNvdXJjZSAke3Jlc291cmNlVHlwZX0gdHJhY2sub3BlcmF0aW9ucyBtdXN0IGJlIGNyZWF0ZS91cGRhdGUvZGVzdHJveSwgZ290OiAke1N0cmluZyhvcGVyYXRpb24pfWApXG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHRyYWNrLm9wZXJhdGlvbnNcbiAgfVxuXG4gIC8qKlxuICAgKiBCdWlsZHMgdGhlIGxpZmVjeWNsZSBjYWxsYmFjayBxdWV1ZWluZyBvbmUgdHJhY2tlZCBtdXRhdGlvbi4gVGhlIHF1ZXVlZFxuICAgKiBwYXlsb2FkIGFuZCBzeW5jIHR5cGUgYXJlIHNuYXBzaG90dGVkIGF0IG11dGF0aW9uLWNhbGxiYWNrIHRpbWUsIHNvXG4gICAqIGFmdGVyU2F2ZSBob29rcyBhc3NpZ25pbmcgdW5zYXZlZCBhdHRyaWJ1dGVzIChvciBhbnkgbGF0ZXIgZHJpZnQgb24gdGhlXG4gICAqIHJlY29yZCkgY2Fubm90IGNoYW5nZSB3aGF0IGdldHMgcXVldWVkIHZzIHdoYXQgd2FzIGNvbW1pdHRlZC4gUXVldWVpbmcgaXNcbiAgICogZGVmZXJyZWQgdGhyb3VnaCB0aGUgbW9kZWwgY29ubmVjdGlvbidzIGFmdGVyQ29tbWl0IGhvb2sgc28gaXQgb25seSBydW5zXG4gICAqIG9uY2UgdGhlIG11dGF0aW9uJ3MgdHJhbnNhY3Rpb24gaGFzIGNvbW1pdHRlZCAoaW1tZWRpYXRlbHkgd2hlbiBub1xuICAgKiB0cmFuc2FjdGlvbiBpcyBvcGVuKSAtIHF1ZXVlZCBzeW5jcyBuZXZlciByZWZlcmVuY2Ugcm9sbGVkLWJhY2sgcm93cy5cbiAgICogUG9zdC1jb21taXQgcXVldWUgZmFpbHVyZXMgYXJlIHJlcG9ydGVkIHdpdGhvdXQgcmV0aHJvd2luZyBpbnRvIHRoZVxuICAgKiBkcml2ZXIncyBhZnRlckNvbW1pdCBjaGFpbiAoc2VlIHJlcG9ydEFmdGVyQ29tbWl0RXJyb3IpLlxuICAgKiBAcGFyYW0ge3tvcGVyYXRpb246IFwiY3JlYXRlXCIgfCBcInVwZGF0ZVwiIHwgXCJkZXN0cm95XCIsIHJlc291cmNlQ29uZmlnOiBpbXBvcnQoXCIuL3N5bmMtY2xpZW50LXR5cGVzLmpzXCIpLlN5bmNDbGllbnRSZXNvdXJjZUNvbmZpZ319IGFyZ3MgLSBPcGVyYXRpb24gYW5kIHJlc291cmNlIGNvbmZpZy5cbiAgICogQHJldHVybnMgeyhyZWNvcmQ6ID8pID0+IFByb21pc2U8dm9pZD59IExpZmVjeWNsZSBjYWxsYmFjay5cbiAgICovXG4gIHRyYWNrZWRNdXRhdGlvbkNhbGxiYWNrKHtvcGVyYXRpb24sIHJlc291cmNlQ29uZmlnfSkge1xuICAgIHJldHVybiBhc3luYyAocmVjb3JkKSA9PiB7XG4gICAgICBpZiAodGhpcy5pc1RyYWNraW5nU3VwcHJlc3NlZChyZWNvcmQpKSByZXR1cm5cblxuICAgICAgY29uc3QgZGF0YSA9IFN5bmNBcGlDbGllbnQucXVldWVkU3luY0RhdGEoe1xuICAgICAgICBib29sZWFuQXR0cmlidXRlczogcmVzb3VyY2VDb25maWcuYm9vbGVhbkF0dHJpYnV0ZXMgfHwgW10sXG4gICAgICAgIGRhdGE6IHJlc291cmNlQ29uZmlnLnRyYWNrZWREYXRhID8gcmVzb3VyY2VDb25maWcudHJhY2tlZERhdGEoe29wZXJhdGlvbiwgcmVjb3JkfSkgOiB1bmRlZmluZWQsXG4gICAgICAgIGxvY2FsT25seUF0dHJpYnV0ZXM6IHJlc291cmNlQ29uZmlnLmxvY2FsT25seUF0dHJpYnV0ZXMgfHwgW10sXG4gICAgICAgIHJlc291cmNlOiByZWNvcmRcbiAgICAgIH0pXG4gICAgICBjb25zdCBzeW5jVHlwZSA9IHRoaXMuZGVmYXVsdFN5bmNUeXBlKHtvcGVyYXRpb24sIHJlY29yZCwgcmVzb3VyY2VDb25maWd9KVxuXG4gICAgICBhd2FpdCByZXNvdXJjZUNvbmZpZy5tb2RlbENsYXNzLmNvbm5lY3Rpb24oKS5hZnRlckNvbW1pdChhc3luYyAoKSA9PiB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgYXdhaXQgU3luY0FwaUNsaWVudC5xdWV1ZUxvY2FsU3luYyh7XG4gICAgICAgICAgICBkYXRhLFxuICAgICAgICAgICAgcmVzb3VyY2U6IHJlY29yZCxcbiAgICAgICAgICAgIHN5bmNNb2RlbDogdGhpcy5jb25maWcuc3luY01vZGVsLFxuICAgICAgICAgICAgc3luY1R5cGVcbiAgICAgICAgICB9KVxuICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgIGF3YWl0IHRoaXMucmVwb3J0QWZ0ZXJDb21taXRFcnJvcigvKiogQHR5cGUge0Vycm9yfSAqLyAoZXJyb3IpKVxuXG4gICAgICAgICAgcmV0dXJuXG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLnNjaGVkdWxlUmVwbGF5KClcbiAgICAgIH0pXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJlcG9ydHMgYSBwb3N0LWNvbW1pdCB0cmFja2VkLXF1ZXVlaW5nIGZhaWx1cmUuIFRoZSB0cmFuc2FjdGlvbiBoYXMgYWxyZWFkeVxuICAgKiBjb21taXR0ZWQgd2hlbiBhZnRlckNvbW1pdCBjYWxsYmFja3MgcnVuLCBzbyByZXRocm93aW5nIGhlcmUgd291bGQgcG9pc29uXG4gICAqIHRoZSBkcml2ZXIncyBhd2FpdGVkIGFmdGVyQ29tbWl0IGNoYWluIChicmVha2luZyB1bnJlbGF0ZWQgY2FsbGJhY2tzKSAtXG4gICAqIGluc3RlYWQgdGhlIGZhaWx1cmUgZ29lcyB0byB0aGUgY29uZmlndXJlZCBzeW5jLmNsaWVudC5vbkVycm9yIGhvb2ssIG9yIGlzXG4gICAqIGxvZ2dlZCBsb3VkbHkgdGhyb3VnaCB0aGUgY2xpZW50J3MgbG9nZ2VyIHdoZW4gbm9uZSBpcyBjb25maWd1cmVkLlxuICAgKiBAcGFyYW0ge0Vycm9yfSBlcnJvciAtIFBvc3QtY29tbWl0IHF1ZXVlaW5nIGZhaWx1cmUuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fVxuICAgKi9cbiAgYXN5bmMgcmVwb3J0QWZ0ZXJDb21taXRFcnJvcihlcnJvcikge1xuICAgIGlmICh0aGlzLmNvbmZpZy5vbkVycm9yKSB7XG4gICAgICB0aGlzLmNvbmZpZy5vbkVycm9yKGVycm9yKVxuXG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBhd2FpdCB0aGlzLmxvZ2dlcigpLmVycm9yKFwiU3luY0NsaWVudCBmYWlsZWQgdG8gcXVldWUgYSB0cmFja2VkIG11dGF0aW9uIGFmdGVyIGNvbW1pdFwiLCBlcnJvcilcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBsYXppbHkgYnVpbHQgY2xpZW50IGxvZ2dlci5cbiAgICogQHJldHVybnMge0xvZ2dlciB8IHtlcnJvcjogKC4uLm1lc3NhZ2VzOiBBcnJheTw/PikgPT4gUHJvbWlzZTx2b2lkPn19IENsaWVudCBsb2dnZXIuXG4gICAqL1xuICBsb2dnZXIoKSB7XG4gICAgdGhpcy5fbG9nZ2VyIHx8PSBuZXcgTG9nZ2VyKFwiU3luY0NsaWVudFwiLCB7Y29uZmlndXJhdGlvbjogdGhpcy5jb25maWcuY29uZmlndXJhdGlvbn0pXG5cbiAgICByZXR1cm4gdGhpcy5fbG9nZ2VyXG4gIH1cblxuICAvKipcbiAgICogV2hldGhlciBhIHJlY29yZCBpcyBjdXJyZW50bHkgYmVpbmcgd3JpdHRlbiBieSBwdWxsLWFwcGx5IChlY2hvIHN1cHByZXNzaW9uKS5cbiAgICogQHBhcmFtIHs/fSByZWNvcmQgLSBMb2NhbCBtb2RlbCByZWNvcmQuXG4gICAqIEByZXR1cm5zIHtib29sZWFufSBXaGV0aGVyIHRoZSByZWNvcmQgd3JpdGUgb3JpZ2luYXRlcyBmcm9tIGEgcmVtb3RlIGNoYW5nZS5cbiAgICovXG4gIGlzUmVtb3RlQXBwbHkocmVjb3JkKSB7XG4gICAgcmV0dXJuIHRoaXMuX3JlbW90ZUFwcGx5UmVjb3Jkcy5oYXMocmVjb3JkKVxuICB9XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdHJhY2tlZCBtdXRhdGlvbiBxdWV1ZWluZyBpcyBjdXJyZW50bHkgc3VwcHJlc3NlZCBmb3IgYSByZWNvcmQ6XG4gICAqIGVpdGhlciB0aGUgcmVjb3JkIHdhcyBtYXJrZWQgYXMgYSByZW1vdGUgYXBwbHkgKGBtYXJrUmVtb3RlQXBwbHlgLCB1c2VkIGJ5XG4gICAqIHB1bGwgYW5kIHJlYWx0aW1lIGFwcGxpZXMpIG9yIGEgYHdpdGhvdXRUcmFja2luZ2AgY2FsbGJhY2sgaXMgcnVubmluZyBvblxuICAgKiB0aGlzIGNsaWVudC5cbiAgICogQHBhcmFtIHs/fSByZWNvcmQgLSBMb2NhbCBtb2RlbCByZWNvcmQuXG4gICAqIEByZXR1cm5zIHtib29sZWFufSBXaGV0aGVyIHRyYWNrZWQgcXVldWVpbmcgaXMgc3VwcHJlc3NlZCBmb3IgdGhlIHJlY29yZC5cbiAgICovXG4gIGlzVHJhY2tpbmdTdXBwcmVzc2VkKHJlY29yZCkge1xuICAgIHJldHVybiB0aGlzLl93aXRob3V0VHJhY2tpbmdEZXB0aCA+IDAgfHwgdGhpcy5pc1JlbW90ZUFwcGx5KHJlY29yZClcbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIGEgY2FsbGJhY2sgd2l0aCB0cmFja2VkIG11dGF0aW9uIHF1ZXVlaW5nIHN1cHByZXNzZWQgb24gdGhpcyBjbGllbnQgLVxuICAgKiBmb3IgY29kZSBhcHBseWluZyBzZXJ2ZXItb3JpZ2luYXRlZCBkYXRhIG91dHNpZGUgdGhlIGRlcml2ZWQgcHVsbC9yZWFsdGltZVxuICAgKiBhcHBsaWVycyAobGVnYWN5IHB1bGwgcGF0aHMsIGltcG9ydGVycywgc2lnbi1pbiBiYWNrZmlsbHMpLCBzbyB0aGVpciB3cml0ZXNcbiAgICogYXJlIG5vdCBlY2hvZWQgYmFjayB0byB0aGUgc2VydmVyIGFzIGRldmljZSBjaGFuZ2VzLiBTdXBwcmVzc2lvbiBjb3ZlcnMgdGhlXG4gICAqIHdob2xlIGFzeW5jIGR1cmF0aW9uIG9mIHRoZSBjYWxsYmFjayAobmVzdGVkIGNhbGxzIHN0YWNrKSBhbmQgaXNcbiAgICogY2xpZW50LXdpZGUgd2hpbGUgaXQgcnVuczogbXV0YXRpb25zIGZyb20gY29uY3VycmVudGx5IHJ1bm5pbmcgdGFza3MgYXJlXG4gICAqIGFsc28gc3VwcHJlc3NlZCBmb3IgdGhhdCB3aW5kb3csIHNvIHByZWZlciBgbWFya1JlbW90ZUFwcGx5KHJlY29yZClgIHdoZW5cbiAgICogd3JpdGVzIGZyb20gb3RoZXIgZmxvd3MgY2FuIGludGVybGVhdmUuXG4gICAqIEB0ZW1wbGF0ZSBUXG4gICAqIEBwYXJhbSB7KCkgPT4gUHJvbWlzZTxUPiB8IFR9IGNhbGxiYWNrIC0gV29yayB3aG9zZSBtb2RlbCB3cml0ZXMgc2hvdWxkIG5vdCBxdWV1ZSB0cmFja2VkIHN5bmNzLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxUPn0gVGhlIGNhbGxiYWNrIHJlc3VsdC5cbiAgICovXG4gIGFzeW5jIHdpdGhvdXRUcmFja2luZyhjYWxsYmFjaykge1xuICAgIHRoaXMuX3dpdGhvdXRUcmFja2luZ0RlcHRoKytcblxuICAgIHRyeSB7XG4gICAgICByZXR1cm4gYXdhaXQgY2FsbGJhY2soKVxuICAgIH0gZmluYWxseSB7XG4gICAgICB0aGlzLl93aXRob3V0VHJhY2tpbmdEZXB0aC0tXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIE1hcmtzIG9uZSByZWNvcmQgYXMgYmVpbmcgd3JpdHRlbiBmcm9tIHNlcnZlci1vcmlnaW5hdGVkIGRhdGEgc28gdHJhY2tlZFxuICAgKiBtdXRhdGlvbiBxdWV1ZWluZyBza2lwcyBpdCAocmVjb3JkLXByZWNpc2Ugc3VwcHJlc3Npb24pLiBUaGUgZGVyaXZlZCBwdWxsXG4gICAqIGFuZCByZWFsdGltZSBhcHBsaWVycyB1c2UgdGhpcyBpbnRlcm5hbGx5IGFyb3VuZCBldmVyeSBhcHBsaWVkIHdyaXRlLlxuICAgKiBAcGFyYW0gez99IHJlY29yZCAtIExvY2FsIG1vZGVsIHJlY29yZCBhYm91dCB0byBiZSB3cml0dGVuLlxuICAgKiBAcmV0dXJucyB7KCkgPT4gdm9pZH0gUmVsZWFzZSBjYWxsYmFjayByZS1lbmFibGluZyB0cmFja2luZyBmb3IgdGhlIHJlY29yZC5cbiAgICovXG4gIG1hcmtSZW1vdGVBcHBseShyZWNvcmQpIHtcbiAgICB0aGlzLl9yZW1vdGVBcHBseVJlY29yZHMuYWRkKHJlY29yZClcblxuICAgIHJldHVybiAoKSA9PiB0aGlzLl9yZW1vdGVBcHBseVJlY29yZHMuZGVsZXRlKHJlY29yZClcbiAgfVxuXG4gIC8qKlxuICAgKiBSZWdpc3RlcnMgdGhpcyBjbGllbnQgYXMgdGhlIGFwcCdzIGN1cnJlbnQgc3luYyBjbGllbnQuXG4gICAqIEByZXR1cm5zIHt2b2lkfVxuICAgKi9cbiAgc2V0Q3VycmVudCgpIHtcbiAgICBzZXRDdXJyZW50U3luY0NsaWVudCh0aGlzKVxuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIGFwcCdzIGN1cnJlbnQgc3luYyBjbGllbnQuXG4gICAqIEByZXR1cm5zIHtTeW5jQ2xpZW50fSBDdXJyZW50IHN5bmMgY2xpZW50LlxuICAgKi9cbiAgc3RhdGljIGN1cnJlbnQoKSB7XG4gICAgcmV0dXJuIC8qKiBAdHlwZSB7U3luY0NsaWVudH0gKi8gKGN1cnJlbnRTeW5jQ2xpZW50KCkpXG4gIH1cblxuICAvKipcbiAgICogQnVpbGRzIGEgc3luYyBjbGllbnQgZGVyaXZlZCBmcm9tIHRoZSBnaXZlbiBjb25maWd1cmF0aW9uLiBBbGlhcyBmb3JcbiAgICogYG5ldyBTeW5jQ2xpZW50KHtjb25maWd1cmF0aW9uLCAuLi5vcHRpb25zfSlgLlxuICAgKiBAcGFyYW0ge0NvbmZpZ3VyYXRpb259IFtjb25maWd1cmF0aW9uXSAtIENvbmZpZ3VyYXRpb24gb3duaW5nIHRoZSByZWdpc3RlcmVkIG1vZGVscyBhbmQgdGhlIHN5bmMuY2xpZW50IGJsb2NrLiBEZWZhdWx0cyB0byB0aGUgY3VycmVudCBjb25maWd1cmF0aW9uLlxuICAgKiBAcGFyYW0ge09taXQ8aW1wb3J0KFwiLi9zeW5jLWNsaWVudC10eXBlcy5qc1wiKS5TeW5jQ2xpZW50T3B0aW9ucywgXCJjb25maWd1cmF0aW9uXCI+fSBbb3B0aW9uc10gLSBPcHRpb25hbCBvdmVycmlkZXMuXG4gICAqIEByZXR1cm5zIHtTeW5jQ2xpZW50fSBTeW5jIGNsaWVudCBkZXJpdmVkIGZyb20gdGhlIGNvbmZpZ3VyYXRpb24uXG4gICAqL1xuICBzdGF0aWMgZnJvbUNvbmZpZ3VyYXRpb24oY29uZmlndXJhdGlvbiA9IENvbmZpZ3VyYXRpb24uY3VycmVudCgpLCBvcHRpb25zID0ge30pIHtcbiAgICByZXR1cm4gbmV3IFN5bmNDbGllbnQoey4uLm9wdGlvbnMsIGNvbmZpZ3VyYXRpb259KVxuICB9XG5cbiAgLyoqXG4gICAqIERlY2xhcmVzIChvciByZS1hY3RpdmF0ZXMpIGEgc3luYyBzY29wZSBmcm9tIGEgbW9kZWwgcXVlcnkgYW5kIHB1bGxzIGl0IHdoZW4gb25saW5lLlxuICAgKiBAcGFyYW0ge2ltcG9ydChcIi4uL2RhdGFiYXNlL3F1ZXJ5L21vZGVsLWNsYXNzLXF1ZXJ5LmpzXCIpLmRlZmF1bHQ8Pz59IHF1ZXJ5IC0gUXVlcnkgZGVjbGFyaW5nIHRoZSBzeW5jIHNjb3BlLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx7c2NvcGU6IGltcG9ydChcIi4vc3luYy1jbGllbnQtdHlwZXMuanNcIikuU2VyaWFsaXplZFN5bmNTY29wZSwgcHVsbGVkOiBpbXBvcnQoXCIuL3N5bmMtYXBpLWNsaWVudC10eXBlcy5qc1wiKS5TeW5jQ2hhbmdlc1Jlc3VsdCB8IG51bGx9Pn0gRGVjbGFyZWQgc2NvcGUgYW5kIHB1bGwgcmVzdWx0IChudWxsIHdoaWxlIG9mZmxpbmUpLlxuICAgKi9cbiAgYXN5bmMgc3luYyhxdWVyeSkge1xuICAgIGNvbnN0IHNjb3BlID0gc2VyaWFsaXplZFNjb3BlRnJvbVF1ZXJ5KHF1ZXJ5KVxuICAgIGNvbnN0IHNjb3BlU3RvcmUgPSB0aGlzLnNjb3BlU3RvcmUoKVxuICAgIGNvbnN0IHNjb3BlUm93ID0gYXdhaXQgc2NvcGVTdG9yZS5maW5kT3JDcmVhdGVTY29wZShzY29wZSlcblxuICAgIGlmICghc2NvcGVSb3cuY3Vyc29yUGF5bG9hZCAmJiB0aGlzLmNvbmZpZy5sZWdhY3lDdXJzb3IpIHtcbiAgICAgIGNvbnN0IGxlZ2FjeUN1cnNvclBheWxvYWQgPSBhd2FpdCB0aGlzLmNvbmZpZy5sZWdhY3lDdXJzb3Ioe3Njb3BlfSlcbiAgICAgIGNvbnN0IGxlZ2FjeUN1cnNvciA9IFN5bmNBcGlDbGllbnQuc3luY0N1cnNvckZyb21QYXlsb2FkKGxlZ2FjeUN1cnNvclBheWxvYWQpXG5cbiAgICAgIGlmIChsZWdhY3lDdXJzb3IpIGF3YWl0IHNjb3BlU3RvcmUuc2F2ZUN1cnNvcihzY29wZVJvdywgbGVnYWN5Q3Vyc29yKVxuICAgIH1cblxuICAgIHJldHVybiB7cHVsbGVkOiBhd2FpdCB0aGlzLnB1bGwoKSwgc2NvcGV9XG4gIH1cblxuICAvKipcbiAgICogRGVhY3RpdmF0ZXMgdGhlIHN5bmMgc2NvcGUgZGVjbGFyZWQgYnkgYSBtb2RlbCBxdWVyeS5cbiAgICogQHBhcmFtIHtpbXBvcnQoXCIuLi9kYXRhYmFzZS9xdWVyeS9tb2RlbC1jbGFzcy1xdWVyeS5qc1wiKS5kZWZhdWx0PD8+fSBxdWVyeSAtIFF1ZXJ5IHdob3NlIHNjb3BlIHNob3VsZCBzdG9wIHN5bmNpbmcuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fVxuICAgKi9cbiAgYXN5bmMgdW5zeW5jKHF1ZXJ5KSB7XG4gICAgYXdhaXQgdGhpcy5zY29wZVN0b3JlKCkuZGVhY3RpdmF0ZShzZXJpYWxpemVkU2NvcGVGcm9tUXVlcnkocXVlcnkpKVxuICB9XG5cbiAgLyoqXG4gICAqIFB1bGxzIGNoYW5nZXMgZm9yIGV2ZXJ5IGFjdGl2ZSBzY29wZSB3aXRoIHBlci1zY29wZSBjdXJzb3JzIChzaW5nbGUtZmxpZ2h0ZWQsIG9ubGluZS1nYXRlZCkuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPGltcG9ydChcIi4vc3luYy1hcGktY2xpZW50LXR5cGVzLmpzXCIpLlN5bmNDaGFuZ2VzUmVzdWx0IHwgbnVsbD59IENvbWJpbmVkIHB1bGwgcmVzdWx0LCBvciBudWxsIHdoaWxlIG9mZmxpbmUuXG4gICAqL1xuICBhc3luYyBwdWxsKCkge1xuICAgIGlmICghKGF3YWl0IHRoaXMuaXNPbmxpbmUoKSkpIHJldHVybiBudWxsXG5cbiAgICAvKiogQHR5cGUge2ltcG9ydChcIi4vc3luYy1hcGktY2xpZW50LXR5cGVzLmpzXCIpLlN5bmNDaGFuZ2VzUmVzdWx0IHwgbnVsbH0gKi9cbiAgICBsZXQgY29tYmluZWRSZXN1bHQgPSBudWxsXG5cbiAgICBhd2FpdCBTeW5jQXBpQ2xpZW50LnNpbmdsZUZsaWdodChgdmVsb2Npb3VzLXN5bmMtY2xpZW50LXB1bGwtJHt0aGlzLl9jbGllbnROdW1iZXJ9YCwgYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgYXV0aGVudGljYXRpb25Ub2tlbiA9IGF3YWl0IHRoaXMuY29uZmlnLmF1dGhlbnRpY2F0aW9uVG9rZW4oKVxuICAgICAgY29uc3Qgc2NvcGVTdG9yZSA9IHRoaXMuc2NvcGVTdG9yZSgpXG4gICAgICBjb25zdCBhcHBseVN5bmMgPSB0aGlzLnJlbW90ZUFwcGx5U3luYygpXG4gICAgICBjb25zdCByZXN1bHQgPSB7XG4gICAgICAgIGNoYW5nZWQ6IGZhbHNlLFxuICAgICAgICBwYWdlczogMCxcbiAgICAgICAgcmVzb3VyY2VDaGFuZ2VkOiAvKiogQHR5cGUge1JlY29yZDxzdHJpbmcsIGJvb2xlYW4+fSAqLyAoe30pLFxuICAgICAgICByZXNvdXJjZUNvdW50czogLyoqIEB0eXBlIHtSZWNvcmQ8c3RyaW5nLCBudW1iZXI+fSAqLyAoe30pLFxuICAgICAgICBzeW5jZWRDb3VudDogMFxuICAgICAgfVxuXG4gICAgICBmb3IgKGNvbnN0IHNjb3BlUm93IG9mIGF3YWl0IHNjb3BlU3RvcmUuYWN0aXZlU2NvcGVzKCkpIHtcbiAgICAgICAgY29uc3Qgc2NvcGVSZXN1bHQgPSBhd2FpdCBTeW5jQXBpQ2xpZW50LnB1bGxDaGFuZ2VzKHtcbiAgICAgICAgICBhcHBseVN5bmMsXG4gICAgICAgICAgYXV0aGVudGljYXRpb25Ub2tlbixcbiAgICAgICAgICBiYXRjaFNpemU6IHRoaXMuY29uZmlnLmJhdGNoU2l6ZSxcbiAgICAgICAgICBsb2FkQ3Vyc29yOiBhc3luYyAoKSA9PiBhd2FpdCBzY29wZVN0b3JlLmxvYWRDdXJzb3Ioc2NvcGVSb3cpLFxuICAgICAgICAgIHBvc3RDaGFuZ2VzOiBhc3luYyAocGF5bG9hZCkgPT4gYXdhaXQgdGhpcy5jb25maWcucG9zdENoYW5nZXMoe1xuICAgICAgICAgICAgLi4ucGF5bG9hZCxcbiAgICAgICAgICAgIHNjb3BlOiB7Y29uZGl0aW9uczogc2NvcGVSb3cuY29uZGl0aW9ucywgcmVzb3VyY2VUeXBlOiBzY29wZVJvdy5yZXNvdXJjZVR5cGV9XG4gICAgICAgICAgfSksXG4gICAgICAgICAgc2F2ZUN1cnNvcjogYXN5bmMgKGN1cnNvcikgPT4gYXdhaXQgc2NvcGVTdG9yZS5zYXZlQ3Vyc29yKHNjb3BlUm93LCBjdXJzb3IpXG4gICAgICAgIH0pXG5cbiAgICAgICAgcmVzdWx0LmNoYW5nZWQgfHw9IHNjb3BlUmVzdWx0LmNoYW5nZWRcbiAgICAgICAgcmVzdWx0LnBhZ2VzICs9IHNjb3BlUmVzdWx0LnBhZ2VzXG4gICAgICAgIHJlc3VsdC5zeW5jZWRDb3VudCArPSBzY29wZVJlc3VsdC5zeW5jZWRDb3VudFxuXG4gICAgICAgIGZvciAoY29uc3QgW3Jlc291cmNlVHlwZSwgY291bnRdIG9mIE9iamVjdC5lbnRyaWVzKHNjb3BlUmVzdWx0LnJlc291cmNlQ291bnRzKSkge1xuICAgICAgICAgIHJlc3VsdC5yZXNvdXJjZUNvdW50c1tyZXNvdXJjZVR5cGVdID0gKHJlc3VsdC5yZXNvdXJjZUNvdW50c1tyZXNvdXJjZVR5cGVdIHx8IDApICsgY291bnRcbiAgICAgICAgfVxuICAgICAgICBmb3IgKGNvbnN0IFtyZXNvdXJjZVR5cGUsIGNoYW5nZWRdIG9mIE9iamVjdC5lbnRyaWVzKHNjb3BlUmVzdWx0LnJlc291cmNlQ2hhbmdlZCkpIHtcbiAgICAgICAgICByZXN1bHQucmVzb3VyY2VDaGFuZ2VkW3Jlc291cmNlVHlwZV0gfHw9IGNoYW5nZWRcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBjb21iaW5lZFJlc3VsdCA9IHJlc3VsdFxuICAgIH0pXG5cbiAgICByZXR1cm4gY29tYmluZWRSZXN1bHRcbiAgfVxuXG4gIC8qKlxuICAgKiBCdWlsZHMgdGhlIGRlcml2ZWQgcmVtb3RlLWNoYW5nZSBhcHBsaWVyIHNoYXJlZCBieSBwdWxscyBhbmQgcmVhbHRpbWUgcHVzaGVzOlxuICAgKiBhcHBsaWVzIHRocm91Z2ggdGhlIGRlY2xhcmVkIHJlc291cmNlIGNvbmZpZ3MsIHJlZ2lzdGVycyBlYWNoIHdyaXR0ZW4gcmVjb3JkXG4gICAqIGZvciBlY2hvIHN1cHByZXNzaW9uICh0cmFja2VkIHJlc291cmNlcyBkbyBub3QgcmUtcXVldWUgYXBwbGllZCBjaGFuZ2VzKSwgYW5kXG4gICAqIGZhaWxzIGxvdWRseSBpbnN0ZWFkIG9mIHNpbGVudGx5IHNraXBwaW5nIHVuY29uZmlndXJlZCByZXNvdXJjZXMuXG4gICAqIEBwYXJhbSB7e3NvdXJjZT86IHN0cmluZ319IFthcmdzXSAtIEVycm9yIGNvbnRleHQgZGVzY3JpYmluZyB3aGVyZSB0aGUgY2hhbmdlIGNhbWUgZnJvbS5cbiAgICogQHJldHVybnMgeyhzeW5jOiBpbXBvcnQoXCIuL3N5bmMtYXBpLWNsaWVudC10eXBlcy5qc1wiKS5TeW5jQ2hhbmdlRW52ZWxvcGUpID0+IFByb21pc2U8aW1wb3J0KFwiLi9zeW5jLWFwaS1jbGllbnQtdHlwZXMuanNcIikuU3luY0NoYW5nZUFwcGx5UmVzdWx0Pn0gTG91ZCByZW1vdGUtY2hhbmdlIGFwcGxpZXIuXG4gICAqL1xuICByZW1vdGVBcHBseVN5bmMoe3NvdXJjZSA9IFwicHVsbGVkIGNoYW5nZVwifSA9IHt9KSB7XG4gICAgY29uc3QgcHVsbFJlc291cmNlQ29uZmlncyA9IHRoaXMucHVsbFJlc291cmNlQ29uZmlncygpXG4gICAgY29uc3QgYXBwbGllciA9IFN5bmNBcGlDbGllbnQucmVzb3VyY2VBcHBsaWVyKHB1bGxSZXNvdXJjZUNvbmZpZ3MsIChyZWNvcmQpID0+IHRoaXMubWFya1JlbW90ZUFwcGx5KHJlY29yZCkpXG5cbiAgICByZXR1cm4gYXN5bmMgKHN5bmMpID0+IHtcbiAgICAgIGNvbnN0IHJlc291cmNlVHlwZSA9IHN5bmMucmVzb3VyY2VUeXBlKClcblxuICAgICAgaWYgKCFyZXNvdXJjZVR5cGUgfHwgIXB1bGxSZXNvdXJjZUNvbmZpZ3NbcmVzb3VyY2VUeXBlXSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYE5vIHN5bmMgcmVzb3VyY2Ugd2l0aCBwdWxsIGF0dHJpYnV0ZXMgY29uZmlndXJlZCBmb3IgJHtzb3VyY2V9OiAke1N0cmluZyhyZXNvdXJjZVR5cGUpfWApXG4gICAgICB9XG5cbiAgICAgIHJldHVybiBhd2FpdCBhcHBsaWVyKHN5bmMpXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJlc29sdmVzIHRoZSBzaGFyZWQgYXBwLWxpZmV0aW1lIHdlYnNvY2tldCBjb25uZWN0aW9uIGFsbCBzeW5jIHRyYWZmaWNcbiAgICogcmlkZXMsIG9yIG51bGwgd2hlbiBub25lIGlzIGNvbmZpZ3VyZWQuIEJ1aWx0IG9uY2UgYW5kIG1lbW9pemVkIChwZXJcbiAgICogY2xpZW50KTogYW4gYXBwLXByb3ZpZGVkIGBzeW5jLmNsaWVudC53ZWJzb2NrZXRDbGllbnRgIGluc3RhbmNlIHdpbnMgKHRoZVxuICAgKiBmcm9udGVuZC1tb2RlbCB0cmFuc3BvcnQgY2FuIHBhc3MgaXRzIG93biBjbGllbnQgc28gb25lIHNvY2tldCBjYXJyaWVzXG4gICAqIGV2ZXJ5dGhpbmcpLCBlbHNlIGEgZnJhbWV3b3JrLW93bmVkIHJlY29ubmVjdGluZyB7QGxpbmsgVmVsb2Npb3VzV2Vic29ja2V0Q2xpZW50fVxuICAgKiBidWlsdCBmcm9tIGBzeW5jLmNsaWVudC53ZWJzb2NrZXRVcmxgLiBUaGUgcmVhbHRpbWUgYnJpZGdlIHJpZGVzIHRoaXNcbiAgICogY29ubmVjdGlvbiB3aXRob3V0IG93bmluZyBpdHMgbGlmZWN5Y2xlOyB3aGVuIG5laXRoZXIgaXMgY29uZmlndXJlZCB0aGVcbiAgICogYnJpZGdlIGZhbGxzIGJhY2sgdG8gdGhlIGRlcHJlY2F0ZWQgcGVyLWN5Y2xlIGByZWFsdGltZS5jcmVhdGVDbGllbnRgLlxuICAgKiBAcmV0dXJucyB7aW1wb3J0KFwiLi9zeW5jLWNsaWVudC10eXBlcy5qc1wiKS5TeW5jQ2xpZW50U2hhcmVkQ29ubmVjdGlvbiB8IG51bGx9IFNoYXJlZCB3ZWJzb2NrZXQgY29ubmVjdGlvbiwgb3IgbnVsbC5cbiAgICovXG4gIHN5bmNDb25uZWN0aW9uKCkge1xuICAgIGlmICh0aGlzLl9zeW5jQ29ubmVjdGlvbiAhPT0gdW5kZWZpbmVkKSByZXR1cm4gdGhpcy5fc3luY0Nvbm5lY3Rpb25cblxuICAgIGlmICh0aGlzLmNvbmZpZy53ZWJzb2NrZXRDbGllbnQpIHtcbiAgICAgIHRoaXMuX3N5bmNDb25uZWN0aW9uID0gdGhpcy5jb25maWcud2Vic29ja2V0Q2xpZW50XG4gICAgfSBlbHNlIGlmICh0aGlzLmNvbmZpZy53ZWJzb2NrZXRVcmwpIHtcbiAgICAgIGNvbnN0IHVybCA9IHR5cGVvZiB0aGlzLmNvbmZpZy53ZWJzb2NrZXRVcmwgPT09IFwiZnVuY3Rpb25cIiA/IHRoaXMuY29uZmlnLndlYnNvY2tldFVybCgpIDogdGhpcy5jb25maWcud2Vic29ja2V0VXJsXG5cbiAgICAgIHRoaXMuX3N5bmNDb25uZWN0aW9uID0gdXJsID8gbmV3IFZlbG9jaW91c1dlYnNvY2tldENsaWVudCh7dXJsfSkgOiBudWxsXG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuX3N5bmNDb25uZWN0aW9uID0gbnVsbFxuICAgIH1cblxuICAgIHJldHVybiB0aGlzLl9zeW5jQ29ubmVjdGlvblxuICB9XG5cbiAgLyoqXG4gICAqIFN1YnNjcmliZXMgdGhlIGRlcml2ZWQgcmVhbHRpbWUgY2hhbm5lbHMgc28gcHVzaGVkIHdlYnNvY2tldCBjaGFuZ2VzIGFwcGx5XG4gICAqIHRocm91Z2ggdGhlIHNhbWUgZGVyaXZlZCBhcHBsaWVyIGFzIHB1bGxzIChpZGVtcG90ZW50LCBzaW5nbGUtZmxpZ2h0ZWQpLlxuICAgKiBAcGFyYW0gez99IFtjb250ZXh0XSAtIEFwcCBjb250ZXh0IHBhc3NlZCB0byB0aGUgZGVwcmVjYXRlZCBgc3luYy5jbGllbnQucmVhbHRpbWUuY2hhbm5lbHNgIGNhbGxiYWNrIChydW50aW1lIHNjb3BlIHZhbHVlcykuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fVxuICAgKi9cbiAgYXN5bmMgc3Vic2NyaWJlUmVhbHRpbWUoY29udGV4dCkge1xuICAgIGF3YWl0IHRoaXMucmVhbHRpbWVCcmlkZ2UoKS5zdWJzY3JpYmUoY29udGV4dClcbiAgfVxuXG4gIC8qKlxuICAgKiBTdWJzY3JpYmVzIHRoZSBzZXJ2ZXItZW51bWVyYXRlZCB1c2VyIHNjb3BlOiBcImV2ZXJ5dGhpbmcgbXkgYWJpbGl0eSBjYW5cbiAgICogc2VlXCIuIERlY2xhcmVzIGEgdXNlciBzY29wZSAoZW1wdHkgY29uZGl0aW9ucykgZm9yIGV2ZXJ5IHB1bGxhYmxlIHN5bmNlZFxuICAgKiByZXNvdXJjZSB0eXBlLCBzdWJzY3JpYmVzIHJlYWx0aW1lIHNvIHRoZWlyIGZyYW1ld29yayBzeW5jIGNoYW5uZWxcbiAgICogc3Vic2NyaXB0aW9ucyBnbyBsaXZlLCBhbmQgcHVsbHMgc28gdGhlIGRldmljZSBjYXRjaGVzIHVwLiBUaGUgc2VydmVyXG4gICAqIGF1dGhvcml6ZXMgZWFjaCBlbXB0eS1jb25kaXRpb25zIHNjb3BlIHRocm91Z2ggdGhlIGFwcCBzeW5jIHJlc291cmNlJ3NcbiAgICogYGF1dGhvcml6ZUNoYW5nZXNgIGFuZCByZS1jaGVja3MgcmVjb3JkIGFjY2VzcyBwZXIgZGVsaXZlcnksIHNvIHRoZSBjbGllbnRcbiAgICogc3Vic2NyaWJlcyB3aXRoIGp1c3QgaXRzIHRva2VuIGFuZCB0aGUgc2VydmVyIGRlY2lkZXMgbWVtYmVyc2hpcC5cbiAgICogSWRlbXBvdGVudCBhbmQgc2luZ2xlLWZsaWdodGVkIGxpa2Uge0BsaW5rIFN5bmNDbGllbnQjc3Vic2NyaWJlUmVhbHRpbWV9LlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn1cbiAgICovXG4gIGFzeW5jIHN1YnNjcmliZVVzZXJTY29wZSgpIHtcbiAgICBpZiAodGhpcy5fdXNlclNjb3BlU3RhdGUgPT09IFwic3Vic2NyaWJlZFwiKSByZXR1cm5cblxuICAgIGlmICghdGhpcy5fc3Vic2NyaWJlVXNlclNjb3BlUHJvbWlzZSkge1xuICAgICAgdGhpcy5fc3Vic2NyaWJlVXNlclNjb3BlUHJvbWlzZSA9IHRoaXMuX3N1YnNjcmliZVVzZXJTY29wZSgpLmZpbmFsbHkoKCkgPT4ge1xuICAgICAgICB0aGlzLl9zdWJzY3JpYmVVc2VyU2NvcGVQcm9taXNlID0gbnVsbFxuICAgICAgfSlcbiAgICB9XG5cbiAgICBhd2FpdCB0aGlzLl9zdWJzY3JpYmVVc2VyU2NvcGVQcm9taXNlXG4gIH1cblxuICAvKipcbiAgICogRGVjbGFyZXMgYW5kIGFjdGl2YXRlcyB0aGUgdXNlciBzY29wZSBmb3IgZXZlcnkgcHVsbGFibGUgcmVzb3VyY2UsIHRoZW5cbiAgICogc3Vic2NyaWJlcyByZWFsdGltZSBhbmQgcHVsbHMuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fVxuICAgKi9cbiAgYXN5bmMgX3N1YnNjcmliZVVzZXJTY29wZSgpIHtcbiAgICB0aGlzLl91c2VyU2NvcGVTdGF0ZSA9IFwic3Vic2NyaWJpbmdcIlxuXG4gICAgY29uc3Qgc2NvcGVTdG9yZSA9IHRoaXMuc2NvcGVTdG9yZSgpXG4gICAgY29uc3Qgb3duZXIgPSBhd2FpdCB0aGlzLnVzZXJTY29wZU93bmVyKClcblxuICAgIGZvciAoY29uc3QgcmVzb3VyY2VUeXBlIG9mIHRoaXMudXNlclNjb3BlUmVzb3VyY2VUeXBlcygpKSB7XG4gICAgICBhd2FpdCBzY29wZVN0b3JlLmZpbmRPckNyZWF0ZVNjb3BlKHtjb25kaXRpb25zOiB7fSwgb3duZXIsIHJlc291cmNlVHlwZX0pXG4gICAgfVxuXG4gICAgYXdhaXQgdGhpcy5zdWJzY3JpYmVSZWFsdGltZSgpXG4gICAgYXdhaXQgdGhpcy5wdWxsKClcblxuICAgIHRoaXMuX3VzZXJTY29wZVN0YXRlID0gXCJzdWJzY3JpYmVkXCJcbiAgfVxuXG4gIC8qKlxuICAgKiBVbnN1YnNjcmliZXMgdGhlIHVzZXIgc2NvcGU6IGRlYWN0aXZhdGVzIHRoZSBwZXItcmVzb3VyY2UgdXNlciBzY29wZXMgYW5kXG4gICAqIGNsb3NlcyB0aGUgcmVhbHRpbWUgY2hhbm5lbCBzdWJzY3JpcHRpb25zLiBUaGUgc2hhcmVkIHdlYnNvY2tldCBjb25uZWN0aW9uXG4gICAqIHN0YXlzIG9wZW4gd2hlbiBvbmUgaXMgY29uZmlndXJlZCAoc2lnbi1vdXQgZHJvcHMgc3Vic2NyaXB0aW9ucyB3aXRob3V0XG4gICAqIGRpc2Nvbm5lY3RpbmcpLCBzbyBhIHN1YnNlcXVlbnQgc2lnbi1pbiByZXN1YnNjcmliZXMgb3ZlciB0aGUgc2FtZSBzb2NrZXQuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fVxuICAgKi9cbiAgYXN5bmMgdW5zdWJzY3JpYmVVc2VyU2NvcGUoKSB7XG4gICAgY29uc3Qgc2NvcGVTdG9yZSA9IHRoaXMuc2NvcGVTdG9yZSgpXG4gICAgY29uc3Qgb3duZXIgPSBhd2FpdCB0aGlzLnVzZXJTY29wZU93bmVyKClcblxuICAgIGZvciAoY29uc3QgcmVzb3VyY2VUeXBlIG9mIHRoaXMudXNlclNjb3BlUmVzb3VyY2VUeXBlcygpKSB7XG4gICAgICBhd2FpdCBzY29wZVN0b3JlLmRlYWN0aXZhdGUoe2NvbmRpdGlvbnM6IHt9LCBvd25lciwgcmVzb3VyY2VUeXBlfSlcbiAgICB9XG5cbiAgICBhd2FpdCB0aGlzLnVuc3Vic2NyaWJlUmVhbHRpbWUoKVxuXG4gICAgdGhpcy5fdXNlclNjb3BlU3RhdGUgPSBcInVuc3Vic2NyaWJlZFwiXG4gICAgdGhpcy5fc3Vic2NyaWJlVXNlclNjb3BlUHJvbWlzZSA9IG51bGxcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgcmVzb3VyY2UgdHlwZXMgYSB1c2VyIHNjb3BlIGNvdmVyczogZXZlcnkgZGVjbGFyZWQgcmVzb3VyY2UgdGhhdFxuICAgKiByZWNlaXZlcyBwdWxsZWQgY2hhbmdlcyAoaGFzIHB1bGwgYGF0dHJpYnV0ZXNgKS5cbiAgICogQHJldHVybnMge3N0cmluZ1tdfSBQdWxsYWJsZSByZXNvdXJjZSB0eXBlIG5hbWVzLlxuICAgKi9cbiAgdXNlclNjb3BlUmVzb3VyY2VUeXBlcygpIHtcbiAgICByZXR1cm4gT2JqZWN0LmtleXModGhpcy5wdWxsUmVzb3VyY2VDb25maWdzKCkpXG4gIH1cblxuICAvKipcbiAgICogUmVzb2x2ZXMgdGhlIGxvY2FsIHBhcnRpdGlvbiBrZXkgZm9yIHRoZSB1c2VyIHNjb3BlOiB0aGUgY3VycmVudGx5XG4gICAqIGNvbmZpZ3VyZWQgYXV0aGVudGljYXRlZCBpZGVudGl0eSAodGhlIHN5bmMgYXV0aCB0b2tlbikuIFBhcnRpdGlvbmluZyB0aGVcbiAgICogdXNlciBzY29wZSdzIGxvY2FsIHNjb3BlL2N1cnNvciByb3dzIGJ5IHRoaXMgb3duZXIga2VlcHMgdGhlXG4gICAqIGVtcHR5LWNvbmRpdGlvbnMgY3Vyc29yIGZyb20gbGVha2luZyBhY3Jvc3MgYWNjb3VudHMgb24gYSBzaGFyZWQgZGV2aWNlXG4gICAqIChhY2NvdW50IEIgc2lnbmluZyBpbiBhZnRlciBhY2NvdW50IEEgZ2V0cyBhIGZyZXNoIGN1cnNvcikgd2hpbGUgdGhlIHNhbWVcbiAgICogYWNjb3VudCByZWNvbm5lY3Rpbmcga2VlcHMgaXRzIGN1cnNvciBjb250aW51aXR5LiBUaGUgb3duZXIgaXMgYSBsb2NhbFxuICAgKiBwYXJ0aXRpb24ga2V5IG9ubHkg4oCUIHB1bGxzIHN0aWxsIHBvc3QgZW1wdHkgY29uZGl0aW9ucyB0byB0aGUgc2VydmVyLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxzdHJpbmc+fSBVc2VyLXNjb3BlIG93bmVyIHBhcnRpdGlvbiBrZXkuXG4gICAqL1xuICBhc3luYyB1c2VyU2NvcGVPd25lcigpIHtcbiAgICByZXR1cm4gU3RyaW5nKGF3YWl0IHRoaXMuY29uZmlnLmF1dGhlbnRpY2F0aW9uVG9rZW4oKSlcbiAgfVxuXG4gIC8qKlxuICAgKiBVbnN1YnNjcmliZXMgdGhlIHJlYWx0aW1lIGNoYW5uZWxzIGFuZCBkaXNjb25uZWN0cyB0aGUgd2Vic29ja2V0IGNsaWVudCAoaWRlbXBvdGVudCkuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fVxuICAgKi9cbiAgYXN5bmMgdW5zdWJzY3JpYmVSZWFsdGltZSgpIHtcbiAgICBhd2FpdCB0aGlzLnJlYWx0aW1lQnJpZGdlKCkudW5zdWJzY3JpYmUoKVxuICB9XG5cbiAgLyoqXG4gICAqIFJlcG9ydHMgdGhlIHJlYWx0aW1lIHN1YnNjcmlwdGlvbiBzdGF0ZSBhbmQgcGVyLWNoYW5uZWwgcmVhZGluZXNzLlxuICAgKiBAcmV0dXJucyB7UmV0dXJuVHlwZTxTeW5jUmVhbHRpbWVCcmlkZ2VbXCJzdGF0dXNcIl0+fSBSZWFsdGltZSBzdGF0dXMuXG4gICAqL1xuICByZWFsdGltZVN0YXR1cygpIHtcbiAgICByZXR1cm4gdGhpcy5yZWFsdGltZUJyaWRnZSgpLnN0YXR1cygpXG4gIH1cblxuICAvKipcbiAgICogQXdhaXRzIGFsbCBwZW5kaW5nIHJlYWx0aW1lIG1lc3NhZ2UgYXBwbGllcyBhbmQgYW55IHNjaGVkdWxlZFxuICAgKiBwdWxsLW9uLXJlY29ubmVjdCAodXNlZnVsIGluIHRlc3RzIGFuZCBzaHV0ZG93biBmbG93cykuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fVxuICAgKi9cbiAgYXN5bmMgd2FpdEZvclJlYWx0aW1lQXBwbGllZCgpIHtcbiAgICBhd2FpdCB0aGlzLnJlYWx0aW1lQnJpZGdlKCkud2FpdEZvckFwcGxpZWQoKVxuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIGxhemlseSBidWlsdCByZWFsdGltZSBicmlkZ2UuXG4gICAqIEByZXR1cm5zIHtTeW5jUmVhbHRpbWVCcmlkZ2V9IFJlYWx0aW1lIGJyaWRnZS5cbiAgICovXG4gIHJlYWx0aW1lQnJpZGdlKCkge1xuICAgIHRoaXMuX3JlYWx0aW1lQnJpZGdlIHx8PSBuZXcgU3luY1JlYWx0aW1lQnJpZGdlKHtzeW5jQ2xpZW50OiB0aGlzfSlcblxuICAgIHJldHVybiB0aGlzLl9yZWFsdGltZUJyaWRnZVxuICB9XG5cbiAgLyoqXG4gICAqIFF1ZXVlcyBhIGxvY2FsIG1vZGVsIGNoYW5nZSBhcyBhIHBlbmRpbmcgc3luYyByb3cgYW5kIHNjaGVkdWxlcyBhbiBpbW1lZGlhdGVcbiAgICogcmVwbGF5IGF0dGVtcHQgKGtlcHQgcGVuZGluZyB3aGlsZSBvZmZsaW5lIG9yIHdoZW4gdGhlIGJhY2tlbmQgcmVqZWN0cyBpdCkuXG4gICAqIEBwYXJhbSB7e3Jlc291cmNlOiA/LCBkYXRhPzogUmVjb3JkPHN0cmluZywgPz4sIHN5bmNUeXBlPzogc3RyaW5nfX0gYXJncyAtIFF1ZXVlIGFyZ3MuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPD8+fSBQZW5kaW5nIGxvY2FsIHN5bmMgcm93LlxuICAgKi9cbiAgYXN5bmMgcXVldWUoe2RhdGEsIHJlc291cmNlLCBzeW5jVHlwZX0pIHtcbiAgICBjb25zdCByZXNvdXJjZUNvbmZpZyA9IHRoaXMucmVzb3VyY2VDb25maWdGb3IocmVzb3VyY2UpXG4gICAgY29uc3Qgc3luY1JvdyA9IGF3YWl0IFN5bmNBcGlDbGllbnQucXVldWVMb2NhbFN5bmMoe1xuICAgICAgYm9vbGVhbkF0dHJpYnV0ZXM6IHJlc291cmNlQ29uZmlnLmJvb2xlYW5BdHRyaWJ1dGVzIHx8IFtdLFxuICAgICAgZGF0YSxcbiAgICAgIGxvY2FsT25seUF0dHJpYnV0ZXM6IHJlc291cmNlQ29uZmlnLmxvY2FsT25seUF0dHJpYnV0ZXMgfHwgW10sXG4gICAgICByZXNvdXJjZSxcbiAgICAgIHN5bmNNb2RlbDogdGhpcy5jb25maWcuc3luY01vZGVsLFxuICAgICAgc3luY1R5cGU6IHN5bmNUeXBlID8/IHRoaXMuZGVmYXVsdFN5bmNUeXBlKHtvcGVyYXRpb246IFwidXBkYXRlXCIsIHJlY29yZDogcmVzb3VyY2UsIHJlc291cmNlQ29uZmlnfSlcbiAgICB9KVxuXG4gICAgdGhpcy5zY2hlZHVsZVJlcGxheSgpXG5cbiAgICByZXR1cm4gc3luY1Jvd1xuICB9XG5cbiAgLyoqXG4gICAqIERyYWlucyBwZW5kaW5nIGxvY2FsIHN5bmMgcm93cyB0byB0aGUgYmFja2VuZCAoc2luZ2xlLWZsaWdodGVkLCBvbmxpbmUtZ2F0ZWQpLlxuICAgKiBSb3dzIGFyZSBvbmx5IG1hcmtlZCBzdWNjZXNzZnVsIGFmdGVyIHRoZSBiYWNrZW5kIGFja25vd2xlZGdlcyB0aGVtLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn1cbiAgICovXG4gIGFzeW5jIHJlcGxheVBlbmRpbmcoKSB7XG4gICAgaWYgKCEoYXdhaXQgdGhpcy5pc09ubGluZSgpKSkgcmV0dXJuXG5cbiAgICBhd2FpdCBTeW5jQXBpQ2xpZW50LnNpbmdsZUZsaWdodChgdmVsb2Npb3VzLXN5bmMtY2xpZW50LXJlcGxheS0ke3RoaXMuX2NsaWVudE51bWJlcn1gLCBhc3luYyAoKSA9PiB7XG4gICAgICBhd2FpdCBTeW5jQXBpQ2xpZW50LnJlcGxheUxvY2FsU3luY3Moe1xuICAgICAgICBhdXRoZW50aWNhdGlvblRva2VuOiBhd2FpdCB0aGlzLmNvbmZpZy5hdXRoZW50aWNhdGlvblRva2VuKCksXG4gICAgICAgIGJhdGNoU2l6ZTogdGhpcy5jb25maWcuYmF0Y2hTaXplLFxuICAgICAgICBwb3N0UmVwbGF5OiB0aGlzLmNvbmZpZy5wb3N0UmVwbGF5LFxuICAgICAgICBzeW5jTW9kZWw6IHRoaXMuY29uZmlnLnN5bmNNb2RlbFxuICAgICAgfSlcbiAgICB9KVxuICB9XG5cbiAgLyoqXG4gICAqIFNjaGVkdWxlcyBhIGJhY2tncm91bmQgcmVwbGF5IGF0dGVtcHQgd2l0aG91dCBibG9ja2luZyB0aGUgY2FsbGVyLlxuICAgKiBGYWlsdXJlcyBnbyB0byBjb25maWcub25FcnJvciAob3IgcmV0aHJvdyB3aGVuIG5vbmUgaXMgY29uZmlndXJlZCkuXG4gICAqIEByZXR1cm5zIHt2b2lkfVxuICAgKi9cbiAgc2NoZWR1bGVSZXBsYXkoKSB7XG4gICAgdGhpcy5fc2NoZWR1bGVkUmVwbGF5ID0gKGFzeW5jICgpID0+IHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGF3YWl0IHRoaXMucmVwbGF5UGVuZGluZygpXG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICB0aGlzLnJlcG9ydEVycm9yKC8qKiBAdHlwZSB7RXJyb3J9ICovIChlcnJvcikpXG4gICAgICB9XG4gICAgfSkoKVxuICB9XG5cbiAgLyoqXG4gICAqIEF3YWl0cyB0aGUgbGFzdCBzY2hlZHVsZWQgYmFja2dyb3VuZCByZXBsYXkgKHVzZWZ1bCBpbiB0ZXN0cyBhbmQgc2h1dGRvd24gZmxvd3MpLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn1cbiAgICovXG4gIGFzeW5jIHdhaXRGb3JTY2hlZHVsZWRSZXBsYXkoKSB7XG4gICAgaWYgKHRoaXMuX3NjaGVkdWxlZFJlcGxheSkgYXdhaXQgdGhpcy5fc2NoZWR1bGVkUmVwbGF5XG4gIH1cblxuICAvKipcbiAgICogUmVwb3J0cyBhIGJhY2tncm91bmQgc3luYyBmYWlsdXJlLlxuICAgKiBAcGFyYW0ge0Vycm9yfSBlcnJvciAtIEJhY2tncm91bmQgZmFpbHVyZS5cbiAgICogQHJldHVybnMge3ZvaWR9XG4gICAqL1xuICByZXBvcnRFcnJvcihlcnJvcikge1xuICAgIGlmICh0aGlzLmNvbmZpZy5vbkVycm9yKSB7XG4gICAgICB0aGlzLmNvbmZpZy5vbkVycm9yKGVycm9yKVxuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgdGhyb3cgZXJyb3JcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXNvbHZlcyBjb25uZWN0aXZpdHkgdGhyb3VnaCB0aGUgY29uZmlndXJlZCBnYXRlLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxib29sZWFuPn0gV2hldGhlciB0aGUgYmFja2VuZCBpcyBjb25zaWRlcmVkIHJlYWNoYWJsZS5cbiAgICovXG4gIGFzeW5jIGlzT25saW5lKCkge1xuICAgIGlmICghdGhpcy5jb25maWcuaXNPbmxpbmUpIHJldHVybiB0cnVlXG5cbiAgICByZXR1cm4gKGF3YWl0IHRoaXMuY29uZmlnLmlzT25saW5lKCkpICE9PSBmYWxzZVxuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIHNjb3BlIHN0b3JlIGJhY2tpbmcgZGVjbGFyZWQgc2NvcGVzIGFuZCBjdXJzb3JzLlxuICAgKiBAcmV0dXJucyB7aW1wb3J0KFwiLi9zeW5jLXNjb3BlLXN0b3JlLmpzXCIpLmRlZmF1bHR9IFNjb3BlIHN0b3JlLlxuICAgKi9cbiAgc2NvcGVTdG9yZSgpIHtcbiAgICB0aGlzLl9zY29wZVN0b3JlIHx8PSBuZXcgU3luY1Njb3BlU3RvcmUoe2NvbmZpZ3VyYXRpb246IHRoaXMuY29uZmlnLmNvbmZpZ3VyYXRpb259KVxuXG4gICAgcmV0dXJuIHRoaXMuX3Njb3BlU3RvcmVcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXNvbHZlcyB0aGUgZGVjbGFyZWQgcmVzb3VyY2UgY29uZmlnIGZvciBhIGxvY2FsIHJlY29yZC5cbiAgICogQHBhcmFtIHs/fSByZXNvdXJjZSAtIExvY2FsIG1vZGVsIHJlY29yZC5cbiAgICogQHJldHVybnMge2ltcG9ydChcIi4vc3luYy1jbGllbnQtdHlwZXMuanNcIikuU3luY0NsaWVudFJlc291cmNlQ29uZmlnfSBEZWNsYXJlZCByZXNvdXJjZSBjb25maWcuXG4gICAqL1xuICByZXNvdXJjZUNvbmZpZ0ZvcihyZXNvdXJjZSkge1xuICAgIGNvbnN0IG1vZGVsQ2xhc3MgPSByZXNvdXJjZT8uY29uc3RydWN0b3JcblxuICAgIGlmICh0eXBlb2YgbW9kZWxDbGFzcz8uZ2V0TW9kZWxOYW1lICE9PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgU3luYyByZXNvdXJjZXMgbXVzdCBiZSBtb2RlbCByZWNvcmRzIHdpdGggYSBzdGF0aWMgZ2V0TW9kZWxOYW1lKCksIGdvdDogJHtTdHJpbmcocmVzb3VyY2UpfWApXG4gICAgfVxuXG4gICAgY29uc3QgcmVzb3VyY2VUeXBlID0gbW9kZWxDbGFzcy5nZXRNb2RlbE5hbWUoKVxuICAgIGNvbnN0IHJlc291cmNlQ29uZmlnID0gdGhpcy5jb25maWcucmVzb3VyY2VzW3Jlc291cmNlVHlwZV1cblxuICAgIGlmICghcmVzb3VyY2VDb25maWcpIHRocm93IG5ldyBFcnJvcihgTm8gc3luYyByZXNvdXJjZSBjb25maWd1cmVkIGZvcjogJHtyZXNvdXJjZVR5cGV9YClcblxuICAgIHJldHVybiByZXNvdXJjZUNvbmZpZ1xuICB9XG5cbiAgLyoqXG4gICAqIFJlc29sdmVzIHRoZSBzeW5jIHR5cGUgZm9yIGEgbXV0YXRpb24gdGhyb3VnaCB0aGUgcmVzb3VyY2UgY29uZmlnLiBUaGVcbiAgICogXCJ1cHNlcnRcIiBmbGFnIHF1ZXVlcyBjcmVhdGVzIGFuZCB1cGRhdGVzIGFzIFwidXBkYXRlXCIgcm93cyAodGhlIHNlcnZlclxuICAgKiB1cHNlcnRzIGJ5IHJlc291cmNlIGlkKSBhbmQgZGVzdHJveXMgYXMgXCJkZWxldGVcIiByb3dzLlxuICAgKiBAcGFyYW0ge3tvcGVyYXRpb246IFwiY3JlYXRlXCIgfCBcInVwZGF0ZVwiIHwgXCJkZXN0cm95XCIsIHJlY29yZDogPywgcmVzb3VyY2VDb25maWc6IGltcG9ydChcIi4vc3luYy1jbGllbnQtdHlwZXMuanNcIikuU3luY0NsaWVudFJlc291cmNlQ29uZmlnfX0gYXJncyAtIE11dGF0aW9uIGFyZ3MuXG4gICAqIEByZXR1cm5zIHtzdHJpbmd9IFN5bmMgdHlwZS5cbiAgICovXG4gIGRlZmF1bHRTeW5jVHlwZSh7b3BlcmF0aW9uLCByZWNvcmQsIHJlc291cmNlQ29uZmlnfSkge1xuICAgIGlmICh0eXBlb2YgcmVzb3VyY2VDb25maWcuc3luY1R5cGUgPT09IFwiZnVuY3Rpb25cIikgcmV0dXJuIHJlc291cmNlQ29uZmlnLnN5bmNUeXBlKHtvcGVyYXRpb24sIHJlY29yZH0pXG4gICAgaWYgKG9wZXJhdGlvbiA9PT0gXCJkZXN0cm95XCIpIHJldHVybiBcImRlbGV0ZVwiXG4gICAgaWYgKHJlc291cmNlQ29uZmlnLnN5bmNUeXBlID09PSBcInVwc2VydFwiKSByZXR1cm4gXCJ1cGRhdGVcIlxuXG4gICAgcmV0dXJuIG9wZXJhdGlvblxuICB9XG5cbiAgLyoqXG4gICAqIERlcml2ZXMgdGhlIHB1bGwtYXBwbHkgcmVzb3VyY2UgY29uZmlncyBmcm9tIHRoZSBkZWNsYXJlZCByZXNvdXJjZXMuXG4gICAqIEByZXR1cm5zIHtSZWNvcmQ8c3RyaW5nLCBpbXBvcnQoXCIuL3N5bmMtYXBpLWNsaWVudC10eXBlcy5qc1wiKS5TeW5jUmVzb3VyY2VDb25maWc+fSBQdWxsLWFwcGx5IHJlc291cmNlIGNvbmZpZ3MuXG4gICAqL1xuICBwdWxsUmVzb3VyY2VDb25maWdzKCkge1xuICAgIHRoaXMuX3B1bGxSZXNvdXJjZUNvbmZpZ3MgfHw9IC8qKiBAdHlwZSB7UmVjb3JkPHN0cmluZywgaW1wb3J0KFwiLi9zeW5jLWFwaS1jbGllbnQtdHlwZXMuanNcIikuU3luY1Jlc291cmNlQ29uZmlnPn0gKi8gKE9iamVjdC5mcm9tRW50cmllcyhcbiAgICAgIE9iamVjdC5lbnRyaWVzKHRoaXMuY29uZmlnLnJlc291cmNlcylcbiAgICAgICAgLmZpbHRlcigoWywgcmVzb3VyY2VdKSA9PiBCb29sZWFuKHJlc291cmNlLmF0dHJpYnV0ZXMpKVxuICAgICAgICAubWFwKChbcmVzb3VyY2VUeXBlLCByZXNvdXJjZV0pID0+IFtyZXNvdXJjZVR5cGUsIHtcbiAgICAgICAgICBhZnRlckFwcGx5OiByZXNvdXJjZS5hZnRlckFwcGx5LFxuICAgICAgICAgIGF0dHJpYnV0ZXM6IC8qKiBAdHlwZSB7aW1wb3J0KFwiLi9zeW5jLWFwaS1jbGllbnQtdHlwZXMuanNcIikuU3luY1Jlc291cmNlQ29uZmlnW1wiYXR0cmlidXRlc1wiXX0gKi8gKHJlc291cmNlLmF0dHJpYnV0ZXMpLFxuICAgICAgICAgIGVuYWJsZWQ6IHRydWUsXG4gICAgICAgICAgZmluZFJlY29yZDogcmVzb3VyY2UuZmluZFJlY29yZCxcbiAgICAgICAgICBmaW5kUmVjb3JkRm9yRGVsZXRlOiByZXNvdXJjZS5maW5kUmVjb3JkRm9yRGVsZXRlLFxuICAgICAgICAgIG1vZGVsQ2xhc3M6IHJlc291cmNlLm1vZGVsQ2xhc3NcbiAgICAgICAgfV0pXG4gICAgKSlcblxuICAgIHJldHVybiB0aGlzLl9wdWxsUmVzb3VyY2VDb25maWdzXG4gIH1cbn1cblxuLyoqXG4gKiBCdWlsZHMgb25lIHJlc291cmNlIGNvbmZpZyBmcm9tIGEgbW9kZWwncyBgc3RhdGljIHN5bmNgIGRlY2xhcmF0aW9uIHBsdXMgaXRzXG4gKiBkZXJpdmVkIGNvbHVtbiBtZXRhZGF0YS5cbiAqIEBwYXJhbSB7e2RlY2xhcmF0aW9uOiBpbXBvcnQoXCIuL3N5bmMtY2xpZW50LXR5cGVzLmpzXCIpLk1vZGVsU3luY0RlY2xhcmF0aW9uLCBtb2RlbENsYXNzOiA/LCByZXNvdXJjZVR5cGU6IHN0cmluZ319IGFyZ3MgLSBEZWNsYXJhdGlvbiBhcmdzLlxuICogQHJldHVybnMge2ltcG9ydChcIi4vc3luYy1jbGllbnQtdHlwZXMuanNcIikuU3luY0NsaWVudFJlc291cmNlQ29uZmlnfSBEZXJpdmVkIHJlc291cmNlIGNvbmZpZy5cbiAqL1xuZnVuY3Rpb24gcmVzb3VyY2VDb25maWdGcm9tU3luY0RlY2xhcmF0aW9uKHtkZWNsYXJhdGlvbiwgbW9kZWxDbGFzcywgcmVzb3VyY2VUeXBlfSkge1xuICBjb25zdCBub3JtYWxpemVkRGVjbGFyYXRpb24gPSBkZWNsYXJhdGlvbiA9PT0gdHJ1ZSA/IHt9IDogZGVjbGFyYXRpb25cblxuICBpZiAoIW5vcm1hbGl6ZWREZWNsYXJhdGlvbiB8fCB0eXBlb2Ygbm9ybWFsaXplZERlY2xhcmF0aW9uICE9PSBcIm9iamVjdFwiIHx8IEFycmF5LmlzQXJyYXkobm9ybWFsaXplZERlY2xhcmF0aW9uKSkge1xuICAgIHRocm93IG5ldyBFcnJvcihgJHtyZXNvdXJjZVR5cGV9IHN0YXRpYyBzeW5jIG11c3QgYmUgdHJ1ZSBvciBhIHN5bmMgZGVjbGFyYXRpb24gb2JqZWN0LCBnb3Q6ICR7U3RyaW5nKGRlY2xhcmF0aW9uKX1gKVxuICB9XG5cbiAgY29uc3Qge2FmdGVyQXBwbHksIGF0dHJpYnV0ZXMsIGJvb2xlYW5BdHRyaWJ1dGVzLCBmaW5kUmVjb3JkLCBmaW5kUmVjb3JkRm9yRGVsZXRlLCBsb2NhbE9ubHlBdHRyaWJ1dGVzLCBwdWJsaXNoLCByZWFsdGltZSwgc3luY1R5cGUsIHRyYWNrLCB0cmFja2VkRGF0YSwgLi4ucmVzdERlY2xhcmF0aW9ufSA9IG5vcm1hbGl6ZWREZWNsYXJhdGlvblxuICBjb25zdCB1bmtub3duS2V5cyA9IE9iamVjdC5rZXlzKHJlc3REZWNsYXJhdGlvbilcblxuICAvLyBgcHVibGlzaGAgaXMgdGhlIHNlcnZlci1zaWRlIGhhbGYgb2YgdGhlIHNoYXJlZCBgc3RhdGljIHN5bmNgIGRlY2xhcmF0aW9uXG4gIC8vIChjb25zdW1lZCBieSBTeW5jUHVibGlzaGVyIG9uIHRoZSBiYWNrZW5kKSAtIHRoZSBjbGllbnQgZGVyaXZlcyBub3RoaW5nXG4gIC8vIGZyb20gaXQsIGJ1dCBtb2RlbHMgZGVjbGFyZWQgb25jZSBmb3IgYm90aCBzaWRlcyBtdXN0IHN0YXkgdmFsaWQgaGVyZS5cbiAgdm9pZCBwdWJsaXNoXG5cbiAgaWYgKHVua25vd25LZXlzLmxlbmd0aCA+IDApIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYCR7cmVzb3VyY2VUeXBlfSBzdGF0aWMgc3luYyByZWNlaXZlZCB1bmtub3duIGtleXM6ICR7dW5rbm93bktleXMuam9pbihcIiwgXCIpfSAoc3VwcG9ydGVkOiBhZnRlckFwcGx5LCBhdHRyaWJ1dGVzLCBib29sZWFuQXR0cmlidXRlcywgZmluZFJlY29yZCwgZmluZFJlY29yZEZvckRlbGV0ZSwgbG9jYWxPbmx5QXR0cmlidXRlcywgcHVibGlzaCwgcmVhbHRpbWUsIHN5bmNUeXBlLCB0cmFjaywgdHJhY2tlZERhdGEpYClcbiAgfVxuICBpZiAoc3luY1R5cGUgIT09IHVuZGVmaW5lZCAmJiB0eXBlb2Ygc3luY1R5cGUgIT09IFwiZnVuY3Rpb25cIiAmJiBzeW5jVHlwZSAhPT0gXCJ1cHNlcnRcIikge1xuICAgIHRocm93IG5ldyBFcnJvcihgJHtyZXNvdXJjZVR5cGV9IHN0YXRpYyBzeW5jIHN5bmNUeXBlIG11c3QgYmUgYSBmdW5jdGlvbiBvciB0aGUgc3RyaW5nIFwidXBzZXJ0XCIsIGdvdDogJHtTdHJpbmcoc3luY1R5cGUpfWApXG4gIH1cblxuICBjb25zdCBkZXJpdmVkID0gZGVyaXZlZFN5bmNBdHRyaWJ1dGVzKHttb2RlbENsYXNzLCByZXNvdXJjZVR5cGV9KVxuXG4gIHJldHVybiB7XG4gICAgYWZ0ZXJBcHBseSxcbiAgICBhdHRyaWJ1dGVzLFxuICAgIGJvb2xlYW5BdHRyaWJ1dGVzOiBtZXJnZWRBdHRyaWJ1dGVOYW1lcyhkZXJpdmVkLmJvb2xlYW5BdHRyaWJ1dGVzLCBib29sZWFuQXR0cmlidXRlcyksXG4gICAgZmluZFJlY29yZCxcbiAgICBmaW5kUmVjb3JkRm9yRGVsZXRlLFxuICAgIGxvY2FsT25seUF0dHJpYnV0ZXM6IG1lcmdlZEF0dHJpYnV0ZU5hbWVzKGRlcml2ZWQubG9jYWxPbmx5QXR0cmlidXRlcywgbG9jYWxPbmx5QXR0cmlidXRlcyksXG4gICAgbW9kZWxDbGFzcyxcbiAgICByZWFsdGltZSxcbiAgICBzeW5jVHlwZSxcbiAgICB0cmFjazogbm9ybWFsaXplZFRyYWNrKHRyYWNrKSxcbiAgICB0cmFja2VkRGF0YVxuICB9XG59XG5cbi8qKlxuICogRGVyaXZlcyBib29sZWFuIGFuZCBsb2NhbC1vbmx5IGF0dHJpYnV0ZSBuYW1lcyBmcm9tIGEgbW9kZWwncyBjb2x1bW4gbWV0YWRhdGE6XG4gKiBib29sZWFucyBmcm9tIGJvb2xlYW4gY29sdW1uIHR5cGVzOyBsb2NhbC1vbmx5IGZyb20gdGhlIHByaW1hcnkga2V5LFxuICogY3JlYXRlZEF0L3VwZGF0ZWRBdCwgYW5kIHN5bmMgYm9va2tlZXBpbmcgY29sdW1ucy5cbiAqIEBwYXJhbSB7e21vZGVsQ2xhc3M6ID8sIHJlc291cmNlVHlwZTogc3RyaW5nfX0gYXJncyAtIERlcml2YXRpb24gYXJncy5cbiAqIEByZXR1cm5zIHt7Ym9vbGVhbkF0dHJpYnV0ZXM6IHN0cmluZ1tdLCBsb2NhbE9ubHlBdHRyaWJ1dGVzOiBzdHJpbmdbXX19IERlcml2ZWQgYXR0cmlidXRlIG5hbWVzLlxuICovXG5mdW5jdGlvbiBkZXJpdmVkU3luY0F0dHJpYnV0ZXMoe21vZGVsQ2xhc3MsIHJlc291cmNlVHlwZX0pIHtcbiAgaWYgKFxuICAgIHR5cGVvZiBtb2RlbENsYXNzLmdldENvbHVtbk5hbWVzICE9PSBcImZ1bmN0aW9uXCIgfHxcbiAgICB0eXBlb2YgbW9kZWxDbGFzcy5nZXRDb2x1bW5OYW1lVG9BdHRyaWJ1dGVOYW1lTWFwICE9PSBcImZ1bmN0aW9uXCIgfHxcbiAgICB0eXBlb2YgbW9kZWxDbGFzcy5nZXRDb2x1bW5UeXBlQnlOYW1lICE9PSBcImZ1bmN0aW9uXCIgfHxcbiAgICB0eXBlb2YgbW9kZWxDbGFzcy5wcmltYXJ5S2V5ICE9PSBcImZ1bmN0aW9uXCIgfHxcbiAgICB0eXBlb2YgbW9kZWxDbGFzcy5oYXNQcmltYXJ5S2V5ICE9PSBcImZ1bmN0aW9uXCJcbiAgKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGAke3Jlc291cmNlVHlwZX0gc3RhdGljIHN5bmMgcmVxdWlyZXMgYSBWZWxvY2lvdXMgbW9kZWwgY2xhc3Mgd2l0aCBjb2x1bW4gbWV0YWRhdGEgKGdldENvbHVtbk5hbWVzLCBnZXRDb2x1bW5OYW1lVG9BdHRyaWJ1dGVOYW1lTWFwLCBnZXRDb2x1bW5UeXBlQnlOYW1lLCBwcmltYXJ5S2V5LCBoYXNQcmltYXJ5S2V5KWApXG4gIH1cblxuICBjb25zdCBjb2x1bW5OYW1lVG9BdHRyaWJ1dGVOYW1lID0gbW9kZWxDbGFzcy5nZXRDb2x1bW5OYW1lVG9BdHRyaWJ1dGVOYW1lTWFwKClcbiAgLyoqIEB0eXBlIHtzdHJpbmdbXX0gKi9cbiAgY29uc3QgYm9vbGVhbkF0dHJpYnV0ZXMgPSBbXVxuICAvKiogQHR5cGUge3N0cmluZ1tdfSAqL1xuICBjb25zdCBsb2NhbE9ubHlBdHRyaWJ1dGVzID0gW11cblxuICBpZiAobW9kZWxDbGFzcy5oYXNQcmltYXJ5S2V5KCkpIHtcbiAgICBjb25zdCBwcmltYXJ5S2V5Q29sdW1uID0gbW9kZWxDbGFzcy5wcmltYXJ5S2V5KClcblxuICAgIGxvY2FsT25seUF0dHJpYnV0ZXMucHVzaChjb2x1bW5OYW1lVG9BdHRyaWJ1dGVOYW1lW3ByaW1hcnlLZXlDb2x1bW5dIHx8IHByaW1hcnlLZXlDb2x1bW4pXG4gIH1cblxuICBmb3IgKGNvbnN0IGNvbHVtbk5hbWUgb2YgbW9kZWxDbGFzcy5nZXRDb2x1bW5OYW1lcygpKSB7XG4gICAgY29uc3QgYXR0cmlidXRlTmFtZSA9IGNvbHVtbk5hbWVUb0F0dHJpYnV0ZU5hbWVbY29sdW1uTmFtZV0gfHwgY29sdW1uTmFtZVxuICAgIGNvbnN0IGNvbHVtblR5cGUgPSBtb2RlbENsYXNzLmdldENvbHVtblR5cGVCeU5hbWUoY29sdW1uTmFtZSlcblxuICAgIGlmIChMT0NBTF9CT09LS0VFUElOR19BVFRSSUJVVEVfTkFNRVMuaW5jbHVkZXMoYXR0cmlidXRlTmFtZSkgJiYgIWxvY2FsT25seUF0dHJpYnV0ZXMuaW5jbHVkZXMoYXR0cmlidXRlTmFtZSkpIHtcbiAgICAgIGxvY2FsT25seUF0dHJpYnV0ZXMucHVzaChhdHRyaWJ1dGVOYW1lKVxuICAgIH1cbiAgICBpZiAoY29sdW1uVHlwZSAmJiBpc0Jvb2xlYW5Db2x1bW5UeXBlKGNvbHVtblR5cGUpKSB7XG4gICAgICBib29sZWFuQXR0cmlidXRlcy5wdXNoKGF0dHJpYnV0ZU5hbWUpXG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHtib29sZWFuQXR0cmlidXRlcywgbG9jYWxPbmx5QXR0cmlidXRlc31cbn1cblxuLyoqXG4gKiBNZXJnZXMgZGVyaXZlZCBhdHRyaWJ1dGUgbmFtZXMgd2l0aCBkZWNsYXJlZCBleHRyYXMgaW50byBhIHNvcnRlZCwgZHVwbGljYXRlLWZyZWUgbGlzdC5cbiAqIEBwYXJhbSB7c3RyaW5nW119IGRlcml2ZWQgLSBEZXJpdmVkIGF0dHJpYnV0ZSBuYW1lcy5cbiAqIEBwYXJhbSB7c3RyaW5nW10gfCB1bmRlZmluZWR9IGRlY2xhcmVkIC0gRGVjbGFyZWQgZXh0cmEgYXR0cmlidXRlIG5hbWVzLlxuICogQHJldHVybnMge3N0cmluZ1tdfSBNZXJnZWQgYXR0cmlidXRlIG5hbWVzLlxuICovXG5mdW5jdGlvbiBtZXJnZWRBdHRyaWJ1dGVOYW1lcyhkZXJpdmVkLCBkZWNsYXJlZCkge1xuICByZXR1cm4gWy4uLm5ldyBTZXQoWy4uLmRlcml2ZWQsIC4uLihkZWNsYXJlZCB8fCBbXSldKV0uc29ydCgpXG59XG5cbi8qKlxuICogTm9ybWFsaXplcyBhIGRlY2xhcmF0aW9uJ3MgdHJhY2sgdmFsdWU6IGFuIG9wZXJhdGlvbnMgYXJyYXkgaXMgc2hvcnRoYW5kIGZvclxuICogdGhlIHtvcGVyYXRpb25zfSBmb3JtLlxuICogQHBhcmFtIHtpbXBvcnQoXCIuL3N5bmMtY2xpZW50LXR5cGVzLmpzXCIpLk1vZGVsU3luY0RlY2xhcmF0aW9uQ29uZmlnW1widHJhY2tcIl19IHRyYWNrIC0gRGVjbGFyZWQgdHJhY2sgdmFsdWUuXG4gKiBAcmV0dXJucyB7aW1wb3J0KFwiLi9zeW5jLWNsaWVudC10eXBlcy5qc1wiKS5TeW5jQ2xpZW50UmVzb3VyY2VDb25maWdbXCJ0cmFja1wiXX0gTm9ybWFsaXplZCB0cmFjayB2YWx1ZS5cbiAqL1xuZnVuY3Rpb24gbm9ybWFsaXplZFRyYWNrKHRyYWNrKSB7XG4gIGlmIChBcnJheS5pc0FycmF5KHRyYWNrKSkgcmV0dXJuIHtvcGVyYXRpb25zOiB0cmFja31cblxuICByZXR1cm4gdHJhY2tcbn1cblxuLyoqXG4gKiBCdWlsZHMgYSBmcmFtZXdvcmstb3duZWQgc3luYyBlbmRwb2ludCBQT1NUZXIgb3ZlciB0aGUgY29uZmlndXJlZCB0cmFuc3BvcnQuXG4gKiBAcGFyYW0ge3twYXRoOiBzdHJpbmcsIHRyYW5zcG9ydDogaW1wb3J0KFwiLi4vY29uZmlndXJhdGlvbi10eXBlcy5qc1wiKS5WZWxvY2lvdXNTeW5jQ2xpZW50VHJhbnNwb3J0fX0gYXJncyAtIFBvc3RlciBhcmdzLlxuICogQHJldHVybnMgeyhwYXlsb2FkOiBSZWNvcmQ8c3RyaW5nLCA/PikgPT4gUHJvbWlzZTw/Pn0gU3luYyBlbmRwb2ludCBQT1NUZXIuXG4gKi9cbmZ1bmN0aW9uIHRyYW5zcG9ydFBvc3Rlcih7cGF0aCwgdHJhbnNwb3J0fSkge1xuICByZXR1cm4gYXN5bmMgKHBheWxvYWQpID0+IHtcbiAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IHRyYW5zcG9ydC5wb3N0KHBhdGgsIHBheWxvYWQpXG5cbiAgICBpZiAoIXJlc3BvbnNlIHx8IHR5cGVvZiByZXNwb25zZS5qc29uICE9PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgc3luYy5jbGllbnQgdHJhbnNwb3J0LnBvc3QgbXVzdCByZXNvbHZlIHRvIGEgcmVzcG9uc2Ugd2l0aCBhIGpzb24oKSBtZXRob2QgZm9yICR7cGF0aH0gKGxpa2UgdGhlIGZyb250ZW5kLW1vZGVsIHdlYnNvY2tldCBjbGllbnQpYClcbiAgICB9XG5cbiAgICByZXR1cm4gYXdhaXQgcmVzcG9uc2UuanNvbigpXG4gIH1cbn1cblxuLyoqXG4gKiBMYXppbHkgYnVpbGRzIChhbmQgbWVtb2l6ZXMgcGVyIGNvbmZpZ3VyYXRpb24pIHRoZSBzeW5jIGNsaWVudCBkZXJpdmVkIGZyb20gdGhlXG4gKiBhcHAncyBWZWxvY2lvdXMgY29uZmlndXJhdGlvbiBhbmQgcmVnaXN0ZXJzIGl0IGFzIHRoZSBjdXJyZW50IHN5bmMgY2xpZW50LlxuICogQHBhcmFtIHtDb25maWd1cmF0aW9ufSBbY29uZmlndXJhdGlvbl0gLSBDb25maWd1cmF0aW9uIG93bmluZyB0aGUgcmVnaXN0ZXJlZCBtb2RlbHMgYW5kIHRoZSBzeW5jLmNsaWVudCBibG9jay4gRGVmYXVsdHMgdG8gdGhlIGN1cnJlbnQgY29uZmlndXJhdGlvbi5cbiAqIEByZXR1cm5zIHtTeW5jQ2xpZW50fSBNZW1vaXplZCBzeW5jIGNsaWVudCBmb3IgdGhlIGNvbmZpZ3VyYXRpb24uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzeW5jQ2xpZW50KGNvbmZpZ3VyYXRpb24gPSBDb25maWd1cmF0aW9uLmN1cnJlbnQoKSkge1xuICBsZXQgY2xpZW50ID0gc3luY0NsaWVudHNCeUNvbmZpZ3VyYXRpb24uZ2V0KGNvbmZpZ3VyYXRpb24pXG5cbiAgaWYgKCFjbGllbnQpIHtcbiAgICBjbGllbnQgPSBTeW5jQ2xpZW50LmZyb21Db25maWd1cmF0aW9uKGNvbmZpZ3VyYXRpb24pXG4gICAgc3luY0NsaWVudHNCeUNvbmZpZ3VyYXRpb24uc2V0KGNvbmZpZ3VyYXRpb24sIGNsaWVudClcbiAgICBjbGllbnQuc2V0Q3VycmVudCgpXG4gIH1cblxuICByZXR1cm4gY2xpZW50XG59XG5cbi8qKlxuICogRGVjbGFyZXMgYSBzeW5jIHNjb3BlIG9uIHRoZSBjdXJyZW50IHN5bmMgY2xpZW50LlxuICogQHBhcmFtIHtpbXBvcnQoXCIuLi9kYXRhYmFzZS9xdWVyeS9tb2RlbC1jbGFzcy1xdWVyeS5qc1wiKS5kZWZhdWx0PD8+fSBxdWVyeSAtIFF1ZXJ5IGRlY2xhcmluZyB0aGUgc3luYyBzY29wZS5cbiAqIEByZXR1cm5zIHtQcm9taXNlPHtzY29wZTogaW1wb3J0KFwiLi9zeW5jLWNsaWVudC10eXBlcy5qc1wiKS5TZXJpYWxpemVkU3luY1Njb3BlLCBwdWxsZWQ6IGltcG9ydChcIi4vc3luYy1hcGktY2xpZW50LXR5cGVzLmpzXCIpLlN5bmNDaGFuZ2VzUmVzdWx0IHwgbnVsbH0+fSBEZWNsYXJlZCBzY29wZSBhbmQgcHVsbCByZXN1bHQuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBzeW5jKHF1ZXJ5KSB7XG4gIHJldHVybiBhd2FpdCBTeW5jQ2xpZW50LmN1cnJlbnQoKS5zeW5jKHF1ZXJ5KVxufVxuIl19
|
|
@@ -30,6 +30,8 @@ export default class SyncRealtimeBridge {
|
|
|
30
30
|
}>;
|
|
31
31
|
/** @type {VelociousSyncRealtimeWebsocketClient | null} */
|
|
32
32
|
_client: VelociousSyncRealtimeWebsocketClient | null;
|
|
33
|
+
/** @type {boolean} Whether the bridge created its own client (deprecated per-cycle path) and must disconnect it on unsubscribe. A shared connection is never owned. */
|
|
34
|
+
_ownsClient: boolean;
|
|
33
35
|
/** @type {Promise<void>} */
|
|
34
36
|
_applyPromise: Promise<void>;
|
|
35
37
|
/** @type {number} Subscription generation - bumped by unsubscribe so in-flight subscribes detect they became stale. */
|
|
@@ -60,9 +62,12 @@ export default class SyncRealtimeBridge {
|
|
|
60
62
|
*/
|
|
61
63
|
_subscribe(context: unknown): Promise<void>;
|
|
62
64
|
/**
|
|
63
|
-
* Closes every channel subscription
|
|
64
|
-
*
|
|
65
|
-
*
|
|
65
|
+
* Closes every channel subscription (idempotent). The websocket is
|
|
66
|
+
* disconnected only when the bridge owns it (deprecated per-cycle
|
|
67
|
+
* `realtime.createClient` path); a shared app-lifetime connection stays open
|
|
68
|
+
* so unsubscribing drops subscriptions without tearing down the socket. Also
|
|
69
|
+
* marks any in-flight subscribe attempt stale so it tears itself down instead
|
|
70
|
+
* of finishing the subscription afterwards.
|
|
66
71
|
* @returns {Promise<void>}
|
|
67
72
|
*/
|
|
68
73
|
unsubscribe(): Promise<void>;
|
|
@@ -84,10 +89,19 @@ export default class SyncRealtimeBridge {
|
|
|
84
89
|
*/
|
|
85
90
|
waitForApplied(): Promise<void>;
|
|
86
91
|
/**
|
|
87
|
-
* Resolves the realtime configuration,
|
|
88
|
-
*
|
|
92
|
+
* Resolves the realtime configuration block, or null when the app declared
|
|
93
|
+
* none (valid when a shared connection is configured).
|
|
94
|
+
* @returns {import("../configuration-types.js").VelociousSyncClientRealtimeConfiguration | null} Realtime configuration, or null.
|
|
89
95
|
*/
|
|
90
|
-
realtimeConfiguration(): import("../configuration-types.js").VelociousSyncClientRealtimeConfiguration;
|
|
96
|
+
realtimeConfiguration(): import("../configuration-types.js").VelociousSyncClientRealtimeConfiguration | null;
|
|
97
|
+
/**
|
|
98
|
+
* Resolves the realtime configuration and asserts a websocket client source
|
|
99
|
+
* exists: a shared connection rides its own lifecycle, otherwise the
|
|
100
|
+
* deprecated per-cycle `realtime.createClient` must be configured.
|
|
101
|
+
* @param {import("../configuration-types.js").VelociousSyncRealtimeWebsocketClient | null} sharedClient - Shared connection, or null.
|
|
102
|
+
* @returns {import("../configuration-types.js").VelociousSyncClientRealtimeConfiguration | null} Realtime configuration, or null.
|
|
103
|
+
*/
|
|
104
|
+
requireClientSource(sharedClient: import("../configuration-types.js").VelociousSyncRealtimeWebsocketClient | null): import("../configuration-types.js").VelociousSyncClientRealtimeConfiguration | null;
|
|
91
105
|
/**
|
|
92
106
|
* Derives the channel descriptors to subscribe: one framework sync channel
|
|
93
107
|
* subscription per declared pull scope (the params mirror the scope's
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sync-realtime-bridge.d.ts","sourceRoot":"","sources":["../../../src/sync/sync-realtime-bridge.js"],"names":[],"mappings":"AAKA,mIAAmI;AACnI,+HAA+H;AAE/H;;;;;;;;;;;;GAYG;AACH;IACE;;;OAGG;IACH,4BAFW;QAAC,UAAU,EAAE,OAAO,kBAAkB,EAAE,OAAO,CAAA;KAAC,
|
|
1
|
+
{"version":3,"file":"sync-realtime-bridge.d.ts","sourceRoot":"","sources":["../../../src/sync/sync-realtime-bridge.js"],"names":[],"mappings":"AAKA,mIAAmI;AACnI,+HAA+H;AAE/H;;;;;;;;;;;;GAYG;AACH;IACE;;;OAGG;IACH,4BAFW;QAAC,UAAU,EAAE,OAAO,kBAAkB,EAAE,OAAO,CAAA;KAAC,EAoB1D;IAjBC,+CAA4B;IAC5B,yJAAyJ;IACzJ,WADW,KAAK,CAAC;QAAC,OAAO,EAAE,MAAM,CAAC;QAAC,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;QAAC,YAAY,EAAE,OAAO,2BAA2B,EAAE,iCAAiC,CAAA;KAAC,CAAC,CAClI;IACnB,0DAA0D;IAC1D,SADW,oCAAoC,GAAG,IAAI,CACnC;IACnB,uKAAuK;IACvK,aADW,OAAO,CACM;IACxB,4BAA4B;IAC5B,eADW,OAAO,CAAC,IAAI,CAAC,CACc;IACtC,uHAAuH;IACvH,aADW,MAAM,CACG;IACpB,mCAAmC;IACnC,gBADW,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CACL;IAC1B,mCAAmC;IACnC,mBADW,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CACF;IAC7B,4DAA4D;IAC5D,QADW,YAAY,GAAG,aAAa,GAAG,cAAc,CAC5B;IAG9B;;;;;;OAMG;IACH,oBAHW,OAAC,GACC,OAAO,CAAC,IAAI,CAAC,CAYzB;IAED;;;;;;;;;OASG;IACH,oBAHW,OAAC,GACC,OAAO,CAAC,IAAI,CAAC,CAgGzB;IAED;;;;;;;;OAQG;IACH,eAFa,OAAO,CAAC,IAAI,CAAC,CAmBzB;IAED;;;OAGG;IACH,UAFa;QAAC,QAAQ,EAAE,KAAK,CAAC;YAAC,OAAO,EAAE,MAAM,CAAC;YAAC,KAAK,EAAE,OAAO,CAAC;YAAC,YAAY,EAAE,MAAM,GAAG,IAAI,CAAA;SAAC,CAAC,CAAC;QAAC,KAAK,EAAE,YAAY,GAAG,aAAa,GAAG,cAAc,CAAA;KAAC,CAOnJ;IAED;;;OAGG;IACH,kBAFa,OAAO,CAAC,IAAI,CAAC,CAKzB;IAED;;;;OAIG;IACH,yBAFa,OAAO,2BAA2B,EAAE,wCAAwC,GAAG,IAAI,CAI/F;IAED;;;;;;OAMG;IACH,kCAHW,OAAO,2BAA2B,EAAE,oCAAoC,GAAG,IAAI,GAC7E,OAAO,2BAA2B,EAAE,wCAAwC,GAAG,IAAI,CAU/F;IAED;;;;;;;;OAQG;IACH,4BAHW,OAAC,GACC,OAAO,CAAC,KAAK,CAAC,sCAAsC,CAAC,CAAC,CA6BlE;IAED;;;;;;;;;;;OAWG;IACH,mCAHW;QAAC,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,OAAC,CAAC,CAAC;QAAC,YAAY,EAAE,MAAM,CAAA;KAAC,GACnD,MAAM,CAAC,MAAM,EAAE,OAAC,CAAC,CAkB7B;IAED;;;;;OAKG;IACH,qCAHW;QAAC,IAAI,EAAE,OAAC,CAAC;QAAC,YAAY,EAAE,MAAM,GAAG,IAAI,CAAA;KAAC,GACpC,IAAI,CAUhB;IAED;;;;;;OAMG;IACH,qCAHW;QAAC,IAAI,EAAE,OAAC,CAAC;QAAC,YAAY,EAAE,MAAM,GAAG,IAAI,CAAA;KAAC,GACpC,OAAO,CAAC,IAAI,CAAC,CAuBzB;IAED;;;;;OAKG;IACH,gBAFa,IAAI,CAchB;CACF;qDArXa,OAAO,2BAA2B,EAAE,sCAAsC;mDAC1E,OAAO,2BAA2B,EAAE,oCAAoC"}
|