sonamu 0.9.20 → 0.10.1

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 (299) 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 +210 -406
  25. package/dist/api/validator.js +5 -8
  26. package/dist/api/websocket-helpers.js +22 -33
  27. package/dist/auth/audit-log/builders.d.ts.map +1 -1
  28. package/dist/auth/audit-log/builders.js +4 -3
  29. package/dist/auth/audit-log/client-ip.d.ts +3 -0
  30. package/dist/auth/audit-log/client-ip.d.ts.map +1 -0
  31. package/dist/auth/audit-log/client-ip.js +27 -0
  32. package/dist/auth/audit-log/events.d.ts +1 -0
  33. package/dist/auth/audit-log/events.d.ts.map +1 -1
  34. package/dist/auth/audit-log/events.js +2 -2
  35. package/dist/auth/audit-log/plugin.js +30 -61
  36. package/dist/auth/audit-log-ingestor.d.ts.map +1 -1
  37. package/dist/auth/audit-log-ingestor.js +26 -43
  38. package/dist/auth/auth-generator.js +16 -41
  39. package/dist/auth/better-auth-entities.js +3 -4
  40. package/dist/auth/better-auth-request.d.ts +3 -0
  41. package/dist/auth/better-auth-request.d.ts.map +1 -0
  42. package/dist/auth/better-auth-request.js +23 -0
  43. package/dist/auth/index.js +2 -3
  44. package/dist/auth/knex-adapter.js +18 -45
  45. package/dist/auth/plugins/entity-definitions/admin.js +2 -2
  46. package/dist/auth/plugins/entity-definitions/anonymous.js +2 -2
  47. package/dist/auth/plugins/entity-definitions/api-key.js +2 -2
  48. package/dist/auth/plugins/entity-definitions/audit-log.js +2 -2
  49. package/dist/auth/plugins/entity-definitions/index.js +2 -3
  50. package/dist/auth/plugins/entity-definitions/jwt.js +2 -2
  51. package/dist/auth/plugins/entity-definitions/organization.js +2 -2
  52. package/dist/auth/plugins/entity-definitions/passkey.js +2 -2
  53. package/dist/auth/plugins/entity-definitions/phone-number.js +2 -2
  54. package/dist/auth/plugins/entity-definitions/sso.js +2 -2
  55. package/dist/auth/plugins/entity-definitions/two-factor.js +2 -2
  56. package/dist/auth/plugins/entity-definitions/types.js +1 -1
  57. package/dist/auth/plugins/entity-definitions/username.js +2 -2
  58. package/dist/auth/plugins/index.js +1 -2
  59. package/dist/auth/plugins/wrappers/admin.js +2 -3
  60. package/dist/auth/plugins/wrappers/anonymous.js +2 -3
  61. package/dist/auth/plugins/wrappers/api-key.js +2 -3
  62. package/dist/auth/plugins/wrappers/index.js +1 -2
  63. package/dist/auth/plugins/wrappers/jwt.js +2 -3
  64. package/dist/auth/plugins/wrappers/organization.js +2 -3
  65. package/dist/auth/plugins/wrappers/passkey.js +2 -3
  66. package/dist/auth/plugins/wrappers/phone-number.js +2 -3
  67. package/dist/auth/plugins/wrappers/sso.js +2 -3
  68. package/dist/auth/plugins/wrappers/two-factor.js +2 -3
  69. package/dist/auth/plugins/wrappers/username.js +2 -3
  70. package/dist/bin/build-config.js +2 -2
  71. package/dist/bin/cli.js +152 -259
  72. package/dist/bin/fixture.d.ts.map +1 -1
  73. package/dist/bin/fixture.js +55 -97
  74. package/dist/bin/hmr-hook-register.js +3 -3
  75. package/dist/bin/migrate-targets.d.ts +3 -0
  76. package/dist/bin/migrate-targets.d.ts.map +1 -0
  77. package/dist/bin/migrate-targets.js +11 -0
  78. package/dist/bin/test-command.js +25 -55
  79. package/dist/bin/ts-loader-register.js +5 -6
  80. package/dist/bin/ts-loader-registration.js +6 -13
  81. package/dist/cache/cache-manager.js +3 -4
  82. package/dist/cache/decorator.js +11 -21
  83. package/dist/cache/drivers.js +2 -3
  84. package/dist/cache/index.js +2 -3
  85. package/dist/cache/types.js +1 -1
  86. package/dist/cache-control/cache-control.js +21 -34
  87. package/dist/cache-control/types.js +1 -1
  88. package/dist/compress/compress.js +10 -10
  89. package/dist/compress/index.js +1 -2
  90. package/dist/compress/types.js +1 -1
  91. package/dist/cone/cone-generator.js +25 -63
  92. package/dist/database/_batch_update.js +26 -46
  93. package/dist/database/base-model.js +44 -97
  94. package/dist/database/base-model.types.js +1 -1
  95. package/dist/database/db.d.ts +8 -14
  96. package/dist/database/db.d.ts.map +1 -1
  97. package/dist/database/db.js +127 -72
  98. package/dist/database/knex.js +5 -8
  99. package/dist/database/puri-subset.types.js +1 -1
  100. package/dist/database/puri-wrapper.js +11 -15
  101. package/dist/database/puri.js +117 -234
  102. package/dist/database/puri.types.js +3 -4
  103. package/dist/database/transaction-context.js +4 -5
  104. package/dist/database/upsert-builder.js +109 -176
  105. package/dist/dict/en.d.ts +1 -0
  106. package/dist/dict/en.d.ts.map +1 -1
  107. package/dist/dict/en.js +4 -4
  108. package/dist/dict/index.js +2 -3
  109. package/dist/dict/ko.d.ts +1 -0
  110. package/dist/dict/ko.d.ts.map +1 -1
  111. package/dist/dict/ko.js +4 -4
  112. package/dist/dict/rc-keys.js +3 -4
  113. package/dist/dict/sd.js +8 -19
  114. package/dist/dict/sonamu-dictionary.js +141 -284
  115. package/dist/dict/types.js +1 -1
  116. package/dist/dict/utils.js +4 -5
  117. package/dist/entity/entity-manager.d.ts +2 -2
  118. package/dist/entity/entity-manager.js +34 -82
  119. package/dist/entity/entity-template-cone.js +33 -66
  120. package/dist/entity/entity.js +157 -311
  121. package/dist/env.d.ts +14 -0
  122. package/dist/env.d.ts.map +1 -0
  123. package/dist/env.js +75 -0
  124. package/dist/exceptions/error-handler.js +2 -3
  125. package/dist/exceptions/so-exceptions.js +7 -5
  126. package/dist/filter/index.js +1 -2
  127. package/dist/filter/types.js +3 -4
  128. package/dist/filter/utils.js +21 -54
  129. package/dist/index.js +9 -8
  130. package/dist/logger/category.js +6 -12
  131. package/dist/logger/configure.js +23 -34
  132. package/dist/migration/code-generation.js +147 -315
  133. package/dist/migration/index-where-predicate.js +52 -144
  134. package/dist/migration/migration-set.js +19 -33
  135. package/dist/migration/migrator.d.ts +2 -0
  136. package/dist/migration/migrator.d.ts.map +1 -1
  137. package/dist/migration/migrator.js +69 -53
  138. package/dist/migration/postgresql-schema-reader.js +126 -225
  139. package/dist/migration/slack-confirm.d.ts +1 -0
  140. package/dist/migration/slack-confirm.d.ts.map +1 -1
  141. package/dist/migration/slack-confirm.js +28 -38
  142. package/dist/migration/types.js +1 -1
  143. package/dist/naite/messaging-types.js +1 -1
  144. package/dist/naite/naite-reporter.js +15 -32
  145. package/dist/naite/naite.js +43 -76
  146. package/dist/ssr/index.js +6 -9
  147. package/dist/ssr/registry.js +10 -18
  148. package/dist/ssr/renderer.js +10 -21
  149. package/dist/ssr/types.js +1 -1
  150. package/dist/storage/base-file.js +5 -10
  151. package/dist/storage/buffered-file.js +3 -4
  152. package/dist/storage/drivers.js +2 -3
  153. package/dist/storage/index.js +2 -3
  154. package/dist/storage/s3-driver.js +5 -9
  155. package/dist/storage/storage-manager.js +5 -5
  156. package/dist/storage/types.js +1 -1
  157. package/dist/storage/uploaded-file.js +4 -6
  158. package/dist/stream/index.js +1 -2
  159. package/dist/stream/sse.js +8 -13
  160. package/dist/stream/ws-audience-resolver.js +5 -5
  161. package/dist/stream/ws-audience.js +3 -4
  162. package/dist/stream/ws-cluster-bus.js +3 -4
  163. package/dist/stream/ws-core.js +1 -1
  164. package/dist/stream/ws-delivery.js +11 -25
  165. package/dist/stream/ws-local-connection-store.js +9 -18
  166. package/dist/stream/ws-presence-store.js +43 -97
  167. package/dist/stream/ws-registry.js +17 -22
  168. package/dist/stream/ws-telemetry-memory.js +38 -45
  169. package/dist/stream/ws-telemetry-trace.js +4 -6
  170. package/dist/stream/ws-telemetry.js +82 -135
  171. package/dist/stream/ws.js +47 -91
  172. package/dist/syncer/api-parser.js +81 -147
  173. package/dist/syncer/checksum.js +14 -32
  174. package/dist/syncer/code-generator.js +29 -47
  175. package/dist/syncer/entity-operations.js +17 -27
  176. package/dist/syncer/event-batcher.js +8 -15
  177. package/dist/syncer/file-patterns.js +3 -4
  178. package/dist/syncer/file-tracking.js +6 -10
  179. package/dist/syncer/index.js +1 -2
  180. package/dist/syncer/module-loader.js +10 -26
  181. package/dist/syncer/syncer-actions.js +19 -37
  182. package/dist/syncer/syncer.js +46 -98
  183. package/dist/syncer/watcher.js +12 -26
  184. package/dist/tasks/decorator.js +7 -11
  185. package/dist/tasks/step-wrapper.js +7 -8
  186. package/dist/tasks/workflow-manager.js +18 -25
  187. package/dist/template/entity-converter.js +40 -64
  188. package/dist/template/helpers.js +32 -63
  189. package/dist/template/implementations/entity.template.js +7 -11
  190. package/dist/template/implementations/entry-server.template.js +2 -3
  191. package/dist/template/implementations/generated.template.js +25 -51
  192. package/dist/template/implementations/generated_http.template.js +31 -58
  193. package/dist/template/implementations/generated_sso.template.js +45 -85
  194. package/dist/template/implementations/init_types.template.js +4 -7
  195. package/dist/template/implementations/model.template.js +5 -10
  196. package/dist/template/implementations/model_test.template.js +2 -3
  197. package/dist/template/implementations/queries.template.js +4 -7
  198. package/dist/template/implementations/sd.template.js +17 -35
  199. package/dist/template/implementations/services.template.js +18 -30
  200. package/dist/template/implementations/view_form.template.js +72 -125
  201. package/dist/template/implementations/view_id_all_select.template.js +2 -3
  202. package/dist/template/implementations/view_list.template.js +86 -143
  203. package/dist/template/implementations/view_search_input.template.js +2 -3
  204. package/dist/template/index.js +5 -8
  205. package/dist/template/template-manager.js +13 -26
  206. package/dist/template/template-types.js +2 -3
  207. package/dist/template/template.js +7 -11
  208. package/dist/template/zod-converter.js +173 -348
  209. package/dist/testing/_relation-graph.js +18 -37
  210. package/dist/testing/bootstrap.js +5 -8
  211. package/dist/testing/data-explorer.js +34 -78
  212. package/dist/testing/dev-test-routes.js +54 -60
  213. package/dist/testing/dev-vitest-manager.js +33 -84
  214. package/dist/testing/faker-mappings.js +3 -4
  215. package/dist/testing/fixture-generator.d.ts +2 -1
  216. package/dist/testing/fixture-generator.d.ts.map +1 -1
  217. package/dist/testing/fixture-generator.js +159 -321
  218. package/dist/testing/fixture-loader.js +2 -2
  219. package/dist/testing/fixture-manager.d.ts.map +1 -1
  220. package/dist/testing/fixture-manager.js +124 -227
  221. package/dist/testing/global-setup.d.ts.map +1 -1
  222. package/dist/testing/global-setup.js +29 -17
  223. package/dist/testing/index.d.ts +1 -0
  224. package/dist/testing/index.d.ts.map +1 -1
  225. package/dist/testing/index.js +5 -4
  226. package/dist/testing/naite-vitest-reporter.js +2 -3
  227. package/dist/testing/parallel-db-manager.js +5 -3
  228. package/dist/testing/vitest-helpers.d.ts.map +1 -1
  229. package/dist/testing/vitest-helpers.js +15 -12
  230. package/dist/types/types.d.ts +14 -14
  231. package/dist/types/types.js +27 -50
  232. package/dist/ui/ai-api.js +6 -11
  233. package/dist/ui/ai-client.js +86 -134
  234. package/dist/ui/api.js +100 -196
  235. package/dist/ui/cdd-service.js +78 -130
  236. package/dist/ui/cdd-types.js +1 -1
  237. package/dist/ui-web/assets/{index-Df8q-fhb.js → index-DFStGyd0.js} +49 -49
  238. package/dist/ui-web/assets/index-Dx4ap5i4.css +1 -0
  239. package/dist/ui-web/index.html +2 -2
  240. package/dist/utils/async-utils.js +13 -25
  241. package/dist/utils/class-name.js +3 -4
  242. package/dist/utils/console-util.js +11 -26
  243. package/dist/utils/controller.d.ts.map +1 -1
  244. package/dist/utils/controller.js +14 -12
  245. package/dist/utils/esm-utils.js +5 -8
  246. package/dist/utils/formatter.js +10 -22
  247. package/dist/utils/fs-utils.js +14 -25
  248. package/dist/utils/lodash-able.js +3 -4
  249. package/dist/utils/model.js +7 -14
  250. package/dist/utils/object-utils.js +41 -73
  251. package/dist/utils/path-utils.js +5 -9
  252. package/dist/utils/process-utils.js +4 -7
  253. package/dist/utils/sql-parser.js +6 -13
  254. package/dist/utils/type-utils.js +16 -26
  255. package/dist/utils/utils.js +18 -40
  256. package/dist/utils/zod-error.js +9 -16
  257. package/dist/vector/chunking.js +24 -37
  258. package/dist/vector/config.js +2 -2
  259. package/dist/vector/embedding.js +8 -19
  260. package/dist/vector/index.js +1 -2
  261. package/dist/vector/types.js +1 -1
  262. package/package.json +8 -8
  263. package/src/__tests__/env.test.ts +127 -0
  264. package/src/api/__tests__/config.test.ts +10 -1
  265. package/src/api/config.ts +4 -12
  266. package/src/api/sonamu.ts +28 -33
  267. package/src/auth/audit-log/builders.ts +3 -0
  268. package/src/auth/audit-log/client-ip.ts +38 -0
  269. package/src/auth/audit-log/events.ts +1 -0
  270. package/src/auth/audit-log-ingestor.ts +22 -15
  271. package/src/auth/better-auth-request.ts +20 -0
  272. package/src/bin/__tests__/migrate-targets.test.ts +28 -0
  273. package/src/bin/__tests__/test-command.test.ts +82 -1
  274. package/src/bin/cli.ts +9 -18
  275. package/src/bin/fixture.ts +5 -4
  276. package/src/bin/migrate-targets.ts +7 -0
  277. package/src/bin/test-command.ts +2 -2
  278. package/src/database/__tests__/db.test.ts +175 -0
  279. package/src/database/db.ts +193 -71
  280. package/src/dict/en.ts +2 -0
  281. package/src/dict/ko.ts +2 -0
  282. package/src/env.ts +123 -0
  283. package/src/migration/__tests__/migrator.test.ts +149 -0
  284. package/src/migration/migrator.ts +74 -17
  285. package/src/migration/slack-confirm.ts +21 -0
  286. package/src/skills/sonamu/database.md +1 -1
  287. package/src/skills/sonamu/puri.md +33 -0
  288. package/src/skills/sonamu/testing-devrunner.md +1 -1
  289. package/src/stream/ws-telemetry-memory.ts +2 -2
  290. package/src/syncer/checksum.ts +7 -12
  291. package/src/testing/fixture-generator.ts +2 -1
  292. package/src/testing/fixture-manager.ts +3 -4
  293. package/src/testing/global-setup.ts +42 -18
  294. package/src/testing/index.ts +1 -0
  295. package/src/testing/vitest-helpers.ts +14 -0
  296. package/src/utils/controller.ts +14 -7
  297. package/tsdown.api.config.ts +6 -0
  298. package/dist/_virtual/rolldown_runtime.js +0 -39
  299. package/dist/ui-web/assets/index-D4rYm-Xz.css +0 -1
@@ -1,4 +1,4 @@
1
- import { __esmMin } from "../_virtual/rolldown_runtime.js";
1
+ import { __esmMin } from "../_virtual/_rolldown/runtime.js";
2
2
  import { AlreadyProcessedException, init_so_exceptions } from "../exceptions/so-exceptions.js";
3
3
  import { init_controller, isTest } from "../utils/controller.js";
4
4
  import { formatCode, init_formatter } from "../utils/formatter.js";
@@ -8,10 +8,9 @@ import { Naite, init_naite } from "../naite/naite.js";
8
8
  import { init_file_tracking, trackWritten } from "./file-tracking.js";
9
9
  import { generateTemplate, init_code_generator } from "./code-generator.js";
10
10
  import assert from "assert";
11
- import { mkdir, readFile, writeFile } from "fs/promises";
12
11
  import path, { dirname } from "path";
12
+ import { mkdir, readFile, writeFile } from "fs/promises";
13
13
  import chalk from "chalk";
14
-
15
14
  //#region src/syncer/syncer-actions.ts
16
15
  async function actionSyncConfig() {
17
16
  const { host, port } = Sonamu.config.server.listen ?? {};
@@ -28,8 +27,7 @@ async function actionSyncConfig() {
28
27
  */
29
28
  async function actionGenerateServices(paramsArray) {
30
29
  Naite.t("actionGenerateServices", paramsArray);
31
- const servicesFile = await generateTemplate("services", {}, { overwrite: true });
32
- return [...servicesFile];
30
+ return [...await generateTemplate("services", {}, { overwrite: true })];
33
31
  }
34
32
  /**
35
33
  * Entity에 딸린 초기 types.ts를 만들어줍니다.
@@ -72,9 +70,7 @@ async function actionGenerateSsrEntryServerIfNotExists() {
72
70
  try {
73
71
  return await generateTemplate("entry_server", {}, { overwrite: false });
74
72
  } catch (e) {
75
- if (e instanceof AlreadyProcessedException) {
76
- return [];
77
- }
73
+ if (e instanceof AlreadyProcessedException) return [];
78
74
  throw e;
79
75
  }
80
76
  }
@@ -92,16 +88,13 @@ async function actionSyncFilesToTargets(tsPaths) {
92
88
  return (await Promise.all(targets.map(async (target) => Promise.all(tsPaths.map(async (realSrc) => {
93
89
  const dst = realSrc.replace(`/${apiDir}/`, `/${target}/`).replace("/application/", "/services/");
94
90
  const dir = dirname(dst);
95
- if (!await exists(dir)) {
96
- await mkdir(dir, { recursive: true });
97
- }
98
- const syncHeader = [
91
+ if (!await exists(dir)) await mkdir(dir, { recursive: true });
92
+ await copyFileWithReplaceCoreToShared(realSrc, dst, [
99
93
  "/**",
100
94
  " * @generated",
101
95
  " * API에서 동기화된 파일입니다. 직접 수정하지 마세요.",
102
96
  " */"
103
- ].join("\n");
104
- await copyFileWithReplaceCoreToShared(realSrc, dst, syncHeader);
97
+ ].join("\n"));
105
98
  await trackWritten(dst);
106
99
  !isTest() && console.log(chalk.bold("Copied: ") + chalk.blue(dst.replace(`${Sonamu.appRootPath}/`, "")));
107
100
  return dst;
@@ -123,12 +116,8 @@ async function actionCopySharedToTargetsIfNotExists() {
123
116
  };
124
117
  for (const target of targets) {
125
118
  const srcPath = path.join(import.meta.dirname.replace("/dist/", "/src/"), `../shared/${target}.shared.ts.txt`);
126
- if (!await exists(srcPath)) {
127
- continue;
128
- }
129
- if (!await exists(path.join(Sonamu.appRootPath, target))) {
130
- throw new Error(`Tried to copy sonamu.shared.ts to target '${target}' but the target directory does not exist. Please check your project directory structure.`);
131
- }
119
+ if (!await exists(srcPath)) continue;
120
+ if (!await exists(path.join(Sonamu.appRootPath, target))) throw new Error(`Tried to copy sonamu.shared.ts to target '${target}' but the target directory does not exist. Please check your project directory structure.`);
132
121
  const fullText = await readFile(srcPath, "utf-8");
133
122
  const convertedText = Object.entries(convertMap).reduce((acc, [key, value]) => acc.replace(`$[[${key}]]`, value), fullText);
134
123
  const destPath = path.join(Sonamu.appRootPath, target, "src/services/sonamu.shared.ts");
@@ -136,9 +125,7 @@ async function actionCopySharedToTargetsIfNotExists() {
136
125
  await mkdir(path.dirname(destPath), { recursive: true });
137
126
  console.warn(`Created directory '${path.dirname(destPath)}' because it did not exist.`);
138
127
  }
139
- if (await exists(destPath)) {
140
- continue;
141
- }
128
+ if (await exists(destPath)) continue;
142
129
  await writeFile(destPath, await formatCode(convertedText, destPath));
143
130
  !isTest() && console.log(chalk.bold("Copied: ") + chalk.blue(path.relative(Sonamu.appRootPath, destPath)));
144
131
  }
@@ -157,15 +144,11 @@ async function actionSyncSonamuDictionary() {
157
144
  const i18nConfig = Sonamu.config.i18n;
158
145
  const targetList = ["api", ...targets];
159
146
  const apiI18nDir = path.join(Sonamu.appRootPath, Sonamu.config.api.dir, "src/i18n");
160
- for (const target of targetList) {
161
- try {
162
- if (target !== "api") {
163
- await syncLocaleFiles(target, apiI18nDir, i18nConfig.supportedLocales);
164
- }
165
- await generateTemplate("sd", { target }, { overwrite: true });
166
- } catch (e) {
167
- console.error(`Failed to generate SD template for ${target}:`, e);
168
- }
147
+ for (const target of targetList) try {
148
+ if (target !== "api") await syncLocaleFiles(target, apiI18nDir, i18nConfig.supportedLocales);
149
+ await generateTemplate("sd", { target }, { overwrite: true });
150
+ } catch (e) {
151
+ console.error(`Failed to generate SD template for ${target}:`, e);
169
152
  }
170
153
  }
171
154
  /**
@@ -177,13 +160,12 @@ async function syncLocaleFiles(target, apiI18nDir, locales) {
177
160
  for (const locale of locales) {
178
161
  const sourceFile = path.join(apiI18nDir, `${locale}.ts`);
179
162
  const targetFile = path.join(targetI18nDir, `${locale}.ts`);
180
- const syncHeader = [
163
+ await copyFileWithReplaceCoreToShared(sourceFile, targetFile, [
181
164
  "/**",
182
165
  " * @generated",
183
166
  " * API에서 동기화된 파일입니다. 직접 수정하지 마세요.",
184
167
  " */"
185
- ].join("\n");
186
- await copyFileWithReplaceCoreToShared(sourceFile, targetFile, syncHeader);
168
+ ].join("\n"));
187
169
  await trackWritten(targetFile);
188
170
  !isTest() && console.log(chalk.bold("Copied: ") + chalk.cyan(`${target}/src/i18n/${locale}.ts`));
189
171
  }
@@ -198,8 +180,8 @@ var init_syncer_actions = __esmMin((() => {
198
180
  init_code_generator();
199
181
  init_file_tracking();
200
182
  }));
201
-
202
183
  //#endregion
203
184
  init_syncer_actions();
204
185
  export { actionCopySharedToTargetsIfNotExists, actionGenerateHttps, actionGenerateInitialTypes, actionGenerateSchemas, actionGenerateServices, actionGenerateSsrEntryServerIfNotExists, actionGenerateSsrQueries, actionSyncConfig, actionSyncFilesToTargets, actionSyncSonamuDictionary, init_syncer_actions };
205
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3luY2VyLWFjdGlvbnMuanMiLCJuYW1lcyI6W10sInNvdXJjZXMiOlsiLi4vLi4vc3JjL3N5bmNlci9zeW5jZXItYWN0aW9ucy50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgYXNzZXJ0IGZyb20gXCJhc3NlcnRcIjtcbmltcG9ydCB7IG1rZGlyLCByZWFkRmlsZSwgd3JpdGVGaWxlIH0gZnJvbSBcImZzL3Byb21pc2VzXCI7XG5pbXBvcnQgcGF0aCwgeyBkaXJuYW1lIH0gZnJvbSBcInBhdGhcIjtcblxuaW1wb3J0IGNoYWxrIGZyb20gXCJjaGFsa1wiO1xuXG5pbXBvcnQgeyBTb25hbXUgfSBmcm9tIFwiLi4vYXBpL3NvbmFtdVwiO1xuaW1wb3J0IHsgdHlwZSBFbnRpdHlOYW1lc1JlY29yZCB9IGZyb20gXCIuLi9lbnRpdHkvZW50aXR5LW1hbmFnZXJcIjtcbmltcG9ydCB7IEFscmVhZHlQcm9jZXNzZWRFeGNlcHRpb24gfSBmcm9tIFwiLi4vZXhjZXB0aW9ucy9zby1leGNlcHRpb25zXCI7XG5pbXBvcnQgeyBOYWl0ZSB9IGZyb20gXCIuLi9uYWl0ZS9uYWl0ZVwiO1xuaW1wb3J0IHsgaXNUZXN0IH0gZnJvbSBcIi4uL3V0aWxzL2NvbnRyb2xsZXJcIjtcbmltcG9ydCB7IGZvcm1hdENvZGUgfSBmcm9tIFwiLi4vdXRpbHMvZm9ybWF0dGVyXCI7XG5pbXBvcnQgeyBjb3B5RmlsZVdpdGhSZXBsYWNlQ29yZVRvU2hhcmVkLCBleGlzdHMgfSBmcm9tIFwiLi4vdXRpbHMvZnMtdXRpbHNcIjtcbmltcG9ydCB7IHR5cGUgQWJzb2x1dGVQYXRoIH0gZnJvbSBcIi4uL3V0aWxzL3BhdGgtdXRpbHNcIjtcbmltcG9ydCB7IGdlbmVyYXRlVGVtcGxhdGUgfSBmcm9tIFwiLi9jb2RlLWdlbmVyYXRvclwiO1xuaW1wb3J0IHsgdHJhY2tXcml0dGVuIH0gZnJvbSBcIi4vZmlsZS10cmFja2luZ1wiO1xuXG4vLyB3ZWIvLnNvbmFtdS5lbnYg7JeQIO2YhOyerCDshKTsoJXqsJIg7KCA7J6lXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gYWN0aW9uU3luY0NvbmZpZygpIHtcbiAgY29uc3QgeyBob3N0LCBwb3J0IH0gPSBTb25hbXUuY29uZmlnLnNlcnZlci5saXN0ZW4gPz8ge307XG4gIGNvbnN0IGNvbnRlbnQgPSBgQVBJX0hPU1Q9JHtob3N0ID8/IFwibG9jYWxob3N0XCJ9XFxuQVBJX1BPUlQ9JHtwb3J0ID8/IDMwMDB9YDtcblxuICBOYWl0ZS50KFwiYWN0aW9uU3luY0NvbmZpZ1wiLCB7IGNvbnRlbnQgfSk7XG4gIGF3YWl0IFByb21pc2UuYWxsKFtcbiAgICAuLi5Tb25hbXUuY29uZmlnLnN5bmMudGFyZ2V0cy5tYXAoYXN5bmMgKHRhcmdldCkgPT4ge1xuICAgICAgYXdhaXQgd3JpdGVGaWxlKHBhdGguam9pbihTb25hbXUuYXBwUm9vdFBhdGgsIHRhcmdldCwgXCIuc29uYW11LmVudlwiKSwgY29udGVudCk7XG4gICAgfSksXG4gICAgZ2VuZXJhdGVUZW1wbGF0ZShcImdlbmVyYXRlZF9zc29cIiwge30sIHsgb3ZlcndyaXRlOiB0cnVlIH0pLFxuICBdKTtcbn1cblxuLyoqXG4gKiBzZXJ2aWNlcy5nZW5lcmF0ZWQudHPrpbwg7IOd7ISx7ZWp64uI64ukLlxuICogQHBhcmFtIHBhcmFtc0FycmF5XG4gKiBAcmV0dXJucyDsg53shLHrkJwg7YyM7J28IOqyveuhnCDrsLDsl7QuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBhY3Rpb25HZW5lcmF0ZVNlcnZpY2VzKFxuICBwYXJhbXNBcnJheToge1xuICAgIG5hbWVzUmVjb3JkOiBFbnRpdHlOYW1lc1JlY29yZDtcbiAgfVtdLFxuKTogUHJvbWlzZTxBYnNvbHV0ZVBhdGhbXT4ge1xuICBOYWl0ZS50KFwiYWN0aW9uR2VuZXJhdGVTZXJ2aWNlc1wiLCBwYXJhbXNBcnJheSk7XG5cbiAgLy8gc2VydmljZXMuZ2VuZXJhdGVkLnRzIO2Gte2VqSDtjIzsnbwg7IOd7ISxXG4gIGNvbnN0IHNlcnZpY2VzRmlsZSA9IGF3YWl0IGdlbmVyYXRlVGVtcGxhdGUoXG4gICAgXCJzZXJ2aWNlc1wiLFxuICAgIHt9LFxuICAgIHtcbiAgICAgIG92ZXJ3cml0ZTogdHJ1ZSxcbiAgICB9LFxuICApO1xuXG4gIHJldHVybiBbLi4uc2VydmljZXNGaWxlXTtcbn1cblxuLyoqXG4gKiBFbnRpdHnsl5Ag65S466awIOy0iOq4sCB0eXBlcy50c+ulvCDrp4zrk6TslrTspI3ri4jri6QuXG4gKiBAcGFyYW0gZW50aXR5SWRcbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGFjdGlvbkdlbmVyYXRlSW5pdGlhbFR5cGVzKGVudGl0eUlkOiBzdHJpbmcpOiBQcm9taXNlPEFic29sdXRlUGF0aFtdPiB7XG4gIHJldHVybiBnZW5lcmF0ZVRlbXBsYXRlKFwiaW5pdF90eXBlc1wiLCB7IGVudGl0eUlkIH0pO1xufVxuXG4vKipcbiAqIHNvbmFtdS5nZW5lcmF0ZWQudHPsmYAgc29uYW11LmdlbmVyYXRlZC5zc28udHPrpbwg7IOd7ISx7ZWp64uI64ukLlxuICogQHJldHVybnMg7IOd7ISx65CcIO2MjOydvCDqsr3roZwg67Cw7Je0LlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gYWN0aW9uR2VuZXJhdGVTY2hlbWFzKCk6IFByb21pc2U8QWJzb2x1dGVQYXRoW10+IHtcbiAgcmV0dXJuIChcbiAgICBhd2FpdCBQcm9taXNlLmFsbChbXG4gICAgICBnZW5lcmF0ZVRlbXBsYXRlKFwiZ2VuZXJhdGVkX3Nzb1wiLCB7fSwgeyBvdmVyd3JpdGU6IHRydWUgfSksXG4gICAgICBnZW5lcmF0ZVRlbXBsYXRlKFwiZ2VuZXJhdGVkXCIsIHt9LCB7IG92ZXJ3cml0ZTogdHJ1ZSB9KSxcbiAgICBdKVxuICApLmZsYXQoKTtcbn1cblxuLyoqXG4gKiBzb25hbXUuZ2VuZXJhdGVkLmh0dHDrpbwg7IOd7ISx7ZWp64uI64ukLlxuICogQHJldHVybnMg7IOd7ISx65CcIO2MjOydvCDqsr3roZwuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBhY3Rpb25HZW5lcmF0ZUh0dHBzKCk6IFByb21pc2U8QWJzb2x1dGVQYXRoPiB7XG4gIGNvbnN0IFtyZXNdID0gYXdhaXQgZ2VuZXJhdGVUZW1wbGF0ZShcbiAgICBcImdlbmVyYXRlZF9odHRwXCIsXG4gICAgeyBlbnRpdHlJZDogXCJkdW1teVwiIH0sXG4gICAgeyBvdmVyd3JpdGU6IHRydWUgfSxcbiAgKTtcbiAgYXNzZXJ0KHJlcyk7XG4gIHJldHVybiByZXM7XG59XG5cbi8qKlxuICogcXVlcmllcy5nZW5lcmF0ZWQudHMg7J6s7IOd7ISx7ZWp64uI64ukLlxuICogQHJldHVybnMg7IOd7ISx65CcIO2MjOydvCDqsr3roZwg67Cw7Je0LlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gYWN0aW9uR2VuZXJhdGVTc3JRdWVyaWVzKCk6IFByb21pc2U8QWJzb2x1dGVQYXRoW10+IHtcbiAgcmV0dXJuIGdlbmVyYXRlVGVtcGxhdGUoXCJxdWVyaWVzXCIsIHt9LCB7IG92ZXJ3cml0ZTogdHJ1ZSB9KTtcbn1cblxuLyoqXG4gKiBlbnRyeS1zZXJ2ZXIuZ2VuZXJhdGVkLnRzeOulvCDsg53shLHtlanri4jri6QuXG4gKiDri6Trpbgg7JWh7IWY65Ok6rO8IOuLrOumrCwg7J2066+4IO2MjOydvOydtCDsnojsnLzrqbQg6re464OlIOuGlOuRoeuLiOuLpC4g6re4656Y7IScIO2VqOyImCDsnbTrpoQg64Gd7JeQIOyNqOuGqOyWtOyalCDjhY5cbiAqIOyeheugpSDsnZjsobQg7JeG64qUIOygleyggSDsvZTrk5zrnbwg66ek67KIIG92ZXJ3cml0ZeuKlCBtdGltZeunjCDqsLHsi6DtlZjripQg7J2Y66+4IOyXhuuKlCDrj5nsnpEuXG4gKiDthZztlIzrpr8g7J6Q7LK06rCAIOuzgOqyveuQnCDqsr3smrAoU29uYW11IOyXheq3uOugiOydtOuTnCnsl5DripQg7IKs7Jqp7J6Q6rCAIO2MjOydvOydhCDsgq3soJztlZwg65KkIHN5bmProZwg7J6s7IOd7ISxLlxuICogQHJldHVybnMg7IOd7ISx65CcIO2MjOydvCDqsr3roZwg67Cw7Je0ICjsnbTrr7gg7J6I7Jy866m0IOu5iCDrsLDsl7QpLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gYWN0aW9uR2VuZXJhdGVTc3JFbnRyeVNlcnZlcklmTm90RXhpc3RzKCk6IFByb21pc2U8QWJzb2x1dGVQYXRoW10+IHtcbiAgdHJ5IHtcbiAgICByZXR1cm4gYXdhaXQgZ2VuZXJhdGVUZW1wbGF0ZShcImVudHJ5X3NlcnZlclwiLCB7fSwgeyBvdmVyd3JpdGU6IGZhbHNlIH0pO1xuICB9IGNhdGNoIChlKSB7XG4gICAgLy8gZ2VuZXJhdGVUZW1wbGF0ZeydgCBvdmVyd3JpdGU6IGZhbHNl7JeQ7IScIO2MjOydvOydtCDsnbTrr7gg7J6I7Jy866m0IOyYiOyZuOulvCDrjZjsp5Hri4jri6QuXG4gICAgLy8gSWZOb3RFeGlzdHMg7J2Y66+47IOBIFwi6re464OlIOuGlOuRlOuLpFwi6rCAIOygleyDgeydtOuvgOuhnCDruYgg67Cw7Je066GcIOuzgO2ZmO2VqeuLiOuLpC5cbiAgICBpZiAoZSBpbnN0YW5jZW9mIEFscmVhZHlQcm9jZXNzZWRFeGNlcHRpb24pIHtcbiAgICAgIHJldHVybiBbXTtcbiAgICB9XG4gICAgdGhyb3cgZTtcbiAgfVxufVxuXG4vKipcbiAqIOyjvOyWtOynhCAudHMg7YyM7J2865OkKGFwaeyXkCDsnojri6Tqs6Ag6rCA7KCVKeydhCDrqqjrk6Ag7YOA6rKfIOuUlOugie2GoOumrOydmCBzZXJ2aWNlc+yXkCDqsJbri6Qg65Gh64uI64ukLlxuICog7J2065WMIOuCtOu2gOydmCBzb25hbXUgaW1wb3J064qUIHNvbmFtdS5zaGFyZWQudHMgaW1wb3J066GcIOy5mO2ZmOuQmOqzoCxcbiAqIOqyveuhnOydmCAvYXBwbGljYXRpb24v7J2AIC9zZXJ2aWNlcy/roZwg7LmY7ZmY65Cp64uI64ukLlxuICpcbiAqIEBwYXJhbSB0c1BhdGhzIOuzteyCrO2VoCDtjIzsnbzrk6TsnZgg7KCI64yAIOqyveuhnFxuICogQHJldHVybnMg6rCBIO2DgOqyn+yXkCDrs7XsgqzrkJwg7YyM7J2865Ok7J2YIOygiOuMgCDqsr3roZwg67Cw7Je0IChmbGF0KS5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGFjdGlvblN5bmNGaWxlc1RvVGFyZ2V0cyh0c1BhdGhzOiBBYnNvbHV0ZVBhdGhbXSk6IFByb21pc2U8c3RyaW5nW10+IHtcbiAgY29uc3QgeyB0YXJnZXRzIH0gPSBTb25hbXUuY29uZmlnLnN5bmM7XG4gIGNvbnN0IHsgZGlyOiBhcGlEaXIgfSA9IFNvbmFtdS5jb25maWcuYXBpO1xuXG4gIHJldHVybiAoXG4gICAgYXdhaXQgUHJvbWlzZS5hbGwoXG4gICAgICB0YXJnZXRzLm1hcChhc3luYyAodGFyZ2V0KSA9PlxuICAgICAgICBQcm9taXNlLmFsbChcbiAgICAgICAgICB0c1BhdGhzLm1hcChhc3luYyAocmVhbFNyYykgPT4ge1xuICAgICAgICAgICAgY29uc3QgZHN0ID0gcmVhbFNyY1xuICAgICAgICAgICAgICAucmVwbGFjZShgLyR7YXBpRGlyfS9gLCBgLyR7dGFyZ2V0fS9gKVxuICAgICAgICAgICAgICAucmVwbGFjZShcIi9hcHBsaWNhdGlvbi9cIiwgXCIvc2VydmljZXMvXCIpO1xuICAgICAgICAgICAgY29uc3QgZGlyID0gZGlybmFtZShkc3QpO1xuICAgICAgICAgICAgaWYgKCEoYXdhaXQgZXhpc3RzKGRpcikpKSB7XG4gICAgICAgICAgICAgIGF3YWl0IG1rZGlyKGRpciwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCBzeW5jSGVhZGVyID0gW1xuICAgICAgICAgICAgICBcIi8qKlwiLFxuICAgICAgICAgICAgICBcIiAqIEBnZW5lcmF0ZWRcIixcbiAgICAgICAgICAgICAgXCIgKiBBUEnsl5DshJwg64+Z6riw7ZmU65CcIO2MjOydvOyeheuLiOuLpC4g7KeB7KCRIOyImOygle2VmOyngCDrp4jshLjsmpQuXCIsXG4gICAgICAgICAgICAgIFwiICovXCIsXG4gICAgICAgICAgICBdLmpvaW4oXCJcXG5cIik7XG4gICAgICAgICAgICBhd2FpdCBjb3B5RmlsZVdpdGhSZXBsYWNlQ29yZVRvU2hhcmVkKHJlYWxTcmMsIGRzdCwgc3luY0hlYWRlcik7XG4gICAgICAgICAgICBhd2FpdCB0cmFja1dyaXR0ZW4oZHN0IGFzIEFic29sdXRlUGF0aCk7XG4gICAgICAgICAgICAhaXNUZXN0KCkgJiZcbiAgICAgICAgICAgICAgY29uc29sZS5sb2coXG4gICAgICAgICAgICAgICAgY2hhbGsuYm9sZChcIkNvcGllZDogXCIpICsgY2hhbGsuYmx1ZShkc3QucmVwbGFjZShgJHtTb25hbXUuYXBwUm9vdFBhdGh9L2AsIFwiXCIpKSxcbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIHJldHVybiBkc3Q7XG4gICAgICAgICAgfSksXG4gICAgICAgICksXG4gICAgICApLFxuICAgIClcbiAgKS5mbGF0KCk7XG59XG5cbi8qKlxuICogc2hhcmVkIO2FnO2UjOumv+ycvOuhnOu2gO2EsCBzb25hbXUuc2hhcmVkLnRzIO2MjOydvOydhCDrp4zrk6TslrTshJwg66qo65OgIO2DgOqynyDrlJTroInthqDrpqzsl5Ag6rCW64ukIOuRoeuLiOuLpC5cbiAqIO2MjOydvOydhCDrp4zrk5zripQg6rO87KCV7JeQ7IScIOyXrOufrCDsuZjtmZgg6rCA6rO17J20IOydvOyWtOuCqeuLiOuLpC5cbiAqXG4gKiDri6Trpbgg7JWh7IWY65Ok6rO8IOuLrOumrCwg7J2066+4IO2MjOydvOydtCDsnojsnLzrqbQg6re464OlIOuGlOuRoeuLiOuLpC4g6re4656Y7IScIO2VqOyImCDsnbTrpoQg64Gd7JeQIOyNqOuGqOyWtOyalCDjhY5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGFjdGlvbkNvcHlTaGFyZWRUb1RhcmdldHNJZk5vdEV4aXN0cygpOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgeyB0YXJnZXRzIH0gPSBTb25hbXUuY29uZmlnLnN5bmM7XG5cbiAgLy8gcGx1cmFsLnRzIOuCtOyaqeydhCDsnb3slrTshJwgc2hhcmVkIO2MjOydvOyXkCDsgr3snoXtlanri4jri6QuXG4gIGNvbnN0IGRpY3RVdGlsc1BhdGggPSBwYXRoLmpvaW4oXG4gICAgaW1wb3J0Lm1ldGEuZGlybmFtZS5yZXBsYWNlKFwiL2Rpc3QvXCIsIFwiL3NyYy9cIiksXG4gICAgXCIuLi9kaWN0L3V0aWxzLnRzXCIsXG4gICk7XG4gIGNvbnN0IGRpY3RVdGlsc0NvZGUgPSAoYXdhaXQgZXhpc3RzKGRpY3RVdGlsc1BhdGgpKSA/IGF3YWl0IHJlYWRGaWxlKGRpY3RVdGlsc1BhdGgsIFwidXRmLThcIikgOiBcIlwiO1xuXG4gIC8vIO2KueyglSDrs4DsiJgg7LmY7ZmY7J2EIOychO2VtOyEnCDsgqzsmqntlanri4jri6QuXG4gIGNvbnN0IGNvbnZlcnRNYXAgPSB7XG4gICAgYmFzZVVybDpcbiAgICAgIFNvbmFtdS5jb25maWcuc2VydmVyLmJhc2VVcmwgPz9cbiAgICAgIGBodHRwOi8vJHtTb25hbXUuY29uZmlnLnNlcnZlci5saXN0ZW4/Lmhvc3QgPz8gXCJsb2NhbGhvc3RcIn06JHtTb25hbXUuY29uZmlnLnNlcnZlci5saXN0ZW4/LnBvcnQgPz8gMzAwMH1gLFxuICAgIGRpY3RVdGlsczogZGljdFV0aWxzQ29kZSxcbiAgfTtcblxuICBmb3IgKGNvbnN0IHRhcmdldCBvZiB0YXJnZXRzKSB7XG4gICAgLy8g7KeA6riIIOqwgOyguOqwgOugpOuKlCDsnbQg7YyM7J287J2AIFNvbmFtdSDsvZTrk5zrsqDsnbTsiqTsnZgg7J2867aA7J6F64uI64ukLlxuICAgIC8vIOq3uOufsOuNsCBkaXN0IOyGjSDruYzrk5zrkJwg7IaM7IqkIOy9lOuTnCDtjIzsnbzsnbQg7ZWE7JqU7ZWcIOqyg+ydtCDslYTri4jqs6AsIHNyY+yXkOunjCDsnojripQg7YWN7Iqk7Yq4IO2MjOydvOydtCDtlYTsmpTtlanri4jri6QuXG4gICAgLy8g65Sw65287IScIC9zcmMv7JeQ7IScIOywvuyKteuLiOuLpC5cbiAgICBjb25zdCBzcmNQYXRoID0gcGF0aC5qb2luKFxuICAgICAgaW1wb3J0Lm1ldGEuZGlybmFtZS5yZXBsYWNlKFwiL2Rpc3QvXCIsIFwiL3NyYy9cIiksXG4gICAgICBgLi4vc2hhcmVkLyR7dGFyZ2V0fS5zaGFyZWQudHMudHh0YCxcbiAgICApO1xuICAgIGlmICghKGF3YWl0IGV4aXN0cyhzcmNQYXRoKSkpIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICBpZiAoIShhd2FpdCBleGlzdHMocGF0aC5qb2luKFNvbmFtdS5hcHBSb290UGF0aCwgdGFyZ2V0KSkpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGBUcmllZCB0byBjb3B5IHNvbmFtdS5zaGFyZWQudHMgdG8gdGFyZ2V0ICcke3RhcmdldH0nIGJ1dCB0aGUgdGFyZ2V0IGRpcmVjdG9yeSBkb2VzIG5vdCBleGlzdC4gUGxlYXNlIGNoZWNrIHlvdXIgcHJvamVjdCBkaXJlY3Rvcnkgc3RydWN0dXJlLmAsXG4gICAgICApO1xuICAgIH1cblxuICAgIGNvbnN0IGZ1bGxUZXh0ID0gYXdhaXQgcmVhZEZpbGUoc3JjUGF0aCwgXCJ1dGYtOFwiKTtcbiAgICBjb25zdCBjb252ZXJ0ZWRUZXh0ID0gT2JqZWN0LmVudHJpZXMoY29udmVydE1hcCkucmVkdWNlKFxuICAgICAgKGFjYywgW2tleSwgdmFsdWVdKSA9PiBhY2MucmVwbGFjZShgJFtbJHtrZXl9XV1gLCB2YWx1ZSksXG4gICAgICBmdWxsVGV4dCxcbiAgICApO1xuXG4gICAgLy8g7J206rG0IO2UhOuhnOygne2KuOyXkCAudHMg7IaM7IqkIOy9lOuTnCDtjIzsnbzsnYQg7IOd7ISx7ZWY64qUIOqyg+ydtOuvgOuhnCBzcmPsnZggLnRzIOqyveuhnOuhnCDqsJHri4jri6QuXG4gICAgY29uc3QgZGVzdFBhdGggPSBwYXRoLmpvaW4oU29uYW11LmFwcFJvb3RQYXRoLCB0YXJnZXQsIFwic3JjL3NlcnZpY2VzL3NvbmFtdS5zaGFyZWQudHNcIik7XG5cbiAgICAvLyDsoJXrp5Ag7Zi57Iuc64KY7KeA66eMIHRhcmdldCDrlJTroInthqDrpqzripQg7J6I7Ja064+EIHNyYy9zZXJ2aWNlcyDrlJTroInthqDrpqzripQg7JeG7J2EIOyImCDsnojsnLzrr4DroZwg66+466asIOyDneyEse2VtOykjeuLiOuLpC5cbiAgICBpZiAoIShhd2FpdCBleGlzdHMocGF0aC5kaXJuYW1lKGRlc3RQYXRoKSkpKSB7XG4gICAgICBhd2FpdCBta2RpcihwYXRoLmRpcm5hbWUoZGVzdFBhdGgpLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgICAgIGNvbnNvbGUud2FybihgQ3JlYXRlZCBkaXJlY3RvcnkgJyR7cGF0aC5kaXJuYW1lKGRlc3RQYXRoKX0nIGJlY2F1c2UgaXQgZGlkIG5vdCBleGlzdC5gKTtcbiAgICB9XG5cbiAgICAvLyDtjIzsnbzsnbQg7J2066+4IOyhtOyerO2VmOuptCDqsbTrhIjrnIHri4jri6QuXG4gICAgLy8gc29uYW11LnNoYXJlZC50c+uKlCDtlITroZzsoJ3tirjsl5DshJwg7J6Q7Jyg66Gt6rKMIOy7pOyKpO2EsOuniOydtOynle2VoCDsiJgg7J6I7Ja07JW8IO2VmOuvgOuhnCxcbiAgICAvLyDstZzstIggMe2ajOunjCDsg53shLHtlZjqs6Ag7J207ZuE7JeQ64qUIOuNruyWtOyTsOyngCDslYrsirXri4jri6QuXG4gICAgLy8g7YWc7ZSM66a/IOuCtOyaqSgkW1tkaWN0VXRpbHNdXSDrk7Ep7J20IOuzgOqyveuQmOyXiOydhCDrlYwg67CY7JiB7J20IO2VhOyalO2VmOuptCxcbiAgICAvLyDtlbTri7kg7YyM7J287J2EIOyCreygnO2VnCDrkqQgYHBucG0gc29uYW11IHN5bmNg66GcIOyerOyDneyEse2VmOuptCDrkKnri4jri6QuXG4gICAgaWYgKGF3YWl0IGV4aXN0cyhkZXN0UGF0aCkpIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIGF3YWl0IHdyaXRlRmlsZShkZXN0UGF0aCwgYXdhaXQgZm9ybWF0Q29kZShjb252ZXJ0ZWRUZXh0LCBkZXN0UGF0aCkpO1xuICAgICFpc1Rlc3QoKSAmJlxuICAgICAgY29uc29sZS5sb2coY2hhbGsuYm9sZChcIkNvcGllZDogXCIpICsgY2hhbGsuYmx1ZShwYXRoLnJlbGF0aXZlKFNvbmFtdS5hcHBSb290UGF0aCwgZGVzdFBhdGgpKSk7XG4gIH1cbn1cblxuLyoqXG4gKiBTb25hbXUgRGljdGlvbmFyeShTRCnrpbwg66qo65OgIO2DgOqynyhhcGkgKyB3ZWIvYXBwIOuTsSnsl5Ag64+Z6riw7ZmU7ZWp64uI64ukLlxuICpcbiAqIOqwgSDtg4Dqsp/sl5Ag64yA7ZW0OlxuICogLSB0YXJnZXTsnbQgYXBp6rCAIOyVhOuLiOuptCDsgqzsmqnsnpAg7J6R7ISxIGxvY2FsZSDtjIzsnbwoa28udHMvZW4udHMvLi4uKeydhCBhcGkg4oaSIHRhcmdldOycvOuhnCDrs7XsgqxcbiAqIC0gc2Qg7YWc7ZSM66a/7J2EIOugjOuNlOunge2VtOyEnCBzZC5nZW5lcmF0ZWQudHMg7IOd7ISxIChvdmVyd3JpdGUpXG4gKlxuICog7ZWcIO2DgOqyn+yXkOyEnCDsi6TtjKjtlbTrj4Qg64uk66W4IO2DgOqyn+ydgCDqs4Tsho0g7KeE7ZaJ7ZWp64uI64ukLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gYWN0aW9uU3luY1NvbmFtdURpY3Rpb25hcnkoKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IHsgdGFyZ2V0cyB9ID0gU29uYW11LmNvbmZpZy5zeW5jO1xuICBjb25zdCBpMThuQ29uZmlnID0gU29uYW11LmNvbmZpZy5pMThuO1xuXG4gIGNvbnN0IHRhcmdldExpc3QgPSBbXCJhcGlcIiwgLi4udGFyZ2V0c10gYXMgKFwiYXBpXCIgfCBcIndlYlwiIHwgXCJhcHBcIilbXTtcblxuICBjb25zdCBhcGlJMThuRGlyID0gcGF0aC5qb2luKFNvbmFtdS5hcHBSb290UGF0aCwgU29uYW11LmNvbmZpZy5hcGkuZGlyLCBcInNyYy9pMThuXCIpO1xuXG4gIGZvciAoY29uc3QgdGFyZ2V0IG9mIHRhcmdldExpc3QpIHtcbiAgICB0cnkge1xuICAgICAgLy8gd2ViL2FwcOydmCDqsr3smrAgbG9jYWxlIO2MjOydvOuTpOydhCBhcGnsl5DshJwg67O17IKsXG4gICAgICBpZiAodGFyZ2V0ICE9PSBcImFwaVwiKSB7XG4gICAgICAgIGF3YWl0IHN5bmNMb2NhbGVGaWxlcyh0YXJnZXQsIGFwaUkxOG5EaXIsIGkxOG5Db25maWcuc3VwcG9ydGVkTG9jYWxlcyk7XG4gICAgICB9XG5cbiAgICAgIGF3YWl0IGdlbmVyYXRlVGVtcGxhdGUoXCJzZFwiLCB7IHRhcmdldCB9LCB7IG92ZXJ3cml0ZTogdHJ1ZSB9KTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBjb25zb2xlLmVycm9yKGBGYWlsZWQgdG8gZ2VuZXJhdGUgU0QgdGVtcGxhdGUgZm9yICR7dGFyZ2V0fTpgLCBlKTtcbiAgICB9XG4gIH1cbn1cblxuLyoqXG4gKiBhcGnsnZggbG9jYWxlIO2MjOydvOydhCB3ZWIvYXBw7Jy866GcIOuzteyCrO2VqeuLiOuLpC5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gc3luY0xvY2FsZUZpbGVzKFxuICB0YXJnZXQ6IHN0cmluZyxcbiAgYXBpSTE4bkRpcjogc3RyaW5nLFxuICBsb2NhbGVzOiBzdHJpbmdbXSxcbik6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCB0YXJnZXRJMThuRGlyID0gcGF0aC5qb2luKFNvbmFtdS5hcHBSb290UGF0aCwgdGFyZ2V0LCBcInNyYy9pMThuXCIpO1xuXG4gIC8vIOuUlOugie2GoOumrOqwgCDsl4bsnLzrqbQg7IOd7ISxXG4gIGF3YWl0IG1rZGlyKHRhcmdldEkxOG5EaXIsIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuXG4gIGZvciAoY29uc3QgbG9jYWxlIG9mIGxvY2FsZXMpIHtcbiAgICBjb25zdCBzb3VyY2VGaWxlID0gcGF0aC5qb2luKGFwaUkxOG5EaXIsIGAke2xvY2FsZX0udHNgKTtcbiAgICBjb25zdCB0YXJnZXRGaWxlID0gcGF0aC5qb2luKHRhcmdldEkxOG5EaXIsIGAke2xvY2FsZX0udHNgKTtcblxuICAgIGNvbnN0IHN5bmNIZWFkZXIgPSBbXG4gICAgICBcIi8qKlwiLFxuICAgICAgXCIgKiBAZ2VuZXJhdGVkXCIsXG4gICAgICBcIiAqIEFQSeyXkOyEnCDrj5nquLDtmZTrkJwg7YyM7J287J6F64uI64ukLiDsp4HsoJEg7IiY7KCV7ZWY7KeAIOuniOyEuOyalC5cIixcbiAgICAgIFwiICovXCIsXG4gICAgXS5qb2luKFwiXFxuXCIpO1xuICAgIGF3YWl0IGNvcHlGaWxlV2l0aFJlcGxhY2VDb3JlVG9TaGFyZWQoc291cmNlRmlsZSwgdGFyZ2V0RmlsZSwgc3luY0hlYWRlcik7XG4gICAgYXdhaXQgdHJhY2tXcml0dGVuKHRhcmdldEZpbGUgYXMgQWJzb2x1dGVQYXRoKTtcbiAgICAhaXNUZXN0KCkgJiZcbiAgICAgIGNvbnNvbGUubG9nKGNoYWxrLmJvbGQoXCJDb3BpZWQ6IFwiKSArIGNoYWxrLmN5YW4oYCR7dGFyZ2V0fS9zcmMvaTE4bi8ke2xvY2FsZX0udHNgKSk7XG4gIH1cbn1cbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7O0FBa0JBLGVBQXNCLG1CQUFtQjtDQUN2QyxNQUFNLEVBQUUsTUFBTSxTQUFTLE9BQU8sT0FBTyxPQUFPLFVBQVUsRUFBRTtDQUN4RCxNQUFNLFVBQVUsWUFBWSxRQUFRLFlBQVksYUFBYSxRQUFRO0FBRXJFLE9BQU0sRUFBRSxvQkFBb0IsRUFBRSxTQUFTLENBQUM7QUFDeEMsT0FBTSxRQUFRLElBQUksQ0FDaEIsR0FBRyxPQUFPLE9BQU8sS0FBSyxRQUFRLElBQUksT0FBTyxXQUFXO0FBQ2xELFFBQU0sVUFBVSxLQUFLLEtBQUssT0FBTyxhQUFhLFFBQVEsY0FBYyxFQUFFLFFBQVE7R0FDOUUsRUFDRixpQkFBaUIsaUJBQWlCLEVBQUUsRUFBRSxFQUFFLFdBQVcsTUFBTSxDQUFDLENBQzNELENBQUM7Ozs7Ozs7QUFRSixlQUFzQix1QkFDcEIsYUFHeUI7QUFDekIsT0FBTSxFQUFFLDBCQUEwQixZQUFZO0NBRzlDLE1BQU0sZUFBZSxNQUFNLGlCQUN6QixZQUNBLEVB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
186
+
187
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3luY2VyLWFjdGlvbnMuanMiLCJuYW1lcyI6W10sInNvdXJjZXMiOlsiLi4vLi4vc3JjL3N5bmNlci9zeW5jZXItYWN0aW9ucy50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgYXNzZXJ0IGZyb20gXCJhc3NlcnRcIjtcbmltcG9ydCB7IG1rZGlyLCByZWFkRmlsZSwgd3JpdGVGaWxlIH0gZnJvbSBcImZzL3Byb21pc2VzXCI7XG5pbXBvcnQgcGF0aCwgeyBkaXJuYW1lIH0gZnJvbSBcInBhdGhcIjtcblxuaW1wb3J0IGNoYWxrIGZyb20gXCJjaGFsa1wiO1xuXG5pbXBvcnQgeyBTb25hbXUgfSBmcm9tIFwiLi4vYXBpL3NvbmFtdVwiO1xuaW1wb3J0IHsgdHlwZSBFbnRpdHlOYW1lc1JlY29yZCB9IGZyb20gXCIuLi9lbnRpdHkvZW50aXR5LW1hbmFnZXJcIjtcbmltcG9ydCB7IEFscmVhZHlQcm9jZXNzZWRFeGNlcHRpb24gfSBmcm9tIFwiLi4vZXhjZXB0aW9ucy9zby1leGNlcHRpb25zXCI7XG5pbXBvcnQgeyBOYWl0ZSB9IGZyb20gXCIuLi9uYWl0ZS9uYWl0ZVwiO1xuaW1wb3J0IHsgaXNUZXN0IH0gZnJvbSBcIi4uL3V0aWxzL2NvbnRyb2xsZXJcIjtcbmltcG9ydCB7IGZvcm1hdENvZGUgfSBmcm9tIFwiLi4vdXRpbHMvZm9ybWF0dGVyXCI7XG5pbXBvcnQgeyBjb3B5RmlsZVdpdGhSZXBsYWNlQ29yZVRvU2hhcmVkLCBleGlzdHMgfSBmcm9tIFwiLi4vdXRpbHMvZnMtdXRpbHNcIjtcbmltcG9ydCB7IHR5cGUgQWJzb2x1dGVQYXRoIH0gZnJvbSBcIi4uL3V0aWxzL3BhdGgtdXRpbHNcIjtcbmltcG9ydCB7IGdlbmVyYXRlVGVtcGxhdGUgfSBmcm9tIFwiLi9jb2RlLWdlbmVyYXRvclwiO1xuaW1wb3J0IHsgdHJhY2tXcml0dGVuIH0gZnJvbSBcIi4vZmlsZS10cmFja2luZ1wiO1xuXG4vLyB3ZWIvLnNvbmFtdS5lbnYg7JeQIO2YhOyerCDshKTsoJXqsJIg7KCA7J6lXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gYWN0aW9uU3luY0NvbmZpZygpIHtcbiAgY29uc3QgeyBob3N0LCBwb3J0IH0gPSBTb25hbXUuY29uZmlnLnNlcnZlci5saXN0ZW4gPz8ge307XG4gIGNvbnN0IGNvbnRlbnQgPSBgQVBJX0hPU1Q9JHtob3N0ID8/IFwibG9jYWxob3N0XCJ9XFxuQVBJX1BPUlQ9JHtwb3J0ID8/IDMwMDB9YDtcblxuICBOYWl0ZS50KFwiYWN0aW9uU3luY0NvbmZpZ1wiLCB7IGNvbnRlbnQgfSk7XG4gIGF3YWl0IFByb21pc2UuYWxsKFtcbiAgICAuLi5Tb25hbXUuY29uZmlnLnN5bmMudGFyZ2V0cy5tYXAoYXN5bmMgKHRhcmdldCkgPT4ge1xuICAgICAgYXdhaXQgd3JpdGVGaWxlKHBhdGguam9pbihTb25hbXUuYXBwUm9vdFBhdGgsIHRhcmdldCwgXCIuc29uYW11LmVudlwiKSwgY29udGVudCk7XG4gICAgfSksXG4gICAgZ2VuZXJhdGVUZW1wbGF0ZShcImdlbmVyYXRlZF9zc29cIiwge30sIHsgb3ZlcndyaXRlOiB0cnVlIH0pLFxuICBdKTtcbn1cblxuLyoqXG4gKiBzZXJ2aWNlcy5nZW5lcmF0ZWQudHPrpbwg7IOd7ISx7ZWp64uI64ukLlxuICogQHBhcmFtIHBhcmFtc0FycmF5XG4gKiBAcmV0dXJucyDsg53shLHrkJwg7YyM7J28IOqyveuhnCDrsLDsl7QuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBhY3Rpb25HZW5lcmF0ZVNlcnZpY2VzKFxuICBwYXJhbXNBcnJheToge1xuICAgIG5hbWVzUmVjb3JkOiBFbnRpdHlOYW1lc1JlY29yZDtcbiAgfVtdLFxuKTogUHJvbWlzZTxBYnNvbHV0ZVBhdGhbXT4ge1xuICBOYWl0ZS50KFwiYWN0aW9uR2VuZXJhdGVTZXJ2aWNlc1wiLCBwYXJhbXNBcnJheSk7XG5cbiAgLy8gc2VydmljZXMuZ2VuZXJhdGVkLnRzIO2Gte2VqSDtjIzsnbwg7IOd7ISxXG4gIGNvbnN0IHNlcnZpY2VzRmlsZSA9IGF3YWl0IGdlbmVyYXRlVGVtcGxhdGUoXG4gICAgXCJzZXJ2aWNlc1wiLFxuICAgIHt9LFxuICAgIHtcbiAgICAgIG92ZXJ3cml0ZTogdHJ1ZSxcbiAgICB9LFxuICApO1xuXG4gIHJldHVybiBbLi4uc2VydmljZXNGaWxlXTtcbn1cblxuLyoqXG4gKiBFbnRpdHnsl5Ag65S466awIOy0iOq4sCB0eXBlcy50c+ulvCDrp4zrk6TslrTspI3ri4jri6QuXG4gKiBAcGFyYW0gZW50aXR5SWRcbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGFjdGlvbkdlbmVyYXRlSW5pdGlhbFR5cGVzKGVudGl0eUlkOiBzdHJpbmcpOiBQcm9taXNlPEFic29sdXRlUGF0aFtdPiB7XG4gIHJldHVybiBnZW5lcmF0ZVRlbXBsYXRlKFwiaW5pdF90eXBlc1wiLCB7IGVudGl0eUlkIH0pO1xufVxuXG4vKipcbiAqIHNvbmFtdS5nZW5lcmF0ZWQudHPsmYAgc29uYW11LmdlbmVyYXRlZC5zc28udHPrpbwg7IOd7ISx7ZWp64uI64ukLlxuICogQHJldHVybnMg7IOd7ISx65CcIO2MjOydvCDqsr3roZwg67Cw7Je0LlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gYWN0aW9uR2VuZXJhdGVTY2hlbWFzKCk6IFByb21pc2U8QWJzb2x1dGVQYXRoW10+IHtcbiAgcmV0dXJuIChcbiAgICBhd2FpdCBQcm9taXNlLmFsbChbXG4gICAgICBnZW5lcmF0ZVRlbXBsYXRlKFwiZ2VuZXJhdGVkX3Nzb1wiLCB7fSwgeyBvdmVyd3JpdGU6IHRydWUgfSksXG4gICAgICBnZW5lcmF0ZVRlbXBsYXRlKFwiZ2VuZXJhdGVkXCIsIHt9LCB7IG92ZXJ3cml0ZTogdHJ1ZSB9KSxcbiAgICBdKVxuICApLmZsYXQoKTtcbn1cblxuLyoqXG4gKiBzb25hbXUuZ2VuZXJhdGVkLmh0dHDrpbwg7IOd7ISx7ZWp64uI64ukLlxuICogQHJldHVybnMg7IOd7ISx65CcIO2MjOydvCDqsr3roZwuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBhY3Rpb25HZW5lcmF0ZUh0dHBzKCk6IFByb21pc2U8QWJzb2x1dGVQYXRoPiB7XG4gIGNvbnN0IFtyZXNdID0gYXdhaXQgZ2VuZXJhdGVUZW1wbGF0ZShcbiAgICBcImdlbmVyYXRlZF9odHRwXCIsXG4gICAgeyBlbnRpdHlJZDogXCJkdW1teVwiIH0sXG4gICAgeyBvdmVyd3JpdGU6IHRydWUgfSxcbiAgKTtcbiAgYXNzZXJ0KHJlcyk7XG4gIHJldHVybiByZXM7XG59XG5cbi8qKlxuICogcXVlcmllcy5nZW5lcmF0ZWQudHMg7J6s7IOd7ISx7ZWp64uI64ukLlxuICogQHJldHVybnMg7IOd7ISx65CcIO2MjOydvCDqsr3roZwg67Cw7Je0LlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gYWN0aW9uR2VuZXJhdGVTc3JRdWVyaWVzKCk6IFByb21pc2U8QWJzb2x1dGVQYXRoW10+IHtcbiAgcmV0dXJuIGdlbmVyYXRlVGVtcGxhdGUoXCJxdWVyaWVzXCIsIHt9LCB7IG92ZXJ3cml0ZTogdHJ1ZSB9KTtcbn1cblxuLyoqXG4gKiBlbnRyeS1zZXJ2ZXIuZ2VuZXJhdGVkLnRzeOulvCDsg53shLHtlanri4jri6QuXG4gKiDri6Trpbgg7JWh7IWY65Ok6rO8IOuLrOumrCwg7J2066+4IO2MjOydvOydtCDsnojsnLzrqbQg6re464OlIOuGlOuRoeuLiOuLpC4g6re4656Y7IScIO2VqOyImCDsnbTrpoQg64Gd7JeQIOyNqOuGqOyWtOyalCDjhY5cbiAqIOyeheugpSDsnZjsobQg7JeG64qUIOygleyggSDsvZTrk5zrnbwg66ek67KIIG92ZXJ3cml0ZeuKlCBtdGltZeunjCDqsLHsi6DtlZjripQg7J2Y66+4IOyXhuuKlCDrj5nsnpEuXG4gKiDthZztlIzrpr8g7J6Q7LK06rCAIOuzgOqyveuQnCDqsr3smrAoU29uYW11IOyXheq3uOugiOydtOuTnCnsl5DripQg7IKs7Jqp7J6Q6rCAIO2MjOydvOydhCDsgq3soJztlZwg65KkIHN5bmProZwg7J6s7IOd7ISxLlxuICogQHJldHVybnMg7IOd7ISx65CcIO2MjOydvCDqsr3roZwg67Cw7Je0ICjsnbTrr7gg7J6I7Jy866m0IOu5iCDrsLDsl7QpLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gYWN0aW9uR2VuZXJhdGVTc3JFbnRyeVNlcnZlcklmTm90RXhpc3RzKCk6IFByb21pc2U8QWJzb2x1dGVQYXRoW10+IHtcbiAgdHJ5IHtcbiAgICByZXR1cm4gYXdhaXQgZ2VuZXJhdGVUZW1wbGF0ZShcImVudHJ5X3NlcnZlclwiLCB7fSwgeyBvdmVyd3JpdGU6IGZhbHNlIH0pO1xuICB9IGNhdGNoIChlKSB7XG4gICAgLy8gZ2VuZXJhdGVUZW1wbGF0ZeydgCBvdmVyd3JpdGU6IGZhbHNl7JeQ7IScIO2MjOydvOydtCDsnbTrr7gg7J6I7Jy866m0IOyYiOyZuOulvCDrjZjsp5Hri4jri6QuXG4gICAgLy8gSWZOb3RFeGlzdHMg7J2Y66+47IOBIFwi6re464OlIOuGlOuRlOuLpFwi6rCAIOygleyDgeydtOuvgOuhnCDruYgg67Cw7Je066GcIOuzgO2ZmO2VqeuLiOuLpC5cbiAgICBpZiAoZSBpbnN0YW5jZW9mIEFscmVhZHlQcm9jZXNzZWRFeGNlcHRpb24pIHtcbiAgICAgIHJldHVybiBbXTtcbiAgICB9XG4gICAgdGhyb3cgZTtcbiAgfVxufVxuXG4vKipcbiAqIOyjvOyWtOynhCAudHMg7YyM7J2865OkKGFwaeyXkCDsnojri6Tqs6Ag6rCA7KCVKeydhCDrqqjrk6Ag7YOA6rKfIOuUlOugie2GoOumrOydmCBzZXJ2aWNlc+yXkCDqsJbri6Qg65Gh64uI64ukLlxuICog7J2065WMIOuCtOu2gOydmCBzb25hbXUgaW1wb3J064qUIHNvbmFtdS5zaGFyZWQudHMgaW1wb3J066GcIOy5mO2ZmOuQmOqzoCxcbiAqIOqyveuhnOydmCAvYXBwbGljYXRpb24v7J2AIC9zZXJ2aWNlcy/roZwg7LmY7ZmY65Cp64uI64ukLlxuICpcbiAqIEBwYXJhbSB0c1BhdGhzIOuzteyCrO2VoCDtjIzsnbzrk6TsnZgg7KCI64yAIOqyveuhnFxuICogQHJldHVybnMg6rCBIO2DgOqyn+yXkCDrs7XsgqzrkJwg7YyM7J2865Ok7J2YIOygiOuMgCDqsr3roZwg67Cw7Je0IChmbGF0KS5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGFjdGlvblN5bmNGaWxlc1RvVGFyZ2V0cyh0c1BhdGhzOiBBYnNvbHV0ZVBhdGhbXSk6IFByb21pc2U8c3RyaW5nW10+IHtcbiAgY29uc3QgeyB0YXJnZXRzIH0gPSBTb25hbXUuY29uZmlnLnN5bmM7XG4gIGNvbnN0IHsgZGlyOiBhcGlEaXIgfSA9IFNvbmFtdS5jb25maWcuYXBpO1xuXG4gIHJldHVybiAoXG4gICAgYXdhaXQgUHJvbWlzZS5hbGwoXG4gICAgICB0YXJnZXRzLm1hcChhc3luYyAodGFyZ2V0KSA9PlxuICAgICAgICBQcm9taXNlLmFsbChcbiAgICAgICAgICB0c1BhdGhzLm1hcChhc3luYyAocmVhbFNyYykgPT4ge1xuICAgICAgICAgICAgY29uc3QgZHN0ID0gcmVhbFNyY1xuICAgICAgICAgICAgICAucmVwbGFjZShgLyR7YXBpRGlyfS9gLCBgLyR7dGFyZ2V0fS9gKVxuICAgICAgICAgICAgICAucmVwbGFjZShcIi9hcHBsaWNhdGlvbi9cIiwgXCIvc2VydmljZXMvXCIpO1xuICAgICAgICAgICAgY29uc3QgZGlyID0gZGlybmFtZShkc3QpO1xuICAgICAgICAgICAgaWYgKCEoYXdhaXQgZXhpc3RzKGRpcikpKSB7XG4gICAgICAgICAgICAgIGF3YWl0IG1rZGlyKGRpciwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCBzeW5jSGVhZGVyID0gW1xuICAgICAgICAgICAgICBcIi8qKlwiLFxuICAgICAgICAgICAgICBcIiAqIEBnZW5lcmF0ZWRcIixcbiAgICAgICAgICAgICAgXCIgKiBBUEnsl5DshJwg64+Z6riw7ZmU65CcIO2MjOydvOyeheuLiOuLpC4g7KeB7KCRIOyImOygle2VmOyngCDrp4jshLjsmpQuXCIsXG4gICAgICAgICAgICAgIFwiICovXCIsXG4gICAgICAgICAgICBdLmpvaW4oXCJcXG5cIik7XG4gICAgICAgICAgICBhd2FpdCBjb3B5RmlsZVdpdGhSZXBsYWNlQ29yZVRvU2hhcmVkKHJlYWxTcmMsIGRzdCwgc3luY0hlYWRlcik7XG4gICAgICAgICAgICBhd2FpdCB0cmFja1dyaXR0ZW4oZHN0IGFzIEFic29sdXRlUGF0aCk7XG4gICAgICAgICAgICAhaXNUZXN0KCkgJiZcbiAgICAgICAgICAgICAgY29uc29sZS5sb2coXG4gICAgICAgICAgICAgICAgY2hhbGsuYm9sZChcIkNvcGllZDogXCIpICsgY2hhbGsuYmx1ZShkc3QucmVwbGFjZShgJHtTb25hbXUuYXBwUm9vdFBhdGh9L2AsIFwiXCIpKSxcbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIHJldHVybiBkc3Q7XG4gICAgICAgICAgfSksXG4gICAgICAgICksXG4gICAgICApLFxuICAgIClcbiAgKS5mbGF0KCk7XG59XG5cbi8qKlxuICogc2hhcmVkIO2FnO2UjOumv+ycvOuhnOu2gO2EsCBzb25hbXUuc2hhcmVkLnRzIO2MjOydvOydhCDrp4zrk6TslrTshJwg66qo65OgIO2DgOqynyDrlJTroInthqDrpqzsl5Ag6rCW64ukIOuRoeuLiOuLpC5cbiAqIO2MjOydvOydhCDrp4zrk5zripQg6rO87KCV7JeQ7IScIOyXrOufrCDsuZjtmZgg6rCA6rO17J20IOydvOyWtOuCqeuLiOuLpC5cbiAqXG4gKiDri6Trpbgg7JWh7IWY65Ok6rO8IOuLrOumrCwg7J2066+4IO2MjOydvOydtCDsnojsnLzrqbQg6re464OlIOuGlOuRoeuLiOuLpC4g6re4656Y7IScIO2VqOyImCDsnbTrpoQg64Gd7JeQIOyNqOuGqOyWtOyalCDjhY5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGFjdGlvbkNvcHlTaGFyZWRUb1RhcmdldHNJZk5vdEV4aXN0cygpOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgeyB0YXJnZXRzIH0gPSBTb25hbXUuY29uZmlnLnN5bmM7XG5cbiAgLy8gcGx1cmFsLnRzIOuCtOyaqeydhCDsnb3slrTshJwgc2hhcmVkIO2MjOydvOyXkCDsgr3snoXtlanri4jri6QuXG4gIGNvbnN0IGRpY3RVdGlsc1BhdGggPSBwYXRoLmpvaW4oXG4gICAgaW1wb3J0Lm1ldGEuZGlybmFtZS5yZXBsYWNlKFwiL2Rpc3QvXCIsIFwiL3NyYy9cIiksXG4gICAgXCIuLi9kaWN0L3V0aWxzLnRzXCIsXG4gICk7XG4gIGNvbnN0IGRpY3RVdGlsc0NvZGUgPSAoYXdhaXQgZXhpc3RzKGRpY3RVdGlsc1BhdGgpKSA/IGF3YWl0IHJlYWRGaWxlKGRpY3RVdGlsc1BhdGgsIFwidXRmLThcIikgOiBcIlwiO1xuXG4gIC8vIO2KueyglSDrs4DsiJgg7LmY7ZmY7J2EIOychO2VtOyEnCDsgqzsmqntlanri4jri6QuXG4gIGNvbnN0IGNvbnZlcnRNYXAgPSB7XG4gICAgYmFzZVVybDpcbiAgICAgIFNvbmFtdS5jb25maWcuc2VydmVyLmJhc2VVcmwgPz9cbiAgICAgIGBodHRwOi8vJHtTb25hbXUuY29uZmlnLnNlcnZlci5saXN0ZW4/Lmhvc3QgPz8gXCJsb2NhbGhvc3RcIn06JHtTb25hbXUuY29uZmlnLnNlcnZlci5saXN0ZW4/LnBvcnQgPz8gMzAwMH1gLFxuICAgIGRpY3RVdGlsczogZGljdFV0aWxzQ29kZSxcbiAgfTtcblxuICBmb3IgKGNvbnN0IHRhcmdldCBvZiB0YXJnZXRzKSB7XG4gICAgLy8g7KeA6riIIOqwgOyguOqwgOugpOuKlCDsnbQg7YyM7J287J2AIFNvbmFtdSDsvZTrk5zrsqDsnbTsiqTsnZgg7J2867aA7J6F64uI64ukLlxuICAgIC8vIOq3uOufsOuNsCBkaXN0IOyGjSDruYzrk5zrkJwg7IaM7IqkIOy9lOuTnCDtjIzsnbzsnbQg7ZWE7JqU7ZWcIOqyg+ydtCDslYTri4jqs6AsIHNyY+yXkOunjCDsnojripQg7YWN7Iqk7Yq4IO2MjOydvOydtCDtlYTsmpTtlanri4jri6QuXG4gICAgLy8g65Sw65287IScIC9zcmMv7JeQ7IScIOywvuyKteuLiOuLpC5cbiAgICBjb25zdCBzcmNQYXRoID0gcGF0aC5qb2luKFxuICAgICAgaW1wb3J0Lm1ldGEuZGlybmFtZS5yZXBsYWNlKFwiL2Rpc3QvXCIsIFwiL3NyYy9cIiksXG4gICAgICBgLi4vc2hhcmVkLyR7dGFyZ2V0fS5zaGFyZWQudHMudHh0YCxcbiAgICApO1xuICAgIGlmICghKGF3YWl0IGV4aXN0cyhzcmNQYXRoKSkpIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICBpZiAoIShhd2FpdCBleGlzdHMocGF0aC5qb2luKFNvbmFtdS5hcHBSb290UGF0aCwgdGFyZ2V0KSkpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGBUcmllZCB0byBjb3B5IHNvbmFtdS5zaGFyZWQudHMgdG8gdGFyZ2V0ICcke3RhcmdldH0nIGJ1dCB0aGUgdGFyZ2V0IGRpcmVjdG9yeSBkb2VzIG5vdCBleGlzdC4gUGxlYXNlIGNoZWNrIHlvdXIgcHJvamVjdCBkaXJlY3Rvcnkgc3RydWN0dXJlLmAsXG4gICAgICApO1xuICAgIH1cblxuICAgIGNvbnN0IGZ1bGxUZXh0ID0gYXdhaXQgcmVhZEZpbGUoc3JjUGF0aCwgXCJ1dGYtOFwiKTtcbiAgICBjb25zdCBjb252ZXJ0ZWRUZXh0ID0gT2JqZWN0LmVudHJpZXMoY29udmVydE1hcCkucmVkdWNlKFxuICAgICAgKGFjYywgW2tleSwgdmFsdWVdKSA9PiBhY2MucmVwbGFjZShgJFtbJHtrZXl9XV1gLCB2YWx1ZSksXG4gICAgICBmdWxsVGV4dCxcbiAgICApO1xuXG4gICAgLy8g7J206rG0IO2UhOuhnOygne2KuOyXkCAudHMg7IaM7IqkIOy9lOuTnCDtjIzsnbzsnYQg7IOd7ISx7ZWY64qUIOqyg+ydtOuvgOuhnCBzcmPsnZggLnRzIOqyveuhnOuhnCDqsJHri4jri6QuXG4gICAgY29uc3QgZGVzdFBhdGggPSBwYXRoLmpvaW4oU29uYW11LmFwcFJvb3RQYXRoLCB0YXJnZXQsIFwic3JjL3NlcnZpY2VzL3NvbmFtdS5zaGFyZWQudHNcIik7XG5cbiAgICAvLyDsoJXrp5Ag7Zi57Iuc64KY7KeA66eMIHRhcmdldCDrlJTroInthqDrpqzripQg7J6I7Ja064+EIHNyYy9zZXJ2aWNlcyDrlJTroInthqDrpqzripQg7JeG7J2EIOyImCDsnojsnLzrr4DroZwg66+466asIOyDneyEse2VtOykjeuLiOuLpC5cbiAgICBpZiAoIShhd2FpdCBleGlzdHMocGF0aC5kaXJuYW1lKGRlc3RQYXRoKSkpKSB7XG4gICAgICBhd2FpdCBta2RpcihwYXRoLmRpcm5hbWUoZGVzdFBhdGgpLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgICAgIGNvbnNvbGUud2FybihgQ3JlYXRlZCBkaXJlY3RvcnkgJyR7cGF0aC5kaXJuYW1lKGRlc3RQYXRoKX0nIGJlY2F1c2UgaXQgZGlkIG5vdCBleGlzdC5gKTtcbiAgICB9XG5cbiAgICAvLyDtjIzsnbzsnbQg7J2066+4IOyhtOyerO2VmOuptCDqsbTrhIjrnIHri4jri6QuXG4gICAgLy8gc29uYW11LnNoYXJlZC50c+uKlCDtlITroZzsoJ3tirjsl5DshJwg7J6Q7Jyg66Gt6rKMIOy7pOyKpO2EsOuniOydtOynle2VoCDsiJgg7J6I7Ja07JW8IO2VmOuvgOuhnCxcbiAgICAvLyDstZzstIggMe2ajOunjCDsg53shLHtlZjqs6Ag7J207ZuE7JeQ64qUIOuNruyWtOyTsOyngCDslYrsirXri4jri6QuXG4gICAgLy8g7YWc7ZSM66a/IOuCtOyaqSgkW1tkaWN0VXRpbHNdXSDrk7Ep7J20IOuzgOqyveuQmOyXiOydhCDrlYwg67CY7JiB7J20IO2VhOyalO2VmOuptCxcbiAgICAvLyDtlbTri7kg7YyM7J287J2EIOyCreygnO2VnCDrkqQgYHBucG0gc29uYW11IHN5bmNg66GcIOyerOyDneyEse2VmOuptCDrkKnri4jri6QuXG4gICAgaWYgKGF3YWl0IGV4aXN0cyhkZXN0UGF0aCkpIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIGF3YWl0IHdyaXRlRmlsZShkZXN0UGF0aCwgYXdhaXQgZm9ybWF0Q29kZShjb252ZXJ0ZWRUZXh0LCBkZXN0UGF0aCkpO1xuICAgICFpc1Rlc3QoKSAmJlxuICAgICAgY29uc29sZS5sb2coY2hhbGsuYm9sZChcIkNvcGllZDogXCIpICsgY2hhbGsuYmx1ZShwYXRoLnJlbGF0aXZlKFNvbmFtdS5hcHBSb290UGF0aCwgZGVzdFBhdGgpKSk7XG4gIH1cbn1cblxuLyoqXG4gKiBTb25hbXUgRGljdGlvbmFyeShTRCnrpbwg66qo65OgIO2DgOqynyhhcGkgKyB3ZWIvYXBwIOuTsSnsl5Ag64+Z6riw7ZmU7ZWp64uI64ukLlxuICpcbiAqIOqwgSDtg4Dqsp/sl5Ag64yA7ZW0OlxuICogLSB0YXJnZXTsnbQgYXBp6rCAIOyVhOuLiOuptCDsgqzsmqnsnpAg7J6R7ISxIGxvY2FsZSDtjIzsnbwoa28udHMvZW4udHMvLi4uKeydhCBhcGkg4oaSIHRhcmdldOycvOuhnCDrs7XsgqxcbiAqIC0gc2Qg7YWc7ZSM66a/7J2EIOugjOuNlOunge2VtOyEnCBzZC5nZW5lcmF0ZWQudHMg7IOd7ISxIChvdmVyd3JpdGUpXG4gKlxuICog7ZWcIO2DgOqyn+yXkOyEnCDsi6TtjKjtlbTrj4Qg64uk66W4IO2DgOqyn+ydgCDqs4Tsho0g7KeE7ZaJ7ZWp64uI64ukLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gYWN0aW9uU3luY1NvbmFtdURpY3Rpb25hcnkoKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IHsgdGFyZ2V0cyB9ID0gU29uYW11LmNvbmZpZy5zeW5jO1xuICBjb25zdCBpMThuQ29uZmlnID0gU29uYW11LmNvbmZpZy5pMThuO1xuXG4gIGNvbnN0IHRhcmdldExpc3QgPSBbXCJhcGlcIiwgLi4udGFyZ2V0c10gYXMgKFwiYXBpXCIgfCBcIndlYlwiIHwgXCJhcHBcIilbXTtcblxuICBjb25zdCBhcGlJMThuRGlyID0gcGF0aC5qb2luKFNvbmFtdS5hcHBSb290UGF0aCwgU29uYW11LmNvbmZpZy5hcGkuZGlyLCBcInNyYy9pMThuXCIpO1xuXG4gIGZvciAoY29uc3QgdGFyZ2V0IG9mIHRhcmdldExpc3QpIHtcbiAgICB0cnkge1xuICAgICAgLy8gd2ViL2FwcOydmCDqsr3smrAgbG9jYWxlIO2MjOydvOuTpOydhCBhcGnsl5DshJwg67O17IKsXG4gICAgICBpZiAodGFyZ2V0ICE9PSBcImFwaVwiKSB7XG4gICAgICAgIGF3YWl0IHN5bmNMb2NhbGVGaWxlcyh0YXJnZXQsIGFwaUkxOG5EaXIsIGkxOG5Db25maWcuc3VwcG9ydGVkTG9jYWxlcyk7XG4gICAgICB9XG5cbiAgICAgIGF3YWl0IGdlbmVyYXRlVGVtcGxhdGUoXCJzZFwiLCB7IHRhcmdldCB9LCB7IG92ZXJ3cml0ZTogdHJ1ZSB9KTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBjb25zb2xlLmVycm9yKGBGYWlsZWQgdG8gZ2VuZXJhdGUgU0QgdGVtcGxhdGUgZm9yICR7dGFyZ2V0fTpgLCBlKTtcbiAgICB9XG4gIH1cbn1cblxuLyoqXG4gKiBhcGnsnZggbG9jYWxlIO2MjOydvOydhCB3ZWIvYXBw7Jy866GcIOuzteyCrO2VqeuLiOuLpC5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gc3luY0xvY2FsZUZpbGVzKFxuICB0YXJnZXQ6IHN0cmluZyxcbiAgYXBpSTE4bkRpcjogc3RyaW5nLFxuICBsb2NhbGVzOiBzdHJpbmdbXSxcbik6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCB0YXJnZXRJMThuRGlyID0gcGF0aC5qb2luKFNvbmFtdS5hcHBSb290UGF0aCwgdGFyZ2V0LCBcInNyYy9pMThuXCIpO1xuXG4gIC8vIOuUlOugie2GoOumrOqwgCDsl4bsnLzrqbQg7IOd7ISxXG4gIGF3YWl0IG1rZGlyKHRhcmdldEkxOG5EaXIsIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuXG4gIGZvciAoY29uc3QgbG9jYWxlIG9mIGxvY2FsZXMpIHtcbiAgICBjb25zdCBzb3VyY2VGaWxlID0gcGF0aC5qb2luKGFwaUkxOG5EaXIsIGAke2xvY2FsZX0udHNgKTtcbiAgICBjb25zdCB0YXJnZXRGaWxlID0gcGF0aC5qb2luKHRhcmdldEkxOG5EaXIsIGAke2xvY2FsZX0udHNgKTtcblxuICAgIGNvbnN0IHN5bmNIZWFkZXIgPSBbXG4gICAgICBcIi8qKlwiLFxuICAgICAgXCIgKiBAZ2VuZXJhdGVkXCIsXG4gICAgICBcIiAqIEFQSeyXkOyEnCDrj5nquLDtmZTrkJwg7YyM7J287J6F64uI64ukLiDsp4HsoJEg7IiY7KCV7ZWY7KeAIOuniOyEuOyalC5cIixcbiAgICAgIFwiICovXCIsXG4gICAgXS5qb2luKFwiXFxuXCIpO1xuICAgIGF3YWl0IGNvcHlGaWxlV2l0aFJlcGxhY2VDb3JlVG9TaGFyZWQoc291cmNlRmlsZSwgdGFyZ2V0RmlsZSwgc3luY0hlYWRlcik7XG4gICAgYXdhaXQgdHJhY2tXcml0dGVuKHRhcmdldEZpbGUgYXMgQWJzb2x1dGVQYXRoKTtcbiAgICAhaXNUZXN0KCkgJiZcbiAgICAgIGNvbnNvbGUubG9nKGNoYWxrLmJvbGQoXCJDb3BpZWQ6IFwiKSArIGNoYWxrLmN5YW4oYCR7dGFyZ2V0fS9zcmMvaTE4bi8ke2xvY2FsZX0udHNgKSk7XG4gIH1cbn1cbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7QUFrQkEsZUFBc0IsbUJBQW1CO0NBQ3ZDLE1BQU0sRUFBRSxNQUFNLFNBQVMsT0FBTyxPQUFPLE9BQU8sVUFBVSxDQUFDO0NBQ3ZELE1BQU0sVUFBVSxZQUFZLFFBQVEsWUFBWSxhQUFhLFFBQVE7Q0FFckUsTUFBTSxFQUFFLG9CQUFvQixFQUFFLFFBQVEsQ0FBQztDQUN2QyxNQUFNLFFBQVEsSUFBSSxDQUNoQixHQUFHLE9BQU8sT0FBTyxLQUFLLFFBQVEsSUFBSSxPQUFPLFdBQVc7RUFDbEQsTUFBTSxVQUFVLEtBQUssS0FBSyxPQUFPLGFBQWEsUUFBUSxhQUFhLEdBQUcsT0FBTztDQUMvRSxDQUFDLEdBQ0QsaUJBQWlCLGlCQUFpQixDQUFDLEdBQUcsRUFBRSxXQUFXLEtBQUssQ0FBQyxDQUMzRCxDQUFDO0FBQ0g7Ozs7OztBQU9BLGVBQXNCLHVCQUNwQixhQUd5QjtDQUN6QixNQUFNLEVBQUUsMEJBQTBCLFdBQVc7Q0FXN0MsT0FBTyxDQUFDLEdBQUcsTUFSZ0Is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