sonamu 0.12.0 → 0.13.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (275) hide show
  1. package/dist/_virtual/_rolldown/runtime.js +1 -2
  2. package/dist/ai/agents/agent.js +2 -3
  3. package/dist/ai/agents/index.js +1 -2
  4. package/dist/ai/index.js +1 -2
  5. package/dist/ai/providers/rtzr/api.js +1 -2
  6. package/dist/ai/providers/rtzr/error.js +2 -3
  7. package/dist/ai/providers/rtzr/model.js +1 -2
  8. package/dist/ai/providers/rtzr/options.js +1 -2
  9. package/dist/ai/providers/rtzr/provider.js +1 -2
  10. package/dist/ai/providers/rtzr/utils.js +1 -2
  11. package/dist/api/base-frame.js +4 -4
  12. package/dist/api/caster.d.ts +1 -1
  13. package/dist/api/caster.d.ts.map +1 -1
  14. package/dist/api/caster.js +9 -9
  15. package/dist/api/code-converters.js +6 -5
  16. package/dist/api/config.d.ts +1 -1
  17. package/dist/api/config.d.ts.map +1 -1
  18. package/dist/api/config.js +2 -3
  19. package/dist/api/context.d.ts +2 -3
  20. package/dist/api/context.d.ts.map +1 -1
  21. package/dist/api/context.js +2 -3
  22. package/dist/api/decorators.js +2 -3
  23. package/dist/api/http-validator.js +2 -3
  24. package/dist/api/index.js +8 -3
  25. package/dist/api/secret.js +1 -2
  26. package/dist/api/sonamu.d.ts +3 -5
  27. package/dist/api/sonamu.d.ts.map +1 -1
  28. package/dist/api/sonamu.js +19 -18
  29. package/dist/api/validator.js +1 -2
  30. package/dist/api/websocket-helpers.js +2 -3
  31. package/dist/auth/audit-log/builders.js +1 -2
  32. package/dist/auth/audit-log/client-ip.js +2 -3
  33. package/dist/auth/audit-log/events.js +1 -2
  34. package/dist/auth/audit-log/plugin.d.ts.map +1 -1
  35. package/dist/auth/audit-log/plugin.js +2 -3
  36. package/dist/auth/audit-log-ingestor.js +2 -3
  37. package/dist/auth/auth-generator.js +2 -3
  38. package/dist/auth/better-auth-entities.js +1 -2
  39. package/dist/auth/better-auth-request.js +2 -3
  40. package/dist/auth/index.js +2 -3
  41. package/dist/auth/knex-adapter.js +2 -3
  42. package/dist/auth/plugins/entity-definitions/admin.js +1 -2
  43. package/dist/auth/plugins/entity-definitions/anonymous.js +1 -2
  44. package/dist/auth/plugins/entity-definitions/api-key.js +1 -2
  45. package/dist/auth/plugins/entity-definitions/audit-log.js +1 -2
  46. package/dist/auth/plugins/entity-definitions/index.js +1 -2
  47. package/dist/auth/plugins/entity-definitions/jwt.js +1 -2
  48. package/dist/auth/plugins/entity-definitions/organization.js +1 -2
  49. package/dist/auth/plugins/entity-definitions/passkey.js +1 -2
  50. package/dist/auth/plugins/entity-definitions/phone-number.js +1 -2
  51. package/dist/auth/plugins/entity-definitions/sso.js +1 -2
  52. package/dist/auth/plugins/entity-definitions/two-factor.js +1 -2
  53. package/dist/auth/plugins/entity-definitions/username.js +1 -2
  54. package/dist/auth/plugins/wrappers/admin.d.ts +33 -32
  55. package/dist/auth/plugins/wrappers/admin.d.ts.map +1 -1
  56. package/dist/auth/plugins/wrappers/admin.js +2 -3
  57. package/dist/auth/plugins/wrappers/anonymous.js +2 -3
  58. package/dist/auth/plugins/wrappers/api-key.js +2 -3
  59. package/dist/auth/plugins/wrappers/jwt.js +2 -3
  60. package/dist/auth/plugins/wrappers/organization.js +2 -3
  61. package/dist/auth/plugins/wrappers/passkey.js +2 -3
  62. package/dist/auth/plugins/wrappers/phone-number.d.ts +43 -1
  63. package/dist/auth/plugins/wrappers/phone-number.d.ts.map +1 -1
  64. package/dist/auth/plugins/wrappers/phone-number.js +2 -3
  65. package/dist/auth/plugins/wrappers/sso.d.ts +138 -187
  66. package/dist/auth/plugins/wrappers/sso.d.ts.map +1 -1
  67. package/dist/auth/plugins/wrappers/sso.js +1 -2
  68. package/dist/auth/plugins/wrappers/two-factor.d.ts +51 -10
  69. package/dist/auth/plugins/wrappers/two-factor.d.ts.map +1 -1
  70. package/dist/auth/plugins/wrappers/two-factor.js +2 -3
  71. package/dist/auth/plugins/wrappers/username.d.ts +39 -5
  72. package/dist/auth/plugins/wrappers/username.d.ts.map +1 -1
  73. package/dist/auth/plugins/wrappers/username.js +2 -3
  74. package/dist/bin/build-config.js +5 -5
  75. package/dist/bin/compiler-policy.js +2 -3
  76. package/dist/bin/fixture.js +7 -5
  77. package/dist/bin/hmr-hook-register.js +1 -2
  78. package/dist/bin/migrate-targets.js +2 -3
  79. package/dist/bin/test-command.js +2 -3
  80. package/dist/bin/ts-loader-register.js +2 -3
  81. package/dist/bin/ts-loader-registration.js +2 -3
  82. package/dist/bin/typecheck-web.js +2 -3
  83. package/dist/cache/cache-manager.js +1 -2
  84. package/dist/cache/decorator.js +2 -3
  85. package/dist/cache/drivers.js +1 -2
  86. package/dist/cache/index.js +2 -3
  87. package/dist/cache-control/cache-control.js +1 -2
  88. package/dist/code-formatting/index.js +2 -3
  89. package/dist/code-formatting/oxfmt.js +2 -3
  90. package/dist/code-formatting/oxlint.js +2 -3
  91. package/dist/compress/compress.js +1 -2
  92. package/dist/compress/index.js +2 -2
  93. package/dist/compress/types.d.ts +1 -1
  94. package/dist/compress/types.d.ts.map +1 -1
  95. package/dist/cone/cone-generator.js +2 -3
  96. package/dist/database/_batch_update.js +1 -2
  97. package/dist/database/base-model.js +4 -4
  98. package/dist/database/db.js +4 -4
  99. package/dist/database/knex.js +2 -3
  100. package/dist/database/puri-wrapper.js +2 -3
  101. package/dist/database/puri.js +23 -22
  102. package/dist/database/puri.types.js +1 -2
  103. package/dist/database/transaction-context.js +1 -2
  104. package/dist/database/upsert-builder.js +2 -3
  105. package/dist/dict/en.js +2 -3
  106. package/dist/dict/index.js +3 -3
  107. package/dist/dict/ko.js +2 -3
  108. package/dist/dict/rc-keys.js +1 -2
  109. package/dist/dict/sd.js +2 -3
  110. package/dist/dict/sonamu-dictionary.js +7 -6
  111. package/dist/dict/utils.js +2 -3
  112. package/dist/entity/entity-manager.d.ts +66 -66
  113. package/dist/entity/entity-manager.js +4 -4
  114. package/dist/entity/entity-template-cone.js +2 -3
  115. package/dist/entity/entity.js +21 -18
  116. package/dist/env.js +1 -2
  117. package/dist/exceptions/error-handler.d.ts.map +1 -1
  118. package/dist/exceptions/error-handler.js +2 -3
  119. package/dist/exceptions/so-exceptions.js +2 -3
  120. package/dist/filter/index.js +3 -2
  121. package/dist/filter/types.js +1 -2
  122. package/dist/filter/utils.js +7 -6
  123. package/dist/index.js +39 -5
  124. package/dist/logger/category.js +2 -3
  125. package/dist/logger/configure.js +5 -5
  126. package/dist/migration/code-generation.js +23 -16
  127. package/dist/migration/index-where-predicate.js +2 -3
  128. package/dist/migration/migration-set.js +2 -3
  129. package/dist/migration/migrator.js +2 -3
  130. package/dist/migration/postgresql-schema-reader.js +6 -9
  131. package/dist/migration/slack-confirm.js +2 -3
  132. package/dist/naite/naite-reporter.js +2 -3
  133. package/dist/naite/naite.js +10 -8
  134. package/dist/runtime-type.js +2 -3
  135. package/dist/ssr/hmr-opt-out.js +1 -2
  136. package/dist/ssr/index.js +7 -4
  137. package/dist/ssr/registry.js +1 -2
  138. package/dist/ssr/renderer.js +2 -3
  139. package/dist/storage/base-file.js +1 -2
  140. package/dist/storage/buffered-file.js +2 -3
  141. package/dist/storage/drivers.js +1 -2
  142. package/dist/storage/index.js +2 -3
  143. package/dist/storage/s3-driver.js +1 -2
  144. package/dist/storage/storage-manager.js +2 -3
  145. package/dist/storage/uploaded-file.js +2 -3
  146. package/dist/stream/__tests__/ws-test-helpers.js +2 -3
  147. package/dist/stream/index.js +11 -2
  148. package/dist/stream/sse.js +1 -2
  149. package/dist/stream/ws-audience-resolver.js +2 -3
  150. package/dist/stream/ws-audience.js +1 -2
  151. package/dist/stream/ws-cluster-bus.js +1 -2
  152. package/dist/stream/ws-delivery.js +2 -3
  153. package/dist/stream/ws-frame.js +1 -2
  154. package/dist/stream/ws-local-connection-store.js +2 -3
  155. package/dist/stream/ws-presence-index.js +1 -2
  156. package/dist/stream/ws-presence-store.js +2 -3
  157. package/dist/stream/ws-registry.js +2 -3
  158. package/dist/stream/ws-session-id.js +1 -2
  159. package/dist/stream/ws-telemetry-memory.js +3 -4
  160. package/dist/stream/ws-telemetry-trace.js +1 -2
  161. package/dist/stream/ws-telemetry.js +2 -3
  162. package/dist/stream/ws.js +2 -3
  163. package/dist/syncer/api-parser.js +2 -3
  164. package/dist/syncer/checksum.js +4 -4
  165. package/dist/syncer/code-generator.js +4 -4
  166. package/dist/syncer/entity-operations.js +2 -3
  167. package/dist/syncer/event-batcher.js +1 -2
  168. package/dist/syncer/file-copy.js +2 -3
  169. package/dist/syncer/file-patterns.js +2 -3
  170. package/dist/syncer/file-tracking.js +2 -3
  171. package/dist/syncer/filesystem-dependencies.js +1 -2
  172. package/dist/syncer/index.js +8 -2
  173. package/dist/syncer/module-loader.js +8 -6
  174. package/dist/syncer/syncer-actions.js +8 -7
  175. package/dist/syncer/syncer.js +13 -8
  176. package/dist/syncer/watcher.js +2 -3
  177. package/dist/tasks/decorator.js +1 -2
  178. package/dist/tasks/step-wrapper.js +2 -3
  179. package/dist/tasks/workflow-manager.js +2 -3
  180. package/dist/template/entity-converter.js +17 -16
  181. package/dist/template/helpers.js +2 -3
  182. package/dist/template/implementations/entity.template.js +2 -3
  183. package/dist/template/implementations/entry-server.template.js +2 -3
  184. package/dist/template/implementations/generated.template.js +2 -3
  185. package/dist/template/implementations/generated_http.template.js +6 -6
  186. package/dist/template/implementations/generated_sso.template.js +2 -3
  187. package/dist/template/implementations/http_validators.template.js +2 -3
  188. package/dist/template/implementations/init_types.template.js +2 -3
  189. package/dist/template/implementations/model.template.js +4 -4
  190. package/dist/template/implementations/model_test.template.js +2 -3
  191. package/dist/template/implementations/queries.template.js +2 -3
  192. package/dist/template/implementations/sd.template.js +2 -3
  193. package/dist/template/implementations/services.template.js +2 -3
  194. package/dist/template/implementations/view_form.template.js +12 -9
  195. package/dist/template/implementations/view_id_all_select.template.js +2 -3
  196. package/dist/template/implementations/view_list.template.d.ts.map +1 -1
  197. package/dist/template/implementations/view_list.template.js +19 -17
  198. package/dist/template/implementations/view_search_input.template.js +2 -3
  199. package/dist/template/index.js +9 -3
  200. package/dist/template/template-manager.js +2 -3
  201. package/dist/template/template-types.js +1 -2
  202. package/dist/template/template.js +2 -3
  203. package/dist/template/zod-converter.js +54 -47
  204. package/dist/testing/_relation-graph.js +2 -3
  205. package/dist/testing/bootstrap.js +2 -3
  206. package/dist/testing/data-explorer.js +2 -3
  207. package/dist/testing/dev-test-routes.js +2 -3
  208. package/dist/testing/dev-vitest-manager.js +15 -12
  209. package/dist/testing/faker-mappings.js +1 -2
  210. package/dist/testing/filesystem.js +2 -3
  211. package/dist/testing/fixture-generator.js +2 -3
  212. package/dist/testing/fixture-loader.js +1 -2
  213. package/dist/testing/fixture-manager.js +12 -9
  214. package/dist/testing/global-setup.js +5 -5
  215. package/dist/testing/index.js +6 -3
  216. package/dist/testing/naite-vitest-reporter.js +1 -2
  217. package/dist/testing/parallel-db-manager.js +2 -3
  218. package/dist/testing/vitest-helpers.js +2 -3
  219. package/dist/tooling/__tests__/helpers/sonamu-test-root.js +2 -3
  220. package/dist/tooling/cdd-service.js +1 -2
  221. package/dist/tooling/cli-tooling.js +1 -2
  222. package/dist/tooling/fixture-service.js +1 -2
  223. package/dist/tooling/index.js +1 -2
  224. package/dist/tooling/test-run-client.js +2 -3
  225. package/dist/tsdown.api.config.js +1 -2
  226. package/dist/types/types.js +2 -3
  227. package/dist/ui/ai-api.d.ts.map +1 -1
  228. package/dist/ui/ai-api.js +4 -5
  229. package/dist/ui/ai-client.d.ts +2 -2
  230. package/dist/ui/ai-client.d.ts.map +1 -1
  231. package/dist/ui/ai-client.js +9 -8
  232. package/dist/ui/api.d.ts.map +1 -1
  233. package/dist/ui/api.js +11 -8
  234. package/dist/ui/async-route.js +1 -2
  235. package/dist/ui/cdd-service.js +22 -21
  236. package/dist/ui/migrations-api.js +6 -5
  237. package/dist/ui-web/assets/index-QDMyy31K.js +180 -0
  238. package/dist/ui-web/assets/index-dV7akMFB.css +1 -0
  239. package/dist/ui-web/index.html +2 -2
  240. package/dist/utils/async-utils.js +1 -2
  241. package/dist/utils/class-name.js +1 -2
  242. package/dist/utils/console-util.js +1 -2
  243. package/dist/utils/controller.js +2 -3
  244. package/dist/utils/esm-utils.js +1 -2
  245. package/dist/utils/fs-utils.js +2 -3
  246. package/dist/utils/lodash-able.js +1 -2
  247. package/dist/utils/model.js +1 -2
  248. package/dist/utils/object-utils.js +2 -3
  249. package/dist/utils/path-utils.js +2 -3
  250. package/dist/utils/process-utils.js +2 -3
  251. package/dist/utils/runtime-value.js +1 -2
  252. package/dist/utils/sql-parser.js +2 -3
  253. package/dist/utils/type-utils.js +8 -8
  254. package/dist/utils/utils.js +2 -3
  255. package/dist/utils/zod-error.js +2 -3
  256. package/dist/vector/chunking.js +1 -2
  257. package/dist/vector/config.js +1 -2
  258. package/dist/vector/embedding.js +4 -4
  259. package/package.json +63 -63
  260. package/src/ai/agents/agent.ts +1 -1
  261. package/src/api/__tests__/sonamu.plugins.test.ts +11 -1
  262. package/src/api/__tests__/sonamu.websocket.test.ts +6 -10
  263. package/src/api/config.ts +1 -1
  264. package/src/api/context.ts +2 -8
  265. package/src/api/sonamu.ts +26 -21
  266. package/src/auth/audit-log/plugin.ts +2 -0
  267. package/src/compress/types.ts +1 -1
  268. package/src/exceptions/error-handler.ts +3 -2
  269. package/src/template/implementations/model.template.ts +3 -3
  270. package/src/template/implementations/view_list.template.ts +12 -13
  271. package/src/ui/ai-api.ts +4 -2
  272. package/src/ui/ai-client.ts +2 -2
  273. package/src/ui/api.ts +58 -62
  274. package/dist/ui-web/assets/index-BMdIyKXS.css +0 -1
  275. package/dist/ui-web/assets/index-LpE8u19O.js +0 -178
@@ -66,7 +66,13 @@ declare class EntityManagerClass {
66
66
  config?: unknown;
67
67
  } | undefined;
68
68
  } | undefined;
69
- type: "bigInteger" | "bigInteger[]" | "boolean" | "boolean[]" | "integer" | "integer[]" | "tsvector" | "uuid" | "uuid[]";
69
+ type: "relation";
70
+ with: string;
71
+ relationType: "BelongsToOne";
72
+ customJoinClause?: string | undefined;
73
+ useConstraint?: boolean | undefined;
74
+ onUpdate?: "CASCADE" | "NO ACTION" | "RESTRICT" | "SET DEFAULT" | "SET NULL" | undefined;
75
+ onDelete?: "CASCADE" | "NO ACTION" | "RESTRICT" | "SET DEFAULT" | "SET NULL" | undefined;
70
76
  } | {
71
77
  name: string;
72
78
  desc?: string | undefined;
@@ -95,9 +101,11 @@ declare class EntityManagerClass {
95
101
  config?: unknown;
96
102
  } | undefined;
97
103
  } | undefined;
98
- type: "string";
99
- length?: number | undefined;
100
- zodFormat?: "base64" | "base64url" | "cidrv4" | "cidrv6" | "cuid" | "cuid2" | "email" | "emoji" | "hashMd5" | "hashSha1" | "hashSha256" | "hashSha384" | "hashSha512" | "hex" | "hostname" | "httpUrl" | "ipv4" | "ipv6" | "isoDate" | "isoDatetime" | "isoDuration" | "isoTime" | "jwt" | "mac" | "nanoid" | "ulid" | "url" | "uuid" | undefined;
104
+ type: "relation";
105
+ with: string;
106
+ relationType: "HasMany";
107
+ joinColumn: string;
108
+ fromColumn?: string | undefined;
101
109
  } | {
102
110
  name: string;
103
111
  desc?: string | undefined;
@@ -126,9 +134,12 @@ declare class EntityManagerClass {
126
134
  config?: unknown;
127
135
  } | undefined;
128
136
  } | undefined;
129
- type: "string[]";
130
- length?: number | undefined;
131
- zodFormat?: "base64" | "base64url" | "cidrv4" | "cidrv6" | "cuid" | "cuid2" | "email" | "emoji" | "hashMd5" | "hashSha1" | "hashSha256" | "hashSha384" | "hashSha512" | "hex" | "hostname" | "httpUrl" | "ipv4" | "ipv6" | "isoDate" | "isoDatetime" | "isoDuration" | "isoTime" | "jwt" | "mac" | "nanoid" | "ulid" | "url" | "uuid" | undefined;
137
+ type: "relation";
138
+ with: string;
139
+ relationType: "ManyToMany";
140
+ joinTable: string;
141
+ onUpdate: "CASCADE" | "NO ACTION" | "RESTRICT" | "SET DEFAULT" | "SET NULL";
142
+ onDelete: "CASCADE" | "NO ACTION" | "RESTRICT" | "SET DEFAULT" | "SET NULL";
132
143
  } | {
133
144
  name: string;
134
145
  desc?: string | undefined;
@@ -157,9 +168,14 @@ declare class EntityManagerClass {
157
168
  config?: unknown;
158
169
  } | undefined;
159
170
  } | undefined;
160
- type: "enum";
161
- id: string;
162
- length?: number | undefined;
171
+ type: "relation";
172
+ with: string;
173
+ relationType: "OneToOne";
174
+ customJoinClause?: string | undefined;
175
+ hasJoinColumn?: boolean | undefined;
176
+ useConstraint?: boolean | undefined;
177
+ onUpdate?: "CASCADE" | "NO ACTION" | "RESTRICT" | "SET DEFAULT" | "SET NULL" | undefined;
178
+ onDelete?: "CASCADE" | "NO ACTION" | "RESTRICT" | "SET DEFAULT" | "SET NULL" | undefined;
163
179
  } | {
164
180
  name: string;
165
181
  desc?: string | undefined;
@@ -188,8 +204,7 @@ declare class EntityManagerClass {
188
204
  config?: unknown;
189
205
  } | undefined;
190
206
  } | undefined;
191
- type: "enum[]";
192
- id: string;
207
+ type: "bigInteger" | "bigInteger[]" | "boolean" | "boolean[]" | "integer" | "integer[]" | "tsvector" | "uuid" | "uuid[]";
193
208
  } | {
194
209
  name: string;
195
210
  desc?: string | undefined;
@@ -218,10 +233,9 @@ declare class EntityManagerClass {
218
233
  config?: unknown;
219
234
  } | undefined;
220
235
  } | undefined;
221
- precision?: number | undefined;
222
- scale?: number | undefined;
223
- type: "number";
224
- numberType?: "double precision" | "numeric" | "real" | undefined;
236
+ type: "string";
237
+ length?: number | undefined;
238
+ zodFormat?: "base64" | "base64url" | "cidrv4" | "cidrv6" | "cuid" | "cuid2" | "email" | "emoji" | "hashMd5" | "hashSha1" | "hashSha256" | "hashSha384" | "hashSha512" | "hex" | "hostname" | "httpUrl" | "ipv4" | "ipv6" | "isoDate" | "isoDatetime" | "isoDuration" | "isoTime" | "jwt" | "mac" | "nanoid" | "ulid" | "url" | "uuid" | undefined;
225
239
  } | {
226
240
  name: string;
227
241
  desc?: string | undefined;
@@ -250,10 +264,9 @@ declare class EntityManagerClass {
250
264
  config?: unknown;
251
265
  } | undefined;
252
266
  } | undefined;
253
- precision?: number | undefined;
254
- scale?: number | undefined;
255
- type: "number[]";
256
- numberType?: "double precision" | "numeric" | "real" | undefined;
267
+ type: "string[]";
268
+ length?: number | undefined;
269
+ zodFormat?: "base64" | "base64url" | "cidrv4" | "cidrv6" | "cuid" | "cuid2" | "email" | "emoji" | "hashMd5" | "hashSha1" | "hashSha256" | "hashSha384" | "hashSha512" | "hex" | "hostname" | "httpUrl" | "ipv4" | "ipv6" | "isoDate" | "isoDatetime" | "isoDuration" | "isoTime" | "jwt" | "mac" | "nanoid" | "ulid" | "url" | "uuid" | undefined;
257
270
  } | {
258
271
  name: string;
259
272
  desc?: string | undefined;
@@ -282,8 +295,9 @@ declare class EntityManagerClass {
282
295
  config?: unknown;
283
296
  } | undefined;
284
297
  } | undefined;
285
- type: "date";
286
- precision?: number | undefined;
298
+ type: "enum";
299
+ id: string;
300
+ length?: number | undefined;
287
301
  } | {
288
302
  name: string;
289
303
  desc?: string | undefined;
@@ -312,8 +326,8 @@ declare class EntityManagerClass {
312
326
  config?: unknown;
313
327
  } | undefined;
314
328
  } | undefined;
315
- type: "date[]";
316
- precision?: number | undefined;
329
+ type: "enum[]";
330
+ id: string;
317
331
  } | {
318
332
  name: string;
319
333
  desc?: string | undefined;
@@ -344,7 +358,8 @@ declare class EntityManagerClass {
344
358
  } | undefined;
345
359
  precision?: number | undefined;
346
360
  scale?: number | undefined;
347
- type: "numeric";
361
+ type: "number";
362
+ numberType?: "double precision" | "numeric" | "real" | undefined;
348
363
  } | {
349
364
  name: string;
350
365
  desc?: string | undefined;
@@ -375,7 +390,8 @@ declare class EntityManagerClass {
375
390
  } | undefined;
376
391
  precision?: number | undefined;
377
392
  scale?: number | undefined;
378
- type: "numeric[]";
393
+ type: "number[]";
394
+ numberType?: "double precision" | "numeric" | "real" | undefined;
379
395
  } | {
380
396
  name: string;
381
397
  desc?: string | undefined;
@@ -404,8 +420,8 @@ declare class EntityManagerClass {
404
420
  config?: unknown;
405
421
  } | undefined;
406
422
  } | undefined;
407
- type: "json";
408
- id: string;
423
+ type: "date";
424
+ precision?: number | undefined;
409
425
  } | {
410
426
  name: string;
411
427
  desc?: string | undefined;
@@ -434,11 +450,8 @@ declare class EntityManagerClass {
434
450
  config?: unknown;
435
451
  } | undefined;
436
452
  } | undefined;
437
- type: "searchText";
438
- sourceColumns: {
439
- name: string;
440
- caseInsensitive?: boolean | undefined;
441
- }[];
453
+ type: "date[]";
454
+ precision?: number | undefined;
442
455
  } | {
443
456
  name: string;
444
457
  desc?: string | undefined;
@@ -467,9 +480,9 @@ declare class EntityManagerClass {
467
480
  config?: unknown;
468
481
  } | undefined;
469
482
  } | undefined;
470
- type: "virtual";
471
- id: string;
472
- virtualType?: "code" | "query" | undefined;
483
+ precision?: number | undefined;
484
+ scale?: number | undefined;
485
+ type: "numeric";
473
486
  } | {
474
487
  name: string;
475
488
  desc?: string | undefined;
@@ -498,8 +511,9 @@ declare class EntityManagerClass {
498
511
  config?: unknown;
499
512
  } | undefined;
500
513
  } | undefined;
501
- type: "vector";
502
- dimensions: number;
514
+ precision?: number | undefined;
515
+ scale?: number | undefined;
516
+ type: "numeric[]";
503
517
  } | {
504
518
  name: string;
505
519
  desc?: string | undefined;
@@ -528,8 +542,8 @@ declare class EntityManagerClass {
528
542
  config?: unknown;
529
543
  } | undefined;
530
544
  } | undefined;
531
- type: "vector[]";
532
- dimensions: number;
545
+ type: "json";
546
+ id: string;
533
547
  } | {
534
548
  name: string;
535
549
  desc?: string | undefined;
@@ -558,13 +572,11 @@ declare class EntityManagerClass {
558
572
  config?: unknown;
559
573
  } | undefined;
560
574
  } | undefined;
561
- type: "relation";
562
- with: string;
563
- relationType: "BelongsToOne";
564
- customJoinClause?: string | undefined;
565
- useConstraint?: boolean | undefined;
566
- onUpdate?: "CASCADE" | "NO ACTION" | "RESTRICT" | "SET DEFAULT" | "SET NULL" | undefined;
567
- onDelete?: "CASCADE" | "NO ACTION" | "RESTRICT" | "SET DEFAULT" | "SET NULL" | undefined;
575
+ type: "searchText";
576
+ sourceColumns: {
577
+ name: string;
578
+ caseInsensitive?: boolean | undefined;
579
+ }[];
568
580
  } | {
569
581
  name: string;
570
582
  desc?: string | undefined;
@@ -593,11 +605,9 @@ declare class EntityManagerClass {
593
605
  config?: unknown;
594
606
  } | undefined;
595
607
  } | undefined;
596
- type: "relation";
597
- with: string;
598
- relationType: "HasMany";
599
- joinColumn: string;
600
- fromColumn?: string | undefined;
608
+ type: "virtual";
609
+ id: string;
610
+ virtualType?: "code" | "query" | undefined;
601
611
  } | {
602
612
  name: string;
603
613
  desc?: string | undefined;
@@ -626,12 +636,8 @@ declare class EntityManagerClass {
626
636
  config?: unknown;
627
637
  } | undefined;
628
638
  } | undefined;
629
- type: "relation";
630
- with: string;
631
- relationType: "ManyToMany";
632
- joinTable: string;
633
- onUpdate: "CASCADE" | "NO ACTION" | "RESTRICT" | "SET DEFAULT" | "SET NULL";
634
- onDelete: "CASCADE" | "NO ACTION" | "RESTRICT" | "SET DEFAULT" | "SET NULL";
639
+ type: "vector";
640
+ dimensions: number;
635
641
  } | {
636
642
  name: string;
637
643
  desc?: string | undefined;
@@ -660,14 +666,8 @@ declare class EntityManagerClass {
660
666
  config?: unknown;
661
667
  } | undefined;
662
668
  } | undefined;
663
- type: "relation";
664
- with: string;
665
- relationType: "OneToOne";
666
- customJoinClause?: string | undefined;
667
- hasJoinColumn?: boolean | undefined;
668
- useConstraint?: boolean | undefined;
669
- onUpdate?: "CASCADE" | "NO ACTION" | "RESTRICT" | "SET DEFAULT" | "SET NULL" | undefined;
670
- onDelete?: "CASCADE" | "NO ACTION" | "RESTRICT" | "SET DEFAULT" | "SET NULL" | undefined;
669
+ type: "vector[]";
670
+ dimensions: number;
671
671
  })[];
672
672
  indexes: {
673
673
  type: "hnsw" | "index" | "ivfflat" | "unique";
@@ -10,7 +10,7 @@ import assert from "assert";
10
10
  import path from "path";
11
11
  import chalk from "chalk";
12
12
  import { glob, readFile } from "fs/promises";
13
- //#region src/entity/entity-manager.ts
13
+ // src/entity/entity-manager.ts
14
14
  function parseEntityJson(source) {
15
15
  try {
16
16
  return JSON.parse(source);
@@ -100,7 +100,8 @@ var init_entity_manager = __esmMin((() => {
100
100
  if (typeId === "SonamuFile[]") return SonamuFileArraySchema;
101
101
  const modulePath = this.modulePaths.get(typeId);
102
102
  if (!modulePath) return null;
103
- const matched = (await importMembers(path.join(explicitApiRootPath ?? Sonamu.apiRootPath, runtimePath(`dist/application/${modulePath}.js`)))).find(({ name }) => name === typeId);
103
+ const moduleFilePath = path.join(explicitApiRootPath ?? Sonamu.apiRootPath, runtimePath(`dist/application/${modulePath}.js`));
104
+ const matched = (await importMembers(moduleFilePath)).find(({ name }) => name === typeId);
104
105
  if (!matched || !(matched.value instanceof z.ZodType)) return null;
105
106
  return matched.value;
106
107
  }
@@ -198,8 +199,7 @@ var init_entity_manager = __esmMin((() => {
198
199
  };
199
200
  EntityManager = new EntityManagerClass();
200
201
  }));
201
- //#endregion
202
202
  init_entity_manager();
203
203
  export { EntityManager, init_entity_manager };
204
204
 
205
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZW50aXR5LW1hbmFnZXIuanMiLCJuYW1lcyI6W10sInNvdXJjZXMiOlsiLi4vLi4vc3JjL2VudGl0eS9lbnRpdHktbWFuYWdlci50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgYXNzZXJ0IGZyb20gXCJhc3NlcnRcIjtcbmltcG9ydCB7IGdsb2IsIHJlYWRGaWxlIH0gZnJvbSBcImZzL3Byb21pc2VzXCI7XG5pbXBvcnQgcGF0aCBmcm9tIFwicGF0aFwiO1xuXG5pbXBvcnQgY2hhbGsgZnJvbSBcImNoYWxrXCI7XG5pbXBvcnQgaW5mbGVjdGlvbiBmcm9tIFwiaW5mbGVjdGlvblwiO1xuaW1wb3J0IHsgcHJldHRpZnlFcnJvciwgeiB9IGZyb20gXCJ6b2RcIjtcblxuaW1wb3J0IHsgU29uYW11IH0gZnJvbSBcIi4uL2FwaS9zb25hbXVcIjtcbmltcG9ydCB7XG4gIEVudGl0eUpzb25TY2hlbWEsXG4gIGlzU2VhcmNoVGV4dEpzb25Tb3VyY2Vab2RUeXBlLFxuICBpc1NlYXJjaFRleHRQcm9wLFxuICBTb25hbXVGaWxlQXJyYXlTY2hlbWEsXG4gIFNvbmFtdUZpbGVTY2hlbWEsXG59IGZyb20gXCIuLi90eXBlcy90eXBlc1wiO1xuaW1wb3J0IHsgdHlwZSBFbnRpdHlJbmRleCwgdHlwZSBFbnRpdHlKc29uIH0gZnJvbSBcIi4uL3R5cGVzL3R5cGVzXCI7XG5pbXBvcnQgeyBnbG9iQXN5bmMgfSBmcm9tIFwiLi4vdXRpbHMvYXN5bmMtdXRpbHNcIjtcbmltcG9ydCB7IGltcG9ydE1lbWJlcnMgfSBmcm9tIFwiLi4vdXRpbHMvZXNtLXV0aWxzXCI7XG5pbXBvcnQgeyB0eXBlIEFic29sdXRlUGF0aCB9IGZyb20gXCIuLi91dGlscy9wYXRoLXV0aWxzXCI7XG5pbXBvcnQgeyBydW50aW1lUGF0aCB9IGZyb20gXCIuLi91dGlscy9wYXRoLXV0aWxzXCI7XG5pbXBvcnQgeyB0eXBlIEVudGl0eSB9IGZyb20gXCIuL2VudGl0eVwiO1xuXG5leHBvcnQgdHlwZSBFbnRpdHlOYW1lc1JlY29yZCA9IFJlY29yZDxcbiAgXCJmc1wiIHwgXCJmc1BsdXJhbFwiIHwgXCJjYW1lbFwiIHwgXCJjYW1lbFBsdXJhbFwiIHwgXCJjYXBpdGFsXCIgfCBcImNhcGl0YWxQbHVyYWxcIiB8IFwidXBwZXJcIiB8IFwiY29uc3RhbnRcIixcbiAgc3RyaW5nXG4+O1xuZXhwb3J0IHR5cGUgVGFibGVTcGVjID0ge1xuICBuYW1lOiBzdHJpbmc7XG4gIHVuaXF1ZUluZGV4ZXM6IEVudGl0eUluZGV4W107XG4gIGpzb25Db2x1bW5zOiBzdHJpbmdbXTtcbn07XG5cbmZ1bmN0aW9uIHBhcnNlRW50aXR5SnNvbihzb3VyY2U6IHN0cmluZykge1xuICB0cnkge1xuICAgIHJldHVybiBKU09OLnBhcnNlKHNvdXJjZSk7XG4gIH0gY2F0Y2ggKGNhdXNlKSB7XG4gICAgLy8gSlNPTiDtjIzshJwg6rOE7JW9IOuwluydmCDsmKTrpZjripQg6rWs66y4IOyYpOulmOuhnCDsoJXqt5ztmZTtlZjqs6Ag7JuQ7J247J2EIOuztOyhtO2VqeuLiOuLpC5cbiAgICBpZiAoIShjYXVzZSBpbnN0YW5jZW9mIFN5bnRheEVycm9yKSkge1xuICAgICAgdGhyb3cgbmV3IFN5bnRheEVycm9yKFwiZW50aXR5Lmpzb24g7YyM7IuxIOykkSDsmIjquLDsuZgg7JWK7J2AIOyYpOulmOqwgCDrsJzsg53tlojsirXri4jri6QuXCIsIHsgY2F1c2UgfSk7XG4gICAgfVxuICAgIHRocm93IGNhdXNlO1xuICB9XG59XG5cbmNsYXNzIEVudGl0eU1hbmFnZXJDbGFzcyB7XG4gIHByaXZhdGUgZW50aXRpZXM6IE1hcDxzdHJpbmcsIEVudGl0eT4gPSBuZXcgTWFwKCk7XG4gIHB1YmxpYyBtb2R1bGVQYXRoczogTWFwPHN0cmluZywgc3RyaW5nPiA9IG5ldyBNYXAoKTtcbiAgcHJpdmF0ZSB0YWJsZVNwZWNzOiBNYXA8c3RyaW5nLCBUYWJsZVNwZWM+ID0gbmV3IE1hcCgpO1xuICBwdWJsaWMgaXNBdXRvbG9hZGVkOiBib29sZWFuID0gZmFsc2U7XG4gIC8vIHJlbG9hZCgp6rCAIFNvbmFtdSDstIjquLDtmZQg7JeG7J2064+EIOqwmeydgCDro6jtirjrpbwg64uk7IucIOydveuPhOuhnSDrqoXsi5zsoIEgYXBpIHJvb3Trpbwg67O07KG07ZWp64uI64ukLlxuICBwcml2YXRlIGV4cGxpY2l0QXBpUm9vdFBhdGg6IHN0cmluZyB8IHVuZGVmaW5lZDtcblxuICAvLyDqsr3roZwg7KCE64us67Cb7JWEIOuqqOuToCBlbnRpdHkuanNvbiDtjIzsnbwg66Gc65OcXG4gIGFzeW5jIGF1dG9sb2FkKGRvU2lsZW50OiBib29sZWFuID0gZmFsc2UsIGV4cGxpY2l0QXBpUm9vdFBhdGg/OiBzdHJpbmcpIHtcbiAgICBpZiAodGhpcy5pc0F1dG9sb2FkZWQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5leHBsaWNpdEFwaVJvb3RQYXRoID0gZXhwbGljaXRBcGlSb290UGF0aDtcbiAgICBjb25zdCBhcGlSb290UGF0aCA9IGV4cGxpY2l0QXBpUm9vdFBhdGggPz8gU29uYW11LmFwaVJvb3RQYXRoO1xuICAgIGNvbnN0IHBhdGhQYXR0ZXJuID0gcGF0aC5qb2luKGFwaVJvb3RQYXRoLCBcIi9zcmMvYXBwbGljYXRpb24vKiovKi5lbnRpdHkuanNvblwiKTtcblxuICAgIGZvciBhd2FpdCAoY29uc3QgZmlsZSBvZiBnbG9iKHBhdGgucmVzb2x2ZShwYXRoUGF0dGVybikpKSB7XG4gICAgICBjb25zdCBqc29uID0gcGFyc2VFbnRpdHlKc29uKChhd2FpdCByZWFkRmlsZShmaWxlKSkudG9TdHJpbmcoKSk7XG5cbiAgICAgIC8vIGVudGl0eS5qc29uIOyKpO2CpOuniCDqsoDspp1cbiAgICAgIGNvbnN0IGVycm9yID0gdGhpcy5zY2hlbWFWYWxpZGF0ZShqc29uKTtcbiAgICAgIGlmIChlcnJvcikge1xuICAgICAgICBjb25zdCByZWxhdGl2ZVBhdGggPSBwYXRoLnJlbGF0aXZlKGFwaVJvb3RQYXRoLCBmaWxlKTtcbiAgICAgICAgY29uc3QgZXJyb3JNZXNzYWdlID0gcHJldHRpZnlFcnJvcihlcnJvcik7XG4gICAgICAgIGlmICghZG9TaWxlbnQpIHtcbiAgICAgICAgICBjb25zb2xlLmVycm9yKFxuICAgICAgICAgICAgY2hhbGsucmVkKGBJbnZhbGlkIGVudGl0eS5qc29uIHNjaGVtYTogJHtyZWxhdGl2ZVBhdGh9XFxuJHtjaGFsay55ZWxsb3coZXJyb3JNZXNzYWdlKX1gKSxcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGF3YWl0IHRoaXMucmVnaXN0ZXIoanNvbiwge1xuICAgICAgICBkZWZlclNlYXJjaFRleHRKc29uU291cmNlVmFsaWRhdGlvbjogdHJ1ZSxcbiAgICAgICAgYXBpUm9vdFBhdGgsXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBhd2FpdCB0aGlzLnJlZ2lzdGVyTm9uRW50aXR5VHlwZU1vZHVsZVBhdGhzKGFwaVJvb3RQYXRoKTtcbiAgICBhd2FpdCB0aGlzLnZhbGlkYXRlQWxsUmVnaXN0ZXJlZFNlYXJjaFRleHRKc29uU291cmNlcyhhcGlSb290UGF0aCk7XG5cbiAgICB0aGlzLmlzQXV0b2xvYWRlZCA9IHRydWU7XG4gIH1cblxuICBzY2hlbWFWYWxpZGF0ZTxWYWx1ZT4oanNvbjogVmFsdWUpIHtcbiAgICBjb25zdCByZXN1bHQgPSBFbnRpdHlKc29uU2NoZW1hLnNhZmVQYXJzZShqc29uKTtcbiAgICByZXR1cm4gcmVzdWx0LnN1Y2Nlc3MgPyBudWxsIDogcmVzdWx0LmVycm9yO1xuICB9XG5cbiAgYXN5bmMgcmVsb2FkKGRvU2lsZW50OiBib29sZWFuID0gZmFsc2UsIGV4cGxpY2l0QXBpUm9vdFBhdGg/OiBzdHJpbmcpIHtcbiAgICB0aGlzLmVudGl0aWVzLmNsZWFyKCk7XG4gICAgdGhpcy5tb2R1bGVQYXRocy5jbGVhcigpO1xuICAgIHRoaXMudGFibGVTcGVjcy5jbGVhcigpO1xuICAgIHRoaXMuaXNBdXRvbG9hZGVkID0gZmFsc2U7XG5cbiAgICByZXR1cm4gYXdhaXQgdGhpcy5hdXRvbG9hZChkb1NpbGVudCwgZXhwbGljaXRBcGlSb290UGF0aCA/PyB0aGlzLmV4cGxpY2l0QXBpUm9vdFBhdGgpO1xuICB9XG5cbiAgYXN5bmMgcmVnaXN0ZXIoXG4gICAganNvbjogRW50aXR5SnNvbixcbiAgICBvcHRpb25zOiB7IGRlZmVyU2VhcmNoVGV4dEpzb25Tb3VyY2VWYWxpZGF0aW9uPzogYm9vbGVhbjsgYXBpUm9vdFBhdGg/OiBzdHJpbmcgfSA9IHt9LFxuICApOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCB7IEVudGl0eSB9ID0gYXdhaXQgaW1wb3J0KFwiLi9lbnRpdHlcIik7XG4gICAgY29uc3QgZW50aXR5ID0gbmV3IEVudGl0eShqc29uKTtcbiAgICBhd2FpdCBlbnRpdHkucmVnaXN0ZXJNb2R1bGVQYXRocyhvcHRpb25zLmFwaVJvb3RQYXRoKTtcbiAgICBpZiAoIW9wdGlvbnMuZGVmZXJTZWFyY2hUZXh0SnNvblNvdXJjZVZhbGlkYXRpb24pIHtcbiAgICAgIGF3YWl0IHRoaXMudmFsaWRhdGVTZWFyY2hUZXh0SnNvblNvdXJjZXMoZW50aXR5LCBvcHRpb25zLmFwaVJvb3RQYXRoKTtcbiAgICB9XG4gICAgZW50aXR5LnJlZ2lzdGVyVGFibGVTcGVjcygpO1xuICAgIHRoaXMuZW50aXRpZXMuc2V0KGpzb24uaWQsIGVudGl0eSk7XG4gIH1cblxuICBhc3luYyB2YWxpZGF0ZUFsbFJlZ2lzdGVyZWRTZWFyY2hUZXh0SnNvblNvdXJjZXMoYXBpUm9vdFBhdGg/OiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBmb3IgKGNvbnN0IGVudGl0eSBvZiB0aGlzLmVudGl0aWVzLnZhbHVlcygpKSB7XG4gICAgICBhd2FpdCB0aGlzLnZhbGlkYXRlU2VhcmNoVGV4dEpzb25Tb3VyY2VzKGVudGl0eSwgYXBpUm9vdFBhdGgpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgdmFsaWRhdGVTZWFyY2hUZXh0SnNvblNvdXJjZXMoZW50aXR5OiBFbnRpdHksIGFwaVJvb3RQYXRoPzogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgcHJvcHNCeU5hbWUgPSBuZXcgTWFwKGVudGl0eS5wcm9wcy5tYXAoKHByb3ApID0+IFtwcm9wLm5hbWUsIHByb3BdKSk7XG5cbiAgICBmb3IgKGNvbnN0IHByb3Agb2YgZW50aXR5LnByb3BzKSB7XG4gICAgICBpZiAoIWlzU2VhcmNoVGV4dFByb3AocHJvcCkpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIGZvciAoY29uc3Qgc291cmNlIG9mIHByb3Auc291cmNlQ29sdW1ucykge1xuICAgICAgICBjb25zdCBzb3VyY2VQcm9wID0gcHJvcHNCeU5hbWUuZ2V0KHNvdXJjZS5uYW1lKTtcbiAgICAgICAgaWYgKCFzb3VyY2VQcm9wIHx8IHNvdXJjZVByb3AudHlwZSAhPT0gXCJqc29uXCIpIHtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHpvZFR5cGUgPSBhd2FpdCB0aGlzLnJlc29sdmVTZWFyY2hUZXh0SnNvblNvdXJjZVR5cGUoXG4gICAgICAgICAgZW50aXR5LFxuICAgICAgICAgIHNvdXJjZVByb3AuaWQsXG4gICAgICAgICAgYXBpUm9vdFBhdGgsXG4gICAgICAgICk7XG4gICAgICAgIGlmICghem9kVHlwZSkge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAgIGBzZWFyY2hUZXh0IHNvdXJjZSBcIiR7c291cmNlLm5hbWV9XCLsnZgganNvbiDtg4DsnoUgXCIke3NvdXJjZVByb3AuaWR9XCLsnYQo66W8KSDroZzrk5ztlaAg7IiYIOyXhuyKteuLiOuLpC5gLFxuICAgICAgICAgICk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIWlzU2VhcmNoVGV4dEpzb25Tb3VyY2Vab2RUeXBlKHpvZFR5cGUpKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICAgYHNlYXJjaFRleHQgc291cmNlIFwiJHtzb3VyY2UubmFtZX1cIuydmCBqc29uIO2DgOyehSBcIiR7c291cmNlUHJvcC5pZH1cIuydgCjripQpIHVud3JhcCDtm4Qgei5hcnJheSh6LnN0cmluZygpKSDsnbTslrTslbwg7ZWp64uI64ukLmAsXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgcmVzb2x2ZVNlYXJjaFRleHRKc29uU291cmNlVHlwZShcbiAgICBlbnRpdHk6IEVudGl0eSxcbiAgICB0eXBlSWQ6IHN0cmluZyxcbiAgICBleHBsaWNpdEFwaVJvb3RQYXRoPzogc3RyaW5nLFxuICApOiBQcm9taXNlPHouWm9kVHlwZUFueSB8IG51bGw+IHtcbiAgICBjb25zdCBsb2NhbFR5cGUgPSBlbnRpdHkudHlwZXNbdHlwZUlkXTtcbiAgICBpZiAobG9jYWxUeXBlIGluc3RhbmNlb2Ygei5ab2RUeXBlKSB7XG4gICAgICByZXR1cm4gbG9jYWxUeXBlO1xuICAgIH1cblxuICAgIGZvciAoY29uc3QgcmVnaXN0ZXJlZEVudGl0eSBvZiB0aGlzLmVudGl0aWVzLnZhbHVlcygpKSB7XG4gICAgICBjb25zdCByZWdpc3RlcmVkVHlwZSA9IHJlZ2lzdGVyZWRFbnRpdHkudHlwZXNbdHlwZUlkXTtcbiAgICAgIGlmIChyZWdpc3RlcmVkVHlwZSBpbnN0YW5jZW9mIHouWm9kVHlwZSkge1xuICAgICAgICByZXR1cm4gcmVnaXN0ZXJlZFR5cGU7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHR5cGVJZCA9PT0gXCJTb25hbXVGaWxlXCIpIHtcbiAgICAgIHJldHVybiBTb25hbXVGaWxlU2NoZW1hO1xuICAgIH1cbiAgICBpZiAodHlwZUlkID09PSBcIlNvbmFtdUZpbGVbXVwiKSB7XG4gICAgICByZXR1cm4gU29uYW11RmlsZUFycmF5U2NoZW1hO1xuICAgIH1cblxuICAgIGNvbnN0IG1vZHVsZVBhdGggPSB0aGlzLm1vZHVsZVBhdGhzLmdldCh0eXBlSWQpO1xuICAgIGlmICghbW9kdWxlUGF0aCkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgY29uc3QgbW9kdWxlRmlsZVBhdGggPSBwYXRoLmpvaW4oXG4gICAgICBleHBsaWNpdEFwaVJvb3RQYXRoID8/IFNvbmFtdS5hcGlSb290UGF0aCxcbiAgICAgIHJ1bnRpbWVQYXRoKGBkaXN0L2FwcGxpY2F0aW9uLyR7bW9kdWxlUGF0aH0uanNgKSxcbiAgICApO1xuICAgIGNvbnN0IGltcG9ydGVkTWVtYmVycyA9IGF3YWl0IGltcG9ydE1lbWJlcnM8dW5rbm93bj4obW9kdWxlRmlsZVBhdGgpO1xuICAgIGNvbnN0IG1hdGNoZWQgPSBpbXBvcnRlZE1lbWJlcnMuZmluZCgoeyBuYW1lIH0pID0+IG5hbWUgPT09IHR5cGVJZCk7XG4gICAgaWYgKCFtYXRjaGVkIHx8ICEobWF0Y2hlZC52YWx1ZSBpbnN0YW5jZW9mIHouWm9kVHlwZSkpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIHJldHVybiBtYXRjaGVkLnZhbHVlO1xuICB9XG5cbiAgZ2V0KGVudGl0eUlkOiBzdHJpbmcpOiBFbnRpdHkge1xuICAgIGNvbnN0IGVudGl0eSA9IHRoaXMuZW50aXRpZXMuZ2V0KGVudGl0eUlkKTtcbiAgICBpZiAoZW50aXR5ID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihg7KG07J6s7ZWY7KeAIOyViuuKlCBFbnRpdHkg7JqU7LKtICR7ZW50aXR5SWR9YCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGVudGl0eTtcbiAgfVxuXG4gIGdldEJ5VGFibGUodGFibGU6IHN0cmluZyk6IEVudGl0eSB7XG4gICAgY29uc3QgZW50aXR5ID0gQXJyYXkuZnJvbSh0aGlzLmVudGl0aWVzLnZhbHVlcygpKS5maW5kKFxuICAgICAgKGNhbmRpZGF0ZSkgPT4gY2FuZGlkYXRlLnRhYmxlID09PSB0YWJsZSxcbiAgICApO1xuICAgIGlmIChlbnRpdHkgPT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGDsobTsnqztlZjsp4Ag7JWK64qUIEVudGl0eSDsmpTssq0gJHt0YWJsZX1gKTtcbiAgICB9XG5cbiAgICByZXR1cm4gZW50aXR5O1xuICB9XG5cbiAgZXhpc3RzKGVudGl0eUlkOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICBjb25zdCBlbnRpdHkgPSB0aGlzLmVudGl0aWVzLmdldChlbnRpdHlJZCk7XG4gICAgcmV0dXJuIGVudGl0eSAhPT0gdW5kZWZpbmVkO1xuICB9XG5cbiAgZ2V0QWxsSWRzKCk6IHN0cmluZ1tdIHtcbiAgICByZXR1cm4gQXJyYXkuZnJvbShFbnRpdHlNYW5hZ2VyLmVudGl0aWVzLmtleXMoKSkudG9Tb3J0ZWQoKTtcbiAgfVxuXG4gIGdldEFsbEVudGl0aWVzKCk6IEVudGl0eVtdIHtcbiAgICByZXR1cm4gQXJyYXkuZnJvbSh0aGlzLmVudGl0aWVzLnZhbHVlcygpKTtcbiAgfVxuXG4gIGdldEFsbFBhcmVudElkcygpOiBzdHJpbmdbXSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0QWxsSWRzKCkuZmlsdGVyKChlbnRpdHlJZCkgPT4ge1xuICAgICAgY29uc3QgZW50aXR5ID0gdGhpcy5nZXQoZW50aXR5SWQpO1xuICAgICAgcmV0dXJuIGVudGl0eS5wYXJlbnRJZCA9PT0gdW5kZWZpbmVkO1xuICAgIH0pO1xuICB9XG5cbiAgZ2V0Q2hpbGRyZW5JZHMocGFyZW50SWQ6IHN0cmluZyk6IHN0cmluZ1tdIHtcbiAgICByZXR1cm4gdGhpcy5nZXRBbGxJZHMoKS5maWx0ZXIoKGVudGl0eUlkKSA9PiB7XG4gICAgICBjb25zdCBlbnRpdHkgPSB0aGlzLmdldChlbnRpdHlJZCk7XG4gICAgICByZXR1cm4gZW50aXR5LnBhcmVudElkID09PSBwYXJlbnRJZDtcbiAgICB9KTtcbiAgfVxuXG4gIHNldE1vZHVsZVBhdGgoa2V5OiBzdHJpbmcsIG1vZHVsZVBhdGg6IHN0cmluZyk6IHZvaWQge1xuICAgIC8vIGNvbnNvbGUuZGVidWcoY2hhbGsuY3lhbihgc2V0TW9kdWxlUGF0aCA6OiAke2tleX0gOjogJHttb2R1bGVQYXRofWApKTtcbiAgICB0aGlzLm1vZHVsZVBhdGhzLnNldChrZXksIG1vZHVsZVBhdGgpO1xuICB9XG5cbiAgZ2V0TW9kdWxlUGF0aChrZXk6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgY29uc3QgbW9kdWxlUGF0aCA9IHRoaXMubW9kdWxlUGF0aHMuZ2V0KGtleSk7XG4gICAgaWYgKG1vZHVsZVBhdGggPT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGDsobTsnqztlZjsp4Ag7JWK64qUIOuqqOuTiCDtjKjsiqQg7JqU7LKtICR7a2V5fWApO1xuICAgIH1cblxuICAgIHJldHVybiBtb2R1bGVQYXRoO1xuICB9XG5cbiAgc2V0VGFibGVTcGVjKHRhYmxlU3BlYzogVGFibGVTcGVjKSB7XG4gICAgdGhpcy50YWJsZVNwZWNzLnNldCh0YWJsZVNwZWMubmFtZSwgdGFibGVTcGVjKTtcbiAgfVxuXG4gIGdldFRhYmxlU3BlYyhrZXk6IHN0cmluZyk6IFRhYmxlU3BlYyB7XG4gICAgY29uc3QgdGFibGVTcGVjID0gdGhpcy50YWJsZVNwZWNzLmdldChrZXkpO1xuICAgIGlmICh0YWJsZVNwZWMgPT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGDsobTsnqztlZjsp4Ag7JWK64qUIO2FjOydtOu4lCDsiqTtjpkg7JqU7LKtICR7a2V5fWApO1xuICAgIH1cblxuICAgIHJldHVybiB0YWJsZVNwZWM7XG4gIH1cblxuICBnZXROYW1lc0Zyb21JZChlbnRpdHlJZDogc3RyaW5nKSB7XG4gICAgLy8gZW50aXR5SWTqsIAg64uo67O17IiYIOuPme2YlSDri6jslrTsnbgg6rK97JqwIExpc3Qg67aZ7Jes7IScIOyDneyEsVxuICAgIGNvbnN0IHBsdXJhbGl6ZWQgPVxuICAgICAgaW5mbGVjdGlvbi5wbHVyYWxpemUoZW50aXR5SWQpID09PSBlbnRpdHlJZFxuICAgICAgICA/IGAke2VudGl0eUlkfUxpc3RgXG4gICAgICAgIDogaW5mbGVjdGlvbi5wbHVyYWxpemUoZW50aXR5SWQpO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIGZzOiBpbmZsZWN0aW9uLmRhc2hlcml6ZShpbmZsZWN0aW9uLnVuZGVyc2NvcmUoZW50aXR5SWQpKS50b0xvd2VyQ2FzZSgpLFxuICAgICAgZnNQbHVyYWw6IGluZmxlY3Rpb24uZGFzaGVyaXplKGluZmxlY3Rpb24udW5kZXJzY29yZShwbHVyYWxpemVkKSkudG9Mb3dlckNhc2UoKSxcbiAgICAgIGNhbWVsOiBpbmZsZWN0aW9uLmNhbWVsaXplKGVudGl0eUlkLCB0cnVlKSxcbiAgICAgIGNhbWVsUGx1cmFsOiBpbmZsZWN0aW9uLmNhbWVsaXplKHBsdXJhbGl6ZWQsIHRydWUpLFxuICAgICAgY2FwaXRhbDogZW50aXR5SWQsXG4gICAgICBjYXBpdGFsUGx1cmFsOiBwbHVyYWxpemVkLFxuICAgICAgdXBwZXI6IGVudGl0eUlkLnRvVXBwZXJDYXNlKCksXG4gICAgICBjb25zdGFudDogaW5mbGVjdGlvbi51bmRlcnNjb3JlKGVudGl0eUlkKS50b1VwcGVyQ2FzZSgpLFxuICAgIH0gc2F0aXNmaWVzIEVudGl0eU5hbWVzUmVjb3JkO1xuICB9XG5cbiAgLyoqXG4gICAqIEVudGl0eUlk64qUIE1vZGVs7J2EIOygnOyZuO2VnCBQYXNjYWxDYXNlIOydtOumhOyeheuLiOuLpC4gKGV4LiBcIlVzZXJcIilcbiAgICogQHBhcmFtIGZpbGVQYXRoXG4gICAqIEByZXR1cm5zXG4gICAqL1xuICBnZXRFbnRpdHlJZEZyb21QYXRoKGZpbGVQYXRoOiBBYnNvbHV0ZVBhdGgpOiBzdHJpbmcge1xuICAgIGNvbnN0IGZpbGVOYW1lID0gcGF0aC5iYXNlbmFtZShmaWxlUGF0aCk7XG4gICAgY29uc3Qgc3VwcG9ydGVkU3VmZml4ZXMgPSBbXCIubW9kZWwudHNcIiwgXCIubW9kZWwuanNcIiwgXCIuZW50aXR5Lmpzb25cIiwgXCIuZnJhbWUudHNcIiwgXCIuZnJhbWUuanNcIl07XG4gICAgY29uc3QgbWF0Y2hlZFN1ZmZpeCA9IHN1cHBvcnRlZFN1ZmZpeGVzLmZpbmQoKHN1ZmZpeCkgPT4gZmlsZU5hbWUuZW5kc1dpdGgoc3VmZml4KSk7XG5cbiAgICBhc3NlcnQobWF0Y2hlZFN1ZmZpeCwgYOyngOybkO2VmOyngCDslYrripQgZW50aXR5IOqyveuhnOyeheuLiOuLpDogJHtmaWxlUGF0aH1gKTtcblxuICAgIGNvbnN0IGVudGl0eUJhc2VOYW1lID0gZmlsZU5hbWUuc2xpY2UoMCwgLW1hdGNoZWRTdWZmaXgubGVuZ3RoKTtcbiAgICBhc3NlcnQoZW50aXR5QmFzZU5hbWUubGVuZ3RoID4gMCwgYEVudGl0eUlk66W8IOqzhOyCsO2VoCDsiJgg7JeG64qUIOqyveuhnOyeheuLiOuLpDogJHtmaWxlUGF0aH1gKTtcblxuICAgIHJldHVybiBpbmZsZWN0aW9uLmNhbWVsaXplKGVudGl0eUJhc2VOYW1lLnJlcGxhY2UoLy0vZywgXCJfXCIpKTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgcmVnaXN0ZXJOb25FbnRpdHlUeXBlTW9kdWxlUGF0aHMoYXBpUm9vdFBhdGg6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHR5cGVQYXRoc1BhdHRlcm5zID0gW1xuICAgICAgcGF0aC5qb2luKGFwaVJvb3RQYXRoLCBydW50aW1lUGF0aChcInNyYy9hcHBsaWNhdGlvbi8qKi8qLnR5cGVzLnRzXCIpKSxcbiAgICAgIHBhdGguam9pbihhcGlSb290UGF0aCwgcnVudGltZVBhdGgoXCJzcmMvYXBwbGljYXRpb24vKiovKi5nZW5lcmF0ZWQudHNcIikpLFxuICAgIF07XG4gICAgY29uc3QgdHlwZVBhdGhzID0gKFxuICAgICAgYXdhaXQgUHJvbWlzZS5hbGwodHlwZVBhdGhzUGF0dGVybnMubWFwKChwYXR0ZXJuKSA9PiBnbG9iQXN5bmMocGF0dGVybikpKVxuICAgICkuZmxhdCgpO1xuXG4gICAgZm9yIChjb25zdCBmaWxlUGF0aCBvZiB0eXBlUGF0aHMpIHtcbiAgICAgIGNvbnN0IG1vZHVsZVBhdGggPSB0aGlzLmdldE1vZHVsZVBhdGhGcm9tVHlwZUZpbGVQYXRoKGZpbGVQYXRoKTtcbiAgICAgIGNvbnN0IGltcG9ydGVkTWVtYmVycyA9IGF3YWl0IGltcG9ydE1lbWJlcnM8dW5rbm93bj4oZmlsZVBhdGgpO1xuICAgICAgZm9yIChjb25zdCB7IG5hbWUsIHZhbHVlIH0gb2YgaW1wb3J0ZWRNZW1iZXJzKSB7XG4gICAgICAgIGlmICh2YWx1ZSBpbnN0YW5jZW9mIHouWm9kVHlwZSkge1xuICAgICAgICAgIHRoaXMuc2V0TW9kdWxlUGF0aChuYW1lLCBtb2R1bGVQYXRoKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgZ2V0TW9kdWxlUGF0aEZyb21UeXBlRmlsZVBhdGgoZmlsZVBhdGg6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgY29uc3Qgbm9ybWFsaXplZFBhdGggPSBmaWxlUGF0aC5yZXBsYWNlQWxsKFwiXFxcXFwiLCBcIi9cIik7XG4gICAgY29uc3QgbWF0Y2hlZCA9IG5vcm1hbGl6ZWRQYXRoLm1hdGNoKC9cXC8oPzpzcmN8ZGlzdClcXC9hcHBsaWNhdGlvblxcLyguKylcXC4oPzp0c3xqcykkLyk7XG5cbiAgICBpZiAoIW1hdGNoZWQ/LlsxXSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGDtg4DsnoUg7YyM7J287J2YIOuqqOuTiCDqsr3roZzrpbwg6rOE7IKw7ZWgIOyImCDsl4bsirXri4jri6Q6ICR7ZmlsZVBhdGh9YCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIG1hdGNoZWRbMV07XG4gIH1cbn1cblxuZXhwb3J0IGNvbnN0IEVudGl0eU1hbmFnZXIgPSBuZXcgRW50aXR5TWFuYWdlckNsYXNzKCk7XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7QUFpQ0EsU0FBUyxnQkFBZ0IsUUFBZ0I7Q0FDdkMsSUFBSTtFQUNGLE9BQU8sS0FBSyxNQUFNLE1BQU07Q0FDMUIsU0FBUyxPQUFPO0VBRWQsSUFBSSxFQUFFLGlCQUFpQixjQUNyQixN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
205
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZW50aXR5LW1hbmFnZXIuanMiLCJuYW1lcyI6W10sInNvdXJjZXMiOlsiLi4vLi4vc3JjL2VudGl0eS9lbnRpdHktbWFuYWdlci50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgYXNzZXJ0IGZyb20gXCJhc3NlcnRcIjtcbmltcG9ydCB7IGdsb2IsIHJlYWRGaWxlIH0gZnJvbSBcImZzL3Byb21pc2VzXCI7XG5pbXBvcnQgcGF0aCBmcm9tIFwicGF0aFwiO1xuXG5pbXBvcnQgY2hhbGsgZnJvbSBcImNoYWxrXCI7XG5pbXBvcnQgaW5mbGVjdGlvbiBmcm9tIFwiaW5mbGVjdGlvblwiO1xuaW1wb3J0IHsgcHJldHRpZnlFcnJvciwgeiB9IGZyb20gXCJ6b2RcIjtcblxuaW1wb3J0IHsgU29uYW11IH0gZnJvbSBcIi4uL2FwaS9zb25hbXVcIjtcbmltcG9ydCB7XG4gIEVudGl0eUpzb25TY2hlbWEsXG4gIGlzU2VhcmNoVGV4dEpzb25Tb3VyY2Vab2RUeXBlLFxuICBpc1NlYXJjaFRleHRQcm9wLFxuICBTb25hbXVGaWxlQXJyYXlTY2hlbWEsXG4gIFNvbmFtdUZpbGVTY2hlbWEsXG59IGZyb20gXCIuLi90eXBlcy90eXBlc1wiO1xuaW1wb3J0IHsgdHlwZSBFbnRpdHlJbmRleCwgdHlwZSBFbnRpdHlKc29uIH0gZnJvbSBcIi4uL3R5cGVzL3R5cGVzXCI7XG5pbXBvcnQgeyBnbG9iQXN5bmMgfSBmcm9tIFwiLi4vdXRpbHMvYXN5bmMtdXRpbHNcIjtcbmltcG9ydCB7IGltcG9ydE1lbWJlcnMgfSBmcm9tIFwiLi4vdXRpbHMvZXNtLXV0aWxzXCI7XG5pbXBvcnQgeyB0eXBlIEFic29sdXRlUGF0aCB9IGZyb20gXCIuLi91dGlscy9wYXRoLXV0aWxzXCI7XG5pbXBvcnQgeyBydW50aW1lUGF0aCB9IGZyb20gXCIuLi91dGlscy9wYXRoLXV0aWxzXCI7XG5pbXBvcnQgeyB0eXBlIEVudGl0eSB9IGZyb20gXCIuL2VudGl0eVwiO1xuXG5leHBvcnQgdHlwZSBFbnRpdHlOYW1lc1JlY29yZCA9IFJlY29yZDxcbiAgXCJmc1wiIHwgXCJmc1BsdXJhbFwiIHwgXCJjYW1lbFwiIHwgXCJjYW1lbFBsdXJhbFwiIHwgXCJjYXBpdGFsXCIgfCBcImNhcGl0YWxQbHVyYWxcIiB8IFwidXBwZXJcIiB8IFwiY29uc3RhbnRcIixcbiAgc3RyaW5nXG4+O1xuZXhwb3J0IHR5cGUgVGFibGVTcGVjID0ge1xuICBuYW1lOiBzdHJpbmc7XG4gIHVuaXF1ZUluZGV4ZXM6IEVudGl0eUluZGV4W107XG4gIGpzb25Db2x1bW5zOiBzdHJpbmdbXTtcbn07XG5cbmZ1bmN0aW9uIHBhcnNlRW50aXR5SnNvbihzb3VyY2U6IHN0cmluZykge1xuICB0cnkge1xuICAgIHJldHVybiBKU09OLnBhcnNlKHNvdXJjZSk7XG4gIH0gY2F0Y2ggKGNhdXNlKSB7XG4gICAgLy8gSlNPTiDtjIzshJwg6rOE7JW9IOuwluydmCDsmKTrpZjripQg6rWs66y4IOyYpOulmOuhnCDsoJXqt5ztmZTtlZjqs6Ag7JuQ7J247J2EIOuztOyhtO2VqeuLiOuLpC5cbiAgICBpZiAoIShjYXVzZSBpbnN0YW5jZW9mIFN5bnRheEVycm9yKSkge1xuICAgICAgdGhyb3cgbmV3IFN5bnRheEVycm9yKFwiZW50aXR5Lmpzb24g7YyM7IuxIOykkSDsmIjquLDsuZgg7JWK7J2AIOyYpOulmOqwgCDrsJzsg53tlojsirXri4jri6QuXCIsIHsgY2F1c2UgfSk7XG4gICAgfVxuICAgIHRocm93IGNhdXNlO1xuICB9XG59XG5cbmNsYXNzIEVudGl0eU1hbmFnZXJDbGFzcyB7XG4gIHByaXZhdGUgZW50aXRpZXM6IE1hcDxzdHJpbmcsIEVudGl0eT4gPSBuZXcgTWFwKCk7XG4gIHB1YmxpYyBtb2R1bGVQYXRoczogTWFwPHN0cmluZywgc3RyaW5nPiA9IG5ldyBNYXAoKTtcbiAgcHJpdmF0ZSB0YWJsZVNwZWNzOiBNYXA8c3RyaW5nLCBUYWJsZVNwZWM+ID0gbmV3IE1hcCgpO1xuICBwdWJsaWMgaXNBdXRvbG9hZGVkOiBib29sZWFuID0gZmFsc2U7XG4gIC8vIHJlbG9hZCgp6rCAIFNvbmFtdSDstIjquLDtmZQg7JeG7J2064+EIOqwmeydgCDro6jtirjrpbwg64uk7IucIOydveuPhOuhnSDrqoXsi5zsoIEgYXBpIHJvb3Trpbwg67O07KG07ZWp64uI64ukLlxuICBwcml2YXRlIGV4cGxpY2l0QXBpUm9vdFBhdGg6IHN0cmluZyB8IHVuZGVmaW5lZDtcblxuICAvLyDqsr3roZwg7KCE64us67Cb7JWEIOuqqOuToCBlbnRpdHkuanNvbiDtjIzsnbwg66Gc65OcXG4gIGFzeW5jIGF1dG9sb2FkKGRvU2lsZW50OiBib29sZWFuID0gZmFsc2UsIGV4cGxpY2l0QXBpUm9vdFBhdGg/OiBzdHJpbmcpIHtcbiAgICBpZiAodGhpcy5pc0F1dG9sb2FkZWQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5leHBsaWNpdEFwaVJvb3RQYXRoID0gZXhwbGljaXRBcGlSb290UGF0aDtcbiAgICBjb25zdCBhcGlSb290UGF0aCA9IGV4cGxpY2l0QXBpUm9vdFBhdGggPz8gU29uYW11LmFwaVJvb3RQYXRoO1xuICAgIGNvbnN0IHBhdGhQYXR0ZXJuID0gcGF0aC5qb2luKGFwaVJvb3RQYXRoLCBcIi9zcmMvYXBwbGljYXRpb24vKiovKi5lbnRpdHkuanNvblwiKTtcblxuICAgIGZvciBhd2FpdCAoY29uc3QgZmlsZSBvZiBnbG9iKHBhdGgucmVzb2x2ZShwYXRoUGF0dGVybikpKSB7XG4gICAgICBjb25zdCBqc29uID0gcGFyc2VFbnRpdHlKc29uKChhd2FpdCByZWFkRmlsZShmaWxlKSkudG9TdHJpbmcoKSk7XG5cbiAgICAgIC8vIGVudGl0eS5qc29uIOyKpO2CpOuniCDqsoDspp1cbiAgICAgIGNvbnN0IGVycm9yID0gdGhpcy5zY2hlbWFWYWxpZGF0ZShqc29uKTtcbiAgICAgIGlmIChlcnJvcikge1xuICAgICAgICBjb25zdCByZWxhdGl2ZVBhdGggPSBwYXRoLnJlbGF0aXZlKGFwaVJvb3RQYXRoLCBmaWxlKTtcbiAgICAgICAgY29uc3QgZXJyb3JNZXNzYWdlID0gcHJldHRpZnlFcnJvcihlcnJvcik7XG4gICAgICAgIGlmICghZG9TaWxlbnQpIHtcbiAgICAgICAgICBjb25zb2xlLmVycm9yKFxuICAgICAgICAgICAgY2hhbGsucmVkKGBJbnZhbGlkIGVudGl0eS5qc29uIHNjaGVtYTogJHtyZWxhdGl2ZVBhdGh9XFxuJHtjaGFsay55ZWxsb3coZXJyb3JNZXNzYWdlKX1gKSxcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGF3YWl0IHRoaXMucmVnaXN0ZXIoanNvbiwge1xuICAgICAgICBkZWZlclNlYXJjaFRleHRKc29uU291cmNlVmFsaWRhdGlvbjogdHJ1ZSxcbiAgICAgICAgYXBpUm9vdFBhdGgsXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBhd2FpdCB0aGlzLnJlZ2lzdGVyTm9uRW50aXR5VHlwZU1vZHVsZVBhdGhzKGFwaVJvb3RQYXRoKTtcbiAgICBhd2FpdCB0aGlzLnZhbGlkYXRlQWxsUmVnaXN0ZXJlZFNlYXJjaFRleHRKc29uU291cmNlcyhhcGlSb290UGF0aCk7XG5cbiAgICB0aGlzLmlzQXV0b2xvYWRlZCA9IHRydWU7XG4gIH1cblxuICBzY2hlbWFWYWxpZGF0ZTxWYWx1ZT4oanNvbjogVmFsdWUpIHtcbiAgICBjb25zdCByZXN1bHQgPSBFbnRpdHlKc29uU2NoZW1hLnNhZmVQYXJzZShqc29uKTtcbiAgICByZXR1cm4gcmVzdWx0LnN1Y2Nlc3MgPyBudWxsIDogcmVzdWx0LmVycm9yO1xuICB9XG5cbiAgYXN5bmMgcmVsb2FkKGRvU2lsZW50OiBib29sZWFuID0gZmFsc2UsIGV4cGxpY2l0QXBpUm9vdFBhdGg/OiBzdHJpbmcpIHtcbiAgICB0aGlzLmVudGl0aWVzLmNsZWFyKCk7XG4gICAgdGhpcy5tb2R1bGVQYXRocy5jbGVhcigpO1xuICAgIHRoaXMudGFibGVTcGVjcy5jbGVhcigpO1xuICAgIHRoaXMuaXNBdXRvbG9hZGVkID0gZmFsc2U7XG5cbiAgICByZXR1cm4gYXdhaXQgdGhpcy5hdXRvbG9hZChkb1NpbGVudCwgZXhwbGljaXRBcGlSb290UGF0aCA/PyB0aGlzLmV4cGxpY2l0QXBpUm9vdFBhdGgpO1xuICB9XG5cbiAgYXN5bmMgcmVnaXN0ZXIoXG4gICAganNvbjogRW50aXR5SnNvbixcbiAgICBvcHRpb25zOiB7IGRlZmVyU2VhcmNoVGV4dEpzb25Tb3VyY2VWYWxpZGF0aW9uPzogYm9vbGVhbjsgYXBpUm9vdFBhdGg/OiBzdHJpbmcgfSA9IHt9LFxuICApOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCB7IEVudGl0eSB9ID0gYXdhaXQgaW1wb3J0KFwiLi9lbnRpdHlcIik7XG4gICAgY29uc3QgZW50aXR5ID0gbmV3IEVudGl0eShqc29uKTtcbiAgICBhd2FpdCBlbnRpdHkucmVnaXN0ZXJNb2R1bGVQYXRocyhvcHRpb25zLmFwaVJvb3RQYXRoKTtcbiAgICBpZiAoIW9wdGlvbnMuZGVmZXJTZWFyY2hUZXh0SnNvblNvdXJjZVZhbGlkYXRpb24pIHtcbiAgICAgIGF3YWl0IHRoaXMudmFsaWRhdGVTZWFyY2hUZXh0SnNvblNvdXJjZXMoZW50aXR5LCBvcHRpb25zLmFwaVJvb3RQYXRoKTtcbiAgICB9XG4gICAgZW50aXR5LnJlZ2lzdGVyVGFibGVTcGVjcygpO1xuICAgIHRoaXMuZW50aXRpZXMuc2V0KGpzb24uaWQsIGVudGl0eSk7XG4gIH1cblxuICBhc3luYyB2YWxpZGF0ZUFsbFJlZ2lzdGVyZWRTZWFyY2hUZXh0SnNvblNvdXJjZXMoYXBpUm9vdFBhdGg/OiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBmb3IgKGNvbnN0IGVudGl0eSBvZiB0aGlzLmVudGl0aWVzLnZhbHVlcygpKSB7XG4gICAgICBhd2FpdCB0aGlzLnZhbGlkYXRlU2VhcmNoVGV4dEpzb25Tb3VyY2VzKGVudGl0eSwgYXBpUm9vdFBhdGgpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgdmFsaWRhdGVTZWFyY2hUZXh0SnNvblNvdXJjZXMoZW50aXR5OiBFbnRpdHksIGFwaVJvb3RQYXRoPzogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgcHJvcHNCeU5hbWUgPSBuZXcgTWFwKGVudGl0eS5wcm9wcy5tYXAoKHByb3ApID0+IFtwcm9wLm5hbWUsIHByb3BdKSk7XG5cbiAgICBmb3IgKGNvbnN0IHByb3Agb2YgZW50aXR5LnByb3BzKSB7XG4gICAgICBpZiAoIWlzU2VhcmNoVGV4dFByb3AocHJvcCkpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIGZvciAoY29uc3Qgc291cmNlIG9mIHByb3Auc291cmNlQ29sdW1ucykge1xuICAgICAgICBjb25zdCBzb3VyY2VQcm9wID0gcHJvcHNCeU5hbWUuZ2V0KHNvdXJjZS5uYW1lKTtcbiAgICAgICAgaWYgKCFzb3VyY2VQcm9wIHx8IHNvdXJjZVByb3AudHlwZSAhPT0gXCJqc29uXCIpIHtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHpvZFR5cGUgPSBhd2FpdCB0aGlzLnJlc29sdmVTZWFyY2hUZXh0SnNvblNvdXJjZVR5cGUoXG4gICAgICAgICAgZW50aXR5LFxuICAgICAgICAgIHNvdXJjZVByb3AuaWQsXG4gICAgICAgICAgYXBpUm9vdFBhdGgsXG4gICAgICAgICk7XG4gICAgICAgIGlmICghem9kVHlwZSkge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAgIGBzZWFyY2hUZXh0IHNvdXJjZSBcIiR7c291cmNlLm5hbWV9XCLsnZgganNvbiDtg4DsnoUgXCIke3NvdXJjZVByb3AuaWR9XCLsnYQo66W8KSDroZzrk5ztlaAg7IiYIOyXhuyKteuLiOuLpC5gLFxuICAgICAgICAgICk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIWlzU2VhcmNoVGV4dEpzb25Tb3VyY2Vab2RUeXBlKHpvZFR5cGUpKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICAgYHNlYXJjaFRleHQgc291cmNlIFwiJHtzb3VyY2UubmFtZX1cIuydmCBqc29uIO2DgOyehSBcIiR7c291cmNlUHJvcC5pZH1cIuydgCjripQpIHVud3JhcCDtm4Qgei5hcnJheSh6LnN0cmluZygpKSDsnbTslrTslbwg7ZWp64uI64ukLmAsXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgcmVzb2x2ZVNlYXJjaFRleHRKc29uU291cmNlVHlwZShcbiAgICBlbnRpdHk6IEVudGl0eSxcbiAgICB0eXBlSWQ6IHN0cmluZyxcbiAgICBleHBsaWNpdEFwaVJvb3RQYXRoPzogc3RyaW5nLFxuICApOiBQcm9taXNlPHouWm9kVHlwZUFueSB8IG51bGw+IHtcbiAgICBjb25zdCBsb2NhbFR5cGUgPSBlbnRpdHkudHlwZXNbdHlwZUlkXTtcbiAgICBpZiAobG9jYWxUeXBlIGluc3RhbmNlb2Ygei5ab2RUeXBlKSB7XG4gICAgICByZXR1cm4gbG9jYWxUeXBlO1xuICAgIH1cblxuICAgIGZvciAoY29uc3QgcmVnaXN0ZXJlZEVudGl0eSBvZiB0aGlzLmVudGl0aWVzLnZhbHVlcygpKSB7XG4gICAgICBjb25zdCByZWdpc3RlcmVkVHlwZSA9IHJlZ2lzdGVyZWRFbnRpdHkudHlwZXNbdHlwZUlkXTtcbiAgICAgIGlmIChyZWdpc3RlcmVkVHlwZSBpbnN0YW5jZW9mIHouWm9kVHlwZSkge1xuICAgICAgICByZXR1cm4gcmVnaXN0ZXJlZFR5cGU7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHR5cGVJZCA9PT0gXCJTb25hbXVGaWxlXCIpIHtcbiAgICAgIHJldHVybiBTb25hbXVGaWxlU2NoZW1hO1xuICAgIH1cbiAgICBpZiAodHlwZUlkID09PSBcIlNvbmFtdUZpbGVbXVwiKSB7XG4gICAgICByZXR1cm4gU29uYW11RmlsZUFycmF5U2NoZW1hO1xuICAgIH1cblxuICAgIGNvbnN0IG1vZHVsZVBhdGggPSB0aGlzLm1vZHVsZVBhdGhzLmdldCh0eXBlSWQpO1xuICAgIGlmICghbW9kdWxlUGF0aCkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgY29uc3QgbW9kdWxlRmlsZVBhdGggPSBwYXRoLmpvaW4oXG4gICAgICBleHBsaWNpdEFwaVJvb3RQYXRoID8/IFNvbmFtdS5hcGlSb290UGF0aCxcbiAgICAgIHJ1bnRpbWVQYXRoKGBkaXN0L2FwcGxpY2F0aW9uLyR7bW9kdWxlUGF0aH0uanNgKSxcbiAgICApO1xuICAgIGNvbnN0IGltcG9ydGVkTWVtYmVycyA9IGF3YWl0IGltcG9ydE1lbWJlcnM8dW5rbm93bj4obW9kdWxlRmlsZVBhdGgpO1xuICAgIGNvbnN0IG1hdGNoZWQgPSBpbXBvcnRlZE1lbWJlcnMuZmluZCgoeyBuYW1lIH0pID0+IG5hbWUgPT09IHR5cGVJZCk7XG4gICAgaWYgKCFtYXRjaGVkIHx8ICEobWF0Y2hlZC52YWx1ZSBpbnN0YW5jZW9mIHouWm9kVHlwZSkpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIHJldHVybiBtYXRjaGVkLnZhbHVlO1xuICB9XG5cbiAgZ2V0KGVudGl0eUlkOiBzdHJpbmcpOiBFbnRpdHkge1xuICAgIGNvbnN0IGVudGl0eSA9IHRoaXMuZW50aXRpZXMuZ2V0KGVudGl0eUlkKTtcbiAgICBpZiAoZW50aXR5ID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihg7KG07J6s7ZWY7KeAIOyViuuKlCBFbnRpdHkg7JqU7LKtICR7ZW50aXR5SWR9YCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGVudGl0eTtcbiAgfVxuXG4gIGdldEJ5VGFibGUodGFibGU6IHN0cmluZyk6IEVudGl0eSB7XG4gICAgY29uc3QgZW50aXR5ID0gQXJyYXkuZnJvbSh0aGlzLmVudGl0aWVzLnZhbHVlcygpKS5maW5kKFxuICAgICAgKGNhbmRpZGF0ZSkgPT4gY2FuZGlkYXRlLnRhYmxlID09PSB0YWJsZSxcbiAgICApO1xuICAgIGlmIChlbnRpdHkgPT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGDsobTsnqztlZjsp4Ag7JWK64qUIEVudGl0eSDsmpTssq0gJHt0YWJsZX1gKTtcbiAgICB9XG5cbiAgICByZXR1cm4gZW50aXR5O1xuICB9XG5cbiAgZXhpc3RzKGVudGl0eUlkOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICBjb25zdCBlbnRpdHkgPSB0aGlzLmVudGl0aWVzLmdldChlbnRpdHlJZCk7XG4gICAgcmV0dXJuIGVudGl0eSAhPT0gdW5kZWZpbmVkO1xuICB9XG5cbiAgZ2V0QWxsSWRzKCk6IHN0cmluZ1tdIHtcbiAgICByZXR1cm4gQXJyYXkuZnJvbShFbnRpdHlNYW5hZ2VyLmVudGl0aWVzLmtleXMoKSkudG9Tb3J0ZWQoKTtcbiAgfVxuXG4gIGdldEFsbEVudGl0aWVzKCk6IEVudGl0eVtdIHtcbiAgICByZXR1cm4gQXJyYXkuZnJvbSh0aGlzLmVudGl0aWVzLnZhbHVlcygpKTtcbiAgfVxuXG4gIGdldEFsbFBhcmVudElkcygpOiBzdHJpbmdbXSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0QWxsSWRzKCkuZmlsdGVyKChlbnRpdHlJZCkgPT4ge1xuICAgICAgY29uc3QgZW50aXR5ID0gdGhpcy5nZXQoZW50aXR5SWQpO1xuICAgICAgcmV0dXJuIGVudGl0eS5wYXJlbnRJZCA9PT0gdW5kZWZpbmVkO1xuICAgIH0pO1xuICB9XG5cbiAgZ2V0Q2hpbGRyZW5JZHMocGFyZW50SWQ6IHN0cmluZyk6IHN0cmluZ1tdIHtcbiAgICByZXR1cm4gdGhpcy5nZXRBbGxJZHMoKS5maWx0ZXIoKGVudGl0eUlkKSA9PiB7XG4gICAgICBjb25zdCBlbnRpdHkgPSB0aGlzLmdldChlbnRpdHlJZCk7XG4gICAgICByZXR1cm4gZW50aXR5LnBhcmVudElkID09PSBwYXJlbnRJZDtcbiAgICB9KTtcbiAgfVxuXG4gIHNldE1vZHVsZVBhdGgoa2V5OiBzdHJpbmcsIG1vZHVsZVBhdGg6IHN0cmluZyk6IHZvaWQge1xuICAgIC8vIGNvbnNvbGUuZGVidWcoY2hhbGsuY3lhbihgc2V0TW9kdWxlUGF0aCA6OiAke2tleX0gOjogJHttb2R1bGVQYXRofWApKTtcbiAgICB0aGlzLm1vZHVsZVBhdGhzLnNldChrZXksIG1vZHVsZVBhdGgpO1xuICB9XG5cbiAgZ2V0TW9kdWxlUGF0aChrZXk6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgY29uc3QgbW9kdWxlUGF0aCA9IHRoaXMubW9kdWxlUGF0aHMuZ2V0KGtleSk7XG4gICAgaWYgKG1vZHVsZVBhdGggPT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGDsobTsnqztlZjsp4Ag7JWK64qUIOuqqOuTiCDtjKjsiqQg7JqU7LKtICR7a2V5fWApO1xuICAgIH1cblxuICAgIHJldHVybiBtb2R1bGVQYXRoO1xuICB9XG5cbiAgc2V0VGFibGVTcGVjKHRhYmxlU3BlYzogVGFibGVTcGVjKSB7XG4gICAgdGhpcy50YWJsZVNwZWNzLnNldCh0YWJsZVNwZWMubmFtZSwgdGFibGVTcGVjKTtcbiAgfVxuXG4gIGdldFRhYmxlU3BlYyhrZXk6IHN0cmluZyk6IFRhYmxlU3BlYyB7XG4gICAgY29uc3QgdGFibGVTcGVjID0gdGhpcy50YWJsZVNwZWNzLmdldChrZXkpO1xuICAgIGlmICh0YWJsZVNwZWMgPT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGDsobTsnqztlZjsp4Ag7JWK64qUIO2FjOydtOu4lCDsiqTtjpkg7JqU7LKtICR7a2V5fWApO1xuICAgIH1cblxuICAgIHJldHVybiB0YWJsZVNwZWM7XG4gIH1cblxuICBnZXROYW1lc0Zyb21JZChlbnRpdHlJZDogc3RyaW5nKSB7XG4gICAgLy8gZW50aXR5SWTqsIAg64uo67O17IiYIOuPme2YlSDri6jslrTsnbgg6rK97JqwIExpc3Qg67aZ7Jes7IScIOyDneyEsVxuICAgIGNvbnN0IHBsdXJhbGl6ZWQgPVxuICAgICAgaW5mbGVjdGlvbi5wbHVyYWxpemUoZW50aXR5SWQpID09PSBlbnRpdHlJZFxuICAgICAgICA/IGAke2VudGl0eUlkfUxpc3RgXG4gICAgICAgIDogaW5mbGVjdGlvbi5wbHVyYWxpemUoZW50aXR5SWQpO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIGZzOiBpbmZsZWN0aW9uLmRhc2hlcml6ZShpbmZsZWN0aW9uLnVuZGVyc2NvcmUoZW50aXR5SWQpKS50b0xvd2VyQ2FzZSgpLFxuICAgICAgZnNQbHVyYWw6IGluZmxlY3Rpb24uZGFzaGVyaXplKGluZmxlY3Rpb24udW5kZXJzY29yZShwbHVyYWxpemVkKSkudG9Mb3dlckNhc2UoKSxcbiAgICAgIGNhbWVsOiBpbmZsZWN0aW9uLmNhbWVsaXplKGVudGl0eUlkLCB0cnVlKSxcbiAgICAgIGNhbWVsUGx1cmFsOiBpbmZsZWN0aW9uLmNhbWVsaXplKHBsdXJhbGl6ZWQsIHRydWUpLFxuICAgICAgY2FwaXRhbDogZW50aXR5SWQsXG4gICAgICBjYXBpdGFsUGx1cmFsOiBwbHVyYWxpemVkLFxuICAgICAgdXBwZXI6IGVudGl0eUlkLnRvVXBwZXJDYXNlKCksXG4gICAgICBjb25zdGFudDogaW5mbGVjdGlvbi51bmRlcnNjb3JlKGVudGl0eUlkKS50b1VwcGVyQ2FzZSgpLFxuICAgIH0gc2F0aXNmaWVzIEVudGl0eU5hbWVzUmVjb3JkO1xuICB9XG5cbiAgLyoqXG4gICAqIEVudGl0eUlk64qUIE1vZGVs7J2EIOygnOyZuO2VnCBQYXNjYWxDYXNlIOydtOumhOyeheuLiOuLpC4gKGV4LiBcIlVzZXJcIilcbiAgICogQHBhcmFtIGZpbGVQYXRoXG4gICAqIEByZXR1cm5zXG4gICAqL1xuICBnZXRFbnRpdHlJZEZyb21QYXRoKGZpbGVQYXRoOiBBYnNvbHV0ZVBhdGgpOiBzdHJpbmcge1xuICAgIGNvbnN0IGZpbGVOYW1lID0gcGF0aC5iYXNlbmFtZShmaWxlUGF0aCk7XG4gICAgY29uc3Qgc3VwcG9ydGVkU3VmZml4ZXMgPSBbXCIubW9kZWwudHNcIiwgXCIubW9kZWwuanNcIiwgXCIuZW50aXR5Lmpzb25cIiwgXCIuZnJhbWUudHNcIiwgXCIuZnJhbWUuanNcIl07XG4gICAgY29uc3QgbWF0Y2hlZFN1ZmZpeCA9IHN1cHBvcnRlZFN1ZmZpeGVzLmZpbmQoKHN1ZmZpeCkgPT4gZmlsZU5hbWUuZW5kc1dpdGgoc3VmZml4KSk7XG5cbiAgICBhc3NlcnQobWF0Y2hlZFN1ZmZpeCwgYOyngOybkO2VmOyngCDslYrripQgZW50aXR5IOqyveuhnOyeheuLiOuLpDogJHtmaWxlUGF0aH1gKTtcblxuICAgIGNvbnN0IGVudGl0eUJhc2VOYW1lID0gZmlsZU5hbWUuc2xpY2UoMCwgLW1hdGNoZWRTdWZmaXgubGVuZ3RoKTtcbiAgICBhc3NlcnQoZW50aXR5QmFzZU5hbWUubGVuZ3RoID4gMCwgYEVudGl0eUlk66W8IOqzhOyCsO2VoCDsiJgg7JeG64qUIOqyveuhnOyeheuLiOuLpDogJHtmaWxlUGF0aH1gKTtcblxuICAgIHJldHVybiBpbmZsZWN0aW9uLmNhbWVsaXplKGVudGl0eUJhc2VOYW1lLnJlcGxhY2UoLy0vZywgXCJfXCIpKTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgcmVnaXN0ZXJOb25FbnRpdHlUeXBlTW9kdWxlUGF0aHMoYXBpUm9vdFBhdGg6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHR5cGVQYXRoc1BhdHRlcm5zID0gW1xuICAgICAgcGF0aC5qb2luKGFwaVJvb3RQYXRoLCBydW50aW1lUGF0aChcInNyYy9hcHBsaWNhdGlvbi8qKi8qLnR5cGVzLnRzXCIpKSxcbiAgICAgIHBhdGguam9pbihhcGlSb290UGF0aCwgcnVudGltZVBhdGgoXCJzcmMvYXBwbGljYXRpb24vKiovKi5nZW5lcmF0ZWQudHNcIikpLFxuICAgIF07XG4gICAgY29uc3QgdHlwZVBhdGhzID0gKFxuICAgICAgYXdhaXQgUHJvbWlzZS5hbGwodHlwZVBhdGhzUGF0dGVybnMubWFwKChwYXR0ZXJuKSA9PiBnbG9iQXN5bmMocGF0dGVybikpKVxuICAgICkuZmxhdCgpO1xuXG4gICAgZm9yIChjb25zdCBmaWxlUGF0aCBvZiB0eXBlUGF0aHMpIHtcbiAgICAgIGNvbnN0IG1vZHVsZVBhdGggPSB0aGlzLmdldE1vZHVsZVBhdGhGcm9tVHlwZUZpbGVQYXRoKGZpbGVQYXRoKTtcbiAgICAgIGNvbnN0IGltcG9ydGVkTWVtYmVycyA9IGF3YWl0IGltcG9ydE1lbWJlcnM8dW5rbm93bj4oZmlsZVBhdGgpO1xuICAgICAgZm9yIChjb25zdCB7IG5hbWUsIHZhbHVlIH0gb2YgaW1wb3J0ZWRNZW1iZXJzKSB7XG4gICAgICAgIGlmICh2YWx1ZSBpbnN0YW5jZW9mIHouWm9kVHlwZSkge1xuICAgICAgICAgIHRoaXMuc2V0TW9kdWxlUGF0aChuYW1lLCBtb2R1bGVQYXRoKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgZ2V0TW9kdWxlUGF0aEZyb21UeXBlRmlsZVBhdGgoZmlsZVBhdGg6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgY29uc3Qgbm9ybWFsaXplZFBhdGggPSBmaWxlUGF0aC5yZXBsYWNlQWxsKFwiXFxcXFwiLCBcIi9cIik7XG4gICAgY29uc3QgbWF0Y2hlZCA9IG5vcm1hbGl6ZWRQYXRoLm1hdGNoKC9cXC8oPzpzcmN8ZGlzdClcXC9hcHBsaWNhdGlvblxcLyguKylcXC4oPzp0c3xqcykkLyk7XG5cbiAgICBpZiAoIW1hdGNoZWQ/LlsxXSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGDtg4DsnoUg7YyM7J287J2YIOuqqOuTiCDqsr3roZzrpbwg6rOE7IKw7ZWgIOyImCDsl4bsirXri4jri6Q6ICR7ZmlsZVBhdGh9YCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIG1hdGNoZWRbMV07XG4gIH1cbn1cblxuZXhwb3J0IGNvbnN0IEVudGl0eU1hbmFnZXIgPSBuZXcgRW50aXR5TWFuYWdlckNsYXNzKCk7XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7QUFpQ0EsU0FBUyxnQkFBZ0IsUUFBZ0I7Q0FDdkMsSUFBSTtFQUNGLE9BQU8sS0FBSyxNQUFNLE1BQU07Q0FDMUIsU0FBUyxPQUFPO0VBRWQsSUFBSSxFQUFFLGlCQUFpQixjQUNyQixN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
@@ -2,7 +2,7 @@ import { __esmMin } from "../_virtual/_rolldown/runtime.js";
2
2
  import { init_runtime_value, isStringValue } from "../utils/runtime-value.js";
3
3
  import { init_types, isBelongsToOneRelationProp, isEnumDefWithCone, isOneToOneRelationProp, isRelationProp, isSubsetDefWithCone } from "../types/types.js";
4
4
  import { fakerMappings, init_faker_mappings } from "../testing/faker-mappings.js";
5
- //#region src/entity/entity-template-cone.ts
5
+ // src/entity/entity-template-cone.ts
6
6
  /**
7
7
  * Entity의 템플릿 cone을 생성합니다.
8
8
  *
@@ -127,7 +127,6 @@ function getEnumScale(_enumId, values, locale) {
127
127
  function getEnumValueScale(label) {
128
128
  return label;
129
129
  }
130
- //#endregion
131
130
  __esmMin((() => {
132
131
  init_faker_mappings();
133
132
  init_types();
@@ -135,4 +134,4 @@ __esmMin((() => {
135
134
  }))();
136
135
  export { generateTemplateCones };
137
136
 
138
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZW50aXR5LXRlbXBsYXRlLWNvbmUuanMiLCJuYW1lcyI6W10sInNvdXJjZXMiOlsiLi4vLi4vc3JjL2VudGl0eS9lbnRpdHktdGVtcGxhdGUtY29uZS50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBmYWtlck1hcHBpbmdzIH0gZnJvbSBcIi4uL3Rlc3RpbmcvZmFrZXItbWFwcGluZ3NcIjtcbmltcG9ydCB7IHR5cGUgRmFrZXJNYXBwaW5nQ29uZmlnIH0gZnJvbSBcIi4uL3Rlc3RpbmcvZmFrZXItbWFwcGluZ3NcIjtcbmltcG9ydCB7XG4gIHR5cGUgQ29uZSxcbiAgdHlwZSBFbnRpdHlKc29uLFxuICB0eXBlIEVudGl0eVByb3AsXG4gIHR5cGUgT25lVG9PbmVSZWxhdGlvblByb3AsXG4gIHR5cGUgU3Vic2V0RGVmLFxufSBmcm9tIFwiLi4vdHlwZXMvdHlwZXNcIjtcbmltcG9ydCB7XG4gIGlzQmVsb25nc1RvT25lUmVsYXRpb25Qcm9wLFxuICBpc0VudW1EZWZXaXRoQ29uZSxcbiAgaXNPbmVUb09uZVJlbGF0aW9uUHJvcCxcbiAgaXNSZWxhdGlvblByb3AsXG4gIGlzU3Vic2V0RGVmV2l0aENvbmUsXG59IGZyb20gXCIuLi90eXBlcy90eXBlc1wiO1xuaW1wb3J0IHsgaXNTdHJpbmdWYWx1ZSB9IGZyb20gXCIuLi91dGlscy9ydW50aW1lLXZhbHVlXCI7XG5cbi8qKlxuICogRW50aXR57J2YIO2FnO2UjOumvyBjb25l7J2EIOyDneyEse2VqeuLiOuLpC5cbiAqXG4gKiBMTE3snYQg7IKs7Jqp7ZWY7KeAIOyViuqzoCBmYWtlci1tYXBwaW5ncy50c+ulvCDtmZzsmqntlZjsl6wg6riw67O4IGNvbmXsnYQg7IOd7ISx7ZWp64uI64ukLlxuICogc3R1YiBlbnRpdHkg7IOd7ISxIOyLnCDsnpDrj5nsnLzroZwg7Zi47Lac65CY7Ja0IOy1nOyGjO2VnOydmCBjb25lIOuplO2DgOuNsOydtO2EsOulvCDsoJzqs7Xtlanri4jri6QuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZW5lcmF0ZVRlbXBsYXRlQ29uZXMoZW50aXR5OiBFbnRpdHlKc29uLCBsb2NhbGU6IFwia29cIiB8IFwiZW5cIiB8IFwiamFcIiA9IFwia29cIikge1xuICBjb25zdCBtYXBwaW5nID0gZmFrZXJNYXBwaW5nc1tsb2NhbGVdO1xuXG4gIGlmICghbWFwcGluZykge1xuICAgIHRocm93IG5ldyBFcnJvcihgVW5zdXBwb3J0ZWQgbG9jYWxlOiAke2xvY2FsZX1gKTtcbiAgfVxuXG4gIC8vIDEuIEVudGl0eSBjb25lXG4gIGNvbnN0IGVudGl0eUNvbmU6IENvbmUgPSB7XG4gICAgbm90ZTogZ2V0RW50aXR5U2NhbGUoZW50aXR5LCBsb2NhbGUpLFxuICB9O1xuXG4gIC8vIDIuIFByb3AgY29uZXNcbiAgY29uc3QgcHJvcENvbmVzOiBSZWNvcmQ8c3RyaW5nLCBDb25lPiA9IHt9O1xuICBmb3IgKGNvbnN0IHByb3Agb2YgZW50aXR5LnByb3BzKSB7XG4gICAgY29uc3QgZmFrZXJDb25maWcgPSBmaW5kRmFrZXJNYXBwaW5nKHByb3AsIG1hcHBpbmcpO1xuXG4gICAgcHJvcENvbmVzW3Byb3AubmFtZV0gPSB7XG4gICAgICBub3RlOiBnZXRQcm9wU2NhbGUocHJvcCwgZmFrZXJDb25maWcsIGxvY2FsZSksXG4gICAgICBmaXh0dXJlR2VuZXJhdG9yOiBmYWtlckNvbmZpZz8uZmFrZXIsXG4gICAgICBkYXRhU291cmNlOiBzaG91bGRIYXZlRGF0YVNvdXJjZShwcm9wKVxuICAgICAgICA/IHsgc3RyYXRlZ3k6IFwicmVjZW50XCIsIGNvbmZpZzogeyBsaW1pdDogNSB9IH1cbiAgICAgICAgOiB1bmRlZmluZWQsXG4gICAgfTtcbiAgfVxuXG4gIC8vIDMuIFN1YnNldCBjb25lc1xuICBjb25zdCBzdWJzZXRDb25lczogUmVjb3JkPHN0cmluZywgQ29uZT4gPSB7fTtcbiAgZm9yIChjb25zdCBba2V5LCBzdWJzZXRdIG9mIE9iamVjdC5lbnRyaWVzKGVudGl0eS5zdWJzZXRzIHx8IHt9KSkge1xuICAgIHN1YnNldENvbmVzW2tleV0gPSB7XG4gICAgICBub3RlOiBnZXRTdWJzZXRTY2FsZShrZXksIHN1YnNldCwgbG9jYWxlKSxcbiAgICB9O1xuICB9XG5cbiAgLy8gNC4gRW51bSBjb25lc1xuICBjb25zdCBlbnVtQ29uZXM6IFJlY29yZDxzdHJpbmcsIENvbmU+ID0ge307XG4gIGZvciAoY29uc3QgW2VudW1JZCwgZW51bURlZl0gb2YgT2JqZWN0LmVudHJpZXMoZW50aXR5LmVudW1zIHx8IHt9KSkge1xuICAgIGNvbnN0IHZhbHVlcyA9IGlzRW51bURlZldpdGhDb25lKGVudW1EZWYpID8gZW51bURlZi52YWx1ZXMgOiBlbnVtRGVmO1xuXG4gICAgZW51bUNvbmVzW2VudW1JZF0gPSB7XG4gICAgICBub3RlOiBnZXRFbnVtU2NhbGUoZW51bUlkLCB2YWx1ZXMsIGxvY2FsZSksXG4gICAgICB2YWx1ZXM6IE9iamVjdC5rZXlzKHZhbHVlcykucmVkdWNlKFxuICAgICAgICAoYWNjLCBrZXkpID0+IHtcbiAgICAgICAgICBhY2Nba2V5XSA9IHtcbiAgICAgICAgICAgIG5vdGU6IGdldEVudW1WYWx1ZVNjYWxlKHZhbHVlc1trZXldIHx8IGtleSksXG4gICAgICAgICAgfTtcbiAgICAgICAgICByZXR1cm4gYWNjO1xuICAgICAgICB9LFxuICAgICAgICAvLyBTQUZFVFk6IOyKpO2CpOuniCDqsoDspp3qs7wg66mU7YOA642w7J207YSwIOqzhOyVveydtCDsnbQg7YOA7J6F7J2EIOuztOyepe2VqeuLiOuLpC5cbiAgICAgICAge30gYXMgUmVjb3JkPHN0cmluZywgeyBub3RlOiBzdHJpbmcgfT4sXG4gICAgICApLFxuICAgIH07XG4gIH1cblxuICByZXR1cm4geyBlbnRpdHlDb25lLCBwcm9wQ29uZXMsIHN1YnNldENvbmVzLCBlbnVtQ29uZXMgfTtcbn1cblxuLyoqXG4gKiBQcm9w7JeQIOunnuuKlCBmYWtlciBtYXBwaW5n7J2EIOywvuyKteuLiOuLpC5cbiAqXG4gKiDsmrDshKDsiJzsnIQ6XG4gKiAxLiBmaWVsZF9wYXR0ZXJuc+yXkOyEnCBwcm9wIG5hbWUg66ek7LmtICjsoJXtmZXtlZwg7J2066aEIOunpOy5rSlcbiAqIDIuIGZpZWxkX3BhdHRlcm5z7JeQ7IScIOu2gOu2hCDrp6Tsua0gKG5hbWUg7ZWE65Oc6rCAIHVzZXJfbmFtZeydtOuptCBuYW1lIOunpOy5rSlcbiAqIDMuIHR5cGVfZGVmYXVsdHPsl5DshJwgcHJvcCB0eXBlIOunpOy5rVxuICovXG5mdW5jdGlvbiBmaW5kRmFrZXJNYXBwaW5nKFxuICBwcm9wOiBFbnRpdHlQcm9wLFxuICBtYXBwaW5nOiB7XG4gICAgZmllbGRfcGF0dGVybnM6IFJlY29yZDxzdHJpbmcsIEZha2VyTWFwcGluZ0NvbmZpZz47XG4gICAgdHlwZV9kZWZhdWx0czogUmVjb3JkPHN0cmluZywgRmFrZXJNYXBwaW5nQ29uZmlnPjtcbiAgfSxcbik6IEZha2VyTWFwcGluZ0NvbmZpZyB8IHVuZGVmaW5lZCB7XG4gIGlmIChpc1JlbGF0aW9uUHJvcChwcm9wKSkge1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cblxuICBjb25zdCBwcm9wTmFtZSA9IHByb3AubmFtZS50b0xvd2VyQ2FzZSgpO1xuXG4gIC8vIDEuIOygle2Zle2VnCDtlYTrk5zrqoUg66ek7LmtXG4gIGlmIChtYXBwaW5nLmZpZWxkX3BhdHRlcm5zW3Byb3BOYW1lXSkge1xuICAgIHJldHVybiBtYXBwaW5nLmZpZWxkX3BhdHRlcm5zW3Byb3BOYW1lXTtcbiAgfVxuXG4gIC8vIDIuIOu2gOu2hCDrp6Tsua0gKHVzZXJfbmFtZSDihpIgbmFtZSwgZW1haWxfYWRkcmVzcyDihpIgZW1haWwpXG4gIGZvciAoY29uc3QgW3BhdHRlcm4sIGNvbmZpZ10gb2YgT2JqZWN0LmVudHJpZXMobWFwcGluZy5maWVsZF9wYXR0ZXJucykpIHtcbiAgICBpZiAocHJvcE5hbWUuaW5jbHVkZXMocGF0dGVybikgfHwgcHJvcE5hbWUuZW5kc1dpdGgoYF8ke3BhdHRlcm59YCkpIHtcbiAgICAgIHJldHVybiBjb25maWc7XG4gICAgfVxuICB9XG5cbiAgLy8gMy4g7YOA7J6FIOq4sOuzuOqwkiDrp6Tsua1cbiAgY29uc3QgdHlwZUtleSA9IHByb3AudHlwZTtcbiAgaWYgKG1hcHBpbmcudHlwZV9kZWZhdWx0c1t0eXBlS2V5XSkge1xuICAgIHJldHVybiBtYXBwaW5nLnR5cGVfZGVmYXVsdHNbdHlwZUtleV07XG4gIH1cblxuICByZXR1cm4gdW5kZWZpbmVkO1xufVxuXG4vKipcbiAqIEVudGl0eSBzY2FsZeydhCDsg53shLHtlanri4jri6QuXG4gKi9cbmZ1bmN0aW9uIGdldEVudGl0eVNjYWxlKGVudGl0eTogRW50aXR5SnNvbiwgbG9jYWxlOiBcImtvXCIgfCBcImVuXCIgfCBcImphXCIpOiBzdHJpbmcge1xuICBjb25zdCB0aXRsZSA9IGVudGl0eS50aXRsZSB8fCBlbnRpdHkuaWQ7XG5cbiAgY29uc3QgdGVtcGxhdGVzID0ge1xuICAgIGtvOiBgJHt0aXRsZX0g7JeU7Yuw7YuwLiDthYzsiqTtirgg642w7J207YSwIOyDneyEsSDsi5wg6rCBIO2VhOuTnOuKlCDsi6TsoJwg642w7J207YSw7JmAIOycoOyCrO2VnCDtmJXsi53snLzroZwg7IOd7ISx65Cp64uI64ukLmAsXG4gICAgZW46IGAke3RpdGxlfSBlbnRpdHkuIEVhY2ggZmllbGQgaXMgZ2VuZXJhdGVkIGluIGEgZm9ybWF0IHNpbWlsYXIgdG8gcmVhbCBkYXRhLmAsXG4gICAgamE6IGAke3RpdGxlfeOCqOODs+ODhuOCo+ODhuOCo+OAguWQhOODleOCo+ODvOODq+ODieOBr+Wun+mam+OBruODh+ODvOOCv+OBq+S8vOOBn+W9ouW8j+OBp+eUn+aIkOOBleOCjOOBvuOBmeOAgmAsXG4gIH07XG5cbiAgcmV0dXJuIHRlbXBsYXRlc1tsb2NhbGVdO1xufVxuXG4vKipcbiAqIFByb3Agc2NhbGXsnYQg7IOd7ISx7ZWp64uI64ukLlxuICovXG5mdW5jdGlvbiBnZXRQcm9wU2NhbGUoXG4gIHByb3A6IEVudGl0eVByb3AsXG4gIGZha2VyQ29uZmlnOiBGYWtlck1hcHBpbmdDb25maWcgfCB1bmRlZmluZWQsXG4gIGxvY2FsZTogXCJrb1wiIHwgXCJlblwiIHwgXCJqYVwiLFxuKTogc3RyaW5nIHtcbiAgaWYgKGlzUmVsYXRpb25Qcm9wKHByb3ApKSB7XG4gICAgY29uc3QgdGVtcGxhdGVzID0ge1xuICAgICAga286IGAke3Byb3Aud2l0aH0g7LC47KGwLiDquLDsobQgJHtwcm9wLndpdGh9IOuNsOydtO2EsOulvCDssLjsobDtlanri4jri6QuYCxcbiAgICAgIGVuOiBgUmVmZXJlbmNlIHRvICR7cHJvcC53aXRofS4gUmVmZXJlbmNlcyBleGlzdGluZyAke3Byb3Aud2l0aH0gZGF0YS5gLFxuICAgICAgamE6IGAke3Byb3Aud2l0aH3jgbjjga7lj4LnhafjgILml6LlrZjjga4ke3Byb3Aud2l0aH3jg4fjg7zjgr/jgpLlj4LnhafjgZfjgb7jgZnjgIJgLFxuICAgIH07XG4gICAgcmV0dXJuIHRlbXBsYXRlc1tsb2NhbGVdO1xuICB9XG5cbiAgaWYgKGZha2VyQ29uZmlnPy5jb21tZW50KSB7XG4gICAgY29uc3QgdGVtcGxhdGVzID0ge1xuICAgICAga286IGAke2Zha2VyQ29uZmlnLmNvbW1lbnR9IO2YleyLneycvOuhnCDsg53shLHrkKnri4jri6QuYCxcbiAgICAgIGVuOiBgR2VuZXJhdGVkIGFzICR7ZmFrZXJDb25maWcuY29tbWVudH0uYCxcbiAgICAgIGphOiBgJHtmYWtlckNvbmZpZy5jb21tZW50feW9ouW8j+OBp+eUn+aIkOOBleOCjOOBvuOBmeOAgmAsXG4gICAgfTtcbiAgICByZXR1cm4gdGVtcGxhdGVzW2xvY2FsZV07XG4gIH1cblxuICByZXR1cm4gcHJvcC5uYW1lO1xufVxuXG4vKipcbiAqIFByb3DsnbQgZGF0YVNvdXJjZeulvCDqsIDsoLjslbwg7ZWY64qU7KeAIO2MkOuLqO2VqeuLiOuLpC5cbiAqXG4gKiBCZWxvbmdzVG9PbmUg65iQ64qUIE9uZVRvT25lIChoYXNKb2luQ29sdW1uOiB0cnVlKeyduCDqsr3smrAgZGF0YVNvdXJjZeqwgCDtlYTsmpTtlanri4jri6QuXG4gKi9cbmZ1bmN0aW9uIHNob3VsZEhhdmVEYXRhU291cmNlKHByb3A6IEVudGl0eVByb3ApOiBib29sZWFuIHtcbiAgaWYgKCFpc1JlbGF0aW9uUHJvcChwcm9wKSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIC8vIEJlbG9uZ3NUb09uZeydgCDtla3sg4EgZGF0YVNvdXJjZSDtlYTsmpRcbiAgaWYgKGlzQmVsb25nc1RvT25lUmVsYXRpb25Qcm9wKHByb3ApKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICAvLyBPbmVUb09uZeydgCBoYXNKb2luQ29sdW1uOiB0cnVl7J24IOqyveyasOyXkOunjCBkYXRhU291cmNlIO2VhOyalFxuICBpZiAoaXNPbmVUb09uZVJlbGF0aW9uUHJvcChwcm9wKSkge1xuICAgIC8vIFNBRkVUWTog7Iqk7YKk66eIIOqygOymneqzvCDrqZTtg4DrjbDsnbTthLAg6rOE7JW97J20IOydtCDtg4DsnoXsnYQg67O07J6l7ZWp64uI64ukLlxuICAgIHJldHVybiAocHJvcCBhcyBPbmVUb09uZVJlbGF0aW9uUHJvcCkuaGFzSm9pbkNvbHVtbjtcbiAgfVxuXG4gIHJldHVybiBmYWxzZTtcbn1cblxuLyoqXG4gKiBTdWJzZXQgc2NhbGXsnYQg7IOd7ISx7ZWp64uI64ukLlxuICovXG5mdW5jdGlvbiBnZXRTdWJzZXRTY2FsZShrZXk6IHN0cmluZywgc3Vic2V0OiBTdWJzZXREZWYsIGxvY2FsZTogXCJrb1wiIHwgXCJlblwiIHwgXCJqYVwiKTogc3RyaW5nIHtcbiAgY29uc3QgZmllbGRzID0gaXNTdWJzZXREZWZXaXRoQ29uZShzdWJzZXQpID8gc3Vic2V0LmZpZWxkcyA6IHN1YnNldDtcbiAgY29uc3QgZmllbGROYW1lcyA9IGZpZWxkcy5tYXAoKGYpID0+IChpc1N0cmluZ1ZhbHVlKGYpID8gZiA6IGYuZmllbGQpKS5qb2luKFwiLCBcIik7XG5cbiAgY29uc3QgdGVtcGxhdGVzID0ge1xuICAgIGtvOiBgJHtrZXl9IOyEnOu4jOyFiy4g7Y+s7ZWo65CcIO2VhOuTnDogJHtmaWVsZE5hbWVzfWAsXG4gICAgZW46IGAke2tleX0gc3Vic2V0LiBJbmNsdWRlZCBmaWVsZHM6ICR7ZmllbGROYW1lc31gLFxuICAgIGphOiBgJHtrZXl944K144OW44K744OD44OI44CC5ZCr44G+44KM44KL44OV44Kj44O844Or44OJOiAke2ZpZWxkTmFtZXN9YCxcbiAgfTtcblxuICByZXR1cm4gdGVtcGxhdGVzW2xvY2FsZV07XG59XG5cbi8qKlxuICogRW51bSBzY2FsZeydhCDsg53shLHtlanri4jri6QuXG4gKi9cbmZ1bmN0aW9uIGdldEVudW1TY2FsZShcbiAgX2VudW1JZDogc3RyaW5nLFxuICB2YWx1ZXM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4sXG4gIGxvY2FsZTogXCJrb1wiIHwgXCJlblwiIHwgXCJqYVwiLFxuKTogc3RyaW5nIHtcbiAgY29uc3QgdmFsdWVMaXN0ID0gT2JqZWN0LmtleXModmFsdWVzKS5qb2luKFwiLCBcIik7XG5cbiAgY29uc3QgdGVtcGxhdGVzID0ge1xuICAgIGtvOiBg6rCA64ql7ZWcIOqwkjogJHt2YWx1ZUxpc3R9YCxcbiAgICBlbjogYFBvc3NpYmxlIHZhbHVlczogJHt2YWx1ZUxpc3R9YCxcbiAgICBqYTogYOWPr+iDveOBquWApDogJHt2YWx1ZUxpc3R9YCxcbiAgfTtcblxuICByZXR1cm4gdGVtcGxhdGVzW2xvY2FsZV07XG59XG5cbi8qKlxuICogRW51bSB2YWx1ZSBzY2FsZeydhCDsg53shLHtlanri4jri6QuXG4gKi9cbmZ1bmN0aW9uIGdldEVudW1WYWx1ZVNjYWxlKGxhYmVsOiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gbGFiZWw7XG59XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7O0FBd0JBLFNBQWdCLHNCQUFzQixRQUFvQixTQUE2QixNQUFNO0NBQzNGLE1BQU0sVUFBVSxjQUFjO0NBRTlCLElBQUksQ0FBQyxTQUNILE1BQU0sSUFBSSxNQUFNLHVCQUF1QixRQUFR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
137
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZW50aXR5LXRlbXBsYXRlLWNvbmUuanMiLCJuYW1lcyI6W10sInNvdXJjZXMiOlsiLi4vLi4vc3JjL2VudGl0eS9lbnRpdHktdGVtcGxhdGUtY29uZS50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBmYWtlck1hcHBpbmdzIH0gZnJvbSBcIi4uL3Rlc3RpbmcvZmFrZXItbWFwcGluZ3NcIjtcbmltcG9ydCB7IHR5cGUgRmFrZXJNYXBwaW5nQ29uZmlnIH0gZnJvbSBcIi4uL3Rlc3RpbmcvZmFrZXItbWFwcGluZ3NcIjtcbmltcG9ydCB7XG4gIHR5cGUgQ29uZSxcbiAgdHlwZSBFbnRpdHlKc29uLFxuICB0eXBlIEVudGl0eVByb3AsXG4gIHR5cGUgT25lVG9PbmVSZWxhdGlvblByb3AsXG4gIHR5cGUgU3Vic2V0RGVmLFxufSBmcm9tIFwiLi4vdHlwZXMvdHlwZXNcIjtcbmltcG9ydCB7XG4gIGlzQmVsb25nc1RvT25lUmVsYXRpb25Qcm9wLFxuICBpc0VudW1EZWZXaXRoQ29uZSxcbiAgaXNPbmVUb09uZVJlbGF0aW9uUHJvcCxcbiAgaXNSZWxhdGlvblByb3AsXG4gIGlzU3Vic2V0RGVmV2l0aENvbmUsXG59IGZyb20gXCIuLi90eXBlcy90eXBlc1wiO1xuaW1wb3J0IHsgaXNTdHJpbmdWYWx1ZSB9IGZyb20gXCIuLi91dGlscy9ydW50aW1lLXZhbHVlXCI7XG5cbi8qKlxuICogRW50aXR57J2YIO2FnO2UjOumvyBjb25l7J2EIOyDneyEse2VqeuLiOuLpC5cbiAqXG4gKiBMTE3snYQg7IKs7Jqp7ZWY7KeAIOyViuqzoCBmYWtlci1tYXBwaW5ncy50c+ulvCDtmZzsmqntlZjsl6wg6riw67O4IGNvbmXsnYQg7IOd7ISx7ZWp64uI64ukLlxuICogc3R1YiBlbnRpdHkg7IOd7ISxIOyLnCDsnpDrj5nsnLzroZwg7Zi47Lac65CY7Ja0IOy1nOyGjO2VnOydmCBjb25lIOuplO2DgOuNsOydtO2EsOulvCDsoJzqs7Xtlanri4jri6QuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZW5lcmF0ZVRlbXBsYXRlQ29uZXMoZW50aXR5OiBFbnRpdHlKc29uLCBsb2NhbGU6IFwia29cIiB8IFwiZW5cIiB8IFwiamFcIiA9IFwia29cIikge1xuICBjb25zdCBtYXBwaW5nID0gZmFrZXJNYXBwaW5nc1tsb2NhbGVdO1xuXG4gIGlmICghbWFwcGluZykge1xuICAgIHRocm93IG5ldyBFcnJvcihgVW5zdXBwb3J0ZWQgbG9jYWxlOiAke2xvY2FsZX1gKTtcbiAgfVxuXG4gIC8vIDEuIEVudGl0eSBjb25lXG4gIGNvbnN0IGVudGl0eUNvbmU6IENvbmUgPSB7XG4gICAgbm90ZTogZ2V0RW50aXR5U2NhbGUoZW50aXR5LCBsb2NhbGUpLFxuICB9O1xuXG4gIC8vIDIuIFByb3AgY29uZXNcbiAgY29uc3QgcHJvcENvbmVzOiBSZWNvcmQ8c3RyaW5nLCBDb25lPiA9IHt9O1xuICBmb3IgKGNvbnN0IHByb3Agb2YgZW50aXR5LnByb3BzKSB7XG4gICAgY29uc3QgZmFrZXJDb25maWcgPSBmaW5kRmFrZXJNYXBwaW5nKHByb3AsIG1hcHBpbmcpO1xuXG4gICAgcHJvcENvbmVzW3Byb3AubmFtZV0gPSB7XG4gICAgICBub3RlOiBnZXRQcm9wU2NhbGUocHJvcCwgZmFrZXJDb25maWcsIGxvY2FsZSksXG4gICAgICBmaXh0dXJlR2VuZXJhdG9yOiBmYWtlckNvbmZpZz8uZmFrZXIsXG4gICAgICBkYXRhU291cmNlOiBzaG91bGRIYXZlRGF0YVNvdXJjZShwcm9wKVxuICAgICAgICA/IHsgc3RyYXRlZ3k6IFwicmVjZW50XCIsIGNvbmZpZzogeyBsaW1pdDogNSB9IH1cbiAgICAgICAgOiB1bmRlZmluZWQsXG4gICAgfTtcbiAgfVxuXG4gIC8vIDMuIFN1YnNldCBjb25lc1xuICBjb25zdCBzdWJzZXRDb25lczogUmVjb3JkPHN0cmluZywgQ29uZT4gPSB7fTtcbiAgZm9yIChjb25zdCBba2V5LCBzdWJzZXRdIG9mIE9iamVjdC5lbnRyaWVzKGVudGl0eS5zdWJzZXRzIHx8IHt9KSkge1xuICAgIHN1YnNldENvbmVzW2tleV0gPSB7XG4gICAgICBub3RlOiBnZXRTdWJzZXRTY2FsZShrZXksIHN1YnNldCwgbG9jYWxlKSxcbiAgICB9O1xuICB9XG5cbiAgLy8gNC4gRW51bSBjb25lc1xuICBjb25zdCBlbnVtQ29uZXM6IFJlY29yZDxzdHJpbmcsIENvbmU+ID0ge307XG4gIGZvciAoY29uc3QgW2VudW1JZCwgZW51bURlZl0gb2YgT2JqZWN0LmVudHJpZXMoZW50aXR5LmVudW1zIHx8IHt9KSkge1xuICAgIGNvbnN0IHZhbHVlcyA9IGlzRW51bURlZldpdGhDb25lKGVudW1EZWYpID8gZW51bURlZi52YWx1ZXMgOiBlbnVtRGVmO1xuXG4gICAgZW51bUNvbmVzW2VudW1JZF0gPSB7XG4gICAgICBub3RlOiBnZXRFbnVtU2NhbGUoZW51bUlkLCB2YWx1ZXMsIGxvY2FsZSksXG4gICAgICB2YWx1ZXM6IE9iamVjdC5rZXlzKHZhbHVlcykucmVkdWNlKFxuICAgICAgICAoYWNjLCBrZXkpID0+IHtcbiAgICAgICAgICBhY2Nba2V5XSA9IHtcbiAgICAgICAgICAgIG5vdGU6IGdldEVudW1WYWx1ZVNjYWxlKHZhbHVlc1trZXldIHx8IGtleSksXG4gICAgICAgICAgfTtcbiAgICAgICAgICByZXR1cm4gYWNjO1xuICAgICAgICB9LFxuICAgICAgICAvLyBTQUZFVFk6IOyKpO2CpOuniCDqsoDspp3qs7wg66mU7YOA642w7J207YSwIOqzhOyVveydtCDsnbQg7YOA7J6F7J2EIOuztOyepe2VqeuLiOuLpC5cbiAgICAgICAge30gYXMgUmVjb3JkPHN0cmluZywgeyBub3RlOiBzdHJpbmcgfT4sXG4gICAgICApLFxuICAgIH07XG4gIH1cblxuICByZXR1cm4geyBlbnRpdHlDb25lLCBwcm9wQ29uZXMsIHN1YnNldENvbmVzLCBlbnVtQ29uZXMgfTtcbn1cblxuLyoqXG4gKiBQcm9w7JeQIOunnuuKlCBmYWtlciBtYXBwaW5n7J2EIOywvuyKteuLiOuLpC5cbiAqXG4gKiDsmrDshKDsiJzsnIQ6XG4gKiAxLiBmaWVsZF9wYXR0ZXJuc+yXkOyEnCBwcm9wIG5hbWUg66ek7LmtICjsoJXtmZXtlZwg7J2066aEIOunpOy5rSlcbiAqIDIuIGZpZWxkX3BhdHRlcm5z7JeQ7IScIOu2gOu2hCDrp6Tsua0gKG5hbWUg7ZWE65Oc6rCAIHVzZXJfbmFtZeydtOuptCBuYW1lIOunpOy5rSlcbiAqIDMuIHR5cGVfZGVmYXVsdHPsl5DshJwgcHJvcCB0eXBlIOunpOy5rVxuICovXG5mdW5jdGlvbiBmaW5kRmFrZXJNYXBwaW5nKFxuICBwcm9wOiBFbnRpdHlQcm9wLFxuICBtYXBwaW5nOiB7XG4gICAgZmllbGRfcGF0dGVybnM6IFJlY29yZDxzdHJpbmcsIEZha2VyTWFwcGluZ0NvbmZpZz47XG4gICAgdHlwZV9kZWZhdWx0czogUmVjb3JkPHN0cmluZywgRmFrZXJNYXBwaW5nQ29uZmlnPjtcbiAgfSxcbik6IEZha2VyTWFwcGluZ0NvbmZpZyB8IHVuZGVmaW5lZCB7XG4gIGlmIChpc1JlbGF0aW9uUHJvcChwcm9wKSkge1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cblxuICBjb25zdCBwcm9wTmFtZSA9IHByb3AubmFtZS50b0xvd2VyQ2FzZSgpO1xuXG4gIC8vIDEuIOygle2Zle2VnCDtlYTrk5zrqoUg66ek7LmtXG4gIGlmIChtYXBwaW5nLmZpZWxkX3BhdHRlcm5zW3Byb3BOYW1lXSkge1xuICAgIHJldHVybiBtYXBwaW5nLmZpZWxkX3BhdHRlcm5zW3Byb3BOYW1lXTtcbiAgfVxuXG4gIC8vIDIuIOu2gOu2hCDrp6Tsua0gKHVzZXJfbmFtZSDihpIgbmFtZSwgZW1haWxfYWRkcmVzcyDihpIgZW1haWwpXG4gIGZvciAoY29uc3QgW3BhdHRlcm4sIGNvbmZpZ10gb2YgT2JqZWN0LmVudHJpZXMobWFwcGluZy5maWVsZF9wYXR0ZXJucykpIHtcbiAgICBpZiAocHJvcE5hbWUuaW5jbHVkZXMocGF0dGVybikgfHwgcHJvcE5hbWUuZW5kc1dpdGgoYF8ke3BhdHRlcm59YCkpIHtcbiAgICAgIHJldHVybiBjb25maWc7XG4gICAgfVxuICB9XG5cbiAgLy8gMy4g7YOA7J6FIOq4sOuzuOqwkiDrp6Tsua1cbiAgY29uc3QgdHlwZUtleSA9IHByb3AudHlwZTtcbiAgaWYgKG1hcHBpbmcudHlwZV9kZWZhdWx0c1t0eXBlS2V5XSkge1xuICAgIHJldHVybiBtYXBwaW5nLnR5cGVfZGVmYXVsdHNbdHlwZUtleV07XG4gIH1cblxuICByZXR1cm4gdW5kZWZpbmVkO1xufVxuXG4vKipcbiAqIEVudGl0eSBzY2FsZeydhCDsg53shLHtlanri4jri6QuXG4gKi9cbmZ1bmN0aW9uIGdldEVudGl0eVNjYWxlKGVudGl0eTogRW50aXR5SnNvbiwgbG9jYWxlOiBcImtvXCIgfCBcImVuXCIgfCBcImphXCIpOiBzdHJpbmcge1xuICBjb25zdCB0aXRsZSA9IGVudGl0eS50aXRsZSB8fCBlbnRpdHkuaWQ7XG5cbiAgY29uc3QgdGVtcGxhdGVzID0ge1xuICAgIGtvOiBgJHt0aXRsZX0g7JeU7Yuw7YuwLiDthYzsiqTtirgg642w7J207YSwIOyDneyEsSDsi5wg6rCBIO2VhOuTnOuKlCDsi6TsoJwg642w7J207YSw7JmAIOycoOyCrO2VnCDtmJXsi53snLzroZwg7IOd7ISx65Cp64uI64ukLmAsXG4gICAgZW46IGAke3RpdGxlfSBlbnRpdHkuIEVhY2ggZmllbGQgaXMgZ2VuZXJhdGVkIGluIGEgZm9ybWF0IHNpbWlsYXIgdG8gcmVhbCBkYXRhLmAsXG4gICAgamE6IGAke3RpdGxlfeOCqOODs+ODhuOCo+ODhuOCo+OAguWQhOODleOCo+ODvOODq+ODieOBr+Wun+mam+OBruODh+ODvOOCv+OBq+S8vOOBn+W9ouW8j+OBp+eUn+aIkOOBleOCjOOBvuOBmeOAgmAsXG4gIH07XG5cbiAgcmV0dXJuIHRlbXBsYXRlc1tsb2NhbGVdO1xufVxuXG4vKipcbiAqIFByb3Agc2NhbGXsnYQg7IOd7ISx7ZWp64uI64ukLlxuICovXG5mdW5jdGlvbiBnZXRQcm9wU2NhbGUoXG4gIHByb3A6IEVudGl0eVByb3AsXG4gIGZha2VyQ29uZmlnOiBGYWtlck1hcHBpbmdDb25maWcgfCB1bmRlZmluZWQsXG4gIGxvY2FsZTogXCJrb1wiIHwgXCJlblwiIHwgXCJqYVwiLFxuKTogc3RyaW5nIHtcbiAgaWYgKGlzUmVsYXRpb25Qcm9wKHByb3ApKSB7XG4gICAgY29uc3QgdGVtcGxhdGVzID0ge1xuICAgICAga286IGAke3Byb3Aud2l0aH0g7LC47KGwLiDquLDsobQgJHtwcm9wLndpdGh9IOuNsOydtO2EsOulvCDssLjsobDtlanri4jri6QuYCxcbiAgICAgIGVuOiBgUmVmZXJlbmNlIHRvICR7cHJvcC53aXRofS4gUmVmZXJlbmNlcyBleGlzdGluZyAke3Byb3Aud2l0aH0gZGF0YS5gLFxuICAgICAgamE6IGAke3Byb3Aud2l0aH3jgbjjga7lj4LnhafjgILml6LlrZjjga4ke3Byb3Aud2l0aH3jg4fjg7zjgr/jgpLlj4LnhafjgZfjgb7jgZnjgIJgLFxuICAgIH07XG4gICAgcmV0dXJuIHRlbXBsYXRlc1tsb2NhbGVdO1xuICB9XG5cbiAgaWYgKGZha2VyQ29uZmlnPy5jb21tZW50KSB7XG4gICAgY29uc3QgdGVtcGxhdGVzID0ge1xuICAgICAga286IGAke2Zha2VyQ29uZmlnLmNvbW1lbnR9IO2YleyLneycvOuhnCDsg53shLHrkKnri4jri6QuYCxcbiAgICAgIGVuOiBgR2VuZXJhdGVkIGFzICR7ZmFrZXJDb25maWcuY29tbWVudH0uYCxcbiAgICAgIGphOiBgJHtmYWtlckNvbmZpZy5jb21tZW50feW9ouW8j+OBp+eUn+aIkOOBleOCjOOBvuOBmeOAgmAsXG4gICAgfTtcbiAgICByZXR1cm4gdGVtcGxhdGVzW2xvY2FsZV07XG4gIH1cblxuICByZXR1cm4gcHJvcC5uYW1lO1xufVxuXG4vKipcbiAqIFByb3DsnbQgZGF0YVNvdXJjZeulvCDqsIDsoLjslbwg7ZWY64qU7KeAIO2MkOuLqO2VqeuLiOuLpC5cbiAqXG4gKiBCZWxvbmdzVG9PbmUg65iQ64qUIE9uZVRvT25lIChoYXNKb2luQ29sdW1uOiB0cnVlKeyduCDqsr3smrAgZGF0YVNvdXJjZeqwgCDtlYTsmpTtlanri4jri6QuXG4gKi9cbmZ1bmN0aW9uIHNob3VsZEhhdmVEYXRhU291cmNlKHByb3A6IEVudGl0eVByb3ApOiBib29sZWFuIHtcbiAgaWYgKCFpc1JlbGF0aW9uUHJvcChwcm9wKSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIC8vIEJlbG9uZ3NUb09uZeydgCDtla3sg4EgZGF0YVNvdXJjZSDtlYTsmpRcbiAgaWYgKGlzQmVsb25nc1RvT25lUmVsYXRpb25Qcm9wKHByb3ApKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICAvLyBPbmVUb09uZeydgCBoYXNKb2luQ29sdW1uOiB0cnVl7J24IOqyveyasOyXkOunjCBkYXRhU291cmNlIO2VhOyalFxuICBpZiAoaXNPbmVUb09uZVJlbGF0aW9uUHJvcChwcm9wKSkge1xuICAgIC8vIFNBRkVUWTog7Iqk7YKk66eIIOqygOymneqzvCDrqZTtg4DrjbDsnbTthLAg6rOE7JW97J20IOydtCDtg4DsnoXsnYQg67O07J6l7ZWp64uI64ukLlxuICAgIHJldHVybiAocHJvcCBhcyBPbmVUb09uZVJlbGF0aW9uUHJvcCkuaGFzSm9pbkNvbHVtbjtcbiAgfVxuXG4gIHJldHVybiBmYWxzZTtcbn1cblxuLyoqXG4gKiBTdWJzZXQgc2NhbGXsnYQg7IOd7ISx7ZWp64uI64ukLlxuICovXG5mdW5jdGlvbiBnZXRTdWJzZXRTY2FsZShrZXk6IHN0cmluZywgc3Vic2V0OiBTdWJzZXREZWYsIGxvY2FsZTogXCJrb1wiIHwgXCJlblwiIHwgXCJqYVwiKTogc3RyaW5nIHtcbiAgY29uc3QgZmllbGRzID0gaXNTdWJzZXREZWZXaXRoQ29uZShzdWJzZXQpID8gc3Vic2V0LmZpZWxkcyA6IHN1YnNldDtcbiAgY29uc3QgZmllbGROYW1lcyA9IGZpZWxkcy5tYXAoKGYpID0+IChpc1N0cmluZ1ZhbHVlKGYpID8gZiA6IGYuZmllbGQpKS5qb2luKFwiLCBcIik7XG5cbiAgY29uc3QgdGVtcGxhdGVzID0ge1xuICAgIGtvOiBgJHtrZXl9IOyEnOu4jOyFiy4g7Y+s7ZWo65CcIO2VhOuTnDogJHtmaWVsZE5hbWVzfWAsXG4gICAgZW46IGAke2tleX0gc3Vic2V0LiBJbmNsdWRlZCBmaWVsZHM6ICR7ZmllbGROYW1lc31gLFxuICAgIGphOiBgJHtrZXl944K144OW44K744OD44OI44CC5ZCr44G+44KM44KL44OV44Kj44O844Or44OJOiAke2ZpZWxkTmFtZXN9YCxcbiAgfTtcblxuICByZXR1cm4gdGVtcGxhdGVzW2xvY2FsZV07XG59XG5cbi8qKlxuICogRW51bSBzY2FsZeydhCDsg53shLHtlanri4jri6QuXG4gKi9cbmZ1bmN0aW9uIGdldEVudW1TY2FsZShcbiAgX2VudW1JZDogc3RyaW5nLFxuICB2YWx1ZXM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4sXG4gIGxvY2FsZTogXCJrb1wiIHwgXCJlblwiIHwgXCJqYVwiLFxuKTogc3RyaW5nIHtcbiAgY29uc3QgdmFsdWVMaXN0ID0gT2JqZWN0LmtleXModmFsdWVzKS5qb2luKFwiLCBcIik7XG5cbiAgY29uc3QgdGVtcGxhdGVzID0ge1xuICAgIGtvOiBg6rCA64ql7ZWcIOqwkjogJHt2YWx1ZUxpc3R9YCxcbiAgICBlbjogYFBvc3NpYmxlIHZhbHVlczogJHt2YWx1ZUxpc3R9YCxcbiAgICBqYTogYOWPr+iDveOBquWApDogJHt2YWx1ZUxpc3R9YCxcbiAgfTtcblxuICByZXR1cm4gdGVtcGxhdGVzW2xvY2FsZV07XG59XG5cbi8qKlxuICogRW51bSB2YWx1ZSBzY2FsZeydhCDsg53shLHtlanri4jri6QuXG4gKi9cbmZ1bmN0aW9uIGdldEVudW1WYWx1ZVNjYWxlKGxhYmVsOiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gbGFiZWw7XG59XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7O0FBd0JBLFNBQWdCLHNCQUFzQixRQUFvQixTQUE2QixNQUFNO0NBQzNGLE1BQU0sVUFBVSxjQUFjO0NBRTlCLElBQUksQ0FBQyxTQUNILE1BQU0sSUFBSSxNQUFNLHVCQUF1QixRQUFR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