velocious 1.0.489 → 1.0.492
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/build/application.js +3 -0
- package/build/cli/commands/db/tenants/create.js +7 -5
- package/build/cli/commands/db/tenants/drop.js +6 -6
- package/build/configuration-types.js +8 -0
- package/build/configuration.js +29 -0
- package/build/database/query/index.js +30 -0
- package/build/database/query/model-class-query.js +17 -0
- package/build/database/record/index.js +16 -0
- package/build/src/application.d.ts.map +1 -1
- package/build/src/application.js +3 -1
- package/build/src/cli/commands/db/tenants/create.d.ts.map +1 -1
- package/build/src/cli/commands/db/tenants/create.js +8 -5
- package/build/src/cli/commands/db/tenants/drop.d.ts +1 -1
- package/build/src/cli/commands/db/tenants/drop.d.ts.map +1 -1
- package/build/src/cli/commands/db/tenants/drop.js +7 -6
- package/build/src/configuration-types.d.ts +24 -0
- package/build/src/configuration-types.d.ts.map +1 -1
- package/build/src/configuration-types.js +8 -1
- package/build/src/configuration.d.ts +6 -0
- package/build/src/configuration.d.ts.map +1 -1
- package/build/src/configuration.js +26 -1
- package/build/src/database/query/index.d.ts +25 -0
- package/build/src/database/query/index.d.ts.map +1 -1
- package/build/src/database/query/index.js +26 -1
- package/build/src/database/query/model-class-query.d.ts +10 -0
- package/build/src/database/query/model-class-query.d.ts.map +1 -1
- package/build/src/database/query/model-class-query.js +16 -1
- package/build/src/database/record/index.d.ts +7 -0
- package/build/src/database/record/index.d.ts.map +1 -1
- package/build/src/database/record/index.js +15 -1
- package/build/src/sync/query-scope.d.ts +18 -0
- package/build/src/sync/query-scope.d.ts.map +1 -0
- package/build/src/sync/query-scope.js +77 -0
- package/build/src/sync/server-change-feed.d.ts.map +1 -1
- package/build/src/sync/server-change-feed.js +2 -24
- package/build/src/sync/stable-json.d.ts +9 -0
- package/build/src/sync/stable-json.d.ts.map +1 -0
- package/build/src/sync/stable-json.js +27 -0
- package/build/src/sync/sync-api-client.d.ts +185 -5
- package/build/src/sync/sync-api-client.d.ts.map +1 -1
- package/build/src/sync/sync-api-client.js +309 -17
- package/build/src/sync/sync-api-controller.d.ts +8 -0
- package/build/src/sync/sync-api-controller.d.ts.map +1 -1
- package/build/src/sync/sync-api-controller.js +17 -1
- package/build/src/sync/sync-client-registry.d.ts +12 -0
- package/build/src/sync/sync-client-registry.d.ts.map +1 -0
- package/build/src/sync/sync-client-registry.js +27 -0
- package/build/src/sync/sync-client-types.d.ts +127 -0
- package/build/src/sync/sync-client-types.d.ts.map +1 -0
- package/build/src/sync/sync-client-types.js +3 -0
- package/build/src/sync/sync-client.d.ts +176 -0
- package/build/src/sync/sync-client.d.ts.map +1 -0
- package/build/src/sync/sync-client.js +380 -0
- package/build/src/sync/sync-envelope-replay-service.d.ts +38 -4
- package/build/src/sync/sync-envelope-replay-service.d.ts.map +1 -1
- package/build/src/sync/sync-envelope-replay-service.js +73 -6
- package/build/src/sync/sync-resource-base.d.ts +98 -0
- package/build/src/sync/sync-resource-base.d.ts.map +1 -0
- package/build/src/sync/sync-resource-base.js +122 -0
- package/build/src/sync/sync-scope-store.d.ts +128 -0
- package/build/src/sync/sync-scope-store.d.ts.map +1 -0
- package/build/src/sync/sync-scope-store.js +282 -0
- package/build/src/tenants/default-tenant-database-provisioning.d.ts +21 -0
- package/build/src/tenants/default-tenant-database-provisioning.d.ts.map +1 -0
- package/build/src/tenants/default-tenant-database-provisioning.js +106 -0
- package/build/src/tenants/tenant.d.ts.map +1 -1
- package/build/src/tenants/tenant.js +6 -5
- package/build/sync/query-scope.js +84 -0
- package/build/sync/server-change-feed.js +1 -25
- package/build/sync/stable-json.js +28 -0
- package/build/sync/sync-api-client.js +331 -17
- package/build/sync/sync-api-controller.js +20 -0
- package/build/sync/sync-client-registry.js +30 -0
- package/build/sync/sync-client-types.js +41 -0
- package/build/sync/sync-client.js +433 -0
- package/build/sync/sync-envelope-replay-service.js +77 -5
- package/build/sync/sync-resource-base.js +143 -0
- package/build/sync/sync-scope-store.js +327 -0
- package/build/tenants/default-tenant-database-provisioning.js +124 -0
- package/build/tenants/tenant.js +5 -5
- package/build/tsconfig.tsbuildinfo +1 -1
- package/package.json +1 -1
- package/src/application.js +3 -0
- package/src/cli/commands/db/tenants/create.js +7 -5
- package/src/cli/commands/db/tenants/drop.js +6 -6
- package/src/configuration-types.js +8 -0
- package/src/configuration.js +29 -0
- package/src/database/query/index.js +30 -0
- package/src/database/query/model-class-query.js +17 -0
- package/src/database/record/index.js +16 -0
- package/src/sync/query-scope.js +84 -0
- package/src/sync/server-change-feed.js +1 -25
- package/src/sync/stable-json.js +28 -0
- package/src/sync/sync-api-client.js +331 -17
- package/src/sync/sync-api-controller.js +20 -0
- package/src/sync/sync-client-registry.js +30 -0
- package/src/sync/sync-client-types.js +41 -0
- package/src/sync/sync-client.js +433 -0
- package/src/sync/sync-envelope-replay-service.js +77 -5
- package/src/sync/sync-resource-base.js +143 -0
- package/src/sync/sync-scope-store.js +327 -0
- package/src/tenants/default-tenant-database-provisioning.js +124 -0
- package/src/tenants/tenant.js +5 -5
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Serializes a model query into a transportable sync scope.
|
|
3
|
+
*
|
|
4
|
+
* Only plain attribute equality conditions are supported: the scope must be
|
|
5
|
+
* expressible as `{resourceType, conditions}` so servers can match it against
|
|
6
|
+
* their change feeds. Anything else (raw SQL, negations, joins, orders,
|
|
7
|
+
* limits, offsets, groups) fails loudly.
|
|
8
|
+
* @param {import("../database/query/model-class-query.js").default<?>} query - Model query declaring the sync scope.
|
|
9
|
+
* @returns {import("./sync-client-types.js").SerializedSyncScope} Serialized sync scope.
|
|
10
|
+
*/
|
|
11
|
+
export function serializedScopeFromQuery(query: import("../database/query/model-class-query.js").default<unknown>): import("./sync-client-types.js").SerializedSyncScope;
|
|
12
|
+
/**
|
|
13
|
+
* Returns a stable canonical key identifying a sync scope.
|
|
14
|
+
* @param {import("./sync-client-types.js").SerializedSyncScope} scope - Serialized sync scope.
|
|
15
|
+
* @returns {string} Stable scope key.
|
|
16
|
+
*/
|
|
17
|
+
export function scopeKey(scope: import("./sync-client-types.js").SerializedSyncScope): string;
|
|
18
|
+
//# sourceMappingURL=query-scope.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"query-scope.d.ts","sourceRoot":"","sources":["../../../src/sync/query-scope.js"],"names":[],"mappings":"AAIA;;;;;;;;;GASG;AACH,gDAHW,OAAO,wCAAwC,EAAE,OAAO,CAAC,OAAC,CAAC,GACzD,OAAO,wBAAwB,EAAE,mBAAmB,CA+BhE;AAED;;;;GAIG;AACH,gCAHW,OAAO,wBAAwB,EAAE,mBAAmB,GAClD,MAAM,CAIlB"}
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
// @ts-check
|
|
2
|
+
import stableJsonStringify from "./stable-json.js";
|
|
3
|
+
/**
|
|
4
|
+
* Serializes a model query into a transportable sync scope.
|
|
5
|
+
*
|
|
6
|
+
* Only plain attribute equality conditions are supported: the scope must be
|
|
7
|
+
* expressible as `{resourceType, conditions}` so servers can match it against
|
|
8
|
+
* their change feeds. Anything else (raw SQL, negations, joins, orders,
|
|
9
|
+
* limits, offsets, groups) fails loudly.
|
|
10
|
+
* @param {import("../database/query/model-class-query.js").default<?>} query - Model query declaring the sync scope.
|
|
11
|
+
* @returns {import("./sync-client-types.js").SerializedSyncScope} Serialized sync scope.
|
|
12
|
+
*/
|
|
13
|
+
export function serializedScopeFromQuery(query) {
|
|
14
|
+
if (query.getJoins().length > 0)
|
|
15
|
+
throw new Error("sync(query) does not support joins");
|
|
16
|
+
if (query.getOrders().length > 0)
|
|
17
|
+
throw new Error("sync(query) does not support orders");
|
|
18
|
+
if (query.getLimit() !== null && query.getLimit() !== undefined)
|
|
19
|
+
throw new Error("sync(query) does not support limit");
|
|
20
|
+
if (query.getOffset() !== null && query.getOffset() !== undefined)
|
|
21
|
+
throw new Error("sync(query) does not support offset");
|
|
22
|
+
if (query.getGroups().length > 0)
|
|
23
|
+
throw new Error("sync(query) does not support groups");
|
|
24
|
+
const modelClass = query.getModelClass();
|
|
25
|
+
const conditions = /** @type {Record<string, ?>} */ ({});
|
|
26
|
+
for (const where of query.getWheres()) {
|
|
27
|
+
const whereHash = /** @type {{hash?: Record<string, ?>}} */ (where).hash;
|
|
28
|
+
if (!whereHash || typeof whereHash !== "object" || Array.isArray(whereHash) || /** @type {{where?: ?}} */ (where).where) {
|
|
29
|
+
throw new Error(`sync(query) only supports plain attribute conditions, got: ${where.constructor.name}`);
|
|
30
|
+
}
|
|
31
|
+
for (const [attributeName, value] of Object.entries(whereHash)) {
|
|
32
|
+
const conditionValue = scalarConditionValue(attributeName, value);
|
|
33
|
+
if (attributeName in conditions && stableJsonStringify(conditions[attributeName]) !== stableJsonStringify(conditionValue)) {
|
|
34
|
+
throw new Error(`sync(query) got conflicting conditions for: ${attributeName}`);
|
|
35
|
+
}
|
|
36
|
+
conditions[attributeName] = conditionValue;
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
return { conditions, resourceType: modelClass.getModelName() };
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* Returns a stable canonical key identifying a sync scope.
|
|
43
|
+
* @param {import("./sync-client-types.js").SerializedSyncScope} scope - Serialized sync scope.
|
|
44
|
+
* @returns {string} Stable scope key.
|
|
45
|
+
*/
|
|
46
|
+
export function scopeKey(scope) {
|
|
47
|
+
return `${scope.resourceType}:${stableJsonStringify(scope.conditions)}`;
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* Validates one scope condition value as a scalar or array of scalars.
|
|
51
|
+
* @param {string} attributeName - Condition attribute name for error messages.
|
|
52
|
+
* @param {?} value - Condition value.
|
|
53
|
+
* @returns {?} Validated condition value.
|
|
54
|
+
*/
|
|
55
|
+
function scalarConditionValue(attributeName, value) {
|
|
56
|
+
if (Array.isArray(value)) {
|
|
57
|
+
for (const item of value)
|
|
58
|
+
validateScalar(attributeName, item);
|
|
59
|
+
return value;
|
|
60
|
+
}
|
|
61
|
+
validateScalar(attributeName, value);
|
|
62
|
+
return value;
|
|
63
|
+
}
|
|
64
|
+
/**
|
|
65
|
+
* Validates one scalar condition value.
|
|
66
|
+
* @param {string} attributeName - Condition attribute name for error messages.
|
|
67
|
+
* @param {?} value - Condition value.
|
|
68
|
+
* @returns {void}
|
|
69
|
+
*/
|
|
70
|
+
function validateScalar(attributeName, value) {
|
|
71
|
+
if (value === null)
|
|
72
|
+
return;
|
|
73
|
+
if (typeof value === "string" || typeof value === "number" || typeof value === "boolean")
|
|
74
|
+
return;
|
|
75
|
+
throw new Error(`sync(query) condition values must be scalar, got ${typeof value} for: ${attributeName}`);
|
|
76
|
+
}
|
|
77
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicXVlcnktc2NvcGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvc3luYy9xdWVyeS1zY29wZS5qcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxZQUFZO0FBRVosT0FBTyxtQkFBbUIsTUFBTSxrQkFBa0IsQ0FBQTtBQUVsRDs7Ozs7Ozs7O0dBU0c7QUFDSCxNQUFNLFVBQVUsd0JBQXdCLENBQUMsS0FBSztJQUM1QyxJQUFJLEtBQUssQ0FBQyxRQUFRLEVBQUUsQ0FBQyxNQUFNLEdBQUcsQ0FBQztRQUFFLE1BQU0sSUFBSSxLQUFLLENBQUMsb0NBQW9DLENBQUMsQ0FBQTtJQUN0RixJQUFJLEtBQUssQ0FBQyxTQUFTLEVBQUUsQ0FBQyxNQUFNLEdBQUcsQ0FBQztRQUFFLE1BQU0sSUFBSSxLQUFLLENBQUMscUNBQXFDLENBQUMsQ0FBQTtJQUN4RixJQUFJLEtBQUssQ0FBQyxRQUFRLEVBQUUsS0FBSyxJQUFJLElBQUksS0FBSyxDQUFDLFFBQVEsRUFBRSxLQUFLLFNBQVM7UUFBRSxNQUFNLElBQUksS0FBSyxDQUFDLG9DQUFvQyxDQUFDLENBQUE7SUFDdEgsSUFBSSxLQUFLLENBQUMsU0FBUyxFQUFFLEtBQUssSUFBSSxJQUFJLEtBQUssQ0FBQyxTQUFTLEVBQUUsS0FBSyxTQUFTO1FBQUUsTUFBTSxJQUFJLEtBQUssQ0FBQyxxQ0FBcUMsQ0FBQyxDQUFBO0lBQ3pILElBQUksS0FBSyxDQUFDLFNBQVMsRUFBRSxDQUFDLE1BQU0sR0FBRyxDQUFDO1FBQUUsTUFBTSxJQUFJLEtBQUssQ0FBQyxxQ0FBcUMsQ0FBQyxDQUFBO0lBRXhGLE1BQU0sVUFBVSxHQUFHLEtBQUssQ0FBQyxhQUFhLEVBQUUsQ0FBQTtJQUN4QyxNQUFNLFVBQVUsR0FBRyxnQ0FBZ0MsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFBO0lBRXhELEtBQUssTUFBTSxLQUFLLElBQUksS0FBSyxDQUFDLFNBQVMsRUFBRSxFQUFFLENBQUM7UUFDdEMsTUFBTSxTQUFTLEdBQUcseUNBQXlDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxJQUFJLENBQUE7UUFFeEUsSUFBSSxDQUFDLFNBQVMsSUFBSSxPQUFPLFNBQVMsS0FBSyxRQUFRLElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsSUFBSSwwQkFBMEIsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLEtBQUssRUFBRSxDQUFDO1lBQ3hILE1BQU0sSUFBSSxLQUFLLENBQUMsOERBQThELEtBQUssQ0FBQyxXQUFXLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQTtRQUN6RyxDQUFDO1FBRUQsS0FBSyxNQUFNLENBQUMsYUFBYSxFQUFFLEtBQUssQ0FBQyxJQUFJLE1BQU0sQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLEVBQUUsQ0FBQztZQUMvRCxNQUFNLGNBQWMsR0FBRyxvQkFBb0IsQ0FBQyxhQUFhLEVBQUUsS0FBSyxDQUFDLENBQUE7WUFFakUsSUFBSSxhQUFhLElBQUksVUFBVSxJQUFJLG1CQUFtQixDQUFDLFVBQVUsQ0FBQyxhQUFhLENBQUMsQ0FBQyxLQUFLLG1CQUFtQixDQUFDLGNBQWMsQ0FBQyxFQUFFLENBQUM7Z0JBQzFILE1BQU0sSUFBSSxLQUFLLENBQUMsK0NBQStDLGFBQWEsRUFBRSxDQUFDLENBQUE7WUFDakYsQ0FBQztZQUVELFVBQVUsQ0FBQyxhQUFhLENBQUMsR0FBRyxjQUFjLENBQUE7UUFDNUMsQ0FBQztJQUNILENBQUM7SUFFRCxPQUFPLEVBQUMsVUFBVSxFQUFFLFlBQVksRUFBRSxVQUFVLENBQUMsWUFBWSxFQUFFLEVBQUMsQ0FBQTtBQUM5RCxDQUFDO0FBRUQ7Ozs7R0FJRztBQUNILE1BQU0sVUFBVSxRQUFRLENBQUMsS0FBSztJQUM1QixPQUFPLEdBQUcsS0FBSyxDQUFDLFlBQVksSUFBSSxtQkFBbUIsQ0FBQyxLQUFLLENBQUMsVUFBVSxDQUFDLEVBQUUsQ0FBQTtBQUN6RSxDQUFDO0FBRUQ7Ozs7O0dBS0c7QUFDSCxTQUFTLG9CQUFvQixDQUFDLGFBQWEsRUFBRSxLQUFLO0lBQ2hELElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDO1FBQ3pCLEtBQUssTUFBTSxJQUFJLElBQUksS0FBSztZQUFFLGNBQWMsQ0FBQyxhQUFhLEVBQUUsSUFBSSxDQUFDLENBQUE7UUFFN0QsT0FBTyxLQUFLLENBQUE7SUFDZCxDQUFDO0lBRUQsY0FBYyxDQUFDLGFBQWEsRUFBRSxLQUFLLENBQUMsQ0FBQTtJQUVwQyxPQUFPLEtBQUssQ0FBQTtBQUNkLENBQUM7QUFFRDs7Ozs7R0FLRztBQUNILFNBQVMsY0FBYyxDQUFDLGFBQWEsRUFBRSxLQUFLO0lBQzFDLElBQUksS0FBSyxLQUFLLElBQUk7UUFBRSxPQUFNO0lBQzFCLElBQUksT0FBTyxLQUFLLEtBQUssUUFBUSxJQUFJLE9BQU8sS0FBSyxLQUFLLFFBQVEsSUFBSSxPQUFPLEtBQUssS0FBSyxTQUFTO1FBQUUsT0FBTTtJQUVoRyxNQUFNLElBQUksS0FBSyxDQUFDLG9EQUFvRCxPQUFPLEtBQUssU0FBUyxhQUFhLEVBQUUsQ0FBQyxDQUFBO0FBQzNHLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBAdHMtY2hlY2tcblxuaW1wb3J0IHN0YWJsZUpzb25TdHJpbmdpZnkgZnJvbSBcIi4vc3RhYmxlLWpzb24uanNcIlxuXG4vKipcbiAqIFNlcmlhbGl6ZXMgYSBtb2RlbCBxdWVyeSBpbnRvIGEgdHJhbnNwb3J0YWJsZSBzeW5jIHNjb3BlLlxuICpcbiAqIE9ubHkgcGxhaW4gYXR0cmlidXRlIGVxdWFsaXR5IGNvbmRpdGlvbnMgYXJlIHN1cHBvcnRlZDogdGhlIHNjb3BlIG11c3QgYmVcbiAqIGV4cHJlc3NpYmxlIGFzIGB7cmVzb3VyY2VUeXBlLCBjb25kaXRpb25zfWAgc28gc2VydmVycyBjYW4gbWF0Y2ggaXQgYWdhaW5zdFxuICogdGhlaXIgY2hhbmdlIGZlZWRzLiBBbnl0aGluZyBlbHNlIChyYXcgU1FMLCBuZWdhdGlvbnMsIGpvaW5zLCBvcmRlcnMsXG4gKiBsaW1pdHMsIG9mZnNldHMsIGdyb3VwcykgZmFpbHMgbG91ZGx5LlxuICogQHBhcmFtIHtpbXBvcnQoXCIuLi9kYXRhYmFzZS9xdWVyeS9tb2RlbC1jbGFzcy1xdWVyeS5qc1wiKS5kZWZhdWx0PD8+fSBxdWVyeSAtIE1vZGVsIHF1ZXJ5IGRlY2xhcmluZyB0aGUgc3luYyBzY29wZS5cbiAqIEByZXR1cm5zIHtpbXBvcnQoXCIuL3N5bmMtY2xpZW50LXR5cGVzLmpzXCIpLlNlcmlhbGl6ZWRTeW5jU2NvcGV9IFNlcmlhbGl6ZWQgc3luYyBzY29wZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNlcmlhbGl6ZWRTY29wZUZyb21RdWVyeShxdWVyeSkge1xuICBpZiAocXVlcnkuZ2V0Sm9pbnMoKS5sZW5ndGggPiAwKSB0aHJvdyBuZXcgRXJyb3IoXCJzeW5jKHF1ZXJ5KSBkb2VzIG5vdCBzdXBwb3J0IGpvaW5zXCIpXG4gIGlmIChxdWVyeS5nZXRPcmRlcnMoKS5sZW5ndGggPiAwKSB0aHJvdyBuZXcgRXJyb3IoXCJzeW5jKHF1ZXJ5KSBkb2VzIG5vdCBzdXBwb3J0IG9yZGVyc1wiKVxuICBpZiAocXVlcnkuZ2V0TGltaXQoKSAhPT0gbnVsbCAmJiBxdWVyeS5nZXRMaW1pdCgpICE9PSB1bmRlZmluZWQpIHRocm93IG5ldyBFcnJvcihcInN5bmMocXVlcnkpIGRvZXMgbm90IHN1cHBvcnQgbGltaXRcIilcbiAgaWYgKHF1ZXJ5LmdldE9mZnNldCgpICE9PSBudWxsICYmIHF1ZXJ5LmdldE9mZnNldCgpICE9PSB1bmRlZmluZWQpIHRocm93IG5ldyBFcnJvcihcInN5bmMocXVlcnkpIGRvZXMgbm90IHN1cHBvcnQgb2Zmc2V0XCIpXG4gIGlmIChxdWVyeS5nZXRHcm91cHMoKS5sZW5ndGggPiAwKSB0aHJvdyBuZXcgRXJyb3IoXCJzeW5jKHF1ZXJ5KSBkb2VzIG5vdCBzdXBwb3J0IGdyb3Vwc1wiKVxuXG4gIGNvbnN0IG1vZGVsQ2xhc3MgPSBxdWVyeS5nZXRNb2RlbENsYXNzKClcbiAgY29uc3QgY29uZGl0aW9ucyA9IC8qKiBAdHlwZSB7UmVjb3JkPHN0cmluZywgPz59ICovICh7fSlcblxuICBmb3IgKGNvbnN0IHdoZXJlIG9mIHF1ZXJ5LmdldFdoZXJlcygpKSB7XG4gICAgY29uc3Qgd2hlcmVIYXNoID0gLyoqIEB0eXBlIHt7aGFzaD86IFJlY29yZDxzdHJpbmcsID8+fX0gKi8gKHdoZXJlKS5oYXNoXG5cbiAgICBpZiAoIXdoZXJlSGFzaCB8fCB0eXBlb2Ygd2hlcmVIYXNoICE9PSBcIm9iamVjdFwiIHx8IEFycmF5LmlzQXJyYXkod2hlcmVIYXNoKSB8fCAvKiogQHR5cGUge3t3aGVyZT86ID99fSAqLyAod2hlcmUpLndoZXJlKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYHN5bmMocXVlcnkpIG9ubHkgc3VwcG9ydHMgcGxhaW4gYXR0cmlidXRlIGNvbmRpdGlvbnMsIGdvdDogJHt3aGVyZS5jb25zdHJ1Y3Rvci5uYW1lfWApXG4gICAgfVxuXG4gICAgZm9yIChjb25zdCBbYXR0cmlidXRlTmFtZSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKHdoZXJlSGFzaCkpIHtcbiAgICAgIGNvbnN0IGNvbmRpdGlvblZhbHVlID0gc2NhbGFyQ29uZGl0aW9uVmFsdWUoYXR0cmlidXRlTmFtZSwgdmFsdWUpXG5cbiAgICAgIGlmIChhdHRyaWJ1dGVOYW1lIGluIGNvbmRpdGlvbnMgJiYgc3RhYmxlSnNvblN0cmluZ2lmeShjb25kaXRpb25zW2F0dHJpYnV0ZU5hbWVdKSAhPT0gc3RhYmxlSnNvblN0cmluZ2lmeShjb25kaXRpb25WYWx1ZSkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBzeW5jKHF1ZXJ5KSBnb3QgY29uZmxpY3RpbmcgY29uZGl0aW9ucyBmb3I6ICR7YXR0cmlidXRlTmFtZX1gKVxuICAgICAgfVxuXG4gICAgICBjb25kaXRpb25zW2F0dHJpYnV0ZU5hbWVdID0gY29uZGl0aW9uVmFsdWVcbiAgICB9XG4gIH1cblxuICByZXR1cm4ge2NvbmRpdGlvbnMsIHJlc291cmNlVHlwZTogbW9kZWxDbGFzcy5nZXRNb2RlbE5hbWUoKX1cbn1cblxuLyoqXG4gKiBSZXR1cm5zIGEgc3RhYmxlIGNhbm9uaWNhbCBrZXkgaWRlbnRpZnlpbmcgYSBzeW5jIHNjb3BlLlxuICogQHBhcmFtIHtpbXBvcnQoXCIuL3N5bmMtY2xpZW50LXR5cGVzLmpzXCIpLlNlcmlhbGl6ZWRTeW5jU2NvcGV9IHNjb3BlIC0gU2VyaWFsaXplZCBzeW5jIHNjb3BlLlxuICogQHJldHVybnMge3N0cmluZ30gU3RhYmxlIHNjb3BlIGtleS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNjb3BlS2V5KHNjb3BlKSB7XG4gIHJldHVybiBgJHtzY29wZS5yZXNvdXJjZVR5cGV9OiR7c3RhYmxlSnNvblN0cmluZ2lmeShzY29wZS5jb25kaXRpb25zKX1gXG59XG5cbi8qKlxuICogVmFsaWRhdGVzIG9uZSBzY29wZSBjb25kaXRpb24gdmFsdWUgYXMgYSBzY2FsYXIgb3IgYXJyYXkgb2Ygc2NhbGFycy5cbiAqIEBwYXJhbSB7c3RyaW5nfSBhdHRyaWJ1dGVOYW1lIC0gQ29uZGl0aW9uIGF0dHJpYnV0ZSBuYW1lIGZvciBlcnJvciBtZXNzYWdlcy5cbiAqIEBwYXJhbSB7P30gdmFsdWUgLSBDb25kaXRpb24gdmFsdWUuXG4gKiBAcmV0dXJucyB7P30gVmFsaWRhdGVkIGNvbmRpdGlvbiB2YWx1ZS5cbiAqL1xuZnVuY3Rpb24gc2NhbGFyQ29uZGl0aW9uVmFsdWUoYXR0cmlidXRlTmFtZSwgdmFsdWUpIHtcbiAgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpKSB7XG4gICAgZm9yIChjb25zdCBpdGVtIG9mIHZhbHVlKSB2YWxpZGF0ZVNjYWxhcihhdHRyaWJ1dGVOYW1lLCBpdGVtKVxuXG4gICAgcmV0dXJuIHZhbHVlXG4gIH1cblxuICB2YWxpZGF0ZVNjYWxhcihhdHRyaWJ1dGVOYW1lLCB2YWx1ZSlcblxuICByZXR1cm4gdmFsdWVcbn1cblxuLyoqXG4gKiBWYWxpZGF0ZXMgb25lIHNjYWxhciBjb25kaXRpb24gdmFsdWUuXG4gKiBAcGFyYW0ge3N0cmluZ30gYXR0cmlidXRlTmFtZSAtIENvbmRpdGlvbiBhdHRyaWJ1dGUgbmFtZSBmb3IgZXJyb3IgbWVzc2FnZXMuXG4gKiBAcGFyYW0gez99IHZhbHVlIC0gQ29uZGl0aW9uIHZhbHVlLlxuICogQHJldHVybnMge3ZvaWR9XG4gKi9cbmZ1bmN0aW9uIHZhbGlkYXRlU2NhbGFyKGF0dHJpYnV0ZU5hbWUsIHZhbHVlKSB7XG4gIGlmICh2YWx1ZSA9PT0gbnVsbCkgcmV0dXJuXG4gIGlmICh0eXBlb2YgdmFsdWUgPT09IFwic3RyaW5nXCIgfHwgdHlwZW9mIHZhbHVlID09PSBcIm51bWJlclwiIHx8IHR5cGVvZiB2YWx1ZSA9PT0gXCJib29sZWFuXCIpIHJldHVyblxuXG4gIHRocm93IG5ldyBFcnJvcihgc3luYyhxdWVyeSkgY29uZGl0aW9uIHZhbHVlcyBtdXN0IGJlIHNjYWxhciwgZ290ICR7dHlwZW9mIHZhbHVlfSBmb3I6ICR7YXR0cmlidXRlTmFtZX1gKVxufVxuIl19
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"server-change-feed.d.ts","sourceRoot":"","sources":["../../../src/sync/server-change-feed.js"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"server-change-feed.d.ts","sourceRoot":"","sources":["../../../src/sync/server-change-feed.js"],"names":[],"mappings":"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"}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
// @ts-check
|
|
2
2
|
import { randomUUID } from "crypto";
|
|
3
3
|
import TableData from "../database/table-data/index.js";
|
|
4
|
+
import stableJsonStringify from "./stable-json.js";
|
|
4
5
|
const DEFAULT_RETENTION_SIZE = 10000;
|
|
5
6
|
const DEFAULT_PAGE_SIZE = 100;
|
|
6
7
|
const MAX_PAGE_SIZE = 1000;
|
|
@@ -417,29 +418,6 @@ function scopesEqual(changeScope, requestedScope) {
|
|
|
417
418
|
return true;
|
|
418
419
|
return stableJsonStringify(changeScope || null) === stableJsonStringify(requestedScope);
|
|
419
420
|
}
|
|
420
|
-
/**
|
|
421
|
-
* Stable JSON serialization for persisted sync scopes.
|
|
422
|
-
* @param {?} value - JSON-compatible value.
|
|
423
|
-
* @returns {string} - Stable JSON representation.
|
|
424
|
-
*/
|
|
425
|
-
function stableJsonStringify(value) {
|
|
426
|
-
return JSON.stringify(stableJsonValue(value));
|
|
427
|
-
}
|
|
428
|
-
/**
|
|
429
|
-
* Produces a recursively key-sorted JSON value.
|
|
430
|
-
* @param {?} value - JSON-compatible value.
|
|
431
|
-
* @returns {?} - Stable JSON-compatible value.
|
|
432
|
-
*/
|
|
433
|
-
function stableJsonValue(value) {
|
|
434
|
-
if (Array.isArray(value))
|
|
435
|
-
return value.map((item) => stableJsonValue(item));
|
|
436
|
-
if (!value || typeof value !== "object")
|
|
437
|
-
return value;
|
|
438
|
-
return Object.keys(value).sort().reduce((memo, key) => {
|
|
439
|
-
memo[key] = stableJsonValue(value[key]);
|
|
440
|
-
return memo;
|
|
441
|
-
}, /** @type {Record<string, ?>} */ ({}));
|
|
442
|
-
}
|
|
443
421
|
/**
|
|
444
422
|
* @typedef {object} ServerChangeFeedEntry
|
|
445
423
|
* @property {string | null} actorDeviceId - Signed mutation actor device id when available.
|
|
@@ -472,4 +450,4 @@ function stableJsonValue(value) {
|
|
|
472
450
|
* @property {string | null} scope_json - Scope JSON.
|
|
473
451
|
* @property {number | string} server_sequence - Server sequence.
|
|
474
452
|
*/
|
|
475
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VydmVyLWNoYW5nZS1mZWVkLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL3N5bmMvc2VydmVyLWNoYW5nZS1mZWVkLmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLFlBQVk7QUFFWixPQUFPLEVBQUMsVUFBVSxFQUFDLE1BQU0sUUFBUSxDQUFBO0FBQ2pDLE9BQU8sU0FBUyxNQUFNLGlDQUFpQyxDQUFBO0FBRXZELE1BQU0sc0JBQXNCLEdBQUcsS0FBSyxDQUFBO0FBQ3BDLE1BQU0saUJBQWlCLEdBQUcsR0FBRyxDQUFBO0FBQzdCLE1BQU0sYUFBYSxHQUFHLElBQUksQ0FBQTtBQUMxQixNQUFNLFVBQVUsR0FBRyw2QkFBNkIsQ0FBQTtBQUNoRCxNQUFNLE1BQU0sR0FBRyxJQUFJLE9BQU8sRUFBRSxDQUFBO0FBRTVCOzs7O0dBSUc7QUFDSCxNQUFNLFVBQVUscUNBQXFDLENBQUMsYUFBYTtJQUNqRSxJQUFJLEtBQUssR0FBRyxNQUFNLENBQUMsR0FBRyxDQUFDLGFBQWEsQ0FBQyxDQUFBO0lBRXJDLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQztRQUNYLEtBQUssR0FBRyxJQUFJLHFCQUFxQixDQUFDLEVBQUMsYUFBYSxFQUFDLENBQUMsQ0FBQTtRQUNsRCxNQUFNLENBQUMsR0FBRyxDQUFDLGFBQWEsRUFBRSxLQUFLLENBQUMsQ0FBQTtJQUNsQyxDQUFDO0lBRUQsT0FBTyxLQUFLLENBQUE7QUFDZCxDQUFDO0FBRUQsTUFBTSxDQUFDLE9BQU8sT0FBTyxxQkFBcUI7SUFDeEM7Ozs7OztPQU1HO0lBQ0gsWUFBWSxFQUFDLGFBQWEsRUFBRSxrQkFBa0IsR0FBRyxTQUFTLEVBQUUsYUFBYSxFQUFDO1FBQ3hFLE1BQU0saUJBQWlCLEdBQUcsYUFBYSxDQUFDLG9CQUFvQixFQUFFLENBQUE7UUFFOUQsSUFBSSxDQUFDLGFBQWEsR0FBRyxhQUFhLENBQUE7UUFDbEMsSUFBSSxDQUFDLGtCQUFrQixHQUFHLGtCQUFrQixD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QyxPQUFPLElBQUksQ0FBQTtJQUNiLENBQUMsRUFBRSxnQ0FBZ0MsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUE7QUFDM0MsQ0FBQztBQUVEOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUVIOzs7Ozs7Ozs7Ozs7Ozs7R0FlRyIsInNvdXJjZXNDb250ZW50IjpbIi8vIEB0cy1jaGVja1xuXG5pbXBvcnQge3JhbmRvbVVVSUR9IGZyb20gXCJjcnlwdG9cIlxuaW1wb3J0IFRhYmxlRGF0YSBmcm9tIFwiLi4vZGF0YWJhc2UvdGFibGUtZGF0YS9pbmRleC5qc1wiXG5cbmNvbnN0IERFRkFVTFRfUkVURU5USU9OX1NJWkUgPSAxMDAwMFxuY29uc3QgREVGQVVMVF9QQUdFX1NJWkUgPSAxMDBcbmNvbnN0IE1BWF9QQUdFX1NJWkUgPSAxMDAwXG5jb25zdCBUQUJMRV9OQU1FID0gXCJmcm9udGVuZF9tb2RlbF9zeW5jX2NoYW5nZXNcIlxuY29uc3Qgc3RvcmVzID0gbmV3IFdlYWtNYXAoKVxuXG4vKipcbiAqIFNoYXJlZCBzZXJ2ZXIgY2hhbmdlLWZlZWQgc3RvcmUgZm9yIGEgY29uZmlndXJhdGlvbi5cbiAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vY29uZmlndXJhdGlvbi5qc1wiKS5kZWZhdWx0fSBjb25maWd1cmF0aW9uIC0gQ29uZmlndXJhdGlvbi5cbiAqIEByZXR1cm5zIHtTZXJ2ZXJDaGFuZ2VGZWVkU3RvcmV9IC0gU3RvcmUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzZXJ2ZXJDaGFuZ2VGZWVkU3RvcmVGb3JDb25maWd1cmF0aW9uKGNvbmZpZ3VyYXRpb24pIHtcbiAgbGV0IHN0b3JlID0gc3RvcmVzLmdldChjb25maWd1cmF0aW9uKVxuXG4gIGlmICghc3RvcmUpIHtcbiAgICBzdG9yZSA9IG5ldyBTZXJ2ZXJDaGFuZ2VGZWVkU3RvcmUoe2NvbmZpZ3VyYXRpb259KVxuICAgIHN0b3Jlcy5zZXQoY29uZmlndXJhdGlvbiwgc3RvcmUpXG4gIH1cblxuICByZXR1cm4gc3RvcmVcbn1cblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgU2VydmVyQ2hhbmdlRmVlZFN0b3JlIHtcbiAgLyoqXG4gICAqIFJ1bnMgY29uc3RydWN0b3IuXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBhcmdzIC0gT3B0aW9ucy5cbiAgICogQHBhcmFtIHtpbXBvcnQoXCIuLi9jb25maWd1cmF0aW9uLmpzXCIpLmRlZmF1bHR9IGFyZ3MuY29uZmlndXJhdGlvbiAtIENvbmZpZ3VyYXRpb24uXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbYXJncy5kYXRhYmFzZUlkZW50aWZpZXJdIC0gRGF0YWJhc2UgaWRlbnRpZmllci5cbiAgICogQHBhcmFtIHtudW1iZXJ9IFthcmdzLnJldGVudGlvblNpemVdIC0gTnVtYmVyIG9mIGZlZWQgZW50cmllcyB0byByZXRhaW4uXG4gICAqL1xuICBjb25zdHJ1Y3Rvcih7Y29uZmlndXJhdGlvbiwgZGF0YWJhc2VJZGVudGlmaWVyID0gXCJkZWZhdWx0XCIsIHJldGVudGlvblNpemV9KSB7XG4gICAgY29uc3Qgc3luY0NvbmZpZ3VyYXRpb24gPSBjb25maWd1cmF0aW9uLmdldFN5bmNDb25maWd1cmF0aW9uKClcblxuICAgIHRoaXMuY29uZmlndXJhdGlvbiA9IGNvbmZpZ3VyYXRpb25cbiAgICB0aGlzLmRhdGFiYXNlSWRlbnRpZmllciA9IGRhdGFiYXNlSWRlbnRpZmllclxuICAgIHRoaXMucmV0ZW50aW9uU2l6ZSA9IHJldGVudGlvblNpemUgfHwgc3luY0NvbmZpZ3VyYXRpb24uY2hhbmdlRmVlZFJldGVudGlvblNpemUgfHwgREVGQVVMVF9SRVRFTlRJT05fU0laRVxuICAgIC8qKiBAdHlwZSB7U2VydmVyQ2hhbmdlRmVlZEVudHJ5W119ICovXG4gICAgdGhpcy5fbWVtb3J5Q2hhbmdlcyA9IFtdXG4gICAgdGhpcy5fbWVtb3J5U2VxdWVuY2UgPSAwXG4gICAgdGhpcy5faXNSZWFkeSA9IGZhbHNlXG4gICAgdGhpcy5fcmVhZHlQcm9taXNlID0gbnVsbFxuICB9XG5cbiAgLyoqXG4gICAqIEVuc3VyZXMgdGhlIGJhY2tpbmcgdGFibGUgZXhpc3RzLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn0gLSBSZXNvbHZlcyB3aGVuIHJlYWR5LlxuICAgKi9cbiAgYXN5bmMgZW5zdXJlUmVhZHkoKSB7XG4gICAgaWYgKHRoaXMuX3VzZXNNZW1vcnlTdG9yYWdlKCkpIHtcbiAgICAgIHRoaXMuX2lzUmVhZHkgPSB0cnVlXG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBpZiAoYXdhaXQgdGhpcy5fc2NoZW1hUmVhZHkoKSkgcmV0dXJuXG4gICAgaWYgKHRoaXMuX3JlYWR5UHJvbWlzZSkgcmV0dXJuIGF3YWl0IHRoaXMuX3JlYWR5UHJvbWlzZVxuXG4gICAgdGhpcy5fcmVhZHlQcm9taXNlID0gKGFzeW5jICgpID0+IHtcbiAgICAgIHRoaXMuY29uZmlndXJhdGlvbi5zZXRDdXJyZW50KClcbiAgICAgIGF3YWl0IHRoaXMuX3dpdGhEYihhc3luYyAoZGIpID0+IHtcbiAgICAgICAgYXdhaXQgdGhpcy5fZW5zdXJlQ2hhbmdlc1RhYmxlKGRiKVxuICAgICAgfSlcbiAgICAgIHRoaXMuX2lzUmVhZHkgPSB0cnVlXG4gICAgfSkoKVxuXG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IHRoaXMuX3JlYWR5UHJvbWlzZVxuICAgIH0gZmluYWxseSB7XG4gICAgICBpZiAoIXRoaXMuX2lzUmVhZHkpIHRoaXMuX3JlYWR5UHJvbWlzZSA9IG51bGxcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQXBwZW5kcyBhIGNoYW5nZSBhbmQgYXNzaWducyB0aGUgbmV4dCBzZXJ2ZXIgc2VxdWVuY2UuXG4gICAqIEBwYXJhbSB7T21pdDxTZXJ2ZXJDaGFuZ2VGZWVkRW50cnksIFwiY3JlYXRlZEF0XCIgfCBcImlkXCIgfCBcInNlcnZlclNlcXVlbmNlXCI+ICYge2NyZWF0ZWRBdD86IHN0cmluZywgaWQ/OiBzdHJpbmd9fSBjaGFuZ2UgLSBDaGFuZ2UgcGF5bG9hZC5cbiAgICogQHJldHVybnMge1Byb21pc2U8U2VydmVyQ2hhbmdlRmVlZEVudHJ5Pn0gLSBQZXJzaXN0ZWQgY2hhbmdlLlxuICAgKi9cbiAgYXN5bmMgYXBwZW5kKGNoYW5nZSkge1xuICAgIGF3YWl0IHRoaXMuZW5zdXJlUmVhZHkoKVxuXG4gICAgY29uc3QgaWQgPSBjaGFuZ2UuaWQgfHwgcmFuZG9tVVVJRCgpXG4gICAgY29uc3QgY3JlYXRlZEF0ID0gY2hhbmdlLmNyZWF0ZWRBdCB8fCBuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKClcblxuICAgIGlmICh0aGlzLl91c2VzTWVtb3J5U3RvcmFnZSgpKSByZXR1cm4gdGhpcy5fYXBwZW5kTWVtb3J5KHsuLi5jaGFuZ2UsIGNyZWF0ZWRBdCwgaWR9KVxuXG4gICAgcmV0dXJuIGF3YWl0IHRoaXMuX3dpdGhEYihhc3luYyAoZGIpID0+IHtcbiAgICAgIGF3YWl0IGRiLmluc2VydCh7XG4gICAgICAgIHRhYmxlTmFtZTogVEFCTEVfTkFNRSxcbiAgICAgICAgZGF0YToge1xuICAgICAgICAgIGFjdG9yX2RldmljZV9pZDogY2hhbmdlLmFjdG9yRGV2aWNlSWQsXG4gICAgICAgICAgYWN0b3JfdXNlcl9pZDogY2hhbmdlLmFjdG9yVXNlcklkLFxuICAgICAgICAgIGF0dHJpYnV0ZXNfanNvbjogSlNPTi5zdHJpbmdpZnkoY2hhbmdlLmF0dHJpYnV0ZXMgfHwgbnVsbCksXG4gICAgICAgICAgY3JlYXRlZF9hdDogbmV3IERhdGUoY3JlYXRlZEF0KSxcbiAgICAgICAgICBpZCxcbiAgICAgICAgICBpZGVtcG90ZW5jeV9rZXk6IGNoYW5nZS5pZGVtcG90ZW5jeUtleSxcbiAgICAgICAgICBtb2RlbDogY2hhbmdlLm1vZGVsLFxuICAgICAgICAgIG9wZXJhdGlvbjogY2hhbmdlLm9wZXJhdGlvbixcbiAgICAgICAgICBwYXlsb2FkX2pzb246IEpTT04uc3RyaW5naWZ5KGNoYW5nZS5wYXlsb2FkIHx8IG51bGwpLFxuICAgICAgICAgIHJlY29yZF9pZDogY2hhbmdlLnJlY29yZElkID09PSBudWxsIHx8IGNoYW5nZS5yZWNvcmRJZCA9PT0gdW5kZWZpbmVkID8gbnVsbCA6IFN0cmluZyhjaGFuZ2UucmVjb3JkSWQpLFxuICAgICAgICAgIHJlc3BvbnNlX2pzb246IEpTT04uc3RyaW5naWZ5KGNoYW5nZS5yZXNwb25zZSB8fCBudWxsKSxcbiAgICAgICAgICBzY29wZV9qc29uOiBzdGFibGVKc29uU3RyaW5naWZ5KGNoYW5nZS5zY29wZSB8fCBudWxsKVxuICAgICAgICB9XG4gICAgICB9KVxuXG4gICAgICBjb25zdCByb3cgPSBhd2FpdCB0aGlzLl9jaGFuZ2VCeUlkKGRiLCBpZClcbiAgICAgIGlmICghcm93KSB0aHJvdyBuZXcgRXJyb3IoXCJGYWlsZWQgdG8gcGVyc2lzdCBzZXJ2ZXIgY2hhbmdlLWZlZWQgZW50cnlcIilcblxuICAgICAgYXdhaXQgdGhpcy5fcHJ1bmVSZXRhaW5lZENoYW5nZXMoZGIsIHJvdy5zZXJ2ZXJTZXF1ZW5jZSlcblxuICAgICAgcmV0dXJuIHJvd1xuICAgIH0pXG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyBjdXJyZW50IGxhdGVzdCBzZXJ2ZXIgc2VxdWVuY2UuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPG51bWJlcj59IC0gTGF0ZXN0IHNlcXVlbmNlLlxuICAgKi9cbiAgYXN5bmMgbGF0ZXN0U2VxdWVuY2UoKSB7XG4gICAgYXdhaXQgdGhpcy5lbnN1cmVSZWFkeSgpXG5cbiAgICBpZiAodGhpcy5fdXNlc01lbW9yeVN0b3JhZ2UoKSkgcmV0dXJuIHRoaXMuX21lbW9yeVNlcXVlbmNlXG5cbiAgICByZXR1cm4gYXdhaXQgdGhpcy5fd2l0aERiKGFzeW5jIChkYikgPT4ge1xuICAgICAgY29uc3Qgcm93cyA9IGF3YWl0IGRiXG4gICAgICAgIC5uZXdRdWVyeSgpXG4gICAgICAgIC5mcm9tKFRBQkxFX05BTUUpXG4gICAgICAgIC5vcmRlcihcInNlcnZlcl9zZXF1ZW5jZSBERVNDXCIpXG4gICAgICAgIC5saW1pdCgxKVxuICAgICAgICAucmVzdWx0cygpXG4gICAgICBjb25zdCByb3cgPSAvKiogQHR5cGUge3tzZXJ2ZXJfc2VxdWVuY2U/OiBudW1iZXIgfCBzdHJpbmd9IHwgdW5kZWZpbmVkfSAqLyAocm93c1swXSlcblxuICAgICAgcmV0dXJuIHJvdyA/IE51bWJlcihyb3cuc2VydmVyX3NlcXVlbmNlKSA6IDBcbiAgICB9KVxuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgb2xkZXN0IHJldGFpbmVkIHNlcnZlciBzZXF1ZW5jZS5cbiAgICogQHJldHVybnMge1Byb21pc2U8bnVtYmVyIHwgbnVsbD59IC0gT2xkZXN0IHJldGFpbmVkIHNlcXVlbmNlLlxuICAgKi9cbiAgYXN5bmMgb2xkZXN0U2VxdWVuY2UoKSB7XG4gICAgYXdhaXQgdGhpcy5lbnN1cmVSZWFkeSgpXG5cbiAgICBpZiAodGhpcy5fdXNlc01lbW9yeVN0b3JhZ2UoKSkgcmV0dXJuIHRoaXMuX21lbW9yeUNoYW5nZXNbMF0/LnNlcnZlclNlcXVlbmNlIHx8IG51bGxcblxuICAgIHJldHVybiBhd2FpdCB0aGlzLl93aXRoRGIoYXN5bmMgKGRiKSA9PiBhd2FpdCB0aGlzLl9vbGRlc3RTZXF1ZW5jZShkYikpXG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyBvcmRlcmVkIGNoYW5nZXMgYWZ0ZXIgYSBjdXJzb3IuXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBhcmdzIC0gQXJndW1lbnRzLlxuICAgKiBAcGFyYW0ge251bWJlcn0gYXJncy5hZnRlclNlcXVlbmNlIC0gRXhjbHVzaXZlIGxvd2VyIGJvdW5kLlxuICAgKiBAcGFyYW0ge251bWJlcn0gW2FyZ3MubGltaXRdIC0gTWF4aW11bSBudW1iZXIgb2YgY2hhbmdlcy5cbiAgICogQHBhcmFtIHtudW1iZXJ9IFthcmdzLnVwVG9TZXF1ZW5jZV0gLSBJbmNsdXNpdmUgdXBwZXIgYm91bmQuXG4gICAqIEBwYXJhbSB7UmVjb3JkPHN0cmluZywgPz59IFthcmdzLnNjb3BlXSAtIENhbGxlciBzeW5jIHNjb3BlLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx7Y2hhbmdlczogU2VydmVyQ2hhbmdlRmVlZEVudHJ5W10sIGhhc01vcmU6IGJvb2xlYW4sIG5leHRTZXF1ZW5jZTogbnVtYmVyLCBvbGRlc3RTZXF1ZW5jZTogbnVtYmVyIHwgbnVsbCwgc25hcHNob3RSZXF1aXJlZDogYm9vbGVhbiwgdXBUb1NlcXVlbmNlOiBudW1iZXJ9Pn0gLSBPcmRlcmVkIHBhZ2UuXG4gICAqL1xuICBhc3luYyBjaGFuZ2VzQWZ0ZXIoe2FmdGVyU2VxdWVuY2UsIGxpbWl0ID0gREVGQVVMVF9QQUdFX1NJWkUsIHNjb3BlLCB1cFRvU2VxdWVuY2V9KSB7XG4gICAgYXdhaXQgdGhpcy5lbnN1cmVSZWFkeSgpXG5cbiAgICBjb25zdCBwYWdlU2l6ZSA9IG5vcm1hbGl6ZUxpbWl0KGxpbWl0KVxuXG4gICAgaWYgKHRoaXMuX3VzZXNNZW1vcnlTdG9yYWdlKCkpIHJldHVybiB0aGlzLl9tZW1vcnlDaGFuZ2VzQWZ0ZXIoe2FmdGVyU2VxdWVuY2UsIGxpbWl0OiBwYWdlU2l6ZSwgc2NvcGUsIHVwVG9TZXF1ZW5jZX0pXG5cbiAgICByZXR1cm4gYXdhaXQgdGhpcy5fd2l0aERiKGFzeW5jIChkYikgPT4ge1xuICAgICAgY29uc3QgbGF0ZXN0U2VxdWVuY2UgPSB0eXBlb2YgdXBUb1NlcXVlbmNlID09PSBcIm51bWJlclwiID8gdXBUb1NlcXVlbmNlIDogYXdhaXQgdGhpcy5fbGF0ZXN0U2VxdWVuY2UoZGIpXG4gICAgICBjb25zdCBvbGRlc3RTZXF1ZW5jZSA9IGF3YWl0IHRoaXMuX29sZGVzdFNlcXVlbmNlKGRiKVxuICAgICAgY29uc3Qgc25hcHNob3RSZXF1aXJlZCA9IGFmdGVyU2VxdWVuY2UgPiAwICYmIG9sZGVzdFNlcXVlbmNlICE9PSBudWxsICYmIG9sZGVzdFNlcXVlbmNlID4gYWZ0ZXJTZXF1ZW5jZSArIDFcblxuICAgICAgaWYgKHNuYXBzaG90UmVxdWlyZWQpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBjaGFuZ2VzOiBbXSxcbiAgICAgICAgICBoYXNNb3JlOiBmYWxzZSxcbiAgICAgICAgICBuZXh0U2VxdWVuY2U6IGFmdGVyU2VxdWVuY2UsXG4gICAgICAgICAgb2xkZXN0U2VxdWVuY2UsXG4gICAgICAgICAgc25hcHNob3RSZXF1aXJlZDogdHJ1ZSxcbiAgICAgICAgICB1cFRvU2VxdWVuY2U6IGxhdGVzdFNlcXVlbmNlXG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgY29uc3Qgcm93cyA9IC8qKiBAdHlwZSB7U2VydmVyQ2hhbmdlRmVlZFJvd1tdfSAqLyAoYXdhaXQgZGJcbiAgICAgICAgLm5ld1F1ZXJ5KClcbiAgICAgICAgLmZyb20oVEFCTEVfTkFNRSlcbiAgICAgICAgLndoZXJlKGBzZXJ2ZXJfc2VxdWVuY2UgPiAke2RiLnF1b3RlKGFmdGVyU2VxdWVuY2UpfWApXG4gICAgICAgIC53aGVyZShgc2VydmVyX3NlcXVlbmNlIDw9ICR7ZGIucXVvdGUobGF0ZXN0U2VxdWVuY2UpfWApXG4gICAgICAgIC53aGVyZShzY29wZSA9PT0gdW5kZWZpbmVkID8gXCIxID0gMVwiIDoge3Njb3BlX2pzb246IHN0YWJsZUpzb25TdHJpbmdpZnkoc2NvcGUpfSlcbiAgICAgICAgLm9yZGVyKFwic2VydmVyX3NlcXVlbmNlIEFTQ1wiKVxuICAgICAgICAubGltaXQocGFnZVNpemUgKyAxKVxuICAgICAgICAucmVzdWx0cygpKVxuICAgICAgY29uc3QgaGFzTW9yZSA9IHJvd3MubGVuZ3RoID4gcGFnZVNpemVcbiAgICAgIGNvbnN0IHBhZ2VSb3dzID0gcm93cy5zbGljZSgwLCBwYWdlU2l6ZSlcbiAgICAgIGNvbnN0IGNoYW5nZXMgPSBwYWdlUm93cy5tYXAoKHJvdykgPT4gdGhpcy5fbm9ybWFsaXplQ2hhbmdlUm93KHJvdykpXG4gICAgICBjb25zdCBsYXN0Q2hhbmdlID0gY2hhbmdlc1tjaGFuZ2VzLmxlbmd0aCAtIDFdXG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIGNoYW5nZXMsXG4gICAgICAgIGhhc01vcmUsXG4gICAgICAgIG5leHRTZXF1ZW5jZTogbGFzdENoYW5nZSA/IGxhc3RDaGFuZ2Uuc2VydmVyU2VxdWVuY2UgOiBhZnRlclNlcXVlbmNlLFxuICAgICAgICBvbGRlc3RTZXF1ZW5jZSxcbiAgICAgICAgc25hcHNob3RSZXF1aXJlZDogZmFsc2UsXG4gICAgICAgIHVwVG9TZXF1ZW5jZTogbGF0ZXN0U2VxdWVuY2VcbiAgICAgIH1cbiAgICB9KVxuICB9XG5cbiAgLyoqXG4gICAqIEVuc3VyZXMgc2NoZW1hIGlzIHN0aWxsIHByZXNlbnQuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPGJvb2xlYW4+fSAtIFdoZXRoZXIgcmVhZHkuXG4gICAqL1xuICBhc3luYyBfc2NoZW1hUmVhZHkoKSB7XG4gICAgaWYgKHRoaXMuX3VzZXNNZW1vcnlTdG9yYWdlKCkpIHJldHVybiB0aGlzLl9pc1JlYWR5XG4gICAgaWYgKCF0aGlzLl9pc1JlYWR5KSByZXR1cm4gZmFsc2VcbiAgICBpZiAoYXdhaXQgdGhpcy5fd2l0aERiKGFzeW5jIChkYikgPT4gYXdhaXQgZGIudGFibGVFeGlzdHMoVEFCTEVfTkFNRSkpKSByZXR1cm4gdHJ1ZVxuXG4gICAgdGhpcy5faXNSZWFkeSA9IGZhbHNlXG4gICAgdGhpcy5fcmVhZHlQcm9taXNlID0gbnVsbFxuXG4gICAgcmV0dXJuIGZhbHNlXG4gIH1cblxuICAvKipcbiAgICogRW5zdXJlcyBjaGFuZ2VzIHRhYmxlIGV4aXN0cy5cbiAgICogQHBhcmFtIHtpbXBvcnQoXCIuLi9kYXRhYmFzZS9kcml2ZXJzL2Jhc2UuanNcIikuZGVmYXVsdH0gZGIgLSBEYXRhYmFzZSBjb25uZWN0aW9uLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn0gLSBSZXNvbHZlcyB3aGVuIGNvbXBsZXRlLlxuICAgKi9cbiAgYXN5bmMgX2Vuc3VyZUNoYW5nZXNUYWJsZShkYikge1xuICAgIGlmIChhd2FpdCBkYi50YWJsZUV4aXN0cyhUQUJMRV9OQU1FKSkgcmV0dXJuXG5cbiAgICBjb25zdCB0YWJsZSA9IG5ldyBUYWJsZURhdGEoVEFCTEVfTkFNRSwge2lmTm90RXhpc3RzOiB0cnVlfSlcblxuICAgIHRhYmxlLmludGVnZXIoXCJzZXJ2ZXJfc2VxdWVuY2VcIiwge2F1dG9JbmNyZW1lbnQ6IHRydWUsIG51bGw6IGZhbHNlLCBwcmltYXJ5S2V5OiB0cnVlfSlcbiAgICB0YWJsZS5zdHJpbmcoXCJpZFwiLCB7aW5kZXg6IHRydWUsIG51bGw6IGZhbHNlfSlcbiAgICB0YWJsZS5zdHJpbmcoXCJtb2RlbFwiLCB7aW5kZXg6IHRydWUsIG51bGw6IGZhbHNlfSlcbiAgICB0YWJsZS5zdHJpbmcoXCJvcGVyYXRpb25cIiwge251bGw6IGZhbHNlfSlcbiAgICB0YWJsZS5zdHJpbmcoXCJyZWNvcmRfaWRcIiwge2luZGV4OiB0cnVlLCBudWxsOiB0cnVlfSlcbiAgICB0YWJsZS50ZXh0KFwicGF5bG9hZF9qc29uXCIsIHtudWxsOiB0cnVlfSlcbiAgICB0YWJsZS50ZXh0KFwiYXR0cmlidXRlc19qc29uXCIsIHtudWxsOiB0cnVlfSlcbiAgICB0YWJsZS5zdHJpbmcoXCJpZGVtcG90ZW5jeV9rZXlcIiwge2luZGV4OiB0cnVlLCBudWxsOiB0cnVlfSlcbiAgICB0YWJsZS5zdHJpbmcoXCJhY3Rvcl91c2VyX2lkXCIsIHtpbmRleDogdHJ1ZSwgbnVsbDogdHJ1ZX0pXG4gICAgdGFibGUuc3RyaW5nKFwiYWN0b3JfZGV2aWNlX2lkXCIsIHtpbmRleDogdHJ1ZSwgbnVsbDogdHJ1ZX0pXG4gICAgdGFibGUudGV4dChcInNjb3BlX2pzb25cIiwge251bGw6IHRydWV9KVxuICAgIHRhYmxlLnRleHQoXCJyZXNwb25zZV9qc29uXCIsIHtudWxsOiB0cnVlfSlcbiAgICB0YWJsZS5kYXRldGltZShcImNyZWF0ZWRfYXRcIiwge2luZGV4OiB0cnVlLCBudWxsOiBmYWxzZX0pXG5cbiAgICBhd2FpdCBkYi5jcmVhdGVUYWJsZSh0YWJsZSlcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXNvbHZlcyBhIHBlcnNpc3RlZCBjaGFuZ2UgYnkgaWQuXG4gICAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vZGF0YWJhc2UvZHJpdmVycy9iYXNlLmpzXCIpLmRlZmF1bHR9IGRiIC0gRGF0YWJhc2UgY29ubmVjdGlvbi5cbiAgICogQHBhcmFtIHtzdHJpbmd9IGlkIC0gRW50cnkgaWQuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPFNlcnZlckNoYW5nZUZlZWRFbnRyeSB8IG51bGw+fSAtIEVudHJ5IG9yIG51bGwuXG4gICAqL1xuICBhc3luYyBfY2hhbmdlQnlJZChkYiwgaWQpIHtcbiAgICBjb25zdCByb3dzID0gLyoqIEB0eXBlIHtTZXJ2ZXJDaGFuZ2VGZWVkUm93W119ICovIChhd2FpdCBkYlxuICAgICAgLm5ld1F1ZXJ5KClcbiAgICAgIC5mcm9tKFRBQkxFX05BTUUpXG4gICAgICAud2hlcmUoe2lkfSlcbiAgICAgIC5saW1pdCgxKVxuICAgICAgLnJlc3VsdHMoKSlcblxuICAgIHJldHVybiByb3dzWzBdID8gdGhpcy5fbm9ybWFsaXplQ2hhbmdlUm93KHJvd3NbMF0pIDogbnVsbFxuICB9XG5cbiAgLyoqXG4gICAqIFJlc29sdmVzIGN1cnJlbnQgbGF0ZXN0IHNlcXVlbmNlIHdpdGhvdXQgcmVhZGluZXNzIGNoZWNrcy5cbiAgICogQHBhcmFtIHtpbXBvcnQoXCIuLi9kYXRhYmFzZS9kcml2ZXJzL2Jhc2UuanNcIikuZGVmYXVsdH0gZGIgLSBEYXRhYmFzZSBjb25uZWN0aW9uLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxudW1iZXI+fSAtIExhdGVzdCBzZXF1ZW5jZS5cbiAgICovXG4gIGFzeW5jIF9sYXRlc3RTZXF1ZW5jZShkYikge1xuICAgIGNvbnN0IHJvd3MgPSAvKiogQHR5cGUge0FycmF5PHtzZXJ2ZXJfc2VxdWVuY2U/OiBudW1iZXIgfCBzdHJpbmd9Pn0gKi8gKGF3YWl0IGRiXG4gICAgICAubmV3UXVlcnkoKVxuICAgICAgLmZyb20oVEFCTEVfTkFNRSlcbiAgICAgIC5vcmRlcihcInNlcnZlcl9zZXF1ZW5jZSBERVNDXCIpXG4gICAgICAubGltaXQoMSlcbiAgICAgIC5yZXN1bHRzKCkpXG5cbiAgICByZXR1cm4gcm93c1swXSA/IE51bWJlcihyb3dzWzBdLnNlcnZlcl9zZXF1ZW5jZSkgOiAwXG4gIH1cblxuICAvKipcbiAgICogUmVzb2x2ZXMgY3VycmVudCBvbGRlc3Qgc2VxdWVuY2Ugd2l0aG91dCByZWFkaW5lc3MgY2hlY2tzLlxuICAgKiBAcGFyYW0ge2ltcG9ydChcIi4uL2RhdGFiYXNlL2RyaXZlcnMvYmFzZS5qc1wiKS5kZWZhdWx0fSBkYiAtIERhdGFiYXNlIGNvbm5lY3Rpb24uXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPG51bWJlciB8IG51bGw+fSAtIE9sZGVzdCBzZXF1ZW5jZS5cbiAgICovXG4gIGFzeW5jIF9vbGRlc3RTZXF1ZW5jZShkYikge1xuICAgIGNvbnN0IHJvd3MgPSAvKiogQHR5cGUge0FycmF5PHtzZXJ2ZXJfc2VxdWVuY2U/OiBudW1iZXIgfCBzdHJpbmd9Pn0gKi8gKGF3YWl0IGRiXG4gICAgICAubmV3UXVlcnkoKVxuICAgICAgLmZyb20oVEFCTEVfTkFNRSlcbiAgICAgIC5vcmRlcihcInNlcnZlcl9zZXF1ZW5jZSBBU0NcIilcbiAgICAgIC5saW1pdCgxKVxuICAgICAgLnJlc3VsdHMoKSlcblxuICAgIHJldHVybiByb3dzWzBdID8gTnVtYmVyKHJvd3NbMF0uc2VydmVyX3NlcXVlbmNlKSA6IG51bGxcbiAgfVxuXG4gIC8qKlxuICAgKiBQcnVuZXMgb2xkIHJldGFpbmVkIGNoYW5nZXMuXG4gICAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vZGF0YWJhc2UvZHJpdmVycy9iYXNlLmpzXCIpLmRlZmF1bHR9IGRiIC0gRGF0YWJhc2UgY29ubmVjdGlvbi5cbiAgICogQHBhcmFtIHtudW1iZXJ9IGxhdGVzdFNlcXVlbmNlIC0gTGF0ZXN0IHNlcXVlbmNlIGFmdGVyIGFwcGVuZC5cbiAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59IC0gUmVzb2x2ZXMgd2hlbiBjb21wbGV0ZS5cbiAgICovXG4gIGFzeW5jIF9wcnVuZVJldGFpbmVkQ2hhbmdlcyhkYiwgbGF0ZXN0U2VxdWVuY2UpIHtcbiAgICBpZiAoIU51bWJlci5pc0ludGVnZXIodGhpcy5yZXRlbnRpb25TaXplKSB8fCB0aGlzLnJldGVudGlvblNpemUgPCAxKSByZXR1cm5cblxuICAgIGNvbnN0IHBydW5lQmVmb3JlT3JBdCA9IGxhdGVzdFNlcXVlbmNlIC0gdGhpcy5yZXRlbnRpb25TaXplXG4gICAgaWYgKHBydW5lQmVmb3JlT3JBdCA8IDEpIHJldHVyblxuXG4gICAgY29uc3Qgcm93cyA9IC8qKiBAdHlwZSB7QXJyYXk8e2lkOiBzdHJpbmd9Pn0gKi8gKGF3YWl0IGRiXG4gICAgICAubmV3UXVlcnkoKVxuICAgICAgLmZyb20oVEFCTEVfTkFNRSlcbiAgICAgIC53aGVyZShgc2VydmVyX3NlcXVlbmNlIDw9ICR7ZGIucXVvdGUocHJ1bmVCZWZvcmVPckF0KX1gKVxuICAgICAgLnJlc3VsdHMoKSlcblxuICAgIGZvciAoY29uc3Qgcm93IG9mIHJvd3MpIHtcbiAgICAgIGF3YWl0IGRiLmRlbGV0ZSh7Y29uZGl0aW9uczoge2lkOiByb3cuaWR9LCB0YWJsZU5hbWU6IFRBQkxFX05BTUV9KVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBOb3JtYWxpemVzIGEgY2hhbmdlIHJvdy5cbiAgICogQHBhcmFtIHtTZXJ2ZXJDaGFuZ2VGZWVkUm93fSByb3cgLSBSYXcgZGF0YWJhc2Ugcm93LlxuICAgKiBAcmV0dXJucyB7U2VydmVyQ2hhbmdlRmVlZEVudHJ5fSAtIE5vcm1hbGl6ZWQgY2hhbmdlLlxuICAgKi9cbiAgX25vcm1hbGl6ZUNoYW5nZVJvdyhyb3cpIHtcbiAgICBjb25zdCBjcmVhdGVkQXRWYWx1ZSA9IHJvdy5jcmVhdGVkX2F0XG5cbiAgICByZXR1cm4ge1xuICAgICAgYWN0b3JEZXZpY2VJZDogcm93LmFjdG9yX2RldmljZV9pZCB8fCBudWxsLFxuICAgICAgYWN0b3JVc2VySWQ6IHJvdy5hY3Rvcl91c2VyX2lkIHx8IG51bGwsXG4gICAgICBhdHRyaWJ1dGVzOiBwYXJzZUpzb25Pck51bGwocm93LmF0dHJpYnV0ZXNfanNvbiksXG4gICAgICBjcmVhdGVkQXQ6IGNyZWF0ZWRBdFZhbHVlIGluc3RhbmNlb2YgRGF0ZSA/IGNyZWF0ZWRBdFZhbHVlLnRvSVNPU3RyaW5nKCkgOiBuZXcgRGF0ZShjcmVhdGVkQXRWYWx1ZSkudG9JU09TdHJpbmcoKSxcbiAgICAgIGlkOiByb3cuaWQsXG4gICAgICBpZGVtcG90ZW5jeUtleTogcm93LmlkZW1wb3RlbmN5X2tleSB8fCBudWxsLFxuICAgICAgbW9kZWw6IHJvdy5tb2RlbCxcbiAgICAgIG9wZXJhdGlvbjogcm93Lm9wZXJhdGlvbixcbiAgICAgIHBheWxvYWQ6IHBhcnNlSnNvbk9yTnVsbChyb3cucGF5bG9hZF9qc29uKSxcbiAgICAgIHJlY29yZElkOiByb3cucmVjb3JkX2lkIHx8IG51bGwsXG4gICAgICByZXNwb25zZTogcGFyc2VKc29uT3JOdWxsKHJvdy5yZXNwb25zZV9qc29uKSxcbiAgICAgIHNjb3BlOiBwYXJzZUpzb25Pck51bGwocm93LnNjb3BlX2pzb24pLFxuICAgICAgc2VydmVyU2VxdWVuY2U6IE51bWJlcihyb3cuc2VydmVyX3NlcXVlbmNlKVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRoaXMgc3RvcmUgc2hvdWxkIHVzZSBwcm9jZXNzLWxvY2FsIG1lbW9yeSBiZWNhdXNlIG5vIGRhdGFiYXNlIGlkZW50aWZpZXIgaXMgY29uZmlndXJlZC5cbiAgICogQHJldHVybnMge2Jvb2xlYW59IC0gV2hldGhlciBtZW1vcnkgc3RvcmFnZSBpcyBhY3RpdmUuXG4gICAqL1xuICBfdXNlc01lbW9yeVN0b3JhZ2UoKSB7XG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiAhdGhpcy5jb25maWd1cmF0aW9uLmdldERhdGFiYXNlQ29uZmlndXJhdGlvbigpW3RoaXMuZGF0YWJhc2VJZGVudGlmaWVyXVxuICAgIH0gY2F0Y2gge1xuICAgICAgcmV0dXJuIHRydWVcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQXBwZW5kcyBhIHByb2Nlc3MtbG9jYWwgbWVtb3J5IGVudHJ5IHdoZW4gbm8gZGF0YWJhc2UgaXMgY29uZmlndXJlZC5cbiAgICogQHBhcmFtIHtPbWl0PFNlcnZlckNoYW5nZUZlZWRFbnRyeSwgXCJzZXJ2ZXJTZXF1ZW5jZVwiPn0gY2hhbmdlIC0gQ2hhbmdlIHBheWxvYWQuXG4gICAqIEByZXR1cm5zIHtTZXJ2ZXJDaGFuZ2VGZWVkRW50cnl9IC0gQXBwZW5kZWQgZW50cnkuXG4gICAqL1xuICBfYXBwZW5kTWVtb3J5KGNoYW5nZSkge1xuICAgIGNvbnN0IGVudHJ5ID0gLyoqIEB0eXBlIHtTZXJ2ZXJDaGFuZ2VGZWVkRW50cnl9ICovICh7XG4gICAgICBhY3RvckRldmljZUlkOiBjaGFuZ2UuYWN0b3JEZXZpY2VJZCxcbiAgICAgIGFjdG9yVXNlcklkOiBjaGFuZ2UuYWN0b3JVc2VySWQsXG4gICAgICBhdHRyaWJ1dGVzOiBjaGFuZ2UuYXR0cmlidXRlcyB8fCBudWxsLFxuICAgICAgY3JlYXRlZEF0OiBjaGFuZ2UuY3JlYXRlZEF0LFxuICAgICAgaWQ6IGNoYW5nZS5pZCxcbiAgICAgIGlkZW1wb3RlbmN5S2V5OiBjaGFuZ2UuaWRlbXBvdGVuY3lLZXksXG4gICAgICBtb2RlbDogY2hhbmdlLm1vZGVsLFxuICAgICAgb3BlcmF0aW9uOiBjaGFuZ2Uub3BlcmF0aW9uLFxuICAgICAgcGF5bG9hZDogY2hhbmdlLnBheWxvYWQgfHwgbnVsbCxcbiAgICAgIHJlY29yZElkOiBjaGFuZ2UucmVjb3JkSWQgPT09IG51bGwgfHwgY2hhbmdlLnJlY29yZElkID09PSB1bmRlZmluZWQgPyBudWxsIDogU3RyaW5nKGNoYW5nZS5yZWNvcmRJZCksXG4gICAgICByZXNwb25zZTogY2hhbmdlLnJlc3BvbnNlIHx8IG51bGwsXG4gICAgICBzY29wZTogY2hhbmdlLnNjb3BlIHx8IG51bGwsXG4gICAgICBzZXJ2ZXJTZXF1ZW5jZTogKyt0aGlzLl9tZW1vcnlTZXF1ZW5jZVxuICAgIH0pXG5cbiAgICB0aGlzLl9tZW1vcnlDaGFuZ2VzLnB1c2goZW50cnkpXG4gICAgaWYgKHRoaXMuX21lbW9yeUNoYW5nZXMubGVuZ3RoID4gdGhpcy5yZXRlbnRpb25TaXplKSB0aGlzLl9tZW1vcnlDaGFuZ2VzLnNwbGljZSgwLCB0aGlzLl9tZW1vcnlDaGFuZ2VzLmxlbmd0aCAtIHRoaXMucmV0ZW50aW9uU2l6ZSlcblxuICAgIHJldHVybiBlbnRyeVxuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgYSBwcm9jZXNzLWxvY2FsIG1lbW9yeSBjaGFuZ2UgcGFnZS5cbiAgICogQHBhcmFtIHtvYmplY3R9IGFyZ3MgLSBBcmd1bWVudHMuXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBhcmdzLmFmdGVyU2VxdWVuY2UgLSBFeGNsdXNpdmUgbG93ZXIgYm91bmQuXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBhcmdzLmxpbWl0IC0gUGFnZSBzaXplLlxuICAgKiBAcGFyYW0ge251bWJlcn0gW2FyZ3MudXBUb1NlcXVlbmNlXSAtIEluY2x1c2l2ZSB1cHBlciBib3VuZC5cbiAgICogQHBhcmFtIHtSZWNvcmQ8c3RyaW5nLCA/Pn0gW2FyZ3Muc2NvcGVdIC0gQ2FsbGVyIHN5bmMgc2NvcGUuXG4gICAqIEByZXR1cm5zIHt7Y2hhbmdlczogU2VydmVyQ2hhbmdlRmVlZEVudHJ5W10sIGhhc01vcmU6IGJvb2xlYW4sIG5leHRTZXF1ZW5jZTogbnVtYmVyLCBvbGRlc3RTZXF1ZW5jZTogbnVtYmVyIHwgbnVsbCwgc25hcHNob3RSZXF1aXJlZDogYm9vbGVhbiwgdXBUb1NlcXVlbmNlOiBudW1iZXJ9fSAtIE9yZGVyZWQgcGFnZS5cbiAgICovXG4gIF9tZW1vcnlDaGFuZ2VzQWZ0ZXIoe2FmdGVyU2VxdWVuY2UsIGxpbWl0LCBzY29wZSwgdXBUb1NlcXVlbmNlfSkge1xuICAgIGNvbnN0IGxhdGVzdFNlcXVlbmNlID0gdHlwZW9mIHVwVG9TZXF1ZW5jZSA9PT0gXCJudW1iZXJcIiA/IHVwVG9TZXF1ZW5jZSA6IHRoaXMuX21lbW9yeVNlcXVlbmNlXG4gICAgY29uc3Qgb2xkZXN0U2VxdWVuY2UgPSB0aGlzLl9tZW1vcnlDaGFuZ2VzWzBdPy5zZXJ2ZXJTZXF1ZW5jZSB8fCBudWxsXG4gICAgY29uc3Qgc25hcHNob3RSZXF1aXJlZCA9IGFmdGVyU2VxdWVuY2UgPiAwICYmIG9sZGVzdFNlcXVlbmNlICE9PSBudWxsICYmIG9sZGVzdFNlcXVlbmNlID4gYWZ0ZXJTZXF1ZW5jZSArIDFcblxuICAgIGlmIChzbmFwc2hvdFJlcXVpcmVkKSB7XG4gICAgICByZXR1cm4ge2NoYW5nZXM6IFtdLCBoYXNNb3JlOiBmYWxzZSwgbmV4dFNlcXVlbmNlOiBhZnRlclNlcXVlbmNlLCBvbGRlc3RTZXF1ZW5jZSwgc25hcHNob3RSZXF1aXJlZDogdHJ1ZSwgdXBUb1NlcXVlbmNlOiBsYXRlc3RTZXF1ZW5jZX1cbiAgICB9XG5cbiAgICBjb25zdCByb3dzID0gdGhpcy5fbWVtb3J5Q2hhbmdlcy5maWx0ZXIoKGNoYW5nZSkgPT4ge1xuICAgICAgcmV0dXJuIGNoYW5nZS5zZXJ2ZXJTZXF1ZW5jZSA+IGFmdGVyU2VxdWVuY2UgJiYgY2hhbmdlLnNlcnZlclNlcXVlbmNlIDw9IGxhdGVzdFNlcXVlbmNlICYmIHNjb3Blc0VxdWFsKGNoYW5nZS5zY29wZSwgc2NvcGUpXG4gICAgfSlcbiAgICBjb25zdCBoYXNNb3JlID0gcm93cy5sZW5ndGggPiBsaW1pdFxuICAgIGNvbnN0IGNoYW5nZXMgPSByb3dzLnNsaWNlKDAsIGxpbWl0KVxuICAgIGNvbnN0IGxhc3RDaGFuZ2UgPSBjaGFuZ2VzW2NoYW5nZXMubGVuZ3RoIC0gMV1cblxuICAgIHJldHVybiB7Y2hhbmdlcywgaGFzTW9yZSwgbmV4dFNlcXVlbmNlOiBsYXN0Q2hhbmdlID8gbGFzdENoYW5nZS5zZXJ2ZXJTZXF1ZW5jZSA6IGFmdGVyU2VxdWVuY2UsIG9sZGVzdFNlcXVlbmNlLCBzbmFwc2hvdFJlcXVpcmVkOiBmYWxzZSwgdXBUb1NlcXVlbmNlOiBsYXRlc3RTZXF1ZW5jZX1cbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIHdpdGggZGIuXG4gICAqIEBwYXJhbSB7KGRiOiBpbXBvcnQoXCIuLi9kYXRhYmFzZS9kcml2ZXJzL2Jhc2UuanNcIikuZGVmYXVsdCkgPT4gUHJvbWlzZTw/Pn0gY2FsbGJhY2sgLSBDYWxsYmFjay5cbiAgICogQHJldHVybnMge1Byb21pc2U8Pz59IC0gQ2FsbGJhY2sgcmVzdWx0LlxuICAgKi9cbiAgYXN5bmMgX3dpdGhEYihjYWxsYmFjaykge1xuICAgIHJldHVybiBhd2FpdCB0aGlzLmNvbmZpZ3VyYXRpb24uZW5zdXJlQ29ubmVjdGlvbnMoe25hbWU6IFwiU2VydmVyIGNoYW5nZS1mZWVkIHN0b3JlXCJ9LCBhc3luYyAoZGJzKSA9PiB7XG4gICAgICBjb25zdCBkYiA9IGRic1t0aGlzLmRhdGFiYXNlSWRlbnRpZmllcl1cblxuICAgICAgaWYgKCFkYikgdGhyb3cgbmV3IEVycm9yKGBObyBkYXRhYmFzZSBjb25uZWN0aW9uIGF2YWlsYWJsZSBmb3IgaWRlbnRpZmllcjogJHt0aGlzLmRhdGFiYXNlSWRlbnRpZmllcn1gKVxuXG4gICAgICByZXR1cm4gYXdhaXQgY2FsbGJhY2soZGIpXG4gICAgfSlcbiAgfVxufVxuXG4vKipcbiAqIE5vcm1hbGl6ZXMgcGFnZSBsaW1pdC5cbiAqIEBwYXJhbSB7P30gbGltaXQgLSBSZXF1ZXN0ZWQgbGltaXQuXG4gKiBAcmV0dXJucyB7bnVtYmVyfSAtIFBhZ2Ugc2l6ZS5cbiAqL1xuZnVuY3Rpb24gbm9ybWFsaXplTGltaXQobGltaXQpIHtcbiAgaWYgKHR5cGVvZiBsaW1pdCA9PT0gXCJudW1iZXJcIiAmJiBOdW1iZXIuaXNJbnRlZ2VyKGxpbWl0KSAmJiBsaW1pdCA+IDApIHJldHVybiBNYXRoLm1pbihsaW1pdCwgTUFYX1BBR0VfU0laRSlcbiAgaWYgKHR5cGVvZiBsaW1pdCA9PT0gXCJzdHJpbmdcIiAmJiAvXlxcZCskLy50ZXN0KGxpbWl0KSkgcmV0dXJuIE1hdGgubWluKE51bWJlcihsaW1pdCksIE1BWF9QQUdFX1NJWkUpXG5cbiAgcmV0dXJuIERFRkFVTFRfUEFHRV9TSVpFXG59XG5cbi8qKlxuICogUGFyc2VzIEpTT04taXNoIHZhbHVlcy5cbiAqIEBwYXJhbSB7P30gdmFsdWUgLSBKU09OIHN0cmluZy5cbiAqIEByZXR1cm5zIHs/fSAtIFBhcnNlZCB2YWx1ZS5cbiAqL1xuZnVuY3Rpb24gcGFyc2VKc29uT3JOdWxsKHZhbHVlKSB7XG4gIGlmICh0eXBlb2YgdmFsdWUgIT09IFwic3RyaW5nXCIgfHwgdmFsdWUubGVuZ3RoIDwgMSkgcmV0dXJuIG51bGxcblxuICByZXR1cm4gSlNPTi5wYXJzZSh2YWx1ZSlcbn1cblxuLyoqXG4gKiBDb21wYXJlcyBzeW5jIHNjb3BlcyBieSBzdGFibGUgSlNPTiByZXByZXNlbnRhdGlvbi5cbiAqIEBwYXJhbSB7UmVjb3JkPHN0cmluZywgPz4gfCBudWxsfSBjaGFuZ2VTY29wZSAtIFBlcnNpc3RlZCBjaGFuZ2Ugc2NvcGUuXG4gKiBAcGFyYW0ge1JlY29yZDxzdHJpbmcsID8+IHwgdW5kZWZpbmVkfSByZXF1ZXN0ZWRTY29wZSAtIENhbGxlciBzY29wZS5cbiAqIEByZXR1cm5zIHtib29sZWFufSAtIFdoZXRoZXIgdGhlIGNoYW5nZSBpcyB2aXNpYmxlIGZvciB0aGUgcmVxdWVzdGVkIHNjb3BlLlxuICovXG5mdW5jdGlvbiBzY29wZXNFcXVhbChjaGFuZ2VTY29wZSwgcmVxdWVzdGVkU2NvcGUpIHtcbiAgaWYgKHJlcXVlc3RlZFNjb3BlID09PSB1bmRlZmluZWQpIHJldHVybiB0cnVlXG5cbiAgcmV0dXJuIHN0YWJsZUpzb25TdHJpbmdpZnkoY2hhbmdlU2NvcGUgfHwgbnVsbCkgPT09IHN0YWJsZUpzb25TdHJpbmdpZnkocmVxdWVzdGVkU2NvcGUpXG59XG5cbi8qKlxuICogU3RhYmxlIEpTT04gc2VyaWFsaXphdGlvbiBmb3IgcGVyc2lzdGVkIHN5bmMgc2NvcGVzLlxuICogQHBhcmFtIHs/fSB2YWx1ZSAtIEpTT04tY29tcGF0aWJsZSB2YWx1ZS5cbiAqIEByZXR1cm5zIHtzdHJpbmd9IC0gU3RhYmxlIEpTT04gcmVwcmVzZW50YXRpb24uXG4gKi9cbmZ1bmN0aW9uIHN0YWJsZUpzb25TdHJpbmdpZnkodmFsdWUpIHtcbiAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KHN0YWJsZUpzb25WYWx1ZSh2YWx1ZSkpXG59XG5cbi8qKlxuICogUHJvZHVjZXMgYSByZWN1cnNpdmVseSBrZXktc29ydGVkIEpTT04gdmFsdWUuXG4gKiBAcGFyYW0gez99IHZhbHVlIC0gSlNPTi1jb21wYXRpYmxlIHZhbHVlLlxuICogQHJldHVybnMgez99IC0gU3RhYmxlIEpTT04tY29tcGF0aWJsZSB2YWx1ZS5cbiAqL1xuZnVuY3Rpb24gc3RhYmxlSnNvblZhbHVlKHZhbHVlKSB7XG4gIGlmIChBcnJheS5pc0FycmF5KHZhbHVlKSkgcmV0dXJuIHZhbHVlLm1hcCgoaXRlbSkgPT4gc3RhYmxlSnNvblZhbHVlKGl0ZW0pKVxuICBpZiAoIXZhbHVlIHx8IHR5cGVvZiB2YWx1ZSAhPT0gXCJvYmplY3RcIikgcmV0dXJuIHZhbHVlXG5cbiAgcmV0dXJuIE9iamVjdC5rZXlzKHZhbHVlKS5zb3J0KCkucmVkdWNlKChtZW1vLCBrZXkpID0+IHtcbiAgICBtZW1vW2tleV0gPSBzdGFibGVKc29uVmFsdWUodmFsdWVba2V5XSlcblxuICAgIHJldHVybiBtZW1vXG4gIH0sIC8qKiBAdHlwZSB7UmVjb3JkPHN0cmluZywgPz59ICovICh7fSkpXG59XG5cbi8qKlxuICogQHR5cGVkZWYge29iamVjdH0gU2VydmVyQ2hhbmdlRmVlZEVudHJ5XG4gKiBAcHJvcGVydHkge3N0cmluZyB8IG51bGx9IGFjdG9yRGV2aWNlSWQgLSBTaWduZWQgbXV0YXRpb24gYWN0b3IgZGV2aWNlIGlkIHdoZW4gYXZhaWxhYmxlLlxuICogQHByb3BlcnR5IHtzdHJpbmcgfCBudWxsfSBhY3RvclVzZXJJZCAtIFNpZ25lZCBtdXRhdGlvbiBhY3RvciB1c2VyIGlkIHdoZW4gYXZhaWxhYmxlLlxuICogQHByb3BlcnR5IHtSZWNvcmQ8c3RyaW5nLCA/PiB8IG51bGx9IGF0dHJpYnV0ZXMgLSBTZXJpYWxpemVkIG11dGF0aW9uIGF0dHJpYnV0ZXMuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gY3JlYXRlZEF0IC0gU2VydmVyIGNoYW5nZSBjcmVhdGlvbiB0aW1lc3RhbXAuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gaWQgLSBTZXJ2ZXIgY2hhbmdlIGlkLlxuICogQHByb3BlcnR5IHtzdHJpbmcgfCBudWxsfSBpZGVtcG90ZW5jeUtleSAtIE11dGF0aW9uIGlkZW1wb3RlbmN5IGtleSB3aGVuIGF2YWlsYWJsZS5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBtb2RlbCAtIEZyb250ZW5kIG1vZGVsIG5hbWUuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gb3BlcmF0aW9uIC0gTXV0YXRpb24gb3BlcmF0aW9uLlxuICogQHByb3BlcnR5IHtSZWNvcmQ8c3RyaW5nLCA/PiB8IG51bGx9IHBheWxvYWQgLSBTZXJpYWxpemVkIG11dGF0aW9uIHBheWxvYWQuXG4gKiBAcHJvcGVydHkge3N0cmluZyB8IG51bGx9IHJlY29yZElkIC0gQ2hhbmdlZCByZWNvcmQgaWQgd2hlbiBrbm93bi5cbiAqIEBwcm9wZXJ0eSB7UmVjb3JkPHN0cmluZywgPz4gfCBudWxsfSByZXNwb25zZSAtIENvbW1hbmQgcmVzcG9uc2UgcGF5bG9hZC5cbiAqIEBwcm9wZXJ0eSB7UmVjb3JkPHN0cmluZywgPz4gfCBudWxsfSBzY29wZSAtIE9mZmxpbmUgZ3JhbnQgc2NvcGUuXG4gKiBAcHJvcGVydHkge251bWJlcn0gc2VydmVyU2VxdWVuY2UgLSBNb25vdG9uaWMgc2VydmVyIHNlcXVlbmNlLlxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge29iamVjdH0gU2VydmVyQ2hhbmdlRmVlZFJvd1xuICogQHByb3BlcnR5IHtzdHJpbmcgfCBudWxsfSBhY3Rvcl9kZXZpY2VfaWQgLSBBY3RvciBkZXZpY2UgaWQuXG4gKiBAcHJvcGVydHkge3N0cmluZyB8IG51bGx9IGFjdG9yX3VzZXJfaWQgLSBBY3RvciB1c2VyIGlkLlxuICogQHByb3BlcnR5IHtzdHJpbmcgfCBudWxsfSBhdHRyaWJ1dGVzX2pzb24gLSBBdHRyaWJ1dGVzIEpTT04uXG4gKiBAcHJvcGVydHkge0RhdGUgfCBzdHJpbmd9IGNyZWF0ZWRfYXQgLSBDcmVhdGlvbiB0aW1lLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IGlkIC0gRW50cnkgaWQuXG4gKiBAcHJvcGVydHkge3N0cmluZyB8IG51bGx9IGlkZW1wb3RlbmN5X2tleSAtIE11dGF0aW9uIGlkZW1wb3RlbmN5IGtleS5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBtb2RlbCAtIEZyb250ZW5kIG1vZGVsIG5hbWUuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gb3BlcmF0aW9uIC0gTXV0YXRpb24gb3BlcmF0aW9uLlxuICogQHByb3BlcnR5IHtzdHJpbmcgfCBudWxsfSBwYXlsb2FkX2pzb24gLSBNdXRhdGlvbiBwYXlsb2FkIEpTT04uXG4gKiBAcHJvcGVydHkge3N0cmluZyB8IG51bGx9IHJlY29yZF9pZCAtIFJlY29yZCBpZC5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nIHwgbnVsbH0gcmVzcG9uc2VfanNvbiAtIFJlc3BvbnNlIEpTT04uXG4gKiBAcHJvcGVydHkge3N0cmluZyB8IG51bGx9IHNjb3BlX2pzb24gLSBTY29wZSBKU09OLlxuICogQHByb3BlcnR5IHtudW1iZXIgfCBzdHJpbmd9IHNlcnZlcl9zZXF1ZW5jZSAtIFNlcnZlciBzZXF1ZW5jZS5cbiAqL1xuIl19
|
|
453
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VydmVyLWNoYW5nZS1mZWVkLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL3N5bmMvc2VydmVyLWNoYW5nZS1mZWVkLmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLFlBQVk7QUFFWixPQUFPLEVBQUMsVUFBVSxFQUFDLE1BQU0sUUFBUSxDQUFBO0FBQ2pDLE9BQU8sU0FBUyxNQUFNLGlDQUFpQyxDQUFBO0FBQ3ZELE9BQU8sbUJBQW1CLE1BQU0sa0JBQWtCLENBQUE7QUFFbEQsTUFBTSxzQkFBc0IsR0FBRyxLQUFLLENBQUE7QUFDcEMsTUFBTSxpQkFBaUIsR0FBRyxHQUFHLENBQUE7QUFDN0IsTUFBTSxhQUFhLEdBQUcsSUFBSSxDQUFBO0FBQzFCLE1BQU0sVUFBVSxHQUFHLDZCQUE2QixDQUFBO0FBQ2hELE1BQU0sTUFBTSxHQUFHLElBQUksT0FBTyxFQUFFLENBQUE7QUFFNUI7Ozs7R0FJRztBQUNILE1BQU0sVUFBVSxxQ0FBcUMsQ0FBQyxhQUFhO0lBQ2pFLElBQUksS0FBSyxHQUFHLE1BQU0sQ0FBQyxHQUFHLENBQUMsYUFBYSxDQUFDLENBQUE7SUFFckMsSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDO1FBQ1gsS0FBSyxHQUFHLElBQUkscUJBQXFCLENBQUMsRUFBQyxhQUFhLEVBQUMsQ0FBQyxDQUFBO1FBQ2xELE1BQU0sQ0FBQyxHQUFHLENBQUMsYUFBYSxFQUFFLEtBQUssQ0FBQyxDQUFBO0lBQ2xDLENBQUM7SUFFRCxPQUFPLEtBQUssQ0FBQTtBQUNkLENBQUM7QUFFRCxNQUFNLENBQUMsT0FBTyxPQUFPLHFCQUFxQjtJQUN4Qzs7Ozs7O09BTUc7SUFDSCxZQUFZLEVBQUMsYUFBYSxFQUFFLGtCQUFrQixHQUFHLFNBQVMsRUFBRSxhQUFhLEVBQUM7UUFDeEUsTUFBTSxpQkFBaUIsR0FBRyxhQUFhLENBQUMsb0JBQW9CLEVBQUUsQ0FBQTtRQUU5RCxJQUFJLENBQUMsYUFBYSxHQUFHLGFBQWEsQ0FBQTtR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LENBQUMsRUFBRSxhQUFhLENBQUMsQ0FBQTtJQUVuRyxPQUFPLGlCQUFpQixDQUFBO0FBQzFCLENBQUM7QUFFRDs7OztHQUlHO0FBQ0gsU0FBUyxlQUFlLENBQUMsS0FBSztJQUM1QixJQUFJLE9BQU8sS0FBSyxLQUFLLFFBQVEsSUFBSSxLQUFLLENBQUMsTUFBTSxHQUFHLENBQUM7UUFBRSxPQUFPLElBQUksQ0FBQTtJQUU5RCxPQUFPLElBQUksQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUE7QUFDMUIsQ0FBQztBQUVEOzs7OztHQUtHO0FBQ0gsU0FBUyxXQUFXLENBQUMsV0FBVyxFQUFFLGNBQWM7SUFDOUMsSUFBSSxjQUFjLEtBQUssU0FBUztRQUFFLE9BQU8sSUFBSSxDQUFBO0lBRTdDLE9BQU8sbUJBQW1CLENBQUMsV0FBVyxJQUFJLElBQUksQ0FBQyxLQUFLLG1CQUFtQixDQUFDLGNBQWMsQ0FBQyxDQUFBO0FBQ3pGLENBQUM7QUFFRDs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFFSDs7Ozs7Ozs7Ozs7Ozs7O0dBZUciLCJzb3VyY2VzQ29udGVudCI6WyIvLyBAdHMtY2hlY2tcblxuaW1wb3J0IHtyYW5kb21VVUlEfSBmcm9tIFwiY3J5cHRvXCJcbmltcG9ydCBUYWJsZURhdGEgZnJvbSBcIi4uL2RhdGFiYXNlL3RhYmxlLWRhdGEvaW5kZXguanNcIlxuaW1wb3J0IHN0YWJsZUpzb25TdHJpbmdpZnkgZnJvbSBcIi4vc3RhYmxlLWpzb24uanNcIlxuXG5jb25zdCBERUZBVUxUX1JFVEVOVElPTl9TSVpFID0gMTAwMDBcbmNvbnN0IERFRkFVTFRfUEFHRV9TSVpFID0gMTAwXG5jb25zdCBNQVhfUEFHRV9TSVpFID0gMTAwMFxuY29uc3QgVEFCTEVfTkFNRSA9IFwiZnJvbnRlbmRfbW9kZWxfc3luY19jaGFuZ2VzXCJcbmNvbnN0IHN0b3JlcyA9IG5ldyBXZWFrTWFwKClcblxuLyoqXG4gKiBTaGFyZWQgc2VydmVyIGNoYW5nZS1mZWVkIHN0b3JlIGZvciBhIGNvbmZpZ3VyYXRpb24uXG4gKiBAcGFyYW0ge2ltcG9ydChcIi4uL2NvbmZpZ3VyYXRpb24uanNcIikuZGVmYXVsdH0gY29uZmlndXJhdGlvbiAtIENvbmZpZ3VyYXRpb24uXG4gKiBAcmV0dXJucyB7U2VydmVyQ2hhbmdlRmVlZFN0b3JlfSAtIFN0b3JlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gc2VydmVyQ2hhbmdlRmVlZFN0b3JlRm9yQ29uZmlndXJhdGlvbihjb25maWd1cmF0aW9uKSB7XG4gIGxldCBzdG9yZSA9IHN0b3Jlcy5nZXQoY29uZmlndXJhdGlvbilcblxuICBpZiAoIXN0b3JlKSB7XG4gICAgc3RvcmUgPSBuZXcgU2VydmVyQ2hhbmdlRmVlZFN0b3JlKHtjb25maWd1cmF0aW9ufSlcbiAgICBzdG9yZXMuc2V0KGNvbmZpZ3VyYXRpb24sIHN0b3JlKVxuICB9XG5cbiAgcmV0dXJuIHN0b3JlXG59XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFNlcnZlckNoYW5nZUZlZWRTdG9yZSB7XG4gIC8qKlxuICAgKiBSdW5zIGNvbnN0cnVjdG9yLlxuICAgKiBAcGFyYW0ge29iamVjdH0gYXJncyAtIE9wdGlvbnMuXG4gICAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vY29uZmlndXJhdGlvbi5qc1wiKS5kZWZhdWx0fSBhcmdzLmNvbmZpZ3VyYXRpb24gLSBDb25maWd1cmF0aW9uLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gW2FyZ3MuZGF0YWJhc2VJZGVudGlmaWVyXSAtIERhdGFiYXNlIGlkZW50aWZpZXIuXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBbYXJncy5yZXRlbnRpb25TaXplXSAtIE51bWJlciBvZiBmZWVkIGVudHJpZXMgdG8gcmV0YWluLlxuICAgKi9cbiAgY29uc3RydWN0b3Ioe2NvbmZpZ3VyYXRpb24sIGRhdGFiYXNlSWRlbnRpZmllciA9IFwiZGVmYXVsdFwiLCByZXRlbnRpb25TaXplfSkge1xuICAgIGNvbnN0IHN5bmNDb25maWd1cmF0aW9uID0gY29uZmlndXJhdGlvbi5nZXRTeW5jQ29uZmlndXJhdGlvbigpXG5cbiAgICB0aGlzLmNvbmZpZ3VyYXRpb24gPSBjb25maWd1cmF0aW9uXG4gICAgdGhpcy5kYXRhYmFzZUlkZW50aWZpZXIgPSBkYXRhYmFzZUlkZW50aWZpZXJcbiAgICB0aGlzLnJldGVudGlvblNpemUgPSByZXRlbnRpb25TaXplIHx8IHN5bmNDb25maWd1cmF0aW9uLmNoYW5nZUZlZWRSZXRlbnRpb25TaXplIHx8IERFRkFVTFRfUkVURU5USU9OX1NJWkVcbiAgICAvKiogQHR5cGUge1NlcnZlckNoYW5nZUZlZWRFbnRyeVtdfSAqL1xuICAgIHRoaXMuX21lbW9yeUNoYW5nZXMgPSBbXVxuICAgIHRoaXMuX21lbW9yeVNlcXVlbmNlID0gMFxuICAgIHRoaXMuX2lzUmVhZHkgPSBmYWxzZVxuICAgIHRoaXMuX3JlYWR5UHJvbWlzZSA9IG51bGxcbiAgfVxuXG4gIC8qKlxuICAgKiBFbnN1cmVzIHRoZSBiYWNraW5nIHRhYmxlIGV4aXN0cy5cbiAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59IC0gUmVzb2x2ZXMgd2hlbiByZWFkeS5cbiAgICovXG4gIGFzeW5jIGVuc3VyZVJlYWR5KCkge1xuICAgIGlmICh0aGlzLl91c2VzTWVtb3J5U3RvcmFnZSgpKSB7XG4gICAgICB0aGlzLl9pc1JlYWR5ID0gdHJ1ZVxuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgaWYgKGF3YWl0IHRoaXMuX3NjaGVtYVJlYWR5KCkpIHJldHVyblxuICAgIGlmICh0aGlzLl9yZWFkeVByb21pc2UpIHJldHVybiBhd2FpdCB0aGlzLl9yZWFkeVByb21pc2VcblxuICAgIHRoaXMuX3JlYWR5UHJvbWlzZSA9IChhc3luYyAoKSA9PiB7XG4gICAgICB0aGlzLmNvbmZpZ3VyYXRpb24uc2V0Q3VycmVudCgpXG4gICAgICBhd2FpdCB0aGlzLl93aXRoRGIoYXN5bmMgKGRiKSA9PiB7XG4gICAgICAgIGF3YWl0IHRoaXMuX2Vuc3VyZUNoYW5nZXNUYWJsZShkYilcbiAgICAgIH0pXG4gICAgICB0aGlzLl9pc1JlYWR5ID0gdHJ1ZVxuICAgIH0pKClcblxuICAgIHRyeSB7XG4gICAgICBhd2FpdCB0aGlzLl9yZWFkeVByb21pc2VcbiAgICB9IGZpbmFsbHkge1xuICAgICAgaWYgKCF0aGlzLl9pc1JlYWR5KSB0aGlzLl9yZWFkeVByb21pc2UgPSBudWxsXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEFwcGVuZHMgYSBjaGFuZ2UgYW5kIGFzc2lnbnMgdGhlIG5leHQgc2VydmVyIHNlcXVlbmNlLlxuICAgKiBAcGFyYW0ge09taXQ8U2VydmVyQ2hhbmdlRmVlZEVudHJ5LCBcImNyZWF0ZWRBdFwiIHwgXCJpZFwiIHwgXCJzZXJ2ZXJTZXF1ZW5jZVwiPiAmIHtjcmVhdGVkQXQ/OiBzdHJpbmcsIGlkPzogc3RyaW5nfX0gY2hhbmdlIC0gQ2hhbmdlIHBheWxvYWQuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPFNlcnZlckNoYW5nZUZlZWRFbnRyeT59IC0gUGVyc2lzdGVkIGNoYW5nZS5cbiAgICovXG4gIGFzeW5jIGFwcGVuZChjaGFuZ2UpIHtcbiAgICBhd2FpdCB0aGlzLmVuc3VyZVJlYWR5KClcblxuICAgIGNvbnN0IGlkID0gY2hhbmdlLmlkIHx8IHJhbmRvbVVVSUQoKVxuICAgIGNvbnN0IGNyZWF0ZWRBdCA9IGNoYW5nZS5jcmVhdGVkQXQgfHwgbmV3IERhdGUoKS50b0lTT1N0cmluZygpXG5cbiAgICBpZiAodGhpcy5fdXNlc01lbW9yeVN0b3JhZ2UoKSkgcmV0dXJuIHRoaXMuX2FwcGVuZE1lbW9yeSh7Li4uY2hhbmdlLCBjcmVhdGVkQXQsIGlkfSlcblxuICAgIHJldHVybiBhd2FpdCB0aGlzLl93aXRoRGIoYXN5bmMgKGRiKSA9PiB7XG4gICAgICBhd2FpdCBkYi5pbnNlcnQoe1xuICAgICAgICB0YWJsZU5hbWU6IFRBQkxFX05BTUUsXG4gICAgICAgIGRhdGE6IHtcbiAgICAgICAgICBhY3Rvcl9kZXZpY2VfaWQ6IGNoYW5nZS5hY3RvckRldmljZUlkLFxuICAgICAgICAgIGFjdG9yX3VzZXJfaWQ6IGNoYW5nZS5hY3RvclVzZXJJZCxcbiAgICAgICAgICBhdHRyaWJ1dGVzX2pzb246IEpTT04uc3RyaW5naWZ5KGNoYW5nZS5hdHRyaWJ1dGVzIHx8IG51bGwpLFxuICAgICAgICAgIGNyZWF0ZWRfYXQ6IG5ldyBEYXRlKGNyZWF0ZWRBdCksXG4gICAgICAgICAgaWQsXG4gICAgICAgICAgaWRlbXBvdGVuY3lfa2V5OiBjaGFuZ2UuaWRlbXBvdGVuY3lLZXksXG4gICAgICAgICAgbW9kZWw6IGNoYW5nZS5tb2RlbCxcbiAgICAgICAgICBvcGVyYXRpb246IGNoYW5nZS5vcGVyYXRpb24sXG4gICAgICAgICAgcGF5bG9hZF9qc29uOiBKU09OLnN0cmluZ2lmeShjaGFuZ2UucGF5bG9hZCB8fCBudWxsKSxcbiAgICAgICAgICByZWNvcmRfaWQ6IGNoYW5nZS5yZWNvcmRJZCA9PT0gbnVsbCB8fCBjaGFuZ2UucmVjb3JkSWQgPT09IHVuZGVmaW5lZCA/IG51bGwgOiBTdHJpbmcoY2hhbmdlLnJlY29yZElkKSxcbiAgICAgICAgICByZXNwb25zZV9qc29uOiBKU09OLnN0cmluZ2lmeShjaGFuZ2UucmVzcG9uc2UgfHwgbnVsbCksXG4gICAgICAgICAgc2NvcGVfanNvbjogc3RhYmxlSnNvblN0cmluZ2lmeShjaGFuZ2Uuc2NvcGUgfHwgbnVsbClcbiAgICAgICAgfVxuICAgICAgfSlcblxuICAgICAgY29uc3Qgcm93ID0gYXdhaXQgdGhpcy5fY2hhbmdlQnlJZChkYiwgaWQpXG4gICAgICBpZiAoIXJvdykgdGhyb3cgbmV3IEVycm9yKFwiRmFpbGVkIHRvIHBlcnNpc3Qgc2VydmVyIGNoYW5nZS1mZWVkIGVudHJ5XCIpXG5cbiAgICAgIGF3YWl0IHRoaXMuX3BydW5lUmV0YWluZWRDaGFuZ2VzKGRiLCByb3cuc2VydmVyU2VxdWVuY2UpXG5cbiAgICAgIHJldHVybiByb3dcbiAgICB9KVxuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgY3VycmVudCBsYXRlc3Qgc2VydmVyIHNlcXVlbmNlLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxudW1iZXI+fSAtIExhdGVzdCBzZXF1ZW5jZS5cbiAgICovXG4gIGFzeW5jIGxhdGVzdFNlcXVlbmNlKCkge1xuICAgIGF3YWl0IHRoaXMuZW5zdXJlUmVhZHkoKVxuXG4gICAgaWYgKHRoaXMuX3VzZXNNZW1vcnlTdG9yYWdlKCkpIHJldHVybiB0aGlzLl9tZW1vcnlTZXF1ZW5jZVxuXG4gICAgcmV0dXJuIGF3YWl0IHRoaXMuX3dpdGhEYihhc3luYyAoZGIpID0+IHtcbiAgICAgIGNvbnN0IHJvd3MgPSBhd2FpdCBkYlxuICAgICAgICAubmV3UXVlcnkoKVxuICAgICAgICAuZnJvbShUQUJMRV9OQU1FKVxuICAgICAgICAub3JkZXIoXCJzZXJ2ZXJfc2VxdWVuY2UgREVTQ1wiKVxuICAgICAgICAubGltaXQoMSlcbiAgICAgICAgLnJlc3VsdHMoKVxuICAgICAgY29uc3Qgcm93ID0gLyoqIEB0eXBlIHt7c2VydmVyX3NlcXVlbmNlPzogbnVtYmVyIHwgc3RyaW5nfSB8IHVuZGVmaW5lZH0gKi8gKHJvd3NbMF0pXG5cbiAgICAgIHJldHVybiByb3cgPyBOdW1iZXIocm93LnNlcnZlcl9zZXF1ZW5jZSkgOiAwXG4gICAgfSlcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIG9sZGVzdCByZXRhaW5lZCBzZXJ2ZXIgc2VxdWVuY2UuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPG51bWJlciB8IG51bGw+fSAtIE9sZGVzdCByZXRhaW5lZCBzZXF1ZW5jZS5cbiAgICovXG4gIGFzeW5jIG9sZGVzdFNlcXVlbmNlKCkge1xuICAgIGF3YWl0IHRoaXMuZW5zdXJlUmVhZHkoKVxuXG4gICAgaWYgKHRoaXMuX3VzZXNNZW1vcnlTdG9yYWdlKCkpIHJldHVybiB0aGlzLl9tZW1vcnlDaGFuZ2VzWzBdPy5zZXJ2ZXJTZXF1ZW5jZSB8fCBudWxsXG5cbiAgICByZXR1cm4gYXdhaXQgdGhpcy5fd2l0aERiKGFzeW5jIChkYikgPT4gYXdhaXQgdGhpcy5fb2xkZXN0U2VxdWVuY2UoZGIpKVxuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgb3JkZXJlZCBjaGFuZ2VzIGFmdGVyIGEgY3Vyc29yLlxuICAgKiBAcGFyYW0ge29iamVjdH0gYXJncyAtIEFyZ3VtZW50cy5cbiAgICogQHBhcmFtIHtudW1iZXJ9IGFyZ3MuYWZ0ZXJTZXF1ZW5jZSAtIEV4Y2x1c2l2ZSBsb3dlciBib3VuZC5cbiAgICogQHBhcmFtIHtudW1iZXJ9IFthcmdzLmxpbWl0XSAtIE1heGltdW0gbnVtYmVyIG9mIGNoYW5nZXMuXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBbYXJncy51cFRvU2VxdWVuY2VdIC0gSW5jbHVzaXZlIHVwcGVyIGJvdW5kLlxuICAgKiBAcGFyYW0ge1JlY29yZDxzdHJpbmcsID8+fSBbYXJncy5zY29wZV0gLSBDYWxsZXIgc3luYyBzY29wZS5cbiAgICogQHJldHVybnMge1Byb21pc2U8e2NoYW5nZXM6IFNlcnZlckNoYW5nZUZlZWRFbnRyeVtdLCBoYXNNb3JlOiBib29sZWFuLCBuZXh0U2VxdWVuY2U6IG51bWJlciwgb2xkZXN0U2VxdWVuY2U6IG51bWJlciB8IG51bGwsIHNuYXBzaG90UmVxdWlyZWQ6IGJvb2xlYW4sIHVwVG9TZXF1ZW5jZTogbnVtYmVyfT59IC0gT3JkZXJlZCBwYWdlLlxuICAgKi9cbiAgYXN5bmMgY2hhbmdlc0FmdGVyKHthZnRlclNlcXVlbmNlLCBsaW1pdCA9IERFRkFVTFRfUEFHRV9TSVpFLCBzY29wZSwgdXBUb1NlcXVlbmNlfSkge1xuICAgIGF3YWl0IHRoaXMuZW5zdXJlUmVhZHkoKVxuXG4gICAgY29uc3QgcGFnZVNpemUgPSBub3JtYWxpemVMaW1pdChsaW1pdClcblxuICAgIGlmICh0aGlzLl91c2VzTWVtb3J5U3RvcmFnZSgpKSByZXR1cm4gdGhpcy5fbWVtb3J5Q2hhbmdlc0FmdGVyKHthZnRlclNlcXVlbmNlLCBsaW1pdDogcGFnZVNpemUsIHNjb3BlLCB1cFRvU2VxdWVuY2V9KVxuXG4gICAgcmV0dXJuIGF3YWl0IHRoaXMuX3dpdGhEYihhc3luYyAoZGIpID0+IHtcbiAgICAgIGNvbnN0IGxhdGVzdFNlcXVlbmNlID0gdHlwZW9mIHVwVG9TZXF1ZW5jZSA9PT0gXCJudW1iZXJcIiA/IHVwVG9TZXF1ZW5jZSA6IGF3YWl0IHRoaXMuX2xhdGVzdFNlcXVlbmNlKGRiKVxuICAgICAgY29uc3Qgb2xkZXN0U2VxdWVuY2UgPSBhd2FpdCB0aGlzLl9vbGRlc3RTZXF1ZW5jZShkYilcbiAgICAgIGNvbnN0IHNuYXBzaG90UmVxdWlyZWQgPSBhZnRlclNlcXVlbmNlID4gMCAmJiBvbGRlc3RTZXF1ZW5jZSAhPT0gbnVsbCAmJiBvbGRlc3RTZXF1ZW5jZSA+IGFmdGVyU2VxdWVuY2UgKyAxXG5cbiAgICAgIGlmIChzbmFwc2hvdFJlcXVpcmVkKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgY2hhbmdlczogW10sXG4gICAgICAgICAgaGFzTW9yZTogZmFsc2UsXG4gICAgICAgICAgbmV4dFNlcXVlbmNlOiBhZnRlclNlcXVlbmNlLFxuICAgICAgICAgIG9sZGVzdFNlcXVlbmNlLFxuICAgICAgICAgIHNuYXBzaG90UmVxdWlyZWQ6IHRydWUsXG4gICAgICAgICAgdXBUb1NlcXVlbmNlOiBsYXRlc3RTZXF1ZW5jZVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHJvd3MgPSAvKiogQHR5cGUge1NlcnZlckNoYW5nZUZlZWRSb3dbXX0gKi8gKGF3YWl0IGRiXG4gICAgICAgIC5uZXdRdWVyeSgpXG4gICAgICAgIC5mcm9tKFRBQkxFX05BTUUpXG4gICAgICAgIC53aGVyZShgc2VydmVyX3NlcXVlbmNlID4gJHtkYi5xdW90ZShhZnRlclNlcXVlbmNlKX1gKVxuICAgICAgICAud2hlcmUoYHNlcnZlcl9zZXF1ZW5jZSA8PSAke2RiLnF1b3RlKGxhdGVzdFNlcXVlbmNlKX1gKVxuICAgICAgICAud2hlcmUoc2NvcGUgPT09IHVuZGVmaW5lZCA/IFwiMSA9IDFcIiA6IHtzY29wZV9qc29uOiBzdGFibGVKc29uU3RyaW5naWZ5KHNjb3BlKX0pXG4gICAgICAgIC5vcmRlcihcInNlcnZlcl9zZXF1ZW5jZSBBU0NcIilcbiAgICAgICAgLmxpbWl0KHBhZ2VTaXplICsgMSlcbiAgICAgICAgLnJlc3VsdHMoKSlcbiAgICAgIGNvbnN0IGhhc01vcmUgPSByb3dzLmxlbmd0aCA+IHBhZ2VTaXplXG4gICAgICBjb25zdCBwYWdlUm93cyA9IHJvd3Muc2xpY2UoMCwgcGFnZVNpemUpXG4gICAgICBjb25zdCBjaGFuZ2VzID0gcGFnZVJvd3MubWFwKChyb3cpID0+IHRoaXMuX25vcm1hbGl6ZUNoYW5nZVJvdyhyb3cpKVxuICAgICAgY29uc3QgbGFzdENoYW5nZSA9IGNoYW5nZXNbY2hhbmdlcy5sZW5ndGggLSAxXVxuXG4gICAgICByZXR1cm4ge1xuICAgICAgICBjaGFuZ2VzLFxuICAgICAgICBoYXNNb3JlLFxuICAgICAgICBuZXh0U2VxdWVuY2U6IGxhc3RDaGFuZ2UgPyBsYXN0Q2hhbmdlLnNlcnZlclNlcXVlbmNlIDogYWZ0ZXJTZXF1ZW5jZSxcbiAgICAgICAgb2xkZXN0U2VxdWVuY2UsXG4gICAgICAgIHNuYXBzaG90UmVxdWlyZWQ6IGZhbHNlLFxuICAgICAgICB1cFRvU2VxdWVuY2U6IGxhdGVzdFNlcXVlbmNlXG4gICAgICB9XG4gICAgfSlcbiAgfVxuXG4gIC8qKlxuICAgKiBFbnN1cmVzIHNjaGVtYSBpcyBzdGlsbCBwcmVzZW50LlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxib29sZWFuPn0gLSBXaGV0aGVyIHJlYWR5LlxuICAgKi9cbiAgYXN5bmMgX3NjaGVtYVJlYWR5KCkge1xuICAgIGlmICh0aGlzLl91c2VzTWVtb3J5U3RvcmFnZSgpKSByZXR1cm4gdGhpcy5faXNSZWFkeVxuICAgIGlmICghdGhpcy5faXNSZWFkeSkgcmV0dXJuIGZhbHNlXG4gICAgaWYgKGF3YWl0IHRoaXMuX3dpdGhEYihhc3luYyAoZGIpID0+IGF3YWl0IGRiLnRhYmxlRXhpc3RzKFRBQkxFX05BTUUpKSkgcmV0dXJuIHRydWVcblxuICAgIHRoaXMuX2lzUmVhZHkgPSBmYWxzZVxuICAgIHRoaXMuX3JlYWR5UHJvbWlzZSA9IG51bGxcblxuICAgIHJldHVybiBmYWxzZVxuICB9XG5cbiAgLyoqXG4gICAqIEVuc3VyZXMgY2hhbmdlcyB0YWJsZSBleGlzdHMuXG4gICAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vZGF0YWJhc2UvZHJpdmVycy9iYXNlLmpzXCIpLmRlZmF1bHR9IGRiIC0gRGF0YWJhc2UgY29ubmVjdGlvbi5cbiAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59IC0gUmVzb2x2ZXMgd2hlbiBjb21wbGV0ZS5cbiAgICovXG4gIGFzeW5jIF9lbnN1cmVDaGFuZ2VzVGFibGUoZGIpIHtcbiAgICBpZiAoYXdhaXQgZGIudGFibGVFeGlzdHMoVEFCTEVfTkFNRSkpIHJldHVyblxuXG4gICAgY29uc3QgdGFibGUgPSBuZXcgVGFibGVEYXRhKFRBQkxFX05BTUUsIHtpZk5vdEV4aXN0czogdHJ1ZX0pXG5cbiAgICB0YWJsZS5pbnRlZ2VyKFwic2VydmVyX3NlcXVlbmNlXCIsIHthdXRvSW5jcmVtZW50OiB0cnVlLCBudWxsOiBmYWxzZSwgcHJpbWFyeUtleTogdHJ1ZX0pXG4gICAgdGFibGUuc3RyaW5nKFwiaWRcIiwge2luZGV4OiB0cnVlLCBudWxsOiBmYWxzZX0pXG4gICAgdGFibGUuc3RyaW5nKFwibW9kZWxcIiwge2luZGV4OiB0cnVlLCBudWxsOiBmYWxzZX0pXG4gICAgdGFibGUuc3RyaW5nKFwib3BlcmF0aW9uXCIsIHtudWxsOiBmYWxzZX0pXG4gICAgdGFibGUuc3RyaW5nKFwicmVjb3JkX2lkXCIsIHtpbmRleDogdHJ1ZSwgbnVsbDogdHJ1ZX0pXG4gICAgdGFibGUudGV4dChcInBheWxvYWRfanNvblwiLCB7bnVsbDogdHJ1ZX0pXG4gICAgdGFibGUudGV4dChcImF0dHJpYnV0ZXNfanNvblwiLCB7bnVsbDogdHJ1ZX0pXG4gICAgdGFibGUuc3RyaW5nKFwiaWRlbXBvdGVuY3lfa2V5XCIsIHtpbmRleDogdHJ1ZSwgbnVsbDogdHJ1ZX0pXG4gICAgdGFibGUuc3RyaW5nKFwiYWN0b3JfdXNlcl9pZFwiLCB7aW5kZXg6IHRydWUsIG51bGw6IHRydWV9KVxuICAgIHRhYmxlLnN0cmluZyhcImFjdG9yX2RldmljZV9pZFwiLCB7aW5kZXg6IHRydWUsIG51bGw6IHRydWV9KVxuICAgIHRhYmxlLnRleHQoXCJzY29wZV9qc29uXCIsIHtudWxsOiB0cnVlfSlcbiAgICB0YWJsZS50ZXh0KFwicmVzcG9uc2VfanNvblwiLCB7bnVsbDogdHJ1ZX0pXG4gICAgdGFibGUuZGF0ZXRpbWUoXCJjcmVhdGVkX2F0XCIsIHtpbmRleDogdHJ1ZSwgbnVsbDogZmFsc2V9KVxuXG4gICAgYXdhaXQgZGIuY3JlYXRlVGFibGUodGFibGUpXG4gIH1cblxuICAvKipcbiAgICogUmVzb2x2ZXMgYSBwZXJzaXN0ZWQgY2hhbmdlIGJ5IGlkLlxuICAgKiBAcGFyYW0ge2ltcG9ydChcIi4uL2RhdGFiYXNlL2RyaXZlcnMvYmFzZS5qc1wiKS5kZWZhdWx0fSBkYiAtIERhdGFiYXNlIGNvbm5lY3Rpb24uXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBpZCAtIEVudHJ5IGlkLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxTZXJ2ZXJDaGFuZ2VGZWVkRW50cnkgfCBudWxsPn0gLSBFbnRyeSBvciBudWxsLlxuICAgKi9cbiAgYXN5bmMgX2NoYW5nZUJ5SWQoZGIsIGlkKSB7XG4gICAgY29uc3Qgcm93cyA9IC8qKiBAdHlwZSB7U2VydmVyQ2hhbmdlRmVlZFJvd1tdfSAqLyAoYXdhaXQgZGJcbiAgICAgIC5uZXdRdWVyeSgpXG4gICAgICAuZnJvbShUQUJMRV9OQU1FKVxuICAgICAgLndoZXJlKHtpZH0pXG4gICAgICAubGltaXQoMSlcbiAgICAgIC5yZXN1bHRzKCkpXG5cbiAgICByZXR1cm4gcm93c1swXSA/IHRoaXMuX25vcm1hbGl6ZUNoYW5nZVJvdyhyb3dzWzBdKSA6IG51bGxcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXNvbHZlcyBjdXJyZW50IGxhdGVzdCBzZXF1ZW5jZSB3aXRob3V0IHJlYWRpbmVzcyBjaGVja3MuXG4gICAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vZGF0YWJhc2UvZHJpdmVycy9iYXNlLmpzXCIpLmRlZmF1bHR9IGRiIC0gRGF0YWJhc2UgY29ubmVjdGlvbi5cbiAgICogQHJldHVybnMge1Byb21pc2U8bnVtYmVyPn0gLSBMYXRlc3Qgc2VxdWVuY2UuXG4gICAqL1xuICBhc3luYyBfbGF0ZXN0U2VxdWVuY2UoZGIpIHtcbiAgICBjb25zdCByb3dzID0gLyoqIEB0eXBlIHtBcnJheTx7c2VydmVyX3NlcXVlbmNlPzogbnVtYmVyIHwgc3RyaW5nfT59ICovIChhd2FpdCBkYlxuICAgICAgLm5ld1F1ZXJ5KClcbiAgICAgIC5mcm9tKFRBQkxFX05BTUUpXG4gICAgICAub3JkZXIoXCJzZXJ2ZXJfc2VxdWVuY2UgREVTQ1wiKVxuICAgICAgLmxpbWl0KDEpXG4gICAgICAucmVzdWx0cygpKVxuXG4gICAgcmV0dXJuIHJvd3NbMF0gPyBOdW1iZXIocm93c1swXS5zZXJ2ZXJfc2VxdWVuY2UpIDogMFxuICB9XG5cbiAgLyoqXG4gICAqIFJlc29sdmVzIGN1cnJlbnQgb2xkZXN0IHNlcXVlbmNlIHdpdGhvdXQgcmVhZGluZXNzIGNoZWNrcy5cbiAgICogQHBhcmFtIHtpbXBvcnQoXCIuLi9kYXRhYmFzZS9kcml2ZXJzL2Jhc2UuanNcIikuZGVmYXVsdH0gZGIgLSBEYXRhYmFzZSBjb25uZWN0aW9uLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxudW1iZXIgfCBudWxsPn0gLSBPbGRlc3Qgc2VxdWVuY2UuXG4gICAqL1xuICBhc3luYyBfb2xkZXN0U2VxdWVuY2UoZGIpIHtcbiAgICBjb25zdCByb3dzID0gLyoqIEB0eXBlIHtBcnJheTx7c2VydmVyX3NlcXVlbmNlPzogbnVtYmVyIHwgc3RyaW5nfT59ICovIChhd2FpdCBkYlxuICAgICAgLm5ld1F1ZXJ5KClcbiAgICAgIC5mcm9tKFRBQkxFX05BTUUpXG4gICAgICAub3JkZXIoXCJzZXJ2ZXJfc2VxdWVuY2UgQVNDXCIpXG4gICAgICAubGltaXQoMSlcbiAgICAgIC5yZXN1bHRzKCkpXG5cbiAgICByZXR1cm4gcm93c1swXSA/IE51bWJlcihyb3dzWzBdLnNlcnZlcl9zZXF1ZW5jZSkgOiBudWxsXG4gIH1cblxuICAvKipcbiAgICogUHJ1bmVzIG9sZCByZXRhaW5lZCBjaGFuZ2VzLlxuICAgKiBAcGFyYW0ge2ltcG9ydChcIi4uL2RhdGFiYXNlL2RyaXZlcnMvYmFzZS5qc1wiKS5kZWZhdWx0fSBkYiAtIERhdGFiYXNlIGNvbm5lY3Rpb24uXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBsYXRlc3RTZXF1ZW5jZSAtIExhdGVzdCBzZXF1ZW5jZSBhZnRlciBhcHBlbmQuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fSAtIFJlc29sdmVzIHdoZW4gY29tcGxldGUuXG4gICAqL1xuICBhc3luYyBfcHJ1bmVSZXRhaW5lZENoYW5nZXMoZGIsIGxhdGVzdFNlcXVlbmNlKSB7XG4gICAgaWYgKCFOdW1iZXIuaXNJbnRlZ2VyKHRoaXMucmV0ZW50aW9uU2l6ZSkgfHwgdGhpcy5yZXRlbnRpb25TaXplIDwgMSkgcmV0dXJuXG5cbiAgICBjb25zdCBwcnVuZUJlZm9yZU9yQXQgPSBsYXRlc3RTZXF1ZW5jZSAtIHRoaXMucmV0ZW50aW9uU2l6ZVxuICAgIGlmIChwcnVuZUJlZm9yZU9yQXQgPCAxKSByZXR1cm5cblxuICAgIGNvbnN0IHJvd3MgPSAvKiogQHR5cGUge0FycmF5PHtpZDogc3RyaW5nfT59ICovIChhd2FpdCBkYlxuICAgICAgLm5ld1F1ZXJ5KClcbiAgICAgIC5mcm9tKFRBQkxFX05BTUUpXG4gICAgICAud2hlcmUoYHNlcnZlcl9zZXF1ZW5jZSA8PSAke2RiLnF1b3RlKHBydW5lQmVmb3JlT3JBdCl9YClcbiAgICAgIC5yZXN1bHRzKCkpXG5cbiAgICBmb3IgKGNvbnN0IHJvdyBvZiByb3dzKSB7XG4gICAgICBhd2FpdCBkYi5kZWxldGUoe2NvbmRpdGlvbnM6IHtpZDogcm93LmlkfSwgdGFibGVOYW1lOiBUQUJMRV9OQU1FfSlcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogTm9ybWFsaXplcyBhIGNoYW5nZSByb3cuXG4gICAqIEBwYXJhbSB7U2VydmVyQ2hhbmdlRmVlZFJvd30gcm93IC0gUmF3IGRhdGFiYXNlIHJvdy5cbiAgICogQHJldHVybnMge1NlcnZlckNoYW5nZUZlZWRFbnRyeX0gLSBOb3JtYWxpemVkIGNoYW5nZS5cbiAgICovXG4gIF9ub3JtYWxpemVDaGFuZ2VSb3cocm93KSB7XG4gICAgY29uc3QgY3JlYXRlZEF0VmFsdWUgPSByb3cuY3JlYXRlZF9hdFxuXG4gICAgcmV0dXJuIHtcbiAgICAgIGFjdG9yRGV2aWNlSWQ6IHJvdy5hY3Rvcl9kZXZpY2VfaWQgfHwgbnVsbCxcbiAgICAgIGFjdG9yVXNlcklkOiByb3cuYWN0b3JfdXNlcl9pZCB8fCBudWxsLFxuICAgICAgYXR0cmlidXRlczogcGFyc2VKc29uT3JOdWxsKHJvdy5hdHRyaWJ1dGVzX2pzb24pLFxuICAgICAgY3JlYXRlZEF0OiBjcmVhdGVkQXRWYWx1ZSBpbnN0YW5jZW9mIERhdGUgPyBjcmVhdGVkQXRWYWx1ZS50b0lTT1N0cmluZygpIDogbmV3IERhdGUoY3JlYXRlZEF0VmFsdWUpLnRvSVNPU3RyaW5nKCksXG4gICAgICBpZDogcm93LmlkLFxuICAgICAgaWRlbXBvdGVuY3lLZXk6IHJvdy5pZGVtcG90ZW5jeV9rZXkgfHwgbnVsbCxcbiAgICAgIG1vZGVsOiByb3cubW9kZWwsXG4gICAgICBvcGVyYXRpb246IHJvdy5vcGVyYXRpb24sXG4gICAgICBwYXlsb2FkOiBwYXJzZUpzb25Pck51bGwocm93LnBheWxvYWRfanNvbiksXG4gICAgICByZWNvcmRJZDogcm93LnJlY29yZF9pZCB8fCBudWxsLFxuICAgICAgcmVzcG9uc2U6IHBhcnNlSnNvbk9yTnVsbChyb3cucmVzcG9uc2VfanNvbiksXG4gICAgICBzY29wZTogcGFyc2VKc29uT3JOdWxsKHJvdy5zY29wZV9qc29uKSxcbiAgICAgIHNlcnZlclNlcXVlbmNlOiBOdW1iZXIocm93LnNlcnZlcl9zZXF1ZW5jZSlcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogV2hldGhlciB0aGlzIHN0b3JlIHNob3VsZCB1c2UgcHJvY2Vzcy1sb2NhbCBtZW1vcnkgYmVjYXVzZSBubyBkYXRhYmFzZSBpZGVudGlmaWVyIGlzIGNvbmZpZ3VyZWQuXG4gICAqIEByZXR1cm5zIHtib29sZWFufSAtIFdoZXRoZXIgbWVtb3J5IHN0b3JhZ2UgaXMgYWN0aXZlLlxuICAgKi9cbiAgX3VzZXNNZW1vcnlTdG9yYWdlKCkge1xuICAgIHRyeSB7XG4gICAgICByZXR1cm4gIXRoaXMuY29uZmlndXJhdGlvbi5nZXREYXRhYmFzZUNvbmZpZ3VyYXRpb24oKVt0aGlzLmRhdGFiYXNlSWRlbnRpZmllcl1cbiAgICB9IGNhdGNoIHtcbiAgICAgIHJldHVybiB0cnVlXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEFwcGVuZHMgYSBwcm9jZXNzLWxvY2FsIG1lbW9yeSBlbnRyeSB3aGVuIG5vIGRhdGFiYXNlIGlzIGNvbmZpZ3VyZWQuXG4gICAqIEBwYXJhbSB7T21pdDxTZXJ2ZXJDaGFuZ2VGZWVkRW50cnksIFwic2VydmVyU2VxdWVuY2VcIj59IGNoYW5nZSAtIENoYW5nZSBwYXlsb2FkLlxuICAgKiBAcmV0dXJucyB7U2VydmVyQ2hhbmdlRmVlZEVudHJ5fSAtIEFwcGVuZGVkIGVudHJ5LlxuICAgKi9cbiAgX2FwcGVuZE1lbW9yeShjaGFuZ2UpIHtcbiAgICBjb25zdCBlbnRyeSA9IC8qKiBAdHlwZSB7U2VydmVyQ2hhbmdlRmVlZEVudHJ5fSAqLyAoe1xuICAgICAgYWN0b3JEZXZpY2VJZDogY2hhbmdlLmFjdG9yRGV2aWNlSWQsXG4gICAgICBhY3RvclVzZXJJZDogY2hhbmdlLmFjdG9yVXNlcklkLFxuICAgICAgYXR0cmlidXRlczogY2hhbmdlLmF0dHJpYnV0ZXMgfHwgbnVsbCxcbiAgICAgIGNyZWF0ZWRBdDogY2hhbmdlLmNyZWF0ZWRBdCxcbiAgICAgIGlkOiBjaGFuZ2UuaWQsXG4gICAgICBpZGVtcG90ZW5jeUtleTogY2hhbmdlLmlkZW1wb3RlbmN5S2V5LFxuICAgICAgbW9kZWw6IGNoYW5nZS5tb2RlbCxcbiAgICAgIG9wZXJhdGlvbjogY2hhbmdlLm9wZXJhdGlvbixcbiAgICAgIHBheWxvYWQ6IGNoYW5nZS5wYXlsb2FkIHx8IG51bGwsXG4gICAgICByZWNvcmRJZDogY2hhbmdlLnJlY29yZElkID09PSBudWxsIHx8IGNoYW5nZS5yZWNvcmRJZCA9PT0gdW5kZWZpbmVkID8gbnVsbCA6IFN0cmluZyhjaGFuZ2UucmVjb3JkSWQpLFxuICAgICAgcmVzcG9uc2U6IGNoYW5nZS5yZXNwb25zZSB8fCBudWxsLFxuICAgICAgc2NvcGU6IGNoYW5nZS5zY29wZSB8fCBudWxsLFxuICAgICAgc2VydmVyU2VxdWVuY2U6ICsrdGhpcy5fbWVtb3J5U2VxdWVuY2VcbiAgICB9KVxuXG4gICAgdGhpcy5fbWVtb3J5Q2hhbmdlcy5wdXNoKGVudHJ5KVxuICAgIGlmICh0aGlzLl9tZW1vcnlDaGFuZ2VzLmxlbmd0aCA+IHRoaXMucmV0ZW50aW9uU2l6ZSkgdGhpcy5fbWVtb3J5Q2hhbmdlcy5zcGxpY2UoMCwgdGhpcy5fbWVtb3J5Q2hhbmdlcy5sZW5ndGggLSB0aGlzLnJldGVudGlvblNpemUpXG5cbiAgICByZXR1cm4gZW50cnlcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIGEgcHJvY2Vzcy1sb2NhbCBtZW1vcnkgY2hhbmdlIHBhZ2UuXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBhcmdzIC0gQXJndW1lbnRzLlxuICAgKiBAcGFyYW0ge251bWJlcn0gYXJncy5hZnRlclNlcXVlbmNlIC0gRXhjbHVzaXZlIGxvd2VyIGJvdW5kLlxuICAgKiBAcGFyYW0ge251bWJlcn0gYXJncy5saW1pdCAtIFBhZ2Ugc2l6ZS5cbiAgICogQHBhcmFtIHtudW1iZXJ9IFthcmdzLnVwVG9TZXF1ZW5jZV0gLSBJbmNsdXNpdmUgdXBwZXIgYm91bmQuXG4gICAqIEBwYXJhbSB7UmVjb3JkPHN0cmluZywgPz59IFthcmdzLnNjb3BlXSAtIENhbGxlciBzeW5jIHNjb3BlLlxuICAgKiBAcmV0dXJucyB7e2NoYW5nZXM6IFNlcnZlckNoYW5nZUZlZWRFbnRyeVtdLCBoYXNNb3JlOiBib29sZWFuLCBuZXh0U2VxdWVuY2U6IG51bWJlciwgb2xkZXN0U2VxdWVuY2U6IG51bWJlciB8IG51bGwsIHNuYXBzaG90UmVxdWlyZWQ6IGJvb2xlYW4sIHVwVG9TZXF1ZW5jZTogbnVtYmVyfX0gLSBPcmRlcmVkIHBhZ2UuXG4gICAqL1xuICBfbWVtb3J5Q2hhbmdlc0FmdGVyKHthZnRlclNlcXVlbmNlLCBsaW1pdCwgc2NvcGUsIHVwVG9TZXF1ZW5jZX0pIHtcbiAgICBjb25zdCBsYXRlc3RTZXF1ZW5jZSA9IHR5cGVvZiB1cFRvU2VxdWVuY2UgPT09IFwibnVtYmVyXCIgPyB1cFRvU2VxdWVuY2UgOiB0aGlzLl9tZW1vcnlTZXF1ZW5jZVxuICAgIGNvbnN0IG9sZGVzdFNlcXVlbmNlID0gdGhpcy5fbWVtb3J5Q2hhbmdlc1swXT8uc2VydmVyU2VxdWVuY2UgfHwgbnVsbFxuICAgIGNvbnN0IHNuYXBzaG90UmVxdWlyZWQgPSBhZnRlclNlcXVlbmNlID4gMCAmJiBvbGRlc3RTZXF1ZW5jZSAhPT0gbnVsbCAmJiBvbGRlc3RTZXF1ZW5jZSA+IGFmdGVyU2VxdWVuY2UgKyAxXG5cbiAgICBpZiAoc25hcHNob3RSZXF1aXJlZCkge1xuICAgICAgcmV0dXJuIHtjaGFuZ2VzOiBbXSwgaGFzTW9yZTogZmFsc2UsIG5leHRTZXF1ZW5jZTogYWZ0ZXJTZXF1ZW5jZSwgb2xkZXN0U2VxdWVuY2UsIHNuYXBzaG90UmVxdWlyZWQ6IHRydWUsIHVwVG9TZXF1ZW5jZTogbGF0ZXN0U2VxdWVuY2V9XG4gICAgfVxuXG4gICAgY29uc3Qgcm93cyA9IHRoaXMuX21lbW9yeUNoYW5nZXMuZmlsdGVyKChjaGFuZ2UpID0+IHtcbiAgICAgIHJldHVybiBjaGFuZ2Uuc2VydmVyU2VxdWVuY2UgPiBhZnRlclNlcXVlbmNlICYmIGNoYW5nZS5zZXJ2ZXJTZXF1ZW5jZSA8PSBsYXRlc3RTZXF1ZW5jZSAmJiBzY29wZXNFcXVhbChjaGFuZ2Uuc2NvcGUsIHNjb3BlKVxuICAgIH0pXG4gICAgY29uc3QgaGFzTW9yZSA9IHJvd3MubGVuZ3RoID4gbGltaXRcbiAgICBjb25zdCBjaGFuZ2VzID0gcm93cy5zbGljZSgwLCBsaW1pdClcbiAgICBjb25zdCBsYXN0Q2hhbmdlID0gY2hhbmdlc1tjaGFuZ2VzLmxlbmd0aCAtIDFdXG5cbiAgICByZXR1cm4ge2NoYW5nZXMsIGhhc01vcmUsIG5leHRTZXF1ZW5jZTogbGFzdENoYW5nZSA/IGxhc3RDaGFuZ2Uuc2VydmVyU2VxdWVuY2UgOiBhZnRlclNlcXVlbmNlLCBvbGRlc3RTZXF1ZW5jZSwgc25hcHNob3RSZXF1aXJlZDogZmFsc2UsIHVwVG9TZXF1ZW5jZTogbGF0ZXN0U2VxdWVuY2V9XG4gIH1cblxuICAvKipcbiAgICogUnVucyB3aXRoIGRiLlxuICAgKiBAcGFyYW0geyhkYjogaW1wb3J0KFwiLi4vZGF0YWJhc2UvZHJpdmVycy9iYXNlLmpzXCIpLmRlZmF1bHQpID0+IFByb21pc2U8Pz59IGNhbGxiYWNrIC0gQ2FsbGJhY2suXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPD8+fSAtIENhbGxiYWNrIHJlc3VsdC5cbiAgICovXG4gIGFzeW5jIF93aXRoRGIoY2FsbGJhY2spIHtcbiAgICByZXR1cm4gYXdhaXQgdGhpcy5jb25maWd1cmF0aW9uLmVuc3VyZUNvbm5lY3Rpb25zKHtuYW1lOiBcIlNlcnZlciBjaGFuZ2UtZmVlZCBzdG9yZVwifSwgYXN5bmMgKGRicykgPT4ge1xuICAgICAgY29uc3QgZGIgPSBkYnNbdGhpcy5kYXRhYmFzZUlkZW50aWZpZXJdXG5cbiAgICAgIGlmICghZGIpIHRocm93IG5ldyBFcnJvcihgTm8gZGF0YWJhc2UgY29ubmVjdGlvbiBhdmFpbGFibGUgZm9yIGlkZW50aWZpZXI6ICR7dGhpcy5kYXRhYmFzZUlkZW50aWZpZXJ9YClcblxuICAgICAgcmV0dXJuIGF3YWl0IGNhbGxiYWNrKGRiKVxuICAgIH0pXG4gIH1cbn1cblxuLyoqXG4gKiBOb3JtYWxpemVzIHBhZ2UgbGltaXQuXG4gKiBAcGFyYW0gez99IGxpbWl0IC0gUmVxdWVzdGVkIGxpbWl0LlxuICogQHJldHVybnMge251bWJlcn0gLSBQYWdlIHNpemUuXG4gKi9cbmZ1bmN0aW9uIG5vcm1hbGl6ZUxpbWl0KGxpbWl0KSB7XG4gIGlmICh0eXBlb2YgbGltaXQgPT09IFwibnVtYmVyXCIgJiYgTnVtYmVyLmlzSW50ZWdlcihsaW1pdCkgJiYgbGltaXQgPiAwKSByZXR1cm4gTWF0aC5taW4obGltaXQsIE1BWF9QQUdFX1NJWkUpXG4gIGlmICh0eXBlb2YgbGltaXQgPT09IFwic3RyaW5nXCIgJiYgL15cXGQrJC8udGVzdChsaW1pdCkpIHJldHVybiBNYXRoLm1pbihOdW1iZXIobGltaXQpLCBNQVhfUEFHRV9TSVpFKVxuXG4gIHJldHVybiBERUZBVUxUX1BBR0VfU0laRVxufVxuXG4vKipcbiAqIFBhcnNlcyBKU09OLWlzaCB2YWx1ZXMuXG4gKiBAcGFyYW0gez99IHZhbHVlIC0gSlNPTiBzdHJpbmcuXG4gKiBAcmV0dXJucyB7P30gLSBQYXJzZWQgdmFsdWUuXG4gKi9cbmZ1bmN0aW9uIHBhcnNlSnNvbk9yTnVsbCh2YWx1ZSkge1xuICBpZiAodHlwZW9mIHZhbHVlICE9PSBcInN0cmluZ1wiIHx8IHZhbHVlLmxlbmd0aCA8IDEpIHJldHVybiBudWxsXG5cbiAgcmV0dXJuIEpTT04ucGFyc2UodmFsdWUpXG59XG5cbi8qKlxuICogQ29tcGFyZXMgc3luYyBzY29wZXMgYnkgc3RhYmxlIEpTT04gcmVwcmVzZW50YXRpb24uXG4gKiBAcGFyYW0ge1JlY29yZDxzdHJpbmcsID8+IHwgbnVsbH0gY2hhbmdlU2NvcGUgLSBQZXJzaXN0ZWQgY2hhbmdlIHNjb3BlLlxuICogQHBhcmFtIHtSZWNvcmQ8c3RyaW5nLCA/PiB8IHVuZGVmaW5lZH0gcmVxdWVzdGVkU2NvcGUgLSBDYWxsZXIgc2NvcGUuXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gLSBXaGV0aGVyIHRoZSBjaGFuZ2UgaXMgdmlzaWJsZSBmb3IgdGhlIHJlcXVlc3RlZCBzY29wZS5cbiAqL1xuZnVuY3Rpb24gc2NvcGVzRXF1YWwoY2hhbmdlU2NvcGUsIHJlcXVlc3RlZFNjb3BlKSB7XG4gIGlmIChyZXF1ZXN0ZWRTY29wZSA9PT0gdW5kZWZpbmVkKSByZXR1cm4gdHJ1ZVxuXG4gIHJldHVybiBzdGFibGVKc29uU3RyaW5naWZ5KGNoYW5nZVNjb3BlIHx8IG51bGwpID09PSBzdGFibGVKc29uU3RyaW5naWZ5KHJlcXVlc3RlZFNjb3BlKVxufVxuXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IFNlcnZlckNoYW5nZUZlZWRFbnRyeVxuICogQHByb3BlcnR5IHtzdHJpbmcgfCBudWxsfSBhY3RvckRldmljZUlkIC0gU2lnbmVkIG11dGF0aW9uIGFjdG9yIGRldmljZSBpZCB3aGVuIGF2YWlsYWJsZS5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nIHwgbnVsbH0gYWN0b3JVc2VySWQgLSBTaWduZWQgbXV0YXRpb24gYWN0b3IgdXNlciBpZCB3aGVuIGF2YWlsYWJsZS5cbiAqIEBwcm9wZXJ0eSB7UmVjb3JkPHN0cmluZywgPz4gfCBudWxsfSBhdHRyaWJ1dGVzIC0gU2VyaWFsaXplZCBtdXRhdGlvbiBhdHRyaWJ1dGVzLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IGNyZWF0ZWRBdCAtIFNlcnZlciBjaGFuZ2UgY3JlYXRpb24gdGltZXN0YW1wLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IGlkIC0gU2VydmVyIGNoYW5nZSBpZC5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nIHwgbnVsbH0gaWRlbXBvdGVuY3lLZXkgLSBNdXRhdGlvbiBpZGVtcG90ZW5jeSBrZXkgd2hlbiBhdmFpbGFibGUuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gbW9kZWwgLSBGcm9udGVuZCBtb2RlbCBuYW1lLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IG9wZXJhdGlvbiAtIE11dGF0aW9uIG9wZXJhdGlvbi5cbiAqIEBwcm9wZXJ0eSB7UmVjb3JkPHN0cmluZywgPz4gfCBudWxsfSBwYXlsb2FkIC0gU2VyaWFsaXplZCBtdXRhdGlvbiBwYXlsb2FkLlxuICogQHByb3BlcnR5IHtzdHJpbmcgfCBudWxsfSByZWNvcmRJZCAtIENoYW5nZWQgcmVjb3JkIGlkIHdoZW4ga25vd24uXG4gKiBAcHJvcGVydHkge1JlY29yZDxzdHJpbmcsID8+IHwgbnVsbH0gcmVzcG9uc2UgLSBDb21tYW5kIHJlc3BvbnNlIHBheWxvYWQuXG4gKiBAcHJvcGVydHkge1JlY29yZDxzdHJpbmcsID8+IHwgbnVsbH0gc2NvcGUgLSBPZmZsaW5lIGdyYW50IHNjb3BlLlxuICogQHByb3BlcnR5IHtudW1iZXJ9IHNlcnZlclNlcXVlbmNlIC0gTW9ub3RvbmljIHNlcnZlciBzZXF1ZW5jZS5cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IFNlcnZlckNoYW5nZUZlZWRSb3dcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nIHwgbnVsbH0gYWN0b3JfZGV2aWNlX2lkIC0gQWN0b3IgZGV2aWNlIGlkLlxuICogQHByb3BlcnR5IHtzdHJpbmcgfCBudWxsfSBhY3Rvcl91c2VyX2lkIC0gQWN0b3IgdXNlciBpZC5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nIHwgbnVsbH0gYXR0cmlidXRlc19qc29uIC0gQXR0cmlidXRlcyBKU09OLlxuICogQHByb3BlcnR5IHtEYXRlIHwgc3RyaW5nfSBjcmVhdGVkX2F0IC0gQ3JlYXRpb24gdGltZS5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBpZCAtIEVudHJ5IGlkLlxuICogQHByb3BlcnR5IHtzdHJpbmcgfCBudWxsfSBpZGVtcG90ZW5jeV9rZXkgLSBNdXRhdGlvbiBpZGVtcG90ZW5jeSBrZXkuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gbW9kZWwgLSBGcm9udGVuZCBtb2RlbCBuYW1lLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IG9wZXJhdGlvbiAtIE11dGF0aW9uIG9wZXJhdGlvbi5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nIHwgbnVsbH0gcGF5bG9hZF9qc29uIC0gTXV0YXRpb24gcGF5bG9hZCBKU09OLlxuICogQHByb3BlcnR5IHtzdHJpbmcgfCBudWxsfSByZWNvcmRfaWQgLSBSZWNvcmQgaWQuXG4gKiBAcHJvcGVydHkge3N0cmluZyB8IG51bGx9IHJlc3BvbnNlX2pzb24gLSBSZXNwb25zZSBKU09OLlxuICogQHByb3BlcnR5IHtzdHJpbmcgfCBudWxsfSBzY29wZV9qc29uIC0gU2NvcGUgSlNPTi5cbiAqIEBwcm9wZXJ0eSB7bnVtYmVyIHwgc3RyaW5nfSBzZXJ2ZXJfc2VxdWVuY2UgLSBTZXJ2ZXIgc2VxdWVuY2UuXG4gKi9cbiJdfQ==
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Serializes a JSON-compatible value with recursively sorted object keys, so
|
|
3
|
+
* equal values always produce byte-identical strings (used for sync scope and
|
|
4
|
+
* change-feed identity comparisons).
|
|
5
|
+
* @param {?} value - JSON-compatible value.
|
|
6
|
+
* @returns {string} - Stable JSON string.
|
|
7
|
+
*/
|
|
8
|
+
export default function stableJsonStringify(value: unknown): string;
|
|
9
|
+
//# sourceMappingURL=stable-json.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"stable-json.d.ts","sourceRoot":"","sources":["../../../src/sync/stable-json.js"],"names":[],"mappings":"AAEA;;;;;;GAMG;AACH,mDAHW,OAAC,GACC,MAAM,CAIlB"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
// @ts-check
|
|
2
|
+
/**
|
|
3
|
+
* Serializes a JSON-compatible value with recursively sorted object keys, so
|
|
4
|
+
* equal values always produce byte-identical strings (used for sync scope and
|
|
5
|
+
* change-feed identity comparisons).
|
|
6
|
+
* @param {?} value - JSON-compatible value.
|
|
7
|
+
* @returns {string} - Stable JSON string.
|
|
8
|
+
*/
|
|
9
|
+
export default function stableJsonStringify(value) {
|
|
10
|
+
return JSON.stringify(stableJsonValue(value));
|
|
11
|
+
}
|
|
12
|
+
/**
|
|
13
|
+
* Produces a recursively key-sorted JSON value.
|
|
14
|
+
* @param {?} value - JSON-compatible value.
|
|
15
|
+
* @returns {?} - Stable JSON-compatible value.
|
|
16
|
+
*/
|
|
17
|
+
function stableJsonValue(value) {
|
|
18
|
+
if (Array.isArray(value))
|
|
19
|
+
return value.map((item) => stableJsonValue(item));
|
|
20
|
+
if (!value || typeof value !== "object")
|
|
21
|
+
return value;
|
|
22
|
+
return Object.keys(value).sort().reduce((memo, key) => {
|
|
23
|
+
memo[key] = stableJsonValue(value[key]);
|
|
24
|
+
return memo;
|
|
25
|
+
}, /** @type {Record<string, ?>} */ ({}));
|
|
26
|
+
}
|
|
27
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RhYmxlLWpzb24uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvc3luYy9zdGFibGUtanNvbi5qcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxZQUFZO0FBRVo7Ozs7OztHQU1HO0FBQ0gsTUFBTSxDQUFDLE9BQU8sVUFBVSxtQkFBbUIsQ0FBQyxLQUFLO0lBQy9DLE9BQU8sSUFBSSxDQUFDLFNBQVMsQ0FBQyxlQUFlLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQTtBQUMvQyxDQUFDO0FBRUQ7Ozs7R0FJRztBQUNILFNBQVMsZUFBZSxDQUFDLEtBQUs7SUFDNUIsSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQztRQUFFLE9BQU8sS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUE7SUFDM0UsSUFBSSxDQUFDLEtBQUssSUFBSSxPQUFPLEtBQUssS0FBSyxRQUFRO1FBQUUsT0FBTyxLQUFLLENBQUE7SUFFckQsT0FBTyxNQUFNLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDLE1BQU0sQ0FBQyxDQUFDLElBQUksRUFBRSxHQUFHLEVBQUUsRUFBRTtRQUNwRCxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsZUFBZSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFBO1FBRXZDLE9BQU8sSUFBSSxDQUFBO0lBQ2IsQ0FBQyxFQUFFLGdDQUFnQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQTtBQUMzQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQHRzLWNoZWNrXG5cbi8qKlxuICogU2VyaWFsaXplcyBhIEpTT04tY29tcGF0aWJsZSB2YWx1ZSB3aXRoIHJlY3Vyc2l2ZWx5IHNvcnRlZCBvYmplY3Qga2V5cywgc29cbiAqIGVxdWFsIHZhbHVlcyBhbHdheXMgcHJvZHVjZSBieXRlLWlkZW50aWNhbCBzdHJpbmdzICh1c2VkIGZvciBzeW5jIHNjb3BlIGFuZFxuICogY2hhbmdlLWZlZWQgaWRlbnRpdHkgY29tcGFyaXNvbnMpLlxuICogQHBhcmFtIHs/fSB2YWx1ZSAtIEpTT04tY29tcGF0aWJsZSB2YWx1ZS5cbiAqIEByZXR1cm5zIHtzdHJpbmd9IC0gU3RhYmxlIEpTT04gc3RyaW5nLlxuICovXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBzdGFibGVKc29uU3RyaW5naWZ5KHZhbHVlKSB7XG4gIHJldHVybiBKU09OLnN0cmluZ2lmeShzdGFibGVKc29uVmFsdWUodmFsdWUpKVxufVxuXG4vKipcbiAqIFByb2R1Y2VzIGEgcmVjdXJzaXZlbHkga2V5LXNvcnRlZCBKU09OIHZhbHVlLlxuICogQHBhcmFtIHs/fSB2YWx1ZSAtIEpTT04tY29tcGF0aWJsZSB2YWx1ZS5cbiAqIEByZXR1cm5zIHs/fSAtIFN0YWJsZSBKU09OLWNvbXBhdGlibGUgdmFsdWUuXG4gKi9cbmZ1bmN0aW9uIHN0YWJsZUpzb25WYWx1ZSh2YWx1ZSkge1xuICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHJldHVybiB2YWx1ZS5tYXAoKGl0ZW0pID0+IHN0YWJsZUpzb25WYWx1ZShpdGVtKSlcbiAgaWYgKCF2YWx1ZSB8fCB0eXBlb2YgdmFsdWUgIT09IFwib2JqZWN0XCIpIHJldHVybiB2YWx1ZVxuXG4gIHJldHVybiBPYmplY3Qua2V5cyh2YWx1ZSkuc29ydCgpLnJlZHVjZSgobWVtbywga2V5KSA9PiB7XG4gICAgbWVtb1trZXldID0gc3RhYmxlSnNvblZhbHVlKHZhbHVlW2tleV0pXG5cbiAgICByZXR1cm4gbWVtb1xuICB9LCAvKiogQHR5cGUge1JlY29yZDxzdHJpbmcsID8+fSAqLyAoe30pKVxufVxuIl19
|