sonamu 0.10.11 → 0.10.13

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (519) hide show
  1. package/dist/ai/agents/agent.d.ts +1 -1
  2. package/dist/ai/agents/agent.d.ts.map +1 -1
  3. package/dist/ai/agents/agent.js +5 -6
  4. package/dist/ai/agents/types.d.ts +1 -1
  5. package/dist/ai/agents/types.d.ts.map +1 -1
  6. package/dist/ai/providers/rtzr/api.js +18 -18
  7. package/dist/ai/providers/rtzr/error.d.ts.map +1 -1
  8. package/dist/ai/providers/rtzr/error.js +17 -15
  9. package/dist/ai/providers/rtzr/model.d.ts.map +1 -1
  10. package/dist/ai/providers/rtzr/model.js +3 -2
  11. package/dist/ai/providers/rtzr/options.d.ts.map +1 -1
  12. package/dist/ai/providers/rtzr/options.js +16 -16
  13. package/dist/ai/providers/rtzr/provider.d.ts.map +1 -1
  14. package/dist/ai/providers/rtzr/provider.js +9 -9
  15. package/dist/ai/providers/rtzr/utils.d.ts.map +1 -1
  16. package/dist/ai/providers/rtzr/utils.js +1 -1
  17. package/dist/api/caster.d.ts.map +1 -1
  18. package/dist/api/caster.js +17 -17
  19. package/dist/api/code-converters.d.ts +4 -2
  20. package/dist/api/code-converters.d.ts.map +1 -1
  21. package/dist/api/code-converters.js +100 -19
  22. package/dist/api/config.d.ts +16 -1
  23. package/dist/api/config.d.ts.map +1 -1
  24. package/dist/api/config.js +28 -21
  25. package/dist/api/context.d.ts +2 -2
  26. package/dist/api/context.d.ts.map +1 -1
  27. package/dist/api/context.js +1 -1
  28. package/dist/api/decorators.d.ts.map +1 -1
  29. package/dist/api/decorators.js +18 -11
  30. package/dist/api/http-validator.d.ts +36 -0
  31. package/dist/api/http-validator.d.ts.map +1 -0
  32. package/dist/api/http-validator.js +72 -0
  33. package/dist/api/index.js +6 -4
  34. package/dist/api/sonamu.d.ts +59 -20
  35. package/dist/api/sonamu.d.ts.map +1 -1
  36. package/dist/api/sonamu.js +250 -106
  37. package/dist/api/websocket-helpers.d.ts +7 -5
  38. package/dist/api/websocket-helpers.d.ts.map +1 -1
  39. package/dist/api/websocket-helpers.js +6 -6
  40. package/dist/auth/audit-log/builders.d.ts.map +1 -1
  41. package/dist/auth/audit-log/builders.js +1 -1
  42. package/dist/auth/audit-log/client-ip.d.ts +1 -1
  43. package/dist/auth/audit-log/client-ip.d.ts.map +1 -1
  44. package/dist/auth/audit-log/client-ip.js +4 -2
  45. package/dist/auth/audit-log/events.d.ts +5 -1
  46. package/dist/auth/audit-log/events.d.ts.map +1 -1
  47. package/dist/auth/audit-log/events.js +1 -1
  48. package/dist/auth/audit-log/plugin.d.ts +0 -8
  49. package/dist/auth/audit-log/plugin.d.ts.map +1 -1
  50. package/dist/auth/audit-log/plugin.js +48 -52
  51. package/dist/auth/audit-log-ingestor.d.ts.map +1 -1
  52. package/dist/auth/audit-log-ingestor.js +16 -12
  53. package/dist/auth/auth-generator.d.ts.map +1 -1
  54. package/dist/auth/auth-generator.js +1 -1
  55. package/dist/auth/better-auth-request.d.ts.map +1 -1
  56. package/dist/auth/better-auth-request.js +6 -5
  57. package/dist/auth/knex-adapter.js +1 -1
  58. package/dist/auth/plugins/entity-definitions/index.d.ts +13 -1
  59. package/dist/auth/plugins/entity-definitions/index.d.ts.map +1 -1
  60. package/dist/auth/plugins/entity-definitions/index.js +1 -1
  61. package/dist/auth/plugins/wrappers/admin.d.ts +1 -1
  62. package/dist/bin/build-config.d.ts +25 -0
  63. package/dist/bin/build-config.d.ts.map +1 -1
  64. package/dist/bin/build-config.js +105 -2
  65. package/dist/bin/cli.js +133 -29
  66. package/dist/bin/compiler-policy.d.ts +3 -0
  67. package/dist/bin/compiler-policy.d.ts.map +1 -0
  68. package/dist/bin/compiler-policy.js +24 -0
  69. package/dist/bin/fixture.d.ts.map +1 -1
  70. package/dist/bin/fixture.js +5 -3
  71. package/dist/bin/test-command.d.ts +22 -1
  72. package/dist/bin/test-command.d.ts.map +1 -1
  73. package/dist/bin/test-command.js +18 -10
  74. package/dist/bin/ts-loader-registration.d.ts +7 -1
  75. package/dist/bin/ts-loader-registration.d.ts.map +1 -1
  76. package/dist/bin/ts-loader-registration.js +13 -4
  77. package/dist/cache/decorator.d.ts.map +1 -1
  78. package/dist/cache/decorator.js +11 -4
  79. package/dist/compress/compress.d.ts.map +1 -1
  80. package/dist/compress/compress.js +1 -1
  81. package/dist/cone/cone-generator.d.ts +14 -1
  82. package/dist/cone/cone-generator.d.ts.map +1 -1
  83. package/dist/cone/cone-generator.js +13 -9
  84. package/dist/database/_batch_update.js +1 -1
  85. package/dist/database/base-model.d.ts +22 -10
  86. package/dist/database/base-model.d.ts.map +1 -1
  87. package/dist/database/base-model.js +26 -16
  88. package/dist/database/base-model.types.d.ts +15 -3
  89. package/dist/database/base-model.types.d.ts.map +1 -1
  90. package/dist/database/db.d.ts +12 -2
  91. package/dist/database/db.d.ts.map +1 -1
  92. package/dist/database/db.js +10 -7
  93. package/dist/database/knex.d.ts.map +1 -1
  94. package/dist/database/knex.js +17 -14
  95. package/dist/database/puri.d.ts +11 -9
  96. package/dist/database/puri.d.ts.map +1 -1
  97. package/dist/database/puri.js +93 -79
  98. package/dist/database/puri.types.d.ts +21 -21
  99. package/dist/database/puri.types.d.ts.map +1 -1
  100. package/dist/database/puri.types.js +1 -1
  101. package/dist/database/upsert-builder.d.ts +12 -10
  102. package/dist/database/upsert-builder.d.ts.map +1 -1
  103. package/dist/database/upsert-builder.js +20 -12
  104. package/dist/dict/sd.d.ts.map +1 -1
  105. package/dist/dict/sd.js +1 -1
  106. package/dist/dict/sonamu-dictionary.d.ts.map +1 -1
  107. package/dist/dict/sonamu-dictionary.js +1 -1
  108. package/dist/dict/utils.d.ts.map +1 -1
  109. package/dist/dict/utils.js +7 -2
  110. package/dist/entity/entity-manager.d.ts +13 -4
  111. package/dist/entity/entity-manager.d.ts.map +1 -1
  112. package/dist/entity/entity-manager.js +19 -11
  113. package/dist/entity/entity-template-cone.d.ts +73 -5
  114. package/dist/entity/entity-template-cone.d.ts.map +1 -1
  115. package/dist/entity/entity-template-cone.js +4 -2
  116. package/dist/entity/entity.d.ts +6 -2
  117. package/dist/entity/entity.d.ts.map +1 -1
  118. package/dist/entity/entity.js +30 -28
  119. package/dist/env.d.ts +3 -1
  120. package/dist/env.d.ts.map +1 -1
  121. package/dist/env.js +1 -1
  122. package/dist/exceptions/error-handler.d.ts.map +1 -1
  123. package/dist/exceptions/error-handler.js +7 -2
  124. package/dist/exceptions/so-exceptions.d.ts +24 -20
  125. package/dist/exceptions/so-exceptions.d.ts.map +1 -1
  126. package/dist/exceptions/so-exceptions.js +4 -2
  127. package/dist/filter/utils.d.ts +7 -2
  128. package/dist/filter/utils.d.ts.map +1 -1
  129. package/dist/filter/utils.js +8 -6
  130. package/dist/index.d.ts +3 -0
  131. package/dist/index.d.ts.map +1 -1
  132. package/dist/index.js +13 -7
  133. package/dist/logger/configure.d.ts.map +1 -1
  134. package/dist/logger/configure.js +10 -10
  135. package/dist/migration/code-generation.d.ts.map +1 -1
  136. package/dist/migration/code-generation.js +50 -46
  137. package/dist/migration/index-where-predicate.d.ts.map +1 -1
  138. package/dist/migration/index-where-predicate.js +22 -8
  139. package/dist/migration/migration-set.d.ts.map +1 -1
  140. package/dist/migration/migration-set.js +1 -1
  141. package/dist/migration/migrator.d.ts +61 -36
  142. package/dist/migration/migrator.d.ts.map +1 -1
  143. package/dist/migration/migrator.js +276 -167
  144. package/dist/migration/postgresql-schema-reader.d.ts.map +1 -1
  145. package/dist/migration/postgresql-schema-reader.js +51 -36
  146. package/dist/migration/slack-confirm.d.ts.map +1 -1
  147. package/dist/migration/slack-confirm.js +1 -1
  148. package/dist/migration/types.d.ts +54 -0
  149. package/dist/migration/types.d.ts.map +1 -1
  150. package/dist/naite/naite-reporter.js +2 -2
  151. package/dist/naite/naite.d.ts +74 -15
  152. package/dist/naite/naite.d.ts.map +1 -1
  153. package/dist/naite/naite.js +5 -19
  154. package/dist/runtime-type.d.ts +6 -0
  155. package/dist/runtime-type.d.ts.map +1 -0
  156. package/dist/runtime-type.js +26 -0
  157. package/dist/ssr/hmr-opt-out.d.ts +26 -0
  158. package/dist/ssr/hmr-opt-out.d.ts.map +1 -0
  159. package/dist/ssr/hmr-opt-out.js +59 -0
  160. package/dist/ssr/renderer.d.ts.map +1 -1
  161. package/dist/ssr/renderer.js +4 -1
  162. package/dist/storage/base-file.js +14 -14
  163. package/dist/storage/buffered-file.d.ts +2 -2
  164. package/dist/storage/buffered-file.d.ts.map +1 -1
  165. package/dist/storage/buffered-file.js +12 -12
  166. package/dist/storage/s3-driver.d.ts.map +1 -1
  167. package/dist/storage/s3-driver.js +1 -1
  168. package/dist/storage/uploaded-file.d.ts +2 -2
  169. package/dist/storage/uploaded-file.d.ts.map +1 -1
  170. package/dist/storage/uploaded-file.js +8 -8
  171. package/dist/stream/sse.js +11 -11
  172. package/dist/stream/ws-core.d.ts +1 -1
  173. package/dist/stream/ws-core.d.ts.map +1 -1
  174. package/dist/stream/ws-delivery.d.ts +1 -1
  175. package/dist/stream/ws-delivery.d.ts.map +1 -1
  176. package/dist/stream/ws-delivery.js +6 -4
  177. package/dist/stream/ws-local-connection-store.d.ts.map +1 -1
  178. package/dist/stream/ws-local-connection-store.js +4 -2
  179. package/dist/stream/ws-presence-store.js +1 -1
  180. package/dist/stream/ws-registry.d.ts +4 -4
  181. package/dist/stream/ws-registry.d.ts.map +1 -1
  182. package/dist/stream/ws-registry.js +4 -2
  183. package/dist/stream/ws-telemetry.d.ts +16 -12
  184. package/dist/stream/ws-telemetry.d.ts.map +1 -1
  185. package/dist/stream/ws-telemetry.js +22 -18
  186. package/dist/stream/ws.d.ts +18 -12
  187. package/dist/stream/ws.d.ts.map +1 -1
  188. package/dist/stream/ws.js +26 -22
  189. package/dist/syncer/api-parser.js +1 -1
  190. package/dist/syncer/checksum.d.ts.map +1 -1
  191. package/dist/syncer/checksum.js +7 -8
  192. package/dist/syncer/code-generator.d.ts.map +1 -1
  193. package/dist/syncer/code-generator.js +13 -14
  194. package/dist/syncer/entity-operations.d.ts.map +1 -1
  195. package/dist/syncer/entity-operations.js +5 -6
  196. package/dist/syncer/file-copy.d.ts +5 -0
  197. package/dist/syncer/file-copy.d.ts.map +1 -0
  198. package/dist/syncer/file-copy.js +36 -0
  199. package/dist/syncer/file-patterns.d.ts +1 -0
  200. package/dist/syncer/file-patterns.d.ts.map +1 -1
  201. package/dist/syncer/file-patterns.js +5 -2
  202. package/dist/syncer/file-tracking.d.ts.map +1 -1
  203. package/dist/syncer/file-tracking.js +5 -4
  204. package/dist/syncer/filesystem-dependencies.d.ts +15 -0
  205. package/dist/syncer/filesystem-dependencies.d.ts.map +1 -0
  206. package/dist/syncer/filesystem-dependencies.js +53 -0
  207. package/dist/syncer/module-loader.d.ts +1 -1
  208. package/dist/syncer/module-loader.d.ts.map +1 -1
  209. package/dist/syncer/module-loader.js +6 -4
  210. package/dist/syncer/syncer-actions.d.ts +4 -0
  211. package/dist/syncer/syncer-actions.d.ts.map +1 -1
  212. package/dist/syncer/syncer-actions.js +34 -17
  213. package/dist/syncer/syncer.d.ts +17 -6
  214. package/dist/syncer/syncer.d.ts.map +1 -1
  215. package/dist/syncer/syncer.js +71 -29
  216. package/dist/syncer/watcher.d.ts.map +1 -1
  217. package/dist/syncer/watcher.js +3 -3
  218. package/dist/tasks/decorator.d.ts +6 -6
  219. package/dist/tasks/decorator.d.ts.map +1 -1
  220. package/dist/tasks/decorator.js +4 -4
  221. package/dist/tasks/step-wrapper.d.ts +6 -4
  222. package/dist/tasks/step-wrapper.d.ts.map +1 -1
  223. package/dist/tasks/step-wrapper.js +5 -5
  224. package/dist/tasks/workflow-manager.d.ts.map +1 -1
  225. package/dist/tasks/workflow-manager.js +13 -7
  226. package/dist/template/entity-converter.d.ts +1 -1
  227. package/dist/template/entity-converter.d.ts.map +1 -1
  228. package/dist/template/entity-converter.js +2 -2
  229. package/dist/template/helpers.d.ts +8 -6
  230. package/dist/template/helpers.d.ts.map +1 -1
  231. package/dist/template/helpers.js +1 -1
  232. package/dist/template/implementations/generated.template.d.ts.map +1 -1
  233. package/dist/template/implementations/generated.template.js +4 -4
  234. package/dist/template/implementations/generated_http.template.d.ts +7 -4
  235. package/dist/template/implementations/generated_http.template.d.ts.map +1 -1
  236. package/dist/template/implementations/generated_http.template.js +21 -21
  237. package/dist/template/implementations/generated_sso.template.d.ts.map +1 -1
  238. package/dist/template/implementations/generated_sso.template.js +6 -3
  239. package/dist/template/implementations/http_validators.template.d.ts +18 -0
  240. package/dist/template/implementations/http_validators.template.d.ts.map +1 -0
  241. package/dist/template/implementations/http_validators.template.js +127 -0
  242. package/dist/template/implementations/model.template.d.ts.map +1 -1
  243. package/dist/template/implementations/model.template.js +1 -1
  244. package/dist/template/implementations/queries.template.js +1 -1
  245. package/dist/template/implementations/sd.template.d.ts.map +1 -1
  246. package/dist/template/implementations/sd.template.js +79 -39
  247. package/dist/template/implementations/services.template.d.ts.map +1 -1
  248. package/dist/template/implementations/services.template.js +6 -4
  249. package/dist/template/implementations/view_form.template.d.ts +6 -1
  250. package/dist/template/implementations/view_form.template.d.ts.map +1 -1
  251. package/dist/template/implementations/view_form.template.js +23 -15
  252. package/dist/template/implementations/view_list.template.d.ts.map +1 -1
  253. package/dist/template/implementations/view_list.template.js +11 -6
  254. package/dist/template/template-manager.d.ts.map +1 -1
  255. package/dist/template/template-manager.js +9 -7
  256. package/dist/template/template-types.d.ts +12 -5
  257. package/dist/template/template-types.d.ts.map +1 -1
  258. package/dist/template/template-types.js +1 -1
  259. package/dist/template/template.d.ts +2 -2
  260. package/dist/template/template.d.ts.map +1 -1
  261. package/dist/template/template.js +6 -4
  262. package/dist/template/zod-converter.d.ts +0 -19
  263. package/dist/template/zod-converter.d.ts.map +1 -1
  264. package/dist/template/zod-converter.js +100 -84
  265. package/dist/testing/_relation-graph.d.ts.map +1 -1
  266. package/dist/testing/_relation-graph.js +2 -1
  267. package/dist/testing/bootstrap.d.ts.map +1 -1
  268. package/dist/testing/bootstrap.js +9 -6
  269. package/dist/testing/data-explorer.d.ts +32 -7
  270. package/dist/testing/data-explorer.d.ts.map +1 -1
  271. package/dist/testing/data-explorer.js +77 -31
  272. package/dist/testing/dev-test-routes.d.ts +8 -1
  273. package/dist/testing/dev-test-routes.d.ts.map +1 -1
  274. package/dist/testing/dev-test-routes.js +125 -108
  275. package/dist/testing/dev-vitest-manager.d.ts +54 -8
  276. package/dist/testing/dev-vitest-manager.d.ts.map +1 -1
  277. package/dist/testing/dev-vitest-manager.js +24 -9
  278. package/dist/testing/faker-mappings.d.ts +412 -1
  279. package/dist/testing/faker-mappings.d.ts.map +1 -1
  280. package/dist/testing/faker-mappings.js +1 -1
  281. package/dist/testing/filesystem.d.ts +2 -0
  282. package/dist/testing/filesystem.d.ts.map +1 -0
  283. package/dist/testing/filesystem.js +7 -0
  284. package/dist/testing/fixture-generator.d.ts +25 -8
  285. package/dist/testing/fixture-generator.d.ts.map +1 -1
  286. package/dist/testing/fixture-generator.js +132 -73
  287. package/dist/testing/fixture-loader.d.ts +3 -1
  288. package/dist/testing/fixture-loader.d.ts.map +1 -1
  289. package/dist/testing/fixture-loader.js +1 -20
  290. package/dist/testing/fixture-manager.d.ts +8 -7
  291. package/dist/testing/fixture-manager.d.ts.map +1 -1
  292. package/dist/testing/fixture-manager.js +91 -59
  293. package/dist/testing/global-setup.d.ts.map +1 -1
  294. package/dist/testing/global-setup.js +5 -2
  295. package/dist/testing/index.d.ts +2 -0
  296. package/dist/testing/index.d.ts.map +1 -1
  297. package/dist/testing/index.js +6 -3
  298. package/dist/types/types.d.ts +101 -99
  299. package/dist/types/types.d.ts.map +1 -1
  300. package/dist/types/types.js +234 -225
  301. package/dist/ui/ai-api.d.ts.map +1 -1
  302. package/dist/ui/ai-api.js +1 -1
  303. package/dist/ui/ai-client.d.ts.map +1 -1
  304. package/dist/ui/ai-client.js +28 -18
  305. package/dist/ui/api.d.ts.map +1 -1
  306. package/dist/ui/api.js +146 -210
  307. package/dist/ui/async-route.d.ts +3 -0
  308. package/dist/ui/async-route.d.ts.map +1 -0
  309. package/dist/ui/async-route.js +12 -0
  310. package/dist/ui/cdd-service.d.ts +9 -7
  311. package/dist/ui/cdd-service.d.ts.map +1 -1
  312. package/dist/ui/cdd-service.js +7 -5
  313. package/dist/ui/migrations-api.d.ts +3 -0
  314. package/dist/ui/migrations-api.d.ts.map +1 -0
  315. package/dist/ui/migrations-api.js +215 -0
  316. package/dist/ui-web/assets/index-D3QNH-Dv.css +1 -0
  317. package/dist/ui-web/assets/index-DV1AAq6W.js +178 -0
  318. package/dist/ui-web/index.html +2 -2
  319. package/dist/utils/formatter.d.ts.map +1 -1
  320. package/dist/utils/formatter.js +7 -5
  321. package/dist/utils/fs-utils.d.ts +3 -3
  322. package/dist/utils/fs-utils.d.ts.map +1 -1
  323. package/dist/utils/fs-utils.js +6 -6
  324. package/dist/utils/model.d.ts +3 -5
  325. package/dist/utils/model.d.ts.map +1 -1
  326. package/dist/utils/model.js +1 -1
  327. package/dist/utils/object-utils.d.ts +1 -1
  328. package/dist/utils/object-utils.d.ts.map +1 -1
  329. package/dist/utils/object-utils.js +17 -16
  330. package/dist/utils/process-utils.d.ts.map +1 -1
  331. package/dist/utils/process-utils.js +4 -2
  332. package/dist/utils/runtime-value.d.ts +13 -0
  333. package/dist/utils/runtime-value.d.ts.map +1 -0
  334. package/dist/utils/runtime-value.js +40 -0
  335. package/dist/utils/sql-parser.d.ts +8 -1
  336. package/dist/utils/sql-parser.d.ts.map +1 -1
  337. package/dist/utils/sql-parser.js +6 -3
  338. package/dist/utils/type-utils.d.ts.map +1 -1
  339. package/dist/utils/type-utils.js +10 -8
  340. package/dist/utils/utils.d.ts +2 -2
  341. package/dist/utils/utils.d.ts.map +1 -1
  342. package/dist/utils/utils.js +11 -8
  343. package/dist/utils/zod-error.d.ts.map +1 -1
  344. package/dist/utils/zod-error.js +7 -4
  345. package/dist/vector/chunking.d.ts.map +1 -1
  346. package/dist/vector/chunking.js +1 -1
  347. package/dist/vector/embedding.d.ts.map +1 -1
  348. package/dist/vector/embedding.js +1 -1
  349. package/dist/vector/types.d.ts +3 -2
  350. package/dist/vector/types.d.ts.map +1 -1
  351. package/package.json +11 -7
  352. package/src/ai/agents/agent.ts +5 -5
  353. package/src/ai/agents/types.ts +1 -1
  354. package/src/ai/providers/rtzr/__tests__/model.test.ts +2 -2
  355. package/src/ai/providers/rtzr/error.ts +5 -3
  356. package/src/ai/providers/rtzr/model.ts +3 -2
  357. package/src/ai/providers/rtzr/options.ts +10 -5
  358. package/src/ai/providers/rtzr/provider.ts +10 -10
  359. package/src/ai/providers/rtzr/utils.ts +3 -1
  360. package/src/api/__tests__/config.test.ts +11 -21
  361. package/src/api/__tests__/sonamu.http-validator.test.ts +512 -0
  362. package/src/api/__tests__/sonamu.websocket.test.ts +51 -41
  363. package/src/api/__tests__/zod-compiler-policy.test.ts +95 -0
  364. package/src/api/caster.ts +6 -8
  365. package/src/api/code-converters.ts +136 -36
  366. package/src/api/config.ts +62 -4
  367. package/src/api/context.ts +3 -3
  368. package/src/api/decorators.ts +28 -17
  369. package/src/api/http-validator.ts +149 -0
  370. package/src/api/sonamu.ts +459 -152
  371. package/src/api/websocket-helpers.ts +24 -17
  372. package/src/auth/audit-log/builders.ts +3 -2
  373. package/src/auth/audit-log/client-ip.ts +4 -2
  374. package/src/auth/audit-log/events.ts +15 -1
  375. package/src/auth/audit-log/plugin.ts +129 -200
  376. package/src/auth/audit-log-ingestor.ts +19 -15
  377. package/src/auth/auth-generator.ts +10 -5
  378. package/src/auth/better-auth-request.ts +4 -3
  379. package/src/auth/knex-adapter.ts +8 -2
  380. package/src/auth/plugins/entity-definitions/index.ts +6 -5
  381. package/src/bin/__tests__/http-validator-benchmark.test.ts +94 -0
  382. package/src/bin/__tests__/test-command.test.ts +9 -15
  383. package/src/bin/__tests__/ts-loader-register.test.ts +15 -17
  384. package/src/bin/__tests__/zod-compiler-build.test.ts +307 -0
  385. package/src/bin/build-config.ts +167 -0
  386. package/src/bin/cli.ts +155 -38
  387. package/src/bin/compiler-policy.ts +35 -0
  388. package/src/bin/fixture.ts +14 -3
  389. package/src/bin/test-command.ts +74 -29
  390. package/src/bin/ts-loader-registration.ts +22 -4
  391. package/src/cache/decorator.ts +10 -3
  392. package/src/compress/compress.ts +17 -4
  393. package/src/cone/cone-generator.ts +34 -6
  394. package/src/database/__tests__/db.test.ts +1 -0
  395. package/src/database/__tests__/puri.test.ts +16 -15
  396. package/src/database/__tests__/transaction-scope.test.ts +5 -0
  397. package/src/database/_batch_update.ts +1 -0
  398. package/src/database/base-model.ts +81 -50
  399. package/src/database/base-model.types.ts +6 -6
  400. package/src/database/db.ts +29 -19
  401. package/src/database/knex.ts +30 -17
  402. package/src/database/puri-subset.test-d.ts +17 -0
  403. package/src/database/puri.ts +181 -143
  404. package/src/database/puri.types.test-d.ts +31 -1
  405. package/src/database/puri.types.ts +23 -21
  406. package/src/database/upsert-builder.ts +75 -53
  407. package/src/dict/sd.ts +15 -5
  408. package/src/dict/sonamu-dictionary.ts +6 -6
  409. package/src/dict/utils.ts +9 -1
  410. package/src/entity/entity-manager.ts +26 -9
  411. package/src/entity/entity-template-cone.ts +5 -10
  412. package/src/entity/entity.ts +50 -34
  413. package/src/env.ts +7 -3
  414. package/src/exceptions/error-handler.ts +17 -2
  415. package/src/exceptions/so-exceptions.ts +26 -20
  416. package/src/filter/utils.ts +21 -11
  417. package/src/index.ts +3 -0
  418. package/src/logger/configure.ts +26 -18
  419. package/src/migration/__tests__/migrator.test.ts +50 -57
  420. package/src/migration/code-generation.ts +132 -104
  421. package/src/migration/index-where-predicate.ts +51 -24
  422. package/src/migration/migration-set.ts +11 -5
  423. package/src/migration/migrator.ts +392 -244
  424. package/src/migration/postgresql-schema-reader.ts +52 -47
  425. package/src/migration/slack-confirm.ts +17 -15
  426. package/src/migration/types.ts +57 -0
  427. package/src/naite/naite-reporter.ts +1 -1
  428. package/src/naite/naite.ts +97 -24
  429. package/src/runtime-type.ts +34 -0
  430. package/src/ssr/hmr-opt-out.ts +78 -0
  431. package/src/ssr/renderer.ts +6 -0
  432. package/src/storage/base-file.ts +13 -13
  433. package/src/storage/buffered-file.ts +11 -11
  434. package/src/storage/s3-driver.ts +4 -1
  435. package/src/storage/uploaded-file.ts +8 -8
  436. package/src/stream/__tests__/ws-contracts.test.ts +4 -2
  437. package/src/stream/__tests__/ws-telemetry.test.ts +1 -1
  438. package/src/stream/__tests__/ws.test.ts +30 -6
  439. package/src/stream/sse.ts +12 -11
  440. package/src/stream/ws-core.ts +1 -1
  441. package/src/stream/ws-delivery.ts +16 -7
  442. package/src/stream/ws-local-connection-store.ts +2 -3
  443. package/src/stream/ws-presence-store.ts +6 -1
  444. package/src/stream/ws-registry.ts +16 -7
  445. package/src/stream/ws-telemetry.ts +66 -43
  446. package/src/stream/ws.ts +73 -39
  447. package/src/syncer/__tests__/api-parser.websocket-type-ref.test.ts +3 -2
  448. package/src/syncer/__tests__/http-validator-registry.test.ts +137 -0
  449. package/src/syncer/api-parser.ts +67 -27
  450. package/src/syncer/checksum.ts +17 -11
  451. package/src/syncer/code-generator.ts +25 -17
  452. package/src/syncer/entity-operations.ts +3 -5
  453. package/src/syncer/file-copy.ts +46 -0
  454. package/src/syncer/file-patterns.ts +11 -8
  455. package/src/syncer/file-tracking.ts +3 -4
  456. package/src/syncer/filesystem-dependencies.ts +73 -0
  457. package/src/syncer/module-loader.ts +8 -4
  458. package/src/syncer/syncer-actions.ts +56 -18
  459. package/src/syncer/syncer.ts +116 -43
  460. package/src/syncer/watcher.ts +8 -4
  461. package/src/tasks/decorator.ts +20 -12
  462. package/src/tasks/step-wrapper.ts +19 -9
  463. package/src/tasks/workflow-manager.ts +15 -9
  464. package/src/template/__tests__/http_validators.template.test.ts +160 -0
  465. package/src/template/__tests__/services.template.mutation.test.ts +24 -23
  466. package/src/template/__tests__/services.template.websocket.test.ts +21 -25
  467. package/src/template/entity-converter.ts +5 -2
  468. package/src/template/helpers.ts +8 -9
  469. package/src/template/implementations/generated.template.ts +5 -4
  470. package/src/template/implementations/generated_http.template.ts +61 -15
  471. package/src/template/implementations/generated_sso.template.ts +15 -4
  472. package/src/template/implementations/http_validators.template.ts +175 -0
  473. package/src/template/implementations/model.template.ts +3 -1
  474. package/src/template/implementations/sd.template.ts +81 -41
  475. package/src/template/implementations/services.template.ts +2 -2
  476. package/src/template/implementations/view_form.template.ts +56 -39
  477. package/src/template/implementations/view_list.template.ts +31 -23
  478. package/src/template/template-manager.ts +15 -13
  479. package/src/template/template-types.ts +13 -5
  480. package/src/template/template.ts +4 -3
  481. package/src/template/zod-converter.ts +206 -91
  482. package/src/testing/__tests__/dev-test-routes.test.ts +85 -25
  483. package/src/testing/__tests__/dev-vitest-manager.test.ts +15 -15
  484. package/src/testing/_relation-graph.ts +4 -1
  485. package/src/testing/bootstrap.ts +12 -5
  486. package/src/testing/data-explorer.ts +102 -53
  487. package/src/testing/dev-test-routes.ts +87 -50
  488. package/src/testing/dev-vitest-manager.ts +88 -32
  489. package/src/testing/faker-mappings.ts +2 -2
  490. package/src/testing/filesystem.ts +1 -0
  491. package/src/testing/fixture-generator.ts +191 -131
  492. package/src/testing/fixture-loader.ts +5 -1
  493. package/src/testing/fixture-manager.ts +129 -90
  494. package/src/testing/global-setup.ts +7 -3
  495. package/src/testing/index.ts +5 -0
  496. package/src/types/__tests__/entity-json-schema-search-text.test.ts +9 -3
  497. package/src/types/types.ts +184 -158
  498. package/src/ui/ai-api.ts +9 -7
  499. package/src/ui/ai-client.ts +61 -56
  500. package/src/ui/api.ts +726 -770
  501. package/src/ui/async-route.ts +4 -0
  502. package/src/ui/cdd-service.ts +35 -12
  503. package/src/ui/migrations-api.ts +381 -0
  504. package/src/utils/formatter.ts +7 -3
  505. package/src/utils/fs-utils.ts +5 -5
  506. package/src/utils/model.ts +4 -5
  507. package/src/utils/object-utils.ts +32 -22
  508. package/src/utils/process-utils.ts +4 -1
  509. package/src/utils/runtime-value.ts +43 -0
  510. package/src/utils/sql-parser.ts +13 -6
  511. package/src/utils/type-utils.ts +9 -7
  512. package/src/utils/utils.ts +19 -21
  513. package/src/utils/zod-error.ts +4 -2
  514. package/src/vector/chunking.ts +6 -1
  515. package/src/vector/embedding.ts +2 -1
  516. package/src/vector/types.ts +4 -2
  517. package/tsdown.api.config.ts +5 -2
  518. package/dist/ui-web/assets/index-CJf8uJYf.js +0 -176
  519. package/dist/ui-web/assets/index-GMMIVGja.css +0 -1
@@ -1,4 +1,3 @@
1
-
2
1
  import { type ComparisonOperator } from "../database/puri.types";
3
2
  interface StackFrame {
4
3
  functionName: string | null;
@@ -7,14 +6,75 @@ interface StackFrame {
7
6
  }
8
7
  interface NaiteTrace {
9
8
  key: string;
10
- data: any;
9
+ data: NaiteData;
11
10
  stack: StackFrame[];
12
11
  at: Date;
13
12
  }
13
+ export type NaiteData = null | undefined | bigint | boolean | number | object | string | symbol;
14
+ export interface NaiteEventRegistry {
15
+ actionGenerateServices: readonly object[];
16
+ "fs/promises:rm": {
17
+ path: string;
18
+ options?: object;
19
+ };
20
+ "fs/promises:writeFile": {
21
+ path: string;
22
+ data: string;
23
+ };
24
+ "puri:executed-query": string;
25
+ "puri:ub-batch-updated": {
26
+ tableName: string;
27
+ rowCount: number;
28
+ whereColumns: string[];
29
+ };
30
+ "puri:ub-clean-orphans": {
31
+ tableName: string;
32
+ cleanOrphans: string[];
33
+ deletedCount: number;
34
+ };
35
+ "puri:ub-inherit": {
36
+ tableName: string;
37
+ inheritColumns: string[];
38
+ excludedFromUpdate: string[];
39
+ };
40
+ "puri:ub-ref-resolved": {
41
+ tableName: string;
42
+ field: string;
43
+ from: UBReference;
44
+ to: NaiteData;
45
+ };
46
+ "puri:ub-register": {
47
+ tableName: string;
48
+ uuid: string;
49
+ isUuidReused: boolean;
50
+ row: object & {
51
+ user_id: UBReference;
52
+ };
53
+ };
54
+ "puri:ub-upserted": {
55
+ tableName: string;
56
+ mode: "insert" | "upsert";
57
+ rowCount: number;
58
+ returnedIds: Array<number | string>;
59
+ };
60
+ }
61
+ interface UBReference {
62
+ uuid: string;
63
+ of: string;
64
+ use?: string;
65
+ }
66
+ export interface NaiteResult<Payload> extends Array<Payload> {
67
+ 0: Payload;
68
+ 1: Payload;
69
+ [index: number]: Payload;
70
+ find<Match extends Payload>(predicate: (value: Payload, index: number, values: Payload[]) => value is Match): Match;
71
+ find(predicate: (value: Payload, index: number, values: Payload[]) => boolean): Payload;
72
+ }
73
+ type NaiteValuesByKey = Record<string, NaiteTrace[] | Array<NaiteTrace["data"]>>;
14
74
  export type NaiteStore = Map<string, NaiteTrace[]>;
15
75
  export type SerializedTrace = {
16
76
  key: string;
17
- value: any;
77
+ value: unknown;
18
78
  filePath: string;
19
79
  lineNumber: number;
20
80
  at: string;
@@ -23,7 +83,7 @@ export type SerializedTrace = {
23
83
  * NaiteQuery 클래스
24
84
  * 체이닝을 통한 trace 필터링 및 조회
25
85
  */
26
- export declare class NaiteQuery {
86
+ export declare class NaiteQuery<Payload extends NaiteData = NaiteData> {
27
87
  private traces;
28
88
  constructor(traces: NaiteTrace[]);
29
89
  private isComparableValue;
@@ -31,7 +91,7 @@ export declare class NaiteQuery {
31
91
  * 파일명으로 필터링
32
92
  * @param fileName 파일명 (예: "syncer.test.ts")
33
93
  */
34
- fromFile(fileName: string): NaiteQuery;
94
+ fromFile(fileName: string): NaiteQuery<Payload>;
35
95
  /**
36
96
  * 함수명으로 필터링
37
97
  * @param funcName 함수명 (includes 체크)
@@ -39,45 +99,44 @@ export declare class NaiteQuery {
39
99
  */
40
100
  fromFunction(funcName: string, options?: {
41
101
  from: "direct" | "indirect" | "both";
42
- }): NaiteQuery;
102
+ }): NaiteQuery<Payload>;
43
103
  /**
44
104
  * 데이터 경로 기반 필터링
45
105
  * @param path radash get 경로 (예: "data.userId")
46
106
  * @param operator 비교 연산자
47
107
  * @param value 비교값
48
108
  */
49
- where(path: string, operator: ComparisonOperator | "includes", value: any): NaiteQuery;
109
+ where<Value extends NaiteData>(path: string, operator: ComparisonOperator | "includes", value: Value): NaiteQuery<Payload>;
50
110
  /**
51
111
  * 전체 데이터 배열 반환
52
112
  */
53
- result(): any[];
113
+ result(): NaiteResult<Payload>;
54
114
  /**
55
115
  * 첫 번째 데이터 반환
56
116
  */
57
- first(): any | undefined;
117
+ first(): Payload;
58
118
  /**
59
119
  * 마지막 데이터 반환
60
120
  */
61
- last(): any | undefined;
121
+ last(): Payload;
62
122
  /**
63
123
  * n번째 데이터 반환
64
124
  */
65
- at(index: number): any | undefined;
125
+ at(index: number): Payload;
66
126
  /**
67
127
  * 원본 trace 배열 반환 (디버깅/NaiteViewer용)
68
128
  */
69
129
  getTraces(): NaiteTrace[];
70
130
  }
71
131
  export declare class NaiteClass {
72
- t(name: string, value: any): void;
132
+ t<Value extends NaiteData>(name: string, value: Value): void;
73
133
  /**
74
134
  * key 또는 wildcard 패턴으로 trace 조회
75
135
  * 항상 NaiteQuery 반환하여 체이닝 가능
76
136
  */
137
+ get<Key extends keyof NaiteEventRegistry>(keyPattern: Key): NaiteQuery<NaiteEventRegistry[Key]>;
77
138
  get(keyPattern: string): NaiteQuery;
78
- getAll(): {
79
- [key: string]: any;
80
- };
139
+ getAll(): NaiteValuesByKey;
81
140
  /**
82
141
  * 스토어에 들어있던 트레이스를 고대로 꺼내옵니다.
83
142
  * 이때 값들은 모두 직렬화 가능한 상태로 나가게 됩니다.
@@ -1 +1 @@
1
- {"version":3,"file":"naite.d.ts","sourceRoot":"","sources":["../../src/naite/naite.ts"],"names":[],"mappings":";AAMA,OAAO,EAAE,KAAK,kBAAkB,EAAE,MAAM,wBAAwB,CAAC;AAKjE,UAAU,UAAU;IAClB,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;CACpB;AAGD,UAAU,UAAU;IAClB,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,GAAG,CAAC;IACV,KAAK,EAAE,UAAU,EAAE,CAAC;IACpB,EAAE,EAAE,IAAI,CAAC;CACV;AAGD,MAAM,MAAM,UAAU,GAAG,GAAG,CAAC,MAAM,EAAE,UAAU,EAAE,CAAC,CAAC;AAInD,MAAM,MAAM,eAAe,GAAG;IAC5B,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,GAAG,CAAC;IACX,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;IACnB,EAAE,EAAE,MAAM,CAAC;CACZ,CAAC;AAsGF;;;GAGG;AACH,qBAAa,UAAU;IACT,OAAO,CAAC,MAAM;gBAAN,MAAM,EAAE,UAAU,EAAE;IAExC,OAAO,CAAC,iBAAiB;IAIzB;;;OAGG;IACH,QAAQ,CAAC,QAAQ,EAAE,MAAM,GAAG,UAAU;IAOtC;;;;OAIG;IACH,YAAY,CACV,QAAQ,EAAE,MAAM,EAChB,OAAO,GAAE;QAAE,IAAI,EAAE,QAAQ,GAAG,UAAU,GAAG,MAAM,CAAA;KAAqB,GACnE,UAAU;IAgBb;;;;;OAKG;IACH,KAAK,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,kBAAkB,GAAG,UAAU,EAAE,KAAK,EAAE,GAAG,GAAG,UAAU;IA0BtF;;OAEG;IACH,MAAM,IAAI,GAAG,EAAE;IAIf;;OAEG;IACH,KAAK,IAAI,GAAG,GAAG,SAAS;IAIxB;;OAEG;IACH,IAAI,IAAI,GAAG,GAAG,SAAS;IAIvB;;OAEG;IACH,EAAE,CAAC,KAAK,EAAE,MAAM,GAAG,GAAG,GAAG,SAAS;IAIlC;;OAEG;IACH,SAAS,IAAI,UAAU,EAAE;CAG1B;AAGD,qBAAa,UAAU;IAErB,CAAC,CACC,IAAI,EAAE,MAAM,EACZ,KAAK,EAAE,GAAG;IA2CZ;;;OAGG;IACH,GAAG,CAAC,UAAU,EAAE,MAAM,GAAG,UAAU;IA0BnC,MAAM,IAAI;QAAE,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,CAAA;KAAE;IAmBhC;;;;;OAKG;IACH,YAAY,IAAI,eAAe,EAAE;IA+CjC,GAAG,CAAC,GAAG,EAAE,MAAM;IAQf,WAAW,IAAI,UAAU;CAG1B;AAED,eAAO,MAAM,KAAK,YAAmB,CAAC"}
1
+ {"version":3,"file":"naite.d.ts","sourceRoot":"","sources":["../../src/naite/naite.ts"],"names":[],"mappings":"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"}
@@ -1,5 +1,6 @@
1
1
  import { __esmMin } from "../_virtual/_rolldown/runtime.js";
2
2
  import { convertNaiteKeyToCategory, init_category } from "../logger/category.js";
3
+ import { init_runtime_value, isNumberValue, isStringValue } from "../utils/runtime-value.js";
3
4
  import { Sonamu, init_sonamu } from "../api/sonamu.js";
4
5
  import { init_object_utils, isSerializable } from "../utils/object-utils.js";
5
6
  import { getLogger } from "@logtape/logtape";
@@ -71,13 +72,14 @@ var init_naite = __esmMin((() => {
71
72
  init_sonamu();
72
73
  init_category();
73
74
  init_object_utils();
75
+ init_runtime_value();
74
76
  NaiteQuery = class NaiteQuery {
75
77
  traces;
76
78
  constructor(traces) {
77
79
  this.traces = traces;
78
80
  }
79
81
  isComparableValue(value) {
80
- return typeof value === "number" || typeof value === "string";
82
+ return isNumberValue(value) || isStringValue(value);
81
83
  }
82
84
  /**
83
85
  * 파일명으로 필터링
@@ -114,32 +116,20 @@ var init_naite = __esmMin((() => {
114
116
  case "<=": return this.isComparableValue(actual) && this.isComparableValue(value) && actual <= value;
115
117
  case "=": return actual === value;
116
118
  case "!=": return actual !== value;
117
- case "includes": return typeof actual === "string" && actual.includes(value);
119
+ case "includes": return isStringValue(actual) && isStringValue(value) && actual.includes(value);
118
120
  default: return false;
119
121
  }
120
122
  }));
121
123
  }
122
- /**
123
- * 전체 데이터 배열 반환
124
- */
125
124
  result() {
126
125
  return this.traces.map((t) => t.data);
127
126
  }
128
- /**
129
- * 첫 번째 데이터 반환
130
- */
131
127
  first() {
132
128
  return this.traces[0]?.data;
133
129
  }
134
- /**
135
- * 마지막 데이터 반환
136
- */
137
130
  last() {
138
131
  return this.traces[this.traces.length - 1]?.data;
139
132
  }
140
- /**
141
- * n번째 데이터 반환
142
- */
143
133
  at(index) {
144
134
  return this.traces[index]?.data;
145
135
  }
@@ -170,10 +160,6 @@ var init_naite = __esmMin((() => {
170
160
  store.set(name, [...existing, trace]);
171
161
  } catch {}
172
162
  }
173
- /**
174
- * key 또는 wildcard 패턴으로 trace 조회
175
- * 항상 NaiteQuery 반환하여 체이닝 가능
176
- */
177
163
  get(keyPattern) {
178
164
  const store = Sonamu.getContext()?.naiteStore;
179
165
  if (!store) return new NaiteQuery([]);
@@ -238,4 +224,4 @@ var init_naite = __esmMin((() => {
238
224
  init_naite();
239
225
  export { Naite, NaiteClass, NaiteQuery, init_naite };
240
226
 
241
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmFpdGUuanMiLCJuYW1lcyI6W10sInNvdXJjZXMiOlsiLi4vLi4vc3JjL25haXRlL25haXRlLnRzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qIG94bGludC1kaXNhYmxlIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnkgKi8gLy8gTmFpdGXripQgZXhwZWN07JmAIO2YuOydke2VmOuPhOuhnSBhbnnrpbwg7ZeI7Jqp7ZWoXG5cbmltcG9ydCB7IGdldExvZ2dlciB9IGZyb20gXCJAbG9ndGFwZS9sb2d0YXBlXCI7XG5pbXBvcnQgeyBnZXQgfSBmcm9tIFwicmFkYXNoaVwiO1xuXG5pbXBvcnQgeyBTb25hbXUgfSBmcm9tIFwiLi4vYXBpL3NvbmFtdVwiO1xuaW1wb3J0IHsgdHlwZSBDb21wYXJpc29uT3BlcmF0b3IgfSBmcm9tIFwiLi4vZGF0YWJhc2UvcHVyaS50eXBlc1wiO1xuaW1wb3J0IHsgY29udmVydE5haXRlS2V5VG9DYXRlZ29yeSB9IGZyb20gXCIuLi9sb2dnZXIvY2F0ZWdvcnlcIjtcbmltcG9ydCB7IGlzU2VyaWFsaXphYmxlIH0gZnJvbSBcIi4uL3V0aWxzL29iamVjdC11dGlsc1wiO1xuXG4vLyBTdGFja0ZyYW1lIO2DgOyehVxuaW50ZXJmYWNlIFN0YWNrRnJhbWUge1xuICBmdW5jdGlvbk5hbWU6IHN0cmluZyB8IG51bGw7XG4gIGZpbGVQYXRoOiBzdHJpbmc7IC8vIFwiL1VzZXJzLy4uLi9zeW5jZXIudHNcIiDrmJDripQgXCJub2RlOmludGVybmFsLy4uLlwiXG4gIGxpbmVOdW1iZXI6IG51bWJlcjsgLy8gVFMg7YyM7J28IOq4sOykgCDrnbzsnbgg67KI7Zi4XG59XG5cbi8vIE5haXRlVHJhY2Ug7YOA7J6FXG5pbnRlcmZhY2UgTmFpdGVUcmFjZSB7XG4gIGtleTogc3RyaW5nO1xuICBkYXRhOiBhbnk7XG4gIHN0YWNrOiBTdGFja0ZyYW1lW107IC8vIOy9nOyKpO2DnSDsoJXrs7RcbiAgYXQ6IERhdGU7XG59XG5cbi8vIE5haXRlLnTqsIAg7KCA7J6l65CY64qUIO2DgOyehSAo7ZWt7IOBIOuwsOyXtOuhnCDthrXsnbwpXG5leHBvcnQgdHlwZSBOYWl0ZVN0b3JlID0gTWFwPHN0cmluZywgTmFpdGVUcmFjZVtdPjtcblxuLy8gZ2V0QWxsVHJhY2VzKCnqsIAg67CY7ZmY7ZWY64qUIOyngeugrO2ZlOuQnCB0cmFjZSDtg4DsnoVcbi8vIGJvb3RzdHJhcC50c+ydmCBUYXNrTWV0YSBhdWdtZW50YXRpb24sIGRldi12aXRlc3QtbWFuYWdlci50c+yXkOyEnOuPhCDsnbQg7YOA7J6F7J2EIOqzteycoO2VqeuLiOuLpC5cbmV4cG9ydCB0eXBlIFNlcmlhbGl6ZWRUcmFjZSA9IHtcbiAga2V5OiBzdHJpbmc7XG4gIHZhbHVlOiBhbnk7XG4gIGZpbGVQYXRoOiBzdHJpbmc7XG4gIGxpbmVOdW1iZXI6IG51bWJlcjtcbiAgYXQ6IHN0cmluZztcbn07XG5cbi8qKlxuICog7L2c7Iqk7YOd7J2EIO2MjOyLse2VmOyXrCBTdGFja0ZyYW1lIOuwsOyXtOuhnCDrsJjtmZhcbiAqIC0gZXh0cmFjdENhbGxTdGFjayDsnpDsi6Dqs7wgTmFpdGUudOuKlCDsoJzsmbhcbiAqIC0gcnVuV2l0aENvbnRleHQvcnVuV2l0aE1vY2tDb250ZXh0IOuwnOqyrCDsi5wg6rGw6riw7IScIOyiheujjFxuICogLSBub2RlOiDrgrTrtoAg6rK966Gc64qUIO2PrO2VqO2VmOuQmCwgbGluZU51bWJlcuuKlCBwYXRo7JeQIDog7Y+s7ZWoIOyLnCDrtpnsnbTsp4Ag7JWK7J2MXG4gKi9cbmZ1bmN0aW9uIGV4dHJhY3RDYWxsU3RhY2soKTogU3RhY2tGcmFtZVtdIHtcbiAgY29uc3Qgc3RhY2sgPSBuZXcgRXJyb3IoKS5zdGFjaztcbiAgaWYgKCFzdGFjaykgcmV0dXJuIFtdO1xuXG4gIGNvbnN0IGxpbmVzID0gc3RhY2suc3BsaXQoXCJcXG5cIik7XG5cbiAgLy8g7L2c7Iqk7YOdIOq1rOyhsDpcbiAgLy8gWzBdOiBcIkVycm9yXCJcbiAgLy8gWzFdOiBcImF0IGV4dHJhY3RDYWxsU3RhY2tcIlxuICAvLyBbMl06IFwiYXQgTmFpdGUudFwiXG4gIC8vIFszXTog7Iuk7KCcIO2YuOy2nCDsnITsuZjrtoDthLAg7Iuc7J6RXG4gIGNvbnN0IGZyYW1lcyA9IGxpbmVzXG4gICAgLnNsaWNlKDMpXG4gICAgLm1hcChwYXJzZVN0YWNrRnJhbWUpXG4gICAgLmZpbHRlcigoZnJhbWUpOiBmcmFtZSBpcyBTdGFja0ZyYW1lID0+IGZyYW1lICE9PSBudWxsKTtcblxuICAvLyBydW5XaXRoQ29udGV4dCDqs4Tsl7Qg7ZWo7IiYIOuwnOqyrCDsi5wg6rGw6riw7IScIOyekOultOq4sFxuICBjb25zdCBjb250ZXh0SW5kZXggPSBmcmFtZXMuZmluZEluZGV4KFxuICAgIChmKSA9PlxuICAgICAgZi5mdW5jdGlvbk5hbWU/LmluY2x1ZGVzKFwicnVuV2l0aENvbnRleHRcIikgfHwgZi5mdW5jdGlvbk5hbWU/LmluY2x1ZGVzKFwicnVuV2l0aE1vY2tDb250ZXh0XCIpLFxuICApO1xuXG4gIHJldHVybiBjb250ZXh0SW5kZXggPj0gMCA/IGZyYW1lcy5zbGljZSgwLCBjb250ZXh0SW5kZXggKyAxKSA6IGZyYW1lcztcbn1cblxuLyoqXG4gKiDsvZzsiqTtg50g7ZWcIOykhOydhCDtjIzsi7FcbiAqIO2YleyLnTE6IFwiYXQgRnVuY3Rpb25OYW1lIChmaWxlUGF0aDpsaW5lTnVtYmVyOmNvbHVtbk51bWJlcilcIlxuICog7ZiV7IudMjogXCJhdCBmaWxlUGF0aDpsaW5lTnVtYmVyOmNvbHVtbk51bWJlclwiICjsnbXrqoUg7ZWo7IiYL+uqqOuTiCDroIjrsqgpXG4gKi9cbmZ1bmN0aW9uIHBhcnNlU3RhY2tGcmFtZShsaW5lOiBzdHJpbmcpOiBTdGFja0ZyYW1lIHwgbnVsbCB7XG4gIC8vIO2MqO2EtDE6IFwiYXQgRnVuY3Rpb25OYW1lIChmaWxlUGF0aDpsaW5lTnVtYmVyOmNvbHVtbk51bWJlcilcIlxuICBjb25zdCBtYXRjaFdpdGhGdW5jID0gbGluZS5tYXRjaCgvYXRcXHMrKC4rPylcXHMrXFwoKC4rPyk6KFxcZCspOlxcZCtcXCkvKTtcbiAgaWYgKG1hdGNoV2l0aEZ1bmMpIHtcbiAgICBjb25zdCBmdW5jdGlvbk5hbWUgPSBtYXRjaFdpdGhGdW5jWzFdO1xuICAgIGNvbnN0IGZpbGVQYXRoID0gbWF0Y2hXaXRoRnVuY1syXTtcbiAgICBjb25zdCBsaW5lTnVtYmVyU3RyID0gbWF0Y2hXaXRoRnVuY1szXTtcblxuICAgIC8vIGZpbGVQYXRo7JeQIOydtOuvuCA66rCAIO2PrO2VqOuQmOyWtCDsnojsnLzrqbQgKOyYiDogXCJub2RlOmludGVybmFsLy4uLlwiKVxuICAgIGlmIChmaWxlUGF0aC5pbmNsdWRlcyhcIjpcIikpIHtcbiAgICAgIHJldHVybiB7IGZ1bmN0aW9uTmFtZSwgZmlsZVBhdGgsIGxpbmVOdW1iZXI6IDAgfTtcbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgZnVuY3Rpb25OYW1lLFxuICAgICAgZmlsZVBhdGgsXG4gICAgICBsaW5lTnVtYmVyOiBOdW1iZXIucGFyc2VJbnQobGluZU51bWJlclN0ciwgMTApLFxuICAgIH07XG4gIH1cblxuICAvLyDtjKjthLQyOiBcImF0IGZpbGVQYXRoOmxpbmVOdW1iZXI6Y29sdW1uTnVtYmVyXCIgKO2VqOyImOuqhSDsl4bsnYwpXG4gIGNvbnN0IG1hdGNoTm9GdW5jID0gbGluZS5tYXRjaCgvYXRcXHMrKC4rPyk6KFxcZCspOlxcZCskLyk7XG4gIGlmIChtYXRjaE5vRnVuYykge1xuICAgIGNvbnN0IGZpbGVQYXRoID0gbWF0Y2hOb0Z1bmNbMV07XG4gICAgY29uc3QgbGluZU51bWJlclN0ciA9IG1hdGNoTm9GdW5jWzJdO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIGZ1bmN0aW9uTmFtZTogbnVsbCxcbiAgICAgIGZpbGVQYXRoLFxuICAgICAgbGluZU51bWJlcjogTnVtYmVyLnBhcnNlSW50KGxpbmVOdW1iZXJTdHIsIDEwKSxcbiAgICB9O1xuICB9XG5cbiAgcmV0dXJuIG51bGw7XG59XG5cbi8qKlxuICogd2lsZGNhcmQg7Yyo7YS0IOunpOy5rVxuICog7JiI7IucOlxuICogLSBcInN5bmNlcjoqXCIg4oaSIFwic3luY2VyOmFcIiwgXCJzeW5jZXI6YTpiXCIg66qo65GQIOunpOy5rVxuICogLSBcInN5bmNlcjoqOnVzZXJcIiDihpIgXCJzeW5jZXI6cmVuZGVyVGVtcGxhdGU6dXNlclwiIOunpOy5rVxuICogLSBcInN5bmNlcjpyZW5kZXJUZW1wbGF0ZToqXCIg4oaSIFwic3luY2VyOnJlbmRlclRlbXBsYXRlOnNlcnZpY2VcIiDrp6Tsua1cbiAqL1xuZnVuY3Rpb24gbWF0Y2hlc1BhdHRlcm4oa2V5OiBzdHJpbmcsIHBhdHRlcm46IHN0cmluZyk6IGJvb2xlYW4ge1xuICBjb25zdCBrZXlQYXJ0cyA9IGtleS5zcGxpdChcIjpcIik7XG4gIGNvbnN0IHBhdHRlcm5QYXJ0cyA9IHBhdHRlcm4uc3BsaXQoXCI6XCIpO1xuXG4gIC8vIOuniOyngOunieydtCAqIOKGkiBwcmVmaXgg66ek7LmtICjquLjsnbQg66y06rSAKVxuICAvLyDsmIg6IFwic3luY2VyOipcIuuKlCBcInN5bmNlcjphXCIsIFwic3luY2VyOmE6YlwiIOuqqOuRkCDrp6Tsua1cbiAgaWYgKHBhdHRlcm5QYXJ0c1twYXR0ZXJuUGFydHMubGVuZ3RoIC0gMV0gPT09IFwiKlwiKSB7XG4gICAgY29uc3QgcHJlZml4UGFydHMgPSBwYXR0ZXJuUGFydHMuc2xpY2UoMCwgLTEpO1xuICAgIC8vIHByZWZpeOqwgCDrqqjrkZAg7J287LmY7ZWY64qU7KeAIO2ZleyduFxuICAgIHJldHVybiBwcmVmaXhQYXJ0cy5ldmVyeSgocGFydCwgaSkgPT4gcGFydCA9PT0ga2V5UGFydHNbaV0pO1xuICB9XG5cbiAgLy8g6ri47J206rCAIOqwmeyVhOyVvCDtlahcbiAgaWYgKHBhdHRlcm5QYXJ0cy5sZW5ndGggIT09IGtleVBhcnRzLmxlbmd0aCkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIC8vIOqwgSDtjIztirjqsIAgKiDrmJDripQg7KCV7ZmV7Z6IIOydvOy5mFxuICByZXR1cm4gcGF0dGVyblBhcnRzLmV2ZXJ5KChwYXJ0LCBpKSA9PiBwYXJ0ID09PSBcIipcIiB8fCBwYXJ0ID09PSBrZXlQYXJ0c1tpXSk7XG59XG5cbi8qKlxuICogTmFpdGVRdWVyeSDtgbTrnpjsiqRcbiAqIOyytOydtOuLneydhCDthrXtlZwgdHJhY2Ug7ZWE7YSw66eBIOuwjyDsobDtmoxcbiAqL1xuZXhwb3J0IGNsYXNzIE5haXRlUXVlcnkge1xuICBjb25zdHJ1Y3Rvcihwcml2YXRlIHRyYWNlczogTmFpdGVUcmFjZVtdKSB7fVxuXG4gIHByaXZhdGUgaXNDb21wYXJhYmxlVmFsdWUodmFsdWU6IHVua25vd24pOiB2YWx1ZSBpcyBudW1iZXIgfCBzdHJpbmcge1xuICAgIHJldHVybiB0eXBlb2YgdmFsdWUgPT09IFwibnVtYmVyXCIgfHwgdHlwZW9mIHZhbHVlID09PSBcInN0cmluZ1wiO1xuICB9XG5cbiAgLyoqXG4gICAqIO2MjOydvOuqheycvOuhnCDtlYTthLDrp4FcbiAgICogQHBhcmFtIGZpbGVOYW1lIO2MjOydvOuqhSAo7JiIOiBcInN5bmNlci50ZXN0LnRzXCIpXG4gICAqL1xuICBmcm9tRmlsZShmaWxlTmFtZTogc3RyaW5nKTogTmFpdGVRdWVyeSB7XG4gICAgY29uc3QgZmlsdGVyZWQgPSB0aGlzLnRyYWNlcy5maWx0ZXIoKHQpID0+XG4gICAgICB0LnN0YWNrLnNvbWUoKGZyYW1lKSA9PiBmcmFtZS5maWxlUGF0aC5lbmRzV2l0aChgLyR7ZmlsZU5hbWV9YCkpLFxuICAgICk7XG4gICAgcmV0dXJuIG5ldyBOYWl0ZVF1ZXJ5KGZpbHRlcmVkKTtcbiAgfVxuXG4gIC8qKlxuICAgKiDtlajsiJjrqoXsnLzroZwg7ZWE7YSw66eBXG4gICAqIEBwYXJhbSBmdW5jTmFtZSDtlajsiJjrqoUgKGluY2x1ZGVzIOyytO2BrClcbiAgICogQHBhcmFtIG9wdGlvbnMuZnJvbSAnZGlyZWN0JyA9IOyngeygkSDtmLjstpzrp4wsICdpbmRpcmVjdCcgPSDqsITsoJEg7Zi47Lac66eMLCAnYm90aCcgPSDrqqjrkZBcbiAgICovXG4gIGZyb21GdW5jdGlvbihcbiAgICBmdW5jTmFtZTogc3RyaW5nLFxuICAgIG9wdGlvbnM6IHsgZnJvbTogXCJkaXJlY3RcIiB8IFwiaW5kaXJlY3RcIiB8IFwiYm90aFwiIH0gPSB7IGZyb206IFwiYm90aFwiIH0sXG4gICk6IE5haXRlUXVlcnkge1xuICAgIGNvbnN0IGZpbHRlcmVkID0gdGhpcy50cmFjZXMuZmlsdGVyKCh0KSA9PiB7XG4gICAgICBpZiAob3B0aW9ucy5mcm9tID09PSBcImRpcmVjdFwiKSB7XG4gICAgICAgIC8vIHN0YWNrWzBd66eMIO2ZleyduCAo7KeB7KCRIO2YuOy2nClcbiAgICAgICAgcmV0dXJuIHQuc3RhY2tbMF0/LmZ1bmN0aW9uTmFtZT8uaW5jbHVkZXMoZnVuY05hbWUpO1xuICAgICAgfVxuICAgICAgaWYgKG9wdGlvbnMuZnJvbSA9PT0gXCJpbmRpcmVjdFwiKSB7XG4gICAgICAgIC8vIHN0YWNrWzErXeyXkOyEnCDtmZXsnbggKOqwhOygkSDtmLjstpwpXG4gICAgICAgIHJldHVybiB0LnN0YWNrLnNsaWNlKDEpLnNvbWUoKGYpID0+IGYuZnVuY3Rpb25OYW1lPy5pbmNsdWRlcyhmdW5jTmFtZSkpO1xuICAgICAgfVxuICAgICAgLy8g7KCE7LK0IOyKpO2DneyXkOyEnCDtmZXsnbhcbiAgICAgIHJldHVybiB0LnN0YWNrLnNvbWUoKGYpID0+IGYuZnVuY3Rpb25OYW1lPy5pbmNsdWRlcyhmdW5jTmFtZSkpO1xuICAgIH0pO1xuICAgIHJldHVybiBuZXcgTmFpdGVRdWVyeShmaWx0ZXJlZCk7XG4gIH1cblxuICAvKipcbiAgICog642w7J207YSwIOqyveuhnCDquLDrsJgg7ZWE7YSw66eBXG4gICAqIEBwYXJhbSBwYXRoIHJhZGFzaCBnZXQg6rK966GcICjsmIg6IFwiZGF0YS51c2VySWRcIilcbiAgICogQHBhcmFtIG9wZXJhdG9yIOu5hOq1kCDsl7DsgrDsnpBcbiAgICogQHBhcmFtIHZhbHVlIOu5hOq1kOqwklxuICAgKi9cbiAgd2hlcmUocGF0aDogc3RyaW5nLCBvcGVyYXRvcjogQ29tcGFyaXNvbk9wZXJhdG9yIHwgXCJpbmNsdWRlc1wiLCB2YWx1ZTogYW55KTogTmFpdGVRdWVyeSB7XG4gICAgY29uc3QgZmlsdGVyZWQgPSB0aGlzLnRyYWNlcy5maWx0ZXIoKHRyYWNlKSA9PiB7XG4gICAgICBjb25zdCBhY3R1YWwgPSBnZXQodHJhY2UsIHBhdGgpO1xuXG4gICAgICBzd2l0Y2ggKG9wZXJhdG9yKSB7XG4gICAgICAgIGNhc2UgXCI+XCI6XG4gICAgICAgICAgcmV0dXJuIHRoaXMuaXNDb21wYXJhYmxlVmFsdWUoYWN0dWFsKSAmJiB0aGlzLmlzQ29tcGFyYWJsZVZhbHVlKHZhbHVlKSAmJiBhY3R1YWwgPiB2YWx1ZTtcbiAgICAgICAgY2FzZSBcIjxcIjpcbiAgICAgICAgICByZXR1cm4gdGhpcy5pc0NvbXBhcmFibGVWYWx1ZShhY3R1YWwpICYmIHRoaXMuaXNDb21wYXJhYmxlVmFsdWUodmFsdWUpICYmIGFjdHVhbCA8IHZhbHVlO1xuICAgICAgICBjYXNlIFwiPj1cIjpcbiAgICAgICAgICByZXR1cm4gdGhpcy5pc0NvbXBhcmFibGVWYWx1ZShhY3R1YWwpICYmIHRoaXMuaXNDb21wYXJhYmxlVmFsdWUodmFsdWUpICYmIGFjdHVhbCA+PSB2YWx1ZTtcbiAgICAgICAgY2FzZSBcIjw9XCI6XG4gICAgICAgICAgcmV0dXJuIHRoaXMuaXNDb21wYXJhYmxlVmFsdWUoYWN0dWFsKSAmJiB0aGlzLmlzQ29tcGFyYWJsZVZhbHVlKHZhbHVlKSAmJiBhY3R1YWwgPD0gdmFsdWU7XG4gICAgICAgIGNhc2UgXCI9XCI6XG4gICAgICAgICAgcmV0dXJuIGFjdHVhbCA9PT0gdmFsdWU7XG4gICAgICAgIGNhc2UgXCIhPVwiOlxuICAgICAgICAgIHJldHVybiBhY3R1YWwgIT09IHZhbHVlO1xuICAgICAgICBjYXNlIFwiaW5jbHVkZXNcIjpcbiAgICAgICAgICByZXR1cm4gdHlwZW9mIGFjdHVhbCA9PT0gXCJzdHJpbmdcIiAmJiBhY3R1YWwuaW5jbHVkZXModmFsdWUpO1xuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICByZXR1cm4gbmV3IE5haXRlUXVlcnkoZmlsdGVyZWQpO1xuICB9XG5cbiAgLyoqXG4gICAqIOyghOyytCDrjbDsnbTthLAg67Cw7Je0IOuwmO2ZmFxuICAgKi9cbiAgcmVzdWx0KCk6IGFueVtdIHtcbiAgICByZXR1cm4gdGhpcy50cmFjZXMubWFwKCh0KSA9PiB0LmRhdGEpO1xuICB9XG5cbiAgLyoqXG4gICAqIOyyqyDrsojsp7gg642w7J207YSwIOuwmO2ZmFxuICAgKi9cbiAgZmlyc3QoKTogYW55IHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy50cmFjZXNbMF0/LmRhdGE7XG4gIH1cblxuICAvKipcbiAgICog66eI7KeA66eJIOuNsOydtO2EsCDrsJjtmZhcbiAgICovXG4gIGxhc3QoKTogYW55IHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy50cmFjZXNbdGhpcy50cmFjZXMubGVuZ3RoIC0gMV0/LmRhdGE7XG4gIH1cblxuICAvKipcbiAgICogbuuyiOynuCDrjbDsnbTthLAg67CY7ZmYXG4gICAqL1xuICBhdChpbmRleDogbnVtYmVyKTogYW55IHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy50cmFjZXNbaW5kZXhdPy5kYXRhO1xuICB9XG5cbiAgLyoqXG4gICAqIOybkOuzuCB0cmFjZSDrsLDsl7Qg67CY7ZmYICjrlJTrsoTquYUvTmFpdGVWaWV3ZXLsmqkpXG4gICAqL1xuICBnZXRUcmFjZXMoKTogTmFpdGVUcmFjZVtdIHtcbiAgICByZXR1cm4gdGhpcy50cmFjZXM7XG4gIH1cbn1cblxuLy8gTmFpdGUg7Iux6riA7YS0IOqwneyytCAo7LaU7ZuEIGxvZ2dlciDsl7DqsrAg65Ox7J2YIOyDge2DnCDqtIDrpqwg7ZWE7JqU7ISxIOqzoOugpClcbmV4cG9ydCBjbGFzcyBOYWl0ZUNsYXNzIHtcbiAgLy8g7YWM7Iqk7Yq4IOuhnOq3uCDquLDroZ1cbiAgdChcbiAgICBuYW1lOiBzdHJpbmcsXG4gICAgdmFsdWU6IGFueSAvKuydtOugh+qyjCDrsJvsnYAg6rCS7J20IE5haXRlVHJhY2XroZwg7KCA7J6l65CY7Ja0IOyeiOuLpOqwgCDstpTtm4Tsl5Agdml0ZXN07JeQ6rKMIG1ldGHrpbwg7Ya17ZW0IOuEmOqyqOyguCDtlITroZzshLjsiqTqsIQg7Ya17Iug7J2EIO2Gte2VtCDsp4HroKztmZTrkJjslrTslbwg7ZWY64qUIOygkOydhCDqs6DroKTtlZjsmIDsnYQg65WMIOyXrOq4sOyXkCBTZXJpYWxpemFibGXsnYQg7I2o7IScIOygnO2VnOydhCDrkZgg7IiY64+EIOyeiOyngOunjCwg7IKs7Jqp7IOB7J2YIO2OuOydmOulvCDsg53qsIHtlZjsl6wgYW5566GcIOuwm+yKteuLiOuLpC4qLyxcbiAgKSB7XG4gICAgLy8g7J20IHQg7ZWo7IiY64qUIO2FjOyKpO2KuCDtmZjqsr3sl5DshJzrp4wg7J6R64+Z7ZW07JW8IO2VqeuLiOuLpC5cbiAgICAvLyDqt7jrpqzqs6Ag7YWM7Iqk7Yq4IO2ZmOqyvSDtjJDri6jsl5Ag7JmcIGlzVGVzdCgpIO2VqOyImOulvCDsgqzsmqntlZjsp4Ag7JWK7JWY64OQ66m07JqULCxcbiAgICAvLyDsnbTroIfqsowg7ZWY64qU6rKMIOycoO2LuCDtlajsiJgg67aI65+s7JmA7IScIOyCrOyaqe2VmOuKlCDqsoPrs7Tri6Qg7KGw6riI7J2064KY66eIIOu5oOulvCDqsoMg6rCZ7JWY6riwIOuVjOusuOyeheuLiOuLpC5cbiAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwidGVzdFwiKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGNvbnRleHQgPSBTb25hbXUuZ2V0Q29udGV4dCgpO1xuICAgICAgY29uc3Qgc3RvcmUgPSBjb250ZXh0Py5uYWl0ZVN0b3JlO1xuXG4gICAgICBpZiAoIXN0b3JlKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgLy8g7L2c7Iqk7YOdIOyImOynkVxuICAgICAgY29uc3Qgc3RhY2sgPSBleHRyYWN0Q2FsbFN0YWNrKCk7XG5cbiAgICAgIGNvbnN0IHRyYWNlOiBOYWl0ZVRyYWNlID0ge1xuICAgICAgICBrZXk6IG5hbWUsXG4gICAgICAgIGRhdGE6IHZhbHVlLFxuICAgICAgICBzdGFjayxcbiAgICAgICAgYXQ6IG5ldyBEYXRlKCksXG4gICAgICB9O1xuXG4gICAgICAvLyDtla3sg4Eg67Cw7Je066GcIOq0gOumrFxuICAgICAgY29uc3QgZXhpc3RpbmcgPSBzdG9yZS5nZXQobmFtZSkgPz8gW107XG4gICAgICBnZXRMb2dnZXIoW1wibmFpdGVcIiwgLi4uY29udmVydE5haXRlS2V5VG9DYXRlZ29yeShuYW1lKV0pLmRlYnVnKFxuICAgICAgICBgbmFpdGU6IHtuYW1lfSAke2V4aXN0aW5nLmxlbmd0aCA9PT0gMCA/IFwiaXMgZW1wdHkgc3RhdGVcIiA6IGBhbHJlYWR5IGV4aXN0aW5nIHdpdGggJHtleGlzdGluZy5sZW5ndGh9IGVudHJpZXNgfSwgYXBwZW5kaW5nIG5ldyBlbnRyeWAsXG4gICAgICAgIHtcbiAgICAgICAgICBuYW1lLFxuICAgICAgICAgIHZhbHVlLFxuICAgICAgICB9LFxuICAgICAgKTtcblxuICAgICAgc3RvcmUuc2V0KG5hbWUsIFsuLi5leGlzdGluZywgdHJhY2VdKTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIC8vIENvbnRleHQg7JeG64qUIOyDge2ZqeyXkOyEnCBOYWl0ZS50IO2YuOy2nFxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBrZXkg65iQ64qUIHdpbGRjYXJkIO2MqO2EtOycvOuhnCB0cmFjZSDsobDtmoxcbiAgICog7ZWt7IOBIE5haXRlUXVlcnkg67CY7ZmY7ZWY7JesIOyytOydtOuLnSDqsIDriqVcbiAgICovXG4gIGdldChrZXlQYXR0ZXJuOiBzdHJpbmcpOiBOYWl0ZVF1ZXJ5IHtcbiAgICBjb25zdCBjb250ZXh0ID0gU29uYW11LmdldENvbnRleHQoKTtcbiAgICBjb25zdCBzdG9yZSA9IGNvbnRleHQ/Lm5haXRlU3RvcmU7XG5cbiAgICBpZiAoIXN0b3JlKSB7XG4gICAgICByZXR1cm4gbmV3IE5haXRlUXVlcnkoW10pO1xuICAgIH1cblxuICAgIC8vIHdpbGRjYXJkIOyXhuycvOuptCBleGFjdCBtYXRjaFxuICAgIGlmICgha2V5UGF0dGVybi5pbmNsdWRlcyhcIipcIikpIHtcbiAgICAgIGNvbnN0IHRyYWNlcyA9IHN0b3JlLmdldChrZXlQYXR0ZXJuKSA/PyBbXTtcbiAgICAgIHJldHVybiBuZXcgTmFpdGVRdWVyeSh0cmFjZXMpO1xuICAgIH1cblxuICAgIC8vIHdpbGRjYXJkIO2MqO2EtCDrp6Tsua1cbiAgICBjb25zdCBhbGxUcmFjZXM6IE5haXRlVHJhY2VbXSA9IFtdO1xuICAgIGZvciAoY29uc3QgW2tleSwgdHJhY2VzXSBvZiBzdG9yZS5lbnRyaWVzKCkpIHtcbiAgICAgIGlmIChtYXRjaGVzUGF0dGVybihrZXksIGtleVBhdHRlcm4pKSB7XG4gICAgICAgIGFsbFRyYWNlcy5wdXNoKC4uLnRyYWNlcyk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIG5ldyBOYWl0ZVF1ZXJ5KGFsbFRyYWNlcyk7XG4gIH1cblxuICAvLyDsoITssrQg66as7Iqk7Yq4IOqwgOyguOyYpOq4sFxuICBnZXRBbGwoKTogeyBba2V5OiBzdHJpbmddOiBhbnkgfSB7XG4gICAgY29uc3QgY29udGV4dCA9IFNvbmFtdS5nZXRDb250ZXh0KCk7XG4gICAgaWYgKCFjb250ZXh0Py5uYWl0ZVN0b3JlKSB7XG4gICAgICByZXR1cm4ge307XG4gICAgfVxuICAgIC8vIE5haXRlVHJhY2Ug67Cw7Je07J2EIGRhdGHrp4wg7LaU7Lac7ZWY7JesIOuwmO2ZmFxuICAgIGNvbnN0IHJlc3VsdDogeyBba2V5OiBzdHJpbmddOiBhbnkgfSA9IHt9O1xuICAgIGZvciAoY29uc3QgW2tleSwgdHJhY2VzXSBvZiBjb250ZXh0Lm5haXRlU3RvcmUuZW50cmllcygpKSB7XG4gICAgICBpZiAoa2V5LnN0YXJ0c1dpdGgoXCJtb2NrOlwiKSkge1xuICAgICAgICAvLyBNb2NrIOyEpOygleydgCDqt7jrjIDroZwg67CY7ZmYXG4gICAgICAgIHJlc3VsdFtrZXldID0gdHJhY2VzO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gTmFpdGVUcmFjZSDrsLDsl7TsnYAgZGF0YeunjCDstpTstpxcbiAgICAgICAgcmVzdWx0W2tleV0gPSB0cmFjZXMubWFwKCh0OiBOYWl0ZVRyYWNlKSA9PiB0LmRhdGEpO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgLyoqXG4gICAqIOyKpO2GoOyWtOyXkCDrk6TslrTsnojrjZgg7Yq466CI7J207Iqk66W8IOqzoOuMgOuhnCDqurzrgrTsmLXri4jri6QuXG4gICAqIOydtOuVjCDqsJLrk6TsnYAg66qo65GQIOyngeugrO2ZlCDqsIDriqXtlZwg7IOB7YOc66GcIOuCmOqwgOqyjCDrkKnri4jri6QuXG4gICAqIO2FjOyKpO2KuCDsoJXrs7TsmYAg7ZWo6ruYIGV4dGVuc2lvbnPsl5Ag67O064K8IOyaqeuPhOuhnCDrp4zrk6Tsl4jsirXri4jri6QuXG4gICAqIEByZXR1cm5zXG4gICAqL1xuICBnZXRBbGxUcmFjZXMoKTogU2VyaWFsaXplZFRyYWNlW10ge1xuICAgIGNvbnN0IGNvbnRleHQgPSBTb25hbXUuZ2V0Q29udGV4dCgpO1xuICAgIGlmICghY29udGV4dD8ubmFpdGVTdG9yZSkge1xuICAgICAgcmV0dXJuIFtdO1xuICAgIH1cblxuICAgIGNvbnN0IHRyYWNlcyA9IEFycmF5LmZyb20oY29udGV4dC5uYWl0ZVN0b3JlLnZhbHVlcygpKS5mbGF0KCk7XG5cbiAgICAvLyDsp4HroKztmZQg67aI6rCA64ql7ZWcIOqwkuydtCDsobTsnqztlZzri6TrqbQg7J2066W8IOuMgOusuOynneunjO2VmOqyjCDslYzroKTspI3ri4jri6QhIOq3uOy5mOunjCDslYzrpqzquLDrp4wg7ZWY6rOgIOq3uOuDpSDsp4DrgpjqsJHri4jri6Qg44WO44WOXG4gICAgLy8g7JmcIOyngeugrO2ZlOqwgCDspJHsmpTtlZzqsIA/IOydtChnZXRBbGxUcmFjZXMpIO2YuOy2nOydmCDqsrDqs7zripQg7Jm467aA66GcIOuCmOqwgOqyjCDrkJjripTrjbAsXG4gICAgLy8g7J2065WMIOyjvCDsmqnrj4TqsIAgdml0ZXN07J2YIHRhc2subWV0YSDtlYTrk5zrpbwg7Ya17ZW0IGFmdGVyRWFjaOyXkOyEnCBTb25hbXUgZXh0ZW5zaW9u7Jy866GcIOyghOuLrO2VmOuKlCDqsoPsnoXri4jri6QuXG4gICAgLy8g7Jes6riw7IScIG1ldGEg7ZWE65Oc7JeQIOuLtOq4tCDrgrTsmqnsnYAg7ZSE66Gc7IS47Iqk6rCEIO2GteyLoChwcm9jZXNzLnNlbmQpIOuYkOuKlCDsiqTroIjrk5zqsIQg7Ya17IugKG1lc3NhZ2UgcG9ydCnsnYQg7Ya17ZW0IOyghOuLrOuQmOyWtOyVvCDtlZjripTrjbAsXG4gICAgLy8g7J2066GcIOyduO2VtCBcIuyngeugrO2ZlCDqsIDriqXtlZwg6rCS65Ok66eMIO2XiOyaqVwi7ZWY64qUIOygnOyVveydtCDsg53quYHri4jri6QuXG4gICAgLy9cbiAgICAvLyDsnbQg7KCc7JW97J2EIOydmOyLne2VmOyXrCBOYWl0ZS507JeQIOyngeugrO2ZlCDqsIDriqXtlZwg6rCS66eMIOuEmOq4sOqyjCDtlaAg7IiY64+EIOyeiOyXiOyngOunjCwg6re466CH6rKMIO2VmOuptCDrtojtjrjtlbTsp4gg6rKDIOqwmeyVhOyEnCDtlZjsp4Ag7JWK7JWY7Iq164uI64ukLlxuICAgIC8vIOuUsOudvOyEnCDtmITsnqwgTmFpdGUudOuKlCDrqqjrk6Ag6rCS7J2EIOuwm+ydhCDsiJgg7J6I6rKMIOuQmOyWtCDsnojsirXri4jri6QuXG4gICAgLy8g64yA7IugIOydtOugh+qyjChnZXRBbGxUcmFjZXMpIOq3uCDqsJLrk6TsnYQg67m864K8IOuVjCBKU09OLnN0cmluZ2lmeeulvCDsgqzsmqntlZjsl6wg6rCV7KCc66GcIOyngeugrO2ZlCDqsIDriqXtlZjqsowg66eM65Ok7JeI7Iq164uI64ukLCxcbiAgICBmb3IgKGNvbnN0IHRyYWNlIG9mIHRyYWNlcykge1xuICAgICAgY29uc3QgY2hlY2sgPSBpc1NlcmlhbGl6YWJsZSh0cmFjZS5kYXRhKTtcbiAgICAgIGlmICghY2hlY2sudmFsaWQpIHtcbiAgICAgICAgY29uc29sZS53YXJuKFxuICAgICAgICAgIFwiXFxuXCIgK1xuICAgICAgICAgICAgXCLilZTilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZdcXG5cIiArXG4gICAgICAgICAgICBcIuKVkSAgW05haXRlXSBOb24tc2VyaWFsaXphYmxlIHZhbHVlIGRldGVjdGVkISAgICAgICAgICAgICAgICAgICAgICDilZFcXG5cIiArXG4gICAgICAgICAgICBcIuKVoOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVo1xcblwiICtcbiAgICAgICAgICAgIGDilZEgIEtleTogJHt0cmFjZS5rZXkucGFkRW5kKDU3KX3ilZFcXG5gICtcbiAgICAgICAgICAgIGDilZEgIFJlYXNvbjogJHsoY2hlY2sucmVhc29uID8/IFwidW5rbm93blwiKS5zbGljZSgwLCA1NCkucGFkRW5kKDU0KX3ilZFcXG5gICtcbiAgICAgICAgICAgIGDilZEgIExvY2F0aW9uOiAkeyh0cmFjZS5zdGFja1swXT8uZmlsZVBhdGggPz8gXCJ1bmtub3duXCIpLnNsaWNlKC01MSkucGFkRW5kKDUyKX3ilZFcXG5gICtcbiAgICAgICAgICAgIGDilZEgIExpbmU6ICR7U3RyaW5nKHRyYWNlLnN0YWNrWzBdPy5saW5lTnVtYmVyID8/IDApLnBhZEVuZCg1Nil94pWRXFxuYCArXG4gICAgICAgICAgICBcIuKVoOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVo1xcblwiICtcbiAgICAgICAgICAgIFwi4pWRICBOYWl0ZS50KCkgYWNjZXB0cyBhbnkgdHlwZSBvZiB2YWx1ZS4gSG93ZXZlciwgdmFsdWVzIHdpbGwgICAgIOKVkVxcblwiICtcbiAgICAgICAgICAgIFwi4pWRICBiZSBzZXJpYWxpemVkIHRvIEpTT04gd2hlbiBleHBvcnRlZCB2aWEgTmFpdGUuZ2V0QWxsVHJhY2VzKCkuIOKVkVxcblwiICtcbiAgICAgICAgICAgIFwi4pWa4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWdXFxuXCIsXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHRyYWNlcy5tYXAoKHRyYWNlKSA9PiAoe1xuICAgICAga2V5OiB0cmFjZS5rZXksXG4gICAgICB2YWx1ZTogSlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeSh0cmFjZS5kYXRhID8/IFwiXCIpKSwgLy8g7KeB66Cs7ZmUIOqwgOuKpe2VnCDqsoPrp4wg64Ko6riw66Ck64qUIOuIiOusvOqyqOyatCDrhbjroKUsLCDslYjqt7jrn6zrqbQgdGFzay5tZXRh7JeQIOuTpOyWtOqwgOyEnCDtlITroZzshLjsiqTqsIQg7Ya17IugIO2VoCDrlYwg66y47KCcIOyDneq4sOqxsOuToOyalCwsXG4gICAgICBmaWxlUGF0aDogdHJhY2Uuc3RhY2tbMF0/LmZpbGVQYXRoID8/IFwiXCIsXG4gICAgICBsaW5lTnVtYmVyOiB0cmFjZS5zdGFja1swXT8ubGluZU51bWJlciA/PyAwLFxuICAgICAgYXQ6IHRyYWNlLmF0LnRvSVNPU3RyaW5nKCksXG4gICAgfSkpO1xuICB9XG5cbiAgLy8g7Yq57KCVIO2CpCDsgq3soJztlZjquLBcbiAgZGVsKGtleTogc3RyaW5nKSB7XG4gICAgY29uc3QgY29udGV4dCA9IFNvbmFtdS5nZXRDb250ZXh0KCk7XG4gICAgaWYgKCFjb250ZXh0Py5uYWl0ZVN0b3JlKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnRleHQubmFpdGVTdG9yZS5kZWxldGUoa2V5KTtcbiAgfVxuXG4gIGNyZWF0ZVN0b3JlKCk6IE5haXRlU3RvcmUge1xuICAgIHJldHVybiBuZXcgTWFwPHN0cmluZywgTmFpdGVUcmFjZVtdPigpO1xuICB9XG59XG5cbmV4cG9ydCBjb25zdCBOYWl0ZSA9IG5ldyBOYWl0ZUNsYXNzKCk7XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7QUE0Q0EsU0FBUyxtQkFBaUM7Q0FDeEMsTUFBTSx5QkFBUSxJQUFJLE1BQU0sRUFBQyxDQUFDO0NBQzFCLElBQUksQ0FBQyxPQUFPLE9BQU8sQ0FBQztDQVNwQixNQUFNLFNBUFEsTUFBTSxNQUFNLElBT1gsQ0FBQSxDQUNaLE1BQU0sQ0FBQyxDQUFDLENBQ1IsSUFBSSxlQUFl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
227
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmFpdGUuanMiLCJuYW1lcyI6W10sInNvdXJjZXMiOlsiLi4vLi4vc3JjL25haXRlL25haXRlLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGdldExvZ2dlciB9IGZyb20gXCJAbG9ndGFwZS9sb2d0YXBlXCI7XG5pbXBvcnQgeyBnZXQgfSBmcm9tIFwicmFkYXNoaVwiO1xuXG5pbXBvcnQgeyBTb25hbXUgfSBmcm9tIFwiLi4vYXBpL3NvbmFtdVwiO1xuaW1wb3J0IHsgdHlwZSBDb21wYXJpc29uT3BlcmF0b3IgfSBmcm9tIFwiLi4vZGF0YWJhc2UvcHVyaS50eXBlc1wiO1xuaW1wb3J0IHsgY29udmVydE5haXRlS2V5VG9DYXRlZ29yeSB9IGZyb20gXCIuLi9sb2dnZXIvY2F0ZWdvcnlcIjtcbmltcG9ydCB7IGlzU2VyaWFsaXphYmxlIH0gZnJvbSBcIi4uL3V0aWxzL29iamVjdC11dGlsc1wiO1xuaW1wb3J0IHsgaXNOdW1iZXJWYWx1ZSwgaXNTdHJpbmdWYWx1ZSB9IGZyb20gXCIuLi91dGlscy9ydW50aW1lLXZhbHVlXCI7XG5cbi8vIFN0YWNrRnJhbWUg7YOA7J6FXG5pbnRlcmZhY2UgU3RhY2tGcmFtZSB7XG4gIGZ1bmN0aW9uTmFtZTogc3RyaW5nIHwgbnVsbDtcbiAgZmlsZVBhdGg6IHN0cmluZzsgLy8gXCIvVXNlcnMvLi4uL3N5bmNlci50c1wiIOuYkOuKlCBcIm5vZGU6aW50ZXJuYWwvLi4uXCJcbiAgbGluZU51bWJlcjogbnVtYmVyOyAvLyBUUyDtjIzsnbwg6riw7KSAIOudvOyduCDrsojtmLhcbn1cblxuLy8gTmFpdGVUcmFjZSDtg4DsnoVcbmludGVyZmFjZSBOYWl0ZVRyYWNlIHtcbiAga2V5OiBzdHJpbmc7XG4gIGRhdGE6IE5haXRlRGF0YTtcbiAgc3RhY2s6IFN0YWNrRnJhbWVbXTsgLy8g7L2c7Iqk7YOdIOygleuztFxuICBhdDogRGF0ZTtcbn1cblxuLy8gTmFpdGXripQg7KeB66Cs7ZmUIOqwgOuKpeyEsSDqsoDsgqzrpbwg64K067O064K06riwIOyLnOygkOyXkCDsiJjtlontlZjrr4DroZwg66qo65OgIEphdmFTY3JpcHQg6rCS7J2EIOq4sOuhne2VoCDsiJgg7J6I7Iq164uI64ukLlxuZXhwb3J0IHR5cGUgTmFpdGVEYXRhID0gbnVsbCB8IHVuZGVmaW5lZCB8IGJpZ2ludCB8IGJvb2xlYW4gfCBudW1iZXIgfCBvYmplY3QgfCBzdHJpbmcgfCBzeW1ib2w7XG5cbmV4cG9ydCBpbnRlcmZhY2UgTmFpdGVFdmVudFJlZ2lzdHJ5IHtcbiAgYWN0aW9uR2VuZXJhdGVTZXJ2aWNlczogcmVhZG9ubHkgb2JqZWN0W107XG4gIFwiZnMvcHJvbWlzZXM6cm1cIjoge1xuICAgIHBhdGg6IHN0cmluZztcbiAgICBvcHRpb25zPzogb2JqZWN0O1xuICB9O1xuICBcImZzL3Byb21pc2VzOndyaXRlRmlsZVwiOiB7XG4gICAgcGF0aDogc3RyaW5nO1xuICAgIGRhdGE6IHN0cmluZztcbiAgfTtcbiAgXCJwdXJpOmV4ZWN1dGVkLXF1ZXJ5XCI6IHN0cmluZztcbiAgXCJwdXJpOnViLWJhdGNoLXVwZGF0ZWRcIjoge1xuICAgIHRhYmxlTmFtZTogc3RyaW5nO1xuICAgIHJvd0NvdW50OiBudW1iZXI7XG4gICAgd2hlcmVDb2x1bW5zOiBzdHJpbmdbXTtcbiAgfTtcbiAgXCJwdXJpOnViLWNsZWFuLW9ycGhhbnNcIjoge1xuICAgIHRhYmxlTmFtZTogc3RyaW5nO1xuICAgIGNsZWFuT3JwaGFuczogc3RyaW5nW107XG4gICAgZGVsZXRlZENvdW50OiBudW1iZXI7XG4gIH07XG4gIFwicHVyaTp1Yi1pbmhlcml0XCI6IHtcbiAgICB0YWJsZU5hbWU6IHN0cmluZztcbiAgICBpbmhlcml0Q29sdW1uczogc3RyaW5nW107XG4gICAgZXhjbHVkZWRGcm9tVXBkYXRlOiBzdHJpbmdbXTtcbiAgfTtcbiAgXCJwdXJpOnViLXJlZi1yZXNvbHZlZFwiOiB7XG4gICAgdGFibGVOYW1lOiBzdHJpbmc7XG4gICAgZmllbGQ6IHN0cmluZztcbiAgICBmcm9tOiBVQlJlZmVyZW5jZTtcbiAgICB0bzogTmFpdGVEYXRhO1xuICB9O1xuICBcInB1cmk6dWItcmVnaXN0ZXJcIjoge1xuICAgIHRhYmxlTmFtZTogc3RyaW5nO1xuICAgIHV1aWQ6IHN0cmluZztcbiAgICBpc1V1aWRSZXVzZWQ6IGJvb2xlYW47XG4gICAgcm93OiBvYmplY3QgJiB7IHVzZXJfaWQ6IFVCUmVmZXJlbmNlIH07XG4gIH07XG4gIFwicHVyaTp1Yi11cHNlcnRlZFwiOiB7XG4gICAgdGFibGVOYW1lOiBzdHJpbmc7XG4gICAgbW9kZTogXCJpbnNlcnRcIiB8IFwidXBzZXJ0XCI7XG4gICAgcm93Q291bnQ6IG51bWJlcjtcbiAgICByZXR1cm5lZElkczogQXJyYXk8bnVtYmVyIHwgc3RyaW5nPjtcbiAgfTtcbn1cblxuaW50ZXJmYWNlIFVCUmVmZXJlbmNlIHtcbiAgdXVpZDogc3RyaW5nO1xuICBvZjogc3RyaW5nO1xuICB1c2U/OiBzdHJpbmc7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgTmFpdGVSZXN1bHQ8UGF5bG9hZD4gZXh0ZW5kcyBBcnJheTxQYXlsb2FkPiB7XG4gIDA6IFBheWxvYWQ7XG4gIDE6IFBheWxvYWQ7XG4gIFtpbmRleDogbnVtYmVyXTogUGF5bG9hZDtcbiAgZmluZDxNYXRjaCBleHRlbmRzIFBheWxvYWQ+KFxuICAgIHByZWRpY2F0ZTogKHZhbHVlOiBQYXlsb2FkLCBpbmRleDogbnVtYmVyLCB2YWx1ZXM6IFBheWxvYWRbXSkgPT4gdmFsdWUgaXMgTWF0Y2gsXG4gICk6IE1hdGNoO1xuICBmaW5kKHByZWRpY2F0ZTogKHZhbHVlOiBQYXlsb2FkLCBpbmRleDogbnVtYmVyLCB2YWx1ZXM6IFBheWxvYWRbXSkgPT4gYm9vbGVhbik6IFBheWxvYWQ7XG59XG5cbnR5cGUgTmFpdGVWYWx1ZXNCeUtleSA9IFJlY29yZDxzdHJpbmcsIE5haXRlVHJhY2VbXSB8IEFycmF5PE5haXRlVHJhY2VbXCJkYXRhXCJdPj47XG5cbi8vIE5haXRlLnTqsIAg7KCA7J6l65CY64qUIO2DgOyehSAo7ZWt7IOBIOuwsOyXtOuhnCDthrXsnbwpXG5leHBvcnQgdHlwZSBOYWl0ZVN0b3JlID0gTWFwPHN0cmluZywgTmFpdGVUcmFjZVtdPjtcblxuLy8gZ2V0QWxsVHJhY2VzKCnqsIAg67CY7ZmY7ZWY64qUIOyngeugrO2ZlOuQnCB0cmFjZSDtg4DsnoVcbi8vIGJvb3RzdHJhcC50c+ydmCBUYXNrTWV0YSBhdWdtZW50YXRpb24sIGRldi12aXRlc3QtbWFuYWdlci50c+yXkOyEnOuPhCDsnbQg7YOA7J6F7J2EIOqzteycoO2VqeuLiOuLpC5cbmV4cG9ydCB0eXBlIFNlcmlhbGl6ZWRUcmFjZSA9IHtcbiAga2V5OiBzdHJpbmc7XG4gIHZhbHVlOiB1bmtub3duO1xuICBmaWxlUGF0aDogc3RyaW5nO1xuICBsaW5lTnVtYmVyOiBudW1iZXI7XG4gIGF0OiBzdHJpbmc7XG59O1xuXG4vKipcbiAqIOy9nOyKpO2DneydhCDtjIzsi7HtlZjsl6wgU3RhY2tGcmFtZSDrsLDsl7TroZwg67CY7ZmYXG4gKiAtIGV4dHJhY3RDYWxsU3RhY2sg7J6Q7Iug6rO8IE5haXRlLnTripQg7KCc7Jm4XG4gKiAtIHJ1bldpdGhDb250ZXh0L3J1bldpdGhNb2NrQ29udGV4dCDrsJzqsqwg7IucIOqxsOq4sOyEnCDsooXro4xcbiAqIC0gbm9kZTog64K067aAIOqyveuhnOuKlCDtj6ztlajtlZjrkJgsIGxpbmVOdW1iZXLripQgcGF0aOyXkCA6IO2PrO2VqCDsi5wg67aZ7J207KeAIOyViuydjFxuICovXG5mdW5jdGlvbiBleHRyYWN0Q2FsbFN0YWNrKCk6IFN0YWNrRnJhbWVbXSB7XG4gIGNvbnN0IHN0YWNrID0gbmV3IEVycm9yKCkuc3RhY2s7XG4gIGlmICghc3RhY2spIHJldHVybiBbXTtcblxuICBjb25zdCBsaW5lcyA9IHN0YWNrLnNwbGl0KFwiXFxuXCIpO1xuXG4gIC8vIOy9nOyKpO2DnSDqtazsobA6XG4gIC8vIFswXTogXCJFcnJvclwiXG4gIC8vIFsxXTogXCJhdCBleHRyYWN0Q2FsbFN0YWNrXCJcbiAgLy8gWzJdOiBcImF0IE5haXRlLnRcIlxuICAvLyBbM106IOyLpOygnCDtmLjstpwg7JyE7LmY67aA7YSwIOyLnOyekVxuICBjb25zdCBmcmFtZXMgPSBsaW5lc1xuICAgIC5zbGljZSgzKVxuICAgIC5tYXAocGFyc2VTdGFja0ZyYW1lKVxuICAgIC5maWx0ZXIoKGZyYW1lKTogZnJhbWUgaXMgU3RhY2tGcmFtZSA9PiBmcmFtZSAhPT0gbnVsbCk7XG5cbiAgLy8gcnVuV2l0aENvbnRleHQg6rOE7Je0IO2VqOyImCDrsJzqsqwg7IucIOqxsOq4sOyEnCDsnpDrpbTquLBcbiAgY29uc3QgY29udGV4dEluZGV4ID0gZnJhbWVzLmZpbmRJbmRleChcbiAgICAoZikgPT5cbiAgICAgIGYuZnVuY3Rpb25OYW1lPy5pbmNsdWRlcyhcInJ1bldpdGhDb250ZXh0XCIpIHx8IGYuZnVuY3Rpb25OYW1lPy5pbmNsdWRlcyhcInJ1bldpdGhNb2NrQ29udGV4dFwiKSxcbiAgKTtcblxuICByZXR1cm4gY29udGV4dEluZGV4ID49IDAgPyBmcmFtZXMuc2xpY2UoMCwgY29udGV4dEluZGV4ICsgMSkgOiBmcmFtZXM7XG59XG5cbi8qKlxuICog7L2c7Iqk7YOdIO2VnCDspITsnYQg7YyM7IuxXG4gKiDtmJXsi50xOiBcImF0IEZ1bmN0aW9uTmFtZSAoZmlsZVBhdGg6bGluZU51bWJlcjpjb2x1bW5OdW1iZXIpXCJcbiAqIO2YleyLnTI6IFwiYXQgZmlsZVBhdGg6bGluZU51bWJlcjpjb2x1bW5OdW1iZXJcIiAo7J2166qFIO2VqOyImC/rqqjrk4gg66CI67KoKVxuICovXG5mdW5jdGlvbiBwYXJzZVN0YWNrRnJhbWUobGluZTogc3RyaW5nKTogU3RhY2tGcmFtZSB8IG51bGwge1xuICAvLyDtjKjthLQxOiBcImF0IEZ1bmN0aW9uTmFtZSAoZmlsZVBhdGg6bGluZU51bWJlcjpjb2x1bW5OdW1iZXIpXCJcbiAgY29uc3QgbWF0Y2hXaXRoRnVuYyA9IGxpbmUubWF0Y2goL2F0XFxzKyguKz8pXFxzK1xcKCguKz8pOihcXGQrKTpcXGQrXFwpLyk7XG4gIGlmIChtYXRjaFdpdGhGdW5jKSB7XG4gICAgY29uc3QgZnVuY3Rpb25OYW1lID0gbWF0Y2hXaXRoRnVuY1sxXTtcbiAgICBjb25zdCBmaWxlUGF0aCA9IG1hdGNoV2l0aEZ1bmNbMl07XG4gICAgY29uc3QgbGluZU51bWJlclN0ciA9IG1hdGNoV2l0aEZ1bmNbM107XG5cbiAgICAvLyBmaWxlUGF0aOyXkCDsnbTrr7ggOuqwgCDtj6ztlajrkJjslrQg7J6I7Jy866m0ICjsmIg6IFwibm9kZTppbnRlcm5hbC8uLi5cIilcbiAgICBpZiAoZmlsZVBhdGguaW5jbHVkZXMoXCI6XCIpKSB7XG4gICAgICByZXR1cm4geyBmdW5jdGlvbk5hbWUsIGZpbGVQYXRoLCBsaW5lTnVtYmVyOiAwIH07XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIGZ1bmN0aW9uTmFtZSxcbiAgICAgIGZpbGVQYXRoLFxuICAgICAgbGluZU51bWJlcjogTnVtYmVyLnBhcnNlSW50KGxpbmVOdW1iZXJTdHIsIDEwKSxcbiAgICB9O1xuICB9XG5cbiAgLy8g7Yyo7YS0MjogXCJhdCBmaWxlUGF0aDpsaW5lTnVtYmVyOmNvbHVtbk51bWJlclwiICjtlajsiJjrqoUg7JeG7J2MKVxuICBjb25zdCBtYXRjaE5vRnVuYyA9IGxpbmUubWF0Y2goL2F0XFxzKyguKz8pOihcXGQrKTpcXGQrJC8pO1xuICBpZiAobWF0Y2hOb0Z1bmMpIHtcbiAgICBjb25zdCBmaWxlUGF0aCA9IG1hdGNoTm9GdW5jWzFdO1xuICAgIGNvbnN0IGxpbmVOdW1iZXJTdHIgPSBtYXRjaE5vRnVuY1syXTtcblxuICAgIHJldHVybiB7XG4gICAgICBmdW5jdGlvbk5hbWU6IG51bGwsXG4gICAgICBmaWxlUGF0aCxcbiAgICAgIGxpbmVOdW1iZXI6IE51bWJlci5wYXJzZUludChsaW5lTnVtYmVyU3RyLCAxMCksXG4gICAgfTtcbiAgfVxuXG4gIHJldHVybiBudWxsO1xufVxuXG4vKipcbiAqIHdpbGRjYXJkIO2MqO2EtCDrp6Tsua1cbiAqIOyYiOyLnDpcbiAqIC0gXCJzeW5jZXI6KlwiIOKGkiBcInN5bmNlcjphXCIsIFwic3luY2VyOmE6YlwiIOuqqOuRkCDrp6Tsua1cbiAqIC0gXCJzeW5jZXI6Kjp1c2VyXCIg4oaSIFwic3luY2VyOnJlbmRlclRlbXBsYXRlOnVzZXJcIiDrp6Tsua1cbiAqIC0gXCJzeW5jZXI6cmVuZGVyVGVtcGxhdGU6KlwiIOKGkiBcInN5bmNlcjpyZW5kZXJUZW1wbGF0ZTpzZXJ2aWNlXCIg66ek7LmtXG4gKi9cbmZ1bmN0aW9uIG1hdGNoZXNQYXR0ZXJuKGtleTogc3RyaW5nLCBwYXR0ZXJuOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgY29uc3Qga2V5UGFydHMgPSBrZXkuc3BsaXQoXCI6XCIpO1xuICBjb25zdCBwYXR0ZXJuUGFydHMgPSBwYXR0ZXJuLnNwbGl0KFwiOlwiKTtcblxuICAvLyDrp4jsp4Drp4nsnbQgKiDihpIgcHJlZml4IOunpOy5rSAo6ri47J20IOustOq0gClcbiAgLy8g7JiIOiBcInN5bmNlcjoqXCLripQgXCJzeW5jZXI6YVwiLCBcInN5bmNlcjphOmJcIiDrqqjrkZAg66ek7LmtXG4gIGlmIChwYXR0ZXJuUGFydHNbcGF0dGVyblBhcnRzLmxlbmd0aCAtIDFdID09PSBcIipcIikge1xuICAgIGNvbnN0IHByZWZpeFBhcnRzID0gcGF0dGVyblBhcnRzLnNsaWNlKDAsIC0xKTtcbiAgICAvLyBwcmVmaXjqsIAg66qo65GQIOydvOy5mO2VmOuKlOyngCDtmZXsnbhcbiAgICByZXR1cm4gcHJlZml4UGFydHMuZXZlcnkoKHBhcnQsIGkpID0+IHBhcnQgPT09IGtleVBhcnRzW2ldKTtcbiAgfVxuXG4gIC8vIOq4uOydtOqwgCDqsJnslYTslbwg7ZWoXG4gIGlmIChwYXR0ZXJuUGFydHMubGVuZ3RoICE9PSBrZXlQYXJ0cy5sZW5ndGgpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICAvLyDqsIEg7YyM7Yq46rCAICog65iQ64qUIOygle2Zle2eiCDsnbzsuZhcbiAgcmV0dXJuIHBhdHRlcm5QYXJ0cy5ldmVyeSgocGFydCwgaSkgPT4gcGFydCA9PT0gXCIqXCIgfHwgcGFydCA9PT0ga2V5UGFydHNbaV0pO1xufVxuXG4vKipcbiAqIE5haXRlUXVlcnkg7YG0656Y7IqkXG4gKiDssrTsnbTri53snYQg7Ya17ZWcIHRyYWNlIO2VhO2EsOungSDrsI8g7KGw7ZqMXG4gKi9cbmV4cG9ydCBjbGFzcyBOYWl0ZVF1ZXJ5PFBheWxvYWQgZXh0ZW5kcyBOYWl0ZURhdGEgPSBOYWl0ZURhdGE+IHtcbiAgY29uc3RydWN0b3IocHJpdmF0ZSB0cmFjZXM6IE5haXRlVHJhY2VbXSkge31cblxuICBwcml2YXRlIGlzQ29tcGFyYWJsZVZhbHVlPFZhbHVlPih2YWx1ZTogVmFsdWUpOiB2YWx1ZSBpcyBWYWx1ZSAmIChudW1iZXIgfCBzdHJpbmcpIHtcbiAgICByZXR1cm4gaXNOdW1iZXJWYWx1ZSh2YWx1ZSkgfHwgaXNTdHJpbmdWYWx1ZSh2YWx1ZSk7XG4gIH1cblxuICAvKipcbiAgICog7YyM7J2866qF7Jy866GcIO2VhO2EsOungVxuICAgKiBAcGFyYW0gZmlsZU5hbWUg7YyM7J2866qFICjsmIg6IFwic3luY2VyLnRlc3QudHNcIilcbiAgICovXG4gIGZyb21GaWxlKGZpbGVOYW1lOiBzdHJpbmcpOiBOYWl0ZVF1ZXJ5PFBheWxvYWQ+IHtcbiAgICBjb25zdCBmaWx0ZXJlZCA9IHRoaXMudHJhY2VzLmZpbHRlcigodCkgPT5cbiAgICAgIHQuc3RhY2suc29tZSgoZnJhbWUpID0+IGZyYW1lLmZpbGVQYXRoLmVuZHNXaXRoKGAvJHtmaWxlTmFtZX1gKSksXG4gICAgKTtcbiAgICByZXR1cm4gbmV3IE5haXRlUXVlcnk8UGF5bG9hZD4oZmlsdGVyZWQpO1xuICB9XG5cbiAgLyoqXG4gICAqIO2VqOyImOuqheycvOuhnCDtlYTthLDrp4FcbiAgICogQHBhcmFtIGZ1bmNOYW1lIO2VqOyImOuqhSAoaW5jbHVkZXMg7LK07YGsKVxuICAgKiBAcGFyYW0gb3B0aW9ucy5mcm9tICdkaXJlY3QnID0g7KeB7KCRIO2YuOy2nOunjCwgJ2luZGlyZWN0JyA9IOqwhOygkSDtmLjstpzrp4wsICdib3RoJyA9IOuqqOuRkFxuICAgKi9cbiAgZnJvbUZ1bmN0aW9uKFxuICAgIGZ1bmNOYW1lOiBzdHJpbmcsXG4gICAgb3B0aW9uczogeyBmcm9tOiBcImRpcmVjdFwiIHwgXCJpbmRpcmVjdFwiIHwgXCJib3RoXCIgfSA9IHsgZnJvbTogXCJib3RoXCIgfSxcbiAgKTogTmFpdGVRdWVyeTxQYXlsb2FkPiB7XG4gICAgY29uc3QgZmlsdGVyZWQgPSB0aGlzLnRyYWNlcy5maWx0ZXIoKHQpID0+IHtcbiAgICAgIGlmIChvcHRpb25zLmZyb20gPT09IFwiZGlyZWN0XCIpIHtcbiAgICAgICAgLy8gc3RhY2tbMF3rp4wg7ZmV7J24ICjsp4HsoJEg7Zi47LacKVxuICAgICAgICByZXR1cm4gdC5zdGFja1swXT8uZnVuY3Rpb25OYW1lPy5pbmNsdWRlcyhmdW5jTmFtZSk7XG4gICAgICB9XG4gICAgICBpZiAob3B0aW9ucy5mcm9tID09PSBcImluZGlyZWN0XCIpIHtcbiAgICAgICAgLy8gc3RhY2tbMStd7JeQ7IScIO2ZleyduCAo6rCE7KCRIO2YuOy2nClcbiAgICAgICAgcmV0dXJuIHQuc3RhY2suc2xpY2UoMSkuc29tZSgoZikgPT4gZi5mdW5jdGlvbk5hbWU/LmluY2x1ZGVzKGZ1bmNOYW1lKSk7XG4gICAgICB9XG4gICAgICAvLyDsoITssrQg7Iqk7YOd7JeQ7IScIO2ZleyduFxuICAgICAgcmV0dXJuIHQuc3RhY2suc29tZSgoZikgPT4gZi5mdW5jdGlvbk5hbWU/LmluY2x1ZGVzKGZ1bmNOYW1lKSk7XG4gICAgfSk7XG4gICAgcmV0dXJuIG5ldyBOYWl0ZVF1ZXJ5PFBheWxvYWQ+KGZpbHRlcmVkKTtcbiAgfVxuXG4gIC8qKlxuICAgKiDrjbDsnbTthLAg6rK966GcIOq4sOuwmCDtlYTthLDrp4FcbiAgICogQHBhcmFtIHBhdGggcmFkYXNoIGdldCDqsr3roZwgKOyYiDogXCJkYXRhLnVzZXJJZFwiKVxuICAgKiBAcGFyYW0gb3BlcmF0b3Ig67mE6rWQIOyXsOyCsOyekFxuICAgKiBAcGFyYW0gdmFsdWUg67mE6rWQ6rCSXG4gICAqL1xuICB3aGVyZTxWYWx1ZSBleHRlbmRzIE5haXRlRGF0YT4oXG4gICAgcGF0aDogc3RyaW5nLFxuICAgIG9wZXJhdG9yOiBDb21wYXJpc29uT3BlcmF0b3IgfCBcImluY2x1ZGVzXCIsXG4gICAgdmFsdWU6IFZhbHVlLFxuICApOiBOYWl0ZVF1ZXJ5PFBheWxvYWQ+IHtcbiAgICBjb25zdCBmaWx0ZXJlZCA9IHRoaXMudHJhY2VzLmZpbHRlcigodHJhY2UpID0+IHtcbiAgICAgIGNvbnN0IGFjdHVhbCA9IGdldCh0cmFjZSwgcGF0aCk7XG5cbiAgICAgIHN3aXRjaCAob3BlcmF0b3IpIHtcbiAgICAgICAgY2FzZSBcIj5cIjpcbiAgICAgICAgICByZXR1cm4gdGhpcy5pc0NvbXBhcmFibGVWYWx1ZShhY3R1YWwpICYmIHRoaXMuaXNDb21wYXJhYmxlVmFsdWUodmFsdWUpICYmIGFjdHVhbCA+IHZhbHVlO1xuICAgICAgICBjYXNlIFwiPFwiOlxuICAgICAgICAgIHJldHVybiB0aGlzLmlzQ29tcGFyYWJsZVZhbHVlKGFjdHVhbCkgJiYgdGhpcy5pc0NvbXBhcmFibGVWYWx1ZSh2YWx1ZSkgJiYgYWN0dWFsIDwgdmFsdWU7XG4gICAgICAgIGNhc2UgXCI+PVwiOlxuICAgICAgICAgIHJldHVybiB0aGlzLmlzQ29tcGFyYWJsZVZhbHVlKGFjdHVhbCkgJiYgdGhpcy5pc0NvbXBhcmFibGVWYWx1ZSh2YWx1ZSkgJiYgYWN0dWFsID49IHZhbHVlO1xuICAgICAgICBjYXNlIFwiPD1cIjpcbiAgICAgICAgICByZXR1cm4gdGhpcy5pc0NvbXBhcmFibGVWYWx1ZShhY3R1YWwpICYmIHRoaXMuaXNDb21wYXJhYmxlVmFsdWUodmFsdWUpICYmIGFjdHVhbCA8PSB2YWx1ZTtcbiAgICAgICAgY2FzZSBcIj1cIjpcbiAgICAgICAgICByZXR1cm4gYWN0dWFsID09PSB2YWx1ZTtcbiAgICAgICAgY2FzZSBcIiE9XCI6XG4gICAgICAgICAgcmV0dXJuIGFjdHVhbCAhPT0gdmFsdWU7XG4gICAgICAgIGNhc2UgXCJpbmNsdWRlc1wiOlxuICAgICAgICAgIHJldHVybiBpc1N0cmluZ1ZhbHVlKGFjdHVhbCkgJiYgaXNTdHJpbmdWYWx1ZSh2YWx1ZSkgJiYgYWN0dWFsLmluY2x1ZGVzKHZhbHVlKTtcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgfSk7XG4gICAgcmV0dXJuIG5ldyBOYWl0ZVF1ZXJ5PFBheWxvYWQ+KGZpbHRlcmVkKTtcbiAgfVxuXG4gIC8qKlxuICAgKiDsoITssrQg642w7J207YSwIOuwsOyXtCDrsJjtmZhcbiAgICovXG4gIHJlc3VsdCgpOiBOYWl0ZVJlc3VsdDxQYXlsb2FkPjtcbiAgcmVzdWx0KCk6IE5haXRlRGF0YVtdIHtcbiAgICByZXR1cm4gdGhpcy50cmFjZXMubWFwKCh0KSA9PiB0LmRhdGEpO1xuICB9XG5cbiAgLyoqXG4gICAqIOyyqyDrsojsp7gg642w7J207YSwIOuwmO2ZmFxuICAgKi9cbiAgZmlyc3QoKTogUGF5bG9hZDtcbiAgZmlyc3QoKTogTmFpdGVEYXRhIHtcbiAgICByZXR1cm4gdGhpcy50cmFjZXNbMF0/LmRhdGE7XG4gIH1cblxuICAvKipcbiAgICog66eI7KeA66eJIOuNsOydtO2EsCDrsJjtmZhcbiAgICovXG4gIGxhc3QoKTogUGF5bG9hZDtcbiAgbGFzdCgpOiBOYWl0ZURhdGEge1xuICAgIHJldHVybiB0aGlzLnRyYWNlc1t0aGlzLnRyYWNlcy5sZW5ndGggLSAxXT8uZGF0YTtcbiAgfVxuXG4gIC8qKlxuICAgKiBu67KI7Ke4IOuNsOydtO2EsCDrsJjtmZhcbiAgICovXG4gIGF0KGluZGV4OiBudW1iZXIpOiBQYXlsb2FkO1xuICBhdChpbmRleDogbnVtYmVyKTogTmFpdGVEYXRhIHtcbiAgICByZXR1cm4gdGhpcy50cmFjZXNbaW5kZXhdPy5kYXRhO1xuICB9XG5cbiAgLyoqXG4gICAqIOybkOuzuCB0cmFjZSDrsLDsl7Qg67CY7ZmYICjrlJTrsoTquYUvTmFpdGVWaWV3ZXLsmqkpXG4gICAqL1xuICBnZXRUcmFjZXMoKTogTmFpdGVUcmFjZVtdIHtcbiAgICByZXR1cm4gdGhpcy50cmFjZXM7XG4gIH1cbn1cblxuLy8gTmFpdGUg7Iux6riA7YS0IOqwneyytCAo7LaU7ZuEIGxvZ2dlciDsl7DqsrAg65Ox7J2YIOyDge2DnCDqtIDrpqwg7ZWE7JqU7ISxIOqzoOugpClcbmV4cG9ydCBjbGFzcyBOYWl0ZUNsYXNzIHtcbiAgLy8g7YWM7Iqk7Yq4IOuhnOq3uCDquLDroZ1cbiAgdDxWYWx1ZSBleHRlbmRzIE5haXRlRGF0YT4obmFtZTogc3RyaW5nLCB2YWx1ZTogVmFsdWUpIHtcbiAgICAvLyDsnbQgdCDtlajsiJjripQg7YWM7Iqk7Yq4IO2ZmOqyveyXkOyEnOunjCDsnpHrj5ntlbTslbwg7ZWp64uI64ukLlxuICAgIC8vIOq3uOumrOqzoCDthYzsiqTtirgg7ZmY6rK9IO2MkOuLqOyXkCDsmZwgaXNUZXN0KCkg7ZWo7IiY66W8IOyCrOyaqe2VmOyngCDslYrslZjrg5DrqbTsmpQsLFxuICAgIC8vIOydtOugh+qyjCDtlZjripTqsowg7Jyg7Yu4IO2VqOyImCDrtojrn6zsmYDshJwg7IKs7Jqp7ZWY64qUIOqyg+uztOuLpCDsobDquIjsnbTrgpjrp4gg67mg66W8IOqygyDqsJnslZjquLAg65WM66y47J6F64uI64ukLlxuICAgIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJ0ZXN0XCIpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0cnkge1xuICAgICAgY29uc3QgY29udGV4dCA9IFNvbmFtdS5nZXRDb250ZXh0KCk7XG4gICAgICBjb25zdCBzdG9yZSA9IGNvbnRleHQ/Lm5haXRlU3RvcmU7XG5cbiAgICAgIGlmICghc3RvcmUpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICAvLyDsvZzsiqTtg50g7IiY7KeRXG4gICAgICBjb25zdCBzdGFjayA9IGV4dHJhY3RDYWxsU3RhY2soKTtcblxuICAgICAgY29uc3QgdHJhY2U6IE5haXRlVHJhY2UgPSB7XG4gICAgICAgIGtleTogbmFtZSxcbiAgICAgICAgZGF0YTogdmFsdWUsXG4gICAgICAgIHN0YWNrLFxuICAgICAgICBhdDogbmV3IERhdGUoKSxcbiAgICAgIH07XG5cbiAgICAgIC8vIO2VreyDgSDrsLDsl7TroZwg6rSA66asXG4gICAgICBjb25zdCBleGlzdGluZyA9IHN0b3JlLmdldChuYW1lKSA/PyBbXTtcbiAgICAgIGdldExvZ2dlcihbXCJuYWl0ZVwiLCAuLi5jb252ZXJ0TmFpdGVLZXlUb0NhdGVnb3J5KG5hbWUpXSkuZGVidWcoXG4gICAgICAgIGBuYWl0ZToge25hbWV9ICR7ZXhpc3RpbmcubGVuZ3RoID09PSAwID8gXCJpcyBlbXB0eSBzdGF0ZVwiIDogYGFscmVhZHkgZXhpc3Rpbmcgd2l0aCAke2V4aXN0aW5nLmxlbmd0aH0gZW50cmllc2B9LCBhcHBlbmRpbmcgbmV3IGVudHJ5YCxcbiAgICAgICAge1xuICAgICAgICAgIG5hbWUsXG4gICAgICAgICAgdmFsdWUsXG4gICAgICAgIH0sXG4gICAgICApO1xuXG4gICAgICBzdG9yZS5zZXQobmFtZSwgWy4uLmV4aXN0aW5nLCB0cmFjZV0pO1xuICAgIH0gY2F0Y2gge1xuICAgICAgLy8gQ29udGV4dCDsl4bripQg7IOB7Zmp7JeQ7IScIE5haXRlLnQg7Zi47LacXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIGtleSDrmJDripQgd2lsZGNhcmQg7Yyo7YS07Jy866GcIHRyYWNlIOyhsO2ajFxuICAgKiDtla3sg4EgTmFpdGVRdWVyeSDrsJjtmZjtlZjsl6wg7LK07J2064udIOqwgOuKpVxuICAgKi9cbiAgZ2V0PEtleSBleHRlbmRzIGtleW9mIE5haXRlRXZlbnRSZWdpc3RyeT4oa2V5UGF0dGVybjogS2V5KTogTmFpdGVRdWVyeTxOYWl0ZUV2ZW50UmVnaXN0cnlbS2V5XT47XG4gIGdldChrZXlQYXR0ZXJuOiBzdHJpbmcpOiBOYWl0ZVF1ZXJ5O1xuICBnZXQoa2V5UGF0dGVybjogc3RyaW5nKTogTmFpdGVRdWVyeSB7XG4gICAgY29uc3QgY29udGV4dCA9IFNvbmFtdS5nZXRDb250ZXh0KCk7XG4gICAgY29uc3Qgc3RvcmUgPSBjb250ZXh0Py5uYWl0ZVN0b3JlO1xuXG4gICAgaWYgKCFzdG9yZSkge1xuICAgICAgcmV0dXJuIG5ldyBOYWl0ZVF1ZXJ5KFtdKTtcbiAgICB9XG5cbiAgICAvLyB3aWxkY2FyZCDsl4bsnLzrqbQgZXhhY3QgbWF0Y2hcbiAgICBpZiAoIWtleVBhdHRlcm4uaW5jbHVkZXMoXCIqXCIpKSB7XG4gICAgICBjb25zdCB0cmFjZXMgPSBzdG9yZS5nZXQoa2V5UGF0dGVybikgPz8gW107XG4gICAgICByZXR1cm4gbmV3IE5haXRlUXVlcnkodHJhY2VzKTtcbiAgICB9XG5cbiAgICAvLyB3aWxkY2FyZCDtjKjthLQg66ek7LmtXG4gICAgY29uc3QgYWxsVHJhY2VzOiBOYWl0ZVRyYWNlW10gPSBbXTtcbiAgICBmb3IgKGNvbnN0IFtrZXksIHRyYWNlc10gb2Ygc3RvcmUuZW50cmllcygpKSB7XG4gICAgICBpZiAobWF0Y2hlc1BhdHRlcm4oa2V5LCBrZXlQYXR0ZXJuKSkge1xuICAgICAgICBhbGxUcmFjZXMucHVzaCguLi50cmFjZXMpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBuZXcgTmFpdGVRdWVyeShhbGxUcmFjZXMpO1xuICB9XG5cbiAgLy8g7KCE7LK0IOumrOyKpO2KuCDqsIDsoLjsmKTquLBcbiAgZ2V0QWxsKCkge1xuICAgIGNvbnN0IGNvbnRleHQgPSBTb25hbXUuZ2V0Q29udGV4dCgpO1xuICAgIGlmICghY29udGV4dD8ubmFpdGVTdG9yZSkge1xuICAgICAgcmV0dXJuIHt9O1xuICAgIH1cbiAgICAvLyBOYWl0ZVRyYWNlIOuwsOyXtOydhCBkYXRh66eMIOy2lOy2nO2VmOyXrCDrsJjtmZhcbiAgICBjb25zdCByZXN1bHQ6IE5haXRlVmFsdWVzQnlLZXkgPSB7fTtcbiAgICBmb3IgKGNvbnN0IFtrZXksIHRyYWNlc10gb2YgY29udGV4dC5uYWl0ZVN0b3JlLmVudHJpZXMoKSkge1xuICAgICAgaWYgKGtleS5zdGFydHNXaXRoKFwibW9jazpcIikpIHtcbiAgICAgICAgLy8gTW9jayDshKTsoJXsnYAg6re464yA66GcIOuwmO2ZmFxuICAgICAgICByZXN1bHRba2V5XSA9IHRyYWNlcztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIE5haXRlVHJhY2Ug67Cw7Je07J2AIGRhdGHrp4wg7LaU7LacXG4gICAgICAgIHJlc3VsdFtrZXldID0gdHJhY2VzLm1hcCgodDogTmFpdGVUcmFjZSkgPT4gdC5kYXRhKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIC8qKlxuICAgKiDsiqTthqDslrTsl5Ag65Ok7Ja07J6I642YIO2KuOugiOydtOyKpOulvCDqs6DrjIDroZwg6rq864K07Ji164uI64ukLlxuICAgKiDsnbTrlYwg6rCS65Ok7J2AIOuqqOuRkCDsp4HroKztmZQg6rCA64ql7ZWcIOyDge2DnOuhnCDrgpjqsIDqsowg65Cp64uI64ukLlxuICAgKiDthYzsiqTtirgg7KCV67O07JmAIO2VqOq7mCBleHRlbnNpb25z7JeQIOuztOuCvCDsmqnrj4TroZwg66eM65Ok7JeI7Iq164uI64ukLlxuICAgKiBAcmV0dXJuc1xuICAgKi9cbiAgZ2V0QWxsVHJhY2VzKCk6IFNlcmlhbGl6ZWRUcmFjZVtdIHtcbiAgICBjb25zdCBjb250ZXh0ID0gU29uYW11LmdldENvbnRleHQoKTtcbiAgICBpZiAoIWNvbnRleHQ/Lm5haXRlU3RvcmUpIHtcbiAgICAgIHJldHVybiBbXTtcbiAgICB9XG5cbiAgICBjb25zdCB0cmFjZXMgPSBBcnJheS5mcm9tKGNvbnRleHQubmFpdGVTdG9yZS52YWx1ZXMoKSkuZmxhdCgpO1xuXG4gICAgLy8g7KeB66Cs7ZmUIOu2iOqwgOuKpe2VnCDqsJLsnbQg7KG07J6s7ZWc64uk66m0IOydtOulvCDrjIDrrLjsp53rp4ztlZjqsowg7JWM66Ck7KSN64uI64ukISDqt7jsuZjrp4wg7JWM66as6riw66eMIO2VmOqzoCDqt7jrg6Ug7KeA64KY6rCR64uI64ukIOOFjuOFjlxuICAgIC8vIOyZnCDsp4HroKztmZTqsIAg7KSR7JqU7ZWc6rCAPyDsnbQoZ2V0QWxsVHJhY2VzKSDtmLjstpzsnZgg6rKw6rO864qUIOyZuOu2gOuhnCDrgpjqsIDqsowg65CY64qU642wLFxuICAgIC8vIOydtOuVjCDso7wg7Jqp64+E6rCAIHZpdGVzdOydmCB0YXNrLm1ldGEg7ZWE65Oc66W8IO2Gte2VtCBhZnRlckVhY2jsl5DshJwgU29uYW11IGV4dGVuc2lvbuycvOuhnCDsoITri6ztlZjripQg6rKD7J6F64uI64ukLlxuICAgIC8vIOyXrOq4sOyEnCBtZXRhIO2VhOuTnOyXkCDri7TquLQg64K07Jqp7J2AIO2UhOuhnOyEuOyKpOqwhCDthrXsi6AocHJvY2Vzcy5zZW5kKSDrmJDripQg7Iqk66CI65Oc6rCEIO2GteyLoChtZXNzYWdlIHBvcnQp7J2EIO2Gte2VtCDsoITri6zrkJjslrTslbwg7ZWY64qU642wLFxuICAgIC8vIOydtOuhnCDsnbjtlbQgXCLsp4HroKztmZQg6rCA64ql7ZWcIOqwkuuTpOunjCDtl4jsmqlcIu2VmOuKlCDsoJzslb3snbQg7IOd6rmB64uI64ukLlxuICAgIC8vXG4gICAgLy8g7J20IOygnOyVveydhCDsnZjsi53tlZjsl6wgTmFpdGUudOyXkCDsp4HroKztmZQg6rCA64ql7ZWcIOqwkuunjCDrhJjquLDqsowg7ZWgIOyImOuPhCDsnojsl4jsp4Drp4wsIOq3uOugh+qyjCDtlZjrqbQg67aI7Y647ZW07KeIIOqygyDqsJnslYTshJwg7ZWY7KeAIOyViuyVmOyKteuLiOuLpC5cbiAgICAvLyDrlLDrnbzshJwg7ZiE7J6sIE5haXRlLnTripQg66qo65OgIOqwkuydhCDrsJvsnYQg7IiYIOyeiOqyjCDrkJjslrQg7J6I7Iq164uI64ukLlxuICAgIC8vIOuMgOyLoCDsnbTroIfqsowoZ2V0QWxsVHJhY2VzKSDqt7gg6rCS65Ok7J2EIOu5vOuCvCDrlYwgSlNPTi5zdHJpbmdpZnnrpbwg7IKs7Jqp7ZWY7JesIOqwleygnOuhnCDsp4HroKztmZQg6rCA64ql7ZWY6rKMIOunjOuTpOyXiOyKteuLiOuLpCwsXG4gICAgZm9yIChjb25zdCB0cmFjZSBvZiB0cmFjZXMpIHtcbiAgICAgIGNvbnN0IGNoZWNrID0gaXNTZXJpYWxpemFibGUodHJhY2UuZGF0YSk7XG4gICAgICBpZiAoIWNoZWNrLnZhbGlkKSB7XG4gICAgICAgIGNvbnNvbGUud2FybihcbiAgICAgICAgICBcIlxcblwiICtcbiAgICAgICAgICAgIFwi4pWU4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWXXFxuXCIgK1xuICAgICAgICAgICAgXCLilZEgIFtOYWl0ZV0gTm9uLXNlcmlhbGl6YWJsZSB2YWx1ZSBkZXRlY3RlZCEgICAgICAgICAgICAgICAgICAgICAg4pWRXFxuXCIgK1xuICAgICAgICAgICAgXCLilaDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilaNcXG5cIiArXG4gICAgICAgICAgICBg4pWRICBLZXk6ICR7dHJhY2Uua2V5LnBhZEVuZCg1Nyl94pWRXFxuYCArXG4gICAgICAgICAgICBg4pWRICBSZWFzb246ICR7KGNoZWNrLnJlYXNvbiA/PyBcInVua25vd25cIikuc2xpY2UoMCwgNTQpLnBhZEVuZCg1NCl94pWRXFxuYCArXG4gICAgICAgICAgICBg4pWRICBMb2NhdGlvbjogJHsodHJhY2Uuc3RhY2tbMF0/LmZpbGVQYXRoID8/IFwidW5rbm93blwiKS5zbGljZSgtNTEpLnBhZEVuZCg1Mil94pWRXFxuYCArXG4gICAgICAgICAgICBg4pWRICBMaW5lOiAke1N0cmluZyh0cmFjZS5zdGFja1swXT8ubGluZU51bWJlciA/PyAwKS5wYWRFbmQoNTYpfeKVkVxcbmAgK1xuICAgICAgICAgICAgXCLilaDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilaNcXG5cIiArXG4gICAgICAgICAgICBcIuKVkSAgTmFpdGUudCgpIGFjY2VwdHMgYW55IHR5cGUgb2YgdmFsdWUuIEhvd2V2ZXIsIHZhbHVlcyB3aWxsICAgICDilZFcXG5cIiArXG4gICAgICAgICAgICBcIuKVkSAgYmUgc2VyaWFsaXplZCB0byBKU09OIHdoZW4gZXhwb3J0ZWQgdmlhIE5haXRlLmdldEFsbFRyYWNlcygpLiDilZFcXG5cIiArXG4gICAgICAgICAgICBcIuKVmuKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVnVxcblwiLFxuICAgICAgICApO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB0cmFjZXMubWFwKCh0cmFjZSkgPT4gKHtcbiAgICAgIGtleTogdHJhY2Uua2V5LFxuICAgICAgdmFsdWU6IEpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkodHJhY2UuZGF0YSA/PyBcIlwiKSksIC8vIOyngeugrO2ZlCDqsIDriqXtlZwg6rKD66eMIOuCqOq4sOugpOuKlCDriIjrrLzqsqjsmrQg64W466ClLCwg7JWI6re465+s66m0IHRhc2subWV0YeyXkCDrk6TslrTqsIDshJwg7ZSE66Gc7IS47Iqk6rCEIO2GteyLoCDtlaAg65WMIOusuOygnCDsg53quLDqsbDrk6DsmpQsLFxuICAgICAgZmlsZVBhdGg6IHRyYWNlLnN0YWNrWzBdPy5maWxlUGF0aCA/PyBcIlwiLFxuICAgICAgbGluZU51bWJlcjogdHJhY2Uuc3RhY2tbMF0/LmxpbmVOdW1iZXIgPz8gMCxcbiAgICAgIGF0OiB0cmFjZS5hdC50b0lTT1N0cmluZygpLFxuICAgIH0pKTtcbiAgfVxuXG4gIC8vIO2KueyglSDtgqQg7IKt7KCc7ZWY6riwXG4gIGRlbChrZXk6IHN0cmluZykge1xuICAgIGNvbnN0IGNvbnRleHQgPSBTb25hbXUuZ2V0Q29udGV4dCgpO1xuICAgIGlmICghY29udGV4dD8ubmFpdGVTdG9yZSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb250ZXh0Lm5haXRlU3RvcmUuZGVsZXRlKGtleSk7XG4gIH1cblxuICBjcmVhdGVTdG9yZSgpOiBOYWl0ZVN0b3JlIHtcbiAgICByZXR1cm4gbmV3IE1hcDxzdHJpbmcsIE5haXRlVHJhY2VbXT4oKTtcbiAgfVxufVxuXG5leHBvcnQgY29uc3QgTmFpdGUgPSBuZXcgTmFpdGVDbGFzcygpO1xuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7OztBQThHQSxTQUFTLG1CQUFpQztDQUN4QyxNQUFNLHlCQUFRLElBQUksTUFBTSxFQUFDLENBQUM7Q0FDMUIsSUFBSSxDQUFDLE9BQU8sT0FBTyxDQUFDO0NBU3BCLE1BQU0sU0FQUSxNQUFNLE1BQU0sSUFPWCxD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
@@ -0,0 +1,6 @@
1
+ export type RuntimeType = "bigint" | "boolean" | "function" | "number" | "object" | "string" | "symbol" | "undefined";
2
+ /** 런타임 값이 불리언인지 판별합니다. */
3
+ export declare function isBooleanValue<Value>(value: Value): value is Value & boolean;
4
+ /** JavaScript의 typeof 결과를 단항 연산자 없이 동일하게 계산합니다. */
5
+ export declare function runtimeTypeOf<Value>(value: Value): RuntimeType;
6
+ //# sourceMappingURL=runtime-type.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"runtime-type.d.ts","sourceRoot":"","sources":["../src/runtime-type.ts"],"names":[],"mappings":"AAQA,MAAM,MAAM,WAAW,GACnB,QAAQ,GACR,SAAS,GACT,UAAU,GACV,QAAQ,GACR,QAAQ,GACR,QAAQ,GACR,QAAQ,GACR,WAAW,CAAC;AAEhB,0BAA0B;AAC1B,wBAAgB,cAAc,CAAC,KAAK,EAAE,KAAK,EAAE,KAAK,GAAG,KAAK,IAAI,KAAK,GAAG,OAAO,CAE5E;AAED,mDAAmD;AACnD,wBAAgB,aAAa,CAAC,KAAK,EAAE,KAAK,EAAE,KAAK,GAAG,WAAW,CAS9D"}
@@ -0,0 +1,26 @@
1
+ import { __esmMin } from "./_virtual/_rolldown/runtime.js";
2
+ import { init_runtime_value, isBigIntValue, isFunctionValue, isNumberValue, isStringValue, isSymbolValue } from "./utils/runtime-value.js";
3
+ //#region src/runtime-type.ts
4
+ /** 런타임 값이 불리언인지 판별합니다. */
5
+ function isBooleanValue(value) {
6
+ return value === true || value === false;
7
+ }
8
+ /** JavaScript의 typeof 결과를 단항 연산자 없이 동일하게 계산합니다. */
9
+ function runtimeTypeOf(value) {
10
+ if (value === void 0) return "undefined";
11
+ if (isStringValue(value)) return "string";
12
+ if (isNumberValue(value)) return "number";
13
+ if (isBooleanValue(value)) return "boolean";
14
+ if (isBigIntValue(value)) return "bigint";
15
+ if (isSymbolValue(value)) return "symbol";
16
+ if (isFunctionValue(value)) return "function";
17
+ return "object";
18
+ }
19
+ var init_runtime_type = __esmMin((() => {
20
+ init_runtime_value();
21
+ }));
22
+ //#endregion
23
+ init_runtime_type();
24
+ export { init_runtime_type, isBooleanValue, runtimeTypeOf };
25
+
26
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicnVudGltZS10eXBlLmpzIiwibmFtZXMiOltdLCJzb3VyY2VzIjpbIi4uL3NyYy9ydW50aW1lLXR5cGUudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgaXNCaWdJbnRWYWx1ZSxcbiAgaXNGdW5jdGlvblZhbHVlLFxuICBpc051bWJlclZhbHVlLFxuICBpc1N0cmluZ1ZhbHVlLFxuICBpc1N5bWJvbFZhbHVlLFxufSBmcm9tIFwiLi91dGlscy9ydW50aW1lLXZhbHVlXCI7XG5cbmV4cG9ydCB0eXBlIFJ1bnRpbWVUeXBlID1cbiAgfCBcImJpZ2ludFwiXG4gIHwgXCJib29sZWFuXCJcbiAgfCBcImZ1bmN0aW9uXCJcbiAgfCBcIm51bWJlclwiXG4gIHwgXCJvYmplY3RcIlxuICB8IFwic3RyaW5nXCJcbiAgfCBcInN5bWJvbFwiXG4gIHwgXCJ1bmRlZmluZWRcIjtcblxuLyoqIOufsO2DgOyehCDqsJLsnbQg67aI66as7Ja47J247KeAIO2MkOuzhO2VqeuLiOuLpC4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc0Jvb2xlYW5WYWx1ZTxWYWx1ZT4odmFsdWU6IFZhbHVlKTogdmFsdWUgaXMgVmFsdWUgJiBib29sZWFuIHtcbiAgcmV0dXJuIHZhbHVlID09PSB0cnVlIHx8IHZhbHVlID09PSBmYWxzZTtcbn1cblxuLyoqIEphdmFTY3JpcHTsnZggdHlwZW9mIOqysOqzvOulvCDri6jtla0g7Jew7IKw7J6QIOyXhuydtCDrj5nsnbztlZjqsowg6rOE7IKw7ZWp64uI64ukLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJ1bnRpbWVUeXBlT2Y8VmFsdWU+KHZhbHVlOiBWYWx1ZSk6IFJ1bnRpbWVUeXBlIHtcbiAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQpIHJldHVybiBcInVuZGVmaW5lZFwiO1xuICBpZiAoaXNTdHJpbmdWYWx1ZSh2YWx1ZSkpIHJldHVybiBcInN0cmluZ1wiO1xuICBpZiAoaXNOdW1iZXJWYWx1ZSh2YWx1ZSkpIHJldHVybiBcIm51bWJlclwiO1xuICBpZiAoaXNCb29sZWFuVmFsdWUodmFsdWUpKSByZXR1cm4gXCJib29sZWFuXCI7XG4gIGlmIChpc0JpZ0ludFZhbHVlKHZhbHVlKSkgcmV0dXJuIFwiYmlnaW50XCI7XG4gIGlmIChpc1N5bWJvbFZhbHVlKHZhbHVlKSkgcmV0dXJuIFwic3ltYm9sXCI7XG4gIGlmIChpc0Z1bmN0aW9uVmFsdWUodmFsdWUpKSByZXR1cm4gXCJmdW5jdGlvblwiO1xuICByZXR1cm4gXCJvYmplY3RcIjtcbn1cbiJdLCJtYXBwaW5ncyI6Ijs7OztBQW1CQSxTQUFnQixlQUFzQixPQUF3QztDQUM1RSxPQUFPLFVBQVUsUUFBUSxVQUFVO0FBQ3JDOztBQUdBLFNBQWdCLGNBQXFCLE9BQTJCO0NBQzlELElBQUksVUFBVSxRQUFXLE9BQU87Q0FDaEMsSUFBSSxjQUFjLEtBQUssR0FBRyxPQUFPO0NBQ2pDLElBQUksY0FBYyxLQUFLLEdBQUcsT0FBTztDQUNqQyxJQUFJLGVBQWUsS0FBSyxHQUFHLE9BQU87Q0FDbEMsSUFBSSxjQUFjLEtBQUssR0FBRyxPQUFPO0NBQ2pDLElBQUksY0FBYyxLQUFLLEdBQUcsT0FBTztDQUNqQyxJQUFJLGdCQUFnQixLQUFLLEdBQUcsT0FBTztDQUNuQyxPQUFPO0FBQ1Q7O29CQTNCOEIifQ==
@@ -0,0 +1,26 @@
1
+ /**
2
+ * 페이지 단위 HMR 비활성화(`?hmr=false`).
3
+ *
4
+ * 에이전트가 코드를 고치는 동안 사람이 보고 있는 탭이 계속 새로고침되는 것을 막기 위해,
5
+ * 해당 URL로 연 페이지에서만 Vite HMR을 끊는다.
6
+ *
7
+ * Vite는 페이지 단위 HMR 토글을 제공하지 않는다. `server.hmr: false`는 서버 전체에 적용되고,
8
+ * HTML에서 `/@vite/client` 스크립트 태그만 제거하는 방식도 통하지 않는다.
9
+ * 변환된 모듈마다 `import { createHotContext } from "/@vite/client"`가 들어가기 때문이다.
10
+ *
11
+ * 그래서 HMR 웹소켓 자체를 막는다. Vite HMR 소켓은 서브프로토콜로 구분되므로
12
+ * (`vite-hmr`, 재연결 확인은 `vite-ping`), 앱이 같은 포트에서 쓰는 웹소켓
13
+ * (Sonamu telemetry, ctx.ws 등)은 그대로 두고 HMR만 골라낼 수 있다.
14
+ *
15
+ * 연결 실패로 처리하지 않고 "영원히 연결 중"인 더미 소켓을 돌려주는 이유는,
16
+ * Vite 클라이언트가 소켓이 닫히면 재연결을 폴링하다가 성공 시 `location.reload()`를
17
+ * 호출하기 때문이다. close/error 이벤트를 아예 발생시키지 않아야 새로고침되지 않는다.
18
+ */
19
+ /** 요청 URL에 `?hmr=false`가 있는지 확인한다. */
20
+ export declare function isHmrDisabledByQuery(url: string): boolean;
21
+ /**
22
+ * HMR 웹소켓만 무력화하는 인라인 스크립트.
23
+ * 모듈 스크립트(`type="module"`)는 지연 실행되므로, 이 classic 스크립트가 항상 먼저 실행된다.
24
+ */
25
+ export declare const HMR_OPT_OUT_SCRIPT = "<script>\n(() => {\n var NativeWebSocket = window.WebSocket;\n if (!NativeWebSocket) return;\n var HMR_PROTOCOLS = [\"vite-hmr\", \"vite-ping\"];\n\n function createIdleSocket(url) {\n // \uC5F4\uB9AC\uC9C0\uB3C4 \uB2EB\uD788\uC9C0\uB3C4 \uC54A\uB294 \uB354\uBBF8. close/error\uB97C \uBC1C\uC0DD\uC2DC\uD0A4\uBA74 Vite\uAC00 \uC7AC\uC5F0\uACB0 \uD6C4 \uC0C8\uB85C\uACE0\uCE68\uD55C\uB2E4.\n return {\n url: String(url),\n readyState: 0,\n protocol: \"\",\n bufferedAmount: 0,\n extensions: \"\",\n binaryType: \"blob\",\n onopen: null, onclose: null, onerror: null, onmessage: null,\n addEventListener: function () {},\n removeEventListener: function () {},\n dispatchEvent: function () { return false; },\n send: function () {},\n close: function () {},\n CONNECTING: 0, OPEN: 1, CLOSING: 2, CLOSED: 3,\n };\n }\n\n window.WebSocket = new Proxy(NativeWebSocket, {\n construct: function (Target, args) {\n var requested = args[1];\n var protocols = Array.isArray(requested) ? requested : requested ? [requested] : [];\n var isHmr = protocols.some(function (protocol) {\n return HMR_PROTOCOLS.indexOf(protocol) !== -1;\n });\n if (isHmr) {\n console.info(\"[sonamu] hmr=false: \uC774 \uD398\uC774\uC9C0\uC758 Vite HMR \uC5F0\uACB0\uC744 \uB9C9\uC558\uC2B5\uB2C8\uB2E4. \uBCC0\uACBD \uC0AC\uD56D\uC740 \uBC18\uC601\uB418\uC9C0 \uC54A\uC2B5\uB2C8\uB2E4.\");\n return createIdleSocket(args[0]);\n }\n return new Target(...args);\n },\n });\n})();\n</script>";
26
+ //# sourceMappingURL=hmr-opt-out.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hmr-opt-out.d.ts","sourceRoot":"","sources":["../../src/ssr/hmr-opt-out.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAIH,sCAAsC;AACtC,wBAAgB,oBAAoB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CASzD;AAED;;;GAGG;AACH,eAAO,MAAM,kBAAkB,ikDAwCrB,CAAC"}
@@ -0,0 +1,59 @@
1
+ import { __esmMin } from "../_virtual/_rolldown/runtime.js";
2
+ //#region src/ssr/hmr-opt-out.ts
3
+ /** 요청 URL에 `?hmr=false`가 있는지 확인한다. */
4
+ function isHmrDisabledByQuery(url) {
5
+ const queryIndex = url.indexOf("?");
6
+ if (queryIndex === -1) return false;
7
+ const value = new URLSearchParams(url.slice(queryIndex + 1)).get(HMR_OPT_OUT_QUERY);
8
+ return value === "false" || value === "0";
9
+ }
10
+ var HMR_OPT_OUT_QUERY, HMR_OPT_OUT_SCRIPT;
11
+ var init_hmr_opt_out = __esmMin((() => {
12
+ HMR_OPT_OUT_QUERY = "hmr";
13
+ HMR_OPT_OUT_SCRIPT = `<script>
14
+ (() => {
15
+ var NativeWebSocket = window.WebSocket;
16
+ if (!NativeWebSocket) return;
17
+ var HMR_PROTOCOLS = ["vite-hmr", "vite-ping"];
18
+
19
+ function createIdleSocket(url) {
20
+ // 열리지도 닫히지도 않는 더미. close/error를 발생시키면 Vite가 재연결 후 새로고침한다.
21
+ return {
22
+ url: String(url),
23
+ readyState: 0,
24
+ protocol: "",
25
+ bufferedAmount: 0,
26
+ extensions: "",
27
+ binaryType: "blob",
28
+ onopen: null, onclose: null, onerror: null, onmessage: null,
29
+ addEventListener: function () {},
30
+ removeEventListener: function () {},
31
+ dispatchEvent: function () { return false; },
32
+ send: function () {},
33
+ close: function () {},
34
+ CONNECTING: 0, OPEN: 1, CLOSING: 2, CLOSED: 3,
35
+ };
36
+ }
37
+
38
+ window.WebSocket = new Proxy(NativeWebSocket, {
39
+ construct: function (Target, args) {
40
+ var requested = args[1];
41
+ var protocols = Array.isArray(requested) ? requested : requested ? [requested] : [];
42
+ var isHmr = protocols.some(function (protocol) {
43
+ return HMR_PROTOCOLS.indexOf(protocol) !== -1;
44
+ });
45
+ if (isHmr) {
46
+ console.info("[sonamu] hmr=false: 이 페이지의 Vite HMR 연결을 막았습니다. 변경 사항은 반영되지 않습니다.");
47
+ return createIdleSocket(args[0]);
48
+ }
49
+ return new Target(...args);
50
+ },
51
+ });
52
+ })();
53
+ <\/script>`;
54
+ }));
55
+ //#endregion
56
+ init_hmr_opt_out();
57
+ export { HMR_OPT_OUT_SCRIPT, init_hmr_opt_out, isHmrDisabledByQuery };
58
+
59
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaG1yLW9wdC1vdXQuanMiLCJuYW1lcyI6W10sInNvdXJjZXMiOlsiLi4vLi4vc3JjL3Nzci9obXItb3B0LW91dC50cyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIO2OmOydtOyngCDri6jsnIQgSE1SIOu5hO2ZnOyEse2ZlChgP2htcj1mYWxzZWApLlxuICpcbiAqIOyXkOydtOyghO2KuOqwgCDsvZTrk5zrpbwg6rOg7LmY64qUIOuPmeyViCDsgqzrnozsnbQg67O06rOgIOyeiOuKlCDtg63snbQg6rOE7IaNIOyDiOuhnOqzoOy5qOuQmOuKlCDqsoPsnYQg66eJ6riwIOychO2VtCxcbiAqIO2VtOuLuSBVUkzroZwg7JewIO2OmOydtOyngOyXkOyEnOunjCBWaXRlIEhNUuydhCDrgYrripTri6QuXG4gKlxuICogVml0ZeuKlCDtjpjsnbTsp4Ag64uo7JyEIEhNUiDthqDquIDsnYQg7KCc6rO17ZWY7KeAIOyViuuKlOuLpC4gYHNlcnZlci5obXI6IGZhbHNlYOuKlCDshJzrsoQg7KCE7LK07JeQIOyggeyaqeuQmOqzoCxcbiAqIEhUTUzsl5DshJwgYC9Adml0ZS9jbGllbnRgIOyKpO2BrOumve2KuCDtg5zqt7jrp4wg7KCc6rGw7ZWY64qUIOuwqeyLneuPhCDthrXtlZjsp4Ag7JWK64qU64ukLlxuICog67OA7ZmY65CcIOuqqOuTiOuniOuLpCBgaW1wb3J0IHsgY3JlYXRlSG90Q29udGV4dCB9IGZyb20gXCIvQHZpdGUvY2xpZW50XCJg6rCAIOuTpOyWtOqwgOq4sCDrlYzrrLjsnbTri6QuXG4gKlxuICog6re4656Y7IScIEhNUiDsm7nshozsvJMg7J6Q7LK066W8IOunieuKlOuLpC4gVml0ZSBITVIg7IaM7LyT7J2AIOyEnOu4jO2UhOuhnO2GoOy9nOuhnCDqtazrtoTrkJjrr4DroZxcbiAqIChgdml0ZS1obXJgLCDsnqzsl7DqsrAg7ZmV7J247J2AIGB2aXRlLXBpbmdgKSwg7JWx7J20IOqwmeydgCDtj6ztirjsl5DshJwg7JOw64qUIOybueyGjOy8k1xuICogKFNvbmFtdSB0ZWxlbWV0cnksIGN0eC53cyDrk7Ep7J2AIOq3uOuMgOuhnCDrkZDqs6AgSE1S66eMIOqzqOudvOuCvCDsiJgg7J6I64ukLlxuICpcbiAqIOyXsOqysCDsi6TtjKjroZwg7LKY66as7ZWY7KeAIOyViuqzoCBcIuyYgeybkO2eiCDsl7DqsrAg7KSRXCLsnbgg642U66+4IOyGjOy8k+ydhCDrj4zroKTso7zripQg7J207Jyg64qULFxuICogVml0ZSDtgbTrnbzsnbTslrjtirjqsIAg7IaM7LyT7J20IOuLq+2eiOuptCDsnqzsl7DqsrDsnYQg7Y+066eB7ZWY64uk6rCAIOyEseqztSDsi5wgYGxvY2F0aW9uLnJlbG9hZCgpYOulvFxuICog7Zi47Lac7ZWY6riwIOuVjOusuOydtOuLpC4gY2xvc2UvZXJyb3Ig7J2067Kk7Yq466W8IOyVhOyYiCDrsJzsg53si5ztgqTsp4Ag7JWK7JWE7JW8IOyDiOuhnOqzoOy5qOuQmOyngCDslYrripTri6QuXG4gKi9cblxuY29uc3QgSE1SX09QVF9PVVRfUVVFUlkgPSBcImhtclwiO1xuXG4vKiog7JqU7LKtIFVSTOyXkCBgP2htcj1mYWxzZWDqsIAg7J6I64qU7KeAIO2ZleyduO2VnOuLpC4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc0htckRpc2FibGVkQnlRdWVyeSh1cmw6IHN0cmluZyk6IGJvb2xlYW4ge1xuICBjb25zdCBxdWVyeUluZGV4ID0gdXJsLmluZGV4T2YoXCI/XCIpO1xuICBpZiAocXVlcnlJbmRleCA9PT0gLTEpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBjb25zdCBwYXJhbXMgPSBuZXcgVVJMU2VhcmNoUGFyYW1zKHVybC5zbGljZShxdWVyeUluZGV4ICsgMSkpO1xuICBjb25zdCB2YWx1ZSA9IHBhcmFtcy5nZXQoSE1SX09QVF9PVVRfUVVFUlkpO1xuICByZXR1cm4gdmFsdWUgPT09IFwiZmFsc2VcIiB8fCB2YWx1ZSA9PT0gXCIwXCI7XG59XG5cbi8qKlxuICogSE1SIOybueyGjOy8k+unjCDrrLTroKXtmZTtlZjripQg7J2465287J24IOyKpO2BrOumve2KuC5cbiAqIOuqqOuTiCDsiqTtgazrpr3tirgoYHR5cGU9XCJtb2R1bGVcImAp64qUIOyngOyXsCDsi6TtlonrkJjrr4DroZwsIOydtCBjbGFzc2ljIOyKpO2BrOumve2KuOqwgCDtla3sg4Eg66i87KCAIOyLpO2WieuQnOuLpC5cbiAqL1xuZXhwb3J0IGNvbnN0IEhNUl9PUFRfT1VUX1NDUklQVCA9IGA8c2NyaXB0PlxuKCgpID0+IHtcbiAgdmFyIE5hdGl2ZVdlYlNvY2tldCA9IHdpbmRvdy5XZWJTb2NrZXQ7XG4gIGlmICghTmF0aXZlV2ViU29ja2V0KSByZXR1cm47XG4gIHZhciBITVJfUFJPVE9DT0xTID0gW1widml0ZS1obXJcIiwgXCJ2aXRlLXBpbmdcIl07XG5cbiAgZnVuY3Rpb24gY3JlYXRlSWRsZVNvY2tldCh1cmwpIHtcbiAgICAvLyDsl7Trpqzsp4Drj4Qg64ur7Z6I7KeA64+EIOyViuuKlCDrjZTrr7guIGNsb3NlL2Vycm9y66W8IOuwnOyDneyLnO2CpOuptCBWaXRl6rCAIOyerOyXsOqysCDtm4Qg7IOI66Gc6rOg7Lmo7ZWc64ukLlxuICAgIHJldHVybiB7XG4gICAgICB1cmw6IFN0cmluZyh1cmwpLFxuICAgICAgcmVhZHlTdGF0ZTogMCxcbiAgICAgIHByb3RvY29sOiBcIlwiLFxuICAgICAgYnVmZmVyZWRBbW91bnQ6IDAsXG4gICAgICBleHRlbnNpb25zOiBcIlwiLFxuICAgICAgYmluYXJ5VHlwZTogXCJibG9iXCIsXG4gICAgICBvbm9wZW46IG51bGwsIG9uY2xvc2U6IG51bGwsIG9uZXJyb3I6IG51bGwsIG9ubWVzc2FnZTogbnVsbCxcbiAgICAgIGFkZEV2ZW50TGlzdGVuZXI6IGZ1bmN0aW9uICgpIHt9LFxuICAgICAgcmVtb3ZlRXZlbnRMaXN0ZW5lcjogZnVuY3Rpb24gKCkge30sXG4gICAgICBkaXNwYXRjaEV2ZW50OiBmdW5jdGlvbiAoKSB7IHJldHVybiBmYWxzZTsgfSxcbiAgICAgIHNlbmQ6IGZ1bmN0aW9uICgpIHt9LFxuICAgICAgY2xvc2U6IGZ1bmN0aW9uICgpIHt9LFxuICAgICAgQ09OTkVDVElORzogMCwgT1BFTjogMSwgQ0xPU0lORzogMiwgQ0xPU0VEOiAzLFxuICAgIH07XG4gIH1cblxuICB3aW5kb3cuV2ViU29ja2V0ID0gbmV3IFByb3h5KE5hdGl2ZVdlYlNvY2tldCwge1xuICAgIGNvbnN0cnVjdDogZnVuY3Rpb24gKFRhcmdldCwgYXJncykge1xuICAgICAgdmFyIHJlcXVlc3RlZCA9IGFyZ3NbMV07XG4gICAgICB2YXIgcHJvdG9jb2xzID0gQXJyYXkuaXNBcnJheShyZXF1ZXN0ZWQpID8gcmVxdWVzdGVkIDogcmVxdWVzdGVkID8gW3JlcXVlc3RlZF0gOiBbXTtcbiAgICAgIHZhciBpc0htciA9IHByb3RvY29scy5zb21lKGZ1bmN0aW9uIChwcm90b2NvbCkge1xuICAgICAgICByZXR1cm4gSE1SX1BST1RPQ09MUy5pbmRleE9mKHByb3RvY29sKSAhPT0gLTE7XG4gICAgICB9KTtcbiAgICAgIGlmIChpc0htcikge1xuICAgICAgICBjb25zb2xlLmluZm8oXCJbc29uYW11XSBobXI9ZmFsc2U6IOydtCDtjpjsnbTsp4DsnZggVml0ZSBITVIg7Jew6rKw7J2EIOunieyVmOyKteuLiOuLpC4g67OA6rK9IOyCrO2VreydgCDrsJjsmIHrkJjsp4Ag7JWK7Iq164uI64ukLlwiKTtcbiAgICAgICAgcmV0dXJuIGNyZWF0ZUlkbGVTb2NrZXQoYXJnc1swXSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gbmV3IFRhcmdldCguLi5hcmdzKTtcbiAgICB9LFxuICB9KTtcbn0pKCk7XG48L3NjcmlwdD5gO1xuIl0sIm1hcHBpbmdzIjoiOzs7QUFzQkEsU0FBZ0IscUJBQXFCLEtBQXNCO0NBQ3pELE1BQU0sYUFBYSxJQUFJLFFBQVEsR0FBRztDQUNsQyxJQUFJLGVBQWUsSUFDakIsT0FBTztDQUlULE1BQU0sUUFBUSxJQURLLGdCQUFnQixJQUFJLE1BQU0sYUFBYSxDQUFDLENBQzdDLENBQUEsQ0FBTyxJQUFJLGlCQUFpQjtDQUMxQyxPQUFPLFVBQVUsV0FBVyxVQUFVO0FBQ3hDOzs7Q0FaTSxvQkFBb0I7Q0FrQmIscUJBQXFCIn0=
@@ -1 +1 @@
1
- {"version":3,"file":"renderer.d.ts","sourceRoot":"","sources":["../../src/ssr/renderer.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,KAAK,YAAY,EAAE,KAAK,cAAc,EAAE,MAAM,SAAS,CAAC;AACjE,OAAO,EAAE,KAAK,aAAa,EAAE,MAAM,MAAM,CAAC;AAI1C,OAAO,EAAE,KAAK,mBAAmB,EAAE,MAAM,gBAAgB,CAAC;AAC1D,OAAO,EAAsB,KAAK,QAAQ,EAAE,MAAM,SAAS,CAAC;AAE5D,wBAAsB,SAAS,CAC7B,GAAG,EAAE,MAAM,EACX,KAAK,EAAE,QAAQ,EACf,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,EAC9B,OAAO,EAAE,cAAc,EACvB,KAAK,EAAE,YAAY,EACnB,MAAM,EAAE,mBAAmB,EAC3B,IAAI,CAAC,EAAE,aAAa,GACnB,OAAO,CAAC,MAAM,CAAC,CAuFjB"}
1
+ {"version":3,"file":"renderer.d.ts","sourceRoot":"","sources":["../../src/ssr/renderer.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,KAAK,YAAY,EAAE,KAAK,cAAc,EAAE,MAAM,SAAS,CAAC;AACjE,OAAO,EAAE,KAAK,aAAa,EAAE,MAAM,MAAM,CAAC;AAI1C,OAAO,EAAE,KAAK,mBAAmB,EAAE,MAAM,gBAAgB,CAAC;AAE1D,OAAO,EAAsB,KAAK,QAAQ,EAAE,MAAM,SAAS,CAAC;AAE5D,wBAAsB,SAAS,CAC7B,GAAG,EAAE,MAAM,EACX,KAAK,EAAE,QAAQ,EACf,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,EAC9B,OAAO,EAAE,cAAc,EACvB,KAAK,EAAE,YAAY,EACnB,MAAM,EAAE,mBAAmB,EAC3B,IAAI,CAAC,EAAE,aAAa,GACnB,OAAO,CAAC,MAAM,CAAC,CA4FjB"}
@@ -1,5 +1,6 @@
1
1
  import { __esmMin } from "../_virtual/_rolldown/runtime.js";
2
2
  import { applyCacheHeaders, init_cache_control } from "../cache-control/cache-control.js";
3
+ import { HMR_OPT_OUT_SCRIPT, init_hmr_opt_out, isHmrDisabledByQuery } from "./hmr-opt-out.js";
3
4
  import path from "node:path";
4
5
  //#region src/ssr/renderer.ts
5
6
  async function renderSSR(url, route, params, request, reply, config, vite) {
@@ -29,6 +30,7 @@ async function renderSSR(url, route, params, request, reply, config, vite) {
29
30
  const indexHtmlPath = path.join(vite.config.root, "index.html");
30
31
  const originalHtml = await fs.readFile(indexHtmlPath, "utf-8");
31
32
  viteScripts = extractScriptTags(await vite.transformIndexHtml(url, originalHtml));
33
+ if (isHmrDisabledByQuery(url)) viteScripts = `${HMR_OPT_OUT_SCRIPT}\n${viteScripts}`;
32
34
  render = (await vite.ssrLoadModule("/src/entry-server.generated.tsx")).render;
33
35
  } else {
34
36
  const fs = await import("node:fs");
@@ -72,9 +74,10 @@ function extractScriptTags(html) {
72
74
  }
73
75
  var init_renderer = __esmMin((() => {
74
76
  init_cache_control();
77
+ init_hmr_opt_out();
75
78
  }));
76
79
  //#endregion
77
80
  init_renderer();
78
81
  export { init_renderer, renderSSR };
79
82
 
80
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVuZGVyZXIuanMiLCJuYW1lcyI6W10sInNvdXJjZXMiOlsiLi4vLi4vc3JjL3Nzci9yZW5kZXJlci50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgcGF0aCBmcm9tIFwibm9kZTpwYXRoXCI7XG5cbmltcG9ydCB7IHR5cGUgRmFzdGlmeVJlcGx5LCB0eXBlIEZhc3RpZnlSZXF1ZXN0IH0gZnJvbSBcImZhc3RpZnlcIjtcbmltcG9ydCB7IHR5cGUgVml0ZURldlNlcnZlciB9IGZyb20gXCJ2aXRlXCI7XG5cbmltcG9ydCB7IGFwcGx5Q2FjaGVIZWFkZXJzIH0gZnJvbSBcIi4uL2NhY2hlLWNvbnRyb2wvY2FjaGUtY29udHJvbFwiO1xuaW1wb3J0IHsgdHlwZSBDYWNoZUNvbnRyb2xSZXF1ZXN0IH0gZnJvbSBcIi4uL2NhY2hlLWNvbnRyb2wvdHlwZXNcIjtcbmltcG9ydCB7IHR5cGUgU29uYW11RmFzdGlmeUNvbmZpZyB9IGZyb20gXCIuLi90eXBlcy90eXBlc1wiO1xuaW1wb3J0IHsgdHlwZSBQcmVsb2FkZWREYXRhLCB0eXBlIFNTUlJvdXRlIH0gZnJvbSBcIi4vdHlwZXNcIjtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHJlbmRlclNTUihcbiAgdXJsOiBzdHJpbmcsXG4gIHJvdXRlOiBTU1JSb3V0ZSxcbiAgcGFyYW1zOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+LFxuICByZXF1ZXN0OiBGYXN0aWZ5UmVxdWVzdCxcbiAgcmVwbHk6IEZhc3RpZnlSZXBseSxcbiAgY29uZmlnOiBTb25hbXVGYXN0aWZ5Q29uZmlnLFxuICB2aXRlPzogVml0ZURldlNlcnZlcixcbik6IFByb21pc2U8c3RyaW5nPiB7XG4gIGNvbnN0IHsgU29uYW11IH0gPSBhd2FpdCBpbXBvcnQoXCIuLi9hcGkvc29uYW11XCIpO1xuXG4gIC8vIDEuIHByZWxvYWQg7Iuk7ZaJIOKGkiBTU1JRdWVyeVtdIO2ajeuTnSAoZGV2L3Byb2Qg6rO17Ya1KVxuICBjb25zdCBwcmVsb2FkQ29uZmlnID0gcm91dGUucHJlbG9hZCA/IHJvdXRlLnByZWxvYWQocGFyYW1zKSA6IFtdO1xuICBjb25zdCBwcmVsb2FkZWREYXRhOiBQcmVsb2FkZWREYXRhW10gPSBbXTtcblxuICBmb3IgKGNvbnN0IHsgbW9kZWxOYW1lLCBtZXRob2ROYW1lLCBwYXJhbXM6IGFwaVBhcmFtcywgc2VydmljZUtleSB9IG9mIHByZWxvYWRDb25maWcpIHtcbiAgICBjb25zdCBhcGkgPSBTb25hbXUuc3luY2VyLmFwaXMuZmluZChcbiAgICAgIChhKSA9PiBhLm1vZGVsTmFtZSA9PT0gbW9kZWxOYW1lICYmIGEubWV0aG9kTmFtZSA9PT0gbWV0aG9kTmFtZSxcbiAgICApO1xuXG4gICAgaWYgKCFhcGkpIHtcbiAgICAgIGNvbnNvbGUud2FybihgQVBJIG5vdCBmb3VuZDogJHttb2RlbE5hbWV9LiR7bWV0aG9kTmFtZX1gKTtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIHRyeSB7XG4gICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBTb25hbXUuaW52b2tlQXBpRm9yU1NSKGFwaSwgYXBpUGFyYW1zLCBjb25maWcsIHJlcXVlc3QsIHJlcGx5KTtcbiAgICAgIHByZWxvYWRlZERhdGEucHVzaCh7XG4gICAgICAgIHF1ZXJ5S2V5OiBbLi4uc2VydmljZUtleSwgLi4uYXBpUGFyYW1zXSxcbiAgICAgICAgZGF0YTogcmVzdWx0LFxuICAgICAgfSk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgY29uc29sZS5lcnJvcihgRmFpbGVkIHRvIHByZWxvYWQgJHttb2RlbE5hbWV9LiR7bWV0aG9kTmFtZX06YCwgZSk7XG4gICAgfVxuICB9XG5cbiAgLy8gMi4gRGV2L1Byb2Qg7Iqk7YGs66a97Yq4IOy2lOy2nFxuICBsZXQgdml0ZVNjcmlwdHM6IHN0cmluZztcbiAgbGV0IHJlbmRlcjogKFxuICAgIHVybDogc3RyaW5nLFxuICAgIHByZWxvYWRlZERhdGE6IFByZWxvYWRlZERhdGFbXSxcbiAgKSA9PiBQcm9taXNlPHsgaHRtbDogc3RyaW5nOyBkZWh5ZHJhdGVkU3RhdGU6IHVua25vd24gfT47XG5cbiAgaWYgKHZpdGUpIHtcbiAgICAvLyBEZXY6IFZpdGUgRGV2IFNlcnZlclxuICAgIGNvbnN0IGZzID0gYXdhaXQgaW1wb3J0KFwibm9kZTpmcy9wcm9taXNlc1wiKTtcbiAgICBjb25zdCBpbmRleEh0bWxQYXRoID0gcGF0aC5qb2luKHZpdGUuY29uZmlnLnJvb3QsIFwiaW5kZXguaHRtbFwiKTtcbiAgICBjb25zdCBvcmlnaW5hbEh0bWwgPSBhd2FpdCBmcy5yZWFkRmlsZShpbmRleEh0bWxQYXRoLCBcInV0Zi04XCIpO1xuICAgIGNvbnN0IHRyYW5zZm9ybWVkSHRtbCA9IGF3YWl0IHZpdGUudHJhbnNmb3JtSW5kZXhIdG1sKHVybCwgb3JpZ2luYWxIdG1sKTtcblxuICAgIC8vIFZpdGXqsIAg7KO87J6F7ZWcIOyKpO2BrOumve2KuCDstpTstpxcbiAgICB2aXRlU2NyaXB0cyA9IGV4dHJhY3RTY3JpcHRUYWdzKHRyYW5zZm9ybWVkSHRtbCk7XG5cbiAgICBjb25zdCBlbnRyeU1vZHVsZSA9IGF3YWl0IHZpdGUuc3NyTG9hZE1vZHVsZShcIi9zcmMvZW50cnktc2VydmVyLmdlbmVyYXRlZC50c3hcIik7XG4gICAgcmVuZGVyID0gZW50cnlNb2R1bGUucmVuZGVyO1xuICB9IGVsc2Uge1xuICAgIC8vIFByb2Q6IOu5jOuTnOuQnCDtjIzsnbxcbiAgICBjb25zdCBmcyA9IGF3YWl0IGltcG9ydChcIm5vZGU6ZnNcIik7XG4gICAgY29uc3Qgd2ViRGlzdFBhdGggPSBwYXRoLmpvaW4oU29uYW11LmFwaVJvb3RQYXRoLCBcIndlYi1kaXN0XCIsIFwiY2xpZW50XCIpO1xuICAgIGNvbnN0IHNzclBhdGggPSBwYXRoLmpvaW4oU29uYW11LmFwaVJvb3RQYXRoLCBcIndlYi1kaXN0XCIsIFwic2VydmVyXCIpO1xuXG4gICAgLy8g67mM65Oc65CcIGluZGV4Lmh0bWzsl5DshJwg7Iqk7YGs66a97Yq4IOy2lOy2nFxuICAgIGNvbnN0IGJ1aWx0SHRtbCA9IGZzLnJlYWRGaWxlU3luYyhwYXRoLmpvaW4od2ViRGlzdFBhdGgsIFwiaW5kZXguaHRtbFwiKSwgXCJ1dGYtOFwiKTtcbiAgICB2aXRlU2NyaXB0cyA9IGV4dHJhY3RTY3JpcHRUYWdzKGJ1aWx0SHRtbCk7XG5cbiAgICBjb25zdCBlbnRyeU1vZHVsZSA9IGF3YWl0IGltcG9ydChwYXRoLmpvaW4oc3NyUGF0aCwgXCJlbnRyeS1zZXJ2ZXIuZ2VuZXJhdGVkLmpzXCIpKTtcbiAgICByZW5kZXIgPSBlbnRyeU1vZHVsZS5yZW5kZXI7XG4gIH1cblxuICAvLyAzLiBSb3V0ZXJQcm92aWRlciDroIzrjZTrp4EgKGZ1bGwgZG9jdW1lbnQpXG4gIGNvbnN0IHsgaHRtbDogZnVsbERvY0h0bWwsIGRlaHlkcmF0ZWRTdGF0ZSB9ID0gYXdhaXQgcmVuZGVyKHVybCwgcHJlbG9hZGVkRGF0YSk7XG5cbiAgLy8gNC4gU1NSIOuNsOydtO2EsCDsiqTtgazrpr3tirgg7IOd7ISxXG4gIGNvbnN0IHNzckRhdGFTY3JpcHQgPSBkZWh5ZHJhdGVkU3RhdGVcbiAgICA/IGA8c2NyaXB0PndpbmRvdy5fX1NPTkFNVV9TU1JfXyA9ICR7SlNPTi5zdHJpbmdpZnkoZGVoeWRyYXRlZFN0YXRlKS5yZXBsYWNlKC88L2csIFwiXFxcXHUwMDNjXCIpfTs8L3NjcmlwdD5gXG4gICAgOiBcIlwiO1xuXG4gIC8vIDUuIFNTUiBDb25maWcg7Iqk7YGs66a97Yq4IOyDneyEsSAoZGlzYWJsZUh5ZHJhdGUpXG4gIGNvbnN0IHNzckNvbmZpZ1NjcmlwdCA9IHJvdXRlLmRpc2FibGVIeWRyYXRlXG4gICAgPyBgPHNjcmlwdD53aW5kb3cuX19TT05BTVVfU1NSX0NPTkZJR19fID0gJHtKU09OLnN0cmluZ2lmeSh7IGRpc2FibGVIeWRyYXRlOiB0cnVlIH0pfTs8L3NjcmlwdD5gXG4gICAgOiBcIlwiO1xuXG4gIC8vIDYuIFZpdGUg7Iqk7YGs66a97Yq47JmAIFNTUiDrjbDsnbTthLDrpbwgPC9ib2R5PiDsp4HsoITsl5Ag7KO87J6FXG4gIGNvbnN0IGZpbmFsSHRtbCA9IGZ1bGxEb2NIdG1sLnJlcGxhY2UoXG4gICAgXCI8L2JvZHk+XCIsXG4gICAgYCR7c3NyQ29uZmlnU2NyaXB0fVxcbiR7c3NyRGF0YVNjcmlwdH1cXG4ke3ZpdGVTY3JpcHRzfVxcbjwvYm9keT5gLFxuICApO1xuXG4gIC8vIDcuIENhY2hlLUNvbnRyb2wg7Zek642UIOyEpOyglVxuICBjb25zdCBzc3JDYWNoZUNvbmZpZyA9IGdldFNTUkNhY2hlQ29udHJvbCh1cmwsIHJvdXRlLCByZXF1ZXN0LCBjb25maWcpO1xuICBpZiAoc3NyQ2FjaGVDb25maWcpIHtcbiAgICBhcHBseUNhY2hlSGVhZGVycyhyZXBseSwgc3NyQ2FjaGVDb25maWcpO1xuICB9XG5cbiAgcmV0dXJuIGZpbmFsSHRtbDtcbn1cblxuLyoqXG4gKiBTU1Ig7J2R64u17JeQIOyggeyaqe2VoCBDYWNoZS1Db250cm9sIOyEpOygleydhCDqsrDsoJXtlanri4jri6QuXG4gKiDsmrDshKDsiJzsnIQ6IOqwnOuzhCDsp4DsoJUgPiBjYWNoZUNvbnRyb2xIYW5kbGVyXG4gKi9cbmZ1bmN0aW9uIGdldFNTUkNhY2hlQ29udHJvbChcbiAgdXJsOiBzdHJpbmcsXG4gIHJvdXRlOiBTU1JSb3V0ZSxcbiAgcmVxdWVzdDogRmFzdGlmeVJlcXVlc3QsXG4gIGNvbmZpZzogU29uYW11RmFzdGlmeUNvbmZpZyxcbikge1xuICAvLyDqsJzrs4Qg7KeA7KCVIChyZWdpc3RlclNTUi5jYWNoZUNvbnRyb2wpXG4gIGlmIChyb3V0ZS5jYWNoZUNvbnRyb2wpIHtcbiAgICByZXR1cm4gcm91dGUuY2FjaGVDb250cm9sO1xuICB9XG5cbiAgLy8g7KCE7JetIO2VuOuTpOufrFxuICBpZiAoY29uZmlnLmNhY2hlQ29udHJvbEhhbmRsZXIpIHtcbiAgICBjb25zdCBjYWNoZVJlcTogQ2FjaGVDb250cm9sUmVxdWVzdCA9IHtcbiAgICAgIHR5cGU6IFwic3NyXCIsXG4gICAgICB1cmw6IHJlcXVlc3QudXJsLFxuICAgICAgcGF0aDogdXJsLnNwbGl0KFwiP1wiKVswXSxcbiAgICAgIG1ldGhvZDogcmVxdWVzdC5tZXRob2QsXG4gICAgICByb3V0ZSxcbiAgICB9O1xuICAgIGNvbnN0IHJlc3VsdCA9IGNvbmZpZy5jYWNoZUNvbnRyb2xIYW5kbGVyKGNhY2hlUmVxKTtcbiAgICBpZiAocmVzdWx0KSByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgcmV0dXJuIG51bGw7XG59XG5cbi8qKlxuICogSFRNTOyXkOyEnCA8c2NyaXB0PiwgPGxpbms+IO2DnOq3uOulvCDstpTstpxcbiAqL1xuZnVuY3Rpb24gZXh0cmFjdFNjcmlwdFRhZ3MoaHRtbDogc3RyaW5nKTogc3RyaW5nIHtcbiAgY29uc3Qgc2NyaXB0UmVnZXggPSAvPHNjcmlwdFtePl0qPltcXHNcXFNdKj88XFwvc2NyaXB0Pnw8bGlua1tePl0qPi9naTtcbiAgY29uc3QgbWF0Y2hlcyA9IGh0bWwubWF0Y2goc2NyaXB0UmVnZXgpIHx8IFtdO1xuICByZXR1cm4gbWF0Y2hlcy5qb2luKFwiXFxuXCIpO1xufVxuIl0sIm1hcHBpbmdzIjoiOzs7O0FBVUEsZUFBc0IsVUFDcEIsS0FDQSxPQUNBLFFBQ0EsU0FDQSxPQUNBLFFBQ0EsTUFDaUI7Q0FDakIsTUFBTSxFQUFFLFdBQVcsTUFBTSxPQUFPO0NBR2hDLE1BQU0sZ0JBQWdCLE1BQU0sVUFBVSxNQUFNLFFBQVEsTUFBTSxJQUFJLENBQUM7Q0FDL0QsTUFBTSxnQkFBaUMsQ0FBQztDQUV4QyxLQUFLLE1BQU0sRUFBRSxXQUFXLFlBQVksUUFBUSxXQUFXLGdCQUFnQixlQUFlO0VBQ3BGLE1BQU0sTUFBTSxPQUFPLE9BQU8sS0FBSyxNQUM1QixNQUFNLEVBQUUsY0FBYyxhQUFhLEVBQUUsZUFBZSxVQUN2RDtFQUVBLElBQUksQ0FBQyxLQUFLO0dBQ1IsUUFBUSxLQUFLLGtCQUFrQixVQUFVLEdBQUcsWUFBWTtHQUN4RDtFQUNGO0VBRUEsSUFBSTtHQUNGLE1BQU0sU0FBUyxNQUFNLE9BQU8sZ0JBQWdCLEtBQUssV0FBVyxRQUFRLFNBQVMsS0FBSztHQUNsRixjQUFjLEtBQUs7SUFDakIsVUFBVSxDQUFDLEdBQUcsWUFBWSxHQUFHLFNBQVM7SUFDdEMsTUFBTTtHQUNSLENBQUM7RUFDSCxTQUFTLEdBQUc7R0FDVixRQUFRLE1BQU0scUJBQXFCLFVBQVUsR0FBRyxXQUFXLElBQUksQ0FBQztFQUNsRTtDQUNGO0NBR0EsSUFBSTtDQUNKLElBQUk7Q0FLSixJQUFJLE1BQU07RUFFUixNQUFNLEtBQUssTUFBTSxPQUFPO0VBQ3hCLE1BQU0sZ0JBQWdCLEtBQUssS0FBSyxLQUFLLE9BQU8sTUFBTSxZQUFZO0VBQzlELE1BQU0sZUFBZSxNQUFNLEdBQUcsU0FBUyxlQUFlLE9BQU87RUFJN0QsY0FBYyxrQkFBa0IsTUFIRixLQUFLLG1CQUFtQixLQUFLLFlBQVksQ0FHeEI7RUFHL0MsVUFBUyxNQURpQixLQUFLLGNBQWMsaUNBQWlDLEVBQ3JFLENBQVk7Q0FDdkIsT0FBTztFQUVMLE1BQU0sS0FBSyxNQUFNLE9BQU87RUFDeEIsTUFBTSxjQUFjLEtBQUssS0FBSyxPQUFPLGFBQWEsWUFBWSxRQUFRO0VBQ3RFLE1BQU0sVUFBVSxLQUFLLEtBQUssT0FBTyxhQUFhLFlBQVksUUFBUTtFQUlsRSxjQUFjLGtCQURJLEdBQUcsYUFBYSxLQUFLLEtBQUssYUFBYSxZQUFZLEdBQUcsT0FDeEMsQ0FBUztFQUd6QyxVQUFTLE1BRGlCLE9BQU8sS0FBSyxLQUFLLFNBQVMsMkJBQTJCLEdBQ3RFLENBQVk7Q0FDdkI7Q0FHQSxNQUFNLEVBQUUsTUFBTSxhQUFhLG9CQUFvQixNQUFNLE9BQU8sS0FBSyxhQUFhO0NBRzlFLE1BQU0sZ0JBQWdCLGtCQUNsQixtQ0FBbUMsS0FBSyxVQUFVLGVBQWUsQ0FBQyxDQUFDLFFBQVEsTUFBTSxTQUFTLEVBQUUsZUFDNUY7Q0FHSixNQUFNLGtCQUFrQixNQUFNLGlCQUMxQiwwQ0FBMEMsS0FBSyxVQUFVLEVBQUUsZ0JBQWdCLEtBQUssQ0FBQyxFQUFFLGVBQ25GO0NBR0osTUFBTSxZQUFZLFlBQVksUUFDNUIsV0FDQSxHQUFHLGdCQUFnQixJQUFJLGNBQWMsSUFBSSxZQUFZLFVBQ3ZEO0NBR0EsTUFBTSxpQkFBaUIsbUJBQW1CLEtBQUssT0FBTyxTQUFTLE1BQU07Q0FDckUsSUFBSSxnQkFDRixrQkFBa0IsT0FBTyxjQUFjO0NBR3pDLE9BQU87QUFDVDs7Ozs7QUFNQSxTQUFTLG1CQUNQLEtBQ0EsT0FDQSxTQUNBLFFBQ0E7Q0FFQSxJQUFJLE1BQU0sY0FDUixPQUFPLE1BQU07Q0FJZixJQUFJLE9BQU8scUJBQXFCO0VBQzlCLE1BQU0sV0FBZ0M7R0FDcEMsTUFBTTtHQUNOLEtBQUssUUFBUTtHQUNiLE1BQU0sSUFBSSxNQUFNLEdBQUcsQ0FBQyxDQUFDO0dBQ3JCLFFBQVEsUUFBUTtHQUNoQjtFQUNGO0VBQ0EsTUFBTSxTQUFTLE9BQU8sb0JBQW9CLFFBQVE7RUFDbEQsSUFBSSxRQUFRLE9BQU87Q0FDckI7Q0FFQSxPQUFPO0FBQ1Q7Ozs7QUFLQSxTQUFTLGtCQUFrQixNQUFzQjtDQUcvQyxRQURnQixLQUFLLE1BQU0sK0NBQVcsS0FBSyxDQUFDLEVBQ3JDLENBQVEsS0FBSyxJQUFJO0FBQzFCOztvQkE1SWtFIn0=
83
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVuZGVyZXIuanMiLCJuYW1lcyI6W10sInNvdXJjZXMiOlsiLi4vLi4vc3JjL3Nzci9yZW5kZXJlci50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgcGF0aCBmcm9tIFwibm9kZTpwYXRoXCI7XG5cbmltcG9ydCB7IHR5cGUgRmFzdGlmeVJlcGx5LCB0eXBlIEZhc3RpZnlSZXF1ZXN0IH0gZnJvbSBcImZhc3RpZnlcIjtcbmltcG9ydCB7IHR5cGUgVml0ZURldlNlcnZlciB9IGZyb20gXCJ2aXRlXCI7XG5cbmltcG9ydCB7IGFwcGx5Q2FjaGVIZWFkZXJzIH0gZnJvbSBcIi4uL2NhY2hlLWNvbnRyb2wvY2FjaGUtY29udHJvbFwiO1xuaW1wb3J0IHsgdHlwZSBDYWNoZUNvbnRyb2xSZXF1ZXN0IH0gZnJvbSBcIi4uL2NhY2hlLWNvbnRyb2wvdHlwZXNcIjtcbmltcG9ydCB7IHR5cGUgU29uYW11RmFzdGlmeUNvbmZpZyB9IGZyb20gXCIuLi90eXBlcy90eXBlc1wiO1xuaW1wb3J0IHsgSE1SX09QVF9PVVRfU0NSSVBULCBpc0htckRpc2FibGVkQnlRdWVyeSB9IGZyb20gXCIuL2htci1vcHQtb3V0XCI7XG5pbXBvcnQgeyB0eXBlIFByZWxvYWRlZERhdGEsIHR5cGUgU1NSUm91dGUgfSBmcm9tIFwiLi90eXBlc1wiO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcmVuZGVyU1NSKFxuICB1cmw6IHN0cmluZyxcbiAgcm91dGU6IFNTUlJvdXRlLFxuICBwYXJhbXM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4sXG4gIHJlcXVlc3Q6IEZhc3RpZnlSZXF1ZXN0LFxuICByZXBseTogRmFzdGlmeVJlcGx5LFxuICBjb25maWc6IFNvbmFtdUZhc3RpZnlDb25maWcsXG4gIHZpdGU/OiBWaXRlRGV2U2VydmVyLFxuKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgY29uc3QgeyBTb25hbXUgfSA9IGF3YWl0IGltcG9ydChcIi4uL2FwaS9zb25hbXVcIik7XG5cbiAgLy8gMS4gcHJlbG9hZCDsi6Ttlokg4oaSIFNTUlF1ZXJ5W10g7ZqN65OdIChkZXYvcHJvZCDqs7XthrUpXG4gIGNvbnN0IHByZWxvYWRDb25maWcgPSByb3V0ZS5wcmVsb2FkID8gcm91dGUucHJlbG9hZChwYXJhbXMpIDogW107XG4gIGNvbnN0IHByZWxvYWRlZERhdGE6IFByZWxvYWRlZERhdGFbXSA9IFtdO1xuXG4gIGZvciAoY29uc3QgeyBtb2RlbE5hbWUsIG1ldGhvZE5hbWUsIHBhcmFtczogYXBpUGFyYW1zLCBzZXJ2aWNlS2V5IH0gb2YgcHJlbG9hZENvbmZpZykge1xuICAgIGNvbnN0IGFwaSA9IFNvbmFtdS5zeW5jZXIuYXBpcy5maW5kKFxuICAgICAgKGEpID0+IGEubW9kZWxOYW1lID09PSBtb2RlbE5hbWUgJiYgYS5tZXRob2ROYW1lID09PSBtZXRob2ROYW1lLFxuICAgICk7XG5cbiAgICBpZiAoIWFwaSkge1xuICAgICAgY29uc29sZS53YXJuKGBBUEkgbm90IGZvdW5kOiAke21vZGVsTmFtZX0uJHttZXRob2ROYW1lfWApO1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IFNvbmFtdS5pbnZva2VBcGlGb3JTU1IoYXBpLCBhcGlQYXJhbXMsIGNvbmZpZywgcmVxdWVzdCwgcmVwbHkpO1xuICAgICAgcHJlbG9hZGVkRGF0YS5wdXNoKHtcbiAgICAgICAgcXVlcnlLZXk6IFsuLi5zZXJ2aWNlS2V5LCAuLi5hcGlQYXJhbXNdLFxuICAgICAgICBkYXRhOiByZXN1bHQsXG4gICAgICB9KTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBjb25zb2xlLmVycm9yKGBGYWlsZWQgdG8gcHJlbG9hZCAke21vZGVsTmFtZX0uJHttZXRob2ROYW1lfTpgLCBlKTtcbiAgICB9XG4gIH1cblxuICAvLyAyLiBEZXYvUHJvZCDsiqTtgazrpr3tirgg7LaU7LacXG4gIGxldCB2aXRlU2NyaXB0czogc3RyaW5nO1xuICBsZXQgcmVuZGVyOiAoXG4gICAgdXJsOiBzdHJpbmcsXG4gICAgcHJlbG9hZGVkRGF0YTogUHJlbG9hZGVkRGF0YVtdLFxuICApID0+IFByb21pc2U8eyBodG1sOiBzdHJpbmc7IGRlaHlkcmF0ZWRTdGF0ZTogdW5rbm93biB9PjtcblxuICBpZiAodml0ZSkge1xuICAgIC8vIERldjogVml0ZSBEZXYgU2VydmVyXG4gICAgY29uc3QgZnMgPSBhd2FpdCBpbXBvcnQoXCJub2RlOmZzL3Byb21pc2VzXCIpO1xuICAgIGNvbnN0IGluZGV4SHRtbFBhdGggPSBwYXRoLmpvaW4odml0ZS5jb25maWcucm9vdCwgXCJpbmRleC5odG1sXCIpO1xuICAgIGNvbnN0IG9yaWdpbmFsSHRtbCA9IGF3YWl0IGZzLnJlYWRGaWxlKGluZGV4SHRtbFBhdGgsIFwidXRmLThcIik7XG4gICAgY29uc3QgdHJhbnNmb3JtZWRIdG1sID0gYXdhaXQgdml0ZS50cmFuc2Zvcm1JbmRleEh0bWwodXJsLCBvcmlnaW5hbEh0bWwpO1xuXG4gICAgLy8gVml0ZeqwgCDso7zsnoXtlZwg7Iqk7YGs66a97Yq4IOy2lOy2nFxuICAgIHZpdGVTY3JpcHRzID0gZXh0cmFjdFNjcmlwdFRhZ3ModHJhbnNmb3JtZWRIdG1sKTtcblxuICAgIC8vID9obXI9ZmFsc2XroZwg7JewIO2OmOydtOyngOuKlCBITVIg7Ju57IaM7LyT66eMIOuBiuyWtCDsg4jroZzqs6DsuajrkJjsp4Ag7JWK6rKMIO2VnOuLpC5cbiAgICBpZiAoaXNIbXJEaXNhYmxlZEJ5UXVlcnkodXJsKSkge1xuICAgICAgdml0ZVNjcmlwdHMgPSBgJHtITVJfT1BUX09VVF9TQ1JJUFR9XFxuJHt2aXRlU2NyaXB0c31gO1xuICAgIH1cblxuICAgIGNvbnN0IGVudHJ5TW9kdWxlID0gYXdhaXQgdml0ZS5zc3JMb2FkTW9kdWxlKFwiL3NyYy9lbnRyeS1zZXJ2ZXIuZ2VuZXJhdGVkLnRzeFwiKTtcbiAgICByZW5kZXIgPSBlbnRyeU1vZHVsZS5yZW5kZXI7XG4gIH0gZWxzZSB7XG4gICAgLy8gUHJvZDog67mM65Oc65CcIO2MjOydvFxuICAgIGNvbnN0IGZzID0gYXdhaXQgaW1wb3J0KFwibm9kZTpmc1wiKTtcbiAgICBjb25zdCB3ZWJEaXN0UGF0aCA9IHBhdGguam9pbihTb25hbXUuYXBpUm9vdFBhdGgsIFwid2ViLWRpc3RcIiwgXCJjbGllbnRcIik7XG4gICAgY29uc3Qgc3NyUGF0aCA9IHBhdGguam9pbihTb25hbXUuYXBpUm9vdFBhdGgsIFwid2ViLWRpc3RcIiwgXCJzZXJ2ZXJcIik7XG5cbiAgICAvLyDruYzrk5zrkJwgaW5kZXguaHRtbOyXkOyEnCDsiqTtgazrpr3tirgg7LaU7LacXG4gICAgY29uc3QgYnVpbHRIdG1sID0gZnMucmVhZEZpbGVTeW5jKHBhdGguam9pbih3ZWJEaXN0UGF0aCwgXCJpbmRleC5odG1sXCIpLCBcInV0Zi04XCIpO1xuICAgIHZpdGVTY3JpcHRzID0gZXh0cmFjdFNjcmlwdFRhZ3MoYnVpbHRIdG1sKTtcblxuICAgIGNvbnN0IGVudHJ5TW9kdWxlID0gYXdhaXQgaW1wb3J0KHBhdGguam9pbihzc3JQYXRoLCBcImVudHJ5LXNlcnZlci5nZW5lcmF0ZWQuanNcIikpO1xuICAgIHJlbmRlciA9IGVudHJ5TW9kdWxlLnJlbmRlcjtcbiAgfVxuXG4gIC8vIDMuIFJvdXRlclByb3ZpZGVyIOugjOuNlOungSAoZnVsbCBkb2N1bWVudClcbiAgY29uc3QgeyBodG1sOiBmdWxsRG9jSHRtbCwgZGVoeWRyYXRlZFN0YXRlIH0gPSBhd2FpdCByZW5kZXIodXJsLCBwcmVsb2FkZWREYXRhKTtcblxuICAvLyA0LiBTU1Ig642w7J207YSwIOyKpO2BrOumve2KuCDsg53shLFcbiAgY29uc3Qgc3NyRGF0YVNjcmlwdCA9IGRlaHlkcmF0ZWRTdGF0ZVxuICAgID8gYDxzY3JpcHQ+d2luZG93Ll9fU09OQU1VX1NTUl9fID0gJHtKU09OLnN0cmluZ2lmeShkZWh5ZHJhdGVkU3RhdGUpLnJlcGxhY2UoLzwvZywgXCJcXFxcdTAwM2NcIil9Ozwvc2NyaXB0PmBcbiAgICA6IFwiXCI7XG5cbiAgLy8gNS4gU1NSIENvbmZpZyDsiqTtgazrpr3tirgg7IOd7ISxIChkaXNhYmxlSHlkcmF0ZSlcbiAgY29uc3Qgc3NyQ29uZmlnU2NyaXB0ID0gcm91dGUuZGlzYWJsZUh5ZHJhdGVcbiAgICA/IGA8c2NyaXB0PndpbmRvdy5fX1NPTkFNVV9TU1JfQ09ORklHX18gPSAke0pTT04uc3RyaW5naWZ5KHsgZGlzYWJsZUh5ZHJhdGU6IHRydWUgfSl9Ozwvc2NyaXB0PmBcbiAgICA6IFwiXCI7XG5cbiAgLy8gNi4gVml0ZSDsiqTtgazrpr3tirjsmYAgU1NSIOuNsOydtO2EsOulvCA8L2JvZHk+IOyngeyghOyXkCDso7zsnoVcbiAgY29uc3QgZmluYWxIdG1sID0gZnVsbERvY0h0bWwucmVwbGFjZShcbiAgICBcIjwvYm9keT5cIixcbiAgICBgJHtzc3JDb25maWdTY3JpcHR9XFxuJHtzc3JEYXRhU2NyaXB0fVxcbiR7dml0ZVNjcmlwdHN9XFxuPC9ib2R5PmAsXG4gICk7XG5cbiAgLy8gNy4gQ2FjaGUtQ29udHJvbCDtl6TrjZQg7ISk7KCVXG4gIGNvbnN0IHNzckNhY2hlQ29uZmlnID0gZ2V0U1NSQ2FjaGVDb250cm9sKHVybCwgcm91dGUsIHJlcXVlc3QsIGNvbmZpZyk7XG4gIGlmIChzc3JDYWNoZUNvbmZpZykge1xuICAgIGFwcGx5Q2FjaGVIZWFkZXJzKHJlcGx5LCBzc3JDYWNoZUNvbmZpZyk7XG4gIH1cblxuICByZXR1cm4gZmluYWxIdG1sO1xufVxuXG4vKipcbiAqIFNTUiDsnZHri7Xsl5Ag7KCB7Jqp7ZWgIENhY2hlLUNvbnRyb2wg7ISk7KCV7J2EIOqysOygle2VqeuLiOuLpC5cbiAqIOyasOyEoOyInOychDog6rCc67OEIOyngOyglSA+IGNhY2hlQ29udHJvbEhhbmRsZXJcbiAqL1xuZnVuY3Rpb24gZ2V0U1NSQ2FjaGVDb250cm9sKFxuICB1cmw6IHN0cmluZyxcbiAgcm91dGU6IFNTUlJvdXRlLFxuICByZXF1ZXN0OiBGYXN0aWZ5UmVxdWVzdCxcbiAgY29uZmlnOiBTb25hbXVGYXN0aWZ5Q29uZmlnLFxuKSB7XG4gIC8vIOqwnOuzhCDsp4DsoJUgKHJlZ2lzdGVyU1NSLmNhY2hlQ29udHJvbClcbiAgaWYgKHJvdXRlLmNhY2hlQ29udHJvbCkge1xuICAgIHJldHVybiByb3V0ZS5jYWNoZUNvbnRyb2w7XG4gIH1cblxuICAvLyDsoITsl60g7ZW465Ok65+sXG4gIGlmIChjb25maWcuY2FjaGVDb250cm9sSGFuZGxlcikge1xuICAgIGNvbnN0IGNhY2hlUmVxOiBDYWNoZUNvbnRyb2xSZXF1ZXN0ID0ge1xuICAgICAgdHlwZTogXCJzc3JcIixcbiAgICAgIHVybDogcmVxdWVzdC51cmwsXG4gICAgICBwYXRoOiB1cmwuc3BsaXQoXCI/XCIpWzBdLFxuICAgICAgbWV0aG9kOiByZXF1ZXN0Lm1ldGhvZCxcbiAgICAgIHJvdXRlLFxuICAgIH07XG4gICAgY29uc3QgcmVzdWx0ID0gY29uZmlnLmNhY2hlQ29udHJvbEhhbmRsZXIoY2FjaGVSZXEpO1xuICAgIGlmIChyZXN1bHQpIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICByZXR1cm4gbnVsbDtcbn1cblxuLyoqXG4gKiBIVE1M7JeQ7IScIDxzY3JpcHQ+LCA8bGluaz4g7YOc6re466W8IOy2lOy2nFxuICovXG5mdW5jdGlvbiBleHRyYWN0U2NyaXB0VGFncyhodG1sOiBzdHJpbmcpOiBzdHJpbmcge1xuICBjb25zdCBzY3JpcHRSZWdleCA9IC88c2NyaXB0W14+XSo+W1xcc1xcU10qPzxcXC9zY3JpcHQ+fDxsaW5rW14+XSo+L2dpO1xuICBjb25zdCBtYXRjaGVzID0gaHRtbC5tYXRjaChzY3JpcHRSZWdleCkgfHwgW107XG4gIHJldHVybiBtYXRjaGVzLmpvaW4oXCJcXG5cIik7XG59XG4iXSwibWFwcGluZ3MiOiI7Ozs7O0FBV0EsZUFBc0IsVUFDcEIsS0FDQSxPQUNBLFFBQ0EsU0FDQSxPQUNBLFFBQ0EsTUFDaUI7Q0FDakIsTUFBTSxFQUFFLFdBQVcsTUFBTSxPQUFPO0NBR2hDLE1BQU0sZ0JBQWdCLE1BQU0sVUFBVSxNQUFNLFFB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