sonamu 0.9.19 → 0.10.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 (282) hide show
  1. package/dist/_virtual/_rolldown/runtime.js +36 -0
  2. package/dist/ai/agents/agent.js +5 -7
  3. package/dist/ai/agents/index.js +1 -2
  4. package/dist/ai/agents/types.js +1 -1
  5. package/dist/ai/index.js +1 -2
  6. package/dist/ai/providers/rtzr/api.js +2 -3
  7. package/dist/ai/providers/rtzr/error.js +14 -29
  8. package/dist/ai/providers/rtzr/index.js +1 -2
  9. package/dist/ai/providers/rtzr/model.js +13 -20
  10. package/dist/ai/providers/rtzr/options.js +2 -3
  11. package/dist/ai/providers/rtzr/provider.js +2 -3
  12. package/dist/ai/providers/rtzr/utils.js +12 -21
  13. package/dist/api/base-frame.js +4 -4
  14. package/dist/api/caster.js +21 -38
  15. package/dist/api/code-converters.js +41 -98
  16. package/dist/api/config.d.ts +1 -10
  17. package/dist/api/config.d.ts.map +1 -1
  18. package/dist/api/config.js +9 -8
  19. package/dist/api/context.js +2 -3
  20. package/dist/api/decorators.js +80 -116
  21. package/dist/api/index.js +2 -3
  22. package/dist/api/secret.js +6 -10
  23. package/dist/api/sonamu.d.ts.map +1 -1
  24. package/dist/api/sonamu.js +200 -387
  25. package/dist/api/validator.js +5 -8
  26. package/dist/api/websocket-helpers.js +21 -32
  27. package/dist/auth/audit-log/builders.js +2 -3
  28. package/dist/auth/audit-log/events.js +2 -2
  29. package/dist/auth/audit-log/plugin.js +30 -61
  30. package/dist/auth/audit-log-ingestor.js +19 -41
  31. package/dist/auth/auth-generator.js +16 -41
  32. package/dist/auth/better-auth-entities.js +3 -4
  33. package/dist/auth/index.js +2 -3
  34. package/dist/auth/knex-adapter.js +18 -45
  35. package/dist/auth/plugins/entity-definitions/admin.js +2 -2
  36. package/dist/auth/plugins/entity-definitions/anonymous.js +2 -2
  37. package/dist/auth/plugins/entity-definitions/api-key.js +2 -2
  38. package/dist/auth/plugins/entity-definitions/audit-log.js +2 -2
  39. package/dist/auth/plugins/entity-definitions/index.js +2 -3
  40. package/dist/auth/plugins/entity-definitions/jwt.js +2 -2
  41. package/dist/auth/plugins/entity-definitions/organization.js +2 -2
  42. package/dist/auth/plugins/entity-definitions/passkey.js +2 -2
  43. package/dist/auth/plugins/entity-definitions/phone-number.js +2 -2
  44. package/dist/auth/plugins/entity-definitions/sso.js +2 -2
  45. package/dist/auth/plugins/entity-definitions/two-factor.js +2 -2
  46. package/dist/auth/plugins/entity-definitions/types.js +1 -1
  47. package/dist/auth/plugins/entity-definitions/username.js +2 -2
  48. package/dist/auth/plugins/index.js +1 -2
  49. package/dist/auth/plugins/wrappers/admin.js +2 -3
  50. package/dist/auth/plugins/wrappers/anonymous.js +2 -3
  51. package/dist/auth/plugins/wrappers/api-key.js +2 -3
  52. package/dist/auth/plugins/wrappers/index.js +1 -2
  53. package/dist/auth/plugins/wrappers/jwt.js +2 -3
  54. package/dist/auth/plugins/wrappers/organization.js +2 -3
  55. package/dist/auth/plugins/wrappers/passkey.js +2 -3
  56. package/dist/auth/plugins/wrappers/phone-number.js +2 -3
  57. package/dist/auth/plugins/wrappers/sso.js +2 -3
  58. package/dist/auth/plugins/wrappers/two-factor.js +2 -3
  59. package/dist/auth/plugins/wrappers/username.js +2 -3
  60. package/dist/bin/build-config.js +2 -2
  61. package/dist/bin/cli.js +151 -258
  62. package/dist/bin/fixture.d.ts.map +1 -1
  63. package/dist/bin/fixture.js +55 -97
  64. package/dist/bin/hmr-hook-register.js +3 -3
  65. package/dist/bin/migrate-targets.d.ts +3 -0
  66. package/dist/bin/migrate-targets.d.ts.map +1 -0
  67. package/dist/bin/migrate-targets.js +11 -0
  68. package/dist/bin/test-command.js +25 -55
  69. package/dist/bin/ts-loader-register.js +5 -6
  70. package/dist/bin/ts-loader-registration.js +6 -13
  71. package/dist/cache/cache-manager.js +3 -4
  72. package/dist/cache/decorator.js +11 -21
  73. package/dist/cache/drivers.js +2 -3
  74. package/dist/cache/index.js +2 -3
  75. package/dist/cache/types.js +1 -1
  76. package/dist/cache-control/cache-control.js +21 -34
  77. package/dist/cache-control/types.js +1 -1
  78. package/dist/compress/compress.js +10 -10
  79. package/dist/compress/index.js +1 -2
  80. package/dist/compress/types.js +1 -1
  81. package/dist/cone/cone-generator.js +25 -63
  82. package/dist/database/_batch_update.js +26 -46
  83. package/dist/database/base-model.js +44 -97
  84. package/dist/database/base-model.types.js +1 -1
  85. package/dist/database/db.d.ts +8 -14
  86. package/dist/database/db.d.ts.map +1 -1
  87. package/dist/database/db.js +127 -72
  88. package/dist/database/knex.js +5 -8
  89. package/dist/database/puri-subset.types.js +1 -1
  90. package/dist/database/puri-wrapper.js +11 -15
  91. package/dist/database/puri.js +117 -234
  92. package/dist/database/puri.types.js +3 -4
  93. package/dist/database/transaction-context.js +4 -5
  94. package/dist/database/upsert-builder.js +109 -176
  95. package/dist/dict/en.d.ts +1 -0
  96. package/dist/dict/en.d.ts.map +1 -1
  97. package/dist/dict/en.js +4 -4
  98. package/dist/dict/index.js +2 -3
  99. package/dist/dict/ko.d.ts +1 -0
  100. package/dist/dict/ko.d.ts.map +1 -1
  101. package/dist/dict/ko.js +4 -4
  102. package/dist/dict/rc-keys.js +3 -4
  103. package/dist/dict/sd.js +8 -19
  104. package/dist/dict/sonamu-dictionary.js +141 -284
  105. package/dist/dict/types.js +1 -1
  106. package/dist/dict/utils.js +4 -5
  107. package/dist/entity/entity-manager.d.ts +2 -2
  108. package/dist/entity/entity-manager.js +34 -82
  109. package/dist/entity/entity-template-cone.js +33 -66
  110. package/dist/entity/entity.js +156 -310
  111. package/dist/env.d.ts +14 -0
  112. package/dist/env.d.ts.map +1 -0
  113. package/dist/env.js +75 -0
  114. package/dist/exceptions/error-handler.js +2 -3
  115. package/dist/exceptions/so-exceptions.js +7 -5
  116. package/dist/filter/index.js +1 -2
  117. package/dist/filter/types.js +3 -4
  118. package/dist/filter/utils.js +21 -54
  119. package/dist/index.js +8 -7
  120. package/dist/logger/category.js +6 -12
  121. package/dist/logger/configure.js +23 -34
  122. package/dist/migration/code-generation.js +146 -314
  123. package/dist/migration/index-where-predicate.js +52 -144
  124. package/dist/migration/migration-set.js +19 -33
  125. package/dist/migration/migrator.d.ts +2 -0
  126. package/dist/migration/migrator.d.ts.map +1 -1
  127. package/dist/migration/migrator.js +69 -53
  128. package/dist/migration/postgresql-schema-reader.js +126 -225
  129. package/dist/migration/slack-confirm.d.ts +1 -0
  130. package/dist/migration/slack-confirm.d.ts.map +1 -1
  131. package/dist/migration/slack-confirm.js +28 -38
  132. package/dist/migration/types.js +1 -1
  133. package/dist/naite/messaging-types.js +1 -1
  134. package/dist/naite/naite-reporter.js +15 -32
  135. package/dist/naite/naite.js +43 -76
  136. package/dist/ssr/index.js +6 -9
  137. package/dist/ssr/registry.js +10 -18
  138. package/dist/ssr/renderer.js +10 -21
  139. package/dist/ssr/types.js +1 -1
  140. package/dist/storage/base-file.js +5 -10
  141. package/dist/storage/buffered-file.js +3 -4
  142. package/dist/storage/drivers.js +2 -3
  143. package/dist/storage/index.js +2 -3
  144. package/dist/storage/s3-driver.js +5 -9
  145. package/dist/storage/storage-manager.js +5 -5
  146. package/dist/storage/types.js +1 -1
  147. package/dist/storage/uploaded-file.js +4 -6
  148. package/dist/stream/index.js +1 -2
  149. package/dist/stream/sse.js +8 -13
  150. package/dist/stream/ws-audience-resolver.js +5 -5
  151. package/dist/stream/ws-audience.js +3 -4
  152. package/dist/stream/ws-cluster-bus.js +3 -4
  153. package/dist/stream/ws-core.js +1 -1
  154. package/dist/stream/ws-delivery.js +11 -25
  155. package/dist/stream/ws-local-connection-store.js +9 -18
  156. package/dist/stream/ws-presence-store.js +43 -97
  157. package/dist/stream/ws-registry.js +17 -22
  158. package/dist/stream/ws-telemetry-memory.js +38 -45
  159. package/dist/stream/ws-telemetry-trace.js +4 -6
  160. package/dist/stream/ws-telemetry.js +82 -135
  161. package/dist/stream/ws.js +47 -91
  162. package/dist/syncer/api-parser.js +81 -147
  163. package/dist/syncer/checksum.js +9 -20
  164. package/dist/syncer/code-generator.js +29 -47
  165. package/dist/syncer/entity-operations.js +17 -27
  166. package/dist/syncer/event-batcher.js +8 -15
  167. package/dist/syncer/file-patterns.js +3 -4
  168. package/dist/syncer/file-tracking.js +6 -10
  169. package/dist/syncer/index.js +1 -2
  170. package/dist/syncer/module-loader.js +10 -26
  171. package/dist/syncer/syncer-actions.js +19 -37
  172. package/dist/syncer/syncer.js +46 -98
  173. package/dist/syncer/watcher.js +12 -26
  174. package/dist/tasks/decorator.js +7 -11
  175. package/dist/tasks/step-wrapper.js +7 -8
  176. package/dist/tasks/workflow-manager.js +18 -25
  177. package/dist/template/entity-converter.js +40 -64
  178. package/dist/template/helpers.js +32 -63
  179. package/dist/template/implementations/entity.template.js +7 -11
  180. package/dist/template/implementations/entry-server.template.js +2 -3
  181. package/dist/template/implementations/generated.template.js +25 -51
  182. package/dist/template/implementations/generated_http.template.js +31 -58
  183. package/dist/template/implementations/generated_sso.template.js +45 -85
  184. package/dist/template/implementations/init_types.template.js +4 -7
  185. package/dist/template/implementations/model.template.js +5 -10
  186. package/dist/template/implementations/model_test.template.js +2 -3
  187. package/dist/template/implementations/queries.template.js +4 -7
  188. package/dist/template/implementations/sd.template.js +17 -35
  189. package/dist/template/implementations/services.template.js +18 -30
  190. package/dist/template/implementations/view_form.template.js +72 -125
  191. package/dist/template/implementations/view_id_all_select.template.js +2 -3
  192. package/dist/template/implementations/view_list.template.js +86 -143
  193. package/dist/template/implementations/view_search_input.template.js +2 -3
  194. package/dist/template/index.js +5 -8
  195. package/dist/template/template-manager.js +13 -26
  196. package/dist/template/template-types.js +2 -3
  197. package/dist/template/template.js +7 -11
  198. package/dist/template/zod-converter.js +173 -348
  199. package/dist/testing/_relation-graph.js +18 -37
  200. package/dist/testing/bootstrap.js +5 -8
  201. package/dist/testing/data-explorer.js +34 -78
  202. package/dist/testing/dev-test-routes.js +54 -60
  203. package/dist/testing/dev-vitest-manager.js +33 -84
  204. package/dist/testing/faker-mappings.js +3 -4
  205. package/dist/testing/fixture-generator.d.ts +2 -1
  206. package/dist/testing/fixture-generator.d.ts.map +1 -1
  207. package/dist/testing/fixture-generator.js +159 -321
  208. package/dist/testing/fixture-loader.js +2 -2
  209. package/dist/testing/fixture-manager.d.ts.map +1 -1
  210. package/dist/testing/fixture-manager.js +124 -227
  211. package/dist/testing/global-setup.d.ts.map +1 -1
  212. package/dist/testing/global-setup.js +29 -17
  213. package/dist/testing/index.js +1 -2
  214. package/dist/testing/naite-vitest-reporter.js +2 -3
  215. package/dist/testing/parallel-db-manager.js +5 -3
  216. package/dist/testing/vitest-helpers.d.ts.map +1 -1
  217. package/dist/testing/vitest-helpers.js +15 -12
  218. package/dist/types/types.d.ts +14 -14
  219. package/dist/types/types.js +27 -50
  220. package/dist/ui/ai-api.js +6 -11
  221. package/dist/ui/ai-client.js +86 -134
  222. package/dist/ui/api.js +99 -195
  223. package/dist/ui/cdd-service.js +78 -130
  224. package/dist/ui/cdd-types.js +1 -1
  225. package/dist/ui-web/assets/{index-Df8q-fhb.js → index-DFStGyd0.js} +49 -49
  226. package/dist/ui-web/assets/index-Dx4ap5i4.css +1 -0
  227. package/dist/ui-web/index.html +2 -2
  228. package/dist/utils/async-utils.js +13 -25
  229. package/dist/utils/class-name.js +3 -4
  230. package/dist/utils/console-util.js +11 -26
  231. package/dist/utils/controller.d.ts.map +1 -1
  232. package/dist/utils/controller.js +14 -12
  233. package/dist/utils/esm-utils.js +5 -8
  234. package/dist/utils/formatter.js +10 -22
  235. package/dist/utils/fs-utils.js +14 -25
  236. package/dist/utils/lodash-able.js +3 -4
  237. package/dist/utils/model.js +7 -14
  238. package/dist/utils/object-utils.js +41 -73
  239. package/dist/utils/path-utils.js +5 -9
  240. package/dist/utils/process-utils.js +4 -7
  241. package/dist/utils/sql-parser.js +6 -13
  242. package/dist/utils/type-utils.js +16 -26
  243. package/dist/utils/utils.js +18 -40
  244. package/dist/utils/zod-error.js +9 -16
  245. package/dist/vector/chunking.js +24 -37
  246. package/dist/vector/config.js +2 -2
  247. package/dist/vector/embedding.js +8 -19
  248. package/dist/vector/index.js +1 -2
  249. package/dist/vector/types.js +1 -1
  250. package/package.json +7 -7
  251. package/src/__tests__/env.test.ts +127 -0
  252. package/src/api/__tests__/config.test.ts +10 -1
  253. package/src/api/config.ts +4 -12
  254. package/src/api/sonamu.ts +14 -4
  255. package/src/bin/__tests__/migrate-targets.test.ts +28 -0
  256. package/src/bin/__tests__/test-command.test.ts +82 -1
  257. package/src/bin/cli.ts +9 -18
  258. package/src/bin/fixture.ts +5 -4
  259. package/src/bin/migrate-targets.ts +7 -0
  260. package/src/bin/test-command.ts +2 -2
  261. package/src/database/__tests__/db.test.ts +175 -0
  262. package/src/database/db.ts +193 -71
  263. package/src/dict/en.ts +2 -0
  264. package/src/dict/ko.ts +2 -0
  265. package/src/env.ts +123 -0
  266. package/src/migration/__tests__/migrator.test.ts +149 -0
  267. package/src/migration/migrator.ts +74 -17
  268. package/src/migration/slack-confirm.ts +21 -0
  269. package/src/skills/sonamu/database.md +1 -1
  270. package/src/skills/sonamu/entity-basic.md +31 -0
  271. package/src/skills/sonamu/puri.md +22 -0
  272. package/src/skills/sonamu/testing-devrunner.md +1 -1
  273. package/src/skills/sonamu/upsert.md +53 -6
  274. package/src/stream/ws-telemetry-memory.ts +2 -2
  275. package/src/testing/fixture-generator.ts +2 -1
  276. package/src/testing/fixture-manager.ts +3 -4
  277. package/src/testing/global-setup.ts +42 -18
  278. package/src/testing/vitest-helpers.ts +14 -0
  279. package/src/utils/controller.ts +14 -7
  280. package/tsdown.api.config.ts +6 -0
  281. package/dist/_virtual/rolldown_runtime.js +0 -39
  282. package/dist/ui-web/assets/index-D4rYm-Xz.css +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"fixture.d.ts","sourceRoot":"","sources":["../../src/bin/fixture.ts"],"names":[],"mappings":"AAQA,OAAO,EAAE,KAAK,oBAAoB,EAAE,MAAM,0BAA0B,CAAC;AAGrE,UAAU,qBAAqB;IAC7B,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC;IACb,GAAG,CAAC,EAAE,OAAO,CAAC;IACd,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,EAAE,oBAAoB,CAAC;IAChC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,UAAU,CAAC,EAAE,OAAO,CAAC;CACtB;AAmBD;;GAEG;AACH,wBAAsB,iBAAiB,CAAC,OAAO,EAAE,qBAAqB,iBAuTrE;AAED;;;GAGG;AACH,wBAAsB,mBAAmB,CAAC,OAAO,EAAE,qBAAqB,iBAgEvE;AAED;;;GAGG;AACH,wBAAsB,qBAAqB,CAAC,OAAO,EAAE,qBAAqB,iBAgDzE"}
1
+ {"version":3,"file":"fixture.d.ts","sourceRoot":"","sources":["../../src/bin/fixture.ts"],"names":[],"mappings":"AASA,OAAO,EAAE,KAAK,oBAAoB,EAAE,MAAM,0BAA0B,CAAC;AAGrE,UAAU,qBAAqB;IAC7B,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC;IACb,GAAG,CAAC,EAAE,OAAO,CAAC;IACd,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,EAAE,oBAAoB,CAAC;IAChC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,UAAU,CAAC,EAAE,OAAO,CAAC;CACtB;AAmBD;;GAEG;AACH,wBAAsB,iBAAiB,CAAC,OAAO,EAAE,qBAAqB,iBAuTrE;AAED;;;GAGG;AACH,wBAAsB,mBAAmB,CAAC,OAAO,EAAE,qBAAqB,iBAgEvE;AAED;;;GAGG;AACH,wBAAsB,qBAAqB,CAAC,OAAO,EAAE,qBAAqB,iBAgDzE"}
@@ -1,3 +1,4 @@
1
+ import { getSonamuEnvironment, init_env } from "../env.js";
1
2
  import { createKnexInstance, init_knex } from "../database/knex.js";
2
3
  import { DB, init_db } from "../database/db.js";
3
4
  import { Sonamu, init_sonamu } from "../api/sonamu.js";
@@ -6,12 +7,12 @@ import { DataExplorer, init_data_explorer } from "../testing/data-explorer.js";
6
7
  import { FixtureGenerator, init_fixture_generator } from "../testing/fixture-generator.js";
7
8
  import chalk from "chalk";
8
9
  import prompts from "prompts";
9
-
10
10
  //#region src/bin/fixture.ts
11
11
  init_sonamu();
12
12
  init_db();
13
13
  init_knex();
14
14
  init_entity_manager();
15
+ init_env();
15
16
  init_data_explorer();
16
17
  init_fixture_generator();
17
18
  /**
@@ -19,12 +20,8 @@ init_fixture_generator();
19
20
  */
20
21
  function sanitizeUsername(raw) {
21
22
  let username = raw.toLowerCase().replace(/[^a-z0-9]/g, "");
22
- if (username.length === 0) {
23
- username = "user";
24
- }
25
- if (/^[0-9]/.test(username)) {
26
- username = `u${username}`;
27
- }
23
+ if (username.length === 0) username = "user";
24
+ if (/^[0-9]/.test(username)) username = `u${username}`;
28
25
  return username.slice(0, 20);
29
26
  }
30
27
  /**
@@ -32,9 +29,7 @@ function sanitizeUsername(raw) {
32
29
  */
33
30
  async function fixtureGenCommand(options) {
34
31
  try {
35
- if (!EntityManager.isAutoloaded) {
36
- await EntityManager.autoload();
37
- }
32
+ if (!EntityManager.isAutoloaded) await EntityManager.autoload();
38
33
  let entityNames;
39
34
  if (options.all) {
40
35
  entityNames = EntityManager.getAllIds();
@@ -42,9 +37,8 @@ async function fixtureGenCommand(options) {
42
37
  const excludeList = options.exclude.split(",").map((s) => s.trim());
43
38
  entityNames = entityNames.filter((name) => !excludeList.includes(name));
44
39
  }
45
- } else if (options.include) {
46
- entityNames = options.include.split(",").map((s) => s.trim());
47
- } else {
40
+ } else if (options.include) entityNames = options.include.split(",").map((s) => s.trim());
41
+ else {
48
42
  const result = await prompts({
49
43
  type: "multiselect",
50
44
  name: "entities",
@@ -76,8 +70,7 @@ async function fixtureGenCommand(options) {
76
70
  }
77
71
  count = result.count;
78
72
  }
79
- const hasUser = entityNames.includes("User");
80
- if (hasUser) {
73
+ if (entityNames.includes("User")) {
81
74
  const userModeResult = await prompts({
82
75
  type: "select",
83
76
  name: "userMode",
@@ -95,45 +88,37 @@ async function fixtureGenCommand(options) {
95
88
  return;
96
89
  }
97
90
  if (userModeResult.userMode === "login") {
98
- let useLLM$1 = options["use-llm"] ?? false;
99
- if (!options["use-llm"]) {
100
- const llmResult = await prompts({
101
- type: "confirm",
102
- name: "useLLM",
103
- message: "LLM으로 더 현실적인 데이터를 생성할까요? (fixtureHint 기반, ANTHROPIC_API_KEY 필요)",
104
- initial: false
105
- });
106
- useLLM$1 = llmResult.useLLM ?? false;
107
- }
108
- const enableLLMCache$1 = !options["no-cache"];
91
+ let useLLM = options["use-llm"] ?? false;
92
+ if (!options["use-llm"]) useLLM = (await prompts({
93
+ type: "confirm",
94
+ name: "useLLM",
95
+ message: "LLM으로 더 현실적인 데이터를 생성할까요? (fixtureHint 기반, ANTHROPIC_API_KEY 필요)",
96
+ initial: false
97
+ })).useLLM ?? false;
98
+ const enableLLMCache = !options["no-cache"];
109
99
  const DEFAULT_PASSWORD = "Test1234!";
110
100
  const sourceDb = DB.getDB("r");
111
- const generator$1 = new FixtureGenerator(sourceDb, sourceDb, "production_master", EntityManager, {
112
- useLLM: useLLM$1,
113
- enableLLMCache: enableLLMCache$1
101
+ const generator = new FixtureGenerator(sourceDb, sourceDb, getSonamuEnvironment(), EntityManager, {
102
+ useLLM,
103
+ enableLLMCache
114
104
  });
115
105
  const createdCredentials = [];
116
106
  const basePath = Sonamu.config.server.auth?.basePath ?? "/api/auth";
117
- if (useLLM$1) {
118
- console.log(chalk.cyan(`\nLLM 모드로 로그인 가능한 사용자 ${count}명 생성 중... (캐싱: ${enableLLMCache$1 ? "ON" : "OFF"})`));
119
- } else {
120
- console.log(chalk.cyan(`\n로그인 가능한 사용자 ${count}명 생성 중...`));
121
- }
107
+ if (useLLM) console.log(chalk.cyan(`\nLLM 모드로 로그인 가능한 사용자 ${count}명 생성 중... (캐싱: ${enableLLMCache ? "ON" : "OFF"})`));
108
+ else console.log(chalk.cyan(`\n로그인 가능한 사용자 ${count}명 생성 중...`));
122
109
  for (let i = 0; i < count; i++) {
123
- const userData = await generator$1.generate("User");
110
+ const userData = await generator.generate("User");
124
111
  const name = String(userData.name ?? "");
125
112
  const email = String(userData.email ?? "");
126
113
  const username = sanitizeUsername(String(userData.username ?? ""));
127
- const displayUsername = userData.display_username !== undefined ? String(userData.display_username) : undefined;
114
+ const displayUsername = userData.display_username !== void 0 ? String(userData.display_username) : void 0;
128
115
  const body = {
129
116
  name,
130
117
  email,
131
118
  username,
132
119
  password: DEFAULT_PASSWORD
133
120
  };
134
- if (displayUsername !== undefined) {
135
- body.display_username = displayUsername;
136
- }
121
+ if (displayUsername !== void 0) body.display_username = displayUsername;
137
122
  const req = new Request(`http://localhost${basePath}/sign-up/email`, {
138
123
  method: "POST",
139
124
  headers: { "Content-Type": "application/json" },
@@ -142,8 +127,7 @@ async function fixtureGenCommand(options) {
142
127
  const response = await Sonamu.auth.handler(req);
143
128
  if (!response.ok) {
144
129
  const responseData = await response.json();
145
- const code = typeof responseData.code === "string" ? responseData.code : undefined;
146
- if (code === "USER_ALREADY_EXISTS") {
130
+ if ((typeof responseData.code === "string" ? responseData.code : void 0) === "USER_ALREADY_EXISTS") {
147
131
  console.log(chalk.yellow(` ⚠️ ${email} 이미 존재 - 건너뜁니다.`));
148
132
  continue;
149
133
  }
@@ -161,8 +145,8 @@ async function fixtureGenCommand(options) {
161
145
  await DB.getDB("w")("users").whereIn("email", emails).update({ email_verified: true });
162
146
  console.log(chalk.green(`\nemail_verified = true 업데이트 완료`));
163
147
  }
164
- if (useLLM$1) {
165
- const stats = generator$1.getLLMCacheStats();
148
+ if (useLLM) {
149
+ const stats = generator.getLLMCacheStats();
166
150
  console.log(chalk.cyan(`[LLM Cache] 캐시 크기: ${stats.size}`));
167
151
  }
168
152
  console.log(chalk.green(`\n✅ ${createdCredentials.length}명의 로그인 가능한 사용자 생성 완료`));
@@ -175,7 +159,7 @@ async function fixtureGenCommand(options) {
175
159
  }
176
160
  let saveTarget = options["save-to"] || "db";
177
161
  if (!options["save-to"]) {
178
- const result = await prompts({
162
+ saveTarget = (await prompts({
179
163
  type: "select",
180
164
  name: "saveTarget",
181
165
  message: "저장 방식:",
@@ -197,8 +181,7 @@ async function fixtureGenCommand(options) {
197
181
  value: "none"
198
182
  }
199
183
  ]
200
- });
201
- saveTarget = result.saveTarget;
184
+ })).saveTarget;
202
185
  if (saveTarget === "file:custom") {
203
186
  const filenameResult = await prompts({
204
187
  type: "text",
@@ -214,26 +197,20 @@ async function fixtureGenCommand(options) {
214
197
  }
215
198
  }
216
199
  let useLLM = options["use-llm"] ?? false;
217
- if (!options["use-llm"]) {
218
- const llmResult = await prompts({
219
- type: "confirm",
220
- name: "useLLM",
221
- message: "LLM으로 더 현실적인 데이터를 생성할까요? (fixtureHint 기반, ANTHROPIC_API_KEY 필요)",
222
- initial: false
223
- });
224
- useLLM = llmResult.useLLM ?? false;
225
- }
200
+ if (!options["use-llm"]) useLLM = (await prompts({
201
+ type: "confirm",
202
+ name: "useLLM",
203
+ message: "LLM으로 더 현실적인 데이터를 생성할까요? (fixtureHint 기반, ANTHROPIC_API_KEY 필요)",
204
+ initial: false
205
+ })).useLLM ?? false;
226
206
  const enableLLMCache = !options["no-cache"];
227
207
  const fixtureDb = createKnexInstance(Sonamu.dbConfig.fixture);
228
208
  const generator = new FixtureGenerator(fixtureDb, fixtureDb, "fixture", EntityManager, {
229
209
  useLLM,
230
210
  enableLLMCache
231
211
  });
232
- if (useLLM) {
233
- console.log(chalk.cyan(`\nLLM 모드로 ${entityNames.join(", ")} 생성 중... (캐싱: ${enableLLMCache ? "ON" : "OFF"})`));
234
- } else {
235
- console.log(chalk.cyan(`\n${entityNames.join(", ")} 생성 중...`));
236
- }
212
+ if (useLLM) console.log(chalk.cyan(`\nLLM 모드로 ${entityNames.join(", ")} 생성 중... (캐싱: ${enableLLMCache ? "ON" : "OFF"})`));
213
+ else console.log(chalk.cyan(`\n${entityNames.join(", ")} 생성 중...`));
237
214
  const specs = entityNames.map((entityName) => ({
238
215
  entity: entityName,
239
216
  count,
@@ -245,11 +222,9 @@ async function fixtureGenCommand(options) {
245
222
  console.log(chalk.cyan(`[LLM Cache] 캐시 크기: ${stats.size}`));
246
223
  }
247
224
  console.log(chalk.green(`\n✅ ${results.length}개 fixture 생성 완료`));
248
- if (saveTarget === "none") {
249
- console.log(JSON.stringify(results, null, 2));
250
- } else if (saveTarget === "db") {
251
- console.log(chalk.green("Fixture DB에 저장되었습니다."));
252
- } else if (saveTarget.startsWith("file")) {
225
+ if (saveTarget === "none") console.log(JSON.stringify(results, null, 2));
226
+ else if (saveTarget === "db") console.log(chalk.green("Fixture DB에 저장되었습니다."));
227
+ else if (saveTarget.startsWith("file")) {
253
228
  const fs = await import("node:fs/promises");
254
229
  const path = await import("node:path");
255
230
  const fixturesDir = path.join(process.cwd(), "test", "fixtures");
@@ -260,23 +235,17 @@ async function fixtureGenCommand(options) {
260
235
  }
261
236
  for (const entityName of entityNames) {
262
237
  const entityResults = results.filter((r) => r.entityId === entityName);
263
- if (entityResults.length === 0) {
264
- continue;
265
- }
238
+ if (entityResults.length === 0) continue;
266
239
  let filename;
267
- if (saveTarget === "file") {
268
- const entity = EntityManager.get(entityName);
269
- filename = `${entity.table}.json`;
270
- } else {
271
- filename = saveTarget.replace("file:", "");
272
- }
240
+ if (saveTarget === "file") filename = `${EntityManager.get(entityName).table}.json`;
241
+ else filename = saveTarget.replace("file:", "");
273
242
  const filepath = path.join(fixturesDir, filename);
274
243
  await fs.writeFile(filepath, JSON.stringify(entityResults.map((r) => r.data), null, 2));
275
244
  console.log(chalk.green(`✅ ${filepath} 저장 완료`));
276
245
  }
277
246
  }
278
247
  } catch (error) {
279
- console.error(chalk.red("Fixture 생성 중 오류가 발생했습니다.\n" + "원인: Entity 정의나 DB 연결을 확인해주세요.\n" + "자세한 내용:"), error);
248
+ console.error(chalk.red("Fixture 생성 중 오류가 발생했습니다.\n원인: Entity 정의나 DB 연결을 확인해주세요.\n자세한 내용:"), error);
280
249
  throw error;
281
250
  }
282
251
  }
@@ -286,9 +255,7 @@ async function fixtureGenCommand(options) {
286
255
  */
287
256
  async function fixtureFetchCommand(options) {
288
257
  try {
289
- if (!EntityManager.isAutoloaded) {
290
- await EntityManager.autoload();
291
- }
258
+ if (!EntityManager.isAutoloaded) await EntityManager.autoload();
292
259
  let entityNames;
293
260
  if (options.all) {
294
261
  entityNames = EntityManager.getAllIds();
@@ -296,9 +263,8 @@ async function fixtureFetchCommand(options) {
296
263
  const excludeList = options.exclude.split(",").map((s) => s.trim());
297
264
  entityNames = entityNames.filter((name) => !excludeList.includes(name));
298
265
  }
299
- } else if (options.include) {
300
- entityNames = options.include.split(",").map((s) => s.trim());
301
- } else {
266
+ } else if (options.include) entityNames = options.include.split(",").map((s) => s.trim());
267
+ else {
302
268
  const result = await prompts({
303
269
  type: "multiselect",
304
270
  name: "entities",
@@ -317,9 +283,7 @@ async function fixtureFetchCommand(options) {
317
283
  }
318
284
  const strategy = options.strategy ?? "recent";
319
285
  const limit = options.limit ? Number.parseInt(options.limit, 10) : 10;
320
- const sourceDb = DB.getDB("r");
321
- const fixtureDb = createKnexInstance(Sonamu.dbConfig.fixture);
322
- const generator = new FixtureGenerator(sourceDb, fixtureDb, "fixture", EntityManager);
286
+ const generator = new FixtureGenerator(DB.getDB("r"), createKnexInstance(Sonamu.dbConfig.fixture), "fixture", EntityManager);
323
287
  console.log(chalk.cyan(`\n${entityNames.join(", ")} import 중...`));
324
288
  for (const entityName of entityNames) {
325
289
  const results = await generator.importFromSource(entityName, {
@@ -331,7 +295,7 @@ async function fixtureFetchCommand(options) {
331
295
  console.log(chalk.green(`✅ ${entityName}: ${results.length}개 import 완료`));
332
296
  }
333
297
  } catch (error) {
334
- console.error(chalk.red("실제 DB에서 데이터를 가져오는 중 오류가 발생했습니다.\n" + "원인: 소스 DB 연결 설정(sonamu.config.ts)이나 Entity 관계 정의를 확인해주세요.\n" + "자세한 내용:"), error);
298
+ console.error(chalk.red("실제 DB에서 데이터를 가져오는 중 오류가 발생했습니다.\n원인: 소스 DB 연결 설정(sonamu.config.ts)이나 Entity 관계 정의를 확인해주세요.\n자세한 내용:"), error);
335
299
  throw error;
336
300
  }
337
301
  }
@@ -341,9 +305,7 @@ async function fixtureFetchCommand(options) {
341
305
  */
342
306
  async function fixtureExploreCommand(options) {
343
307
  try {
344
- if (!EntityManager.isAutoloaded) {
345
- await EntityManager.autoload();
346
- }
308
+ if (!EntityManager.isAutoloaded) await EntityManager.autoload();
347
309
  let entityName = options.include;
348
310
  if (!entityName) {
349
311
  const result = await prompts({
@@ -361,25 +323,21 @@ async function fixtureExploreCommand(options) {
361
323
  }
362
324
  entityName = result.entity;
363
325
  }
364
- if (!entityName) {
365
- throw new Error("Entity name is required");
366
- }
326
+ if (!entityName) throw new Error("Entity name is required");
367
327
  const strategy = options.strategy ?? "sample";
368
328
  const limit = options.limit ? Number.parseInt(options.limit, 10) : 10;
369
- const db = DB.getDB("r");
370
- const explorer = new DataExplorer(db, EntityManager);
371
- const data = await explorer.explore(entityName, {
329
+ const data = await new DataExplorer(DB.getDB("r"), EntityManager).explore(entityName, {
372
330
  strategy,
373
331
  limit
374
332
  });
375
333
  console.log(chalk.cyan(`\n${entityName} ${data.length}개 조회 완료:`));
376
334
  console.table(data);
377
335
  } catch (error) {
378
- console.error(chalk.red("데이터 조회 중 오류가 발생했습니다.\n" + "원인: DB 연결이나 Entity 정의를 확인해주세요.\n" + "자세한 내용:"), error);
336
+ console.error(chalk.red("데이터 조회 중 오류가 발생했습니다.\n원인: DB 연결이나 Entity 정의를 확인해주세요.\n자세한 내용:"), error);
379
337
  throw error;
380
338
  }
381
339
  }
382
-
383
340
  //#endregion
384
341
  export { fixtureExploreCommand, fixtureFetchCommand, fixtureGenCommand };
385
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZml4dHVyZS5qcyIsIm5hbWVzIjpbImVudGl0eU5hbWVzOiBzdHJpbmdbXSIsInVzZUxMTSIsImVuYWJsZUxMTUNhY2hlIiwiZ2VuZXJhdG9yIiwiY3JlYXRlZENyZWRlbnRpYWxzOiBBcnJheTx7IGVtYWlsOiBzdHJpbmc7IHBhc3N3b3JkOiBzdHJpbmcgfT4iLCJib2R5OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiIsImZpbGVuYW1lOiBzdHJpbmciLCJzdHJhdGVneTogRGF0YUV4cGxvcmVyU3RyYXRlZ3kiXSwic291cmNlcyI6WyIuLi8uLi9zcmMvYmluL2ZpeHR1cmUudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IGNoYWxrIGZyb20gXCJjaGFsa1wiO1xuaW1wb3J0IHByb21wdHMgZnJvbSBcInByb21wdHNcIjtcblxuaW1wb3J0IHsgU29uYW11IH0gZnJvbSBcIi4uL2FwaS9zb25hbXVcIjtcbmltcG9ydCB7IERCIH0gZnJvbSBcIi4uL2RhdGFiYXNlL2RiXCI7XG5pbXBvcnQgeyBjcmVhdGVLbmV4SW5zdGFuY2UgfSBmcm9tIFwiLi4vZGF0YWJhc2Uva25leFwiO1xuaW1wb3J0IHsgRW50aXR5TWFuYWdlciB9IGZyb20gXCIuLi9lbnRpdHkvZW50aXR5LW1hbmFnZXJcIjtcbmltcG9ydCB7IERhdGFFeHBsb3JlciB9IGZyb20gXCIuLi90ZXN0aW5nL2RhdGEtZXhwbG9yZXJcIjtcbmltcG9ydCB7IHR5cGUgRGF0YUV4cGxvcmVyU3RyYXRlZ3kgfSBmcm9tIFwiLi4vdGVzdGluZy9kYXRhLWV4cGxvcmVyXCI7XG5pbXBvcnQgeyBGaXh0dXJlR2VuZXJhdG9yIH0gZnJvbSBcIi4uL3Rlc3RpbmcvZml4dHVyZS1nZW5lcmF0b3JcIjtcblxuaW50ZXJmYWNlIEZpeHR1cmVDb21tYW5kT3B0aW9ucyB7XG4gIF8/OiBzdHJpbmdbXTtcbiAgYWxsPzogYm9vbGVhbjtcbiAgaW5jbHVkZT86IHN0cmluZztcbiAgZXhjbHVkZT86IHN0cmluZztcbiAgY291bnQ/OiBzdHJpbmc7XG4gIFwic2F2ZS10b1wiPzogc3RyaW5nO1xuICBzdHJhdGVneT86IERhdGFFeHBsb3JlclN0cmF0ZWd5O1xuICBsaW1pdD86IHN0cmluZztcbiAgXCJ1c2UtbGxtXCI/OiBib29sZWFuO1xuICBcIm5vLWNhY2hlXCI/OiBib29sZWFuO1xufVxuXG4vKipcbiAqIHVzZXJuYW1l7J2EIOydvOuwmOyggeyduCDqt5zsuZko7JiB66y47J6QIOyLnOyekSwg7JiB66y47J6QL+yIq+yekOunjCwgMS0yMOyekCnsl5Ag66ee64+E66GdIOygleq3nO2ZlO2VqeuLiOuLpC5cbiAqL1xuZnVuY3Rpb24gc2FuaXRpemVVc2VybmFtZShyYXc6IHN0cmluZyk6IHN0cmluZyB7XG4gIC8vIOyGjOusuOyekCDrs4DtmZgg7ZuEIOyYgeusuOyekC/siKvsnpAg7Jm4IOusuOyekCDsoJzqsbBcbiAgbGV0IHVzZXJuYW1lID0gcmF3LnRvTG93ZXJDYXNlKCkucmVwbGFjZSgvW15hLXowLTldL2csIFwiXCIpO1xuICBpZiAodXNlcm5hbWUubGVuZ3RoID09PSAwKSB7XG4gICAgdXNlcm5hbWUgPSBcInVzZXJcIjtcbiAgfVxuICAvLyDssqsg6riA7J6Q6rCAIOyIq+yekOuptCAndScg7KCR65GQ7Ja0IOy2lOqwgFxuICBpZiAoL15bMC05XS8udGVzdCh1c2VybmFtZSkpIHtcbiAgICB1c2VybmFtZSA9IGB1JHt1c2VybmFtZX1gO1xuICB9XG4gIC8vIDIw7J6QIOy0iOqzvCDsi5wgdHJ1bmNhdGVcbiAgcmV0dXJuIHVzZXJuYW1lLnNsaWNlKDAsIDIwKTtcbn1cblxuLyoqXG4gKiBmaXh0dXJlIGdlbiDrqoXroLnslrQgLSBjb25lIOuplO2DgOuNsOydtO2EsOulvCDtmZzsmqntlZjsl6wg7J6Q64+Z7Jy866GcIGZpeHR1cmXrpbwg7IOd7ISx7ZWp64uI64ukLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZml4dHVyZUdlbkNvbW1hbmQob3B0aW9uczogRml4dHVyZUNvbW1hbmRPcHRpb25zKSB7XG4gIHRyeSB7XG4gICAgaWYgKCFFbnRpdHlNYW5hZ2VyLmlzQXV0b2xvYWRlZCkge1xuICAgICAgYXdhaXQgRW50aXR5TWFuYWdlci5hdXRvbG9hZCgpO1xuICAgIH1cblxuICAgIGxldCBlbnRpdHlOYW1lczogc3RyaW5nW107XG5cbiAgICBpZiAob3B0aW9ucy5hbGwpIHtcbiAgICAgIGVudGl0eU5hbWVzID0gRW50aXR5TWFuYWdlci5nZXRBbGxJZHMoKTtcbiAgICAgIGlmIChvcHRpb25zLmV4Y2x1ZGUpIHtcbiAgICAgICAgY29uc3QgZXhjbHVkZUxpc3QgPSBvcHRpb25zLmV4Y2x1ZGUuc3BsaXQoXCIsXCIpLm1hcCgoczogc3RyaW5nKSA9PiBzLnRyaW0oKSk7XG4gICAgICAgIGVudGl0eU5hbWVzID0gZW50aXR5TmFtZXMuZmlsdGVyKChuYW1lKSA9PiAhZXhjbHVkZUxpc3QuaW5jbHVkZXMobmFtZSkpO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAob3B0aW9ucy5pbmNsdWRlKSB7XG4gICAgICBlbnRpdHlOYW1lcyA9IG9wdGlvbnMuaW5jbHVkZS5zcGxpdChcIixcIikubWFwKChzOiBzdHJpbmcpID0+IHMudHJpbSgpKTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgcHJvbXB0cyh7XG4gICAgICAgIHR5cGU6IFwibXVsdGlzZWxlY3RcIixcbiAgICAgICAgbmFtZTogXCJlbnRpdGllc1wiLFxuICAgICAgICBtZXNzYWdlOiBcIkZpeHR1cmXrpbwg7IOd7ISx7ZWgIEVudGl0eeulvCDshKDtg53tlZjshLjsmpQ6XCIsXG4gICAgICAgIGNob2ljZXM6IEVudGl0eU1hbmFnZXIuZ2V0QWxsSWRzKCkubWFwKChpZCkgPT4gKHsgdGl0bGU6IGlkLCB2YWx1ZTogaWQgfSkpLFxuICAgICAgICBtaW46IDEsXG4gICAgICB9KTtcblxuICAgICAgaWYgKCFyZXN1bHQuZW50aXRpZXMgfHwgcmVzdWx0LmVudGl0aWVzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICBjb25zb2xlLmxvZyhjaGFsay55ZWxsb3coXCLst6jshozrkJjsl4jsirXri4jri6QuXCIpKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBlbnRpdHlOYW1lcyA9IHJlc3VsdC5lbnRpdGllcztcbiAgICB9XG5cbiAgICBsZXQgY291bnQgPSBvcHRpb25zLmNvdW50ID8gTnVtYmVyLnBhcnNlSW50KG9wdGlvbnMuY291bnQsIDEwKSA6IDU7XG4gICAgaWYgKCFvcHRpb25zLmNvdW50KSB7XG4gICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBwcm9tcHRzKHtcbiAgICAgICAgdHlwZTogXCJudW1iZXJcIixcbiAgICAgICAgbmFtZTogXCJjb3VudFwiLFxuICAgICAgICBtZXNzYWdlOiBcIuqwgSBFbnRpdHnrs4Qg7IOd7ISxIOqwnOyImDpcIixcbiAgICAgICAgaW5pdGlhbDogNSxcbiAgICAgICAgbWluOiAxLFxuICAgICAgfSk7XG5cbiAgICAgIGlmICghcmVzdWx0LmNvdW50KSB7XG4gICAgICAgIGNvbnNvbGUubG9nKGNoYWxrLnllbGxvdyhcIuy3qOyGjOuQmOyXiOyKteuLiOuLpC5cIikpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGNvdW50ID0gcmVzdWx0LmNvdW50O1xuICAgIH1cblxuICAgIC8vIFVzZXIg7JeU7Yuw7Yuw6rCAIO2PrO2VqOuQnCDqsr3smrA6IOuhnOq3uOyduCDqsIDriqUv7ZmV7J247JqpIOu2hOq4sCDshKDtg51cbiAgICBjb25zdCBoYXNVc2VyID0gZW50aXR5TmFtZXMuaW5jbHVkZXMoXCJVc2VyXCIpO1xuXG4gICAgaWYgKGhhc1VzZXIpIHtcbiAgICAgIGNvbnN0IHVzZXJNb2RlUmVzdWx0ID0gYXdhaXQgcHJvbXB0cyh7XG4gICAgICAgIHR5cGU6IFwic2VsZWN0XCIsXG4gICAgICAgIG5hbWU6IFwidXNlck1vZGVcIixcbiAgICAgICAgbWVzc2FnZTogXCJVc2VyIOyXlO2LsO2LsOqwgCDtj6ztlajrkJjslrQg7J6I7Iq164uI64ukLiDsg53shLEg67Cp7Iud7J2EIOyEoO2Dne2VmOyEuOyalDpcIixcbiAgICAgICAgY2hvaWNlczogW1xuICAgICAgICAgIHsgdGl0bGU6IFwiMS4g66Gc6re47J24IOqwgOuKpe2VnCDsgqzsmqnsnpAgZml4dHVyZSDsg53shLFcIiwgdmFsdWU6IFwibG9naW5cIiB9LFxuICAgICAgICAgIHsgdGl0bGU6IFwiMi4g7ZmV7J247JqpIOuNsOydtO2EsCjroZzqt7jsnbgg67aI6rCAKSDsg53shLFcIiwgdmFsdWU6IFwiZHVtbXlcIiB9LFxuICAgICAgICBdLFxuICAgICAgfSk7XG5cbiAgICAgIGlmICghdXNlck1vZGVSZXN1bHQudXNlck1vZGUpIHtcbiAgICAgICAgY29uc29sZS5sb2coY2hhbGsueWVsbG93KFwi7Leo7IaM65CY7JeI7Iq164uI64ukLlwiKSk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgaWYgKHVzZXJNb2RlUmVzdWx0LnVzZXJNb2RlID09PSBcImxvZ2luXCIpIHtcbiAgICAgICAgLy8gTExNIOyCrOyaqSDsl6zrtoBcbiAgICAgICAgbGV0IHVzZUxMTSA9IG9wdGlvbnNbXCJ1c2UtbGxtXCJdID8/IGZhbHNlO1xuICAgICAgICBpZiAoIW9wdGlvbnNbXCJ1c2UtbGxtXCJdKSB7XG4gICAgICAgICAgY29uc3QgbGxtUmVzdWx0ID0gYXdhaXQgcHJvbXB0cyh7XG4gICAgICAgICAgICB0eXBlOiBcImNvbmZpcm1cIixcbiAgICAgICAgICAgIG5hbWU6IFwidXNlTExNXCIsXG4gICAgICAgICAgICBtZXNzYWdlOlxuICAgICAgICAgICAgICBcIkxMTeycvOuhnCDrjZQg7ZiE7Iuk7KCB7J24IOuNsOydtO2EsOulvCDsg53shLHtlaDquYzsmpQ/IChmaXh0dXJlSGludCDquLDrsJgsIEFOVEhST1BJQ19BUElfS0VZIO2VhOyalClcIixcbiAgICAgICAgICAgIGluaXRpYWw6IGZhbHNlLFxuICAgICAgICAgIH0pO1xuICAgICAgICAgIHVzZUxMTSA9IGxsbVJlc3VsdC51c2VMTE0gPz8gZmFsc2U7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBlbmFibGVMTE1DYWNoZSA9ICFvcHRpb25zW1wibm8tY2FjaGVcIl07XG4gICAgICAgIGNvbnN0IERFRkFVTFRfUEFTU1dPUkQgPSBcIlRlc3QxMjM0IVwiO1xuXG4gICAgICAgIC8vIOuhnOq3uOyduCDqsIDriqUg6rK966Gc7JeQ7ISc64qUIHNvdXJjZURi66GcIGRldmVsb3BtZW50X21hc3RlciDsgqzsmqlcbiAgICAgICAgY29uc3Qgc291cmNlRGIgPSBEQi5nZXREQihcInJcIik7XG4gICAgICAgIGNvbnN0IGdlbmVyYXRvciA9IG5ldyBGaXh0dXJlR2VuZXJhdG9yKFxuICAgICAgICAgIHNvdXJjZURiLFxuICAgICAgICAgIHNvdXJjZURiLFxuICAgICAgICAgIFwicHJvZHVjdGlvbl9tYXN0ZXJcIixcbiAgICAgICAgICBFbnRpdHlNYW5hZ2VyLFxuICAgICAgICAgIHsgdXNlTExNLCBlbmFibGVMTE1DYWNoZSB9LFxuICAgICAgICApO1xuXG4gICAgICAgIGNvbnN0IGNyZWF0ZWRDcmVkZW50aWFsczogQXJyYXk8eyBlbWFpbDogc3RyaW5nOyBwYXNzd29yZDogc3RyaW5nIH0+ID0gW107XG4gICAgICAgIGNvbnN0IGJhc2VQYXRoID0gU29uYW11LmNvbmZpZy5zZXJ2ZXIuYXV0aD8uYmFzZVBhdGggPz8gXCIvYXBpL2F1dGhcIjtcblxuICAgICAgICBpZiAodXNlTExNKSB7XG4gICAgICAgICAgY29uc29sZS5sb2coXG4gICAgICAgICAgICBjaGFsay5jeWFuKFxuICAgICAgICAgICAgICBgXFxuTExNIOuqqOuTnOuhnCDroZzqt7jsnbgg6rCA64ql7ZWcIOyCrOyaqeyekCAke2NvdW50feuqhSDsg53shLEg7KSRLi4uICjsupDsi7E6ICR7ZW5hYmxlTExNQ2FjaGUgPyBcIk9OXCIgOiBcIk9GRlwifSlgLFxuICAgICAgICAgICAgKSxcbiAgICAgICAgICApO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGNvbnNvbGUubG9nKGNoYWxrLmN5YW4oYFxcbuuhnOq3uOyduCDqsIDriqXtlZwg7IKs7Jqp7J6QICR7Y291bnR966qFIOyDneyEsSDspJEuLi5gKSk7XG4gICAgICAgIH1cblxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNvdW50OyBpKyspIHtcbiAgICAgICAgICBjb25zdCB1c2VyRGF0YSA9IGF3YWl0IGdlbmVyYXRvci5nZW5lcmF0ZShcIlVzZXJcIik7XG5cbiAgICAgICAgICBjb25zdCBuYW1lID0gU3RyaW5nKHVzZXJEYXRhLm5hbWUgPz8gXCJcIik7XG4gICAgICAgICAgY29uc3QgZW1haWwgPSBTdHJpbmcodXNlckRhdGEuZW1haWwgPz8gXCJcIik7XG4gICAgICAgICAgY29uc3QgdXNlcm5hbWUgPSBzYW5pdGl6ZVVzZXJuYW1lKFN0cmluZyh1c2VyRGF0YS51c2VybmFtZSA/PyBcIlwiKSk7XG4gICAgICAgICAgY29uc3QgZGlzcGxheVVzZXJuYW1lID1cbiAgICAgICAgICAgIHVzZXJEYXRhLmRpc3BsYXlfdXNlcm5hbWUgIT09IHVuZGVmaW5lZCA/IFN0cmluZyh1c2VyRGF0YS5kaXNwbGF5X3VzZXJuYW1lKSA6IHVuZGVmaW5lZDtcblxuICAgICAgICAgIGNvbnN0IGJvZHk6IFJlY29yZDxzdHJpbmcsIHVua25vd24+ID0ge1xuICAgICAgICAgICAgbmFtZSxcbiAgICAgICAgICAgIGVtYWlsLFxuICAgICAgICAgICAgdXNlcm5hbWUsXG4gICAgICAgICAgICBwYXNzd29yZDogREVGQVVMVF9QQVNTV09SRCxcbiAgICAgICAgICB9O1xuICAgICAgICAgIGlmIChkaXNwbGF5VXNlcm5hbWUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgYm9keS5kaXNwbGF5X3VzZXJuYW1lID0gZGlzcGxheVVzZXJuYW1lO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGNvbnN0IHJlcSA9IG5ldyBSZXF1ZXN0KGBodHRwOi8vbG9jYWxob3N0JHtiYXNlUGF0aH0vc2lnbi11cC9lbWFpbGAsIHtcbiAgICAgICAgICAgIG1ldGhvZDogXCJQT1NUXCIsXG4gICAgICAgICAgICBoZWFkZXJzOiB7IFwiQ29udGVudC1UeXBlXCI6IFwiYXBwbGljYXRpb24vanNvblwiIH0sXG4gICAgICAgICAgICBib2R5OiBKU09OLnN0cmluZ2lmeShib2R5KSxcbiAgICAgICAgICB9KTtcblxuICAgICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgU29uYW11LmF1dGguaGFuZGxlcihyZXEpO1xuXG4gICAgICAgICAgaWYgKCFyZXNwb25zZS5vaykge1xuICAgICAgICAgICAgY29uc3QgcmVzcG9uc2VEYXRhID0gKGF3YWl0IHJlc3BvbnNlLmpzb24oKSkgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gICAgICAgICAgICBjb25zdCBjb2RlID0gdHlwZW9mIHJlc3BvbnNlRGF0YS5jb2RlID09PSBcInN0cmluZ1wiID8gcmVzcG9uc2VEYXRhLmNvZGUgOiB1bmRlZmluZWQ7XG4gICAgICAgICAgICBpZiAoY29kZSA9PT0gXCJVU0VSX0FMUkVBRFlfRVhJU1RTXCIpIHtcbiAgICAgICAgICAgICAgY29uc29sZS5sb2coY2hhbGsueWVsbG93KGAgIOKaoO+4jyAgJHtlbWFpbH0g7J2066+4IOyhtOyerCAtIOqxtOuEiOucgeuLiOuLpC5gKSk7XG4gICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc29sZS5sb2coY2hhbGsucmVkKGAgIOKdjCAke2VtYWlsfSDsg53shLEg7Iuk7YyoOiAke0pTT04uc3RyaW5naWZ5KHJlc3BvbnNlRGF0YSl9YCkpO1xuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgY3JlYXRlZENyZWRlbnRpYWxzLnB1c2goeyBlbWFpbCwgcGFzc3dvcmQ6IERFRkFVTFRfUEFTU1dPUkQgfSk7XG4gICAgICAgICAgY29uc29sZS5sb2coY2hhbGsuZ3JlZW4oYCAg4pyFICR7ZW1haWx9IOyDneyEsSDsmYTro4xgKSk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBlbWFpbF92ZXJpZmllZCA9IHRydWUg7KeB7KCRIOyXheuNsOydtO2KuCAoZGV2IO2OuOydmClcbiAgICAgICAgaWYgKGNyZWF0ZWRDcmVkZW50aWFscy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgY29uc3QgZW1haWxzID0gY3JlYXRlZENyZWRlbnRpYWxzLm1hcCgoYykgPT4gYy5lbWFpbCk7XG4gICAgICAgICAgYXdhaXQgREIuZ2V0REIoXCJ3XCIpKFwidXNlcnNcIikud2hlcmVJbihcImVtYWlsXCIsIGVtYWlscykudXBkYXRlKHsgZW1haWxfdmVyaWZpZWQ6IHRydWUgfSk7XG4gICAgICAgICAgY29uc29sZS5sb2coY2hhbGsuZ3JlZW4oYFxcbmVtYWlsX3ZlcmlmaWVkID0gdHJ1ZSDsl4XrjbDsnbTtirgg7JmE66OMYCkpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHVzZUxMTSkge1xuICAgICAgICAgIGNvbnN0IHN0YXRzID0gZ2VuZXJhdG9yLmdldExMTUNhY2hlU3RhdHMoKTtcbiAgICAgICAgICBjb25zb2xlLmxvZyhjaGFsay5jeWFuKGBbTExNIENhY2hlXSDsupDsi5wg7YGs6riwOiAke3N0YXRzLnNpemV9YCkpO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc29sZS5sb2coXG4gICAgICAgICAgY2hhbGsuZ3JlZW4oYFxcbuKchSAke2NyZWF0ZWRDcmVkZW50aWFscy5sZW5ndGh966qF7J2YIOuhnOq3uOyduCDqsIDriqXtlZwg7IKs7Jqp7J6QIOyDneyEsSDsmYTro4xgKSxcbiAgICAgICAgKTtcbiAgICAgICAgaWYgKGNyZWF0ZWRDcmVkZW50aWFscy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgY29uc29sZS5sb2coXCJcXG7sg53shLHrkJwg6rOE7KCVIOuqqeuhnTpcIik7XG4gICAgICAgICAgY29uc29sZS50YWJsZShjcmVhdGVkQ3JlZGVudGlhbHMpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgLy8gdXNlck1vZGUgPT09IFwiZHVtbXlcIjog6riw7KG0IGdlbmVyYXRlQmF0Y2goKSDtnZDrpoQg6rOE7IaNXG4gICAgfVxuXG4gICAgbGV0IHNhdmVUYXJnZXQgPSBvcHRpb25zW1wic2F2ZS10b1wiXSB8fCBcImRiXCI7XG4gICAgaWYgKCFvcHRpb25zW1wic2F2ZS10b1wiXSkge1xuICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgcHJvbXB0cyh7XG4gICAgICAgIHR5cGU6IFwic2VsZWN0XCIsXG4gICAgICAgIG5hbWU6IFwic2F2ZVRhcmdldFwiLFxuICAgICAgICBtZXNzYWdlOiBcIuyggOyepSDrsKnsi506XCIsXG4gICAgICAgIGNob2ljZXM6IFtcbiAgICAgICAgICB7IHRpdGxlOiBcIkZpeHR1cmUgRELsl5Ag7KCA7J6lXCIsIHZhbHVlOiBcImRiXCIgfSxcbiAgICAgICAgICB7IHRpdGxlOiBcIu2MjOydvOuhnCDsoIDsnqUgKOyekOuPmSDtjIzsnbzrqoUpXCIsIHZhbHVlOiBcImZpbGVcIiB9LFxuICAgICAgICAgIHsgdGl0bGU6IFwi7YyM7J2866GcIOyggOyepSAo7YyM7J2866qFIOyngOyglSlcIiwgdmFsdWU6IFwiZmlsZTpjdXN0b21cIiB9LFxuICAgICAgICAgIHsgdGl0bGU6IFwi7KCA7J6lIOyViCDtlaggKOy2nOugpeunjClcIiwgdmFsdWU6IFwibm9uZVwiIH0sXG4gICAgICAgIF0sXG4gICAgICB9KTtcblxuICAgICAgc2F2ZVRhcmdldCA9IHJlc3VsdC5zYXZlVGFyZ2V0O1xuXG4gICAgICBpZiAoc2F2ZVRhcmdldCA9PT0gXCJmaWxlOmN1c3RvbVwiKSB7XG4gICAgICAgIGNvbnN0IGZpbGVuYW1lUmVzdWx0ID0gYXdhaXQgcHJvbXB0cyh7XG4gICAgICAgICAgdHlwZTogXCJ0ZXh0XCIsXG4gICAgICAgICAgbmFtZTogXCJmaWxlbmFtZVwiLFxuICAgICAgICAgIG1lc3NhZ2U6IFwi7YyM7J2866qFOlwiLFxuICAgICAgICAgIGluaXRpYWw6IFwiZml4dHVyZXMuanNvblwiLFxuICAgICAgICB9KTtcblxuICAgICAgICBpZiAoIWZpbGVuYW1lUmVzdWx0LmZpbGVuYW1lKSB7XG4gICAgICAgICAgY29uc29sZS5sb2coY2hhbGsueWVsbG93KFwi7Leo7IaM65CY7JeI7Iq164uI64ukLlwiKSk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgc2F2ZVRhcmdldCA9IGBmaWxlOiR7ZmlsZW5hbWVSZXN1bHQuZmlsZW5hbWV9YDtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBMTE0g7IKs7JqpIOyXrOu2gCDqsrDsoJVcbiAgICBsZXQgdXNlTExNID0gb3B0aW9uc1tcInVzZS1sbG1cIl0gPz8gZmFsc2U7XG4gICAgaWYgKCFvcHRpb25zW1widXNlLWxsbVwiXSkge1xuICAgICAgY29uc3QgbGxtUmVzdWx0ID0gYXdhaXQgcHJvbXB0cyh7XG4gICAgICAgIHR5cGU6IFwiY29uZmlybVwiLFxuICAgICAgICBuYW1lOiBcInVzZUxMTVwiLFxuICAgICAgICBtZXNzYWdlOlxuICAgICAgICAgIFwiTExN7Jy866GcIOuNlCDtmITsi6TsoIHsnbgg642w7J207YSw66W8IOyDneyEse2VoOq5jOyalD8gKGZpeHR1cmVIaW50IOq4sOuwmCwgQU5USFJPUElDX0FQSV9LRVkg7ZWE7JqUKVwiLFxuICAgICAgICBpbml0aWFsOiBmYWxzZSxcbiAgICAgIH0pO1xuICAgICAgdXNlTExNID0gbGxtUmVzdWx0LnVzZUxMTSA/PyBmYWxzZTtcbiAgICB9XG5cbiAgICBjb25zdCBlbmFibGVMTE1DYWNoZSA9ICFvcHRpb25zW1wibm8tY2FjaGVcIl07XG5cbiAgICAvLyBmaXh0dXJlIGdlbjogZml4dHVyZSBEQiDrgrTsl5DshJwg7LC47KGwIOq0gOqzhOulvCDtlbTqsrDtlZjqs6Ag7KCA7J6l7ZWp64uI64ukXG4gICAgY29uc3QgZml4dHVyZURiID0gY3JlYXRlS25leEluc3RhbmNlKFNvbmFtdS5kYkNvbmZpZy5maXh0dXJlKTtcbiAgICBjb25zdCBnZW5lcmF0b3IgPSBuZXcgRml4dHVyZUdlbmVyYXRvcihmaXh0dXJlRGIsIGZpeHR1cmVEYiwgXCJmaXh0dXJlXCIsIEVudGl0eU1hbmFnZXIsIHtcbiAgICAgIHVzZUxMTSxcbiAgICAgIGVuYWJsZUxMTUNhY2hlLFxuICAgIH0pO1xuXG4gICAgaWYgKHVzZUxMTSkge1xuICAgICAgY29uc29sZS5sb2coXG4gICAgICAgIGNoYWxrLmN5YW4oXG4gICAgICAgICAgYFxcbkxMTSDrqqjrk5zroZwgJHtlbnRpdHlOYW1lcy5qb2luKFwiLCBcIil9IOyDneyEsSDspJEuLi4gKOy6kOyLsTogJHtlbmFibGVMTE1DYWNoZSA/IFwiT05cIiA6IFwiT0ZGXCJ9KWAsXG4gICAgICAgICksXG4gICAgICApO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zb2xlLmxvZyhjaGFsay5jeWFuKGBcXG4ke2VudGl0eU5hbWVzLmpvaW4oXCIsIFwiKX0g7IOd7ISxIOykkS4uLmApKTtcbiAgICB9XG5cbiAgICBjb25zdCBzcGVjcyA9IGVudGl0eU5hbWVzLm1hcCgoZW50aXR5TmFtZSkgPT4gKHtcbiAgICAgIGVudGl0eTogZW50aXR5TmFtZSxcbiAgICAgIGNvdW50LFxuICAgICAgb3ZlcnJpZGVzOiB7fSxcbiAgICB9KSk7XG5cbiAgICBjb25zdCByZXN1bHRzID0gYXdhaXQgZ2VuZXJhdG9yLmdlbmVyYXRlQmF0Y2goc3BlY3MpO1xuXG4gICAgaWYgKHVzZUxMTSkge1xuICAgICAgY29uc3Qgc3RhdHMgPSBnZW5lcmF0b3IuZ2V0TExNQ2FjaGVTdGF0cygpO1xuICAgICAgY29uc29sZS5sb2coY2hhbGsuY3lhbihgW0xMTSBDYWNoZV0g7LqQ7IucIO2BrOq4sDogJHtzdGF0cy5zaXplfWApKTtcbiAgICB9XG5cbiAgICBjb25zb2xlLmxvZyhjaGFsay5ncmVlbihgXFxu4pyFICR7cmVzdWx0cy5sZW5ndGh96rCcIGZpeHR1cmUg7IOd7ISxIOyZhOujjGApKTtcblxuICAgIGlmIChzYXZlVGFyZ2V0ID09PSBcIm5vbmVcIikge1xuICAgICAgY29uc29sZS5sb2coSlNPTi5zdHJpbmdpZnkocmVzdWx0cywgbnVsbCwgMikpO1xuICAgIH0gZWxzZSBpZiAoc2F2ZVRhcmdldCA9PT0gXCJkYlwiKSB7XG4gICAgICAvLyBnZW5lcmF0ZUJhdGNo6rCAIOydtOuvuCBEQuyXkCDsoIDsnqXtlojsnLzrr4DroZwg67OE64+EIOyggOyepeydtCDrtojtlYTsmpTtlanri4jri6QuXG4gICAgICBjb25zb2xlLmxvZyhjaGFsay5ncmVlbihcIkZpeHR1cmUgRELsl5Ag7KCA7J6l65CY7JeI7Iq164uI64ukLlwiKSk7XG4gICAgfSBlbHNlIGlmIChzYXZlVGFyZ2V0LnN0YXJ0c1dpdGgoXCJmaWxlXCIpKSB7XG4gICAgICBjb25zdCBmcyA9IGF3YWl0IGltcG9ydChcIm5vZGU6ZnMvcHJvbWlzZXNcIik7XG4gICAgICBjb25zdCBwYXRoID0gYXdhaXQgaW1wb3J0KFwibm9kZTpwYXRoXCIpO1xuXG4gICAgICBjb25zdCBmaXh0dXJlc0RpciA9IHBhdGguam9pbihwcm9jZXNzLmN3ZCgpLCBcInRlc3RcIiwgXCJmaXh0dXJlc1wiKTtcbiAgICAgIHRyeSB7XG4gICAgICAgIGF3YWl0IGZzLmFjY2VzcyhmaXh0dXJlc0Rpcik7XG4gICAgICB9IGNhdGNoIHtcbiAgICAgICAgYXdhaXQgZnMubWtkaXIoZml4dHVyZXNEaXIsIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICAgICAgfVxuXG4gICAgICBmb3IgKGNvbnN0IGVudGl0eU5hbWUgb2YgZW50aXR5TmFtZXMpIHtcbiAgICAgICAgY29uc3QgZW50aXR5UmVzdWx0cyA9IHJlc3VsdHMuZmlsdGVyKChyKSA9PiByLmVudGl0eUlkID09PSBlbnRpdHlOYW1lKTtcblxuICAgICAgICBpZiAoZW50aXR5UmVzdWx0cy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBmaWxlbmFtZTogc3RyaW5nO1xuICAgICAgICBpZiAoc2F2ZVRhcmdldCA9PT0gXCJmaWxlXCIpIHtcbiAgICAgICAgICBjb25zdCBlbnRpdHkgPSBFbnRpdHlNYW5hZ2VyLmdldChlbnRpdHlOYW1lKTtcbiAgICAgICAgICBmaWxlbmFtZSA9IGAke2VudGl0eS50YWJsZX0uanNvbmA7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgZmlsZW5hbWUgPSBzYXZlVGFyZ2V0LnJlcGxhY2UoXCJmaWxlOlwiLCBcIlwiKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGZpbGVwYXRoID0gcGF0aC5qb2luKGZpeHR1cmVzRGlyLCBmaWxlbmFtZSk7XG4gICAgICAgIGF3YWl0IGZzLndyaXRlRmlsZShcbiAgICAgICAgICBmaWxlcGF0aCxcbiAgICAgICAgICBKU09OLnN0cmluZ2lmeShcbiAgICAgICAgICAgIGVudGl0eVJlc3VsdHMubWFwKChyKSA9PiByLmRhdGEpLFxuICAgICAgICAgICAgbnVsbCxcbiAgICAgICAgICAgIDIsXG4gICAgICAgICAgKSxcbiAgICAgICAgKTtcbiAgICAgICAgY29uc29sZS5sb2coY2hhbGsuZ3JlZW4oYOKchSAke2ZpbGVwYXRofSDsoIDsnqUg7JmE66OMYCkpO1xuICAgICAgfVxuICAgIH1cbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBjb25zb2xlLmVycm9yKFxuICAgICAgY2hhbGsucmVkKFxuICAgICAgICBcIkZpeHR1cmUg7IOd7ISxIOykkSDsmKTrpZjqsIAg67Cc7IOd7ZaI7Iq164uI64ukLlxcblwiICtcbiAgICAgICAgICBcIuybkOyduDogRW50aXR5IOygleydmOuCmCBEQiDsl7DqsrDsnYQg7ZmV7J247ZW07KO87IS47JqULlxcblwiICtcbiAgICAgICAgICBcIuyekOyEuO2VnCDrgrTsmqk6XCIsXG4gICAgICApLFxuICAgICAgZXJyb3IsXG4gICAgKTtcbiAgICB0aHJvdyBlcnJvcjtcbiAgfVxufVxuXG4vKipcbiAqIGZpeHR1cmUgZmV0Y2gg66qF66C57Ja0IC0g7Iuk7KCcIOyatOyYgSBEQuyXkOyEnCDrjbDsnbTthLDrpbwg6rCA7KC47JmAIGZpeHR1cmXroZwg7KCA7J6l7ZWp64uI64ukLlxuICog6rSA6rOE65CcIOuNsOydtO2EsOuPhCDtlajqu5gg6rCA7KC47Jik66+A66GcIO2YhOyLpOyggeyduCDthYzsiqTtirgg642w7J207YSw66W8IO2ZleuztO2VoCDsiJgg7J6I7Iq164uI64ukLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZml4dHVyZUZldGNoQ29tbWFuZChvcHRpb25zOiBGaXh0dXJlQ29tbWFuZE9wdGlvbnMpIHtcbiAgdHJ5IHtcbiAgICBpZiAoIUVudGl0eU1hbmFnZXIuaXNBdXRvbG9hZGVkKSB7XG4gICAgICBhd2FpdCBFbnRpdHlNYW5hZ2VyLmF1dG9sb2FkKCk7XG4gICAgfVxuXG4gICAgbGV0IGVudGl0eU5hbWVzOiBzdHJpbmdbXTtcblxuICAgIGlmIChvcHRpb25zLmFsbCkge1xuICAgICAgZW50aXR5TmFtZXMgPSBFbnRpdHlNYW5hZ2VyLmdldEFsbElkcygpO1xuICAgICAgaWYgKG9wdGlvbnMuZXhjbHVkZSkge1xuICAgICAgICBjb25zdCBleGNsdWRlTGlzdCA9IG9wdGlvbnMuZXhjbHVkZS5zcGxpdChcIixcIikubWFwKChzOiBzdHJpbmcpID0+IHMudHJpbSgpKTtcbiAgICAgICAgZW50aXR5TmFtZXMgPSBlbnRpdHlOYW1lcy5maWx0ZXIoKG5hbWUpID0+ICFleGNsdWRlTGlzdC5pbmNsdWRlcyhuYW1lKSk7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChvcHRpb25zLmluY2x1ZGUpIHtcbiAgICAgIGVudGl0eU5hbWVzID0gb3B0aW9ucy5pbmNsdWRlLnNwbGl0KFwiLFwiKS5tYXAoKHM6IHN0cmluZykgPT4gcy50cmltKCkpO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBwcm9tcHRzKHtcbiAgICAgICAgdHlwZTogXCJtdWx0aXNlbGVjdFwiLFxuICAgICAgICBuYW1lOiBcImVudGl0aWVzXCIsXG4gICAgICAgIG1lc3NhZ2U6IFwiSW1wb3J07ZWgIEVudGl0eeulvCDshKDtg53tlZjshLjsmpQ6XCIsXG4gICAgICAgIGNob2ljZXM6IEVudGl0eU1hbmFnZXIuZ2V0QWxsSWRzKCkubWFwKChpZCkgPT4gKHsgdGl0bGU6IGlkLCB2YWx1ZTogaWQgfSkpLFxuICAgICAgICBtaW46IDEsXG4gICAgICB9KTtcblxuICAgICAgaWYgKCFyZXN1bHQuZW50aXRpZXMgfHwgcmVzdWx0LmVudGl0aWVzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICBjb25zb2xlLmxvZyhjaGFsay55ZWxsb3coXCLst6jshozrkJjsl4jsirXri4jri6QuXCIpKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBlbnRpdHlOYW1lcyA9IHJlc3VsdC5lbnRpdGllcztcbiAgICB9XG5cbiAgICBjb25zdCBzdHJhdGVneTogRGF0YUV4cGxvcmVyU3RyYXRlZ3kgPSBvcHRpb25zLnN0cmF0ZWd5ID8/IFwicmVjZW50XCI7XG4gICAgY29uc3QgbGltaXQgPSBvcHRpb25zLmxpbWl0ID8gTnVtYmVyLnBhcnNlSW50KG9wdGlvbnMubGltaXQsIDEwKSA6IDEwO1xuXG4gICAgLy8gZml4dHVyZSBmZXRjaDogcHJvZHVjdGlvbiDrjbDsnbTthLDrpbwgZml4dHVyZSBEQuuhnCBpbXBvcnTtlanri4jri6RcbiAgICBjb25zdCBzb3VyY2VEYiA9IERCLmdldERCKFwiclwiKTsgLy8gcHJvZHVjdGlvbl9tYXN0ZXIgKOuYkOuKlCBkZXZlbG9wbWVudF9tYXN0ZXIpXG4gICAgY29uc3QgZml4dHVyZURiID0gY3JlYXRlS25leEluc3RhbmNlKFNvbmFtdS5kYkNvbmZpZy5maXh0dXJlKTtcbiAgICBjb25zdCBnZW5lcmF0b3IgPSBuZXcgRml4dHVyZUdlbmVyYXRvcihzb3VyY2VEYiwgZml4dHVyZURiLCBcImZpeHR1cmVcIiwgRW50aXR5TWFuYWdlcik7XG5cbiAgICBjb25zb2xlLmxvZyhjaGFsay5jeWFuKGBcXG4ke2VudGl0eU5hbWVzLmpvaW4oXCIsIFwiKX0gaW1wb3J0IOykkS4uLmApKTtcblxuICAgIGZvciAoY29uc3QgZW50aXR5TmFtZSBvZiBlbnRpdHlOYW1lcykge1xuICAgICAgY29uc3QgcmVzdWx0cyA9IGF3YWl0IGdlbmVyYXRvci5pbXBvcnRGcm9tU291cmNlKGVudGl0eU5hbWUsIHtcbiAgICAgICAgc3RyYXRlZ3ksXG4gICAgICAgIGxpbWl0LFxuICAgICAgICBpbmNsdWRlUmVsYXRpb25zOiB0cnVlLFxuICAgICAgICBtYXhEZXB0aDogMixcbiAgICAgIH0pO1xuXG4gICAgICBjb25zb2xlLmxvZyhjaGFsay5ncmVlbihg4pyFICR7ZW50aXR5TmFtZX06ICR7cmVzdWx0cy5sZW5ndGh96rCcIGltcG9ydCDsmYTro4xgKSk7XG4gICAgfVxuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGNvbnNvbGUuZXJyb3IoXG4gICAgICBjaGFsay5yZWQoXG4gICAgICAgIFwi7Iuk7KCcIERC7JeQ7IScIOuNsOydtO2EsOulvCDqsIDsoLjsmKTripQg7KSRIOyYpOulmOqwgCDrsJzsg53tlojsirXri4jri6QuXFxuXCIgK1xuICAgICAgICAgIFwi7JuQ7J24OiDshozsiqQgREIg7Jew6rKwIOyEpOyglShzb25hbXUuY29uZmlnLnRzKeydtOuCmCBFbnRpdHkg6rSA6rOEIOygleydmOulvCDtmZXsnbjtlbTso7zshLjsmpQuXFxuXCIgK1xuICAgICAgICAgIFwi7J6Q7IS47ZWcIOuCtOyaqTpcIixcbiAgICAgICksXG4gICAgICBlcnJvcixcbiAgICApO1xuICAgIHRocm93IGVycm9yO1xuICB9XG59XG5cbi8qKlxuICogZml4dHVyZSBleHBsb3JlIOuqheugueyWtCAtIERC7J2YIOyLpOygnCDrjbDsnbTthLDrpbwg7KGw7ZqM7ZWY7JesIO2ZleyduO2VqeuLiOuLpC5cbiAqIOyggOyepe2VmOyngCDslYrqs6Ag7KGw7ZqM66eMIO2VmOuvgOuhnCDrjbDsnbTthLDrpbwg67mg66W06rKMIO2ZleyduO2VoCDrlYwg7Jyg7Jqp7ZWp64uI64ukLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZml4dHVyZUV4cGxvcmVDb21tYW5kKG9wdGlvbnM6IEZpeHR1cmVDb21tYW5kT3B0aW9ucykge1xuICB0cnkge1xuICAgIGlmICghRW50aXR5TWFuYWdlci5pc0F1dG9sb2FkZWQpIHtcbiAgICAgIGF3YWl0IEVudGl0eU1hbmFnZXIuYXV0b2xvYWQoKTtcbiAgICB9XG5cbiAgICBsZXQgZW50aXR5TmFtZSA9IG9wdGlvbnMuaW5jbHVkZTtcblxuICAgIGlmICghZW50aXR5TmFtZSkge1xuICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgcHJvbXB0cyh7XG4gICAgICAgIHR5cGU6IFwic2VsZWN0XCIsXG4gICAgICAgIG5hbWU6IFwiZW50aXR5XCIsXG4gICAgICAgIG1lc3NhZ2U6IFwi7YOQ7IOJ7ZWgIEVudGl0eTpcIixcbiAgICAgICAgY2hvaWNlczogRW50aXR5TWFuYWdlci5nZXRBbGxJZHMoKS5tYXAoKGlkKSA9PiAoeyB0aXRsZTogaWQsIHZhbHVlOiBpZCB9KSksXG4gICAgICB9KTtcblxuICAgICAgaWYgKCFyZXN1bHQuZW50aXR5KSB7XG4gICAgICAgIGNvbnNvbGUubG9nKGNoYWxrLnllbGxvdyhcIuy3qOyGjOuQmOyXiOyKteuLiOuLpC5cIikpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGVudGl0eU5hbWUgPSByZXN1bHQuZW50aXR5O1xuICAgIH1cblxuICAgIGlmICghZW50aXR5TmFtZSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiRW50aXR5IG5hbWUgaXMgcmVxdWlyZWRcIik7XG4gICAgfVxuXG4gICAgY29uc3Qgc3RyYXRlZ3k6IERhdGFFeHBsb3JlclN0cmF0ZWd5ID0gb3B0aW9ucy5zdHJhdGVneSA/PyBcInNhbXBsZVwiO1xuICAgIGNvbnN0IGxpbWl0ID0gb3B0aW9ucy5saW1pdCA/IE51bWJlci5wYXJzZUludChvcHRpb25zLmxpbWl0LCAxMCkgOiAxMDtcblxuICAgIGNvbnN0IGRiID0gREIuZ2V0REIoXCJyXCIpO1xuICAgIGNvbnN0IGV4cGxvcmVyID0gbmV3IERhdGFFeHBsb3JlcihkYiwgRW50aXR5TWFuYWdlcik7XG4gICAgY29uc3QgZGF0YSA9IGF3YWl0IGV4cGxvcmVyLmV4cGxvcmUoZW50aXR5TmFtZSwgeyBzdHJhdGVneSwgbGltaXQgfSk7XG5cbiAgICBjb25zb2xlLmxvZyhjaGFsay5jeWFuKGBcXG4ke2VudGl0eU5hbWV9ICR7ZGF0YS5sZW5ndGh96rCcIOyhsO2ajCDsmYTro4w6YCkpO1xuICAgIGNvbnNvbGUudGFibGUoZGF0YSk7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgY29uc29sZS5lcnJvcihcbiAgICAgIGNoYWxrLnJlZChcbiAgICAgICAgXCLrjbDsnbTthLAg7KGw7ZqMIOykkSDsmKTrpZjqsIAg67Cc7IOd7ZaI7Iq164uI64ukLlxcblwiICtcbiAgICAgICAgICBcIuybkOyduDogREIg7Jew6rKw7J2064KYIEVudGl0eSDsoJXsnZjrpbwg7ZmV7J247ZW07KO87IS47JqULlxcblwiICtcbiAgICAgICAgICBcIuyekOyEuO2VnCDrgrTsmqk6XCIsXG4gICAgICApLFxuICAgICAgZXJyb3IsXG4gICAgKTtcbiAgICB0aHJvdyBlcnJvcjtcbiAgfVxufVxuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7O2FBR3VDO1NBQ0g7V0FDa0I7cUJBQ0c7b0JBQ0Q7d0JBRVE7Ozs7QUFrQmhFLFNBQVMsaUJBQWlCLEtBQXFCO0NBRTdDLElBQUksV0FBVyxJQUFJLGFBQWEsQ0FBQyxRQUFRLGNBQWMsR0FBRztBQUMxRCxLQUFJLFNBQVMsV0FBVyxHQUFHO0FBQ3pCLGFBQVc7O0FBR2IsS0FBSSxTQUFTLEtBQUssU0FBUyxFQUFFO0FBQzNCLGFBQVcsSUFBSTs7QUFHakIsUUFBTyxTQUFTLE1BQU0sR0FBRyxHQUFHOzs7OztBQU05QixlQUFzQixrQkFBa0IsU0FBZ0M7QUFDdEUsS0FBSTtBQUNGLE1BQUksQ0FBQyxjQUFj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
342
+
343
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZml4dHVyZS5qcyIsIm5hbWVzIjpbXSwic291cmNlcyI6WyIuLi8uLi9zcmMvYmluL2ZpeHR1cmUudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IGNoYWxrIGZyb20gXCJjaGFsa1wiO1xuaW1wb3J0IHByb21wdHMgZnJvbSBcInByb21wdHNcIjtcblxuaW1wb3J0IHsgU29uYW11IH0gZnJvbSBcIi4uL2FwaS9zb25hbXVcIjtcbmltcG9ydCB7IERCIH0gZnJvbSBcIi4uL2RhdGFiYXNlL2RiXCI7XG5pbXBvcnQgeyBjcmVhdGVLbmV4SW5zdGFuY2UgfSBmcm9tIFwiLi4vZGF0YWJhc2Uva25leFwiO1xuaW1wb3J0IHsgRW50aXR5TWFuYWdlciB9IGZyb20gXCIuLi9lbnRpdHkvZW50aXR5LW1hbmFnZXJcIjtcbmltcG9ydCB7IGdldFNvbmFtdUVudmlyb25tZW50IH0gZnJvbSBcIi4uL2VudlwiO1xuaW1wb3J0IHsgRGF0YUV4cGxvcmVyIH0gZnJvbSBcIi4uL3Rlc3RpbmcvZGF0YS1leHBsb3JlclwiO1xuaW1wb3J0IHsgdHlwZSBEYXRhRXhwbG9yZXJTdHJhdGVneSB9IGZyb20gXCIuLi90ZXN0aW5nL2RhdGEtZXhwbG9yZXJcIjtcbmltcG9ydCB7IEZpeHR1cmVHZW5lcmF0b3IgfSBmcm9tIFwiLi4vdGVzdGluZy9maXh0dXJlLWdlbmVyYXRvclwiO1xuXG5pbnRlcmZhY2UgRml4dHVyZUNvbW1hbmRPcHRpb25zIHtcbiAgXz86IHN0cmluZ1tdO1xuICBhbGw/OiBib29sZWFuO1xuICBpbmNsdWRlPzogc3RyaW5nO1xuICBleGNsdWRlPzogc3RyaW5nO1xuICBjb3VudD86IHN0cmluZztcbiAgXCJzYXZlLXRvXCI/OiBzdHJpbmc7XG4gIHN0cmF0ZWd5PzogRGF0YUV4cGxvcmVyU3RyYXRlZ3k7XG4gIGxpbWl0Pzogc3RyaW5nO1xuICBcInVzZS1sbG1cIj86IGJvb2xlYW47XG4gIFwibm8tY2FjaGVcIj86IGJvb2xlYW47XG59XG5cbi8qKlxuICogdXNlcm5hbWXsnYQg7J2867CY7KCB7J24IOq3nOy5mSjsmIHrrLjsnpAg7Iuc7J6RLCDsmIHrrLjsnpAv7Iir7J6Q66eMLCAxLTIw7J6QKeyXkCDrp57rj4TroZ0g7KCV6rec7ZmU7ZWp64uI64ukLlxuICovXG5mdW5jdGlvbiBzYW5pdGl6ZVVzZXJuYW1lKHJhdzogc3RyaW5nKTogc3RyaW5nIHtcbiAgLy8g7IaM66y47J6QIOuzgO2ZmCDtm4Qg7JiB66y47J6QL+yIq+yekCDsmbgg66y47J6QIOygnOqxsFxuICBsZXQgdXNlcm5hbWUgPSByYXcudG9Mb3dlckNhc2UoKS5yZXBsYWNlKC9bXmEtejAtOV0vZywgXCJcIik7XG4gIGlmICh1c2VybmFtZS5sZW5ndGggPT09IDApIHtcbiAgICB1c2VybmFtZSA9IFwidXNlclwiO1xuICB9XG4gIC8vIOyyqyDquIDsnpDqsIAg7Iir7J6Q66m0ICd1JyDsoJHrkZDslrQg7LaU6rCAXG4gIGlmICgvXlswLTldLy50ZXN0KHVzZXJuYW1lKSkge1xuICAgIHVzZXJuYW1lID0gYHUke3VzZXJuYW1lfWA7XG4gIH1cbiAgLy8gMjDsnpAg7LSI6rO8IOyLnCB0cnVuY2F0ZVxuICByZXR1cm4gdXNlcm5hbWUuc2xpY2UoMCwgMjApO1xufVxuXG4vKipcbiAqIGZpeHR1cmUgZ2VuIOuqheugueyWtCAtIGNvbmUg66mU7YOA642w7J207YSw66W8IO2ZnOyaqe2VmOyXrCDsnpDrj5nsnLzroZwgZml4dHVyZeulvCDsg53shLHtlanri4jri6QuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBmaXh0dXJlR2VuQ29tbWFuZChvcHRpb25zOiBGaXh0dXJlQ29tbWFuZE9wdGlvbnMpIHtcbiAgdHJ5IHtcbiAgICBpZiAoIUVudGl0eU1hbmFnZXIuaXNBdXRvbG9hZGVkKSB7XG4gICAgICBhd2FpdCBFbnRpdHlNYW5hZ2VyLmF1dG9sb2FkKCk7XG4gICAgfVxuXG4gICAgbGV0IGVudGl0eU5hbWVzOiBzdHJpbmdbXTtcblxuICAgIGlmIChvcHRpb25zLmFsbCkge1xuICAgICAgZW50aXR5TmFtZXMgPSBFbnRpdHlNYW5hZ2VyLmdldEFsbElkcygpO1xuICAgICAgaWYgKG9wdGlvbnMuZXhjbHVkZSkge1xuICAgICAgICBjb25zdCBleGNsdWRlTGlzdCA9IG9wdGlvbnMuZXhjbHVkZS5zcGxpdChcIixcIikubWFwKChzOiBzdHJpbmcpID0+IHMudHJpbSgpKTtcbiAgICAgICAgZW50aXR5TmFtZXMgPSBlbnRpdHlOYW1lcy5maWx0ZXIoKG5hbWUpID0+ICFleGNsdWRlTGlzdC5pbmNsdWRlcyhuYW1lKSk7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChvcHRpb25zLmluY2x1ZGUpIHtcbiAgICAgIGVudGl0eU5hbWVzID0gb3B0aW9ucy5pbmNsdWRlLnNwbGl0KFwiLFwiKS5tYXAoKHM6IHN0cmluZykgPT4gcy50cmltKCkpO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBwcm9tcHRzKHtcbiAgICAgICAgdHlwZTogXCJtdWx0aXNlbGVjdFwiLFxuICAgICAgICBuYW1lOiBcImVudGl0aWVzXCIsXG4gICAgICAgIG1lc3NhZ2U6IFwiRml4dHVyZeulvCDsg53shLHtlaAgRW50aXR566W8IOyEoO2Dne2VmOyEuOyalDpcIixcbiAgICAgICAgY2hvaWNlczogRW50aXR5TWFuYWdlci5nZXRBbGxJZHMoKS5tYXAoKGlkKSA9PiAoeyB0aXRsZTogaWQsIHZhbHVlOiBpZCB9KSksXG4gICAgICAgIG1pbjogMSxcbiAgICAgIH0pO1xuXG4gICAgICBpZiAoIXJlc3VsdC5lbnRpdGllcyB8fCByZXN1bHQuZW50aXRpZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIGNvbnNvbGUubG9nKGNoYWxrLnllbGxvdyhcIuy3qOyGjOuQmOyXiOyKteuLiOuLpC5cIikpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGVudGl0eU5hbWVzID0gcmVzdWx0LmVudGl0aWVzO1xuICAgIH1cblxuICAgIGxldCBjb3VudCA9IG9wdGlvbnMuY291bnQgPyBOdW1iZXIucGFyc2VJbnQob3B0aW9ucy5jb3VudCwgMTApIDogNTtcbiAgICBpZiAoIW9wdGlvbnMuY291bnQpIHtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHByb21wdHMoe1xuICAgICAgICB0eXBlOiBcIm51bWJlclwiLFxuICAgICAgICBuYW1lOiBcImNvdW50XCIsXG4gICAgICAgIG1lc3NhZ2U6IFwi6rCBIEVudGl0eeuzhCDsg53shLEg6rCc7IiYOlwiLFxuICAgICAgICBpbml0aWFsOiA1LFxuICAgICAgICBtaW46IDEsXG4gICAgICB9KTtcblxuICAgICAgaWYgKCFyZXN1bHQuY291bnQpIHtcbiAgICAgICAgY29uc29sZS5sb2coY2hhbGsueWVsbG93KFwi7Leo7IaM65CY7JeI7Iq164uI64ukLlwiKSk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgY291bnQgPSByZXN1bHQuY291bnQ7XG4gICAgfVxuXG4gICAgLy8gVXNlciDsl5Tti7Dti7DqsIAg7Y+s7ZWo65CcIOqyveyasDog66Gc6re47J24IOqwgOuKpS/tmZXsnbjsmqkg67aE6riwIOyEoO2DnVxuICAgIGNvbnN0IGhhc1VzZXIgPSBlbnRpdHlOYW1lcy5pbmNsdWRlcyhcIlVzZXJcIik7XG5cbiAgICBpZiAoaGFzVXNlcikge1xuICAgICAgY29uc3QgdXNlck1vZGVSZXN1bHQgPSBhd2FpdCBwcm9tcHRzKHtcbiAgICAgICAgdHlwZTogXCJzZWxlY3RcIixcbiAgICAgICAgbmFtZTogXCJ1c2VyTW9kZVwiLFxuICAgICAgICBtZXNzYWdlOiBcIlVzZXIg7JeU7Yuw7Yuw6rCAIO2PrO2VqOuQmOyWtCDsnojsirXri4jri6QuIOyDneyEsSDrsKnsi53snYQg7ISg7YOd7ZWY7IS47JqUOlwiLFxuICAgICAgICBjaG9pY2VzOiBbXG4gICAgICAgICAgeyB0aXRsZTogXCIxLiDroZzqt7jsnbgg6rCA64ql7ZWcIOyCrOyaqeyekCBmaXh0dXJlIOyDneyEsVwiLCB2YWx1ZTogXCJsb2dpblwiIH0sXG4gICAgICAgICAgeyB0aXRsZTogXCIyLiDtmZXsnbjsmqkg642w7J207YSwKOuhnOq3uOyduCDrtojqsIApIOyDneyEsVwiLCB2YWx1ZTogXCJkdW1teVwiIH0sXG4gICAgICAgIF0sXG4gICAgICB9KTtcblxuICAgICAgaWYgKCF1c2VyTW9kZVJlc3VsdC51c2VyTW9kZSkge1xuICAgICAgICBjb25zb2xlLmxvZyhjaGFsay55ZWxsb3coXCLst6jshozrkJjsl4jsirXri4jri6QuXCIpKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBpZiAodXNlck1vZGVSZXN1bHQudXNlck1vZGUgPT09IFwibG9naW5cIikge1xuICAgICAgICAvLyBMTE0g7IKs7JqpIOyXrOu2gFxuICAgICAgICBsZXQgdXNlTExNID0gb3B0aW9uc1tcInVzZS1sbG1cIl0gPz8gZmFsc2U7XG4gICAgICAgIGlmICghb3B0aW9uc1tcInVzZS1sbG1cIl0pIHtcbiAgICAgICAgICBjb25zdCBsbG1SZXN1bHQgPSBhd2FpdCBwcm9tcHRzKHtcbiAgICAgICAgICAgIHR5cGU6IFwiY29uZmlybVwiLFxuICAgICAgICAgICAgbmFtZTogXCJ1c2VMTE1cIixcbiAgICAgICAgICAgIG1lc3NhZ2U6XG4gICAgICAgICAgICAgIFwiTExN7Jy866GcIOuNlCDtmITsi6TsoIHsnbgg642w7J207YSw66W8IOyDneyEse2VoOq5jOyalD8gKGZpeHR1cmVIaW50IOq4sOuwmCwgQU5USFJPUElDX0FQSV9LRVkg7ZWE7JqUKVwiLFxuICAgICAgICAgICAgaW5pdGlhbDogZmFsc2UsXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgdXNlTExNID0gbGxtUmVzdWx0LnVzZUxMTSA/PyBmYWxzZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGVuYWJsZUxMTUNhY2hlID0gIW9wdGlvbnNbXCJuby1jYWNoZVwiXTtcbiAgICAgICAgY29uc3QgREVGQVVMVF9QQVNTV09SRCA9IFwiVGVzdDEyMzQhXCI7XG5cbiAgICAgICAgLy8g66Gc6re47J24IOqwgOuKpSDqsr3roZzsl5DshJzripQg7ZiE7J6sIO2ZmOqyveydmCDsnb3quLAgRELrpbwgc291cmNlRGLroZwg7IKs7JqpXG4gICAgICAgIGNvbnN0IHNvdXJjZURiID0gREIuZ2V0REIoXCJyXCIpO1xuICAgICAgICBjb25zdCBnZW5lcmF0b3IgPSBuZXcgRml4dHVyZUdlbmVyYXRvcihcbiAgICAgICAgICBzb3VyY2VEYixcbiAgICAgICAgICBzb3VyY2VEYixcbiAgICAgICAgICBnZXRTb25hbXVFbnZpcm9ubWVudCgpLFxuICAgICAgICAgIEVudGl0eU1hbmFnZXIsXG4gICAgICAgICAgeyB1c2VMTE0sIGVuYWJsZUxMTUNhY2hlIH0sXG4gICAgICAgICk7XG5cbiAgICAgICAgY29uc3QgY3JlYXRlZENyZWRlbnRpYWxzOiBBcnJheTx7IGVtYWlsOiBzdHJpbmc7IHBhc3N3b3JkOiBzdHJpbmcgfT4gPSBbXTtcbiAgICAgICAgY29uc3QgYmFzZVBhdGggPSBTb25hbXUuY29uZmlnLnNlcnZlci5hdXRoPy5iYXNlUGF0aCA/PyBcIi9hcGkvYXV0aFwiO1xuXG4gICAgICAgIGlmICh1c2VMTE0pIHtcbiAgICAgICAgICBjb25zb2xlLmxvZyhcbiAgICAgICAgICAgIGNoYWxrLmN5YW4oXG4gICAgICAgICAgICAgIGBcXG5MTE0g66qo65Oc66GcIOuhnOq3uOyduCDqsIDriqXtlZwg7IKs7Jqp7J6QICR7Y291bnR966qFIOyDneyEsSDspJEuLi4gKOy6kOyLsTogJHtlbmFibGVMTE1DYWNoZSA/IFwiT05cIiA6IFwiT0ZGXCJ9KWAsXG4gICAgICAgICAgICApLFxuICAgICAgICAgICk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY29uc29sZS5sb2coY2hhbGsuY3lhbihgXFxu66Gc6re47J24IOqwgOuKpe2VnCDsgqzsmqnsnpAgJHtjb3VudH3rqoUg7IOd7ISxIOykkS4uLmApKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY291bnQ7IGkrKykge1xuICAgICAgICAgIGNvbnN0IHVzZXJEYXRhID0gYXdhaXQgZ2VuZXJhdG9yLmdlbmVyYXRlKFwiVXNlclwiKTtcblxuICAgICAgICAgIGNvbnN0IG5hbWUgPSBTdHJpbmcodXNlckRhdGEubmFtZSA/PyBcIlwiKTtcbiAgICAgICAgICBjb25zdCBlbWFpbCA9IFN0cmluZyh1c2VyRGF0YS5lbWFpbCA/PyBcIlwiKTtcbiAgICAgICAgICBjb25zdCB1c2VybmFtZSA9IHNhbml0aXplVXNlcm5hbWUoU3RyaW5nKHVzZXJEYXRhLnVzZXJuYW1lID8/IFwiXCIpKTtcbiAgICAgICAgICBjb25zdCBkaXNwbGF5VXNlcm5hbWUgPVxuICAgICAgICAgICAgdXNlckRhdGEuZGlzcGxheV91c2VybmFtZSAhPT0gdW5kZWZpbmVkID8gU3RyaW5nKHVzZXJEYXRhLmRpc3BsYXlfdXNlcm5hbWUpIDogdW5kZWZpbmVkO1xuXG4gICAgICAgICAgY29uc3QgYm9keTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gPSB7XG4gICAgICAgICAgICBuYW1lLFxuICAgICAgICAgICAgZW1haWwsXG4gICAgICAgICAgICB1c2VybmFtZSxcbiAgICAgICAgICAgIHBhc3N3b3JkOiBERUZBVUxUX1BBU1NXT1JELFxuICAgICAgICAgIH07XG4gICAgICAgICAgaWYgKGRpc3BsYXlVc2VybmFtZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBib2R5LmRpc3BsYXlfdXNlcm5hbWUgPSBkaXNwbGF5VXNlcm5hbWU7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgY29uc3QgcmVxID0gbmV3IFJlcXVlc3QoYGh0dHA6Ly9sb2NhbGhvc3Qke2Jhc2VQYXRofS9zaWduLXVwL2VtYWlsYCwge1xuICAgICAgICAgICAgbWV0aG9kOiBcIlBPU1RcIixcbiAgICAgICAgICAgIGhlYWRlcnM6IHsgXCJDb250ZW50LVR5cGVcIjogXCJhcHBsaWNhdGlvbi9qc29uXCIgfSxcbiAgICAgICAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KGJvZHkpLFxuICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBTb25hbXUuYXV0aC5oYW5kbGVyKHJlcSk7XG5cbiAgICAgICAgICBpZiAoIXJlc3BvbnNlLm9rKSB7XG4gICAgICAgICAgICBjb25zdCByZXNwb25zZURhdGEgPSAoYXdhaXQgcmVzcG9uc2UuanNvbigpKSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgICAgICAgICAgIGNvbnN0IGNvZGUgPSB0eXBlb2YgcmVzcG9uc2VEYXRhLmNvZGUgPT09IFwic3RyaW5nXCIgPyByZXNwb25zZURhdGEuY29kZSA6IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIGlmIChjb2RlID09PSBcIlVTRVJfQUxSRUFEWV9FWElTVFNcIikge1xuICAgICAgICAgICAgICBjb25zb2xlLmxvZyhjaGFsay55ZWxsb3coYCAg4pqg77iPICAke2VtYWlsfSDsnbTrr7gg7KG07J6sIC0g6rG064SI65yB64uI64ukLmApKTtcbiAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zb2xlLmxvZyhjaGFsay5yZWQoYCAg4p2MICR7ZW1haWx9IOyDneyEsSDsi6TtjKg6ICR7SlNPTi5zdHJpbmdpZnkocmVzcG9uc2VEYXRhKX1gKSk7XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBjcmVhdGVkQ3JlZGVudGlhbHMucHVzaCh7IGVtYWlsLCBwYXNzd29yZDogREVGQVVMVF9QQVNTV09SRCB9KTtcbiAgICAgICAgICBjb25zb2xlLmxvZyhjaGFsay5ncmVlbihgICDinIUgJHtlbWFpbH0g7IOd7ISxIOyZhOujjGApKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIGVtYWlsX3ZlcmlmaWVkID0gdHJ1ZSDsp4HsoJEg7JeF642w7J207Yq4IChkZXYg7Y647J2YKVxuICAgICAgICBpZiAoY3JlYXRlZENyZWRlbnRpYWxzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICBjb25zdCBlbWFpbHMgPSBjcmVhdGVkQ3JlZGVudGlhbHMubWFwKChjKSA9PiBjLmVtYWlsKTtcbiAgICAgICAgICBhd2FpdCBEQi5nZXREQihcIndcIikoXCJ1c2Vyc1wiKS53aGVyZUluKFwiZW1haWxcIiwgZW1haWxzKS51cGRhdGUoeyBlbWFpbF92ZXJpZmllZDogdHJ1ZSB9KTtcbiAgICAgICAgICBjb25zb2xlLmxvZyhjaGFsay5ncmVlbihgXFxuZW1haWxfdmVyaWZpZWQgPSB0cnVlIOyXheuNsOydtO2KuCDsmYTro4xgKSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodXNlTExNKSB7XG4gICAgICAgICAgY29uc3Qgc3RhdHMgPSBnZW5lcmF0b3IuZ2V0TExNQ2FjaGVTdGF0cygpO1xuICAgICAgICAgIGNvbnNvbGUubG9nKGNoYWxrLmN5YW4oYFtMTE0gQ2FjaGVdIOy6kOyLnCDtgazquLA6ICR7c3RhdHMuc2l6ZX1gKSk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zb2xlLmxvZyhcbiAgICAgICAgICBjaGFsay5ncmVlbihgXFxu4pyFICR7Y3JlYXRlZENyZWRlbnRpYWxzLmxlbmd0aH3rqoXsnZgg66Gc6re47J24IOqwgOuKpe2VnCDsgqzsmqnsnpAg7IOd7ISxIOyZhOujjGApLFxuICAgICAgICApO1xuICAgICAgICBpZiAoY3JlYXRlZENyZWRlbnRpYWxzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICBjb25zb2xlLmxvZyhcIlxcbuyDneyEseuQnCDqs4TsoJUg66qp66GdOlwiKTtcbiAgICAgICAgICBjb25zb2xlLnRhYmxlKGNyZWF0ZWRDcmVkZW50aWFscyk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICAvLyB1c2VyTW9kZSA9PT0gXCJkdW1teVwiOiDquLDsobQgZ2VuZXJhdGVCYXRjaCgpIO2dkOumhCDqs4Tsho1cbiAgICB9XG5cbiAgICBsZXQgc2F2ZVRhcmdldCA9IG9wdGlvbnNbXCJzYXZlLXRvXCJdIHx8IFwiZGJcIjtcbiAgICBpZiAoIW9wdGlvbnNbXCJzYXZlLXRvXCJdKSB7XG4gICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBwcm9tcHRzKHtcbiAgICAgICAgdHlwZTogXCJzZWxlY3RcIixcbiAgICAgICAgbmFtZTogXCJzYXZlVGFyZ2V0XCIsXG4gICAgICAgIG1lc3NhZ2U6IFwi7KCA7J6lIOuwqeyLnTpcIixcbiAgICAgICAgY2hvaWNlczogW1xuICAgICAgICAgIHsgdGl0bGU6IFwiRml4dHVyZSBEQuyXkCDsoIDsnqVcIiwgdmFsdWU6IFwiZGJcIiB9LFxuICAgICAgICAgIHsgdGl0bGU6IFwi7YyM7J2866GcIOyggOyepSAo7J6Q64+ZIO2MjOydvOuqhSlcIiwgdmFsdWU6IFwiZmlsZVwiIH0sXG4gICAgICAgICAgeyB0aXRsZTogXCLtjIzsnbzroZwg7KCA7J6lICjtjIzsnbzrqoUg7KeA7KCVKVwiLCB2YWx1ZTogXCJmaWxlOmN1c3RvbVwiIH0sXG4gICAgICAgICAgeyB0aXRsZTogXCLsoIDsnqUg7JWIIO2VqCAo7Lac66Cl66eMKVwiLCB2YWx1ZTogXCJub25lXCIgfSxcbiAgICAgICAgXSxcbiAgICAgIH0pO1xuXG4gICAgICBzYXZlVGFyZ2V0ID0gcmVzdWx0LnNhdmVUYXJnZXQ7XG5cbiAgICAgIGlmIChzYXZlVGFyZ2V0ID09PSBcImZpbGU6Y3VzdG9tXCIpIHtcbiAgICAgICAgY29uc3QgZmlsZW5hbWVSZXN1bHQgPSBhd2FpdCBwcm9tcHRzKHtcbiAgICAgICAgICB0eXBlOiBcInRleHRcIixcbiAgICAgICAgICBuYW1lOiBcImZpbGVuYW1lXCIsXG4gICAgICAgICAgbWVzc2FnZTogXCLtjIzsnbzrqoU6XCIsXG4gICAgICAgICAgaW5pdGlhbDogXCJmaXh0dXJlcy5qc29uXCIsXG4gICAgICAgIH0pO1xuXG4gICAgICAgIGlmICghZmlsZW5hbWVSZXN1bHQuZmlsZW5hbWUpIHtcbiAgICAgICAgICBjb25zb2xlLmxvZyhjaGFsay55ZWxsb3coXCLst6jshozrkJjsl4jsirXri4jri6QuXCIpKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBzYXZlVGFyZ2V0ID0gYGZpbGU6JHtmaWxlbmFtZVJlc3VsdC5maWxlbmFtZX1gO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIExMTSDsgqzsmqkg7Jes67aAIOqysOyglVxuICAgIGxldCB1c2VMTE0gPSBvcHRpb25zW1widXNlLWxsbVwiXSA/PyBmYWxzZTtcbiAgICBpZiAoIW9wdGlvbnNbXCJ1c2UtbGxtXCJdKSB7XG4gICAgICBjb25zdCBsbG1SZXN1bHQgPSBhd2FpdCBwcm9tcHRzKHtcbiAgICAgICAgdHlwZTogXCJjb25maXJtXCIsXG4gICAgICAgIG5hbWU6IFwidXNlTExNXCIsXG4gICAgICAgIG1lc3NhZ2U6XG4gICAgICAgICAgXCJMTE3snLzroZwg642UIO2YhOyLpOyggeyduCDrjbDsnbTthLDrpbwg7IOd7ISx7ZWg6rmM7JqUPyAoZml4dHVyZUhpbnQg6riw67CYLCBBTlRIUk9QSUNfQVBJX0tFWSDtlYTsmpQpXCIsXG4gICAgICAgIGluaXRpYWw6IGZhbHNlLFxuICAgICAgfSk7XG4gICAgICB1c2VMTE0gPSBsbG1SZXN1bHQudXNlTExNID8/IGZhbHNlO1xuICAgIH1cblxuICAgIGNvbnN0IGVuYWJsZUxMTUNhY2hlID0gIW9wdGlvbnNbXCJuby1jYWNoZVwiXTtcblxuICAgIC8vIGZpeHR1cmUgZ2VuOiBmaXh0dXJlIERCIOuCtOyXkOyEnCDssLjsobAg6rSA6rOE66W8IO2VtOqysO2VmOqzoCDsoIDsnqXtlanri4jri6RcbiAgICBjb25zdCBmaXh0dXJlRGIgPSBjcmVhdGVLbmV4SW5zdGFuY2UoU29uYW11LmRiQ29uZmlnLmZpeHR1cmUpO1xuICAgIGNvbnN0IGdlbmVyYXRvciA9IG5ldyBGaXh0dXJlR2VuZXJhdG9yKGZpeHR1cmVEYiwgZml4dHVyZURiLCBcImZpeHR1cmVcIiwgRW50aXR5TWFuYWdlciwge1xuICAgICAgdXNlTExNLFxuICAgICAgZW5hYmxlTExNQ2FjaGUsXG4gICAgfSk7XG5cbiAgICBpZiAodXNlTExNKSB7XG4gICAgICBjb25zb2xlLmxvZyhcbiAgICAgICAgY2hhbGsuY3lhbihcbiAgICAgICAgICBgXFxuTExNIOuqqOuTnOuhnCAke2VudGl0eU5hbWVzLmpvaW4oXCIsIFwiKX0g7IOd7ISxIOykkS4uLiAo7LqQ7IuxOiAke2VuYWJsZUxMTUNhY2hlID8gXCJPTlwiIDogXCJPRkZcIn0pYCxcbiAgICAgICAgKSxcbiAgICAgICk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnNvbGUubG9nKGNoYWxrLmN5YW4oYFxcbiR7ZW50aXR5TmFtZXMuam9pbihcIiwgXCIpfSDsg53shLEg7KSRLi4uYCkpO1xuICAgIH1cblxuICAgIGNvbnN0IHNwZWNzID0gZW50aXR5TmFtZXMubWFwKChlbnRpdHlOYW1lKSA9PiAoe1xuICAgICAgZW50aXR5OiBlbnRpdHlOYW1lLFxuICAgICAgY291bnQsXG4gICAgICBvdmVycmlkZXM6IHt9LFxuICAgIH0pKTtcblxuICAgIGNvbnN0IHJlc3VsdHMgPSBhd2FpdCBnZW5lcmF0b3IuZ2VuZXJhdGVCYXRjaChzcGVjcyk7XG5cbiAgICBpZiAodXNlTExNKSB7XG4gICAgICBjb25zdCBzdGF0cyA9IGdlbmVyYXRvci5nZXRMTE1DYWNoZVN0YXRzKCk7XG4gICAgICBjb25zb2xlLmxvZyhjaGFsay5jeWFuKGBbTExNIENhY2hlXSDsupDsi5wg7YGs6riwOiAke3N0YXRzLnNpemV9YCkpO1xuICAgIH1cblxuICAgIGNvbnNvbGUubG9nKGNoYWxrLmdyZWVuKGBcXG7inIUgJHtyZXN1bHRzLmxlbmd0aH3qsJwgZml4dHVyZSDsg53shLEg7JmE66OMYCkpO1xuXG4gICAgaWYgKHNhdmVUYXJnZXQgPT09IFwibm9uZVwiKSB7XG4gICAgICBjb25zb2xlLmxvZyhKU09OLnN0cmluZ2lmeShyZXN1bHRzLCBudWxsLCAyKSk7XG4gICAgfSBlbHNlIGlmIChzYXZlVGFyZ2V0ID09PSBcImRiXCIpIHtcbiAgICAgIC8vIGdlbmVyYXRlQmF0Y2jqsIAg7J2066+4IERC7JeQIOyggOyepe2WiOycvOuvgOuhnCDrs4Trj4Qg7KCA7J6l7J20IOu2iO2VhOyalO2VqeuLiOuLpC5cbiAgICAgIGNvbnNvbGUubG9nKGNoYWxrLmdyZWVuKFwiRml4dHVyZSBEQuyXkCDsoIDsnqXrkJjsl4jsirXri4jri6QuXCIpKTtcbiAgICB9IGVsc2UgaWYgKHNhdmVUYXJnZXQuc3RhcnRzV2l0aChcImZpbGVcIikpIHtcbiAgICAgIGNvbnN0IGZzID0gYXdhaXQgaW1wb3J0KFwibm9kZTpmcy9wcm9taXNlc1wiKTtcbiAgICAgIGNvbnN0IHBhdGggPSBhd2FpdCBpbXBvcnQoXCJub2RlOnBhdGhcIik7XG5cbiAgICAgIGNvbnN0IGZpeHR1cmVzRGlyID0gcGF0aC5qb2luKHByb2Nlc3MuY3dkKCksIFwidGVzdFwiLCBcImZpeHR1cmVzXCIpO1xuICAgICAgdHJ5IHtcbiAgICAgICAgYXdhaXQgZnMuYWNjZXNzKGZpeHR1cmVzRGlyKTtcbiAgICAgIH0gY2F0Y2gge1xuICAgICAgICBhd2FpdCBmcy5ta2RpcihmaXh0dXJlc0RpciwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG4gICAgICB9XG5cbiAgICAgIGZvciAoY29uc3QgZW50aXR5TmFtZSBvZiBlbnRpdHlOYW1lcykge1xuICAgICAgICBjb25zdCBlbnRpdHlSZXN1bHRzID0gcmVzdWx0cy5maWx0ZXIoKHIpID0+IHIuZW50aXR5SWQgPT09IGVudGl0eU5hbWUpO1xuXG4gICAgICAgIGlmIChlbnRpdHlSZXN1bHRzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IGZpbGVuYW1lOiBzdHJpbmc7XG4gICAgICAgIGlmIChzYXZlVGFyZ2V0ID09PSBcImZpbGVcIikge1xuICAgICAgICAgIGNvbnN0IGVudGl0eSA9IEVudGl0eU1hbmFnZXIuZ2V0KGVudGl0eU5hbWUpO1xuICAgICAgICAgIGZpbGVuYW1lID0gYCR7ZW50aXR5LnRhYmxlfS5qc29uYDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBmaWxlbmFtZSA9IHNhdmVUYXJnZXQucmVwbGFjZShcImZpbGU6XCIsIFwiXCIpO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgZmlsZXBhdGggPSBwYXRoLmpvaW4oZml4dHVyZXNEaXIsIGZpbGVuYW1lKTtcbiAgICAgICAgYXdhaXQgZnMud3JpdGVGaWxlKFxuICAgICAgICAgIGZpbGVwYXRoLFxuICAgICAgICAgIEpTT04uc3RyaW5naWZ5KFxuICAgICAgICAgICAgZW50aXR5UmVzdWx0cy5tYXAoKHIpID0+IHIuZGF0YSksXG4gICAgICAgICAgICBudWxsLFxuICAgICAgICAgICAgMixcbiAgICAgICAgICApLFxuICAgICAgICApO1xuICAgICAgICBjb25zb2xlLmxvZyhjaGFsay5ncmVlbihg4pyFICR7ZmlsZXBhdGh9IOyggOyepSDsmYTro4xgKSk7XG4gICAgICB9XG4gICAgfVxuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGNvbnNvbGUuZXJyb3IoXG4gICAgICBjaGFsay5yZWQoXG4gICAgICAgIFwiRml4dHVyZSDsg53shLEg7KSRIOyYpOulmOqwgCDrsJzsg53tlojsirXri4jri6QuXFxuXCIgK1xuICAgICAgICAgIFwi7JuQ7J24OiBFbnRpdHkg7KCV7J2Y64KYIERCIOyXsOqysOydhCDtmZXsnbjtlbTso7zshLjsmpQuXFxuXCIgK1xuICAgICAgICAgIFwi7J6Q7IS47ZWcIOuCtOyaqTpcIixcbiAgICAgICksXG4gICAgICBlcnJvcixcbiAgICApO1xuICAgIHRocm93IGVycm9yO1xuICB9XG59XG5cbi8qKlxuICogZml4dHVyZSBmZXRjaCDrqoXroLnslrQgLSDsi6TsoJwg7Jq07JiBIERC7JeQ7IScIOuNsOydtO2EsOulvCDqsIDsoLjsmYAgZml4dHVyZeuhnCDsoIDsnqXtlanri4jri6QuXG4gKiDqtIDqs4TrkJwg642w7J207YSw64+EIO2VqOq7mCDqsIDsoLjsmKTrr4DroZwg7ZiE7Iuk7KCB7J24IO2FjOyKpO2KuCDrjbDsnbTthLDrpbwg7ZmV67O07ZWgIOyImCDsnojsirXri4jri6QuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBmaXh0dXJlRmV0Y2hDb21tYW5kKG9wdGlvbnM6IEZpeHR1cmVDb21tYW5kT3B0aW9ucykge1xuICB0cnkge1xuICAgIGlmICghRW50aXR5TWFuYWdlci5pc0F1dG9sb2FkZWQpIHtcbiAgICAgIGF3YWl0IEVudGl0eU1hbmFnZXIuYXV0b2xvYWQoKTtcbiAgICB9XG5cbiAgICBsZXQgZW50aXR5TmFtZXM6IHN0cmluZ1tdO1xuXG4gICAgaWYgKG9wdGlvbnMuYWxsKSB7XG4gICAgICBlbnRpdHlOYW1lcyA9IEVudGl0eU1hbmFnZXIuZ2V0QWxsSWRzKCk7XG4gICAgICBpZiAob3B0aW9ucy5leGNsdWRlKSB7XG4gICAgICAgIGNvbnN0IGV4Y2x1ZGVMaXN0ID0gb3B0aW9ucy5leGNsdWRlLnNwbGl0KFwiLFwiKS5tYXAoKHM6IHN0cmluZykgPT4gcy50cmltKCkpO1xuICAgICAgICBlbnRpdHlOYW1lcyA9IGVudGl0eU5hbWVzLmZpbHRlcigobmFtZSkgPT4gIWV4Y2x1ZGVMaXN0LmluY2x1ZGVzKG5hbWUpKTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKG9wdGlvbnMuaW5jbHVkZSkge1xuICAgICAgZW50aXR5TmFtZXMgPSBvcHRpb25zLmluY2x1ZGUuc3BsaXQoXCIsXCIpLm1hcCgoczogc3RyaW5nKSA9PiBzLnRyaW0oKSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHByb21wdHMoe1xuICAgICAgICB0eXBlOiBcIm11bHRpc2VsZWN0XCIsXG4gICAgICAgIG5hbWU6IFwiZW50aXRpZXNcIixcbiAgICAgICAgbWVzc2FnZTogXCJJbXBvcnTtlaAgRW50aXR566W8IOyEoO2Dne2VmOyEuOyalDpcIixcbiAgICAgICAgY2hvaWNlczogRW50aXR5TWFuYWdlci5nZXRBbGxJZHMoKS5tYXAoKGlkKSA9PiAoeyB0aXRsZTogaWQsIHZhbHVlOiBpZCB9KSksXG4gICAgICAgIG1pbjogMSxcbiAgICAgIH0pO1xuXG4gICAgICBpZiAoIXJlc3VsdC5lbnRpdGllcyB8fCByZXN1bHQuZW50aXRpZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIGNvbnNvbGUubG9nKGNoYWxrLnllbGxvdyhcIuy3qOyGjOuQmOyXiOyKteuLiOuLpC5cIikpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGVudGl0eU5hbWVzID0gcmVzdWx0LmVudGl0aWVzO1xuICAgIH1cblxuICAgIGNvbnN0IHN0cmF0ZWd5OiBEYXRhRXhwbG9yZXJTdHJhdGVneSA9IG9wdGlvbnMuc3RyYXRlZ3kgPz8gXCJyZWNlbnRcIjtcbiAgICBjb25zdCBsaW1pdCA9IG9wdGlvbnMubGltaXQgPyBOdW1iZXIucGFyc2VJbnQob3B0aW9ucy5saW1pdCwgMTApIDogMTA7XG5cbiAgICAvLyBmaXh0dXJlIGZldGNoOiDtmITsnqwg7ZmY6rK9IOuNsOydtO2EsOulvCBmaXh0dXJlIERC66GcIGltcG9ydO2VqeuLiOuLpFxuICAgIGNvbnN0IHNvdXJjZURiID0gREIuZ2V0REIoXCJyXCIpO1xuICAgIGNvbnN0IGZpeHR1cmVEYiA9IGNyZWF0ZUtuZXhJbnN0YW5jZShTb25hbXUuZGJDb25maWcuZml4dHVyZSk7XG4gICAgY29uc3QgZ2VuZXJhdG9yID0gbmV3IEZpeHR1cmVHZW5lcmF0b3Ioc291cmNlRGIsIGZpeHR1cmVEYiwgXCJmaXh0dXJlXCIsIEVudGl0eU1hbmFnZXIpO1xuXG4gICAgY29uc29sZS5sb2coY2hhbGsuY3lhbihgXFxuJHtlbnRpdHlOYW1lcy5qb2luKFwiLCBcIil9IGltcG9ydCDspJEuLi5gKSk7XG5cbiAgICBmb3IgKGNvbnN0IGVudGl0eU5hbWUgb2YgZW50aXR5TmFtZXMpIHtcbiAgICAgIGNvbnN0IHJlc3VsdHMgPSBhd2FpdCBnZW5lcmF0b3IuaW1wb3J0RnJvbVNvdXJjZShlbnRpdHlOYW1lLCB7XG4gICAgICAgIHN0cmF0ZWd5LFxuICAgICAgICBsaW1pdCxcbiAgICAgICAgaW5jbHVkZVJlbGF0aW9uczogdHJ1ZSxcbiAgICAgICAgbWF4RGVwdGg6IDIsXG4gICAgICB9KTtcblxuICAgICAgY29uc29sZS5sb2coY2hhbGsuZ3JlZW4oYOKchSAke2VudGl0eU5hbWV9OiAke3Jlc3VsdHMubGVuZ3RofeqwnCBpbXBvcnQg7JmE66OMYCkpO1xuICAgIH1cbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBjb25zb2xlLmVycm9yKFxuICAgICAgY2hhbGsucmVkKFxuICAgICAgICBcIuyLpOygnCBEQuyXkOyEnCDrjbDsnbTthLDrpbwg6rCA7KC47Jik64qUIOykkSDsmKTrpZjqsIAg67Cc7IOd7ZaI7Iq164uI64ukLlxcblwiICtcbiAgICAgICAgICBcIuybkOyduDog7IaM7IqkIERCIOyXsOqysCDshKTsoJUoc29uYW11LmNvbmZpZy50cynsnbTrgpggRW50aXR5IOq0gOqzhCDsoJXsnZjrpbwg7ZmV7J247ZW07KO87IS47JqULlxcblwiICtcbiAgICAgICAgICBcIuyekOyEuO2VnCDrgrTsmqk6XCIsXG4gICAgICApLFxuICAgICAgZXJyb3IsXG4gICAgKTtcbiAgICB0aHJvdyBlcnJvcjtcbiAgfVxufVxuXG4vKipcbiAqIGZpeHR1cmUgZXhwbG9yZSDrqoXroLnslrQgLSBEQuydmCDsi6TsoJwg642w7J207YSw66W8IOyhsO2ajO2VmOyXrCDtmZXsnbjtlanri4jri6QuXG4gKiDsoIDsnqXtlZjsp4Ag7JWK6rOgIOyhsO2ajOunjCDtlZjrr4DroZwg642w7J207YSw66W8IOu5oOultOqyjCDtmZXsnbjtlaAg65WMIOycoOyaqe2VqeuLiOuLpC5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGZpeHR1cmVFeHBsb3JlQ29tbWFuZChvcHRpb25zOiBGaXh0dXJlQ29tbWFuZE9wdGlvbnMpIHtcbiAgdHJ5IHtcbiAgICBpZiAoIUVudGl0eU1hbmFnZXIuaXNBdXRvbG9hZGVkKSB7XG4gICAgICBhd2FpdCBFbnRpdHlNYW5hZ2VyLmF1dG9sb2FkKCk7XG4gICAgfVxuXG4gICAgbGV0IGVudGl0eU5hbWUgPSBvcHRpb25zLmluY2x1ZGU7XG5cbiAgICBpZiAoIWVudGl0eU5hbWUpIHtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHByb21wdHMoe1xuICAgICAgICB0eXBlOiBcInNlbGVjdFwiLFxuICAgICAgICBuYW1lOiBcImVudGl0eVwiLFxuICAgICAgICBtZXNzYWdlOiBcIu2DkOyDie2VoCBFbnRpdHk6XCIsXG4gICAgICAgIGNob2ljZXM6IEVudGl0eU1hbmFnZXIuZ2V0QWxsSWRzKCkubWFwKChpZCkgPT4gKHsgdGl0bGU6IGlkLCB2YWx1ZTogaWQgfSkpLFxuICAgICAgfSk7XG5cbiAgICAgIGlmICghcmVzdWx0LmVudGl0eSkge1xuICAgICAgICBjb25zb2xlLmxvZyhjaGFsay55ZWxsb3coXCLst6jshozrkJjsl4jsirXri4jri6QuXCIpKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBlbnRpdHlOYW1lID0gcmVzdWx0LmVudGl0eTtcbiAgICB9XG5cbiAgICBpZiAoIWVudGl0eU5hbWUpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIkVudGl0eSBuYW1lIGlzIHJlcXVpcmVkXCIpO1xuICAgIH1cblxuICAgIGNvbnN0IHN0cmF0ZWd5OiBEYXRhRXhwbG9yZXJTdHJhdGVneSA9IG9wdGlvbnMuc3RyYXRlZ3kgPz8gXCJzYW1wbGVcIjtcbiAgICBjb25zdCBsaW1pdCA9IG9wdGlvbnMubGltaXQgPyBOdW1iZXIucGFyc2VJbnQob3B0aW9ucy5saW1pdCwgMTApIDogMTA7XG5cbiAgICBjb25zdCBkYiA9IERCLmdldERCKFwiclwiKTtcbiAgICBjb25zdCBleHBsb3JlciA9IG5ldyBEYXRhRXhwbG9yZXIoZGIsIEVudGl0eU1hbmFnZXIpO1xuICAgIGNvbnN0IGRhdGEgPSBhd2FpdCBleHBsb3Jlci5leHBsb3JlKGVudGl0eU5hbWUsIHsgc3RyYXRlZ3ksIGxpbWl0IH0pO1xuXG4gICAgY29uc29sZS5sb2coY2hhbGsuY3lhbihgXFxuJHtlbnRpdHlOYW1lfSAke2RhdGEubGVuZ3RofeqwnCDsobDtmowg7JmE66OMOmApKTtcbiAgICBjb25zb2xlLnRhYmxlKGRhdGEpO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGNvbnNvbGUuZXJyb3IoXG4gICAgICBjaGFsay5yZWQoXG4gICAgICAgIFwi642w7J207YSwIOyhsO2ajCDspJEg7Jik66WY6rCAIOuwnOyDne2WiOyKteuLiOuLpC5cXG5cIiArXG4gICAgICAgICAgXCLsm5Dsnbg6IERCIOyXsOqysOydtOuCmCBFbnRpdHkg7KCV7J2Y66W8IO2ZleyduO2VtOyjvOyEuOyalC5cXG5cIiArXG4gICAgICAgICAgXCLsnpDshLjtlZwg64K07JqpOlwiLFxuICAgICAgKSxcbiAgICAgIGVycm9yLFxuICAgICk7XG4gICAgdGhyb3cgZXJyb3I7XG4gIH1cbn1cbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7OztZQUdzQztRQUNIO1VBQ2tCO29CQUNHO1NBQ1g7bUJBQ1U7dUJBRVE7Ozs7QUFrQi9ELFNBQVMsaUJBQWlCLEtBQXFCO0NBRTdDLElBQUksV0FBVyxJQUFJLFlBQVksQ0FBQyxDQUFDLFFBQVEsY0FBYyxFQUFFO0NBQ3pELElBQUksU0FBUyxXQUFXLEdBQ3RCLFdBQVc7Q0FHYixJQUFJLFNBQVMsS0FBSyxRQUFRLEdBQ3hCLFdBQVcsSUFBSTtDQUdqQixPQUFPLFNBQVMsTUFBTSxHQUFHLEVBQUU7QUFDN0I7Ozs7QUFLQSxlQUFzQixrQkFBa0IsU0FBZ0M7Q0FDdEUsSUFBSTtFQUNGLElBQUksQ0FBQyxjQUFjLGNBQ2pCLE1BQU0sY0FBYyxTQUFTO0VBRy9CLElBQUk7RUFFSixJQUFJLFFBQVEsS0FBSztHQUNmLGNBQWMsY0FBYyxVQUFVO0dBQ3RDLElBQUksUUFBUSxTQUFTO0lBQ25CLE1BQU0sY0FBYyxRQUFRLFFBQVEsTUFBTSxHQUFHLENBQUMsQ0FBQyxLQUFLLE1BQWMsRUFBRSxLQUFLLENBQUM7SUFDMUUsY0FBYyxZQUFZLFFBQVEsU0FBUyxD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
@@ -16,7 +16,7 @@ if (process.env.HOT === "yes" && process.env.API_ROOT_PATH) {
16
16
  });
17
17
  console.log("🔥 HMR-hook initialized");
18
18
  }
19
-
20
19
  //#endregion
21
- export { };
22
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaG1yLWhvb2stcmVnaXN0ZXIuanMiLCJuYW1lcyI6W10sInNvdXJjZXMiOlsiLi4vLi4vc3JjL2Jpbi9obXItaG9vay1yZWdpc3Rlci50cyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIGhtci1ob29rIOy0iOq4sO2ZlO2VmOuKlCDrqqjrk4jsnoXri4jri6QuXG4gKlxuICog7J20IO2MjOydvOydgCAtLWltcG9ydCDtlIzrnpjqt7jroZwg7ZSE66Gc7IS47IqkIOyLnOyekSDsi5wg66Gc65Oc65CY7Ja07JW8IO2VqeuLiOuLpC5cbiAqXG4gKiDtmZjqsr3rs4DsiJg6XG4gKiAtIEFQSV9ST09UX1BBVEg6IOyCrOyaqeyekCDtlITroZzsoJ3tirjsnZggQVBJIOujqO2KuCDqsr3roZxcbiAqIC0gSE9UOiAneWVzJ+ydvCDrlYzrp4wgaG1yLWhvb2sg7Zmc7ISx7ZmUXG4gKi9cblxuaWYgKHByb2Nlc3MuZW52LkhPVCA9PT0gXCJ5ZXNcIiAmJiBwcm9jZXNzLmVudi5BUElfUk9PVF9QQVRIKSB7XG4gIGNvbnN0IHsgaG90IH0gPSBhd2FpdCBpbXBvcnQoXCJAc29uYW11LWtpdC9obXItaG9va1wiKTtcblxuICBhd2FpdCBob3QuaW5pdCh7XG4gICAgcm9vdERpcmVjdG9yeTogcHJvY2Vzcy5lbnYuQVBJX1JPT1RfUEFUSCwgLy8g7J20IOy5nOq1rOqwgCDtlITroZzsoJ3tirggQVBJIOqyveuhnOuhnCDsnpgg7ISk7KCV65CY7Ja07JW8IOyVhOuemCDrsJTsmrTrjZTrpqzqsIAg7J6R64+Z7ZWp64uI64ukLlxuICAgIGJvdW5kYXJpZXM6IFtgLi9zcmMvKiovKi50c2BdLCAvLyDtlITroZzsoJ3tirjsnZgg7J20IOy5nOq1rOuTpOydtCDrsJTsmrTrjZTrpqzqsIAg65Cp64uI64ukLlxuICB9KTtcblxuICBjb25zb2xlLmxvZyhcIvCflKUgSE1SLWhvb2sgaW5pdGlhbGl6ZWRcIik7XG59XG5cbi8vIG94bGludC1kaXNhYmxlLW5leHQtbGluZVxuZXhwb3J0IHt9O1xuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7O0FBVUEsSUFBSSxRQUFRLElBQUksUUFBUSxTQUFTLFFBQVEsSUFBSSxlQUFlO0NBQzFELE1BQU0sRUFBRSxRQUFRLE1BQU0sT0FBTztBQUU3QixPQUFNLElBQUksS0FBSztFQUNiLGVBQWUsUUFBUSxJQUFJO0VBQzNCLFlBQVksQ0FBQyxnQkFBZ0I7RUFDOUIsQ0FBQztBQUVGLFNBQVEsSUFBSSwwQkFBMEIifQ==
20
+ export {};
21
+
22
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaG1yLWhvb2stcmVnaXN0ZXIuanMiLCJuYW1lcyI6W10sInNvdXJjZXMiOlsiLi4vLi4vc3JjL2Jpbi9obXItaG9vay1yZWdpc3Rlci50cyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIGhtci1ob29rIOy0iOq4sO2ZlO2VmOuKlCDrqqjrk4jsnoXri4jri6QuXG4gKlxuICog7J20IO2MjOydvOydgCAtLWltcG9ydCDtlIzrnpjqt7jroZwg7ZSE66Gc7IS47IqkIOyLnOyekSDsi5wg66Gc65Oc65CY7Ja07JW8IO2VqeuLiOuLpC5cbiAqXG4gKiDtmZjqsr3rs4DsiJg6XG4gKiAtIEFQSV9ST09UX1BBVEg6IOyCrOyaqeyekCDtlITroZzsoJ3tirjsnZggQVBJIOujqO2KuCDqsr3roZxcbiAqIC0gSE9UOiAneWVzJ+ydvCDrlYzrp4wgaG1yLWhvb2sg7Zmc7ISx7ZmUXG4gKi9cblxuaWYgKHByb2Nlc3MuZW52LkhPVCA9PT0gXCJ5ZXNcIiAmJiBwcm9jZXNzLmVudi5BUElfUk9PVF9QQVRIKSB7XG4gIGNvbnN0IHsgaG90IH0gPSBhd2FpdCBpbXBvcnQoXCJAc29uYW11LWtpdC9obXItaG9va1wiKTtcblxuICBhd2FpdCBob3QuaW5pdCh7XG4gICAgcm9vdERpcmVjdG9yeTogcHJvY2Vzcy5lbnYuQVBJX1JPT1RfUEFUSCwgLy8g7J20IOy5nOq1rOqwgCDtlITroZzsoJ3tirggQVBJIOqyveuhnOuhnCDsnpgg7ISk7KCV65CY7Ja07JW8IOyVhOuemCDrsJTsmrTrjZTrpqzqsIAg7J6R64+Z7ZWp64uI64ukLlxuICAgIGJvdW5kYXJpZXM6IFtgLi9zcmMvKiovKi50c2BdLCAvLyDtlITroZzsoJ3tirjsnZgg7J20IOy5nOq1rOuTpOydtCDrsJTsmrTrjZTrpqzqsIAg65Cp64uI64ukLlxuICB9KTtcblxuICBjb25zb2xlLmxvZyhcIvCflKUgSE1SLWhvb2sgaW5pdGlhbGl6ZWRcIik7XG59XG5cbi8vIG94bGludC1kaXNhYmxlLW5leHQtbGluZVxuZXhwb3J0IHt9O1xuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7O0FBVUEsSUFBSSxRQUFRLElBQUksUUFBUSxTQUFTLFFBQVEsSUFBSSxlQUFlO0NBQzFELE1BQU0sRUFBRSxRQUFRLE1BQU0sT0FBTztDQUU3QixNQUFNLElBQUksS0FBSztFQUNiLGVBQWUsUUFBUSxJQUFJO0VBQzNCLFlBQVksQ0FBQyxlQUFlO0NBQzlCLENBQUM7Q0FFRCxRQUFRLElBQUkseUJBQXlCO0FBQ3ZDIn0=
@@ -0,0 +1,3 @@
1
+ import { type SonamuDBConfig } from "../database/db";
2
+ export declare function getMigrateRunTargets(): (keyof SonamuDBConfig)[];
3
+ //# sourceMappingURL=migrate-targets.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"migrate-targets.d.ts","sourceRoot":"","sources":["../../src/bin/migrate-targets.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAGrD,wBAAgB,oBAAoB,IAAI,CAAC,MAAM,cAAc,CAAC,EAAE,CAG/D"}
@@ -0,0 +1,11 @@
1
+ import { getSonamuEnvironment, init_env } from "../env.js";
2
+ //#region src/bin/migrate-targets.ts
3
+ init_env();
4
+ function getMigrateRunTargets() {
5
+ const environment = getSonamuEnvironment();
6
+ return environment === "test" ? ["test", "fixture"] : [environment];
7
+ }
8
+ //#endregion
9
+ export { getMigrateRunTargets };
10
+
11
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWlncmF0ZS10YXJnZXRzLmpzIiwibmFtZXMiOltdLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9iaW4vbWlncmF0ZS10YXJnZXRzLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IHR5cGUgU29uYW11REJDb25maWcgfSBmcm9tIFwiLi4vZGF0YWJhc2UvZGJcIjtcbmltcG9ydCB7IGdldFNvbmFtdUVudmlyb25tZW50IH0gZnJvbSBcIi4uL2VudlwiO1xuXG5leHBvcnQgZnVuY3Rpb24gZ2V0TWlncmF0ZVJ1blRhcmdldHMoKTogKGtleW9mIFNvbmFtdURCQ29uZmlnKVtdIHtcbiAgY29uc3QgZW52aXJvbm1lbnQgPSBnZXRTb25hbXVFbnZpcm9ubWVudCgpO1xuICByZXR1cm4gZW52aXJvbm1lbnQgPT09IFwidGVzdFwiID8gW1widGVzdFwiLCBcImZpeHR1cmVcIl0gOiBbZW52aXJvbm1lbnRdO1xufVxuIl0sIm1hcHBpbmdzIjoiOztTQUM2QztBQUU3QyxTQUFnQix1QkFBaUQ7Q0FDL0QsTUFBTSxjQUFjLHFCQUFxQjtDQUN6QyxPQUFPLGdCQUFnQixTQUFTLENBQUMsUUFBUSxTQUFTLElBQUksQ0FBQyxXQUFXO0FBQ3BFIn0=