velocious 1.0.514 → 1.0.516
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/README.md +4 -3
- package/build/background-jobs/cron-expression.js +9 -9
- package/build/background-jobs/forked-runner-child.js +1 -1
- package/build/background-jobs/job-runner.js +21 -15
- package/build/background-jobs/json-socket.js +4 -0
- package/build/background-jobs/main.js +180 -18
- package/build/background-jobs/status-reporter.js +12 -5
- package/build/background-jobs/store.js +132 -50
- package/build/background-jobs/types.js +11 -3
- package/build/background-jobs/worker.js +9 -5
- package/build/beacon/client.js +13 -6
- package/build/configuration.js +54 -29
- package/build/controller.js +9 -3
- package/build/database/drivers/sqlite/base.js +1 -1
- package/build/database/drivers/sqlite/index.js +15 -14
- package/build/database/migrations-ledger.js +16 -16
- package/build/database/pool/async-tracked-multi-connection.js +16 -0
- package/build/database/pool/base.js +26 -0
- package/build/database/query/where-model-class-hash.js +2 -0
- package/build/database/query/with-count.js +1 -1
- package/build/database/record/acts-as-list.js +2 -2
- package/build/database/record/auditing.js +23 -6
- package/build/database/record/index.js +7 -7
- package/build/database/record/validators/uniqueness.js +3 -3
- package/build/database/tenants/data-copier.js +23 -23
- package/build/database/tenants/schema-cloner.js +27 -27
- package/build/environment-handlers/browser.js +0 -1
- package/build/environment-handlers/node/cli/commands/background-jobs-runner.js +2 -1
- package/build/environment-handlers/node/cli/commands/lint/relationships.js +2 -2
- package/build/environment-handlers/node.js +1 -1
- package/build/frontend-model-controller.js +26 -18
- package/build/frontend-model-resource/base-resource.js +4 -4
- package/build/frontend-models/base.js +5 -5
- package/build/frontend-models/query.js +12 -12
- package/build/http-server/client/index.js +61 -15
- package/build/http-server/client/request-runner.js +7 -1
- package/build/http-server/client/response.js +17 -1
- package/build/http-server/client/websocket-session.js +13 -13
- package/build/http-server/server-client.js +96 -0
- package/build/http-server/websocket-channel.js +12 -11
- package/build/http-server/websocket-connection.js +12 -11
- package/build/http-server/websocket-events-host.js +1 -1
- package/build/http-server/worker-handler/in-process.js +48 -9
- package/build/http-server/worker-handler/index.js +67 -7
- package/build/http-server/worker-handler/worker-thread.js +68 -0
- package/build/src/background-jobs/cron-expression.d.ts +2 -2
- package/build/src/background-jobs/cron-expression.js +10 -10
- package/build/src/background-jobs/forked-runner-child.js +2 -2
- package/build/src/background-jobs/job-runner.d.ts +5 -1
- package/build/src/background-jobs/job-runner.d.ts.map +1 -1
- package/build/src/background-jobs/job-runner.js +22 -16
- package/build/src/background-jobs/json-socket.d.ts +4 -0
- package/build/src/background-jobs/json-socket.d.ts.map +1 -1
- package/build/src/background-jobs/json-socket.js +5 -1
- package/build/src/background-jobs/main.d.ts +62 -10
- package/build/src/background-jobs/main.d.ts.map +1 -1
- package/build/src/background-jobs/main.js +171 -19
- package/build/src/background-jobs/status-reporter.d.ts +6 -2
- package/build/src/background-jobs/status-reporter.d.ts.map +1 -1
- package/build/src/background-jobs/status-reporter.js +13 -6
- package/build/src/background-jobs/store.d.ts +48 -25
- package/build/src/background-jobs/store.d.ts.map +1 -1
- package/build/src/background-jobs/store.js +123 -50
- package/build/src/background-jobs/types.d.ts +36 -3
- package/build/src/background-jobs/types.d.ts.map +1 -1
- package/build/src/background-jobs/types.js +12 -4
- package/build/src/background-jobs/worker.d.ts +7 -5
- package/build/src/background-jobs/worker.d.ts.map +1 -1
- package/build/src/background-jobs/worker.js +10 -6
- package/build/src/beacon/client.d.ts +6 -3
- package/build/src/beacon/client.d.ts.map +1 -1
- package/build/src/beacon/client.js +14 -7
- package/build/src/configuration-types.d.ts +1 -1
- package/build/src/configuration.d.ts +42 -29
- package/build/src/configuration.d.ts.map +1 -1
- package/build/src/configuration.js +52 -30
- package/build/src/controller.d.ts +3 -0
- package/build/src/controller.d.ts.map +1 -1
- package/build/src/controller.js +9 -4
- package/build/src/database/drivers/sqlite/base.js +2 -2
- package/build/src/database/drivers/sqlite/index.d.ts +7 -6
- package/build/src/database/drivers/sqlite/index.d.ts.map +1 -1
- package/build/src/database/drivers/sqlite/index.js +16 -15
- package/build/src/database/migrations-ledger.d.ts +16 -16
- package/build/src/database/migrations-ledger.js +17 -17
- package/build/src/database/pool/async-tracked-multi-connection.d.ts +0 -11
- package/build/src/database/pool/async-tracked-multi-connection.d.ts.map +1 -1
- package/build/src/database/pool/async-tracked-multi-connection.js +16 -1
- package/build/src/database/pool/base.d.ts +21 -0
- package/build/src/database/pool/base.d.ts.map +1 -1
- package/build/src/database/pool/base.js +24 -1
- package/build/src/database/query/where-model-class-hash.d.ts.map +1 -1
- package/build/src/database/query/where-model-class-hash.js +3 -1
- package/build/src/database/query/with-count.js +2 -2
- package/build/src/database/record/acts-as-list.js +3 -3
- package/build/src/database/record/auditing.d.ts +1 -1
- package/build/src/database/record/auditing.d.ts.map +1 -1
- package/build/src/database/record/auditing.js +24 -7
- package/build/src/database/record/index.d.ts +7 -7
- package/build/src/database/record/index.js +8 -8
- package/build/src/database/record/validators/uniqueness.d.ts +3 -3
- package/build/src/database/record/validators/uniqueness.js +4 -4
- package/build/src/database/tenants/data-copier.d.ts +18 -18
- package/build/src/database/tenants/data-copier.js +24 -24
- package/build/src/database/tenants/schema-cloner.d.ts +27 -27
- package/build/src/database/tenants/schema-cloner.js +28 -28
- package/build/src/environment-handlers/browser.d.ts +9 -0
- package/build/src/environment-handlers/browser.d.ts.map +1 -1
- package/build/src/environment-handlers/browser.js +1 -2
- package/build/src/environment-handlers/node/cli/commands/background-jobs-runner.d.ts.map +1 -1
- package/build/src/environment-handlers/node/cli/commands/background-jobs-runner.js +3 -2
- package/build/src/environment-handlers/node/cli/commands/lint/relationships.js +3 -3
- package/build/src/environment-handlers/node.js +2 -2
- package/build/src/frontend-model-controller.d.ts +9 -8
- package/build/src/frontend-model-controller.d.ts.map +1 -1
- package/build/src/frontend-model-controller.js +26 -19
- package/build/src/frontend-model-resource/base-resource.js +5 -5
- package/build/src/frontend-models/base.d.ts +4 -4
- package/build/src/frontend-models/base.d.ts.map +1 -1
- package/build/src/frontend-models/base.js +6 -6
- package/build/src/frontend-models/query.d.ts +7 -7
- package/build/src/frontend-models/query.js +13 -13
- package/build/src/http-server/client/index.d.ts +23 -1
- package/build/src/http-server/client/index.d.ts.map +1 -1
- package/build/src/http-server/client/index.js +55 -17
- package/build/src/http-server/client/request-runner.d.ts.map +1 -1
- package/build/src/http-server/client/request-runner.js +8 -2
- package/build/src/http-server/client/response.d.ts +11 -1
- package/build/src/http-server/client/response.d.ts.map +1 -1
- package/build/src/http-server/client/response.js +16 -2
- package/build/src/http-server/client/websocket-session.d.ts +13 -13
- package/build/src/http-server/client/websocket-session.js +14 -14
- package/build/src/http-server/server-client.d.ts +13 -0
- package/build/src/http-server/server-client.d.ts.map +1 -1
- package/build/src/http-server/server-client.js +94 -1
- package/build/src/http-server/websocket-channel.d.ts +12 -11
- package/build/src/http-server/websocket-channel.d.ts.map +1 -1
- package/build/src/http-server/websocket-channel.js +13 -12
- package/build/src/http-server/websocket-connection.d.ts +12 -11
- package/build/src/http-server/websocket-connection.d.ts.map +1 -1
- package/build/src/http-server/websocket-connection.js +13 -12
- package/build/src/http-server/websocket-events-host.d.ts +1 -1
- package/build/src/http-server/websocket-events-host.js +2 -2
- package/build/src/http-server/worker-handler/in-process.d.ts +2 -0
- package/build/src/http-server/worker-handler/in-process.d.ts.map +1 -1
- package/build/src/http-server/worker-handler/in-process.js +42 -11
- package/build/src/http-server/worker-handler/index.d.ts +21 -0
- package/build/src/http-server/worker-handler/index.d.ts.map +1 -1
- package/build/src/http-server/worker-handler/index.js +61 -7
- package/build/src/http-server/worker-handler/worker-thread.d.ts +30 -0
- package/build/src/http-server/worker-handler/worker-thread.d.ts.map +1 -1
- package/build/src/http-server/worker-handler/worker-thread.js +61 -1
- package/build/src/sync/device-identity.d.ts +2 -2
- package/build/src/sync/device-identity.d.ts.map +1 -1
- package/build/src/sync/device-identity.js +4 -4
- package/build/src/sync/local-mutation-log.d.ts +0 -1
- package/build/src/sync/local-mutation-log.d.ts.map +1 -1
- package/build/src/sync/local-mutation-log.js +1 -2
- package/build/src/sync/query-scope.d.ts +5 -0
- package/build/src/sync/query-scope.d.ts.map +1 -1
- package/build/src/sync/query-scope.js +7 -2
- package/build/src/sync/sync-client-types.d.ts +2 -2
- package/build/src/sync/sync-client-types.d.ts.map +1 -1
- package/build/src/sync/sync-client-types.js +1 -1
- package/build/src/sync/sync-client.d.ts +17 -2
- package/build/src/sync/sync-client.d.ts.map +1 -1
- package/build/src/sync/sync-client.js +28 -14
- package/build/src/sync/sync-realtime-bridge.d.ts +6 -2
- package/build/src/sync/sync-realtime-bridge.d.ts.map +1 -1
- package/build/src/sync/sync-realtime-bridge.js +14 -3
- package/build/src/sync/sync-resource-base.d.ts +14 -3
- package/build/src/sync/sync-resource-base.d.ts.map +1 -1
- package/build/src/sync/sync-resource-base.js +20 -4
- package/build/src/sync/sync-scope-store.d.ts +3 -3
- package/build/src/sync/sync-scope-store.d.ts.map +1 -1
- package/build/src/sync/sync-scope-store.js +7 -5
- package/build/src/sync/sync-websocket-channel.d.ts +10 -0
- package/build/src/sync/sync-websocket-channel.d.ts.map +1 -1
- package/build/src/sync/sync-websocket-channel.js +20 -3
- package/build/src/tenants/tenant-iterator.d.ts +8 -8
- package/build/src/tenants/tenant-iterator.js +9 -9
- package/build/src/tenants/tenant.d.ts +6 -6
- package/build/src/tenants/tenant.js +7 -7
- package/build/src/testing/test-runner.d.ts +16 -0
- package/build/src/testing/test-runner.d.ts.map +1 -1
- package/build/src/testing/test-runner.js +79 -19
- package/build/sync/device-identity.js +3 -3
- package/build/sync/local-mutation-log.js +0 -1
- package/build/sync/query-scope.js +6 -1
- package/build/sync/sync-client-types.js +1 -1
- package/build/sync/sync-client.js +28 -15
- package/build/sync/sync-realtime-bridge.js +13 -2
- package/build/sync/sync-resource-base.js +20 -3
- package/build/sync/sync-scope-store.js +6 -4
- package/build/sync/sync-websocket-channel.js +18 -2
- package/build/tenants/tenant-iterator.js +8 -8
- package/build/tenants/tenant.js +6 -6
- package/build/testing/test-runner.js +86 -20
- package/package.json +2 -2
- package/src/background-jobs/cron-expression.js +9 -9
- package/src/background-jobs/forked-runner-child.js +1 -1
- package/src/background-jobs/job-runner.js +21 -15
- package/src/background-jobs/json-socket.js +4 -0
- package/src/background-jobs/main.js +180 -18
- package/src/background-jobs/status-reporter.js +12 -5
- package/src/background-jobs/store.js +132 -50
- package/src/background-jobs/types.js +11 -3
- package/src/background-jobs/worker.js +9 -5
- package/src/beacon/client.js +13 -6
- package/src/configuration.js +54 -29
- package/src/controller.js +9 -3
- package/src/database/drivers/sqlite/base.js +1 -1
- package/src/database/drivers/sqlite/index.js +15 -14
- package/src/database/migrations-ledger.js +16 -16
- package/src/database/pool/async-tracked-multi-connection.js +16 -0
- package/src/database/pool/base.js +26 -0
- package/src/database/query/where-model-class-hash.js +2 -0
- package/src/database/query/with-count.js +1 -1
- package/src/database/record/acts-as-list.js +2 -2
- package/src/database/record/auditing.js +23 -6
- package/src/database/record/index.js +7 -7
- package/src/database/record/validators/uniqueness.js +3 -3
- package/src/database/tenants/data-copier.js +23 -23
- package/src/database/tenants/schema-cloner.js +27 -27
- package/src/environment-handlers/browser.js +0 -1
- package/src/environment-handlers/node/cli/commands/background-jobs-runner.js +2 -1
- package/src/environment-handlers/node/cli/commands/lint/relationships.js +2 -2
- package/src/environment-handlers/node.js +1 -1
- package/src/frontend-model-controller.js +26 -18
- package/src/frontend-model-resource/base-resource.js +4 -4
- package/src/frontend-models/base.js +5 -5
- package/src/frontend-models/query.js +12 -12
- package/src/http-server/client/index.js +61 -15
- package/src/http-server/client/request-runner.js +7 -1
- package/src/http-server/client/response.js +17 -1
- package/src/http-server/client/websocket-session.js +13 -13
- package/src/http-server/server-client.js +96 -0
- package/src/http-server/websocket-channel.js +12 -11
- package/src/http-server/websocket-connection.js +12 -11
- package/src/http-server/websocket-events-host.js +1 -1
- package/src/http-server/worker-handler/in-process.js +48 -9
- package/src/http-server/worker-handler/index.js +67 -7
- package/src/http-server/worker-handler/worker-thread.js +68 -0
- package/src/sync/device-identity.js +3 -3
- package/src/sync/local-mutation-log.js +0 -1
- package/src/sync/query-scope.js +6 -1
- package/src/sync/sync-client-types.js +1 -1
- package/src/sync/sync-client.js +28 -15
- package/src/sync/sync-realtime-bridge.js +13 -2
- package/src/sync/sync-resource-base.js +20 -3
- package/src/sync/sync-scope-store.js +6 -4
- package/src/sync/sync-websocket-channel.js +18 -2
- package/src/tenants/tenant-iterator.js +8 -8
- package/src/tenants/tenant.js +6 -6
- package/src/testing/test-runner.js +86 -20
|
@@ -5,16 +5,16 @@ export default class VelociousDatabaseRecordValidatorsUniqueness extends Base {
|
|
|
5
5
|
* `new Task({project})`, the FK (`projectId`) is only flushed onto
|
|
6
6
|
* the attribute store during save — but the relationship object is
|
|
7
7
|
* already loaded and carries the id we need for the WHERE clause.
|
|
8
|
-
* @param {import("../index.js").default} model
|
|
8
|
+
* @param {import("../index.js").default} model - Record whose loaded relationship may supply the scope value.
|
|
9
9
|
* @param {string} scopeColumn - camelCase attribute name (e.g. `"projectId"`).
|
|
10
|
-
* @returns {string | number | null}
|
|
10
|
+
* @returns {string | number | null} - Value normalized for comparison.
|
|
11
11
|
*/
|
|
12
12
|
_resolveScopeValueFromRelationship(model: import("../index.js").default, scopeColumn: string): string | number | null;
|
|
13
13
|
/**
|
|
14
14
|
* Normalize the `scope` option into an array of attribute names.
|
|
15
15
|
* Supports string (`"userId"`), array of strings (`["userId", "projectId"]`),
|
|
16
16
|
* or absent (empty array — no scope, original single-column behavior).
|
|
17
|
-
* @returns {string[]}
|
|
17
|
+
* @returns {string[]} - Columns participating in the uniqueness check.
|
|
18
18
|
*/
|
|
19
19
|
_normalizeScopeColumns(): string[];
|
|
20
20
|
}
|
|
@@ -59,9 +59,9 @@ export default class VelociousDatabaseRecordValidatorsUniqueness extends Base {
|
|
|
59
59
|
* `new Task({project})`, the FK (`projectId`) is only flushed onto
|
|
60
60
|
* the attribute store during save — but the relationship object is
|
|
61
61
|
* already loaded and carries the id we need for the WHERE clause.
|
|
62
|
-
* @param {import("../index.js").default} model
|
|
62
|
+
* @param {import("../index.js").default} model - Record whose loaded relationship may supply the scope value.
|
|
63
63
|
* @param {string} scopeColumn - camelCase attribute name (e.g. `"projectId"`).
|
|
64
|
-
* @returns {string | number | null}
|
|
64
|
+
* @returns {string | number | null} - Value normalized for comparison.
|
|
65
65
|
*/
|
|
66
66
|
_resolveScopeValueFromRelationship(model, scopeColumn) {
|
|
67
67
|
const modelClass = /** @type {typeof import("../index.js").default} */ (model.constructor);
|
|
@@ -85,7 +85,7 @@ export default class VelociousDatabaseRecordValidatorsUniqueness extends Base {
|
|
|
85
85
|
* Normalize the `scope` option into an array of attribute names.
|
|
86
86
|
* Supports string (`"userId"`), array of strings (`["userId", "projectId"]`),
|
|
87
87
|
* or absent (empty array — no scope, original single-column behavior).
|
|
88
|
-
* @returns {string[]}
|
|
88
|
+
* @returns {string[]} - Columns participating in the uniqueness check.
|
|
89
89
|
*/
|
|
90
90
|
_normalizeScopeColumns() {
|
|
91
91
|
const scope = this.args?.scope;
|
|
@@ -96,4 +96,4 @@ export default class VelociousDatabaseRecordValidatorsUniqueness extends Base {
|
|
|
96
96
|
return [String(scope)];
|
|
97
97
|
}
|
|
98
98
|
}
|
|
99
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidW5pcXVlbmVzcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3NyYy9kYXRhYmFzZS9yZWNvcmQvdmFsaWRhdG9ycy91bmlxdWVuZXNzLmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLFlBQVk7QUFFWixPQUFPLElBQUksTUFBTSxXQUFXLENBQUE7QUFDNUIsT0FBTyxLQUFLLFVBQVUsTUFBTSxZQUFZLENBQUE7QUFDeEMsT0FBTyxpQkFBaUIsTUFBTSwyQkFBMkIsQ0FBQTtBQUV6RCxNQUFNLENBQUMsT0FBTyxPQUFPLDJDQUE0QyxTQUFRLElBQUk7SUFDM0U7Ozs7OztPQU1HO0lBQ0gsS0FBSyxDQUFDLFFBQVEsQ0FBQyxFQUFDLEtBQUssRUFBRSxhQUFhLEVBQUM7UUFDbkMsTUFBTSxVQUFVLEdBQUcsbURBQW1ELENBQUMsQ0FBQyxLQUFLLENBQUMsV0FBVyxDQUFDLENBQUE7UUFFMUYsTUFBTSxVQUFVLEdBQUcsVUFBVSxDQUFDLFVBQVUsRUFBRSxDQUFBO1FBQzFDLE1BQU0sU0FBUyxHQUFHLFVBQVUsQ0FBQyxTQUFTLEVBQUUsQ0FBQyxPQUFPLEVBQUUsQ0FBQTtRQUNsRCxNQUFNLGNBQWMsR0FBRyw4QkFBOEIsQ0FBQyxDQUFDLEtBQUssQ0FBQyxhQUFhLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQTtRQUMxRixNQUFNLHVCQUF1QixHQUFHLFVBQVUsQ0FBQyxVQUFVLENBQUMsYUFBYSxDQUFDLENBQUE7UUFFcEU7O3FEQUU2QztRQUM3QyxNQUFNLFNBQVMsR0FBRyxFQUFFLENBQUE7UUFFcEIsU0FBUyxDQUFDLHVCQUF1QixDQUFDLEdBQUcsY0FBYyxDQUFBO1FBRW5ELG9FQUFvRTtRQUNwRSxvRUFBb0U7UUFDcEUsNERBQTREO1FBQzVELE1BQU0sWUFBWSxHQUFHLElBQUksQ0FBQyxzQkFBc0IsRUFBRSxDQUFBO1FBRWxELEtBQUssTUFBTSxXQUFXLElBQUksWUFBWSxFQUFFLENBQUM7WUFDdkMsTUFB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QUE7WUFDcEIsQ0FBQztRQUNILENBQUM7UUFFRCxPQUFPLElBQUksQ0FBQTtJQUNiLENBQUM7SUFFRDs7Ozs7T0FLRztJQUNILHNCQUFzQjtRQUNwQixNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsSUFBSSxFQUFFLEtBQUssQ0FBQTtRQUU5QixJQUFJLENBQUMsS0FBSztZQUFFLE9BQU8sRUFBRSxDQUFBO1FBQ3JCLElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUM7WUFBRSxPQUFPLEtBQUssQ0FBQTtRQUV0QyxPQUFPLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUE7SUFDeEIsQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQHRzLWNoZWNrXG5cbmltcG9ydCBCYXNlIGZyb20gXCIuL2Jhc2UuanNcIlxuaW1wb3J0ICogYXMgaW5mbGVjdGlvbiBmcm9tIFwiaW5mbGVjdGlvblwiXG5pbXBvcnQgdmFsaWRhdGlvbk1lc3NhZ2UgZnJvbSBcIi4uL3ZhbGlkYXRpb24tbWVzc2FnZXMuanNcIlxuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBWZWxvY2lvdXNEYXRhYmFzZVJlY29yZFZhbGlkYXRvcnNVbmlxdWVuZXNzIGV4dGVuZHMgQmFzZSB7XG4gIC8qKlxuICAgKiBSdW5zIHZhbGlkYXRlLlxuICAgKiBAcGFyYW0ge29iamVjdH0gYXJncyAtIE9wdGlvbnMgb2JqZWN0LlxuICAgKiBAcGFyYW0ge2ltcG9ydChcIi4uL2luZGV4LmpzXCIpLmRlZmF1bHR9IGFyZ3MubW9kZWwgLSBNb2RlbCBpbnN0YW5jZS5cbiAgICogQHBhcmFtIHtzdHJpbmd9IGFyZ3MuYXR0cmlidXRlTmFtZSAtIEF0dHJpYnV0ZSBuYW1lLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn0gLSBSZXNvbHZlcyB3aGVuIGNvbXBsZXRlLlxuICAgKi9cbiAgYXN5bmMgdmFsaWRhdGUoe21vZGVsLCBhdHRyaWJ1dGVOYW1lfSkge1xuICAgIGNvbnN0IG1vZGVsQ2xhc3MgPSAvKiogQHR5cGUge3R5cGVvZiBpbXBvcnQoXCIuLi9pbmRleC5qc1wiKS5kZWZhdWx0fSAqLyAobW9kZWwuY29uc3RydWN0b3IpXG5cbiAgICBjb25zdCBjb25uZWN0aW9uID0gbW9kZWxDbGFzcy5jb25uZWN0aW9uKClcbiAgICBjb25zdCB0YWJsZU5hbWUgPSBtb2RlbENsYXNzLl9nZXRUYWJsZSgpLmdldE5hbWUoKVxuICAgIGNvbnN0IGF0dHJpYnV0ZVZhbHVlID0gLyoqIEB0eXBlIHtzdHJpbmcgfCBudW1iZXJ9ICovIChtb2RlbC5yZWFkQXR0cmlidXRlKGF0dHJpYnV0ZU5hbWUpKVxuICAgIGNvbnN0IGF0dHJpYnV0ZU5hbWVVbmRlcnNjb3JlID0gaW5mbGVjdGlvbi51bmRlcnNjb3JlKGF0dHJpYnV0ZU5hbWUpXG5cbiAgICAvKipcbiAgICAgKiBXaGVyZSBhcmdzLlxuICAgICAqIEB0eXBlIHtSZWNvcmQ8c3RyaW5nLCBzdHJpbmcgfCBudW1iZXI+fSAqL1xuICAgIGNvbnN0IHdoZXJlQXJncyA9IHt9XG5cbiAgICB3aGVyZUFyZ3NbYXR0cmlidXRlTmFtZVVuZGVyc2NvcmVdID0gYXR0cmlidXRlVmFsdWVcblxuICAgIC8vIFJhaWxzIHBhcml0eTogYHZhbGlkYXRlcyA6YXR0ciwgdW5pcXVlbmVzczoge3Njb3BlOiA6b3RoZXJ9YCBhZGRzXG4gICAgLy8gdGhlIHNjb3BlZCBjb2x1bW4ocykgdG8gdGhlIFdIRVJFIGNsYXVzZSBzbyB1bmlxdWVuZXNzIGlzIGNoZWNrZWRcbiAgICAvLyB3aXRoaW4gdGhlIGdpdmVuIHNjb3BlIChlLmcuIGByb2xlYCB1bmlxdWUgcGVyIGB1c2VySWRgKS5cbiAgICBjb25zdCBzY29wZUNvbHVtbnMgPSB0aGlzLl9ub3JtYWxpemVTY29wZUNvbHVtbnMoKVxuXG4gICAgZm9yIChjb25zdCBzY29wZUNvbHVtbiBvZiBzY29wZUNvbHVtbnMpIHtcbiAgICAgIGNvbnN0IHNjb3BlVW5kZXJzY29yZSA9IGluZmxlY3Rpb24udW5kZXJzY29yZShzY29wZUNvbHVtbilcbiAgICAgIGxldCBzY29wZVZhbHVlID0gbW9kZWwucmVhZEF0dHJpYnV0ZShzY29wZUNvbHVtbilcblxuICAgICAgLy8gV2hlbiB0aGUgRksgaGFzbid0IGJlZW4gZmx1c2hlZCBmcm9tIHRoZSByZWxhdGlvbnNoaXAgb2JqZWN0XG4gICAgICAvLyBvbnRvIHRoZSBhdHRyaWJ1dGUgc3RvcmUgeWV0IChlLmcuIGBuZXcgVGFzayh7cHJvamVjdH0pYCB3aGVyZVxuICAgICAgLy8gYHByb2plY3RJZGAgaXMgc3RpbGwgdW5kZWZpbmVkKSwgdHJ5IHJlc29sdmluZyBpdCBmcm9tIHRoZVxuICAgICAgLy8gbG9hZGVkIGJlbG9uZ3NUbyByZWxhdGlvbnNoaXAgaW5zdGVhZC5cbiAgICAgIGlmIChzY29wZVZhbHVlID09IG51bGwpIHtcbiAgICAgICAgc2NvcGVWYWx1ZSA9IHRoaXMuX3Jlc29sdmVTY29wZVZhbHVlRnJvbVJlbGF0aW9uc2hpcChtb2RlbCwgc2NvcGVDb2x1bW4pXG4gICAgICB9XG5cbiAgICAgIGlmIChzY29wZVZhbHVlID09IG51bGwpIHJldHVyblxuXG4gICAgICB3aGVyZUFyZ3Nbc2NvcGVVbmRlcnNjb3JlXSA9IC8qKiBAdHlwZSB7c3RyaW5nIHwgbnVtYmVyfSAqLyAoc2NvcGVWYWx1ZSlcbiAgICB9XG5cbiAgICBsZXQgZXhpc3RpbmdSZWNvcmRRdWVyeSA9IG1vZGVsQ2xhc3NcbiAgICAgIC5zZWxlY3QobW9kZWxDbGFzcy5wcmltYXJ5S2V5KCkpXG4gICAgICAud2hlcmUod2hlcmVBcmdzKVxuXG4gICAgaWYgKG1vZGVsLmlzUGVyc2lzdGVkKCkpIHtcbiAgICAgIGV4aXN0aW5nUmVjb3JkUXVlcnkud2hlcmUoYCR7Y29ubmVjdGlvbi5xdW90ZVRhYmxlKHRhYmxlTmFtZSl9LiR7Y29ubmVjdGlvbi5xdW90ZUNvbHVtbihtb2RlbENsYXNzLnByaW1hcnlLZXkoKSl9ICE9ICR7Y29ubmVjdGlvbi5xdW90ZShtb2RlbC5pZCgpKX1gKVxuICAgIH1cblxuICAgIGNvbnN0IGV4aXN0aW5nUmVjb3JkID0gYXdhaXQgZXhpc3RpbmdSZWNvcmRRdWVyeS5maXJzdCgpXG5cbiAgICBpZiAoZXhpc3RpbmdSZWNvcmQpIHtcbiAgICAgIGlmICghKGF0dHJpYnV0ZU5hbWUgaW4gbW9kZWwuX3ZhbGlkYXRpb25FcnJvcnMpKSBtb2RlbC5fdmFsaWRhdGlvbkVycm9yc1thdHRyaWJ1dGVOYW1lXSA9IFtdXG5cbiAgICAgIGNvbnN0IHRyYW5zbGF0b3IgPSBtb2RlbENsYXNzLl9nZXRDb25maWd1cmF0aW9uKCkuZ2V0VHJhbnNsYXRvcigpXG5cbiAgICAgIG1vZGVsLl92YWxpZGF0aW9uRXJyb3JzW2F0dHJpYnV0ZU5hbWVdLnB1c2goe3R5cGU6IFwidW5pcXVlbmVzc1wiLCBtZXNzYWdlOiB2YWxpZGF0aW9uTWVzc2FnZSh7dHJhbnNsYXRvciwgdHlwZTogXCJ0YWtlblwifSl9KVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBUcnkgdG8gcmVzb2x2ZSBhIHNjb3BlIGNvbHVtbiB2YWx1ZSBmcm9tIGEgbG9hZGVkIGJlbG9uZ3NUb1xuICAgKiByZWxhdGlvbnNoaXAgb24gdGhlIG1vZGVsLiBXaGVuIGEgVGFzayBpcyBjcmVhdGVkIHZpYVxuICAgKiBgbmV3IFRhc2soe3Byb2plY3R9KWAsIHRoZSBGSyAoYHByb2plY3RJZGApIGlzIG9ubHkgZmx1c2hlZCBvbnRvXG4gICAqIHRoZSBhdHRyaWJ1dGUgc3RvcmUgZHVyaW5nIHNhdmUg4oCUIGJ1dCB0aGUgcmVsYXRpb25zaGlwIG9iamVjdCBpc1xuICAgKiBhbHJlYWR5IGxvYWRlZCBhbmQgY2FycmllcyB0aGUgaWQgd2UgbmVlZCBmb3IgdGhlIFdIRVJFIGNsYXVzZS5cbiAgICogQHBhcmFtIHtpbXBvcnQoXCIuLi9pbmRleC5qc1wiKS5kZWZhdWx0fSBtb2RlbFxuICAgKiBAcGFyYW0ge3N0cmluZ30gc2NvcGVDb2x1bW4gLSBjYW1lbENhc2UgYXR0cmlidXRlIG5hbWUgKGUuZy4gYFwicHJvamVjdElkXCJgKS5cbiAgICogQHJldHVybnMge3N0cmluZyB8IG51bWJlciB8IG51bGx9XG4gICAqL1xuICBfcmVzb2x2ZVNjb3BlVmFsdWVGcm9tUmVsYXRpb25zaGlwKG1vZGVsLCBzY29wZUNvbHVtbikge1xuICAgIGNvbnN0IG1vZGVsQ2xhc3MgPSAvKiogQHR5cGUge3R5cGVvZiBpbXBvcnQoXCIuLi9pbmRleC5qc1wiKS5kZWZhdWx0fSAqLyAobW9kZWwuY29uc3RydWN0b3IpXG4gICAgY29uc3QgcmVsYXRpb25zaGlwcyA9IG1vZGVsQ2xhc3MuZ2V0UmVsYXRpb25zaGlwc01hcCgpXG5cbiAgICBmb3IgKGNvbnN0IHJlbGF0aW9uc2hpcE5hbWUgaW4gcmVsYXRpb25zaGlwcykge1xuICAgICAgY29uc3QgcmVsYXRpb25zaGlwID0gcmVsYXRpb25zaGlwc1tyZWxhdGlvbnNoaXBOYW1lXVxuXG4gICAgICBpZiAocmVsYXRpb25zaGlwLmdldFR5cGU/LigpICE9PSBcImJlbG9uZ3NUb1wiKSBjb250aW51ZVxuXG4gICAgICBjb25zdCBmb3JlaWduS2V5ID0gaW5mbGVjdGlvbi5jYW1lbGl6ZShyZWxhdGlvbnNoaXAuZ2V0Rm9yZWlnbktleSgpLCB0cnVlKVxuXG4gICAgICBpZiAoZm9yZWlnbktleSAhPT0gc2NvcGVDb2x1bW4pIGNvbnRpbnVlXG5cbiAgICAgIGNvbnN0IGluc3RhbmNlUmVsYXRpb25zaGlwID0gbW9kZWwuZ2V0UmVsYXRpb25zaGlwQnlOYW1lKHJlbGF0aW9uc2hpcE5hbWUpXG4gICAgICBjb25zdCBsb2FkZWQgPSBpbnN0YW5jZVJlbGF0aW9uc2hpcC5sb2FkZWQoKVxuXG4gICAgICBpZiAobG9hZGVkICYmICFBcnJheS5pc0FycmF5KGxvYWRlZCkgJiYgdHlwZW9mIGxvYWRlZC5pZCA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgIHJldHVybiBsb2FkZWQuaWQoKVxuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBudWxsXG4gIH1cblxuICAvKipcbiAgICogTm9ybWFsaXplIHRoZSBgc2NvcGVgIG9wdGlvbiBpbnRvIGFuIGFycmF5IG9mIGF0dHJpYnV0ZSBuYW1lcy5cbiAgICogU3VwcG9ydHMgc3RyaW5nIChgXCJ1c2VySWRcImApLCBhcnJheSBvZiBzdHJpbmdzIChgW1widXNlcklkXCIsIFwicHJvamVjdElkXCJdYCksXG4gICAqIG9yIGFic2VudCAoZW1wdHkgYXJyYXkg4oCUIG5vIHNjb3BlLCBvcmlnaW5hbCBzaW5nbGUtY29sdW1uIGJlaGF2aW9yKS5cbiAgICogQHJldHVybnMge3N0cmluZ1tdfVxuICAgKi9cbiAgX25vcm1hbGl6ZVNjb3BlQ29sdW1ucygpIHtcbiAgICBjb25zdCBzY29wZSA9IHRoaXMuYXJncz8uc2NvcGVcblxuICAgIGlmICghc2NvcGUpIHJldHVybiBbXVxuICAgIGlmIChBcnJheS5pc0FycmF5KHNjb3BlKSkgcmV0dXJuIHNjb3BlXG5cbiAgICByZXR1cm4gW1N0cmluZyhzY29wZSldXG4gIH1cbn1cbiJdfQ==
|
|
99
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidW5pcXVlbmVzcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3NyYy9kYXRhYmFzZS9yZWNvcmQvdmFsaWRhdG9ycy91bmlxdWVuZXNzLmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLFlBQVk7QUFFWixPQUFPLElBQUksTUFBTSxXQUFXLENBQUE7QUFDNUIsT0FBTyxLQUFLLFVBQVUsTUFBTSxZQUFZLENBQUE7QUFDeEMsT0FBTyxpQkFBaUIsTUFBTSwyQkFBMkIsQ0FBQTtBQUV6RCxNQUFNLENBQUMsT0FBTyxPQUFPLDJDQUE0QyxTQUFRLElBQUk7SUFDM0U7Ozs7OztPQU1HO0lBQ0gsS0FBSyxDQUFDLFFBQVEsQ0FBQyxFQUFDLEtBQUssRUFBRSxhQUFhLEVBQUM7UUFDbkMsTUFBTSxVQUFVLEdBQUcsbURBQW1ELENBQUMsQ0FBQyxLQUFLLENBQUMsV0FBVyxDQUFDLENBQUE7UUFFMUYsTUFBTSxVQUFVLEdBQUcsVUFBVSxDQUFDLFVBQVUsRUFBRSxDQUFBO1FBQzFDLE1BQU0sU0FBUyxHQUFHLFVBQVUsQ0FBQyxTQUFTLEVBQUUsQ0FBQyxPQUFPLEVBQUUsQ0FBQTtRQUNsRCxNQUFNLGNBQWMsR0FBRyw4QkFBOEIsQ0FBQyxDQUFDLEtBQUssQ0FBQyxhQUFhLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQTtRQUMxRixNQUFNLHVCQUF1QixHQUFHLFVBQVUsQ0FBQyxVQUFVLENBQUMsYUFBYSxDQUFDLENBQUE7UUFFcEU7O3FEQUU2QztRQUM3QyxNQUFNLFNBQVMsR0FBRyxFQUFFLENBQUE7UUFFcEIsU0FBUyxDQUFDLHVCQUF1QixDQUFDLEdBQUcsY0FBYyxDQUFBO1FBRW5ELG9FQUFvRTtRQUNwRSxvRUFBb0U7UUFDcEUsNERBQTREO1FBQzVELE1BQU0sWUFBWSxHQUFHLElBQUksQ0FBQyxzQkFBc0IsRUFBRSxDQUFBO1FBRWxELEtBQUssTUFBTSxXQUFXLElBQUksWUFBWSxFQUFFLENBQUM7WUFDdkMsTUFB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QUE7WUFDcEIsQ0FBQztRQUNILENBQUM7UUFFRCxPQUFPLElBQUksQ0FBQTtJQUNiLENBQUM7SUFFRDs7Ozs7T0FLRztJQUNILHNCQUFzQjtRQUNwQixNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsSUFBSSxFQUFFLEtBQUssQ0FBQTtRQUU5QixJQUFJLENBQUMsS0FBSztZQUFFLE9BQU8sRUFBRSxDQUFBO1FBQ3JCLElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUM7WUFBRSxPQUFPLEtBQUssQ0FBQTtRQUV0QyxPQUFPLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUE7SUFDeEIsQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQHRzLWNoZWNrXG5cbmltcG9ydCBCYXNlIGZyb20gXCIuL2Jhc2UuanNcIlxuaW1wb3J0ICogYXMgaW5mbGVjdGlvbiBmcm9tIFwiaW5mbGVjdGlvblwiXG5pbXBvcnQgdmFsaWRhdGlvbk1lc3NhZ2UgZnJvbSBcIi4uL3ZhbGlkYXRpb24tbWVzc2FnZXMuanNcIlxuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBWZWxvY2lvdXNEYXRhYmFzZVJlY29yZFZhbGlkYXRvcnNVbmlxdWVuZXNzIGV4dGVuZHMgQmFzZSB7XG4gIC8qKlxuICAgKiBSdW5zIHZhbGlkYXRlLlxuICAgKiBAcGFyYW0ge29iamVjdH0gYXJncyAtIE9wdGlvbnMgb2JqZWN0LlxuICAgKiBAcGFyYW0ge2ltcG9ydChcIi4uL2luZGV4LmpzXCIpLmRlZmF1bHR9IGFyZ3MubW9kZWwgLSBNb2RlbCBpbnN0YW5jZS5cbiAgICogQHBhcmFtIHtzdHJpbmd9IGFyZ3MuYXR0cmlidXRlTmFtZSAtIEF0dHJpYnV0ZSBuYW1lLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn0gLSBSZXNvbHZlcyB3aGVuIGNvbXBsZXRlLlxuICAgKi9cbiAgYXN5bmMgdmFsaWRhdGUoe21vZGVsLCBhdHRyaWJ1dGVOYW1lfSkge1xuICAgIGNvbnN0IG1vZGVsQ2xhc3MgPSAvKiogQHR5cGUge3R5cGVvZiBpbXBvcnQoXCIuLi9pbmRleC5qc1wiKS5kZWZhdWx0fSAqLyAobW9kZWwuY29uc3RydWN0b3IpXG5cbiAgICBjb25zdCBjb25uZWN0aW9uID0gbW9kZWxDbGFzcy5jb25uZWN0aW9uKClcbiAgICBjb25zdCB0YWJsZU5hbWUgPSBtb2RlbENsYXNzLl9nZXRUYWJsZSgpLmdldE5hbWUoKVxuICAgIGNvbnN0IGF0dHJpYnV0ZVZhbHVlID0gLyoqIEB0eXBlIHtzdHJpbmcgfCBudW1iZXJ9ICovIChtb2RlbC5yZWFkQXR0cmlidXRlKGF0dHJpYnV0ZU5hbWUpKVxuICAgIGNvbnN0IGF0dHJpYnV0ZU5hbWVVbmRlcnNjb3JlID0gaW5mbGVjdGlvbi51bmRlcnNjb3JlKGF0dHJpYnV0ZU5hbWUpXG5cbiAgICAvKipcbiAgICAgKiBXaGVyZSBhcmdzLlxuICAgICAqIEB0eXBlIHtSZWNvcmQ8c3RyaW5nLCBzdHJpbmcgfCBudW1iZXI+fSAqL1xuICAgIGNvbnN0IHdoZXJlQXJncyA9IHt9XG5cbiAgICB3aGVyZUFyZ3NbYXR0cmlidXRlTmFtZVVuZGVyc2NvcmVdID0gYXR0cmlidXRlVmFsdWVcblxuICAgIC8vIFJhaWxzIHBhcml0eTogYHZhbGlkYXRlcyA6YXR0ciwgdW5pcXVlbmVzczoge3Njb3BlOiA6b3RoZXJ9YCBhZGRzXG4gICAgLy8gdGhlIHNjb3BlZCBjb2x1bW4ocykgdG8gdGhlIFdIRVJFIGNsYXVzZSBzbyB1bmlxdWVuZXNzIGlzIGNoZWNrZWRcbiAgICAvLyB3aXRoaW4gdGhlIGdpdmVuIHNjb3BlIChlLmcuIGByb2xlYCB1bmlxdWUgcGVyIGB1c2VySWRgKS5cbiAgICBjb25zdCBzY29wZUNvbHVtbnMgPSB0aGlzLl9ub3JtYWxpemVTY29wZUNvbHVtbnMoKVxuXG4gICAgZm9yIChjb25zdCBzY29wZUNvbHVtbiBvZiBzY29wZUNvbHVtbnMpIHtcbiAgICAgIGNvbnN0IHNjb3BlVW5kZXJzY29yZSA9IGluZmxlY3Rpb24udW5kZXJzY29yZShzY29wZUNvbHVtbilcbiAgICAgIGxldCBzY29wZVZhbHVlID0gbW9kZWwucmVhZEF0dHJpYnV0ZShzY29wZUNvbHVtbilcblxuICAgICAgLy8gV2hlbiB0aGUgRksgaGFzbid0IGJlZW4gZmx1c2hlZCBmcm9tIHRoZSByZWxhdGlvbnNoaXAgb2JqZWN0XG4gICAgICAvLyBvbnRvIHRoZSBhdHRyaWJ1dGUgc3RvcmUgeWV0IChlLmcuIGBuZXcgVGFzayh7cHJvamVjdH0pYCB3aGVyZVxuICAgICAgLy8gYHByb2plY3RJZGAgaXMgc3RpbGwgdW5kZWZpbmVkKSwgdHJ5IHJlc29sdmluZyBpdCBmcm9tIHRoZVxuICAgICAgLy8gbG9hZGVkIGJlbG9uZ3NUbyByZWxhdGlvbnNoaXAgaW5zdGVhZC5cbiAgICAgIGlmIChzY29wZVZhbHVlID09IG51bGwpIHtcbiAgICAgICAgc2NvcGVWYWx1ZSA9IHRoaXMuX3Jlc29sdmVTY29wZVZhbHVlRnJvbVJlbGF0aW9uc2hpcChtb2RlbCwgc2NvcGVDb2x1bW4pXG4gICAgICB9XG5cbiAgICAgIGlmIChzY29wZVZhbHVlID09IG51bGwpIHJldHVyblxuXG4gICAgICB3aGVyZUFyZ3Nbc2NvcGVVbmRlcnNjb3JlXSA9IC8qKiBAdHlwZSB7c3RyaW5nIHwgbnVtYmVyfSAqLyAoc2NvcGVWYWx1ZSlcbiAgICB9XG5cbiAgICBsZXQgZXhpc3RpbmdSZWNvcmRRdWVyeSA9IG1vZGVsQ2xhc3NcbiAgICAgIC5zZWxlY3QobW9kZWxDbGFzcy5wcmltYXJ5S2V5KCkpXG4gICAgICAud2hlcmUod2hlcmVBcmdzKVxuXG4gICAgaWYgKG1vZGVsLmlzUGVyc2lzdGVkKCkpIHtcbiAgICAgIGV4aXN0aW5nUmVjb3JkUXVlcnkud2hlcmUoYCR7Y29ubmVjdGlvbi5xdW90ZVRhYmxlKHRhYmxlTmFtZSl9LiR7Y29ubmVjdGlvbi5xdW90ZUNvbHVtbihtb2RlbENsYXNzLnByaW1hcnlLZXkoKSl9ICE9ICR7Y29ubmVjdGlvbi5xdW90ZShtb2RlbC5pZCgpKX1gKVxuICAgIH1cblxuICAgIGNvbnN0IGV4aXN0aW5nUmVjb3JkID0gYXdhaXQgZXhpc3RpbmdSZWNvcmRRdWVyeS5maXJzdCgpXG5cbiAgICBpZiAoZXhpc3RpbmdSZWNvcmQpIHtcbiAgICAgIGlmICghKGF0dHJpYnV0ZU5hbWUgaW4gbW9kZWwuX3ZhbGlkYXRpb25FcnJvcnMpKSBtb2RlbC5fdmFsaWRhdGlvbkVycm9yc1thdHRyaWJ1dGVOYW1lXSA9IFtdXG5cbiAgICAgIGNvbnN0IHRyYW5zbGF0b3IgPSBtb2RlbENsYXNzLl9nZXRDb25maWd1cmF0aW9uKCkuZ2V0VHJhbnNsYXRvcigpXG5cbiAgICAgIG1vZGVsLl92YWxpZGF0aW9uRXJyb3JzW2F0dHJpYnV0ZU5hbWVdLnB1c2goe3R5cGU6IFwidW5pcXVlbmVzc1wiLCBtZXNzYWdlOiB2YWxpZGF0aW9uTWVzc2FnZSh7dHJhbnNsYXRvciwgdHlwZTogXCJ0YWtlblwifSl9KVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBUcnkgdG8gcmVzb2x2ZSBhIHNjb3BlIGNvbHVtbiB2YWx1ZSBmcm9tIGEgbG9hZGVkIGJlbG9uZ3NUb1xuICAgKiByZWxhdGlvbnNoaXAgb24gdGhlIG1vZGVsLiBXaGVuIGEgVGFzayBpcyBjcmVhdGVkIHZpYVxuICAgKiBgbmV3IFRhc2soe3Byb2plY3R9KWAsIHRoZSBGSyAoYHByb2plY3RJZGApIGlzIG9ubHkgZmx1c2hlZCBvbnRvXG4gICAqIHRoZSBhdHRyaWJ1dGUgc3RvcmUgZHVyaW5nIHNhdmUg4oCUIGJ1dCB0aGUgcmVsYXRpb25zaGlwIG9iamVjdCBpc1xuICAgKiBhbHJlYWR5IGxvYWRlZCBhbmQgY2FycmllcyB0aGUgaWQgd2UgbmVlZCBmb3IgdGhlIFdIRVJFIGNsYXVzZS5cbiAgICogQHBhcmFtIHtpbXBvcnQoXCIuLi9pbmRleC5qc1wiKS5kZWZhdWx0fSBtb2RlbCAtIFJlY29yZCB3aG9zZSBsb2FkZWQgcmVsYXRpb25zaGlwIG1heSBzdXBwbHkgdGhlIHNjb3BlIHZhbHVlLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gc2NvcGVDb2x1bW4gLSBjYW1lbENhc2UgYXR0cmlidXRlIG5hbWUgKGUuZy4gYFwicHJvamVjdElkXCJgKS5cbiAgICogQHJldHVybnMge3N0cmluZyB8IG51bWJlciB8IG51bGx9IC0gVmFsdWUgbm9ybWFsaXplZCBmb3IgY29tcGFyaXNvbi5cbiAgICovXG4gIF9yZXNvbHZlU2NvcGVWYWx1ZUZyb21SZWxhdGlvbnNoaXAobW9kZWwsIHNjb3BlQ29sdW1uKSB7XG4gICAgY29uc3QgbW9kZWxDbGFzcyA9IC8qKiBAdHlwZSB7dHlwZW9mIGltcG9ydChcIi4uL2luZGV4LmpzXCIpLmRlZmF1bHR9ICovIChtb2RlbC5jb25zdHJ1Y3RvcilcbiAgICBjb25zdCByZWxhdGlvbnNoaXBzID0gbW9kZWxDbGFzcy5nZXRSZWxhdGlvbnNoaXBzTWFwKClcblxuICAgIGZvciAoY29uc3QgcmVsYXRpb25zaGlwTmFtZSBpbiByZWxhdGlvbnNoaXBzKSB7XG4gICAgICBjb25zdCByZWxhdGlvbnNoaXAgPSByZWxhdGlvbnNoaXBzW3JlbGF0aW9uc2hpcE5hbWVdXG5cbiAgICAgIGlmIChyZWxhdGlvbnNoaXAuZ2V0VHlwZT8uKCkgIT09IFwiYmVsb25nc1RvXCIpIGNvbnRpbnVlXG5cbiAgICAgIGNvbnN0IGZvcmVpZ25LZXkgPSBpbmZsZWN0aW9uLmNhbWVsaXplKHJlbGF0aW9uc2hpcC5nZXRGb3JlaWduS2V5KCksIHRydWUpXG5cbiAgICAgIGlmIChmb3JlaWduS2V5ICE9PSBzY29wZUNvbHVtbikgY29udGludWVcblxuICAgICAgY29uc3QgaW5zdGFuY2VSZWxhdGlvbnNoaXAgPSBtb2RlbC5nZXRSZWxhdGlvbnNoaXBCeU5hbWUocmVsYXRpb25zaGlwTmFtZSlcbiAgICAgIGNvbnN0IGxvYWRlZCA9IGluc3RhbmNlUmVsYXRpb25zaGlwLmxvYWRlZCgpXG5cbiAgICAgIGlmIChsb2FkZWQgJiYgIUFycmF5LmlzQXJyYXkobG9hZGVkKSAmJiB0eXBlb2YgbG9hZGVkLmlkID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgcmV0dXJuIGxvYWRlZC5pZCgpXG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIG51bGxcbiAgfVxuXG4gIC8qKlxuICAgKiBOb3JtYWxpemUgdGhlIGBzY29wZWAgb3B0aW9uIGludG8gYW4gYXJyYXkgb2YgYXR0cmlidXRlIG5hbWVzLlxuICAgKiBTdXBwb3J0cyBzdHJpbmcgKGBcInVzZXJJZFwiYCksIGFycmF5IG9mIHN0cmluZ3MgKGBbXCJ1c2VySWRcIiwgXCJwcm9qZWN0SWRcIl1gKSxcbiAgICogb3IgYWJzZW50IChlbXB0eSBhcnJheSDigJQgbm8gc2NvcGUsIG9yaWdpbmFsIHNpbmdsZS1jb2x1bW4gYmVoYXZpb3IpLlxuICAgKiBAcmV0dXJucyB7c3RyaW5nW119IC0gQ29sdW1ucyBwYXJ0aWNpcGF0aW5nIGluIHRoZSB1bmlxdWVuZXNzIGNoZWNrLlxuICAgKi9cbiAgX25vcm1hbGl6ZVNjb3BlQ29sdW1ucygpIHtcbiAgICBjb25zdCBzY29wZSA9IHRoaXMuYXJncz8uc2NvcGVcblxuICAgIGlmICghc2NvcGUpIHJldHVybiBbXVxuICAgIGlmIChBcnJheS5pc0FycmF5KHNjb3BlKSkgcmV0dXJuIHNjb3BlXG5cbiAgICByZXR1cm4gW1N0cmluZyhzY29wZSldXG4gIH1cbn1cbiJdfQ==
|
|
@@ -29,7 +29,7 @@ export default class DataCopier {
|
|
|
29
29
|
* insertChunkSize?: number,
|
|
30
30
|
* queryChunkSize?: number,
|
|
31
31
|
* onProgress?: (message: string) => void
|
|
32
|
-
* }} args
|
|
32
|
+
* }} args - Source, target, traversal plan, chunk limits, and progress handler.
|
|
33
33
|
*/
|
|
34
34
|
constructor({ sourceDb, targetDb, tablePlan, idColumn, insertChunkSize, queryChunkSize, onProgress }: {
|
|
35
35
|
sourceDb: import("../drivers/base.js").default;
|
|
@@ -52,8 +52,8 @@ export default class DataCopier {
|
|
|
52
52
|
* returns the copied source rows keyed by table name. The target's current tenant rows
|
|
53
53
|
* are deleted (children first) and the source rows inserted (parents first) in a single
|
|
54
54
|
* target transaction with foreign keys disabled.
|
|
55
|
-
* @param {string} keyValue
|
|
56
|
-
* @returns {Promise<Map<string, Record<string, unknown>[]>>}
|
|
55
|
+
* @param {string} keyValue - Tenant key selecting the rows to copy.
|
|
56
|
+
* @returns {Promise<Map<string, Record<string, unknown>[]>>} - Copied source rows grouped by table name.
|
|
57
57
|
*/
|
|
58
58
|
copy(keyValue: string): Promise<Map<string, Record<string, unknown>[]>>;
|
|
59
59
|
/**
|
|
@@ -76,15 +76,15 @@ export default class DataCopier {
|
|
|
76
76
|
* Loads the rows for `keyValue` for every table in the plan from `db`, resolving
|
|
77
77
|
* parent-scoped tables from the ids already selected for their parent table. Used for
|
|
78
78
|
* both the source rows to copy and the target's current tenant rows to delete.
|
|
79
|
-
* @param {import("../drivers/base.js").default} db
|
|
80
|
-
* @param {string} keyValue
|
|
81
|
-
* @returns {Promise<Map<string, Record<string, unknown>[]>>}
|
|
79
|
+
* @param {import("../drivers/base.js").default} db - Source or target database to traverse.
|
|
80
|
+
* @param {string} keyValue - Tenant key selecting the root plan rows.
|
|
81
|
+
* @returns {Promise<Map<string, Record<string, unknown>[]>>} - Loaded rows grouped by table name.
|
|
82
82
|
*/
|
|
83
83
|
loadRows(db: import("../drivers/base.js").default, keyValue: string): Promise<Map<string, Record<string, unknown>[]>>;
|
|
84
84
|
/**
|
|
85
85
|
* Selects all rows of `tableName` in `db` whose `columnName` is in `values`, chunked.
|
|
86
|
-
* @param {{columnName: string, db: import("../drivers/base.js").default, tableName: string, values: string[]}} args
|
|
87
|
-
* @returns {Promise<Record<string, unknown>[]>}
|
|
86
|
+
* @param {{columnName: string, db: import("../drivers/base.js").default, tableName: string, values: string[]}} args - Table, column, database, and values for the chunked lookup.
|
|
87
|
+
* @returns {Promise<Record<string, unknown>[]>} - Rows matching the supplied column values.
|
|
88
88
|
*/
|
|
89
89
|
queryRowsByColumn({ columnName, db, tableName, values }: {
|
|
90
90
|
columnName: string;
|
|
@@ -95,34 +95,34 @@ export default class DataCopier {
|
|
|
95
95
|
/**
|
|
96
96
|
* Deletes the matching target rows for every plan table, children before parents, so the
|
|
97
97
|
* reinsert that follows starts from a clean slate without violating foreign keys.
|
|
98
|
-
* @param {Map<string, Record<string, unknown>[]>} rowsByTableName
|
|
98
|
+
* @param {Map<string, Record<string, unknown>[]>} rowsByTableName - Rows grouped by table name.
|
|
99
99
|
* @returns {Promise<void>}
|
|
100
100
|
*/
|
|
101
101
|
deleteTargetRows(rowsByTableName: Map<string, Record<string, unknown>[]>): Promise<void>;
|
|
102
102
|
/**
|
|
103
103
|
* Inserts the loaded source rows into the target for every plan table, parents before
|
|
104
104
|
* children, chunked to bound statement size.
|
|
105
|
-
* @param {Map<string, Record<string, unknown>[]>} rowsByTableName
|
|
105
|
+
* @param {Map<string, Record<string, unknown>[]>} rowsByTableName - Rows grouped by table name.
|
|
106
106
|
* @returns {Promise<void>}
|
|
107
107
|
*/
|
|
108
108
|
insertTargetRows(rowsByTableName: Map<string, Record<string, unknown>[]>): Promise<void>;
|
|
109
109
|
/**
|
|
110
110
|
* Quotes and comma-joins values for an SQL `IN (...)` list against the given database.
|
|
111
|
-
* @param {import("../drivers/base.js").default} db
|
|
112
|
-
* @param {string[]} values
|
|
113
|
-
* @returns {string}
|
|
111
|
+
* @param {import("../drivers/base.js").default} db - Database whose quoting rules format the values.
|
|
112
|
+
* @param {string[]} values - Values to quote for the `IN` list.
|
|
113
|
+
* @returns {string} - Quoted SQL value list.
|
|
114
114
|
*/
|
|
115
115
|
quotedValuesSql(db: import("../drivers/base.js").default, values: string[]): string;
|
|
116
116
|
/**
|
|
117
117
|
* Runs a query without per-query logging, used for the high-volume copy statements.
|
|
118
|
-
* @param {import("../drivers/base.js").default} db
|
|
119
|
-
* @param {string} sql
|
|
120
|
-
* @returns {Promise<Record<string, unknown>[]>}
|
|
118
|
+
* @param {import("../drivers/base.js").default} db - Database on which to execute the copy query.
|
|
119
|
+
* @param {string} sql - Copy-related SQL statement to execute quietly.
|
|
120
|
+
* @returns {Promise<Record<string, unknown>[]>} - Query result rows.
|
|
121
121
|
*/
|
|
122
122
|
executeQuietQuery(db: import("../drivers/base.js").default, sql: string): Promise<Record<string, unknown>[]>;
|
|
123
123
|
/**
|
|
124
124
|
* Inserts column-aligned row tuples into a table without per-query logging.
|
|
125
|
-
* @param {{columns: string[], db: import("../drivers/base.js").default, rows: Array<Array<unknown>>, tableName: string}} args
|
|
125
|
+
* @param {{columns: string[], db: import("../drivers/base.js").default, rows: Array<Array<unknown>>, tableName: string}} args - Destination table and column-aligned row values to insert.
|
|
126
126
|
* @returns {Promise<void>}
|
|
127
127
|
*/
|
|
128
128
|
insertRowsQuietly({ columns, db, rows, tableName }: {
|
|
@@ -133,7 +133,7 @@ export default class DataCopier {
|
|
|
133
133
|
}): Promise<void>;
|
|
134
134
|
/**
|
|
135
135
|
* Forwards a progress message to the optional `onProgress` callback when one was given.
|
|
136
|
-
* @param {string} message
|
|
136
|
+
* @param {string} message - Copy progress message to forward when reporting is enabled.
|
|
137
137
|
* @returns {void}
|
|
138
138
|
*/
|
|
139
139
|
reportProgress(message: string): void;
|
|
@@ -4,9 +4,9 @@ const DEFAULT_QUERY_CHUNK_SIZE = 500;
|
|
|
4
4
|
/**
|
|
5
5
|
* Splits an array into chunks of at most `chunkSize` items.
|
|
6
6
|
* @template T
|
|
7
|
-
* @param {T[]} values
|
|
8
|
-
* @param {number} chunkSize
|
|
9
|
-
* @returns {T[][]}
|
|
7
|
+
* @param {T[]} values - Ordered items to partition.
|
|
8
|
+
* @param {number} chunkSize - Maximum items per chunk.
|
|
9
|
+
* @returns {T[][]} - Consecutive chunks preserving input order.
|
|
10
10
|
*/
|
|
11
11
|
function chunks(values, chunkSize) {
|
|
12
12
|
const chunkedValues = [];
|
|
@@ -17,8 +17,8 @@ function chunks(values, chunkSize) {
|
|
|
17
17
|
}
|
|
18
18
|
/**
|
|
19
19
|
* Stringifies values and returns the distinct, non-blank ones, preserving first-seen order.
|
|
20
|
-
* @param {unknown[]} values
|
|
21
|
-
* @returns {string[]}
|
|
20
|
+
* @param {unknown[]} values - Candidate database identifiers to stringify and deduplicate.
|
|
21
|
+
* @returns {string[]} - Distinct non-blank identifiers in first-seen order.
|
|
22
22
|
*/
|
|
23
23
|
function uniqueStrings(values) {
|
|
24
24
|
return Array.from(new Set(values.map((value) => String(value)).filter((value) => value.trim())));
|
|
@@ -54,7 +54,7 @@ export default class DataCopier {
|
|
|
54
54
|
* insertChunkSize?: number,
|
|
55
55
|
* queryChunkSize?: number,
|
|
56
56
|
* onProgress?: (message: string) => void
|
|
57
|
-
* }} args
|
|
57
|
+
* }} args - Source, target, traversal plan, chunk limits, and progress handler.
|
|
58
58
|
*/
|
|
59
59
|
constructor({ sourceDb, targetDb, tablePlan, idColumn = "id", insertChunkSize = DEFAULT_INSERT_CHUNK_SIZE, queryChunkSize = DEFAULT_QUERY_CHUNK_SIZE, onProgress }) {
|
|
60
60
|
this.sourceDb = sourceDb;
|
|
@@ -70,8 +70,8 @@ export default class DataCopier {
|
|
|
70
70
|
* returns the copied source rows keyed by table name. The target's current tenant rows
|
|
71
71
|
* are deleted (children first) and the source rows inserted (parents first) in a single
|
|
72
72
|
* target transaction with foreign keys disabled.
|
|
73
|
-
* @param {string} keyValue
|
|
74
|
-
* @returns {Promise<Map<string, Record<string, unknown>[]>>}
|
|
73
|
+
* @param {string} keyValue - Tenant key selecting the rows to copy.
|
|
74
|
+
* @returns {Promise<Map<string, Record<string, unknown>[]>>} - Copied source rows grouped by table name.
|
|
75
75
|
*/
|
|
76
76
|
async copy(keyValue) {
|
|
77
77
|
const sourceRowsByTableName = await this.loadRows(this.sourceDb, keyValue);
|
|
@@ -112,9 +112,9 @@ export default class DataCopier {
|
|
|
112
112
|
* Loads the rows for `keyValue` for every table in the plan from `db`, resolving
|
|
113
113
|
* parent-scoped tables from the ids already selected for their parent table. Used for
|
|
114
114
|
* both the source rows to copy and the target's current tenant rows to delete.
|
|
115
|
-
* @param {import("../drivers/base.js").default} db
|
|
116
|
-
* @param {string} keyValue
|
|
117
|
-
* @returns {Promise<Map<string, Record<string, unknown>[]>>}
|
|
115
|
+
* @param {import("../drivers/base.js").default} db - Source or target database to traverse.
|
|
116
|
+
* @param {string} keyValue - Tenant key selecting the root plan rows.
|
|
117
|
+
* @returns {Promise<Map<string, Record<string, unknown>[]>>} - Loaded rows grouped by table name.
|
|
118
118
|
*/
|
|
119
119
|
async loadRows(db, keyValue) {
|
|
120
120
|
/** @type {Map<string, string[]>} */
|
|
@@ -155,8 +155,8 @@ export default class DataCopier {
|
|
|
155
155
|
}
|
|
156
156
|
/**
|
|
157
157
|
* Selects all rows of `tableName` in `db` whose `columnName` is in `values`, chunked.
|
|
158
|
-
* @param {{columnName: string, db: import("../drivers/base.js").default, tableName: string, values: string[]}} args
|
|
159
|
-
* @returns {Promise<Record<string, unknown>[]>}
|
|
158
|
+
* @param {{columnName: string, db: import("../drivers/base.js").default, tableName: string, values: string[]}} args - Table, column, database, and values for the chunked lookup.
|
|
159
|
+
* @returns {Promise<Record<string, unknown>[]>} - Rows matching the supplied column values.
|
|
160
160
|
*/
|
|
161
161
|
async queryRowsByColumn({ columnName, db, tableName, values }) {
|
|
162
162
|
const normalizedValues = uniqueStrings(values);
|
|
@@ -175,7 +175,7 @@ export default class DataCopier {
|
|
|
175
175
|
/**
|
|
176
176
|
* Deletes the matching target rows for every plan table, children before parents, so the
|
|
177
177
|
* reinsert that follows starts from a clean slate without violating foreign keys.
|
|
178
|
-
* @param {Map<string, Record<string, unknown>[]>} rowsByTableName
|
|
178
|
+
* @param {Map<string, Record<string, unknown>[]>} rowsByTableName - Rows grouped by table name.
|
|
179
179
|
* @returns {Promise<void>}
|
|
180
180
|
*/
|
|
181
181
|
async deleteTargetRows(rowsByTableName) {
|
|
@@ -194,7 +194,7 @@ export default class DataCopier {
|
|
|
194
194
|
/**
|
|
195
195
|
* Inserts the loaded source rows into the target for every plan table, parents before
|
|
196
196
|
* children, chunked to bound statement size.
|
|
197
|
-
* @param {Map<string, Record<string, unknown>[]>} rowsByTableName
|
|
197
|
+
* @param {Map<string, Record<string, unknown>[]>} rowsByTableName - Rows grouped by table name.
|
|
198
198
|
* @returns {Promise<void>}
|
|
199
199
|
*/
|
|
200
200
|
async insertTargetRows(rowsByTableName) {
|
|
@@ -218,25 +218,25 @@ export default class DataCopier {
|
|
|
218
218
|
}
|
|
219
219
|
/**
|
|
220
220
|
* Quotes and comma-joins values for an SQL `IN (...)` list against the given database.
|
|
221
|
-
* @param {import("../drivers/base.js").default} db
|
|
222
|
-
* @param {string[]} values
|
|
223
|
-
* @returns {string}
|
|
221
|
+
* @param {import("../drivers/base.js").default} db - Database whose quoting rules format the values.
|
|
222
|
+
* @param {string[]} values - Values to quote for the `IN` list.
|
|
223
|
+
* @returns {string} - Quoted SQL value list.
|
|
224
224
|
*/
|
|
225
225
|
quotedValuesSql(db, values) {
|
|
226
226
|
return values.map((value) => db.quote(value)).join(", ");
|
|
227
227
|
}
|
|
228
228
|
/**
|
|
229
229
|
* Runs a query without per-query logging, used for the high-volume copy statements.
|
|
230
|
-
* @param {import("../drivers/base.js").default} db
|
|
231
|
-
* @param {string} sql
|
|
232
|
-
* @returns {Promise<Record<string, unknown>[]>}
|
|
230
|
+
* @param {import("../drivers/base.js").default} db - Database on which to execute the copy query.
|
|
231
|
+
* @param {string} sql - Copy-related SQL statement to execute quietly.
|
|
232
|
+
* @returns {Promise<Record<string, unknown>[]>} - Query result rows.
|
|
233
233
|
*/
|
|
234
234
|
async executeQuietQuery(db, sql) {
|
|
235
235
|
return await db.query(sql, { logQuery: false });
|
|
236
236
|
}
|
|
237
237
|
/**
|
|
238
238
|
* Inserts column-aligned row tuples into a table without per-query logging.
|
|
239
|
-
* @param {{columns: string[], db: import("../drivers/base.js").default, rows: Array<Array<unknown>>, tableName: string}} args
|
|
239
|
+
* @param {{columns: string[], db: import("../drivers/base.js").default, rows: Array<Array<unknown>>, tableName: string}} args - Destination table and column-aligned row values to insert.
|
|
240
240
|
* @returns {Promise<void>}
|
|
241
241
|
*/
|
|
242
242
|
async insertRowsQuietly({ columns, db, rows, tableName }) {
|
|
@@ -244,7 +244,7 @@ export default class DataCopier {
|
|
|
244
244
|
}
|
|
245
245
|
/**
|
|
246
246
|
* Forwards a progress message to the optional `onProgress` callback when one was given.
|
|
247
|
-
* @param {string} message
|
|
247
|
+
* @param {string} message - Copy progress message to forward when reporting is enabled.
|
|
248
248
|
* @returns {void}
|
|
249
249
|
*/
|
|
250
250
|
reportProgress(message) {
|
|
@@ -253,4 +253,4 @@ export default class DataCopier {
|
|
|
253
253
|
}
|
|
254
254
|
}
|
|
255
255
|
}
|
|
256
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0YS1jb3BpZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvZGF0YWJhc2UvdGVuYW50cy9kYXRhLWNvcGllci5qcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxZQUFZO0FBRVosTUFBTSx5QkFBeUIsR0FBRyxHQUFHLENBQUE7QUFDckMsTUFBTSx3QkFBd0IsR0FBRyxHQUFHLENBQUE7QUFFcEM7Ozs7OztHQU1HO0FBQ0gsU0FBUyxNQUFNLENBQUMsTUFBTSxFQUFFLFNBQVM7SUFDL0IsTUFBTSxhQUFhLEdBQUcsRUFBRSxDQUFBO0lBRXhCLEtBQUssSUFBSSxLQUFLLEdBQUcsQ0FBQyxFQUFFLEtBQUssR0FBRyxNQUFNLENBQUMsTUFBTSxFQUFFLEtBQUssSUFBSSxTQUFTLEVBQUUsQ0FBQztRQUM5RCxhQUFhLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsS0FBSyxFQUFFLEtBQUssR0FBRyxTQUFTLENBQUMsQ0FBQyxDQUFBO0lBQzVELENBQUM7SUFFRCxPQUFPLGFBQWEsQ0FBQTtBQUN0QixDQUFDO0FBRUQ7Ozs7R0FJRztBQUNILFNBQVMsYUFBYSxDQUFDLE1BQU07SUFDM0IsT0FBTyxLQUFLLENBQUMsSUFBSSxDQUFDLElBQUksR0FBRyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsS0FBSyxDQUFDLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFBO0FBQ2xHLENBQUM7QUFFRDs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQW1CRztBQUNILE1BQU0sQ0FBQyxPQUFPLE9BQU8sVUFBVTtJQUM3Qjs7Ozs7Ozs7Ozs7T0FXRztJQUNILFlBQVksRUFBQyxRQUFRLEVBQUUsUUFBUSxFQUFFLFNBQVMsRUFBRSxRQUFRLEdBQUcsSUFBSSxF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LENBQUMsVUFBVSxFQUFFLENBQUM7WUFDcEIsSUFBSSxDQUFDLFVBQVUsQ0FBQyxPQUFPLENBQUMsQ0FBQTtRQUMxQixDQUFDO0lBQ0gsQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQHRzLWNoZWNrXG5cbmNvbnN0IERFRkFVTFRfSU5TRVJUX0NIVU5LX1NJWkUgPSAxMDBcbmNvbnN0IERFRkFVTFRfUVVFUllfQ0hVTktfU0laRSA9IDUwMFxuXG4vKipcbiAqIFNwbGl0cyBhbiBhcnJheSBpbnRvIGNodW5rcyBvZiBhdCBtb3N0IGBjaHVua1NpemVgIGl0ZW1zLlxuICogQHRlbXBsYXRlIFRcbiAqIEBwYXJhbSB7VFtdfSB2YWx1ZXNcbiAqIEBwYXJhbSB7bnVtYmVyfSBjaHVua1NpemVcbiAqIEByZXR1cm5zIHtUW11bXX1cbiAqL1xuZnVuY3Rpb24gY2h1bmtzKHZhbHVlcywgY2h1bmtTaXplKSB7XG4gIGNvbnN0IGNodW5rZWRWYWx1ZXMgPSBbXVxuXG4gIGZvciAobGV0IGluZGV4ID0gMDsgaW5kZXggPCB2YWx1ZXMubGVuZ3RoOyBpbmRleCArPSBjaHVua1NpemUpIHtcbiAgICBjaHVua2VkVmFsdWVzLnB1c2godmFsdWVzLnNsaWNlKGluZGV4LCBpbmRleCArIGNodW5rU2l6ZSkpXG4gIH1cblxuICByZXR1cm4gY2h1bmtlZFZhbHVlc1xufVxuXG4vKipcbiAqIFN0cmluZ2lmaWVzIHZhbHVlcyBhbmQgcmV0dXJucyB0aGUgZGlzdGluY3QsIG5vbi1ibGFuayBvbmVzLCBwcmVzZXJ2aW5nIGZpcnN0LXNlZW4gb3JkZXIuXG4gKiBAcGFyYW0ge3Vua25vd25bXX0gdmFsdWVzXG4gKiBAcmV0dXJucyB7c3RyaW5nW119XG4gKi9cbmZ1bmN0aW9uIHVuaXF1ZVN0cmluZ3ModmFsdWVzKSB7XG4gIHJldHVybiBBcnJheS5mcm9tKG5ldyBTZXQodmFsdWVzLm1hcCgodmFsdWUpID0+IFN0cmluZyh2YWx1ZSkpLmZpbHRlcigodmFsdWUpID0+IHZhbHVlLnRyaW0oKSkpKVxufVxuXG4vKipcbiAqIENvcGllcyBhIHNpbmdsZSB0ZW5hbnQncyByb3dzIGZyb20gYSBzb3VyY2UgZGF0YWJhc2UgaW50byBhIHRhcmdldCBkYXRhYmFzZSwgZm9sbG93aW5nIGFcbiAqIHRhYmxlIHBsYW4gdGhhdCBwYXJ0aXRpb25zIGVhY2ggdGFibGUgZWl0aGVyIGJ5IGEgZGlyZWN0IHRlbmFudCBrZXkgY29sdW1uIG9yIGJ5XG4gKiBwYXJlbnQtaWQgdHJhdmVyc2FsLiBUaGlzIGlzIHRoZSByb3ctbGV2ZWwgY291bnRlcnBhcnQgdG8gc2NoZW1hIGNsb25pbmc6IG11bHRpLXRlbmFudFxuICogYXBwcyB0aGF0IGtlZXAgZWFjaCB0ZW5hbnQncyBkYXRhIGluIGl0cyBvd24gZGF0YWJhc2UgdXNlIGl0IHRvIChyZSltYXRlcmlhbGlzZSB0aGVcbiAqIHRlbmFudCdzIHJvd3MgZnJvbSBhIGdsb2JhbC90ZW1wbGF0ZSBkYXRhYmFzZS5cbiAqXG4gKiBUaGUgY29weSBpcyBkZWxldGUtdGhlbi1yZWluc2VydCBhbmQgdGhlcmVmb3JlIGlkZW1wb3RlbnQsIGFuZCBpdCBtaXJyb3JzIHRoZSBzb3VyY2VcbiAqIHNuYXBzaG90OiB0aGUgcm93cyB0byBkZWxldGUgYXJlIHRoZSB0ZW5hbnQncyAqY3VycmVudCogcm93cyBpbiB0aGUgdGFyZ2V0IChzZWxlY3RlZCB3aXRoXG4gKiB0aGUgc2FtZSBwbGFuIHRyYXZlcnNhbCBydW4gYWdhaW5zdCB0aGUgdGFyZ2V0KSwgc28gYSByb3cgdGhhdCB3YXMgcmVtb3ZlZCBmcm9tIHRoZSBzb3VyY2VcbiAqIHNpbmNlIHRoZSBsYXN0IGNvcHkgaXMgZHJvcHBlZCBmcm9tIHRoZSB0YXJnZXQgdG9vIHJhdGhlciB0aGFuIGxpbmdlcmluZy4gVGhlIGRlbGV0ZXMgcnVuXG4gKiBjaGlsZHJlbiBmaXJzdCBhbmQgdGhlIHNvdXJjZSBpbnNlcnRzIHBhcmVudHMgZmlyc3QsIGFsbCBpbnNpZGUgb25lIHRhcmdldCB0cmFuc2FjdGlvbiB3aXRoXG4gKiBmb3JlaWduLWtleSBlbmZvcmNlbWVudCBkaXNhYmxlZCBzbyB0aGUgb3JkZXJpbmcgbmV2ZXIgdHJpcHMgYSBjb25zdHJhaW50LiBSZWFkcywgZGVsZXRlc1xuICogYW5kIGluc2VydHMgYXJlIGNodW5rZWQgdG8gYm91bmQgc3RhdGVtZW50IHNpemUuXG4gKlxuICogVGhlIGNvcGllciBpcyBwb2xpY3ktZnJlZTogdGhlIGNhbGxlciBzdXBwbGllcyB0aGUgcGxhbiwgdGhlIHNvdXJjZS90YXJnZXQgZGF0YWJhc2VzIGFuZFxuICogdGhlIHRlbmFudCBrZXksIGFuZCB7QGxpbmsgRGF0YUNvcGllciNjb3B5fSByZXR1cm5zIHRoZSBsb2FkZWQgcm93cyBrZXllZCBieSB0YWJsZSBuYW1lIHNvXG4gKiB0aGUgY2FsbGVyIGNhbiBwZXJmb3JtIGFueSBhcHAtc3BlY2lmaWMgcG9zdC1jb3B5IHdvcmsgKGZvciBleGFtcGxlIHJlZ2lzdGVyaW5nIHJlY29yZFxuICogbG9jYXRpb25zKSB3aXRob3V0IHRoYXQgcG9saWN5IGxlYWtpbmcgaW50byB0aGUgZnJhbWV3b3JrLlxuICovXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBEYXRhQ29waWVyIHtcbiAgLyoqXG4gICAqIENyZWF0ZXMgYSBjb3BpZXIgdGhhdCBtb3ZlcyB0ZW5hbnQtb3duZWQgcm93cyBmcm9tIGBzb3VyY2VEYmAgaW50byBgdGFyZ2V0RGJgLlxuICAgKiBAcGFyYW0ge3tcbiAgICogICBzb3VyY2VEYjogaW1wb3J0KFwiLi4vZHJpdmVycy9iYXNlLmpzXCIpLmRlZmF1bHQsXG4gICAqICAgdGFyZ2V0RGI6IGltcG9ydChcIi4uL2RyaXZlcnMvYmFzZS5qc1wiKS5kZWZhdWx0LFxuICAgKiAgIHRhYmxlUGxhbjogaW1wb3J0KFwiLi90ZW5hbnQtdGFibGUtcGxhbi5qc1wiKS5UZW5hbnRUYWJsZVBsYW5FbnRyeVtdLFxuICAgKiAgIGlkQ29sdW1uPzogc3RyaW5nLFxuICAgKiAgIGluc2VydENodW5rU2l6ZT86IG51bWJlcixcbiAgICogICBxdWVyeUNodW5rU2l6ZT86IG51bWJlcixcbiAgICogICBvblByb2dyZXNzPzogKG1lc3NhZ2U6IHN0cmluZykgPT4gdm9pZFxuICAgKiB9fSBhcmdzXG4gICAqL1xuICBjb25zdHJ1Y3Rvcih7c291cmNlRGIsIHRhcmdldERiLCB0YWJsZVBsYW4sIGlkQ29sdW1uID0gXCJpZFwiLCBpbnNlcnRDaHVua1NpemUgPSBERUZBVUxUX0lOU0VSVF9DSFVOS19TSVpFLCBxdWVyeUNodW5rU2l6ZSA9IERFRkFVTFRfUVVFUllfQ0hVTktfU0laRSwgb25Qcm9ncmVzc30pIHtcbiAgICB0aGlzLnNvdXJjZURiID0gc291cmNlRGJcbiAgICB0aGlzLnRhcmdldERiID0gdGFyZ2V0RGJcbiAgICB0aGlzLnRhYmxlUGxhbiA9IHRhYmxlUGxhblxuICAgIHRoaXMuaWRDb2x1bW4gPSBpZENvbHVtblxuICAgIHRoaXMuaW5zZXJ0Q2h1bmtTaXplID0gaW5zZXJ0Q2h1bmtTaXplXG4gICAgdGhpcy5xdWVyeUNodW5rU2l6ZSA9IHF1ZXJ5Q2h1bmtTaXplXG4gICAgdGhpcy5vblByb2dyZXNzID0gb25Qcm9ncmVzc1xuICB9XG5cbiAgLyoqXG4gICAqIENvcGllcyBldmVyeSBwbGFuIHRhYmxlJ3Mgcm93cyBmb3IgYGtleVZhbHVlYCBmcm9tIHRoZSBzb3VyY2UgaW50byB0aGUgdGFyZ2V0IGFuZFxuICAgKiByZXR1cm5zIHRoZSBjb3BpZWQgc291cmNlIHJvd3Mga2V5ZWQgYnkgdGFibGUgbmFtZS4gVGhlIHRhcmdldCdzIGN1cnJlbnQgdGVuYW50IHJvd3NcbiAgICogYXJlIGRlbGV0ZWQgKGNoaWxkcmVuIGZpcnN0KSBhbmQgdGhlIHNvdXJjZSByb3dzIGluc2VydGVkIChwYXJlbnRzIGZpcnN0KSBpbiBhIHNpbmdsZVxuICAgKiB0YXJnZXQgdHJhbnNhY3Rpb24gd2l0aCBmb3JlaWduIGtleXMgZGlzYWJsZWQuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBrZXlWYWx1ZVxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxNYXA8c3RyaW5nLCBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPltdPj59XG4gICAqL1xuICBhc3luYyBjb3B5KGtleVZhbHVlKSB7XG4gICAgY29uc3Qgc291cmNlUm93c0J5VGFibGVOYW1lID0gYXdhaXQgdGhpcy5sb2FkUm93cyh0aGlzLnNvdXJjZURiLCBrZXlWYWx1ZSlcbiAgICBjb25zdCB0YXJnZXRSb3dzQnlUYWJsZU5hbWUgPSBhd2FpdCB0aGlzLmxvYWRSb3dzKHRoaXMudGFyZ2V0RGIsIGtleVZhbHVlKVxuXG4gICAgYXdhaXQgdGhpcy50YXJnZXREYi53aXRoRGlzYWJsZWRGb3JlaWduS2V5cyhhc3luYyAoKSA9PiB7XG4gICAgICBhd2FpdCB0aGlzLnRhcmdldERiLnRyYW5zYWN0aW9uKGFzeW5jICgpID0+IHtcbiAgICAgICAgYXdhaXQgdGhpcy5kZWxldGVUYXJnZXRSb3dzKHRhcmdldFJvd3NCeVRhYmxlTmFtZSlcbiAgICAgICAgYXdhaXQgdGhpcy5pbnNlcnRUYXJnZXRSb3dzKHNvdXJjZVJvd3NCeVRhYmxlTmFtZSlcbiAgICAgIH0pXG4gICAgfSlcblxuICAgIHJldHVybiBzb3VyY2VSb3dzQnlUYWJsZU5hbWVcbiAgfVxuXG4gIC8qKlxuICAgKiBEZWxldGVzIG9uZSB0ZW5hbnQncyByb3dzIGZyb20gdGhlIHRhcmdldCBkYXRhYmFzZSwgY2hpbGRyZW4gYmVmb3JlIHBhcmVudHMsIHdpdGhcbiAgICogZm9yZWlnbiBrZXlzIGRpc2FibGVkIGluc2lkZSBhIHNpbmdsZSB0cmFuc2FjdGlvbi4gVGhpcyBpcyBgY29weWAgd2l0aG91dCB0aGUgcmVpbnNlcnQ6XG4gICAqIHRoZSBzYW1lIHBsYW4gdHJhdmVyc2FsIHNlbGVjdHMgdGhlIHRlbmFudCdzIGN1cnJlbnQgdGFyZ2V0IHJvd3MgYW5kIGBkZWxldGVUYXJnZXRSb3dzYFxuICAgKiByZW1vdmVzIHRoZW0gY2hpbGRyZW4tZmlyc3Qgc28gdGhlIG9yZGVyaW5nIG5ldmVyIHRyaXBzIGEgZm9yZWlnbiBrZXkuIE11bHRpLXRlbmFudCBhcHBzXG4gICAqIHVzZSBpdCB0byBwdXJnZSBhIHRlbmFudCDigJQgZm9yIGV4YW1wbGUgY2xlYXJpbmcgdGhlIHRlbmFudCdzIG1hc3RlciBjb3B5IGluIHRoZVxuICAgKiBnbG9iYWwvZGVmYXVsdCBkYXRhYmFzZSBvbiB0ZWFyZG93biwgc28gZm9yZWlnbiBrZXlzIHN0b3AgcmVmZXJlbmNpbmcgdGhlIHRlbmFudCdzXG4gICAqIGFib3V0LXRvLWJlLXJlbW92ZWQgcm9vdCByb3cuXG4gICAqXG4gICAqIFJldHVybnMgdGhlIGRlbGV0ZWQgcm93cyBrZXllZCBieSB0YWJsZSBuYW1lIHNvIHRoZSBjYWxsZXIgY2FuIHBlcmZvcm0gYW55IGFwcC1zcGVjaWZpY1xuICAgKiBwb3N0LWRlbGV0ZSB3b3JrIChyZWNvcmQtbG9jYXRpb24gY2xlYW51cCwgYXVkaXRpbmcpIHdpdGhvdXQgdGhhdCBwb2xpY3kgbGVha2luZyBpbnRvIHRoZVxuICAgKiBmcmFtZXdvcmsuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBrZXlWYWx1ZSAtIFRlbmFudCBrZXkgd2hvc2Ugcm93cyBzaG91bGQgYmUgcmVtb3ZlZCBmcm9tIHRoZSB0YXJnZXQuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPE1hcDxzdHJpbmcsIFJlY29yZDxzdHJpbmcsIHVua25vd24+W10+Pn0gLSBUaGUgZGVsZXRlZCByb3dzIGJ5IHRhYmxlIG5hbWUuXG4gICAqL1xuICBhc3luYyBkZWxldGVUZW5hbnRSb3dzKGtleVZhbHVlKSB7XG4gICAgY29uc3Qgcm93c0J5VGFibGVOYW1lID0gYXdhaXQgdGhpcy5sb2FkUm93cyh0aGlzLnRhcmdldERiLCBrZXlWYWx1ZSlcblxuICAgIGF3YWl0IHRoaXMudGFyZ2V0RGIud2l0aERpc2FibGVkRm9yZWlnbktleXMoYXN5bmMgKCkgPT4ge1xuICAgICAgYXdhaXQgdGhpcy50YXJnZXREYi50cmFuc2FjdGlvbihhc3luYyAoKSA9PiB7XG4gICAgICAgIGF3YWl0IHRoaXMuZGVsZXRlVGFyZ2V0Um93cyhyb3dzQnlUYWJsZU5hbWUpXG4gICAgICB9KVxuICAgIH0pXG5cbiAgICByZXR1cm4gcm93c0J5VGFibGVOYW1lXG4gIH1cblxuICAvKipcbiAgICogTG9hZHMgdGhlIHJvd3MgZm9yIGBrZXlWYWx1ZWAgZm9yIGV2ZXJ5IHRhYmxlIGluIHRoZSBwbGFuIGZyb20gYGRiYCwgcmVzb2x2aW5nXG4gICAqIHBhcmVudC1zY29wZWQgdGFibGVzIGZyb20gdGhlIGlkcyBhbHJlYWR5IHNlbGVjdGVkIGZvciB0aGVpciBwYXJlbnQgdGFibGUuIFVzZWQgZm9yXG4gICAqIGJvdGggdGhlIHNvdXJjZSByb3dzIHRvIGNvcHkgYW5kIHRoZSB0YXJnZXQncyBjdXJyZW50IHRlbmFudCByb3dzIHRvIGRlbGV0ZS5cbiAgICogQHBhcmFtIHtpbXBvcnQoXCIuLi9kcml2ZXJzL2Jhc2UuanNcIikuZGVmYXVsdH0gZGJcbiAgICogQHBhcmFtIHtzdHJpbmd9IGtleVZhbHVlXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPE1hcDxzdHJpbmcsIFJlY29yZDxzdHJpbmcsIHVua25vd24+W10+Pn1cbiAgICovXG4gIGFzeW5jIGxvYWRSb3dzKGRiLCBrZXlWYWx1ZSkge1xuICAgIC8qKiBAdHlwZSB7TWFwPHN0cmluZywgc3RyaW5nW10+fSAqL1xuICAgIGNvbnN0IGlkc0J5VGFibGVOYW1lID0gbmV3IE1hcCgpXG4gICAgLyoqIEB0eXBlIHtNYXA8c3RyaW5nLCBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPltdPn0gKi9cbiAgICBjb25zdCByb3dzQnlUYWJsZU5hbWUgPSBuZXcgTWFwKClcblxuICAgIGZvciAoY29uc3QgdGFibGVDb25maWcgb2YgdGhpcy50YWJsZVBsYW4pIHtcbiAgICAgIGxldCByb3dzXG5cbiAgICAgIGlmICh0YWJsZUNvbmZpZy5rZXlDb2x1bW4pIHtcbiAgICAgICAgcm93cyA9IGF3YWl0IHRoaXMucXVlcnlSb3dzQnlDb2x1bW4oe1xuICAgICAgICAgIGNvbHVtbk5hbWU6IHRhYmxlQ29uZmlnLmtleUNvbHVtbixcbiAgICAgICAgICBkYixcbiAgICAgICAgICB0YWJsZU5hbWU6IHRhYmxlQ29uZmlnLnRhYmxlTmFtZSxcbiAgICAgICAgICB2YWx1ZXM6IFtrZXlWYWx1ZV1cbiAgICAgICAgfSlcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGlmICghdGFibGVDb25maWcucGFyZW50Q29sdW1uIHx8ICF0YWJsZUNvbmZpZy5wYXJlbnRUYWJsZU5hbWUpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEV4cGVjdGVkIGtleUNvbHVtbiBvciBwYXJlbnRUYWJsZU5hbWUrcGFyZW50Q29sdW1uIGZvciB0YWJsZSAke3RhYmxlQ29uZmlnLnRhYmxlTmFtZX0gaW4gdGhlIHRlbmFudCB0YWJsZSBwbGFuLmApXG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIWlkc0J5VGFibGVOYW1lLmhhcyh0YWJsZUNvbmZpZy5wYXJlbnRUYWJsZU5hbWUpKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBUZW5hbnQgdGFibGUgcGxhbiBlbnRyeSAke3RhYmxlQ29uZmlnLnRhYmxlTmFtZX0gcmVmZXJlbmNlcyBwYXJlbnQgdGFibGUgJHt0YWJsZUNvbmZpZy5wYXJlbnRUYWJsZU5hbWV9LCB3aGljaCBoYXMgbm90IGJlZW4gbG9hZGVkOyBwYXJlbnQgdGFibGVzIG11c3QgYXBwZWFyIGJlZm9yZSB0aGVpciBjaGlsZHJlbiBpbiB0aGUgcGxhbi5gKVxuICAgICAgICB9XG5cbiAgICAgICAgcm93cyA9IGF3YWl0IHRoaXMucXVlcnlSb3dzQnlDb2x1bW4oe1xuICAgICAgICAgIGNvbHVtbk5hbWU6IHRhYmxlQ29uZmlnLnBhcmVudENvbHVtbixcbiAgICAgICAgICBkYixcbiAgICAgICAgICB0YWJsZU5hbWU6IHRhYmxlQ29uZmlnLnRhYmxlTmFtZSxcbiAgICAgICAgICB2YWx1ZXM6IGlkc0J5VGFibGVOYW1lLmdldCh0YWJsZUNvbmZpZy5wYXJlbnRUYWJsZU5hbWUpIHx8IFtdXG4gICAgICAgIH0pXG4gICAgICB9XG5cbiAgICAgIGlmIChyb3dzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgdGhpcy5yZXBvcnRQcm9ncmVzcyhgJHt0YWJsZUNvbmZpZy50YWJsZU5hbWV9OiBsb2FkZWQgJHtyb3dzLmxlbmd0aH0gcm93KHMpYClcbiAgICAgIH1cblxuICAgICAgaWRzQnlUYWJsZU5hbWUuc2V0KHRhYmxlQ29uZmlnLnRhYmxlTmFtZSwgdW5pcXVlU3RyaW5ncyhyb3dzLm1hcCgocm93KSA9PiByb3dbdGhpcy5pZENvbHVtbl0pKSlcbiAgICAgIHJvd3NCeVRhYmxlTmFtZS5zZXQodGFibGVDb25maWcudGFibGVOYW1lLCByb3dzKVxuICAgIH1cblxuICAgIHJldHVybiByb3dzQnlUYWJsZU5hbWVcbiAgfVxuXG4gIC8qKlxuICAgKiBTZWxlY3RzIGFsbCByb3dzIG9mIGB0YWJsZU5hbWVgIGluIGBkYmAgd2hvc2UgYGNvbHVtbk5hbWVgIGlzIGluIGB2YWx1ZXNgLCBjaHVua2VkLlxuICAgKiBAcGFyYW0ge3tjb2x1bW5OYW1lOiBzdHJpbmcsIGRiOiBpbXBvcnQoXCIuLi9kcml2ZXJzL2Jhc2UuanNcIikuZGVmYXVsdCwgdGFibGVOYW1lOiBzdHJpbmcsIHZhbHVlczogc3RyaW5nW119fSBhcmdzXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPFJlY29yZDxzdHJpbmcsIHVua25vd24+W10+fVxuICAgKi9cbiAgYXN5bmMgcXVlcnlSb3dzQnlDb2x1bW4oe2NvbHVtbk5hbWUsIGRiLCB0YWJsZU5hbWUsIHZhbHVlc30pIHtcbiAgICBjb25zdCBub3JtYWxpemVkVmFsdWVzID0gdW5pcXVlU3RyaW5ncyh2YWx1ZXMpXG5cbiAgICBpZiAobm9ybWFsaXplZFZhbHVlcy5sZW5ndGggPD0gMCkge1xuICAgICAgcmV0dXJuIFtdXG4gICAgfVxuXG4gICAgY29uc3Qgcm93cyA9IFtdXG4gICAgY29uc3QgcXVvdGVkVGFibGUgPSBkYi5xdW90ZVRhYmxlKHRhYmxlTmFtZSlcbiAgICBjb25zdCBxdW90ZWRDb2x1bW4gPSBkYi5xdW90ZUNvbHVtbihjb2x1bW5OYW1lKVxuXG4gICAgZm9yIChjb25zdCB2YWx1ZXNDaHVuayBvZiBjaHVua3Mobm9ybWFsaXplZFZhbHVlcywgdGhpcy5xdWVyeUNodW5rU2l6ZSkpIHtcbiAgICAgIGNvbnN0IHNxbCA9IGBTRUxFQ1QgJHtxdW90ZWRUYWJsZX0uKiBGUk9NICR7cXVvdGVkVGFibGV9IFdIRVJFICR7cXVvdGVkQ29sdW1ufSBJTiAoJHt0aGlzLnF1b3RlZFZhbHVlc1NxbChkYiwgdmFsdWVzQ2h1bmspfSlgXG5cbiAgICAgIHJvd3MucHVzaCguLi5hd2FpdCB0aGlzLmV4ZWN1dGVRdWlldFF1ZXJ5KGRiLCBzcWwpKVxuICAgIH1cblxuICAgIHJldHVybiByb3dzXG4gIH1cblxuICAvKipcbiAgICogRGVsZXRlcyB0aGUgbWF0Y2hpbmcgdGFyZ2V0IHJvd3MgZm9yIGV2ZXJ5IHBsYW4gdGFibGUsIGNoaWxkcmVuIGJlZm9yZSBwYXJlbnRzLCBzbyB0aGVcbiAgICogcmVpbnNlcnQgdGhhdCBmb2xsb3dzIHN0YXJ0cyBmcm9tIGEgY2xlYW4gc2xhdGUgd2l0aG91dCB2aW9sYXRpbmcgZm9yZWlnbiBrZXlzLlxuICAgKiBAcGFyYW0ge01hcDxzdHJpbmcsIFJlY29yZDxzdHJpbmcsIHVua25vd24+W10+fSByb3dzQnlUYWJsZU5hbWVcbiAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59XG4gICAqL1xuICBhc3luYyBkZWxldGVUYXJnZXRSb3dzKHJvd3NCeVRhYmxlTmFtZSkge1xuICAgIGZvciAoY29uc3QgdGFibGVDb25maWcgb2YgWy4uLnRoaXMudGFibGVQbGFuXS5yZXZlcnNlKCkpIHtcbiAgICAgIGNvbnN0IHJvd0lkcyA9IHVuaXF1ZVN0cmluZ3MoKHJvd3NCeVRhYmxlTmFtZS5nZXQodGFibGVDb25maWcudGFibGVOYW1lKSB8fCBbXSkubWFwKChyb3cpID0+IHJvd1t0aGlzLmlkQ29sdW1uXSkpXG5cbiAgICAgIGlmIChyb3dJZHMubGVuZ3RoIDw9IDApIHtcbiAgICAgICAgY29udGludWVcbiAgICAgIH1cblxuICAgICAgY29uc3QgcXVvdGVkVGFibGUgPSB0aGlzLnRhcmdldERiLnF1b3RlVGFibGUodGFibGVDb25maWcudGFibGVOYW1lKVxuICAgICAgY29uc3QgcXVvdGVkSWRDb2x1bW4gPSB0aGlzLnRhcmdldERiLnF1b3RlQ29sdW1uKHRoaXMuaWRDb2x1bW4pXG5cbiAgICAgIGZvciAoY29uc3Qgcm93SWRzQ2h1bmsgb2YgY2h1bmtzKHJvd0lkcywgdGhpcy5xdWVyeUNodW5rU2l6ZSkpIHtcbiAgICAgICAgYXdhaXQgdGhpcy5leGVjdXRlUXVpZXRRdWVyeShcbiAgICAgICAgICB0aGlzLnRhcmdldERiLFxuICAgICAgICAgIGBERUxFVEUgRlJPTSAke3F1b3RlZFRhYmxlfSBXSEVSRSAke3F1b3RlZElkQ29sdW1ufSBJTiAoJHt0aGlzLnF1b3RlZFZhbHVlc1NxbCh0aGlzLnRhcmdldERiLCByb3dJZHNDaHVuayl9KWBcbiAgICAgICAgKVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBJbnNlcnRzIHRoZSBsb2FkZWQgc291cmNlIHJvd3MgaW50byB0aGUgdGFyZ2V0IGZvciBldmVyeSBwbGFuIHRhYmxlLCBwYXJlbnRzIGJlZm9yZVxuICAgKiBjaGlsZHJlbiwgY2h1bmtlZCB0byBib3VuZCBzdGF0ZW1lbnQgc2l6ZS5cbiAgICogQHBhcmFtIHtNYXA8c3RyaW5nLCBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPltdPn0gcm93c0J5VGFibGVOYW1lXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fVxuICAgKi9cbiAgYXN5bmMgaW5zZXJ0VGFyZ2V0Um93cyhyb3dzQnlUYWJsZU5hbWUpIHtcbiAgICBmb3IgKGNvbnN0IHRhYmxlQ29uZmlnIG9mIHRoaXMudGFibGVQbGFuKSB7XG4gICAgICBjb25zdCByb3dzID0gcm93c0J5VGFibGVOYW1lLmdldCh0YWJsZUNvbmZpZy50YWJsZU5hbWUpIHx8IFtdXG5cbiAgICAgIGlmIChyb3dzLmxlbmd0aCA8PSAwKSB7XG4gICAgICAgIGNvbnRpbnVlXG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGNvbHVtbnMgPSBPYmplY3Qua2V5cyhyb3dzWzBdKVxuICAgICAgY29uc3QgaW5zZXJ0Q2h1bmtzID0gY2h1bmtzKHJvd3MsIHRoaXMuaW5zZXJ0Q2h1bmtTaXplKVxuXG4gICAgICB0aGlzLnJlcG9ydFByb2dyZXNzKGAke3RhYmxlQ29uZmlnLnRhYmxlTmFtZX06IGluc2VydGluZyAke3Jvd3MubGVuZ3RofSByb3cocykgaW4gJHtpbnNlcnRDaHVua3MubGVuZ3RofSBjaHVuayhzKWApXG5cbiAgICAgIGZvciAoY29uc3Qgcm93c0NodW5rIG9mIGluc2VydENodW5rcykge1xuICAgICAgICBhd2FpdCB0aGlzLmluc2VydFJvd3NRdWlldGx5KHtcbiAgICAgICAgICBjb2x1bW5zLFxuICAgICAgICAgIGRiOiB0aGlzLnRhcmdldERiLFxuICAgICAgICAgIHJvd3M6IHJvd3NDaHVuay5tYXAoKHJvdykgPT4gY29sdW1ucy5tYXAoKGNvbHVtbikgPT4gcm93W2NvbHVtbl0pKSxcbiAgICAgICAgICB0YWJsZU5hbWU6IHRhYmxlQ29uZmlnLnRhYmxlTmFtZVxuICAgICAgICB9KVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBRdW90ZXMgYW5kIGNvbW1hLWpvaW5zIHZhbHVlcyBmb3IgYW4gU1FMIGBJTiAoLi4uKWAgbGlzdCBhZ2FpbnN0IHRoZSBnaXZlbiBkYXRhYmFzZS5cbiAgICogQHBhcmFtIHtpbXBvcnQoXCIuLi9kcml2ZXJzL2Jhc2UuanNcIikuZGVmYXVsdH0gZGJcbiAgICogQHBhcmFtIHtzdHJpbmdbXX0gdmFsdWVzXG4gICAqIEByZXR1cm5zIHtzdHJpbmd9XG4gICAqL1xuICBxdW90ZWRWYWx1ZXNTcWwoZGIsIHZhbHVlcykge1xuICAgIHJldHVybiB2YWx1ZXMubWFwKCh2YWx1ZSkgPT4gZGIucXVvdGUodmFsdWUpKS5qb2luKFwiLCBcIilcbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIGEgcXVlcnkgd2l0aG91dCBwZXItcXVlcnkgbG9nZ2luZywgdXNlZCBmb3IgdGhlIGhpZ2gtdm9sdW1lIGNvcHkgc3RhdGVtZW50cy5cbiAgICogQHBhcmFtIHtpbXBvcnQoXCIuLi9kcml2ZXJzL2Jhc2UuanNcIikuZGVmYXVsdH0gZGJcbiAgICogQHBhcmFtIHtzdHJpbmd9IHNxbFxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxSZWNvcmQ8c3RyaW5nLCB1bmtub3duPltdPn1cbiAgICovXG4gIGFzeW5jIGV4ZWN1dGVRdWlldFF1ZXJ5KGRiLCBzcWwpIHtcbiAgICByZXR1cm4gYXdhaXQgZGIucXVlcnkoc3FsLCB7bG9nUXVlcnk6IGZhbHNlfSlcbiAgfVxuXG4gIC8qKlxuICAgKiBJbnNlcnRzIGNvbHVtbi1hbGlnbmVkIHJvdyB0dXBsZXMgaW50byBhIHRhYmxlIHdpdGhvdXQgcGVyLXF1ZXJ5IGxvZ2dpbmcuXG4gICAqIEBwYXJhbSB7e2NvbHVtbnM6IHN0cmluZ1tdLCBkYjogaW1wb3J0KFwiLi4vZHJpdmVycy9iYXNlLmpzXCIpLmRlZmF1bHQsIHJvd3M6IEFycmF5PEFycmF5PHVua25vd24+PiwgdGFibGVOYW1lOiBzdHJpbmd9fSBhcmdzXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fVxuICAgKi9cbiAgYXN5bmMgaW5zZXJ0Um93c1F1aWV0bHkoe2NvbHVtbnMsIGRiLCByb3dzLCB0YWJsZU5hbWV9KSB7XG4gICAgYXdhaXQgdGhpcy5leGVjdXRlUXVpZXRRdWVyeShkYiwgZGIuaW5zZXJ0U3FsKHtjb2x1bW5zLCB0YWJsZU5hbWUsIHJvd3N9KSlcbiAgfVxuXG4gIC8qKlxuICAgKiBGb3J3YXJkcyBhIHByb2dyZXNzIG1lc3NhZ2UgdG8gdGhlIG9wdGlvbmFsIGBvblByb2dyZXNzYCBjYWxsYmFjayB3aGVuIG9uZSB3YXMgZ2l2ZW4uXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBtZXNzYWdlXG4gICAqIEByZXR1cm5zIHt2b2lkfVxuICAgKi9cbiAgcmVwb3J0UHJvZ3Jlc3MobWVzc2FnZSkge1xuICAgIGlmICh0aGlzLm9uUHJvZ3Jlc3MpIHtcbiAgICAgIHRoaXMub25Qcm9ncmVzcyhtZXNzYWdlKVxuICAgIH1cbiAgfVxufVxuIl19
|
|
256
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0YS1jb3BpZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvZGF0YWJhc2UvdGVuYW50cy9kYXRhLWNvcGllci5qcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxZQUFZO0FBRVosTUFBTSx5QkFBeUIsR0FBRyxHQUFHLENBQUE7QUFDckMsTUFBTSx3QkFBd0IsR0FBRyxHQUFHLENBQUE7QUFFcEM7Ozs7OztHQU1HO0FBQ0gsU0FBUyxNQUFNLENBQUMsTUFBTSxFQUFFLFNBQVM7SUFDL0IsTUFBTSxhQUFhLEdBQUcsRUFBRSxDQUFBO0lBRXhCLEtBQUssSUFBSSxLQUFLLEdBQUcsQ0FBQyxFQUFFLEtBQUssR0FBRyxNQUFNLENBQUMsTUFBTSxFQUFFLEtBQUssSUFBSSxTQUFTLEVBQUUsQ0FBQztRQUM5RCxhQUFhLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsS0FBSyxFQUFFLEtBQUssR0FBRyxTQUFTLENBQUMsQ0FBQyxDQUFBO0lBQzVELENBQUM7SUFFRCxPQUFPLGFBQWEsQ0FBQTtBQUN0QixDQUFDO0FBRUQ7Ozs7R0FJRztBQUNILFNBQVMsYUFBYSxDQUFDLE1BQU07SUFDM0IsT0FBTyxLQUFLLENBQUMsSUFBSSxDQUFDLElBQUksR0FBRyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsS0FBSyxDQUFDLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFBO0FBQ2xHLENBQUM7QUFFRDs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQW1CRztBQUNILE1BQU0sQ0FBQyxPQUFPLE9BQU8sVUFBVTtJQUM3Qjs7Ozs7Ozs7Ozs7T0FXRztJQUNILFlBQVksRUFBQyxRQUFRLEVBQUUsUUFBUSxFQUFFLFNBQVMsRUFBRSxRQUFRLEdBQUcsSUFBSSxF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LENBQUMsVUFBVSxFQUFFLENBQUM7WUFDcEIsSUFBSSxDQUFDLFVBQVUsQ0FBQyxPQUFPLENBQUMsQ0FBQTtRQUMxQixDQUFDO0lBQ0gsQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQHRzLWNoZWNrXG5cbmNvbnN0IERFRkFVTFRfSU5TRVJUX0NIVU5LX1NJWkUgPSAxMDBcbmNvbnN0IERFRkFVTFRfUVVFUllfQ0hVTktfU0laRSA9IDUwMFxuXG4vKipcbiAqIFNwbGl0cyBhbiBhcnJheSBpbnRvIGNodW5rcyBvZiBhdCBtb3N0IGBjaHVua1NpemVgIGl0ZW1zLlxuICogQHRlbXBsYXRlIFRcbiAqIEBwYXJhbSB7VFtdfSB2YWx1ZXMgLSBPcmRlcmVkIGl0ZW1zIHRvIHBhcnRpdGlvbi5cbiAqIEBwYXJhbSB7bnVtYmVyfSBjaHVua1NpemUgLSBNYXhpbXVtIGl0ZW1zIHBlciBjaHVuay5cbiAqIEByZXR1cm5zIHtUW11bXX0gLSBDb25zZWN1dGl2ZSBjaHVua3MgcHJlc2VydmluZyBpbnB1dCBvcmRlci5cbiAqL1xuZnVuY3Rpb24gY2h1bmtzKHZhbHVlcywgY2h1bmtTaXplKSB7XG4gIGNvbnN0IGNodW5rZWRWYWx1ZXMgPSBbXVxuXG4gIGZvciAobGV0IGluZGV4ID0gMDsgaW5kZXggPCB2YWx1ZXMubGVuZ3RoOyBpbmRleCArPSBjaHVua1NpemUpIHtcbiAgICBjaHVua2VkVmFsdWVzLnB1c2godmFsdWVzLnNsaWNlKGluZGV4LCBpbmRleCArIGNodW5rU2l6ZSkpXG4gIH1cblxuICByZXR1cm4gY2h1bmtlZFZhbHVlc1xufVxuXG4vKipcbiAqIFN0cmluZ2lmaWVzIHZhbHVlcyBhbmQgcmV0dXJucyB0aGUgZGlzdGluY3QsIG5vbi1ibGFuayBvbmVzLCBwcmVzZXJ2aW5nIGZpcnN0LXNlZW4gb3JkZXIuXG4gKiBAcGFyYW0ge3Vua25vd25bXX0gdmFsdWVzIC0gQ2FuZGlkYXRlIGRhdGFiYXNlIGlkZW50aWZpZXJzIHRvIHN0cmluZ2lmeSBhbmQgZGVkdXBsaWNhdGUuXG4gKiBAcmV0dXJucyB7c3RyaW5nW119IC0gRGlzdGluY3Qgbm9uLWJsYW5rIGlkZW50aWZpZXJzIGluIGZpcnN0LXNlZW4gb3JkZXIuXG4gKi9cbmZ1bmN0aW9uIHVuaXF1ZVN0cmluZ3ModmFsdWVzKSB7XG4gIHJldHVybiBBcnJheS5mcm9tKG5ldyBTZXQodmFsdWVzLm1hcCgodmFsdWUpID0+IFN0cmluZyh2YWx1ZSkpLmZpbHRlcigodmFsdWUpID0+IHZhbHVlLnRyaW0oKSkpKVxufVxuXG4vKipcbiAqIENvcGllcyBhIHNpbmdsZSB0ZW5hbnQncyByb3dzIGZyb20gYSBzb3VyY2UgZGF0YWJhc2UgaW50byBhIHRhcmdldCBkYXRhYmFzZSwgZm9sbG93aW5nIGFcbiAqIHRhYmxlIHBsYW4gdGhhdCBwYXJ0aXRpb25zIGVhY2ggdGFibGUgZWl0aGVyIGJ5IGEgZGlyZWN0IHRlbmFudCBrZXkgY29sdW1uIG9yIGJ5XG4gKiBwYXJlbnQtaWQgdHJhdmVyc2FsLiBUaGlzIGlzIHRoZSByb3ctbGV2ZWwgY291bnRlcnBhcnQgdG8gc2NoZW1hIGNsb25pbmc6IG11bHRpLXRlbmFudFxuICogYXBwcyB0aGF0IGtlZXAgZWFjaCB0ZW5hbnQncyBkYXRhIGluIGl0cyBvd24gZGF0YWJhc2UgdXNlIGl0IHRvIChyZSltYXRlcmlhbGlzZSB0aGVcbiAqIHRlbmFudCdzIHJvd3MgZnJvbSBhIGdsb2JhbC90ZW1wbGF0ZSBkYXRhYmFzZS5cbiAqXG4gKiBUaGUgY29weSBpcyBkZWxldGUtdGhlbi1yZWluc2VydCBhbmQgdGhlcmVmb3JlIGlkZW1wb3RlbnQsIGFuZCBpdCBtaXJyb3JzIHRoZSBzb3VyY2VcbiAqIHNuYXBzaG90OiB0aGUgcm93cyB0byBkZWxldGUgYXJlIHRoZSB0ZW5hbnQncyAqY3VycmVudCogcm93cyBpbiB0aGUgdGFyZ2V0IChzZWxlY3RlZCB3aXRoXG4gKiB0aGUgc2FtZSBwbGFuIHRyYXZlcnNhbCBydW4gYWdhaW5zdCB0aGUgdGFyZ2V0KSwgc28gYSByb3cgdGhhdCB3YXMgcmVtb3ZlZCBmcm9tIHRoZSBzb3VyY2VcbiAqIHNpbmNlIHRoZSBsYXN0IGNvcHkgaXMgZHJvcHBlZCBmcm9tIHRoZSB0YXJnZXQgdG9vIHJhdGhlciB0aGFuIGxpbmdlcmluZy4gVGhlIGRlbGV0ZXMgcnVuXG4gKiBjaGlsZHJlbiBmaXJzdCBhbmQgdGhlIHNvdXJjZSBpbnNlcnRzIHBhcmVudHMgZmlyc3QsIGFsbCBpbnNpZGUgb25lIHRhcmdldCB0cmFuc2FjdGlvbiB3aXRoXG4gKiBmb3JlaWduLWtleSBlbmZvcmNlbWVudCBkaXNhYmxlZCBzbyB0aGUgb3JkZXJpbmcgbmV2ZXIgdHJpcHMgYSBjb25zdHJhaW50LiBSZWFkcywgZGVsZXRlc1xuICogYW5kIGluc2VydHMgYXJlIGNodW5rZWQgdG8gYm91bmQgc3RhdGVtZW50IHNpemUuXG4gKlxuICogVGhlIGNvcGllciBpcyBwb2xpY3ktZnJlZTogdGhlIGNhbGxlciBzdXBwbGllcyB0aGUgcGxhbiwgdGhlIHNvdXJjZS90YXJnZXQgZGF0YWJhc2VzIGFuZFxuICogdGhlIHRlbmFudCBrZXksIGFuZCB7QGxpbmsgRGF0YUNvcGllciNjb3B5fSByZXR1cm5zIHRoZSBsb2FkZWQgcm93cyBrZXllZCBieSB0YWJsZSBuYW1lIHNvXG4gKiB0aGUgY2FsbGVyIGNhbiBwZXJmb3JtIGFueSBhcHAtc3BlY2lmaWMgcG9zdC1jb3B5IHdvcmsgKGZvciBleGFtcGxlIHJlZ2lzdGVyaW5nIHJlY29yZFxuICogbG9jYXRpb25zKSB3aXRob3V0IHRoYXQgcG9saWN5IGxlYWtpbmcgaW50byB0aGUgZnJhbWV3b3JrLlxuICovXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBEYXRhQ29waWVyIHtcbiAgLyoqXG4gICAqIENyZWF0ZXMgYSBjb3BpZXIgdGhhdCBtb3ZlcyB0ZW5hbnQtb3duZWQgcm93cyBmcm9tIGBzb3VyY2VEYmAgaW50byBgdGFyZ2V0RGJgLlxuICAgKiBAcGFyYW0ge3tcbiAgICogICBzb3VyY2VEYjogaW1wb3J0KFwiLi4vZHJpdmVycy9iYXNlLmpzXCIpLmRlZmF1bHQsXG4gICAqICAgdGFyZ2V0RGI6IGltcG9ydChcIi4uL2RyaXZlcnMvYmFzZS5qc1wiKS5kZWZhdWx0LFxuICAgKiAgIHRhYmxlUGxhbjogaW1wb3J0KFwiLi90ZW5hbnQtdGFibGUtcGxhbi5qc1wiKS5UZW5hbnRUYWJsZVBsYW5FbnRyeVtdLFxuICAgKiAgIGlkQ29sdW1uPzogc3RyaW5nLFxuICAgKiAgIGluc2VydENodW5rU2l6ZT86IG51bWJlcixcbiAgICogICBxdWVyeUNodW5rU2l6ZT86IG51bWJlcixcbiAgICogICBvblByb2dyZXNzPzogKG1lc3NhZ2U6IHN0cmluZykgPT4gdm9pZFxuICAgKiB9fSBhcmdzIC0gU291cmNlLCB0YXJnZXQsIHRyYXZlcnNhbCBwbGFuLCBjaHVuayBsaW1pdHMsIGFuZCBwcm9ncmVzcyBoYW5kbGVyLlxuICAgKi9cbiAgY29uc3RydWN0b3Ioe3NvdXJjZURiLCB0YXJnZXREYiwgdGFibGVQbGFuLCBpZENvbHVtbiA9IFwiaWRcIiwgaW5zZXJ0Q2h1bmtTaXplID0gREVGQVVMVF9JTlNFUlRfQ0hVTktfU0laRSwgcXVlcnlDaHVua1NpemUgPSBERUZBVUxUX1FVRVJZX0NIVU5LX1NJWkUsIG9uUHJvZ3Jlc3N9KSB7XG4gICAgdGhpcy5zb3VyY2VEYiA9IHNvdXJjZURiXG4gICAgdGhpcy50YXJnZXREYiA9IHRhcmdldERiXG4gICAgdGhpcy50YWJsZVBsYW4gPSB0YWJsZVBsYW5cbiAgICB0aGlzLmlkQ29sdW1uID0gaWRDb2x1bW5cbiAgICB0aGlzLmluc2VydENodW5rU2l6ZSA9IGluc2VydENodW5rU2l6ZVxuICAgIHRoaXMucXVlcnlDaHVua1NpemUgPSBxdWVyeUNodW5rU2l6ZVxuICAgIHRoaXMub25Qcm9ncmVzcyA9IG9uUHJvZ3Jlc3NcbiAgfVxuXG4gIC8qKlxuICAgKiBDb3BpZXMgZXZlcnkgcGxhbiB0YWJsZSdzIHJvd3MgZm9yIGBrZXlWYWx1ZWAgZnJvbSB0aGUgc291cmNlIGludG8gdGhlIHRhcmdldCBhbmRcbiAgICogcmV0dXJucyB0aGUgY29waWVkIHNvdXJjZSByb3dzIGtleWVkIGJ5IHRhYmxlIG5hbWUuIFRoZSB0YXJnZXQncyBjdXJyZW50IHRlbmFudCByb3dzXG4gICAqIGFyZSBkZWxldGVkIChjaGlsZHJlbiBmaXJzdCkgYW5kIHRoZSBzb3VyY2Ugcm93cyBpbnNlcnRlZCAocGFyZW50cyBmaXJzdCkgaW4gYSBzaW5nbGVcbiAgICogdGFyZ2V0IHRyYW5zYWN0aW9uIHdpdGggZm9yZWlnbiBrZXlzIGRpc2FibGVkLlxuICAgKiBAcGFyYW0ge3N0cmluZ30ga2V5VmFsdWUgLSBUZW5hbnQga2V5IHNlbGVjdGluZyB0aGUgcm93cyB0byBjb3B5LlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxNYXA8c3RyaW5nLCBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPltdPj59IC0gQ29waWVkIHNvdXJjZSByb3dzIGdyb3VwZWQgYnkgdGFibGUgbmFtZS5cbiAgICovXG4gIGFzeW5jIGNvcHkoa2V5VmFsdWUpIHtcbiAgICBjb25zdCBzb3VyY2VSb3dzQnlUYWJsZU5hbWUgPSBhd2FpdCB0aGlzLmxvYWRSb3dzKHRoaXMuc291cmNlRGIsIGtleVZhbHVlKVxuICAgIGNvbnN0IHRhcmdldFJvd3NCeVRhYmxlTmFtZSA9IGF3YWl0IHRoaXMubG9hZFJvd3ModGhpcy50YXJnZXREYiwga2V5VmFsdWUpXG5cbiAgICBhd2FpdCB0aGlzLnRhcmdldERiLndpdGhEaXNhYmxlZEZvcmVpZ25LZXlzKGFzeW5jICgpID0+IHtcbiAgICAgIGF3YWl0IHRoaXMudGFyZ2V0RGIudHJhbnNhY3Rpb24oYXN5bmMgKCkgPT4ge1xuICAgICAgICBhd2FpdCB0aGlzLmRlbGV0ZVRhcmdldFJvd3ModGFyZ2V0Um93c0J5VGFibGVOYW1lKVxuICAgICAgICBhd2FpdCB0aGlzLmluc2VydFRhcmdldFJvd3Moc291cmNlUm93c0J5VGFibGVOYW1lKVxuICAgICAgfSlcbiAgICB9KVxuXG4gICAgcmV0dXJuIHNvdXJjZVJvd3NCeVRhYmxlTmFtZVxuICB9XG5cbiAgLyoqXG4gICAqIERlbGV0ZXMgb25lIHRlbmFudCdzIHJvd3MgZnJvbSB0aGUgdGFyZ2V0IGRhdGFiYXNlLCBjaGlsZHJlbiBiZWZvcmUgcGFyZW50cywgd2l0aFxuICAgKiBmb3JlaWduIGtleXMgZGlzYWJsZWQgaW5zaWRlIGEgc2luZ2xlIHRyYW5zYWN0aW9uLiBUaGlzIGlzIGBjb3B5YCB3aXRob3V0IHRoZSByZWluc2VydDpcbiAgICogdGhlIHNhbWUgcGxhbiB0cmF2ZXJzYWwgc2VsZWN0cyB0aGUgdGVuYW50J3MgY3VycmVudCB0YXJnZXQgcm93cyBhbmQgYGRlbGV0ZVRhcmdldFJvd3NgXG4gICAqIHJlbW92ZXMgdGhlbSBjaGlsZHJlbi1maXJzdCBzbyB0aGUgb3JkZXJpbmcgbmV2ZXIgdHJpcHMgYSBmb3JlaWduIGtleS4gTXVsdGktdGVuYW50IGFwcHNcbiAgICogdXNlIGl0IHRvIHB1cmdlIGEgdGVuYW50IOKAlCBmb3IgZXhhbXBsZSBjbGVhcmluZyB0aGUgdGVuYW50J3MgbWFzdGVyIGNvcHkgaW4gdGhlXG4gICAqIGdsb2JhbC9kZWZhdWx0IGRhdGFiYXNlIG9uIHRlYXJkb3duLCBzbyBmb3JlaWduIGtleXMgc3RvcCByZWZlcmVuY2luZyB0aGUgdGVuYW50J3NcbiAgICogYWJvdXQtdG8tYmUtcmVtb3ZlZCByb290IHJvdy5cbiAgICpcbiAgICogUmV0dXJucyB0aGUgZGVsZXRlZCByb3dzIGtleWVkIGJ5IHRhYmxlIG5hbWUgc28gdGhlIGNhbGxlciBjYW4gcGVyZm9ybSBhbnkgYXBwLXNwZWNpZmljXG4gICAqIHBvc3QtZGVsZXRlIHdvcmsgKHJlY29yZC1sb2NhdGlvbiBjbGVhbnVwLCBhdWRpdGluZykgd2l0aG91dCB0aGF0IHBvbGljeSBsZWFraW5nIGludG8gdGhlXG4gICAqIGZyYW1ld29yay5cbiAgICogQHBhcmFtIHtzdHJpbmd9IGtleVZhbHVlIC0gVGVuYW50IGtleSB3aG9zZSByb3dzIHNob3VsZCBiZSByZW1vdmVkIGZyb20gdGhlIHRhcmdldC5cbiAgICogQHJldHVybnMge1Byb21pc2U8TWFwPHN0cmluZywgUmVjb3JkPHN0cmluZywgdW5rbm93bj5bXT4+fSAtIFRoZSBkZWxldGVkIHJvd3MgYnkgdGFibGUgbmFtZS5cbiAgICovXG4gIGFzeW5jIGRlbGV0ZVRlbmFudFJvd3Moa2V5VmFsdWUpIHtcbiAgICBjb25zdCByb3dzQnlUYWJsZU5hbWUgPSBhd2FpdCB0aGlzLmxvYWRSb3dzKHRoaXMudGFyZ2V0RGIsIGtleVZhbHVlKVxuXG4gICAgYXdhaXQgdGhpcy50YXJnZXREYi53aXRoRGlzYWJsZWRGb3JlaWduS2V5cyhhc3luYyAoKSA9PiB7XG4gICAgICBhd2FpdCB0aGlzLnRhcmdldERiLnRyYW5zYWN0aW9uKGFzeW5jICgpID0+IHtcbiAgICAgICAgYXdhaXQgdGhpcy5kZWxldGVUYXJnZXRSb3dzKHJvd3NCeVRhYmxlTmFtZSlcbiAgICAgIH0pXG4gICAgfSlcblxuICAgIHJldHVybiByb3dzQnlUYWJsZU5hbWVcbiAgfVxuXG4gIC8qKlxuICAgKiBMb2FkcyB0aGUgcm93cyBmb3IgYGtleVZhbHVlYCBmb3IgZXZlcnkgdGFibGUgaW4gdGhlIHBsYW4gZnJvbSBgZGJgLCByZXNvbHZpbmdcbiAgICogcGFyZW50LXNjb3BlZCB0YWJsZXMgZnJvbSB0aGUgaWRzIGFscmVhZHkgc2VsZWN0ZWQgZm9yIHRoZWlyIHBhcmVudCB0YWJsZS4gVXNlZCBmb3JcbiAgICogYm90aCB0aGUgc291cmNlIHJvd3MgdG8gY29weSBhbmQgdGhlIHRhcmdldCdzIGN1cnJlbnQgdGVuYW50IHJvd3MgdG8gZGVsZXRlLlxuICAgKiBAcGFyYW0ge2ltcG9ydChcIi4uL2RyaXZlcnMvYmFzZS5qc1wiKS5kZWZhdWx0fSBkYiAtIFNvdXJjZSBvciB0YXJnZXQgZGF0YWJhc2UgdG8gdHJhdmVyc2UuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBrZXlWYWx1ZSAtIFRlbmFudCBrZXkgc2VsZWN0aW5nIHRoZSByb290IHBsYW4gcm93cy5cbiAgICogQHJldHVybnMge1Byb21pc2U8TWFwPHN0cmluZywgUmVjb3JkPHN0cmluZywgdW5rbm93bj5bXT4+fSAtIExvYWRlZCByb3dzIGdyb3VwZWQgYnkgdGFibGUgbmFtZS5cbiAgICovXG4gIGFzeW5jIGxvYWRSb3dzKGRiLCBrZXlWYWx1ZSkge1xuICAgIC8qKiBAdHlwZSB7TWFwPHN0cmluZywgc3RyaW5nW10+fSAqL1xuICAgIGNvbnN0IGlkc0J5VGFibGVOYW1lID0gbmV3IE1hcCgpXG4gICAgLyoqIEB0eXBlIHtNYXA8c3RyaW5nLCBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPltdPn0gKi9cbiAgICBjb25zdCByb3dzQnlUYWJsZU5hbWUgPSBuZXcgTWFwKClcblxuICAgIGZvciAoY29uc3QgdGFibGVDb25maWcgb2YgdGhpcy50YWJsZVBsYW4pIHtcbiAgICAgIGxldCByb3dzXG5cbiAgICAgIGlmICh0YWJsZUNvbmZpZy5rZXlDb2x1bW4pIHtcbiAgICAgICAgcm93cyA9IGF3YWl0IHRoaXMucXVlcnlSb3dzQnlDb2x1bW4oe1xuICAgICAgICAgIGNvbHVtbk5hbWU6IHRhYmxlQ29uZmlnLmtleUNvbHVtbixcbiAgICAgICAgICBkYixcbiAgICAgICAgICB0YWJsZU5hbWU6IHRhYmxlQ29uZmlnLnRhYmxlTmFtZSxcbiAgICAgICAgICB2YWx1ZXM6IFtrZXlWYWx1ZV1cbiAgICAgICAgfSlcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGlmICghdGFibGVDb25maWcucGFyZW50Q29sdW1uIHx8ICF0YWJsZUNvbmZpZy5wYXJlbnRUYWJsZU5hbWUpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEV4cGVjdGVkIGtleUNvbHVtbiBvciBwYXJlbnRUYWJsZU5hbWUrcGFyZW50Q29sdW1uIGZvciB0YWJsZSAke3RhYmxlQ29uZmlnLnRhYmxlTmFtZX0gaW4gdGhlIHRlbmFudCB0YWJsZSBwbGFuLmApXG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIWlkc0J5VGFibGVOYW1lLmhhcyh0YWJsZUNvbmZpZy5wYXJlbnRUYWJsZU5hbWUpKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBUZW5hbnQgdGFibGUgcGxhbiBlbnRyeSAke3RhYmxlQ29uZmlnLnRhYmxlTmFtZX0gcmVmZXJlbmNlcyBwYXJlbnQgdGFibGUgJHt0YWJsZUNvbmZpZy5wYXJlbnRUYWJsZU5hbWV9LCB3aGljaCBoYXMgbm90IGJlZW4gbG9hZGVkOyBwYXJlbnQgdGFibGVzIG11c3QgYXBwZWFyIGJlZm9yZSB0aGVpciBjaGlsZHJlbiBpbiB0aGUgcGxhbi5gKVxuICAgICAgICB9XG5cbiAgICAgICAgcm93cyA9IGF3YWl0IHRoaXMucXVlcnlSb3dzQnlDb2x1bW4oe1xuICAgICAgICAgIGNvbHVtbk5hbWU6IHRhYmxlQ29uZmlnLnBhcmVudENvbHVtbixcbiAgICAgICAgICBkYixcbiAgICAgICAgICB0YWJsZU5hbWU6IHRhYmxlQ29uZmlnLnRhYmxlTmFtZSxcbiAgICAgICAgICB2YWx1ZXM6IGlkc0J5VGFibGVOYW1lLmdldCh0YWJsZUNvbmZpZy5wYXJlbnRUYWJsZU5hbWUpIHx8IFtdXG4gICAgICAgIH0pXG4gICAgICB9XG5cbiAgICAgIGlmIChyb3dzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgdGhpcy5yZXBvcnRQcm9ncmVzcyhgJHt0YWJsZUNvbmZpZy50YWJsZU5hbWV9OiBsb2FkZWQgJHtyb3dzLmxlbmd0aH0gcm93KHMpYClcbiAgICAgIH1cblxuICAgICAgaWRzQnlUYWJsZU5hbWUuc2V0KHRhYmxlQ29uZmlnLnRhYmxlTmFtZSwgdW5pcXVlU3RyaW5ncyhyb3dzLm1hcCgocm93KSA9PiByb3dbdGhpcy5pZENvbHVtbl0pKSlcbiAgICAgIHJvd3NCeVRhYmxlTmFtZS5zZXQodGFibGVDb25maWcudGFibGVOYW1lLCByb3dzKVxuICAgIH1cblxuICAgIHJldHVybiByb3dzQnlUYWJsZU5hbWVcbiAgfVxuXG4gIC8qKlxuICAgKiBTZWxlY3RzIGFsbCByb3dzIG9mIGB0YWJsZU5hbWVgIGluIGBkYmAgd2hvc2UgYGNvbHVtbk5hbWVgIGlzIGluIGB2YWx1ZXNgLCBjaHVua2VkLlxuICAgKiBAcGFyYW0ge3tjb2x1bW5OYW1lOiBzdHJpbmcsIGRiOiBpbXBvcnQoXCIuLi9kcml2ZXJzL2Jhc2UuanNcIikuZGVmYXVsdCwgdGFibGVOYW1lOiBzdHJpbmcsIHZhbHVlczogc3RyaW5nW119fSBhcmdzIC0gVGFibGUsIGNvbHVtbiwgZGF0YWJhc2UsIGFuZCB2YWx1ZXMgZm9yIHRoZSBjaHVua2VkIGxvb2t1cC5cbiAgICogQHJldHVybnMge1Byb21pc2U8UmVjb3JkPHN0cmluZywgdW5rbm93bj5bXT59IC0gUm93cyBtYXRjaGluZyB0aGUgc3VwcGxpZWQgY29sdW1uIHZhbHVlcy5cbiAgICovXG4gIGFzeW5jIHF1ZXJ5Um93c0J5Q29sdW1uKHtjb2x1bW5OYW1lLCBkYiwgdGFibGVOYW1lLCB2YWx1ZXN9KSB7XG4gICAgY29uc3Qgbm9ybWFsaXplZFZhbHVlcyA9IHVuaXF1ZVN0cmluZ3ModmFsdWVzKVxuXG4gICAgaWYgKG5vcm1hbGl6ZWRWYWx1ZXMubGVuZ3RoIDw9IDApIHtcbiAgICAgIHJldHVybiBbXVxuICAgIH1cblxuICAgIGNvbnN0IHJvd3MgPSBbXVxuICAgIGNvbnN0IHF1b3RlZFRhYmxlID0gZGIucXVvdGVUYWJsZSh0YWJsZU5hbWUpXG4gICAgY29uc3QgcXVvdGVkQ29sdW1uID0gZGIucXVvdGVDb2x1bW4oY29sdW1uTmFtZSlcblxuICAgIGZvciAoY29uc3QgdmFsdWVzQ2h1bmsgb2YgY2h1bmtzKG5vcm1hbGl6ZWRWYWx1ZXMsIHRoaXMucXVlcnlDaHVua1NpemUpKSB7XG4gICAgICBjb25zdCBzcWwgPSBgU0VMRUNUICR7cXVvdGVkVGFibGV9LiogRlJPTSAke3F1b3RlZFRhYmxlfSBXSEVSRSAke3F1b3RlZENvbHVtbn0gSU4gKCR7dGhpcy5xdW90ZWRWYWx1ZXNTcWwoZGIsIHZhbHVlc0NodW5rKX0pYFxuXG4gICAgICByb3dzLnB1c2goLi4uYXdhaXQgdGhpcy5leGVjdXRlUXVpZXRRdWVyeShkYiwgc3FsKSlcbiAgICB9XG5cbiAgICByZXR1cm4gcm93c1xuICB9XG5cbiAgLyoqXG4gICAqIERlbGV0ZXMgdGhlIG1hdGNoaW5nIHRhcmdldCByb3dzIGZvciBldmVyeSBwbGFuIHRhYmxlLCBjaGlsZHJlbiBiZWZvcmUgcGFyZW50cywgc28gdGhlXG4gICAqIHJlaW5zZXJ0IHRoYXQgZm9sbG93cyBzdGFydHMgZnJvbSBhIGNsZWFuIHNsYXRlIHdpdGhvdXQgdmlvbGF0aW5nIGZvcmVpZ24ga2V5cy5cbiAgICogQHBhcmFtIHtNYXA8c3RyaW5nLCBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPltdPn0gcm93c0J5VGFibGVOYW1lIC0gUm93cyBncm91cGVkIGJ5IHRhYmxlIG5hbWUuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fVxuICAgKi9cbiAgYXN5bmMgZGVsZXRlVGFyZ2V0Um93cyhyb3dzQnlUYWJsZU5hbWUpIHtcbiAgICBmb3IgKGNvbnN0IHRhYmxlQ29uZmlnIG9mIFsuLi50aGlzLnRhYmxlUGxhbl0ucmV2ZXJzZSgpKSB7XG4gICAgICBjb25zdCByb3dJZHMgPSB1bmlxdWVTdHJpbmdzKChyb3dzQnlUYWJsZU5hbWUuZ2V0KHRhYmxlQ29uZmlnLnRhYmxlTmFtZSkgfHwgW10pLm1hcCgocm93KSA9PiByb3dbdGhpcy5pZENvbHVtbl0pKVxuXG4gICAgICBpZiAocm93SWRzLmxlbmd0aCA8PSAwKSB7XG4gICAgICAgIGNvbnRpbnVlXG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHF1b3RlZFRhYmxlID0gdGhpcy50YXJnZXREYi5xdW90ZVRhYmxlKHRhYmxlQ29uZmlnLnRhYmxlTmFtZSlcbiAgICAgIGNvbnN0IHF1b3RlZElkQ29sdW1uID0gdGhpcy50YXJnZXREYi5xdW90ZUNvbHVtbih0aGlzLmlkQ29sdW1uKVxuXG4gICAgICBmb3IgKGNvbnN0IHJvd0lkc0NodW5rIG9mIGNodW5rcyhyb3dJZHMsIHRoaXMucXVlcnlDaHVua1NpemUpKSB7XG4gICAgICAgIGF3YWl0IHRoaXMuZXhlY3V0ZVF1aWV0UXVlcnkoXG4gICAgICAgICAgdGhpcy50YXJnZXREYixcbiAgICAgICAgICBgREVMRVRFIEZST00gJHtxdW90ZWRUYWJsZX0gV0hFUkUgJHtxdW90ZWRJZENvbHVtbn0gSU4gKCR7dGhpcy5xdW90ZWRWYWx1ZXNTcWwodGhpcy50YXJnZXREYiwgcm93SWRzQ2h1bmspfSlgXG4gICAgICAgIClcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogSW5zZXJ0cyB0aGUgbG9hZGVkIHNvdXJjZSByb3dzIGludG8gdGhlIHRhcmdldCBmb3IgZXZlcnkgcGxhbiB0YWJsZSwgcGFyZW50cyBiZWZvcmVcbiAgICogY2hpbGRyZW4sIGNodW5rZWQgdG8gYm91bmQgc3RhdGVtZW50IHNpemUuXG4gICAqIEBwYXJhbSB7TWFwPHN0cmluZywgUmVjb3JkPHN0cmluZywgdW5rbm93bj5bXT59IHJvd3NCeVRhYmxlTmFtZSAtIFJvd3MgZ3JvdXBlZCBieSB0YWJsZSBuYW1lLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn1cbiAgICovXG4gIGFzeW5jIGluc2VydFRhcmdldFJvd3Mocm93c0J5VGFibGVOYW1lKSB7XG4gICAgZm9yIChjb25zdCB0YWJsZUNvbmZpZyBvZiB0aGlzLnRhYmxlUGxhbikge1xuICAgICAgY29uc3Qgcm93cyA9IHJvd3NCeVRhYmxlTmFtZS5nZXQodGFibGVDb25maWcudGFibGVOYW1lKSB8fCBbXVxuXG4gICAgICBpZiAocm93cy5sZW5ndGggPD0gMCkge1xuICAgICAgICBjb250aW51ZVxuICAgICAgfVxuXG4gICAgICBjb25zdCBjb2x1bW5zID0gT2JqZWN0LmtleXMocm93c1swXSlcbiAgICAgIGNvbnN0IGluc2VydENodW5rcyA9IGNodW5rcyhyb3dzLCB0aGlzLmluc2VydENodW5rU2l6ZSlcblxuICAgICAgdGhpcy5yZXBvcnRQcm9ncmVzcyhgJHt0YWJsZUNvbmZpZy50YWJsZU5hbWV9OiBpbnNlcnRpbmcgJHtyb3dzLmxlbmd0aH0gcm93KHMpIGluICR7aW5zZXJ0Q2h1bmtzLmxlbmd0aH0gY2h1bmsocylgKVxuXG4gICAgICBmb3IgKGNvbnN0IHJvd3NDaHVuayBvZiBpbnNlcnRDaHVua3MpIHtcbiAgICAgICAgYXdhaXQgdGhpcy5pbnNlcnRSb3dzUXVpZXRseSh7XG4gICAgICAgICAgY29sdW1ucyxcbiAgICAgICAgICBkYjogdGhpcy50YXJnZXREYixcbiAgICAgICAgICByb3dzOiByb3dzQ2h1bmsubWFwKChyb3cpID0+IGNvbHVtbnMubWFwKChjb2x1bW4pID0+IHJvd1tjb2x1bW5dKSksXG4gICAgICAgICAgdGFibGVOYW1lOiB0YWJsZUNvbmZpZy50YWJsZU5hbWVcbiAgICAgICAgfSlcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUXVvdGVzIGFuZCBjb21tYS1qb2lucyB2YWx1ZXMgZm9yIGFuIFNRTCBgSU4gKC4uLilgIGxpc3QgYWdhaW5zdCB0aGUgZ2l2ZW4gZGF0YWJhc2UuXG4gICAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vZHJpdmVycy9iYXNlLmpzXCIpLmRlZmF1bHR9IGRiIC0gRGF0YWJhc2Ugd2hvc2UgcXVvdGluZyBydWxlcyBmb3JtYXQgdGhlIHZhbHVlcy5cbiAgICogQHBhcmFtIHtzdHJpbmdbXX0gdmFsdWVzIC0gVmFsdWVzIHRvIHF1b3RlIGZvciB0aGUgYElOYCBsaXN0LlxuICAgKiBAcmV0dXJucyB7c3RyaW5nfSAtIFF1b3RlZCBTUUwgdmFsdWUgbGlzdC5cbiAgICovXG4gIHF1b3RlZFZhbHVlc1NxbChkYiwgdmFsdWVzKSB7XG4gICAgcmV0dXJuIHZhbHVlcy5tYXAoKHZhbHVlKSA9PiBkYi5xdW90ZSh2YWx1ZSkpLmpvaW4oXCIsIFwiKVxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgYSBxdWVyeSB3aXRob3V0IHBlci1xdWVyeSBsb2dnaW5nLCB1c2VkIGZvciB0aGUgaGlnaC12b2x1bWUgY29weSBzdGF0ZW1lbnRzLlxuICAgKiBAcGFyYW0ge2ltcG9ydChcIi4uL2RyaXZlcnMvYmFzZS5qc1wiKS5kZWZhdWx0fSBkYiAtIERhdGFiYXNlIG9uIHdoaWNoIHRvIGV4ZWN1dGUgdGhlIGNvcHkgcXVlcnkuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBzcWwgLSBDb3B5LXJlbGF0ZWQgU1FMIHN0YXRlbWVudCB0byBleGVjdXRlIHF1aWV0bHkuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPFJlY29yZDxzdHJpbmcsIHVua25vd24+W10+fSAtIFF1ZXJ5IHJlc3VsdCByb3dzLlxuICAgKi9cbiAgYXN5bmMgZXhlY3V0ZVF1aWV0UXVlcnkoZGIsIHNxbCkge1xuICAgIHJldHVybiBhd2FpdCBkYi5xdWVyeShzcWwsIHtsb2dRdWVyeTogZmFsc2V9KVxuICB9XG5cbiAgLyoqXG4gICAqIEluc2VydHMgY29sdW1uLWFsaWduZWQgcm93IHR1cGxlcyBpbnRvIGEgdGFibGUgd2l0aG91dCBwZXItcXVlcnkgbG9nZ2luZy5cbiAgICogQHBhcmFtIHt7Y29sdW1uczogc3RyaW5nW10sIGRiOiBpbXBvcnQoXCIuLi9kcml2ZXJzL2Jhc2UuanNcIikuZGVmYXVsdCwgcm93czogQXJyYXk8QXJyYXk8dW5rbm93bj4+LCB0YWJsZU5hbWU6IHN0cmluZ319IGFyZ3MgLSBEZXN0aW5hdGlvbiB0YWJsZSBhbmQgY29sdW1uLWFsaWduZWQgcm93IHZhbHVlcyB0byBpbnNlcnQuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fVxuICAgKi9cbiAgYXN5bmMgaW5zZXJ0Um93c1F1aWV0bHkoe2NvbHVtbnMsIGRiLCByb3dzLCB0YWJsZU5hbWV9KSB7XG4gICAgYXdhaXQgdGhpcy5leGVjdXRlUXVpZXRRdWVyeShkYiwgZGIuaW5zZXJ0U3FsKHtjb2x1bW5zLCB0YWJsZU5hbWUsIHJvd3N9KSlcbiAgfVxuXG4gIC8qKlxuICAgKiBGb3J3YXJkcyBhIHByb2dyZXNzIG1lc3NhZ2UgdG8gdGhlIG9wdGlvbmFsIGBvblByb2dyZXNzYCBjYWxsYmFjayB3aGVuIG9uZSB3YXMgZ2l2ZW4uXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBtZXNzYWdlIC0gQ29weSBwcm9ncmVzcyBtZXNzYWdlIHRvIGZvcndhcmQgd2hlbiByZXBvcnRpbmcgaXMgZW5hYmxlZC5cbiAgICogQHJldHVybnMge3ZvaWR9XG4gICAqL1xuICByZXBvcnRQcm9ncmVzcyhtZXNzYWdlKSB7XG4gICAgaWYgKHRoaXMub25Qcm9ncmVzcykge1xuICAgICAgdGhpcy5vblByb2dyZXNzKG1lc3NhZ2UpXG4gICAgfVxuICB9XG59XG4iXX0=
|
|
@@ -15,7 +15,7 @@
|
|
|
15
15
|
export default class SchemaCloner {
|
|
16
16
|
/**
|
|
17
17
|
* Creates a cloner that copies table structure from `sourceDb` into `targetDb`.
|
|
18
|
-
* @param {{sourceDb: import("../drivers/base.js").default, targetDb: import("../drivers/base.js").default}} args
|
|
18
|
+
* @param {{sourceDb: import("../drivers/base.js").default, targetDb: import("../drivers/base.js").default}} args - Databases to clone structure from and into.
|
|
19
19
|
*/
|
|
20
20
|
constructor({ sourceDb, targetDb }: {
|
|
21
21
|
sourceDb: import("../drivers/base.js").default;
|
|
@@ -26,21 +26,21 @@ export default class SchemaCloner {
|
|
|
26
26
|
/**
|
|
27
27
|
* Clones every given table from the source into the target, then baselines the
|
|
28
28
|
* target's ledger so the cloned schema is recorded as already-migrated.
|
|
29
|
-
* @param {string[]} tableNames
|
|
29
|
+
* @param {string[]} tableNames - Source tables whose structure should be cloned.
|
|
30
30
|
* @returns {Promise<void>}
|
|
31
31
|
*/
|
|
32
32
|
syncTables(tableNames: string[]): Promise<void>;
|
|
33
33
|
/**
|
|
34
34
|
* Clones a single table from the source into the target, creating it or adding and
|
|
35
35
|
* widening columns and indexes as needed.
|
|
36
|
-
* @param {string} tableName
|
|
36
|
+
* @param {string} tableName - Source table to synchronize with the target.
|
|
37
37
|
* @returns {Promise<void>}
|
|
38
38
|
*/
|
|
39
39
|
syncTable(tableName: string): Promise<void>;
|
|
40
40
|
/**
|
|
41
41
|
* Creates the table in the target from the source table's columns and its
|
|
42
42
|
* non-primary-key indexes.
|
|
43
|
-
* @param {{sourceTable: import("../drivers/base-table.js").default, tableName: string}} args
|
|
43
|
+
* @param {{sourceTable: import("../drivers/base-table.js").default, tableName: string}} args - Source table metadata and target table name.
|
|
44
44
|
* @returns {Promise<void>}
|
|
45
45
|
*/
|
|
46
46
|
createTargetTable({ sourceTable, tableName }: {
|
|
@@ -50,7 +50,7 @@ export default class SchemaCloner {
|
|
|
50
50
|
/**
|
|
51
51
|
* Adds columns present on the source but missing from the target, and widens
|
|
52
52
|
* too-narrow target text columns.
|
|
53
|
-
* @param {{sourceTable: import("../drivers/base-table.js").default, tableName: string}} args
|
|
53
|
+
* @param {{sourceTable: import("../drivers/base-table.js").default, tableName: string}} args - Source table metadata and target table name.
|
|
54
54
|
* @returns {Promise<boolean>} Whether any column was added or widened.
|
|
55
55
|
*/
|
|
56
56
|
ensureTargetColumns({ sourceTable, tableName }: {
|
|
@@ -61,7 +61,7 @@ export default class SchemaCloner {
|
|
|
61
61
|
* Creates non-primary-key indexes present on the source but missing from the target,
|
|
62
62
|
* and replaces target indexes whose definition (columns or uniqueness) drifted from
|
|
63
63
|
* the source.
|
|
64
|
-
* @param {{sourceTable: import("../drivers/base-table.js").default, tableName: string}} args
|
|
64
|
+
* @param {{sourceTable: import("../drivers/base-table.js").default, tableName: string}} args - Source table metadata and target table name.
|
|
65
65
|
* @returns {Promise<void>}
|
|
66
66
|
*/
|
|
67
67
|
ensureTargetIndexes({ sourceTable, tableName }: {
|
|
@@ -70,7 +70,7 @@ export default class SchemaCloner {
|
|
|
70
70
|
}): Promise<void>;
|
|
71
71
|
/**
|
|
72
72
|
* Drops an index on the target database.
|
|
73
|
-
* @param {{tableName: string, targetIndex: import("../drivers/base-columns-index.js").default}} args
|
|
73
|
+
* @param {{tableName: string, targetIndex: import("../drivers/base-columns-index.js").default}} args - Target table and index to remove.
|
|
74
74
|
* @returns {Promise<void>}
|
|
75
75
|
*/
|
|
76
76
|
dropTargetIndex({ tableName, targetIndex }: {
|
|
@@ -85,21 +85,21 @@ export default class SchemaCloner {
|
|
|
85
85
|
/**
|
|
86
86
|
* Whether the target ledger is missing any version applied on the source — i.e. the
|
|
87
87
|
* target schema may have been advanced out of band without recording it.
|
|
88
|
-
* @returns {Promise<boolean>}
|
|
88
|
+
* @returns {Promise<boolean>} - Whether the target ledger differs from the source.
|
|
89
89
|
*/
|
|
90
90
|
ledgerDriftsFromSource(): Promise<boolean>;
|
|
91
91
|
/**
|
|
92
92
|
* Maps a source index into a TableData index for table creation (SQLite omits the
|
|
93
93
|
* index name so the driver can generate a unique one).
|
|
94
|
-
* @param {import("../drivers/base-columns-index.js").default} sourceIndex
|
|
95
|
-
* @returns {TableIndex}
|
|
94
|
+
* @param {import("../drivers/base-columns-index.js").default} sourceIndex - Source index definition.
|
|
95
|
+
* @returns {TableIndex} - Framework-independent index definition.
|
|
96
96
|
*/
|
|
97
97
|
tableDataIndexFromSourceIndex(sourceIndex: import("../drivers/base-columns-index.js").default): TableIndex;
|
|
98
98
|
/**
|
|
99
99
|
* Builds driver create-index args from a source index (the index name is omitted on
|
|
100
100
|
* SQLite, where index names are unique per-database rather than per-table).
|
|
101
|
-
* @param {{sourceIndex: import("../drivers/base-columns-index.js").default, tableName: string}} args
|
|
102
|
-
* @returns {{columns: string[], name?: string, tableName: string, unique: boolean}}
|
|
101
|
+
* @param {{sourceIndex: import("../drivers/base-columns-index.js").default, tableName: string}} args - Source index and target table receiving it.
|
|
102
|
+
* @returns {{columns: string[], name?: string, tableName: string, unique: boolean}} - Arguments for creating the target index.
|
|
103
103
|
*/
|
|
104
104
|
createIndexArgsFromSourceIndex({ sourceIndex, tableName }: {
|
|
105
105
|
sourceIndex: import("../drivers/base-columns-index.js").default;
|
|
@@ -112,42 +112,42 @@ export default class SchemaCloner {
|
|
|
112
112
|
};
|
|
113
113
|
/**
|
|
114
114
|
* Whether two indexes have the same uniqueness and ordered column list.
|
|
115
|
-
* @param {import("../drivers/base-columns-index.js").default} sourceIndex
|
|
116
|
-
* @param {import("../drivers/base-columns-index.js").default} targetIndex
|
|
117
|
-
* @returns {boolean}
|
|
115
|
+
* @param {import("../drivers/base-columns-index.js").default} sourceIndex - Source index definition.
|
|
116
|
+
* @param {import("../drivers/base-columns-index.js").default} targetIndex - Target index definition.
|
|
117
|
+
* @returns {boolean} - Whether both indexes have the same shape.
|
|
118
118
|
*/
|
|
119
119
|
indexesMatch(sourceIndex: import("../drivers/base-columns-index.js").default, targetIndex: import("../drivers/base-columns-index.js").default): boolean;
|
|
120
120
|
/**
|
|
121
121
|
* A stable signature for an index, used to match cloned indexes by shape.
|
|
122
|
-
* @param {import("../drivers/base-columns-index.js").default} index
|
|
123
|
-
* @returns {string}
|
|
122
|
+
* @param {import("../drivers/base-columns-index.js").default} index - Index definition.
|
|
123
|
+
* @returns {string} - Stable index-shape signature.
|
|
124
124
|
*/
|
|
125
125
|
indexSignature(index: import("../drivers/base-columns-index.js").default): string;
|
|
126
126
|
/**
|
|
127
127
|
* Normalizes a column type to its canonical lowercase form (`int` becomes `integer`).
|
|
128
|
-
* @param {string} columnType
|
|
129
|
-
* @returns {string}
|
|
128
|
+
* @param {string} columnType - Database column type.
|
|
129
|
+
* @returns {string} - Canonical lowercase column type.
|
|
130
130
|
*/
|
|
131
131
|
normalizedColumnType(columnType: string): string;
|
|
132
132
|
/**
|
|
133
133
|
* The widening rank of a text column type (0 when not a text type).
|
|
134
|
-
* @param {string} columnType
|
|
135
|
-
* @returns {number}
|
|
134
|
+
* @param {string} columnType - Database column type.
|
|
135
|
+
* @returns {number} - Text-type widening rank.
|
|
136
136
|
*/
|
|
137
137
|
textTypeRank(columnType: string): number;
|
|
138
138
|
/**
|
|
139
139
|
* Whether the target's text column is narrower than the source's and must be widened.
|
|
140
|
-
* @param {import("../drivers/base-column.js").default} sourceColumn
|
|
141
|
-
* @param {import("../drivers/base-column.js").default} targetColumn
|
|
142
|
-
* @returns {boolean}
|
|
140
|
+
* @param {import("../drivers/base-column.js").default} sourceColumn - Source column definition.
|
|
141
|
+
* @param {import("../drivers/base-column.js").default} targetColumn - Target column definition.
|
|
142
|
+
* @returns {boolean} - Whether the target text column must be widened.
|
|
143
143
|
*/
|
|
144
144
|
columnNeedsWidening(sourceColumn: import("../drivers/base-column.js").default, targetColumn: import("../drivers/base-column.js").default): boolean;
|
|
145
145
|
/**
|
|
146
146
|
* Builds TableData column args from a source column, copying type, nullability,
|
|
147
147
|
* length, notes, simple defaults and (for full clones) primary-key flag.
|
|
148
|
-
* @param {import("../drivers/base-column.js").default} sourceColumn
|
|
149
|
-
* @param {{isNewColumn: boolean}} args
|
|
150
|
-
* @returns {Record<string, unknown>}
|
|
148
|
+
* @param {import("../drivers/base-column.js").default} sourceColumn - Source column definition.
|
|
149
|
+
* @param {{isNewColumn: boolean}} args - Whether the column is being added instead of cloned with its table.
|
|
150
|
+
* @returns {Record<string, unknown>} - Arguments for altering the target column.
|
|
151
151
|
*/
|
|
152
152
|
columnArgsFromSourceColumn(sourceColumn: import("../drivers/base-column.js").default, { isNewColumn }: {
|
|
153
153
|
isNewColumn: boolean;
|