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,39 +1,46 @@
1
1
  import { __esmMin } from "../_virtual/_rolldown/runtime.js";
2
+ import { init_runtime_value, isFunctionValue, isObjectValue } from "../utils/runtime-value.js";
2
3
  import { applyCurrentSnapshotToProcessEnv, init_env } from "../env.js";
3
4
  //#region src/api/config.ts
5
+ function isExecutableConfig(value) {
6
+ return isFunctionValue(value);
7
+ }
8
+ function normalizeZodCompilerPolicy(value, _syncTargets = []) {
9
+ if (value === void 0 || value === false) return {
10
+ api: false,
11
+ targets: {}
12
+ };
13
+ if (!isObjectValue(value) || Array.isArray(value)) throw new Error("validation.zodCompiler must be false or an object");
14
+ const api = "api" in value ? value.api ?? false : false;
15
+ if (api !== false && api !== "jit" && api !== "aot") throw new Error("validation.zodCompiler.api must be false, 'jit', or 'aot'");
16
+ if ("targets" in value) throw new Error("validation.zodCompiler.targets is not supported in the API-only phase");
17
+ return {
18
+ api,
19
+ targets: {}
20
+ };
21
+ }
4
22
  function defineConfig(config) {
5
- if (typeof config === "function") return Promise.resolve(config());
23
+ if (isExecutableConfig(config)) return Promise.resolve(config());
6
24
  return Promise.resolve(config);
7
25
  }
8
- /**
9
- * sonamu.config.ts 파일을 로드합니다.
10
- * 이 설정 파일은 환경에 따라 다른 경로에 있을 수 있습니다.
11
- * dist를 빌드하는 환경이라면 dist 바로 아래에 있을 것이고(cli-wrapper.ts에서 빌드),
12
- * 그렇지 않은 환경이라면 프로젝트 루트에 있을 것입니다.
13
- *
14
- * 이 함수는 의도적으로 다른 의존성의 사용을 최대한 배제하였습니다.
15
- * 이는 실행 초기에 최대한 빠르게 설정을 읽어올 수 있도록 하기 위함입니다.
16
- * 따라서 경로 concat과 URL scheme 추가도 단순한 문자열 조작으로 처리하였습니다.
17
- *
18
- * @param rootPath
19
- * @returns
20
- */
21
- async function loadConfig(rootPath) {
26
+ async function loadConfig(rootPath, dependencies = defaultConfigLoaderDependencies) {
22
27
  applyCurrentSnapshotToProcessEnv(rootPath);
23
28
  const shouldLoadSourceConfig = process.env.HOT === "yes" || process.env.VITEST === "true";
24
29
  const configPath = shouldLoadSourceConfig ? `${rootPath}/src/sonamu.config.ts` : `${rootPath}/dist/sonamu.config.js`;
25
- if (shouldLoadSourceConfig) {
26
- const { ensureTsLoaderRegistered } = await import("../bin/ts-loader-registration.js");
27
- await ensureTsLoaderRegistered(rootPath);
28
- }
30
+ if (shouldLoadSourceConfig) await dependencies.ensureTsLoaderRegistered(rootPath);
29
31
  const { default: config } = await import(`file://${configPath}`);
30
32
  return config;
31
33
  }
34
+ var defaultConfigLoaderDependencies;
32
35
  var init_config = __esmMin((() => {
33
36
  init_env();
37
+ init_runtime_value();
38
+ defaultConfigLoaderDependencies = { async ensureTsLoaderRegistered(rootPath) {
39
+ await (await import("../bin/ts-loader-registration.js")).ensureTsLoaderRegistered(rootPath);
40
+ } };
34
41
  }));
35
42
  //#endregion
36
43
  init_config();
37
- export { defineConfig, init_config, loadConfig };
44
+ export { defineConfig, init_config, loadConfig, normalizeZodCompilerPolicy };
38
45
 
39
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29uZmlnLmpzIiwibmFtZXMiOltdLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9hcGkvY29uZmlnLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IHR5cGUgRmFzdGlmeUNvbXByZXNzT3B0aW9ucyB9IGZyb20gXCJAZmFzdGlmeS9jb21wcmVzc1wiO1xuaW1wb3J0IHsgdHlwZSBGYXN0aWZ5Q29yc09wdGlvbnMgfSBmcm9tIFwiQGZhc3RpZnkvY29yc1wiO1xuaW1wb3J0IHsgdHlwZSBGYXN0aWZ5Rm9ybWJvZHlPcHRpb25zIH0gZnJvbSBcIkBmYXN0aWZ5L2Zvcm1ib2R5XCI7XG5pbXBvcnQgeyB0eXBlIEZhc3RpZnlNdWx0aXBhcnRPcHRpb25zIH0gZnJvbSBcIkBmYXN0aWZ5L211bHRpcGFydFwiO1xuaW1wb3J0IHsgdHlwZSBGYXN0aWZ5U3RhdGljT3B0aW9ucyB9IGZyb20gXCJAZmFzdGlmeS9zdGF0aWNcIjtcbmltcG9ydCB7IHR5cGUgV2Vic29ja2V0UGx1Z2luT3B0aW9ucyB9IGZyb20gXCJAZmFzdGlmeS93ZWJzb2NrZXRcIjtcbmltcG9ydCB7IHR5cGUgQmV0dGVyQXV0aE9wdGlvbnMgfSBmcm9tIFwiYmV0dGVyLWF1dGhcIjtcbmltcG9ydCB7XG4gIHR5cGUgRmFzdGlmeUluc3RhbmNlLFxuICB0eXBlIEZhc3RpZnlSZXBseSxcbiAgdHlwZSBGYXN0aWZ5UmVxdWVzdCxcbiAgdHlwZSBGYXN0aWZ5U2VydmVyT3B0aW9ucyxcbn0gZnJvbSBcImZhc3RpZnlcIjtcbmltcG9ydCB7IHR5cGUgUXNQbHVnaW5PcHRpb25zIH0gZnJvbSBcImZhc3RpZnktcXNcIjtcbmltcG9ydCB7IHR5cGUgU3NlUGx1Z2luT3B0aW9ucyB9IGZyb20gXCJmYXN0aWZ5LXNzZS12Mi9saWIvdHlwZXNcIjtcbmltcG9ydCB7IHR5cGUgS25leCB9IGZyb20gXCJrbmV4XCI7XG5cbmltcG9ydCB7IHR5cGUgQ2FjaGVDb25maWcgfSBmcm9tIFwiLi4vY2FjaGUvdHlwZXNcIjtcbmltcG9ydCB7IHR5cGUgU29uYW11REJDb25maWcgfSBmcm9tIFwiLi4vZGF0YWJhc2UvZGJcIjtcbmltcG9ydCB7IGFwcGx5Q3VycmVudFNuYXBzaG90VG9Qcm9jZXNzRW52IH0gZnJvbSBcIi4uL2VudlwiO1xuaW1wb3J0IHsgdHlwZSBTb25hbXVMb2dnaW5nT3B0aW9ucyB9IGZyb20gXCIuLi9sb2dnZXIvY29uZmlndXJlXCI7XG5pbXBvcnQgeyB0eXBlIFN0b3JhZ2VDb25maWcgfSBmcm9tIFwiLi4vc3RvcmFnZS90eXBlc1wiO1xuaW1wb3J0IHsgdHlwZSBXZWJTb2NrZXRSdW50aW1lT3B0aW9ucyB9IGZyb20gXCIuLi9zdHJlYW0vd3NcIjtcbmltcG9ydCB7IHR5cGUgV29ya2Zsb3dPcHRpb25zIH0gZnJvbSBcIi4uL3Rhc2tzL3dvcmtmbG93LW1hbmFnZXJcIjtcbmltcG9ydCB7IHR5cGUgRXhlY3V0YWJsZSwgdHlwZSBTb25hbXVGYXN0aWZ5Q29uZmlnIH0gZnJvbSBcIi4uL3R5cGVzL3R5cGVzXCI7XG5pbXBvcnQgeyB0eXBlIENvbnRleHQsIHR5cGUgV2ViU29ja2V0Q29udGV4dCB9IGZyb20gXCIuL2NvbnRleHRcIjtcblxuZXhwb3J0IHR5cGUgRGF0YWJhc2VDb25maWcgPSBPbWl0PEtuZXguQ29uZmlnLCBcImNvbm5lY3Rpb25cIj4gJiB7XG4gIGNvbm5lY3Rpb24/OiBLbmV4LlBnQ29ubmVjdGlvbkNvbmZpZztcbn07XG5cbi8qKlxuICogaTE4biDshKTsoJVcbiAqL1xuZXhwb3J0IHR5cGUgU29uYW11STE4bk9wdGlvbnMgPSB7XG4gIC8qKiDquLDrs7ggbG9jYWxlICjtgqQg7KCV7J2YIOq4sOykgCArIOufsO2DgOyehCDquLDrs7jqsJIpICovXG4gIGRlZmF1bHRMb2NhbGU6IHN0cmluZztcbiAgLyoqIOyngOybkO2VmOuKlCBsb2NhbGUg66qp66GdICovXG4gIHN1cHBvcnRlZExvY2FsZXM6IHN0cmluZ1tdO1xufTtcblxuLyoqXG4gKiBEZXYg7ISc67KEIOuCtCBWaXRlc3Qg7IOB7KO8IOyduOyKpO2EtOyKpCDshKTsoJVcbiAqL1xuZXhwb3J0IHR5cGUgU29uYW11RGV2UnVubmVyQ29uZmlnID0ge1xuICAvKiogRGV2UnVubmVyIO2ZnOyEse2ZlCDsl6zrtoAgKOq4sOuzuDogZmFsc2UpICovXG4gIGVuYWJsZWQ6IGJvb2xlYW47XG4gIC8qKiDthYzsiqTtirgg7JeU65Oc7Y+s7J247Yq4IOqyveuhnCDsoJHrkZDsgqwgKOq4sOuzuDogL19fdGVzdF9fKSAqL1xuICByb3V0ZVByZWZpeD86IHN0cmluZztcbiAgLyoqIHZpdGVzdC5jb25maWcudHMg6rK966GcIChhcGktcm9vdCDsg4HrjIDqsr3roZwpICovXG4gIHZpdGVzdENvbmZpZ1BhdGg/OiBzdHJpbmc7XG59O1xuXG4vKipcbiAqIO2FjOyKpO2KuCDshKTsoJVcbiAqIHZpdGVzdCDrs5HroKwg7YWM7Iqk7YyF7J2EIHNvbmFtdS5jb25maWcudHMg7ZWcIOqzs+yXkOyEnCDqtIDrpqztlZjquLAg7JyE7ZWcIOyEpOygleyeheuLiOuLpC5cbiAqL1xuZXhwb3J0IHR5cGUgU29uYW11VGVzdENvbmZpZyA9IHtcbiAgLyoqIOuzkeugrCDthYzsiqTtjIUg7Zmc7ISx7ZmUICjquLDrs7g6IGZhbHNlKSAqL1xuICBwYXJhbGxlbD86IGJvb2xlYW47XG4gIC8qKiDrs5HroKwg7Iuk7ZaJIOybjOy7pCDsiJggKOq4sOuzuDogNCkgKi9cbiAgbWF4V29ya2Vycz86IG51bWJlcjtcbiAgLyoqIERldiDshJzrsoQg64K0IFZpdGVzdCDsg4Hso7wg7J247Iqk7YS07IqkIOyEpOyglSAqL1xuICBkZXZSdW5uZXI/OiBTb25hbXVEZXZSdW5uZXJDb25maWc7XG59O1xuXG5leHBvcnQgdHlwZSBTb25hbXVDb25maWc8VFNpbmtJZCBleHRlbmRzIHN0cmluZyA9IHN0cmluZywgVEZpbHRlcklkIGV4dGVuZHMgc3RyaW5nID0gc3RyaW5nPiA9IHtcbiAgcHJvamVjdE5hbWU/OiBzdHJpbmc7XG5cbiAgYXBpOiB7XG4gICAgZGlyOiBzdHJpbmc7XG4gICAgcm91dGU6IHtcbiAgICAgIHByZWZpeDogc3RyaW5nO1xuICAgIH07XG4gICAgdGltZXpvbmU/OiBzdHJpbmc7XG4gIH07XG5cbiAgLyoqXG4gICAqIGkxOG4g7ISk7KCVXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIGBgYHR5cGVzY3JpcHRcbiAgICogaTE4bjoge1xuICAgKiAgIGRlZmF1bHRMb2NhbGU6ICdrbycsXG4gICAqICAgc3VwcG9ydGVkTG9jYWxlczogWydrbycsICdlbicsICdqYSddLFxuICAgKiB9XG4gICAqIGBgYFxuICAgKi9cbiAgaTE4bjogU29uYW11STE4bk9wdGlvbnM7XG5cbiAgc3luYzoge1xuICAgIHRhcmdldHM6IHN0cmluZ1tdOyAvLyBcIndlYlwiLCBcImFwcFwiIOuTsVxuICB9O1xuXG4gIGRhdGFiYXNlOiB7XG4gICAgLy8g642w7J207YSw67Kg7J207IqkKHBn64qUIHBnIOuqqOuTiCwgcGduYXRpdmXripQgcGctbmF0aXZlIOuqqOuTiOydmCDshKTsuZjqsIAg7ZWE7JqU7ZWp64uI64ukLilcbiAgICBkYXRhYmFzZT86IFwicGdcIiB8IFwicGduYXRpdmVcIjtcbiAgICAvLyDrqqjrk6Ag7ZmY6rK97JeQIOyggeyaqeuQoCDquLDrs7ggS25leCDsmLXshZhcbiAgICBkZWZhdWx0T3B0aW9ucz86IERhdGFiYXNlQ29uZmlnO1xuICB9O1xuXG4gIGxvZ2dpbmc/OiBmYWxzZSB8IFNvbmFtdUxvZ2dpbmdPcHRpb25zPFRTaW5rSWQsIFRGaWx0ZXJJZD47XG4gIHNlcnZlcjogU29uYW11U2VydmVyT3B0aW9ucztcbiAgdGFza3M/OiBTb25hbXVUYXNrT3B0aW9ucztcblxuICAvKipcbiAgICog7YWM7Iqk7Yq4IOyEpOyglSAo67OR66CsIO2FjOyKpO2MhSDrk7EpXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIGBgYHR5cGVzY3JpcHRcbiAgICogdGVzdDoge1xuICAgKiAgIHBhcmFsbGVsOiB0cnVlLFxuICAgKiAgIG1heFdvcmtlcnM6IDQsXG4gICAqIH1cbiAgICogYGBgXG4gICAqL1xuICB0ZXN0PzogU29uYW11VGVzdENvbmZpZztcblxuICAvKipcbiAgICog7Jm467aAIOyXkOuUlO2EsCDshKTsoJUgKENERCDrk7Hsl5DshJwg7YyM7J28IO2OuOynkSDsi5wg7IKs7JqpKVxuICAgKiDrr7jshKTsoJUg7IucIFwidnNjb2RlXCLrpbwg6riw67O46rCS7Jy866GcIOyCrOyaqe2VqeuLiOuLpC5cbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogYGBgdHlwZXNjcmlwdFxuICAgKiBleHRlcm5hbEVkaXRvcjogXCJjdXJzb3JcIlxuICAgKiBgYGBcbiAgICovXG4gIGV4dGVybmFsRWRpdG9yPzogXCJWaXN1YWwgU3R1ZGlvIENvZGVcIiB8IFwiWmVkXCIgfCBcIkN1cnNvclwiO1xuXG4gIC8qKlxuICAgKiBTbGFjayDsirnsnbgg7ISk7KCVIChQcm9kdWN0aW9uIOuniOydtOq3uOugiOydtOyFmOyaqSlcbiAgICpcbiAgICogUHJvZHVjdGlvbiBEQiDrp4jsnbTqt7jroIjsnbTshZgg7IucIFNsYWNr7J2EIO2Gte2VnCDsirnsnbgg7ZSE66Gc7IS47Iqk66W8IO2ZnOyEse2ZlO2VqeuLiOuLpC5cbiAgICog7ISk7KCV7J20IOyXhuycvOuptCDquLDsobQg64+Z7J6RKOuwlOuhnCDsi6Ttlokp7Jy866GcIOuPmeyeke2VqeuLiOuLpC5cbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogYGBgdHlwZXNjcmlwdFxuICAgKiBzbGFja0NvbmZpcm06IHtcbiAgICogICB0YXJnZXRzOiBbXCJwcm9kdWN0aW9uXCJdLFxuICAgKiAgIGJvdFRva2VuOiBwcm9jZXNzLmVudi5TTEFDS19CT1RfVE9LRU4gPz8gXCJcIixcbiAgICogICBjaGFubmVsSWQ6IHByb2Nlc3MuZW52LlNMQUNLX0NIQU5ORUxfSUQgPz8gXCJcIixcbiAgICogfVxuICAgKiBgYGBcbiAgICovXG4gIHNsYWNrQ29uZmlybT86IHtcbiAgICAvKiog7Iq57J247J20IO2VhOyalO2VnCBEQiDtgqQg66qp66GdICjsmIg6IFtcInByb2R1Y3Rpb25cIl0pICovXG4gICAgdGFyZ2V0czogKGtleW9mIFNvbmFtdURCQ29uZmlnKVtdO1xuICAgIC8qKiBTbGFjayBCb3QgVG9rZW4gKHhveGItLi4uKSAqL1xuICAgIGJvdFRva2VuOiBzdHJpbmc7XG4gICAgLyoqIFNsYWNrIENoYW5uZWwgSUQgKEMuLi4pICovXG4gICAgY2hhbm5lbElkOiBzdHJpbmc7XG4gIH07XG59O1xuXG5leHBvcnQgdHlwZSBTb25hbXVTZXJ2ZXJPcHRpb25zID0ge1xuICAvLyDtlITroZzsoJ3tirgg7Jm467aA7JeQ7IScIOygkeq3vO2VoCDsiJgg7J6I64qUIFVSTC4g6riw67O46rCS7J2AIHtzZXJ2ZXIubGlzdGVuLmhvc3R9OntzZXJ2ZXIubGlzdGVuLnBvcnR9IOyeheuLiOuLpC5cbiAgYmFzZVVybD86IHN0cmluZztcblxuICBmYXN0aWZ5PzogT21pdDxGYXN0aWZ5U2VydmVyT3B0aW9ucywgXCJsb2dnZXJcIj47XG5cbiAgbGlzdGVuPzoge1xuICAgIHBvcnQ6IG51bWJlcjtcbiAgICBob3N0Pzogc3RyaW5nO1xuICB9O1xuXG4gIHBsdWdpbnM/OiB7XG4gICAgLyoqIOydkeuLtSDslZXstpUg7ZSM65+s6re47J24IChAZmFzdGlmeS9jb21wcmVzcykgKi9cbiAgICBjb21wcmVzcz86IGJvb2xlYW4gfCBGYXN0aWZ5Q29tcHJlc3NPcHRpb25zO1xuICAgIGNvcnM/OiBib29sZWFuIHwgRmFzdGlmeUNvcnNPcHRpb25zO1xuICAgIGZvcm1ib2R5PzogYm9vbGVhbiB8IEZhc3RpZnlGb3JtYm9keU9wdGlvbnM7XG4gICAgbXVsdGlwYXJ0PzogYm9vbGVhbiB8IEZhc3RpZnlNdWx0aXBhcnRPcHRpb25zO1xuICAgIHFzPzogYm9vbGVhbiB8IFFzUGx1Z2luT3B0aW9ucztcbiAgICBzc2U/OiBib29sZWFuIHwgU3NlUGx1Z2luT3B0aW9ucztcbiAgICBzdGF0aWM/OiBib29sZWFuIHwgRmFzdGlmeVN0YXRpY09wdGlvbnM7XG4gICAgd3M/OiBib29sZWFuIHwgV2Vic29ja2V0UGx1Z2luT3B0aW9ucztcblxuICAgIGN1c3RvbT86IChzZXJ2ZXI6IEZhc3RpZnlJbnN0YW5jZSkgPT4gdm9pZDtcbiAgfTtcblxuICAvKipcbiAgICogYmV0dGVyLWF1dGgg7J247KadIOyEpOyglVxuICAgKiBTb25hbXUg7ZmV7J6l7Jy866GcIGFkZGl0aW9uYWxGaWVsZHPsl5Agc29uYW11VHlwZSDsho3shLEg7LaU6rCAIOqwgOuKpVxuICAgKiBCZXR0ZXJBdXRo7J2YIERCRmllbGRBdHRyaWJ1dGXrpbwg7ZmV7J6l7ZWgIOyImCDsl4bslrTshJwg7Jqw7ISgIHVzZXLrp4wg7KCB7JqpXG4gICAqL1xuICBhdXRoPzogQmV0dGVyQXV0aE9wdGlvbnMgJiB7XG4gICAgdXNlcj86IHtcbiAgICAgIGFkZGl0aW9uYWxGaWVsZHM/OiBSZWNvcmQ8XG4gICAgICAgIHN0cmluZyxcbiAgICAgICAgTm9uTnVsbGFibGU8Tm9uTnVsbGFibGU8QmV0dGVyQXV0aE9wdGlvbnNbXCJ1c2VyXCJdPltcImFkZGl0aW9uYWxGaWVsZHNcIl0+W3N0cmluZ10gJiB7XG4gICAgICAgICAgc29uYW11VHlwZT86IHN0cmluZztcbiAgICAgICAgfVxuICAgICAgPjtcbiAgICB9O1xuICB9O1xuXG4gIC8qKlxuICAgKiBXZWJTb2NrZXQgcnVudGltZSDshKTsoJUuXG4gICAqXG4gICAqIOuLqOydvCDsnbjsiqTthLTsiqTsl5DshJzripQg6riw67O46rCS7Jy866GcIOy2qeu2hO2VmOupsCwg66mA7YuwIOyduOyKpO2EtOyKpC/rjIDqt5zrqqgg7ZmY6rK97JeQ7ISc64qUXG4gICAqIHByZXNlbmNlIHN0b3Jl7JmAIGNsdXN0ZXIgYnVz66W8IOyXrOq4sOyEnCDso7zsnoXtlanri4jri6QuXG4gICAqL1xuICB3ZWJzb2NrZXQ/OiBXZWJTb2NrZXRSdW50aW1lT3B0aW9ucztcblxuICBhcGlDb25maWc6IFNvbmFtdUZhc3RpZnlDb25maWc7XG5cbiAgLyoqXG4gICAqIFN0b3JhZ2Ug65Oc65287J2067KEIOyEpOyglS5cbiAgICogc2F2ZVRvRGlzayhkaXNrTmFtZSwga2V5KSDtmLjstpwg7IucIOuTnOudvOydtOuyhOulvCDrqoXsi5zsoIHsnLzroZwg7KeA7KCV7ZWp64uI64ukLlxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBgYGB0eXBlc2NyaXB0XG4gICAqIGltcG9ydCB7IGRyaXZlcnMgfSBmcm9tIFwic29uYW11L3N0b3JhZ2VcIjtcbiAgICpcbiAgICogc3RvcmFnZToge1xuICAgKiAgIGRyaXZlcnM6IHtcbiAgICogICAgIGZzOiBkcml2ZXJzLmZzKHsgbG9jYXRpb246IFwiLi91cGxvYWRzXCIsIHVybEJ1aWxkZXI6IHsgLi4uIH0gfSksXG4gICAqICAgICBzMzogZHJpdmVycy5zMyh7IGJ1Y2tldDogXCJteS1idWNrZXRcIiwgcmVnaW9uOiBcImFwLW5vcnRoZWFzdC0yXCIsIC4uLiB9KSxcbiAgICogICB9XG4gICAqIH1cbiAgICogYGBgXG4gICAqL1xuICBzdG9yYWdlPzogU3RvcmFnZUNvbmZpZztcblxuICAvKipcbiAgICogQ2FjaGUg7ISk7KCVIChCZW50b0NhY2hlIOq4sOuwmClcbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogYGBgdHlwZXNjcmlwdFxuICAgKiBpbXBvcnQgeyBkcml2ZXJzLCBzdG9yZSB9IGZyb20gXCJzb25hbXUvY2FjaGVcIjtcbiAgICpcbiAgICogY2FjaGU6IHtcbiAgICogICBkZWZhdWx0OiAnbWFpbicsXG4gICAqICAgc3RvcmVzOiB7XG4gICAqICAgICBtYWluOiBzdG9yZSgpXG4gICAqICAgICAgIC51c2VMMUxheWVyKGRyaXZlcnMubWVtb3J5KHsgbWF4U2l6ZTogJzEwMG1iJyB9KSlcbiAgICogICAgICAgLnVzZUwyTGF5ZXIoZHJpdmVycy5yZWRpcyh7IGNvbm5lY3Rpb246IHJlZGlzQ29ubmVjdGlvbiB9KSlcbiAgICogICAgICAgLnVzZUJ1cyhkcml2ZXJzLnJlZGlzQnVzKHsgY29ubmVjdGlvbjogcmVkaXNDb25uZWN0aW9uIH0pKVxuICAgKiAgIH0sXG4gICAqICAgdHRsOiAnMWgnLFxuICAgKiB9XG4gICAqIGBgYFxuICAgKi9cbiAgY2FjaGU/OiBDYWNoZUNvbmZpZztcblxuICBsaWZlY3ljbGU/OiB7XG4gICAgb25TdGFydD86IChzZXJ2ZXI6IEZhc3RpZnlJbnN0YW5jZSkgPT4gUHJvbWlzZTx2b2lkPiB8IHZvaWQ7XG4gICAgb25TaHV0ZG93bj86IChzZXJ2ZXI6IEZhc3RpZnlJbnN0YW5jZSkgPT4gUHJvbWlzZTx2b2lkPiB8IHZvaWQ7XG4gICAgb25FcnJvcj86IChlcnJvcjogRXJyb3IsIHJlcXVlc3Q6IEZhc3RpZnlSZXF1ZXN0LCByZXBseTogRmFzdGlmeVJlcGx5KSA9PiBQcm9taXNlPHZvaWQ+IHwgdm9pZDtcbiAgfTtcbn07XG5cbmV4cG9ydCB0eXBlIFNvbmFtdVRhc2tPcHRpb25zID0ge1xuICAvLyB3b3JrZXLrpbwg7IKs7Jqp7ZWg7KeAIOyXrOu2gCwg6riw67O47KCB7Jy866GcIGRhZW1vbiDrqqjrk5zsl5DshJzrp4wg7IKs7Jqp65CoLlxuICBlbmFibGVXb3JrZXI/OiBib29sZWFuO1xuICB3b3JrZXJPcHRpb25zPzogV29ya2Zsb3dPcHRpb25zO1xuICBjb250ZXh0UHJvdmlkZXI6IChcbiAgICBkZWZhdWx0Q29udGV4dDogUGljazxcbiAgICAgIENvbnRleHQsXG4gICAgICB8IFwidHJhbnNwb3J0XCJcbiAgICAgIHwgXCJyZXBseVwiXG4gICAgICB8IFwicmVxdWVzdFwiXG4gICAgICB8IFwiaGVhZGVyc1wiXG4gICAgICB8IFwiY3JlYXRlU1NFXCJcbiAgICAgIHwgXCJuYWl0ZVN0b3JlXCJcbiAgICAgIHwgXCJsb2NhbGVcIlxuICAgICAgfCBcInVzZXJcIlxuICAgICAgfCBcInNlc3Npb25cIlxuICAgID4sXG4gICkgPT4gQ29udGV4dCB8IFByb21pc2U8Q29udGV4dD47XG4gIHdlYnNvY2tldENvbnRleHRQcm92aWRlcj86IChcbiAgICBkZWZhdWx0Q29udGV4dDogUGljazxcbiAgICAgIFdlYlNvY2tldENvbnRleHQsXG4gICAgICBcInRyYW5zcG9ydFwiIHwgXCJyZXF1ZXN0XCIgfCBcImhlYWRlcnNcIiB8IFwid3NcIiB8IFwibmFpdGVTdG9yZVwiIHwgXCJsb2NhbGVcIiB8IFwidXNlclwiIHwgXCJzZXNzaW9uXCJcbiAgICA+LFxuICAgIHJlcXVlc3Q6IEZhc3RpZnlSZXF1ZXN0LFxuICApID0+IFdlYlNvY2tldENvbnRleHQgfCBQcm9taXNlPFdlYlNvY2tldENvbnRleHQ+O1xufTtcblxuZXhwb3J0IHR5cGUgU29uYW11U1NST3B0aW9ucyA9IHtcbiAgLyoqXG4gICAqIEh5ZHJhdGlvbiDsoITrnrVcbiAgICogLSAnbm9uZSc6IO2VreyDgSDsg4jroZwg66CM642U66eBIChoeWRyYXRpb24gbWlzbWF0Y2gg6rGx7KCVIOyXhuydjCwg6raM7J6lKVxuICAgKiAtICdmdWxsJzogUmVhY3QgaHlkcmF0aW9uIOyLnOuPhCAo7ISc67KEIEhUTUwg7J6s7IKs7JqpLCBtaXNtYXRjaCDso7zsnZgpXG4gICAqIEBkZWZhdWx0ICdub25lJ1xuICAgKi9cbiAgaHlkcmF0aW9uPzogXCJub25lXCIgfCBcImZ1bGxcIjtcbn07XG5cbi8vIE5PVEUoSGF6ZSwgMjUxMjA5KTogY29uZmln7JeQ64qUIFQsIFByb21pc2U8VD4sICgpID0+IFQsICgpID0+IFByb21pc2U8VD7qsIAg66qo65GQIOyYrCDsiJgg7J6I7Ja07JW8IO2VqC5cbmV4cG9ydCBmdW5jdGlvbiBkZWZpbmVDb25maWcoY29uZmlnOiBFeGVjdXRhYmxlPFNvbmFtdUNvbmZpZz4pOiBQcm9taXNlPFNvbmFtdUNvbmZpZz4ge1xuICBpZiAodHlwZW9mIGNvbmZpZyA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShjb25maWcoKSk7XG4gIH1cblxuICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKGNvbmZpZyk7XG59XG5cbi8qKlxuICogc29uYW11LmNvbmZpZy50cyDtjIzsnbzsnYQg66Gc65Oc7ZWp64uI64ukLlxuICog7J20IOyEpOyglSDtjIzsnbzsnYAg7ZmY6rK97JeQIOuUsOudvCDri6Trpbgg6rK966Gc7JeQIOyeiOydhCDsiJgg7J6I7Iq164uI64ukLlxuICogZGlzdOulvCDruYzrk5ztlZjripQg7ZmY6rK97J20652866m0IGRpc3Qg67CU66GcIOyVhOuemOyXkCDsnojsnYQg6rKD7J206rOgKGNsaS13cmFwcGVyLnRz7JeQ7IScIOu5jOuTnCksXG4gKiDqt7jroIfsp4Ag7JWK7J2AIO2ZmOqyveydtOudvOuptCDtlITroZzsoJ3tirgg66Oo7Yq47JeQIOyeiOydhCDqsoPsnoXri4jri6QuXG4gKlxuICog7J20IO2VqOyImOuKlCDsnZjrj4TsoIHsnLzroZwg64uk66W4IOydmOyhtOyEseydmCDsgqzsmqnsnYQg7LWc64yA7ZWcIOuwsOygnO2VmOyYgOyKteuLiOuLpC5cbiAqIOydtOuKlCDsi6Ttlokg7LSI6riw7JeQIOy1nOuMgO2VnCDruaDrpbTqsowg7ISk7KCV7J2EIOydveyWtOyYrCDsiJgg7J6I64+E66GdIO2VmOq4sCDsnITtlajsnoXri4jri6QuXG4gKiDrlLDrnbzshJwg6rK966GcIGNvbmNhdOqzvCBVUkwgc2NoZW1lIOy2lOqwgOuPhCDri6jsiJztlZwg66y47J6Q7Je0IOyhsOyekeycvOuhnCDsspjrpqztlZjsmIDsirXri4jri6QuXG4gKlxuICogQHBhcmFtIHJvb3RQYXRoXG4gKiBAcmV0dXJuc1xuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gbG9hZENvbmZpZyhyb290UGF0aDogc3RyaW5nKTogUHJvbWlzZTxTb25hbXVDb25maWc+IHtcbiAgYXBwbHlDdXJyZW50U25hcHNob3RUb1Byb2Nlc3NFbnYocm9vdFBhdGgpO1xuXG4gIGNvbnN0IHNob3VsZExvYWRTb3VyY2VDb25maWcgPSBwcm9jZXNzLmVudi5IT1QgPT09IFwieWVzXCIgfHwgcHJvY2Vzcy5lbnYuVklURVNUID09PSBcInRydWVcIjtcbiAgY29uc3QgY29uZmlnUGF0aCA9IHNob3VsZExvYWRTb3VyY2VDb25maWdcbiAgICA/IGAke3Jvb3RQYXRofS9zcmMvc29uYW11LmNvbmZpZy50c2BcbiAgICA6IGAke3Jvb3RQYXRofS9kaXN0L3NvbmFtdS5jb25maWcuanNgO1xuXG4gIGlmIChzaG91bGRMb2FkU291cmNlQ29uZmlnKSB7XG4gICAgY29uc3QgeyBlbnN1cmVUc0xvYWRlclJlZ2lzdGVyZWQgfSA9IGF3YWl0IGltcG9ydChcIi4uL2Jpbi90cy1sb2FkZXItcmVnaXN0cmF0aW9uXCIpO1xuICAgIGF3YWl0IGVuc3VyZVRzTG9hZGVyUmVnaXN0ZXJlZChyb290UGF0aCk7XG4gIH1cblxuICBjb25zdCB7IGRlZmF1bHQ6IGNvbmZpZyB9ID0gYXdhaXQgaW1wb3J0KGBmaWxlOi8vJHtjb25maWdQYXRofWApO1xuICByZXR1cm4gY29uZmlnO1xufVxuIl0sIm1hcHBpbmdzIjoiOzs7QUFpU0EsU0FBZ0IsYUFBYSxRQUF5RDtDQUNwRixJQUFJLE9BQU8sV0FBVyxZQUNwQixPQUFPLFFBQVEsUUFBUSxPQUFPLENBQUM7Q0FHakMsT0FBTyxRQUFRLFFBQVEsTUFBTTtBQUMvQjs7Ozs7Ozs7Ozs7Ozs7QUFlQSxlQUFzQixXQUFXLFVBQXlDO0NBQ3hFLGlDQUFpQyxRQUFRO0NBRXpDLE1BQU0seUJBQXlCLFFBQVEsSUFBSSxRQUFRLFNBQVMsUUFBUSxJQUFJLFdBQVc7Q0FDbkYsTUFBTSxhQUFhLHlCQUNmLEdBQUcsU0FBUyx5QkFDWixHQUFHLFNBQVM7Q0FFaEIsSUFBSSx3QkFBd0I7RUFDMUIsTUFBTSxFQUFFLDZCQUE2QixNQUFNLE9BQU87RUFDbEQsTUFBTSx5QkFBeUIsUUFBUTtDQUN6QztDQUVBLE1BQU0sRUFBRSxTQUFTLFdBQVcsTUFBTSxPQUFPLFVBQVU7Q0FDbkQsT0FBTztBQUNUOztVQWxUeUQifQ==
46
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29uZmlnLmpzIiwibmFtZXMiOltdLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9hcGkvY29uZmlnLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IHR5cGUgRmFzdGlmeUNvbXByZXNzT3B0aW9ucyB9IGZyb20gXCJAZmFzdGlmeS9jb21wcmVzc1wiO1xuaW1wb3J0IHsgdHlwZSBGYXN0aWZ5Q29yc09wdGlvbnMgfSBmcm9tIFwiQGZhc3RpZnkvY29yc1wiO1xuaW1wb3J0IHsgdHlwZSBGYXN0aWZ5Rm9ybWJvZHlPcHRpb25zIH0gZnJvbSBcIkBmYXN0aWZ5L2Zvcm1ib2R5XCI7XG5pbXBvcnQgeyB0eXBlIEZhc3RpZnlNdWx0aXBhcnRPcHRpb25zIH0gZnJvbSBcIkBmYXN0aWZ5L211bHRpcGFydFwiO1xuaW1wb3J0IHsgdHlwZSBGYXN0aWZ5U3RhdGljT3B0aW9ucyB9IGZyb20gXCJAZmFzdGlmeS9zdGF0aWNcIjtcbmltcG9ydCB7IHR5cGUgV2Vic29ja2V0UGx1Z2luT3B0aW9ucyB9IGZyb20gXCJAZmFzdGlmeS93ZWJzb2NrZXRcIjtcbmltcG9ydCB7IHR5cGUgQmV0dGVyQXV0aE9wdGlvbnMgfSBmcm9tIFwiYmV0dGVyLWF1dGhcIjtcbmltcG9ydCB7XG4gIHR5cGUgRmFzdGlmeUluc3RhbmNlLFxuICB0eXBlIEZhc3RpZnlSZXBseSxcbiAgdHlwZSBGYXN0aWZ5UmVxdWVzdCxcbiAgdHlwZSBGYXN0aWZ5U2VydmVyT3B0aW9ucyxcbn0gZnJvbSBcImZhc3RpZnlcIjtcbmltcG9ydCB7IHR5cGUgUXNQbHVnaW5PcHRpb25zIH0gZnJvbSBcImZhc3RpZnktcXNcIjtcbmltcG9ydCB7IHR5cGUgU3NlUGx1Z2luT3B0aW9ucyB9IGZyb20gXCJmYXN0aWZ5LXNzZS12Mi9saWIvdHlwZXNcIjtcbmltcG9ydCB7IHR5cGUgS25leCB9IGZyb20gXCJrbmV4XCI7XG5cbmltcG9ydCB7IHR5cGUgQ2FjaGVDb25maWcgfSBmcm9tIFwiLi4vY2FjaGUvdHlwZXNcIjtcbmltcG9ydCB7IHR5cGUgU29uYW11REJDb25maWcgfSBmcm9tIFwiLi4vZGF0YWJhc2UvZGJcIjtcbmltcG9ydCB7IGFwcGx5Q3VycmVudFNuYXBzaG90VG9Qcm9jZXNzRW52IH0gZnJvbSBcIi4uL2VudlwiO1xuaW1wb3J0IHsgdHlwZSBTb25hbXVMb2dnaW5nT3B0aW9ucyB9IGZyb20gXCIuLi9sb2dnZXIvY29uZmlndXJlXCI7XG5pbXBvcnQgeyB0eXBlIFN0b3JhZ2VDb25maWcgfSBmcm9tIFwiLi4vc3RvcmFnZS90eXBlc1wiO1xuaW1wb3J0IHsgdHlwZSBXZWJTb2NrZXRSdW50aW1lT3B0aW9ucyB9IGZyb20gXCIuLi9zdHJlYW0vd3NcIjtcbmltcG9ydCB7IHR5cGUgV29ya2Zsb3dPcHRpb25zIH0gZnJvbSBcIi4uL3Rhc2tzL3dvcmtmbG93LW1hbmFnZXJcIjtcbmltcG9ydCB7IHR5cGUgRXhlY3V0YWJsZSwgdHlwZSBTb25hbXVGYXN0aWZ5Q29uZmlnIH0gZnJvbSBcIi4uL3R5cGVzL3R5cGVzXCI7XG5pbXBvcnQgeyBpc0Z1bmN0aW9uVmFsdWUsIGlzT2JqZWN0VmFsdWUgfSBmcm9tIFwiLi4vdXRpbHMvcnVudGltZS12YWx1ZVwiO1xuaW1wb3J0IHsgdHlwZSBDb250ZXh0LCB0eXBlIFdlYlNvY2tldENvbnRleHQgfSBmcm9tIFwiLi9jb250ZXh0XCI7XG5cbmZ1bmN0aW9uIGlzRXhlY3V0YWJsZUNvbmZpZyhcbiAgdmFsdWU6IEV4ZWN1dGFibGU8U29uYW11Q29uZmlnPixcbik6IHZhbHVlIGlzICgoKSA9PiBTb25hbXVDb25maWcpIHwgKCgpID0+IFByb21pc2U8U29uYW11Q29uZmlnPikge1xuICByZXR1cm4gaXNGdW5jdGlvblZhbHVlKHZhbHVlKTtcbn1cblxuZXhwb3J0IHR5cGUgRGF0YWJhc2VDb25maWcgPSBPbWl0PEtuZXguQ29uZmlnLCBcImNvbm5lY3Rpb25cIj4gJiB7XG4gIGNvbm5lY3Rpb24/OiBLbmV4LlBnQ29ubmVjdGlvbkNvbmZpZztcbn07XG5cbi8qKlxuICogaTE4biDshKTsoJVcbiAqL1xuZXhwb3J0IHR5cGUgU29uYW11STE4bk9wdGlvbnMgPSB7XG4gIC8qKiDquLDrs7ggbG9jYWxlICjtgqQg7KCV7J2YIOq4sOykgCArIOufsO2DgOyehCDquLDrs7jqsJIpICovXG4gIGRlZmF1bHRMb2NhbGU6IHN0cmluZztcbiAgLyoqIOyngOybkO2VmOuKlCBsb2NhbGUg66qp66GdICovXG4gIHN1cHBvcnRlZExvY2FsZXM6IHN0cmluZ1tdO1xufTtcblxuLyoqXG4gKiBEZXYg7ISc67KEIOuCtCBWaXRlc3Qg7IOB7KO8IOyduOyKpO2EtOyKpCDshKTsoJVcbiAqL1xuZXhwb3J0IHR5cGUgU29uYW11RGV2UnVubmVyQ29uZmlnID0ge1xuICAvKiogRGV2UnVubmVyIO2ZnOyEse2ZlCDsl6zrtoAgKOq4sOuzuDogZmFsc2UpICovXG4gIGVuYWJsZWQ6IGJvb2xlYW47XG4gIC8qKiDthYzsiqTtirgg7JeU65Oc7Y+s7J247Yq4IOqyveuhnCDsoJHrkZDsgqwgKOq4sOuzuDogL19fdGVzdF9fKSAqL1xuICByb3V0ZVByZWZpeD86IHN0cmluZztcbiAgLyoqIHZpdGVzdC5jb25maWcudHMg6rK966GcIChhcGktcm9vdCDsg4HrjIDqsr3roZwpICovXG4gIHZpdGVzdENvbmZpZ1BhdGg/OiBzdHJpbmc7XG59O1xuXG4vKipcbiAqIO2FjOyKpO2KuCDshKTsoJVcbiAqIHZpdGVzdCDrs5HroKwg7YWM7Iqk7YyF7J2EIHNvbmFtdS5jb25maWcudHMg7ZWcIOqzs+yXkOyEnCDqtIDrpqztlZjquLAg7JyE7ZWcIOyEpOygleyeheuLiOuLpC5cbiAqL1xuZXhwb3J0IHR5cGUgU29uYW11VGVzdENvbmZpZyA9IHtcbiAgLyoqIOuzkeugrCDthYzsiqTtjIUg7Zmc7ISx7ZmUICjquLDrs7g6IGZhbHNlKSAqL1xuICBwYXJhbGxlbD86IGJvb2xlYW47XG4gIC8qKiDrs5HroKwg7Iuk7ZaJIOybjOy7pCDsiJggKOq4sOuzuDogNCkgKi9cbiAgbWF4V29ya2Vycz86IG51bWJlcjtcbiAgLyoqIERldiDshJzrsoQg64K0IFZpdGVzdCDsg4Hso7wg7J247Iqk7YS07IqkIOyEpOyglSAqL1xuICBkZXZSdW5uZXI/OiBTb25hbXVEZXZSdW5uZXJDb25maWc7XG59O1xuXG5leHBvcnQgdHlwZSBab2RDb21waWxlckFwaU1vZGUgPSBmYWxzZSB8IFwiaml0XCIgfCBcImFvdFwiO1xuZXhwb3J0IHR5cGUgWm9kQ29tcGlsZXJDb25maWcgPVxuICB8IGZhbHNlXG4gIHwge1xuICAgICAgYXBpPzogWm9kQ29tcGlsZXJBcGlNb2RlO1xuICAgIH07XG5leHBvcnQgdHlwZSBOb3JtYWxpemVkWm9kQ29tcGlsZXJQb2xpY3kgPSB7XG4gIGFwaTogWm9kQ29tcGlsZXJBcGlNb2RlO1xuICB0YXJnZXRzOiBSZWNvcmQ8c3RyaW5nLCBuZXZlcj47XG59O1xuXG5leHBvcnQgZnVuY3Rpb24gbm9ybWFsaXplWm9kQ29tcGlsZXJQb2xpY3k8VmFsdWU+KFxuICB2YWx1ZTogVmFsdWUsXG4gIF9zeW5jVGFyZ2V0czogcmVhZG9ubHkgc3RyaW5nW10gPSBbXSxcbik6IE5vcm1hbGl6ZWRab2RDb21waWxlclBvbGljeSB7XG4gIGlmICh2YWx1ZSA9PT0gdW5kZWZpbmVkIHx8IHZhbHVlID09PSBmYWxzZSkge1xuICAgIHJldHVybiB7IGFwaTogZmFsc2UsIHRhcmdldHM6IHt9IH07XG4gIH1cbiAgaWYgKCFpc09iamVjdFZhbHVlKHZhbHVlKSB8fCBBcnJheS5pc0FycmF5KHZhbHVlKSkge1xuICAgIHRocm93IG5ldyBFcnJvcihcInZhbGlkYXRpb24uem9kQ29tcGlsZXIgbXVzdCBiZSBmYWxzZSBvciBhbiBvYmplY3RcIik7XG4gIH1cblxuICBjb25zdCBhcGkgPSBcImFwaVwiIGluIHZhbHVlID8gKHZhbHVlLmFwaSA/PyBmYWxzZSkgOiBmYWxzZTtcbiAgaWYgKGFwaSAhPT0gZmFsc2UgJiYgYXBpICE9PSBcImppdFwiICYmIGFwaSAhPT0gXCJhb3RcIikge1xuICAgIHRocm93IG5ldyBFcnJvcihcInZhbGlkYXRpb24uem9kQ29tcGlsZXIuYXBpIG11c3QgYmUgZmFsc2UsICdqaXQnLCBvciAnYW90J1wiKTtcbiAgfVxuXG4gIGlmIChcInRhcmdldHNcIiBpbiB2YWx1ZSkge1xuICAgIHRocm93IG5ldyBFcnJvcihcInZhbGlkYXRpb24uem9kQ29tcGlsZXIudGFyZ2V0cyBpcyBub3Qgc3VwcG9ydGVkIGluIHRoZSBBUEktb25seSBwaGFzZVwiKTtcbiAgfVxuXG4gIHJldHVybiB7IGFwaSwgdGFyZ2V0czoge30gfTtcbn1cblxuZXhwb3J0IHR5cGUgU29uYW11Q29uZmlnPFRTaW5rSWQgZXh0ZW5kcyBzdHJpbmcgPSBzdHJpbmcsIFRGaWx0ZXJJZCBleHRlbmRzIHN0cmluZyA9IHN0cmluZz4gPSB7XG4gIHByb2plY3ROYW1lPzogc3RyaW5nO1xuXG4gIGFwaToge1xuICAgIGRpcjogc3RyaW5nO1xuICAgIHJvdXRlOiB7XG4gICAgICBwcmVmaXg6IHN0cmluZztcbiAgICB9O1xuICAgIHRpbWV6b25lPzogc3RyaW5nO1xuICB9O1xuXG4gIC8qKlxuICAgKiBpMThuIOyEpOyglVxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBgYGB0eXBlc2NyaXB0XG4gICAqIGkxOG46IHtcbiAgICogICBkZWZhdWx0TG9jYWxlOiAna28nLFxuICAgKiAgIHN1cHBvcnRlZExvY2FsZXM6IFsna28nLCAnZW4nLCAnamEnXSxcbiAgICogfVxuICAgKiBgYGBcbiAgICovXG4gIGkxOG46IFNvbmFtdUkxOG5PcHRpb25zO1xuXG4gIHN5bmM6IHtcbiAgICB0YXJnZXRzOiBzdHJpbmdbXTsgLy8gXCJ3ZWJcIiwgXCJhcHBcIiDrk7FcbiAgfTtcblxuICB2YWxpZGF0aW9uPzoge1xuICAgIHpvZENvbXBpbGVyPzogWm9kQ29tcGlsZXJDb25maWc7XG4gIH07XG5cbiAgZGF0YWJhc2U6IHtcbiAgICAvLyDrjbDsnbTthLDrsqDsnbTsiqQocGfripQgcGcg66qo65OILCBwZ25hdGl2ZeuKlCBwZy1uYXRpdmUg66qo65OI7J2YIOyEpOy5mOqwgCDtlYTsmpTtlanri4jri6QuKVxuICAgIGRhdGFiYXNlPzogXCJwZ1wiIHwgXCJwZ25hdGl2ZVwiO1xuICAgIC8vIOuqqOuToCDtmZjqsr3sl5Ag7KCB7Jqp65CgIOq4sOuzuCBLbmV4IOyYteyFmFxuICAgIGRlZmF1bHRPcHRpb25zPzogRGF0YWJhc2VDb25maWc7XG4gIH07XG5cbiAgbG9nZ2luZz86IGZhbHNlIHwgU29uYW11TG9nZ2luZ09wdGlvbnM8VFNpbmtJZCwgVEZpbHRlcklkPjtcbiAgc2VydmVyOiBTb25hbXVTZXJ2ZXJPcHRpb25zO1xuICB0YXNrcz86IFNvbmFtdVRhc2tPcHRpb25zO1xuXG4gIC8qKlxuICAgKiDthYzsiqTtirgg7ISk7KCVICjrs5HroKwg7YWM7Iqk7YyFIOuTsSlcbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogYGBgdHlwZXNjcmlwdFxuICAgKiB0ZXN0OiB7XG4gICAqICAgcGFyYWxsZWw6IHRydWUsXG4gICAqICAgbWF4V29ya2VyczogNCxcbiAgICogfVxuICAgKiBgYGBcbiAgICovXG4gIHRlc3Q/OiBTb25hbXVUZXN0Q29uZmlnO1xuXG4gIC8qKlxuICAgKiDsmbjrtoAg7JeQ65SU7YSwIOyEpOyglSAoQ0REIOuTseyXkOyEnCDtjIzsnbwg7Y647KeRIOyLnCDsgqzsmqkpXG4gICAqIOuvuOyEpOyglSDsi5wgXCJ2c2NvZGVcIuulvCDquLDrs7jqsJLsnLzroZwg7IKs7Jqp7ZWp64uI64ukLlxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBgYGB0eXBlc2NyaXB0XG4gICAqIGV4dGVybmFsRWRpdG9yOiBcImN1cnNvclwiXG4gICAqIGBgYFxuICAgKi9cbiAgZXh0ZXJuYWxFZGl0b3I/OiBcIlZpc3VhbCBTdHVkaW8gQ29kZVwiIHwgXCJaZWRcIiB8IFwiQ3Vyc29yXCI7XG5cbiAgLyoqXG4gICAqIFNsYWNrIOyKueyduCDshKTsoJUgKFByb2R1Y3Rpb24g66eI7J206re466CI7J207IWY7JqpKVxuICAgKlxuICAgKiBQcm9kdWN0aW9uIERCIOuniOydtOq3uOugiOydtOyFmCDsi5wgU2xhY2vsnYQg7Ya17ZWcIOyKueyduCDtlITroZzshLjsiqTrpbwg7Zmc7ISx7ZmU7ZWp64uI64ukLlxuICAgKiDshKTsoJXsnbQg7JeG7Jy866m0IOq4sOyhtCDrj5nsnpEo67CU66GcIOyLpO2WiSnsnLzroZwg64+Z7J6R7ZWp64uI64ukLlxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBgYGB0eXBlc2NyaXB0XG4gICAqIHNsYWNrQ29uZmlybToge1xuICAgKiAgIHRhcmdldHM6IFtcInByb2R1Y3Rpb25cIl0sXG4gICAqICAgYm90VG9rZW46IHByb2Nlc3MuZW52LlNMQUNLX0JPVF9UT0tFTiA/PyBcIlwiLFxuICAgKiAgIGNoYW5uZWxJZDogcHJvY2Vzcy5lbnYuU0xBQ0tfQ0hBTk5FTF9JRCA/PyBcIlwiLFxuICAgKiB9XG4gICAqIGBgYFxuICAgKi9cbiAgc2xhY2tDb25maXJtPzoge1xuICAgIC8qKiDsirnsnbjsnbQg7ZWE7JqU7ZWcIERCIO2CpCDrqqnroZ0gKOyYiDogW1wicHJvZHVjdGlvblwiXSkgKi9cbiAgICB0YXJnZXRzOiAoa2V5b2YgU29uYW11REJDb25maWcpW107XG4gICAgLyoqIFNsYWNrIEJvdCBUb2tlbiAoeG94Yi0uLi4pICovXG4gICAgYm90VG9rZW46IHN0cmluZztcbiAgICAvKiogU2xhY2sgQ2hhbm5lbCBJRCAoQy4uLikgKi9cbiAgICBjaGFubmVsSWQ6IHN0cmluZztcbiAgfTtcbn07XG5cbmV4cG9ydCB0eXBlIFNvbmFtdVNlcnZlck9wdGlvbnMgPSB7XG4gIC8vIO2UhOuhnOygne2KuCDsmbjrtoDsl5DshJwg7KCR6re87ZWgIOyImCDsnojripQgVVJMLiDquLDrs7jqsJLsnYAge3NlcnZlci5saXN0ZW4uaG9zdH06e3NlcnZlci5saXN0ZW4ucG9ydH0g7J6F64uI64ukLlxuICBiYXNlVXJsPzogc3RyaW5nO1xuXG4gIGZhc3RpZnk/OiBPbWl0PEZhc3RpZnlTZXJ2ZXJPcHRpb25zLCBcImxvZ2dlclwiPjtcblxuICBsaXN0ZW4/OiB7XG4gICAgcG9ydDogbnVtYmVyO1xuICAgIGhvc3Q/OiBzdHJpbmc7XG4gIH07XG5cbiAgcGx1Z2lucz86IHtcbiAgICAvKiog7J2R64u1IOyVley2lSDtlIzrn6zqt7jsnbggKEBmYXN0aWZ5L2NvbXByZXNzKSAqL1xuICAgIGNvbXByZXNzPzogYm9vbGVhbiB8IEZhc3RpZnlDb21wcmVzc09wdGlvbnM7XG4gICAgY29ycz86IGJvb2xlYW4gfCBGYXN0aWZ5Q29yc09wdGlvbnM7XG4gICAgZm9ybWJvZHk/OiBib29sZWFuIHwgRmFzdGlmeUZvcm1ib2R5T3B0aW9ucztcbiAgICBtdWx0aXBhcnQ/OiBib29sZWFuIHwgRmFzdGlmeU11bHRpcGFydE9wdGlvbnM7XG4gICAgcXM/OiBib29sZWFuIHwgUXNQbHVnaW5PcHRpb25zO1xuICAgIHNzZT86IGJvb2xlYW4gfCBTc2VQbHVnaW5PcHRpb25zO1xuICAgIHN0YXRpYz86IGJvb2xlYW4gfCBGYXN0aWZ5U3RhdGljT3B0aW9ucztcbiAgICB3cz86IGJvb2xlYW4gfCBXZWJzb2NrZXRQbHVnaW5PcHRpb25zO1xuXG4gICAgY3VzdG9tPzogKHNlcnZlcjogRmFzdGlmeUluc3RhbmNlKSA9PiB2b2lkO1xuICB9O1xuXG4gIC8qKlxuICAgKiBiZXR0ZXItYXV0aCDsnbjspp0g7ISk7KCVXG4gICAqIFNvbmFtdSDtmZXsnqXsnLzroZwgYWRkaXRpb25hbEZpZWxkc+yXkCBzb25hbXVUeXBlIOyGjeyEsSDstpTqsIAg6rCA64qlXG4gICAqIEJldHRlckF1dGjsnZggREJGaWVsZEF0dHJpYnV0ZeulvCDtmZXsnqXtlaAg7IiYIOyXhuyWtOyEnCDsmrDshKAgdXNlcuunjCDsoIHsmqlcbiAgICovXG4gIGF1dGg/OiBCZXR0ZXJBdXRoT3B0aW9ucyAmIHtcbiAgICB1c2VyPzoge1xuICAgICAgYWRkaXRpb25hbEZpZWxkcz86IFJlY29yZDxcbiAgICAgICAgc3RyaW5nLFxuICAgICAgICBOb25OdWxsYWJsZTxOb25OdWxsYWJsZTxCZXR0ZXJBdXRoT3B0aW9uc1tcInVzZXJcIl0+W1wiYWRkaXRpb25hbEZpZWxkc1wiXT5bc3RyaW5nXSAmIHtcbiAgICAgICAgICBzb25hbXVUeXBlPzogc3RyaW5nO1xuICAgICAgICB9XG4gICAgICA+O1xuICAgIH07XG4gIH07XG5cbiAgLyoqXG4gICAqIFdlYlNvY2tldCBydW50aW1lIOyEpOyglS5cbiAgICpcbiAgICog64uo7J28IOyduOyKpO2EtOyKpOyXkOyEnOuKlCDquLDrs7jqsJLsnLzroZwg7Lap67aE7ZWY66mwLCDrqYDti7Ag7J247Iqk7YS07IqkL+uMgOq3nOuqqCDtmZjqsr3sl5DshJzripRcbiAgICogcHJlc2VuY2Ugc3RvcmXsmYAgY2x1c3RlciBidXPrpbwg7Jes6riw7IScIOyjvOyehe2VqeuLiOuLpC5cbiAgICovXG4gIHdlYnNvY2tldD86IFdlYlNvY2tldFJ1bnRpbWVPcHRpb25zO1xuXG4gIGFwaUNvbmZpZzogU29uYW11RmFzdGlmeUNvbmZpZztcblxuICAvKipcbiAgICogU3RvcmFnZSDrk5zrnbzsnbTrsoQg7ISk7KCVLlxuICAgKiBzYXZlVG9EaXNrKGRpc2tOYW1lLCBrZXkpIO2YuOy2nCDsi5wg65Oc65287J2067KE66W8IOuqheyLnOyggeycvOuhnCDsp4DsoJXtlanri4jri6QuXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIGBgYHR5cGVzY3JpcHRcbiAgICogaW1wb3J0IHsgZHJpdmVycyB9IGZyb20gXCJzb25hbXUvc3RvcmFnZVwiO1xuICAgKlxuICAgKiBzdG9yYWdlOiB7XG4gICAqICAgZHJpdmVyczoge1xuICAgKiAgICAgZnM6IGRyaXZlcnMuZnMoeyBsb2NhdGlvbjogXCIuL3VwbG9hZHNcIiwgdXJsQnVpbGRlcjogeyAuLi4gfSB9KSxcbiAgICogICAgIHMzOiBkcml2ZXJzLnMzKHsgYnVja2V0OiBcIm15LWJ1Y2tldFwiLCByZWdpb246IFwiYXAtbm9ydGhlYXN0LTJcIiwgLi4uIH0pLFxuICAgKiAgIH1cbiAgICogfVxuICAgKiBgYGBcbiAgICovXG4gIHN0b3JhZ2U/OiBTdG9yYWdlQ29uZmlnO1xuXG4gIC8qKlxuICAgKiBDYWNoZSDshKTsoJUgKEJlbnRvQ2FjaGUg6riw67CYKVxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBgYGB0eXBlc2NyaXB0XG4gICAqIGltcG9ydCB7IGRyaXZlcnMsIHN0b3JlIH0gZnJvbSBcInNvbmFtdS9jYWNoZVwiO1xuICAgKlxuICAgKiBjYWNoZToge1xuICAgKiAgIGRlZmF1bHQ6ICdtYWluJyxcbiAgICogICBzdG9yZXM6IHtcbiAgICogICAgIG1haW46IHN0b3JlKClcbiAgICogICAgICAgLnVzZUwxTGF5ZXIoZHJpdmVycy5tZW1vcnkoeyBtYXhTaXplOiAnMTAwbWInIH0pKVxuICAgKiAgICAgICAudXNlTDJMYXllcihkcml2ZXJzLnJlZGlzKHsgY29ubmVjdGlvbjogcmVkaXNDb25uZWN0aW9uIH0pKVxuICAgKiAgICAgICAudXNlQnVzKGRyaXZlcnMucmVkaXNCdXMoeyBjb25uZWN0aW9uOiByZWRpc0Nvbm5lY3Rpb24gfSkpXG4gICAqICAgfSxcbiAgICogICB0dGw6ICcxaCcsXG4gICAqIH1cbiAgICogYGBgXG4gICAqL1xuICBjYWNoZT86IENhY2hlQ29uZmlnO1xuXG4gIGxpZmVjeWNsZT86IHtcbiAgICBvblN0YXJ0PzogKHNlcnZlcjogRmFzdGlmeUluc3RhbmNlKSA9PiBQcm9taXNlPHZvaWQ+IHwgdm9pZDtcbiAgICBvblNodXRkb3duPzogKHNlcnZlcjogRmFzdGlmeUluc3RhbmNlKSA9PiBQcm9taXNlPHZvaWQ+IHwgdm9pZDtcbiAgICBvbkVycm9yPzogKGVycm9yOiBFcnJvciwgcmVxdWVzdDogRmFzdGlmeVJlcXVlc3QsIHJlcGx5OiBGYXN0aWZ5UmVwbHkpID0+IFByb21pc2U8dm9pZD4gfCB2b2lkO1xuICB9O1xufTtcblxuZXhwb3J0IHR5cGUgU29uYW11VGFza09wdGlvbnMgPSB7XG4gIC8vIHdvcmtlcuulvCDsgqzsmqntlaDsp4Ag7Jes67aALCDquLDrs7jsoIHsnLzroZwgZGFlbW9uIOuqqOuTnOyXkOyEnOunjCDsgqzsmqnrkKguXG4gIGVuYWJsZVdvcmtlcj86IGJvb2xlYW47XG4gIHdvcmtlck9wdGlvbnM/OiBXb3JrZmxvd09wdGlvbnM7XG4gIGNvbnRleHRQcm92aWRlcjogKFxuICAgIGRlZmF1bHRDb250ZXh0OiBQaWNrPFxuICAgICAgQ29udGV4dCxcbiAgICAgIHwgXCJ0cmFuc3BvcnRcIlxuICAgICAgfCBcInJlcGx5XCJcbiAgICAgIHwgXCJyZXF1ZXN0XCJcbiAgICAgIHwgXCJoZWFkZXJzXCJcbiAgICAgIHwgXCJjcmVhdGVTU0VcIlxuICAgICAgfCBcIm5haXRlU3RvcmVcIlxuICAgICAgfCBcImxvY2FsZVwiXG4gICAgICB8IFwidXNlclwiXG4gICAgICB8IFwic2Vzc2lvblwiXG4gICAgPixcbiAgKSA9PiBDb250ZXh0IHwgUHJvbWlzZTxDb250ZXh0PjtcbiAgd2Vic29ja2V0Q29udGV4dFByb3ZpZGVyPzogKFxuICAgIGRlZmF1bHRDb250ZXh0OiBQaWNrPFxuICAgICAgV2ViU29ja2V0Q29udGV4dCxcbiAgICAgIFwidHJhbnNwb3J0XCIgfCBcInJlcXVlc3RcIiB8IFwiaGVhZGVyc1wiIHwgXCJ3c1wiIHwgXCJuYWl0ZVN0b3JlXCIgfCBcImxvY2FsZVwiIHwgXCJ1c2VyXCIgfCBcInNlc3Npb25cIlxuICAgID4sXG4gICAgcmVxdWVzdDogRmFzdGlmeVJlcXVlc3QsXG4gICkgPT4gV2ViU29ja2V0Q29udGV4dCB8IFByb21pc2U8V2ViU29ja2V0Q29udGV4dD47XG59O1xuXG5leHBvcnQgdHlwZSBTb25hbXVTU1JPcHRpb25zID0ge1xuICAvKipcbiAgICogSHlkcmF0aW9uIOyghOuetVxuICAgKiAtICdub25lJzog7ZWt7IOBIOyDiOuhnCDroIzrjZTrp4EgKGh5ZHJhdGlvbiBtaXNtYXRjaCDqsbHsoJUg7JeG7J2MLCDqtozsnqUpXG4gICAqIC0gJ2Z1bGwnOiBSZWFjdCBoeWRyYXRpb24g7Iuc64+EICjshJzrsoQgSFRNTCDsnqzsgqzsmqksIG1pc21hdGNoIOyjvOydmClcbiAgICogQGRlZmF1bHQgJ25vbmUnXG4gICAqL1xuICBoeWRyYXRpb24/OiBcIm5vbmVcIiB8IFwiZnVsbFwiO1xufTtcblxuLy8gTk9URShIYXplLCAyNTEyMDkpOiBjb25maWfsl5DripQgVCwgUHJvbWlzZTxUPiwgKCkgPT4gVCwgKCkgPT4gUHJvbWlzZTxUPuqwgCDrqqjrkZAg7JisIOyImCDsnojslrTslbwg7ZWoLlxuZXhwb3J0IGZ1bmN0aW9uIGRlZmluZUNvbmZpZyhjb25maWc6IEV4ZWN1dGFibGU8U29uYW11Q29uZmlnPik6IFByb21pc2U8U29uYW11Q29uZmlnPiB7XG4gIGlmIChpc0V4ZWN1dGFibGVDb25maWcoY29uZmlnKSkge1xuICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoY29uZmlnKCkpO1xuICB9XG5cbiAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShjb25maWcpO1xufVxuXG4vKipcbiAqIHNvbmFtdS5jb25maWcudHMg7YyM7J287J2EIOuhnOuTnO2VqeuLiOuLpC5cbiAqIOydtCDshKTsoJUg7YyM7J287J2AIO2ZmOqyveyXkCDrlLDrnbwg64uk66W4IOqyveuhnOyXkCDsnojsnYQg7IiYIOyeiOyKteuLiOuLpC5cbiAqIGRpc3Trpbwg67mM65Oc7ZWY64qUIO2ZmOqyveydtOudvOuptCBkaXN0IOuwlOuhnCDslYTrnpjsl5Ag7J6I7J2EIOqyg+ydtOqzoChjbGktd3JhcHBlci50c+yXkOyEnCDruYzrk5wpLFxuICog6re466CH7KeAIOyViuydgCDtmZjqsr3snbTrnbzrqbQg7ZSE66Gc7KCd7Yq4IOujqO2KuOyXkCDsnojsnYQg6rKD7J6F64uI64ukLlxuICpcbiAqIOydtCDtlajsiJjripQg7J2Y64+E7KCB7Jy866GcIOuLpOuluCDsnZjsobTshLHsnZgg7IKs7Jqp7J2EIOy1nOuMgO2VnCDrsLDsoJztlZjsmIDsirXri4jri6QuXG4gKiDsnbTripQg7Iuk7ZaJIOy0iOq4sOyXkCDstZzrjIDtlZwg67mg66W06rKMIOyEpOygleydhCDsnb3slrTsmKwg7IiYIOyeiOuPhOuhnSDtlZjquLAg7JyE7ZWo7J6F64uI64ukLlxuICog65Sw65287IScIOqyveuhnCBjb25jYXTqs7wgVVJMIHNjaGVtZSDstpTqsIDrj4Qg64uo7Iic7ZWcIOusuOyekOyXtCDsobDsnpHsnLzroZwg7LKY66as7ZWY7JiA7Iq164uI64ukLlxuICpcbiAqIEBwYXJhbSByb290UGF0aFxuICogQHJldHVybnNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDb25maWdMb2FkZXJEZXBlbmRlbmNpZXMge1xuICBlbnN1cmVUc0xvYWRlclJlZ2lzdGVyZWQocm9vdFBhdGg6IHN0cmluZyk6IFByb21pc2U8dm9pZD47XG59XG5cbmNvbnN0IGRlZmF1bHRDb25maWdMb2FkZXJEZXBlbmRlbmNpZXM6IENvbmZpZ0xvYWRlckRlcGVuZGVuY2llcyA9IHtcbiAgYXN5bmMgZW5zdXJlVHNMb2FkZXJSZWdpc3RlcmVkKHJvb3RQYXRoKSB7XG4gICAgY29uc3QgcmVnaXN0cmF0aW9uID0gYXdhaXQgaW1wb3J0KFwiLi4vYmluL3RzLWxvYWRlci1yZWdpc3RyYXRpb25cIik7XG4gICAgYXdhaXQgcmVnaXN0cmF0aW9uLmVuc3VyZVRzTG9hZGVyUmVnaXN0ZXJlZChyb290UGF0aCk7XG4gIH0sXG59O1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gbG9hZENvbmZpZyhcbiAgcm9vdFBhdGg6IHN0cmluZyxcbiAgZGVwZW5kZW5jaWVzOiBDb25maWdMb2FkZXJEZXBlbmRlbmNpZXMgPSBkZWZhdWx0Q29uZmlnTG9hZGVyRGVwZW5kZW5jaWVzLFxuKTogUHJvbWlzZTxTb25hbXVDb25maWc+IHtcbiAgYXBwbHlDdXJyZW50U25hcHNob3RUb1Byb2Nlc3NFbnYocm9vdFBhdGgpO1xuXG4gIGNvbnN0IHNob3VsZExvYWRTb3VyY2VDb25maWcgPSBwcm9jZXNzLmVudi5IT1QgPT09IFwieWVzXCIgfHwgcHJvY2Vzcy5lbnYuVklURVNUID09PSBcInRydWVcIjtcbiAgY29uc3QgY29uZmlnUGF0aCA9IHNob3VsZExvYWRTb3VyY2VDb25maWdcbiAgICA/IGAke3Jvb3RQYXRofS9zcmMvc29uYW11LmNvbmZpZy50c2BcbiAgICA6IGAke3Jvb3RQYXRofS9kaXN0L3NvbmFtdS5jb25maWcuanNgO1xuXG4gIGlmIChzaG91bGRMb2FkU291cmNlQ29uZmlnKSB7XG4gICAgYXdhaXQgZGVwZW5kZW5jaWVzLmVuc3VyZVRzTG9hZGVyUmVnaXN0ZXJlZChyb290UGF0aCk7XG4gIH1cblxuICBjb25zdCB7IGRlZmF1bHQ6IGNvbmZpZyB9ID0gYXdhaXQgaW1wb3J0KGBmaWxlOi8vJHtjb25maWdQYXRofWApO1xuICByZXR1cm4gY29uZmlnO1xufVxuIl0sIm1hcHBpbmdzIjoiOzs7O0FBNEJBLFNBQVMsbUJBQ1AsT0FDK0Q7Q0FDL0QsT0FBTyxnQkFBZ0IsS0FBSztBQUM5QjtBQW9EQSxTQUFnQiwyQkFDZCxPQUNBLGVBQWtDLENBQUMsR0FDTjtDQUM3QixJQUFJLFVBQVUsVUFBYSxVQUFVLE9BQ25DLE9BQU87RUFBRSxLQUFLO0VBQU8sU0FBUyxDQUFDO0NBQUU7Q0FFbkMsSUFBSSxDQUFDLGNBQWMsS0FBSyxLQUFLLE1BQU0sUUFBUSxLQUFLLEdBQzlDLE1BQU0sSUFBSSxNQUFNLG1EQUFtRDtDQUdyRSxNQUFNLE1BQU0sU0FBUyxRQUFTLE1BQU0sT0FBTyxRQUFTO0NBQ3BELElBQUksUUFBUSxTQUFTLFFBQVEsU0FBUyxRQUFRLE9BQzVDLE1BQU0sSUFBSSxNQUFNLDJEQUEyRDtDQUc3RSxJQUFJLGFBQWEsT0FDZixNQUFNLElBQUksTUFBTSx1RUFBdUU7Q0FHekYsT0FBTztFQUFFO0VBQUssU0FBUyxDQUFDO0NBQUU7QUFDNUI7QUFxT0EsU0FBZ0IsYUFBYSxRQUF5RDtDQUNwRixJQUFJLG1CQUFtQixNQUFNLEdBQzNCLE9BQU8sUUFBUSxRQUFRLE9BQU8sQ0FBQztDQUdqQyxPQUFPLFFBQVEsUUFBUSxNQUFNO0FBQy9CO0FBMEJBLGVBQXNCLFdBQ3BCLFVBQ0EsZUFBeUMsaUNBQ2xCO0NBQ3ZCLGlDQUFpQyxRQUFRO0NBRXpDLE1BQU0seUJBQXlCLFFBQVEsSUFBSSxRQUFRLFNBQVMsUUFBUSxJQUFJLFdBQVc7Q0FDbkYsTUFBTSxhQUFhLHlCQUNmLEdBQUcsU0FBUyx5QkFDWixHQUFHLFNBQVM7Q0FFaEIsSUFBSSx3QkFDRixNQUFNLGFBQWEseUJBQXlCLFFBQVE7Q0FHdEQsTUFBTSxFQUFFLFNBQVMsV0FBVyxNQUFNLE9BQU8sVUFBVTtDQUNuRCxPQUFPO0FBQ1Q7OztVQTVXeUQ7b0JBTWM7Q0E4VWpFLGtDQUE0RCxFQUNoRSxNQUFNLHlCQUF5QixVQUFVO0VBRXZDLE9BQU0sTUFEcUIsT0FBTyxvQ0FDNUIsQ0FBYSx5QkFBeUIsUUFBUTtDQUN0RCxFQUNGIn0=
@@ -7,7 +7,7 @@ import { type NaiteStore } from "../naite/naite";
7
7
  import { type BufferedFile } from "../storage/buffered-file";
8
8
  import { type UploadedFile } from "../storage/uploaded-file";
9
9
  import { type createSSEFactory } from "../stream/sse";
10
- import { type WebSocketConnection, type WebSocketEventMap } from "../stream/ws";
10
+ import { type WebSocketConnection } from "../stream/ws";
11
11
  export interface ContextExtend {
12
12
  }
13
13
  type BaseContext = {
@@ -30,7 +30,7 @@ export type Context = BaseContext & {
30
30
  /** stream 모드에서 업로드된 파일 */
31
31
  uploadedFiles?: UploadedFile[];
32
32
  } & ContextExtend;
33
- export type WebSocketContext<TOut extends WebSocketEventMap = WebSocketEventMap, TIn extends WebSocketEventMap = WebSocketEventMap> = BaseContext & {
33
+ export type WebSocketContext<TOut extends object = object, TIn extends object = object> = BaseContext & {
34
34
  transport: "ws";
35
35
  ws: WebSocketConnection<TOut, TIn>;
36
36
  } & ContextExtend;
@@ -1 +1 @@
1
- {"version":3,"file":"context.d.ts","sourceRoot":"","sources":["../../src/api/context.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,mBAAmB,EACxB,KAAK,eAAe,EACpB,KAAK,MAAM,EACX,KAAK,cAAc,EACpB,MAAM,MAAM,CAAC;AAEd,OAAO,EAAE,KAAK,OAAO,EAAE,KAAK,IAAI,EAAE,MAAM,aAAa,CAAC;AACtD,OAAO,EAAE,KAAK,YAAY,EAAE,KAAK,cAAc,EAAE,MAAM,SAAS,CAAC;AACjE,OAAO,EAAE,KAAK,qBAAqB,EAAE,MAAM,qBAAqB,CAAC;AACjE,OAAO,EAAE,KAAK,SAAS,EAAE,MAAM,KAAK,CAAC;AAErC,OAAO,EAAE,KAAK,UAAU,EAAE,MAAM,gBAAgB,CAAC;AACjD,OAAO,EAAE,KAAK,YAAY,EAAE,MAAM,0BAA0B,CAAC;AAC7D,OAAO,EAAE,KAAK,YAAY,EAAE,MAAM,0BAA0B,CAAC;AAC7D,OAAO,EAAE,KAAK,gBAAgB,EAAE,MAAM,eAAe,CAAC;AACtD,OAAO,EAAE,KAAK,mBAAmB,EAAE,KAAK,iBAAiB,EAAE,MAAM,cAAc,CAAC;AAGhF,MAAM,WAAW,aAAa;CAAG;AACjC,KAAK,WAAW,GAAG;IACjB,OAAO,EAAE,cAAc,CAAC;IACxB,OAAO,EAAE,mBAAmB,CAAC;IAC7B,UAAU,EAAE,UAAU,CAAC;IACvB,oBAAoB;IACpB,MAAM,EAAE,MAAM,CAAC;IACf,+BAA+B;IAC/B,IAAI,EAAE,IAAI,GAAG,IAAI,CAAC;IAClB,4BAA4B;IAC5B,OAAO,EAAE,OAAO,GAAG,IAAI,CAAC;CACzB,CAAC;AAEF,MAAM,MAAM,OAAO,GAAG,WAAW,GAAG;IAClC,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,YAAY,CAAC,MAAM,EAAE,eAAe,EAAE,cAAc,EAAE,qBAAqB,CAAC,CAAC;IACpF,SAAS,EAAE,CAAC,CAAC,SAAS,SAAS,EAAE,MAAM,EAAE,CAAC,KAAK,UAAU,CAAC,OAAO,gBAAgB,CAAC,CAAC,CAAC,CAAC,CAAC;IACtF,0BAA0B;IAC1B,aAAa,CAAC,EAAE,YAAY,EAAE,CAAC;IAC/B,0BAA0B;IAC1B,aAAa,CAAC,EAAE,YAAY,EAAE,CAAC;CAChC,GAAG,aAAa,CAAC;AAElB,MAAM,MAAM,gBAAgB,CAC1B,IAAI,SAAS,iBAAiB,GAAG,iBAAiB,EAClD,GAAG,SAAS,iBAAiB,GAAG,iBAAiB,IAC/C,WAAW,GAAG;IAChB,SAAS,EAAE,IAAI,CAAC;IAChB,EAAE,EAAE,mBAAmB,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;CACpC,GAAG,aAAa,CAAC;AAElB,MAAM,MAAM,cAAc,GAAG,OAAO,GAAG,gBAAgB,CAAC"}
1
+ {"version":3,"file":"context.d.ts","sourceRoot":"","sources":["../../src/api/context.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,mBAAmB,EACxB,KAAK,eAAe,EACpB,KAAK,MAAM,EACX,KAAK,cAAc,EACpB,MAAM,MAAM,CAAC;AAEd,OAAO,EAAE,KAAK,OAAO,EAAE,KAAK,IAAI,EAAE,MAAM,aAAa,CAAC;AACtD,OAAO,EAAE,KAAK,YAAY,EAAE,KAAK,cAAc,EAAE,MAAM,SAAS,CAAC;AACjE,OAAO,EAAE,KAAK,qBAAqB,EAAE,MAAM,qBAAqB,CAAC;AACjE,OAAO,EAAE,KAAK,SAAS,EAAE,MAAM,KAAK,CAAC;AAErC,OAAO,EAAE,KAAK,UAAU,EAAE,MAAM,gBAAgB,CAAC;AACjD,OAAO,EAAE,KAAK,YAAY,EAAE,MAAM,0BAA0B,CAAC;AAC7D,OAAO,EAAE,KAAK,YAAY,EAAE,MAAM,0BAA0B,CAAC;AAC7D,OAAO,EAAE,KAAK,gBAAgB,EAAE,MAAM,eAAe,CAAC;AACtD,OAAO,EAAE,KAAK,mBAAmB,EAAE,MAAM,cAAc,CAAC;AAGxD,MAAM,WAAW,aAAa;CAAG;AACjC,KAAK,WAAW,GAAG;IACjB,OAAO,EAAE,cAAc,CAAC;IACxB,OAAO,EAAE,mBAAmB,CAAC;IAC7B,UAAU,EAAE,UAAU,CAAC;IACvB,oBAAoB;IACpB,MAAM,EAAE,MAAM,CAAC;IACf,+BAA+B;IAC/B,IAAI,EAAE,IAAI,GAAG,IAAI,CAAC;IAClB,4BAA4B;IAC5B,OAAO,EAAE,OAAO,GAAG,IAAI,CAAC;CACzB,CAAC;AAEF,MAAM,MAAM,OAAO,GAAG,WAAW,GAAG;IAClC,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,YAAY,CAAC,MAAM,EAAE,eAAe,EAAE,cAAc,EAAE,qBAAqB,CAAC,CAAC;IACpF,SAAS,EAAE,CAAC,CAAC,SAAS,SAAS,EAAE,MAAM,EAAE,CAAC,KAAK,UAAU,CAAC,OAAO,gBAAgB,CAAC,CAAC,CAAC,CAAC,CAAC;IACtF,0BAA0B;IAC1B,aAAa,CAAC,EAAE,YAAY,EAAE,CAAC;IAC/B,0BAA0B;IAC1B,aAAa,CAAC,EAAE,YAAY,EAAE,CAAC;CAChC,GAAG,aAAa,CAAC;AAElB,MAAM,MAAM,gBAAgB,CAC1B,IAAI,SAAS,MAAM,GAAG,MAAM,EAC5B,GAAG,SAAS,MAAM,GAAG,MAAM,IACzB,WAAW,GAAG;IAChB,SAAS,EAAE,IAAI,CAAC;IAChB,EAAE,EAAE,mBAAmB,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;CACpC,GAAG,aAAa,CAAC;AAElB,MAAM,MAAM,cAAc,GAAG,OAAO,GAAG,gBAAgB,CAAC"}
@@ -5,4 +5,4 @@ var init_context = __esmMin((() => {}));
5
5
  init_context();
6
6
  export { init_context };
7
7
 
8
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29udGV4dC5qcyIsIm5hbWVzIjpbXSwic291cmNlcyI6WyIuLi8uLi9zcmMvYXBpL2NvbnRleHQudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgdHlwZSBJbmNvbWluZ0h0dHBIZWFkZXJzLFxuICB0eXBlIEluY29taW5nTWVzc2FnZSxcbiAgdHlwZSBTZXJ2ZXIsXG4gIHR5cGUgU2VydmVyUmVzcG9uc2UsXG59IGZyb20gXCJodHRwXCI7XG5cbmltcG9ydCB7IHR5cGUgU2Vzc2lvbiwgdHlwZSBVc2VyIH0gZnJvbSBcImJldHRlci1hdXRoXCI7XG5pbXBvcnQgeyB0eXBlIEZhc3RpZnlSZXBseSwgdHlwZSBGYXN0aWZ5UmVxdWVzdCB9IGZyb20gXCJmYXN0aWZ5XCI7XG5pbXBvcnQgeyB0eXBlIFJvdXRlR2VuZXJpY0ludGVyZmFjZSB9IGZyb20gXCJmYXN0aWZ5L3R5cGVzL3JvdXRlXCI7XG5pbXBvcnQgeyB0eXBlIFpvZE9iamVjdCB9IGZyb20gXCJ6b2RcIjtcblxuaW1wb3J0IHsgdHlwZSBOYWl0ZVN0b3JlIH0gZnJvbSBcIi4uL25haXRlL25haXRlXCI7XG5pbXBvcnQgeyB0eXBlIEJ1ZmZlcmVkRmlsZSB9IGZyb20gXCIuLi9zdG9yYWdlL2J1ZmZlcmVkLWZpbGVcIjtcbmltcG9ydCB7IHR5cGUgVXBsb2FkZWRGaWxlIH0gZnJvbSBcIi4uL3N0b3JhZ2UvdXBsb2FkZWQtZmlsZVwiO1xuaW1wb3J0IHsgdHlwZSBjcmVhdGVTU0VGYWN0b3J5IH0gZnJvbSBcIi4uL3N0cmVhbS9zc2VcIjtcbmltcG9ydCB7IHR5cGUgV2ViU29ja2V0Q29ubmVjdGlvbiwgdHlwZSBXZWJTb2NrZXRFdmVudE1hcCB9IGZyb20gXCIuLi9zdHJlYW0vd3NcIjtcblxuLy8gb3hsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1lbXB0eS1pbnRlcmZhY2UgLS0gQ29udGV4dCDtmZXsnqUg7YOA7J6FXG5leHBvcnQgaW50ZXJmYWNlIENvbnRleHRFeHRlbmQge31cbnR5cGUgQmFzZUNvbnRleHQgPSB7XG4gIHJlcXVlc3Q6IEZhc3RpZnlSZXF1ZXN0O1xuICBoZWFkZXJzOiBJbmNvbWluZ0h0dHBIZWFkZXJzO1xuICBuYWl0ZVN0b3JlOiBOYWl0ZVN0b3JlO1xuICAvKiog7ZiE7J6sIOyalOyyreydmCBsb2NhbGUgKi9cbiAgbG9jYWxlOiBzdHJpbmc7XG4gIC8qKiDtmITsnqwg66Gc6re47J247ZWcIOyCrOyaqeyekCAobnVsbOydtOuptCDrr7jsnbjspp0pICovXG4gIHVzZXI6IFVzZXIgfCBudWxsO1xuICAvKiog7ZiE7J6sIOyEuOyFmCDsoJXrs7QgKG51bGzsnbTrqbQg66+47J247KadKSAqL1xuICBzZXNzaW9uOiBTZXNzaW9uIHwgbnVsbDtcbn07XG5cbmV4cG9ydCB0eXBlIENvbnRleHQgPSBCYXNlQ29udGV4dCAmIHtcbiAgdHJhbnNwb3J0OiBcImh0dHBcIjtcbiAgcmVwbHk6IEZhc3RpZnlSZXBseTxTZXJ2ZXIsIEluY29taW5nTWVzc2FnZSwgU2VydmVyUmVzcG9uc2UsIFJvdXRlR2VuZXJpY0ludGVyZmFjZT47XG4gIGNyZWF0ZVNTRTogPFQgZXh0ZW5kcyBab2RPYmplY3Q+KGV2ZW50czogVCkgPT4gUmV0dXJuVHlwZTx0eXBlb2YgY3JlYXRlU1NFRmFjdG9yeTxUPj47XG4gIC8qKiBidWZmZXIg66qo65Oc7JeQ7IScIOyXheuhnOuTnOuQnCDtjIzsnbwgKi9cbiAgYnVmZmVyZWRGaWxlcz86IEJ1ZmZlcmVkRmlsZVtdO1xuICAvKiogc3RyZWFtIOuqqOuTnOyXkOyEnCDsl4XroZzrk5zrkJwg7YyM7J28ICovXG4gIHVwbG9hZGVkRmlsZXM/OiBVcGxvYWRlZEZpbGVbXTtcbn0gJiBDb250ZXh0RXh0ZW5kO1xuXG5leHBvcnQgdHlwZSBXZWJTb2NrZXRDb250ZXh0PFxuICBUT3V0IGV4dGVuZHMgV2ViU29ja2V0RXZlbnRNYXAgPSBXZWJTb2NrZXRFdmVudE1hcCxcbiAgVEluIGV4dGVuZHMgV2ViU29ja2V0RXZlbnRNYXAgPSBXZWJTb2NrZXRFdmVudE1hcCxcbj4gPSBCYXNlQ29udGV4dCAmIHtcbiAgdHJhbnNwb3J0OiBcIndzXCI7XG4gIHdzOiBXZWJTb2NrZXRDb25uZWN0aW9uPFRPdXQsIFRJbj47XG59ICYgQ29udGV4dEV4dGVuZDtcblxuZXhwb3J0IHR5cGUgUnVudGltZUNvbnRleHQgPSBDb250ZXh0IHwgV2ViU29ja2V0Q29udGV4dDtcbiJdLCJtYXBwaW5ncyI6IiJ9
8
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29udGV4dC5qcyIsIm5hbWVzIjpbXSwic291cmNlcyI6WyIuLi8uLi9zcmMvYXBpL2NvbnRleHQudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgdHlwZSBJbmNvbWluZ0h0dHBIZWFkZXJzLFxuICB0eXBlIEluY29taW5nTWVzc2FnZSxcbiAgdHlwZSBTZXJ2ZXIsXG4gIHR5cGUgU2VydmVyUmVzcG9uc2UsXG59IGZyb20gXCJodHRwXCI7XG5cbmltcG9ydCB7IHR5cGUgU2Vzc2lvbiwgdHlwZSBVc2VyIH0gZnJvbSBcImJldHRlci1hdXRoXCI7XG5pbXBvcnQgeyB0eXBlIEZhc3RpZnlSZXBseSwgdHlwZSBGYXN0aWZ5UmVxdWVzdCB9IGZyb20gXCJmYXN0aWZ5XCI7XG5pbXBvcnQgeyB0eXBlIFJvdXRlR2VuZXJpY0ludGVyZmFjZSB9IGZyb20gXCJmYXN0aWZ5L3R5cGVzL3JvdXRlXCI7XG5pbXBvcnQgeyB0eXBlIFpvZE9iamVjdCB9IGZyb20gXCJ6b2RcIjtcblxuaW1wb3J0IHsgdHlwZSBOYWl0ZVN0b3JlIH0gZnJvbSBcIi4uL25haXRlL25haXRlXCI7XG5pbXBvcnQgeyB0eXBlIEJ1ZmZlcmVkRmlsZSB9IGZyb20gXCIuLi9zdG9yYWdlL2J1ZmZlcmVkLWZpbGVcIjtcbmltcG9ydCB7IHR5cGUgVXBsb2FkZWRGaWxlIH0gZnJvbSBcIi4uL3N0b3JhZ2UvdXBsb2FkZWQtZmlsZVwiO1xuaW1wb3J0IHsgdHlwZSBjcmVhdGVTU0VGYWN0b3J5IH0gZnJvbSBcIi4uL3N0cmVhbS9zc2VcIjtcbmltcG9ydCB7IHR5cGUgV2ViU29ja2V0Q29ubmVjdGlvbiB9IGZyb20gXCIuLi9zdHJlYW0vd3NcIjtcblxuLy8gb3hsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1lbXB0eS1pbnRlcmZhY2UgLS0gQ29udGV4dCDtmZXsnqUg7YOA7J6FXG5leHBvcnQgaW50ZXJmYWNlIENvbnRleHRFeHRlbmQge31cbnR5cGUgQmFzZUNvbnRleHQgPSB7XG4gIHJlcXVlc3Q6IEZhc3RpZnlSZXF1ZXN0O1xuICBoZWFkZXJzOiBJbmNvbWluZ0h0dHBIZWFkZXJzO1xuICBuYWl0ZVN0b3JlOiBOYWl0ZVN0b3JlO1xuICAvKiog7ZiE7J6sIOyalOyyreydmCBsb2NhbGUgKi9cbiAgbG9jYWxlOiBzdHJpbmc7XG4gIC8qKiDtmITsnqwg66Gc6re47J247ZWcIOyCrOyaqeyekCAobnVsbOydtOuptCDrr7jsnbjspp0pICovXG4gIHVzZXI6IFVzZXIgfCBudWxsO1xuICAvKiog7ZiE7J6sIOyEuOyFmCDsoJXrs7QgKG51bGzsnbTrqbQg66+47J247KadKSAqL1xuICBzZXNzaW9uOiBTZXNzaW9uIHwgbnVsbDtcbn07XG5cbmV4cG9ydCB0eXBlIENvbnRleHQgPSBCYXNlQ29udGV4dCAmIHtcbiAgdHJhbnNwb3J0OiBcImh0dHBcIjtcbiAgcmVwbHk6IEZhc3RpZnlSZXBseTxTZXJ2ZXIsIEluY29taW5nTWVzc2FnZSwgU2VydmVyUmVzcG9uc2UsIFJvdXRlR2VuZXJpY0ludGVyZmFjZT47XG4gIGNyZWF0ZVNTRTogPFQgZXh0ZW5kcyBab2RPYmplY3Q+KGV2ZW50czogVCkgPT4gUmV0dXJuVHlwZTx0eXBlb2YgY3JlYXRlU1NFRmFjdG9yeTxUPj47XG4gIC8qKiBidWZmZXIg66qo65Oc7JeQ7IScIOyXheuhnOuTnOuQnCDtjIzsnbwgKi9cbiAgYnVmZmVyZWRGaWxlcz86IEJ1ZmZlcmVkRmlsZVtdO1xuICAvKiogc3RyZWFtIOuqqOuTnOyXkOyEnCDsl4XroZzrk5zrkJwg7YyM7J28ICovXG4gIHVwbG9hZGVkRmlsZXM/OiBVcGxvYWRlZEZpbGVbXTtcbn0gJiBDb250ZXh0RXh0ZW5kO1xuXG5leHBvcnQgdHlwZSBXZWJTb2NrZXRDb250ZXh0PFxuICBUT3V0IGV4dGVuZHMgb2JqZWN0ID0gb2JqZWN0LFxuICBUSW4gZXh0ZW5kcyBvYmplY3QgPSBvYmplY3QsXG4+ID0gQmFzZUNvbnRleHQgJiB7XG4gIHRyYW5zcG9ydDogXCJ3c1wiO1xuICB3czogV2ViU29ja2V0Q29ubmVjdGlvbjxUT3V0LCBUSW4+O1xufSAmIENvbnRleHRFeHRlbmQ7XG5cbmV4cG9ydCB0eXBlIFJ1bnRpbWVDb250ZXh0ID0gQ29udGV4dCB8IFdlYlNvY2tldENvbnRleHQ7XG4iXSwibWFwcGluZ3MiOiIifQ==
@@ -1 +1 @@
1
- {"version":3,"file":"decorators.d.ts","sourceRoot":"","sources":["../../src/api/decorators.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"decorators.d.ts","sourceRoot":"","sources":["../../src/api/decorators.ts"],"names":[],"mappings":"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"}
@@ -12,9 +12,13 @@ import { isEqual } from "radashi";
12
12
  import assert from "assert";
13
13
  //#region src/api/decorators.ts
14
14
  function checkSingleDecorator(target, propertyKey, decoratorType) {
15
- const method = target[propertyKey];
16
- if (method?.__decoratorType && method?.__decoratorType !== decoratorType) throw new Error(`@${decoratorType.description ?? String(decoratorType)} decorator can only be used once on ${target.constructor.name}.${propertyKey}. You can use only one of @api, @stream, @websocket, or @upload decorator on the same method.`);
17
- else method.__decoratorType = decoratorType;
15
+ const decoratorTypes = decoratorTypesByTarget.get(target) ?? /* @__PURE__ */ new Map();
16
+ const existingDecoratorType = decoratorTypes.get(propertyKey);
17
+ if (existingDecoratorType && existingDecoratorType !== decoratorType) throw new Error(`@${decoratorType.description ?? String(decoratorType)} decorator can only be used once on ${target.constructor.name}.${propertyKey}. You can use only one of @api, @stream, @websocket, or @upload decorator on the same method.`);
18
+ else {
19
+ decoratorTypes.set(propertyKey, decoratorType);
20
+ decoratorTypesByTarget.set(target, decoratorTypes);
21
+ }
18
22
  }
19
23
  function api(options = {}) {
20
24
  options = {
@@ -30,7 +34,7 @@ function api(options = {}) {
30
34
  checkSingleDecorator(target, propertyKey, DECORATOR_TYPES.API);
31
35
  const defaultPath = `/${inflection.camelize(modelName.replace(/Model$/, "").replace(/Frame$/, ""), true)}/${inflection.camelize(propertyKey, true)}`;
32
36
  const path = options.path ?? defaultPath;
33
- const existingApi = registeredApis.find((api) => api.modelName === modelName && api.methodName === methodName);
37
+ const existingApi = registeredApis.find((registeredApi) => registeredApi.modelName === modelName && registeredApi.methodName === methodName);
34
38
  if (existingApi) {
35
39
  assertNoConflictingPath("api", modelName, methodName, existingApi.path, path);
36
40
  existingApi.path = path;
@@ -74,7 +78,7 @@ function stream(options) {
74
78
  ...apiOptions,
75
79
  httpMethod: "GET"
76
80
  };
77
- const existingApi = registeredApis.find((api) => api.modelName === modelName && api.methodName === methodName);
81
+ const existingApi = registeredApis.find((registeredApi) => registeredApi.modelName === modelName && registeredApi.methodName === methodName);
78
82
  if (existingApi) {
79
83
  assertNoConflictingPath("stream", modelName, methodName, existingApi.path, path);
80
84
  existingApi.path = path;
@@ -118,7 +122,7 @@ function websocket(options) {
118
122
  ...apiOptions,
119
123
  httpMethod: "GET"
120
124
  };
121
- const existingApi = registeredApis.find((api) => api.modelName === modelName && api.methodName === methodName);
125
+ const existingApi = registeredApis.find((registeredApi) => registeredApi.modelName === modelName && registeredApi.methodName === methodName);
122
126
  if (existingApi) {
123
127
  assertNoConflictingPath("websocket", modelName, methodName, existingApi.path, path);
124
128
  existingApi.path = path;
@@ -194,7 +198,7 @@ function upload(options = { consume: "buffer" }) {
194
198
  const methodName = propertyKey;
195
199
  checkSingleDecorator(target, propertyKey, DECORATOR_TYPES.UPLOAD);
196
200
  const defaultPath = `/${inflection.camelize(modelName.replace(/Model$/, "").replace(/Frame$/, ""), true)}/${inflection.camelize(methodName, true)}`;
197
- const existingApi = registeredApis.find((api) => api.modelName === modelName && api.methodName === methodName);
201
+ const existingApi = registeredApis.find((registeredApi) => registeredApi.modelName === modelName && registeredApi.methodName === methodName);
198
202
  if (existingApi) existingApi.uploadOptions = options;
199
203
  else registeredApis.push({
200
204
  modelName,
@@ -242,11 +246,13 @@ function assertNoConflictingPath(decoratorName, modelName, methodName, existingP
242
246
  * @param newOptions 새로운 옵션
243
247
  */
244
248
  function assertNoConflictingOptions(decoratorName, modelName, methodName, existingOptions, newOptions) {
245
- Object.keys(newOptions).forEach((key) => {
246
- if (existingOptions[key] && !isEqual(existingOptions[key], newOptions[key])) throw new Error(`@${decoratorName} decorator on ${modelName}.${methodName} has conflicting options: ${key}. The decorator is trying to override the existing option(${JSON.stringify(existingOptions[key])}) with the new option(${JSON.stringify(newOptions[key])}).`);
249
+ const existingEntries = new Map(Object.entries(existingOptions));
250
+ Object.entries(newOptions).forEach(([key, newValue]) => {
251
+ const existingValue = existingEntries.get(key);
252
+ if (existingValue && !isEqual(existingValue, newValue)) throw new Error(`@${decoratorName} decorator on ${modelName}.${methodName} has conflicting options: ${key}. The decorator is trying to override the existing option(${JSON.stringify(existingValue)}) with the new option(${JSON.stringify(newValue)}).`);
247
253
  });
248
254
  }
249
- var registeredApis, DECORATOR_TYPES;
255
+ var registeredApis, decoratorTypesByTarget, DECORATOR_TYPES;
250
256
  var init_decorators = __esmMin((() => {
251
257
  init_base_model();
252
258
  init_db();
@@ -256,6 +262,7 @@ var init_decorators = __esmMin((() => {
256
262
  init_class_name();
257
263
  init_base_frame();
258
264
  registeredApis = [];
265
+ decoratorTypesByTarget = /* @__PURE__ */ new WeakMap();
259
266
  DECORATOR_TYPES = {
260
267
  API: Symbol("api"),
261
268
  STREAM: Symbol("stream"),
@@ -267,4 +274,4 @@ var init_decorators = __esmMin((() => {
267
274
  init_decorators();
268
275
  export { api, init_decorators, registeredApis, stream, transactional, upload, websocket };
269
276
 
270
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGVjb3JhdG9ycy5qcyIsIm5hbWVzIjpbXSwic291cmNlcyI6WyIuLi8uLi9zcmMvYXBpL2RlY29yYXRvcnMudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IGFzc2VydCBmcm9tIFwiYXNzZXJ0XCI7XG5cbmltcG9ydCB7IHR5cGUgRmFzdGlmeU11bHRpcGFydEJhc2VPcHRpb25zIH0gZnJvbSBcIkBmYXN0aWZ5L211bHRpcGFydFwiO1xuaW1wb3J0IHsgZ2V0TG9nZ2VyIH0gZnJvbSBcIkBsb2d0YXBlL2xvZ3RhcGVcIjtcbmltcG9ydCB7IHR5cGUgSFRUUE1ldGhvZHMgfSBmcm9tIFwiZmFzdGlmeVwiO1xuaW1wb3J0IGluZmxlY3Rpb24gZnJvbSBcImluZmxlY3Rpb25cIjtcbmltcG9ydCB7IGlzRXF1YWwgfSBmcm9tIFwicmFkYXNoaVwiO1xuaW1wb3J0IHsgdHlwZSB6IH0gZnJvbSBcInpvZFwiO1xuXG5pbXBvcnQgeyB0eXBlIENhY2hlQ29udHJvbENvbmZpZyB9IGZyb20gXCIuLi9jYWNoZS1jb250cm9sL3R5cGVzXCI7XG5pbXBvcnQgeyB0eXBlIENvbXByZXNzQ29uZmlnIH0gZnJvbSBcIi4uL2NvbXByZXNzL3R5cGVzXCI7XG5pbXBvcnQgeyBCYXNlTW9kZWxDbGFzcyB9IGZyb20gXCIuLi9kYXRhYmFzZS9iYXNlLW1vZGVsXCI7XG5pbXBvcnQgeyBEQiB9IGZyb20gXCIuLi9kYXRhYmFzZS9kYlwiO1xuaW1wb3J0IHsgUHVyaVRyYW5zYWN0aW9uV3JhcHBlciB9IGZyb20gXCIuLi9kYXRhYmFzZS9wdXJpLXdyYXBwZXJcIjtcbmltcG9ydCB7IHR5cGUgVHJhbnNhY3Rpb25hbE9wdGlvbnMgfSBmcm9tIFwiLi4vZGF0YWJhc2UvcHVyaS13cmFwcGVyXCI7XG5pbXBvcnQgeyBVcHNlcnRCdWlsZGVyIH0gZnJvbSBcIi4uL2RhdGFiYXNlL3Vwc2VydC1idWlsZGVyXCI7XG5pbXBvcnQgeyBjb252ZXJ0RG9tYWluVG9DYXRlZ29yeSB9IGZyb20gXCIuLi9sb2dnZXIvY2F0ZWdvcnlcIjtcbmltcG9ydCB7IHR5cGUgRHJpdmVyS2V5IH0gZnJvbSBcIi4uL3N0b3JhZ2UvZHJpdmVyc1wiO1xuaW1wb3J0IHsgdHlwZSBLZXlHZW5lcmF0b3IgfSBmcm9tIFwiLi4vc3RvcmFnZS90eXBlc1wiO1xuaW1wb3J0IHsgdHlwZSBBcGlQYXJhbSwgdHlwZSBBcGlQYXJhbVR5cGUgfSBmcm9tIFwiLi4vdHlwZXMvdHlwZXNcIjtcbmltcG9ydCB7IGdldE1vZGVsTmFtZUZyb21DbGFzc05hbWUgfSBmcm9tIFwiLi4vdXRpbHMvY2xhc3MtbmFtZVwiO1xuaW1wb3J0IHsgQmFzZUZyYW1lQ2xhc3MgfSBmcm9tIFwiLi9iYXNlLWZyYW1lXCI7XG5cbmV4cG9ydCBpbnRlcmZhY2UgR3VhcmRLZXlzIHtcbiAgcXVlcnk6IHRydWU7XG4gIGFkbWluOiB0cnVlO1xuICB1c2VyOiB0cnVlO1xufVxuZXhwb3J0IHR5cGUgR3VhcmRLZXkgPSBrZXlvZiBHdWFyZEtleXM7XG5leHBvcnQgdHlwZSBTZXJ2aWNlQ2xpZW50ID1cbiAgfCBcImF4aW9zXCJcbiAgfCBcImF4aW9zLW11bHRpcGFydFwiXG4gIHwgXCJ0YW5zdGFjay1xdWVyeVwiXG4gIHwgXCJ0YW5zdGFjay1tdXRhdGlvblwiXG4gIHwgXCJ0YW5zdGFjay1tdXRhdGlvbi1tdWx0aXBhcnRcIlxuICB8IFwid2luZG93LWZldGNoXCI7XG5leHBvcnQgdHlwZSBBcGlEZWNvcmF0b3JPcHRpb25zID0ge1xuICBodHRwTWV0aG9kPzogSFRUUE1ldGhvZHM7XG4gIGNvbnRlbnRUeXBlPzpcbiAgICB8IFwidGV4dC9wbGFpblwiXG4gICAgfCBcInRleHQvaHRtbFwiXG4gICAgfCBcInRleHQveG1sXCJcbiAgICB8IFwiYXBwbGljYXRpb24vanNvblwiXG4gICAgfCBcImFwcGxpY2F0aW9uL29jdGV0LXN0cmVhbVwiO1xuICBjbGllbnRzPzogU2VydmljZUNsaWVudFtdO1xuICBwYXRoPzogc3RyaW5nO1xuICByZXNvdXJjZU5hbWU/OiBzdHJpbmc7XG4gIGd1YXJkcz86IEd1YXJkS2V5W107XG4gIGRlc2NyaXB0aW9uPzogc3RyaW5nO1xuICB0aW1lb3V0PzogbnVtYmVyO1xuICAvKiogQVBJIOydkeuLteydmCBDYWNoZS1Db250cm9sIO2XpOuNlCDshKTsoJUuIOyEpOygle2VmOyngCDslYrsnLzrqbQgY2FjaGVDb250cm9sSGFuZGxlciDrmJDripQg6riw67O46rCS7J20IOyggeyaqeuQqeuLiOuLpC4gKi9cbiAgY2FjaGVDb250cm9sPzogQ2FjaGVDb250cm9sQ29uZmlnO1xuICAvKiogQVBJIOydkeuLteydmCDslZXstpUg7ISk7KCVLiBmYWxzZeuhnCDshKTsoJXtlZjrqbQg7JWV7LaV7J2EIOu5hO2ZnOyEse2ZlO2VqeuLiOuLpC4gKi9cbiAgY29tcHJlc3M/OiBDb21wcmVzc0NvbmZpZztcbn07XG5leHBvcnQgdHlwZSBTdHJlYW1EZWNvcmF0b3JPcHRpb25zID0ge1xuICB0eXBlOiBcInNzZVwiO1xuICAvLyBveGxpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueSAtLSDsnbTrsqTtirgg7YKk67OE66GcIOuEmOqyqOyjvOuKlCDqsJLsnbTrr4DroZwg7Ja065akIO2DgOyeheydtOuToCDsg4HqtIDsl4bsnYxcbiAgZXZlbnRzOiB6LlpvZE9iamVjdDxhbnk+O1xuICBwYXRoPzogc3RyaW5nO1xuICByZXNvdXJjZU5hbWU/OiBzdHJpbmc7XG4gIGd1YXJkcz86IEd1YXJkS2V5W107XG4gIGRlc2NyaXB0aW9uPzogc3RyaW5nO1xufTtcbmV4cG9ydCB0eXBlIFdlYlNvY2tldERlY29yYXRvck9wdGlvbnMgPSB7XG4gIC8vIG94bGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55IC0tIOydtOuypO2KuCDtgqTrs4TroZwg64SY6rKo7KO864qUIOqwkuydtOuvgOuhnCDslrTrlqQg7YOA7J6F7J2065OgIOyDgeq0gOyXhuydjFxuICBvdXRFdmVudHM6IHouWm9kT2JqZWN0PGFueT47XG4gIC8vIG94bGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55IC0tIOydtOuypO2KuCDtgqTrs4TroZwg64SY6rKo7KO864qUIOqwkuydtOuvgOuhnCDslrTrlqQg7YOA7J6F7J2065OgIOyDgeq0gOyXhuydjFxuICBpbkV2ZW50czogei5ab2RPYmplY3Q8YW55PjtcbiAgcGF0aD86IHN0cmluZztcbiAgcmVzb3VyY2VOYW1lPzogc3RyaW5nO1xuICBndWFyZHM/OiBHdWFyZEtleVtdO1xuICBkZXNjcmlwdGlvbj86IHN0cmluZztcbiAgaGVhcnRiZWF0PzogbnVtYmVyO1xuICBuYW1lc3BhY2U/OiBzdHJpbmc7XG59O1xuZXhwb3J0IHR5cGUgUmVzb2x2ZWRXZWJTb2NrZXREZWNvcmF0b3JPcHRpb25zID0gV2ViU29ja2V0RGVjb3JhdG9yT3B0aW9ucyAmIHtcbiAgLy8gY29kZWdlbuydtCDtg4DsnoUg7J2066aE7J2EIOyerOyCrOyaqe2VoCDsiJgg7J6I64+E66GdIHN5bmNlcuqwgCBBU1Tsl5DshJwg67O06rCV7ZWY64qUIOuplO2DgOuNsOydtO2EsFxuICBvdXRFdmVudHNUeXBlUmVmPzogQXBpUGFyYW1UeXBlLlJlZjtcbiAgaW5FdmVudHNUeXBlUmVmPzogQXBpUGFyYW1UeXBlLlJlZjtcbn07XG5cbnR5cGUgQnVmZmVyVXBsb2FkT3B0aW9ucyA9IHtcbiAgY29uc3VtZT86IFwiYnVmZmVyXCI7XG59O1xudHlwZSBTdHJlYW1VcGxvYWRPcHRpb25zID0ge1xuICBjb25zdW1lOiBcInN0cmVhbVwiO1xuICBkZXN0aW5hdGlvbjogRHJpdmVyS2V5O1xuICBrZXlHZW5lcmF0b3I/OiBLZXlHZW5lcmF0b3I7XG59O1xuZXhwb3J0IHR5cGUgVXBsb2FkRGVjb3JhdG9yT3B0aW9ucyA9IHtcbiAgZ3VhcmRzPzogR3VhcmRLZXlbXTtcbiAgZGVzY3JpcHRpb24/OiBzdHJpbmc7XG4gIGxpbWl0cz86IEZhc3RpZnlNdWx0aXBhcnRCYXNlT3B0aW9uc1tcImxpbWl0c1wiXTtcbn0gJiAoQnVmZmVyVXBsb2FkT3B0aW9ucyB8IFN0cmVhbVVwbG9hZE9wdGlvbnMpO1xuXG5leHBvcnQgY29uc3QgcmVnaXN0ZXJlZEFwaXM6IHtcbiAgLyoqXG4gICAqIG1vZGVsTmFtZeydgCDrqqjrjbgg7YG0656Y7IqkIOydtOumhOyeheuLiOuLpC4gKGV4LiBcIlVzZXJNb2RlbFwiKVxuICAgKi9cbiAgbW9kZWxOYW1lOiBzdHJpbmc7XG4gIG1ldGhvZE5hbWU6IHN0cmluZztcbiAgcGF0aDogc3RyaW5nO1xuICBvcHRpb25zOiBBcGlEZWNvcmF0b3JPcHRpb25zO1xuICBzdHJlYW1PcHRpb25zPzogU3RyZWFtRGVjb3JhdG9yT3B0aW9ucztcbiAgd2Vic29ja2V0T3B0aW9ucz86IFJlc29sdmVkV2ViU29ja2V0RGVjb3JhdG9yT3B0aW9ucztcbiAgdXBsb2FkT3B0aW9ucz86IFVwbG9hZERlY29yYXRvck9wdGlvbnM7XG59W10gPSBbXTtcbmV4cG9ydCB0eXBlIEV4dGVuZGVkQXBpID0ge1xuICBtb2RlbE5hbWU6IHN0cmluZztcbiAgbWV0aG9kTmFtZTogc3RyaW5nO1xuICBwYXRoOiBzdHJpbmc7XG4gIG9wdGlvbnM6IEFwaURlY29yYXRvck9wdGlvbnM7XG4gIHN0cmVhbU9wdGlvbnM/OiBTdHJlYW1EZWNvcmF0b3JPcHRpb25zO1xuICB3ZWJzb2NrZXRPcHRpb25zPzogUmVzb2x2ZWRXZWJTb2NrZXREZWNvcmF0b3JPcHRpb25zO1xuICB1cGxvYWRPcHRpb25zPzogVXBsb2FkRGVjb3JhdG9yT3B0aW9ucztcbiAgdHlwZVBhcmFtZXRlcnM6IEFwaVBhcmFtVHlwZS5UeXBlUGFyYW1bXTtcbiAgcGFyYW1ldGVyczogQXBpUGFyYW1bXTtcbiAgcmV0dXJuVHlwZTogQXBpUGFyYW1UeXBlO1xufTtcbnR5cGUgRGVjb3JhdG9yVGFyZ2V0ID0geyBjb25zdHJ1Y3RvcjogeyBuYW1lOiBzdHJpbmcgfSB9O1xuXG5jb25zdCBERUNPUkFUT1JfVFlQRVMgPSB7XG4gIEFQSTogU3ltYm9sKFwiYXBpXCIpLFxuICBTVFJFQU06IFN5bWJvbChcInN0cmVhbVwiKSxcbiAgV0VCU09DS0VUOiBTeW1ib2woXCJ3ZWJzb2NrZXRcIiksXG4gIFVQTE9BRDogU3ltYm9sKFwidXBsb2FkXCIpLFxufSBhcyBjb25zdDtcblxuZnVuY3Rpb24gY2hlY2tTaW5nbGVEZWNvcmF0b3IodGFyZ2V0OiBEZWNvcmF0b3JUYXJnZXQsIHByb3BlcnR5S2V5OiBzdHJpbmcsIGRlY29yYXRvclR5cGU6IHN5bWJvbCkge1xuICBjb25zdCBtZXRob2QgPSB0YXJnZXRbcHJvcGVydHlLZXkgYXMga2V5b2YgdHlwZW9mIHRhcmdldF0gYXMgeyBfX2RlY29yYXRvclR5cGU/OiBzeW1ib2wgfTtcbiAgaWYgKG1ldGhvZD8uX19kZWNvcmF0b3JUeXBlICYmIG1ldGhvZD8uX19kZWNvcmF0b3JUeXBlICE9PSBkZWNvcmF0b3JUeXBlKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgYEAke2RlY29yYXRvclR5cGUuZGVzY3JpcHRpb24gPz8gU3RyaW5nKGRlY29yYXRvclR5cGUpfSBkZWNvcmF0b3IgY2FuIG9ubHkgYmUgdXNlZCBvbmNlIG9uICR7dGFyZ2V0LmNvbnN0cnVjdG9yLm5hbWV9LiR7cHJvcGVydHlLZXl9LiBZb3UgY2FuIHVzZSBvbmx5IG9uZSBvZiBAYXBpLCBAc3RyZWFtLCBAd2Vic29ja2V0LCBvciBAdXBsb2FkIGRlY29yYXRvciBvbiB0aGUgc2FtZSBtZXRob2QuYCxcbiAgICApO1xuICB9IGVsc2Uge1xuICAgIG1ldGhvZC5fX2RlY29yYXRvclR5cGUgPSBkZWNvcmF0b3JUeXBlO1xuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBhcGkob3B0aW9uczogQXBpRGVjb3JhdG9yT3B0aW9ucyA9IHt9KSB7XG4gIG9wdGlvbnMgPSB7XG4gICAgaHR0cE1ldGhvZDogXCJHRVRcIixcbiAgICBjb250ZW50VHlwZTogXCJhcHBsaWNhdGlvbi9qc29uXCIsXG4gICAgY2xpZW50czogW1wiYXhpb3NcIl0sXG4gICAgLi4ub3B0aW9ucyxcbiAgfTtcblxuICByZXR1cm4gKHRhcmdldDogRGVjb3JhdG9yVGFyZ2V0LCBwcm9wZXJ0eUtleTogc3RyaW5nLCBkZXNjcmlwdG9yOiBQcm9wZXJ0eURlc2NyaXB0b3IpID0+IHtcbiAgICBjb25zdCBtb2RlbE5hbWUgPSBnZXRNb2RlbE5hbWVGcm9tQ2xhc3NOYW1lKHRhcmdldC5jb25zdHJ1Y3Rvci5uYW1lKTtcbiAgICBhc3NlcnQoXG4gICAgICBtb2RlbE5hbWUsXG4gICAgICBgbW9kZWxOYW1lIGlzIHJlcXVpcmVkIG9uIEBhcGkgZGVjb3JhdG9yIG9uICR7dGFyZ2V0LmNvbnN0cnVjdG9yLm5hbWV9LiR7cHJvcGVydHlLZXl9YCxcbiAgICApO1xuICAgIGNvbnN0IG1ldGhvZE5hbWUgPSBwcm9wZXJ0eUtleTtcblxuICAgIC8vIOuplOyEnOuTnOyXkCDqsbjrprAg642w7L2U66CI7J207YSwIOykkeuztSDssrTtgaxcbiAgICBjaGVja1NpbmdsZURlY29yYXRvcih0YXJnZXQsIHByb3BlcnR5S2V5LCBERUNPUkFUT1JfVFlQRVMuQVBJKTtcblxuICAgIGNvbnN0IGRlZmF1bHRQYXRoID0gYC8ke2luZmxlY3Rpb24uY2FtZWxpemUoXG4gICAgICBtb2RlbE5hbWUucmVwbGFjZSgvTW9kZWwkLywgXCJcIikucmVwbGFjZSgvRnJhbWUkLywgXCJcIiksXG4gICAgICB0cnVlLFxuICAgICl9LyR7aW5mbGVjdGlvbi5jYW1lbGl6ZShwcm9wZXJ0eUtleSwgdHJ1ZSl9YDtcbiAgICBjb25zdCBwYXRoID0gb3B0aW9ucy5wYXRoID8/IGRlZmF1bHRQYXRoO1xuXG4gICAgLy8g6riw7KG0IOuPmeydvO2VnCDrqZTshJzrk5zqsIAg7J6I64qU7KeAIO2ZleyduCDtm4Qg7J6I64qUIOqyveyasCBvdmVycmlkZVxuICAgIGNvbnN0IGV4aXN0aW5nQXBpID0gcmVnaXN0ZXJlZEFwaXMuZmluZChcbiAgICAgIChhcGkpID0+IGFwaS5tb2RlbE5hbWUgPT09IG1vZGVsTmFtZSAmJiBhcGkubWV0aG9kTmFtZSA9PT0gbWV0aG9kTmFtZSxcbiAgICApO1xuICAgIGlmIChleGlzdGluZ0FwaSkge1xuICAgICAgLy8g6riw7KG07J2YIHBhdGjsmYAg7IOI66Gc7Jq0IHBhdGjqsIAg64uk66W064uk66m0KD3ruYgg7Iqk7Yq466eB7J20IOyVhOuLiOyXiOuKlOuNsCDri6Trpbgg7Iqk7Yq466eB7Jy866GcIOuwlOuAjOqyjCDrkJzri6TrqbQpIOyXkOufrOulvCDthLDrnKjroKTspI3ri4jri6QuXG4gICAgICBhc3NlcnROb0NvbmZsaWN0aW5nUGF0aChcImFwaVwiLCBtb2RlbE5hbWUsIG1ldGhvZE5hbWUsIGV4aXN0aW5nQXBpLnBhdGgsIHBhdGgpO1xuICAgICAgZXhpc3RpbmdBcGkucGF0aCA9IHBhdGg7XG5cbiAgICAgIC8vIOq4sOyhtOydmCDsmLXshZjqs7wg7IOI66Gc7Jq0IOyYteyFmOydtCDqsrnsuZjripQg67aA67aE7J20IOyeiOuLpOuptCDsl5Drn6zrpbwg7YSw65yo66Ck7KSN64uI64ukLlxuICAgICAgYXNzZXJ0Tm9Db25mbGljdGluZ09wdGlvbnMoXCJhcGlcIiwgbW9kZWxOYW1lLCBtZXRob2ROYW1lLCBleGlzdGluZ0FwaS5vcHRpb25zLCBvcHRpb25zKTtcbiAgICAgIGV4aXN0aW5nQXBpLm9wdGlvbnMgPSB7XG4gICAgICAgIC4uLmV4aXN0aW5nQXBpLm9wdGlvbnMsIC8vIOq4sOyhtOydmCDsmLXshZjsnYQg7KG07KSR7ZWY65CYXG4gICAgICAgIC4uLm9wdGlvbnMsIC8vIEBhcGkg642w7L2U66CI7J207YSw7J2YIOyYteyFmOydhCDstpTqsIDtlanri4jri6QuXG4gICAgICB9O1xuICAgIH0gZWxzZSB7XG4gICAgICByZWdpc3RlcmVkQXBpcy5wdXNoKHtcbiAgICAgICAgbW9kZWxOYW1lLFxuICAgICAgICBtZXRob2ROYW1lLFxuICAgICAgICBwYXRoLFxuICAgICAgICBvcHRpb25zLFxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgY29uc3Qgb3JpZ2luYWxNZXRob2QgPSBkZXNjcmlwdG9yLnZhbHVlO1xuICAgIGRlc2NyaXB0b3IudmFsdWUgPSBhc3luYyBmdW5jdGlvbiAodGhpczogQmFzZU1vZGVsQ2xhc3MgfCBCYXNlRnJhbWVDbGFzcywgLi4uYXJnczogdW5rbm93bltdKSB7XG4gICAgICBpZiAodGhpcyBpbnN0YW5jZW9mIEJhc2VNb2RlbENsYXNzKSB7XG4gICAgICAgIGdldExvZ2dlcihjb252ZXJ0RG9tYWluVG9DYXRlZ29yeSh0aGlzLm1vZGVsTmFtZSwgXCJtb2RlbFwiKSkuZGVidWcoXG4gICAgICAgICAgXCJhcGk6IHtodHRwTWV0aG9kfSB7bW9kZWx9LnttZXRob2R9XCIsXG4gICAgICAgICAge1xuICAgICAgICAgICAgaHR0cE1ldGhvZDogb3B0aW9ucy5odHRwTWV0aG9kLFxuICAgICAgICAgICAgbW9kZWw6IG1vZGVsTmFtZSxcbiAgICAgICAgICAgIG1ldGhvZDogbWV0aG9kTmFtZSxcbiAgICAgICAgICB9LFxuICAgICAgICApO1xuICAgICAgfVxuXG4gICAgICBpZiAodGhpcyBpbnN0YW5jZW9mIEJhc2VGcmFtZUNsYXNzKSB7XG4gICAgICAgIGdldExvZ2dlcihjb252ZXJ0RG9tYWluVG9DYXRlZ29yeSh0aGlzLmZyYW1lTmFtZSwgXCJmcmFtZVwiKSkuZGVidWcoXG4gICAgICAgICAgXCJhcGk6IHtodHRwTWV0aG9kfSB7bW9kZWx9LnttZXRob2R9XCIsXG4gICAgICAgICAge1xuICAgICAgICAgICAgaHR0cE1ldGhvZDogb3B0aW9ucy5odHRwTWV0aG9kLFxuICAgICAgICAgICAgbW9kZWw6IG1vZGVsTmFtZSxcbiAgICAgICAgICAgIG1ldGhvZDogbWV0aG9kTmFtZSxcbiAgICAgICAgICB9LFxuICAgICAgICApO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gb3JpZ2luYWxNZXRob2QuYXBwbHkodGhpcywgYXJncyk7XG4gICAgfTtcbiAgfTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHN0cmVhbShvcHRpb25zOiBTdHJlYW1EZWNvcmF0b3JPcHRpb25zKSB7XG4gIHJldHVybiAodGFyZ2V0OiBEZWNvcmF0b3JUYXJnZXQsIHByb3BlcnR5S2V5OiBzdHJpbmcsIGRlc2NyaXB0b3I6IFByb3BlcnR5RGVzY3JpcHRvcikgPT4ge1xuICAgIGNvbnN0IG1vZGVsTmFtZSA9IGdldE1vZGVsTmFtZUZyb21DbGFzc05hbWUodGFyZ2V0LmNvbnN0cnVjdG9yLm5hbWUpO1xuICAgIGFzc2VydChcbiAgICAgIG1vZGVsTmFtZSxcbiAgICAgIGBtb2RlbE5hbWUgaXMgcmVxdWlyZWQgb24gQHN0cmVhbSBkZWNvcmF0b3Igb24gJHt0YXJnZXQuY29uc3RydWN0b3IubmFtZX0uJHtwcm9wZXJ0eUtleX1gLFxuICAgICk7XG4gICAgY29uc3QgbWV0aG9kTmFtZSA9IHByb3BlcnR5S2V5O1xuXG4gICAgLy8g66mU7ISc65Oc7JeQIOqxuOumsCDrjbDsvZTroIjsnbTthLAg7KSR67O1IOyytO2BrFxuICAgIGNoZWNrU2luZ2xlRGVjb3JhdG9yKHRhcmdldCwgcHJvcGVydHlLZXksIERFQ09SQVRPUl9UWVBFUy5TVFJFQU0pO1xuXG4gICAgY29uc3QgZGVmYXVsdFBhdGggPSBgLyR7aW5mbGVjdGlvbi5jYW1lbGl6ZShcbiAgICAgIG1vZGVsTmFtZS5yZXBsYWNlKC9Nb2RlbCQvLCBcIlwiKS5yZXBsYWNlKC9GcmFtZSQvLCBcIlwiKSxcbiAgICAgIHRydWUsXG4gICAgKX0vJHtpbmZsZWN0aW9uLmNhbWVsaXplKHByb3BlcnR5S2V5LCB0cnVlKX1gO1xuICAgIGNvbnN0IHBhdGggPSBvcHRpb25zLnBhdGggPz8gZGVmYXVsdFBhdGg7XG4gICAgLy8gc3RyZWFtIOyghOyaqSDtlYTrk5woZXZlbnRzLCB0eXBlKeuKlCBBcGlEZWNvcmF0b3JPcHRpb25z7JeQIOyGje2VmOyngCDslYrsnLzrr4DroZwg7KCc7Jm4XG4gICAgY29uc3QgeyBldmVudHM6IF8sIHR5cGU6IF90eXBlLCAuLi5hcGlPcHRpb25zIH0gPSBvcHRpb25zO1xuICAgIGNvbnN0IG9wdGlvbnNXaXRoRGVmYXVsdHMgPSB7XG4gICAgICAuLi5hcGlPcHRpb25zLFxuICAgICAgaHR0cE1ldGhvZDogXCJHRVRcIiBhcyBIVFRQTWV0aG9kcyxcbiAgICB9O1xuXG4gICAgY29uc3QgZXhpc3RpbmdBcGkgPSByZWdpc3RlcmVkQXBpcy5maW5kKFxuICAgICAgKGFwaSkgPT4gYXBpLm1vZGVsTmFtZSA9PT0gbW9kZWxOYW1lICYmIGFwaS5tZXRob2ROYW1lID09PSBtZXRob2ROYW1lLFxuICAgICk7XG4gICAgaWYgKGV4aXN0aW5nQXBpKSB7XG4gICAgICAvLyDquLDsobTsnZggcGF0aOyZgCDsg4jroZzsmrQgcGF0aOqwgCDri6TrpbTri6TrqbQoPeu5iCDsiqTtirjrp4HsnbQg7JWE64uI7JeI64qU642wIOuLpOuluCDsiqTtirjrp4HsnLzroZwg67CU64CM6rKMIOuQnOuLpOuptCkg7JeQ65+s66W8IO2EsOucqOugpOykjeuLiOuLpC5cbiAgICAgIGFzc2VydE5vQ29uZmxpY3RpbmdQYXRoKFwic3RyZWFtXCIsIG1vZGVsTmFtZSwgbWV0aG9kTmFtZSwgZXhpc3RpbmdBcGkucGF0aCwgcGF0aCk7XG4gICAgICBleGlzdGluZ0FwaS5wYXRoID0gcGF0aDtcblxuICAgICAgLy8g6riw7KG07J2YIOyYteyFmOqzvCDsg4jroZzsmrQg7Ji17IWY7J20IOqyuey5mOuKlCDrtoDrtoTsnbQg7J6I64uk66m0IOyXkOufrOulvCDthLDrnKjroKTspI3ri4jri6QuXG4gICAgICBhc3NlcnROb0NvbmZsaWN0aW5nT3B0aW9ucyhcbiAgICAgICAgXCJzdHJlYW1cIixcbiAgICAgICAgbW9kZWxOYW1lLFxuICAgICAgICBtZXRob2ROYW1lLFxuICAgICAgICBleGlzdGluZ0FwaS5vcHRpb25zLFxuICAgICAgICBvcHRpb25zV2l0aERlZmF1bHRzLFxuICAgICAgKTtcbiAgICAgIGV4aXN0aW5nQXBpLm9wdGlvbnMgPSB7XG4gICAgICAgIC4uLmV4aXN0aW5nQXBpLm9wdGlvbnMsIC8vIOq4sOyhtOydmCDsmLXshZjsnYQg7KG07KSR7ZWY65CYXG4gICAgICAgIC4uLm9wdGlvbnNXaXRoRGVmYXVsdHMsIC8vIEBzdHJlYW0g642w7L2U66CI7J207YSw7J2YIOyYteyFmOydhCDstpTqsIDtlanri4jri6QuXG4gICAgICB9O1xuXG4gICAgICBleGlzdGluZ0FwaS5zdHJlYW1PcHRpb25zID0gb3B0aW9ucztcbiAgICB9IGVsc2Uge1xuICAgICAgcmVnaXN0ZXJlZEFwaXMucHVzaCh7XG4gICAgICAgIG1vZGVsTmFtZSxcbiAgICAgICAgbWV0aG9kTmFtZSxcbiAgICAgICAgcGF0aCxcbiAgICAgICAgb3B0aW9uczogb3B0aW9uc1dpdGhEZWZhdWx0cyxcbiAgICAgICAgc3RyZWFtT3B0aW9uczogb3B0aW9ucyxcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGNvbnN0IG9yaWdpbmFsTWV0aG9kID0gZGVzY3JpcHRvci52YWx1ZTtcbiAgICBkZXNjcmlwdG9yLnZhbHVlID0gYXN5bmMgZnVuY3Rpb24gKHRoaXM6IEJhc2VNb2RlbENsYXNzIHwgQmFzZUZyYW1lQ2xhc3MsIC4uLmFyZ3M6IHVua25vd25bXSkge1xuICAgICAgaWYgKHRoaXMgaW5zdGFuY2VvZiBCYXNlTW9kZWxDbGFzcykge1xuICAgICAgICBnZXRMb2dnZXIoY29udmVydERvbWFpblRvQ2F0ZWdvcnkodGhpcy5tb2RlbE5hbWUsIFwibW9kZWxcIikpLmRlYnVnKFxuICAgICAgICAgIFwic3RyZWFtOiB7bW9kZWx9LnttZXRob2R9XCIsXG4gICAgICAgICAge1xuICAgICAgICAgICAgbW9kZWw6IG1vZGVsTmFtZSxcbiAgICAgICAgICAgIG1ldGhvZDogbWV0aG9kTmFtZSxcbiAgICAgICAgICB9LFxuICAgICAgICApO1xuICAgICAgfVxuXG4gICAgICBpZiAodGhpcyBpbnN0YW5jZW9mIEJhc2VGcmFtZUNsYXNzKSB7XG4gICAgICAgIGdldExvZ2dlcihjb252ZXJ0RG9tYWluVG9DYXRlZ29yeSh0aGlzLmZyYW1lTmFtZSwgXCJmcmFtZVwiKSkuZGVidWcoXG4gICAgICAgICAgXCJzdHJlYW06IHttb2RlbH0ue21ldGhvZH1cIixcbiAgICAgICAgICB7XG4gICAgICAgICAgICBtb2RlbDogbW9kZWxOYW1lLFxuICAgICAgICAgICAgbWV0aG9kOiBtZXRob2ROYW1lLFxuICAgICAgICAgIH0sXG4gICAgICAgICk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBvcmlnaW5hbE1ldGhvZC5hcHBseSh0aGlzLCBhcmdzKTtcbiAgICB9O1xuICB9O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gd2Vic29ja2V0KG9wdGlvbnM6IFdlYlNvY2tldERlY29yYXRvck9wdGlvbnMpIHtcbiAgcmV0dXJuICh0YXJnZXQ6IERlY29yYXRvclRhcmdldCwgcHJvcGVydHlLZXk6IHN0cmluZywgZGVzY3JpcHRvcjogUHJvcGVydHlEZXNjcmlwdG9yKSA9PiB7XG4gICAgY29uc3QgbW9kZWxOYW1lID0gZ2V0TW9kZWxOYW1lRnJvbUNsYXNzTmFtZSh0YXJnZXQuY29uc3RydWN0b3IubmFtZSk7XG4gICAgYXNzZXJ0KFxuICAgICAgbW9kZWxOYW1lLFxuICAgICAgYG1vZGVsTmFtZSBpcyByZXF1aXJlZCBvbiBAd2Vic29ja2V0IGRlY29yYXRvciBvbiAke3RhcmdldC5jb25zdHJ1Y3Rvci5uYW1lfS4ke3Byb3BlcnR5S2V5fWAsXG4gICAgKTtcbiAgICBjb25zdCBtZXRob2ROYW1lID0gcHJvcGVydHlLZXk7XG5cbiAgICBjaGVja1NpbmdsZURlY29yYXRvcih0YXJnZXQsIHByb3BlcnR5S2V5LCBERUNPUkFUT1JfVFlQRVMuV0VCU09DS0VUKTtcblxuICAgIGNvbnN0IGRlZmF1bHRQYXRoID0gYC8ke2luZmxlY3Rpb24uY2FtZWxpemUoXG4gICAgICBtb2RlbE5hbWUucmVwbGFjZSgvTW9kZWwkLywgXCJcIikucmVwbGFjZSgvRnJhbWUkLywgXCJcIiksXG4gICAgICB0cnVlLFxuICAgICl9LyR7aW5mbGVjdGlvbi5jYW1lbGl6ZShwcm9wZXJ0eUtleSwgdHJ1ZSl9YDtcbiAgICBjb25zdCBwYXRoID0gb3B0aW9ucy5wYXRoID8/IGRlZmF1bHRQYXRoO1xuICAgIGNvbnN0IHsgb3V0RXZlbnRzOiBfb3V0RXZlbnRzLCBpbkV2ZW50czogX2luRXZlbnRzLCAuLi5hcGlPcHRpb25zIH0gPSBvcHRpb25zO1xuICAgIGNvbnN0IG9wdGlvbnNXaXRoRGVmYXVsdHMgPSB7XG4gICAgICAuLi5hcGlPcHRpb25zLFxuICAgICAgaHR0cE1ldGhvZDogXCJHRVRcIiBhcyBIVFRQTWV0aG9kcyxcbiAgICB9O1xuXG4gICAgY29uc3QgZXhpc3RpbmdBcGkgPSByZWdpc3RlcmVkQXBpcy5maW5kKFxuICAgICAgKGFwaSkgPT4gYXBpLm1vZGVsTmFtZSA9PT0gbW9kZWxOYW1lICYmIGFwaS5tZXRob2ROYW1lID09PSBtZXRob2ROYW1lLFxuICAgICk7XG4gICAgaWYgKGV4aXN0aW5nQXBpKSB7XG4gICAgICBhc3NlcnROb0NvbmZsaWN0aW5nUGF0aChcIndlYnNvY2tldFwiLCBtb2RlbE5hbWUsIG1ldGhvZE5hbWUsIGV4aXN0aW5nQXBpLnBhdGgsIHBhdGgpO1xuICAgICAgZXhpc3RpbmdBcGkucGF0aCA9IHBhdGg7XG5cbiAgICAgIGFzc2VydE5vQ29uZmxpY3RpbmdPcHRpb25zKFxuICAgICAgICBcIndlYnNvY2tldFwiLFxuICAgICAgICBtb2RlbE5hbWUsXG4gICAgICAgIG1ldGhvZE5hbWUsXG4gICAgICAgIGV4aXN0aW5nQXBpLm9wdGlvbnMsXG4gICAgICAgIG9wdGlvbnNXaXRoRGVmYXVsdHMsXG4gICAgICApO1xuICAgICAgZXhpc3RpbmdBcGkub3B0aW9ucyA9IHtcbiAgICAgICAgLi4uZXhpc3RpbmdBcGkub3B0aW9ucyxcbiAgICAgICAgLi4ub3B0aW9uc1dpdGhEZWZhdWx0cyxcbiAgICAgIH07XG5cbiAgICAgIGV4aXN0aW5nQXBpLndlYnNvY2tldE9wdGlvbnMgPSBvcHRpb25zO1xuICAgIH0gZWxzZSB7XG4gICAgICByZWdpc3RlcmVkQXBpcy5wdXNoKHtcbiAgICAgICAgbW9kZWxOYW1lLFxuICAgICAgICBtZXRob2ROYW1lLFxuICAgICAgICBwYXRoLFxuICAgICAgICBvcHRpb25zOiBvcHRpb25zV2l0aERlZmF1bHRzLFxuICAgICAgICB3ZWJzb2NrZXRPcHRpb25zOiBvcHRpb25zLFxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgY29uc3Qgb3JpZ2luYWxNZXRob2QgPSBkZXNjcmlwdG9yLnZhbHVlO1xuICAgIGRlc2NyaXB0b3IudmFsdWUgPSBhc3luYyBmdW5jdGlvbiAodGhpczogQmFzZU1vZGVsQ2xhc3MgfCBCYXNlRnJhbWVDbGFzcywgLi4uYXJnczogdW5rbm93bltdKSB7XG4gICAgICBpZiAodGhpcyBpbnN0YW5jZW9mIEJhc2VNb2RlbENsYXNzKSB7XG4gICAgICAgIGdldExvZ2dlcihjb252ZXJ0RG9tYWluVG9DYXRlZ29yeSh0aGlzLm1vZGVsTmFtZSwgXCJtb2RlbFwiKSkuZGVidWcoXG4gICAgICAgICAgXCJ3ZWJzb2NrZXQ6IHttb2RlbH0ue21ldGhvZH1cIixcbiAgICAgICAgICB7XG4gICAgICAgICAgICBtb2RlbDogbW9kZWxOYW1lLFxuICAgICAgICAgICAgbWV0aG9kOiBtZXRob2ROYW1lLFxuICAgICAgICAgIH0sXG4gICAgICAgICk7XG4gICAgICB9XG5cbiAgICAgIGlmICh0aGlzIGluc3RhbmNlb2YgQmFzZUZyYW1lQ2xhc3MpIHtcbiAgICAgICAgZ2V0TG9nZ2VyKGNvbnZlcnREb21haW5Ub0NhdGVnb3J5KHRoaXMuZnJhbWVOYW1lLCBcImZyYW1lXCIpKS5kZWJ1ZyhcbiAgICAgICAgICBcIndlYnNvY2tldDoge21vZGVsfS57bWV0aG9kfVwiLFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIG1vZGVsOiBtb2RlbE5hbWUsXG4gICAgICAgICAgICBtZXRob2Q6IG1ldGhvZE5hbWUsXG4gICAgICAgICAgfSxcbiAgICAgICAgKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIG9yaWdpbmFsTWV0aG9kLmFwcGx5KHRoaXMsIGFyZ3MpO1xuICAgIH07XG4gIH07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB0cmFuc2FjdGlvbmFsKG9wdGlvbnM6IFRyYW5zYWN0aW9uYWxPcHRpb25zID0ge30pIHtcbiAgY29uc3QgeyBpc29sYXRpb24sIHJlYWRPbmx5LCBkYlByZXNldCA9IFwid1wiIH0gPSBvcHRpb25zO1xuXG4gIHJldHVybiAodGFyZ2V0OiBEZWNvcmF0b3JUYXJnZXQsIHByb3BlcnR5S2V5OiBzdHJpbmcsIGRlc2NyaXB0b3I6IFByb3BlcnR5RGVzY3JpcHRvcikgPT4ge1xuICAgIGNvbnN0IG9yaWdpbmFsTWV0aG9kID0gZGVzY3JpcHRvci52YWx1ZTtcbiAgICBjb25zdCBtb2RlbE5hbWUgPSBnZXRNb2RlbE5hbWVGcm9tQ2xhc3NOYW1lKHRhcmdldC5jb25zdHJ1Y3Rvci5uYW1lKTtcbiAgICBhc3NlcnQoXG4gICAgICBtb2RlbE5hbWUsXG4gICAgICBgbW9kZWxOYW1lIGlzIHJlcXVpcmVkIG9uIEB0cmFuc2FjdGlvbmFsIGRlY29yYXRvciBvbiAke3RhcmdldC5jb25zdHJ1Y3Rvci5uYW1lfS4ke3Byb3BlcnR5S2V5fWAsXG4gICAgKTtcbiAgICBjb25zdCBtZXRob2ROYW1lID0gcHJvcGVydHlLZXk7XG5cbiAgICBkZXNjcmlwdG9yLnZhbHVlID0gYXN5bmMgZnVuY3Rpb24gKHRoaXM6IEJhc2VNb2RlbENsYXNzLCAuLi5hcmdzOiB1bmtub3duW10pIHtcbiAgICAgIHRoaXMubG9nZ2VyLmRlYnVnKFwidHJhbnNhY3Rpb25hbDoge21vZGVsfS57bWV0aG9kfVwiLCB7XG4gICAgICAgIG1vZGVsOiBtb2RlbE5hbWUsXG4gICAgICAgIG1ldGhvZDogbWV0aG9kTmFtZSxcbiAgICAgIH0pO1xuXG4gICAgICAvLyDtlbTri7kgcHJlc2V07J2YIO2KuOuenOyereyFmOydtCDsl4bsnLzrqbQg7IOIIO2KuOuenOyereyFmOqzvCBzY29wZeulvCDtlajqu5gg7Iuc7J6R7ZWc64ukLlxuICAgICAgY29uc3Qgc3RhcnRUcmFuc2FjdGlvbiA9IGFzeW5jICgpID0+IHtcbiAgICAgICAgY29uc3QgcHVyaSA9IHRoaXMuZ2V0UHVyaShkYlByZXNldCk7XG5cbiAgICAgICAgcmV0dXJuIHB1cmkua25leC50cmFuc2FjdGlvbihcbiAgICAgICAgICBhc3luYyAodHJ4KSA9PiB7XG4gICAgICAgICAgICB0aGlzLmxvZ2dlci5kZWJ1ZyhcIm5ldyB0cmFuc2FjdGlvbiBjb250ZXh0OiB7ZGJQcmVzZXR9XCIsIHsgZGJQcmVzZXQgfSk7XG4gICAgICAgICAgICBjb25zdCB0cnhXcmFwcGVyID0gbmV3IFB1cmlUcmFuc2FjdGlvbldyYXBwZXIodHJ4LCBuZXcgVXBzZXJ0QnVpbGRlcigpKTtcblxuICAgICAgICAgICAgcmV0dXJuIERCLnJ1bldpdGhUcmFuc2FjdGlvblNjb3BlKGRiUHJlc2V0LCB0cnhXcmFwcGVyLCAoKSA9PlxuICAgICAgICAgICAgICBvcmlnaW5hbE1ldGhvZC5hcHBseSh0aGlzLCBhcmdzKSxcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfSxcbiAgICAgICAgICB7IGlzb2xhdGlvbkxldmVsOiBpc29sYXRpb24sIHJlYWRPbmx5IH0sXG4gICAgICAgICk7XG4gICAgICB9O1xuXG4gICAgICBjb25zdCBleGlzdGluZ1RyYW5zYWN0aW9uID0gREIudHJhbnNhY3Rpb25TdG9yYWdlLmdldFN0b3JlKCk/LmdldFRyYW5zYWN0aW9uKGRiUHJlc2V0KTtcbiAgICAgIGlmIChleGlzdGluZ1RyYW5zYWN0aW9uKSB7XG4gICAgICAgIHRoaXMubG9nZ2VyLmRlYnVnKFwicmV1c2UgdHJhbnNhY3Rpb24gY29udGV4dDoge2RiUHJlc2V0fVwiLCB7IGRiUHJlc2V0IH0pO1xuICAgICAgICAvLyDri6TrpbggcHJlc2V07J20IOyViOyqveyXkCDsnojslrTrj4Qg7J20IOuplOyEnOuTnOqwgCDsnqzsgqzsmqntlZwg7Yq4656c7J6t7IWY7J2EIO2YhOyerCBzY29wZeuhnCDtkZzsi5ztlZzri6QuXG4gICAgICAgIHJldHVybiBEQi5ydW5XaXRoVHJhbnNhY3Rpb25TY29wZShkYlByZXNldCwgZXhpc3RpbmdUcmFuc2FjdGlvbiwgKCkgPT5cbiAgICAgICAgICBvcmlnaW5hbE1ldGhvZC5hcHBseSh0aGlzLCBhcmdzKSxcbiAgICAgICAgKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHN0YXJ0VHJhbnNhY3Rpb24oKTtcbiAgICB9O1xuXG4gICAgcmV0dXJuIGRlc2NyaXB0b3I7XG4gIH07XG59XG5cbi8qKlxuICog7YyM7J28IOyXheuhnOuTnCBBUEnrpbwg7IOd7ISx7ZW07KSN64uI64ukLiAoQGFwaSDrjbDsvZTroIjsnbTthLAg7JeG7J20IOuPheumveyggeycvOuhnCDsgqzsmqkpXG4gKiBAcGFyYW0gb3B0aW9uc1xuICogQHJldHVybnNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHVwbG9hZChvcHRpb25zOiBVcGxvYWREZWNvcmF0b3JPcHRpb25zID0geyBjb25zdW1lOiBcImJ1ZmZlclwiIH0pIHtcbiAgcmV0dXJuICh0YXJnZXQ6IERlY29yYXRvclRhcmdldCwgcHJvcGVydHlLZXk6IHN0cmluZywgZGVzY3JpcHRvcjogUHJvcGVydHlEZXNjcmlwdG9yKSA9PiB7XG4gICAgY29uc3Qgb3JpZ2luYWxNZXRob2QgPSBkZXNjcmlwdG9yLnZhbHVlO1xuICAgIGNvbnN0IG1vZGVsTmFtZSA9IGdldE1vZGVsTmFtZUZyb21DbGFzc05hbWUodGFyZ2V0LmNvbnN0cnVjdG9yLm5hbWUpO1xuICAgIGFzc2VydChcbiAgICAgIG1vZGVsTmFtZSxcbiAgICAgIGBtb2RlbE5hbWUgaXMgcmVxdWlyZWQgb24gQHVwbG9hZCBkZWNvcmF0b3Igb24gJHt0YXJnZXQuY29uc3RydWN0b3IubmFtZX0uJHtwcm9wZXJ0eUtleX1gLFxuICAgICk7XG4gICAgY29uc3QgbWV0aG9kTmFtZSA9IHByb3BlcnR5S2V5O1xuXG4gICAgLy8g66mU7ISc65Oc7JeQIOqxuOumsCDrjbDsvZTroIjsnbTthLAg7KSR67O1IOyytO2BrFxuICAgIGNoZWNrU2luZ2xlRGVjb3JhdG9yKHRhcmdldCwgcHJvcGVydHlLZXksIERFQ09SQVRPUl9UWVBFUy5VUExPQUQpO1xuXG4gICAgY29uc3QgZGVmYXVsdFBhdGggPSBgLyR7aW5mbGVjdGlvbi5jYW1lbGl6ZShcbiAgICAgIG1vZGVsTmFtZS5yZXBsYWNlKC9Nb2RlbCQvLCBcIlwiKS5yZXBsYWNlKC9GcmFtZSQvLCBcIlwiKSxcbiAgICAgIHRydWUsXG4gICAgKX0vJHtpbmZsZWN0aW9uLmNhbWVsaXplKG1ldGhvZE5hbWUsIHRydWUpfWA7XG5cbiAgICAvLyByZWdpc3RlcmVkQXBpc+yXkOyEnCDtlbTri7kgQVBJIOywvuyVhOyEnCB1cGxvYWRPcHRpb25zIOy2lOqwgFxuICAgIGNvbnN0IGV4aXN0aW5nQXBpID0gcmVnaXN0ZXJlZEFwaXMuZmluZChcbiAgICAgIChhcGkpID0+IGFwaS5tb2RlbE5hbWUgPT09IG1vZGVsTmFtZSAmJiBhcGkubWV0aG9kTmFtZSA9PT0gbWV0aG9kTmFtZSxcbiAgICApO1xuXG4gICAgaWYgKGV4aXN0aW5nQXBpKSB7XG4gICAgICAvLyDsnqzrk7HroZ0g7IucIOyXheuhnOuTnCDsmLXshZjrp4wg6rCx7IugXG4gICAgICBleGlzdGluZ0FwaS51cGxvYWRPcHRpb25zID0gb3B0aW9ucztcbiAgICB9IGVsc2Uge1xuICAgICAgLy8g7IOI66GcIOuTseuhnVxuICAgICAgcmVnaXN0ZXJlZEFwaXMucHVzaCh7XG4gICAgICAgIG1vZGVsTmFtZSxcbiAgICAgICAgbWV0aG9kTmFtZSxcbiAgICAgICAgcGF0aDogZGVmYXVsdFBhdGgsXG4gICAgICAgIG9wdGlvbnM6IHtcbiAgICAgICAgICBodHRwTWV0aG9kOiBcIlBPU1RcIixcbiAgICAgICAgICBjbGllbnRzOiBbXCJheGlvcy1tdWx0aXBhcnRcIiwgXCJ0YW5zdGFjay1tdXRhdGlvbi1tdWx0aXBhcnRcIl0sXG4gICAgICAgICAgZ3VhcmRzOiBvcHRpb25zLmd1YXJkcyxcbiAgICAgICAgICBkZXNjcmlwdGlvbjogb3B0aW9ucy5kZXNjcmlwdGlvbixcbiAgICAgICAgfSxcbiAgICAgICAgdXBsb2FkT3B0aW9uczogb3B0aW9ucyxcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGRlc2NyaXB0b3IudmFsdWUgPSBhc3luYyBmdW5jdGlvbiAodGhpczogQmFzZU1vZGVsQ2xhc3MgfCBCYXNlRnJhbWVDbGFzcywgLi4uYXJnczogdW5rbm93bltdKSB7XG4gICAgICBpZiAodGhpcyBpbnN0YW5jZW9mIEJhc2VNb2RlbENsYXNzKSB7XG4gICAgICAgIGdldExvZ2dlcihjb252ZXJ0RG9tYWluVG9DYXRlZ29yeSh0aGlzLm1vZGVsTmFtZSwgXCJtb2RlbFwiKSkuZGVidWcoXG4gICAgICAgICAgXCJ1cGxvYWQ6IHttb2RlbH0ue21ldGhvZH1cIixcbiAgICAgICAgICB7XG4gICAgICAgICAgICBtb2RlbDogbW9kZWxOYW1lLFxuICAgICAgICAgICAgbWV0aG9kOiBtZXRob2ROYW1lLFxuICAgICAgICAgIH0sXG4gICAgICAgICk7XG4gICAgICB9XG5cbiAgICAgIGlmICh0aGlzIGluc3RhbmNlb2YgQmFzZUZyYW1lQ2xhc3MpIHtcbiAgICAgICAgZ2V0TG9nZ2VyKGNvbnZlcnREb21haW5Ub0NhdGVnb3J5KHRoaXMuZnJhbWVOYW1lLCBcImZyYW1lXCIpKS5kZWJ1ZyhcbiAgICAgICAgICBcInVwbG9hZDoge21vZGVsfS57bWV0aG9kfVwiLFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIG1vZGVsOiBtb2RlbE5hbWUsXG4gICAgICAgICAgICBtZXRob2Q6IG1ldGhvZE5hbWUsXG4gICAgICAgICAgfSxcbiAgICAgICAgKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIG9yaWdpbmFsTWV0aG9kLmFwcGx5KHRoaXMsIGFyZ3MpO1xuICAgIH07XG5cbiAgICByZXR1cm4gZGVzY3JpcHRvcjtcbiAgfTtcbn1cblxuLyoqXG4gKiDquLDsobTsnZggcGF0aOyZgCDsg4jroZzsmrQgcGF0aOqwgCDri6TrpbTri6TrqbQoPeqwkuydtCDsnojrjZgg7Iqk7Yq466eB7J20IOuLpOuluCDqsJLsnbQg7J6I64qUIOyKpO2KuOungeycvOuhnCDrsJTrgIzqsowg65Cc64uk66m0KSDsl5Drn6zrpbwg7YSw65yo66Ck7KSN64uI64ukLlxuICogQHBhcmFtIGRlY29yYXRvck5hbWUg642w7L2U66CI7J207YSwIOydtOumhFxuICogQHBhcmFtIG1vZGVsTmFtZSDrqqjrjbgg7J2066aEXG4gKiBAcGFyYW0gbWV0aG9kTmFtZSDrqZTshJzrk5wg7J2066aEXG4gKiBAcGFyYW0gZXhpc3RpbmdQYXRoIOq4sOyhtOydmCBwYXRoXG4gKiBAcGFyYW0gbmV3UGF0aCDsg4jroZzsmrQgcGF0aFxuICovXG5mdW5jdGlvbiBhc3NlcnROb0NvbmZsaWN0aW5nUGF0aChcbiAgZGVjb3JhdG9yTmFtZTogc3RyaW5nLFxuICBtb2RlbE5hbWU6IHN0cmluZyxcbiAgbWV0aG9kTmFtZTogc3RyaW5nLFxuICBleGlzdGluZ1BhdGg6IHN0cmluZyxcbiAgbmV3UGF0aDogc3RyaW5nLFxuKSB7XG4gIGlmIChleGlzdGluZ1BhdGggIT09IFwiXCIgJiYgbmV3UGF0aCAhPT0gXCJcIiAmJiBleGlzdGluZ1BhdGggIT09IG5ld1BhdGgpIHtcbiAgICAvLyDsnbTqsoPsnbQg66y07IqoIOyDge2ZqeydtOuDkOuptOyalCwgYXBpLnBhdGjqsIAg642u7Ja07JSM7JuM7KeA64qUIOyDge2ZqeyeheuLiOuLpC5cbiAgICAvLyDqsIDroLkgQGFwaSh7IHBhdGg6IFwiL2FwaS92MS91c2Vyc1wiIH0pIOuNsOy9lOugiOydtO2EsOqwgCDrtpnslrTsnojripQg66mU7ISc65Oc7JeQXG4gICAgLy8gQHN0cmVhbSh7IHBhdGg6IFwiL2FwaS92MS91c2Vycy9zdHJlYW1cIiB9KSDqsJnsnYAg6rKD7J20IOu2meyWtCDsnojripQg7IOB7Zmp7J6F64uI64ukLlxuICAgIC8vIOydtOugh+qyjCDrkJjrqbQg65GQIOuNsOy9lOugiOydtO2EsOqwgCDqsJnsnYAgYXBp7J2YIHBhdGgg7ZWE65Oc66W8IOqxtOuTnOumrOqyjCDrkJjrr4DroZwsIOyXkOufrOulvCDthLDrnKjroKTspI3ri4jri6QuXG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgYEAke2RlY29yYXRvck5hbWV9IGRlY29yYXRvciBvbiAke21vZGVsTmFtZX0uJHttZXRob2ROYW1lfSBoYXMgY29uZmxpY3RpbmcgcGF0aDogJHtuZXdQYXRofS4gVGhlIGRlY29yYXRvciBpcyB0cnlpbmcgdG8gb3ZlcnJpZGUgdGhlIGV4aXN0aW5nIHBhdGgoJHtleGlzdGluZ1BhdGh9KSB3aXRoIHRoZSBuZXcgcGF0aCgke25ld1BhdGh9KS5gLFxuICAgICk7XG4gIH1cbn1cblxuLyoqXG4gKiDquLDsobTsnZgg7Ji17IWY6rO8IOyDiOuhnOyatCDsmLXshZjsnbQg6rK57LmY64qUIOu2gOu2hOydtCDsnojri6TrqbQg7JeQ65+s66W8IO2EsOucqOugpOykjeuLiOuLpC5cbiAqIEBwYXJhbSBkZWNvcmF0b3JOYW1lIOuNsOy9lOugiOydtO2EsCDsnbTrpoRcbiAqIEBwYXJhbSBtb2RlbE5hbWUg66qo6424IOydtOumhFxuICogQHBhcmFtIG1ldGhvZE5hbWUg66mU7ISc65OcIOydtOumhFxuICogQHBhcmFtIGV4aXN0aW5nT3B0aW9ucyDquLDsobTsnZgg7Ji17IWYXG4gKiBAcGFyYW0gbmV3T3B0aW9ucyDsg4jroZzsmrQg7Ji17IWYXG4gKi9cbmZ1bmN0aW9uIGFzc2VydE5vQ29uZmxpY3RpbmdPcHRpb25zKFxuICBkZWNvcmF0b3JOYW1lOiBzdHJpbmcsXG4gIG1vZGVsTmFtZTogc3RyaW5nLFxuICBtZXRob2ROYW1lOiBzdHJpbmcsXG4gIC8vIG94bGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55IC0tIDzslYQg7Im96rKM7Im96rKMIOyigCDqsJHsi5zri6Q+XG4gIGV4aXN0aW5nT3B0aW9uczogUmVjb3JkPHN0cmluZywgYW55PixcbiAgLy8gb3hsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnkgLS0gPOydtOuftCDrlYwg7JWE64uI66m0IGFueSDslrjsoJwg7JSB64uI6rmMPlxuICBuZXdPcHRpb25zOiBSZWNvcmQ8c3RyaW5nLCBhbnk+LFxuKSB7XG4gIE9iamVjdC5rZXlzKG5ld09wdGlvbnMpLmZvckVhY2goKGtleSkgPT4ge1xuICAgIGlmIChleGlzdGluZ09wdGlvbnNba2V5XSAmJiAhaXNFcXVhbChleGlzdGluZ09wdGlvbnNba2V5XSwgbmV3T3B0aW9uc1trZXldKSkge1xuICAgICAgLy8g7J206rKD7J20IOustOyKqCDsg4HtmansnbTrg5DrqbTsmpQsIGFwaS5vcHRpb25z6rCAIOuNruyWtOyUjOybjOyngOuKlCDsg4HtmansnoXri4jri6QuXG4gICAgICAvLyDqsIDroLkgQGFwaSh7IHJlc291cmNlTmFtZTogXCJVc2Vyc1wiIH0pIOuNsOy9lOugiOydtO2EsOqwgCDrtpnslrTsnojripQg66mU7ISc65Oc7JeQXG4gICAgICAvLyBAc3RyZWFtKHsgcmVzb3VyY2VOYW1lOiBcIlBvc3RzXCIgfSkg6rCZ7J2AIOqyg+ydtCDrtpnslrQg7J6I64qUIOyDge2ZqeyeheuLiOuLpC5cbiAgICAgIC8vIOydtOugh+qyjCDrkJjrqbQg65GQIOuNsOy9lOugiOydtO2EsOqwgCDqsJnsnYAgYXBp7J2YIG9wdGlvbnMg7IaNIOqwmeydgCDtlYTrk5zrpbwg6rG065Oc66as6rKMIOuQmOuvgOuhnCwg7JeQ65+s66W8IO2EsOucqOugpOykjeuLiOuLpC5cbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYEAke2RlY29yYXRvck5hbWV9IGRlY29yYXRvciBvbiAke21vZGVsTmFtZX0uJHttZXRob2ROYW1lfSBoYXMgY29uZmxpY3Rpbmcgb3B0aW9uczogJHtrZXl9LiBUaGUgZGVjb3JhdG9yIGlzIHRyeWluZyB0byBvdmVycmlkZSB0aGUgZXhpc3Rpbmcgb3B0aW9uKCR7SlNPTi5zdHJpbmdpZnkoZXhpc3RpbmdPcHRpb25zW2tleV0pfSkgd2l0aCB0aGUgbmV3IG9wdGlvbigke0pTT04uc3RyaW5naWZ5KG5ld09wdGlvbnNba2V5XSl9KS5gLFxuICAgICAgKTtcbiAgICB9XG4gIH0pO1xufVxuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7O0FBaUlBLFNBQVMscUJBQXFCLFFBQXlCLGFBQXFCLGVBQXVCO0NBQ2pHLE1BQU0sU0FBUyxPQUFPO0NBQ3RCLElBQUksUUFBUSxtQkFBbUIsUUFBUSxvQkFBb0IsZUFDekQsTUFBTSxJQUFJLE1BQ1IsSUFBSSxjQUFjLGVBQWUsT0FBTyxhQUFhLEVBQUUsc0NBQXNDLE9BQU8sWUFBWSxLQUFLLEdBQUcsWUFBWSw4RkFDdEk7TUFFQSxPQUFPLGtCQUFrQjtBQUU3QjtBQUVBLFNBQWdCLElBQUksVUFBK0IsQ0FBQyxHQUFHO0NBQ3JELFVBQVU7RUFDUixZQUFZO0VBQ1osYUFBYTtFQUNiLFNBQVMsQ0FBQyxPQUFPO0VBQ2pCLEdBQUc7Q0FDTDtDQUVBLFFBQVEsUUFBeUIsYUFBcUIsZUFBbUM7RUFDdkYsTUFBTSxZQUFZLDBCQUEwQixPQUFPLFlBQVksSUFBSTtFQUNuRSxPQUNFLFdBQ0EsOENBQThDLE9BQU8sWUFBWSxLQUFLLEdBQUcsYUFDM0U7RUFDQSxNQUFNLGFBQWE7RUFHbkIscUJBQXFCLFFBQVEsYUFBYSxnQkFBZ0IsR0FBRztFQUU3RCxNQUFNLGNBQWMsSUFBSSxXQUFXLFNBQ2pDLFVBQVUsUUFBUSxVQUFVLEVBQUUsQ0FBQyxDQUFDLFFBQVEsVUFBVSxFQUFFLEdBQ3BELElBQ0YsRUFBRSxHQUFHLFdBQVcsU0FBUyxhQUFhLElBQUk7RUFDMUMsTUFBTSxPQUFPLFFBQVEsUUFBUTtFQUc3QixNQUFNLGNBQWMsZUFBZSxNQUNoQyxRQUFRLElBQUksY0FBYyxhQUFhLElBQUksZUFBZSxVQUM3RDtFQUNBLElBQUksYUFBYTtHQUVmLHdCQUF3QixPQUFPLFdBQVcsWUFBWSxZQUFZLE1BQU0sSUFBSTtHQUM1RSxZ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
277
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGVjb3JhdG9ycy5qcyIsIm5hbWVzIjpbXSwic291cmNlcyI6WyIuLi8uLi9zcmMvYXBpL2RlY29yYXRvcnMudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IGFzc2VydCBmcm9tIFwiYXNzZXJ0XCI7XG5cbmltcG9ydCB7IHR5cGUgRmFzdGlmeU11bHRpcGFydEJhc2VPcHRpb25zIH0gZnJvbSBcIkBmYXN0aWZ5L211bHRpcGFydFwiO1xuaW1wb3J0IHsgZ2V0TG9nZ2VyIH0gZnJvbSBcIkBsb2d0YXBlL2xvZ3RhcGVcIjtcbmltcG9ydCB7IHR5cGUgSFRUUE1ldGhvZHMgfSBmcm9tIFwiZmFzdGlmeVwiO1xuaW1wb3J0IGluZmxlY3Rpb24gZnJvbSBcImluZmxlY3Rpb25cIjtcbmltcG9ydCB7IGlzRXF1YWwgfSBmcm9tIFwicmFkYXNoaVwiO1xuaW1wb3J0IHsgdHlwZSB6IH0gZnJvbSBcInpvZFwiO1xuXG5pbXBvcnQgeyB0eXBlIENhY2hlQ29udHJvbENvbmZpZyB9IGZyb20gXCIuLi9jYWNoZS1jb250cm9sL3R5cGVzXCI7XG5pbXBvcnQgeyB0eXBlIENvbXByZXNzQ29uZmlnIH0gZnJvbSBcIi4uL2NvbXByZXNzL3R5cGVzXCI7XG5pbXBvcnQgeyBCYXNlTW9kZWxDbGFzcyB9IGZyb20gXCIuLi9kYXRhYmFzZS9iYXNlLW1vZGVsXCI7XG5pbXBvcnQgeyBEQiB9IGZyb20gXCIuLi9kYXRhYmFzZS9kYlwiO1xuaW1wb3J0IHsgUHVyaVRyYW5zYWN0aW9uV3JhcHBlciB9IGZyb20gXCIuLi9kYXRhYmFzZS9wdXJpLXdyYXBwZXJcIjtcbmltcG9ydCB7IHR5cGUgVHJhbnNhY3Rpb25hbE9wdGlvbnMgfSBmcm9tIFwiLi4vZGF0YWJhc2UvcHVyaS13cmFwcGVyXCI7XG5pbXBvcnQgeyBVcHNlcnRCdWlsZGVyIH0gZnJvbSBcIi4uL2RhdGFiYXNlL3Vwc2VydC1idWlsZGVyXCI7XG5pbXBvcnQgeyBjb252ZXJ0RG9tYWluVG9DYXRlZ29yeSB9IGZyb20gXCIuLi9sb2dnZXIvY2F0ZWdvcnlcIjtcbmltcG9ydCB7IHR5cGUgRHJpdmVyS2V5IH0gZnJvbSBcIi4uL3N0b3JhZ2UvZHJpdmVyc1wiO1xuaW1wb3J0IHsgdHlwZSBLZXlHZW5lcmF0b3IgfSBmcm9tIFwiLi4vc3RvcmFnZS90eXBlc1wiO1xuaW1wb3J0IHsgdHlwZSBBcGlQYXJhbSwgdHlwZSBBcGlQYXJhbVR5cGUgfSBmcm9tIFwiLi4vdHlwZXMvdHlwZXNcIjtcbmltcG9ydCB7IGdldE1vZGVsTmFtZUZyb21DbGFzc05hbWUgfSBmcm9tIFwiLi4vdXRpbHMvY2xhc3MtbmFtZVwiO1xuaW1wb3J0IHsgQmFzZUZyYW1lQ2xhc3MgfSBmcm9tIFwiLi9iYXNlLWZyYW1lXCI7XG5cbmV4cG9ydCBpbnRlcmZhY2UgR3VhcmRLZXlzIHtcbiAgcXVlcnk6IHRydWU7XG4gIGFkbWluOiB0cnVlO1xuICB1c2VyOiB0cnVlO1xufVxuZXhwb3J0IHR5cGUgR3VhcmRLZXkgPSBrZXlvZiBHdWFyZEtleXM7XG5leHBvcnQgdHlwZSBTZXJ2aWNlQ2xpZW50ID1cbiAgfCBcImF4aW9zXCJcbiAgfCBcImF4aW9zLW11bHRpcGFydFwiXG4gIHwgXCJ0YW5zdGFjay1xdWVyeVwiXG4gIHwgXCJ0YW5zdGFjay1tdXRhdGlvblwiXG4gIHwgXCJ0YW5zdGFjay1tdXRhdGlvbi1tdWx0aXBhcnRcIlxuICB8IFwid2luZG93LWZldGNoXCI7XG5leHBvcnQgdHlwZSBBcGlEZWNvcmF0b3JPcHRpb25zID0ge1xuICBodHRwTWV0aG9kPzogSFRUUE1ldGhvZHM7XG4gIGNvbnRlbnRUeXBlPzpcbiAgICB8IFwidGV4dC9wbGFpblwiXG4gICAgfCBcInRleHQvaHRtbFwiXG4gICAgfCBcInRleHQveG1sXCJcbiAgICB8IFwiYXBwbGljYXRpb24vanNvblwiXG4gICAgfCBcImFwcGxpY2F0aW9uL29jdGV0LXN0cmVhbVwiO1xuICBjbGllbnRzPzogU2VydmljZUNsaWVudFtdO1xuICBwYXRoPzogc3RyaW5nO1xuICByZXNvdXJjZU5hbWU/OiBzdHJpbmc7XG4gIGd1YXJkcz86IEd1YXJkS2V5W107XG4gIGRlc2NyaXB0aW9uPzogc3RyaW5nO1xuICB0aW1lb3V0PzogbnVtYmVyO1xuICAvKiogQVBJIOydkeuLteydmCBDYWNoZS1Db250cm9sIO2XpOuNlCDshKTsoJUuIOyEpOygle2VmOyngCDslYrsnLzrqbQgY2FjaGVDb250cm9sSGFuZGxlciDrmJDripQg6riw67O46rCS7J20IOyggeyaqeuQqeuLiOuLpC4gKi9cbiAgY2FjaGVDb250cm9sPzogQ2FjaGVDb250cm9sQ29uZmlnO1xuICAvKiogQVBJIOydkeuLteydmCDslZXstpUg7ISk7KCVLiBmYWxzZeuhnCDshKTsoJXtlZjrqbQg7JWV7LaV7J2EIOu5hO2ZnOyEse2ZlO2VqeuLiOuLpC4gKi9cbiAgY29tcHJlc3M/OiBDb21wcmVzc0NvbmZpZztcbn07XG5leHBvcnQgdHlwZSBTdHJlYW1EZWNvcmF0b3JPcHRpb25zID0ge1xuICB0eXBlOiBcInNzZVwiO1xuICAvLyBveGxpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueSAtLSDsnbTrsqTtirgg7YKk67OE66GcIOuEmOqyqOyjvOuKlCDqsJLsnbTrr4DroZwg7Ja065akIO2DgOyeheydtOuToCDsg4HqtIDsl4bsnYxcbiAgZXZlbnRzOiB6LlpvZE9iamVjdDxhbnk+O1xuICBwYXRoPzogc3RyaW5nO1xuICByZXNvdXJjZU5hbWU/OiBzdHJpbmc7XG4gIGd1YXJkcz86IEd1YXJkS2V5W107XG4gIGRlc2NyaXB0aW9uPzogc3RyaW5nO1xufTtcbmV4cG9ydCB0eXBlIFdlYlNvY2tldERlY29yYXRvck9wdGlvbnMgPSB7XG4gIC8vIG94bGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55IC0tIOydtOuypO2KuCDtgqTrs4TroZwg64SY6rKo7KO864qUIOqwkuydtOuvgOuhnCDslrTrlqQg7YOA7J6F7J2065OgIOyDgeq0gOyXhuydjFxuICBvdXRFdmVudHM6IHouWm9kT2JqZWN0PGFueT47XG4gIC8vIG94bGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55IC0tIOydtOuypO2KuCDtgqTrs4TroZwg64SY6rKo7KO864qUIOqwkuydtOuvgOuhnCDslrTrlqQg7YOA7J6F7J2065OgIOyDgeq0gOyXhuydjFxuICBpbkV2ZW50czogei5ab2RPYmplY3Q8YW55PjtcbiAgcGF0aD86IHN0cmluZztcbiAgcmVzb3VyY2VOYW1lPzogc3RyaW5nO1xuICBndWFyZHM/OiBHdWFyZEtleVtdO1xuICBkZXNjcmlwdGlvbj86IHN0cmluZztcbiAgaGVhcnRiZWF0PzogbnVtYmVyO1xuICBuYW1lc3BhY2U/OiBzdHJpbmc7XG59O1xuZXhwb3J0IHR5cGUgUmVzb2x2ZWRXZWJTb2NrZXREZWNvcmF0b3JPcHRpb25zID0gV2ViU29ja2V0RGVjb3JhdG9yT3B0aW9ucyAmIHtcbiAgLy8gY29kZWdlbuydtCDtg4DsnoUg7J2066aE7J2EIOyerOyCrOyaqe2VoCDsiJgg7J6I64+E66GdIHN5bmNlcuqwgCBBU1Tsl5DshJwg67O06rCV7ZWY64qUIOuplO2DgOuNsOydtO2EsFxuICBvdXRFdmVudHNUeXBlUmVmPzogQXBpUGFyYW1UeXBlLlJlZjtcbiAgaW5FdmVudHNUeXBlUmVmPzogQXBpUGFyYW1UeXBlLlJlZjtcbn07XG5cbnR5cGUgQnVmZmVyVXBsb2FkT3B0aW9ucyA9IHtcbiAgY29uc3VtZT86IFwiYnVmZmVyXCI7XG59O1xudHlwZSBTdHJlYW1VcGxvYWRPcHRpb25zID0ge1xuICBjb25zdW1lOiBcInN0cmVhbVwiO1xuICBkZXN0aW5hdGlvbjogRHJpdmVyS2V5O1xuICBrZXlHZW5lcmF0b3I/OiBLZXlHZW5lcmF0b3I7XG59O1xuZXhwb3J0IHR5cGUgVXBsb2FkRGVjb3JhdG9yT3B0aW9ucyA9IHtcbiAgZ3VhcmRzPzogR3VhcmRLZXlbXTtcbiAgZGVzY3JpcHRpb24/OiBzdHJpbmc7XG4gIGxpbWl0cz86IEZhc3RpZnlNdWx0aXBhcnRCYXNlT3B0aW9uc1tcImxpbWl0c1wiXTtcbn0gJiAoQnVmZmVyVXBsb2FkT3B0aW9ucyB8IFN0cmVhbVVwbG9hZE9wdGlvbnMpO1xuXG5leHBvcnQgY29uc3QgcmVnaXN0ZXJlZEFwaXM6IHtcbiAgLyoqXG4gICAqIG1vZGVsTmFtZeydgCDrqqjrjbgg7YG0656Y7IqkIOydtOumhOyeheuLiOuLpC4gKGV4LiBcIlVzZXJNb2RlbFwiKVxuICAgKi9cbiAgbW9kZWxOYW1lOiBzdHJpbmc7XG4gIG1ldGhvZE5hbWU6IHN0cmluZztcbiAgcGF0aDogc3RyaW5nO1xuICBvcHRpb25zOiBBcGlEZWNvcmF0b3JPcHRpb25zO1xuICBzdHJlYW1PcHRpb25zPzogU3RyZWFtRGVjb3JhdG9yT3B0aW9ucztcbiAgd2Vic29ja2V0T3B0aW9ucz86IFJlc29sdmVkV2ViU29ja2V0RGVjb3JhdG9yT3B0aW9ucztcbiAgdXBsb2FkT3B0aW9ucz86IFVwbG9hZERlY29yYXRvck9wdGlvbnM7XG59W10gPSBbXTtcbmV4cG9ydCB0eXBlIEV4dGVuZGVkQXBpID0ge1xuICBtb2RlbE5hbWU6IHN0cmluZztcbiAgbWV0aG9kTmFtZTogc3RyaW5nO1xuICBwYXRoOiBzdHJpbmc7XG4gIG9wdGlvbnM6IEFwaURlY29yYXRvck9wdGlvbnM7XG4gIHN0cmVhbU9wdGlvbnM/OiBTdHJlYW1EZWNvcmF0b3JPcHRpb25zO1xuICB3ZWJzb2NrZXRPcHRpb25zPzogUmVzb2x2ZWRXZWJTb2NrZXREZWNvcmF0b3JPcHRpb25zO1xuICB1cGxvYWRPcHRpb25zPzogVXBsb2FkRGVjb3JhdG9yT3B0aW9ucztcbiAgdHlwZVBhcmFtZXRlcnM6IEFwaVBhcmFtVHlwZS5UeXBlUGFyYW1bXTtcbiAgcGFyYW1ldGVyczogQXBpUGFyYW1bXTtcbiAgcmV0dXJuVHlwZTogQXBpUGFyYW1UeXBlO1xufTtcbnR5cGUgRGVjb3JhdG9yVGFyZ2V0ID0geyBjb25zdHJ1Y3RvcjogeyBuYW1lOiBzdHJpbmcgfSB9O1xuXG5jb25zdCBkZWNvcmF0b3JUeXBlc0J5VGFyZ2V0ID0gbmV3IFdlYWtNYXA8RGVjb3JhdG9yVGFyZ2V0LCBNYXA8c3RyaW5nLCBzeW1ib2w+PigpO1xuXG5jb25zdCBERUNPUkFUT1JfVFlQRVMgPSB7XG4gIEFQSTogU3ltYm9sKFwiYXBpXCIpLFxuICBTVFJFQU06IFN5bWJvbChcInN0cmVhbVwiKSxcbiAgV0VCU09DS0VUOiBTeW1ib2woXCJ3ZWJzb2NrZXRcIiksXG4gIFVQTE9BRDogU3ltYm9sKFwidXBsb2FkXCIpLFxufSBhcyBjb25zdDtcblxuZnVuY3Rpb24gY2hlY2tTaW5nbGVEZWNvcmF0b3IodGFyZ2V0OiBEZWNvcmF0b3JUYXJnZXQsIHByb3BlcnR5S2V5OiBzdHJpbmcsIGRlY29yYXRvclR5cGU6IHN5bWJvbCkge1xuICBjb25zdCBkZWNvcmF0b3JUeXBlcyA9IGRlY29yYXRvclR5cGVzQnlUYXJnZXQuZ2V0KHRhcmdldCkgPz8gbmV3IE1hcDxzdHJpbmcsIHN5bWJvbD4oKTtcbiAgY29uc3QgZXhpc3RpbmdEZWNvcmF0b3JUeXBlID0gZGVjb3JhdG9yVHlwZXMuZ2V0KHByb3BlcnR5S2V5KTtcblxuICBpZiAoZXhpc3RpbmdEZWNvcmF0b3JUeXBlICYmIGV4aXN0aW5nRGVjb3JhdG9yVHlwZSAhPT0gZGVjb3JhdG9yVHlwZSkge1xuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgIGBAJHtkZWNvcmF0b3JUeXBlLmRlc2NyaXB0aW9uID8/IFN0cmluZyhkZWNvcmF0b3JUeXBlKX0gZGVjb3JhdG9yIGNhbiBvbmx5IGJlIHVzZWQgb25jZSBvbiAke3RhcmdldC5jb25zdHJ1Y3Rvci5uYW1lfS4ke3Byb3BlcnR5S2V5fS4gWW91IGNhbiB1c2Ugb25seSBvbmUgb2YgQGFwaSwgQHN0cmVhbSwgQHdlYnNvY2tldCwgb3IgQHVwbG9hZCBkZWNvcmF0b3Igb24gdGhlIHNhbWUgbWV0aG9kLmAsXG4gICAgKTtcbiAgfSBlbHNlIHtcbiAgICBkZWNvcmF0b3JUeXBlcy5zZXQocHJvcGVydHlLZXksIGRlY29yYXRvclR5cGUpO1xuICAgIGRlY29yYXRvclR5cGVzQnlUYXJnZXQuc2V0KHRhcmdldCwgZGVjb3JhdG9yVHlwZXMpO1xuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBhcGkob3B0aW9uczogQXBpRGVjb3JhdG9yT3B0aW9ucyA9IHt9KSB7XG4gIG9wdGlvbnMgPSB7XG4gICAgaHR0cE1ldGhvZDogXCJHRVRcIixcbiAgICBjb250ZW50VHlwZTogXCJhcHBsaWNhdGlvbi9qc29uXCIsXG4gICAgY2xpZW50czogW1wiYXhpb3NcIl0sXG4gICAgLi4ub3B0aW9ucyxcbiAgfTtcblxuICByZXR1cm4gKHRhcmdldDogRGVjb3JhdG9yVGFyZ2V0LCBwcm9wZXJ0eUtleTogc3RyaW5nLCBkZXNjcmlwdG9yOiBQcm9wZXJ0eURlc2NyaXB0b3IpID0+IHtcbiAgICBjb25zdCBtb2RlbE5hbWUgPSBnZXRNb2RlbE5hbWVGcm9tQ2xhc3NOYW1lKHRhcmdldC5jb25zdHJ1Y3Rvci5uYW1lKTtcbiAgICBhc3NlcnQoXG4gICAgICBtb2RlbE5hbWUsXG4gICAgICBgbW9kZWxOYW1lIGlzIHJlcXVpcmVkIG9uIEBhcGkgZGVjb3JhdG9yIG9uICR7dGFyZ2V0LmNvbnN0cnVjdG9yLm5hbWV9LiR7cHJvcGVydHlLZXl9YCxcbiAgICApO1xuICAgIGNvbnN0IG1ldGhvZE5hbWUgPSBwcm9wZXJ0eUtleTtcblxuICAgIC8vIOuplOyEnOuTnOyXkCDqsbjrprAg642w7L2U66CI7J207YSwIOykkeuztSDssrTtgaxcbiAgICBjaGVja1NpbmdsZURlY29yYXRvcih0YXJnZXQsIHByb3BlcnR5S2V5LCBERUNPUkFUT1JfVFlQRVMuQVBJKTtcblxuICAgIGNvbnN0IGRlZmF1bHRQYXRoID0gYC8ke2luZmxlY3Rpb24uY2FtZWxpemUoXG4gICAgICBtb2RlbE5hbWUucmVwbGFjZSgvTW9kZWwkLywgXCJcIikucmVwbGFjZSgvRnJhbWUkLywgXCJcIiksXG4gICAgICB0cnVlLFxuICAgICl9LyR7aW5mbGVjdGlvbi5jYW1lbGl6ZShwcm9wZXJ0eUtleSwgdHJ1ZSl9YDtcbiAgICBjb25zdCBwYXRoID0gb3B0aW9ucy5wYXRoID8/IGRlZmF1bHRQYXRoO1xuXG4gICAgLy8g6riw7KG0IOuPmeydvO2VnCDrqZTshJzrk5zqsIAg7J6I64qU7KeAIO2ZleyduCDtm4Qg7J6I64qUIOqyveyasCBvdmVycmlkZVxuICAgIGNvbnN0IGV4aXN0aW5nQXBpID0gcmVnaXN0ZXJlZEFwaXMuZmluZChcbiAgICAgIChyZWdpc3RlcmVkQXBpKSA9PlxuICAgICAgICByZWdpc3RlcmVkQXBpLm1vZGVsTmFtZSA9PT0gbW9kZWxOYW1lICYmIHJlZ2lzdGVyZWRBcGkubWV0aG9kTmFtZSA9PT0gbWV0aG9kTmFtZSxcbiAgICApO1xuICAgIGlmIChleGlzdGluZ0FwaSkge1xuICAgICAgLy8g6riw7KG07J2YIHBhdGjsmYAg7IOI66Gc7Jq0IHBhdGjqsIAg64uk66W064uk66m0KD3ruYgg7Iqk7Yq466eB7J20IOyVhOuLiOyXiOuKlOuNsCDri6Trpbgg7Iqk7Yq466eB7Jy866GcIOuwlOuAjOqyjCDrkJzri6TrqbQpIOyXkOufrOulvCDthLDrnKjroKTspI3ri4jri6QuXG4gICAgICBhc3NlcnROb0NvbmZsaWN0aW5nUGF0aChcImFwaVwiLCBtb2RlbE5hbWUsIG1ldGhvZE5hbWUsIGV4aXN0aW5nQXBpLnBhdGgsIHBhdGgpO1xuICAgICAgZXhpc3RpbmdBcGkucGF0aCA9IHBhdGg7XG5cbiAgICAgIC8vIOq4sOyhtOydmCDsmLXshZjqs7wg7IOI66Gc7Jq0IOyYteyFmOydtCDqsrnsuZjripQg67aA67aE7J20IOyeiOuLpOuptCDsl5Drn6zrpbwg7YSw65yo66Ck7KSN64uI64ukLlxuICAgICAgYXNzZXJ0Tm9Db25mbGljdGluZ09wdGlvbnMoXCJhcGlcIiwgbW9kZWxOYW1lLCBtZXRob2ROYW1lLCBleGlzdGluZ0FwaS5vcHRpb25zLCBvcHRpb25zKTtcbiAgICAgIGV4aXN0aW5nQXBpLm9wdGlvbnMgPSB7XG4gICAgICAgIC4uLmV4aXN0aW5nQXBpLm9wdGlvbnMsIC8vIOq4sOyhtOydmCDsmLXshZjsnYQg7KG07KSR7ZWY65CYXG4gICAgICAgIC4uLm9wdGlvbnMsIC8vIEBhcGkg642w7L2U66CI7J207YSw7J2YIOyYteyFmOydhCDstpTqsIDtlanri4jri6QuXG4gICAgICB9O1xuICAgIH0gZWxzZSB7XG4gICAgICByZWdpc3RlcmVkQXBpcy5wdXNoKHtcbiAgICAgICAgbW9kZWxOYW1lLFxuICAgICAgICBtZXRob2ROYW1lLFxuICAgICAgICBwYXRoLFxuICAgICAgICBvcHRpb25zLFxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgY29uc3Qgb3JpZ2luYWxNZXRob2QgPSBkZXNjcmlwdG9yLnZhbHVlO1xuICAgIGRlc2NyaXB0b3IudmFsdWUgPSBhc3luYyBmdW5jdGlvbiAodGhpczogQmFzZU1vZGVsQ2xhc3MgfCBCYXNlRnJhbWVDbGFzcywgLi4uYXJnczogdW5rbm93bltdKSB7XG4gICAgICBpZiAodGhpcyBpbnN0YW5jZW9mIEJhc2VNb2RlbENsYXNzKSB7XG4gICAgICAgIGdldExvZ2dlcihjb252ZXJ0RG9tYWluVG9DYXRlZ29yeSh0aGlzLm1vZGVsTmFtZSwgXCJtb2RlbFwiKSkuZGVidWcoXG4gICAgICAgICAgXCJhcGk6IHtodHRwTWV0aG9kfSB7bW9kZWx9LnttZXRob2R9XCIsXG4gICAgICAgICAge1xuICAgICAgICAgICAgaHR0cE1ldGhvZDogb3B0aW9ucy5odHRwTWV0aG9kLFxuICAgICAgICAgICAgbW9kZWw6IG1vZGVsTmFtZSxcbiAgICAgICAgICAgIG1ldGhvZDogbWV0aG9kTmFtZSxcbiAgICAgICAgICB9LFxuICAgICAgICApO1xuICAgICAgfVxuXG4gICAgICBpZiAodGhpcyBpbnN0YW5jZW9mIEJhc2VGcmFtZUNsYXNzKSB7XG4gICAgICAgIGdldExvZ2dlcihjb252ZXJ0RG9tYWluVG9DYXRlZ29yeSh0aGlzLmZyYW1lTmFtZSwgXCJmcmFtZVwiKSkuZGVidWcoXG4gICAgICAgICAgXCJhcGk6IHtodHRwTWV0aG9kfSB7bW9kZWx9LnttZXRob2R9XCIsXG4gICAgICAgICAge1xuICAgICAgICAgICAgaHR0cE1ldGhvZDogb3B0aW9ucy5odHRwTWV0aG9kLFxuICAgICAgICAgICAgbW9kZWw6IG1vZGVsTmFtZSxcbiAgICAgICAgICAgIG1ldGhvZDogbWV0aG9kTmFtZSxcbiAgICAgICAgICB9LFxuICAgICAgICApO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gb3JpZ2luYWxNZXRob2QuYXBwbHkodGhpcywgYXJncyk7XG4gICAgfTtcbiAgfTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHN0cmVhbShvcHRpb25zOiBTdHJlYW1EZWNvcmF0b3JPcHRpb25zKSB7XG4gIHJldHVybiAodGFyZ2V0OiBEZWNvcmF0b3JUYXJnZXQsIHByb3BlcnR5S2V5OiBzdHJpbmcsIGRlc2NyaXB0b3I6IFByb3BlcnR5RGVzY3JpcHRvcikgPT4ge1xuICAgIGNvbnN0IG1vZGVsTmFtZSA9IGdldE1vZGVsTmFtZUZyb21DbGFzc05hbWUodGFyZ2V0LmNvbnN0cnVjdG9yLm5hbWUpO1xuICAgIGFzc2VydChcbiAgICAgIG1vZGVsTmFtZSxcbiAgICAgIGBtb2RlbE5hbWUgaXMgcmVxdWlyZWQgb24gQHN0cmVhbSBkZWNvcmF0b3Igb24gJHt0YXJnZXQuY29uc3RydWN0b3IubmFtZX0uJHtwcm9wZXJ0eUtleX1gLFxuICAgICk7XG4gICAgY29uc3QgbWV0aG9kTmFtZSA9IHByb3BlcnR5S2V5O1xuXG4gICAgLy8g66mU7ISc65Oc7JeQIOqxuOumsCDrjbDsvZTroIjsnbTthLAg7KSR67O1IOyytO2BrFxuICAgIGNoZWNrU2luZ2xlRGVjb3JhdG9yKHRhcmdldCwgcHJvcGVydHlLZXksIERFQ09SQVRPUl9UWVBFUy5TVFJFQU0pO1xuXG4gICAgY29uc3QgZGVmYXVsdFBhdGggPSBgLyR7aW5mbGVjdGlvbi5jYW1lbGl6ZShcbiAgICAgIG1vZGVsTmFtZS5yZXBsYWNlKC9Nb2RlbCQvLCBcIlwiKS5yZXBsYWNlKC9GcmFtZSQvLCBcIlwiKSxcbiAgICAgIHRydWUsXG4gICAgKX0vJHtpbmZsZWN0aW9uLmNhbWVsaXplKHByb3BlcnR5S2V5LCB0cnVlKX1gO1xuICAgIGNvbnN0IHBhdGggPSBvcHRpb25zLnBhdGggPz8gZGVmYXVsdFBhdGg7XG4gICAgLy8gc3RyZWFtIOyghOyaqSDtlYTrk5woZXZlbnRzLCB0eXBlKeuKlCBBcGlEZWNvcmF0b3JPcHRpb25z7JeQIOyGje2VmOyngCDslYrsnLzrr4DroZwg7KCc7Jm4XG4gICAgY29uc3QgeyBldmVudHM6IF8sIHR5cGU6IF90eXBlLCAuLi5hcGlPcHRpb25zIH0gPSBvcHRpb25zO1xuICAgIGNvbnN0IG9wdGlvbnNXaXRoRGVmYXVsdHMgPSB7XG4gICAgICAuLi5hcGlPcHRpb25zLFxuICAgICAgaHR0cE1ldGhvZDpcbiAgICAgICAgLyogU0FGRVRZOiBBUEkg642w7L2U66CI7J207YSw7JmAIFpvZCDqsoDspp3quLAg65Ox66GdIOqzhOyVveydtCDsnbQg6rCS7J2YIO2DgOyeheydhCDrs7TsnqXtlZzri6QuICovIFwiR0VUXCIgYXMgSFRUUE1ldGhvZHMsXG4gICAgfTtcblxuICAgIGNvbnN0IGV4aXN0aW5nQXBpID0gcmVnaXN0ZXJlZEFwaXMuZmluZChcbiAgICAgIChyZWdpc3RlcmVkQXBpKSA9PlxuICAgICAgICByZWdpc3RlcmVkQXBpLm1vZGVsTmFtZSA9PT0gbW9kZWxOYW1lICYmIHJlZ2lzdGVyZWRBcGkubWV0aG9kTmFtZSA9PT0gbWV0aG9kTmFtZSxcbiAgICApO1xuICAgIGlmIChleGlzdGluZ0FwaSkge1xuICAgICAgLy8g6riw7KG07J2YIHBhdGjsmYAg7IOI66Gc7Jq0IHBhdGjqsIAg64uk66W064uk66m0KD3ruYgg7Iqk7Yq466eB7J20IOyVhOuLiOyXiOuKlOuNsCDri6Trpbgg7Iqk7Yq466eB7Jy866GcIOuwlOuAjOqyjCDrkJzri6TrqbQpIOyXkOufrOulvCDthLDrnKjroKTspI3ri4jri6QuXG4gICAgICBhc3NlcnROb0NvbmZsaWN0aW5nUGF0aChcInN0cmVhbVwiLCBtb2RlbE5hbWUsIG1ldGhvZE5hbWUsIGV4aXN0aW5nQXBpLnBhdGgsIHBhdGgpO1xuICAgICAgZXhpc3RpbmdBcGkucGF0aCA9IHBhdGg7XG5cbiAgICAgIC8vIOq4sOyhtOydmCDsmLXshZjqs7wg7IOI66Gc7Jq0IOyYteyFmOydtCDqsrnsuZjripQg67aA67aE7J20IOyeiOuLpOuptCDsl5Drn6zrpbwg7YSw65yo66Ck7KSN64uI64ukLlxuICAgICAgYXNzZXJ0Tm9Db25mbGljdGluZ09wdGlvbnMoXG4gICAgICAgIFwic3RyZWFtXCIsXG4gICAgICAgIG1vZGVsTmFtZSxcbiAgICAgICAgbWV0aG9kTmFtZSxcbiAgICAgICAgZXhpc3RpbmdBcGkub3B0aW9ucyxcbiAgICAgICAgb3B0aW9uc1dpdGhEZWZhdWx0cyxcbiAgICAgICk7XG4gICAgICBleGlzdGluZ0FwaS5vcHRpb25zID0ge1xuICAgICAgICAuLi5leGlzdGluZ0FwaS5vcHRpb25zLCAvLyDquLDsobTsnZgg7Ji17IWY7J2EIOyhtOykke2VmOuQmFxuICAgICAgICAuLi5vcHRpb25zV2l0aERlZmF1bHRzLCAvLyBAc3RyZWFtIOuNsOy9lOugiOydtO2EsOydmCDsmLXshZjsnYQg7LaU6rCA7ZWp64uI64ukLlxuICAgICAgfTtcblxuICAgICAgZXhpc3RpbmdBcGkuc3RyZWFtT3B0aW9ucyA9IG9wdGlvbnM7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJlZ2lzdGVyZWRBcGlzLnB1c2goe1xuICAgICAgICBtb2RlbE5hbWUsXG4gICAgICAgIG1ldGhvZE5hbWUsXG4gICAgICAgIHBhdGgsXG4gICAgICAgIG9wdGlvbnM6IG9wdGlvbnNXaXRoRGVmYXVsdHMsXG4gICAgICAgIHN0cmVhbU9wdGlvbnM6IG9wdGlvbnMsXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBjb25zdCBvcmlnaW5hbE1ldGhvZCA9IGRlc2NyaXB0b3IudmFsdWU7XG4gICAgZGVzY3JpcHRvci52YWx1ZSA9IGFzeW5jIGZ1bmN0aW9uICh0aGlzOiBCYXNlTW9kZWxDbGFzcyB8IEJhc2VGcmFtZUNsYXNzLCAuLi5hcmdzOiB1bmtub3duW10pIHtcbiAgICAgIGlmICh0aGlzIGluc3RhbmNlb2YgQmFzZU1vZGVsQ2xhc3MpIHtcbiAgICAgICAgZ2V0TG9nZ2VyKGNvbnZlcnREb21haW5Ub0NhdGVnb3J5KHRoaXMubW9kZWxOYW1lLCBcIm1vZGVsXCIpKS5kZWJ1ZyhcbiAgICAgICAgICBcInN0cmVhbToge21vZGVsfS57bWV0aG9kfVwiLFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIG1vZGVsOiBtb2RlbE5hbWUsXG4gICAgICAgICAgICBtZXRob2Q6IG1ldGhvZE5hbWUsXG4gICAgICAgICAgfSxcbiAgICAgICAgKTtcbiAgICAgIH1cblxuICAgICAgaWYgKHRoaXMgaW5zdGFuY2VvZiBCYXNlRnJhbWVDbGFzcykge1xuICAgICAgICBnZXRMb2dnZXIoY29udmVydERvbWFpblRvQ2F0ZWdvcnkodGhpcy5mcmFtZU5hbWUsIFwiZnJhbWVcIikpLmRlYnVnKFxuICAgICAgICAgIFwic3RyZWFtOiB7bW9kZWx9LnttZXRob2R9XCIsXG4gICAgICAgICAge1xuICAgICAgICAgICAgbW9kZWw6IG1vZGVsTmFtZSxcbiAgICAgICAgICAgIG1ldGhvZDogbWV0aG9kTmFtZSxcbiAgICAgICAgICB9LFxuICAgICAgICApO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gb3JpZ2luYWxNZXRob2QuYXBwbHkodGhpcywgYXJncyk7XG4gICAgfTtcbiAgfTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHdlYnNvY2tldChvcHRpb25zOiBXZWJTb2NrZXREZWNvcmF0b3JPcHRpb25zKSB7XG4gIHJldHVybiAodGFyZ2V0OiBEZWNvcmF0b3JUYXJnZXQsIHByb3BlcnR5S2V5OiBzdHJpbmcsIGRlc2NyaXB0b3I6IFByb3BlcnR5RGVzY3JpcHRvcikgPT4ge1xuICAgIGNvbnN0IG1vZGVsTmFtZSA9IGdldE1vZGVsTmFtZUZyb21DbGFzc05hbWUodGFyZ2V0LmNvbnN0cnVjdG9yLm5hbWUpO1xuICAgIGFzc2VydChcbiAgICAgIG1vZGVsTmFtZSxcbiAgICAgIGBtb2RlbE5hbWUgaXMgcmVxdWlyZWQgb24gQHdlYnNvY2tldCBkZWNvcmF0b3Igb24gJHt0YXJnZXQuY29uc3RydWN0b3IubmFtZX0uJHtwcm9wZXJ0eUtleX1gLFxuICAgICk7XG4gICAgY29uc3QgbWV0aG9kTmFtZSA9IHByb3BlcnR5S2V5O1xuXG4gICAgY2hlY2tTaW5nbGVEZWNvcmF0b3IodGFyZ2V0LCBwcm9wZXJ0eUtleSwgREVDT1JBVE9SX1RZUEVTLldFQlNPQ0tFVCk7XG5cbiAgICBjb25zdCBkZWZhdWx0UGF0aCA9IGAvJHtpbmZsZWN0aW9uLmNhbWVsaXplKFxuICAgICAgbW9kZWxOYW1lLnJlcGxhY2UoL01vZGVsJC8sIFwiXCIpLnJlcGxhY2UoL0ZyYW1lJC8sIFwiXCIpLFxuICAgICAgdHJ1ZSxcbiAgICApfS8ke2luZmxlY3Rpb24uY2FtZWxpemUocHJvcGVydHlLZXksIHRydWUpfWA7XG4gICAgY29uc3QgcGF0aCA9IG9wdGlvbnMucGF0aCA/PyBkZWZhdWx0UGF0aDtcbiAgICBjb25zdCB7IG91dEV2ZW50czogX291dEV2ZW50cywgaW5FdmVudHM6IF9pbkV2ZW50cywgLi4uYXBpT3B0aW9ucyB9ID0gb3B0aW9ucztcbiAgICBjb25zdCBvcHRpb25zV2l0aERlZmF1bHRzID0ge1xuICAgICAgLi4uYXBpT3B0aW9ucyxcbiAgICAgIGh0dHBNZXRob2Q6XG4gICAgICAgIC8qIFNBRkVUWTogQVBJIOuNsOy9lOugiOydtO2EsOyZgCBab2Qg6rKA7Kad6riwIOuTseuhnSDqs4Tslb3snbQg7J20IOqwkuydmCDtg4DsnoXsnYQg67O07J6l7ZWc64ukLiAqLyBcIkdFVFwiIGFzIEhUVFBNZXRob2RzLFxuICAgIH07XG5cbiAgICBjb25zdCBleGlzdGluZ0FwaSA9IHJlZ2lzdGVyZWRBcGlzLmZpbmQoXG4gICAgICAocmVnaXN0ZXJlZEFwaSkgPT5cbiAgICAgICAgcmVnaXN0ZXJlZEFwaS5tb2RlbE5hbWUgPT09IG1vZGVsTmFtZSAmJiByZWdpc3RlcmVkQXBpLm1ldGhvZE5hbWUgPT09IG1ldGhvZE5hbWUsXG4gICAgKTtcbiAgICBpZiAoZXhpc3RpbmdBcGkpIHtcbiAgICAgIGFzc2VydE5vQ29uZmxpY3RpbmdQYXRoKFwid2Vic29ja2V0XCIsIG1vZGVsTmFtZSwgbWV0aG9kTmFtZSwgZXhpc3RpbmdBcGkucGF0aCwgcGF0aCk7XG4gICAgICBleGlzdGluZ0FwaS5wYXRoID0gcGF0aDtcblxuICAgICAgYXNzZXJ0Tm9Db25mbGljdGluZ09wdGlvbnMoXG4gICAgICAgIFwid2Vic29ja2V0XCIsXG4gICAgICAgIG1vZGVsTmFtZSxcbiAgICAgICAgbWV0aG9kTmFtZSxcbiAgICAgICAgZXhpc3RpbmdBcGkub3B0aW9ucyxcbiAgICAgICAgb3B0aW9uc1dpdGhEZWZhdWx0cyxcbiAgICAgICk7XG4gICAgICBleGlzdGluZ0FwaS5vcHRpb25zID0ge1xuICAgICAgICAuLi5leGlzdGluZ0FwaS5vcHRpb25zLFxuICAgICAgICAuLi5vcHRpb25zV2l0aERlZmF1bHRzLFxuICAgICAgfTtcblxuICAgICAgZXhpc3RpbmdBcGkud2Vic29ja2V0T3B0aW9ucyA9IG9wdGlvbnM7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJlZ2lzdGVyZWRBcGlzLnB1c2goe1xuICAgICAgICBtb2RlbE5hbWUsXG4gICAgICAgIG1ldGhvZE5hbWUsXG4gICAgICAgIHBhdGgsXG4gICAgICAgIG9wdGlvbnM6IG9wdGlvbnNXaXRoRGVmYXVsdHMsXG4gICAgICAgIHdlYnNvY2tldE9wdGlvbnM6IG9wdGlvbnMsXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBjb25zdCBvcmlnaW5hbE1ldGhvZCA9IGRlc2NyaXB0b3IudmFsdWU7XG4gICAgZGVzY3JpcHRvci52YWx1ZSA9IGFzeW5jIGZ1bmN0aW9uICh0aGlzOiBCYXNlTW9kZWxDbGFzcyB8IEJhc2VGcmFtZUNsYXNzLCAuLi5hcmdzOiB1bmtub3duW10pIHtcbiAgICAgIGlmICh0aGlzIGluc3RhbmNlb2YgQmFzZU1vZGVsQ2xhc3MpIHtcbiAgICAgICAgZ2V0TG9nZ2VyKGNvbnZlcnREb21haW5Ub0NhdGVnb3J5KHRoaXMubW9kZWxOYW1lLCBcIm1vZGVsXCIpKS5kZWJ1ZyhcbiAgICAgICAgICBcIndlYnNvY2tldDoge21vZGVsfS57bWV0aG9kfVwiLFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIG1vZGVsOiBtb2RlbE5hbWUsXG4gICAgICAgICAgICBtZXRob2Q6IG1ldGhvZE5hbWUsXG4gICAgICAgICAgfSxcbiAgICAgICAgKTtcbiAgICAgIH1cblxuICAgICAgaWYgKHRoaXMgaW5zdGFuY2VvZiBCYXNlRnJhbWVDbGFzcykge1xuICAgICAgICBnZXRMb2dnZXIoY29udmVydERvbWFpblRvQ2F0ZWdvcnkodGhpcy5mcmFtZU5hbWUsIFwiZnJhbWVcIikpLmRlYnVnKFxuICAgICAgICAgIFwid2Vic29ja2V0OiB7bW9kZWx9LnttZXRob2R9XCIsXG4gICAgICAgICAge1xuICAgICAgICAgICAgbW9kZWw6IG1vZGVsTmFtZSxcbiAgICAgICAgICAgIG1ldGhvZDogbWV0aG9kTmFtZSxcbiAgICAgICAgICB9LFxuICAgICAgICApO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gb3JpZ2luYWxNZXRob2QuYXBwbHkodGhpcywgYXJncyk7XG4gICAgfTtcbiAgfTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHRyYW5zYWN0aW9uYWwob3B0aW9uczogVHJhbnNhY3Rpb25hbE9wdGlvbnMgPSB7fSkge1xuICBjb25zdCB7IGlzb2xhdGlvbiwgcmVhZE9ubHksIGRiUHJlc2V0ID0gXCJ3XCIgfSA9IG9wdGlvbnM7XG5cbiAgcmV0dXJuICh0YXJnZXQ6IERlY29yYXRvclRhcmdldCwgcHJvcGVydHlLZXk6IHN0cmluZywgZGVzY3JpcHRvcjogUHJvcGVydHlEZXNjcmlwdG9yKSA9PiB7XG4gICAgY29uc3Qgb3JpZ2luYWxNZXRob2QgPSBkZXNjcmlwdG9yLnZhbHVlO1xuICAgIGNvbnN0IG1vZGVsTmFtZSA9IGdldE1vZGVsTmFtZUZyb21DbGFzc05hbWUodGFyZ2V0LmNvbnN0cnVjdG9yLm5hbWUpO1xuICAgIGFzc2VydChcbiAgICAgIG1vZGVsTmFtZSxcbiAgICAgIGBtb2RlbE5hbWUgaXMgcmVxdWlyZWQgb24gQHRyYW5zYWN0aW9uYWwgZGVjb3JhdG9yIG9uICR7dGFyZ2V0LmNvbnN0cnVjdG9yLm5hbWV9LiR7cHJvcGVydHlLZXl9YCxcbiAgICApO1xuICAgIGNvbnN0IG1ldGhvZE5hbWUgPSBwcm9wZXJ0eUtleTtcblxuICAgIGRlc2NyaXB0b3IudmFsdWUgPSBhc3luYyBmdW5jdGlvbiAodGhpczogQmFzZU1vZGVsQ2xhc3MsIC4uLmFyZ3M6IHVua25vd25bXSkge1xuICAgICAgdGhpcy5sb2dnZXIuZGVidWcoXCJ0cmFuc2FjdGlvbmFsOiB7bW9kZWx9LnttZXRob2R9XCIsIHtcbiAgICAgICAgbW9kZWw6IG1vZGVsTmFtZSxcbiAgICAgICAgbWV0aG9kOiBtZXRob2ROYW1lLFxuICAgICAgfSk7XG5cbiAgICAgIC8vIO2VtOuLuSBwcmVzZXTsnZgg7Yq4656c7J6t7IWY7J20IOyXhuycvOuptCDsg4gg7Yq4656c7J6t7IWY6rO8IHNjb3Bl66W8IO2VqOq7mCDsi5zsnpHtlZzri6QuXG4gICAgICBjb25zdCBzdGFydFRyYW5zYWN0aW9uID0gYXN5bmMgKCkgPT4ge1xuICAgICAgICBjb25zdCBwdXJpID0gdGhpcy5nZXRQdXJpKGRiUHJlc2V0KTtcblxuICAgICAgICByZXR1cm4gcHVyaS5rbmV4LnRyYW5zYWN0aW9uKFxuICAgICAgICAgIGFzeW5jICh0cngpID0+IHtcbiAgICAgICAgICAgIHRoaXMubG9nZ2VyLmRlYnVnKFwibmV3IHRyYW5zYWN0aW9uIGNvbnRleHQ6IHtkYlByZXNldH1cIiwgeyBkYlByZXNldCB9KTtcbiAgICAgICAgICAgIGNvbnN0IHRyeFdyYXBwZXIgPSBuZXcgUHVyaVRyYW5zYWN0aW9uV3JhcHBlcih0cngsIG5ldyBVcHNlcnRCdWlsZGVyKCkpO1xuXG4gICAgICAgICAgICByZXR1cm4gREIucnVuV2l0aFRyYW5zYWN0aW9uU2NvcGUoZGJQcmVzZXQsIHRyeFdyYXBwZXIsICgpID0+XG4gICAgICAgICAgICAgIG9yaWdpbmFsTWV0aG9kLmFwcGx5KHRoaXMsIGFyZ3MpLFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9LFxuICAgICAgICAgIHsgaXNvbGF0aW9uTGV2ZWw6IGlzb2xhdGlvbiwgcmVhZE9ubHkgfSxcbiAgICAgICAgKTtcbiAgICAgIH07XG5cbiAgICAgIGNvbnN0IGV4aXN0aW5nVHJhbnNhY3Rpb24gPSBEQi50cmFuc2FjdGlvblN0b3JhZ2UuZ2V0U3RvcmUoKT8uZ2V0VHJhbnNhY3Rpb24oZGJQcmVzZXQpO1xuICAgICAgaWYgKGV4aXN0aW5nVHJhbnNhY3Rpb24pIHtcbiAgICAgICAgdGhpcy5sb2dnZXIuZGVidWcoXCJyZXVzZSB0cmFuc2FjdGlvbiBjb250ZXh0OiB7ZGJQcmVzZXR9XCIsIHsgZGJQcmVzZXQgfSk7XG4gICAgICAgIC8vIOuLpOuluCBwcmVzZXTsnbQg7JWI7Kq97JeQIOyeiOyWtOuPhCDsnbQg66mU7ISc65Oc6rCAIOyerOyCrOyaqe2VnCDtirjrnpzsnq3shZjsnYQg7ZiE7J6sIHNjb3Bl66GcIO2RnOyLnO2VnOuLpC5cbiAgICAgICAgcmV0dXJuIERCLnJ1bldpdGhUcmFuc2FjdGlvblNjb3BlKGRiUHJlc2V0LCBleGlzdGluZ1RyYW5zYWN0aW9uLCAoKSA9PlxuICAgICAgICAgIG9yaWdpbmFsTWV0aG9kLmFwcGx5KHRoaXMsIGFyZ3MpLFxuICAgICAgICApO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gc3RhcnRUcmFuc2FjdGlvbigpO1xuICAgIH07XG5cbiAgICByZXR1cm4gZGVzY3JpcHRvcjtcbiAgfTtcbn1cblxuLyoqXG4gKiDtjIzsnbwg7JeF66Gc65OcIEFQSeulvCDsg53shLHtlbTspI3ri4jri6QuIChAYXBpIOuNsOy9lOugiOydtO2EsCDsl4bsnbQg64+F66a97KCB7Jy866GcIOyCrOyaqSlcbiAqIEBwYXJhbSBvcHRpb25zXG4gKiBAcmV0dXJuc1xuICovXG5leHBvcnQgZnVuY3Rpb24gdXBsb2FkKG9wdGlvbnM6IFVwbG9hZERlY29yYXRvck9wdGlvbnMgPSB7IGNvbnN1bWU6IFwiYnVmZmVyXCIgfSkge1xuICByZXR1cm4gKHRhcmdldDogRGVjb3JhdG9yVGFyZ2V0LCBwcm9wZXJ0eUtleTogc3RyaW5nLCBkZXNjcmlwdG9yOiBQcm9wZXJ0eURlc2NyaXB0b3IpID0+IHtcbiAgICBjb25zdCBvcmlnaW5hbE1ldGhvZCA9IGRlc2NyaXB0b3IudmFsdWU7XG4gICAgY29uc3QgbW9kZWxOYW1lID0gZ2V0TW9kZWxOYW1lRnJvbUNsYXNzTmFtZSh0YXJnZXQuY29uc3RydWN0b3IubmFtZSk7XG4gICAgYXNzZXJ0KFxuICAgICAgbW9kZWxOYW1lLFxuICAgICAgYG1vZGVsTmFtZSBpcyByZXF1aXJlZCBvbiBAdXBsb2FkIGRlY29yYXRvciBvbiAke3RhcmdldC5jb25zdHJ1Y3Rvci5uYW1lfS4ke3Byb3BlcnR5S2V5fWAsXG4gICAgKTtcbiAgICBjb25zdCBtZXRob2ROYW1lID0gcHJvcGVydHlLZXk7XG5cbiAgICAvLyDrqZTshJzrk5zsl5Ag6rG466awIOuNsOy9lOugiOydtO2EsCDspJHrs7Ug7LK07YGsXG4gICAgY2hlY2tTaW5nbGVEZWNvcmF0b3IodGFyZ2V0LCBwcm9wZXJ0eUtleSwgREVDT1JBVE9SX1RZUEVTLlVQTE9BRCk7XG5cbiAgICBjb25zdCBkZWZhdWx0UGF0aCA9IGAvJHtpbmZsZWN0aW9uLmNhbWVsaXplKFxuICAgICAgbW9kZWxOYW1lLnJlcGxhY2UoL01vZGVsJC8sIFwiXCIpLnJlcGxhY2UoL0ZyYW1lJC8sIFwiXCIpLFxuICAgICAgdHJ1ZSxcbiAgICApfS8ke2luZmxlY3Rpb24uY2FtZWxpemUobWV0aG9kTmFtZSwgdHJ1ZSl9YDtcblxuICAgIC8vIHJlZ2lzdGVyZWRBcGlz7JeQ7IScIO2VtOuLuSBBUEkg7LC+7JWE7IScIHVwbG9hZE9wdGlvbnMg7LaU6rCAXG4gICAgY29uc3QgZXhpc3RpbmdBcGkgPSByZWdpc3RlcmVkQXBpcy5maW5kKFxuICAgICAgKHJlZ2lzdGVyZWRBcGkpID0+XG4gICAgICAgIHJlZ2lzdGVyZWRBcGkubW9kZWxOYW1lID09PSBtb2RlbE5hbWUgJiYgcmVnaXN0ZXJlZEFwaS5tZXRob2ROYW1lID09PSBtZXRob2ROYW1lLFxuICAgICk7XG5cbiAgICBpZiAoZXhpc3RpbmdBcGkpIHtcbiAgICAgIC8vIOyerOuTseuhnSDsi5wg7JeF66Gc65OcIOyYteyFmOunjCDqsLHsi6BcbiAgICAgIGV4aXN0aW5nQXBpLnVwbG9hZE9wdGlvbnMgPSBvcHRpb25zO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyDsg4jroZwg65Ox66GdXG4gICAgICByZWdpc3RlcmVkQXBpcy5wdXNoKHtcbiAgICAgICAgbW9kZWxOYW1lLFxuICAgICAgICBtZXRob2ROYW1lLFxuICAgICAgICBwYXRoOiBkZWZhdWx0UGF0aCxcbiAgICAgICAgb3B0aW9uczoge1xuICAgICAgICAgIGh0dHBNZXRob2Q6IFwiUE9TVFwiLFxuICAgICAgICAgIGNsaWVudHM6IFtcImF4aW9zLW11bHRpcGFydFwiLCBcInRhbnN0YWNrLW11dGF0aW9uLW11bHRpcGFydFwiXSxcbiAgICAgICAgICBndWFyZHM6IG9wdGlvbnMuZ3VhcmRzLFxuICAgICAgICAgIGRlc2NyaXB0aW9uOiBvcHRpb25zLmRlc2NyaXB0aW9uLFxuICAgICAgICB9LFxuICAgICAgICB1cGxvYWRPcHRpb25zOiBvcHRpb25zLFxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgZGVzY3JpcHRvci52YWx1ZSA9IGFzeW5jIGZ1bmN0aW9uICh0aGlzOiBCYXNlTW9kZWxDbGFzcyB8IEJhc2VGcmFtZUNsYXNzLCAuLi5hcmdzOiB1bmtub3duW10pIHtcbiAgICAgIGlmICh0aGlzIGluc3RhbmNlb2YgQmFzZU1vZGVsQ2xhc3MpIHtcbiAgICAgICAgZ2V0TG9nZ2VyKGNvbnZlcnREb21haW5Ub0NhdGVnb3J5KHRoaXMubW9kZWxOYW1lLCBcIm1vZGVsXCIpKS5kZWJ1ZyhcbiAgICAgICAgICBcInVwbG9hZDoge21vZGVsfS57bWV0aG9kfVwiLFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIG1vZGVsOiBtb2RlbE5hbWUsXG4gICAgICAgICAgICBtZXRob2Q6IG1ldGhvZE5hbWUsXG4gICAgICAgICAgfSxcbiAgICAgICAgKTtcbiAgICAgIH1cblxuICAgICAgaWYgKHRoaXMgaW5zdGFuY2VvZiBCYXNlRnJhbWVDbGFzcykge1xuICAgICAgICBnZXRMb2dnZXIoY29udmVydERvbWFpblRvQ2F0ZWdvcnkodGhpcy5mcmFtZU5hbWUsIFwiZnJhbWVcIikpLmRlYnVnKFxuICAgICAgICAgIFwidXBsb2FkOiB7bW9kZWx9LnttZXRob2R9XCIsXG4gICAgICAgICAge1xuICAgICAgICAgICAgbW9kZWw6IG1vZGVsTmFtZSxcbiAgICAgICAgICAgIG1ldGhvZDogbWV0aG9kTmFtZSxcbiAgICAgICAgICB9LFxuICAgICAgICApO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gb3JpZ2luYWxNZXRob2QuYXBwbHkodGhpcywgYXJncyk7XG4gICAgfTtcblxuICAgIHJldHVybiBkZXNjcmlwdG9yO1xuICB9O1xufVxuXG4vKipcbiAqIOq4sOyhtOydmCBwYXRo7JmAIOyDiOuhnOyatCBwYXRo6rCAIOuLpOultOuLpOuptCg96rCS7J20IOyeiOuNmCDsiqTtirjrp4HsnbQg64uk66W4IOqwkuydtCDsnojripQg7Iqk7Yq466eB7Jy866GcIOuwlOuAjOqyjCDrkJzri6TrqbQpIOyXkOufrOulvCDthLDrnKjroKTspI3ri4jri6QuXG4gKiBAcGFyYW0gZGVjb3JhdG9yTmFtZSDrjbDsvZTroIjsnbTthLAg7J2066aEXG4gKiBAcGFyYW0gbW9kZWxOYW1lIOuqqOuNuCDsnbTrpoRcbiAqIEBwYXJhbSBtZXRob2ROYW1lIOuplOyEnOuTnCDsnbTrpoRcbiAqIEBwYXJhbSBleGlzdGluZ1BhdGgg6riw7KG07J2YIHBhdGhcbiAqIEBwYXJhbSBuZXdQYXRoIOyDiOuhnOyatCBwYXRoXG4gKi9cbmZ1bmN0aW9uIGFzc2VydE5vQ29uZmxpY3RpbmdQYXRoKFxuICBkZWNvcmF0b3JOYW1lOiBzdHJpbmcsXG4gIG1vZGVsTmFtZTogc3RyaW5nLFxuICBtZXRob2ROYW1lOiBzdHJpbmcsXG4gIGV4aXN0aW5nUGF0aDogc3RyaW5nLFxuICBuZXdQYXRoOiBzdHJpbmcsXG4pIHtcbiAgaWYgKGV4aXN0aW5nUGF0aCAhPT0gXCJcIiAmJiBuZXdQYXRoICE9PSBcIlwiICYmIGV4aXN0aW5nUGF0aCAhPT0gbmV3UGF0aCkge1xuICAgIC8vIOydtOqyg+ydtCDrrLTsiqgg7IOB7Zmp7J2064OQ66m07JqULCBhcGkucGF0aOqwgCDrja7slrTslIzsm4zsp4DripQg7IOB7Zmp7J6F64uI64ukLlxuICAgIC8vIOqwgOuguSBAYXBpKHsgcGF0aDogXCIvYXBpL3YxL3VzZXJzXCIgfSkg642w7L2U66CI7J207YSw6rCAIOu2meyWtOyeiOuKlCDrqZTshJzrk5zsl5BcbiAgICAvLyBAc3RyZWFtKHsgcGF0aDogXCIvYXBpL3YxL3VzZXJzL3N0cmVhbVwiIH0pIOqwmeydgCDqsoPsnbQg67aZ7Ja0IOyeiOuKlCDsg4HtmansnoXri4jri6QuXG4gICAgLy8g7J2066CH6rKMIOuQmOuptCDrkZAg642w7L2U66CI7J207YSw6rCAIOqwmeydgCBhcGnsnZggcGF0aCDtlYTrk5zrpbwg6rG065Oc66as6rKMIOuQmOuvgOuhnCwg7JeQ65+s66W8IO2EsOucqOugpOykjeuLiOuLpC5cbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICBgQCR7ZGVjb3JhdG9yTmFtZX0gZGVjb3JhdG9yIG9uICR7bW9kZWxOYW1lfS4ke21ldGhvZE5hbWV9IGhhcyBjb25mbGljdGluZyBwYXRoOiAke25ld1BhdGh9LiBUaGUgZGVjb3JhdG9yIGlzIHRyeWluZyB0byBvdmVycmlkZSB0aGUgZXhpc3RpbmcgcGF0aCgke2V4aXN0aW5nUGF0aH0pIHdpdGggdGhlIG5ldyBwYXRoKCR7bmV3UGF0aH0pLmAsXG4gICAgKTtcbiAgfVxufVxuXG4vKipcbiAqIOq4sOyhtOydmCDsmLXshZjqs7wg7IOI66Gc7Jq0IOyYteyFmOydtCDqsrnsuZjripQg67aA67aE7J20IOyeiOuLpOuptCDsl5Drn6zrpbwg7YSw65yo66Ck7KSN64uI64ukLlxuICogQHBhcmFtIGRlY29yYXRvck5hbWUg642w7L2U66CI7J207YSwIOydtOumhFxuICogQHBhcmFtIG1vZGVsTmFtZSDrqqjrjbgg7J2066aEXG4gKiBAcGFyYW0gbWV0aG9kTmFtZSDrqZTshJzrk5wg7J2066aEXG4gKiBAcGFyYW0gZXhpc3RpbmdPcHRpb25zIOq4sOyhtOydmCDsmLXshZhcbiAqIEBwYXJhbSBuZXdPcHRpb25zIOyDiOuhnOyatCDsmLXshZhcbiAqL1xuZnVuY3Rpb24gYXNzZXJ0Tm9Db25mbGljdGluZ09wdGlvbnM8RXhpc3RpbmdPcHRpb25zIGV4dGVuZHMgb2JqZWN0LCBOZXdPcHRpb25zIGV4dGVuZHMgb2JqZWN0PihcbiAgZGVjb3JhdG9yTmFtZTogc3RyaW5nLFxuICBtb2RlbE5hbWU6IHN0cmluZyxcbiAgbWV0aG9kTmFtZTogc3RyaW5nLFxuICBleGlzdGluZ09wdGlvbnM6IEV4aXN0aW5nT3B0aW9ucyxcbiAgbmV3T3B0aW9uczogTmV3T3B0aW9ucyxcbikge1xuICBjb25zdCBleGlzdGluZ0VudHJpZXMgPSBuZXcgTWFwKE9iamVjdC5lbnRyaWVzKGV4aXN0aW5nT3B0aW9ucykpO1xuICBPYmplY3QuZW50cmllcyhuZXdPcHRpb25zKS5mb3JFYWNoKChba2V5LCBuZXdWYWx1ZV0pID0+IHtcbiAgICBjb25zdCBleGlzdGluZ1ZhbHVlID0gZXhpc3RpbmdFbnRyaWVzLmdldChrZXkpO1xuICAgIGlmIChleGlzdGluZ1ZhbHVlICYmICFpc0VxdWFsKGV4aXN0aW5nVmFsdWUsIG5ld1ZhbHVlKSkge1xuICAgICAgLy8g7J206rKD7J20IOustOyKqCDsg4HtmansnbTrg5DrqbTsmpQsIGFwaS5vcHRpb25z6rCAIOuNruyWtOyUjOybjOyngOuKlCDsg4HtmansnoXri4jri6QuXG4gICAgICAvLyDqsIDroLkgQGFwaSh7IHJlc291cmNlTmFtZTogXCJVc2Vyc1wiIH0pIOuNsOy9lOugiOydtO2EsOqwgCDrtpnslrTsnojripQg66mU7ISc65Oc7JeQXG4gICAgICAvLyBAc3RyZWFtKHsgcmVzb3VyY2VOYW1lOiBcIlBvc3RzXCIgfSkg6rCZ7J2AIOqyg+ydtCDrtpnslrQg7J6I64qUIOyDge2ZqeyeheuLiOuLpC5cbiAgICAgIC8vIOydtOugh+qyjCDrkJjrqbQg65GQIOuNsOy9lOugiOydtO2EsOqwgCDqsJnsnYAgYXBp7J2YIG9wdGlvbnMg7IaNIOqwmeydgCDtlYTrk5zrpbwg6rG065Oc66as6rKMIOuQmOuvgOuhnCwg7JeQ65+s66W8IO2EsOucqOugpOykjeuLiOuLpC5cbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYEAke2RlY29yYXRvck5hbWV9IGRlY29yYXRvciBvbiAke21vZGVsTmFtZX0uJHttZXRob2ROYW1lfSBoYXMgY29uZmxpY3Rpbmcgb3B0aW9uczogJHtrZXl9LiBUaGUgZGVjb3JhdG9yIGlzIHRyeWluZyB0byBvdmVycmlkZSB0aGUgZXhpc3Rpbmcgb3B0aW9uKCR7SlNPTi5zdHJpbmdpZnkoZXhpc3RpbmdWYWx1ZSl9KSB3aXRoIHRoZSBuZXcgb3B0aW9uKCR7SlNPTi5zdHJpbmdpZnkobmV3VmFsdWUpfSkuYCxcbiAgICAgICk7XG4gICAgfVxuICB9KTtcbn1cbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7OztBQW1JQSxTQUFTLHFCQUFxQixRQUF5QixhQUFxQixlQUF1QjtDQUNqRyxNQUFNLGlCQUFpQix1QkFBdUIsSUFBSSxNQUFNLHFCQUFLLElBQUksSUFBb0I7Q0FDckYsTUFBTSx3QkFBd0IsZUFBZSxJQUFJLFdBQVc7Q0FFNUQsSUFBSSx5QkFBeUIsMEJBQTBCLGVBQ3JELE1BQU0sSUFBSSxNQUNSLElBQUksY0FBYyxlQUFlLE9BQU8sYUFBYSxFQUFFLHNDQUFzQyxPQUFPLFlBQVks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
@@ -0,0 +1,36 @@
1
+ import { type z } from "zod";
2
+ import { type LoadedTypes } from "../syncer/module-loader";
3
+ import { fastifyCaster } from "./caster";
4
+ import { type NormalizedZodCompilerPolicy } from "./config";
5
+ import { type ExtendedApi } from "./decorators";
6
+ export type HttpRequestValue = string | number | boolean | bigint | Date | null | undefined | HttpRequestValue[] | {
7
+ [key: string]: HttpRequestValue;
8
+ };
9
+ export type HttpRequestParameters = Record<string, HttpRequestValue>;
10
+ export type HttpValidator = z.ZodType<object>;
11
+ type FastifyHttpValidator = ReturnType<typeof fastifyCaster>;
12
+ export type HttpValidatorRegistry = {
13
+ fingerprint: string;
14
+ validators: ReadonlyMap<string, HttpValidator>;
15
+ };
16
+ export declare function getHttpValidatorRouteKey(api: ExtendedApi): string;
17
+ export declare function getHttpValidatorRouteIdentifier(api: ExtendedApi): string;
18
+ export declare function getHttpValidatorFingerprint(apis: readonly ExtendedApi[]): string;
19
+ export declare function assertHttpValidatorRegistry(apis: readonly ExtendedApi[], registry: HttpValidatorRegistry): void;
20
+ export interface HttpValidatorDependencies {
21
+ createSchema(api: ExtendedApi, types: LoadedTypes): z.ZodObject;
22
+ applyCaster(schema: z.ZodObject): FastifyHttpValidator;
23
+ compileJit(validator: FastifyHttpValidator, options: {
24
+ eager: true;
25
+ }): Promise<FastifyHttpValidator>;
26
+ }
27
+ export declare const defaultHttpValidatorDependencies: HttpValidatorDependencies;
28
+ export declare function createHttpValidator(options: {
29
+ api: ExtendedApi;
30
+ policy: NormalizedZodCompilerPolicy;
31
+ types: LoadedTypes;
32
+ aotRegistry?: HttpValidatorRegistry;
33
+ allowAotSourceFallback?: boolean;
34
+ }, dependencies?: HttpValidatorDependencies): Promise<HttpValidator>;
35
+ export {};
36
+ //# sourceMappingURL=http-validator.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"http-validator.d.ts","sourceRoot":"","sources":["../../src/api/http-validator.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,KAAK,CAAC,EAAE,MAAM,KAAK,CAAC;AAE7B,OAAO,EAAE,KAAK,WAAW,EAAE,MAAM,yBAAyB,CAAC;AAE3D,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAEzC,OAAO,EAAE,KAAK,2BAA2B,EAAE,MAAM,UAAU,CAAC;AAC5D,OAAO,EAAE,KAAK,WAAW,EAAE,MAAM,cAAc,CAAC;AAEhD,MAAM,MAAM,gBAAgB,GACxB,MAAM,GACN,MAAM,GACN,OAAO,GACP,MAAM,GACN,IAAI,GACJ,IAAI,GACJ,SAAS,GACT,gBAAgB,EAAE,GAClB;IAAE,CAAC,GAAG,EAAE,MAAM,GAAG,gBAAgB,CAAA;CAAE,CAAC;AACxC,MAAM,MAAM,qBAAqB,GAAG,MAAM,CAAC,MAAM,EAAE,gBAAgB,CAAC,CAAC;AACrE,MAAM,MAAM,aAAa,GAAG,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;AAC9C,KAAK,oBAAoB,GAAG,UAAU,CAAC,OAAO,aAAa,CAAC,CAAC;AAC7D,MAAM,MAAM,qBAAqB,GAAG;IAClC,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,EAAE,WAAW,CAAC,MAAM,EAAE,aAAa,CAAC,CAAC;CAChD,CAAC;AAEF,wBAAgB,wBAAwB,CAAC,GAAG,EAAE,WAAW,GAAG,MAAM,CAEjE;AAED,wBAAgB,+BAA+B,CAAC,GAAG,EAAE,WAAW,GAAG,MAAM,CAExE;AAeD,wBAAgB,2BAA2B,CAAC,IAAI,EAAE,SAAS,WAAW,EAAE,GAAG,MAAM,CAUhF;AAED,wBAAgB,2BAA2B,CACzC,IAAI,EAAE,SAAS,WAAW,EAAE,EAC5B,QAAQ,EAAE,qBAAqB,GAC9B,IAAI,CAoBN;AAED,MAAM,WAAW,yBAAyB;IACxC,YAAY,CAAC,GAAG,EAAE,WAAW,EAAE,KAAK,EAAE,WAAW,GAAG,CAAC,CAAC,SAAS,CAAC;IAChE,WAAW,CAAC,MAAM,EAAE,CAAC,CAAC,SAAS,GAAG,oBAAoB,CAAC;IACvD,UAAU,CACR,SAAS,EAAE,oBAAoB,EAC/B,OAAO,EAAE;QAAE,KAAK,EAAE,IAAI,CAAA;KAAE,GACvB,OAAO,CAAC,oBAAoB,CAAC,CAAC;CAClC;AAED,eAAO,MAAM,gCAAgC,EAAE,yBAO9C,CAAC;AAEF,wBAAsB,mBAAmB,CACvC,OAAO,EAAE;IACP,GAAG,EAAE,WAAW,CAAC;IACjB,MAAM,EAAE,2BAA2B,CAAC;IACpC,KAAK,EAAE,WAAW,CAAC;IACnB,WAAW,CAAC,EAAE,qBAAqB,CAAC;IACpC,sBAAsB,CAAC,EAAE,OAAO,CAAC;CAClC,EACD,YAAY,GAAE,yBAA4D,GACzE,OAAO,CAAC,aAAa,CAAC,CAkCxB"}
@@ -0,0 +1,72 @@
1
+ import { __esmMin } from "../_virtual/_rolldown/runtime.js";
2
+ import { init_runtime_value, isObjectValue } from "../utils/runtime-value.js";
3
+ import { fastifyCaster, init_caster } from "./caster.js";
4
+ import { getZodObjectFromApi, init_code_converters } from "./code-converters.js";
5
+ import { createHash } from "node:crypto";
6
+ //#region src/api/http-validator.ts
7
+ function getHttpValidatorRouteKey(api) {
8
+ return JSON.stringify([
9
+ api.modelName,
10
+ api.methodName,
11
+ api.options.httpMethod ?? "GET",
12
+ api.path
13
+ ]);
14
+ }
15
+ function getHttpValidatorRouteIdentifier(api) {
16
+ return createHash("sha256").update(getHttpValidatorRouteKey(api)).digest("hex");
17
+ }
18
+ function stableJson(value) {
19
+ if (Array.isArray(value)) return `[${value.map((item) => stableJson(item)).join(",")}]`;
20
+ if (isObjectValue(value) && value !== null) return `{${Object.entries(value).toSorted(([left], [right]) => left.localeCompare(right)).map(([key, item]) => `${JSON.stringify(key)}:${stableJson(item)}`).join(",")}}`;
21
+ return JSON.stringify(value);
22
+ }
23
+ function getHttpValidatorFingerprint(apis) {
24
+ const metadata = apis.filter((api) => api.websocketOptions === void 0).map((api) => ({
25
+ key: getHttpValidatorRouteKey(api),
26
+ parameters: api.parameters,
27
+ typeParameters: api.typeParameters
28
+ })).toSorted((left, right) => left.key.localeCompare(right.key));
29
+ return createHash("sha256").update(stableJson(metadata)).digest("hex");
30
+ }
31
+ function assertHttpValidatorRegistry(apis, registry) {
32
+ const expectedApis = apis.filter((api) => api.websocketOptions === void 0);
33
+ const expectedFingerprint = getHttpValidatorFingerprint(expectedApis);
34
+ if (registry.fingerprint !== expectedFingerprint) throw new Error(`HTTP validator registry fingerprint mismatch: expected ${expectedFingerprint}, received ${registry.fingerprint}`);
35
+ const expectedKeys = new Set(expectedApis.map(getHttpValidatorRouteKey));
36
+ if (registry.validators.size !== expectedKeys.size) throw new Error(`HTTP validator registry coverage mismatch: expected ${expectedKeys.size}, received ${registry.validators.size}`);
37
+ for (const key of expectedKeys) if (!registry.validators.has(key)) throw new Error(`HTTP validator registry is missing ${key}`);
38
+ }
39
+ async function createHttpValidator(options, dependencies = defaultHttpValidatorDependencies) {
40
+ if (options.policy.api === "aot") {
41
+ const routeKey = getHttpValidatorRouteKey(options.api);
42
+ const compiled = options.aotRegistry?.validators.get(routeKey);
43
+ if (compiled !== void 0) return compiled;
44
+ if (options.allowAotSourceFallback === true) {} else throw new Error(`HTTP validator registry is missing ${routeKey}`);
45
+ }
46
+ const validator = dependencies.applyCaster(dependencies.createSchema(options.api, { ...options.types }));
47
+ if (options.policy.api !== "jit") return validator;
48
+ const originalParse = validator.parse;
49
+ const originalSafeParse = validator.safeParse;
50
+ const compiled = await dependencies.compileJit(validator, { eager: true });
51
+ if (compiled.parse === originalParse || compiled.safeParse === originalSafeParse) throw new Error(`validation.zodCompiler.api JIT compilation failed for ${getHttpValidatorRouteKey(options.api)}`);
52
+ return compiled;
53
+ }
54
+ var defaultHttpValidatorDependencies;
55
+ var init_http_validator = __esmMin((() => {
56
+ init_runtime_value();
57
+ init_caster();
58
+ init_code_converters();
59
+ defaultHttpValidatorDependencies = {
60
+ createSchema: getZodObjectFromApi,
61
+ applyCaster: fastifyCaster,
62
+ async compileJit(validator, options) {
63
+ const { jit } = await import("zod-compiler/jit");
64
+ return jit(validator, options);
65
+ }
66
+ };
67
+ }));
68
+ //#endregion
69
+ init_http_validator();
70
+ export { assertHttpValidatorRegistry, createHttpValidator, defaultHttpValidatorDependencies, getHttpValidatorFingerprint, getHttpValidatorRouteIdentifier, getHttpValidatorRouteKey, init_http_validator };
71
+
72
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaHR0cC12YWxpZGF0b3IuanMiLCJuYW1lcyI6W10sInNvdXJjZXMiOlsiLi4vLi4vc3JjL2FwaS9odHRwLXZhbGlkYXRvci50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBjcmVhdGVIYXNoIH0gZnJvbSBcIm5vZGU6Y3J5cHRvXCI7XG5cbmltcG9ydCB7IHR5cGUgeiB9IGZyb20gXCJ6b2RcIjtcblxuaW1wb3J0IHsgdHlwZSBMb2FkZWRUeXBlcyB9IGZyb20gXCIuLi9zeW5jZXIvbW9kdWxlLWxvYWRlclwiO1xuaW1wb3J0IHsgaXNPYmplY3RWYWx1ZSB9IGZyb20gXCIuLi91dGlscy9ydW50aW1lLXZhbHVlXCI7XG5pbXBvcnQgeyBmYXN0aWZ5Q2FzdGVyIH0gZnJvbSBcIi4vY2FzdGVyXCI7XG5pbXBvcnQgeyBnZXRab2RPYmplY3RGcm9tQXBpIH0gZnJvbSBcIi4vY29kZS1jb252ZXJ0ZXJzXCI7XG5pbXBvcnQgeyB0eXBlIE5vcm1hbGl6ZWRab2RDb21waWxlclBvbGljeSB9IGZyb20gXCIuL2NvbmZpZ1wiO1xuaW1wb3J0IHsgdHlwZSBFeHRlbmRlZEFwaSB9IGZyb20gXCIuL2RlY29yYXRvcnNcIjtcblxuZXhwb3J0IHR5cGUgSHR0cFJlcXVlc3RWYWx1ZSA9XG4gIHwgc3RyaW5nXG4gIHwgbnVtYmVyXG4gIHwgYm9vbGVhblxuICB8IGJpZ2ludFxuICB8IERhdGVcbiAgfCBudWxsXG4gIHwgdW5kZWZpbmVkXG4gIHwgSHR0cFJlcXVlc3RWYWx1ZVtdXG4gIHwgeyBba2V5OiBzdHJpbmddOiBIdHRwUmVxdWVzdFZhbHVlIH07XG5leHBvcnQgdHlwZSBIdHRwUmVxdWVzdFBhcmFtZXRlcnMgPSBSZWNvcmQ8c3RyaW5nLCBIdHRwUmVxdWVzdFZhbHVlPjtcbmV4cG9ydCB0eXBlIEh0dHBWYWxpZGF0b3IgPSB6LlpvZFR5cGU8b2JqZWN0PjtcbnR5cGUgRmFzdGlmeUh0dHBWYWxpZGF0b3IgPSBSZXR1cm5UeXBlPHR5cGVvZiBmYXN0aWZ5Q2FzdGVyPjtcbmV4cG9ydCB0eXBlIEh0dHBWYWxpZGF0b3JSZWdpc3RyeSA9IHtcbiAgZmluZ2VycHJpbnQ6IHN0cmluZztcbiAgdmFsaWRhdG9yczogUmVhZG9ubHlNYXA8c3RyaW5nLCBIdHRwVmFsaWRhdG9yPjtcbn07XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRIdHRwVmFsaWRhdG9yUm91dGVLZXkoYXBpOiBFeHRlbmRlZEFwaSk6IHN0cmluZyB7XG4gIHJldHVybiBKU09OLnN0cmluZ2lmeShbYXBpLm1vZGVsTmFtZSwgYXBpLm1ldGhvZE5hbWUsIGFwaS5vcHRpb25zLmh0dHBNZXRob2QgPz8gXCJHRVRcIiwgYXBpLnBhdGhdKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldEh0dHBWYWxpZGF0b3JSb3V0ZUlkZW50aWZpZXIoYXBpOiBFeHRlbmRlZEFwaSk6IHN0cmluZyB7XG4gIHJldHVybiBjcmVhdGVIYXNoKFwic2hhMjU2XCIpLnVwZGF0ZShnZXRIdHRwVmFsaWRhdG9yUm91dGVLZXkoYXBpKSkuZGlnZXN0KFwiaGV4XCIpO1xufVxuXG5mdW5jdGlvbiBzdGFibGVKc29uPFZhbHVlPih2YWx1ZTogVmFsdWUpOiBzdHJpbmcge1xuICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcbiAgICByZXR1cm4gYFske3ZhbHVlLm1hcCgoaXRlbSkgPT4gc3RhYmxlSnNvbihpdGVtKSkuam9pbihcIixcIil9XWA7XG4gIH1cbiAgaWYgKGlzT2JqZWN0VmFsdWUodmFsdWUpICYmIHZhbHVlICE9PSBudWxsKSB7XG4gICAgcmV0dXJuIGB7JHtPYmplY3QuZW50cmllcyh2YWx1ZSlcbiAgICAgIC50b1NvcnRlZCgoW2xlZnRdLCBbcmlnaHRdKSA9PiBsZWZ0LmxvY2FsZUNvbXBhcmUocmlnaHQpKVxuICAgICAgLm1hcCgoW2tleSwgaXRlbV0pID0+IGAke0pTT04uc3RyaW5naWZ5KGtleSl9OiR7c3RhYmxlSnNvbihpdGVtKX1gKVxuICAgICAgLmpvaW4oXCIsXCIpfX1gO1xuICB9XG4gIHJldHVybiBKU09OLnN0cmluZ2lmeSh2YWx1ZSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRIdHRwVmFsaWRhdG9yRmluZ2VycHJpbnQoYXBpczogcmVhZG9ubHkgRXh0ZW5kZWRBcGlbXSk6IHN0cmluZyB7XG4gIGNvbnN0IG1ldGFkYXRhID0gYXBpc1xuICAgIC5maWx0ZXIoKGFwaSkgPT4gYXBpLndlYnNvY2tldE9wdGlvbnMgPT09IHVuZGVmaW5lZClcbiAgICAubWFwKChhcGkpID0+ICh7XG4gICAgICBrZXk6IGdldEh0dHBWYWxpZGF0b3JSb3V0ZUtleShhcGkpLFxuICAgICAgcGFyYW1ldGVyczogYXBpLnBhcmFtZXRlcnMsXG4gICAgICB0eXBlUGFyYW1ldGVyczogYXBpLnR5cGVQYXJhbWV0ZXJzLFxuICAgIH0pKVxuICAgIC50b1NvcnRlZCgobGVmdCwgcmlnaHQpID0+IGxlZnQua2V5LmxvY2FsZUNvbXBhcmUocmlnaHQua2V5KSk7XG4gIHJldHVybiBjcmVhdGVIYXNoKFwic2hhMjU2XCIpLnVwZGF0ZShzdGFibGVKc29uKG1ldGFkYXRhKSkuZGlnZXN0KFwiaGV4XCIpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gYXNzZXJ0SHR0cFZhbGlkYXRvclJlZ2lzdHJ5KFxuICBhcGlzOiByZWFkb25seSBFeHRlbmRlZEFwaVtdLFxuICByZWdpc3RyeTogSHR0cFZhbGlkYXRvclJlZ2lzdHJ5LFxuKTogdm9pZCB7XG4gIGNvbnN0IGV4cGVjdGVkQXBpcyA9IGFwaXMuZmlsdGVyKChhcGkpID0+IGFwaS53ZWJzb2NrZXRPcHRpb25zID09PSB1bmRlZmluZWQpO1xuICBjb25zdCBleHBlY3RlZEZpbmdlcnByaW50ID0gZ2V0SHR0cFZhbGlkYXRvckZpbmdlcnByaW50KGV4cGVjdGVkQXBpcyk7XG4gIGlmIChyZWdpc3RyeS5maW5nZXJwcmludCAhPT0gZXhwZWN0ZWRGaW5nZXJwcmludCkge1xuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgIGBIVFRQIHZhbGlkYXRvciByZWdpc3RyeSBmaW5nZXJwcmludCBtaXNtYXRjaDogZXhwZWN0ZWQgJHtleHBlY3RlZEZpbmdlcnByaW50fSwgcmVjZWl2ZWQgJHtyZWdpc3RyeS5maW5nZXJwcmludH1gLFxuICAgICk7XG4gIH1cblxuICBjb25zdCBleHBlY3RlZEtleXMgPSBuZXcgU2V0KGV4cGVjdGVkQXBpcy5tYXAoZ2V0SHR0cFZhbGlkYXRvclJvdXRlS2V5KSk7XG4gIGlmIChyZWdpc3RyeS52YWxpZGF0b3JzLnNpemUgIT09IGV4cGVjdGVkS2V5cy5zaXplKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgYEhUVFAgdmFsaWRhdG9yIHJlZ2lzdHJ5IGNvdmVyYWdlIG1pc21hdGNoOiBleHBlY3RlZCAke2V4cGVjdGVkS2V5cy5zaXplfSwgcmVjZWl2ZWQgJHtyZWdpc3RyeS52YWxpZGF0b3JzLnNpemV9YCxcbiAgICApO1xuICB9XG4gIGZvciAoY29uc3Qga2V5IG9mIGV4cGVjdGVkS2V5cykge1xuICAgIGlmICghcmVnaXN0cnkudmFsaWRhdG9ycy5oYXMoa2V5KSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBIVFRQIHZhbGlkYXRvciByZWdpc3RyeSBpcyBtaXNzaW5nICR7a2V5fWApO1xuICAgIH1cbiAgfVxufVxuXG5leHBvcnQgaW50ZXJmYWNlIEh0dHBWYWxpZGF0b3JEZXBlbmRlbmNpZXMge1xuICBjcmVhdGVTY2hlbWEoYXBpOiBFeHRlbmRlZEFwaSwgdHlwZXM6IExvYWRlZFR5cGVzKTogei5ab2RPYmplY3Q7XG4gIGFwcGx5Q2FzdGVyKHNjaGVtYTogei5ab2RPYmplY3QpOiBGYXN0aWZ5SHR0cFZhbGlkYXRvcjtcbiAgY29tcGlsZUppdChcbiAgICB2YWxpZGF0b3I6IEZhc3RpZnlIdHRwVmFsaWRhdG9yLFxuICAgIG9wdGlvbnM6IHsgZWFnZXI6IHRydWUgfSxcbiAgKTogUHJvbWlzZTxGYXN0aWZ5SHR0cFZhbGlkYXRvcj47XG59XG5cbmV4cG9ydCBjb25zdCBkZWZhdWx0SHR0cFZhbGlkYXRvckRlcGVuZGVuY2llczogSHR0cFZhbGlkYXRvckRlcGVuZGVuY2llcyA9IHtcbiAgY3JlYXRlU2NoZW1hOiBnZXRab2RPYmplY3RGcm9tQXBpLFxuICBhcHBseUNhc3RlcjogZmFzdGlmeUNhc3RlcixcbiAgYXN5bmMgY29tcGlsZUppdCh2YWxpZGF0b3IsIG9wdGlvbnMpIHtcbiAgICBjb25zdCB7IGppdCB9ID0gYXdhaXQgaW1wb3J0KFwiem9kLWNvbXBpbGVyL2ppdFwiKTtcbiAgICByZXR1cm4gaml0KHZhbGlkYXRvciwgb3B0aW9ucyk7XG4gIH0sXG59O1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gY3JlYXRlSHR0cFZhbGlkYXRvcihcbiAgb3B0aW9uczoge1xuICAgIGFwaTogRXh0ZW5kZWRBcGk7XG4gICAgcG9saWN5OiBOb3JtYWxpemVkWm9kQ29tcGlsZXJQb2xpY3k7XG4gICAgdHlwZXM6IExvYWRlZFR5cGVzO1xuICAgIGFvdFJlZ2lzdHJ5PzogSHR0cFZhbGlkYXRvclJlZ2lzdHJ5O1xuICAgIGFsbG93QW90U291cmNlRmFsbGJhY2s/OiBib29sZWFuO1xuICB9LFxuICBkZXBlbmRlbmNpZXM6IEh0dHBWYWxpZGF0b3JEZXBlbmRlbmNpZXMgPSBkZWZhdWx0SHR0cFZhbGlkYXRvckRlcGVuZGVuY2llcyxcbik6IFByb21pc2U8SHR0cFZhbGlkYXRvcj4ge1xuICBpZiAob3B0aW9ucy5wb2xpY3kuYXBpID09PSBcImFvdFwiKSB7XG4gICAgY29uc3Qgcm91dGVLZXkgPSBnZXRIdHRwVmFsaWRhdG9yUm91dGVLZXkob3B0aW9ucy5hcGkpO1xuICAgIGNvbnN0IGNvbXBpbGVkID0gb3B0aW9ucy5hb3RSZWdpc3RyeT8udmFsaWRhdG9ycy5nZXQocm91dGVLZXkpO1xuICAgIGlmIChjb21waWxlZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXR1cm4gY29tcGlsZWQ7XG4gICAgfVxuICAgIGlmIChvcHRpb25zLmFsbG93QW90U291cmNlRmFsbGJhY2sgPT09IHRydWUpIHtcbiAgICAgIC8vIHNvdXJjZSBkZXbsl5DshJzripQgYnVpbGQgcmVnaXN0cnnrpbwg7Iuk7ZaJ7ZWY7KeAIOyViuycvOuvgOuhnCBjYWNoZWQgcGxhaW4gdmFsaWRhdG9y66GcIOuMgOyytO2VqeuLiOuLpC5cbiAgICB9IGVsc2Uge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBIVFRQIHZhbGlkYXRvciByZWdpc3RyeSBpcyBtaXNzaW5nICR7cm91dGVLZXl9YCk7XG4gICAgfVxuICB9XG5cbiAgLy8gR2VuZXJpYyB0eXBlIHBhcmFtZXRlciDsspjrpqwg7KSRIOqzteycoCByZWZlcmVuY2Vz6rCAIOuwlOuAjOuvgOuhnCByb3V0ZeuniOuLpCDsgqzrs7jsnYQg64SY6rmB64uI64ukLlxuICBjb25zdCB2YWxpZGF0b3IgPSBkZXBlbmRlbmNpZXMuYXBwbHlDYXN0ZXIoXG4gICAgZGVwZW5kZW5jaWVzLmNyZWF0ZVNjaGVtYShvcHRpb25zLmFwaSwgeyAuLi5vcHRpb25zLnR5cGVzIH0pLFxuICApO1xuICBpZiAob3B0aW9ucy5wb2xpY3kuYXBpICE9PSBcImppdFwiKSB7XG4gICAgcmV0dXJuIHZhbGlkYXRvcjtcbiAgfVxuXG4gIGNvbnN0IG9yaWdpbmFsUGFyc2UgPSB2YWxpZGF0b3IucGFyc2U7XG4gIGNvbnN0IG9yaWdpbmFsU2FmZVBhcnNlID0gdmFsaWRhdG9yLnNhZmVQYXJzZTtcbiAgY29uc3QgY29tcGlsZWQgPSBhd2FpdCBkZXBlbmRlbmNpZXMuY29tcGlsZUppdCh2YWxpZGF0b3IsIHsgZWFnZXI6IHRydWUgfSk7XG5cbiAgLy8gdXBzdHJlYW0gSklU64qUIOy7tO2MjOydvCDsi6TtjKjrpbwg7Iio6riw66+A66GcIOqzteqwnCDrqZTshJzrk5wg7ISk7LmYIOyXrOu2gOulvCDsp4HsoJEg7ZmV7J247ZWp64uI64ukLlxuICBpZiAoY29tcGlsZWQucGFyc2UgPT09IG9yaWdpbmFsUGFyc2UgfHwgY29tcGlsZWQuc2FmZVBhcnNlID09PSBvcmlnaW5hbFNhZmVQYXJzZSkge1xuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgIGB2YWxpZGF0aW9uLnpvZENvbXBpbGVyLmFwaSBKSVQgY29tcGlsYXRpb24gZmFpbGVkIGZvciAke2dldEh0dHBWYWxpZGF0b3JSb3V0ZUtleShvcHRpb25zLmFwaSl9YCxcbiAgICApO1xuICB9XG5cbiAgcmV0dXJuIGNvbXBpbGVkO1xufVxuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7QUE2QkEsU0FBZ0IseUJBQXlCLEtBQTBCO0NBQ2pFLE9BQU8sS0FBSyxVQUFVO0VBQUMsSUFBSTtFQUFXLElBQUk7RUFBWSxJQUFJLFFBQVEsY0FBYztFQUFPLElBQUk7Q0FBSSxDQUFDO0FBQ2xHO0FBRUEsU0FBZ0IsZ0NBQWdDLEtBQTBCO0NBQ3hFLE9BQU8sV0FBVyxRQUFRLENBQUMsQ0FBQyxPQUFPLHlCQUF5QixHQUFHLENBQUMsQ0FBQyxDQUFDLE9BQU8sS0FBSztBQUNoRjtBQUVBLFNBQVMsV0FBa0IsT0FBc0I7Q0FDL0MsSUFBSSxNQUFNLFFBQVEsS0FBSyxHQUNyQixPQUFPLElBQUksTUFBTSxLQUFLLFNBQVMsV0FBVyxJQUFJLENBQUMsQ0FBQyxDQUFDLEtBQUssR0FBRyxFQUFFO0NBRTdELElBQUksY0FBYyxLQUFLLEtBQUssVUFBVSxNQUNwQyxPQUFPLElBQUksT0FBTyxRQUFRLEtBQUssQ0FBQyxDQUM3QixVQUFVLENBQUMsT0FBTyxDQUFDLFdBQVcsS0FBSyxjQUFjLEtBQUssQ0FBQyxDQUFDLENBQ3hELEtBQUssQ0FBQyxLQUFLLFVBQVUsR0FBRyxLQUFLLFVBQVUsR0FBRyxFQUFFLEdBQUcsV0FBVyxJQUFJLEdBQUcsQ0FBQyxDQUNsRSxLQUFLLEdBQUcsRUFBRTtDQUVmLE9BQU8sS0FBSyxVQUFVLEtBQUs7QUFDN0I7QUFFQSxTQUFnQiw0QkFBNEIsTUFBc0M7Q0FDaEYsTUFBTSxXQUFXLEtBQ2QsUUFBUSxRQUFRLElBQUkscUJBQXFCLE1BQVMsQ0FBQyxDQUNuRCxLQUFLLFNBQVM7RUFDYixLQUFLLHlCQUF5QixHQUFHO0VBQ2pDLFlBQVksSUFBSTtFQUNoQixnQkFBZ0IsSUFBSTtDQUN0QixFQUFFLENBQUMsQ0FDRixVQUFVLE1BQU0sVUFBVSxLQUFLLElBQUksY0FBYyxNQUFNLEdBQUcsQ0FBQztDQUM5RCxPQUFPLFdBQVcsUUFBUSxDQUFDLENBQUMsT0FBTyxXQUFXLFFBQVEsQ0FBQyxDQUFDLENBQUMsT0FBTyxLQUFLO0FBQ3ZFO0FBRUEsU0FBZ0IsNEJBQ2QsTUFDQSxVQUNNO0NBQ04sTUFBTSxlQUFlLEtBQUssUUFBUSxRQUFRLElBQUkscUJBQXFCLE1BQVM7Q0FDNUUsTUFBTSxzQkFBc0IsNEJBQTRCLFlBQVk7Q0FDcEUsSUFBSSxTQUFTLGdCQUFnQixxQkFDM0IsTUFBTSxJQUFJLE1BQ1IsMERBQTBELG9CQUFvQixhQUFhLFNBQVMsYUFDdEc7Q0FHRixNQUFNLGVBQWUsSUFBSSxJQUFJLGFBQWEsSUFBSSx3QkFBd0IsQ0FBQztDQUN2RSxJQUFJLFNBQVMsV0FBVyxTQUFTLGFBQWEsTUFDNUMsTUFBTSxJQUFJLE1BQ1IsdURBQXVELGFBQWEsS0FBSyxhQUFhLFNBQVMsV0FBVyxNQUM1RztDQUVGLEtBQUssTUFBTSxPQUFPLGNBQ2hCLElBQUksQ0FBQyxTQUFTLFdBQVcsSUFBSSxHQUFHLEdBQzlCLE1BQU0sSUFBSSxNQUFNLHNDQUFzQyxLQUFLO0FBR2pFO0FBb0JBLGVBQXNCLG9CQUNwQixTQU9BLGVBQTBDLGtDQUNsQjtDQUN4QixJQUFJLFFBQVEsT0FBTyxRQUFRLE9BQU87RUFDaEMsTUFBTSxXQUFXLHlCQUF5QixRQUFRLEdBQUc7RUFDckQsTUFBTSxXQUFXLFFBQVEsYUFBYSxXQUFXLElBQUksUUFBUTtFQUM3RCxJQUFJLGFBQWEsUUFDZixPQUFPO0VBRVQsSUFBSSxRQUFRLDJCQUEyQixNQUFNLENBRTdDLE9BQ0UsTUFBTSxJQUFJLE1BQU0sc0NBQXNDLFVBQVU7Q0FFcEU7Q0FHQSxNQUFNLFlBQVksYUFBYSxZQUM3QixhQUFhLGFBQWEsUUFBUSxLQUFLLEVBQUUsR0FBRyxRQUFRLE1BQU0sQ0FBQyxDQUM3RDtDQUNBLElBQUksUUFBUSxPQUFPLFFBQVEsT0FDekIsT0FBTztDQUdULE1BQU0sZ0JBQWdCLFVBQVU7Q0FDaEMsTUFBTSxvQkFBb0IsVUFBVTtDQUNwQyxNQUFNLFdBQVcsTUFBTSxhQUFhLFdBQVcsV0FBVyxFQUFFLE9BQU8sS0FBSyxDQUFDO0NBR3pFLElBQUksU0FBUyxVQUFVLGlCQUFpQixTQUFTLGNBQWMsbUJBQzdELE1BQU0sSUFBSSxNQUNSLHlEQUF5RCx5QkFBeUIsUUFBUSxHQUFHLEdBQy9GO0NBR0YsT0FBTztBQUNUOzs7b0JBL0lzRDthQUNkO3NCQUNlO0NBeUYxQyxtQ0FBOEQ7RUFDekUsY0FBYztFQUNkLGFBQWE7RUFDYixNQUFNLFdBQVcsV0FBVyxTQUFTO0dBQ25DLE1BQU0sRUFBRSxRQUFRLE1BQU0sT0FBTztHQUM3QixPQUFPLElBQUksV0FBVyxPQUFPO0VBQy9CO0NBQ0YifQ==