sonamu 0.6.0 → 0.7.0

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 (406) hide show
  1. package/.swcrc.project-default +18 -0
  2. package/bin/cli.js +24 -0
  3. package/dist/ai/agents/agent.d.ts +11 -0
  4. package/dist/ai/agents/agent.d.ts.map +1 -0
  5. package/dist/ai/agents/agent.js +65 -0
  6. package/dist/ai/agents/index.d.ts +3 -0
  7. package/dist/ai/agents/index.d.ts.map +1 -0
  8. package/dist/ai/agents/index.js +4 -0
  9. package/dist/ai/agents/types.d.ts +43 -0
  10. package/dist/ai/agents/types.d.ts.map +1 -0
  11. package/dist/ai/agents/types.js +3 -0
  12. package/dist/ai/index.d.ts +2 -0
  13. package/dist/ai/index.d.ts.map +1 -0
  14. package/dist/ai/index.js +3 -0
  15. package/dist/ai/providers/rtzr/api.d.ts +22 -0
  16. package/dist/ai/providers/rtzr/api.d.ts.map +1 -0
  17. package/dist/ai/providers/rtzr/api.js +28 -0
  18. package/dist/ai/providers/rtzr/error.d.ts +18 -0
  19. package/dist/ai/providers/rtzr/error.d.ts.map +1 -0
  20. package/dist/ai/providers/rtzr/error.js +29 -0
  21. package/dist/ai/providers/rtzr/index.d.ts +5 -0
  22. package/dist/ai/providers/rtzr/index.d.ts.map +1 -0
  23. package/dist/ai/providers/rtzr/index.js +6 -0
  24. package/dist/ai/providers/rtzr/model.d.ts +52 -0
  25. package/dist/ai/providers/rtzr/model.d.ts.map +1 -0
  26. package/dist/ai/providers/rtzr/model.js +137 -0
  27. package/dist/ai/providers/rtzr/options.d.ts +7 -0
  28. package/dist/ai/providers/rtzr/options.d.ts.map +1 -0
  29. package/dist/ai/providers/rtzr/options.js +47 -0
  30. package/dist/ai/providers/rtzr/provider.d.ts +18 -0
  31. package/dist/ai/providers/rtzr/provider.d.ts.map +1 -0
  32. package/dist/ai/providers/rtzr/provider.js +54 -0
  33. package/dist/ai/providers/rtzr/utils.d.ts +19 -0
  34. package/dist/ai/providers/rtzr/utils.d.ts.map +1 -0
  35. package/dist/ai/providers/rtzr/utils.js +88 -0
  36. package/dist/api/base-frame.d.ts +2 -2
  37. package/dist/api/base-frame.d.ts.map +1 -1
  38. package/dist/api/base-frame.js +2 -1
  39. package/dist/api/caster.d.ts.map +1 -1
  40. package/dist/api/caster.js +6 -1
  41. package/dist/api/code-converters.d.ts +58 -14
  42. package/dist/api/code-converters.d.ts.map +1 -1
  43. package/dist/api/code-converters.js +178 -409
  44. package/dist/api/config.d.ts +27 -13
  45. package/dist/api/config.d.ts.map +1 -1
  46. package/dist/api/config.js +19 -26
  47. package/dist/api/context.d.ts +4 -3
  48. package/dist/api/context.d.ts.map +1 -1
  49. package/dist/api/context.js +1 -1
  50. package/dist/api/decorators.d.ts +20 -6
  51. package/dist/api/decorators.d.ts.map +1 -1
  52. package/dist/api/decorators.js +111 -18
  53. package/dist/api/index.d.ts +2 -2
  54. package/dist/api/index.d.ts.map +1 -1
  55. package/dist/api/index.js +3 -3
  56. package/dist/api/sonamu.d.ts +7 -7
  57. package/dist/api/sonamu.d.ts.map +1 -1
  58. package/dist/api/sonamu.js +83 -51
  59. package/dist/api/validator.d.ts +6 -0
  60. package/dist/api/validator.d.ts.map +1 -0
  61. package/dist/api/validator.js +81 -0
  62. package/dist/bin/build-config.d.ts +5 -1
  63. package/dist/bin/build-config.d.ts.map +1 -1
  64. package/dist/bin/build-config.js +5 -2
  65. package/dist/bin/cli.js +165 -64
  66. package/dist/bin/loader-register.d.ts +2 -0
  67. package/dist/bin/loader-register.d.ts.map +1 -0
  68. package/dist/bin/loader-register.js +34 -0
  69. package/dist/database/_batch_update.d.ts +5 -3
  70. package/dist/database/_batch_update.d.ts.map +1 -1
  71. package/dist/database/_batch_update.js +30 -13
  72. package/dist/database/base-model.d.ts +96 -10
  73. package/dist/database/base-model.d.ts.map +1 -1
  74. package/dist/database/base-model.js +232 -89
  75. package/dist/database/base-model.types.d.ts +93 -0
  76. package/dist/database/base-model.types.d.ts.map +1 -0
  77. package/dist/database/base-model.types.js +10 -0
  78. package/dist/database/code-generator.d.ts +1 -1
  79. package/dist/database/code-generator.d.ts.map +1 -1
  80. package/dist/database/code-generator.js +11 -10
  81. package/dist/database/db.d.ts +5 -6
  82. package/dist/database/db.d.ts.map +1 -1
  83. package/dist/database/db.js +22 -25
  84. package/dist/database/puri-subset.test-d.js +81 -0
  85. package/dist/database/puri-subset.types.d.ts +123 -0
  86. package/dist/database/puri-subset.types.d.ts.map +1 -0
  87. package/dist/database/puri-subset.types.js +16 -0
  88. package/dist/database/puri-wrapper.d.ts +13 -11
  89. package/dist/database/puri-wrapper.d.ts.map +1 -1
  90. package/dist/database/puri-wrapper.js +2 -2
  91. package/dist/database/puri.d.ts +25 -14
  92. package/dist/database/puri.d.ts.map +1 -1
  93. package/dist/database/puri.js +83 -21
  94. package/dist/database/puri.types.d.ts +21 -7
  95. package/dist/database/puri.types.d.ts.map +1 -1
  96. package/dist/database/puri.types.js +4 -1
  97. package/dist/database/transaction-context.d.ts +1 -1
  98. package/dist/database/transaction-context.d.ts.map +1 -1
  99. package/dist/database/transaction-context.js +1 -1
  100. package/dist/database/upsert-builder.d.ts +9 -3
  101. package/dist/database/upsert-builder.d.ts.map +1 -1
  102. package/dist/database/upsert-builder.js +228 -78
  103. package/dist/entity/entity-manager.d.ts +165 -2
  104. package/dist/entity/entity-manager.d.ts.map +1 -1
  105. package/dist/entity/entity-manager.js +26 -10
  106. package/dist/entity/entity.d.ts +5 -3
  107. package/dist/entity/entity.d.ts.map +1 -1
  108. package/dist/entity/entity.js +153 -54
  109. package/dist/exceptions/error-handler.d.ts +1 -1
  110. package/dist/exceptions/error-handler.d.ts.map +1 -1
  111. package/dist/exceptions/error-handler.js +1 -1
  112. package/dist/exceptions/so-exceptions.d.ts +1 -1
  113. package/dist/exceptions/so-exceptions.d.ts.map +1 -1
  114. package/dist/exceptions/so-exceptions.js +1 -1
  115. package/dist/file-storage/driver.d.ts +1 -1
  116. package/dist/file-storage/driver.d.ts.map +1 -1
  117. package/dist/file-storage/driver.js +1 -1
  118. package/dist/file-storage/file-storage.js +2 -2
  119. package/dist/index.d.ts +18 -11
  120. package/dist/index.d.ts.map +1 -1
  121. package/dist/index.js +19 -13
  122. package/dist/migration/code-generation.d.ts +1 -1
  123. package/dist/migration/code-generation.d.ts.map +1 -1
  124. package/dist/migration/code-generation.js +123 -67
  125. package/dist/migration/migration-set.d.ts +2 -10
  126. package/dist/migration/migration-set.d.ts.map +1 -1
  127. package/dist/migration/migration-set.js +67 -218
  128. package/dist/migration/migrator.d.ts +24 -73
  129. package/dist/migration/migrator.d.ts.map +1 -1
  130. package/dist/migration/migrator.js +121 -301
  131. package/dist/migration/postgresql-schema-reader.d.ts +51 -0
  132. package/dist/migration/postgresql-schema-reader.d.ts.map +1 -0
  133. package/dist/migration/postgresql-schema-reader.js +245 -0
  134. package/dist/migration/types.d.ts +6 -38
  135. package/dist/migration/types.d.ts.map +1 -1
  136. package/dist/migration/types.js +1 -1
  137. package/dist/naite/messaging-types.d.ts +43 -0
  138. package/dist/naite/messaging-types.d.ts.map +1 -0
  139. package/dist/naite/messaging-types.js +7 -0
  140. package/dist/naite/naite-reporter.d.ts +41 -0
  141. package/dist/naite/naite-reporter.d.ts.map +1 -0
  142. package/dist/naite/naite-reporter.js +102 -0
  143. package/dist/naite/naite.d.ts +91 -8
  144. package/dist/naite/naite.d.ts.map +1 -1
  145. package/dist/naite/naite.js +285 -41
  146. package/dist/stream/sse.d.ts +2 -2
  147. package/dist/stream/sse.d.ts.map +1 -1
  148. package/dist/stream/sse.js +1 -1
  149. package/dist/syncer/api-parser.d.ts +3 -13
  150. package/dist/syncer/api-parser.d.ts.map +1 -1
  151. package/dist/syncer/api-parser.js +67 -56
  152. package/dist/syncer/checksum.d.ts +2 -2
  153. package/dist/syncer/checksum.d.ts.map +1 -1
  154. package/dist/syncer/checksum.js +11 -11
  155. package/dist/syncer/code-generator.d.ts +3 -3
  156. package/dist/syncer/code-generator.d.ts.map +1 -1
  157. package/dist/syncer/code-generator.js +37 -17
  158. package/dist/syncer/entity-operations.d.ts +2 -2
  159. package/dist/syncer/entity-operations.d.ts.map +1 -1
  160. package/dist/syncer/entity-operations.js +9 -8
  161. package/dist/syncer/file-patterns.d.ts +1 -1
  162. package/dist/syncer/file-patterns.d.ts.map +1 -1
  163. package/dist/syncer/file-patterns.js +1 -1
  164. package/dist/syncer/index.d.ts +4 -4
  165. package/dist/syncer/index.d.ts.map +1 -1
  166. package/dist/syncer/index.js +5 -5
  167. package/dist/syncer/module-loader.d.ts +4 -4
  168. package/dist/syncer/module-loader.d.ts.map +1 -1
  169. package/dist/syncer/module-loader.js +17 -12
  170. package/dist/syncer/syncer.d.ts +31 -24
  171. package/dist/syncer/syncer.d.ts.map +1 -1
  172. package/dist/syncer/syncer.js +92 -45
  173. package/dist/template/entity-converter.d.ts +1 -1
  174. package/dist/template/entity-converter.d.ts.map +1 -1
  175. package/dist/template/entity-converter.js +15 -8
  176. package/dist/template/helpers.d.ts +2 -2
  177. package/dist/template/helpers.d.ts.map +1 -1
  178. package/dist/template/helpers.js +3 -3
  179. package/dist/template/implementations/entity.template.d.ts +2 -2
  180. package/dist/template/implementations/entity.template.d.ts.map +1 -1
  181. package/dist/template/implementations/entity.template.js +4 -5
  182. package/dist/template/implementations/generated.template.d.ts +2 -3
  183. package/dist/template/implementations/generated.template.d.ts.map +1 -1
  184. package/dist/template/implementations/generated.template.js +46 -29
  185. package/dist/template/implementations/generated_http.template.d.ts +2 -3
  186. package/dist/template/implementations/generated_http.template.d.ts.map +1 -1
  187. package/dist/template/implementations/generated_http.template.js +9 -9
  188. package/dist/template/implementations/generated_sso.template.d.ts +3 -4
  189. package/dist/template/implementations/generated_sso.template.d.ts.map +1 -1
  190. package/dist/template/implementations/generated_sso.template.js +54 -25
  191. package/dist/template/implementations/init_types.template.d.ts +2 -2
  192. package/dist/template/implementations/init_types.template.d.ts.map +1 -1
  193. package/dist/template/implementations/init_types.template.js +2 -2
  194. package/dist/template/implementations/model.template.d.ts +2 -2
  195. package/dist/template/implementations/model.template.d.ts.map +1 -1
  196. package/dist/template/implementations/model.template.js +47 -37
  197. package/dist/template/implementations/model_test.template.d.ts +2 -2
  198. package/dist/template/implementations/model_test.template.d.ts.map +1 -1
  199. package/dist/template/implementations/model_test.template.js +2 -2
  200. package/dist/template/implementations/service.template.d.ts +4 -4
  201. package/dist/template/implementations/service.template.d.ts.map +1 -1
  202. package/dist/template/implementations/service.template.js +24 -16
  203. package/dist/template/implementations/view_enums_buttonset.template.d.ts +2 -2
  204. package/dist/template/implementations/view_enums_buttonset.template.d.ts.map +1 -1
  205. package/dist/template/implementations/view_enums_buttonset.template.js +1 -1
  206. package/dist/template/implementations/view_enums_dropdown.template.d.ts +2 -2
  207. package/dist/template/implementations/view_enums_dropdown.template.d.ts.map +1 -1
  208. package/dist/template/implementations/view_enums_dropdown.template.js +2 -2
  209. package/dist/template/implementations/view_enums_select.template.d.ts +2 -2
  210. package/dist/template/implementations/view_enums_select.template.d.ts.map +1 -1
  211. package/dist/template/implementations/view_enums_select.template.js +2 -2
  212. package/dist/template/implementations/view_form.template.d.ts +2 -2
  213. package/dist/template/implementations/view_form.template.d.ts.map +1 -1
  214. package/dist/template/implementations/view_form.template.js +4 -4
  215. package/dist/template/implementations/view_id_all_select.template.d.ts +2 -2
  216. package/dist/template/implementations/view_id_all_select.template.d.ts.map +1 -1
  217. package/dist/template/implementations/view_id_all_select.template.js +1 -1
  218. package/dist/template/implementations/view_id_async_select.template.d.ts +2 -2
  219. package/dist/template/implementations/view_id_async_select.template.d.ts.map +1 -1
  220. package/dist/template/implementations/view_id_async_select.template.js +1 -1
  221. package/dist/template/implementations/view_list.template.d.ts +2 -2
  222. package/dist/template/implementations/view_list.template.d.ts.map +1 -1
  223. package/dist/template/implementations/view_list.template.js +29 -19
  224. package/dist/template/implementations/view_list_columns.template.d.ts +3 -3
  225. package/dist/template/implementations/view_list_columns.template.d.ts.map +1 -1
  226. package/dist/template/implementations/view_list_columns.template.js +1 -1
  227. package/dist/template/implementations/view_search_input.template.d.ts +2 -2
  228. package/dist/template/implementations/view_search_input.template.d.ts.map +1 -1
  229. package/dist/template/implementations/view_search_input.template.js +1 -1
  230. package/dist/template/index.d.ts +4 -2
  231. package/dist/template/index.d.ts.map +1 -1
  232. package/dist/template/index.js +5 -3
  233. package/dist/template/template-manager.d.ts +56 -0
  234. package/dist/template/template-manager.d.ts.map +1 -0
  235. package/dist/template/template-manager.js +125 -0
  236. package/dist/template/template-types.d.ts +16 -0
  237. package/dist/template/template-types.d.ts.map +1 -0
  238. package/dist/template/template-types.js +7 -0
  239. package/dist/template/template.d.ts +12 -2
  240. package/dist/template/template.d.ts.map +1 -1
  241. package/dist/template/template.js +19 -6
  242. package/dist/template/zod-converter.d.ts +40 -7
  243. package/dist/template/zod-converter.d.ts.map +1 -1
  244. package/dist/template/zod-converter.js +341 -58
  245. package/dist/testing/_relation-graph.d.ts +1 -1
  246. package/dist/testing/_relation-graph.d.ts.map +1 -1
  247. package/dist/testing/_relation-graph.js +12 -3
  248. package/dist/testing/fixture-manager.d.ts +42 -11
  249. package/dist/testing/fixture-manager.d.ts.map +1 -1
  250. package/dist/testing/fixture-manager.js +338 -236
  251. package/dist/types/types.d.ts +709 -104
  252. package/dist/types/types.d.ts.map +1 -1
  253. package/dist/types/types.js +309 -52
  254. package/dist/typings/knex.d.js +2 -2
  255. package/dist/utils/async-utils.d.ts.map +1 -1
  256. package/dist/utils/async-utils.js +3 -3
  257. package/dist/utils/console-util.js +1 -1
  258. package/dist/utils/controller.d.ts +1 -0
  259. package/dist/utils/controller.d.ts.map +1 -1
  260. package/dist/utils/controller.js +4 -1
  261. package/dist/utils/esm-utils.d.ts +0 -6
  262. package/dist/utils/esm-utils.d.ts.map +1 -1
  263. package/dist/utils/esm-utils.js +2 -9
  264. package/dist/utils/formatter.d.ts +3 -0
  265. package/dist/utils/formatter.d.ts.map +1 -0
  266. package/dist/utils/formatter.js +110 -0
  267. package/dist/utils/fs-utils.d.ts +1 -1
  268. package/dist/utils/fs-utils.d.ts.map +1 -1
  269. package/dist/utils/fs-utils.js +1 -1
  270. package/dist/utils/lodash-able.d.ts.map +1 -1
  271. package/dist/utils/lodash-able.js +1 -1
  272. package/dist/utils/object-utils.d.ts +44 -0
  273. package/dist/utils/object-utils.d.ts.map +1 -0
  274. package/dist/utils/object-utils.js +191 -0
  275. package/dist/utils/path-utils.d.ts +1 -1
  276. package/dist/utils/path-utils.d.ts.map +1 -1
  277. package/dist/utils/path-utils.js +3 -3
  278. package/dist/utils/process-utils.js +1 -1
  279. package/dist/utils/sql-parser.d.ts +5 -1
  280. package/dist/utils/sql-parser.d.ts.map +1 -1
  281. package/dist/utils/sql-parser.js +14 -3
  282. package/dist/utils/type-utils.d.ts +23 -0
  283. package/dist/utils/type-utils.d.ts.map +1 -0
  284. package/dist/utils/type-utils.js +45 -0
  285. package/dist/utils/utils.d.ts +7 -1
  286. package/dist/utils/utils.d.ts.map +1 -1
  287. package/dist/utils/utils.js +44 -5
  288. package/dist/utils/zod-error.d.ts +1 -1
  289. package/dist/utils/zod-error.d.ts.map +1 -1
  290. package/dist/utils/zod-error.js +1 -1
  291. package/package.json +54 -29
  292. package/src/ai/agents/agent.ts +87 -0
  293. package/src/ai/agents/index.ts +2 -0
  294. package/src/ai/agents/types.ts +47 -0
  295. package/src/ai/index.ts +1 -0
  296. package/src/ai/providers/rtzr/api.ts +37 -0
  297. package/src/ai/providers/rtzr/error.ts +34 -0
  298. package/src/ai/providers/rtzr/index.ts +4 -0
  299. package/src/ai/providers/rtzr/model.ts +201 -0
  300. package/src/ai/providers/rtzr/options.ts +49 -0
  301. package/src/ai/providers/rtzr/provider.ts +91 -0
  302. package/src/ai/providers/rtzr/utils.ts +127 -0
  303. package/src/api/base-frame.ts +4 -2
  304. package/src/api/caster.ts +17 -23
  305. package/src/api/code-converters.ts +176 -533
  306. package/src/api/config.ts +39 -56
  307. package/src/api/context.ts +7 -18
  308. package/src/api/decorators.ts +175 -46
  309. package/src/api/index.ts +2 -2
  310. package/src/api/sonamu.ts +133 -124
  311. package/src/api/validator.ts +83 -0
  312. package/src/bin/build-config.ts +7 -1
  313. package/src/bin/cli.ts +192 -110
  314. package/src/bin/loader-register.ts +38 -0
  315. package/src/database/_batch_update.ts +46 -31
  316. package/src/database/base-model.ts +390 -182
  317. package/src/database/base-model.types.ts +155 -0
  318. package/src/database/code-generator.ts +13 -32
  319. package/src/database/db.ts +36 -50
  320. package/src/database/puri-subset.test-d.ts +471 -0
  321. package/src/database/puri-subset.types.ts +195 -0
  322. package/src/database/puri-wrapper.ts +58 -67
  323. package/src/database/puri.ts +182 -126
  324. package/src/database/puri.types.ts +64 -31
  325. package/src/database/transaction-context.ts +1 -1
  326. package/src/database/upsert-builder.ts +262 -132
  327. package/src/entity/entity-manager.ts +36 -28
  328. package/src/entity/entity.ts +330 -249
  329. package/src/exceptions/error-handler.ts +3 -3
  330. package/src/exceptions/so-exceptions.ts +11 -11
  331. package/src/file-storage/driver.ts +5 -5
  332. package/src/file-storage/file-storage.ts +2 -2
  333. package/src/index.ts +18 -12
  334. package/src/migration/code-generation.ts +185 -172
  335. package/src/migration/migration-set.ts +80 -293
  336. package/src/migration/migrator.ts +182 -425
  337. package/src/migration/mysql-schema-reader.ts.txt +272 -0
  338. package/src/migration/postgresql-schema-reader.ts +310 -0
  339. package/src/migration/types.ts +6 -39
  340. package/src/naite/messaging-types.ts +51 -0
  341. package/src/naite/naite-reporter.ts +128 -0
  342. package/src/naite/naite.ts +378 -33
  343. package/src/shared/web.shared.ts.txt +20 -24
  344. package/src/stream/sse.ts +5 -5
  345. package/src/syncer/api-parser.ts +52 -69
  346. package/src/syncer/checksum.ts +25 -37
  347. package/src/syncer/code-generator.ts +58 -62
  348. package/src/syncer/entity-operations.ts +12 -15
  349. package/src/syncer/file-patterns.ts +2 -2
  350. package/src/syncer/index.ts +4 -4
  351. package/src/syncer/module-loader.ts +28 -25
  352. package/src/syncer/syncer.ts +155 -162
  353. package/src/template/entity-converter.ts +18 -27
  354. package/src/template/helpers.ts +8 -11
  355. package/src/template/implementations/entity.template.ts +6 -6
  356. package/src/template/implementations/generated.template.ts +99 -99
  357. package/src/template/implementations/generated_http.template.ts +21 -54
  358. package/src/template/implementations/generated_sso.template.ts +78 -65
  359. package/src/template/implementations/init_types.template.ts +4 -6
  360. package/src/template/implementations/model.template.ts +47 -38
  361. package/src/template/implementations/model_test.template.ts +3 -3
  362. package/src/template/implementations/service.template.ts +56 -80
  363. package/src/template/implementations/view_enums_buttonset.template.ts +2 -2
  364. package/src/template/implementations/view_enums_dropdown.template.ts +4 -4
  365. package/src/template/implementations/view_enums_select.template.ts +3 -3
  366. package/src/template/implementations/view_form.template.ts +34 -75
  367. package/src/template/implementations/view_id_all_select.template.ts +2 -2
  368. package/src/template/implementations/view_id_async_select.template.ts +9 -23
  369. package/src/template/implementations/view_list.template.ts +54 -95
  370. package/src/template/implementations/view_list_columns.template.ts +4 -10
  371. package/src/template/implementations/view_search_input.template.ts +2 -2
  372. package/src/template/index.ts +4 -2
  373. package/src/template/template-manager.ts +166 -0
  374. package/src/template/template-types.ts +16 -0
  375. package/src/template/template.ts +29 -10
  376. package/src/template/zod-converter.ts +407 -101
  377. package/src/testing/_relation-graph.ts +18 -11
  378. package/src/testing/fixture-manager.ts +468 -362
  379. package/src/types/types.ts +516 -248
  380. package/src/typings/knex.d.ts +7 -9
  381. package/src/utils/async-utils.ts +8 -12
  382. package/src/utils/console-util.ts +1 -1
  383. package/src/utils/controller.ts +3 -0
  384. package/src/utils/esm-utils.ts +8 -18
  385. package/src/utils/formatter.ts +109 -0
  386. package/src/utils/fs-utils.ts +1 -1
  387. package/src/utils/lodash-able.ts +1 -4
  388. package/src/utils/object-utils.ts +217 -0
  389. package/src/utils/path-utils.ts +3 -6
  390. package/src/utils/process-utils.ts +1 -1
  391. package/src/utils/sql-parser.ts +23 -5
  392. package/src/utils/type-utils.ts +83 -0
  393. package/src/utils/utils.ts +58 -9
  394. package/src/utils/zod-error.ts +3 -3
  395. package/dist/bin/cli-wrapper.d.ts +0 -3
  396. package/dist/bin/cli-wrapper.d.ts.map +0 -1
  397. package/dist/bin/cli-wrapper.js +0 -72
  398. package/dist/database/knex-plugins/knex-on-duplicate-update.d.ts +0 -2
  399. package/dist/database/knex-plugins/knex-on-duplicate-update.d.ts.map +0 -1
  400. package/dist/database/knex-plugins/knex-on-duplicate-update.js +0 -39
  401. package/dist/entity/entity-utils.d.ts +0 -61
  402. package/dist/entity/entity-utils.d.ts.map +0 -1
  403. package/dist/entity/entity-utils.js +0 -210
  404. package/src/bin/cli-wrapper.ts +0 -82
  405. package/src/database/knex-plugins/knex-on-duplicate-update.ts +0 -45
  406. package/src/entity/entity-utils.ts +0 -291
@@ -1,17 +1,34 @@
1
- import z from "zod";
2
- import { EntityManager } from "../entity/entity-manager.js";
3
- import { isBelongsToOneRelationProp, isBigIntegerProp, isBooleanProp, isDateProp, isDateTimeProp, isDecimalProp, isDoubleProp, isEnumProp, isFloatProp, isIntegerProp, isJsonProp, isOneToOneRelationProp, isRelationProp, isStringProp, isTextProp, isTimeProp, isTimestampProp, isUuidProp, isVirtualProp } from "../types/types.js";
1
+ /**
2
+ * zod-converter 구성
3
+ * 1. 유틸리티
4
+ * - getZodTypeById
5
+ *
6
+ * 2. Zod 타입 변환 (EntityProp -> ZodType)
7
+ * - propToZodType
8
+ *
9
+ * 3. EntityProp/Node -> Zod 코드 문자열
10
+ * - propToZodTypeDef
11
+ * - propNodeToZodTypeDef
12
+ *
13
+ * 4. Zod 타입 인스턴스를 해당하는 Zod 코드 문자열로 변환 (ZodType -> ZodCode)
14
+ * - zodTypeToZodCode
15
+ *
16
+ * 5. Zod 타입을 UI 렌더링에 사용할 수 있는 RenderingNode로 변환 (ZodType -> RenderingNode)
17
+ * - zodTypeToRenderingNode
18
+ * - resolveRenderType
19
+ */ import inflection from "inflection";
4
20
  import path from "path";
5
- import { createImportUrl } from "../utils/esm-utils.js";
21
+ import { z } from "zod";
6
22
  import { Sonamu } from "../api/sonamu.js";
7
- import inflection from "inflection";
8
- import { getTextTypeLength } from "../api/index.js";
23
+ import { EntityManager } from "../entity/entity-manager.js";
24
+ import { isBelongsToOneRelationProp, isBigIntegerArrayProp, isBigIntegerSingleProp, isBooleanArrayProp, isBooleanSingleProp, isDateArrayProp, isDateSingleProp, isEnumArrayProp, isEnumSingleProp, isIntegerArrayProp, isIntegerSingleProp, isJsonProp, isNumberArrayProp, isNumberSingleProp, isNumericArrayProp, isNumericSingleProp, isOneToOneRelationProp, isRelationProp, isStringArrayProp, isStringSingleProp, isUuidArrayProp, isUuidSingleProp, isVirtualProp } from "../types/types.js";
25
+ import { createImportUrl } from "../utils/esm-utils.js";
9
26
  /**
10
27
  * Zod 타입 ID로부터 동적으로 Zod 스키마를 로드합니다.
11
28
  * dist 디렉토리에서 ESM으로 import하여 가져옵니다.
12
29
  */ export async function getZodTypeById(zodTypeId) {
13
30
  const modulePath = EntityManager.getModulePath(zodTypeId);
14
- const moduleAbsPath = path.join(Sonamu.apiRootPath, "dist", "application", modulePath + ".js");
31
+ const moduleAbsPath = path.join(Sonamu.apiRootPath, "dist", "application", `${modulePath}.js`);
15
32
  const importUrl = createImportUrl(moduleAbsPath);
16
33
  const imported = await import(importUrl);
17
34
  if (!imported[zodTypeId]) {
@@ -19,6 +36,322 @@ import { getTextTypeLength } from "../api/index.js";
19
36
  }
20
37
  return imported[zodTypeId].describe(zodTypeId);
21
38
  }
39
+ /**
40
+ * EntityProp을 Zod 타입으로 변환합니다.
41
+ * 각 prop의 타입에 따라 적절한 Zod validator를 생성합니다.
42
+ */ export async function propToZodType(prop) {
43
+ let zodType = z.unknown();
44
+ if (isIntegerSingleProp(prop)) {
45
+ zodType = z.number().int();
46
+ } else if (isIntegerArrayProp(prop)) {
47
+ zodType = z.number().int().array();
48
+ } else if (isBigIntegerSingleProp(prop)) {
49
+ zodType = z.bigint();
50
+ } else if (isBigIntegerArrayProp(prop)) {
51
+ zodType = z.bigint().array();
52
+ } else if (isEnumSingleProp(prop)) {
53
+ zodType = await getZodTypeById(prop.id);
54
+ } else if (isEnumArrayProp(prop)) {
55
+ zodType = (await getZodTypeById(prop.id)).array();
56
+ } else if (isStringSingleProp(prop)) {
57
+ if (prop.length) {
58
+ zodType = z.string().max(prop.length);
59
+ } else {
60
+ zodType = z.string();
61
+ }
62
+ } else if (isStringArrayProp(prop)) {
63
+ if (prop.length) {
64
+ zodType = z.string().max(prop.length).array();
65
+ } else {
66
+ zodType = z.string().array();
67
+ }
68
+ } else if (isNumberSingleProp(prop)) {
69
+ zodType = z.number();
70
+ } else if (isNumberArrayProp(prop)) {
71
+ zodType = z.number().array();
72
+ } else if (isNumericSingleProp(prop)) {
73
+ zodType = z.string();
74
+ } else if (isNumericArrayProp(prop)) {
75
+ zodType = z.string().array();
76
+ } else if (isBooleanSingleProp(prop)) {
77
+ zodType = z.boolean();
78
+ } else if (isBooleanArrayProp(prop)) {
79
+ zodType = z.boolean().array();
80
+ } else if (isDateSingleProp(prop)) {
81
+ zodType = z.date();
82
+ } else if (isDateArrayProp(prop)) {
83
+ zodType = z.date().array();
84
+ } else if (isUuidSingleProp(prop)) {
85
+ zodType = z.uuid();
86
+ } else if (isUuidArrayProp(prop)) {
87
+ zodType = z.uuid().array();
88
+ } else if (isJsonProp(prop)) {
89
+ zodType = await getZodTypeById(prop.id);
90
+ } else if (isVirtualProp(prop)) {
91
+ zodType = await getZodTypeById(prop.id);
92
+ } else if (isRelationProp(prop)) {
93
+ if (isBelongsToOneRelationProp(prop) || isOneToOneRelationProp(prop) && prop.hasJoinColumn) {
94
+ zodType = z.number().int();
95
+ }
96
+ } else {
97
+ throw new Error(`prop을 zodType으로 변환하는데 실패 ${prop}}`);
98
+ }
99
+ if (prop.unsigned) {
100
+ zodType = zodType.nonnegative();
101
+ }
102
+ if (prop.nullable) {
103
+ zodType = zodType.nullable();
104
+ }
105
+ return zodType;
106
+ }
107
+ /**
108
+ * EntityProp을 Zod 타입 정의 코드 문자열로 변환합니다.
109
+ */ export function propToZodTypeDef(prop, injectImportKeys) {
110
+ let stmt;
111
+ if (isIntegerSingleProp(prop)) {
112
+ stmt = `${prop.name}: z.int()`;
113
+ } else if (isIntegerArrayProp(prop)) {
114
+ stmt = `${prop.name}: z.int().array()`;
115
+ } else if (isBigIntegerSingleProp(prop)) {
116
+ stmt = `${prop.name}: z.bigint()`;
117
+ } else if (isBigIntegerArrayProp(prop)) {
118
+ stmt = `${prop.name}: z.bigint().array()`;
119
+ } else if (isEnumSingleProp(prop)) {
120
+ stmt = `${prop.name}: ${prop.id}`;
121
+ injectImportKeys.push(prop.id);
122
+ } else if (isEnumArrayProp(prop)) {
123
+ stmt = `${prop.name}: ${prop.id}.array()`;
124
+ injectImportKeys.push(prop.id);
125
+ } else if (isStringSingleProp(prop)) {
126
+ if (prop.length) {
127
+ stmt = `${prop.name}: z.string().max(${prop.length})`;
128
+ } else {
129
+ stmt = `${prop.name}: z.string()`;
130
+ }
131
+ } else if (isStringArrayProp(prop)) {
132
+ if (prop.length) {
133
+ stmt = `${prop.name}: z.string().max(${prop.length}).array()`;
134
+ } else {
135
+ stmt = `${prop.name}: z.string().array()`;
136
+ }
137
+ } else if (isNumberSingleProp(prop)) {
138
+ stmt = `${prop.name}: z.number()`;
139
+ } else if (isNumberArrayProp(prop)) {
140
+ stmt = `${prop.name}: z.number().array()`;
141
+ } else if (isNumericSingleProp(prop)) {
142
+ stmt = `${prop.name}: z.string()`;
143
+ } else if (isNumericArrayProp(prop)) {
144
+ stmt = `${prop.name}: z.string().array()`;
145
+ } else if (isDateSingleProp(prop)) {
146
+ stmt = `${prop.name}: z.date()`;
147
+ } else if (isDateArrayProp(prop)) {
148
+ stmt = `${prop.name}: z.date().array()`;
149
+ } else if (isBooleanSingleProp(prop)) {
150
+ stmt = `${prop.name}: z.boolean()`;
151
+ } else if (isBooleanArrayProp(prop)) {
152
+ stmt = `${prop.name}: z.boolean().array()`;
153
+ } else if (isUuidSingleProp(prop)) {
154
+ stmt = `${prop.name}: z.uuid()`;
155
+ } else if (isUuidArrayProp(prop)) {
156
+ stmt = `${prop.name}: z.uuid().array()`;
157
+ } else if (isJsonProp(prop)) {
158
+ stmt = `${prop.name}: ${prop.id}`;
159
+ injectImportKeys.push(prop.id);
160
+ } else if (isVirtualProp(prop)) {
161
+ stmt = `${prop.name}: ${prop.id}`;
162
+ injectImportKeys.push(prop.id);
163
+ } else if (isRelationProp(prop)) {
164
+ if (isBelongsToOneRelationProp(prop) || isOneToOneRelationProp(prop) && prop.hasJoinColumn) {
165
+ stmt = `${prop.name}_id: z.int()`;
166
+ } else {
167
+ // 그외 relation 케이스 제외
168
+ return `// ${prop.name}: ${prop.relationType} ${prop.with}`;
169
+ }
170
+ } else {
171
+ return "// unable to resolve";
172
+ }
173
+ if (prop.unsigned) {
174
+ stmt += ".nonnegative()";
175
+ }
176
+ if (prop.nullable) {
177
+ stmt += ".nullable()";
178
+ }
179
+ return `${stmt},`;
180
+ }
181
+ /**
182
+ * EntityPropNode를 Zod 타입 정의 코드 문자열로 변환합니다.
183
+ * plain, array, object 노드 타입을 재귀적으로 처리하여 중첩 구조를 지원합니다.
184
+ */ export function propNodeToZodTypeDef(propNode, injectImportKeys) {
185
+ if (propNode.nodeType === "plain") {
186
+ return propToZodTypeDef(propNode.prop, injectImportKeys);
187
+ } else if (propNode.nodeType === "array") {
188
+ return [
189
+ propNode.prop ? `${propNode.prop.name}: ` : "",
190
+ "z.array(z.object({",
191
+ propNode.children.map((childPropNode)=>propNodeToZodTypeDef(childPropNode, injectImportKeys)).join("\n"),
192
+ "",
193
+ "})),"
194
+ ].join("\n");
195
+ } else if (propNode.nodeType === "object") {
196
+ return [
197
+ propNode.prop ? `${propNode.prop.name}: ` : "",
198
+ "z.object({",
199
+ propNode.children.map((childPropNode)=>propNodeToZodTypeDef(childPropNode, injectImportKeys)).join("\n"),
200
+ "",
201
+ `})${propNode.prop?.nullable ? ".nullable()" : ""},`
202
+ ].join("\n");
203
+ } else {
204
+ throw Error;
205
+ }
206
+ }
207
+ // TODO(Haze, 251031): "template_literal", "file"에 대한 지원이 필요함.
208
+ export function zodTypeToTsTypeDef(zt) {
209
+ switch(zt.def.type){
210
+ case "string":
211
+ case "number":
212
+ case "boolean":
213
+ case "bigint":
214
+ case "date":
215
+ case "null":
216
+ case "undefined":
217
+ case "any":
218
+ case "unknown":
219
+ case "never":
220
+ return zt.def.type;
221
+ case "nullable":
222
+ return `${zodTypeToTsTypeDef(zt.def.innerType)} | null`;
223
+ case "default":
224
+ return zodTypeToTsTypeDef(zt.def.innerType);
225
+ case "record":
226
+ {
227
+ const recordType = zt;
228
+ return `{ [ key: ${zodTypeToTsTypeDef(recordType.def.keyType)} ]: ${zodTypeToTsTypeDef(recordType.def.valueType)}}`;
229
+ }
230
+ case "literal":
231
+ return Array.from(zt.values).map((value)=>{
232
+ if (typeof value === "string") {
233
+ return `"${value}"`;
234
+ }
235
+ if (value === null) {
236
+ return `null`;
237
+ }
238
+ if (value === undefined) {
239
+ return `undefined`;
240
+ }
241
+ return `${value}`;
242
+ }).join(" | ");
243
+ case "union":
244
+ return `${zt.options.map((option)=>zodTypeToTsTypeDef(option)).join(" | ")}`;
245
+ case "enum":
246
+ return `${zt.options.map((val)=>`"${val}"`).join(" | ")}`;
247
+ case "array":
248
+ return `${zodTypeToTsTypeDef(zt.element)}[]`;
249
+ case "object":
250
+ {
251
+ const shape = zt.shape;
252
+ return [
253
+ "{",
254
+ ...Object.keys(shape).map((key)=>{
255
+ if (shape[key].def.type === "optional") {
256
+ return `${key}?: ${zodTypeToTsTypeDef(shape[key].def.innerType)},`;
257
+ } else {
258
+ return `${key}: ${zodTypeToTsTypeDef(shape[key])},`;
259
+ }
260
+ }),
261
+ "}"
262
+ ].join("\n");
263
+ }
264
+ case "optional":
265
+ return `${zodTypeToTsTypeDef(zt.def.innerType)} | undefined`;
266
+ default:
267
+ throw new Error(`처리되지 않은 ZodType ${zt.def.type}`);
268
+ }
269
+ }
270
+ // TODO(Haze, 251031): "template_literal", "file"에 대한 지원이 필요함.
271
+ /**
272
+ * Zod 타입 인스턴스를 해당하는 Zod 코드 문자열로 변환합니다.
273
+ */ export function zodTypeToZodCode(zt) {
274
+ switch(zt.def.type){
275
+ case "string":
276
+ return "z.string()";
277
+ case "number":
278
+ return "z.number()";
279
+ case "bigint":
280
+ return "z.bigint()";
281
+ case "boolean":
282
+ return "z.boolean()";
283
+ case "date":
284
+ return "z.date()";
285
+ case "null":
286
+ return "z.null()";
287
+ case "undefined":
288
+ return "z.undefined()";
289
+ case "any":
290
+ return "z.any()";
291
+ case "unknown":
292
+ return "z.unknown()";
293
+ case "never":
294
+ return "z.never()";
295
+ case "nullable":
296
+ return `${zodTypeToZodCode(zt.def.innerType)}.nullable()`;
297
+ case "default":
298
+ {
299
+ const zDefaultDef = zt.def;
300
+ return `${zodTypeToZodCode(zDefaultDef.innerType)}.default(${zDefaultDef.defaultValue})`;
301
+ }
302
+ case "record":
303
+ {
304
+ const zRecordDef = zt.def;
305
+ return `z.record(${zodTypeToZodCode(zRecordDef.keyType)}, ${zodTypeToZodCode(zRecordDef.valueType)})`;
306
+ }
307
+ case "literal":
308
+ {
309
+ const items = Array.from(zt.values).map((value)=>{
310
+ if (typeof value === "string") {
311
+ return `"${value}"`;
312
+ }
313
+ if (value === null) {
314
+ return `null`;
315
+ }
316
+ if (value === undefined) {
317
+ return `undefined`;
318
+ }
319
+ return `${value}`;
320
+ });
321
+ if (items.length === 1) {
322
+ return `z.literal(${items[0]})`;
323
+ }
324
+ return `z.literal([${items.join(", ")}])`;
325
+ }
326
+ case "union":
327
+ return `z.union([${zt.def.options.map((option)=>zodTypeToZodCode(option)).join(",")}])`;
328
+ case "enum":
329
+ // NOTE: z.enum(["A", "B"])도 z.enum({ A: "A", B: "B" })로 처리됨.
330
+ return `z.enum({${Object.entries(zt.def.entries).map(([key, val])=>typeof val === "string" ? `${key}: "${val}"` : `${key}: ${val}`).join(", ")}})`;
331
+ case "array":
332
+ return `z.array(${zodTypeToZodCode(zt.def.element)})`;
333
+ case "object":
334
+ {
335
+ const shape = zt.shape;
336
+ return [
337
+ "z.object({",
338
+ ...Object.keys(shape).map((key)=>`${key}: ${zodTypeToZodCode(shape[key])},`),
339
+ "})"
340
+ ].join("\n");
341
+ }
342
+ case "optional":
343
+ return `${zodTypeToZodCode(zt.def.innerType)}.optional()`;
344
+ case "file":
345
+ return `z.file()`;
346
+ case "intersection":
347
+ {
348
+ const zIntersectionDef = zt.def;
349
+ return `z.intersection(${zodTypeToZodCode(zIntersectionDef.left)}, ${zodTypeToZodCode(zIntersectionDef.right)})`;
350
+ }
351
+ default:
352
+ throw new Error(`처리되지 않은 ZodType ${zt.def.type}`);
353
+ }
354
+ }
22
355
  /**
23
356
  * Zod 타입을 UI 렌더링에 사용할 수 있는 RenderingNode로 변환합니다.
24
357
  * 재귀적으로 중첩된 타입들을 처리합니다.
@@ -112,55 +445,5 @@ import { getTextTypeLength } from "../api/index.js";
112
445
  throw new Error(`타입 파싱 불가 ${key} ${zodType.def.type}`);
113
446
  }
114
447
  }
115
- /**
116
- * EntityProp을 Zod 타입으로 변환합니다.
117
- * 각 prop의 타입에 따라 적절한 Zod validator를 생성합니다.
118
- */ export async function propToZodType(prop) {
119
- let zodType = z.unknown();
120
- if (isIntegerProp(prop)) {
121
- zodType = z.number().int();
122
- } else if (isBigIntegerProp(prop)) {
123
- zodType = z.bigint();
124
- } else if (isTextProp(prop)) {
125
- zodType = z.string().max(getTextTypeLength(prop.textType));
126
- } else if (isEnumProp(prop)) {
127
- zodType = await getZodTypeById(prop.id);
128
- } else if (isStringProp(prop)) {
129
- zodType = z.string().max(prop.length);
130
- } else if (isFloatProp(prop) || isDoubleProp(prop)) {
131
- zodType = z.number();
132
- } else if (isDecimalProp(prop)) {
133
- zodType = z.string();
134
- } else if (isBooleanProp(prop)) {
135
- zodType = z.boolean();
136
- } else if (isDateProp(prop)) {
137
- zodType = z.string().length(10);
138
- } else if (isTimeProp(prop)) {
139
- zodType = z.string().length(8);
140
- } else if (isDateTimeProp(prop)) {
141
- zodType = z.date();
142
- } else if (isTimestampProp(prop)) {
143
- zodType = z.date();
144
- } else if (isJsonProp(prop)) {
145
- zodType = await getZodTypeById(prop.id);
146
- } else if (isUuidProp(prop)) {
147
- zodType = z.uuid();
148
- } else if (isVirtualProp(prop)) {
149
- zodType = await getZodTypeById(prop.id);
150
- } else if (isRelationProp(prop)) {
151
- if (isBelongsToOneRelationProp(prop) || isOneToOneRelationProp(prop) && prop.hasJoinColumn) {
152
- zodType = z.number().int();
153
- }
154
- } else {
155
- throw new Error(`prop을 zodType으로 변환하는데 실패 ${prop}}`);
156
- }
157
- if (prop.unsigned) {
158
- zodType = zodType.nonnegative();
159
- }
160
- if (prop.nullable) {
161
- zodType = zodType.nullable();
162
- }
163
- return zodType;
164
- }
165
448
 
166
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy90ZW1wbGF0ZS96b2QtY29udmVydGVyLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB6IGZyb20gXCJ6b2RcIjtcbmltcG9ydCB7IEVudGl0eU1hbmFnZXIgfSBmcm9tIFwiLi4vZW50aXR5L2VudGl0eS1tYW5hZ2VyXCI7XG5pbXBvcnQge1xuICBFbnRpdHlQcm9wLFxuICBpc0JlbG9uZ3NUb09uZVJlbGF0aW9uUHJvcCxcbiAgaXNCaWdJbnRlZ2VyUHJvcCxcbiAgaXNCb29sZWFuUHJvcCxcbiAgaXNEYXRlUHJvcCxcbiAgaXNEYXRlVGltZVByb3AsXG4gIGlzRGVjaW1hbFByb3AsXG4gIGlzRG91YmxlUHJvcCxcbiAgaXNFbnVtUHJvcCxcbiAgaXNGbG9hdFByb3AsXG4gIGlzSW50ZWdlclByb3AsXG4gIGlzSnNvblByb3AsXG4gIGlzT25lVG9PbmVSZWxhdGlvblByb3AsXG4gIGlzUmVsYXRpb25Qcm9wLFxuICBpc1N0cmluZ1Byb3AsXG4gIGlzVGV4dFByb3AsXG4gIGlzVGltZVByb3AsXG4gIGlzVGltZXN0YW1wUHJvcCxcbiAgaXNVdWlkUHJvcCxcbiAgaXNWaXJ0dWFsUHJvcCxcbiAgUmVuZGVyaW5nTm9kZSxcbn0gZnJvbSBcIi4uL3R5cGVzL3R5cGVzXCI7XG5pbXBvcnQgcGF0aCBmcm9tIFwicGF0aFwiO1xuaW1wb3J0IHsgY3JlYXRlSW1wb3J0VXJsIH0gZnJvbSBcIi4uL3V0aWxzL2VzbS11dGlsc1wiO1xuaW1wb3J0IHsgU29uYW11IH0gZnJvbSBcIi4uL2FwaS9zb25hbXVcIjtcbmltcG9ydCBpbmZsZWN0aW9uIGZyb20gXCJpbmZsZWN0aW9uXCI7XG5pbXBvcnQgeyBnZXRUZXh0VHlwZUxlbmd0aCB9IGZyb20gXCIuLi9hcGlcIjtcblxuLyoqXG4gKiBab2Qg7YOA7J6FIElE66Gc67aA7YSwIOuPmeyggeycvOuhnCBab2Qg7Iqk7YKk66eI66W8IOuhnOuTnO2VqeuLiOuLpC5cbiAqIGRpc3Qg65SU66CJ7Yag66as7JeQ7IScIEVTTeycvOuhnCBpbXBvcnTtlZjsl6wg6rCA7KC47Ji164uI64ukLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2V0Wm9kVHlwZUJ5SWQoem9kVHlwZUlkOiBzdHJpbmcpOiBQcm9taXNlPHouWm9kVHlwZUFueT4ge1xuICBjb25zdCBtb2R1bGVQYXRoID0gRW50aXR5TWFuYWdlci5nZXRNb2R1bGVQYXRoKHpvZFR5cGVJZCk7XG4gIGNvbnN0IG1vZHVsZUFic1BhdGggPSBwYXRoLmpvaW4oXG4gICAgU29uYW11LmFwaVJvb3RQYXRoLFxuICAgIFwiZGlzdFwiLFxuICAgIFwiYXBwbGljYXRpb25cIixcbiAgICBtb2R1bGVQYXRoICsgXCIuanNcIlxuICApO1xuICBjb25zdCBpbXBvcnRVcmwgPSBjcmVhdGVJbXBvcnRVcmwobW9kdWxlQWJzUGF0aCk7XG4gIGNvbnN0IGltcG9ydGVkID0gYXdhaXQgaW1wb3J0KGltcG9ydFVybCk7XG5cbiAgaWYgKCFpbXBvcnRlZFt6b2RUeXBlSWRdKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGDsobTsnqztlZjsp4Ag7JWK64qUIHpvZFR5cGVJZCAke3pvZFR5cGVJZH1gKTtcbiAgfVxuICByZXR1cm4gaW1wb3J0ZWRbem9kVHlwZUlkXS5kZXNjcmliZSh6b2RUeXBlSWQpO1xufVxuXG4vKipcbiAqIFpvZCDtg4DsnoXsnYQgVUkg66CM642U66eB7JeQIOyCrOyaqe2VoCDsiJgg7J6I64qUIFJlbmRlcmluZ05vZGXroZwg67OA7ZmY7ZWp64uI64ukLlxuICog7J6s6reA7KCB7Jy866GcIOykkeyyqeuQnCDtg4DsnoXrk6TsnYQg7LKY66as7ZWp64uI64ukLlxuICovXG5leHBvcnQgZnVuY3Rpb24gem9kVHlwZVRvUmVuZGVyaW5nTm9kZShcbiAgem9kVHlwZTogei5ab2RUeXBlPGFueT4sXG4gIGJhc2VLZXk6IHN0cmluZyA9IFwicm9vdFwiXG4pOiBSZW5kZXJpbmdOb2RlIHtcbiAgY29uc3QgZGVmID0ge1xuICAgIG5hbWU6IGJhc2VLZXksXG4gICAgbGFiZWw6IGluZmxlY3Rpb24uY2FtZWxpemUoYmFzZUtleSwgZmFsc2UpLFxuICAgIHpvZFR5cGUsXG4gIH07XG4gIGlmICh6b2RUeXBlIGluc3RhbmNlb2Ygei5ab2RPYmplY3QpIHtcbiAgICBjb25zdCBjb2x1bW5LZXlzID0gT2JqZWN0LmtleXMoem9kVHlwZS5zaGFwZSk7XG4gICAgY29uc3QgY2hpbGRyZW4gPSBjb2x1bW5LZXlzLm1hcCgoa2V5KSA9PiB7XG4gICAgICBjb25zdCBpbm5lclR5cGUgPSB6b2RUeXBlLnNoYXBlW2tleV07XG4gICAgICByZXR1cm4gem9kVHlwZVRvUmVuZGVyaW5nTm9kZShpbm5lclR5cGUsIGtleSk7XG4gICAgfSk7XG4gICAgcmV0dXJuIHtcbiAgICAgIC4uLmRlZixcbiAgICAgIHJlbmRlclR5cGU6IFwib2JqZWN0XCIsXG4gICAgICBjaGlsZHJlbixcbiAgICB9O1xuICB9IGVsc2UgaWYgKHpvZFR5cGUgaW5zdGFuY2VvZiB6LlpvZEFycmF5KSB7XG4gICAgY29uc3QgaW5uZXJUeXBlID0gKHpvZFR5cGUgYXMgei5ab2RBcnJheTx6LlpvZFR5cGU8YW55Pj4pLmRlZi5lbGVtZW50O1xuICAgIGlmIChpbm5lclR5cGUgaW5zdGFuY2VvZiB6LlpvZFN0cmluZyAmJiBiYXNlS2V5LmluY2x1ZGVzKFwiaW1hZ2VzXCIpKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICAuLi5kZWYsXG4gICAgICAgIHJlbmRlclR5cGU6IFwiYXJyYXktaW1hZ2VzXCIsXG4gICAgICB9O1xuICAgIH1cbiAgICByZXR1cm4ge1xuICAgICAgLi4uZGVmLFxuICAgICAgcmVuZGVyVHlwZTogXCJhcnJheVwiLFxuICAgICAgZWxlbWVudDogem9kVHlwZVRvUmVuZGVyaW5nTm9kZShpbm5lclR5cGUsIGJhc2VLZXkpLFxuICAgIH07XG4gIH0gZWxzZSBpZiAoem9kVHlwZSBpbnN0YW5jZW9mIHouWm9kVW5pb24pIHtcbiAgICBjb25zdCBvcHRpb25Ob2RlcyA9ICh6b2RUeXBlIGFzIHouWm9kVW5pb248ei5ab2RUeXBlW10+KS5kZWYub3B0aW9ucy5tYXAoXG4gICAgICAob3B0KSA9PiB6b2RUeXBlVG9SZW5kZXJpbmdOb2RlKG9wdCwgYmFzZUtleSlcbiAgICApO1xuICAgIC8vIFRPRE86IFpvZFVuaW9u7J20IOuTpOyWtOyeiOuKlCDqsr3smrAg7ZW465Ok66eBXG4gICAgcmV0dXJuIG9wdGlvbk5vZGVzWzBdO1xuICB9IGVsc2UgaWYgKHpvZFR5cGUgaW5zdGFuY2VvZiB6LlpvZE9wdGlvbmFsKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIC4uLnpvZFR5cGVUb1JlbmRlcmluZ05vZGUoXG4gICAgICAgICh6b2RUeXBlIGFzIHouWm9kT3B0aW9uYWw8ei5ab2RUeXBlPikuZGVmLmlubmVyVHlwZSxcbiAgICAgICAgYmFzZUtleVxuICAgICAgKSxcbiAgICAgIG9wdGlvbmFsOiB0cnVlLFxuICAgIH07XG4gIH0gZWxzZSBpZiAoem9kVHlwZSBpbnN0YW5jZW9mIHouWm9kTnVsbGFibGUpIHtcbiAgICByZXR1cm4ge1xuICAgICAgLi4uem9kVHlwZVRvUmVuZGVyaW5nTm9kZShcbiAgICAgICAgKHpvZFR5cGUgYXMgei5ab2ROdWxsYWJsZTx6LlpvZFR5cGU+KS5kZWYuaW5uZXJUeXBlLFxuICAgICAgICBiYXNlS2V5XG4gICAgICApLFxuICAgICAgbnVsbGFibGU6IHRydWUsXG4gICAgfTtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4ge1xuICAgICAgLi4uZGVmLFxuICAgICAgcmVuZGVyVHlwZTogcmVzb2x2ZVJlbmRlclR5cGUoYmFzZUtleSwgem9kVHlwZSksXG4gICAgfTtcbiAgfVxufVxuXG4vKipcbiAqIFpvZCDtg4DsnoXqs7wg7YKkIOydtOumhOycvOuhnOu2gO2EsCDsoIHsoIjtlZwgUmVuZGVyVHlwZeydhCDqsrDsoJXtlanri4jri6QuXG4gKi9cbmZ1bmN0aW9uIHJlc29sdmVSZW5kZXJUeXBlKFxuICBrZXk6IHN0cmluZyxcbiAgem9kVHlwZTogei5ab2RUeXBlQW55XG4pOiBSZW5kZXJpbmdOb2RlW1wicmVuZGVyVHlwZVwiXSB7XG4gIGlmICh6b2RUeXBlIGluc3RhbmNlb2Ygei5ab2REYXRlKSB7XG4gICAgcmV0dXJuIFwiZGF0ZXRpbWVcIjtcbiAgfSBlbHNlIGlmICh6b2RUeXBlIGluc3RhbmNlb2Ygei5ab2RTdHJpbmcpIHtcbiAgICBpZiAoa2V5LmluY2x1ZGVzKFwiaW1nXCIpIHx8IGtleS5pbmNsdWRlcyhcImltYWdlXCIpKSB7XG4gICAgICByZXR1cm4gXCJzdHJpbmctaW1hZ2VcIjtcbiAgICB9IGVsc2UgaWYgKHpvZFR5cGUuZGVzY3JpcHRpb24gPT09IFwiU1FMRGF0ZVRpbWVTdHJpbmdcIikge1xuICAgICAgcmV0dXJuIFwic3RyaW5nLWRhdGV0aW1lXCI7XG4gICAgfSBlbHNlIGlmIChrZXkuZW5kc1dpdGgoXCJkYXRlXCIpKSB7XG4gICAgICByZXR1cm4gXCJzdHJpbmctZGF0ZVwiO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gXCJzdHJpbmctcGxhaW5cIjtcbiAgICB9XG4gIH0gZWxzZSBpZiAoem9kVHlwZSBpbnN0YW5jZW9mIHouWm9kTnVtYmVyKSB7XG4gICAgaWYgKGtleSA9PT0gXCJpZFwiKSB7XG4gICAgICByZXR1cm4gXCJudW1iZXItaWRcIjtcbiAgICB9IGVsc2UgaWYgKGtleS5lbmRzV2l0aChcIl9pZFwiKSkge1xuICAgICAgcmV0dXJuIFwibnVtYmVyLWZrX2lkXCI7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBcIm51bWJlci1wbGFpblwiO1xuICAgIH1cbiAgfSBlbHNlIGlmICh6b2RUeXBlIGluc3RhbmNlb2Ygei5ab2RCb29sZWFuKSB7XG4gICAgcmV0dXJuIFwiYm9vbGVhblwiO1xuICB9IGVsc2UgaWYgKHpvZFR5cGUgaW5zdGFuY2VvZiB6LlpvZEVudW0pIHtcbiAgICByZXR1cm4gXCJlbnVtc1wiO1xuICB9IGVsc2UgaWYgKHpvZFR5cGUgaW5zdGFuY2VvZiB6LlpvZFJlY29yZCkge1xuICAgIHJldHVybiBcInJlY29yZFwiO1xuICB9IGVsc2UgaWYgKHpvZFR5cGUgaW5zdGFuY2VvZiB6LlpvZEFueSB8fCB6b2RUeXBlIGluc3RhbmNlb2Ygei5ab2RVbmtub3duKSB7XG4gICAgcmV0dXJuIFwic3RyaW5nLXBsYWluXCI7XG4gIH0gZWxzZSBpZiAoem9kVHlwZSBpbnN0YW5jZW9mIHouWm9kVW5pb24pIHtcbiAgICByZXR1cm4gXCJzdHJpbmctcGxhaW5cIjtcbiAgfSBlbHNlIGlmICh6b2RUeXBlIGluc3RhbmNlb2Ygei5ab2RMaXRlcmFsKSB7XG4gICAgcmV0dXJuIFwic3RyaW5nLXBsYWluXCI7XG4gIH0gZWxzZSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGDtg4DsnoUg7YyM7IuxIOu2iOqwgCAke2tleX0gJHt6b2RUeXBlLmRlZi50eXBlfWApO1xuICB9XG59XG5cbi8qKlxuICogRW50aXR5UHJvcOydhCBab2Qg7YOA7J6F7Jy866GcIOuzgO2ZmO2VqeuLiOuLpC5cbiAqIOqwgSBwcm9w7J2YIO2DgOyeheyXkCDrlLDrnbwg7KCB7KCI7ZWcIFpvZCB2YWxpZGF0b3Lrpbwg7IOd7ISx7ZWp64uI64ukLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcHJvcFRvWm9kVHlwZShwcm9wOiBFbnRpdHlQcm9wKTogUHJvbWlzZTx6LlpvZFR5cGVBbnk+IHtcbiAgbGV0IHpvZFR5cGU6IHouWm9kVHlwZUFueSA9IHoudW5rbm93bigpO1xuICBpZiAoaXNJbnRlZ2VyUHJvcChwcm9wKSkge1xuICAgIHpvZFR5cGUgPSB6Lm51bWJlcigpLmludCgpO1xuICB9IGVsc2UgaWYgKGlzQmlnSW50ZWdlclByb3AocHJvcCkpIHtcbiAgICB6b2RUeXBlID0gei5iaWdpbnQoKTtcbiAgfSBlbHNlIGlmIChpc1RleHRQcm9wKHByb3ApKSB7XG4gICAgem9kVHlwZSA9IHouc3RyaW5nKCkubWF4KGdldFRleHRUeXBlTGVuZ3RoKHByb3AudGV4dFR5cGUpKTtcbiAgfSBlbHNlIGlmIChpc0VudW1Qcm9wKHByb3ApKSB7XG4gICAgem9kVHlwZSA9IGF3YWl0IGdldFpvZFR5cGVCeUlkKHByb3AuaWQpO1xuICB9IGVsc2UgaWYgKGlzU3RyaW5nUHJvcChwcm9wKSkge1xuICAgIHpvZFR5cGUgPSB6LnN0cmluZygpLm1heChwcm9wLmxlbmd0aCk7XG4gIH0gZWxzZSBpZiAoaXNGbG9hdFByb3AocHJvcCkgfHwgaXNEb3VibGVQcm9wKHByb3ApKSB7XG4gICAgem9kVHlwZSA9IHoubnVtYmVyKCk7XG4gIH0gZWxzZSBpZiAoaXNEZWNpbWFsUHJvcChwcm9wKSkge1xuICAgIHpvZFR5cGUgPSB6LnN0cmluZygpO1xuICB9IGVsc2UgaWYgKGlzQm9vbGVhblByb3AocHJvcCkpIHtcbiAgICB6b2RUeXBlID0gei5ib29sZWFuKCk7XG4gIH0gZWxzZSBpZiAoaXNEYXRlUHJvcChwcm9wKSkge1xuICAgIHpvZFR5cGUgPSB6LnN0cmluZygpLmxlbmd0aCgxMCk7XG4gIH0gZWxzZSBpZiAoaXNUaW1lUHJvcChwcm9wKSkge1xuICAgIHpvZFR5cGUgPSB6LnN0cmluZygpLmxlbmd0aCg4KTtcbiAgfSBlbHNlIGlmIChpc0RhdGVUaW1lUHJvcChwcm9wKSkge1xuICAgIHpvZFR5cGUgPSB6LmRhdGUoKTtcbiAgfSBlbHNlIGlmIChpc1RpbWVzdGFtcFByb3AocHJvcCkpIHtcbiAgICB6b2RUeXBlID0gei5kYXRlKCk7XG4gIH0gZWxzZSBpZiAoaXNKc29uUHJvcChwcm9wKSkge1xuICAgIHpvZFR5cGUgPSBhd2FpdCBnZXRab2RUeXBlQnlJZChwcm9wLmlkKTtcbiAgfSBlbHNlIGlmIChpc1V1aWRQcm9wKHByb3ApKSB7XG4gICAgem9kVHlwZSA9IHoudXVpZCgpO1xuICB9IGVsc2UgaWYgKGlzVmlydHVhbFByb3AocHJvcCkpIHtcbiAgICB6b2RUeXBlID0gYXdhaXQgZ2V0Wm9kVHlwZUJ5SWQocHJvcC5pZCk7XG4gIH0gZWxzZSBpZiAoaXNSZWxhdGlvblByb3AocHJvcCkpIHtcbiAgICBpZiAoXG4gICAgICBpc0JlbG9uZ3NUb09uZVJlbGF0aW9uUHJvcChwcm9wKSB8fFxuICAgICAgKGlzT25lVG9PbmVSZWxhdGlvblByb3AocHJvcCkgJiYgcHJvcC5oYXNKb2luQ29sdW1uKVxuICAgICkge1xuICAgICAgem9kVHlwZSA9IHoubnVtYmVyKCkuaW50KCk7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIHRocm93IG5ldyBFcnJvcihgcHJvcOydhCB6b2RUeXBl7Jy866GcIOuzgO2ZmO2VmOuKlOuNsCDsi6TtjKggJHtwcm9wfX1gKTtcbiAgfVxuXG4gIGlmICgocHJvcCBhcyB7IHVuc2lnbmVkPzogYm9vbGVhbiB9KS51bnNpZ25lZCkge1xuICAgIHpvZFR5cGUgPSAoem9kVHlwZSBhcyB6LlpvZE51bWJlcikubm9ubmVnYXRpdmUoKTtcbiAgfVxuICBpZiAocHJvcC5udWxsYWJsZSkge1xuICAgIHpvZFR5cGUgPSB6b2RUeXBlLm51bGxhYmxlKCk7XG4gIH1cblxuICByZXR1cm4gem9kVHlwZTtcbn1cbiJdLCJuYW1lcyI6WyJ6IiwiRW50aXR5TWFuYWdlciIsImlzQmVsb25nc1RvT25lUmVsYXRpb25Qcm9wIiwiaXNCaWdJbnRlZ2VyUHJvcCIsImlzQm9vbGVhblByb3AiLCJpc0RhdGVQcm9wIiwiaXNEYXRlVGltZVByb3AiLCJpc0RlY2ltYWxQcm9wIiwiaXNEb3VibGVQcm9wIiwiaXNFbnVtUHJvcCIsImlzRmxvYXRQcm9wIiwiaXNJbnRlZ2VyUHJvcCIsImlzSnNvblByb3AiLCJpc09uZVRvT25lUmVsYXRpb25Qcm9wIiwiaXNSZWxhdGlvblByb3AiLCJpc1N0cmluZ1Byb3AiLCJpc1RleHRQcm9wIiwiaXNUaW1lUHJvcCIsImlzVGltZXN0YW1wUHJvcCIsImlzVXVpZFByb3AiLCJpc1ZpcnR1YWxQcm9wIiwicGF0aCIsImNyZWF0ZUltcG9ydFVybCIsIlNvbmFtdSIsImluZmxlY3Rpb24iLCJnZXRUZXh0VHlwZUxlbmd0aCIsImdldFpvZFR5cGVCeUlkIiwiem9kVHlwZUlkIiwibW9kdWxlUGF0aCIsImdldE1vZHVsZVBhdGgiLCJtb2R1bGVBYnNQYXRoIiwiam9pbiIsImFwaVJvb3RQYXRoIiwiaW1wb3J0VXJsIiwiaW1wb3J0ZWQiLCJFcnJvciIsImRlc2NyaWJlIiwiem9kVHlwZVRvUmVuZGVyaW5nTm9kZSIsInpvZFR5cGUiLCJiYXNlS2V5IiwiZGVmIiwibmFtZSIsImxhYmVsIiwiY2FtZWxpemUiLCJab2RPYmplY3QiLCJjb2x1bW5LZXlzIiwiT2JqZWN0Iiwia2V5cyIsInNoYXBlIiwiY2hpbGRyZW4iLCJtYXAiLCJrZXkiLCJpbm5lclR5cGUiLCJyZW5kZXJUeXBlIiwiWm9kQXJyYXkiLCJlbGVtZW50IiwiWm9kU3RyaW5nIiwiaW5jbHVkZXMiLCJab2RVbmlvbiIsIm9wdGlvbk5vZGVzIiwib3B0aW9ucyIsIm9wdCIsIlpvZE9wdGlvbmFsIiwib3B0aW9uYWwiLCJab2ROdWxsYWJsZSIsIm51bGxhYmxlIiwicmVzb2x2ZVJlbmRlclR5cGUiLCJab2REYXRlIiwiZGVzY3JpcHRpb24iLCJlbmRzV2l0aCIsIlpvZE51bWJlciIsIlpvZEJvb2xlYW4iLCJab2RFbnVtIiwiWm9kUmVjb3JkIiwiWm9kQW55IiwiWm9kVW5rbm93biIsIlpvZExpdGVyYWwiLCJ0eXBlIiwicHJvcFRvWm9kVHlwZSIsInByb3AiLCJ1bmtub3duIiwibnVtYmVyIiwiaW50IiwiYmlnaW50Iiwic3RyaW5nIiwibWF4IiwidGV4dFR5cGUiLCJpZCIsImxlbmd0aCIsImJvb2xlYW4iLCJkYXRlIiwidXVpZCIsImhhc0pvaW5Db2x1bW4iLCJ1bnNpZ25lZCIsIm5vbm5lZ2F0aXZlIl0sIm1hcHBpbmdzIjoiQUFBQSxPQUFPQSxPQUFPLE1BQU07QUFDcEIsU0FBU0MsYUFBYSxRQUFRLDhCQUEyQjtBQUN6RCxTQUVFQywwQkFBMEIsRUFDMUJDLGdCQUFnQixFQUNoQkMsYUFBYSxFQUNiQyxVQUFVLEVBQ1ZDLGNBQWMsRUFDZEMsYUFBYSxFQUNiQyxZQUFZLEVBQ1pDLFVBQVUsRUFDVkMsV0FBVyxFQUNYQyxhQUFhLEVBQ2JDLFVBQVUsRUFD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
449
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy90ZW1wbGF0ZS96b2QtY29udmVydGVyLnRzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogem9kLWNvbnZlcnRlciDqtazshLFcbiAqIDEuIOycoO2LuOumrO2LsFxuICogIC0gZ2V0Wm9kVHlwZUJ5SWRcbiAqXG4gKiAyLiBab2Qg7YOA7J6FIOuzgO2ZmCAoRW50aXR5UHJvcCAtPiBab2RUeXBlKVxuICogIC0gcHJvcFRvWm9kVHlwZVxuICpcbiAqIDMuIEVudGl0eVByb3AvTm9kZSAtPiBab2Qg7L2U65OcIOusuOyekOyXtFxuICogIC0gcHJvcFRvWm9kVHlwZURlZlxuICogIC0gcHJvcE5vZGVUb1pvZFR5cGVEZWZcbiAqXG4gKiA0LiBab2Qg7YOA7J6FIOyduOyKpO2EtOyKpOulvCDtlbTri7ntlZjripQgWm9kIOy9lOuTnCDrrLjsnpDsl7TroZwg67OA7ZmYIChab2RUeXBlIC0+IFpvZENvZGUpXG4gKiAgLSB6b2RUeXBlVG9ab2RDb2RlXG4gKlxuICogNS4gWm9kIO2DgOyeheydhCBVSSDroIzrjZTrp4Hsl5Ag7IKs7Jqp7ZWgIOyImCDsnojripQgUmVuZGVyaW5nTm9kZeuhnCDrs4DtmZggKFpvZFR5cGUgLT4gUmVuZGVyaW5nTm9kZSlcbiAqICAtIHpvZFR5cGVUb1JlbmRlcmluZ05vZGVcbiAqICAtIHJlc29sdmVSZW5kZXJUeXBlXG4gKi9cblxuaW1wb3J0IGluZmxlY3Rpb24gZnJvbSBcImluZmxlY3Rpb25cIjtcbmltcG9ydCBwYXRoIGZyb20gXCJwYXRoXCI7XG5pbXBvcnQgeyB6IH0gZnJvbSBcInpvZFwiO1xuaW1wb3J0IHR5cGUgeyAkWm9kTG9vc2VTaGFwZSB9IGZyb20gXCJ6b2QvdjQvY29yZVwiO1xuaW1wb3J0IHsgU29uYW11IH0gZnJvbSBcIi4uL2FwaS9zb25hbXVcIjtcbmltcG9ydCB7IEVudGl0eU1hbmFnZXIgfSBmcm9tIFwiLi4vZW50aXR5L2VudGl0eS1tYW5hZ2VyXCI7XG5pbXBvcnQge1xuICB0eXBlIEVudGl0eVByb3AsXG4gIHR5cGUgRW50aXR5UHJvcE5vZGUsXG4gIGlzQmVsb25nc1RvT25lUmVsYXRpb25Qcm9wLFxuICBpc0JpZ0ludGVnZXJBcnJheVByb3AsXG4gIGlzQmlnSW50ZWdlclNpbmdsZVByb3AsXG4gIGlzQm9vbGVhbkFycmF5UHJvcCxcbiAgaXNCb29sZWFuU2luZ2xlUHJvcCxcbiAgaXNEYXRlQXJyYXlQcm9wLFxuICBpc0RhdGVTaW5nbGVQcm9wLFxuICBpc0VudW1BcnJheVByb3AsXG4gIGlzRW51bVNpbmdsZVByb3AsXG4gIGlzSW50ZWdlckFycmF5UHJvcCxcbiAgaXNJbnRlZ2VyU2luZ2xlUHJvcCxcbiAgaXNKc29uUHJvcCxcbiAgaXNOdW1iZXJBcnJheVByb3AsXG4gIGlzTnVtYmVyU2luZ2xlUHJvcCxcbiAgaXNOdW1lcmljQXJyYXlQcm9wLFxuICBpc051bWVyaWNTaW5nbGVQcm9wLFxuICBpc09uZVRvT25lUmVsYXRpb25Qcm9wLFxuICBpc1JlbGF0aW9uUHJvcCxcbiAgaXNTdHJpbmdBcnJheVByb3AsXG4gIGlzU3RyaW5nU2luZ2xlUHJvcCxcbiAgaXNVdWlkQXJyYXlQcm9wLFxuICBpc1V1aWRTaW5nbGVQcm9wLFxuICBpc1ZpcnR1YWxQcm9wLFxuICB0eXBlIFJlbmRlcmluZ05vZGUsXG59IGZyb20gXCIuLi90eXBlcy90eXBlc1wiO1xuaW1wb3J0IHsgY3JlYXRlSW1wb3J0VXJsIH0gZnJvbSBcIi4uL3V0aWxzL2VzbS11dGlsc1wiO1xuXG4vLyA8YW55PuulvCDsnpDsoJztlZjqs6AsIFpvZOyXkOyEnCDsoJzslb3tlZjripQg6riw67O47KCB7J24IEdlbmVyaWMgVHlwZSBQYXJhbWV0ZXLrpbwg7IKs7Jqp7ZWoLlxudHlwZSBBbnlab2RSZWNvcmQgPSB6LlpvZFJlY29yZDx6LlpvZFN0cmluZyB8IHouWm9kTnVtYmVyIHwgei5ab2RTeW1ib2wsIHouWm9kVHlwZT47XG50eXBlIEFueVpvZE9iamVjdCA9IHouWm9kT2JqZWN0PCRab2RMb29zZVNoYXBlPjtcbnR5cGUgQW55Wm9kTnVsbGFibGUgPSB6LlpvZE51bGxhYmxlPHouWm9kVHlwZT47XG50eXBlIEFueVpvZERlZmF1bHQgPSB6LlpvZERlZmF1bHQ8ei5ab2RUeXBlPjtcbnR5cGUgQW55Wm9kVW5pb24gPSB6LlpvZFVuaW9uPHouWm9kVHlwZVtdPjtcbnR5cGUgQW55Wm9kQXJyYXkgPSB6LlpvZEFycmF5PHouWm9kVHlwZT47XG50eXBlIEFueVpvZE9wdGlvbmFsID0gei5ab2RPcHRpb25hbDx6LlpvZFR5cGU+O1xuXG4vKipcbiAqIFpvZCDtg4DsnoUgSUTroZzrtoDthLAg64+Z7KCB7Jy866GcIFpvZCDsiqTtgqTrp4jrpbwg66Gc65Oc7ZWp64uI64ukLlxuICogZGlzdCDrlJTroInthqDrpqzsl5DshJwgRVNN7Jy866GcIGltcG9ydO2VmOyXrCDqsIDsoLjsmLXri4jri6QuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZXRab2RUeXBlQnlJZCh6b2RUeXBlSWQ6IHN0cmluZyk6IFByb21pc2U8ei5ab2RUeXBlQW55PiB7XG4gIGNvbnN0IG1vZHVsZVBhdGggPSBFbnRpdHlNYW5hZ2VyLmdldE1vZHVsZVBhdGgoem9kVHlwZUlkKTtcbiAgY29uc3QgbW9kdWxlQWJzUGF0aCA9IHBhdGguam9pbihTb25hbXUuYXBpUm9vdFBhdGgsIFwiZGlzdFwiLCBcImFwcGxpY2F0aW9uXCIsIGAke21vZHVsZVBhdGh9LmpzYCk7XG4gIGNvbnN0IGltcG9ydFVybCA9IGNyZWF0ZUltcG9ydFVybChtb2R1bGVBYnNQYXRoKTtcbiAgY29uc3QgaW1wb3J0ZWQgPSBhd2FpdCBpbXBvcnQoaW1wb3J0VXJsKTtcblxuICBpZiAoIWltcG9ydGVkW3pvZFR5cGVJZF0pIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYOyhtOyerO2VmOyngCDslYrripQgem9kVHlwZUlkICR7em9kVHlwZUlkfWApO1xuICB9XG4gIHJldHVybiBpbXBvcnRlZFt6b2RUeXBlSWRdLmRlc2NyaWJlKHpvZFR5cGVJZCk7XG59XG5cbi8qKlxuICogRW50aXR5UHJvcOydhCBab2Qg7YOA7J6F7Jy866GcIOuzgO2ZmO2VqeuLiOuLpC5cbiAqIOqwgSBwcm9w7J2YIO2DgOyeheyXkCDrlLDrnbwg7KCB7KCI7ZWcIFpvZCB2YWxpZGF0b3Lrpbwg7IOd7ISx7ZWp64uI64ukLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcHJvcFRvWm9kVHlwZShwcm9wOiBFbnRpdHlQcm9wKTogUHJvbWlzZTx6LlpvZFR5cGVBbnk+IHtcbiAgbGV0IHpvZFR5cGU6IHouWm9kVHlwZUFueSA9IHoudW5rbm93bigpO1xuICBpZiAoaXNJbnRlZ2VyU2luZ2xlUHJvcChwcm9wKSkge1xuICAgIHpvZFR5cGUgPSB6Lm51bWJlcigpLmludCgpO1xuICB9IGVsc2UgaWYgKGlzSW50ZWdlckFycmF5UHJvcChwcm9wKSkge1xuICAgIHpvZFR5cGUgPSB6Lm51bWJlcigpLmludCgpLmFycmF5KCk7XG4gIH0gZWxzZSBpZiAoaXNCaWdJbnRlZ2VyU2luZ2xlUHJvcChwcm9wKSkge1xuICAgIHpvZFR5cGUgPSB6LmJpZ2ludCgpO1xuICB9IGVsc2UgaWYgKGlzQmlnSW50ZWdlckFycmF5UHJvcChwcm9wKSkge1xuICAgIHpvZFR5cGUgPSB6LmJpZ2ludCgpLmFycmF5KCk7XG4gIH0gZWxzZSBpZiAoaXNFbnVtU2luZ2xlUHJvcChwcm9wKSkge1xuICAgIHpvZFR5cGUgPSBhd2FpdCBnZXRab2RUeXBlQnlJZChwcm9wLmlkKTtcbiAgfSBlbHNlIGlmIChpc0VudW1BcnJheVByb3AocHJvcCkpIHtcbiAgICB6b2RUeXBlID0gKGF3YWl0IGdldFpvZFR5cGVCeUlkKHByb3AuaWQpKS5hcnJheSgpO1xuICB9IGVsc2UgaWYgKGlzU3RyaW5nU2luZ2xlUHJvcChwcm9wKSkge1xuICAgIGlmIChwcm9wLmxlbmd0aCkge1xuICAgICAgem9kVHlwZSA9IHouc3RyaW5nKCkubWF4KHByb3AubGVuZ3RoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgem9kVHlwZSA9IHouc3RyaW5nKCk7XG4gICAgfVxuICB9IGVsc2UgaWYgKGlzU3RyaW5nQXJyYXlQcm9wKHByb3ApKSB7XG4gICAgaWYgKHByb3AubGVuZ3RoKSB7XG4gICAgICB6b2RUeXBlID0gei5zdHJpbmcoKS5tYXgocHJvcC5sZW5ndGgpLmFycmF5KCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHpvZFR5cGUgPSB6LnN0cmluZygpLmFycmF5KCk7XG4gICAgfVxuICB9IGVsc2UgaWYgKGlzTnVtYmVyU2luZ2xlUHJvcChwcm9wKSkge1xuICAgIHpvZFR5cGUgPSB6Lm51bWJlcigpO1xuICB9IGVsc2UgaWYgKGlzTnVtYmVyQXJyYXlQcm9wKHByb3ApKSB7XG4gICAgem9kVHlwZSA9IHoubnVtYmVyKCkuYXJyYXkoKTtcbiAgfSBlbHNlIGlmIChpc051bWVyaWNTaW5nbGVQcm9wKHByb3ApKSB7XG4gICAgem9kVHlwZSA9IHouc3RyaW5nKCk7XG4gIH0gZWxzZSBpZiAoaXNOdW1lcmljQXJyYXlQcm9wKHByb3ApKSB7XG4gICAgem9kVHlwZSA9IHouc3RyaW5nKCkuYXJyYXkoKTtcbiAgfSBlbHNlIGlmIChpc0Jvb2xlYW5TaW5nbGVQcm9wKHByb3ApKSB7XG4gICAgem9kVHlwZSA9IHouYm9vbGVhbigpO1xuICB9IGVsc2UgaWYgKGlzQm9vbGVhbkFycmF5UHJvcChwcm9wKSkge1xuICAgIHpvZFR5cGUgPSB6LmJvb2xlYW4oKS5hcnJheSgpO1xuICB9IGVsc2UgaWYgKGlzRGF0ZVNpbmdsZVByb3AocHJvcCkpIHtcbiAgICB6b2RUeXBlID0gei5kYXRlKCk7XG4gIH0gZWxzZSBpZiAoaXNEYXRlQXJyYXlQcm9wKHByb3ApKSB7XG4gICAgem9kVHlwZSA9IHouZGF0ZSgpLmFycmF5KCk7XG4gIH0gZWxzZSBpZiAoaXNVdWlkU2luZ2xlUHJvcChwcm9wKSkge1xuICAgIHpvZFR5cGUgPSB6LnV1aWQoKTtcbiAgfSBlbHNlIGlmIChpc1V1aWRBcnJheVByb3AocHJvcCkpIHtcbiAgICB6b2RUeXBlID0gei51dWlkKCkuYXJyYXkoKTtcbiAgfSBlbHNlIGlmIChpc0pzb25Qcm9wKHByb3ApKSB7XG4gICAgem9kVHlwZSA9IGF3YWl0IGdldFpvZFR5cGVCeUlkKHByb3AuaWQpO1xuICB9IGVsc2UgaWYgKGlzVmlydHVhbFByb3AocHJvcCkpIHtcbiAgICB6b2RUeXBlID0gYXdhaXQgZ2V0Wm9kVHlwZUJ5SWQocHJvcC5pZCk7XG4gIH0gZWxzZSBpZiAoaXNSZWxhdGlvblByb3AocHJvcCkpIHtcbiAgICBpZiAoaXNCZWxvbmdzVG9PbmVSZWxhdGlvblByb3AocHJvcCkgfHwgKGlzT25lVG9PbmVSZWxhdGlvblByb3AocHJvcCkgJiYgcHJvcC5oYXNKb2luQ29sdW1uKSkge1xuICAgICAgem9kVHlwZSA9IHoubnVtYmVyKCkuaW50KCk7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIHRocm93IG5ldyBFcnJvcihgcHJvcOydhCB6b2RUeXBl7Jy866GcIOuzgO2ZmO2VmOuKlOuNsCDsi6TtjKggJHtwcm9wfX1gKTtcbiAgfVxuXG4gIGlmICgocHJvcCBhcyB7IHVuc2lnbmVkPzogYm9vbGVhbiB9KS51bnNpZ25lZCkge1xuICAgIHpvZFR5cGUgPSAoem9kVHlwZSBhcyB6LlpvZE51bWJlcikubm9ubmVnYXRpdmUoKTtcbiAgfVxuICBpZiAocHJvcC5udWxsYWJsZSkge1xuICAgIHpvZFR5cGUgPSB6b2RUeXBlLm51bGxhYmxlKCk7XG4gIH1cblxuICByZXR1cm4gem9kVHlwZTtcbn1cblxuLyoqXG4gKiBFbnRpdHlQcm9w7J2EIFpvZCDtg4DsnoUg7KCV7J2YIOy9lOuTnCDrrLjsnpDsl7TroZwg67OA7ZmY7ZWp64uI64ukLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcHJvcFRvWm9kVHlwZURlZihwcm9wOiBFbnRpdHlQcm9wLCBpbmplY3RJbXBvcnRLZXlzOiBzdHJpbmdbXSk6IHN0cmluZyB7XG4gIGxldCBzdG10OiBzdHJpbmc7XG4gIGlmIChpc0ludGVnZXJTaW5nbGVQcm9wKHByb3ApKSB7XG4gICAgc3RtdCA9IGAke3Byb3AubmFtZX06IHouaW50KClgO1xuICB9IGVsc2UgaWYgKGlzSW50ZWdlckFycmF5UHJvcChwcm9wKSkge1xuICAgIHN0bXQgPSBgJHtwcm9wLm5hbWV9OiB6LmludCgpLmFycmF5KClgO1xuICB9IGVsc2UgaWYgKGlzQmlnSW50ZWdlclNpbmdsZVByb3AocHJvcCkpIHtcbiAgICBzdG10ID0gYCR7cHJvcC5uYW1lfTogei5iaWdpbnQoKWA7XG4gIH0gZWxzZSBpZiAoaXNCaWdJbnRlZ2VyQXJyYXlQcm9wKHByb3ApKSB7XG4gICAgc3RtdCA9IGAke3Byb3AubmFtZX06IHouYmlnaW50KCkuYXJyYXkoKWA7XG4gIH0gZWxzZSBpZiAoaXNFbnVtU2luZ2xlUHJvcChwcm9wKSkge1xuICAgIHN0bXQgPSBgJHtwcm9wLm5hbWV9OiAke3Byb3AuaWR9YDtcbiAgICBpbmplY3RJbXBvcnRLZXlzLnB1c2gocHJvcC5pZCk7XG4gIH0gZWxzZSBpZiAoaXNFbnVtQXJyYXlQcm9wKHByb3ApKSB7XG4gICAgc3RtdCA9IGAke3Byb3AubmFtZX06ICR7cHJvcC5pZH0uYXJyYXkoKWA7XG4gICAgaW5qZWN0SW1wb3J0S2V5cy5wdXNoKHByb3AuaWQpO1xuICB9IGVsc2UgaWYgKGlzU3RyaW5nU2luZ2xlUHJvcChwcm9wKSkge1xuICAgIGlmIChwcm9wLmxlbmd0aCkge1xuICAgICAgc3RtdCA9IGAke3Byb3AubmFtZX06IHouc3RyaW5nKCkubWF4KCR7cHJvcC5sZW5ndGh9KWA7XG4gICAgfSBlbHNlIHtcbiAgICAgIHN0bXQgPSBgJHtwcm9wLm5hbWV9OiB6LnN0cmluZygpYDtcbiAgICB9XG4gIH0gZWxzZSBpZiAoaXNTdHJpbmdBcnJheVByb3AocHJvcCkpIHtcbiAgICBpZiAocHJvcC5sZW5ndGgpIHtcbiAgICAgIHN0bXQgPSBgJHtwcm9wLm5hbWV9OiB6LnN0cmluZygpLm1heCgke3Byb3AubGVuZ3RofSkuYXJyYXkoKWA7XG4gICAgfSBlbHNlIHtcbiAgICAgIHN0bXQgPSBgJHtwcm9wLm5hbWV9OiB6LnN0cmluZygpLmFycmF5KClgO1xuICAgIH1cbiAgfSBlbHNlIGlmIChpc051bWJlclNpbmdsZVByb3AocHJvcCkpIHtcbiAgICBzdG10ID0gYCR7cHJvcC5uYW1lfTogei5udW1iZXIoKWA7XG4gIH0gZWxzZSBpZiAoaXNOdW1iZXJBcnJheVByb3AocHJvcCkpIHtcbiAgICBzdG10ID0gYCR7cHJvcC5uYW1lfTogei5udW1iZXIoKS5hcnJheSgpYDtcbiAgfSBlbHNlIGlmIChpc051bWVyaWNTaW5nbGVQcm9wKHByb3ApKSB7XG4gICAgc3RtdCA9IGAke3Byb3AubmFtZX06IHouc3RyaW5nKClgO1xuICB9IGVsc2UgaWYgKGlzTnVtZXJpY0FycmF5UHJvcChwcm9wKSkge1xuICAgIHN0bXQgPSBgJHtwcm9wLm5hbWV9OiB6LnN0cmluZygpLmFycmF5KClgO1xuICB9IGVsc2UgaWYgKGlzRGF0ZVNpbmdsZVByb3AocHJvcCkpIHtcbiAgICBzdG10ID0gYCR7cHJvcC5uYW1lfTogei5kYXRlKClgO1xuICB9IGVsc2UgaWYgKGlzRGF0ZUFycmF5UHJvcChwcm9wKSkge1xuICAgIHN0bXQgPSBgJHtwcm9wLm5hbWV9OiB6LmRhdGUoKS5hcnJheSgpYDtcbiAgfSBlbHNlIGlmIChpc0Jvb2xlYW5TaW5nbGVQcm9wKHByb3ApKSB7XG4gICAgc3RtdCA9IGAke3Byb3AubmFtZX06IHouYm9vbGVhbigpYDtcbiAgfSBlbHNlIGlmIChpc0Jvb2xlYW5BcnJheVByb3AocHJvcCkpIHtcbiAgICBzdG10ID0gYCR7cHJvcC5uYW1lfTogei5ib29sZWFuKCkuYXJyYXkoKWA7XG4gIH0gZWxzZSBpZiAoaXNVdWlkU2luZ2xlUHJvcChwcm9wKSkge1xuICAgIHN0bXQgPSBgJHtwcm9wLm5hbWV9OiB6LnV1aWQoKWA7XG4gIH0gZWxzZSBpZiAoaXNVdWlkQXJyYXlQcm9wKHByb3ApKSB7XG4gICAgc3RtdCA9IGAke3Byb3AubmFtZX06IHoudXVpZCgpLmFycmF5KClgO1xuICB9IGVsc2UgaWYgKGlzSnNvblByb3AocHJvcCkpIHtcbiAgICBzdG10ID0gYCR7cHJvcC5uYW1lfTogJHtwcm9wLmlkfWA7XG4gICAgaW5qZWN0SW1wb3J0S2V5cy5wdXNoKHByb3AuaWQpO1xuICB9IGVsc2UgaWYgKGlzVmlydHVhbFByb3AocHJvcCkpIHtcbiAgICBzdG10ID0gYCR7cHJvcC5uYW1lfTogJHtwcm9wLmlkfWA7XG4gICAgaW5qZWN0SW1wb3J0S2V5cy5wdXNoKHByb3AuaWQpO1xuICB9IGVsc2UgaWYgKGlzUmVsYXRpb25Qcm9wKHByb3ApKSB7XG4gICAgaWYgKGlzQmVsb25nc1RvT25lUmVsYXRpb25Qcm9wKHByb3ApIHx8IChpc09uZVRvT25lUmVsYXRpb25Qcm9wKHByb3ApICYmIHByb3AuaGFzSm9pbkNvbHVtbikpIHtcbiAgICAgIHN0bXQgPSBgJHtwcm9wLm5hbWV9X2lkOiB6LmludCgpYDtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8g6re47Jm4IHJlbGF0aW9uIOy8gOydtOyKpCDsoJzsmbhcbiAgICAgIHJldHVybiBgLy8gJHtwcm9wLm5hbWV9OiAke3Byb3AucmVsYXRpb25UeXBlfSAke3Byb3Aud2l0aH1gO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gXCIvLyB1bmFibGUgdG8gcmVzb2x2ZVwiO1xuICB9XG5cbiAgaWYgKChwcm9wIGFzIHsgdW5zaWduZWQ/OiBib29sZWFuIH0pLnVuc2lnbmVkKSB7XG4gICAgc3RtdCArPSBcIi5ub25uZWdhdGl2ZSgpXCI7XG4gIH1cbiAgaWYgKHByb3AubnVsbGFibGUpIHtcbiAgICBzdG10ICs9IFwiLm51bGxhYmxlKClcIjtcbiAgfVxuXG4gIHJldHVybiBgJHtzdG10fSxgO1xufVxuXG4vKipcbiAqIEVudGl0eVByb3BOb2Rl66W8IFpvZCDtg4DsnoUg7KCV7J2YIOy9lOuTnCDrrLjsnpDsl7TroZwg67OA7ZmY7ZWp64uI64ukLlxuICogcGxhaW4sIGFycmF5LCBvYmplY3Qg64W465OcIO2DgOyeheydhCDsnqzqt4DsoIHsnLzroZwg7LKY66as7ZWY7JesIOykkeyyqSDqtazsobDrpbwg7KeA7JuQ7ZWp64uI64ukLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcHJvcE5vZGVUb1pvZFR5cGVEZWYocHJvcE5vZGU6IEVudGl0eVByb3BOb2RlLCBpbmplY3RJbXBvcnRLZXlzOiBzdHJpbmdbXSk6IHN0cmluZyB7XG4gIGlmIChwcm9wTm9kZS5ub2RlVHlwZSA9PT0gXCJwbGFpblwiKSB7XG4gICAgcmV0dXJuIHByb3BUb1pvZFR5cGVEZWYocHJvcE5vZGUucHJvcCwgaW5qZWN0SW1wb3J0S2V5cyk7XG4gIH0gZWxzZSBpZiAocHJvcE5vZGUubm9kZVR5cGUgPT09IFwiYXJyYXlcIikge1xuICAgIHJldHVybiBbXG4gICAgICBwcm9wTm9kZS5wcm9wID8gYCR7cHJvcE5vZGUucHJvcC5uYW1lfTogYCA6IFwiXCIsXG4gICAgICBcInouYXJyYXkoei5vYmplY3Qoe1wiLFxuICAgICAgcHJvcE5vZGUuY2hpbGRyZW5cbiAgICAgICAgLm1hcCgoY2hpbGRQcm9wTm9kZSkgPT4gcHJvcE5vZGVUb1pvZFR5cGVEZWYoY2hpbGRQcm9wTm9kZSwgaW5qZWN0SW1wb3J0S2V5cykpXG4gICAgICAgIC5qb2luKFwiXFxuXCIpLFxuICAgICAgXCJcIixcbiAgICAgIFwifSkpLFwiLFxuICAgIF0uam9pbihcIlxcblwiKTtcbiAgfSBlbHNlIGlmIChwcm9wTm9kZS5ub2RlVHlwZSA9PT0gXCJvYmplY3RcIikge1xuICAgIHJldHVybiBbXG4gICAgICBwcm9wTm9kZS5wcm9wID8gYCR7cHJvcE5vZGUucHJvcC5uYW1lfTogYCA6IFwiXCIsXG4gICAgICBcInoub2JqZWN0KHtcIixcbiAgICAgIHByb3BOb2RlLmNoaWxkcmVuXG4gICAgICAgIC5tYXAoKGNoaWxkUHJvcE5vZGUpID0+IHByb3BOb2RlVG9ab2RUeXBlRGVmKGNoaWxkUHJvcE5vZGUsIGluamVjdEltcG9ydEtleXMpKVxuICAgICAgICAuam9pbihcIlxcblwiKSxcbiAgICAgIFwiXCIsXG4gICAgICBgfSkke3Byb3BOb2RlLnByb3A/Lm51bGxhYmxlID8gXCIubnVsbGFibGUoKVwiIDogXCJcIn0sYCxcbiAgICBdLmpvaW4oXCJcXG5cIik7XG4gIH0gZWxzZSB7XG4gICAgdGhyb3cgRXJyb3I7XG4gIH1cbn1cblxuLy8gVE9ETyhIYXplLCAyNTEwMzEpOiBcInRlbXBsYXRlX2xpdGVyYWxcIiwgXCJmaWxlXCLsl5Ag64yA7ZWcIOyngOybkOydtCDtlYTsmpTtlaguXG5leHBvcnQgZnVuY3Rpb24gem9kVHlwZVRvVHNUeXBlRGVmKHp0OiB6LlpvZFR5cGUpOiBzdHJpbmcge1xuICBzd2l0Y2ggKHp0LmRlZi50eXBlKSB7XG4gICAgY2FzZSBcInN0cmluZ1wiOlxuICAgIGNhc2UgXCJudW1iZXJcIjpcbiAgICBjYXNlIFwiYm9vbGVhblwiOlxuICAgIGNhc2UgXCJiaWdpbnRcIjpcbiAgICBjYXNlIFwiZGF0ZVwiOlxuICAgIGNhc2UgXCJudWxsXCI6XG4gICAgY2FzZSBcInVuZGVmaW5lZFwiOlxuICAgIGNhc2UgXCJhbnlcIjpcbiAgICBjYXNlIFwidW5rbm93blwiOlxuICAgIGNhc2UgXCJuZXZlclwiOlxuICAgICAgcmV0dXJuIHp0LmRlZi50eXBlO1xuICAgIGNhc2UgXCJudWxsYWJsZVwiOlxuICAgICAgcmV0dXJuIGAke3pvZFR5cGVUb1RzVHlwZURlZigoenQgYXMgQW55Wm9kTnVsbGFibGUpLmRlZi5pbm5lclR5cGUpfSB8IG51bGxgO1xuICAgIGNhc2UgXCJkZWZhdWx0XCI6XG4gICAgICByZXR1cm4gem9kVHlwZVRvVHNUeXBlRGVmKCh6dCBhcyBBbnlab2REZWZhdWx0KS5kZWYuaW5uZXJUeXBlKTtcbiAgICBjYXNlIFwicmVjb3JkXCI6IHtcbiAgICAgIGNvbnN0IHJlY29yZFR5cGUgPSB6dCBhcyBBbnlab2RSZWNvcmQ7XG4gICAgICByZXR1cm4gYHsgWyBrZXk6ICR7em9kVHlwZVRvVHNUeXBlRGVmKHJlY29yZFR5cGUuZGVmLmtleVR5cGUpfSBdOiAke3pvZFR5cGVUb1RzVHlwZURlZihyZWNvcmRUeXBlLmRlZi52YWx1ZVR5cGUpfX1gO1xuICAgIH1cbiAgICBjYXNlIFwibGl0ZXJhbFwiOlxuICAgICAgcmV0dXJuIEFycmF5LmZyb20oKHp0IGFzIHouWm9kTGl0ZXJhbCkudmFsdWVzKVxuICAgICAgICAubWFwKCh2YWx1ZSkgPT4ge1xuICAgICAgICAgIGlmICh0eXBlb2YgdmFsdWUgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgICAgIHJldHVybiBgXCIke3ZhbHVlfVwiYDtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAodmFsdWUgPT09IG51bGwpIHtcbiAgICAgICAgICAgIHJldHVybiBgbnVsbGA7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHJldHVybiBgdW5kZWZpbmVkYDtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICByZXR1cm4gYCR7dmFsdWV9YDtcbiAgICAgICAgfSlcbiAgICAgICAgLmpvaW4oXCIgfCBcIik7XG4gICAgY2FzZSBcInVuaW9uXCI6XG4gICAgICByZXR1cm4gYCR7KHp0IGFzIEFueVpvZFVuaW9uKS5vcHRpb25zXG4gICAgICAgIC5tYXAoKG9wdGlvbikgPT4gem9kVHlwZVRvVHNUeXBlRGVmKG9wdGlvbikpXG4gICAgICAgIC5qb2luKFwiIHwgXCIpfWA7XG4gICAgY2FzZSBcImVudW1cIjpcbiAgICAgIHJldHVybiBgJHsoenQgYXMgei5ab2RFbnVtKS5vcHRpb25zLm1hcCgodmFsKSA9PiBgXCIke3ZhbH1cImApLmpvaW4oXCIgfCBcIil9YDtcbiAgICBjYXNlIFwiYXJyYXlcIjpcbiAgICAgIHJldHVybiBgJHt6b2RUeXBlVG9Uc1R5cGVEZWYoKHp0IGFzIEFueVpvZEFycmF5KS5lbGVtZW50KX1bXWA7XG4gICAgY2FzZSBcIm9iamVjdFwiOiB7XG4gICAgICBjb25zdCBzaGFwZSA9ICh6dCBhcyBBbnlab2RPYmplY3QpLnNoYXBlO1xuICAgICAgcmV0dXJuIFtcbiAgICAgICAgXCJ7XCIsXG4gICAgICAgIC4uLk9iamVjdC5rZXlzKHNoYXBlKS5tYXAoKGtleSkgPT4ge1xuICAgICAgICAgIGlmIChzaGFwZVtrZXldLmRlZi50eXBlID09PSBcIm9wdGlvbmFsXCIpIHtcbiAgICAgICAgICAgIHJldHVybiBgJHtrZXl9PzogJHt6b2RUeXBlVG9Uc1R5cGVEZWYoc2hhcGVba2V5XS5kZWYuaW5uZXJUeXBlKX0sYDtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIGAke2tleX06ICR7em9kVHlwZVRvVHNUeXBlRGVmKHNoYXBlW2tleV0pfSxgO1xuICAgICAgICAgIH1cbiAgICAgICAgfSksXG4gICAgICAgIFwifVwiLFxuICAgICAgXS5qb2luKFwiXFxuXCIpO1xuICAgIH1cbiAgICBjYXNlIFwib3B0aW9uYWxcIjpcbiAgICAgIHJldHVybiBgJHt6b2RUeXBlVG9Uc1R5cGVEZWYoKHp0IGFzIEFueVpvZE9wdGlvbmFsKS5kZWYuaW5uZXJUeXBlKX0gfCB1bmRlZmluZWRgO1xuICAgIGRlZmF1bHQ6XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYOyymOumrOuQmOyngCDslYrsnYAgWm9kVHlwZSAke3p0LmRlZi50eXBlfWApO1xuICB9XG59XG5cbi8vIFRPRE8oSGF6ZSwgMjUxMDMxKTogXCJ0ZW1wbGF0ZV9saXRlcmFsXCIsIFwiZmlsZVwi7JeQIOuMgO2VnCDsp4Dsm5DsnbQg7ZWE7JqU7ZWoLlxuLyoqXG4gKiBab2Qg7YOA7J6FIOyduOyKpO2EtOyKpOulvCDtlbTri7ntlZjripQgWm9kIOy9lOuTnCDrrLjsnpDsl7TroZwg67OA7ZmY7ZWp64uI64ukLlxuICovXG5leHBvcnQgZnVuY3Rpb24gem9kVHlwZVRvWm9kQ29kZSh6dDogei5ab2RUeXBlKTogc3RyaW5nIHtcbiAgc3dpdGNoICh6dC5kZWYudHlwZSkge1xuICAgIGNhc2UgXCJzdHJpbmdcIjpcbiAgICAgIHJldHVybiBcInouc3RyaW5nKClcIjtcbiAgICBjYXNlIFwibnVtYmVyXCI6XG4gICAgICByZXR1cm4gXCJ6Lm51bWJlcigpXCI7XG4gICAgY2FzZSBcImJpZ2ludFwiOlxuICAgICAgcmV0dXJuIFwiei5iaWdpbnQoKVwiO1xuICAgIGNhc2UgXCJib29sZWFuXCI6XG4gICAgICByZXR1cm4gXCJ6LmJvb2xlYW4oKVwiO1xuICAgIGNhc2UgXCJkYXRlXCI6XG4gICAgICByZXR1cm4gXCJ6LmRhdGUoKVwiO1xuICAgIGNhc2UgXCJudWxsXCI6XG4gICAgICByZXR1cm4gXCJ6Lm51bGwoKVwiO1xuICAgIGNhc2UgXCJ1bmRlZmluZWRcIjpcbiAgICAgIHJldHVybiBcInoudW5kZWZpbmVkKClcIjtcbiAgICBjYXNlIFwiYW55XCI6XG4gICAgICByZXR1cm4gXCJ6LmFueSgpXCI7XG4gICAgY2FzZSBcInVua25vd25cIjpcbiAgICAgIHJldHVybiBcInoudW5rbm93bigpXCI7XG4gICAgY2FzZSBcIm5ldmVyXCI6XG4gICAgICByZXR1cm4gXCJ6Lm5ldmVyKClcIjtcbiAgICBjYXNlIFwibnVsbGFibGVcIjpcbiAgICAgIHJldHVybiBgJHt6b2RUeXBlVG9ab2RDb2RlKCh6dCBhcyBBbnlab2ROdWxsYWJsZSkuZGVmLmlubmVyVHlwZSl9Lm51bGxhYmxlKClgO1xuICAgIGNhc2UgXCJkZWZhdWx0XCI6IHtcbiAgICAgIGNvbnN0IHpEZWZhdWx0RGVmID0gKHp0IGFzIEFueVpvZERlZmF1bHQpLmRlZjtcbiAgICAgIHJldHVybiBgJHt6b2RUeXBlVG9ab2RDb2RlKHpEZWZhdWx0RGVmLmlubmVyVHlwZSl9LmRlZmF1bHQoJHt6RGVmYXVsdERlZi5kZWZhdWx0VmFsdWV9KWA7XG4gICAgfVxuICAgIGNhc2UgXCJyZWNvcmRcIjoge1xuICAgICAgY29uc3QgelJlY29yZERlZiA9ICh6dCBhcyBBbnlab2RSZWNvcmQpLmRlZjtcbiAgICAgIHJldHVybiBgei5yZWNvcmQoJHt6b2RUeXBlVG9ab2RDb2RlKHpSZWNvcmREZWYua2V5VHlwZSl9LCAke3pvZFR5cGVUb1pvZENvZGUoXG4gICAgICAgIHpSZWNvcmREZWYudmFsdWVUeXBlLFxuICAgICAgKX0pYDtcbiAgICB9XG4gICAgY2FzZSBcImxpdGVyYWxcIjoge1xuICAgICAgY29uc3QgaXRlbXMgPSBBcnJheS5mcm9tKCh6dCBhcyB6LlpvZExpdGVyYWw8c3RyaW5nIHwgbnVtYmVyPikudmFsdWVzKS5tYXAoKHZhbHVlKSA9PiB7XG4gICAgICAgIGlmICh0eXBlb2YgdmFsdWUgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgICByZXR1cm4gYFwiJHt2YWx1ZX1cImA7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodmFsdWUgPT09IG51bGwpIHtcbiAgICAgICAgICByZXR1cm4gYG51bGxgO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICByZXR1cm4gYHVuZGVmaW5lZGA7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gYCR7dmFsdWV9YDtcbiAgICAgIH0pO1xuXG4gICAgICBpZiAoaXRlbXMubGVuZ3RoID09PSAxKSB7XG4gICAgICAgIHJldHVybiBgei5saXRlcmFsKCR7aXRlbXNbMF19KWA7XG4gICAgICB9XG4gICAgICByZXR1cm4gYHoubGl0ZXJhbChbJHtpdGVtcy5qb2luKFwiLCBcIil9XSlgO1xuICAgIH1cbiAgICBjYXNlIFwidW5pb25cIjpcbiAgICAgIHJldHVybiBgei51bmlvbihbJHsoenQgYXMgQW55Wm9kVW5pb24pLmRlZi5vcHRpb25zXG4gICAgICAgIC5tYXAoKG9wdGlvbjogei5ab2RUeXBlKSA9PiB6b2RUeXBlVG9ab2RDb2RlKG9wdGlvbikpXG4gICAgICAgIC5qb2luKFwiLFwiKX1dKWA7XG4gICAgY2FzZSBcImVudW1cIjpcbiAgICAgIC8vIE5PVEU6IHouZW51bShbXCJBXCIsIFwiQlwiXSnrj4Qgei5lbnVtKHsgQTogXCJBXCIsIEI6IFwiQlwiIH0p66GcIOyymOumrOuQqC5cbiAgICAgIHJldHVybiBgei5lbnVtKHske09iamVjdC5lbnRyaWVzKCh6dCBhcyB6LlpvZEVudW0pLmRlZi5lbnRyaWVzKVxuICAgICAgICAubWFwKChba2V5LCB2YWxdKSA9PiAodHlwZW9mIHZhbCA9PT0gXCJzdHJpbmdcIiA/IGAke2tleX06IFwiJHt2YWx9XCJgIDogYCR7a2V5fTogJHt2YWx9YCkpXG4gICAgICAgIC5qb2luKFwiLCBcIil9fSlgO1xuICAgIGNhc2UgXCJhcnJheVwiOlxuICAgICAgcmV0dXJuIGB6LmFycmF5KCR7em9kVHlwZVRvWm9kQ29kZSgoenQgYXMgei5ab2RBcnJheTx6LlpvZFR5cGU+KS5kZWYuZWxlbWVudCl9KWA7XG4gICAgY2FzZSBcIm9iamVjdFwiOiB7XG4gICAgICBjb25zdCBzaGFwZSA9ICh6dCBhcyBBbnlab2RPYmplY3QpLnNoYXBlO1xuICAgICAgcmV0dXJuIFtcbiAgICAgICAgXCJ6Lm9iamVjdCh7XCIsXG4gICAgICAgIC4uLk9iamVjdC5rZXlzKHNoYXBlKS5tYXAoKGtleSkgPT4gYCR7a2V5fTogJHt6b2RUeXBlVG9ab2RDb2RlKHNoYXBlW2tleV0pfSxgKSxcbiAgICAgICAgXCJ9KVwiLFxuICAgICAgXS5qb2luKFwiXFxuXCIpO1xuICAgIH1cbiAgICBjYXNlIFwib3B0aW9uYWxcIjpcbiAgICAgIHJldHVybiBgJHt6b2RUeXBlVG9ab2RDb2RlKCh6dCBhcyB6LlpvZE9wdGlvbmFsPHouWm9kVHlwZT4pLmRlZi5pbm5lclR5cGUpfS5vcHRpb25hbCgpYDtcbiAgICBjYXNlIFwiZmlsZVwiOlxuICAgICAgcmV0dXJuIGB6LmZpbGUoKWA7XG4gICAgY2FzZSBcImludGVyc2VjdGlvblwiOiB7XG4gICAgICBjb25zdCB6SW50ZXJzZWN0aW9uRGVmID0gKHp0IGFzIHouWm9kSW50ZXJzZWN0aW9uPHouWm9kVHlwZSwgei5ab2RUeXBlPikuZGVmO1xuICAgICAgcmV0dXJuIGB6LmludGVyc2VjdGlvbigke3pvZFR5cGVUb1pvZENvZGUoekludGVyc2VjdGlvbkRlZi5sZWZ0KX0sICR7em9kVHlwZVRvWm9kQ29kZSh6SW50ZXJzZWN0aW9uRGVmLnJpZ2h0KX0pYDtcbiAgICB9XG4gICAgZGVmYXVsdDpcbiAgICAgIHRocm93IG5ldyBFcnJvcihg7LKY66as65CY7KeAIOyViuydgCBab2RUeXBlICR7enQuZGVmLnR5cGV9YCk7XG4gIH1cbn1cblxuLyoqXG4gKiBab2Qg7YOA7J6F7J2EIFVJIOugjOuNlOungeyXkCDsgqzsmqntlaAg7IiYIOyeiOuKlCBSZW5kZXJpbmdOb2Rl66GcIOuzgO2ZmO2VqeuLiOuLpC5cbiAqIOyerOq3gOyggeycvOuhnCDspJHssqnrkJwg7YOA7J6F65Ok7J2EIOyymOumrO2VqeuLiOuLpC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHpvZFR5cGVUb1JlbmRlcmluZ05vZGUoXG4gIHpvZFR5cGU6IHouWm9kVHlwZUFueSxcbiAgYmFzZUtleTogc3RyaW5nID0gXCJyb290XCIsXG4pOiBSZW5kZXJpbmdOb2RlIHtcbiAgY29uc3QgZGVmID0ge1xuICAgIG5hbWU6IGJhc2VLZXksXG4gICAgbGFiZWw6IGluZmxlY3Rpb24uY2FtZWxpemUoYmFzZUtleSwgZmFsc2UpLFxuICAgIHpvZFR5cGUsXG4gIH07XG4gIGlmICh6b2RUeXBlIGluc3RhbmNlb2Ygei5ab2RPYmplY3QpIHtcbiAgICBjb25zdCBjb2x1bW5LZXlzID0gT2JqZWN0LmtleXMoem9kVHlwZS5zaGFwZSk7XG4gICAgY29uc3QgY2hpbGRyZW4gPSBjb2x1bW5LZXlzLm1hcCgoa2V5KSA9PiB7XG4gICAgICBjb25zdCBpbm5lclR5cGUgPSB6b2RUeXBlLnNoYXBlW2tleV07XG4gICAgICByZXR1cm4gem9kVHlwZVRvUmVuZGVyaW5nTm9kZShpbm5lclR5cGUsIGtleSk7XG4gICAgfSk7XG4gICAgcmV0dXJuIHtcbiAgICAgIC4uLmRlZixcbiAgICAgIHJlbmRlclR5cGU6IFwib2JqZWN0XCIsXG4gICAgICBjaGlsZHJlbixcbiAgICB9O1xuICB9IGVsc2UgaWYgKHpvZFR5cGUgaW5zdGFuY2VvZiB6LlpvZEFycmF5KSB7XG4gICAgY29uc3QgaW5uZXJUeXBlID0gKHpvZFR5cGUgYXMgei5ab2RBcnJheTx6LlpvZFR5cGVBbnk+KS5kZWYuZWxlbWVudDtcbiAgICBpZiAoaW5uZXJUeXBlIGluc3RhbmNlb2Ygei5ab2RTdHJpbmcgJiYgYmFzZUtleS5pbmNsdWRlcyhcImltYWdlc1wiKSkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgLi4uZGVmLFxuICAgICAgICByZW5kZXJUeXBlOiBcImFycmF5LWltYWdlc1wiLFxuICAgICAgfTtcbiAgICB9XG4gICAgcmV0dXJuIHtcbiAgICAgIC4uLmRlZixcbiAgICAgIHJlbmRlclR5cGU6IFwiYXJyYXlcIixcbiAgICAgIGVsZW1lbnQ6IHpvZFR5cGVUb1JlbmRlcmluZ05vZGUoaW5uZXJUeXBlLCBiYXNlS2V5KSxcbiAgICB9O1xuICB9IGVsc2UgaWYgKHpvZFR5cGUgaW5zdGFuY2VvZiB6LlpvZFVuaW9uKSB7XG4gICAgY29uc3Qgb3B0aW9uTm9kZXMgPSAoem9kVHlwZSBhcyB6LlpvZFVuaW9uPHouWm9kVHlwZVtdPikuZGVmLm9wdGlvbnMubWFwKChvcHQpID0+XG4gICAgICB6b2RUeXBlVG9SZW5kZXJpbmdOb2RlKG9wdCwgYmFzZUtleSksXG4gICAgKTtcbiAgICAvLyBUT0RPOiBab2RVbmlvbuydtCDrk6TslrTsnojripQg6rK97JqwIO2VuOuTpOungVxuICAgIHJldHVybiBvcHRpb25Ob2Rlc1swXTtcbiAgfSBlbHNlIGlmICh6b2RUeXBlIGluc3RhbmNlb2Ygei5ab2RPcHRpb25hbCkge1xuICAgIHJldHVybiB7XG4gICAgICAuLi56b2RUeXBlVG9SZW5kZXJpbmdOb2RlKCh6b2RUeXBlIGFzIHouWm9kT3B0aW9uYWw8ei5ab2RUeXBlPikuZGVmLmlubmVyVHlwZSwgYmFzZUtleSksXG4gICAgICBvcHRpb25hbDogdHJ1ZSxcbiAgICB9O1xuICB9IGVsc2UgaWYgKHpvZFR5cGUgaW5zdGFuY2VvZiB6LlpvZE51bGxhYmxlKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIC4uLnpvZFR5cGVUb1JlbmRlcmluZ05vZGUoKHpvZFR5cGUgYXMgei5ab2ROdWxsYWJsZTx6LlpvZFR5cGU+KS5kZWYuaW5uZXJUeXBlLCBiYXNlS2V5KSxcbiAgICAgIG51bGxhYmxlOiB0cnVlLFxuICAgIH07XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIC4uLmRlZixcbiAgICAgIHJlbmRlclR5cGU6IHJlc29sdmVSZW5kZXJUeXBlKGJhc2VLZXksIHpvZFR5cGUpLFxuICAgIH07XG4gIH1cbn1cblxuLyoqXG4gKiBab2Qg7YOA7J6F6rO8IO2CpCDsnbTrpoTsnLzroZzrtoDthLAg7KCB7KCI7ZWcIFJlbmRlclR5cGXsnYQg6rKw7KCV7ZWp64uI64ukLlxuICovXG5mdW5jdGlvbiByZXNvbHZlUmVuZGVyVHlwZShrZXk6IHN0cmluZywgem9kVHlwZTogei5ab2RUeXBlQW55KTogUmVuZGVyaW5nTm9kZVtcInJlbmRlclR5cGVcIl0ge1xuICBpZiAoem9kVHlwZSBpbnN0YW5jZW9mIHouWm9kRGF0ZSkge1xuICAgIHJldHVybiBcImRhdGV0aW1lXCI7XG4gIH0gZWxzZSBpZiAoem9kVHlwZSBpbnN0YW5jZW9mIHouWm9kU3RyaW5nKSB7XG4gICAgaWYgKGtleS5pbmNsdWRlcyhcImltZ1wiKSB8fCBrZXkuaW5jbHVkZXMoXCJpbWFnZVwiKSkge1xuICAgICAgcmV0dXJuIFwic3RyaW5nLWltYWdlXCI7XG4gICAgfSBlbHNlIGlmICh6b2RUeXBlLmRlc2NyaXB0aW9uID09PSBcIlNRTERhdGVUaW1lU3RyaW5nXCIpIHtcbiAgICAgIHJldHVybiBcInN0cmluZy1kYXRldGltZVwiO1xuICAgIH0gZWxzZSBpZiAoa2V5LmVuZHNXaXRoKFwiZGF0ZVwiKSkge1xuICAgICAgcmV0dXJuIFwic3RyaW5nLWRhdGVcIjtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIFwic3RyaW5nLXBsYWluXCI7XG4gICAgfVxuICB9IGVsc2UgaWYgKHpvZFR5cGUgaW5zdGFuY2VvZiB6LlpvZE51bWJlcikge1xuICAgIGlmIChrZXkgPT09IFwiaWRcIikge1xuICAgICAgcmV0dXJuIFwibnVtYmVyLWlkXCI7XG4gICAgfSBlbHNlIGlmIChrZXkuZW5kc1dpdGgoXCJfaWRcIikpIHtcbiAgICAgIHJldHVybiBcIm51bWJlci1ma19pZFwiO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gXCJudW1iZXItcGxhaW5cIjtcbiAgICB9XG4gIH0gZWxzZSBpZiAoem9kVHlwZSBpbnN0YW5jZW9mIHouWm9kQm9vbGVhbikge1xuICAgIHJldHVybiBcImJvb2xlYW5cIjtcbiAgfSBlbHNlIGlmICh6b2RUeXBlIGluc3RhbmNlb2Ygei5ab2RFbnVtKSB7XG4gICAgcmV0dXJuIFwiZW51bXNcIjtcbiAgfSBlbHNlIGlmICh6b2RUeXBlIGluc3RhbmNlb2Ygei5ab2RSZWNvcmQpIHtcbiAgICByZXR1cm4gXCJyZWNvcmRcIjtcbiAgfSBlbHNlIGlmICh6b2RUeXBlIGluc3RhbmNlb2Ygei5ab2RBbnkgfHwgem9kVHlwZSBpbnN0YW5jZW9mIHouWm9kVW5rbm93bikge1xuICAgIHJldHVybiBcInN0cmluZy1wbGFpblwiO1xuICB9IGVsc2UgaWYgKHpvZFR5cGUgaW5zdGFuY2VvZiB6LlpvZFVuaW9uKSB7XG4gICAgcmV0dXJuIFwic3RyaW5nLXBsYWluXCI7XG4gIH0gZWxzZSBpZiAoem9kVHlwZSBpbnN0YW5jZW9mIHouWm9kTGl0ZXJhbCkge1xuICAgIHJldHVybiBcInN0cmluZy1wbGFpblwiO1xuICB9IGVsc2Uge1xuICAgIHRocm93IG5ldyBFcnJvcihg7YOA7J6FIO2MjOyLsSDrtojqsIAgJHtrZXl9ICR7em9kVHlwZS5kZWYudHlwZX1gKTtcbiAgfVxufVxuIl0sIm5hbWVzIjpbImluZmxlY3Rpb24iLCJwYXRoIiwieiIsIlNvbmFtdSIsIkVudGl0eU1hbmFnZXIiLCJpc0JlbG9uZ3NUb09uZVJlbGF0aW9uUHJvcCIsImlzQmlnSW50ZWdlckFycmF5UHJvcCIsImlzQmlnSW50ZWdlclNpbmdsZVByb3AiLCJpc0Jvb2xlYW5BcnJheVByb3AiLCJpc0Jvb2xlYW5TaW5nbGVQcm9wIiwiaXNEYXRlQXJyYXlQcm9wIiwiaXNEYXRlU2luZ2xlUHJvcCIsImlzRW51bUFycmF5UHJvcCIsImlzRW51bVNpbmdsZVByb3AiLCJpc0ludGVnZXJBcnJheVByb3AiLCJpc0ludGVnZXJTaW5nbGVQcm9wIiwiaXNKc29uUHJvcCIsImlzTnVtYmVyQXJyYXlQcm9wIiwiaXNOdW1iZXJTaW5nbGVQcm9wIiwiaXNOdW1lcmljQXJyYXlQcm9wIiwiaXNOdW1lcmljU2luZ2xlUHJvcCIsImlzT25lVG9PbmVSZWxhdGlvblByb3AiLCJpc1JlbGF0aW9uUHJvcCIsImlzU3RyaW5nQXJyYXlQcm9wIiwiaXNTdHJpbmdTaW5nbGVQcm9wIiwiaXNVdWlkQXJyYXlQcm9wIiwiaXNVdWlkU2luZ2xlUHJvcCIsImlzVmlydHVhbFByb3AiLCJjcmVhdGVJbXBvcnRVcmwiLCJnZXRab2RUeXBlQnlJZCIsInpvZFR5cGVJZCIsIm1vZHVsZVBhdGgiLCJnZXRNb2R1bGVQYXRoIiwibW9kdWxlQWJzUGF0aCIsImpvaW4iLCJhcGlSb290UGF0aCIsImltcG9ydFVybCIsImltcG9ydGVkIiwiRXJyb3IiLCJkZXNjcmliZSIsInByb3BUb1pvZFR5cGUiLCJwcm9wIiwiem9kVHlwZSIsInVua25vd24iLCJudW1iZXIiLCJpbnQiLCJhcnJheSIsImJpZ2ludCIsImlkIiwibGVuZ3RoIiwic3RyaW5nIiwibWF4IiwiYm9vbGVhbiIsImRhdGUiLCJ1dWlkIiwiaGFzSm9pbkNvbHVtbiIsInVuc2lnbmVkIiwibm9ubmVnYXRpdmUiLCJudWxsYWJsZSIsInByb3BUb1pvZFR5cGVEZWYiLCJpbmplY3RJbXBvcnRLZXlzIiwic3RtdCIsIm5hbWUiLCJwdXNoIiwicmVsYXRpb25UeXBlIiwid2l0aCIsInByb3BOb2RlVG9ab2RUeXBlRGVmIiwicHJvcE5vZGUiLCJub2RlVHlwZSIsImNoaWxkcmVuIiwibWFwIiwiY2hpbGRQcm9wTm9kZSIsInpvZFR5cGVUb1RzVHlwZURlZiIsInp0IiwiZGVmIiwidHlwZSIsImlubmVyVHlwZSIsInJlY29yZFR5cGUiLCJrZXlUeXBlIiwidmFsdWVUeXBlIiwiQXJyYXkiLCJmcm9tIiwidmFsdWVzIiwidmFsdWUiLCJ1bmRlZmluZWQiLCJvcHRpb25zIiwib3B0aW9uIiwidmFsIiwiZWxlbWVudCIsInNoYXBlIiwiT2JqZWN0Iiwia2V5cyIsImtleSIsInpvZFR5cGVUb1pvZENvZGUiLCJ6RGVmYXVsdERlZiIsImRlZmF1bHRWYWx1ZSIsInpSZWNvcmREZWYiLCJpdGVtcyIsImVudHJpZXMiLCJ6SW50ZXJzZWN0aW9uRGVmIiwibGVmdCIsInJpZ2h0Iiwiem9kVHlwZVRvUmVuZGVyaW5nTm9kZSIsImJhc2VLZXkiLCJsYWJlbCIsImNhbWVsaXplIiwiWm9kT2JqZWN0IiwiY29sdW1uS2V5cyIsInJlbmRlclR5cGUiLCJab2RBcnJheSIsIlpvZFN0cmluZyIsImluY2x1ZGVzIiwiWm9kVW5pb24iLCJvcHRpb25Ob2RlcyIsIm9wdCIsIlpvZE9wdGlvbmFsIiwib3B0aW9uYWwiLCJab2ROdWxsYWJsZSIsInJlc29sdmVSZW5kZXJUeXBlIiwiWm9kRGF0ZSIsImRlc2NyaXB0aW9uIiwiZW5kc1dpdGgiLCJab2ROdW1iZXIiLCJab2RCb29sZWFuIiwiWm9kRW51bSIsIlpvZFJlY29yZCIsIlpvZEFueSIsIlpvZFVua25vd24iLCJab2RMaXRlcmFsIl0sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7O0NBa0JDLEdBRUQsT0FBT0EsZ0JBQWdCLGFBQWE7QUFDcEMsT0FBT0MsVUFBVSxPQUFPO0FBQ3hCLFNBQVNDLENBQUMsUUFBUSxNQUFNO0FBRXhCLFNBQVNDLE1BQU0sUUFBUSxtQkFBZ0I7QUFDdkMsU0FBU0MsYUFBYSxRQUFRLDhCQUEyQjtBQUN6RCxTQUdFQywwQkFBMEIsRUFDMUJDLHFCQUFxQixFQUNyQkMsc0JBQXNCLEVBQ3RCQyxrQkFBa0IsRUFDbEJDLG1CQUFtQixFQUNuQkMsZUFBZSxFQUNmQyxnQkFBZ0IsRUFDaEJDLGVBQWUsRUFDZkMsZ0JBQWdC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
@@ -1,4 +1,4 @@
1
- import { FixtureRecord } from "../types/types";
1
+ import type { FixtureRecord } from "../types/types";
2
2
  export declare class RelationGraph {
3
3
  private graph;
4
4
  buildGraph(fixtures: FixtureRecord[]): void;
@@ -1 +1 @@
1
- {"version":3,"file":"_relation-graph.d.ts","sourceRoot":"","sources":["../../src/testing/_relation-graph.ts"],"names":[],"mappings":"AAAA,OAAO,EAA4B,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAUzE,qBAAa,aAAa;IACxB,OAAO,CAAC,KAAK,CAAwC;IAErD,UAAU,CAAC,QAAQ,EAAE,aAAa,EAAE,GAAG,IAAI;IA8C3C,iBAAiB,IAAI,MAAM,EAAE;CAmD9B"}
1
+ {"version":3,"file":"_relation-graph.d.ts","sourceRoot":"","sources":["../../src/testing/_relation-graph.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAc,aAAa,EAAgB,MAAM,gBAAgB,CAAC;AAS9E,qBAAa,aAAa;IACxB,OAAO,CAAC,KAAK,CAAwC;IAErD,UAAU,CAAC,QAAQ,EAAE,aAAa,EAAE,GAAG,IAAI;IA+C3C,iBAAiB,IAAI,MAAM,EAAE;CAyD9B"}
@@ -1,5 +1,5 @@
1
1
  import { EntityManager } from "../entity/entity-manager.js";
2
- import { isRelationProp, isBelongsToOneRelationProp, isOneToOneRelationProp, isManyToManyRelationProp } from "../types/types.js";
2
+ import { isBelongsToOneRelationProp, isManyToManyRelationProp, isOneToOneRelationProp, isRelationProp } from "../types/types.js";
3
3
  // 관계 그래프 처리를 별도 클래스로 분리
4
4
  export class RelationGraph {
5
5
  graph = new Map();
@@ -16,6 +16,9 @@ export class RelationGraph {
16
16
  // 2. 의존성 추가
17
17
  for (const fixture of fixtures){
18
18
  const node = this.graph.get(fixture.fixtureId);
19
+ if (node === undefined) {
20
+ throw new Error(`Node not found for fixture ${fixture.fixtureId}`);
21
+ }
19
22
  for (const [, column] of Object.entries(fixture.columns)){
20
23
  const prop = column.prop;
21
24
  if (isRelationProp(prop)) {
@@ -31,7 +34,7 @@ export class RelationGraph {
31
34
  const relatedFixtureId = `${prop.with}#${relatedId}`;
32
35
  if (this.graph.has(relatedFixtureId)) {
33
36
  node.related.add(relatedFixtureId);
34
- this.graph.get(relatedFixtureId).related.add(fixture.fixtureId);
37
+ this.graph.get(relatedFixtureId)?.related.add(fixture.fixtureId);
35
38
  }
36
39
  }
37
40
  }
@@ -51,9 +54,15 @@ export class RelationGraph {
51
54
  }
52
55
  tempVisited.add(fixtureId);
53
56
  const node = this.graph.get(fixtureId);
57
+ if (node === undefined) {
58
+ throw new Error(`Node not found for fixture ${fixtureId}`);
59
+ }
54
60
  const entity = EntityManager.get(node.entityId);
55
61
  for (const depId of node.related){
56
62
  const depNode = this.graph.get(depId);
63
+ if (depNode === undefined) {
64
+ throw new Error(`Node not found for fixture ${depId}`);
65
+ }
57
66
  // BelongsToOne 관계이면서 nullable이 아닌 경우 먼저 방문
58
67
  const relationProp = entity.props.find((prop)=>isRelationProp(prop) && (isBelongsToOneRelationProp(prop) || isOneToOneRelationProp(prop) && prop.hasJoinColumn) && prop.with === depNode.entityId);
59
68
  if (relationProp && !relationProp.nullable) {
@@ -77,4 +86,4 @@ export class RelationGraph {
77
86
  }
78
87
  }
79
88
 
80
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy90ZXN0aW5nL19yZWxhdGlvbi1ncmFwaC50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBSZWxhdGlvbk5vZGUsIEVudGl0eVByb3AsIEZpeHR1cmVSZWNvcmQgfSBmcm9tIFwiLi4vdHlwZXMvdHlwZXNcIjtcbmltcG9ydCB7IEVudGl0eU1hbmFnZXIgfSBmcm9tIFwiLi4vZW50aXR5L2VudGl0eS1tYW5hZ2VyXCI7XG5pbXBvcnQge1xuICBpc1JlbGF0aW9uUHJvcCxcbiAgaXNCZWxvbmdzVG9PbmVSZWxhdGlvblByb3AsXG4gIGlzT25lVG9PbmVSZWxhdGlvblByb3AsXG4gIGlzTWFueVRvTWFueVJlbGF0aW9uUHJvcCxcbn0gZnJvbSBcIi4uL3R5cGVzL3R5cGVzXCI7XG5cbi8vIOq0gOqzhCDqt7jrnpjtlIQg7LKY66as66W8IOuzhOuPhCDtgbTrnpjsiqTroZwg67aE66asXG5leHBvcnQgY2xhc3MgUmVsYXRpb25HcmFwaCB7XG4gIHByaXZhdGUgZ3JhcGg6IE1hcDxzdHJpbmcsIFJlbGF0aW9uTm9kZT4gPSBuZXcgTWFwKCk7XG5cbiAgYnVpbGRHcmFwaChmaXh0dXJlczogRml4dHVyZVJlY29yZFtdKTogdm9pZCB7XG4gICAgdGhpcy5ncmFwaC5jbGVhcigpO1xuXG4gICAgLy8gMS4g64W465OcIOy2lOqwgFxuICAgIGZvciAoY29uc3QgZml4dHVyZSBvZiBmaXh0dXJlcykge1xuICAgICAgdGhpcy5ncmFwaC5zZXQoZml4dHVyZS5maXh0dXJlSWQsIHtcbiAgICAgICAgZml4dHVyZUlkOiBmaXh0dXJlLmZpeHR1cmVJZCxcbiAgICAgICAgZW50aXR5SWQ6IGZpeHR1cmUuZW50aXR5SWQsXG4gICAgICAgIHJlbGF0ZWQ6IG5ldyBTZXQoKSxcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIC8vIDIuIOydmOyhtOyEsSDstpTqsIBcbiAgICBmb3IgKGNvbnN0IGZpeHR1cmUgb2YgZml4dHVyZXMpIHtcbiAgICAgIGNvbnN0IG5vZGUgPSB0aGlzLmdyYXBoLmdldChmaXh0dXJlLmZpeHR1cmVJZCkhO1xuXG4gICAgICBmb3IgKGNvbnN0IFssIGNvbHVtbl0gb2YgT2JqZWN0LmVudHJpZXMoZml4dHVyZS5jb2x1bW5zKSkge1xuICAgICAgICBjb25zdCBwcm9wID0gY29sdW1uLnByb3AgYXMgRW50aXR5UHJvcDtcblxuICAgICAgICBpZiAoaXNSZWxhdGlvblByb3AocHJvcCkpIHtcbiAgICAgICAgICBpZiAoXG4gICAgICAgICAgICBpc0JlbG9uZ3NUb09uZVJlbGF0aW9uUHJvcChwcm9wKSB8fFxuICAgICAgICAgICAgKGlzT25lVG9PbmVSZWxhdGlvblByb3AocHJvcCkgJiYgcHJvcC5oYXNKb2luQ29sdW1uKVxuICAgICAgICAgICkge1xuICAgICAgICAgICAgY29uc3QgcmVsYXRlZEZpeHR1cmVJZCA9IGAke3Byb3Aud2l0aH0jJHtjb2x1bW4udmFsdWV9YDtcbiAgICAgICAgICAgIGlmICh0aGlzLmdyYXBoLmhhcyhyZWxhdGVkRml4dHVyZUlkKSkge1xuICAgICAgICAgICAgICBub2RlLnJlbGF0ZWQuYWRkKHJlbGF0ZWRGaXh0dXJlSWQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSBpZiAoaXNNYW55VG9NYW55UmVsYXRpb25Qcm9wKHByb3ApKSB7XG4gICAgICAgICAgICAvLyBNYW55VG9NYW55IOq0gOqzhOydmCDqsr3smrAg7JaR67Cp7ZalIOydmOyhtOyEsSDstpTqsIBcbiAgICAgICAgICAgIGNvbnN0IHJlbGF0ZWRJZHMgPSBjb2x1bW4udmFsdWUgYXMgbnVtYmVyW107XG4gICAgICAgICAgICBmb3IgKGNvbnN0IHJlbGF0ZWRJZCBvZiByZWxhdGVkSWRzKSB7XG4gICAgICAgICAgICAgIGNvbnN0IHJlbGF0ZWRGaXh0dXJlSWQgPSBgJHtwcm9wLndpdGh9IyR7cmVsYXRlZElkfWA7XG4gICAgICAgICAgICAgIGlmICh0aGlzLmdyYXBoLmhhcyhyZWxhdGVkRml4dHVyZUlkKSkge1xuICAgICAgICAgICAgICAgIG5vZGUucmVsYXRlZC5hZGQocmVsYXRlZEZpeHR1cmVJZCk7XG4gICAgICAgICAgICAgICAgdGhpcy5ncmFwaFxuICAgICAgICAgICAgICAgICAgLmdldChyZWxhdGVkRml4dHVyZUlkKSFcbiAgICAgICAgICAgICAgICAgIC5yZWxhdGVkLmFkZChmaXh0dXJlLmZpeHR1cmVJZCk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBnZXRJbnNlcnRpb25PcmRlcigpOiBzdHJpbmdbXSB7XG4gICAgY29uc3QgdmlzaXRlZCA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuICAgIGNvbnN0IG9yZGVyOiBzdHJpbmdbXSA9IFtdO1xuICAgIGNvbnN0IHRlbXBWaXNpdGVkID0gbmV3IFNldDxzdHJpbmc+KCk7XG5cbiAgICBjb25zdCB2aXNpdCA9IChmaXh0dXJlSWQ6IHN0cmluZykgPT4ge1xuICAgICAgaWYgKHZpc2l0ZWQuaGFzKGZpeHR1cmVJZCkpIHJldHVybjtcbiAgICAgIGlmICh0ZW1wVmlzaXRlZC5oYXMoZml4dHVyZUlkKSkge1xuICAgICAgICBjb25zb2xlLndhcm4oYENpcmN1bGFyIGRlcGVuZGVuY3kgZGV0ZWN0ZWQgaW52b2x2aW5nOiAke2ZpeHR1cmVJZH1gKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICB0ZW1wVmlzaXRlZC5hZGQoZml4dHVyZUlkKTtcblxuICAgICAgY29uc3Qgbm9kZSA9IHRoaXMuZ3JhcGguZ2V0KGZpeHR1cmVJZCkhO1xuICAgICAgY29uc3QgZW50aXR5ID0gRW50aXR5TWFuYWdlci5nZXQobm9kZS5lbnRpdHlJZCk7XG5cbiAgICAgIGZvciAoY29uc3QgZGVwSWQgb2Ygbm9kZS5yZWxhdGVkKSB7XG4gICAgICAgIGNvbnN0IGRlcE5vZGUgPSB0aGlzLmdyYXBoLmdldChkZXBJZCkhO1xuXG4gICAgICAgIC8vIEJlbG9uZ3NUb09uZSDqtIDqs4TsnbTrqbTshJwgbnVsbGFibGXsnbQg7JWE64uMIOqyveyasCDrqLzsoIAg67Cp66y4XG4gICAgICAgIGNvbnN0IHJlbGF0aW9uUHJvcCA9IGVudGl0eS5wcm9wcy5maW5kKFxuICAgICAgICAgIChwcm9wKSA9PlxuICAgICAgICAgICAgaXNSZWxhdGlvblByb3AocHJvcCkgJiZcbiAgICAgICAgICAgIChpc0JlbG9uZ3NUb09uZVJlbGF0aW9uUHJvcChwcm9wKSB8fFxuICAgICAgICAgICAgICAoaXNPbmVUb09uZVJlbGF0aW9uUHJvcChwcm9wKSAmJiBwcm9wLmhhc0pvaW5Db2x1bW4pKSAmJlxuICAgICAgICAgICAgcHJvcC53aXRoID09PSBkZXBOb2RlLmVudGl0eUlkXG4gICAgICAgICk7XG4gICAgICAgIGlmIChyZWxhdGlvblByb3AgJiYgIXJlbGF0aW9uUHJvcC5udWxsYWJsZSkge1xuICAgICAgICAgIHZpc2l0KGRlcElkKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICB0ZW1wVmlzaXRlZC5kZWxldGUoZml4dHVyZUlkKTtcbiAgICAgIHZpc2l0ZWQuYWRkKGZpeHR1cmVJZCk7XG4gICAgICBvcmRlci5wdXNoKGZpeHR1cmVJZCk7XG4gICAgfTtcblxuICAgIGZvciAoY29uc3QgZml4dHVyZUlkIG9mIHRoaXMuZ3JhcGgua2V5cygpKSB7XG4gICAgICB2aXNpdChmaXh0dXJlSWQpO1xuICAgIH1cblxuICAgIC8vIGNpcmN1bGFyIGRlcGVuZGVuY3nroZwg7J247ZW0IOuwqeusuOuQmOyngCDslYrsnYAgZml4dHVyZUlkIOy2lOqwgFxuICAgIGZvciAoY29uc3QgZml4dHVyZUlkIG9mIHRoaXMuZ3JhcGgua2V5cygpKSB7XG4gICAgICBpZiAoIXZpc2l0ZWQuaGFzKGZpeHR1cmVJZCkpIHtcbiAgICAgICAgb3JkZXIucHVzaChmaXh0dXJlSWQpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBvcmRlcjtcbiAgfVxufVxuIl0sIm5hbWVzIjpbIkVudGl0eU1hbmFnZXIiLCJpc1JlbGF0aW9uUHJvcCIsImlzQmVsb25nc1RvT25lUmVsYXRpb25Qcm9wIiwiaXNPbmVUb09uZVJlbGF0aW9uUHJvcCIsImlzTWFueVRvTWFueVJlbGF0aW9uUHJvcCIsIlJlbGF0aW9uR3JhcGgiLCJncmFwaCIsIk1hcCIsImJ1aWxkR3JhcGgiLCJmaXh0dXJlcyIsImNsZWFyIiwiZml4dHVyZSIsInNldCIsImZpeHR1cmVJZCIsImVudGl0eUlkIiwicmVsYXRlZCIsIlNldCIsIm5vZGUiLCJnZXQiLCJjb2x1bW4iLCJPYmplY3QiLCJlbnRyaWVzIiwiY29sdW1ucyIsInByb3AiLCJoYXNKb2luQ29sdW1uIiwicmVsYXRlZEZpeHR1cmVJZCIsIndpdGgiLCJ2YWx1ZSIsImhhcyIsImFkZCIsInJlbGF0ZWRJZHMiLCJyZWxhdGVkSWQiLCJnZXRJbnNlcnRpb25PcmRlciIsInZpc2l0ZWQiLCJvcmRlciIsInRlbXBWaXNpdGVkIiwidmlzaXQiLCJjb25zb2xlIiwid2FybiIsImVudGl0eSIsImRlcElkIiwiZGVwTm9kZSIsInJlbGF0aW9uUHJvcCIsInByb3BzIiwiZmluZCIsIm51bGxhYmxlIiwiZGVsZXRlIiwicHVzaCIsImtleXMiXSwibWFwcGluZ3MiOiJBQUNBLFNBQVNBLGFBQWEsUUFBUSw4QkFBMkI7QUFDekQsU0FDRUMsY0FBYyxFQUNkQywwQkFBMEIsRUFDMUJDLHNCQUFzQixFQUN0QkMsd0JBQXdCLFFBQ25CLG9CQUFpQjtBQUV4Qix3QkFBd0I7QUFDeEIsT0FBTyxNQUFNQztJQUNIQyxRQUFtQyxJQUFJQyxNQUFNO0lBRXJEQyxXQUFXQyxRQUF5QixFQUFRO1FBQzFDLElBQUksQ0FBQ0gsS0FBSyxDQUFDSSxLQUFLO1FBRWhCLFdBQVc7UUFDWCxLQUFLLE1BQU1DLFdBQVdGLFNBQVU7WUFDOUIsSUFBSSxDQUFDSCxLQUFLLENBQUNNLEdBQUcsQ0FBQ0QsUUFBUUUsU0FBUyxFQUFFO2dCQUNoQ0EsV0FBV0YsUUFBUUUsU0FBUztnQkFDNUJDLFVBQVVILFFBQVFHLFFBQVE7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
89
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy90ZXN0aW5nL19yZWxhdGlvbi1ncmFwaC50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBFbnRpdHlNYW5hZ2VyIH0gZnJvbSBcIi4uL2VudGl0eS9lbnRpdHktbWFuYWdlclwiO1xuaW1wb3J0IHR5cGUgeyBFbnRpdHlQcm9wLCBGaXh0dXJlUmVjb3JkLCBSZWxhdGlvbk5vZGUgfSBmcm9tIFwiLi4vdHlwZXMvdHlwZXNcIjtcbmltcG9ydCB7XG4gIGlzQmVsb25nc1RvT25lUmVsYXRpb25Qcm9wLFxuICBpc01hbnlUb01hbnlSZWxhdGlvblByb3AsXG4gIGlzT25lVG9PbmVSZWxhdGlvblByb3AsXG4gIGlzUmVsYXRpb25Qcm9wLFxufSBmcm9tIFwiLi4vdHlwZXMvdHlwZXNcIjtcblxuLy8g6rSA6rOEIOq3uOuemO2UhCDsspjrpqzrpbwg67OE64+EIO2BtOuemOyKpOuhnCDrtoTrpqxcbmV4cG9ydCBjbGFzcyBSZWxhdGlvbkdyYXBoIHtcbiAgcHJpdmF0ZSBncmFwaDogTWFwPHN0cmluZywgUmVsYXRpb25Ob2RlPiA9IG5ldyBNYXAoKTtcblxuICBidWlsZEdyYXBoKGZpeHR1cmVzOiBGaXh0dXJlUmVjb3JkW10pOiB2b2lkIHtcbiAgICB0aGlzLmdyYXBoLmNsZWFyKCk7XG5cbiAgICAvLyAxLiDrhbjrk5wg7LaU6rCAXG4gICAgZm9yIChjb25zdCBmaXh0dXJlIG9mIGZpeHR1cmVzKSB7XG4gICAgICB0aGlzLmdyYXBoLnNldChmaXh0dXJlLmZpeHR1cmVJZCwge1xuICAgICAgICBmaXh0dXJlSWQ6IGZpeHR1cmUuZml4dHVyZUlkLFxuICAgICAgICBlbnRpdHlJZDogZml4dHVyZS5lbnRpdHlJZCxcbiAgICAgICAgcmVsYXRlZDogbmV3IFNldCgpLFxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgLy8gMi4g7J2Y7KG07ISxIOy2lOqwgFxuICAgIGZvciAoY29uc3QgZml4dHVyZSBvZiBmaXh0dXJlcykge1xuICAgICAgY29uc3Qgbm9kZSA9IHRoaXMuZ3JhcGguZ2V0KGZpeHR1cmUuZml4dHVyZUlkKTtcbiAgICAgIGlmIChub2RlID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBOb2RlIG5vdCBmb3VuZCBmb3IgZml4dHVyZSAke2ZpeHR1cmUuZml4dHVyZUlkfWApO1xuICAgICAgfVxuXG4gICAgICBmb3IgKGNvbnN0IFssIGNvbHVtbl0gb2YgT2JqZWN0LmVudHJpZXMoZml4dHVyZS5jb2x1bW5zKSkge1xuICAgICAgICBjb25zdCBwcm9wID0gY29sdW1uLnByb3AgYXMgRW50aXR5UHJvcDtcblxuICAgICAgICBpZiAoaXNSZWxhdGlvblByb3AocHJvcCkpIHtcbiAgICAgICAgICBpZiAoXG4gICAgICAgICAgICBpc0JlbG9uZ3NUb09uZVJlbGF0aW9uUHJvcChwcm9wKSB8fFxuICAgICAgICAgICAgKGlzT25lVG9PbmVSZWxhdGlvblByb3AocHJvcCkgJiYgcHJvcC5oYXNKb2luQ29sdW1uKVxuICAgICAgICAgICkge1xuICAgICAgICAgICAgY29uc3QgcmVsYXRlZEZpeHR1cmVJZCA9IGAke3Byb3Aud2l0aH0jJHtjb2x1bW4udmFsdWV9YDtcbiAgICAgICAgICAgIGlmICh0aGlzLmdyYXBoLmhhcyhyZWxhdGVkRml4dHVyZUlkKSkge1xuICAgICAgICAgICAgICBub2RlLnJlbGF0ZWQuYWRkKHJlbGF0ZWRGaXh0dXJlSWQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSBpZiAoaXNNYW55VG9NYW55UmVsYXRpb25Qcm9wKHByb3ApKSB7XG4gICAgICAgICAgICAvLyBNYW55VG9NYW55IOq0gOqzhOydmCDqsr3smrAg7JaR67Cp7ZalIOydmOyhtOyEsSDstpTqsIBcbiAgICAgICAgICAgIGNvbnN0IHJlbGF0ZWRJZHMgPSBjb2x1bW4udmFsdWUgYXMgdW5rbm93biBhcyBudW1iZXJbXTtcbiAgICAgICAgICAgIGZvciAoY29uc3QgcmVsYXRlZElkIG9mIHJlbGF0ZWRJZHMpIHtcbiAgICAgICAgICAgICAgY29uc3QgcmVsYXRlZEZpeHR1cmVJZCA9IGAke3Byb3Aud2l0aH0jJHtyZWxhdGVkSWR9YDtcbiAgICAgICAgICAgICAgaWYgKHRoaXMuZ3JhcGguaGFzKHJlbGF0ZWRGaXh0dXJlSWQpKSB7XG4gICAgICAgICAgICAgICAgbm9kZS5yZWxhdGVkLmFkZChyZWxhdGVkRml4dHVyZUlkKTtcbiAgICAgICAgICAgICAgICB0aGlzLmdyYXBoLmdldChyZWxhdGVkRml4dHVyZUlkKT8ucmVsYXRlZC5hZGQoZml4dHVyZS5maXh0dXJlSWQpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgZ2V0SW5zZXJ0aW9uT3JkZXIoKTogc3RyaW5nW10ge1xuICAgIGNvbnN0IHZpc2l0ZWQgPSBuZXcgU2V0PHN0cmluZz4oKTtcbiAgICBjb25zdCBvcmRlcjogc3RyaW5nW10gPSBbXTtcbiAgICBjb25zdCB0ZW1wVmlzaXRlZCA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuXG4gICAgY29uc3QgdmlzaXQgPSAoZml4dHVyZUlkOiBzdHJpbmcpID0+IHtcbiAgICAgIGlmICh2aXNpdGVkLmhhcyhmaXh0dXJlSWQpKSByZXR1cm47XG4gICAgICBpZiAodGVtcFZpc2l0ZWQuaGFzKGZpeHR1cmVJZCkpIHtcbiAgICAgICAgY29uc29sZS53YXJuKGBDaXJjdWxhciBkZXBlbmRlbmN5IGRldGVjdGVkIGludm9sdmluZzogJHtmaXh0dXJlSWR9YCk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgdGVtcFZpc2l0ZWQuYWRkKGZpeHR1cmVJZCk7XG5cbiAgICAgIGNvbnN0IG5vZGUgPSB0aGlzLmdyYXBoLmdldChmaXh0dXJlSWQpO1xuICAgICAgaWYgKG5vZGUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYE5vZGUgbm90IGZvdW5kIGZvciBmaXh0dXJlICR7Zml4dHVyZUlkfWApO1xuICAgICAgfVxuICAgICAgY29uc3QgZW50aXR5ID0gRW50aXR5TWFuYWdlci5nZXQobm9kZS5lbnRpdHlJZCk7XG5cbiAgICAgIGZvciAoY29uc3QgZGVwSWQgb2Ygbm9kZS5yZWxhdGVkKSB7XG4gICAgICAgIGNvbnN0IGRlcE5vZGUgPSB0aGlzLmdyYXBoLmdldChkZXBJZCk7XG4gICAgICAgIGlmIChkZXBOb2RlID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYE5vZGUgbm90IGZvdW5kIGZvciBmaXh0dXJlICR7ZGVwSWR9YCk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBCZWxvbmdzVG9PbmUg6rSA6rOE7J2066m07IScIG51bGxhYmxl7J20IOyVhOuLjCDqsr3smrAg66i87KCAIOuwqeusuFxuICAgICAgICBjb25zdCByZWxhdGlvblByb3AgPSBlbnRpdHkucHJvcHMuZmluZChcbiAgICAgICAgICAocHJvcCkgPT5cbiAgICAgICAgICAgIGlzUmVsYXRpb25Qcm9wKHByb3ApICYmXG4gICAgICAgICAgICAoaXNCZWxvbmdzVG9PbmVSZWxhdGlvblByb3AocHJvcCkgfHxcbiAgICAgICAgICAgICAgKGlzT25lVG9PbmVSZWxhdGlvblByb3AocHJvcCkgJiYgcHJvcC5oYXNKb2luQ29sdW1uKSkgJiZcbiAgICAgICAgICAgIHByb3Aud2l0aCA9PT0gZGVwTm9kZS5lbnRpdHlJZCxcbiAgICAgICAgKTtcbiAgICAgICAgaWYgKHJlbGF0aW9uUHJvcCAmJiAhcmVsYXRpb25Qcm9wLm51bGxhYmxlKSB7XG4gICAgICAgICAgdmlzaXQoZGVwSWQpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHRlbXBWaXNpdGVkLmRlbGV0ZShmaXh0dXJlSWQpO1xuICAgICAgdmlzaXRlZC5hZGQoZml4dHVyZUlkKTtcbiAgICAgIG9yZGVyLnB1c2goZml4dHVyZUlkKTtcbiAgICB9O1xuXG4gICAgZm9yIChjb25zdCBmaXh0dXJlSWQgb2YgdGhpcy5ncmFwaC5rZXlzKCkpIHtcbiAgICAgIHZpc2l0KGZpeHR1cmVJZCk7XG4gICAgfVxuXG4gICAgLy8gY2lyY3VsYXIgZGVwZW5kZW5jeeuhnCDsnbjtlbQg67Cp66y465CY7KeAIOyViuydgCBmaXh0dXJlSWQg7LaU6rCAXG4gICAgZm9yIChjb25zdCBmaXh0dXJlSWQgb2YgdGhpcy5ncmFwaC5rZXlzKCkpIHtcbiAgICAgIGlmICghdmlzaXRlZC5oYXMoZml4dHVyZUlkKSkge1xuICAgICAgICBvcmRlci5wdXNoKGZpeHR1cmVJZCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIG9yZGVyO1xuICB9XG59XG4iXSwibmFtZXMiOlsiRW50aXR5TWFuYWdlciIsImlzQmVsb25nc1RvT25lUmVsYXRpb25Qcm9wIiwiaXNNYW55VG9NYW55UmVsYXRpb25Qcm9wIiwiaXNPbmVUb09uZVJlbGF0aW9uUHJvcCIsImlzUmVsYXRpb25Qcm9wIiwiUmVsYXRpb25HcmFwaCIsImdyYXBoIiwiTWFwIiwiYnVpbGRHcmFwaCIsImZpeHR1cmVzIiwiY2xlYXIiLCJmaXh0dXJlIiwic2V0IiwiZml4dHVyZUlkIiwiZW50aXR5SWQiLCJyZWxhdGVkIiwiU2V0Iiwibm9kZSIsImdldCIsInVuZGVmaW5lZCIsIkVycm9yIiwiY29sdW1uIiwiT2JqZWN0IiwiZW50cmllcyIsImNvbHVtbnMiLCJwcm9wIiwiaGFzSm9pbkNvbHVtbiIsInJlbGF0ZWRGaXh0dXJlSWQiLCJ3aXRoIiwidmFsdWUiLCJoYXMiLCJhZGQiLCJyZWxhdGVkSWRzIiwicmVsYXRlZElkIiwiZ2V0SW5zZXJ0aW9uT3JkZXIiLCJ2aXNpdGVkIiwib3JkZXIiLCJ0ZW1wVmlzaXRlZCIsInZpc2l0IiwiY29uc29sZSIsIndhcm4iLCJlbnRpdHkiLCJkZXBJZCIsImRlcE5vZGUiLCJyZWxhdGlvblByb3AiLCJwcm9wcyIsImZpbmQiLCJudWxsYWJsZSIsImRlbGV0ZSIsInB1c2giLCJrZXlzIl0sIm1hcHBpbmdzIjoiQUFBQSxTQUFTQSxh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