velocious 1.0.593 → 1.0.595

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.
Files changed (136) hide show
  1. package/README.md +3 -2
  2. package/build/configuration.js +109 -14
  3. package/build/database/drivers/base.js +30 -0
  4. package/build/database/migrator.js +90 -24
  5. package/build/database/operation.js +55 -4
  6. package/build/database/query/join-object.js +7 -4
  7. package/build/database/query/model-class-query.js +38 -7
  8. package/build/database/query/preloader/belongs-to.js +9 -6
  9. package/build/database/query/preloader/has-many.js +25 -14
  10. package/build/database/query/preloader/has-one.js +7 -4
  11. package/build/database/query/preloader/query-for-model.js +16 -1
  12. package/build/database/query/preloader.js +6 -4
  13. package/build/database/query/query-data.js +3 -3
  14. package/build/database/query/where-model-class-hash.js +8 -4
  15. package/build/database/query/with-count.js +4 -3
  16. package/build/database/record/index.js +148 -5
  17. package/build/database/record/instance-relationships/base.js +13 -0
  18. package/build/database/record/instance-relationships/belongs-to.js +1 -1
  19. package/build/database/record/instance-relationships/has-many.js +5 -2
  20. package/build/database/record/instance-relationships/has-one.js +1 -1
  21. package/build/database/record/relationships/base.js +17 -0
  22. package/build/database/use-database.js +81 -28
  23. package/build/src/configuration.d.ts +31 -4
  24. package/build/src/configuration.d.ts.map +1 -1
  25. package/build/src/configuration.js +88 -17
  26. package/build/src/database/drivers/base.d.ts +11 -0
  27. package/build/src/database/drivers/base.d.ts.map +1 -1
  28. package/build/src/database/drivers/base.js +28 -1
  29. package/build/src/database/migrator.d.ts +34 -0
  30. package/build/src/database/migrator.d.ts.map +1 -1
  31. package/build/src/database/migrator.js +83 -23
  32. package/build/src/database/operation.d.ts +15 -1
  33. package/build/src/database/operation.d.ts.map +1 -1
  34. package/build/src/database/operation.js +52 -5
  35. package/build/src/database/query/join-object.d.ts.map +1 -1
  36. package/build/src/database/query/join-object.js +7 -5
  37. package/build/src/database/query/model-class-query.d.ts +6 -0
  38. package/build/src/database/query/model-class-query.d.ts.map +1 -1
  39. package/build/src/database/query/model-class-query.js +33 -8
  40. package/build/src/database/query/preloader/belongs-to.d.ts.map +1 -1
  41. package/build/src/database/query/preloader/belongs-to.js +9 -7
  42. package/build/src/database/query/preloader/has-many.d.ts.map +1 -1
  43. package/build/src/database/query/preloader/has-many.js +23 -16
  44. package/build/src/database/query/preloader/has-one.d.ts.map +1 -1
  45. package/build/src/database/query/preloader/has-one.js +7 -5
  46. package/build/src/database/query/preloader/query-for-model.d.ts +8 -0
  47. package/build/src/database/query/preloader/query-for-model.d.ts.map +1 -1
  48. package/build/src/database/query/preloader/query-for-model.js +15 -2
  49. package/build/src/database/query/preloader.d.ts.map +1 -1
  50. package/build/src/database/query/preloader.js +6 -5
  51. package/build/src/database/query/query-data.js +4 -4
  52. package/build/src/database/query/where-model-class-hash.d.ts.map +1 -1
  53. package/build/src/database/query/where-model-class-hash.js +7 -5
  54. package/build/src/database/query/with-count.js +5 -4
  55. package/build/src/database/record/index.d.ts +95 -0
  56. package/build/src/database/record/index.d.ts.map +1 -1
  57. package/build/src/database/record/index.js +126 -6
  58. package/build/src/database/record/instance-relationships/base.d.ts +6 -0
  59. package/build/src/database/record/instance-relationships/base.d.ts.map +1 -1
  60. package/build/src/database/record/instance-relationships/base.js +12 -1
  61. package/build/src/database/record/instance-relationships/belongs-to.js +2 -2
  62. package/build/src/database/record/instance-relationships/has-many.d.ts.map +1 -1
  63. package/build/src/database/record/instance-relationships/has-many.js +6 -3
  64. package/build/src/database/record/instance-relationships/has-one.js +2 -2
  65. package/build/src/database/record/relationships/base.d.ts +11 -0
  66. package/build/src/database/record/relationships/base.d.ts.map +1 -1
  67. package/build/src/database/record/relationships/base.js +15 -1
  68. package/build/src/database/use-database.d.ts +33 -5
  69. package/build/src/database/use-database.d.ts.map +1 -1
  70. package/build/src/database/use-database.js +81 -30
  71. package/build/src/sync/server-change-feed.d.ts +14 -2
  72. package/build/src/sync/server-change-feed.d.ts.map +1 -1
  73. package/build/src/sync/server-change-feed.js +50 -10
  74. package/build/src/sync/sync-scope-store.d.ts +13 -2
  75. package/build/src/sync/sync-scope-store.d.ts.map +1 -1
  76. package/build/src/sync/sync-scope-store.js +48 -7
  77. package/build/src/tenants/frontend-tenant-sqlite-lifecycle.d.ts +43 -1
  78. package/build/src/tenants/frontend-tenant-sqlite-lifecycle.d.ts.map +1 -1
  79. package/build/src/tenants/frontend-tenant-sqlite-lifecycle.js +141 -17
  80. package/build/src/tenants/tenant-handle.d.ts +36 -0
  81. package/build/src/tenants/tenant-handle.d.ts.map +1 -1
  82. package/build/src/tenants/tenant-handle.js +73 -3
  83. package/build/src/testing/browser-test-app.js +3 -1
  84. package/build/src/testing/browser-use-database-hook-scenarios.d.ts +16 -0
  85. package/build/src/testing/browser-use-database-hook-scenarios.d.ts.map +1 -0
  86. package/build/src/testing/browser-use-database-hook-scenarios.js +182 -0
  87. package/build/src/testing/test-runner.d.ts.map +1 -1
  88. package/build/src/testing/test-runner.js +9 -8
  89. package/build/src/utils/model-scope.d.ts +2 -2
  90. package/build/src/utils/model-scope.d.ts.map +1 -1
  91. package/build/src/utils/model-scope.js +5 -3
  92. package/build/src/utils/ransack.d.ts.map +1 -1
  93. package/build/src/utils/ransack.js +5 -3
  94. package/build/sync/server-change-feed.js +58 -8
  95. package/build/sync/sync-scope-store.js +55 -5
  96. package/build/tenants/frontend-tenant-sqlite-lifecycle.js +150 -15
  97. package/build/tenants/tenant-handle.js +90 -6
  98. package/build/testing/browser-test-app.js +2 -0
  99. package/build/testing/browser-use-database-hook-scenarios.js +204 -0
  100. package/build/testing/test-runner.js +8 -7
  101. package/build/tsconfig.tsbuildinfo +1 -1
  102. package/build/utils/model-scope.js +5 -2
  103. package/build/utils/ransack.js +5 -2
  104. package/package.json +2 -1
  105. package/scripts/browser-test-session.js +60 -0
  106. package/scripts/test-browser.js +7 -7
  107. package/src/configuration.js +109 -14
  108. package/src/database/drivers/base.js +30 -0
  109. package/src/database/migrator.js +90 -24
  110. package/src/database/operation.js +55 -4
  111. package/src/database/query/join-object.js +7 -4
  112. package/src/database/query/model-class-query.js +38 -7
  113. package/src/database/query/preloader/belongs-to.js +9 -6
  114. package/src/database/query/preloader/has-many.js +25 -14
  115. package/src/database/query/preloader/has-one.js +7 -4
  116. package/src/database/query/preloader/query-for-model.js +16 -1
  117. package/src/database/query/preloader.js +6 -4
  118. package/src/database/query/query-data.js +3 -3
  119. package/src/database/query/where-model-class-hash.js +8 -4
  120. package/src/database/query/with-count.js +4 -3
  121. package/src/database/record/index.js +148 -5
  122. package/src/database/record/instance-relationships/base.js +13 -0
  123. package/src/database/record/instance-relationships/belongs-to.js +1 -1
  124. package/src/database/record/instance-relationships/has-many.js +5 -2
  125. package/src/database/record/instance-relationships/has-one.js +1 -1
  126. package/src/database/record/relationships/base.js +17 -0
  127. package/src/database/use-database.js +81 -28
  128. package/src/sync/server-change-feed.js +58 -8
  129. package/src/sync/sync-scope-store.js +55 -5
  130. package/src/tenants/frontend-tenant-sqlite-lifecycle.js +150 -15
  131. package/src/tenants/tenant-handle.js +90 -6
  132. package/src/testing/browser-test-app.js +2 -0
  133. package/src/testing/browser-use-database-hook-scenarios.js +204 -0
  134. package/src/testing/test-runner.js +8 -7
  135. package/src/utils/model-scope.js +5 -2
  136. package/src/utils/ransack.js +5 -2
@@ -7,6 +7,9 @@
7
7
  * @property {boolean} dirty - Whether delayed writes remain.
8
8
  * @property {number} lastUsed - Monotonic recency sequence.
9
9
  * @property {number} pinCount - Active scoped pins.
10
+ * @property {Promise<void> | undefined} readinessPromise - In-progress schema readiness.
11
+ * @property {boolean} ready - Whether migrations and model metadata are ready.
12
+ * @property {string | undefined} schemaGeneration - Ready or in-progress schema generation.
10
13
  * @property {LifecycleState} state - Current lifecycle state.
11
14
  */
12
15
  const DEFAULT_MAX_OPEN_HANDLES = 10;
@@ -49,7 +52,17 @@ export default class FrontendTenantSqliteLifecycle {
49
52
  const key = this.key(databaseIdentifier, databaseConfiguration);
50
53
  let entry = this.entries.get(key);
51
54
  if (!entry) {
52
- entry = { databaseConfiguration, databaseIdentifier, dirty: false, lastUsed: 0, pinCount: 0, state: "closed" };
55
+ entry = {
56
+ databaseConfiguration,
57
+ databaseIdentifier,
58
+ dirty: false,
59
+ lastUsed: 0,
60
+ pinCount: 0,
61
+ readinessPromise: undefined,
62
+ ready: false,
63
+ schemaGeneration: undefined,
64
+ state: "closed"
65
+ };
53
66
  this.entries.set(key, entry);
54
67
  }
55
68
  return entry;
@@ -60,6 +73,8 @@ export default class FrontendTenantSqliteLifecycle {
60
73
  dirty: entry.dirty,
61
74
  lastUsed: entry.lastUsed,
62
75
  pinCount: entry.pinCount,
76
+ ready: entry.ready,
77
+ schemaGeneration: entry.schemaGeneration,
63
78
  state: entry.state
64
79
  });
65
80
  }
@@ -85,6 +100,72 @@ export default class FrontendTenantSqliteLifecycle {
85
100
  }
86
101
  });
87
102
  }
103
+ /**
104
+ * Opens and prepares one captured physical tenant database generation. The
105
+ * readiness callback runs outside the lifecycle bookkeeping lock, so distinct
106
+ * tenant databases can migrate concurrently while matching callers share one
107
+ * promise.
108
+ * @param {string} databaseIdentifier - Logical database identifier.
109
+ * @param {import("../configuration-types.js").DatabaseConfigurationType} databaseConfiguration - Captured physical configuration.
110
+ * @param {string} schemaGeneration - Application schema generation.
111
+ * @param {() => Promise<void>} callback - Migration and metadata initialization.
112
+ * @returns {Promise<Readonly<ReturnType<FrontendTenantSqliteLifecycle["snapshot"]>>>} - Ready lifecycle snapshot.
113
+ */
114
+ async initialize(databaseIdentifier, databaseConfiguration, schemaGeneration, callback) {
115
+ this.assertSqlite(databaseConfiguration);
116
+ if (!databaseConfiguration.tenantOnly)
117
+ throw new Error("Frontend tenant database initialization requires a tenant-only SQLite database");
118
+ if (typeof schemaGeneration !== "string" || schemaGeneration.length === 0) {
119
+ throw new TypeError("Frontend tenant database initialization requires a non-empty schemaGeneration");
120
+ }
121
+ const readiness = await this.serialize(async () => {
122
+ const entry = this.entry(databaseIdentifier, databaseConfiguration);
123
+ if (entry.readinessPromise) {
124
+ if (entry.schemaGeneration !== schemaGeneration) {
125
+ throw new Error(`Frontend tenant database is already initializing schema generation ${JSON.stringify(entry.schemaGeneration)}; cannot initialize mismatched generation ${JSON.stringify(schemaGeneration)}`);
126
+ }
127
+ return { entry, promise: entry.readinessPromise };
128
+ }
129
+ if (entry.ready && entry.schemaGeneration === schemaGeneration) {
130
+ return { entry, promise: Promise.resolve() };
131
+ }
132
+ if (entry.schemaGeneration && entry.schemaGeneration !== schemaGeneration && (entry.pinCount > 0 || this.configuration.getDatabasePool(databaseIdentifier).capturedConnectionInUse(databaseConfiguration))) {
133
+ throw new Error(`Cannot replace frontend tenant schema generation ${JSON.stringify(entry.schemaGeneration)} while its physical database is in use`);
134
+ }
135
+ if (entry.state !== "open")
136
+ await this.openUnlocked(entry);
137
+ if (entry.schemaGeneration && entry.schemaGeneration !== schemaGeneration) {
138
+ this.configuration.clearRecordMetadataForDatabaseIdentity(this.key(databaseIdentifier, databaseConfiguration));
139
+ }
140
+ entry.ready = false;
141
+ entry.schemaGeneration = schemaGeneration;
142
+ entry.pinCount++;
143
+ const promise = Promise.resolve().then(callback);
144
+ entry.readinessPromise = promise;
145
+ return { entry, promise };
146
+ });
147
+ try {
148
+ await readiness.promise;
149
+ await this.serialize(async () => {
150
+ if (readiness.entry.readinessPromise === readiness.promise) {
151
+ readiness.entry.readinessPromise = undefined;
152
+ readiness.entry.ready = true;
153
+ readiness.entry.pinCount--;
154
+ }
155
+ });
156
+ }
157
+ catch (error) {
158
+ await this.serialize(async () => {
159
+ if (readiness.entry.readinessPromise === readiness.promise) {
160
+ readiness.entry.readinessPromise = undefined;
161
+ readiness.entry.ready = false;
162
+ readiness.entry.pinCount--;
163
+ }
164
+ });
165
+ throw error;
166
+ }
167
+ return this.snapshot(readiness.entry);
168
+ }
88
169
  async flush(/** @type {string} */ databaseIdentifier, /** @type {import("../configuration-types.js").DatabaseConfigurationType} */ databaseConfiguration) {
89
170
  this.assertSqlite(databaseConfiguration);
90
171
  return await this.serialize(async () => {
@@ -111,7 +192,10 @@ export default class FrontendTenantSqliteLifecycle {
111
192
  if (flush)
112
193
  await this.configuration.getDatabasePool(databaseIdentifier).flushCapturedConnection(databaseConfiguration);
113
194
  await this.configuration.getDatabasePool(databaseIdentifier).closeCapturedConnection(databaseConfiguration);
195
+ this.configuration.clearRecordMetadataForDatabaseIdentity(this.key(databaseIdentifier, databaseConfiguration));
114
196
  entry.dirty = false;
197
+ entry.ready = false;
198
+ entry.schemaGeneration = undefined;
115
199
  entry.state = "closed";
116
200
  this.entries.delete(this.key(databaseIdentifier, databaseConfiguration));
117
201
  return this.snapshot(entry);
@@ -130,12 +214,17 @@ export default class FrontendTenantSqliteLifecycle {
130
214
  entry.state = "deleting";
131
215
  try {
132
216
  await this.configuration.getDatabasePool(databaseIdentifier).deleteCapturedDatabase(databaseConfiguration);
217
+ this.configuration.clearRecordMetadataForDatabaseIdentity(this.key(databaseIdentifier, databaseConfiguration));
133
218
  entry.dirty = false;
219
+ entry.ready = false;
220
+ entry.schemaGeneration = undefined;
134
221
  entry.state = "closed";
135
222
  this.entries.delete(this.key(databaseIdentifier, databaseConfiguration));
136
223
  return this.snapshot(entry);
137
224
  }
138
225
  catch (error) {
226
+ this.configuration.clearRecordMetadataForDatabaseIdentity(this.key(databaseIdentifier, databaseConfiguration));
227
+ entry.ready = false;
139
228
  entry.state = "closed";
140
229
  throw error;
141
230
  }
@@ -144,13 +233,18 @@ export default class FrontendTenantSqliteLifecycle {
144
233
  inspect(/** @type {string} */ databaseIdentifier, /** @type {import("../configuration-types.js").DatabaseConfigurationType} */ databaseConfiguration) {
145
234
  this.assertSqlite(databaseConfiguration);
146
235
  const entry = this.entries.get(this.key(databaseIdentifier, databaseConfiguration));
147
- return entry ? this.snapshot(entry) : Object.freeze({ databaseIdentifier, dirty: false, lastUsed: 0, pinCount: 0, state: "closed" });
236
+ return entry ? this.snapshot(entry) : Object.freeze({ databaseIdentifier, dirty: false, lastUsed: 0, pinCount: 0, ready: false, schemaGeneration: undefined, state: "closed" });
148
237
  }
149
238
  inspectAll() {
150
239
  const handles = [...this.entries.values()].map((entry) => this.snapshot(entry));
151
240
  return Object.freeze({ handles: Object.freeze(handles), maxOpenHandles: this.maxOpenHandles, openCount: handles.filter(({ state }) => state === "open").length });
152
241
  }
153
- reset() { this.entries.clear(); }
242
+ reset() {
243
+ for (const entry of this.entries.values()) {
244
+ this.configuration.clearRecordMetadataForDatabaseIdentity(this.key(entry.databaseIdentifier, entry.databaseConfiguration));
245
+ }
246
+ this.entries.clear();
247
+ }
154
248
  async withPin(/** @type {string} */ databaseIdentifier, /** @type {import("../configuration-types.js").DatabaseConfigurationType} */ databaseConfiguration, /** @type {() => Promise<ReturnType<typeof JSON.parse>>} */ callback) {
155
249
  this.assertSqlite(databaseConfiguration);
156
250
  const entry = await this.serialize(async () => {
@@ -168,22 +262,49 @@ export default class FrontendTenantSqliteLifecycle {
168
262
  await this.serialize(async () => { entry.pinCount--; });
169
263
  }
170
264
  }
171
- async databaseOperation(/** @type {string} */ databaseIdentifier, /** @type {import("../configuration-types.js").DatabaseConfigurationType} */ databaseConfiguration, /** @type {() => Promise<ReturnType<typeof JSON.parse>>} */ callback) {
172
- if (!this.entries.has(this.key(databaseIdentifier, databaseConfiguration)))
173
- return await callback();
174
- return await this.withPin(databaseIdentifier, databaseConfiguration, async () => {
175
- try {
176
- return await callback();
265
+ /**
266
+ * Atomically validates readiness, captures the schema generation, and pins
267
+ * one lifecycle entry before starting database work.
268
+ * @param {string} databaseIdentifier - Logical database identifier.
269
+ * @param {import("../configuration-types.js").DatabaseConfigurationType} databaseConfiguration - Captured physical configuration.
270
+ * @param {{requireReady: boolean, schemaGeneration?: string}} options - Operation readiness requirements.
271
+ * @param {(schemaGeneration: string | undefined) => Promise<ReturnType<typeof JSON.parse>>} callback - Pinned operation callback.
272
+ * @returns {Promise<ReturnType<typeof JSON.parse>>} - Operation result.
273
+ */
274
+ async databaseOperation(databaseIdentifier, databaseConfiguration, { requireReady, schemaGeneration }, callback) {
275
+ if (databaseConfiguration.type !== "sqlite")
276
+ return await callback(schemaGeneration);
277
+ const entry = await this.serialize(async () => {
278
+ const operationEntry = this.entries.get(this.key(databaseIdentifier, databaseConfiguration));
279
+ if (requireReady && databaseConfiguration.tenantOnly && databaseConfiguration.migrations && !operationEntry?.ready) {
280
+ const generation = operationEntry?.schemaGeneration ? ` for schema generation ${JSON.stringify(operationEntry.schemaGeneration)}` : "";
281
+ throw new Error(`Frontend tenant database ${JSON.stringify(databaseIdentifier)} is not ready${generation}`);
177
282
  }
178
- finally {
179
- const dirty = this.configuration.getDatabasePool(databaseIdentifier).capturedConnectionHasPendingWrites(databaseConfiguration);
180
- await this.serialize(async () => {
181
- const entry = this.entry(databaseIdentifier, databaseConfiguration);
182
- entry.dirty ||= dirty;
183
- entry.lastUsed = ++this.sequence;
184
- });
283
+ if (!operationEntry)
284
+ return undefined;
285
+ if (schemaGeneration && operationEntry.schemaGeneration && schemaGeneration !== operationEntry.schemaGeneration) {
286
+ throw new Error(`Frontend tenant database ${JSON.stringify(databaseIdentifier)} is on schema generation ${JSON.stringify(operationEntry.schemaGeneration)}, not ${JSON.stringify(schemaGeneration)}`);
185
287
  }
288
+ if (operationEntry.state !== "open")
289
+ await this.openUnlocked(operationEntry);
290
+ operationEntry.pinCount++;
291
+ operationEntry.lastUsed = ++this.sequence;
292
+ return operationEntry;
186
293
  });
294
+ const operationSchemaGeneration = schemaGeneration || entry?.schemaGeneration;
295
+ if (!entry)
296
+ return await callback(operationSchemaGeneration);
297
+ try {
298
+ return await callback(operationSchemaGeneration);
299
+ }
300
+ finally {
301
+ const dirty = this.configuration.getDatabasePool(databaseIdentifier).capturedConnectionHasPendingWrites(databaseConfiguration);
302
+ await this.serialize(async () => {
303
+ entry.dirty ||= dirty;
304
+ entry.lastUsed = ++this.sequence;
305
+ entry.pinCount--;
306
+ });
307
+ }
187
308
  }
188
309
  async openUnlocked(/** @type {LifecycleEntry} */ entry) {
189
310
  await this.evictFor(entry);
@@ -216,8 +337,11 @@ export default class FrontendTenantSqliteLifecycle {
216
337
  if (!victim)
217
338
  throw new Error(`Frontend tenant SQLite handle capacity ${this.maxOpenHandles} reached; every handle is dirty, pinned, or in use`);
218
339
  await this.configuration.getDatabasePool(victim.databaseIdentifier).closeCapturedConnection(victim.databaseConfiguration);
340
+ this.configuration.clearRecordMetadataForDatabaseIdentity(this.key(victim.databaseIdentifier, victim.databaseConfiguration));
341
+ victim.ready = false;
342
+ victim.schemaGeneration = undefined;
219
343
  victim.state = "closed";
220
344
  this.entries.delete(this.key(victim.databaseIdentifier, victim.databaseConfiguration));
221
345
  }
222
346
  }
223
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZnJvbnRlbmQtdGVuYW50LXNxbGl0ZS1saWZlY3ljbGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvdGVuYW50cy9mcm9udGVuZC10ZW5hbnQtc3FsaXRlLWxpZmVjeWNsZS5qcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxZQUFZO0FBRVosdUZBQXVGO0FBQ3ZGOzs7Ozs7OztHQVFHO0FBRUgsTUFBTSx3QkFBd0IsR0FBRyxFQUFFLENBQUE7QUFFbkMsTUFBTSxDQUFDLE9BQU8sT0FBTyw2QkFBNkI7SUFDaEQ7OztPQUdHO0lBQ0gsWUFBWSxFQUFDLGFBQWEsRUFBRSxjQUFjLEdBQUcsd0JBQXdCLEVBQUM7UUFDcEUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxhQUFhLENBQUMsY0FBYyxDQUFDLElBQUksY0FBYyxHQUFHLENBQUMsRUFBRSxDQUFDO1lBQ2hFLE1BQU0sSUFBSSxTQUFTLENBQUMscUVBQXFFLENBQUMsQ0FBQTtRQUM1RixDQUFDO1FBRUQsSUFBSSxDQUFDLGFBQWEsR0FBRyxhQUFhLENBQUE7UUFDbEMsSUFBSSxDQUFDLGNBQWMsR0FBRyxjQUFjLENBQUE7UUFDcEMsMENBQTBDO1FBQzFDLElBQUksQ0FBQyxPQUFPLEdBQUcsSUFBSSxHQUFHLEVBQUUsQ0FBQTtRQUN4QixJQUFJLENBQUMsUUFBUSxHQUFHLENBQUMsQ0FBQTtRQUNqQixJQUFJLENBQUMsS0FBSyxHQUFHLE9BQU8sQ0FBQyxPQUFPLEVBQUUsQ0FBQTtJQUNoQyxDQUFDO0lBRUQsR0FBRyxDQUFDLHFCQUFxQixDQUFDLGtCQUFrQixFQUFFLDRFQUE0RSxDQUFDLHFCQUFxQjtRQUM5SSxPQUFPLEdBQUcsa0JBQWtCLElBQUksSUFBSSxDQUFDLGFBQWEsQ0FBQyxlQUFlLENBQUMsa0JBQWtCLENBQUMsQ0FBQyx3QkFBd0IsQ0FBQyxxQkFBcUIsQ0FBQyxFQUFFLENBQUE7SUFDMUksQ0FBQztJQUVELFlBQVksQ0FBQyw0RUFBNEUsQ0FBQyxxQkFB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SUFBSSxDQUFDLGNBQWMsb0RBQW9ELENBQUMsQ0FBQTtRQUMvSSxNQUFNLElBQUksQ0FBQyxhQUFhLENBQUMsZUFBZSxDQUFDLE1BQU0sQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDLHVCQUF1QixDQUFDLE1BQU0sQ0FBQyxxQkFBcUIsQ0FBQyxDQUFBO1FBQ3pILE1BQU0sQ0FBQyxLQUFLLEdBQUcsUUFBUSxDQUFBO1FBQ3ZCLElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLGtCQUFrQixFQUFFLE1BQU0sQ0FBQyxxQkFBcUIsQ0FBQyxDQUFDLENBQUE7SUFDeEYsQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQHRzLWNoZWNrXG5cbi8qKiBAdHlwZWRlZiB7XCJjbG9zZWRcIiB8IFwiY2xvc2luZ1wiIHwgXCJkZWxldGluZ1wiIHwgXCJvcGVuXCIgfCBcIm9wZW5pbmdcIn0gTGlmZWN5Y2xlU3RhdGUgKi9cbi8qKlxuICogQHR5cGVkZWYge29iamVjdH0gTGlmZWN5Y2xlRW50cnlcbiAqIEBwcm9wZXJ0eSB7aW1wb3J0KFwiLi4vY29uZmlndXJhdGlvbi10eXBlcy5qc1wiKS5EYXRhYmFzZUNvbmZpZ3VyYXRpb25UeXBlfSBkYXRhYmFzZUNvbmZpZ3VyYXRpb24gLSBDYXB0dXJlZCBwaHlzaWNhbCBjb25maWd1cmF0aW9uLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IGRhdGFiYXNlSWRlbnRpZmllciAtIExvZ2ljYWwgZGF0YWJhc2UgaWRlbnRpZmllci5cbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gZGlydHkgLSBXaGV0aGVyIGRlbGF5ZWQgd3JpdGVzIHJlbWFpbi5cbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBsYXN0VXNlZCAtIE1vbm90b25pYyByZWNlbmN5IHNlcXVlbmNlLlxuICogQHByb3BlcnR5IHtudW1iZXJ9IHBpbkNvdW50IC0gQWN0aXZlIHNjb3BlZCBwaW5zLlxuICogQHByb3BlcnR5IHtMaWZlY3ljbGVTdGF0ZX0gc3RhdGUgLSBDdXJyZW50IGxpZmVjeWNsZSBzdGF0ZS5cbiAqL1xuXG5jb25zdCBERUZBVUxUX01BWF9PUEVOX0hBTkRMRVMgPSAxMFxuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBGcm9udGVuZFRlbmFudFNxbGl0ZUxpZmVjeWNsZSB7XG4gIC8qKlxuICAgKiBDcmVhdGVzIGEgbGlmZWN5Y2xlIG93bmVyLlxuICAgKiBAcGFyYW0ge3tjb25maWd1cmF0aW9uOiBpbXBvcnQoXCIuLi9jb25maWd1cmF0aW9uLmpzXCIpLmRlZmF1bHQsIG1heE9wZW5IYW5kbGVzPzogbnVtYmVyfX0gYXJncyAtIExpZmVjeWNsZSBhcmd1bWVudHMuXG4gICAqL1xuICBjb25zdHJ1Y3Rvcih7Y29uZmlndXJhdGlvbiwgbWF4T3BlbkhhbmRsZXMgPSBERUZBVUxUX01BWF9PUEVOX0hBTkRMRVN9KSB7XG4gICAgaWYgKCFOdW1iZXIuaXNTYWZlSW50ZWdlcihtYXhPcGVuSGFuZGxlcykgfHwgbWF4T3BlbkhhbmRsZXMgPCAxKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFwiZnJvbnRlbmRUZW5hbnRTcWxpdGUubWF4T3BlbkhhbmRsZXMgbXVzdCBiZSBhIHBvc2l0aXZlIHNhZmUgaW50ZWdlclwiKVxuICAgIH1cblxuICAgIHRoaXMuY29uZmlndXJhdGlvbiA9IGNvbmZpZ3VyYXRpb25cbiAgICB0aGlzLm1heE9wZW5IYW5kbGVzID0gbWF4T3BlbkhhbmRsZXNcbiAgICAvKiogQHR5cGUge01hcDxzdHJpbmcsIExpZmVjeWNsZUVudHJ5Pn0gKi9cbiAgICB0aGlzLmVudHJpZXMgPSBuZXcgTWFwKClcbiAgICB0aGlzLnNlcXVlbmNlID0gMFxuICAgIHRoaXMucXVldWUgPSBQcm9taXNlLnJlc29sdmUoKVxuICB9XG5cbiAga2V5KC8qKiBAdHlwZSB7c3RyaW5nfSAqLyBkYXRhYmFzZUlkZW50aWZpZXIsIC8qKiBAdHlwZSB7aW1wb3J0KFwiLi4vY29uZmlndXJhdGlvbi10eXBlcy5qc1wiKS5EYXRhYmFzZUNvbmZpZ3VyYXRpb25UeXBlfSAqLyBkYXRhYmFzZUNvbmZpZ3VyYXRpb24pIHtcbiAgICByZXR1cm4gYCR7ZGF0YWJhc2VJZGVudGlmaWVyfToke3RoaXMuY29uZmlndXJhdGlvbi5nZXREYXRhYmFzZVBvb2woZGF0YWJhc2VJZGVudGlmaWVyKS5nZXRDb25maWd1cmF0aW9uUmV1c2VLZXkoZGF0YWJhc2VDb25maWd1cmF0aW9uKX1gXG4gIH1cblxuICBhc3NlcnRTcWxpdGUoLyoqIEB0eXBlIHtpbXBvcnQoXCIuLi9jb25maWd1cmF0aW9uLXR5cGVzLmpzXCIpLkRhdGFiYXNlQ29uZmlndXJhdGlvblR5cGV9ICovIGRhdGFiYXNlQ29uZmlndXJhdGlvbikge1xuICAgIGlmIChkYXRhYmFzZUNvbmZpZ3VyYXRpb24udHlwZSAhPT0gXCJzcWxpdGVcIikgdGhyb3cgbmV3IEVycm9yKFwiRnJvbnRlbmQgdGVuYW50IGxpZmVjeWNsZSBvbmx5IHN1cHBvcnRzIFNRTGl0ZSBkYXRhYmFzZXNcIilcbiAgfVxuXG4gIGFzeW5jIHNlcmlhbGl6ZSgvKiogQHR5cGUgeygpID0+IFByb21pc2U8UmV0dXJuVHlwZTx0eXBlb2YgSlNPTi5wYXJzZT4+fSAqLyBjYWxsYmFjaykge1xuICAgIGNvbnN0IHByZXZpb3VzID0gdGhpcy5xdWV1ZVxuICAgIGxldCByZWxlYXNlID0gKCkgPT4ge31cbiAgICB0aGlzLnF1ZXVlID0gbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHsgcmVsZWFzZSA9ICgpID0+IHJlc29sdmUodW5kZWZpbmVkKSB9KVxuICAgIGF3YWl0IHByZXZpb3VzXG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiBhd2FpdCBjYWxsYmFjaygpXG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIHJlbGVhc2UoKVxuICAgIH1cbiAgfVxuXG4gIGVudHJ5KC8qKiBAdHlwZSB7c3RyaW5nfSAqLyBkYXRhYmFzZUlkZW50aWZpZXIsIC8qKiBAdHlwZSB7aW1wb3J0KFwiLi4vY29uZmlndXJhdGlvbi10eXBlcy5qc1wiKS5EYXRhYmFzZUNvbmZpZ3VyYXRpb25UeXBlfSAqLyBkYXRhYmFzZUNvbmZpZ3VyYXRpb24pIHtcbiAgICBjb25zdCBrZXkgPSB0aGlzLmtleShkYXRhYmFzZUlkZW50aWZpZXIsIGRhdGFiYXNlQ29uZmlndXJhdGlvbilcbiAgICBsZXQgZW50cnkgPSB0aGlzLmVudHJpZXMuZ2V0KGtleSlcbiAgICBpZiAoIWVudHJ5KSB7XG4gICAgICBlbnRyeSA9IHtkYXRhYmFzZUNvbmZpZ3VyYXRpb24sIGRhdGFiYXNlSWRlbnRpZmllciwgZGlydHk6IGZhbHNlLCBsYXN0VXNlZDogMCwgcGluQ291bnQ6IDAsIHN0YXRlOiBcImNsb3NlZFwifVxuICAgICAgdGhpcy5lbnRyaWVzLnNldChrZXksIGVudHJ5KVxuICAgIH1cbiAgICByZXR1cm4gZW50cnlcbiAgfVxuXG4gIHNuYXBzaG90KC8qKiBAdHlwZSB7TGlmZWN5Y2xlRW50cnl9ICovIGVudHJ5KSB7XG4gICAgcmV0dXJuIE9iamVjdC5mcmVlemUoe1xuICAgICAgZGF0YWJhc2VJZGVudGlmaWVyOiBlbnRyeS5kYXRhYmFzZUlkZW50aWZpZXIsXG4gICAgICBkaXJ0eTogZW50cnkuZGlydHksXG4gICAgICBsYXN0VXNlZDogZW50cnkubGFzdFVzZWQsXG4gICAgICBwaW5Db3VudDogZW50cnkucGluQ291bnQsXG4gICAgICBzdGF0ZTogZW50cnkuc3RhdGVcbiAgICB9KVxuICB9XG5cbiAgYXN5bmMgb3BlbigvKiogQHR5cGUge3N0cmluZ30gKi8gZGF0YWJhc2VJZGVudGlmaWVyLCAvKiogQHR5cGUge2ltcG9ydChcIi4uL2NvbmZpZ3VyYXRpb24tdHlwZXMuanNcIikuRGF0YWJhc2VDb25maWd1cmF0aW9uVHlwZX0gKi8gZGF0YWJhc2VDb25maWd1cmF0aW9uKSB7XG4gICAgdGhpcy5hc3NlcnRTcWxpdGUoZGF0YWJhc2VDb25maWd1cmF0aW9uKVxuICAgIHJldHVybiBhd2FpdCB0aGlzLnNlcmlhbGl6ZShhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCBlbnRyeSA9IHRoaXMuZW50cnkoZGF0YWJhc2VJZGVudGlmaWVyLCBkYXRhYmFzZUNvbmZpZ3VyYXRpb24pXG4gICAgICBpZiAoZW50cnkuc3RhdGUgPT09IFwib3BlblwiKSB7XG4gICAgICAgIGVudHJ5Lmxhc3RVc2VkID0gKyt0aGlzLnNlcXVlbmNlXG4gICAgICAgIHJldHVybiB0aGlzLnNuYXBzaG90KGVudHJ5KVxuICAgICAgfVxuXG4gICAgICBhd2FpdCB0aGlzLmV2aWN0Rm9yKGVudHJ5KVxuICAgICAgZW50cnkuc3RhdGUgPSBcIm9wZW5pbmdcIlxuICAgICAgdHJ5IHtcbiAgICAgICAgYXdhaXQgdGhpcy5jb25maWd1cmF0aW9uLmdldERhdGFiYXNlUG9vbChkYXRhYmFzZUlkZW50aWZpZXIpLm9wZW5DYXB0dXJlZENvbm5lY3Rpb24oZGF0YWJhc2VDb25maWd1cmF0aW9uKVxuICAgICAgICBlbnRyeS5zdGF0ZSA9IFwib3BlblwiXG4gICAgICAgIGVudHJ5Lmxhc3RVc2VkID0gKyt0aGlzLnNlcXVlbmNlXG4gICAgICAgIHJldHVybiB0aGlzLnNuYXBzaG90KGVudHJ5KVxuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgZW50cnkuc3RhdGUgPSBcImNsb3NlZFwiXG4gICAgICAgIHRocm93IGVycm9yXG4gICAgICB9XG4gICAgfSlcbiAgfVxuXG4gIGFzeW5jIGZsdXNoKC8qKiBAdHlwZSB7c3RyaW5nfSAqLyBkYXRhYmFzZUlkZW50aWZpZXIsIC8qKiBAdHlwZSB7aW1wb3J0KFwiLi4vY29uZmlndXJhdGlvbi10eXBlcy5qc1wiKS5EYXRhYmFzZUNvbmZpZ3VyYXRpb25UeXBlfSAqLyBkYXRhYmFzZUNvbmZpZ3VyYXRpb24pIHtcbiAgICB0aGlzLmFzc2VydFNxbGl0ZShkYXRhYmFzZUNvbmZpZ3VyYXRpb24pXG4gICAgcmV0dXJuIGF3YWl0IHRoaXMuc2VyaWFsaXplKGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IGVudHJ5ID0gdGhpcy5lbnRyeShkYXRhYmFzZUlkZW50aWZpZXIsIGRhdGFiYXNlQ29uZmlndXJhdGlvbilcbiAgICAgIGlmIChlbnRyeS5zdGF0ZSAhPT0gXCJvcGVuXCIpIGF3YWl0IHRoaXMub3BlblVubG9ja2VkKGVudHJ5KVxuICAgICAgYXdhaXQgdGhpcy5jb25maWd1cmF0aW9uLmdldERhdGFiYXNlUG9vbChkYXRhYmFzZUlkZW50aWZpZXIpLmZsdXNoQ2FwdHVyZWRDb25uZWN0aW9uKGRhdGFiYXNlQ29uZmlndXJhdGlvbilcbiAgICAgIGVudHJ5LmRpcnR5ID0gZmFsc2VcbiAgICAgIGVudHJ5Lmxhc3RVc2VkID0gKyt0aGlzLnNlcXVlbmNlXG4gICAgICByZXR1cm4gdGhpcy5zbmFwc2hvdChlbnRyeSlcbiAgICB9KVxuICB9XG5cbiAgYXN5bmMgY2xvc2UoLyoqIEB0eXBlIHtzdHJpbmd9ICovIGRhdGFiYXNlSWRlbnRpZmllciwgLyoqIEB0eXBlIHtpbXBvcnQoXCIuLi9jb25maWd1cmF0aW9uLXR5cGVzLmpzXCIpLkRhdGFiYXNlQ29uZmlndXJhdGlvblR5cGV9ICovIGRhdGFiYXNlQ29uZmlndXJhdGlvbiwge2ZsdXNoID0gZmFsc2V9ID0ge30pIHtcbiAgICB0aGlzLmFzc2VydFNxbGl0ZShkYXRhYmFzZUNvbmZpZ3VyYXRpb24pXG4gICAgcmV0dXJuIGF3YWl0IHRoaXMuc2VyaWFsaXplKGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IGVudHJ5ID0gdGhpcy5lbnRyeShkYXRhYmFzZUlkZW50aWZpZXIsIGRhdGFiYXNlQ29uZmlndXJhdGlvbilcbiAgICAgIGlmIChlbnRyeS5zdGF0ZSA9PT0gXCJjbG9zZWRcIikgcmV0dXJuIHRoaXMuc25hcHNob3QoZW50cnkpXG4gICAgICBhd2FpdCB0aGlzLmFzc2VydENsb3NhYmxlKGVudHJ5KVxuICAgICAgaWYgKGVudHJ5LmRpcnR5ICYmICFmbHVzaCkgdGhyb3cgbmV3IEVycm9yKFwiQ2Fubm90IGNsb3NlIGEgZGlydHkgZnJvbnRlbmQgdGVuYW50IFNRTGl0ZSBoYW5kbGUgd2l0aG91dCBmbHVzaDogdHJ1ZVwiKVxuICAgICAgZW50cnkuc3RhdGUgPSBcImNsb3NpbmdcIlxuICAgICAgdHJ5IHtcbiAgICAgICAgaWYgKGZsdXNoKSBhd2FpdCB0aGlzLmNvbmZpZ3VyYXRpb24uZ2V0RGF0YWJhc2VQb29sKGRhdGFiYXNlSWRlbnRpZmllcikuZmx1c2hDYXB0dXJlZENvbm5lY3Rpb24oZGF0YWJhc2VDb25maWd1cmF0aW9uKVxuICAgICAgICBhd2FpdCB0aGlzLmNvbmZpZ3VyYXRpb24uZ2V0RGF0YWJhc2VQb29sKGRhdGFiYXNlSWRlbnRpZmllcikuY2xvc2VDYXB0dXJlZENvbm5lY3Rpb24oZGF0YWJhc2VDb25maWd1cmF0aW9uKVxuICAgICAgICBlbnRyeS5kaXJ0eSA9IGZhbHNlXG4gICAgICAgIGVudHJ5LnN0YXRlID0gXCJjbG9zZWRcIlxuICAgICAgICB0aGlzLmVudHJpZXMuZGVsZXRlKHRoaXMua2V5KGRhdGFiYXNlSWRlbnRpZmllciwgZGF0YWJhc2VDb25maWd1cmF0aW9uKSlcbiAgICAgICAgcmV0dXJuIHRoaXMuc25hcHNob3QoZW50cnkpXG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBlbnRyeS5zdGF0ZSA9IFwib3BlblwiXG4gICAgICAgIHRocm93IGVycm9yXG4gICAgICB9XG4gICAgfSlcbiAgfVxuXG4gIGFzeW5jIGRlbGV0ZSgvKiogQHR5cGUge3N0cmluZ30gKi8gZGF0YWJhc2VJZGVudGlmaWVyLCAvKiogQHR5cGUge2ltcG9ydChcIi4uL2NvbmZpZ3VyYXRpb24tdHlwZXMuanNcIikuRGF0YWJhc2VDb25maWd1cmF0aW9uVHlwZX0gKi8gZGF0YWJhc2VDb25maWd1cmF0aW9uKSB7XG4gICAgdGhpcy5hc3NlcnRTcWxpdGUoZGF0YWJhc2VDb25maWd1cmF0aW9uKVxuICAgIHJldHVybiBhd2FpdCB0aGlzLnNlcmlhbGl6ZShhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCBlbnRyeSA9IHRoaXMuZW50cnkoZGF0YWJhc2VJZGVudGlmaWVyLCBkYXRhYmFzZUNvbmZpZ3VyYXRpb24pXG4gICAgICBhd2FpdCB0aGlzLmFzc2VydENsb3NhYmxlKGVudHJ5KVxuICAgICAgZW50cnkuc3RhdGUgPSBcImRlbGV0aW5nXCJcbiAgICAgIHRyeSB7XG4gICAgICAgIGF3YWl0IHRoaXMuY29uZmlndXJhdGlvbi5nZXREYXRhYmFzZVBvb2woZGF0YWJhc2VJZGVudGlmaWVyKS5kZWxldGVDYXB0dXJlZERhdGFiYXNlKGRhdGFiYXNlQ29uZmlndXJhdGlvbilcbiAgICAgICAgZW50cnkuZGlydHkgPSBmYWxzZVxuICAgICAgICBlbnRyeS5zdGF0ZSA9IFwiY2xvc2VkXCJcbiAgICAgICAgdGhpcy5lbnRyaWVzLmRlbGV0ZSh0aGlzLmtleShkYXRhYmFzZUlkZW50aWZpZXIsIGRhdGFiYXNlQ29uZmlndXJhdGlvbikpXG4gICAgICAgIHJldHVybiB0aGlzLnNuYXBzaG90KGVudHJ5KVxuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgZW50cnkuc3RhdGUgPSBcImNsb3NlZFwiXG4gICAgICAgIHRocm93IGVycm9yXG4gICAgICB9XG4gICAgfSlcbiAgfVxuXG4gIGluc3BlY3QoLyoqIEB0eXBlIHtzdHJpbmd9ICovIGRhdGFiYXNlSWRlbnRpZmllciwgLyoqIEB0eXBlIHtpbXBvcnQoXCIuLi9jb25maWd1cmF0aW9uLXR5cGVzLmpzXCIpLkRhdGFiYXNlQ29uZmlndXJhdGlvblR5cGV9ICovIGRhdGFiYXNlQ29uZmlndXJhdGlvbikge1xuICAgIHRoaXMuYXNzZXJ0U3FsaXRlKGRhdGFiYXNlQ29uZmlndXJhdGlvbilcbiAgICBjb25zdCBlbnRyeSA9IHRoaXMuZW50cmllcy5nZXQodGhpcy5rZXkoZGF0YWJhc2VJZGVudGlmaWVyLCBkYXRhYmFzZUNvbmZpZ3VyYXRpb24pKVxuICAgIHJldHVybiBlbnRyeSA/IHRoaXMuc25hcHNob3QoZW50cnkpIDogT2JqZWN0LmZyZWV6ZSh7ZGF0YWJhc2VJZGVudGlmaWVyLCBkaXJ0eTogZmFsc2UsIGxhc3RVc2VkOiAwLCBwaW5Db3VudDogMCwgc3RhdGU6IFwiY2xvc2VkXCJ9KVxuICB9XG5cbiAgaW5zcGVjdEFsbCgpIHtcbiAgICBjb25zdCBoYW5kbGVzID0gWy4uLnRoaXMuZW50cmllcy52YWx1ZXMoKV0ubWFwKChlbnRyeSkgPT4gdGhpcy5zbmFwc2hvdChlbnRyeSkpXG4gICAgcmV0dXJuIE9iamVjdC5mcmVlemUoe2hhbmRsZXM6IE9iamVjdC5mcmVlemUoaGFuZGxlcyksIG1heE9wZW5IYW5kbGVzOiB0aGlzLm1heE9wZW5IYW5kbGVzLCBvcGVuQ291bnQ6IGhhbmRsZXMuZmlsdGVyKCh7c3RhdGV9KSA9PiBzdGF0ZSA9PT0gXCJvcGVuXCIpLmxlbmd0aH0pXG4gIH1cblxuICByZXNldCgpIHsgdGhpcy5lbnRyaWVzLmNsZWFyKCkgfVxuXG4gIGFzeW5jIHdpdGhQaW4oLyoqIEB0eXBlIHtzdHJpbmd9ICovIGRhdGFiYXNlSWRlbnRpZmllciwgLyoqIEB0eXBlIHtpbXBvcnQoXCIuLi9jb25maWd1cmF0aW9uLXR5cGVzLmpzXCIpLkRhdGFiYXNlQ29uZmlndXJhdGlvblR5cGV9ICovIGRhdGFiYXNlQ29uZmlndXJhdGlvbiwgLyoqIEB0eXBlIHsoKSA9PiBQcm9taXNlPFJldHVyblR5cGU8dHlwZW9mIEpTT04ucGFyc2U+Pn0gKi8gY2FsbGJhY2spIHtcbiAgICB0aGlzLmFzc2VydFNxbGl0ZShkYXRhYmFzZUNvbmZpZ3VyYXRpb24pXG4gICAgY29uc3QgZW50cnkgPSBhd2FpdCB0aGlzLnNlcmlhbGl6ZShhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCBwaW5uZWRFbnRyeSA9IHRoaXMuZW50cnkoZGF0YWJhc2VJZGVudGlmaWVyLCBkYXRhYmFzZUNvbmZpZ3VyYXRpb24pXG4gICAgICBpZiAocGlubmVkRW50cnkuc3RhdGUgIT09IFwib3BlblwiKSBhd2FpdCB0aGlzLm9wZW5VbmxvY2tlZChwaW5uZWRFbnRyeSlcbiAgICAgIHBpbm5lZEVudHJ5LnBpbkNvdW50KytcbiAgICAgIHBpbm5lZEVudHJ5Lmxhc3RVc2VkID0gKyt0aGlzLnNlcXVlbmNlXG4gICAgICByZXR1cm4gcGlubmVkRW50cnlcbiAgICB9KVxuICAgIHRyeSB7XG4gICAgICByZXR1cm4gYXdhaXQgY2FsbGJhY2soKVxuICAgIH0gZmluYWxseSB7XG4gICAgICBhd2FpdCB0aGlzLnNlcmlhbGl6ZShhc3luYyAoKSA9PiB7IGVudHJ5LnBpbkNvdW50LS0gfSlcbiAgICB9XG4gIH1cblxuICBhc3luYyBkYXRhYmFzZU9wZXJhdGlvbigvKiogQHR5cGUge3N0cmluZ30gKi8gZGF0YWJhc2VJZGVudGlmaWVyLCAvKiogQHR5cGUge2ltcG9ydChcIi4uL2NvbmZpZ3VyYXRpb24tdHlwZXMuanNcIikuRGF0YWJhc2VDb25maWd1cmF0aW9uVHlwZX0gKi8gZGF0YWJhc2VDb25maWd1cmF0aW9uLCAvKiogQHR5cGUgeygpID0+IFByb21pc2U8UmV0dXJuVHlwZTx0eXBlb2YgSlNPTi5wYXJzZT4+fSAqLyBjYWxsYmFjaykge1xuICAgIGlmICghdGhpcy5lbnRyaWVzLmhhcyh0aGlzLmtleShkYXRhYmFzZUlkZW50aWZpZXIsIGRhdGFiYXNlQ29uZmlndXJhdGlvbikpKSByZXR1cm4gYXdhaXQgY2FsbGJhY2soKVxuXG4gICAgcmV0dXJuIGF3YWl0IHRoaXMud2l0aFBpbihkYXRhYmFzZUlkZW50aWZpZXIsIGRhdGFiYXNlQ29uZmlndXJhdGlvbiwgYXN5bmMgKCkgPT4ge1xuICAgICAgdHJ5IHtcbiAgICAgICAgcmV0dXJuIGF3YWl0IGNhbGxiYWNrKClcbiAgICAgIH0gZmluYWxseSB7XG4gICAgICAgIGNvbnN0IGRpcnR5ID0gdGhpcy5jb25maWd1cmF0aW9uLmdldERhdGFiYXNlUG9vbChkYXRhYmFzZUlkZW50aWZpZXIpLmNhcHR1cmVkQ29ubmVjdGlvbkhhc1BlbmRpbmdXcml0ZXMoZGF0YWJhc2VDb25maWd1cmF0aW9uKVxuICAgICAgICBhd2FpdCB0aGlzLnNlcmlhbGl6ZShhc3luYyAoKSA9PiB7XG4gICAgICAgICAgY29uc3QgZW50cnkgPSB0aGlzLmVudHJ5KGRhdGFiYXNlSWRlbnRpZmllciwgZGF0YWJhc2VDb25maWd1cmF0aW9uKVxuICAgICAgICAgIGVudHJ5LmRpcnR5IHx8PSBkaXJ0eVxuICAgICAgICAgIGVudHJ5Lmxhc3RVc2VkID0gKyt0aGlzLnNlcXVlbmNlXG4gICAgICAgIH0pXG4gICAgICB9XG4gICAgfSlcbiAgfVxuXG4gIGFzeW5jIG9wZW5VbmxvY2tlZCgvKiogQHR5cGUge0xpZmVjeWNsZUVudHJ5fSAqLyBlbnRyeSkge1xuICAgIGF3YWl0IHRoaXMuZXZpY3RGb3IoZW50cnkpXG4gICAgZW50cnkuc3RhdGUgPSBcIm9wZW5pbmdcIlxuICAgIHRyeSB7XG4gICAgICBhd2FpdCB0aGlzLmNvbmZpZ3VyYXRpb24uZ2V0RGF0YWJhc2VQb29sKGVudHJ5LmRhdGFiYXNlSWRlbnRpZmllcikub3BlbkNhcHR1cmVkQ29ubmVjdGlvbihlbnRyeS5kYXRhYmFzZUNvbmZpZ3VyYXRpb24pXG4gICAgICBlbnRyeS5zdGF0ZSA9IFwib3BlblwiXG4gICAgICBlbnRyeS5sYXN0VXNlZCA9ICsrdGhpcy5zZXF1ZW5jZVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBlbnRyeS5zdGF0ZSA9IFwiY2xvc2VkXCJcbiAgICAgIHRocm93IGVycm9yXG4gICAgfVxuICB9XG5cbiAgYXN5bmMgYXNzZXJ0Q2xvc2FibGUoLyoqIEB0eXBlIHtMaWZlY3ljbGVFbnRyeX0gKi8gZW50cnkpIHtcbiAgICBpZiAoZW50cnkucGluQ291bnQgPiAwKSB0aHJvdyBuZXcgRXJyb3IoXCJDYW5ub3QgY2xvc2UgYSBwaW5uZWQgZnJvbnRlbmQgdGVuYW50IFNRTGl0ZSBoYW5kbGVcIilcbiAgICBpZiAodGhpcy5jb25maWd1cmF0aW9uLmdldERhdGFiYXNlUG9vbChlbnRyeS5kYXRhYmFzZUlkZW50aWZpZXIpLmNhcHR1cmVkQ29ubmVjdGlvbkluVXNlKGVudHJ5LmRhdGFiYXNlQ29uZmlndXJhdGlvbikpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIkNhbm5vdCBjbG9zZSBhbiBpbi11c2UgZnJvbnRlbmQgdGVuYW50IFNRTGl0ZSBoYW5kbGVcIilcbiAgICB9XG4gIH1cblxuICBhc3luYyBldmljdEZvcigvKiogQHR5cGUge0xpZmVjeWNsZUVudHJ5fSAqLyBvcGVuaW5nRW50cnkpIHtcbiAgICBjb25zdCBvcGVuRW50cmllcyA9IFsuLi50aGlzLmVudHJpZXMudmFsdWVzKCldLmZpbHRlcigoZW50cnkpID0+IGVudHJ5ICE9PSBvcGVuaW5nRW50cnkgJiYgZW50cnkuc3RhdGUgPT09IFwib3BlblwiKVxuICAgIGlmIChvcGVuRW50cmllcy5sZW5ndGggPCB0aGlzLm1heE9wZW5IYW5kbGVzKSByZXR1cm5cbiAgICBjb25zdCBjYW5kaWRhdGVzID0gb3BlbkVudHJpZXNcbiAgICAgIC5maWx0ZXIoKGVudHJ5KSA9PiAhZW50cnkuZGlydHkgJiYgZW50cnkucGluQ291bnQgPT09IDAgJiYgIXRoaXMuY29uZmlndXJhdGlvbi5nZXREYXRhYmFzZVBvb2woZW50cnkuZGF0YWJhc2VJZGVudGlmaWVyKS5jYXB0dXJlZENvbm5lY3Rpb25JblVzZShlbnRyeS5kYXRhYmFzZUNvbmZpZ3VyYXRpb24pKVxuICAgICAgLnNvcnQoKGxlZnQsIHJpZ2h0KSA9PiBsZWZ0Lmxhc3RVc2VkIC0gcmlnaHQubGFzdFVzZWQpXG4gICAgY29uc3QgdmljdGltID0gY2FuZGlkYXRlc1swXVxuICAgIGlmICghdmljdGltKSB0aHJvdyBuZXcgRXJyb3IoYEZyb250ZW5kIHRlbmFudCBTUUxpdGUgaGFuZGxlIGNhcGFjaXR5ICR7dGhpcy5tYXhPcGVuSGFuZGxlc30gcmVhY2hlZDsgZXZlcnkgaGFuZGxlIGlzIGRpcnR5LCBwaW5uZWQsIG9yIGluIHVzZWApXG4gICAgYXdhaXQgdGhpcy5jb25maWd1cmF0aW9uLmdldERhdGFiYXNlUG9vbCh2aWN0aW0uZGF0YWJhc2VJZGVudGlmaWVyKS5jbG9zZUNhcHR1cmVkQ29ubmVjdGlvbih2aWN0aW0uZGF0YWJhc2VDb25maWd1cmF0aW9uKVxuICAgIHZpY3RpbS5zdGF0ZSA9IFwiY2xvc2VkXCJcbiAgICB0aGlzLmVudHJpZXMuZGVsZXRlKHRoaXMua2V5KHZpY3RpbS5kYXRhYmFzZUlkZW50aWZpZXIsIHZpY3RpbS5kYXRhYmFzZUNvbmZpZ3VyYXRpb24pKVxuICB9XG59XG4iXX0=
347
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZnJvbnRlbmQtdGVuYW50LXNxbGl0ZS1saWZlY3ljbGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvdGVuYW50cy9mcm9udGVuZC10ZW5hbnQtc3FsaXRlLWxpZmVjeWNsZS5qcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxZQUFZO0FBRVosdUZBQXVGO0FBQ3ZGOzs7Ozs7Ozs7OztHQVdHO0FBRUgsTUFBTSx3QkFBd0IsR0FBRyxFQUFFLENBQUE7QUFFbkMsTUFBTSxDQUFDLE9BQU8sT0FBTyw2QkFBNkI7SUFDaEQ7OztPQUdHO0lBQ0gsWUFBWSxFQUFDLGFBQWEsRUFBRSxjQUFjLEdBQUcsd0JBQXdCLEVBQUM7UUFDcEUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxhQUFhLENBQUMsY0FBYyxDQUFDLElBQUksY0FBYyxHQUFHLENBQUMsRUFBRSxDQUFDO1lBQ2hFLE1BQU0sSUFBSSxTQUFTLENBQUMscUVBQXFFLENBQUMsQ0FBQTtRQUM1RixDQUFDO1FBRUQsSUFBSSxDQUFDLGFBQWEsR0FBRyxhQUFhLENBQUE7UUFDbEMsSUFBSSxDQUFDLGNBQWMsR0FBRyxjQUFjLENBQUE7UUFDcEMsMENBQTBDO1FBQzFDLElBQUksQ0FBQyxPQUFPLEdBQUcsSUFBSSxHQUFHLEVBQUUsQ0FBQTtRQUN4QixJQUFJLENBQUMsUUFBUSxHQUFHLENBQUMsQ0FBQTtRQUNqQixJQUFJLENBQUMsS0FBSyxHQUFHLE9BQU8sQ0FBQyxPQUFPLEVBQUUsQ0FBQTtJQUNoQyxDQUFDO0lBRUQsR0FBRyxDQUFDLHFCQUFxQixDQUFDLGtCQUFrQixFQUFFLDRFQUE0RSxDQUFDLHFCQUFxQjtRQUM5SSxPQUFPLEdBQUcsa0JBQWtCLElBQUksSUFBSSxDQUFDLGFBQWEsQ0FBQyxlQUFlLENBQUMsa0JBQWtCLENBQUMsQ0FBQyx3QkFBd0IsQ0FBQyxxQkFBcUIsQ0FBQyxFQUFFLENBQUE7SUFDMUksQ0FBQztJQUVELFlBQVksQ0FBQyw0RUFBNEUsQ0FBQyxx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QyxrQkFBa0IsRUFBRSxNQUFNLENBQUMscUJBQXFCLENBQUMsQ0FBQyxDQUFBO1FBQzVILE1BQU0sQ0FBQyxLQUFLLEdBQUcsS0FBSyxDQUFBO1FBQ3BCLE1BQU0sQ0FBQyxnQkFBZ0IsR0FBRyxTQUFTLENBQUE7UUFDbkMsTUFBTSxDQUFDLEtBQUssR0FBRyxRQUFRLENBQUE7UUFDdkIsSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsa0JBQWtCLEVBQUUsTUFBTSxDQUFDLHFCQUFxQixDQUFDLENBQUMsQ0FBQTtJQUN4RixDQUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBAdHMtY2hlY2tcblxuLyoqIEB0eXBlZGVmIHtcImNsb3NlZFwiIHwgXCJjbG9zaW5nXCIgfCBcImRlbGV0aW5nXCIgfCBcIm9wZW5cIiB8IFwib3BlbmluZ1wifSBMaWZlY3ljbGVTdGF0ZSAqL1xuLyoqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBMaWZlY3ljbGVFbnRyeVxuICogQHByb3BlcnR5IHtpbXBvcnQoXCIuLi9jb25maWd1cmF0aW9uLXR5cGVzLmpzXCIpLkRhdGFiYXNlQ29uZmlndXJhdGlvblR5cGV9IGRhdGFiYXNlQ29uZmlndXJhdGlvbiAtIENhcHR1cmVkIHBoeXNpY2FsIGNvbmZpZ3VyYXRpb24uXG4gKiBAcHJvcGVydHkge3N0cmluZ30gZGF0YWJhc2VJZGVudGlmaWVyIC0gTG9naWNhbCBkYXRhYmFzZSBpZGVudGlmaWVyLlxuICogQHByb3BlcnR5IHtib29sZWFufSBkaXJ0eSAtIFdoZXRoZXIgZGVsYXllZCB3cml0ZXMgcmVtYWluLlxuICogQHByb3BlcnR5IHtudW1iZXJ9IGxhc3RVc2VkIC0gTW9ub3RvbmljIHJlY2VuY3kgc2VxdWVuY2UuXG4gKiBAcHJvcGVydHkge251bWJlcn0gcGluQ291bnQgLSBBY3RpdmUgc2NvcGVkIHBpbnMuXG4gKiBAcHJvcGVydHkge1Byb21pc2U8dm9pZD4gfCB1bmRlZmluZWR9IHJlYWRpbmVzc1Byb21pc2UgLSBJbi1wcm9ncmVzcyBzY2hlbWEgcmVhZGluZXNzLlxuICogQHByb3BlcnR5IHtib29sZWFufSByZWFkeSAtIFdoZXRoZXIgbWlncmF0aW9ucyBhbmQgbW9kZWwgbWV0YWRhdGEgYXJlIHJlYWR5LlxuICogQHByb3BlcnR5IHtzdHJpbmcgfCB1bmRlZmluZWR9IHNjaGVtYUdlbmVyYXRpb24gLSBSZWFkeSBvciBpbi1wcm9ncmVzcyBzY2hlbWEgZ2VuZXJhdGlvbi5cbiAqIEBwcm9wZXJ0eSB7TGlmZWN5Y2xlU3RhdGV9IHN0YXRlIC0gQ3VycmVudCBsaWZlY3ljbGUgc3RhdGUuXG4gKi9cblxuY29uc3QgREVGQVVMVF9NQVhfT1BFTl9IQU5ETEVTID0gMTBcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgRnJvbnRlbmRUZW5hbnRTcWxpdGVMaWZlY3ljbGUge1xuICAvKipcbiAgICogQ3JlYXRlcyBhIGxpZmVjeWNsZSBvd25lci5cbiAgICogQHBhcmFtIHt7Y29uZmlndXJhdGlvbjogaW1wb3J0KFwiLi4vY29uZmlndXJhdGlvbi5qc1wiKS5kZWZhdWx0LCBtYXhPcGVuSGFuZGxlcz86IG51bWJlcn19IGFyZ3MgLSBMaWZlY3ljbGUgYXJndW1lbnRzLlxuICAgKi9cbiAgY29uc3RydWN0b3Ioe2NvbmZpZ3VyYXRpb24sIG1heE9wZW5IYW5kbGVzID0gREVGQVVMVF9NQVhfT1BFTl9IQU5ETEVTfSkge1xuICAgIGlmICghTnVtYmVyLmlzU2FmZUludGVnZXIobWF4T3BlbkhhbmRsZXMpIHx8IG1heE9wZW5IYW5kbGVzIDwgMSkge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcImZyb250ZW5kVGVuYW50U3FsaXRlLm1heE9wZW5IYW5kbGVzIG11c3QgYmUgYSBwb3NpdGl2ZSBzYWZlIGludGVnZXJcIilcbiAgICB9XG5cbiAgICB0aGlzLmNvbmZpZ3VyYXRpb24gPSBjb25maWd1cmF0aW9uXG4gICAgdGhpcy5tYXhPcGVuSGFuZGxlcyA9IG1heE9wZW5IYW5kbGVzXG4gICAgLyoqIEB0eXBlIHtNYXA8c3RyaW5nLCBMaWZlY3ljbGVFbnRyeT59ICovXG4gICAgdGhpcy5lbnRyaWVzID0gbmV3IE1hcCgpXG4gICAgdGhpcy5zZXF1ZW5jZSA9IDBcbiAgICB0aGlzLnF1ZXVlID0gUHJvbWlzZS5yZXNvbHZlKClcbiAgfVxuXG4gIGtleSgvKiogQHR5cGUge3N0cmluZ30gKi8gZGF0YWJhc2VJZGVudGlmaWVyLCAvKiogQHR5cGUge2ltcG9ydChcIi4uL2NvbmZpZ3VyYXRpb24tdHlwZXMuanNcIikuRGF0YWJhc2VDb25maWd1cmF0aW9uVHlwZX0gKi8gZGF0YWJhc2VDb25maWd1cmF0aW9uKSB7XG4gICAgcmV0dXJuIGAke2RhdGFiYXNlSWRlbnRpZmllcn06JHt0aGlzLmNvbmZpZ3VyYXRpb24uZ2V0RGF0YWJhc2VQb29sKGRhdGFiYXNlSWRlbnRpZmllcikuZ2V0Q29uZmlndXJhdGlvblJldXNlS2V5KGRhdGFiYXNlQ29uZmlndXJhdGlvbil9YFxuICB9XG5cbiAgYXNzZXJ0U3FsaXRlKC8qKiBAdHlwZSB7aW1wb3J0KFwiLi4vY29uZmlndXJhdGlvbi10eXBlcy5qc1wiKS5EYXRhYmFzZUNvbmZpZ3VyYXRpb25UeXBlfSAqLyBkYXRhYmFzZUNvbmZpZ3VyYXRpb24pIHtcbiAgICBpZiAoZGF0YWJhc2VDb25maWd1cmF0aW9uLnR5cGUgIT09IFwic3FsaXRlXCIpIHRocm93IG5ldyBFcnJvcihcIkZyb250ZW5kIHRlbmFudCBsaWZlY3ljbGUgb25seSBzdXBwb3J0cyBTUUxpdGUgZGF0YWJhc2VzXCIpXG4gIH1cblxuICBhc3luYyBzZXJpYWxpemUoLyoqIEB0eXBlIHsoKSA9PiBQcm9taXNlPFJldHVyblR5cGU8dHlwZW9mIEpTT04ucGFyc2U+Pn0gKi8gY2FsbGJhY2spIHtcbiAgICBjb25zdCBwcmV2aW91cyA9IHRoaXMucXVldWVcbiAgICBsZXQgcmVsZWFzZSA9ICgpID0+IHt9XG4gICAgdGhpcy5xdWV1ZSA9IG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiB7IHJlbGVhc2UgPSAoKSA9PiByZXNvbHZlKHVuZGVmaW5lZCkgfSlcbiAgICBhd2FpdCBwcmV2aW91c1xuICAgIHRyeSB7XG4gICAgICByZXR1cm4gYXdhaXQgY2FsbGJhY2soKVxuICAgIH0gZmluYWxseSB7XG4gICAgICByZWxlYXNlKClcbiAgICB9XG4gIH1cblxuICBlbnRyeSgvKiogQHR5cGUge3N0cmluZ30gKi8gZGF0YWJhc2VJZGVudGlmaWVyLCAvKiogQHR5cGUge2ltcG9ydChcIi4uL2NvbmZpZ3VyYXRpb24tdHlwZXMuanNcIikuRGF0YWJhc2VDb25maWd1cmF0aW9uVHlwZX0gKi8gZGF0YWJhc2VDb25maWd1cmF0aW9uKSB7XG4gICAgY29uc3Qga2V5ID0gdGhpcy5rZXkoZGF0YWJhc2VJZGVudGlmaWVyLCBkYXRhYmFzZUNvbmZpZ3VyYXRpb24pXG4gICAgbGV0IGVudHJ5ID0gdGhpcy5lbnRyaWVzLmdldChrZXkpXG4gICAgaWYgKCFlbnRyeSkge1xuICAgICAgZW50cnkgPSB7XG4gICAgICAgIGRhdGFiYXNlQ29uZmlndXJhdGlvbixcbiAgICAgICAgZGF0YWJhc2VJZGVudGlmaWVyLFxuICAgICAgICBkaXJ0eTogZmFsc2UsXG4gICAgICAgIGxhc3RVc2VkOiAwLFxuICAgICAgICBwaW5Db3VudDogMCxcbiAgICAgICAgcmVhZGluZXNzUHJvbWlzZTogdW5kZWZpbmVkLFxuICAgICAgICByZWFkeTogZmFsc2UsXG4gICAgICAgIHNjaGVtYUdlbmVyYXRpb246IHVuZGVmaW5lZCxcbiAgICAgICAgc3RhdGU6IFwiY2xvc2VkXCJcbiAgICAgIH1cbiAgICAgIHRoaXMuZW50cmllcy5zZXQoa2V5LCBlbnRyeSlcbiAgICB9XG4gICAgcmV0dXJuIGVudHJ5XG4gIH1cblxuICBzbmFwc2hvdCgvKiogQHR5cGUge0xpZmVjeWNsZUVudHJ5fSAqLyBlbnRyeSkge1xuICAgIHJldHVybiBPYmplY3QuZnJlZXplKHtcbiAgICAgIGRhdGFiYXNlSWRlbnRpZmllcjogZW50cnkuZGF0YWJhc2VJZGVudGlmaWVyLFxuICAgICAgZGlydHk6IGVudHJ5LmRpcnR5LFxuICAgICAgbGFzdFVzZWQ6IGVudHJ5Lmxhc3RVc2VkLFxuICAgICAgcGluQ291bnQ6IGVudHJ5LnBpbkNvdW50LFxuICAgICAgcmVhZHk6IGVudHJ5LnJlYWR5LFxuICAgICAgc2NoZW1hR2VuZXJhdGlvbjogZW50cnkuc2NoZW1hR2VuZXJhdGlvbixcbiAgICAgIHN0YXRlOiBlbnRyeS5zdGF0ZVxuICAgIH0pXG4gIH1cblxuICBhc3luYyBvcGVuKC8qKiBAdHlwZSB7c3RyaW5nfSAqLyBkYXRhYmFzZUlkZW50aWZpZXIsIC8qKiBAdHlwZSB7aW1wb3J0KFwiLi4vY29uZmlndXJhdGlvbi10eXBlcy5qc1wiKS5EYXRhYmFzZUNvbmZpZ3VyYXRpb25UeXBlfSAqLyBkYXRhYmFzZUNvbmZpZ3VyYXRpb24pIHtcbiAgICB0aGlzLmFzc2VydFNxbGl0ZShkYXRhYmFzZUNvbmZpZ3VyYXRpb24pXG4gICAgcmV0dXJuIGF3YWl0IHRoaXMuc2VyaWFsaXplKGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IGVudHJ5ID0gdGhpcy5lbnRyeShkYXRhYmFzZUlkZW50aWZpZXIsIGRhdGFiYXNlQ29uZmlndXJhdGlvbilcbiAgICAgIGlmIChlbnRyeS5zdGF0ZSA9PT0gXCJvcGVuXCIpIHtcbiAgICAgICAgZW50cnkubGFzdFVzZWQgPSArK3RoaXMuc2VxdWVuY2VcbiAgICAgICAgcmV0dXJuIHRoaXMuc25hcHNob3QoZW50cnkpXG4gICAgICB9XG5cbiAgICAgIGF3YWl0IHRoaXMuZXZpY3RGb3IoZW50cnkpXG4gICAgICBlbnRyeS5zdGF0ZSA9IFwib3BlbmluZ1wiXG4gICAgICB0cnkge1xuICAgICAgICBhd2FpdCB0aGlzLmNvbmZpZ3VyYXRpb24uZ2V0RGF0YWJhc2VQb29sKGRhdGFiYXNlSWRlbnRpZmllcikub3BlbkNhcHR1cmVkQ29ubmVjdGlvbihkYXRhYmFzZUNvbmZpZ3VyYXRpb24pXG4gICAgICAgIGVudHJ5LnN0YXRlID0gXCJvcGVuXCJcbiAgICAgICAgZW50cnkubGFzdFVzZWQgPSArK3RoaXMuc2VxdWVuY2VcbiAgICAgICAgcmV0dXJuIHRoaXMuc25hcHNob3QoZW50cnkpXG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBlbnRyeS5zdGF0ZSA9IFwiY2xvc2VkXCJcbiAgICAgICAgdGhyb3cgZXJyb3JcbiAgICAgIH1cbiAgICB9KVxuICB9XG5cbiAgLyoqXG4gICAqIE9wZW5zIGFuZCBwcmVwYXJlcyBvbmUgY2FwdHVyZWQgcGh5c2ljYWwgdGVuYW50IGRhdGFiYXNlIGdlbmVyYXRpb24uIFRoZVxuICAgKiByZWFkaW5lc3MgY2FsbGJhY2sgcnVucyBvdXRzaWRlIHRoZSBsaWZlY3ljbGUgYm9va2tlZXBpbmcgbG9jaywgc28gZGlzdGluY3RcbiAgICogdGVuYW50IGRhdGFiYXNlcyBjYW4gbWlncmF0ZSBjb25jdXJyZW50bHkgd2hpbGUgbWF0Y2hpbmcgY2FsbGVycyBzaGFyZSBvbmVcbiAgICogcHJvbWlzZS5cbiAgICogQHBhcmFtIHtzdHJpbmd9IGRhdGFiYXNlSWRlbnRpZmllciAtIExvZ2ljYWwgZGF0YWJhc2UgaWRlbnRpZmllci5cbiAgICogQHBhcmFtIHtpbXBvcnQoXCIuLi9jb25maWd1cmF0aW9uLXR5cGVzLmpzXCIpLkRhdGFiYXNlQ29uZmlndXJhdGlvblR5cGV9IGRhdGFiYXNlQ29uZmlndXJhdGlvbiAtIENhcHR1cmVkIHBoeXNpY2FsIGNvbmZpZ3VyYXRpb24uXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBzY2hlbWFHZW5lcmF0aW9uIC0gQXBwbGljYXRpb24gc2NoZW1hIGdlbmVyYXRpb24uXG4gICAqIEBwYXJhbSB7KCkgPT4gUHJvbWlzZTx2b2lkPn0gY2FsbGJhY2sgLSBNaWdyYXRpb24gYW5kIG1ldGFkYXRhIGluaXRpYWxpemF0aW9uLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxSZWFkb25seTxSZXR1cm5UeXBlPEZyb250ZW5kVGVuYW50U3FsaXRlTGlmZWN5Y2xlW1wic25hcHNob3RcIl0+Pj59IC0gUmVhZHkgbGlmZWN5Y2xlIHNuYXBzaG90LlxuICAgKi9cbiAgYXN5bmMgaW5pdGlhbGl6ZShkYXRhYmFzZUlkZW50aWZpZXIsIGRhdGFiYXNlQ29uZmlndXJhdGlvbiwgc2NoZW1hR2VuZXJhdGlvbiwgY2FsbGJhY2spIHtcbiAgICB0aGlzLmFzc2VydFNxbGl0ZShkYXRhYmFzZUNvbmZpZ3VyYXRpb24pXG4gICAgaWYgKCFkYXRhYmFzZUNvbmZpZ3VyYXRpb24udGVuYW50T25seSkgdGhyb3cgbmV3IEVycm9yKFwiRnJvbnRlbmQgdGVuYW50IGRhdGFiYXNlIGluaXRpYWxpemF0aW9uIHJlcXVpcmVzIGEgdGVuYW50LW9ubHkgU1FMaXRlIGRhdGFiYXNlXCIpXG4gICAgaWYgKHR5cGVvZiBzY2hlbWFHZW5lcmF0aW9uICE9PSBcInN0cmluZ1wiIHx8IHNjaGVtYUdlbmVyYXRpb24ubGVuZ3RoID09PSAwKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFwiRnJvbnRlbmQgdGVuYW50IGRhdGFiYXNlIGluaXRpYWxpemF0aW9uIHJlcXVpcmVzIGEgbm9uLWVtcHR5IHNjaGVtYUdlbmVyYXRpb25cIilcbiAgICB9XG5cbiAgICBjb25zdCByZWFkaW5lc3MgPSBhd2FpdCB0aGlzLnNlcmlhbGl6ZShhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCBlbnRyeSA9IHRoaXMuZW50cnkoZGF0YWJhc2VJZGVudGlmaWVyLCBkYXRhYmFzZUNvbmZpZ3VyYXRpb24pXG5cbiAgICAgIGlmIChlbnRyeS5yZWFkaW5lc3NQcm9taXNlKSB7XG4gICAgICAgIGlmIChlbnRyeS5zY2hlbWFHZW5lcmF0aW9uICE9PSBzY2hlbWFHZW5lcmF0aW9uKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBGcm9udGVuZCB0ZW5hbnQgZGF0YWJhc2UgaXMgYWxyZWFkeSBpbml0aWFsaXppbmcgc2NoZW1hIGdlbmVyYXRpb24gJHtKU09OLnN0cmluZ2lmeShlbnRyeS5zY2hlbWFHZW5lcmF0aW9uKX07IGNhbm5vdCBpbml0aWFsaXplIG1pc21hdGNoZWQgZ2VuZXJhdGlvbiAke0pTT04uc3RyaW5naWZ5KHNjaGVtYUdlbmVyYXRpb24pfWApXG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4ge2VudHJ5LCBwcm9taXNlOiBlbnRyeS5yZWFkaW5lc3NQcm9taXNlfVxuICAgICAgfVxuICAgICAgaWYgKGVudHJ5LnJlYWR5ICYmIGVudHJ5LnNjaGVtYUdlbmVyYXRpb24gPT09IHNjaGVtYUdlbmVyYXRpb24pIHtcbiAgICAgICAgcmV0dXJuIHtlbnRyeSwgcHJvbWlzZTogUHJvbWlzZS5yZXNvbHZlKCl9XG4gICAgICB9XG4gICAgICBpZiAoZW50cnkuc2NoZW1hR2VuZXJhdGlvbiAmJiBlbnRyeS5zY2hlbWFHZW5lcmF0aW9uICE9PSBzY2hlbWFHZW5lcmF0aW9uICYmIChlbnRyeS5waW5Db3VudCA+IDAgfHwgdGhpcy5jb25maWd1cmF0aW9uLmdldERhdGFiYXNlUG9vbChkYXRhYmFzZUlkZW50aWZpZXIpLmNhcHR1cmVkQ29ubmVjdGlvbkluVXNlKGRhdGFiYXNlQ29uZmlndXJhdGlvbikpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgQ2Fubm90IHJlcGxhY2UgZnJvbnRlbmQgdGVuYW50IHNjaGVtYSBnZW5lcmF0aW9uICR7SlNPTi5zdHJpbmdpZnkoZW50cnkuc2NoZW1hR2VuZXJhdGlvbil9IHdoaWxlIGl0cyBwaHlzaWNhbCBkYXRhYmFzZSBpcyBpbiB1c2VgKVxuICAgICAgfVxuICAgICAgaWYgKGVudHJ5LnN0YXRlICE9PSBcIm9wZW5cIikgYXdhaXQgdGhpcy5vcGVuVW5sb2NrZWQoZW50cnkpXG4gICAgICBpZiAoZW50cnkuc2NoZW1hR2VuZXJhdGlvbiAmJiBlbnRyeS5zY2hlbWFHZW5lcmF0aW9uICE9PSBzY2hlbWFHZW5lcmF0aW9uKSB7XG4gICAgICAgIHRoaXMuY29uZmlndXJhdGlvbi5jbGVhclJlY29yZE1ldGFkYXRhRm9yRGF0YWJhc2VJZGVudGl0eSh0aGlzLmtleShkYXRhYmFzZUlkZW50aWZpZXIsIGRhdGFiYXNlQ29uZmlndXJhdGlvbikpXG4gICAgICB9XG5cbiAgICAgIGVudHJ5LnJlYWR5ID0gZmFsc2VcbiAgICAgIGVudHJ5LnNjaGVtYUdlbmVyYXRpb24gPSBzY2hlbWFHZW5lcmF0aW9uXG4gICAgICBlbnRyeS5waW5Db3VudCsrXG4gICAgICBjb25zdCBwcm9taXNlID0gUHJvbWlzZS5yZXNvbHZlKCkudGhlbihjYWxsYmFjaylcblxuICAgICAgZW50cnkucmVhZGluZXNzUHJvbWlzZSA9IHByb21pc2VcblxuICAgICAgcmV0dXJuIHtlbnRyeSwgcHJvbWlzZX1cbiAgICB9KVxuXG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IHJlYWRpbmVzcy5wcm9taXNlXG4gICAgICBhd2FpdCB0aGlzLnNlcmlhbGl6ZShhc3luYyAoKSA9PiB7XG4gICAgICAgIGlmIChyZWFkaW5lc3MuZW50cnkucmVhZGluZXNzUHJvbWlzZSA9PT0gcmVhZGluZXNzLnByb21pc2UpIHtcbiAgICAgICAgICByZWFkaW5lc3MuZW50cnkucmVhZGluZXNzUHJvbWlzZSA9IHVuZGVmaW5lZFxuICAgICAgICAgIHJlYWRpbmVzcy5lbnRyeS5yZWFkeSA9IHRydWVcbiAgICAgICAgICByZWFkaW5lc3MuZW50cnkucGluQ291bnQtLVxuICAgICAgICB9XG4gICAgICB9KVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBhd2FpdCB0aGlzLnNlcmlhbGl6ZShhc3luYyAoKSA9PiB7XG4gICAgICAgIGlmIChyZWFkaW5lc3MuZW50cnkucmVhZGluZXNzUHJvbWlzZSA9PT0gcmVhZGluZXNzLnByb21pc2UpIHtcbiAgICAgICAgICByZWFkaW5lc3MuZW50cnkucmVhZGluZXNzUHJvbWlzZSA9IHVuZGVmaW5lZFxuICAgICAgICAgIHJlYWRpbmVzcy5lbnRyeS5yZWFkeSA9IGZhbHNlXG4gICAgICAgICAgcmVhZGluZXNzLmVudHJ5LnBpbkNvdW50LS1cbiAgICAgICAgfVxuICAgICAgfSlcbiAgICAgIHRocm93IGVycm9yXG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuc25hcHNob3QocmVhZGluZXNzLmVudHJ5KVxuICB9XG5cbiAgYXN5bmMgZmx1c2goLyoqIEB0eXBlIHtzdHJpbmd9ICovIGRhdGFiYXNlSWRlbnRpZmllciwgLyoqIEB0eXBlIHtpbXBvcnQoXCIuLi9jb25maWd1cmF0aW9uLXR5cGVzLmpzXCIpLkRhdGFiYXNlQ29uZmlndXJhdGlvblR5cGV9ICovIGRhdGFiYXNlQ29uZmlndXJhdGlvbikge1xuICAgIHRoaXMuYXNzZXJ0U3FsaXRlKGRhdGFiYXNlQ29uZmlndXJhdGlvbilcbiAgICByZXR1cm4gYXdhaXQgdGhpcy5zZXJpYWxpemUoYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgZW50cnkgPSB0aGlzLmVudHJ5KGRhdGFiYXNlSWRlbnRpZmllciwgZGF0YWJhc2VDb25maWd1cmF0aW9uKVxuICAgICAgaWYgKGVudHJ5LnN0YXRlICE9PSBcIm9wZW5cIikgYXdhaXQgdGhpcy5vcGVuVW5sb2NrZWQoZW50cnkpXG4gICAgICBhd2FpdCB0aGlzLmNvbmZpZ3VyYXRpb24uZ2V0RGF0YWJhc2VQb29sKGRhdGFiYXNlSWRlbnRpZmllcikuZmx1c2hDYXB0dXJlZENvbm5lY3Rpb24oZGF0YWJhc2VDb25maWd1cmF0aW9uKVxuICAgICAgZW50cnkuZGlydHkgPSBmYWxzZVxuICAgICAgZW50cnkubGFzdFVzZWQgPSArK3RoaXMuc2VxdWVuY2VcbiAgICAgIHJldHVybiB0aGlzLnNuYXBzaG90KGVudHJ5KVxuICAgIH0pXG4gIH1cblxuICBhc3luYyBjbG9zZSgvKiogQHR5cGUge3N0cmluZ30gKi8gZGF0YWJhc2VJZGVudGlmaWVyLCAvKiogQHR5cGUge2ltcG9ydChcIi4uL2NvbmZpZ3VyYXRpb24tdHlwZXMuanNcIikuRGF0YWJhc2VDb25maWd1cmF0aW9uVHlwZX0gKi8gZGF0YWJhc2VDb25maWd1cmF0aW9uLCB7Zmx1c2ggPSBmYWxzZX0gPSB7fSkge1xuICAgIHRoaXMuYXNzZXJ0U3FsaXRlKGRhdGFiYXNlQ29uZmlndXJhdGlvbilcbiAgICByZXR1cm4gYXdhaXQgdGhpcy5zZXJpYWxpemUoYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgZW50cnkgPSB0aGlzLmVudHJ5KGRhdGFiYXNlSWRlbnRpZmllciwgZGF0YWJhc2VDb25maWd1cmF0aW9uKVxuICAgICAgaWYgKGVudHJ5LnN0YXRlID09PSBcImNsb3NlZFwiKSByZXR1cm4gdGhpcy5zbmFwc2hvdChlbnRyeSlcbiAgICAgIGF3YWl0IHRoaXMuYXNzZXJ0Q2xvc2FibGUoZW50cnkpXG4gICAgICBpZiAoZW50cnkuZGlydHkgJiYgIWZsdXNoKSB0aHJvdyBuZXcgRXJyb3IoXCJDYW5ub3QgY2xvc2UgYSBkaXJ0eSBmcm9udGVuZCB0ZW5hbnQgU1FMaXRlIGhhbmRsZSB3aXRob3V0IGZsdXNoOiB0cnVlXCIpXG4gICAgICBlbnRyeS5zdGF0ZSA9IFwiY2xvc2luZ1wiXG4gICAgICB0cnkge1xuICAgICAgICBpZiAoZmx1c2gpIGF3YWl0IHRoaXMuY29uZmlndXJhdGlvbi5nZXREYXRhYmFzZVBvb2woZGF0YWJhc2VJZGVudGlmaWVyKS5mbHVzaENhcHR1cmVkQ29ubmVjdGlvbihkYXRhYmFzZUNvbmZpZ3VyYXRpb24pXG4gICAgICAgIGF3YWl0IHRoaXMuY29uZmlndXJhdGlvbi5nZXREYXRhYmFzZVBvb2woZGF0YWJhc2VJZGVudGlmaWVyKS5jbG9zZUNhcHR1cmVkQ29ubmVjdGlvbihkYXRhYmFzZUNvbmZpZ3VyYXRpb24pXG4gICAgICAgIHRoaXMuY29uZmlndXJhdGlvbi5jbGVhclJlY29yZE1ldGFkYXRhRm9yRGF0YWJhc2VJZGVudGl0eSh0aGlzLmtleShkYXRhYmFzZUlkZW50aWZpZXIsIGRhdGFiYXNlQ29uZmlndXJhdGlvbikpXG4gICAgICAgIGVudHJ5LmRpcnR5ID0gZmFsc2VcbiAgICAgICAgZW50cnkucmVhZHkgPSBmYWxzZVxuICAgICAgICBlbnRyeS5zY2hlbWFHZW5lcmF0aW9uID0gdW5kZWZpbmVkXG4gICAgICAgIGVudHJ5LnN0YXRlID0gXCJjbG9zZWRcIlxuICAgICAgICB0aGlzLmVudHJpZXMuZGVsZXRlKHRoaXMua2V5KGRhdGFiYXNlSWRlbnRpZmllciwgZGF0YWJhc2VDb25maWd1cmF0aW9uKSlcbiAgICAgICAgcmV0dXJuIHRoaXMuc25hcHNob3QoZW50cnkpXG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBlbnRyeS5zdGF0ZSA9IFwib3BlblwiXG4gICAgICAgIHRocm93IGVycm9yXG4gICAgICB9XG4gICAgfSlcbiAgfVxuXG4gIGFzeW5jIGRlbGV0ZSgvKiogQHR5cGUge3N0cmluZ30gKi8gZGF0YWJhc2VJZGVudGlmaWVyLCAvKiogQHR5cGUge2ltcG9ydChcIi4uL2NvbmZpZ3VyYXRpb24tdHlwZXMuanNcIikuRGF0YWJhc2VDb25maWd1cmF0aW9uVHlwZX0gKi8gZGF0YWJhc2VDb25maWd1cmF0aW9uKSB7XG4gICAgdGhpcy5hc3NlcnRTcWxpdGUoZGF0YWJhc2VDb25maWd1cmF0aW9uKVxuICAgIHJldHVybiBhd2FpdCB0aGlzLnNlcmlhbGl6ZShhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCBlbnRyeSA9IHRoaXMuZW50cnkoZGF0YWJhc2VJZGVudGlmaWVyLCBkYXRhYmFzZUNvbmZpZ3VyYXRpb24pXG4gICAgICBhd2FpdCB0aGlzLmFzc2VydENsb3NhYmxlKGVudHJ5KVxuICAgICAgZW50cnkuc3RhdGUgPSBcImRlbGV0aW5nXCJcbiAgICAgIHRyeSB7XG4gICAgICAgIGF3YWl0IHRoaXMuY29uZmlndXJhdGlvbi5nZXREYXRhYmFzZVBvb2woZGF0YWJhc2VJZGVudGlmaWVyKS5kZWxldGVDYXB0dXJlZERhdGFiYXNlKGRhdGFiYXNlQ29uZmlndXJhdGlvbilcbiAgICAgICAgdGhpcy5jb25maWd1cmF0aW9uLmNsZWFyUmVjb3JkTWV0YWRhdGFGb3JEYXRhYmFzZUlkZW50aXR5KHRoaXMua2V5KGRhdGFiYXNlSWRlbnRpZmllciwgZGF0YWJhc2VDb25maWd1cmF0aW9uKSlcbiAgICAgICAgZW50cnkuZGlydHkgPSBmYWxzZVxuICAgICAgICBlbnRyeS5yZWFkeSA9IGZhbHNlXG4gICAgICAgIGVudHJ5LnNjaGVtYUdlbmVyYXRpb24gPSB1bmRlZmluZWRcbiAgICAgICAgZW50cnkuc3RhdGUgPSBcImNsb3NlZFwiXG4gICAgICAgIHRoaXMuZW50cmllcy5kZWxldGUodGhpcy5rZXkoZGF0YWJhc2VJZGVudGlmaWVyLCBkYXRhYmFzZUNvbmZpZ3VyYXRpb24pKVxuICAgICAgICByZXR1cm4gdGhpcy5zbmFwc2hvdChlbnRyeSlcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIHRoaXMuY29uZmlndXJhdGlvbi5jbGVhclJlY29yZE1ldGFkYXRhRm9yRGF0YWJhc2VJZGVudGl0eSh0aGlzLmtleShkYXRhYmFzZUlkZW50aWZpZXIsIGRhdGFiYXNlQ29uZmlndXJhdGlvbikpXG4gICAgICAgIGVudHJ5LnJlYWR5ID0gZmFsc2VcbiAgICAgICAgZW50cnkuc3RhdGUgPSBcImNsb3NlZFwiXG4gICAgICAgIHRocm93IGVycm9yXG4gICAgICB9XG4gICAgfSlcbiAgfVxuXG4gIGluc3BlY3QoLyoqIEB0eXBlIHtzdHJpbmd9ICovIGRhdGFiYXNlSWRlbnRpZmllciwgLyoqIEB0eXBlIHtpbXBvcnQoXCIuLi9jb25maWd1cmF0aW9uLXR5cGVzLmpzXCIpLkRhdGFiYXNlQ29uZmlndXJhdGlvblR5cGV9ICovIGRhdGFiYXNlQ29uZmlndXJhdGlvbikge1xuICAgIHRoaXMuYXNzZXJ0U3FsaXRlKGRhdGFiYXNlQ29uZmlndXJhdGlvbilcbiAgICBjb25zdCBlbnRyeSA9IHRoaXMuZW50cmllcy5nZXQodGhpcy5rZXkoZGF0YWJhc2VJZGVudGlmaWVyLCBkYXRhYmFzZUNvbmZpZ3VyYXRpb24pKVxuICAgIHJldHVybiBlbnRyeSA/IHRoaXMuc25hcHNob3QoZW50cnkpIDogT2JqZWN0LmZyZWV6ZSh7ZGF0YWJhc2VJZGVudGlmaWVyLCBkaXJ0eTogZmFsc2UsIGxhc3RVc2VkOiAwLCBwaW5Db3VudDogMCwgcmVhZHk6IGZhbHNlLCBzY2hlbWFHZW5lcmF0aW9uOiB1bmRlZmluZWQsIHN0YXRlOiBcImNsb3NlZFwifSlcbiAgfVxuXG4gIGluc3BlY3RBbGwoKSB7XG4gICAgY29uc3QgaGFuZGxlcyA9IFsuLi50aGlzLmVudHJpZXMudmFsdWVzKCldLm1hcCgoZW50cnkpID0+IHRoaXMuc25hcHNob3QoZW50cnkpKVxuICAgIHJldHVybiBPYmplY3QuZnJlZXplKHtoYW5kbGVzOiBPYmplY3QuZnJlZXplKGhhbmRsZXMpLCBtYXhPcGVuSGFuZGxlczogdGhpcy5tYXhPcGVuSGFuZGxlcywgb3BlbkNvdW50OiBoYW5kbGVzLmZpbHRlcigoe3N0YXRlfSkgPT4gc3RhdGUgPT09IFwib3BlblwiKS5sZW5ndGh9KVxuICB9XG5cbiAgcmVzZXQoKSB7XG4gICAgZm9yIChjb25zdCBlbnRyeSBvZiB0aGlzLmVudHJpZXMudmFsdWVzKCkpIHtcbiAgICAgIHRoaXMuY29uZmlndXJhdGlvbi5jbGVhclJlY29yZE1ldGFkYXRhRm9yRGF0YWJhc2VJZGVudGl0eSh0aGlzLmtleShlbnRyeS5kYXRhYmFzZUlkZW50aWZpZXIsIGVudHJ5LmRhdGFiYXNlQ29uZmlndXJhdGlvbikpXG4gICAgfVxuXG4gICAgdGhpcy5lbnRyaWVzLmNsZWFyKClcbiAgfVxuXG4gIGFzeW5jIHdpdGhQaW4oLyoqIEB0eXBlIHtzdHJpbmd9ICovIGRhdGFiYXNlSWRlbnRpZmllciwgLyoqIEB0eXBlIHtpbXBvcnQoXCIuLi9jb25maWd1cmF0aW9uLXR5cGVzLmpzXCIpLkRhdGFiYXNlQ29uZmlndXJhdGlvblR5cGV9ICovIGRhdGFiYXNlQ29uZmlndXJhdGlvbiwgLyoqIEB0eXBlIHsoKSA9PiBQcm9taXNlPFJldHVyblR5cGU8dHlwZW9mIEpTT04ucGFyc2U+Pn0gKi8gY2FsbGJhY2spIHtcbiAgICB0aGlzLmFzc2VydFNxbGl0ZShkYXRhYmFzZUNvbmZpZ3VyYXRpb24pXG4gICAgY29uc3QgZW50cnkgPSBhd2FpdCB0aGlzLnNlcmlhbGl6ZShhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCBwaW5uZWRFbnRyeSA9IHRoaXMuZW50cnkoZGF0YWJhc2VJZGVudGlmaWVyLCBkYXRhYmFzZUNvbmZpZ3VyYXRpb24pXG4gICAgICBpZiAocGlubmVkRW50cnkuc3RhdGUgIT09IFwib3BlblwiKSBhd2FpdCB0aGlzLm9wZW5VbmxvY2tlZChwaW5uZWRFbnRyeSlcbiAgICAgIHBpbm5lZEVudHJ5LnBpbkNvdW50KytcbiAgICAgIHBpbm5lZEVudHJ5Lmxhc3RVc2VkID0gKyt0aGlzLnNlcXVlbmNlXG4gICAgICByZXR1cm4gcGlubmVkRW50cnlcbiAgICB9KVxuICAgIHRyeSB7XG4gICAgICByZXR1cm4gYXdhaXQgY2FsbGJhY2soKVxuICAgIH0gZmluYWxseSB7XG4gICAgICBhd2FpdCB0aGlzLnNlcmlhbGl6ZShhc3luYyAoKSA9PiB7IGVudHJ5LnBpbkNvdW50LS0gfSlcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQXRvbWljYWxseSB2YWxpZGF0ZXMgcmVhZGluZXNzLCBjYXB0dXJlcyB0aGUgc2NoZW1hIGdlbmVyYXRpb24sIGFuZCBwaW5zXG4gICAqIG9uZSBsaWZlY3ljbGUgZW50cnkgYmVmb3JlIHN0YXJ0aW5nIGRhdGFiYXNlIHdvcmsuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBkYXRhYmFzZUlkZW50aWZpZXIgLSBMb2dpY2FsIGRhdGFiYXNlIGlkZW50aWZpZXIuXG4gICAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vY29uZmlndXJhdGlvbi10eXBlcy5qc1wiKS5EYXRhYmFzZUNvbmZpZ3VyYXRpb25UeXBlfSBkYXRhYmFzZUNvbmZpZ3VyYXRpb24gLSBDYXB0dXJlZCBwaHlzaWNhbCBjb25maWd1cmF0aW9uLlxuICAgKiBAcGFyYW0ge3tyZXF1aXJlUmVhZHk6IGJvb2xlYW4sIHNjaGVtYUdlbmVyYXRpb24/OiBzdHJpbmd9fSBvcHRpb25zIC0gT3BlcmF0aW9uIHJlYWRpbmVzcyByZXF1aXJlbWVudHMuXG4gICAqIEBwYXJhbSB7KHNjaGVtYUdlbmVyYXRpb246IHN0cmluZyB8IHVuZGVmaW5lZCkgPT4gUHJvbWlzZTxSZXR1cm5UeXBlPHR5cGVvZiBKU09OLnBhcnNlPj59IGNhbGxiYWNrIC0gUGlubmVkIG9wZXJhdGlvbiBjYWxsYmFjay5cbiAgICogQHJldHVybnMge1Byb21pc2U8UmV0dXJuVHlwZTx0eXBlb2YgSlNPTi5wYXJzZT4+fSAtIE9wZXJhdGlvbiByZXN1bHQuXG4gICAqL1xuICBhc3luYyBkYXRhYmFzZU9wZXJhdGlvbihkYXRhYmFzZUlkZW50aWZpZXIsIGRhdGFiYXNlQ29uZmlndXJhdGlvbiwge3JlcXVpcmVSZWFkeSwgc2NoZW1hR2VuZXJhdGlvbn0sIGNhbGxiYWNrKSB7XG4gICAgaWYgKGRhdGFiYXNlQ29uZmlndXJhdGlvbi50eXBlICE9PSBcInNxbGl0ZVwiKSByZXR1cm4gYXdhaXQgY2FsbGJhY2soc2NoZW1hR2VuZXJhdGlvbilcblxuICAgIGNvbnN0IGVudHJ5ID0gYXdhaXQgdGhpcy5zZXJpYWxpemUoYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3Qgb3BlcmF0aW9uRW50cnkgPSB0aGlzLmVudHJpZXMuZ2V0KHRoaXMua2V5KGRhdGFiYXNlSWRlbnRpZmllciwgZGF0YWJhc2VDb25maWd1cmF0aW9uKSlcblxuICAgICAgaWYgKHJlcXVpcmVSZWFkeSAmJiBkYXRhYmFzZUNvbmZpZ3VyYXRpb24udGVuYW50T25seSAmJiBkYXRhYmFzZUNvbmZpZ3VyYXRpb24ubWlncmF0aW9ucyAmJiAhb3BlcmF0aW9uRW50cnk/LnJlYWR5KSB7XG4gICAgICAgIGNvbnN0IGdlbmVyYXRpb24gPSBvcGVyYXRpb25FbnRyeT8uc2NoZW1hR2VuZXJhdGlvbiA/IGAgZm9yIHNjaGVtYSBnZW5lcmF0aW9uICR7SlNPTi5zdHJpbmdpZnkob3BlcmF0aW9uRW50cnkuc2NoZW1hR2VuZXJhdGlvbil9YCA6IFwiXCJcblxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEZyb250ZW5kIHRlbmFudCBkYXRhYmFzZSAke0pTT04uc3RyaW5naWZ5KGRhdGFiYXNlSWRlbnRpZmllcil9IGlzIG5vdCByZWFkeSR7Z2VuZXJhdGlvbn1gKVxuICAgICAgfVxuICAgICAgaWYgKCFvcGVyYXRpb25FbnRyeSkgcmV0dXJuIHVuZGVmaW5lZFxuICAgICAgaWYgKHNjaGVtYUdlbmVyYXRpb24gJiYgb3BlcmF0aW9uRW50cnkuc2NoZW1hR2VuZXJhdGlvbiAmJiBzY2hlbWFHZW5lcmF0aW9uICE9PSBvcGVyYXRpb25FbnRyeS5zY2hlbWFHZW5lcmF0aW9uKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgRnJvbnRlbmQgdGVuYW50IGRhdGFiYXNlICR7SlNPTi5zdHJpbmdpZnkoZGF0YWJhc2VJZGVudGlmaWVyKX0gaXMgb24gc2NoZW1hIGdlbmVyYXRpb24gJHtKU09OLnN0cmluZ2lmeShvcGVyYXRpb25FbnRyeS5zY2hlbWFHZW5lcmF0aW9uKX0sIG5vdCAke0pTT04uc3RyaW5naWZ5KHNjaGVtYUdlbmVyYXRpb24pfWApXG4gICAgICB9XG4gICAgICBpZiAob3BlcmF0aW9uRW50cnkuc3RhdGUgIT09IFwib3BlblwiKSBhd2FpdCB0aGlzLm9wZW5VbmxvY2tlZChvcGVyYXRpb25FbnRyeSlcblxuICAgICAgb3BlcmF0aW9uRW50cnkucGluQ291bnQrK1xuICAgICAgb3BlcmF0aW9uRW50cnkubGFzdFVzZWQgPSArK3RoaXMuc2VxdWVuY2VcblxuICAgICAgcmV0dXJuIG9wZXJhdGlvbkVudHJ5XG4gICAgfSlcbiAgICBjb25zdCBvcGVyYXRpb25TY2hlbWFHZW5lcmF0aW9uID0gc2NoZW1hR2VuZXJhdGlvbiB8fCBlbnRyeT8uc2NoZW1hR2VuZXJhdGlvblxuXG4gICAgaWYgKCFlbnRyeSkgcmV0dXJuIGF3YWl0IGNhbGxiYWNrKG9wZXJhdGlvblNjaGVtYUdlbmVyYXRpb24pXG5cbiAgICB0cnkge1xuICAgICAgcmV0dXJuIGF3YWl0IGNhbGxiYWNrKG9wZXJhdGlvblNjaGVtYUdlbmVyYXRpb24pXG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIGNvbnN0IGRpcnR5ID0gdGhpcy5jb25maWd1cmF0aW9uLmdldERhdGFiYXNlUG9vbChkYXRhYmFzZUlkZW50aWZpZXIpLmNhcHR1cmVkQ29ubmVjdGlvbkhhc1BlbmRpbmdXcml0ZXMoZGF0YWJhc2VDb25maWd1cmF0aW9uKVxuXG4gICAgICBhd2FpdCB0aGlzLnNlcmlhbGl6ZShhc3luYyAoKSA9PiB7XG4gICAgICAgIGVudHJ5LmRpcnR5IHx8PSBkaXJ0eVxuICAgICAgICBlbnRyeS5sYXN0VXNlZCA9ICsrdGhpcy5zZXF1ZW5jZVxuICAgICAgICBlbnRyeS5waW5Db3VudC0tXG4gICAgICB9KVxuICAgIH1cbiAgfVxuXG4gIGFzeW5jIG9wZW5VbmxvY2tlZCgvKiogQHR5cGUge0xpZmVjeWNsZUVudHJ5fSAqLyBlbnRyeSkge1xuICAgIGF3YWl0IHRoaXMuZXZpY3RGb3IoZW50cnkpXG4gICAgZW50cnkuc3RhdGUgPSBcIm9wZW5pbmdcIlxuICAgIHRyeSB7XG4gICAgICBhd2FpdCB0aGlzLmNvbmZpZ3VyYXRpb24uZ2V0RGF0YWJhc2VQb29sKGVudHJ5LmRhdGFiYXNlSWRlbnRpZmllcikub3BlbkNhcHR1cmVkQ29ubmVjdGlvbihlbnRyeS5kYXRhYmFzZUNvbmZpZ3VyYXRpb24pXG4gICAgICBlbnRyeS5zdGF0ZSA9IFwib3BlblwiXG4gICAgICBlbnRyeS5sYXN0VXNlZCA9ICsrdGhpcy5zZXF1ZW5jZVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBlbnRyeS5zdGF0ZSA9IFwiY2xvc2VkXCJcbiAgICAgIHRocm93IGVycm9yXG4gICAgfVxuICB9XG5cbiAgYXN5bmMgYXNzZXJ0Q2xvc2FibGUoLyoqIEB0eXBlIHtMaWZlY3ljbGVFbnRyeX0gKi8gZW50cnkpIHtcbiAgICBpZiAoZW50cnkucGluQ291bnQgPiAwKSB0aHJvdyBuZXcgRXJyb3IoXCJDYW5ub3QgY2xvc2UgYSBwaW5uZWQgZnJvbnRlbmQgdGVuYW50IFNRTGl0ZSBoYW5kbGVcIilcbiAgICBpZiAodGhpcy5jb25maWd1cmF0aW9uLmdldERhdGFiYXNlUG9vbChlbnRyeS5kYXRhYmFzZUlkZW50aWZpZXIpLmNhcHR1cmVkQ29ubmVjdGlvbkluVXNlKGVudHJ5LmRhdGFiYXNlQ29uZmlndXJhdGlvbikpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIkNhbm5vdCBjbG9zZSBhbiBpbi11c2UgZnJvbnRlbmQgdGVuYW50IFNRTGl0ZSBoYW5kbGVcIilcbiAgICB9XG4gIH1cblxuICBhc3luYyBldmljdEZvcigvKiogQHR5cGUge0xpZmVjeWNsZUVudHJ5fSAqLyBvcGVuaW5nRW50cnkpIHtcbiAgICBjb25zdCBvcGVuRW50cmllcyA9IFsuLi50aGlzLmVudHJpZXMudmFsdWVzKCldLmZpbHRlcigoZW50cnkpID0+IGVudHJ5ICE9PSBvcGVuaW5nRW50cnkgJiYgZW50cnkuc3RhdGUgPT09IFwib3BlblwiKVxuICAgIGlmIChvcGVuRW50cmllcy5sZW5ndGggPCB0aGlzLm1heE9wZW5IYW5kbGVzKSByZXR1cm5cbiAgICBjb25zdCBjYW5kaWRhdGVzID0gb3BlbkVudHJpZXNcbiAgICAgIC5maWx0ZXIoKGVudHJ5KSA9PiAhZW50cnkuZGlydHkgJiYgZW50cnkucGluQ291bnQgPT09IDAgJiYgIXRoaXMuY29uZmlndXJhdGlvbi5nZXREYXRhYmFzZVBvb2woZW50cnkuZGF0YWJhc2VJZGVudGlmaWVyKS5jYXB0dXJlZENvbm5lY3Rpb25JblVzZShlbnRyeS5kYXRhYmFzZUNvbmZpZ3VyYXRpb24pKVxuICAgICAgLnNvcnQoKGxlZnQsIHJpZ2h0KSA9PiBsZWZ0Lmxhc3RVc2VkIC0gcmlnaHQubGFzdFVzZWQpXG4gICAgY29uc3QgdmljdGltID0gY2FuZGlkYXRlc1swXVxuICAgIGlmICghdmljdGltKSB0aHJvdyBuZXcgRXJyb3IoYEZyb250ZW5kIHRlbmFudCBTUUxpdGUgaGFuZGxlIGNhcGFjaXR5ICR7dGhpcy5tYXhPcGVuSGFuZGxlc30gcmVhY2hlZDsgZXZlcnkgaGFuZGxlIGlzIGRpcnR5LCBwaW5uZWQsIG9yIGluIHVzZWApXG4gICAgYXdhaXQgdGhpcy5jb25maWd1cmF0aW9uLmdldERhdGFiYXNlUG9vbCh2aWN0aW0uZGF0YWJhc2VJZGVudGlmaWVyKS5jbG9zZUNhcHR1cmVkQ29ubmVjdGlvbih2aWN0aW0uZGF0YWJhc2VDb25maWd1cmF0aW9uKVxuICAgIHRoaXMuY29uZmlndXJhdGlvbi5jbGVhclJlY29yZE1ldGFkYXRhRm9yRGF0YWJhc2VJZGVudGl0eSh0aGlzLmtleSh2aWN0aW0uZGF0YWJhc2VJZGVudGlmaWVyLCB2aWN0aW0uZGF0YWJhc2VDb25maWd1cmF0aW9uKSlcbiAgICB2aWN0aW0ucmVhZHkgPSBmYWxzZVxuICAgIHZpY3RpbS5zY2hlbWFHZW5lcmF0aW9uID0gdW5kZWZpbmVkXG4gICAgdmljdGltLnN0YXRlID0gXCJjbG9zZWRcIlxuICAgIHRoaXMuZW50cmllcy5kZWxldGUodGhpcy5rZXkodmljdGltLmRhdGFiYXNlSWRlbnRpZmllciwgdmljdGltLmRhdGFiYXNlQ29uZmlndXJhdGlvbikpXG4gIH1cbn1cbiJdfQ==
@@ -9,6 +9,8 @@ export type TenantSqliteLifecycleSnapshot = {
9
9
  dirty: boolean;
10
10
  lastUsed: number;
11
11
  pinCount: number;
12
+ ready: boolean;
13
+ schemaGeneration: string | undefined;
12
14
  state: "closed" | "closing" | "deleting" | "open" | "opening";
13
15
  };
14
16
  /**
@@ -36,6 +38,12 @@ export default class TenantHandle {
36
38
  * @returns {TenantDescriptor} - Tenant descriptor.
37
39
  */
38
40
  tenant(): TenantDescriptor;
41
+ /**
42
+ * Rejects using this handle with a different Configuration instance.
43
+ * @param {import("../configuration.js").default} configuration - Expected owner.
44
+ * @returns {void}
45
+ */
46
+ assertConfiguration(configuration: import("../configuration.js").default): void;
39
47
  /**
40
48
  * Returns the captured physical configuration for an active identifier.
41
49
  * @param {string} databaseIdentifier - Logical database identifier.
@@ -50,6 +58,20 @@ export default class TenantHandle {
50
58
  open(options: {
51
59
  databaseIdentifier: string;
52
60
  }): Promise<Readonly<TenantSqliteLifecycleSnapshot>>;
61
+ /**
62
+ * Opens, migrates, and initializes record metadata for one captured physical
63
+ * tenant SQLite database and application schema generation.
64
+ * @param {object} options - Initialization options.
65
+ * @param {string} options.databaseIdentifier - Tenant-only logical database identifier.
66
+ * @param {import("../database/migrator/types.js").RequireMigrationContextType} options.migrations - Frontend migration require context.
67
+ * @param {string} options.schemaGeneration - Stable application schema generation.
68
+ * @returns {Promise<Readonly<TenantSqliteLifecycleSnapshot>>} - Ready lifecycle snapshot.
69
+ */
70
+ initialize({ databaseIdentifier, migrations, schemaGeneration }: {
71
+ databaseIdentifier: string;
72
+ migrations: import("../database/migrator/types.js").RequireMigrationContextType;
73
+ schemaGeneration: string;
74
+ }): Promise<Readonly<TenantSqliteLifecycleSnapshot>>;
53
75
  /**
54
76
  * Flushes this captured SQLite identity.
55
77
  * @param {{databaseIdentifier: string}} options - Lifecycle options.
@@ -106,6 +128,20 @@ export default class TenantHandle {
106
128
  databaseIdentifier: string;
107
129
  name?: string;
108
130
  }, callback: (operation: import("../database/operation.js").default) => Promise<T>): Promise<T>;
131
+ /**
132
+ * Runs a captured operation with explicit readiness policy. Initialization is
133
+ * the only caller allowed to enter an unready schema generation.
134
+ * @template T
135
+ * @param {{databaseIdentifier: string, name: string, requireReady: boolean, schemaGeneration?: string}} options - Internal operation options.
136
+ * @param {(operation: import("../database/operation.js").default) => Promise<T>} callback - Operation callback.
137
+ * @returns {Promise<T>} - Callback result.
138
+ */
139
+ _databaseOperation<T>({ databaseIdentifier, name, requireReady, schemaGeneration }: {
140
+ databaseIdentifier: string;
141
+ name: string;
142
+ requireReady: boolean;
143
+ schemaGeneration?: string;
144
+ }, callback: (operation: import("../database/operation.js").default) => Promise<T>): Promise<T>;
109
145
  /**
110
146
  * Runs explicit ORM work in a transaction pinned to this handle's captured
111
147
  * physical database.
@@ -1 +1 @@
1
- {"version":3,"file":"tenant-handle.d.ts","sourceRoot":"","sources":["../../../src/tenants/tenant-handle.js"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"tenant-handle.d.ts","sourceRoot":"","sources":["../../../src/tenants/tenant-handle.js"],"names":[],"mappings":"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"}