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
|
@@ -27,7 +27,7 @@ const TEXT_TYPE_RANKS = {
|
|
|
27
27
|
export default class SchemaCloner {
|
|
28
28
|
/**
|
|
29
29
|
* Creates a cloner that copies table structure from `sourceDb` into `targetDb`.
|
|
30
|
-
* @param {{sourceDb: import("../drivers/base.js").default, targetDb: import("../drivers/base.js").default}} args
|
|
30
|
+
* @param {{sourceDb: import("../drivers/base.js").default, targetDb: import("../drivers/base.js").default}} args - Databases to clone structure from and into.
|
|
31
31
|
*/
|
|
32
32
|
constructor({ sourceDb, targetDb }) {
|
|
33
33
|
this.sourceDb = sourceDb;
|
|
@@ -36,7 +36,7 @@ export default class SchemaCloner {
|
|
|
36
36
|
/**
|
|
37
37
|
* Clones every given table from the source into the target, then baselines the
|
|
38
38
|
* target's ledger so the cloned schema is recorded as already-migrated.
|
|
39
|
-
* @param {string[]} tableNames
|
|
39
|
+
* @param {string[]} tableNames - Source tables whose structure should be cloned.
|
|
40
40
|
* @returns {Promise<void>}
|
|
41
41
|
*/
|
|
42
42
|
async syncTables(tableNames) {
|
|
@@ -48,7 +48,7 @@ export default class SchemaCloner {
|
|
|
48
48
|
/**
|
|
49
49
|
* Clones a single table from the source into the target, creating it or adding and
|
|
50
50
|
* widening columns and indexes as needed.
|
|
51
|
-
* @param {string} tableName
|
|
51
|
+
* @param {string} tableName - Source table to synchronize with the target.
|
|
52
52
|
* @returns {Promise<void>}
|
|
53
53
|
*/
|
|
54
54
|
async syncTable(tableName) {
|
|
@@ -69,7 +69,7 @@ export default class SchemaCloner {
|
|
|
69
69
|
/**
|
|
70
70
|
* Creates the table in the target from the source table's columns and its
|
|
71
71
|
* non-primary-key indexes.
|
|
72
|
-
* @param {{sourceTable: import("../drivers/base-table.js").default, tableName: string}} args
|
|
72
|
+
* @param {{sourceTable: import("../drivers/base-table.js").default, tableName: string}} args - Source table metadata and target table name.
|
|
73
73
|
* @returns {Promise<void>}
|
|
74
74
|
*/
|
|
75
75
|
async createTargetTable({ sourceTable, tableName }) {
|
|
@@ -88,7 +88,7 @@ export default class SchemaCloner {
|
|
|
88
88
|
/**
|
|
89
89
|
* Adds columns present on the source but missing from the target, and widens
|
|
90
90
|
* too-narrow target text columns.
|
|
91
|
-
* @param {{sourceTable: import("../drivers/base-table.js").default, tableName: string}} args
|
|
91
|
+
* @param {{sourceTable: import("../drivers/base-table.js").default, tableName: string}} args - Source table metadata and target table name.
|
|
92
92
|
* @returns {Promise<boolean>} Whether any column was added or widened.
|
|
93
93
|
*/
|
|
94
94
|
async ensureTargetColumns({ sourceTable, tableName }) {
|
|
@@ -128,7 +128,7 @@ export default class SchemaCloner {
|
|
|
128
128
|
* Creates non-primary-key indexes present on the source but missing from the target,
|
|
129
129
|
* and replaces target indexes whose definition (columns or uniqueness) drifted from
|
|
130
130
|
* the source.
|
|
131
|
-
* @param {{sourceTable: import("../drivers/base-table.js").default, tableName: string}} args
|
|
131
|
+
* @param {{sourceTable: import("../drivers/base-table.js").default, tableName: string}} args - Source table metadata and target table name.
|
|
132
132
|
* @returns {Promise<void>}
|
|
133
133
|
*/
|
|
134
134
|
async ensureTargetIndexes({ sourceTable, tableName }) {
|
|
@@ -191,7 +191,7 @@ export default class SchemaCloner {
|
|
|
191
191
|
}
|
|
192
192
|
/**
|
|
193
193
|
* Drops an index on the target database.
|
|
194
|
-
* @param {{tableName: string, targetIndex: import("../drivers/base-columns-index.js").default}} args
|
|
194
|
+
* @param {{tableName: string, targetIndex: import("../drivers/base-columns-index.js").default}} args - Target table and index to remove.
|
|
195
195
|
* @returns {Promise<void>}
|
|
196
196
|
*/
|
|
197
197
|
async dropTargetIndex({ tableName, targetIndex }) {
|
|
@@ -210,7 +210,7 @@ export default class SchemaCloner {
|
|
|
210
210
|
/**
|
|
211
211
|
* Whether the target ledger is missing any version applied on the source — i.e. the
|
|
212
212
|
* target schema may have been advanced out of band without recording it.
|
|
213
|
-
* @returns {Promise<boolean>}
|
|
213
|
+
* @returns {Promise<boolean>} - Whether the target ledger differs from the source.
|
|
214
214
|
*/
|
|
215
215
|
async ledgerDriftsFromSource() {
|
|
216
216
|
if (!await MigrationsLedger.tableExists(this.targetDb)) {
|
|
@@ -223,8 +223,8 @@ export default class SchemaCloner {
|
|
|
223
223
|
/**
|
|
224
224
|
* Maps a source index into a TableData index for table creation (SQLite omits the
|
|
225
225
|
* index name so the driver can generate a unique one).
|
|
226
|
-
* @param {import("../drivers/base-columns-index.js").default} sourceIndex
|
|
227
|
-
* @returns {TableIndex}
|
|
226
|
+
* @param {import("../drivers/base-columns-index.js").default} sourceIndex - Source index definition.
|
|
227
|
+
* @returns {TableIndex} - Framework-independent index definition.
|
|
228
228
|
*/
|
|
229
229
|
tableDataIndexFromSourceIndex(sourceIndex) {
|
|
230
230
|
/** @type {{name?: string, unique: boolean}} */
|
|
@@ -241,8 +241,8 @@ export default class SchemaCloner {
|
|
|
241
241
|
/**
|
|
242
242
|
* Builds driver create-index args from a source index (the index name is omitted on
|
|
243
243
|
* SQLite, where index names are unique per-database rather than per-table).
|
|
244
|
-
* @param {{sourceIndex: import("../drivers/base-columns-index.js").default, tableName: string}} args
|
|
245
|
-
* @returns {{columns: string[], name?: string, tableName: string, unique: boolean}}
|
|
244
|
+
* @param {{sourceIndex: import("../drivers/base-columns-index.js").default, tableName: string}} args - Source index and target table receiving it.
|
|
245
|
+
* @returns {{columns: string[], name?: string, tableName: string, unique: boolean}} - Arguments for creating the target index.
|
|
246
246
|
*/
|
|
247
247
|
createIndexArgsFromSourceIndex({ sourceIndex, tableName }) {
|
|
248
248
|
/** @type {{columns: string[], name?: string, tableName: string, unique: boolean}} */
|
|
@@ -258,9 +258,9 @@ export default class SchemaCloner {
|
|
|
258
258
|
}
|
|
259
259
|
/**
|
|
260
260
|
* Whether two indexes have the same uniqueness and ordered column list.
|
|
261
|
-
* @param {import("../drivers/base-columns-index.js").default} sourceIndex
|
|
262
|
-
* @param {import("../drivers/base-columns-index.js").default} targetIndex
|
|
263
|
-
* @returns {boolean}
|
|
261
|
+
* @param {import("../drivers/base-columns-index.js").default} sourceIndex - Source index definition.
|
|
262
|
+
* @param {import("../drivers/base-columns-index.js").default} targetIndex - Target index definition.
|
|
263
|
+
* @returns {boolean} - Whether both indexes have the same shape.
|
|
264
264
|
*/
|
|
265
265
|
indexesMatch(sourceIndex, targetIndex) {
|
|
266
266
|
const sourceColumnNames = sourceIndex.getColumnNames();
|
|
@@ -280,16 +280,16 @@ export default class SchemaCloner {
|
|
|
280
280
|
}
|
|
281
281
|
/**
|
|
282
282
|
* A stable signature for an index, used to match cloned indexes by shape.
|
|
283
|
-
* @param {import("../drivers/base-columns-index.js").default} index
|
|
284
|
-
* @returns {string}
|
|
283
|
+
* @param {import("../drivers/base-columns-index.js").default} index - Index definition.
|
|
284
|
+
* @returns {string} - Stable index-shape signature.
|
|
285
285
|
*/
|
|
286
286
|
indexSignature(index) {
|
|
287
287
|
return `${index.isUnique() ? "unique" : "index"}:${index.getColumnNames().join(",")}`;
|
|
288
288
|
}
|
|
289
289
|
/**
|
|
290
290
|
* Normalizes a column type to its canonical lowercase form (`int` becomes `integer`).
|
|
291
|
-
* @param {string} columnType
|
|
292
|
-
* @returns {string}
|
|
291
|
+
* @param {string} columnType - Database column type.
|
|
292
|
+
* @returns {string} - Canonical lowercase column type.
|
|
293
293
|
*/
|
|
294
294
|
normalizedColumnType(columnType) {
|
|
295
295
|
const normalizedType = columnType.toLowerCase();
|
|
@@ -300,17 +300,17 @@ export default class SchemaCloner {
|
|
|
300
300
|
}
|
|
301
301
|
/**
|
|
302
302
|
* The widening rank of a text column type (0 when not a text type).
|
|
303
|
-
* @param {string} columnType
|
|
304
|
-
* @returns {number}
|
|
303
|
+
* @param {string} columnType - Database column type.
|
|
304
|
+
* @returns {number} - Text-type widening rank.
|
|
305
305
|
*/
|
|
306
306
|
textTypeRank(columnType) {
|
|
307
307
|
return TEXT_TYPE_RANKS[this.normalizedColumnType(columnType)] || 0;
|
|
308
308
|
}
|
|
309
309
|
/**
|
|
310
310
|
* Whether the target's text column is narrower than the source's and must be widened.
|
|
311
|
-
* @param {import("../drivers/base-column.js").default} sourceColumn
|
|
312
|
-
* @param {import("../drivers/base-column.js").default} targetColumn
|
|
313
|
-
* @returns {boolean}
|
|
311
|
+
* @param {import("../drivers/base-column.js").default} sourceColumn - Source column definition.
|
|
312
|
+
* @param {import("../drivers/base-column.js").default} targetColumn - Target column definition.
|
|
313
|
+
* @returns {boolean} - Whether the target text column must be widened.
|
|
314
314
|
*/
|
|
315
315
|
columnNeedsWidening(sourceColumn, targetColumn) {
|
|
316
316
|
const sourceRank = this.textTypeRank(sourceColumn.getType());
|
|
@@ -320,9 +320,9 @@ export default class SchemaCloner {
|
|
|
320
320
|
/**
|
|
321
321
|
* Builds TableData column args from a source column, copying type, nullability,
|
|
322
322
|
* length, notes, simple defaults and (for full clones) primary-key flag.
|
|
323
|
-
* @param {import("../drivers/base-column.js").default} sourceColumn
|
|
324
|
-
* @param {{isNewColumn: boolean}} args
|
|
325
|
-
* @returns {Record<string, unknown>}
|
|
323
|
+
* @param {import("../drivers/base-column.js").default} sourceColumn - Source column definition.
|
|
324
|
+
* @param {{isNewColumn: boolean}} args - Whether the column is being added instead of cloned with its table.
|
|
325
|
+
* @returns {Record<string, unknown>} - Arguments for altering the target column.
|
|
326
326
|
*/
|
|
327
327
|
columnArgsFromSourceColumn(sourceColumn, { isNewColumn }) {
|
|
328
328
|
/** @type {{autoIncrement?: boolean, default?: unknown, isNewColumn: boolean, maxLength?: number, notes?: string, null: boolean, primaryKey?: boolean, type: string}} */
|
|
@@ -355,4 +355,4 @@ export default class SchemaCloner {
|
|
|
355
355
|
return columnArgs;
|
|
356
356
|
}
|
|
357
357
|
}
|
|
358
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2NoZW1hLWNsb25lci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9kYXRhYmFzZS90ZW5hbnRzL3NjaGVtYS1jbG9uZXIuanMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsWUFBWTtBQUVaLE9BQU8sZ0JBQWdCLE1BQU0seUJBQXlCLENBQUE7QUFDdEQsT0FBTyxTQUFTLE1BQU0sd0JBQXdCLENBQUE7QUFDOUMsT0FBTyxVQUFVLE1BQU0sOEJBQThCLENBQUE7QUFFckQsTUFBTSxzQkFBc0IsR0FBRyw2Q0FBNkMsQ0FBQTtBQUU1RSxxQ0FBcUM7QUFDckMsTUFBTSxlQUFlLEdBQUc7SUFDdEIsUUFBUSxFQUFFLENBQUM7SUFDWCxJQUFJLEVBQUUsQ0FBQztJQUNQLFVBQVUsRUFBRSxDQUFDO0lBQ2IsUUFBUSxFQUFFLENBQUM7Q0FDWixDQUFBO0FBRUQ7Ozs7Ozs7Ozs7Ozs7R0FhRztBQUNILE1BQU0sQ0FBQyxPQUFPLE9BQU8sWUFBWTtJQUMvQjs7O09BR0c7SUFDSCxZQUFZLEVBQUMsUUFBUSxFQUFFLFFBQVEsRUFBQztRQUM5QixJQUFJLENBQUMsUUFBUSxHQUFHLFFBQVEsQ0FBQTtRQUN4QixJQUFJLENBQUMsUUFBUSxHQUFHLFFBQVEsQ0FBQTtJQUMxQixDQUFDO0lBRUQ7Ozs7O09BS0c7SUFDSCxLQUFLLENBQUMsVUFBVSxDQUFDLFVBQVU7UUFDekIsS0FBSyxNQUFNLFNBQVMsSUFBSSxVQUFVLEVBQUUsQ0FBQztZQUNuQyxNQUFNLElBQUksQ0FBQyxTQUFTLENBQUMsU0FBUyxDQUFDLENBQUE7UUFDakMsQ0FBQztRQUVELE1BQU0sSUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFBO0lBQzlCLENBQUM7SUFFRDs7Ozs7T0FLRztJQUNILEtBQUssQ0FBQyxTQUFTLENBQUMsU0FBUztRQUN2QixNQUFNLFdBQVcsR0FBRyxNQUFNLElBQUksQ0FBQyxRQUFRLENBQUMsY0FBYyxDQUFDLFNBQVMsQ0FBQyxDQUFBO1FB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RUFBRSxFQUFFLENBQUM7WUFDakQsVUFBVSxDQUFDLFVBQVUsR0FBRyxJQUFJLENBQUE7UUFDOUIsQ0FBQztRQUVELElBQUksWUFBWSxDQUFDLGdCQUFnQixFQUFFLEVBQUUsQ0FBQztZQUNwQyxVQUFVLENBQUMsYUFBYSxHQUFHLElBQUksQ0FBQTtRQUNqQyxDQUFDO1FBRUQsa0ZBQWtGO1FBQ2xGLGtGQUFrRjtRQUNsRiwrRUFBK0U7UUFDL0UsSUFBSSxTQUFTLEtBQUssU0FBUyxJQUFJLFNBQVMsSUFBSSxDQUFDLEVBQUUsQ0FBQztZQUM5QyxVQUFVLENBQUMsU0FBUyxHQUFHLFNBQVMsQ0FBQTtRQUNsQyxDQUFDO1FBRUQsSUFBSSxLQUFLLEVBQUUsQ0FBQztZQUNWLFVBQVUsQ0FBQyxLQUFLLEdBQUcsS0FBSyxDQUFBO1FBQzFCLENBQUM7UUFFRCxJQUFJLFlBQVksS0FBSyxJQUFJLElBQUksWUFBWSxLQUFLLFNBQVMsSUFBSSxzQkFBc0IsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLFlBQVksQ0FBQyxDQUFDLEVBQUUsQ0FBQztZQUM3RyxVQUFVLENBQUMsT0FBTyxHQUFHLFlBQVksQ0FBQTtRQUNuQyxDQUFDO1FBRUQsT0FBTyxVQUFVLENBQUE7SUFDbkIsQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQHRzLWNoZWNrXG5cbmltcG9ydCBNaWdyYXRpb25zTGVkZ2VyIGZyb20gXCIuLi9taWdyYXRpb25zLWxlZGdlci5qc1wiXG5pbXBvcnQgVGFibGVEYXRhIGZyb20gXCIuLi90YWJsZS1kYXRhL2luZGV4LmpzXCJcbmltcG9ydCBUYWJsZUluZGV4IGZyb20gXCIuLi90YWJsZS1kYXRhL3RhYmxlLWluZGV4LmpzXCJcblxuY29uc3QgU0lNUExFX0RFRkFVTFRfUEFUVEVSTiA9IC9eKD86LT9cXGQrKD86XFwuXFxkKyk/fFtBLVphLXowLTkgXy4sOi9AKy1dKikkL1xuXG4vKiogQHR5cGUge1JlY29yZDxzdHJpbmcsIG51bWJlcj59ICovXG5jb25zdCBURVhUX1RZUEVfUkFOS1MgPSB7XG4gIHRpbnl0ZXh0OiAxLFxuICB0ZXh0OiAyLFxuICBtZWRpdW10ZXh0OiAzLFxuICBsb25ndGV4dDogNFxufVxuXG4vKipcbiAqIENsb25lcyB0YWJsZSBzdHJ1Y3R1cmUgKGNvbHVtbnMsIHRleHQtdHlwZSB3aWRlbmluZywgaW5kZXhlcykgZnJvbSBhIHNvdXJjZSBkYXRhYmFzZVxuICogaW50byBhIHRhcmdldCBkYXRhYmFzZSBmb3IgYSBnaXZlbiBzZXQgb2YgdGFibGVzLCB0aGVuIGJhc2VsaW5lcyB0aGUgdGFyZ2V0J3NcbiAqIGBzY2hlbWFfbWlncmF0aW9uc2AgbGVkZ2VyIHRvIHRoZSBzb3VyY2UgdmlhIHtAbGluayBNaWdyYXRpb25zTGVkZ2VyfS4gVGhpcyBpcyB0aGVcbiAqIG1lY2hhbmlzbSBtdWx0aS10ZW5hbnQgYXBwcyB1c2UgdG8gcHJvdmlzaW9uIGEgdGVuYW50IGRhdGFiYXNlIGZyb20gYSB0ZW1wbGF0ZS9nbG9iYWxcbiAqIGRhdGFiYXNlIHdpdGhvdXQgcmUtcnVubmluZyBtaWdyYXRpb25zOiB0aGUgc3RydWN0dXJlIGlzIGNvcGllZCBhbmQgdGhlIGxlZGdlciBpc1xuICogcmVjb3JkZWQgYXMgYWxyZWFkeS1hcHBsaWVkLCBzbyBhIGxhdGVyIGBkYjp0ZW5hbnRzOm1pZ3JhdGVgIGRvZXMgbm90IHJlLXJ1biBhblxuICogYGFkZENvbHVtbmAgd2hvc2UgY29sdW1uIGFscmVhZHkgZXhpc3RzLlxuICpcbiAqIFRoZSBjbG9uZXIgaXMgaW50ZW50aW9uYWxseSBwb2xpY3ktZnJlZSDigJQgdGhlIGNhbGxlciBkZWNpZGVzIHdoaWNoIHRhYmxlcyB0byBzeW5jIGFuZFxuICogd2hpY2ggZGF0YWJhc2VzIGFyZSBzb3VyY2UvdGFyZ2V0LiBJdCBpcyBpZGVtcG90ZW50OiBtaXNzaW5nIHRhYmxlcyBhcmUgY3JlYXRlZCxcbiAqIG1pc3NpbmcgY29sdW1ucyBhZGRlZCwgdG9vLW5hcnJvdyB0ZXh0IGNvbHVtbnMgd2lkZW5lZCwgYW5kIG1pc3NpbmcgaW5kZXhlcyBjcmVhdGVkO1xuICogYW4gaW5kZXggd2hvc2UgZGVmaW5pdGlvbiBkaXZlcmdlcyBmcm9tIHRoZSBzb3VyY2UgaXMgdHJlYXRlZCBhcyBkcmlmdCBhbmQgdGhyb3dzLlxuICovXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBTY2hlbWFDbG9uZXIge1xuICAvKipcbiAgICogQ3JlYXRlcyBhIGNsb25lciB0aGF0IGNvcGllcyB0YWJsZSBzdHJ1Y3R1cmUgZnJvbSBgc291cmNlRGJgIGludG8gYHRhcmdldERiYC5cbiAgICogQHBhcmFtIHt7c291cmNlRGI6IGltcG9ydChcIi4uL2RyaXZlcnMvYmFzZS5qc1wiKS5kZWZhdWx0LCB0YXJnZXREYjogaW1wb3J0KFwiLi4vZHJpdmVycy9iYXNlLmpzXCIpLmRlZmF1bHR9fSBhcmdzXG4gICAqL1xuICBjb25zdHJ1Y3Rvcih7c291cmNlRGIsIHRhcmdldERifSkge1xuICAgIHRoaXMuc291cmNlRGIgPSBzb3VyY2VEYlxuICAgIHRoaXMudGFyZ2V0RGIgPSB0YXJnZXREYlxuICB9XG5cbiAgLyoqXG4gICAqIENsb25lcyBldmVyeSBnaXZlbiB0YWJsZSBmcm9tIHRoZSBzb3VyY2UgaW50byB0aGUgdGFyZ2V0LCB0aGVuIGJhc2VsaW5lcyB0aGVcbiAgICogdGFyZ2V0J3MgbGVkZ2VyIHNvIHRoZSBjbG9uZWQgc2NoZW1hIGlzIHJlY29yZGVkIGFzIGFscmVhZHktbWlncmF0ZWQuXG4gICAqIEBwYXJhbSB7c3RyaW5nW119IHRhYmxlTmFtZXNcbiAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59XG4gICAqL1xuICBhc3luYyBzeW5jVGFibGVzKHRhYmxlTmFtZXMpIHtcbiAgICBmb3IgKGNvbnN0IHRhYmxlTmFtZSBvZiB0YWJsZU5hbWVzKSB7XG4gICAgICBhd2FpdCB0aGlzLnN5bmNUYWJsZSh0YWJsZU5hbWUpXG4gICAgfVxuXG4gICAgYXdhaXQgdGhpcy5yZWNvbmNpbGVMZWRnZXIoKVxuICB9XG5cbiAgLyoqXG4gICAqIENsb25lcyBhIHNpbmdsZSB0YWJsZSBmcm9tIHRoZSBzb3VyY2UgaW50byB0aGUgdGFyZ2V0LCBjcmVhdGluZyBpdCBvciBhZGRpbmcgYW5kXG4gICAqIHdpZGVuaW5nIGNvbHVtbnMgYW5kIGluZGV4ZXMgYXMgbmVlZGVkLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gdGFibGVOYW1lXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fVxuICAgKi9cbiAgYXN5bmMgc3luY1RhYmxlKHRhYmxlTmFtZSkge1xuICAgIGNvbnN0IHNvdXJjZVRhYmxlID0gYXdhaXQgdGhpcy5zb3VyY2VEYi5nZXRUYWJsZUJ5TmFtZSh0YWJsZU5hbWUpXG5cbiAgICBpZiAoIXNvdXJjZVRhYmxlKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYEV4cGVjdGVkIHNvdXJjZSB0YWJsZSB0byBleGlzdDogJHt0YWJsZU5hbWV9YClcbiAgICB9XG5cbiAgICBpZiAoIWF3YWl0IHRoaXMudGFyZ2V0RGIudGFibGVFeGlzdHModGFibGVOYW1lKSkge1xuICAgICAgYXdhaXQgdGhpcy5jcmVhdGVUYXJnZXRUYWJsZSh7c291cmNlVGFibGUsIHRhYmxlTmFtZX0pXG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBjb25zdCBjaGFuZ2VkQ29sdW1ucyA9IGF3YWl0IHRoaXMuZW5zdXJlVGFyZ2V0Q29sdW1ucyh7c291cmNlVGFibGUsIHRhYmxlTmFtZX0pXG5cbiAgICBpZiAoY2hhbmdlZENvbHVtbnMpIHtcbiAgICAgIHRoaXMudGFyZ2V0RGIuY2xlYXJTY2hlbWFDYWNoZSgpXG4gICAgfVxuXG4gICAgYXdhaXQgdGhpcy5lbnN1cmVUYXJnZXRJbmRleGVzKHtzb3VyY2VUYWJsZSwgdGFibGVOYW1lfSlcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGVzIHRoZSB0YWJsZSBpbiB0aGUgdGFyZ2V0IGZyb20gdGhlIHNvdXJjZSB0YWJsZSdzIGNvbHVtbnMgYW5kIGl0c1xuICAgKiBub24tcHJpbWFyeS1rZXkgaW5kZXhlcy5cbiAgICogQHBhcmFtIHt7c291cmNlVGFibGU6IGltcG9ydChcIi4uL2RyaXZlcnMvYmFzZS10YWJsZS5qc1wiKS5kZWZhdWx0LCB0YWJsZU5hbWU6IHN0cmluZ319IGFyZ3NcbiAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59XG4gICAqL1xuICBhc3luYyBjcmVhdGVUYXJnZXRUYWJsZSh7c291cmNlVGFibGUsIHRhYmxlTmFtZX0pIHtcbiAgICBjb25zdCB0YWJsZURhdGEgPSBuZXcgVGFibGVEYXRhKHRhYmxlTmFtZSlcblxuICAgIGZvciAoY29uc3Qgc291cmNlQ29sdW1uIG9mIGF3YWl0IHNvdXJjZVRhYmxlLmdldENvbHVtbnMoKSkge1xuICAgICAgdGFibGVEYXRhLmFkZENvbHVtbihzb3VyY2VDb2x1bW4uZ2V0TmFtZSgpLCB0aGlzLmNvbHVtbkFyZ3NGcm9tU291cmNlQ29sdW1uKHNvdXJjZUNvbHVtbiwge2lzTmV3Q29sdW1uOiBmYWxzZX0pKVxuICAgIH1cblxuICAgIGZvciAoY29uc3Qgc291cmNlSW5kZXggb2YgYXdhaXQgc291cmNlVGFibGUuZ2V0SW5kZXhlcygpKSB7XG4gICAgICBpZiAoIXNvdXJjZUluZGV4LmlzUHJpbWFyeUtleSgpKSB7XG4gICAgICAgIHRhYmxlRGF0YS5hZGRJbmRleCh0aGlzLnRhYmxlRGF0YUluZGV4RnJvbVNvdXJjZUluZGV4KHNvdXJjZUluZGV4KSlcbiAgICAgIH1cbiAgICB9XG5cbiAgICBhd2FpdCB0aGlzLnRhcmdldERiLmNyZWF0ZVRhYmxlKHRhYmxlRGF0YSlcbiAgICB0aGlzLnRhcmdldERiLmNsZWFyU2NoZW1hQ2FjaGUoKVxuICB9XG5cbiAgLyoqXG4gICAqIEFkZHMgY29sdW1ucyBwcmVzZW50IG9uIHRoZSBzb3VyY2UgYnV0IG1pc3NpbmcgZnJvbSB0aGUgdGFyZ2V0LCBhbmQgd2lkZW5zXG4gICAqIHRvby1uYXJyb3cgdGFyZ2V0IHRleHQgY29sdW1ucy5cbiAgICogQHBhcmFtIHt7c291cmNlVGFibGU6IGltcG9ydChcIi4uL2RyaXZlcnMvYmFzZS10YWJsZS5qc1wiKS5kZWZhdWx0LCB0YWJsZU5hbWU6IHN0cmluZ319IGFyZ3NcbiAgICogQHJldHVybnMge1Byb21pc2U8Ym9vbGVhbj59IFdoZXRoZXIgYW55IGNvbHVtbiB3YXMgYWRkZWQgb3Igd2lkZW5lZC5cbiAgICovXG4gIGFzeW5jIGVuc3VyZVRhcmdldENvbHVtbnMoe3NvdXJjZVRhYmxlLCB0YWJsZU5hbWV9KSB7XG4gICAgY29uc3Qgc291cmNlQ29sdW1ucyA9IGF3YWl0IHNvdXJjZVRhYmxlLmdldENvbHVtbnMoKVxuICAgIGNvbnN0IHRhcmdldFRhYmxlID0gYXdhaXQgdGhpcy50YXJnZXREYi5nZXRUYWJsZUJ5TmFtZU9yRmFpbCh0YWJsZU5hbWUpXG4gICAgY29uc3QgdGFyZ2V0Q29sdW1uc0J5TmFtZSA9IG5ldyBNYXAoKVxuICAgIGNvbnN0IG1pc3NpbmdDb2x1bW5zID0gW11cbiAgICBjb25zdCBjb2x1bW5zTmVlZGluZ1dpZGVuaW5nID0gW11cblxuICAgIGZvciAoY29uc3QgdGFyZ2V0Q29sdW1uIG9mIGF3YWl0IHRhcmdldFRhYmxlLmdldENvbHVtbnMoKSkge1xuICAgICAgdGFyZ2V0Q29sdW1uc0J5TmFtZS5zZXQodGFyZ2V0Q29sdW1uLmdldE5hbWUoKSwgdGFyZ2V0Q29sdW1uKVxuICAgIH1cblxuICAgIGZvciAoY29uc3Qgc291cmNlQ29sdW1uIG9mIHNvdXJjZUNvbHVtbnMpIHtcbiAgICAgIGNvbnN0IHRhcmdldENvbHVtbiA9IHRhcmdldENvbHVtbnNCeU5hbWUuZ2V0KHNvdXJjZUNvbHVtbi5nZXROYW1lKCkpXG5cbiAgICAgIGlmICghdGFyZ2V0Q29sdW1uKSB7XG4gICAgICAgIG1pc3NpbmdDb2x1bW5zLnB1c2goc291cmNlQ29sdW1uKVxuICAgICAgfSBlbHNlIGlmICh0aGlzLmNvbHVtbk5lZWRzV2lkZW5pbmcoc291cmNlQ29sdW1uLCB0YXJnZXRDb2x1bW4pKSB7XG4gICAgICAgIGNvbHVtbnNOZWVkaW5nV2lkZW5pbmcucHVzaChzb3VyY2VDb2x1bW4pXG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKG1pc3NpbmdDb2x1bW5zLmxlbmd0aCA8PSAwICYmIGNvbHVtbnNOZWVkaW5nV2lkZW5pbmcubGVuZ3RoIDw9IDApIHtcbiAgICAgIHJldHVybiBmYWxzZVxuICAgIH1cblxuICAgIGNvbnN0IHRhYmxlRGF0YSA9IG5ldyBUYWJsZURhdGEodGFibGVOYW1lKVxuXG4gICAgZm9yIChjb25zdCBzb3VyY2VDb2x1bW4gb2YgbWlzc2luZ0NvbHVtbnMpIHtcbiAgICAgIHRhYmxlRGF0YS5hZGRDb2x1bW4oc291cmNlQ29sdW1uLmdldE5hbWUoKSwgdGhpcy5jb2x1bW5BcmdzRnJvbVNvdXJjZUNvbHVtbihzb3VyY2VDb2x1bW4sIHtpc05ld0NvbHVtbjogdHJ1ZX0pKVxuICAgIH1cblxuICAgIGZvciAoY29uc3Qgc291cmNlQ29sdW1uIG9mIGNvbHVtbnNOZWVkaW5nV2lkZW5pbmcpIHtcbiAgICAgIHRhYmxlRGF0YS5hZGRDb2x1bW4oc291cmNlQ29sdW1uLmdldE5hbWUoKSwgdGhpcy5jb2x1bW5BcmdzRnJvbVNvdXJjZUNvbHVtbihzb3VyY2VDb2x1bW4sIHtpc05ld0NvbHVtbjogZmFsc2V9KSlcbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IGFsdGVyU3FsIG9mIGF3YWl0IHRoaXMudGFyZ2V0RGIuYWx0ZXJUYWJsZVNRTHModGFibGVEYXRhKSkge1xuICAgICAgYXdhaXQgdGhpcy50YXJnZXREYi5xdWVyeShhbHRlclNxbClcbiAgICB9XG5cbiAgICByZXR1cm4gdHJ1ZVxuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgbm9uLXByaW1hcnkta2V5IGluZGV4ZXMgcHJlc2VudCBvbiB0aGUgc291cmNlIGJ1dCBtaXNzaW5nIGZyb20gdGhlIHRhcmdldCxcbiAgICogYW5kIHJlcGxhY2VzIHRhcmdldCBpbmRleGVzIHdob3NlIGRlZmluaXRpb24gKGNvbHVtbnMgb3IgdW5pcXVlbmVzcykgZHJpZnRlZCBmcm9tXG4gICAqIHRoZSBzb3VyY2UuXG4gICAqIEBwYXJhbSB7e3NvdXJjZVRhYmxlOiBpbXBvcnQoXCIuLi9kcml2ZXJzL2Jhc2UtdGFibGUuanNcIikuZGVmYXVsdCwgdGFibGVOYW1lOiBzdHJpbmd9fSBhcmdzXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fVxuICAgKi9cbiAgYXN5bmMgZW5zdXJlVGFyZ2V0SW5kZXhlcyh7c291cmNlVGFibGUsIHRhYmxlTmFtZX0pIHtcbiAgICBjb25zdCB0YXJnZXRUYWJsZSA9IGF3YWl0IHRoaXMudGFyZ2V0RGIuZ2V0VGFibGVCeU5hbWVPckZhaWwodGFibGVOYW1lKVxuICAgIC8qKiBAdHlwZSB7TWFwPHN0cmluZywgaW1wb3J0KFwiLi4vZHJpdmVycy9iYXNlLWNvbHVtbnMtaW5kZXguanNcIikuZGVmYXVsdD59ICovXG4gICAgY29uc3QgdGFyZ2V0SW5kZXhlc0J5TmFtZSA9IG5ldyBNYXAoKVxuICAgIGNvbnN0IHRhcmdldEluZGV4U2lnbmF0dXJlcyA9IG5ldyBTZXQoKVxuICAgIGxldCBkaXJ0eSA9IGZhbHNlXG5cbiAgICBmb3IgKGNvbnN0IHRhcmdldEluZGV4IG9mIGF3YWl0IHRhcmdldFRhYmxlLmdldEluZGV4ZXMoKSkge1xuICAgICAgdGFyZ2V0SW5kZXhlc0J5TmFtZS5zZXQodGFyZ2V0SW5kZXguZ2V0TmFtZSgpLCB0YXJnZXRJbmRleClcbiAgICAgIHRhcmdldEluZGV4U2lnbmF0dXJlcy5hZGQodGhpcy5pbmRleFNpZ25hdHVyZSh0YXJnZXRJbmRleCkpXG4gICAgfVxuXG4gICAgZm9yIChjb25zdCBzb3VyY2VJbmRleCBvZiBhd2FpdCBzb3VyY2VUYWJsZS5nZXRJbmRleGVzKCkpIHtcbiAgICAgIGlmIChzb3VyY2VJbmRleC5pc1ByaW1hcnlLZXkoKSkge1xuICAgICAgICBjb250aW51ZVxuICAgICAgfVxuXG4gICAgICBjb25zdCBzb3VyY2VJbmRleFNpZ25hdHVyZSA9IHRoaXMuaW5kZXhTaWduYXR1cmUoc291cmNlSW5kZXgpXG5cbiAgICAgIC8vIFNRTGl0ZSBpbmRleCBuYW1lcyBhcmUgdW5pcXVlIHBlci1kYXRhYmFzZSwgbm90IHBlci10YWJsZSwgc28gbWF0Y2ggY2xvbmVkXG4gICAgICAvLyBpbmRleGVzIGJ5IHRoZWlyIGNvbHVtbi91bmlxdWVuZXNzIHNpZ25hdHVyZSByYXRoZXIgdGhhbiB0aGVpciBuYW1lLlxuICAgICAgaWYgKHRoaXMudGFyZ2V0RGIuZ2V0VHlwZSgpID09PSBcInNxbGl0ZVwiICYmIHRhcmdldEluZGV4U2lnbmF0dXJlcy5oYXMoc291cmNlSW5kZXhTaWduYXR1cmUpKSB7XG4gICAgICAgIGNvbnRpbnVlXG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHRhcmdldEluZGV4ID0gdGhpcy50YXJnZXREYi5nZXRUeXBlKCkgPT09IFwic3FsaXRlXCIgPyB1bmRlZmluZWQgOiB0YXJnZXRJbmRleGVzQnlOYW1lLmdldChzb3VyY2VJbmRleC5nZXROYW1lKCkpXG5cbiAgICAgIGlmICh0YXJnZXRJbmRleCkge1xuICAgICAgICBpZiAoIXRoaXMuaW5kZXhlc01hdGNoKHNvdXJjZUluZGV4LCB0YXJnZXRJbmRleCkpIHtcbiAgICAgICAgICAvLyBSZXBsYWNpbmcgYSBub24tdW5pcXVlIGluZGV4IHdpdGggYSB1bmlxdWUgb25lIGlzIHVuc2FmZSBiZWNhdXNlXG4gICAgICAgICAgLy8gdGhlIHRhcmdldCBtYXkgaGF2ZSBkdXBsaWNhdGUgdmFsdWVzIHRoYXQgd2lsbCByZWplY3QgdGhlIG5ld1xuICAgICAgICAgIC8vIHVuaXF1ZSBjb25zdHJhaW50LCBhbmQgdGhlIG9sZCBpbmRleCB3YXMgYWxyZWFkeSBkcm9wcGVkIGJ5IHRoaXNcbiAgICAgICAgICAvLyBwb2ludC4gVGhlIG9wcG9zaXRlIGRpcmVjdGlvbiAodW5pcXVlIOKGkiBub24tdW5pcXVlKSBpcyBhbHdheXNcbiAgICAgICAgICAvLyBzYWZlIOKAlCBub24tdW5pcXVlIGluZGV4ZXMgbmV2ZXIgZmFpbCBvbiBkdXBsaWNhdGUgdmFsdWVzLlxuICAgICAgICAgIGlmIChzb3VyY2VJbmRleC5pc1VuaXF1ZSgpICYmICF0YXJnZXRJbmRleC5pc1VuaXF1ZSgpKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFNjaGVtYSBjbG9uZSBpbmRleCBkcmlmdCBmb3IgJHt0YWJsZU5hbWV9LiR7c291cmNlSW5kZXguZ2V0TmFtZSgpfTogY2Fubm90IHNhZmVseSByZXBsYWNlIGEgbm9uLXVuaXF1ZSBpbmRleCB3aXRoIGEgdW5pcXVlIG9uZS5gKVxuICAgICAgICAgIH1cblxuICAgICAgICAgIGF3YWl0IHRoaXMuZHJvcFRhcmdldEluZGV4KHt0YWJsZU5hbWUsIHRhcmdldEluZGV4fSlcbiAgICAgICAgICB0YXJnZXRJbmRleGVzQnlOYW1lLmRlbGV0ZSh0YXJnZXRJbmRleC5nZXROYW1lKCkpXG4gICAgICAgICAgdGFyZ2V0SW5kZXhTaWduYXR1cmVzLmRlbGV0ZSh0aGlzLmluZGV4U2lnbmF0dXJlKHRhcmdldEluZGV4KSlcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBjb250aW51ZVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIERyb3AgYW55IHRhcmdldCBpbmRleCB0aGF0IHNoYXJlcyB0aGUgc291cmNlIG5hbWUgYnV0IHN1cnZpdmVkIHRoZVxuICAgICAgLy8gZHJpZnQgY2hlY2sgYWJvdmUgYmVjYXVzZSB0aGUgZHJpdmVyIHdhcyBza2lwcGVkIChTUUxpdGUpLlxuICAgICAgY29uc3Qgc2FtZU5hbWVUYXJnZXRJbmRleCA9IHRhcmdldEluZGV4ZXNCeU5hbWUuZ2V0KHNvdXJjZUluZGV4LmdldE5hbWUoKSlcblxuICAgICAgaWYgKHNhbWVOYW1lVGFyZ2V0SW5kZXgpIHtcbiAgICAgICAgYXdhaXQgdGhpcy5kcm9wVGFyZ2V0SW5kZXgoe3RhYmxlTmFtZSwgdGFyZ2V0SW5kZXg6IHNhbWVOYW1lVGFyZ2V0SW5kZXh9KVxuICAgICAgICB0YXJnZXRJbmRleGVzQnlOYW1lLmRlbGV0ZShzYW1lTmFtZVRhcmdldEluZGV4LmdldE5hbWUoKSlcbiAgICAgICAgdGFyZ2V0SW5kZXhTaWduYXR1cmVzLmRlbGV0ZSh0aGlzLmluZGV4U2lnbmF0dXJlKHNhbWVOYW1lVGFyZ2V0SW5kZXgpKVxuICAgICAgfVxuXG4gICAgICBjb25zdCBjcmVhdGVJbmRleFNxbHMgPSBhd2FpdCB0aGlzLnRhcmdldERiLmNyZWF0ZUluZGV4U1FMcyh0aGlzLmNyZWF0ZUluZGV4QXJnc0Zyb21Tb3VyY2VJbmRleCh7c291cmNlSW5kZXgsIHRhYmxlTmFtZX0pKVxuXG4gICAgICBmb3IgKGNvbnN0IGNyZWF0ZUluZGV4U3FsIG9mIGNyZWF0ZUluZGV4U3Fscykge1xuICAgICAgICBhd2FpdCB0aGlzLnRhcmdldERiLnF1ZXJ5KGNyZWF0ZUluZGV4U3FsKVxuICAgICAgfVxuXG4gICAgICBkaXJ0eSA9IHRydWVcbiAgICAgIHRhcmdldEluZGV4U2lnbmF0dXJlcy5hZGQoc291cmNlSW5kZXhTaWduYXR1cmUpXG4gICAgfVxuXG4gICAgaWYgKGRpcnR5KSB7XG4gICAgICB0aGlzLnRhcmdldERiLmNsZWFyU2NoZW1hQ2FjaGUoKVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBEcm9wcyBhbiBpbmRleCBvbiB0aGUgdGFyZ2V0IGRhdGFiYXNlLlxuICAgKiBAcGFyYW0ge3t0YWJsZU5hbWU6IHN0cmluZywgdGFyZ2V0SW5kZXg6IGltcG9ydChcIi4uL2RyaXZlcnMvYmFzZS1jb2x1bW5zLWluZGV4LmpzXCIpLmRlZmF1bHR9fSBhcmdzXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fVxuICAgKi9cbiAgYXN5bmMgZHJvcFRhcmdldEluZGV4KHt0YWJsZU5hbWUsIHRhcmdldEluZGV4fSkge1xuICAgIGNvbnN0IGRyb3BTcWxzID0gYXdhaXQgdGhpcy50YXJnZXREYi5yZW1vdmVJbmRleFNRTHMoe25hbWU6IHRhcmdldEluZGV4LmdldE5hbWUoKSwgdGFibGVOYW1lfSlcblxuICAgIGZvciAoY29uc3Qgc3FsIG9mIGRyb3BTcWxzKSB7XG4gICAgICBhd2FpdCB0aGlzLnRhcmdldERiLnF1ZXJ5KHNxbClcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQmFzZWxpbmVzIHRoZSB0YXJnZXQgbGVkZ2VyIHNvIHRoZSBjbG9uZWQgc2NoZW1hIGlzIHJlY29yZGVkIGFzIGFscmVhZHktYXBwbGllZC5cbiAgICogQHJldHVybnMge1Byb21pc2U8c3RyaW5nW10+fSBUaGUgdmVyc2lvbnMgbmV3bHkgcmVjb3JkZWQgb24gdGhlIHRhcmdldC5cbiAgICovXG4gIGFzeW5jIHJlY29uY2lsZUxlZGdlcigpIHtcbiAgICByZXR1cm4gYXdhaXQgTWlncmF0aW9uc0xlZGdlci5iYXNlbGluZUZyb21EYXRhYmFzZSh7c291cmNlRGI6IHRoaXMuc291cmNlRGIsIHRhcmdldERiOiB0aGlzLnRhcmdldERifSlcbiAgfVxuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRoZSB0YXJnZXQgbGVkZ2VyIGlzIG1pc3NpbmcgYW55IHZlcnNpb24gYXBwbGllZCBvbiB0aGUgc291cmNlIOKAlCBpLmUuIHRoZVxuICAgKiB0YXJnZXQgc2NoZW1hIG1heSBoYXZlIGJlZW4gYWR2YW5jZWQgb3V0IG9mIGJhbmQgd2l0aG91dCByZWNvcmRpbmcgaXQuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPGJvb2xlYW4+fVxuICAgKi9cbiAgYXN5bmMgbGVkZ2VyRHJpZnRzRnJvbVNvdXJjZSgpIHtcbiAgICBpZiAoIWF3YWl0IE1pZ3JhdGlvbnNMZWRnZXIudGFibGVFeGlzdHModGhpcy50YXJnZXREYikpIHtcbiAgICAgIHJldHVybiB0cnVlXG4gICAgfVxuXG4gICAgY29uc3Qgc291cmNlVmVyc2lvbnMgPSBhd2FpdCBNaWdyYXRpb25zTGVkZ2VyLmFwcGxpZWRWZXJzaW9ucyh0aGlzLnNvdXJjZURiKVxuICAgIGNvbnN0IHRhcmdldFZlcnNpb25TZXQgPSBuZXcgU2V0KGF3YWl0IE1pZ3JhdGlvbnNMZWRnZXIuYXBwbGllZFZlcnNpb25zKHRoaXMudGFyZ2V0RGIpKVxuXG4gICAgcmV0dXJuIHNvdXJjZVZlcnNpb25zLnNvbWUoKHZlcnNpb24pID0+ICF0YXJnZXRWZXJzaW9uU2V0Lmhhcyh2ZXJzaW9uKSlcbiAgfVxuXG4gIC8qKlxuICAgKiBNYXBzIGEgc291cmNlIGluZGV4IGludG8gYSBUYWJsZURhdGEgaW5kZXggZm9yIHRhYmxlIGNyZWF0aW9uIChTUUxpdGUgb21pdHMgdGhlXG4gICAqIGluZGV4IG5hbWUgc28gdGhlIGRyaXZlciBjYW4gZ2VuZXJhdGUgYSB1bmlxdWUgb25lKS5cbiAgICogQHBhcmFtIHtpbXBvcnQoXCIuLi9kcml2ZXJzL2Jhc2UtY29sdW1ucy1pbmRleC5qc1wiKS5kZWZhdWx0fSBzb3VyY2VJbmRleFxuICAgKiBAcmV0dXJucyB7VGFibGVJbmRleH1cbiAgICovXG4gIHRhYmxlRGF0YUluZGV4RnJvbVNvdXJjZUluZGV4KHNvdXJjZUluZGV4KSB7XG4gICAgLyoqIEB0eXBlIHt7bmFtZT86IHN0cmluZywgdW5pcXVlOiBib29sZWFufX0gKi9cbiAgICBjb25zdCBhcmdzID0ge3VuaXF1ZTogc291cmNlSW5kZXguaXNVbmlxdWUoKX1cblxuICAgIC8vIFNRTGl0ZSBpbmRleCBuYW1lcyBhcmUgdW5pcXVlIHBlci1kYXRhYmFzZSwgbm90IHBlci10YWJsZSwgc28gbGV0IHRoZSBkcml2ZXJcbiAgICAvLyBnZW5lcmF0ZSBvbmU7IG90aGVyIGRyaXZlcnMgcHJlc2VydmUgdGhlIHNvdXJjZSBpbmRleCBuYW1lLiBCdWlsZCB0aGUgVGFibGVJbmRleFxuICAgIC8vIGRpcmVjdGx5IChyYXRoZXIgdGhhbiB2aWEgdGhlIGRyaXZlcidzIGdldFRhYmxlRGF0YUluZGV4LCB3aGljaCBvbmx5IE15U1FMIGFuZFxuICAgIC8vIFNRTGl0ZSBpbXBsZW1lbnQpIHNvIGNsb25pbmcgYSBQb3N0Z3JlU1FMIG9yIE1TLVNRTCBzb3VyY2UgdGFibGUgd29ya3MgdG9vLlxuICAgIGlmICh0aGlzLnRhcmdldERiLmdldFR5cGUoKSAhPT0gXCJzcWxpdGVcIikge1xuICAgICAgYXJncy5uYW1lID0gc291cmNlSW5kZXguZ2V0TmFtZSgpXG4gICAgfVxuXG4gICAgcmV0dXJuIG5ldyBUYWJsZUluZGV4KHNvdXJjZUluZGV4LmdldENvbHVtbk5hbWVzKCksIGFyZ3MpXG4gIH1cblxuICAvKipcbiAgICogQnVpbGRzIGRyaXZlciBjcmVhdGUtaW5kZXggYXJncyBmcm9tIGEgc291cmNlIGluZGV4ICh0aGUgaW5kZXggbmFtZSBpcyBvbWl0dGVkIG9uXG4gICAqIFNRTGl0ZSwgd2hlcmUgaW5kZXggbmFtZXMgYXJlIHVuaXF1ZSBwZXItZGF0YWJhc2UgcmF0aGVyIHRoYW4gcGVyLXRhYmxlKS5cbiAgICogQHBhcmFtIHt7c291cmNlSW5kZXg6IGltcG9ydChcIi4uL2RyaXZlcnMvYmFzZS1jb2x1bW5zLWluZGV4LmpzXCIpLmRlZmF1bHQsIHRhYmxlTmFtZTogc3RyaW5nfX0gYXJnc1xuICAgKiBAcmV0dXJucyB7e2NvbHVtbnM6IHN0cmluZ1tdLCBuYW1lPzogc3RyaW5nLCB0YWJsZU5hbWU6IHN0cmluZywgdW5pcXVlOiBib29sZWFufX1cbiAgICovXG4gIGNyZWF0ZUluZGV4QXJnc0Zyb21Tb3VyY2VJbmRleCh7c291cmNlSW5kZXgsIHRhYmxlTmFtZX0pIHtcbiAgICAvKiogQHR5cGUge3tjb2x1bW5zOiBzdHJpbmdbXSwgbmFtZT86IHN0cmluZywgdGFibGVOYW1lOiBzdHJpbmcsIHVuaXF1ZTogYm9vbGVhbn19ICovXG4gICAgY29uc3QgY3JlYXRlSW5kZXhBcmdzID0ge1xuICAgICAgY29sdW1uczogc291cmNlSW5kZXguZ2V0Q29sdW1uTmFtZXMoKSxcbiAgICAgIHRhYmxlTmFtZSxcbiAgICAgIHVuaXF1ZTogc291cmNlSW5kZXguaXNVbmlxdWUoKVxuICAgIH1cblxuICAgIGlmICh0aGlzLnRhcmdldERiLmdldFR5cGUoKSAhPT0gXCJzcWxpdGVcIikge1xuICAgICAgY3JlYXRlSW5kZXhBcmdzLm5hbWUgPSBzb3VyY2VJbmRleC5nZXROYW1lKClcbiAgICB9XG5cbiAgICByZXR1cm4gY3JlYXRlSW5kZXhBcmdzXG4gIH1cblxuICAvKipcbiAgICogV2hldGhlciB0d28gaW5kZXhlcyBoYXZlIHRoZSBzYW1lIHVuaXF1ZW5lc3MgYW5kIG9yZGVyZWQgY29sdW1uIGxpc3QuXG4gICAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vZHJpdmVycy9iYXNlLWNvbHVtbnMtaW5kZXguanNcIikuZGVmYXVsdH0gc291cmNlSW5kZXhcbiAgICogQHBhcmFtIHtpbXBvcnQoXCIuLi9kcml2ZXJzL2Jhc2UtY29sdW1ucy1pbmRleC5qc1wiKS5kZWZhdWx0fSB0YXJnZXRJbmRleFxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAgICovXG4gIGluZGV4ZXNNYXRjaChzb3VyY2VJbmRleCwgdGFyZ2V0SW5kZXgpIHtcbiAgICBjb25zdCBzb3VyY2VDb2x1bW5OYW1lcyA9IHNvdXJjZUluZGV4LmdldENvbHVtbk5hbWVzKClcbiAgICBjb25zdCB0YXJnZXRDb2x1bW5OYW1lcyA9IHRhcmdldEluZGV4LmdldENvbHVtbk5hbWVzKClcblxuICAgIGlmIChzb3VyY2VJbmRleC5pc1VuaXF1ZSgpICE9PSB0YXJnZXRJbmRleC5pc1VuaXF1ZSgpKSB7XG4gICAgICByZXR1cm4gZmFsc2VcbiAgICB9XG5cbiAgICBpZiAoc291cmNlQ29sdW1uTmFtZXMubGVuZ3RoICE9PSB0YXJnZXRDb2x1bW5OYW1lcy5sZW5ndGgpIHtcbiAgICAgIHJldHVybiBmYWxzZVxuICAgIH1cblxuICAgIGZvciAobGV0IGNvbHVtbkluZGV4ID0gMDsgY29sdW1uSW5kZXggPCBzb3VyY2VDb2x1bW5OYW1lcy5sZW5ndGg7IGNvbHVtbkluZGV4KyspIHtcbiAgICAgIGlmIChzb3VyY2VDb2x1bW5OYW1lc1tjb2x1bW5JbmRleF0gIT09IHRhcmdldENvbHVtbk5hbWVzW2NvbHVtbkluZGV4XSkge1xuICAgICAgICByZXR1cm4gZmFsc2VcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gdHJ1ZVxuICB9XG5cbiAgLyoqXG4gICAqIEEgc3RhYmxlIHNpZ25hdHVyZSBmb3IgYW4gaW5kZXgsIHVzZWQgdG8gbWF0Y2ggY2xvbmVkIGluZGV4ZXMgYnkgc2hhcGUuXG4gICAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vZHJpdmVycy9iYXNlLWNvbHVtbnMtaW5kZXguanNcIikuZGVmYXVsdH0gaW5kZXhcbiAgICogQHJldHVybnMge3N0cmluZ31cbiAgICovXG4gIGluZGV4U2lnbmF0dXJlKGluZGV4KSB7XG4gICAgcmV0dXJuIGAke2luZGV4LmlzVW5pcXVlKCkgPyBcInVuaXF1ZVwiIDogXCJpbmRleFwifToke2luZGV4LmdldENvbHVtbk5hbWVzKCkuam9pbihcIixcIil9YFxuICB9XG5cbiAgLyoqXG4gICAqIE5vcm1hbGl6ZXMgYSBjb2x1bW4gdHlwZSB0byBpdHMgY2Fub25pY2FsIGxvd2VyY2FzZSBmb3JtIChgaW50YCBiZWNvbWVzIGBpbnRlZ2VyYCkuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBjb2x1bW5UeXBlXG4gICAqIEByZXR1cm5zIHtzdHJpbmd9XG4gICAqL1xuICBub3JtYWxpemVkQ29sdW1uVHlwZShjb2x1bW5UeXBlKSB7XG4gICAgY29uc3Qgbm9ybWFsaXplZFR5cGUgPSBjb2x1bW5UeXBlLnRvTG93ZXJDYXNlKClcblxuICAgIGlmIChub3JtYWxpemVkVHlwZSA9PT0gXCJpbnRcIikge1xuICAgICAgcmV0dXJuIFwiaW50ZWdlclwiXG4gICAgfVxuXG4gICAgcmV0dXJuIG5vcm1hbGl6ZWRUeXBlXG4gIH1cblxuICAvKipcbiAgICogVGhlIHdpZGVuaW5nIHJhbmsgb2YgYSB0ZXh0IGNvbHVtbiB0eXBlICgwIHdoZW4gbm90IGEgdGV4dCB0eXBlKS5cbiAgICogQHBhcmFtIHtzdHJpbmd9IGNvbHVtblR5cGVcbiAgICogQHJldHVybnMge251bWJlcn1cbiAgICovXG4gIHRleHRUeXBlUmFuayhjb2x1bW5UeXBlKSB7XG4gICAgcmV0dXJuIFRFWFRfVFlQRV9SQU5LU1t0aGlzLm5vcm1hbGl6ZWRDb2x1bW5UeXBlKGNvbHVtblR5cGUpXSB8fCAwXG4gIH1cblxuICAvKipcbiAgICogV2hldGhlciB0aGUgdGFyZ2V0J3MgdGV4dCBjb2x1bW4gaXMgbmFycm93ZXIgdGhhbiB0aGUgc291cmNlJ3MgYW5kIG11c3QgYmUgd2lkZW5lZC5cbiAgICogQHBhcmFtIHtpbXBvcnQoXCIuLi9kcml2ZXJzL2Jhc2UtY29sdW1uLmpzXCIpLmRlZmF1bHR9IHNvdXJjZUNvbHVtblxuICAgKiBAcGFyYW0ge2ltcG9ydChcIi4uL2RyaXZlcnMvYmFzZS1jb2x1bW4uanNcIikuZGVmYXVsdH0gdGFyZ2V0Q29sdW1uXG4gICAqIEByZXR1cm5zIHtib29sZWFufVxuICAgKi9cbiAgY29sdW1uTmVlZHNXaWRlbmluZyhzb3VyY2VDb2x1bW4sIHRhcmdldENvbHVtbikge1xuICAgIGNvbnN0IHNvdXJjZVJhbmsgPSB0aGlzLnRleHRUeXBlUmFuayhzb3VyY2VDb2x1bW4uZ2V0VHlwZSgpKVxuICAgIGNvbnN0IHRhcmdldFJhbmsgPSB0aGlzLnRleHRUeXBlUmFuayh0YXJnZXRDb2x1bW4uZ2V0VHlwZSgpKVxuXG4gICAgcmV0dXJuIHNvdXJjZVJhbmsgPiAwICYmIHRhcmdldFJhbmsgPiAwICYmIHNvdXJjZVJhbmsgPiB0YXJnZXRSYW5rXG4gIH1cblxuICAvKipcbiAgICogQnVpbGRzIFRhYmxlRGF0YSBjb2x1bW4gYXJncyBmcm9tIGEgc291cmNlIGNvbHVtbiwgY29weWluZyB0eXBlLCBudWxsYWJpbGl0eSxcbiAgICogbGVuZ3RoLCBub3Rlcywgc2ltcGxlIGRlZmF1bHRzIGFuZCAoZm9yIGZ1bGwgY2xvbmVzKSBwcmltYXJ5LWtleSBmbGFnLlxuICAgKiBAcGFyYW0ge2ltcG9ydChcIi4uL2RyaXZlcnMvYmFzZS1jb2x1bW4uanNcIikuZGVmYXVsdH0gc291cmNlQ29sdW1uXG4gICAqIEBwYXJhbSB7e2lzTmV3Q29sdW1uOiBib29sZWFufX0gYXJnc1xuICAgKiBAcmV0dXJucyB7UmVjb3JkPHN0cmluZywgdW5rbm93bj59XG4gICAqL1xuICBjb2x1bW5BcmdzRnJvbVNvdXJjZUNvbHVtbihzb3VyY2VDb2x1bW4sIHtpc05ld0NvbHVtbn0pIHtcbiAgICAvKiogQHR5cGUge3thdXRvSW5jcmVtZW50PzogYm9vbGVhbiwgZGVmYXVsdD86IHVua25vd24sIGlzTmV3Q29sdW1uOiBib29sZWFuLCBtYXhMZW5ndGg/OiBudW1iZXIsIG5vdGVzPzogc3RyaW5nLCBudWxsOiBib29sZWFuLCBwcmltYXJ5S2V5PzogYm9vbGVhbiwgdHlwZTogc3RyaW5nfX0gKi9cbiAgICBjb25zdCBjb2x1bW5BcmdzID0ge1xuICAgICAgaXNOZXdDb2x1bW4sXG4gICAgICBudWxsOiBzb3VyY2VDb2x1bW4uZ2V0TnVsbCgpLFxuICAgICAgdHlwZTogdGhpcy5ub3JtYWxpemVkQ29sdW1uVHlwZShzb3VyY2VDb2x1bW4uZ2V0VHlwZSgpKVxuICAgIH1cbiAgICBjb25zdCBkZWZhdWx0VmFsdWUgPSBzb3VyY2VDb2x1bW4uZ2V0RGVmYXVsdCgpXG4gICAgY29uc3QgbWF4TGVuZ3RoID0gc291cmNlQ29sdW1uLmdldE1heExlbmd0aCgpXG4gICAgY29uc3Qgbm90ZXMgPSBzb3VyY2VDb2x1bW4uZ2V0Tm90ZXMoKVxuXG4gICAgaWYgKCFpc05ld0NvbHVtbiAmJiBzb3VyY2VDb2x1bW4uZ2V0UHJpbWFyeUtleSgpKSB7XG4gICAgICBjb2x1bW5BcmdzLnByaW1hcnlLZXkgPSB0cnVlXG4gICAgfVxuXG4gICAgaWYgKHNvdXJjZUNvbHVtbi5nZXRBdXRvSW5jcmVtZW50KCkpIHtcbiAgICAgIGNvbHVtbkFyZ3MuYXV0b0luY3JlbWVudCA9IHRydWVcbiAgICB9XG5cbiAgICAvLyBBIG1heExlbmd0aCBvZiAtMSBpcyB0aGUgTVMtU1FMIFwibWF4XCIgc2VudGluZWwgKE5WQVJDSEFSKE1BWCkgLyBWQVJCSU5BUlkoTUFYKSxcbiAgICAvLyBiYWNraW5nIFZlbG9jaW91cyB0ZXh0L2pzb24vYmxvYiBjb2x1bW5zKTsgdGhlIGNvbHVtbiB0eXBlIGRyaXZlcyB0aGUgdW5ib3VuZGVkXG4gICAgLy8gU1FMLCBzbyBkb24ndCBmb3J3YXJkIC0xIGFzIGFuIGV4cGxpY2l0IGxlbmd0aCAoaXQgd291bGQgZW1pdCBOVkFSQ0hBUigtMSkpLlxuICAgIGlmIChtYXhMZW5ndGggIT09IHVuZGVmaW5lZCAmJiBtYXhMZW5ndGggPj0gMCkge1xuICAgICAgY29sdW1uQXJncy5tYXhMZW5ndGggPSBtYXhMZW5ndGhcbiAgICB9XG5cbiAgICBpZiAobm90ZXMpIHtcbiAgICAgIGNvbHVtbkFyZ3Mubm90ZXMgPSBub3Rlc1xuICAgIH1cblxuICAgIGlmIChkZWZhdWx0VmFsdWUgIT09IG51bGwgJiYgZGVmYXVsdFZhbHVlICE9PSB1bmRlZmluZWQgJiYgU0lNUExFX0RFRkFVTFRfUEFUVEVSTi50ZXN0KFN0cmluZyhkZWZhdWx0VmFsdWUpKSkge1xuICAgICAgY29sdW1uQXJncy5kZWZhdWx0ID0gZGVmYXVsdFZhbHVlXG4gICAgfVxuXG4gICAgcmV0dXJuIGNvbHVtbkFyZ3NcbiAgfVxufVxuIl19
|
|
358
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2NoZW1hLWNsb25lci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9kYXRhYmFzZS90ZW5hbnRzL3NjaGVtYS1jbG9uZXIuanMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsWUFBWTtBQUVaLE9BQU8sZ0JBQWdCLE1BQU0seUJBQXlCLENBQUE7QUFDdEQsT0FBTyxTQUFTLE1BQU0sd0JBQXdCLENBQUE7QUFDOUMsT0FBTyxVQUFVLE1BQU0sOEJBQThCLENBQUE7QUFFckQsTUFBTSxzQkFBc0IsR0FBRyw2Q0FBNkMsQ0FBQTtBQUU1RSxxQ0FBcUM7QUFDckMsTUFBTSxlQUFlLEdBQUc7SUFDdEIsUUFBUSxFQUFFLENBQUM7SUFDWCxJQUFJLEVBQUUsQ0FBQztJQUNQLFVBQVUsRUFBRSxDQUFDO0lBQ2IsUUFBUSxFQUFFLENBQUM7Q0FDWixDQUFBO0FBRUQ7Ozs7Ozs7Ozs7Ozs7R0FhRztBQUNILE1BQU0sQ0FBQyxPQUFPLE9BQU8sWUFBWTtJQUMvQjs7O09BR0c7SUFDSCxZQUFZLEVBQUMsUUFBUSxFQUFFLFFBQVEsRUFBQztRQUM5QixJQUFJLENBQUMsUUFBUSxHQUFHLFFBQVEsQ0FBQTtRQUN4QixJQUFJLENBQUMsUUFBUSxHQUFHLFFBQVEsQ0FBQTtJQUMxQixDQUFDO0lBRUQ7Ozs7O09BS0c7SUFDSCxLQUFLLENBQUMsVUFBVSxDQUFDLFVBQVU7UUFDekIsS0FBSyxNQUFNLFNBQVMsSUFBSSxVQUFVLEVBQUUsQ0FBQztZQUNuQyxNQUFNLElBQUksQ0FBQyxTQUFTLENBQUMsU0FBUyxDQUFDLENBQUE7UUFDakMsQ0FBQztRQUVELE1BQU0sSUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFBO0lBQzlCLENBQUM7SUFFRDs7Ozs7T0FLRztJQUNILEtBQUssQ0FBQyxTQUFTLENBQUMsU0FBUztRQUN2QixNQUFNLFdBQVcsR0FBRyxNQUFNLElBQUksQ0FBQyxRQUFRLENBQUMsY0FBYyxDQUFDLFNBQVMsQ0FBQyxDQUFBO1FB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RUFBRSxFQUFFLENBQUM7WUFDakQsVUFBVSxDQUFDLFVBQVUsR0FBRyxJQUFJLENBQUE7UUFDOUIsQ0FBQztRQUVELElBQUksWUFBWSxDQUFDLGdCQUFnQixFQUFFLEVBQUUsQ0FBQztZQUNwQyxVQUFVLENBQUMsYUFBYSxHQUFHLElBQUksQ0FBQTtRQUNqQyxDQUFDO1FBRUQsa0ZBQWtGO1FBQ2xGLGtGQUFrRjtRQUNsRiwrRUFBK0U7UUFDL0UsSUFBSSxTQUFTLEtBQUssU0FBUyxJQUFJLFNBQVMsSUFBSSxDQUFDLEVBQUUsQ0FBQztZQUM5QyxVQUFVLENBQUMsU0FBUyxHQUFHLFNBQVMsQ0FBQTtRQUNsQyxDQUFDO1FBRUQsSUFBSSxLQUFLLEVBQUUsQ0FBQztZQUNWLFVBQVUsQ0FBQyxLQUFLLEdBQUcsS0FBSyxDQUFBO1FBQzFCLENBQUM7UUFFRCxJQUFJLFlBQVksS0FBSyxJQUFJLElBQUksWUFBWSxLQUFLLFNBQVMsSUFBSSxzQkFBc0IsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLFlBQVksQ0FBQyxDQUFDLEVBQUUsQ0FBQztZQUM3RyxVQUFVLENBQUMsT0FBTyxHQUFHLFlBQVksQ0FBQTtRQUNuQyxDQUFDO1FBRUQsT0FBTyxVQUFVLENBQUE7SUFDbkIsQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQHRzLWNoZWNrXG5cbmltcG9ydCBNaWdyYXRpb25zTGVkZ2VyIGZyb20gXCIuLi9taWdyYXRpb25zLWxlZGdlci5qc1wiXG5pbXBvcnQgVGFibGVEYXRhIGZyb20gXCIuLi90YWJsZS1kYXRhL2luZGV4LmpzXCJcbmltcG9ydCBUYWJsZUluZGV4IGZyb20gXCIuLi90YWJsZS1kYXRhL3RhYmxlLWluZGV4LmpzXCJcblxuY29uc3QgU0lNUExFX0RFRkFVTFRfUEFUVEVSTiA9IC9eKD86LT9cXGQrKD86XFwuXFxkKyk/fFtBLVphLXowLTkgXy4sOi9AKy1dKikkL1xuXG4vKiogQHR5cGUge1JlY29yZDxzdHJpbmcsIG51bWJlcj59ICovXG5jb25zdCBURVhUX1RZUEVfUkFOS1MgPSB7XG4gIHRpbnl0ZXh0OiAxLFxuICB0ZXh0OiAyLFxuICBtZWRpdW10ZXh0OiAzLFxuICBsb25ndGV4dDogNFxufVxuXG4vKipcbiAqIENsb25lcyB0YWJsZSBzdHJ1Y3R1cmUgKGNvbHVtbnMsIHRleHQtdHlwZSB3aWRlbmluZywgaW5kZXhlcykgZnJvbSBhIHNvdXJjZSBkYXRhYmFzZVxuICogaW50byBhIHRhcmdldCBkYXRhYmFzZSBmb3IgYSBnaXZlbiBzZXQgb2YgdGFibGVzLCB0aGVuIGJhc2VsaW5lcyB0aGUgdGFyZ2V0J3NcbiAqIGBzY2hlbWFfbWlncmF0aW9uc2AgbGVkZ2VyIHRvIHRoZSBzb3VyY2UgdmlhIHtAbGluayBNaWdyYXRpb25zTGVkZ2VyfS4gVGhpcyBpcyB0aGVcbiAqIG1lY2hhbmlzbSBtdWx0aS10ZW5hbnQgYXBwcyB1c2UgdG8gcHJvdmlzaW9uIGEgdGVuYW50IGRhdGFiYXNlIGZyb20gYSB0ZW1wbGF0ZS9nbG9iYWxcbiAqIGRhdGFiYXNlIHdpdGhvdXQgcmUtcnVubmluZyBtaWdyYXRpb25zOiB0aGUgc3RydWN0dXJlIGlzIGNvcGllZCBhbmQgdGhlIGxlZGdlciBpc1xuICogcmVjb3JkZWQgYXMgYWxyZWFkeS1hcHBsaWVkLCBzbyBhIGxhdGVyIGBkYjp0ZW5hbnRzOm1pZ3JhdGVgIGRvZXMgbm90IHJlLXJ1biBhblxuICogYGFkZENvbHVtbmAgd2hvc2UgY29sdW1uIGFscmVhZHkgZXhpc3RzLlxuICpcbiAqIFRoZSBjbG9uZXIgaXMgaW50ZW50aW9uYWxseSBwb2xpY3ktZnJlZSDigJQgdGhlIGNhbGxlciBkZWNpZGVzIHdoaWNoIHRhYmxlcyB0byBzeW5jIGFuZFxuICogd2hpY2ggZGF0YWJhc2VzIGFyZSBzb3VyY2UvdGFyZ2V0LiBJdCBpcyBpZGVtcG90ZW50OiBtaXNzaW5nIHRhYmxlcyBhcmUgY3JlYXRlZCxcbiAqIG1pc3NpbmcgY29sdW1ucyBhZGRlZCwgdG9vLW5hcnJvdyB0ZXh0IGNvbHVtbnMgd2lkZW5lZCwgYW5kIG1pc3NpbmcgaW5kZXhlcyBjcmVhdGVkO1xuICogYW4gaW5kZXggd2hvc2UgZGVmaW5pdGlvbiBkaXZlcmdlcyBmcm9tIHRoZSBzb3VyY2UgaXMgdHJlYXRlZCBhcyBkcmlmdCBhbmQgdGhyb3dzLlxuICovXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBTY2hlbWFDbG9uZXIge1xuICAvKipcbiAgICogQ3JlYXRlcyBhIGNsb25lciB0aGF0IGNvcGllcyB0YWJsZSBzdHJ1Y3R1cmUgZnJvbSBgc291cmNlRGJgIGludG8gYHRhcmdldERiYC5cbiAgICogQHBhcmFtIHt7c291cmNlRGI6IGltcG9ydChcIi4uL2RyaXZlcnMvYmFzZS5qc1wiKS5kZWZhdWx0LCB0YXJnZXREYjogaW1wb3J0KFwiLi4vZHJpdmVycy9iYXNlLmpzXCIpLmRlZmF1bHR9fSBhcmdzIC0gRGF0YWJhc2VzIHRvIGNsb25lIHN0cnVjdHVyZSBmcm9tIGFuZCBpbnRvLlxuICAgKi9cbiAgY29uc3RydWN0b3Ioe3NvdXJjZURiLCB0YXJnZXREYn0pIHtcbiAgICB0aGlzLnNvdXJjZURiID0gc291cmNlRGJcbiAgICB0aGlzLnRhcmdldERiID0gdGFyZ2V0RGJcbiAgfVxuXG4gIC8qKlxuICAgKiBDbG9uZXMgZXZlcnkgZ2l2ZW4gdGFibGUgZnJvbSB0aGUgc291cmNlIGludG8gdGhlIHRhcmdldCwgdGhlbiBiYXNlbGluZXMgdGhlXG4gICAqIHRhcmdldCdzIGxlZGdlciBzbyB0aGUgY2xvbmVkIHNjaGVtYSBpcyByZWNvcmRlZCBhcyBhbHJlYWR5LW1pZ3JhdGVkLlxuICAgKiBAcGFyYW0ge3N0cmluZ1tdfSB0YWJsZU5hbWVzIC0gU291cmNlIHRhYmxlcyB3aG9zZSBzdHJ1Y3R1cmUgc2hvdWxkIGJlIGNsb25lZC5cbiAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59XG4gICAqL1xuICBhc3luYyBzeW5jVGFibGVzKHRhYmxlTmFtZXMpIHtcbiAgICBmb3IgKGNvbnN0IHRhYmxlTmFtZSBvZiB0YWJsZU5hbWVzKSB7XG4gICAgICBhd2FpdCB0aGlzLnN5bmNUYWJsZSh0YWJsZU5hbWUpXG4gICAgfVxuXG4gICAgYXdhaXQgdGhpcy5yZWNvbmNpbGVMZWRnZXIoKVxuICB9XG5cbiAgLyoqXG4gICAqIENsb25lcyBhIHNpbmdsZSB0YWJsZSBmcm9tIHRoZSBzb3VyY2UgaW50byB0aGUgdGFyZ2V0LCBjcmVhdGluZyBpdCBvciBhZGRpbmcgYW5kXG4gICAqIHdpZGVuaW5nIGNvbHVtbnMgYW5kIGluZGV4ZXMgYXMgbmVlZGVkLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gdGFibGVOYW1lIC0gU291cmNlIHRhYmxlIHRvIHN5bmNocm9uaXplIHdpdGggdGhlIHRhcmdldC5cbiAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59XG4gICAqL1xuICBhc3luYyBzeW5jVGFibGUodGFibGVOYW1lKSB7XG4gICAgY29uc3Qgc291cmNlVGFibGUgPSBhd2FpdCB0aGlzLnNvdXJjZURiLmdldFRhYmxlQnlOYW1lKHRhYmxlTmFtZSlcblxuICAgIGlmICghc291cmNlVGFibGUpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgRXhwZWN0ZWQgc291cmNlIHRhYmxlIHRvIGV4aXN0OiAke3RhYmxlTmFtZX1gKVxuICAgIH1cblxuICAgIGlmICghYXdhaXQgdGhpcy50YXJnZXREYi50YWJsZUV4aXN0cyh0YWJsZU5hbWUpKSB7XG4gICAgICBhd2FpdCB0aGlzLmNyZWF0ZVRhcmdldFRhYmxlKHtzb3VyY2VUYWJsZSwgdGFibGVOYW1lfSlcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGNvbnN0IGNoYW5nZWRDb2x1bW5zID0gYXdhaXQgdGhpcy5lbnN1cmVUYXJnZXRDb2x1bW5zKHtzb3VyY2VUYWJsZSwgdGFibGVOYW1lfSlcblxuICAgIGlmIChjaGFuZ2VkQ29sdW1ucykge1xuICAgICAgdGhpcy50YXJnZXREYi5jbGVhclNjaGVtYUNhY2hlKClcbiAgICB9XG5cbiAgICBhd2FpdCB0aGlzLmVuc3VyZVRhcmdldEluZGV4ZXMoe3NvdXJjZVRhYmxlLCB0YWJsZU5hbWV9KVxuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgdGhlIHRhYmxlIGluIHRoZSB0YXJnZXQgZnJvbSB0aGUgc291cmNlIHRhYmxlJ3MgY29sdW1ucyBhbmQgaXRzXG4gICAqIG5vbi1wcmltYXJ5LWtleSBpbmRleGVzLlxuICAgKiBAcGFyYW0ge3tzb3VyY2VUYWJsZTogaW1wb3J0KFwiLi4vZHJpdmVycy9iYXNlLXRhYmxlLmpzXCIpLmRlZmF1bHQsIHRhYmxlTmFtZTogc3RyaW5nfX0gYXJncyAtIFNvdXJjZSB0YWJsZSBtZXRhZGF0YSBhbmQgdGFyZ2V0IHRhYmxlIG5hbWUuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fVxuICAgKi9cbiAgYXN5bmMgY3JlYXRlVGFyZ2V0VGFibGUoe3NvdXJjZVRhYmxlLCB0YWJsZU5hbWV9KSB7XG4gICAgY29uc3QgdGFibGVEYXRhID0gbmV3IFRhYmxlRGF0YSh0YWJsZU5hbWUpXG5cbiAgICBmb3IgKGNvbnN0IHNvdXJjZUNvbHVtbiBvZiBhd2FpdCBzb3VyY2VUYWJsZS5nZXRDb2x1bW5zKCkpIHtcbiAgICAgIHRhYmxlRGF0YS5hZGRDb2x1bW4oc291cmNlQ29sdW1uLmdldE5hbWUoKSwgdGhpcy5jb2x1bW5BcmdzRnJvbVNvdXJjZUNvbHVtbihzb3VyY2VDb2x1bW4sIHtpc05ld0NvbHVtbjogZmFsc2V9KSlcbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IHNvdXJjZUluZGV4IG9mIGF3YWl0IHNvdXJjZVRhYmxlLmdldEluZGV4ZXMoKSkge1xuICAgICAgaWYgKCFzb3VyY2VJbmRleC5pc1ByaW1hcnlLZXkoKSkge1xuICAgICAgICB0YWJsZURhdGEuYWRkSW5kZXgodGhpcy50YWJsZURhdGFJbmRleEZyb21Tb3VyY2VJbmRleChzb3VyY2VJbmRleCkpXG4gICAgICB9XG4gICAgfVxuXG4gICAgYXdhaXQgdGhpcy50YXJnZXREYi5jcmVhdGVUYWJsZSh0YWJsZURhdGEpXG4gICAgdGhpcy50YXJnZXREYi5jbGVhclNjaGVtYUNhY2hlKClcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGRzIGNvbHVtbnMgcHJlc2VudCBvbiB0aGUgc291cmNlIGJ1dCBtaXNzaW5nIGZyb20gdGhlIHRhcmdldCwgYW5kIHdpZGVuc1xuICAgKiB0b28tbmFycm93IHRhcmdldCB0ZXh0IGNvbHVtbnMuXG4gICAqIEBwYXJhbSB7e3NvdXJjZVRhYmxlOiBpbXBvcnQoXCIuLi9kcml2ZXJzL2Jhc2UtdGFibGUuanNcIikuZGVmYXVsdCwgdGFibGVOYW1lOiBzdHJpbmd9fSBhcmdzIC0gU291cmNlIHRhYmxlIG1ldGFkYXRhIGFuZCB0YXJnZXQgdGFibGUgbmFtZS5cbiAgICogQHJldHVybnMge1Byb21pc2U8Ym9vbGVhbj59IFdoZXRoZXIgYW55IGNvbHVtbiB3YXMgYWRkZWQgb3Igd2lkZW5lZC5cbiAgICovXG4gIGFzeW5jIGVuc3VyZVRhcmdldENvbHVtbnMoe3NvdXJjZVRhYmxlLCB0YWJsZU5hbWV9KSB7XG4gICAgY29uc3Qgc291cmNlQ29sdW1ucyA9IGF3YWl0IHNvdXJjZVRhYmxlLmdldENvbHVtbnMoKVxuICAgIGNvbnN0IHRhcmdldFRhYmxlID0gYXdhaXQgdGhpcy50YXJnZXREYi5nZXRUYWJsZUJ5TmFtZU9yRmFpbCh0YWJsZU5hbWUpXG4gICAgY29uc3QgdGFyZ2V0Q29sdW1uc0J5TmFtZSA9IG5ldyBNYXAoKVxuICAgIGNvbnN0IG1pc3NpbmdDb2x1bW5zID0gW11cbiAgICBjb25zdCBjb2x1bW5zTmVlZGluZ1dpZGVuaW5nID0gW11cblxuICAgIGZvciAoY29uc3QgdGFyZ2V0Q29sdW1uIG9mIGF3YWl0IHRhcmdldFRhYmxlLmdldENvbHVtbnMoKSkge1xuICAgICAgdGFyZ2V0Q29sdW1uc0J5TmFtZS5zZXQodGFyZ2V0Q29sdW1uLmdldE5hbWUoKSwgdGFyZ2V0Q29sdW1uKVxuICAgIH1cblxuICAgIGZvciAoY29uc3Qgc291cmNlQ29sdW1uIG9mIHNvdXJjZUNvbHVtbnMpIHtcbiAgICAgIGNvbnN0IHRhcmdldENvbHVtbiA9IHRhcmdldENvbHVtbnNCeU5hbWUuZ2V0KHNvdXJjZUNvbHVtbi5nZXROYW1lKCkpXG5cbiAgICAgIGlmICghdGFyZ2V0Q29sdW1uKSB7XG4gICAgICAgIG1pc3NpbmdDb2x1bW5zLnB1c2goc291cmNlQ29sdW1uKVxuICAgICAgfSBlbHNlIGlmICh0aGlzLmNvbHVtbk5lZWRzV2lkZW5pbmcoc291cmNlQ29sdW1uLCB0YXJnZXRDb2x1bW4pKSB7XG4gICAgICAgIGNvbHVtbnNOZWVkaW5nV2lkZW5pbmcucHVzaChzb3VyY2VDb2x1bW4pXG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKG1pc3NpbmdDb2x1bW5zLmxlbmd0aCA8PSAwICYmIGNvbHVtbnNOZWVkaW5nV2lkZW5pbmcubGVuZ3RoIDw9IDApIHtcbiAgICAgIHJldHVybiBmYWxzZVxuICAgIH1cblxuICAgIGNvbnN0IHRhYmxlRGF0YSA9IG5ldyBUYWJsZURhdGEodGFibGVOYW1lKVxuXG4gICAgZm9yIChjb25zdCBzb3VyY2VDb2x1bW4gb2YgbWlzc2luZ0NvbHVtbnMpIHtcbiAgICAgIHRhYmxlRGF0YS5hZGRDb2x1bW4oc291cmNlQ29sdW1uLmdldE5hbWUoKSwgdGhpcy5jb2x1bW5BcmdzRnJvbVNvdXJjZUNvbHVtbihzb3VyY2VDb2x1bW4sIHtpc05ld0NvbHVtbjogdHJ1ZX0pKVxuICAgIH1cblxuICAgIGZvciAoY29uc3Qgc291cmNlQ29sdW1uIG9mIGNvbHVtbnNOZWVkaW5nV2lkZW5pbmcpIHtcbiAgICAgIHRhYmxlRGF0YS5hZGRDb2x1bW4oc291cmNlQ29sdW1uLmdldE5hbWUoKSwgdGhpcy5jb2x1bW5BcmdzRnJvbVNvdXJjZUNvbHVtbihzb3VyY2VDb2x1bW4sIHtpc05ld0NvbHVtbjogZmFsc2V9KSlcbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IGFsdGVyU3FsIG9mIGF3YWl0IHRoaXMudGFyZ2V0RGIuYWx0ZXJUYWJsZVNRTHModGFibGVEYXRhKSkge1xuICAgICAgYXdhaXQgdGhpcy50YXJnZXREYi5xdWVyeShhbHRlclNxbClcbiAgICB9XG5cbiAgICByZXR1cm4gdHJ1ZVxuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgbm9uLXByaW1hcnkta2V5IGluZGV4ZXMgcHJlc2VudCBvbiB0aGUgc291cmNlIGJ1dCBtaXNzaW5nIGZyb20gdGhlIHRhcmdldCxcbiAgICogYW5kIHJlcGxhY2VzIHRhcmdldCBpbmRleGVzIHdob3NlIGRlZmluaXRpb24gKGNvbHVtbnMgb3IgdW5pcXVlbmVzcykgZHJpZnRlZCBmcm9tXG4gICAqIHRoZSBzb3VyY2UuXG4gICAqIEBwYXJhbSB7e3NvdXJjZVRhYmxlOiBpbXBvcnQoXCIuLi9kcml2ZXJzL2Jhc2UtdGFibGUuanNcIikuZGVmYXVsdCwgdGFibGVOYW1lOiBzdHJpbmd9fSBhcmdzIC0gU291cmNlIHRhYmxlIG1ldGFkYXRhIGFuZCB0YXJnZXQgdGFibGUgbmFtZS5cbiAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59XG4gICAqL1xuICBhc3luYyBlbnN1cmVUYXJnZXRJbmRleGVzKHtzb3VyY2VUYWJsZSwgdGFibGVOYW1lfSkge1xuICAgIGNvbnN0IHRhcmdldFRhYmxlID0gYXdhaXQgdGhpcy50YXJnZXREYi5nZXRUYWJsZUJ5TmFtZU9yRmFpbCh0YWJsZU5hbWUpXG4gICAgLyoqIEB0eXBlIHtNYXA8c3RyaW5nLCBpbXBvcnQoXCIuLi9kcml2ZXJzL2Jhc2UtY29sdW1ucy1pbmRleC5qc1wiKS5kZWZhdWx0Pn0gKi9cbiAgICBjb25zdCB0YXJnZXRJbmRleGVzQnlOYW1lID0gbmV3IE1hcCgpXG4gICAgY29uc3QgdGFyZ2V0SW5kZXhTaWduYXR1cmVzID0gbmV3IFNldCgpXG4gICAgbGV0IGRpcnR5ID0gZmFsc2VcblxuICAgIGZvciAoY29uc3QgdGFyZ2V0SW5kZXggb2YgYXdhaXQgdGFyZ2V0VGFibGUuZ2V0SW5kZXhlcygpKSB7XG4gICAgICB0YXJnZXRJbmRleGVzQnlOYW1lLnNldCh0YXJnZXRJbmRleC5nZXROYW1lKCksIHRhcmdldEluZGV4KVxuICAgICAgdGFyZ2V0SW5kZXhTaWduYXR1cmVzLmFkZCh0aGlzLmluZGV4U2lnbmF0dXJlKHRhcmdldEluZGV4KSlcbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IHNvdXJjZUluZGV4IG9mIGF3YWl0IHNvdXJjZVRhYmxlLmdldEluZGV4ZXMoKSkge1xuICAgICAgaWYgKHNvdXJjZUluZGV4LmlzUHJpbWFyeUtleSgpKSB7XG4gICAgICAgIGNvbnRpbnVlXG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHNvdXJjZUluZGV4U2lnbmF0dXJlID0gdGhpcy5pbmRleFNpZ25hdHVyZShzb3VyY2VJbmRleClcblxuICAgICAgLy8gU1FMaXRlIGluZGV4IG5hbWVzIGFyZSB1bmlxdWUgcGVyLWRhdGFiYXNlLCBub3QgcGVyLXRhYmxlLCBzbyBtYXRjaCBjbG9uZWRcbiAgICAgIC8vIGluZGV4ZXMgYnkgdGhlaXIgY29sdW1uL3VuaXF1ZW5lc3Mgc2lnbmF0dXJlIHJhdGhlciB0aGFuIHRoZWlyIG5hbWUuXG4gICAgICBpZiAodGhpcy50YXJnZXREYi5nZXRUeXBlKCkgPT09IFwic3FsaXRlXCIgJiYgdGFyZ2V0SW5kZXhTaWduYXR1cmVzLmhhcyhzb3VyY2VJbmRleFNpZ25hdHVyZSkpIHtcbiAgICAgICAgY29udGludWVcbiAgICAgIH1cblxuICAgICAgY29uc3QgdGFyZ2V0SW5kZXggPSB0aGlzLnRhcmdldERiLmdldFR5cGUoKSA9PT0gXCJzcWxpdGVcIiA/IHVuZGVmaW5lZCA6IHRhcmdldEluZGV4ZXNCeU5hbWUuZ2V0KHNvdXJjZUluZGV4LmdldE5hbWUoKSlcblxuICAgICAgaWYgKHRhcmdldEluZGV4KSB7XG4gICAgICAgIGlmICghdGhpcy5pbmRleGVzTWF0Y2goc291cmNlSW5kZXgsIHRhcmdldEluZGV4KSkge1xuICAgICAgICAgIC8vIFJlcGxhY2luZyBhIG5vbi11bmlxdWUgaW5kZXggd2l0aCBhIHVuaXF1ZSBvbmUgaXMgdW5zYWZlIGJlY2F1c2VcbiAgICAgICAgICAvLyB0aGUgdGFyZ2V0IG1heSBoYXZlIGR1cGxpY2F0ZSB2YWx1ZXMgdGhhdCB3aWxsIHJlamVjdCB0aGUgbmV3XG4gICAgICAgICAgLy8gdW5pcXVlIGNvbnN0cmFpbnQsIGFuZCB0aGUgb2xkIGluZGV4IHdhcyBhbHJlYWR5IGRyb3BwZWQgYnkgdGhpc1xuICAgICAgICAgIC8vIHBvaW50LiBUaGUgb3Bwb3NpdGUgZGlyZWN0aW9uICh1bmlxdWUg4oaSIG5vbi11bmlxdWUpIGlzIGFsd2F5c1xuICAgICAgICAgIC8vIHNhZmUg4oCUIG5vbi11bmlxdWUgaW5kZXhlcyBuZXZlciBmYWlsIG9uIGR1cGxpY2F0ZSB2YWx1ZXMuXG4gICAgICAgICAgaWYgKHNvdXJjZUluZGV4LmlzVW5pcXVlKCkgJiYgIXRhcmdldEluZGV4LmlzVW5pcXVlKCkpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgU2NoZW1hIGNsb25lIGluZGV4IGRyaWZ0IGZvciAke3RhYmxlTmFtZX0uJHtzb3VyY2VJbmRleC5nZXROYW1lKCl9OiBjYW5ub3Qgc2FmZWx5IHJlcGxhY2UgYSBub24tdW5pcXVlIGluZGV4IHdpdGggYSB1bmlxdWUgb25lLmApXG4gICAgICAgICAgfVxuXG4gICAgICAgICAgYXdhaXQgdGhpcy5kcm9wVGFyZ2V0SW5kZXgoe3RhYmxlTmFtZSwgdGFyZ2V0SW5kZXh9KVxuICAgICAgICAgIHRhcmdldEluZGV4ZXNCeU5hbWUuZGVsZXRlKHRhcmdldEluZGV4LmdldE5hbWUoKSlcbiAgICAgICAgICB0YXJnZXRJbmRleFNpZ25hdHVyZXMuZGVsZXRlKHRoaXMuaW5kZXhTaWduYXR1cmUodGFyZ2V0SW5kZXgpKVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGNvbnRpbnVlXG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gRHJvcCBhbnkgdGFyZ2V0IGluZGV4IHRoYXQgc2hhcmVzIHRoZSBzb3VyY2UgbmFtZSBidXQgc3Vydml2ZWQgdGhlXG4gICAgICAvLyBkcmlmdCBjaGVjayBhYm92ZSBiZWNhdXNlIHRoZSBkcml2ZXIgd2FzIHNraXBwZWQgKFNRTGl0ZSkuXG4gICAgICBjb25zdCBzYW1lTmFtZVRhcmdldEluZGV4ID0gdGFyZ2V0SW5kZXhlc0J5TmFtZS5nZXQoc291cmNlSW5kZXguZ2V0TmFtZSgpKVxuXG4gICAgICBpZiAoc2FtZU5hbWVUYXJnZXRJbmRleCkge1xuICAgICAgICBhd2FpdCB0aGlzLmRyb3BUYXJnZXRJbmRleCh7dGFibGVOYW1lLCB0YXJnZXRJbmRleDogc2FtZU5hbWVUYXJnZXRJbmRleH0pXG4gICAgICAgIHRhcmdldEluZGV4ZXNCeU5hbWUuZGVsZXRlKHNhbWVOYW1lVGFyZ2V0SW5kZXguZ2V0TmFtZSgpKVxuICAgICAgICB0YXJnZXRJbmRleFNpZ25hdHVyZXMuZGVsZXRlKHRoaXMuaW5kZXhTaWduYXR1cmUoc2FtZU5hbWVUYXJnZXRJbmRleCkpXG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGNyZWF0ZUluZGV4U3FscyA9IGF3YWl0IHRoaXMudGFyZ2V0RGIuY3JlYXRlSW5kZXhTUUxzKHRoaXMuY3JlYXRlSW5kZXhBcmdzRnJvbVNvdXJjZUluZGV4KHtzb3VyY2VJbmRleCwgdGFibGVOYW1lfSkpXG5cbiAgICAgIGZvciAoY29uc3QgY3JlYXRlSW5kZXhTcWwgb2YgY3JlYXRlSW5kZXhTcWxzKSB7XG4gICAgICAgIGF3YWl0IHRoaXMudGFyZ2V0RGIucXVlcnkoY3JlYXRlSW5kZXhTcWwpXG4gICAgICB9XG5cbiAgICAgIGRpcnR5ID0gdHJ1ZVxuICAgICAgdGFyZ2V0SW5kZXhTaWduYXR1cmVzLmFkZChzb3VyY2VJbmRleFNpZ25hdHVyZSlcbiAgICB9XG5cbiAgICBpZiAoZGlydHkpIHtcbiAgICAgIHRoaXMudGFyZ2V0RGIuY2xlYXJTY2hlbWFDYWNoZSgpXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIERyb3BzIGFuIGluZGV4IG9uIHRoZSB0YXJnZXQgZGF0YWJhc2UuXG4gICAqIEBwYXJhbSB7e3RhYmxlTmFtZTogc3RyaW5nLCB0YXJnZXRJbmRleDogaW1wb3J0KFwiLi4vZHJpdmVycy9iYXNlLWNvbHVtbnMtaW5kZXguanNcIikuZGVmYXVsdH19IGFyZ3MgLSBUYXJnZXQgdGFibGUgYW5kIGluZGV4IHRvIHJlbW92ZS5cbiAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59XG4gICAqL1xuICBhc3luYyBkcm9wVGFyZ2V0SW5kZXgoe3RhYmxlTmFtZSwgdGFyZ2V0SW5kZXh9KSB7XG4gICAgY29uc3QgZHJvcFNxbHMgPSBhd2FpdCB0aGlzLnRhcmdldERiLnJlbW92ZUluZGV4U1FMcyh7bmFtZTogdGFyZ2V0SW5kZXguZ2V0TmFtZSgpLCB0YWJsZU5hbWV9KVxuXG4gICAgZm9yIChjb25zdCBzcWwgb2YgZHJvcFNxbHMpIHtcbiAgICAgIGF3YWl0IHRoaXMudGFyZ2V0RGIucXVlcnkoc3FsKVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBCYXNlbGluZXMgdGhlIHRhcmdldCBsZWRnZXIgc28gdGhlIGNsb25lZCBzY2hlbWEgaXMgcmVjb3JkZWQgYXMgYWxyZWFkeS1hcHBsaWVkLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxzdHJpbmdbXT59IFRoZSB2ZXJzaW9ucyBuZXdseSByZWNvcmRlZCBvbiB0aGUgdGFyZ2V0LlxuICAgKi9cbiAgYXN5bmMgcmVjb25jaWxlTGVkZ2VyKCkge1xuICAgIHJldHVybiBhd2FpdCBNaWdyYXRpb25zTGVkZ2VyLmJhc2VsaW5lRnJvbURhdGFiYXNlKHtzb3VyY2VEYjogdGhpcy5zb3VyY2VEYiwgdGFyZ2V0RGI6IHRoaXMudGFyZ2V0RGJ9KVxuICB9XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdGhlIHRhcmdldCBsZWRnZXIgaXMgbWlzc2luZyBhbnkgdmVyc2lvbiBhcHBsaWVkIG9uIHRoZSBzb3VyY2Ug4oCUIGkuZS4gdGhlXG4gICAqIHRhcmdldCBzY2hlbWEgbWF5IGhhdmUgYmVlbiBhZHZhbmNlZCBvdXQgb2YgYmFuZCB3aXRob3V0IHJlY29yZGluZyBpdC5cbiAgICogQHJldHVybnMge1Byb21pc2U8Ym9vbGVhbj59IC0gV2hldGhlciB0aGUgdGFyZ2V0IGxlZGdlciBkaWZmZXJzIGZyb20gdGhlIHNvdXJjZS5cbiAgICovXG4gIGFzeW5jIGxlZGdlckRyaWZ0c0Zyb21Tb3VyY2UoKSB7XG4gICAgaWYgKCFhd2FpdCBNaWdyYXRpb25zTGVkZ2VyLnRhYmxlRXhpc3RzKHRoaXMudGFyZ2V0RGIpKSB7XG4gICAgICByZXR1cm4gdHJ1ZVxuICAgIH1cblxuICAgIGNvbnN0IHNvdXJjZVZlcnNpb25zID0gYXdhaXQgTWlncmF0aW9uc0xlZGdlci5hcHBsaWVkVmVyc2lvbnModGhpcy5zb3VyY2VEYilcbiAgICBjb25zdCB0YXJnZXRWZXJzaW9uU2V0ID0gbmV3IFNldChhd2FpdCBNaWdyYXRpb25zTGVkZ2VyLmFwcGxpZWRWZXJzaW9ucyh0aGlzLnRhcmdldERiKSlcblxuICAgIHJldHVybiBzb3VyY2VWZXJzaW9ucy5zb21lKCh2ZXJzaW9uKSA9PiAhdGFyZ2V0VmVyc2lvblNldC5oYXModmVyc2lvbikpXG4gIH1cblxuICAvKipcbiAgICogTWFwcyBhIHNvdXJjZSBpbmRleCBpbnRvIGEgVGFibGVEYXRhIGluZGV4IGZvciB0YWJsZSBjcmVhdGlvbiAoU1FMaXRlIG9taXRzIHRoZVxuICAgKiBpbmRleCBuYW1lIHNvIHRoZSBkcml2ZXIgY2FuIGdlbmVyYXRlIGEgdW5pcXVlIG9uZSkuXG4gICAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vZHJpdmVycy9iYXNlLWNvbHVtbnMtaW5kZXguanNcIikuZGVmYXVsdH0gc291cmNlSW5kZXggLSBTb3VyY2UgaW5kZXggZGVmaW5pdGlvbi5cbiAgICogQHJldHVybnMge1RhYmxlSW5kZXh9IC0gRnJhbWV3b3JrLWluZGVwZW5kZW50IGluZGV4IGRlZmluaXRpb24uXG4gICAqL1xuICB0YWJsZURhdGFJbmRleEZyb21Tb3VyY2VJbmRleChzb3VyY2VJbmRleCkge1xuICAgIC8qKiBAdHlwZSB7e25hbWU/OiBzdHJpbmcsIHVuaXF1ZTogYm9vbGVhbn19ICovXG4gICAgY29uc3QgYXJncyA9IHt1bmlxdWU6IHNvdXJjZUluZGV4LmlzVW5pcXVlKCl9XG5cbiAgICAvLyBTUUxpdGUgaW5kZXggbmFtZXMgYXJlIHVuaXF1ZSBwZXItZGF0YWJhc2UsIG5vdCBwZXItdGFibGUsIHNvIGxldCB0aGUgZHJpdmVyXG4gICAgLy8gZ2VuZXJhdGUgb25lOyBvdGhlciBkcml2ZXJzIHByZXNlcnZlIHRoZSBzb3VyY2UgaW5kZXggbmFtZS4gQnVpbGQgdGhlIFRhYmxlSW5kZXhcbiAgICAvLyBkaXJlY3RseSAocmF0aGVyIHRoYW4gdmlhIHRoZSBkcml2ZXIncyBnZXRUYWJsZURhdGFJbmRleCwgd2hpY2ggb25seSBNeVNRTCBhbmRcbiAgICAvLyBTUUxpdGUgaW1wbGVtZW50KSBzbyBjbG9uaW5nIGEgUG9zdGdyZVNRTCBvciBNUy1TUUwgc291cmNlIHRhYmxlIHdvcmtzIHRvby5cbiAgICBpZiAodGhpcy50YXJnZXREYi5nZXRUeXBlKCkgIT09IFwic3FsaXRlXCIpIHtcbiAgICAgIGFyZ3MubmFtZSA9IHNvdXJjZUluZGV4LmdldE5hbWUoKVxuICAgIH1cblxuICAgIHJldHVybiBuZXcgVGFibGVJbmRleChzb3VyY2VJbmRleC5nZXRDb2x1bW5OYW1lcygpLCBhcmdzKVxuICB9XG5cbiAgLyoqXG4gICAqIEJ1aWxkcyBkcml2ZXIgY3JlYXRlLWluZGV4IGFyZ3MgZnJvbSBhIHNvdXJjZSBpbmRleCAodGhlIGluZGV4IG5hbWUgaXMgb21pdHRlZCBvblxuICAgKiBTUUxpdGUsIHdoZXJlIGluZGV4IG5hbWVzIGFyZSB1bmlxdWUgcGVyLWRhdGFiYXNlIHJhdGhlciB0aGFuIHBlci10YWJsZSkuXG4gICAqIEBwYXJhbSB7e3NvdXJjZUluZGV4OiBpbXBvcnQoXCIuLi9kcml2ZXJzL2Jhc2UtY29sdW1ucy1pbmRleC5qc1wiKS5kZWZhdWx0LCB0YWJsZU5hbWU6IHN0cmluZ319IGFyZ3MgLSBTb3VyY2UgaW5kZXggYW5kIHRhcmdldCB0YWJsZSByZWNlaXZpbmcgaXQuXG4gICAqIEByZXR1cm5zIHt7Y29sdW1uczogc3RyaW5nW10sIG5hbWU/OiBzdHJpbmcsIHRhYmxlTmFtZTogc3RyaW5nLCB1bmlxdWU6IGJvb2xlYW59fSAtIEFyZ3VtZW50cyBmb3IgY3JlYXRpbmcgdGhlIHRhcmdldCBpbmRleC5cbiAgICovXG4gIGNyZWF0ZUluZGV4QXJnc0Zyb21Tb3VyY2VJbmRleCh7c291cmNlSW5kZXgsIHRhYmxlTmFtZX0pIHtcbiAgICAvKiogQHR5cGUge3tjb2x1bW5zOiBzdHJpbmdbXSwgbmFtZT86IHN0cmluZywgdGFibGVOYW1lOiBzdHJpbmcsIHVuaXF1ZTogYm9vbGVhbn19ICovXG4gICAgY29uc3QgY3JlYXRlSW5kZXhBcmdzID0ge1xuICAgICAgY29sdW1uczogc291cmNlSW5kZXguZ2V0Q29sdW1uTmFtZXMoKSxcbiAgICAgIHRhYmxlTmFtZSxcbiAgICAgIHVuaXF1ZTogc291cmNlSW5kZXguaXNVbmlxdWUoKVxuICAgIH1cblxuICAgIGlmICh0aGlzLnRhcmdldERiLmdldFR5cGUoKSAhPT0gXCJzcWxpdGVcIikge1xuICAgICAgY3JlYXRlSW5kZXhBcmdzLm5hbWUgPSBzb3VyY2VJbmRleC5nZXROYW1lKClcbiAgICB9XG5cbiAgICByZXR1cm4gY3JlYXRlSW5kZXhBcmdzXG4gIH1cblxuICAvKipcbiAgICogV2hldGhlciB0d28gaW5kZXhlcyBoYXZlIHRoZSBzYW1lIHVuaXF1ZW5lc3MgYW5kIG9yZGVyZWQgY29sdW1uIGxpc3QuXG4gICAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vZHJpdmVycy9iYXNlLWNvbHVtbnMtaW5kZXguanNcIikuZGVmYXVsdH0gc291cmNlSW5kZXggLSBTb3VyY2UgaW5kZXggZGVmaW5pdGlvbi5cbiAgICogQHBhcmFtIHtpbXBvcnQoXCIuLi9kcml2ZXJzL2Jhc2UtY29sdW1ucy1pbmRleC5qc1wiKS5kZWZhdWx0fSB0YXJnZXRJbmRleCAtIFRhcmdldCBpbmRleCBkZWZpbml0aW9uLlxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gLSBXaGV0aGVyIGJvdGggaW5kZXhlcyBoYXZlIHRoZSBzYW1lIHNoYXBlLlxuICAgKi9cbiAgaW5kZXhlc01hdGNoKHNvdXJjZUluZGV4LCB0YXJnZXRJbmRleCkge1xuICAgIGNvbnN0IHNvdXJjZUNvbHVtbk5hbWVzID0gc291cmNlSW5kZXguZ2V0Q29sdW1uTmFtZXMoKVxuICAgIGNvbnN0IHRhcmdldENvbHVtbk5hbWVzID0gdGFyZ2V0SW5kZXguZ2V0Q29sdW1uTmFtZXMoKVxuXG4gICAgaWYgKHNvdXJjZUluZGV4LmlzVW5pcXVlKCkgIT09IHRhcmdldEluZGV4LmlzVW5pcXVlKCkpIHtcbiAgICAgIHJldHVybiBmYWxzZVxuICAgIH1cblxuICAgIGlmIChzb3VyY2VDb2x1bW5OYW1lcy5sZW5ndGggIT09IHRhcmdldENvbHVtbk5hbWVzLmxlbmd0aCkge1xuICAgICAgcmV0dXJuIGZhbHNlXG4gICAgfVxuXG4gICAgZm9yIChsZXQgY29sdW1uSW5kZXggPSAwOyBjb2x1bW5JbmRleCA8IHNvdXJjZUNvbHVtbk5hbWVzLmxlbmd0aDsgY29sdW1uSW5kZXgrKykge1xuICAgICAgaWYgKHNvdXJjZUNvbHVtbk5hbWVzW2NvbHVtbkluZGV4XSAhPT0gdGFyZ2V0Q29sdW1uTmFtZXNbY29sdW1uSW5kZXhdKSB7XG4gICAgICAgIHJldHVybiBmYWxzZVxuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB0cnVlXG4gIH1cblxuICAvKipcbiAgICogQSBzdGFibGUgc2lnbmF0dXJlIGZvciBhbiBpbmRleCwgdXNlZCB0byBtYXRjaCBjbG9uZWQgaW5kZXhlcyBieSBzaGFwZS5cbiAgICogQHBhcmFtIHtpbXBvcnQoXCIuLi9kcml2ZXJzL2Jhc2UtY29sdW1ucy1pbmRleC5qc1wiKS5kZWZhdWx0fSBpbmRleCAtIEluZGV4IGRlZmluaXRpb24uXG4gICAqIEByZXR1cm5zIHtzdHJpbmd9IC0gU3RhYmxlIGluZGV4LXNoYXBlIHNpZ25hdHVyZS5cbiAgICovXG4gIGluZGV4U2lnbmF0dXJlKGluZGV4KSB7XG4gICAgcmV0dXJuIGAke2luZGV4LmlzVW5pcXVlKCkgPyBcInVuaXF1ZVwiIDogXCJpbmRleFwifToke2luZGV4LmdldENvbHVtbk5hbWVzKCkuam9pbihcIixcIil9YFxuICB9XG5cbiAgLyoqXG4gICAqIE5vcm1hbGl6ZXMgYSBjb2x1bW4gdHlwZSB0byBpdHMgY2Fub25pY2FsIGxvd2VyY2FzZSBmb3JtIChgaW50YCBiZWNvbWVzIGBpbnRlZ2VyYCkuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBjb2x1bW5UeXBlIC0gRGF0YWJhc2UgY29sdW1uIHR5cGUuXG4gICAqIEByZXR1cm5zIHtzdHJpbmd9IC0gQ2Fub25pY2FsIGxvd2VyY2FzZSBjb2x1bW4gdHlwZS5cbiAgICovXG4gIG5vcm1hbGl6ZWRDb2x1bW5UeXBlKGNvbHVtblR5cGUpIHtcbiAgICBjb25zdCBub3JtYWxpemVkVHlwZSA9IGNvbHVtblR5cGUudG9Mb3dlckNhc2UoKVxuXG4gICAgaWYgKG5vcm1hbGl6ZWRUeXBlID09PSBcImludFwiKSB7XG4gICAgICByZXR1cm4gXCJpbnRlZ2VyXCJcbiAgICB9XG5cbiAgICByZXR1cm4gbm9ybWFsaXplZFR5cGVcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgd2lkZW5pbmcgcmFuayBvZiBhIHRleHQgY29sdW1uIHR5cGUgKDAgd2hlbiBub3QgYSB0ZXh0IHR5cGUpLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gY29sdW1uVHlwZSAtIERhdGFiYXNlIGNvbHVtbiB0eXBlLlxuICAgKiBAcmV0dXJucyB7bnVtYmVyfSAtIFRleHQtdHlwZSB3aWRlbmluZyByYW5rLlxuICAgKi9cbiAgdGV4dFR5cGVSYW5rKGNvbHVtblR5cGUpIHtcbiAgICByZXR1cm4gVEVYVF9UWVBFX1JBTktTW3RoaXMubm9ybWFsaXplZENvbHVtblR5cGUoY29sdW1uVHlwZSldIHx8IDBcbiAgfVxuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRoZSB0YXJnZXQncyB0ZXh0IGNvbHVtbiBpcyBuYXJyb3dlciB0aGFuIHRoZSBzb3VyY2UncyBhbmQgbXVzdCBiZSB3aWRlbmVkLlxuICAgKiBAcGFyYW0ge2ltcG9ydChcIi4uL2RyaXZlcnMvYmFzZS1jb2x1bW4uanNcIikuZGVmYXVsdH0gc291cmNlQ29sdW1uIC0gU291cmNlIGNvbHVtbiBkZWZpbml0aW9uLlxuICAgKiBAcGFyYW0ge2ltcG9ydChcIi4uL2RyaXZlcnMvYmFzZS1jb2x1bW4uanNcIikuZGVmYXVsdH0gdGFyZ2V0Q29sdW1uIC0gVGFyZ2V0IGNvbHVtbiBkZWZpbml0aW9uLlxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gLSBXaGV0aGVyIHRoZSB0YXJnZXQgdGV4dCBjb2x1bW4gbXVzdCBiZSB3aWRlbmVkLlxuICAgKi9cbiAgY29sdW1uTmVlZHNXaWRlbmluZyhzb3VyY2VDb2x1bW4sIHRhcmdldENvbHVtbikge1xuICAgIGNvbnN0IHNvdXJjZVJhbmsgPSB0aGlzLnRleHRUeXBlUmFuayhzb3VyY2VDb2x1bW4uZ2V0VHlwZSgpKVxuICAgIGNvbnN0IHRhcmdldFJhbmsgPSB0aGlzLnRleHRUeXBlUmFuayh0YXJnZXRDb2x1bW4uZ2V0VHlwZSgpKVxuXG4gICAgcmV0dXJuIHNvdXJjZVJhbmsgPiAwICYmIHRhcmdldFJhbmsgPiAwICYmIHNvdXJjZVJhbmsgPiB0YXJnZXRSYW5rXG4gIH1cblxuICAvKipcbiAgICogQnVpbGRzIFRhYmxlRGF0YSBjb2x1bW4gYXJncyBmcm9tIGEgc291cmNlIGNvbHVtbiwgY29weWluZyB0eXBlLCBudWxsYWJpbGl0eSxcbiAgICogbGVuZ3RoLCBub3Rlcywgc2ltcGxlIGRlZmF1bHRzIGFuZCAoZm9yIGZ1bGwgY2xvbmVzKSBwcmltYXJ5LWtleSBmbGFnLlxuICAgKiBAcGFyYW0ge2ltcG9ydChcIi4uL2RyaXZlcnMvYmFzZS1jb2x1bW4uanNcIikuZGVmYXVsdH0gc291cmNlQ29sdW1uIC0gU291cmNlIGNvbHVtbiBkZWZpbml0aW9uLlxuICAgKiBAcGFyYW0ge3tpc05ld0NvbHVtbjogYm9vbGVhbn19IGFyZ3MgLSBXaGV0aGVyIHRoZSBjb2x1bW4gaXMgYmVpbmcgYWRkZWQgaW5zdGVhZCBvZiBjbG9uZWQgd2l0aCBpdHMgdGFibGUuXG4gICAqIEByZXR1cm5zIHtSZWNvcmQ8c3RyaW5nLCB1bmtub3duPn0gLSBBcmd1bWVudHMgZm9yIGFsdGVyaW5nIHRoZSB0YXJnZXQgY29sdW1uLlxuICAgKi9cbiAgY29sdW1uQXJnc0Zyb21Tb3VyY2VDb2x1bW4oc291cmNlQ29sdW1uLCB7aXNOZXdDb2x1bW59KSB7XG4gICAgLyoqIEB0eXBlIHt7YXV0b0luY3JlbWVudD86IGJvb2xlYW4sIGRlZmF1bHQ/OiB1bmtub3duLCBpc05ld0NvbHVtbjogYm9vbGVhbiwgbWF4TGVuZ3RoPzogbnVtYmVyLCBub3Rlcz86IHN0cmluZywgbnVsbDogYm9vbGVhbiwgcHJpbWFyeUtleT86IGJvb2xlYW4sIHR5cGU6IHN0cmluZ319ICovXG4gICAgY29uc3QgY29sdW1uQXJncyA9IHtcbiAgICAgIGlzTmV3Q29sdW1uLFxuICAgICAgbnVsbDogc291cmNlQ29sdW1uLmdldE51bGwoKSxcbiAgICAgIHR5cGU6IHRoaXMubm9ybWFsaXplZENvbHVtblR5cGUoc291cmNlQ29sdW1uLmdldFR5cGUoKSlcbiAgICB9XG4gICAgY29uc3QgZGVmYXVsdFZhbHVlID0gc291cmNlQ29sdW1uLmdldERlZmF1bHQoKVxuICAgIGNvbnN0IG1heExlbmd0aCA9IHNvdXJjZUNvbHVtbi5nZXRNYXhMZW5ndGgoKVxuICAgIGNvbnN0IG5vdGVzID0gc291cmNlQ29sdW1uLmdldE5vdGVzKClcblxuICAgIGlmICghaXNOZXdDb2x1bW4gJiYgc291cmNlQ29sdW1uLmdldFByaW1hcnlLZXkoKSkge1xuICAgICAgY29sdW1uQXJncy5wcmltYXJ5S2V5ID0gdHJ1ZVxuICAgIH1cblxuICAgIGlmIChzb3VyY2VDb2x1bW4uZ2V0QXV0b0luY3JlbWVudCgpKSB7XG4gICAgICBjb2x1bW5BcmdzLmF1dG9JbmNyZW1lbnQgPSB0cnVlXG4gICAgfVxuXG4gICAgLy8gQSBtYXhMZW5ndGggb2YgLTEgaXMgdGhlIE1TLVNRTCBcIm1heFwiIHNlbnRpbmVsIChOVkFSQ0hBUihNQVgpIC8gVkFSQklOQVJZKE1BWCksXG4gICAgLy8gYmFja2luZyBWZWxvY2lvdXMgdGV4dC9qc29uL2Jsb2IgY29sdW1ucyk7IHRoZSBjb2x1bW4gdHlwZSBkcml2ZXMgdGhlIHVuYm91bmRlZFxuICAgIC8vIFNRTCwgc28gZG9uJ3QgZm9yd2FyZCAtMSBhcyBhbiBleHBsaWNpdCBsZW5ndGggKGl0IHdvdWxkIGVtaXQgTlZBUkNIQVIoLTEpKS5cbiAgICBpZiAobWF4TGVuZ3RoICE9PSB1bmRlZmluZWQgJiYgbWF4TGVuZ3RoID49IDApIHtcbiAgICAgIGNvbHVtbkFyZ3MubWF4TGVuZ3RoID0gbWF4TGVuZ3RoXG4gICAgfVxuXG4gICAgaWYgKG5vdGVzKSB7XG4gICAgICBjb2x1bW5BcmdzLm5vdGVzID0gbm90ZXNcbiAgICB9XG5cbiAgICBpZiAoZGVmYXVsdFZhbHVlICE9PSBudWxsICYmIGRlZmF1bHRWYWx1ZSAhPT0gdW5kZWZpbmVkICYmIFNJTVBMRV9ERUZBVUxUX1BBVFRFUk4udGVzdChTdHJpbmcoZGVmYXVsdFZhbHVlKSkpIHtcbiAgICAgIGNvbHVtbkFyZ3MuZGVmYXVsdCA9IGRlZmF1bHRWYWx1ZVxuICAgIH1cblxuICAgIHJldHVybiBjb2x1bW5BcmdzXG4gIH1cbn1cbiJdfQ==
|
|
@@ -53,6 +53,15 @@ export default class VelociousEnvironmentsHandlerBrowser extends Base {
|
|
|
53
53
|
* @returns {Promise<typeof import("../database/migration/index.js").default>} - Resolves with the require migration.
|
|
54
54
|
*/
|
|
55
55
|
requireMigration: (filePath: string) => Promise<typeof import("../database/migration/index.js").default>;
|
|
56
|
+
/**
|
|
57
|
+
* Runs after migrations.
|
|
58
|
+
* @param {object} args - Options object.
|
|
59
|
+
* @param {Record<string, import("../database/drivers/base.js").default>} args.dbs - Dbs.
|
|
60
|
+
* @returns {Promise<void>} - Resolves when complete.
|
|
61
|
+
*/
|
|
62
|
+
afterMigrations({ dbs }: {
|
|
63
|
+
dbs: Record<string, import("../database/drivers/base.js").default>;
|
|
64
|
+
}): Promise<void>;
|
|
56
65
|
/**
|
|
57
66
|
* Runs sqlite structure sql.
|
|
58
67
|
* @param {object} args - Options object.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"browser.d.ts","sourceRoot":"","sources":["../../../src/environment-handlers/browser.js"],"names":[],"mappings":"AAyCA;IAgBE;;;;;OAKG;IACH,iGAHG;QAA2D,gCAAgC,UAA7E,OAAO,CAAC,4BAA4B,CAAC;QACO,+BAA+B,UAA3E,OAAO,CAAC,2BAA2B,CAAC;KACpD,EAQA;IA5BD;;wDAEoD;IACpD,kCADU,0BAA0B,GAAG,SAAS,CACJ;IAE5C;;0DAEsD;IACtD,iCADU,4BAA4B,GAAG,SAAS,CACP;IAE3C;;yDAEqD;IACrD,gCADU,2BAA2B,GAAG,SAAS,CACP;IAYxC,yCAPe,OAAO,CAAC,4BAA4B,CAAC,cAOoB;IACxE,wCAPe,OAAO,CAAC,2BAA2B,CAAC,cAOmB;IACtE,eAA8B;IAIhC;;;OAGG;IACH,4BAFa,OAAO,CAAC,4BAA4B,CAAC,CAUjD;IAED;;;OAGG;IACH,2BAFa,OAAO,CAAC,2BAA2B,CAAC,CAYhD;IAOC;;;oBAAqD;IAKvD;;;OAGG;IACH,+BAFa,0BAA0B,CAOtC;IAED;;;QAmBC;IA4HD;;;;OAIG;IACH,mBAA0B,UAHf,MAGuB,KAFrB,OAAO,CAAC,cAAc,gCAAgC,EAAE,OAAO,CAAC,CAgB5E;
|
|
1
|
+
{"version":3,"file":"browser.d.ts","sourceRoot":"","sources":["../../../src/environment-handlers/browser.js"],"names":[],"mappings":"AAyCA;IAgBE;;;;;OAKG;IACH,iGAHG;QAA2D,gCAAgC,UAA7E,OAAO,CAAC,4BAA4B,CAAC;QACO,+BAA+B,UAA3E,OAAO,CAAC,2BAA2B,CAAC;KACpD,EAQA;IA5BD;;wDAEoD;IACpD,kCADU,0BAA0B,GAAG,SAAS,CACJ;IAE5C;;0DAEsD;IACtD,iCADU,4BAA4B,GAAG,SAAS,CACP;IAE3C;;yDAEqD;IACrD,gCADU,2BAA2B,GAAG,SAAS,CACP;IAYxC,yCAPe,OAAO,CAAC,4BAA4B,CAAC,cAOoB;IACxE,wCAPe,OAAO,CAAC,2BAA2B,CAAC,cAOmB;IACtE,eAA8B;IAIhC;;;OAGG;IACH,4BAFa,OAAO,CAAC,4BAA4B,CAAC,CAUjD;IAED;;;OAGG;IACH,2BAFa,OAAO,CAAC,2BAA2B,CAAC,CAYhD;IAOC;;;oBAAqD;IAKvD;;;OAGG;IACH,+BAFa,0BAA0B,CAOtC;IAED;;;QAmBC;IA4HD;;;;OAIG;IACH,mBAA0B,UAHf,MAGuB,KAFrB,OAAO,CAAC,cAAc,gCAAgC,EAAE,OAAO,CAAC,CAgB5E;IAED;;;;;OAKG;IACH,yBAHG;QAA4E,GAAG,EAAvE,MAAM,CAAC,MAAM,EAAE,OAAO,6BAA6B,EAAE,OAAO,CAAC;KACrE,GAAU,OAAO,CAAC,IAAI,CAAC,CAQzB;IAED;;;;;OAKG;IACH,6BAHG;QAA4E,GAAG,EAAvE,MAAM,CAAC,MAAM,EAAE,OAAO,6BAA6B,EAAE,OAAO,CAAC;KACrE,GAAU,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CA2BlC;CACF;;;;qDAvUY,CAAC,EAAE,EAAE,MAAM,KAAK;IAAC,OAAO,EAAE,cAAc,gCAAgC,EAAE,OAAO,CAAA;CAAC;;;;2CAClF,sCAAsC,GAAG;IACjD,IAAI,EAAE,MAAM,MAAM,EAAE,CAAC;IACrB,EAAE,EAAE,MAAM,CAAA;CACX;;;;mDAKS,CAAC,EAAE,EAAE,MAAM,KAAK;IAAC,OAAO,EAAE,cAAc,wBAAwB,EAAE,OAAO,CAAA;CAAC;;;;yCAC1E,oCAAoC,GAAG;IAC/C,IAAI,EAAE,MAAM,MAAM,EAAE,CAAC;IACrB,EAAE,EAAE,MAAM,CAAA;CACX;;;;oDAKS,CAAC,EAAE,EAAE,MAAM,KAAK,OAAC;;;;0CACjB,qCAAqC,GAAG;IAChD,IAAI,EAAE,MAAM,MAAM,EAAE,CAAC;IACrB,EAAE,EAAE,MAAM,CAAA;CACX;iBA7Ba,WAAW;mBAGT,cAAc"}
|
|
@@ -243,7 +243,6 @@ export default class VelociousEnvironmentsHandlerBrowser extends Base {
|
|
|
243
243
|
* Runs after migrations.
|
|
244
244
|
* @param {object} args - Options object.
|
|
245
245
|
* @param {Record<string, import("../database/drivers/base.js").default>} args.dbs - Dbs.
|
|
246
|
-
* @param {"migration" | "schemaDump"} [args.reason] - Why the structure hook is running.
|
|
247
246
|
* @returns {Promise<void>} - Resolves when complete.
|
|
248
247
|
*/
|
|
249
248
|
async afterMigrations({ dbs }) {
|
|
@@ -280,4 +279,4 @@ export default class VelociousEnvironmentsHandlerBrowser extends Base {
|
|
|
280
279
|
return `${sections.join("\n\n")}\n`;
|
|
281
280
|
}
|
|
282
281
|
}
|
|
283
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYnJvd3Nlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9lbnZpcm9ubWVudC1oYW5kbGVycy9icm93c2VyLmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sSUFBSSxNQUFNLFdBQVcsQ0FBQTtBQUM1QixPQUFPLEtBQUssVUFBVSxNQUFNLFlBQVksQ0FBQTtBQUN4QyxPQUFPLGFBQWEsTUFBTSw2QkFBNkIsQ0FBQTtBQUN2RCxPQUFPLE1BQU0sTUFBTSxjQUFjLENBQUE7QUFFakM7Ozs7Ozs7R0FPRztBQUVIOzs7Ozs7O0dBT0c7QUFFSDs7Ozs7OztHQU9HO0FBRUg7Ozs7R0FJRztBQUNILFNBQVMsaUJBQWlCLENBQUMsU0FBUztJQUNsQyxPQUFPLE9BQU8sQ0FBQyxTQUFTLENBQUMsQ0FBQTtBQUMzQixDQUFDO0FBRUQsTUFBTSxDQUFDLE9BQU8sT0FBTyxtQ0FBb0MsU0FBUSxJQUFJO0lBQ25FOzt3REFFb0Q7SUFDcEQsZ0NBQWdDLEdBQUcsU0FBUyxDQUFBO0lBRTVDOzswREFFc0Q7SUFDdEQsK0JBQStCLEdBQUcsU0FBUyxDQUFBO0lBRTNDOzt5REFFcUQ7SUFDckQsOEJBQThCLEdBQUcsU0FBUyxDQUFBO0lBRTFDOzs7OztPQUtHO0lBQ0gsWUFBWSxFQUFDLGdDQUFnQyxFQUFFLCtCQUErQixFQUFFLEdBQUcsUUFBUSxFQUFDLEdBQUcsRUFBRTtRQUMvRixLQUFLLEVBQUUsQ0FBQTtRQUNQLGFBQWEsQ0FBQyxRQUFRLENBQUMsQ0FBQTtRQUV2QixJQUFJLENBQUMsZ0NBQWdDLEdBQUcsZ0NBQWdDLENBQUE7UUFDeEUsSUFBSSxDQUFDLCtCQUErQixHQUFHLCtCQUErQixDQUFBO1FBQ3RFLElBQUksQ0FBQyxNQUFNLEdBQUcsSUFBSSxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUE7SUFDaEMsQ0FBQztJQUdEOzs7T0FHRztJQUNILEtBQUssQ0FBQyx3QkFBd0I7UUFDNUIsTUFBTSxFQUFDLGdDQUFnQyxF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QyxVQUFVLENBQUMsQ0FBQTtZQUMxQixNQUFNLFlBQVksR0FBRyxPQUFPLEVBQUUsQ0FBQyxZQUFZLEtBQUssVUFBVSxDQUFDLENBQUMsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxZQUFZLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFBO1lBQzNGLE1BQU0sVUFBVSxHQUFHLFlBQVksRUFBRSxPQUFPLEVBQUUsQ0FBQTtZQUUxQyxJQUFJLENBQUMsVUFBVTtnQkFBRSxTQUFRO1lBRXpCLElBQUksaUJBQWlCLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRSxDQUFDO2dCQUNqQyxRQUFRLENBQUMsSUFBSSxDQUFDLE1BQU0sVUFBVSxFQUFFLENBQUMsQ0FBQTtZQUNuQyxDQUFDO1lBRUQsUUFBUSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQTtRQUMzQixDQUFDO1FBRUQsSUFBSSxRQUFRLENBQUMsTUFBTSxJQUFJLENBQUM7WUFBRSxPQUFPLElBQUksQ0FBQTtRQUVyQyxPQUFPLEdBQUcsUUFBUSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFBO0lBQ3JDLENBQUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBCYXNlIGZyb20gXCIuL2Jhc2UuanNcIlxuaW1wb3J0ICogYXMgaW5mbGVjdGlvbiBmcm9tIFwiaW5mbGVjdGlvblwiXG5pbXBvcnQgcmVzdEFyZ3NFcnJvciBmcm9tIFwiLi4vdXRpbHMvcmVzdC1hcmdzLWVycm9yLmpzXCJcbmltcG9ydCBMb2dnZXIgZnJvbSBcIi4uL2xvZ2dlci5qc1wiXG5cbi8qKlxuICogRGVmaW5lcyB0aGlzIHR5cGVkZWYuXG4gKiBAdHlwZWRlZiB7KGlkOiBzdHJpbmcpID0+IHtkZWZhdWx0OiB0eXBlb2YgaW1wb3J0KFwiLi4vZGF0YWJhc2UvbWlncmF0aW9uL2luZGV4LmpzXCIpLmRlZmF1bHR9fSBNaWdyYXRpb25zUmVxdWlyZUNvbnRleHRJREZ1bmN0aW9uVHlwZVxuICogQHR5cGVkZWYge01pZ3JhdGlvbnNSZXF1aXJlQ29udGV4dElERnVuY3Rpb25UeXBlICYge1xuICogICBrZXlzOiAoKSA9PiBzdHJpbmdbXSxcbiAqICAgaWQ6IHN0cmluZ1xuICogfX0gTWlncmF0aW9uc1JlcXVpcmVDb250ZXh0VHlwZVxuICovXG5cbi8qKlxuICogRGVmaW5lcyB0aGlzIHR5cGVkZWYuXG4gKiBAdHlwZWRlZiB7KGlkOiBzdHJpbmcpID0+IHtkZWZhdWx0OiB0eXBlb2YgaW1wb3J0KFwiLi4vY2xpL2Jhc2UtY29tbWFuZC5qc1wiKS5kZWZhdWx0fX0gQ29tbWFuZHNSZXF1aXJlQ29udGV4dElERnVuY3Rpb25UeXBlXG4gKiBAdHlwZWRlZiB7Q29tbWFuZHNSZXF1aXJlQ29udGV4dElERnVuY3Rpb25UeXBlICYge1xuICogICBrZXlzOiAoKSA9PiBzdHJpbmdbXSxcbiAqICAgaWQ6IHN0cmluZ1xuICogfX0gQ29tbWFuZHNSZXF1aXJlQ29udGV4dFR5cGVcbiAqL1xuXG4vKipcbiAqIFRlc3RGaWxlc1JlcXVpcmVDb250ZXh0SURGdW5jdGlvblR5cGUgdHlwZS5cbiAqIEB0eXBlZGVmIHsoaWQ6IHN0cmluZykgPT4gP30gVGVzdEZpbGVzUmVxdWlyZUNvbnRleHRJREZ1bmN0aW9uVHlwZVxuICogQHR5cGVkZWYge1Rlc3RGaWxlc1JlcXVpcmVDb250ZXh0SURGdW5jdGlvblR5cGUgJiB7XG4gKiAgIGtleXM6ICgpID0+IHN0cmluZ1tdLFxuICogICBpZDogc3RyaW5nXG4gKiB9fSBUZXN0RmlsZXNSZXF1aXJlQ29udGV4dFR5cGVcbiAqL1xuXG4vKipcbiAqIFJ1bnMgaXMgbWlncmF0aW9uIG9iamVjdC5cbiAqIEBwYXJhbSB7aW1wb3J0KFwiLi9iYXNlLmpzXCIpLk1pZ3JhdGlvbk9iamVjdFR5cGUgfCBudWxsfSBtaWdyYXRpb24gLSBDYW5kaWRhdGUgbWlncmF0aW9uIG9iamVjdC5cbiAqIEByZXR1cm5zIHttaWdyYXRpb24gaXMgaW1wb3J0KFwiLi9iYXNlLmpzXCIpLk1pZ3JhdGlvbk9iamVjdFR5cGV9IC0gV2hldGhlciBtaWdyYXRpb24gZXhpc3RzLlxuICovXG5mdW5jdGlvbiBpc01pZ3JhdGlvbk9iamVjdChtaWdyYXRpb24pIHtcbiAgcmV0dXJuIEJvb2xlYW4obWlncmF0aW9uKVxufVxuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBWZWxvY2lvdXNFbnZpcm9ubWVudHNIYW5kbGVyQnJvd3NlciBleHRlbmRzIEJhc2Uge1xuICAvKipcbiAgICogRmluZCBjb21tYW5kcyByZXF1aXJlIGNvbnRleHQgcmVzdWx0LlxuICAgKiBAdHlwZSB7Q29tbWFuZHNSZXF1aXJlQ29udGV4dFR5cGUgfCB1bmRlZmluZWR9ICovXG4gIGZpbmRDb21tYW5kc1JlcXVpcmVDb250ZXh0UmVzdWx0ID0gdW5kZWZpbmVkXG5cbiAgLyoqXG4gICAqIE1pZ3JhdGlvbnMgcmVxdWlyZSBjb250ZXh0IHJlc3VsdC5cbiAgICogQHR5cGUge01pZ3JhdGlvbnNSZXF1aXJlQ29udGV4dFR5cGUgfCB1bmRlZmluZWR9ICovXG4gIF9taWdyYXRpb25zUmVxdWlyZUNvbnRleHRSZXN1bHQgPSB1bmRlZmluZWRcblxuICAvKipcbiAgICogVGVzdCBmaWxlcyByZXF1aXJlIGNvbnRleHQgcmVzdWx0LlxuICAgKiBAdHlwZSB7VGVzdEZpbGVzUmVxdWlyZUNvbnRleHRUeXBlIHwgdW5kZWZpbmVkfSAqL1xuICBfdGVzdEZpbGVzUmVxdWlyZUNvbnRleHRSZXN1bHQgPSB1bmRlZmluZWRcblxuICAvKipcbiAgICogUnVucyBjb25zdHJ1Y3Rvci5cbiAgICogQHBhcmFtIHtvYmplY3R9IGFyZ3MgLSBPcHRpb25zIG9iamVjdC5cbiAgICogQHBhcmFtIHsoKSA9PiBQcm9taXNlPE1pZ3JhdGlvbnNSZXF1aXJlQ29udGV4dFR5cGU+fSBbYXJncy5taWdyYXRpb25zUmVxdWlyZUNvbnRleHRDYWxsYmFja10gLSBNaWdyYXRpb25zIHJlcXVpcmUgY29udGV4dCBjYWxsYmFjay5cbiAgICogQHBhcmFtIHsoKSA9PiBQcm9taXNlPFRlc3RGaWxlc1JlcXVpcmVDb250ZXh0VHlwZT59IFthcmdzLnRlc3RGaWxlc1JlcXVpcmVDb250ZXh0Q2FsbGJhY2tdIC0gVGVzdCBmaWxlcyByZXF1aXJlIGNvbnRleHQgY2FsbGJhY2suXG4gICAqL1xuICBjb25zdHJ1Y3Rvcih7bWlncmF0aW9uc1JlcXVpcmVDb250ZXh0Q2FsbGJhY2ssIHRlc3RGaWxlc1JlcXVpcmVDb250ZXh0Q2FsbGJhY2ssIC4uLnJlc3RBcmdzfSA9IHt9KSB7XG4gICAgc3VwZXIoKVxuICAgIHJlc3RBcmdzRXJyb3IocmVzdEFyZ3MpXG5cbiAgICB0aGlzLm1pZ3JhdGlvbnNSZXF1aXJlQ29udGV4dENhbGxiYWNrID0gbWlncmF0aW9uc1JlcXVpcmVDb250ZXh0Q2FsbGJhY2tcbiAgICB0aGlzLnRlc3RGaWxlc1JlcXVpcmVDb250ZXh0Q2FsbGJhY2sgPSB0ZXN0RmlsZXNSZXF1aXJlQ29udGV4dENhbGxiYWNrXG4gICAgdGhpcy5sb2dnZXIgPSBuZXcgTG9nZ2VyKHRoaXMpXG4gIH1cblxuXG4gIC8qKlxuICAgKiBSdW5zIG1pZ3JhdGlvbnMgcmVxdWlyZSBjb250ZXh0LlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxNaWdyYXRpb25zUmVxdWlyZUNvbnRleHRUeXBlPn0gLSBSZXNvbHZlcyB3aXRoIHRoZSBtaWdyYXRpb25zIHJlcXVpcmUgY29udGV4dC5cbiAgICovXG4gIGFzeW5jIG1pZ3JhdGlvbnNSZXF1aXJlQ29udGV4dCgpIHtcbiAgICBjb25zdCB7bWlncmF0aW9uc1JlcXVpcmVDb250ZXh0Q2FsbGJhY2t9ID0gdGhpc1xuXG4gICAgaWYgKCFtaWdyYXRpb25zUmVxdWlyZUNvbnRleHRDYWxsYmFjaykgdGhyb3cgbmV3IEVycm9yKFwibWlncmF0aW9uc1JlcXVpcmVDb250ZXh0Q2FsbGJhY2sgaXMgcmVxdWlyZWRcIilcblxuICAgIHRoaXMuX21pZ3JhdGlvbnNSZXF1aXJlQ29udGV4dFJlc3VsdCB8fD0gYXdhaXQgbWlncmF0aW9uc1JlcXVpcmVDb250ZXh0Q2FsbGJhY2soKVxuXG4gICAgcmV0dXJuIHRoaXMuX21pZ3JhdGlvbnNSZXF1aXJlQ29udGV4dFJlc3VsdFxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgdGVzdCBmaWxlcyByZXF1aXJlIGNvbnRleHQuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPFRlc3RGaWxlc1JlcXVpcmVDb250ZXh0VHlwZT59IC0gUmVzb2x2ZXMgd2l0aCB0aGUgdGVzdCBmaWxlcyByZXF1aXJlIGNvbnRleHQuXG4gICAqL1xuICBhc3luYyB0ZXN0RmlsZXNSZXF1aXJlQ29udGV4dCgpIHtcbiAgICBjb25zdCB7dGVzdEZpbGVzUmVxdWlyZUNvbnRleHRDYWxsYmFja30gPSB0aGlzXG5cbiAgICBpZiAoIXRlc3RGaWxlc1JlcXVpcmVDb250ZXh0Q2FsbGJhY2spIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcInRlc3RGaWxlc1JlcXVpcmVDb250ZXh0Q2FsbGJhY2sgaXMgcmVxdWlyZWQgd2hlbiBydW5uaW5nIGJyb3dzZXIgdGVzdHNcIilcbiAgICB9XG5cbiAgICB0aGlzLl90ZXN0RmlsZXNSZXF1aXJlQ29udGV4dFJlc3VsdCB8fD0gYXdhaXQgdGVzdEZpbGVzUmVxdWlyZUNvbnRleHRDYWxsYmFjaygpXG5cbiAgICByZXR1cm4gdGhpcy5fdGVzdEZpbGVzUmVxdWlyZUNvbnRleHRSZXN1bHRcbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIGZpbmQgY29tbWFuZHMuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPEFycmF5PGltcG9ydChcIi4vYmFzZS5qc1wiKS5Db21tYW5kRmlsZU9iamVjdFR5cGU+Pn0gLSBSZXNvbHZlcyB3aXRoIHRoZSBjb21tYW5kcy5cbiAgICovXG4gIGFzeW5jIGZpbmRDb21tYW5kcygpIHtcbiAgICB0aGlzLl9maW5kQ29tbWFuZHNSZXN1bHQgPSB0aGlzLl9hY3R1YWxGaW5kQ29tbWFuZHMoKVxuXG4gICAgcmV0dXJuIHRoaXMuX2ZpbmRDb21tYW5kc1Jlc3VsdFxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgZmluZCBjb21tYW5kcyByZXF1aXJlIGNvbnRleHQuXG4gICAqIEByZXR1cm5zIHtDb21tYW5kc1JlcXVpcmVDb250ZXh0VHlwZX0gLSBUaGUgY29tbWFuZHMgcmVxdWlyZSBjb250ZXh0LlxuICAgKi9cbiAgX2ZpbmRDb21tYW5kc1JlcXVpcmVDb250ZXh0KCkge1xuICAgIC8vIEB0cy1leHBlY3QtZXJyb3JcbiAgICB0aGlzLmZpbmRDb21tYW5kc1JlcXVpcmVDb250ZXh0UmVzdWx0IHx8PSAvKiogQHR5cGUge0NvbW1hbmRzUmVxdWlyZUNvbnRleHRUeXBlfSAqLyAocmVxdWlyZS5jb250ZXh0KFwiLi4vY2xpL2NvbW1hbmRzXCIsIHRydWUsIC9cXC5qcyQvKSlcblxuICAgIHJldHVybiB0aGlzLmZpbmRDb21tYW5kc1JlcXVpcmVDb250ZXh0UmVzdWx0XG4gIH1cblxuICBfYWN0dWFsRmluZENvbW1hbmRzKCkge1xuICAgIGNvbnN0IGNvbW1hbmRGaWxlcyA9IHRoaXMuX2ZpbmRDb21tYW5kc1JlcXVpcmVDb250ZXh0KClcbiAgICBjb25zdCBjb21tYW5kcyA9IFtdXG5cbiAgICBmb3IgKGNvbnN0IGFGaWxlUGF0aCBvZiBjb21tYW5kRmlsZXMua2V5cygpKSB7XG4gICAgICBjb25zdCBhRmlsZVBhdGhQYXJ0cyA9IGFGaWxlUGF0aC5zcGxpdChcIi9cIilcbiAgICAgIGNvbnN0IGxhc3RQYXJ0ID0gYUZpbGVQYXRoUGFydHNbYUZpbGVQYXRoUGFydHMubGVuZ3RoIC0gMV1cbiAgICAgIGxldCBuYW1lXG5cbiAgICAgIGlmIChsYXN0UGFydCA9PSBcImluZGV4LmpzXCIpIHtcbiAgICAgICAgbmFtZSA9IGFGaWxlUGF0aFBhcnRzW2FGaWxlUGF0aFBhcnRzLmxlbmd0aCAtIDJdXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBuYW1lID0gbGFzdFBhcnQucmVwbGFjZShcIi5qc1wiLCBcIlwiKVxuICAgICAgfVxuXG4gICAgICBjb21tYW5kcy5wdXNoKHtuYW1lLCBmaWxlOiBhRmlsZVBhdGh9KVxuICAgIH1cblxuICAgIHJldHVybiBjb21tYW5kc1xuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgcmVxdWlyZSBjb21tYW5kLlxuICAgKiBAcGFyYW0ge29iamVjdH0gYXJncyAtIE9wdGlvbnMgb2JqZWN0LlxuICAgKiBAcGFyYW0ge0FycmF5PHN0cmluZz59IGFyZ3MuY29tbWFuZFBhcnRzIC0gQ29tbWFuZCBwYXJ0cy5cbiAgICogQHJldHVybnMge1Byb21pc2U8dHlwZW9mIGltcG9ydChcIi4uL2NsaS9iYXNlLWNvbW1hbmQuanNcIikuZGVmYXVsdD59IC0gUmVzb2x2ZXMgd2l0aCB0aGUgcmVxdWlyZSBjb21tYW5kLlxuICAgKi9cbiAgYXN5bmMgcmVxdWlyZUNvbW1hbmQoe2NvbW1hbmRQYXJ0c30pIHtcbiAgICBsZXQgZmlsZVBhdGggPSBcIi5cIlxuXG4gICAgZm9yIChsZXQgY29tbWFuZFBhcnQgb2YgY29tbWFuZFBhcnRzKSB7XG4gICAgICBpZiAoY29tbWFuZFBhcnQgPT0gXCJjXCIpIGNvbW1hbmRQYXJ0ID0gXCJjb25zb2xlXCJcbiAgICAgIGlmIChjb21tYW5kUGFydCA9PSBcImRcIikgY29tbWFuZFBhcnQgPSBcImRlc3Ryb3lcIlxuICAgICAgaWYgKGNvbW1hbmRQYXJ0ID09IFwiZ1wiKSBjb21tYW5kUGFydCA9IFwiZ2VuZXJhdGVcIlxuICAgICAgaWYgKGNvbW1hbmRQYXJ0ID09IFwic1wiKSBjb21tYW5kUGFydCA9IFwic2VydmVyXCJcblxuICAgICAgZmlsZVBhdGggKz0gYC8ke2NvbW1hbmRQYXJ0fWBcbiAgICB9XG5cbiAgICBjb25zdCBmaWxlUGF0aHMgPSBbXVxuXG4gICAgZmlsZVBhdGhzLnB1c2goYCR7ZmlsZVBhdGh9L2luZGV4LmpzYClcbiAgICBmaWxlUGF0aCArPSBcIi5qc1wiXG4gICAgZmlsZVBhdGhzLnB1c2goZmlsZVBhdGgpXG5cbiAgICBjb25zdCBjb21tYW5kc1JlcXVpcmVDb250ZXh0ID0gYXdhaXQgdGhpcy5fZmluZENvbW1hbmRzUmVxdWlyZUNvbnRleHQoKVxuICAgIGxldCBjb21tYW5kQ2xhc3NJbXBvcnRcblxuICAgIGZvciAoY29uc3QgYUZpbGVQYXRoIG9mIGZpbGVQYXRocykge1xuICAgICAgY29tbWFuZENsYXNzSW1wb3J0ID0gY29tbWFuZHNSZXF1aXJlQ29udGV4dChhRmlsZVBhdGgpXG5cbiAgICAgIGlmIChjb21tYW5kQ2xhc3NJbXBvcnQpIHtcbiAgICAgICAgYnJlYWtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoIWNvbW1hbmRDbGFzc0ltcG9ydCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBVbmtub3duIGNvbW1hbmQ6ICR7Y29tbWFuZFBhcnRzLmpvaW4oXCI6XCIpfS4gUG9zc2libGUgY29tbWFuZHM6ICR7Y29tbWFuZHNSZXF1aXJlQ29udGV4dC5rZXlzKCl9YClcbiAgICB9XG5cbiAgICBjb25zdCBDb21tYW5kQ2xhc3MgPSBjb21tYW5kQ2xhc3NJbXBvcnQuZGVmYXVsdFxuXG4gICAgcmV0dXJuIENvbW1hbmRDbGFzc1xuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgZmluZCBtaWdyYXRpb25zLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxBcnJheTxpbXBvcnQoXCIuL2Jhc2UuanNcIikuTWlncmF0aW9uT2JqZWN0VHlwZT4+fSAtIFJlc29sdmVzIHdpdGggdGhlIG1pZ3JhdGlvbnMuXG4gICAqL1xuICBhc3luYyBmaW5kTWlncmF0aW9ucygpIHtcbiAgICBjb25zdCBtaWdyYXRpb25zUmVxdWlyZUNvbnRleHQgPSBhd2FpdCB0aGlzLm1pZ3JhdGlvbnNSZXF1aXJlQ29udGV4dCgpXG4gICAgLyoqXG4gICAgICogTWlncmF0aW9ucy5cbiAgICAgKiBAdHlwZSB7QXJyYXk8aW1wb3J0KFwiLi9iYXNlLmpzXCIpLk1pZ3JhdGlvbk9iamVjdFR5cGUgfCBudWxsPn0gKi9cbiAgICBjb25zdCBtaWdyYXRpb25zID0gbWlncmF0aW9uc1JlcXVpcmVDb250ZXh0XG4gICAgICAua2V5cygpXG4gICAgICAubWFwKChmaWxlKSA9PiB7XG4gICAgICAgIC8vIFwiMTMsMTRcIiBiZWNhdXNlIHNvbWVzIFwicmVxdWlyZS1jb250ZXh0XCItbnBtLW1vZHVsZSBkZWxldGVzIGZpcnN0IGNoYXJhY3RlciE/XG4gICAgICAgIGNvbnN0IG1hdGNoID0gZmlsZS5tYXRjaCgvKFxcZHsxMywxNH0pLSguKylcXC5qcyQvKVxuXG4gICAgICAgIGlmICghbWF0Y2gpIHJldHVybiBudWxsXG5cbiAgICAgICAgLy8gRml4IHJlcXVpcmUtY29udGV4dC1ucG0tbW9kdWxlIGRlbGV0ZXMgZmlyc3QgY2hhcmFjdGVyXG4gICAgICAgIGxldCBmaWxlTmFtZSA9IGZpbGVcbiAgICAgICAgbGV0IGRhdGVOdW1iZXIgPSBtYXRjaFsxXVxuXG4gICAgICAgIGlmIChkYXRlTnVtYmVyLmxlbmd0aCA9PSAxMykge1xuICAgICAgICAgIGRhdGVOdW1iZXIgPSBgMiR7ZGF0ZU51bWJlcn1gXG4gICAgICAgICAgZmlsZU5hbWUgPSBgMiR7ZmlsZU5hbWV9YFxuICAgICAgICB9XG5cbiAgICAgICAgLy8gUGFyc2UgcmVnZXhcbiAgICAgICAgY29uc3QgZGF0ZSA9IHBhcnNlSW50KGRhdGVOdW1iZXIpXG4gICAgICAgIGNvbnN0IG1pZ3JhdGlvbk5hbWUgPSBtYXRjaFsyXVxuICAgICAgICBjb25zdCBtaWdyYXRpb25DbGFzc05hbWUgPSBpbmZsZWN0aW9uLmNhbWVsaXplKG1pZ3JhdGlvbk5hbWUucmVwbGFjZUFsbChcIi1cIiwgXCJfXCIpKVxuXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgZmlsZTogZmlsZU5hbWUsXG4gICAgICAgICAgZnVsbFBhdGg6IGZpbGUsXG4gICAgICAgICAgZGF0ZSxcbiAgICAgICAgICBtaWdyYXRpb25DbGFzc05hbWVcbiAgICAgICAgfVxuICAgICAgfSlcbiAgICAgIC5maWx0ZXIoaXNNaWdyYXRpb25PYmplY3QpXG4gICAgLyoqXG4gICAgICogRmlsZXMuXG4gICAgICogQHR5cGUge2ltcG9ydChcIi4vYmFzZS5qc1wiKS5NaWdyYXRpb25PYmplY3RUeXBlW119ICovXG4gICAgY29uc3QgZmlsZXMgPSAvKiogQHR5cGUge2ltcG9ydChcIi4vYmFzZS5qc1wiKS5NaWdyYXRpb25PYmplY3RUeXBlW119ICovIChtaWdyYXRpb25zKVxuXG4gICAgZmlsZXMuc29ydCgobWlncmF0aW9uMSwgbWlncmF0aW9uMikgPT4gbWlncmF0aW9uMS5kYXRlIC0gbWlncmF0aW9uMi5kYXRlKVxuXG4gICAgcmV0dXJuIGZpbGVzXG4gIH1cblxuICAvKipcbiAgICogUnVucyBpbXBvcnQgdGVzdCBmaWxlcy5cbiAgICogQHBhcmFtIHtzdHJpbmdbXX0gdGVzdEZpbGVzIC0gVGVzdCBmaWxlcy5cbiAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59IC0gUmVzb2x2ZXMgd2hlbiBjb21wbGV0ZS5cbiAgICovXG4gIGFzeW5jIGltcG9ydFRlc3RGaWxlcyh0ZXN0RmlsZXMpIHtcbiAgICBjb25zdCB0ZXN0RmlsZXNSZXF1aXJlQ29udGV4dCA9IGF3YWl0IHRoaXMudGVzdEZpbGVzUmVxdWlyZUNvbnRleHQoKVxuICAgIGNvbnN0IHJlcXVpcmVLZXlzID0gdGVzdEZpbGVzUmVxdWlyZUNvbnRleHQua2V5cygpXG4gICAgY29uc3Qgbm9ybWFsaXplZEtleXMgPSByZXF1aXJlS2V5cy5tYXAoKGtleSkgPT4gKHtcbiAgICAgIGtleSxcbiAgICAgIG5vcm1hbGl6ZWQ6IGtleS5yZXBsYWNlKC9cXFxcL2csIFwiL1wiKS5yZXBsYWNlKC9eXFwuXFwvLywgXCJcIilcbiAgICB9KSlcblxuICAgIGZvciAoY29uc3QgdGVzdEZpbGUgb2YgdGVzdEZpbGVzKSB7XG4gICAgICBjb25zdCBub3JtYWxpemVkRmlsZSA9IHRlc3RGaWxlLnJlcGxhY2UoL1xcXFwvZywgXCIvXCIpXG4gICAgICBjb25zdCBtYXRjaGVkS2V5ID0gbm9ybWFsaXplZEtleXMuZmluZCgoZW50cnkpID0+IG5vcm1hbGl6ZWRGaWxlLmVuZHNXaXRoKGVudHJ5Lm5vcm1hbGl6ZWQpKT8ua2V5XG5cbiAgICAgIGlmICghbWF0Y2hlZEtleSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFRlc3QgZmlsZSAke3Rlc3RGaWxlfSB3YXMgbm90IGZvdW5kIGluIHRoZSBwcm92aWRlZCByZXF1aXJlIGNvbnRleHRgKVxuICAgICAgfVxuXG4gICAgICBjb25zdCBpbXBvcnRlZCA9IHRlc3RGaWxlc1JlcXVpcmVDb250ZXh0KG1hdGNoZWRLZXkpXG5cbiAgICAgIGlmIChpbXBvcnRlZCAmJiB0eXBlb2YgaW1wb3J0ZWQgPT0gXCJvYmplY3RcIiAmJiBcInRoZW5cIiBpbiBpbXBvcnRlZCAmJiB0eXBlb2YgaW1wb3J0ZWQudGhlbiA9PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgYXdhaXQgaW1wb3J0ZWRcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUmVxdWlyZSBtaWdyYXRpb24uXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBmaWxlUGF0aCAtIEZpbGUgcGF0aC5cbiAgICogQHJldHVybnMge1Byb21pc2U8dHlwZW9mIGltcG9ydChcIi4uL2RhdGFiYXNlL21pZ3JhdGlvbi9pbmRleC5qc1wiKS5kZWZhdWx0Pn0gLSBSZXNvbHZlcyB3aXRoIHRoZSByZXF1aXJlIG1pZ3JhdGlvbi5cbiAgICovXG4gIHJlcXVpcmVNaWdyYXRpb24gPSBhc3luYyAoZmlsZVBhdGgpID0+IHtcbiAgICBpZiAoIWZpbGVQYXRoKSB0aHJvdyBuZXcgRXJyb3IoXCJmaWxlUGF0aCBpcyByZXF1aXJlZFwiKVxuXG4gICAgY29uc3QgbWlncmF0aW9uc1JlcXVpcmVDb250ZXh0ID0gYXdhaXQgdGhpcy5taWdyYXRpb25zUmVxdWlyZUNvbnRleHQoKVxuICAgIGNvbnN0IG1pZ3JhdGlvbkltcG9ydCA9IG1pZ3JhdGlvbnNSZXF1aXJlQ29udGV4dChmaWxlUGF0aClcblxuICAgIGlmICghbWlncmF0aW9uSW1wb3J0KSB0aHJvdyBuZXcgRXJyb3IoYE1pZ3JhdGlvbiBmaWxlICR7ZmlsZVBhdGh9IG5vdCBmb3VuZGApXG5cbiAgICBjb25zdCBtaWdyYXRpb25JbXBvcnREZWZhdWx0ID0gbWlncmF0aW9uSW1wb3J0LmRlZmF1bHRcblxuICAgIGlmICghbWlncmF0aW9uSW1wb3J0RGVmYXVsdCkgdGhyb3cgbmV3IEVycm9yKFwiTWlncmF0aW9uIGZpbGUgbXVzdCBleHBvcnQgYSBkZWZhdWx0IG1pZ3JhdGlvbiBjbGFzc1wiKVxuICAgIGlmICh0eXBlb2YgbWlncmF0aW9uSW1wb3J0RGVmYXVsdCAhPT0gXCJmdW5jdGlvblwiKSB0aHJvdyBuZXcgRXJyb3IoXCJNaWdyYXRpb24gZGVmYXVsdCBleHBvcnQgaXNuJ3QgYSBmdW5jdGlvbiAoc2hvdWxkIGJlIGEgY2xhc3Mgd2hpY2ggaXMgYSBmdW5jdGlvbiBpbiBKUylcIilcblxuICAgIHJldHVybiBtaWdyYXRpb25JbXBvcnREZWZhdWx0XG4gIH1cblxuICAvKipcbiAgICogUnVucyBhZnRlciBtaWdyYXRpb25zLlxuICAgKiBAcGFyYW0ge29iamVjdH0gYXJncyAtIE9wdGlvbnMgb2JqZWN0LlxuICAgKiBAcGFyYW0ge1JlY29yZDxzdHJpbmcsIGltcG9ydChcIi4uL2RhdGFiYXNlL2RyaXZlcnMvYmFzZS5qc1wiKS5kZWZhdWx0Pn0gYXJncy5kYnMgLSBEYnMuXG4gICAqIEBwYXJhbSB7XCJtaWdyYXRpb25cIiB8IFwic2NoZW1hRHVtcFwifSBbYXJncy5yZWFzb25dIC0gV2h5IHRoZSBzdHJ1Y3R1cmUgaG9vayBpcyBydW5uaW5nLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn0gLSBSZXNvbHZlcyB3aGVuIGNvbXBsZXRlLlxuICAgKi9cbiAgYXN5bmMgYWZ0ZXJNaWdyYXRpb25zKHtkYnN9KSB7XG4gICAgY29uc3Qgc3RydWN0dXJlU3FsID0gYXdhaXQgdGhpcy5fc3FsaXRlU3RydWN0dXJlU3FsKHtkYnN9KVxuXG4gICAgaWYgKCFzdHJ1Y3R1cmVTcWwpIHJldHVyblxuXG4gICAgYXdhaXQgdGhpcy5sb2dnZXIuZGVidWcoKCkgPT4gW1wic3RydWN0dXJlLnNxbDpcIiwgc3RydWN0dXJlU3FsXSlcbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIHNxbGl0ZSBzdHJ1Y3R1cmUgc3FsLlxuICAgKiBAcGFyYW0ge29iamVjdH0gYXJncyAtIE9wdGlvbnMgb2JqZWN0LlxuICAgKiBAcGFyYW0ge1JlY29yZDxzdHJpbmcsIGltcG9ydChcIi4uL2RhdGFiYXNlL2RyaXZlcnMvYmFzZS5qc1wiKS5kZWZhdWx0Pn0gYXJncy5kYnMgLSBEYnMuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHN0cmluZyB8IG51bGw+fSAtIFJlc29sdmVzIHdpdGggU1FMIHN0cmluZy5cbiAgICovXG4gIGFzeW5jIF9zcWxpdGVTdHJ1Y3R1cmVTcWwoe2Ric30pIHtcbiAgICBjb25zdCBzcWxpdGVJZGVudGlmaWVycyA9IE9iamVjdC5rZXlzKGRicylcbiAgICAgIC5maWx0ZXIoKGlkZW50aWZpZXIpID0+IHRoaXMuZ2V0Q29uZmlndXJhdGlvbigpLmdldERhdGFiYXNlVHlwZShpZGVudGlmaWVyKSA9PSBcInNxbGl0ZVwiKVxuXG4gICAgaWYgKHNxbGl0ZUlkZW50aWZpZXJzLmxlbmd0aCA9PSAwKSByZXR1cm4gbnVsbFxuXG4gICAgY29uc3Qgc2VjdGlvbnMgPSBbXVxuXG4gICAgZm9yIChjb25zdCBpZGVudGlmaWVyIG9mIHNxbGl0ZUlkZW50aWZpZXJzKSB7XG4gICAgICBjb25zdCBkYiA9IGRic1tpZGVudGlmaWVyXVxuICAgICAgY29uc3Qgc3RydWN0dXJlU3FsID0gdHlwZW9mIGRiLnN0cnVjdHVyZVNxbCA9PT0gXCJmdW5jdGlvblwiID8gYXdhaXQgZGIuc3RydWN0dXJlU3FsKCkgOiBudWxsXG4gICAgICBjb25zdCB0cmltbWVkU3FsID0gc3RydWN0dXJlU3FsPy50cmltRW5kKClcblxuICAgICAgaWYgKCF0cmltbWVkU3FsKSBjb250aW51ZVxuXG4gICAgICBpZiAoc3FsaXRlSWRlbnRpZmllcnMubGVuZ3RoID4gMSkge1xuICAgICAgICBzZWN0aW9ucy5wdXNoKGAtLSAke2lkZW50aWZpZXJ9YClcbiAgICAgIH1cblxuICAgICAgc2VjdGlvbnMucHVzaCh0cmltbWVkU3FsKVxuICAgIH1cblxuICAgIGlmIChzZWN0aW9ucy5sZW5ndGggPT0gMCkgcmV0dXJuIG51bGxcblxuICAgIHJldHVybiBgJHtzZWN0aW9ucy5qb2luKFwiXFxuXFxuXCIpfVxcbmBcbiAgfVxufVxuIl19
|
|
282
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYnJvd3Nlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9lbnZpcm9ubWVudC1oYW5kbGVycy9icm93c2VyLmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sSUFBSSxNQUFNLFdBQVcsQ0FBQTtBQUM1QixPQUFPLEtBQUssVUFBVSxNQUFNLFlBQVksQ0FBQTtBQUN4QyxPQUFPLGFBQWEsTUFBTSw2QkFBNkIsQ0FBQTtBQUN2RCxPQUFPLE1BQU0sTUFBTSxjQUFjLENBQUE7QUFFakM7Ozs7Ozs7R0FPRztBQUVIOzs7Ozs7O0dBT0c7QUFFSDs7Ozs7OztHQU9HO0FBRUg7Ozs7R0FJRztBQUNILFNBQVMsaUJBQWlCLENBQUMsU0FBUztJQUNsQyxPQUFPLE9BQU8sQ0FBQyxTQUFTLENBQUMsQ0FBQTtBQUMzQixDQUFDO0FBRUQsTUFBTSxDQUFDLE9BQU8sT0FBTyxtQ0FBb0MsU0FBUSxJQUFJO0lBQ25FOzt3REFFb0Q7SUFDcEQsZ0NBQWdDLEdBQUcsU0FBUyxDQUFBO0lBRTVDOzswREFFc0Q7SUFDdEQsK0JBQStCLEdBQUcsU0FBUyxDQUFBO0lBRTNDOzt5REFFcUQ7SUFDckQsOEJBQThCLEdBQUcsU0FBUyxDQUFBO0lBRTFDOzs7OztPQUtHO0lBQ0gsWUFBWSxFQUFDLGdDQUFnQyxFQUFFLCtCQUErQixFQUFFLEdBQUcsUUFBUSxFQUFDLEdBQUcsRUFBRTtRQUMvRixLQUFLLEVBQUUsQ0FBQTtRQUNQLGFBQWEsQ0FBQyxRQUFRLENBQUMsQ0FBQTtRQUV2QixJQUFJLENBQUMsZ0NBQWdDLEdBQUcsZ0NBQWdDLENBQUE7UUFDeEUsSUFBSSxDQUFDLCtCQUErQixHQUFHLCtCQUErQixDQUFBO1FBQ3RFLElBQUksQ0FBQyxNQUFNLEdBQUcsSUFBSSxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUE7SUFDaEMsQ0FBQztJQUdEOzs7T0FHRztJQUNILEtBQUssQ0FBQyx3QkFBd0I7UUFDNUIsTUFBTSxFQUFDLGdDQUFnQyxF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LFVBQVUsQ0FBQyxDQUFBO1lBQzFCLE1BQU0sWUFBWSxHQUFHLE9BQU8sRUFBRSxDQUFDLFlBQVksS0FBSyxVQUFVLENBQUMsQ0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFDLFlBQVksRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUE7WUFDM0YsTUFBTSxVQUFVLEdBQUcsWUFBWSxFQUFFLE9BQU8sRUFBRSxDQUFBO1lBRTFDLElBQUksQ0FBQyxVQUFVO2dCQUFFLFNBQVE7WUFFekIsSUFBSSxpQkFBaUIsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFLENBQUM7Z0JBQ2pDLFFBQVEsQ0FBQyxJQUFJLENBQUMsTUFBTSxVQUFVLEVBQUUsQ0FBQyxDQUFBO1lBQ25DLENBQUM7WUFFRCxRQUFRLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFBO1FBQzNCLENBQUM7UUFFRCxJQUFJLFFBQVEsQ0FBQyxNQUFNLElBQUksQ0FBQztZQUFFLE9BQU8sSUFBSSxDQUFBO1FBRXJDLE9BQU8sR0FBRyxRQUFRLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUE7SUFDckMsQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IEJhc2UgZnJvbSBcIi4vYmFzZS5qc1wiXG5pbXBvcnQgKiBhcyBpbmZsZWN0aW9uIGZyb20gXCJpbmZsZWN0aW9uXCJcbmltcG9ydCByZXN0QXJnc0Vycm9yIGZyb20gXCIuLi91dGlscy9yZXN0LWFyZ3MtZXJyb3IuanNcIlxuaW1wb3J0IExvZ2dlciBmcm9tIFwiLi4vbG9nZ2VyLmpzXCJcblxuLyoqXG4gKiBEZWZpbmVzIHRoaXMgdHlwZWRlZi5cbiAqIEB0eXBlZGVmIHsoaWQ6IHN0cmluZykgPT4ge2RlZmF1bHQ6IHR5cGVvZiBpbXBvcnQoXCIuLi9kYXRhYmFzZS9taWdyYXRpb24vaW5kZXguanNcIikuZGVmYXVsdH19IE1pZ3JhdGlvbnNSZXF1aXJlQ29udGV4dElERnVuY3Rpb25UeXBlXG4gKiBAdHlwZWRlZiB7TWlncmF0aW9uc1JlcXVpcmVDb250ZXh0SURGdW5jdGlvblR5cGUgJiB7XG4gKiAgIGtleXM6ICgpID0+IHN0cmluZ1tdLFxuICogICBpZDogc3RyaW5nXG4gKiB9fSBNaWdyYXRpb25zUmVxdWlyZUNvbnRleHRUeXBlXG4gKi9cblxuLyoqXG4gKiBEZWZpbmVzIHRoaXMgdHlwZWRlZi5cbiAqIEB0eXBlZGVmIHsoaWQ6IHN0cmluZykgPT4ge2RlZmF1bHQ6IHR5cGVvZiBpbXBvcnQoXCIuLi9jbGkvYmFzZS1jb21tYW5kLmpzXCIpLmRlZmF1bHR9fSBDb21tYW5kc1JlcXVpcmVDb250ZXh0SURGdW5jdGlvblR5cGVcbiAqIEB0eXBlZGVmIHtDb21tYW5kc1JlcXVpcmVDb250ZXh0SURGdW5jdGlvblR5cGUgJiB7XG4gKiAgIGtleXM6ICgpID0+IHN0cmluZ1tdLFxuICogICBpZDogc3RyaW5nXG4gKiB9fSBDb21tYW5kc1JlcXVpcmVDb250ZXh0VHlwZVxuICovXG5cbi8qKlxuICogVGVzdEZpbGVzUmVxdWlyZUNvbnRleHRJREZ1bmN0aW9uVHlwZSB0eXBlLlxuICogQHR5cGVkZWYgeyhpZDogc3RyaW5nKSA9PiA/fSBUZXN0RmlsZXNSZXF1aXJlQ29udGV4dElERnVuY3Rpb25UeXBlXG4gKiBAdHlwZWRlZiB7VGVzdEZpbGVzUmVxdWlyZUNvbnRleHRJREZ1bmN0aW9uVHlwZSAmIHtcbiAqICAga2V5czogKCkgPT4gc3RyaW5nW10sXG4gKiAgIGlkOiBzdHJpbmdcbiAqIH19IFRlc3RGaWxlc1JlcXVpcmVDb250ZXh0VHlwZVxuICovXG5cbi8qKlxuICogUnVucyBpcyBtaWdyYXRpb24gb2JqZWN0LlxuICogQHBhcmFtIHtpbXBvcnQoXCIuL2Jhc2UuanNcIikuTWlncmF0aW9uT2JqZWN0VHlwZSB8IG51bGx9IG1pZ3JhdGlvbiAtIENhbmRpZGF0ZSBtaWdyYXRpb24gb2JqZWN0LlxuICogQHJldHVybnMge21pZ3JhdGlvbiBpcyBpbXBvcnQoXCIuL2Jhc2UuanNcIikuTWlncmF0aW9uT2JqZWN0VHlwZX0gLSBXaGV0aGVyIG1pZ3JhdGlvbiBleGlzdHMuXG4gKi9cbmZ1bmN0aW9uIGlzTWlncmF0aW9uT2JqZWN0KG1pZ3JhdGlvbikge1xuICByZXR1cm4gQm9vbGVhbihtaWdyYXRpb24pXG59XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFZlbG9jaW91c0Vudmlyb25tZW50c0hhbmRsZXJCcm93c2VyIGV4dGVuZHMgQmFzZSB7XG4gIC8qKlxuICAgKiBGaW5kIGNvbW1hbmRzIHJlcXVpcmUgY29udGV4dCByZXN1bHQuXG4gICAqIEB0eXBlIHtDb21tYW5kc1JlcXVpcmVDb250ZXh0VHlwZSB8IHVuZGVmaW5lZH0gKi9cbiAgZmluZENvbW1hbmRzUmVxdWlyZUNvbnRleHRSZXN1bHQgPSB1bmRlZmluZWRcblxuICAvKipcbiAgICogTWlncmF0aW9ucyByZXF1aXJlIGNvbnRleHQgcmVzdWx0LlxuICAgKiBAdHlwZSB7TWlncmF0aW9uc1JlcXVpcmVDb250ZXh0VHlwZSB8IHVuZGVmaW5lZH0gKi9cbiAgX21pZ3JhdGlvbnNSZXF1aXJlQ29udGV4dFJlc3VsdCA9IHVuZGVmaW5lZFxuXG4gIC8qKlxuICAgKiBUZXN0IGZpbGVzIHJlcXVpcmUgY29udGV4dCByZXN1bHQuXG4gICAqIEB0eXBlIHtUZXN0RmlsZXNSZXF1aXJlQ29udGV4dFR5cGUgfCB1bmRlZmluZWR9ICovXG4gIF90ZXN0RmlsZXNSZXF1aXJlQ29udGV4dFJlc3VsdCA9IHVuZGVmaW5lZFxuXG4gIC8qKlxuICAgKiBSdW5zIGNvbnN0cnVjdG9yLlxuICAgKiBAcGFyYW0ge29iamVjdH0gYXJncyAtIE9wdGlvbnMgb2JqZWN0LlxuICAgKiBAcGFyYW0geygpID0+IFByb21pc2U8TWlncmF0aW9uc1JlcXVpcmVDb250ZXh0VHlwZT59IFthcmdzLm1pZ3JhdGlvbnNSZXF1aXJlQ29udGV4dENhbGxiYWNrXSAtIE1pZ3JhdGlvbnMgcmVxdWlyZSBjb250ZXh0IGNhbGxiYWNrLlxuICAgKiBAcGFyYW0geygpID0+IFByb21pc2U8VGVzdEZpbGVzUmVxdWlyZUNvbnRleHRUeXBlPn0gW2FyZ3MudGVzdEZpbGVzUmVxdWlyZUNvbnRleHRDYWxsYmFja10gLSBUZXN0IGZpbGVzIHJlcXVpcmUgY29udGV4dCBjYWxsYmFjay5cbiAgICovXG4gIGNvbnN0cnVjdG9yKHttaWdyYXRpb25zUmVxdWlyZUNvbnRleHRDYWxsYmFjaywgdGVzdEZpbGVzUmVxdWlyZUNvbnRleHRDYWxsYmFjaywgLi4ucmVzdEFyZ3N9ID0ge30pIHtcbiAgICBzdXBlcigpXG4gICAgcmVzdEFyZ3NFcnJvcihyZXN0QXJncylcblxuICAgIHRoaXMubWlncmF0aW9uc1JlcXVpcmVDb250ZXh0Q2FsbGJhY2sgPSBtaWdyYXRpb25zUmVxdWlyZUNvbnRleHRDYWxsYmFja1xuICAgIHRoaXMudGVzdEZpbGVzUmVxdWlyZUNvbnRleHRDYWxsYmFjayA9IHRlc3RGaWxlc1JlcXVpcmVDb250ZXh0Q2FsbGJhY2tcbiAgICB0aGlzLmxvZ2dlciA9IG5ldyBMb2dnZXIodGhpcylcbiAgfVxuXG5cbiAgLyoqXG4gICAqIFJ1bnMgbWlncmF0aW9ucyByZXF1aXJlIGNvbnRleHQuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPE1pZ3JhdGlvbnNSZXF1aXJlQ29udGV4dFR5cGU+fSAtIFJlc29sdmVzIHdpdGggdGhlIG1pZ3JhdGlvbnMgcmVxdWlyZSBjb250ZXh0LlxuICAgKi9cbiAgYXN5bmMgbWlncmF0aW9uc1JlcXVpcmVDb250ZXh0KCkge1xuICAgIGNvbnN0IHttaWdyYXRpb25zUmVxdWlyZUNvbnRleHRDYWxsYmFja30gPSB0aGlzXG5cbiAgICBpZiAoIW1pZ3JhdGlvbnNSZXF1aXJlQ29udGV4dENhbGxiYWNrKSB0aHJvdyBuZXcgRXJyb3IoXCJtaWdyYXRpb25zUmVxdWlyZUNvbnRleHRDYWxsYmFjayBpcyByZXF1aXJlZFwiKVxuXG4gICAgdGhpcy5fbWlncmF0aW9uc1JlcXVpcmVDb250ZXh0UmVzdWx0IHx8PSBhd2FpdCBtaWdyYXRpb25zUmVxdWlyZUNvbnRleHRDYWxsYmFjaygpXG5cbiAgICByZXR1cm4gdGhpcy5fbWlncmF0aW9uc1JlcXVpcmVDb250ZXh0UmVzdWx0XG4gIH1cblxuICAvKipcbiAgICogUnVucyB0ZXN0IGZpbGVzIHJlcXVpcmUgY29udGV4dC5cbiAgICogQHJldHVybnMge1Byb21pc2U8VGVzdEZpbGVzUmVxdWlyZUNvbnRleHRUeXBlPn0gLSBSZXNvbHZlcyB3aXRoIHRoZSB0ZXN0IGZpbGVzIHJlcXVpcmUgY29udGV4dC5cbiAgICovXG4gIGFzeW5jIHRlc3RGaWxlc1JlcXVpcmVDb250ZXh0KCkge1xuICAgIGNvbnN0IHt0ZXN0RmlsZXNSZXF1aXJlQ29udGV4dENhbGxiYWNrfSA9IHRoaXNcblxuICAgIGlmICghdGVzdEZpbGVzUmVxdWlyZUNvbnRleHRDYWxsYmFjaykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwidGVzdEZpbGVzUmVxdWlyZUNvbnRleHRDYWxsYmFjayBpcyByZXF1aXJlZCB3aGVuIHJ1bm5pbmcgYnJvd3NlciB0ZXN0c1wiKVxuICAgIH1cblxuICAgIHRoaXMuX3Rlc3RGaWxlc1JlcXVpcmVDb250ZXh0UmVzdWx0IHx8PSBhd2FpdCB0ZXN0RmlsZXNSZXF1aXJlQ29udGV4dENhbGxiYWNrKClcblxuICAgIHJldHVybiB0aGlzLl90ZXN0RmlsZXNSZXF1aXJlQ29udGV4dFJlc3VsdFxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgZmluZCBjb21tYW5kcy5cbiAgICogQHJldHVybnMge1Byb21pc2U8QXJyYXk8aW1wb3J0KFwiLi9iYXNlLmpzXCIpLkNvbW1hbmRGaWxlT2JqZWN0VHlwZT4+fSAtIFJlc29sdmVzIHdpdGggdGhlIGNvbW1hbmRzLlxuICAgKi9cbiAgYXN5bmMgZmluZENvbW1hbmRzKCkge1xuICAgIHRoaXMuX2ZpbmRDb21tYW5kc1Jlc3VsdCA9IHRoaXMuX2FjdHVhbEZpbmRDb21tYW5kcygpXG5cbiAgICByZXR1cm4gdGhpcy5fZmluZENvbW1hbmRzUmVzdWx0XG4gIH1cblxuICAvKipcbiAgICogUnVucyBmaW5kIGNvbW1hbmRzIHJlcXVpcmUgY29udGV4dC5cbiAgICogQHJldHVybnMge0NvbW1hbmRzUmVxdWlyZUNvbnRleHRUeXBlfSAtIFRoZSBjb21tYW5kcyByZXF1aXJlIGNvbnRleHQuXG4gICAqL1xuICBfZmluZENvbW1hbmRzUmVxdWlyZUNvbnRleHQoKSB7XG4gICAgLy8gQHRzLWV4cGVjdC1lcnJvclxuICAgIHRoaXMuZmluZENvbW1hbmRzUmVxdWlyZUNvbnRleHRSZXN1bHQgfHw9IC8qKiBAdHlwZSB7Q29tbWFuZHNSZXF1aXJlQ29udGV4dFR5cGV9ICovIChyZXF1aXJlLmNvbnRleHQoXCIuLi9jbGkvY29tbWFuZHNcIiwgdHJ1ZSwgL1xcLmpzJC8pKVxuXG4gICAgcmV0dXJuIHRoaXMuZmluZENvbW1hbmRzUmVxdWlyZUNvbnRleHRSZXN1bHRcbiAgfVxuXG4gIF9hY3R1YWxGaW5kQ29tbWFuZHMoKSB7XG4gICAgY29uc3QgY29tbWFuZEZpbGVzID0gdGhpcy5fZmluZENvbW1hbmRzUmVxdWlyZUNvbnRleHQoKVxuICAgIGNvbnN0IGNvbW1hbmRzID0gW11cblxuICAgIGZvciAoY29uc3QgYUZpbGVQYXRoIG9mIGNvbW1hbmRGaWxlcy5rZXlzKCkpIHtcbiAgICAgIGNvbnN0IGFGaWxlUGF0aFBhcnRzID0gYUZpbGVQYXRoLnNwbGl0KFwiL1wiKVxuICAgICAgY29uc3QgbGFzdFBhcnQgPSBhRmlsZVBhdGhQYXJ0c1thRmlsZVBhdGhQYXJ0cy5sZW5ndGggLSAxXVxuICAgICAgbGV0IG5hbWVcblxuICAgICAgaWYgKGxhc3RQYXJ0ID09IFwiaW5kZXguanNcIikge1xuICAgICAgICBuYW1lID0gYUZpbGVQYXRoUGFydHNbYUZpbGVQYXRoUGFydHMubGVuZ3RoIC0gMl1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG5hbWUgPSBsYXN0UGFydC5yZXBsYWNlKFwiLmpzXCIsIFwiXCIpXG4gICAgICB9XG5cbiAgICAgIGNvbW1hbmRzLnB1c2goe25hbWUsIGZpbGU6IGFGaWxlUGF0aH0pXG4gICAgfVxuXG4gICAgcmV0dXJuIGNvbW1hbmRzXG4gIH1cblxuICAvKipcbiAgICogUnVucyByZXF1aXJlIGNvbW1hbmQuXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBhcmdzIC0gT3B0aW9ucyBvYmplY3QuXG4gICAqIEBwYXJhbSB7QXJyYXk8c3RyaW5nPn0gYXJncy5jb21tYW5kUGFydHMgLSBDb21tYW5kIHBhcnRzLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx0eXBlb2YgaW1wb3J0KFwiLi4vY2xpL2Jhc2UtY29tbWFuZC5qc1wiKS5kZWZhdWx0Pn0gLSBSZXNvbHZlcyB3aXRoIHRoZSByZXF1aXJlIGNvbW1hbmQuXG4gICAqL1xuICBhc3luYyByZXF1aXJlQ29tbWFuZCh7Y29tbWFuZFBhcnRzfSkge1xuICAgIGxldCBmaWxlUGF0aCA9IFwiLlwiXG5cbiAgICBmb3IgKGxldCBjb21tYW5kUGFydCBvZiBjb21tYW5kUGFydHMpIHtcbiAgICAgIGlmIChjb21tYW5kUGFydCA9PSBcImNcIikgY29tbWFuZFBhcnQgPSBcImNvbnNvbGVcIlxuICAgICAgaWYgKGNvbW1hbmRQYXJ0ID09IFwiZFwiKSBjb21tYW5kUGFydCA9IFwiZGVzdHJveVwiXG4gICAgICBpZiAoY29tbWFuZFBhcnQgPT0gXCJnXCIpIGNvbW1hbmRQYXJ0ID0gXCJnZW5lcmF0ZVwiXG4gICAgICBpZiAoY29tbWFuZFBhcnQgPT0gXCJzXCIpIGNvbW1hbmRQYXJ0ID0gXCJzZXJ2ZXJcIlxuXG4gICAgICBmaWxlUGF0aCArPSBgLyR7Y29tbWFuZFBhcnR9YFxuICAgIH1cblxuICAgIGNvbnN0IGZpbGVQYXRocyA9IFtdXG5cbiAgICBmaWxlUGF0aHMucHVzaChgJHtmaWxlUGF0aH0vaW5kZXguanNgKVxuICAgIGZpbGVQYXRoICs9IFwiLmpzXCJcbiAgICBmaWxlUGF0aHMucHVzaChmaWxlUGF0aClcblxuICAgIGNvbnN0IGNvbW1hbmRzUmVxdWlyZUNvbnRleHQgPSBhd2FpdCB0aGlzLl9maW5kQ29tbWFuZHNSZXF1aXJlQ29udGV4dCgpXG4gICAgbGV0IGNvbW1hbmRDbGFzc0ltcG9ydFxuXG4gICAgZm9yIChjb25zdCBhRmlsZVBhdGggb2YgZmlsZVBhdGhzKSB7XG4gICAgICBjb21tYW5kQ2xhc3NJbXBvcnQgPSBjb21tYW5kc1JlcXVpcmVDb250ZXh0KGFGaWxlUGF0aClcblxuICAgICAgaWYgKGNvbW1hbmRDbGFzc0ltcG9ydCkge1xuICAgICAgICBicmVha1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmICghY29tbWFuZENsYXNzSW1wb3J0KSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYFVua25vd24gY29tbWFuZDogJHtjb21tYW5kUGFydHMuam9pbihcIjpcIil9LiBQb3NzaWJsZSBjb21tYW5kczogJHtjb21tYW5kc1JlcXVpcmVDb250ZXh0LmtleXMoKX1gKVxuICAgIH1cblxuICAgIGNvbnN0IENvbW1hbmRDbGFzcyA9IGNvbW1hbmRDbGFzc0ltcG9ydC5kZWZhdWx0XG5cbiAgICByZXR1cm4gQ29tbWFuZENsYXNzXG4gIH1cblxuICAvKipcbiAgICogUnVucyBmaW5kIG1pZ3JhdGlvbnMuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPEFycmF5PGltcG9ydChcIi4vYmFzZS5qc1wiKS5NaWdyYXRpb25PYmplY3RUeXBlPj59IC0gUmVzb2x2ZXMgd2l0aCB0aGUgbWlncmF0aW9ucy5cbiAgICovXG4gIGFzeW5jIGZpbmRNaWdyYXRpb25zKCkge1xuICAgIGNvbnN0IG1pZ3JhdGlvbnNSZXF1aXJlQ29udGV4dCA9IGF3YWl0IHRoaXMubWlncmF0aW9uc1JlcXVpcmVDb250ZXh0KClcbiAgICAvKipcbiAgICAgKiBNaWdyYXRpb25zLlxuICAgICAqIEB0eXBlIHtBcnJheTxpbXBvcnQoXCIuL2Jhc2UuanNcIikuTWlncmF0aW9uT2JqZWN0VHlwZSB8IG51bGw+fSAqL1xuICAgIGNvbnN0IG1pZ3JhdGlvbnMgPSBtaWdyYXRpb25zUmVxdWlyZUNvbnRleHRcbiAgICAgIC5rZXlzKClcbiAgICAgIC5tYXAoKGZpbGUpID0+IHtcbiAgICAgICAgLy8gXCIxMywxNFwiIGJlY2F1c2Ugc29tZXMgXCJyZXF1aXJlLWNvbnRleHRcIi1ucG0tbW9kdWxlIGRlbGV0ZXMgZmlyc3QgY2hhcmFjdGVyIT9cbiAgICAgICAgY29uc3QgbWF0Y2ggPSBmaWxlLm1hdGNoKC8oXFxkezEzLDE0fSktKC4rKVxcLmpzJC8pXG5cbiAgICAgICAgaWYgKCFtYXRjaCkgcmV0dXJuIG51bGxcblxuICAgICAgICAvLyBGaXggcmVxdWlyZS1jb250ZXh0LW5wbS1tb2R1bGUgZGVsZXRlcyBmaXJzdCBjaGFyYWN0ZXJcbiAgICAgICAgbGV0IGZpbGVOYW1lID0gZmlsZVxuICAgICAgICBsZXQgZGF0ZU51bWJlciA9IG1hdGNoWzFdXG5cbiAgICAgICAgaWYgKGRhdGVOdW1iZXIubGVuZ3RoID09IDEzKSB7XG4gICAgICAgICAgZGF0ZU51bWJlciA9IGAyJHtkYXRlTnVtYmVyfWBcbiAgICAgICAgICBmaWxlTmFtZSA9IGAyJHtmaWxlTmFtZX1gXG4gICAgICAgIH1cblxuICAgICAgICAvLyBQYXJzZSByZWdleFxuICAgICAgICBjb25zdCBkYXRlID0gcGFyc2VJbnQoZGF0ZU51bWJlcilcbiAgICAgICAgY29uc3QgbWlncmF0aW9uTmFtZSA9IG1hdGNoWzJdXG4gICAgICAgIGNvbnN0IG1pZ3JhdGlvbkNsYXNzTmFtZSA9IGluZmxlY3Rpb24uY2FtZWxpemUobWlncmF0aW9uTmFtZS5yZXBsYWNlQWxsKFwiLVwiLCBcIl9cIikpXG5cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBmaWxlOiBmaWxlTmFtZSxcbiAgICAgICAgICBmdWxsUGF0aDogZmlsZSxcbiAgICAgICAgICBkYXRlLFxuICAgICAgICAgIG1pZ3JhdGlvbkNsYXNzTmFtZVxuICAgICAgICB9XG4gICAgICB9KVxuICAgICAgLmZpbHRlcihpc01pZ3JhdGlvbk9iamVjdClcbiAgICAvKipcbiAgICAgKiBGaWxlcy5cbiAgICAgKiBAdHlwZSB7aW1wb3J0KFwiLi9iYXNlLmpzXCIpLk1pZ3JhdGlvbk9iamVjdFR5cGVbXX0gKi9cbiAgICBjb25zdCBmaWxlcyA9IC8qKiBAdHlwZSB7aW1wb3J0KFwiLi9iYXNlLmpzXCIpLk1pZ3JhdGlvbk9iamVjdFR5cGVbXX0gKi8gKG1pZ3JhdGlvbnMpXG5cbiAgICBmaWxlcy5zb3J0KChtaWdyYXRpb24xLCBtaWdyYXRpb24yKSA9PiBtaWdyYXRpb24xLmRhdGUgLSBtaWdyYXRpb24yLmRhdGUpXG5cbiAgICByZXR1cm4gZmlsZXNcbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIGltcG9ydCB0ZXN0IGZpbGVzLlxuICAgKiBAcGFyYW0ge3N0cmluZ1tdfSB0ZXN0RmlsZXMgLSBUZXN0IGZpbGVzLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn0gLSBSZXNvbHZlcyB3aGVuIGNvbXBsZXRlLlxuICAgKi9cbiAgYXN5bmMgaW1wb3J0VGVzdEZpbGVzKHRlc3RGaWxlcykge1xuICAgIGNvbnN0IHRlc3RGaWxlc1JlcXVpcmVDb250ZXh0ID0gYXdhaXQgdGhpcy50ZXN0RmlsZXNSZXF1aXJlQ29udGV4dCgpXG4gICAgY29uc3QgcmVxdWlyZUtleXMgPSB0ZXN0RmlsZXNSZXF1aXJlQ29udGV4dC5rZXlzKClcbiAgICBjb25zdCBub3JtYWxpemVkS2V5cyA9IHJlcXVpcmVLZXlzLm1hcCgoa2V5KSA9PiAoe1xuICAgICAga2V5LFxuICAgICAgbm9ybWFsaXplZDoga2V5LnJlcGxhY2UoL1xcXFwvZywgXCIvXCIpLnJlcGxhY2UoL15cXC5cXC8vLCBcIlwiKVxuICAgIH0pKVxuXG4gICAgZm9yIChjb25zdCB0ZXN0RmlsZSBvZiB0ZXN0RmlsZXMpIHtcbiAgICAgIGNvbnN0IG5vcm1hbGl6ZWRGaWxlID0gdGVzdEZpbGUucmVwbGFjZSgvXFxcXC9nLCBcIi9cIilcbiAgICAgIGNvbnN0IG1hdGNoZWRLZXkgPSBub3JtYWxpemVkS2V5cy5maW5kKChlbnRyeSkgPT4gbm9ybWFsaXplZEZpbGUuZW5kc1dpdGgoZW50cnkubm9ybWFsaXplZCkpPy5rZXlcblxuICAgICAgaWYgKCFtYXRjaGVkS2V5KSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgVGVzdCBmaWxlICR7dGVzdEZpbGV9IHdhcyBub3QgZm91bmQgaW4gdGhlIHByb3ZpZGVkIHJlcXVpcmUgY29udGV4dGApXG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGltcG9ydGVkID0gdGVzdEZpbGVzUmVxdWlyZUNvbnRleHQobWF0Y2hlZEtleSlcblxuICAgICAgaWYgKGltcG9ydGVkICYmIHR5cGVvZiBpbXBvcnRlZCA9PSBcIm9iamVjdFwiICYmIFwidGhlblwiIGluIGltcG9ydGVkICYmIHR5cGVvZiBpbXBvcnRlZC50aGVuID09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICBhd2FpdCBpbXBvcnRlZFxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBSZXF1aXJlIG1pZ3JhdGlvbi5cbiAgICogQHBhcmFtIHtzdHJpbmd9IGZpbGVQYXRoIC0gRmlsZSBwYXRoLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx0eXBlb2YgaW1wb3J0KFwiLi4vZGF0YWJhc2UvbWlncmF0aW9uL2luZGV4LmpzXCIpLmRlZmF1bHQ+fSAtIFJlc29sdmVzIHdpdGggdGhlIHJlcXVpcmUgbWlncmF0aW9uLlxuICAgKi9cbiAgcmVxdWlyZU1pZ3JhdGlvbiA9IGFzeW5jIChmaWxlUGF0aCkgPT4ge1xuICAgIGlmICghZmlsZVBhdGgpIHRocm93IG5ldyBFcnJvcihcImZpbGVQYXRoIGlzIHJlcXVpcmVkXCIpXG5cbiAgICBjb25zdCBtaWdyYXRpb25zUmVxdWlyZUNvbnRleHQgPSBhd2FpdCB0aGlzLm1pZ3JhdGlvbnNSZXF1aXJlQ29udGV4dCgpXG4gICAgY29uc3QgbWlncmF0aW9uSW1wb3J0ID0gbWlncmF0aW9uc1JlcXVpcmVDb250ZXh0KGZpbGVQYXRoKVxuXG4gICAgaWYgKCFtaWdyYXRpb25JbXBvcnQpIHRocm93IG5ldyBFcnJvcihgTWlncmF0aW9uIGZpbGUgJHtmaWxlUGF0aH0gbm90IGZvdW5kYClcblxuICAgIGNvbnN0IG1pZ3JhdGlvbkltcG9ydERlZmF1bHQgPSBtaWdyYXRpb25JbXBvcnQuZGVmYXVsdFxuXG4gICAgaWYgKCFtaWdyYXRpb25JbXBvcnREZWZhdWx0KSB0aHJvdyBuZXcgRXJyb3IoXCJNaWdyYXRpb24gZmlsZSBtdXN0IGV4cG9ydCBhIGRlZmF1bHQgbWlncmF0aW9uIGNsYXNzXCIpXG4gICAgaWYgKHR5cGVvZiBtaWdyYXRpb25JbXBvcnREZWZhdWx0ICE9PSBcImZ1bmN0aW9uXCIpIHRocm93IG5ldyBFcnJvcihcIk1pZ3JhdGlvbiBkZWZhdWx0IGV4cG9ydCBpc24ndCBhIGZ1bmN0aW9uIChzaG91bGQgYmUgYSBjbGFzcyB3aGljaCBpcyBhIGZ1bmN0aW9uIGluIEpTKVwiKVxuXG4gICAgcmV0dXJuIG1pZ3JhdGlvbkltcG9ydERlZmF1bHRcbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIGFmdGVyIG1pZ3JhdGlvbnMuXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBhcmdzIC0gT3B0aW9ucyBvYmplY3QuXG4gICAqIEBwYXJhbSB7UmVjb3JkPHN0cmluZywgaW1wb3J0KFwiLi4vZGF0YWJhc2UvZHJpdmVycy9iYXNlLmpzXCIpLmRlZmF1bHQ+fSBhcmdzLmRicyAtIERicy5cbiAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59IC0gUmVzb2x2ZXMgd2hlbiBjb21wbGV0ZS5cbiAgICovXG4gIGFzeW5jIGFmdGVyTWlncmF0aW9ucyh7ZGJzfSkge1xuICAgIGNvbnN0IHN0cnVjdHVyZVNxbCA9IGF3YWl0IHRoaXMuX3NxbGl0ZVN0cnVjdHVyZVNxbCh7ZGJzfSlcblxuICAgIGlmICghc3RydWN0dXJlU3FsKSByZXR1cm5cblxuICAgIGF3YWl0IHRoaXMubG9nZ2VyLmRlYnVnKCgpID0+IFtcInN0cnVjdHVyZS5zcWw6XCIsIHN0cnVjdHVyZVNxbF0pXG4gIH1cblxuICAvKipcbiAgICogUnVucyBzcWxpdGUgc3RydWN0dXJlIHNxbC5cbiAgICogQHBhcmFtIHtvYmplY3R9IGFyZ3MgLSBPcHRpb25zIG9iamVjdC5cbiAgICogQHBhcmFtIHtSZWNvcmQ8c3RyaW5nLCBpbXBvcnQoXCIuLi9kYXRhYmFzZS9kcml2ZXJzL2Jhc2UuanNcIikuZGVmYXVsdD59IGFyZ3MuZGJzIC0gRGJzLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxzdHJpbmcgfCBudWxsPn0gLSBSZXNvbHZlcyB3aXRoIFNRTCBzdHJpbmcuXG4gICAqL1xuICBhc3luYyBfc3FsaXRlU3RydWN0dXJlU3FsKHtkYnN9KSB7XG4gICAgY29uc3Qgc3FsaXRlSWRlbnRpZmllcnMgPSBPYmplY3Qua2V5cyhkYnMpXG4gICAgICAuZmlsdGVyKChpZGVudGlmaWVyKSA9PiB0aGlzLmdldENvbmZpZ3VyYXRpb24oKS5nZXREYXRhYmFzZVR5cGUoaWRlbnRpZmllcikgPT0gXCJzcWxpdGVcIilcblxuICAgIGlmIChzcWxpdGVJZGVudGlmaWVycy5sZW5ndGggPT0gMCkgcmV0dXJuIG51bGxcblxuICAgIGNvbnN0IHNlY3Rpb25zID0gW11cblxuICAgIGZvciAoY29uc3QgaWRlbnRpZmllciBvZiBzcWxpdGVJZGVudGlmaWVycykge1xuICAgICAgY29uc3QgZGIgPSBkYnNbaWRlbnRpZmllcl1cbiAgICAgIGNvbnN0IHN0cnVjdHVyZVNxbCA9IHR5cGVvZiBkYi5zdHJ1Y3R1cmVTcWwgPT09IFwiZnVuY3Rpb25cIiA/IGF3YWl0IGRiLnN0cnVjdHVyZVNxbCgpIDogbnVsbFxuICAgICAgY29uc3QgdHJpbW1lZFNxbCA9IHN0cnVjdHVyZVNxbD8udHJpbUVuZCgpXG5cbiAgICAgIGlmICghdHJpbW1lZFNxbCkgY29udGludWVcblxuICAgICAgaWYgKHNxbGl0ZUlkZW50aWZpZXJzLmxlbmd0aCA+IDEpIHtcbiAgICAgICAgc2VjdGlvbnMucHVzaChgLS0gJHtpZGVudGlmaWVyfWApXG4gICAgICB9XG5cbiAgICAgIHNlY3Rpb25zLnB1c2godHJpbW1lZFNxbClcbiAgICB9XG5cbiAgICBpZiAoc2VjdGlvbnMubGVuZ3RoID09IDApIHJldHVybiBudWxsXG5cbiAgICByZXR1cm4gYCR7c2VjdGlvbnMuam9pbihcIlxcblxcblwiKX1cXG5gXG4gIH1cbn1cbiJdfQ==
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"background-jobs-runner.d.ts","sourceRoot":"","sources":["../../../../../../src/environment-handlers/node/cli/commands/background-jobs-runner.js"],"names":[],"mappings":"AAGA;IACE,
|
|
1
|
+
{"version":3,"file":"background-jobs-runner.d.ts","sourceRoot":"","sources":["../../../../../../src/environment-handlers/node/cli/commands/background-jobs-runner.js"],"names":[],"mappings":"AAGA;IACE,yBAmBC;CACF;wBAxBuB,iCAAiC"}
|
|
@@ -15,7 +15,8 @@ export default class BackgroundJobsRunnerCommand extends BaseCommand {
|
|
|
15
15
|
}
|
|
16
16
|
const decoded = Buffer.from(payload, "base64").toString("utf8");
|
|
17
17
|
const jobPayload = JSON.parse(decoded);
|
|
18
|
-
await runJobPayload(jobPayload);
|
|
18
|
+
await runJobPayload(jobPayload, { closeConnections: false });
|
|
19
|
+
process.exit(0);
|
|
19
20
|
}
|
|
20
21
|
}
|
|
21
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
22
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmFja2dyb3VuZC1qb2JzLXJ1bm5lci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3NyYy9lbnZpcm9ubWVudC1oYW5kbGVycy9ub2RlL2NsaS9jb21tYW5kcy9iYWNrZ3JvdW5kLWpvYnMtcnVubmVyLmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sV0FBVyxNQUFNLGlDQUFpQyxDQUFBO0FBQ3pELE9BQU8sYUFBYSxNQUFNLDJDQUEyQyxDQUFBO0FBRXJFLE1BQU0sQ0FBQyxPQUFPLE9BQU8sMkJBQTRCLFNBQVEsV0FBVztJQUNsRSxLQUFLLENBQUMsT0FBTztRQUNYLE1BQU0sT0FBTyxHQUFHLE9BQU8sQ0FBQyxHQUFHLENBQUMscUJBQXFCLENBQUE7UUFFakQsSUFBSSxDQUFDLE9BQU87WUFBRSxNQUFNLElBQUksS0FBSyxDQUFDLCtCQUErQixDQUFDLENBQUE7UUFFOUQsc0VBQXNFO1FBQ3RFLHdFQUF3RTtRQUN4RSw0RUFBNEU7UUFDNUUsMEVBQTBFO1FBQzFFLHFCQUFxQjtRQUNyQixLQUFLLE1BQU0sTUFBTSxJQUFJLENBQUMsU0FBUyxFQUFFLFFBQVEsQ0FBQyxFQUFFLENBQUM7WUFDM0MsT0FBTyxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsR0FBRyxFQUFFLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFBO1FBQzdDLENBQUM7UUFFRCxNQUFNLE9BQU8sR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxRQUFRLENBQUMsQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLENBQUE7UUFDL0QsTUFBTSxVQUFVLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQTtRQUV0QyxNQUFNLGFBQWEsQ0FBQyxVQUFVLEVBQUUsRUFBQyxnQkFBZ0IsRUFBRSxLQUFLLEVBQUMsQ0FBQyxDQUFBO1FBQzFELE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUE7SUFDakIsQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IEJhc2VDb21tYW5kIGZyb20gXCIuLi8uLi8uLi8uLi9jbGkvYmFzZS1jb21tYW5kLmpzXCJcbmltcG9ydCBydW5Kb2JQYXlsb2FkIGZyb20gXCIuLi8uLi8uLi8uLi9iYWNrZ3JvdW5kLWpvYnMvam9iLXJ1bm5lci5qc1wiXG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIEJhY2tncm91bmRKb2JzUnVubmVyQ29tbWFuZCBleHRlbmRzIEJhc2VDb21tYW5kIHtcbiAgYXN5bmMgZXhlY3V0ZSgpIHtcbiAgICBjb25zdCBwYXlsb2FkID0gcHJvY2Vzcy5lbnYuVkVMT0NJT1VTX0pPQl9QQVlMT0FEXG5cbiAgICBpZiAoIXBheWxvYWQpIHRocm93IG5ldyBFcnJvcihcIk1pc3NpbmcgVkVMT0NJT1VTX0pPQl9QQVlMT0FEXCIpXG5cbiAgICAvLyBBIGdyYWNlZnVsIHdvcmtlciBzaHV0ZG93biAoZS5nLiBhIGRlcGxveSBkcmFpbmluZyB0aGUgb2xkIHJlbGVhc2UpXG4gICAgLy8gU0lHVEVSTXMgdGhpcyBzcGF3bmVkIHJ1bm5lciB0byByZWFwIGl0LiBFeGl0IHByb21wdGx5IHNvIGl0IGRvZXMgbm90XG4gICAgLy8gbGluZ2VyIGFzIGFuIG9ycGhhbiBydW5uaW5nIGFnYWluc3QgZGVsZXRlZCByZWxlYXNlIGNvZGU7IHRoZSBPUyByZWxlYXNlc1xuICAgIC8vIHRoZSBydW5uZXIncyBEQi9iZWFjb24gc29ja2V0cyBvbiBleGl0IGFuZCBtYWluJ3Mgb3JwaGFuIHN3ZWVwIHJlY2xhaW1zXG4gICAgLy8gdGhlIGluLWZsaWdodCBqb2IuXG4gICAgZm9yIChjb25zdCBzaWduYWwgb2YgW1wiU0lHVEVSTVwiLCBcIlNJR0lOVFwiXSkge1xuICAgICAgcHJvY2Vzcy5vbmNlKHNpZ25hbCwgKCkgPT4gcHJvY2Vzcy5leGl0KDApKVxuICAgIH1cblxuICAgIGNvbnN0IGRlY29kZWQgPSBCdWZmZXIuZnJvbShwYXlsb2FkLCBcImJhc2U2NFwiKS50b1N0cmluZyhcInV0ZjhcIilcbiAgICBjb25zdCBqb2JQYXlsb2FkID0gSlNPTi5wYXJzZShkZWNvZGVkKVxuXG4gICAgYXdhaXQgcnVuSm9iUGF5bG9hZChqb2JQYXlsb2FkLCB7Y2xvc2VDb25uZWN0aW9uczogZmFsc2V9KVxuICAgIHByb2Nlc3MuZXhpdCgwKVxuICB9XG59XG4iXX0=
|