@pipeline-builder/api-server 3.4.150 → 3.4.151
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/lib/api/meter-quota.js
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
// Copyright 2026 Pipeline Builder Contributors
|
|
2
2
|
// SPDX-License-Identifier: Apache-2.0
|
|
3
3
|
import { incrementQuota, isServicePrincipal, createLogger } from '@pipeline-builder/api-core';
|
|
4
|
+
import { getContext } from './get-context.js';
|
|
4
5
|
const logger = createLogger('meter-quota');
|
|
5
6
|
/**
|
|
6
7
|
* Middleware that METERS (increments) a quota counter once per SUCCESSFUL
|
|
@@ -38,8 +39,19 @@ export function meterQuotaOnSuccess(quotaService, quotaType) {
|
|
|
38
39
|
// Only successful responses are billable.
|
|
39
40
|
if (res.statusCode < 200 || res.statusCode >= 300)
|
|
40
41
|
return;
|
|
41
|
-
//
|
|
42
|
-
|
|
42
|
+
// Resolve the org id from the SAME source `checkQuota` reads —
|
|
43
|
+
// `getContext().identity.orgId`, which is normalized (trimmed + lowercased).
|
|
44
|
+
// Metering off the raw `req.user.organizationId` while the gate checks the
|
|
45
|
+
// normalized id would land increments on a different key than the check
|
|
46
|
+
// reads (a silent bypass if an org id ever carries mixed case). Fall back to
|
|
47
|
+
// the raw auth org only when context middleware isn't mounted.
|
|
48
|
+
let orgId;
|
|
49
|
+
try {
|
|
50
|
+
orgId = getContext(req).identity.orgId;
|
|
51
|
+
}
|
|
52
|
+
catch {
|
|
53
|
+
orgId = req.user?.organizationId;
|
|
54
|
+
}
|
|
43
55
|
if (!orgId)
|
|
44
56
|
return;
|
|
45
57
|
// Internal service-to-service calls must not consume a tenant's quota.
|
|
@@ -55,4 +67,4 @@ export function meterQuotaOnSuccess(quotaService, quotaType) {
|
|
|
55
67
|
next();
|
|
56
68
|
};
|
|
57
69
|
}
|
|
58
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
70
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWV0ZXItcXVvdGEuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvYXBpL21ldGVyLXF1b3RhLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLCtDQUErQztBQUMvQyxzQ0FBc0M7QUFFdEMsT0FBTyxFQUFFLGNBQWMsRUFBRSxrQkFBa0IsRUFBRSxZQUFZLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUc5RixPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFFOUMsTUFBTSxNQUFNLEdBQUcsWUFBWSxDQUFDLGFBQWEsQ0FBQyxDQUFDO0FBRTNDOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBNEJHO0FBQ0gsTUFBTSxVQUFVLG1CQUFtQixDQUFDLFlBQTBCLEVBQUUsU0FBb0I7SUFDbEYsT0FBTyxDQUFDLEdBQVksRUFBRSxHQUFhLEVBQUUsSUFBa0IsRUFBUSxFQUFFO1FBQy9ELEdBQUcsQ0FBQyxFQUFFLENBQUMsUUFBUSxFQUFFLEdBQUcsRUFBRTtZQUNwQixJQUFJLENBQUM7Z0JBQ0gsMENBQTBDO2dCQUMxQyxJQUFJLEdBQUcsQ0FBQyxVQUFVLEdBQUcsR0FBRyxJQUFJLEdBQUcsQ0FBQyxVQUFVLElBQUksR0FBRztvQkFBRSxPQUFPO2dCQUMxRCwrREFBK0Q7Z0JBQy9ELDZFQUE2RTtnQkFDN0UsMkVBQTJFO2dCQUMzRSx3RUFBd0U7Z0JBQ3hFLDZFQUE2RTtnQkFDN0UsK0RBQStEO2dCQUMvRCxJQUFJLEtBQXlCLENBQUM7Z0JBQzlCLElBQUksQ0FBQztvQkFBQyxLQUFLLEdBQUcsVUFBVSxDQUFDLEdBQUcsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUM7Z0JBQUMsQ0FBQztnQkFBQyxNQUFNLENBQUM7b0JBQUMsS0FBSyxHQUFHLEdBQUcsQ0FBQyxJQUFJLEVBQUUsY0FBYyxDQUFDO2dCQUFDLENBQUM7Z0JBQzNGLElBQUksQ0FBQyxLQUFLO29CQUFFLE9BQU87Z0JBQ25CLHVFQUF1RTtnQkFDdkUsSUFBSSxrQkFBa0IsQ0FBQyxHQUFHLENBQUM7b0JBQUUsT0FBTztnQkFDcEMsY0FBYyxDQUNaLFlBQVksRUFDWixLQUFLLEVBQ0wsU0FBUyxFQUNULEdBQUcsQ0FBQyxPQUFPLENBQUMsYUFBYSxJQUFJLEVBQUUsRUFDL0IsQ0FBQyxPQUFPLEVBQUUsSUFBSSxFQUFFLEVBQUUsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxJQUErQixDQUFDLENBQ3pFLENBQUM7WUFDSixDQUFDO1lBQUMsTUFBTSxDQUFDO2dCQUNQLHVFQUF1RTtnQkFDdkUsd0VBQXdFO1lBQzFFLENBQUM7UUFDSCxDQUFDLENBQUMsQ0FBQztRQUNILElBQUksRUFBRSxDQUFDO0lBQ1QsQ0FBQyxDQUFDO0FBQ0osQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8vIENvcHlyaWdodCAyMDI2IFBpcGVsaW5lIEJ1aWxkZXIgQ29udHJpYnV0b3JzXG4vLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuXG5pbXBvcnQgeyBpbmNyZW1lbnRRdW90YSwgaXNTZXJ2aWNlUHJpbmNpcGFsLCBjcmVhdGVMb2dnZXIgfSBmcm9tICdAcGlwZWxpbmUtYnVpbGRlci9hcGktY29yZSc7XG5pbXBvcnQgdHlwZSB7IFF1b3RhVHlwZSwgUXVvdGFTZXJ2aWNlIH0gZnJvbSAnQHBpcGVsaW5lLWJ1aWxkZXIvYXBpLWNvcmUnO1xuaW1wb3J0IHR5cGUgeyBSZXF1ZXN0LCBSZXNwb25zZSwgTmV4dEZ1bmN0aW9uIH0gZnJvbSAnZXhwcmVzcyc7XG5pbXBvcnQgeyBnZXRDb250ZXh0IH0gZnJvbSAnLi9nZXQtY29udGV4dC5qcyc7XG5cbmNvbnN0IGxvZ2dlciA9IGNyZWF0ZUxvZ2dlcignbWV0ZXItcXVvdGEnKTtcblxuLyoqXG4gKiBNaWRkbGV3YXJlIHRoYXQgTUVURVJTIChpbmNyZW1lbnRzKSBhIHF1b3RhIGNvdW50ZXIgb25jZSBwZXIgU1VDQ0VTU0ZVTFxuICogcmVxdWVzdCwgb24gcmVzcG9uc2UgYGZpbmlzaGAuXG4gKlxuICogVGhlIGNvbXBsZW1lbnQgdG8ge0BsaW5rIGNoZWNrUXVvdGF9OiBgY2hlY2tRdW90YWAgb25seSBHQVRFUyAocmVhZHMgY3VycmVudFxuICogdXNhZ2UgYW5kIDQyOXMgd2hlbiBvdmVyKSDigJQgaXQgbmV2ZXIgaW5jcmVtZW50cywgc28gYSBzZXJ2aWNlIHRoYXQgbW91bnRzIGl0XG4gKiBidXQgbmV2ZXIgY2FsbHMgYGluY3JlbWVudFF1b3RhYCBjaGVja3MgYWdhaW5zdCBhIGNvdW50ZXIgdGhhdCBpdHMgb3duIHRyYWZmaWNcbiAqIG5ldmVyIG1vdmVzICh0aGUgbWV0ZXJpbmcgZ2FwIHRoaXMgZml4ZXMgZm9yIHRoZSBjb21wbGlhbmNlIHNlcnZpY2UpLiBNb3VudFxuICogdGhpcyBBTE9OR1NJREUgdGhlIGF1dGgvb3JnIGNoYWluIHRvIGNsb3NlIHRoZSBsb29wIHdpdGggb25lIGxpbmUgaW5zdGVhZCBvZlxuICogdGhyZWFkaW5nIGBxdW90YVNlcnZpY2VgICsgYSBtYW51YWwgYGluY3JlbWVudFF1b3RhRnJvbUN0eGAgdGhyb3VnaCBldmVyeVxuICogcm91dGUgZmFjdG9yeSBhbmQgaGFuZGxlci5cbiAqXG4gKiBGaXJlLWFuZC1mb3JnZXQgKyBmYWlsLXNhZmUgYnkgY29uc3RydWN0aW9uOlxuICogLSBydW5zIGluIGEgYGZpbmlzaGAgbGlzdGVuZXIsIHNvIGl0IG5ldmVyIGJsb2NrcyBvciBmYWlscyB0aGUgcmVzcG9uc2U7XG4gKiAtIGBpbmNyZW1lbnRRdW90YWAgc3dhbGxvd3MgaXRzIG93biBlcnJvcnMgKGxvZ3MgYSB3YXJuaW5nKTtcbiAqIC0gb25seSAyeHggcmVzcG9uc2VzIGFyZSBtZXRlcmVkIChhIHJlamVjdGVkL2Vycm9yZWQgcmVxdWVzdCBjb3N0cyBub3RoaW5nKTtcbiAqIC0gYSByZXF1ZXN0IHdpdGggbm8gVkVSSUZJRUQgb3JnIChgcmVxLnVzZXIub3JnYW5pemF0aW9uSWRgIOKAlCBzZXQgYnlcbiAqICAgcmVxdWlyZUF1dGgsIG5ldmVyIHRoZSBzcG9vZmFibGUgaGVhZGVyIGlkZW50aXR5KSBpcyBza2lwcGVkXG4gKiAgICh1bmF1dGhlbnRpY2F0ZWQgLyBoZWFsdGggLyBlYXJseS10ZXJtaW5hdGVkKTtcbiAqIC0gU0VSVklDRS1QUklOQ0lQQUwgY2FsbGVycyBhcmUgc2tpcHBlZDogaW50ZXJuYWwgc2VydmljZS10by1zZXJ2aWNlIHRyYWZmaWNcbiAqICAgKGUuZy4gYSBwZWVyIGNhbGxpbmcgY29tcGxpYW5jZSBgdmFsaWRhdGVgKSBtdXN0IG5vdCBidXJuIGEgdGVuYW50J3MgcXVvdGEg4oCUXG4gKiAgIHRoZSBvcmlnaW5hdGluZyBzZXJ2aWNlIGFscmVhZHkgbWV0ZXJzIHRoZSB1c2VyIGFjdGlvbiB0aGF0IHRyaWdnZXJlZCBpdC5cbiAqXG4gKiBEbyBOT1QgY29tYmluZSB0aGlzIHdpdGggYSBoYW5kbGVyIHRoYXQgYWxyZWFkeSBjYWxscyBgaW5jcmVtZW50UXVvdGFGcm9tQ3R4YFxuICogZm9yIHRoZSBzYW1lIHF1b3RhIHR5cGUgb24gdGhlIHNhbWUgcm91dGUg4oCUIHRoYXQgZG91YmxlLWNvdW50cy5cbiAqXG4gKiBAcGFyYW0gcXVvdGFTZXJ2aWNlIC0gUXVvdGEgc2VydmljZSBjbGllbnRcbiAqIEBwYXJhbSBxdW90YVR5cGUgLSBXaGljaCBxdW90YSB0byBtZXRlciAoZS5nLiAnYXBpQ2FsbHMnKVxuICovXG5leHBvcnQgZnVuY3Rpb24gbWV0ZXJRdW90YU9uU3VjY2VzcyhxdW90YVNlcnZpY2U6IFF1b3RhU2VydmljZSwgcXVvdGFUeXBlOiBRdW90YVR5cGUpIHtcbiAgcmV0dXJuIChyZXE6IFJlcXVlc3QsIHJlczogUmVzcG9uc2UsIG5leHQ6IE5leHRGdW5jdGlvbik6IHZvaWQgPT4ge1xuICAgIHJlcy5vbignZmluaXNoJywgKCkgPT4ge1xuICAgICAgdHJ5IHtcbiAgICAgICAgLy8gT25seSBzdWNjZXNzZnVsIHJlc3BvbnNlcyBhcmUgYmlsbGFibGUuXG4gICAgICAgIGlmIChyZXMuc3RhdHVzQ29kZSA8IDIwMCB8fCByZXMuc3RhdHVzQ29kZSA+PSAzMDApIHJldHVybjtcbiAgICAgICAgLy8gUmVzb2x2ZSB0aGUgb3JnIGlkIGZyb20gdGhlIFNBTUUgc291cmNlIGBjaGVja1F1b3RhYCByZWFkcyDigJRcbiAgICAgICAgLy8gYGdldENvbnRleHQoKS5pZGVudGl0eS5vcmdJZGAsIHdoaWNoIGlzIG5vcm1hbGl6ZWQgKHRyaW1tZWQgKyBsb3dlcmNhc2VkKS5cbiAgICAgICAgLy8gTWV0ZXJpbmcgb2ZmIHRoZSByYXcgYHJlcS51c2VyLm9yZ2FuaXphdGlvbklkYCB3aGlsZSB0aGUgZ2F0ZSBjaGVja3MgdGhlXG4gICAgICAgIC8vIG5vcm1hbGl6ZWQgaWQgd291bGQgbGFuZCBpbmNyZW1lbnRzIG9uIGEgZGlmZmVyZW50IGtleSB0aGFuIHRoZSBjaGVja1xuICAgICAgICAvLyByZWFkcyAoYSBzaWxlbnQgYnlwYXNzIGlmIGFuIG9yZyBpZCBldmVyIGNhcnJpZXMgbWl4ZWQgY2FzZSkuIEZhbGwgYmFjayB0b1xuICAgICAgICAvLyB0aGUgcmF3IGF1dGggb3JnIG9ubHkgd2hlbiBjb250ZXh0IG1pZGRsZXdhcmUgaXNuJ3QgbW91bnRlZC5cbiAgICAgICAgbGV0IG9yZ0lkOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gICAgICAgIHRyeSB7IG9yZ0lkID0gZ2V0Q29udGV4dChyZXEpLmlkZW50aXR5Lm9yZ0lkOyB9IGNhdGNoIHsgb3JnSWQgPSByZXEudXNlcj8ub3JnYW5pemF0aW9uSWQ7IH1cbiAgICAgICAgaWYgKCFvcmdJZCkgcmV0dXJuO1xuICAgICAgICAvLyBJbnRlcm5hbCBzZXJ2aWNlLXRvLXNlcnZpY2UgY2FsbHMgbXVzdCBub3QgY29uc3VtZSBhIHRlbmFudCdzIHF1b3RhLlxuICAgICAgICBpZiAoaXNTZXJ2aWNlUHJpbmNpcGFsKHJlcSkpIHJldHVybjtcbiAgICAgICAgaW5jcmVtZW50UXVvdGEoXG4gICAgICAgICAgcXVvdGFTZXJ2aWNlLFxuICAgICAgICAgIG9yZ0lkLFxuICAgICAgICAgIHF1b3RhVHlwZSxcbiAgICAgICAgICByZXEuaGVhZGVycy5hdXRob3JpemF0aW9uIHx8ICcnLFxuICAgICAgICAgIChtZXNzYWdlLCBkYXRhKSA9PiBsb2dnZXIud2FybihtZXNzYWdlLCBkYXRhIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+KSxcbiAgICAgICAgKTtcbiAgICAgIH0gY2F0Y2gge1xuICAgICAgICAvLyBNZXRlcmluZyBtdXN0IG5ldmVyIGFmZmVjdCB0aGUgcmVzcG9uc2U7IGEgbWlzc2luZyB1c2VyL2NvbnRleHQganVzdFxuICAgICAgICAvLyBtZWFucyBhbiB1bmF1dGhlbnRpY2F0ZWQgb3IgZWFybHktdGVybWluYXRlZCByZXF1ZXN0IOKAlCBza2lwIHNpbGVudGx5LlxuICAgICAgfVxuICAgIH0pO1xuICAgIG5leHQoKTtcbiAgfTtcbn1cbiJdfQ==
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import type { Response } from 'express';
|
|
2
2
|
import type { SSERelay } from './sse-relay.js';
|
|
3
|
-
import { type
|
|
3
|
+
import { type SSEStreamTicketStore } from './sse-ticket-store.js';
|
|
4
4
|
/**
|
|
5
5
|
* Event types for SSE logging
|
|
6
6
|
*/
|
|
@@ -73,11 +73,11 @@ export interface SSEManagerOptions {
|
|
|
73
73
|
/**
|
|
74
74
|
* Ticket + stream-ownership backend. Defaults to an in-memory store (correct
|
|
75
75
|
* single-replica only). Inject `createEnvRedisTicketStore()` (or a bespoke
|
|
76
|
-
* `
|
|
76
|
+
* `SSEStreamTicketStore`) so ticket mint/redeem AND stream ownership work across
|
|
77
77
|
* horizontally-scaled pods and — critically — so the platform stream producer
|
|
78
78
|
* (a different service) can bind ownership that this service reads.
|
|
79
79
|
*/
|
|
80
|
-
ticketStore?:
|
|
80
|
+
ticketStore?: SSEStreamTicketStore;
|
|
81
81
|
/**
|
|
82
82
|
* TTL for a stream-ownership binding (default: `SSE_STREAM_OWNER_TTL_MS` env or
|
|
83
83
|
* 1h). Long enough to outlive a build; the producer re-binds as needed.
|
|
@@ -630,4 +630,4 @@ export class SSEManager {
|
|
|
630
630
|
logger.info('SSE Manager shut down');
|
|
631
631
|
}
|
|
632
632
|
}
|
|
633
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3NlLWNvbm5lY3Rpb24tbWFuYWdlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9odHRwL3NzZS1jb25uZWN0aW9uLW1hbmFnZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsK0NBQStDO0FBQy9DLHNDQUFzQztBQUV0QyxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sYUFBYSxDQUFDO0FBQzFDLE9BQU8sRUFBRSxZQUFZLEVBQUUsaUJBQWlCLEVBQUUsZUFBZSxFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFDOUYsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLGlDQUFpQyxDQUFDO0FBRWhFLE9BQU8sRUFBRSxFQUFFLElBQUksSUFBSSxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBRWxDLE9BQU8sRUFBRSx1QkFBdUIsRUFBdUIsTUFBTSx1QkFBdUIsQ0FBQztBQUVyRixNQUFNLE1BQU0sR0FBRyxZQUFZLENBQUMsYUFBYSxDQUFDLENBQUM7QUFpRzNDOzs7Ozs7O0dBT0c7QUFDSCxNQUFNLENBQUMsTUFBTSxpQkFBaUIsR0FBRyxxRUFBcUUsQ0FBQztBQWdCdkc7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBaUJHO0FBQ0gsTUFBTSxPQUFPLFVBQVU7SUFDYixPQUFPLEdBQUcsSUFBSSxHQUFHLEVBQXVCLENBQUM7SUFDakQ7OzJDQUV1QztJQUMvQixlQUFlLEdBQUcsSUFBSSxHQUFHLEVBQWtCLENBQUM7SUFDcEQ7O2lGQUU2RTtJQUM1RCxXQUFXLENBQWlCO0lBQzVCLG9CQUFvQixDQUFTO0lBQzdCLGVBQWUsQ0FBUztJQUN4QixnQkFBZ0IsQ0FBUztJQUN6QixlQUFlLENBQVM7SUFDeEIsZ0JBQWdCLENBQVM7SUFDekIsV0FBVyxDQUFTO0lBQ3BCLGdCQUFnQixDQUFTO0lBQ3pCLGVBQWUsQ0FBUztJQUNqQyxlQUFlLEdBQTBCLElBQUksQ0FBQztJQUN0RCwrREFBK0Q7SUFDOUMsS0FBSyxDQUFZO0lBQ2xDLGtGQUFrRjtJQUNqRSxN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WUFDWixDQUFDO1lBRUQsSUFBSSxNQUFNLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRSxDQUFDO2dCQUN4QixJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsQ0FBQztZQUNqQyxDQUFDO2lCQUFNLElBQUksS0FBSyxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQztnQkFDNUIsSUFBSSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsU0FBUyxFQUFFLE1BQU0sQ0FBQyxDQUFDO1lBQ3RDLENBQUM7UUFDSCxDQUFDO1FBRUQsSUFBSSxPQUFPLEdBQUcsQ0FBQyxFQUFFLENBQUM7WUFDaEIsTUFBTSxDQUFDLElBQUksQ0FBQyxjQUFjLE9BQU8sd0JBQXdCLENBQUMsQ0FBQztRQUM3RCxDQUFDO0lBQ0gsQ0FBQztJQUVEOztPQUVHO0lBQ0gsUUFBUTtRQUNOLElBQUksSUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFDO1lBQ3pCLGFBQWEsQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDLENBQUM7WUFDcEMsSUFBSSxDQUFDLGVBQWUsR0FBRyxJQUFJLENBQUM7UUFDOUIsQ0FBQztRQUVELEtBQUssTUFBTSxTQUFTLElBQUksQ0FBQyxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxFQUFFLENBQUMsRUFBRSxDQUFDO1lBQ2pELElBQUksQ0FBQyxZQUFZLENBQUMsU0FBUyxFQUFFLHNCQUFzQixDQUFDLENBQUM7UUFDdkQsQ0FBQztRQUVELHVFQUF1RTtRQUN2RSxLQUFLLElBQUksQ0FBQyxLQUFLLEVBQUUsS0FBSyxFQUFFLENBQUMsS0FBSyxDQUFDLEdBQUcsRUFBRSxHQUF5QixDQUFDLENBQUMsQ0FBQztRQUVoRSxNQUFNLENBQUMsSUFBSSxDQUFDLHVCQUF1QixDQUFDLENBQUM7SUFDdkMsQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQ29weXJpZ2h0IDIwMjYgUGlwZWxpbmUgQnVpbGRlciBDb250cmlidXRvcnNcbi8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wXG5cbmltcG9ydCB7IHJhbmRvbUJ5dGVzIH0gZnJvbSAnbm9kZTpjcnlwdG8nO1xuaW1wb3J0IHsgY3JlYXRlTG9nZ2VyLCBTU0VfVElDS0VUX1RUTF9NUywgd3JpdGVTc2VIZWFkZXJzIH0gZnJvbSAnQHBpcGVsaW5lLWJ1aWxkZXIvYXBpLWNvcmUnO1xuaW1wb3J0IHsgQ29yZUNvbnN0YW50cyB9IGZyb20gJ0BwaXBlbGluZS1idWlsZGVyL3BpcGVsaW5lLWNvcmUnO1xuaW1wb3J0IHR5cGUgeyBSZXNwb25zZSB9IGZyb20gJ2V4cHJlc3MnO1xuaW1wb3J0IHsgdjcgYXMgdXVpZCB9IGZyb20gJ3V1aWQnO1xuaW1wb3J0IHR5cGUgeyBTU0VSZWxheSwgU1NFUmVsYXlNZXNzYWdlIH0gZnJvbSAnLi9zc2UtcmVsYXkuanMnO1xuaW1wb3J0IHsgY3JlYXRlTWVtb3J5VGlja2V0U3RvcmUsIHR5cGUgU1NFVGlja2V0U3RvcmUgfSBmcm9tICcuL3NzZS10aWNrZXQtc3RvcmUuanMnO1xuXG5jb25zdCBsb2dnZXIgPSBjcmVhdGVMb2dnZXIoJ3NzZS1tYW5hZ2VyJyk7XG5cbi8qKlxuICogRXZlbnQgdHlwZXMgZm9yIFNTRSBsb2dnaW5nXG4gKi9cbmV4cG9ydCB0eXBlIFNTRUV2ZW50VHlwZSA9ICdJTkZPJyB8ICdXQVJOJyB8ICdFUlJPUicgfCAnQ09NUExFVEVEJyB8ICdST0xMQkFDSycgfCAnTUVTU0FHRSc7XG5cbi8qKlxuICogU1NFIHBheWxvYWQgc3RydWN0dXJlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU1NFUGF5bG9hZCB7XG4gIHRzOiBzdHJpbmc7XG4gIHR5cGU6IFNTRUV2ZW50VHlwZTtcbiAgbWVzc2FnZTogc3RyaW5nO1xuICBkYXRhPzogdW5rbm93bjtcbn1cblxuLyoqXG4gKiBTU0UgY2xpZW50IHdpdGggY29ubmVjdGlvbiB0cmFja2luZ1xuICovXG5leHBvcnQgaW50ZXJmYWNlIFNTRUNsaWVudCB7XG4gIGlkOiBzdHJpbmc7XG4gIHJlczogUmVzcG9uc2U7XG4gIGNvbm5lY3RlZEF0OiBudW1iZXI7XG4gIHRpbWVvdXQ6IE5vZGVKUy5UaW1lb3V0O1xuICAvKiogTnVtYmVyIG9mIGNvbnNlY3V0aXZlIGJhY2twcmVzc3VyZSBldmVudHMgKHdyaXRlIHJldHVybmVkIGZhbHNlKS4gKi9cbiAgYmFja3ByZXNzdXJlQ291bnQ6IG51bWJlcjtcbiAgLyoqIE93bmluZyBvcmcgaWQg4oCUIHBvcHVsYXRlZCB3aGVuIHRoZSByZXF1ZXN0IHdhcyBhdXRoZW50aWNhdGVkLiBVc2VkIHRvXG4gICAqICBkZWNyZW1lbnQgdGhlIHBlci1vcmcgY291bnRlciBvbiBkaXNjb25uZWN0IC8gY2xlYW51cC4gKi9cbiAgb3JnSWQ/OiBzdHJpbmc7XG59XG5cbi8qKlxuICogU1NFIE1hbmFnZXIgY29uZmlndXJhdGlvbiBvcHRpb25zXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU1NFTWFuYWdlck9wdGlvbnMge1xuICAvKiogTWF4aW11bSBjbGllbnRzIGFsbG93ZWQgcGVyIHJlcXVlc3QgSUQgKGRlZmF1bHQ6IDEwKSAqL1xuICBtYXhDbGllbnRzUGVyUmVxdWVzdD86IG51bWJlcjtcbiAgLyoqIENsaWVudCB0aW1lb3V0IGluIG1pbGxpc2Vjb25kcyAoZGVmYXVsdDogMzAgbWludXRlcykgKi9cbiAgY2xpZW50VGltZW91dE1zPzogbnVtYmVyO1xuICAvKiogSW50ZXJ2YWwgZm9yIGNsZWFudXAgY2hlY2tzIGluIG1pbGxpc2Vjb25kcyAoZGVmYXVsdDogNSBtaW51dGVzKSAqL1xuICBjbGVhbnVwSW50ZXJ2YWxNcz86IG51bWJlcjtcbiAgLyoqXG4gICAqIEhhcmQgY2FwIG9uIHRvdGFsIG9wZW4gY29ubmVjdGlvbnMgcGVyIHByb2Nlc3MuIERlZmF1bHRzIHRvIDEwMDAgZnJvbVxuICAgKiBgU1NFX01BWF9UT1RBTF9DTElFTlRTYC4gTmV3IGNvbm5lY3Rpb25zIGJleW9uZCB0aGlzIGFyZSByZWplY3RlZCBhdFxuICAgKiBgYWRkQ2xpZW50KClgLiBUdW5lIHVwIGlmIHlvdXIgc2VydmljZSBzZXJ2ZXMgPiAxMDAwIGNvbmN1cnJlbnQgU1NFXG4gICAqIGRhc2hib2FyZHMsIGJ1dCBiZSBhd2FyZSBOb2RlLmpzIGZkIGxpbWl0cyBkb21pbmF0ZSBhYm92ZSB+NTAwMC5cbiAgICovXG4gIG1heFRvdGFsQ2xpZW50cz86IG51bWJlcjtcbiAgLyoqXG4gICAqIFBlci1vcmcgY2VpbGluZyBvbiBjb25jdXJyZW50IFNTRSBzdHJlYW1zLiBEZWZhdWx0cyB0byA1MCBmcm9tXG4gICAqIGBTU0VfTUFYX0NMSUVOVFNfUEVSX09SR2AuIFByb3RlY3RzIGFnYWluc3Qgb25lIG5vaXN5IG9yZyBjb25zdW1pbmcgdGhlXG4gICAqIHByb2Nlc3Mtd2lkZSBidWRnZXQg4oCUIHdpdGhvdXQgaXQsIGFuIGF1dGhlbnRpY2F0ZWQgdXNlciBjYW4gZmFuIG91dFxuICAgKiB0aG91c2FuZHMgb2Ygc3RyZWFtcyAob25lIHBlciBkYXNoYm9hcmQgLyBsb2cgc3RyZWFtKSBhbmQgc3RhcnZlIG90aGVyXG4gICAqIG9yZ3Mgb2YgY29ubmVjdGlvbiBzbG90cy4gVGhlIGNhcCBpcyBlbmZvcmNlZCBvbmx5IG9uIGBhZGRDbGllbnRgIGNhbGxzXG4gICAqIHRoYXQgY2FycnkgYW4gYG9yZ0lkYDsgc2VydmljZS1pbnRlcm5hbCAvIGFub255bW91cyBTU0UgdHJhZmZpYyBza2lwcyBpdC5cbiAgICovXG4gIG1heENsaWVudHNQZXJPcmc/OiBudW1iZXI7XG4gIC8qKlxuICAgKiBIYXJkIGNhcCBvbiB0b3RhbCBsaXZlICh1bmNvbnN1bWVkLCB1bmV4cGlyZWQpIFNTRSB0aWNrZXRzIGFjcm9zcyB0aGVcbiAgICogcHJvY2Vzcy4gRGVmYXVsdHMgdG8gMTAwMCBmcm9tIGBTU0VfTUFYX1RPVEFMX1RJQ0tFVFNgLiBCb3VuZHMgbWVtb3J5XG4gICAqIHVuZGVyIGFidXNlIOKAlCBgY3JlYXRlVGlja2V0YCByZXR1cm5zIGB7IG9rOiBmYWxzZSwgcmVhc29uOiAnY2FwYWNpdHknIH1gXG4gICAqIG9uY2UgcmVhY2hlZC5cbiAgICovXG4gIG1heFRvdGFsVGlja2V0cz86IG51bWJlcjtcbiAgLyoqXG4gICAqIFBlci1vcmcgY2FwIG9uIGxpdmUgU1NFIHRpY2tldHMuIERlZmF1bHRzIHRvIDEwIGZyb21cbiAgICogYFNTRV9NQVhfVElDS0VUU19QRVJfT1JHYC4gUHJldmVudHMgYSBzaW5nbGUgdGVuYW50IGZyb20gc2F0dXJhdGluZyB0aGVcbiAgICogdGlja2V0IHRhYmxlIOKAlCBgY3JlYXRlVGlja2V0YCByZXR1cm5zIGB7IG9rOiBmYWxzZSwgcmVhc29uOiAnb3JnLWxpbWl0JyB9YFxuICAgKiBvbmNlIHJlYWNoZWQuXG4gICAqL1xuICBtYXhUaWNrZXRzUGVyT3JnPzogbnVtYmVyO1xuICAvKiogVGlja2V0IFRUTCBpbiBtcyAoZGVmYXVsdDogYFNTRV9USUNLRVRfVFRMX01TYCBmcm9tIGFwaS1jb3JlKS4gKi9cbiAgdGlja2V0VHRsTXM/OiBudW1iZXI7XG4gIC8qKlxuICAgKiBUaWNrZXQgKyBzdHJlYW0tb3duZXJzaGlwIGJhY2tlbmQuIERlZmF1bHRzIHRvIGFuIGluLW1lbW9yeSBzdG9yZSAoY29ycmVjdFxuICAgKiBzaW5nbGUtcmVwbGljYSBvbmx5KS4gSW5qZWN0IGBjcmVhdGVFbnZSZWRpc1RpY2tldFN0b3JlKClgIChvciBhIGJlc3Bva2VcbiAgICogYFNTRVRpY2tldFN0b3JlYCkgc28gdGlja2V0IG1pbnQvcmVkZWVtIEFORCBzdHJlYW0gb3duZXJzaGlwIHdvcmsgYWNyb3NzXG4gICAqIGhvcml6b250YWxseS1zY2FsZWQgcG9kcyBhbmQg4oCUIGNyaXRpY2FsbHkg4oCUIHNvIHRoZSBwbGF0Zm9ybSBzdHJlYW0gcHJvZHVjZXJcbiAgICogKGEgZGlmZmVyZW50IHNlcnZpY2UpIGNhbiBiaW5kIG93bmVyc2hpcCB0aGF0IHRoaXMgc2VydmljZSByZWFkcy5cbiAgICovXG4gIHRpY2tldFN0b3JlPzogU1NFVGlja2V0U3RvcmU7XG4gIC8qKlxuICAgKiBUVEwgZm9yIGEgc3RyZWFtLW93bmVyc2hpcCBiaW5kaW5nIChkZWZhdWx0OiBgU1NFX1NUUkVBTV9PV05FUl9UVExfTVNgIGVudiBvclxuICAgKiAxaCkuIExvbmcgZW5vdWdoIHRvIG91dGxpdmUgYSBidWlsZDsgdGhlIHByb2R1Y2VyIHJlLWJpbmRzIGFzIG5lZWRlZC5cbiAgICovXG4gIHN0cmVhbU93bmVyVHRsTXM/OiBudW1iZXI7XG4gIC8qKlxuICAgKiBDcm9zcy1wb2QgZmFuLW91dCBidXMgZm9yIGBzZW5kKClgL2Bicm9hZGNhc3QoKWAuIE9wdGlvbmFsIOKAlCB3aGVuIG9taXR0ZWQsXG4gICAqIGRlbGl2ZXJ5IGlzIExPQ0FMLU9OTFkgKGNvcnJlY3Qgc2luZ2xlLXJlcGxpY2E7IHRvZGF5J3MgYmVoYXZpb3IpLiBJbmplY3RcbiAgICogYGNyZWF0ZUVudlJlZGlzU1NFUmVsYXkoKWAgc28gYSBmcmFtZSBwcm9kdWNlZCBvbiBvbmUgcG9kIHJlYWNoZXMgYW5cbiAgICogRXZlbnRTb3VyY2UgYXR0YWNoZWQgb24gYSBESUZGRVJFTlQgcG9kLiBEZWdyYWRlcyB0byBsb2NhbC1vbmx5IGF1dG9tYXRpY2FsbHlcbiAgICogd2hlbiBSZWRpcyBpcyB1bnNldCAodGhlIGZhY3RvcnkgcmV0dXJucyBudWxsKSBvciBkdXJpbmcgYSBSZWRpcyBvdXRhZ2UuXG4gICAqL1xuICByZWxheT86IFNTRVJlbGF5O1xufVxuXG4vKipcbiAqIEEgYnVpbGQtbG9nIHN0cmVhbSBzdWJqZWN0IGlkOiBlaXRoZXIgYSBkYXNoZWQgVVVJRCAoYXBpLXNlcnZlcidzIGB1dWlkKClgKVxuICogb3IgbmdpbngncyBgJHJlcXVlc3RfaWRgIOKAlCAxNiByYW5kb20gYnl0ZXMgcmVuZGVyZWQgYXMgMzIgaGV4IGNoYXJzIHdpdGggTk9cbiAqIGRhc2hlcy4gQWNjZXB0IGJvdGggYnkgbWFraW5nIHRoZSBncm91cCBzZXBhcmF0b3JzIG9wdGlvbmFsOyBzdGlsbCBzdHJpY3RseVxuICogMzIgaGV4IGNoYXJzIHNvIGl0IGNhbid0IGNhcnJ5IGFuIGluamVjdGlvbiAvIHBhdGgtdHJhdmVyc2FsIHBheWxvYWQgaW50byB0aGVcbiAqIFNTRSBzdWJqZWN0LiBTaGFyZWQgYnkgdGhlIHRpY2tldC1taW50IHJvdXRlIGFuZCB0aGUgc3RyZWFtIG1pZGRsZXdhcmUgc29cbiAqIGJvdGggdmFsaWRhdGUgdGhlIHN1YmplY3QgaWRlbnRpY2FsbHkuXG4gKi9cbmV4cG9ydCBjb25zdCBTU0VfUkVRVUVTVF9JRF9SRSA9IC9eWzAtOWEtZl17OH0tP1swLTlhLWZdezR9LT9bMC05YS1mXXs0fS0/WzAtOWEtZl17NH0tP1swLTlhLWZdezEyfSQvaTtcblxuLyoqIFJlc3VsdCBvZiB7QGxpbmsgU1NFTWFuYWdlci5jcmVhdGVUaWNrZXR9LiAqL1xuZXhwb3J0IHR5cGUgQ3JlYXRlVGlja2V0UmVzdWx0ID1cbiAgfCB7IG9rOiB0cnVlOyB0aWNrZXQ6IHN0cmluZyB9XG4gIHwgeyBvazogZmFsc2U7IHJlYXNvbjogJ29yZy1saW1pdCcgfCAnY2FwYWNpdHknIHwgJ2ZvcmJpZGRlbicgfTtcblxuLyoqXG4gKiBTU0UgTWFuYWdlciBzdGF0aXN0aWNzXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU1NFTWFuYWdlclN0YXRzIHtcbiAgdG90YWxSZXF1ZXN0czogbnVtYmVyO1xuICB0b3RhbENsaWVudHM6IG51bWJlcjtcbiAgb2xkZXN0Q29ubmVjdGlvbk1zOiBudW1iZXIgfCBudWxsO1xufVxuXG4vKipcbiAqIFNTRSBoZWxwZXIgY2xhc3Mgd2l0aCBtZW1vcnkgbGVhayBwcm90ZWN0aW9uXG4gKlxuICogRmVhdHVyZXM6XG4gKiAtIENsaWVudCBsaW1pdHMgcGVyIHJlcXVlc3QgSURcbiAqIC0gQXV0b21hdGljIHRpbWVvdXQgZm9yIGlkbGUgY29ubmVjdGlvbnNcbiAqIC0gUGVyaW9kaWMgY2xlYW51cCBvZiBzdGFsZSBjb25uZWN0aW9uc1xuICogLSBDb25uZWN0aW9uIHN0YXRpc3RpY3NcbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgdHlwZXNjcmlwdFxuICogY29uc3Qgc3NlTWFuYWdlciA9IG5ldyBTU0VNYW5hZ2VyKHsgbWF4Q2xpZW50c1BlclJlcXVlc3Q6IDUgfSk7XG4gKiBhcHAuZ2V0KCcvbG9ncy86cmVxdWVzdElkJywgc3NlTWFuYWdlci5taWRkbGV3YXJlKCkpO1xuICpcbiAqIC8vIFNlbmQgZXZlbnRzXG4gKiBzc2VNYW5hZ2VyLnNlbmQoJ3JlcXVlc3QtMTIzJywgJ0lORk8nLCAnUHJvY2Vzc2luZy4uLicpO1xuICogYGBgXG4gKi9cbmV4cG9ydCBjbGFzcyBTU0VNYW5hZ2VyIHtcbiAgcHJpdmF0ZSBjbGllbnRzID0gbmV3IE1hcDxzdHJpbmcsIFNTRUNsaWVudFtdPigpO1xuICAvKiogUGVyLW9yZyBvcGVuLWNsaWVudCBjb3VudGVycy4gRGVjcmVtZW50ZWQgb24gcmVtb3ZlQ2xpZW50L2NsZWFudXAgc28gdGhlXG4gICAqICBtYXAgbWlycm9ycyBgY2xpZW50c1tdLm9yZ0lkYCBjb3VudHMgYXQgYWxsIHRpbWVzLiBPcmdzIHJlYWNoIHplcm8gYXJlXG4gICAqICBkZWxldGVkIHRvIGtlZXAgdGhlIG1hcCBib3VuZGVkLiAqL1xuICBwcml2YXRlIG9yZ0NsaWVudENvdW50cyA9IG5ldyBNYXA8c3RyaW5nLCBudW1iZXI+KCk7XG4gIC8qKiBUaWNrZXQgKyBzdHJlYW0tb3duZXJzaGlwIGJhY2tlbmQgKGluLW1lbW9yeSBkZWZhdWx0OyBSZWRpcyBmb3IgbXVsdGktcG9kKS5cbiAgICogIEJvdW5kZWQgYnkgYG1heFRvdGFsVGlja2V0c2AgLyBgbWF4VGlja2V0c1Blck9yZ2AsIGVuZm9yY2VkIGluIGNyZWF0ZVRpY2tldDtcbiAgICogIGV4cGlyeSBpcyB2YWxpZGF0ZWQgYXQgY29uc3VtZSB0aW1lIGFuZCBzd2VwdCBvbiB0aGUgY2xlYW51cCBpbnRlcnZhbC4gKi9cbiAgcHJpdmF0ZSByZWFkb25seSB0aWNrZXRTdG9yZTogU1NFVGlja2V0U3RvcmU7XG4gIHByaXZhdGUgcmVhZG9ubHkgbWF4Q2xpZW50c1BlclJlcXVlc3Q6IG51bWJlcjtcbiAgcHJpdmF0ZSByZWFkb25seSBtYXhUb3RhbENsaWVudHM6IG51bWJlcjtcbiAgcHJpdmF0ZSByZWFkb25seSBtYXhDbGllbnRzUGVyT3JnOiBudW1iZXI7XG4gIHByaXZhdGUgcmVhZG9ubHkgbWF4VG90YWxUaWNrZXRzOiBudW1iZXI7XG4gIHByaXZhdGUgcmVhZG9ubHkgbWF4VGlja2V0c1Blck9yZzogbnVtYmVyO1xuICBwcml2YXRlIHJlYWRvbmx5IHRpY2tldFR0bE1zOiBudW1iZXI7XG4gIHByaXZhdGUgcmVhZG9ubHkgc3RyZWFtT3duZXJUdGxNczogbnVtYmVyO1xuICBwcml2YXRlIHJlYWRvbmx5IGNsaWVudFRpbWVvdXRNczogbnVtYmVyO1xuICBwcml2YXRlIGNsZWFudXBJbnRlcnZhbDogTm9kZUpTLlRpbWVvdXQgfCBudWxsID0gbnVsbDtcbiAgLyoqIENyb3NzLXBvZCBmYW4tb3V0IGJ1cyAodW5kZWZpbmVkIOKHkiBsb2NhbC1vbmx5IGRlbGl2ZXJ5KS4gKi9cbiAgcHJpdmF0ZSByZWFkb25seSByZWxheT86IFNTRVJlbGF5O1xuICAvKiogVGhpcyBtYW5hZ2VyIGluc3RhbmNlJ3MgaWQg4oCUIHRhZ3MgcmVsYXllZCBmcmFtZXMgc28gd2UgaWdub3JlIG91ciBvd24gZWNoby4gKi9cbiAgcHJpdmF0ZSByZWFkb25seSBub2RlSWQgPSByYW5kb21CeXRlcyg4KS50b1N0cmluZygnaGV4Jyk7XG5cbiAgY29uc3RydWN0b3Iob3B0aW9uczogU1NFTWFuYWdlck9wdGlvbnMgPSB7fSkge1xuICAgIHRoaXMubWF4Q2xpZW50c1BlclJlcXVlc3QgPSBvcHRpb25zLm1heENsaWVudHNQZXJSZXF1ZXN0ID8/IHBhcnNlSW50KHByb2Nlc3MuZW52LlNTRV9NQVhfQ0xJRU5UU19QRVJfUkVRVUVTVCB8fCAnMTAnLCAxMCk7XG4gICAgdGhpcy5tYXhUb3RhbENsaWVudHMgPSBvcHRpb25zLm1heFRvdGFsQ2xpZW50cyA/PyBwYXJzZUludChwcm9jZXNzLmVudi5TU0VfTUFYX1RPVEFMX0NMSUVOVFMgfHwgJzEwMDAnLCAxMCk7XG4gICAgdGhpcy5tYXhDbGllbnRzUGVyT3JnID0gb3B0aW9ucy5tYXhDbGllbnRzUGVyT3JnID8/IHBhcnNlSW50KHByb2Nlc3MuZW52LlNTRV9NQVhfQ0xJRU5UU19QRVJfT1JHIHx8ICc1MCcsIDEwKTtcbiAgICB0aGlzLm1heFRvdGFsVGlja2V0cyA9IG9wdGlvbnMubWF4VG90YWxUaWNrZXRzID8/IHBhcnNlSW50KHByb2Nlc3MuZW52LlNTRV9NQVhfVE9UQUxfVElDS0VUUyB8fCAnMTAwMCcsIDEwKTtcbiAgICB0aGlzLm1heFRpY2tldHNQZXJPcmcgPSBvcHRpb25zLm1heFRpY2tldHNQZXJPcmcgPz8gcGFyc2VJbnQocHJvY2Vzcy5lbnYuU1NFX01BWF9USUNLRVRTX1BFUl9PUkcgfHwgJzEwJywgMTApO1xuICAgIHRoaXMudGlja2V0VHRsTXMgPSBvcHRpb25zLnRpY2tldFR0bE1zID8/IFNTRV9USUNLRVRfVFRMX01TO1xuICAgIHRoaXMuc3RyZWFtT3duZXJUdGxNcyA9IG9wdGlvbnMuc3RyZWFtT3duZXJUdGxNcyA/PyBwYXJzZUludChwcm9jZXNzLmVudi5TU0VfU1RSRUFNX09XTkVSX1RUTF9NUyB8fCAnMzYwMDAwMCcsIDEwKTsgLy8gMSBob3VyXG4gICAgdGhpcy50aWNrZXRTdG9yZSA9IG9wdGlvbnMudGlja2V0U3RvcmUgPz8gY3JlYXRlTWVtb3J5VGlja2V0U3RvcmUoKTtcbiAgICB0aGlzLmNsaWVudFRpbWVvdXRNcyA9IG9wdGlvbnMuY2xpZW50VGltZW91dE1zID8/IHBhcnNlSW50KHByb2Nlc3MuZW52LlNTRV9DTElFTlRfVElNRU9VVF9NUyB8fCAnMTgwMDAwMCcsIDEwKTsgLy8gMzAgbWludXRlc1xuXG4gICAgY29uc3QgY2xlYW51cEludGVydmFsTXMgPSBvcHRpb25zLmNsZWFudXBJbnRlcnZhbE1zID8/IHBhcnNlSW50KHByb2Nlc3MuZW52LlNTRV9DTEVBTlVQX0lOVEVSVkFMX01TIHx8ICczMDAwMDAnLCAxMCk7IC8vIDUgbWludXRlc1xuICAgIHRoaXMuc3RhcnRDbGVhbnVwSW50ZXJ2YWwoY2xlYW51cEludGVydmFsTXMpO1xuXG4gICAgLy8gV2lyZSB0aGUgY3Jvc3MtcG9kIHJlbGF5OiBzdWJzY3JpYmUgb25jZSBvbiBzdGFydHVwIHNvIGZyYW1lcyBQVUJMSVNIRUQgYnlcbiAgICAvLyBhbnkgb3RoZXIgcG9kIGFyZSByZS1lbWl0dGVkIHRvIFRISVMgcG9kJ3MgbG9jYWwgY2xpZW50cy4gRnJhbWVzIHdlXG4gICAgLy8gcHVibGlzaGVkIG91cnNlbHZlcyBhcmUgaWdub3JlZCAob3JpZ2luID09PSBub2RlSWQpIOKAlCB3ZSBhbHJlYWR5IHdyb3RlIHRoZW1cbiAgICAvLyBsb2NhbGx5LiBGYWlsLXNhZmU6IG5vIHJlbGF5IOKHkiBsb2NhbC1vbmx5IGRlbGl2ZXJ5IChzaW5nbGUtcmVwbGljYSBkZWZhdWx0KS5cbiAgICB0aGlzLnJlbGF5ID0gb3B0aW9ucy5yZWxheTtcbiAgICB0aGlzLnJlbGF5Py5zdWJzY3JpYmUoKG1zZykgPT4gdGhpcy5vblJlbGF5TWVzc2FnZShtc2cpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBIYW5kbGUgYSBmcmFtZSByZWNlaXZlZCBmcm9tIGFub3RoZXIgcG9kIHZpYSB0aGUgcmVsYXkuIFdlIGFscmVhZHkgZGVsaXZlcmVkXG4gICAqIG91ciBPV04gZnJhbWVzIHRvIGxvY2FsIGNsaWVudHMgYmVmb3JlIHB1Ymxpc2hpbmcsIHNvIGlnbm9yZSBvdXIgZWNoby4gQVxuICAgKiBgc2VuZGAgcmUtZW1pdHMgdG8gdGhlIHN1YmplY3QncyBsb2NhbCBjbGllbnRzOyBhIGBicm9hZGNhc3RgIHRvIGFsbCBvZiB0aGVtLlxuICAgKiBQdXJlbHkgbG9jYWwg4oCUIG5ldmVyIHJlLXB1Ymxpc2hlcywgc28gdGhlcmUgaXMgbm8gZmFuLW91dCBsb29wLlxuICAgKi9cbiAgcHJpdmF0ZSBvblJlbGF5TWVzc2FnZShtc2c6IFNTRVJlbGF5TWVzc2FnZSk6IHZvaWQge1xuICAgIGlmICghbXNnIHx8IG1zZy5vcmlnaW4gPT09IHRoaXMubm9kZUlkKSByZXR1cm47XG4gICAgaWYgKG1zZy5raW5kID09PSAnYnJvYWRjYXN0Jykge1xuICAgICAgdGhpcy5icm9hZGNhc3RMb2NhbChtc2cucGF5bG9hZCk7XG4gICAgfSBlbHNlIGlmIChtc2cucmVxdWVzdElkKSB7XG4gICAgICB0aGlzLnNlbmRMb2NhbChtc2cucmVxdWVzdElkLCBtc2cucGF5bG9hZCk7XG4gICAgfVxuICB9XG5cbiAgLyoqIFRvdGFsIG9wZW4gY29ubmVjdGlvbnMgYWNyb3NzIGFsbCByZXF1ZXN0cy4gKi9cbiAgcHJpdmF0ZSB0b3RhbENsaWVudHMoKTogbnVtYmVyIHtcbiAgICBsZXQgbiA9IDA7XG4gICAgZm9yIChjb25zdCBjbGllbnRzIG9mIHRoaXMuY2xpZW50cy52YWx1ZXMoKSkgbiArPSBjbGllbnRzLmxlbmd0aDtcbiAgICByZXR1cm4gbjtcbiAgfVxuXG4gIC8qKiBDdXJyZW50IG9wZW4tc3RyZWFtIGNvdW50IGZvciBhbiBvcmcgKDAgaWYgdW5zZWVuKS4gKi9cbiAgZ2V0T3JnQ2xpZW50Q291bnQob3JnSWQ6IHN0cmluZyk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMub3JnQ2xpZW50Q291bnRzLmdldChvcmdJZCkgPz8gMDtcbiAgfVxuXG4gIC8qKlxuICAgKiBDYW5vbmljYWwgZm9ybSBvZiBhIHJlcXVlc3RJZCBmb3IgZXF1YWxpdHkgY2hlY2tzOiBkYXNoZXMgc3RyaXBwZWQgYW5kXG4gICAqIGxvd2VyY2FzZWQsIHNvIHRoZSBkYXNoZWQgKGFwaS1zZXJ2ZXIgYHV1aWQoKWApIGFuZCB1bmRhc2hlZCAobmdpbnhcbiAgICogYCRyZXF1ZXN0X2lkYCkgcmVuZGVyaW5ncyBvZiB0aGUgc2FtZSBpZCBjb21wYXJlIGVxdWFsLiBDYWxsZXJzIGFyZVxuICAgKiBleHBlY3RlZCB0byBoYXZlIGFscmVhZHkgZm9ybWF0LXZhbGlkYXRlZCBhZ2FpbnN0IHtAbGluayBTU0VfUkVRVUVTVF9JRF9SRX0uXG4gICAqL1xuICBwcml2YXRlIHN0YXRpYyBub3JtYWxpemVSZXF1ZXN0SWQocmVxdWVzdElkOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIHJldHVybiByZXF1ZXN0SWQucmVwbGFjZSgvLS9nLCAnJykudG9Mb3dlckNhc2UoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDYW5vbmljYWwgZm9ybSBvZiBhbiBvcmdJZCBmb3Igb3duZXJzaGlwIGVxdWFsaXR5IGNoZWNrczogdHJpbW1lZCBhbmRcbiAgICogbG93ZXJjYXNlZC4gVGhlIHN0cmVhbSBQUk9EVUNFUiAoYmluZFN0cmVhbU93bmVyKSBhbmQgdGhlIHRpY2tldC1taW50aW5nXG4gICAqIENPTlNVTUVSIChjcmVhdGVUaWNrZXQpIHJ1biBpbiBkaWZmZXJlbnQgc2VydmljZXMsIHNvIGEgY2FzaW5nIC8gd2hpdGVzcGFjZVxuICAgKiBkcmlmdCBiZXR3ZWVuIGhvdyBlYWNoIHJlbmRlcnMgdGhlIHNhbWUgb3JnIHdvdWxkIG90aGVyd2lzZSBtYWtlIHRoZSBvd25lclxuICAgKiBjb21wYXJpc29uIGluIHtAbGluayBjcmVhdGVUaWNrZXR9IGZhbHNlLWBmb3JiaWRkZW5gIHRoZSByZWFsIG93bmVyLlxuICAgKiBOb3JtYWxpemluZyBib3RoIHNpZGVzIOKAlCBtaXJyb3Jpbmcge0BsaW5rIG5vcm1hbGl6ZVJlcXVlc3RJZH0g4oCUIGNsb3NlcyB0aGF0LlxuICAgKi9cbiAgcHJpdmF0ZSBzdGF0aWMgbm9ybWFsaXplT3JnSWQob3JnSWQ6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgcmV0dXJuIG9yZ0lkLnRyaW0oKS50b0xvd2VyQ2FzZSgpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlY29yZCB0aGUgb3JnIHRoYXQgT1dOUyBhIHN0cmVhbSBzdWJqZWN0LiBUaGUgc3RyZWFtIFBST0RVQ0VSIGNhbGxzIHRoaXNcbiAgICogd2hlbiBpdCBjcmVhdGVzIGEgYnVpbGQtbG9nIHN0cmVhbSBzbyB0aGF0IHRpY2tldCBtaW50aW5nIGNhbiBhc3NlcnQgdGhlXG4gICAqIGNhbGxlcidzIG9yZyBvd25zIHRoZSBzdWJqZWN0IChzZWUge0BsaW5rIGNyZWF0ZVRpY2tldH0pLiBCYWNrZWQgYnkgdGhlXG4gICAqIGluamVjdGVkIHRpY2tldCBzdG9yZSwgc28gd2hlbiBhIFJlZGlzIHN0b3JlIGlzIHdpcmVkIHRoZSBwbGF0Zm9ybSBwcm9kdWNlclxuICAgKiAoYSBkaWZmZXJlbnQgc2VydmljZSBzaGFyaW5nIHRoZSBzYW1lIFJlZGlzKSBjYW4gYmluZCBvd25lcnNoaXAgdGhhdCB0aGlzXG4gICAqIHNlcnZpY2UgcmVhZHMg4oCUIGNsb3NpbmcgdGhlIGNyb3NzLXRlbmFudCBhdHRhY2ggZ2FwIHdoZXJlIGFueSBvcmcgY291bGQgbWludFxuICAgKiBhIHRpY2tldCBmb3IgYSBndWVzc2VkIHJlcXVlc3RJZC5cbiAgICpcbiAgICogQHBhcmFtIHJlcXVlc3RJZCAtIFRoZSBzdHJlYW0gc3ViamVjdCAoZm9ybWF0LXZhbGlkYXRlZCBieSB0aGUgY2FsbGVyKS5cbiAgICogQHBhcmFtIG9yZ0lkIC0gVGhlIG93bmluZyBvcmcgKG5vcm1hbGl6ZWQgaW50ZXJuYWxseSB2aWEgbm9ybWFsaXplT3JnSWQpLlxuICAgKi9cbiAgYXN5bmMgYmluZFN0cmVhbU93bmVyKHJlcXVlc3RJZDogc3RyaW5nLCBvcmdJZDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgYXdhaXQgdGhpcy50aWNrZXRTdG9yZS5iaW5kU3RyZWFtT3duZXIoXG4gICAgICBTU0VNYW5hZ2VyLm5vcm1hbGl6ZVJlcXVlc3RJZChyZXF1ZXN0SWQpLFxuICAgICAgU1NFTWFuYWdlci5ub3JtYWxpemVPcmdJZChvcmdJZCksXG4gICAgICB0aGlzLnN0cmVhbU93bmVyVHRsTXMsXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBNaW50IGEgc2hvcnQtbGl2ZWQsIHNpbmdsZS11c2UgU1NFIHRpY2tldCBib3VuZCB0byBgb3JnSWRgIEFORCBhIHNwZWNpZmljXG4gICAqIHN0cmVhbSBzdWJqZWN0IChgcmVxdWVzdElkYCkuIENsaWVudHMgUE9TVCB0byBvYnRhaW4gb25lIChKV1QtYXV0aGVudGljYXRlZClcbiAgICogZm9yIHRoZSBleGFjdCBzdHJlYW0gdGhleSBpbnRlbmQgdG8gb3BlbiwgdGhlbiBvcGVuIHRoZSBFdmVudFNvdXJjZSB3aXRoXG4gICAqIGA/dGlja2V0PTx0PmAgc28gdGhlIEpXVCBuZXZlciBsYW5kcyBpbiBhIHF1ZXJ5IHN0cmluZyAvIGFjY2VzcyBsb2cuIFRoZVxuICAgKiB0aWNrZXQgY2FuIHRoZW4gb25seSBiZSBjb25zdW1lZCB0byBvcGVuIHRoYXQgb25lIHN1YmplY3QncyBzdHJlYW0g4oCUIHNlZVxuICAgKiB7QGxpbmsgY29uc3VtZVRpY2tldH0g4oCUIHdoaWNoIGlzIHdoYXQgZW5mb3JjZXMgcGVyLXN1YmplY3QgYXV0aG9yaXphdGlvbi5cbiAgICpcbiAgICogT1JHLU9XTkVSU0hJUDogaWYgYSBzdHJlYW0gb3duZXIgaGFzIGJlZW4gYm91bmQgZm9yIHRoaXMgc3ViamVjdCAodmlhXG4gICAqIHtAbGluayBiaW5kU3RyZWFtT3duZXJ9KSBhbmQgaXQgaXMgYSBESUZGRVJFTlQgb3JnLCBtaW50aW5nIGlzIHJlZnVzZWRcbiAgICogKGByZWFzb246ICdmb3JiaWRkZW4nYCkg4oCUIGFuIG9yZyBjYW5ub3QgbWludCBhIHRpY2tldCBmb3IgYW5vdGhlciBvcmcnc1xuICAgKiBzdHJlYW0gZXZlbiBpZiBpdCBndWVzc2VzIHRoZSByZXF1ZXN0SWQuIFdoZW4gbm8gb3duZXIgaXMgYm91bmQgKHByb2R1Y2VyXG4gICAqIHdpcmluZyBub3QgeWV0IHByZXNlbnQpLCBtaW50aW5nIGZhbGxzIGJhY2sgdG8gYmluZGluZyB0aGUgdGlja2V0IHRvIHRoZVxuICAgKiBjYWxsZXIncyBvd24gb3JnLCBwcmVzZXJ2aW5nIGN1cnJlbnQgYmVoYXZpb3IuXG4gICAqXG4gICAqIEJvdW5kZWQgYnkgYG1heFRvdGFsVGlja2V0c2AgKHByb2Nlc3Mtd2lkZSkgYW5kIGBtYXhUaWNrZXRzUGVyT3JnYFxuICAgKiAocGVyLXRlbmFudCkuIE1pcnJvcnMgdGhlIG1lc3NhZ2Utc2VydmljZSBub3RpZmljYXRpb25zIHRpY2tldCBzdG9yZS5cbiAgICpcbiAgICogQHBhcmFtIG9yZ0lkIC0gT3duaW5nIG9yZyAobm9ybWFsaXplZCBpbnRlcm5hbGx5IHZpYSBub3JtYWxpemVPcmdJZCkuXG4gICAqIEBwYXJhbSByZXF1ZXN0SWQgLSBUaGUgYnVpbGQtbG9nIHN0cmVhbSBzdWJqZWN0IHRoaXMgdGlja2V0IGF1dGhvcml6ZXMuXG4gICAqICAgVGhlIGNhbGxlciBtdXN0IGhhdmUgZm9ybWF0LXZhbGlkYXRlZCBpdCAoc2VlIHtAbGluayBTU0VfUkVRVUVTVF9JRF9SRX0pLlxuICAgKiBAcmV0dXJucyBgeyBvazogdHJ1ZSwgdGlja2V0IH1gIG9uIHN1Y2Nlc3MsIG9yIGB7IG9rOiBmYWxzZSwgcmVhc29uIH1gXG4gICAqICAgd2hlcmUgcmVhc29uIGlzIGAnb3JnLWxpbWl0J2AsIGAnY2FwYWNpdHknYCwgb3IgYCdmb3JiaWRkZW4nYC5cbiAgICovXG4gIGFzeW5jIGNyZWF0ZVRpY2tldChvcmdJZDogc3RyaW5nLCByZXF1ZXN0SWQ6IHN0cmluZyk6IFByb21pc2U8Q3JlYXRlVGlja2V0UmVzdWx0PiB7XG4gICAgLy8gT3duZXJzaGlwIGdhdGUgZmlyc3Qg4oCUIGEgY3Jvc3MtdGVuYW50IG1pbnQgYXR0ZW1wdCBzaG91bGQgbmV2ZXIgZXZlblxuICAgIC8vIGNvbnN1bWUgY2FwIGJ1ZGdldC4gT25seSBlbmZvcmNlZCB3aGVuIGFuIG93bmVyIGlzIGFjdHVhbGx5IGJvdW5kLiBCb3RoXG4gICAgLy8gc2lkZXMgYXJlIG9yZy1ub3JtYWxpemVkIHNvIGEgcHJvZHVjZXIvY29uc3VtZXIgY2FzaW5nIGRyaWZ0IGNhbid0XG4gICAgLy8gZmFsc2UtYGZvcmJpZGRlbmAgdGhlIHJlYWwgb3duZXIgKG1pcnJvcnMgcmVxdWVzdElkIG5vcm1hbGl6YXRpb24pLlxuICAgIGNvbnN0IG5vcm1hbGl6ZWQgPSBTU0VNYW5hZ2VyLm5vcm1hbGl6ZVJlcXVlc3RJZChyZXF1ZXN0SWQpO1xuICAgIGNvbnN0IG5vcm1hbGl6ZWRPcmcgPSBTU0VNYW5hZ2VyLm5vcm1hbGl6ZU9yZ0lkKG9yZ0lkKTtcbiAgICBjb25zdCBvd25lciA9IGF3YWl0IHRoaXMudGlja2V0U3RvcmUuZ2V0U3RyZWFtT3duZXIobm9ybWFsaXplZCk7XG4gICAgaWYgKG93bmVyICYmIG93bmVyICE9PSBub3JtYWxpemVkT3JnKSB7XG4gICAgICBsb2dnZXIud2FybihgU1NFIHRpY2tldCByZWZ1c2VkOiBvcmcgJHtub3JtYWxpemVkT3JnfSBkb2VzIG5vdCBvd24gc3RyZWFtIHN1YmplY3RgKTtcbiAgICAgIHJldHVybiB7IG9rOiBmYWxzZSwgcmVhc29uOiAnZm9yYmlkZGVuJyB9O1xuICAgIH1cblxuICAgIC8vIFRvdGFsIGNhcCBuZXh0IOKAlCBwcm90ZWN0cyBwcm9jZXNzIG1lbW9yeSBldmVuIHdoZW4gYSBzaW5nbGUgb3JnIGlzXG4gICAgLy8gdGhlIG9mZmVuZGVyLiBUaGVuIHRoZSBwZXItb3JnIGNhcCBmb3IgZmFpci1zaGFyZS5cbiAgICBpZiAoKGF3YWl0IHRoaXMudGlja2V0U3RvcmUudG90YWwoKSkgPj0gdGhpcy5tYXhUb3RhbFRpY2tldHMpIHtcbiAgICAgIGxvZ2dlci53YXJuKGBTU0UgdGlja2V0IGNhcCByZWFjaGVkIChtYXg6ICR7dGhpcy5tYXhUb3RhbFRpY2tldHN9KTsgcmVqZWN0aW5nIHRpY2tldCByZXF1ZXN0YCk7XG4gICAgICByZXR1cm4geyBvazogZmFsc2UsIHJlYXNvbjogJ2NhcGFjaXR5JyB9O1xuICAgIH1cbiAgICBpZiAoKGF3YWl0IHRoaXMudGlja2V0U3RvcmUuY291bnRGb3JPcmcobm9ybWFsaXplZE9yZykpID49IHRoaXMubWF4VGlja2V0c1Blck9yZykge1xuICAgICAgbG9nZ2VyLndhcm4oYFBlci1vcmcgU1NFIHRpY2tldCBjYXAgcmVhY2hlZCBmb3IgJHtub3JtYWxpemVkT3JnfSAobWF4OiAke3RoaXMubWF4VGlja2V0c1Blck9yZ30pYCk7XG4gICAgICByZXR1cm4geyBvazogZmFsc2UsIHJlYXNvbjogJ29yZy1saW1pdCcgfTtcbiAgICB9XG5cbiAgICBjb25zdCB0aWNrZXQgPSByYW5kb21CeXRlcygyNCkudG9TdHJpbmcoJ2Jhc2U2NHVybCcpO1xuICAgIGF3YWl0IHRoaXMudGlja2V0U3RvcmUucHV0KHRpY2tldCwgeyBvcmdJZDogbm9ybWFsaXplZE9yZywgcmVxdWVzdElkOiBub3JtYWxpemVkIH0sIHRoaXMudGlja2V0VHRsTXMpO1xuICAgIHJldHVybiB7IG9rOiB0cnVlLCB0aWNrZXQgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBWYWxpZGF0ZSBhbmQgQ09OU1VNRSBhIHRpY2tldCBmb3IgYSBzcGVjaWZpYyBzdHJlYW0gc3ViamVjdC4gU2luZ2xlLXVzZTpcbiAgICogdGhlIHRpY2tldCBpcyBkZWxldGVkIHdoZXRoZXIgb3Igbm90IGl0IHR1cm5zIG91dCB0byBiZSB2YWxpZCwgc28gYSByZXBsYXlcbiAgICogb2YgdGhlIHNhbWUgdmFsdWUgYWx3YXlzIGZhaWxzLiBSZXR1cm5zIHRoZSBib3VuZCBvcmcgb24gc3VjY2Vzcywgb3IgbnVsbFxuICAgKiB3aGVuIHRoZSB0aWNrZXQgaXMgdW5rbm93biAvIGFscmVhZHktdXNlZCAvIGV4cGlyZWQgLyBPUiB3YXMgbWludGVkIGZvciBhXG4gICAqIERJRkZFUkVOVCBgcmVxdWVzdElkYCB0aGFuIHRoZSBvbmUgYmVpbmcgb3BlbmVkLlxuICAgKlxuICAgKiBUaGUgc3ViamVjdCBjaGVjayBpcyB0aGUgYXV0aG9yaXphdGlvbiBmaXg6IHdpdGhvdXQgaXQsIGEgdGlja2V0IG1pbnRlZCBmb3JcbiAgICogb25lIHN0cmVhbSBjb3VsZCBiZSBwcmVzZW50ZWQgdG8gb3BlbiBBTlkgc3RyZWFtIHRoZSBob2xkZXIncyBvcmcgY291bGRcbiAgICogbmFtZSwgbGV0dGluZyBhbiBhdXRoZW50aWNhdGVkIG9yZyBhdHRhY2ggdG8gYW5vdGhlciBvcmcncyBsb2cgc3RyZWFtIGJ5XG4gICAqIGd1ZXNzaW5nIGl0cyByZXF1ZXN0SWQuIFRoZSBnZW5lcmljIDQwMSB0aGUgY2FsbGVyIHJldHVybnMgZG9lcyBub3RcbiAgICogZGlzdGluZ3Vpc2ggXCJ1bmtub3duIHRpY2tldFwiIGZyb20gXCJ3cm9uZyBzdWJqZWN0XCIsIHNvIGl0IGxlYWtzIG5vdGhpbmdcbiAgICogYWJvdXQgd2hpY2ggcmVxdWVzdElkcyBleGlzdC5cbiAgICpcbiAgICogQHBhcmFtIHRpY2tldElkIC0gVGhlIG9wYXF1ZSB0aWNrZXQgdmFsdWUgZnJvbSBgP3RpY2tldD1gLlxuICAgKiBAcGFyYW0gcmVxdWVzdElkIC0gVGhlIHN0cmVhbSBzdWJqZWN0IGZyb20gdGhlIFVSTCBwYXRoIChgOnJlcXVlc3RJZGApLFxuICAgKiAgIGFscmVhZHkgZm9ybWF0LXZhbGlkYXRlZCBieSB0aGUgY2FsbGVyLlxuICAgKi9cbiAgYXN5bmMgY29uc3VtZVRpY2tldCh0aWNrZXRJZDogc3RyaW5nLCByZXF1ZXN0SWQ6IHN0cmluZyk6IFByb21pc2U8eyBvcmdJZDogc3RyaW5nIH0gfCBudWxsPiB7XG4gICAgY29uc3QgdGlja2V0ID0gYXdhaXQgdGhpcy50aWNrZXRTdG9yZS5jb25zdW1lKHRpY2tldElkKTsgLy8gc2luZ2xlLXVzZVxuICAgIGlmICghdGlja2V0KSByZXR1cm4gbnVsbDtcbiAgICAvLyBTdWJqZWN0IGJpbmRpbmcg4oCUIHJlamVjdCBhIHRpY2tldCBwcmVzZW50ZWQgZm9yIGEgc3ViamVjdCBpdCB3YXMgbm90XG4gICAgLy8gbWludGVkIGZvci4gQm90aCBzaWRlcyBhcmUgbm9ybWFsaXplZCBzbyBkYXNoZWQvdW5kYXNoZWQgZm9ybXMgbWF0Y2guXG4gICAgaWYgKHRpY2tldC5yZXF1ZXN0SWQgIT09IFNTRU1hbmFnZXIubm9ybWFsaXplUmVxdWVzdElkKHJlcXVlc3RJZCkpIHJldHVybiBudWxsO1xuICAgIHJldHVybiB7IG9yZ0lkOiB0aWNrZXQub3JnSWQgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGRzIGEgY2xpZW50IHRvIHRoZSBTU0UgbWFuYWdlclxuICAgKlxuICAgKiBAcGFyYW0gcmVxdWVzdElkIC0gVW5pcXVlIHJlcXVlc3QgSURcbiAgICogQHBhcmFtIHJlcyAtIEV4cHJlc3MgUmVzcG9uc2Ugb2JqZWN0XG4gICAqIEBwYXJhbSBvcmdJZCAtIEF1dGhlbnRpY2F0ZWQgb3JnIGlkIChvcHRpb25hbCkuIFdoZW4gc2V0LCBlbmZvcmNlcyB0aGVcbiAgICogICBwZXItb3JnIGNhcCBhbmQgdGhlIGNvdW50ZXIgaXMgZGVjcmVtZW50ZWQgb24gZGlzY29ubmVjdC9jbGVhbnVwLlxuICAgKiBAcmV0dXJucyB0cnVlIGlmIGNsaWVudCB3YXMgYWRkZWQsIGZhbHNlIGlmIHJlamVjdGVkIChsaW1pdCByZWFjaGVkKVxuICAgKi9cbiAgYWRkQ2xpZW50KHJlcXVlc3RJZDogc3RyaW5nLCByZXM6IFJlc3BvbnNlLCBvcmdJZD86IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIGNvbnN0IGV4aXN0aW5nID0gdGhpcy5jbGllbnRzLmdldChyZXF1ZXN0SWQpIHx8IFtdO1xuXG4gICAgLy8gQ2hlY2sgY2xpZW50IGxpbWl0XG4gICAgaWYgKGV4aXN0aW5nLmxlbmd0aCA+PSB0aGlzLm1heENsaWVudHNQZXJSZXF1ZXN0KSB7XG4gICAgICBsb2dnZXIud2FybihgQ2xpZW50IGxpbWl0IHJlYWNoZWQgZm9yIHJlcXVlc3QgJHtyZXF1ZXN0SWR9IChtYXg6ICR7dGhpcy5tYXhDbGllbnRzUGVyUmVxdWVzdH0pYCk7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgLy8gUHJvY2Vzcy13aWRlIGNhcDogcHJvdGVjdHMgZmQgdGFibGUgKyBtZW1vcnkgZnJvbSBydW5hd2F5IGRhc2hib2FyZHMuXG4gICAgaWYgKHRoaXMudG90YWxDbGllbnRzKCkgPj0gdGhpcy5tYXhUb3RhbENsaWVudHMpIHtcbiAgICAgIGxvZ2dlci53YXJuKGBUb3RhbCBTU0UgY2xpZW50IGNhcCByZWFjaGVkIChtYXg6ICR7dGhpcy5tYXhUb3RhbENsaWVudHN9KTsgcmVqZWN0aW5nIG5ldyBjb25uZWN0aW9uYCk7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgLy8gUGVyLW9yZyBjYXA6IHByZXZlbnRzIG9uZSBub2lzeSBvcmcgZnJvbSBtb25vcG9saXppbmcgcHJvY2Vzcy13aWRlXG4gICAgLy8gc2xvdHMuIEVuZm9yY2VkIG9ubHkgd2hlbiBvcmdJZCBpcyBrbm93biDigJQgc2VydmljZS1pbnRlcm5hbCAvIGFub255bW91c1xuICAgIC8vIHN0cmVhbXMgdGhhdCBuZXZlciBpZGVudGlmeSB3aXRoIGFuIG9yZ0lkIHN0YXkgc3ViamVjdCB0byB0aGUgZ2xvYmFsXG4gICAgLy8gY2VpbGluZ3MgYWJvdmUuIFJlc2VydmUgYXRvbWljYWxseSBiZWZvcmUgaW5zZXJ0IHNvIHR3byBjb25jdXJyZW50XG4gICAgLy8gcmVxdWVzdHMgYXQgdGhlIGxpbWl0IGNhbid0IGJvdGggc3VjY2VlZC5cbiAgICBpZiAob3JnSWQpIHtcbiAgICAgIGNvbnN0IG9yZ0N1cnJlbnQgPSB0aGlzLm9yZ0NsaWVudENvdW50cy5nZXQob3JnSWQpID8/IDA7XG4gICAgICBpZiAob3JnQ3VycmVudCA+PSB0aGlzLm1heENsaWVudHNQZXJPcmcpIHtcbiAgICAgICAgbG9nZ2VyLndhcm4oYFBlci1vcmcgU1NFIGNsaWVudCBjYXAgcmVhY2hlZCBmb3IgJHtvcmdJZH0gKG1heDogJHt0aGlzLm1heENsaWVudHNQZXJPcmd9KTsgcmVqZWN0aW5nIG5ldyBjb25uZWN0aW9uYCk7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICAgIHRoaXMub3JnQ2xpZW50Q291bnRzLnNldChvcmdJZCwgb3JnQ3VycmVudCArIDEpO1xuICAgIH1cblxuICAgIC8vIENyZWF0ZSB0aW1lb3V0IGZvciB0aGlzIGNsaWVudFxuICAgIGNvbnN0IGNsaWVudElkID0gdXVpZCgpO1xuICAgIGNvbnN0IHRpbWVvdXQgPSBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIGxvZ2dlci5kZWJ1ZyhgQ2xpZW50ICR7Y2xpZW50SWR9IHRpbWVkIG91dCBmb3IgcmVxdWVzdCAke3JlcXVlc3RJZH1gKTtcbiAgICAgIHRoaXMucmVtb3ZlQ2xpZW50KHJlcXVlc3RJZCwgY2xpZW50SWQpO1xuICAgICAgdHJ5IHtcbiAgICAgICAgcmVzLmVuZCgpO1xuICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgIGxvZ2dlci5kZWJ1ZygnUmVzcG9uc2UgYWxyZWFkeSBjbG9zZWQgb24gdGltZW91dCcsIHsgcmVxdWVzdElkLCBjbGllbnRJZCwgZXJyb3I6IGVyciBpbnN0YW5jZW9mIEVycm9yID8gZXJyLm1lc3NhZ2UgOiBTdHJpbmcoZXJyKSB9KTtcbiAgICAgIH1cbiAgICB9LCB0aGlzLmNsaWVudFRpbWVvdXRNcyk7XG5cbiAgICBjb25zdCBjbGllbnQ6IFNTRUNsaWVudCA9IHtcbiAgICAgIGlkOiBjbGllbnRJZCxcbiAgICAgIHJlcyxcbiAgICAgIGNvbm5lY3RlZEF0OiBEYXRlLm5vdygpLFxuICAgICAgdGltZW91dCxcbiAgICAgIGJhY2twcmVzc3VyZUNvdW50OiAwLFxuICAgICAgb3JnSWQsXG4gICAgfTtcblxuICAgIC8vIEhhbmRsZSBkaXNjb25uZWN0aW9uXG4gICAgcmVzLm9uKCdjbG9zZScsICgpID0+IHtcbiAgICAgIGNsZWFyVGltZW91dCh0aW1lb3V0KTtcbiAgICAgIHRoaXMucmVtb3ZlQ2xpZW50KHJlcXVlc3RJZCwgY2xpZW50SWQpO1xuICAgIH0pO1xuXG4gICAgcmVzLm9uKCdlcnJvcicsIChlcnIpID0+IHtcbiAgICAgIGxvZ2dlci5lcnJvcihgU1NFIGNsaWVudCBlcnJvciBmb3IgcmVxdWVzdCAke3JlcXVlc3RJZH06YCwgZXJyKTtcbiAgICAgIGNsZWFyVGltZW91dCh0aW1lb3V0KTtcbiAgICAgIHRoaXMucmVtb3ZlQ2xpZW50KHJlcXVlc3RJZCwgY2xpZW50SWQpO1xuICAgIH0pO1xuXG4gICAgZXhpc3RpbmcucHVzaChjbGllbnQpO1xuICAgIHRoaXMuY2xpZW50cy5zZXQocmVxdWVzdElkLCBleGlzdGluZyk7XG5cbiAgICBsb2dnZXIuZGVidWcoYENsaWVudCAke2NsaWVudElkfSBjb25uZWN0ZWQgZm9yIHJlcXVlc3QgJHtyZXF1ZXN0SWR9ICh0b3RhbDogJHtleGlzdGluZy5sZW5ndGh9KWApO1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgLyoqIERyb3Agb25lIGZyb20gdGhlIHBlci1vcmcgY291bnRlci4gSWRlbXBvdGVudDogYSBjb3VudGVyIGF0IDAgc3RheXMgYXQgMFxuICAgKiAgYW5kIHRoZSBvcmcga2V5IGlzIHJlbW92ZWQgZnJvbSB0aGUgbWFwLiAqL1xuICBwcml2YXRlIGRlY3JlbWVudE9yZ0NvdW50KG9yZ0lkPzogc3RyaW5nKTogdm9pZCB7XG4gICAgaWYgKCFvcmdJZCkgcmV0dXJuO1xuICAgIGNvbnN0IGN1cnJlbnQgPSB0aGlzLm9yZ0NsaWVudENvdW50cy5nZXQob3JnSWQpID8/IDA7XG4gICAgaWYgKGN1cnJlbnQgPD0gMSkgdGhpcy5vcmdDbGllbnRDb3VudHMuZGVsZXRlKG9yZ0lkKTtcbiAgICBlbHNlIHRoaXMub3JnQ2xpZW50Q291bnRzLnNldChvcmdJZCwgY3VycmVudCAtIDEpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlbW92ZXMgYSBjbGllbnQgZnJvbSB0aGUgbWFuYWdlclxuICAgKi9cbiAgcHJpdmF0ZSByZW1vdmVDbGllbnQocmVxdWVzdElkOiBzdHJpbmcsIGNsaWVudElkOiBzdHJpbmcpOiB2b2lkIHtcbiAgICBjb25zdCBjbGllbnRzID0gdGhpcy5jbGllbnRzLmdldChyZXF1ZXN0SWQpO1xuICAgIGlmICghY2xpZW50cykgcmV0dXJuO1xuXG4gICAgY29uc3QgcmVtYWluaW5nID0gY2xpZW50cy5maWx0ZXIoYyA9PiB7XG4gICAgICBpZiAoYy5pZCA9PT0gY2xpZW50SWQpIHtcbiAgICAgICAgY2xlYXJUaW1lb3V0KGMudGltZW91dCk7XG4gICAgICAgIC8vIE1pcnJvciB0aGUgcGVyLW9yZyBjb3VudGVyIOKAlCBtdXN0IGRlY3JlbWVudCBoZXJlLCBub3QganVzdCBpbiB0aGVcbiAgICAgICAgLy8gZXhwbGljaXQgY2xvc2UgcGF0aHMsIHNpbmNlICdjbG9zZScvJ2Vycm9yJyBldmVudCBoYW5kbGVycyBhcmUgdGhlXG4gICAgICAgIC8vIHByaW1hcnkgZGlzY29ubmVjdCBzaWduYWwgaW4gcHJhY3RpY2UuXG4gICAgICAgIHRoaXMuZGVjcmVtZW50T3JnQ291bnQoYy5vcmdJZCk7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH0pO1xuXG4gICAgaWYgKHJlbWFpbmluZy5sZW5ndGggPT09IDApIHtcbiAgICAgIHRoaXMuY2xpZW50cy5kZWxldGUocmVxdWVzdElkKTtcbiAgICAgIGxvZ2dlci5kZWJ1ZyhgQWxsIGNsaWVudHMgZGlzY29ubmVjdGVkIGZvciByZXF1ZXN0ICR7cmVxdWVzdElkfWApO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmNsaWVudHMuc2V0KHJlcXVlc3RJZCwgcmVtYWluaW5nKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogU2VuZHMgYSBtZXNzYWdlIHRvIGFsbCBTU0UgY2xpZW50cyBmb3IgYSByZXF1ZXN0SWRcbiAgICpcbiAgICogQHBhcmFtIHJlcXVlc3RJZCAtIFJlcXVlc3QgSURcbiAgICogQHBhcmFtIHR5cGUgLSBFdmVudCB0eXBlXG4gICAqIEBwYXJhbSBtZXNzYWdlIC0gTWVzc2FnZSBzdHJpbmdcbiAgICogQHBhcmFtIGRhdGEgLSBPcHRpb25hbCBhZGRpdGlvbmFsIGRhdGFcbiAgICogQHJldHVybnMgTnVtYmVyIG9mIGNsaWVudHMgdGhlIG1lc3NhZ2Ugd2FzIHNlbnQgdG9cbiAgICovXG4gIHNlbmQocmVxdWVzdElkOiBzdHJpbmcsIHR5cGU6IFNTRUV2ZW50VHlwZSwgbWVzc2FnZTogc3RyaW5nLCBkYXRhPzogdW5rbm93bik6IG51bWJlciB7XG4gICAgY29uc3QgcGF5bG9hZDogU1NFUGF5bG9hZCA9IHtcbiAgICAgIHRzOiBuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKCksXG4gICAgICB0eXBlLFxuICAgICAgbWVzc2FnZSxcbiAgICAgIGRhdGEsXG4gICAgfTtcblxuICAgIC8vIERlbGl2ZXIgdG8gTE9DQUwgY2xpZW50cyBmaXJzdCwgdGhlbiByZWxheSB0aGUgU0FNRSBwYXlsb2FkIHRvIG90aGVyIHBvZHNcbiAgICAvLyBzbyBhbiBFdmVudFNvdXJjZSBhdHRhY2hlZCBvbiBhIGRpZmZlcmVudCByZXBsaWNhIGFsc28gcmVjZWl2ZXMgaXQuIFRoZVxuICAgIC8vIHJlbGF5IGlzIGZpcmUtYW5kLWZvcmdldCBhbmQgZmFpbC1zYWZlOiBubyByZWxheSAvIFJlZGlzIGRvd24g4oeSIGxvY2FsLW9ubHkuXG4gICAgY29uc3Qgc2VudENvdW50ID0gdGhpcy5zZW5kTG9jYWwocmVxdWVzdElkLCBwYXlsb2FkKTtcbiAgICB0aGlzLnB1Ymxpc2hSZWxheSh7IG9yaWdpbjogdGhpcy5ub2RlSWQsIGtpbmQ6ICdzZW5kJywgcmVxdWVzdElkLCBwYXlsb2FkIH0pO1xuICAgIHJldHVybiBzZW50Q291bnQ7XG4gIH1cblxuICAvKipcbiAgICogV3JpdGUgYSBwcmUtYnVpbHQgcGF5bG9hZCB0byB0aGlzIHBvZCdzIExPQ0FMIGNsaWVudHMgZm9yIGByZXF1ZXN0SWRgLiBTaGFyZWRcbiAgICogYnkge0BsaW5rIHNlbmR9IChsb2NhbCBoYWxmKSBhbmQgdGhlIHJlbGF5IHJlLWVtaXQgcGF0aCAoe0BsaW5rIG9uUmVsYXlNZXNzYWdlfSksXG4gICAqIHNvIGEgcmVsYXllZCBmcmFtZSByZXVzZXMgdGhlIHByb2R1Y2VyJ3Mgb3JpZ2luYWwgYHRzYCByYXRoZXIgdGhhbiBhIG5ldyBvbmUuXG4gICAqIE5ldmVyIHJlbGF5cyDigJQgY2FsbGVycyBkZWNpZGUgd2hldGhlciB0byBwdWJsaXNoLlxuICAgKi9cbiAgcHJpdmF0ZSBzZW5kTG9jYWwocmVxdWVzdElkOiBzdHJpbmcsIHBheWxvYWQ6IFNTRVBheWxvYWQpOiBudW1iZXIge1xuICAgIGNvbnN0IGNsaWVudHMgPSBbLi4uKHRoaXMuY2xpZW50cy5nZXQocmVxdWVzdElkKSB8fCBbXSldO1xuICAgIGxldCBzZW50Q291bnQgPSAwO1xuICAgIGNvbnN0IHNlcmlhbGl6ZWQgPSBgZGF0YTogJHtKU09OLnN0cmluZ2lmeShwYXlsb2FkKX1cXG5cXG5gO1xuXG4gICAgZm9yIChjb25zdCBjbGllbnQgb2YgY2xpZW50cykge1xuICAgICAgdHJ5IHtcbiAgICAgICAgLy8gQmFja3ByZXNzdXJlOiBza2lwIGNsaWVudHMgd2hvc2Ugd3JpdGUgYnVmZmVyIGlzIGZ1bGxcbiAgICAgICAgaWYgKGNsaWVudC5yZXMud3JpdGFibGVFbmRlZCkge1xuICAgICAgICAgIHRoaXMucmVtb3ZlQ2xpZW50KHJlcXVlc3RJZCwgY2xpZW50LmlkKTtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBjYW5Xcml0ZSA9IGNsaWVudC5yZXMud3JpdGUoc2VyaWFsaXplZCk7XG4gICAgICAgIGlmICghY2FuV3JpdGUpIHtcbiAgICAgICAgICBjbGllbnQuYmFja3ByZXNzdXJlQ291bnQrKztcbiAgICAgICAgICAvLyBEaXNjb25uZWN0IGNsaWVudHMgdGhhdCBjb25zaXN0ZW50bHkgY2FuJ3Qga2VlcCB1cCAoMTAgY29uc2VjdXRpdmUgYmFja3ByZXNzdXJlIGV2ZW50cylcbiAgICAgICAgICBpZiAoY2xpZW50LmJhY2twcmVzc3VyZUNvdW50ID49IENvcmVDb25zdGFudHMuU1NFX0JBQ0tQUkVTU1VSRV9USFJFU0hPTEQpIHtcbiAgICAgICAgICAgIGxvZ2dlci53YXJuKGBEaXNjb25uZWN0aW5nIHNsb3cgY2xpZW50ICR7Y2xpZW50LmlkfSBmb3IgcmVxdWVzdCAke3JlcXVlc3RJZH0gKCR7Y2xpZW50LmJhY2twcmVzc3VyZUNvdW50fSBiYWNrcHJlc3N1cmUgZXZlbnRzKWApO1xuICAgICAgICAgICAgdGhpcy5yZW1vdmVDbGllbnQocmVxdWVzdElkLCBjbGllbnQuaWQpO1xuICAgICAgICAgICAgdHJ5IHsgY2xpZW50LnJlcy5lbmQoKTsgfSBjYXRjaCB7IC8qIGFscmVhZHkgY2xvc2VkICovIH1cbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBjbGllbnQuYmFja3ByZXNzdXJlQ291bnQgPSAwOyAvLyBSZXNldCBvbiBzdWNjZXNzZnVsIHdyaXRlXG4gICAgICAgIH1cbiAgICAgICAgc2VudENvdW50Kys7XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBsb2dnZXIuZXJyb3IoYEZhaWxlZCB0byBzZW5kIHRvIGNsaWVudCAke2NsaWVudC5pZH06YCwgZXJyb3IpO1xuICAgICAgICB0aGlzLnJlbW92ZUNsaWVudChyZXF1ZXN0SWQsIGNsaWVudC5pZCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHNlbnRDb3VudDtcbiAgfVxuXG4gIC8qKlxuICAgKiBCcm9hZGNhc3QgYSBtZXNzYWdlIHRvIGFsbCBjb25uZWN0ZWQgY2xpZW50cyBhY3Jvc3MgYWxsIHJlcXVlc3RzXG4gICAqXG4gICAqIEBwYXJhbSB0eXBlIC0gRXZlbnQgdHlwZVxuICAgKiBAcGFyYW0gbWVzc2FnZSAtIE1lc3NhZ2Ugc3RyaW5nXG4gICAqIEBwYXJhbSBkYXRhIC0gT3B0aW9uYWwgYWRkaXRpb25hbCBkYXRhXG4gICAqIEByZXR1cm5zIFRvdGFsIG51bWJlciBvZiBjbGllbnRzIHRoZSBtZXNzYWdlIHdhcyBzZW50IHRvXG4gICAqL1xuICBicm9hZGNhc3QodHlwZTogU1NFRXZlbnRUeXBlLCBtZXNzYWdlOiBzdHJpbmcsIGRhdGE/OiB1bmtub3duKTogbnVtYmVyIHtcbiAgICBjb25zdCBwYXlsb2FkOiBTU0VQYXlsb2FkID0ge1xuICAgICAgdHM6IG5ldyBEYXRlKCkudG9JU09TdHJpbmcoKSxcbiAgICAgIHR5cGUsXG4gICAgICBtZXNzYWdlLFxuICAgICAgZGF0YSxcbiAgICB9O1xuICAgIC8vIERlbGl2ZXIgdG8gbG9jYWwgY2xpZW50cywgdGhlbiByZWxheSBhIHNpbmdsZSBicm9hZGNhc3QgZnJhbWUgc28gRVZFUlkgcG9kXG4gICAgLy8gcmUtZW1pdHMgdG8gQUxMIG9mIGl0cyBvd24gY2xpZW50cyDigJQgYSBwZXItcmVxdWVzdElkIHJlbGF5IHdvdWxkIG1pc3NcbiAgICAvLyBzdWJqZWN0cyB0aGF0IG9ubHkgZXhpc3Qgb24gb3RoZXIgcmVwbGljYXMuXG4gICAgY29uc3QgdG90YWxTZW50ID0gdGhpcy5icm9hZGNhc3RMb2NhbChwYXlsb2FkKTtcbiAgICB0aGlzLnB1Ymxpc2hSZWxheSh7IG9yaWdpbjogdGhpcy5ub2RlSWQsIGtpbmQ6ICdicm9hZGNhc3QnLCBwYXlsb2FkIH0pO1xuICAgIHJldHVybiB0b3RhbFNlbnQ7XG4gIH1cblxuICAvKiogV3JpdGUgYSBwcmUtYnVpbHQgcGF5bG9hZCB0byBhbGwgTE9DQUwgY2xpZW50cyBhY3Jvc3MgZXZlcnkgcmVxdWVzdC4gKi9cbiAgcHJpdmF0ZSBicm9hZGNhc3RMb2NhbChwYXlsb2FkOiBTU0VQYXlsb2FkKTogbnVtYmVyIHtcbiAgICBsZXQgdG90YWxTZW50ID0gMDtcbiAgICBmb3IgKGNvbnN0IHJlcXVlc3RJZCBvZiBbLi4udGhpcy5jbGllbnRzLmtleXMoKV0pIHtcbiAgICAgIHRvdGFsU2VudCArPSB0aGlzLnNlbmRMb2NhbChyZXF1ZXN0SWQsIHBheWxvYWQpO1xuICAgIH1cbiAgICByZXR1cm4gdG90YWxTZW50O1xuICB9XG5cbiAgLyoqIEZpcmUtYW5kLWZvcmdldCByZWxheSBwdWJsaXNoLiBOby1vcCAobG9jYWwtb25seSkgd2hlbiBubyByZWxheSBpcyB3aXJlZC4gKi9cbiAgcHJpdmF0ZSBwdWJsaXNoUmVsYXkobXNnOiBTU0VSZWxheU1lc3NhZ2UpOiB2b2lkIHtcbiAgICB0aGlzLnJlbGF5Py5wdWJsaXNoKG1zZyk7XG4gIH1cblxuICAvKipcbiAgICogQ2xvc2UgYWxsIGNsaWVudHMgZm9yIGEgc3BlY2lmaWMgcmVxdWVzdFxuICAgKlxuICAgKiBAcGFyYW0gcmVxdWVzdElkIC0gUmVxdWVzdCBJRCB0byBjbG9zZVxuICAgKiBAcGFyYW0gZmluYWxNZXNzYWdlIC0gT3B0aW9uYWwgZmluYWwgbWVzc2FnZSB0byBzZW5kIGJlZm9yZSBjbG9zaW5nXG4gICAqL1xuICBjbG9zZVJlcXVlc3QocmVxdWVzdElkOiBzdHJpbmcsIGZpbmFsTWVzc2FnZT86IHN0cmluZyk6IHZvaWQge1xuICAgIGNvbnN0IGNsaWVudHMgPSB0aGlzLmNsaWVudHMuZ2V0KHJlcXVlc3RJZCk7XG4gICAgaWYgKCFjbGllbnRzKSByZXR1cm47XG5cbiAgICBpZiAoZmluYWxNZXNzYWdlKSB7XG4gICAgICB0aGlzLnNlbmQocmVxdWVzdElkLCAnQ09NUExFVEVEJywgZmluYWxNZXNzYWdlKTtcbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IGNsaWVudCBvZiBjbGllbnRzKSB7XG4gICAgICBjbGVhclRpbWVvdXQoY2xpZW50LnRpbWVvdXQpO1xuICAgICAgdGhpcy5kZWNyZW1lbnRPcmdDb3VudChjbGllbnQub3JnSWQpO1xuICAgICAgdHJ5IHtcbiAgICAgICAgY2xpZW50LnJlcy5lbmQoKTtcbiAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICBsb2dnZXIuZGVidWcoJ1Jlc3BvbnNlIGFscmVhZHkgY2xvc2VkIG9uIHJlcXVlc3QgY2xvc2UnLCB7IHJlcXVlc3RJZCwgY2xpZW50SWQ6IGNsaWVudC5pZCwgZXJyb3I6IGVyciBpbnN0YW5jZW9mIEVycm9yID8gZXJyLm1lc3NhZ2UgOiBTdHJpbmcoZXJyKSB9KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB0aGlzLmNsaWVudHMuZGVsZXRlKHJlcXVlc3RJZCk7XG4gICAgbG9nZ2VyLmRlYnVnKGBDbG9zZWQgYWxsIGNsaWVudHMgZm9yIHJlcXVlc3QgJHtyZXF1ZXN0SWR9YCk7XG4gIH1cblxuICAvKipcbiAgICogR2V0IHN0YXRpc3RpY3MgYWJvdXQgY3VycmVudCBjb25uZWN0aW9uc1xuICAgKi9cbiAgZ2V0U3RhdHMoKTogU1NFTWFuYWdlclN0YXRzIHtcbiAgICBsZXQgdG90YWxDbGllbnRzID0gMDtcbiAgICBsZXQgb2xkZXN0Q29ubmVjdGlvbjogbnVtYmVyIHwgbnVsbCA9IG51bGw7XG4gICAgY29uc3Qgbm93ID0gRGF0ZS5ub3coKTtcblxuICAgIGZvciAoY29uc3QgY2xpZW50cyBvZiB0aGlzLmNsaWVudHMudmFsdWVzKCkpIHtcbiAgICAgIHRvdGFsQ2xpZW50cyArPSBjbGllbnRzLmxlbmd0aDtcbiAgICAgIGZvciAoY29uc3QgY2xpZW50IG9mIGNsaWVudHMpIHtcbiAgICAgICAgY29uc3QgYWdlID0gbm93IC0gY2xpZW50LmNvbm5lY3RlZEF0O1xuICAgICAgICBpZiAob2xkZXN0Q29ubmVjdGlvbiA9PT0gbnVsbCB8fCBhZ2UgPiBvbGRlc3RDb25uZWN0aW9uKSB7XG4gICAgICAgICAgb2xkZXN0Q29ubmVjdGlvbiA9IGFnZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICB0b3RhbFJlcXVlc3RzOiB0aGlzLmNsaWVudHMuc2l6ZSxcbiAgICAgIHRvdGFsQ2xpZW50cyxcbiAgICAgIG9sZGVzdENvbm5lY3Rpb25Nczogb2xkZXN0Q29ubmVjdGlvbixcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrIGlmIGEgcmVxdWVzdCBoYXMgYW55IGNvbm5lY3RlZCBjbGllbnRzXG4gICAqL1xuICBoYXNDbGllbnRzKHJlcXVlc3RJZDogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgY29uc3QgY2xpZW50cyA9IHRoaXMuY2xpZW50cy5nZXQocmVxdWVzdElkKTtcbiAgICByZXR1cm4gY2xpZW50cyAhPT0gdW5kZWZpbmVkICYmIGNsaWVudHMubGVuZ3RoID4gMDtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgdGhlIG51bWJlciBvZiBjbGllbnRzIGZvciBhIHNwZWNpZmljIHJlcXVlc3RcbiAgICovXG4gIGdldENsaWVudENvdW50KHJlcXVlc3RJZDogc3RyaW5nKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5jbGllbnRzLmdldChyZXF1ZXN0SWQpPy5sZW5ndGggPz8gMDtcbiAgfVxuXG4gIC8qKlxuICAgKiBNaWRkbGV3YXJlIHRvIGluaXRpYWxpemUgYSB0aWNrZXQtYXV0aGVudGljYXRlZCBTU0UgY29ubmVjdGlvbi5cbiAgICpcbiAgICogVGhlIHN0cmVhbSBpcyBOT1Qgb3BlbiB0byB0aGUgd29ybGQ6IHRoZSBjYWxsZXIgbXVzdCBmaXJzdCBleGNoYW5nZSBpdHNcbiAgICogSldUIGZvciBhIHNob3J0LWxpdmVkIHNpbmdsZS11c2UgdGlja2V0IChzZWUge0BsaW5rIGNyZWF0ZVRpY2tldH0sIHdpcmVkIHRvXG4gICAqIGBQT1NUIC9sb2dzL3RpY2tldGApIGFuZCBwYXNzIGl0IGFzIGA/dGlja2V0PTx0PmAuIFRoZSBtaWRkbGV3YXJlIHZhbGlkYXRlc1xuICAgKiArIGNvbnN1bWVzIHRoZSB0aWNrZXQsIGJpbmRzIHRoZSBjb25uZWN0aW9uIHRvIHRoZSB0aWNrZXQncyBvcmcsIGFuZFxuICAgKiBlbmZvcmNlcyB0aGUgcGVyLW9yZyBjb25uZWN0aW9uIGNhcC4gQSBtaXNzaW5nIC8gaW52YWxpZCAvIGV4cGlyZWQgL1xuICAgKiBhbHJlYWR5LXVzZWQgdGlja2V0IGlzIHJlamVjdGVkIHdpdGggNDAxIGJlZm9yZSBhbnkgU1NFIGhlYWRlcnMgZmx1c2guXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIGBgYHR5cGVzY3JpcHRcbiAgICogYXBwLmdldCgnL2xvZ3MvOnJlcXVlc3RJZCcsIHNzZU1hbmFnZXIubWlkZGxld2FyZSgpKTtcbiAgICogYGBgXG4gICAqL1xuICBtaWRkbGV3YXJlKCkge1xuICAgIHJldHVybiBhc3luYyAocmVxOiB7IHBhcmFtczogeyByZXF1ZXN0SWQ6IHN0cmluZyB9OyBxdWVyeT86IHsgdGlja2V0PzogdW5rbm93biB9IH0sIHJlczogUmVzcG9uc2UpID0+IHtcbiAgICAgIGNvbnN0IHsgcmVxdWVzdElkIH0gPSByZXEucGFyYW1zO1xuXG4gICAgICBpZiAoIVNTRV9SRVFVRVNUX0lEX1JFLnRlc3QocmVxdWVzdElkKSkge1xuICAgICAgICByZXMuc3RhdHVzKDQwMCkuZW5kKCdJbnZhbGlkIHJlcXVlc3RJZCBmb3JtYXQnKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICAvLyBUaWNrZXQgYXV0aCDigJQgcmVxdWlyZWQuIFJlc29sdmUgYD90aWNrZXQ9PHQ+YCwgdGhlbiB2YWxpZGF0ZSArIGNvbnN1bWVcbiAgICAgIC8vIGl0IChzaW5nbGUtdXNlKSBGT1IgVEhJUyBTVUJKRUNULiBBbiBhbm9ueW1vdXMsIG1hbGZvcm1lZCwgdW5rbm93bixcbiAgICAgIC8vIGV4cGlyZWQsIGFscmVhZHktY29uc3VtZWQsIG9yIHdyb25nLXN1YmplY3QgdGlja2V0IGlzIGEgNDAxLiBUaGUgb3JnIGlzXG4gICAgICAvLyB0YWtlbiBmcm9tIHRoZSB0aWNrZXQsIHNvIHRoZSBzdHJlYW0gaXMgYWx3YXlzIGJvdW5kIHRvIGEgdmVyaWZpZWRcbiAgICAgIC8vIHRlbmFudCBBTkQgdG8gdGhlIGV4YWN0IHN1YmplY3QgdGhlIHRpY2tldCB3YXMgbWludGVkIGZvciAobm8gYW5vbnltb3VzXG4gICAgICAvLyBzdHJlYW1zLCBubyBjcm9zcy1zdWJqZWN0IGF0dGFjaCkuXG4gICAgICBjb25zdCB0aWNrZXRJZCA9IHJlcS5xdWVyeT8udGlja2V0O1xuICAgICAgaWYgKHR5cGVvZiB0aWNrZXRJZCAhPT0gJ3N0cmluZycgfHwgdGlja2V0SWQubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIHJlcy5zdGF0dXMoNDAxKS5lbmQoJ01pc3NpbmcgdGlja2V0Jyk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGNvbnN1bWVkID0gYXdhaXQgdGhpcy5jb25zdW1lVGlja2V0KHRpY2tldElkLCByZXF1ZXN0SWQpO1xuICAgICAgaWYgKCFjb25zdW1lZCkge1xuICAgICAgICByZXMuc3RhdHVzKDQwMSkuZW5kKCdJbnZhbGlkIG9yIGV4cGlyZWQgdGlja2V0Jyk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGNvbnN0IG9yZ0lkID0gY29uc3VtZWQub3JnSWQ7XG5cbiAgICAgIC8vIFByZS1mbGlnaHQgcGVyLXJlcXVlc3QgY2FwIHNvIHdlIGNhbiByZXR1cm4gNDI5IGJlZm9yZSBmbHVzaGluZ1xuICAgICAgLy8gU1NFIGhlYWRlcnMgKGFmdGVyIGhlYWRlcnMgYXJlIGZsdXNoZWQgdGhlIGNsaWVudCBjYW4ndCByZWFkIGEgNDI5KS5cbiAgICAgIGNvbnN0IGV4aXN0aW5nID0gdGhpcy5jbGllbnRzLmdldChyZXF1ZXN0SWQpIHx8IFtdO1xuICAgICAgaWYgKGV4aXN0aW5nLmxlbmd0aCA+PSB0aGlzLm1heENsaWVudHNQZXJSZXF1ZXN0KSB7XG4gICAgICAgIGxvZ2dlci53YXJuKGBDbGllbnQgbGltaXQgcmVhY2hlZCBmb3IgcmVxdWVzdCAke3JlcXVlc3RJZH0gKG1heDogJHt0aGlzLm1heENsaWVudHNQZXJSZXF1ZXN0fSlgKTtcbiAgICAgICAgcmVzLnN0YXR1cyg0MjkpLmVuZCgnVG9vIG1hbnkgY29ubmVjdGlvbnMgZm9yIHRoaXMgcmVxdWVzdCcpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIC8vIFNhbWUgZm9yIHRoZSBwZXItb3JnIGNhcCDigJQgYmV0dGVyIHRvIHNlbmQgNDI5IHRoYW4gb3BlbiB0aGUgc3RyZWFtIGFuZFxuICAgICAgLy8gaW1tZWRpYXRlbHkgY2xvc2UgaXQuIFRoZSB0aWNrZXQgZ3VhcmFudGVlcyBhIHZlcmlmaWVkIG9yZyBpZCwgc28gdGhlXG4gICAgICAvLyBwZXItb3JnIGNlaWxpbmcgaXMgYWx3YXlzIGVuZm9yY2VkIGZvciB0aGUgL2xvZ3Mgc3RyZWFtLlxuICAgICAgaWYgKCh0aGlzLm9yZ0NsaWVudENvdW50cy5nZXQob3JnSWQpID8/IDApID49IHRoaXMubWF4Q2xpZW50c1Blck9yZykge1xuICAgICAgICBsb2dnZXIud2FybihgUGVyLW9yZyBTU0UgY2xpZW50IGNhcCByZWFjaGVkIGZvciAke29yZ0lkfSAobWF4OiAke3RoaXMubWF4Q2xpZW50c1Blck9yZ30pYCk7XG4gICAgICAgIHJlcy5zdGF0dXMoNDI5KS5lbmQoJ1RvbyBtYW55IFNTRSBjb25uZWN0aW9ucyBmb3IgdGhpcyBvcmdhbml6YXRpb24nKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICB3cml0ZVNzZUhlYWRlcnMocmVzKTtcbiAgICAgIHJlcy5mbHVzaEhlYWRlcnMoKTtcblxuICAgICAgLy8gSGVhZGVycyBhcmUgZmx1c2hlZCDigJQgd2UgY2FuIG5vIGxvbmdlciBzZW5kIGEgNDI5LiBhZGRDbGllbnQgcmUtY2hlY2tzXG4gICAgICAvLyB0aGUgY2FwcyAoaW5jbHVkaW5nIHRoZSBwcm9jZXNzLXdpZGUgdG90YWwtY2xpZW50cyBjYXAsIHdoaWNoIHRoZVxuICAgICAgLy8gcHJlLWZsaWdodCBhYm92ZSBkb2VzIG5vdCkgYW5kIGNhbiBzdGlsbCByZWplY3Qgb24gYSByYWNlOiBhIGNvbmN1cnJlbnRcbiAgICAgIC8vIGNvbm5lY3Rpb24gbWF5IGhhdmUgZmlsbGVkIGEgY2FwIGJldHdlZW4gdGhlIHByZS1mbGlnaHQgY2hlY2sgYW5kIGhlcmUuXG4gICAgICAvLyBPbiByZWplY3Rpb24sIGNsb3NlIHRoZSBub3ctZGFuZ2xpbmcgcmVzcG9uc2UgaW5zdGVhZCBvZiBsZWF2aW5nIGFuXG4gICAgICAvLyBvcGVuIHNvY2tldCB3aXRoIG5vIGNsaWVudCByZWNvcmQgKHdoaWNoIHdvdWxkIGxlYWsgYW4gZmQgKyBuZXZlciBlbWl0XG4gICAgICAvLyBzdHJlYW0gZGF0YSkuXG4gICAgICBjb25zdCBhZGRlZCA9IHRoaXMuYWRkQ2xpZW50KHJlcXVlc3RJZCwgcmVzLCBvcmdJZCk7XG4gICAgICBpZiAoIWFkZGVkKSB7XG4gICAgICAgIGxvZ2dlci53YXJuKGBTU0UgYWRkQ2xpZW50IHJlamVjdGVkIGFmdGVyIGhlYWRlcnMgZmx1c2hlZCBmb3IgcmVxdWVzdCAke3JlcXVlc3RJZH07IGNsb3NpbmcgZGFuZ2xpbmcgcmVzcG9uc2VgKTtcbiAgICAgICAgdHJ5IHsgcmVzLmVuZCgpOyB9IGNhdGNoIHsgLyogYWxyZWFkeSBjbG9zZWQgKi8gfVxuICAgICAgfVxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogU3RhcnQgcGVyaW9kaWMgY2xlYW51cCBvZiBzdGFsZSBjb25uZWN0aW9uc1xuICAgKi9cbiAgcHJpdmF0ZSBzdGFydENsZWFudXBJbnRlcnZhbChpbnRlcnZhbE1zOiBudW1iZXIpOiB2b2lkIHtcbiAgICB0aGlzLmNsZWFudXBJbnRlcnZhbCA9IHNldEludGVydmFsKCgpID0+IHtcbiAgICAgIHRoaXMuY2xlYW51cCgpO1xuICAgIH0sIGludGVydmFsTXMpO1xuXG4gICAgLy8gRG9uJ3QgcHJldmVudCBwcm9jZXNzIGV4aXRcbiAgICB0aGlzLmNsZWFudXBJbnRlcnZhbC51bnJlZigpO1xuICB9XG5cbiAgLyoqXG4gICAqIENsZWFuIHVwIHN0YWxlIGNvbm5lY3Rpb25zIHVzaW5nIHNpbmdsZS1wYXNzIHBhcnRpdGlvbi5cbiAgICogTyhSIMOXIEMpIGluc3RlYWQgb2YgTyhSIMOXIEPCsiksIGFuZCBhdm9pZHMgbXV0YXRpb24tZHVyaW5nLWl0ZXJhdGlvbi5cbiAgICovXG4gIHByaXZhdGUgY2xlYW51cCgpOiB2b2lkIHtcbiAgICBjb25zdCBub3cgPSBEYXRlLm5vdygpO1xuICAgIGxldCBjbGVhbmVkID0gMDtcblxuICAgIC8vIFN3ZWVwIGV4cGlyZWQgdGlja2V0cy9vd25lcnMgc28gYW4gaW4tbWVtb3J5IHN0b3JlIHN0YXlzIGJvdW5kZWQgZXZlbiB3aGVuXG4gICAgLy8gdGlja2V0cyBhcmUgbWludGVkIGJ1dCBuZXZlciBjb25zdW1lZCAoY2xpZW50IGNsb3NlZCB0aGUgdGFiIGJlZm9yZVxuICAgIC8vIGNvbm5lY3RpbmcpLiBDb25zdW1lLXRpbWUgc3RpbGwgcmUtY2hlY2tzIGV4cGlyeSwgc28gdGhpcyBpcyBtZW1vcnlcbiAgICAvLyBoeWdpZW5lIG9ubHk7IHRoZSBSZWRpcyBzdG9yZSByZWxpZXMgb24gbmF0aXZlIGtleSBUVEwgKHN3ZWVwIGlzIGEgbm8tb3ApLlxuICAgIHZvaWQgdGhpcy50aWNrZXRTdG9yZS5zd2VlcD8uKCk7XG5cbiAgICBmb3IgKGNvbnN0IFtyZXF1ZXN0SWQsIGNsaWVudHNdIG9mIHRoaXMuY2xpZW50cy5lbnRyaWVzKCkpIHtcbiAgICAgIGNvbnN0IHN0YWxlOiBTU0VDbGllbnRbXSA9IFtdO1xuICAgICAgY29uc3QgYWN0aXZlOiBTU0VDbGllbnRbXSA9IFtdO1xuXG4gICAgICBmb3IgKGNvbnN0IGNsaWVudCBvZiBjbGllbnRzKSB7XG4gICAgICAgIC8vIFRpbWUtYmFzZWQgZXZpY3Rpb24gT1IgYSBzb2NrZXQgdGhhdCBzaWxlbnRseSBjbG9zZWQgKG5vICdjbG9zZSdcbiAgICAgICAgLy8gZXZlbnQpIOKAlCBOb2RlIHNvbWV0aW1lcyBkcm9wcyBzb2NrZXRzIHdpdGhvdXQgZmlyaW5nIHRoZSBldmVudCxcbiAgICAgICAgLy8gc28gd2UgZXhwbGljaXRseSBjaGVjayB3cml0YWJsZUVuZGVkL2Rlc3Ryb3llZCBoZXJlLlxuICAgICAgICBjb25zdCBhZ2VTdGFsZSA9IG5vdyAtIGNsaWVudC5jb25uZWN0ZWRBdCA+IHRoaXMuY2xpZW50VGltZW91dE1zO1xuICAgICAgICBjb25zdCBzb2NrZXREZWFkID0gY2xpZW50LnJlcy53cml0YWJsZUVuZGVkIHx8IChjbGllbnQucmVzIGFzIHsgZGVzdHJveWVkPzogYm9vbGVhbiB9KS5kZXN0cm95ZWQgPT09IHRydWU7XG4gICAgICAgIGlmIChhZ2VTdGFsZSB8fCBzb2NrZXREZWFkKSB7XG4gICAgICAgICAgc3RhbGUucHVzaChjbGllbnQpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGFjdGl2ZS5wdXNoKGNsaWVudCk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgZm9yIChjb25zdCBjbGllbnQgb2Ygc3RhbGUpIHtcbiAgICAgICAgY2xlYXJUaW1lb3V0KGNsaWVudC50aW1lb3V0KTtcbiAgICAgICAgdGhpcy5kZWNyZW1lbnRPcmdDb3VudChjbGllbnQub3JnSWQpO1xuICAgICAgICB0cnkgeyBjbGllbnQucmVzLmVuZCgpOyB9IGNhdGNoIHsgLyogYWxyZWFkeSBjbG9zZWQgKi8gfVxuICAgICAgICBjbGVhbmVkKys7XG4gICAgICB9XG5cbiAgICAgIGlmIChhY3RpdmUubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIHRoaXMuY2xpZW50cy5kZWxldGUocmVxdWVzdElkKTtcbiAgICAgIH0gZWxzZSBpZiAoc3RhbGUubGVuZ3RoID4gMCkge1xuICAgICAgICB0aGlzLmNsaWVudHMuc2V0KHJlcXVlc3RJZCwgYWN0aXZlKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoY2xlYW5lZCA+IDApIHtcbiAgICAgIGxvZ2dlci5pbmZvKGBDbGVhbmVkIHVwICR7Y2xlYW5lZH0gc3RhbGUgU1NFIGNvbm5lY3Rpb25zYCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFNodXRkb3duIHRoZSBTU0UgbWFuYWdlciBhbmQgY2xvc2UgYWxsIGNvbm5lY3Rpb25zXG4gICAqL1xuICBzaHV0ZG93bigpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5jbGVhbnVwSW50ZXJ2YWwpIHtcbiAgICAgIGNsZWFySW50ZXJ2YWwodGhpcy5jbGVhbnVwSW50ZXJ2YWwpO1xuICAgICAgdGhpcy5jbGVhbnVwSW50ZXJ2YWwgPSBudWxsO1xuICAgIH1cblxuICAgIGZvciAoY29uc3QgcmVxdWVzdElkIG9mIFsuLi50aGlzLmNsaWVudHMua2V5cygpXSkge1xuICAgICAgdGhpcy5jbG9zZVJlcXVlc3QocmVxdWVzdElkLCAnU2VydmVyIHNodXR0aW5nIGRvd24nKTtcbiAgICB9XG5cbiAgICAvLyBUZWFyIGRvd24gdGhlIHJlbGF5J3MgUmVkaXMgY29ubmVjdGlvbnMgKGJlc3QtZWZmb3J0OyBuZXZlciB0aHJvd3MpLlxuICAgIHZvaWQgdGhpcy5yZWxheT8uY2xvc2UoKS5jYXRjaCgoKSA9PiB7IC8qIGFscmVhZHkgY2xvc2luZyAqLyB9KTtcblxuICAgIGxvZ2dlci5pbmZvKCdTU0UgTWFuYWdlciBzaHV0IGRvd24nKTtcbiAgfVxufVxuIl19
|
|
633
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3NlLWNvbm5lY3Rpb24tbWFuYWdlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9odHRwL3NzZS1jb25uZWN0aW9uLW1hbmFnZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsK0NBQStDO0FBQy9DLHNDQUFzQztBQUV0QyxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sYUFBYSxDQUFDO0FBQzFDLE9BQU8sRUFBRSxZQUFZLEVBQUUsaUJBQWlCLEVBQUUsZUFBZSxFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFDOUYsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLGlDQUFpQyxDQUFDO0FBRWhFLE9BQU8sRUFBRSxFQUFFLElBQUksSUFBSSxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBRWxDLE9BQU8sRUFBRSx1QkFBdUIsRUFBNkIsTUFBTSx1QkFBdUIsQ0FBQztBQUUzRixNQUFNLE1BQU0sR0FBRyxZQUFZLENBQUMsYUFBYSxDQUFDLENBQUM7QUFpRzNDOzs7Ozs7O0dBT0c7QUFDSCxNQUFNLENBQUMsTUFBTSxpQkFBaUIsR0FBRyxxRUFBcUUsQ0FBQztBQWdCdkc7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBaUJHO0FBQ0gsTUFBTSxPQUFPLFVBQVU7SUFDYixPQUFPLEdBQUcsSUFBSSxHQUFHLEVBQXVCLENBQUM7SUFDakQ7OzJDQUV1QztJQUMvQixlQUFlLEdBQUcsSUFBSSxHQUFHLEVBQWtCLENBQUM7SUFDcEQ7O2lGQUU2RTtJQUM1RCxXQUFXLENBQXVCO0lBQ2xDLG9CQUFvQixDQUFTO0lBQzdCLGVBQWUsQ0FBUztJQUN4QixnQkFBZ0IsQ0FBUztJQUN6QixlQUFlLENBQVM7SUFDeEIsZ0JBQWdCLENBQVM7SUFDekIsV0FBVyxDQUFTO0lBQ3BCLGdCQUFnQixDQUFTO0lBQ3pCLGVBQWUsQ0FBUztJQUNqQyxlQUFlLEdBQTBCLElBQUksQ0FBQztJQUN0RCwrREFBK0Q7SUFDOUMsS0FBSyxDQUFZO0lBQ2xDLGtGQUFrRjtJQUNqRSxN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WUFDWixDQUFDO1lBRUQsSUFBSSxNQUFNLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRSxDQUFDO2dCQUN4QixJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsQ0FBQztZQUNqQyxDQUFDO2lCQUFNLElBQUksS0FBSyxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQztnQkFDNUIsSUFBSSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsU0FBUyxFQUFFLE1BQU0sQ0FBQyxDQUFDO1lBQ3RDLENBQUM7UUFDSCxDQUFDO1FBRUQsSUFBSSxPQUFPLEdBQUcsQ0FBQyxFQUFFLENBQUM7WUFDaEIsTUFBTSxDQUFDLElBQUksQ0FBQyxjQUFjLE9BQU8sd0JBQXdCLENBQUMsQ0FBQztRQUM3RCxDQUFDO0lBQ0gsQ0FBQztJQUVEOztPQUVHO0lBQ0gsUUFBUTtRQUNOLElBQUksSUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFDO1lBQ3pCLGFBQWEsQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDLENBQUM7WUFDcEMsSUFBSSxDQUFDLGVBQWUsR0FBRyxJQUFJLENBQUM7UUFDOUIsQ0FBQztRQUVELEtBQUssTUFBTSxTQUFTLElBQUksQ0FBQyxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxFQUFFLENBQUMsRUFBRSxDQUFDO1lBQ2pELElBQUksQ0FBQyxZQUFZLENBQUMsU0FBUyxFQUFFLHNCQUFzQixDQUFDLENBQUM7UUFDdkQsQ0FBQztRQUVELHVFQUF1RTtRQUN2RSxLQUFLLElBQUksQ0FBQyxLQUFLLEVBQUUsS0FBSyxFQUFFLENBQUMsS0FBSyxDQUFDLEdBQUcsRUFBRSxHQUF5QixDQUFDLENBQUMsQ0FBQztRQUVoRSxNQUFNLENBQUMsSUFBSSxDQUFDLHVCQUF1QixDQUFDLENBQUM7SUFDdkMsQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQ29weXJpZ2h0IDIwMjYgUGlwZWxpbmUgQnVpbGRlciBDb250cmlidXRvcnNcbi8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wXG5cbmltcG9ydCB7IHJhbmRvbUJ5dGVzIH0gZnJvbSAnbm9kZTpjcnlwdG8nO1xuaW1wb3J0IHsgY3JlYXRlTG9nZ2VyLCBTU0VfVElDS0VUX1RUTF9NUywgd3JpdGVTc2VIZWFkZXJzIH0gZnJvbSAnQHBpcGVsaW5lLWJ1aWxkZXIvYXBpLWNvcmUnO1xuaW1wb3J0IHsgQ29yZUNvbnN0YW50cyB9IGZyb20gJ0BwaXBlbGluZS1idWlsZGVyL3BpcGVsaW5lLWNvcmUnO1xuaW1wb3J0IHR5cGUgeyBSZXNwb25zZSB9IGZyb20gJ2V4cHJlc3MnO1xuaW1wb3J0IHsgdjcgYXMgdXVpZCB9IGZyb20gJ3V1aWQnO1xuaW1wb3J0IHR5cGUgeyBTU0VSZWxheSwgU1NFUmVsYXlNZXNzYWdlIH0gZnJvbSAnLi9zc2UtcmVsYXkuanMnO1xuaW1wb3J0IHsgY3JlYXRlTWVtb3J5VGlja2V0U3RvcmUsIHR5cGUgU1NFU3RyZWFtVGlja2V0U3RvcmUgfSBmcm9tICcuL3NzZS10aWNrZXQtc3RvcmUuanMnO1xuXG5jb25zdCBsb2dnZXIgPSBjcmVhdGVMb2dnZXIoJ3NzZS1tYW5hZ2VyJyk7XG5cbi8qKlxuICogRXZlbnQgdHlwZXMgZm9yIFNTRSBsb2dnaW5nXG4gKi9cbmV4cG9ydCB0eXBlIFNTRUV2ZW50VHlwZSA9ICdJTkZPJyB8ICdXQVJOJyB8ICdFUlJPUicgfCAnQ09NUExFVEVEJyB8ICdST0xMQkFDSycgfCAnTUVTU0FHRSc7XG5cbi8qKlxuICogU1NFIHBheWxvYWQgc3RydWN0dXJlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU1NFUGF5bG9hZCB7XG4gIHRzOiBzdHJpbmc7XG4gIHR5cGU6IFNTRUV2ZW50VHlwZTtcbiAgbWVzc2FnZTogc3RyaW5nO1xuICBkYXRhPzogdW5rbm93bjtcbn1cblxuLyoqXG4gKiBTU0UgY2xpZW50IHdpdGggY29ubmVjdGlvbiB0cmFja2luZ1xuICovXG5leHBvcnQgaW50ZXJmYWNlIFNTRUNsaWVudCB7XG4gIGlkOiBzdHJpbmc7XG4gIHJlczogUmVzcG9uc2U7XG4gIGNvbm5lY3RlZEF0OiBudW1iZXI7XG4gIHRpbWVvdXQ6IE5vZGVKUy5UaW1lb3V0O1xuICAvKiogTnVtYmVyIG9mIGNvbnNlY3V0aXZlIGJhY2twcmVzc3VyZSBldmVudHMgKHdyaXRlIHJldHVybmVkIGZhbHNlKS4gKi9cbiAgYmFja3ByZXNzdXJlQ291bnQ6IG51bWJlcjtcbiAgLyoqIE93bmluZyBvcmcgaWQg4oCUIHBvcHVsYXRlZCB3aGVuIHRoZSByZXF1ZXN0IHdhcyBhdXRoZW50aWNhdGVkLiBVc2VkIHRvXG4gICAqICBkZWNyZW1lbnQgdGhlIHBlci1vcmcgY291bnRlciBvbiBkaXNjb25uZWN0IC8gY2xlYW51cC4gKi9cbiAgb3JnSWQ/OiBzdHJpbmc7XG59XG5cbi8qKlxuICogU1NFIE1hbmFnZXIgY29uZmlndXJhdGlvbiBvcHRpb25zXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU1NFTWFuYWdlck9wdGlvbnMge1xuICAvKiogTWF4aW11bSBjbGllbnRzIGFsbG93ZWQgcGVyIHJlcXVlc3QgSUQgKGRlZmF1bHQ6IDEwKSAqL1xuICBtYXhDbGllbnRzUGVyUmVxdWVzdD86IG51bWJlcjtcbiAgLyoqIENsaWVudCB0aW1lb3V0IGluIG1pbGxpc2Vjb25kcyAoZGVmYXVsdDogMzAgbWludXRlcykgKi9cbiAgY2xpZW50VGltZW91dE1zPzogbnVtYmVyO1xuICAvKiogSW50ZXJ2YWwgZm9yIGNsZWFudXAgY2hlY2tzIGluIG1pbGxpc2Vjb25kcyAoZGVmYXVsdDogNSBtaW51dGVzKSAqL1xuICBjbGVhbnVwSW50ZXJ2YWxNcz86IG51bWJlcjtcbiAgLyoqXG4gICAqIEhhcmQgY2FwIG9uIHRvdGFsIG9wZW4gY29ubmVjdGlvbnMgcGVyIHByb2Nlc3MuIERlZmF1bHRzIHRvIDEwMDAgZnJvbVxuICAgKiBgU1NFX01BWF9UT1RBTF9DTElFTlRTYC4gTmV3IGNvbm5lY3Rpb25zIGJleW9uZCB0aGlzIGFyZSByZWplY3RlZCBhdFxuICAgKiBgYWRkQ2xpZW50KClgLiBUdW5lIHVwIGlmIHlvdXIgc2VydmljZSBzZXJ2ZXMgPiAxMDAwIGNvbmN1cnJlbnQgU1NFXG4gICAqIGRhc2hib2FyZHMsIGJ1dCBiZSBhd2FyZSBOb2RlLmpzIGZkIGxpbWl0cyBkb21pbmF0ZSBhYm92ZSB+NTAwMC5cbiAgICovXG4gIG1heFRvdGFsQ2xpZW50cz86IG51bWJlcjtcbiAgLyoqXG4gICAqIFBlci1vcmcgY2VpbGluZyBvbiBjb25jdXJyZW50IFNTRSBzdHJlYW1zLiBEZWZhdWx0cyB0byA1MCBmcm9tXG4gICAqIGBTU0VfTUFYX0NMSUVOVFNfUEVSX09SR2AuIFByb3RlY3RzIGFnYWluc3Qgb25lIG5vaXN5IG9yZyBjb25zdW1pbmcgdGhlXG4gICAqIHByb2Nlc3Mtd2lkZSBidWRnZXQg4oCUIHdpdGhvdXQgaXQsIGFuIGF1dGhlbnRpY2F0ZWQgdXNlciBjYW4gZmFuIG91dFxuICAgKiB0aG91c2FuZHMgb2Ygc3RyZWFtcyAob25lIHBlciBkYXNoYm9hcmQgLyBsb2cgc3RyZWFtKSBhbmQgc3RhcnZlIG90aGVyXG4gICAqIG9yZ3Mgb2YgY29ubmVjdGlvbiBzbG90cy4gVGhlIGNhcCBpcyBlbmZvcmNlZCBvbmx5IG9uIGBhZGRDbGllbnRgIGNhbGxzXG4gICAqIHRoYXQgY2FycnkgYW4gYG9yZ0lkYDsgc2VydmljZS1pbnRlcm5hbCAvIGFub255bW91cyBTU0UgdHJhZmZpYyBza2lwcyBpdC5cbiAgICovXG4gIG1heENsaWVudHNQZXJPcmc/OiBudW1iZXI7XG4gIC8qKlxuICAgKiBIYXJkIGNhcCBvbiB0b3RhbCBsaXZlICh1bmNvbnN1bWVkLCB1bmV4cGlyZWQpIFNTRSB0aWNrZXRzIGFjcm9zcyB0aGVcbiAgICogcHJvY2Vzcy4gRGVmYXVsdHMgdG8gMTAwMCBmcm9tIGBTU0VfTUFYX1RPVEFMX1RJQ0tFVFNgLiBCb3VuZHMgbWVtb3J5XG4gICAqIHVuZGVyIGFidXNlIOKAlCBgY3JlYXRlVGlja2V0YCByZXR1cm5zIGB7IG9rOiBmYWxzZSwgcmVhc29uOiAnY2FwYWNpdHknIH1gXG4gICAqIG9uY2UgcmVhY2hlZC5cbiAgICovXG4gIG1heFRvdGFsVGlja2V0cz86IG51bWJlcjtcbiAgLyoqXG4gICAqIFBlci1vcmcgY2FwIG9uIGxpdmUgU1NFIHRpY2tldHMuIERlZmF1bHRzIHRvIDEwIGZyb21cbiAgICogYFNTRV9NQVhfVElDS0VUU19QRVJfT1JHYC4gUHJldmVudHMgYSBzaW5nbGUgdGVuYW50IGZyb20gc2F0dXJhdGluZyB0aGVcbiAgICogdGlja2V0IHRhYmxlIOKAlCBgY3JlYXRlVGlja2V0YCByZXR1cm5zIGB7IG9rOiBmYWxzZSwgcmVhc29uOiAnb3JnLWxpbWl0JyB9YFxuICAgKiBvbmNlIHJlYWNoZWQuXG4gICAqL1xuICBtYXhUaWNrZXRzUGVyT3JnPzogbnVtYmVyO1xuICAvKiogVGlja2V0IFRUTCBpbiBtcyAoZGVmYXVsdDogYFNTRV9USUNLRVRfVFRMX01TYCBmcm9tIGFwaS1jb3JlKS4gKi9cbiAgdGlja2V0VHRsTXM/OiBudW1iZXI7XG4gIC8qKlxuICAgKiBUaWNrZXQgKyBzdHJlYW0tb3duZXJzaGlwIGJhY2tlbmQuIERlZmF1bHRzIHRvIGFuIGluLW1lbW9yeSBzdG9yZSAoY29ycmVjdFxuICAgKiBzaW5nbGUtcmVwbGljYSBvbmx5KS4gSW5qZWN0IGBjcmVhdGVFbnZSZWRpc1RpY2tldFN0b3JlKClgIChvciBhIGJlc3Bva2VcbiAgICogYFNTRVN0cmVhbVRpY2tldFN0b3JlYCkgc28gdGlja2V0IG1pbnQvcmVkZWVtIEFORCBzdHJlYW0gb3duZXJzaGlwIHdvcmsgYWNyb3NzXG4gICAqIGhvcml6b250YWxseS1zY2FsZWQgcG9kcyBhbmQg4oCUIGNyaXRpY2FsbHkg4oCUIHNvIHRoZSBwbGF0Zm9ybSBzdHJlYW0gcHJvZHVjZXJcbiAgICogKGEgZGlmZmVyZW50IHNlcnZpY2UpIGNhbiBiaW5kIG93bmVyc2hpcCB0aGF0IHRoaXMgc2VydmljZSByZWFkcy5cbiAgICovXG4gIHRpY2tldFN0b3JlPzogU1NFU3RyZWFtVGlja2V0U3RvcmU7XG4gIC8qKlxuICAgKiBUVEwgZm9yIGEgc3RyZWFtLW93bmVyc2hpcCBiaW5kaW5nIChkZWZhdWx0OiBgU1NFX1NUUkVBTV9PV05FUl9UVExfTVNgIGVudiBvclxuICAgKiAxaCkuIExvbmcgZW5vdWdoIHRvIG91dGxpdmUgYSBidWlsZDsgdGhlIHByb2R1Y2VyIHJlLWJpbmRzIGFzIG5lZWRlZC5cbiAgICovXG4gIHN0cmVhbU93bmVyVHRsTXM/OiBudW1iZXI7XG4gIC8qKlxuICAgKiBDcm9zcy1wb2QgZmFuLW91dCBidXMgZm9yIGBzZW5kKClgL2Bicm9hZGNhc3QoKWAuIE9wdGlvbmFsIOKAlCB3aGVuIG9taXR0ZWQsXG4gICAqIGRlbGl2ZXJ5IGlzIExPQ0FMLU9OTFkgKGNvcnJlY3Qgc2luZ2xlLXJlcGxpY2E7IHRvZGF5J3MgYmVoYXZpb3IpLiBJbmplY3RcbiAgICogYGNyZWF0ZUVudlJlZGlzU1NFUmVsYXkoKWAgc28gYSBmcmFtZSBwcm9kdWNlZCBvbiBvbmUgcG9kIHJlYWNoZXMgYW5cbiAgICogRXZlbnRTb3VyY2UgYXR0YWNoZWQgb24gYSBESUZGRVJFTlQgcG9kLiBEZWdyYWRlcyB0byBsb2NhbC1vbmx5IGF1dG9tYXRpY2FsbHlcbiAgICogd2hlbiBSZWRpcyBpcyB1bnNldCAodGhlIGZhY3RvcnkgcmV0dXJucyBudWxsKSBvciBkdXJpbmcgYSBSZWRpcyBvdXRhZ2UuXG4gICAqL1xuICByZWxheT86IFNTRVJlbGF5O1xufVxuXG4vKipcbiAqIEEgYnVpbGQtbG9nIHN0cmVhbSBzdWJqZWN0IGlkOiBlaXRoZXIgYSBkYXNoZWQgVVVJRCAoYXBpLXNlcnZlcidzIGB1dWlkKClgKVxuICogb3IgbmdpbngncyBgJHJlcXVlc3RfaWRgIOKAlCAxNiByYW5kb20gYnl0ZXMgcmVuZGVyZWQgYXMgMzIgaGV4IGNoYXJzIHdpdGggTk9cbiAqIGRhc2hlcy4gQWNjZXB0IGJvdGggYnkgbWFraW5nIHRoZSBncm91cCBzZXBhcmF0b3JzIG9wdGlvbmFsOyBzdGlsbCBzdHJpY3RseVxuICogMzIgaGV4IGNoYXJzIHNvIGl0IGNhbid0IGNhcnJ5IGFuIGluamVjdGlvbiAvIHBhdGgtdHJhdmVyc2FsIHBheWxvYWQgaW50byB0aGVcbiAqIFNTRSBzdWJqZWN0LiBTaGFyZWQgYnkgdGhlIHRpY2tldC1taW50IHJvdXRlIGFuZCB0aGUgc3RyZWFtIG1pZGRsZXdhcmUgc29cbiAqIGJvdGggdmFsaWRhdGUgdGhlIHN1YmplY3QgaWRlbnRpY2FsbHkuXG4gKi9cbmV4cG9ydCBjb25zdCBTU0VfUkVRVUVTVF9JRF9SRSA9IC9eWzAtOWEtZl17OH0tP1swLTlhLWZdezR9LT9bMC05YS1mXXs0fS0/WzAtOWEtZl17NH0tP1swLTlhLWZdezEyfSQvaTtcblxuLyoqIFJlc3VsdCBvZiB7QGxpbmsgU1NFTWFuYWdlci5jcmVhdGVUaWNrZXR9LiAqL1xuZXhwb3J0IHR5cGUgQ3JlYXRlVGlja2V0UmVzdWx0ID1cbiAgfCB7IG9rOiB0cnVlOyB0aWNrZXQ6IHN0cmluZyB9XG4gIHwgeyBvazogZmFsc2U7IHJlYXNvbjogJ29yZy1saW1pdCcgfCAnY2FwYWNpdHknIHwgJ2ZvcmJpZGRlbicgfTtcblxuLyoqXG4gKiBTU0UgTWFuYWdlciBzdGF0aXN0aWNzXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU1NFTWFuYWdlclN0YXRzIHtcbiAgdG90YWxSZXF1ZXN0czogbnVtYmVyO1xuICB0b3RhbENsaWVudHM6IG51bWJlcjtcbiAgb2xkZXN0Q29ubmVjdGlvbk1zOiBudW1iZXIgfCBudWxsO1xufVxuXG4vKipcbiAqIFNTRSBoZWxwZXIgY2xhc3Mgd2l0aCBtZW1vcnkgbGVhayBwcm90ZWN0aW9uXG4gKlxuICogRmVhdHVyZXM6XG4gKiAtIENsaWVudCBsaW1pdHMgcGVyIHJlcXVlc3QgSURcbiAqIC0gQXV0b21hdGljIHRpbWVvdXQgZm9yIGlkbGUgY29ubmVjdGlvbnNcbiAqIC0gUGVyaW9kaWMgY2xlYW51cCBvZiBzdGFsZSBjb25uZWN0aW9uc1xuICogLSBDb25uZWN0aW9uIHN0YXRpc3RpY3NcbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgdHlwZXNjcmlwdFxuICogY29uc3Qgc3NlTWFuYWdlciA9IG5ldyBTU0VNYW5hZ2VyKHsgbWF4Q2xpZW50c1BlclJlcXVlc3Q6IDUgfSk7XG4gKiBhcHAuZ2V0KCcvbG9ncy86cmVxdWVzdElkJywgc3NlTWFuYWdlci5taWRkbGV3YXJlKCkpO1xuICpcbiAqIC8vIFNlbmQgZXZlbnRzXG4gKiBzc2VNYW5hZ2VyLnNlbmQoJ3JlcXVlc3QtMTIzJywgJ0lORk8nLCAnUHJvY2Vzc2luZy4uLicpO1xuICogYGBgXG4gKi9cbmV4cG9ydCBjbGFzcyBTU0VNYW5hZ2VyIHtcbiAgcHJpdmF0ZSBjbGllbnRzID0gbmV3IE1hcDxzdHJpbmcsIFNTRUNsaWVudFtdPigpO1xuICAvKiogUGVyLW9yZyBvcGVuLWNsaWVudCBjb3VudGVycy4gRGVjcmVtZW50ZWQgb24gcmVtb3ZlQ2xpZW50L2NsZWFudXAgc28gdGhlXG4gICAqICBtYXAgbWlycm9ycyBgY2xpZW50c1tdLm9yZ0lkYCBjb3VudHMgYXQgYWxsIHRpbWVzLiBPcmdzIHJlYWNoIHplcm8gYXJlXG4gICAqICBkZWxldGVkIHRvIGtlZXAgdGhlIG1hcCBib3VuZGVkLiAqL1xuICBwcml2YXRlIG9yZ0NsaWVudENvdW50cyA9IG5ldyBNYXA8c3RyaW5nLCBudW1iZXI+KCk7XG4gIC8qKiBUaWNrZXQgKyBzdHJlYW0tb3duZXJzaGlwIGJhY2tlbmQgKGluLW1lbW9yeSBkZWZhdWx0OyBSZWRpcyBmb3IgbXVsdGktcG9kKS5cbiAgICogIEJvdW5kZWQgYnkgYG1heFRvdGFsVGlja2V0c2AgLyBgbWF4VGlja2V0c1Blck9yZ2AsIGVuZm9yY2VkIGluIGNyZWF0ZVRpY2tldDtcbiAgICogIGV4cGlyeSBpcyB2YWxpZGF0ZWQgYXQgY29uc3VtZSB0aW1lIGFuZCBzd2VwdCBvbiB0aGUgY2xlYW51cCBpbnRlcnZhbC4gKi9cbiAgcHJpdmF0ZSByZWFkb25seSB0aWNrZXRTdG9yZTogU1NFU3RyZWFtVGlja2V0U3RvcmU7XG4gIHByaXZhdGUgcmVhZG9ubHkgbWF4Q2xpZW50c1BlclJlcXVlc3Q6IG51bWJlcjtcbiAgcHJpdmF0ZSByZWFkb25seSBtYXhUb3RhbENsaWVudHM6IG51bWJlcjtcbiAgcHJpdmF0ZSByZWFkb25seSBtYXhDbGllbnRzUGVyT3JnOiBudW1iZXI7XG4gIHByaXZhdGUgcmVhZG9ubHkgbWF4VG90YWxUaWNrZXRzOiBudW1iZXI7XG4gIHByaXZhdGUgcmVhZG9ubHkgbWF4VGlja2V0c1Blck9yZzogbnVtYmVyO1xuICBwcml2YXRlIHJlYWRvbmx5IHRpY2tldFR0bE1zOiBudW1iZXI7XG4gIHByaXZhdGUgcmVhZG9ubHkgc3RyZWFtT3duZXJUdGxNczogbnVtYmVyO1xuICBwcml2YXRlIHJlYWRvbmx5IGNsaWVudFRpbWVvdXRNczogbnVtYmVyO1xuICBwcml2YXRlIGNsZWFudXBJbnRlcnZhbDogTm9kZUpTLlRpbWVvdXQgfCBudWxsID0gbnVsbDtcbiAgLyoqIENyb3NzLXBvZCBmYW4tb3V0IGJ1cyAodW5kZWZpbmVkIOKHkiBsb2NhbC1vbmx5IGRlbGl2ZXJ5KS4gKi9cbiAgcHJpdmF0ZSByZWFkb25seSByZWxheT86IFNTRVJlbGF5O1xuICAvKiogVGhpcyBtYW5hZ2VyIGluc3RhbmNlJ3MgaWQg4oCUIHRhZ3MgcmVsYXllZCBmcmFtZXMgc28gd2UgaWdub3JlIG91ciBvd24gZWNoby4gKi9cbiAgcHJpdmF0ZSByZWFkb25seSBub2RlSWQgPSByYW5kb21CeXRlcyg4KS50b1N0cmluZygnaGV4Jyk7XG5cbiAgY29uc3RydWN0b3Iob3B0aW9uczogU1NFTWFuYWdlck9wdGlvbnMgPSB7fSkge1xuICAgIHRoaXMubWF4Q2xpZW50c1BlclJlcXVlc3QgPSBvcHRpb25zLm1heENsaWVudHNQZXJSZXF1ZXN0ID8/IHBhcnNlSW50KHByb2Nlc3MuZW52LlNTRV9NQVhfQ0xJRU5UU19QRVJfUkVRVUVTVCB8fCAnMTAnLCAxMCk7XG4gICAgdGhpcy5tYXhUb3RhbENsaWVudHMgPSBvcHRpb25zLm1heFRvdGFsQ2xpZW50cyA/PyBwYXJzZUludChwcm9jZXNzLmVudi5TU0VfTUFYX1RPVEFMX0NMSUVOVFMgfHwgJzEwMDAnLCAxMCk7XG4gICAgdGhpcy5tYXhDbGllbnRzUGVyT3JnID0gb3B0aW9ucy5tYXhDbGllbnRzUGVyT3JnID8/IHBhcnNlSW50KHByb2Nlc3MuZW52LlNTRV9NQVhfQ0xJRU5UU19QRVJfT1JHIHx8ICc1MCcsIDEwKTtcbiAgICB0aGlzLm1heFRvdGFsVGlja2V0cyA9IG9wdGlvbnMubWF4VG90YWxUaWNrZXRzID8/IHBhcnNlSW50KHByb2Nlc3MuZW52LlNTRV9NQVhfVE9UQUxfVElDS0VUUyB8fCAnMTAwMCcsIDEwKTtcbiAgICB0aGlzLm1heFRpY2tldHNQZXJPcmcgPSBvcHRpb25zLm1heFRpY2tldHNQZXJPcmcgPz8gcGFyc2VJbnQocHJvY2Vzcy5lbnYuU1NFX01BWF9USUNLRVRTX1BFUl9PUkcgfHwgJzEwJywgMTApO1xuICAgIHRoaXMudGlja2V0VHRsTXMgPSBvcHRpb25zLnRpY2tldFR0bE1zID8/IFNTRV9USUNLRVRfVFRMX01TO1xuICAgIHRoaXMuc3RyZWFtT3duZXJUdGxNcyA9IG9wdGlvbnMuc3RyZWFtT3duZXJUdGxNcyA/PyBwYXJzZUludChwcm9jZXNzLmVudi5TU0VfU1RSRUFNX09XTkVSX1RUTF9NUyB8fCAnMzYwMDAwMCcsIDEwKTsgLy8gMSBob3VyXG4gICAgdGhpcy50aWNrZXRTdG9yZSA9IG9wdGlvbnMudGlja2V0U3RvcmUgPz8gY3JlYXRlTWVtb3J5VGlja2V0U3RvcmUoKTtcbiAgICB0aGlzLmNsaWVudFRpbWVvdXRNcyA9IG9wdGlvbnMuY2xpZW50VGltZW91dE1zID8/IHBhcnNlSW50KHByb2Nlc3MuZW52LlNTRV9DTElFTlRfVElNRU9VVF9NUyB8fCAnMTgwMDAwMCcsIDEwKTsgLy8gMzAgbWludXRlc1xuXG4gICAgY29uc3QgY2xlYW51cEludGVydmFsTXMgPSBvcHRpb25zLmNsZWFudXBJbnRlcnZhbE1zID8/IHBhcnNlSW50KHByb2Nlc3MuZW52LlNTRV9DTEVBTlVQX0lOVEVSVkFMX01TIHx8ICczMDAwMDAnLCAxMCk7IC8vIDUgbWludXRlc1xuICAgIHRoaXMuc3RhcnRDbGVhbnVwSW50ZXJ2YWwoY2xlYW51cEludGVydmFsTXMpO1xuXG4gICAgLy8gV2lyZSB0aGUgY3Jvc3MtcG9kIHJlbGF5OiBzdWJzY3JpYmUgb25jZSBvbiBzdGFydHVwIHNvIGZyYW1lcyBQVUJMSVNIRUQgYnlcbiAgICAvLyBhbnkgb3RoZXIgcG9kIGFyZSByZS1lbWl0dGVkIHRvIFRISVMgcG9kJ3MgbG9jYWwgY2xpZW50cy4gRnJhbWVzIHdlXG4gICAgLy8gcHVibGlzaGVkIG91cnNlbHZlcyBhcmUgaWdub3JlZCAob3JpZ2luID09PSBub2RlSWQpIOKAlCB3ZSBhbHJlYWR5IHdyb3RlIHRoZW1cbiAgICAvLyBsb2NhbGx5LiBGYWlsLXNhZmU6IG5vIHJlbGF5IOKHkiBsb2NhbC1vbmx5IGRlbGl2ZXJ5IChzaW5nbGUtcmVwbGljYSBkZWZhdWx0KS5cbiAgICB0aGlzLnJlbGF5ID0gb3B0aW9ucy5yZWxheTtcbiAgICB0aGlzLnJlbGF5Py5zdWJzY3JpYmUoKG1zZykgPT4gdGhpcy5vblJlbGF5TWVzc2FnZShtc2cpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBIYW5kbGUgYSBmcmFtZSByZWNlaXZlZCBmcm9tIGFub3RoZXIgcG9kIHZpYSB0aGUgcmVsYXkuIFdlIGFscmVhZHkgZGVsaXZlcmVkXG4gICAqIG91ciBPV04gZnJhbWVzIHRvIGxvY2FsIGNsaWVudHMgYmVmb3JlIHB1Ymxpc2hpbmcsIHNvIGlnbm9yZSBvdXIgZWNoby4gQVxuICAgKiBgc2VuZGAgcmUtZW1pdHMgdG8gdGhlIHN1YmplY3QncyBsb2NhbCBjbGllbnRzOyBhIGBicm9hZGNhc3RgIHRvIGFsbCBvZiB0aGVtLlxuICAgKiBQdXJlbHkgbG9jYWwg4oCUIG5ldmVyIHJlLXB1Ymxpc2hlcywgc28gdGhlcmUgaXMgbm8gZmFuLW91dCBsb29wLlxuICAgKi9cbiAgcHJpdmF0ZSBvblJlbGF5TWVzc2FnZShtc2c6IFNTRVJlbGF5TWVzc2FnZSk6IHZvaWQge1xuICAgIGlmICghbXNnIHx8IG1zZy5vcmlnaW4gPT09IHRoaXMubm9kZUlkKSByZXR1cm47XG4gICAgaWYgKG1zZy5raW5kID09PSAnYnJvYWRjYXN0Jykge1xuICAgICAgdGhpcy5icm9hZGNhc3RMb2NhbChtc2cucGF5bG9hZCk7XG4gICAgfSBlbHNlIGlmIChtc2cucmVxdWVzdElkKSB7XG4gICAgICB0aGlzLnNlbmRMb2NhbChtc2cucmVxdWVzdElkLCBtc2cucGF5bG9hZCk7XG4gICAgfVxuICB9XG5cbiAgLyoqIFRvdGFsIG9wZW4gY29ubmVjdGlvbnMgYWNyb3NzIGFsbCByZXF1ZXN0cy4gKi9cbiAgcHJpdmF0ZSB0b3RhbENsaWVudHMoKTogbnVtYmVyIHtcbiAgICBsZXQgbiA9IDA7XG4gICAgZm9yIChjb25zdCBjbGllbnRzIG9mIHRoaXMuY2xpZW50cy52YWx1ZXMoKSkgbiArPSBjbGllbnRzLmxlbmd0aDtcbiAgICByZXR1cm4gbjtcbiAgfVxuXG4gIC8qKiBDdXJyZW50IG9wZW4tc3RyZWFtIGNvdW50IGZvciBhbiBvcmcgKDAgaWYgdW5zZWVuKS4gKi9cbiAgZ2V0T3JnQ2xpZW50Q291bnQob3JnSWQ6IHN0cmluZyk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMub3JnQ2xpZW50Q291bnRzLmdldChvcmdJZCkgPz8gMDtcbiAgfVxuXG4gIC8qKlxuICAgKiBDYW5vbmljYWwgZm9ybSBvZiBhIHJlcXVlc3RJZCBmb3IgZXF1YWxpdHkgY2hlY2tzOiBkYXNoZXMgc3RyaXBwZWQgYW5kXG4gICAqIGxvd2VyY2FzZWQsIHNvIHRoZSBkYXNoZWQgKGFwaS1zZXJ2ZXIgYHV1aWQoKWApIGFuZCB1bmRhc2hlZCAobmdpbnhcbiAgICogYCRyZXF1ZXN0X2lkYCkgcmVuZGVyaW5ncyBvZiB0aGUgc2FtZSBpZCBjb21wYXJlIGVxdWFsLiBDYWxsZXJzIGFyZVxuICAgKiBleHBlY3RlZCB0byBoYXZlIGFscmVhZHkgZm9ybWF0LXZhbGlkYXRlZCBhZ2FpbnN0IHtAbGluayBTU0VfUkVRVUVTVF9JRF9SRX0uXG4gICAqL1xuICBwcml2YXRlIHN0YXRpYyBub3JtYWxpemVSZXF1ZXN0SWQocmVxdWVzdElkOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIHJldHVybiByZXF1ZXN0SWQucmVwbGFjZSgvLS9nLCAnJykudG9Mb3dlckNhc2UoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDYW5vbmljYWwgZm9ybSBvZiBhbiBvcmdJZCBmb3Igb3duZXJzaGlwIGVxdWFsaXR5IGNoZWNrczogdHJpbW1lZCBhbmRcbiAgICogbG93ZXJjYXNlZC4gVGhlIHN0cmVhbSBQUk9EVUNFUiAoYmluZFN0cmVhbU93bmVyKSBhbmQgdGhlIHRpY2tldC1taW50aW5nXG4gICAqIENPTlNVTUVSIChjcmVhdGVUaWNrZXQpIHJ1biBpbiBkaWZmZXJlbnQgc2VydmljZXMsIHNvIGEgY2FzaW5nIC8gd2hpdGVzcGFjZVxuICAgKiBkcmlmdCBiZXR3ZWVuIGhvdyBlYWNoIHJlbmRlcnMgdGhlIHNhbWUgb3JnIHdvdWxkIG90aGVyd2lzZSBtYWtlIHRoZSBvd25lclxuICAgKiBjb21wYXJpc29uIGluIHtAbGluayBjcmVhdGVUaWNrZXR9IGZhbHNlLWBmb3JiaWRkZW5gIHRoZSByZWFsIG93bmVyLlxuICAgKiBOb3JtYWxpemluZyBib3RoIHNpZGVzIOKAlCBtaXJyb3Jpbmcge0BsaW5rIG5vcm1hbGl6ZVJlcXVlc3RJZH0g4oCUIGNsb3NlcyB0aGF0LlxuICAgKi9cbiAgcHJpdmF0ZSBzdGF0aWMgbm9ybWFsaXplT3JnSWQob3JnSWQ6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgcmV0dXJuIG9yZ0lkLnRyaW0oKS50b0xvd2VyQ2FzZSgpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlY29yZCB0aGUgb3JnIHRoYXQgT1dOUyBhIHN0cmVhbSBzdWJqZWN0LiBUaGUgc3RyZWFtIFBST0RVQ0VSIGNhbGxzIHRoaXNcbiAgICogd2hlbiBpdCBjcmVhdGVzIGEgYnVpbGQtbG9nIHN0cmVhbSBzbyB0aGF0IHRpY2tldCBtaW50aW5nIGNhbiBhc3NlcnQgdGhlXG4gICAqIGNhbGxlcidzIG9yZyBvd25zIHRoZSBzdWJqZWN0IChzZWUge0BsaW5rIGNyZWF0ZVRpY2tldH0pLiBCYWNrZWQgYnkgdGhlXG4gICAqIGluamVjdGVkIHRpY2tldCBzdG9yZSwgc28gd2hlbiBhIFJlZGlzIHN0b3JlIGlzIHdpcmVkIHRoZSBwbGF0Zm9ybSBwcm9kdWNlclxuICAgKiAoYSBkaWZmZXJlbnQgc2VydmljZSBzaGFyaW5nIHRoZSBzYW1lIFJlZGlzKSBjYW4gYmluZCBvd25lcnNoaXAgdGhhdCB0aGlzXG4gICAqIHNlcnZpY2UgcmVhZHMg4oCUIGNsb3NpbmcgdGhlIGNyb3NzLXRlbmFudCBhdHRhY2ggZ2FwIHdoZXJlIGFueSBvcmcgY291bGQgbWludFxuICAgKiBhIHRpY2tldCBmb3IgYSBndWVzc2VkIHJlcXVlc3RJZC5cbiAgICpcbiAgICogQHBhcmFtIHJlcXVlc3RJZCAtIFRoZSBzdHJlYW0gc3ViamVjdCAoZm9ybWF0LXZhbGlkYXRlZCBieSB0aGUgY2FsbGVyKS5cbiAgICogQHBhcmFtIG9yZ0lkIC0gVGhlIG93bmluZyBvcmcgKG5vcm1hbGl6ZWQgaW50ZXJuYWxseSB2aWEgbm9ybWFsaXplT3JnSWQpLlxuICAgKi9cbiAgYXN5bmMgYmluZFN0cmVhbU93bmVyKHJlcXVlc3RJZDogc3RyaW5nLCBvcmdJZDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgYXdhaXQgdGhpcy50aWNrZXRTdG9yZS5iaW5kU3RyZWFtT3duZXIoXG4gICAgICBTU0VNYW5hZ2VyLm5vcm1hbGl6ZVJlcXVlc3RJZChyZXF1ZXN0SWQpLFxuICAgICAgU1NFTWFuYWdlci5ub3JtYWxpemVPcmdJZChvcmdJZCksXG4gICAgICB0aGlzLnN0cmVhbU93bmVyVHRsTXMsXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBNaW50IGEgc2hvcnQtbGl2ZWQsIHNpbmdsZS11c2UgU1NFIHRpY2tldCBib3VuZCB0byBgb3JnSWRgIEFORCBhIHNwZWNpZmljXG4gICAqIHN0cmVhbSBzdWJqZWN0IChgcmVxdWVzdElkYCkuIENsaWVudHMgUE9TVCB0byBvYnRhaW4gb25lIChKV1QtYXV0aGVudGljYXRlZClcbiAgICogZm9yIHRoZSBleGFjdCBzdHJlYW0gdGhleSBpbnRlbmQgdG8gb3BlbiwgdGhlbiBvcGVuIHRoZSBFdmVudFNvdXJjZSB3aXRoXG4gICAqIGA/dGlja2V0PTx0PmAgc28gdGhlIEpXVCBuZXZlciBsYW5kcyBpbiBhIHF1ZXJ5IHN0cmluZyAvIGFjY2VzcyBsb2cuIFRoZVxuICAgKiB0aWNrZXQgY2FuIHRoZW4gb25seSBiZSBjb25zdW1lZCB0byBvcGVuIHRoYXQgb25lIHN1YmplY3QncyBzdHJlYW0g4oCUIHNlZVxuICAgKiB7QGxpbmsgY29uc3VtZVRpY2tldH0g4oCUIHdoaWNoIGlzIHdoYXQgZW5mb3JjZXMgcGVyLXN1YmplY3QgYXV0aG9yaXphdGlvbi5cbiAgICpcbiAgICogT1JHLU9XTkVSU0hJUDogaWYgYSBzdHJlYW0gb3duZXIgaGFzIGJlZW4gYm91bmQgZm9yIHRoaXMgc3ViamVjdCAodmlhXG4gICAqIHtAbGluayBiaW5kU3RyZWFtT3duZXJ9KSBhbmQgaXQgaXMgYSBESUZGRVJFTlQgb3JnLCBtaW50aW5nIGlzIHJlZnVzZWRcbiAgICogKGByZWFzb246ICdmb3JiaWRkZW4nYCkg4oCUIGFuIG9yZyBjYW5ub3QgbWludCBhIHRpY2tldCBmb3IgYW5vdGhlciBvcmcnc1xuICAgKiBzdHJlYW0gZXZlbiBpZiBpdCBndWVzc2VzIHRoZSByZXF1ZXN0SWQuIFdoZW4gbm8gb3duZXIgaXMgYm91bmQgKHByb2R1Y2VyXG4gICAqIHdpcmluZyBub3QgeWV0IHByZXNlbnQpLCBtaW50aW5nIGZhbGxzIGJhY2sgdG8gYmluZGluZyB0aGUgdGlja2V0IHRvIHRoZVxuICAgKiBjYWxsZXIncyBvd24gb3JnLCBwcmVzZXJ2aW5nIGN1cnJlbnQgYmVoYXZpb3IuXG4gICAqXG4gICAqIEJvdW5kZWQgYnkgYG1heFRvdGFsVGlja2V0c2AgKHByb2Nlc3Mtd2lkZSkgYW5kIGBtYXhUaWNrZXRzUGVyT3JnYFxuICAgKiAocGVyLXRlbmFudCkuIE1pcnJvcnMgdGhlIG1lc3NhZ2Utc2VydmljZSBub3RpZmljYXRpb25zIHRpY2tldCBzdG9yZS5cbiAgICpcbiAgICogQHBhcmFtIG9yZ0lkIC0gT3duaW5nIG9yZyAobm9ybWFsaXplZCBpbnRlcm5hbGx5IHZpYSBub3JtYWxpemVPcmdJZCkuXG4gICAqIEBwYXJhbSByZXF1ZXN0SWQgLSBUaGUgYnVpbGQtbG9nIHN0cmVhbSBzdWJqZWN0IHRoaXMgdGlja2V0IGF1dGhvcml6ZXMuXG4gICAqICAgVGhlIGNhbGxlciBtdXN0IGhhdmUgZm9ybWF0LXZhbGlkYXRlZCBpdCAoc2VlIHtAbGluayBTU0VfUkVRVUVTVF9JRF9SRX0pLlxuICAgKiBAcmV0dXJucyBgeyBvazogdHJ1ZSwgdGlja2V0IH1gIG9uIHN1Y2Nlc3MsIG9yIGB7IG9rOiBmYWxzZSwgcmVhc29uIH1gXG4gICAqICAgd2hlcmUgcmVhc29uIGlzIGAnb3JnLWxpbWl0J2AsIGAnY2FwYWNpdHknYCwgb3IgYCdmb3JiaWRkZW4nYC5cbiAgICovXG4gIGFzeW5jIGNyZWF0ZVRpY2tldChvcmdJZDogc3RyaW5nLCByZXF1ZXN0SWQ6IHN0cmluZyk6IFByb21pc2U8Q3JlYXRlVGlja2V0UmVzdWx0PiB7XG4gICAgLy8gT3duZXJzaGlwIGdhdGUgZmlyc3Qg4oCUIGEgY3Jvc3MtdGVuYW50IG1pbnQgYXR0ZW1wdCBzaG91bGQgbmV2ZXIgZXZlblxuICAgIC8vIGNvbnN1bWUgY2FwIGJ1ZGdldC4gT25seSBlbmZvcmNlZCB3aGVuIGFuIG93bmVyIGlzIGFjdHVhbGx5IGJvdW5kLiBCb3RoXG4gICAgLy8gc2lkZXMgYXJlIG9yZy1ub3JtYWxpemVkIHNvIGEgcHJvZHVjZXIvY29uc3VtZXIgY2FzaW5nIGRyaWZ0IGNhbid0XG4gICAgLy8gZmFsc2UtYGZvcmJpZGRlbmAgdGhlIHJlYWwgb3duZXIgKG1pcnJvcnMgcmVxdWVzdElkIG5vcm1hbGl6YXRpb24pLlxuICAgIGNvbnN0IG5vcm1hbGl6ZWQgPSBTU0VNYW5hZ2VyLm5vcm1hbGl6ZVJlcXVlc3RJZChyZXF1ZXN0SWQpO1xuICAgIGNvbnN0IG5vcm1hbGl6ZWRPcmcgPSBTU0VNYW5hZ2VyLm5vcm1hbGl6ZU9yZ0lkKG9yZ0lkKTtcbiAgICBjb25zdCBvd25lciA9IGF3YWl0IHRoaXMudGlja2V0U3RvcmUuZ2V0U3RyZWFtT3duZXIobm9ybWFsaXplZCk7XG4gICAgaWYgKG93bmVyICYmIG93bmVyICE9PSBub3JtYWxpemVkT3JnKSB7XG4gICAgICBsb2dnZXIud2FybihgU1NFIHRpY2tldCByZWZ1c2VkOiBvcmcgJHtub3JtYWxpemVkT3JnfSBkb2VzIG5vdCBvd24gc3RyZWFtIHN1YmplY3RgKTtcbiAgICAgIHJldHVybiB7IG9rOiBmYWxzZSwgcmVhc29uOiAnZm9yYmlkZGVuJyB9O1xuICAgIH1cblxuICAgIC8vIFRvdGFsIGNhcCBuZXh0IOKAlCBwcm90ZWN0cyBwcm9jZXNzIG1lbW9yeSBldmVuIHdoZW4gYSBzaW5nbGUgb3JnIGlzXG4gICAgLy8gdGhlIG9mZmVuZGVyLiBUaGVuIHRoZSBwZXItb3JnIGNhcCBmb3IgZmFpci1zaGFyZS5cbiAgICBpZiAoKGF3YWl0IHRoaXMudGlja2V0U3RvcmUudG90YWwoKSkgPj0gdGhpcy5tYXhUb3RhbFRpY2tldHMpIHtcbiAgICAgIGxvZ2dlci53YXJuKGBTU0UgdGlja2V0IGNhcCByZWFjaGVkIChtYXg6ICR7dGhpcy5tYXhUb3RhbFRpY2tldHN9KTsgcmVqZWN0aW5nIHRpY2tldCByZXF1ZXN0YCk7XG4gICAgICByZXR1cm4geyBvazogZmFsc2UsIHJlYXNvbjogJ2NhcGFjaXR5JyB9O1xuICAgIH1cbiAgICBpZiAoKGF3YWl0IHRoaXMudGlja2V0U3RvcmUuY291bnRGb3JPcmcobm9ybWFsaXplZE9yZykpID49IHRoaXMubWF4VGlja2V0c1Blck9yZykge1xuICAgICAgbG9nZ2VyLndhcm4oYFBlci1vcmcgU1NFIHRpY2tldCBjYXAgcmVhY2hlZCBmb3IgJHtub3JtYWxpemVkT3JnfSAobWF4OiAke3RoaXMubWF4VGlja2V0c1Blck9yZ30pYCk7XG4gICAgICByZXR1cm4geyBvazogZmFsc2UsIHJlYXNvbjogJ29yZy1saW1pdCcgfTtcbiAgICB9XG5cbiAgICBjb25zdCB0aWNrZXQgPSByYW5kb21CeXRlcygyNCkudG9TdHJpbmcoJ2Jhc2U2NHVybCcpO1xuICAgIGF3YWl0IHRoaXMudGlja2V0U3RvcmUucHV0KHRpY2tldCwgeyBvcmdJZDogbm9ybWFsaXplZE9yZywgcmVxdWVzdElkOiBub3JtYWxpemVkIH0sIHRoaXMudGlja2V0VHRsTXMpO1xuICAgIHJldHVybiB7IG9rOiB0cnVlLCB0aWNrZXQgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBWYWxpZGF0ZSBhbmQgQ09OU1VNRSBhIHRpY2tldCBmb3IgYSBzcGVjaWZpYyBzdHJlYW0gc3ViamVjdC4gU2luZ2xlLXVzZTpcbiAgICogdGhlIHRpY2tldCBpcyBkZWxldGVkIHdoZXRoZXIgb3Igbm90IGl0IHR1cm5zIG91dCB0byBiZSB2YWxpZCwgc28gYSByZXBsYXlcbiAgICogb2YgdGhlIHNhbWUgdmFsdWUgYWx3YXlzIGZhaWxzLiBSZXR1cm5zIHRoZSBib3VuZCBvcmcgb24gc3VjY2Vzcywgb3IgbnVsbFxuICAgKiB3aGVuIHRoZSB0aWNrZXQgaXMgdW5rbm93biAvIGFscmVhZHktdXNlZCAvIGV4cGlyZWQgLyBPUiB3YXMgbWludGVkIGZvciBhXG4gICAqIERJRkZFUkVOVCBgcmVxdWVzdElkYCB0aGFuIHRoZSBvbmUgYmVpbmcgb3BlbmVkLlxuICAgKlxuICAgKiBUaGUgc3ViamVjdCBjaGVjayBpcyB0aGUgYXV0aG9yaXphdGlvbiBmaXg6IHdpdGhvdXQgaXQsIGEgdGlja2V0IG1pbnRlZCBmb3JcbiAgICogb25lIHN0cmVhbSBjb3VsZCBiZSBwcmVzZW50ZWQgdG8gb3BlbiBBTlkgc3RyZWFtIHRoZSBob2xkZXIncyBvcmcgY291bGRcbiAgICogbmFtZSwgbGV0dGluZyBhbiBhdXRoZW50aWNhdGVkIG9yZyBhdHRhY2ggdG8gYW5vdGhlciBvcmcncyBsb2cgc3RyZWFtIGJ5XG4gICAqIGd1ZXNzaW5nIGl0cyByZXF1ZXN0SWQuIFRoZSBnZW5lcmljIDQwMSB0aGUgY2FsbGVyIHJldHVybnMgZG9lcyBub3RcbiAgICogZGlzdGluZ3Vpc2ggXCJ1bmtub3duIHRpY2tldFwiIGZyb20gXCJ3cm9uZyBzdWJqZWN0XCIsIHNvIGl0IGxlYWtzIG5vdGhpbmdcbiAgICogYWJvdXQgd2hpY2ggcmVxdWVzdElkcyBleGlzdC5cbiAgICpcbiAgICogQHBhcmFtIHRpY2tldElkIC0gVGhlIG9wYXF1ZSB0aWNrZXQgdmFsdWUgZnJvbSBgP3RpY2tldD1gLlxuICAgKiBAcGFyYW0gcmVxdWVzdElkIC0gVGhlIHN0cmVhbSBzdWJqZWN0IGZyb20gdGhlIFVSTCBwYXRoIChgOnJlcXVlc3RJZGApLFxuICAgKiAgIGFscmVhZHkgZm9ybWF0LXZhbGlkYXRlZCBieSB0aGUgY2FsbGVyLlxuICAgKi9cbiAgYXN5bmMgY29uc3VtZVRpY2tldCh0aWNrZXRJZDogc3RyaW5nLCByZXF1ZXN0SWQ6IHN0cmluZyk6IFByb21pc2U8eyBvcmdJZDogc3RyaW5nIH0gfCBudWxsPiB7XG4gICAgY29uc3QgdGlja2V0ID0gYXdhaXQgdGhpcy50aWNrZXRTdG9yZS5jb25zdW1lKHRpY2tldElkKTsgLy8gc2luZ2xlLXVzZVxuICAgIGlmICghdGlja2V0KSByZXR1cm4gbnVsbDtcbiAgICAvLyBTdWJqZWN0IGJpbmRpbmcg4oCUIHJlamVjdCBhIHRpY2tldCBwcmVzZW50ZWQgZm9yIGEgc3ViamVjdCBpdCB3YXMgbm90XG4gICAgLy8gbWludGVkIGZvci4gQm90aCBzaWRlcyBhcmUgbm9ybWFsaXplZCBzbyBkYXNoZWQvdW5kYXNoZWQgZm9ybXMgbWF0Y2guXG4gICAgaWYgKHRpY2tldC5yZXF1ZXN0SWQgIT09IFNTRU1hbmFnZXIubm9ybWFsaXplUmVxdWVzdElkKHJlcXVlc3RJZCkpIHJldHVybiBudWxsO1xuICAgIHJldHVybiB7IG9yZ0lkOiB0aWNrZXQub3JnSWQgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGRzIGEgY2xpZW50IHRvIHRoZSBTU0UgbWFuYWdlclxuICAgKlxuICAgKiBAcGFyYW0gcmVxdWVzdElkIC0gVW5pcXVlIHJlcXVlc3QgSURcbiAgICogQHBhcmFtIHJlcyAtIEV4cHJlc3MgUmVzcG9uc2Ugb2JqZWN0XG4gICAqIEBwYXJhbSBvcmdJZCAtIEF1dGhlbnRpY2F0ZWQgb3JnIGlkIChvcHRpb25hbCkuIFdoZW4gc2V0LCBlbmZvcmNlcyB0aGVcbiAgICogICBwZXItb3JnIGNhcCBhbmQgdGhlIGNvdW50ZXIgaXMgZGVjcmVtZW50ZWQgb24gZGlzY29ubmVjdC9jbGVhbnVwLlxuICAgKiBAcmV0dXJucyB0cnVlIGlmIGNsaWVudCB3YXMgYWRkZWQsIGZhbHNlIGlmIHJlamVjdGVkIChsaW1pdCByZWFjaGVkKVxuICAgKi9cbiAgYWRkQ2xpZW50KHJlcXVlc3RJZDogc3RyaW5nLCByZXM6IFJlc3BvbnNlLCBvcmdJZD86IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIGNvbnN0IGV4aXN0aW5nID0gdGhpcy5jbGllbnRzLmdldChyZXF1ZXN0SWQpIHx8IFtdO1xuXG4gICAgLy8gQ2hlY2sgY2xpZW50IGxpbWl0XG4gICAgaWYgKGV4aXN0aW5nLmxlbmd0aCA+PSB0aGlzLm1heENsaWVudHNQZXJSZXF1ZXN0KSB7XG4gICAgICBsb2dnZXIud2FybihgQ2xpZW50IGxpbWl0IHJlYWNoZWQgZm9yIHJlcXVlc3QgJHtyZXF1ZXN0SWR9IChtYXg6ICR7dGhpcy5tYXhDbGllbnRzUGVyUmVxdWVzdH0pYCk7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgLy8gUHJvY2Vzcy13aWRlIGNhcDogcHJvdGVjdHMgZmQgdGFibGUgKyBtZW1vcnkgZnJvbSBydW5hd2F5IGRhc2hib2FyZHMuXG4gICAgaWYgKHRoaXMudG90YWxDbGllbnRzKCkgPj0gdGhpcy5tYXhUb3RhbENsaWVudHMpIHtcbiAgICAgIGxvZ2dlci53YXJuKGBUb3RhbCBTU0UgY2xpZW50IGNhcCByZWFjaGVkIChtYXg6ICR7dGhpcy5tYXhUb3RhbENsaWVudHN9KTsgcmVqZWN0aW5nIG5ldyBjb25uZWN0aW9uYCk7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgLy8gUGVyLW9yZyBjYXA6IHByZXZlbnRzIG9uZSBub2lzeSBvcmcgZnJvbSBtb25vcG9saXppbmcgcHJvY2Vzcy13aWRlXG4gICAgLy8gc2xvdHMuIEVuZm9yY2VkIG9ubHkgd2hlbiBvcmdJZCBpcyBrbm93biDigJQgc2VydmljZS1pbnRlcm5hbCAvIGFub255bW91c1xuICAgIC8vIHN0cmVhbXMgdGhhdCBuZXZlciBpZGVudGlmeSB3aXRoIGFuIG9yZ0lkIHN0YXkgc3ViamVjdCB0byB0aGUgZ2xvYmFsXG4gICAgLy8gY2VpbGluZ3MgYWJvdmUuIFJlc2VydmUgYXRvbWljYWxseSBiZWZvcmUgaW5zZXJ0IHNvIHR3byBjb25jdXJyZW50XG4gICAgLy8gcmVxdWVzdHMgYXQgdGhlIGxpbWl0IGNhbid0IGJvdGggc3VjY2VlZC5cbiAgICBpZiAob3JnSWQpIHtcbiAgICAgIGNvbnN0IG9yZ0N1cnJlbnQgPSB0aGlzLm9yZ0NsaWVudENvdW50cy5nZXQob3JnSWQpID8/IDA7XG4gICAgICBpZiAob3JnQ3VycmVudCA+PSB0aGlzLm1heENsaWVudHNQZXJPcmcpIHtcbiAgICAgICAgbG9nZ2VyLndhcm4oYFBlci1vcmcgU1NFIGNsaWVudCBjYXAgcmVhY2hlZCBmb3IgJHtvcmdJZH0gKG1heDogJHt0aGlzLm1heENsaWVudHNQZXJPcmd9KTsgcmVqZWN0aW5nIG5ldyBjb25uZWN0aW9uYCk7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICAgIHRoaXMub3JnQ2xpZW50Q291bnRzLnNldChvcmdJZCwgb3JnQ3VycmVudCArIDEpO1xuICAgIH1cblxuICAgIC8vIENyZWF0ZSB0aW1lb3V0IGZvciB0aGlzIGNsaWVudFxuICAgIGNvbnN0IGNsaWVudElkID0gdXVpZCgpO1xuICAgIGNvbnN0IHRpbWVvdXQgPSBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIGxvZ2dlci5kZWJ1ZyhgQ2xpZW50ICR7Y2xpZW50SWR9IHRpbWVkIG91dCBmb3IgcmVxdWVzdCAke3JlcXVlc3RJZH1gKTtcbiAgICAgIHRoaXMucmVtb3ZlQ2xpZW50KHJlcXVlc3RJZCwgY2xpZW50SWQpO1xuICAgICAgdHJ5IHtcbiAgICAgICAgcmVzLmVuZCgpO1xuICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgIGxvZ2dlci5kZWJ1ZygnUmVzcG9uc2UgYWxyZWFkeSBjbG9zZWQgb24gdGltZW91dCcsIHsgcmVxdWVzdElkLCBjbGllbnRJZCwgZXJyb3I6IGVyciBpbnN0YW5jZW9mIEVycm9yID8gZXJyLm1lc3NhZ2UgOiBTdHJpbmcoZXJyKSB9KTtcbiAgICAgIH1cbiAgICB9LCB0aGlzLmNsaWVudFRpbWVvdXRNcyk7XG5cbiAgICBjb25zdCBjbGllbnQ6IFNTRUNsaWVudCA9IHtcbiAgICAgIGlkOiBjbGllbnRJZCxcbiAgICAgIHJlcyxcbiAgICAgIGNvbm5lY3RlZEF0OiBEYXRlLm5vdygpLFxuICAgICAgdGltZW91dCxcbiAgICAgIGJhY2twcmVzc3VyZUNvdW50OiAwLFxuICAgICAgb3JnSWQsXG4gICAgfTtcblxuICAgIC8vIEhhbmRsZSBkaXNjb25uZWN0aW9uXG4gICAgcmVzLm9uKCdjbG9zZScsICgpID0+IHtcbiAgICAgIGNsZWFyVGltZW91dCh0aW1lb3V0KTtcbiAgICAgIHRoaXMucmVtb3ZlQ2xpZW50KHJlcXVlc3RJZCwgY2xpZW50SWQpO1xuICAgIH0pO1xuXG4gICAgcmVzLm9uKCdlcnJvcicsIChlcnIpID0+IHtcbiAgICAgIGxvZ2dlci5lcnJvcihgU1NFIGNsaWVudCBlcnJvciBmb3IgcmVxdWVzdCAke3JlcXVlc3RJZH06YCwgZXJyKTtcbiAgICAgIGNsZWFyVGltZW91dCh0aW1lb3V0KTtcbiAgICAgIHRoaXMucmVtb3ZlQ2xpZW50KHJlcXVlc3RJZCwgY2xpZW50SWQpO1xuICAgIH0pO1xuXG4gICAgZXhpc3RpbmcucHVzaChjbGllbnQpO1xuICAgIHRoaXMuY2xpZW50cy5zZXQocmVxdWVzdElkLCBleGlzdGluZyk7XG5cbiAgICBsb2dnZXIuZGVidWcoYENsaWVudCAke2NsaWVudElkfSBjb25uZWN0ZWQgZm9yIHJlcXVlc3QgJHtyZXF1ZXN0SWR9ICh0b3RhbDogJHtleGlzdGluZy5sZW5ndGh9KWApO1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgLyoqIERyb3Agb25lIGZyb20gdGhlIHBlci1vcmcgY291bnRlci4gSWRlbXBvdGVudDogYSBjb3VudGVyIGF0IDAgc3RheXMgYXQgMFxuICAgKiAgYW5kIHRoZSBvcmcga2V5IGlzIHJlbW92ZWQgZnJvbSB0aGUgbWFwLiAqL1xuICBwcml2YXRlIGRlY3JlbWVudE9yZ0NvdW50KG9yZ0lkPzogc3RyaW5nKTogdm9pZCB7XG4gICAgaWYgKCFvcmdJZCkgcmV0dXJuO1xuICAgIGNvbnN0IGN1cnJlbnQgPSB0aGlzLm9yZ0NsaWVudENvdW50cy5nZXQob3JnSWQpID8/IDA7XG4gICAgaWYgKGN1cnJlbnQgPD0gMSkgdGhpcy5vcmdDbGllbnRDb3VudHMuZGVsZXRlKG9yZ0lkKTtcbiAgICBlbHNlIHRoaXMub3JnQ2xpZW50Q291bnRzLnNldChvcmdJZCwgY3VycmVudCAtIDEpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlbW92ZXMgYSBjbGllbnQgZnJvbSB0aGUgbWFuYWdlclxuICAgKi9cbiAgcHJpdmF0ZSByZW1vdmVDbGllbnQocmVxdWVzdElkOiBzdHJpbmcsIGNsaWVudElkOiBzdHJpbmcpOiB2b2lkIHtcbiAgICBjb25zdCBjbGllbnRzID0gdGhpcy5jbGllbnRzLmdldChyZXF1ZXN0SWQpO1xuICAgIGlmICghY2xpZW50cykgcmV0dXJuO1xuXG4gICAgY29uc3QgcmVtYWluaW5nID0gY2xpZW50cy5maWx0ZXIoYyA9PiB7XG4gICAgICBpZiAoYy5pZCA9PT0gY2xpZW50SWQpIHtcbiAgICAgICAgY2xlYXJUaW1lb3V0KGMudGltZW91dCk7XG4gICAgICAgIC8vIE1pcnJvciB0aGUgcGVyLW9yZyBjb3VudGVyIOKAlCBtdXN0IGRlY3JlbWVudCBoZXJlLCBub3QganVzdCBpbiB0aGVcbiAgICAgICAgLy8gZXhwbGljaXQgY2xvc2UgcGF0aHMsIHNpbmNlICdjbG9zZScvJ2Vycm9yJyBldmVudCBoYW5kbGVycyBhcmUgdGhlXG4gICAgICAgIC8vIHByaW1hcnkgZGlzY29ubmVjdCBzaWduYWwgaW4gcHJhY3RpY2UuXG4gICAgICAgIHRoaXMuZGVjcmVtZW50T3JnQ291bnQoYy5vcmdJZCk7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH0pO1xuXG4gICAgaWYgKHJlbWFpbmluZy5sZW5ndGggPT09IDApIHtcbiAgICAgIHRoaXMuY2xpZW50cy5kZWxldGUocmVxdWVzdElkKTtcbiAgICAgIGxvZ2dlci5kZWJ1ZyhgQWxsIGNsaWVudHMgZGlzY29ubmVjdGVkIGZvciByZXF1ZXN0ICR7cmVxdWVzdElkfWApO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmNsaWVudHMuc2V0KHJlcXVlc3RJZCwgcmVtYWluaW5nKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogU2VuZHMgYSBtZXNzYWdlIHRvIGFsbCBTU0UgY2xpZW50cyBmb3IgYSByZXF1ZXN0SWRcbiAgICpcbiAgICogQHBhcmFtIHJlcXVlc3RJZCAtIFJlcXVlc3QgSURcbiAgICogQHBhcmFtIHR5cGUgLSBFdmVudCB0eXBlXG4gICAqIEBwYXJhbSBtZXNzYWdlIC0gTWVzc2FnZSBzdHJpbmdcbiAgICogQHBhcmFtIGRhdGEgLSBPcHRpb25hbCBhZGRpdGlvbmFsIGRhdGFcbiAgICogQHJldHVybnMgTnVtYmVyIG9mIGNsaWVudHMgdGhlIG1lc3NhZ2Ugd2FzIHNlbnQgdG9cbiAgICovXG4gIHNlbmQocmVxdWVzdElkOiBzdHJpbmcsIHR5cGU6IFNTRUV2ZW50VHlwZSwgbWVzc2FnZTogc3RyaW5nLCBkYXRhPzogdW5rbm93bik6IG51bWJlciB7XG4gICAgY29uc3QgcGF5bG9hZDogU1NFUGF5bG9hZCA9IHtcbiAgICAgIHRzOiBuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKCksXG4gICAgICB0eXBlLFxuICAgICAgbWVzc2FnZSxcbiAgICAgIGRhdGEsXG4gICAgfTtcblxuICAgIC8vIERlbGl2ZXIgdG8gTE9DQUwgY2xpZW50cyBmaXJzdCwgdGhlbiByZWxheSB0aGUgU0FNRSBwYXlsb2FkIHRvIG90aGVyIHBvZHNcbiAgICAvLyBzbyBhbiBFdmVudFNvdXJjZSBhdHRhY2hlZCBvbiBhIGRpZmZlcmVudCByZXBsaWNhIGFsc28gcmVjZWl2ZXMgaXQuIFRoZVxuICAgIC8vIHJlbGF5IGlzIGZpcmUtYW5kLWZvcmdldCBhbmQgZmFpbC1zYWZlOiBubyByZWxheSAvIFJlZGlzIGRvd24g4oeSIGxvY2FsLW9ubHkuXG4gICAgY29uc3Qgc2VudENvdW50ID0gdGhpcy5zZW5kTG9jYWwocmVxdWVzdElkLCBwYXlsb2FkKTtcbiAgICB0aGlzLnB1Ymxpc2hSZWxheSh7IG9yaWdpbjogdGhpcy5ub2RlSWQsIGtpbmQ6ICdzZW5kJywgcmVxdWVzdElkLCBwYXlsb2FkIH0pO1xuICAgIHJldHVybiBzZW50Q291bnQ7XG4gIH1cblxuICAvKipcbiAgICogV3JpdGUgYSBwcmUtYnVpbHQgcGF5bG9hZCB0byB0aGlzIHBvZCdzIExPQ0FMIGNsaWVudHMgZm9yIGByZXF1ZXN0SWRgLiBTaGFyZWRcbiAgICogYnkge0BsaW5rIHNlbmR9IChsb2NhbCBoYWxmKSBhbmQgdGhlIHJlbGF5IHJlLWVtaXQgcGF0aCAoe0BsaW5rIG9uUmVsYXlNZXNzYWdlfSksXG4gICAqIHNvIGEgcmVsYXllZCBmcmFtZSByZXVzZXMgdGhlIHByb2R1Y2VyJ3Mgb3JpZ2luYWwgYHRzYCByYXRoZXIgdGhhbiBhIG5ldyBvbmUuXG4gICAqIE5ldmVyIHJlbGF5cyDigJQgY2FsbGVycyBkZWNpZGUgd2hldGhlciB0byBwdWJsaXNoLlxuICAgKi9cbiAgcHJpdmF0ZSBzZW5kTG9jYWwocmVxdWVzdElkOiBzdHJpbmcsIHBheWxvYWQ6IFNTRVBheWxvYWQpOiBudW1iZXIge1xuICAgIGNvbnN0IGNsaWVudHMgPSBbLi4uKHRoaXMuY2xpZW50cy5nZXQocmVxdWVzdElkKSB8fCBbXSldO1xuICAgIGxldCBzZW50Q291bnQgPSAwO1xuICAgIGNvbnN0IHNlcmlhbGl6ZWQgPSBgZGF0YTogJHtKU09OLnN0cmluZ2lmeShwYXlsb2FkKX1cXG5cXG5gO1xuXG4gICAgZm9yIChjb25zdCBjbGllbnQgb2YgY2xpZW50cykge1xuICAgICAgdHJ5IHtcbiAgICAgICAgLy8gQmFja3ByZXNzdXJlOiBza2lwIGNsaWVudHMgd2hvc2Ugd3JpdGUgYnVmZmVyIGlzIGZ1bGxcbiAgICAgICAgaWYgKGNsaWVudC5yZXMud3JpdGFibGVFbmRlZCkge1xuICAgICAgICAgIHRoaXMucmVtb3ZlQ2xpZW50KHJlcXVlc3RJZCwgY2xpZW50LmlkKTtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBjYW5Xcml0ZSA9IGNsaWVudC5yZXMud3JpdGUoc2VyaWFsaXplZCk7XG4gICAgICAgIGlmICghY2FuV3JpdGUpIHtcbiAgICAgICAgICBjbGllbnQuYmFja3ByZXNzdXJlQ291bnQrKztcbiAgICAgICAgICAvLyBEaXNjb25uZWN0IGNsaWVudHMgdGhhdCBjb25zaXN0ZW50bHkgY2FuJ3Qga2VlcCB1cCAoMTAgY29uc2VjdXRpdmUgYmFja3ByZXNzdXJlIGV2ZW50cylcbiAgICAgICAgICBpZiAoY2xpZW50LmJhY2twcmVzc3VyZUNvdW50ID49IENvcmVDb25zdGFudHMuU1NFX0JBQ0tQUkVTU1VSRV9USFJFU0hPTEQpIHtcbiAgICAgICAgICAgIGxvZ2dlci53YXJuKGBEaXNjb25uZWN0aW5nIHNsb3cgY2xpZW50ICR7Y2xpZW50LmlkfSBmb3IgcmVxdWVzdCAke3JlcXVlc3RJZH0gKCR7Y2xpZW50LmJhY2twcmVzc3VyZUNvdW50fSBiYWNrcHJlc3N1cmUgZXZlbnRzKWApO1xuICAgICAgICAgICAgdGhpcy5yZW1vdmVDbGllbnQocmVxdWVzdElkLCBjbGllbnQuaWQpO1xuICAgICAgICAgICAgdHJ5IHsgY2xpZW50LnJlcy5lbmQoKTsgfSBjYXRjaCB7IC8qIGFscmVhZHkgY2xvc2VkICovIH1cbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBjbGllbnQuYmFja3ByZXNzdXJlQ291bnQgPSAwOyAvLyBSZXNldCBvbiBzdWNjZXNzZnVsIHdyaXRlXG4gICAgICAgIH1cbiAgICAgICAgc2VudENvdW50Kys7XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBsb2dnZXIuZXJyb3IoYEZhaWxlZCB0byBzZW5kIHRvIGNsaWVudCAke2NsaWVudC5pZH06YCwgZXJyb3IpO1xuICAgICAgICB0aGlzLnJlbW92ZUNsaWVudChyZXF1ZXN0SWQsIGNsaWVudC5pZCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHNlbnRDb3VudDtcbiAgfVxuXG4gIC8qKlxuICAgKiBCcm9hZGNhc3QgYSBtZXNzYWdlIHRvIGFsbCBjb25uZWN0ZWQgY2xpZW50cyBhY3Jvc3MgYWxsIHJlcXVlc3RzXG4gICAqXG4gICAqIEBwYXJhbSB0eXBlIC0gRXZlbnQgdHlwZVxuICAgKiBAcGFyYW0gbWVzc2FnZSAtIE1lc3NhZ2Ugc3RyaW5nXG4gICAqIEBwYXJhbSBkYXRhIC0gT3B0aW9uYWwgYWRkaXRpb25hbCBkYXRhXG4gICAqIEByZXR1cm5zIFRvdGFsIG51bWJlciBvZiBjbGllbnRzIHRoZSBtZXNzYWdlIHdhcyBzZW50IHRvXG4gICAqL1xuICBicm9hZGNhc3QodHlwZTogU1NFRXZlbnRUeXBlLCBtZXNzYWdlOiBzdHJpbmcsIGRhdGE/OiB1bmtub3duKTogbnVtYmVyIHtcbiAgICBjb25zdCBwYXlsb2FkOiBTU0VQYXlsb2FkID0ge1xuICAgICAgdHM6IG5ldyBEYXRlKCkudG9JU09TdHJpbmcoKSxcbiAgICAgIHR5cGUsXG4gICAgICBtZXNzYWdlLFxuICAgICAgZGF0YSxcbiAgICB9O1xuICAgIC8vIERlbGl2ZXIgdG8gbG9jYWwgY2xpZW50cywgdGhlbiByZWxheSBhIHNpbmdsZSBicm9hZGNhc3QgZnJhbWUgc28gRVZFUlkgcG9kXG4gICAgLy8gcmUtZW1pdHMgdG8gQUxMIG9mIGl0cyBvd24gY2xpZW50cyDigJQgYSBwZXItcmVxdWVzdElkIHJlbGF5IHdvdWxkIG1pc3NcbiAgICAvLyBzdWJqZWN0cyB0aGF0IG9ubHkgZXhpc3Qgb24gb3RoZXIgcmVwbGljYXMuXG4gICAgY29uc3QgdG90YWxTZW50ID0gdGhpcy5icm9hZGNhc3RMb2NhbChwYXlsb2FkKTtcbiAgICB0aGlzLnB1Ymxpc2hSZWxheSh7IG9yaWdpbjogdGhpcy5ub2RlSWQsIGtpbmQ6ICdicm9hZGNhc3QnLCBwYXlsb2FkIH0pO1xuICAgIHJldHVybiB0b3RhbFNlbnQ7XG4gIH1cblxuICAvKiogV3JpdGUgYSBwcmUtYnVpbHQgcGF5bG9hZCB0byBhbGwgTE9DQUwgY2xpZW50cyBhY3Jvc3MgZXZlcnkgcmVxdWVzdC4gKi9cbiAgcHJpdmF0ZSBicm9hZGNhc3RMb2NhbChwYXlsb2FkOiBTU0VQYXlsb2FkKTogbnVtYmVyIHtcbiAgICBsZXQgdG90YWxTZW50ID0gMDtcbiAgICBmb3IgKGNvbnN0IHJlcXVlc3RJZCBvZiBbLi4udGhpcy5jbGllbnRzLmtleXMoKV0pIHtcbiAgICAgIHRvdGFsU2VudCArPSB0aGlzLnNlbmRMb2NhbChyZXF1ZXN0SWQsIHBheWxvYWQpO1xuICAgIH1cbiAgICByZXR1cm4gdG90YWxTZW50O1xuICB9XG5cbiAgLyoqIEZpcmUtYW5kLWZvcmdldCByZWxheSBwdWJsaXNoLiBOby1vcCAobG9jYWwtb25seSkgd2hlbiBubyByZWxheSBpcyB3aXJlZC4gKi9cbiAgcHJpdmF0ZSBwdWJsaXNoUmVsYXkobXNnOiBTU0VSZWxheU1lc3NhZ2UpOiB2b2lkIHtcbiAgICB0aGlzLnJlbGF5Py5wdWJsaXNoKG1zZyk7XG4gIH1cblxuICAvKipcbiAgICogQ2xvc2UgYWxsIGNsaWVudHMgZm9yIGEgc3BlY2lmaWMgcmVxdWVzdFxuICAgKlxuICAgKiBAcGFyYW0gcmVxdWVzdElkIC0gUmVxdWVzdCBJRCB0byBjbG9zZVxuICAgKiBAcGFyYW0gZmluYWxNZXNzYWdlIC0gT3B0aW9uYWwgZmluYWwgbWVzc2FnZSB0byBzZW5kIGJlZm9yZSBjbG9zaW5nXG4gICAqL1xuICBjbG9zZVJlcXVlc3QocmVxdWVzdElkOiBzdHJpbmcsIGZpbmFsTWVzc2FnZT86IHN0cmluZyk6IHZvaWQge1xuICAgIGNvbnN0IGNsaWVudHMgPSB0aGlzLmNsaWVudHMuZ2V0KHJlcXVlc3RJZCk7XG4gICAgaWYgKCFjbGllbnRzKSByZXR1cm47XG5cbiAgICBpZiAoZmluYWxNZXNzYWdlKSB7XG4gICAgICB0aGlzLnNlbmQocmVxdWVzdElkLCAnQ09NUExFVEVEJywgZmluYWxNZXNzYWdlKTtcbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IGNsaWVudCBvZiBjbGllbnRzKSB7XG4gICAgICBjbGVhclRpbWVvdXQoY2xpZW50LnRpbWVvdXQpO1xuICAgICAgdGhpcy5kZWNyZW1lbnRPcmdDb3VudChjbGllbnQub3JnSWQpO1xuICAgICAgdHJ5IHtcbiAgICAgICAgY2xpZW50LnJlcy5lbmQoKTtcbiAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICBsb2dnZXIuZGVidWcoJ1Jlc3BvbnNlIGFscmVhZHkgY2xvc2VkIG9uIHJlcXVlc3QgY2xvc2UnLCB7IHJlcXVlc3RJZCwgY2xpZW50SWQ6IGNsaWVudC5pZCwgZXJyb3I6IGVyciBpbnN0YW5jZW9mIEVycm9yID8gZXJyLm1lc3NhZ2UgOiBTdHJpbmcoZXJyKSB9KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB0aGlzLmNsaWVudHMuZGVsZXRlKHJlcXVlc3RJZCk7XG4gICAgbG9nZ2VyLmRlYnVnKGBDbG9zZWQgYWxsIGNsaWVudHMgZm9yIHJlcXVlc3QgJHtyZXF1ZXN0SWR9YCk7XG4gIH1cblxuICAvKipcbiAgICogR2V0IHN0YXRpc3RpY3MgYWJvdXQgY3VycmVudCBjb25uZWN0aW9uc1xuICAgKi9cbiAgZ2V0U3RhdHMoKTogU1NFTWFuYWdlclN0YXRzIHtcbiAgICBsZXQgdG90YWxDbGllbnRzID0gMDtcbiAgICBsZXQgb2xkZXN0Q29ubmVjdGlvbjogbnVtYmVyIHwgbnVsbCA9IG51bGw7XG4gICAgY29uc3Qgbm93ID0gRGF0ZS5ub3coKTtcblxuICAgIGZvciAoY29uc3QgY2xpZW50cyBvZiB0aGlzLmNsaWVudHMudmFsdWVzKCkpIHtcbiAgICAgIHRvdGFsQ2xpZW50cyArPSBjbGllbnRzLmxlbmd0aDtcbiAgICAgIGZvciAoY29uc3QgY2xpZW50IG9mIGNsaWVudHMpIHtcbiAgICAgICAgY29uc3QgYWdlID0gbm93IC0gY2xpZW50LmNvbm5lY3RlZEF0O1xuICAgICAgICBpZiAob2xkZXN0Q29ubmVjdGlvbiA9PT0gbnVsbCB8fCBhZ2UgPiBvbGRlc3RDb25uZWN0aW9uKSB7XG4gICAgICAgICAgb2xkZXN0Q29ubmVjdGlvbiA9IGFnZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICB0b3RhbFJlcXVlc3RzOiB0aGlzLmNsaWVudHMuc2l6ZSxcbiAgICAgIHRvdGFsQ2xpZW50cyxcbiAgICAgIG9sZGVzdENvbm5lY3Rpb25Nczogb2xkZXN0Q29ubmVjdGlvbixcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrIGlmIGEgcmVxdWVzdCBoYXMgYW55IGNvbm5lY3RlZCBjbGllbnRzXG4gICAqL1xuICBoYXNDbGllbnRzKHJlcXVlc3RJZDogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgY29uc3QgY2xpZW50cyA9IHRoaXMuY2xpZW50cy5nZXQocmVxdWVzdElkKTtcbiAgICByZXR1cm4gY2xpZW50cyAhPT0gdW5kZWZpbmVkICYmIGNsaWVudHMubGVuZ3RoID4gMDtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgdGhlIG51bWJlciBvZiBjbGllbnRzIGZvciBhIHNwZWNpZmljIHJlcXVlc3RcbiAgICovXG4gIGdldENsaWVudENvdW50KHJlcXVlc3RJZDogc3RyaW5nKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5jbGllbnRzLmdldChyZXF1ZXN0SWQpPy5sZW5ndGggPz8gMDtcbiAgfVxuXG4gIC8qKlxuICAgKiBNaWRkbGV3YXJlIHRvIGluaXRpYWxpemUgYSB0aWNrZXQtYXV0aGVudGljYXRlZCBTU0UgY29ubmVjdGlvbi5cbiAgICpcbiAgICogVGhlIHN0cmVhbSBpcyBOT1Qgb3BlbiB0byB0aGUgd29ybGQ6IHRoZSBjYWxsZXIgbXVzdCBmaXJzdCBleGNoYW5nZSBpdHNcbiAgICogSldUIGZvciBhIHNob3J0LWxpdmVkIHNpbmdsZS11c2UgdGlja2V0IChzZWUge0BsaW5rIGNyZWF0ZVRpY2tldH0sIHdpcmVkIHRvXG4gICAqIGBQT1NUIC9sb2dzL3RpY2tldGApIGFuZCBwYXNzIGl0IGFzIGA/dGlja2V0PTx0PmAuIFRoZSBtaWRkbGV3YXJlIHZhbGlkYXRlc1xuICAgKiArIGNvbnN1bWVzIHRoZSB0aWNrZXQsIGJpbmRzIHRoZSBjb25uZWN0aW9uIHRvIHRoZSB0aWNrZXQncyBvcmcsIGFuZFxuICAgKiBlbmZvcmNlcyB0aGUgcGVyLW9yZyBjb25uZWN0aW9uIGNhcC4gQSBtaXNzaW5nIC8gaW52YWxpZCAvIGV4cGlyZWQgL1xuICAgKiBhbHJlYWR5LXVzZWQgdGlja2V0IGlzIHJlamVjdGVkIHdpdGggNDAxIGJlZm9yZSBhbnkgU1NFIGhlYWRlcnMgZmx1c2guXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIGBgYHR5cGVzY3JpcHRcbiAgICogYXBwLmdldCgnL2xvZ3MvOnJlcXVlc3RJZCcsIHNzZU1hbmFnZXIubWlkZGxld2FyZSgpKTtcbiAgICogYGBgXG4gICAqL1xuICBtaWRkbGV3YXJlKCkge1xuICAgIHJldHVybiBhc3luYyAocmVxOiB7IHBhcmFtczogeyByZXF1ZXN0SWQ6IHN0cmluZyB9OyBxdWVyeT86IHsgdGlja2V0PzogdW5rbm93biB9IH0sIHJlczogUmVzcG9uc2UpID0+IHtcbiAgICAgIGNvbnN0IHsgcmVxdWVzdElkIH0gPSByZXEucGFyYW1zO1xuXG4gICAgICBpZiAoIVNTRV9SRVFVRVNUX0lEX1JFLnRlc3QocmVxdWVzdElkKSkge1xuICAgICAgICByZXMuc3RhdHVzKDQwMCkuZW5kKCdJbnZhbGlkIHJlcXVlc3RJZCBmb3JtYXQnKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICAvLyBUaWNrZXQgYXV0aCDigJQgcmVxdWlyZWQuIFJlc29sdmUgYD90aWNrZXQ9PHQ+YCwgdGhlbiB2YWxpZGF0ZSArIGNvbnN1bWVcbiAgICAgIC8vIGl0IChzaW5nbGUtdXNlKSBGT1IgVEhJUyBTVUJKRUNULiBBbiBhbm9ueW1vdXMsIG1hbGZvcm1lZCwgdW5rbm93bixcbiAgICAgIC8vIGV4cGlyZWQsIGFscmVhZHktY29uc3VtZWQsIG9yIHdyb25nLXN1YmplY3QgdGlja2V0IGlzIGEgNDAxLiBUaGUgb3JnIGlzXG4gICAgICAvLyB0YWtlbiBmcm9tIHRoZSB0aWNrZXQsIHNvIHRoZSBzdHJlYW0gaXMgYWx3YXlzIGJvdW5kIHRvIGEgdmVyaWZpZWRcbiAgICAgIC8vIHRlbmFudCBBTkQgdG8gdGhlIGV4YWN0IHN1YmplY3QgdGhlIHRpY2tldCB3YXMgbWludGVkIGZvciAobm8gYW5vbnltb3VzXG4gICAgICAvLyBzdHJlYW1zLCBubyBjcm9zcy1zdWJqZWN0IGF0dGFjaCkuXG4gICAgICBjb25zdCB0aWNrZXRJZCA9IHJlcS5xdWVyeT8udGlja2V0O1xuICAgICAgaWYgKHR5cGVvZiB0aWNrZXRJZCAhPT0gJ3N0cmluZycgfHwgdGlja2V0SWQubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIHJlcy5zdGF0dXMoNDAxKS5lbmQoJ01pc3NpbmcgdGlja2V0Jyk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGNvbnN1bWVkID0gYXdhaXQgdGhpcy5jb25zdW1lVGlja2V0KHRpY2tldElkLCByZXF1ZXN0SWQpO1xuICAgICAgaWYgKCFjb25zdW1lZCkge1xuICAgICAgICByZXMuc3RhdHVzKDQwMSkuZW5kKCdJbnZhbGlkIG9yIGV4cGlyZWQgdGlja2V0Jyk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGNvbnN0IG9yZ0lkID0gY29uc3VtZWQub3JnSWQ7XG5cbiAgICAgIC8vIFByZS1mbGlnaHQgcGVyLXJlcXVlc3QgY2FwIHNvIHdlIGNhbiByZXR1cm4gNDI5IGJlZm9yZSBmbHVzaGluZ1xuICAgICAgLy8gU1NFIGhlYWRlcnMgKGFmdGVyIGhlYWRlcnMgYXJlIGZsdXNoZWQgdGhlIGNsaWVudCBjYW4ndCByZWFkIGEgNDI5KS5cbiAgICAgIGNvbnN0IGV4aXN0aW5nID0gdGhpcy5jbGllbnRzLmdldChyZXF1ZXN0SWQpIHx8IFtdO1xuICAgICAgaWYgKGV4aXN0aW5nLmxlbmd0aCA+PSB0aGlzLm1heENsaWVudHNQZXJSZXF1ZXN0KSB7XG4gICAgICAgIGxvZ2dlci53YXJuKGBDbGllbnQgbGltaXQgcmVhY2hlZCBmb3IgcmVxdWVzdCAke3JlcXVlc3RJZH0gKG1heDogJHt0aGlzLm1heENsaWVudHNQZXJSZXF1ZXN0fSlgKTtcbiAgICAgICAgcmVzLnN0YXR1cyg0MjkpLmVuZCgnVG9vIG1hbnkgY29ubmVjdGlvbnMgZm9yIHRoaXMgcmVxdWVzdCcpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIC8vIFNhbWUgZm9yIHRoZSBwZXItb3JnIGNhcCDigJQgYmV0dGVyIHRvIHNlbmQgNDI5IHRoYW4gb3BlbiB0aGUgc3RyZWFtIGFuZFxuICAgICAgLy8gaW1tZWRpYXRlbHkgY2xvc2UgaXQuIFRoZSB0aWNrZXQgZ3VhcmFudGVlcyBhIHZlcmlmaWVkIG9yZyBpZCwgc28gdGhlXG4gICAgICAvLyBwZXItb3JnIGNlaWxpbmcgaXMgYWx3YXlzIGVuZm9yY2VkIGZvciB0aGUgL2xvZ3Mgc3RyZWFtLlxuICAgICAgaWYgKCh0aGlzLm9yZ0NsaWVudENvdW50cy5nZXQob3JnSWQpID8/IDApID49IHRoaXMubWF4Q2xpZW50c1Blck9yZykge1xuICAgICAgICBsb2dnZXIud2FybihgUGVyLW9yZyBTU0UgY2xpZW50IGNhcCByZWFjaGVkIGZvciAke29yZ0lkfSAobWF4OiAke3RoaXMubWF4Q2xpZW50c1Blck9yZ30pYCk7XG4gICAgICAgIHJlcy5zdGF0dXMoNDI5KS5lbmQoJ1RvbyBtYW55IFNTRSBjb25uZWN0aW9ucyBmb3IgdGhpcyBvcmdhbml6YXRpb24nKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICB3cml0ZVNzZUhlYWRlcnMocmVzKTtcbiAgICAgIHJlcy5mbHVzaEhlYWRlcnMoKTtcblxuICAgICAgLy8gSGVhZGVycyBhcmUgZmx1c2hlZCDigJQgd2UgY2FuIG5vIGxvbmdlciBzZW5kIGEgNDI5LiBhZGRDbGllbnQgcmUtY2hlY2tzXG4gICAgICAvLyB0aGUgY2FwcyAoaW5jbHVkaW5nIHRoZSBwcm9jZXNzLXdpZGUgdG90YWwtY2xpZW50cyBjYXAsIHdoaWNoIHRoZVxuICAgICAgLy8gcHJlLWZsaWdodCBhYm92ZSBkb2VzIG5vdCkgYW5kIGNhbiBzdGlsbCByZWplY3Qgb24gYSByYWNlOiBhIGNvbmN1cnJlbnRcbiAgICAgIC8vIGNvbm5lY3Rpb24gbWF5IGhhdmUgZmlsbGVkIGEgY2FwIGJldHdlZW4gdGhlIHByZS1mbGlnaHQgY2hlY2sgYW5kIGhlcmUuXG4gICAgICAvLyBPbiByZWplY3Rpb24sIGNsb3NlIHRoZSBub3ctZGFuZ2xpbmcgcmVzcG9uc2UgaW5zdGVhZCBvZiBsZWF2aW5nIGFuXG4gICAgICAvLyBvcGVuIHNvY2tldCB3aXRoIG5vIGNsaWVudCByZWNvcmQgKHdoaWNoIHdvdWxkIGxlYWsgYW4gZmQgKyBuZXZlciBlbWl0XG4gICAgICAvLyBzdHJlYW0gZGF0YSkuXG4gICAgICBjb25zdCBhZGRlZCA9IHRoaXMuYWRkQ2xpZW50KHJlcXVlc3RJZCwgcmVzLCBvcmdJZCk7XG4gICAgICBpZiAoIWFkZGVkKSB7XG4gICAgICAgIGxvZ2dlci53YXJuKGBTU0UgYWRkQ2xpZW50IHJlamVjdGVkIGFmdGVyIGhlYWRlcnMgZmx1c2hlZCBmb3IgcmVxdWVzdCAke3JlcXVlc3RJZH07IGNsb3NpbmcgZGFuZ2xpbmcgcmVzcG9uc2VgKTtcbiAgICAgICAgdHJ5IHsgcmVzLmVuZCgpOyB9IGNhdGNoIHsgLyogYWxyZWFkeSBjbG9zZWQgKi8gfVxuICAgICAgfVxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogU3RhcnQgcGVyaW9kaWMgY2xlYW51cCBvZiBzdGFsZSBjb25uZWN0aW9uc1xuICAgKi9cbiAgcHJpdmF0ZSBzdGFydENsZWFudXBJbnRlcnZhbChpbnRlcnZhbE1zOiBudW1iZXIpOiB2b2lkIHtcbiAgICB0aGlzLmNsZWFudXBJbnRlcnZhbCA9IHNldEludGVydmFsKCgpID0+IHtcbiAgICAgIHRoaXMuY2xlYW51cCgpO1xuICAgIH0sIGludGVydmFsTXMpO1xuXG4gICAgLy8gRG9uJ3QgcHJldmVudCBwcm9jZXNzIGV4aXRcbiAgICB0aGlzLmNsZWFudXBJbnRlcnZhbC51bnJlZigpO1xuICB9XG5cbiAgLyoqXG4gICAqIENsZWFuIHVwIHN0YWxlIGNvbm5lY3Rpb25zIHVzaW5nIHNpbmdsZS1wYXNzIHBhcnRpdGlvbi5cbiAgICogTyhSIMOXIEMpIGluc3RlYWQgb2YgTyhSIMOXIEPCsiksIGFuZCBhdm9pZHMgbXV0YXRpb24tZHVyaW5nLWl0ZXJhdGlvbi5cbiAgICovXG4gIHByaXZhdGUgY2xlYW51cCgpOiB2b2lkIHtcbiAgICBjb25zdCBub3cgPSBEYXRlLm5vdygpO1xuICAgIGxldCBjbGVhbmVkID0gMDtcblxuICAgIC8vIFN3ZWVwIGV4cGlyZWQgdGlja2V0cy9vd25lcnMgc28gYW4gaW4tbWVtb3J5IHN0b3JlIHN0YXlzIGJvdW5kZWQgZXZlbiB3aGVuXG4gICAgLy8gdGlja2V0cyBhcmUgbWludGVkIGJ1dCBuZXZlciBjb25zdW1lZCAoY2xpZW50IGNsb3NlZCB0aGUgdGFiIGJlZm9yZVxuICAgIC8vIGNvbm5lY3RpbmcpLiBDb25zdW1lLXRpbWUgc3RpbGwgcmUtY2hlY2tzIGV4cGlyeSwgc28gdGhpcyBpcyBtZW1vcnlcbiAgICAvLyBoeWdpZW5lIG9ubHk7IHRoZSBSZWRpcyBzdG9yZSByZWxpZXMgb24gbmF0aXZlIGtleSBUVEwgKHN3ZWVwIGlzIGEgbm8tb3ApLlxuICAgIHZvaWQgdGhpcy50aWNrZXRTdG9yZS5zd2VlcD8uKCk7XG5cbiAgICBmb3IgKGNvbnN0IFtyZXF1ZXN0SWQsIGNsaWVudHNdIG9mIHRoaXMuY2xpZW50cy5lbnRyaWVzKCkpIHtcbiAgICAgIGNvbnN0IHN0YWxlOiBTU0VDbGllbnRbXSA9IFtdO1xuICAgICAgY29uc3QgYWN0aXZlOiBTU0VDbGllbnRbXSA9IFtdO1xuXG4gICAgICBmb3IgKGNvbnN0IGNsaWVudCBvZiBjbGllbnRzKSB7XG4gICAgICAgIC8vIFRpbWUtYmFzZWQgZXZpY3Rpb24gT1IgYSBzb2NrZXQgdGhhdCBzaWxlbnRseSBjbG9zZWQgKG5vICdjbG9zZSdcbiAgICAgICAgLy8gZXZlbnQpIOKAlCBOb2RlIHNvbWV0aW1lcyBkcm9wcyBzb2NrZXRzIHdpdGhvdXQgZmlyaW5nIHRoZSBldmVudCxcbiAgICAgICAgLy8gc28gd2UgZXhwbGljaXRseSBjaGVjayB3cml0YWJsZUVuZGVkL2Rlc3Ryb3llZCBoZXJlLlxuICAgICAgICBjb25zdCBhZ2VTdGFsZSA9IG5vdyAtIGNsaWVudC5jb25uZWN0ZWRBdCA+IHRoaXMuY2xpZW50VGltZW91dE1zO1xuICAgICAgICBjb25zdCBzb2NrZXREZWFkID0gY2xpZW50LnJlcy53cml0YWJsZUVuZGVkIHx8IChjbGllbnQucmVzIGFzIHsgZGVzdHJveWVkPzogYm9vbGVhbiB9KS5kZXN0cm95ZWQgPT09IHRydWU7XG4gICAgICAgIGlmIChhZ2VTdGFsZSB8fCBzb2NrZXREZWFkKSB7XG4gICAgICAgICAgc3RhbGUucHVzaChjbGllbnQpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGFjdGl2ZS5wdXNoKGNsaWVudCk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgZm9yIChjb25zdCBjbGllbnQgb2Ygc3RhbGUpIHtcbiAgICAgICAgY2xlYXJUaW1lb3V0KGNsaWVudC50aW1lb3V0KTtcbiAgICAgICAgdGhpcy5kZWNyZW1lbnRPcmdDb3VudChjbGllbnQub3JnSWQpO1xuICAgICAgICB0cnkgeyBjbGllbnQucmVzLmVuZCgpOyB9IGNhdGNoIHsgLyogYWxyZWFkeSBjbG9zZWQgKi8gfVxuICAgICAgICBjbGVhbmVkKys7XG4gICAgICB9XG5cbiAgICAgIGlmIChhY3RpdmUubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIHRoaXMuY2xpZW50cy5kZWxldGUocmVxdWVzdElkKTtcbiAgICAgIH0gZWxzZSBpZiAoc3RhbGUubGVuZ3RoID4gMCkge1xuICAgICAgICB0aGlzLmNsaWVudHMuc2V0KHJlcXVlc3RJZCwgYWN0aXZlKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoY2xlYW5lZCA+IDApIHtcbiAgICAgIGxvZ2dlci5pbmZvKGBDbGVhbmVkIHVwICR7Y2xlYW5lZH0gc3RhbGUgU1NFIGNvbm5lY3Rpb25zYCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFNodXRkb3duIHRoZSBTU0UgbWFuYWdlciBhbmQgY2xvc2UgYWxsIGNvbm5lY3Rpb25zXG4gICAqL1xuICBzaHV0ZG93bigpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5jbGVhbnVwSW50ZXJ2YWwpIHtcbiAgICAgIGNsZWFySW50ZXJ2YWwodGhpcy5jbGVhbnVwSW50ZXJ2YWwpO1xuICAgICAgdGhpcy5jbGVhbnVwSW50ZXJ2YWwgPSBudWxsO1xuICAgIH1cblxuICAgIGZvciAoY29uc3QgcmVxdWVzdElkIG9mIFsuLi50aGlzLmNsaWVudHMua2V5cygpXSkge1xuICAgICAgdGhpcy5jbG9zZVJlcXVlc3QocmVxdWVzdElkLCAnU2VydmVyIHNodXR0aW5nIGRvd24nKTtcbiAgICB9XG5cbiAgICAvLyBUZWFyIGRvd24gdGhlIHJlbGF5J3MgUmVkaXMgY29ubmVjdGlvbnMgKGJlc3QtZWZmb3J0OyBuZXZlciB0aHJvd3MpLlxuICAgIHZvaWQgdGhpcy5yZWxheT8uY2xvc2UoKS5jYXRjaCgoKSA9PiB7IC8qIGFscmVhZHkgY2xvc2luZyAqLyB9KTtcblxuICAgIGxvZ2dlci5pbmZvKCdTU0UgTWFuYWdlciBzaHV0IGRvd24nKTtcbiAgfVxufVxuIl19
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
/** A minted ticket's bound identity: owning org + normalized stream subject. */
|
|
2
|
-
export interface
|
|
2
|
+
export interface SSEStreamTicketRecord {
|
|
3
3
|
orgId: string;
|
|
4
4
|
/** Normalized (dashes stripped, lowercased) stream subject id. */
|
|
5
5
|
requestId: string;
|
|
@@ -7,6 +7,12 @@ export interface SSETicketRecord {
|
|
|
7
7
|
/**
|
|
8
8
|
* Pluggable backend for SSE log-stream tickets AND stream-ownership.
|
|
9
9
|
*
|
|
10
|
+
* NOTE: distinct from api-core's `SseTicketStore` (services/sse-ticket-store.ts),
|
|
11
|
+
* which is the message-service ticket store (issue + abuse counters). This one
|
|
12
|
+
* (api-server) additionally tracks stream ownership. The names deliberately differ
|
|
13
|
+
* (`SSEStreamTicketStore` here vs `SseTicketStore` there) so consumers don't pick
|
|
14
|
+
* the wrong one.
|
|
15
|
+
*
|
|
10
16
|
* Two concerns share one store because both must be consistent across pods:
|
|
11
17
|
* - **Tickets** — short-lived, single-use, bound to (org, subject). The default
|
|
12
18
|
* in-memory store is correct only single-replica; the Redis store makes the
|
|
@@ -19,11 +25,11 @@ export interface SSETicketRecord {
|
|
|
19
25
|
* All methods are async (Redis is async) and best-effort on the failure side per
|
|
20
26
|
* their doc — a store outage must degrade gracefully, never crash the stream.
|
|
21
27
|
*/
|
|
22
|
-
export interface
|
|
28
|
+
export interface SSEStreamTicketStore {
|
|
23
29
|
/** Persist a single-use ticket bound to `record`, expiring after `ttlMs`. */
|
|
24
|
-
put(ticketId: string, record:
|
|
30
|
+
put(ticketId: string, record: SSEStreamTicketRecord, ttlMs: number): Promise<void>;
|
|
25
31
|
/** Atomically fetch-and-delete a ticket (single-use). Null if absent/expired. */
|
|
26
|
-
consume(ticketId: string): Promise<
|
|
32
|
+
consume(ticketId: string): Promise<SSEStreamTicketRecord | null>;
|
|
27
33
|
/** Count of live (unexpired) tickets held for an org (per-org cap). */
|
|
28
34
|
countForOrg(orgId: string): Promise<number>;
|
|
29
35
|
/** Count of all live tickets across the store (capacity cap). */
|
|
@@ -39,7 +45,7 @@ export interface SSETicketStore {
|
|
|
39
45
|
* In-memory ticket store — the default. Correct for a single replica only;
|
|
40
46
|
* mirrors the behavior the SSEManager previously implemented inline.
|
|
41
47
|
*/
|
|
42
|
-
export declare function createMemoryTicketStore():
|
|
48
|
+
export declare function createMemoryTicketStore(): SSEStreamTicketStore;
|
|
43
49
|
/**
|
|
44
50
|
* Minimal ioredis surface the Redis ticket store needs. `set` takes the variadic
|
|
45
51
|
* option tail (`EX <s>`); `zadd`/`zremrangebyscore`/`zcard` back the cap counters.
|
|
@@ -60,10 +66,10 @@ export interface RedisTicketClient {
|
|
|
60
66
|
* read). Stream ownership is a per-subject key with its own TTL. All reads are
|
|
61
67
|
* fail-safe (null / 0) so a Redis blip never wedges the stream.
|
|
62
68
|
*/
|
|
63
|
-
export declare function createRedisTicketStore(redis: RedisTicketClient):
|
|
69
|
+
export declare function createRedisTicketStore(redis: RedisTicketClient): SSEStreamTicketStore;
|
|
64
70
|
/**
|
|
65
71
|
* Build a Redis-backed ticket store from the shared env Redis (same wiring as
|
|
66
72
|
* the rate-limiter / audit-spool). Returns null when Redis isn't configured so
|
|
67
73
|
* the caller keeps the in-memory default. Never throws.
|
|
68
74
|
*/
|
|
69
|
-
export declare function createEnvRedisTicketStore():
|
|
75
|
+
export declare function createEnvRedisTicketStore(): SSEStreamTicketStore | null;
|
|
@@ -157,4 +157,4 @@ export function createEnvRedisTicketStore() {
|
|
|
157
157
|
logger.info('Redis SSE ticket store initialized');
|
|
158
158
|
return createRedisTicketStore(client);
|
|
159
159
|
}
|
|
160
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3NlLXRpY2tldC1zdG9yZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9odHRwL3NzZS10aWNrZXQtc3RvcmUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsK0NBQStDO0FBQy9DLHNDQUFzQztBQUV0QyxPQUFPLEVBQUUsWUFBWSxFQUFFLG9CQUFvQixFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFFaEYsTUFBTSxNQUFNLEdBQUcsWUFBWSxDQUFDLGtCQUFrQixDQUFDLENBQUM7QUFrRGhEOzs7R0FHRztBQUNILE1BQU0sVUFBVSx1QkFBdUI7SUFDckMsTUFBTSxPQUFPLEdBQUcsSUFBSSxHQUFHLEVBQXdCLENBQUM7SUFDaEQsTUFBTSxNQUFNLEdBQUcsSUFBSSxHQUFHLEVBQXVCLENBQUM7SUFFOUMsT0FBTztRQUNMLEtBQUssQ0FBQyxHQUFHLENBQUMsUUFBUSxFQUFFLE1BQU0sRUFBRSxLQUFLO1lBQy9CLE9BQU8sQ0FBQyxHQUFHLENBQUMsUUFBUSxFQUFFLEVBQUUsR0FBRyxNQUFNLEVBQUUsU0FBUyxFQUFFLElBQUksQ0FBQyxHQUFHLEVBQUUsR0FBRyxLQUFLLEVBQUUsQ0FBQyxDQUFDO1FBQ3RFLENBQUM7UUFDRCxLQUFLLENBQUMsT0FBTyxDQUFDLFFBQVE7WUFDcEIsTUFBTSxDQUFDLEdBQUcsT0FBTyxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUMsQ0FBQztZQUNoQyxPQUFPLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsMkNBQTJDO1lBQ3JFLElBQUksQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLEdBQUcsRUFBRSxHQUFHLENBQUMsQ0FBQyxTQUFTO2dCQUFFLE9BQU8sSUFBSSxDQUFDO1lBQ2hELE9BQU8sRUFBRSxLQUFLLEVBQUUsQ0FBQyxDQUFDLEtBQUssRUFBRSxTQUFTLEVBQUUsQ0FBQyxDQUFDLFNBQVMsRUFBRSxDQUFDO1FBQ3BELENBQUM7UUFDRCxLQUFLLENBQUMsV0FBVyxD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QUFPLElBQUksQ0FBQztJQUN6QixNQUFNLENBQUMsSUFBSSxDQUFDLG9DQUFvQyxDQUFDLENBQUM7SUFDbEQsT0FBTyxzQkFBc0IsQ0FBQyxNQUFNLENBQUMsQ0FBQztBQUN4QyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQ29weXJpZ2h0IDIwMjYgUGlwZWxpbmUgQnVpbGRlciBDb250cmlidXRvcnNcbi8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wXG5cbmltcG9ydCB7IGNyZWF0ZUxvZ2dlciwgY3JlYXRlRW52UmVkaXNDbGllbnQgfSBmcm9tICdAcGlwZWxpbmUtYnVpbGRlci9hcGktY29yZSc7XG5cbmNvbnN0IGxvZ2dlciA9IGNyZWF0ZUxvZ2dlcignc3NlLXRpY2tldC1zdG9yZScpO1xuXG4vKiogQSBtaW50ZWQgdGlja2V0J3MgYm91bmQgaWRlbnRpdHk6IG93bmluZyBvcmcgKyBub3JtYWxpemVkIHN0cmVhbSBzdWJqZWN0LiAqL1xuZXhwb3J0IGludGVyZmFjZSBTU0VUaWNrZXRSZWNvcmQge1xuICBvcmdJZDogc3RyaW5nO1xuICAvKiogTm9ybWFsaXplZCAoZGFzaGVzIHN0cmlwcGVkLCBsb3dlcmNhc2VkKSBzdHJlYW0gc3ViamVjdCBpZC4gKi9cbiAgcmVxdWVzdElkOiBzdHJpbmc7XG59XG5cbi8qKlxuICogUGx1Z2dhYmxlIGJhY2tlbmQgZm9yIFNTRSBsb2ctc3RyZWFtIHRpY2tldHMgQU5EIHN0cmVhbS1vd25lcnNoaXAuXG4gKlxuICogVHdvIGNvbmNlcm5zIHNoYXJlIG9uZSBzdG9yZSBiZWNhdXNlIGJvdGggbXVzdCBiZSBjb25zaXN0ZW50IGFjcm9zcyBwb2RzOlxuICogLSAqKlRpY2tldHMqKiDigJQgc2hvcnQtbGl2ZWQsIHNpbmdsZS11c2UsIGJvdW5kIHRvIChvcmcsIHN1YmplY3QpLiBUaGUgZGVmYXVsdFxuICogICBpbi1tZW1vcnkgc3RvcmUgaXMgY29ycmVjdCBvbmx5IHNpbmdsZS1yZXBsaWNhOyB0aGUgUmVkaXMgc3RvcmUgbWFrZXMgdGhlXG4gKiAgIG1pbnQgKG9uZSBwb2QpIC8gcmVkZWVtIChhbm90aGVyIHBvZCkgZXhjaGFuZ2Ugd29yayBiZWhpbmQgYSBsb2FkIGJhbGFuY2VyLlxuICogLSAqKlN0cmVhbSBvd25lcnNoaXAqKiDigJQgd2hpY2ggb3JnIE9XTlMgYSBnaXZlbiBzdHJlYW0gc3ViamVjdC4gVGhlIHN0cmVhbVxuICogICBwcm9kdWNlciAocGxhdGZvcm0sIGEgZGlmZmVyZW50IHNlcnZpY2UpIHJlY29yZHMgdGhpcyBzbyB0aWNrZXQgbWludGluZyBjYW5cbiAqICAgYXNzZXJ0IHRoZSBjYWxsZXIncyBvcmcgb3ducyB0aGUgc3ViamVjdCwgY2xvc2luZyB0aGUgY3Jvc3MtdGVuYW50IGF0dGFjaFxuICogICBnYXAgd2hlcmUgYW55IG9yZyBjb3VsZCBtaW50IGEgdGlja2V0IGZvciBhIGd1ZXNzZWQgcmVxdWVzdElkLlxuICpcbiAqIEFsbCBtZXRob2RzIGFyZSBhc3luYyAoUmVkaXMgaXMgYXN5bmMpIGFuZCBiZXN0LWVmZm9ydCBvbiB0aGUgZmFpbHVyZSBzaWRlIHBlclxuICogdGhlaXIgZG9jIOKAlCBhIHN0b3JlIG91dGFnZSBtdXN0IGRlZ3JhZGUgZ3JhY2VmdWxseSwgbmV2ZXIgY3Jhc2ggdGhlIHN0cmVhbS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTU0VUaWNrZXRTdG9yZSB7XG4gIC8qKiBQZXJzaXN0IGEgc2luZ2xlLXVzZSB0aWNrZXQgYm91bmQgdG8gYHJlY29yZGAsIGV4cGlyaW5nIGFmdGVyIGB0dGxNc2AuICovXG4gIHB1dCh0aWNrZXRJZDogc3RyaW5nLCByZWNvcmQ6IFNTRVRpY2tldFJlY29yZCwgdHRsTXM6IG51bWJlcik6IFByb21pc2U8dm9pZD47XG4gIC8qKiBBdG9taWNhbGx5IGZldGNoLWFuZC1kZWxldGUgYSB0aWNrZXQgKHNpbmdsZS11c2UpLiBOdWxsIGlmIGFic2VudC9leHBpcmVkLiAqL1xuICBjb25zdW1lKHRpY2tldElkOiBzdHJpbmcpOiBQcm9taXNlPFNTRVRpY2tldFJlY29yZCB8IG51bGw+O1xuICAvKiogQ291bnQgb2YgbGl2ZSAodW5leHBpcmVkKSB0aWNrZXRzIGhlbGQgZm9yIGFuIG9yZyAocGVyLW9yZyBjYXApLiAqL1xuICBjb3VudEZvck9yZyhvcmdJZDogc3RyaW5nKTogUHJvbWlzZTxudW1iZXI+O1xuICAvKiogQ291bnQgb2YgYWxsIGxpdmUgdGlja2V0cyBhY3Jvc3MgdGhlIHN0b3JlIChjYXBhY2l0eSBjYXApLiAqL1xuICB0b3RhbCgpOiBQcm9taXNlPG51bWJlcj47XG4gIC8qKiBSZWNvcmQgdGhlIG9yZyB0aGF0IE9XTlMgYSBzdHJlYW0gc3ViamVjdCAocHJvZHVjZXItc2lkZSksIFRUTCBgdHRsTXNgLiAqL1xuICBiaW5kU3RyZWFtT3duZXIocmVxdWVzdElkOiBzdHJpbmcsIG9yZ0lkOiBzdHJpbmcsIHR0bE1zOiBudW1iZXIpOiBQcm9taXNlPHZvaWQ+O1xuICAvKiogVGhlIG93bmluZyBvcmcgb2YgYSBzdHJlYW0gc3ViamVjdCwgb3IgbnVsbCB3aGVuIG5vbmUgaXMgYm91bmQuICovXG4gIGdldFN0cmVhbU93bmVyKHJlcXVlc3RJZDogc3RyaW5nKTogUHJvbWlzZTxzdHJpbmcgfCBudWxsPjtcbiAgLyoqIE9wdGlvbmFsIGh5Z2llbmUgc3dlZXAgb2YgZXhwaXJlZCBlbnRyaWVzIChSZWRpcyBUVEwgbWFrZXMgdGhpcyBhIG5vLW9wKS4gKi9cbiAgc3dlZXA/KCk6IFByb21pc2U8dm9pZD47XG59XG5cbmludGVyZmFjZSBTdG9yZWRUaWNrZXQgZXh0ZW5kcyBTU0VUaWNrZXRSZWNvcmQge1xuICBleHBpcmVzQXQ6IG51bWJlcjtcbn1cblxuaW50ZXJmYWNlIFN0b3JlZE93bmVyIHtcbiAgb3JnSWQ6IHN0cmluZztcbiAgZXhwaXJlc0F0OiBudW1iZXI7XG59XG5cbi8qKlxuICogSW4tbWVtb3J5IHRpY2tldCBzdG9yZSDigJQgdGhlIGRlZmF1bHQuIENvcnJlY3QgZm9yIGEgc2luZ2xlIHJlcGxpY2Egb25seTtcbiAqIG1pcnJvcnMgdGhlIGJlaGF2aW9yIHRoZSBTU0VNYW5hZ2VyIHByZXZpb3VzbHkgaW1wbGVtZW50ZWQgaW5saW5lLlxuICovXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlTWVtb3J5VGlja2V0U3RvcmUoKTogU1NFVGlja2V0U3RvcmUge1xuICBjb25zdCB0aWNrZXRzID0gbmV3IE1hcDxzdHJpbmcsIFN0b3JlZFRpY2tldD4oKTtcbiAgY29uc3Qgb3duZXJzID0gbmV3IE1hcDxzdHJpbmcsIFN0b3JlZE93bmVyPigpO1xuXG4gIHJldHVybiB7XG4gICAgYXN5bmMgcHV0KHRpY2tldElkLCByZWNvcmQsIHR0bE1zKSB7XG4gICAgICB0aWNrZXRzLnNldCh0aWNrZXRJZCwgeyAuLi5yZWNvcmQsIGV4cGlyZXNBdDogRGF0ZS5ub3coKSArIHR0bE1zIH0pO1xuICAgIH0sXG4gICAgYXN5bmMgY29uc3VtZSh0aWNrZXRJZCkge1xuICAgICAgY29uc3QgdCA9IHRpY2tldHMuZ2V0KHRpY2tldElkKTtcbiAgICAgIHRpY2tldHMuZGVsZXRlKHRpY2tldElkKTsgLy8gc2luZ2xlLXVzZSDigJQgcmVtb3ZlIHdoZXRoZXIgb3Igbm90IHZhbGlkXG4gICAgICBpZiAoIXQgfHwgRGF0ZS5ub3coKSA+IHQuZXhwaXJlc0F0KSByZXR1cm4gbnVsbDtcbiAgICAgIHJldHVybiB7IG9yZ0lkOiB0Lm9yZ0lkLCByZXF1ZXN0SWQ6IHQucmVxdWVzdElkIH07XG4gICAgfSxcbiAgICBhc3luYyBjb3VudEZvck9yZyhvcmdJZCkge1xuICAgICAgY29uc3Qgbm93ID0gRGF0ZS5ub3coKTtcbiAgICAgIGxldCBuID0gMDtcbiAgICAgIGZvciAoY29uc3QgdCBvZiB0aWNrZXRzLnZhbHVlcygpKSBpZiAodC5vcmdJZCA9PT0gb3JnSWQgJiYgdC5leHBpcmVzQXQgPiBub3cpIG4rKztcbiAgICAgIHJldHVybiBuO1xuICAgIH0sXG4gICAgYXN5bmMgdG90YWwoKSB7XG4gICAgICBjb25zdCBub3cgPSBEYXRlLm5vdygpO1xuICAgICAgbGV0IG4gPSAwO1xuICAgICAgZm9yIChjb25zdCB0IG9mIHRpY2tldHMudmFsdWVzKCkpIGlmICh0LmV4cGlyZXNBdCA+IG5vdykgbisrO1xuICAgICAgcmV0dXJuIG47XG4gICAgfSxcbiAgICBhc3luYyBiaW5kU3RyZWFtT3duZXIocmVxdWVzdElkLCBvcmdJZCwgdHRsTXMpIHtcbiAgICAgIG93bmVycy5zZXQocmVxdWVzdElkLCB7IG9yZ0lkLCBleHBpcmVzQXQ6IERhdGUubm93KCkgKyB0dGxNcyB9KTtcbiAgICB9LFxuICAgIGFzeW5jIGdldFN0cmVhbU93bmVyKHJlcXVlc3RJZCkge1xuICAgICAgY29uc3QgbyA9IG93bmVycy5nZXQocmVxdWVzdElkKTtcbiAgICAgIGlmICghbykgcmV0dXJuIG51bGw7XG4gICAgICBpZiAoRGF0ZS5ub3coKSA+IG8uZXhwaXJlc0F0KSB7IG93bmVycy5kZWxldGUocmVxdWVzdElkKTsgcmV0dXJuIG51bGw7IH1cbiAgICAgIHJldHVybiBvLm9yZ0lkO1xuICAgIH0sXG4gICAgYXN5bmMgc3dlZXAoKSB7XG4gICAgICBjb25zdCBub3cgPSBEYXRlLm5vdygpO1xuICAgICAgZm9yIChjb25zdCBbaWQsIHRdIG9mIHRpY2tldHMpIGlmIChub3cgPiB0LmV4cGlyZXNBdCkgdGlja2V0cy5kZWxldGUoaWQpO1xuICAgICAgZm9yIChjb25zdCBbaWQsIG9dIG9mIG93bmVycykgaWYgKG5vdyA+IG8uZXhwaXJlc0F0KSBvd25lcnMuZGVsZXRlKGlkKTtcbiAgICB9LFxuICB9O1xufVxuXG4vKipcbiAqIE1pbmltYWwgaW9yZWRpcyBzdXJmYWNlIHRoZSBSZWRpcyB0aWNrZXQgc3RvcmUgbmVlZHMuIGBzZXRgIHRha2VzIHRoZSB2YXJpYWRpY1xuICogb3B0aW9uIHRhaWwgKGBFWCA8cz5gKTsgYHphZGRgL2B6cmVtcmFuZ2VieXNjb3JlYC9gemNhcmRgIGJhY2sgdGhlIGNhcCBjb3VudGVycy5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBSZWRpc1RpY2tldENsaWVudCB7XG4gIGdldChrZXk6IHN0cmluZyk6IFByb21pc2U8c3RyaW5nIHwgbnVsbD47XG4gIHNldChrZXk6IHN0cmluZywgdmFsdWU6IHN0cmluZywgLi4uYXJnczogKHN0cmluZyB8IG51bWJlcilbXSk6IFByb21pc2U8c3RyaW5nIHwgbnVsbD47XG4gIGRlbCguLi5rZXlzOiBzdHJpbmdbXSk6IFByb21pc2U8bnVtYmVyPjtcbiAgemFkZChrZXk6IHN0cmluZywgc2NvcmU6IG51bWJlciwgbWVtYmVyOiBzdHJpbmcpOiBQcm9taXNlPG51bWJlcj47XG4gIHpyZW0oa2V5OiBzdHJpbmcsIC4uLm1lbWJlcnM6IHN0cmluZ1tdKTogUHJvbWlzZTxudW1iZXI+O1xuICB6Y2FyZChrZXk6IHN0cmluZyk6IFByb21pc2U8bnVtYmVyPjtcbiAgenJlbXJhbmdlYnlzY29yZShrZXk6IHN0cmluZywgbWluOiBudW1iZXIgfCBzdHJpbmcsIG1heDogbnVtYmVyIHwgc3RyaW5nKTogUHJvbWlzZTxudW1iZXI+O1xuICBleHBpcmUoa2V5OiBzdHJpbmcsIHNlY29uZHM6IG51bWJlcik6IFByb21pc2U8bnVtYmVyPjtcbn1cblxuY29uc3QgVElDS0VUX1BSRUZJWCA9ICdzc2U6dGt0Oic7XG5jb25zdCBPUkdfWlNFVF9QUkVGSVggPSAnc3NlOnRrdDpvcmc6JztcbmNvbnN0IEFMTF9aU0VUID0gJ3NzZTp0a3Q6YWxsJztcbmNvbnN0IE9XTkVSX1BSRUZJWCA9ICdzc2U6b3duZXI6JztcblxuLyoqXG4gKiBSZWRpcy1iYWNrZWQgdGlja2V0IHN0b3JlIOKAlCByZXF1aXJlZCBmb3IgbXVsdGktcG9kIGNvcnJlY3RuZXNzLiBUaWNrZXRzIGFyZVxuICogcGVyLWtleSB3aXRoIG5hdGl2ZSBUVEw7IGNhcCBjb3VudGVycyBhcmUgWlNFVHMgc2NvcmVkIGJ5IGV4cGlyeSAocHJ1bmVkIG9uXG4gKiByZWFkKS4gU3RyZWFtIG93bmVyc2hpcCBpcyBhIHBlci1zdWJqZWN0IGtleSB3aXRoIGl0cyBvd24gVFRMLiBBbGwgcmVhZHMgYXJlXG4gKiBmYWlsLXNhZmUgKG51bGwgLyAwKSBzbyBhIFJlZGlzIGJsaXAgbmV2ZXIgd2VkZ2VzIHRoZSBzdHJlYW0uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVSZWRpc1RpY2tldFN0b3JlKHJlZGlzOiBSZWRpc1RpY2tldENsaWVudCk6IFNTRVRpY2tldFN0b3JlIHtcbiAgY29uc3QgdGtleSA9IChpZDogc3RyaW5nKTogc3RyaW5nID0+IGAke1RJQ0tFVF9QUkVGSVh9JHtpZH1gO1xuICBjb25zdCBvcmdLZXkgPSAob3JnSWQ6IHN0cmluZyk6IHN0cmluZyA9PiBgJHtPUkdfWlNFVF9QUkVGSVh9JHtvcmdJZH1gO1xuICBjb25zdCBvd25lcktleSA9IChyZXF1ZXN0SWQ6IHN0cmluZyk6IHN0cmluZyA9PiBgJHtPV05FUl9QUkVGSVh9JHtyZXF1ZXN0SWR9YDtcbiAgY29uc3QgdHRsU2VjID0gKHR0bE1zOiBudW1iZXIpOiBudW1iZXIgPT4gTWF0aC5tYXgoMSwgTWF0aC5jZWlsKHR0bE1zIC8gMTAwMCkpO1xuXG4gIHJldHVybiB7XG4gICAgYXN5bmMgcHV0KHRpY2tldElkLCByZWNvcmQsIHR0bE1zKSB7XG4gICAgICBjb25zdCBleHBpcmVzQXQgPSBEYXRlLm5vdygpICsgdHRsTXM7XG4gICAgICBjb25zdCBzZWMgPSB0dGxTZWModHRsTXMpO1xuICAgICAgdHJ5IHtcbiAgICAgICAgYXdhaXQgcmVkaXMuc2V0KHRrZXkodGlja2V0SWQpLCBKU09OLnN0cmluZ2lmeShyZWNvcmQpLCAnRVgnLCBzZWMpO1xuICAgICAgICAvLyBUcmFjayBmb3IgdGhlIGNhcHMuIFNjb3JlID0gZXhwaXJ5IHNvIHBydW5pbmcgaXMgYSByYW5nZSBkZWxldGUuXG4gICAgICAgIGF3YWl0IHJlZGlzLnphZGQob3JnS2V5KHJlY29yZC5vcmdJZCksIGV4cGlyZXNBdCwgdGlja2V0SWQpO1xuICAgICAgICBhd2FpdCByZWRpcy56YWRkKEFMTF9aU0VULCBleHBpcmVzQXQsIHRpY2tldElkKTtcbiAgICAgICAgLy8gQm91bmQgdGhlIHBlci1vcmcgWlNFVCdzIG93biBsaWZldGltZSBzbyBhbiBpZGxlIG9yZydzIGtleSBjYW4ndCBsZWFrLlxuICAgICAgICBhd2FpdCByZWRpcy5leHBpcmUob3JnS2V5KHJlY29yZC5vcmdJZCksIHNlYyk7XG4gICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgbG9nZ2VyLndhcm4oJ1NTRSB0aWNrZXQgcHV0IGZhaWxlZCcsIHsgZXJyb3I6IGVyciBpbnN0YW5jZW9mIEVycm9yID8gZXJyLm1lc3NhZ2UgOiBTdHJpbmcoZXJyKSB9KTtcbiAgICAgIH1cbiAgICB9LFxuICAgIGFzeW5jIGNvbnN1bWUodGlja2V0SWQpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHJhdyA9IGF3YWl0IHJlZGlzLmdldCh0a2V5KHRpY2tldElkKSk7XG4gICAgICAgIC8vIFNpbmdsZS11c2U6IGRlbGV0ZSByZWdhcmRsZXNzLiBBIGNvbmN1cnJlbnQgZG91YmxlLXJlZGVlbTogYXQgbW9zdCBvbmVcbiAgICAgICAgLy8gc2F3IGEgbm9uLW51bGwgdmFsdWUgYmVmb3JlIHRoZSBkZWxldGU7IHRoZSBaUkVNIGNsZWFucyB0aGUgY291bnRlcnMuXG4gICAgICAgIGF3YWl0IHJlZGlzLmRlbCh0a2V5KHRpY2tldElkKSk7XG4gICAgICAgIGlmICghcmF3KSByZXR1cm4gbnVsbDtcbiAgICAgICAgY29uc3QgcmVjID0gSlNPTi5wYXJzZShyYXcpIGFzIFNTRVRpY2tldFJlY29yZDtcbiAgICAgICAgYXdhaXQgcmVkaXMuenJlbShvcmdLZXkocmVjLm9yZ0lkKSwgdGlja2V0SWQpO1xuICAgICAgICBhd2FpdCByZWRpcy56cmVtKEFMTF9aU0VULCB0aWNrZXRJZCk7XG4gICAgICAgIHJldHVybiByZWM7XG4gICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgbG9nZ2VyLndhcm4oJ1NTRSB0aWNrZXQgY29uc3VtZSBmYWlsZWQnLCB7IGVycm9yOiBlcnIgaW5zdGFuY2VvZiBFcnJvciA/IGVyci5tZXNzYWdlIDogU3RyaW5nKGVycikgfSk7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfVxuICAgIH0sXG4gICAgYXN5bmMgY291bnRGb3JPcmcob3JnSWQpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGF3YWl0IHJlZGlzLnpyZW1yYW5nZWJ5c2NvcmUob3JnS2V5KG9yZ0lkKSwgMCwgRGF0ZS5ub3coKSk7XG4gICAgICAgIHJldHVybiBhd2FpdCByZWRpcy56Y2FyZChvcmdLZXkob3JnSWQpKTtcbiAgICAgIH0gY2F0Y2ggeyByZXR1cm4gMDsgfVxuICAgIH0sXG4gICAgYXN5bmMgdG90YWwoKSB7XG4gICAgICB0cnkge1xuICAgICAgICBhd2FpdCByZWRpcy56cmVtcmFuZ2VieXNjb3JlKEFMTF9aU0VULCAwLCBEYXRlLm5vdygpKTtcbiAgICAgICAgcmV0dXJuIGF3YWl0IHJlZGlzLnpjYXJkKEFMTF9aU0VUKTtcbiAgICAgIH0gY2F0Y2ggeyByZXR1cm4gMDsgfVxuICAgIH0sXG4gICAgYXN5bmMgYmluZFN0cmVhbU93bmVyKHJlcXVlc3RJZCwgb3JnSWQsIHR0bE1zKSB7XG4gICAgICB0cnkge1xuICAgICAgICBhd2FpdCByZWRpcy5zZXQob3duZXJLZXkocmVxdWVzdElkKSwgb3JnSWQsICdFWCcsIHR0bFNlYyh0dGxNcykpO1xuICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgIGxvZ2dlci53YXJuKCdTU0Ugc3RyZWFtLW93bmVyIGJpbmQgZmFpbGVkJywgeyBlcnJvcjogZXJyIGluc3RhbmNlb2YgRXJyb3IgPyBlcnIubWVzc2FnZSA6IFN0cmluZyhlcnIpIH0pO1xuICAgICAgfVxuICAgIH0sXG4gICAgYXN5bmMgZ2V0U3RyZWFtT3duZXIocmVxdWVzdElkKSB7XG4gICAgICB0cnkge1xuICAgICAgICByZXR1cm4gYXdhaXQgcmVkaXMuZ2V0KG93bmVyS2V5KHJlcXVlc3RJZCkpO1xuICAgICAgfSBjYXRjaCB7IHJldHVybiBudWxsOyB9XG4gICAgfSxcbiAgfTtcbn1cblxuLyoqXG4gKiBCdWlsZCBhIFJlZGlzLWJhY2tlZCB0aWNrZXQgc3RvcmUgZnJvbSB0aGUgc2hhcmVkIGVudiBSZWRpcyAoc2FtZSB3aXJpbmcgYXNcbiAqIHRoZSByYXRlLWxpbWl0ZXIgLyBhdWRpdC1zcG9vbCkuIFJldHVybnMgbnVsbCB3aGVuIFJlZGlzIGlzbid0IGNvbmZpZ3VyZWQgc29cbiAqIHRoZSBjYWxsZXIga2VlcHMgdGhlIGluLW1lbW9yeSBkZWZhdWx0LiBOZXZlciB0aHJvd3MuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVFbnZSZWRpc1RpY2tldFN0b3JlKCk6IFNTRVRpY2tldFN0b3JlIHwgbnVsbCB7XG4gIGNvbnN0IGNsaWVudCA9IGNyZWF0ZUVudlJlZGlzQ2xpZW50PFJlZGlzVGlja2V0Q2xpZW50Pignc3NlLXRpY2tldCcpO1xuICBpZiAoIWNsaWVudCkgcmV0dXJuIG51bGw7XG4gIGxvZ2dlci5pbmZvKCdSZWRpcyBTU0UgdGlja2V0IHN0b3JlIGluaXRpYWxpemVkJyk7XG4gIHJldHVybiBjcmVhdGVSZWRpc1RpY2tldFN0b3JlKGNsaWVudCk7XG59XG4iXX0=
|
|
160
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3NlLXRpY2tldC1zdG9yZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9odHRwL3NzZS10aWNrZXQtc3RvcmUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsK0NBQStDO0FBQy9DLHNDQUFzQztBQUV0QyxPQUFPLEVBQUUsWUFBWSxFQUFFLG9CQUFvQixFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFFaEYsTUFBTSxNQUFNLEdBQUcsWUFBWSxDQUFDLGtCQUFrQixDQUFDLENBQUM7QUF3RGhEOzs7R0FHRztBQUNILE1BQU0sVUFBVSx1QkFBdUI7SUFDckMsTUFBTSxPQUFPLEdBQUcsSUFBSSxHQUFHLEVBQXdCLENBQUM7SUFDaEQsTUFBTSxNQUFNLEdBQUcsSUFBSSxHQUFHLEVBQXVCLENBQUM7SUFFOUMsT0FBTztRQUNMLEtBQUssQ0FBQyxHQUFHLENBQUMsUUFBUSxFQUFFLE1BQU0sRUFBRSxLQUFLO1lBQy9CLE9BQU8sQ0FBQyxHQUFHLENBQUMsUUFBUSxFQUFFLEVBQUUsR0FBRyxNQUFNLEVBQUUsU0FBUyxFQUFFLElBQUksQ0FBQyxHQUFHLEVBQUUsR0FBRyxLQUFLLEVBQUUsQ0FBQyxDQUFDO1FBQ3RFLENBQUM7UUFDRCxLQUFLLENBQUMsT0FBTyxDQUFDLFFBQVE7WUFDcEIsTUFBTSxDQUFDLEdBQUcsT0FBTyxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUMsQ0FBQztZQUNoQyxPQUFPLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsMkNBQTJDO1lBQ3JFLElBQUksQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLEdBQUcsRUFBRSxHQUFHLENBQUMsQ0FBQyxTQUFTO2dCQUFFLE9BQU8sSUFBSSxDQUFDO1lBQ2hELE9BQU8sRUFBRSxLQUFLLEVBQUUsQ0FBQyxDQUFDLEtBQUssRUFBRSxTQUFTLEVBQUUsQ0FBQyxDQUFDLFNBQVMsRUFBRSxDQUFDO1FBQ3BELENBQUM7UUFDRCxLQUFLLENBQUMsV0FBVyxDQUFDLEtBQUs7WUFDckIsTUFBTSxHQUFHLEdBQUcsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDO1lBQ3ZCLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUNWLEtBQUssTUFBTSxDQUFDLElBQUksT0FBTyxDQUFDLE1BQU0sRUFBRTtnQkFBRSxJQUFJLENBQUMsQ0FBQyxLQUFLLEtBQUssS0FBSyxJQUFJLENBQUMsQ0FBQyxTQUFTLEdBQUcsR0FBRztvQkFBRSxDQUFDLEVBQUUsQ0FBQztZQUNsRixPQUFPLENBQUMsQ0FBQztRQUNYLENBQUM7UUFDRCxLQUFLLENBQUMsS0FBSztZQUNULE1BQU0sR0FBRyxHQUFHLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQztZQUN2QixJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7WUFDVixLQUFLLE1BQU0sQ0FBQyxJQUFJLE9BQU8sQ0FBQyxNQUFNLEVBQUU7Z0JBQUUsSUFBSSxDQUFDLENBQUMsU0FBUyxHQUFHLEdBQUc7b0JBQUUsQ0FBQyxFQUFFLENBQUM7WUFDN0QsT0FBTyxDQUFDLENBQUM7UUFDWCxDQUFDO1FBQ0QsS0FBSyxDQUFDLGVBQWUsQ0FBQyxTQUFTLEVBQUUsS0FBSyxFQUFFLEtBQUs7WUFDM0MsTUFBTSxDQUFDLEdBQUcsQ0FBQyxTQUFTLEVBQUUsRUFBRSxLQUFLLEVBQUUsU0FBUyxFQUFFLElBQUksQ0FBQyxHQUFHLEVBQUUsR0FBRyxLQUFLLEVBQUUsQ0FBQyxDQUFDO1FBQ2xFLENBQUM7UUFDRCxLQUFLLENBQUMsY0FBYyxDQUFDLFNBQVM7WUFDNUIsTUFBTSxDQUFDLEdBQUcsTUFBTSxDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQUMsQ0FBQztZQUNoQyxJQUFJLENBQUMsQ0FBQztnQkFBRSxPQUFPLElBQUksQ0FBQztZQUNwQixJQUFJLElBQUksQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDLENBQUMsU0FBUyxFQUFFLENBQUM7Z0JBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsQ0FBQztnQkFBQyxPQUFPLElBQUksQ0FBQztZQUFDLENBQUM7WUFDeEUsT0FBTyxDQUFDLENBQUMsS0FBSyxDQUFDO1FBQ2pCLENBQUM7UUFDRCxLQUFLLENBQUMsS0FBSztZQUNULE1BQU0sR0FBRyxHQUFHLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQztZQUN2QixLQUFLLE1BQU0sQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLElBQUksT0FBTztnQkFBRSxJQUFJLEdBQUcsR0FBRyxDQUFDLENBQUMsU0FBUztvQkFBRSxPQUFPLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1lBQ3pFLEtBQUssTUFBTSxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsSUFBSSxNQUFNO2dCQUFFLElBQUksR0FBRyxHQUFHLENBQUMsQ0FBQyxTQUFTO29CQUFFLE1BQU0sQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDekUsQ0FBQztLQUNGLENBQUM7QUFDSixDQUFDO0FBaUJELE1BQU0sYUFBYSxHQUFHLFVBQVUsQ0FBQztBQUNqQyxNQUFNLGVBQWUsR0FBRyxjQUFjLENBQUM7QUFDdkMsTUFBTSxRQUFRLEdBQUcsYUFBYSxDQUFDO0FBQy9CLE1BQU0sWUFBWSxHQUFHLFlBQVksQ0FBQztBQUVsQzs7Ozs7R0FLRztBQUNILE1BQU0sVUFBVSxzQkFBc0IsQ0FBQyxLQUF3QjtJQUM3RCxNQUFNLElBQUksR0FBRyxDQUFDLEVBQVUsRUFBVSxFQUFFLENBQUMsR0FBRyxhQUFhLEdBQUcsRUFBRSxFQUFFLENBQUM7SUFDN0QsTUFBTSxNQUFNLEdBQUcsQ0FBQyxLQUFhLEVBQVUsRUFBRSxDQUFDLEdBQUcsZUFBZSxHQUFHLEtBQUssRUFBRSxDQUFDO0lBQ3ZFLE1BQU0sUUFBUSxHQUFHLENBQUMsU0FBaUIsRUFBVSxFQUFFLENBQUMsR0FBRyxZQUFZLEdBQUcsU0FBUyxFQUFFLENBQUM7SUFDOUUsTUFBTSxNQUFNLEdBQUcsQ0FBQyxLQUFhLEVBQVUsRUFBRSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQyxDQUFDLENBQUM7SUFFL0UsT0FBTztRQUNMLEtBQUssQ0FBQyxHQUFHLENBQUMsUUFBUSxFQUFFLE1BQU0sRUFBRSxLQUFLO1lBQy9CLE1BQU0sU0FBUyxHQUFHLElBQUksQ0FBQyxHQUFHLEVBQUUsR0FBRyxLQUFLLENBQUM7WUFDckMsTUFBTSxHQUFHLEdBQUcsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQzFCLElBQUksQ0FBQztnQkFDSCxNQUFNLEtBQUssQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxFQUFFLElBQUksQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLEVBQUUsSUFBSSxFQUFFLEdBQUcsQ0FBQyxDQUFDO2dCQUNuRSxtRUFBbUU7Z0JBQ25FLE1BQU0sS0FBSyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxFQUFFLFNBQVMsRUFBRSxRQUFRLENBQUMsQ0FBQztnQkFDNUQsTUFBTSxLQUFLLENBQUMsSUFBSSxDQUFDLFFBQVEsRUFBRSxTQUFTLEVBQUUsUUFBUSxDQUFDLENBQUM7Z0JBQ2hELHlFQUF5RTtnQkFDekUsTUFBTSxLQUFLLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUM7WUFDaEQsQ0FBQztZQUFDLE9BQU8sR0FBRyxFQUFFLENBQUM7Z0JBQ2IsTUFBTSxDQUFDLElBQUksQ0FBQyx1QkFBdUIsRUFBRSxFQUFFLEtBQUssRUFBRSxHQUFHLFlBQVksS0FBSyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1lBQ3BHLENBQUM7UUFDSCxDQUFDO1FBQ0QsS0FBSyxDQUFDLE9BQU8sQ0FBQyxRQUFRO1lBQ3BCLElBQUksQ0FBQztnQkFDSCxNQUFNLEdBQUcsR0FBRyxNQUFNLEtBQUssQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUM7Z0JBQzVDLHlFQUF5RTtnQkFDekUsd0VBQXdFO2dCQUN4RSxNQUFNLEtBQUssQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUM7Z0JBQ2hDLElBQUksQ0FBQyxHQUFHO29CQUFFLE9BQU8sSUFBSSxDQUFDO2dCQUN0QixNQUFNLEdBQUcsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBMEIsQ0FBQztnQkFDckQsTUFBTSxLQUFLLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLEVBQUUsUUFBUSxDQUFDLENBQUM7Z0JBQzlDLE1BQU0sS0FBSyxDQUFDLElBQUksQ0FBQyxRQUFRLEVBQUUsUUFBUSxDQUFDLENBQUM7Z0JBQ3JDLE9BQU8sR0FBRyxDQUFDO1lBQ2IsQ0FBQztZQUFDLE9BQU8sR0FBRyxFQUFFLENBQUM7Z0JBQ2IsTUFBTSxDQUFDLElBQUksQ0FBQywyQkFBMkIsRUFBRSxFQUFFLEtBQUssRUFBRSxHQUFHLFlBQVksS0FBSyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDO2dCQUN0RyxPQUFPLElBQUksQ0FBQztZQUNkLENBQUM7UUFDSCxDQUFDO1FBQ0QsS0FBSyxDQUFDLFdBQVcsQ0FBQyxLQUFLO1lBQ3JCLElBQUksQ0FBQztnQkFDSCxNQUFNLEtBQUssQ0FBQyxnQkFBZ0IsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxFQUFFLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDO2dCQUMzRCxPQUFPLE1BQU0sS0FBSyxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQztZQUMxQyxDQUFDO1lBQUMsTUFBTSxDQUFDO2dCQUFDLE9BQU8sQ0FBQyxDQUFDO1lBQUMsQ0FBQztRQUN2QixDQUFDO1FBQ0QsS0FBSyxDQUFDLEtBQUs7WUFDVCxJQUFJLENBQUM7Z0JBQ0gsTUFBTSxLQUFLLENBQUMsZ0JBQWdCLENBQUMsUUFBUSxFQUFFLENBQUMsRUFBRSxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQztnQkFDdEQsT0FBTyxNQUFNLEtBQUssQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLENBQUM7WUFDckMsQ0FBQztZQUFDLE1BQU0sQ0FBQztnQkFBQyxPQUFPLENBQUMsQ0FBQztZQUFDLENBQUM7UUFDdkIsQ0FBQztRQUNELEtBQUssQ0FBQyxlQUFlLENBQUMsU0FBUyxFQUFFLEtBQUssRUFBRSxLQUFLO1lBQzNDLElBQUksQ0FBQztnQkFDSCxNQUFNLEtBQUssQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUUsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7WUFDbkUsQ0FBQztZQUFDLE9BQU8sR0FBRyxFQUFFLENBQUM7Z0JBQ2IsTUFBTSxDQUFDLElBQUksQ0FBQyw4QkFBOEIsRUFBRSxFQUFFLEtBQUssRUFBRSxHQUFHLFlBQVksS0FBSyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1lBQzNHLENBQUM7UUFDSCxDQUFDO1FBQ0QsS0FBSyxDQUFDLGNBQWMsQ0FBQyxTQUFTO1lBQzVCLElBQUksQ0FBQztnQkFDSCxPQUFPLE1BQU0sS0FBSyxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQztZQUM5QyxDQUFDO1lBQUMsTUFBTSxDQUFDO2dCQUFDLE9BQU8sSUFBSSxDQUFDO1lBQUMsQ0FBQztRQUMxQixDQUFDO0tBQ0YsQ0FBQztBQUNKLENBQUM7QUFFRDs7OztHQUlHO0FBQ0gsTUFBTSxVQUFVLHlCQUF5QjtJQUN2QyxNQUFNLE1BQU0sR0FBRyxvQkFBb0IsQ0FBb0IsWUFBWSxDQUFDLENBQUM7SUFDckUsSUFBSSxDQUFDLE1BQU07UUFBRSxPQUFPLElBQUksQ0FBQztJQUN6QixNQUFNLENBQUMsSUFBSSxDQUFDLG9DQUFvQyxDQUFDLENBQUM7SUFDbEQsT0FBTyxzQkFBc0IsQ0FBQyxNQUFNLENBQUMsQ0FBQztBQUN4QyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQ29weXJpZ2h0IDIwMjYgUGlwZWxpbmUgQnVpbGRlciBDb250cmlidXRvcnNcbi8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wXG5cbmltcG9ydCB7IGNyZWF0ZUxvZ2dlciwgY3JlYXRlRW52UmVkaXNDbGllbnQgfSBmcm9tICdAcGlwZWxpbmUtYnVpbGRlci9hcGktY29yZSc7XG5cbmNvbnN0IGxvZ2dlciA9IGNyZWF0ZUxvZ2dlcignc3NlLXRpY2tldC1zdG9yZScpO1xuXG4vKiogQSBtaW50ZWQgdGlja2V0J3MgYm91bmQgaWRlbnRpdHk6IG93bmluZyBvcmcgKyBub3JtYWxpemVkIHN0cmVhbSBzdWJqZWN0LiAqL1xuZXhwb3J0IGludGVyZmFjZSBTU0VTdHJlYW1UaWNrZXRSZWNvcmQge1xuICBvcmdJZDogc3RyaW5nO1xuICAvKiogTm9ybWFsaXplZCAoZGFzaGVzIHN0cmlwcGVkLCBsb3dlcmNhc2VkKSBzdHJlYW0gc3ViamVjdCBpZC4gKi9cbiAgcmVxdWVzdElkOiBzdHJpbmc7XG59XG5cbi8qKlxuICogUGx1Z2dhYmxlIGJhY2tlbmQgZm9yIFNTRSBsb2ctc3RyZWFtIHRpY2tldHMgQU5EIHN0cmVhbS1vd25lcnNoaXAuXG4gKlxuICogTk9URTogZGlzdGluY3QgZnJvbSBhcGktY29yZSdzIGBTc2VUaWNrZXRTdG9yZWAgKHNlcnZpY2VzL3NzZS10aWNrZXQtc3RvcmUudHMpLFxuICogd2hpY2ggaXMgdGhlIG1lc3NhZ2Utc2VydmljZSB0aWNrZXQgc3RvcmUgKGlzc3VlICsgYWJ1c2UgY291bnRlcnMpLiBUaGlzIG9uZVxuICogKGFwaS1zZXJ2ZXIpIGFkZGl0aW9uYWxseSB0cmFja3Mgc3RyZWFtIG93bmVyc2hpcC4gVGhlIG5hbWVzIGRlbGliZXJhdGVseSBkaWZmZXJcbiAqIChgU1NFU3RyZWFtVGlja2V0U3RvcmVgIGhlcmUgdnMgYFNzZVRpY2tldFN0b3JlYCB0aGVyZSkgc28gY29uc3VtZXJzIGRvbid0IHBpY2tcbiAqIHRoZSB3cm9uZyBvbmUuXG4gKlxuICogVHdvIGNvbmNlcm5zIHNoYXJlIG9uZSBzdG9yZSBiZWNhdXNlIGJvdGggbXVzdCBiZSBjb25zaXN0ZW50IGFjcm9zcyBwb2RzOlxuICogLSAqKlRpY2tldHMqKiDigJQgc2hvcnQtbGl2ZWQsIHNpbmdsZS11c2UsIGJvdW5kIHRvIChvcmcsIHN1YmplY3QpLiBUaGUgZGVmYXVsdFxuICogICBpbi1tZW1vcnkgc3RvcmUgaXMgY29ycmVjdCBvbmx5IHNpbmdsZS1yZXBsaWNhOyB0aGUgUmVkaXMgc3RvcmUgbWFrZXMgdGhlXG4gKiAgIG1pbnQgKG9uZSBwb2QpIC8gcmVkZWVtIChhbm90aGVyIHBvZCkgZXhjaGFuZ2Ugd29yayBiZWhpbmQgYSBsb2FkIGJhbGFuY2VyLlxuICogLSAqKlN0cmVhbSBvd25lcnNoaXAqKiDigJQgd2hpY2ggb3JnIE9XTlMgYSBnaXZlbiBzdHJlYW0gc3ViamVjdC4gVGhlIHN0cmVhbVxuICogICBwcm9kdWNlciAocGxhdGZvcm0sIGEgZGlmZmVyZW50IHNlcnZpY2UpIHJlY29yZHMgdGhpcyBzbyB0aWNrZXQgbWludGluZyBjYW5cbiAqICAgYXNzZXJ0IHRoZSBjYWxsZXIncyBvcmcgb3ducyB0aGUgc3ViamVjdCwgY2xvc2luZyB0aGUgY3Jvc3MtdGVuYW50IGF0dGFjaFxuICogICBnYXAgd2hlcmUgYW55IG9yZyBjb3VsZCBtaW50IGEgdGlja2V0IGZvciBhIGd1ZXNzZWQgcmVxdWVzdElkLlxuICpcbiAqIEFsbCBtZXRob2RzIGFyZSBhc3luYyAoUmVkaXMgaXMgYXN5bmMpIGFuZCBiZXN0LWVmZm9ydCBvbiB0aGUgZmFpbHVyZSBzaWRlIHBlclxuICogdGhlaXIgZG9jIOKAlCBhIHN0b3JlIG91dGFnZSBtdXN0IGRlZ3JhZGUgZ3JhY2VmdWxseSwgbmV2ZXIgY3Jhc2ggdGhlIHN0cmVhbS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTU0VTdHJlYW1UaWNrZXRTdG9yZSB7XG4gIC8qKiBQZXJzaXN0IGEgc2luZ2xlLXVzZSB0aWNrZXQgYm91bmQgdG8gYHJlY29yZGAsIGV4cGlyaW5nIGFmdGVyIGB0dGxNc2AuICovXG4gIHB1dCh0aWNrZXRJZDogc3RyaW5nLCByZWNvcmQ6IFNTRVN0cmVhbVRpY2tldFJlY29yZCwgdHRsTXM6IG51bWJlcik6IFByb21pc2U8dm9pZD47XG4gIC8qKiBBdG9taWNhbGx5IGZldGNoLWFuZC1kZWxldGUgYSB0aWNrZXQgKHNpbmdsZS11c2UpLiBOdWxsIGlmIGFic2VudC9leHBpcmVkLiAqL1xuICBjb25zdW1lKHRpY2tldElkOiBzdHJpbmcpOiBQcm9taXNlPFNTRVN0cmVhbVRpY2tldFJlY29yZCB8IG51bGw+O1xuICAvKiogQ291bnQgb2YgbGl2ZSAodW5leHBpcmVkKSB0aWNrZXRzIGhlbGQgZm9yIGFuIG9yZyAocGVyLW9yZyBjYXApLiAqL1xuICBjb3VudEZvck9yZyhvcmdJZDogc3RyaW5nKTogUHJvbWlzZTxudW1iZXI+O1xuICAvKiogQ291bnQgb2YgYWxsIGxpdmUgdGlja2V0cyBhY3Jvc3MgdGhlIHN0b3JlIChjYXBhY2l0eSBjYXApLiAqL1xuICB0b3RhbCgpOiBQcm9taXNlPG51bWJlcj47XG4gIC8qKiBSZWNvcmQgdGhlIG9yZyB0aGF0IE9XTlMgYSBzdHJlYW0gc3ViamVjdCAocHJvZHVjZXItc2lkZSksIFRUTCBgdHRsTXNgLiAqL1xuICBiaW5kU3RyZWFtT3duZXIocmVxdWVzdElkOiBzdHJpbmcsIG9yZ0lkOiBzdHJpbmcsIHR0bE1zOiBudW1iZXIpOiBQcm9taXNlPHZvaWQ+O1xuICAvKiogVGhlIG93bmluZyBvcmcgb2YgYSBzdHJlYW0gc3ViamVjdCwgb3IgbnVsbCB3aGVuIG5vbmUgaXMgYm91bmQuICovXG4gIGdldFN0cmVhbU93bmVyKHJlcXVlc3RJZDogc3RyaW5nKTogUHJvbWlzZTxzdHJpbmcgfCBudWxsPjtcbiAgLyoqIE9wdGlvbmFsIGh5Z2llbmUgc3dlZXAgb2YgZXhwaXJlZCBlbnRyaWVzIChSZWRpcyBUVEwgbWFrZXMgdGhpcyBhIG5vLW9wKS4gKi9cbiAgc3dlZXA/KCk6IFByb21pc2U8dm9pZD47XG59XG5cbmludGVyZmFjZSBTdG9yZWRUaWNrZXQgZXh0ZW5kcyBTU0VTdHJlYW1UaWNrZXRSZWNvcmQge1xuICBleHBpcmVzQXQ6IG51bWJlcjtcbn1cblxuaW50ZXJmYWNlIFN0b3JlZE93bmVyIHtcbiAgb3JnSWQ6IHN0cmluZztcbiAgZXhwaXJlc0F0OiBudW1iZXI7XG59XG5cbi8qKlxuICogSW4tbWVtb3J5IHRpY2tldCBzdG9yZSDigJQgdGhlIGRlZmF1bHQuIENvcnJlY3QgZm9yIGEgc2luZ2xlIHJlcGxpY2Egb25seTtcbiAqIG1pcnJvcnMgdGhlIGJlaGF2aW9yIHRoZSBTU0VNYW5hZ2VyIHByZXZpb3VzbHkgaW1wbGVtZW50ZWQgaW5saW5lLlxuICovXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlTWVtb3J5VGlja2V0U3RvcmUoKTogU1NFU3RyZWFtVGlja2V0U3RvcmUge1xuICBjb25zdCB0aWNrZXRzID0gbmV3IE1hcDxzdHJpbmcsIFN0b3JlZFRpY2tldD4oKTtcbiAgY29uc3Qgb3duZXJzID0gbmV3IE1hcDxzdHJpbmcsIFN0b3JlZE93bmVyPigpO1xuXG4gIHJldHVybiB7XG4gICAgYXN5bmMgcHV0KHRpY2tldElkLCByZWNvcmQsIHR0bE1zKSB7XG4gICAgICB0aWNrZXRzLnNldCh0aWNrZXRJZCwgeyAuLi5yZWNvcmQsIGV4cGlyZXNBdDogRGF0ZS5ub3coKSArIHR0bE1zIH0pO1xuICAgIH0sXG4gICAgYXN5bmMgY29uc3VtZSh0aWNrZXRJZCkge1xuICAgICAgY29uc3QgdCA9IHRpY2tldHMuZ2V0KHRpY2tldElkKTtcbiAgICAgIHRpY2tldHMuZGVsZXRlKHRpY2tldElkKTsgLy8gc2luZ2xlLXVzZSDigJQgcmVtb3ZlIHdoZXRoZXIgb3Igbm90IHZhbGlkXG4gICAgICBpZiAoIXQgfHwgRGF0ZS5ub3coKSA+IHQuZXhwaXJlc0F0KSByZXR1cm4gbnVsbDtcbiAgICAgIHJldHVybiB7IG9yZ0lkOiB0Lm9yZ0lkLCByZXF1ZXN0SWQ6IHQucmVxdWVzdElkIH07XG4gICAgfSxcbiAgICBhc3luYyBjb3VudEZvck9yZyhvcmdJZCkge1xuICAgICAgY29uc3Qgbm93ID0gRGF0ZS5ub3coKTtcbiAgICAgIGxldCBuID0gMDtcbiAgICAgIGZvciAoY29uc3QgdCBvZiB0aWNrZXRzLnZhbHVlcygpKSBpZiAodC5vcmdJZCA9PT0gb3JnSWQgJiYgdC5leHBpcmVzQXQgPiBub3cpIG4rKztcbiAgICAgIHJldHVybiBuO1xuICAgIH0sXG4gICAgYXN5bmMgdG90YWwoKSB7XG4gICAgICBjb25zdCBub3cgPSBEYXRlLm5vdygpO1xuICAgICAgbGV0IG4gPSAwO1xuICAgICAgZm9yIChjb25zdCB0IG9mIHRpY2tldHMudmFsdWVzKCkpIGlmICh0LmV4cGlyZXNBdCA+IG5vdykgbisrO1xuICAgICAgcmV0dXJuIG47XG4gICAgfSxcbiAgICBhc3luYyBiaW5kU3RyZWFtT3duZXIocmVxdWVzdElkLCBvcmdJZCwgdHRsTXMpIHtcbiAgICAgIG93bmVycy5zZXQocmVxdWVzdElkLCB7IG9yZ0lkLCBleHBpcmVzQXQ6IERhdGUubm93KCkgKyB0dGxNcyB9KTtcbiAgICB9LFxuICAgIGFzeW5jIGdldFN0cmVhbU93bmVyKHJlcXVlc3RJZCkge1xuICAgICAgY29uc3QgbyA9IG93bmVycy5nZXQocmVxdWVzdElkKTtcbiAgICAgIGlmICghbykgcmV0dXJuIG51bGw7XG4gICAgICBpZiAoRGF0ZS5ub3coKSA+IG8uZXhwaXJlc0F0KSB7IG93bmVycy5kZWxldGUocmVxdWVzdElkKTsgcmV0dXJuIG51bGw7IH1cbiAgICAgIHJldHVybiBvLm9yZ0lkO1xuICAgIH0sXG4gICAgYXN5bmMgc3dlZXAoKSB7XG4gICAgICBjb25zdCBub3cgPSBEYXRlLm5vdygpO1xuICAgICAgZm9yIChjb25zdCBbaWQsIHRdIG9mIHRpY2tldHMpIGlmIChub3cgPiB0LmV4cGlyZXNBdCkgdGlja2V0cy5kZWxldGUoaWQpO1xuICAgICAgZm9yIChjb25zdCBbaWQsIG9dIG9mIG93bmVycykgaWYgKG5vdyA+IG8uZXhwaXJlc0F0KSBvd25lcnMuZGVsZXRlKGlkKTtcbiAgICB9LFxuICB9O1xufVxuXG4vKipcbiAqIE1pbmltYWwgaW9yZWRpcyBzdXJmYWNlIHRoZSBSZWRpcyB0aWNrZXQgc3RvcmUgbmVlZHMuIGBzZXRgIHRha2VzIHRoZSB2YXJpYWRpY1xuICogb3B0aW9uIHRhaWwgKGBFWCA8cz5gKTsgYHphZGRgL2B6cmVtcmFuZ2VieXNjb3JlYC9gemNhcmRgIGJhY2sgdGhlIGNhcCBjb3VudGVycy5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBSZWRpc1RpY2tldENsaWVudCB7XG4gIGdldChrZXk6IHN0cmluZyk6IFByb21pc2U8c3RyaW5nIHwgbnVsbD47XG4gIHNldChrZXk6IHN0cmluZywgdmFsdWU6IHN0cmluZywgLi4uYXJnczogKHN0cmluZyB8IG51bWJlcilbXSk6IFByb21pc2U8c3RyaW5nIHwgbnVsbD47XG4gIGRlbCguLi5rZXlzOiBzdHJpbmdbXSk6IFByb21pc2U8bnVtYmVyPjtcbiAgemFkZChrZXk6IHN0cmluZywgc2NvcmU6IG51bWJlciwgbWVtYmVyOiBzdHJpbmcpOiBQcm9taXNlPG51bWJlcj47XG4gIHpyZW0oa2V5OiBzdHJpbmcsIC4uLm1lbWJlcnM6IHN0cmluZ1tdKTogUHJvbWlzZTxudW1iZXI+O1xuICB6Y2FyZChrZXk6IHN0cmluZyk6IFByb21pc2U8bnVtYmVyPjtcbiAgenJlbXJhbmdlYnlzY29yZShrZXk6IHN0cmluZywgbWluOiBudW1iZXIgfCBzdHJpbmcsIG1heDogbnVtYmVyIHwgc3RyaW5nKTogUHJvbWlzZTxudW1iZXI+O1xuICBleHBpcmUoa2V5OiBzdHJpbmcsIHNlY29uZHM6IG51bWJlcik6IFByb21pc2U8bnVtYmVyPjtcbn1cblxuY29uc3QgVElDS0VUX1BSRUZJWCA9ICdzc2U6dGt0Oic7XG5jb25zdCBPUkdfWlNFVF9QUkVGSVggPSAnc3NlOnRrdDpvcmc6JztcbmNvbnN0IEFMTF9aU0VUID0gJ3NzZTp0a3Q6YWxsJztcbmNvbnN0IE9XTkVSX1BSRUZJWCA9ICdzc2U6b3duZXI6JztcblxuLyoqXG4gKiBSZWRpcy1iYWNrZWQgdGlja2V0IHN0b3JlIOKAlCByZXF1aXJlZCBmb3IgbXVsdGktcG9kIGNvcnJlY3RuZXNzLiBUaWNrZXRzIGFyZVxuICogcGVyLWtleSB3aXRoIG5hdGl2ZSBUVEw7IGNhcCBjb3VudGVycyBhcmUgWlNFVHMgc2NvcmVkIGJ5IGV4cGlyeSAocHJ1bmVkIG9uXG4gKiByZWFkKS4gU3RyZWFtIG93bmVyc2hpcCBpcyBhIHBlci1zdWJqZWN0IGtleSB3aXRoIGl0cyBvd24gVFRMLiBBbGwgcmVhZHMgYXJlXG4gKiBmYWlsLXNhZmUgKG51bGwgLyAwKSBzbyBhIFJlZGlzIGJsaXAgbmV2ZXIgd2VkZ2VzIHRoZSBzdHJlYW0uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVSZWRpc1RpY2tldFN0b3JlKHJlZGlzOiBSZWRpc1RpY2tldENsaWVudCk6IFNTRVN0cmVhbVRpY2tldFN0b3JlIHtcbiAgY29uc3QgdGtleSA9IChpZDogc3RyaW5nKTogc3RyaW5nID0+IGAke1RJQ0tFVF9QUkVGSVh9JHtpZH1gO1xuICBjb25zdCBvcmdLZXkgPSAob3JnSWQ6IHN0cmluZyk6IHN0cmluZyA9PiBgJHtPUkdfWlNFVF9QUkVGSVh9JHtvcmdJZH1gO1xuICBjb25zdCBvd25lcktleSA9IChyZXF1ZXN0SWQ6IHN0cmluZyk6IHN0cmluZyA9PiBgJHtPV05FUl9QUkVGSVh9JHtyZXF1ZXN0SWR9YDtcbiAgY29uc3QgdHRsU2VjID0gKHR0bE1zOiBudW1iZXIpOiBudW1iZXIgPT4gTWF0aC5tYXgoMSwgTWF0aC5jZWlsKHR0bE1zIC8gMTAwMCkpO1xuXG4gIHJldHVybiB7XG4gICAgYXN5bmMgcHV0KHRpY2tldElkLCByZWNvcmQsIHR0bE1zKSB7XG4gICAgICBjb25zdCBleHBpcmVzQXQgPSBEYXRlLm5vdygpICsgdHRsTXM7XG4gICAgICBjb25zdCBzZWMgPSB0dGxTZWModHRsTXMpO1xuICAgICAgdHJ5IHtcbiAgICAgICAgYXdhaXQgcmVkaXMuc2V0KHRrZXkodGlja2V0SWQpLCBKU09OLnN0cmluZ2lmeShyZWNvcmQpLCAnRVgnLCBzZWMpO1xuICAgICAgICAvLyBUcmFjayBmb3IgdGhlIGNhcHMuIFNjb3JlID0gZXhwaXJ5IHNvIHBydW5pbmcgaXMgYSByYW5nZSBkZWxldGUuXG4gICAgICAgIGF3YWl0IHJlZGlzLnphZGQob3JnS2V5KHJlY29yZC5vcmdJZCksIGV4cGlyZXNBdCwgdGlja2V0SWQpO1xuICAgICAgICBhd2FpdCByZWRpcy56YWRkKEFMTF9aU0VULCBleHBpcmVzQXQsIHRpY2tldElkKTtcbiAgICAgICAgLy8gQm91bmQgdGhlIHBlci1vcmcgWlNFVCdzIG93biBsaWZldGltZSBzbyBhbiBpZGxlIG9yZydzIGtleSBjYW4ndCBsZWFrLlxuICAgICAgICBhd2FpdCByZWRpcy5leHBpcmUob3JnS2V5KHJlY29yZC5vcmdJZCksIHNlYyk7XG4gICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgbG9nZ2VyLndhcm4oJ1NTRSB0aWNrZXQgcHV0IGZhaWxlZCcsIHsgZXJyb3I6IGVyciBpbnN0YW5jZW9mIEVycm9yID8gZXJyLm1lc3NhZ2UgOiBTdHJpbmcoZXJyKSB9KTtcbiAgICAgIH1cbiAgICB9LFxuICAgIGFzeW5jIGNvbnN1bWUodGlja2V0SWQpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHJhdyA9IGF3YWl0IHJlZGlzLmdldCh0a2V5KHRpY2tldElkKSk7XG4gICAgICAgIC8vIFNpbmdsZS11c2U6IGRlbGV0ZSByZWdhcmRsZXNzLiBBIGNvbmN1cnJlbnQgZG91YmxlLXJlZGVlbTogYXQgbW9zdCBvbmVcbiAgICAgICAgLy8gc2F3IGEgbm9uLW51bGwgdmFsdWUgYmVmb3JlIHRoZSBkZWxldGU7IHRoZSBaUkVNIGNsZWFucyB0aGUgY291bnRlcnMuXG4gICAgICAgIGF3YWl0IHJlZGlzLmRlbCh0a2V5KHRpY2tldElkKSk7XG4gICAgICAgIGlmICghcmF3KSByZXR1cm4gbnVsbDtcbiAgICAgICAgY29uc3QgcmVjID0gSlNPTi5wYXJzZShyYXcpIGFzIFNTRVN0cmVhbVRpY2tldFJlY29yZDtcbiAgICAgICAgYXdhaXQgcmVkaXMuenJlbShvcmdLZXkocmVjLm9yZ0lkKSwgdGlja2V0SWQpO1xuICAgICAgICBhd2FpdCByZWRpcy56cmVtKEFMTF9aU0VULCB0aWNrZXRJZCk7XG4gICAgICAgIHJldHVybiByZWM7XG4gICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgbG9nZ2VyLndhcm4oJ1NTRSB0aWNrZXQgY29uc3VtZSBmYWlsZWQnLCB7IGVycm9yOiBlcnIgaW5zdGFuY2VvZiBFcnJvciA/IGVyci5tZXNzYWdlIDogU3RyaW5nKGVycikgfSk7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfVxuICAgIH0sXG4gICAgYXN5bmMgY291bnRGb3JPcmcob3JnSWQpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGF3YWl0IHJlZGlzLnpyZW1yYW5nZWJ5c2NvcmUob3JnS2V5KG9yZ0lkKSwgMCwgRGF0ZS5ub3coKSk7XG4gICAgICAgIHJldHVybiBhd2FpdCByZWRpcy56Y2FyZChvcmdLZXkob3JnSWQpKTtcbiAgICAgIH0gY2F0Y2ggeyByZXR1cm4gMDsgfVxuICAgIH0sXG4gICAgYXN5bmMgdG90YWwoKSB7XG4gICAgICB0cnkge1xuICAgICAgICBhd2FpdCByZWRpcy56cmVtcmFuZ2VieXNjb3JlKEFMTF9aU0VULCAwLCBEYXRlLm5vdygpKTtcbiAgICAgICAgcmV0dXJuIGF3YWl0IHJlZGlzLnpjYXJkKEFMTF9aU0VUKTtcbiAgICAgIH0gY2F0Y2ggeyByZXR1cm4gMDsgfVxuICAgIH0sXG4gICAgYXN5bmMgYmluZFN0cmVhbU93bmVyKHJlcXVlc3RJZCwgb3JnSWQsIHR0bE1zKSB7XG4gICAgICB0cnkge1xuICAgICAgICBhd2FpdCByZWRpcy5zZXQob3duZXJLZXkocmVxdWVzdElkKSwgb3JnSWQsICdFWCcsIHR0bFNlYyh0dGxNcykpO1xuICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgIGxvZ2dlci53YXJuKCdTU0Ugc3RyZWFtLW93bmVyIGJpbmQgZmFpbGVkJywgeyBlcnJvcjogZXJyIGluc3RhbmNlb2YgRXJyb3IgPyBlcnIubWVzc2FnZSA6IFN0cmluZyhlcnIpIH0pO1xuICAgICAgfVxuICAgIH0sXG4gICAgYXN5bmMgZ2V0U3RyZWFtT3duZXIocmVxdWVzdElkKSB7XG4gICAgICB0cnkge1xuICAgICAgICByZXR1cm4gYXdhaXQgcmVkaXMuZ2V0KG93bmVyS2V5KHJlcXVlc3RJZCkpO1xuICAgICAgfSBjYXRjaCB7IHJldHVybiBudWxsOyB9XG4gICAgfSxcbiAgfTtcbn1cblxuLyoqXG4gKiBCdWlsZCBhIFJlZGlzLWJhY2tlZCB0aWNrZXQgc3RvcmUgZnJvbSB0aGUgc2hhcmVkIGVudiBSZWRpcyAoc2FtZSB3aXJpbmcgYXNcbiAqIHRoZSByYXRlLWxpbWl0ZXIgLyBhdWRpdC1zcG9vbCkuIFJldHVybnMgbnVsbCB3aGVuIFJlZGlzIGlzbid0IGNvbmZpZ3VyZWQgc29cbiAqIHRoZSBjYWxsZXIga2VlcHMgdGhlIGluLW1lbW9yeSBkZWZhdWx0LiBOZXZlciB0aHJvd3MuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVFbnZSZWRpc1RpY2tldFN0b3JlKCk6IFNTRVN0cmVhbVRpY2tldFN0b3JlIHwgbnVsbCB7XG4gIGNvbnN0IGNsaWVudCA9IGNyZWF0ZUVudlJlZGlzQ2xpZW50PFJlZGlzVGlja2V0Q2xpZW50Pignc3NlLXRpY2tldCcpO1xuICBpZiAoIWNsaWVudCkgcmV0dXJuIG51bGw7XG4gIGxvZ2dlci5pbmZvKCdSZWRpcyBTU0UgdGlja2V0IHN0b3JlIGluaXRpYWxpemVkJyk7XG4gIHJldHVybiBjcmVhdGVSZWRpc1RpY2tldFN0b3JlKGNsaWVudCk7XG59XG4iXX0=
|
package/package.json
CHANGED
|
@@ -44,9 +44,9 @@
|
|
|
44
44
|
"rate-limit-redis": "6.0.0",
|
|
45
45
|
"swagger-ui-express": "5.0.1",
|
|
46
46
|
"uuid": "14.0.1",
|
|
47
|
-
"@pipeline-builder/
|
|
48
|
-
"@pipeline-builder/
|
|
49
|
-
"@pipeline-builder/pipeline-data": "3.4.
|
|
47
|
+
"@pipeline-builder/api-core": "3.4.125",
|
|
48
|
+
"@pipeline-builder/pipeline-core": "3.4.145",
|
|
49
|
+
"@pipeline-builder/pipeline-data": "3.4.130"
|
|
50
50
|
},
|
|
51
51
|
"keywords": [
|
|
52
52
|
"ci-cd",
|
|
@@ -102,7 +102,7 @@
|
|
|
102
102
|
"access": "public",
|
|
103
103
|
"registry": "https://registry.npmjs.org/"
|
|
104
104
|
},
|
|
105
|
-
"version": "3.4.
|
|
105
|
+
"version": "3.4.151",
|
|
106
106
|
"bugs": {
|
|
107
107
|
"url": "https://github.com/mwashburn160/pipeline-builder/issues"
|
|
108
108
|
},
|