velocious 1.0.577 → 1.0.579

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 (1676) hide show
  1. package/README.md +12 -6
  2. package/build/application.js +3 -3
  3. package/build/authorization/ability.js +6 -6
  4. package/build/authorization/base-resource.js +1 -1
  5. package/build/background-jobs/client.js +2 -2
  6. package/build/background-jobs/forked-runner-child.js +4 -4
  7. package/build/background-jobs/job-runner.js +2 -2
  8. package/build/background-jobs/job.js +6 -6
  9. package/build/background-jobs/json-socket.js +1 -1
  10. package/build/background-jobs/main.js +13 -13
  11. package/build/background-jobs/normalize-error.js +2 -2
  12. package/build/background-jobs/pooled-runner-child.js +3 -3
  13. package/build/background-jobs/scheduler.js +1 -1
  14. package/build/background-jobs/status-reporter.js +2 -2
  15. package/build/background-jobs/store.js +23 -23
  16. package/build/background-jobs/types.js +6 -6
  17. package/build/background-jobs/web/controller.js +6 -6
  18. package/build/background-jobs/web/counts-channel.js +1 -1
  19. package/build/background-jobs/worker.js +8 -8
  20. package/build/beacon/client.js +3 -3
  21. package/build/beacon/in-process-client.js +3 -3
  22. package/build/beacon/types.js +1 -1
  23. package/build/cli/base-command.js +1 -1
  24. package/build/cli/commands/console.js +1 -1
  25. package/build/cli/commands/db/schema/dump.js +1 -1
  26. package/build/cli/commands/db/schema/load.js +1 -1
  27. package/build/cli/commands/db/seed.js +1 -1
  28. package/build/cli/commands/generate/frontend-models.js +1 -1
  29. package/build/cli/commands/lint/relationships.js +1 -1
  30. package/build/cli/commands/run-script.js +1 -1
  31. package/build/cli/commands/runner.js +1 -1
  32. package/build/cli/index.js +2 -2
  33. package/build/cli/tenant-database-command-helper.js +2 -2
  34. package/build/configuration-types.js +48 -47
  35. package/build/configuration.js +150 -65
  36. package/build/controller.js +11 -8
  37. package/build/current.js +2 -2
  38. package/build/database/annotations-async-hooks.js +3 -3
  39. package/build/database/annotations.js +1 -1
  40. package/build/database/drivers/base-column.js +1 -1
  41. package/build/database/drivers/base-foreign-key.js +1 -1
  42. package/build/database/drivers/base-table.js +1 -1
  43. package/build/database/drivers/base.js +18 -18
  44. package/build/database/drivers/mssql/column.js +1 -1
  45. package/build/database/drivers/mssql/index.js +2 -2
  46. package/build/database/drivers/mssql/options.js +1 -1
  47. package/build/database/drivers/mssql/structure-sql.js +1 -1
  48. package/build/database/drivers/mssql/table.js +1 -1
  49. package/build/database/drivers/mysql/column.js +1 -1
  50. package/build/database/drivers/mysql/index.js +4 -4
  51. package/build/database/drivers/mysql/options.js +1 -1
  52. package/build/database/drivers/mysql/query.js +7 -7
  53. package/build/database/drivers/mysql/structure-sql.js +71 -10
  54. package/build/database/drivers/pgsql/column.js +1 -1
  55. package/build/database/drivers/pgsql/index.js +6 -6
  56. package/build/database/drivers/pgsql/structure-sql.js +1 -1
  57. package/build/database/drivers/sqlite/base.js +7 -7
  58. package/build/database/drivers/sqlite/column.js +1 -1
  59. package/build/database/drivers/sqlite/connection-sql-js.js +1 -1
  60. package/build/database/drivers/sqlite/foreign-key.js +1 -1
  61. package/build/database/drivers/sqlite/index.js +1 -1
  62. package/build/database/drivers/sqlite/index.native.js +2 -2
  63. package/build/database/drivers/sqlite/index.web.js +2 -2
  64. package/build/database/drivers/sqlite/query.js +2 -2
  65. package/build/database/drivers/sqlite/query.native.js +2 -2
  66. package/build/database/drivers/sqlite/query.web.js +2 -2
  67. package/build/database/drivers/sqlite/table-rebuilder.js +1 -1
  68. package/build/database/migration/index.js +2 -2
  69. package/build/database/migrator/types.js +2 -2
  70. package/build/database/operation.js +59 -6
  71. package/build/database/pool/async-tracked-multi-connection.js +75 -24
  72. package/build/database/pool/base-methods-forward.js +2 -2
  73. package/build/database/pool/base.js +48 -17
  74. package/build/database/pool/single-multi-use.js +501 -103
  75. package/build/database/query/delete-base.js +1 -1
  76. package/build/database/query/index.js +3 -3
  77. package/build/database/query/insert-base.js +4 -4
  78. package/build/database/query/model-class-query.js +39 -39
  79. package/build/database/query/preloader/belongs-to.js +2 -2
  80. package/build/database/query/preloader/ensure-model-class-initialized.js +3 -2
  81. package/build/database/query/preloader/has-many.js +3 -3
  82. package/build/database/query/preloader/has-one.js +1 -1
  83. package/build/database/query/preloader.js +9 -2
  84. package/build/database/query/query-data.js +7 -7
  85. package/build/database/query/update-base.js +3 -3
  86. package/build/database/query/upsert-base.js +2 -2
  87. package/build/database/query/where-model-class-hash.js +13 -13
  88. package/build/database/query/with-count.js +12 -12
  89. package/build/database/query-parser/options.js +2 -2
  90. package/build/database/query-parser/select-parser.js +1 -1
  91. package/build/database/record/acts-as-list.js +2 -2
  92. package/build/database/record/attachments/handle.js +6 -6
  93. package/build/database/record/attachments/normalize-input.js +11 -11
  94. package/build/database/record/attachments/storage-drivers/filesystem.js +1 -1
  95. package/build/database/record/attachments/storage-drivers/native.js +5 -5
  96. package/build/database/record/attachments/storage-drivers/s3.js +10 -10
  97. package/build/database/record/attachments/store.js +24 -20
  98. package/build/database/record/auditing.js +123 -29
  99. package/build/database/record/counter-cache-magnitude.js +11 -11
  100. package/build/database/record/index.js +227 -174
  101. package/build/database/record/instance-relationships/base.js +4 -4
  102. package/build/database/record/instance-relationships/belongs-to.js +1 -1
  103. package/build/database/record/instance-relationships/has-many.js +3 -3
  104. package/build/database/record/instance-relationships/has-one.js +1 -1
  105. package/build/database/record/record-not-found-error.js +1 -0
  106. package/build/database/record/relationships/base.js +22 -0
  107. package/build/database/record/state-machine.js +6 -6
  108. package/build/database/record/validators/base.js +1 -1
  109. package/build/database/structure-sql-loader.js +3 -3
  110. package/build/database/table-data/table-column.js +3 -3
  111. package/build/database/use-live-query.js +3 -3
  112. package/build/environment-handlers/base.js +56 -37
  113. package/build/environment-handlers/browser.js +1 -1
  114. package/build/environment-handlers/node/cli/commands/console.js +4 -4
  115. package/build/environment-handlers/node/cli/commands/db/seed.js +2 -2
  116. package/build/environment-handlers/node/cli/commands/generate/base-models.js +1 -1
  117. package/build/environment-handlers/node/cli/commands/run-script.js +2 -2
  118. package/build/environment-handlers/node/cli/commands/runner.js +2 -2
  119. package/build/environment-handlers/node/cli/commands/server.js +1 -1
  120. package/build/environment-handlers/node.js +36 -36
  121. package/build/error-logger.js +2 -2
  122. package/build/error-reporting/request-details.js +32 -32
  123. package/build/frontend-model-controller.js +215 -213
  124. package/build/frontend-model-resource/base-resource.js +44 -44
  125. package/build/frontend-model-resource/velocious-attachment-resource.js +1 -1
  126. package/build/frontend-models/base.js +146 -142
  127. package/build/frontend-models/clear-pending-debounced-callback.js +2 -2
  128. package/build/frontend-models/model-registry.js +4 -4
  129. package/build/frontend-models/outgoing-event-buffer.js +1 -1
  130. package/build/frontend-models/preloader.js +1 -1
  131. package/build/frontend-models/query.js +60 -60
  132. package/build/frontend-models/resource-definition.js +9 -9
  133. package/build/frontend-models/transport-serialization.js +27 -27
  134. package/build/frontend-models/websocket-channel.js +4 -4
  135. package/build/frontend-models/websocket-publishers.js +1 -1
  136. package/build/http-client/request.js +1 -1
  137. package/build/http-client/response.js +1 -1
  138. package/build/http-server/client/index.js +4 -4
  139. package/build/http-server/client/params-to-object.js +16 -16
  140. package/build/http-server/client/request-buffer/index.js +5 -2
  141. package/build/http-server/client/request-parser.js +2 -2
  142. package/build/http-server/client/request-runner.js +2 -2
  143. package/build/http-server/client/request.js +2 -2
  144. package/build/http-server/client/websocket-request.js +6 -6
  145. package/build/http-server/client/websocket-session.js +28 -28
  146. package/build/http-server/cookie.js +2 -2
  147. package/build/http-server/development-reloader.js +1 -1
  148. package/build/http-server/index.js +5 -5
  149. package/build/http-server/remote-address.js +1 -1
  150. package/build/http-server/server-lock.js +4 -4
  151. package/build/http-server/websocket-channel-subscribers.js +4 -4
  152. package/build/http-server/websocket-channel.js +1 -1
  153. package/build/http-server/websocket-connection.js +3 -3
  154. package/build/http-server/websocket-event-log-store.js +9 -9
  155. package/build/http-server/websocket-events-host.js +7 -7
  156. package/build/http-server/websocket-events.js +4 -4
  157. package/build/http-server/worker-handler/channel-subscriber-dispatch.js +1 -1
  158. package/build/http-server/worker-handler/in-process.js +5 -5
  159. package/build/http-server/worker-handler/index.js +10 -10
  160. package/build/http-server/worker-handler/worker-thread.js +8 -8
  161. package/build/index.d.ts.map +1 -1
  162. package/build/logger/base-logger.js +1 -1
  163. package/build/logger.js +12 -12
  164. package/build/mailer/backends/smtp.js +3 -3
  165. package/build/mailer/base.js +14 -14
  166. package/build/mailer/delivery.js +3 -3
  167. package/build/mailer/index.js +1 -1
  168. package/build/mailer.js +1 -1
  169. package/build/plugins/sqljs-wasm-route-controller.js +1 -1
  170. package/build/record-payload-values.js +3 -3
  171. package/build/routes/base-route.js +5 -5
  172. package/build/routes/basic-route.js +4 -4
  173. package/build/routes/get-route.js +2 -2
  174. package/build/routes/hooks/frontend-model-command-route-hook.js +1 -1
  175. package/build/routes/index.js +3 -3
  176. package/build/routes/namespace-route.js +1 -1
  177. package/build/routes/plugin-routes.js +1 -1
  178. package/build/routes/post-route.js +2 -2
  179. package/build/routes/resolver.js +5 -5
  180. package/build/routes/resource-route.js +1 -1
  181. package/build/src/application.d.ts +26 -29
  182. package/build/src/application.d.ts.map +1 -1
  183. package/build/src/application.js +4 -4
  184. package/build/src/authorization/ability.d.ts +47 -53
  185. package/build/src/authorization/ability.d.ts.map +1 -1
  186. package/build/src/authorization/ability.js +7 -7
  187. package/build/src/authorization/base-resource.d.ts +13 -13
  188. package/build/src/authorization/base-resource.d.ts.map +1 -1
  189. package/build/src/authorization/base-resource.js +2 -2
  190. package/build/src/background-jobs/client.d.ts +9 -9
  191. package/build/src/background-jobs/client.d.ts.map +1 -1
  192. package/build/src/background-jobs/client.js +3 -3
  193. package/build/src/background-jobs/cron-expression.d.ts +25 -16
  194. package/build/src/background-jobs/cron-expression.d.ts.map +1 -1
  195. package/build/src/background-jobs/forked-runner-child.js +5 -5
  196. package/build/src/background-jobs/job-record.d.ts +4 -3
  197. package/build/src/background-jobs/job-record.d.ts.map +1 -1
  198. package/build/src/background-jobs/job-registry.d.ts +6 -6
  199. package/build/src/background-jobs/job-registry.d.ts.map +1 -1
  200. package/build/src/background-jobs/job-runner.d.ts +9 -9
  201. package/build/src/background-jobs/job-runner.d.ts.map +1 -1
  202. package/build/src/background-jobs/job-runner.js +3 -3
  203. package/build/src/background-jobs/job.d.ts +14 -14
  204. package/build/src/background-jobs/job.d.ts.map +1 -1
  205. package/build/src/background-jobs/job.js +7 -7
  206. package/build/src/background-jobs/json-socket.d.ts +9 -10
  207. package/build/src/background-jobs/json-socket.d.ts.map +1 -1
  208. package/build/src/background-jobs/json-socket.js +2 -2
  209. package/build/src/background-jobs/main.d.ts +56 -59
  210. package/build/src/background-jobs/main.d.ts.map +1 -1
  211. package/build/src/background-jobs/main.js +14 -14
  212. package/build/src/background-jobs/normalize-error.d.ts +2 -2
  213. package/build/src/background-jobs/normalize-error.d.ts.map +1 -1
  214. package/build/src/background-jobs/normalize-error.js +3 -3
  215. package/build/src/background-jobs/pooled-runner-child.js +4 -4
  216. package/build/src/background-jobs/runner-graceful-shutdown.d.ts +7 -12
  217. package/build/src/background-jobs/runner-graceful-shutdown.d.ts.map +1 -1
  218. package/build/src/background-jobs/runner-process-title.d.ts.map +1 -1
  219. package/build/src/background-jobs/scheduler.d.ts +41 -41
  220. package/build/src/background-jobs/scheduler.d.ts.map +1 -1
  221. package/build/src/background-jobs/scheduler.js +2 -2
  222. package/build/src/background-jobs/socket-request.d.ts +14 -14
  223. package/build/src/background-jobs/socket-request.d.ts.map +1 -1
  224. package/build/src/background-jobs/status-reporter.d.ts +28 -28
  225. package/build/src/background-jobs/status-reporter.d.ts.map +1 -1
  226. package/build/src/background-jobs/status-reporter.js +3 -3
  227. package/build/src/background-jobs/store.d.ts +100 -103
  228. package/build/src/background-jobs/store.d.ts.map +1 -1
  229. package/build/src/background-jobs/store.js +24 -24
  230. package/build/src/background-jobs/types.d.ts +124 -124
  231. package/build/src/background-jobs/types.d.ts.map +1 -1
  232. package/build/src/background-jobs/types.js +7 -7
  233. package/build/src/background-jobs/web/authorization.d.ts +2 -2
  234. package/build/src/background-jobs/web/authorization.d.ts.map +1 -1
  235. package/build/src/background-jobs/web/controller.d.ts +13 -13
  236. package/build/src/background-jobs/web/controller.d.ts.map +1 -1
  237. package/build/src/background-jobs/web/controller.js +7 -7
  238. package/build/src/background-jobs/web/counts-channel.d.ts +8 -8
  239. package/build/src/background-jobs/web/counts-channel.d.ts.map +1 -1
  240. package/build/src/background-jobs/web/counts-channel.js +2 -2
  241. package/build/src/background-jobs/web/index.d.ts +4 -4
  242. package/build/src/background-jobs/web/index.d.ts.map +1 -1
  243. package/build/src/background-jobs/web/path-matcher.d.ts +18 -13
  244. package/build/src/background-jobs/web/path-matcher.d.ts.map +1 -1
  245. package/build/src/background-jobs/web/registry.d.ts +21 -24
  246. package/build/src/background-jobs/web/registry.d.ts.map +1 -1
  247. package/build/src/background-jobs/worker.d.ts +74 -77
  248. package/build/src/background-jobs/worker.d.ts.map +1 -1
  249. package/build/src/background-jobs/worker.js +9 -9
  250. package/build/src/beacon/client.d.ts +30 -34
  251. package/build/src/beacon/client.d.ts.map +1 -1
  252. package/build/src/beacon/client.js +4 -4
  253. package/build/src/beacon/in-process-broker.d.ts +6 -9
  254. package/build/src/beacon/in-process-broker.d.ts.map +1 -1
  255. package/build/src/beacon/in-process-client.d.ts +17 -21
  256. package/build/src/beacon/in-process-client.d.ts.map +1 -1
  257. package/build/src/beacon/in-process-client.js +4 -4
  258. package/build/src/beacon/server.d.ts +15 -15
  259. package/build/src/beacon/server.d.ts.map +1 -1
  260. package/build/src/beacon/types.d.ts +21 -46
  261. package/build/src/beacon/types.d.ts.map +1 -1
  262. package/build/src/beacon/types.js +2 -2
  263. package/build/src/cli/base-command.d.ts +25 -28
  264. package/build/src/cli/base-command.d.ts.map +1 -1
  265. package/build/src/cli/base-command.js +2 -2
  266. package/build/src/cli/browser-cli.d.ts +1 -1
  267. package/build/src/cli/browser-cli.d.ts.map +1 -1
  268. package/build/src/cli/commands/background-jobs-main.d.ts +2 -1
  269. package/build/src/cli/commands/background-jobs-main.d.ts.map +1 -1
  270. package/build/src/cli/commands/background-jobs-runner.d.ts +2 -1
  271. package/build/src/cli/commands/background-jobs-runner.d.ts.map +1 -1
  272. package/build/src/cli/commands/background-jobs-worker.d.ts +2 -1
  273. package/build/src/cli/commands/background-jobs-worker.d.ts.map +1 -1
  274. package/build/src/cli/commands/beacon.d.ts +2 -1
  275. package/build/src/cli/commands/beacon.d.ts.map +1 -1
  276. package/build/src/cli/commands/console.d.ts +6 -1
  277. package/build/src/cli/commands/console.d.ts.map +1 -1
  278. package/build/src/cli/commands/console.js +2 -2
  279. package/build/src/cli/commands/db/base-command.d.ts +1 -1
  280. package/build/src/cli/commands/db/base-command.d.ts.map +1 -1
  281. package/build/src/cli/commands/db/create.d.ts +1 -1
  282. package/build/src/cli/commands/db/create.d.ts.map +1 -1
  283. package/build/src/cli/commands/db/drop.d.ts +1 -1
  284. package/build/src/cli/commands/db/drop.d.ts.map +1 -1
  285. package/build/src/cli/commands/db/migrate.d.ts +1 -1
  286. package/build/src/cli/commands/db/migrate.d.ts.map +1 -1
  287. package/build/src/cli/commands/db/reset.d.ts +1 -1
  288. package/build/src/cli/commands/db/reset.d.ts.map +1 -1
  289. package/build/src/cli/commands/db/rollback.d.ts +1 -1
  290. package/build/src/cli/commands/db/rollback.d.ts.map +1 -1
  291. package/build/src/cli/commands/db/schema/dump.d.ts +6 -1
  292. package/build/src/cli/commands/db/schema/dump.d.ts.map +1 -1
  293. package/build/src/cli/commands/db/schema/dump.js +2 -2
  294. package/build/src/cli/commands/db/schema/load.d.ts +6 -1
  295. package/build/src/cli/commands/db/schema/load.d.ts.map +1 -1
  296. package/build/src/cli/commands/db/schema/load.js +2 -2
  297. package/build/src/cli/commands/db/seed.d.ts +6 -1
  298. package/build/src/cli/commands/db/seed.d.ts.map +1 -1
  299. package/build/src/cli/commands/db/seed.js +2 -2
  300. package/build/src/cli/commands/db/tenants/check.d.ts +1 -1
  301. package/build/src/cli/commands/db/tenants/check.d.ts.map +1 -1
  302. package/build/src/cli/commands/db/tenants/create.d.ts +1 -1
  303. package/build/src/cli/commands/db/tenants/create.d.ts.map +1 -1
  304. package/build/src/cli/commands/db/tenants/drop.d.ts +1 -1
  305. package/build/src/cli/commands/db/tenants/drop.d.ts.map +1 -1
  306. package/build/src/cli/commands/db/tenants/migrate.d.ts +1 -1
  307. package/build/src/cli/commands/db/tenants/migrate.d.ts.map +1 -1
  308. package/build/src/cli/commands/destroy/migration.d.ts +2 -1
  309. package/build/src/cli/commands/destroy/migration.d.ts.map +1 -1
  310. package/build/src/cli/commands/generate/base-models.d.ts +2 -1
  311. package/build/src/cli/commands/generate/base-models.d.ts.map +1 -1
  312. package/build/src/cli/commands/generate/frontend-models.d.ts +6 -1
  313. package/build/src/cli/commands/generate/frontend-models.d.ts.map +1 -1
  314. package/build/src/cli/commands/generate/frontend-models.js +2 -2
  315. package/build/src/cli/commands/generate/migration.d.ts +2 -1
  316. package/build/src/cli/commands/generate/migration.d.ts.map +1 -1
  317. package/build/src/cli/commands/generate/model.d.ts +2 -1
  318. package/build/src/cli/commands/generate/model.d.ts.map +1 -1
  319. package/build/src/cli/commands/init.d.ts +4 -2
  320. package/build/src/cli/commands/init.d.ts.map +1 -1
  321. package/build/src/cli/commands/lint/relationships.d.ts +6 -1
  322. package/build/src/cli/commands/lint/relationships.d.ts.map +1 -1
  323. package/build/src/cli/commands/lint/relationships.js +2 -2
  324. package/build/src/cli/commands/routes.d.ts +2 -1
  325. package/build/src/cli/commands/routes.d.ts.map +1 -1
  326. package/build/src/cli/commands/run-script.d.ts +6 -1
  327. package/build/src/cli/commands/run-script.d.ts.map +1 -1
  328. package/build/src/cli/commands/run-script.js +2 -2
  329. package/build/src/cli/commands/runner.d.ts +6 -1
  330. package/build/src/cli/commands/runner.d.ts.map +1 -1
  331. package/build/src/cli/commands/runner.js +2 -2
  332. package/build/src/cli/commands/server.d.ts +2 -1
  333. package/build/src/cli/commands/server.d.ts.map +1 -1
  334. package/build/src/cli/commands/test.d.ts +2 -1
  335. package/build/src/cli/commands/test.d.ts.map +1 -1
  336. package/build/src/cli/index.d.ts +20 -20
  337. package/build/src/cli/index.d.ts.map +1 -1
  338. package/build/src/cli/index.js +3 -3
  339. package/build/src/cli/tenant-database-command-helper.d.ts +13 -13
  340. package/build/src/cli/tenant-database-command-helper.d.ts.map +1 -1
  341. package/build/src/cli/tenant-database-command-helper.js +3 -3
  342. package/build/src/cli/use-browser-cli.d.ts +1 -1
  343. package/build/src/cli/use-browser-cli.d.ts.map +1 -1
  344. package/build/src/configuration-resolver.d.ts +1 -1
  345. package/build/src/configuration-resolver.d.ts.map +1 -1
  346. package/build/src/configuration-types.d.ts +947 -1038
  347. package/build/src/configuration-types.d.ts.map +1 -1
  348. package/build/src/configuration-types.js +49 -48
  349. package/build/src/configuration.d.ts +145 -139
  350. package/build/src/configuration.d.ts.map +1 -1
  351. package/build/src/configuration.js +149 -66
  352. package/build/src/controller.d.ts +37 -35
  353. package/build/src/controller.d.ts.map +1 -1
  354. package/build/src/controller.js +11 -9
  355. package/build/src/current-configuration.d.ts +5 -4
  356. package/build/src/current-configuration.d.ts.map +1 -1
  357. package/build/src/current.d.ts +3 -3
  358. package/build/src/current.d.ts.map +1 -1
  359. package/build/src/current.js +3 -3
  360. package/build/src/database/advisory-lock-runner.d.ts +61 -60
  361. package/build/src/database/advisory-lock-runner.d.ts.map +1 -1
  362. package/build/src/database/annotations-async-hooks.js +4 -4
  363. package/build/src/database/annotations.d.ts +4 -6
  364. package/build/src/database/annotations.d.ts.map +1 -1
  365. package/build/src/database/annotations.js +2 -2
  366. package/build/src/database/column-types.d.ts +1 -1
  367. package/build/src/database/column-types.d.ts.map +1 -1
  368. package/build/src/database/datetime-storage.d.ts +6 -6
  369. package/build/src/database/datetime-storage.d.ts.map +1 -1
  370. package/build/src/database/drivers/base-column.d.ts +3 -3
  371. package/build/src/database/drivers/base-column.d.ts.map +1 -1
  372. package/build/src/database/drivers/base-column.js +2 -2
  373. package/build/src/database/drivers/base-columns-index.d.ts +2 -2
  374. package/build/src/database/drivers/base-columns-index.d.ts.map +1 -1
  375. package/build/src/database/drivers/base-foreign-key.d.ts +7 -7
  376. package/build/src/database/drivers/base-foreign-key.d.ts.map +1 -1
  377. package/build/src/database/drivers/base-foreign-key.js +2 -2
  378. package/build/src/database/drivers/base-table.d.ts +3 -3
  379. package/build/src/database/drivers/base-table.d.ts.map +1 -1
  380. package/build/src/database/drivers/base-table.js +2 -2
  381. package/build/src/database/drivers/base.d.ts +297 -342
  382. package/build/src/database/drivers/base.d.ts.map +1 -1
  383. package/build/src/database/drivers/base.js +19 -19
  384. package/build/src/database/drivers/index-metadata.d.ts +15 -18
  385. package/build/src/database/drivers/index-metadata.d.ts.map +1 -1
  386. package/build/src/database/drivers/mssql/column.d.ts +10 -5
  387. package/build/src/database/drivers/mssql/column.d.ts.map +1 -1
  388. package/build/src/database/drivers/mssql/column.js +2 -2
  389. package/build/src/database/drivers/mssql/columns-index.d.ts +30 -22
  390. package/build/src/database/drivers/mssql/columns-index.d.ts.map +1 -1
  391. package/build/src/database/drivers/mssql/connect-connection.d.ts.map +1 -1
  392. package/build/src/database/drivers/mssql/foreign-key.d.ts +1 -1
  393. package/build/src/database/drivers/mssql/foreign-key.d.ts.map +1 -1
  394. package/build/src/database/drivers/mssql/index.d.ts +250 -9
  395. package/build/src/database/drivers/mssql/index.d.ts.map +1 -1
  396. package/build/src/database/drivers/mssql/index.js +3 -3
  397. package/build/src/database/drivers/mssql/options.d.ts +31 -1
  398. package/build/src/database/drivers/mssql/options.d.ts.map +1 -1
  399. package/build/src/database/drivers/mssql/options.js +2 -2
  400. package/build/src/database/drivers/mssql/query-parser.d.ts +1 -1
  401. package/build/src/database/drivers/mssql/query-parser.d.ts.map +1 -1
  402. package/build/src/database/drivers/mssql/sql/alter-table.d.ts +1 -1
  403. package/build/src/database/drivers/mssql/sql/alter-table.d.ts.map +1 -1
  404. package/build/src/database/drivers/mssql/sql/create-database.d.ts +3 -2
  405. package/build/src/database/drivers/mssql/sql/create-database.d.ts.map +1 -1
  406. package/build/src/database/drivers/mssql/sql/create-index.d.ts +1 -1
  407. package/build/src/database/drivers/mssql/sql/create-index.d.ts.map +1 -1
  408. package/build/src/database/drivers/mssql/sql/create-table.d.ts +1 -1
  409. package/build/src/database/drivers/mssql/sql/create-table.d.ts.map +1 -1
  410. package/build/src/database/drivers/mssql/sql/delete.d.ts +1 -1
  411. package/build/src/database/drivers/mssql/sql/delete.d.ts.map +1 -1
  412. package/build/src/database/drivers/mssql/sql/drop-database.d.ts +14 -1
  413. package/build/src/database/drivers/mssql/sql/drop-database.d.ts.map +1 -1
  414. package/build/src/database/drivers/mssql/sql/drop-table.d.ts +1 -1
  415. package/build/src/database/drivers/mssql/sql/drop-table.d.ts.map +1 -1
  416. package/build/src/database/drivers/mssql/sql/insert.d.ts +1 -1
  417. package/build/src/database/drivers/mssql/sql/insert.d.ts.map +1 -1
  418. package/build/src/database/drivers/mssql/sql/remove-index.d.ts +1 -1
  419. package/build/src/database/drivers/mssql/sql/remove-index.d.ts.map +1 -1
  420. package/build/src/database/drivers/mssql/sql/update.d.ts +1 -1
  421. package/build/src/database/drivers/mssql/sql/update.d.ts.map +1 -1
  422. package/build/src/database/drivers/mssql/sql/upsert.d.ts +1 -1
  423. package/build/src/database/drivers/mssql/sql/upsert.d.ts.map +1 -1
  424. package/build/src/database/drivers/mssql/structure-sql.d.ts +3 -3
  425. package/build/src/database/drivers/mssql/structure-sql.d.ts.map +1 -1
  426. package/build/src/database/drivers/mssql/structure-sql.js +2 -2
  427. package/build/src/database/drivers/mssql/table.d.ts +39 -29
  428. package/build/src/database/drivers/mssql/table.d.ts.map +1 -1
  429. package/build/src/database/drivers/mssql/table.js +2 -2
  430. package/build/src/database/drivers/mysql/column.d.ts +10 -6
  431. package/build/src/database/drivers/mysql/column.d.ts.map +1 -1
  432. package/build/src/database/drivers/mysql/column.js +2 -2
  433. package/build/src/database/drivers/mysql/columns-index.d.ts +3 -1
  434. package/build/src/database/drivers/mysql/columns-index.d.ts.map +1 -1
  435. package/build/src/database/drivers/mysql/foreign-key.d.ts +1 -1
  436. package/build/src/database/drivers/mysql/foreign-key.d.ts.map +1 -1
  437. package/build/src/database/drivers/mysql/index.d.ts +225 -6
  438. package/build/src/database/drivers/mysql/index.d.ts.map +1 -1
  439. package/build/src/database/drivers/mysql/index.js +5 -5
  440. package/build/src/database/drivers/mysql/options.d.ts +7 -1
  441. package/build/src/database/drivers/mysql/options.d.ts.map +1 -1
  442. package/build/src/database/drivers/mysql/options.js +2 -2
  443. package/build/src/database/drivers/mysql/query-parser.d.ts +1 -1
  444. package/build/src/database/drivers/mysql/query-parser.d.ts.map +1 -1
  445. package/build/src/database/drivers/mysql/query-stream.d.ts.map +1 -1
  446. package/build/src/database/drivers/mysql/query.d.ts +2 -2
  447. package/build/src/database/drivers/mysql/query.d.ts.map +1 -1
  448. package/build/src/database/drivers/mysql/query.js +8 -8
  449. package/build/src/database/drivers/mysql/sql/alter-table.d.ts +12 -1
  450. package/build/src/database/drivers/mysql/sql/alter-table.d.ts.map +1 -1
  451. package/build/src/database/drivers/mysql/sql/create-database.d.ts +6 -1
  452. package/build/src/database/drivers/mysql/sql/create-database.d.ts.map +1 -1
  453. package/build/src/database/drivers/mysql/sql/create-index.d.ts +1 -1
  454. package/build/src/database/drivers/mysql/sql/create-index.d.ts.map +1 -1
  455. package/build/src/database/drivers/mysql/sql/create-table.d.ts +1 -1
  456. package/build/src/database/drivers/mysql/sql/create-table.d.ts.map +1 -1
  457. package/build/src/database/drivers/mysql/sql/delete.d.ts +1 -1
  458. package/build/src/database/drivers/mysql/sql/delete.d.ts.map +1 -1
  459. package/build/src/database/drivers/mysql/sql/drop-database.d.ts +1 -1
  460. package/build/src/database/drivers/mysql/sql/drop-database.d.ts.map +1 -1
  461. package/build/src/database/drivers/mysql/sql/drop-table.d.ts +1 -1
  462. package/build/src/database/drivers/mysql/sql/drop-table.d.ts.map +1 -1
  463. package/build/src/database/drivers/mysql/sql/insert.d.ts +1 -1
  464. package/build/src/database/drivers/mysql/sql/insert.d.ts.map +1 -1
  465. package/build/src/database/drivers/mysql/sql/remove-index.d.ts +1 -1
  466. package/build/src/database/drivers/mysql/sql/remove-index.d.ts.map +1 -1
  467. package/build/src/database/drivers/mysql/sql/update.d.ts +1 -1
  468. package/build/src/database/drivers/mysql/sql/update.d.ts.map +1 -1
  469. package/build/src/database/drivers/mysql/sql/upsert.d.ts +1 -1
  470. package/build/src/database/drivers/mysql/sql/upsert.d.ts.map +1 -1
  471. package/build/src/database/drivers/mysql/structure-sql.d.ts +14 -3
  472. package/build/src/database/drivers/mysql/structure-sql.d.ts.map +1 -1
  473. package/build/src/database/drivers/mysql/structure-sql.js +62 -11
  474. package/build/src/database/drivers/mysql/table.d.ts +11 -6
  475. package/build/src/database/drivers/mysql/table.d.ts.map +1 -1
  476. package/build/src/database/drivers/pgsql/column.d.ts +10 -5
  477. package/build/src/database/drivers/pgsql/column.d.ts.map +1 -1
  478. package/build/src/database/drivers/pgsql/column.js +2 -2
  479. package/build/src/database/drivers/pgsql/columns-index.d.ts +30 -22
  480. package/build/src/database/drivers/pgsql/columns-index.d.ts.map +1 -1
  481. package/build/src/database/drivers/pgsql/foreign-key.d.ts +1 -1
  482. package/build/src/database/drivers/pgsql/foreign-key.d.ts.map +1 -1
  483. package/build/src/database/drivers/pgsql/index.d.ts +157 -6
  484. package/build/src/database/drivers/pgsql/index.d.ts.map +1 -1
  485. package/build/src/database/drivers/pgsql/index.js +7 -7
  486. package/build/src/database/drivers/pgsql/options.d.ts +1 -1
  487. package/build/src/database/drivers/pgsql/options.d.ts.map +1 -1
  488. package/build/src/database/drivers/pgsql/query-parser.d.ts +1 -1
  489. package/build/src/database/drivers/pgsql/query-parser.d.ts.map +1 -1
  490. package/build/src/database/drivers/pgsql/sql/alter-table.d.ts +1 -1
  491. package/build/src/database/drivers/pgsql/sql/alter-table.d.ts.map +1 -1
  492. package/build/src/database/drivers/pgsql/sql/create-database.d.ts +2 -1
  493. package/build/src/database/drivers/pgsql/sql/create-database.d.ts.map +1 -1
  494. package/build/src/database/drivers/pgsql/sql/create-index.d.ts +1 -1
  495. package/build/src/database/drivers/pgsql/sql/create-index.d.ts.map +1 -1
  496. package/build/src/database/drivers/pgsql/sql/create-table.d.ts +1 -1
  497. package/build/src/database/drivers/pgsql/sql/create-table.d.ts.map +1 -1
  498. package/build/src/database/drivers/pgsql/sql/delete.d.ts +1 -1
  499. package/build/src/database/drivers/pgsql/sql/delete.d.ts.map +1 -1
  500. package/build/src/database/drivers/pgsql/sql/drop-database.d.ts +1 -1
  501. package/build/src/database/drivers/pgsql/sql/drop-database.d.ts.map +1 -1
  502. package/build/src/database/drivers/pgsql/sql/drop-table.d.ts +1 -1
  503. package/build/src/database/drivers/pgsql/sql/drop-table.d.ts.map +1 -1
  504. package/build/src/database/drivers/pgsql/sql/insert.d.ts +1 -1
  505. package/build/src/database/drivers/pgsql/sql/insert.d.ts.map +1 -1
  506. package/build/src/database/drivers/pgsql/sql/remove-index.d.ts +1 -1
  507. package/build/src/database/drivers/pgsql/sql/remove-index.d.ts.map +1 -1
  508. package/build/src/database/drivers/pgsql/sql/update.d.ts +1 -1
  509. package/build/src/database/drivers/pgsql/sql/update.d.ts.map +1 -1
  510. package/build/src/database/drivers/pgsql/sql/upsert.d.ts +1 -1
  511. package/build/src/database/drivers/pgsql/sql/upsert.d.ts.map +1 -1
  512. package/build/src/database/drivers/pgsql/structure-sql.d.ts +3 -3
  513. package/build/src/database/drivers/pgsql/structure-sql.d.ts.map +1 -1
  514. package/build/src/database/drivers/pgsql/structure-sql.js +2 -2
  515. package/build/src/database/drivers/pgsql/table.d.ts +33 -31
  516. package/build/src/database/drivers/pgsql/table.d.ts.map +1 -1
  517. package/build/src/database/drivers/sqlite/base.d.ts +162 -12
  518. package/build/src/database/drivers/sqlite/base.d.ts.map +1 -1
  519. package/build/src/database/drivers/sqlite/base.js +8 -8
  520. package/build/src/database/drivers/sqlite/column.d.ts +12 -6
  521. package/build/src/database/drivers/sqlite/column.d.ts.map +1 -1
  522. package/build/src/database/drivers/sqlite/column.js +2 -2
  523. package/build/src/database/drivers/sqlite/columns-index.d.ts +5 -1
  524. package/build/src/database/drivers/sqlite/columns-index.d.ts.map +1 -1
  525. package/build/src/database/drivers/sqlite/connection-sql-js.d.ts +9 -9
  526. package/build/src/database/drivers/sqlite/connection-sql-js.d.ts.map +1 -1
  527. package/build/src/database/drivers/sqlite/connection-sql-js.js +2 -2
  528. package/build/src/database/drivers/sqlite/foreign-key.d.ts +5 -4
  529. package/build/src/database/drivers/sqlite/foreign-key.d.ts.map +1 -1
  530. package/build/src/database/drivers/sqlite/foreign-key.js +2 -2
  531. package/build/src/database/drivers/sqlite/index.d.ts +53 -3
  532. package/build/src/database/drivers/sqlite/index.d.ts.map +1 -1
  533. package/build/src/database/drivers/sqlite/index.js +2 -2
  534. package/build/src/database/drivers/sqlite/index.native.d.ts +13 -5
  535. package/build/src/database/drivers/sqlite/index.native.d.ts.map +1 -1
  536. package/build/src/database/drivers/sqlite/index.native.js +3 -3
  537. package/build/src/database/drivers/sqlite/index.web.d.ts +48 -14
  538. package/build/src/database/drivers/sqlite/index.web.d.ts.map +1 -1
  539. package/build/src/database/drivers/sqlite/index.web.js +3 -3
  540. package/build/src/database/drivers/sqlite/options.d.ts +1 -1
  541. package/build/src/database/drivers/sqlite/options.d.ts.map +1 -1
  542. package/build/src/database/drivers/sqlite/query-parser.d.ts +1 -1
  543. package/build/src/database/drivers/sqlite/query-parser.d.ts.map +1 -1
  544. package/build/src/database/drivers/sqlite/query.d.ts +2 -2
  545. package/build/src/database/drivers/sqlite/query.d.ts.map +1 -1
  546. package/build/src/database/drivers/sqlite/query.js +3 -3
  547. package/build/src/database/drivers/sqlite/query.native.d.ts +4 -4
  548. package/build/src/database/drivers/sqlite/query.native.d.ts.map +1 -1
  549. package/build/src/database/drivers/sqlite/query.native.js +3 -3
  550. package/build/src/database/drivers/sqlite/query.web.d.ts +2 -2
  551. package/build/src/database/drivers/sqlite/query.web.d.ts.map +1 -1
  552. package/build/src/database/drivers/sqlite/query.web.js +3 -3
  553. package/build/src/database/drivers/sqlite/sql/alter-table.d.ts +19 -4
  554. package/build/src/database/drivers/sqlite/sql/alter-table.d.ts.map +1 -1
  555. package/build/src/database/drivers/sqlite/sql/create-index.d.ts +1 -1
  556. package/build/src/database/drivers/sqlite/sql/create-index.d.ts.map +1 -1
  557. package/build/src/database/drivers/sqlite/sql/create-table.d.ts +1 -1
  558. package/build/src/database/drivers/sqlite/sql/create-table.d.ts.map +1 -1
  559. package/build/src/database/drivers/sqlite/sql/delete.d.ts +1 -1
  560. package/build/src/database/drivers/sqlite/sql/delete.d.ts.map +1 -1
  561. package/build/src/database/drivers/sqlite/sql/drop-table.d.ts +1 -1
  562. package/build/src/database/drivers/sqlite/sql/drop-table.d.ts.map +1 -1
  563. package/build/src/database/drivers/sqlite/sql/insert.d.ts +1 -1
  564. package/build/src/database/drivers/sqlite/sql/insert.d.ts.map +1 -1
  565. package/build/src/database/drivers/sqlite/sql/remove-index.d.ts +1 -1
  566. package/build/src/database/drivers/sqlite/sql/remove-index.d.ts.map +1 -1
  567. package/build/src/database/drivers/sqlite/sql/update.d.ts +1 -1
  568. package/build/src/database/drivers/sqlite/sql/update.d.ts.map +1 -1
  569. package/build/src/database/drivers/sqlite/sql/upsert.d.ts +1 -1
  570. package/build/src/database/drivers/sqlite/sql/upsert.d.ts.map +1 -1
  571. package/build/src/database/drivers/sqlite/structure-sql.d.ts +1 -1
  572. package/build/src/database/drivers/sqlite/structure-sql.d.ts.map +1 -1
  573. package/build/src/database/drivers/sqlite/table-rebuilder.d.ts +5 -5
  574. package/build/src/database/drivers/sqlite/table-rebuilder.d.ts.map +1 -1
  575. package/build/src/database/drivers/sqlite/table-rebuilder.js +2 -2
  576. package/build/src/database/drivers/sqlite/table.d.ts +15 -5
  577. package/build/src/database/drivers/sqlite/table.d.ts.map +1 -1
  578. package/build/src/database/drivers/sqlite/web-persistence.d.ts +28 -34
  579. package/build/src/database/drivers/sqlite/web-persistence.d.ts.map +1 -1
  580. package/build/src/database/drivers/structure-sql/utils.d.ts +2 -2
  581. package/build/src/database/drivers/structure-sql/utils.d.ts.map +1 -1
  582. package/build/src/database/handler.d.ts.map +1 -1
  583. package/build/src/database/initializer-from-require-context.d.ts +18 -16
  584. package/build/src/database/initializer-from-require-context.d.ts.map +1 -1
  585. package/build/src/database/live-query.d.ts +13 -24
  586. package/build/src/database/live-query.d.ts.map +1 -1
  587. package/build/src/database/migration/index.d.ts +146 -169
  588. package/build/src/database/migration/index.d.ts.map +1 -1
  589. package/build/src/database/migration/index.js +3 -3
  590. package/build/src/database/migrations-ledger.d.ts.map +1 -1
  591. package/build/src/database/migrator/files-finder.d.ts +1 -1
  592. package/build/src/database/migrator/files-finder.d.ts.map +1 -1
  593. package/build/src/database/migrator/types.d.ts +26 -2
  594. package/build/src/database/migrator/types.d.ts.map +1 -1
  595. package/build/src/database/migrator/types.js +24 -1
  596. package/build/src/database/migrator.d.ts +10 -10
  597. package/build/src/database/migrator.d.ts.map +1 -1
  598. package/build/src/database/operation-connection.d.ts +3 -3
  599. package/build/src/database/operation-connection.d.ts.map +1 -1
  600. package/build/src/database/operation-lease.d.ts +4 -4
  601. package/build/src/database/operation-lease.d.ts.map +1 -1
  602. package/build/src/database/operation.d.ts +38 -7
  603. package/build/src/database/operation.d.ts.map +1 -1
  604. package/build/src/database/operation.js +55 -8
  605. package/build/src/database/pool/async-tracked-multi-connection.d.ts +174 -79
  606. package/build/src/database/pool/async-tracked-multi-connection.d.ts.map +1 -1
  607. package/build/src/database/pool/async-tracked-multi-connection.js +70 -25
  608. package/build/src/database/pool/base-methods-forward.d.ts.map +1 -1
  609. package/build/src/database/pool/base-methods-forward.js +3 -3
  610. package/build/src/database/pool/base.d.ts +93 -71
  611. package/build/src/database/pool/base.d.ts.map +1 -1
  612. package/build/src/database/pool/base.js +47 -17
  613. package/build/src/database/pool/single-multi-use.d.ts +243 -10
  614. package/build/src/database/pool/single-multi-use.d.ts.map +1 -1
  615. package/build/src/database/pool/single-multi-use.js +467 -103
  616. package/build/src/database/query/alter-table-base.d.ts +8 -3
  617. package/build/src/database/query/alter-table-base.d.ts.map +1 -1
  618. package/build/src/database/query/base.d.ts +3 -3
  619. package/build/src/database/query/base.d.ts.map +1 -1
  620. package/build/src/database/query/create-database-base.d.ts +28 -22
  621. package/build/src/database/query/create-database-base.d.ts.map +1 -1
  622. package/build/src/database/query/create-index-base.d.ts +32 -30
  623. package/build/src/database/query/create-index-base.d.ts.map +1 -1
  624. package/build/src/database/query/create-table-base.d.ts +7 -7
  625. package/build/src/database/query/create-table-base.d.ts.map +1 -1
  626. package/build/src/database/query/delete-base.d.ts +5 -5
  627. package/build/src/database/query/delete-base.d.ts.map +1 -1
  628. package/build/src/database/query/delete-base.js +2 -2
  629. package/build/src/database/query/drop-database-base.d.ts +22 -18
  630. package/build/src/database/query/drop-database-base.d.ts.map +1 -1
  631. package/build/src/database/query/drop-table-base.d.ts +11 -6
  632. package/build/src/database/query/drop-table-base.d.ts.map +1 -1
  633. package/build/src/database/query/from-base.d.ts.map +1 -1
  634. package/build/src/database/query/from-plain.d.ts +3 -2
  635. package/build/src/database/query/from-plain.d.ts.map +1 -1
  636. package/build/src/database/query/from-table.d.ts +3 -2
  637. package/build/src/database/query/from-table.d.ts.map +1 -1
  638. package/build/src/database/query/index.d.ts +92 -107
  639. package/build/src/database/query/index.d.ts.map +1 -1
  640. package/build/src/database/query/index.js +4 -4
  641. package/build/src/database/query/insert-base.d.ts +18 -18
  642. package/build/src/database/query/insert-base.d.ts.map +1 -1
  643. package/build/src/database/query/insert-base.js +5 -5
  644. package/build/src/database/query/join-base.d.ts +1 -1
  645. package/build/src/database/query/join-base.d.ts.map +1 -1
  646. package/build/src/database/query/join-object.d.ts +9 -15
  647. package/build/src/database/query/join-object.d.ts.map +1 -1
  648. package/build/src/database/query/join-plain.d.ts +2 -2
  649. package/build/src/database/query/join-plain.d.ts.map +1 -1
  650. package/build/src/database/query/join-tracker.d.ts +3 -3
  651. package/build/src/database/query/join-tracker.d.ts.map +1 -1
  652. package/build/src/database/query/model-class-query.d.ts +39 -36
  653. package/build/src/database/query/model-class-query.d.ts.map +1 -1
  654. package/build/src/database/query/model-class-query.js +40 -40
  655. package/build/src/database/query/order-base.d.ts +1 -1
  656. package/build/src/database/query/order-base.d.ts.map +1 -1
  657. package/build/src/database/query/order-column.d.ts +19 -22
  658. package/build/src/database/query/order-column.d.ts.map +1 -1
  659. package/build/src/database/query/order-plain.d.ts +3 -3
  660. package/build/src/database/query/order-plain.d.ts.map +1 -1
  661. package/build/src/database/query/preloader/belongs-to.d.ts +5 -5
  662. package/build/src/database/query/preloader/belongs-to.d.ts.map +1 -1
  663. package/build/src/database/query/preloader/belongs-to.js +3 -3
  664. package/build/src/database/query/preloader/ensure-model-class-initialized.d.ts +2 -1
  665. package/build/src/database/query/preloader/ensure-model-class-initialized.d.ts.map +1 -1
  666. package/build/src/database/query/preloader/ensure-model-class-initialized.js +4 -3
  667. package/build/src/database/query/preloader/has-many.d.ts +6 -6
  668. package/build/src/database/query/preloader/has-many.d.ts.map +1 -1
  669. package/build/src/database/query/preloader/has-many.js +4 -4
  670. package/build/src/database/query/preloader/has-one.d.ts +5 -5
  671. package/build/src/database/query/preloader/has-one.d.ts.map +1 -1
  672. package/build/src/database/query/preloader/has-one.js +2 -2
  673. package/build/src/database/query/preloader/query-for-model.d.ts.map +1 -1
  674. package/build/src/database/query/preloader/selection.d.ts +6 -6
  675. package/build/src/database/query/preloader/selection.d.ts.map +1 -1
  676. package/build/src/database/query/preloader.d.ts +8 -8
  677. package/build/src/database/query/preloader.d.ts.map +1 -1
  678. package/build/src/database/query/preloader.js +9 -3
  679. package/build/src/database/query/query-data.d.ts +43 -55
  680. package/build/src/database/query/query-data.d.ts.map +1 -1
  681. package/build/src/database/query/query-data.js +8 -8
  682. package/build/src/database/query/remove-index-base.d.ts +21 -19
  683. package/build/src/database/query/remove-index-base.d.ts.map +1 -1
  684. package/build/src/database/query/select-base.d.ts +1 -1
  685. package/build/src/database/query/select-base.d.ts.map +1 -1
  686. package/build/src/database/query/select-plain.d.ts +3 -2
  687. package/build/src/database/query/select-plain.d.ts.map +1 -1
  688. package/build/src/database/query/select-table-and-column.d.ts +4 -3
  689. package/build/src/database/query/select-table-and-column.d.ts.map +1 -1
  690. package/build/src/database/query/update-base.d.ts +10 -10
  691. package/build/src/database/query/update-base.d.ts.map +1 -1
  692. package/build/src/database/query/update-base.js +4 -4
  693. package/build/src/database/query/upsert-base.d.ts +9 -9
  694. package/build/src/database/query/upsert-base.d.ts.map +1 -1
  695. package/build/src/database/query/upsert-base.js +3 -3
  696. package/build/src/database/query/where-base.d.ts +1 -1
  697. package/build/src/database/query/where-base.d.ts.map +1 -1
  698. package/build/src/database/query/where-combinator.d.ts +9 -4
  699. package/build/src/database/query/where-combinator.d.ts.map +1 -1
  700. package/build/src/database/query/where-hash.d.ts +11 -9
  701. package/build/src/database/query/where-hash.d.ts.map +1 -1
  702. package/build/src/database/query/where-model-class-hash.d.ts +28 -26
  703. package/build/src/database/query/where-model-class-hash.d.ts.map +1 -1
  704. package/build/src/database/query/where-model-class-hash.js +14 -14
  705. package/build/src/database/query/where-not.d.ts +8 -3
  706. package/build/src/database/query/where-not.d.ts.map +1 -1
  707. package/build/src/database/query/where-plain.d.ts +4 -3
  708. package/build/src/database/query/where-plain.d.ts.map +1 -1
  709. package/build/src/database/query/with-count.d.ts +22 -28
  710. package/build/src/database/query/with-count.d.ts.map +1 -1
  711. package/build/src/database/query/with-count.js +12 -12
  712. package/build/src/database/query-aborted-error.d.ts +5 -5
  713. package/build/src/database/query-aborted-error.d.ts.map +1 -1
  714. package/build/src/database/query-parser/base-query-parser.d.ts +3 -3
  715. package/build/src/database/query-parser/base-query-parser.d.ts.map +1 -1
  716. package/build/src/database/query-parser/from-parser.d.ts +2 -2
  717. package/build/src/database/query-parser/from-parser.d.ts.map +1 -1
  718. package/build/src/database/query-parser/group-parser.d.ts +2 -2
  719. package/build/src/database/query-parser/group-parser.d.ts.map +1 -1
  720. package/build/src/database/query-parser/joins-parser.d.ts +3 -3
  721. package/build/src/database/query-parser/joins-parser.d.ts.map +1 -1
  722. package/build/src/database/query-parser/limit-parser.d.ts +2 -2
  723. package/build/src/database/query-parser/limit-parser.d.ts.map +1 -1
  724. package/build/src/database/query-parser/options.d.ts +31 -34
  725. package/build/src/database/query-parser/options.d.ts.map +1 -1
  726. package/build/src/database/query-parser/options.js +3 -3
  727. package/build/src/database/query-parser/order-parser.d.ts +2 -2
  728. package/build/src/database/query-parser/order-parser.d.ts.map +1 -1
  729. package/build/src/database/query-parser/select-parser.d.ts +2 -2
  730. package/build/src/database/query-parser/select-parser.d.ts.map +1 -1
  731. package/build/src/database/query-parser/select-parser.js +2 -2
  732. package/build/src/database/query-parser/where-parser.d.ts +2 -2
  733. package/build/src/database/query-parser/where-parser.d.ts.map +1 -1
  734. package/build/src/database/record/acts-as-list.d.ts.map +1 -1
  735. package/build/src/database/record/acts-as-list.js +3 -3
  736. package/build/src/database/record/attachments/attachment-record.d.ts +7 -3
  737. package/build/src/database/record/attachments/attachment-record.d.ts.map +1 -1
  738. package/build/src/database/record/attachments/download.d.ts +9 -9
  739. package/build/src/database/record/attachments/download.d.ts.map +1 -1
  740. package/build/src/database/record/attachments/handle.d.ts +12 -12
  741. package/build/src/database/record/attachments/handle.d.ts.map +1 -1
  742. package/build/src/database/record/attachments/handle.js +7 -7
  743. package/build/src/database/record/attachments/normalize-input.d.ts +16 -22
  744. package/build/src/database/record/attachments/normalize-input.d.ts.map +1 -1
  745. package/build/src/database/record/attachments/normalize-input.js +12 -12
  746. package/build/src/database/record/attachments/storage-drivers/filesystem.d.ts +4 -4
  747. package/build/src/database/record/attachments/storage-drivers/filesystem.d.ts.map +1 -1
  748. package/build/src/database/record/attachments/storage-drivers/filesystem.js +2 -2
  749. package/build/src/database/record/attachments/storage-drivers/native.d.ts +12 -12
  750. package/build/src/database/record/attachments/storage-drivers/native.d.ts.map +1 -1
  751. package/build/src/database/record/attachments/storage-drivers/native.js +6 -6
  752. package/build/src/database/record/attachments/storage-drivers/s3.d.ts +17 -17
  753. package/build/src/database/record/attachments/storage-drivers/s3.d.ts.map +1 -1
  754. package/build/src/database/record/attachments/storage-drivers/s3.js +11 -11
  755. package/build/src/database/record/attachments/store.d.ts +38 -41
  756. package/build/src/database/record/attachments/store.d.ts.map +1 -1
  757. package/build/src/database/record/attachments/store.js +24 -21
  758. package/build/src/database/record/auditing.d.ts +67 -87
  759. package/build/src/database/record/auditing.d.ts.map +1 -1
  760. package/build/src/database/record/auditing.js +109 -30
  761. package/build/src/database/record/counter-cache-magnitude.d.ts +15 -35
  762. package/build/src/database/record/counter-cache-magnitude.d.ts.map +1 -1
  763. package/build/src/database/record/counter-cache-magnitude.js +12 -12
  764. package/build/src/database/record/index.d.ts +2390 -488
  765. package/build/src/database/record/index.d.ts.map +1 -1
  766. package/build/src/database/record/index.js +222 -172
  767. package/build/src/database/record/instance-relationships/base.d.ts +20 -23
  768. package/build/src/database/record/instance-relationships/base.d.ts.map +1 -1
  769. package/build/src/database/record/instance-relationships/base.js +5 -5
  770. package/build/src/database/record/instance-relationships/belongs-to.d.ts +9 -1
  771. package/build/src/database/record/instance-relationships/belongs-to.d.ts.map +1 -1
  772. package/build/src/database/record/instance-relationships/belongs-to.js +2 -2
  773. package/build/src/database/record/instance-relationships/has-many.d.ts +15 -3
  774. package/build/src/database/record/instance-relationships/has-many.d.ts.map +1 -1
  775. package/build/src/database/record/instance-relationships/has-many.js +4 -4
  776. package/build/src/database/record/instance-relationships/has-one.d.ts +19 -1
  777. package/build/src/database/record/instance-relationships/has-one.d.ts.map +1 -1
  778. package/build/src/database/record/instance-relationships/has-one.js +2 -2
  779. package/build/src/database/record/record-not-found-error.d.ts +1 -0
  780. package/build/src/database/record/record-not-found-error.d.ts.map +1 -1
  781. package/build/src/database/record/record-not-found-error.js +2 -1
  782. package/build/src/database/record/relationships/base.d.ts +83 -71
  783. package/build/src/database/record/relationships/base.d.ts.map +1 -1
  784. package/build/src/database/record/relationships/base.js +21 -1
  785. package/build/src/database/record/relationships/belongs-to.d.ts +11 -1
  786. package/build/src/database/record/relationships/belongs-to.d.ts.map +1 -1
  787. package/build/src/database/record/relationships/has-many.d.ts +11 -1
  788. package/build/src/database/record/relationships/has-many.d.ts.map +1 -1
  789. package/build/src/database/record/relationships/has-one.d.ts +11 -1
  790. package/build/src/database/record/relationships/has-one.d.ts.map +1 -1
  791. package/build/src/database/record/state-machine.d.ts +20 -29
  792. package/build/src/database/record/state-machine.d.ts.map +1 -1
  793. package/build/src/database/record/state-machine.js +7 -7
  794. package/build/src/database/record/user-module.d.ts +1 -1
  795. package/build/src/database/record/user-module.d.ts.map +1 -1
  796. package/build/src/database/record/validation-messages.d.ts +19 -22
  797. package/build/src/database/record/validation-messages.d.ts.map +1 -1
  798. package/build/src/database/record/validators/base.d.ts +4 -4
  799. package/build/src/database/record/validators/base.d.ts.map +1 -1
  800. package/build/src/database/record/validators/base.js +2 -2
  801. package/build/src/database/record/validators/format.d.ts +12 -1
  802. package/build/src/database/record/validators/format.d.ts.map +1 -1
  803. package/build/src/database/record/validators/length.d.ts +14 -1
  804. package/build/src/database/record/validators/length.d.ts.map +1 -1
  805. package/build/src/database/record/validators/presence.d.ts +11 -1
  806. package/build/src/database/record/validators/presence.d.ts.map +1 -1
  807. package/build/src/database/record/validators/uniqueness.d.ts +12 -1
  808. package/build/src/database/record/validators/uniqueness.d.ts.map +1 -1
  809. package/build/src/database/record-changes.d.ts +7 -18
  810. package/build/src/database/record-changes.d.ts.map +1 -1
  811. package/build/src/database/structure-sql-loader.d.ts +2 -2
  812. package/build/src/database/structure-sql-loader.d.ts.map +1 -1
  813. package/build/src/database/structure-sql-loader.js +4 -4
  814. package/build/src/database/table-data/index.d.ts +21 -24
  815. package/build/src/database/table-data/index.d.ts.map +1 -1
  816. package/build/src/database/table-data/table-column.d.ts +74 -80
  817. package/build/src/database/table-data/table-column.d.ts.map +1 -1
  818. package/build/src/database/table-data/table-column.js +4 -4
  819. package/build/src/database/table-data/table-foreign-key.d.ts +10 -10
  820. package/build/src/database/table-data/table-foreign-key.d.ts.map +1 -1
  821. package/build/src/database/table-data/table-index.d.ts +12 -15
  822. package/build/src/database/table-data/table-index.d.ts.map +1 -1
  823. package/build/src/database/table-data/table-reference.d.ts +2 -2
  824. package/build/src/database/table-data/table-reference.d.ts.map +1 -1
  825. package/build/src/database/tenants/data-copier.d.ts +7 -7
  826. package/build/src/database/tenants/data-copier.d.ts.map +1 -1
  827. package/build/src/database/tenants/schema-cloner.d.ts +3 -3
  828. package/build/src/database/tenants/schema-cloner.d.ts.map +1 -1
  829. package/build/src/database/tenants/tenant-table-plan.d.ts +20 -14
  830. package/build/src/database/tenants/tenant-table-plan.d.ts.map +1 -1
  831. package/build/src/database/tenants/tenant-table-plan.js +17 -1
  832. package/build/src/database/use-database.d.ts.map +1 -1
  833. package/build/src/database/use-live-query.d.ts +17 -29
  834. package/build/src/database/use-live-query.d.ts.map +1 -1
  835. package/build/src/database/use-live-query.js +4 -4
  836. package/build/src/environment-handlers/base.d.ts +112 -103
  837. package/build/src/environment-handlers/base.d.ts.map +1 -1
  838. package/build/src/environment-handlers/base.js +54 -38
  839. package/build/src/environment-handlers/browser.d.ts +63 -56
  840. package/build/src/environment-handlers/browser.d.ts.map +1 -1
  841. package/build/src/environment-handlers/browser.js +2 -2
  842. package/build/src/environment-handlers/node/attachment-path-source.d.ts +9 -9
  843. package/build/src/environment-handlers/node/attachment-path-source.d.ts.map +1 -1
  844. package/build/src/environment-handlers/node/cli/commands/background-jobs-main.d.ts +1 -1
  845. package/build/src/environment-handlers/node/cli/commands/background-jobs-main.d.ts.map +1 -1
  846. package/build/src/environment-handlers/node/cli/commands/background-jobs-runner.d.ts +1 -1
  847. package/build/src/environment-handlers/node/cli/commands/background-jobs-runner.d.ts.map +1 -1
  848. package/build/src/environment-handlers/node/cli/commands/background-jobs-worker.d.ts +1 -1
  849. package/build/src/environment-handlers/node/cli/commands/background-jobs-worker.d.ts.map +1 -1
  850. package/build/src/environment-handlers/node/cli/commands/beacon.d.ts +1 -1
  851. package/build/src/environment-handlers/node/cli/commands/beacon.d.ts.map +1 -1
  852. package/build/src/environment-handlers/node/cli/commands/cli-command-context.d.ts +7 -10
  853. package/build/src/environment-handlers/node/cli/commands/cli-command-context.d.ts.map +1 -1
  854. package/build/src/environment-handlers/node/cli/commands/console.d.ts +9 -7
  855. package/build/src/environment-handlers/node/cli/commands/console.d.ts.map +1 -1
  856. package/build/src/environment-handlers/node/cli/commands/console.js +5 -5
  857. package/build/src/environment-handlers/node/cli/commands/db/schema/dump.d.ts +1 -1
  858. package/build/src/environment-handlers/node/cli/commands/db/schema/dump.d.ts.map +1 -1
  859. package/build/src/environment-handlers/node/cli/commands/db/schema/load.d.ts +1 -1
  860. package/build/src/environment-handlers/node/cli/commands/db/schema/load.d.ts.map +1 -1
  861. package/build/src/environment-handlers/node/cli/commands/db/seed.d.ts +7 -5
  862. package/build/src/environment-handlers/node/cli/commands/db/seed.d.ts.map +1 -1
  863. package/build/src/environment-handlers/node/cli/commands/db/seed.js +3 -3
  864. package/build/src/environment-handlers/node/cli/commands/destroy/migration.d.ts +4 -7
  865. package/build/src/environment-handlers/node/cli/commands/destroy/migration.d.ts.map +1 -1
  866. package/build/src/environment-handlers/node/cli/commands/generate/base-models.d.ts +1 -1
  867. package/build/src/environment-handlers/node/cli/commands/generate/base-models.d.ts.map +1 -1
  868. package/build/src/environment-handlers/node/cli/commands/generate/base-models.js +2 -2
  869. package/build/src/environment-handlers/node/cli/commands/generate/frontend-models.d.ts +93 -108
  870. package/build/src/environment-handlers/node/cli/commands/generate/frontend-models.d.ts.map +1 -1
  871. package/build/src/environment-handlers/node/cli/commands/generate/generated-file-banner.d.ts.map +1 -1
  872. package/build/src/environment-handlers/node/cli/commands/generate/migration.d.ts +9 -12
  873. package/build/src/environment-handlers/node/cli/commands/generate/migration.d.ts.map +1 -1
  874. package/build/src/environment-handlers/node/cli/commands/generate/model.d.ts +8 -11
  875. package/build/src/environment-handlers/node/cli/commands/generate/model.d.ts.map +1 -1
  876. package/build/src/environment-handlers/node/cli/commands/init.d.ts +7 -9
  877. package/build/src/environment-handlers/node/cli/commands/init.d.ts.map +1 -1
  878. package/build/src/environment-handlers/node/cli/commands/lint/relationships.d.ts +7 -7
  879. package/build/src/environment-handlers/node/cli/commands/lint/relationships.d.ts.map +1 -1
  880. package/build/src/environment-handlers/node/cli/commands/routes.d.ts +1 -1
  881. package/build/src/environment-handlers/node/cli/commands/routes.d.ts.map +1 -1
  882. package/build/src/environment-handlers/node/cli/commands/run-script.d.ts +7 -5
  883. package/build/src/environment-handlers/node/cli/commands/run-script.d.ts.map +1 -1
  884. package/build/src/environment-handlers/node/cli/commands/run-script.js +3 -3
  885. package/build/src/environment-handlers/node/cli/commands/runner.d.ts +9 -7
  886. package/build/src/environment-handlers/node/cli/commands/runner.d.ts.map +1 -1
  887. package/build/src/environment-handlers/node/cli/commands/runner.js +3 -3
  888. package/build/src/environment-handlers/node/cli/commands/server.d.ts +24 -30
  889. package/build/src/environment-handlers/node/cli/commands/server.d.ts.map +1 -1
  890. package/build/src/environment-handlers/node/cli/commands/server.js +2 -2
  891. package/build/src/environment-handlers/node/cli/commands/test.d.ts +5 -5
  892. package/build/src/environment-handlers/node/cli/commands/test.d.ts.map +1 -1
  893. package/build/src/environment-handlers/node/source-peer-package.d.ts +5 -7
  894. package/build/src/environment-handlers/node/source-peer-package.d.ts.map +1 -1
  895. package/build/src/environment-handlers/node/source-peer-package.js +1 -1
  896. package/build/src/environment-handlers/node.d.ts +362 -13
  897. package/build/src/environment-handlers/node.d.ts.map +1 -1
  898. package/build/src/environment-handlers/node.js +37 -37
  899. package/build/src/error-logger.d.ts +3 -3
  900. package/build/src/error-logger.d.ts.map +1 -1
  901. package/build/src/error-logger.js +3 -3
  902. package/build/src/error-reporting/request-details.d.ts +1 -1
  903. package/build/src/error-reporting/request-details.d.ts.map +1 -1
  904. package/build/src/error-reporting/request-details.js +33 -33
  905. package/build/src/frontend-model-controller.d.ts +216 -230
  906. package/build/src/frontend-model-controller.d.ts.map +1 -1
  907. package/build/src/frontend-model-controller.js +217 -211
  908. package/build/src/frontend-model-resource/base-resource.d.ts +315 -365
  909. package/build/src/frontend-model-resource/base-resource.d.ts.map +1 -1
  910. package/build/src/frontend-model-resource/base-resource.js +45 -45
  911. package/build/src/frontend-model-resource/velocious-attachment-resource.d.ts +11 -5
  912. package/build/src/frontend-model-resource/velocious-attachment-resource.d.ts.map +1 -1
  913. package/build/src/frontend-model-resource/velocious-attachment-resource.js +2 -2
  914. package/build/src/frontend-models/base.d.ts +632 -726
  915. package/build/src/frontend-models/base.d.ts.map +1 -1
  916. package/build/src/frontend-models/base.js +147 -143
  917. package/build/src/frontend-models/built-in-resources.d.ts +2 -2
  918. package/build/src/frontend-models/built-in-resources.d.ts.map +1 -1
  919. package/build/src/frontend-models/clear-pending-debounced-callback.d.ts +2 -2
  920. package/build/src/frontend-models/clear-pending-debounced-callback.d.ts.map +1 -1
  921. package/build/src/frontend-models/clear-pending-debounced-callback.js +3 -3
  922. package/build/src/frontend-models/event-hook-models.d.ts +3 -6
  923. package/build/src/frontend-models/event-hook-models.d.ts.map +1 -1
  924. package/build/src/frontend-models/model-registry.d.ts +5 -5
  925. package/build/src/frontend-models/model-registry.d.ts.map +1 -1
  926. package/build/src/frontend-models/model-registry.js +5 -5
  927. package/build/src/frontend-models/outgoing-event-buffer.d.ts +20 -17
  928. package/build/src/frontend-models/outgoing-event-buffer.d.ts.map +1 -1
  929. package/build/src/frontend-models/outgoing-event-buffer.js +2 -2
  930. package/build/src/frontend-models/preloader.d.ts.map +1 -1
  931. package/build/src/frontend-models/preloader.js +2 -2
  932. package/build/src/frontend-models/query.d.ts +286 -331
  933. package/build/src/frontend-models/query.d.ts.map +1 -1
  934. package/build/src/frontend-models/query.js +61 -61
  935. package/build/src/frontend-models/resource-config-validation.d.ts +2 -2
  936. package/build/src/frontend-models/resource-config-validation.d.ts.map +1 -1
  937. package/build/src/frontend-models/resource-definition.d.ts +30 -33
  938. package/build/src/frontend-models/resource-definition.d.ts.map +1 -1
  939. package/build/src/frontend-models/resource-definition.js +10 -10
  940. package/build/src/frontend-models/transport-deadline.d.ts.map +1 -1
  941. package/build/src/frontend-models/transport-serialization.d.ts +26 -32
  942. package/build/src/frontend-models/transport-serialization.d.ts.map +1 -1
  943. package/build/src/frontend-models/transport-serialization.js +28 -28
  944. package/build/src/frontend-models/use-created-event.d.ts +4 -4
  945. package/build/src/frontend-models/use-created-event.d.ts.map +1 -1
  946. package/build/src/frontend-models/use-destroyed-event.d.ts +8 -29
  947. package/build/src/frontend-models/use-destroyed-event.d.ts.map +1 -1
  948. package/build/src/frontend-models/use-model-class-event.d.ts +9 -33
  949. package/build/src/frontend-models/use-model-class-event.d.ts.map +1 -1
  950. package/build/src/frontend-models/use-updated-event.d.ts +8 -29
  951. package/build/src/frontend-models/use-updated-event.d.ts.map +1 -1
  952. package/build/src/frontend-models/websocket-channel.d.ts +30 -34
  953. package/build/src/frontend-models/websocket-channel.d.ts.map +1 -1
  954. package/build/src/frontend-models/websocket-channel.js +5 -5
  955. package/build/src/frontend-models/websocket-publishers.d.ts +4 -4
  956. package/build/src/frontend-models/websocket-publishers.d.ts.map +1 -1
  957. package/build/src/frontend-models/websocket-publishers.js +2 -2
  958. package/build/src/http-client/header.d.ts +2 -2
  959. package/build/src/http-client/header.d.ts.map +1 -1
  960. package/build/src/http-client/index.d.ts +23 -23
  961. package/build/src/http-client/index.d.ts.map +1 -1
  962. package/build/src/http-client/request.d.ts +9 -9
  963. package/build/src/http-client/request.d.ts.map +1 -1
  964. package/build/src/http-client/request.js +2 -2
  965. package/build/src/http-client/response.d.ts +12 -12
  966. package/build/src/http-client/response.d.ts.map +1 -1
  967. package/build/src/http-client/response.js +2 -2
  968. package/build/src/http-client/websocket-client.d.ts +20 -4
  969. package/build/src/http-client/websocket-client.d.ts.map +1 -1
  970. package/build/src/http-server/client/index.d.ts +26 -26
  971. package/build/src/http-server/client/index.d.ts.map +1 -1
  972. package/build/src/http-server/client/index.js +5 -5
  973. package/build/src/http-server/client/params-to-object.d.ts +11 -11
  974. package/build/src/http-server/client/params-to-object.d.ts.map +1 -1
  975. package/build/src/http-server/client/params-to-object.js +17 -17
  976. package/build/src/http-server/client/request-buffer/form-data-part.d.ts +9 -9
  977. package/build/src/http-server/client/request-buffer/form-data-part.d.ts.map +1 -1
  978. package/build/src/http-server/client/request-buffer/header.d.ts +3 -3
  979. package/build/src/http-server/client/request-buffer/header.d.ts.map +1 -1
  980. package/build/src/http-server/client/request-buffer/index.d.ts +28 -30
  981. package/build/src/http-server/client/request-buffer/index.d.ts.map +1 -1
  982. package/build/src/http-server/client/request-buffer/index.js +5 -3
  983. package/build/src/http-server/client/request-parser.d.ts +11 -11
  984. package/build/src/http-server/client/request-parser.d.ts.map +1 -1
  985. package/build/src/http-server/client/request-parser.js +3 -3
  986. package/build/src/http-server/client/request-runner.d.ts +11 -11
  987. package/build/src/http-server/client/request-runner.d.ts.map +1 -1
  988. package/build/src/http-server/client/request-runner.js +3 -3
  989. package/build/src/http-server/client/request-timing.d.ts +5 -11
  990. package/build/src/http-server/client/request-timing.d.ts.map +1 -1
  991. package/build/src/http-server/client/request.d.ts +10 -10
  992. package/build/src/http-server/client/request.d.ts.map +1 -1
  993. package/build/src/http-server/client/request.js +3 -3
  994. package/build/src/http-server/client/response-compression.d.ts +5 -5
  995. package/build/src/http-server/client/response-compression.d.ts.map +1 -1
  996. package/build/src/http-server/client/response.d.ts +13 -13
  997. package/build/src/http-server/client/response.d.ts.map +1 -1
  998. package/build/src/http-server/client/uploaded-file/memory-uploaded-file.d.ts +8 -2
  999. package/build/src/http-server/client/uploaded-file/memory-uploaded-file.d.ts.map +1 -1
  1000. package/build/src/http-server/client/uploaded-file/temporary-uploaded-file.d.ts +8 -2
  1001. package/build/src/http-server/client/uploaded-file/temporary-uploaded-file.d.ts.map +1 -1
  1002. package/build/src/http-server/client/uploaded-file/uploaded-file.d.ts +4 -4
  1003. package/build/src/http-server/client/uploaded-file/uploaded-file.d.ts.map +1 -1
  1004. package/build/src/http-server/client/websocket-request.d.ts +26 -26
  1005. package/build/src/http-server/client/websocket-request.d.ts.map +1 -1
  1006. package/build/src/http-server/client/websocket-request.js +7 -7
  1007. package/build/src/http-server/client/websocket-session.d.ts +105 -108
  1008. package/build/src/http-server/client/websocket-session.d.ts.map +1 -1
  1009. package/build/src/http-server/client/websocket-session.js +29 -29
  1010. package/build/src/http-server/client-delivery-queue.d.ts +30 -30
  1011. package/build/src/http-server/client-delivery-queue.d.ts.map +1 -1
  1012. package/build/src/http-server/cookie.d.ts +80 -108
  1013. package/build/src/http-server/cookie.d.ts.map +1 -1
  1014. package/build/src/http-server/cookie.js +3 -3
  1015. package/build/src/http-server/development-reloader.d.ts +24 -24
  1016. package/build/src/http-server/development-reloader.d.ts.map +1 -1
  1017. package/build/src/http-server/development-reloader.js +2 -2
  1018. package/build/src/http-server/index.d.ts +66 -72
  1019. package/build/src/http-server/index.d.ts.map +1 -1
  1020. package/build/src/http-server/index.js +6 -6
  1021. package/build/src/http-server/remote-address.d.ts.map +1 -1
  1022. package/build/src/http-server/remote-address.js +2 -2
  1023. package/build/src/http-server/server-client.d.ts +9 -9
  1024. package/build/src/http-server/server-client.d.ts.map +1 -1
  1025. package/build/src/http-server/server-lock.d.ts +11 -11
  1026. package/build/src/http-server/server-lock.d.ts.map +1 -1
  1027. package/build/src/http-server/server-lock.js +5 -5
  1028. package/build/src/http-server/websocket-channel-subscribers.d.ts +11 -10
  1029. package/build/src/http-server/websocket-channel-subscribers.d.ts.map +1 -1
  1030. package/build/src/http-server/websocket-channel-subscribers.js +6 -6
  1031. package/build/src/http-server/websocket-channel.d.ts +8 -14
  1032. package/build/src/http-server/websocket-channel.d.ts.map +1 -1
  1033. package/build/src/http-server/websocket-channel.js +2 -2
  1034. package/build/src/http-server/websocket-connection.d.ts +10 -10
  1035. package/build/src/http-server/websocket-connection.d.ts.map +1 -1
  1036. package/build/src/http-server/websocket-connection.js +4 -4
  1037. package/build/src/http-server/websocket-event-log-store.d.ts +58 -64
  1038. package/build/src/http-server/websocket-event-log-store.d.ts.map +1 -1
  1039. package/build/src/http-server/websocket-event-log-store.js +10 -10
  1040. package/build/src/http-server/websocket-events-host.d.ts +17 -16
  1041. package/build/src/http-server/websocket-events-host.d.ts.map +1 -1
  1042. package/build/src/http-server/websocket-events-host.js +8 -8
  1043. package/build/src/http-server/websocket-events.d.ts +9 -9
  1044. package/build/src/http-server/websocket-events.d.ts.map +1 -1
  1045. package/build/src/http-server/websocket-events.js +5 -5
  1046. package/build/src/http-server/worker-handler/channel-subscriber-dispatch.d.ts +2 -2
  1047. package/build/src/http-server/worker-handler/channel-subscriber-dispatch.d.ts.map +1 -1
  1048. package/build/src/http-server/worker-handler/channel-subscriber-dispatch.js +2 -2
  1049. package/build/src/http-server/worker-handler/in-process.d.ts +22 -22
  1050. package/build/src/http-server/worker-handler/in-process.d.ts.map +1 -1
  1051. package/build/src/http-server/worker-handler/in-process.js +6 -6
  1052. package/build/src/http-server/worker-handler/index.d.ts +50 -50
  1053. package/build/src/http-server/worker-handler/index.d.ts.map +1 -1
  1054. package/build/src/http-server/worker-handler/index.js +11 -11
  1055. package/build/src/http-server/worker-handler/worker-thread.d.ts +61 -61
  1056. package/build/src/http-server/worker-handler/worker-thread.d.ts.map +1 -1
  1057. package/build/src/http-server/worker-handler/worker-thread.js +9 -9
  1058. package/build/src/initializer.d.ts +2 -2
  1059. package/build/src/initializer.d.ts.map +1 -1
  1060. package/build/src/jobs/mail-delivery.d.ts +7 -2
  1061. package/build/src/jobs/mail-delivery.d.ts.map +1 -1
  1062. package/build/src/jobs/prune-terminal-background-jobs.d.ts +15 -2
  1063. package/build/src/jobs/prune-terminal-background-jobs.d.ts.map +1 -1
  1064. package/build/src/jobs/prune-terminal-background-jobs.js +1 -1
  1065. package/build/src/logger/base-logger.d.ts.map +1 -1
  1066. package/build/src/logger/base-logger.js +2 -2
  1067. package/build/src/logger/console-logger.d.ts +3 -3
  1068. package/build/src/logger/console-logger.d.ts.map +1 -1
  1069. package/build/src/logger/file-logger.d.ts +4 -4
  1070. package/build/src/logger/file-logger.d.ts.map +1 -1
  1071. package/build/src/logger/outputs/array-output.d.ts +9 -12
  1072. package/build/src/logger/outputs/array-output.d.ts.map +1 -1
  1073. package/build/src/logger/outputs/console-output.d.ts +1 -4
  1074. package/build/src/logger/outputs/console-output.d.ts.map +1 -1
  1075. package/build/src/logger/outputs/file-output.d.ts +13 -16
  1076. package/build/src/logger/outputs/file-output.d.ts.map +1 -1
  1077. package/build/src/logger/outputs/stdout-output.d.ts +1 -4
  1078. package/build/src/logger/outputs/stdout-output.d.ts.map +1 -1
  1079. package/build/src/logger.d.ts +30 -29
  1080. package/build/src/logger.d.ts.map +1 -1
  1081. package/build/src/logger.js +13 -13
  1082. package/build/src/mailer/backends/smtp.d.ts +8 -11
  1083. package/build/src/mailer/backends/smtp.d.ts.map +1 -1
  1084. package/build/src/mailer/backends/smtp.js +4 -4
  1085. package/build/src/mailer/base.d.ts +61 -61
  1086. package/build/src/mailer/base.d.ts.map +1 -1
  1087. package/build/src/mailer/base.js +15 -15
  1088. package/build/src/mailer/delivery.d.ts +16 -16
  1089. package/build/src/mailer/delivery.d.ts.map +1 -1
  1090. package/build/src/mailer/delivery.js +4 -4
  1091. package/build/src/mailer/index.d.ts +8 -13
  1092. package/build/src/mailer/index.d.ts.map +1 -1
  1093. package/build/src/mailer/index.js +2 -2
  1094. package/build/src/mailer.d.ts +9 -7
  1095. package/build/src/mailer.d.ts.map +1 -1
  1096. package/build/src/mailer.js +2 -2
  1097. package/build/src/packages/velocious-package.d.ts +5 -5
  1098. package/build/src/packages/velocious-package.d.ts.map +1 -1
  1099. package/build/src/plugins/sqljs-wasm-route-controller.d.ts +1 -1
  1100. package/build/src/plugins/sqljs-wasm-route-controller.d.ts.map +1 -1
  1101. package/build/src/plugins/sqljs-wasm-route-controller.js +2 -2
  1102. package/build/src/plugins/sqljs-wasm-route.d.ts +14 -20
  1103. package/build/src/plugins/sqljs-wasm-route.d.ts.map +1 -1
  1104. package/build/src/plugins/sqljs-wasm-route.js +1 -1
  1105. package/build/src/record-payload-values.d.ts +14 -14
  1106. package/build/src/record-payload-values.d.ts.map +1 -1
  1107. package/build/src/record-payload-values.js +4 -4
  1108. package/build/src/routes/app-routes.d.ts.map +1 -1
  1109. package/build/src/routes/base-route.d.ts +11 -10
  1110. package/build/src/routes/base-route.d.ts.map +1 -1
  1111. package/build/src/routes/base-route.js +6 -6
  1112. package/build/src/routes/basic-route.d.ts +36 -3
  1113. package/build/src/routes/basic-route.d.ts.map +1 -1
  1114. package/build/src/routes/basic-route.js +5 -5
  1115. package/build/src/routes/built-in/api-manifest/controller.d.ts +1 -1
  1116. package/build/src/routes/built-in/api-manifest/controller.d.ts.map +1 -1
  1117. package/build/src/routes/built-in/debug/controller.d.ts +1 -1
  1118. package/build/src/routes/built-in/debug/controller.d.ts.map +1 -1
  1119. package/build/src/routes/built-in/errors/controller.d.ts +1 -1
  1120. package/build/src/routes/built-in/errors/controller.d.ts.map +1 -1
  1121. package/build/src/routes/get-route.d.ts +19 -4
  1122. package/build/src/routes/get-route.d.ts.map +1 -1
  1123. package/build/src/routes/get-route.js +3 -3
  1124. package/build/src/routes/hooks/frontend-model-command-route-hook.d.ts +1 -1
  1125. package/build/src/routes/hooks/frontend-model-command-route-hook.d.ts.map +1 -1
  1126. package/build/src/routes/hooks/frontend-model-command-route-hook.js +2 -2
  1127. package/build/src/routes/index.d.ts +5 -5
  1128. package/build/src/routes/index.d.ts.map +1 -1
  1129. package/build/src/routes/index.js +4 -4
  1130. package/build/src/routes/namespace-route.d.ts +19 -4
  1131. package/build/src/routes/namespace-route.d.ts.map +1 -1
  1132. package/build/src/routes/namespace-route.js +2 -2
  1133. package/build/src/routes/plugin-routes.d.ts +16 -19
  1134. package/build/src/routes/plugin-routes.d.ts.map +1 -1
  1135. package/build/src/routes/plugin-routes.js +2 -2
  1136. package/build/src/routes/post-route.d.ts +19 -4
  1137. package/build/src/routes/post-route.d.ts.map +1 -1
  1138. package/build/src/routes/post-route.js +3 -3
  1139. package/build/src/routes/resolver.d.ts +16 -16
  1140. package/build/src/routes/resolver.d.ts.map +1 -1
  1141. package/build/src/routes/resolver.js +6 -6
  1142. package/build/src/routes/resource-route.d.ts +23 -8
  1143. package/build/src/routes/resource-route.d.ts.map +1 -1
  1144. package/build/src/routes/resource-route.js +2 -2
  1145. package/build/src/routes/root-route.d.ts +1 -1
  1146. package/build/src/routes/root-route.d.ts.map +1 -1
  1147. package/build/src/sync/conflict-strategy.d.ts +50 -35
  1148. package/build/src/sync/conflict-strategy.d.ts.map +1 -1
  1149. package/build/src/sync/conflict-strategy.js +2 -2
  1150. package/build/src/sync/device-identity.d.ts +109 -79
  1151. package/build/src/sync/device-identity.d.ts.map +1 -1
  1152. package/build/src/sync/local-mutation-log.d.ts +115 -92
  1153. package/build/src/sync/local-mutation-log.d.ts.map +1 -1
  1154. package/build/src/sync/offline-grant.d.ts +80 -63
  1155. package/build/src/sync/offline-grant.d.ts.map +1 -1
  1156. package/build/src/sync/peer-mutation-bundle.d.ts +33 -39
  1157. package/build/src/sync/peer-mutation-bundle.d.ts.map +1 -1
  1158. package/build/src/sync/query-scope.d.ts +3 -3
  1159. package/build/src/sync/query-scope.d.ts.map +1 -1
  1160. package/build/src/sync/query-scope.js +8 -8
  1161. package/build/src/sync/server-change-feed.d.ts +129 -129
  1162. package/build/src/sync/server-change-feed.d.ts.map +1 -1
  1163. package/build/src/sync/server-change-feed.js +14 -14
  1164. package/build/src/sync/server-sequence-allocator.d.ts +36 -36
  1165. package/build/src/sync/server-sequence-allocator.d.ts.map +1 -1
  1166. package/build/src/sync/server-sequence-allocator.js +6 -6
  1167. package/build/src/sync/signed-sync-envelope-replay-service.d.ts +60 -48
  1168. package/build/src/sync/signed-sync-envelope-replay-service.d.ts.map +1 -1
  1169. package/build/src/sync/signed-sync-envelope-replay-service.js +21 -21
  1170. package/build/src/sync/stable-json.d.ts +2 -2
  1171. package/build/src/sync/stable-json.d.ts.map +1 -1
  1172. package/build/src/sync/stable-json.js +5 -5
  1173. package/build/src/sync/sync-api-client-types.d.ts +98 -25
  1174. package/build/src/sync/sync-api-client-types.d.ts.map +1 -1
  1175. package/build/src/sync/sync-api-client-types.js +73 -1
  1176. package/build/src/sync/sync-api-client.d.ts +71 -71
  1177. package/build/src/sync/sync-api-client.d.ts.map +1 -1
  1178. package/build/src/sync/sync-api-client.js +30 -30
  1179. package/build/src/sync/sync-api-controller.d.ts +23 -23
  1180. package/build/src/sync/sync-api-controller.d.ts.map +1 -1
  1181. package/build/src/sync/sync-change-fanout.d.ts +32 -38
  1182. package/build/src/sync/sync-change-fanout.d.ts.map +1 -1
  1183. package/build/src/sync/sync-change-fanout.js +7 -7
  1184. package/build/src/sync/sync-channel-name.d.ts +1 -1
  1185. package/build/src/sync/sync-channel-name.d.ts.map +1 -1
  1186. package/build/src/sync/sync-client-registry.d.ts +4 -4
  1187. package/build/src/sync/sync-client-registry.d.ts.map +1 -1
  1188. package/build/src/sync/sync-client-registry.js +4 -4
  1189. package/build/src/sync/sync-client-types.d.ts +130 -82
  1190. package/build/src/sync/sync-client-types.d.ts.map +1 -1
  1191. package/build/src/sync/sync-client-types.js +89 -1
  1192. package/build/src/sync/sync-client.d.ts +76 -76
  1193. package/build/src/sync/sync-client.d.ts.map +1 -1
  1194. package/build/src/sync/sync-client.js +19 -19
  1195. package/build/src/sync/sync-envelope-replay-service.d.ts +266 -298
  1196. package/build/src/sync/sync-envelope-replay-service.d.ts.map +1 -1
  1197. package/build/src/sync/sync-envelope-replay-service.js +77 -77
  1198. package/build/src/sync/sync-model-change-feed-service.d.ts +23 -23
  1199. package/build/src/sync/sync-model-change-feed-service.d.ts.map +1 -1
  1200. package/build/src/sync/sync-model-change-feed-service.js +8 -8
  1201. package/build/src/sync/sync-publish-suppression.d.ts +5 -5
  1202. package/build/src/sync/sync-publish-suppression.d.ts.map +1 -1
  1203. package/build/src/sync/sync-publish-suppression.js +3 -3
  1204. package/build/src/sync/sync-publisher-types.d.ts +98 -55
  1205. package/build/src/sync/sync-publisher-types.d.ts.map +1 -1
  1206. package/build/src/sync/sync-publisher-types.js +75 -1
  1207. package/build/src/sync/sync-publisher.d.ts +43 -43
  1208. package/build/src/sync/sync-publisher.d.ts.map +1 -1
  1209. package/build/src/sync/sync-publisher.js +20 -20
  1210. package/build/src/sync/sync-realtime-bridge.d.ts +23 -23
  1211. package/build/src/sync/sync-realtime-bridge.d.ts.map +1 -1
  1212. package/build/src/sync/sync-realtime-bridge.js +9 -9
  1213. package/build/src/sync/sync-replay-upsert-applier.d.ts +70 -70
  1214. package/build/src/sync/sync-replay-upsert-applier.d.ts.map +1 -1
  1215. package/build/src/sync/sync-replay-upsert-applier.js +17 -17
  1216. package/build/src/sync/sync-resource-base.d.ts +52 -51
  1217. package/build/src/sync/sync-resource-base.d.ts.map +1 -1
  1218. package/build/src/sync/sync-resource-base.js +15 -15
  1219. package/build/src/sync/sync-scope-attributes.d.ts +2 -2
  1220. package/build/src/sync/sync-scope-attributes.d.ts.map +1 -1
  1221. package/build/src/sync/sync-scope-attributes.js +2 -2
  1222. package/build/src/sync/sync-scope-store.d.ts +36 -36
  1223. package/build/src/sync/sync-scope-store.d.ts.map +1 -1
  1224. package/build/src/sync/sync-scope-store.js +6 -6
  1225. package/build/src/sync/sync-websocket-channel.d.ts +11 -6
  1226. package/build/src/sync/sync-websocket-channel.d.ts.map +1 -1
  1227. package/build/src/sync/sync-websocket-channel.js +6 -6
  1228. package/build/src/tenants/default-tenant-database-provisioning.d.ts +4 -4
  1229. package/build/src/tenants/default-tenant-database-provisioning.d.ts.map +1 -1
  1230. package/build/src/tenants/default-tenant-database-provisioning.js +2 -2
  1231. package/build/src/tenants/tenant-aggregator.d.ts +81 -81
  1232. package/build/src/tenants/tenant-aggregator.d.ts.map +1 -1
  1233. package/build/src/tenants/tenant-aggregator.js +13 -13
  1234. package/build/src/tenants/tenant-handle.d.ts +64 -0
  1235. package/build/src/tenants/tenant-handle.d.ts.map +1 -0
  1236. package/build/src/tenants/tenant-handle.js +221 -0
  1237. package/build/src/tenants/tenant-iterator.d.ts +17 -17
  1238. package/build/src/tenants/tenant-iterator.d.ts.map +1 -1
  1239. package/build/src/tenants/tenant-iterator.js +7 -7
  1240. package/build/src/tenants/tenant-model-scope.d.ts +73 -0
  1241. package/build/src/tenants/tenant-model-scope.d.ts.map +1 -0
  1242. package/build/src/tenants/tenant-model-scope.js +115 -0
  1243. package/build/src/tenants/tenant.d.ts +16 -6
  1244. package/build/src/tenants/tenant.d.ts.map +1 -1
  1245. package/build/src/tenants/tenant.js +15 -3
  1246. package/build/src/testing/base-expect.d.ts.map +1 -1
  1247. package/build/src/testing/browser-frontend-model-event-hook-scenarios.d.ts +19 -31
  1248. package/build/src/testing/browser-frontend-model-event-hook-scenarios.d.ts.map +1 -1
  1249. package/build/src/testing/browser-test-app.js +6 -6
  1250. package/build/src/testing/expect-to-change.d.ts +9 -7
  1251. package/build/src/testing/expect-to-change.d.ts.map +1 -1
  1252. package/build/src/testing/expect-to-change.js +2 -2
  1253. package/build/src/testing/expect-utils.d.ts +30 -29
  1254. package/build/src/testing/expect-utils.d.ts.map +1 -1
  1255. package/build/src/testing/expect-utils.js +30 -30
  1256. package/build/src/testing/expect.d.ts +30 -30
  1257. package/build/src/testing/expect.d.ts.map +1 -1
  1258. package/build/src/testing/expect.js +19 -19
  1259. package/build/src/testing/factory/association-declaration.d.ts +16 -16
  1260. package/build/src/testing/factory/association-declaration.d.ts.map +1 -1
  1261. package/build/src/testing/factory/association-declaration.js +3 -3
  1262. package/build/src/testing/factory/declarations.d.ts +90 -115
  1263. package/build/src/testing/factory/declarations.d.ts.map +1 -1
  1264. package/build/src/testing/factory/declarations.js +6 -6
  1265. package/build/src/testing/factory/definition-builder.d.ts +72 -70
  1266. package/build/src/testing/factory/definition-builder.d.ts.map +1 -1
  1267. package/build/src/testing/factory/definition-builder.js +40 -40
  1268. package/build/src/testing/factory/errors.d.ts +30 -29
  1269. package/build/src/testing/factory/errors.d.ts.map +1 -1
  1270. package/build/src/testing/factory/evaluation-context.d.ts +29 -29
  1271. package/build/src/testing/factory/evaluation-context.d.ts.map +1 -1
  1272. package/build/src/testing/factory/evaluation-context.js +17 -17
  1273. package/build/src/testing/factory/events.d.ts +4 -5
  1274. package/build/src/testing/factory/events.d.ts.map +1 -1
  1275. package/build/src/testing/factory/factory-definition.d.ts +14 -14
  1276. package/build/src/testing/factory/factory-definition.d.ts.map +1 -1
  1277. package/build/src/testing/factory/factory-definition.js +3 -3
  1278. package/build/src/testing/factory/factory-registry.d.ts +56 -54
  1279. package/build/src/testing/factory/factory-registry.d.ts.map +1 -1
  1280. package/build/src/testing/factory/factory-registry.js +35 -35
  1281. package/build/src/testing/factory/factory-runner.d.ts +67 -73
  1282. package/build/src/testing/factory/factory-runner.d.ts.map +1 -1
  1283. package/build/src/testing/factory/factory-runner.js +9 -9
  1284. package/build/src/testing/factory/index.d.ts +7 -7
  1285. package/build/src/testing/factory/index.d.ts.map +1 -1
  1286. package/build/src/testing/factory/linter.d.ts +7 -7
  1287. package/build/src/testing/factory/linter.d.ts.map +1 -1
  1288. package/build/src/testing/factory/linter.js +3 -3
  1289. package/build/src/testing/factory/model-contract.d.ts +3 -3
  1290. package/build/src/testing/factory/model-contract.d.ts.map +1 -1
  1291. package/build/src/testing/factory/model-contract.js +4 -4
  1292. package/build/src/testing/factory/node/load-definitions.d.ts +2 -2
  1293. package/build/src/testing/factory/node/load-definitions.d.ts.map +1 -1
  1294. package/build/src/testing/factory/sequence.d.ts +19 -23
  1295. package/build/src/testing/factory/sequence.d.ts.map +1 -1
  1296. package/build/src/testing/factory/sequence.js +3 -3
  1297. package/build/src/testing/factory/strategies/attributes-for.d.ts +3 -3
  1298. package/build/src/testing/factory/strategies/attributes-for.d.ts.map +1 -1
  1299. package/build/src/testing/factory/strategies/attributes-for.js +2 -2
  1300. package/build/src/testing/factory/strategies/base.d.ts +32 -32
  1301. package/build/src/testing/factory/strategies/base.d.ts.map +1 -1
  1302. package/build/src/testing/factory/strategies/base.js +25 -25
  1303. package/build/src/testing/factory/strategies/build.d.ts +3 -3
  1304. package/build/src/testing/factory/strategies/build.d.ts.map +1 -1
  1305. package/build/src/testing/factory/strategies/build.js +3 -3
  1306. package/build/src/testing/factory/strategies/create.d.ts +6 -6
  1307. package/build/src/testing/factory/strategies/create.d.ts.map +1 -1
  1308. package/build/src/testing/factory/strategies/create.js +5 -5
  1309. package/build/src/testing/factory/trait-definition.d.ts +4 -4
  1310. package/build/src/testing/factory/trait-definition.d.ts.map +1 -1
  1311. package/build/src/testing/request-client.d.ts +19 -19
  1312. package/build/src/testing/request-client.d.ts.map +1 -1
  1313. package/build/src/testing/test-files-finder.d.ts +15 -15
  1314. package/build/src/testing/test-files-finder.d.ts.map +1 -1
  1315. package/build/src/testing/test-files-finder.js +2 -2
  1316. package/build/src/testing/test-filter-parser.d.ts +19 -12
  1317. package/build/src/testing/test-filter-parser.d.ts.map +1 -1
  1318. package/build/src/testing/test-runner.d.ts +204 -251
  1319. package/build/src/testing/test-runner.d.ts.map +1 -1
  1320. package/build/src/testing/test-runner.js +15 -15
  1321. package/build/src/testing/test-suite-splitter.d.ts +25 -31
  1322. package/build/src/testing/test-suite-splitter.d.ts.map +1 -1
  1323. package/build/src/testing/test.d.ts +51 -55
  1324. package/build/src/testing/test.d.ts.map +1 -1
  1325. package/build/src/testing/test.js +20 -18
  1326. package/build/src/testing/wait-for-event.d.ts +25 -25
  1327. package/build/src/testing/wait-for-event.d.ts.map +1 -1
  1328. package/build/src/testing/wait-for-event.js +6 -6
  1329. package/build/src/time-zone.d.ts +3 -3
  1330. package/build/src/time-zone.d.ts.map +1 -1
  1331. package/build/src/utils/backtrace-cleaner-node.d.ts +35 -2
  1332. package/build/src/utils/backtrace-cleaner-node.d.ts.map +1 -1
  1333. package/build/src/utils/backtrace-cleaner-node.js +1 -1
  1334. package/build/src/utils/backtrace-cleaner.d.ts +33 -28
  1335. package/build/src/utils/backtrace-cleaner.d.ts.map +1 -1
  1336. package/build/src/utils/bearer-token.d.ts +2 -2
  1337. package/build/src/utils/bearer-token.d.ts.map +1 -1
  1338. package/build/src/utils/deburr-column-name.d.ts.map +1 -1
  1339. package/build/src/utils/event-emitter.d.ts +1 -1
  1340. package/build/src/utils/event-emitter.d.ts.map +1 -1
  1341. package/build/src/utils/event-emitter.js +2 -2
  1342. package/build/src/utils/file-exists.d.ts.map +1 -1
  1343. package/build/src/utils/format-value.d.ts +9 -8
  1344. package/build/src/utils/format-value.d.ts.map +1 -1
  1345. package/build/src/utils/format-value.js +7 -7
  1346. package/build/src/utils/is-date.d.ts +2 -2
  1347. package/build/src/utils/is-date.d.ts.map +1 -1
  1348. package/build/src/utils/is-date.js +2 -2
  1349. package/build/src/utils/model-scope.d.ts +29 -24
  1350. package/build/src/utils/model-scope.d.ts.map +1 -1
  1351. package/build/src/utils/model-scope.js +11 -11
  1352. package/build/src/utils/mount-prefix.d.ts +2 -2
  1353. package/build/src/utils/mount-prefix.d.ts.map +1 -1
  1354. package/build/src/utils/nest-callbacks.d.ts.map +1 -1
  1355. package/build/src/utils/plain-object.d.ts +3 -3
  1356. package/build/src/utils/plain-object.d.ts.map +1 -1
  1357. package/build/src/utils/plain-object.js +3 -3
  1358. package/build/src/utils/ransack.d.ts +69 -90
  1359. package/build/src/utils/ransack.d.ts.map +1 -1
  1360. package/build/src/utils/ransack.js +36 -36
  1361. package/build/src/utils/rest-args-error.d.ts.map +1 -1
  1362. package/build/src/utils/sha256-hex.d.ts.map +1 -1
  1363. package/build/src/utils/shutdown-lifecycle.d.ts +1 -1
  1364. package/build/src/utils/shutdown-lifecycle.d.ts.map +1 -1
  1365. package/build/src/utils/singularize-model-name.d.ts.map +1 -1
  1366. package/build/src/utils/split-sql-statements.d.ts.map +1 -1
  1367. package/build/src/utils/to-import-specifier.d.ts.map +1 -1
  1368. package/build/src/utils/with-tracked-stack-async-hooks.d.ts +6 -5
  1369. package/build/src/utils/with-tracked-stack-async-hooks.d.ts.map +1 -1
  1370. package/build/src/utils/with-tracked-stack-async-hooks.js +9 -9
  1371. package/build/src/utils/with-tracked-stack.d.ts +6 -5
  1372. package/build/src/utils/with-tracked-stack.d.ts.map +1 -1
  1373. package/build/src/utils/with-tracked-stack.js +7 -7
  1374. package/build/src/velocious-error.d.ts +27 -17
  1375. package/build/src/velocious-error.d.ts.map +1 -1
  1376. package/build/src/velocious-error.js +10 -4
  1377. package/build/sync/conflict-strategy.js +1 -1
  1378. package/build/sync/query-scope.js +7 -7
  1379. package/build/sync/server-change-feed.js +13 -13
  1380. package/build/sync/server-sequence-allocator.js +5 -5
  1381. package/build/sync/signed-sync-envelope-replay-service.js +20 -20
  1382. package/build/sync/stable-json.js +4 -4
  1383. package/build/sync/sync-api-client-types.js +7 -7
  1384. package/build/sync/sync-api-client.js +26 -26
  1385. package/build/sync/sync-change-fanout.js +6 -6
  1386. package/build/sync/sync-client-registry.js +3 -3
  1387. package/build/sync/sync-client-types.js +10 -10
  1388. package/build/sync/sync-client.js +18 -18
  1389. package/build/sync/sync-envelope-replay-service.js +76 -76
  1390. package/build/sync/sync-model-change-feed-service.js +7 -7
  1391. package/build/sync/sync-publish-suppression.js +2 -2
  1392. package/build/sync/sync-publisher-types.js +11 -11
  1393. package/build/sync/sync-publisher.js +19 -19
  1394. package/build/sync/sync-realtime-bridge.js +8 -8
  1395. package/build/sync/sync-replay-upsert-applier.js +16 -16
  1396. package/build/sync/sync-resource-base.js +14 -14
  1397. package/build/sync/sync-scope-attributes.js +1 -1
  1398. package/build/sync/sync-scope-store.js +5 -5
  1399. package/build/sync/sync-websocket-channel.js +5 -5
  1400. package/build/tenants/default-tenant-database-provisioning.js +1 -1
  1401. package/build/tenants/tenant-aggregator.js +13 -13
  1402. package/build/tenants/tenant-handle.js +252 -0
  1403. package/build/tenants/tenant-iterator.js +6 -6
  1404. package/build/tenants/tenant-model-scope.js +132 -0
  1405. package/build/tenants/tenant.js +15 -2
  1406. package/build/testing/browser-test-app.js +2 -2
  1407. package/build/testing/expect-to-change.js +1 -1
  1408. package/build/testing/expect-utils.js +29 -29
  1409. package/build/testing/expect.js +18 -18
  1410. package/build/testing/factory/association-declaration.js +2 -2
  1411. package/build/testing/factory/declarations.js +5 -5
  1412. package/build/testing/factory/definition-builder.js +39 -39
  1413. package/build/testing/factory/evaluation-context.js +16 -16
  1414. package/build/testing/factory/factory-definition.js +2 -2
  1415. package/build/testing/factory/factory-registry.js +34 -34
  1416. package/build/testing/factory/factory-runner.js +8 -8
  1417. package/build/testing/factory/linter.js +2 -2
  1418. package/build/testing/factory/model-contract.js +3 -3
  1419. package/build/testing/factory/sequence.js +2 -2
  1420. package/build/testing/factory/strategies/attributes-for.js +1 -1
  1421. package/build/testing/factory/strategies/base.js +24 -24
  1422. package/build/testing/factory/strategies/build.js +2 -2
  1423. package/build/testing/factory/strategies/create.js +4 -4
  1424. package/build/testing/test-files-finder.js +1 -1
  1425. package/build/testing/test-runner.js +14 -14
  1426. package/build/testing/test.js +19 -17
  1427. package/build/testing/wait-for-event.js +5 -5
  1428. package/build/tsconfig.tsbuildinfo +1 -1
  1429. package/build/utils/event-emitter.js +1 -1
  1430. package/build/utils/format-value.js +6 -6
  1431. package/build/utils/is-date.js +1 -1
  1432. package/build/utils/model-scope.js +10 -10
  1433. package/build/utils/plain-object.js +2 -2
  1434. package/build/utils/ransack.js +35 -35
  1435. package/build/utils/with-tracked-stack-async-hooks.js +8 -8
  1436. package/build/utils/with-tracked-stack.js +6 -6
  1437. package/build/velocious-error.js +9 -3
  1438. package/package.json +3 -3
  1439. package/src/application.js +3 -3
  1440. package/src/authorization/ability.js +6 -6
  1441. package/src/authorization/base-resource.js +1 -1
  1442. package/src/background-jobs/client.js +2 -2
  1443. package/src/background-jobs/forked-runner-child.js +4 -4
  1444. package/src/background-jobs/job-runner.js +2 -2
  1445. package/src/background-jobs/job.js +6 -6
  1446. package/src/background-jobs/json-socket.js +1 -1
  1447. package/src/background-jobs/main.js +13 -13
  1448. package/src/background-jobs/normalize-error.js +2 -2
  1449. package/src/background-jobs/pooled-runner-child.js +3 -3
  1450. package/src/background-jobs/scheduler.js +1 -1
  1451. package/src/background-jobs/status-reporter.js +2 -2
  1452. package/src/background-jobs/store.js +23 -23
  1453. package/src/background-jobs/types.js +6 -6
  1454. package/src/background-jobs/web/controller.js +6 -6
  1455. package/src/background-jobs/web/counts-channel.js +1 -1
  1456. package/src/background-jobs/worker.js +8 -8
  1457. package/src/beacon/client.js +3 -3
  1458. package/src/beacon/in-process-client.js +3 -3
  1459. package/src/beacon/types.js +1 -1
  1460. package/src/cli/base-command.js +1 -1
  1461. package/src/cli/commands/console.js +1 -1
  1462. package/src/cli/commands/db/schema/dump.js +1 -1
  1463. package/src/cli/commands/db/schema/load.js +1 -1
  1464. package/src/cli/commands/db/seed.js +1 -1
  1465. package/src/cli/commands/generate/frontend-models.js +1 -1
  1466. package/src/cli/commands/lint/relationships.js +1 -1
  1467. package/src/cli/commands/run-script.js +1 -1
  1468. package/src/cli/commands/runner.js +1 -1
  1469. package/src/cli/index.js +2 -2
  1470. package/src/cli/tenant-database-command-helper.js +2 -2
  1471. package/src/configuration-types.js +48 -47
  1472. package/src/configuration.js +150 -65
  1473. package/src/controller.js +11 -8
  1474. package/src/current.js +2 -2
  1475. package/src/database/annotations-async-hooks.js +3 -3
  1476. package/src/database/annotations.js +1 -1
  1477. package/src/database/drivers/base-column.js +1 -1
  1478. package/src/database/drivers/base-foreign-key.js +1 -1
  1479. package/src/database/drivers/base-table.js +1 -1
  1480. package/src/database/drivers/base.js +18 -18
  1481. package/src/database/drivers/mssql/column.js +1 -1
  1482. package/src/database/drivers/mssql/index.js +2 -2
  1483. package/src/database/drivers/mssql/options.js +1 -1
  1484. package/src/database/drivers/mssql/structure-sql.js +1 -1
  1485. package/src/database/drivers/mssql/table.js +1 -1
  1486. package/src/database/drivers/mysql/column.js +1 -1
  1487. package/src/database/drivers/mysql/index.js +4 -4
  1488. package/src/database/drivers/mysql/options.js +1 -1
  1489. package/src/database/drivers/mysql/query.js +7 -7
  1490. package/src/database/drivers/mysql/structure-sql.js +71 -10
  1491. package/src/database/drivers/pgsql/column.js +1 -1
  1492. package/src/database/drivers/pgsql/index.js +6 -6
  1493. package/src/database/drivers/pgsql/structure-sql.js +1 -1
  1494. package/src/database/drivers/sqlite/base.js +7 -7
  1495. package/src/database/drivers/sqlite/column.js +1 -1
  1496. package/src/database/drivers/sqlite/connection-sql-js.js +1 -1
  1497. package/src/database/drivers/sqlite/foreign-key.js +1 -1
  1498. package/src/database/drivers/sqlite/index.js +1 -1
  1499. package/src/database/drivers/sqlite/index.native.js +2 -2
  1500. package/src/database/drivers/sqlite/index.web.js +2 -2
  1501. package/src/database/drivers/sqlite/query.js +2 -2
  1502. package/src/database/drivers/sqlite/query.native.js +2 -2
  1503. package/src/database/drivers/sqlite/query.web.js +2 -2
  1504. package/src/database/drivers/sqlite/table-rebuilder.js +1 -1
  1505. package/src/database/migration/index.js +2 -2
  1506. package/src/database/migrator/types.js +2 -2
  1507. package/src/database/operation.js +59 -6
  1508. package/src/database/pool/async-tracked-multi-connection.js +75 -24
  1509. package/src/database/pool/base-methods-forward.js +2 -2
  1510. package/src/database/pool/base.js +48 -17
  1511. package/src/database/pool/single-multi-use.js +501 -103
  1512. package/src/database/query/delete-base.js +1 -1
  1513. package/src/database/query/index.js +3 -3
  1514. package/src/database/query/insert-base.js +4 -4
  1515. package/src/database/query/model-class-query.js +39 -39
  1516. package/src/database/query/preloader/belongs-to.js +2 -2
  1517. package/src/database/query/preloader/ensure-model-class-initialized.js +3 -2
  1518. package/src/database/query/preloader/has-many.js +3 -3
  1519. package/src/database/query/preloader/has-one.js +1 -1
  1520. package/src/database/query/preloader.js +9 -2
  1521. package/src/database/query/query-data.js +7 -7
  1522. package/src/database/query/update-base.js +3 -3
  1523. package/src/database/query/upsert-base.js +2 -2
  1524. package/src/database/query/where-model-class-hash.js +13 -13
  1525. package/src/database/query/with-count.js +12 -12
  1526. package/src/database/query-parser/options.js +2 -2
  1527. package/src/database/query-parser/select-parser.js +1 -1
  1528. package/src/database/record/acts-as-list.js +2 -2
  1529. package/src/database/record/attachments/handle.js +6 -6
  1530. package/src/database/record/attachments/normalize-input.js +11 -11
  1531. package/src/database/record/attachments/storage-drivers/filesystem.js +1 -1
  1532. package/src/database/record/attachments/storage-drivers/native.js +5 -5
  1533. package/src/database/record/attachments/storage-drivers/s3.js +10 -10
  1534. package/src/database/record/attachments/store.js +24 -20
  1535. package/src/database/record/auditing.js +123 -29
  1536. package/src/database/record/counter-cache-magnitude.js +11 -11
  1537. package/src/database/record/index.js +227 -174
  1538. package/src/database/record/instance-relationships/base.js +4 -4
  1539. package/src/database/record/instance-relationships/belongs-to.js +1 -1
  1540. package/src/database/record/instance-relationships/has-many.js +3 -3
  1541. package/src/database/record/instance-relationships/has-one.js +1 -1
  1542. package/src/database/record/record-not-found-error.js +1 -0
  1543. package/src/database/record/relationships/base.js +22 -0
  1544. package/src/database/record/state-machine.js +6 -6
  1545. package/src/database/record/validators/base.js +1 -1
  1546. package/src/database/structure-sql-loader.js +3 -3
  1547. package/src/database/table-data/table-column.js +3 -3
  1548. package/src/database/use-live-query.js +3 -3
  1549. package/src/environment-handlers/base.js +56 -37
  1550. package/src/environment-handlers/browser.js +1 -1
  1551. package/src/environment-handlers/node/cli/commands/console.js +4 -4
  1552. package/src/environment-handlers/node/cli/commands/db/seed.js +2 -2
  1553. package/src/environment-handlers/node/cli/commands/generate/base-models.js +1 -1
  1554. package/src/environment-handlers/node/cli/commands/run-script.js +2 -2
  1555. package/src/environment-handlers/node/cli/commands/runner.js +2 -2
  1556. package/src/environment-handlers/node/cli/commands/server.js +1 -1
  1557. package/src/environment-handlers/node.js +36 -36
  1558. package/src/error-logger.js +2 -2
  1559. package/src/error-reporting/request-details.js +32 -32
  1560. package/src/frontend-model-controller.js +215 -213
  1561. package/src/frontend-model-resource/base-resource.js +44 -44
  1562. package/src/frontend-model-resource/velocious-attachment-resource.js +1 -1
  1563. package/src/frontend-models/base.js +146 -142
  1564. package/src/frontend-models/clear-pending-debounced-callback.js +2 -2
  1565. package/src/frontend-models/model-registry.js +4 -4
  1566. package/src/frontend-models/outgoing-event-buffer.js +1 -1
  1567. package/src/frontend-models/preloader.js +1 -1
  1568. package/src/frontend-models/query.js +60 -60
  1569. package/src/frontend-models/resource-definition.js +9 -9
  1570. package/src/frontend-models/transport-serialization.js +27 -27
  1571. package/src/frontend-models/websocket-channel.js +4 -4
  1572. package/src/frontend-models/websocket-publishers.js +1 -1
  1573. package/src/http-client/request.js +1 -1
  1574. package/src/http-client/response.js +1 -1
  1575. package/src/http-server/client/index.js +4 -4
  1576. package/src/http-server/client/params-to-object.js +16 -16
  1577. package/src/http-server/client/request-buffer/index.js +5 -2
  1578. package/src/http-server/client/request-parser.js +2 -2
  1579. package/src/http-server/client/request-runner.js +2 -2
  1580. package/src/http-server/client/request.js +2 -2
  1581. package/src/http-server/client/websocket-request.js +6 -6
  1582. package/src/http-server/client/websocket-session.js +28 -28
  1583. package/src/http-server/cookie.js +2 -2
  1584. package/src/http-server/development-reloader.js +1 -1
  1585. package/src/http-server/index.js +5 -5
  1586. package/src/http-server/remote-address.js +1 -1
  1587. package/src/http-server/server-lock.js +4 -4
  1588. package/src/http-server/websocket-channel-subscribers.js +4 -4
  1589. package/src/http-server/websocket-channel.js +1 -1
  1590. package/src/http-server/websocket-connection.js +3 -3
  1591. package/src/http-server/websocket-event-log-store.js +9 -9
  1592. package/src/http-server/websocket-events-host.js +7 -7
  1593. package/src/http-server/websocket-events.js +4 -4
  1594. package/src/http-server/worker-handler/channel-subscriber-dispatch.js +1 -1
  1595. package/src/http-server/worker-handler/in-process.js +5 -5
  1596. package/src/http-server/worker-handler/index.js +10 -10
  1597. package/src/http-server/worker-handler/worker-thread.js +8 -8
  1598. package/src/logger/base-logger.js +1 -1
  1599. package/src/logger.js +12 -12
  1600. package/src/mailer/backends/smtp.js +3 -3
  1601. package/src/mailer/base.js +14 -14
  1602. package/src/mailer/delivery.js +3 -3
  1603. package/src/mailer/index.js +1 -1
  1604. package/src/mailer.js +1 -1
  1605. package/src/plugins/sqljs-wasm-route-controller.js +1 -1
  1606. package/src/record-payload-values.js +3 -3
  1607. package/src/routes/base-route.js +5 -5
  1608. package/src/routes/basic-route.js +4 -4
  1609. package/src/routes/get-route.js +2 -2
  1610. package/src/routes/hooks/frontend-model-command-route-hook.js +1 -1
  1611. package/src/routes/index.js +3 -3
  1612. package/src/routes/namespace-route.js +1 -1
  1613. package/src/routes/plugin-routes.js +1 -1
  1614. package/src/routes/post-route.js +2 -2
  1615. package/src/routes/resolver.js +5 -5
  1616. package/src/routes/resource-route.js +1 -1
  1617. package/src/sync/conflict-strategy.js +1 -1
  1618. package/src/sync/query-scope.js +7 -7
  1619. package/src/sync/server-change-feed.js +13 -13
  1620. package/src/sync/server-sequence-allocator.js +5 -5
  1621. package/src/sync/signed-sync-envelope-replay-service.js +20 -20
  1622. package/src/sync/stable-json.js +4 -4
  1623. package/src/sync/sync-api-client-types.js +7 -7
  1624. package/src/sync/sync-api-client.js +26 -26
  1625. package/src/sync/sync-change-fanout.js +6 -6
  1626. package/src/sync/sync-client-registry.js +3 -3
  1627. package/src/sync/sync-client-types.js +10 -10
  1628. package/src/sync/sync-client.js +18 -18
  1629. package/src/sync/sync-envelope-replay-service.js +76 -76
  1630. package/src/sync/sync-model-change-feed-service.js +7 -7
  1631. package/src/sync/sync-publish-suppression.js +2 -2
  1632. package/src/sync/sync-publisher-types.js +11 -11
  1633. package/src/sync/sync-publisher.js +19 -19
  1634. package/src/sync/sync-realtime-bridge.js +8 -8
  1635. package/src/sync/sync-replay-upsert-applier.js +16 -16
  1636. package/src/sync/sync-resource-base.js +14 -14
  1637. package/src/sync/sync-scope-attributes.js +1 -1
  1638. package/src/sync/sync-scope-store.js +5 -5
  1639. package/src/sync/sync-websocket-channel.js +5 -5
  1640. package/src/tenants/default-tenant-database-provisioning.js +1 -1
  1641. package/src/tenants/tenant-aggregator.js +13 -13
  1642. package/src/tenants/tenant-handle.js +252 -0
  1643. package/src/tenants/tenant-iterator.js +6 -6
  1644. package/src/tenants/tenant-model-scope.js +132 -0
  1645. package/src/tenants/tenant.js +15 -2
  1646. package/src/testing/browser-test-app.js +2 -2
  1647. package/src/testing/expect-to-change.js +1 -1
  1648. package/src/testing/expect-utils.js +29 -29
  1649. package/src/testing/expect.js +18 -18
  1650. package/src/testing/factory/association-declaration.js +2 -2
  1651. package/src/testing/factory/declarations.js +5 -5
  1652. package/src/testing/factory/definition-builder.js +39 -39
  1653. package/src/testing/factory/evaluation-context.js +16 -16
  1654. package/src/testing/factory/factory-definition.js +2 -2
  1655. package/src/testing/factory/factory-registry.js +34 -34
  1656. package/src/testing/factory/factory-runner.js +8 -8
  1657. package/src/testing/factory/linter.js +2 -2
  1658. package/src/testing/factory/model-contract.js +3 -3
  1659. package/src/testing/factory/sequence.js +2 -2
  1660. package/src/testing/factory/strategies/attributes-for.js +1 -1
  1661. package/src/testing/factory/strategies/base.js +24 -24
  1662. package/src/testing/factory/strategies/build.js +2 -2
  1663. package/src/testing/factory/strategies/create.js +4 -4
  1664. package/src/testing/test-files-finder.js +1 -1
  1665. package/src/testing/test-runner.js +14 -14
  1666. package/src/testing/test.js +19 -17
  1667. package/src/testing/wait-for-event.js +5 -5
  1668. package/src/utils/event-emitter.js +1 -1
  1669. package/src/utils/format-value.js +6 -6
  1670. package/src/utils/is-date.js +1 -1
  1671. package/src/utils/model-scope.js +10 -10
  1672. package/src/utils/plain-object.js +2 -2
  1673. package/src/utils/ransack.js +35 -35
  1674. package/src/utils/with-tracked-stack-async-hooks.js +8 -8
  1675. package/src/utils/with-tracked-stack.js +6 -6
  1676. package/src/velocious-error.js +9 -3
@@ -101,12 +101,12 @@ export default class SyncClient {
101
101
  this._scheduledReplay = null;
102
102
  /** @type {Record<string, import("./sync-api-client-types.js").SyncResourceConfig> | null} */
103
103
  this._pullResourceConfigs = null;
104
- /** @type {Array<{callback: (record: ?) => Promise<void>, callbackName: "afterCreate" | "afterUpdate" | "afterDestroy", modelClass: ?}>} */
104
+ /** @type {Array<{callback: (record: ReturnType<typeof JSON.parse>) => Promise<void>, callbackName: "afterCreate" | "afterUpdate" | "afterDestroy", modelClass: ReturnType<typeof JSON.parse>}>} */
105
105
  this._trackedCallbacks = [];
106
106
  /** @type {WeakSet<object>} */
107
107
  this._remoteApplyRecords = new WeakSet();
108
108
  this._withoutTrackingDepth = 0;
109
- /** @type {Logger | {error: (...messages: Array<?>) => Promise<void>} | null} */
109
+ /** @type {Logger | {error: (...messages: Array<ReturnType<typeof JSON.parse>>) => Promise<void>} | null} */
110
110
  this._logger = null;
111
111
  this._started = false;
112
112
  }
@@ -180,7 +180,7 @@ export default class SyncClient {
180
180
  * Post-commit queue failures are reported without rethrowing into the
181
181
  * driver's afterCommit chain (see reportAfterCommitError).
182
182
  * @param {{operation: "create" | "update" | "destroy", resourceConfig: import("./sync-client-types.js").SyncClientResourceConfig}} args - Operation and resource config.
183
- * @returns {(record: ?) => Promise<void>} Lifecycle callback.
183
+ * @returns {(record: ReturnType<typeof JSON.parse>) => Promise<void>} Lifecycle callback.
184
184
  */
185
185
  trackedMutationCallback({ operation, resourceConfig }) {
186
186
  return async (record) => {
@@ -232,7 +232,7 @@ export default class SyncClient {
232
232
  }
233
233
  /**
234
234
  * Returns the lazily built client logger.
235
- * @returns {Logger | {error: (...messages: Array<?>) => Promise<void>}} Client logger.
235
+ * @returns {Logger | {error: (...messages: Array<ReturnType<typeof JSON.parse>>) => Promise<void>}} Client logger.
236
236
  */
237
237
  logger() {
238
238
  this._logger ||= new Logger("SyncClient", { configuration: this.config.configuration });
@@ -240,7 +240,7 @@ export default class SyncClient {
240
240
  }
241
241
  /**
242
242
  * Whether a record is currently being written by pull-apply (echo suppression).
243
- * @param {?} record - Local model record.
243
+ * @param {ReturnType<typeof JSON.parse>} record - Local model record.
244
244
  * @returns {boolean} Whether the record write originates from a remote change.
245
245
  */
246
246
  isRemoteApply(record) {
@@ -251,7 +251,7 @@ export default class SyncClient {
251
251
  * either the record was marked as a remote apply (`markRemoteApply`, used by
252
252
  * pull and realtime applies) or a `withoutTracking` callback is running on
253
253
  * this client.
254
- * @param {?} record - Local model record.
254
+ * @param {ReturnType<typeof JSON.parse>} record - Local model record.
255
255
  * @returns {boolean} Whether tracked queueing is suppressed for the record.
256
256
  */
257
257
  isTrackingSuppressed(record) {
@@ -283,7 +283,7 @@ export default class SyncClient {
283
283
  * Marks one record as being written from server-originated data so tracked
284
284
  * mutation queueing skips it (record-precise suppression). The derived pull
285
285
  * and realtime appliers use this internally around every applied write.
286
- * @param {?} record - Local model record about to be written.
286
+ * @param {ReturnType<typeof JSON.parse>} record - Local model record about to be written.
287
287
  * @returns {() => void} Release callback re-enabling tracking for the record.
288
288
  */
289
289
  markRemoteApply(record) {
@@ -316,7 +316,7 @@ export default class SyncClient {
316
316
  }
317
317
  /**
318
318
  * Declares (or re-activates) a sync scope from a model query and pulls it when online.
319
- * @param {import("../database/query/model-class-query.js").default<?>} query - Query declaring the sync scope.
319
+ * @param {import("../database/query/model-class-query.js").default<ReturnType<typeof JSON.parse>>} query - Query declaring the sync scope.
320
320
  * @param {object} [options] - Sync options.
321
321
  * @param {(progress: import("./sync-api-client-types.js").SyncPullProgress) => void} [options.onProgress] - Called per applied page of the pull this declaration triggers, so the initial import of a newly declared scope can drive a "syncedCount of total" progress bar. See `pull()`.
322
322
  * @returns {Promise<{scope: import("./sync-client-types.js").SerializedSyncScope, pulled: import("./sync-api-client-types.js").SyncChangesResult | null}>} Declared scope and pull result (null while offline).
@@ -335,7 +335,7 @@ export default class SyncClient {
335
335
  }
336
336
  /**
337
337
  * Deactivates the sync scope declared by a model query.
338
- * @param {import("../database/query/model-class-query.js").default<?>} query - Query whose scope should stop syncing.
338
+ * @param {import("../database/query/model-class-query.js").default<ReturnType<typeof JSON.parse>>} query - Query whose scope should stop syncing.
339
339
  * @returns {Promise<void>}
340
340
  */
341
341
  async unsync(query) {
@@ -455,7 +455,7 @@ export default class SyncClient {
455
455
  /**
456
456
  * Subscribes the derived realtime channels so pushed websocket changes apply
457
457
  * through the same derived applier as pulls (idempotent, single-flighted).
458
- * @param {?} [context] - App context passed to the deprecated `sync.client.realtime.channels` callback (runtime scope values).
458
+ * @param {ReturnType<typeof JSON.parse>} [context] - App context passed to the deprecated `sync.client.realtime.channels` callback (runtime scope values).
459
459
  * @returns {Promise<void>}
460
460
  */
461
461
  async subscribeRealtime(context) {
@@ -578,8 +578,8 @@ export default class SyncClient {
578
578
  /**
579
579
  * Queues a local model change as a pending sync row and schedules an immediate
580
580
  * replay attempt (kept pending while offline or when the backend rejects it).
581
- * @param {{resource: ?, data?: Record<string, ?>, syncType?: string}} args - Queue args.
582
- * @returns {Promise<?>} Pending local sync row.
581
+ * @param {{resource: ReturnType<typeof JSON.parse>, data?: Record<string, ReturnType<typeof JSON.parse>>, syncType?: string}} args - Queue args.
582
+ * @returns {Promise<ReturnType<typeof JSON.parse>>} Pending local sync row.
583
583
  */
584
584
  async queue({ data, resource, syncType }) {
585
585
  const resourceConfig = this.resourceConfigFor(resource);
@@ -665,7 +665,7 @@ export default class SyncClient {
665
665
  }
666
666
  /**
667
667
  * Resolves the declared resource config for a local record.
668
- * @param {?} resource - Local model record.
668
+ * @param {ReturnType<typeof JSON.parse>} resource - Local model record.
669
669
  * @returns {import("./sync-client-types.js").SyncClientResourceConfig} Declared resource config.
670
670
  */
671
671
  resourceConfigFor(resource) {
@@ -683,7 +683,7 @@ export default class SyncClient {
683
683
  * Resolves the sync type for a mutation through the resource config. The
684
684
  * "upsert" flag queues creates and updates as "update" rows (the server
685
685
  * upserts by resource id) and destroys as "delete" rows.
686
- * @param {{operation: "create" | "update" | "destroy", record: ?, resourceConfig: import("./sync-client-types.js").SyncClientResourceConfig}} args - Mutation args.
686
+ * @param {{operation: "create" | "update" | "destroy", record: ReturnType<typeof JSON.parse>, resourceConfig: import("./sync-client-types.js").SyncClientResourceConfig}} args - Mutation args.
687
687
  * @returns {string} Sync type.
688
688
  */
689
689
  defaultSyncType({ operation, record, resourceConfig }) {
@@ -716,7 +716,7 @@ export default class SyncClient {
716
716
  /**
717
717
  * Builds one resource config from a model's `static sync` declaration plus its
718
718
  * derived column metadata.
719
- * @param {{declaration: import("./sync-client-types.js").ModelSyncDeclaration, modelClass: ?, resourceType: string}} args - Declaration args.
719
+ * @param {{declaration: import("./sync-client-types.js").ModelSyncDeclaration, modelClass: ReturnType<typeof JSON.parse>, resourceType: string}} args - Declaration args.
720
720
  * @returns {import("./sync-client-types.js").SyncClientResourceConfig} Derived resource config.
721
721
  */
722
722
  function resourceConfigFromSyncDeclaration({ declaration, modelClass, resourceType }) {
@@ -755,7 +755,7 @@ function resourceConfigFromSyncDeclaration({ declaration, modelClass, resourceTy
755
755
  * Derives boolean and local-only attribute names from a model's column metadata:
756
756
  * booleans from boolean column types; local-only from the primary key,
757
757
  * createdAt/updatedAt, and sync bookkeeping columns.
758
- * @param {{modelClass: ?, resourceType: string}} args - Derivation args.
758
+ * @param {{modelClass: ReturnType<typeof JSON.parse>, resourceType: string}} args - Derivation args.
759
759
  * @returns {{booleanAttributes: string[], localOnlyAttributes: string[]}} Derived attribute names.
760
760
  */
761
761
  function derivedSyncAttributes({ modelClass, resourceType }) {
@@ -810,7 +810,7 @@ function normalizedTrack(track) {
810
810
  /**
811
811
  * Builds a framework-owned sync endpoint POSTer over the configured transport.
812
812
  * @param {{path: string, transport: import("../configuration-types.js").VelociousSyncClientTransport}} args - Poster args.
813
- * @returns {(payload: Record<string, ?>) => Promise<?>} Sync endpoint POSTer.
813
+ * @returns {(payload: Record<string, ReturnType<typeof JSON.parse>>) => Promise<ReturnType<typeof JSON.parse>>} Sync endpoint POSTer.
814
814
  */
815
815
  function transportPoster({ path, transport }) {
816
816
  return async (payload) => {
@@ -838,10 +838,10 @@ export function syncClient(configuration = Configuration.current()) {
838
838
  }
839
839
  /**
840
840
  * Declares a sync scope on the current sync client.
841
- * @param {import("../database/query/model-class-query.js").default<?>} query - Query declaring the sync scope.
841
+ * @param {import("../database/query/model-class-query.js").default<ReturnType<typeof JSON.parse>>} query - Query declaring the sync scope.
842
842
  * @returns {Promise<{scope: import("./sync-client-types.js").SerializedSyncScope, pulled: import("./sync-api-client-types.js").SyncChangesResult | null}>} Declared scope and pull result.
843
843
  */
844
844
  export async function sync(query) {
845
845
  return await SyncClient.current().sync(query);
846
846
  }
847
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3luYy1jbGllbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvc3luYy9zeW5jLWNsaWVudC5qcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxZQUFZO0FBRVosT0FBTyxhQUFhLE1BQU0scUJBQXFCLENBQUE7QUFDL0MsT0FBTyxFQUFDLG1CQUFtQixFQUFDLE1BQU0sNkJBQTZCLENBQUE7QUFDL0QsT0FBTyxNQUFNLE1BQU0sY0FBYyxDQUFBO0FBQ2pDLE9BQU8sYUFBYSxNQUFNLDZCQUE2QixDQUFBO0FBQ3ZELE9BQU8sd0JBQXdCLE1BQU0sb0NBQW9DLENBQUE7QUFFekUsT0FBTyxFQUFDLHdCQUF3QixFQUFDLE1BQU0sa0JBQWtCLENBQUE7QUFDekQsT0FBTyxhQUFhLE1BQU0sc0JBQXNCLENBQUE7QUFDaEQsT0FBTyxrQkFBa0IsTUFBTSwyQkFBMkIsQ0FBQTtBQUMxRCxPQUFPLGNBQWMsTUFBTSx1QkFBdUIsQ0FBQTtBQUNsRCxPQUFPLEVBQUMsaUJBQWlCLEVBQUUsb0JBQW9CLEVBQUMsTUFBTSwyQkFBMkIsQ0FBQTtBQUVqRixJQUFJLGFBQWEsR0FBRyxDQUFDLENBQUE7QUFFckIsc0ZBQXNGO0FBQ3RGLE1BQU0sc0JBQXNCLEdBQUcsRUFBQyxNQUFNLEVBQUUsYUFBYSxFQUFFLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxFQUFFLGFBQWEsRUFBQyxDQUFBO0FBRXRHOzs7OztvREFLb0Q7QUFDcEQsTUFBTSwwQkFBMEIsR0FBRyxDQUFDLFFBQVEsRUFBRSxRQUFRLENBQUMsQ0FBQTtBQUV2RCxrR0FBa0c7QUFDbEcsTUFBTSxpQ0FBaUMsR0FBRyxDQUFDLFdBQVcsRUFBRSxXQUFXLEVBQUUsa0JBQWtCLENBQUMsQ0FBQTtBQUV4RixpREFBaUQ7QUFDakQsTUFBTSwwQkFBMEIsR0FBRyxJQUFJLE9BQU8sRUFBRSxDQUFBO0FBRWhEOzs7Ozs7Ozs7OztHQVdHO0FBQ0gsTUFBTSxDQUFDLE9BQU8sT0FBTyxV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VSxJQUFJLENBQUMsS0FBSztJQUM5QixPQUFPLE1BQU0sVUFBVSxDQUFDLE9BQU8sRUFBRSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQTtBQUMvQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQHRzLWNoZWNrXG5cbmltcG9ydCBDb25maWd1cmF0aW9uIGZyb20gXCIuLi9jb25maWd1cmF0aW9uLmpzXCJcbmltcG9ydCB7aXNCb29sZWFuQ29sdW1uVHlwZX0gZnJvbSBcIi4uL2RhdGFiYXNlL2NvbHVtbi10eXBlcy5qc1wiXG5pbXBvcnQgTG9nZ2VyIGZyb20gXCIuLi9sb2dnZXIuanNcIlxuaW1wb3J0IHJlc3RBcmdzRXJyb3IgZnJvbSBcIi4uL3V0aWxzL3Jlc3QtYXJncy1lcnJvci5qc1wiXG5pbXBvcnQgVmVsb2Npb3VzV2Vic29ja2V0Q2xpZW50IGZyb20gXCIuLi9odHRwLWNsaWVudC93ZWJzb2NrZXQtY2xpZW50LmpzXCJcblxuaW1wb3J0IHtzZXJpYWxpemVkU2NvcGVGcm9tUXVlcnl9IGZyb20gXCIuL3F1ZXJ5LXNjb3BlLmpzXCJcbmltcG9ydCBTeW5jQXBpQ2xpZW50IGZyb20gXCIuL3N5bmMtYXBpLWNsaWVudC5qc1wiXG5pbXBvcnQgU3luY1JlYWx0aW1lQnJpZGdlIGZyb20gXCIuL3N5bmMtcmVhbHRpbWUtYnJpZGdlLmpzXCJcbmltcG9ydCBTeW5jU2NvcGVTdG9yZSBmcm9tIFwiLi9zeW5jLXNjb3BlLXN0b3JlLmpzXCJcbmltcG9ydCB7Y3VycmVudFN5bmNDbGllbnQsIHNldEN1cnJlbnRTeW5jQ2xpZW50fSBmcm9tIFwiLi9zeW5jLWNsaWVudC1yZWdpc3RyeS5qc1wiXG5cbmxldCBjbGllbnRDb3VudGVyID0gMFxuXG4vKiogQHR5cGUge3tjcmVhdGU6IFwiYWZ0ZXJDcmVhdGVcIiwgdXBkYXRlOiBcImFmdGVyVXBkYXRlXCIsIGRlc3Ryb3k6IFwiYWZ0ZXJEZXN0cm95XCJ9fSAqL1xuY29uc3QgVFJBQ0tFRF9DQUxMQkFDS19OQU1FUyA9IHtjcmVhdGU6IFwiYWZ0ZXJDcmVhdGVcIiwgZGVzdHJveTogXCJhZnRlckRlc3Ryb3lcIiwgdXBkYXRlOiBcImFmdGVyVXBkYXRlXCJ9XG5cbi8qKlxuICogT3BlcmF0aW9ucyB0cmFja2VkIGJ5IGRlZmF1bHQgZm9yIG1vZGVscyBkZWNsYXJpbmcgYHN0YXRpYyBzeW5jYCB3aXRob3V0IGFcbiAqIGB0cmFja2Aga2V5OiBsb2NhbCBjcmVhdGVzIGFuZCB1cGRhdGVzIHF1ZXVlIGF1dG9tYXRpY2FsbHkuIERlc3Ryb3lzIGFyZSBub3RcbiAqIHRyYWNrZWQgYnkgZGVmYXVsdCBiZWNhdXNlIGEgbG9jYWwgZGVzdHJveSBpcyBvZnRlbiBjYWNoZSBldmljdGlvbiByYXRoZXJcbiAqIHRoYW4gYSBzZXJ2ZXIgZGVsZXRlOyBvcHQgaW4gd2l0aCBgdHJhY2s6IHRydWVgIG9yIGFuIG9wZXJhdGlvbnMgbGlzdC5cbiAqIEB0eXBlIHtBcnJheTxcImNyZWF0ZVwiIHwgXCJ1cGRhdGVcIiB8IFwiZGVzdHJveVwiPn0gKi9cbmNvbnN0IERFRkFVTFRfVFJBQ0tFRF9PUEVSQVRJT05TID0gW1wiY3JlYXRlXCIsIFwidXBkYXRlXCJdXG5cbi8qKiBBdHRyaWJ1dGUgbmFtZXMgdHJlYXRlZCBhcyBjbGllbnQtbG9jYWwgc3luYyBib29ra2VlcGluZyB3aGVuIGRlcml2aW5nIGxvY2FsT25seUF0dHJpYnV0ZXMuICovXG5jb25zdCBMT0NBTF9CT09LS0VFUElOR19BVFRSSUJVVEVfTkFNRVMgPSBbXCJjcmVhdGVkQXRcIiwgXCJ1cGRhdGVkQXRcIiwgXCJsYXN0U3luY0NoYW5nZUF0XCJdXG5cbi8qKiBAdHlwZSB7V2Vha01hcDxDb25maWd1cmF0aW9uLCBTeW5jQ2xpZW50Pn0gKi9cbmNvbnN0IHN5bmNDbGllbnRzQnlDb25maWd1cmF0aW9uID0gbmV3IFdlYWtNYXAoKVxuXG4vKipcbiAqIERlY2xhcmF0aXZlIGNsaWVudC1zaWRlIHN5bmMgZHJpdmVyLlxuICpcbiAqIEV2ZXJ5dGhpbmcgaXMgZGVyaXZlZCBmcm9tIHRoZSBhcHAncyBWZWxvY2lvdXMgY29uZmlndXJhdGlvbjogbW9kZWxzIGRlY2xhcmVcbiAqIGBzdGF0aWMgc3luY2AsIHRyYW5zcG9ydC9hdXRoL2Nvbm5lY3Rpdml0eSBjb21lIGZyb20gdGhlIGBzeW5jLmNsaWVudGBcbiAqIGNvbmZpZ3VyYXRpb24gYmxvY2ssIGFuZCBWZWxvY2lvdXMgb3ducyBzY29wZSBwZXJzaXN0ZW5jZSwgcGVyLXNjb3BlIGN1cnNvcnMsXG4gKiBwdWxsIHBhZ2luZy9hcHBseSwgbG9jYWwgcXVldWVpbmcsIGFuZCBvbmxpbmUtZ2F0ZWQgcmVwbGF5LiBEZWNsYXJlIHN5bmNcbiAqIGludGVyZXN0IGZyb20gcXVlcmllczpcbiAqXG4gKiAgICAgYXdhaXQgc3luY0NsaWVudCgpLnN0YXJ0KClcbiAqICAgICBhd2FpdCBzeW5jQ2xpZW50KCkuc3luYyhFdmVudC53aGVyZSh7cGFydG5lcklkfSkpXG4gKi9cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFN5bmNDbGllbnQge1xuICAvKipcbiAgICogQnVpbGRzIHRoZSBzeW5jIGNsaWVudCBieSBkZXJpdmluZyBldmVyeXRoaW5nIGZyb20gdGhlIGFwcCdzIFZlbG9jaW91c1xuICAgKiBjb25maWd1cmF0aW9uOiBldmVyeSByZWdpc3RlcmVkIG1vZGVsIGRlY2xhcmluZyBgc3RhdGljIHN5bmNgIGJlY29tZXMgYVxuICAgKiByZXNvdXJjZSB3aXRoIGJvb2xlYW5BdHRyaWJ1dGVzIGRlcml2ZWQgZnJvbSBjb2x1bW4gdHlwZXMgYW5kXG4gICAqIGxvY2FsT25seUF0dHJpYnV0ZXMgZGVyaXZlZCBmcm9tIHRoZSBwcmltYXJ5IGtleSwgY3JlYXRlZEF0L3VwZGF0ZWRBdCwgYW5kXG4gICAqIHN5bmMgYm9va2tlZXBpbmcgY29sdW1uczsgdGhlIHBlbmRpbmctc3luYyBtb2RlbCBpcyB0aGUgcmVnaXN0ZXJlZCBcIlN5bmNcIlxuICAgKiBtb2RlbDsgdHJhbnNwb3J0LCBhdXRoLCBjb25uZWN0aXZpdHksIGFuZCBlcnJvciByZXBvcnRpbmcgY29tZSBmcm9tIHRoZVxuICAgKiBgc3luYy5jbGllbnRgIGNvbmZpZ3VyYXRpb24gYmxvY2ssIHdpdGggdGhlIGZyYW1ld29yayBvd25pbmcgdGhlXG4gICAqIGAke21vdW50UGF0aH0vY2hhbmdlc2AgYW5kIGAke21vdW50UGF0aH0vcmVwbGF5YCBQT1NUZXJzLlxuICAgKiBAcGFyYW0ge2ltcG9ydChcIi4vc3luYy1jbGllbnQtdHlwZXMuanNcIikuU3luY0NsaWVudE9wdGlvbnN9IFtvcHRpb25zXSAtIE9wdGlvbmFsIG92ZXJyaWRlcy5cbiAgICovXG4gIGNvbnN0cnVjdG9yKG9wdGlvbnMgPSB7fSkge1xuICAgIGNvbnN0IHtjb25maWd1cmF0aW9uID0gQ29uZmlndXJhdGlvbi5jdXJyZW50KCksIGxlZ2FjeUN1cnNvciwgc2NvcGVTdG9yZSwgc3luY01vZGVsLCAuLi5yZXN0T3B0aW9uc30gPSBvcHRpb25zXG5cbiAgICByZXN0QXJnc0Vycm9yKHJlc3RPcHRpb25zKVxuXG4gICAgY29uc3QgY2xpZW50Q29uZmlndXJhdGlvbiA9IGNvbmZpZ3VyYXRpb24uZ2V0U3luY0NvbmZpZ3VyYXRpb24oKS5jbGllbnRcblxuICAgIGlmICghY2xpZW50Q29uZmlndXJhdGlvbikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiU3luY0NsaWVudCByZXF1aXJlcyBhIHN5bmMuY2xpZW50IGNvbmZpZ3VyYXRpb24gYmxvY2s6IG5ldyBDb25maWd1cmF0aW9uKHtzeW5jOiB7Y2xpZW50OiB7YXV0aGVudGljYXRpb25Ub2tlbiwgdHJhbnNwb3J0fX19KVwiKVxuICAgIH1cblxuICAgIGNvbnN0IG1vZGVsQ2xhc3NlcyA9IGNvbmZpZ3VyYXRpb24uZ2V0TW9kZWxDbGFzc2VzKClcbiAgICAvKiogQHR5cGUge1JlY29yZDxzdHJpbmcsIGltcG9ydChcIi4vc3luYy1jbGllbnQtdHlwZXMuanNcIikuU3luY0NsaWVudFJlc291cmNlQ29uZmlnPn0gKi9cbiAgICBjb25zdCByZXNvdXJjZXMgPSB7fVxuXG4gICAgZm9yIChjb25zdCBtb2RlbENsYXNzIG9mIE9iamVjdC52YWx1ZXMobW9kZWxDbGFzc2VzKSkge1xuICAgICAgaWYgKCFtb2RlbENsYXNzLnN5bmMpIGNvbnRpbnVlXG5cbiAgICAgIGNvbnN0IHJlc291cmNlVHlwZSA9IG1vZGVsQ2xhc3MuZ2V0TW9kZWxOYW1lKClcblxuICAgICAgcmVzb3VyY2VzW3Jlc291cmNlVHlwZV0gPSByZXNvdXJjZUNvbmZpZ0Zyb21TeW5jRGVjbGFyYXRpb24oe2RlY2xhcmF0aW9uOiBtb2RlbENsYXNzLnN5bmMsIG1vZGVsQ2xhc3MsIHJlc291cmNlVHlwZX0pXG4gICAgfVxuXG4gICAgaWYgKE9iamVjdC5rZXlzKHJlc291cmNlcykubGVuZ3RoID09PSAwKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJTeW5jQ2xpZW50IGZvdW5kIG5vIHJlZ2lzdGVyZWQgbW9kZWxzIGRlY2xhcmluZyBzdGF0aWMgc3luYyAtIGRlY2xhcmUgYHN0YXRpYyBzeW5jID0gdHJ1ZWAgKG9yIGEgc3luYyBkZWNsYXJhdGlvbiBvYmplY3QpIG9uIHRoZSBtb2RlbHMgdGhhdCBzaG91bGQgc3luY1wiKVxuICAgIH1cblxuICAgIGNvbnN0IHJlc29sdmVkU3luY01vZGVsID0gc3luY01vZGVsIHx8IG1vZGVsQ2xhc3Nlcy5TeW5jXG5cbiAgICBpZiAoIXJlc29sdmVkU3luY01vZGVsKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJTeW5jQ2xpZW50IHJlcXVpcmVzIGEgcmVnaXN0ZXJlZCBcXFwiU3luY1xcXCIgbW9kZWwgZm9yIHBlbmRpbmcgbG9jYWwgc3luYyByb3dzIChvciBwYXNzIG9wdGlvbnMuc3luY01vZGVsKVwiKVxuICAgIH1cblxuICAgIC8qKiBAdHlwZSB7aW1wb3J0KFwiLi9zeW5jLWNsaWVudC10eXBlcy5qc1wiKS5TeW5jQ2xpZW50Q29uZmlnfSAqL1xuICAgIHRoaXMuY29uZmlnID0ge1xuICAgICAgYXV0aGVudGljYXRpb25Ub2tlbjogY2xpZW50Q29uZmlndXJhdGlvbi5hdXRoZW50aWNhdGlvblRva2VuLFxuICAgICAgYmF0Y2hTaXplOiBjbGllbnRDb25maWd1cmF0aW9uLmJhdGNoU2l6ZSxcbiAgICAgIGNvbmZpZ3VyYXRpb24sXG4gICAgICBpc09ubGluZTogY2xpZW50Q29uZmlndXJhdGlvbi5pc09ubGluZSxcbiAgICAgIGxlZ2FjeUN1cnNvcixcbiAgICAgIG9uRXJyb3I6IGNsaWVudENvbmZpZ3VyYXRpb24ub25FcnJvcixcbiAgICAgIHBvc3RDaGFuZ2VzOiB0cmFuc3BvcnRQb3N0ZXIoe3BhdGg6IGAke2NsaWVudENvbmZpZ3VyYXRpb24ubW91bnRQYXRofS9jaGFuZ2VzYCwgdHJhbnNwb3J0OiBjbGllbnRDb25maWd1cmF0aW9uLnRyYW5zcG9ydH0pLFxuICAgICAgcG9zdFJlcGxheTogdHJhbnNwb3J0UG9zdGVyKHtwYXRoOiBgJHtjbGllbnRDb25maWd1cmF0aW9uLm1vdW50UGF0aH0vcmVwbGF5YCwgdHJhbnNwb3J0OiBjbGllbnRDb25maWd1cmF0aW9uLnRyYW5zcG9ydH0pLFxuICAgICAgcmVhbHRpbWU6IGNsaWVudENvbmZpZ3VyYXRpb24ucmVhbHRpbWUsXG4gICAgICByZXNvdXJjZXMsXG4gICAgICBzeW5jTW9kZWw6IHJlc29sdmVkU3luY01vZGVsLFxuICAgICAgd2Vic29ja2V0Q2xpZW50OiBjbGllbnRDb25maWd1cmF0aW9uLndlYnNvY2tldENsaWVudCxcbiAgICAgIHdlYnNvY2tldFVybDogY2xpZW50Q29uZmlndXJhdGlvbi53ZWJzb2NrZXRVcmxcbiAgICB9XG4gICAgdGhpcy5fY2xpZW50TnVtYmVyID0gKytjbGllbnRDb3VudGVyXG4gICAgLyoqIEB0eXBlIHtTeW5jUmVhbHRpbWVCcmlkZ2UgfCBudWxsfSAqL1xuICAgIHRoaXMuX3JlYWx0aW1lQnJpZGdlID0gbnVsbFxuICAgIC8qKiBAdHlwZSB7aW1wb3J0KFwiLi9zeW5jLWNsaWVudC10eXBlcy5qc1wiKS5TeW5jQ2xpZW50U2hhcmVkQ29ubmVjdGlvbiB8IG51bGwgfCB1bmRlZmluZWR9IFNoYXJlZCBhcHAtbGlmZXRpbWUgd2Vic29ja2V0IGNvbm5lY3Rpb24gKHVuZGVmaW5lZCB1bnRpbCBmaXJzdCByZXNvbHZlZCwgbnVsbCB3aGVuIG5vbmUgaXMgY29uZmlndXJlZCkuICovXG4gICAgdGhpcy5fc3luY0Nvbm5lY3Rpb24gPSB1bmRlZmluZWRcbiAgICAvKiogQHR5cGUge1Byb21pc2U8dm9pZD4gfCBudWxsfSAqL1xuICAgIHRoaXMuX3N1YnNjcmliZVVzZXJTY29wZVByb21pc2UgPSBudWxsXG4gICAgLyoqIEB0eXBlIHtcInN1YnNjcmliZWRcIiB8IFwic3Vic2NyaWJpbmdcIiB8IFwidW5zdWJzY3JpYmVkXCJ9ICovXG4gICAgdGhpcy5fdXNlclNjb3BlU3RhdGUgPSBcInVuc3Vic2NyaWJlZFwiXG4gICAgLyoqIEB0eXBlIHtpbXBvcnQoXCIuL3N5bmMtc2NvcGUtc3RvcmUuanNcIikuZGVmYXVsdCB8IG51bGx9ICovXG4gICAgdGhpcy5fc2NvcGVTdG9yZSA9IHNjb3BlU3RvcmUgfHwgbnVsbFxuICAgIC8qKiBAdHlwZSB7UHJvbWlzZTx2b2lkPiB8IG51bGx9ICovXG4gICAgdGhpcy5fc2NoZWR1bGVkUmVwbGF5ID0gbnVsbFxuICAgIC8qKiBAdHlwZSB7UmVjb3JkPHN0cmluZywgaW1wb3J0KFwiLi9zeW5jLWFwaS1jbGllbnQtdHlwZXMuanNcIikuU3luY1Jlc291cmNlQ29uZmlnPiB8IG51bGx9ICovXG4gICAgdGhpcy5fcHVsbFJlc291cmNlQ29uZmlncyA9IG51bGxcbiAgICAvKiogQHR5cGUge0FycmF5PHtjYWxsYmFjazogKHJlY29yZDogPykgPT4gUHJvbWlzZTx2b2lkPiwgY2FsbGJhY2tOYW1lOiBcImFmdGVyQ3JlYXRlXCIgfCBcImFmdGVyVXBkYXRlXCIgfCBcImFmdGVyRGVzdHJveVwiLCBtb2RlbENsYXNzOiA/fT59ICovXG4gICAgdGhpcy5fdHJhY2tlZENhbGxiYWNrcyA9IFtdXG4gICAgLyoqIEB0eXBlIHtXZWFrU2V0PG9iamVjdD59ICovXG4gICAgdGhpcy5fcmVtb3RlQXBwbHlSZWNvcmRzID0gbmV3IFdlYWtTZXQoKVxuICAgIHRoaXMuX3dpdGhvdXRUcmFja2luZ0RlcHRoID0gMFxuICAgIC8qKiBAdHlwZSB7TG9nZ2VyIHwge2Vycm9yOiAoLi4ubWVzc2FnZXM6IEFycmF5PD8+KSA9PiBQcm9taXNlPHZvaWQ+fSB8IG51bGx9ICovXG4gICAgdGhpcy5fbG9nZ2VyID0gbnVsbFxuICAgIHRoaXMuX3N0YXJ0ZWQgPSBmYWxzZVxuICB9XG5cbiAgLyoqXG4gICAqIFJlZ2lzdGVycyBhdXRvbWF0aWMgbXV0YXRpb24gdHJhY2tpbmcgZm9yIGV2ZXJ5IGRlY2xhcmVkIHJlc291cmNlIChvbiBieVxuICAgKiBkZWZhdWx0OiBsb2NhbCBjcmVhdGVzIGFuZCB1cGRhdGVzIHF1ZXVlIHBlbmRpbmcgc3luYyByb3dzIG9uY2UgdGhlaXJcbiAgICogdHJhbnNhY3Rpb24gY29tbWl0cyBhbmQgc2NoZWR1bGUgYW4gaW1tZWRpYXRlIHJlcGxheSBhdHRlbXB0LCB3aXRob3V0XG4gICAqIGFwcC1zaWRlIHF1ZXVlIGNhbGxzKS4gYHRyYWNrOiBmYWxzZWAgcmVzb3VyY2VzIGFyZSBza2lwcGVkOyBgdHJhY2s6IHRydWVgXG4gICAqIGFkZHMgZGVzdHJveXM7IGFuIG9wZXJhdGlvbnMgbGlzdCBuYXJyb3dzIHRoZSB0cmFja2VkIG9wZXJhdGlvbnMuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fVxuICAgKi9cbiAgYXN5bmMgc3RhcnQoKSB7XG4gICAgaWYgKHRoaXMuX3N0YXJ0ZWQpIHJldHVyblxuXG4gICAgdGhpcy5fc3RhcnRlZCA9IHRydWVcblxuICAgIGZvciAoY29uc3QgW3Jlc291cmNlVHlwZSwgcmVzb3VyY2VDb25maWddIG9mIE9iamVjdC5lbnRyaWVzKHRoaXMuY29uZmlnLnJlc291cmNlcykpIHtcbiAgICAgIGNvbnN0IG9wZXJhdGlvbnMgPSB0aGlzLnRyYWNrZWRPcGVyYXRpb25zKHtyZXNvdXJjZUNvbmZpZywgcmVzb3VyY2VUeXBlfSlcblxuICAgICAgZm9yIChjb25zdCBvcGVyYXRpb24gb2Ygb3BlcmF0aW9ucykge1xuICAgICAgICBjb25zdCBjYWxsYmFja05hbWUgPSBUUkFDS0VEX0NBTExCQUNLX05BTUVTW29wZXJhdGlvbl1cbiAgICAgICAgY29uc3QgY2FsbGJhY2sgPSB0aGlzLnRyYWNrZWRNdXRhdGlvbkNhbGxiYWNrKHtvcGVyYXRpb24sIHJlc291cmNlQ29uZmlnfSlcblxuICAgICAgICByZXNvdXJjZUNvbmZpZy5tb2RlbENsYXNzW2NhbGxiYWNrTmFtZV0oY2FsbGJhY2spXG4gICAgICAgIHRoaXMuX3RyYWNrZWRDYWxsYmFja3MucHVzaCh7Y2FsbGJhY2ssIGNhbGxiYWNrTmFtZSwgbW9kZWxDbGFzczogcmVzb3VyY2VDb25maWcubW9kZWxDbGFzc30pXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFVucmVnaXN0ZXJzIGFsbCB0cmFja2luZyBjYWxsYmFja3MgKHRlc3RzLCBzaWduLW91dCwgaG90IHJlbG9hZCkuXG4gICAqIEByZXR1cm5zIHt2b2lkfVxuICAgKi9cbiAgc3RvcCgpIHtcbiAgICBmb3IgKGNvbnN0IHtjYWxsYmFjaywgY2FsbGJhY2tOYW1lLCBtb2RlbENsYXNzfSBvZiB0aGlzLl90cmFja2VkQ2FsbGJhY2tzKSB7XG4gICAgICBtb2RlbENsYXNzLnVucmVnaXN0ZXJMaWZlY3ljbGVDYWxsYmFjayhjYWxsYmFja05hbWUsIGNhbGxiYWNrKVxuICAgIH1cblxuICAgIHRoaXMuX3RyYWNrZWRDYWxsYmFja3MgPSBbXVxuICAgIHRoaXMuX3N0YXJ0ZWQgPSBmYWxzZVxuICB9XG5cbiAgLyoqXG4gICAqIFJlc29sdmVzIGFuZCB2YWxpZGF0ZXMgdGhlIHRyYWNrZWQgb3BlcmF0aW9ucyBmb3IgYSByZXNvdXJjZSBjb25maWcuXG4gICAqIFRyYWNraW5nIGlzIG9uIGJ5IGRlZmF1bHQ6IG1vZGVscyBkZWNsYXJpbmcgYHN0YXRpYyBzeW5jYCB3aXRob3V0IGEgYHRyYWNrYFxuICAgKiBrZXkgcXVldWUgbG9jYWwgY3JlYXRlcyBhbmQgdXBkYXRlcyBhdXRvbWF0aWNhbGx5OyBgdHJhY2s6IGZhbHNlYCBvcHRzIGFcbiAgICogbW9kZWwgb3V0IChmb3IgbW9kZWxzIHdyaXR0ZW4gYnkgbm9uLXVzZXIgZmxvd3MpLlxuICAgKiBAcGFyYW0ge3tyZXNvdXJjZUNvbmZpZzogaW1wb3J0KFwiLi9zeW5jLWNsaWVudC10eXBlcy5qc1wiKS5TeW5jQ2xpZW50UmVzb3VyY2VDb25maWcsIHJlc291cmNlVHlwZTogc3RyaW5nfX0gYXJncyAtIFJlc291cmNlIGNvbmZpZyBhbmQgbmFtZS5cbiAgICogQHJldHVybnMge0FycmF5PFwiY3JlYXRlXCIgfCBcInVwZGF0ZVwiIHwgXCJkZXN0cm95XCI+fSBUcmFja2VkIG9wZXJhdGlvbnMuXG4gICAqL1xuICB0cmFja2VkT3BlcmF0aW9ucyh7cmVzb3VyY2VDb25maWcsIHJlc291cmNlVHlwZX0pIHtcbiAgICBjb25zdCB0cmFjayA9IHJlc291cmNlQ29uZmlnLnRyYWNrXG5cbiAgICBpZiAodHJhY2sgPT09IGZhbHNlKSByZXR1cm4gW11cbiAgICBpZiAodHJhY2sgPT09IHVuZGVmaW5lZCkgcmV0dXJuIERFRkFVTFRfVFJBQ0tFRF9PUEVSQVRJT05TXG4gICAgaWYgKHRyYWNrID09PSB0cnVlKSByZXR1cm4gW1wiY3JlYXRlXCIsIFwidXBkYXRlXCIsIFwiZGVzdHJveVwiXVxuXG4gICAgaWYgKCF0cmFjayB8fCB0eXBlb2YgdHJhY2sgIT09IFwib2JqZWN0XCIgfHwgIUFycmF5LmlzQXJyYXkodHJhY2sub3BlcmF0aW9ucykgfHwgdHJhY2sub3BlcmF0aW9ucy5sZW5ndGggPT09IDApIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgU3luY0NsaWVudCByZXNvdXJjZSAke3Jlc291cmNlVHlwZX0gdHJhY2sgbXVzdCBiZSB0cnVlIG9yIHtvcGVyYXRpb25zOiBbLi4uXX1gKVxuICAgIH1cblxuICAgIGZvciAoY29uc3Qgb3BlcmF0aW9uIG9mIHRyYWNrLm9wZXJhdGlvbnMpIHtcbiAgICAgIGlmICghKG9wZXJhdGlvbiBpbiBUUkFDS0VEX0NBTExCQUNLX05BTUVTKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFN5bmNDbGllbnQgcmVzb3VyY2UgJHtyZXNvdXJjZVR5cGV9IHRyYWNrLm9wZXJhdGlvbnMgbXVzdCBiZSBjcmVhdGUvdXBkYXRlL2Rlc3Ryb3ksIGdvdDogJHtTdHJpbmcob3BlcmF0aW9uKX1gKVxuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB0cmFjay5vcGVyYXRpb25zXG4gIH1cblxuICAvKipcbiAgICogQnVpbGRzIHRoZSBsaWZlY3ljbGUgY2FsbGJhY2sgcXVldWVpbmcgb25lIHRyYWNrZWQgbXV0YXRpb24uIFRoZSBxdWV1ZWRcbiAgICogcGF5bG9hZCBhbmQgc3luYyB0eXBlIGFyZSBzbmFwc2hvdHRlZCBhdCBtdXRhdGlvbi1jYWxsYmFjayB0aW1lLCBzb1xuICAgKiBhZnRlclNhdmUgaG9va3MgYXNzaWduaW5nIHVuc2F2ZWQgYXR0cmlidXRlcyAob3IgYW55IGxhdGVyIGRyaWZ0IG9uIHRoZVxuICAgKiByZWNvcmQpIGNhbm5vdCBjaGFuZ2Ugd2hhdCBnZXRzIHF1ZXVlZCB2cyB3aGF0IHdhcyBjb21taXR0ZWQuIFF1ZXVlaW5nIGlzXG4gICAqIGRlZmVycmVkIHRocm91Z2ggdGhlIG1vZGVsIGNvbm5lY3Rpb24ncyBhZnRlckNvbW1pdCBob29rIHNvIGl0IG9ubHkgcnVuc1xuICAgKiBvbmNlIHRoZSBtdXRhdGlvbidzIHRyYW5zYWN0aW9uIGhhcyBjb21taXR0ZWQgKGltbWVkaWF0ZWx5IHdoZW4gbm9cbiAgICogdHJhbnNhY3Rpb24gaXMgb3BlbikgLSBxdWV1ZWQgc3luY3MgbmV2ZXIgcmVmZXJlbmNlIHJvbGxlZC1iYWNrIHJvd3MuXG4gICAqIFBvc3QtY29tbWl0IHF1ZXVlIGZhaWx1cmVzIGFyZSByZXBvcnRlZCB3aXRob3V0IHJldGhyb3dpbmcgaW50byB0aGVcbiAgICogZHJpdmVyJ3MgYWZ0ZXJDb21taXQgY2hhaW4gKHNlZSByZXBvcnRBZnRlckNvbW1pdEVycm9yKS5cbiAgICogQHBhcmFtIHt7b3BlcmF0aW9uOiBcImNyZWF0ZVwiIHwgXCJ1cGRhdGVcIiB8IFwiZGVzdHJveVwiLCByZXNvdXJjZUNvbmZpZzogaW1wb3J0KFwiLi9zeW5jLWNsaWVudC10eXBlcy5qc1wiKS5TeW5jQ2xpZW50UmVzb3VyY2VDb25maWd9fSBhcmdzIC0gT3BlcmF0aW9uIGFuZCByZXNvdXJjZSBjb25maWcuXG4gICAqIEByZXR1cm5zIHsocmVjb3JkOiA/KSA9PiBQcm9taXNlPHZvaWQ+fSBMaWZlY3ljbGUgY2FsbGJhY2suXG4gICAqL1xuICB0cmFja2VkTXV0YXRpb25DYWxsYmFjayh7b3BlcmF0aW9uLCByZXNvdXJjZUNvbmZpZ30pIHtcbiAgICByZXR1cm4gYXN5bmMgKHJlY29yZCkgPT4ge1xuICAgICAgaWYgKHRoaXMuaXNUcmFja2luZ1N1cHByZXNzZWQocmVjb3JkKSkgcmV0dXJuXG5cbiAgICAgIGNvbnN0IGRhdGEgPSBTeW5jQXBpQ2xpZW50LnF1ZXVlZFN5bmNEYXRhKHtcbiAgICAgICAgYm9vbGVhbkF0dHJpYnV0ZXM6IHJlc291cmNlQ29uZmlnLmJvb2xlYW5BdHRyaWJ1dGVzIHx8IFtdLFxuICAgICAgICBkYXRhOiByZXNvdXJjZUNvbmZpZy50cmFja2VkRGF0YSA/IHJlc291cmNlQ29uZmlnLnRyYWNrZWREYXRhKHtvcGVyYXRpb24sIHJlY29yZH0pIDogdW5kZWZpbmVkLFxuICAgICAgICBsb2NhbE9ubHlBdHRyaWJ1dGVzOiByZXNvdXJjZUNvbmZpZy5sb2NhbE9ubHlBdHRyaWJ1dGVzIHx8IFtdLFxuICAgICAgICByZXNvdXJjZTogcmVjb3JkXG4gICAgICB9KVxuICAgICAgY29uc3Qgc3luY1R5cGUgPSB0aGlzLmRlZmF1bHRTeW5jVHlwZSh7b3BlcmF0aW9uLCByZWNvcmQsIHJlc291cmNlQ29uZmlnfSlcbiAgICAgIGNvbnN0IGRhdGFiYXNlT3BlcmF0aW9uID0gcmVjb3JkLmRhdGFiYXNlT3BlcmF0aW9uKClcbiAgICAgIGNvbnN0IG9wZXJhdGlvblNjb3BlID0gZGF0YWJhc2VPcGVyYXRpb25cbiAgICAgICAgPyBkYXRhYmFzZU9wZXJhdGlvbi5mb3JNb2RlbCh0aGlzLmNvbmZpZy5zeW5jTW9kZWwpXG4gICAgICAgIDogdGhpcy5jb25maWcuc3luY01vZGVsXG5cbiAgICAgIGF3YWl0IHJlY29yZC5jb25uZWN0aW9uKCkuYWZ0ZXJDb21taXQoYXN5bmMgKCkgPT4ge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGF3YWl0IFN5bmNBcGlDbGllbnQucXVldWVMb2NhbFN5bmMoe1xuICAgICAgICAgICAgZGF0YSxcbiAgICAgICAgICAgIHJlc291cmNlOiByZWNvcmQsXG4gICAgICAgICAgICBzeW5jTW9kZWw6IG9wZXJhdGlvblNjb3BlLFxuICAgICAgICAgICAgc3luY1R5cGVcbiAgICAgICAgICB9KVxuICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgIGF3YWl0IHRoaXMucmVwb3J0QWZ0ZXJDb21taXRFcnJvcigvKiogQHR5cGUge0Vycm9yfSAqLyAoZXJyb3IpKVxuXG4gICAgICAgICAgcmV0dXJuXG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLnNjaGVkdWxlUmVwbGF5KClcbiAgICAgIH0pXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJlcG9ydHMgYSBwb3N0LWNvbW1pdCB0cmFja2VkLXF1ZXVlaW5nIGZhaWx1cmUuIFRoZSB0cmFuc2FjdGlvbiBoYXMgYWxyZWFkeVxuICAgKiBjb21taXR0ZWQgd2hlbiBhZnRlckNvbW1pdCBjYWxsYmFja3MgcnVuLCBzbyByZXRocm93aW5nIGhlcmUgd291bGQgcG9pc29uXG4gICAqIHRoZSBkcml2ZXIncyBhd2FpdGVkIGFmdGVyQ29tbWl0IGNoYWluIChicmVha2luZyB1bnJlbGF0ZWQgY2FsbGJhY2tzKSAtXG4gICAqIGluc3RlYWQgdGhlIGZhaWx1cmUgZ29lcyB0byB0aGUgY29uZmlndXJlZCBzeW5jLmNsaWVudC5vbkVycm9yIGhvb2ssIG9yIGlzXG4gICAqIGxvZ2dlZCBsb3VkbHkgdGhyb3VnaCB0aGUgY2xpZW50J3MgbG9nZ2VyIHdoZW4gbm9uZSBpcyBjb25maWd1cmVkLlxuICAgKiBAcGFyYW0ge0Vycm9yfSBlcnJvciAtIFBvc3QtY29tbWl0IHF1ZXVlaW5nIGZhaWx1cmUuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fVxuICAgKi9cbiAgYXN5bmMgcmVwb3J0QWZ0ZXJDb21taXRFcnJvcihlcnJvcikge1xuICAgIGlmICh0aGlzLmNvbmZpZy5vbkVycm9yKSB7XG4gICAgICB0aGlzLmNvbmZpZy5vbkVycm9yKGVycm9yKVxuXG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBhd2FpdCB0aGlzLmxvZ2dlcigpLmVycm9yKFwiU3luY0NsaWVudCBmYWlsZWQgdG8gcXVldWUgYSB0cmFja2VkIG11dGF0aW9uIGFmdGVyIGNvbW1pdFwiLCBlcnJvcilcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBsYXppbHkgYnVpbHQgY2xpZW50IGxvZ2dlci5cbiAgICogQHJldHVybnMge0xvZ2dlciB8IHtlcnJvcjogKC4uLm1lc3NhZ2VzOiBBcnJheTw/PikgPT4gUHJvbWlzZTx2b2lkPn19IENsaWVudCBsb2dnZXIuXG4gICAqL1xuICBsb2dnZXIoKSB7XG4gICAgdGhpcy5fbG9nZ2VyIHx8PSBuZXcgTG9nZ2VyKFwiU3luY0NsaWVudFwiLCB7Y29uZmlndXJhdGlvbjogdGhpcy5jb25maWcuY29uZmlndXJhdGlvbn0pXG5cbiAgICByZXR1cm4gdGhpcy5fbG9nZ2VyXG4gIH1cblxuICAvKipcbiAgICogV2hldGhlciBhIHJlY29yZCBpcyBjdXJyZW50bHkgYmVpbmcgd3JpdHRlbiBieSBwdWxsLWFwcGx5IChlY2hvIHN1cHByZXNzaW9uKS5cbiAgICogQHBhcmFtIHs/fSByZWNvcmQgLSBMb2NhbCBtb2RlbCByZWNvcmQuXG4gICAqIEByZXR1cm5zIHtib29sZWFufSBXaGV0aGVyIHRoZSByZWNvcmQgd3JpdGUgb3JpZ2luYXRlcyBmcm9tIGEgcmVtb3RlIGNoYW5nZS5cbiAgICovXG4gIGlzUmVtb3RlQXBwbHkocmVjb3JkKSB7XG4gICAgcmV0dXJuIHRoaXMuX3JlbW90ZUFwcGx5UmVjb3Jkcy5oYXMocmVjb3JkKVxuICB9XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdHJhY2tlZCBtdXRhdGlvbiBxdWV1ZWluZyBpcyBjdXJyZW50bHkgc3VwcHJlc3NlZCBmb3IgYSByZWNvcmQ6XG4gICAqIGVpdGhlciB0aGUgcmVjb3JkIHdhcyBtYXJrZWQgYXMgYSByZW1vdGUgYXBwbHkgKGBtYXJrUmVtb3RlQXBwbHlgLCB1c2VkIGJ5XG4gICAqIHB1bGwgYW5kIHJlYWx0aW1lIGFwcGxpZXMpIG9yIGEgYHdpdGhvdXRUcmFja2luZ2AgY2FsbGJhY2sgaXMgcnVubmluZyBvblxuICAgKiB0aGlzIGNsaWVudC5cbiAgICogQHBhcmFtIHs/fSByZWNvcmQgLSBMb2NhbCBtb2RlbCByZWNvcmQuXG4gICAqIEByZXR1cm5zIHtib29sZWFufSBXaGV0aGVyIHRyYWNrZWQgcXVldWVpbmcgaXMgc3VwcHJlc3NlZCBmb3IgdGhlIHJlY29yZC5cbiAgICovXG4gIGlzVHJhY2tpbmdTdXBwcmVzc2VkKHJlY29yZCkge1xuICAgIHJldHVybiB0aGlzLl93aXRob3V0VHJhY2tpbmdEZXB0aCA+IDAgfHwgdGhpcy5pc1JlbW90ZUFwcGx5KHJlY29yZClcbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIGEgY2FsbGJhY2sgd2l0aCB0cmFja2VkIG11dGF0aW9uIHF1ZXVlaW5nIHN1cHByZXNzZWQgb24gdGhpcyBjbGllbnQgLVxuICAgKiBmb3IgY29kZSBhcHBseWluZyBzZXJ2ZXItb3JpZ2luYXRlZCBkYXRhIG91dHNpZGUgdGhlIGRlcml2ZWQgcHVsbC9yZWFsdGltZVxuICAgKiBhcHBsaWVycyAobGVnYWN5IHB1bGwgcGF0aHMsIGltcG9ydGVycywgc2lnbi1pbiBiYWNrZmlsbHMpLCBzbyB0aGVpciB3cml0ZXNcbiAgICogYXJlIG5vdCBlY2hvZWQgYmFjayB0byB0aGUgc2VydmVyIGFzIGRldmljZSBjaGFuZ2VzLiBTdXBwcmVzc2lvbiBjb3ZlcnMgdGhlXG4gICAqIHdob2xlIGFzeW5jIGR1cmF0aW9uIG9mIHRoZSBjYWxsYmFjayAobmVzdGVkIGNhbGxzIHN0YWNrKSBhbmQgaXNcbiAgICogY2xpZW50LXdpZGUgd2hpbGUgaXQgcnVuczogbXV0YXRpb25zIGZyb20gY29uY3VycmVudGx5IHJ1bm5pbmcgdGFza3MgYXJlXG4gICAqIGFsc28gc3VwcHJlc3NlZCBmb3IgdGhhdCB3aW5kb3csIHNvIHByZWZlciBgbWFya1JlbW90ZUFwcGx5KHJlY29yZClgIHdoZW5cbiAgICogd3JpdGVzIGZyb20gb3RoZXIgZmxvd3MgY2FuIGludGVybGVhdmUuXG4gICAqIEB0ZW1wbGF0ZSBUXG4gICAqIEBwYXJhbSB7KCkgPT4gUHJvbWlzZTxUPiB8IFR9IGNhbGxiYWNrIC0gV29yayB3aG9zZSBtb2RlbCB3cml0ZXMgc2hvdWxkIG5vdCBxdWV1ZSB0cmFja2VkIHN5bmNzLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxUPn0gVGhlIGNhbGxiYWNrIHJlc3VsdC5cbiAgICovXG4gIGFzeW5jIHdpdGhvdXRUcmFja2luZyhjYWxsYmFjaykge1xuICAgIHRoaXMuX3dpdGhvdXRUcmFja2luZ0RlcHRoKytcblxuICAgIHRyeSB7XG4gICAgICByZXR1cm4gYXdhaXQgY2FsbGJhY2soKVxuICAgIH0gZmluYWxseSB7XG4gICAgICB0aGlzLl93aXRob3V0VHJhY2tpbmdEZXB0aC0tXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIE1hcmtzIG9uZSByZWNvcmQgYXMgYmVpbmcgd3JpdHRlbiBmcm9tIHNlcnZlci1vcmlnaW5hdGVkIGRhdGEgc28gdHJhY2tlZFxuICAgKiBtdXRhdGlvbiBxdWV1ZWluZyBza2lwcyBpdCAocmVjb3JkLXByZWNpc2Ugc3VwcHJlc3Npb24pLiBUaGUgZGVyaXZlZCBwdWxsXG4gICAqIGFuZCByZWFsdGltZSBhcHBsaWVycyB1c2UgdGhpcyBpbnRlcm5hbGx5IGFyb3VuZCBldmVyeSBhcHBsaWVkIHdyaXRlLlxuICAgKiBAcGFyYW0gez99IHJlY29yZCAtIExvY2FsIG1vZGVsIHJlY29yZCBhYm91dCB0byBiZSB3cml0dGVuLlxuICAgKiBAcmV0dXJucyB7KCkgPT4gdm9pZH0gUmVsZWFzZSBjYWxsYmFjayByZS1lbmFibGluZyB0cmFja2luZyBmb3IgdGhlIHJlY29yZC5cbiAgICovXG4gIG1hcmtSZW1vdGVBcHBseShyZWNvcmQpIHtcbiAgICB0aGlzLl9yZW1vdGVBcHBseVJlY29yZHMuYWRkKHJlY29yZClcblxuICAgIHJldHVybiAoKSA9PiB0aGlzLl9yZW1vdGVBcHBseVJlY29yZHMuZGVsZXRlKHJlY29yZClcbiAgfVxuXG4gIC8qKlxuICAgKiBSZWdpc3RlcnMgdGhpcyBjbGllbnQgYXMgdGhlIGFwcCdzIGN1cnJlbnQgc3luYyBjbGllbnQuXG4gICAqIEByZXR1cm5zIHt2b2lkfVxuICAgKi9cbiAgc2V0Q3VycmVudCgpIHtcbiAgICBzZXRDdXJyZW50U3luY0NsaWVudCh0aGlzKVxuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIGFwcCdzIGN1cnJlbnQgc3luYyBjbGllbnQuXG4gICAqIEByZXR1cm5zIHtTeW5jQ2xpZW50fSBDdXJyZW50IHN5bmMgY2xpZW50LlxuICAgKi9cbiAgc3RhdGljIGN1cnJlbnQoKSB7XG4gICAgcmV0dXJuIC8qKiBAdHlwZSB7U3luY0NsaWVudH0gKi8gKGN1cnJlbnRTeW5jQ2xpZW50KCkpXG4gIH1cblxuICAvKipcbiAgICogQnVpbGRzIGEgc3luYyBjbGllbnQgZGVyaXZlZCBmcm9tIHRoZSBnaXZlbiBjb25maWd1cmF0aW9uLiBBbGlhcyBmb3JcbiAgICogYG5ldyBTeW5jQ2xpZW50KHtjb25maWd1cmF0aW9uLCAuLi5vcHRpb25zfSlgLlxuICAgKiBAcGFyYW0ge0NvbmZpZ3VyYXRpb259IFtjb25maWd1cmF0aW9uXSAtIENvbmZpZ3VyYXRpb24gb3duaW5nIHRoZSByZWdpc3RlcmVkIG1vZGVscyBhbmQgdGhlIHN5bmMuY2xpZW50IGJsb2NrLiBEZWZhdWx0cyB0byB0aGUgY3VycmVudCBjb25maWd1cmF0aW9uLlxuICAgKiBAcGFyYW0ge09taXQ8aW1wb3J0KFwiLi9zeW5jLWNsaWVudC10eXBlcy5qc1wiKS5TeW5jQ2xpZW50T3B0aW9ucywgXCJjb25maWd1cmF0aW9uXCI+fSBbb3B0aW9uc10gLSBPcHRpb25hbCBvdmVycmlkZXMuXG4gICAqIEByZXR1cm5zIHtTeW5jQ2xpZW50fSBTeW5jIGNsaWVudCBkZXJpdmVkIGZyb20gdGhlIGNvbmZpZ3VyYXRpb24uXG4gICAqL1xuICBzdGF0aWMgZnJvbUNvbmZpZ3VyYXRpb24oY29uZmlndXJhdGlvbiA9IENvbmZpZ3VyYXRpb24uY3VycmVudCgpLCBvcHRpb25zID0ge30pIHtcbiAgICByZXR1cm4gbmV3IFN5bmNDbGllbnQoey4uLm9wdGlvbnMsIGNvbmZpZ3VyYXRpb259KVxuICB9XG5cbiAgLyoqXG4gICAqIERlY2xhcmVzIChvciByZS1hY3RpdmF0ZXMpIGEgc3luYyBzY29wZSBmcm9tIGEgbW9kZWwgcXVlcnkgYW5kIHB1bGxzIGl0IHdoZW4gb25saW5lLlxuICAgKiBAcGFyYW0ge2ltcG9ydChcIi4uL2RhdGFiYXNlL3F1ZXJ5L21vZGVsLWNsYXNzLXF1ZXJ5LmpzXCIpLmRlZmF1bHQ8Pz59IHF1ZXJ5IC0gUXVlcnkgZGVjbGFyaW5nIHRoZSBzeW5jIHNjb3BlLlxuICAgKiBAcGFyYW0ge29iamVjdH0gW29wdGlvbnNdIC0gU3luYyBvcHRpb25zLlxuICAgKiBAcGFyYW0geyhwcm9ncmVzczogaW1wb3J0KFwiLi9zeW5jLWFwaS1jbGllbnQtdHlwZXMuanNcIikuU3luY1B1bGxQcm9ncmVzcykgPT4gdm9pZH0gW29wdGlvbnMub25Qcm9ncmVzc10gLSBDYWxsZWQgcGVyIGFwcGxpZWQgcGFnZSBvZiB0aGUgcHVsbCB0aGlzIGRlY2xhcmF0aW9uIHRyaWdnZXJzLCBzbyB0aGUgaW5pdGlhbCBpbXBvcnQgb2YgYSBuZXdseSBkZWNsYXJlZCBzY29wZSBjYW4gZHJpdmUgYSBcInN5bmNlZENvdW50IG9mIHRvdGFsXCIgcHJvZ3Jlc3MgYmFyLiBTZWUgYHB1bGwoKWAuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHtzY29wZTogaW1wb3J0KFwiLi9zeW5jLWNsaWVudC10eXBlcy5qc1wiKS5TZXJpYWxpemVkU3luY1Njb3BlLCBwdWxsZWQ6IGltcG9ydChcIi4vc3luYy1hcGktY2xpZW50LXR5cGVzLmpzXCIpLlN5bmNDaGFuZ2VzUmVzdWx0IHwgbnVsbH0+fSBEZWNsYXJlZCBzY29wZSBhbmQgcHVsbCByZXN1bHQgKG51bGwgd2hpbGUgb2ZmbGluZSkuXG4gICAqL1xuICBhc3luYyBzeW5jKHF1ZXJ5LCB7b25Qcm9ncmVzc30gPSB7fSkge1xuICAgIGNvbnN0IHNjb3BlID0gc2VyaWFsaXplZFNjb3BlRnJvbVF1ZXJ5KHF1ZXJ5KVxuICAgIGNvbnN0IHNjb3BlU3RvcmUgPSB0aGlzLnNjb3BlU3RvcmUoKVxuICAgIGNvbnN0IHNjb3BlUm93ID0gYXdhaXQgc2NvcGVTdG9yZS5maW5kT3JDcmVhdGVTY29wZShzY29wZSlcblxuICAgIGlmICghc2NvcGVSb3cuY3Vyc29yUGF5bG9hZCAmJiB0aGlzLmNvbmZpZy5sZWdhY3lDdXJzb3IpIHtcbiAgICAgIGNvbnN0IGxlZ2FjeUN1cnNvclBheWxvYWQgPSBhd2FpdCB0aGlzLmNvbmZpZy5sZWdhY3lDdXJzb3Ioe3Njb3BlfSlcbiAgICAgIGNvbnN0IGxlZ2FjeUN1cnNvciA9IFN5bmNBcGlDbGllbnQuc3luY0N1cnNvckZyb21QYXlsb2FkKGxlZ2FjeUN1cnNvclBheWxvYWQpXG5cbiAgICAgIGlmIChsZWdhY3lDdXJzb3IpIGF3YWl0IHNjb3BlU3RvcmUuc2F2ZUN1cnNvcihzY29wZVJvdywgbGVnYWN5Q3Vyc29yKVxuICAgIH1cblxuICAgIHJldHVybiB7cHVsbGVkOiBhd2FpdCB0aGlzLnB1bGwoe29uUHJvZ3Jlc3N9KSwgc2NvcGV9XG4gIH1cblxuICAvKipcbiAgICogRGVhY3RpdmF0ZXMgdGhlIHN5bmMgc2NvcGUgZGVjbGFyZWQgYnkgYSBtb2RlbCBxdWVyeS5cbiAgICogQHBhcmFtIHtpbXBvcnQoXCIuLi9kYXRhYmFzZS9xdWVyeS9tb2RlbC1jbGFzcy1xdWVyeS5qc1wiKS5kZWZhdWx0PD8+fSBxdWVyeSAtIFF1ZXJ5IHdob3NlIHNjb3BlIHNob3VsZCBzdG9wIHN5bmNpbmcuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fVxuICAgKi9cbiAgYXN5bmMgdW5zeW5jKHF1ZXJ5KSB7XG4gICAgYXdhaXQgdGhpcy5zY29wZVN0b3JlKCkuZGVhY3RpdmF0ZShzZXJpYWxpemVkU2NvcGVGcm9tUXVlcnkocXVlcnkpKVxuICB9XG5cbiAgLyoqXG4gICAqIFB1bGxzIGNoYW5nZXMgZm9yIGV2ZXJ5IGFjdGl2ZSBzY29wZSB3aXRoIHBlci1zY29wZSBjdXJzb3JzIChzaW5nbGUtZmxpZ2h0ZWQsIG9ubGluZS1nYXRlZCkuXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBbb3B0aW9uc10gLSBQdWxsIG9wdGlvbnMuXG4gICAqIEBwYXJhbSB7KHByb2dyZXNzOiBpbXBvcnQoXCIuL3N5bmMtYXBpLWNsaWVudC10eXBlcy5qc1wiKS5TeW5jUHVsbFByb2dyZXNzKSA9PiB2b2lkfSBbb3B0aW9ucy5vblByb2dyZXNzXSAtIENhbGxlZCBwZXIgYXBwbGllZCBwYWdlIHdpdGggY3VtdWxhdGl2ZSBge3BhZ2VzLCBzeW5jZWRDb3VudCwgdG90YWx9YCBhY3Jvc3MgdGhlIHB1bGxlZCBzY29wZXMsIGZvciByZW5kZXJpbmcgYSBcInN5bmNlZENvdW50IG9mIHRvdGFsXCIgcHJvZ3Jlc3MgYmFyIChlLmcuIGEgZnVsbC1pbXBvcnQgc2NyZWVuKS4gT3B0aW9uYWw7IG9taXR0aW5nIGl0IGtlZXBzIHRoZSBleGlzdGluZyBiZWhhdmlvci5cbiAgICogQHJldHVybnMge1Byb21pc2U8aW1wb3J0KFwiLi9zeW5jLWFwaS1jbGllbnQtdHlwZXMuanNcIikuU3luY0NoYW5nZXNSZXN1bHQgfCBudWxsPn0gQ29tYmluZWQgcHVsbCByZXN1bHQsIG9yIG51bGwgd2hpbGUgb2ZmbGluZS5cbiAgICovXG4gIGFzeW5jIHB1bGwoe29uUHJvZ3Jlc3N9ID0ge30pIHtcbiAgICBpZiAoIShhd2FpdCB0aGlzLmlzT25saW5lKCkpKSByZXR1cm4gbnVsbFxuXG4gICAgLyoqIEB0eXBlIHtpbXBvcnQoXCIuL3N5bmMtYXBpLWNsaWVudC10eXBlcy5qc1wiKS5TeW5jQ2hhbmdlc1Jlc3VsdCB8IG51bGx9ICovXG4gICAgbGV0IGNvbWJpbmVkUmVzdWx0ID0gbnVsbFxuXG4gICAgYXdhaXQgU3luY0FwaUNsaWVudC5zaW5nbGVGbGlnaHQoYHZlbG9jaW91cy1zeW5jLWNsaWVudC1wdWxsLSR7dGhpcy5fY2xpZW50TnVtYmVyfWAsIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IGF1dGhlbnRpY2F0aW9uVG9rZW4gPSBhd2FpdCB0aGlzLmNvbmZpZy5hdXRoZW50aWNhdGlvblRva2VuKClcbiAgICAgIGNvbnN0IHNjb3BlU3RvcmUgPSB0aGlzLnNjb3BlU3RvcmUoKVxuICAgICAgY29uc3QgYXBwbHlTeW5jID0gdGhpcy5yZW1vdGVBcHBseVN5bmMoKVxuICAgICAgY29uc3QgcmVzdWx0ID0ge1xuICAgICAgICBjaGFuZ2VkOiBmYWxzZSxcbiAgICAgICAgcGFnZXM6IDAsXG4gICAgICAgIHJlc291cmNlQ2hhbmdlZDogLyoqIEB0eXBlIHtSZWNvcmQ8c3RyaW5nLCBib29sZWFuPn0gKi8gKHt9KSxcbiAgICAgICAgcmVzb3VyY2VDb3VudHM6IC8qKiBAdHlwZSB7UmVjb3JkPHN0cmluZywgbnVtYmVyPn0gKi8gKHt9KSxcbiAgICAgICAgc3luY2VkQ291bnQ6IDAsXG4gICAgICAgIHRvdGFsOiAwXG4gICAgICB9XG5cbiAgICAgIGZvciAoY29uc3Qgc2NvcGVSb3cgb2YgYXdhaXQgc2NvcGVTdG9yZS5hY3RpdmVTY29wZXMoKSkge1xuICAgICAgICAvLyBDdW11bGF0ZSBzY29wZSBwcm9ncmVzcyBvbnRvIHRoZSBjb3VudHMgb2YgdGhlIHNjb3BlcyBhbHJlYWR5IHB1bGxlZCBzbyBhIHNpbmdsZVxuICAgICAgICAvLyBzY29wZSdzIHBlci1wYWdlIHByb2dyZXNzIHJlYWRzIGV4YWN0bHkgaXRzIG93biBjb3VudHMgKGJhc2UgMCksIGFuZCBtdWx0aS1zY29wZVxuICAgICAgICAvLyBwdWxscyByZXBvcnQgYSBydW5uaW5nIGN1bXVsYXRpdmUgdG90YWwgYWNyb3NzIGV2ZXJ5IHNjb3BlLlxuICAgICAgICBjb25zdCBiYXNlUGFnZXMgPSByZXN1bHQucGFnZXNcbiAgICAgICAgY29uc3QgYmFzZVN5bmNlZENvdW50ID0gcmVzdWx0LnN5bmNlZENvdW50XG4gICAgICAgIGNvbnN0IGJhc2VUb3RhbCA9IHJlc3VsdC50b3RhbFxuICAgICAgICBjb25zdCBzY29wZVJlc3VsdCA9IGF3YWl0IFN5bmNBcGlDbGllbnQucHVsbENoYW5nZXMoe1xuICAgICAgICAgIGFwcGx5U3luYyxcbiAgICAgICAgICBhdXRoZW50aWNhdGlvblRva2VuLFxuICAgICAgICAgIGJhdGNoU2l6ZTogdGhpcy5jb25maWcuYmF0Y2hTaXplLFxuICAgICAgICAgIGxvYWRDdXJzb3I6IGFzeW5jICgpID0+IGF3YWl0IHNjb3BlU3RvcmUubG9hZEN1cnNvcihzY29wZVJvdyksXG4gICAgICAgICAgb25Qcm9ncmVzczogb25Qcm9ncmVzcyA/IChwcm9ncmVzcykgPT4gb25Qcm9ncmVzcyh7XG4gICAgICAgICAgICBwYWdlczogYmFzZVBhZ2VzICsgcHJvZ3Jlc3MucGFnZXMsXG4gICAgICAgICAgICBzeW5jZWRDb3VudDogYmFzZVN5bmNlZENvdW50ICsgcHJvZ3Jlc3Muc3luY2VkQ291bnQsXG4gICAgICAgICAgICB0b3RhbDogYmFzZVRvdGFsICsgcHJvZ3Jlc3MudG90YWxcbiAgICAgICAgICB9KSA6IHVuZGVmaW5lZCxcbiAgICAgICAgICBwb3N0Q2hhbmdlczogYXN5bmMgKHBheWxvYWQpID0+IGF3YWl0IHRoaXMuY29uZmlnLnBvc3RDaGFuZ2VzKHtcbiAgICAgICAgICAgIC4uLnBheWxvYWQsXG4gICAgICAgICAgICAvLyBPbmx5IHRoZSBhbGwtdHlwZXMgc2NvcGUgY2FycmllcyB0aGUgdHlwZSBsaXN0OyBhIHR5cGUtZGVjbGFyZWQgc2NvcGUgbmVlZHMgbm9uZS5cbiAgICAgICAgICAgIHNjb3BlOiB7XG4gICAgICAgICAgICAgIGNvbmRpdGlvbnM6IHNjb3BlUm93LmNvbmRpdGlvbnMsXG4gICAgICAgICAgICAgIHJlc291cmNlVHlwZTogc2NvcGVSb3cucmVzb3VyY2VUeXBlLFxuICAgICAgICAgICAgICAuLi4oc2NvcGVSb3cucmVzb3VyY2VUeXBlID09PSBudWxsID8ge3Jlc291cmNlVHlwZXM6IHRoaXMudXNlclNjb3BlUmVzb3VyY2VUeXBlcygpfSA6IHt9KVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pLFxuICAgICAgICAgIHNhdmVDdXJzb3I6IGFzeW5jIChjdXJzb3IpID0+IGF3YWl0IHNjb3BlU3RvcmUuc2F2ZUN1cnNvcihzY29wZVJvdywgY3Vyc29yKVxuICAgICAgICB9KVxuXG4gICAgICAgIHJlc3VsdC5jaGFuZ2VkIHx8PSBzY29wZVJlc3VsdC5jaGFuZ2VkXG4gICAgICAgIHJlc3VsdC5wYWdlcyArPSBzY29wZVJlc3VsdC5wYWdlc1xuICAgICAgICByZXN1bHQuc3luY2VkQ291bnQgKz0gc2NvcGVSZXN1bHQuc3luY2VkQ291bnRcbiAgICAgICAgcmVzdWx0LnRvdGFsICs9IHNjb3BlUmVzdWx0LnRvdGFsXG5cbiAgICAgICAgZm9yIChjb25zdCBbcmVzb3VyY2VUeXBlLCBjb3VudF0gb2YgT2JqZWN0LmVudHJpZXMoc2NvcGVSZXN1bHQucmVzb3VyY2VDb3VudHMpKSB7XG4gICAgICAgICAgcmVzdWx0LnJlc291cmNlQ291bnRzW3Jlc291cmNlVHlwZV0gPSAocmVzdWx0LnJlc291cmNlQ291bnRzW3Jlc291cmNlVHlwZV0gfHwgMCkgKyBjb3VudFxuICAgICAgICB9XG4gICAgICAgIGZvciAoY29uc3QgW3Jlc291cmNlVHlwZSwgY2hhbmdlZF0gb2YgT2JqZWN0LmVudHJpZXMoc2NvcGVSZXN1bHQucmVzb3VyY2VDaGFuZ2VkKSkge1xuICAgICAgICAgIHJlc3VsdC5yZXNvdXJjZUNoYW5nZWRbcmVzb3VyY2VUeXBlXSB8fD0gY2hhbmdlZFxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGNvbWJpbmVkUmVzdWx0ID0gcmVzdWx0XG4gICAgfSlcblxuICAgIHJldHVybiBjb21iaW5lZFJlc3VsdFxuICB9XG5cbiAgLyoqXG4gICAqIEJ1aWxkcyB0aGUgZGVyaXZlZCByZW1vdGUtY2hhbmdlIGFwcGxpZXIgc2hhcmVkIGJ5IHB1bGxzIGFuZCByZWFsdGltZSBwdXNoZXM6XG4gICAqIGFwcGxpZXMgdGhyb3VnaCB0aGUgZGVjbGFyZWQgcmVzb3VyY2UgY29uZmlncywgcmVnaXN0ZXJzIGVhY2ggd3JpdHRlbiByZWNvcmRcbiAgICogZm9yIGVjaG8gc3VwcHJlc3Npb24gKHRyYWNrZWQgcmVzb3VyY2VzIGRvIG5vdCByZS1xdWV1ZSBhcHBsaWVkIGNoYW5nZXMpLCBhbmRcbiAgICogZmFpbHMgbG91ZGx5IGluc3RlYWQgb2Ygc2lsZW50bHkgc2tpcHBpbmcgdW5jb25maWd1cmVkIHJlc291cmNlcy5cbiAgICogQHBhcmFtIHt7c291cmNlPzogc3RyaW5nfX0gW2FyZ3NdIC0gRXJyb3IgY29udGV4dCBkZXNjcmliaW5nIHdoZXJlIHRoZSBjaGFuZ2UgY2FtZSBmcm9tLlxuICAgKiBAcmV0dXJucyB7KHN5bmM6IGltcG9ydChcIi4vc3luYy1hcGktY2xpZW50LXR5cGVzLmpzXCIpLlN5bmNDaGFuZ2VFbnZlbG9wZSkgPT4gUHJvbWlzZTxpbXBvcnQoXCIuL3N5bmMtYXBpLWNsaWVudC10eXBlcy5qc1wiKS5TeW5jQ2hhbmdlQXBwbHlSZXN1bHQ+fSBMb3VkIHJlbW90ZS1jaGFuZ2UgYXBwbGllci5cbiAgICovXG4gIHJlbW90ZUFwcGx5U3luYyh7c291cmNlID0gXCJwdWxsZWQgY2hhbmdlXCJ9ID0ge30pIHtcbiAgICBjb25zdCBwdWxsUmVzb3VyY2VDb25maWdzID0gdGhpcy5wdWxsUmVzb3VyY2VDb25maWdzKClcbiAgICBjb25zdCBhcHBsaWVyID0gU3luY0FwaUNsaWVudC5yZXNvdXJjZUFwcGxpZXIocHVsbFJlc291cmNlQ29uZmlncywgKHJlY29yZCkgPT4gdGhpcy5tYXJrUmVtb3RlQXBwbHkocmVjb3JkKSlcblxuICAgIHJldHVybiBhc3luYyAoc3luYykgPT4ge1xuICAgICAgY29uc3QgcmVzb3VyY2VUeXBlID0gc3luYy5yZXNvdXJjZVR5cGUoKVxuXG4gICAgICBpZiAoIXJlc291cmNlVHlwZSB8fCAhcHVsbFJlc291cmNlQ29uZmlnc1tyZXNvdXJjZVR5cGVdKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgTm8gc3luYyByZXNvdXJjZSB3aXRoIHB1bGwgYXR0cmlidXRlcyBjb25maWd1cmVkIGZvciAke3NvdXJjZX06ICR7U3RyaW5nKHJlc291cmNlVHlwZSl9YClcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGF3YWl0IGFwcGxpZXIoc3luYylcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUmVzb2x2ZXMgdGhlIHNoYXJlZCBhcHAtbGlmZXRpbWUgd2Vic29ja2V0IGNvbm5lY3Rpb24gYWxsIHN5bmMgdHJhZmZpY1xuICAgKiByaWRlcywgb3IgbnVsbCB3aGVuIG5vbmUgaXMgY29uZmlndXJlZC4gQnVpbHQgb25jZSBhbmQgbWVtb2l6ZWQgKHBlclxuICAgKiBjbGllbnQpOiBhbiBhcHAtcHJvdmlkZWQgYHN5bmMuY2xpZW50LndlYnNvY2tldENsaWVudGAgaW5zdGFuY2Ugd2lucyAodGhlXG4gICAqIGZyb250ZW5kLW1vZGVsIHRyYW5zcG9ydCBjYW4gcGFzcyBpdHMgb3duIGNsaWVudCBzbyBvbmUgc29ja2V0IGNhcnJpZXNcbiAgICogZXZlcnl0aGluZyksIGVsc2UgYSBmcmFtZXdvcmstb3duZWQgcmVjb25uZWN0aW5nIHtAbGluayBWZWxvY2lvdXNXZWJzb2NrZXRDbGllbnR9XG4gICAqIGJ1aWx0IGZyb20gYHN5bmMuY2xpZW50LndlYnNvY2tldFVybGAuIFRoZSByZWFsdGltZSBicmlkZ2UgcmlkZXMgdGhpc1xuICAgKiBjb25uZWN0aW9uIHdpdGhvdXQgb3duaW5nIGl0cyBsaWZlY3ljbGU7IHdoZW4gbmVpdGhlciBpcyBjb25maWd1cmVkIHRoZVxuICAgKiBicmlkZ2UgZmFsbHMgYmFjayB0byB0aGUgZGVwcmVjYXRlZCBwZXItY3ljbGUgYHJlYWx0aW1lLmNyZWF0ZUNsaWVudGAuXG4gICAqIEByZXR1cm5zIHtpbXBvcnQoXCIuL3N5bmMtY2xpZW50LXR5cGVzLmpzXCIpLlN5bmNDbGllbnRTaGFyZWRDb25uZWN0aW9uIHwgbnVsbH0gU2hhcmVkIHdlYnNvY2tldCBjb25uZWN0aW9uLCBvciBudWxsLlxuICAgKi9cbiAgc3luY0Nvbm5lY3Rpb24oKSB7XG4gICAgaWYgKHRoaXMuX3N5bmNDb25uZWN0aW9uICE9PSB1bmRlZmluZWQpIHJldHVybiB0aGlzLl9zeW5jQ29ubmVjdGlvblxuXG4gICAgaWYgKHRoaXMuY29uZmlnLndlYnNvY2tldENsaWVudCkge1xuICAgICAgdGhpcy5fc3luY0Nvbm5lY3Rpb24gPSB0aGlzLmNvbmZpZy53ZWJzb2NrZXRDbGllbnRcbiAgICB9IGVsc2UgaWYgKHRoaXMuY29uZmlnLndlYnNvY2tldFVybCkge1xuICAgICAgY29uc3QgdXJsID0gdHlwZW9mIHRoaXMuY29uZmlnLndlYnNvY2tldFVybCA9PT0gXCJmdW5jdGlvblwiID8gdGhpcy5jb25maWcud2Vic29ja2V0VXJsKCkgOiB0aGlzLmNvbmZpZy53ZWJzb2NrZXRVcmxcblxuICAgICAgdGhpcy5fc3luY0Nvbm5lY3Rpb24gPSB1cmwgPyBuZXcgVmVsb2Npb3VzV2Vic29ja2V0Q2xpZW50KHt1cmx9KSA6IG51bGxcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5fc3luY0Nvbm5lY3Rpb24gPSBudWxsXG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuX3N5bmNDb25uZWN0aW9uXG4gIH1cblxuICAvKipcbiAgICogU3Vic2NyaWJlcyB0aGUgZGVyaXZlZCByZWFsdGltZSBjaGFubmVscyBzbyBwdXNoZWQgd2Vic29ja2V0IGNoYW5nZXMgYXBwbHlcbiAgICogdGhyb3VnaCB0aGUgc2FtZSBkZXJpdmVkIGFwcGxpZXIgYXMgcHVsbHMgKGlkZW1wb3RlbnQsIHNpbmdsZS1mbGlnaHRlZCkuXG4gICAqIEBwYXJhbSB7P30gW2NvbnRleHRdIC0gQXBwIGNvbnRleHQgcGFzc2VkIHRvIHRoZSBkZXByZWNhdGVkIGBzeW5jLmNsaWVudC5yZWFsdGltZS5jaGFubmVsc2AgY2FsbGJhY2sgKHJ1bnRpbWUgc2NvcGUgdmFsdWVzKS5cbiAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59XG4gICAqL1xuICBhc3luYyBzdWJzY3JpYmVSZWFsdGltZShjb250ZXh0KSB7XG4gICAgYXdhaXQgdGhpcy5yZWFsdGltZUJyaWRnZSgpLnN1YnNjcmliZShjb250ZXh0KVxuICB9XG5cbiAgLyoqXG4gICAqIFN1YnNjcmliZXMgdGhlIHNlcnZlci1lbnVtZXJhdGVkIHVzZXIgc2NvcGU6IFwiZXZlcnl0aGluZyBteSBhYmlsaXR5IGNhblxuICAgKiBzZWVcIi4gRGVjbGFyZXMgYSB1c2VyIHNjb3BlIChlbXB0eSBjb25kaXRpb25zKSBmb3IgZXZlcnkgcHVsbGFibGUgc3luY2VkXG4gICAqIHJlc291cmNlIHR5cGUsIHN1YnNjcmliZXMgcmVhbHRpbWUgc28gdGhlaXIgZnJhbWV3b3JrIHN5bmMgY2hhbm5lbFxuICAgKiBzdWJzY3JpcHRpb25zIGdvIGxpdmUsIGFuZCBwdWxscyBzbyB0aGUgZGV2aWNlIGNhdGNoZXMgdXAuIFRoZSBzZXJ2ZXJcbiAgICogYXV0aG9yaXplcyBlYWNoIGVtcHR5LWNvbmRpdGlvbnMgc2NvcGUgdGhyb3VnaCB0aGUgYXBwIHN5bmMgcmVzb3VyY2Unc1xuICAgKiBgYXV0aG9yaXplQ2hhbmdlc2AgYW5kIHJlLWNoZWNrcyByZWNvcmQgYWNjZXNzIHBlciBkZWxpdmVyeSwgc28gdGhlIGNsaWVudFxuICAgKiBzdWJzY3JpYmVzIHdpdGgganVzdCBpdHMgdG9rZW4gYW5kIHRoZSBzZXJ2ZXIgZGVjaWRlcyBtZW1iZXJzaGlwLlxuICAgKiBJZGVtcG90ZW50IGFuZCBzaW5nbGUtZmxpZ2h0ZWQgbGlrZSB7QGxpbmsgU3luY0NsaWVudCNzdWJzY3JpYmVSZWFsdGltZX0uXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fVxuICAgKi9cbiAgYXN5bmMgc3Vic2NyaWJlVXNlclNjb3BlKCkge1xuICAgIGlmICh0aGlzLl91c2VyU2NvcGVTdGF0ZSA9PT0gXCJzdWJzY3JpYmVkXCIpIHJldHVyblxuXG4gICAgaWYgKCF0aGlzLl9zdWJzY3JpYmVVc2VyU2NvcGVQcm9taXNlKSB7XG4gICAgICB0aGlzLl9zdWJzY3JpYmVVc2VyU2NvcGVQcm9taXNlID0gdGhpcy5fc3Vic2NyaWJlVXNlclNjb3BlKCkuZmluYWxseSgoKSA9PiB7XG4gICAgICAgIHRoaXMuX3N1YnNjcmliZVVzZXJTY29wZVByb21pc2UgPSBudWxsXG4gICAgICB9KVxuICAgIH1cblxuICAgIGF3YWl0IHRoaXMuX3N1YnNjcmliZVVzZXJTY29wZVByb21pc2VcbiAgfVxuXG4gIC8qKlxuICAgKiBEZWNsYXJlcyBhbmQgYWN0aXZhdGVzIHRoZSB1c2VyIHNjb3BlIGZvciBldmVyeSBwdWxsYWJsZSByZXNvdXJjZSwgdGhlblxuICAgKiBzdWJzY3JpYmVzIHJlYWx0aW1lIGFuZCBwdWxscy5cbiAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59XG4gICAqL1xuICBhc3luYyBfc3Vic2NyaWJlVXNlclNjb3BlKCkge1xuICAgIHRoaXMuX3VzZXJTY29wZVN0YXRlID0gXCJzdWJzY3JpYmluZ1wiXG5cbiAgICBhd2FpdCB0aGlzLnNjb3BlU3RvcmUoKS5maW5kT3JDcmVhdGVTY29wZShhd2FpdCB0aGlzLnVzZXJTY29wZSgpKVxuXG4gICAgYXdhaXQgdGhpcy5zdWJzY3JpYmVSZWFsdGltZSgpXG4gICAgYXdhaXQgdGhpcy5wdWxsKClcblxuICAgIHRoaXMuX3VzZXJTY29wZVN0YXRlID0gXCJzdWJzY3JpYmVkXCJcbiAgfVxuXG4gIC8qKlxuICAgKiBVbnN1YnNjcmliZXMgdGhlIHVzZXIgc2NvcGU6IGRlYWN0aXZhdGVzIHRoZSBwZXItcmVzb3VyY2UgdXNlciBzY29wZXMgYW5kXG4gICAqIGNsb3NlcyB0aGUgcmVhbHRpbWUgY2hhbm5lbCBzdWJzY3JpcHRpb25zLiBUaGUgc2hhcmVkIHdlYnNvY2tldCBjb25uZWN0aW9uXG4gICAqIHN0YXlzIG9wZW4gd2hlbiBvbmUgaXMgY29uZmlndXJlZCAoc2lnbi1vdXQgZHJvcHMgc3Vic2NyaXB0aW9ucyB3aXRob3V0XG4gICAqIGRpc2Nvbm5lY3RpbmcpLCBzbyBhIHN1YnNlcXVlbnQgc2lnbi1pbiByZXN1YnNjcmliZXMgb3ZlciB0aGUgc2FtZSBzb2NrZXQuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fVxuICAgKi9cbiAgYXN5bmMgdW5zdWJzY3JpYmVVc2VyU2NvcGUoKSB7XG4gICAgYXdhaXQgdGhpcy5zY29wZVN0b3JlKCkuZGVhY3RpdmF0ZShhd2FpdCB0aGlzLnVzZXJTY29wZSgpKVxuXG4gICAgYXdhaXQgdGhpcy51bnN1YnNjcmliZVJlYWx0aW1lKClcblxuICAgIHRoaXMuX3VzZXJTY29wZVN0YXRlID0gXCJ1bnN1YnNjcmliZWRcIlxuICAgIHRoaXMuX3N1YnNjcmliZVVzZXJTY29wZVByb21pc2UgPSBudWxsXG4gIH1cblxuICAvKipcbiAgICogVGhlIHVzZXIgc2NvcGU6IGEgc2luZ2xlIGFsbC10eXBlcyBzY29wZSAobnVsbCByZXNvdXJjZVR5cGUpIHdpdGggZW1wdHlcbiAgICogY29uZGl0aW9ucywgcGFydGl0aW9uZWQgbG9jYWxseSBieSBvd25lci4gT25lIHNjb3BlIC0gbm90IG9uZSBwZXIgcmVzb3VyY2VcbiAgICogdHlwZSAtIHNvIHRoZSBzZXJ2ZXIgYXV0aG9yaXplcyB0aGUgY2FsbGVyIG9uY2UgcGVyIHN5bmMgYW5kIHBlciBzdWJzY3JpYmUsXG4gICAqIGhvd2V2ZXIgbWFueSByZXNvdXJjZSB0eXBlcyBpdCBzZXJ2ZXMuIFRoZSBzZXJ2ZXIgZGVjaWRlcyB3aGljaCB0eXBlcyB0aGVcbiAgICogY2FsbGVyIG1heSBzZWU7IHRoZSBjbGllbnQgYXBwbGllcyBlYWNoIHB1bGxlZCByb3cgYnkgdGhlIHJlc291cmNlIHR5cGUgb25cbiAgICogaXRzIG93biBlbnZlbG9wZS5cbiAgICogQHJldHVybnMge1Byb21pc2U8aW1wb3J0KFwiLi9zeW5jLWNsaWVudC10eXBlcy5qc1wiKS5TZXJpYWxpemVkU3luY1Njb3BlPn0gVGhlIHVzZXIgc2NvcGUuXG4gICAqL1xuICBhc3luYyB1c2VyU2NvcGUoKSB7XG4gICAgcmV0dXJuIHtjb25kaXRpb25zOiB7fSwgb3duZXI6IGF3YWl0IHRoaXMudXNlclNjb3BlT3duZXIoKSwgcmVzb3VyY2VUeXBlOiBudWxsfVxuICB9XG5cbiAgLyoqXG4gICAqIFRoZSByZXNvdXJjZSB0eXBlcyB0aGUgdXNlciBzY29wZSBjb3ZlcnM6IGV2ZXJ5IGRlY2xhcmVkIHJlc291cmNlIHRoYXRcbiAgICogcmVjZWl2ZXMgcHVsbGVkIGNoYW5nZXMgKGhhcyBwdWxsIGBhdHRyaWJ1dGVzYCksIHNvIHRoZSBjbGllbnQgY2FuIGFwcGx5XG4gICAqIHRoZW0uIFNlbnQgd2l0aCB0aGUgc2NvcGUgYXMgYSBkZWxpdmVyeS90eXBlIGZpbHRlciAtIGl0IG5hcnJvd3MsIG5ldmVyXG4gICAqIHdpZGVucywgd2hhdCB0aGUgc2VydmVyJ3MgYXV0aG9yaXphdGlvbiBhbHJlYWR5IGFsbG93cywgYW5kIGl0IGtlZXBzIGFcbiAgICogYnJvYWRjYXN0IG9mIGEgdHlwZSB0aGlzIGNsaWVudCBjYW5ub3QgYXBwbHkgZnJvbSByZWFjaGluZyB0aGUgc2VydmVyJ3NcbiAgICogcGVyLWRlbGl2ZXJ5IGFjY2VzcyByZS1jaGVjayAoYSBkYXRhYmFzZSBxdWVyeSBwZXIgbWF0Y2hlZCBicm9hZGNhc3QsIHBlclxuICAgKiBzdWJzY3JpYmVkIGRldmljZSkuXG4gICAqIEByZXR1cm5zIHtzdHJpbmdbXX0gUHVsbGFibGUgcmVzb3VyY2UgdHlwZSBuYW1lcy5cbiAgICovXG4gIHVzZXJTY29wZVJlc291cmNlVHlwZXMoKSB7XG4gICAgcmV0dXJuIE9iamVjdC5rZXlzKHRoaXMucHVsbFJlc291cmNlQ29uZmlncygpKVxuICB9XG5cbiAgLyoqXG4gICAqIFJlc29sdmVzIHRoZSBsb2NhbCBwYXJ0aXRpb24ga2V5IGZvciB0aGUgdXNlciBzY29wZTogdGhlIGN1cnJlbnRseVxuICAgKiBjb25maWd1cmVkIGF1dGhlbnRpY2F0ZWQgaWRlbnRpdHkgKHRoZSBzeW5jIGF1dGggdG9rZW4pLiBQYXJ0aXRpb25pbmcgdGhlXG4gICAqIHVzZXIgc2NvcGUncyBsb2NhbCBzY29wZS9jdXJzb3Igcm93cyBieSB0aGlzIG93bmVyIGtlZXBzIHRoZVxuICAgKiBlbXB0eS1jb25kaXRpb25zIGN1cnNvciBmcm9tIGxlYWtpbmcgYWNyb3NzIGFjY291bnRzIG9uIGEgc2hhcmVkIGRldmljZVxuICAgKiAoYWNjb3VudCBCIHNpZ25pbmcgaW4gYWZ0ZXIgYWNjb3VudCBBIGdldHMgYSBmcmVzaCBjdXJzb3IpIHdoaWxlIHRoZSBzYW1lXG4gICAqIGFjY291bnQgcmVjb25uZWN0aW5nIGtlZXBzIGl0cyBjdXJzb3IgY29udGludWl0eS4gVGhlIG93bmVyIGlzIGEgbG9jYWxcbiAgICogcGFydGl0aW9uIGtleSBvbmx5IOKAlCBwdWxscyBzdGlsbCBwb3N0IGVtcHR5IGNvbmRpdGlvbnMgdG8gdGhlIHNlcnZlci5cbiAgICogQHJldHVybnMge1Byb21pc2U8c3RyaW5nPn0gVXNlci1zY29wZSBvd25lciBwYXJ0aXRpb24ga2V5LlxuICAgKi9cbiAgYXN5bmMgdXNlclNjb3BlT3duZXIoKSB7XG4gICAgcmV0dXJuIFN0cmluZyhhd2FpdCB0aGlzLmNvbmZpZy5hdXRoZW50aWNhdGlvblRva2VuKCkpXG4gIH1cblxuICAvKipcbiAgICogVW5zdWJzY3JpYmVzIHRoZSByZWFsdGltZSBjaGFubmVscyBhbmQgZGlzY29ubmVjdHMgdGhlIHdlYnNvY2tldCBjbGllbnQgKGlkZW1wb3RlbnQpLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn1cbiAgICovXG4gIGFzeW5jIHVuc3Vic2NyaWJlUmVhbHRpbWUoKSB7XG4gICAgYXdhaXQgdGhpcy5yZWFsdGltZUJyaWRnZSgpLnVuc3Vic2NyaWJlKClcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXBvcnRzIHRoZSByZWFsdGltZSBzdWJzY3JpcHRpb24gc3RhdGUgYW5kIHBlci1jaGFubmVsIHJlYWRpbmVzcy5cbiAgICogQHJldHVybnMge1JldHVyblR5cGU8U3luY1JlYWx0aW1lQnJpZGdlW1wic3RhdHVzXCJdPn0gUmVhbHRpbWUgc3RhdHVzLlxuICAgKi9cbiAgcmVhbHRpbWVTdGF0dXMoKSB7XG4gICAgcmV0dXJuIHRoaXMucmVhbHRpbWVCcmlkZ2UoKS5zdGF0dXMoKVxuICB9XG5cbiAgLyoqXG4gICAqIEF3YWl0cyBhbGwgcGVuZGluZyByZWFsdGltZSBtZXNzYWdlIGFwcGxpZXMgYW5kIGFueSBzY2hlZHVsZWRcbiAgICogcHVsbC1vbi1yZWNvbm5lY3QgKHVzZWZ1bCBpbiB0ZXN0cyBhbmQgc2h1dGRvd24gZmxvd3MpLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn1cbiAgICovXG4gIGFzeW5jIHdhaXRGb3JSZWFsdGltZUFwcGxpZWQoKSB7XG4gICAgYXdhaXQgdGhpcy5yZWFsdGltZUJyaWRnZSgpLndhaXRGb3JBcHBsaWVkKClcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBsYXppbHkgYnVpbHQgcmVhbHRpbWUgYnJpZGdlLlxuICAgKiBAcmV0dXJucyB7U3luY1JlYWx0aW1lQnJpZGdlfSBSZWFsdGltZSBicmlkZ2UuXG4gICAqL1xuICByZWFsdGltZUJyaWRnZSgpIHtcbiAgICB0aGlzLl9yZWFsdGltZUJyaWRnZSB8fD0gbmV3IFN5bmNSZWFsdGltZUJyaWRnZSh7c3luY0NsaWVudDogdGhpc30pXG5cbiAgICByZXR1cm4gdGhpcy5fcmVhbHRpbWVCcmlkZ2VcbiAgfVxuXG4gIC8qKlxuICAgKiBRdWV1ZXMgYSBsb2NhbCBtb2RlbCBjaGFuZ2UgYXMgYSBwZW5kaW5nIHN5bmMgcm93IGFuZCBzY2hlZHVsZXMgYW4gaW1tZWRpYXRlXG4gICAqIHJlcGxheSBhdHRlbXB0IChrZXB0IHBlbmRpbmcgd2hpbGUgb2ZmbGluZSBvciB3aGVuIHRoZSBiYWNrZW5kIHJlamVjdHMgaXQpLlxuICAgKiBAcGFyYW0ge3tyZXNvdXJjZTogPywgZGF0YT86IFJlY29yZDxzdHJpbmcsID8+LCBzeW5jVHlwZT86IHN0cmluZ319IGFyZ3MgLSBRdWV1ZSBhcmdzLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTw/Pn0gUGVuZGluZyBsb2NhbCBzeW5jIHJvdy5cbiAgICovXG4gIGFzeW5jIHF1ZXVlKHtkYXRhLCByZXNvdXJjZSwgc3luY1R5cGV9KSB7XG4gICAgY29uc3QgcmVzb3VyY2VDb25maWcgPSB0aGlzLnJlc291cmNlQ29uZmlnRm9yKHJlc291cmNlKVxuICAgIGNvbnN0IHN5bmNSb3cgPSBhd2FpdCBTeW5jQXBpQ2xpZW50LnF1ZXVlTG9jYWxTeW5jKHtcbiAgICAgIGJvb2xlYW5BdHRyaWJ1dGVzOiByZXNvdXJjZUNvbmZpZy5ib29sZWFuQXR0cmlidXRlcyB8fCBbXSxcbiAgICAgIGRhdGEsXG4gICAgICBsb2NhbE9ubHlBdHRyaWJ1dGVzOiByZXNvdXJjZUNvbmZpZy5sb2NhbE9ubHlBdHRyaWJ1dGVzIHx8IFtdLFxuICAgICAgcmVzb3VyY2UsXG4gICAgICBzeW5jTW9kZWw6IHRoaXMuY29uZmlnLnN5bmNNb2RlbCxcbiAgICAgIHN5bmNUeXBlOiBzeW5jVHlwZSA/PyB0aGlzLmRlZmF1bHRTeW5jVHlwZSh7b3BlcmF0aW9uOiBcInVwZGF0ZVwiLCByZWNvcmQ6IHJlc291cmNlLCByZXNvdXJjZUNvbmZpZ30pXG4gICAgfSlcblxuICAgIHRoaXMuc2NoZWR1bGVSZXBsYXkoKVxuXG4gICAgcmV0dXJuIHN5bmNSb3dcbiAgfVxuXG4gIC8qKlxuICAgKiBEcmFpbnMgcGVuZGluZyBsb2NhbCBzeW5jIHJvd3MgdG8gdGhlIGJhY2tlbmQgKHNpbmdsZS1mbGlnaHRlZCwgb25saW5lLWdhdGVkKS5cbiAgICogUm93cyBhcmUgb25seSBtYXJrZWQgc3VjY2Vzc2Z1bCBhZnRlciB0aGUgYmFja2VuZCBhY2tub3dsZWRnZXMgdGhlbS5cbiAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59XG4gICAqL1xuICBhc3luYyByZXBsYXlQZW5kaW5nKCkge1xuICAgIGlmICghKGF3YWl0IHRoaXMuaXNPbmxpbmUoKSkpIHJldHVyblxuXG4gICAgYXdhaXQgU3luY0FwaUNsaWVudC5zaW5nbGVGbGlnaHQoYHZlbG9jaW91cy1zeW5jLWNsaWVudC1yZXBsYXktJHt0aGlzLl9jbGllbnROdW1iZXJ9YCwgYXN5bmMgKCkgPT4ge1xuICAgICAgYXdhaXQgU3luY0FwaUNsaWVudC5yZXBsYXlMb2NhbFN5bmNzKHtcbiAgICAgICAgYXV0aGVudGljYXRpb25Ub2tlbjogYXdhaXQgdGhpcy5jb25maWcuYXV0aGVudGljYXRpb25Ub2tlbigpLFxuICAgICAgICBiYXRjaFNpemU6IHRoaXMuY29uZmlnLmJhdGNoU2l6ZSxcbiAgICAgICAgcG9zdFJlcGxheTogdGhpcy5jb25maWcucG9zdFJlcGxheSxcbiAgICAgICAgc3luY01vZGVsOiB0aGlzLmNvbmZpZy5zeW5jTW9kZWxcbiAgICAgIH0pXG4gICAgfSlcbiAgfVxuXG4gIC8qKlxuICAgKiBTY2hlZHVsZXMgYSBiYWNrZ3JvdW5kIHJlcGxheSBhdHRlbXB0IHdpdGhvdXQgYmxvY2tpbmcgdGhlIGNhbGxlci5cbiAgICogRmFpbHVyZXMgZ28gdG8gY29uZmlnLm9uRXJyb3IgKG9yIHJldGhyb3cgd2hlbiBub25lIGlzIGNvbmZpZ3VyZWQpLlxuICAgKiBAcmV0dXJucyB7dm9pZH1cbiAgICovXG4gIHNjaGVkdWxlUmVwbGF5KCkge1xuICAgIHRoaXMuX3NjaGVkdWxlZFJlcGxheSA9IChhc3luYyAoKSA9PiB7XG4gICAgICB0cnkge1xuICAgICAgICBhd2FpdCB0aGlzLnJlcGxheVBlbmRpbmcoKVxuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgdGhpcy5yZXBvcnRFcnJvcigvKiogQHR5cGUge0Vycm9yfSAqLyAoZXJyb3IpKVxuICAgICAgfVxuICAgIH0pKClcbiAgfVxuXG4gIC8qKlxuICAgKiBBd2FpdHMgdGhlIGxhc3Qgc2NoZWR1bGVkIGJhY2tncm91bmQgcmVwbGF5ICh1c2VmdWwgaW4gdGVzdHMgYW5kIHNodXRkb3duIGZsb3dzKS5cbiAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59XG4gICAqL1xuICBhc3luYyB3YWl0Rm9yU2NoZWR1bGVkUmVwbGF5KCkge1xuICAgIGlmICh0aGlzLl9zY2hlZHVsZWRSZXBsYXkpIGF3YWl0IHRoaXMuX3NjaGVkdWxlZFJlcGxheVxuICB9XG5cbiAgLyoqXG4gICAqIFJlcG9ydHMgYSBiYWNrZ3JvdW5kIHN5bmMgZmFpbHVyZS5cbiAgICogQHBhcmFtIHtFcnJvcn0gZXJyb3IgLSBCYWNrZ3JvdW5kIGZhaWx1cmUuXG4gICAqIEByZXR1cm5zIHt2b2lkfVxuICAgKi9cbiAgcmVwb3J0RXJyb3IoZXJyb3IpIHtcbiAgICBpZiAodGhpcy5jb25maWcub25FcnJvcikge1xuICAgICAgdGhpcy5jb25maWcub25FcnJvcihlcnJvcilcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIHRocm93IGVycm9yXG4gIH1cblxuICAvKipcbiAgICogUmVzb2x2ZXMgY29ubmVjdGl2aXR5IHRocm91Z2ggdGhlIGNvbmZpZ3VyZWQgZ2F0ZS5cbiAgICogQHJldHVybnMge1Byb21pc2U8Ym9vbGVhbj59IFdoZXRoZXIgdGhlIGJhY2tlbmQgaXMgY29uc2lkZXJlZCByZWFjaGFibGUuXG4gICAqL1xuICBhc3luYyBpc09ubGluZSgpIHtcbiAgICBpZiAoIXRoaXMuY29uZmlnLmlzT25saW5lKSByZXR1cm4gdHJ1ZVxuXG4gICAgcmV0dXJuIChhd2FpdCB0aGlzLmNvbmZpZy5pc09ubGluZSgpKSAhPT0gZmFsc2VcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBzY29wZSBzdG9yZSBiYWNraW5nIGRlY2xhcmVkIHNjb3BlcyBhbmQgY3Vyc29ycy5cbiAgICogQHJldHVybnMge2ltcG9ydChcIi4vc3luYy1zY29wZS1zdG9yZS5qc1wiKS5kZWZhdWx0fSBTY29wZSBzdG9yZS5cbiAgICovXG4gIHNjb3BlU3RvcmUoKSB7XG4gICAgdGhpcy5fc2NvcGVTdG9yZSB8fD0gbmV3IFN5bmNTY29wZVN0b3JlKHtjb25maWd1cmF0aW9uOiB0aGlzLmNvbmZpZy5jb25maWd1cmF0aW9ufSlcblxuICAgIHJldHVybiB0aGlzLl9zY29wZVN0b3JlXG4gIH1cblxuICAvKipcbiAgICogUmVzb2x2ZXMgdGhlIGRlY2xhcmVkIHJlc291cmNlIGNvbmZpZyBmb3IgYSBsb2NhbCByZWNvcmQuXG4gICAqIEBwYXJhbSB7P30gcmVzb3VyY2UgLSBMb2NhbCBtb2RlbCByZWNvcmQuXG4gICAqIEByZXR1cm5zIHtpbXBvcnQoXCIuL3N5bmMtY2xpZW50LXR5cGVzLmpzXCIpLlN5bmNDbGllbnRSZXNvdXJjZUNvbmZpZ30gRGVjbGFyZWQgcmVzb3VyY2UgY29uZmlnLlxuICAgKi9cbiAgcmVzb3VyY2VDb25maWdGb3IocmVzb3VyY2UpIHtcbiAgICBjb25zdCBtb2RlbENsYXNzID0gcmVzb3VyY2U/LmNvbnN0cnVjdG9yXG5cbiAgICBpZiAodHlwZW9mIG1vZGVsQ2xhc3M/LmdldE1vZGVsTmFtZSAhPT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYFN5bmMgcmVzb3VyY2VzIG11c3QgYmUgbW9kZWwgcmVjb3JkcyB3aXRoIGEgc3RhdGljIGdldE1vZGVsTmFtZSgpLCBnb3Q6ICR7U3RyaW5nKHJlc291cmNlKX1gKVxuICAgIH1cblxuICAgIGNvbnN0IHJlc291cmNlVHlwZSA9IG1vZGVsQ2xhc3MuZ2V0TW9kZWxOYW1lKClcbiAgICBjb25zdCByZXNvdXJjZUNvbmZpZyA9IHRoaXMuY29uZmlnLnJlc291cmNlc1tyZXNvdXJjZVR5cGVdXG5cbiAgICBpZiAoIXJlc291cmNlQ29uZmlnKSB0aHJvdyBuZXcgRXJyb3IoYE5vIHN5bmMgcmVzb3VyY2UgY29uZmlndXJlZCBmb3I6ICR7cmVzb3VyY2VUeXBlfWApXG5cbiAgICByZXR1cm4gcmVzb3VyY2VDb25maWdcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXNvbHZlcyB0aGUgc3luYyB0eXBlIGZvciBhIG11dGF0aW9uIHRocm91Z2ggdGhlIHJlc291cmNlIGNvbmZpZy4gVGhlXG4gICAqIFwidXBzZXJ0XCIgZmxhZyBxdWV1ZXMgY3JlYXRlcyBhbmQgdXBkYXRlcyBhcyBcInVwZGF0ZVwiIHJvd3MgKHRoZSBzZXJ2ZXJcbiAgICogdXBzZXJ0cyBieSByZXNvdXJjZSBpZCkgYW5kIGRlc3Ryb3lzIGFzIFwiZGVsZXRlXCIgcm93cy5cbiAgICogQHBhcmFtIHt7b3BlcmF0aW9uOiBcImNyZWF0ZVwiIHwgXCJ1cGRhdGVcIiB8IFwiZGVzdHJveVwiLCByZWNvcmQ6ID8sIHJlc291cmNlQ29uZmlnOiBpbXBvcnQoXCIuL3N5bmMtY2xpZW50LXR5cGVzLmpzXCIpLlN5bmNDbGllbnRSZXNvdXJjZUNvbmZpZ319IGFyZ3MgLSBNdXRhdGlvbiBhcmdzLlxuICAgKiBAcmV0dXJucyB7c3RyaW5nfSBTeW5jIHR5cGUuXG4gICAqL1xuICBkZWZhdWx0U3luY1R5cGUoe29wZXJhdGlvbiwgcmVjb3JkLCByZXNvdXJjZUNvbmZpZ30pIHtcbiAgICBpZiAodHlwZW9mIHJlc291cmNlQ29uZmlnLnN5bmNUeXBlID09PSBcImZ1bmN0aW9uXCIpIHJldHVybiByZXNvdXJjZUNvbmZpZy5zeW5jVHlwZSh7b3BlcmF0aW9uLCByZWNvcmR9KVxuICAgIGlmIChvcGVyYXRpb24gPT09IFwiZGVzdHJveVwiKSByZXR1cm4gXCJkZWxldGVcIlxuICAgIGlmIChyZXNvdXJjZUNvbmZpZy5zeW5jVHlwZSA9PT0gXCJ1cHNlcnRcIikgcmV0dXJuIFwidXBkYXRlXCJcblxuICAgIHJldHVybiBvcGVyYXRpb25cbiAgfVxuXG4gIC8qKlxuICAgKiBEZXJpdmVzIHRoZSBwdWxsLWFwcGx5IHJlc291cmNlIGNvbmZpZ3MgZnJvbSB0aGUgZGVjbGFyZWQgcmVzb3VyY2VzLlxuICAgKiBAcmV0dXJucyB7UmVjb3JkPHN0cmluZywgaW1wb3J0KFwiLi9zeW5jLWFwaS1jbGllbnQtdHlwZXMuanNcIikuU3luY1Jlc291cmNlQ29uZmlnPn0gUHVsbC1hcHBseSByZXNvdXJjZSBjb25maWdzLlxuICAgKi9cbiAgcHVsbFJlc291cmNlQ29uZmlncygpIHtcbiAgICB0aGlzLl9wdWxsUmVzb3VyY2VDb25maWdzIHx8PSAvKiogQHR5cGUge1JlY29yZDxzdHJpbmcsIGltcG9ydChcIi4vc3luYy1hcGktY2xpZW50LXR5cGVzLmpzXCIpLlN5bmNSZXNvdXJjZUNvbmZpZz59ICovIChPYmplY3QuZnJvbUVudHJpZXMoXG4gICAgICBPYmplY3QuZW50cmllcyh0aGlzLmNvbmZpZy5yZXNvdXJjZXMpXG4gICAgICAgIC5maWx0ZXIoKFssIHJlc291cmNlXSkgPT4gQm9vbGVhbihyZXNvdXJjZS5hdHRyaWJ1dGVzKSlcbiAgICAgICAgLm1hcCgoW3Jlc291cmNlVHlwZSwgcmVzb3VyY2VdKSA9PiBbcmVzb3VyY2VUeXBlLCB7XG4gICAgICAgICAgYWZ0ZXJBcHBseTogcmVzb3VyY2UuYWZ0ZXJBcHBseSxcbiAgICAgICAgICBhdHRyaWJ1dGVzOiAvKiogQHR5cGUge2ltcG9ydChcIi4vc3luYy1hcGktY2xpZW50LXR5cGVzLmpzXCIpLlN5bmNSZXNvdXJjZUNvbmZpZ1tcImF0dHJpYnV0ZXNcIl19ICovIChyZXNvdXJjZS5hdHRyaWJ1dGVzKSxcbiAgICAgICAgICBlbmFibGVkOiB0cnVlLFxuICAgICAgICAgIGZpbmRSZWNvcmQ6IHJlc291cmNlLmZpbmRSZWNvcmQsXG4gICAgICAgICAgZmluZFJlY29yZEZvckRlbGV0ZTogcmVzb3VyY2UuZmluZFJlY29yZEZvckRlbGV0ZSxcbiAgICAgICAgICBtb2RlbENsYXNzOiByZXNvdXJjZS5tb2RlbENsYXNzXG4gICAgICAgIH1dKVxuICAgICkpXG5cbiAgICByZXR1cm4gdGhpcy5fcHVsbFJlc291cmNlQ29uZmlnc1xuICB9XG59XG5cbi8qKlxuICogQnVpbGRzIG9uZSByZXNvdXJjZSBjb25maWcgZnJvbSBhIG1vZGVsJ3MgYHN0YXRpYyBzeW5jYCBkZWNsYXJhdGlvbiBwbHVzIGl0c1xuICogZGVyaXZlZCBjb2x1bW4gbWV0YWRhdGEuXG4gKiBAcGFyYW0ge3tkZWNsYXJhdGlvbjogaW1wb3J0KFwiLi9zeW5jLWNsaWVudC10eXBlcy5qc1wiKS5Nb2RlbFN5bmNEZWNsYXJhdGlvbiwgbW9kZWxDbGFzczogPywgcmVzb3VyY2VUeXBlOiBzdHJpbmd9fSBhcmdzIC0gRGVjbGFyYXRpb24gYXJncy5cbiAqIEByZXR1cm5zIHtpbXBvcnQoXCIuL3N5bmMtY2xpZW50LXR5cGVzLmpzXCIpLlN5bmNDbGllbnRSZXNvdXJjZUNvbmZpZ30gRGVyaXZlZCByZXNvdXJjZSBjb25maWcuXG4gKi9cbmZ1bmN0aW9uIHJlc291cmNlQ29uZmlnRnJvbVN5bmNEZWNsYXJhdGlvbih7ZGVjbGFyYXRpb24sIG1vZGVsQ2xhc3MsIHJlc291cmNlVHlwZX0pIHtcbiAgY29uc3Qgbm9ybWFsaXplZERlY2xhcmF0aW9uID0gZGVjbGFyYXRpb24gPT09IHRydWUgPyB7fSA6IGRlY2xhcmF0aW9uXG5cbiAgaWYgKCFub3JtYWxpemVkRGVjbGFyYXRpb24gfHwgdHlwZW9mIG5vcm1hbGl6ZWREZWNsYXJhdGlvbiAhPT0gXCJvYmplY3RcIiB8fCBBcnJheS5pc0FycmF5KG5vcm1hbGl6ZWREZWNsYXJhdGlvbikpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYCR7cmVzb3VyY2VUeXBlfSBzdGF0aWMgc3luYyBtdXN0IGJlIHRydWUgb3IgYSBzeW5jIGRlY2xhcmF0aW9uIG9iamVjdCwgZ290OiAke1N0cmluZyhkZWNsYXJhdGlvbil9YClcbiAgfVxuXG4gIGNvbnN0IHthZnRlckFwcGx5LCBhdHRyaWJ1dGVzLCBib29sZWFuQXR0cmlidXRlcywgZmluZFJlY29yZCwgZmluZFJlY29yZEZvckRlbGV0ZSwgbG9jYWxPbmx5QXR0cmlidXRlcywgcHVibGlzaCwgcmVhbHRpbWUsIHN5bmNUeXBlLCB0cmFjaywgdHJhY2tlZERhdGEsIC4uLnJlc3REZWNsYXJhdGlvbn0gPSBub3JtYWxpemVkRGVjbGFyYXRpb25cbiAgY29uc3QgdW5rbm93bktleXMgPSBPYmplY3Qua2V5cyhyZXN0RGVjbGFyYXRpb24pXG5cbiAgLy8gYHB1Ymxpc2hgIGlzIHRoZSBzZXJ2ZXItc2lkZSBoYWxmIG9mIHRoZSBzaGFyZWQgYHN0YXRpYyBzeW5jYCBkZWNsYXJhdGlvblxuICAvLyAoY29uc3VtZWQgYnkgU3luY1B1Ymxpc2hlciBvbiB0aGUgYmFja2VuZCkgLSB0aGUgY2xpZW50IGRlcml2ZXMgbm90aGluZ1xuICAvLyBmcm9tIGl0LCBidXQgbW9kZWxzIGRlY2xhcmVkIG9uY2UgZm9yIGJvdGggc2lkZXMgbXVzdCBzdGF5IHZhbGlkIGhlcmUuXG4gIHZvaWQgcHVibGlzaFxuXG4gIGlmICh1bmtub3duS2V5cy5sZW5ndGggPiAwKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGAke3Jlc291cmNlVHlwZX0gc3RhdGljIHN5bmMgcmVjZWl2ZWQgdW5rbm93biBrZXlzOiAke3Vua25vd25LZXlzLmpvaW4oXCIsIFwiKX0gKHN1cHBvcnRlZDogYWZ0ZXJBcHBseSwgYXR0cmlidXRlcywgYm9vbGVhbkF0dHJpYnV0ZXMsIGZpbmRSZWNvcmQsIGZpbmRSZWNvcmRGb3JEZWxldGUsIGxvY2FsT25seUF0dHJpYnV0ZXMsIHB1Ymxpc2gsIHJlYWx0aW1lLCBzeW5jVHlwZSwgdHJhY2ssIHRyYWNrZWREYXRhKWApXG4gIH1cbiAgaWYgKHN5bmNUeXBlICE9PSB1bmRlZmluZWQgJiYgdHlwZW9mIHN5bmNUeXBlICE9PSBcImZ1bmN0aW9uXCIgJiYgc3luY1R5cGUgIT09IFwidXBzZXJ0XCIpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYCR7cmVzb3VyY2VUeXBlfSBzdGF0aWMgc3luYyBzeW5jVHlwZSBtdXN0IGJlIGEgZnVuY3Rpb24gb3IgdGhlIHN0cmluZyBcInVwc2VydFwiLCBnb3Q6ICR7U3RyaW5nKHN5bmNUeXBlKX1gKVxuICB9XG5cbiAgY29uc3QgZGVyaXZlZCA9IGRlcml2ZWRTeW5jQXR0cmlidXRlcyh7bW9kZWxDbGFzcywgcmVzb3VyY2VUeXBlfSlcblxuICByZXR1cm4ge1xuICAgIGFmdGVyQXBwbHksXG4gICAgYXR0cmlidXRlcyxcbiAgICBib29sZWFuQXR0cmlidXRlczogbWVyZ2VkQXR0cmlidXRlTmFtZXMoZGVyaXZlZC5ib29sZWFuQXR0cmlidXRlcywgYm9vbGVhbkF0dHJpYnV0ZXMpLFxuICAgIGZpbmRSZWNvcmQsXG4gICAgZmluZFJlY29yZEZvckRlbGV0ZSxcbiAgICBsb2NhbE9ubHlBdHRyaWJ1dGVzOiBtZXJnZWRBdHRyaWJ1dGVOYW1lcyhkZXJpdmVkLmxvY2FsT25seUF0dHJpYnV0ZXMsIGxvY2FsT25seUF0dHJpYnV0ZXMpLFxuICAgIG1vZGVsQ2xhc3MsXG4gICAgcmVhbHRpbWUsXG4gICAgc3luY1R5cGUsXG4gICAgdHJhY2s6IG5vcm1hbGl6ZWRUcmFjayh0cmFjayksXG4gICAgdHJhY2tlZERhdGFcbiAgfVxufVxuXG4vKipcbiAqIERlcml2ZXMgYm9vbGVhbiBhbmQgbG9jYWwtb25seSBhdHRyaWJ1dGUgbmFtZXMgZnJvbSBhIG1vZGVsJ3MgY29sdW1uIG1ldGFkYXRhOlxuICogYm9vbGVhbnMgZnJvbSBib29sZWFuIGNvbHVtbiB0eXBlczsgbG9jYWwtb25seSBmcm9tIHRoZSBwcmltYXJ5IGtleSxcbiAqIGNyZWF0ZWRBdC91cGRhdGVkQXQsIGFuZCBzeW5jIGJvb2trZWVwaW5nIGNvbHVtbnMuXG4gKiBAcGFyYW0ge3ttb2RlbENsYXNzOiA/LCByZXNvdXJjZVR5cGU6IHN0cmluZ319IGFyZ3MgLSBEZXJpdmF0aW9uIGFyZ3MuXG4gKiBAcmV0dXJucyB7e2Jvb2xlYW5BdHRyaWJ1dGVzOiBzdHJpbmdbXSwgbG9jYWxPbmx5QXR0cmlidXRlczogc3RyaW5nW119fSBEZXJpdmVkIGF0dHJpYnV0ZSBuYW1lcy5cbiAqL1xuZnVuY3Rpb24gZGVyaXZlZFN5bmNBdHRyaWJ1dGVzKHttb2RlbENsYXNzLCByZXNvdXJjZVR5cGV9KSB7XG4gIGlmIChcbiAgICB0eXBlb2YgbW9kZWxDbGFzcy5nZXRDb2x1bW5OYW1lcyAhPT0gXCJmdW5jdGlvblwiIHx8XG4gICAgdHlwZW9mIG1vZGVsQ2xhc3MuZ2V0Q29sdW1uTmFtZVRvQXR0cmlidXRlTmFtZU1hcCAhPT0gXCJmdW5jdGlvblwiIHx8XG4gICAgdHlwZW9mIG1vZGVsQ2xhc3MuZ2V0Q29sdW1uVHlwZUJ5TmFtZSAhPT0gXCJmdW5jdGlvblwiIHx8XG4gICAgdHlwZW9mIG1vZGVsQ2xhc3MucHJpbWFyeUtleSAhPT0gXCJmdW5jdGlvblwiIHx8XG4gICAgdHlwZW9mIG1vZGVsQ2xhc3MuaGFzUHJpbWFyeUtleSAhPT0gXCJmdW5jdGlvblwiXG4gICkge1xuICAgIHRocm93IG5ldyBFcnJvcihgJHtyZXNvdXJjZVR5cGV9IHN0YXRpYyBzeW5jIHJlcXVpcmVzIGEgVmVsb2Npb3VzIG1vZGVsIGNsYXNzIHdpdGggY29sdW1uIG1ldGFkYXRhIChnZXRDb2x1bW5OYW1lcywgZ2V0Q29sdW1uTmFtZVRvQXR0cmlidXRlTmFtZU1hcCwgZ2V0Q29sdW1uVHlwZUJ5TmFtZSwgcHJpbWFyeUtleSwgaGFzUHJpbWFyeUtleSlgKVxuICB9XG5cbiAgY29uc3QgY29sdW1uTmFtZVRvQXR0cmlidXRlTmFtZSA9IG1vZGVsQ2xhc3MuZ2V0Q29sdW1uTmFtZVRvQXR0cmlidXRlTmFtZU1hcCgpXG4gIC8qKiBAdHlwZSB7c3RyaW5nW119ICovXG4gIGNvbnN0IGJvb2xlYW5BdHRyaWJ1dGVzID0gW11cbiAgLyoqIEB0eXBlIHtzdHJpbmdbXX0gKi9cbiAgY29uc3QgbG9jYWxPbmx5QXR0cmlidXRlcyA9IFtdXG5cbiAgaWYgKG1vZGVsQ2xhc3MuaGFzUHJpbWFyeUtleSgpKSB7XG4gICAgY29uc3QgcHJpbWFyeUtleUNvbHVtbiA9IG1vZGVsQ2xhc3MucHJpbWFyeUtleSgpXG5cbiAgICBsb2NhbE9ubHlBdHRyaWJ1dGVzLnB1c2goY29sdW1uTmFtZVRvQXR0cmlidXRlTmFtZVtwcmltYXJ5S2V5Q29sdW1uXSB8fCBwcmltYXJ5S2V5Q29sdW1uKVxuICB9XG5cbiAgZm9yIChjb25zdCBjb2x1bW5OYW1lIG9mIG1vZGVsQ2xhc3MuZ2V0Q29sdW1uTmFtZXMoKSkge1xuICAgIGNvbnN0IGF0dHJpYnV0ZU5hbWUgPSBjb2x1bW5OYW1lVG9BdHRyaWJ1dGVOYW1lW2NvbHVtbk5hbWVdIHx8IGNvbHVtbk5hbWVcbiAgICBjb25zdCBjb2x1bW5UeXBlID0gbW9kZWxDbGFzcy5nZXRDb2x1bW5UeXBlQnlOYW1lKGNvbHVtbk5hbWUpXG5cbiAgICBpZiAoTE9DQUxfQk9PS0tFRVBJTkdfQVRUUklCVVRFX05BTUVTLmluY2x1ZGVzKGF0dHJpYnV0ZU5hbWUpICYmICFsb2NhbE9ubHlBdHRyaWJ1dGVzLmluY2x1ZGVzKGF0dHJpYnV0ZU5hbWUpKSB7XG4gICAgICBsb2NhbE9ubHlBdHRyaWJ1dGVzLnB1c2goYXR0cmlidXRlTmFtZSlcbiAgICB9XG4gICAgaWYgKGNvbHVtblR5cGUgJiYgaXNCb29sZWFuQ29sdW1uVHlwZShjb2x1bW5UeXBlKSkge1xuICAgICAgYm9vbGVhbkF0dHJpYnV0ZXMucHVzaChhdHRyaWJ1dGVOYW1lKVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiB7Ym9vbGVhbkF0dHJpYnV0ZXMsIGxvY2FsT25seUF0dHJpYnV0ZXN9XG59XG5cbi8qKlxuICogTWVyZ2VzIGRlcml2ZWQgYXR0cmlidXRlIG5hbWVzIHdpdGggZGVjbGFyZWQgZXh0cmFzIGludG8gYSBzb3J0ZWQsIGR1cGxpY2F0ZS1mcmVlIGxpc3QuXG4gKiBAcGFyYW0ge3N0cmluZ1tdfSBkZXJpdmVkIC0gRGVyaXZlZCBhdHRyaWJ1dGUgbmFtZXMuXG4gKiBAcGFyYW0ge3N0cmluZ1tdIHwgdW5kZWZpbmVkfSBkZWNsYXJlZCAtIERlY2xhcmVkIGV4dHJhIGF0dHJpYnV0ZSBuYW1lcy5cbiAqIEByZXR1cm5zIHtzdHJpbmdbXX0gTWVyZ2VkIGF0dHJpYnV0ZSBuYW1lcy5cbiAqL1xuZnVuY3Rpb24gbWVyZ2VkQXR0cmlidXRlTmFtZXMoZGVyaXZlZCwgZGVjbGFyZWQpIHtcbiAgcmV0dXJuIFsuLi5uZXcgU2V0KFsuLi5kZXJpdmVkLCAuLi4oZGVjbGFyZWQgfHwgW10pXSldLnNvcnQoKVxufVxuXG4vKipcbiAqIE5vcm1hbGl6ZXMgYSBkZWNsYXJhdGlvbidzIHRyYWNrIHZhbHVlOiBhbiBvcGVyYXRpb25zIGFycmF5IGlzIHNob3J0aGFuZCBmb3JcbiAqIHRoZSB7b3BlcmF0aW9uc30gZm9ybS5cbiAqIEBwYXJhbSB7aW1wb3J0KFwiLi9zeW5jLWNsaWVudC10eXBlcy5qc1wiKS5Nb2RlbFN5bmNEZWNsYXJhdGlvbkNvbmZpZ1tcInRyYWNrXCJdfSB0cmFjayAtIERlY2xhcmVkIHRyYWNrIHZhbHVlLlxuICogQHJldHVybnMge2ltcG9ydChcIi4vc3luYy1jbGllbnQtdHlwZXMuanNcIikuU3luY0NsaWVudFJlc291cmNlQ29uZmlnW1widHJhY2tcIl19IE5vcm1hbGl6ZWQgdHJhY2sgdmFsdWUuXG4gKi9cbmZ1bmN0aW9uIG5vcm1hbGl6ZWRUcmFjayh0cmFjaykge1xuICBpZiAoQXJyYXkuaXNBcnJheSh0cmFjaykpIHJldHVybiB7b3BlcmF0aW9uczogdHJhY2t9XG5cbiAgcmV0dXJuIHRyYWNrXG59XG5cbi8qKlxuICogQnVpbGRzIGEgZnJhbWV3b3JrLW93bmVkIHN5bmMgZW5kcG9pbnQgUE9TVGVyIG92ZXIgdGhlIGNvbmZpZ3VyZWQgdHJhbnNwb3J0LlxuICogQHBhcmFtIHt7cGF0aDogc3RyaW5nLCB0cmFuc3BvcnQ6IGltcG9ydChcIi4uL2NvbmZpZ3VyYXRpb24tdHlwZXMuanNcIikuVmVsb2Npb3VzU3luY0NsaWVudFRyYW5zcG9ydH19IGFyZ3MgLSBQb3N0ZXIgYXJncy5cbiAqIEByZXR1cm5zIHsocGF5bG9hZDogUmVjb3JkPHN0cmluZywgPz4pID0+IFByb21pc2U8Pz59IFN5bmMgZW5kcG9pbnQgUE9TVGVyLlxuICovXG5mdW5jdGlvbiB0cmFuc3BvcnRQb3N0ZXIoe3BhdGgsIHRyYW5zcG9ydH0pIHtcbiAgcmV0dXJuIGFzeW5jIChwYXlsb2FkKSA9PiB7XG4gICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCB0cmFuc3BvcnQucG9zdChwYXRoLCBwYXlsb2FkKVxuXG4gICAgaWYgKCFyZXNwb25zZSB8fCB0eXBlb2YgcmVzcG9uc2UuanNvbiAhPT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYHN5bmMuY2xpZW50IHRyYW5zcG9ydC5wb3N0IG11c3QgcmVzb2x2ZSB0byBhIHJlc3BvbnNlIHdpdGggYSBqc29uKCkgbWV0aG9kIGZvciAke3BhdGh9IChsaWtlIHRoZSBmcm9udGVuZC1tb2RlbCB3ZWJzb2NrZXQgY2xpZW50KWApXG4gICAgfVxuXG4gICAgcmV0dXJuIGF3YWl0IHJlc3BvbnNlLmpzb24oKVxuICB9XG59XG5cbi8qKlxuICogTGF6aWx5IGJ1aWxkcyAoYW5kIG1lbW9pemVzIHBlciBjb25maWd1cmF0aW9uKSB0aGUgc3luYyBjbGllbnQgZGVyaXZlZCBmcm9tIHRoZVxuICogYXBwJ3MgVmVsb2Npb3VzIGNvbmZpZ3VyYXRpb24gYW5kIHJlZ2lzdGVycyBpdCBhcyB0aGUgY3VycmVudCBzeW5jIGNsaWVudC5cbiAqIEBwYXJhbSB7Q29uZmlndXJhdGlvbn0gW2NvbmZpZ3VyYXRpb25dIC0gQ29uZmlndXJhdGlvbiBvd25pbmcgdGhlIHJlZ2lzdGVyZWQgbW9kZWxzIGFuZCB0aGUgc3luYy5jbGllbnQgYmxvY2suIERlZmF1bHRzIHRvIHRoZSBjdXJyZW50IGNvbmZpZ3VyYXRpb24uXG4gKiBAcmV0dXJucyB7U3luY0NsaWVudH0gTWVtb2l6ZWQgc3luYyBjbGllbnQgZm9yIHRoZSBjb25maWd1cmF0aW9uLlxuICovXG5leHBvcnQgZnVuY3Rpb24gc3luY0NsaWVudChjb25maWd1cmF0aW9uID0gQ29uZmlndXJhdGlvbi5jdXJyZW50KCkpIHtcbiAgbGV0IGNsaWVudCA9IHN5bmNDbGllbnRzQnlDb25maWd1cmF0aW9uLmdldChjb25maWd1cmF0aW9uKVxuXG4gIGlmICghY2xpZW50KSB7XG4gICAgY2xpZW50ID0gU3luY0NsaWVudC5mcm9tQ29uZmlndXJhdGlvbihjb25maWd1cmF0aW9uKVxuICAgIHN5bmNDbGllbnRzQnlDb25maWd1cmF0aW9uLnNldChjb25maWd1cmF0aW9uLCBjbGllbnQpXG4gICAgY2xpZW50LnNldEN1cnJlbnQoKVxuICB9XG5cbiAgcmV0dXJuIGNsaWVudFxufVxuXG4vKipcbiAqIERlY2xhcmVzIGEgc3luYyBzY29wZSBvbiB0aGUgY3VycmVudCBzeW5jIGNsaWVudC5cbiAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vZGF0YWJhc2UvcXVlcnkvbW9kZWwtY2xhc3MtcXVlcnkuanNcIikuZGVmYXVsdDw/Pn0gcXVlcnkgLSBRdWVyeSBkZWNsYXJpbmcgdGhlIHN5bmMgc2NvcGUuXG4gKiBAcmV0dXJucyB7UHJvbWlzZTx7c2NvcGU6IGltcG9ydChcIi4vc3luYy1jbGllbnQtdHlwZXMuanNcIikuU2VyaWFsaXplZFN5bmNTY29wZSwgcHVsbGVkOiBpbXBvcnQoXCIuL3N5bmMtYXBpLWNsaWVudC10eXBlcy5qc1wiKS5TeW5jQ2hhbmdlc1Jlc3VsdCB8IG51bGx9Pn0gRGVjbGFyZWQgc2NvcGUgYW5kIHB1bGwgcmVzdWx0LlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gc3luYyhxdWVyeSkge1xuICByZXR1cm4gYXdhaXQgU3luY0NsaWVudC5jdXJyZW50KCkuc3luYyhxdWVyeSlcbn1cbiJdfQ==
847
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3luYy1jbGllbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvc3luYy9zeW5jLWNsaWVudC5qcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxZQUFZO0FBRVosT0FBTyxhQUFhLE1BQU0scUJBQXFCLENBQUE7QUFDL0MsT0FBTyxFQUFDLG1CQUFtQixFQUFDLE1BQU0sNkJBQTZCLENBQUE7QUFDL0QsT0FBTyxNQUFNLE1BQU0sY0FBYyxDQUFBO0FBQ2pDLE9BQU8sYUFBYSxNQUFNLDZCQUE2QixDQUFBO0FBQ3ZELE9BQU8sd0JBQXdCLE1BQU0sb0NBQW9DLENBQUE7QUFFekUsT0FBTyxFQUFDLHdCQUF3QixFQUFDLE1BQU0sa0JBQWtCLENBQUE7QUFDekQsT0FBTyxhQUFhLE1BQU0sc0JBQXNCLENBQUE7QUFDaEQsT0FBTyxrQkFBa0IsTUFBTSwyQkFBMkIsQ0FBQTtBQUMxRCxPQUFPLGNBQWMsTUFBTSx1QkFBdUIsQ0FBQTtBQUNsRCxPQUFPLEVBQUMsaUJBQWlCLEVBQUUsb0JBQW9CLEVBQUMsTUFBTSwyQkFBMkIsQ0FBQTtBQUVqRixJQUFJLGFBQWEsR0FBRyxDQUFDLENBQUE7QUFFckIsc0ZBQXNGO0FBQ3RGLE1BQU0sc0JBQXNCLEdBQUcsRUFBQyxNQUFNLEVBQUUsYUFBYSxFQUFFLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxFQUFFLGFBQWEsRUFBQyxDQUFBO0FBRXRHOzs7OztvREFLb0Q7QUFDcEQsTUFBTSwwQkFBMEIsR0FBRyxDQUFDLFFBQVEsRUFBRSxRQUFRLENBQUMsQ0FBQTtBQUV2RCxrR0FBa0c7QUFDbEcsTUFBTSxpQ0FBaUMsR0FBRyxDQUFDLFdBQVcsRUFBRSxXQUFXLEVBQUUsa0JBQWtCLENBQUMsQ0FBQTtBQUV4RixpREFBaUQ7QUFDakQsTUFBTSwwQkFBMEIsR0FBRyxJQUFJLE9BQU8sRUFBRSxDQUFBO0FBRWhEOzs7Ozs7Ozs7OztHQVdHO0FBQ0gsTUFBTSxDQUFDLE9BQU8sT0FBTyxV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VSxJQUFJLENBQUMsS0FBSztJQUM5QixPQUFPLE1BQU0sVUFBVSxDQUFDLE9BQU8sRUFBRSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQTtBQUMvQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQHRzLWNoZWNrXG5cbmltcG9ydCBDb25maWd1cmF0aW9uIGZyb20gXCIuLi9jb25maWd1cmF0aW9uLmpzXCJcbmltcG9ydCB7aXNCb29sZWFuQ29sdW1uVHlwZX0gZnJvbSBcIi4uL2RhdGFiYXNlL2NvbHVtbi10eXBlcy5qc1wiXG5pbXBvcnQgTG9nZ2VyIGZyb20gXCIuLi9sb2dnZXIuanNcIlxuaW1wb3J0IHJlc3RBcmdzRXJyb3IgZnJvbSBcIi4uL3V0aWxzL3Jlc3QtYXJncy1lcnJvci5qc1wiXG5pbXBvcnQgVmVsb2Npb3VzV2Vic29ja2V0Q2xpZW50IGZyb20gXCIuLi9odHRwLWNsaWVudC93ZWJzb2NrZXQtY2xpZW50LmpzXCJcblxuaW1wb3J0IHtzZXJpYWxpemVkU2NvcGVGcm9tUXVlcnl9IGZyb20gXCIuL3F1ZXJ5LXNjb3BlLmpzXCJcbmltcG9ydCBTeW5jQXBpQ2xpZW50IGZyb20gXCIuL3N5bmMtYXBpLWNsaWVudC5qc1wiXG5pbXBvcnQgU3luY1JlYWx0aW1lQnJpZGdlIGZyb20gXCIuL3N5bmMtcmVhbHRpbWUtYnJpZGdlLmpzXCJcbmltcG9ydCBTeW5jU2NvcGVTdG9yZSBmcm9tIFwiLi9zeW5jLXNjb3BlLXN0b3JlLmpzXCJcbmltcG9ydCB7Y3VycmVudFN5bmNDbGllbnQsIHNldEN1cnJlbnRTeW5jQ2xpZW50fSBmcm9tIFwiLi9zeW5jLWNsaWVudC1yZWdpc3RyeS5qc1wiXG5cbmxldCBjbGllbnRDb3VudGVyID0gMFxuXG4vKiogQHR5cGUge3tjcmVhdGU6IFwiYWZ0ZXJDcmVhdGVcIiwgdXBkYXRlOiBcImFmdGVyVXBkYXRlXCIsIGRlc3Ryb3k6IFwiYWZ0ZXJEZXN0cm95XCJ9fSAqL1xuY29uc3QgVFJBQ0tFRF9DQUxMQkFDS19OQU1FUyA9IHtjcmVhdGU6IFwiYWZ0ZXJDcmVhdGVcIiwgZGVzdHJveTogXCJhZnRlckRlc3Ryb3lcIiwgdXBkYXRlOiBcImFmdGVyVXBkYXRlXCJ9XG5cbi8qKlxuICogT3BlcmF0aW9ucyB0cmFja2VkIGJ5IGRlZmF1bHQgZm9yIG1vZGVscyBkZWNsYXJpbmcgYHN0YXRpYyBzeW5jYCB3aXRob3V0IGFcbiAqIGB0cmFja2Aga2V5OiBsb2NhbCBjcmVhdGVzIGFuZCB1cGRhdGVzIHF1ZXVlIGF1dG9tYXRpY2FsbHkuIERlc3Ryb3lzIGFyZSBub3RcbiAqIHRyYWNrZWQgYnkgZGVmYXVsdCBiZWNhdXNlIGEgbG9jYWwgZGVzdHJveSBpcyBvZnRlbiBjYWNoZSBldmljdGlvbiByYXRoZXJcbiAqIHRoYW4gYSBzZXJ2ZXIgZGVsZXRlOyBvcHQgaW4gd2l0aCBgdHJhY2s6IHRydWVgIG9yIGFuIG9wZXJhdGlvbnMgbGlzdC5cbiAqIEB0eXBlIHtBcnJheTxcImNyZWF0ZVwiIHwgXCJ1cGRhdGVcIiB8IFwiZGVzdHJveVwiPn0gKi9cbmNvbnN0IERFRkFVTFRfVFJBQ0tFRF9PUEVSQVRJT05TID0gW1wiY3JlYXRlXCIsIFwidXBkYXRlXCJdXG5cbi8qKiBBdHRyaWJ1dGUgbmFtZXMgdHJlYXRlZCBhcyBjbGllbnQtbG9jYWwgc3luYyBib29ra2VlcGluZyB3aGVuIGRlcml2aW5nIGxvY2FsT25seUF0dHJpYnV0ZXMuICovXG5jb25zdCBMT0NBTF9CT09LS0VFUElOR19BVFRSSUJVVEVfTkFNRVMgPSBbXCJjcmVhdGVkQXRcIiwgXCJ1cGRhdGVkQXRcIiwgXCJsYXN0U3luY0NoYW5nZUF0XCJdXG5cbi8qKiBAdHlwZSB7V2Vha01hcDxDb25maWd1cmF0aW9uLCBTeW5jQ2xpZW50Pn0gKi9cbmNvbnN0IHN5bmNDbGllbnRzQnlDb25maWd1cmF0aW9uID0gbmV3IFdlYWtNYXAoKVxuXG4vKipcbiAqIERlY2xhcmF0aXZlIGNsaWVudC1zaWRlIHN5bmMgZHJpdmVyLlxuICpcbiAqIEV2ZXJ5dGhpbmcgaXMgZGVyaXZlZCBmcm9tIHRoZSBhcHAncyBWZWxvY2lvdXMgY29uZmlndXJhdGlvbjogbW9kZWxzIGRlY2xhcmVcbiAqIGBzdGF0aWMgc3luY2AsIHRyYW5zcG9ydC9hdXRoL2Nvbm5lY3Rpdml0eSBjb21lIGZyb20gdGhlIGBzeW5jLmNsaWVudGBcbiAqIGNvbmZpZ3VyYXRpb24gYmxvY2ssIGFuZCBWZWxvY2lvdXMgb3ducyBzY29wZSBwZXJzaXN0ZW5jZSwgcGVyLXNjb3BlIGN1cnNvcnMsXG4gKiBwdWxsIHBhZ2luZy9hcHBseSwgbG9jYWwgcXVldWVpbmcsIGFuZCBvbmxpbmUtZ2F0ZWQgcmVwbGF5LiBEZWNsYXJlIHN5bmNcbiAqIGludGVyZXN0IGZyb20gcXVlcmllczpcbiAqXG4gKiAgICAgYXdhaXQgc3luY0NsaWVudCgpLnN0YXJ0KClcbiAqICAgICBhd2FpdCBzeW5jQ2xpZW50KCkuc3luYyhFdmVudC53aGVyZSh7cGFydG5lcklkfSkpXG4gKi9cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFN5bmNDbGllbnQge1xuICAvKipcbiAgICogQnVpbGRzIHRoZSBzeW5jIGNsaWVudCBieSBkZXJpdmluZyBldmVyeXRoaW5nIGZyb20gdGhlIGFwcCdzIFZlbG9jaW91c1xuICAgKiBjb25maWd1cmF0aW9uOiBldmVyeSByZWdpc3RlcmVkIG1vZGVsIGRlY2xhcmluZyBgc3RhdGljIHN5bmNgIGJlY29tZXMgYVxuICAgKiByZXNvdXJjZSB3aXRoIGJvb2xlYW5BdHRyaWJ1dGVzIGRlcml2ZWQgZnJvbSBjb2x1bW4gdHlwZXMgYW5kXG4gICAqIGxvY2FsT25seUF0dHJpYnV0ZXMgZGVyaXZlZCBmcm9tIHRoZSBwcmltYXJ5IGtleSwgY3JlYXRlZEF0L3VwZGF0ZWRBdCwgYW5kXG4gICAqIHN5bmMgYm9va2tlZXBpbmcgY29sdW1uczsgdGhlIHBlbmRpbmctc3luYyBtb2RlbCBpcyB0aGUgcmVnaXN0ZXJlZCBcIlN5bmNcIlxuICAgKiBtb2RlbDsgdHJhbnNwb3J0LCBhdXRoLCBjb25uZWN0aXZpdHksIGFuZCBlcnJvciByZXBvcnRpbmcgY29tZSBmcm9tIHRoZVxuICAgKiBgc3luYy5jbGllbnRgIGNvbmZpZ3VyYXRpb24gYmxvY2ssIHdpdGggdGhlIGZyYW1ld29yayBvd25pbmcgdGhlXG4gICAqIGAke21vdW50UGF0aH0vY2hhbmdlc2AgYW5kIGAke21vdW50UGF0aH0vcmVwbGF5YCBQT1NUZXJzLlxuICAgKiBAcGFyYW0ge2ltcG9ydChcIi4vc3luYy1jbGllbnQtdHlwZXMuanNcIikuU3luY0NsaWVudE9wdGlvbnN9IFtvcHRpb25zXSAtIE9wdGlvbmFsIG92ZXJyaWRlcy5cbiAgICovXG4gIGNvbnN0cnVjdG9yKG9wdGlvbnMgPSB7fSkge1xuICAgIGNvbnN0IHtjb25maWd1cmF0aW9uID0gQ29uZmlndXJhdGlvbi5jdXJyZW50KCksIGxlZ2FjeUN1cnNvciwgc2NvcGVTdG9yZSwgc3luY01vZGVsLCAuLi5yZXN0T3B0aW9uc30gPSBvcHRpb25zXG5cbiAgICByZXN0QXJnc0Vycm9yKHJlc3RPcHRpb25zKVxuXG4gICAgY29uc3QgY2xpZW50Q29uZmlndXJhdGlvbiA9IGNvbmZpZ3VyYXRpb24uZ2V0U3luY0NvbmZpZ3VyYXRpb24oKS5jbGllbnRcblxuICAgIGlmICghY2xpZW50Q29uZmlndXJhdGlvbikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiU3luY0NsaWVudCByZXF1aXJlcyBhIHN5bmMuY2xpZW50IGNvbmZpZ3VyYXRpb24gYmxvY2s6IG5ldyBDb25maWd1cmF0aW9uKHtzeW5jOiB7Y2xpZW50OiB7YXV0aGVudGljYXRpb25Ub2tlbiwgdHJhbnNwb3J0fX19KVwiKVxuICAgIH1cblxuICAgIGNvbnN0IG1vZGVsQ2xhc3NlcyA9IGNvbmZpZ3VyYXRpb24uZ2V0TW9kZWxDbGFzc2VzKClcbiAgICAvKiogQHR5cGUge1JlY29yZDxzdHJpbmcsIGltcG9ydChcIi4vc3luYy1jbGllbnQtdHlwZXMuanNcIikuU3luY0NsaWVudFJlc291cmNlQ29uZmlnPn0gKi9cbiAgICBjb25zdCByZXNvdXJjZXMgPSB7fVxuXG4gICAgZm9yIChjb25zdCBtb2RlbENsYXNzIG9mIE9iamVjdC52YWx1ZXMobW9kZWxDbGFzc2VzKSkge1xuICAgICAgaWYgKCFtb2RlbENsYXNzLnN5bmMpIGNvbnRpbnVlXG5cbiAgICAgIGNvbnN0IHJlc291cmNlVHlwZSA9IG1vZGVsQ2xhc3MuZ2V0TW9kZWxOYW1lKClcblxuICAgICAgcmVzb3VyY2VzW3Jlc291cmNlVHlwZV0gPSByZXNvdXJjZUNvbmZpZ0Zyb21TeW5jRGVjbGFyYXRpb24oe2RlY2xhcmF0aW9uOiBtb2RlbENsYXNzLnN5bmMsIG1vZGVsQ2xhc3MsIHJlc291cmNlVHlwZX0pXG4gICAgfVxuXG4gICAgaWYgKE9iamVjdC5rZXlzKHJlc291cmNlcykubGVuZ3RoID09PSAwKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJTeW5jQ2xpZW50IGZvdW5kIG5vIHJlZ2lzdGVyZWQgbW9kZWxzIGRlY2xhcmluZyBzdGF0aWMgc3luYyAtIGRlY2xhcmUgYHN0YXRpYyBzeW5jID0gdHJ1ZWAgKG9yIGEgc3luYyBkZWNsYXJhdGlvbiBvYmplY3QpIG9uIHRoZSBtb2RlbHMgdGhhdCBzaG91bGQgc3luY1wiKVxuICAgIH1cblxuICAgIGNvbnN0IHJlc29sdmVkU3luY01vZGVsID0gc3luY01vZGVsIHx8IG1vZGVsQ2xhc3Nlcy5TeW5jXG5cbiAgICBpZiAoIXJlc29sdmVkU3luY01vZGVsKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJTeW5jQ2xpZW50IHJlcXVpcmVzIGEgcmVnaXN0ZXJlZCBcXFwiU3luY1xcXCIgbW9kZWwgZm9yIHBlbmRpbmcgbG9jYWwgc3luYyByb3dzIChvciBwYXNzIG9wdGlvbnMuc3luY01vZGVsKVwiKVxuICAgIH1cblxuICAgIC8qKiBAdHlwZSB7aW1wb3J0KFwiLi9zeW5jLWNsaWVudC10eXBlcy5qc1wiKS5TeW5jQ2xpZW50Q29uZmlnfSAqL1xuICAgIHRoaXMuY29uZmlnID0ge1xuICAgICAgYXV0aGVudGljYXRpb25Ub2tlbjogY2xpZW50Q29uZmlndXJhdGlvbi5hdXRoZW50aWNhdGlvblRva2VuLFxuICAgICAgYmF0Y2hTaXplOiBjbGllbnRDb25maWd1cmF0aW9uLmJhdGNoU2l6ZSxcbiAgICAgIGNvbmZpZ3VyYXRpb24sXG4gICAgICBpc09ubGluZTogY2xpZW50Q29uZmlndXJhdGlvbi5pc09ubGluZSxcbiAgICAgIGxlZ2FjeUN1cnNvcixcbiAgICAgIG9uRXJyb3I6IGNsaWVudENvbmZpZ3VyYXRpb24ub25FcnJvcixcbiAgICAgIHBvc3RDaGFuZ2VzOiB0cmFuc3BvcnRQb3N0ZXIoe3BhdGg6IGAke2NsaWVudENvbmZpZ3VyYXRpb24ubW91bnRQYXRofS9jaGFuZ2VzYCwgdHJhbnNwb3J0OiBjbGllbnRDb25maWd1cmF0aW9uLnRyYW5zcG9ydH0pLFxuICAgICAgcG9zdFJlcGxheTogdHJhbnNwb3J0UG9zdGVyKHtwYXRoOiBgJHtjbGllbnRDb25maWd1cmF0aW9uLm1vdW50UGF0aH0vcmVwbGF5YCwgdHJhbnNwb3J0OiBjbGllbnRDb25maWd1cmF0aW9uLnRyYW5zcG9ydH0pLFxuICAgICAgcmVhbHRpbWU6IGNsaWVudENvbmZpZ3VyYXRpb24ucmVhbHRpbWUsXG4gICAgICByZXNvdXJjZXMsXG4gICAgICBzeW5jTW9kZWw6IHJlc29sdmVkU3luY01vZGVsLFxuICAgICAgd2Vic29ja2V0Q2xpZW50OiBjbGllbnRDb25maWd1cmF0aW9uLndlYnNvY2tldENsaWVudCxcbiAgICAgIHdlYnNvY2tldFVybDogY2xpZW50Q29uZmlndXJhdGlvbi53ZWJzb2NrZXRVcmxcbiAgICB9XG4gICAgdGhpcy5fY2xpZW50TnVtYmVyID0gKytjbGllbnRDb3VudGVyXG4gICAgLyoqIEB0eXBlIHtTeW5jUmVhbHRpbWVCcmlkZ2UgfCBudWxsfSAqL1xuICAgIHRoaXMuX3JlYWx0aW1lQnJpZGdlID0gbnVsbFxuICAgIC8qKiBAdHlwZSB7aW1wb3J0KFwiLi9zeW5jLWNsaWVudC10eXBlcy5qc1wiKS5TeW5jQ2xpZW50U2hhcmVkQ29ubmVjdGlvbiB8IG51bGwgfCB1bmRlZmluZWR9IFNoYXJlZCBhcHAtbGlmZXRpbWUgd2Vic29ja2V0IGNvbm5lY3Rpb24gKHVuZGVmaW5lZCB1bnRpbCBmaXJzdCByZXNvbHZlZCwgbnVsbCB3aGVuIG5vbmUgaXMgY29uZmlndXJlZCkuICovXG4gICAgdGhpcy5fc3luY0Nvbm5lY3Rpb24gPSB1bmRlZmluZWRcbiAgICAvKiogQHR5cGUge1Byb21pc2U8dm9pZD4gfCBudWxsfSAqL1xuICAgIHRoaXMuX3N1YnNjcmliZVVzZXJTY29wZVByb21pc2UgPSBudWxsXG4gICAgLyoqIEB0eXBlIHtcInN1YnNjcmliZWRcIiB8IFwic3Vic2NyaWJpbmdcIiB8IFwidW5zdWJzY3JpYmVkXCJ9ICovXG4gICAgdGhpcy5fdXNlclNjb3BlU3RhdGUgPSBcInVuc3Vic2NyaWJlZFwiXG4gICAgLyoqIEB0eXBlIHtpbXBvcnQoXCIuL3N5bmMtc2NvcGUtc3RvcmUuanNcIikuZGVmYXVsdCB8IG51bGx9ICovXG4gICAgdGhpcy5fc2NvcGVTdG9yZSA9IHNjb3BlU3RvcmUgfHwgbnVsbFxuICAgIC8qKiBAdHlwZSB7UHJvbWlzZTx2b2lkPiB8IG51bGx9ICovXG4gICAgdGhpcy5fc2NoZWR1bGVkUmVwbGF5ID0gbnVsbFxuICAgIC8qKiBAdHlwZSB7UmVjb3JkPHN0cmluZywgaW1wb3J0KFwiLi9zeW5jLWFwaS1jbGllbnQtdHlwZXMuanNcIikuU3luY1Jlc291cmNlQ29uZmlnPiB8IG51bGx9ICovXG4gICAgdGhpcy5fcHVsbFJlc291cmNlQ29uZmlncyA9IG51bGxcbiAgICAvKiogQHR5cGUge0FycmF5PHtjYWxsYmFjazogKHJlY29yZDogUmV0dXJuVHlwZTx0eXBlb2YgSlNPTi5wYXJzZT4pID0+IFByb21pc2U8dm9pZD4sIGNhbGxiYWNrTmFtZTogXCJhZnRlckNyZWF0ZVwiIHwgXCJhZnRlclVwZGF0ZVwiIHwgXCJhZnRlckRlc3Ryb3lcIiwgbW9kZWxDbGFzczogUmV0dXJuVHlwZTx0eXBlb2YgSlNPTi5wYXJzZT59Pn0gKi9cbiAgICB0aGlzLl90cmFja2VkQ2FsbGJhY2tzID0gW11cbiAgICAvKiogQHR5cGUge1dlYWtTZXQ8b2JqZWN0Pn0gKi9cbiAgICB0aGlzLl9yZW1vdGVBcHBseVJlY29yZHMgPSBuZXcgV2Vha1NldCgpXG4gICAgdGhpcy5fd2l0aG91dFRyYWNraW5nRGVwdGggPSAwXG4gICAgLyoqIEB0eXBlIHtMb2dnZXIgfCB7ZXJyb3I6ICguLi5tZXNzYWdlczogQXJyYXk8UmV0dXJuVHlwZTx0eXBlb2YgSlNPTi5wYXJzZT4+KSA9PiBQcm9taXNlPHZvaWQ+fSB8IG51bGx9ICovXG4gICAgdGhpcy5fbG9nZ2VyID0gbnVsbFxuICAgIHRoaXMuX3N0YXJ0ZWQgPSBmYWxzZVxuICB9XG5cbiAgLyoqXG4gICAqIFJlZ2lzdGVycyBhdXRvbWF0aWMgbXV0YXRpb24gdHJhY2tpbmcgZm9yIGV2ZXJ5IGRlY2xhcmVkIHJlc291cmNlIChvbiBieVxuICAgKiBkZWZhdWx0OiBsb2NhbCBjcmVhdGVzIGFuZCB1cGRhdGVzIHF1ZXVlIHBlbmRpbmcgc3luYyByb3dzIG9uY2UgdGhlaXJcbiAgICogdHJhbnNhY3Rpb24gY29tbWl0cyBhbmQgc2NoZWR1bGUgYW4gaW1tZWRpYXRlIHJlcGxheSBhdHRlbXB0LCB3aXRob3V0XG4gICAqIGFwcC1zaWRlIHF1ZXVlIGNhbGxzKS4gYHRyYWNrOiBmYWxzZWAgcmVzb3VyY2VzIGFyZSBza2lwcGVkOyBgdHJhY2s6IHRydWVgXG4gICAqIGFkZHMgZGVzdHJveXM7IGFuIG9wZXJhdGlvbnMgbGlzdCBuYXJyb3dzIHRoZSB0cmFja2VkIG9wZXJhdGlvbnMuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fVxuICAgKi9cbiAgYXN5bmMgc3RhcnQoKSB7XG4gICAgaWYgKHRoaXMuX3N0YXJ0ZWQpIHJldHVyblxuXG4gICAgdGhpcy5fc3RhcnRlZCA9IHRydWVcblxuICAgIGZvciAoY29uc3QgW3Jlc291cmNlVHlwZSwgcmVzb3VyY2VDb25maWddIG9mIE9iamVjdC5lbnRyaWVzKHRoaXMuY29uZmlnLnJlc291cmNlcykpIHtcbiAgICAgIGNvbnN0IG9wZXJhdGlvbnMgPSB0aGlzLnRyYWNrZWRPcGVyYXRpb25zKHtyZXNvdXJjZUNvbmZpZywgcmVzb3VyY2VUeXBlfSlcblxuICAgICAgZm9yIChjb25zdCBvcGVyYXRpb24gb2Ygb3BlcmF0aW9ucykge1xuICAgICAgICBjb25zdCBjYWxsYmFja05hbWUgPSBUUkFDS0VEX0NBTExCQUNLX05BTUVTW29wZXJhdGlvbl1cbiAgICAgICAgY29uc3QgY2FsbGJhY2sgPSB0aGlzLnRyYWNrZWRNdXRhdGlvbkNhbGxiYWNrKHtvcGVyYXRpb24sIHJlc291cmNlQ29uZmlnfSlcblxuICAgICAgICByZXNvdXJjZUNvbmZpZy5tb2RlbENsYXNzW2NhbGxiYWNrTmFtZV0oY2FsbGJhY2spXG4gICAgICAgIHRoaXMuX3RyYWNrZWRDYWxsYmFja3MucHVzaCh7Y2FsbGJhY2ssIGNhbGxiYWNrTmFtZSwgbW9kZWxDbGFzczogcmVzb3VyY2VDb25maWcubW9kZWxDbGFzc30pXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFVucmVnaXN0ZXJzIGFsbCB0cmFja2luZyBjYWxsYmFja3MgKHRlc3RzLCBzaWduLW91dCwgaG90IHJlbG9hZCkuXG4gICAqIEByZXR1cm5zIHt2b2lkfVxuICAgKi9cbiAgc3RvcCgpIHtcbiAgICBmb3IgKGNvbnN0IHtjYWxsYmFjaywgY2FsbGJhY2tOYW1lLCBtb2RlbENsYXNzfSBvZiB0aGlzLl90cmFja2VkQ2FsbGJhY2tzKSB7XG4gICAgICBtb2RlbENsYXNzLnVucmVnaXN0ZXJMaWZlY3ljbGVDYWxsYmFjayhjYWxsYmFja05hbWUsIGNhbGxiYWNrKVxuICAgIH1cblxuICAgIHRoaXMuX3RyYWNrZWRDYWxsYmFja3MgPSBbXVxuICAgIHRoaXMuX3N0YXJ0ZWQgPSBmYWxzZVxuICB9XG5cbiAgLyoqXG4gICAqIFJlc29sdmVzIGFuZCB2YWxpZGF0ZXMgdGhlIHRyYWNrZWQgb3BlcmF0aW9ucyBmb3IgYSByZXNvdXJjZSBjb25maWcuXG4gICAqIFRyYWNraW5nIGlzIG9uIGJ5IGRlZmF1bHQ6IG1vZGVscyBkZWNsYXJpbmcgYHN0YXRpYyBzeW5jYCB3aXRob3V0IGEgYHRyYWNrYFxuICAgKiBrZXkgcXVldWUgbG9jYWwgY3JlYXRlcyBhbmQgdXBkYXRlcyBhdXRvbWF0aWNhbGx5OyBgdHJhY2s6IGZhbHNlYCBvcHRzIGFcbiAgICogbW9kZWwgb3V0IChmb3IgbW9kZWxzIHdyaXR0ZW4gYnkgbm9uLXVzZXIgZmxvd3MpLlxuICAgKiBAcGFyYW0ge3tyZXNvdXJjZUNvbmZpZzogaW1wb3J0KFwiLi9zeW5jLWNsaWVudC10eXBlcy5qc1wiKS5TeW5jQ2xpZW50UmVzb3VyY2VDb25maWcsIHJlc291cmNlVHlwZTogc3RyaW5nfX0gYXJncyAtIFJlc291cmNlIGNvbmZpZyBhbmQgbmFtZS5cbiAgICogQHJldHVybnMge0FycmF5PFwiY3JlYXRlXCIgfCBcInVwZGF0ZVwiIHwgXCJkZXN0cm95XCI+fSBUcmFja2VkIG9wZXJhdGlvbnMuXG4gICAqL1xuICB0cmFja2VkT3BlcmF0aW9ucyh7cmVzb3VyY2VDb25maWcsIHJlc291cmNlVHlwZX0pIHtcbiAgICBjb25zdCB0cmFjayA9IHJlc291cmNlQ29uZmlnLnRyYWNrXG5cbiAgICBpZiAodHJhY2sgPT09IGZhbHNlKSByZXR1cm4gW11cbiAgICBpZiAodHJhY2sgPT09IHVuZGVmaW5lZCkgcmV0dXJuIERFRkFVTFRfVFJBQ0tFRF9PUEVSQVRJT05TXG4gICAgaWYgKHRyYWNrID09PSB0cnVlKSByZXR1cm4gW1wiY3JlYXRlXCIsIFwidXBkYXRlXCIsIFwiZGVzdHJveVwiXVxuXG4gICAgaWYgKCF0cmFjayB8fCB0eXBlb2YgdHJhY2sgIT09IFwib2JqZWN0XCIgfHwgIUFycmF5LmlzQXJyYXkodHJhY2sub3BlcmF0aW9ucykgfHwgdHJhY2sub3BlcmF0aW9ucy5sZW5ndGggPT09IDApIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgU3luY0NsaWVudCByZXNvdXJjZSAke3Jlc291cmNlVHlwZX0gdHJhY2sgbXVzdCBiZSB0cnVlIG9yIHtvcGVyYXRpb25zOiBbLi4uXX1gKVxuICAgIH1cblxuICAgIGZvciAoY29uc3Qgb3BlcmF0aW9uIG9mIHRyYWNrLm9wZXJhdGlvbnMpIHtcbiAgICAgIGlmICghKG9wZXJhdGlvbiBpbiBUUkFDS0VEX0NBTExCQUNLX05BTUVTKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFN5bmNDbGllbnQgcmVzb3VyY2UgJHtyZXNvdXJjZVR5cGV9IHRyYWNrLm9wZXJhdGlvbnMgbXVzdCBiZSBjcmVhdGUvdXBkYXRlL2Rlc3Ryb3ksIGdvdDogJHtTdHJpbmcob3BlcmF0aW9uKX1gKVxuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB0cmFjay5vcGVyYXRpb25zXG4gIH1cblxuICAvKipcbiAgICogQnVpbGRzIHRoZSBsaWZlY3ljbGUgY2FsbGJhY2sgcXVldWVpbmcgb25lIHRyYWNrZWQgbXV0YXRpb24uIFRoZSBxdWV1ZWRcbiAgICogcGF5bG9hZCBhbmQgc3luYyB0eXBlIGFyZSBzbmFwc2hvdHRlZCBhdCBtdXRhdGlvbi1jYWxsYmFjayB0aW1lLCBzb1xuICAgKiBhZnRlclNhdmUgaG9va3MgYXNzaWduaW5nIHVuc2F2ZWQgYXR0cmlidXRlcyAob3IgYW55IGxhdGVyIGRyaWZ0IG9uIHRoZVxuICAgKiByZWNvcmQpIGNhbm5vdCBjaGFuZ2Ugd2hhdCBnZXRzIHF1ZXVlZCB2cyB3aGF0IHdhcyBjb21taXR0ZWQuIFF1ZXVlaW5nIGlzXG4gICAqIGRlZmVycmVkIHRocm91Z2ggdGhlIG1vZGVsIGNvbm5lY3Rpb24ncyBhZnRlckNvbW1pdCBob29rIHNvIGl0IG9ubHkgcnVuc1xuICAgKiBvbmNlIHRoZSBtdXRhdGlvbidzIHRyYW5zYWN0aW9uIGhhcyBjb21taXR0ZWQgKGltbWVkaWF0ZWx5IHdoZW4gbm9cbiAgICogdHJhbnNhY3Rpb24gaXMgb3BlbikgLSBxdWV1ZWQgc3luY3MgbmV2ZXIgcmVmZXJlbmNlIHJvbGxlZC1iYWNrIHJvd3MuXG4gICAqIFBvc3QtY29tbWl0IHF1ZXVlIGZhaWx1cmVzIGFyZSByZXBvcnRlZCB3aXRob3V0IHJldGhyb3dpbmcgaW50byB0aGVcbiAgICogZHJpdmVyJ3MgYWZ0ZXJDb21taXQgY2hhaW4gKHNlZSByZXBvcnRBZnRlckNvbW1pdEVycm9yKS5cbiAgICogQHBhcmFtIHt7b3BlcmF0aW9uOiBcImNyZWF0ZVwiIHwgXCJ1cGRhdGVcIiB8IFwiZGVzdHJveVwiLCByZXNvdXJjZUNvbmZpZzogaW1wb3J0KFwiLi9zeW5jLWNsaWVudC10eXBlcy5qc1wiKS5TeW5jQ2xpZW50UmVzb3VyY2VDb25maWd9fSBhcmdzIC0gT3BlcmF0aW9uIGFuZCByZXNvdXJjZSBjb25maWcuXG4gICAqIEByZXR1cm5zIHsocmVjb3JkOiBSZXR1cm5UeXBlPHR5cGVvZiBKU09OLnBhcnNlPikgPT4gUHJvbWlzZTx2b2lkPn0gTGlmZWN5Y2xlIGNhbGxiYWNrLlxuICAgKi9cbiAgdHJhY2tlZE11dGF0aW9uQ2FsbGJhY2soe29wZXJhdGlvbiwgcmVzb3VyY2VDb25maWd9KSB7XG4gICAgcmV0dXJuIGFzeW5jIChyZWNvcmQpID0+IHtcbiAgICAgIGlmICh0aGlzLmlzVHJhY2tpbmdTdXBwcmVzc2VkKHJlY29yZCkpIHJldHVyblxuXG4gICAgICBjb25zdCBkYXRhID0gU3luY0FwaUNsaWVudC5xdWV1ZWRTeW5jRGF0YSh7XG4gICAgICAgIGJvb2xlYW5BdHRyaWJ1dGVzOiByZXNvdXJjZUNvbmZpZy5ib29sZWFuQXR0cmlidXRlcyB8fCBbXSxcbiAgICAgICAgZGF0YTogcmVzb3VyY2VDb25maWcudHJhY2tlZERhdGEgPyByZXNvdXJjZUNvbmZpZy50cmFja2VkRGF0YSh7b3BlcmF0aW9uLCByZWNvcmR9KSA6IHVuZGVmaW5lZCxcbiAgICAgICAgbG9jYWxPbmx5QXR0cmlidXRlczogcmVzb3VyY2VDb25maWcubG9jYWxPbmx5QXR0cmlidXRlcyB8fCBbXSxcbiAgICAgICAgcmVzb3VyY2U6IHJlY29yZFxuICAgICAgfSlcbiAgICAgIGNvbnN0IHN5bmNUeXBlID0gdGhpcy5kZWZhdWx0U3luY1R5cGUoe29wZXJhdGlvbiwgcmVjb3JkLCByZXNvdXJjZUNvbmZpZ30pXG4gICAgICBjb25zdCBkYXRhYmFzZU9wZXJhdGlvbiA9IHJlY29yZC5kYXRhYmFzZU9wZXJhdGlvbigpXG4gICAgICBjb25zdCBvcGVyYXRpb25TY29wZSA9IGRhdGFiYXNlT3BlcmF0aW9uXG4gICAgICAgID8gZGF0YWJhc2VPcGVyYXRpb24uZm9yTW9kZWwodGhpcy5jb25maWcuc3luY01vZGVsKVxuICAgICAgICA6IHRoaXMuY29uZmlnLnN5bmNNb2RlbFxuXG4gICAgICBhd2FpdCByZWNvcmQuY29ubmVjdGlvbigpLmFmdGVyQ29tbWl0KGFzeW5jICgpID0+IHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBhd2FpdCBTeW5jQXBpQ2xpZW50LnF1ZXVlTG9jYWxTeW5jKHtcbiAgICAgICAgICAgIGRhdGEsXG4gICAgICAgICAgICByZXNvdXJjZTogcmVjb3JkLFxuICAgICAgICAgICAgc3luY01vZGVsOiBvcGVyYXRpb25TY29wZSxcbiAgICAgICAgICAgIHN5bmNUeXBlXG4gICAgICAgICAgfSlcbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICBhd2FpdCB0aGlzLnJlcG9ydEFmdGVyQ29tbWl0RXJyb3IoLyoqIEB0eXBlIHtFcnJvcn0gKi8gKGVycm9yKSlcblxuICAgICAgICAgIHJldHVyblxuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5zY2hlZHVsZVJlcGxheSgpXG4gICAgICB9KVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBSZXBvcnRzIGEgcG9zdC1jb21taXQgdHJhY2tlZC1xdWV1ZWluZyBmYWlsdXJlLiBUaGUgdHJhbnNhY3Rpb24gaGFzIGFscmVhZHlcbiAgICogY29tbWl0dGVkIHdoZW4gYWZ0ZXJDb21taXQgY2FsbGJhY2tzIHJ1biwgc28gcmV0aHJvd2luZyBoZXJlIHdvdWxkIHBvaXNvblxuICAgKiB0aGUgZHJpdmVyJ3MgYXdhaXRlZCBhZnRlckNvbW1pdCBjaGFpbiAoYnJlYWtpbmcgdW5yZWxhdGVkIGNhbGxiYWNrcykgLVxuICAgKiBpbnN0ZWFkIHRoZSBmYWlsdXJlIGdvZXMgdG8gdGhlIGNvbmZpZ3VyZWQgc3luYy5jbGllbnQub25FcnJvciBob29rLCBvciBpc1xuICAgKiBsb2dnZWQgbG91ZGx5IHRocm91Z2ggdGhlIGNsaWVudCdzIGxvZ2dlciB3aGVuIG5vbmUgaXMgY29uZmlndXJlZC5cbiAgICogQHBhcmFtIHtFcnJvcn0gZXJyb3IgLSBQb3N0LWNvbW1pdCBxdWV1ZWluZyBmYWlsdXJlLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn1cbiAgICovXG4gIGFzeW5jIHJlcG9ydEFmdGVyQ29tbWl0RXJyb3IoZXJyb3IpIHtcbiAgICBpZiAodGhpcy5jb25maWcub25FcnJvcikge1xuICAgICAgdGhpcy5jb25maWcub25FcnJvcihlcnJvcilcblxuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgYXdhaXQgdGhpcy5sb2dnZXIoKS5lcnJvcihcIlN5bmNDbGllbnQgZmFpbGVkIHRvIHF1ZXVlIGEgdHJhY2tlZCBtdXRhdGlvbiBhZnRlciBjb21taXRcIiwgZXJyb3IpXG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyB0aGUgbGF6aWx5IGJ1aWx0IGNsaWVudCBsb2dnZXIuXG4gICAqIEByZXR1cm5zIHtMb2dnZXIgfCB7ZXJyb3I6ICguLi5tZXNzYWdlczogQXJyYXk8UmV0dXJuVHlwZTx0eXBlb2YgSlNPTi5wYXJzZT4+KSA9PiBQcm9taXNlPHZvaWQ+fX0gQ2xpZW50IGxvZ2dlci5cbiAgICovXG4gIGxvZ2dlcigpIHtcbiAgICB0aGlzLl9sb2dnZXIgfHw9IG5ldyBMb2dnZXIoXCJTeW5jQ2xpZW50XCIsIHtjb25maWd1cmF0aW9uOiB0aGlzLmNvbmZpZy5jb25maWd1cmF0aW9ufSlcblxuICAgIHJldHVybiB0aGlzLl9sb2dnZXJcbiAgfVxuXG4gIC8qKlxuICAgKiBXaGV0aGVyIGEgcmVjb3JkIGlzIGN1cnJlbnRseSBiZWluZyB3cml0dGVuIGJ5IHB1bGwtYXBwbHkgKGVjaG8gc3VwcHJlc3Npb24pLlxuICAgKiBAcGFyYW0ge1JldHVyblR5cGU8dHlwZW9mIEpTT04ucGFyc2U+fSByZWNvcmQgLSBMb2NhbCBtb2RlbCByZWNvcmQuXG4gICAqIEByZXR1cm5zIHtib29sZWFufSBXaGV0aGVyIHRoZSByZWNvcmQgd3JpdGUgb3JpZ2luYXRlcyBmcm9tIGEgcmVtb3RlIGNoYW5nZS5cbiAgICovXG4gIGlzUmVtb3RlQXBwbHkocmVjb3JkKSB7XG4gICAgcmV0dXJuIHRoaXMuX3JlbW90ZUFwcGx5UmVjb3Jkcy5oYXMocmVjb3JkKVxuICB9XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdHJhY2tlZCBtdXRhdGlvbiBxdWV1ZWluZyBpcyBjdXJyZW50bHkgc3VwcHJlc3NlZCBmb3IgYSByZWNvcmQ6XG4gICAqIGVpdGhlciB0aGUgcmVjb3JkIHdhcyBtYXJrZWQgYXMgYSByZW1vdGUgYXBwbHkgKGBtYXJrUmVtb3RlQXBwbHlgLCB1c2VkIGJ5XG4gICAqIHB1bGwgYW5kIHJlYWx0aW1lIGFwcGxpZXMpIG9yIGEgYHdpdGhvdXRUcmFja2luZ2AgY2FsbGJhY2sgaXMgcnVubmluZyBvblxuICAgKiB0aGlzIGNsaWVudC5cbiAgICogQHBhcmFtIHtSZXR1cm5UeXBlPHR5cGVvZiBKU09OLnBhcnNlPn0gcmVjb3JkIC0gTG9jYWwgbW9kZWwgcmVjb3JkLlxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gV2hldGhlciB0cmFja2VkIHF1ZXVlaW5nIGlzIHN1cHByZXNzZWQgZm9yIHRoZSByZWNvcmQuXG4gICAqL1xuICBpc1RyYWNraW5nU3VwcHJlc3NlZChyZWNvcmQpIHtcbiAgICByZXR1cm4gdGhpcy5fd2l0aG91dFRyYWNraW5nRGVwdGggPiAwIHx8IHRoaXMuaXNSZW1vdGVBcHBseShyZWNvcmQpXG4gIH1cblxuICAvKipcbiAgICogUnVucyBhIGNhbGxiYWNrIHdpdGggdHJhY2tlZCBtdXRhdGlvbiBxdWV1ZWluZyBzdXBwcmVzc2VkIG9uIHRoaXMgY2xpZW50IC1cbiAgICogZm9yIGNvZGUgYXBwbHlpbmcgc2VydmVyLW9yaWdpbmF0ZWQgZGF0YSBvdXRzaWRlIHRoZSBkZXJpdmVkIHB1bGwvcmVhbHRpbWVcbiAgICogYXBwbGllcnMgKGxlZ2FjeSBwdWxsIHBhdGhzLCBpbXBvcnRlcnMsIHNpZ24taW4gYmFja2ZpbGxzKSwgc28gdGhlaXIgd3JpdGVzXG4gICAqIGFyZSBub3QgZWNob2VkIGJhY2sgdG8gdGhlIHNlcnZlciBhcyBkZXZpY2UgY2hhbmdlcy4gU3VwcHJlc3Npb24gY292ZXJzIHRoZVxuICAgKiB3aG9sZSBhc3luYyBkdXJhdGlvbiBvZiB0aGUgY2FsbGJhY2sgKG5lc3RlZCBjYWxscyBzdGFjaykgYW5kIGlzXG4gICAqIGNsaWVudC13aWRlIHdoaWxlIGl0IHJ1bnM6IG11dGF0aW9ucyBmcm9tIGNvbmN1cnJlbnRseSBydW5uaW5nIHRhc2tzIGFyZVxuICAgKiBhbHNvIHN1cHByZXNzZWQgZm9yIHRoYXQgd2luZG93LCBzbyBwcmVmZXIgYG1hcmtSZW1vdGVBcHBseShyZWNvcmQpYCB3aGVuXG4gICAqIHdyaXRlcyBmcm9tIG90aGVyIGZsb3dzIGNhbiBpbnRlcmxlYXZlLlxuICAgKiBAdGVtcGxhdGUgVFxuICAgKiBAcGFyYW0geygpID0+IFByb21pc2U8VD4gfCBUfSBjYWxsYmFjayAtIFdvcmsgd2hvc2UgbW9kZWwgd3JpdGVzIHNob3VsZCBub3QgcXVldWUgdHJhY2tlZCBzeW5jcy5cbiAgICogQHJldHVybnMge1Byb21pc2U8VD59IFRoZSBjYWxsYmFjayByZXN1bHQuXG4gICAqL1xuICBhc3luYyB3aXRob3V0VHJhY2tpbmcoY2FsbGJhY2spIHtcbiAgICB0aGlzLl93aXRob3V0VHJhY2tpbmdEZXB0aCsrXG5cbiAgICB0cnkge1xuICAgICAgcmV0dXJuIGF3YWl0IGNhbGxiYWNrKClcbiAgICB9IGZpbmFsbHkge1xuICAgICAgdGhpcy5fd2l0aG91dFRyYWNraW5nRGVwdGgtLVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBNYXJrcyBvbmUgcmVjb3JkIGFzIGJlaW5nIHdyaXR0ZW4gZnJvbSBzZXJ2ZXItb3JpZ2luYXRlZCBkYXRhIHNvIHRyYWNrZWRcbiAgICogbXV0YXRpb24gcXVldWVpbmcgc2tpcHMgaXQgKHJlY29yZC1wcmVjaXNlIHN1cHByZXNzaW9uKS4gVGhlIGRlcml2ZWQgcHVsbFxuICAgKiBhbmQgcmVhbHRpbWUgYXBwbGllcnMgdXNlIHRoaXMgaW50ZXJuYWxseSBhcm91bmQgZXZlcnkgYXBwbGllZCB3cml0ZS5cbiAgICogQHBhcmFtIHtSZXR1cm5UeXBlPHR5cGVvZiBKU09OLnBhcnNlPn0gcmVjb3JkIC0gTG9jYWwgbW9kZWwgcmVjb3JkIGFib3V0IHRvIGJlIHdyaXR0ZW4uXG4gICAqIEByZXR1cm5zIHsoKSA9PiB2b2lkfSBSZWxlYXNlIGNhbGxiYWNrIHJlLWVuYWJsaW5nIHRyYWNraW5nIGZvciB0aGUgcmVjb3JkLlxuICAgKi9cbiAgbWFya1JlbW90ZUFwcGx5KHJlY29yZCkge1xuICAgIHRoaXMuX3JlbW90ZUFwcGx5UmVjb3Jkcy5hZGQocmVjb3JkKVxuXG4gICAgcmV0dXJuICgpID0+IHRoaXMuX3JlbW90ZUFwcGx5UmVjb3Jkcy5kZWxldGUocmVjb3JkKVxuICB9XG5cbiAgLyoqXG4gICAqIFJlZ2lzdGVycyB0aGlzIGNsaWVudCBhcyB0aGUgYXBwJ3MgY3VycmVudCBzeW5jIGNsaWVudC5cbiAgICogQHJldHVybnMge3ZvaWR9XG4gICAqL1xuICBzZXRDdXJyZW50KCkge1xuICAgIHNldEN1cnJlbnRTeW5jQ2xpZW50KHRoaXMpXG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyB0aGUgYXBwJ3MgY3VycmVudCBzeW5jIGNsaWVudC5cbiAgICogQHJldHVybnMge1N5bmNDbGllbnR9IEN1cnJlbnQgc3luYyBjbGllbnQuXG4gICAqL1xuICBzdGF0aWMgY3VycmVudCgpIHtcbiAgICByZXR1cm4gLyoqIEB0eXBlIHtTeW5jQ2xpZW50fSAqLyAoY3VycmVudFN5bmNDbGllbnQoKSlcbiAgfVxuXG4gIC8qKlxuICAgKiBCdWlsZHMgYSBzeW5jIGNsaWVudCBkZXJpdmVkIGZyb20gdGhlIGdpdmVuIGNvbmZpZ3VyYXRpb24uIEFsaWFzIGZvclxuICAgKiBgbmV3IFN5bmNDbGllbnQoe2NvbmZpZ3VyYXRpb24sIC4uLm9wdGlvbnN9KWAuXG4gICAqIEBwYXJhbSB7Q29uZmlndXJhdGlvbn0gW2NvbmZpZ3VyYXRpb25dIC0gQ29uZmlndXJhdGlvbiBvd25pbmcgdGhlIHJlZ2lzdGVyZWQgbW9kZWxzIGFuZCB0aGUgc3luYy5jbGllbnQgYmxvY2suIERlZmF1bHRzIHRvIHRoZSBjdXJyZW50IGNvbmZpZ3VyYXRpb24uXG4gICAqIEBwYXJhbSB7T21pdDxpbXBvcnQoXCIuL3N5bmMtY2xpZW50LXR5cGVzLmpzXCIpLlN5bmNDbGllbnRPcHRpb25zLCBcImNvbmZpZ3VyYXRpb25cIj59IFtvcHRpb25zXSAtIE9wdGlvbmFsIG92ZXJyaWRlcy5cbiAgICogQHJldHVybnMge1N5bmNDbGllbnR9IFN5bmMgY2xpZW50IGRlcml2ZWQgZnJvbSB0aGUgY29uZmlndXJhdGlvbi5cbiAgICovXG4gIHN0YXRpYyBmcm9tQ29uZmlndXJhdGlvbihjb25maWd1cmF0aW9uID0gQ29uZmlndXJhdGlvbi5jdXJyZW50KCksIG9wdGlvbnMgPSB7fSkge1xuICAgIHJldHVybiBuZXcgU3luY0NsaWVudCh7Li4ub3B0aW9ucywgY29uZmlndXJhdGlvbn0pXG4gIH1cblxuICAvKipcbiAgICogRGVjbGFyZXMgKG9yIHJlLWFjdGl2YXRlcykgYSBzeW5jIHNjb3BlIGZyb20gYSBtb2RlbCBxdWVyeSBhbmQgcHVsbHMgaXQgd2hlbiBvbmxpbmUuXG4gICAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vZGF0YWJhc2UvcXVlcnkvbW9kZWwtY2xhc3MtcXVlcnkuanNcIikuZGVmYXVsdDxSZXR1cm5UeXBlPHR5cGVvZiBKU09OLnBhcnNlPj59IHF1ZXJ5IC0gUXVlcnkgZGVjbGFyaW5nIHRoZSBzeW5jIHNjb3BlLlxuICAgKiBAcGFyYW0ge29iamVjdH0gW29wdGlvbnNdIC0gU3luYyBvcHRpb25zLlxuICAgKiBAcGFyYW0geyhwcm9ncmVzczogaW1wb3J0KFwiLi9zeW5jLWFwaS1jbGllbnQtdHlwZXMuanNcIikuU3luY1B1bGxQcm9ncmVzcykgPT4gdm9pZH0gW29wdGlvbnMub25Qcm9ncmVzc10gLSBDYWxsZWQgcGVyIGFwcGxpZWQgcGFnZSBvZiB0aGUgcHVsbCB0aGlzIGRlY2xhcmF0aW9uIHRyaWdnZXJzLCBzbyB0aGUgaW5pdGlhbCBpbXBvcnQgb2YgYSBuZXdseSBkZWNsYXJlZCBzY29wZSBjYW4gZHJpdmUgYSBcInN5bmNlZENvdW50IG9mIHRvdGFsXCIgcHJvZ3Jlc3MgYmFyLiBTZWUgYHB1bGwoKWAuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHtzY29wZTogaW1wb3J0KFwiLi9zeW5jLWNsaWVudC10eXBlcy5qc1wiKS5TZXJpYWxpemVkU3luY1Njb3BlLCBwdWxsZWQ6IGltcG9ydChcIi4vc3luYy1hcGktY2xpZW50LXR5cGVzLmpzXCIpLlN5bmNDaGFuZ2VzUmVzdWx0IHwgbnVsbH0+fSBEZWNsYXJlZCBzY29wZSBhbmQgcHVsbCByZXN1bHQgKG51bGwgd2hpbGUgb2ZmbGluZSkuXG4gICAqL1xuICBhc3luYyBzeW5jKHF1ZXJ5LCB7b25Qcm9ncmVzc30gPSB7fSkge1xuICAgIGNvbnN0IHNjb3BlID0gc2VyaWFsaXplZFNjb3BlRnJvbVF1ZXJ5KHF1ZXJ5KVxuICAgIGNvbnN0IHNjb3BlU3RvcmUgPSB0aGlzLnNjb3BlU3RvcmUoKVxuICAgIGNvbnN0IHNjb3BlUm93ID0gYXdhaXQgc2NvcGVTdG9yZS5maW5kT3JDcmVhdGVTY29wZShzY29wZSlcblxuICAgIGlmICghc2NvcGVSb3cuY3Vyc29yUGF5bG9hZCAmJiB0aGlzLmNvbmZpZy5sZWdhY3lDdXJzb3IpIHtcbiAgICAgIGNvbnN0IGxlZ2FjeUN1cnNvclBheWxvYWQgPSBhd2FpdCB0aGlzLmNvbmZpZy5sZWdhY3lDdXJzb3Ioe3Njb3BlfSlcbiAgICAgIGNvbnN0IGxlZ2FjeUN1cnNvciA9IFN5bmNBcGlDbGllbnQuc3luY0N1cnNvckZyb21QYXlsb2FkKGxlZ2FjeUN1cnNvclBheWxvYWQpXG5cbiAgICAgIGlmIChsZWdhY3lDdXJzb3IpIGF3YWl0IHNjb3BlU3RvcmUuc2F2ZUN1cnNvcihzY29wZVJvdywgbGVnYWN5Q3Vyc29yKVxuICAgIH1cblxuICAgIHJldHVybiB7cHVsbGVkOiBhd2FpdCB0aGlzLnB1bGwoe29uUHJvZ3Jlc3N9KSwgc2NvcGV9XG4gIH1cblxuICAvKipcbiAgICogRGVhY3RpdmF0ZXMgdGhlIHN5bmMgc2NvcGUgZGVjbGFyZWQgYnkgYSBtb2RlbCBxdWVyeS5cbiAgICogQHBhcmFtIHtpbXBvcnQoXCIuLi9kYXRhYmFzZS9xdWVyeS9tb2RlbC1jbGFzcy1xdWVyeS5qc1wiKS5kZWZhdWx0PFJldHVyblR5cGU8dHlwZW9mIEpTT04ucGFyc2U+Pn0gcXVlcnkgLSBRdWVyeSB3aG9zZSBzY29wZSBzaG91bGQgc3RvcCBzeW5jaW5nLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn1cbiAgICovXG4gIGFzeW5jIHVuc3luYyhxdWVyeSkge1xuICAgIGF3YWl0IHRoaXMuc2NvcGVTdG9yZSgpLmRlYWN0aXZhdGUoc2VyaWFsaXplZFNjb3BlRnJvbVF1ZXJ5KHF1ZXJ5KSlcbiAgfVxuXG4gIC8qKlxuICAgKiBQdWxscyBjaGFuZ2VzIGZvciBldmVyeSBhY3RpdmUgc2NvcGUgd2l0aCBwZXItc2NvcGUgY3Vyc29ycyAoc2luZ2xlLWZsaWdodGVkLCBvbmxpbmUtZ2F0ZWQpLlxuICAgKiBAcGFyYW0ge29iamVjdH0gW29wdGlvbnNdIC0gUHVsbCBvcHRpb25zLlxuICAgKiBAcGFyYW0geyhwcm9ncmVzczogaW1wb3J0KFwiLi9zeW5jLWFwaS1jbGllbnQtdHlwZXMuanNcIikuU3luY1B1bGxQcm9ncmVzcykgPT4gdm9pZH0gW29wdGlvbnMub25Qcm9ncmVzc10gLSBDYWxsZWQgcGVyIGFwcGxpZWQgcGFnZSB3aXRoIGN1bXVsYXRpdmUgYHtwYWdlcywgc3luY2VkQ291bnQsIHRvdGFsfWAgYWNyb3NzIHRoZSBwdWxsZWQgc2NvcGVzLCBmb3IgcmVuZGVyaW5nIGEgXCJzeW5jZWRDb3VudCBvZiB0b3RhbFwiIHByb2dyZXNzIGJhciAoZS5nLiBhIGZ1bGwtaW1wb3J0IHNjcmVlbikuIE9wdGlvbmFsOyBvbWl0dGluZyBpdCBrZWVwcyB0aGUgZXhpc3RpbmcgYmVoYXZpb3IuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPGltcG9ydChcIi4vc3luYy1hcGktY2xpZW50LXR5cGVzLmpzXCIpLlN5bmNDaGFuZ2VzUmVzdWx0IHwgbnVsbD59IENvbWJpbmVkIHB1bGwgcmVzdWx0LCBvciBudWxsIHdoaWxlIG9mZmxpbmUuXG4gICAqL1xuICBhc3luYyBwdWxsKHtvblByb2dyZXNzfSA9IHt9KSB7XG4gICAgaWYgKCEoYXdhaXQgdGhpcy5pc09ubGluZSgpKSkgcmV0dXJuIG51bGxcblxuICAgIC8qKiBAdHlwZSB7aW1wb3J0KFwiLi9zeW5jLWFwaS1jbGllbnQtdHlwZXMuanNcIikuU3luY0NoYW5nZXNSZXN1bHQgfCBudWxsfSAqL1xuICAgIGxldCBjb21iaW5lZFJlc3VsdCA9IG51bGxcblxuICAgIGF3YWl0IFN5bmNBcGlDbGllbnQuc2luZ2xlRmxpZ2h0KGB2ZWxvY2lvdXMtc3luYy1jbGllbnQtcHVsbC0ke3RoaXMuX2NsaWVudE51bWJlcn1gLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCBhdXRoZW50aWNhdGlvblRva2VuID0gYXdhaXQgdGhpcy5jb25maWcuYXV0aGVudGljYXRpb25Ub2tlbigpXG4gICAgICBjb25zdCBzY29wZVN0b3JlID0gdGhpcy5zY29wZVN0b3JlKClcbiAgICAgIGNvbnN0IGFwcGx5U3luYyA9IHRoaXMucmVtb3RlQXBwbHlTeW5jKClcbiAgICAgIGNvbnN0IHJlc3VsdCA9IHtcbiAgICAgICAgY2hhbmdlZDogZmFsc2UsXG4gICAgICAgIHBhZ2VzOiAwLFxuICAgICAgICByZXNvdXJjZUNoYW5nZWQ6IC8qKiBAdHlwZSB7UmVjb3JkPHN0cmluZywgYm9vbGVhbj59ICovICh7fSksXG4gICAgICAgIHJlc291cmNlQ291bnRzOiAvKiogQHR5cGUge1JlY29yZDxzdHJpbmcsIG51bWJlcj59ICovICh7fSksXG4gICAgICAgIHN5bmNlZENvdW50OiAwLFxuICAgICAgICB0b3RhbDogMFxuICAgICAgfVxuXG4gICAgICBmb3IgKGNvbnN0IHNjb3BlUm93IG9mIGF3YWl0IHNjb3BlU3RvcmUuYWN0aXZlU2NvcGVzKCkpIHtcbiAgICAgICAgLy8gQ3VtdWxhdGUgc2NvcGUgcHJvZ3Jlc3Mgb250byB0aGUgY291bnRzIG9mIHRoZSBzY29wZXMgYWxyZWFkeSBwdWxsZWQgc28gYSBzaW5nbGVcbiAgICAgICAgLy8gc2NvcGUncyBwZXItcGFnZSBwcm9ncmVzcyByZWFkcyBleGFjdGx5IGl0cyBvd24gY291bnRzIChiYXNlIDApLCBhbmQgbXVsdGktc2NvcGVcbiAgICAgICAgLy8gcHVsbHMgcmVwb3J0IGEgcnVubmluZyBjdW11bGF0aXZlIHRvdGFsIGFjcm9zcyBldmVyeSBzY29wZS5cbiAgICAgICAgY29uc3QgYmFzZVBhZ2VzID0gcmVzdWx0LnBhZ2VzXG4gICAgICAgIGNvbnN0IGJhc2VTeW5jZWRDb3VudCA9IHJlc3VsdC5zeW5jZWRDb3VudFxuICAgICAgICBjb25zdCBiYXNlVG90YWwgPSByZXN1bHQudG90YWxcbiAgICAgICAgY29uc3Qgc2NvcGVSZXN1bHQgPSBhd2FpdCBTeW5jQXBpQ2xpZW50LnB1bGxDaGFuZ2VzKHtcbiAgICAgICAgICBhcHBseVN5bmMsXG4gICAgICAgICAgYXV0aGVudGljYXRpb25Ub2tlbixcbiAgICAgICAgICBiYXRjaFNpemU6IHRoaXMuY29uZmlnLmJhdGNoU2l6ZSxcbiAgICAgICAgICBsb2FkQ3Vyc29yOiBhc3luYyAoKSA9PiBhd2FpdCBzY29wZVN0b3JlLmxvYWRDdXJzb3Ioc2NvcGVSb3cpLFxuICAgICAgICAgIG9uUHJvZ3Jlc3M6IG9uUHJvZ3Jlc3MgPyAocHJvZ3Jlc3MpID0+IG9uUHJvZ3Jlc3Moe1xuICAgICAgICAgICAgcGFnZXM6IGJhc2VQYWdlcyArIHByb2dyZXNzLnBhZ2VzLFxuICAgICAgICAgICAgc3luY2VkQ291bnQ6IGJhc2VTeW5jZWRDb3VudCArIHByb2dyZXNzLnN5bmNlZENvdW50LFxuICAgICAgICAgICAgdG90YWw6IGJhc2VUb3RhbCArIHByb2dyZXNzLnRvdGFsXG4gICAgICAgICAgfSkgOiB1bmRlZmluZWQsXG4gICAgICAgICAgcG9zdENoYW5nZXM6IGFzeW5jIChwYXlsb2FkKSA9PiBhd2FpdCB0aGlzLmNvbmZpZy5wb3N0Q2hhbmdlcyh7XG4gICAgICAgICAgICAuLi5wYXlsb2FkLFxuICAgICAgICAgICAgLy8gT25seSB0aGUgYWxsLXR5cGVzIHNjb3BlIGNhcnJpZXMgdGhlIHR5cGUgbGlzdDsgYSB0eXBlLWRlY2xhcmVkIHNjb3BlIG5lZWRzIG5vbmUuXG4gICAgICAgICAgICBzY29wZToge1xuICAgICAgICAgICAgICBjb25kaXRpb25zOiBzY29wZVJvdy5jb25kaXRpb25zLFxuICAgICAgICAgICAgICByZXNvdXJjZVR5cGU6IHNjb3BlUm93LnJlc291cmNlVHlwZSxcbiAgICAgICAgICAgICAgLi4uKHNjb3BlUm93LnJlc291cmNlVHlwZSA9PT0gbnVsbCA/IHtyZXNvdXJjZVR5cGVzOiB0aGlzLnVzZXJTY29wZVJlc291cmNlVHlwZXMoKX0gOiB7fSlcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KSxcbiAgICAgICAgICBzYXZlQ3Vyc29yOiBhc3luYyAoY3Vyc29yKSA9PiBhd2FpdCBzY29wZVN0b3JlLnNhdmVDdXJzb3Ioc2NvcGVSb3csIGN1cnNvcilcbiAgICAgICAgfSlcblxuICAgICAgICByZXN1bHQuY2hhbmdlZCB8fD0gc2NvcGVSZXN1bHQuY2hhbmdlZFxuICAgICAgICByZXN1bHQucGFnZXMgKz0gc2NvcGVSZXN1bHQucGFnZXNcbiAgICAgICAgcmVzdWx0LnN5bmNlZENvdW50ICs9IHNjb3BlUmVzdWx0LnN5bmNlZENvdW50XG4gICAgICAgIHJlc3VsdC50b3RhbCArPSBzY29wZVJlc3VsdC50b3RhbFxuXG4gICAgICAgIGZvciAoY29uc3QgW3Jlc291cmNlVHlwZSwgY291bnRdIG9mIE9iamVjdC5lbnRyaWVzKHNjb3BlUmVzdWx0LnJlc291cmNlQ291bnRzKSkge1xuICAgICAgICAgIHJlc3VsdC5yZXNvdXJjZUNvdW50c1tyZXNvdXJjZVR5cGVdID0gKHJlc3VsdC5yZXNvdXJjZUNvdW50c1tyZXNvdXJjZVR5cGVdIHx8IDApICsgY291bnRcbiAgICAgICAgfVxuICAgICAgICBmb3IgKGNvbnN0IFtyZXNvdXJjZVR5cGUsIGNoYW5nZWRdIG9mIE9iamVjdC5lbnRyaWVzKHNjb3BlUmVzdWx0LnJlc291cmNlQ2hhbmdlZCkpIHtcbiAgICAgICAgICByZXN1bHQucmVzb3VyY2VDaGFuZ2VkW3Jlc291cmNlVHlwZV0gfHw9IGNoYW5nZWRcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBjb21iaW5lZFJlc3VsdCA9IHJlc3VsdFxuICAgIH0pXG5cbiAgICByZXR1cm4gY29tYmluZWRSZXN1bHRcbiAgfVxuXG4gIC8qKlxuICAgKiBCdWlsZHMgdGhlIGRlcml2ZWQgcmVtb3RlLWNoYW5nZSBhcHBsaWVyIHNoYXJlZCBieSBwdWxscyBhbmQgcmVhbHRpbWUgcHVzaGVzOlxuICAgKiBhcHBsaWVzIHRocm91Z2ggdGhlIGRlY2xhcmVkIHJlc291cmNlIGNvbmZpZ3MsIHJlZ2lzdGVycyBlYWNoIHdyaXR0ZW4gcmVjb3JkXG4gICAqIGZvciBlY2hvIHN1cHByZXNzaW9uICh0cmFja2VkIHJlc291cmNlcyBkbyBub3QgcmUtcXVldWUgYXBwbGllZCBjaGFuZ2VzKSwgYW5kXG4gICAqIGZhaWxzIGxvdWRseSBpbnN0ZWFkIG9mIHNpbGVudGx5IHNraXBwaW5nIHVuY29uZmlndXJlZCByZXNvdXJjZXMuXG4gICAqIEBwYXJhbSB7e3NvdXJjZT86IHN0cmluZ319IFthcmdzXSAtIEVycm9yIGNvbnRleHQgZGVzY3JpYmluZyB3aGVyZSB0aGUgY2hhbmdlIGNhbWUgZnJvbS5cbiAgICogQHJldHVybnMgeyhzeW5jOiBpbXBvcnQoXCIuL3N5bmMtYXBpLWNsaWVudC10eXBlcy5qc1wiKS5TeW5jQ2hhbmdlRW52ZWxvcGUpID0+IFByb21pc2U8aW1wb3J0KFwiLi9zeW5jLWFwaS1jbGllbnQtdHlwZXMuanNcIikuU3luY0NoYW5nZUFwcGx5UmVzdWx0Pn0gTG91ZCByZW1vdGUtY2hhbmdlIGFwcGxpZXIuXG4gICAqL1xuICByZW1vdGVBcHBseVN5bmMoe3NvdXJjZSA9IFwicHVsbGVkIGNoYW5nZVwifSA9IHt9KSB7XG4gICAgY29uc3QgcHVsbFJlc291cmNlQ29uZmlncyA9IHRoaXMucHVsbFJlc291cmNlQ29uZmlncygpXG4gICAgY29uc3QgYXBwbGllciA9IFN5bmNBcGlDbGllbnQucmVzb3VyY2VBcHBsaWVyKHB1bGxSZXNvdXJjZUNvbmZpZ3MsIChyZWNvcmQpID0+IHRoaXMubWFya1JlbW90ZUFwcGx5KHJlY29yZCkpXG5cbiAgICByZXR1cm4gYXN5bmMgKHN5bmMpID0+IHtcbiAgICAgIGNvbnN0IHJlc291cmNlVHlwZSA9IHN5bmMucmVzb3VyY2VUeXBlKClcblxuICAgICAgaWYgKCFyZXNvdXJjZVR5cGUgfHwgIXB1bGxSZXNvdXJjZUNvbmZpZ3NbcmVzb3VyY2VUeXBlXSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYE5vIHN5bmMgcmVzb3VyY2Ugd2l0aCBwdWxsIGF0dHJpYnV0ZXMgY29uZmlndXJlZCBmb3IgJHtzb3VyY2V9OiAke1N0cmluZyhyZXNvdXJjZVR5cGUpfWApXG4gICAgICB9XG5cbiAgICAgIHJldHVybiBhd2FpdCBhcHBsaWVyKHN5bmMpXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJlc29sdmVzIHRoZSBzaGFyZWQgYXBwLWxpZmV0aW1lIHdlYnNvY2tldCBjb25uZWN0aW9uIGFsbCBzeW5jIHRyYWZmaWNcbiAgICogcmlkZXMsIG9yIG51bGwgd2hlbiBub25lIGlzIGNvbmZpZ3VyZWQuIEJ1aWx0IG9uY2UgYW5kIG1lbW9pemVkIChwZXJcbiAgICogY2xpZW50KTogYW4gYXBwLXByb3ZpZGVkIGBzeW5jLmNsaWVudC53ZWJzb2NrZXRDbGllbnRgIGluc3RhbmNlIHdpbnMgKHRoZVxuICAgKiBmcm9udGVuZC1tb2RlbCB0cmFuc3BvcnQgY2FuIHBhc3MgaXRzIG93biBjbGllbnQgc28gb25lIHNvY2tldCBjYXJyaWVzXG4gICAqIGV2ZXJ5dGhpbmcpLCBlbHNlIGEgZnJhbWV3b3JrLW93bmVkIHJlY29ubmVjdGluZyB7QGxpbmsgVmVsb2Npb3VzV2Vic29ja2V0Q2xpZW50fVxuICAgKiBidWlsdCBmcm9tIGBzeW5jLmNsaWVudC53ZWJzb2NrZXRVcmxgLiBUaGUgcmVhbHRpbWUgYnJpZGdlIHJpZGVzIHRoaXNcbiAgICogY29ubmVjdGlvbiB3aXRob3V0IG93bmluZyBpdHMgbGlmZWN5Y2xlOyB3aGVuIG5laXRoZXIgaXMgY29uZmlndXJlZCB0aGVcbiAgICogYnJpZGdlIGZhbGxzIGJhY2sgdG8gdGhlIGRlcHJlY2F0ZWQgcGVyLWN5Y2xlIGByZWFsdGltZS5jcmVhdGVDbGllbnRgLlxuICAgKiBAcmV0dXJucyB7aW1wb3J0KFwiLi9zeW5jLWNsaWVudC10eXBlcy5qc1wiKS5TeW5jQ2xpZW50U2hhcmVkQ29ubmVjdGlvbiB8IG51bGx9IFNoYXJlZCB3ZWJzb2NrZXQgY29ubmVjdGlvbiwgb3IgbnVsbC5cbiAgICovXG4gIHN5bmNDb25uZWN0aW9uKCkge1xuICAgIGlmICh0aGlzLl9zeW5jQ29ubmVjdGlvbiAhPT0gdW5kZWZpbmVkKSByZXR1cm4gdGhpcy5fc3luY0Nvbm5lY3Rpb25cblxuICAgIGlmICh0aGlzLmNvbmZpZy53ZWJzb2NrZXRDbGllbnQpIHtcbiAgICAgIHRoaXMuX3N5bmNDb25uZWN0aW9uID0gdGhpcy5jb25maWcud2Vic29ja2V0Q2xpZW50XG4gICAgfSBlbHNlIGlmICh0aGlzLmNvbmZpZy53ZWJzb2NrZXRVcmwpIHtcbiAgICAgIGNvbnN0IHVybCA9IHR5cGVvZiB0aGlzLmNvbmZpZy53ZWJzb2NrZXRVcmwgPT09IFwiZnVuY3Rpb25cIiA/IHRoaXMuY29uZmlnLndlYnNvY2tldFVybCgpIDogdGhpcy5jb25maWcud2Vic29ja2V0VXJsXG5cbiAgICAgIHRoaXMuX3N5bmNDb25uZWN0aW9uID0gdXJsID8gbmV3IFZlbG9jaW91c1dlYnNvY2tldENsaWVudCh7dXJsfSkgOiBudWxsXG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuX3N5bmNDb25uZWN0aW9uID0gbnVsbFxuICAgIH1cblxuICAgIHJldHVybiB0aGlzLl9zeW5jQ29ubmVjdGlvblxuICB9XG5cbiAgLyoqXG4gICAqIFN1YnNjcmliZXMgdGhlIGRlcml2ZWQgcmVhbHRpbWUgY2hhbm5lbHMgc28gcHVzaGVkIHdlYnNvY2tldCBjaGFuZ2VzIGFwcGx5XG4gICAqIHRocm91Z2ggdGhlIHNhbWUgZGVyaXZlZCBhcHBsaWVyIGFzIHB1bGxzIChpZGVtcG90ZW50LCBzaW5nbGUtZmxpZ2h0ZWQpLlxuICAgKiBAcGFyYW0ge1JldHVyblR5cGU8dHlwZW9mIEpTT04ucGFyc2U+fSBbY29udGV4dF0gLSBBcHAgY29udGV4dCBwYXNzZWQgdG8gdGhlIGRlcHJlY2F0ZWQgYHN5bmMuY2xpZW50LnJlYWx0aW1lLmNoYW5uZWxzYCBjYWxsYmFjayAocnVudGltZSBzY29wZSB2YWx1ZXMpLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn1cbiAgICovXG4gIGFzeW5jIHN1YnNjcmliZVJlYWx0aW1lKGNvbnRleHQpIHtcbiAgICBhd2FpdCB0aGlzLnJlYWx0aW1lQnJpZGdlKCkuc3Vic2NyaWJlKGNvbnRleHQpXG4gIH1cblxuICAvKipcbiAgICogU3Vic2NyaWJlcyB0aGUgc2VydmVyLWVudW1lcmF0ZWQgdXNlciBzY29wZTogXCJldmVyeXRoaW5nIG15IGFiaWxpdHkgY2FuXG4gICAqIHNlZVwiLiBEZWNsYXJlcyBhIHVzZXIgc2NvcGUgKGVtcHR5IGNvbmRpdGlvbnMpIGZvciBldmVyeSBwdWxsYWJsZSBzeW5jZWRcbiAgICogcmVzb3VyY2UgdHlwZSwgc3Vic2NyaWJlcyByZWFsdGltZSBzbyB0aGVpciBmcmFtZXdvcmsgc3luYyBjaGFubmVsXG4gICAqIHN1YnNjcmlwdGlvbnMgZ28gbGl2ZSwgYW5kIHB1bGxzIHNvIHRoZSBkZXZpY2UgY2F0Y2hlcyB1cC4gVGhlIHNlcnZlclxuICAgKiBhdXRob3JpemVzIGVhY2ggZW1wdHktY29uZGl0aW9ucyBzY29wZSB0aHJvdWdoIHRoZSBhcHAgc3luYyByZXNvdXJjZSdzXG4gICAqIGBhdXRob3JpemVDaGFuZ2VzYCBhbmQgcmUtY2hlY2tzIHJlY29yZCBhY2Nlc3MgcGVyIGRlbGl2ZXJ5LCBzbyB0aGUgY2xpZW50XG4gICAqIHN1YnNjcmliZXMgd2l0aCBqdXN0IGl0cyB0b2tlbiBhbmQgdGhlIHNlcnZlciBkZWNpZGVzIG1lbWJlcnNoaXAuXG4gICAqIElkZW1wb3RlbnQgYW5kIHNpbmdsZS1mbGlnaHRlZCBsaWtlIHtAbGluayBTeW5jQ2xpZW50I3N1YnNjcmliZVJlYWx0aW1lfS5cbiAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59XG4gICAqL1xuICBhc3luYyBzdWJzY3JpYmVVc2VyU2NvcGUoKSB7XG4gICAgaWYgKHRoaXMuX3VzZXJTY29wZVN0YXRlID09PSBcInN1YnNjcmliZWRcIikgcmV0dXJuXG5cbiAgICBpZiAoIXRoaXMuX3N1YnNjcmliZVVzZXJTY29wZVByb21pc2UpIHtcbiAgICAgIHRoaXMuX3N1YnNjcmliZVVzZXJTY29wZVByb21pc2UgPSB0aGlzLl9zdWJzY3JpYmVVc2VyU2NvcGUoKS5maW5hbGx5KCgpID0+IHtcbiAgICAgICAgdGhpcy5fc3Vic2NyaWJlVXNlclNjb3BlUHJvbWlzZSA9IG51bGxcbiAgICAgIH0pXG4gICAgfVxuXG4gICAgYXdhaXQgdGhpcy5fc3Vic2NyaWJlVXNlclNjb3BlUHJvbWlzZVxuICB9XG5cbiAgLyoqXG4gICAqIERlY2xhcmVzIGFuZCBhY3RpdmF0ZXMgdGhlIHVzZXIgc2NvcGUgZm9yIGV2ZXJ5IHB1bGxhYmxlIHJlc291cmNlLCB0aGVuXG4gICAqIHN1YnNjcmliZXMgcmVhbHRpbWUgYW5kIHB1bGxzLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn1cbiAgICovXG4gIGFzeW5jIF9zdWJzY3JpYmVVc2VyU2NvcGUoKSB7XG4gICAgdGhpcy5fdXNlclNjb3BlU3RhdGUgPSBcInN1YnNjcmliaW5nXCJcblxuICAgIGF3YWl0IHRoaXMuc2NvcGVTdG9yZSgpLmZpbmRPckNyZWF0ZVNjb3BlKGF3YWl0IHRoaXMudXNlclNjb3BlKCkpXG5cbiAgICBhd2FpdCB0aGlzLnN1YnNjcmliZVJlYWx0aW1lKClcbiAgICBhd2FpdCB0aGlzLnB1bGwoKVxuXG4gICAgdGhpcy5fdXNlclNjb3BlU3RhdGUgPSBcInN1YnNjcmliZWRcIlxuICB9XG5cbiAgLyoqXG4gICAqIFVuc3Vic2NyaWJlcyB0aGUgdXNlciBzY29wZTogZGVhY3RpdmF0ZXMgdGhlIHBlci1yZXNvdXJjZSB1c2VyIHNjb3BlcyBhbmRcbiAgICogY2xvc2VzIHRoZSByZWFsdGltZSBjaGFubmVsIHN1YnNjcmlwdGlvbnMuIFRoZSBzaGFyZWQgd2Vic29ja2V0IGNvbm5lY3Rpb25cbiAgICogc3RheXMgb3BlbiB3aGVuIG9uZSBpcyBjb25maWd1cmVkIChzaWduLW91dCBkcm9wcyBzdWJzY3JpcHRpb25zIHdpdGhvdXRcbiAgICogZGlzY29ubmVjdGluZyksIHNvIGEgc3Vic2VxdWVudCBzaWduLWluIHJlc3Vic2NyaWJlcyBvdmVyIHRoZSBzYW1lIHNvY2tldC5cbiAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59XG4gICAqL1xuICBhc3luYyB1bnN1YnNjcmliZVVzZXJTY29wZSgpIHtcbiAgICBhd2FpdCB0aGlzLnNjb3BlU3RvcmUoKS5kZWFjdGl2YXRlKGF3YWl0IHRoaXMudXNlclNjb3BlKCkpXG5cbiAgICBhd2FpdCB0aGlzLnVuc3Vic2NyaWJlUmVhbHRpbWUoKVxuXG4gICAgdGhpcy5fdXNlclNjb3BlU3RhdGUgPSBcInVuc3Vic2NyaWJlZFwiXG4gICAgdGhpcy5fc3Vic2NyaWJlVXNlclNjb3BlUHJvbWlzZSA9IG51bGxcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgdXNlciBzY29wZTogYSBzaW5nbGUgYWxsLXR5cGVzIHNjb3BlIChudWxsIHJlc291cmNlVHlwZSkgd2l0aCBlbXB0eVxuICAgKiBjb25kaXRpb25zLCBwYXJ0aXRpb25lZCBsb2NhbGx5IGJ5IG93bmVyLiBPbmUgc2NvcGUgLSBub3Qgb25lIHBlciByZXNvdXJjZVxuICAgKiB0eXBlIC0gc28gdGhlIHNlcnZlciBhdXRob3JpemVzIHRoZSBjYWxsZXIgb25jZSBwZXIgc3luYyBhbmQgcGVyIHN1YnNjcmliZSxcbiAgICogaG93ZXZlciBtYW55IHJlc291cmNlIHR5cGVzIGl0IHNlcnZlcy4gVGhlIHNlcnZlciBkZWNpZGVzIHdoaWNoIHR5cGVzIHRoZVxuICAgKiBjYWxsZXIgbWF5IHNlZTsgdGhlIGNsaWVudCBhcHBsaWVzIGVhY2ggcHVsbGVkIHJvdyBieSB0aGUgcmVzb3VyY2UgdHlwZSBvblxuICAgKiBpdHMgb3duIGVudmVsb3BlLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxpbXBvcnQoXCIuL3N5bmMtY2xpZW50LXR5cGVzLmpzXCIpLlNlcmlhbGl6ZWRTeW5jU2NvcGU+fSBUaGUgdXNlciBzY29wZS5cbiAgICovXG4gIGFzeW5jIHVzZXJTY29wZSgpIHtcbiAgICByZXR1cm4ge2NvbmRpdGlvbnM6IHt9LCBvd25lcjogYXdhaXQgdGhpcy51c2VyU2NvcGVPd25lcigpLCByZXNvdXJjZVR5cGU6IG51bGx9XG4gIH1cblxuICAvKipcbiAgICogVGhlIHJlc291cmNlIHR5cGVzIHRoZSB1c2VyIHNjb3BlIGNvdmVyczogZXZlcnkgZGVjbGFyZWQgcmVzb3VyY2UgdGhhdFxuICAgKiByZWNlaXZlcyBwdWxsZWQgY2hhbmdlcyAoaGFzIHB1bGwgYGF0dHJpYnV0ZXNgKSwgc28gdGhlIGNsaWVudCBjYW4gYXBwbHlcbiAgICogdGhlbS4gU2VudCB3aXRoIHRoZSBzY29wZSBhcyBhIGRlbGl2ZXJ5L3R5cGUgZmlsdGVyIC0gaXQgbmFycm93cywgbmV2ZXJcbiAgICogd2lkZW5zLCB3aGF0IHRoZSBzZXJ2ZXIncyBhdXRob3JpemF0aW9uIGFscmVhZHkgYWxsb3dzLCBhbmQgaXQga2VlcHMgYVxuICAgKiBicm9hZGNhc3Qgb2YgYSB0eXBlIHRoaXMgY2xpZW50IGNhbm5vdCBhcHBseSBmcm9tIHJlYWNoaW5nIHRoZSBzZXJ2ZXInc1xuICAgKiBwZXItZGVsaXZlcnkgYWNjZXNzIHJlLWNoZWNrIChhIGRhdGFiYXNlIHF1ZXJ5IHBlciBtYXRjaGVkIGJyb2FkY2FzdCwgcGVyXG4gICAqIHN1YnNjcmliZWQgZGV2aWNlKS5cbiAgICogQHJldHVybnMge3N0cmluZ1tdfSBQdWxsYWJsZSByZXNvdXJjZSB0eXBlIG5hbWVzLlxuICAgKi9cbiAgdXNlclNjb3BlUmVzb3VyY2VUeXBlcygpIHtcbiAgICByZXR1cm4gT2JqZWN0LmtleXModGhpcy5wdWxsUmVzb3VyY2VDb25maWdzKCkpXG4gIH1cblxuICAvKipcbiAgICogUmVzb2x2ZXMgdGhlIGxvY2FsIHBhcnRpdGlvbiBrZXkgZm9yIHRoZSB1c2VyIHNjb3BlOiB0aGUgY3VycmVudGx5XG4gICAqIGNvbmZpZ3VyZWQgYXV0aGVudGljYXRlZCBpZGVudGl0eSAodGhlIHN5bmMgYXV0aCB0b2tlbikuIFBhcnRpdGlvbmluZyB0aGVcbiAgICogdXNlciBzY29wZSdzIGxvY2FsIHNjb3BlL2N1cnNvciByb3dzIGJ5IHRoaXMgb3duZXIga2VlcHMgdGhlXG4gICAqIGVtcHR5LWNvbmRpdGlvbnMgY3Vyc29yIGZyb20gbGVha2luZyBhY3Jvc3MgYWNjb3VudHMgb24gYSBzaGFyZWQgZGV2aWNlXG4gICAqIChhY2NvdW50IEIgc2lnbmluZyBpbiBhZnRlciBhY2NvdW50IEEgZ2V0cyBhIGZyZXNoIGN1cnNvcikgd2hpbGUgdGhlIHNhbWVcbiAgICogYWNjb3VudCByZWNvbm5lY3Rpbmcga2VlcHMgaXRzIGN1cnNvciBjb250aW51aXR5LiBUaGUgb3duZXIgaXMgYSBsb2NhbFxuICAgKiBwYXJ0aXRpb24ga2V5IG9ubHkg4oCUIHB1bGxzIHN0aWxsIHBvc3QgZW1wdHkgY29uZGl0aW9ucyB0byB0aGUgc2VydmVyLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxzdHJpbmc+fSBVc2VyLXNjb3BlIG93bmVyIHBhcnRpdGlvbiBrZXkuXG4gICAqL1xuICBhc3luYyB1c2VyU2NvcGVPd25lcigpIHtcbiAgICByZXR1cm4gU3RyaW5nKGF3YWl0IHRoaXMuY29uZmlnLmF1dGhlbnRpY2F0aW9uVG9rZW4oKSlcbiAgfVxuXG4gIC8qKlxuICAgKiBVbnN1YnNjcmliZXMgdGhlIHJlYWx0aW1lIGNoYW5uZWxzIGFuZCBkaXNjb25uZWN0cyB0aGUgd2Vic29ja2V0IGNsaWVudCAoaWRlbXBvdGVudCkuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fVxuICAgKi9cbiAgYXN5bmMgdW5zdWJzY3JpYmVSZWFsdGltZSgpIHtcbiAgICBhd2FpdCB0aGlzLnJlYWx0aW1lQnJpZGdlKCkudW5zdWJzY3JpYmUoKVxuICB9XG5cbiAgLyoqXG4gICAqIFJlcG9ydHMgdGhlIHJlYWx0aW1lIHN1YnNjcmlwdGlvbiBzdGF0ZSBhbmQgcGVyLWNoYW5uZWwgcmVhZGluZXNzLlxuICAgKiBAcmV0dXJucyB7UmV0dXJuVHlwZTxTeW5jUmVhbHRpbWVCcmlkZ2VbXCJzdGF0dXNcIl0+fSBSZWFsdGltZSBzdGF0dXMuXG4gICAqL1xuICByZWFsdGltZVN0YXR1cygpIHtcbiAgICByZXR1cm4gdGhpcy5yZWFsdGltZUJyaWRnZSgpLnN0YXR1cygpXG4gIH1cblxuICAvKipcbiAgICogQXdhaXRzIGFsbCBwZW5kaW5nIHJlYWx0aW1lIG1lc3NhZ2UgYXBwbGllcyBhbmQgYW55IHNjaGVkdWxlZFxuICAgKiBwdWxsLW9uLXJlY29ubmVjdCAodXNlZnVsIGluIHRlc3RzIGFuZCBzaHV0ZG93biBmbG93cykuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fVxuICAgKi9cbiAgYXN5bmMgd2FpdEZvclJlYWx0aW1lQXBwbGllZCgpIHtcbiAgICBhd2FpdCB0aGlzLnJlYWx0aW1lQnJpZGdlKCkud2FpdEZvckFwcGxpZWQoKVxuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIGxhemlseSBidWlsdCByZWFsdGltZSBicmlkZ2UuXG4gICAqIEByZXR1cm5zIHtTeW5jUmVhbHRpbWVCcmlkZ2V9IFJlYWx0aW1lIGJyaWRnZS5cbiAgICovXG4gIHJlYWx0aW1lQnJpZGdlKCkge1xuICAgIHRoaXMuX3JlYWx0aW1lQnJpZGdlIHx8PSBuZXcgU3luY1JlYWx0aW1lQnJpZGdlKHtzeW5jQ2xpZW50OiB0aGlzfSlcblxuICAgIHJldHVybiB0aGlzLl9yZWFsdGltZUJyaWRnZVxuICB9XG5cbiAgLyoqXG4gICAqIFF1ZXVlcyBhIGxvY2FsIG1vZGVsIGNoYW5nZSBhcyBhIHBlbmRpbmcgc3luYyByb3cgYW5kIHNjaGVkdWxlcyBhbiBpbW1lZGlhdGVcbiAgICogcmVwbGF5IGF0dGVtcHQgKGtlcHQgcGVuZGluZyB3aGlsZSBvZmZsaW5lIG9yIHdoZW4gdGhlIGJhY2tlbmQgcmVqZWN0cyBpdCkuXG4gICAqIEBwYXJhbSB7e3Jlc291cmNlOiBSZXR1cm5UeXBlPHR5cGVvZiBKU09OLnBhcnNlPiwgZGF0YT86IFJlY29yZDxzdHJpbmcsIFJldHVyblR5cGU8dHlwZW9mIEpTT04ucGFyc2U+Piwgc3luY1R5cGU/OiBzdHJpbmd9fSBhcmdzIC0gUXVldWUgYXJncy5cbiAgICogQHJldHVybnMge1Byb21pc2U8UmV0dXJuVHlwZTx0eXBlb2YgSlNPTi5wYXJzZT4+fSBQZW5kaW5nIGxvY2FsIHN5bmMgcm93LlxuICAgKi9cbiAgYXN5bmMgcXVldWUoe2RhdGEsIHJlc291cmNlLCBzeW5jVHlwZX0pIHtcbiAgICBjb25zdCByZXNvdXJjZUNvbmZpZyA9IHRoaXMucmVzb3VyY2VDb25maWdGb3IocmVzb3VyY2UpXG4gICAgY29uc3Qgc3luY1JvdyA9IGF3YWl0IFN5bmNBcGlDbGllbnQucXVldWVMb2NhbFN5bmMoe1xuICAgICAgYm9vbGVhbkF0dHJpYnV0ZXM6IHJlc291cmNlQ29uZmlnLmJvb2xlYW5BdHRyaWJ1dGVzIHx8IFtdLFxuICAgICAgZGF0YSxcbiAgICAgIGxvY2FsT25seUF0dHJpYnV0ZXM6IHJlc291cmNlQ29uZmlnLmxvY2FsT25seUF0dHJpYnV0ZXMgfHwgW10sXG4gICAgICByZXNvdXJjZSxcbiAgICAgIHN5bmNNb2RlbDogdGhpcy5jb25maWcuc3luY01vZGVsLFxuICAgICAgc3luY1R5cGU6IHN5bmNUeXBlID8/IHRoaXMuZGVmYXVsdFN5bmNUeXBlKHtvcGVyYXRpb246IFwidXBkYXRlXCIsIHJlY29yZDogcmVzb3VyY2UsIHJlc291cmNlQ29uZmlnfSlcbiAgICB9KVxuXG4gICAgdGhpcy5zY2hlZHVsZVJlcGxheSgpXG5cbiAgICByZXR1cm4gc3luY1Jvd1xuICB9XG5cbiAgLyoqXG4gICAqIERyYWlucyBwZW5kaW5nIGxvY2FsIHN5bmMgcm93cyB0byB0aGUgYmFja2VuZCAoc2luZ2xlLWZsaWdodGVkLCBvbmxpbmUtZ2F0ZWQpLlxuICAgKiBSb3dzIGFyZSBvbmx5IG1hcmtlZCBzdWNjZXNzZnVsIGFmdGVyIHRoZSBiYWNrZW5kIGFja25vd2xlZGdlcyB0aGVtLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn1cbiAgICovXG4gIGFzeW5jIHJlcGxheVBlbmRpbmcoKSB7XG4gICAgaWYgKCEoYXdhaXQgdGhpcy5pc09ubGluZSgpKSkgcmV0dXJuXG5cbiAgICBhd2FpdCBTeW5jQXBpQ2xpZW50LnNpbmdsZUZsaWdodChgdmVsb2Npb3VzLXN5bmMtY2xpZW50LXJlcGxheS0ke3RoaXMuX2NsaWVudE51bWJlcn1gLCBhc3luYyAoKSA9PiB7XG4gICAgICBhd2FpdCBTeW5jQXBpQ2xpZW50LnJlcGxheUxvY2FsU3luY3Moe1xuICAgICAgICBhdXRoZW50aWNhdGlvblRva2VuOiBhd2FpdCB0aGlzLmNvbmZpZy5hdXRoZW50aWNhdGlvblRva2VuKCksXG4gICAgICAgIGJhdGNoU2l6ZTogdGhpcy5jb25maWcuYmF0Y2hTaXplLFxuICAgICAgICBwb3N0UmVwbGF5OiB0aGlzLmNvbmZpZy5wb3N0UmVwbGF5LFxuICAgICAgICBzeW5jTW9kZWw6IHRoaXMuY29uZmlnLnN5bmNNb2RlbFxuICAgICAgfSlcbiAgICB9KVxuICB9XG5cbiAgLyoqXG4gICAqIFNjaGVkdWxlcyBhIGJhY2tncm91bmQgcmVwbGF5IGF0dGVtcHQgd2l0aG91dCBibG9ja2luZyB0aGUgY2FsbGVyLlxuICAgKiBGYWlsdXJlcyBnbyB0byBjb25maWcub25FcnJvciAob3IgcmV0aHJvdyB3aGVuIG5vbmUgaXMgY29uZmlndXJlZCkuXG4gICAqIEByZXR1cm5zIHt2b2lkfVxuICAgKi9cbiAgc2NoZWR1bGVSZXBsYXkoKSB7XG4gICAgdGhpcy5fc2NoZWR1bGVkUmVwbGF5ID0gKGFzeW5jICgpID0+IHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGF3YWl0IHRoaXMucmVwbGF5UGVuZGluZygpXG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICB0aGlzLnJlcG9ydEVycm9yKC8qKiBAdHlwZSB7RXJyb3J9ICovIChlcnJvcikpXG4gICAgICB9XG4gICAgfSkoKVxuICB9XG5cbiAgLyoqXG4gICAqIEF3YWl0cyB0aGUgbGFzdCBzY2hlZHVsZWQgYmFja2dyb3VuZCByZXBsYXkgKHVzZWZ1bCBpbiB0ZXN0cyBhbmQgc2h1dGRvd24gZmxvd3MpLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn1cbiAgICovXG4gIGFzeW5jIHdhaXRGb3JTY2hlZHVsZWRSZXBsYXkoKSB7XG4gICAgaWYgKHRoaXMuX3NjaGVkdWxlZFJlcGxheSkgYXdhaXQgdGhpcy5fc2NoZWR1bGVkUmVwbGF5XG4gIH1cblxuICAvKipcbiAgICogUmVwb3J0cyBhIGJhY2tncm91bmQgc3luYyBmYWlsdXJlLlxuICAgKiBAcGFyYW0ge0Vycm9yfSBlcnJvciAtIEJhY2tncm91bmQgZmFpbHVyZS5cbiAgICogQHJldHVybnMge3ZvaWR9XG4gICAqL1xuICByZXBvcnRFcnJvcihlcnJvcikge1xuICAgIGlmICh0aGlzLmNvbmZpZy5vbkVycm9yKSB7XG4gICAgICB0aGlzLmNvbmZpZy5vbkVycm9yKGVycm9yKVxuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgdGhyb3cgZXJyb3JcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXNvbHZlcyBjb25uZWN0aXZpdHkgdGhyb3VnaCB0aGUgY29uZmlndXJlZCBnYXRlLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxib29sZWFuPn0gV2hldGhlciB0aGUgYmFja2VuZCBpcyBjb25zaWRlcmVkIHJlYWNoYWJsZS5cbiAgICovXG4gIGFzeW5jIGlzT25saW5lKCkge1xuICAgIGlmICghdGhpcy5jb25maWcuaXNPbmxpbmUpIHJldHVybiB0cnVlXG5cbiAgICByZXR1cm4gKGF3YWl0IHRoaXMuY29uZmlnLmlzT25saW5lKCkpICE9PSBmYWxzZVxuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIHNjb3BlIHN0b3JlIGJhY2tpbmcgZGVjbGFyZWQgc2NvcGVzIGFuZCBjdXJzb3JzLlxuICAgKiBAcmV0dXJucyB7aW1wb3J0KFwiLi9zeW5jLXNjb3BlLXN0b3JlLmpzXCIpLmRlZmF1bHR9IFNjb3BlIHN0b3JlLlxuICAgKi9cbiAgc2NvcGVTdG9yZSgpIHtcbiAgICB0aGlzLl9zY29wZVN0b3JlIHx8PSBuZXcgU3luY1Njb3BlU3RvcmUoe2NvbmZpZ3VyYXRpb246IHRoaXMuY29uZmlnLmNvbmZpZ3VyYXRpb259KVxuXG4gICAgcmV0dXJuIHRoaXMuX3Njb3BlU3RvcmVcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXNvbHZlcyB0aGUgZGVjbGFyZWQgcmVzb3VyY2UgY29uZmlnIGZvciBhIGxvY2FsIHJlY29yZC5cbiAgICogQHBhcmFtIHtSZXR1cm5UeXBlPHR5cGVvZiBKU09OLnBhcnNlPn0gcmVzb3VyY2UgLSBMb2NhbCBtb2RlbCByZWNvcmQuXG4gICAqIEByZXR1cm5zIHtpbXBvcnQoXCIuL3N5bmMtY2xpZW50LXR5cGVzLmpzXCIpLlN5bmNDbGllbnRSZXNvdXJjZUNvbmZpZ30gRGVjbGFyZWQgcmVzb3VyY2UgY29uZmlnLlxuICAgKi9cbiAgcmVzb3VyY2VDb25maWdGb3IocmVzb3VyY2UpIHtcbiAgICBjb25zdCBtb2RlbENsYXNzID0gcmVzb3VyY2U/LmNvbnN0cnVjdG9yXG5cbiAgICBpZiAodHlwZW9mIG1vZGVsQ2xhc3M/LmdldE1vZGVsTmFtZSAhPT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYFN5bmMgcmVzb3VyY2VzIG11c3QgYmUgbW9kZWwgcmVjb3JkcyB3aXRoIGEgc3RhdGljIGdldE1vZGVsTmFtZSgpLCBnb3Q6ICR7U3RyaW5nKHJlc291cmNlKX1gKVxuICAgIH1cblxuICAgIGNvbnN0IHJlc291cmNlVHlwZSA9IG1vZGVsQ2xhc3MuZ2V0TW9kZWxOYW1lKClcbiAgICBjb25zdCByZXNvdXJjZUNvbmZpZyA9IHRoaXMuY29uZmlnLnJlc291cmNlc1tyZXNvdXJjZVR5cGVdXG5cbiAgICBpZiAoIXJlc291cmNlQ29uZmlnKSB0aHJvdyBuZXcgRXJyb3IoYE5vIHN5bmMgcmVzb3VyY2UgY29uZmlndXJlZCBmb3I6ICR7cmVzb3VyY2VUeXBlfWApXG5cbiAgICByZXR1cm4gcmVzb3VyY2VDb25maWdcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXNvbHZlcyB0aGUgc3luYyB0eXBlIGZvciBhIG11dGF0aW9uIHRocm91Z2ggdGhlIHJlc291cmNlIGNvbmZpZy4gVGhlXG4gICAqIFwidXBzZXJ0XCIgZmxhZyBxdWV1ZXMgY3JlYXRlcyBhbmQgdXBkYXRlcyBhcyBcInVwZGF0ZVwiIHJvd3MgKHRoZSBzZXJ2ZXJcbiAgICogdXBzZXJ0cyBieSByZXNvdXJjZSBpZCkgYW5kIGRlc3Ryb3lzIGFzIFwiZGVsZXRlXCIgcm93cy5cbiAgICogQHBhcmFtIHt7b3BlcmF0aW9uOiBcImNyZWF0ZVwiIHwgXCJ1cGRhdGVcIiB8IFwiZGVzdHJveVwiLCByZWNvcmQ6IFJldHVyblR5cGU8dHlwZW9mIEpTT04ucGFyc2U+LCByZXNvdXJjZUNvbmZpZzogaW1wb3J0KFwiLi9zeW5jLWNsaWVudC10eXBlcy5qc1wiKS5TeW5jQ2xpZW50UmVzb3VyY2VDb25maWd9fSBhcmdzIC0gTXV0YXRpb24gYXJncy5cbiAgICogQHJldHVybnMge3N0cmluZ30gU3luYyB0eXBlLlxuICAgKi9cbiAgZGVmYXVsdFN5bmNUeXBlKHtvcGVyYXRpb24sIHJlY29yZCwgcmVzb3VyY2VDb25maWd9KSB7XG4gICAgaWYgKHR5cGVvZiByZXNvdXJjZUNvbmZpZy5zeW5jVHlwZSA9PT0gXCJmdW5jdGlvblwiKSByZXR1cm4gcmVzb3VyY2VDb25maWcuc3luY1R5cGUoe29wZXJhdGlvbiwgcmVjb3JkfSlcbiAgICBpZiAob3BlcmF0aW9uID09PSBcImRlc3Ryb3lcIikgcmV0dXJuIFwiZGVsZXRlXCJcbiAgICBpZiAocmVzb3VyY2VDb25maWcuc3luY1R5cGUgPT09IFwidXBzZXJ0XCIpIHJldHVybiBcInVwZGF0ZVwiXG5cbiAgICByZXR1cm4gb3BlcmF0aW9uXG4gIH1cblxuICAvKipcbiAgICogRGVyaXZlcyB0aGUgcHVsbC1hcHBseSByZXNvdXJjZSBjb25maWdzIGZyb20gdGhlIGRlY2xhcmVkIHJlc291cmNlcy5cbiAgICogQHJldHVybnMge1JlY29yZDxzdHJpbmcsIGltcG9ydChcIi4vc3luYy1hcGktY2xpZW50LXR5cGVzLmpzXCIpLlN5bmNSZXNvdXJjZUNvbmZpZz59IFB1bGwtYXBwbHkgcmVzb3VyY2UgY29uZmlncy5cbiAgICovXG4gIHB1bGxSZXNvdXJjZUNvbmZpZ3MoKSB7XG4gICAgdGhpcy5fcHVsbFJlc291cmNlQ29uZmlncyB8fD0gLyoqIEB0eXBlIHtSZWNvcmQ8c3RyaW5nLCBpbXBvcnQoXCIuL3N5bmMtYXBpLWNsaWVudC10eXBlcy5qc1wiKS5TeW5jUmVzb3VyY2VDb25maWc+fSAqLyAoT2JqZWN0LmZyb21FbnRyaWVzKFxuICAgICAgT2JqZWN0LmVudHJpZXModGhpcy5jb25maWcucmVzb3VyY2VzKVxuICAgICAgICAuZmlsdGVyKChbLCByZXNvdXJjZV0pID0+IEJvb2xlYW4ocmVzb3VyY2UuYXR0cmlidXRlcykpXG4gICAgICAgIC5tYXAoKFtyZXNvdXJjZVR5cGUsIHJlc291cmNlXSkgPT4gW3Jlc291cmNlVHlwZSwge1xuICAgICAgICAgIGFmdGVyQXBwbHk6IHJlc291cmNlLmFmdGVyQXBwbHksXG4gICAgICAgICAgYXR0cmlidXRlczogLyoqIEB0eXBlIHtpbXBvcnQoXCIuL3N5bmMtYXBpLWNsaWVudC10eXBlcy5qc1wiKS5TeW5jUmVzb3VyY2VDb25maWdbXCJhdHRyaWJ1dGVzXCJdfSAqLyAocmVzb3VyY2UuYXR0cmlidXRlcyksXG4gICAgICAgICAgZW5hYmxlZDogdHJ1ZSxcbiAgICAgICAgICBmaW5kUmVjb3JkOiByZXNvdXJjZS5maW5kUmVjb3JkLFxuICAgICAgICAgIGZpbmRSZWNvcmRGb3JEZWxldGU6IHJlc291cmNlLmZpbmRSZWNvcmRGb3JEZWxldGUsXG4gICAgICAgICAgbW9kZWxDbGFzczogcmVzb3VyY2UubW9kZWxDbGFzc1xuICAgICAgICB9XSlcbiAgICApKVxuXG4gICAgcmV0dXJuIHRoaXMuX3B1bGxSZXNvdXJjZUNvbmZpZ3NcbiAgfVxufVxuXG4vKipcbiAqIEJ1aWxkcyBvbmUgcmVzb3VyY2UgY29uZmlnIGZyb20gYSBtb2RlbCdzIGBzdGF0aWMgc3luY2AgZGVjbGFyYXRpb24gcGx1cyBpdHNcbiAqIGRlcml2ZWQgY29sdW1uIG1ldGFkYXRhLlxuICogQHBhcmFtIHt7ZGVjbGFyYXRpb246IGltcG9ydChcIi4vc3luYy1jbGllbnQtdHlwZXMuanNcIikuTW9kZWxTeW5jRGVjbGFyYXRpb24sIG1vZGVsQ2xhc3M6IFJldHVyblR5cGU8dHlwZW9mIEpTT04ucGFyc2U+LCByZXNvdXJjZVR5cGU6IHN0cmluZ319IGFyZ3MgLSBEZWNsYXJhdGlvbiBhcmdzLlxuICogQHJldHVybnMge2ltcG9ydChcIi4vc3luYy1jbGllbnQtdHlwZXMuanNcIikuU3luY0NsaWVudFJlc291cmNlQ29uZmlnfSBEZXJpdmVkIHJlc291cmNlIGNvbmZpZy5cbiAqL1xuZnVuY3Rpb24gcmVzb3VyY2VDb25maWdGcm9tU3luY0RlY2xhcmF0aW9uKHtkZWNsYXJhdGlvbiwgbW9kZWxDbGFzcywgcmVzb3VyY2VUeXBlfSkge1xuICBjb25zdCBub3JtYWxpemVkRGVjbGFyYXRpb24gPSBkZWNsYXJhdGlvbiA9PT0gdHJ1ZSA/IHt9IDogZGVjbGFyYXRpb25cblxuICBpZiAoIW5vcm1hbGl6ZWREZWNsYXJhdGlvbiB8fCB0eXBlb2Ygbm9ybWFsaXplZERlY2xhcmF0aW9uICE9PSBcIm9iamVjdFwiIHx8IEFycmF5LmlzQXJyYXkobm9ybWFsaXplZERlY2xhcmF0aW9uKSkge1xuICAgIHRocm93IG5ldyBFcnJvcihgJHtyZXNvdXJjZVR5cGV9IHN0YXRpYyBzeW5jIG11c3QgYmUgdHJ1ZSBvciBhIHN5bmMgZGVjbGFyYXRpb24gb2JqZWN0LCBnb3Q6ICR7U3RyaW5nKGRlY2xhcmF0aW9uKX1gKVxuICB9XG5cbiAgY29uc3Qge2FmdGVyQXBwbHksIGF0dHJpYnV0ZXMsIGJvb2xlYW5BdHRyaWJ1dGVzLCBmaW5kUmVjb3JkLCBmaW5kUmVjb3JkRm9yRGVsZXRlLCBsb2NhbE9ubHlBdHRyaWJ1dGVzLCBwdWJsaXNoLCByZWFsdGltZSwgc3luY1R5cGUsIHRyYWNrLCB0cmFja2VkRGF0YSwgLi4ucmVzdERlY2xhcmF0aW9ufSA9IG5vcm1hbGl6ZWREZWNsYXJhdGlvblxuICBjb25zdCB1bmtub3duS2V5cyA9IE9iamVjdC5rZXlzKHJlc3REZWNsYXJhdGlvbilcblxuICAvLyBgcHVibGlzaGAgaXMgdGhlIHNlcnZlci1zaWRlIGhhbGYgb2YgdGhlIHNoYXJlZCBgc3RhdGljIHN5bmNgIGRlY2xhcmF0aW9uXG4gIC8vIChjb25zdW1lZCBieSBTeW5jUHVibGlzaGVyIG9uIHRoZSBiYWNrZW5kKSAtIHRoZSBjbGllbnQgZGVyaXZlcyBub3RoaW5nXG4gIC8vIGZyb20gaXQsIGJ1dCBtb2RlbHMgZGVjbGFyZWQgb25jZSBmb3IgYm90aCBzaWRlcyBtdXN0IHN0YXkgdmFsaWQgaGVyZS5cbiAgdm9pZCBwdWJsaXNoXG5cbiAgaWYgKHVua25vd25LZXlzLmxlbmd0aCA+IDApIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYCR7cmVzb3VyY2VUeXBlfSBzdGF0aWMgc3luYyByZWNlaXZlZCB1bmtub3duIGtleXM6ICR7dW5rbm93bktleXMuam9pbihcIiwgXCIpfSAoc3VwcG9ydGVkOiBhZnRlckFwcGx5LCBhdHRyaWJ1dGVzLCBib29sZWFuQXR0cmlidXRlcywgZmluZFJlY29yZCwgZmluZFJlY29yZEZvckRlbGV0ZSwgbG9jYWxPbmx5QXR0cmlidXRlcywgcHVibGlzaCwgcmVhbHRpbWUsIHN5bmNUeXBlLCB0cmFjaywgdHJhY2tlZERhdGEpYClcbiAgfVxuICBpZiAoc3luY1R5cGUgIT09IHVuZGVmaW5lZCAmJiB0eXBlb2Ygc3luY1R5cGUgIT09IFwiZnVuY3Rpb25cIiAmJiBzeW5jVHlwZSAhPT0gXCJ1cHNlcnRcIikge1xuICAgIHRocm93IG5ldyBFcnJvcihgJHtyZXNvdXJjZVR5cGV9IHN0YXRpYyBzeW5jIHN5bmNUeXBlIG11c3QgYmUgYSBmdW5jdGlvbiBvciB0aGUgc3RyaW5nIFwidXBzZXJ0XCIsIGdvdDogJHtTdHJpbmcoc3luY1R5cGUpfWApXG4gIH1cblxuICBjb25zdCBkZXJpdmVkID0gZGVyaXZlZFN5bmNBdHRyaWJ1dGVzKHttb2RlbENsYXNzLCByZXNvdXJjZVR5cGV9KVxuXG4gIHJldHVybiB7XG4gICAgYWZ0ZXJBcHBseSxcbiAgICBhdHRyaWJ1dGVzLFxuICAgIGJvb2xlYW5BdHRyaWJ1dGVzOiBtZXJnZWRBdHRyaWJ1dGVOYW1lcyhkZXJpdmVkLmJvb2xlYW5BdHRyaWJ1dGVzLCBib29sZWFuQXR0cmlidXRlcyksXG4gICAgZmluZFJlY29yZCxcbiAgICBmaW5kUmVjb3JkRm9yRGVsZXRlLFxuICAgIGxvY2FsT25seUF0dHJpYnV0ZXM6IG1lcmdlZEF0dHJpYnV0ZU5hbWVzKGRlcml2ZWQubG9jYWxPbmx5QXR0cmlidXRlcywgbG9jYWxPbmx5QXR0cmlidXRlcyksXG4gICAgbW9kZWxDbGFzcyxcbiAgICByZWFsdGltZSxcbiAgICBzeW5jVHlwZSxcbiAgICB0cmFjazogbm9ybWFsaXplZFRyYWNrKHRyYWNrKSxcbiAgICB0cmFja2VkRGF0YVxuICB9XG59XG5cbi8qKlxuICogRGVyaXZlcyBib29sZWFuIGFuZCBsb2NhbC1vbmx5IGF0dHJpYnV0ZSBuYW1lcyBmcm9tIGEgbW9kZWwncyBjb2x1bW4gbWV0YWRhdGE6XG4gKiBib29sZWFucyBmcm9tIGJvb2xlYW4gY29sdW1uIHR5cGVzOyBsb2NhbC1vbmx5IGZyb20gdGhlIHByaW1hcnkga2V5LFxuICogY3JlYXRlZEF0L3VwZGF0ZWRBdCwgYW5kIHN5bmMgYm9va2tlZXBpbmcgY29sdW1ucy5cbiAqIEBwYXJhbSB7e21vZGVsQ2xhc3M6IFJldHVyblR5cGU8dHlwZW9mIEpTT04ucGFyc2U+LCByZXNvdXJjZVR5cGU6IHN0cmluZ319IGFyZ3MgLSBEZXJpdmF0aW9uIGFyZ3MuXG4gKiBAcmV0dXJucyB7e2Jvb2xlYW5BdHRyaWJ1dGVzOiBzdHJpbmdbXSwgbG9jYWxPbmx5QXR0cmlidXRlczogc3RyaW5nW119fSBEZXJpdmVkIGF0dHJpYnV0ZSBuYW1lcy5cbiAqL1xuZnVuY3Rpb24gZGVyaXZlZFN5bmNBdHRyaWJ1dGVzKHttb2RlbENsYXNzLCByZXNvdXJjZVR5cGV9KSB7XG4gIGlmIChcbiAgICB0eXBlb2YgbW9kZWxDbGFzcy5nZXRDb2x1bW5OYW1lcyAhPT0gXCJmdW5jdGlvblwiIHx8XG4gICAgdHlwZW9mIG1vZGVsQ2xhc3MuZ2V0Q29sdW1uTmFtZVRvQXR0cmlidXRlTmFtZU1hcCAhPT0gXCJmdW5jdGlvblwiIHx8XG4gICAgdHlwZW9mIG1vZGVsQ2xhc3MuZ2V0Q29sdW1uVHlwZUJ5TmFtZSAhPT0gXCJmdW5jdGlvblwiIHx8XG4gICAgdHlwZW9mIG1vZGVsQ2xhc3MucHJpbWFyeUtleSAhPT0gXCJmdW5jdGlvblwiIHx8XG4gICAgdHlwZW9mIG1vZGVsQ2xhc3MuaGFzUHJpbWFyeUtleSAhPT0gXCJmdW5jdGlvblwiXG4gICkge1xuICAgIHRocm93IG5ldyBFcnJvcihgJHtyZXNvdXJjZVR5cGV9IHN0YXRpYyBzeW5jIHJlcXVpcmVzIGEgVmVsb2Npb3VzIG1vZGVsIGNsYXNzIHdpdGggY29sdW1uIG1ldGFkYXRhIChnZXRDb2x1bW5OYW1lcywgZ2V0Q29sdW1uTmFtZVRvQXR0cmlidXRlTmFtZU1hcCwgZ2V0Q29sdW1uVHlwZUJ5TmFtZSwgcHJpbWFyeUtleSwgaGFzUHJpbWFyeUtleSlgKVxuICB9XG5cbiAgY29uc3QgY29sdW1uTmFtZVRvQXR0cmlidXRlTmFtZSA9IG1vZGVsQ2xhc3MuZ2V0Q29sdW1uTmFtZVRvQXR0cmlidXRlTmFtZU1hcCgpXG4gIC8qKiBAdHlwZSB7c3RyaW5nW119ICovXG4gIGNvbnN0IGJvb2xlYW5BdHRyaWJ1dGVzID0gW11cbiAgLyoqIEB0eXBlIHtzdHJpbmdbXX0gKi9cbiAgY29uc3QgbG9jYWxPbmx5QXR0cmlidXRlcyA9IFtdXG5cbiAgaWYgKG1vZGVsQ2xhc3MuaGFzUHJpbWFyeUtleSgpKSB7XG4gICAgY29uc3QgcHJpbWFyeUtleUNvbHVtbiA9IG1vZGVsQ2xhc3MucHJpbWFyeUtleSgpXG5cbiAgICBsb2NhbE9ubHlBdHRyaWJ1dGVzLnB1c2goY29sdW1uTmFtZVRvQXR0cmlidXRlTmFtZVtwcmltYXJ5S2V5Q29sdW1uXSB8fCBwcmltYXJ5S2V5Q29sdW1uKVxuICB9XG5cbiAgZm9yIChjb25zdCBjb2x1bW5OYW1lIG9mIG1vZGVsQ2xhc3MuZ2V0Q29sdW1uTmFtZXMoKSkge1xuICAgIGNvbnN0IGF0dHJpYnV0ZU5hbWUgPSBjb2x1bW5OYW1lVG9BdHRyaWJ1dGVOYW1lW2NvbHVtbk5hbWVdIHx8IGNvbHVtbk5hbWVcbiAgICBjb25zdCBjb2x1bW5UeXBlID0gbW9kZWxDbGFzcy5nZXRDb2x1bW5UeXBlQnlOYW1lKGNvbHVtbk5hbWUpXG5cbiAgICBpZiAoTE9DQUxfQk9PS0tFRVBJTkdfQVRUUklCVVRFX05BTUVTLmluY2x1ZGVzKGF0dHJpYnV0ZU5hbWUpICYmICFsb2NhbE9ubHlBdHRyaWJ1dGVzLmluY2x1ZGVzKGF0dHJpYnV0ZU5hbWUpKSB7XG4gICAgICBsb2NhbE9ubHlBdHRyaWJ1dGVzLnB1c2goYXR0cmlidXRlTmFtZSlcbiAgICB9XG4gICAgaWYgKGNvbHVtblR5cGUgJiYgaXNCb29sZWFuQ29sdW1uVHlwZShjb2x1bW5UeXBlKSkge1xuICAgICAgYm9vbGVhbkF0dHJpYnV0ZXMucHVzaChhdHRyaWJ1dGVOYW1lKVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiB7Ym9vbGVhbkF0dHJpYnV0ZXMsIGxvY2FsT25seUF0dHJpYnV0ZXN9XG59XG5cbi8qKlxuICogTWVyZ2VzIGRlcml2ZWQgYXR0cmlidXRlIG5hbWVzIHdpdGggZGVjbGFyZWQgZXh0cmFzIGludG8gYSBzb3J0ZWQsIGR1cGxpY2F0ZS1mcmVlIGxpc3QuXG4gKiBAcGFyYW0ge3N0cmluZ1tdfSBkZXJpdmVkIC0gRGVyaXZlZCBhdHRyaWJ1dGUgbmFtZXMuXG4gKiBAcGFyYW0ge3N0cmluZ1tdIHwgdW5kZWZpbmVkfSBkZWNsYXJlZCAtIERlY2xhcmVkIGV4dHJhIGF0dHJpYnV0ZSBuYW1lcy5cbiAqIEByZXR1cm5zIHtzdHJpbmdbXX0gTWVyZ2VkIGF0dHJpYnV0ZSBuYW1lcy5cbiAqL1xuZnVuY3Rpb24gbWVyZ2VkQXR0cmlidXRlTmFtZXMoZGVyaXZlZCwgZGVjbGFyZWQpIHtcbiAgcmV0dXJuIFsuLi5uZXcgU2V0KFsuLi5kZXJpdmVkLCAuLi4oZGVjbGFyZWQgfHwgW10pXSldLnNvcnQoKVxufVxuXG4vKipcbiAqIE5vcm1hbGl6ZXMgYSBkZWNsYXJhdGlvbidzIHRyYWNrIHZhbHVlOiBhbiBvcGVyYXRpb25zIGFycmF5IGlzIHNob3J0aGFuZCBmb3JcbiAqIHRoZSB7b3BlcmF0aW9uc30gZm9ybS5cbiAqIEBwYXJhbSB7aW1wb3J0KFwiLi9zeW5jLWNsaWVudC10eXBlcy5qc1wiKS5Nb2RlbFN5bmNEZWNsYXJhdGlvbkNvbmZpZ1tcInRyYWNrXCJdfSB0cmFjayAtIERlY2xhcmVkIHRyYWNrIHZhbHVlLlxuICogQHJldHVybnMge2ltcG9ydChcIi4vc3luYy1jbGllbnQtdHlwZXMuanNcIikuU3luY0NsaWVudFJlc291cmNlQ29uZmlnW1widHJhY2tcIl19IE5vcm1hbGl6ZWQgdHJhY2sgdmFsdWUuXG4gKi9cbmZ1bmN0aW9uIG5vcm1hbGl6ZWRUcmFjayh0cmFjaykge1xuICBpZiAoQXJyYXkuaXNBcnJheSh0cmFjaykpIHJldHVybiB7b3BlcmF0aW9uczogdHJhY2t9XG5cbiAgcmV0dXJuIHRyYWNrXG59XG5cbi8qKlxuICogQnVpbGRzIGEgZnJhbWV3b3JrLW93bmVkIHN5bmMgZW5kcG9pbnQgUE9TVGVyIG92ZXIgdGhlIGNvbmZpZ3VyZWQgdHJhbnNwb3J0LlxuICogQHBhcmFtIHt7cGF0aDogc3RyaW5nLCB0cmFuc3BvcnQ6IGltcG9ydChcIi4uL2NvbmZpZ3VyYXRpb24tdHlwZXMuanNcIikuVmVsb2Npb3VzU3luY0NsaWVudFRyYW5zcG9ydH19IGFyZ3MgLSBQb3N0ZXIgYXJncy5cbiAqIEByZXR1cm5zIHsocGF5bG9hZDogUmVjb3JkPHN0cmluZywgUmV0dXJuVHlwZTx0eXBlb2YgSlNPTi5wYXJzZT4+KSA9PiBQcm9taXNlPFJldHVyblR5cGU8dHlwZW9mIEpTT04ucGFyc2U+Pn0gU3luYyBlbmRwb2ludCBQT1NUZXIuXG4gKi9cbmZ1bmN0aW9uIHRyYW5zcG9ydFBvc3Rlcih7cGF0aCwgdHJhbnNwb3J0fSkge1xuICByZXR1cm4gYXN5bmMgKHBheWxvYWQpID0+IHtcbiAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IHRyYW5zcG9ydC5wb3N0KHBhdGgsIHBheWxvYWQpXG5cbiAgICBpZiAoIXJlc3BvbnNlIHx8IHR5cGVvZiByZXNwb25zZS5qc29uICE9PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgc3luYy5jbGllbnQgdHJhbnNwb3J0LnBvc3QgbXVzdCByZXNvbHZlIHRvIGEgcmVzcG9uc2Ugd2l0aCBhIGpzb24oKSBtZXRob2QgZm9yICR7cGF0aH0gKGxpa2UgdGhlIGZyb250ZW5kLW1vZGVsIHdlYnNvY2tldCBjbGllbnQpYClcbiAgICB9XG5cbiAgICByZXR1cm4gYXdhaXQgcmVzcG9uc2UuanNvbigpXG4gIH1cbn1cblxuLyoqXG4gKiBMYXppbHkgYnVpbGRzIChhbmQgbWVtb2l6ZXMgcGVyIGNvbmZpZ3VyYXRpb24pIHRoZSBzeW5jIGNsaWVudCBkZXJpdmVkIGZyb20gdGhlXG4gKiBhcHAncyBWZWxvY2lvdXMgY29uZmlndXJhdGlvbiBhbmQgcmVnaXN0ZXJzIGl0IGFzIHRoZSBjdXJyZW50IHN5bmMgY2xpZW50LlxuICogQHBhcmFtIHtDb25maWd1cmF0aW9ufSBbY29uZmlndXJhdGlvbl0gLSBDb25maWd1cmF0aW9uIG93bmluZyB0aGUgcmVnaXN0ZXJlZCBtb2RlbHMgYW5kIHRoZSBzeW5jLmNsaWVudCBibG9jay4gRGVmYXVsdHMgdG8gdGhlIGN1cnJlbnQgY29uZmlndXJhdGlvbi5cbiAqIEByZXR1cm5zIHtTeW5jQ2xpZW50fSBNZW1vaXplZCBzeW5jIGNsaWVudCBmb3IgdGhlIGNvbmZpZ3VyYXRpb24uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzeW5jQ2xpZW50KGNvbmZpZ3VyYXRpb24gPSBDb25maWd1cmF0aW9uLmN1cnJlbnQoKSkge1xuICBsZXQgY2xpZW50ID0gc3luY0NsaWVudHNCeUNvbmZpZ3VyYXRpb24uZ2V0KGNvbmZpZ3VyYXRpb24pXG5cbiAgaWYgKCFjbGllbnQpIHtcbiAgICBjbGllbnQgPSBTeW5jQ2xpZW50LmZyb21Db25maWd1cmF0aW9uKGNvbmZpZ3VyYXRpb24pXG4gICAgc3luY0NsaWVudHNCeUNvbmZpZ3VyYXRpb24uc2V0KGNvbmZpZ3VyYXRpb24sIGNsaWVudClcbiAgICBjbGllbnQuc2V0Q3VycmVudCgpXG4gIH1cblxuICByZXR1cm4gY2xpZW50XG59XG5cbi8qKlxuICogRGVjbGFyZXMgYSBzeW5jIHNjb3BlIG9uIHRoZSBjdXJyZW50IHN5bmMgY2xpZW50LlxuICogQHBhcmFtIHtpbXBvcnQoXCIuLi9kYXRhYmFzZS9xdWVyeS9tb2RlbC1jbGFzcy1xdWVyeS5qc1wiKS5kZWZhdWx0PFJldHVyblR5cGU8dHlwZW9mIEpTT04ucGFyc2U+Pn0gcXVlcnkgLSBRdWVyeSBkZWNsYXJpbmcgdGhlIHN5bmMgc2NvcGUuXG4gKiBAcmV0dXJucyB7UHJvbWlzZTx7c2NvcGU6IGltcG9ydChcIi4vc3luYy1jbGllbnQtdHlwZXMuanNcIikuU2VyaWFsaXplZFN5bmNTY29wZSwgcHVsbGVkOiBpbXBvcnQoXCIuL3N5bmMtYXBpLWNsaWVudC10eXBlcy5qc1wiKS5TeW5jQ2hhbmdlc1Jlc3VsdCB8IG51bGx9Pn0gRGVjbGFyZWQgc2NvcGUgYW5kIHB1bGwgcmVzdWx0LlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gc3luYyhxdWVyeSkge1xuICByZXR1cm4gYXdhaXQgU3luY0NsaWVudC5jdXJyZW50KCkuc3luYyhxdWVyeSlcbn1cbiJdfQ==