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
@@ -0,0 +1,3 @@
1
+ /** Fastify가 비동기 실패를 오류 처리기로 전달할 수 있도록 Promise를 반환합니다. */
2
+ export declare function forwardAsyncErrors<Result>(handler: () => Promise<Result>): Promise<Result>;
3
+ //# sourceMappingURL=async-route.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"async-route.d.ts","sourceRoot":"","sources":["../../src/ui/async-route.ts"],"names":[],"mappings":"AAAA,yDAAyD;AACzD,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,OAAO,EAAE,MAAM,OAAO,CAAC,MAAM,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC,CAE1F"}
@@ -0,0 +1,12 @@
1
+ import { __esmMin } from "../_virtual/_rolldown/runtime.js";
2
+ //#region src/ui/async-route.ts
3
+ /** Fastify가 비동기 실패를 오류 처리기로 전달할 수 있도록 Promise를 반환합니다. */
4
+ function forwardAsyncErrors(handler) {
5
+ return Promise.resolve().then(handler);
6
+ }
7
+ var init_async_route = __esmMin((() => {}));
8
+ //#endregion
9
+ init_async_route();
10
+ export { forwardAsyncErrors, init_async_route };
11
+
12
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXN5bmMtcm91dGUuanMiLCJuYW1lcyI6W10sInNvdXJjZXMiOlsiLi4vLi4vc3JjL3VpL2FzeW5jLXJvdXRlLnRzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qKiBGYXN0aWZ56rCAIOu5hOuPmeq4sCDsi6TtjKjrpbwg7Jik66WYIOyymOumrOq4sOuhnCDsoITri6ztlaAg7IiYIOyeiOuPhOuhnSBQcm9taXNl66W8IOuwmO2ZmO2VqeuLiOuLpC4gKi9cbmV4cG9ydCBmdW5jdGlvbiBmb3J3YXJkQXN5bmNFcnJvcnM8UmVzdWx0PihoYW5kbGVyOiAoKSA9PiBQcm9taXNlPFJlc3VsdD4pOiBQcm9taXNlPFJlc3VsdD4ge1xuICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCkudGhlbihoYW5kbGVyKTtcbn1cbiJdLCJtYXBwaW5ncyI6Ijs7O0FBQ0EsU0FBZ0IsbUJBQTJCLFNBQWlEO0NBQzFGLE9BQU8sUUFBUSxRQUFRLENBQUMsQ0FBQyxLQUFLLE9BQU87QUFDdkMifQ==
@@ -1,10 +1,14 @@
1
1
  import { type CddAcListResult, type CddAddRuleRequest, type CddContentResult, type CddRuleDetail, type CddRuleSummary, type CddTreeNode } from "./cdd-types";
2
- export type { CddAcEntry, CddAcFile, CddAcListResult, CddAddRuleRequest, CddContentResult, CddFileType, CddRuleDetail, CddRuleEntry, CddRuleSummary, CddTreeNode, } from "./cdd-types";
3
- /** contract/ 디렉터리의 트리 구조를 반환 */
4
- export declare function getCddTree(): {
2
+ interface CddTreeResult {
5
3
  exists: boolean;
6
4
  tree: CddTreeNode[];
7
- };
5
+ }
6
+ interface CddRulesResult {
7
+ rules: CddRuleSummary[];
8
+ }
9
+ export type { CddAcEntry, CddAcFile, CddAcListResult, CddAddRuleRequest, CddContentResult, CddFileType, CddRuleDetail, CddRuleEntry, CddRuleSummary, CddTreeNode, } from "./cdd-types";
10
+ /** contract/ 디렉터리의 트리 구조를 반환 */
11
+ export declare function getCddTree(): CddTreeResult;
8
12
  /** 파일 내용을 읽어 반환 (contract.md → markdown 원문, rules.json → JSON 문자열) */
9
13
  export declare function readContent(filePath: string): CddContentResult;
10
14
  /** 파일을 외부 에디터로 직접 편집 */
@@ -15,9 +19,7 @@ export declare function editContent(filePath: string): Promise<{
15
19
  /** 소스 파일을 외부 에디터로 열기 (대기하지 않음) */
16
20
  export declare function openSourceFile(filePath: string): void;
17
21
  /** contract/rules/ 디렉터리 내 .rules.json 파일 목록 반환 */
18
- export declare function listRules(): {
19
- rules: CddRuleSummary[];
20
- };
22
+ export declare function listRules(): CddRulesResult;
21
23
  /** rules 파일 상세 반환 */
22
24
  export declare function readRule(ruleKey: string): CddRuleDetail;
23
25
  /** rules 파일에 규칙 추가 */
@@ -1 +1 @@
1
- {"version":3,"file":"cdd-service.d.ts","sourceRoot":"","sources":["../../src/ui/cdd-service.ts"],"names":[],"mappings":"AAMA,OAAO,EAGL,KAAK,eAAe,EACpB,KAAK,iBAAiB,EACtB,KAAK,gBAAgB,EAErB,KAAK,aAAa,EAElB,KAAK,cAAc,EACnB,KAAK,WAAW,EACjB,MAAM,aAAa,CAAC;AAErB,YAAY,EACV,UAAU,EACV,SAAS,EACT,eAAe,EACf,iBAAiB,EACjB,gBAAgB,EAChB,WAAW,EACX,aAAa,EACb,YAAY,EACZ,cAAc,EACd,WAAW,GACZ,MAAM,aAAa,CAAC;AAgErB,gCAAgC;AAChC,wBAAgB,UAAU,IAAI;IAAE,MAAM,EAAE,OAAO,CAAC;IAAC,IAAI,EAAE,WAAW,EAAE,CAAA;CAAE,CAOrE;AAED,sEAAsE;AACtE,wBAAgB,WAAW,CAAC,QAAQ,EAAE,MAAM,GAAG,gBAAgB,CAiB9D;AAED,wBAAwB;AACxB,wBAAsB,WAAW,CAC/B,QAAQ,EAAE,MAAM,GACf,OAAO,CAAC;IAAE,OAAO,EAAE,OAAO,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAA;CAAE,CAAC,CAcjD;AA0DD,kCAAkC;AAClC,wBAAgB,cAAc,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI,CAarD;AAMD,kDAAkD;AAClD,wBAAgB,SAAS,IAAI;IAAE,KAAK,EAAE,cAAc,EAAE,CAAA;CAAE,CAoCvD;AAED,qBAAqB;AACrB,wBAAgB,QAAQ,CAAC,OAAO,EAAE,MAAM,GAAG,aAAa,CAiBvD;AAED,sBAAsB;AACtB,wBAAgB,OAAO,CAAC,GAAG,EAAE,iBAAiB,GAAG,aAAa,CAkC7D;AAyHD,yCAAyC;AACzC,wBAAgB,SAAS,IAAI,eAAe,CAkB3C"}
1
+ {"version":3,"file":"cdd-service.d.ts","sourceRoot":"","sources":["../../src/ui/cdd-service.ts"],"names":[],"mappings":"AAOA,OAAO,EAGL,KAAK,eAAe,EACpB,KAAK,iBAAiB,EACtB,KAAK,gBAAgB,EAErB,KAAK,aAAa,EAElB,KAAK,cAAc,EACnB,KAAK,WAAW,EACjB,MAAM,aAAa,CAAC;AAErB,UAAU,aAAa;IACrB,MAAM,EAAE,OAAO,CAAC;IAChB,IAAI,EAAE,WAAW,EAAE,CAAC;CACrB;AASD,UAAU,cAAc;IACtB,KAAK,EAAE,cAAc,EAAE,CAAC;CACzB;AAED,YAAY,EACV,UAAU,EACV,SAAS,EACT,eAAe,EACf,iBAAiB,EACjB,gBAAgB,EAChB,WAAW,EACX,aAAa,EACb,YAAY,EACZ,cAAc,EACd,WAAW,GACZ,MAAM,aAAa,CAAC;AAgErB,gCAAgC;AAChC,wBAAgB,UAAU,IAAI,aAAa,CAO1C;AAED,sEAAsE;AACtE,wBAAgB,WAAW,CAAC,QAAQ,EAAE,MAAM,GAAG,gBAAgB,CAiB9D;AAED,wBAAwB;AACxB,wBAAsB,WAAW,CAC/B,QAAQ,EAAE,MAAM,GACf,OAAO,CAAC;IAAE,OAAO,EAAE,OAAO,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAA;CAAE,CAAC,CAcjD;AA0DD,kCAAkC;AAClC,wBAAgB,cAAc,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI,CAarD;AAMD,kDAAkD;AAClD,wBAAgB,SAAS,IAAI,cAAc,CAsC1C;AAED,qBAAqB;AACrB,wBAAgB,QAAQ,CAAC,OAAO,EAAE,MAAM,GAAG,aAAa,CAmBvD;AAED,sBAAsB;AACtB,wBAAgB,OAAO,CAAC,GAAG,EAAE,iBAAiB,GAAG,aAAa,CAoC7D;AAyHD,yCAAyC;AACzC,wBAAgB,SAAS,IAAI,eAAe,CAkB3C"}
@@ -1,4 +1,5 @@
1
1
  import { __esmMin } from "../_virtual/_rolldown/runtime.js";
2
+ import { init_runtime_value, isStringValue } from "../utils/runtime-value.js";
2
3
  import { Sonamu, init_sonamu } from "../api/sonamu.js";
3
4
  import fs from "fs";
4
5
  import path from "path";
@@ -91,7 +92,7 @@ async function editContent(filePath) {
91
92
  function resolveEditorCli(options) {
92
93
  const wait = options?.wait ?? true;
93
94
  const appName = Sonamu.config.externalEditor ?? "Visual Studio Code";
94
- const mapping = EDITOR_CLI_MAP[appName];
95
+ const mapping = Object.entries(EDITOR_CLI_MAP).find(([name]) => name === appName)?.[1];
95
96
  if (!mapping) throw new Error(`지원되지 않는 에디터입니다: ${appName} (지원: ${Object.keys(EDITOR_CLI_MAP).join(", ")})`);
96
97
  const bundlePath = [`/Applications/${appName}.app`, `${os.homedir()}/Applications/${appName}.app`].find((p) => fs.existsSync(p));
97
98
  if (!bundlePath) throw new Error(`앱 번들을 찾을 수 없습니다: ${appName} (/Applications 확인)`);
@@ -143,7 +144,7 @@ function listRules() {
143
144
  rules.push({
144
145
  key,
145
146
  path: relPath,
146
- description: typeof doc.description === "string" ? doc.description : "",
147
+ description: isStringValue(doc.description) ? doc.description : "",
147
148
  ruleCount: Array.isArray(doc.rules) ? doc.rules.length : 0
148
149
  });
149
150
  } catch (err) {
@@ -168,7 +169,7 @@ function readRule(ruleKey) {
168
169
  return {
169
170
  key: ruleKey,
170
171
  path: `rules/${ruleKey}.rules.json`,
171
- description: typeof doc.description === "string" ? doc.description : "",
172
+ description: isStringValue(doc.description) ? doc.description : "",
172
173
  rules: Array.isArray(doc.rules) ? doc.rules : []
173
174
  };
174
175
  }
@@ -193,7 +194,7 @@ function addRule(req) {
193
194
  return {
194
195
  key: req.ruleKey,
195
196
  path: `rules/${req.ruleKey}.rules.json`,
196
- description: typeof doc.description === "string" ? doc.description : "",
197
+ description: isStringValue(doc.description) ? doc.description : "",
197
198
  rules
198
199
  };
199
200
  }
@@ -352,6 +353,7 @@ function findTestFiles(dir) {
352
353
  var EDITOR_CLI_MAP;
353
354
  var init_cdd_service = __esmMin((() => {
354
355
  init_sonamu();
356
+ init_runtime_value();
355
357
  EDITOR_CLI_MAP = {
356
358
  "Visual Studio Code": {
357
359
  cli: "Contents/Resources/app/bin/code",
@@ -371,4 +373,4 @@ var init_cdd_service = __esmMin((() => {
371
373
  init_cdd_service();
372
374
  export { addRule, editContent, getAcList, getCddTree, init_cdd_service, listRules, openSourceFile, readContent, readRule };
373
375
 
374
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2RkLXNlcnZpY2UuanMiLCJuYW1lcyI6W10sInNvdXJjZXMiOlsiLi4vLi4vc3JjL3VpL2NkZC1zZXJ2aWNlLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IHNwYXduIH0gZnJvbSBcImNoaWxkX3Byb2Nlc3NcIjtcbmltcG9ydCBmcyBmcm9tIFwiZnNcIjtcbmltcG9ydCBvcyBmcm9tIFwib3NcIjtcbmltcG9ydCBwYXRoIGZyb20gXCJwYXRoXCI7XG5cbmltcG9ydCB7IFNvbmFtdSB9IGZyb20gXCIuLi9hcGkvc29uYW11XCI7XG5pbXBvcnQge1xuICB0eXBlIENkZEFjRW50cnksXG4gIHR5cGUgQ2RkQWNGaWxlLFxuICB0eXBlIENkZEFjTGlzdFJlc3VsdCxcbiAgdHlwZSBDZGRBZGRSdWxlUmVxdWVzdCxcbiAgdHlwZSBDZGRDb250ZW50UmVzdWx0LFxuICB0eXBlIENkZEZpbGVUeXBlLFxuICB0eXBlIENkZFJ1bGVEZXRhaWwsXG4gIHR5cGUgQ2RkUnVsZUVudHJ5LFxuICB0eXBlIENkZFJ1bGVTdW1tYXJ5LFxuICB0eXBlIENkZFRyZWVOb2RlLFxufSBmcm9tIFwiLi9jZGQtdHlwZXNcIjtcblxuZXhwb3J0IHR5cGUge1xuICBDZGRBY0VudHJ5LFxuICBDZGRBY0ZpbGUsXG4gIENkZEFjTGlzdFJlc3VsdCxcbiAgQ2RkQWRkUnVsZVJlcXVlc3QsXG4gIENkZENvbnRlbnRSZXN1bHQsXG4gIENkZEZpbGVUeXBlLFxuICBDZGRSdWxlRGV0YWlsLFxuICBDZGRSdWxlRW50cnksXG4gIENkZFJ1bGVTdW1tYXJ5LFxuICBDZGRUcmVlTm9kZSxcbn0gZnJvbSBcIi4vY2RkLXR5cGVzXCI7XG5cbi8qKiBjb250cmFjdC8g65SU66CJ7YSw66asIOygiOuMgCDqsr3roZwg67CY7ZmYIChhcGlSb290UGF0aCDquLDspIApICovXG5mdW5jdGlvbiBnZXRDb250cmFjdERpcigpOiBzdHJpbmcge1xuICByZXR1cm4gcGF0aC5qb2luKFNvbmFtdS5hcGlSb290UGF0aCwgXCIuLlwiLCBcIi4uXCIsIFwiY29udHJhY3RcIik7XG59XG5cbi8qKiDtlITroZzsoJ3tirgg66Oo7Yq4IOqyveuhnCDrsJjtmZggKi9cbmZ1bmN0aW9uIGdldFByb2plY3RSb290KCk6IHN0cmluZyB7XG4gIHJldHVybiBwYXRoLmpvaW4oU29uYW11LmFwaVJvb3RQYXRoLCBcIi4uXCIsIFwiLi5cIik7XG59XG5cbi8qKiDqsr3roZzqsIAgY29udHJhY3QvIOuUlOugie2EsOumrCDrgrTrtoDsnbjsp4Ag6rKA7KadICovXG5mdW5jdGlvbiBhc3NlcnRJbnNpZGVDb250cmFjdERpcihmaWxlUGF0aDogc3RyaW5nKTogdm9pZCB7XG4gIGNvbnN0IGNvbnRyYWN0RGlyID0gZ2V0Q29udHJhY3REaXIoKTtcbiAgY29uc3QgcmVzb2x2ZWQgPSBwYXRoLnJlc29sdmUoY29udHJhY3REaXIsIGZpbGVQYXRoKTtcbiAgaWYgKCFyZXNvbHZlZC5zdGFydHNXaXRoKGNvbnRyYWN0RGlyICsgcGF0aC5zZXApICYmIHJlc29sdmVkICE9PSBjb250cmFjdERpcikge1xuICAgIHRocm93IG5ldyBFcnJvcihg6rK966Gc6rCAIGNvbnRyYWN0LyDrlJTroInthLDrpqwg67CW7J2EIOywuOyhsO2VqeuLiOuLpDogJHtmaWxlUGF0aH1gKTtcbiAgfVxufVxuXG4vKiog7YyM7J2866qF7JeQ7IScIENkZEZpbGVUeXBlIO2MkOuzhCAqL1xuZnVuY3Rpb24gZGV0ZWN0RmlsZVR5cGUoZmlsZU5hbWU6IHN0cmluZyk6IENkZEZpbGVUeXBlIHwgdW5kZWZpbmVkIHtcbiAgaWYgKGZpbGVOYW1lLmVuZHNXaXRoKFwiLmNvbnRyYWN0Lm1kXCIpKSByZXR1cm4gXCJjb250cmFjdFwiO1xuICBpZiAoZmlsZU5hbWUuZW5kc1dpdGgoXCIucnVsZXMuanNvblwiKSkgcmV0dXJuIFwicnVsZXNcIjtcbiAgcmV0dXJuIHVuZGVmaW5lZDtcbn1cblxuLyoqIOuUlOugie2EsOumrOulvCDsnqzqt4Ag7YOQ7IOJ7ZWY7JesIENkZFRyZWVOb2RlIO2KuOumrOulvCDsg53shLEgKi9cbmZ1bmN0aW9uIHNjYW5EaXJlY3RvcnkoZGlyUGF0aDogc3RyaW5nLCByZWxhdGl2ZVRvOiBzdHJpbmcpOiBDZGRUcmVlTm9kZVtdIHtcbiAgY29uc3QgZW50cmllcyA9IGZzLnJlYWRkaXJTeW5jKGRpclBhdGgsIHsgd2l0aEZpbGVUeXBlczogdHJ1ZSB9KTtcbiAgY29uc3Qgbm9kZXM6IENkZFRyZWVOb2RlW10gPSBbXTtcblxuICBmb3IgKGNvbnN0IGVudHJ5IG9mIGVudHJpZXMpIHtcbiAgICBjb25zdCBmdWxsUGF0aCA9IHBhdGguam9pbihkaXJQYXRoLCBlbnRyeS5uYW1lKTtcbiAgICBjb25zdCByZWxQYXRoID0gcGF0aC5yZWxhdGl2ZShyZWxhdGl2ZVRvLCBmdWxsUGF0aCk7XG5cbiAgICBpZiAoZW50cnkuaXNEaXJlY3RvcnkoKSkge1xuICAgICAgaWYgKGVudHJ5Lm5hbWUgPT09IFwicnVsZXNcIikgY29udGludWU7XG4gICAgICBjb25zdCBjaGlsZHJlbiA9IHNjYW5EaXJlY3RvcnkoZnVsbFBhdGgsIHJlbGF0aXZlVG8pO1xuICAgICAgaWYgKGNoaWxkcmVuLmxlbmd0aCA+IDApIHtcbiAgICAgICAgbm9kZXMucHVzaCh7XG4gICAgICAgICAgbmFtZTogZW50cnkubmFtZSxcbiAgICAgICAgICBwYXRoOiByZWxQYXRoLFxuICAgICAgICAgIHR5cGU6IFwiZGlyZWN0b3J5XCIsXG4gICAgICAgICAgY2hpbGRyZW4sXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoZW50cnkuaXNGaWxlKCkpIHtcbiAgICAgIGNvbnN0IGZpbGVUeXBlID0gZGV0ZWN0RmlsZVR5cGUoZW50cnkubmFtZSk7XG4gICAgICBpZiAoZmlsZVR5cGUgJiYgZmlsZVR5cGUgIT09IFwicnVsZXNcIikge1xuICAgICAgICBub2Rlcy5wdXNoKHtcbiAgICAgICAgICBuYW1lOiBlbnRyeS5uYW1lLFxuICAgICAgICAgIHBhdGg6IHJlbFBhdGgsXG4gICAgICAgICAgdHlwZTogXCJmaWxlXCIsXG4gICAgICAgICAgZmlsZVR5cGUsXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBub2Rlcztcbn1cblxuLyoqIGNvbnRyYWN0LyDrlJTroInthLDrpqzsnZgg7Yq466asIOq1rOyhsOulvCDrsJjtmZggKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRDZGRUcmVlKCk6IHsgZXhpc3RzOiBib29sZWFuOyB0cmVlOiBDZGRUcmVlTm9kZVtdIH0ge1xuICBjb25zdCBjb250cmFjdERpciA9IGdldENvbnRyYWN0RGlyKCk7XG4gIGlmICghZnMuZXhpc3RzU3luYyhjb250cmFjdERpcikpIHtcbiAgICByZXR1cm4geyBleGlzdHM6IGZhbHNlLCB0cmVlOiBbXSB9O1xuICB9XG4gIGNvbnN0IHRyZWUgPSBzY2FuRGlyZWN0b3J5KGNvbnRyYWN0RGlyLCBjb250cmFjdERpcik7XG4gIHJldHVybiB7IGV4aXN0czogdHJ1ZSwgdHJlZSB9O1xufVxuXG4vKiog7YyM7J28IOuCtOyaqeydhCDsnb3slrQg67CY7ZmYIChjb250cmFjdC5tZCDihpIgbWFya2Rvd24g7JuQ66y4LCBydWxlcy5qc29uIOKGkiBKU09OIOusuOyekOyXtCkgKi9cbmV4cG9ydCBmdW5jdGlvbiByZWFkQ29udGVudChmaWxlUGF0aDogc3RyaW5nKTogQ2RkQ29udGVudFJlc3VsdCB7XG4gIGFzc2VydEluc2lkZUNvbnRyYWN0RGlyKGZpbGVQYXRoKTtcblxuICBjb25zdCBjb250cmFjdERpciA9IGdldENvbnRyYWN0RGlyKCk7XG4gIGNvbnN0IGFic1BhdGggPSBwYXRoLnJlc29sdmUoY29udHJhY3REaXIsIGZpbGVQYXRoKTtcblxuICBpZiAoIWZzLmV4aXN0c1N5bmMoYWJzUGF0aCkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYO2MjOydvOydhCDssL7snYQg7IiYIOyXhuyKteuLiOuLpDogJHtmaWxlUGF0aH1gKTtcbiAgfVxuXG4gIGNvbnN0IGNvbnRlbnQgPSBmcy5yZWFkRmlsZVN5bmMoYWJzUGF0aCwgXCJ1dGYtOFwiKTtcbiAgY29uc3QgZmlsZVR5cGUgPSBkZXRlY3RGaWxlVHlwZShwYXRoLmJhc2VuYW1lKGZpbGVQYXRoKSk7XG5cbiAgcmV0dXJuIHtcbiAgICBjb250ZW50LFxuICAgIGZpbGVUeXBlOiBmaWxlVHlwZSA/PyBcImNvbnRyYWN0XCIsXG4gIH07XG59XG5cbi8qKiDtjIzsnbzsnYQg7Jm467aAIOyXkOuUlO2EsOuhnCDsp4HsoJEg7Y647KeRICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZWRpdENvbnRlbnQoXG4gIGZpbGVQYXRoOiBzdHJpbmcsXG4pOiBQcm9taXNlPHsgc3VjY2VzczogYm9vbGVhbjsgZmlsZVBhdGg6IHN0cmluZyB9PiB7XG4gIGFzc2VydEluc2lkZUNvbnRyYWN0RGlyKGZpbGVQYXRoKTtcblxuICBjb25zdCBjb250cmFjdERpciA9IGdldENvbnRyYWN0RGlyKCk7XG4gIGNvbnN0IGFic1BhdGggPSBwYXRoLnJlc29sdmUoY29udHJhY3REaXIsIGZpbGVQYXRoKTtcblxuICBpZiAoIWZzLmV4aXN0c1N5bmMoYWJzUGF0aCkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYO2MjOydvOydhCDssL7snYQg7IiYIOyXhuyKteuLiOuLpDogJHtmaWxlUGF0aH1gKTtcbiAgfVxuXG4gIGNvbnN0IGVkaXRvciA9IHJlc29sdmVFZGl0b3JDbGkoKTtcbiAgYXdhaXQgcnVuRWRpdG9yKGVkaXRvciwgYWJzUGF0aCk7XG5cbiAgcmV0dXJuIHsgc3VjY2VzczogdHJ1ZSwgZmlsZVBhdGggfTtcbn1cblxuLyoqIOyXkOuUlO2EsOuzhCDslbEg67KI65OkIOuCtCBDTEkg6rK966GcICsgLS13YWl0IO2UjOuemOq3uCDrp6TtlZEgKi9cbmNvbnN0IEVESVRPUl9DTElfTUFQOiBSZWNvcmQ8c3RyaW5nLCB7IGNsaTogc3RyaW5nOyB3YWl0RmxhZzogc3RyaW5nIH0+ID0ge1xuICBcIlZpc3VhbCBTdHVkaW8gQ29kZVwiOiB7IGNsaTogXCJDb250ZW50cy9SZXNvdXJjZXMvYXBwL2Jpbi9jb2RlXCIsIHdhaXRGbGFnOiBcIi0td2FpdFwiIH0sXG4gIFplZDogeyBjbGk6IFwiQ29udGVudHMvTWFjT1MvY2xpXCIsIHdhaXRGbGFnOiBcIi0td2FpdFwiIH0sXG4gIEN1cnNvcjogeyBjbGk6IFwiQ29udGVudHMvUmVzb3VyY2VzL2FwcC9iaW4vY3Vyc29yXCIsIHdhaXRGbGFnOiBcIi0td2FpdFwiIH0sXG59O1xuXG4vKiog7JWxIOuyiOuTpCBDTEkg6rK966Gc66W8IHJlc29sdmUuIHdhaXQ9ZmFsc2XsnbTrqbQgLS13YWl0IO2UjOuemOq3uOulvCDsg53rnrUgKi9cbmZ1bmN0aW9uIHJlc29sdmVFZGl0b3JDbGkob3B0aW9ucz86IHsgd2FpdD86IGJvb2xlYW4gfSk6IHsgYmluOiBzdHJpbmc7IGFyZ3M6IHN0cmluZ1tdIH0ge1xuICBjb25zdCB3YWl0ID0gb3B0aW9ucz8ud2FpdCA/PyB0cnVlO1xuICBjb25zdCBhcHBOYW1lID0gU29uYW11LmNvbmZpZy5leHRlcm5hbEVkaXRvciA/PyBcIlZpc3VhbCBTdHVkaW8gQ29kZVwiO1xuICBjb25zdCBtYXBwaW5nID0gRURJVE9SX0NMSV9NQVBbYXBwTmFtZV07XG4gIGlmICghbWFwcGluZykge1xuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgIGDsp4Dsm5DrkJjsp4Ag7JWK64qUIOyXkOuUlO2EsOyeheuLiOuLpDogJHthcHBOYW1lfSAo7KeA7JuQOiAke09iamVjdC5rZXlzKEVESVRPUl9DTElfTUFQKS5qb2luKFwiLCBcIil9KWAsXG4gICAgKTtcbiAgfVxuXG4gIGNvbnN0IHNlYXJjaFBhdGhzID0gW1xuICAgIGAvQXBwbGljYXRpb25zLyR7YXBwTmFtZX0uYXBwYCxcbiAgICBgJHtvcy5ob21lZGlyKCl9L0FwcGxpY2F0aW9ucy8ke2FwcE5hbWV9LmFwcGAsXG4gIF07XG4gIGNvbnN0IGJ1bmRsZVBhdGggPSBzZWFyY2hQYXRocy5maW5kKChwKSA9PiBmcy5leGlzdHNTeW5jKHApKTtcbiAgaWYgKCFidW5kbGVQYXRoKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGDslbEg67KI65Ok7J2EIOywvuydhCDsiJgg7JeG7Iq164uI64ukOiAke2FwcE5hbWV9ICgvQXBwbGljYXRpb25zIO2ZleyduClgKTtcbiAgfVxuXG4gIGNvbnN0IGNsaUJpbiA9IHBhdGguam9pbihidW5kbGVQYXRoLCBtYXBwaW5nLmNsaSk7XG4gIGlmICghZnMuZXhpc3RzU3luYyhjbGlCaW4pKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGDsl5DrlJTthLAgQ0xJ66W8IOywvuydhCDsiJgg7JeG7Iq164uI64ukOiAke2NsaUJpbn1gKTtcbiAgfVxuXG4gIHJldHVybiB7IGJpbjogY2xpQmluLCBhcmdzOiB3YWl0ID8gW21hcHBpbmcud2FpdEZsYWddIDogW10gfTtcbn1cblxuLyoqIOyXkOuUlO2EsCBDTEnrpbwg7Iuk7ZaJ7ZWY6rOgIO2DreydtCDri6vtnpAg65WM6rmM7KeAIOuMgOq4sCAqL1xuZnVuY3Rpb24gcnVuRWRpdG9yKGVkaXRvcjogeyBiaW46IHN0cmluZzsgYXJnczogc3RyaW5nW10gfSwgZmlsZVBhdGg6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgIGNvbnN0IGNoaWxkID0gc3Bhd24oZWRpdG9yLmJpbiwgWy4uLmVkaXRvci5hcmdzLCBmaWxlUGF0aF0sIHtcbiAgICAgIHN0ZGlvOiBcImluaGVyaXRcIixcbiAgICB9KTtcblxuICAgIGNoaWxkLm9uKFwiZXJyb3JcIiwgKGVycikgPT4ge1xuICAgICAgcmVqZWN0KG5ldyBFcnJvcihg7JeQ65SU7YSwIOyLpO2WiSDsi6TtjKggKCR7ZWRpdG9yLmJpbn0pOiAke2Vyci5tZXNzYWdlfWApKTtcbiAgICB9KTtcblxuICAgIGNoaWxkLm9uKFwiY2xvc2VcIiwgKGNvZGUpID0+IHtcbiAgICAgIGlmIChjb2RlID09PSAwKSB7XG4gICAgICAgIHJlc29sdmUoKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJlamVjdChuZXcgRXJyb3IoYOyXkOuUlO2EsOqwgCDruYTsoJXsg4Eg7KKF66OM65CY7JeI7Iq164uI64ukIChleGl0IGNvZGU6ICR7Y29kZX0pYCkpO1xuICAgICAgfVxuICAgIH0pO1xuICB9KTtcbn1cblxuLyoqIOyGjOyKpCDtjIzsnbzsnYQg7Jm467aAIOyXkOuUlO2EsOuhnCDsl7TquLAgKOuMgOq4sO2VmOyngCDslYrsnYwpICovXG5leHBvcnQgZnVuY3Rpb24gb3BlblNvdXJjZUZpbGUoZmlsZVBhdGg6IHN0cmluZyk6IHZvaWQge1xuICBjb25zdCBhYnNQYXRoID0gcGF0aC5pc0Fic29sdXRlKGZpbGVQYXRoKSA/IGZpbGVQYXRoIDogcGF0aC5yZXNvbHZlKFNvbmFtdS5hcGlSb290UGF0aCwgZmlsZVBhdGgpO1xuXG4gIGlmICghZnMuZXhpc3RzU3luYyhhYnNQYXRoKSkge1xuICAgIHRocm93IG5ldyBFcnJvcihg7YyM7J287J2EIOywvuydhCDsiJgg7JeG7Iq164uI64ukOiAke2ZpbGVQYXRofWApO1xuICB9XG5cbiAgY29uc3QgZWRpdG9yID0gcmVzb2x2ZUVkaXRvckNsaSh7IHdhaXQ6IGZhbHNlIH0pO1xuICBjb25zdCBjaGlsZCA9IHNwYXduKGVkaXRvci5iaW4sIFsuLi5lZGl0b3IuYXJncywgYWJzUGF0aF0sIHtcbiAgICBzdGRpbzogXCJpZ25vcmVcIixcbiAgICBkZXRhY2hlZDogdHJ1ZSxcbiAgfSk7XG4gIGNoaWxkLnVucmVmKCk7XG59XG5cbi8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICogUnVsZXMgQVBJXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi9cblxuLyoqIGNvbnRyYWN0L3J1bGVzLyDrlJTroInthLDrpqwg64K0IC5ydWxlcy5qc29uIO2MjOydvCDrqqnroZ0g67CY7ZmYICovXG5leHBvcnQgZnVuY3Rpb24gbGlzdFJ1bGVzKCk6IHsgcnVsZXM6IENkZFJ1bGVTdW1tYXJ5W10gfSB7XG4gIGNvbnN0IGNvbnRyYWN0RGlyID0gZ2V0Q29udHJhY3REaXIoKTtcbiAgY29uc3QgcnVsZXNEaXIgPSBwYXRoLmpvaW4oY29udHJhY3REaXIsIFwicnVsZXNcIik7XG4gIGlmICghZnMuZXhpc3RzU3luYyhydWxlc0RpcikpIHJldHVybiB7IHJ1bGVzOiBbXSB9O1xuXG4gIGNvbnN0IGVudHJpZXMgPSBmcy5yZWFkZGlyU3luYyhydWxlc0RpciwgeyB3aXRoRmlsZVR5cGVzOiB0cnVlIH0pO1xuICBjb25zdCBydWxlczogQ2RkUnVsZVN1bW1hcnlbXSA9IFtdO1xuXG4gIGZvciAoY29uc3QgZW50cnkgb2YgZW50cmllcykge1xuICAgIGlmICghZW50cnkuaXNGaWxlKCkgfHwgIWVudHJ5Lm5hbWUuZW5kc1dpdGgoXCIucnVsZXMuanNvblwiKSkgY29udGludWU7XG5cbiAgICBjb25zdCBrZXkgPSBlbnRyeS5uYW1lLnJlcGxhY2UoL1xcLnJ1bGVzXFwuanNvbiQvLCBcIlwiKTtcbiAgICBjb25zdCByZWxQYXRoID0gYHJ1bGVzLyR7ZW50cnkubmFtZX1gO1xuICAgIGNvbnN0IGFic1BhdGggPSBwYXRoLmpvaW4ocnVsZXNEaXIsIGVudHJ5Lm5hbWUpO1xuXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHJhdyA9IGZzLnJlYWRGaWxlU3luYyhhYnNQYXRoLCBcInV0Zi04XCIpO1xuICAgICAgY29uc3QgZG9jID0gSlNPTi5wYXJzZShyYXcpIGFzIHsgZGVzY3JpcHRpb24/OiBzdHJpbmc7IHJ1bGVzPzogdW5rbm93bltdIH07XG4gICAgICBydWxlcy5wdXNoKHtcbiAgICAgICAga2V5LFxuICAgICAgICBwYXRoOiByZWxQYXRoLFxuICAgICAgICBkZXNjcmlwdGlvbjogdHlwZW9mIGRvYy5kZXNjcmlwdGlvbiA9PT0gXCJzdHJpbmdcIiA/IGRvYy5kZXNjcmlwdGlvbiA6IFwiXCIsXG4gICAgICAgIHJ1bGVDb3VudDogQXJyYXkuaXNBcnJheShkb2MucnVsZXMpID8gZG9jLnJ1bGVzLmxlbmd0aCA6IDAsXG4gICAgICB9KTtcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIHJ1bGVzLnB1c2goe1xuICAgICAgICBrZXksXG4gICAgICAgIHBhdGg6IHJlbFBhdGgsXG4gICAgICAgIGRlc2NyaXB0aW9uOiBcIlwiLFxuICAgICAgICBydWxlQ291bnQ6IDAsXG4gICAgICAgIHBhcnNlRXJyb3I6IGVyciBpbnN0YW5jZW9mIEVycm9yID8gZXJyLm1lc3NhZ2UgOiBTdHJpbmcoZXJyKSxcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiB7IHJ1bGVzIH07XG59XG5cbi8qKiBydWxlcyDtjIzsnbwg7IOB7IS4IOuwmO2ZmCAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlYWRSdWxlKHJ1bGVLZXk6IHN0cmluZyk6IENkZFJ1bGVEZXRhaWwge1xuICBjb25zdCBjb250cmFjdERpciA9IGdldENvbnRyYWN0RGlyKCk7XG4gIGNvbnN0IGFic1BhdGggPSBwYXRoLmpvaW4oY29udHJhY3REaXIsIFwicnVsZXNcIiwgYCR7cnVsZUtleX0ucnVsZXMuanNvbmApO1xuXG4gIGlmICghZnMuZXhpc3RzU3luYyhhYnNQYXRoKSkge1xuICAgIHRocm93IG5ldyBFcnJvcihgUnVsZXMg7YyM7J287J2EIOywvuydhCDsiJgg7JeG7Iq164uI64ukOiAke3J1bGVLZXl9YCk7XG4gIH1cblxuICBjb25zdCByYXcgPSBmcy5yZWFkRmlsZVN5bmMoYWJzUGF0aCwgXCJ1dGYtOFwiKTtcbiAgY29uc3QgZG9jID0gSlNPTi5wYXJzZShyYXcpIGFzIHsgZGVzY3JpcHRpb24/OiBzdHJpbmc7IHJ1bGVzPzogQ2RkUnVsZUVudHJ5W10gfTtcblxuICByZXR1cm4ge1xuICAgIGtleTogcnVsZUtleSxcbiAgICBwYXRoOiBgcnVsZXMvJHtydWxlS2V5fS5ydWxlcy5qc29uYCxcbiAgICBkZXNjcmlwdGlvbjogdHlwZW9mIGRvYy5kZXNjcmlwdGlvbiA9PT0gXCJzdHJpbmdcIiA/IGRvYy5kZXNjcmlwdGlvbiA6IFwiXCIsXG4gICAgcnVsZXM6IEFycmF5LmlzQXJyYXkoZG9jLnJ1bGVzKSA/IGRvYy5ydWxlcyA6IFtdLFxuICB9O1xufVxuXG4vKiogcnVsZXMg7YyM7J287JeQIOq3nOy5mSDstpTqsIAgKi9cbmV4cG9ydCBmdW5jdGlvbiBhZGRSdWxlKHJlcTogQ2RkQWRkUnVsZVJlcXVlc3QpOiBDZGRSdWxlRGV0YWlsIHtcbiAgY29uc3QgY29udHJhY3REaXIgPSBnZXRDb250cmFjdERpcigpO1xuICBjb25zdCBydWxlc0RpciA9IHBhdGguam9pbihjb250cmFjdERpciwgXCJydWxlc1wiKTtcbiAgY29uc3QgYWJzUGF0aCA9IHBhdGguam9pbihydWxlc0RpciwgYCR7cmVxLnJ1bGVLZXl9LnJ1bGVzLmpzb25gKTtcblxuICBpZiAoIWZzLmV4aXN0c1N5bmMoYWJzUGF0aCkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYFJ1bGVzIO2MjOydvOydhCDssL7snYQg7IiYIOyXhuyKteuLiOuLpDogJHtyZXEucnVsZUtleX1gKTtcbiAgfVxuXG4gIGNvbnN0IHJhdyA9IGZzLnJlYWRGaWxlU3luYyhhYnNQYXRoLCBcInV0Zi04XCIpO1xuICBjb25zdCBkb2MgPSBKU09OLnBhcnNlKHJhdykgYXMgeyBkZXNjcmlwdGlvbj86IHN0cmluZzsgcnVsZXM/OiBDZGRSdWxlRW50cnlbXSB9O1xuICBjb25zdCBydWxlczogQ2RkUnVsZUVudHJ5W10gPSBBcnJheS5pc0FycmF5KGRvYy5ydWxlcykgPyBkb2MucnVsZXMgOiBbXTtcblxuICBjb25zdCBuZXh0SWQgPSBnZW5lcmF0ZU5leHRSdWxlSWQocnVsZXMpO1xuICBjb25zdCBuZXdFbnRyeTogQ2RkUnVsZUVudHJ5ID0ge1xuICAgIGlkOiBuZXh0SWQsXG4gICAgd2hlbjogcmVxLndoZW4sXG4gICAgaW5zdHJ1Y3Rpb246IHJlcS5pbnN0cnVjdGlvbixcbiAgfTtcbiAgaWYgKHJlcS5leGFtcGxlcyAmJiByZXEuZXhhbXBsZXMubGVuZ3RoID4gMCkge1xuICAgIG5ld0VudHJ5LmV4YW1wbGVzID0gcmVxLmV4YW1wbGVzO1xuICB9XG5cbiAgcnVsZXMucHVzaChuZXdFbnRyeSk7XG4gIGRvYy5ydWxlcyA9IHJ1bGVzO1xuXG4gIGZzLndyaXRlRmlsZVN5bmMoYWJzUGF0aCwgYCR7SlNPTi5zdHJpbmdpZnkoZG9jLCBudWxsLCAyKX1cXG5gLCBcInV0Zi04XCIpO1xuXG4gIHJldHVybiB7XG4gICAga2V5OiByZXEucnVsZUtleSxcbiAgICBwYXRoOiBgcnVsZXMvJHtyZXEucnVsZUtleX0ucnVsZXMuanNvbmAsXG4gICAgZGVzY3JpcHRpb246IHR5cGVvZiBkb2MuZGVzY3JpcHRpb24gPT09IFwic3RyaW5nXCIgPyBkb2MuZGVzY3JpcHRpb24gOiBcIlwiLFxuICAgIHJ1bGVzLFxuICB9O1xufVxuXG4vKiog6riw7KG0IGlkIO2MqO2EtOydhCDrtoTshJ3tlZjsl6wg64uk7J2MIOyInOuyiCBpZCDsg53shLEgKi9cbmZ1bmN0aW9uIGdlbmVyYXRlTmV4dFJ1bGVJZChydWxlczogQ2RkUnVsZUVudHJ5W10pOiBzdHJpbmcge1xuICBpZiAocnVsZXMubGVuZ3RoID09PSAwKSByZXR1cm4gXCJSLTAwMVwiO1xuXG4gIGNvbnN0IG51bWVyaWNQYXR0ZXJuID0gL14oLis/KShcXGQrKSQvO1xuICBsZXQgYmVzdFByZWZpeCA9IFwiUi1cIjtcbiAgbGV0IG1heE51bSA9IDA7XG5cbiAgZm9yIChjb25zdCBydWxlIG9mIHJ1bGVzKSB7XG4gICAgY29uc3QgbWF0Y2ggPSBudW1lcmljUGF0dGVybi5leGVjKHJ1bGUuaWQpO1xuICAgIGlmIChtYXRjaCkge1xuICAgICAgY29uc3QgcHJlZml4ID0gbWF0Y2hbMV07XG4gICAgICBjb25zdCBudW0gPSBOdW1iZXIucGFyc2VJbnQobWF0Y2hbMl0sIDEwKTtcbiAgICAgIGlmIChudW0gPiBtYXhOdW0pIHtcbiAgICAgICAgYmVzdFByZWZpeCA9IHByZWZpeDtcbiAgICAgICAgbWF4TnVtID0gbnVtO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGNvbnN0IG5leHROdW0gPSBtYXhOdW0gKyAxO1xuICBjb25zdCBwYWRMZW4gPSBNYXRoLm1heCgzLCBTdHJpbmcobWF4TnVtKS5sZW5ndGgpO1xuICByZXR1cm4gYCR7YmVzdFByZWZpeH0ke1N0cmluZyhuZXh0TnVtKS5wYWRTdGFydChwYWRMZW4sIFwiMFwiKX1gO1xufVxuXG4vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqIEFDIEFQSSAobW9kdWxlcy9jZGQgYWMtbGlzdCDtjIzsi7Eg66Gc7KeBIOuzteyCrClcbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqL1xuXG4vKiogZGVzY3JpYmUvdGVzdCDtjKjthLQg7YyM7IuxICovXG5mdW5jdGlvbiBwYXJzZUFjRW50cmllcyhjb250ZW50OiBzdHJpbmcpOiBDZGRBY0VudHJ5W10ge1xuICBjb25zdCBlbnRyaWVzOiBDZGRBY0VudHJ5W10gPSBbXTtcbiAgY29uc3QgbGluZXMgPSBjb250ZW50LnNwbGl0KFwiXFxuXCIpO1xuXG4gIGxldCBjdXJyZW50RGVzY3JpYmU6IHN0cmluZyB8IG51bGwgPSBudWxsO1xuICBsZXQgZGVzY3JpYmVEZXB0aCA9IDA7XG4gIGxldCBicmFjZURlcHRoID0gMDtcbiAgbGV0IHBlbmRpbmdUZXN0QXMgPSBmYWxzZTtcbiAgbGV0IHRlc3RBc0JyYWNlRGVwdGggPSAwO1xuICBsZXQgdGVzdEFzTmVlZE5hbWUgPSBmYWxzZTtcblxuICBmb3IgKGNvbnN0IGxpbmUgb2YgbGluZXMpIHtcbiAgICBjb25zdCB0cmltbWVkID0gbGluZS50cmltKCk7XG5cbiAgICBjb25zdCBkZXNjcmliZU1hdGNoID0gdHJpbW1lZC5tYXRjaCgvXmRlc2NyaWJlXFwoW1wiJ2BdKC4rPylbXCInYF0vKTtcbiAgICBpZiAoZGVzY3JpYmVNYXRjaCkge1xuICAgICAgY3VycmVudERlc2NyaWJlID0gZGVzY3JpYmVNYXRjaFsxXTtcbiAgICAgIGRlc2NyaWJlRGVwdGggPSBicmFjZURlcHRoO1xuICAgIH1cblxuICAgIGNvbnN0IHRlc3RNYXRjaCA9IHRyaW1tZWQubWF0Y2goL14oPzp0ZXN0fGl0KVxcKFtcIidgXSguKz8pW1wiJ2BdLyk7XG4gICAgaWYgKHRlc3RNYXRjaCkge1xuICAgICAgZW50cmllcy5wdXNoKHtcbiAgICAgICAgZGVzY3JpYmU6IGN1cnJlbnREZXNjcmliZSxcbiAgICAgICAgdGVzdDogdGVzdE1hdGNoWzFdLFxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgaWYgKCFwZW5kaW5nVGVzdEFzICYmIHRyaW1tZWQubWF0Y2goL150ZXN0QXNcXHMqXFwoLykpIHtcbiAgICAgIGNvbnN0IGlubGluZU1hdGNoID0gdHJpbW1lZC5tYXRjaCgvXnRlc3RBc1xccypcXChcXHMqXFx7W159XSpcXH1cXHMqLFxccypbXCInYF0oLis/KVtcIidgXS8pO1xuICAgICAgaWYgKGlubGluZU1hdGNoKSB7XG4gICAgICAgIGVudHJpZXMucHVzaCh7IGRlc2NyaWJlOiBjdXJyZW50RGVzY3JpYmUsIHRlc3Q6IGlubGluZU1hdGNoWzFdIH0pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcGVuZGluZ1Rlc3RBcyA9IHRydWU7XG4gICAgICAgIHRlc3RBc0JyYWNlRGVwdGggPSAwO1xuICAgICAgICB0ZXN0QXNOZWVkTmFtZSA9IGZhbHNlO1xuICAgICAgICBmb3IgKGNvbnN0IGNoIG9mIHRyaW1tZWQpIHtcbiAgICAgICAgICBpZiAoY2ggPT09IFwie1wiKSB0ZXN0QXNCcmFjZURlcHRoKys7XG4gICAgICAgICAgaWYgKGNoID09PSBcIn1cIikgdGVzdEFzQnJhY2VEZXB0aC0tO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0ZXN0QXNCcmFjZURlcHRoIDw9IDApIHtcbiAgICAgICAgICB0ZXN0QXNOZWVkTmFtZSA9IHRydWU7XG4gICAgICAgICAgY29uc3QgbmFtZU1hdGNoID0gdHJpbW1lZC5tYXRjaCgvfVxccyosXFxzKltcIidgXSguKz8pW1wiJ2BdLyk7XG4gICAgICAgICAgaWYgKG5hbWVNYXRjaCkge1xuICAgICAgICAgICAgZW50cmllcy5wdXNoKHsgZGVzY3JpYmU6IGN1cnJlbnREZXNjcmliZSwgdGVzdDogbmFtZU1hdGNoWzFdIH0pO1xuICAgICAgICAgICAgcGVuZGluZ1Rlc3RBcyA9IGZhbHNlO1xuICAgICAgICAgICAgdGVzdEFzTmVlZE5hbWUgPSBmYWxzZTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKHBlbmRpbmdUZXN0QXMpIHtcbiAgICAgIGlmICghdGVzdEFzTmVlZE5hbWUpIHtcbiAgICAgICAgZm9yIChjb25zdCBjaCBvZiB0cmltbWVkKSB7XG4gICAgICAgICAgaWYgKGNoID09PSBcIntcIikgdGVzdEFzQnJhY2VEZXB0aCsrO1xuICAgICAgICAgIGlmIChjaCA9PT0gXCJ9XCIpIHRlc3RBc0JyYWNlRGVwdGgtLTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGVzdEFzQnJhY2VEZXB0aCA8PSAwKSB7XG4gICAgICAgICAgdGVzdEFzTmVlZE5hbWUgPSB0cnVlO1xuICAgICAgICAgIGNvbnN0IG5hbWVNYXRjaCA9IHRyaW1tZWQubWF0Y2goL31cXHMqLFxccypbXCInYF0oLis/KVtcIidgXS8pO1xuICAgICAgICAgIGlmIChuYW1lTWF0Y2gpIHtcbiAgICAgICAgICAgIGVudHJpZXMucHVzaCh7IGRlc2NyaWJlOiBjdXJyZW50RGVzY3JpYmUsIHRlc3Q6IG5hbWVNYXRjaFsxXSB9KTtcbiAgICAgICAgICAgIHBlbmRpbmdUZXN0QXMgPSBmYWxzZTtcbiAgICAgICAgICAgIHRlc3RBc05lZWROYW1lID0gZmFsc2U7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zdCBuYW1lTWF0Y2ggPSB0cmltbWVkLm1hdGNoKC9eW1wiJ2BdKC4rPylbXCInYF0vKTtcbiAgICAgICAgaWYgKG5hbWVNYXRjaCkge1xuICAgICAgICAgIGVudHJpZXMucHVzaCh7IGRlc2NyaWJlOiBjdXJyZW50RGVzY3JpYmUsIHRlc3Q6IG5hbWVNYXRjaFsxXSB9KTtcbiAgICAgICAgICBwZW5kaW5nVGVzdEFzID0gZmFsc2U7XG4gICAgICAgICAgdGVzdEFzTmVlZE5hbWUgPSBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIGZvciAoY29uc3QgY2ggb2YgdHJpbW1lZCkge1xuICAgICAgaWYgKGNoID09PSBcIntcIikgYnJhY2VEZXB0aCsrO1xuICAgICAgaWYgKGNoID09PSBcIn1cIikge1xuICAgICAgICBicmFjZURlcHRoLS07XG4gICAgICAgIGlmIChjdXJyZW50RGVzY3JpYmUgJiYgYnJhY2VEZXB0aCA8PSBkZXNjcmliZURlcHRoKSB7XG4gICAgICAgICAgY3VycmVudERlc2NyaWJlID0gbnVsbDtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBlbnRyaWVzO1xufVxuXG4vKiog7ZSE66Gc7KCd7Yq4IOuCtCAqLnRlc3QudHMg7YyM7J287J2EIOyKpOy6lO2VmOyXrCBBQyDrqqnroZ0g67CY7ZmYICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0QWNMaXN0KCk6IENkZEFjTGlzdFJlc3VsdCB7XG4gIGNvbnN0IHByb2plY3RSb290ID0gZ2V0UHJvamVjdFJvb3QoKTtcbiAgY29uc3QgZmlsZXMgPSBmaW5kVGVzdEZpbGVzKHByb2plY3RSb290KTtcblxuICBjb25zdCBhY0ZpbGVzOiBDZGRBY0ZpbGVbXSA9IFtdO1xuICBmb3IgKGNvbnN0IGFic1BhdGggb2YgZmlsZXMpIHtcbiAgICBjb25zdCBjb250ZW50ID0gZnMucmVhZEZpbGVTeW5jKGFic1BhdGgsIFwidXRmLThcIik7XG4gICAgY29uc3QgZW50cmllcyA9IHBhcnNlQWNFbnRyaWVzKGNvbnRlbnQpO1xuICAgIGlmIChlbnRyaWVzLmxlbmd0aCA+IDApIHtcbiAgICAgIGFjRmlsZXMucHVzaCh7XG4gICAgICAgIHBhdGg6IHBhdGgucmVsYXRpdmUocHJvamVjdFJvb3QsIGFic1BhdGgpLFxuICAgICAgICBlbnRyaWVzLFxuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgY29uc3QgdG90YWwgPSBhY0ZpbGVzLnJlZHVjZSgoc3VtLCBmKSA9PiBzdW0gKyBmLmVudHJpZXMubGVuZ3RoLCAwKTtcbiAgcmV0dXJuIHsgZmlsZXM6IGFjRmlsZXMsIHRvdGFsIH07XG59XG5cbi8qKiAqLnRlc3QudHMg7YyM7J287J2EIOyerOq3gCDtg5Dsg4kgKG5vZGVfbW9kdWxlcywgZGlzdCDsoJzsmbgpICovXG5mdW5jdGlvbiBmaW5kVGVzdEZpbGVzKGRpcjogc3RyaW5nKTogc3RyaW5nW10ge1xuICBjb25zdCByZXN1bHRzOiBzdHJpbmdbXSA9IFtdO1xuICBjb25zdCBJR05PUkUgPSBuZXcgU2V0KFtcIm5vZGVfbW9kdWxlc1wiLCBcImRpc3RcIiwgXCIuZ2l0XCIsIFwiY29udHJhY3RcIl0pO1xuXG4gIGZ1bmN0aW9uIHdhbGsoY3VycmVudERpcjogc3RyaW5nKTogdm9pZCB7XG4gICAgbGV0IGVudHJpZXM6IGZzLkRpcmVudFtdO1xuICAgIHRyeSB7XG4gICAgICBlbnRyaWVzID0gZnMucmVhZGRpclN5bmMoY3VycmVudERpciwgeyB3aXRoRmlsZVR5cGVzOiB0cnVlIH0pO1xuICAgIH0gY2F0Y2gge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBmb3IgKGNvbnN0IGVudHJ5IG9mIGVudHJpZXMpIHtcbiAgICAgIGlmIChJR05PUkUuaGFzKGVudHJ5Lm5hbWUpKSBjb250aW51ZTtcbiAgICAgIGNvbnN0IGZ1bGxQYXRoID0gcGF0aC5qb2luKGN1cnJlbnREaXIsIGVudHJ5Lm5hbWUpO1xuICAgICAgaWYgKGVudHJ5LmlzRGlyZWN0b3J5KCkpIHtcbiAgICAgICAgd2FsayhmdWxsUGF0aCk7XG4gICAgICB9IGVsc2UgaWYgKGVudHJ5LmlzRmlsZSgpICYmIGVudHJ5Lm5hbWUuZW5kc1dpdGgoXCIudGVzdC50c1wiKSkge1xuICAgICAgICByZXN1bHRzLnB1c2goZnVsbFBhdGgpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHdhbGsoZGlyKTtcbiAgcmVzdWx0cy5zb3J0KCk7XG4gIHJldHVybiByZXN1bHRzO1xufVxuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7OztBQWlDQSxTQUFTLGlCQUF5QjtDQUNoQyxPQUFPLEtBQUssS0FBSyxPQUFPLGFBQWEsTUFBTSxNQUFNLFVBQVU7QUFDN0Q7O0FBR0EsU0FBUyxpQkFBeUI7Q0FDaEMsT0FBTyxLQUFLLEtBQUssT0FBTyxhQUFhLE1BQU0sSUFBSTtBQUNqRDs7QUFHQSxTQUFTLHdCQUF3QixVQUF3QjtDQUN2RCxNQUFNLGNBQWMsZUFBZTtDQUNuQyxNQUFNLFdBQVcsS0FBSyxRQUFRLGFBQWEsUUFBUTtDQUNuRCxJQUFJLENBQUMsU0FBUyxXQUFXLGNBQWMsS0FBSyxHQUFHLEtBQUssYUFBYSxhQUMvRCxNQUFNLElBQUksTUFBTSxnQ0FBZ0MsVUFBVTtBQUU5RDs7QUFHQSxTQUFTLGVBQWUsVUFBMkM7Q0FDakUsSUFBSSxTQUFTLFNBQVMsY0FBYyxHQUFHLE9BQU87Q0FDOUMsSUFBSSxTQUFTLFNBQVMsYUFBYSxHQUFHLE9BQU87QUFFL0M7O0FBR0EsU0FBUyxjQUFjLFNBQWlCLFlBQW1DO0NBQ3pFLE1BQU0sVUFBVSxHQUFHLFlBQVksU0FBUyxFQUFFLGVBQWUsS0FBSyxDQUFDO0NBQy9ELE1BQU0sUUFBdUIsQ0FBQztDQUU5QixLQUFLLE1BQU0sU0FBUyxTQUFTO0VBQzNCLE1BQU0sV0FBVyxLQUFLLEtBQUssU0FBUyxNQUFNLElBQUk7RUFDOUMsTUFBTSxVQUFVLEtBQUssU0FBUyxZQUFZLFFBQVE7RUFFbEQsSUFBSSxNQUFNLFlBQVksR0FBRztHQUN2QixJQUFJLE1BQU0s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
376
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2RkLXNlcnZpY2UuanMiLCJuYW1lcyI6W10sInNvdXJjZXMiOlsiLi4vLi4vc3JjL3VpL2NkZC1zZXJ2aWNlLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IHNwYXduIH0gZnJvbSBcImNoaWxkX3Byb2Nlc3NcIjtcbmltcG9ydCBmcyBmcm9tIFwiZnNcIjtcbmltcG9ydCBvcyBmcm9tIFwib3NcIjtcbmltcG9ydCBwYXRoIGZyb20gXCJwYXRoXCI7XG5cbmltcG9ydCB7IFNvbmFtdSB9IGZyb20gXCIuLi9hcGkvc29uYW11XCI7XG5pbXBvcnQgeyBpc1N0cmluZ1ZhbHVlIH0gZnJvbSBcIi4uL3V0aWxzL3J1bnRpbWUtdmFsdWVcIjtcbmltcG9ydCB7XG4gIHR5cGUgQ2RkQWNFbnRyeSxcbiAgdHlwZSBDZGRBY0ZpbGUsXG4gIHR5cGUgQ2RkQWNMaXN0UmVzdWx0LFxuICB0eXBlIENkZEFkZFJ1bGVSZXF1ZXN0LFxuICB0eXBlIENkZENvbnRlbnRSZXN1bHQsXG4gIHR5cGUgQ2RkRmlsZVR5cGUsXG4gIHR5cGUgQ2RkUnVsZURldGFpbCxcbiAgdHlwZSBDZGRSdWxlRW50cnksXG4gIHR5cGUgQ2RkUnVsZVN1bW1hcnksXG4gIHR5cGUgQ2RkVHJlZU5vZGUsXG59IGZyb20gXCIuL2NkZC10eXBlc1wiO1xuXG5pbnRlcmZhY2UgQ2RkVHJlZVJlc3VsdCB7XG4gIGV4aXN0czogYm9vbGVhbjtcbiAgdHJlZTogQ2RkVHJlZU5vZGVbXTtcbn1cbmludGVyZmFjZSBFZGl0b3JDbGlDb25maWcge1xuICBjbGk6IHN0cmluZztcbiAgd2FpdEZsYWc6IHN0cmluZztcbn1cbmludGVyZmFjZSBFZGl0b3JDbGlSZXNvbHV0aW9uIHtcbiAgYmluOiBzdHJpbmc7XG4gIGFyZ3M6IHN0cmluZ1tdO1xufVxuaW50ZXJmYWNlIENkZFJ1bGVzUmVzdWx0IHtcbiAgcnVsZXM6IENkZFJ1bGVTdW1tYXJ5W107XG59XG5cbmV4cG9ydCB0eXBlIHtcbiAgQ2RkQWNFbnRyeSxcbiAgQ2RkQWNGaWxlLFxuICBDZGRBY0xpc3RSZXN1bHQsXG4gIENkZEFkZFJ1bGVSZXF1ZXN0LFxuICBDZGRDb250ZW50UmVzdWx0LFxuICBDZGRGaWxlVHlwZSxcbiAgQ2RkUnVsZURldGFpbCxcbiAgQ2RkUnVsZUVudHJ5LFxuICBDZGRSdWxlU3VtbWFyeSxcbiAgQ2RkVHJlZU5vZGUsXG59IGZyb20gXCIuL2NkZC10eXBlc1wiO1xuXG4vKiogY29udHJhY3QvIOuUlOugie2EsOumrCDsoIjrjIAg6rK966GcIOuwmO2ZmCAoYXBpUm9vdFBhdGgg6riw7KSAKSAqL1xuZnVuY3Rpb24gZ2V0Q29udHJhY3REaXIoKTogc3RyaW5nIHtcbiAgcmV0dXJuIHBhdGguam9pbihTb25hbXUuYXBpUm9vdFBhdGgsIFwiLi5cIiwgXCIuLlwiLCBcImNvbnRyYWN0XCIpO1xufVxuXG4vKiog7ZSE66Gc7KCd7Yq4IOujqO2KuCDqsr3roZwg67CY7ZmYICovXG5mdW5jdGlvbiBnZXRQcm9qZWN0Um9vdCgpOiBzdHJpbmcge1xuICByZXR1cm4gcGF0aC5qb2luKFNvbmFtdS5hcGlSb290UGF0aCwgXCIuLlwiLCBcIi4uXCIpO1xufVxuXG4vKiog6rK966Gc6rCAIGNvbnRyYWN0LyDrlJTroInthLDrpqwg64K067aA7J247KeAIOqygOymnSAqL1xuZnVuY3Rpb24gYXNzZXJ0SW5zaWRlQ29udHJhY3REaXIoZmlsZVBhdGg6IHN0cmluZyk6IHZvaWQge1xuICBjb25zdCBjb250cmFjdERpciA9IGdldENvbnRyYWN0RGlyKCk7XG4gIGNvbnN0IHJlc29sdmVkID0gcGF0aC5yZXNvbHZlKGNvbnRyYWN0RGlyLCBmaWxlUGF0aCk7XG4gIGlmICghcmVzb2x2ZWQuc3RhcnRzV2l0aChjb250cmFjdERpciArIHBhdGguc2VwKSAmJiByZXNvbHZlZCAhPT0gY29udHJhY3REaXIpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYOqyveuhnOqwgCBjb250cmFjdC8g65SU66CJ7YSw66asIOuwluydhCDssLjsobDtlanri4jri6Q6ICR7ZmlsZVBhdGh9YCk7XG4gIH1cbn1cblxuLyoqIO2MjOydvOuqheyXkOyEnCBDZGRGaWxlVHlwZSDtjJDrs4QgKi9cbmZ1bmN0aW9uIGRldGVjdEZpbGVUeXBlKGZpbGVOYW1lOiBzdHJpbmcpOiBDZGRGaWxlVHlwZSB8IHVuZGVmaW5lZCB7XG4gIGlmIChmaWxlTmFtZS5lbmRzV2l0aChcIi5jb250cmFjdC5tZFwiKSkgcmV0dXJuIFwiY29udHJhY3RcIjtcbiAgaWYgKGZpbGVOYW1lLmVuZHNXaXRoKFwiLnJ1bGVzLmpzb25cIikpIHJldHVybiBcInJ1bGVzXCI7XG4gIHJldHVybiB1bmRlZmluZWQ7XG59XG5cbi8qKiDrlJTroInthLDrpqzrpbwg7J6s6reAIO2DkOyDie2VmOyXrCBDZGRUcmVlTm9kZSDtirjrpqzrpbwg7IOd7ISxICovXG5mdW5jdGlvbiBzY2FuRGlyZWN0b3J5KGRpclBhdGg6IHN0cmluZywgcmVsYXRpdmVUbzogc3RyaW5nKTogQ2RkVHJlZU5vZGVbXSB7XG4gIGNvbnN0IGVudHJpZXMgPSBmcy5yZWFkZGlyU3luYyhkaXJQYXRoLCB7IHdpdGhGaWxlVHlwZXM6IHRydWUgfSk7XG4gIGNvbnN0IG5vZGVzOiBDZGRUcmVlTm9kZVtdID0gW107XG5cbiAgZm9yIChjb25zdCBlbnRyeSBvZiBlbnRyaWVzKSB7XG4gICAgY29uc3QgZnVsbFBhdGggPSBwYXRoLmpvaW4oZGlyUGF0aCwgZW50cnkubmFtZSk7XG4gICAgY29uc3QgcmVsUGF0aCA9IHBhdGgucmVsYXRpdmUocmVsYXRpdmVUbywgZnVsbFBhdGgpO1xuXG4gICAgaWYgKGVudHJ5LmlzRGlyZWN0b3J5KCkpIHtcbiAgICAgIGlmIChlbnRyeS5uYW1lID09PSBcInJ1bGVzXCIpIGNvbnRpbnVlO1xuICAgICAgY29uc3QgY2hpbGRyZW4gPSBzY2FuRGlyZWN0b3J5KGZ1bGxQYXRoLCByZWxhdGl2ZVRvKTtcbiAgICAgIGlmIChjaGlsZHJlbi5sZW5ndGggPiAwKSB7XG4gICAgICAgIG5vZGVzLnB1c2goe1xuICAgICAgICAgIG5hbWU6IGVudHJ5Lm5hbWUsXG4gICAgICAgICAgcGF0aDogcmVsUGF0aCxcbiAgICAgICAgICB0eXBlOiBcImRpcmVjdG9yeVwiLFxuICAgICAgICAgIGNoaWxkcmVuLFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKGVudHJ5LmlzRmlsZSgpKSB7XG4gICAgICBjb25zdCBmaWxlVHlwZSA9IGRldGVjdEZpbGVUeXBlKGVudHJ5Lm5hbWUpO1xuICAgICAgaWYgKGZpbGVUeXBlICYmIGZpbGVUeXBlICE9PSBcInJ1bGVzXCIpIHtcbiAgICAgICAgbm9kZXMucHVzaCh7XG4gICAgICAgICAgbmFtZTogZW50cnkubmFtZSxcbiAgICAgICAgICBwYXRoOiByZWxQYXRoLFxuICAgICAgICAgIHR5cGU6IFwiZmlsZVwiLFxuICAgICAgICAgIGZpbGVUeXBlLFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZXR1cm4gbm9kZXM7XG59XG5cbi8qKiBjb250cmFjdC8g65SU66CJ7YSw66as7J2YIO2KuOumrCDqtazsobDrpbwg67CY7ZmYICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0Q2RkVHJlZSgpOiBDZGRUcmVlUmVzdWx0IHtcbiAgY29uc3QgY29udHJhY3REaXIgPSBnZXRDb250cmFjdERpcigpO1xuICBpZiAoIWZzLmV4aXN0c1N5bmMoY29udHJhY3REaXIpKSB7XG4gICAgcmV0dXJuIHsgZXhpc3RzOiBmYWxzZSwgdHJlZTogW10gfTtcbiAgfVxuICBjb25zdCB0cmVlID0gc2NhbkRpcmVjdG9yeShjb250cmFjdERpciwgY29udHJhY3REaXIpO1xuICByZXR1cm4geyBleGlzdHM6IHRydWUsIHRyZWUgfTtcbn1cblxuLyoqIO2MjOydvCDrgrTsmqnsnYQg7J297Ja0IOuwmO2ZmCAoY29udHJhY3QubWQg4oaSIG1hcmtkb3duIOybkOusuCwgcnVsZXMuanNvbiDihpIgSlNPTiDrrLjsnpDsl7QpICovXG5leHBvcnQgZnVuY3Rpb24gcmVhZENvbnRlbnQoZmlsZVBhdGg6IHN0cmluZyk6IENkZENvbnRlbnRSZXN1bHQge1xuICBhc3NlcnRJbnNpZGVDb250cmFjdERpcihmaWxlUGF0aCk7XG5cbiAgY29uc3QgY29udHJhY3REaXIgPSBnZXRDb250cmFjdERpcigpO1xuICBjb25zdCBhYnNQYXRoID0gcGF0aC5yZXNvbHZlKGNvbnRyYWN0RGlyLCBmaWxlUGF0aCk7XG5cbiAgaWYgKCFmcy5leGlzdHNTeW5jKGFic1BhdGgpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGDtjIzsnbzsnYQg7LC+7J2EIOyImCDsl4bsirXri4jri6Q6ICR7ZmlsZVBhdGh9YCk7XG4gIH1cblxuICBjb25zdCBjb250ZW50ID0gZnMucmVhZEZpbGVTeW5jKGFic1BhdGgsIFwidXRmLThcIik7XG4gIGNvbnN0IGZpbGVUeXBlID0gZGV0ZWN0RmlsZVR5cGUocGF0aC5iYXNlbmFtZShmaWxlUGF0aCkpO1xuXG4gIHJldHVybiB7XG4gICAgY29udGVudCxcbiAgICBmaWxlVHlwZTogZmlsZVR5cGUgPz8gXCJjb250cmFjdFwiLFxuICB9O1xufVxuXG4vKiog7YyM7J287J2EIOyZuOu2gCDsl5DrlJTthLDroZwg7KeB7KCRIO2OuOynkSAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGVkaXRDb250ZW50KFxuICBmaWxlUGF0aDogc3RyaW5nLFxuKTogUHJvbWlzZTx7IHN1Y2Nlc3M6IGJvb2xlYW47IGZpbGVQYXRoOiBzdHJpbmcgfT4ge1xuICBhc3NlcnRJbnNpZGVDb250cmFjdERpcihmaWxlUGF0aCk7XG5cbiAgY29uc3QgY29udHJhY3REaXIgPSBnZXRDb250cmFjdERpcigpO1xuICBjb25zdCBhYnNQYXRoID0gcGF0aC5yZXNvbHZlKGNvbnRyYWN0RGlyLCBmaWxlUGF0aCk7XG5cbiAgaWYgKCFmcy5leGlzdHNTeW5jKGFic1BhdGgpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGDtjIzsnbzsnYQg7LC+7J2EIOyImCDsl4bsirXri4jri6Q6ICR7ZmlsZVBhdGh9YCk7XG4gIH1cblxuICBjb25zdCBlZGl0b3IgPSByZXNvbHZlRWRpdG9yQ2xpKCk7XG4gIGF3YWl0IHJ1bkVkaXRvcihlZGl0b3IsIGFic1BhdGgpO1xuXG4gIHJldHVybiB7IHN1Y2Nlc3M6IHRydWUsIGZpbGVQYXRoIH07XG59XG5cbi8qKiDsl5DrlJTthLDrs4Qg7JWxIOuyiOuTpCDrgrQgQ0xJIOqyveuhnCArIC0td2FpdCDtlIzrnpjqt7gg66ek7ZWRICovXG5jb25zdCBFRElUT1JfQ0xJX01BUCA9IHtcbiAgXCJWaXN1YWwgU3R1ZGlvIENvZGVcIjogeyBjbGk6IFwiQ29udGVudHMvUmVzb3VyY2VzL2FwcC9iaW4vY29kZVwiLCB3YWl0RmxhZzogXCItLXdhaXRcIiB9LFxuICBaZWQ6IHsgY2xpOiBcIkNvbnRlbnRzL01hY09TL2NsaVwiLCB3YWl0RmxhZzogXCItLXdhaXRcIiB9LFxuICBDdXJzb3I6IHsgY2xpOiBcIkNvbnRlbnRzL1Jlc291cmNlcy9hcHAvYmluL2N1cnNvclwiLCB3YWl0RmxhZzogXCItLXdhaXRcIiB9LFxufSBzYXRpc2ZpZXMgUmVjb3JkPHN0cmluZywgRWRpdG9yQ2xpQ29uZmlnPjtcblxuLyoqIOyVsSDrsojrk6QgQ0xJIOqyveuhnOulvCByZXNvbHZlLiB3YWl0PWZhbHNl7J2066m0IC0td2FpdCDtlIzrnpjqt7jrpbwg7IOd6561ICovXG5mdW5jdGlvbiByZXNvbHZlRWRpdG9yQ2xpKG9wdGlvbnM/OiB7IHdhaXQ/OiBib29sZWFuIH0pOiBFZGl0b3JDbGlSZXNvbHV0aW9uIHtcbiAgY29uc3Qgd2FpdCA9IG9wdGlvbnM/LndhaXQgPz8gdHJ1ZTtcbiAgY29uc3QgYXBwTmFtZSA9IFNvbmFtdS5jb25maWcuZXh0ZXJuYWxFZGl0b3IgPz8gXCJWaXN1YWwgU3R1ZGlvIENvZGVcIjtcbiAgY29uc3QgbWFwcGluZyA9IE9iamVjdC5lbnRyaWVzKEVESVRPUl9DTElfTUFQKS5maW5kKChbbmFtZV0pID0+IG5hbWUgPT09IGFwcE5hbWUpPy5bMV07XG4gIGlmICghbWFwcGluZykge1xuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgIGDsp4Dsm5DrkJjsp4Ag7JWK64qUIOyXkOuUlO2EsOyeheuLiOuLpDogJHthcHBOYW1lfSAo7KeA7JuQOiAke09iamVjdC5rZXlzKEVESVRPUl9DTElfTUFQKS5qb2luKFwiLCBcIil9KWAsXG4gICAgKTtcbiAgfVxuXG4gIGNvbnN0IHNlYXJjaFBhdGhzID0gW1xuICAgIGAvQXBwbGljYXRpb25zLyR7YXBwTmFtZX0uYXBwYCxcbiAgICBgJHtvcy5ob21lZGlyKCl9L0FwcGxpY2F0aW9ucy8ke2FwcE5hbWV9LmFwcGAsXG4gIF07XG4gIGNvbnN0IGJ1bmRsZVBhdGggPSBzZWFyY2hQYXRocy5maW5kKChwKSA9PiBmcy5leGlzdHNTeW5jKHApKTtcbiAgaWYgKCFidW5kbGVQYXRoKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGDslbEg67KI65Ok7J2EIOywvuydhCDsiJgg7JeG7Iq164uI64ukOiAke2FwcE5hbWV9ICgvQXBwbGljYXRpb25zIO2ZleyduClgKTtcbiAgfVxuXG4gIGNvbnN0IGNsaUJpbiA9IHBhdGguam9pbihidW5kbGVQYXRoLCBtYXBwaW5nLmNsaSk7XG4gIGlmICghZnMuZXhpc3RzU3luYyhjbGlCaW4pKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGDsl5DrlJTthLAgQ0xJ66W8IOywvuydhCDsiJgg7JeG7Iq164uI64ukOiAke2NsaUJpbn1gKTtcbiAgfVxuXG4gIHJldHVybiB7IGJpbjogY2xpQmluLCBhcmdzOiB3YWl0ID8gW21hcHBpbmcud2FpdEZsYWddIDogW10gfTtcbn1cblxuLyoqIOyXkOuUlO2EsCBDTEnrpbwg7Iuk7ZaJ7ZWY6rOgIO2DreydtCDri6vtnpAg65WM6rmM7KeAIOuMgOq4sCAqL1xuZnVuY3Rpb24gcnVuRWRpdG9yKGVkaXRvcjogeyBiaW46IHN0cmluZzsgYXJnczogc3RyaW5nW10gfSwgZmlsZVBhdGg6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgIGNvbnN0IGNoaWxkID0gc3Bhd24oZWRpdG9yLmJpbiwgWy4uLmVkaXRvci5hcmdzLCBmaWxlUGF0aF0sIHtcbiAgICAgIHN0ZGlvOiBcImluaGVyaXRcIixcbiAgICB9KTtcblxuICAgIGNoaWxkLm9uKFwiZXJyb3JcIiwgKGVycikgPT4ge1xuICAgICAgcmVqZWN0KG5ldyBFcnJvcihg7JeQ65SU7YSwIOyLpO2WiSDsi6TtjKggKCR7ZWRpdG9yLmJpbn0pOiAke2Vyci5tZXNzYWdlfWApKTtcbiAgICB9KTtcblxuICAgIGNoaWxkLm9uKFwiY2xvc2VcIiwgKGNvZGUpID0+IHtcbiAgICAgIGlmIChjb2RlID09PSAwKSB7XG4gICAgICAgIHJlc29sdmUoKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJlamVjdChuZXcgRXJyb3IoYOyXkOuUlO2EsOqwgCDruYTsoJXsg4Eg7KKF66OM65CY7JeI7Iq164uI64ukIChleGl0IGNvZGU6ICR7Y29kZX0pYCkpO1xuICAgICAgfVxuICAgIH0pO1xuICB9KTtcbn1cblxuLyoqIOyGjOyKpCDtjIzsnbzsnYQg7Jm467aAIOyXkOuUlO2EsOuhnCDsl7TquLAgKOuMgOq4sO2VmOyngCDslYrsnYwpICovXG5leHBvcnQgZnVuY3Rpb24gb3BlblNvdXJjZUZpbGUoZmlsZVBhdGg6IHN0cmluZyk6IHZvaWQge1xuICBjb25zdCBhYnNQYXRoID0gcGF0aC5pc0Fic29sdXRlKGZpbGVQYXRoKSA/IGZpbGVQYXRoIDogcGF0aC5yZXNvbHZlKFNvbmFtdS5hcGlSb290UGF0aCwgZmlsZVBhdGgpO1xuXG4gIGlmICghZnMuZXhpc3RzU3luYyhhYnNQYXRoKSkge1xuICAgIHRocm93IG5ldyBFcnJvcihg7YyM7J287J2EIOywvuydhCDsiJgg7JeG7Iq164uI64ukOiAke2ZpbGVQYXRofWApO1xuICB9XG5cbiAgY29uc3QgZWRpdG9yID0gcmVzb2x2ZUVkaXRvckNsaSh7IHdhaXQ6IGZhbHNlIH0pO1xuICBjb25zdCBjaGlsZCA9IHNwYXduKGVkaXRvci5iaW4sIFsuLi5lZGl0b3IuYXJncywgYWJzUGF0aF0sIHtcbiAgICBzdGRpbzogXCJpZ25vcmVcIixcbiAgICBkZXRhY2hlZDogdHJ1ZSxcbiAgfSk7XG4gIGNoaWxkLnVucmVmKCk7XG59XG5cbi8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICogUnVsZXMgQVBJXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi9cblxuLyoqIGNvbnRyYWN0L3J1bGVzLyDrlJTroInthLDrpqwg64K0IC5ydWxlcy5qc29uIO2MjOydvCDrqqnroZ0g67CY7ZmYICovXG5leHBvcnQgZnVuY3Rpb24gbGlzdFJ1bGVzKCk6IENkZFJ1bGVzUmVzdWx0IHtcbiAgY29uc3QgY29udHJhY3REaXIgPSBnZXRDb250cmFjdERpcigpO1xuICBjb25zdCBydWxlc0RpciA9IHBhdGguam9pbihjb250cmFjdERpciwgXCJydWxlc1wiKTtcbiAgaWYgKCFmcy5leGlzdHNTeW5jKHJ1bGVzRGlyKSkgcmV0dXJuIHsgcnVsZXM6IFtdIH07XG5cbiAgY29uc3QgZW50cmllcyA9IGZzLnJlYWRkaXJTeW5jKHJ1bGVzRGlyLCB7IHdpdGhGaWxlVHlwZXM6IHRydWUgfSk7XG4gIGNvbnN0IHJ1bGVzOiBDZGRSdWxlU3VtbWFyeVtdID0gW107XG5cbiAgZm9yIChjb25zdCBlbnRyeSBvZiBlbnRyaWVzKSB7XG4gICAgaWYgKCFlbnRyeS5pc0ZpbGUoKSB8fCAhZW50cnkubmFtZS5lbmRzV2l0aChcIi5ydWxlcy5qc29uXCIpKSBjb250aW51ZTtcblxuICAgIGNvbnN0IGtleSA9IGVudHJ5Lm5hbWUucmVwbGFjZSgvXFwucnVsZXNcXC5qc29uJC8sIFwiXCIpO1xuICAgIGNvbnN0IHJlbFBhdGggPSBgcnVsZXMvJHtlbnRyeS5uYW1lfWA7XG4gICAgY29uc3QgYWJzUGF0aCA9IHBhdGguam9pbihydWxlc0RpciwgZW50cnkubmFtZSk7XG5cbiAgICB0cnkge1xuICAgICAgY29uc3QgcmF3ID0gZnMucmVhZEZpbGVTeW5jKGFic1BhdGgsIFwidXRmLThcIik7XG4gICAgICBjb25zdCBkb2MgPSAvKiBTQUZFVFk6IFVJIOuPhOq1rOydmCBab2Qg7J6F66ClIOyKpO2CpOuniOqwgCDsnbQg6rCS7J2YIO2DgOyeheydhCDrs7TsnqXtlZzri6QuICovIEpTT04ucGFyc2UoXG4gICAgICAgIHJhdyxcbiAgICAgICkgYXMgeyBkZXNjcmlwdGlvbj86IHN0cmluZzsgcnVsZXM/OiB1bmtub3duW10gfTtcbiAgICAgIHJ1bGVzLnB1c2goe1xuICAgICAgICBrZXksXG4gICAgICAgIHBhdGg6IHJlbFBhdGgsXG4gICAgICAgIGRlc2NyaXB0aW9uOiBpc1N0cmluZ1ZhbHVlKGRvYy5kZXNjcmlwdGlvbikgPyBkb2MuZGVzY3JpcHRpb24gOiBcIlwiLFxuICAgICAgICBydWxlQ291bnQ6IEFycmF5LmlzQXJyYXkoZG9jLnJ1bGVzKSA/IGRvYy5ydWxlcy5sZW5ndGggOiAwLFxuICAgICAgfSk7XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICBydWxlcy5wdXNoKHtcbiAgICAgICAga2V5LFxuICAgICAgICBwYXRoOiByZWxQYXRoLFxuICAgICAgICBkZXNjcmlwdGlvbjogXCJcIixcbiAgICAgICAgcnVsZUNvdW50OiAwLFxuICAgICAgICBwYXJzZUVycm9yOiBlcnIgaW5zdGFuY2VvZiBFcnJvciA/IGVyci5tZXNzYWdlIDogU3RyaW5nKGVyciksXG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4geyBydWxlcyB9O1xufVxuXG4vKiogcnVsZXMg7YyM7J28IOyDgeyEuCDrsJjtmZggKi9cbmV4cG9ydCBmdW5jdGlvbiByZWFkUnVsZShydWxlS2V5OiBzdHJpbmcpOiBDZGRSdWxlRGV0YWlsIHtcbiAgY29uc3QgY29udHJhY3REaXIgPSBnZXRDb250cmFjdERpcigpO1xuICBjb25zdCBhYnNQYXRoID0gcGF0aC5qb2luKGNvbnRyYWN0RGlyLCBcInJ1bGVzXCIsIGAke3J1bGVLZXl9LnJ1bGVzLmpzb25gKTtcblxuICBpZiAoIWZzLmV4aXN0c1N5bmMoYWJzUGF0aCkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYFJ1bGVzIO2MjOydvOydhCDssL7snYQg7IiYIOyXhuyKteuLiOuLpDogJHtydWxlS2V5fWApO1xuICB9XG5cbiAgY29uc3QgcmF3ID0gZnMucmVhZEZpbGVTeW5jKGFic1BhdGgsIFwidXRmLThcIik7XG4gIGNvbnN0IGRvYyA9IC8qIFNBRkVUWTogVUkg64+E6rWs7J2YIFpvZCDsnoXroKUg7Iqk7YKk66eI6rCAIOydtCDqsJLsnZgg7YOA7J6F7J2EIOuztOyepe2VnOuLpC4gKi8gSlNPTi5wYXJzZShcbiAgICByYXcsXG4gICkgYXMgeyBkZXNjcmlwdGlvbj86IHN0cmluZzsgcnVsZXM/OiBDZGRSdWxlRW50cnlbXSB9O1xuXG4gIHJldHVybiB7XG4gICAga2V5OiBydWxlS2V5LFxuICAgIHBhdGg6IGBydWxlcy8ke3J1bGVLZXl9LnJ1bGVzLmpzb25gLFxuICAgIGRlc2NyaXB0aW9uOiBpc1N0cmluZ1ZhbHVlKGRvYy5kZXNjcmlwdGlvbikgPyBkb2MuZGVzY3JpcHRpb24gOiBcIlwiLFxuICAgIHJ1bGVzOiBBcnJheS5pc0FycmF5KGRvYy5ydWxlcykgPyBkb2MucnVsZXMgOiBbXSxcbiAgfTtcbn1cblxuLyoqIHJ1bGVzIO2MjOydvOyXkCDqt5zsuZkg7LaU6rCAICovXG5leHBvcnQgZnVuY3Rpb24gYWRkUnVsZShyZXE6IENkZEFkZFJ1bGVSZXF1ZXN0KTogQ2RkUnVsZURldGFpbCB7XG4gIGNvbnN0IGNvbnRyYWN0RGlyID0gZ2V0Q29udHJhY3REaXIoKTtcbiAgY29uc3QgcnVsZXNEaXIgPSBwYXRoLmpvaW4oY29udHJhY3REaXIsIFwicnVsZXNcIik7XG4gIGNvbnN0IGFic1BhdGggPSBwYXRoLmpvaW4ocnVsZXNEaXIsIGAke3JlcS5ydWxlS2V5fS5ydWxlcy5qc29uYCk7XG5cbiAgaWYgKCFmcy5leGlzdHNTeW5jKGFic1BhdGgpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBSdWxlcyDtjIzsnbzsnYQg7LC+7J2EIOyImCDsl4bsirXri4jri6Q6ICR7cmVxLnJ1bGVLZXl9YCk7XG4gIH1cblxuICBjb25zdCByYXcgPSBmcy5yZWFkRmlsZVN5bmMoYWJzUGF0aCwgXCJ1dGYtOFwiKTtcbiAgY29uc3QgZG9jID0gLyogU0FGRVRZOiBVSSDrj4TqtazsnZggWm9kIOyeheugpSDsiqTtgqTrp4jqsIAg7J20IOqwkuydmCDtg4DsnoXsnYQg67O07J6l7ZWc64ukLiAqLyBKU09OLnBhcnNlKFxuICAgIHJhdyxcbiAgKSBhcyB7IGRlc2NyaXB0aW9uPzogc3RyaW5nOyBydWxlcz86IENkZFJ1bGVFbnRyeVtdIH07XG4gIGNvbnN0IHJ1bGVzOiBDZGRSdWxlRW50cnlbXSA9IEFycmF5LmlzQXJyYXkoZG9jLnJ1bGVzKSA/IGRvYy5ydWxlcyA6IFtdO1xuXG4gIGNvbnN0IG5leHRJZCA9IGdlbmVyYXRlTmV4dFJ1bGVJZChydWxlcyk7XG4gIGNvbnN0IG5ld0VudHJ5OiBDZGRSdWxlRW50cnkgPSB7XG4gICAgaWQ6IG5leHRJZCxcbiAgICB3aGVuOiByZXEud2hlbixcbiAgICBpbnN0cnVjdGlvbjogcmVxLmluc3RydWN0aW9uLFxuICB9O1xuICBpZiAocmVxLmV4YW1wbGVzICYmIHJlcS5leGFtcGxlcy5sZW5ndGggPiAwKSB7XG4gICAgbmV3RW50cnkuZXhhbXBsZXMgPSByZXEuZXhhbXBsZXM7XG4gIH1cblxuICBydWxlcy5wdXNoKG5ld0VudHJ5KTtcbiAgZG9jLnJ1bGVzID0gcnVsZXM7XG5cbiAgZnMud3JpdGVGaWxlU3luYyhhYnNQYXRoLCBgJHtKU09OLnN0cmluZ2lmeShkb2MsIG51bGwsIDIpfVxcbmAsIFwidXRmLThcIik7XG5cbiAgcmV0dXJuIHtcbiAgICBrZXk6IHJlcS5ydWxlS2V5LFxuICAgIHBhdGg6IGBydWxlcy8ke3JlcS5ydWxlS2V5fS5ydWxlcy5qc29uYCxcbiAgICBkZXNjcmlwdGlvbjogaXNTdHJpbmdWYWx1ZShkb2MuZGVzY3JpcHRpb24pID8gZG9jLmRlc2NyaXB0aW9uIDogXCJcIixcbiAgICBydWxlcyxcbiAgfTtcbn1cblxuLyoqIOq4sOyhtCBpZCDtjKjthLTsnYQg67aE7ISd7ZWY7JesIOuLpOydjCDsiJzrsoggaWQg7IOd7ISxICovXG5mdW5jdGlvbiBnZW5lcmF0ZU5leHRSdWxlSWQocnVsZXM6IENkZFJ1bGVFbnRyeVtdKTogc3RyaW5nIHtcbiAgaWYgKHJ1bGVzLmxlbmd0aCA9PT0gMCkgcmV0dXJuIFwiUi0wMDFcIjtcblxuICBjb25zdCBudW1lcmljUGF0dGVybiA9IC9eKC4rPykoXFxkKykkLztcbiAgbGV0IGJlc3RQcmVmaXggPSBcIlItXCI7XG4gIGxldCBtYXhOdW0gPSAwO1xuXG4gIGZvciAoY29uc3QgcnVsZSBvZiBydWxlcykge1xuICAgIGNvbnN0IG1hdGNoID0gbnVtZXJpY1BhdHRlcm4uZXhlYyhydWxlLmlkKTtcbiAgICBpZiAobWF0Y2gpIHtcbiAgICAgIGNvbnN0IHByZWZpeCA9IG1hdGNoWzFdO1xuICAgICAgY29uc3QgbnVtID0gTnVtYmVyLnBhcnNlSW50KG1hdGNoWzJdLCAxMCk7XG4gICAgICBpZiAobnVtID4gbWF4TnVtKSB7XG4gICAgICAgIGJlc3RQcmVmaXggPSBwcmVmaXg7XG4gICAgICAgIG1heE51bSA9IG51bTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBjb25zdCBuZXh0TnVtID0gbWF4TnVtICsgMTtcbiAgY29uc3QgcGFkTGVuID0gTWF0aC5tYXgoMywgU3RyaW5nKG1heE51bSkubGVuZ3RoKTtcbiAgcmV0dXJuIGAke2Jlc3RQcmVmaXh9JHtTdHJpbmcobmV4dE51bSkucGFkU3RhcnQocGFkTGVuLCBcIjBcIil9YDtcbn1cblxuLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKiBBQyBBUEkgKG1vZHVsZXMvY2RkIGFjLWxpc3Qg7YyM7IuxIOuhnOyngSDrs7XsgqwpXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi9cblxuLyoqIGRlc2NyaWJlL3Rlc3Qg7Yyo7YS0IO2MjOyLsSAqL1xuZnVuY3Rpb24gcGFyc2VBY0VudHJpZXMoY29udGVudDogc3RyaW5nKTogQ2RkQWNFbnRyeVtdIHtcbiAgY29uc3QgZW50cmllczogQ2RkQWNFbnRyeVtdID0gW107XG4gIGNvbnN0IGxpbmVzID0gY29udGVudC5zcGxpdChcIlxcblwiKTtcblxuICBsZXQgY3VycmVudERlc2NyaWJlOiBzdHJpbmcgfCBudWxsID0gbnVsbDtcbiAgbGV0IGRlc2NyaWJlRGVwdGggPSAwO1xuICBsZXQgYnJhY2VEZXB0aCA9IDA7XG4gIGxldCBwZW5kaW5nVGVzdEFzID0gZmFsc2U7XG4gIGxldCB0ZXN0QXNCcmFjZURlcHRoID0gMDtcbiAgbGV0IHRlc3RBc05lZWROYW1lID0gZmFsc2U7XG5cbiAgZm9yIChjb25zdCBsaW5lIG9mIGxpbmVzKSB7XG4gICAgY29uc3QgdHJpbW1lZCA9IGxpbmUudHJpbSgpO1xuXG4gICAgY29uc3QgZGVzY3JpYmVNYXRjaCA9IHRyaW1tZWQubWF0Y2goL15kZXNjcmliZVxcKFtcIidgXSguKz8pW1wiJ2BdLyk7XG4gICAgaWYgKGRlc2NyaWJlTWF0Y2gpIHtcbiAgICAgIGN1cnJlbnREZXNjcmliZSA9IGRlc2NyaWJlTWF0Y2hbMV07XG4gICAgICBkZXNjcmliZURlcHRoID0gYnJhY2VEZXB0aDtcbiAgICB9XG5cbiAgICBjb25zdCB0ZXN0TWF0Y2ggPSB0cmltbWVkLm1hdGNoKC9eKD86dGVzdHxpdClcXChbXCInYF0oLis/KVtcIidgXS8pO1xuICAgIGlmICh0ZXN0TWF0Y2gpIHtcbiAgICAgIGVudHJpZXMucHVzaCh7XG4gICAgICAgIGRlc2NyaWJlOiBjdXJyZW50RGVzY3JpYmUsXG4gICAgICAgIHRlc3Q6IHRlc3RNYXRjaFsxXSxcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGlmICghcGVuZGluZ1Rlc3RBcyAmJiB0cmltbWVkLm1hdGNoKC9edGVzdEFzXFxzKlxcKC8pKSB7XG4gICAgICBjb25zdCBpbmxpbmVNYXRjaCA9IHRyaW1tZWQubWF0Y2goL150ZXN0QXNcXHMqXFwoXFxzKlxce1tefV0qXFx9XFxzKixcXHMqW1wiJ2BdKC4rPylbXCInYF0vKTtcbiAgICAgIGlmIChpbmxpbmVNYXRjaCkge1xuICAgICAgICBlbnRyaWVzLnB1c2goeyBkZXNjcmliZTogY3VycmVudERlc2NyaWJlLCB0ZXN0OiBpbmxpbmVNYXRjaFsxXSB9KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHBlbmRpbmdUZXN0QXMgPSB0cnVlO1xuICAgICAgICB0ZXN0QXNCcmFjZURlcHRoID0gMDtcbiAgICAgICAgdGVzdEFzTmVlZE5hbWUgPSBmYWxzZTtcbiAgICAgICAgZm9yIChjb25zdCBjaCBvZiB0cmltbWVkKSB7XG4gICAgICAgICAgaWYgKGNoID09PSBcIntcIikgdGVzdEFzQnJhY2VEZXB0aCsrO1xuICAgICAgICAgIGlmIChjaCA9PT0gXCJ9XCIpIHRlc3RBc0JyYWNlRGVwdGgtLTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGVzdEFzQnJhY2VEZXB0aCA8PSAwKSB7XG4gICAgICAgICAgdGVzdEFzTmVlZE5hbWUgPSB0cnVlO1xuICAgICAgICAgIGNvbnN0IG5hbWVNYXRjaCA9IHRyaW1tZWQubWF0Y2goL31cXHMqLFxccypbXCInYF0oLis/KVtcIidgXS8pO1xuICAgICAgICAgIGlmIChuYW1lTWF0Y2gpIHtcbiAgICAgICAgICAgIGVudHJpZXMucHVzaCh7IGRlc2NyaWJlOiBjdXJyZW50RGVzY3JpYmUsIHRlc3Q6IG5hbWVNYXRjaFsxXSB9KTtcbiAgICAgICAgICAgIHBlbmRpbmdUZXN0QXMgPSBmYWxzZTtcbiAgICAgICAgICAgIHRlc3RBc05lZWROYW1lID0gZmFsc2U7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChwZW5kaW5nVGVzdEFzKSB7XG4gICAgICBpZiAoIXRlc3RBc05lZWROYW1lKSB7XG4gICAgICAgIGZvciAoY29uc3QgY2ggb2YgdHJpbW1lZCkge1xuICAgICAgICAgIGlmIChjaCA9PT0gXCJ7XCIpIHRlc3RBc0JyYWNlRGVwdGgrKztcbiAgICAgICAgICBpZiAoY2ggPT09IFwifVwiKSB0ZXN0QXNCcmFjZURlcHRoLS07XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRlc3RBc0JyYWNlRGVwdGggPD0gMCkge1xuICAgICAgICAgIHRlc3RBc05lZWROYW1lID0gdHJ1ZTtcbiAgICAgICAgICBjb25zdCBuYW1lTWF0Y2ggPSB0cmltbWVkLm1hdGNoKC99XFxzKixcXHMqW1wiJ2BdKC4rPylbXCInYF0vKTtcbiAgICAgICAgICBpZiAobmFtZU1hdGNoKSB7XG4gICAgICAgICAgICBlbnRyaWVzLnB1c2goeyBkZXNjcmliZTogY3VycmVudERlc2NyaWJlLCB0ZXN0OiBuYW1lTWF0Y2hbMV0gfSk7XG4gICAgICAgICAgICBwZW5kaW5nVGVzdEFzID0gZmFsc2U7XG4gICAgICAgICAgICB0ZXN0QXNOZWVkTmFtZSA9IGZhbHNlO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc3QgbmFtZU1hdGNoID0gdHJpbW1lZC5tYXRjaCgvXltcIidgXSguKz8pW1wiJ2BdLyk7XG4gICAgICAgIGlmIChuYW1lTWF0Y2gpIHtcbiAgICAgICAgICBlbnRyaWVzLnB1c2goeyBkZXNjcmliZTogY3VycmVudERlc2NyaWJlLCB0ZXN0OiBuYW1lTWF0Y2hbMV0gfSk7XG4gICAgICAgICAgcGVuZGluZ1Rlc3RBcyA9IGZhbHNlO1xuICAgICAgICAgIHRlc3RBc05lZWROYW1lID0gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IGNoIG9mIHRyaW1tZWQpIHtcbiAgICAgIGlmIChjaCA9PT0gXCJ7XCIpIGJyYWNlRGVwdGgrKztcbiAgICAgIGlmIChjaCA9PT0gXCJ9XCIpIHtcbiAgICAgICAgYnJhY2VEZXB0aC0tO1xuICAgICAgICBpZiAoY3VycmVudERlc2NyaWJlICYmIGJyYWNlRGVwdGggPD0gZGVzY3JpYmVEZXB0aCkge1xuICAgICAgICAgIGN1cnJlbnREZXNjcmliZSA9IG51bGw7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZXR1cm4gZW50cmllcztcbn1cblxuLyoqIO2UhOuhnOygne2KuCDrgrQgKi50ZXN0LnRzIO2MjOydvOydhCDsiqTsupTtlZjsl6wgQUMg66qp66GdIOuwmO2ZmCAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldEFjTGlzdCgpOiBDZGRBY0xpc3RSZXN1bHQge1xuICBjb25zdCBwcm9qZWN0Um9vdCA9IGdldFByb2plY3RSb290KCk7XG4gIGNvbnN0IGZpbGVzID0gZmluZFRlc3RGaWxlcyhwcm9qZWN0Um9vdCk7XG5cbiAgY29uc3QgYWNGaWxlczogQ2RkQWNGaWxlW10gPSBbXTtcbiAgZm9yIChjb25zdCBhYnNQYXRoIG9mIGZpbGVzKSB7XG4gICAgY29uc3QgY29udGVudCA9IGZzLnJlYWRGaWxlU3luYyhhYnNQYXRoLCBcInV0Zi04XCIpO1xuICAgIGNvbnN0IGVudHJpZXMgPSBwYXJzZUFjRW50cmllcyhjb250ZW50KTtcbiAgICBpZiAoZW50cmllcy5sZW5ndGggPiAwKSB7XG4gICAgICBhY0ZpbGVzLnB1c2goe1xuICAgICAgICBwYXRoOiBwYXRoLnJlbGF0aXZlKHByb2plY3RSb290LCBhYnNQYXRoKSxcbiAgICAgICAgZW50cmllcyxcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIGNvbnN0IHRvdGFsID0gYWNGaWxlcy5yZWR1Y2UoKHN1bSwgZikgPT4gc3VtICsgZi5lbnRyaWVzLmxlbmd0aCwgMCk7XG4gIHJldHVybiB7IGZpbGVzOiBhY0ZpbGVzLCB0b3RhbCB9O1xufVxuXG4vKiogKi50ZXN0LnRzIO2MjOydvOydhCDsnqzqt4Ag7YOQ7IOJIChub2RlX21vZHVsZXMsIGRpc3Qg7KCc7Jm4KSAqL1xuZnVuY3Rpb24gZmluZFRlc3RGaWxlcyhkaXI6IHN0cmluZyk6IHN0cmluZ1tdIHtcbiAgY29uc3QgcmVzdWx0czogc3RyaW5nW10gPSBbXTtcbiAgY29uc3QgSUdOT1JFID0gbmV3IFNldChbXCJub2RlX21vZHVsZXNcIiwgXCJkaXN0XCIsIFwiLmdpdFwiLCBcImNvbnRyYWN0XCJdKTtcblxuICBmdW5jdGlvbiB3YWxrKGN1cnJlbnREaXI6IHN0cmluZyk6IHZvaWQge1xuICAgIGxldCBlbnRyaWVzOiBmcy5EaXJlbnRbXTtcbiAgICB0cnkge1xuICAgICAgZW50cmllcyA9IGZzLnJlYWRkaXJTeW5jKGN1cnJlbnREaXIsIHsgd2l0aEZpbGVUeXBlczogdHJ1ZSB9KTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgZm9yIChjb25zdCBlbnRyeSBvZiBlbnRyaWVzKSB7XG4gICAgICBpZiAoSUdOT1JFLmhhcyhlbnRyeS5uYW1lKSkgY29udGludWU7XG4gICAgICBjb25zdCBmdWxsUGF0aCA9IHBhdGguam9pbihjdXJyZW50RGlyLCBlbnRyeS5uYW1lKTtcbiAgICAgIGlmIChlbnRyeS5pc0RpcmVjdG9yeSgpKSB7XG4gICAgICAgIHdhbGsoZnVsbFBhdGgpO1xuICAgICAgfSBlbHNlIGlmIChlbnRyeS5pc0ZpbGUoKSAmJiBlbnRyeS5uYW1lLmVuZHNXaXRoKFwiLnRlc3QudHNcIikpIHtcbiAgICAgICAgcmVzdWx0cy5wdXNoKGZ1bGxQYXRoKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICB3YWxrKGRpcik7XG4gIHJlc3VsdHMuc29ydCgpO1xuICByZXR1cm4gcmVzdWx0cztcbn1cbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7O0FBa0RBLFNBQVMsaUJBQXlCO0NBQ2hDLE9BQU8sS0FBSyxLQUFLLE9BQU8sYUFBYSxNQUFN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
@@ -1 +1 @@
1
- {"version":3,"file":"migrations-api.d.ts","sourceRoot":"","sources":["../../src/ui/migrations-api.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,KAAK,eAAe,EAAqB,MAAM,SAAS,CAAC;AAmPlE,wBAAsB,qBAAqB,CAAC,MAAM,EAAE,eAAe,iBA0HlE"}
1
+ {"version":3,"file":"migrations-api.d.ts","sourceRoot":"","sources":["../../src/ui/migrations-api.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,KAAK,eAAe,EAAqB,MAAM,SAAS,CAAC;AAqPlE,wBAAsB,qBAAqB,CAAC,MAAM,EAAE,eAAe,iBAoIlE"}
@@ -4,6 +4,7 @@ import { BadRequestException, init_so_exceptions } from "../exceptions/so-except
4
4
  import { Sonamu, init_sonamu } from "../api/sonamu.js";
5
5
  import { SlackConfirm, init_slack_confirm } from "../migration/slack-confirm.js";
6
6
  import { MigrationTargetExecutionError, Migrator, init_migrator } from "../migration/migrator.js";
7
+ import { forwardAsyncErrors, init_async_route } from "./async-route.js";
7
8
  import { readFile } from "fs/promises";
8
9
  import { PassThrough } from "stream";
9
10
  //#region src/ui/migrations-api.ts
@@ -137,32 +138,32 @@ async function registerMigrationsApi(server) {
137
138
  const migrator = new Migrator();
138
139
  server.get("/api/migrations/connections", async () => ({ connections: migrator.getConnections() }));
139
140
  server.get("/api/migrations/codes", async () => ({ codes: await migrator.getMigrationCodes() }));
140
- server.get("/api/migrations/code", async (request) => {
141
+ server.get("/api/migrations/code", (request) => forwardAsyncErrors(async () => {
141
142
  const migrationCode = (await migrator.getMigrationCodes()).find(({ name }) => name === request.query.codeName);
142
143
  if (migrationCode === void 0) throw new BadRequestException(SD("error.badRequest"));
143
144
  return { code: await readFile(migrationCode.path, "utf8") };
144
- });
145
- server.get("/api/migrations/status", async (request) => {
145
+ }));
146
+ server.get("/api/migrations/status", (request) => forwardAsyncErrors(async () => {
146
147
  if (request.query.connKey === void 0) return { status: await migrator.getStatus() };
147
148
  return { status: await migrator.getConnectionStatus(request.query.connKey) };
148
- });
149
- server.get("/api/migrations/prepared-codes", async (request) => ({ preparedCodes: await migrator.getPreparedCodes(request.query.compareConnKey) }));
150
- server.post("/api/migrations/request-approval", async (request) => {
149
+ }));
150
+ server.get("/api/migrations/prepared-codes", (request) => forwardAsyncErrors(async () => ({ preparedCodes: await migrator.getPreparedCodes(request.query.compareConnKey) })));
151
+ server.post("/api/migrations/request-approval", (request) => forwardAsyncErrors(async () => {
151
152
  return requestApproval(migrator, request.body.targets, request.body.requestor);
152
- });
153
- server.post("/api/migrations/checkApproval", async (request) => {
153
+ }));
154
+ server.post("/api/migrations/checkApproval", (request) => forwardAsyncErrors(async () => {
154
155
  const slack = new SlackConfirm();
155
156
  return slack.isConfigured() ? slack.checkApproval(request.body.channel, request.body.ts) : {
156
157
  approved: true,
157
158
  rejected: false
158
159
  };
159
- });
160
- server.post("/api/migrations/forceApproval", async (request) => {
160
+ }));
161
+ server.post("/api/migrations/forceApproval", (request) => forwardAsyncErrors(async () => {
161
162
  const slack = new SlackConfirm();
162
163
  if (!slack.isConfigured()) throw new BadRequestException(SD("sonamu.error.slackConfirmNotConfigured"));
163
164
  await slack.forceApproval(request.body.channel, request.body.ts, request.body.reason, request.body.requestor);
164
165
  return { success: true };
165
- });
166
+ }));
166
167
  server.post("/api/migrations/shadow", async (_request, reply) => {
167
168
  return sendMigrationStream(reply, "shadow", [], (onProgress) => {
168
169
  return migrator.runShadowTest({ onProgress });
@@ -183,14 +184,14 @@ async function registerMigrationsApi(server) {
183
184
  return migrator.rollback(request.body.targets, { onProgress });
184
185
  });
185
186
  });
186
- server.post("/api/migrations/generatePreparedCodes", async (request) => migrator.generatePreparedCodes(request.body.compareConnKey));
187
- server.post("/api/migrations/runAction", async (request) => {
187
+ server.post("/api/migrations/generatePreparedCodes", (request) => forwardAsyncErrors(async () => migrator.generatePreparedCodes(request.body.compareConnKey)));
188
+ server.post("/api/migrations/runAction", (request) => forwardAsyncErrors(async () => {
188
189
  if (request.body.action === "shadow") return migrator.runShadowTest();
189
190
  if (request.body.action === "apply") return runLegacyApply(migrator, request.body);
190
191
  assertTargets(migrator, request.body.targets);
191
192
  await getAvailableTargetStatuses(migrator, request.body.targets);
192
193
  return migrator.rollback(request.body.targets);
193
- });
194
+ }));
194
195
  }
195
196
  var LOCAL_HOSTS;
196
197
  var init_migrations_api = __esmMin((() => {
@@ -199,6 +200,7 @@ var init_migrations_api = __esmMin((() => {
199
200
  init_so_exceptions();
200
201
  init_migrator();
201
202
  init_slack_confirm();
203
+ init_async_route();
202
204
  LOCAL_HOSTS = /* @__PURE__ */ new Set([
203
205
  "localhost",
204
206
  "127.0.0.1",
@@ -210,4 +212,4 @@ var init_migrations_api = __esmMin((() => {
210
212
  init_migrations_api();
211
213
  export { init_migrations_api, registerMigrationsApi };
212
214
 
213
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWlncmF0aW9ucy1hcGkuanMiLCJuYW1lcyI6W10sInNvdXJjZXMiOlsiLi4vLi4vc3JjL3VpL21pZ3JhdGlvbnMtYXBpLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IHJlYWRGaWxlIH0gZnJvbSBcImZzL3Byb21pc2VzXCI7XG5pbXBvcnQgeyBQYXNzVGhyb3VnaCB9IGZyb20gXCJzdHJlYW1cIjtcblxuaW1wb3J0IHsgdHlwZSBGYXN0aWZ5SW5zdGFuY2UsIHR5cGUgRmFzdGlmeVJlcGx5IH0gZnJvbSBcImZhc3RpZnlcIjtcblxuaW1wb3J0IHsgU29uYW11IH0gZnJvbSBcIi4uL2FwaS9zb25hbXVcIjtcbmltcG9ydCB7IHR5cGUgU29uYW11REJDb25maWcgfSBmcm9tIFwiLi4vZGF0YWJhc2UvZGJcIjtcbmltcG9ydCB7IFNEIH0gZnJvbSBcIi4uL2RpY3Qvc2RcIjtcbmltcG9ydCB7IEJhZFJlcXVlc3RFeGNlcHRpb24gfSBmcm9tIFwiLi4vZXhjZXB0aW9ucy9zby1leGNlcHRpb25zXCI7XG5pbXBvcnQge1xuICBNaWdyYXRvcixcbiAgTWlncmF0aW9uVGFyZ2V0RXhlY3V0aW9uRXJyb3IsXG4gIHR5cGUgTWlncmF0aW9uUmVzdWx0LFxufSBmcm9tIFwiLi4vbWlncmF0aW9uL21pZ3JhdG9yXCI7XG5pbXBvcnQgeyBTbGFja0NvbmZpcm0sIHR5cGUgU2xhY2tDb25maXJtUGVuZGluZ1Jlc3VsdCB9IGZyb20gXCIuLi9taWdyYXRpb24vc2xhY2stY29uZmlybVwiO1xuaW1wb3J0IHtcbiAgdHlwZSBNaWdyYXRpb25BY3Rpb24sXG4gIHR5cGUgTWlncmF0aW9uQ29ubmVjdGlvblN0YXR1cyxcbiAgdHlwZSBNaWdyYXRpb25Qcm9ncmVzc0V2ZW50LFxuICB0eXBlIE1pZ3JhdGlvblN0cmVhbUV2ZW50LFxuICB0eXBlIE1pZ3JhdGlvblRhcmdldCxcbn0gZnJvbSBcIi4uL21pZ3JhdGlvbi90eXBlc1wiO1xuXG50eXBlIEFwcHJvdmFsUmVhZHkgPSB7IHR5cGU6IFwicmVhZHlcIiB9O1xudHlwZSBBcHByb3ZhbFJlc3VsdCA9IEFwcHJvdmFsUmVhZHkgfCBTbGFja0NvbmZpcm1QZW5kaW5nUmVzdWx0O1xudHlwZSBBcHBseUJvZHkgPSB7IHRhcmdldHM6IE1pZ3JhdGlvblRhcmdldFtdOyByZXF1ZXN0b3I/OiBzdHJpbmcgfTtcbnR5cGUgTGVnYWN5QXBwbHlCb2R5ID0gQXBwbHlCb2R5ICYgeyBmb3JjZT86IGJvb2xlYW47IGZvcmNlUmVhc29uPzogc3RyaW5nIH07XG5cbmNvbnN0IExPQ0FMX0hPU1RTID0gbmV3IFNldChbXCJsb2NhbGhvc3RcIiwgXCIxMjcuMC4wLjFcIiwgXCIwLjAuMC4wXCIsIFwiOjoxXCJdKTtcblxuZnVuY3Rpb24gYXNzZXJ0VGFyZ2V0cyhtaWdyYXRvcjogTWlncmF0b3IsIHRhcmdldHM6IE1pZ3JhdGlvblRhcmdldFtdKTogdm9pZCB7XG4gIGNvbnN0IGFsbG93ZWQgPSBuZXcgU2V0KG1pZ3JhdG9yLmdldENvbm5lY3Rpb25zKCkubWFwKCh7IGNvbm5LZXkgfSkgPT4gY29ubktleSkpO1xuICBjb25zdCBpbnZhbGlkID0gdGFyZ2V0cy5maWx0ZXIoKHRhcmdldCkgPT4gIWFsbG93ZWQuaGFzKHRhcmdldCkpO1xuICBpZiAodGFyZ2V0cy5sZW5ndGggPT09IDAgfHwgaW52YWxpZC5sZW5ndGggPiAwKSB7XG4gICAgdGhyb3cgbmV3IEJhZFJlcXVlc3RFeGNlcHRpb24oU0QoXCJlcnJvci5iYWRSZXF1ZXN0XCIpLCB7XG4gICAgICBtZXNzYWdlOiBgSW52YWxpZCBtaWdyYXRpb24gdGFyZ2V0czogJHtpbnZhbGlkLmxlbmd0aCA9PT0gMCA/IFwiKGVtcHR5KVwiIDogaW52YWxpZC5qb2luKFwiLCBcIil9YCxcbiAgICB9KTtcbiAgfVxufVxuXG5mdW5jdGlvbiB0YXJnZXRSZXF1aXJlc0FwcHJvdmFsKHNsYWNrOiBTbGFja0NvbmZpcm0sIHRhcmdldDogTWlncmF0aW9uVGFyZ2V0KTogYm9vbGVhbiB7XG4gIGNvbnN0IGNvbm5lY3Rpb24gPSBTb25hbXUuZGJDb25maWdbdGFyZ2V0XT8uY29ubmVjdGlvbiBhcyB7IGhvc3Q/OiBzdHJpbmcgfSB8IHVuZGVmaW5lZDtcbiAgY29uc3QgcmVtb3RlID0gIUxPQ0FMX0hPU1RTLmhhcygoY29ubmVjdGlvbj8uaG9zdCA/PyBcImxvY2FsaG9zdFwiKS50b0xvd2VyQ2FzZSgpKTtcbiAgcmV0dXJuIHJlbW90ZSAmJiBzbGFjay5pc1RhcmdldFJlcXVpcmVzQXBwcm92YWwodGFyZ2V0KTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gZ2V0QXZhaWxhYmxlVGFyZ2V0U3RhdHVzZXMoXG4gIG1pZ3JhdG9yOiBNaWdyYXRvcixcbiAgdGFyZ2V0czogTWlncmF0aW9uVGFyZ2V0W10sXG4pOiBQcm9taXNlPE1pZ3JhdGlvbkNvbm5lY3Rpb25TdGF0dXNbXT4ge1xuICBjb25zdCBzdGF0dXNlcyA9IGF3YWl0IFByb21pc2UuYWxsKHRhcmdldHMubWFwKCh0YXJnZXQpID0+IG1pZ3JhdG9yLmdldENvbm5lY3Rpb25TdGF0dXModGFyZ2V0KSkpO1xuICBjb25zdCBmYWlsZWQgPSBzdGF0dXNlcy5maWx0ZXIoKHsgc3RhdHVzLCBlcnJvciB9KSA9PiBzdGF0dXMgPT09IFwiZXJyb3JcIiB8fCBlcnJvciAhPT0gdW5kZWZpbmVkKTtcbiAgaWYgKGZhaWxlZC5sZW5ndGggPiAwKSB7XG4gICAgdGhyb3cgbmV3IEJhZFJlcXVlc3RFeGNlcHRpb24oU0QoXCJlcnJvci5iYWRSZXF1ZXN0XCIpLCB7XG4gICAgICBtZXNzYWdlOiBgTWlncmF0aW9uIHN0YXR1cyBjb3VsZCBub3QgYmUgdmVyaWZpZWQ6ICR7ZmFpbGVkLm1hcCgoeyBjb25uS2V5IH0pID0+IGNvbm5LZXkpLmpvaW4oXCIsIFwiKX1gLFxuICAgIH0pO1xuICB9XG4gIHJldHVybiBzdGF0dXNlcztcbn1cblxuZnVuY3Rpb24gZ2V0UGVuZGluZ01pZ3JhdGlvbnMoc3RhdHVzZXM6IE1pZ3JhdGlvbkNvbm5lY3Rpb25TdGF0dXNbXSkge1xuICByZXR1cm4gWy4uLm5ldyBTZXQoc3RhdHVzZXMuZmxhdE1hcCgoeyBwZW5kaW5nIH0pID0+IHBlbmRpbmcpKV07XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHJlcXVlc3RBcHByb3ZhbChcbiAgbWlncmF0b3I6IE1pZ3JhdG9yLFxuICB0YXJnZXRzOiBNaWdyYXRpb25UYXJnZXRbXSxcbiAgcmVxdWVzdG9yPzogc3RyaW5nLFxuKTogUHJvbWlzZTxBcHByb3ZhbFJlc3VsdD4ge1xuICBhc3NlcnRUYXJnZXRzKG1pZ3JhdG9yLCB0YXJnZXRzKTtcbiAgY29uc3Qgc3RhdHVzZXMgPSBhd2FpdCBnZXRBdmFpbGFibGVUYXJnZXRTdGF0dXNlcyhtaWdyYXRvciwgdGFyZ2V0cyk7XG4gIGNvbnN0IHNsYWNrID0gbmV3IFNsYWNrQ29uZmlybSgpO1xuICBjb25zdCByZXF1aXJlc0FwcHJvdmFsID0gdGFyZ2V0cy5zb21lKCh0YXJnZXQpID0+IHRhcmdldFJlcXVpcmVzQXBwcm92YWwoc2xhY2ssIHRhcmdldCkpO1xuICBpZiAoIXJlcXVpcmVzQXBwcm92YWwgfHwgIXNsYWNrLmlzQ29uZmlndXJlZCgpKSB7XG4gICAgcmV0dXJuIHsgdHlwZTogXCJyZWFkeVwiIH07XG4gIH1cblxuICBjb25zdCBwZW5kaW5nID0gZ2V0UGVuZGluZ01pZ3JhdGlvbnMoc3RhdHVzZXMpO1xuICBpZiAocGVuZGluZy5sZW5ndGggPT09IDApIHtcbiAgICByZXR1cm4geyB0eXBlOiBcInJlYWR5XCIgfTtcbiAgfVxuXG4gIGNvbnN0IGV4aXN0aW5nID0gYXdhaXQgc2xhY2suZ2V0RXhpc3RpbmdSZXF1ZXN0KHBlbmRpbmcpO1xuICBpZiAoZXhpc3RpbmcgIT09IG51bGwpIHtcbiAgICBjb25zdCBhcHByb3ZhbCA9IGF3YWl0IHNsYWNrLmNoZWNrQXBwcm92YWwoZXhpc3RpbmcuY2hhbm5lbCwgZXhpc3RpbmcudHMpO1xuICAgIGlmIChhcHByb3ZhbC5hcHByb3ZlZCkge1xuICAgICAgcmV0dXJuIHsgdHlwZTogXCJyZWFkeVwiIH07XG4gICAgfVxuICAgIGlmIChhcHByb3ZhbC5yZWplY3RlZCkge1xuICAgICAgdGhyb3cgbmV3IEJhZFJlcXVlc3RFeGNlcHRpb24oU0QoXCJzb25hbXUuZXJyb3IubWlncmF0aW9uUmVqZWN0ZWRcIikpO1xuICAgIH1cbiAgICByZXR1cm4geyB0eXBlOiBcInBlbmRpbmdcIiwgLi4uZXhpc3RpbmcgfTtcbiAgfVxuXG4gIGNvbnN0IGNyZWF0ZWQgPSBhd2FpdCBzbGFjay5wb3N0QXBwcm92YWxSZXF1ZXN0KHBlbmRpbmcsIHRhcmdldHMsIHJlcXVlc3Rvcik7XG4gIGF3YWl0IHNsYWNrLnNhdmVSZXF1ZXN0KHBlbmRpbmcsIGNyZWF0ZWQuY2hhbm5lbCwgY3JlYXRlZC50cyk7XG4gIHJldHVybiB7IHR5cGU6IFwicGVuZGluZ1wiLCAuLi5jcmVhdGVkIH07XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHJlcXVpcmVBcHByb3ZlZEFwcGx5KFxuICBib2R5OiBBcHBseUJvZHksXG4gIHN0YXR1c2VzOiBNaWdyYXRpb25Db25uZWN0aW9uU3RhdHVzW10sXG4pOiBQcm9taXNlPHsgY2hhbm5lbDogc3RyaW5nOyB0czogc3RyaW5nIH0gfCBudWxsPiB7XG4gIGNvbnN0IHNsYWNrID0gbmV3IFNsYWNrQ29uZmlybSgpO1xuICBjb25zdCByZXF1aXJlc0FwcHJvdmFsID0gYm9keS50YXJnZXRzLnNvbWUoKHRhcmdldCkgPT4gdGFyZ2V0UmVxdWlyZXNBcHByb3ZhbChzbGFjaywgdGFyZ2V0KSk7XG4gIGlmICghcmVxdWlyZXNBcHByb3ZhbCB8fCAhc2xhY2suaXNDb25maWd1cmVkKCkpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIGNvbnN0IHBlbmRpbmcgPSBnZXRQZW5kaW5nTWlncmF0aW9ucyhzdGF0dXNlcyk7XG4gIGlmIChwZW5kaW5nLmxlbmd0aCA9PT0gMCkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgY29uc3QgZXhpc3RpbmcgPSBhd2FpdCBzbGFjay5nZXRFeGlzdGluZ1JlcXVlc3QocGVuZGluZyk7XG4gIGlmIChleGlzdGluZyA9PT0gbnVsbCkge1xuICAgIHRocm93IG5ldyBCYWRSZXF1ZXN0RXhjZXB0aW9uKFNEKFwiZXJyb3IuYmFkUmVxdWVzdFwiKSwge1xuICAgICAgbWVzc2FnZTogXCJTbGFjayBhcHByb3ZhbCBoYXMgbm90IGJlZW4gcmVxdWVzdGVkXCIsXG4gICAgfSk7XG4gIH1cbiAgY29uc3QgYXBwcm92YWwgPSBhd2FpdCBzbGFjay5jaGVja0FwcHJvdmFsKGV4aXN0aW5nLmNoYW5uZWwsIGV4aXN0aW5nLnRzKTtcbiAgaWYgKGFwcHJvdmFsLnJlamVjdGVkKSB7XG4gICAgdGhyb3cgbmV3IEJhZFJlcXVlc3RFeGNlcHRpb24oU0QoXCJzb25hbXUuZXJyb3IubWlncmF0aW9uUmVqZWN0ZWRcIikpO1xuICB9XG4gIGlmICghYXBwcm92YWwuYXBwcm92ZWQpIHtcbiAgICB0aHJvdyBuZXcgQmFkUmVxdWVzdEV4Y2VwdGlvbihTRChcImVycm9yLmJhZFJlcXVlc3RcIiksIHtcbiAgICAgIG1lc3NhZ2U6IFwiU2xhY2sgYXBwcm92YWwgaXMgc3RpbGwgcGVuZGluZ1wiLFxuICAgIH0pO1xuICB9XG4gIHJldHVybiBleGlzdGluZztcbn1cblxuYXN5bmMgZnVuY3Rpb24gcnVuTGVnYWN5QXBwbHkoXG4gIG1pZ3JhdG9yOiBNaWdyYXRvcixcbiAgYm9keTogTGVnYWN5QXBwbHlCb2R5LFxuKTogUHJvbWlzZTxNaWdyYXRpb25SZXN1bHQgfCBTbGFja0NvbmZpcm1QZW5kaW5nUmVzdWx0PiB7XG4gIGFzc2VydFRhcmdldHMobWlncmF0b3IsIGJvZHkudGFyZ2V0cyk7XG4gIGNvbnN0IHN0YXR1c2VzID0gYXdhaXQgZ2V0QXZhaWxhYmxlVGFyZ2V0U3RhdHVzZXMobWlncmF0b3IsIGJvZHkudGFyZ2V0cyk7XG4gIGNvbnN0IHNsYWNrID0gbmV3IFNsYWNrQ29uZmlybSgpO1xuICBjb25zdCByZXF1aXJlc0FwcHJvdmFsID0gYm9keS50YXJnZXRzLnNvbWUoKHRhcmdldCkgPT4gdGFyZ2V0UmVxdWlyZXNBcHByb3ZhbChzbGFjaywgdGFyZ2V0KSk7XG4gIGlmICghcmVxdWlyZXNBcHByb3ZhbCB8fCAhc2xhY2suaXNDb25maWd1cmVkKCkpIHtcbiAgICByZXR1cm4gbWlncmF0b3IuYXBwbHkoYm9keS50YXJnZXRzKTtcbiAgfVxuXG4gIGNvbnN0IHBlbmRpbmcgPSBnZXRQZW5kaW5nTWlncmF0aW9ucyhzdGF0dXNlcyk7XG4gIGlmIChwZW5kaW5nLmxlbmd0aCA9PT0gMCkge1xuICAgIHJldHVybiBtaWdyYXRvci5hcHBseShib2R5LnRhcmdldHMpO1xuICB9XG5cbiAgY29uc3QgZXhpc3RpbmcgPSBhd2FpdCBzbGFjay5nZXRFeGlzdGluZ1JlcXVlc3QocGVuZGluZyk7XG4gIGlmIChleGlzdGluZyA9PT0gbnVsbCkge1xuICAgIGNvbnN0IGNyZWF0ZWQgPSBhd2FpdCBzbGFjay5wb3N0QXBwcm92YWxSZXF1ZXN0KHBlbmRpbmcsIGJvZHkudGFyZ2V0cywgYm9keS5yZXF1ZXN0b3IpO1xuICAgIGF3YWl0IHNsYWNrLnNhdmVSZXF1ZXN0KHBlbmRpbmcsIGNyZWF0ZWQuY2hhbm5lbCwgY3JlYXRlZC50cyk7XG4gICAgcmV0dXJuIHsgdHlwZTogXCJwZW5kaW5nXCIsIC4uLmNyZWF0ZWQgfTtcbiAgfVxuXG4gIGNvbnN0IGFwcHJvdmFsID0gYXdhaXQgc2xhY2suY2hlY2tBcHByb3ZhbChleGlzdGluZy5jaGFubmVsLCBleGlzdGluZy50cyk7XG4gIGlmIChhcHByb3ZhbC5yZWplY3RlZCkge1xuICAgIHRocm93IG5ldyBCYWRSZXF1ZXN0RXhjZXB0aW9uKFNEKFwic29uYW11LmVycm9yLm1pZ3JhdGlvblJlamVjdGVkXCIpKTtcbiAgfVxuICBpZiAoIWFwcHJvdmFsLmFwcHJvdmVkICYmICFib2R5LmZvcmNlKSB7XG4gICAgcmV0dXJuIHsgdHlwZTogXCJwZW5kaW5nXCIsIC4uLmV4aXN0aW5nIH07XG4gIH1cbiAgaWYgKCFhcHByb3ZhbC5hcHByb3ZlZCkge1xuICAgIGF3YWl0IHNsYWNrLmZvcmNlQXBwcm92YWwoXG4gICAgICBleGlzdGluZy5jaGFubmVsLFxuICAgICAgZXhpc3RpbmcudHMsXG4gICAgICBib2R5LmZvcmNlUmVhc29uID8/IFwi7IKs7JygIOyXhuydjFwiLFxuICAgICAgYm9keS5yZXF1ZXN0b3IsXG4gICAgKTtcbiAgfVxuXG4gIGNvbnN0IHJlc3VsdCA9IGF3YWl0IG1pZ3JhdG9yLmFwcGx5KGJvZHkudGFyZ2V0cyk7XG4gIGlmIChyZXN1bHQubGVuZ3RoID4gMCkge1xuICAgIGF3YWl0IHNsYWNrLmxvZ0V4ZWN1dGlvbihleGlzdGluZy5jaGFubmVsLCBleGlzdGluZy50cywgcmVzdWx0LCBib2R5LnJlcXVlc3Rvcik7XG4gIH1cbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuZnVuY3Rpb24gc2VuZE1pZ3JhdGlvblN0cmVhbShcbiAgcmVwbHk6IEZhc3RpZnlSZXBseSxcbiAgYWN0aW9uOiBNaWdyYXRpb25BY3Rpb24sXG4gIHRhcmdldHM6IE1pZ3JhdGlvblRhcmdldFtdLFxuICBydW46IChvblByb2dyZXNzOiAoZXZlbnQ6IE1pZ3JhdGlvblByb2dyZXNzRXZlbnQpID0+IHZvaWQpID0+IFByb21pc2U8TWlncmF0aW9uUmVzdWx0PixcbiAgYWZ0ZXJDb21wbGV0ZT86IChyZXN1bHQ6IE1pZ3JhdGlvblJlc3VsdCkgPT4gUHJvbWlzZTx2b2lkPixcbikge1xuICBjb25zdCBzdHJlYW0gPSBuZXcgUGFzc1Rocm91Z2goKTtcbiAgbGV0IGNhbldyaXRlID0gdHJ1ZTtcbiAgbGV0IGN1cnJlbnQ6IE1pZ3JhdGlvblByb2dyZXNzRXZlbnQgfCB1bmRlZmluZWQ7XG4gIGNvbnN0IGNvbXBsZXRlZFRhcmdldHM6IE1pZ3JhdGlvblRhcmdldFtdID0gW107XG4gIGNvbnN0IHdyaXRlID0gKGV2ZW50OiBNaWdyYXRpb25TdHJlYW1FdmVudCkgPT4ge1xuICAgIGlmIChjYW5Xcml0ZSAmJiAhc3RyZWFtLmRlc3Ryb3llZCkge1xuICAgICAgc3RyZWFtLndyaXRlKGAke0pTT04uc3RyaW5naWZ5KGV2ZW50KX1cXG5gKTtcbiAgICB9XG4gIH07XG5cbiAgc3RyZWFtLm9uKFwiY2xvc2VcIiwgKCkgPT4ge1xuICAgIGNhbldyaXRlID0gZmFsc2U7XG4gIH0pO1xuICByZXBseVxuICAgIC5oZWFkZXIoXCJjb250ZW50LXR5cGVcIiwgXCJhcHBsaWNhdGlvbi94LW5kanNvbjsgY2hhcnNldD11dGYtOFwiKVxuICAgIC5oZWFkZXIoXCJjYWNoZS1jb250cm9sXCIsIFwibm8tY2FjaGUsIG5vLXRyYW5zZm9ybVwiKVxuICAgIC5oZWFkZXIoXCJjb250ZW50LWVuY29kaW5nXCIsIFwiaWRlbnRpdHlcIilcbiAgICAuaGVhZGVyKFwieC1uby1jb21wcmVzc2lvblwiLCBcIjFcIik7XG5cbiAgdm9pZCAoYXN5bmMgKCkgPT4ge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBydW4oKGV2ZW50KSA9PiB7XG4gICAgICAgIGlmIChldmVudC50eXBlID09PSBcInRhcmdldC1jb21wbGV0ZVwiKSB7XG4gICAgICAgICAgaWYgKGV2ZW50LmNvbm5LZXkgIT09IFwic2hhZG93XCIpIGNvbXBsZXRlZFRhcmdldHMucHVzaChldmVudC5jb25uS2V5KTtcbiAgICAgICAgICB3cml0ZShldmVudCk7XG4gICAgICAgICAgLy8g64uk7J2MIHRhcmdldOydmCBsaWZlY3ljbGXsnbQg7Iuc7J6R65CY6riwIOyghCDsmKTrpZjrpbwg7KeB7KCEIHRhcmdldOyXkCDsnpjrqrsg6reA7IaN7ZWY7KeAIOyViuyKteuLiOuLpC5cbiAgICAgICAgICBjdXJyZW50ID0gdW5kZWZpbmVkO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBjdXJyZW50ID0gZXZlbnQ7XG4gICAgICAgIHdyaXRlKGV2ZW50KTtcbiAgICAgIH0pO1xuICAgICAgYXdhaXQgYWZ0ZXJDb21wbGV0ZT8uKHJlc3VsdCk7XG4gICAgICB3cml0ZSh7IHR5cGU6IFwiY29tcGxldGVcIiwgcmVzdWx0IH0pO1xuICAgIH0gY2F0Y2ggKGNhdWdodCkge1xuICAgICAgY29uc3QgbWVzc2FnZSA9IGNhdWdodCBpbnN0YW5jZW9mIEVycm9yID8gY2F1Z2h0Lm1lc3NhZ2UgOiBTdHJpbmcoY2F1Z2h0KTtcbiAgICAgIGNvbnN0IGZhaWxlZFRhcmdldCA9XG4gICAgICAgIGNhdWdodCBpbnN0YW5jZW9mIE1pZ3JhdGlvblRhcmdldEV4ZWN1dGlvbkVycm9yID8gY2F1Z2h0LmNvbm5LZXkgOiBjdXJyZW50Py5jb25uS2V5O1xuICAgICAgd3JpdGUoe1xuICAgICAgICB0eXBlOiBcImVycm9yXCIsXG4gICAgICAgIGFjdGlvbixcbiAgICAgICAgbWVzc2FnZSxcbiAgICAgICAgY29ubktleTogZmFpbGVkVGFyZ2V0LFxuICAgICAgICBmaWxlOlxuICAgICAgICAgIGN1cnJlbnQ/LnR5cGUgPT09IFwiZmlsZS1zdGFydFwiIHx8IGN1cnJlbnQ/LnR5cGUgPT09IFwiZmlsZS1leGVjdXRlZFwiXG4gICAgICAgICAgICA/IGN1cnJlbnQuZmlsZVxuICAgICAgICAgICAgOiB1bmRlZmluZWQsXG4gICAgICAgIGNvbXBsZXRlZFRhcmdldHMsXG4gICAgICAgIHBlbmRpbmdUYXJnZXRzOiB0YXJnZXRzLmZpbHRlcigodGFyZ2V0KSA9PiAhY29tcGxldGVkVGFyZ2V0cy5pbmNsdWRlcyh0YXJnZXQpKSxcbiAgICAgIH0pO1xuICAgIH0gZmluYWxseSB7XG4gICAgICBpZiAoIXN0cmVhbS5kZXN0cm95ZWQpIHtcbiAgICAgICAgc3RyZWFtLmVuZCgpO1xuICAgICAgfVxuICAgIH1cbiAgfSkoKTtcblxuICByZXR1cm4gcmVwbHkuc2VuZChzdHJlYW0pO1xufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcmVnaXN0ZXJNaWdyYXRpb25zQXBpKHNlcnZlcjogRmFzdGlmeUluc3RhbmNlKSB7XG4gIGNvbnN0IG1pZ3JhdG9yID0gbmV3IE1pZ3JhdG9yKCk7XG5cbiAgc2VydmVyLmdldChcIi9hcGkvbWlncmF0aW9ucy9jb25uZWN0aW9uc1wiLCBhc3luYyAoKSA9PiAoe1xuICAgIGNvbm5lY3Rpb25zOiBtaWdyYXRvci5nZXRDb25uZWN0aW9ucygpLFxuICB9KSk7XG4gIHNlcnZlci5nZXQoXCIvYXBpL21pZ3JhdGlvbnMvY29kZXNcIiwgYXN5bmMgKCkgPT4gKHsgY29kZXM6IGF3YWl0IG1pZ3JhdG9yLmdldE1pZ3JhdGlvbkNvZGVzKCkgfSkpO1xuICBzZXJ2ZXIuZ2V0PHsgUXVlcnlzdHJpbmc6IHsgY29kZU5hbWU6IHN0cmluZyB9IH0+KFwiL2FwaS9taWdyYXRpb25zL2NvZGVcIiwgYXN5bmMgKHJlcXVlc3QpID0+IHtcbiAgICBjb25zdCBtaWdyYXRpb25Db2RlID0gKGF3YWl0IG1pZ3JhdG9yLmdldE1pZ3JhdGlvbkNvZGVzKCkpLmZpbmQoXG4gICAgICAoeyBuYW1lIH0pID0+IG5hbWUgPT09IHJlcXVlc3QucXVlcnkuY29kZU5hbWUsXG4gICAgKTtcbiAgICBpZiAobWlncmF0aW9uQ29kZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aHJvdyBuZXcgQmFkUmVxdWVzdEV4Y2VwdGlvbihTRChcImVycm9yLmJhZFJlcXVlc3RcIikpO1xuICAgIH1cbiAgICByZXR1cm4geyBjb2RlOiBhd2FpdCByZWFkRmlsZShtaWdyYXRpb25Db2RlLnBhdGgsIFwidXRmOFwiKSB9O1xuICB9KTtcbiAgc2VydmVyLmdldDx7IFF1ZXJ5c3RyaW5nOiB7IGNvbm5LZXk/OiBNaWdyYXRpb25UYXJnZXQgfSB9PihcbiAgICBcIi9hcGkvbWlncmF0aW9ucy9zdGF0dXNcIixcbiAgICBhc3luYyAocmVxdWVzdCkgPT4ge1xuICAgICAgaWYgKHJlcXVlc3QucXVlcnkuY29ubktleSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHJldHVybiB7IHN0YXR1czogYXdhaXQgbWlncmF0b3IuZ2V0U3RhdHVzKCkgfTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB7IHN0YXR1czogYXdhaXQgbWlncmF0b3IuZ2V0Q29ubmVjdGlvblN0YXR1cyhyZXF1ZXN0LnF1ZXJ5LmNvbm5LZXkpIH07XG4gICAgfSxcbiAgKTtcbiAgc2VydmVyLmdldDx7IFF1ZXJ5c3RyaW5nOiB7IGNvbXBhcmVDb25uS2V5OiBNaWdyYXRpb25UYXJnZXQgfSB9PihcbiAgICBcIi9hcGkvbWlncmF0aW9ucy9wcmVwYXJlZC1jb2Rlc1wiLFxuICAgIGFzeW5jIChyZXF1ZXN0KSA9PiAoe1xuICAgICAgcHJlcGFyZWRDb2RlczogYXdhaXQgbWlncmF0b3IuZ2V0UHJlcGFyZWRDb2RlcyhyZXF1ZXN0LnF1ZXJ5LmNvbXBhcmVDb25uS2V5KSxcbiAgICB9KSxcbiAgKTtcblxuICBzZXJ2ZXIucG9zdDx7IEJvZHk6IEFwcGx5Qm9keSB9PihcIi9hcGkvbWlncmF0aW9ucy9yZXF1ZXN0LWFwcHJvdmFsXCIsIGFzeW5jIChyZXF1ZXN0KSA9PiB7XG4gICAgcmV0dXJuIHJlcXVlc3RBcHByb3ZhbChtaWdyYXRvciwgcmVxdWVzdC5ib2R5LnRhcmdldHMsIHJlcXVlc3QuYm9keS5yZXF1ZXN0b3IpO1xuICB9KTtcbiAgc2VydmVyLnBvc3Q8eyBCb2R5OiB7IGNoYW5uZWw6IHN0cmluZzsgdHM6IHN0cmluZyB9IH0+KFxuICAgIFwiL2FwaS9taWdyYXRpb25zL2NoZWNrQXBwcm92YWxcIixcbiAgICBhc3luYyAocmVxdWVzdCkgPT4ge1xuICAgICAgY29uc3Qgc2xhY2sgPSBuZXcgU2xhY2tDb25maXJtKCk7XG4gICAgICByZXR1cm4gc2xhY2suaXNDb25maWd1cmVkKClcbiAgICAgICAgPyBzbGFjay5jaGVja0FwcHJvdmFsKHJlcXVlc3QuYm9keS5jaGFubmVsLCByZXF1ZXN0LmJvZHkudHMpXG4gICAgICAgIDogeyBhcHByb3ZlZDogdHJ1ZSwgcmVqZWN0ZWQ6IGZhbHNlIH07XG4gICAgfSxcbiAgKTtcbiAgc2VydmVyLnBvc3Q8e1xuICAgIEJvZHk6IHsgY2hhbm5lbDogc3RyaW5nOyB0czogc3RyaW5nOyByZWFzb246IHN0cmluZzsgcmVxdWVzdG9yPzogc3RyaW5nIH07XG4gIH0+KFwiL2FwaS9taWdyYXRpb25zL2ZvcmNlQXBwcm92YWxcIiwgYXN5bmMgKHJlcXVlc3QpID0+IHtcbiAgICBjb25zdCBzbGFjayA9IG5ldyBTbGFja0NvbmZpcm0oKTtcbiAgICBpZiAoIXNsYWNrLmlzQ29uZmlndXJlZCgpKSB7XG4gICAgICB0aHJvdyBuZXcgQmFkUmVxdWVzdEV4Y2VwdGlvbihTRChcInNvbmFtdS5lcnJvci5zbGFja0NvbmZpcm1Ob3RDb25maWd1cmVkXCIpKTtcbiAgICB9XG4gICAgYXdhaXQgc2xhY2suZm9yY2VBcHByb3ZhbChcbiAgICAgIHJlcXVlc3QuYm9keS5jaGFubmVsLFxuICAgICAgcmVxdWVzdC5ib2R5LnRzLFxuICAgICAgcmVxdWVzdC5ib2R5LnJlYXNvbixcbiAgICAgIHJlcXVlc3QuYm9keS5yZXF1ZXN0b3IsXG4gICAgKTtcbiAgICByZXR1cm4geyBzdWNjZXNzOiB0cnVlIH07XG4gIH0pO1xuXG4gIHNlcnZlci5wb3N0KFwiL2FwaS9taWdyYXRpb25zL3NoYWRvd1wiLCBhc3luYyAoX3JlcXVlc3QsIHJlcGx5KSA9PiB7XG4gICAgcmV0dXJuIHNlbmRNaWdyYXRpb25TdHJlYW0ocmVwbHksIFwic2hhZG93XCIsIFtdLCAob25Qcm9ncmVzcykgPT4ge1xuICAgICAgcmV0dXJuIG1pZ3JhdG9yLnJ1blNoYWRvd1Rlc3QoeyBvblByb2dyZXNzIH0pO1xuICAgIH0pO1xuICB9KTtcbiAgc2VydmVyLnBvc3Q8eyBCb2R5OiBBcHBseUJvZHkgfT4oXCIvYXBpL21pZ3JhdGlvbnMvYXBwbHlcIiwgYXN5bmMgKHJlcXVlc3QsIHJlcGx5KSA9PiB7XG4gICAgYXNzZXJ0VGFyZ2V0cyhtaWdyYXRvciwgcmVxdWVzdC5ib2R5LnRhcmdldHMpO1xuICAgIGNvbnN0IHN0YXR1c2VzID0gYXdhaXQgZ2V0QXZhaWxhYmxlVGFyZ2V0U3RhdHVzZXMobWlncmF0b3IsIHJlcXVlc3QuYm9keS50YXJnZXRzKTtcbiAgICBjb25zdCBhcHByb3ZhbCA9IGF3YWl0IHJlcXVpcmVBcHByb3ZlZEFwcGx5KHJlcXVlc3QuYm9keSwgc3RhdHVzZXMpO1xuICAgIHJldHVybiBzZW5kTWlncmF0aW9uU3RyZWFtKFxuICAgICAgcmVwbHksXG4gICAgICBcImFwcGx5XCIsXG4gICAgICByZXF1ZXN0LmJvZHkudGFyZ2V0cyxcbiAgICAgIChvblByb2dyZXNzKSA9PiBtaWdyYXRvci5hcHBseShyZXF1ZXN0LmJvZHkudGFyZ2V0cywgeyBvblByb2dyZXNzIH0pLFxuICAgICAgYXBwcm92YWwgPT09IG51bGxcbiAgICAgICAgPyB1bmRlZmluZWRcbiAgICAgICAgOiBhc3luYyAocmVzdWx0KSA9PiB7XG4gICAgICAgICAgICBhd2FpdCBuZXcgU2xhY2tDb25maXJtKCkubG9nRXhlY3V0aW9uKFxuICAgICAgICAgICAgICBhcHByb3ZhbC5jaGFubmVsLFxuICAgICAgICAgICAgICBhcHByb3ZhbC50cyxcbiAgICAgICAgICAgICAgcmVzdWx0LFxuICAgICAgICAgICAgICByZXF1ZXN0LmJvZHkucmVxdWVzdG9yLFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9LFxuICAgICk7XG4gIH0pO1xuICBzZXJ2ZXIucG9zdDx7IEJvZHk6IHsgdGFyZ2V0czogTWlncmF0aW9uVGFyZ2V0W10gfSB9PihcbiAgICBcIi9hcGkvbWlncmF0aW9ucy9yb2xsYmFja1wiLFxuICAgIGFzeW5jIChyZXF1ZXN0LCByZXBseSkgPT4ge1xuICAgICAgYXNzZXJ0VGFyZ2V0cyhtaWdyYXRvciwgcmVxdWVzdC5ib2R5LnRhcmdldHMpO1xuICAgICAgYXdhaXQgZ2V0QXZhaWxhYmxlVGFyZ2V0U3RhdHVzZXMobWlncmF0b3IsIHJlcXVlc3QuYm9keS50YXJnZXRzKTtcbiAgICAgIHJldHVybiBzZW5kTWlncmF0aW9uU3RyZWFtKHJlcGx5LCBcInJvbGxiYWNrXCIsIHJlcXVlc3QuYm9keS50YXJnZXRzLCAob25Qcm9ncmVzcykgPT4ge1xuICAgICAgICByZXR1cm4gbWlncmF0b3Iucm9sbGJhY2socmVxdWVzdC5ib2R5LnRhcmdldHMsIHsgb25Qcm9ncmVzcyB9KTtcbiAgICAgIH0pO1xuICAgIH0sXG4gICk7XG5cbiAgc2VydmVyLnBvc3Q8eyBCb2R5OiB7IGNvbXBhcmVDb25uS2V5PzogTWlncmF0aW9uVGFyZ2V0IH0gfT4oXG4gICAgXCIvYXBpL21pZ3JhdGlvbnMvZ2VuZXJhdGVQcmVwYXJlZENvZGVzXCIsXG4gICAgYXN5bmMgKHJlcXVlc3QpID0+IG1pZ3JhdG9yLmdlbmVyYXRlUHJlcGFyZWRDb2RlcyhyZXF1ZXN0LmJvZHkuY29tcGFyZUNvbm5LZXkpLFxuICApO1xuXG4gIC8vIOydtOyghCBVSSDrsojrk6Tqs7wg7Jm467aAIOyKpO2BrOumve2KuOqwgCDsg4gg7ISc67KE7JeQ7ISc64+EIO2VnCDrprTrpqzsiqQg64+Z7JWIIOuPmeyeke2VmOuPhOuhnSDsnKDsp4Dtlanri4jri6QuXG4gIHNlcnZlci5wb3N0PHtcbiAgICBCb2R5OiB7XG4gICAgICBhY3Rpb246IFwiYXBwbHlcIiB8IFwicm9sbGJhY2tcIiB8IFwic2hhZG93XCI7XG4gICAgICB0YXJnZXRzOiAoa2V5b2YgU29uYW11REJDb25maWcpW107XG4gICAgICBmb3JjZT86IGJvb2xlYW47XG4gICAgICBmb3JjZVJlYXNvbj86IHN0cmluZztcbiAgICAgIHJlcXVlc3Rvcj86IHN0cmluZztcbiAgICB9O1xuICB9PihcIi9hcGkvbWlncmF0aW9ucy9ydW5BY3Rpb25cIiwgYXN5bmMgKHJlcXVlc3QpID0+IHtcbiAgICBpZiAocmVxdWVzdC5ib2R5LmFjdGlvbiA9PT0gXCJzaGFkb3dcIikge1xuICAgICAgcmV0dXJuIG1pZ3JhdG9yLnJ1blNoYWRvd1Rlc3QoKTtcbiAgICB9XG4gICAgaWYgKHJlcXVlc3QuYm9keS5hY3Rpb24gPT09IFwiYXBwbHlcIikge1xuICAgICAgcmV0dXJuIHJ1bkxlZ2FjeUFwcGx5KG1pZ3JhdG9yLCByZXF1ZXN0LmJvZHkpO1xuICAgIH1cbiAgICBhc3NlcnRUYXJnZXRzKG1pZ3JhdG9yLCByZXF1ZXN0LmJvZHkudGFyZ2V0cyk7XG4gICAgYXdhaXQgZ2V0QXZhaWxhYmxlVGFyZ2V0U3RhdHVzZXMobWlncmF0b3IsIHJlcXVlc3QuYm9keS50YXJnZXRzKTtcbiAgICByZXR1cm4gbWlncmF0b3Iucm9sbGJhY2socmVxdWVzdC5ib2R5LnRhcmdldHMpO1xuICB9KTtcbn1cbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7O0FBOEJBLFNBQVMsY0FBYyxVQUFvQixTQUFrQztDQUMzRSxNQUFNLFVBQVUsSUFBSSxJQUFJLFNBQVMsZUFBZSxDQUFDLENBQUMsS0FBSyxFQUFFLGNBQWMsT0FBTyxDQUFDO0NBQy9FLE1BQU0sVUFBVSxRQUFRLFFBQVEsV0FBVyxDQUFDLFFBQVEsSUFBSSxNQUFNLENBQUM7Q0FDL0QsSUFBSSxRQUFRLFdBQVcsS0FBSyxRQUFRLFNBQVMsR0FDM0MsTUFBTSxJQUFJLG9CQUFvQixHQUFHLGtCQUFrQixHQUFHLEVBQ3BELFNBQVMsOEJBQThCLFFBQVEsV0FBVyxJQUFJLFlBQVksUUFBUSxLQUFLLElBQUksSUFDN0YsQ0FBQztBQUVMO0FBRUEsU0FBUyx1QkFBdUIsT0FBcUIsUUFBa0M7Q0FDckYsTUFBTSxhQUFhLE9BQU8sU0FBUyxPQUFPLEVBQUU7Q0FFNUMsT0FBTyxDQURTLFlBQVksS0FBSyxZQUFZLFFBQVEsWUFBQSxDQUFhLFlBQVksQ0FBQyxLQUM5RCxNQUFNLHlCQUF5QixNQUFNO0FBQ3hEO0FBRUEsZUFBZSwyQkFDYixVQUNBLFNBQ3NDO0NBQ3RDLE1BQU0sV0FBVyxNQUFNLFFBQVEsSUFBSSxRQUFRLEtBQUssV0FBVyxTQUFTLG9CQUFvQixNQUFNLENBQUMsQ0FBQztDQUNoRyxNQUFNLFNBQVMsU0FBUyxRQUFRLEVBQUUsUUFBUSxZQUFZLFdBQVcsV0FBVyxVQUFVLE1BQVM7Q0FDL0YsSUFBSSxPQUFPLFNBQVMsR0FDbEIsTUFBTSxJQUFJLG9CQUFvQixHQUFHLGtCQUFrQixHQUFHLEVBQ3BELFNBQVMsMkNBQTJDLE9BQU8sS0FBSyxFQUFFLGNBQWMsT0FBTyxDQUFDLENBQUMsS0FBSyxJQUFJLElBQ3BH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
215
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWlncmF0aW9ucy1hcGkuanMiLCJuYW1lcyI6W10sInNvdXJjZXMiOlsiLi4vLi4vc3JjL3VpL21pZ3JhdGlvbnMtYXBpLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IHJlYWRGaWxlIH0gZnJvbSBcImZzL3Byb21pc2VzXCI7XG5pbXBvcnQgeyBQYXNzVGhyb3VnaCB9IGZyb20gXCJzdHJlYW1cIjtcblxuaW1wb3J0IHsgdHlwZSBGYXN0aWZ5SW5zdGFuY2UsIHR5cGUgRmFzdGlmeVJlcGx5IH0gZnJvbSBcImZhc3RpZnlcIjtcblxuaW1wb3J0IHsgU29uYW11IH0gZnJvbSBcIi4uL2FwaS9zb25hbXVcIjtcbmltcG9ydCB7IHR5cGUgU29uYW11REJDb25maWcgfSBmcm9tIFwiLi4vZGF0YWJhc2UvZGJcIjtcbmltcG9ydCB7IFNEIH0gZnJvbSBcIi4uL2RpY3Qvc2RcIjtcbmltcG9ydCB7IEJhZFJlcXVlc3RFeGNlcHRpb24gfSBmcm9tIFwiLi4vZXhjZXB0aW9ucy9zby1leGNlcHRpb25zXCI7XG5pbXBvcnQge1xuICBNaWdyYXRvcixcbiAgTWlncmF0aW9uVGFyZ2V0RXhlY3V0aW9uRXJyb3IsXG4gIHR5cGUgTWlncmF0aW9uUmVzdWx0LFxufSBmcm9tIFwiLi4vbWlncmF0aW9uL21pZ3JhdG9yXCI7XG5pbXBvcnQgeyBTbGFja0NvbmZpcm0sIHR5cGUgU2xhY2tDb25maXJtUGVuZGluZ1Jlc3VsdCB9IGZyb20gXCIuLi9taWdyYXRpb24vc2xhY2stY29uZmlybVwiO1xuaW1wb3J0IHtcbiAgdHlwZSBNaWdyYXRpb25BY3Rpb24sXG4gIHR5cGUgTWlncmF0aW9uQ29ubmVjdGlvblN0YXR1cyxcbiAgdHlwZSBNaWdyYXRpb25Qcm9ncmVzc0V2ZW50LFxuICB0eXBlIE1pZ3JhdGlvblN0cmVhbUV2ZW50LFxuICB0eXBlIE1pZ3JhdGlvblRhcmdldCxcbn0gZnJvbSBcIi4uL21pZ3JhdGlvbi90eXBlc1wiO1xuaW1wb3J0IHsgZm9yd2FyZEFzeW5jRXJyb3JzIH0gZnJvbSBcIi4vYXN5bmMtcm91dGVcIjtcblxudHlwZSBBcHByb3ZhbFJlYWR5ID0geyB0eXBlOiBcInJlYWR5XCIgfTtcbnR5cGUgQXBwcm92YWxSZXN1bHQgPSBBcHByb3ZhbFJlYWR5IHwgU2xhY2tDb25maXJtUGVuZGluZ1Jlc3VsdDtcbnR5cGUgQXBwbHlCb2R5ID0geyB0YXJnZXRzOiBNaWdyYXRpb25UYXJnZXRbXTsgcmVxdWVzdG9yPzogc3RyaW5nIH07XG50eXBlIExlZ2FjeUFwcGx5Qm9keSA9IEFwcGx5Qm9keSAmIHsgZm9yY2U/OiBib29sZWFuOyBmb3JjZVJlYXNvbj86IHN0cmluZyB9O1xuXG5jb25zdCBMT0NBTF9IT1NUUyA9IG5ldyBTZXQoW1wibG9jYWxob3N0XCIsIFwiMTI3LjAuMC4xXCIsIFwiMC4wLjAuMFwiLCBcIjo6MVwiXSk7XG5cbmZ1bmN0aW9uIGFzc2VydFRhcmdldHMobWlncmF0b3I6IE1pZ3JhdG9yLCB0YXJnZXRzOiBNaWdyYXRpb25UYXJnZXRbXSk6IHZvaWQge1xuICBjb25zdCBhbGxvd2VkID0gbmV3IFNldChtaWdyYXRvci5nZXRDb25uZWN0aW9ucygpLm1hcCgoeyBjb25uS2V5IH0pID0+IGNvbm5LZXkpKTtcbiAgY29uc3QgaW52YWxpZCA9IHRhcmdldHMuZmlsdGVyKCh0YXJnZXQpID0+ICFhbGxvd2VkLmhhcyh0YXJnZXQpKTtcbiAgaWYgKHRhcmdldHMubGVuZ3RoID09PSAwIHx8IGludmFsaWQubGVuZ3RoID4gMCkge1xuICAgIHRocm93IG5ldyBCYWRSZXF1ZXN0RXhjZXB0aW9uKFNEKFwiZXJyb3IuYmFkUmVxdWVzdFwiKSwge1xuICAgICAgbWVzc2FnZTogYEludmFsaWQgbWlncmF0aW9uIHRhcmdldHM6ICR7aW52YWxpZC5sZW5ndGggPT09IDAgPyBcIihlbXB0eSlcIiA6IGludmFsaWQuam9pbihcIiwgXCIpfWAsXG4gICAgfSk7XG4gIH1cbn1cblxuZnVuY3Rpb24gdGFyZ2V0UmVxdWlyZXNBcHByb3ZhbChzbGFjazogU2xhY2tDb25maXJtLCB0YXJnZXQ6IE1pZ3JhdGlvblRhcmdldCk6IGJvb2xlYW4ge1xuICBjb25zdCBjb25uZWN0aW9uID0gLyogU0FGRVRZOiBVSSDrj4TqtazsnZggWm9kIOyeheugpSDsiqTtgqTrp4jqsIAg7J20IOqwkuydmCDtg4DsnoXsnYQg67O07J6l7ZWc64ukLiAqLyBTb25hbXVcbiAgICAuZGJDb25maWdbdGFyZ2V0XT8uY29ubmVjdGlvbiBhcyB7IGhvc3Q/OiBzdHJpbmcgfSB8IHVuZGVmaW5lZDtcbiAgY29uc3QgcmVtb3RlID0gIUxPQ0FMX0hPU1RTLmhhcygoY29ubmVjdGlvbj8uaG9zdCA/PyBcImxvY2FsaG9zdFwiKS50b0xvd2VyQ2FzZSgpKTtcbiAgcmV0dXJuIHJlbW90ZSAmJiBzbGFjay5pc1RhcmdldFJlcXVpcmVzQXBwcm92YWwodGFyZ2V0KTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gZ2V0QXZhaWxhYmxlVGFyZ2V0U3RhdHVzZXMoXG4gIG1pZ3JhdG9yOiBNaWdyYXRvcixcbiAgdGFyZ2V0czogTWlncmF0aW9uVGFyZ2V0W10sXG4pOiBQcm9taXNlPE1pZ3JhdGlvbkNvbm5lY3Rpb25TdGF0dXNbXT4ge1xuICBjb25zdCBzdGF0dXNlcyA9IGF3YWl0IFByb21pc2UuYWxsKHRhcmdldHMubWFwKCh0YXJnZXQpID0+IG1pZ3JhdG9yLmdldENvbm5lY3Rpb25TdGF0dXModGFyZ2V0KSkpO1xuICBjb25zdCBmYWlsZWQgPSBzdGF0dXNlcy5maWx0ZXIoKHsgc3RhdHVzLCBlcnJvciB9KSA9PiBzdGF0dXMgPT09IFwiZXJyb3JcIiB8fCBlcnJvciAhPT0gdW5kZWZpbmVkKTtcbiAgaWYgKGZhaWxlZC5sZW5ndGggPiAwKSB7XG4gICAgdGhyb3cgbmV3IEJhZFJlcXVlc3RFeGNlcHRpb24oU0QoXCJlcnJvci5iYWRSZXF1ZXN0XCIpLCB7XG4gICAgICBtZXNzYWdlOiBgTWlncmF0aW9uIHN0YXR1cyBjb3VsZCBub3QgYmUgdmVyaWZpZWQ6ICR7ZmFpbGVkLm1hcCgoeyBjb25uS2V5IH0pID0+IGNvbm5LZXkpLmpvaW4oXCIsIFwiKX1gLFxuICAgIH0pO1xuICB9XG4gIHJldHVybiBzdGF0dXNlcztcbn1cblxuZnVuY3Rpb24gZ2V0UGVuZGluZ01pZ3JhdGlvbnMoc3RhdHVzZXM6IE1pZ3JhdGlvbkNvbm5lY3Rpb25TdGF0dXNbXSkge1xuICByZXR1cm4gWy4uLm5ldyBTZXQoc3RhdHVzZXMuZmxhdE1hcCgoeyBwZW5kaW5nIH0pID0+IHBlbmRpbmcpKV07XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHJlcXVlc3RBcHByb3ZhbChcbiAgbWlncmF0b3I6IE1pZ3JhdG9yLFxuICB0YXJnZXRzOiBNaWdyYXRpb25UYXJnZXRbXSxcbiAgcmVxdWVzdG9yPzogc3RyaW5nLFxuKTogUHJvbWlzZTxBcHByb3ZhbFJlc3VsdD4ge1xuICBhc3NlcnRUYXJnZXRzKG1pZ3JhdG9yLCB0YXJnZXRzKTtcbiAgY29uc3Qgc3RhdHVzZXMgPSBhd2FpdCBnZXRBdmFpbGFibGVUYXJnZXRTdGF0dXNlcyhtaWdyYXRvciwgdGFyZ2V0cyk7XG4gIGNvbnN0IHNsYWNrID0gbmV3IFNsYWNrQ29uZmlybSgpO1xuICBjb25zdCByZXF1aXJlc0FwcHJvdmFsID0gdGFyZ2V0cy5zb21lKCh0YXJnZXQpID0+IHRhcmdldFJlcXVpcmVzQXBwcm92YWwoc2xhY2ssIHRhcmdldCkpO1xuICBpZiAoIXJlcXVpcmVzQXBwcm92YWwgfHwgIXNsYWNrLmlzQ29uZmlndXJlZCgpKSB7XG4gICAgcmV0dXJuIHsgdHlwZTogXCJyZWFkeVwiIH07XG4gIH1cblxuICBjb25zdCBwZW5kaW5nID0gZ2V0UGVuZGluZ01pZ3JhdGlvbnMoc3RhdHVzZXMpO1xuICBpZiAocGVuZGluZy5sZW5ndGggPT09IDApIHtcbiAgICByZXR1cm4geyB0eXBlOiBcInJlYWR5XCIgfTtcbiAgfVxuXG4gIGNvbnN0IGV4aXN0aW5nID0gYXdhaXQgc2xhY2suZ2V0RXhpc3RpbmdSZXF1ZXN0KHBlbmRpbmcpO1xuICBpZiAoZXhpc3RpbmcgIT09IG51bGwpIHtcbiAgICBjb25zdCBhcHByb3ZhbCA9IGF3YWl0IHNsYWNrLmNoZWNrQXBwcm92YWwoZXhpc3RpbmcuY2hhbm5lbCwgZXhpc3RpbmcudHMpO1xuICAgIGlmIChhcHByb3ZhbC5hcHByb3ZlZCkge1xuICAgICAgcmV0dXJuIHsgdHlwZTogXCJyZWFkeVwiIH07XG4gICAgfVxuICAgIGlmIChhcHByb3ZhbC5yZWplY3RlZCkge1xuICAgICAgdGhyb3cgbmV3IEJhZFJlcXVlc3RFeGNlcHRpb24oU0QoXCJzb25hbXUuZXJyb3IubWlncmF0aW9uUmVqZWN0ZWRcIikpO1xuICAgIH1cbiAgICByZXR1cm4geyB0eXBlOiBcInBlbmRpbmdcIiwgLi4uZXhpc3RpbmcgfTtcbiAgfVxuXG4gIGNvbnN0IGNyZWF0ZWQgPSBhd2FpdCBzbGFjay5wb3N0QXBwcm92YWxSZXF1ZXN0KHBlbmRpbmcsIHRhcmdldHMsIHJlcXVlc3Rvcik7XG4gIGF3YWl0IHNsYWNrLnNhdmVSZXF1ZXN0KHBlbmRpbmcsIGNyZWF0ZWQuY2hhbm5lbCwgY3JlYXRlZC50cyk7XG4gIHJldHVybiB7IHR5cGU6IFwicGVuZGluZ1wiLCAuLi5jcmVhdGVkIH07XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHJlcXVpcmVBcHByb3ZlZEFwcGx5KFxuICBib2R5OiBBcHBseUJvZHksXG4gIHN0YXR1c2VzOiBNaWdyYXRpb25Db25uZWN0aW9uU3RhdHVzW10sXG4pOiBQcm9taXNlPHsgY2hhbm5lbDogc3RyaW5nOyB0czogc3RyaW5nIH0gfCBudWxsPiB7XG4gIGNvbnN0IHNsYWNrID0gbmV3IFNsYWNrQ29uZmlybSgpO1xuICBjb25zdCByZXF1aXJlc0FwcHJvdmFsID0gYm9keS50YXJnZXRzLnNvbWUoKHRhcmdldCkgPT4gdGFyZ2V0UmVxdWlyZXNBcHByb3ZhbChzbGFjaywgdGFyZ2V0KSk7XG4gIGlmICghcmVxdWlyZXNBcHByb3ZhbCB8fCAhc2xhY2suaXNDb25maWd1cmVkKCkpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIGNvbnN0IHBlbmRpbmcgPSBnZXRQZW5kaW5nTWlncmF0aW9ucyhzdGF0dXNlcyk7XG4gIGlmIChwZW5kaW5nLmxlbmd0aCA9PT0gMCkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgY29uc3QgZXhpc3RpbmcgPSBhd2FpdCBzbGFjay5nZXRFeGlzdGluZ1JlcXVlc3QocGVuZGluZyk7XG4gIGlmIChleGlzdGluZyA9PT0gbnVsbCkge1xuICAgIHRocm93IG5ldyBCYWRSZXF1ZXN0RXhjZXB0aW9uKFNEKFwiZXJyb3IuYmFkUmVxdWVzdFwiKSwge1xuICAgICAgbWVzc2FnZTogXCJTbGFjayBhcHByb3ZhbCBoYXMgbm90IGJlZW4gcmVxdWVzdGVkXCIsXG4gICAgfSk7XG4gIH1cbiAgY29uc3QgYXBwcm92YWwgPSBhd2FpdCBzbGFjay5jaGVja0FwcHJvdmFsKGV4aXN0aW5nLmNoYW5uZWwsIGV4aXN0aW5nLnRzKTtcbiAgaWYgKGFwcHJvdmFsLnJlamVjdGVkKSB7XG4gICAgdGhyb3cgbmV3IEJhZFJlcXVlc3RFeGNlcHRpb24oU0QoXCJzb25hbXUuZXJyb3IubWlncmF0aW9uUmVqZWN0ZWRcIikpO1xuICB9XG4gIGlmICghYXBwcm92YWwuYXBwcm92ZWQpIHtcbiAgICB0aHJvdyBuZXcgQmFkUmVxdWVzdEV4Y2VwdGlvbihTRChcImVycm9yLmJhZFJlcXVlc3RcIiksIHtcbiAgICAgIG1lc3NhZ2U6IFwiU2xhY2sgYXBwcm92YWwgaXMgc3RpbGwgcGVuZGluZ1wiLFxuICAgIH0pO1xuICB9XG4gIHJldHVybiBleGlzdGluZztcbn1cblxuYXN5bmMgZnVuY3Rpb24gcnVuTGVnYWN5QXBwbHkoXG4gIG1pZ3JhdG9yOiBNaWdyYXRvcixcbiAgYm9keTogTGVnYWN5QXBwbHlCb2R5LFxuKTogUHJvbWlzZTxNaWdyYXRpb25SZXN1bHQgfCBTbGFja0NvbmZpcm1QZW5kaW5nUmVzdWx0PiB7XG4gIGFzc2VydFRhcmdldHMobWlncmF0b3IsIGJvZHkudGFyZ2V0cyk7XG4gIGNvbnN0IHN0YXR1c2VzID0gYXdhaXQgZ2V0QXZhaWxhYmxlVGFyZ2V0U3RhdHVzZXMobWlncmF0b3IsIGJvZHkudGFyZ2V0cyk7XG4gIGNvbnN0IHNsYWNrID0gbmV3IFNsYWNrQ29uZmlybSgpO1xuICBjb25zdCByZXF1aXJlc0FwcHJvdmFsID0gYm9keS50YXJnZXRzLnNvbWUoKHRhcmdldCkgPT4gdGFyZ2V0UmVxdWlyZXNBcHByb3ZhbChzbGFjaywgdGFyZ2V0KSk7XG4gIGlmICghcmVxdWlyZXNBcHByb3ZhbCB8fCAhc2xhY2suaXNDb25maWd1cmVkKCkpIHtcbiAgICByZXR1cm4gbWlncmF0b3IuYXBwbHkoYm9keS50YXJnZXRzKTtcbiAgfVxuXG4gIGNvbnN0IHBlbmRpbmcgPSBnZXRQZW5kaW5nTWlncmF0aW9ucyhzdGF0dXNlcyk7XG4gIGlmIChwZW5kaW5nLmxlbmd0aCA9PT0gMCkge1xuICAgIHJldHVybiBtaWdyYXRvci5hcHBseShib2R5LnRhcmdldHMpO1xuICB9XG5cbiAgY29uc3QgZXhpc3RpbmcgPSBhd2FpdCBzbGFjay5nZXRFeGlzdGluZ1JlcXVlc3QocGVuZGluZyk7XG4gIGlmIChleGlzdGluZyA9PT0gbnVsbCkge1xuICAgIGNvbnN0IGNyZWF0ZWQgPSBhd2FpdCBzbGFjay5wb3N0QXBwcm92YWxSZXF1ZXN0KHBlbmRpbmcsIGJvZHkudGFyZ2V0cywgYm9keS5yZXF1ZXN0b3IpO1xuICAgIGF3YWl0IHNsYWNrLnNhdmVSZXF1ZXN0KHBlbmRpbmcsIGNyZWF0ZWQuY2hhbm5lbCwgY3JlYXRlZC50cyk7XG4gICAgcmV0dXJuIHsgdHlwZTogXCJwZW5kaW5nXCIsIC4uLmNyZWF0ZWQgfTtcbiAgfVxuXG4gIGNvbnN0IGFwcHJvdmFsID0gYXdhaXQgc2xhY2suY2hlY2tBcHByb3ZhbChleGlzdGluZy5jaGFubmVsLCBleGlzdGluZy50cyk7XG4gIGlmIChhcHByb3ZhbC5yZWplY3RlZCkge1xuICAgIHRocm93IG5ldyBCYWRSZXF1ZXN0RXhjZXB0aW9uKFNEKFwic29uYW11LmVycm9yLm1pZ3JhdGlvblJlamVjdGVkXCIpKTtcbiAgfVxuICBpZiAoIWFwcHJvdmFsLmFwcHJvdmVkICYmICFib2R5LmZvcmNlKSB7XG4gICAgcmV0dXJuIHsgdHlwZTogXCJwZW5kaW5nXCIsIC4uLmV4aXN0aW5nIH07XG4gIH1cbiAgaWYgKCFhcHByb3ZhbC5hcHByb3ZlZCkge1xuICAgIGF3YWl0IHNsYWNrLmZvcmNlQXBwcm92YWwoXG4gICAgICBleGlzdGluZy5jaGFubmVsLFxuICAgICAgZXhpc3RpbmcudHMsXG4gICAgICBib2R5LmZvcmNlUmVhc29uID8/IFwi7IKs7JygIOyXhuydjFwiLFxuICAgICAgYm9keS5yZXF1ZXN0b3IsXG4gICAgKTtcbiAgfVxuXG4gIGNvbnN0IHJlc3VsdCA9IGF3YWl0IG1pZ3JhdG9yLmFwcGx5KGJvZHkudGFyZ2V0cyk7XG4gIGlmIChyZXN1bHQubGVuZ3RoID4gMCkge1xuICAgIGF3YWl0IHNsYWNrLmxvZ0V4ZWN1dGlvbihleGlzdGluZy5jaGFubmVsLCBleGlzdGluZy50cywgcmVzdWx0LCBib2R5LnJlcXVlc3Rvcik7XG4gIH1cbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuZnVuY3Rpb24gc2VuZE1pZ3JhdGlvblN0cmVhbShcbiAgcmVwbHk6IEZhc3RpZnlSZXBseSxcbiAgYWN0aW9uOiBNaWdyYXRpb25BY3Rpb24sXG4gIHRhcmdldHM6IE1pZ3JhdGlvblRhcmdldFtdLFxuICBydW46IChvblByb2dyZXNzOiAoZXZlbnQ6IE1pZ3JhdGlvblByb2dyZXNzRXZlbnQpID0+IHZvaWQpID0+IFByb21pc2U8TWlncmF0aW9uUmVzdWx0PixcbiAgYWZ0ZXJDb21wbGV0ZT86IChyZXN1bHQ6IE1pZ3JhdGlvblJlc3VsdCkgPT4gUHJvbWlzZTx2b2lkPixcbikge1xuICBjb25zdCBzdHJlYW0gPSBuZXcgUGFzc1Rocm91Z2goKTtcbiAgbGV0IGNhbldyaXRlID0gdHJ1ZTtcbiAgbGV0IGN1cnJlbnQ6IE1pZ3JhdGlvblByb2dyZXNzRXZlbnQgfCB1bmRlZmluZWQ7XG4gIGNvbnN0IGNvbXBsZXRlZFRhcmdldHM6IE1pZ3JhdGlvblRhcmdldFtdID0gW107XG4gIGNvbnN0IHdyaXRlID0gKGV2ZW50OiBNaWdyYXRpb25TdHJlYW1FdmVudCkgPT4ge1xuICAgIGlmIChjYW5Xcml0ZSAmJiAhc3RyZWFtLmRlc3Ryb3llZCkge1xuICAgICAgc3RyZWFtLndyaXRlKGAke0pTT04uc3RyaW5naWZ5KGV2ZW50KX1cXG5gKTtcbiAgICB9XG4gIH07XG5cbiAgc3RyZWFtLm9uKFwiY2xvc2VcIiwgKCkgPT4ge1xuICAgIGNhbldyaXRlID0gZmFsc2U7XG4gIH0pO1xuICByZXBseVxuICAgIC5oZWFkZXIoXCJjb250ZW50LXR5cGVcIiwgXCJhcHBsaWNhdGlvbi94LW5kanNvbjsgY2hhcnNldD11dGYtOFwiKVxuICAgIC5oZWFkZXIoXCJjYWNoZS1jb250cm9sXCIsIFwibm8tY2FjaGUsIG5vLXRyYW5zZm9ybVwiKVxuICAgIC5oZWFkZXIoXCJjb250ZW50LWVuY29kaW5nXCIsIFwiaWRlbnRpdHlcIilcbiAgICAuaGVhZGVyKFwieC1uby1jb21wcmVzc2lvblwiLCBcIjFcIik7XG5cbiAgdm9pZCAoYXN5bmMgKCkgPT4ge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBydW4oKGV2ZW50KSA9PiB7XG4gICAgICAgIGlmIChldmVudC50eXBlID09PSBcInRhcmdldC1jb21wbGV0ZVwiKSB7XG4gICAgICAgICAgaWYgKGV2ZW50LmNvbm5LZXkgIT09IFwic2hhZG93XCIpIGNvbXBsZXRlZFRhcmdldHMucHVzaChldmVudC5jb25uS2V5KTtcbiAgICAgICAgICB3cml0ZShldmVudCk7XG4gICAgICAgICAgLy8g64uk7J2MIHRhcmdldOydmCBsaWZlY3ljbGXsnbQg7Iuc7J6R65CY6riwIOyghCDsmKTrpZjrpbwg7KeB7KCEIHRhcmdldOyXkCDsnpjrqrsg6reA7IaN7ZWY7KeAIOyViuyKteuLiOuLpC5cbiAgICAgICAgICBjdXJyZW50ID0gdW5kZWZpbmVkO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBjdXJyZW50ID0gZXZlbnQ7XG4gICAgICAgIHdyaXRlKGV2ZW50KTtcbiAgICAgIH0pO1xuICAgICAgYXdhaXQgYWZ0ZXJDb21wbGV0ZT8uKHJlc3VsdCk7XG4gICAgICB3cml0ZSh7IHR5cGU6IFwiY29tcGxldGVcIiwgcmVzdWx0IH0pO1xuICAgIH0gY2F0Y2ggKGNhdWdodCkge1xuICAgICAgY29uc3QgbWVzc2FnZSA9IGNhdWdodCBpbnN0YW5jZW9mIEVycm9yID8gY2F1Z2h0Lm1lc3NhZ2UgOiBTdHJpbmcoY2F1Z2h0KTtcbiAgICAgIGNvbnN0IGZhaWxlZFRhcmdldCA9XG4gICAgICAgIGNhdWdodCBpbnN0YW5jZW9mIE1pZ3JhdGlvblRhcmdldEV4ZWN1dGlvbkVycm9yID8gY2F1Z2h0LmNvbm5LZXkgOiBjdXJyZW50Py5jb25uS2V5O1xuICAgICAgd3JpdGUoe1xuICAgICAgICB0eXBlOiBcImVycm9yXCIsXG4gICAgICAgIGFjdGlvbixcbiAgICAgICAgbWVzc2FnZSxcbiAgICAgICAgY29ubktleTogZmFpbGVkVGFyZ2V0LFxuICAgICAgICBmaWxlOlxuICAgICAgICAgIGN1cnJlbnQ/LnR5cGUgPT09IFwiZmlsZS1zdGFydFwiIHx8IGN1cnJlbnQ/LnR5cGUgPT09IFwiZmlsZS1leGVjdXRlZFwiXG4gICAgICAgICAgICA/IGN1cnJlbnQuZmlsZVxuICAgICAgICAgICAgOiB1bmRlZmluZWQsXG4gICAgICAgIGNvbXBsZXRlZFRhcmdldHMsXG4gICAgICAgIHBlbmRpbmdUYXJnZXRzOiB0YXJnZXRzLmZpbHRlcigodGFyZ2V0KSA9PiAhY29tcGxldGVkVGFyZ2V0cy5pbmNsdWRlcyh0YXJnZXQpKSxcbiAgICAgIH0pO1xuICAgIH0gZmluYWxseSB7XG4gICAgICBpZiAoIXN0cmVhbS5kZXN0cm95ZWQpIHtcbiAgICAgICAgc3RyZWFtLmVuZCgpO1xuICAgICAgfVxuICAgIH1cbiAgfSkoKTtcblxuICByZXR1cm4gcmVwbHkuc2VuZChzdHJlYW0pO1xufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcmVnaXN0ZXJNaWdyYXRpb25zQXBpKHNlcnZlcjogRmFzdGlmeUluc3RhbmNlKSB7XG4gIGNvbnN0IG1pZ3JhdG9yID0gbmV3IE1pZ3JhdG9yKCk7XG5cbiAgc2VydmVyLmdldChcIi9hcGkvbWlncmF0aW9ucy9jb25uZWN0aW9uc1wiLCBhc3luYyAoKSA9PiAoe1xuICAgIGNvbm5lY3Rpb25zOiBtaWdyYXRvci5nZXRDb25uZWN0aW9ucygpLFxuICB9KSk7XG4gIHNlcnZlci5nZXQoXCIvYXBpL21pZ3JhdGlvbnMvY29kZXNcIiwgYXN5bmMgKCkgPT4gKHsgY29kZXM6IGF3YWl0IG1pZ3JhdG9yLmdldE1pZ3JhdGlvbkNvZGVzKCkgfSkpO1xuICBzZXJ2ZXIuZ2V0PHsgUXVlcnlzdHJpbmc6IHsgY29kZU5hbWU6IHN0cmluZyB9IH0+KFwiL2FwaS9taWdyYXRpb25zL2NvZGVcIiwgKHJlcXVlc3QpID0+XG4gICAgZm9yd2FyZEFzeW5jRXJyb3JzKGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IG1pZ3JhdGlvbkNvZGUgPSAoYXdhaXQgbWlncmF0b3IuZ2V0TWlncmF0aW9uQ29kZXMoKSkuZmluZChcbiAgICAgICAgKHsgbmFtZSB9KSA9PiBuYW1lID09PSByZXF1ZXN0LnF1ZXJ5LmNvZGVOYW1lLFxuICAgICAgKTtcbiAgICAgIGlmIChtaWdyYXRpb25Db2RlID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgdGhyb3cgbmV3IEJhZFJlcXVlc3RFeGNlcHRpb24oU0QoXCJlcnJvci5iYWRSZXF1ZXN0XCIpKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB7IGNvZGU6IGF3YWl0IHJlYWRGaWxlKG1pZ3JhdGlvbkNvZGUucGF0aCwgXCJ1dGY4XCIpIH07XG4gICAgfSksXG4gICk7XG4gIHNlcnZlci5nZXQ8eyBRdWVyeXN0cmluZzogeyBjb25uS2V5PzogTWlncmF0aW9uVGFyZ2V0IH0gfT4oXCIvYXBpL21pZ3JhdGlvbnMvc3RhdHVzXCIsIChyZXF1ZXN0KSA9PlxuICAgIGZvcndhcmRBc3luY0Vycm9ycyhhc3luYyAoKSA9PiB7XG4gICAgICBpZiAocmVxdWVzdC5xdWVyeS5jb25uS2V5ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgcmV0dXJuIHsgc3RhdHVzOiBhd2FpdCBtaWdyYXRvci5nZXRTdGF0dXMoKSB9O1xuICAgICAgfVxuICAgICAgcmV0dXJuIHsgc3RhdHVzOiBhd2FpdCBtaWdyYXRvci5nZXRDb25uZWN0aW9uU3RhdHVzKHJlcXVlc3QucXVlcnkuY29ubktleSkgfTtcbiAgICB9KSxcbiAgKTtcbiAgc2VydmVyLmdldDx7IFF1ZXJ5c3RyaW5nOiB7IGNvbXBhcmVDb25uS2V5OiBNaWdyYXRpb25UYXJnZXQgfSB9PihcbiAgICBcIi9hcGkvbWlncmF0aW9ucy9wcmVwYXJlZC1jb2Rlc1wiLFxuICAgIChyZXF1ZXN0KSA9PlxuICAgICAgZm9yd2FyZEFzeW5jRXJyb3JzKGFzeW5jICgpID0+ICh7XG4gICAgICAgIHByZXBhcmVkQ29kZXM6IGF3YWl0IG1pZ3JhdG9yLmdldFByZXBhcmVkQ29kZXMocmVxdWVzdC5xdWVyeS5jb21wYXJlQ29ubktleSksXG4gICAgICB9KSksXG4gICk7XG5cbiAgc2VydmVyLnBvc3Q8eyBCb2R5OiBBcHBseUJvZHkgfT4oXCIvYXBpL21pZ3JhdGlvbnMvcmVxdWVzdC1hcHByb3ZhbFwiLCAocmVxdWVzdCkgPT5cbiAgICBmb3J3YXJkQXN5bmNFcnJvcnMoYXN5bmMgKCkgPT4ge1xuICAgICAgcmV0dXJuIHJlcXVlc3RBcHByb3ZhbChtaWdyYXRvciwgcmVxdWVzdC5ib2R5LnRhcmdldHMsIHJlcXVlc3QuYm9keS5yZXF1ZXN0b3IpO1xuICAgIH0pLFxuICApO1xuICBzZXJ2ZXIucG9zdDx7IEJvZHk6IHsgY2hhbm5lbDogc3RyaW5nOyB0czogc3RyaW5nIH0gfT4oXG4gICAgXCIvYXBpL21pZ3JhdGlvbnMvY2hlY2tBcHByb3ZhbFwiLFxuICAgIChyZXF1ZXN0KSA9PlxuICAgICAgZm9yd2FyZEFzeW5jRXJyb3JzKGFzeW5jICgpID0+IHtcbiAgICAgICAgY29uc3Qgc2xhY2sgPSBuZXcgU2xhY2tDb25maXJtKCk7XG4gICAgICAgIHJldHVybiBzbGFjay5pc0NvbmZpZ3VyZWQoKVxuICAgICAgICAgID8gc2xhY2suY2hlY2tBcHByb3ZhbChyZXF1ZXN0LmJvZHkuY2hhbm5lbCwgcmVxdWVzdC5ib2R5LnRzKVxuICAgICAgICAgIDogeyBhcHByb3ZlZDogdHJ1ZSwgcmVqZWN0ZWQ6IGZhbHNlIH07XG4gICAgICB9KSxcbiAgKTtcbiAgc2VydmVyLnBvc3Q8e1xuICAgIEJvZHk6IHsgY2hhbm5lbDogc3RyaW5nOyB0czogc3RyaW5nOyByZWFzb246IHN0cmluZzsgcmVxdWVzdG9yPzogc3RyaW5nIH07XG4gIH0+KFwiL2FwaS9taWdyYXRpb25zL2ZvcmNlQXBwcm92YWxcIiwgKHJlcXVlc3QpID0+XG4gICAgZm9yd2FyZEFzeW5jRXJyb3JzKGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IHNsYWNrID0gbmV3IFNsYWNrQ29uZmlybSgpO1xuICAgICAgaWYgKCFzbGFjay5pc0NvbmZpZ3VyZWQoKSkge1xuICAgICAgICB0aHJvdyBuZXcgQmFkUmVxdWVzdEV4Y2VwdGlvbihTRChcInNvbmFtdS5lcnJvci5zbGFja0NvbmZpcm1Ob3RDb25maWd1cmVkXCIpKTtcbiAgICAgIH1cbiAgICAgIGF3YWl0IHNsYWNrLmZvcmNlQXBwcm92YWwoXG4gICAgICAgIHJlcXVlc3QuYm9keS5jaGFubmVsLFxuICAgICAgICByZXF1ZXN0LmJvZHkudHMsXG4gICAgICAgIHJlcXVlc3QuYm9keS5yZWFzb24sXG4gICAgICAgIHJlcXVlc3QuYm9keS5yZXF1ZXN0b3IsXG4gICAgICApO1xuICAgICAgcmV0dXJuIHsgc3VjY2VzczogdHJ1ZSB9O1xuICAgIH0pLFxuICApO1xuXG4gIHNlcnZlci5wb3N0KFwiL2FwaS9taWdyYXRpb25zL3NoYWRvd1wiLCBhc3luYyAoX3JlcXVlc3QsIHJlcGx5KSA9PiB7XG4gICAgcmV0dXJuIHNlbmRNaWdyYXRpb25TdHJlYW0ocmVwbHksIFwic2hhZG93XCIsIFtdLCAob25Qcm9ncmVzcykgPT4ge1xuICAgICAgcmV0dXJuIG1pZ3JhdG9yLnJ1blNoYWRvd1Rlc3QoeyBvblByb2dyZXNzIH0pO1xuICAgIH0pO1xuICB9KTtcbiAgc2VydmVyLnBvc3Q8eyBCb2R5OiBBcHBseUJvZHkgfT4oXCIvYXBpL21pZ3JhdGlvbnMvYXBwbHlcIiwgYXN5bmMgKHJlcXVlc3QsIHJlcGx5KSA9PiB7XG4gICAgYXNzZXJ0VGFyZ2V0cyhtaWdyYXRvciwgcmVxdWVzdC5ib2R5LnRhcmdldHMpO1xuICAgIGNvbnN0IHN0YXR1c2VzID0gYXdhaXQgZ2V0QXZhaWxhYmxlVGFyZ2V0U3RhdHVzZXMobWlncmF0b3IsIHJlcXVlc3QuYm9keS50YXJnZXRzKTtcbiAgICBjb25zdCBhcHByb3ZhbCA9IGF3YWl0IHJlcXVpcmVBcHByb3ZlZEFwcGx5KHJlcXVlc3QuYm9keSwgc3RhdHVzZXMpO1xuICAgIHJldHVybiBzZW5kTWlncmF0aW9uU3RyZWFtKFxuICAgICAgcmVwbHksXG4gICAgICBcImFwcGx5XCIsXG4gICAgICByZXF1ZXN0LmJvZHkudGFyZ2V0cyxcbiAgICAgIChvblByb2dyZXNzKSA9PiBtaWdyYXRvci5hcHBseShyZXF1ZXN0LmJvZHkudGFyZ2V0cywgeyBvblByb2dyZXNzIH0pLFxuICAgICAgYXBwcm92YWwgPT09IG51bGxcbiAgICAgICAgPyB1bmRlZmluZWRcbiAgICAgICAgOiBhc3luYyAocmVzdWx0KSA9PiB7XG4gICAgICAgICAgICBhd2FpdCBuZXcgU2xhY2tDb25maXJtKCkubG9nRXhlY3V0aW9uKFxuICAgICAgICAgICAgICBhcHByb3ZhbC5jaGFubmVsLFxuICAgICAgICAgICAgICBhcHByb3ZhbC50cyxcbiAgICAgICAgICAgICAgcmVzdWx0LFxuICAgICAgICAgICAgICByZXF1ZXN0LmJvZHkucmVxdWVzdG9yLFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9LFxuICAgICk7XG4gIH0pO1xuICBzZXJ2ZXIucG9zdDx7IEJvZHk6IHsgdGFyZ2V0czogTWlncmF0aW9uVGFyZ2V0W10gfSB9PihcbiAgICBcIi9hcGkvbWlncmF0aW9ucy9yb2xsYmFja1wiLFxuICAgIGFzeW5jIChyZXF1ZXN0LCByZXBseSkgPT4ge1xuICAgICAgYXNzZXJ0VGFyZ2V0cyhtaWdyYXRvciwgcmVxdWVzdC5ib2R5LnRhcmdldHMpO1xuICAgICAgYXdhaXQgZ2V0QXZhaWxhYmxlVGFyZ2V0U3RhdHVzZXMobWlncmF0b3IsIHJlcXVlc3QuYm9keS50YXJnZXRzKTtcbiAgICAgIHJldHVybiBzZW5kTWlncmF0aW9uU3RyZWFtKHJlcGx5LCBcInJvbGxiYWNrXCIsIHJlcXVlc3QuYm9keS50YXJnZXRzLCAob25Qcm9ncmVzcykgPT4ge1xuICAgICAgICByZXR1cm4gbWlncmF0b3Iucm9sbGJhY2socmVxdWVzdC5ib2R5LnRhcmdldHMsIHsgb25Qcm9ncmVzcyB9KTtcbiAgICAgIH0pO1xuICAgIH0sXG4gICk7XG5cbiAgc2VydmVyLnBvc3Q8eyBCb2R5OiB7IGNvbXBhcmVDb25uS2V5PzogTWlncmF0aW9uVGFyZ2V0IH0gfT4oXG4gICAgXCIvYXBpL21pZ3JhdGlvbnMvZ2VuZXJhdGVQcmVwYXJlZENvZGVzXCIsXG4gICAgKHJlcXVlc3QpID0+XG4gICAgICBmb3J3YXJkQXN5bmNFcnJvcnMoYXN5bmMgKCkgPT4gbWlncmF0b3IuZ2VuZXJhdGVQcmVwYXJlZENvZGVzKHJlcXVlc3QuYm9keS5jb21wYXJlQ29ubktleSkpLFxuICApO1xuXG4gIC8vIOydtOyghCBVSSDrsojrk6Tqs7wg7Jm467aAIOyKpO2BrOumve2KuOqwgCDsg4gg7ISc67KE7JeQ7ISc64+EIO2VnCDrprTrpqzsiqQg64+Z7JWIIOuPmeyeke2VmOuPhOuhnSDsnKDsp4Dtlanri4jri6QuXG4gIHNlcnZlci5wb3N0PHtcbiAgICBCb2R5OiB7XG4gICAgICBhY3Rpb246IFwiYXBwbHlcIiB8IFwicm9sbGJhY2tcIiB8IFwic2hhZG93XCI7XG4gICAgICB0YXJnZXRzOiAoa2V5b2YgU29uYW11REJDb25maWcpW107XG4gICAgICBmb3JjZT86IGJvb2xlYW47XG4gICAgICBmb3JjZVJlYXNvbj86IHN0cmluZztcbiAgICAgIHJlcXVlc3Rvcj86IHN0cmluZztcbiAgICB9O1xuICB9PihcIi9hcGkvbWlncmF0aW9ucy9ydW5BY3Rpb25cIiwgKHJlcXVlc3QpID0+XG4gICAgZm9yd2FyZEFzeW5jRXJyb3JzKGFzeW5jICgpID0+IHtcbiAgICAgIGlmIChyZXF1ZXN0LmJvZHkuYWN0aW9uID09PSBcInNoYWRvd1wiKSB7XG4gICAgICAgIHJldHVybiBtaWdyYXRvci5ydW5TaGFkb3dUZXN0KCk7XG4gICAgICB9XG4gICAgICBpZiAocmVxdWVzdC5ib2R5LmFjdGlvbiA9PT0gXCJhcHBseVwiKSB7XG4gICAgICAgIHJldHVybiBydW5MZWdhY3lBcHBseShtaWdyYXRvciwgcmVxdWVzdC5ib2R5KTtcbiAgICAgIH1cbiAgICAgIGFzc2VydFRhcmdldHMobWlncmF0b3IsIHJlcXVlc3QuYm9keS50YXJnZXRzKTtcbiAgICAgIGF3YWl0IGdldEF2YWlsYWJsZVRhcmdldFN0YXR1c2VzKG1pZ3JhdG9yLCByZXF1ZXN0LmJvZHkudGFyZ2V0cyk7XG4gICAgICByZXR1cm4gbWlncmF0b3Iucm9sbGJhY2socmVxdWVzdC5ib2R5LnRhcmdldHMpO1xuICAgIH0pLFxuICApO1xufVxuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7O0FBK0JBLFNBQVMsY0FBYyxVQUFvQixTQUFrQztDQUMzRSxNQUFNLFVBQVUsSUFBSSxJQUFJLFNBQVMsZUFBZSxDQUFDLENBQUMsS0FBSyxFQUFFLGNBQWMsT0FBTyxDQUFDO0NBQy9FLE1BQU0sVUFBVSxRQUFRLFFBQVEsV0FBVyxDQUFDLFFBQVEsSUFBSSxNQUFNLENBQUM7Q0FDL0QsSUFBSSxRQUFRLFdBQVcsS0FBSyxRQUFRLFNBQVMsR0FDM0MsTUFBTSxJQUFJLG9CQUFvQixHQUFHLGtCQUFrQixHQUFHLEVBQ3BELFNBQVMsOEJBQThCLFFB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