sonamu 0.8.26 → 0.9.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 (684) hide show
  1. package/bin/cli.js +60 -13
  2. package/dist/_virtual/rolldown_runtime.js +39 -0
  3. package/dist/ai/agents/agent.d.ts +3 -3
  4. package/dist/ai/agents/agent.d.ts.map +1 -1
  5. package/dist/ai/agents/agent.js +76 -73
  6. package/dist/ai/agents/index.js +3 -3
  7. package/dist/ai/agents/types.d.ts +3 -3
  8. package/dist/ai/agents/types.d.ts.map +1 -1
  9. package/dist/ai/agents/types.js +1 -3
  10. package/dist/ai/index.js +3 -2
  11. package/dist/ai/providers/rtzr/api.js +25 -25
  12. package/dist/ai/providers/rtzr/error.js +25 -26
  13. package/dist/ai/providers/rtzr/index.js +5 -5
  14. package/dist/ai/providers/rtzr/model.d.ts +1 -1
  15. package/dist/ai/providers/rtzr/model.d.ts.map +1 -1
  16. package/dist/ai/providers/rtzr/model.js +117 -133
  17. package/dist/ai/providers/rtzr/options.d.ts.map +1 -1
  18. package/dist/ai/providers/rtzr/options.js +35 -41
  19. package/dist/ai/providers/rtzr/provider.d.ts +1 -1
  20. package/dist/ai/providers/rtzr/provider.d.ts.map +1 -1
  21. package/dist/ai/providers/rtzr/provider.js +53 -51
  22. package/dist/ai/providers/rtzr/utils.d.ts.map +1 -1
  23. package/dist/ai/providers/rtzr/utils.js +84 -84
  24. package/dist/api/base-frame.d.ts +2 -2
  25. package/dist/api/base-frame.d.ts.map +1 -1
  26. package/dist/api/base-frame.js +29 -19
  27. package/dist/api/caster.d.ts +1 -1
  28. package/dist/api/caster.d.ts.map +1 -1
  29. package/dist/api/caster.js +51 -61
  30. package/dist/api/code-converters.d.ts +4 -3
  31. package/dist/api/code-converters.d.ts.map +1 -1
  32. package/dist/api/code-converters.js +226 -249
  33. package/dist/api/config.d.ts +17 -17
  34. package/dist/api/config.d.ts.map +1 -1
  35. package/dist/api/config.js +37 -30
  36. package/dist/api/context.d.ts +10 -10
  37. package/dist/api/context.d.ts.map +1 -1
  38. package/dist/api/context.js +8 -2
  39. package/dist/api/decorators.d.ts +8 -8
  40. package/dist/api/decorators.d.ts.map +1 -1
  41. package/dist/api/decorators.js +245 -268
  42. package/dist/api/index.js +39 -7
  43. package/dist/api/secret.js +22 -15
  44. package/dist/api/sonamu.d.ts +15 -15
  45. package/dist/api/sonamu.d.ts.map +1 -1
  46. package/dist/api/sonamu.js +1012 -1131
  47. package/dist/api/validator.js +88 -79
  48. package/dist/auth/auth-generator.d.ts.map +1 -1
  49. package/dist/auth/auth-generator.js +203 -200
  50. package/dist/auth/better-auth-entities.d.ts +2 -2
  51. package/dist/auth/better-auth-entities.d.ts.map +1 -1
  52. package/dist/auth/better-auth-entities.js +369 -429
  53. package/dist/auth/index.js +21 -6
  54. package/dist/auth/knex-adapter.d.ts +2 -2
  55. package/dist/auth/knex-adapter.d.ts.map +1 -1
  56. package/dist/auth/knex-adapter.js +153 -157
  57. package/dist/auth/plugins/entity-definitions/admin.d.ts +1 -1
  58. package/dist/auth/plugins/entity-definitions/admin.d.ts.map +1 -1
  59. package/dist/auth/plugins/entity-definitions/admin.js +58 -56
  60. package/dist/auth/plugins/entity-definitions/anonymous.d.ts +1 -1
  61. package/dist/auth/plugins/entity-definitions/anonymous.d.ts.map +1 -1
  62. package/dist/auth/plugins/entity-definitions/anonymous.js +20 -20
  63. package/dist/auth/plugins/entity-definitions/api-key.d.ts +1 -1
  64. package/dist/auth/plugins/entity-definitions/api-key.d.ts.map +1 -1
  65. package/dist/auth/plugins/entity-definitions/api-key.js +185 -196
  66. package/dist/auth/plugins/entity-definitions/index.d.ts +1 -1
  67. package/dist/auth/plugins/entity-definitions/index.d.ts.map +1 -1
  68. package/dist/auth/plugins/entity-definitions/index.js +26 -29
  69. package/dist/auth/plugins/entity-definitions/jwt.d.ts +1 -1
  70. package/dist/auth/plugins/entity-definitions/jwt.d.ts.map +1 -1
  71. package/dist/auth/plugins/entity-definitions/jwt.js +62 -64
  72. package/dist/auth/plugins/entity-definitions/organization.d.ts +1 -1
  73. package/dist/auth/plugins/entity-definitions/organization.d.ts.map +1 -1
  74. package/dist/auth/plugins/entity-definitions/organization.js +362 -421
  75. package/dist/auth/plugins/entity-definitions/passkey.d.ts +1 -1
  76. package/dist/auth/plugins/entity-definitions/passkey.d.ts.map +1 -1
  77. package/dist/auth/plugins/entity-definitions/passkey.js +115 -126
  78. package/dist/auth/plugins/entity-definitions/phone-number.d.ts +1 -1
  79. package/dist/auth/plugins/entity-definitions/phone-number.d.ts.map +1 -1
  80. package/dist/auth/plugins/entity-definitions/phone-number.js +31 -40
  81. package/dist/auth/plugins/entity-definitions/sso.d.ts +1 -1
  82. package/dist/auth/plugins/entity-definitions/sso.d.ts.map +1 -1
  83. package/dist/auth/plugins/entity-definitions/sso.js +94 -107
  84. package/dist/auth/plugins/entity-definitions/two-factor.d.ts +1 -1
  85. package/dist/auth/plugins/entity-definitions/two-factor.d.ts.map +1 -1
  86. package/dist/auth/plugins/entity-definitions/two-factor.js +78 -92
  87. package/dist/auth/plugins/entity-definitions/types.d.ts +1 -1
  88. package/dist/auth/plugins/entity-definitions/types.d.ts.map +1 -1
  89. package/dist/auth/plugins/entity-definitions/types.js +1 -10
  90. package/dist/auth/plugins/entity-definitions/username.d.ts +1 -1
  91. package/dist/auth/plugins/entity-definitions/username.d.ts.map +1 -1
  92. package/dist/auth/plugins/entity-definitions/username.js +31 -40
  93. package/dist/auth/plugins/index.js +12 -3
  94. package/dist/auth/plugins/wrappers/admin.d.ts +2 -2
  95. package/dist/auth/plugins/wrappers/admin.d.ts.map +1 -1
  96. package/dist/auth/plugins/wrappers/admin.js +28 -29
  97. package/dist/auth/plugins/wrappers/anonymous.d.ts +2 -1
  98. package/dist/auth/plugins/wrappers/anonymous.d.ts.map +1 -1
  99. package/dist/auth/plugins/wrappers/anonymous.js +23 -22
  100. package/dist/auth/plugins/wrappers/api-key.d.ts +2 -1
  101. package/dist/auth/plugins/wrappers/api-key.d.ts.map +1 -1
  102. package/dist/auth/plugins/wrappers/api-key.js +39 -34
  103. package/dist/auth/plugins/wrappers/index.js +11 -11
  104. package/dist/auth/plugins/wrappers/jwt.d.ts +2 -1
  105. package/dist/auth/plugins/wrappers/jwt.d.ts.map +1 -1
  106. package/dist/auth/plugins/wrappers/jwt.js +31 -26
  107. package/dist/auth/plugins/wrappers/organization.d.ts +2 -1
  108. package/dist/auth/plugins/wrappers/organization.d.ts.map +1 -1
  109. package/dist/auth/plugins/wrappers/organization.js +65 -62
  110. package/dist/auth/plugins/wrappers/passkey.d.ts +2 -1
  111. package/dist/auth/plugins/wrappers/passkey.d.ts.map +1 -1
  112. package/dist/auth/plugins/wrappers/passkey.js +33 -28
  113. package/dist/auth/plugins/wrappers/phone-number.d.ts.map +1 -1
  114. package/dist/auth/plugins/wrappers/phone-number.js +26 -23
  115. package/dist/auth/plugins/wrappers/sso.d.ts.map +1 -1
  116. package/dist/auth/plugins/wrappers/sso.js +37 -31
  117. package/dist/auth/plugins/wrappers/two-factor.d.ts.map +1 -1
  118. package/dist/auth/plugins/wrappers/two-factor.js +31 -28
  119. package/dist/auth/plugins/wrappers/username.d.ts.map +1 -1
  120. package/dist/auth/plugins/wrappers/username.js +23 -23
  121. package/dist/bin/build-config.js +31 -31
  122. package/dist/bin/cli.js +1063 -1204
  123. package/dist/bin/fixture.d.ts.map +1 -1
  124. package/dist/bin/fixture.js +266 -259
  125. package/dist/bin/hmr-hook-register.d.ts.map +1 -1
  126. package/dist/bin/hmr-hook-register.js +19 -18
  127. package/dist/bin/test-command.d.ts.map +1 -1
  128. package/dist/bin/test-command.js +180 -177
  129. package/dist/bin/ts-loader-register.js +13 -6
  130. package/dist/bin/ts-loader-registration.d.ts.map +1 -1
  131. package/dist/bin/ts-loader-registration.js +28 -38
  132. package/dist/cache/cache-manager.d.ts +1 -1
  133. package/dist/cache/cache-manager.d.ts.map +1 -1
  134. package/dist/cache/cache-manager.js +20 -15
  135. package/dist/cache/decorator.d.ts +1 -1
  136. package/dist/cache/decorator.d.ts.map +1 -1
  137. package/dist/cache/decorator.js +84 -76
  138. package/dist/cache/drivers.js +21 -34
  139. package/dist/cache/index.js +10 -7
  140. package/dist/cache/types.d.ts +2 -2
  141. package/dist/cache/types.d.ts.map +1 -1
  142. package/dist/cache/types.js +1 -6
  143. package/dist/cache-control/cache-control.d.ts +2 -2
  144. package/dist/cache-control/cache-control.d.ts.map +1 -1
  145. package/dist/cache-control/cache-control.js +106 -122
  146. package/dist/cache-control/types.d.ts +2 -2
  147. package/dist/cache-control/types.d.ts.map +1 -1
  148. package/dist/cache-control/types.js +1 -19
  149. package/dist/compress/compress.d.ts +1 -1
  150. package/dist/compress/compress.d.ts.map +1 -1
  151. package/dist/compress/compress.js +58 -56
  152. package/dist/compress/index.js +7 -2
  153. package/dist/compress/types.js +1 -11
  154. package/dist/cone/cone-generator.d.ts +1 -1
  155. package/dist/cone/cone-generator.d.ts.map +1 -1
  156. package/dist/cone/cone-generator.js +216 -219
  157. package/dist/database/_batch_update.d.ts +1 -1
  158. package/dist/database/_batch_update.d.ts.map +1 -1
  159. package/dist/database/_batch_update.js +107 -102
  160. package/dist/database/base-model.d.ts +8 -9
  161. package/dist/database/base-model.d.ts.map +1 -1
  162. package/dist/database/base-model.js +371 -392
  163. package/dist/database/base-model.types.d.ts +5 -5
  164. package/dist/database/base-model.types.d.ts.map +1 -1
  165. package/dist/database/base-model.types.js +1 -20
  166. package/dist/database/db.d.ts +5 -2
  167. package/dist/database/db.d.ts.map +1 -1
  168. package/dist/database/db.js +185 -171
  169. package/dist/database/knex.d.ts +1 -1
  170. package/dist/database/knex.d.ts.map +1 -1
  171. package/dist/database/knex.js +48 -42
  172. package/dist/database/puri-subset.types.d.ts +6 -7
  173. package/dist/database/puri-subset.types.d.ts.map +1 -1
  174. package/dist/database/puri-subset.types.js +1 -16
  175. package/dist/database/puri-wrapper.d.ts +6 -6
  176. package/dist/database/puri-wrapper.d.ts.map +1 -1
  177. package/dist/database/puri-wrapper.js +99 -101
  178. package/dist/database/puri.d.ts +4 -5
  179. package/dist/database/puri.d.ts.map +1 -1
  180. package/dist/database/puri.js +1021 -1227
  181. package/dist/database/puri.types.d.ts +6 -6
  182. package/dist/database/puri.types.d.ts.map +1 -1
  183. package/dist/database/puri.types.js +15 -6
  184. package/dist/database/transaction-context.d.ts +2 -2
  185. package/dist/database/transaction-context.d.ts.map +1 -1
  186. package/dist/database/transaction-context.js +22 -13
  187. package/dist/database/upsert-builder.d.ts +3 -3
  188. package/dist/database/upsert-builder.d.ts.map +1 -1
  189. package/dist/database/upsert-builder.js +405 -465
  190. package/dist/dict/en.js +72 -74
  191. package/dist/dict/index.js +13 -13
  192. package/dist/dict/ko.js +72 -74
  193. package/dist/dict/rc-keys.js +150 -168
  194. package/dist/dict/sd.d.ts +3 -1
  195. package/dist/dict/sd.d.ts.map +1 -1
  196. package/dist/dict/sd.js +54 -40
  197. package/dist/dict/sonamu-dictionary.d.ts +1 -1
  198. package/dist/dict/sonamu-dictionary.d.ts.map +1 -1
  199. package/dist/dict/sonamu-dictionary.js +887 -955
  200. package/dist/dict/types.js +1 -7
  201. package/dist/dict/utils.js +26 -24
  202. package/dist/entity/entity-manager.d.ts +9 -9
  203. package/dist/entity/entity-manager.d.ts.map +1 -1
  204. package/dist/entity/entity-manager.js +226 -223
  205. package/dist/entity/entity-template-cone.d.ts +1 -1
  206. package/dist/entity/entity-template-cone.d.ts.map +1 -1
  207. package/dist/entity/entity-template-cone.js +152 -151
  208. package/dist/entity/entity.d.ts.map +1 -1
  209. package/dist/entity/entity.js +952 -1089
  210. package/dist/exceptions/error-handler.d.ts +1 -1
  211. package/dist/exceptions/error-handler.d.ts.map +1 -1
  212. package/dist/exceptions/error-handler.js +32 -27
  213. package/dist/exceptions/so-exceptions.d.ts +1 -1
  214. package/dist/exceptions/so-exceptions.d.ts.map +1 -1
  215. package/dist/exceptions/so-exceptions.js +61 -68
  216. package/dist/filter/index.js +9 -3
  217. package/dist/filter/types.js +92 -88
  218. package/dist/filter/utils.d.ts +1 -1
  219. package/dist/filter/utils.d.ts.map +1 -1
  220. package/dist/filter/utils.js +147 -161
  221. package/dist/index.js +87 -40
  222. package/dist/logger/category.d.ts.map +1 -1
  223. package/dist/logger/category.js +30 -29
  224. package/dist/logger/configure.d.ts.map +1 -1
  225. package/dist/logger/configure.js +83 -107
  226. package/dist/migration/code-generation.d.ts +2 -2
  227. package/dist/migration/code-generation.d.ts.map +1 -1
  228. package/dist/migration/code-generation.js +1385 -1578
  229. package/dist/migration/migration-set.d.ts +1 -1
  230. package/dist/migration/migration-set.d.ts.map +1 -1
  231. package/dist/migration/migration-set.js +177 -227
  232. package/dist/migration/migrator.d.ts +4 -3
  233. package/dist/migration/migrator.d.ts.map +1 -1
  234. package/dist/migration/migrator.js +340 -345
  235. package/dist/migration/postgresql-schema-reader.d.ts +2 -2
  236. package/dist/migration/postgresql-schema-reader.d.ts.map +1 -1
  237. package/dist/migration/postgresql-schema-reader.js +506 -564
  238. package/dist/migration/slack-confirm.d.ts +2 -2
  239. package/dist/migration/slack-confirm.d.ts.map +1 -1
  240. package/dist/migration/slack-confirm.js +205 -193
  241. package/dist/migration/types.d.ts +2 -2
  242. package/dist/migration/types.d.ts.map +1 -1
  243. package/dist/migration/types.js +1 -3
  244. package/dist/naite/messaging-types.d.ts +1 -0
  245. package/dist/naite/messaging-types.d.ts.map +1 -1
  246. package/dist/naite/messaging-types.js +1 -7
  247. package/dist/naite/naite-reporter.d.ts +2 -2
  248. package/dist/naite/naite-reporter.d.ts.map +1 -1
  249. package/dist/naite/naite-reporter.js +127 -120
  250. package/dist/naite/naite.d.ts +3 -2
  251. package/dist/naite/naite.d.ts.map +1 -1
  252. package/dist/naite/naite.js +266 -300
  253. package/dist/ssr/index.d.ts +2 -2
  254. package/dist/ssr/index.d.ts.map +1 -1
  255. package/dist/ssr/index.js +13 -3
  256. package/dist/ssr/registry.d.ts +1 -1
  257. package/dist/ssr/registry.d.ts.map +1 -1
  258. package/dist/ssr/registry.js +45 -37
  259. package/dist/ssr/renderer.d.ts +4 -4
  260. package/dist/ssr/renderer.d.ts.map +1 -1
  261. package/dist/ssr/renderer.js +84 -91
  262. package/dist/ssr/types.d.ts +2 -2
  263. package/dist/ssr/types.d.ts.map +1 -1
  264. package/dist/ssr/types.js +1 -3
  265. package/dist/storage/base-file.js +54 -41
  266. package/dist/storage/buffered-file.d.ts +2 -2
  267. package/dist/storage/buffered-file.d.ts.map +1 -1
  268. package/dist/storage/buffered-file.js +51 -44
  269. package/dist/storage/drivers.d.ts +2 -2
  270. package/dist/storage/drivers.d.ts.map +1 -1
  271. package/dist/storage/drivers.js +12 -7
  272. package/dist/storage/index.js +14 -7
  273. package/dist/storage/s3-driver.d.ts +2 -2
  274. package/dist/storage/s3-driver.d.ts.map +1 -1
  275. package/dist/storage/s3-driver.js +52 -48
  276. package/dist/storage/storage-manager.d.ts +2 -2
  277. package/dist/storage/storage-manager.d.ts.map +1 -1
  278. package/dist/storage/storage-manager.js +33 -25
  279. package/dist/storage/types.d.ts +2 -2
  280. package/dist/storage/types.d.ts.map +1 -1
  281. package/dist/storage/types.js +1 -5
  282. package/dist/storage/uploaded-file.d.ts +1 -1
  283. package/dist/storage/uploaded-file.d.ts.map +1 -1
  284. package/dist/storage/uploaded-file.js +45 -35
  285. package/dist/stream/index.js +7 -2
  286. package/dist/stream/sse.d.ts +2 -2
  287. package/dist/stream/sse.d.ts.map +1 -1
  288. package/dist/stream/sse.js +72 -67
  289. package/dist/syncer/api-parser.d.ts +1 -1
  290. package/dist/syncer/api-parser.d.ts.map +1 -1
  291. package/dist/syncer/api-parser.js +224 -245
  292. package/dist/syncer/checksum.d.ts +1 -1
  293. package/dist/syncer/checksum.d.ts.map +1 -1
  294. package/dist/syncer/checksum.js +86 -72
  295. package/dist/syncer/code-generator.d.ts +2 -2
  296. package/dist/syncer/code-generator.d.ts.map +1 -1
  297. package/dist/syncer/code-generator.js +154 -160
  298. package/dist/syncer/entity-operations.d.ts +1 -1
  299. package/dist/syncer/entity-operations.d.ts.map +1 -1
  300. package/dist/syncer/entity-operations.js +63 -54
  301. package/dist/syncer/file-patterns.d.ts +1 -1
  302. package/dist/syncer/file-patterns.d.ts.map +1 -1
  303. package/dist/syncer/file-patterns.js +38 -38
  304. package/dist/syncer/index.js +19 -8
  305. package/dist/syncer/module-loader.d.ts +5 -5
  306. package/dist/syncer/module-loader.d.ts.map +1 -1
  307. package/dist/syncer/module-loader.js +83 -78
  308. package/dist/syncer/syncer-actions.d.ts +2 -2
  309. package/dist/syncer/syncer-actions.d.ts.map +1 -1
  310. package/dist/syncer/syncer-actions.js +76 -91
  311. package/dist/syncer/syncer.d.ts +7 -6
  312. package/dist/syncer/syncer.d.ts.map +1 -1
  313. package/dist/syncer/syncer.js +426 -492
  314. package/dist/tasks/decorator.d.ts +3 -3
  315. package/dist/tasks/decorator.d.ts.map +1 -1
  316. package/dist/tasks/decorator.js +32 -28
  317. package/dist/tasks/step-wrapper.d.ts +1 -1
  318. package/dist/tasks/step-wrapper.d.ts.map +1 -1
  319. package/dist/tasks/step-wrapper.js +42 -41
  320. package/dist/tasks/workflow-manager.d.ts +2 -2
  321. package/dist/tasks/workflow-manager.d.ts.map +1 -1
  322. package/dist/tasks/workflow-manager.js +192 -221
  323. package/dist/template/entity-converter.d.ts +1 -1
  324. package/dist/template/entity-converter.d.ts.map +1 -1
  325. package/dist/template/entity-converter.js +103 -103
  326. package/dist/template/helpers.d.ts.map +1 -1
  327. package/dist/template/helpers.js +163 -163
  328. package/dist/template/implementations/entity.template.d.ts +1 -1
  329. package/dist/template/implementations/entity.template.d.ts.map +1 -1
  330. package/dist/template/implementations/entity.template.js +76 -85
  331. package/dist/template/implementations/entry-server.template.d.ts +1 -1
  332. package/dist/template/implementations/entry-server.template.d.ts.map +1 -1
  333. package/dist/template/implementations/entry-server.template.js +32 -27
  334. package/dist/template/implementations/generated.template.d.ts +1 -1
  335. package/dist/template/implementations/generated.template.d.ts.map +1 -1
  336. package/dist/template/implementations/generated.template.js +254 -275
  337. package/dist/template/implementations/generated_http.template.d.ts +2 -2
  338. package/dist/template/implementations/generated_http.template.d.ts.map +1 -1
  339. package/dist/template/implementations/generated_http.template.js +114 -133
  340. package/dist/template/implementations/generated_sso.template.d.ts.map +1 -1
  341. package/dist/template/implementations/generated_sso.template.js +249 -275
  342. package/dist/template/implementations/init_types.template.d.ts +1 -1
  343. package/dist/template/implementations/init_types.template.d.ts.map +1 -1
  344. package/dist/template/implementations/init_types.template.js +40 -34
  345. package/dist/template/implementations/model.template.d.ts +1 -1
  346. package/dist/template/implementations/model.template.d.ts.map +1 -1
  347. package/dist/template/implementations/model.template.js +56 -53
  348. package/dist/template/implementations/model_test.template.d.ts +1 -1
  349. package/dist/template/implementations/model_test.template.d.ts.map +1 -1
  350. package/dist/template/implementations/model_test.template.js +32 -24
  351. package/dist/template/implementations/queries.template.d.ts +1 -1
  352. package/dist/template/implementations/queries.template.d.ts.map +1 -1
  353. package/dist/template/implementations/queries.template.js +84 -89
  354. package/dist/template/implementations/sd.template.d.ts +1 -1
  355. package/dist/template/implementations/sd.template.d.ts.map +1 -1
  356. package/dist/template/implementations/sd.template.js +137 -144
  357. package/dist/template/implementations/services.template.d.ts +1 -1
  358. package/dist/template/implementations/services.template.d.ts.map +1 -1
  359. package/dist/template/implementations/services.template.js +164 -189
  360. package/dist/template/implementations/view_form.template.d.ts +1 -1
  361. package/dist/template/implementations/view_form.template.d.ts.map +1 -1
  362. package/dist/template/implementations/view_form.template.js +258 -285
  363. package/dist/template/implementations/view_id_all_select.template.d.ts +1 -1
  364. package/dist/template/implementations/view_id_all_select.template.d.ts.map +1 -1
  365. package/dist/template/implementations/view_id_all_select.template.js +31 -25
  366. package/dist/template/implementations/view_list.template.d.ts +1 -1
  367. package/dist/template/implementations/view_list.template.d.ts.map +1 -1
  368. package/dist/template/implementations/view_list.template.js +304 -355
  369. package/dist/template/implementations/view_search_input.template.d.ts +1 -1
  370. package/dist/template/implementations/view_search_input.template.d.ts.map +1 -1
  371. package/dist/template/implementations/view_search_input.template.js +31 -27
  372. package/dist/template/index.js +21 -7
  373. package/dist/template/template-manager.d.ts +1 -1
  374. package/dist/template/template-manager.d.ts.map +1 -1
  375. package/dist/template/template-manager.js +132 -123
  376. package/dist/template/template-types.js +8 -6
  377. package/dist/template/template.d.ts +2 -2
  378. package/dist/template/template.d.ts.map +1 -1
  379. package/dist/template/template.js +73 -68
  380. package/dist/template/zod-converter.d.ts.map +1 -1
  381. package/dist/template/zod-converter.js +603 -657
  382. package/dist/testing/_relation-graph.d.ts +1 -1
  383. package/dist/testing/_relation-graph.d.ts.map +1 -1
  384. package/dist/testing/_relation-graph.js +93 -88
  385. package/dist/testing/bootstrap.d.ts +22 -13
  386. package/dist/testing/bootstrap.d.ts.map +1 -1
  387. package/dist/testing/bootstrap.js +114 -114
  388. package/dist/testing/data-explorer.d.ts +3 -3
  389. package/dist/testing/data-explorer.d.ts.map +1 -1
  390. package/dist/testing/data-explorer.js +237 -265
  391. package/dist/testing/dev-test-routes.d.ts +2 -2
  392. package/dist/testing/dev-test-routes.d.ts.map +1 -1
  393. package/dist/testing/dev-test-routes.js +258 -249
  394. package/dist/testing/dev-vitest-manager.d.ts +1 -1
  395. package/dist/testing/dev-vitest-manager.d.ts.map +1 -1
  396. package/dist/testing/dev-vitest-manager.js +514 -539
  397. package/dist/testing/faker-mappings.js +422 -420
  398. package/dist/testing/fixture-generator.d.ts +3 -3
  399. package/dist/testing/fixture-generator.d.ts.map +1 -1
  400. package/dist/testing/fixture-generator.js +1216 -1346
  401. package/dist/testing/fixture-loader.js +26 -25
  402. package/dist/testing/fixture-manager.d.ts +3 -3
  403. package/dist/testing/fixture-manager.d.ts.map +1 -1
  404. package/dist/testing/fixture-manager.js +706 -776
  405. package/dist/testing/global-setup.js +53 -49
  406. package/dist/testing/index.js +19 -11
  407. package/dist/testing/naite-vitest-reporter.js +18 -13
  408. package/dist/testing/parallel-db-manager.d.ts +1 -1
  409. package/dist/testing/parallel-db-manager.d.ts.map +1 -1
  410. package/dist/testing/parallel-db-manager.js +63 -78
  411. package/dist/testing/vitest-helpers.d.ts +1 -1
  412. package/dist/testing/vitest-helpers.d.ts.map +1 -1
  413. package/dist/testing/vitest-helpers.js +37 -33
  414. package/dist/types/types.d.ts +28 -28
  415. package/dist/types/types.d.ts.map +1 -1
  416. package/dist/types/types.js +764 -890
  417. package/dist/ui/ai-api.d.ts +1 -1
  418. package/dist/ui/ai-api.d.ts.map +1 -1
  419. package/dist/ui/ai-api.js +52 -42
  420. package/dist/ui/ai-client.d.ts +1 -2
  421. package/dist/ui/ai-client.d.ts.map +1 -1
  422. package/dist/ui/ai-client.js +353 -388
  423. package/dist/ui/api.d.ts +1 -1
  424. package/dist/ui/api.d.ts.map +1 -1
  425. package/dist/ui/api.js +903 -1145
  426. package/dist/ui/cdd-service.d.ts +1 -1
  427. package/dist/ui/cdd-service.d.ts.map +1 -1
  428. package/dist/ui/cdd-service.js +406 -407
  429. package/dist/ui/cdd-types.js +1 -3
  430. package/dist/ui-web/assets/index-C-Zz-wYg.css +1 -0
  431. package/dist/ui-web/assets/index-DejDON8K.js +238 -0
  432. package/dist/ui-web/index.html +3 -3
  433. package/dist/utils/async-utils.js +57 -45
  434. package/dist/utils/console-util.d.ts.map +1 -1
  435. package/dist/utils/console-util.js +104 -87
  436. package/dist/utils/controller.js +26 -19
  437. package/dist/utils/esm-utils.js +49 -38
  438. package/dist/utils/formatter.d.ts +1 -2
  439. package/dist/utils/formatter.d.ts.map +1 -1
  440. package/dist/utils/formatter.js +89 -115
  441. package/dist/utils/fs-utils.d.ts.map +1 -1
  442. package/dist/utils/fs-utils.js +68 -65
  443. package/dist/utils/lodash-able.js +11 -4
  444. package/dist/utils/model.d.ts +1 -1
  445. package/dist/utils/model.d.ts.map +1 -1
  446. package/dist/utils/model.js +21 -19
  447. package/dist/utils/object-utils.js +148 -186
  448. package/dist/utils/path-utils.js +67 -57
  449. package/dist/utils/process-utils.d.ts.map +1 -1
  450. package/dist/utils/process-utils.js +37 -31
  451. package/dist/utils/sql-parser.d.ts +1 -1
  452. package/dist/utils/sql-parser.d.ts.map +1 -1
  453. package/dist/utils/sql-parser.js +40 -40
  454. package/dist/utils/type-utils.js +44 -43
  455. package/dist/utils/utils.d.ts +2 -3
  456. package/dist/utils/utils.d.ts.map +1 -1
  457. package/dist/utils/utils.js +81 -93
  458. package/dist/utils/zod-error.d.ts +1 -1
  459. package/dist/utils/zod-error.d.ts.map +1 -1
  460. package/dist/utils/zod-error.js +24 -17
  461. package/dist/vector/chunking.d.ts +1 -1
  462. package/dist/vector/chunking.d.ts.map +1 -1
  463. package/dist/vector/chunking.js +100 -94
  464. package/dist/vector/config.d.ts +1 -1
  465. package/dist/vector/config.d.ts.map +1 -1
  466. package/dist/vector/config.js +76 -78
  467. package/dist/vector/embedding.d.ts +1 -1
  468. package/dist/vector/embedding.d.ts.map +1 -1
  469. package/dist/vector/embedding.js +128 -125
  470. package/dist/vector/index.js +5 -5
  471. package/dist/vector/types.js +1 -5
  472. package/package.json +31 -36
  473. package/src/ai/agents/agent.ts +12 -5
  474. package/src/ai/agents/types.ts +5 -5
  475. package/src/ai/providers/rtzr/model.ts +8 -10
  476. package/src/ai/providers/rtzr/options.ts +2 -1
  477. package/src/ai/providers/rtzr/provider.ts +5 -3
  478. package/src/ai/providers/rtzr/utils.ts +2 -7
  479. package/src/api/__tests__/config.test.ts +15 -8
  480. package/src/api/base-frame.ts +5 -3
  481. package/src/api/caster.ts +7 -6
  482. package/src/api/code-converters.ts +23 -26
  483. package/src/api/config.ts +23 -17
  484. package/src/api/context.ts +18 -11
  485. package/src/api/decorators.ts +17 -18
  486. package/src/api/sonamu.ts +44 -49
  487. package/src/auth/auth-generator.ts +4 -6
  488. package/src/auth/better-auth-entities.ts +3 -2
  489. package/src/auth/knex-adapter.ts +6 -5
  490. package/src/auth/plugins/entity-definitions/admin.ts +1 -1
  491. package/src/auth/plugins/entity-definitions/anonymous.ts +1 -1
  492. package/src/auth/plugins/entity-definitions/api-key.ts +1 -1
  493. package/src/auth/plugins/entity-definitions/index.ts +1 -1
  494. package/src/auth/plugins/entity-definitions/jwt.ts +1 -1
  495. package/src/auth/plugins/entity-definitions/organization.ts +1 -1
  496. package/src/auth/plugins/entity-definitions/passkey.ts +1 -1
  497. package/src/auth/plugins/entity-definitions/phone-number.ts +1 -1
  498. package/src/auth/plugins/entity-definitions/sso.ts +1 -1
  499. package/src/auth/plugins/entity-definitions/two-factor.ts +1 -1
  500. package/src/auth/plugins/entity-definitions/types.ts +1 -1
  501. package/src/auth/plugins/entity-definitions/username.ts +1 -1
  502. package/src/auth/plugins/wrappers/admin.ts +3 -1
  503. package/src/auth/plugins/wrappers/anonymous.ts +3 -1
  504. package/src/auth/plugins/wrappers/api-key.ts +3 -1
  505. package/src/auth/plugins/wrappers/jwt.ts +3 -1
  506. package/src/auth/plugins/wrappers/organization.ts +3 -1
  507. package/src/auth/plugins/wrappers/passkey.ts +3 -1
  508. package/src/auth/plugins/wrappers/phone-number.ts +3 -1
  509. package/src/auth/plugins/wrappers/sso.ts +2 -1
  510. package/src/auth/plugins/wrappers/two-factor.ts +3 -1
  511. package/src/auth/plugins/wrappers/username.ts +3 -1
  512. package/src/bin/__tests__/ts-loader-register.test.ts +7 -12
  513. package/src/bin/build-config.ts +3 -3
  514. package/src/bin/cli.ts +27 -25
  515. package/src/bin/fixture.ts +4 -2
  516. package/src/bin/hmr-hook-register.ts +1 -0
  517. package/src/bin/test-command.ts +4 -2
  518. package/src/bin/ts-loader-registration.ts +6 -22
  519. package/src/cache/cache-manager.ts +2 -1
  520. package/src/cache/decorator.ts +2 -2
  521. package/src/cache/types.ts +3 -3
  522. package/src/cache-control/cache-control.ts +3 -2
  523. package/src/cache-control/types.ts +2 -2
  524. package/src/compress/compress.ts +1 -1
  525. package/src/cone/cone-generator.ts +5 -3
  526. package/src/database/_batch_update.ts +1 -1
  527. package/src/database/base-model.ts +20 -14
  528. package/src/database/base-model.types.ts +12 -11
  529. package/src/database/db.ts +56 -21
  530. package/src/database/knex.ts +2 -2
  531. package/src/database/puri-subset.test-d.ts +33 -32
  532. package/src/database/puri-subset.types.ts +6 -7
  533. package/src/database/puri-wrapper.ts +29 -26
  534. package/src/database/puri.ts +36 -34
  535. package/src/database/puri.types.test-d.ts +6 -5
  536. package/src/database/puri.types.ts +9 -12
  537. package/src/database/transaction-context.ts +2 -2
  538. package/src/database/upsert-builder.ts +17 -10
  539. package/src/dict/sd.ts +17 -4
  540. package/src/dict/sonamu-dictionary.ts +23 -17
  541. package/src/entity/entity-manager.ts +9 -7
  542. package/src/entity/entity-template-cone.ts +10 -3
  543. package/src/entity/entity.ts +20 -16
  544. package/src/exceptions/error-handler.ts +2 -1
  545. package/src/exceptions/so-exceptions.ts +1 -1
  546. package/src/filter/utils.ts +3 -2
  547. package/src/logger/category.ts +1 -0
  548. package/src/logger/configure.ts +5 -5
  549. package/src/migration/__tests__/code-generation.search-text.test.ts +2 -3
  550. package/src/migration/code-generation.ts +26 -25
  551. package/src/migration/migration-set.ts +16 -18
  552. package/src/migration/migrator.ts +38 -33
  553. package/src/migration/postgresql-schema-reader.ts +12 -12
  554. package/src/migration/slack-confirm.ts +5 -4
  555. package/src/migration/types.ts +2 -2
  556. package/src/naite/messaging-types.ts +1 -1
  557. package/src/naite/naite-reporter.ts +5 -3
  558. package/src/naite/naite.ts +12 -7
  559. package/src/shared/app.shared.ts.txt +2 -2
  560. package/src/shared/web.shared.ts.txt +2 -2
  561. package/src/skills/AGENTS.md +19 -18
  562. package/src/skills/commands/sonamu-skills.md +9 -9
  563. package/src/skills/sonamu/SKILL.md +111 -104
  564. package/src/skills/sonamu/ai-agents.md +27 -26
  565. package/src/skills/sonamu/api.md +81 -69
  566. package/src/skills/sonamu/auth-migration.md +13 -27
  567. package/src/skills/sonamu/auth-plugins.md +41 -31
  568. package/src/skills/sonamu/auth.md +30 -24
  569. package/src/skills/sonamu/cdd.md +26 -17
  570. package/src/skills/sonamu/cone.md +50 -50
  571. package/src/skills/sonamu/config.md +74 -51
  572. package/src/skills/sonamu/create-sonamu.md +31 -19
  573. package/src/skills/sonamu/database.md +43 -26
  574. package/src/skills/sonamu/entity-basic.md +61 -61
  575. package/src/skills/sonamu/entity-relations.md +84 -80
  576. package/src/skills/sonamu/entity-validation-checklist.md +19 -15
  577. package/src/skills/sonamu/fixture-cli.md +52 -30
  578. package/src/skills/sonamu/framework-change.md +9 -7
  579. package/src/skills/sonamu/frontend.md +64 -82
  580. package/src/skills/sonamu/i18n.md +45 -37
  581. package/src/skills/sonamu/migration.md +54 -31
  582. package/src/skills/sonamu/model.md +98 -66
  583. package/src/skills/sonamu/naite.md +34 -32
  584. package/src/skills/sonamu/project-init.md +28 -8
  585. package/src/skills/sonamu/puri.md +82 -91
  586. package/src/skills/sonamu/scaffolding.md +44 -32
  587. package/src/skills/sonamu/skill-contribution.md +50 -45
  588. package/src/skills/sonamu/subset.md +13 -13
  589. package/src/skills/sonamu/tasks.md +73 -58
  590. package/src/skills/sonamu/testing-devrunner.md +56 -36
  591. package/src/skills/sonamu/testing.md +23 -58
  592. package/src/skills/sonamu/upsert.md +32 -31
  593. package/src/skills/sonamu/vector.md +37 -36
  594. package/src/ssr/index.ts +2 -12
  595. package/src/ssr/registry.ts +1 -1
  596. package/src/ssr/renderer.ts +7 -5
  597. package/src/ssr/types.ts +2 -2
  598. package/src/storage/buffered-file.ts +4 -2
  599. package/src/storage/drivers.ts +3 -2
  600. package/src/storage/s3-driver.ts +7 -4
  601. package/src/storage/storage-manager.ts +3 -2
  602. package/src/storage/types.ts +3 -2
  603. package/src/storage/uploaded-file.ts +1 -1
  604. package/src/stream/sse.ts +2 -2
  605. package/src/syncer/api-parser.ts +8 -5
  606. package/src/syncer/checksum.ts +9 -5
  607. package/src/syncer/code-generator.ts +16 -8
  608. package/src/syncer/entity-operations.ts +5 -3
  609. package/src/syncer/file-patterns.ts +2 -1
  610. package/src/syncer/module-loader.ts +9 -6
  611. package/src/syncer/syncer-actions.ts +5 -3
  612. package/src/syncer/syncer.ts +18 -24
  613. package/src/tasks/decorator.ts +10 -8
  614. package/src/tasks/step-wrapper.ts +1 -1
  615. package/src/tasks/workflow-manager.ts +18 -15
  616. package/src/template/__tests__/generated.template.search-text.test.ts +1 -0
  617. package/src/template/entity-converter.ts +4 -2
  618. package/src/template/generated.template.test-d.ts +2 -1
  619. package/src/template/helpers.ts +5 -2
  620. package/src/template/implementations/entity.template.ts +9 -8
  621. package/src/template/implementations/entry-server.template.ts +1 -1
  622. package/src/template/implementations/generated.template.ts +21 -29
  623. package/src/template/implementations/generated_http.template.ts +9 -6
  624. package/src/template/implementations/generated_sso.template.ts +6 -4
  625. package/src/template/implementations/init_types.template.ts +3 -2
  626. package/src/template/implementations/model.template.ts +4 -2
  627. package/src/template/implementations/model_test.template.ts +3 -2
  628. package/src/template/implementations/queries.template.ts +6 -14
  629. package/src/template/implementations/sd.template.ts +4 -2
  630. package/src/template/implementations/services.template.ts +7 -11
  631. package/src/template/implementations/view_form.template.ts +5 -3
  632. package/src/template/implementations/view_id_all_select.template.ts +3 -2
  633. package/src/template/implementations/view_list.template.ts +7 -5
  634. package/src/template/implementations/view_search_input.template.ts +3 -2
  635. package/src/template/template-manager.ts +4 -3
  636. package/src/template/template.ts +4 -3
  637. package/src/template/zod-converter.ts +10 -7
  638. package/src/testing/__tests__/dev-test-routes.test.ts +3 -2
  639. package/src/testing/__tests__/dev-vitest-manager.test.ts +1 -0
  640. package/src/testing/_relation-graph.ts +2 -2
  641. package/src/testing/bootstrap.ts +55 -27
  642. package/src/testing/data-explorer.ts +5 -4
  643. package/src/testing/dev-test-routes.ts +8 -5
  644. package/src/testing/dev-vitest-manager.ts +13 -12
  645. package/src/testing/fixture-generator.ts +11 -17
  646. package/src/testing/fixture-manager.ts +21 -17
  647. package/src/testing/parallel-db-manager.ts +2 -1
  648. package/src/testing/vitest-helpers.ts +2 -1
  649. package/src/types/__tests__/entity-json-schema-search-text.test.ts +1 -0
  650. package/src/types/types.ts +8 -8
  651. package/src/typings/knex.d.ts +4 -4
  652. package/src/ui/ai-api.ts +5 -3
  653. package/src/ui/ai-client.ts +6 -5
  654. package/src/ui/api.ts +25 -23
  655. package/src/ui/cdd-service.ts +12 -11
  656. package/src/utils/console-util.ts +3 -1
  657. package/src/utils/formatter.ts +94 -102
  658. package/src/utils/fs-utils.ts +2 -1
  659. package/src/utils/model.ts +2 -2
  660. package/src/utils/object-utils.ts +3 -3
  661. package/src/utils/process-utils.ts +2 -1
  662. package/src/utils/sql-parser.ts +10 -1
  663. package/src/utils/type-utils.ts +3 -3
  664. package/src/utils/utils.ts +9 -7
  665. package/src/utils/zod-error.ts +1 -1
  666. package/src/vector/chunking.ts +1 -1
  667. package/src/vector/config.ts +1 -1
  668. package/src/vector/embedding.ts +11 -9
  669. package/tsdown.api.config.ts +50 -0
  670. package/.swcrc.project-default +0 -18
  671. package/dist/api/__tests__/config.test.js +0 -189
  672. package/dist/bin/__tests__/test-command.test.js +0 -112
  673. package/dist/bin/__tests__/ts-loader-register.test.js +0 -45
  674. package/dist/database/puri-subset.test-d.js +0 -89
  675. package/dist/database/puri.types.test-d.js +0 -129
  676. package/dist/migration/__tests__/code-generation.search-text.test.js +0 -435
  677. package/dist/template/__tests__/generated.template.search-text.test.js +0 -99
  678. package/dist/template/generated.template.test-d.js +0 -24
  679. package/dist/testing/__tests__/dev-test-routes.test.js +0 -144
  680. package/dist/testing/__tests__/dev-vitest-manager.test.js +0 -152
  681. package/dist/types/__tests__/entity-json-schema-search-text.test.js +0 -256
  682. package/dist/typings/knex.d.js +0 -3
  683. package/dist/ui-web/assets/index-CKo0Z2Iu.css +0 -1
  684. package/dist/ui-web/assets/index-DK-2aacv.js +0 -257
@@ -1,278 +1,242 @@
1
+ import { EntityManager, init_entity_manager } from "../../entity/entity-manager.js";
2
+ import { Template, init_template } from "../template.js";
3
+ import { getEnumInfoFromColName, getRelationNameFromColumnName, getRelationPropFromColName, init_helpers } from "../helpers.js";
1
4
  import inflection from "inflection";
5
+ import { z as z$1 } from "zod";
2
6
  import { flat } from "radashi";
3
- import { z } from "zod";
4
- import { EntityManager } from "../../entity/entity-manager.js";
5
- import { getEnumInfoFromColName, getRelationNameFromColumnName, getRelationPropFromColName } from "../helpers.js";
6
- import { Template } from "../template.js";
7
- export class Template__view_list extends Template {
8
- constructor(){
9
- super("view_list");
10
- }
11
- getTargetAndPath(names) {
12
- return {
13
- target: "web/src/routes/admin",
14
- path: `${names.fsPlural}/index.tsx`
15
- };
16
- }
17
- getRequiredDictKeys() {
18
- return [
19
- "entity.listManage",
20
- "common.all"
21
- ];
22
- }
23
- wrapTc(body, key, collapsing = true, className = "") {
24
- return `<Table.Cell key="${key}"${collapsing ? " collapsing" : ""}${className ? ` className={\`${className}\`}` : ""}>${body}</Table.Cell>`;
25
- }
26
- renderColumn(entityId, col, names, parentObj = "row", withoutName = false) {
27
- // 중첩 경로 처리 (예: "user.name" -> "row.user?.name")
28
- let colName;
29
- if (withoutName) {
30
- colName = parentObj;
31
- } else if (col.name.includes(".")) {
32
- // 중첩 경로는 optional chaining으로 변환
33
- const parts = col.name.split(".");
34
- colName = `${parentObj}.${parts.join("?.")}`;
35
- } else {
36
- colName = `${parentObj}.${col.name}`;
37
- }
38
- switch(col.renderType){
39
- case "string-plain":
40
- case "string-date":
41
- case "number-id":
42
- case "string-id":
43
- return `<>{${colName}}</>`;
44
- case "number-fk_id":
45
- case "string-fk_id":
46
- {
47
- try {
48
- const baseName = col.name.includes(".") ? (col.name.split(".").pop() ?? col.name).replace("_id", "") : col.name.replace("_id", "");
49
- const relPropFk = getRelationPropFromColName(entityId, baseName);
50
- return `<>${relPropFk.with}#{${colName}}</>`;
51
- } catch {
52
- return `<>{${colName}}</>`;
53
- }
54
- }
55
- case "datetime":
56
- if (col.nullable || col.name.includes(".")) {
57
- return `<span>{${colName} ? datetimeF(${colName}) : '-'}</span>`;
58
- } else {
59
- return `<span>{datetimeF(${colName})}</span>`;
60
- }
61
- case "string-datetime":
62
- if (col.nullable || col.name.includes(".")) {
63
- return `<span>{${colName} ? dateF(${colName}) : '-'}</span>`;
64
- } else {
65
- return `<span>{dateF(${colName})}</span>`;
66
- }
67
- case "boolean":
68
- return `<>{${colName} ? <Badge variant="default">O</Badge> : <Badge variant="secondary">X</Badge>}</>`;
69
- case "enums":
70
- {
71
- try {
72
- const { id: enumId } = getEnumInfoFromColName(entityId, col.name);
73
- return `<>{${col.nullable ? `${colName} && ` : ""}${enumId}Label[${colName}]}</>`;
74
- } catch {
75
- return `<>{${colName}}</>`;
76
- }
77
- }
78
- case "array-images":
79
- return `<div className="flex gap-1">{ ${colName}?.map((r, i) => ${col.nullable ? `r && ` : ""}<img key={i} src={r} alt={\`${col.label ?? col.name} \${i + 1}\`} className="h-8 w-8 object-cover rounded" />) }</div>`;
80
- case "json-sonamufile":
81
- return `<div className="flex items-center gap-2">{${colName} ? <img src={${colName}.url} alt={${colName}.name} className="h-8 w-8 object-cover rounded" /> : '-'}</div>`;
82
- case "json-sonamufile-array":
83
- return `<div className="flex gap-1">{ ${colName}?.map((r, i) => ${col.nullable ? `r && ` : ""}<img key={i} src={r.url} alt={\`${col.label ?? col.name} \${i + 1}\`} className="h-8 w-8 object-cover rounded" />) }</div>`;
84
- case "number-plain":
85
- return `<>{${col.nullable || col.name.includes(".") ? `${colName} && ` : ""}numF(${colName})}</>`;
86
- case "object":
87
- return `<span className="text-xs">{${col.nullable ? `${colName} ? ` : ""}JSON.stringify(${colName})${col.nullable ? ` : '-'` : ""}}</span>`;
88
- case "object-pick":
89
- {
90
- const pickedChild = col.children?.find((child)=>child.name === col.config?.picked);
91
- if (!pickedChild) {
92
- throw new Error(`object-pick 선택 실패 (오브젝트: ${col.name})`);
93
- }
94
- return this.renderColumn(entityId, pickedChild, names, `${colName}${col.nullable ? "?" : ""}`);
95
- }
96
- case "array":
97
- return `<>{ /* array ${colName} */ }</>`;
98
- case "vector":
99
- // vector 타입은 차원 수만 표시 (실제 데이터는 너무 김)
100
- return `<>{${col.nullable ? `${colName} ? ` : ""}[Vector: {${colName}${col.nullable ? "" : " ?? []"}.length}d]${col.nullable ? " : '-'" : ""}}</>`;
101
- default:
102
- throw new Error(`렌더 불가 컬럼 ${col.renderType}`);
103
- }
104
- }
105
- renderColumnImport(entityId, col, names) {
106
- if (col.renderType === "enums") {
107
- const { id: enumId } = getEnumInfoFromColName(names.capital, col.name);
108
- return [
109
- `import { ${enumId}Label } from '@/services/sonamu.generated';`
110
- ];
111
- } else if (col.renderType === "object") {
112
- try {
113
- const relProp = getRelationPropFromColName(entityId, col.name);
114
- const result = (col.children ?? []).map((child)=>{
115
- entityId = relProp.with;
116
- names = EntityManager.getNamesFromId(relProp.with);
117
- return this.renderColumnImport(entityId, child, names);
118
- });
119
- return flat(result);
120
- } catch {
121
- return [
122
- null
123
- ];
124
- }
125
- } else if (col.renderType === "array") {
126
- if (!col.element) return [
127
- null
128
- ];
129
- return this.renderColumnImport(entityId, col.element, names);
130
- }
131
- return [
132
- null
133
- ];
134
- }
135
- renderFilterImport(entityId, col, names) {
136
- if (col.name === "search") {
137
- return `import { ${names.capital}SearchInput } from "@/components/${names.fs}/${names.capital}SearchInput";`;
138
- } else if (col.renderType === "enums") {
139
- if (col.name === "orderBy") {
140
- const componentId = `${names.capital}${inflection.camelize(col.name)}Select`;
141
- return `import { ${componentId} } from "@/components/${names.fs}/${componentId}";`;
142
- } else {
143
- try {
144
- const { id, targetEntityNames: targetMDNames } = getEnumInfoFromColName(entityId, col.name);
145
- const componentId = `${id}Select`;
146
- return `import { ${componentId} } from "@/components/${targetMDNames.fs}/${componentId}";`;
147
- } catch {
148
- return "";
149
- }
150
- }
151
- } else if (col.renderType === "number-fk_id" || col.renderType === "string-fk_id") {
152
- try {
153
- const relProp = getRelationPropFromColName(entityId, col.name.replace("_id", ""));
154
- const targetNames = EntityManager.getNamesFromId(relProp.with);
155
- const componentId = `${relProp.with}IdAsyncSelect`;
156
- return `import { ${componentId} } from "@/components/${targetNames.fs}/${componentId}";`;
157
- } catch {
158
- return "";
159
- }
160
- } else {
161
- throw new Error(`렌더 불가능한 필터 임포트 ${col.name} ${col.renderType}`);
162
- }
163
- }
164
- renderFilter(entityId, col, names) {
165
- if (col.name === "search") {
166
- return "";
167
- }
168
- const isClearable = col.optional === true && col.name !== "orderBy";
169
- let componentId;
170
- if (col.renderType === "enums") {
171
- if (col.name === "orderBy") {
172
- componentId = `${names.capital}${inflection.camelize(col.name)}Select`;
173
- } else {
174
- try {
175
- const { id } = getEnumInfoFromColName(entityId, col.name);
176
- componentId = `${id}Select`;
177
- } catch {
178
- return "";
179
- }
180
- }
181
- return `<${componentId} {...register('${col.name}')} ${isClearable ? "clearable" : ""} />`;
182
- } else if (col.renderType === "number-fk_id" || col.renderType === "string-fk_id") {
183
- try {
184
- const relProp = getRelationPropFromColName(entityId, col.name.replace("_id", ""));
185
- componentId = `${relProp.with}IdAsyncSelect`;
186
- return `<${componentId} {...register('${col.name}')} ${isClearable ? "clearable" : ""} subset="A" />`;
187
- } catch {
188
- return "";
189
- }
190
- } else {
191
- throw new Error(`렌더 불가능한 필터 임포트 ${col.name} ${col.renderType}`);
192
- }
193
- }
194
- getDefault(columns) {
195
- const def = {
196
- orderBy: "",
197
- search: "",
198
- hasSearch: false,
199
- hasOrderBy: false
200
- };
201
- const orderByZodType = columns.find((col)=>col.name === "orderBy")?.zodType;
202
- if (orderByZodType && orderByZodType instanceof z.ZodEnum) {
203
- def.orderBy = Object.keys(orderByZodType.enum)[0];
204
- def.hasOrderBy = true;
205
- }
206
- const searchZodType = columns.find((col)=>col.name === "search")?.zodType;
207
- if (searchZodType && searchZodType instanceof z.ZodEnum) {
208
- def.search = Object.keys(searchZodType.enum)[0];
209
- def.hasSearch = true;
210
- }
211
- return def;
212
- }
213
- async render({ entityId }) {
214
- const { getColumnsNode } = await import("../entity-converter.js");
215
- const { getZodTypeById, zodTypeToRenderingNode } = await import("../zod-converter.js");
216
- const columnsNode = await getColumnsNode(entityId, "A");
217
- const listParamsZodType = await getZodTypeById(`${entityId}ListParams`);
218
- const listParamsNode = zodTypeToRenderingNode(listParamsZodType);
219
- const names = EntityManager.getNamesFromId(entityId);
220
- const entity = EntityManager.get(entityId);
221
- // PK 타입 감지
222
- const pkType = entity.getPkType();
223
- const idTsType = pkType === "string" || pkType === "uuid" ? "string" : "number";
224
- // 실제 리스트 컬럼
225
- const columns = columnsNode.children.sort((a, b)=>a.name === "id" ? -1 : b.name === "id" ? 1 : 0).map((col)=>{
226
- const rendered = this.renderColumn(entityId, col, names);
227
- // 라벨 생성: common 필드(created_at)는 SD("common.{field}"), entity 필드는 SD("entity.{Entity}.{field}")
228
- let label;
229
- if (col.name === "id") {
230
- label = '"ID"';
231
- } else if ([
232
- "created_at"
233
- ].includes(col.name)) {
234
- // camelCase로 변환 (created_at -> createdAt)
235
- const camelName = col.name.replace(/_([a-z])/g, (_, char)=>char.toUpperCase());
236
- label = `SD("common.${camelName}")`;
237
- } else {
238
- const labelName = getRelationNameFromColumnName(entityId, col.name);
239
- label = `SD("entity.${names.capital}.${labelName}")`;
240
- }
241
- return {
242
- name: col.name,
243
- label,
244
- tc: `(row) => ${rendered}`,
245
- fit: col.name === "id" || col.renderType === "number-id" || col.renderType === "datetime" || col.renderType === "string-datetime",
246
- align: col.name === "id" || col.renderType === "number-id" ? "center" : undefined
247
- };
248
- });
249
- // 필터 컬럼
250
- const filterColumns = listParamsNode.children.filter((col)=>col.name !== "id" && col.name !== "queryMode" && [
251
- "enums",
252
- "number-id",
253
- "number-fk_id",
254
- "string-fk_id"
255
- ].includes(col.renderType))// orderBy가 가장 뒤로 오게 순서 조정
256
- .sort((a)=>{
257
- return a.name === "orderBy" ? 1 : -1;
258
- });
259
- // 필터 컬럼을 프리 템플릿으로 설정
260
- const preTemplates = [];
261
- // 컬럼에서 사용하는 enum들 수집
262
- const columnEnums = [];
263
- (columnsNode.children ?? []).forEach((col)=>{
264
- if (col.renderType === "enums") {
265
- try {
266
- const { id: enumId } = getEnumInfoFromColName(entityId, col.name);
267
- columnEnums.push(enumId);
268
- } catch {}
269
- }
270
- });
271
- // 디폴트 파라미터
272
- // const def = this.getDefault(filterColumns);
273
- return {
274
- ...this.getTargetAndPath(names),
275
- body: `
7
+
8
+ //#region src/template/implementations/view_list.template.ts
9
+ init_entity_manager();
10
+ init_helpers();
11
+ init_template();
12
+ var Template__view_list = class extends Template {
13
+ constructor() {
14
+ super("view_list");
15
+ }
16
+ getTargetAndPath(names) {
17
+ return {
18
+ target: "web/src/routes/admin",
19
+ path: `${names.fsPlural}/index.tsx`
20
+ };
21
+ }
22
+ getRequiredDictKeys() {
23
+ return ["entity.listManage", "common.all"];
24
+ }
25
+ wrapTc(body, key, collapsing = true, className = "") {
26
+ return `<Table.Cell key="${key}"${collapsing ? " collapsing" : ""}${className ? ` className={\`${className}\`}` : ""}>${body}</Table.Cell>`;
27
+ }
28
+ renderColumn(entityId, col, names, parentObj = "row", withoutName = false) {
29
+ let colName;
30
+ if (withoutName) {
31
+ colName = parentObj;
32
+ } else if (col.name.includes(".")) {
33
+ const parts = col.name.split(".");
34
+ colName = `${parentObj}.${parts.join("?.")}`;
35
+ } else {
36
+ colName = `${parentObj}.${col.name}`;
37
+ }
38
+ switch (col.renderType) {
39
+ case "string-plain":
40
+ case "string-date":
41
+ case "number-id":
42
+ case "string-id": return `<>{${colName}}</>`;
43
+ case "number-fk_id":
44
+ case "string-fk_id": {
45
+ try {
46
+ const baseName = col.name.includes(".") ? (col.name.split(".").pop() ?? col.name).replace("_id", "") : col.name.replace("_id", "");
47
+ const relPropFk = getRelationPropFromColName(entityId, baseName);
48
+ return `<>${relPropFk.with}#{${colName}}</>`;
49
+ } catch {
50
+ return `<>{${colName}}</>`;
51
+ }
52
+ }
53
+ case "datetime": if (col.nullable || col.name.includes(".")) {
54
+ return `<span>{${colName} ? datetimeF(${colName}) : '-'}</span>`;
55
+ } else {
56
+ return `<span>{datetimeF(${colName})}</span>`;
57
+ }
58
+ case "string-datetime": if (col.nullable || col.name.includes(".")) {
59
+ return `<span>{${colName} ? dateF(${colName}) : '-'}</span>`;
60
+ } else {
61
+ return `<span>{dateF(${colName})}</span>`;
62
+ }
63
+ case "boolean": return `<>{${colName} ? <Badge variant="default">O</Badge> : <Badge variant="secondary">X</Badge>}</>`;
64
+ case "enums": {
65
+ try {
66
+ const { id: enumId } = getEnumInfoFromColName(entityId, col.name);
67
+ return `<>{${col.nullable ? `${colName} && ` : ""}${enumId}Label[${colName}]}</>`;
68
+ } catch {
69
+ return `<>{${colName}}</>`;
70
+ }
71
+ }
72
+ case "array-images": return `<div className="flex gap-1">{ ${colName}?.map((r, i) => ${col.nullable ? `r && ` : ""}<img key={i} src={r} alt={\`${col.label ?? col.name} \${i + 1}\`} className="h-8 w-8 object-cover rounded" />) }</div>`;
73
+ case "json-sonamufile": return `<div className="flex items-center gap-2">{${colName} ? <img src={${colName}.url} alt={${colName}.name} className="h-8 w-8 object-cover rounded" /> : '-'}</div>`;
74
+ case "json-sonamufile-array": return `<div className="flex gap-1">{ ${colName}?.map((r, i) => ${col.nullable ? `r && ` : ""}<img key={i} src={r.url} alt={\`${col.label ?? col.name} \${i + 1}\`} className="h-8 w-8 object-cover rounded" />) }</div>`;
75
+ case "number-plain": return `<>{${col.nullable || col.name.includes(".") ? `${colName} && ` : ""}numF(${colName})}</>`;
76
+ case "object": return `<span className="text-xs">{${col.nullable ? `${colName} ? ` : ""}JSON.stringify(${colName})${col.nullable ? ` : '-'` : ""}}</span>`;
77
+ case "object-pick": {
78
+ const pickedChild = col.children?.find((child) => child.name === col.config?.picked);
79
+ if (!pickedChild) {
80
+ throw new Error(`object-pick 선택 실패 (오브젝트: ${col.name})`);
81
+ }
82
+ return this.renderColumn(entityId, pickedChild, names, `${colName}${col.nullable ? "?" : ""}`);
83
+ }
84
+ case "array": return `<>{ /* array ${colName} */ }</>`;
85
+ case "vector": return `<>{${col.nullable ? `${colName} ? ` : ""}[Vector: {${colName}${col.nullable ? "" : " ?? []"}.length}d]${col.nullable ? " : '-'" : ""}}</>`;
86
+ default: throw new Error(`렌더 불가 컬럼 ${col.renderType}`);
87
+ }
88
+ }
89
+ renderColumnImport(entityId, col, names) {
90
+ if (col.renderType === "enums") {
91
+ const { id: enumId } = getEnumInfoFromColName(names.capital, col.name);
92
+ return [`import { ${enumId}Label } from '@/services/sonamu.generated';`];
93
+ } else if (col.renderType === "object") {
94
+ try {
95
+ const relProp = getRelationPropFromColName(entityId, col.name);
96
+ const result = (col.children ?? []).map((child) => {
97
+ entityId = relProp.with;
98
+ names = EntityManager.getNamesFromId(relProp.with);
99
+ return this.renderColumnImport(entityId, child, names);
100
+ });
101
+ return flat(result);
102
+ } catch {
103
+ return [null];
104
+ }
105
+ } else if (col.renderType === "array") {
106
+ if (!col.element) return [null];
107
+ return this.renderColumnImport(entityId, col.element, names);
108
+ }
109
+ return [null];
110
+ }
111
+ renderFilterImport(entityId, col, names) {
112
+ if (col.name === "search") {
113
+ return `import { ${names.capital}SearchInput } from "@/components/${names.fs}/${names.capital}SearchInput";`;
114
+ } else if (col.renderType === "enums") {
115
+ if (col.name === "orderBy") {
116
+ const componentId = `${names.capital}${inflection.camelize(col.name)}Select`;
117
+ return `import { ${componentId} } from "@/components/${names.fs}/${componentId}";`;
118
+ } else {
119
+ try {
120
+ const { id, targetEntityNames: targetMDNames } = getEnumInfoFromColName(entityId, col.name);
121
+ const componentId = `${id}Select`;
122
+ return `import { ${componentId} } from "@/components/${targetMDNames.fs}/${componentId}";`;
123
+ } catch {
124
+ return "";
125
+ }
126
+ }
127
+ } else if (col.renderType === "number-fk_id" || col.renderType === "string-fk_id") {
128
+ try {
129
+ const relProp = getRelationPropFromColName(entityId, col.name.replace("_id", ""));
130
+ const targetNames = EntityManager.getNamesFromId(relProp.with);
131
+ const componentId = `${relProp.with}IdAsyncSelect`;
132
+ return `import { ${componentId} } from "@/components/${targetNames.fs}/${componentId}";`;
133
+ } catch {
134
+ return "";
135
+ }
136
+ } else {
137
+ throw new Error(`렌더 불가능한 필터 임포트 ${col.name} ${col.renderType}`);
138
+ }
139
+ }
140
+ renderFilter(entityId, col, names) {
141
+ if (col.name === "search") {
142
+ return "";
143
+ }
144
+ const isClearable = col.optional === true && col.name !== "orderBy";
145
+ let componentId;
146
+ if (col.renderType === "enums") {
147
+ if (col.name === "orderBy") {
148
+ componentId = `${names.capital}${inflection.camelize(col.name)}Select`;
149
+ } else {
150
+ try {
151
+ const { id } = getEnumInfoFromColName(entityId, col.name);
152
+ componentId = `${id}Select`;
153
+ } catch {
154
+ return "";
155
+ }
156
+ }
157
+ return `<${componentId} {...register('${col.name}')} ${isClearable ? "clearable" : ""} />`;
158
+ } else if (col.renderType === "number-fk_id" || col.renderType === "string-fk_id") {
159
+ try {
160
+ const relProp = getRelationPropFromColName(entityId, col.name.replace("_id", ""));
161
+ componentId = `${relProp.with}IdAsyncSelect`;
162
+ return `<${componentId} {...register('${col.name}')} ${isClearable ? "clearable" : ""} subset="A" />`;
163
+ } catch {
164
+ return "";
165
+ }
166
+ } else {
167
+ throw new Error(`렌더 불가능한 필터 임포트 ${col.name} ${col.renderType}`);
168
+ }
169
+ }
170
+ getDefault(columns) {
171
+ const def = {
172
+ orderBy: "",
173
+ search: "",
174
+ hasSearch: false,
175
+ hasOrderBy: false
176
+ };
177
+ const orderByZodType = columns.find((col) => col.name === "orderBy")?.zodType;
178
+ if (orderByZodType && orderByZodType instanceof z$1.ZodEnum) {
179
+ def.orderBy = Object.keys(orderByZodType.enum)[0];
180
+ def.hasOrderBy = true;
181
+ }
182
+ const searchZodType = columns.find((col) => col.name === "search")?.zodType;
183
+ if (searchZodType && searchZodType instanceof z$1.ZodEnum) {
184
+ def.search = Object.keys(searchZodType.enum)[0];
185
+ def.hasSearch = true;
186
+ }
187
+ return def;
188
+ }
189
+ async render({ entityId }) {
190
+ const { getColumnsNode } = await import("../entity-converter.js");
191
+ const { getZodTypeById, zodTypeToRenderingNode } = await import("../zod-converter.js");
192
+ const columnsNode = await getColumnsNode(entityId, "A");
193
+ const listParamsZodType = await getZodTypeById(`${entityId}ListParams`);
194
+ const listParamsNode = zodTypeToRenderingNode(listParamsZodType);
195
+ const names = EntityManager.getNamesFromId(entityId);
196
+ const entity = EntityManager.get(entityId);
197
+ const pkType = entity.getPkType();
198
+ const idTsType = pkType === "string" || pkType === "uuid" ? "string" : "number";
199
+ const columns = columnsNode.children.toSorted((a, b) => a.name === "id" ? -1 : b.name === "id" ? 1 : 0).map((col) => {
200
+ const rendered = this.renderColumn(entityId, col, names);
201
+ let label;
202
+ if (col.name === "id") {
203
+ label = "\"ID\"";
204
+ } else if (["created_at"].includes(col.name)) {
205
+ const camelName = col.name.replace(/_([a-z])/g, (_, char) => char.toUpperCase());
206
+ label = `SD("common.${camelName}")`;
207
+ } else {
208
+ const labelName = getRelationNameFromColumnName(entityId, col.name);
209
+ label = `SD("entity.${names.capital}.${labelName}")`;
210
+ }
211
+ return {
212
+ name: col.name,
213
+ label,
214
+ tc: `(row) => ${rendered}`,
215
+ fit: col.name === "id" || col.renderType === "number-id" || col.renderType === "datetime" || col.renderType === "string-datetime",
216
+ align: col.name === "id" || col.renderType === "number-id" ? "center" : undefined
217
+ };
218
+ });
219
+ const filterColumns = listParamsNode.children.filter((col) => col.name !== "id" && col.name !== "queryMode" && [
220
+ "enums",
221
+ "number-id",
222
+ "number-fk_id",
223
+ "string-fk_id"
224
+ ].includes(col.renderType)).toSorted((a) => {
225
+ return a.name === "orderBy" ? 1 : -1;
226
+ });
227
+ const preTemplates = [];
228
+ const columnEnums = [];
229
+ (columnsNode.children ?? []).forEach((col) => {
230
+ if (col.renderType === "enums") {
231
+ try {
232
+ const { id: enumId } = getEnumInfoFromColName(entityId, col.name);
233
+ columnEnums.push(enumId);
234
+ } catch {}
235
+ }
236
+ });
237
+ return {
238
+ ...this.getTargetAndPath(names),
239
+ body: `
276
240
  import { useState, Fragment } from "react";
277
241
  import { createFileRoute, useNavigate } from "@tanstack/react-router";
278
242
 
@@ -290,57 +254,42 @@ import { useListParams, numF, dateF, datetimeF } from "@sonamu-kit/react-compone
290
254
  import { ${names.capital}SubsetA, ${names.capital}BaseSchema } from "@/services/sonamu.generated";
291
255
  import { ${names.capital}Service } from "@/services/services.generated";
292
256
  import { ${names.capital}ListParams } from "@/services/${names.fs}/${names.fs}.types";
293
- import { ${(()=>{
294
- // 기본 enum 수집 (filterColumns에 있는 것만)
295
- const baseEnums = [];
296
- if (filterColumns.some((col)=>col.name === "orderBy")) {
297
- baseEnums.push(`${names.capital}OrderBy`, `${names.capital}OrderByLabel`);
298
- }
299
- if (filterColumns.some((col)=>col.name === "search")) {
300
- baseEnums.push(`${names.capital}SearchField`, `${names.capital}SearchFieldLabel`);
301
- }
302
- // 필터 enum 수집 (config.enumId 우선, 없으면 getEnumInfoFromColName)
303
- const filterEnumIds = filterColumns.filter((col)=>col.renderType === "enums" && col.name !== "search" && col.name !== "orderBy").map((col)=>{
304
- if (col.config && "enumId" in col.config) {
305
- return col.config.enumId;
306
- }
307
- try {
308
- const { id: enumId } = getEnumInfoFromColName(entityId, col.name);
309
- return enumId;
310
- } catch {
311
- return null;
312
- }
313
- }).filter(Boolean);
314
- // 모든 enum 합치고 중복 제거
315
- const allEnums = [
316
- ...new Set([
317
- ...filterEnumIds,
318
- ...columnEnums
319
- ])
320
- ];
321
- const enumImports = allEnums.flatMap((enumId)=>[
322
- `${enumId}`,
323
- `${enumId}Label`
324
- ]);
325
- return [
326
- ...baseEnums,
327
- ...enumImports
328
- ].join(", ");
329
- })()} } from "@/services/sonamu.generated";
257
+ import { ${(() => {
258
+ const baseEnums = [];
259
+ if (filterColumns.some((col) => col.name === "orderBy")) {
260
+ baseEnums.push(`${names.capital}OrderBy`, `${names.capital}OrderByLabel`);
261
+ }
262
+ if (filterColumns.some((col) => col.name === "search")) {
263
+ baseEnums.push(`${names.capital}SearchField`, `${names.capital}SearchFieldLabel`);
264
+ }
265
+ const filterEnumIds = filterColumns.filter((col) => col.renderType === "enums" && col.name !== "search" && col.name !== "orderBy").map((col) => {
266
+ if (col.config && "enumId" in col.config) {
267
+ return col.config.enumId;
268
+ }
269
+ try {
270
+ const { id: enumId } = getEnumInfoFromColName(entityId, col.name);
271
+ return enumId;
272
+ } catch {
273
+ return null;
274
+ }
275
+ }).filter(Boolean);
276
+ const allEnums = [...new Set([...filterEnumIds, ...columnEnums])];
277
+ const enumImports = allEnums.flatMap((enumId) => [`${enumId}`, `${enumId}Label`]);
278
+ return [...baseEnums, ...enumImports].join(", ");
279
+ })()} } from "@/services/sonamu.generated";
330
280
  import { IdAsyncSelect } from "@sonamu-kit/react-components/components";
331
- ${(()=>{
332
- // FK 필드의 AsyncIdConfig import
333
- const fkColumns = filterColumns.filter((col)=>col.renderType === "number-fk_id" || col.renderType === "string-fk_id");
334
- const configNames = fkColumns.map((col)=>{
335
- try {
336
- const relProp = getRelationPropFromColName(entityId, col.name.replace("_id", ""));
337
- return `${relProp.with}AsyncIdConfig`;
338
- } catch {
339
- return "";
340
- }
341
- }).filter(Boolean);
342
- return configNames.length > 0 ? `import { ${configNames.join(", ")} } from "@/services/services.generated";` : "";
343
- })()}
281
+ ${(() => {
282
+ const fkColumns = filterColumns.filter((col) => col.renderType === "number-fk_id" || col.renderType === "string-fk_id");
283
+ const configNames = fkColumns.map((col) => {
284
+ try {
285
+ const relProp = getRelationPropFromColName(entityId, col.name.replace("_id", ""));
286
+ return `${relProp.with}AsyncIdConfig`;
287
+ } catch {
288
+ return "";
289
+ }
290
+ }).filter(Boolean);
291
+ return configNames.length > 0 ? `import { ${configNames.join(", ")} } from "@/services/services.generated";` : "";
292
+ })()}
344
293
 
345
294
  import EditIcon from "~icons/lucide/square-pen";
346
295
  import TrashIcon from "~icons/lucide/trash-2";
@@ -365,8 +314,8 @@ function ${names.capital}List({}: ${names.capital}ListProps) {
365
314
  const { listParams, register, setListParams } = useListParams(${names.capital}ListParams, {
366
315
  num: 10,
367
316
  page: 1,
368
- keyword: "",${filterColumns.some((col)=>col.name === "search") ? `
369
- search: ${names.capital}SearchField.options[0],` : ""}${filterColumns.some((col)=>col.name === "orderBy") ? `
317
+ keyword: "",${filterColumns.some((col) => col.name === "search") ? `
318
+ search: ${names.capital}SearchField.options[0],` : ""}${filterColumns.some((col) => col.name === "orderBy") ? `
370
319
  orderBy: ${names.capital}OrderBy.options[0],` : ""}
371
320
  sonamuFilter: {},
372
321
  });
@@ -384,7 +333,7 @@ function ${names.capital}List({}: ${names.capital}ListProps) {
384
333
  // 컬럼 정의
385
334
  type ${names.capital}Row = NonNullable<typeof rows>[number];
386
335
  const columns: TableCol<${names.capital}Row>[] = [
387
- ${columns.map((col)=>` {
336
+ ${columns.map((col) => ` {
388
337
  label: ${col.label},
389
338
  tc: ${col.tc},${col.fit ? `
390
339
  fit: true,` : ""}${col.align ? `
@@ -467,7 +416,7 @@ ${columns.map((col)=>` {
467
416
  {/* Filters */}
468
417
  <div className="bg-gray-100 px-6 py-4 space-y-3">
469
418
  <div className="flex items-center gap-3 flex-wrap">
470
- ${filterColumns.some((col)=>col.name === "search") ? ` <EnumSelect
419
+ ${filterColumns.some((col) => col.name === "search") ? ` <EnumSelect
471
420
  enum={${names.capital}SearchField}
472
421
  labels={${names.capital}SearchFieldLabel}
473
422
  {...register("search")}
@@ -522,12 +471,11 @@ ${filterColumns.some((col)=>col.name === "search") ? ` <EnumSel
522
471
  </div>
523
472
 
524
473
  <div className="flex items-center gap-3 flex-wrap">
525
- ${filterColumns.filter((col)=>col.name !== "search" && col.name !== "orderBy").map((col)=>{
526
- if (col.renderType === "enums") {
527
- try {
528
- // config.enumId 있으면 우선 사용, 없으면 getEnumInfoFromColName 시도
529
- const enumId = col.config && "enumId" in col.config ? col.config.enumId : getEnumInfoFromColName(entityId, col.name).id;
530
- return ` <EnumSelect
474
+ ${filterColumns.filter((col) => col.name !== "search" && col.name !== "orderBy").map((col) => {
475
+ if (col.renderType === "enums") {
476
+ try {
477
+ const enumId = col.config && "enumId" in col.config ? col.config.enumId : getEnumInfoFromColName(entityId, col.name).id;
478
+ return ` <EnumSelect
531
479
  key={\`${col.name}-\${listParams.${col.name}}\`}
532
480
  enum={${enumId}}
533
481
  labels={${enumId}Label}
@@ -536,15 +484,14 @@ ${filterColumns.filter((col)=>col.name !== "search" && col.name !== "orderBy").m
536
484
  clearable
537
485
  className="w-50 h-8 bg-white border-gray-300 text-xs"
538
486
  />`;
539
- } catch {
540
- return "";
541
- }
542
- }
543
- // FK 필드 (IdAsyncSelect)
544
- if (col.renderType === "number-fk_id" || col.renderType === "string-fk_id") {
545
- try {
546
- const relProp = getRelationPropFromColName(entityId, col.name.replace("_id", ""));
547
- return ` <IdAsyncSelect
487
+ } catch {
488
+ return "";
489
+ }
490
+ }
491
+ if (col.renderType === "number-fk_id" || col.renderType === "string-fk_id") {
492
+ try {
493
+ const relProp = getRelationPropFromColName(entityId, col.name.replace("_id", ""));
494
+ return ` <IdAsyncSelect
548
495
  config={${relProp.with}AsyncIdConfig}
549
496
  subset="A"
550
497
  {...register("${col.name}")}
@@ -552,13 +499,13 @@ ${filterColumns.filter((col)=>col.name !== "search" && col.name !== "orderBy").m
552
499
  clearable
553
500
  className="w-50 h-8 text-xs"
554
501
  />`;
555
- } catch {
556
- return "";
557
- }
558
- }
559
- return "";
560
- }).filter(Boolean).join("\n")}
561
- ${filterColumns.some((col)=>col.name === "orderBy") ? ` <EnumSelect
502
+ } catch {
503
+ return "";
504
+ }
505
+ }
506
+ return "";
507
+ }).filter(Boolean).join("\n")}
508
+ ${filterColumns.some((col) => col.name === "orderBy") ? ` <EnumSelect
562
509
  enum={${names.capital}OrderBy}
563
510
  labels={${names.capital}OrderByLabel}
564
511
  {...register("orderBy")}
@@ -652,10 +599,12 @@ ${filterColumns.some((col)=>col.name === "orderBy") ? ` <EnumSe
652
599
  );
653
600
  }
654
601
  `.trim(),
655
- importKeys: [],
656
- preTemplates
657
- };
658
- }
659
- }
602
+ importKeys: [],
603
+ preTemplates
604
+ };
605
+ }
606
+ };
660
607
 
661
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy90ZW1wbGF0ZS9pbXBsZW1lbnRhdGlvbnMvdmlld19saXN0LnRlbXBsYXRlLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBpbmZsZWN0aW9uIGZyb20gXCJpbmZsZWN0aW9uXCI7XG5pbXBvcnQgeyBmbGF0IH0gZnJvbSBcInJhZGFzaGlcIjtcbmltcG9ydCB7IHogfSBmcm9tIFwiem9kXCI7XG5pbXBvcnQgeyBFbnRpdHlNYW5hZ2VyLCB0eXBlIEVudGl0eU5hbWVzUmVjb3JkIH0gZnJvbSBcIi4uLy4uL2VudGl0eS9lbnRpdHktbWFuYWdlclwiO1xuaW1wb3J0IHR5cGUgeyBSZW5kZXJpbmdOb2RlLCBUZW1wbGF0ZU9wdGlvbnMgfSBmcm9tIFwiLi4vLi4vdHlwZXMvdHlwZXNcIjtcbmltcG9ydCB7XG4gIGdldEVudW1JbmZvRnJvbUNvbE5hbWUsXG4gIGdldFJlbGF0aW9uTmFtZUZyb21Db2x1bW5OYW1lLFxuICBnZXRSZWxhdGlvblByb3BGcm9tQ29sTmFtZSxcbn0gZnJvbSBcIi4uL2hlbHBlcnNcIjtcbmltcG9ydCB0eXBlIHsgUmVuZGVyZWRUZW1wbGF0ZSB9IGZyb20gXCIuLi90ZW1wbGF0ZVwiO1xuaW1wb3J0IHsgVGVtcGxhdGUgfSBmcm9tIFwiLi4vdGVtcGxhdGVcIjtcblxuZXhwb3J0IGNsYXNzIFRlbXBsYXRlX192aWV3X2xpc3QgZXh0ZW5kcyBUZW1wbGF0ZSB7XG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHN1cGVyKFwidmlld19saXN0XCIpO1xuICB9XG5cbiAgZ2V0VGFyZ2V0QW5kUGF0aChuYW1lczogRW50aXR5TmFtZXNSZWNvcmQpIHtcbiAgICByZXR1cm4ge1xuICAgICAgdGFyZ2V0OiBcIndlYi9zcmMvcm91dGVzL2FkbWluXCIsXG4gICAgICBwYXRoOiBgJHtuYW1lcy5mc1BsdXJhbH0vaW5kZXgudHN4YCxcbiAgICB9O1xuICB9XG5cbiAgb3ZlcnJpZGUgZ2V0UmVxdWlyZWREaWN0S2V5cygpOiBzdHJpbmdbXSB8IG51bGwge1xuICAgIHJldHVybiBbXCJlbnRpdHkubGlzdE1hbmFnZVwiLCBcImNvbW1vbi5hbGxcIl07XG4gIH1cblxuICB3cmFwVGMoYm9keTogc3RyaW5nLCBrZXk6IHN0cmluZywgY29sbGFwc2luZzogYm9vbGVhbiA9IHRydWUsIGNsYXNzTmFtZTogc3RyaW5nID0gXCJcIikge1xuICAgIHJldHVybiBgPFRhYmxlLkNlbGwga2V5PVwiJHtrZXl9XCIke2NvbGxhcHNpbmcgPyBcIiBjb2xsYXBzaW5nXCIgOiBcIlwifSR7XG4gICAgICBjbGFzc05hbWUgPyBgIGNsYXNzTmFtZT17XFxgJHtjbGFzc05hbWV9XFxgfWAgOiBcIlwiXG4gICAgfT4ke2JvZHl9PC9UYWJsZS5DZWxsPmA7XG4gIH1cblxuICByZW5kZXJDb2x1bW4oXG4gICAgZW50aXR5SWQ6IHN0cmluZyxcbiAgICBjb2w6IFJlbmRlcmluZ05vZGUsXG4gICAgbmFtZXM6IEVudGl0eU5hbWVzUmVjb3JkLFxuICAgIHBhcmVudE9iajogc3RyaW5nID0gXCJyb3dcIixcbiAgICB3aXRob3V0TmFtZTogYm9vbGVhbiA9IGZhbHNlLFxuICApOiBzdHJpbmcge1xuICAgIC8vIOykkeyyqSDqsr3roZwg7LKY66asICjsmIg6IFwidXNlci5uYW1lXCIgLT4gXCJyb3cudXNlcj8ubmFtZVwiKVxuICAgIGxldCBjb2xOYW1lOiBzdHJpbmc7XG4gICAgaWYgKHdpdGhvdXROYW1lKSB7XG4gICAgICBjb2xOYW1lID0gcGFyZW50T2JqO1xuICAgIH0gZWxzZSBpZiAoY29sLm5hbWUuaW5jbHVkZXMoXCIuXCIpKSB7XG4gICAgICAvLyDspJHssqkg6rK966Gc64qUIG9wdGlvbmFsIGNoYWluaW5n7Jy866GcIOuzgO2ZmFxuICAgICAgY29uc3QgcGFydHMgPSBjb2wubmFtZS5zcGxpdChcIi5cIik7XG4gICAgICBjb2xOYW1lID0gYCR7cGFyZW50T2JqfS4ke3BhcnRzLmpvaW4oXCI/LlwiKX1gO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb2xOYW1lID0gYCR7cGFyZW50T2JqfS4ke2NvbC5uYW1lfWA7XG4gICAgfVxuXG4gICAgc3dpdGNoIChjb2wucmVuZGVyVHlwZSkge1xuICAgICAgY2FzZSBcInN0cmluZy1wbGFpblwiOlxuICAgICAgY2FzZSBcInN0cmluZy1kYXRlXCI6XG4gICAgICBjYXNlIFwibnVtYmVyLWlkXCI6XG4gICAgICBjYXNlIFwic3RyaW5nLWlkXCI6XG4gICAgICAgIHJldHVybiBgPD57JHtjb2xOYW1lfX08Lz5gO1xuICAgICAgY2FzZSBcIm51bWJlci1ma19pZFwiOlxuICAgICAgY2FzZSBcInN0cmluZy1ma19pZFwiOiB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgY29uc3QgYmFzZU5hbWUgPSBjb2wubmFtZS5pbmNsdWRlcyhcIi5cIilcbiAgICAgICAgICAgID8gKGNvbC5uYW1lLnNwbGl0KFwiLlwiKS5wb3AoKSA/PyBjb2wubmFtZSkucmVwbGFjZShcIl9pZFwiLCBcIlwiKVxuICAgICAgICAgICAgOiBjb2wubmFtZS5yZXBsYWNlKFwiX2lkXCIsIFwiXCIpO1xuICAgICAgICAgIGNvbnN0IHJlbFByb3BGayA9IGdldFJlbGF0aW9uUHJvcEZyb21Db2xOYW1lKGVudGl0eUlkLCBiYXNlTmFtZSk7XG4gICAgICAgICAgcmV0dXJuIGA8PiR7cmVsUHJvcEZrLndpdGh9I3ske2NvbE5hbWV9fTwvPmA7XG4gICAgICAgIH0gY2F0Y2gge1xuICAgICAgICAgIHJldHVybiBgPD57JHtjb2xOYW1lfX08Lz5gO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBjYXNlIFwiZGF0ZXRpbWVcIjpcbiAgICAgICAgaWYgKGNvbC5udWxsYWJsZSB8fCBjb2wubmFtZS5pbmNsdWRlcyhcIi5cIikpIHtcbiAgICAgICAgICByZXR1cm4gYDxzcGFuPnske2NvbE5hbWV9ID8gZGF0ZXRpbWVGKCR7Y29sTmFtZX0pIDogJy0nfTwvc3Bhbj5gO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJldHVybiBgPHNwYW4+e2RhdGV0aW1lRigke2NvbE5hbWV9KX08L3NwYW4+YDtcbiAgICAgICAgfVxuICAgICAgY2FzZSBcInN0cmluZy1kYXRldGltZVwiOlxuICAgICAgICBpZiAoY29sLm51bGxhYmxlIHx8IGNvbC5uYW1lLmluY2x1ZGVzKFwiLlwiKSkge1xuICAgICAgICAgIHJldHVybiBgPHNwYW4+eyR7Y29sTmFtZX0gPyBkYXRlRigke2NvbE5hbWV9KSA6ICctJ308L3NwYW4+YDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZXR1cm4gYDxzcGFuPntkYXRlRigke2NvbE5hbWV9KX08L3NwYW4+YDtcbiAgICAgICAgfVxuICAgICAgY2FzZSBcImJvb2xlYW5cIjpcbiAgICAgICAgcmV0dXJuIGA8Pnske2NvbE5hbWV9ID8gPEJhZGdlIHZhcmlhbnQ9XCJkZWZhdWx0XCI+TzwvQmFkZ2U+IDogPEJhZGdlIHZhcmlhbnQ9XCJzZWNvbmRhcnlcIj5YPC9CYWRnZT59PC8+YDtcbiAgICAgIGNhc2UgXCJlbnVtc1wiOiB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgY29uc3QgeyBpZDogZW51bUlkIH0gPSBnZXRFbnVtSW5mb0Zyb21Db2xOYW1lKGVudGl0eUlkLCBjb2wubmFtZSk7XG4gICAgICAgICAgcmV0dXJuIGA8Pnske2NvbC5udWxsYWJsZSA/IGAke2NvbE5hbWV9ICYmIGAgOiBcIlwifSR7ZW51bUlkfUxhYmVsWyR7Y29sTmFtZX1dfTwvPmA7XG4gICAgICAgIH0gY2F0Y2gge1xuICAgICAgICAgIHJldHVybiBgPD57JHtjb2xOYW1lfX08Lz5gO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBjYXNlIFwiYXJyYXktaW1hZ2VzXCI6XG4gICAgICAgIHJldHVybiBgPGRpdiBjbGFzc05hbWU9XCJmbGV4IGdhcC0xXCI+eyAke2NvbE5hbWV9Py5tYXAoKHIsIGkpID0+ICR7XG4gICAgICAgICAgY29sLm51bGxhYmxlID8gYHIgJiYgYCA6IFwiXCJcbiAgICAgICAgfTxpbWcga2V5PXtpfSBzcmM9e3J9IGFsdD17XFxgJHtjb2wubGFiZWwgPz8gY29sLm5hbWV9IFxcJHtpICsgMX1cXGB9IGNsYXNzTmFtZT1cImgtOCB3LTggb2JqZWN0LWNvdmVyIHJvdW5kZWRcIiAvPikgfTwvZGl2PmA7XG4gICAgICBjYXNlIFwianNvbi1zb25hbXVmaWxlXCI6XG4gICAgICAgIHJldHVybiBgPGRpdiBjbGFzc05hbWU9XCJmbGV4IGl0ZW1zLWNlbnRlciBnYXAtMlwiPnske2NvbE5hbWV9ID8gPGltZyBzcmM9eyR7Y29sTmFtZX0udXJsfSBhbHQ9eyR7Y29sTmFtZX0ubmFtZX0gY2xhc3NOYW1lPVwiaC04IHctOCBvYmplY3QtY292ZXIgcm91bmRlZFwiIC8+IDogJy0nfTwvZGl2PmA7XG4gICAgICBjYXNlIFwianNvbi1zb25hbXVmaWxlLWFycmF5XCI6XG4gICAgICAgIHJldHVybiBgPGRpdiBjbGFzc05hbWU9XCJmbGV4IGdhcC0xXCI+eyAke2NvbE5hbWV9Py5tYXAoKHIsIGkpID0+ICR7XG4gICAgICAgICAgY29sLm51bGxhYmxlID8gYHIgJiYgYCA6IFwiXCJcbiAgICAgICAgfTxpbWcga2V5PXtpfSBzcmM9e3IudXJsfSBhbHQ9e1xcYCR7Y29sLmxhYmVsID8/IGNvbC5uYW1lfSBcXCR7aSArIDF9XFxgfSBjbGFzc05hbWU9XCJoLTggdy04IG9iamVjdC1jb3ZlciByb3VuZGVkXCIgLz4pIH08L2Rpdj5gO1xuICAgICAgY2FzZSBcIm51bWJlci1wbGFpblwiOlxuICAgICAgICByZXR1cm4gYDw+eyR7Y29sLm51bGxhYmxlIHx8IGNvbC5uYW1lLmluY2x1ZGVzKFwiLlwiKSA/IGAke2NvbE5hbWV9ICYmIGAgOiBcIlwifW51bUYoJHtjb2xOYW1lfSl9PC8+YDtcbiAgICAgIGNhc2UgXCJvYmplY3RcIjpcbiAgICAgICAgcmV0dXJuIGA8c3BhbiBjbGFzc05hbWU9XCJ0ZXh0LXhzXCI+eyR7Y29sLm51bGxhYmxlID8gYCR7Y29sTmFtZX0gPyBgIDogXCJcIn1KU09OLnN0cmluZ2lmeSgke2NvbE5hbWV9KSR7Y29sLm51bGxhYmxlID8gYCA6ICctJ2AgOiBcIlwifX08L3NwYW4+YDtcbiAgICAgIGNhc2UgXCJvYmplY3QtcGlja1wiOiB7XG4gICAgICAgIGNvbnN0IHBpY2tlZENoaWxkID0gY29sLmNoaWxkcmVuPy5maW5kKChjaGlsZCkgPT4gY2hpbGQubmFtZSA9PT0gY29sLmNvbmZpZz8ucGlja2VkKTtcbiAgICAgICAgaWYgKCFwaWNrZWRDaGlsZCkge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgb2JqZWN0LXBpY2sg7ISg7YOdIOyLpO2MqCAo7Jik67iM7KCd7Yq4OiAke2NvbC5uYW1lfSlgKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5yZW5kZXJDb2x1bW4oXG4gICAgICAgICAgZW50aXR5SWQsXG4gICAgICAgICAgcGlja2VkQ2hpbGQsXG4gICAgICAgICAgbmFtZXMsXG4gICAgICAgICAgYCR7Y29sTmFtZX0ke2NvbC5udWxsYWJsZSA/IFwiP1wiIDogXCJcIn1gLFxuICAgICAgICApO1xuICAgICAgfVxuICAgICAgY2FzZSBcImFycmF5XCI6XG4gICAgICAgIHJldHVybiBgPD57IC8qIGFycmF5ICR7Y29sTmFtZX0gKi8gfTwvPmA7XG4gICAgICBjYXNlIFwidmVjdG9yXCI6XG4gICAgICAgIC8vIHZlY3RvciDtg4DsnoXsnYAg7LCo7JuQIOyImOunjCDtkZzsi5wgKOyLpOygnCDrjbDsnbTthLDripQg64SI66y0IOq5gClcbiAgICAgICAgcmV0dXJuIGA8Pnske2NvbC5udWxsYWJsZSA/IGAke2NvbE5hbWV9ID8gYCA6IFwiXCJ9W1ZlY3RvcjogeyR7Y29sTmFtZX0ke2NvbC5udWxsYWJsZSA/IFwiXCIgOiBcIiA/PyBbXVwifS5sZW5ndGh9ZF0ke2NvbC5udWxsYWJsZSA/IFwiIDogJy0nXCIgOiBcIlwifX08Lz5gO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGDroIzrjZQg67aI6rCAIOy7rOufvCAke2NvbC5yZW5kZXJUeXBlfWApO1xuICAgIH1cbiAgfVxuXG4gIHJlbmRlckNvbHVtbkltcG9ydChcbiAgICBlbnRpdHlJZDogc3RyaW5nLFxuICAgIGNvbDogUmVuZGVyaW5nTm9kZSxcbiAgICBuYW1lczogRW50aXR5TmFtZXNSZWNvcmQsXG4gICk6IChzdHJpbmcgfCBudWxsKVtdIHtcbiAgICBpZiAoY29sLnJlbmRlclR5cGUgPT09IFwiZW51bXNcIikge1xuICAgICAgY29uc3QgeyBpZDogZW51bUlkIH0gPSBnZXRFbnVtSW5mb0Zyb21Db2xOYW1lKG5hbWVzLmNhcGl0YWwsIGNvbC5uYW1lKTtcbiAgICAgIHJldHVybiBbYGltcG9ydCB7ICR7ZW51bUlkfUxhYmVsIH0gZnJvbSAnQC9zZXJ2aWNlcy9zb25hbXUuZ2VuZXJhdGVkJztgXTtcbiAgICB9IGVsc2UgaWYgKGNvbC5yZW5kZXJUeXBlID09PSBcIm9iamVjdFwiKSB7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCByZWxQcm9wID0gZ2V0UmVsYXRpb25Qcm9wRnJvbUNvbE5hbWUoZW50aXR5SWQsIGNvbC5uYW1lKTtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gKGNvbC5jaGlsZHJlbiA/PyBbXSkubWFwKChjaGlsZCkgPT4ge1xuICAgICAgICAgIGVudGl0eUlkID0gcmVsUHJvcC53aXRoO1xuICAgICAgICAgIG5hbWVzID0gRW50aXR5TWFuYWdlci5nZXROYW1lc0Zyb21JZChyZWxQcm9wLndpdGgpO1xuICAgICAgICAgIHJldHVybiB0aGlzLnJlbmRlckNvbHVtbkltcG9ydChlbnRpdHlJZCwgY2hpbGQsIG5hbWVzKTtcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiBmbGF0KHJlc3VsdCk7XG4gICAgICB9IGNhdGNoIHtcbiAgICAgICAgcmV0dXJuIFtudWxsXTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKGNvbC5yZW5kZXJUeXBlID09PSBcImFycmF5XCIpIHtcbiAgICAgIGlmICghY29sLmVsZW1lbnQpIHJldHVybiBbbnVsbF07XG4gICAgICByZXR1cm4gdGhpcy5yZW5kZXJDb2x1bW5JbXBvcnQoZW50aXR5SWQsIGNvbC5lbGVtZW50LCBuYW1lcyk7XG4gICAgfVxuXG4gICAgcmV0dXJuIFtudWxsXTtcbiAgfVxuXG4gIHJlbmRlckZpbHRlckltcG9ydChlbnRpdHlJZDogc3RyaW5nLCBjb2w6IFJlbmRlcmluZ05vZGUsIG5hbWVzOiBFbnRpdHlOYW1lc1JlY29yZCkge1xuICAgIGlmIChjb2wubmFtZSA9PT0gXCJzZWFyY2hcIikge1xuICAgICAgcmV0dXJuIGBpbXBvcnQgeyAke25hbWVzLmNhcGl0YWx9U2VhcmNoSW5wdXQgfSBmcm9tIFwiQC9jb21wb25lbnRzLyR7bmFtZXMuZnN9LyR7bmFtZXMuY2FwaXRhbH1TZWFyY2hJbnB1dFwiO2A7XG4gICAgfSBlbHNlIGlmIChjb2wucmVuZGVyVHlwZSA9PT0gXCJlbnVtc1wiKSB7XG4gICAgICBpZiAoY29sLm5hbWUgPT09IFwib3JkZXJCeVwiKSB7XG4gICAgICAgIGNvbnN0IGNvbXBvbmVudElkID0gYCR7bmFtZXMuY2FwaXRhbH0ke2luZmxlY3Rpb24uY2FtZWxpemUoY29sLm5hbWUpfVNlbGVjdGA7XG4gICAgICAgIHJldHVybiBgaW1wb3J0IHsgJHtjb21wb25lbnRJZH0gfSBmcm9tIFwiQC9jb21wb25lbnRzLyR7bmFtZXMuZnN9LyR7Y29tcG9uZW50SWR9XCI7YDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgY29uc3QgeyBpZCwgdGFyZ2V0RW50aXR5TmFtZXM6IHRhcmdldE1ETmFtZXMgfSA9IGdldEVudW1JbmZvRnJvbUNvbE5hbWUoXG4gICAgICAgICAgICBlbnRpdHlJZCxcbiAgICAgICAgICAgIGNvbC5uYW1lLFxuICAgICAgICAgICk7XG4gICAgICAgICAgY29uc3QgY29tcG9uZW50SWQgPSBgJHtpZH1TZWxlY3RgO1xuICAgICAgICAgIHJldHVybiBgaW1wb3J0IHsgJHtjb21wb25lbnRJZH0gfSBmcm9tIFwiQC9jb21wb25lbnRzLyR7dGFyZ2V0TUROYW1lcy5mc30vJHtjb21wb25lbnRJZH1cIjtgO1xuICAgICAgICB9IGNhdGNoIHtcbiAgICAgICAgICByZXR1cm4gXCJcIjtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoY29sLnJlbmRlclR5cGUgPT09IFwibnVtYmVyLWZrX2lkXCIgfHwgY29sLnJlbmRlclR5cGUgPT09IFwic3RyaW5nLWZrX2lkXCIpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHJlbFByb3AgPSBnZXRSZWxhdGlvblByb3BGcm9tQ29sTmFtZShlbnRpdHlJZCwgY29sLm5hbWUucmVwbGFjZShcIl9pZFwiLCBcIlwiKSk7XG4gICAgICAgIGNvbnN0IHRhcmdldE5hbWVzID0gRW50aXR5TWFuYWdlci5nZXROYW1lc0Zyb21JZChyZWxQcm9wLndpdGgpO1xuICAgICAgICBjb25zdCBjb21wb25lbnRJZCA9IGAke3JlbFByb3Aud2l0aH1JZEFzeW5jU2VsZWN0YDtcbiAgICAgICAgcmV0dXJuIGBpbXBvcnQgeyAke2NvbXBvbmVudElkfSB9IGZyb20gXCJAL2NvbXBvbmVudHMvJHt0YXJnZXROYW1lcy5mc30vJHtjb21wb25lbnRJZH1cIjtgO1xuICAgICAgfSBjYXRjaCB7XG4gICAgICAgIHJldHVybiBcIlwiO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYOugjOuNlCDrtojqsIDriqXtlZwg7ZWE7YSwIOyehO2PrO2KuCAke2NvbC5uYW1lfSAke2NvbC5yZW5kZXJUeXBlfWApO1xuICAgIH1cbiAgfVxuXG4gIHJlbmRlckZpbHRlcihlbnRpdHlJZDogc3RyaW5nLCBjb2w6IFJlbmRlcmluZ05vZGUsIG5hbWVzOiBFbnRpdHlOYW1lc1JlY29yZCkge1xuICAgIGlmIChjb2wubmFtZSA9PT0gXCJzZWFyY2hcIikge1xuICAgICAgcmV0dXJuIFwiXCI7XG4gICAgfVxuXG4gICAgY29uc3QgaXNDbGVhcmFibGUgPSBjb2wub3B0aW9uYWwgPT09IHRydWUgJiYgY29sLm5hbWUgIT09IFwib3JkZXJCeVwiO1xuICAgIGxldCBjb21wb25lbnRJZDogc3RyaW5nO1xuICAgIGlmIChjb2wucmVuZGVyVHlwZSA9PT0gXCJlbnVtc1wiKSB7XG4gICAgICBpZiAoY29sLm5hbWUgPT09IFwib3JkZXJCeVwiKSB7XG4gICAgICAgIGNvbXBvbmVudElkID0gYCR7bmFtZXMuY2FwaXRhbH0ke2luZmxlY3Rpb24uY2FtZWxpemUoY29sLm5hbWUpfVNlbGVjdGA7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGNvbnN0IHsgaWQgfSA9IGdldEVudW1JbmZvRnJvbUNvbE5hbWUoZW50aXR5SWQsIGNvbC5uYW1lKTtcbiAgICAgICAgICBjb21wb25lbnRJZCA9IGAke2lkfVNlbGVjdGA7XG4gICAgICAgIH0gY2F0Y2gge1xuICAgICAgICAgIHJldHVybiBcIlwiO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gYDwke2NvbXBvbmVudElkfSB7Li4ucmVnaXN0ZXIoJyR7Y29sLm5hbWV9Jyl9ICR7aXNDbGVhcmFibGUgPyBcImNsZWFyYWJsZVwiIDogXCJcIn0gLz5gO1xuICAgIH0gZWxzZSBpZiAoY29sLnJlbmRlclR5cGUgPT09IFwibnVtYmVyLWZrX2lkXCIgfHwgY29sLnJlbmRlclR5cGUgPT09IFwic3RyaW5nLWZrX2lkXCIpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHJlbFByb3AgPSBnZXRSZWxhdGlvblByb3BGcm9tQ29sTmFtZShlbnRpdHlJZCwgY29sLm5hbWUucmVwbGFjZShcIl9pZFwiLCBcIlwiKSk7XG4gICAgICAgIGNvbXBvbmVudElkID0gYCR7cmVsUHJvcC53aXRofUlkQXN5bmNTZWxlY3RgO1xuICAgICAgICByZXR1cm4gYDwke2NvbXBvbmVudElkfSB7Li4ucmVnaXN0ZXIoJyR7Y29sLm5hbWV9Jyl9ICR7XG4gICAgICAgICAgaXNDbGVhcmFibGUgPyBcImNsZWFyYWJsZVwiIDogXCJcIlxuICAgICAgICB9IHN1YnNldD1cIkFcIiAvPmA7XG4gICAgICB9IGNhdGNoIHtcbiAgICAgICAgcmV0dXJuIFwiXCI7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihg66CM642UIOu2iOqwgOuKpe2VnCDtlYTthLAg7J6E7Y+s7Yq4ICR7Y29sLm5hbWV9ICR7Y29sLnJlbmRlclR5cGV9YCk7XG4gICAgfVxuICB9XG5cbiAgZ2V0RGVmYXVsdChjb2x1bW5zOiBSZW5kZXJpbmdOb2RlW10pOiB7XG4gICAgb3JkZXJCeTogc3RyaW5nO1xuICAgIHNlYXJjaDogc3RyaW5nO1xuICAgIGhhc1NlYXJjaDogYm9vbGVhbjtcbiAgICBoYXNPcmRlckJ5OiBib29sZWFuO1xuICB9IHtcbiAgICBjb25zdCBkZWYgPSB7XG4gICAgICBvcmRlckJ5OiBcIlwiLFxuICAgICAgc2VhcmNoOiBcIlwiLFxuICAgICAgaGFzU2VhcmNoOiBmYWxzZSxcbiAgICAgIGhhc09yZGVyQnk6IGZhbHNlLFxuICAgIH07XG4gICAgY29uc3Qgb3JkZXJCeVpvZFR5cGUgPSBjb2x1bW5zLmZpbmQoKGNvbCkgPT4gY29sLm5hbWUgPT09IFwib3JkZXJCeVwiKT8uem9kVHlwZTtcbiAgICBpZiAob3JkZXJCeVpvZFR5cGUgJiYgb3JkZXJCeVpvZFR5cGUgaW5zdGFuY2VvZiB6LlpvZEVudW0pIHtcbiAgICAgIGRlZi5vcmRlckJ5ID0gT2JqZWN0LmtleXMob3JkZXJCeVpvZFR5cGUuZW51bSlbMF07XG4gICAgICBkZWYuaGFzT3JkZXJCeSA9IHRydWU7XG4gICAgfVxuICAgIGNvbnN0IHNlYXJjaFpvZFR5cGUgPSBjb2x1bW5zLmZpbmQoKGNvbCkgPT4gY29sLm5hbWUgPT09IFwic2VhcmNoXCIpPy56b2RUeXBlO1xuICAgIGlmIChzZWFyY2hab2RUeXBlICYmIHNlYXJjaFpvZFR5cGUgaW5zdGFuY2VvZiB6LlpvZEVudW0pIHtcbiAgICAgIGRlZi5zZWFyY2ggPSBPYmplY3Qua2V5cyhzZWFyY2hab2RUeXBlLmVudW0pWzBdO1xuICAgICAgZGVmLmhhc1NlYXJjaCA9IHRydWU7XG4gICAgfVxuICAgIHJldHVybiBkZWY7XG4gIH1cblxuICBhc3luYyByZW5kZXIoeyBlbnRpdHlJZCB9OiBUZW1wbGF0ZU9wdGlvbnNbXCJ2aWV3X2xpc3RcIl0pIHtcbiAgICBjb25zdCB7IGdldENvbHVtbnNOb2RlIH0gPSBhd2FpdCBpbXBvcnQoXCIuLi9lbnRpdHktY29udmVydGVyXCIpO1xuICAgIGNvbnN0IHsgZ2V0Wm9kVHlwZUJ5SWQsIHpvZFR5cGVUb1JlbmRlcmluZ05vZGUgfSA9IGF3YWl0IGltcG9ydChcIi4uL3pvZC1jb252ZXJ0ZXJcIik7XG5cbiAgICBjb25zdCBjb2x1bW5zTm9kZSA9IGF3YWl0IGdldENvbHVtbnNOb2RlKGVudGl0eUlkLCBcIkFcIik7XG4gICAgY29uc3QgbGlzdFBhcmFtc1pvZFR5cGUgPSBhd2FpdCBnZXRab2RUeXBlQnlJZChgJHtlbnRpdHlJZH1MaXN0UGFyYW1zYCk7XG4gICAgY29uc3QgbGlzdFBhcmFtc05vZGUgPSB6b2RUeXBlVG9SZW5kZXJpbmdOb2RlKGxpc3RQYXJhbXNab2RUeXBlKTtcblxuICAgIGNvbnN0IG5hbWVzID0gRW50aXR5TWFuYWdlci5nZXROYW1lc0Zyb21JZChlbnRpdHlJZCk7XG4gICAgY29uc3QgZW50aXR5ID0gRW50aXR5TWFuYWdlci5nZXQoZW50aXR5SWQpO1xuXG4gICAgLy8gUEsg7YOA7J6FIOqwkOyngFxuICAgIGNvbnN0IHBrVHlwZSA9IGVudGl0eS5nZXRQa1R5cGUoKTtcbiAgICBjb25zdCBpZFRzVHlwZSA9IHBrVHlwZSA9PT0gXCJzdHJpbmdcIiB8fCBwa1R5cGUgPT09IFwidXVpZFwiID8gXCJzdHJpbmdcIiA6IFwibnVtYmVyXCI7XG5cbiAgICAvLyDsi6TsoJwg66as7Iqk7Yq4IOy7rOufvFxuICAgIGNvbnN0IGNvbHVtbnMgPSAoY29sdW1uc05vZGUuY2hpbGRyZW4gYXMgUmVuZGVyaW5nTm9kZVtdKVxuXG4gICAgICAuc29ydCgoYSwgYikgPT4gKGEubmFtZSA9PT0gXCJpZFwiID8gLTEgOiBiLm5hbWUgPT09IFwiaWRcIiA/IDEgOiAwKSlcbiAgICAgIC5tYXAoKGNvbCkgPT4ge1xuICAgICAgICBjb25zdCByZW5kZXJlZCA9IHRoaXMucmVuZGVyQ29sdW1uKGVudGl0eUlkLCBjb2wsIG5hbWVzKTtcblxuICAgICAgICAvLyDrnbzrsqgg7IOd7ISxOiBjb21tb24g7ZWE65OcKGNyZWF0ZWRfYXQp64qUIFNEKFwiY29tbW9uLntmaWVsZH1cIiksIGVudGl0eSDtlYTrk5zripQgU0QoXCJlbnRpdHkue0VudGl0eX0ue2ZpZWxkfVwiKVxuICAgICAgICBsZXQgbGFiZWw6IHN0cmluZztcbiAgICAgICAgaWYgKGNvbC5uYW1lID09PSBcImlkXCIpIHtcbiAgICAgICAgICBsYWJlbCA9ICdcIklEXCInO1xuICAgICAgICB9IGVsc2UgaWYgKFtcImNyZWF0ZWRfYXRcIl0uaW5jbHVkZXMoY29sLm5hbWUpKSB7XG4gICAgICAgICAgLy8gY2FtZWxDYXNl66GcIOuzgO2ZmCAoY3JlYXRlZF9hdCAtPiBjcmVhdGVkQXQpXG4gICAgICAgICAgY29uc3QgY2FtZWxOYW1lID0gY29sLm5hbWUucmVwbGFjZSgvXyhbYS16XSkvZywgKF8sIGNoYXIpID0+IGNoYXIudG9VcHBlckNhc2UoKSk7XG4gICAgICAgICAgbGFiZWwgPSBgU0QoXCJjb21tb24uJHtjYW1lbE5hbWV9XCIpYDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBjb25zdCBsYWJlbE5hbWUgPSBnZXRSZWxhdGlvbk5hbWVGcm9tQ29sdW1uTmFtZShlbnRpdHlJZCwgY29sLm5hbWUpO1xuICAgICAgICAgIGxhYmVsID0gYFNEKFwiZW50aXR5LiR7bmFtZXMuY2FwaXRhbH0uJHtsYWJlbE5hbWV9XCIpYDtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgbmFtZTogY29sLm5hbWUsXG4gICAgICAgICAgbGFiZWwsXG4gICAgICAgICAgdGM6IGAocm93KSA9PiAke3JlbmRlcmVkfWAsXG4gICAgICAgICAgZml0OlxuICAgICAgICAgICAgY29sLm5hbWUgPT09IFwiaWRcIiB8fFxuICAgICAgICAgICAgY29sLnJlbmRlclR5cGUgPT09IFwibnVtYmVyLWlkXCIgfHxcbiAgICAgICAgICAgIGNvbC5yZW5kZXJUeXBlID09PSBcImRhdGV0aW1lXCIgfHxcbiAgICAgICAgICAgIGNvbC5yZW5kZXJUeXBlID09PSBcInN0cmluZy1kYXRldGltZVwiLFxuICAgICAgICAgIGFsaWduOiBjb2wubmFtZSA9PT0gXCJpZFwiIHx8IGNvbC5yZW5kZXJUeXBlID09PSBcIm51bWJlci1pZFwiID8gXCJjZW50ZXJcIiA6IHVuZGVmaW5lZCxcbiAgICAgICAgfTtcbiAgICAgIH0pO1xuXG4gICAgLy8g7ZWE7YSwIOy7rOufvFxuICAgIGNvbnN0IGZpbHRlckNvbHVtbnMgPSAobGlzdFBhcmFtc05vZGUuY2hpbGRyZW4gYXMgUmVuZGVyaW5nTm9kZVtdKVxuICAgICAgLmZpbHRlcihcbiAgICAgICAgKGNvbCkgPT5cbiAgICAgICAgICBjb2wubmFtZSAhPT0gXCJpZFwiICYmXG4gICAgICAgICAgY29sLm5hbWUgIT09IFwicXVlcnlNb2RlXCIgJiZcbiAgICAgICAgICBbXCJlbnVtc1wiLCBcIm51bWJlci1pZFwiLCBcIm51bWJlci1ma19pZFwiLCBcInN0cmluZy1ma19pZFwiXS5pbmNsdWRlcyhjb2wucmVuZGVyVHlwZSksXG4gICAgICApXG4gICAgICAvLyBvcmRlckJ56rCAIOqwgOyepSDrkqTroZwg7Jik6rKMIOyInOyEnCDsobDsoJVcbiAgICAgIC5zb3J0KChhKSA9PiB7XG4gICAgICAgIHJldHVybiBhLm5hbWUgPT09IFwib3JkZXJCeVwiID8gMSA6IC0xO1xuICAgICAgfSk7XG5cbiAgICAvLyDtlYTthLAg7Lus65+87J2EIO2UhOumrCDthZztlIzrpr/snLzroZwg7ISk7KCVXG4gICAgY29uc3QgcHJlVGVtcGxhdGVzOiBSZW5kZXJlZFRlbXBsYXRlW1wicHJlVGVtcGxhdGVzXCJdID0gW107XG5cbiAgICAvLyDsu6zrn7zsl5DshJwg7IKs7Jqp7ZWY64qUIGVudW3rk6Qg7IiY7KeRXG4gICAgY29uc3QgY29sdW1uRW51bXM6IHN0cmluZ1tdID0gW107XG4gICAgKGNvbHVtbnNOb2RlLmNoaWxkcmVuID8/IFtdKS5mb3JFYWNoKChjb2wpID0+IHtcbiAgICAgIGlmIChjb2wucmVuZGVyVHlwZSA9PT0gXCJlbnVtc1wiKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgY29uc3QgeyBpZDogZW51bUlkIH0gPSBnZXRFbnVtSW5mb0Zyb21Db2xOYW1lKGVudGl0eUlkLCBjb2wubmFtZSk7XG4gICAgICAgICAgY29sdW1uRW51bXMucHVzaChlbnVtSWQpO1xuICAgICAgICB9IGNhdGNoIHt9XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICAvLyDrlJTtj7Ttirgg7YyM652866+47YSwXG4gICAgLy8gY29uc3QgZGVmID0gdGhpcy5nZXREZWZhdWx0KGZpbHRlckNvbHVtbnMpO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIC4uLnRoaXMuZ2V0VGFyZ2V0QW5kUGF0aChuYW1lcyksXG4gICAgICBib2R5OiBgXG5pbXBvcnQgeyB1c2VTdGF0ZSwgRnJhZ21lbnQgfSBmcm9tIFwicmVhY3RcIjtcbmltcG9ydCB7IGNyZWF0ZUZpbGVSb3V0ZSwgdXNlTmF2aWdhdGUgfSBmcm9tIFwiQHRhbnN0YWNrL3JlYWN0LXJvdXRlclwiO1xuXG5pbXBvcnQgeyBDYXJkLCBDYXJkQ29udGVudCwgQ2FyZEhlYWRlciB9IGZyb20gXCJAc29uYW11LWtpdC9yZWFjdC1jb21wb25lbnRzL2NvbXBvbmVudHNcIjtcbmltcG9ydCB7IEJhZGdlIH0gZnJvbSBcIkBzb25hbXUta2l0L3JlYWN0LWNvbXBvbmVudHMvY29tcG9uZW50c1wiO1xuaW1wb3J0IHsgQnV0dG9uIH0gZnJvbSBcIkBzb25hbXUta2l0L3JlYWN0LWNvbXBvbmVudHMvY29tcG9uZW50c1wiO1xuaW1wb3J0IHsgUGFnaW5hdGlvbiwgVGFibGUsIFRhYmxlQm9keSwgVGFibGVDZWxsLCB0eXBlIFRhYmxlQ29sLCBUYWJsZUhlYWQsIFRhYmxlSGVhZGVyLCBUYWJsZVJvdyB9IGZyb20gXCJAc29uYW11LWtpdC9yZWFjdC1jb21wb25lbnRzL2NvbXBvbmVudHNcIjtcbmltcG9ydCB7IEVudW1TZWxlY3QgfSBmcm9tIFwiQHNvbmFtdS1raXQvcmVhY3QtY29tcG9uZW50cy9jb21wb25lbnRzXCI7XG5pbXBvcnQgeyBBbGVydERpYWxvZywgQWxlcnREaWFsb2dBY3Rpb24sIEFsZXJ0RGlhbG9nQ2FuY2VsLCBBbGVydERpYWxvZ0NvbnRlbnQsIEFsZXJ0RGlhbG9nRGVzY3JpcHRpb24sIEFsZXJ0RGlhbG9nRm9vdGVyLCBBbGVydERpYWxvZ0hlYWRlciwgQWxlcnREaWFsb2dUaXRsZSB9IGZyb20gXCJAc29uYW11LWtpdC9yZWFjdC1jb21wb25lbnRzL2NvbXBvbmVudHNcIjtcbmltcG9ydCB7IElucHV0IH0gZnJvbSBcIkBzb25hbXUta2l0L3JlYWN0LWNvbXBvbmVudHMvY29tcG9uZW50c1wiO1xuaW1wb3J0IHsgQ2hlY2tib3ggfSBmcm9tIFwiQHNvbmFtdS1raXQvcmVhY3QtY29tcG9uZW50cy9jb21wb25lbnRzXCI7XG5pbXBvcnQgeyBTb25hbXVGaWx0ZXJNb2RhbCwgU29uYW11RmlsdGVyUG9wb3ZlciwgZXh0cmFjdEZpZWxkTWV0YUZyb21TY2hlbWEsIHR5cGUgUnVsZSB9IGZyb20gXCJAc29uYW11LWtpdC9yZWFjdC1jb21wb25lbnRzL2NvbXBvbmVudHNcIjtcblxuaW1wb3J0IHsgdXNlTGlzdFBhcmFtcywgbnVtRiwgZGF0ZUYsIGRhdGV0aW1lRiB9IGZyb20gXCJAc29uYW11LWtpdC9yZWFjdC1jb21wb25lbnRzL2xpYlwiO1xuaW1wb3J0IHsgJHtuYW1lcy5jYXBpdGFsfVN1YnNldEEsICR7bmFtZXMuY2FwaXRhbH1CYXNlU2NoZW1hIH0gZnJvbSBcIkAvc2VydmljZXMvc29uYW11LmdlbmVyYXRlZFwiO1xuaW1wb3J0IHsgJHtuYW1lcy5jYXBpdGFsfVNlcnZpY2UgfSBmcm9tIFwiQC9zZXJ2aWNlcy9zZXJ2aWNlcy5nZW5lcmF0ZWRcIjtcbmltcG9ydCB7ICR7bmFtZXMuY2FwaXRhbH1MaXN0UGFyYW1zIH0gZnJvbSBcIkAvc2VydmljZXMvJHtuYW1lcy5mc30vJHtuYW1lcy5mc30udHlwZXNcIjtcbmltcG9ydCB7ICR7KCgpID0+IHtcbiAgICAgICAgLy8g6riw67O4IGVudW0g7IiY7KeRIChmaWx0ZXJDb2x1bW5z7JeQIOyeiOuKlCDqsoPrp4wpXG4gICAgICAgIGNvbnN0IGJhc2VFbnVtczogc3RyaW5nW10gPSBbXTtcbiAgICAgICAgaWYgKGZpbHRlckNvbHVtbnMuc29tZSgoY29sKSA9PiBjb2wubmFtZSA9PT0gXCJvcmRlckJ5XCIpKSB7XG4gICAgICAgICAgYmFzZUVudW1zLnB1c2goYCR7bmFtZXMuY2FwaXRhbH1PcmRlckJ5YCwgYCR7bmFtZXMuY2FwaXRhbH1PcmRlckJ5TGFiZWxgKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZmlsdGVyQ29sdW1ucy5zb21lKChjb2wpID0+IGNvbC5uYW1lID09PSBcInNlYXJjaFwiKSkge1xuICAgICAgICAgIGJhc2VFbnVtcy5wdXNoKGAke25hbWVzLmNhcGl0YWx9U2VhcmNoRmllbGRgLCBgJHtuYW1lcy5jYXBpdGFsfVNlYXJjaEZpZWxkTGFiZWxgKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIO2VhO2EsCBlbnVtIOyImOynkSAoY29uZmlnLmVudW1JZCDsmrDshKAsIOyXhuycvOuptCBnZXRFbnVtSW5mb0Zyb21Db2xOYW1lKVxuICAgICAgICBjb25zdCBmaWx0ZXJFbnVtSWRzID0gZmlsdGVyQ29sdW1uc1xuICAgICAgICAgIC5maWx0ZXIoXG4gICAgICAgICAgICAoY29sKSA9PiBjb2wucmVuZGVyVHlwZSA9PT0gXCJlbnVtc1wiICYmIGNvbC5uYW1lICE9PSBcInNlYXJjaFwiICYmIGNvbC5uYW1lICE9PSBcIm9yZGVyQnlcIixcbiAgICAgICAgICApXG4gICAgICAgICAgLm1hcCgoY29sKSA9PiB7XG4gICAgICAgICAgICBpZiAoY29sLmNvbmZpZyAmJiBcImVudW1JZFwiIGluIGNvbC5jb25maWcpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIChjb2wuY29uZmlnIGFzIHsgZW51bUlkOiBzdHJpbmcgfSkuZW51bUlkO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgY29uc3QgeyBpZDogZW51bUlkIH0gPSBnZXRFbnVtSW5mb0Zyb21Db2xOYW1lKGVudGl0eUlkLCBjb2wubmFtZSk7XG4gICAgICAgICAgICAgIHJldHVybiBlbnVtSWQ7XG4gICAgICAgICAgICB9IGNhdGNoIHtcbiAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSlcbiAgICAgICAgICAuZmlsdGVyKEJvb2xlYW4pIGFzIHN0cmluZ1tdO1xuXG4gICAgICAgIC8vIOuqqOuToCBlbnVtIO2Vqey5mOqzoCDspJHrs7Ug7KCc6rGwXG4gICAgICAgIGNvbnN0IGFsbEVudW1zID0gWy4uLm5ldyBTZXQoWy4uLmZpbHRlckVudW1JZHMsIC4uLmNvbHVtbkVudW1zXSldO1xuICAgICAgICBjb25zdCBlbnVtSW1wb3J0cyA9IGFsbEVudW1zLmZsYXRNYXAoKGVudW1JZCkgPT4gW2Ake2VudW1JZH1gLCBgJHtlbnVtSWR9TGFiZWxgXSk7XG5cbiAgICAgICAgcmV0dXJuIFsuLi5iYXNlRW51bXMsIC4uLmVudW1JbXBvcnRzXS5qb2luKFwiLCBcIik7XG4gICAgICB9KSgpfSB9IGZyb20gXCJAL3NlcnZpY2VzL3NvbmFtdS5nZW5lcmF0ZWRcIjtcbmltcG9ydCB7IElkQXN5bmNTZWxlY3QgfSBmcm9tIFwiQHNvbmFtdS1raXQvcmVhY3QtY29tcG9uZW50cy9jb21wb25lbnRzXCI7XG4keygoKSA9PiB7XG4gIC8vIEZLIO2VhOuTnOydmCBBc3luY0lkQ29uZmlnIGltcG9ydFxuICBjb25zdCBma0NvbHVtbnMgPSBmaWx0ZXJDb2x1bW5zLmZpbHRlcihcbiAgICAoY29sKSA9PiBjb2wucmVuZGVyVHlwZSA9PT0gXCJudW1iZXItZmtfaWRcIiB8fCBjb2wucmVuZGVyVHlwZSA9PT0gXCJzdHJpbmctZmtfaWRcIixcbiAgKTtcbiAgY29uc3QgY29uZmlnTmFtZXMgPSBma0NvbHVtbnNcbiAgICAubWFwKChjb2wpID0+IHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHJlbFByb3AgPSBnZXRSZWxhdGlvblByb3BGcm9tQ29sTmFtZShlbnRpdHlJZCwgY29sLm5hbWUucmVwbGFjZShcIl9pZFwiLCBcIlwiKSk7XG4gICAgICAgIHJldHVybiBgJHtyZWxQcm9wLndpdGh9QXN5bmNJZENvbmZpZ2A7XG4gICAgICB9IGNhdGNoIHtcbiAgICAgICAgcmV0dXJuIFwiXCI7XG4gICAgICB9XG4gICAgfSlcbiAgICAuZmlsdGVyKEJvb2xlYW4pO1xuICByZXR1cm4gY29uZmlnTmFtZXMubGVuZ3RoID4gMFxuICAgID8gYGltcG9ydCB7ICR7Y29uZmlnTmFtZXMuam9pbihcIiwgXCIpfSB9IGZyb20gXCJAL3NlcnZpY2VzL3NlcnZpY2VzLmdlbmVyYXRlZFwiO2BcbiAgICA6IFwiXCI7XG59KSgpfVxuXG5pbXBvcnQgRWRpdEljb24gZnJvbSBcIn5pY29ucy9sdWNpZGUvc3F1YXJlLXBlblwiO1xuaW1wb3J0IFRyYXNoSWNvbiBmcm9tIFwifmljb25zL2x1Y2lkZS90cmFzaC0yXCI7XG5pbXBvcnQgRmlsdGVySWNvbiBmcm9tIFwifmljb25zL21kaS9maWx0ZXItdmFyaWFudFwiO1xuaW1wb3J0IExpc3RJY29uIGZyb20gXCJ+aWNvbnMvbWRpL2Zvcm1hdC1saXN0LWJ1bGxldGVkXCI7XG5pbXBvcnQgU2VhcmNoSWNvbiBmcm9tIFwifmljb25zL21kaS9tYWduaWZ5XCI7XG5pbXBvcnQgeyBTRCB9IGZyb20gXCJAL2kxOG4vc2QuZ2VuZXJhdGVkXCI7XG5cbmV4cG9ydCBjb25zdCBSb3V0ZSA9IGNyZWF0ZUZpbGVSb3V0ZShcIi9hZG1pbi8ke25hbWVzLmZzUGx1cmFsfS9cIikoe1xcbiAgaGVhZDogKCkgPT4gKHtcXG4gICAgbWV0YTogW1xcbiAgICAgIHsgdGl0bGU6IFwiJHtlbnRpdHkudGl0bGUgPz8gbmFtZXMuY2FwaXRhbH0gTGlzdFwiIH0sXFxuICAgICAgeyBuYW1lOiBcImRlc2NyaXB0aW9uXCIsIGNvbnRlbnQ6IFNEKFwiZW50aXR5Lmxpc3RNYW5hZ2VcIikoXCIke2VudGl0eS50aXRsZSA/PyBuYW1lcy5jYXBpdGFsfVwiKSB9LFxcbiAgICBdLFxcbiAgfSksXFxuICBjb21wb25lbnQ6ICR7bmFtZXMuY2FwaXRhbH1MaXN0LFxcbn0pO1xcblxcbnR5cGUgJHtuYW1lcy5jYXBpdGFsfUxpc3RQcm9wcyA9IHt9O1xuXG5mdW5jdGlvbiAke25hbWVzLmNhcGl0YWx9TGlzdCh7fTogJHtuYW1lcy5jYXBpdGFsfUxpc3RQcm9wcykge1xuICBjb25zdCBuYXZpZ2F0ZSA9IHVzZU5hdmlnYXRlKCk7XG5cbiAgLy8g7IOB7YOcIOq0gOumrFxuICBjb25zdCBbc2VsZWN0ZWRJdGVtcywgc2V0U2VsZWN0ZWRJdGVtc10gPSB1c2VTdGF0ZTxTZXQ8JHtpZFRzVHlwZX0+PihuZXcgU2V0KCkpO1xuICBjb25zdCBbZGVsZXRlRGlhbG9nT3Blbiwgc2V0RGVsZXRlRGlhbG9nT3Blbl0gPSB1c2VTdGF0ZShmYWxzZSk7XG4gIGNvbnN0IFtpdGVtVG9EZWxldGUsIHNldEl0ZW1Ub0RlbGV0ZV0gPSB1c2VTdGF0ZTx7IGlkOiAke2lkVHNUeXBlfTsgbmFtZT86IHN0cmluZyB9IHwgbnVsbD4obnVsbCk7XG4gIGNvbnN0IFtmaWx0ZXJNb2RhbE9wZW4sIHNldEZpbHRlck1vZGFsT3Blbl0gPSB1c2VTdGF0ZShmYWxzZSk7XG4gIGNvbnN0IFthcHBsaWVkUnVsZXMsIHNldEFwcGxpZWRSdWxlc10gPSB1c2VTdGF0ZTxSdWxlW10+KFtdKTtcblxuICAvLyDrpqzsiqTtirgg7ZWE7YSwXG4gIGNvbnN0IHsgbGlzdFBhcmFtcywgcmVnaXN0ZXIsIHNldExpc3RQYXJhbXMgfSA9IHVzZUxpc3RQYXJhbXMoJHtuYW1lcy5jYXBpdGFsfUxpc3RQYXJhbXMsIHtcbiAgICBudW06IDEwLFxuICAgIHBhZ2U6IDEsXG4gICAga2V5d29yZDogXCJcIiwke1xuICAgICAgZmlsdGVyQ29sdW1ucy5zb21lKChjb2wpID0+IGNvbC5uYW1lID09PSBcInNlYXJjaFwiKVxuICAgICAgICA/IGBcbiAgICBzZWFyY2g6ICR7bmFtZXMuY2FwaXRhbH1TZWFyY2hGaWVsZC5vcHRpb25zWzBdLGBcbiAgICAgICAgOiBcIlwiXG4gICAgfSR7XG4gICAgICBmaWx0ZXJDb2x1bW5zLnNvbWUoKGNvbCkgPT4gY29sLm5hbWUgPT09IFwib3JkZXJCeVwiKVxuICAgICAgICA/IGBcbiAgICBvcmRlckJ5OiAke25hbWVzLmNhcGl0YWx9T3JkZXJCeS5vcHRpb25zWzBdLGBcbiAgICAgICAgOiBcIlwiXG4gICAgfVxuICAgIHNvbmFtdUZpbHRlcjoge30sXG4gIH0pO1xuXG4gIC8vIOumrOyKpO2KuCDsv7zrpqxcbiAgY29uc3QgeyBkYXRhLCByZWZldGNoLCBpc0xvYWRpbmcgfSA9ICR7bmFtZXMuY2FwaXRhbH1TZXJ2aWNlLnVzZSR7bmFtZXMuY2FwaXRhbFBsdXJhbH0oXCJBXCIsIGxpc3RQYXJhbXMpO1xuICBjb25zdCB7IHJvd3MsIHRvdGFsIH0gPSBkYXRhID8/IHt9O1xuXG4gIC8vIO2YhOyerCDqsr3roZzsmYAg7YOA7J207YuAXG4gIGNvbnN0IFBBR0UgPSB7XG4gICAgcm91dGU6IFwiL2FkbWluLyR7bmFtZXMuZnNQbHVyYWx9XCIsXG4gICAgdGl0bGU6IFNEKFwiZW50aXR5Lmxpc3RcIikoU0QoXCJlbnRpdHkuJHtuYW1lcy5jYXBpdGFsfVwiKSksXG4gIH07XG5cbiAgLy8g7Lus65+8IOygleydmFxuICB0eXBlICR7bmFtZXMuY2FwaXRhbH1Sb3cgPSBOb25OdWxsYWJsZTx0eXBlb2Ygcm93cz5bbnVtYmVyXTtcbiAgY29uc3QgY29sdW1uczogVGFibGVDb2w8JHtuYW1lcy5jYXBpdGFsfVJvdz5bXSA9IFtcbiR7Y29sdW1uc1xuICAubWFwKFxuICAgIChjb2wpID0+IGAgICAge1xuICAgICAgbGFiZWw6ICR7Y29sLmxhYmVsfSxcbiAgICAgIHRjOiAke2NvbC50Y30sJHtcbiAgICAgICAgY29sLmZpdFxuICAgICAgICAgID8gYFxuICAgICAgZml0OiB0cnVlLGBcbiAgICAgICAgICA6IFwiXCJcbiAgICAgIH0ke1xuICAgICAgICBjb2wuYWxpZ25cbiAgICAgICAgICA/IGBcbiAgICAgIGFsaWduOiBcIiR7Y29sLmFsaWdufVwiLGBcbiAgICAgICAgICA6IFwiXCJcbiAgICAgIH1cbiAgICB9YCxcbiAgKVxuICAuam9pbihcIixcXG5cIil9LFxuICAgIHtcbiAgICAgIGxhYmVsOiBTRChcImNvbW1vbi5tYW5hZ2VcIiksXG4gICAgICBmaXQ6IHRydWUsXG4gICAgICBhbGlnbjogXCJjZW50ZXJcIixcbiAgICAgIHRjOiAocm93KSA9PiAoXG4gICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZmxleCBpdGVtcy1jZW50ZXIganVzdGlmeS1jZW50ZXIgZ2FwLTFcIj5cbiAgICAgICAgICA8QnV0dG9uXG4gICAgICAgICAgICB2YXJpYW50PVwieWVsbG93XCJcbiAgICAgICAgICAgIHNpemU9XCJ4c1wiXG4gICAgICAgICAgICBpY29uPXs8RWRpdEljb24gLz59XG4gICAgICAgICAgICBvbkNsaWNrPXsoKSA9PiBuYXZpZ2F0ZSh7IHRvOiBcXGBcXCR7UEFHRS5yb3V0ZX0vZm9ybVxcYCwgc2VhcmNoOiB7IGlkOiByb3cuaWQgfSB9KX1cbiAgICAgICAgICAvPlxuICAgICAgICAgIDxCdXR0b25cbiAgICAgICAgICAgIHZhcmlhbnQ9XCJyZWRcIlxuICAgICAgICAgICAgc2l6ZT1cInhzXCJcbiAgICAgICAgICAgIGljb249ezxUcmFzaEljb24gLz59XG4gICAgICAgICAgICBvbkNsaWNrPXsoKSA9PiBoYW5kbGVEZWxldGVDbGljayhyb3cuaWQpfVxuICAgICAgICAgIC8+XG4gICAgICAgIDwvZGl2PlxuICAgICAgKSxcbiAgICB9LFxuICBdO1xuXG4gIC8vIOyEoO2DnSDtlbjrk6Trn6xcbiAgY29uc3QgaGFuZGxlVG9nZ2xlSXRlbSA9IChpZDogJHtpZFRzVHlwZX0pID0+IHtcbiAgICBjb25zdCBuZXdTZWxlY3Rpb24gPSBuZXcgU2V0KHNlbGVjdGVkSXRlbXMpO1xuICAgIGlmIChuZXdTZWxlY3Rpb24uaGFzKGlkKSkge1xuICAgICAgbmV3U2VsZWN0aW9uLmRlbGV0ZShpZCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIG5ld1NlbGVjdGlvbi5hZGQoaWQpO1xuICAgIH1cbiAgICBzZXRTZWxlY3RlZEl0ZW1zKG5ld1NlbGVjdGlvbik7XG4gIH07XG5cbiAgY29uc3QgaXNBbGxTZWxlY3RlZCA9ICgpID0+IHtcbiAgICByZXR1cm4gKHJvd3M/Lmxlbmd0aCA/PyAwKSA+IDAgJiYgcm93cyEuZXZlcnkoKHJvdykgPT4gc2VsZWN0ZWRJdGVtcy5oYXMocm93LmlkKSk7XG4gIH07XG5cbiAgY29uc3QgaGFuZGxlU2VsZWN0QWxsID0gKGNoZWNrZWQ6IGJvb2xlYW4pID0+IHtcbiAgICBpZiAoY2hlY2tlZCkge1xuICAgICAgc2V0U2VsZWN0ZWRJdGVtcyhuZXcgU2V0KHJvd3M/Lm1hcCgocm93KSA9PiByb3cuaWQpID8/IFtdKSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHNldFNlbGVjdGVkSXRlbXMobmV3IFNldCgpKTtcbiAgICB9XG4gIH07XG5cbiAgLy8g7IKt7KCcIO2VuOuTpOufrFxuICBjb25zdCBoYW5kbGVEZWxldGVDbGljayA9IChpZDogJHtpZFRzVHlwZX0sIG5hbWU/OiBzdHJpbmcpID0+IHtcbiAgICBzZXRJdGVtVG9EZWxldGUoeyBpZCwgbmFtZSB9KTtcbiAgICBzZXREZWxldGVEaWFsb2dPcGVuKHRydWUpO1xuICB9O1xuXG4gIGNvbnN0IGhhbmRsZUNvbmZpcm1EZWxldGUgPSAoKSA9PiB7XG4gICAgaWYgKGl0ZW1Ub0RlbGV0ZSkge1xuICAgICAgJHtuYW1lcy5jYXBpdGFsfVNlcnZpY2UuZGVsKFtpdGVtVG9EZWxldGUuaWRdKS50aGVuKCgpID0+IHtcbiAgICAgICAgcmVmZXRjaCgpO1xuICAgICAgfSk7XG4gICAgfVxuICAgIHNldERlbGV0ZURpYWxvZ09wZW4oZmFsc2UpO1xuICAgIHNldEl0ZW1Ub0RlbGV0ZShudWxsKTtcbiAgfTtcblxuICByZXR1cm4gKFxuICAgIDxkaXYgY2xhc3NOYW1lPVwiZmxleC0xIG92ZXJmbG93LWF1dG9cIj5cbiAgICAgIDxkaXYgY2xhc3NOYW1lPVwibWF4LXctWzE4MDBweF0gbXgtYXV0byBwLThcIj5cbiAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJzcGFjZS15LTYgbWItOFwiPlxuICAgICAgICAgIHsvKiBIZWFkZXIgKi99XG4gICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJmbGV4IGl0ZW1zLWNlbnRlciBnYXAtMlwiPlxuICAgICAgICAgICAgPExpc3RJY29uIGNsYXNzTmFtZT1cImgtNSB3LTVcIiAvPlxuICAgICAgICAgICAgPHNwYW4gY2xhc3NOYW1lPVwidGV4dC1sZyBmb250LXNlbWlib2xkIGgtNVwiPntQQUdFLnRpdGxlfTwvc3Bhbj5cbiAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgIDxDYXJkIGNsYXNzTmFtZT1cInNoYWRvdy1zbSBib3JkZXItYm9yZGVyLzQwIG92ZXJmbG93LWhpZGRlblwiPlxuICAgICAgICAgICAgPENhcmRIZWFkZXIgY2xhc3NOYW1lPVwicGItMCBweC0wIHB0LTBcIj5cbiAgICAgICAgICAgICAgey8qIEZpbHRlcnMgKi99XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiYmctZ3JheS0xMDAgcHgtNiBweS00IHNwYWNlLXktM1wiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZmxleCBpdGVtcy1jZW50ZXIgZ2FwLTMgZmxleC13cmFwXCI+XG4ke1xuICBmaWx0ZXJDb2x1bW5zLnNvbWUoKGNvbCkgPT4gY29sLm5hbWUgPT09IFwic2VhcmNoXCIpXG4gICAgPyBgICAgICAgICAgICAgICAgICAgPEVudW1TZWxlY3RcbiAgICAgICAgICAgICAgICAgICAgZW51bT17JHtuYW1lcy5jYXBpdGFsfVNlYXJjaEZpZWxkfVxuICAgICAgICAgICAgICAgICAgICBsYWJlbHM9eyR7bmFtZXMuY2FwaXRhbH1TZWFyY2hGaWVsZExhYmVsfVxuICAgICAgICAgICAgICAgICAgICB7Li4ucmVnaXN0ZXIoXCJzZWFyY2hcIil9XG4gICAgICAgICAgICAgICAgICAgIHBsYWNlaG9sZGVyPXtTRChcImNvbW1vbi5zZWFyY2hUeXBlXCIpfVxuICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWU9XCJ3LTUwIGgtOCBiZy13aGl0ZSBib3JkZXItZ3JheS0zMDAgdGV4dC14c1wiXG4gICAgICAgICAgICAgICAgICAvPmBcbiAgICA6IFwiXCJcbn1cblxuICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJyZWxhdGl2ZSBmbGV4LTEgbWF4LXcteHNcIj5cbiAgICAgICAgICAgICAgICAgICAgPElucHV0XG4gICAgICAgICAgICAgICAgICAgICAgey4uLnJlZ2lzdGVyKFwia2V5d29yZFwiKX1cbiAgICAgICAgICAgICAgICAgICAgICBwbGFjZWhvbGRlcj17U0QoXCJjb21tb24uc2VhcmNoXCIpfVxuICAgICAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZT1cImgtOCBwci04IHRleHQteHMgYmctd2hpdGUgYm9yZGVyLWdyYXktMzAwXCJcbiAgICAgICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgICAgICAgPEJ1dHRvblxuICAgICAgICAgICAgICAgICAgICAgIHZhcmlhbnQ9XCJnaG9zdFwiXG4gICAgICAgICAgICAgICAgICAgICAgc2l6ZT1cInNtXCJcbiAgICAgICAgICAgICAgICAgICAgICBpY29uPXs8U2VhcmNoSWNvbiAvPn1cbiAgICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWU9XCJhYnNvbHV0ZSByaWdodC0wIHRvcC0wIGgtOCB3LTggaG92ZXI6YmctdHJhbnNwYXJlbnRcIlxuICAgICAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwibWwtYXV0byBmbGV4IGl0ZW1zLWNlbnRlciBnYXAtMlwiPlxuICAgICAgICAgICAgICAgICAgICA8QnV0dG9uXG4gICAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lPVwiaC04IHB4LTQgYmctcHJpbWFyeSBob3ZlcjpiZy1wcmltYXJ5LzkwIHRleHQtd2hpdGVcIlxuICAgICAgICAgICAgICAgICAgICAgIG9uQ2xpY2s9eygpID0+IG5hdmlnYXRlKHsgdG86IFxcYFxcJHtQQUdFLnJvdXRlfS9mb3JtXFxgIH0pfVxuICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3NOYW1lPVwidGV4dC14c1wiPntTRChcImNvbW1vbi5jcmVhdGVcIil9PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICA8L0J1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgPFNvbmFtdUZpbHRlclBvcG92ZXJcbiAgICAgICAgICAgICAgICAgICAgICBydWxlcz17YXBwbGllZFJ1bGVzfVxuICAgICAgICAgICAgICAgICAgICAgIGZpZWxkTWV0YT17ZXh0cmFjdEZpZWxkTWV0YUZyb21TY2hlbWEoXG4gICAgICAgICAgICAgICAgICAgICAgICAke25hbWVzLmNhcGl0YWx9QmFzZVNjaGVtYSxcbiAgICAgICAgICAgICAgICAgICAgICAgIFNEIGFzIChrZXk6IHN0cmluZykgPT4gc3RyaW5nLFxuICAgICAgICAgICAgICAgICAgICAgICl9XG4gICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICA8QnV0dG9uXG4gICAgICAgICAgICAgICAgICAgICAgICB2YXJpYW50PVwib3V0bGluZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBzaXplPVwic21cIlxuICAgICAgICAgICAgICAgICAgICAgICAgaWNvbj17PEZpbHRlckljb24gLz59XG4gICAgICAgICAgICAgICAgICAgICAgICBvbkNsaWNrPXsoKSA9PiBzZXRGaWx0ZXJNb2RhbE9wZW4odHJ1ZSl9XG4gICAgICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWU9XCJoLThcIlxuICAgICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzTmFtZT1cInRleHQteHNcIj57U0QoXCJyYy5zb25hbXVGaWx0ZXIudGl0bGVcIil9PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAge2FwcGxpZWRSdWxlcy5sZW5ndGggPiAwICYmIChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPEJhZGdlIHZhcmlhbnQ9XCJzZWNvbmRhcnlcIiBjbGFzc05hbWU9XCJtbC0xXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge2FwcGxpZWRSdWxlcy5sZW5ndGh9XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDwvQmFkZ2U+XG4gICAgICAgICAgICAgICAgICAgICAgICApfVxuICAgICAgICAgICAgICAgICAgICAgIDwvQnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICA8L1NvbmFtdUZpbHRlclBvcG92ZXI+XG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZmxleCBpdGVtcy1jZW50ZXIgZ2FwLTMgZmxleC13cmFwXCI+XG4ke2ZpbHRlckNvbHVtbnNcbiAgLmZpbHRlcigoY29sKSA9PiBjb2wubmFtZSAhPT0gXCJzZWFyY2hcIiAmJiBjb2wubmFtZSAhPT0gXCJvcmRlckJ5XCIpXG4gIC5tYXAoKGNvbCkgPT4ge1xuICAgIGlmIChjb2wucmVuZGVyVHlwZSA9PT0gXCJlbnVtc1wiKSB7XG4gICAgICB0cnkge1xuICAgICAgICAvLyBjb25maWcuZW51bUlk6rCAIOyeiOycvOuptCDsmrDshKAg7IKs7JqpLCDsl4bsnLzrqbQgZ2V0RW51bUluZm9Gcm9tQ29sTmFtZSDsi5zrj4RcbiAgICAgICAgY29uc3QgZW51bUlkID1cbiAgICAgICAgICBjb2wuY29uZmlnICYmIFwiZW51bUlkXCIgaW4gY29sLmNvbmZpZ1xuICAgICAgICAgICAgPyAoY29sLmNvbmZpZyBhcyB7IGVudW1JZDogc3RyaW5nIH0pLmVudW1JZFxuICAgICAgICAgICAgOiBnZXRFbnVtSW5mb0Zyb21Db2xOYW1lKGVudGl0eUlkLCBjb2wubmFtZSkuaWQ7XG4gICAgICAgIHJldHVybiBgICAgICAgICAgICAgICAgICAgPEVudW1TZWxlY3RcbiAgICAgICAgICAgICAgICAgICAga2V5PXtcXGAke2NvbC5uYW1lfS1cXCR7bGlzdFBhcmFtcy4ke2NvbC5uYW1lfX1cXGB9XG4gICAgICAgICAgICAgICAgICAgIGVudW09eyR7ZW51bUlkfX1cbiAgICAgICAgICAgICAgICAgICAgbGFiZWxzPXske2VudW1JZH1MYWJlbH1cbiAgICAgICAgICAgICAgICAgICAgey4uLnJlZ2lzdGVyKFwiJHtjb2wubmFtZX1cIil9XG4gICAgICAgICAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwiJHtjb2wubGFiZWx9XCJcbiAgICAgICAgICAgICAgICAgICAgY2xlYXJhYmxlXG4gICAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZT1cInctNTAgaC04IGJnLXdoaXRlIGJvcmRlci1ncmF5LTMwMCB0ZXh0LXhzXCJcbiAgICAgICAgICAgICAgICAgIC8+YDtcbiAgICAgIH0gY2F0Y2gge1xuICAgICAgICByZXR1cm4gXCJcIjtcbiAgICAgIH1cbiAgICB9XG4gICAgLy8gRksg7ZWE65OcIChJZEFzeW5jU2VsZWN0KVxuICAgIGlmIChjb2wucmVuZGVyVHlwZSA9PT0gXCJudW1iZXItZmtfaWRcIiB8fCBjb2wucmVuZGVyVHlwZSA9PT0gXCJzdHJpbmctZmtfaWRcIikge1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgcmVsUHJvcCA9IGdldFJlbGF0aW9uUHJvcEZyb21Db2xOYW1lKGVudGl0eUlkLCBjb2wubmFtZS5yZXBsYWNlKFwiX2lkXCIsIFwiXCIpKTtcbiAgICAgICAgcmV0dXJuIGAgICAgICAgICAgICAgICAgICA8SWRBc3luY1NlbGVjdFxuICAgICAgICAgICAgICAgICAgICBjb25maWc9eyR7cmVsUHJvcC53aXRofUFzeW5jSWRDb25maWd9XG4gICAgICAgICAgICAgICAgICAgIHN1YnNldD1cIkFcIlxuICAgICAgICAgICAgICAgICAgICB7Li4ucmVnaXN0ZXIoXCIke2NvbC5uYW1lfVwiKX1cbiAgICAgICAgICAgICAgICAgICAgcGxhY2Vob2xkZXI9XCIke2NvbC5sYWJlbCA/PyByZWxQcm9wLndpdGh9XCJcbiAgICAgICAgICAgICAgICAgICAgY2xlYXJhYmxlXG4gICAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZT1cInctNTAgaC04IHRleHQteHNcIlxuICAgICAgICAgICAgICAgICAgLz5gO1xuICAgICAgfSBjYXRjaCB7XG4gICAgICAgIHJldHVybiBcIlwiO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gXCJcIjtcbiAgfSlcbiAgLmZpbHRlcihCb29sZWFuKVxuICAuam9pbihcIlxcblwiKX1cbiR7XG4gIGZpbHRlckNvbHVtbnMuc29tZSgoY29sKSA9PiBjb2wubmFtZSA9PT0gXCJvcmRlckJ5XCIpXG4gICAgPyBgICAgICAgICAgICAgICAgICAgPEVudW1TZWxlY3RcbiAgICAgICAgICAgICAgICAgICAgZW51bT17JHtuYW1lcy5jYXBpdGFsfU9yZGVyQnl9XG4gICAgICAgICAgICAgICAgICAgIGxhYmVscz17JHtuYW1lcy5jYXBpdGFsfU9yZGVyQnlMYWJlbH1cbiAgICAgICAgICAgICAgICAgICAgey4uLnJlZ2lzdGVyKFwib3JkZXJCeVwiKX1cbiAgICAgICAgICAgICAgICAgICAgcGxhY2Vob2xkZXI9e1NEKFwiY29tbW9uLnNvcnRcIil9XG4gICAgICAgICAgICAgICAgICAgIHRleHRQcmVmaXg9e1xcYFxcJHtTRChcImNvbW1vbi5zb3J0XCIpfTogXFxgfVxuICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWU9XCJ3LTUwIGgtOCBiZy13aGl0ZSBib3JkZXItZ3JheS0zMDAgdGV4dC14c1wiXG4gICAgICAgICAgICAgICAgICAvPmBcbiAgICA6IFwiXCJcbn1cbiAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzTmFtZT1cInRleHQteHMgdGV4dC1tdXRlZC1mb3JlZ3JvdW5kXCI+e1NEKFwiY29tbW9uLnJlc3VsdHNcIikodG90YWwgPz8gMCl9PC9zcGFuPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvQ2FyZEhlYWRlcj5cblxuICAgICAgICAgICAgPENhcmRDb250ZW50IGNsYXNzTmFtZT1cInB4LTYgcGItNiBwdC02IGJnLXdoaXRlXCI+XG4gICAgICAgICAgICAgIHsvKiBUYWJsZSAqL31cbiAgICAgICAgICAgICAgPFRhYmxlPlxuICAgICAgICAgICAgICAgIDxUYWJsZUhlYWRlcj5cbiAgICAgICAgICAgICAgICAgIDxUYWJsZVJvdyBjbGFzc05hbWU9XCJob3ZlcjpiZy10cmFuc3BhcmVudCBiZy1ncmF5LTEwMFwiPlxuICAgICAgICAgICAgICAgICAgICA8VGFibGVIZWFkIGNsYXNzTmFtZT1cImgtOSB0ZXh0LXhzIHctWzQwcHhdXCI+XG4gICAgICAgICAgICAgICAgICAgICAgPENoZWNrYm94XG4gICAgICAgICAgICAgICAgICAgICAgICBjaGVja2VkPXtpc0FsbFNlbGVjdGVkKCl9XG4gICAgICAgICAgICAgICAgICAgICAgICBvblZhbHVlQ2hhbmdlPXtoYW5kbGVTZWxlY3RBbGx9XG4gICAgICAgICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgICAgICAgPC9UYWJsZUhlYWQ+XG4gICAgICAgICAgICAgICAgICAgIHtjb2x1bW5zLm1hcCgoY29sLCBpZHgpID0+IChcbiAgICAgICAgICAgICAgICAgICAgICA8VGFibGVIZWFkIGtleT17aWR4fSBmaXQ9e2NvbC5maXR9IGFsaWduPXtjb2wuYWxpZ259PlxuICAgICAgICAgICAgICAgICAgICAgICAge2NvbC5sYWJlbH1cbiAgICAgICAgICAgICAgICAgICAgICA8L1RhYmxlSGVhZD5cbiAgICAgICAgICAgICAgICAgICAgKSl9XG4gICAgICAgICAgICAgICAgICA8L1RhYmxlUm93PlxuICAgICAgICAgICAgICAgIDwvVGFibGVIZWFkZXI+XG4gICAgICAgICAgICAgICAgPFRhYmxlQm9keT5cbiAgICAgICAgICAgICAgICAgIHshaXNMb2FkaW5nICYmIHJvd3MgJiYgcm93cy5tYXAoKHJvdykgPT4gKFxuICAgICAgICAgICAgICAgICAgICA8RnJhZ21lbnQga2V5PXtyb3cuaWR9PlxuICAgICAgICAgICAgICAgICAgICAgIDxUYWJsZVJvdz5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxUYWJsZUNlbGwgY2xhc3NOYW1lPVwicHktM1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8Q2hlY2tib3hcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGVja2VkPXtzZWxlY3RlZEl0ZW1zLmhhcyhyb3cuaWQpfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uVmFsdWVDaGFuZ2U9eygpID0+IGhhbmRsZVRvZ2dsZUl0ZW0ocm93LmlkKX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvVGFibGVDZWxsPlxuICAgICAgICAgICAgICAgICAgICAgICAge2NvbHVtbnMubWFwKChjb2wsIGlkeCkgPT4gKFxuICAgICAgICAgICAgICAgICAgICAgICAgICA8VGFibGVDZWxsIGtleT17aWR4fSBmaXQ9e2NvbC5maXR9IGFsaWduPXtjb2wuYWxpZ259IGNsYXNzTmFtZT1cInB5LTNcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Y29sLnRjKHJvdyl9XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDwvVGFibGVDZWxsPlxuICAgICAgICAgICAgICAgICAgICAgICAgKSl9XG4gICAgICAgICAgICAgICAgICAgICAgPC9UYWJsZVJvdz5cbiAgICAgICAgICAgICAgICAgICAgPC9GcmFnbWVudD5cbiAgICAgICAgICAgICAgICAgICkpfVxuICAgICAgICAgICAgICAgIDwvVGFibGVCb2R5PlxuICAgICAgICAgICAgICA8L1RhYmxlPlxuXG4gICAgICAgICAgICAgIHsvKiBQYWdpbmF0aW9uICovfVxuICAgICAgICAgICAgICA8UGFnaW5hdGlvblxuICAgICAgICAgICAgICAgIHsuLi5yZWdpc3RlcihcInBhZ2VcIil9XG4gICAgICAgICAgICAgICAgdG90YWw9e3RvdGFsID8/IDB9XG4gICAgICAgICAgICAgICAgaXRlbXNQZXJQYWdlPXtsaXN0UGFyYW1zLm51bSA/PyAxMH1cbiAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgIDwvQ2FyZENvbnRlbnQ+XG4gICAgICAgICAgPC9DYXJkPlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuXG4gICAgICB7LyogRGVsZXRlIERpYWxvZyAqL31cbiAgICAgIDxBbGVydERpYWxvZyBvcGVuPXtkZWxldGVEaWFsb2dPcGVufSBvbk9wZW5DaGFuZ2U9e3NldERlbGV0ZURpYWxvZ09wZW59PlxuICAgICAgICA8QWxlcnREaWFsb2dDb250ZW50PlxuICAgICAgICAgIDxBbGVydERpYWxvZ0hlYWRlcj5cbiAgICAgICAgICAgIDxBbGVydERpYWxvZ1RpdGxlPntTRChcImRlbGV0ZS5jb25maXJtLnRpdGxlXCIpfTwvQWxlcnREaWFsb2dUaXRsZT5cbiAgICAgICAgICAgIDxBbGVydERpYWxvZ0Rlc2NyaXB0aW9uPntTRChcImRlbGV0ZS5jb25maXJtLmRlc2NyaXB0aW9uXCIpfTwvQWxlcnREaWFsb2dEZXNjcmlwdGlvbj5cbiAgICAgICAgICA8L0FsZXJ0RGlhbG9nSGVhZGVyPlxuICAgICAgICAgIDxBbGVydERpYWxvZ0Zvb3Rlcj5cbiAgICAgICAgICAgIDxBbGVydERpYWxvZ0NhbmNlbD57U0QoXCJjb21tb24uY2FuY2VsXCIpfTwvQWxlcnREaWFsb2dDYW5jZWw+XG4gICAgICAgICAgICA8QWxlcnREaWFsb2dBY3Rpb24gb25DbGljaz17aGFuZGxlQ29uZmlybURlbGV0ZX0+XG4gICAgICAgICAgICAgIHtTRChcImNvbW1vbi5kZWxldGVcIil9XG4gICAgICAgICAgICA8L0FsZXJ0RGlhbG9nQWN0aW9uPlxuICAgICAgICAgIDwvQWxlcnREaWFsb2dGb290ZXI+XG4gICAgICAgIDwvQWxlcnREaWFsb2dDb250ZW50PlxuICAgICAgPC9BbGVydERpYWxvZz5cblxuICAgICAgey8qIFNvbmFtdSBGaWx0ZXIgTW9kYWwgKi99XG4gICAgICA8U29uYW11RmlsdGVyTW9kYWxcbiAgICAgICAgYmFzZVNjaGVtYT17JHtuYW1lcy5jYXBpdGFsfUJhc2VTY2hlbWF9XG4gICAgICAgIG9wZW49e2ZpbHRlck1vZGFsT3Blbn1cbiAgICAgICAgb25PcGVuQ2hhbmdlPXtzZXRGaWx0ZXJNb2RhbE9wZW59XG4gICAgICAgIGluaXRpYWxSdWxlcz17YXBwbGllZFJ1bGVzfVxuICAgICAgICBvbkFwcGx5PXsoZmlsdGVycywgcnVsZXMpID0+IHtcbiAgICAgICAgICBzZXRMaXN0UGFyYW1zKHsgLi4ubGlzdFBhcmFtcywgc29uYW11RmlsdGVyOiBmaWx0ZXJzLCBwYWdlOiAxIH0pO1xuICAgICAgICAgIHNldEFwcGxpZWRSdWxlcyhydWxlcyk7XG4gICAgICAgIH19XG4gICAgICAvPlxuICAgIDwvZGl2PlxuICApO1xufVxuICAgICAgYC50cmltKCksXG4gICAgICBpbXBvcnRLZXlzOiBbXSxcbiAgICAgIHByZVRlbXBsYXRlcyxcbiAgICB9O1xuICB9XG59XG4iXSwibmFtZXMiOlsiaW5mbGVjdGlvbiIsImZsYXQiLCJ6IiwiRW50aXR5TWFuYWdlciIsImdldEVudW1JbmZvRnJvbUNvbE5hbWUiLCJnZXRSZWxhdGlvbk5hbWVGcm9tQ29sdW1uTmFtZSIsImdldFJlbGF0aW9uUHJvcEZyb21Db2xOYW1lIiwiVGVtcGxhdGUiLCJUZW1wbGF0ZV9fdmlld19saXN0IiwiZ2V0VGFyZ2V0QW5kUGF0aCIsIm5hbWVzIiwidGFyZ2V0IiwicGF0aCIsImZzUGx1cmFsIiwiZ2V0UmVxdWlyZWREaWN0S2V5cyIsIndyYXBUYyIsImJvZHkiLCJrZXkiLCJjb2xsYXBzaW5nIiwiY2xhc3NOYW1lIiwicmVuZGVyQ29sdW1uIiwiZW50aXR5SWQiLCJjb2wiLCJwYXJlbnRPYmoiLCJ3aXRob3V0TmFtZSIsImNvbE5hbWUiLCJuYW1lIiwiaW5jbHVkZXMiLCJwYXJ0cyIsInNwbGl0Iiwiam9pbiIsInJlbmRlclR5cGUiLCJiYXNlTmFtZSIsInBvcCIsInJlcGxhY2UiLCJyZWxQcm9wRmsiLCJ3aXRoIiwibnVsbGFibGUiLCJpZCIsImVudW1JZCIsImxhYmVsIiwicGlja2VkQ2hpbGQiLCJjaGlsZHJlbiIsImZpbmQiLCJjaGlsZCIsImNvbmZpZyIsInBpY2tlZCIsIkVycm9yIiwicmVuZGVyQ29sdW1uSW1wb3J0IiwiY2FwaXRhbCIsInJlbFByb3AiLCJyZXN1bHQiLCJtYXAiLCJnZXROYW1lc0Zyb21JZCIsImVsZW1lbnQiLCJyZW5kZXJGaWx0ZXJJbXBvcnQiLCJmcyIsImNvbXBvbmVudElkIiwiY2FtZWxpemUiLCJ0YXJnZXRFbnRpdHlOYW1lcyIsInRhcmdldE1ETmFtZXMiLCJ0YXJnZXROYW1lcyIsInJlbmRlckZpbHRlciIsImlzQ2xlYXJhYmxlIiwib3B0aW9uYWwiLCJnZXREZWZhdWx0IiwiY29sdW1ucyIsImRlZiIsIm9yZGVyQnkiLCJzZWFyY2giLCJoYXNTZWFyY2giLCJoYXNPcmRlckJ5Iiwib3JkZXJCeVpvZFR5cGUiLCJ6b2RUeXBlIiwiWm9kRW51bSIsIk9iamVjdCIsImtleXMiLCJlbnVtIiwic2VhcmNoWm9kVHlwZSIsInJlbmRlciIsImdldENvbHVtbnNOb2RlIiwiZ2V0Wm9kVHlwZUJ5SWQiLCJ6b2RUeXBlVG9SZW5kZXJpbmdOb2RlIiwiY29sdW1uc05vZGUiLCJsaXN0UGFyYW1zWm9kVHlwZSIsImxpc3RQYXJhbXNOb2RlIiwiZW50aXR5IiwiZ2V0IiwicGtUeXBlIiwiZ2V0UGtUeXBlIiwiaWRUc1R5cGUiLCJzb3J0IiwiYSIsImIiLCJyZW5kZXJlZCIsImNhbWVsTmFtZSIsIl8iLCJjaGFyIiwidG9VcHBlckNhc2UiLCJsYWJlbE5hbWUiLCJ0YyIsImZpdCIsImFsaWduIiwidW5kZWZpbmVkIiwiZmlsdGVyQ29sdW1ucyIsImZpbHRlciIsInByZVRlbXBsYXRlcyIsImNvbHVtbkVudW1zIiwiZm9yRWFjaCIsInB1c2giLCJiYXNlRW51bXMiLCJzb21lIiwiZmlsdGVyRW51bUlkcyIsIkJvb2xlYW4iLCJhbGxFbnVtcyIsIlNldCIsImVudW1JbXBvcnRzIiwiZmxhdE1hcCIsImZrQ29sdW1ucyIsImNvbmZpZ05hbWVzIiwibGVuZ3RoIiwidGl0bGUiLCJjYXBpdGFsUGx1cmFsIiwidHJpbSIsImltcG9ydEtleXMiXSwibWFwcGluZ3MiOiJBQUFBLE9BQU9BLGdCQUFnQixhQUFhO0FBQ3BDLFNBQVNDLElBQUksUUFBUSxVQUFVO0FBQy9CLFNBQVNDLENBQUMsUUFBUSxNQUFNO0FBQ3hCLFNBQVNDLGFBQWEsUUFBZ0MsaUNBQThCO0FBRXBGLFNBQ0VDLHNCQUFzQixFQUN0QkMsNkJBQTZCLEVBQzdCQywwQkFBMEIsUUFDckIsZ0JBQWE7QUFFcEIsU0FBU0MsUUFBUSxRQUFRLGlCQUFjO0FBRXZDLE9BQU8sTUFBTUMsNEJBQTRCRDtJQUN2QyxhQUFjO1FBQ1osS0FBSyxDQUFDO0lBQ1I7SUFFQUUsaUJBQWlCQyxLQUF3QixFQUFFO1FBQ3pDLE9BQU87WUFDTEMsUUFBUTtZQUNSQyxNQUFNLEdBQUdGLE1BQU1HLFFBQVEsQ0FBQyxVQUFVLENBQUM7UUFDckM7SUFDRjtJQUVTQyxzQkFBdUM7UUFDOUMsT0FBTztZQUFDO1lBQXFCO1NBQWE7SUFDNUM7SUFFQUMsT0FBT0Ms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
608
+ //#endregion
609
+ export { Template__view_list };
610
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmlld19saXN0LnRlbXBsYXRlLmpzIiwibmFtZXMiOlsiY29sTmFtZTogc3RyaW5nIiwiY29tcG9uZW50SWQ6IHN0cmluZyIsInoiLCJsYWJlbDogc3RyaW5nIiwicHJlVGVtcGxhdGVzOiBSZW5kZXJlZFRlbXBsYXRlW1wicHJlVGVtcGxhdGVzXCJdIiwiY29sdW1uRW51bXM6IHN0cmluZ1tdIiwiYmFzZUVudW1zOiBzdHJpbmdbXSJdLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy90ZW1wbGF0ZS9pbXBsZW1lbnRhdGlvbnMvdmlld19saXN0LnRlbXBsYXRlLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBpbmZsZWN0aW9uIGZyb20gXCJpbmZsZWN0aW9uXCI7XG5pbXBvcnQgeyBmbGF0IH0gZnJvbSBcInJhZGFzaGlcIjtcbmltcG9ydCB7IHogfSBmcm9tIFwiem9kXCI7XG5cbmltcG9ydCB7IEVudGl0eU1hbmFnZXIgfSBmcm9tIFwiLi4vLi4vZW50aXR5L2VudGl0eS1tYW5hZ2VyXCI7XG5pbXBvcnQgeyB0eXBlIEVudGl0eU5hbWVzUmVjb3JkIH0gZnJvbSBcIi4uLy4uL2VudGl0eS9lbnRpdHktbWFuYWdlclwiO1xuaW1wb3J0IHsgdHlwZSBSZW5kZXJpbmdOb2RlLCB0eXBlIFRlbXBsYXRlT3B0aW9ucyB9IGZyb20gXCIuLi8uLi90eXBlcy90eXBlc1wiO1xuaW1wb3J0IHtcbiAgZ2V0RW51bUluZm9Gcm9tQ29sTmFtZSxcbiAgZ2V0UmVsYXRpb25OYW1lRnJvbUNvbHVtbk5hbWUsXG4gIGdldFJlbGF0aW9uUHJvcEZyb21Db2xOYW1lLFxufSBmcm9tIFwiLi4vaGVscGVyc1wiO1xuaW1wb3J0IHsgdHlwZSBSZW5kZXJlZFRlbXBsYXRlIH0gZnJvbSBcIi4uL3RlbXBsYXRlXCI7XG5pbXBvcnQgeyBUZW1wbGF0ZSB9IGZyb20gXCIuLi90ZW1wbGF0ZVwiO1xuXG5leHBvcnQgY2xhc3MgVGVtcGxhdGVfX3ZpZXdfbGlzdCBleHRlbmRzIFRlbXBsYXRlIHtcbiAgY29uc3RydWN0b3IoKSB7XG4gICAgc3VwZXIoXCJ2aWV3X2xpc3RcIik7XG4gIH1cblxuICBnZXRUYXJnZXRBbmRQYXRoKG5hbWVzOiBFbnRpdHlOYW1lc1JlY29yZCkge1xuICAgIHJldHVybiB7XG4gICAgICB0YXJnZXQ6IFwid2ViL3NyYy9yb3V0ZXMvYWRtaW5cIixcbiAgICAgIHBhdGg6IGAke25hbWVzLmZzUGx1cmFsfS9pbmRleC50c3hgLFxuICAgIH07XG4gIH1cblxuICBvdmVycmlkZSBnZXRSZXF1aXJlZERpY3RLZXlzKCk6IHN0cmluZ1tdIHwgbnVsbCB7XG4gICAgcmV0dXJuIFtcImVudGl0eS5saXN0TWFuYWdlXCIsIFwiY29tbW9uLmFsbFwiXTtcbiAgfVxuXG4gIHdyYXBUYyhib2R5OiBzdHJpbmcsIGtleTogc3RyaW5nLCBjb2xsYXBzaW5nOiBib29sZWFuID0gdHJ1ZSwgY2xhc3NOYW1lOiBzdHJpbmcgPSBcIlwiKSB7XG4gICAgcmV0dXJuIGA8VGFibGUuQ2VsbCBrZXk9XCIke2tleX1cIiR7Y29sbGFwc2luZyA/IFwiIGNvbGxhcHNpbmdcIiA6IFwiXCJ9JHtcbiAgICAgIGNsYXNzTmFtZSA/IGAgY2xhc3NOYW1lPXtcXGAke2NsYXNzTmFtZX1cXGB9YCA6IFwiXCJcbiAgICB9PiR7Ym9keX08L1RhYmxlLkNlbGw+YDtcbiAgfVxuXG4gIHJlbmRlckNvbHVtbihcbiAgICBlbnRpdHlJZDogc3RyaW5nLFxuICAgIGNvbDogUmVuZGVyaW5nTm9kZSxcbiAgICBuYW1lczogRW50aXR5TmFtZXNSZWNvcmQsXG4gICAgcGFyZW50T2JqOiBzdHJpbmcgPSBcInJvd1wiLFxuICAgIHdpdGhvdXROYW1lOiBib29sZWFuID0gZmFsc2UsXG4gICk6IHN0cmluZyB7XG4gICAgLy8g7KSR7LKpIOqyveuhnCDsspjrpqwgKOyYiDogXCJ1c2VyLm5hbWVcIiAtPiBcInJvdy51c2VyPy5uYW1lXCIpXG4gICAgbGV0IGNvbE5hbWU6IHN0cmluZztcbiAgICBpZiAod2l0aG91dE5hbWUpIHtcbiAgICAgIGNvbE5hbWUgPSBwYXJlbnRPYmo7XG4gICAgfSBlbHNlIGlmIChjb2wubmFtZS5pbmNsdWRlcyhcIi5cIikpIHtcbiAgICAgIC8vIOykkeyyqSDqsr3roZzripQgb3B0aW9uYWwgY2hhaW5pbmfsnLzroZwg67OA7ZmYXG4gICAgICBjb25zdCBwYXJ0cyA9IGNvbC5uYW1lLnNwbGl0KFwiLlwiKTtcbiAgICAgIGNvbE5hbWUgPSBgJHtwYXJlbnRPYmp9LiR7cGFydHMuam9pbihcIj8uXCIpfWA7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbE5hbWUgPSBgJHtwYXJlbnRPYmp9LiR7Y29sLm5hbWV9YDtcbiAgICB9XG5cbiAgICBzd2l0Y2ggKGNvbC5yZW5kZXJUeXBlKSB7XG4gICAgICBjYXNlIFwic3RyaW5nLXBsYWluXCI6XG4gICAgICBjYXNlIFwic3RyaW5nLWRhdGVcIjpcbiAgICAgIGNhc2UgXCJudW1iZXItaWRcIjpcbiAgICAgIGNhc2UgXCJzdHJpbmctaWRcIjpcbiAgICAgICAgcmV0dXJuIGA8Pnske2NvbE5hbWV9fTwvPmA7XG4gICAgICBjYXNlIFwibnVtYmVyLWZrX2lkXCI6XG4gICAgICBjYXNlIFwic3RyaW5nLWZrX2lkXCI6IHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBjb25zdCBiYXNlTmFtZSA9IGNvbC5uYW1lLmluY2x1ZGVzKFwiLlwiKVxuICAgICAgICAgICAgPyAoY29sLm5hbWUuc3BsaXQoXCIuXCIpLnBvcCgpID8/IGNvbC5uYW1lKS5yZXBsYWNlKFwiX2lkXCIsIFwiXCIpXG4gICAgICAgICAgICA6IGNvbC5uYW1lLnJlcGxhY2UoXCJfaWRcIiwgXCJcIik7XG4gICAgICAgICAgY29uc3QgcmVsUHJvcEZrID0gZ2V0UmVsYXRpb25Qcm9wRnJvbUNvbE5hbWUoZW50aXR5SWQsIGJhc2VOYW1lKTtcbiAgICAgICAgICByZXR1cm4gYDw+JHtyZWxQcm9wRmsud2l0aH0jeyR7Y29sTmFtZX19PC8+YDtcbiAgICAgICAgfSBjYXRjaCB7XG4gICAgICAgICAgcmV0dXJuIGA8Pnske2NvbE5hbWV9fTwvPmA7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGNhc2UgXCJkYXRldGltZVwiOlxuICAgICAgICBpZiAoY29sLm51bGxhYmxlIHx8IGNvbC5uYW1lLmluY2x1ZGVzKFwiLlwiKSkge1xuICAgICAgICAgIHJldHVybiBgPHNwYW4+eyR7Y29sTmFtZX0gPyBkYXRldGltZUYoJHtjb2xOYW1lfSkgOiAnLSd9PC9zcGFuPmA7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmV0dXJuIGA8c3Bhbj57ZGF0ZXRpbWVGKCR7Y29sTmFtZX0pfTwvc3Bhbj5gO1xuICAgICAgICB9XG4gICAgICBjYXNlIFwic3RyaW5nLWRhdGV0aW1lXCI6XG4gICAgICAgIGlmIChjb2wubnVsbGFibGUgfHwgY29sLm5hbWUuaW5jbHVkZXMoXCIuXCIpKSB7XG4gICAgICAgICAgcmV0dXJuIGA8c3Bhbj57JHtjb2xOYW1lfSA/IGRhdGVGKCR7Y29sTmFtZX0pIDogJy0nfTwvc3Bhbj5gO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJldHVybiBgPHNwYW4+e2RhdGVGKCR7Y29sTmFtZX0pfTwvc3Bhbj5gO1xuICAgICAgICB9XG4gICAgICBjYXNlIFwiYm9vbGVhblwiOlxuICAgICAgICByZXR1cm4gYDw+eyR7Y29sTmFtZX0gPyA8QmFkZ2UgdmFyaWFudD1cImRlZmF1bHRcIj5PPC9CYWRnZT4gOiA8QmFkZ2UgdmFyaWFudD1cInNlY29uZGFyeVwiPlg8L0JhZGdlPn08Lz5gO1xuICAgICAgY2FzZSBcImVudW1zXCI6IHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBjb25zdCB7IGlkOiBlbnVtSWQgfSA9IGdldEVudW1JbmZvRnJvbUNvbE5hbWUoZW50aXR5SWQsIGNvbC5uYW1lKTtcbiAgICAgICAgICByZXR1cm4gYDw+eyR7Y29sLm51bGxhYmxlID8gYCR7Y29sTmFtZX0gJiYgYCA6IFwiXCJ9JHtlbnVtSWR9TGFiZWxbJHtjb2xOYW1lfV19PC8+YDtcbiAgICAgICAgfSBjYXRjaCB7XG4gICAgICAgICAgcmV0dXJuIGA8Pnske2NvbE5hbWV9fTwvPmA7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGNhc2UgXCJhcnJheS1pbWFnZXNcIjpcbiAgICAgICAgcmV0dXJuIGA8ZGl2IGNsYXNzTmFtZT1cImZsZXggZ2FwLTFcIj57ICR7Y29sTmFtZX0/Lm1hcCgociwgaSkgPT4gJHtcbiAgICAgICAgICBjb2wubnVsbGFibGUgPyBgciAmJiBgIDogXCJcIlxuICAgICAgICB9PGltZyBrZXk9e2l9IHNyYz17cn0gYWx0PXtcXGAke2NvbC5sYWJlbCA/PyBjb2wubmFtZX0gXFwke2kgKyAxfVxcYH0gY2xhc3NOYW1lPVwiaC04IHctOCBvYmplY3QtY292ZXIgcm91bmRlZFwiIC8+KSB9PC9kaXY+YDtcbiAgICAgIGNhc2UgXCJqc29uLXNvbmFtdWZpbGVcIjpcbiAgICAgICAgcmV0dXJuIGA8ZGl2IGNsYXNzTmFtZT1cImZsZXggaXRlbXMtY2VudGVyIGdhcC0yXCI+eyR7Y29sTmFtZX0gPyA8aW1nIHNyYz17JHtjb2xOYW1lfS51cmx9IGFsdD17JHtjb2xOYW1lfS5uYW1lfSBjbGFzc05hbWU9XCJoLTggdy04IG9iamVjdC1jb3ZlciByb3VuZGVkXCIgLz4gOiAnLSd9PC9kaXY+YDtcbiAgICAgIGNhc2UgXCJqc29uLXNvbmFtdWZpbGUtYXJyYXlcIjpcbiAgICAgICAgcmV0dXJuIGA8ZGl2IGNsYXNzTmFtZT1cImZsZXggZ2FwLTFcIj57ICR7Y29sTmFtZX0/Lm1hcCgociwgaSkgPT4gJHtcbiAgICAgICAgICBjb2wubnVsbGFibGUgPyBgciAmJiBgIDogXCJcIlxuICAgICAgICB9PGltZyBrZXk9e2l9IHNyYz17ci51cmx9IGFsdD17XFxgJHtjb2wubGFiZWwgPz8gY29sLm5hbWV9IFxcJHtpICsgMX1cXGB9IGNsYXNzTmFtZT1cImgtOCB3LTggb2JqZWN0LWNvdmVyIHJvdW5kZWRcIiAvPikgfTwvZGl2PmA7XG4gICAgICBjYXNlIFwibnVtYmVyLXBsYWluXCI6XG4gICAgICAgIHJldHVybiBgPD57JHtjb2wubnVsbGFibGUgfHwgY29sLm5hbWUuaW5jbHVkZXMoXCIuXCIpID8gYCR7Y29sTmFtZX0gJiYgYCA6IFwiXCJ9bnVtRigke2NvbE5hbWV9KX08Lz5gO1xuICAgICAgY2FzZSBcIm9iamVjdFwiOlxuICAgICAgICByZXR1cm4gYDxzcGFuIGNsYXNzTmFtZT1cInRleHQteHNcIj57JHtjb2wubnVsbGFibGUgPyBgJHtjb2xOYW1lfSA/IGAgOiBcIlwifUpTT04uc3RyaW5naWZ5KCR7Y29sTmFtZX0pJHtjb2wubnVsbGFibGUgPyBgIDogJy0nYCA6IFwiXCJ9fTwvc3Bhbj5gO1xuICAgICAgY2FzZSBcIm9iamVjdC1waWNrXCI6IHtcbiAgICAgICAgY29uc3QgcGlja2VkQ2hpbGQgPSBjb2wuY2hpbGRyZW4/LmZpbmQoKGNoaWxkKSA9PiBjaGlsZC5uYW1lID09PSBjb2wuY29uZmlnPy5waWNrZWQpO1xuICAgICAgICBpZiAoIXBpY2tlZENoaWxkKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBvYmplY3QtcGljayDshKDtg50g7Iuk7YyoICjsmKTruIzsoJ3tirg6ICR7Y29sLm5hbWV9KWApO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLnJlbmRlckNvbHVtbihcbiAgICAgICAgICBlbnRpdHlJZCxcbiAgICAgICAgICBwaWNrZWRDaGlsZCxcbiAgICAgICAgICBuYW1lcyxcbiAgICAgICAgICBgJHtjb2xOYW1lfSR7Y29sLm51bGxhYmxlID8gXCI/XCIgOiBcIlwifWAsXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICBjYXNlIFwiYXJyYXlcIjpcbiAgICAgICAgcmV0dXJuIGA8PnsgLyogYXJyYXkgJHtjb2xOYW1lfSAqLyB9PC8+YDtcbiAgICAgIGNhc2UgXCJ2ZWN0b3JcIjpcbiAgICAgICAgLy8gdmVjdG9yIO2DgOyeheydgCDssKjsm5Ag7IiY66eMIO2RnOyLnCAo7Iuk7KCcIOuNsOydtO2EsOuKlCDrhIjrrLQg6rmAKVxuICAgICAgICByZXR1cm4gYDw+eyR7Y29sLm51bGxhYmxlID8gYCR7Y29sTmFtZX0gPyBgIDogXCJcIn1bVmVjdG9yOiB7JHtjb2xOYW1lfSR7Y29sLm51bGxhYmxlID8gXCJcIiA6IFwiID8/IFtdXCJ9Lmxlbmd0aH1kXSR7Y29sLm51bGxhYmxlID8gXCIgOiAnLSdcIiA6IFwiXCJ9fTwvPmA7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYOugjOuNlCDrtojqsIAg7Lus65+8ICR7Y29sLnJlbmRlclR5cGV9YCk7XG4gICAgfVxuICB9XG5cbiAgcmVuZGVyQ29sdW1uSW1wb3J0KFxuICAgIGVudGl0eUlkOiBzdHJpbmcsXG4gICAgY29sOiBSZW5kZXJpbmdOb2RlLFxuICAgIG5hbWVzOiBFbnRpdHlOYW1lc1JlY29yZCxcbiAgKTogKHN0cmluZyB8IG51bGwpW10ge1xuICAgIGlmIChjb2wucmVuZGVyVHlwZSA9PT0gXCJlbnVtc1wiKSB7XG4gICAgICBjb25zdCB7IGlkOiBlbnVtSWQgfSA9IGdldEVudW1JbmZvRnJvbUNvbE5hbWUobmFtZXMuY2FwaXRhbCwgY29sLm5hbWUpO1xuICAgICAgcmV0dXJuIFtgaW1wb3J0IHsgJHtlbnVtSWR9TGFiZWwgfSBmcm9tICdAL3NlcnZpY2VzL3NvbmFtdS5nZW5lcmF0ZWQnO2BdO1xuICAgIH0gZWxzZSBpZiAoY29sLnJlbmRlclR5cGUgPT09IFwib2JqZWN0XCIpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHJlbFByb3AgPSBnZXRSZWxhdGlvblByb3BGcm9tQ29sTmFtZShlbnRpdHlJZCwgY29sLm5hbWUpO1xuICAgICAgICBjb25zdCByZXN1bHQgPSAoY29sLmNoaWxkcmVuID8/IFtdKS5tYXAoKGNoaWxkKSA9PiB7XG4gICAgICAgICAgZW50aXR5SWQgPSByZWxQcm9wLndpdGg7XG4gICAgICAgICAgbmFtZXMgPSBFbnRpdHlNYW5hZ2VyLmdldE5hbWVzRnJvbUlkKHJlbFByb3Aud2l0aCk7XG4gICAgICAgICAgcmV0dXJuIHRoaXMucmVuZGVyQ29sdW1uSW1wb3J0KGVudGl0eUlkLCBjaGlsZCwgbmFtZXMpO1xuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIGZsYXQocmVzdWx0KTtcbiAgICAgIH0gY2F0Y2gge1xuICAgICAgICByZXR1cm4gW251bGxdO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoY29sLnJlbmRlclR5cGUgPT09IFwiYXJyYXlcIikge1xuICAgICAgaWYgKCFjb2wuZWxlbWVudCkgcmV0dXJuIFtudWxsXTtcbiAgICAgIHJldHVybiB0aGlzLnJlbmRlckNvbHVtbkltcG9ydChlbnRpdHlJZCwgY29sLmVsZW1lbnQsIG5hbWVzKTtcbiAgICB9XG5cbiAgICByZXR1cm4gW251bGxdO1xuICB9XG5cbiAgcmVuZGVyRmlsdGVySW1wb3J0KGVudGl0eUlkOiBzdHJpbmcsIGNvbDogUmVuZGVyaW5nTm9kZSwgbmFtZXM6IEVudGl0eU5hbWVzUmVjb3JkKSB7XG4gICAgaWYgKGNvbC5uYW1lID09PSBcInNlYXJjaFwiKSB7XG4gICAgICByZXR1cm4gYGltcG9ydCB7ICR7bmFtZXMuY2FwaXRhbH1TZWFyY2hJbnB1dCB9IGZyb20gXCJAL2NvbXBvbmVudHMvJHtuYW1lcy5mc30vJHtuYW1lcy5jYXBpdGFsfVNlYXJjaElucHV0XCI7YDtcbiAgICB9IGVsc2UgaWYgKGNvbC5yZW5kZXJUeXBlID09PSBcImVudW1zXCIpIHtcbiAgICAgIGlmIChjb2wubmFtZSA9PT0gXCJvcmRlckJ5XCIpIHtcbiAgICAgICAgY29uc3QgY29tcG9uZW50SWQgPSBgJHtuYW1lcy5jYXBpdGFsfSR7aW5mbGVjdGlvbi5jYW1lbGl6ZShjb2wubmFtZSl9U2VsZWN0YDtcbiAgICAgICAgcmV0dXJuIGBpbXBvcnQgeyAke2NvbXBvbmVudElkfSB9IGZyb20gXCJAL2NvbXBvbmVudHMvJHtuYW1lcy5mc30vJHtjb21wb25lbnRJZH1cIjtgO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBjb25zdCB7IGlkLCB0YXJnZXRFbnRpdHlOYW1lczogdGFyZ2V0TUROYW1lcyB9ID0gZ2V0RW51bUluZm9Gcm9tQ29sTmFtZShcbiAgICAgICAgICAgIGVudGl0eUlkLFxuICAgICAgICAgICAgY29sLm5hbWUsXG4gICAgICAgICAgKTtcbiAgICAgICAgICBjb25zdCBjb21wb25lbnRJZCA9IGAke2lkfVNlbGVjdGA7XG4gICAgICAgICAgcmV0dXJuIGBpbXBvcnQgeyAke2NvbXBvbmVudElkfSB9IGZyb20gXCJAL2NvbXBvbmVudHMvJHt0YXJnZXRNRE5hbWVzLmZzfS8ke2NvbXBvbmVudElkfVwiO2A7XG4gICAgICAgIH0gY2F0Y2gge1xuICAgICAgICAgIHJldHVybiBcIlwiO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChjb2wucmVuZGVyVHlwZSA9PT0gXCJudW1iZXItZmtfaWRcIiB8fCBjb2wucmVuZGVyVHlwZSA9PT0gXCJzdHJpbmctZmtfaWRcIikge1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgcmVsUHJvcCA9IGdldFJlbGF0aW9uUHJvcEZyb21Db2xOYW1lKGVudGl0eUlkLCBjb2wubmFtZS5yZXBsYWNlKFwiX2lkXCIsIFwiXCIpKTtcbiAgICAgICAgY29uc3QgdGFyZ2V0TmFtZXMgPSBFbnRpdHlNYW5hZ2VyLmdldE5hbWVzRnJvbUlkKHJlbFByb3Aud2l0aCk7XG4gICAgICAgIGNvbnN0IGNvbXBvbmVudElkID0gYCR7cmVsUHJvcC53aXRofUlkQXN5bmNTZWxlY3RgO1xuICAgICAgICByZXR1cm4gYGltcG9ydCB7ICR7Y29tcG9uZW50SWR9IH0gZnJvbSBcIkAvY29tcG9uZW50cy8ke3RhcmdldE5hbWVzLmZzfS8ke2NvbXBvbmVudElkfVwiO2A7XG4gICAgICB9IGNhdGNoIHtcbiAgICAgICAgcmV0dXJuIFwiXCI7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihg66CM642UIOu2iOqwgOuKpe2VnCDtlYTthLAg7J6E7Y+s7Yq4ICR7Y29sLm5hbWV9ICR7Y29sLnJlbmRlclR5cGV9YCk7XG4gICAgfVxuICB9XG5cbiAgcmVuZGVyRmlsdGVyKGVudGl0eUlkOiBzdHJpbmcsIGNvbDogUmVuZGVyaW5nTm9kZSwgbmFtZXM6IEVudGl0eU5hbWVzUmVjb3JkKSB7XG4gICAgaWYgKGNvbC5uYW1lID09PSBcInNlYXJjaFwiKSB7XG4gICAgICByZXR1cm4gXCJcIjtcbiAgICB9XG5cbiAgICBjb25zdCBpc0NsZWFyYWJsZSA9IGNvbC5vcHRpb25hbCA9PT0gdHJ1ZSAmJiBjb2wubmFtZSAhPT0gXCJvcmRlckJ5XCI7XG4gICAgbGV0IGNvbXBvbmVudElkOiBzdHJpbmc7XG4gICAgaWYgKGNvbC5yZW5kZXJUeXBlID09PSBcImVudW1zXCIpIHtcbiAgICAgIGlmIChjb2wubmFtZSA9PT0gXCJvcmRlckJ5XCIpIHtcbiAgICAgICAgY29tcG9uZW50SWQgPSBgJHtuYW1lcy5jYXBpdGFsfSR7aW5mbGVjdGlvbi5jYW1lbGl6ZShjb2wubmFtZSl9U2VsZWN0YDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgY29uc3QgeyBpZCB9ID0gZ2V0RW51bUluZm9Gcm9tQ29sTmFtZShlbnRpdHlJZCwgY29sLm5hbWUpO1xuICAgICAgICAgIGNvbXBvbmVudElkID0gYCR7aWR9U2VsZWN0YDtcbiAgICAgICAgfSBjYXRjaCB7XG4gICAgICAgICAgcmV0dXJuIFwiXCI7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiBgPCR7Y29tcG9uZW50SWR9IHsuLi5yZWdpc3RlcignJHtjb2wubmFtZX0nKX0gJHtpc0NsZWFyYWJsZSA/IFwiY2xlYXJhYmxlXCIgOiBcIlwifSAvPmA7XG4gICAgfSBlbHNlIGlmIChjb2wucmVuZGVyVHlwZSA9PT0gXCJudW1iZXItZmtfaWRcIiB8fCBjb2wucmVuZGVyVHlwZSA9PT0gXCJzdHJpbmctZmtfaWRcIikge1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgcmVsUHJvcCA9IGdldFJlbGF0aW9uUHJvcEZyb21Db2xOYW1lKGVudGl0eUlkLCBjb2wubmFtZS5yZXBsYWNlKFwiX2lkXCIsIFwiXCIpKTtcbiAgICAgICAgY29tcG9uZW50SWQgPSBgJHtyZWxQcm9wLndpdGh9SWRBc3luY1NlbGVjdGA7XG4gICAgICAgIHJldHVybiBgPCR7Y29tcG9uZW50SWR9IHsuLi5yZWdpc3RlcignJHtjb2wubmFtZX0nKX0gJHtcbiAgICAgICAgICBpc0NsZWFyYWJsZSA/IFwiY2xlYXJhYmxlXCIgOiBcIlwiXG4gICAgICAgIH0gc3Vic2V0PVwiQVwiIC8+YDtcbiAgICAgIH0gY2F0Y2gge1xuICAgICAgICByZXR1cm4gXCJcIjtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGDroIzrjZQg67aI6rCA64ql7ZWcIO2VhO2EsCDsnoTtj6ztirggJHtjb2wubmFtZX0gJHtjb2wucmVuZGVyVHlwZX1gKTtcbiAgICB9XG4gIH1cblxuICBnZXREZWZhdWx0KGNvbHVtbnM6IFJlbmRlcmluZ05vZGVbXSk6IHtcbiAgICBvcmRlckJ5OiBzdHJpbmc7XG4gICAgc2VhcmNoOiBzdHJpbmc7XG4gICAgaGFzU2VhcmNoOiBib29sZWFuO1xuICAgIGhhc09yZGVyQnk6IGJvb2xlYW47XG4gIH0ge1xuICAgIGNvbnN0IGRlZiA9IHtcbiAgICAgIG9yZGVyQnk6IFwiXCIsXG4gICAgICBzZWFyY2g6IFwiXCIsXG4gICAgICBoYXNTZWFyY2g6IGZhbHNlLFxuICAgICAgaGFzT3JkZXJCeTogZmFsc2UsXG4gICAgfTtcbiAgICBjb25zdCBvcmRlckJ5Wm9kVHlwZSA9IGNvbHVtbnMuZmluZCgoY29sKSA9PiBjb2wubmFtZSA9PT0gXCJvcmRlckJ5XCIpPy56b2RUeXBlO1xuICAgIGlmIChvcmRlckJ5Wm9kVHlwZSAmJiBvcmRlckJ5Wm9kVHlwZSBpbnN0YW5jZW9mIHouWm9kRW51bSkge1xuICAgICAgZGVmLm9yZGVyQnkgPSBPYmplY3Qua2V5cyhvcmRlckJ5Wm9kVHlwZS5lbnVtKVswXTtcbiAgICAgIGRlZi5oYXNPcmRlckJ5ID0gdHJ1ZTtcbiAgICB9XG4gICAgY29uc3Qgc2VhcmNoWm9kVHlwZSA9IGNvbHVtbnMuZmluZCgoY29sKSA9PiBjb2wubmFtZSA9PT0gXCJzZWFyY2hcIik/LnpvZFR5cGU7XG4gICAgaWYgKHNlYXJjaFpvZFR5cGUgJiYgc2VhcmNoWm9kVHlwZSBpbnN0YW5jZW9mIHouWm9kRW51bSkge1xuICAgICAgZGVmLnNlYXJjaCA9IE9iamVjdC5rZXlzKHNlYXJjaFpvZFR5cGUuZW51bSlbMF07XG4gICAgICBkZWYuaGFzU2VhcmNoID0gdHJ1ZTtcbiAgICB9XG4gICAgcmV0dXJuIGRlZjtcbiAgfVxuXG4gIGFzeW5jIHJlbmRlcih7IGVudGl0eUlkIH06IFRlbXBsYXRlT3B0aW9uc1tcInZpZXdfbGlzdFwiXSkge1xuICAgIGNvbnN0IHsgZ2V0Q29sdW1uc05vZGUgfSA9IGF3YWl0IGltcG9ydChcIi4uL2VudGl0eS1jb252ZXJ0ZXJcIik7XG4gICAgY29uc3QgeyBnZXRab2RUeXBlQnlJZCwgem9kVHlwZVRvUmVuZGVyaW5nTm9kZSB9ID0gYXdhaXQgaW1wb3J0KFwiLi4vem9kLWNvbnZlcnRlclwiKTtcblxuICAgIGNvbnN0IGNvbHVtbnNOb2RlID0gYXdhaXQgZ2V0Q29sdW1uc05vZGUoZW50aXR5SWQsIFwiQVwiKTtcbiAgICBjb25zdCBsaXN0UGFyYW1zWm9kVHlwZSA9IGF3YWl0IGdldFpvZFR5cGVCeUlkKGAke2VudGl0eUlkfUxpc3RQYXJhbXNgKTtcbiAgICBjb25zdCBsaXN0UGFyYW1zTm9kZSA9IHpvZFR5cGVUb1JlbmRlcmluZ05vZGUobGlzdFBhcmFtc1pvZFR5cGUpO1xuXG4gICAgY29uc3QgbmFtZXMgPSBFbnRpdHlNYW5hZ2VyLmdldE5hbWVzRnJvbUlkKGVudGl0eUlkKTtcbiAgICBjb25zdCBlbnRpdHkgPSBFbnRpdHlNYW5hZ2VyLmdldChlbnRpdHlJZCk7XG5cbiAgICAvLyBQSyDtg4DsnoUg6rCQ7KeAXG4gICAgY29uc3QgcGtUeXBlID0gZW50aXR5LmdldFBrVHlwZSgpO1xuICAgIGNvbnN0IGlkVHNUeXBlID0gcGtUeXBlID09PSBcInN0cmluZ1wiIHx8IHBrVHlwZSA9PT0gXCJ1dWlkXCIgPyBcInN0cmluZ1wiIDogXCJudW1iZXJcIjtcblxuICAgIC8vIOyLpOygnCDrpqzsiqTtirgg7Lus65+8XG4gICAgY29uc3QgY29sdW1ucyA9IChjb2x1bW5zTm9kZS5jaGlsZHJlbiBhcyBSZW5kZXJpbmdOb2RlW10pXG5cbiAgICAgIC50b1NvcnRlZCgoYSwgYikgPT4gKGEubmFtZSA9PT0gXCJpZFwiID8gLTEgOiBiLm5hbWUgPT09IFwiaWRcIiA/IDEgOiAwKSlcbiAgICAgIC5tYXAoKGNvbCkgPT4ge1xuICAgICAgICBjb25zdCByZW5kZXJlZCA9IHRoaXMucmVuZGVyQ29sdW1uKGVudGl0eUlkLCBjb2wsIG5hbWVzKTtcblxuICAgICAgICAvLyDrnbzrsqgg7IOd7ISxOiBjb21tb24g7ZWE65OcKGNyZWF0ZWRfYXQp64qUIFNEKFwiY29tbW9uLntmaWVsZH1cIiksIGVudGl0eSDtlYTrk5zripQgU0QoXCJlbnRpdHkue0VudGl0eX0ue2ZpZWxkfVwiKVxuICAgICAgICBsZXQgbGFiZWw6IHN0cmluZztcbiAgICAgICAgaWYgKGNvbC5uYW1lID09PSBcImlkXCIpIHtcbiAgICAgICAgICBsYWJlbCA9ICdcIklEXCInO1xuICAgICAgICB9IGVsc2UgaWYgKFtcImNyZWF0ZWRfYXRcIl0uaW5jbHVkZXMoY29sLm5hbWUpKSB7XG4gICAgICAgICAgLy8gY2FtZWxDYXNl66GcIOuzgO2ZmCAoY3JlYXRlZF9hdCAtPiBjcmVhdGVkQXQpXG4gICAgICAgICAgY29uc3QgY2FtZWxOYW1lID0gY29sLm5hbWUucmVwbGFjZSgvXyhbYS16XSkvZywgKF8sIGNoYXIpID0+IGNoYXIudG9VcHBlckNhc2UoKSk7XG4gICAgICAgICAgbGFiZWwgPSBgU0QoXCJjb21tb24uJHtjYW1lbE5hbWV9XCIpYDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBjb25zdCBsYWJlbE5hbWUgPSBnZXRSZWxhdGlvbk5hbWVGcm9tQ29sdW1uTmFtZShlbnRpdHlJZCwgY29sLm5hbWUpO1xuICAgICAgICAgIGxhYmVsID0gYFNEKFwiZW50aXR5LiR7bmFtZXMuY2FwaXRhbH0uJHtsYWJlbE5hbWV9XCIpYDtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgbmFtZTogY29sLm5hbWUsXG4gICAgICAgICAgbGFiZWwsXG4gICAgICAgICAgdGM6IGAocm93KSA9PiAke3JlbmRlcmVkfWAsXG4gICAgICAgICAgZml0OlxuICAgICAgICAgICAgY29sLm5hbWUgPT09IFwiaWRcIiB8fFxuICAgICAgICAgICAgY29sLnJlbmRlclR5cGUgPT09IFwibnVtYmVyLWlkXCIgfHxcbiAgICAgICAgICAgIGNvbC5yZW5kZXJUeXBlID09PSBcImRhdGV0aW1lXCIgfHxcbiAgICAgICAgICAgIGNvbC5yZW5kZXJUeXBlID09PSBcInN0cmluZy1kYXRldGltZVwiLFxuICAgICAgICAgIGFsaWduOiBjb2wubmFtZSA9PT0gXCJpZFwiIHx8IGNvbC5yZW5kZXJUeXBlID09PSBcIm51bWJlci1pZFwiID8gXCJjZW50ZXJcIiA6IHVuZGVmaW5lZCxcbiAgICAgICAgfTtcbiAgICAgIH0pO1xuXG4gICAgLy8g7ZWE7YSwIOy7rOufvFxuICAgIGNvbnN0IGZpbHRlckNvbHVtbnMgPSAobGlzdFBhcmFtc05vZGUuY2hpbGRyZW4gYXMgUmVuZGVyaW5nTm9kZVtdKVxuICAgICAgLmZpbHRlcihcbiAgICAgICAgKGNvbCkgPT5cbiAgICAgICAgICBjb2wubmFtZSAhPT0gXCJpZFwiICYmXG4gICAgICAgICAgY29sLm5hbWUgIT09IFwicXVlcnlNb2RlXCIgJiZcbiAgICAgICAgICBbXCJlbnVtc1wiLCBcIm51bWJlci1pZFwiLCBcIm51bWJlci1ma19pZFwiLCBcInN0cmluZy1ma19pZFwiXS5pbmNsdWRlcyhjb2wucmVuZGVyVHlwZSksXG4gICAgICApXG4gICAgICAvLyBvcmRlckJ56rCAIOqwgOyepSDrkqTroZwg7Jik6rKMIOyInOyEnCDsobDsoJVcbiAgICAgIC50b1NvcnRlZCgoYSkgPT4ge1xuICAgICAgICByZXR1cm4gYS5uYW1lID09PSBcIm9yZGVyQnlcIiA/IDEgOiAtMTtcbiAgICAgIH0pO1xuXG4gICAgLy8g7ZWE7YSwIOy7rOufvOydhCDtlITrpqwg7YWc7ZSM66a/7Jy866GcIOyEpOyglVxuICAgIGNvbnN0IHByZVRlbXBsYXRlczogUmVuZGVyZWRUZW1wbGF0ZVtcInByZVRlbXBsYXRlc1wiXSA9IFtdO1xuXG4gICAgLy8g7Lus65+87JeQ7IScIOyCrOyaqe2VmOuKlCBlbnVt65OkIOyImOynkVxuICAgIGNvbnN0IGNvbHVtbkVudW1zOiBzdHJpbmdbXSA9IFtdO1xuICAgIChjb2x1bW5zTm9kZS5jaGlsZHJlbiA/PyBbXSkuZm9yRWFjaCgoY29sKSA9PiB7XG4gICAgICBpZiAoY29sLnJlbmRlclR5cGUgPT09IFwiZW51bXNcIikge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGNvbnN0IHsgaWQ6IGVudW1JZCB9ID0gZ2V0RW51bUluZm9Gcm9tQ29sTmFtZShlbnRpdHlJZCwgY29sLm5hbWUpO1xuICAgICAgICAgIGNvbHVtbkVudW1zLnB1c2goZW51bUlkKTtcbiAgICAgICAgfSBjYXRjaCB7fVxuICAgICAgfVxuICAgIH0pO1xuXG4gICAgLy8g65SU7Y+07Yq4IO2MjOudvOuvuO2EsFxuICAgIC8vIGNvbnN0IGRlZiA9IHRoaXMuZ2V0RGVmYXVsdChmaWx0ZXJDb2x1bW5zKTtcblxuICAgIHJldHVybiB7XG4gICAgICAuLi50aGlzLmdldFRhcmdldEFuZFBhdGgobmFtZXMpLFxuICAgICAgYm9keTogYFxuaW1wb3J0IHsgdXNlU3RhdGUsIEZyYWdtZW50IH0gZnJvbSBcInJlYWN0XCI7XG5pbXBvcnQgeyBjcmVhdGVGaWxlUm91dGUsIHVzZU5hdmlnYXRlIH0gZnJvbSBcIkB0YW5zdGFjay9yZWFjdC1yb3V0ZXJcIjtcblxuaW1wb3J0IHsgQ2FyZCwgQ2FyZENvbnRlbnQsIENhcmRIZWFkZXIgfSBmcm9tIFwiQHNvbmFtdS1raXQvcmVhY3QtY29tcG9uZW50cy9jb21wb25lbnRzXCI7XG5pbXBvcnQgeyBCYWRnZSB9IGZyb20gXCJAc29uYW11LWtpdC9yZWFjdC1jb21wb25lbnRzL2NvbXBvbmVudHNcIjtcbmltcG9ydCB7IEJ1dHRvbiB9IGZyb20gXCJAc29uYW11LWtpdC9yZWFjdC1jb21wb25lbnRzL2NvbXBvbmVudHNcIjtcbmltcG9ydCB7IFBhZ2luYXRpb24sIFRhYmxlLCBUYWJsZUJvZHksIFRhYmxlQ2VsbCwgdHlwZSBUYWJsZUNvbCwgVGFibGVIZWFkLCBUYWJsZUhlYWRlciwgVGFibGVSb3cgfSBmcm9tIFwiQHNvbmFtdS1raXQvcmVhY3QtY29tcG9uZW50cy9jb21wb25lbnRzXCI7XG5pbXBvcnQgeyBFbnVtU2VsZWN0IH0gZnJvbSBcIkBzb25hbXUta2l0L3JlYWN0LWNvbXBvbmVudHMvY29tcG9uZW50c1wiO1xuaW1wb3J0IHsgQWxlcnREaWFsb2csIEFsZXJ0RGlhbG9nQWN0aW9uLCBBbGVydERpYWxvZ0NhbmNlbCwgQWxlcnREaWFsb2dDb250ZW50LCBBbGVydERpYWxvZ0Rlc2NyaXB0aW9uLCBBbGVydERpYWxvZ0Zvb3RlciwgQWxlcnREaWFsb2dIZWFkZXIsIEFsZXJ0RGlhbG9nVGl0bGUgfSBmcm9tIFwiQHNvbmFtdS1raXQvcmVhY3QtY29tcG9uZW50cy9jb21wb25lbnRzXCI7XG5pbXBvcnQgeyBJbnB1dCB9IGZyb20gXCJAc29uYW11LWtpdC9yZWFjdC1jb21wb25lbnRzL2NvbXBvbmVudHNcIjtcbmltcG9ydCB7IENoZWNrYm94IH0gZnJvbSBcIkBzb25hbXUta2l0L3JlYWN0LWNvbXBvbmVudHMvY29tcG9uZW50c1wiO1xuaW1wb3J0IHsgU29uYW11RmlsdGVyTW9kYWwsIFNvbmFtdUZpbHRlclBvcG92ZXIsIGV4dHJhY3RGaWVsZE1ldGFGcm9tU2NoZW1hLCB0eXBlIFJ1bGUgfSBmcm9tIFwiQHNvbmFtdS1raXQvcmVhY3QtY29tcG9uZW50cy9jb21wb25lbnRzXCI7XG5cbmltcG9ydCB7IHVzZUxpc3RQYXJhbXMsIG51bUYsIGRhdGVGLCBkYXRldGltZUYgfSBmcm9tIFwiQHNvbmFtdS1raXQvcmVhY3QtY29tcG9uZW50cy9saWJcIjtcbmltcG9ydCB7ICR7bmFtZXMuY2FwaXRhbH1TdWJzZXRBLCAke25hbWVzLmNhcGl0YWx9QmFzZVNjaGVtYSB9IGZyb20gXCJAL3NlcnZpY2VzL3NvbmFtdS5nZW5lcmF0ZWRcIjtcbmltcG9ydCB7ICR7bmFtZXMuY2FwaXRhbH1TZXJ2aWNlIH0gZnJvbSBcIkAvc2VydmljZXMvc2VydmljZXMuZ2VuZXJhdGVkXCI7XG5pbXBvcnQgeyAke25hbWVzLmNhcGl0YWx9TGlzdFBhcmFtcyB9IGZyb20gXCJAL3NlcnZpY2VzLyR7bmFtZXMuZnN9LyR7bmFtZXMuZnN9LnR5cGVzXCI7XG5pbXBvcnQgeyAkeygoKSA9PiB7XG4gICAgICAgIC8vIOq4sOuzuCBlbnVtIOyImOynkSAoZmlsdGVyQ29sdW1uc+yXkCDsnojripQg6rKD66eMKVxuICAgICAgICBjb25zdCBiYXNlRW51bXM6IHN0cmluZ1tdID0gW107XG4gICAgICAgIGlmIChmaWx0ZXJDb2x1bW5zLnNvbWUoKGNvbCkgPT4gY29sLm5hbWUgPT09IFwib3JkZXJCeVwiKSkge1xuICAgICAgICAgIGJhc2VFbnVtcy5wdXNoKGAke25hbWVzLmNhcGl0YWx9T3JkZXJCeWAsIGAke25hbWVzLmNhcGl0YWx9T3JkZXJCeUxhYmVsYCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGZpbHRlckNvbHVtbnMuc29tZSgoY29sKSA9PiBjb2wubmFtZSA9PT0gXCJzZWFyY2hcIikpIHtcbiAgICAgICAgICBiYXNlRW51bXMucHVzaChgJHtuYW1lcy5jYXBpdGFsfVNlYXJjaEZpZWxkYCwgYCR7bmFtZXMuY2FwaXRhbH1TZWFyY2hGaWVsZExhYmVsYCk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyDtlYTthLAgZW51bSDsiJjsp5EgKGNvbmZpZy5lbnVtSWQg7Jqw7ISgLCDsl4bsnLzrqbQgZ2V0RW51bUluZm9Gcm9tQ29sTmFtZSlcbiAgICAgICAgY29uc3QgZmlsdGVyRW51bUlkcyA9IGZpbHRlckNvbHVtbnNcbiAgICAgICAgICAuZmlsdGVyKFxuICAgICAgICAgICAgKGNvbCkgPT4gY29sLnJlbmRlclR5cGUgPT09IFwiZW51bXNcIiAmJiBjb2wubmFtZSAhPT0gXCJzZWFyY2hcIiAmJiBjb2wubmFtZSAhPT0gXCJvcmRlckJ5XCIsXG4gICAgICAgICAgKVxuICAgICAgICAgIC5tYXAoKGNvbCkgPT4ge1xuICAgICAgICAgICAgaWYgKGNvbC5jb25maWcgJiYgXCJlbnVtSWRcIiBpbiBjb2wuY29uZmlnKSB7XG4gICAgICAgICAgICAgIHJldHVybiAoY29sLmNvbmZpZyBhcyB7IGVudW1JZDogc3RyaW5nIH0pLmVudW1JZDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgIGNvbnN0IHsgaWQ6IGVudW1JZCB9ID0gZ2V0RW51bUluZm9Gcm9tQ29sTmFtZShlbnRpdHlJZCwgY29sLm5hbWUpO1xuICAgICAgICAgICAgICByZXR1cm4gZW51bUlkO1xuICAgICAgICAgICAgfSBjYXRjaCB7XG4gICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pXG4gICAgICAgICAgLmZpbHRlcihCb29sZWFuKSBhcyBzdHJpbmdbXTtcblxuICAgICAgICAvLyDrqqjrk6AgZW51bSDtlansuZjqs6Ag7KSR67O1IOygnOqxsFxuICAgICAgICBjb25zdCBhbGxFbnVtcyA9IFsuLi5uZXcgU2V0KFsuLi5maWx0ZXJFbnVtSWRzLCAuLi5jb2x1bW5FbnVtc10pXTtcbiAgICAgICAgY29uc3QgZW51bUltcG9ydHMgPSBhbGxFbnVtcy5mbGF0TWFwKChlbnVtSWQpID0+IFtgJHtlbnVtSWR9YCwgYCR7ZW51bUlkfUxhYmVsYF0pO1xuXG4gICAgICAgIHJldHVybiBbLi4uYmFzZUVudW1zLCAuLi5lbnVtSW1wb3J0c10uam9pbihcIiwgXCIpO1xuICAgICAgfSkoKX0gfSBmcm9tIFwiQC9zZXJ2aWNlcy9zb25hbXUuZ2VuZXJhdGVkXCI7XG5pbXBvcnQgeyBJZEFzeW5jU2VsZWN0IH0gZnJvbSBcIkBzb25hbXUta2l0L3JlYWN0LWNvbXBvbmVudHMvY29tcG9uZW50c1wiO1xuJHsoKCkgPT4ge1xuICAvLyBGSyDtlYTrk5zsnZggQXN5bmNJZENvbmZpZyBpbXBvcnRcbiAgY29uc3QgZmtDb2x1bW5zID0gZmlsdGVyQ29sdW1ucy5maWx0ZXIoXG4gICAgKGNvbCkgPT4gY29sLnJlbmRlclR5cGUgPT09IFwibnVtYmVyLWZrX2lkXCIgfHwgY29sLnJlbmRlclR5cGUgPT09IFwic3RyaW5nLWZrX2lkXCIsXG4gICk7XG4gIGNvbnN0IGNvbmZpZ05hbWVzID0gZmtDb2x1bW5zXG4gICAgLm1hcCgoY29sKSA9PiB7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCByZWxQcm9wID0gZ2V0UmVsYXRpb25Qcm9wRnJvbUNvbE5hbWUoZW50aXR5SWQsIGNvbC5uYW1lLnJlcGxhY2UoXCJfaWRcIiwgXCJcIikpO1xuICAgICAgICByZXR1cm4gYCR7cmVsUHJvcC53aXRofUFzeW5jSWRDb25maWdgO1xuICAgICAgfSBjYXRjaCB7XG4gICAgICAgIHJldHVybiBcIlwiO1xuICAgICAgfVxuICAgIH0pXG4gICAgLmZpbHRlcihCb29sZWFuKTtcbiAgcmV0dXJuIGNvbmZpZ05hbWVzLmxlbmd0aCA+IDBcbiAgICA/IGBpbXBvcnQgeyAke2NvbmZpZ05hbWVzLmpvaW4oXCIsIFwiKX0gfSBmcm9tIFwiQC9zZXJ2aWNlcy9zZXJ2aWNlcy5nZW5lcmF0ZWRcIjtgXG4gICAgOiBcIlwiO1xufSkoKX1cblxuaW1wb3J0IEVkaXRJY29uIGZyb20gXCJ+aWNvbnMvbHVjaWRlL3NxdWFyZS1wZW5cIjtcbmltcG9ydCBUcmFzaEljb24gZnJvbSBcIn5pY29ucy9sdWNpZGUvdHJhc2gtMlwiO1xuaW1wb3J0IEZpbHRlckljb24gZnJvbSBcIn5pY29ucy9tZGkvZmlsdGVyLXZhcmlhbnRcIjtcbmltcG9ydCBMaXN0SWNvbiBmcm9tIFwifmljb25zL21kaS9mb3JtYXQtbGlzdC1idWxsZXRlZFwiO1xuaW1wb3J0IFNlYXJjaEljb24gZnJvbSBcIn5pY29ucy9tZGkvbWFnbmlmeVwiO1xuaW1wb3J0IHsgU0QgfSBmcm9tIFwiQC9pMThuL3NkLmdlbmVyYXRlZFwiO1xuXG5leHBvcnQgY29uc3QgUm91dGUgPSBjcmVhdGVGaWxlUm91dGUoXCIvYWRtaW4vJHtuYW1lcy5mc1BsdXJhbH0vXCIpKHtcXG4gIGhlYWQ6ICgpID0+ICh7XFxuICAgIG1ldGE6IFtcXG4gICAgICB7IHRpdGxlOiBcIiR7ZW50aXR5LnRpdGxlID8/IG5hbWVzLmNhcGl0YWx9IExpc3RcIiB9LFxcbiAgICAgIHsgbmFtZTogXCJkZXNjcmlwdGlvblwiLCBjb250ZW50OiBTRChcImVudGl0eS5saXN0TWFuYWdlXCIpKFwiJHtlbnRpdHkudGl0bGUgPz8gbmFtZXMuY2FwaXRhbH1cIikgfSxcXG4gICAgXSxcXG4gIH0pLFxcbiAgY29tcG9uZW50OiAke25hbWVzLmNhcGl0YWx9TGlzdCxcXG59KTtcXG5cXG50eXBlICR7bmFtZXMuY2FwaXRhbH1MaXN0UHJvcHMgPSB7fTtcblxuZnVuY3Rpb24gJHtuYW1lcy5jYXBpdGFsfUxpc3Qoe306ICR7bmFtZXMuY2FwaXRhbH1MaXN0UHJvcHMpIHtcbiAgY29uc3QgbmF2aWdhdGUgPSB1c2VOYXZpZ2F0ZSgpO1xuXG4gIC8vIOyDge2DnCDqtIDrpqxcbiAgY29uc3QgW3NlbGVjdGVkSXRlbXMsIHNldFNlbGVjdGVkSXRlbXNdID0gdXNlU3RhdGU8U2V0PCR7aWRUc1R5cGV9Pj4obmV3IFNldCgpKTtcbiAgY29uc3QgW2RlbGV0ZURpYWxvZ09wZW4sIHNldERlbGV0ZURpYWxvZ09wZW5dID0gdXNlU3RhdGUoZmFsc2UpO1xuICBjb25zdCBbaXRlbVRvRGVsZXRlLCBzZXRJdGVtVG9EZWxldGVdID0gdXNlU3RhdGU8eyBpZDogJHtpZFRzVHlwZX07IG5hbWU/OiBzdHJpbmcgfSB8IG51bGw+KG51bGwpO1xuICBjb25zdCBbZmlsdGVyTW9kYWxPcGVuLCBzZXRGaWx0ZXJNb2RhbE9wZW5dID0gdXNlU3RhdGUoZmFsc2UpO1xuICBjb25zdCBbYXBwbGllZFJ1bGVzLCBzZXRBcHBsaWVkUnVsZXNdID0gdXNlU3RhdGU8UnVsZVtdPihbXSk7XG5cbiAgLy8g66as7Iqk7Yq4IO2VhO2EsFxuICBjb25zdCB7IGxpc3RQYXJhbXMsIHJlZ2lzdGVyLCBzZXRMaXN0UGFyYW1zIH0gPSB1c2VMaXN0UGFyYW1zKCR7bmFtZXMuY2FwaXRhbH1MaXN0UGFyYW1zLCB7XG4gICAgbnVtOiAxMCxcbiAgICBwYWdlOiAxLFxuICAgIGtleXdvcmQ6IFwiXCIsJHtcbiAgICAgIGZpbHRlckNvbHVtbnMuc29tZSgoY29sKSA9PiBjb2wubmFtZSA9PT0gXCJzZWFyY2hcIilcbiAgICAgICAgPyBgXG4gICAgc2VhcmNoOiAke25hbWVzLmNhcGl0YWx9U2VhcmNoRmllbGQub3B0aW9uc1swXSxgXG4gICAgICAgIDogXCJcIlxuICAgIH0ke1xuICAgICAgZmlsdGVyQ29sdW1ucy5zb21lKChjb2wpID0+IGNvbC5uYW1lID09PSBcIm9yZGVyQnlcIilcbiAgICAgICAgPyBgXG4gICAgb3JkZXJCeTogJHtuYW1lcy5jYXBpdGFsfU9yZGVyQnkub3B0aW9uc1swXSxgXG4gICAgICAgIDogXCJcIlxuICAgIH1cbiAgICBzb25hbXVGaWx0ZXI6IHt9LFxuICB9KTtcblxuICAvLyDrpqzsiqTtirgg7L+866asXG4gIGNvbnN0IHsgZGF0YSwgcmVmZXRjaCwgaXNMb2FkaW5nIH0gPSAke25hbWVzLmNhcGl0YWx9U2VydmljZS51c2Uke25hbWVzLmNhcGl0YWxQbHVyYWx9KFwiQVwiLCBsaXN0UGFyYW1zKTtcbiAgY29uc3QgeyByb3dzLCB0b3RhbCB9ID0gZGF0YSA/PyB7fTtcblxuICAvLyDtmITsnqwg6rK966Gc7JmAIO2DgOydtO2LgFxuICBjb25zdCBQQUdFID0ge1xuICAgIHJvdXRlOiBcIi9hZG1pbi8ke25hbWVzLmZzUGx1cmFsfVwiLFxuICAgIHRpdGxlOiBTRChcImVudGl0eS5saXN0XCIpKFNEKFwiZW50aXR5LiR7bmFtZXMuY2FwaXRhbH1cIikpLFxuICB9O1xuXG4gIC8vIOy7rOufvCDsoJXsnZhcbiAgdHlwZSAke25hbWVzLmNhcGl0YWx9Um93ID0gTm9uTnVsbGFibGU8dHlwZW9mIHJvd3M+W251bWJlcl07XG4gIGNvbnN0IGNvbHVtbnM6IFRhYmxlQ29sPCR7bmFtZXMuY2FwaXRhbH1Sb3c+W10gPSBbXG4ke2NvbHVtbnNcbiAgLm1hcChcbiAgICAoY29sKSA9PiBgICAgIHtcbiAgICAgIGxhYmVsOiAke2NvbC5sYWJlbH0sXG4gICAgICB0YzogJHtjb2wudGN9LCR7XG4gICAgICAgIGNvbC5maXRcbiAgICAgICAgICA/IGBcbiAgICAgIGZpdDogdHJ1ZSxgXG4gICAgICAgICAgOiBcIlwiXG4gICAgICB9JHtcbiAgICAgICAgY29sLmFsaWduXG4gICAgICAgICAgPyBgXG4gICAgICBhbGlnbjogXCIke2NvbC5hbGlnbn1cIixgXG4gICAgICAgICAgOiBcIlwiXG4gICAgICB9XG4gICAgfWAsXG4gIClcbiAgLmpvaW4oXCIsXFxuXCIpfSxcbiAgICB7XG4gICAgICBsYWJlbDogU0QoXCJjb21tb24ubWFuYWdlXCIpLFxuICAgICAgZml0OiB0cnVlLFxuICAgICAgYWxpZ246IFwiY2VudGVyXCIsXG4gICAgICB0YzogKHJvdykgPT4gKFxuICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImZsZXggaXRlbXMtY2VudGVyIGp1c3RpZnktY2VudGVyIGdhcC0xXCI+XG4gICAgICAgICAgPEJ1dHRvblxuICAgICAgICAgICAgdmFyaWFudD1cInllbGxvd1wiXG4gICAgICAgICAgICBzaXplPVwieHNcIlxuICAgICAgICAgICAgaWNvbj17PEVkaXRJY29uIC8+fVxuICAgICAgICAgICAgb25DbGljaz17KCkgPT4gbmF2aWdhdGUoeyB0bzogXFxgXFwke1BBR0Uucm91dGV9L2Zvcm1cXGAsIHNlYXJjaDogeyBpZDogcm93LmlkIH0gfSl9XG4gICAgICAgICAgLz5cbiAgICAgICAgICA8QnV0dG9uXG4gICAgICAgICAgICB2YXJpYW50PVwicmVkXCJcbiAgICAgICAgICAgIHNpemU9XCJ4c1wiXG4gICAgICAgICAgICBpY29uPXs8VHJhc2hJY29uIC8+fVxuICAgICAgICAgICAgb25DbGljaz17KCkgPT4gaGFuZGxlRGVsZXRlQ2xpY2socm93LmlkKX1cbiAgICAgICAgICAvPlxuICAgICAgICA8L2Rpdj5cbiAgICAgICksXG4gICAgfSxcbiAgXTtcblxuICAvLyDshKDtg50g7ZW465Ok65+sXG4gIGNvbnN0IGhhbmRsZVRvZ2dsZUl0ZW0gPSAoaWQ6ICR7aWRUc1R5cGV9KSA9PiB7XG4gICAgY29uc3QgbmV3U2VsZWN0aW9uID0gbmV3IFNldChzZWxlY3RlZEl0ZW1zKTtcbiAgICBpZiAobmV3U2VsZWN0aW9uLmhhcyhpZCkpIHtcbiAgICAgIG5ld1NlbGVjdGlvbi5kZWxldGUoaWQpO1xuICAgIH0gZWxzZSB7XG4gICAgICBuZXdTZWxlY3Rpb24uYWRkKGlkKTtcbiAgICB9XG4gICAgc2V0U2VsZWN0ZWRJdGVtcyhuZXdTZWxlY3Rpb24pO1xuICB9O1xuXG4gIGNvbnN0IGlzQWxsU2VsZWN0ZWQgPSAoKSA9PiB7XG4gICAgcmV0dXJuIChyb3dzPy5sZW5ndGggPz8gMCkgPiAwICYmIHJvd3MhLmV2ZXJ5KChyb3cpID0+IHNlbGVjdGVkSXRlbXMuaGFzKHJvdy5pZCkpO1xuICB9O1xuXG4gIGNvbnN0IGhhbmRsZVNlbGVjdEFsbCA9IChjaGVja2VkOiBib29sZWFuKSA9PiB7XG4gICAgaWYgKGNoZWNrZWQpIHtcbiAgICAgIHNldFNlbGVjdGVkSXRlbXMobmV3IFNldChyb3dzPy5tYXAoKHJvdykgPT4gcm93LmlkKSA/PyBbXSkpO1xuICAgIH0gZWxzZSB7XG4gICAgICBzZXRTZWxlY3RlZEl0ZW1zKG5ldyBTZXQoKSk7XG4gICAgfVxuICB9O1xuXG4gIC8vIOyCreygnCDtlbjrk6Trn6xcbiAgY29uc3QgaGFuZGxlRGVsZXRlQ2xpY2sgPSAoaWQ6ICR7aWRUc1R5cGV9LCBuYW1lPzogc3RyaW5nKSA9PiB7XG4gICAgc2V0SXRlbVRvRGVsZXRlKHsgaWQsIG5hbWUgfSk7XG4gICAgc2V0RGVsZXRlRGlhbG9nT3Blbih0cnVlKTtcbiAgfTtcblxuICBjb25zdCBoYW5kbGVDb25maXJtRGVsZXRlID0gKCkgPT4ge1xuICAgIGlmIChpdGVtVG9EZWxldGUpIHtcbiAgICAgICR7bmFtZXMuY2FwaXRhbH1TZXJ2aWNlLmRlbChbaXRlbVRvRGVsZXRlLmlkXSkudGhlbigoKSA9PiB7XG4gICAgICAgIHJlZmV0Y2goKTtcbiAgICAgIH0pO1xuICAgIH1cbiAgICBzZXREZWxldGVEaWFsb2dPcGVuKGZhbHNlKTtcbiAgICBzZXRJdGVtVG9EZWxldGUobnVsbCk7XG4gIH07XG5cbiAgcmV0dXJuIChcbiAgICA8ZGl2IGNsYXNzTmFtZT1cImZsZXgtMSBvdmVyZmxvdy1hdXRvXCI+XG4gICAgICA8ZGl2IGNsYXNzTmFtZT1cIm1heC13LVsxODAwcHhdIG14LWF1dG8gcC04XCI+XG4gICAgICAgIDxkaXYgY2xhc3NOYW1lPVwic3BhY2UteS02IG1iLThcIj5cbiAgICAgICAgICB7LyogSGVhZGVyICovfVxuICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZmxleCBpdGVtcy1jZW50ZXIgZ2FwLTJcIj5cbiAgICAgICAgICAgIDxMaXN0SWNvbiBjbGFzc05hbWU9XCJoLTUgdy01XCIgLz5cbiAgICAgICAgICAgIDxzcGFuIGNsYXNzTmFtZT1cInRleHQtbGcgZm9udC1zZW1pYm9sZCBoLTVcIj57UEFHRS50aXRsZX08L3NwYW4+XG4gICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICA8Q2FyZCBjbGFzc05hbWU9XCJzaGFkb3ctc20gYm9yZGVyLWJvcmRlci80MCBvdmVyZmxvdy1oaWRkZW5cIj5cbiAgICAgICAgICAgIDxDYXJkSGVhZGVyIGNsYXNzTmFtZT1cInBiLTAgcHgtMCBwdC0wXCI+XG4gICAgICAgICAgICAgIHsvKiBGaWx0ZXJzICovfVxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImJnLWdyYXktMTAwIHB4LTYgcHktNCBzcGFjZS15LTNcIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImZsZXggaXRlbXMtY2VudGVyIGdhcC0zIGZsZXgtd3JhcFwiPlxuJHtcbiAgZmlsdGVyQ29sdW1ucy5zb21lKChjb2wpID0+IGNvbC5uYW1lID09PSBcInNlYXJjaFwiKVxuICAgID8gYCAgICAgICAgICAgICAgICAgIDxFbnVtU2VsZWN0XG4gICAgICAgICAgICAgICAgICAgIGVudW09eyR7bmFtZXMuY2FwaXRhbH1TZWFyY2hGaWVsZH1cbiAgICAgICAgICAgICAgICAgICAgbGFiZWxzPXske25hbWVzLmNhcGl0YWx9U2VhcmNoRmllbGRMYWJlbH1cbiAgICAgICAgICAgICAgICAgICAgey4uLnJlZ2lzdGVyKFwic2VhcmNoXCIpfVxuICAgICAgICAgICAgICAgICAgICBwbGFjZWhvbGRlcj17U0QoXCJjb21tb24uc2VhcmNoVHlwZVwiKX1cbiAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lPVwidy01MCBoLTggYmctd2hpdGUgYm9yZGVyLWdyYXktMzAwIHRleHQteHNcIlxuICAgICAgICAgICAgICAgICAgLz5gXG4gICAgOiBcIlwiXG59XG5cbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwicmVsYXRpdmUgZmxleC0xIG1heC13LXhzXCI+XG4gICAgICAgICAgICAgICAgICAgIDxJbnB1dFxuICAgICAgICAgICAgICAgICAgICAgIHsuLi5yZWdpc3RlcihcImtleXdvcmRcIil9XG4gICAgICAgICAgICAgICAgICAgICAgcGxhY2Vob2xkZXI9e1NEKFwiY29tbW9uLnNlYXJjaFwiKX1cbiAgICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWU9XCJoLTggcHItOCB0ZXh0LXhzIGJnLXdoaXRlIGJvcmRlci1ncmF5LTMwMFwiXG4gICAgICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgICAgICAgIDxCdXR0b25cbiAgICAgICAgICAgICAgICAgICAgICB2YXJpYW50PVwiZ2hvc3RcIlxuICAgICAgICAgICAgICAgICAgICAgIHNpemU9XCJzbVwiXG4gICAgICAgICAgICAgICAgICAgICAgaWNvbj17PFNlYXJjaEljb24gLz59XG4gICAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lPVwiYWJzb2x1dGUgcmlnaHQtMCB0b3AtMCBoLTggdy04IGhvdmVyOmJnLXRyYW5zcGFyZW50XCJcbiAgICAgICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cIm1sLWF1dG8gZmxleCBpdGVtcy1jZW50ZXIgZ2FwLTJcIj5cbiAgICAgICAgICAgICAgICAgICAgPEJ1dHRvblxuICAgICAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZT1cImgtOCBweC00IGJnLXByaW1hcnkgaG92ZXI6YmctcHJpbWFyeS85MCB0ZXh0LXdoaXRlXCJcbiAgICAgICAgICAgICAgICAgICAgICBvbkNsaWNrPXsoKSA9PiBuYXZpZ2F0ZSh7IHRvOiBcXGBcXCR7UEFHRS5yb3V0ZX0vZm9ybVxcYCB9KX1cbiAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzTmFtZT1cInRleHQteHNcIj57U0QoXCJjb21tb24uY3JlYXRlXCIpfTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgPC9CdXR0b24+XG4gICAgICAgICAgICAgICAgICAgIDxTb25hbXVGaWx0ZXJQb3BvdmVyXG4gICAgICAgICAgICAgICAgICAgICAgcnVsZXM9e2FwcGxpZWRSdWxlc31cbiAgICAgICAgICAgICAgICAgICAgICBmaWVsZE1ldGE9e2V4dHJhY3RGaWVsZE1ldGFGcm9tU2NoZW1hKFxuICAgICAgICAgICAgICAgICAgICAgICAgJHtuYW1lcy5jYXBpdGFsfUJhc2VTY2hlbWEsXG4gICAgICAgICAgICAgICAgICAgICAgICBTRCBhcyAoa2V5OiBzdHJpbmcpID0+IHN0cmluZyxcbiAgICAgICAgICAgICAgICAgICAgICApfVxuICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgPEJ1dHRvblxuICAgICAgICAgICAgICAgICAgICAgICAgdmFyaWFudD1cIm91dGxpbmVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZT1cInNtXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIGljb249ezxGaWx0ZXJJY29uIC8+fVxuICAgICAgICAgICAgICAgICAgICAgICAgb25DbGljaz17KCkgPT4gc2V0RmlsdGVyTW9kYWxPcGVuKHRydWUpfVxuICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lPVwiaC04XCJcbiAgICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzc05hbWU9XCJ0ZXh0LXhzXCI+e1NEKFwicmMuc29uYW11RmlsdGVyLnRpdGxlXCIpfTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgIHthcHBsaWVkUnVsZXMubGVuZ3RoID4gMCAmJiAoXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxCYWRnZSB2YXJpYW50PVwic2Vjb25kYXJ5XCIgY2xhc3NOYW1lPVwibWwtMVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHthcHBsaWVkUnVsZXMubGVuZ3RofVxuICAgICAgICAgICAgICAgICAgICAgICAgICA8L0JhZGdlPlxuICAgICAgICAgICAgICAgICAgICAgICAgKX1cbiAgICAgICAgICAgICAgICAgICAgICA8L0J1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgPC9Tb25hbXVGaWx0ZXJQb3BvdmVyPlxuICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImZsZXggaXRlbXMtY2VudGVyIGdhcC0zIGZsZXgtd3JhcFwiPlxuJHtmaWx0ZXJDb2x1bW5zXG4gIC5maWx0ZXIoKGNvbCkgPT4gY29sLm5hbWUgIT09IFwic2VhcmNoXCIgJiYgY29sLm5hbWUgIT09IFwib3JkZXJCeVwiKVxuICAubWFwKChjb2wpID0+IHtcbiAgICBpZiAoY29sLnJlbmRlclR5cGUgPT09IFwiZW51bXNcIikge1xuICAgICAgdHJ5IHtcbiAgICAgICAgLy8gY29uZmlnLmVudW1JZOqwgCDsnojsnLzrqbQg7Jqw7ISgIOyCrOyaqSwg7JeG7Jy866m0IGdldEVudW1JbmZvRnJvbUNvbE5hbWUg7Iuc64+EXG4gICAgICAgIGNvbnN0IGVudW1JZCA9XG4gICAgICAgICAgY29sLmNvbmZpZyAmJiBcImVudW1JZFwiIGluIGNvbC5jb25maWdcbiAgICAgICAgICAgID8gKGNvbC5jb25maWcgYXMgeyBlbnVtSWQ6IHN0cmluZyB9KS5lbnVtSWRcbiAgICAgICAgICAgIDogZ2V0RW51bUluZm9Gcm9tQ29sTmFtZShlbnRpdHlJZCwgY29sLm5hbWUpLmlkO1xuICAgICAgICByZXR1cm4gYCAgICAgICAgICAgICAgICAgIDxFbnVtU2VsZWN0XG4gICAgICAgICAgICAgICAgICAgIGtleT17XFxgJHtjb2wubmFtZX0tXFwke2xpc3RQYXJhbXMuJHtjb2wubmFtZX19XFxgfVxuICAgICAgICAgICAgICAgICAgICBlbnVtPXske2VudW1JZH19XG4gICAgICAgICAgICAgICAgICAgIGxhYmVscz17JHtlbnVtSWR9TGFiZWx9XG4gICAgICAgICAgICAgICAgICAgIHsuLi5yZWdpc3RlcihcIiR7Y29sLm5hbWV9XCIpfVxuICAgICAgICAgICAgICAgICAgICBwbGFjZWhvbGRlcj1cIiR7Y29sLmxhYmVsfVwiXG4gICAgICAgICAgICAgICAgICAgIGNsZWFyYWJsZVxuICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWU9XCJ3LTUwIGgtOCBiZy13aGl0ZSBib3JkZXItZ3JheS0zMDAgdGV4dC14c1wiXG4gICAgICAgICAgICAgICAgICAvPmA7XG4gICAgICB9IGNhdGNoIHtcbiAgICAgICAgcmV0dXJuIFwiXCI7XG4gICAgICB9XG4gICAgfVxuICAgIC8vIEZLIO2VhOuTnCAoSWRBc3luY1NlbGVjdClcbiAgICBpZiAoY29sLnJlbmRlclR5cGUgPT09IFwibnVtYmVyLWZrX2lkXCIgfHwgY29sLnJlbmRlclR5cGUgPT09IFwic3RyaW5nLWZrX2lkXCIpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHJlbFByb3AgPSBnZXRSZWxhdGlvblByb3BGcm9tQ29sTmFtZShlbnRpdHlJZCwgY29sLm5hbWUucmVwbGFjZShcIl9pZFwiLCBcIlwiKSk7XG4gICAgICAgIHJldHVybiBgICAgICAgICAgICAgICAgICAgPElkQXN5bmNTZWxlY3RcbiAgICAgICAgICAgICAgICAgICAgY29uZmlnPXske3JlbFByb3Aud2l0aH1Bc3luY0lkQ29uZmlnfVxuICAgICAgICAgICAgICAgICAgICBzdWJzZXQ9XCJBXCJcbiAgICAgICAgICAgICAgICAgICAgey4uLnJlZ2lzdGVyKFwiJHtjb2wubmFtZX1cIil9XG4gICAgICAgICAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwiJHtjb2wubGFiZWwgPz8gcmVsUHJvcC53aXRofVwiXG4gICAgICAgICAgICAgICAgICAgIGNsZWFyYWJsZVxuICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWU9XCJ3LTUwIGgtOCB0ZXh0LXhzXCJcbiAgICAgICAgICAgICAgICAgIC8+YDtcbiAgICAgIH0gY2F0Y2gge1xuICAgICAgICByZXR1cm4gXCJcIjtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIFwiXCI7XG4gIH0pXG4gIC5maWx0ZXIoQm9vbGVhbilcbiAgLmpvaW4oXCJcXG5cIil9XG4ke1xuICBmaWx0ZXJDb2x1bW5zLnNvbWUoKGNvbCkgPT4gY29sLm5hbWUgPT09IFwib3JkZXJCeVwiKVxuICAgID8gYCAgICAgICAgICAgICAgICAgIDxFbnVtU2VsZWN0XG4gICAgICAgICAgICAgICAgICAgIGVudW09eyR7bmFtZXMuY2FwaXRhbH1PcmRlckJ5fVxuICAgICAgICAgICAgICAgICAgICBsYWJlbHM9eyR7bmFtZXMuY2FwaXRhbH1PcmRlckJ5TGFiZWx9XG4gICAgICAgICAgICAgICAgICAgIHsuLi5yZWdpc3RlcihcIm9yZGVyQnlcIil9XG4gICAgICAgICAgICAgICAgICAgIHBsYWNlaG9sZGVyPXtTRChcImNvbW1vbi5zb3J0XCIpfVxuICAgICAgICAgICAgICAgICAgICB0ZXh0UHJlZml4PXtcXGBcXCR7U0QoXCJjb21tb24uc29ydFwiKX06IFxcYH1cbiAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lPVwidy01MCBoLTggYmctd2hpdGUgYm9yZGVyLWdyYXktMzAwIHRleHQteHNcIlxuICAgICAgICAgICAgICAgICAgLz5gXG4gICAgOiBcIlwiXG59XG4gICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzc05hbWU9XCJ0ZXh0LXhzIHRleHQtbXV0ZWQtZm9yZWdyb3VuZFwiPntTRChcImNvbW1vbi5yZXN1bHRzXCIpKHRvdGFsID8/IDApfTwvc3Bhbj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L0NhcmRIZWFkZXI+XG5cbiAgICAgICAgICAgIDxDYXJkQ29udGVudCBjbGFzc05hbWU9XCJweC02IHBiLTYgcHQtNiBiZy13aGl0ZVwiPlxuICAgICAgICAgICAgICB7LyogVGFibGUgKi99XG4gICAgICAgICAgICAgIDxUYWJsZT5cbiAgICAgICAgICAgICAgICA8VGFibGVIZWFkZXI+XG4gICAgICAgICAgICAgICAgICA8VGFibGVSb3cgY2xhc3NOYW1lPVwiaG92ZXI6YmctdHJhbnNwYXJlbnQgYmctZ3JheS0xMDBcIj5cbiAgICAgICAgICAgICAgICAgICAgPFRhYmxlSGVhZCBjbGFzc05hbWU9XCJoLTkgdGV4dC14cyB3LVs0MHB4XVwiPlxuICAgICAgICAgICAgICAgICAgICAgIDxDaGVja2JveFxuICAgICAgICAgICAgICAgICAgICAgICAgY2hlY2tlZD17aXNBbGxTZWxlY3RlZCgpfVxuICAgICAgICAgICAgICAgICAgICAgICAgb25WYWx1ZUNoYW5nZT17aGFuZGxlU2VsZWN0QWxsfVxuICAgICAgICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgICAgICAgIDwvVGFibGVIZWFkPlxuICAgICAgICAgICAgICAgICAgICB7Y29sdW1ucy5tYXAoKGNvbCwgaWR4KSA9PiAoXG4gICAgICAgICAgICAgICAgICAgICAgPFRhYmxlSGVhZCBrZXk9e2lkeH0gZml0PXtjb2wuZml0fSBhbGlnbj17Y29sLmFsaWdufT5cbiAgICAgICAgICAgICAgICAgICAgICAgIHtjb2wubGFiZWx9XG4gICAgICAgICAgICAgICAgICAgICAgPC9UYWJsZUhlYWQ+XG4gICAgICAgICAgICAgICAgICAgICkpfVxuICAgICAgICAgICAgICAgICAgPC9UYWJsZVJvdz5cbiAgICAgICAgICAgICAgICA8L1RhYmxlSGVhZGVyPlxuICAgICAgICAgICAgICAgIDxUYWJsZUJvZHk+XG4gICAgICAgICAgICAgICAgICB7IWlzTG9hZGluZyAmJiByb3dzICYmIHJvd3MubWFwKChyb3cpID0+IChcbiAgICAgICAgICAgICAgICAgICAgPEZyYWdtZW50IGtleT17cm93LmlkfT5cbiAgICAgICAgICAgICAgICAgICAgICA8VGFibGVSb3c+XG4gICAgICAgICAgICAgICAgICAgICAgICA8VGFibGVDZWxsIGNsYXNzTmFtZT1cInB5LTNcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPENoZWNrYm94XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hlY2tlZD17c2VsZWN0ZWRJdGVtcy5oYXMocm93LmlkKX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvblZhbHVlQ2hhbmdlPXsoKSA9PiBoYW5kbGVUb2dnbGVJdGVtKHJvdy5pZCl9XG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L1RhYmxlQ2VsbD5cbiAgICAgICAgICAgICAgICAgICAgICAgIHtjb2x1bW5zLm1hcCgoY29sLCBpZHgpID0+IChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPFRhYmxlQ2VsbCBrZXk9e2lkeH0gZml0PXtjb2wuZml0fSBhbGlnbj17Y29sLmFsaWdufSBjbGFzc05hbWU9XCJweS0zXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge2NvbC50Yyhyb3cpfVxuICAgICAgICAgICAgICAgICAgICAgICAgICA8L1RhYmxlQ2VsbD5cbiAgICAgICAgICAgICAgICAgICAgICAgICkpfVxuICAgICAgICAgICAgICAgICAgICAgIDwvVGFibGVSb3c+XG4gICAgICAgICAgICAgICAgICAgIDwvRnJhZ21lbnQ+XG4gICAgICAgICAgICAgICAgICApKX1cbiAgICAgICAgICAgICAgICA8L1RhYmxlQm9keT5cbiAgICAgICAgICAgICAgPC9UYWJsZT5cblxuICAgICAgICAgICAgICB7LyogUGFnaW5hdGlvbiAqL31cbiAgICAgICAgICAgICAgPFBhZ2luYXRpb25cbiAgICAgICAgICAgICAgICB7Li4ucmVnaXN0ZXIoXCJwYWdlXCIpfVxuICAgICAgICAgICAgICAgIHRvdGFsPXt0b3RhbCA/PyAwfVxuICAgICAgICAgICAgICAgIGl0ZW1zUGVyUGFnZT17bGlzdFBhcmFtcy5udW0gPz8gMTB9XG4gICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICA8L0NhcmRDb250ZW50PlxuICAgICAgICAgIDwvQ2FyZD5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cblxuICAgICAgey8qIERlbGV0ZSBEaWFsb2cgKi99XG4gICAgICA8QWxlcnREaWFsb2cgb3Blbj17ZGVsZXRlRGlhbG9nT3Blbn0gb25PcGVuQ2hhbmdlPXtzZXREZWxldGVEaWFsb2dPcGVufT5cbiAgICAgICAgPEFsZXJ0RGlhbG9nQ29udGVudD5cbiAgICAgICAgICA8QWxlcnREaWFsb2dIZWFkZXI+XG4gICAgICAgICAgICA8QWxlcnREaWFsb2dUaXRsZT57U0QoXCJkZWxldGUuY29uZmlybS50aXRsZVwiKX08L0FsZXJ0RGlhbG9nVGl0bGU+XG4gICAgICAgICAgICA8QWxlcnREaWFsb2dEZXNjcmlwdGlvbj57U0QoXCJkZWxldGUuY29uZmlybS5kZXNjcmlwdGlvblwiKX08L0FsZXJ0RGlhbG9nRGVzY3JpcHRpb24+XG4gICAgICAgICAgPC9BbGVydERpYWxvZ0hlYWRlcj5cbiAgICAgICAgICA8QWxlcnREaWFsb2dGb290ZXI+XG4gICAgICAgICAgICA8QWxlcnREaWFsb2dDYW5jZWw+e1NEKFwiY29tbW9uLmNhbmNlbFwiKX08L0FsZXJ0RGlhbG9nQ2FuY2VsPlxuICAgICAgICAgICAgPEFsZXJ0RGlhbG9nQWN0aW9uIG9uQ2xpY2s9e2hhbmRsZUNvbmZpcm1EZWxldGV9PlxuICAgICAgICAgICAgICB7U0QoXCJjb21tb24uZGVsZXRlXCIpfVxuICAgICAgICAgICAgPC9BbGVydERpYWxvZ0FjdGlvbj5cbiAgICAgICAgICA8L0FsZXJ0RGlhbG9nRm9vdGVyPlxuICAgICAgICA8L0FsZXJ0RGlhbG9nQ29udGVudD5cbiAgICAgIDwvQWxlcnREaWFsb2c+XG5cbiAgICAgIHsvKiBTb25hbXUgRmlsdGVyIE1vZGFsICovfVxuICAgICAgPFNvbmFtdUZpbHRlck1vZGFsXG4gICAgICAgIGJhc2VTY2hlbWE9eyR7bmFtZXMuY2FwaXRhbH1CYXNlU2NoZW1hfVxuICAgICAgICBvcGVuPXtmaWx0ZXJNb2RhbE9wZW59XG4gICAgICAgIG9uT3BlbkNoYW5nZT17c2V0RmlsdGVyTW9kYWxPcGVufVxuICAgICAgICBpbml0aWFsUnVsZXM9e2FwcGxpZWRSdWxlc31cbiAgICAgICAgb25BcHBseT17KGZpbHRlcnMsIHJ1bGVzKSA9PiB7XG4gICAgICAgICAgc2V0TGlzdFBhcmFtcyh7IC4uLmxpc3RQYXJhbXMsIHNvbmFtdUZpbHRlcjogZmlsdGVycywgcGFnZTogMSB9KTtcbiAgICAgICAgICBzZXRBcHBsaWVkUnVsZXMocnVsZXMpO1xuICAgICAgICB9fVxuICAgICAgLz5cbiAgICA8L2Rpdj5cbiAgKTtcbn1cbiAgICAgIGAudHJpbSgpLFxuICAgICAgaW1wb3J0S2V5czogW10sXG4gICAgICBwcmVUZW1wbGF0ZXMsXG4gICAgfTtcbiAgfVxufVxuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7OztxQkFJNEQ7Y0FPeEM7ZUFFbUI7QUFFdkMsSUFBYSxzQkFBYixjQUF5QyxTQUFTO0NBQ2hELGNBQWM7QUFDWixRQUFNLFlBQVk7O0NBR3BCLGlCQUFpQixPQUEwQjtBQUN6QyxTQUFPO0dBQ0wsUUFBUTtHQUNSLE1BQU0sR0FBRyxNQUFNLFNBQVM7R0FDekI7O0NBR0gsQUFBUyxzQkFBdUM7QUFDOUMsU0FBTyxDQUFDLHFCQUFxQixhQUFhOztDQUc1QyxPQUFPLE1BQWMsS0FBYSxhQUFzQixNQUFNLFlBQW9CLElBQUk7QUFDcEYsU0FBTyxvQkFBb0IsSUFBSSxHQUFHLGFBQWEsZ0JBQWdCLEtBQzdELFlBQVksaUJBQWlCLFVBQVUsT0FBTyxHQUMvQyxHQUFHLEtBQUs7O0NBR1gsYUFDRSxVQUNBLEtBQ0EsT0FDQSxZQUFvQixPQUNwQixjQUF1QixPQUNmO0VBRVIsSUFBSUE7QUFDSixNQUFJLGFBQWE7QUFDZixhQUFVO2FBQ0QsSUFBSSxLQUFLLFNBQVMsSUFBSSxFQUFFO0dBRWpDLE1BQU0sUUFBUSxJQUFJLEtBQUssTUFBTSxJQUFJO0FBQ2pDLGFBQVUsR0FBRyxVQUFVLEdBQUcsTUFBTSxLQUFLLEtBQUs7U0FDckM7QUFDTCxhQUFVLEdBQUcsVUFBVSxHQUFHLElBQUk7O0FBR2hDLFVBQVEsSUFBSSxZQUFaO0dBQ0UsS0FBSztHQUNMLEtBQUs7R0FDTCxLQUFLO0dBQ0wsS0FBSyxZQUNILFFBQU8sTUFBTSxRQUFRO0dBQ3ZCLEtBQUs7R0FDTCxLQUFLLGdCQUFnQjtBQUNuQixRQUFJO0tBQ0YsTUFBTSxXQUFXLElBQUksS0FBSyxTQUFTLElBQUksSUFDbEMsSUFBSSxLQUFLLE1BQU0sSUFBSSxDQUFDLEtBQUssSUFBSSxJQUFJLE1BQU0sUUFBUSxPQUFPLEdBQUcsR0FDMUQsSUFBSSxLQUFLLFFBQVEsT0FBTyxHQUFHO0tBQy9CLE1BQU0sWUFBWSwyQkFBMkIsVUFBVSxTQUFTO0FBQ2hFLFlBQU8sS0FBSyxVQUFVLEtBQUssSUFBSSxRQUFRO1lBQ2pDO0FBQ04sWUFBTyxNQUFNLFFBQVE7OztHQUd6QixLQUFLLFdBQ0gsS0FBSSxJQUFJLFlBQVksSUFBSSxLQUFLLFNBQVMsSUFBSSxFQUFFO0FBQzFDLFdBQU8sVUFBVSxRQUFRLGVBQWUsUUFBUTtVQUMzQztBQUNMLFdBQU8sb0JBQW9CLFFBQVE7O0dBRXZDLEtBQUssa0JBQ0gsS0FBSSxJQUFJLFlBQVksSUFBSSxLQUFLLFNBQVMsSUFBSSxFQUFFO0FBQzFDLFdBQU8sVUFBVSxRQUFRLFdBQVcsUUFBUTtVQUN2QztBQUNMLFdBQU8sZ0JBQWdCLFFBQVE7O0dBRW5DLEtBQUssVUFDSCxRQUFPLE1BQU0sUUFBUTtHQUN2QixLQUFLLFNBQVM7QUFDWixRQUFJO0tBQ0YsTUFBTSxFQUFFLElBQUksV0FBVyx1QkFBdUIsVUFBVSxJQUFJLEtBQUs7QUFDakUsWUFBTyxNQUFNLElBQUksV0FBVyxHQUFHLFFBQVEsUUFBUSxLQUFLLE9BQU8sUUFBUSxRQUFRO1lBQ3JFO0FBQ04sWUFBTyxNQUFNLFFBQVE7OztHQUd6QixLQUFLLGVBQ0gsUUFBTyxpQ0FBaUMsUUFBUSxrQkFDOUMsSUFBSSxXQUFXLFVBQVUsR0FDMUIsOEJBQThCLElBQUksU0FBUyxJQUFJLEtBQUs7R0FDdkQsS0FBSyxrQkFDSCxRQUFPLDZDQUE2QyxRQUFRLGVBQWUsUUFBUSxhQUFhLFFBQVE7R0FDMUcsS0FBSyx3QkFDSCxRQUFPLGlDQUFpQyxRQUFRLGtCQUM5QyxJQUFJLFdBQVcsVUFBVSxHQUMxQixrQ0FBa0MsSUFBSSxTQUFTLElBQUksS0FBSztHQUMzRCxLQUFLLGVBQ0gsUUFBTyxNQUFNLElBQUksWUFBWSxJQUFJLEtBQUssU0FBUyxJQUFJLEdBQUcsR0FBRyxRQUFRLFFBQVEsR0FBRyxPQUFPLFFBQVE7R0FDN0YsS0FBSyxTQUNILFFBQU8sOEJBQThCLElBQUksV0FBVyxHQUFHLFFBQVEsT0FBTyxHQUFHLGlCQUFpQixRQUFRLEdBQUcsSUFBSSxXQUFXLFdBQVcsR0FBRztHQUNwSSxLQUFLLGVBQWU7SUFDbEIsTUFBTSxjQUFjLElBQUksVUFBVSxNQUFNLFVBQVUsTUFBTSxTQUFTLElBQUksUUFBUSxPQUFPO0FBQ3BGLFFBQUksQ0FBQyxhQUFhO0FBQ2hCLFdBQU0sSUFBSSxNQUFNLDRCQUE0QixJQUFJLEtBQUssR0FBRzs7QUFFMUQsV0FBTyxLQUFLLGFBQ1YsVUFDQSxhQUNBLE9BQ0EsR0FBRyxVQUFVLElBQUksV0FBVyxNQUFNLEtBQ25DOztHQUVILEtBQUssUUFDSCxRQUFPLGdCQUFnQixRQUFRO0dBQ2pDLEtBQUssU0FFSCxRQUFPLE1BQU0sSUFBSSxXQUFXLEdBQUcsUUFBUSxPQUFPLEdBQUcsWUFBWSxVQUFVLElBQUksV0FBVyxLQUFLLFNBQVMsWUFBWSxJQUFJLFdBQVcsV0FBVyxHQUFHO0dBQy9JLFFBQ0UsT0FBTSxJQUFJLE1BQU0sWUFBWSxJQUFJLGFBQWE7OztDQUluRCxtQkFDRSxVQUNBLEtBQ0EsT0FDbUI7QUFDbkIsTUFBSSxJQUFJLGVBQWUsU0FBUztHQUM5QixNQUFNLEVBQUUsSUFBSSxXQUFXLHVCQUF1QixNQUFNLFNBQVMsSUFBSSxLQUFLO0FBQ3RFLFVBQU8sQ0FBQyxZQUFZLE9BQU8sNkNBQTZDO2FBQy9ELElBQUksZUFBZSxVQUFVO0FBQ3RDLE9BQUk7SUFDRixNQUFNLFVBQVUsMkJBQTJCLFVBQVUsSUFBSSxLQUFLO0lBQzlELE1BQU0sVUFBVSxJQUFJLFlBQVksRUFBRSxFQUFFLEtBQUssVUFBVTtBQUNqRCxnQkFBVyxRQUFRO0FBQ25CLGFBQVEsY0FBYyxlQUFlLFFBQVEsS0FBSztBQUNsRCxZQUFPLEtBQUssbUJBQW1CLFVBQVUsT0FBTyxNQUFNO01BQ3REO0FBQ0YsV0FBTyxLQUFLLE9BQU87V0FDYjtBQUNOLFdBQU8sQ0FBQyxLQUFLOzthQUVOLElBQUksZUFBZSxTQUFTO0FBQ3JDLE9BQUksQ0FBQyxJQUFJLFFBQVMsUUFBTyxDQUFDLEtBQUs7QUFDL0IsVUFBTyxLQUFLLG1CQUFtQixVQUFVLElBQUksU0FBUyxNQUFNOztBQUc5RCxTQUFPLENBQUMsS0FBSzs7Q0FHZixtQkFBbUIsVUFBa0IsS0FBb0IsT0FBMEI7QUFDakYsTUFBSSxJQUFJLFNBQVMsVUFBVTtBQUN6QixVQUFPLFlBQVksTUFBTSxRQUFRLG1DQUFtQyxNQUFNLEdBQUcsR0FBRyxNQUFNLFFBQVE7YUFDckYsSUFBSSxlQUFlLFNBQVM7QUFDckMsT0FBSSxJQUFJLFNBQVMsV0FBVztJQUMxQixNQUFNLGNBQWMsR0FBRyxNQUFNLFVBQVUsV0FBVyxTQUFTLElBQUksS0FBSyxDQUFDO0FBQ3JFLFdBQU8sWUFBWSxZQUFZLHdCQUF3QixNQUFNLEdBQUcsR0FBRyxZQUFZO1VBQzFFO0FBQ0wsUUFBSTtLQUNGLE1BQU0sRUFBRSxJQUFJLG1CQUFtQixrQkFBa0IsdUJBQy9DLFVBQ0EsSUFBSSxLQUNMO0tBQ0QsTUFBTSxjQUFjLEdBQUcsR0FBRztBQUMxQixZQUFPLFlBQVksWUFBWSx3QkFBd0IsY0FBYyxHQUFHLEdBQUcsWUFBWTtZQUNqRjtBQUNOLFlBQU87OzthQUdGLElBQUksZUFBZSxrQkFBa0IsSUFBSSxlQUFlLGdCQUFnQjtBQUNqRixPQUFJO0lBQ0YsTUFBTSxVQUFVLDJCQUEyQixVQUFVLElBQUksS0FBSyxRQUFRLE9BQU8sR0FBRyxDQUFDO0lBQ2pGLE1BQU0sY0FBYyxjQUFjLGVBQWUsUUFBUSxLQUFLO0lBQzlELE1BQU0sY0FBYyxHQUFHLFFBQVEsS0FBSztBQUNwQyxXQUFPLFlBQVksWUFBWSx3QkFBd0IsWUFBWSxHQUFHLEdBQUcsWUFBWTtXQUMvRTtBQUNOLFdBQU87O1NBRUo7QUFDTCxTQUFNLElBQUksTUFBTSxrQkFBa0IsSUFBSSxLQUFLLEdBQUcsSUFBSSxhQUFhOzs7Q0FJbkUsYUFBYSxVQUFrQixLQUFvQixPQUEwQjtBQUMzRSxNQUFJLElBQUksU0FBUyxVQUFVO0FBQ3pCLFVBQU87O0VBR1QsTUFBTSxjQUFjLElBQUksYUFBYSxRQUFRLElBQUksU0FBUztFQUMxRCxJQUFJQztBQUNKLE1BQUksSUFBSSxlQUFlLFNBQVM7QUFDOUIsT0FBSSxJQUFJLFNBQVMsV0FBVztBQUMxQixrQkFBYyxHQUFHLE1BQU0sVUFBVSxXQUFXLFNBQVMsSUFBSSxLQUFLLENBQUM7VUFDMUQ7QUFDTCxRQUFJO0tBQ0YsTUFBTSxFQUFFLE9BQU8sdUJBQXVCLFVBQVUsSUFBSSxLQUFLO0FBQ3pELG1CQUFjLEdBQUcsR0FBRztZQUNkO0FBQ04sWUFBTzs7O0FBR1gsVUFBTyxJQUFJLFlBQVksaUJBQWlCLElBQUksS0FBSyxNQUFNLGNBQWMsY0FBYyxHQUFHO2FBQzdFLElBQUksZUFBZSxrQkFBa0IsSUFBSSxlQUFlLGdCQUFnQjtBQUNqRixPQUFJO0lBQ0YsTUFBTSxVQUFVLDJCQUEyQixVQUFVLElBQUksS0FBSyxRQUFRLE9BQU8sR0FBRyxDQUFDO0FBQ2pGLGtCQUFjLEdBQUcsUUFBUSxLQUFLO0FBQzlCLFdBQU8sSUFBSSxZQUFZLGlCQUFpQixJQUFJLEtBQUssTUFDL0MsY0FBYyxjQUFjLEdBQzdCO1dBQ0s7QUFDTixXQUFPOztTQUVKO0FBQ0wsU0FBTSxJQUFJLE1BQU0sa0JBQWtCLElBQUksS0FBSyxHQUFHLElBQUksYUFBYTs7O0NBSW5FLFdBQVcsU0FLVDtFQUNBLE1BQU0sTUFBTTtHQUNWLFNBQVM7R0FDVCxRQUFRO0dBQ1IsV0FBVztHQUNYLFlBQVk7R0FDYjtFQUNELE1BQU0saUJBQWlCLFFBQVEsTUFBTSxRQUFRLElBQUksU0FBUyxVQUFVLEVBQUU7QUFDdEUsTUFBSSxrQkFBa0IsMEJBQTBCQyxJQUFFLFNBQVM7QUFDekQsT0FBSSxVQUFVLE9BQU8sS0FBSyxlQUFlLEtBQUssQ0FBQztBQUMvQyxPQUFJLGFBQWE7O0VBRW5CLE1BQU0sZ0JBQWdCLFFBQVEsTUFBTSxRQUFRLElBQUksU0FBUyxTQUFTLEVBQUU7QUFDcEUsTUFBSSxpQkFBaUIseUJBQXlCQSxJQUFFLFNBQVM7QUFDdkQsT0FBSSxTQUFTLE9BQU8sS0FBSyxjQUFjLEtBQUssQ0FBQztBQUM3QyxPQUFJLFlBQVk7O0FBRWxCLFNBQU87O0NBR1QsTUFBTSxPQUFPLEVBQUUsWUFBMEM7RUFDdkQsTUFBTSxFQUFFLG1CQUFtQixNQUFNLE9BQU87RUFDeEMsTUFBTSxFQUFFLGdCQUFnQiwyQkFBMkIsTUFBTSxPQUFPO0VBRWhFLE1BQU0sY0FBYyxNQUFNLGVBQWUsVUFBVSxJQUFJO0VBQ3ZELE1BQU0sb0JBQW9CLE1BQU0sZUFBZSxHQUFHLFNBQVMsWUFBWTtFQUN2RSxNQUFNLGlCQUFpQix1QkFBdUIsa0JBQWtCO0VBRWhFLE1BQU0sUUFBUSxjQUFjLGVBQWUsU0FBUztFQUNwRCxNQUFNLFNBQVMsY0FBYyxJQUFJLFNBQVM7RUFHMUMsTUFBTSxTQUFTLE9BQU8sV0FBVztFQUNqQyxNQUFNLFdBQVcsV0FBVyxZQUFZLFdBQVcsU0FBUyxXQUFXO0VBR3ZFLE1BQU0sVUFBVyxZQUFZLFNBRTFCLFVBQVUsR0FBRyxNQUFPLEVBQUUsU0FBUyxPQUFPLENBQUMsSUFBSSxFQUFFLFNBQVMsT0FBTyxJQUFJLEVBQUcsQ0FDcEUsS0FBSyxRQUFRO0dBQ1osTUFBTSxXQUFXLEtBQUssYUFBYSxVQUFVLEtBQUssTUFBTTtHQUd4RCxJQUFJQztBQUNKLE9BQUksSUFBSSxTQUFTLE1BQU07QUFDckIsWUFBUTtjQUNDLENBQUMsYUFBYSxDQUFDLFNBQVMsSUFBSSxLQUFLLEVBQUU7SUFFNUMsTUFBTSxZQUFZLElBQUksS0FBSyxRQUFRLGNBQWMsR0FBRyxTQUFTLEtBQUssYUFBYSxDQUFDO0FBQ2hGLFlBQVEsY0FBYyxVQUFVO1VBQzNCO0lBQ0wsTUFBTSxZQUFZLDhCQUE4QixVQUFVLElBQUksS0FBSztBQUNuRSxZQUFRLGNBQWMsTUFBTSxRQUFRLEdBQUcsVUFBVTs7QUFHbkQsVUFBTztJQUNMLE1BQU0sSUFBSTtJQUNWO0lBQ0EsSUFBSSxZQUFZO0lBQ2hCLEtBQ0UsSUFBSSxTQUFTLFFBQ2IsSUFBSSxlQUFlLGVBQ25CLElBQUksZUFBZSxjQUNuQixJQUFJLGVBQWU7SUFDckIsT0FBTyxJQUFJLFNBQVMsUUFBUSxJQUFJLGVBQWUsY0FBYyxXQUFXO0lBQ3pFO0lBQ0Q7RUFHSixNQUFNLGdCQUFpQixlQUFlLFNBQ25DLFFBQ0UsUUFDQyxJQUFJLFNBQVMsUUFDYixJQUFJLFNBQVMsZUFDYjtHQUFDO0dBQVM7R0FBYTtHQUFnQjtHQUFlLENBQUMsU0FBUyxJQUFJLFdBQVcsQ0FDbEYsQ0FFQSxVQUFVLE1BQU07QUFDZixVQUFPLEVBQUUsU0FBUyxZQUFZLElBQUksQ0FBQztJQUNuQztFQUdKLE1BQU1DLGVBQWlELEVBQUU7RUFHekQsTUFBTUMsY0FBd0IsRUFBRTtBQUNoQyxHQUFDLFlBQVksWUFBWSxFQUFFLEVBQUUsU0FBUyxRQUFRO0FBQzVDLE9BQUksSUFBSSxlQUFlLFNBQVM7QUFDOUIsUUFBSTtLQUNGLE1BQU0sRUFBRSxJQUFJLFdBQVcsdUJBQXVCLFVBQVUsSUFBSSxLQUFLO0FBQ2pFLGlCQUFZLEtBQUssT0FBTztZQUNsQjs7SUFFVjtBQUtGLFNBQU87R0FDTCxHQUFHLEtBQUssaUJBQWlCLE1BQU07R0FDL0IsTUFBTTs7Ozs7Ozs7Ozs7Ozs7O1dBZUQsTUFBTSxRQUFRLFdBQVcsTUFBTSxRQUFRO1dBQ3ZDLE1BQU0sUUFBUTtXQUNkLE1BQU0sUUFBUSxnQ0FBZ0MsTUFBTSxHQUFHLEdBQUcsTUFBTSxHQUFHO2tCQUM1RDtJQUVWLE1BQU1DLFlBQXNCLEVBQUU7QUFDOUIsUUFBSSxjQUFjLE1BQU0sUUFBUSxJQUFJLFNBQVMsVUFBVSxFQUFFO0FBQ3ZELGVBQVUsS0FBSyxHQUFHLE1BQU0sUUFBUSxVQUFVLEdBQUcsTUFBTSxRQUFRLGNBQWM7O0FBRTNFLFFBQUksY0FBYyxNQUFNLFFBQVEsSUFBSSxTQUFTLFNBQVMsRUFBRTtBQUN0RCxlQUFVLEtBQUssR0FBRyxNQUFNLFFBQVEsY0FBYyxHQUFHLE1BQU0sUUFBUSxrQkFBa0I7O0lBSW5GLE1BQU0sZ0JBQWdCLGNBQ25CLFFBQ0UsUUFBUSxJQUFJLGVBQWUsV0FBVyxJQUFJLFNBQVMsWUFBWSxJQUFJLFNBQVMsVUFDOUUsQ0FDQSxLQUFLLFFBQVE7QUFDWixTQUFJLElBQUksVUFBVSxZQUFZLElBQUksUUFBUTtBQUN4QyxhQUFRLElBQUksT0FBOEI7O0FBRTVDLFNBQUk7TUFDRixNQUFNLEVBQUUsSUFBSSxXQUFXLHVCQUF1QixVQUFVLElBQUksS0FBSztBQUNqRSxhQUFPO2FBQ0Q7QUFDTixhQUFPOztNQUVULENBQ0QsT0FBTyxRQUFRO0lBR2xCLE1BQU0sV0FBVyxDQUFDLEdBQUcsSUFBSSxJQUFJLENBQUMsR0FBRyxlQUFlLEdBQUcsWUFBWSxDQUFDLENBQUM7SUFDakUsTUFBTSxjQUFjLFNBQVMsU0FBUyxXQUFXLENBQUMsR0FBRyxVQUFVLEdBQUcsT0FBTyxPQUFPLENBQUM7QUFFakYsV0FBTyxDQUFDLEdBQUcsV0FBVyxHQUFHLFlBQVksQ0FBQyxLQUFLLEtBQUs7T0FDOUMsQ0FBQzs7U0FFRjtJQUVQLE1BQU0sWUFBWSxjQUFjLFFBQzdCLFFBQVEsSUFBSSxlQUFlLGtCQUFrQixJQUFJLGVBQWUsZUFDbEU7SUFDRCxNQUFNLGNBQWMsVUFDakIsS0FBSyxRQUFRO0FBQ1osU0FBSTtNQUNGLE1BQU0sVUFBVSwyQkFBMkIsVUFBVSxJQUFJLEtBQUssUUFBUSxPQUFPLEdBQUcsQ0FBQztBQUNqRixhQUFPLEdBQUcsUUFBUSxLQUFLO2FBQ2pCO0FBQ04sYUFBTzs7TUFFVCxDQUNELE9BQU8sUUFBUTtBQUNsQixXQUFPLFlBQVksU0FBUyxJQUN4QixZQUFZLFlBQVksS0FBSyxLQUFLLENBQUMsNENBQ25DO09BQ0YsQ0FBQzs7Ozs7Ozs7OytDQVMwQyxNQUFNLFNBQVMsd0RBQXdELE9BQU8sU0FBUyxNQUFNLFFBQVEsNEVBQTRFLE9BQU8sU0FBUyxNQUFNLFFBQVEscUNBQXFDLE1BQU0sUUFBUSxxQkFBcUIsTUFBTSxRQUFROztXQUV6VSxNQUFNLFFBQVEsV0FBVyxNQUFNLFFBQVE7Ozs7MkRBSVMsU0FBUzs7MkRBRVQsU0FBUzs7Ozs7a0VBS0YsTUFBTSxRQUFROzs7a0JBSTFFLGNBQWMsTUFBTSxRQUFRLElBQUksU0FBUyxTQUFTLEdBQzlDO2NBQ0ksTUFBTSxRQUFRLDJCQUNsQixLQUVKLGNBQWMsTUFBTSxRQUFRLElBQUksU0FBUyxVQUFVLEdBQy9DO2VBQ0ssTUFBTSxRQUFRLHVCQUNuQixHQUNMOzs7Ozt5Q0FLb0MsTUFBTSxRQUFRLGFBQWEsTUFBTSxjQUFjOzs7OztxQkFLbkUsTUFBTSxTQUFTOzBDQUNNLE1BQU0sUUFBUTs7OztTQUkvQyxNQUFNLFFBQVE7NEJBQ0ssTUFBTSxRQUFRO0VBQ3hDLFFBQ0MsS0FDRSxRQUFRO2VBQ0UsSUFBSSxNQUFNO1lBQ2IsSUFBSSxHQUFHLEdBQ1gsSUFBSSxNQUNBO29CQUVBLEtBRUosSUFBSSxRQUNBO2dCQUNJLElBQUksTUFBTSxNQUNkLEdBQ0w7T0FFSixDQUNBLEtBQUssTUFBTSxDQUFDOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O2tDQXlCbUIsU0FBUzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7bUNBdUJSLFNBQVM7Ozs7Ozs7UUFPcEMsTUFBTSxRQUFROzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztFQXdCcEIsY0FBYyxNQUFNLFFBQVEsSUFBSSxTQUFTLFNBQVMsR0FDOUM7NEJBQ3NCLE1BQU0sUUFBUTs4QkFDWixNQUFNLFFBQVE7Ozs7d0JBS3RDLEdBQ0w7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OzBCQTBCeUIsTUFBTSxRQUFROzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztFQXVCdEMsY0FDQyxRQUFRLFFBQVEsSUFBSSxTQUFTLFlBQVksSUFBSSxTQUFTLFVBQVUsQ0FDaEUsS0FBSyxRQUFRO0FBQ1osUUFBSSxJQUFJLGVBQWUsU0FBUztBQUM5QixTQUFJO01BRUYsTUFBTSxTQUNKLElBQUksVUFBVSxZQUFZLElBQUksU0FDekIsSUFBSSxPQUE4QixTQUNuQyx1QkFBdUIsVUFBVSxJQUFJLEtBQUssQ0FBQztBQUNqRCxhQUFPOzZCQUNjLElBQUksS0FBSyxpQkFBaUIsSUFBSSxLQUFLOzRCQUNwQyxPQUFPOzhCQUNMLE9BQU87b0NBQ0QsSUFBSSxLQUFLO21DQUNWLElBQUksTUFBTTs7OzthQUkvQjtBQUNOLGFBQU87OztBQUlYLFFBQUksSUFBSSxlQUFlLGtCQUFrQixJQUFJLGVBQWUsZ0JBQWdCO0FBQzFFLFNBQUk7TUFDRixNQUFNLFVBQVUsMkJBQTJCLFVBQVUsSUFBSSxLQUFLLFFBQVEsT0FBTyxHQUFHLENBQUM7QUFDakYsYUFBTzs4QkFDZSxRQUFRLEtBQUs7O29DQUVQLElBQUksS0FBSzttQ0FDVixJQUFJLFNBQVMsUUFBUSxLQUFLOzs7O2FBSS9DO0FBQ04sYUFBTzs7O0FBR1gsV0FBTztLQUNQLENBQ0QsT0FBTyxRQUFRLENBQ2YsS0FBSyxLQUFLLENBQUM7RUFFWixjQUFjLE1BQU0sUUFBUSxJQUFJLFNBQVMsVUFBVSxHQUMvQzs0QkFDc0IsTUFBTSxRQUFROzhCQUNaLE1BQU0sUUFBUTs7Ozs7d0JBTXRDLEdBQ0w7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O3NCQTBFcUIsTUFBTSxRQUFROzs7Ozs7Ozs7Ozs7UUFZNUIsTUFBTTtHQUNSLFlBQVksRUFBRTtHQUNkO0dBQ0QifQ==