sonamu 0.10.12 → 0.10.13

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 (513) hide show
  1. package/dist/ai/agents/agent.d.ts +1 -1
  2. package/dist/ai/agents/agent.d.ts.map +1 -1
  3. package/dist/ai/agents/agent.js +5 -6
  4. package/dist/ai/agents/types.d.ts +1 -1
  5. package/dist/ai/agents/types.d.ts.map +1 -1
  6. package/dist/ai/providers/rtzr/api.js +18 -18
  7. package/dist/ai/providers/rtzr/error.d.ts.map +1 -1
  8. package/dist/ai/providers/rtzr/error.js +17 -15
  9. package/dist/ai/providers/rtzr/model.d.ts.map +1 -1
  10. package/dist/ai/providers/rtzr/model.js +3 -2
  11. package/dist/ai/providers/rtzr/options.d.ts.map +1 -1
  12. package/dist/ai/providers/rtzr/options.js +16 -16
  13. package/dist/ai/providers/rtzr/provider.d.ts.map +1 -1
  14. package/dist/ai/providers/rtzr/provider.js +9 -9
  15. package/dist/ai/providers/rtzr/utils.d.ts.map +1 -1
  16. package/dist/ai/providers/rtzr/utils.js +1 -1
  17. package/dist/api/caster.d.ts.map +1 -1
  18. package/dist/api/caster.js +17 -17
  19. package/dist/api/code-converters.d.ts +4 -2
  20. package/dist/api/code-converters.d.ts.map +1 -1
  21. package/dist/api/code-converters.js +100 -19
  22. package/dist/api/config.d.ts +16 -1
  23. package/dist/api/config.d.ts.map +1 -1
  24. package/dist/api/config.js +28 -21
  25. package/dist/api/context.d.ts +2 -2
  26. package/dist/api/context.d.ts.map +1 -1
  27. package/dist/api/context.js +1 -1
  28. package/dist/api/decorators.d.ts.map +1 -1
  29. package/dist/api/decorators.js +18 -11
  30. package/dist/api/http-validator.d.ts +36 -0
  31. package/dist/api/http-validator.d.ts.map +1 -0
  32. package/dist/api/http-validator.js +72 -0
  33. package/dist/api/index.js +6 -4
  34. package/dist/api/sonamu.d.ts +59 -20
  35. package/dist/api/sonamu.d.ts.map +1 -1
  36. package/dist/api/sonamu.js +250 -106
  37. package/dist/api/websocket-helpers.d.ts +7 -5
  38. package/dist/api/websocket-helpers.d.ts.map +1 -1
  39. package/dist/api/websocket-helpers.js +6 -6
  40. package/dist/auth/audit-log/builders.d.ts.map +1 -1
  41. package/dist/auth/audit-log/builders.js +1 -1
  42. package/dist/auth/audit-log/client-ip.d.ts +1 -1
  43. package/dist/auth/audit-log/client-ip.d.ts.map +1 -1
  44. package/dist/auth/audit-log/client-ip.js +4 -2
  45. package/dist/auth/audit-log/events.d.ts +5 -1
  46. package/dist/auth/audit-log/events.d.ts.map +1 -1
  47. package/dist/auth/audit-log/events.js +1 -1
  48. package/dist/auth/audit-log/plugin.d.ts +0 -8
  49. package/dist/auth/audit-log/plugin.d.ts.map +1 -1
  50. package/dist/auth/audit-log/plugin.js +48 -52
  51. package/dist/auth/audit-log-ingestor.d.ts.map +1 -1
  52. package/dist/auth/audit-log-ingestor.js +16 -12
  53. package/dist/auth/auth-generator.d.ts.map +1 -1
  54. package/dist/auth/auth-generator.js +1 -1
  55. package/dist/auth/better-auth-request.d.ts.map +1 -1
  56. package/dist/auth/better-auth-request.js +6 -5
  57. package/dist/auth/knex-adapter.js +1 -1
  58. package/dist/auth/plugins/entity-definitions/index.d.ts +13 -1
  59. package/dist/auth/plugins/entity-definitions/index.d.ts.map +1 -1
  60. package/dist/auth/plugins/entity-definitions/index.js +1 -1
  61. package/dist/auth/plugins/wrappers/admin.d.ts +1 -1
  62. package/dist/bin/build-config.d.ts +25 -0
  63. package/dist/bin/build-config.d.ts.map +1 -1
  64. package/dist/bin/build-config.js +105 -2
  65. package/dist/bin/cli.js +131 -27
  66. package/dist/bin/compiler-policy.d.ts +3 -0
  67. package/dist/bin/compiler-policy.d.ts.map +1 -0
  68. package/dist/bin/compiler-policy.js +24 -0
  69. package/dist/bin/fixture.d.ts.map +1 -1
  70. package/dist/bin/fixture.js +5 -3
  71. package/dist/bin/test-command.d.ts +22 -1
  72. package/dist/bin/test-command.d.ts.map +1 -1
  73. package/dist/bin/test-command.js +18 -10
  74. package/dist/bin/ts-loader-registration.d.ts +7 -1
  75. package/dist/bin/ts-loader-registration.d.ts.map +1 -1
  76. package/dist/bin/ts-loader-registration.js +13 -4
  77. package/dist/cache/decorator.d.ts.map +1 -1
  78. package/dist/cache/decorator.js +11 -4
  79. package/dist/compress/compress.d.ts.map +1 -1
  80. package/dist/compress/compress.js +1 -1
  81. package/dist/cone/cone-generator.d.ts +14 -1
  82. package/dist/cone/cone-generator.d.ts.map +1 -1
  83. package/dist/cone/cone-generator.js +13 -9
  84. package/dist/database/_batch_update.js +1 -1
  85. package/dist/database/base-model.d.ts +22 -10
  86. package/dist/database/base-model.d.ts.map +1 -1
  87. package/dist/database/base-model.js +26 -16
  88. package/dist/database/base-model.types.d.ts +15 -3
  89. package/dist/database/base-model.types.d.ts.map +1 -1
  90. package/dist/database/db.d.ts +12 -2
  91. package/dist/database/db.d.ts.map +1 -1
  92. package/dist/database/db.js +10 -7
  93. package/dist/database/knex.d.ts.map +1 -1
  94. package/dist/database/knex.js +17 -14
  95. package/dist/database/puri.d.ts +11 -9
  96. package/dist/database/puri.d.ts.map +1 -1
  97. package/dist/database/puri.js +93 -79
  98. package/dist/database/puri.types.d.ts +21 -21
  99. package/dist/database/puri.types.d.ts.map +1 -1
  100. package/dist/database/puri.types.js +1 -1
  101. package/dist/database/upsert-builder.d.ts +12 -10
  102. package/dist/database/upsert-builder.d.ts.map +1 -1
  103. package/dist/database/upsert-builder.js +20 -12
  104. package/dist/dict/sd.d.ts.map +1 -1
  105. package/dist/dict/sd.js +1 -1
  106. package/dist/dict/sonamu-dictionary.d.ts.map +1 -1
  107. package/dist/dict/sonamu-dictionary.js +1 -1
  108. package/dist/dict/utils.d.ts.map +1 -1
  109. package/dist/dict/utils.js +7 -2
  110. package/dist/entity/entity-manager.d.ts +13 -4
  111. package/dist/entity/entity-manager.d.ts.map +1 -1
  112. package/dist/entity/entity-manager.js +19 -11
  113. package/dist/entity/entity-template-cone.d.ts +73 -5
  114. package/dist/entity/entity-template-cone.d.ts.map +1 -1
  115. package/dist/entity/entity-template-cone.js +4 -2
  116. package/dist/entity/entity.d.ts +6 -2
  117. package/dist/entity/entity.d.ts.map +1 -1
  118. package/dist/entity/entity.js +30 -28
  119. package/dist/env.d.ts +3 -1
  120. package/dist/env.d.ts.map +1 -1
  121. package/dist/env.js +1 -1
  122. package/dist/exceptions/error-handler.d.ts.map +1 -1
  123. package/dist/exceptions/error-handler.js +7 -2
  124. package/dist/exceptions/so-exceptions.d.ts +24 -20
  125. package/dist/exceptions/so-exceptions.d.ts.map +1 -1
  126. package/dist/exceptions/so-exceptions.js +4 -2
  127. package/dist/filter/utils.d.ts +7 -2
  128. package/dist/filter/utils.d.ts.map +1 -1
  129. package/dist/filter/utils.js +8 -6
  130. package/dist/index.d.ts +3 -0
  131. package/dist/index.d.ts.map +1 -1
  132. package/dist/index.js +12 -6
  133. package/dist/logger/configure.d.ts.map +1 -1
  134. package/dist/logger/configure.js +10 -10
  135. package/dist/migration/code-generation.d.ts.map +1 -1
  136. package/dist/migration/code-generation.js +50 -46
  137. package/dist/migration/index-where-predicate.d.ts.map +1 -1
  138. package/dist/migration/index-where-predicate.js +22 -8
  139. package/dist/migration/migration-set.d.ts.map +1 -1
  140. package/dist/migration/migration-set.js +1 -1
  141. package/dist/migration/migrator.d.ts +3 -2
  142. package/dist/migration/migrator.d.ts.map +1 -1
  143. package/dist/migration/migrator.js +27 -21
  144. package/dist/migration/postgresql-schema-reader.d.ts.map +1 -1
  145. package/dist/migration/postgresql-schema-reader.js +51 -36
  146. package/dist/migration/slack-confirm.d.ts.map +1 -1
  147. package/dist/migration/slack-confirm.js +1 -1
  148. package/dist/naite/naite-reporter.js +2 -2
  149. package/dist/naite/naite.d.ts +74 -15
  150. package/dist/naite/naite.d.ts.map +1 -1
  151. package/dist/naite/naite.js +5 -19
  152. package/dist/runtime-type.d.ts +6 -0
  153. package/dist/runtime-type.d.ts.map +1 -0
  154. package/dist/runtime-type.js +26 -0
  155. package/dist/ssr/hmr-opt-out.d.ts +26 -0
  156. package/dist/ssr/hmr-opt-out.d.ts.map +1 -0
  157. package/dist/ssr/hmr-opt-out.js +59 -0
  158. package/dist/ssr/renderer.d.ts.map +1 -1
  159. package/dist/ssr/renderer.js +4 -1
  160. package/dist/storage/base-file.js +14 -14
  161. package/dist/storage/buffered-file.d.ts +2 -2
  162. package/dist/storage/buffered-file.d.ts.map +1 -1
  163. package/dist/storage/buffered-file.js +12 -12
  164. package/dist/storage/s3-driver.d.ts.map +1 -1
  165. package/dist/storage/s3-driver.js +1 -1
  166. package/dist/storage/uploaded-file.d.ts +2 -2
  167. package/dist/storage/uploaded-file.d.ts.map +1 -1
  168. package/dist/storage/uploaded-file.js +8 -8
  169. package/dist/stream/sse.js +11 -11
  170. package/dist/stream/ws-core.d.ts +1 -1
  171. package/dist/stream/ws-core.d.ts.map +1 -1
  172. package/dist/stream/ws-delivery.d.ts +1 -1
  173. package/dist/stream/ws-delivery.d.ts.map +1 -1
  174. package/dist/stream/ws-delivery.js +6 -4
  175. package/dist/stream/ws-local-connection-store.d.ts.map +1 -1
  176. package/dist/stream/ws-local-connection-store.js +4 -2
  177. package/dist/stream/ws-presence-store.js +1 -1
  178. package/dist/stream/ws-registry.d.ts +4 -4
  179. package/dist/stream/ws-registry.d.ts.map +1 -1
  180. package/dist/stream/ws-registry.js +4 -2
  181. package/dist/stream/ws-telemetry.d.ts +16 -12
  182. package/dist/stream/ws-telemetry.d.ts.map +1 -1
  183. package/dist/stream/ws-telemetry.js +22 -18
  184. package/dist/stream/ws.d.ts +18 -12
  185. package/dist/stream/ws.d.ts.map +1 -1
  186. package/dist/stream/ws.js +26 -22
  187. package/dist/syncer/api-parser.js +1 -1
  188. package/dist/syncer/checksum.d.ts.map +1 -1
  189. package/dist/syncer/checksum.js +7 -8
  190. package/dist/syncer/code-generator.d.ts.map +1 -1
  191. package/dist/syncer/code-generator.js +13 -14
  192. package/dist/syncer/entity-operations.d.ts.map +1 -1
  193. package/dist/syncer/entity-operations.js +5 -6
  194. package/dist/syncer/file-copy.d.ts +5 -0
  195. package/dist/syncer/file-copy.d.ts.map +1 -0
  196. package/dist/syncer/file-copy.js +36 -0
  197. package/dist/syncer/file-patterns.d.ts +1 -0
  198. package/dist/syncer/file-patterns.d.ts.map +1 -1
  199. package/dist/syncer/file-patterns.js +5 -2
  200. package/dist/syncer/file-tracking.d.ts.map +1 -1
  201. package/dist/syncer/file-tracking.js +5 -4
  202. package/dist/syncer/filesystem-dependencies.d.ts +15 -0
  203. package/dist/syncer/filesystem-dependencies.d.ts.map +1 -0
  204. package/dist/syncer/filesystem-dependencies.js +53 -0
  205. package/dist/syncer/module-loader.d.ts +1 -1
  206. package/dist/syncer/module-loader.d.ts.map +1 -1
  207. package/dist/syncer/module-loader.js +6 -4
  208. package/dist/syncer/syncer-actions.d.ts +4 -0
  209. package/dist/syncer/syncer-actions.d.ts.map +1 -1
  210. package/dist/syncer/syncer-actions.js +34 -17
  211. package/dist/syncer/syncer.d.ts +17 -6
  212. package/dist/syncer/syncer.d.ts.map +1 -1
  213. package/dist/syncer/syncer.js +71 -29
  214. package/dist/syncer/watcher.d.ts.map +1 -1
  215. package/dist/syncer/watcher.js +3 -3
  216. package/dist/tasks/decorator.d.ts +6 -6
  217. package/dist/tasks/decorator.d.ts.map +1 -1
  218. package/dist/tasks/decorator.js +4 -4
  219. package/dist/tasks/step-wrapper.d.ts +6 -4
  220. package/dist/tasks/step-wrapper.d.ts.map +1 -1
  221. package/dist/tasks/step-wrapper.js +5 -5
  222. package/dist/tasks/workflow-manager.d.ts.map +1 -1
  223. package/dist/tasks/workflow-manager.js +13 -7
  224. package/dist/template/entity-converter.d.ts +1 -1
  225. package/dist/template/entity-converter.d.ts.map +1 -1
  226. package/dist/template/entity-converter.js +2 -2
  227. package/dist/template/helpers.d.ts +8 -6
  228. package/dist/template/helpers.d.ts.map +1 -1
  229. package/dist/template/helpers.js +1 -1
  230. package/dist/template/implementations/generated.template.d.ts.map +1 -1
  231. package/dist/template/implementations/generated.template.js +4 -4
  232. package/dist/template/implementations/generated_http.template.d.ts +7 -4
  233. package/dist/template/implementations/generated_http.template.d.ts.map +1 -1
  234. package/dist/template/implementations/generated_http.template.js +21 -21
  235. package/dist/template/implementations/generated_sso.template.d.ts.map +1 -1
  236. package/dist/template/implementations/generated_sso.template.js +6 -3
  237. package/dist/template/implementations/http_validators.template.d.ts +18 -0
  238. package/dist/template/implementations/http_validators.template.d.ts.map +1 -0
  239. package/dist/template/implementations/http_validators.template.js +127 -0
  240. package/dist/template/implementations/model.template.d.ts.map +1 -1
  241. package/dist/template/implementations/model.template.js +1 -1
  242. package/dist/template/implementations/queries.template.js +1 -1
  243. package/dist/template/implementations/sd.template.d.ts.map +1 -1
  244. package/dist/template/implementations/sd.template.js +79 -39
  245. package/dist/template/implementations/services.template.d.ts.map +1 -1
  246. package/dist/template/implementations/services.template.js +6 -4
  247. package/dist/template/implementations/view_form.template.d.ts +6 -1
  248. package/dist/template/implementations/view_form.template.d.ts.map +1 -1
  249. package/dist/template/implementations/view_form.template.js +23 -15
  250. package/dist/template/implementations/view_list.template.d.ts.map +1 -1
  251. package/dist/template/implementations/view_list.template.js +11 -6
  252. package/dist/template/template-manager.d.ts.map +1 -1
  253. package/dist/template/template-manager.js +9 -7
  254. package/dist/template/template-types.d.ts +12 -5
  255. package/dist/template/template-types.d.ts.map +1 -1
  256. package/dist/template/template-types.js +1 -1
  257. package/dist/template/template.d.ts +2 -2
  258. package/dist/template/template.d.ts.map +1 -1
  259. package/dist/template/template.js +6 -4
  260. package/dist/template/zod-converter.d.ts +0 -19
  261. package/dist/template/zod-converter.d.ts.map +1 -1
  262. package/dist/template/zod-converter.js +100 -84
  263. package/dist/testing/_relation-graph.d.ts.map +1 -1
  264. package/dist/testing/_relation-graph.js +2 -1
  265. package/dist/testing/bootstrap.d.ts.map +1 -1
  266. package/dist/testing/bootstrap.js +9 -6
  267. package/dist/testing/data-explorer.d.ts +32 -7
  268. package/dist/testing/data-explorer.d.ts.map +1 -1
  269. package/dist/testing/data-explorer.js +77 -31
  270. package/dist/testing/dev-test-routes.d.ts +8 -1
  271. package/dist/testing/dev-test-routes.d.ts.map +1 -1
  272. package/dist/testing/dev-test-routes.js +125 -108
  273. package/dist/testing/dev-vitest-manager.d.ts +54 -8
  274. package/dist/testing/dev-vitest-manager.d.ts.map +1 -1
  275. package/dist/testing/dev-vitest-manager.js +24 -9
  276. package/dist/testing/faker-mappings.d.ts +412 -1
  277. package/dist/testing/faker-mappings.d.ts.map +1 -1
  278. package/dist/testing/faker-mappings.js +1 -1
  279. package/dist/testing/filesystem.d.ts +2 -0
  280. package/dist/testing/filesystem.d.ts.map +1 -0
  281. package/dist/testing/filesystem.js +7 -0
  282. package/dist/testing/fixture-generator.d.ts +25 -8
  283. package/dist/testing/fixture-generator.d.ts.map +1 -1
  284. package/dist/testing/fixture-generator.js +132 -73
  285. package/dist/testing/fixture-loader.d.ts +3 -1
  286. package/dist/testing/fixture-loader.d.ts.map +1 -1
  287. package/dist/testing/fixture-loader.js +1 -20
  288. package/dist/testing/fixture-manager.d.ts +8 -7
  289. package/dist/testing/fixture-manager.d.ts.map +1 -1
  290. package/dist/testing/fixture-manager.js +91 -59
  291. package/dist/testing/global-setup.d.ts.map +1 -1
  292. package/dist/testing/global-setup.js +5 -2
  293. package/dist/testing/index.d.ts +2 -0
  294. package/dist/testing/index.d.ts.map +1 -1
  295. package/dist/testing/index.js +6 -3
  296. package/dist/types/types.d.ts +101 -99
  297. package/dist/types/types.d.ts.map +1 -1
  298. package/dist/types/types.js +234 -225
  299. package/dist/ui/ai-api.d.ts.map +1 -1
  300. package/dist/ui/ai-api.js +1 -1
  301. package/dist/ui/ai-client.d.ts.map +1 -1
  302. package/dist/ui/ai-client.js +28 -18
  303. package/dist/ui/api.d.ts.map +1 -1
  304. package/dist/ui/api.js +135 -128
  305. package/dist/ui/async-route.d.ts +3 -0
  306. package/dist/ui/async-route.d.ts.map +1 -0
  307. package/dist/ui/async-route.js +12 -0
  308. package/dist/ui/cdd-service.d.ts +9 -7
  309. package/dist/ui/cdd-service.d.ts.map +1 -1
  310. package/dist/ui/cdd-service.js +7 -5
  311. package/dist/ui/migrations-api.d.ts.map +1 -1
  312. package/dist/ui/migrations-api.js +17 -15
  313. package/dist/ui-web/assets/index-DV1AAq6W.js +178 -0
  314. package/dist/ui-web/index.html +1 -1
  315. package/dist/utils/formatter.d.ts.map +1 -1
  316. package/dist/utils/formatter.js +7 -5
  317. package/dist/utils/fs-utils.d.ts +3 -3
  318. package/dist/utils/fs-utils.d.ts.map +1 -1
  319. package/dist/utils/fs-utils.js +6 -6
  320. package/dist/utils/model.d.ts +3 -5
  321. package/dist/utils/model.d.ts.map +1 -1
  322. package/dist/utils/model.js +1 -1
  323. package/dist/utils/object-utils.d.ts +1 -1
  324. package/dist/utils/object-utils.d.ts.map +1 -1
  325. package/dist/utils/object-utils.js +17 -16
  326. package/dist/utils/process-utils.d.ts.map +1 -1
  327. package/dist/utils/process-utils.js +4 -2
  328. package/dist/utils/runtime-value.d.ts +13 -0
  329. package/dist/utils/runtime-value.d.ts.map +1 -0
  330. package/dist/utils/runtime-value.js +40 -0
  331. package/dist/utils/sql-parser.d.ts +8 -1
  332. package/dist/utils/sql-parser.d.ts.map +1 -1
  333. package/dist/utils/sql-parser.js +6 -3
  334. package/dist/utils/type-utils.d.ts.map +1 -1
  335. package/dist/utils/type-utils.js +10 -8
  336. package/dist/utils/utils.d.ts +2 -2
  337. package/dist/utils/utils.d.ts.map +1 -1
  338. package/dist/utils/utils.js +11 -8
  339. package/dist/utils/zod-error.d.ts.map +1 -1
  340. package/dist/utils/zod-error.js +7 -4
  341. package/dist/vector/chunking.d.ts.map +1 -1
  342. package/dist/vector/chunking.js +1 -1
  343. package/dist/vector/embedding.d.ts.map +1 -1
  344. package/dist/vector/embedding.js +1 -1
  345. package/dist/vector/types.d.ts +3 -2
  346. package/dist/vector/types.d.ts.map +1 -1
  347. package/package.json +5 -3
  348. package/src/ai/agents/agent.ts +5 -5
  349. package/src/ai/agents/types.ts +1 -1
  350. package/src/ai/providers/rtzr/__tests__/model.test.ts +2 -2
  351. package/src/ai/providers/rtzr/error.ts +5 -3
  352. package/src/ai/providers/rtzr/model.ts +3 -2
  353. package/src/ai/providers/rtzr/options.ts +10 -5
  354. package/src/ai/providers/rtzr/provider.ts +10 -10
  355. package/src/ai/providers/rtzr/utils.ts +3 -1
  356. package/src/api/__tests__/config.test.ts +11 -21
  357. package/src/api/__tests__/sonamu.http-validator.test.ts +512 -0
  358. package/src/api/__tests__/sonamu.websocket.test.ts +51 -41
  359. package/src/api/__tests__/zod-compiler-policy.test.ts +95 -0
  360. package/src/api/caster.ts +6 -8
  361. package/src/api/code-converters.ts +136 -36
  362. package/src/api/config.ts +62 -4
  363. package/src/api/context.ts +3 -3
  364. package/src/api/decorators.ts +28 -17
  365. package/src/api/http-validator.ts +149 -0
  366. package/src/api/sonamu.ts +459 -152
  367. package/src/api/websocket-helpers.ts +24 -17
  368. package/src/auth/audit-log/builders.ts +3 -2
  369. package/src/auth/audit-log/client-ip.ts +4 -2
  370. package/src/auth/audit-log/events.ts +15 -1
  371. package/src/auth/audit-log/plugin.ts +129 -200
  372. package/src/auth/audit-log-ingestor.ts +19 -15
  373. package/src/auth/auth-generator.ts +10 -5
  374. package/src/auth/better-auth-request.ts +4 -3
  375. package/src/auth/knex-adapter.ts +8 -2
  376. package/src/auth/plugins/entity-definitions/index.ts +6 -5
  377. package/src/bin/__tests__/http-validator-benchmark.test.ts +94 -0
  378. package/src/bin/__tests__/test-command.test.ts +9 -15
  379. package/src/bin/__tests__/ts-loader-register.test.ts +15 -17
  380. package/src/bin/__tests__/zod-compiler-build.test.ts +307 -0
  381. package/src/bin/build-config.ts +167 -0
  382. package/src/bin/cli.ts +153 -36
  383. package/src/bin/compiler-policy.ts +35 -0
  384. package/src/bin/fixture.ts +14 -3
  385. package/src/bin/test-command.ts +74 -29
  386. package/src/bin/ts-loader-registration.ts +22 -4
  387. package/src/cache/decorator.ts +10 -3
  388. package/src/compress/compress.ts +17 -4
  389. package/src/cone/cone-generator.ts +34 -6
  390. package/src/database/__tests__/db.test.ts +1 -0
  391. package/src/database/__tests__/puri.test.ts +16 -15
  392. package/src/database/__tests__/transaction-scope.test.ts +5 -0
  393. package/src/database/_batch_update.ts +1 -0
  394. package/src/database/base-model.ts +81 -50
  395. package/src/database/base-model.types.ts +6 -6
  396. package/src/database/db.ts +29 -19
  397. package/src/database/knex.ts +30 -17
  398. package/src/database/puri-subset.test-d.ts +17 -0
  399. package/src/database/puri.ts +181 -143
  400. package/src/database/puri.types.test-d.ts +31 -1
  401. package/src/database/puri.types.ts +23 -21
  402. package/src/database/upsert-builder.ts +75 -53
  403. package/src/dict/sd.ts +15 -5
  404. package/src/dict/sonamu-dictionary.ts +6 -6
  405. package/src/dict/utils.ts +9 -1
  406. package/src/entity/entity-manager.ts +26 -9
  407. package/src/entity/entity-template-cone.ts +5 -10
  408. package/src/entity/entity.ts +50 -34
  409. package/src/env.ts +7 -3
  410. package/src/exceptions/error-handler.ts +17 -2
  411. package/src/exceptions/so-exceptions.ts +26 -20
  412. package/src/filter/utils.ts +21 -11
  413. package/src/index.ts +3 -0
  414. package/src/logger/configure.ts +26 -18
  415. package/src/migration/__tests__/migrator.test.ts +50 -57
  416. package/src/migration/code-generation.ts +132 -104
  417. package/src/migration/index-where-predicate.ts +51 -24
  418. package/src/migration/migration-set.ts +11 -5
  419. package/src/migration/migrator.ts +68 -41
  420. package/src/migration/postgresql-schema-reader.ts +52 -47
  421. package/src/migration/slack-confirm.ts +17 -15
  422. package/src/naite/naite-reporter.ts +1 -1
  423. package/src/naite/naite.ts +97 -24
  424. package/src/runtime-type.ts +34 -0
  425. package/src/ssr/hmr-opt-out.ts +78 -0
  426. package/src/ssr/renderer.ts +6 -0
  427. package/src/storage/base-file.ts +13 -13
  428. package/src/storage/buffered-file.ts +11 -11
  429. package/src/storage/s3-driver.ts +4 -1
  430. package/src/storage/uploaded-file.ts +8 -8
  431. package/src/stream/__tests__/ws-contracts.test.ts +4 -2
  432. package/src/stream/__tests__/ws-telemetry.test.ts +1 -1
  433. package/src/stream/__tests__/ws.test.ts +30 -6
  434. package/src/stream/sse.ts +12 -11
  435. package/src/stream/ws-core.ts +1 -1
  436. package/src/stream/ws-delivery.ts +16 -7
  437. package/src/stream/ws-local-connection-store.ts +2 -3
  438. package/src/stream/ws-presence-store.ts +6 -1
  439. package/src/stream/ws-registry.ts +16 -7
  440. package/src/stream/ws-telemetry.ts +66 -43
  441. package/src/stream/ws.ts +73 -39
  442. package/src/syncer/__tests__/api-parser.websocket-type-ref.test.ts +3 -2
  443. package/src/syncer/__tests__/http-validator-registry.test.ts +137 -0
  444. package/src/syncer/api-parser.ts +67 -27
  445. package/src/syncer/checksum.ts +17 -11
  446. package/src/syncer/code-generator.ts +25 -17
  447. package/src/syncer/entity-operations.ts +3 -5
  448. package/src/syncer/file-copy.ts +46 -0
  449. package/src/syncer/file-patterns.ts +11 -8
  450. package/src/syncer/file-tracking.ts +3 -4
  451. package/src/syncer/filesystem-dependencies.ts +73 -0
  452. package/src/syncer/module-loader.ts +8 -4
  453. package/src/syncer/syncer-actions.ts +56 -18
  454. package/src/syncer/syncer.ts +116 -43
  455. package/src/syncer/watcher.ts +8 -4
  456. package/src/tasks/decorator.ts +20 -12
  457. package/src/tasks/step-wrapper.ts +19 -9
  458. package/src/tasks/workflow-manager.ts +15 -9
  459. package/src/template/__tests__/http_validators.template.test.ts +160 -0
  460. package/src/template/__tests__/services.template.mutation.test.ts +24 -23
  461. package/src/template/__tests__/services.template.websocket.test.ts +21 -25
  462. package/src/template/entity-converter.ts +5 -2
  463. package/src/template/helpers.ts +8 -9
  464. package/src/template/implementations/generated.template.ts +5 -4
  465. package/src/template/implementations/generated_http.template.ts +61 -15
  466. package/src/template/implementations/generated_sso.template.ts +15 -4
  467. package/src/template/implementations/http_validators.template.ts +175 -0
  468. package/src/template/implementations/model.template.ts +3 -1
  469. package/src/template/implementations/sd.template.ts +81 -41
  470. package/src/template/implementations/services.template.ts +2 -2
  471. package/src/template/implementations/view_form.template.ts +56 -39
  472. package/src/template/implementations/view_list.template.ts +31 -23
  473. package/src/template/template-manager.ts +15 -13
  474. package/src/template/template-types.ts +13 -5
  475. package/src/template/template.ts +4 -3
  476. package/src/template/zod-converter.ts +206 -91
  477. package/src/testing/__tests__/dev-test-routes.test.ts +85 -25
  478. package/src/testing/__tests__/dev-vitest-manager.test.ts +15 -15
  479. package/src/testing/_relation-graph.ts +4 -1
  480. package/src/testing/bootstrap.ts +12 -5
  481. package/src/testing/data-explorer.ts +102 -53
  482. package/src/testing/dev-test-routes.ts +87 -50
  483. package/src/testing/dev-vitest-manager.ts +88 -32
  484. package/src/testing/faker-mappings.ts +2 -2
  485. package/src/testing/filesystem.ts +1 -0
  486. package/src/testing/fixture-generator.ts +191 -131
  487. package/src/testing/fixture-loader.ts +5 -1
  488. package/src/testing/fixture-manager.ts +129 -90
  489. package/src/testing/global-setup.ts +7 -3
  490. package/src/testing/index.ts +5 -0
  491. package/src/types/__tests__/entity-json-schema-search-text.test.ts +9 -3
  492. package/src/types/types.ts +184 -158
  493. package/src/ui/ai-api.ts +9 -7
  494. package/src/ui/ai-client.ts +61 -56
  495. package/src/ui/api.ts +727 -616
  496. package/src/ui/async-route.ts +4 -0
  497. package/src/ui/cdd-service.ts +35 -12
  498. package/src/ui/migrations-api.ts +63 -51
  499. package/src/utils/formatter.ts +7 -3
  500. package/src/utils/fs-utils.ts +5 -5
  501. package/src/utils/model.ts +4 -5
  502. package/src/utils/object-utils.ts +32 -22
  503. package/src/utils/process-utils.ts +4 -1
  504. package/src/utils/runtime-value.ts +43 -0
  505. package/src/utils/sql-parser.ts +13 -6
  506. package/src/utils/type-utils.ts +9 -7
  507. package/src/utils/utils.ts +19 -21
  508. package/src/utils/zod-error.ts +4 -2
  509. package/src/vector/chunking.ts +6 -1
  510. package/src/vector/embedding.ts +2 -1
  511. package/src/vector/types.ts +4 -2
  512. package/tsdown.api.config.ts +5 -2
  513. package/dist/ui-web/assets/index-C0m1pk6K.js +0 -177
@@ -1,4 +1,5 @@
1
1
  import { __esmMin } from "../_virtual/_rolldown/runtime.js";
2
+ import { z } from "zod";
2
3
  //#region src/testing/dev-vitest-manager.ts
3
4
  function mapModuleState(state) {
4
5
  switch (state) {
@@ -101,14 +102,16 @@ function getResultCompletenessScore(node) {
101
102
  }
102
103
  return score;
103
104
  }
104
- function isSerializedTrace(value) {
105
- if (typeof value !== "object" || value === null) return false;
106
- const v = value;
107
- return typeof v.key === "string" && typeof v.filePath === "string" && typeof v.lineNumber === "number" && typeof v.at === "string" && "value" in v;
105
+ function parseSerializedTraces(values) {
106
+ return values.flatMap((value) => {
107
+ const parsed = serializedTraceSchema.safeParse(value);
108
+ return parsed.success ? [parsed.data] : [];
109
+ });
108
110
  }
109
- var DevVitestManager;
111
+ var DevVitestManager, serializedTraceSchema;
110
112
  var init_dev_vitest_manager = __esmMin((() => {
111
113
  DevVitestManager = class {
114
+ vitestFactory;
112
115
  vitest = null;
113
116
  running = false;
114
117
  lastRunAt = null;
@@ -117,6 +120,9 @@ var init_dev_vitest_manager = __esmMin((() => {
117
120
  closed = false;
118
121
  eventListeners = /* @__PURE__ */ new Set();
119
122
  currentRunContext = null;
123
+ constructor(vitestFactory) {
124
+ this.vitestFactory = vitestFactory;
125
+ }
120
126
  addEventListener(listener) {
121
127
  this.eventListeners.add(listener);
122
128
  }
@@ -128,7 +134,9 @@ var init_dev_vitest_manager = __esmMin((() => {
128
134
  }
129
135
  async start(vitestConfigPath) {
130
136
  if (this.vitest) return;
131
- const { createVitest } = await import("vitest/node");
137
+ const createVitest = this.vitestFactory ?? (async (...args) => {
138
+ return (await import("vitest/node")).createVitest(...args);
139
+ });
132
140
  const viteOverrides = { server: { watch: null } };
133
141
  const cliOptions = {
134
142
  watch: true,
@@ -213,7 +221,7 @@ var init_dev_vitest_manager = __esmMin((() => {
213
221
  const result = await entry.task();
214
222
  entry.resolve(result);
215
223
  } catch (err) {
216
- entry.reject(err);
224
+ entry.reject(err instanceof Error ? err : new Error(String(err)));
217
225
  }
218
226
  }
219
227
  } finally {
@@ -455,7 +463,7 @@ var init_dev_vitest_manager = __esmMin((() => {
455
463
  }
456
464
  const raw = testCase.meta().traces;
457
465
  let traces = [];
458
- if (Array.isArray(raw) && raw.length > 0) traces = raw.filter(isSerializedTrace);
466
+ if (Array.isArray(raw) && raw.length > 0) traces = parseSerializedTraces(raw);
459
467
  return {
460
468
  id: `${file}::${testCase.fullName}`,
461
469
  kind: "test",
@@ -471,9 +479,16 @@ var init_dev_vitest_manager = __esmMin((() => {
471
479
  };
472
480
  }
473
481
  };
482
+ serializedTraceSchema = z.object({
483
+ key: z.string(),
484
+ value: z.unknown(),
485
+ filePath: z.string(),
486
+ lineNumber: z.number(),
487
+ at: z.string()
488
+ });
474
489
  }));
475
490
  //#endregion
476
491
  init_dev_vitest_manager();
477
492
  export { DevVitestManager, init_dev_vitest_manager };
478
493
 
479
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGV2LXZpdGVzdC1tYW5hZ2VyLmpzIiwibmFtZXMiOltdLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy90ZXN0aW5nL2Rldi12aXRlc3QtbWFuYWdlci50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyB0eXBlIFVzZXJDb25maWcgYXMgVml0ZVVzZXJDb25maWcgfSBmcm9tIFwidml0ZVwiO1xuaW1wb3J0IHtcbiAgdHlwZSBDbGlPcHRpb25zLFxuICB0eXBlIFJlcG9ydGVyLFxuICB0eXBlIFRlc3RDYXNlLFxuICB0eXBlIFRlc3RNb2R1bGUsXG4gIHR5cGUgVGVzdFJ1blJlc3VsdCxcbiAgdHlwZSBUZXN0U3BlY2lmaWNhdGlvbixcbiAgdHlwZSBUZXN0U3VpdGUsXG4gIHR5cGUgVml0ZXN0LFxufSBmcm9tIFwidml0ZXN0L25vZGVcIjtcblxuaW1wb3J0IHsgdHlwZSBTZXJpYWxpemVkVHJhY2UgfSBmcm9tIFwiLi4vbmFpdGUvbmFpdGVcIjtcblxuLy8g7YWM7Iqk7Yq4IO2VnCDqsbTsnZggdHJhY2Ug66qo7J2MXG5leHBvcnQgdHlwZSBUZXN0Tm9kZUtpbmQgPSBcImZpbGVcIiB8IFwic3VpdGVcIiB8IFwidGVzdFwiO1xuZXhwb3J0IHR5cGUgVGVzdFN0YXRlID0gXCJwYXNzZWRcIiB8IFwiZmFpbGVkXCIgfCBcInNraXBwZWRcIiB8IFwidG9kb1wiIHwgXCJydW5uaW5nXCIgfCBcInVua25vd25cIjtcblxuZXhwb3J0IHR5cGUgVGVzdENhc2VSZXN1bHQgPSB7XG4gIGlkOiBzdHJpbmc7XG4gIGtpbmQ6IFRlc3ROb2RlS2luZDtcbiAgbmFtZTogc3RyaW5nO1xuICBmdWxsTmFtZTogc3RyaW5nO1xuICBmaWxlOiBzdHJpbmc7XG4gIHN0YXRlOiBUZXN0U3RhdGU7XG4gIGR1cmF0aW9uTXM6IG51bWJlciB8IG51bGw7XG4gIGNvdW50czogeyB0b3RhbDogbnVtYmVyOyBwYXNzZWQ6IG51bWJlcjsgZmFpbGVkOiBudW1iZXI7IHNraXBwZWQ6IG51bWJlciB9O1xuICBlcnJvcjogeyBtZXNzYWdlOiBzdHJpbmc7IHN0YWNrPzogc3RyaW5nIH0gfCBudWxsO1xuICB0cmFjZXM6IFNlcmlhbGl6ZWRUcmFjZVtdO1xuICBjaGlsZHJlbjogVGVzdENhc2VSZXN1bHRbXTtcbn07XG5cbmV4cG9ydCB0eXBlIFJ1blJlc3VsdCA9IHtcbiAgb2s6IGJvb2xlYW47XG4gIHN1bW1hcnk6IHtcbiAgICB0b3RhbDogbnVtYmVyO1xuICAgIHBhc3NlZDogbnVtYmVyO1xuICAgIGZhaWxlZDogbnVtYmVyO1xuICAgIHNraXBwZWQ6IG51bWJlcjtcbiAgICBkdXJhdGlvbk1zOiBudW1iZXI7XG4gIH07XG4gIHJlc3VsdHM6IFRlc3RDYXNlUmVzdWx0W107XG59O1xuXG5leHBvcnQgdHlwZSBNYW5hZ2VyU3RhdHVzID0ge1xuICByZWFkeTogYm9vbGVhbjtcbiAgcnVubmluZzogYm9vbGVhbjtcbiAgbGFzdFJ1bkF0OiBzdHJpbmcgfCBudWxsO1xufTtcblxuZXhwb3J0IHR5cGUgVGVzdEV2ZW50TGlzdGVuZXIgPSAoZXZlbnQ6IHN0cmluZywgZGF0YTogdW5rbm93bikgPT4gdm9pZDtcblxudHlwZSBRdWV1ZUVudHJ5ID0ge1xuICBydW5JZDogc3RyaW5nO1xuICB0YXNrOiAoKSA9PiBQcm9taXNlPFJ1blJlc3VsdD47XG4gIHJlc29sdmU6IChyZXN1bHQ6IFJ1blJlc3VsdCkgPT4gdm9pZDtcbiAgcmVqZWN0OiAoZXJyb3I6IHVua25vd24pID0+IHZvaWQ7XG59O1xuXG5leHBvcnQgY2xhc3MgRGV2Vml0ZXN0TWFuYWdlciB7XG4gIHByaXZhdGUgdml0ZXN0OiBWaXRlc3QgfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSBydW5uaW5nID0gZmFsc2U7XG4gIHByaXZhdGUgbGFzdFJ1bkF0OiBzdHJpbmcgfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSBxdWV1ZTogUXVldWVFbnRyeVtdID0gW107XG4gIHByaXZhdGUgcHJvY2Vzc2luZyA9IGZhbHNlO1xuICBwcml2YXRlIGNsb3NlZCA9IGZhbHNlO1xuICBwcml2YXRlIGV2ZW50TGlzdGVuZXJzID0gbmV3IFNldDxUZXN0RXZlbnRMaXN0ZW5lcj4oKTtcbiAgcHJpdmF0ZSBjdXJyZW50UnVuQ29udGV4dDoge1xuICAgIHJ1bklkOiBzdHJpbmc7XG4gICAgc3RhcnRlZEF0OiBzdHJpbmc7XG4gICAgc3BlY01vZHVsZUlkczogU2V0PHN0cmluZz47XG4gIH0gfCBudWxsID0gbnVsbDtcblxuICBhZGRFdmVudExpc3RlbmVyKGxpc3RlbmVyOiBUZXN0RXZlbnRMaXN0ZW5lcik6IHZvaWQge1xuICAgIHRoaXMuZXZlbnRMaXN0ZW5lcnMuYWRkKGxpc3RlbmVyKTtcbiAgfVxuXG4gIHJlbW92ZUV2ZW50TGlzdGVuZXIobGlzdGVuZXI6IFRlc3RFdmVudExpc3RlbmVyKTogdm9pZCB7XG4gICAgdGhpcy5ldmVudExpc3RlbmVycy5kZWxldGUobGlzdGVuZXIpO1xuICB9XG5cbiAgZW1pdEV2ZW50KGV2ZW50OiBzdHJpbmcsIGRhdGE6IHVua25vd24pOiB2b2lkIHtcbiAgICBmb3IgKGNvbnN0IGxpc3RlbmVyIG9mIHRoaXMuZXZlbnRMaXN0ZW5lcnMpIHtcbiAgICAgIGxpc3RlbmVyKGV2ZW50LCBkYXRhKTtcbiAgICB9XG4gIH1cblxuICBhc3luYyBzdGFydCh2aXRlc3RDb25maWdQYXRoPzogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgLy8g7J2066+4IOyLnOyekeuQnCDqsr3smrAg7KSR67O1IOy0iOq4sO2ZlOulvCDrsKnsp4BcbiAgICBpZiAodGhpcy52aXRlc3QpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCB7IGNyZWF0ZVZpdGVzdCB9ID0gYXdhaXQgaW1wb3J0KFwidml0ZXN0L25vZGVcIik7XG5cbiAgICBjb25zdCB2aXRlT3ZlcnJpZGVzOiBWaXRlVXNlckNvbmZpZyA9IHtcbiAgICAgIHNlcnZlcjogeyB3YXRjaDogbnVsbCB9LFxuICAgIH07XG5cbiAgICBjb25zdCBjbGlPcHRpb25zOiBDbGlPcHRpb25zID0ge1xuICAgICAgd2F0Y2g6IHRydWUsXG4gICAgICBzdGFuZGFsb25lOiB0cnVlLFxuICAgICAgZm9yY2VSZXJ1blRyaWdnZXJzOiBbXSxcbiAgICAgIGNvbmZpZzogdml0ZXN0Q29uZmlnUGF0aCxcbiAgICAgIGVudjoge1xuICAgICAgICBOT0RFX0VOVjogXCJ0ZXN0XCIsXG4gICAgICB9LFxuICAgIH07XG5cbiAgICBjb25zdCByZWFsdGltZVJlcG9ydGVyID0gdGhpcy5jcmVhdGVSZWFsdGltZVByb2dyZXNzUmVwb3J0ZXIoKTtcbiAgICB2aXRlT3ZlcnJpZGVzLnBsdWdpbnMgPSBbXG4gICAgICAuLi4odml0ZU92ZXJyaWRlcy5wbHVnaW5zID8/IFtdKSxcbiAgICAgIHtcbiAgICAgICAgbmFtZTogXCJzb25hbXUtcmVhbHRpbWUtcmVwb3J0ZXJcIixcbiAgICAgICAgY29uZmlndXJlVml0ZXN0KHsgdml0ZXN0OiB2aXRlc3RJbnN0YW5jZSB9OiB7IHZpdGVzdDogVml0ZXN0IH0pIHtcbiAgICAgICAgICBjb25zdCByZXBvcnRlcnMgPSB2aXRlc3RJbnN0YW5jZS5jb25maWcucmVwb3J0ZXJzO1xuICAgICAgICAgIGlmICghcmVwb3J0ZXJzLmluY2x1ZGVzKHJlYWx0aW1lUmVwb3J0ZXIpKSB7XG4gICAgICAgICAgICByZXBvcnRlcnMucHVzaChyZWFsdGltZVJlcG9ydGVyKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgIF07XG5cbiAgICBjb25zdCB2aXRlc3QgPSBhd2FpdCBjcmVhdGVWaXRlc3QoXCJ0ZXN0XCIsIGNsaU9wdGlvbnMsIHZpdGVPdmVycmlkZXMpO1xuICAgIHRyeSB7XG4gICAgICBhd2FpdCB2aXRlc3Quc3RhbmRhbG9uZSgpO1xuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgYXdhaXQgdml0ZXN0LmNsb3NlKCk7XG4gICAgICB0aHJvdyBlcnI7XG4gICAgfVxuXG4gICAgdGhpcy52aXRlc3QgPSB2aXRlc3Q7XG4gICAgdGhpcy52aXRlc3Qub25GaWx0ZXJXYXRjaGVkU3BlY2lmaWNhdGlvbigoX3NwZWMpID0+IGZhbHNlKTtcbiAgICB0aGlzLmNsb3NlZCA9IGZhbHNlO1xuICB9XG5cbiAgYXN5bmMgcnVuKG9wdHM6IHsgZmlsZXM/OiBzdHJpbmdbXTsgcGF0dGVybj86IHN0cmluZyB9LCBydW5JZDogc3RyaW5nKTogUHJvbWlzZTxSdW5SZXN1bHQ+IHtcbiAgICBpZiAodGhpcy5jbG9zZWQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIkRldlZpdGVzdE1hbmFnZXIgaXMgYWxyZWFkeSBzaHV0IGRvd25cIik7XG4gICAgfVxuICAgIGlmICghdGhpcy52aXRlc3QpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIkRldlZpdGVzdE1hbmFnZXIgaXMgbm90IHN0YXJ0ZWRcIik7XG4gICAgfVxuXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlPFJ1blJlc3VsdD4oKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgY29uc3QgdGFzayA9ICgpID0+IHRoaXMuZXhlY3V0ZVJ1bihvcHRzLCBydW5JZCk7XG4gICAgICB0aGlzLnF1ZXVlLnB1c2goeyBydW5JZCwgdGFzaywgcmVzb2x2ZSwgcmVqZWN0IH0pO1xuICAgICAgdGhpcy5wcm9jZXNzUXVldWUoKTtcbiAgICB9KTtcbiAgfVxuXG4gIGdldFN0YXR1cygpOiBNYW5hZ2VyU3RhdHVzIHtcbiAgICByZXR1cm4ge1xuICAgICAgcmVhZHk6IHRoaXMudml0ZXN0ICE9PSBudWxsICYmICF0aGlzLmNsb3NlZCxcbiAgICAgIHJ1bm5pbmc6IHRoaXMucnVubmluZyxcbiAgICAgIGxhc3RSdW5BdDogdGhpcy5sYXN0UnVuQXQsXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiDrs4Dqsr3rkJwg7YyM7J287J2EIFZpdGVzdCDrqqjrk4gg6re4656Y7ZSE7JeQ7IScIOustO2aqO2ZlO2VqeuLiOuLpC5cbiAgICogaG1yQW5kU3luY+yXkOyEnCDtmLjstpzrkJjslrQg64uk7J2MIO2FjOyKpO2KuCDsi6Ttlokg7IucIOy1nOyLoCDsvZTrk5zrpbwg7IKs7Jqp7ZWY64+E66GdIO2VqeuLiOuLpC5cbiAgICovXG4gIGludmFsaWRhdGVGaWxlcyhmaWxlUGF0aHM6IHN0cmluZ1tdKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLnZpdGVzdCB8fCB0aGlzLmNsb3NlZCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBmb3IgKGNvbnN0IGZpbGVQYXRoIG9mIGZpbGVQYXRocykge1xuICAgICAgdGhpcy52aXRlc3QuaW52YWxpZGF0ZUZpbGUoZmlsZVBhdGgpO1xuICAgIH1cbiAgfVxuXG4gIGFzeW5jIHNodXRkb3duKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGlmICh0aGlzLmNsb3NlZCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLmNsb3NlZCA9IHRydWU7XG5cbiAgICAvLyDtgZDsl5Ag64Ko7J2AIOyekeyXheuTpOydhCByZWplY3TtlZjsl6wg7Zi47Lac7J6Q6rCAIOyYgeq1rCDrjIDquLDtlZjsp4Ag7JWK64+E66GdIOygleumrFxuICAgIHdoaWxlICh0aGlzLnF1ZXVlLmxlbmd0aCA+IDApIHtcbiAgICAgIGNvbnN0IGVudHJ5ID0gdGhpcy5xdWV1ZS5zaGlmdCgpO1xuICAgICAgaWYgKGVudHJ5KSB7XG4gICAgICAgIGVudHJ5LnJlamVjdChuZXcgRXJyb3IoXCJEZXZWaXRlc3RNYW5hZ2VyIGlzIGJlaW5nIHNodXQgZG93blwiKSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgdGhpcy5ldmVudExpc3RlbmVycy5jbGVhcigpO1xuXG4gICAgaWYgKHRoaXMudml0ZXN0KSB7XG4gICAgICBhd2FpdCB0aGlzLnZpdGVzdC5jbG9zZSgpO1xuICAgICAgdGhpcy52aXRlc3QgPSBudWxsO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgcHJvY2Vzc1F1ZXVlKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGlmICh0aGlzLnByb2Nlc3NpbmcpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5wcm9jZXNzaW5nID0gdHJ1ZTtcblxuICAgIHRyeSB7XG4gICAgICB3aGlsZSAodGhpcy5xdWV1ZS5sZW5ndGggPiAwKSB7XG4gICAgICAgIGNvbnN0IGVudHJ5ID0gdGhpcy5xdWV1ZS5zaGlmdCgpO1xuICAgICAgICBpZiAoIWVudHJ5KSBicmVhaztcbiAgICAgICAgaWYgKHRoaXMuY2xvc2VkKSB7XG4gICAgICAgICAgZW50cnkucmVqZWN0KG5ldyBFcnJvcihcIkRldlZpdGVzdE1hbmFnZXIgaXMgYWxyZWFkeSBzaHV0IGRvd25cIikpO1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBlbnRyeS50YXNrKCk7XG4gICAgICAgICAgZW50cnkucmVzb2x2ZShyZXN1bHQpO1xuICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICBlbnRyeS5yZWplY3QoZXJyKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gZmluYWxseSB7XG4gICAgICB0aGlzLnByb2Nlc3NpbmcgPSBmYWxzZTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGV4ZWN1dGVSdW4oXG4gICAgb3B0czogeyBmaWxlcz86IHN0cmluZ1tdOyBwYXR0ZXJuPzogc3RyaW5nIH0sXG4gICAgcnVuSWQ6IHN0cmluZyxcbiAgKTogUHJvbWlzZTxSdW5SZXN1bHQ+IHtcbiAgICBjb25zdCB2aXRlc3QgPSB0aGlzLnZpdGVzdDtcbiAgICBpZiAoIXZpdGVzdCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiRGV2Vml0ZXN0TWFuYWdlciBpcyBub3Qgc3RhcnRlZFwiKTtcbiAgICB9XG5cbiAgICB0aGlzLnJ1bm5pbmcgPSB0cnVlO1xuICAgIGNvbnN0IHN0YXJ0VGltZSA9IERhdGUubm93KCk7XG5cbiAgICBpZiAob3B0cy5wYXR0ZXJuKSB7XG4gICAgICB2aXRlc3Quc2V0R2xvYmFsVGVzdE5hbWVQYXR0ZXJuKG9wdHMucGF0dGVybik7XG4gICAgfVxuXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHNwZWNzOiBUZXN0U3BlY2lmaWNhdGlvbltdID0gb3B0cy5maWxlc1xuICAgICAgICA/IGF3YWl0IHZpdGVzdC5nbG9iVGVzdFNwZWNpZmljYXRpb25zKG9wdHMuZmlsZXMpXG4gICAgICAgIDogYXdhaXQgdml0ZXN0Lmdsb2JUZXN0U3BlY2lmaWNhdGlvbnMoKTtcblxuICAgICAgY29uc3Qgc3BlY01vZHVsZUlkcyA9IG5ldyBTZXQoc3BlY3MubWFwKChzKSA9PiBzLm1vZHVsZUlkKSk7XG4gICAgICAvLyByb3V0ZXPsl5DshJwg7IOd7ISx7ZWcIHJ1bklk66W8IOq3uOuMgOuhnCDsgqzsmqntlZjsl6wgcnVuU3RhcnRlZC9ydW5Ob2RlUHJvZ3Jlc3MvcnVuQ29tcGxldGVkIOqwhCDsnbzqtIDshLEg67O07J6lXG4gICAgICB0aGlzLmN1cnJlbnRSdW5Db250ZXh0ID0ge1xuICAgICAgICBydW5JZCxcbiAgICAgICAgc3RhcnRlZEF0OiBuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKCksXG4gICAgICAgIHNwZWNNb2R1bGVJZHMsXG4gICAgICB9O1xuXG4gICAgICBjb25zdCBhbGxUZXN0c1J1biA9ICFvcHRzLmZpbGVzIHx8IG9wdHMuZmlsZXMubGVuZ3RoID09PSAwO1xuICAgICAgY29uc3QgcnVuUmVzdWx0OiBUZXN0UnVuUmVzdWx0ID0gYXdhaXQgdml0ZXN0LnJ1blRlc3RTcGVjaWZpY2F0aW9ucyhzcGVjcywgYWxsVGVzdHNSdW4pO1xuXG4gICAgICBjb25zdCBkdXJhdGlvbk1zID0gRGF0ZS5ub3coKSAtIHN0YXJ0VGltZTtcbiAgICAgIHRoaXMubGFzdFJ1bkF0ID0gbmV3IERhdGUoKS50b0lTT1N0cmluZygpO1xuXG4gICAgICByZXR1cm4gdGhpcy5jb2xsZWN0UmVzdWx0cyhydW5SZXN1bHQsIGR1cmF0aW9uTXMsIHNwZWNNb2R1bGVJZHMpO1xuICAgIH0gZmluYWxseSB7XG4gICAgICB0aGlzLmN1cnJlbnRSdW5Db250ZXh0ID0gbnVsbDtcbiAgICAgIGlmIChvcHRzLnBhdHRlcm4pIHtcbiAgICAgICAgdml0ZXN0LnJlc2V0R2xvYmFsVGVzdE5hbWVQYXR0ZXJuKCk7XG4gICAgICB9XG4gICAgICB0aGlzLnJ1bm5pbmcgPSBmYWxzZTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGNyZWF0ZVJlYWx0aW1lUHJvZ3Jlc3NSZXBvcnRlcigpOiBSZXBvcnRlciB7XG4gICAgY29uc3QgZW1pdFByb2dyZXNzID0gKFxuICAgICAga2luZDogXCJmaWxlXCIgfCBcInN1aXRlXCIgfCBcInRlc3RcIixcbiAgICAgIHBoYXNlOiBcInJlYWR5XCIgfCBcInJlc3VsdFwiLFxuICAgICAgZmlsZUlkOiBzdHJpbmcsXG4gICAgICBub2RlSWQ6IHN0cmluZyxcbiAgICAgIHBhcmVudElkOiBzdHJpbmcgfCBudWxsLFxuICAgICAgbm9kZTogVGVzdENhc2VSZXN1bHQsXG4gICAgKSA9PiB7XG4gICAgICBjb25zdCBjdHggPSB0aGlzLmN1cnJlbnRSdW5Db250ZXh0O1xuICAgICAgaWYgKCFjdHgpIHJldHVybjtcbiAgICAgIHRoaXMuZW1pdEV2ZW50KFwicnVuTm9kZVByb2dyZXNzXCIsIHtcbiAgICAgICAgc2NoZW1hVmVyc2lvbjogMSxcbiAgICAgICAgcnVuSWQ6IGN0eC5ydW5JZCxcbiAgICAgICAgc3RhcnRlZEF0OiBjdHguc3RhcnRlZEF0LFxuICAgICAgICBhdDogbmV3IERhdGUoKS50b0lTT1N0cmluZygpLFxuICAgICAgICBraW5kLFxuICAgICAgICBwaGFzZSxcbiAgICAgICAgZmlsZUlkLFxuICAgICAgICBub2RlSWQsXG4gICAgICAgIHBhcmVudElkLFxuICAgICAgICBub2RlLFxuICAgICAgfSk7XG4gICAgfTtcblxuICAgIHJldHVybiB7XG4gICAgICBvblRlc3RNb2R1bGVRdWV1ZWQ6ICh0ZXN0TW9kdWxlOiBUZXN0TW9kdWxlKSA9PiB7XG4gICAgICAgIGNvbnN0IGN0eCA9IHRoaXMuY3VycmVudFJ1bkNvbnRleHQ7XG4gICAgICAgIGlmICghY3R4IHx8ICFjdHguc3BlY01vZHVsZUlkcy5oYXModGVzdE1vZHVsZS5tb2R1bGVJZCkpIHJldHVybjtcbiAgICAgICAgY29uc3QgZmlsZUlkID0gdGVzdE1vZHVsZS5tb2R1bGVJZDtcbiAgICAgICAgZW1pdFByb2dyZXNzKFxuICAgICAgICAgIFwiZmlsZVwiLFxuICAgICAgICAgIFwicmVhZHlcIixcbiAgICAgICAgICBmaWxlSWQsXG4gICAgICAgICAgZmlsZUlkLFxuICAgICAgICAgIG51bGwsXG4gICAgICAgICAgdGhpcy5idWlsZEZpbGVQcm9ncmVzc05vZGUodGVzdE1vZHVsZSwgXCJyZWFkeVwiKSxcbiAgICAgICAgKTtcbiAgICAgIH0sXG4gICAgICBvblRlc3RNb2R1bGVFbmQ6ICh0ZXN0TW9kdWxlOiBUZXN0TW9kdWxlKSA9PiB7XG4gICAgICAgIGNvbnN0IGN0eCA9IHRoaXMuY3VycmVudFJ1bkNvbnRleHQ7XG4gICAgICAgIGlmICghY3R4IHx8ICFjdHguc3BlY01vZHVsZUlkcy5oYXModGVzdE1vZHVsZS5tb2R1bGVJZCkpIHJldHVybjtcbiAgICAgICAgY29uc3QgZmlsZUlkID0gdGVzdE1vZHVsZS5tb2R1bGVJZDtcbiAgICAgICAgZW1pdFByb2dyZXNzKFwiZmlsZVwiLCBcInJlc3VsdFwiLCBmaWxlSWQsIGZpbGVJZCwgbnVsbCwgdGhpcy5idWlsZEZpbGVOb2RlKHRlc3RNb2R1bGUpKTtcbiAgICAgIH0sXG4gICAgICBvblRlc3RTdWl0ZVJlYWR5OiAodGVzdFN1aXRlOiBUZXN0U3VpdGUpID0+IHtcbiAgICAgICAgY29uc3QgY3R4ID0gdGhpcy5jdXJyZW50UnVuQ29udGV4dDtcbiAgICAgICAgaWYgKCFjdHggfHwgIWN0eC5zcGVjTW9kdWxlSWRzLmhhcyh0ZXN0U3VpdGUubW9kdWxlLm1vZHVsZUlkKSkgcmV0dXJuO1xuICAgICAgICBjb25zdCBmaWxlSWQgPSB0ZXN0U3VpdGUubW9kdWxlLm1vZHVsZUlkO1xuICAgICAgICBjb25zdCBub2RlSWQgPSBgJHtmaWxlSWR9Ojoke3Rlc3RTdWl0ZS5mdWxsTmFtZX1gO1xuICAgICAgICBjb25zdCBwYXJlbnRJZCA9IHRoaXMucmVzb2x2ZVN1aXRlUGFyZW50SWQodGVzdFN1aXRlKTtcbiAgICAgICAgZW1pdFByb2dyZXNzKFxuICAgICAgICAgIFwic3VpdGVcIixcbiAgICAgICAgICBcInJlYWR5XCIsXG4gICAgICAgICAgZmlsZUlkLFxuICAgICAgICAgIG5vZGVJZCxcbiAgICAgICAgICBwYXJlbnRJZCxcbiAgICAgICAgICB0aGlzLmJ1aWxkU3VpdGVQcm9ncmVzc05vZGUodGVzdFN1aXRlLCBcInJlYWR5XCIpLFxuICAgICAgICApO1xuICAgICAgfSxcbiAgICAgIG9uVGVzdFN1aXRlUmVzdWx0OiAodGVzdFN1aXRlOiBUZXN0U3VpdGUpID0+IHtcbiAgICAgICAgY29uc3QgY3R4ID0gdGhpcy5jdXJyZW50UnVuQ29udGV4dDtcbiAgICAgICAgaWYgKCFjdHggfHwgIWN0eC5zcGVjTW9kdWxlSWRzLmhhcyh0ZXN0U3VpdGUubW9kdWxlLm1vZHVsZUlkKSkgcmV0dXJuO1xuICAgICAgICBjb25zdCBmaWxlSWQgPSB0ZXN0U3VpdGUubW9kdWxlLm1vZHVsZUlkO1xuICAgICAgICBjb25zdCBub2RlSWQgPSBgJHtmaWxlSWR9Ojoke3Rlc3RTdWl0ZS5mdWxsTmFtZX1gO1xuICAgICAgICBjb25zdCBwYXJlbnRJZCA9IHRoaXMucmVzb2x2ZVN1aXRlUGFyZW50SWQodGVzdFN1aXRlKTtcbiAgICAgICAgZW1pdFByb2dyZXNzKFxuICAgICAgICAgIFwic3VpdGVcIixcbiAgICAgICAgICBcInJlc3VsdFwiLFxuICAgICAgICAgIGZpbGVJZCxcbiAgICAgICAgICBub2RlSWQsXG4gICAgICAgICAgcGFyZW50SWQsXG4gICAgICAgICAgdGhpcy5idWlsZFN1aXRlTm9kZSh0ZXN0U3VpdGUsIGZpbGVJZCksXG4gICAgICAgICk7XG4gICAgICB9LFxuICAgICAgb25UZXN0Q2FzZVJlYWR5OiAodGVzdENhc2U6IFRlc3RDYXNlKSA9PiB7XG4gICAgICAgIGNvbnN0IGN0eCA9IHRoaXMuY3VycmVudFJ1bkNvbnRleHQ7XG4gICAgICAgIGlmICghY3R4IHx8ICFjdHguc3BlY01vZHVsZUlkcy5oYXModGVzdENhc2UubW9kdWxlLm1vZHVsZUlkKSkgcmV0dXJuO1xuICAgICAgICBjb25zdCBmaWxlSWQgPSB0ZXN0Q2FzZS5tb2R1bGUubW9kdWxlSWQ7XG4gICAgICAgIGNvbnN0IG5vZGVJZCA9IGAke2ZpbGVJZH06OiR7dGVzdENhc2UuZnVsbE5hbWV9YDtcbiAgICAgICAgY29uc3QgcGFyZW50SWQgPSB0aGlzLnJlc29sdmVUZXN0UGFyZW50SWQodGVzdENhc2UpO1xuICAgICAgICBlbWl0UHJvZ3Jlc3MoXG4gICAgICAgICAgXCJ0ZXN0XCIsXG4gICAgICAgICAgXCJyZWFkeVwiLFxuICAgICAgICAgIGZpbGVJZCxcbiAgICAgICAgICBub2RlSWQsXG4gICAgICAgICAgcGFyZW50SWQsXG4gICAgICAgICAgdGhpcy5idWlsZFRlc3RQcm9ncmVzc05vZGUodGVzdENhc2UsIFwicmVhZHlcIiksXG4gICAgICAgICk7XG4gICAgICB9LFxuICAgICAgb25UZXN0Q2FzZVJlc3VsdDogKHRlc3RDYXNlOiBUZXN0Q2FzZSkgPT4ge1xuICAgICAgICBjb25zdCBjdHggPSB0aGlzLmN1cnJlbnRSdW5Db250ZXh0O1xuICAgICAgICBpZiAoIWN0eCB8fCAhY3R4LnNwZWNNb2R1bGVJZHMuaGFzKHRlc3RDYXNlLm1vZHVsZS5tb2R1bGVJZCkpIHJldHVybjtcbiAgICAgICAgY29uc3QgZmlsZUlkID0gdGVzdENhc2UubW9kdWxlLm1vZHVsZUlkO1xuICAgICAgICBjb25zdCBub2RlSWQgPSBgJHtmaWxlSWR9Ojoke3Rlc3RDYXNlLmZ1bGxOYW1lfWA7XG4gICAgICAgIGNvbnN0IHBhcmVudElkID0gdGhpcy5yZXNvbHZlVGVzdFBhcmVudElkKHRlc3RDYXNlKTtcbiAgICAgICAgZW1pdFByb2dyZXNzKFxuICAgICAgICAgIFwidGVzdFwiLFxuICAgICAgICAgIFwicmVzdWx0XCIsXG4gICAgICAgICAgZmlsZUlkLFxuICAgICAgICAgIG5vZGVJZCxcbiAgICAgICAgICBwYXJlbnRJZCxcbiAgICAgICAgICB0aGlzLmJ1aWxkVGVzdE5vZGUodGVzdENhc2UsIGZpbGVJZCksXG4gICAgICAgICk7XG4gICAgICB9LFxuICAgIH07XG4gIH1cblxuICBwcml2YXRlIGJ1aWxkRmlsZVByb2dyZXNzTm9kZSh0ZXN0TW9kdWxlOiBUZXN0TW9kdWxlLCBfcGhhc2U6IFwicmVhZHlcIik6IFRlc3RDYXNlUmVzdWx0IHtcbiAgICByZXR1cm4ge1xuICAgICAgaWQ6IHRlc3RNb2R1bGUubW9kdWxlSWQsXG4gICAgICBraW5kOiBcImZpbGVcIixcbiAgICAgIG5hbWU6IHRlc3RNb2R1bGUubW9kdWxlSWQsXG4gICAgICBmdWxsTmFtZTogdGVzdE1vZHVsZS5tb2R1bGVJZCxcbiAgICAgIGZpbGU6IHRlc3RNb2R1bGUubW9kdWxlSWQsXG4gICAgICBzdGF0ZTogXCJydW5uaW5nXCIsXG4gICAgICBkdXJhdGlvbk1zOiBudWxsLFxuICAgICAgY291bnRzOiB7IHRvdGFsOiAwLCBwYXNzZWQ6IDAsIGZhaWxlZDogMCwgc2tpcHBlZDogMCB9LFxuICAgICAgZXJyb3I6IG51bGwsXG4gICAgICB0cmFjZXM6IFtdLFxuICAgICAgY2hpbGRyZW46IFtdLFxuICAgIH07XG4gIH1cblxuICBwcml2YXRlIGJ1aWxkU3VpdGVQcm9ncmVzc05vZGUodGVzdFN1aXRlOiBUZXN0U3VpdGUsIF9waGFzZTogXCJyZWFkeVwiKTogVGVzdENhc2VSZXN1bHQge1xuICAgIGNvbnN0IGZpbGVJZCA9IHRlc3RTdWl0ZS5tb2R1bGUubW9kdWxlSWQ7XG4gICAgcmV0dXJuIHtcbiAgICAgIGlkOiBgJHtmaWxlSWR9Ojoke3Rlc3RTdWl0ZS5mdWxsTmFtZX1gLFxuICAgICAga2luZDogXCJzdWl0ZVwiLFxuICAgICAgbmFtZTogdGVzdFN1aXRlLm5hbWUsXG4gICAgICBmdWxsTmFtZTogdGVzdFN1aXRlLmZ1bGxOYW1lLFxuICAgICAgZmlsZTogZmlsZUlkLFxuICAgICAgc3RhdGU6IFwicnVubmluZ1wiLFxuICAgICAgZHVyYXRpb25NczogbnVsbCxcbiAgICAgIGNvdW50czogeyB0b3RhbDogMCwgcGFzc2VkOiAwLCBmYWlsZWQ6IDAsIHNraXBwZWQ6IDAgfSxcbiAgICAgIGVycm9yOiBudWxsLFxuICAgICAgdHJhY2VzOiBbXSxcbiAgICAgIGNoaWxkcmVuOiBbXSxcbiAgICB9O1xuICB9XG5cbiAgcHJpdmF0ZSBidWlsZFRlc3RQcm9ncmVzc05vZGUodGVzdENhc2U6IFRlc3RDYXNlLCBfcGhhc2U6IFwicmVhZHlcIik6IFRlc3RDYXNlUmVzdWx0IHtcbiAgICBjb25zdCBmaWxlSWQgPSB0ZXN0Q2FzZS5tb2R1bGUubW9kdWxlSWQ7XG4gICAgcmV0dXJuIHtcbiAgICAgIGlkOiBgJHtmaWxlSWR9Ojoke3Rlc3RDYXNlLmZ1bGxOYW1lfWAsXG4gICAgICBraW5kOiBcInRlc3RcIixcbiAgICAgIG5hbWU6IHRlc3RDYXNlLm5hbWUsXG4gICAgICBmdWxsTmFtZTogdGVzdENhc2UuZnVsbE5hbWUsXG4gICAgICBmaWxlOiBmaWxlSWQsXG4gICAgICBzdGF0ZTogXCJydW5uaW5nXCIsXG4gICAgICBkdXJhdGlvbk1zOiBudWxsLFxuICAgICAgY291bnRzOiB7IHRvdGFsOiAxLCBwYXNzZWQ6IDAsIGZhaWxlZDogMCwgc2tpcHBlZDogMCB9LFxuICAgICAgZXJyb3I6IG51bGwsXG4gICAgICB0cmFjZXM6IFtdLFxuICAgICAgY2hpbGRyZW46IFtdLFxuICAgIH07XG4gIH1cblxuICBwcml2YXRlIHJlc29sdmVTdWl0ZVBhcmVudElkKHRlc3RTdWl0ZTogVGVzdFN1aXRlKTogc3RyaW5nIHtcbiAgICBjb25zdCBwYXJlbnQgPSB0ZXN0U3VpdGUucGFyZW50O1xuICAgIGlmIChwYXJlbnQudHlwZSA9PT0gXCJzdWl0ZVwiKSB7XG4gICAgICByZXR1cm4gYCR7dGVzdFN1aXRlLm1vZHVsZS5tb2R1bGVJZH06OiR7cGFyZW50LmZ1bGxOYW1lfWA7XG4gICAgfVxuICAgIHJldHVybiB0ZXN0U3VpdGUubW9kdWxlLm1vZHVsZUlkO1xuICB9XG5cbiAgcHJpdmF0ZSByZXNvbHZlVGVzdFBhcmVudElkKHRlc3RDYXNlOiBUZXN0Q2FzZSk6IHN0cmluZyB7XG4gICAgY29uc3QgcGFyZW50ID0gdGVzdENhc2UucGFyZW50O1xuICAgIGlmIChwYXJlbnQudHlwZSA9PT0gXCJzdWl0ZVwiKSB7XG4gICAgICByZXR1cm4gYCR7dGVzdENhc2UubW9kdWxlLm1vZHVsZUlkfTo6JHtwYXJlbnQuZnVsbE5hbWV9YDtcbiAgICB9XG4gICAgcmV0dXJuIHRlc3RDYXNlLm1vZHVsZS5tb2R1bGVJZDtcbiAgfVxuXG4gIHByaXZhdGUgY29sbGVjdFJlc3VsdHMoXG4gICAgcnVuUmVzdWx0OiBUZXN0UnVuUmVzdWx0LFxuICAgIGR1cmF0aW9uTXM6IG51bWJlcixcbiAgICBzcGVjTW9kdWxlSWRzOiBTZXQ8c3RyaW5nPixcbiAgKTogUnVuUmVzdWx0IHtcbiAgICBjb25zdCByZXN1bHRzQnlGaWxlID0gbmV3IE1hcDxzdHJpbmcsIFRlc3RDYXNlUmVzdWx0PigpO1xuXG4gICAgZm9yIChjb25zdCB0ZXN0TW9kdWxlIG9mIHJ1blJlc3VsdC50ZXN0TW9kdWxlcykge1xuICAgICAgaWYgKCFzcGVjTW9kdWxlSWRzLmhhcyh0ZXN0TW9kdWxlLm1vZHVsZUlkKSkgY29udGludWU7XG4gICAgICBjb25zdCBuZXh0UmVzdWx0ID0gdGhpcy5idWlsZEZpbGVOb2RlKHRlc3RNb2R1bGUpO1xuICAgICAgY29uc3QgZXhpc3RpbmdSZXN1bHQgPSByZXN1bHRzQnlGaWxlLmdldChuZXh0UmVzdWx0LmlkKTtcblxuICAgICAgaWYgKCFleGlzdGluZ1Jlc3VsdCkge1xuICAgICAgICByZXN1bHRzQnlGaWxlLnNldChuZXh0UmVzdWx0LmlkLCBuZXh0UmVzdWx0KTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGV4aXN0aW5nU2NvcmUgPSBnZXRSZXN1bHRDb21wbGV0ZW5lc3NTY29yZShleGlzdGluZ1Jlc3VsdCk7XG4gICAgICBjb25zdCBuZXh0U2NvcmUgPSBnZXRSZXN1bHRDb21wbGV0ZW5lc3NTY29yZShuZXh0UmVzdWx0KTtcbiAgICAgIGlmIChuZXh0U2NvcmUgPj0gZXhpc3RpbmdTY29yZSkge1xuICAgICAgICByZXN1bHRzQnlGaWxlLnNldChuZXh0UmVzdWx0LmlkLCBuZXh0UmVzdWx0KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCByZXN1bHRzID0gQXJyYXkuZnJvbShyZXN1bHRzQnlGaWxlLnZhbHVlcygpKTtcbiAgICBjb25zdCBzdW1tYXJ5ID0gYWdncmVnYXRlQ291bnRzKHJlc3VsdHMpO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIG9rOiBzdW1tYXJ5LmZhaWxlZCA9PT0gMCxcbiAgICAgIHN1bW1hcnk6IHsgLi4uc3VtbWFyeSwgZHVyYXRpb25NcyB9LFxuICAgICAgcmVzdWx0cyxcbiAgICB9O1xuICB9XG5cbiAgcHJpdmF0ZSBidWlsZEZpbGVOb2RlKHRlc3RNb2R1bGU6IFRlc3RNb2R1bGUpOiBUZXN0Q2FzZVJlc3VsdCB7XG4gICAgY29uc3QgZmlsZSA9IHRlc3RNb2R1bGUubW9kdWxlSWQ7XG4gICAgY29uc3QgY2hpbGRyZW4gPSB0aGlzLmJ1aWxkQ2hpbGROb2Rlcyh0ZXN0TW9kdWxlLCBmaWxlKTtcbiAgICBjb25zdCBjb3VudHMgPSBhZ2dyZWdhdGVDb3VudHMoY2hpbGRyZW4pO1xuICAgIGNvbnN0IG1vZHVsZVN0YXRlID0gdGVzdE1vZHVsZS5zdGF0ZSgpO1xuICAgIGNvbnN0IGRpYWdub3N0aWMgPSB0ZXN0TW9kdWxlLmRpYWdub3N0aWMoKTtcblxuICAgIHJldHVybiB7XG4gICAgICBpZDogdGVzdE1vZHVsZS5tb2R1bGVJZCxcbiAgICAgIGtpbmQ6IFwiZmlsZVwiLFxuICAgICAgbmFtZTogdGVzdE1vZHVsZS5tb2R1bGVJZCxcbiAgICAgIGZ1bGxOYW1lOiB0ZXN0TW9kdWxlLm1vZHVsZUlkLFxuICAgICAgZmlsZSxcbiAgICAgIHN0YXRlOiBtYXBNb2R1bGVTdGF0ZShtb2R1bGVTdGF0ZSksXG4gICAgICBkdXJhdGlvbk1zOiBkaWFnbm9zdGljLmR1cmF0aW9uID4gMCA/IGRpYWdub3N0aWMuZHVyYXRpb24gOiBudWxsLFxuICAgICAgY291bnRzLFxuICAgICAgZXJyb3I6IG51bGwsXG4gICAgICB0cmFjZXM6IFtdLFxuICAgICAgY2hpbGRyZW4sXG4gICAgfTtcbiAgfVxuXG4gIHByaXZhdGUgYnVpbGRDaGlsZE5vZGVzKHBhcmVudDogVGVzdE1vZHVsZSB8IFRlc3RTdWl0ZSwgZmlsZTogc3RyaW5nKTogVGVzdENhc2VSZXN1bHRbXSB7XG4gICAgY29uc3QgcmVzdWx0OiBUZXN0Q2FzZVJlc3VsdFtdID0gW107XG4gICAgZm9yIChjb25zdCBjaGlsZCBvZiBwYXJlbnQuY2hpbGRyZW4pIHtcbiAgICAgIGlmIChjaGlsZC50eXBlID09PSBcInN1aXRlXCIpIHtcbiAgICAgICAgcmVzdWx0LnB1c2godGhpcy5idWlsZFN1aXRlTm9kZShjaGlsZCwgZmlsZSkpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmVzdWx0LnB1c2godGhpcy5idWlsZFRlc3ROb2RlKGNoaWxkLCBmaWxlKSk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICBwcml2YXRlIGJ1aWxkU3VpdGVOb2RlKHN1aXRlOiBUZXN0U3VpdGUsIGZpbGU6IHN0cmluZyk6IFRlc3RDYXNlUmVzdWx0IHtcbiAgICBjb25zdCBjaGlsZHJlbiA9IHRoaXMuYnVpbGRDaGlsZE5vZGVzKHN1aXRlLCBmaWxlKTtcbiAgICBjb25zdCBjb3VudHMgPSBhZ2dyZWdhdGVDb3VudHMoY2hpbGRyZW4pO1xuICAgIGNvbnN0IHN1aXRlU3RhdGUgPSBzdWl0ZS5zdGF0ZSgpO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIGlkOiBgJHtmaWxlfTo6JHtzdWl0ZS5mdWxsTmFtZX1gLFxuICAgICAga2luZDogXCJzdWl0ZVwiLFxuICAgICAgbmFtZTogc3VpdGUubmFtZSxcbiAgICAgIGZ1bGxOYW1lOiBzdWl0ZS5mdWxsTmFtZSxcbiAgICAgIGZpbGUsXG4gICAgICBzdGF0ZTogbWFwU3VpdGVTdGF0ZShzdWl0ZVN0YXRlKSxcbiAgICAgIGR1cmF0aW9uTXM6IG51bGwsXG4gICAgICBjb3VudHMsXG4gICAgICBlcnJvcjogbnVsbCxcbiAgICAgIHRyYWNlczogW10sXG4gICAgICBjaGlsZHJlbixcbiAgICB9O1xuICB9XG5cbiAgcHJpdmF0ZSBidWlsZFRlc3ROb2RlKHRlc3RDYXNlOiBUZXN0Q2FzZSwgZmlsZTogc3RyaW5nKTogVGVzdENhc2VSZXN1bHQge1xuICAgIGNvbnN0IHJlc3VsdCA9IHRlc3RDYXNlLnJlc3VsdCgpO1xuICAgIGNvbnN0IGRpYWdub3N0aWMgPSB0ZXN0Q2FzZS5kaWFnbm9zdGljKCk7XG4gICAgY29uc3Qgc3RhdGUgPSBtYXBUZXN0UmVzdWx0KHJlc3VsdCwgdGVzdENhc2Uub3B0aW9ucy5tb2RlKTtcblxuICAgIGxldCBlcnJvcjogeyBtZXNzYWdlOiBzdHJpbmc7IHN0YWNrPzogc3RyaW5nIH0gfCBudWxsID0gbnVsbDtcbiAgICBpZiAocmVzdWx0LnN0YXRlID09PSBcImZhaWxlZFwiICYmIHJlc3VsdC5lcnJvcnMubGVuZ3RoID4gMCkge1xuICAgICAgY29uc3QgZmlyc3RFcnJvciA9IHJlc3VsdC5lcnJvcnNbMF07XG4gICAgICBlcnJvciA9IHtcbiAgICAgICAgbWVzc2FnZTogZmlyc3RFcnJvci5tZXNzYWdlID8/IFN0cmluZyhmaXJzdEVycm9yKSxcbiAgICAgICAgc3RhY2s6IGZpcnN0RXJyb3Iuc3RhY2ssXG4gICAgICB9O1xuICAgIH1cblxuICAgIGNvbnN0IHJhdyA9IHRlc3RDYXNlLm1ldGEoKS50cmFjZXM7XG4gICAgbGV0IHRyYWNlczogU2VyaWFsaXplZFRyYWNlW10gPSBbXTtcbiAgICBpZiAoQXJyYXkuaXNBcnJheShyYXcpICYmIHJhdy5sZW5ndGggPiAwKSB7XG4gICAgICB0cmFjZXMgPSByYXcuZmlsdGVyKGlzU2VyaWFsaXplZFRyYWNlKTtcbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgaWQ6IGAke2ZpbGV9Ojoke3Rlc3RDYXNlLmZ1bGxOYW1lfWAsXG4gICAgICBraW5kOiBcInRlc3RcIixcbiAgICAgIG5hbWU6IHRlc3RDYXNlLm5hbWUsXG4gICAgICBmdWxsTmFtZTogdGVzdENhc2UuZnVsbE5hbWUsXG4gICAgICBmaWxlLFxuICAgICAgc3RhdGUsXG4gICAgICBkdXJhdGlvbk1zOiBkaWFnbm9zdGljID8gZGlhZ25vc3RpYy5kdXJhdGlvbiA6IG51bGwsXG4gICAgICBjb3VudHM6IGNvdW50RnJvbVN0YXRlKHN0YXRlKSxcbiAgICAgIGVycm9yLFxuICAgICAgdHJhY2VzLFxuICAgICAgY2hpbGRyZW46IFtdLFxuICAgIH07XG4gIH1cbn1cblxuZnVuY3Rpb24gbWFwTW9kdWxlU3RhdGUoc3RhdGU6IFwic2tpcHBlZFwiIHwgXCJwZW5kaW5nXCIgfCBcImZhaWxlZFwiIHwgXCJwYXNzZWRcIiB8IFwicXVldWVkXCIpOiBUZXN0U3RhdGUge1xuICBzd2l0Y2ggKHN0YXRlKSB7XG4gICAgY2FzZSBcInBhc3NlZFwiOlxuICAgICAgcmV0dXJuIFwicGFzc2VkXCI7XG4gICAgY2FzZSBcImZhaWxlZFwiOlxuICAgICAgcmV0dXJuIFwiZmFpbGVkXCI7XG4gICAgY2FzZSBcInNraXBwZWRcIjpcbiAgICAgIHJldHVybiBcInNraXBwZWRcIjtcbiAgICBjYXNlIFwicGVuZGluZ1wiOlxuICAgIGNhc2UgXCJxdWV1ZWRcIjpcbiAgICAgIHJldHVybiBcInJ1bm5pbmdcIjtcbiAgICBkZWZhdWx0OlxuICAgICAgcmV0dXJuIFwidW5rbm93blwiO1xuICB9XG59XG5cbmZ1bmN0aW9uIG1hcFN1aXRlU3RhdGUoc3RhdGU6IFwic2tpcHBlZFwiIHwgXCJwZW5kaW5nXCIgfCBcImZhaWxlZFwiIHwgXCJwYXNzZWRcIik6IFRlc3RTdGF0ZSB7XG4gIHN3aXRjaCAoc3RhdGUpIHtcbiAgICBjYXNlIFwicGFzc2VkXCI6XG4gICAgICByZXR1cm4gXCJwYXNzZWRcIjtcbiAgICBjYXNlIFwiZmFpbGVkXCI6XG4gICAgICByZXR1cm4gXCJmYWlsZWRcIjtcbiAgICBjYXNlIFwic2tpcHBlZFwiOlxuICAgICAgcmV0dXJuIFwic2tpcHBlZFwiO1xuICAgIGNhc2UgXCJwZW5kaW5nXCI6XG4gICAgICByZXR1cm4gXCJydW5uaW5nXCI7XG4gICAgZGVmYXVsdDpcbiAgICAgIHJldHVybiBcInVua25vd25cIjtcbiAgfVxufVxuXG5mdW5jdGlvbiBtYXBUZXN0UmVzdWx0KFxuICByZXN1bHQ6IFJldHVyblR5cGU8VGVzdENhc2VbXCJyZXN1bHRcIl0+LFxuICBtb2RlOiBcInJ1blwiIHwgXCJvbmx5XCIgfCBcInNraXBcIiB8IFwidG9kb1wiLFxuKTogVGVzdFN0YXRlIHtcbiAgc3dpdGNoIChyZXN1bHQuc3RhdGUpIHtcbiAgICBjYXNlIFwicGFzc2VkXCI6XG4gICAgICByZXR1cm4gXCJwYXNzZWRcIjtcbiAgICBjYXNlIFwiZmFpbGVkXCI6XG4gICAgICByZXR1cm4gXCJmYWlsZWRcIjtcbiAgICBjYXNlIFwic2tpcHBlZFwiOlxuICAgICAgcmV0dXJuIG1vZGUgPT09IFwidG9kb1wiID8gXCJ0b2RvXCIgOiBcInNraXBwZWRcIjtcbiAgICBjYXNlIFwicGVuZGluZ1wiOlxuICAgICAgcmV0dXJuIFwicnVubmluZ1wiO1xuICAgIGRlZmF1bHQ6XG4gICAgICByZXR1cm4gXCJ1bmtub3duXCI7XG4gIH1cbn1cblxuZnVuY3Rpb24gY291bnRGcm9tU3RhdGUoc3RhdGU6IFRlc3RTdGF0ZSk6IHtcbiAgdG90YWw6IG51bWJlcjtcbiAgcGFzc2VkOiBudW1iZXI7XG4gIGZhaWxlZDogbnVtYmVyO1xuICBza2lwcGVkOiBudW1iZXI7XG59IHtcbiAgc3dpdGNoIChzdGF0ZSkge1xuICAgIGNhc2UgXCJwYXNzZWRcIjpcbiAgICAgIHJldHVybiB7IHRvdGFsOiAxLCBwYXNzZWQ6IDEsIGZhaWxlZDogMCwgc2tpcHBlZDogMCB9O1xuICAgIGNhc2UgXCJmYWlsZWRcIjpcbiAgICAgIHJldHVybiB7IHRvdGFsOiAxLCBwYXNzZWQ6IDAsIGZhaWxlZDogMSwgc2tpcHBlZDogMCB9O1xuICAgIGNhc2UgXCJza2lwcGVkXCI6XG4gICAgY2FzZSBcInRvZG9cIjpcbiAgICAgIHJldHVybiB7IHRvdGFsOiAxLCBwYXNzZWQ6IDAsIGZhaWxlZDogMCwgc2tpcHBlZDogMSB9O1xuICAgIGRlZmF1bHQ6XG4gICAgICAvLyBydW5uaW5nL3Vua25vd24g7IOB7YOc64+EIHRvdGFs7JeQIO2PrO2VqO2VmOyXrCDtjIzsnbwg64W465OcIGNvdW50cy50b3RhbOydtCDtlZjsnIQg7ZWp6rOE7JmAIOydvOy5mO2VmOuPhOuhnSDtlahcbiAgICAgIHJldHVybiB7IHRvdGFsOiAxLCBwYXNzZWQ6IDAsIGZhaWxlZDogMCwgc2tpcHBlZDogMCB9O1xuICB9XG59XG5cbmZ1bmN0aW9uIGFnZ3JlZ2F0ZUNvdW50cyhjaGlsZHJlbjogVGVzdENhc2VSZXN1bHRbXSk6IHtcbiAgdG90YWw6IG51bWJlcjtcbiAgcGFzc2VkOiBudW1iZXI7XG4gIGZhaWxlZDogbnVtYmVyO1xuICBza2lwcGVkOiBudW1iZXI7XG59IHtcbiAgbGV0IHRvdGFsID0gMDtcbiAgbGV0IHBhc3NlZCA9IDA7XG4gIGxldCBmYWlsZWQgPSAwO1xuICBsZXQgc2tpcHBlZCA9IDA7XG4gIGZvciAoY29uc3QgY2hpbGQgb2YgY2hpbGRyZW4pIHtcbiAgICB0b3RhbCArPSBjaGlsZC5jb3VudHMudG90YWw7XG4gICAgcGFzc2VkICs9IGNoaWxkLmNvdW50cy5wYXNzZWQ7XG4gICAgZmFpbGVkICs9IGNoaWxkLmNvdW50cy5mYWlsZWQ7XG4gICAgc2tpcHBlZCArPSBjaGlsZC5jb3VudHMuc2tpcHBlZDtcbiAgfVxuICByZXR1cm4geyB0b3RhbCwgcGFzc2VkLCBmYWlsZWQsIHNraXBwZWQgfTtcbn1cblxuZnVuY3Rpb24gZ2V0UmVzdWx0Q29tcGxldGVuZXNzU2NvcmUobm9kZTogVGVzdENhc2VSZXN1bHQpOiBudW1iZXIge1xuICBsZXQgc2NvcmUgPSAwO1xuICAvLyDthYzsiqTtirgg7IiY6rCAIOuNlCDrp47snYAg6rKw6rO866W8IOyasOyEoO2VmOyXrCDspJHrs7Ug7YyM7J28IOuzke2VqSDsi5wg7KCV67O0IOyGkOyLpOydhCDspITsnoXri4jri6QuXG4gIHNjb3JlICs9IG5vZGUuY291bnRzLnRvdGFsICogMTAwMDtcbiAgc2NvcmUgKz0gbm9kZS5jaGlsZHJlbi5sZW5ndGggKiAxMDA7XG4gIGlmIChub2RlLmR1cmF0aW9uTXMgIT09IG51bGwpIHNjb3JlICs9IDEwO1xuXG4gIHN3aXRjaCAobm9kZS5zdGF0ZSkge1xuICAgIGNhc2UgXCJmYWlsZWRcIjpcbiAgICAgIHNjb3JlICs9IDU7XG4gICAgICBicmVhaztcbiAgICBjYXNlIFwicGFzc2VkXCI6XG4gICAgICBzY29yZSArPSA0O1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSBcInNraXBwZWRcIjpcbiAgICAgIHNjb3JlICs9IDM7XG4gICAgICBicmVhaztcbiAgICBjYXNlIFwidG9kb1wiOlxuICAgICAgc2NvcmUgKz0gMjtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgXCJydW5uaW5nXCI6XG4gICAgICBzY29yZSArPSAxO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSBcInVua25vd25cIjpcbiAgICAgIGJyZWFrO1xuICAgIGRlZmF1bHQ6XG4gICAgICBicmVhaztcbiAgfVxuXG4gIHJldHVybiBzY29yZTtcbn1cblxuZnVuY3Rpb24gaXNTZXJpYWxpemVkVHJhY2UodmFsdWU6IHVua25vd24pOiB2YWx1ZSBpcyBTZXJpYWxpemVkVHJhY2Uge1xuICBpZiAodHlwZW9mIHZhbHVlICE9PSBcIm9iamVjdFwiIHx8IHZhbHVlID09PSBudWxsKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIGNvbnN0IHYgPSB2YWx1ZSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgcmV0dXJuIChcbiAgICB0eXBlb2Ygdi5rZXkgPT09IFwic3RyaW5nXCIgJiZcbiAgICB0eXBlb2Ygdi5maWxlUGF0aCA9PT0gXCJzdHJpbmdcIiAmJlxuICAgIHR5cGVvZiB2LmxpbmVOdW1iZXIgPT09IFwibnVtYmVyXCIgJiZcbiAgICB0eXBlb2Ygdi5hdCA9PT0gXCJzdHJpbmdcIiAmJlxuICAgIFwidmFsdWVcIiBpbiB2XG4gICk7XG59XG4iXSwibWFwcGluZ3MiOiI7O0FBb2pCQSxTQUFTLGVBQWUsT0FBMEU7Q0FDaEcsUUFBUSxPQUFSO0VBQ0UsS0FBSyxVQUNILE9BQU87RUFDVCxLQUFLLFVBQ0gsT0FBTztFQUNULEtBQUssV0FDSCxPQUFPO0VBQ1QsS0FBSztFQUNMLEtBQUssVUFDSCxPQUFPO0VBQ1QsU0FDRSxPQUFPO0NBQ1g7QUFDRjtBQUVBLFNBQVMsY0FBYyxPQUErRDtDQUNwRixRQUFRLE9BQVI7RUFDRSxLQUFLLFVBQ0gsT0FBTztFQUNULEtBQUssVUFDSCxPQUFPO0VBQ1QsS0FBSyxXQUNILE9BQU87RUFDVCxLQUFLLFdBQ0gsT0FBTztFQUNULFNBQ0UsT0FBTztDQUNYO0FBQ0Y7QUFFQSxTQUFTLGNBQ1AsUUFDQSxNQUNXO0NBQ1gsUUFBUSxPQUFPLE9BQWY7RUFDRSxLQUFLLFVBQ0gsT0FBTztFQUNULEtBQUssVUFDSCxPQUFPO0VBQ1QsS0FBSyxXQUNILE9BQU8sU0FBUyxTQUFTLFNBQVM7RUFDcEMsS0FBSyxXQUNILE9BQU87RUFDVCxTQUNFLE9BQU87Q0FDWDtBQUNGO0FBRUEsU0FBUyxlQUFlLE9BS3RCO0NBQ0EsUUFBUSxPQUFSO0VBQ0UsS0FBSyxVQUNILE9BQU87R0FBRSxPQUFPO0dBQUcsUUFBUTtHQUFHLFFBQVE7R0FBRyxTQUFTO0VBQUU7RUFDdEQsS0FBSyxVQUNILE9BQU87R0FBRSxPQUFPO0dBQUcsUUFBUTtHQUFHLFFBQVE7R0FBRyxTQUFTO0VBQUU7RUFD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
494
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGV2LXZpdGVzdC1tYW5hZ2VyLmpzIiwibmFtZXMiOltdLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy90ZXN0aW5nL2Rldi12aXRlc3QtbWFuYWdlci50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyB0eXBlIFVzZXJDb25maWcgYXMgVml0ZVVzZXJDb25maWcgfSBmcm9tIFwidml0ZVwiO1xuaW1wb3J0IHtcbiAgdHlwZSBDbGlPcHRpb25zLFxuICB0eXBlIFJlcG9ydGVyLFxuICB0eXBlIFRlc3RDYXNlLFxuICB0eXBlIFRlc3RNb2R1bGUsXG4gIHR5cGUgVGVzdFJ1blJlc3VsdCxcbiAgdHlwZSBUZXN0U3BlY2lmaWNhdGlvbixcbiAgdHlwZSBUZXN0U3VpdGUsXG4gIHR5cGUgVml0ZXN0LFxufSBmcm9tIFwidml0ZXN0L25vZGVcIjtcbmltcG9ydCB7IHogfSBmcm9tIFwiem9kXCI7XG5cbmltcG9ydCB7IHR5cGUgU2VyaWFsaXplZFRyYWNlIH0gZnJvbSBcIi4uL25haXRlL25haXRlXCI7XG5cbi8vIO2FjOyKpO2KuCDtlZwg6rG07J2YIHRyYWNlIOuqqOydjFxuZXhwb3J0IHR5cGUgVGVzdE5vZGVLaW5kID0gXCJmaWxlXCIgfCBcInN1aXRlXCIgfCBcInRlc3RcIjtcbmV4cG9ydCB0eXBlIFRlc3RTdGF0ZSA9IFwicGFzc2VkXCIgfCBcImZhaWxlZFwiIHwgXCJza2lwcGVkXCIgfCBcInRvZG9cIiB8IFwicnVubmluZ1wiIHwgXCJ1bmtub3duXCI7XG5cbmV4cG9ydCB0eXBlIFRlc3RDYXNlUmVzdWx0ID0ge1xuICBpZDogc3RyaW5nO1xuICBraW5kOiBUZXN0Tm9kZUtpbmQ7XG4gIG5hbWU6IHN0cmluZztcbiAgZnVsbE5hbWU6IHN0cmluZztcbiAgZmlsZTogc3RyaW5nO1xuICBzdGF0ZTogVGVzdFN0YXRlO1xuICBkdXJhdGlvbk1zOiBudW1iZXIgfCBudWxsO1xuICBjb3VudHM6IFRlc3RDb3VudHM7XG4gIGVycm9yOiB7IG1lc3NhZ2U6IHN0cmluZzsgc3RhY2s/OiBzdHJpbmcgfSB8IG51bGw7XG4gIHRyYWNlczogU2VyaWFsaXplZFRyYWNlW107XG4gIGNoaWxkcmVuOiBUZXN0Q2FzZVJlc3VsdFtdO1xufTtcblxuZXhwb3J0IHR5cGUgVGVzdENvdW50cyA9IHtcbiAgdG90YWw6IG51bWJlcjtcbiAgcGFzc2VkOiBudW1iZXI7XG4gIGZhaWxlZDogbnVtYmVyO1xuICBza2lwcGVkOiBudW1iZXI7XG59O1xuXG5leHBvcnQgdHlwZSBSdW5SZXN1bHQgPSB7XG4gIG9rOiBib29sZWFuO1xuICBzdW1tYXJ5OiB7XG4gICAgdG90YWw6IG51bWJlcjtcbiAgICBwYXNzZWQ6IG51bWJlcjtcbiAgICBmYWlsZWQ6IG51bWJlcjtcbiAgICBza2lwcGVkOiBudW1iZXI7XG4gICAgZHVyYXRpb25NczogbnVtYmVyO1xuICB9O1xuICByZXN1bHRzOiBUZXN0Q2FzZVJlc3VsdFtdO1xufTtcblxuZXhwb3J0IHR5cGUgTWFuYWdlclN0YXR1cyA9IHtcbiAgcmVhZHk6IGJvb2xlYW47XG4gIHJ1bm5pbmc6IGJvb2xlYW47XG4gIGxhc3RSdW5BdDogc3RyaW5nIHwgbnVsbDtcbn07XG5cbmV4cG9ydCB0eXBlIFRlc3RFdmVudFBheWxvYWQgPVxuICB8IHsgc2NoZW1hVmVyc2lvbjogbnVtYmVyOyBydW5JZDogc3RyaW5nOyBxdWV1ZWRBdDogc3RyaW5nOyByZXF1ZXN0OiBSdW5SZXF1ZXN0IH1cbiAgfCB7IHNjaGVtYVZlcnNpb246IG51bWJlcjsgcnVuSWQ6IHN0cmluZzsgc3RhcnRlZEF0OiBzdHJpbmcgfVxuICB8IHtcbiAgICAgIHNjaGVtYVZlcnNpb246IG51bWJlcjtcbiAgICAgIHJ1bklkOiBzdHJpbmc7XG4gICAgICBzdGFydGVkQXQ6IHN0cmluZztcbiAgICAgIGZpbmlzaGVkQXQ6IHN0cmluZztcbiAgICAgIHJlc3VsdDogUnVuUmVzdWx0O1xuICAgIH1cbiAgfCB7XG4gICAgICBzY2hlbWFWZXJzaW9uOiBudW1iZXI7XG4gICAgICBydW5JZDogc3RyaW5nO1xuICAgICAgZmluaXNoZWRBdDogc3RyaW5nO1xuICAgICAgZXJyb3I6IHsgbWVzc2FnZTogc3RyaW5nOyBzdGFjaz86IHN0cmluZyB9O1xuICAgIH1cbiAgfCB7XG4gICAgICBzY2hlbWFWZXJzaW9uOiAxO1xuICAgICAgcnVuSWQ6IHN0cmluZztcbiAgICAgIHN0YXJ0ZWRBdDogc3RyaW5nO1xuICAgICAgYXQ6IHN0cmluZztcbiAgICAgIGtpbmQ6IFRlc3ROb2RlS2luZDtcbiAgICAgIHBoYXNlOiBcInJlYWR5XCIgfCBcInJlc3VsdFwiO1xuICAgICAgZmlsZUlkOiBzdHJpbmc7XG4gICAgICBub2RlSWQ6IHN0cmluZztcbiAgICAgIHBhcmVudElkOiBzdHJpbmcgfCBudWxsO1xuICAgICAgbm9kZTogVGVzdENhc2VSZXN1bHQ7XG4gICAgfTtcblxuZXhwb3J0IHR5cGUgUnVuUmVxdWVzdCA9IHsgZmlsZXM/OiBzdHJpbmdbXTsgcGF0dGVybj86IHN0cmluZyB9O1xuZXhwb3J0IHR5cGUgVGVzdEV2ZW50TGlzdGVuZXIgPSAoZXZlbnQ6IHN0cmluZywgZGF0YTogVGVzdEV2ZW50UGF5bG9hZCkgPT4gdm9pZDtcblxudHlwZSBRdWV1ZUVudHJ5ID0ge1xuICBydW5JZDogc3RyaW5nO1xuICB0YXNrOiAoKSA9PiBQcm9taXNlPFJ1blJlc3VsdD47XG4gIHJlc29sdmU6IChyZXN1bHQ6IFJ1blJlc3VsdCkgPT4gdm9pZDtcbiAgcmVqZWN0OiAoZXJyb3I6IEVycm9yKSA9PiB2b2lkO1xufTtcblxuZXhwb3J0IHR5cGUgTWFuYWdlZFZpdGVzdCA9IFBpY2s8XG4gIFZpdGVzdCxcbiAgfCBcInN0YW5kYWxvbmVcIlxuICB8IFwiY2xvc2VcIlxuICB8IFwib25GaWx0ZXJXYXRjaGVkU3BlY2lmaWNhdGlvblwiXG4gIHwgXCJpbnZhbGlkYXRlRmlsZVwiXG4gIHwgXCJnbG9iVGVzdFNwZWNpZmljYXRpb25zXCJcbiAgfCBcInJ1blRlc3RTcGVjaWZpY2F0aW9uc1wiXG4gIHwgXCJzZXRHbG9iYWxUZXN0TmFtZVBhdHRlcm5cIlxuICB8IFwicmVzZXRHbG9iYWxUZXN0TmFtZVBhdHRlcm5cIlxuPjtcblxuZXhwb3J0IHR5cGUgRGV2Vml0ZXN0RmFjdG9yeSA9IChcbiAgbW9kZTogXCJ0ZXN0XCIsXG4gIG9wdGlvbnM6IENsaU9wdGlvbnMsXG4gIHZpdGVPdmVycmlkZXM6IFZpdGVVc2VyQ29uZmlnLFxuKSA9PiBQcm9taXNlPE1hbmFnZWRWaXRlc3Q+O1xuXG5leHBvcnQgY2xhc3MgRGV2Vml0ZXN0TWFuYWdlciB7XG4gIHByaXZhdGUgdml0ZXN0OiBNYW5hZ2VkVml0ZXN0IHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgcnVubmluZyA9IGZhbHNlO1xuICBwcml2YXRlIGxhc3RSdW5BdDogc3RyaW5nIHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgcXVldWU6IFF1ZXVlRW50cnlbXSA9IFtdO1xuICBwcml2YXRlIHByb2Nlc3NpbmcgPSBmYWxzZTtcbiAgcHJpdmF0ZSBjbG9zZWQgPSBmYWxzZTtcbiAgcHJpdmF0ZSBldmVudExpc3RlbmVycyA9IG5ldyBTZXQ8VGVzdEV2ZW50TGlzdGVuZXI+KCk7XG4gIHByaXZhdGUgY3VycmVudFJ1bkNvbnRleHQ6IHtcbiAgICBydW5JZDogc3RyaW5nO1xuICAgIHN0YXJ0ZWRBdDogc3RyaW5nO1xuICAgIHNwZWNNb2R1bGVJZHM6IFNldDxzdHJpbmc+O1xuICB9IHwgbnVsbCA9IG51bGw7XG5cbiAgY29uc3RydWN0b3IocHJpdmF0ZSByZWFkb25seSB2aXRlc3RGYWN0b3J5PzogRGV2Vml0ZXN0RmFjdG9yeSkge31cblxuICBhZGRFdmVudExpc3RlbmVyKGxpc3RlbmVyOiBUZXN0RXZlbnRMaXN0ZW5lcik6IHZvaWQge1xuICAgIHRoaXMuZXZlbnRMaXN0ZW5lcnMuYWRkKGxpc3RlbmVyKTtcbiAgfVxuXG4gIHJlbW92ZUV2ZW50TGlzdGVuZXIobGlzdGVuZXI6IFRlc3RFdmVudExpc3RlbmVyKTogdm9pZCB7XG4gICAgdGhpcy5ldmVudExpc3RlbmVycy5kZWxldGUobGlzdGVuZXIpO1xuICB9XG5cbiAgZW1pdEV2ZW50KGV2ZW50OiBzdHJpbmcsIGRhdGE6IFRlc3RFdmVudFBheWxvYWQpOiB2b2lkIHtcbiAgICBmb3IgKGNvbnN0IGxpc3RlbmVyIG9mIHRoaXMuZXZlbnRMaXN0ZW5lcnMpIHtcbiAgICAgIGxpc3RlbmVyKGV2ZW50LCBkYXRhKTtcbiAgICB9XG4gIH1cblxuICBhc3luYyBzdGFydCh2aXRlc3RDb25maWdQYXRoPzogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgLy8g7J2066+4IOyLnOyekeuQnCDqsr3smrAg7KSR67O1IOy0iOq4sO2ZlOulvCDrsKnsp4BcbiAgICBpZiAodGhpcy52aXRlc3QpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBjcmVhdGVWaXRlc3QgPVxuICAgICAgdGhpcy52aXRlc3RGYWN0b3J5ID8/XG4gICAgICAoYXN5bmMgKC4uLmFyZ3M6IFBhcmFtZXRlcnM8RGV2Vml0ZXN0RmFjdG9yeT4pID0+IHtcbiAgICAgICAgY29uc3Qgdml0ZXN0TW9kdWxlID0gYXdhaXQgaW1wb3J0KFwidml0ZXN0L25vZGVcIik7XG4gICAgICAgIHJldHVybiB2aXRlc3RNb2R1bGUuY3JlYXRlVml0ZXN0KC4uLmFyZ3MpO1xuICAgICAgfSk7XG5cbiAgICBjb25zdCB2aXRlT3ZlcnJpZGVzOiBWaXRlVXNlckNvbmZpZyA9IHtcbiAgICAgIHNlcnZlcjogeyB3YXRjaDogbnVsbCB9LFxuICAgIH07XG5cbiAgICBjb25zdCBjbGlPcHRpb25zOiBDbGlPcHRpb25zID0ge1xuICAgICAgd2F0Y2g6IHRydWUsXG4gICAgICBzdGFuZGFsb25lOiB0cnVlLFxuICAgICAgZm9yY2VSZXJ1blRyaWdnZXJzOiBbXSxcbiAgICAgIGNvbmZpZzogdml0ZXN0Q29uZmlnUGF0aCxcbiAgICAgIGVudjoge1xuICAgICAgICBOT0RFX0VOVjogXCJ0ZXN0XCIsXG4gICAgICB9LFxuICAgIH07XG5cbiAgICBjb25zdCByZWFsdGltZVJlcG9ydGVyID0gdGhpcy5jcmVhdGVSZWFsdGltZVByb2dyZXNzUmVwb3J0ZXIoKTtcbiAgICB2aXRlT3ZlcnJpZGVzLnBsdWdpbnMgPSBbXG4gICAgICAuLi4odml0ZU92ZXJyaWRlcy5wbHVnaW5zID8/IFtdKSxcbiAgICAgIHtcbiAgICAgICAgbmFtZTogXCJzb25hbXUtcmVhbHRpbWUtcmVwb3J0ZXJcIixcbiAgICAgICAgY29uZmlndXJlVml0ZXN0KHsgdml0ZXN0OiB2aXRlc3RJbnN0YW5jZSB9OiB7IHZpdGVzdDogVml0ZXN0IH0pIHtcbiAgICAgICAgICBjb25zdCByZXBvcnRlcnMgPSB2aXRlc3RJbnN0YW5jZS5jb25maWcucmVwb3J0ZXJzO1xuICAgICAgICAgIGlmICghcmVwb3J0ZXJzLmluY2x1ZGVzKHJlYWx0aW1lUmVwb3J0ZXIpKSB7XG4gICAgICAgICAgICByZXBvcnRlcnMucHVzaChyZWFsdGltZVJlcG9ydGVyKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgIF07XG5cbiAgICBjb25zdCB2aXRlc3QgPSBhd2FpdCBjcmVhdGVWaXRlc3QoXCJ0ZXN0XCIsIGNsaU9wdGlvbnMsIHZpdGVPdmVycmlkZXMpO1xuICAgIHRyeSB7XG4gICAgICBhd2FpdCB2aXRlc3Quc3RhbmRhbG9uZSgpO1xuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgYXdhaXQgdml0ZXN0LmNsb3NlKCk7XG4gICAgICB0aHJvdyBlcnI7XG4gICAgfVxuXG4gICAgdGhpcy52aXRlc3QgPSB2aXRlc3Q7XG4gICAgdGhpcy52aXRlc3Qub25GaWx0ZXJXYXRjaGVkU3BlY2lmaWNhdGlvbigoX3NwZWMpID0+IGZhbHNlKTtcbiAgICB0aGlzLmNsb3NlZCA9IGZhbHNlO1xuICB9XG5cbiAgYXN5bmMgcnVuKG9wdHM6IHsgZmlsZXM/OiBzdHJpbmdbXTsgcGF0dGVybj86IHN0cmluZyB9LCBydW5JZDogc3RyaW5nKTogUHJvbWlzZTxSdW5SZXN1bHQ+IHtcbiAgICBpZiAodGhpcy5jbG9zZWQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIkRldlZpdGVzdE1hbmFnZXIgaXMgYWxyZWFkeSBzaHV0IGRvd25cIik7XG4gICAgfVxuICAgIGlmICghdGhpcy52aXRlc3QpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIkRldlZpdGVzdE1hbmFnZXIgaXMgbm90IHN0YXJ0ZWRcIik7XG4gICAgfVxuXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlPFJ1blJlc3VsdD4oKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgY29uc3QgdGFzayA9ICgpID0+IHRoaXMuZXhlY3V0ZVJ1bihvcHRzLCBydW5JZCk7XG4gICAgICB0aGlzLnF1ZXVlLnB1c2goeyBydW5JZCwgdGFzaywgcmVzb2x2ZSwgcmVqZWN0IH0pO1xuICAgICAgdGhpcy5wcm9jZXNzUXVldWUoKTtcbiAgICB9KTtcbiAgfVxuXG4gIGdldFN0YXR1cygpOiBNYW5hZ2VyU3RhdHVzIHtcbiAgICByZXR1cm4ge1xuICAgICAgcmVhZHk6IHRoaXMudml0ZXN0ICE9PSBudWxsICYmICF0aGlzLmNsb3NlZCxcbiAgICAgIHJ1bm5pbmc6IHRoaXMucnVubmluZyxcbiAgICAgIGxhc3RSdW5BdDogdGhpcy5sYXN0UnVuQXQsXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiDrs4Dqsr3rkJwg7YyM7J287J2EIFZpdGVzdCDrqqjrk4gg6re4656Y7ZSE7JeQ7IScIOustO2aqO2ZlO2VqeuLiOuLpC5cbiAgICogaG1yQW5kU3luY+yXkOyEnCDtmLjstpzrkJjslrQg64uk7J2MIO2FjOyKpO2KuCDsi6Ttlokg7IucIOy1nOyLoCDsvZTrk5zrpbwg7IKs7Jqp7ZWY64+E66GdIO2VqeuLiOuLpC5cbiAgICovXG4gIGludmFsaWRhdGVGaWxlcyhmaWxlUGF0aHM6IHN0cmluZ1tdKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLnZpdGVzdCB8fCB0aGlzLmNsb3NlZCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBmb3IgKGNvbnN0IGZpbGVQYXRoIG9mIGZpbGVQYXRocykge1xuICAgICAgdGhpcy52aXRlc3QuaW52YWxpZGF0ZUZpbGUoZmlsZVBhdGgpO1xuICAgIH1cbiAgfVxuXG4gIGFzeW5jIHNodXRkb3duKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGlmICh0aGlzLmNsb3NlZCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLmNsb3NlZCA9IHRydWU7XG5cbiAgICAvLyDtgZDsl5Ag64Ko7J2AIOyekeyXheuTpOydhCByZWplY3TtlZjsl6wg7Zi47Lac7J6Q6rCAIOyYgeq1rCDrjIDquLDtlZjsp4Ag7JWK64+E66GdIOygleumrFxuICAgIHdoaWxlICh0aGlzLnF1ZXVlLmxlbmd0aCA+IDApIHtcbiAgICAgIGNvbnN0IGVudHJ5ID0gdGhpcy5xdWV1ZS5zaGlmdCgpO1xuICAgICAgaWYgKGVudHJ5KSB7XG4gICAgICAgIGVudHJ5LnJlamVjdChuZXcgRXJyb3IoXCJEZXZWaXRlc3RNYW5hZ2VyIGlzIGJlaW5nIHNodXQgZG93blwiKSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgdGhpcy5ldmVudExpc3RlbmVycy5jbGVhcigpO1xuXG4gICAgaWYgKHRoaXMudml0ZXN0KSB7XG4gICAgICBhd2FpdCB0aGlzLnZpdGVzdC5jbG9zZSgpO1xuICAgICAgdGhpcy52aXRlc3QgPSBudWxsO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgcHJvY2Vzc1F1ZXVlKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGlmICh0aGlzLnByb2Nlc3NpbmcpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5wcm9jZXNzaW5nID0gdHJ1ZTtcblxuICAgIHRyeSB7XG4gICAgICB3aGlsZSAodGhpcy5xdWV1ZS5sZW5ndGggPiAwKSB7XG4gICAgICAgIGNvbnN0IGVudHJ5ID0gdGhpcy5xdWV1ZS5zaGlmdCgpO1xuICAgICAgICBpZiAoIWVudHJ5KSBicmVhaztcbiAgICAgICAgaWYgKHRoaXMuY2xvc2VkKSB7XG4gICAgICAgICAgZW50cnkucmVqZWN0KG5ldyBFcnJvcihcIkRldlZpdGVzdE1hbmFnZXIgaXMgYWxyZWFkeSBzaHV0IGRvd25cIikpO1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBlbnRyeS50YXNrKCk7XG4gICAgICAgICAgZW50cnkucmVzb2x2ZShyZXN1bHQpO1xuICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICBlbnRyeS5yZWplY3QoZXJyIGluc3RhbmNlb2YgRXJyb3IgPyBlcnIgOiBuZXcgRXJyb3IoU3RyaW5nKGVycikpKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gZmluYWxseSB7XG4gICAgICB0aGlzLnByb2Nlc3NpbmcgPSBmYWxzZTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGV4ZWN1dGVSdW4oXG4gICAgb3B0czogeyBmaWxlcz86IHN0cmluZ1tdOyBwYXR0ZXJuPzogc3RyaW5nIH0sXG4gICAgcnVuSWQ6IHN0cmluZyxcbiAgKTogUHJvbWlzZTxSdW5SZXN1bHQ+IHtcbiAgICBjb25zdCB2aXRlc3QgPSB0aGlzLnZpdGVzdDtcbiAgICBpZiAoIXZpdGVzdCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiRGV2Vml0ZXN0TWFuYWdlciBpcyBub3Qgc3RhcnRlZFwiKTtcbiAgICB9XG5cbiAgICB0aGlzLnJ1bm5pbmcgPSB0cnVlO1xuICAgIGNvbnN0IHN0YXJ0VGltZSA9IERhdGUubm93KCk7XG5cbiAgICBpZiAob3B0cy5wYXR0ZXJuKSB7XG4gICAgICB2aXRlc3Quc2V0R2xvYmFsVGVzdE5hbWVQYXR0ZXJuKG9wdHMucGF0dGVybik7XG4gICAgfVxuXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHNwZWNzOiBUZXN0U3BlY2lmaWNhdGlvbltdID0gb3B0cy5maWxlc1xuICAgICAgICA/IGF3YWl0IHZpdGVzdC5nbG9iVGVzdFNwZWNpZmljYXRpb25zKG9wdHMuZmlsZXMpXG4gICAgICAgIDogYXdhaXQgdml0ZXN0Lmdsb2JUZXN0U3BlY2lmaWNhdGlvbnMoKTtcblxuICAgICAgY29uc3Qgc3BlY01vZHVsZUlkcyA9IG5ldyBTZXQoc3BlY3MubWFwKChzKSA9PiBzLm1vZHVsZUlkKSk7XG4gICAgICAvLyByb3V0ZXPsl5DshJwg7IOd7ISx7ZWcIHJ1bklk66W8IOq3uOuMgOuhnCDsgqzsmqntlZjsl6wgcnVuU3RhcnRlZC9ydW5Ob2RlUHJvZ3Jlc3MvcnVuQ29tcGxldGVkIOqwhCDsnbzqtIDshLEg67O07J6lXG4gICAgICB0aGlzLmN1cnJlbnRSdW5Db250ZXh0ID0ge1xuICAgICAgICBydW5JZCxcbiAgICAgICAgc3RhcnRlZEF0OiBuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKCksXG4gICAgICAgIHNwZWNNb2R1bGVJZHMsXG4gICAgICB9O1xuXG4gICAgICBjb25zdCBhbGxUZXN0c1J1biA9ICFvcHRzLmZpbGVzIHx8IG9wdHMuZmlsZXMubGVuZ3RoID09PSAwO1xuICAgICAgY29uc3QgcnVuUmVzdWx0OiBUZXN0UnVuUmVzdWx0ID0gYXdhaXQgdml0ZXN0LnJ1blRlc3RTcGVjaWZpY2F0aW9ucyhzcGVjcywgYWxsVGVzdHNSdW4pO1xuXG4gICAgICBjb25zdCBkdXJhdGlvbk1zID0gRGF0ZS5ub3coKSAtIHN0YXJ0VGltZTtcbiAgICAgIHRoaXMubGFzdFJ1bkF0ID0gbmV3IERhdGUoKS50b0lTT1N0cmluZygpO1xuXG4gICAgICByZXR1cm4gdGhpcy5jb2xsZWN0UmVzdWx0cyhydW5SZXN1bHQsIGR1cmF0aW9uTXMsIHNwZWNNb2R1bGVJZHMpO1xuICAgIH0gZmluYWxseSB7XG4gICAgICB0aGlzLmN1cnJlbnRSdW5Db250ZXh0ID0gbnVsbDtcbiAgICAgIGlmIChvcHRzLnBhdHRlcm4pIHtcbiAgICAgICAgdml0ZXN0LnJlc2V0R2xvYmFsVGVzdE5hbWVQYXR0ZXJuKCk7XG4gICAgICB9XG4gICAgICB0aGlzLnJ1bm5pbmcgPSBmYWxzZTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGNyZWF0ZVJlYWx0aW1lUHJvZ3Jlc3NSZXBvcnRlcigpOiBSZXBvcnRlciB7XG4gICAgY29uc3QgZW1pdFByb2dyZXNzID0gKFxuICAgICAga2luZDogXCJmaWxlXCIgfCBcInN1aXRlXCIgfCBcInRlc3RcIixcbiAgICAgIHBoYXNlOiBcInJlYWR5XCIgfCBcInJlc3VsdFwiLFxuICAgICAgZmlsZUlkOiBzdHJpbmcsXG4gICAgICBub2RlSWQ6IHN0cmluZyxcbiAgICAgIHBhcmVudElkOiBzdHJpbmcgfCBudWxsLFxuICAgICAgbm9kZTogVGVzdENhc2VSZXN1bHQsXG4gICAgKSA9PiB7XG4gICAgICBjb25zdCBjdHggPSB0aGlzLmN1cnJlbnRSdW5Db250ZXh0O1xuICAgICAgaWYgKCFjdHgpIHJldHVybjtcbiAgICAgIHRoaXMuZW1pdEV2ZW50KFwicnVuTm9kZVByb2dyZXNzXCIsIHtcbiAgICAgICAgc2NoZW1hVmVyc2lvbjogMSxcbiAgICAgICAgcnVuSWQ6IGN0eC5ydW5JZCxcbiAgICAgICAgc3RhcnRlZEF0OiBjdHguc3RhcnRlZEF0LFxuICAgICAgICBhdDogbmV3IERhdGUoKS50b0lTT1N0cmluZygpLFxuICAgICAgICBraW5kLFxuICAgICAgICBwaGFzZSxcbiAgICAgICAgZmlsZUlkLFxuICAgICAgICBub2RlSWQsXG4gICAgICAgIHBhcmVudElkLFxuICAgICAgICBub2RlLFxuICAgICAgfSk7XG4gICAgfTtcblxuICAgIHJldHVybiB7XG4gICAgICBvblRlc3RNb2R1bGVRdWV1ZWQ6ICh0ZXN0TW9kdWxlOiBUZXN0TW9kdWxlKSA9PiB7XG4gICAgICAgIGNvbnN0IGN0eCA9IHRoaXMuY3VycmVudFJ1bkNvbnRleHQ7XG4gICAgICAgIGlmICghY3R4IHx8ICFjdHguc3BlY01vZHVsZUlkcy5oYXModGVzdE1vZHVsZS5tb2R1bGVJZCkpIHJldHVybjtcbiAgICAgICAgY29uc3QgZmlsZUlkID0gdGVzdE1vZHVsZS5tb2R1bGVJZDtcbiAgICAgICAgZW1pdFByb2dyZXNzKFxuICAgICAgICAgIFwiZmlsZVwiLFxuICAgICAgICAgIFwicmVhZHlcIixcbiAgICAgICAgICBmaWxlSWQsXG4gICAgICAgICAgZmlsZUlkLFxuICAgICAgICAgIG51bGwsXG4gICAgICAgICAgdGhpcy5idWlsZEZpbGVQcm9ncmVzc05vZGUodGVzdE1vZHVsZSwgXCJyZWFkeVwiKSxcbiAgICAgICAgKTtcbiAgICAgIH0sXG4gICAgICBvblRlc3RNb2R1bGVFbmQ6ICh0ZXN0TW9kdWxlOiBUZXN0TW9kdWxlKSA9PiB7XG4gICAgICAgIGNvbnN0IGN0eCA9IHRoaXMuY3VycmVudFJ1bkNvbnRleHQ7XG4gICAgICAgIGlmICghY3R4IHx8ICFjdHguc3BlY01vZHVsZUlkcy5oYXModGVzdE1vZHVsZS5tb2R1bGVJZCkpIHJldHVybjtcbiAgICAgICAgY29uc3QgZmlsZUlkID0gdGVzdE1vZHVsZS5tb2R1bGVJZDtcbiAgICAgICAgZW1pdFByb2dyZXNzKFwiZmlsZVwiLCBcInJlc3VsdFwiLCBmaWxlSWQsIGZpbGVJZCwgbnVsbCwgdGhpcy5idWlsZEZpbGVOb2RlKHRlc3RNb2R1bGUpKTtcbiAgICAgIH0sXG4gICAgICBvblRlc3RTdWl0ZVJlYWR5OiAodGVzdFN1aXRlOiBUZXN0U3VpdGUpID0+IHtcbiAgICAgICAgY29uc3QgY3R4ID0gdGhpcy5jdXJyZW50UnVuQ29udGV4dDtcbiAgICAgICAgaWYgKCFjdHggfHwgIWN0eC5zcGVjTW9kdWxlSWRzLmhhcyh0ZXN0U3VpdGUubW9kdWxlLm1vZHVsZUlkKSkgcmV0dXJuO1xuICAgICAgICBjb25zdCBmaWxlSWQgPSB0ZXN0U3VpdGUubW9kdWxlLm1vZHVsZUlkO1xuICAgICAgICBjb25zdCBub2RlSWQgPSBgJHtmaWxlSWR9Ojoke3Rlc3RTdWl0ZS5mdWxsTmFtZX1gO1xuICAgICAgICBjb25zdCBwYXJlbnRJZCA9IHRoaXMucmVzb2x2ZVN1aXRlUGFyZW50SWQodGVzdFN1aXRlKTtcbiAgICAgICAgZW1pdFByb2dyZXNzKFxuICAgICAgICAgIFwic3VpdGVcIixcbiAgICAgICAgICBcInJlYWR5XCIsXG4gICAgICAgICAgZmlsZUlkLFxuICAgICAgICAgIG5vZGVJZCxcbiAgICAgICAgICBwYXJlbnRJZCxcbiAgICAgICAgICB0aGlzLmJ1aWxkU3VpdGVQcm9ncmVzc05vZGUodGVzdFN1aXRlLCBcInJlYWR5XCIpLFxuICAgICAgICApO1xuICAgICAgfSxcbiAgICAgIG9uVGVzdFN1aXRlUmVzdWx0OiAodGVzdFN1aXRlOiBUZXN0U3VpdGUpID0+IHtcbiAgICAgICAgY29uc3QgY3R4ID0gdGhpcy5jdXJyZW50UnVuQ29udGV4dDtcbiAgICAgICAgaWYgKCFjdHggfHwgIWN0eC5zcGVjTW9kdWxlSWRzLmhhcyh0ZXN0U3VpdGUubW9kdWxlLm1vZHVsZUlkKSkgcmV0dXJuO1xuICAgICAgICBjb25zdCBmaWxlSWQgPSB0ZXN0U3VpdGUubW9kdWxlLm1vZHVsZUlkO1xuICAgICAgICBjb25zdCBub2RlSWQgPSBgJHtmaWxlSWR9Ojoke3Rlc3RTdWl0ZS5mdWxsTmFtZX1gO1xuICAgICAgICBjb25zdCBwYXJlbnRJZCA9IHRoaXMucmVzb2x2ZVN1aXRlUGFyZW50SWQodGVzdFN1aXRlKTtcbiAgICAgICAgZW1pdFByb2dyZXNzKFxuICAgICAgICAgIFwic3VpdGVcIixcbiAgICAgICAgICBcInJlc3VsdFwiLFxuICAgICAgICAgIGZpbGVJZCxcbiAgICAgICAgICBub2RlSWQsXG4gICAgICAgICAgcGFyZW50SWQsXG4gICAgICAgICAgdGhpcy5idWlsZFN1aXRlTm9kZSh0ZXN0U3VpdGUsIGZpbGVJZCksXG4gICAgICAgICk7XG4gICAgICB9LFxuICAgICAgb25UZXN0Q2FzZVJlYWR5OiAodGVzdENhc2U6IFRlc3RDYXNlKSA9PiB7XG4gICAgICAgIGNvbnN0IGN0eCA9IHRoaXMuY3VycmVudFJ1bkNvbnRleHQ7XG4gICAgICAgIGlmICghY3R4IHx8ICFjdHguc3BlY01vZHVsZUlkcy5oYXModGVzdENhc2UubW9kdWxlLm1vZHVsZUlkKSkgcmV0dXJuO1xuICAgICAgICBjb25zdCBmaWxlSWQgPSB0ZXN0Q2FzZS5tb2R1bGUubW9kdWxlSWQ7XG4gICAgICAgIGNvbnN0IG5vZGVJZCA9IGAke2ZpbGVJZH06OiR7dGVzdENhc2UuZnVsbE5hbWV9YDtcbiAgICAgICAgY29uc3QgcGFyZW50SWQgPSB0aGlzLnJlc29sdmVUZXN0UGFyZW50SWQodGVzdENhc2UpO1xuICAgICAgICBlbWl0UHJvZ3Jlc3MoXG4gICAgICAgICAgXCJ0ZXN0XCIsXG4gICAgICAgICAgXCJyZWFkeVwiLFxuICAgICAgICAgIGZpbGVJZCxcbiAgICAgICAgICBub2RlSWQsXG4gICAgICAgICAgcGFyZW50SWQsXG4gICAgICAgICAgdGhpcy5idWlsZFRlc3RQcm9ncmVzc05vZGUodGVzdENhc2UsIFwicmVhZHlcIiksXG4gICAgICAgICk7XG4gICAgICB9LFxuICAgICAgb25UZXN0Q2FzZVJlc3VsdDogKHRlc3RDYXNlOiBUZXN0Q2FzZSkgPT4ge1xuICAgICAgICBjb25zdCBjdHggPSB0aGlzLmN1cnJlbnRSdW5Db250ZXh0O1xuICAgICAgICBpZiAoIWN0eCB8fCAhY3R4LnNwZWNNb2R1bGVJZHMuaGFzKHRlc3RDYXNlLm1vZHVsZS5tb2R1bGVJZCkpIHJldHVybjtcbiAgICAgICAgY29uc3QgZmlsZUlkID0gdGVzdENhc2UubW9kdWxlLm1vZHVsZUlkO1xuICAgICAgICBjb25zdCBub2RlSWQgPSBgJHtmaWxlSWR9Ojoke3Rlc3RDYXNlLmZ1bGxOYW1lfWA7XG4gICAgICAgIGNvbnN0IHBhcmVudElkID0gdGhpcy5yZXNvbHZlVGVzdFBhcmVudElkKHRlc3RDYXNlKTtcbiAgICAgICAgZW1pdFByb2dyZXNzKFxuICAgICAgICAgIFwidGVzdFwiLFxuICAgICAgICAgIFwicmVzdWx0XCIsXG4gICAgICAgICAgZmlsZUlkLFxuICAgICAgICAgIG5vZGVJZCxcbiAgICAgICAgICBwYXJlbnRJZCxcbiAgICAgICAgICB0aGlzLmJ1aWxkVGVzdE5vZGUodGVzdENhc2UsIGZpbGVJZCksXG4gICAgICAgICk7XG4gICAgICB9LFxuICAgIH07XG4gIH1cblxuICBwcml2YXRlIGJ1aWxkRmlsZVByb2dyZXNzTm9kZSh0ZXN0TW9kdWxlOiBUZXN0TW9kdWxlLCBfcGhhc2U6IFwicmVhZHlcIik6IFRlc3RDYXNlUmVzdWx0IHtcbiAgICByZXR1cm4ge1xuICAgICAgaWQ6IHRlc3RNb2R1bGUubW9kdWxlSWQsXG4gICAgICBraW5kOiBcImZpbGVcIixcbiAgICAgIG5hbWU6IHRlc3RNb2R1bGUubW9kdWxlSWQsXG4gICAgICBmdWxsTmFtZTogdGVzdE1vZHVsZS5tb2R1bGVJZCxcbiAgICAgIGZpbGU6IHRlc3RNb2R1bGUubW9kdWxlSWQsXG4gICAgICBzdGF0ZTogXCJydW5uaW5nXCIsXG4gICAgICBkdXJhdGlvbk1zOiBudWxsLFxuICAgICAgY291bnRzOiB7IHRvdGFsOiAwLCBwYXNzZWQ6IDAsIGZhaWxlZDogMCwgc2tpcHBlZDogMCB9LFxuICAgICAgZXJyb3I6IG51bGwsXG4gICAgICB0cmFjZXM6IFtdLFxuICAgICAgY2hpbGRyZW46IFtdLFxuICAgIH07XG4gIH1cblxuICBwcml2YXRlIGJ1aWxkU3VpdGVQcm9ncmVzc05vZGUodGVzdFN1aXRlOiBUZXN0U3VpdGUsIF9waGFzZTogXCJyZWFkeVwiKTogVGVzdENhc2VSZXN1bHQge1xuICAgIGNvbnN0IGZpbGVJZCA9IHRlc3RTdWl0ZS5tb2R1bGUubW9kdWxlSWQ7XG4gICAgcmV0dXJuIHtcbiAgICAgIGlkOiBgJHtmaWxlSWR9Ojoke3Rlc3RTdWl0ZS5mdWxsTmFtZX1gLFxuICAgICAga2luZDogXCJzdWl0ZVwiLFxuICAgICAgbmFtZTogdGVzdFN1aXRlLm5hbWUsXG4gICAgICBmdWxsTmFtZTogdGVzdFN1aXRlLmZ1bGxOYW1lLFxuICAgICAgZmlsZTogZmlsZUlkLFxuICAgICAgc3RhdGU6IFwicnVubmluZ1wiLFxuICAgICAgZHVyYXRpb25NczogbnVsbCxcbiAgICAgIGNvdW50czogeyB0b3RhbDogMCwgcGFzc2VkOiAwLCBmYWlsZWQ6IDAsIHNraXBwZWQ6IDAgfSxcbiAgICAgIGVycm9yOiBudWxsLFxuICAgICAgdHJhY2VzOiBbXSxcbiAgICAgIGNoaWxkcmVuOiBbXSxcbiAgICB9O1xuICB9XG5cbiAgcHJpdmF0ZSBidWlsZFRlc3RQcm9ncmVzc05vZGUodGVzdENhc2U6IFRlc3RDYXNlLCBfcGhhc2U6IFwicmVhZHlcIik6IFRlc3RDYXNlUmVzdWx0IHtcbiAgICBjb25zdCBmaWxlSWQgPSB0ZXN0Q2FzZS5tb2R1bGUubW9kdWxlSWQ7XG4gICAgcmV0dXJuIHtcbiAgICAgIGlkOiBgJHtmaWxlSWR9Ojoke3Rlc3RDYXNlLmZ1bGxOYW1lfWAsXG4gICAgICBraW5kOiBcInRlc3RcIixcbiAgICAgIG5hbWU6IHRlc3RDYXNlLm5hbWUsXG4gICAgICBmdWxsTmFtZTogdGVzdENhc2UuZnVsbE5hbWUsXG4gICAgICBmaWxlOiBmaWxlSWQsXG4gICAgICBzdGF0ZTogXCJydW5uaW5nXCIsXG4gICAgICBkdXJhdGlvbk1zOiBudWxsLFxuICAgICAgY291bnRzOiB7IHRvdGFsOiAxLCBwYXNzZWQ6IDAsIGZhaWxlZDogMCwgc2tpcHBlZDogMCB9LFxuICAgICAgZXJyb3I6IG51bGwsXG4gICAgICB0cmFjZXM6IFtdLFxuICAgICAgY2hpbGRyZW46IFtdLFxuICAgIH07XG4gIH1cblxuICBwcml2YXRlIHJlc29sdmVTdWl0ZVBhcmVudElkKHRlc3RTdWl0ZTogVGVzdFN1aXRlKTogc3RyaW5nIHtcbiAgICBjb25zdCBwYXJlbnQgPSB0ZXN0U3VpdGUucGFyZW50O1xuICAgIGlmIChwYXJlbnQudHlwZSA9PT0gXCJzdWl0ZVwiKSB7XG4gICAgICByZXR1cm4gYCR7dGVzdFN1aXRlLm1vZHVsZS5tb2R1bGVJZH06OiR7cGFyZW50LmZ1bGxOYW1lfWA7XG4gICAgfVxuICAgIHJldHVybiB0ZXN0U3VpdGUubW9kdWxlLm1vZHVsZUlkO1xuICB9XG5cbiAgcHJpdmF0ZSByZXNvbHZlVGVzdFBhcmVudElkKHRlc3RDYXNlOiBUZXN0Q2FzZSk6IHN0cmluZyB7XG4gICAgY29uc3QgcGFyZW50ID0gdGVzdENhc2UucGFyZW50O1xuICAgIGlmIChwYXJlbnQudHlwZSA9PT0gXCJzdWl0ZVwiKSB7XG4gICAgICByZXR1cm4gYCR7dGVzdENhc2UubW9kdWxlLm1vZHVsZUlkfTo6JHtwYXJlbnQuZnVsbE5hbWV9YDtcbiAgICB9XG4gICAgcmV0dXJuIHRlc3RDYXNlLm1vZHVsZS5tb2R1bGVJZDtcbiAgfVxuXG4gIHByaXZhdGUgY29sbGVjdFJlc3VsdHMoXG4gICAgcnVuUmVzdWx0OiBUZXN0UnVuUmVzdWx0LFxuICAgIGR1cmF0aW9uTXM6IG51bWJlcixcbiAgICBzcGVjTW9kdWxlSWRzOiBTZXQ8c3RyaW5nPixcbiAgKTogUnVuUmVzdWx0IHtcbiAgICBjb25zdCByZXN1bHRzQnlGaWxlID0gbmV3IE1hcDxzdHJpbmcsIFRlc3RDYXNlUmVzdWx0PigpO1xuXG4gICAgZm9yIChjb25zdCB0ZXN0TW9kdWxlIG9mIHJ1blJlc3VsdC50ZXN0TW9kdWxlcykge1xuICAgICAgaWYgKCFzcGVjTW9kdWxlSWRzLmhhcyh0ZXN0TW9kdWxlLm1vZHVsZUlkKSkgY29udGludWU7XG4gICAgICBjb25zdCBuZXh0UmVzdWx0ID0gdGhpcy5idWlsZEZpbGVOb2RlKHRlc3RNb2R1bGUpO1xuICAgICAgY29uc3QgZXhpc3RpbmdSZXN1bHQgPSByZXN1bHRzQnlGaWxlLmdldChuZXh0UmVzdWx0LmlkKTtcblxuICAgICAgaWYgKCFleGlzdGluZ1Jlc3VsdCkge1xuICAgICAgICByZXN1bHRzQnlGaWxlLnNldChuZXh0UmVzdWx0LmlkLCBuZXh0UmVzdWx0KTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGV4aXN0aW5nU2NvcmUgPSBnZXRSZXN1bHRDb21wbGV0ZW5lc3NTY29yZShleGlzdGluZ1Jlc3VsdCk7XG4gICAgICBjb25zdCBuZXh0U2NvcmUgPSBnZXRSZXN1bHRDb21wbGV0ZW5lc3NTY29yZShuZXh0UmVzdWx0KTtcbiAgICAgIGlmIChuZXh0U2NvcmUgPj0gZXhpc3RpbmdTY29yZSkge1xuICAgICAgICByZXN1bHRzQnlGaWxlLnNldChuZXh0UmVzdWx0LmlkLCBuZXh0UmVzdWx0KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCByZXN1bHRzID0gQXJyYXkuZnJvbShyZXN1bHRzQnlGaWxlLnZhbHVlcygpKTtcbiAgICBjb25zdCBzdW1tYXJ5ID0gYWdncmVnYXRlQ291bnRzKHJlc3VsdHMpO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIG9rOiBzdW1tYXJ5LmZhaWxlZCA9PT0gMCxcbiAgICAgIHN1bW1hcnk6IHsgLi4uc3VtbWFyeSwgZHVyYXRpb25NcyB9LFxuICAgICAgcmVzdWx0cyxcbiAgICB9O1xuICB9XG5cbiAgcHJpdmF0ZSBidWlsZEZpbGVOb2RlKHRlc3RNb2R1bGU6IFRlc3RNb2R1bGUpOiBUZXN0Q2FzZVJlc3VsdCB7XG4gICAgY29uc3QgZmlsZSA9IHRlc3RNb2R1bGUubW9kdWxlSWQ7XG4gICAgY29uc3QgY2hpbGRyZW4gPSB0aGlzLmJ1aWxkQ2hpbGROb2Rlcyh0ZXN0TW9kdWxlLCBmaWxlKTtcbiAgICBjb25zdCBjb3VudHMgPSBhZ2dyZWdhdGVDb3VudHMoY2hpbGRyZW4pO1xuICAgIGNvbnN0IG1vZHVsZVN0YXRlID0gdGVzdE1vZHVsZS5zdGF0ZSgpO1xuICAgIGNvbnN0IGRpYWdub3N0aWMgPSB0ZXN0TW9kdWxlLmRpYWdub3N0aWMoKTtcblxuICAgIHJldHVybiB7XG4gICAgICBpZDogdGVzdE1vZHVsZS5tb2R1bGVJZCxcbiAgICAgIGtpbmQ6IFwiZmlsZVwiLFxuICAgICAgbmFtZTogdGVzdE1vZHVsZS5tb2R1bGVJZCxcbiAgICAgIGZ1bGxOYW1lOiB0ZXN0TW9kdWxlLm1vZHVsZUlkLFxuICAgICAgZmlsZSxcbiAgICAgIHN0YXRlOiBtYXBNb2R1bGVTdGF0ZShtb2R1bGVTdGF0ZSksXG4gICAgICBkdXJhdGlvbk1zOiBkaWFnbm9zdGljLmR1cmF0aW9uID4gMCA/IGRpYWdub3N0aWMuZHVyYXRpb24gOiBudWxsLFxuICAgICAgY291bnRzLFxuICAgICAgZXJyb3I6IG51bGwsXG4gICAgICB0cmFjZXM6IFtdLFxuICAgICAgY2hpbGRyZW4sXG4gICAgfTtcbiAgfVxuXG4gIHByaXZhdGUgYnVpbGRDaGlsZE5vZGVzKHBhcmVudDogVGVzdE1vZHVsZSB8IFRlc3RTdWl0ZSwgZmlsZTogc3RyaW5nKTogVGVzdENhc2VSZXN1bHRbXSB7XG4gICAgY29uc3QgcmVzdWx0OiBUZXN0Q2FzZVJlc3VsdFtdID0gW107XG4gICAgZm9yIChjb25zdCBjaGlsZCBvZiBwYXJlbnQuY2hpbGRyZW4pIHtcbiAgICAgIGlmIChjaGlsZC50eXBlID09PSBcInN1aXRlXCIpIHtcbiAgICAgICAgcmVzdWx0LnB1c2godGhpcy5idWlsZFN1aXRlTm9kZShjaGlsZCwgZmlsZSkpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmVzdWx0LnB1c2godGhpcy5idWlsZFRlc3ROb2RlKGNoaWxkLCBmaWxlKSk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICBwcml2YXRlIGJ1aWxkU3VpdGVOb2RlKHN1aXRlOiBUZXN0U3VpdGUsIGZpbGU6IHN0cmluZyk6IFRlc3RDYXNlUmVzdWx0IHtcbiAgICBjb25zdCBjaGlsZHJlbiA9IHRoaXMuYnVpbGRDaGlsZE5vZGVzKHN1aXRlLCBmaWxlKTtcbiAgICBjb25zdCBjb3VudHMgPSBhZ2dyZWdhdGVDb3VudHMoY2hpbGRyZW4pO1xuICAgIGNvbnN0IHN1aXRlU3RhdGUgPSBzdWl0ZS5zdGF0ZSgpO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIGlkOiBgJHtmaWxlfTo6JHtzdWl0ZS5mdWxsTmFtZX1gLFxuICAgICAga2luZDogXCJzdWl0ZVwiLFxuICAgICAgbmFtZTogc3VpdGUubmFtZSxcbiAgICAgIGZ1bGxOYW1lOiBzdWl0ZS5mdWxsTmFtZSxcbiAgICAgIGZpbGUsXG4gICAgICBzdGF0ZTogbWFwU3VpdGVTdGF0ZShzdWl0ZVN0YXRlKSxcbiAgICAgIGR1cmF0aW9uTXM6IG51bGwsXG4gICAgICBjb3VudHMsXG4gICAgICBlcnJvcjogbnVsbCxcbiAgICAgIHRyYWNlczogW10sXG4gICAgICBjaGlsZHJlbixcbiAgICB9O1xuICB9XG5cbiAgcHJpdmF0ZSBidWlsZFRlc3ROb2RlKHRlc3RDYXNlOiBUZXN0Q2FzZSwgZmlsZTogc3RyaW5nKTogVGVzdENhc2VSZXN1bHQge1xuICAgIGNvbnN0IHJlc3VsdCA9IHRlc3RDYXNlLnJlc3VsdCgpO1xuICAgIGNvbnN0IGRpYWdub3N0aWMgPSB0ZXN0Q2FzZS5kaWFnbm9zdGljKCk7XG4gICAgY29uc3Qgc3RhdGUgPSBtYXBUZXN0UmVzdWx0KHJlc3VsdCwgdGVzdENhc2Uub3B0aW9ucy5tb2RlKTtcblxuICAgIGxldCBlcnJvcjogeyBtZXNzYWdlOiBzdHJpbmc7IHN0YWNrPzogc3RyaW5nIH0gfCBudWxsID0gbnVsbDtcbiAgICBpZiAocmVzdWx0LnN0YXRlID09PSBcImZhaWxlZFwiICYmIHJlc3VsdC5lcnJvcnMubGVuZ3RoID4gMCkge1xuICAgICAgY29uc3QgZmlyc3RFcnJvciA9IHJlc3VsdC5lcnJvcnNbMF07XG4gICAgICBlcnJvciA9IHtcbiAgICAgICAgbWVzc2FnZTogZmlyc3RFcnJvci5tZXNzYWdlID8/IFN0cmluZyhmaXJzdEVycm9yKSxcbiAgICAgICAgc3RhY2s6IGZpcnN0RXJyb3Iuc3RhY2ssXG4gICAgICB9O1xuICAgIH1cblxuICAgIGNvbnN0IHJhdyA9IHRlc3RDYXNlLm1ldGEoKS50cmFjZXM7XG4gICAgbGV0IHRyYWNlczogU2VyaWFsaXplZFRyYWNlW10gPSBbXTtcbiAgICBpZiAoQXJyYXkuaXNBcnJheShyYXcpICYmIHJhdy5sZW5ndGggPiAwKSB7XG4gICAgICB0cmFjZXMgPSBwYXJzZVNlcmlhbGl6ZWRUcmFjZXMocmF3KTtcbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgaWQ6IGAke2ZpbGV9Ojoke3Rlc3RDYXNlLmZ1bGxOYW1lfWAsXG4gICAgICBraW5kOiBcInRlc3RcIixcbiAgICAgIG5hbWU6IHRlc3RDYXNlLm5hbWUsXG4gICAgICBmdWxsTmFtZTogdGVzdENhc2UuZnVsbE5hbWUsXG4gICAgICBmaWxlLFxuICAgICAgc3RhdGUsXG4gICAgICBkdXJhdGlvbk1zOiBkaWFnbm9zdGljID8gZGlhZ25vc3RpYy5kdXJhdGlvbiA6IG51bGwsXG4gICAgICBjb3VudHM6IGNvdW50RnJvbVN0YXRlKHN0YXRlKSxcbiAgICAgIGVycm9yLFxuICAgICAgdHJhY2VzLFxuICAgICAgY2hpbGRyZW46IFtdLFxuICAgIH07XG4gIH1cbn1cblxuZnVuY3Rpb24gbWFwTW9kdWxlU3RhdGUoc3RhdGU6IFwic2tpcHBlZFwiIHwgXCJwZW5kaW5nXCIgfCBcImZhaWxlZFwiIHwgXCJwYXNzZWRcIiB8IFwicXVldWVkXCIpOiBUZXN0U3RhdGUge1xuICBzd2l0Y2ggKHN0YXRlKSB7XG4gICAgY2FzZSBcInBhc3NlZFwiOlxuICAgICAgcmV0dXJuIFwicGFzc2VkXCI7XG4gICAgY2FzZSBcImZhaWxlZFwiOlxuICAgICAgcmV0dXJuIFwiZmFpbGVkXCI7XG4gICAgY2FzZSBcInNraXBwZWRcIjpcbiAgICAgIHJldHVybiBcInNraXBwZWRcIjtcbiAgICBjYXNlIFwicGVuZGluZ1wiOlxuICAgIGNhc2UgXCJxdWV1ZWRcIjpcbiAgICAgIHJldHVybiBcInJ1bm5pbmdcIjtcbiAgICBkZWZhdWx0OlxuICAgICAgcmV0dXJuIFwidW5rbm93blwiO1xuICB9XG59XG5cbmZ1bmN0aW9uIG1hcFN1aXRlU3RhdGUoc3RhdGU6IFwic2tpcHBlZFwiIHwgXCJwZW5kaW5nXCIgfCBcImZhaWxlZFwiIHwgXCJwYXNzZWRcIik6IFRlc3RTdGF0ZSB7XG4gIHN3aXRjaCAoc3RhdGUpIHtcbiAgICBjYXNlIFwicGFzc2VkXCI6XG4gICAgICByZXR1cm4gXCJwYXNzZWRcIjtcbiAgICBjYXNlIFwiZmFpbGVkXCI6XG4gICAgICByZXR1cm4gXCJmYWlsZWRcIjtcbiAgICBjYXNlIFwic2tpcHBlZFwiOlxuICAgICAgcmV0dXJuIFwic2tpcHBlZFwiO1xuICAgIGNhc2UgXCJwZW5kaW5nXCI6XG4gICAgICByZXR1cm4gXCJydW5uaW5nXCI7XG4gICAgZGVmYXVsdDpcbiAgICAgIHJldHVybiBcInVua25vd25cIjtcbiAgfVxufVxuXG5mdW5jdGlvbiBtYXBUZXN0UmVzdWx0KFxuICByZXN1bHQ6IFJldHVyblR5cGU8VGVzdENhc2VbXCJyZXN1bHRcIl0+LFxuICBtb2RlOiBcInJ1blwiIHwgXCJvbmx5XCIgfCBcInNraXBcIiB8IFwidG9kb1wiLFxuKTogVGVzdFN0YXRlIHtcbiAgc3dpdGNoIChyZXN1bHQuc3RhdGUpIHtcbiAgICBjYXNlIFwicGFzc2VkXCI6XG4gICAgICByZXR1cm4gXCJwYXNzZWRcIjtcbiAgICBjYXNlIFwiZmFpbGVkXCI6XG4gICAgICByZXR1cm4gXCJmYWlsZWRcIjtcbiAgICBjYXNlIFwic2tpcHBlZFwiOlxuICAgICAgcmV0dXJuIG1vZGUgPT09IFwidG9kb1wiID8gXCJ0b2RvXCIgOiBcInNraXBwZWRcIjtcbiAgICBjYXNlIFwicGVuZGluZ1wiOlxuICAgICAgcmV0dXJuIFwicnVubmluZ1wiO1xuICAgIGRlZmF1bHQ6XG4gICAgICByZXR1cm4gXCJ1bmtub3duXCI7XG4gIH1cbn1cblxuZnVuY3Rpb24gY291bnRGcm9tU3RhdGUoc3RhdGU6IFRlc3RTdGF0ZSk6IFRlc3RDb3VudHMge1xuICBzd2l0Y2ggKHN0YXRlKSB7XG4gICAgY2FzZSBcInBhc3NlZFwiOlxuICAgICAgcmV0dXJuIHsgdG90YWw6IDEsIHBhc3NlZDogMSwgZmFpbGVkOiAwLCBza2lwcGVkOiAwIH07XG4gICAgY2FzZSBcImZhaWxlZFwiOlxuICAgICAgcmV0dXJuIHsgdG90YWw6IDEsIHBhc3NlZDogMCwgZmFpbGVkOiAxLCBza2lwcGVkOiAwIH07XG4gICAgY2FzZSBcInNraXBwZWRcIjpcbiAgICBjYXNlIFwidG9kb1wiOlxuICAgICAgcmV0dXJuIHsgdG90YWw6IDEsIHBhc3NlZDogMCwgZmFpbGVkOiAwLCBza2lwcGVkOiAxIH07XG4gICAgZGVmYXVsdDpcbiAgICAgIC8vIHJ1bm5pbmcvdW5rbm93biDsg4Htg5zrj4QgdG90YWzsl5Ag7Y+s7ZWo7ZWY7JesIO2MjOydvCDrhbjrk5wgY291bnRzLnRvdGFs7J20IO2VmOychCDtlanqs4TsmYAg7J287LmY7ZWY64+E66GdIO2VqFxuICAgICAgcmV0dXJuIHsgdG90YWw6IDEsIHBhc3NlZDogMCwgZmFpbGVkOiAwLCBza2lwcGVkOiAwIH07XG4gIH1cbn1cblxuZnVuY3Rpb24gYWdncmVnYXRlQ291bnRzKGNoaWxkcmVuOiBUZXN0Q2FzZVJlc3VsdFtdKTogVGVzdENvdW50cyB7XG4gIGxldCB0b3RhbCA9IDA7XG4gIGxldCBwYXNzZWQgPSAwO1xuICBsZXQgZmFpbGVkID0gMDtcbiAgbGV0IHNraXBwZWQgPSAwO1xuICBmb3IgKGNvbnN0IGNoaWxkIG9mIGNoaWxkcmVuKSB7XG4gICAgdG90YWwgKz0gY2hpbGQuY291bnRzLnRvdGFsO1xuICAgIHBhc3NlZCArPSBjaGlsZC5jb3VudHMucGFzc2VkO1xuICAgIGZhaWxlZCArPSBjaGlsZC5jb3VudHMuZmFpbGVkO1xuICAgIHNraXBwZWQgKz0gY2hpbGQuY291bnRzLnNraXBwZWQ7XG4gIH1cbiAgcmV0dXJuIHsgdG90YWwsIHBhc3NlZCwgZmFpbGVkLCBza2lwcGVkIH07XG59XG5cbmZ1bmN0aW9uIGdldFJlc3VsdENvbXBsZXRlbmVzc1Njb3JlKG5vZGU6IFRlc3RDYXNlUmVzdWx0KTogbnVtYmVyIHtcbiAgbGV0IHNjb3JlID0gMDtcbiAgLy8g7YWM7Iqk7Yq4IOyImOqwgCDrjZQg66eO7J2AIOqysOqzvOulvCDsmrDshKDtlZjsl6wg7KSR67O1IO2MjOydvCDrs5Htlakg7IucIOygleuztCDshpDsi6TsnYQg7KSE7J6F64uI64ukLlxuICBzY29yZSArPSBub2RlLmNvdW50cy50b3RhbCAqIDEwMDA7XG4gIHNjb3JlICs9IG5vZGUuY2hpbGRyZW4ubGVuZ3RoICogMTAwO1xuICBpZiAobm9kZS5kdXJhdGlvbk1zICE9PSBudWxsKSBzY29yZSArPSAxMDtcblxuICBzd2l0Y2ggKG5vZGUuc3RhdGUpIHtcbiAgICBjYXNlIFwiZmFpbGVkXCI6XG4gICAgICBzY29yZSArPSA1O1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSBcInBhc3NlZFwiOlxuICAgICAgc2NvcmUgKz0gNDtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgXCJza2lwcGVkXCI6XG4gICAgICBzY29yZSArPSAzO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSBcInRvZG9cIjpcbiAgICAgIHNjb3JlICs9IDI7XG4gICAgICBicmVhaztcbiAgICBjYXNlIFwicnVubmluZ1wiOlxuICAgICAgc2NvcmUgKz0gMTtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgXCJ1bmtub3duXCI6XG4gICAgICBicmVhaztcbiAgICBkZWZhdWx0OlxuICAgICAgYnJlYWs7XG4gIH1cblxuICByZXR1cm4gc2NvcmU7XG59XG5cbmNvbnN0IHNlcmlhbGl6ZWRUcmFjZVNjaGVtYSA9IHoub2JqZWN0KHtcbiAga2V5OiB6LnN0cmluZygpLFxuICB2YWx1ZTogei51bmtub3duKCksXG4gIGZpbGVQYXRoOiB6LnN0cmluZygpLFxuICBsaW5lTnVtYmVyOiB6Lm51bWJlcigpLFxuICBhdDogei5zdHJpbmcoKSxcbn0pO1xuXG50eXBlIFNlcmlhbGl6ZWRUcmFjZUNhbmRpZGF0ZSA9IG9iamVjdCB8IHN0cmluZyB8IG51bWJlciB8IGJvb2xlYW4gfCBiaWdpbnQgfCBzeW1ib2wgfCBudWxsO1xuXG5mdW5jdGlvbiBwYXJzZVNlcmlhbGl6ZWRUcmFjZXModmFsdWVzOiByZWFkb25seSBTZXJpYWxpemVkVHJhY2VDYW5kaWRhdGVbXSk6IFNlcmlhbGl6ZWRUcmFjZVtdIHtcbiAgcmV0dXJuIHZhbHVlcy5mbGF0TWFwKCh2YWx1ZSkgPT4ge1xuICAgIGNvbnN0IHBhcnNlZCA9IHNlcmlhbGl6ZWRUcmFjZVNjaGVtYS5zYWZlUGFyc2UodmFsdWUpO1xuICAgIHJldHVybiBwYXJzZWQuc3VjY2VzcyA/IFtwYXJzZWQuZGF0YV0gOiBbXTtcbiAgfSk7XG59XG4iXSwibWFwcGluZ3MiOiI7OztBQW1uQkEsU0FBUyxlQUFlLE9BQTBFO0NBQ2hHLFFBQVEsT0FBUjtFQUNFLEtBQUssVUFDSCxPQUFPO0VBQ1QsS0FBSyxVQUNILE9BQU87RUFDVCxLQUFLLFdBQ0gsT0FBTztFQUNULEtBQUs7RUFDTCxLQUFLLFVBQ0gsT0FBTztFQUNULFNBQ0UsT0FBTztDQUNYO0FBQ0Y7QUFFQSxTQUFTLGNBQWMsT0FBK0Q7Q0FDcEYsUUFBUSxPQUFSO0VBQ0UsS0FBSyxVQUNILE9BQU87RUFDVCxLQUFLLFVBQ0gsT0FBTztFQUNULEtBQUssV0FDSCxPQUFPO0VBQ1QsS0FBSyxXQUNILE9BQU87RUFDVCxTQUNFLE9BQU87Q0FDWDtBQUNGO0FBRUEsU0FBUyxjQUNQLFFBQ0EsTUFDVztDQUNYLFFBQVEsT0FBTyxPQUFmO0VBQ0UsS0FBSyxVQUNILE9BQU87RUFDVCxLQUFLLFVBQ0gsT0FBTztFQUNULEtBQUssV0FDSCxPQUFPLFNBQVMsU0FBUyxTQUFTO0VBQ3BDLEtBQUssV0FDSCxPQUFPO0VBQ1QsU0FDRSxPQUFPO0NBQ1g7QUFDRjtBQUVBLFNBQVMsZUFBZSxPQUE4QjtDQUNwRCxRQUFRLE9BQVI7RUFDRSxLQUFLLFVBQ0gsT0FBTztHQUFFLE9BQU87R0FBRyxRQUFRO0dBQUcsUUFBUTtHQUFHLFNBQVM7RUFBRTtFQUN0RCxLQUFLLFVBQ0gsT0FBTztHQUFFLE9BQU87R0FBRyxRQUFRO0dBQUcsUUFBUTtHQUFHLFNBQVM7RUFBRTtFQUN0RCxLQUFLO0VBQ0wsS0FBSyxRQUNILE9BQU87R0FBRSxPQUFPO0dBQUcsUUFBUTtHQUFHLFFBQVE7R0FBRyxTQUFTO0VBQUU7RUFDdEQsU0FFRSxPQUFPO0dBQUUsT0FBTztHQUFHLFFBQVE7R0FBRyxRQUFRO0dBQUcsU0FBUztFQUFFO0NBQ3hEO0FBQ0Y7QUFFQSxTQUFTLGdCQUFnQixVQUF3QztDQUMvRCxJQUFJ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
@@ -16,5 +16,416 @@ export type FakerMappings = {
16
16
  type_defaults: Record<string, FakerMappingConfig>;
17
17
  };
18
18
  };
19
- export declare const fakerMappings: FakerMappings;
19
+ export declare const fakerMappings: {
20
+ ko: {
21
+ field_patterns: {
22
+ email: {
23
+ faker: string;
24
+ comment: string;
25
+ };
26
+ username: {
27
+ faker: string;
28
+ comment: string;
29
+ };
30
+ name: {
31
+ faker: string;
32
+ comment: string;
33
+ };
34
+ firstname: {
35
+ faker: string;
36
+ comment: string;
37
+ };
38
+ lastname: {
39
+ faker: string;
40
+ comment: string;
41
+ };
42
+ phone: {
43
+ faker: string;
44
+ comment: string;
45
+ };
46
+ mobile: {
47
+ faker: string;
48
+ comment: string;
49
+ };
50
+ address: {
51
+ faker: string;
52
+ comment: string;
53
+ };
54
+ city: {
55
+ faker: string;
56
+ comment: string;
57
+ };
58
+ country: {
59
+ faker: string;
60
+ comment: string;
61
+ };
62
+ zipcode: {
63
+ faker: string;
64
+ comment: string;
65
+ };
66
+ company: {
67
+ faker: string;
68
+ comment: string;
69
+ };
70
+ department: {
71
+ faker: string;
72
+ comment: string;
73
+ };
74
+ position: {
75
+ faker: string;
76
+ comment: string;
77
+ };
78
+ jobtitle: {
79
+ faker: string;
80
+ comment: string;
81
+ };
82
+ birthdate: {
83
+ faker: string;
84
+ comment: string;
85
+ };
86
+ title: {
87
+ faker: string;
88
+ comment: string;
89
+ };
90
+ description: {
91
+ faker: string;
92
+ comment: string;
93
+ };
94
+ content: {
95
+ faker: string;
96
+ comment: string;
97
+ };
98
+ url: {
99
+ faker: string;
100
+ comment: string;
101
+ };
102
+ image: {
103
+ faker: string;
104
+ comment: string;
105
+ };
106
+ avatar: {
107
+ faker: string;
108
+ comment: string;
109
+ };
110
+ uuid: {
111
+ faker: string;
112
+ comment: string;
113
+ };
114
+ salary: {
115
+ faker: string;
116
+ comment: string;
117
+ };
118
+ budget: {
119
+ faker: string;
120
+ comment: string;
121
+ };
122
+ price: {
123
+ faker: string;
124
+ comment: string;
125
+ };
126
+ amount: {
127
+ faker: string;
128
+ comment: string;
129
+ };
130
+ cost: {
131
+ faker: string;
132
+ comment: string;
133
+ };
134
+ employeenumber: {
135
+ faker: string;
136
+ comment: string;
137
+ };
138
+ code: {
139
+ faker: string;
140
+ comment: string;
141
+ };
142
+ count: {
143
+ faker: string;
144
+ comment: string;
145
+ };
146
+ quantity: {
147
+ faker: string;
148
+ comment: string;
149
+ };
150
+ mimetype: {
151
+ faker: string;
152
+ comment: string;
153
+ };
154
+ };
155
+ type_defaults: {
156
+ string: {
157
+ faker: string;
158
+ comment: string;
159
+ };
160
+ integer: {
161
+ faker: string;
162
+ comment: string;
163
+ };
164
+ numeric: {
165
+ faker: string;
166
+ comment: string;
167
+ };
168
+ boolean: {
169
+ faker: string;
170
+ comment: string;
171
+ };
172
+ date: {
173
+ faker: string;
174
+ comment: string;
175
+ };
176
+ uuid: {
177
+ faker: string;
178
+ comment: string;
179
+ };
180
+ json: {
181
+ faker: string;
182
+ comment: string;
183
+ };
184
+ };
185
+ };
186
+ en: {
187
+ field_patterns: {
188
+ email: {
189
+ faker: string;
190
+ comment: string;
191
+ };
192
+ username: {
193
+ faker: string;
194
+ comment: string;
195
+ };
196
+ name: {
197
+ faker: string;
198
+ comment: string;
199
+ };
200
+ firstname: {
201
+ faker: string;
202
+ comment: string;
203
+ };
204
+ lastname: {
205
+ faker: string;
206
+ comment: string;
207
+ };
208
+ phone: {
209
+ faker: string;
210
+ comment: string;
211
+ };
212
+ mobile: {
213
+ faker: string;
214
+ comment: string;
215
+ };
216
+ address: {
217
+ faker: string;
218
+ comment: string;
219
+ };
220
+ city: {
221
+ faker: string;
222
+ comment: string;
223
+ };
224
+ country: {
225
+ faker: string;
226
+ comment: string;
227
+ };
228
+ zipcode: {
229
+ faker: string;
230
+ comment: string;
231
+ };
232
+ company: {
233
+ faker: string;
234
+ comment: string;
235
+ };
236
+ department: {
237
+ faker: string;
238
+ comment: string;
239
+ };
240
+ position: {
241
+ faker: string;
242
+ comment: string;
243
+ };
244
+ jobtitle: {
245
+ faker: string;
246
+ comment: string;
247
+ };
248
+ birthdate: {
249
+ faker: string;
250
+ comment: string;
251
+ };
252
+ title: {
253
+ faker: string;
254
+ comment: string;
255
+ };
256
+ description: {
257
+ faker: string;
258
+ comment: string;
259
+ };
260
+ content: {
261
+ faker: string;
262
+ comment: string;
263
+ };
264
+ url: {
265
+ faker: string;
266
+ comment: string;
267
+ };
268
+ image: {
269
+ faker: string;
270
+ comment: string;
271
+ };
272
+ avatar: {
273
+ faker: string;
274
+ comment: string;
275
+ };
276
+ uuid: {
277
+ faker: string;
278
+ comment: string;
279
+ };
280
+ salary: {
281
+ faker: string;
282
+ comment: string;
283
+ };
284
+ budget: {
285
+ faker: string;
286
+ comment: string;
287
+ };
288
+ price: {
289
+ faker: string;
290
+ comment: string;
291
+ };
292
+ amount: {
293
+ faker: string;
294
+ comment: string;
295
+ };
296
+ cost: {
297
+ faker: string;
298
+ comment: string;
299
+ };
300
+ employeenumber: {
301
+ faker: string;
302
+ comment: string;
303
+ };
304
+ code: {
305
+ faker: string;
306
+ comment: string;
307
+ };
308
+ count: {
309
+ faker: string;
310
+ comment: string;
311
+ };
312
+ quantity: {
313
+ faker: string;
314
+ comment: string;
315
+ };
316
+ mimetype: {
317
+ faker: string;
318
+ comment: string;
319
+ };
320
+ };
321
+ type_defaults: {
322
+ string: {
323
+ faker: string;
324
+ comment: string;
325
+ };
326
+ integer: {
327
+ faker: string;
328
+ comment: string;
329
+ };
330
+ numeric: {
331
+ faker: string;
332
+ comment: string;
333
+ };
334
+ boolean: {
335
+ faker: string;
336
+ comment: string;
337
+ };
338
+ date: {
339
+ faker: string;
340
+ comment: string;
341
+ };
342
+ uuid: {
343
+ faker: string;
344
+ comment: string;
345
+ };
346
+ json: {
347
+ faker: string;
348
+ comment: string;
349
+ };
350
+ };
351
+ };
352
+ ja: {
353
+ field_patterns: {
354
+ email: {
355
+ faker: string;
356
+ comment: string;
357
+ };
358
+ username: {
359
+ faker: string;
360
+ comment: string;
361
+ };
362
+ name: {
363
+ faker: string;
364
+ comment: string;
365
+ };
366
+ firstname: {
367
+ faker: string;
368
+ comment: string;
369
+ };
370
+ lastname: {
371
+ faker: string;
372
+ comment: string;
373
+ };
374
+ phone: {
375
+ faker: string;
376
+ comment: string;
377
+ };
378
+ mobile: {
379
+ faker: string;
380
+ comment: string;
381
+ };
382
+ address: {
383
+ faker: string;
384
+ comment: string;
385
+ };
386
+ city: {
387
+ faker: string;
388
+ comment: string;
389
+ };
390
+ company: {
391
+ faker: string;
392
+ comment: string;
393
+ };
394
+ title: {
395
+ faker: string;
396
+ comment: string;
397
+ };
398
+ salary: {
399
+ faker: string;
400
+ comment: string;
401
+ };
402
+ budget: {
403
+ faker: string;
404
+ comment: string;
405
+ };
406
+ };
407
+ type_defaults: {
408
+ string: {
409
+ faker: string;
410
+ comment: string;
411
+ };
412
+ integer: {
413
+ faker: string;
414
+ comment: string;
415
+ };
416
+ numeric: {
417
+ faker: string;
418
+ comment: string;
419
+ };
420
+ boolean: {
421
+ faker: string;
422
+ comment: string;
423
+ };
424
+ date: {
425
+ faker: string;
426
+ comment: string;
427
+ };
428
+ };
429
+ };
430
+ };
20
431
  //# sourceMappingURL=faker-mappings.d.ts.map