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