sonamu 0.9.20 → 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 (279) 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 +6 -6
  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/testing-devrunner.md +1 -1
  271. package/src/stream/ws-telemetry-memory.ts +2 -2
  272. package/src/testing/fixture-generator.ts +2 -1
  273. package/src/testing/fixture-manager.ts +3 -4
  274. package/src/testing/global-setup.ts +42 -18
  275. package/src/testing/vitest-helpers.ts +14 -0
  276. package/src/utils/controller.ts +14 -7
  277. package/tsdown.api.config.ts +6 -0
  278. package/dist/_virtual/rolldown_runtime.js +0 -39
  279. package/dist/ui-web/assets/index-D4rYm-Xz.css +0 -1
@@ -1,10 +1,9 @@
1
- import { __esmMin } from "../_virtual/rolldown_runtime.js";
1
+ import { __esmMin } from "../_virtual/_rolldown/runtime.js";
2
2
  import { convertNaiteKeyToCategory, init_category } from "../logger/category.js";
3
3
  import { Sonamu, init_sonamu } from "../api/sonamu.js";
4
4
  import { init_object_utils, isSerializable } from "../utils/object-utils.js";
5
5
  import { getLogger } from "@logtape/logtape";
6
6
  import { get } from "radashi";
7
-
8
7
  //#region src/naite/naite.ts
9
8
  /**
10
9
  * 콜스택을 파싱하여 StackFrame 배열로 반환
@@ -13,10 +12,9 @@ import { get } from "radashi";
13
12
  * - node: 내부 경로는 포함하되, lineNumber는 path에 : 포함 시 붙이지 않음
14
13
  */
15
14
  function extractCallStack() {
16
- const stack = new Error().stack;
15
+ const stack = (/* @__PURE__ */ new Error()).stack;
17
16
  if (!stack) return [];
18
- const lines = stack.split("\n");
19
- const frames = lines.slice(3).map(parseStackFrame).filter((frame) => frame !== null);
17
+ const frames = stack.split("\n").slice(3).map(parseStackFrame).filter((frame) => frame !== null);
20
18
  const contextIndex = frames.findIndex((f) => f.functionName?.includes("runWithContext") || f.functionName?.includes("runWithMockContext"));
21
19
  return contextIndex >= 0 ? frames.slice(0, contextIndex + 1) : frames;
22
20
  }
@@ -31,13 +29,11 @@ function parseStackFrame(line) {
31
29
  const functionName = matchWithFunc[1];
32
30
  const filePath = matchWithFunc[2];
33
31
  const lineNumberStr = matchWithFunc[3];
34
- if (filePath.includes(":")) {
35
- return {
36
- functionName,
37
- filePath,
38
- lineNumber: 0
39
- };
40
- }
32
+ if (filePath.includes(":")) return {
33
+ functionName,
34
+ filePath,
35
+ lineNumber: 0
36
+ };
41
37
  return {
42
38
  functionName,
43
39
  filePath,
@@ -66,13 +62,8 @@ function parseStackFrame(line) {
66
62
  function matchesPattern(key, pattern) {
67
63
  const keyParts = key.split(":");
68
64
  const patternParts = pattern.split(":");
69
- if (patternParts[patternParts.length - 1] === "*") {
70
- const prefixParts = patternParts.slice(0, -1);
71
- return prefixParts.every((part, i) => part === keyParts[i]);
72
- }
73
- if (patternParts.length !== keyParts.length) {
74
- return false;
75
- }
65
+ if (patternParts[patternParts.length - 1] === "*") return patternParts.slice(0, -1).every((part, i) => part === keyParts[i]);
66
+ if (patternParts.length !== keyParts.length) return false;
76
67
  return patternParts.every((part, i) => part === "*" || part === keyParts[i]);
77
68
  }
78
69
  var NaiteQuery, NaiteClass, Naite;
@@ -81,6 +72,7 @@ var init_naite = __esmMin((() => {
81
72
  init_category();
82
73
  init_object_utils();
83
74
  NaiteQuery = class NaiteQuery {
75
+ traces;
84
76
  constructor(traces) {
85
77
  this.traces = traces;
86
78
  }
@@ -92,8 +84,7 @@ var init_naite = __esmMin((() => {
92
84
  * @param fileName 파일명 (예: "syncer.test.ts")
93
85
  */
94
86
  fromFile(fileName) {
95
- const filtered = this.traces.filter((t) => t.stack.some((frame) => frame.filePath.endsWith(`/${fileName}`)));
96
- return new NaiteQuery(filtered);
87
+ return new NaiteQuery(this.traces.filter((t) => t.stack.some((frame) => frame.filePath.endsWith(`/${fileName}`))));
97
88
  }
98
89
  /**
99
90
  * 함수명으로 필터링
@@ -101,16 +92,11 @@ var init_naite = __esmMin((() => {
101
92
  * @param options.from 'direct' = 직접 호출만, 'indirect' = 간접 호출만, 'both' = 모두
102
93
  */
103
94
  fromFunction(funcName, options = { from: "both" }) {
104
- const filtered = this.traces.filter((t) => {
105
- if (options.from === "direct") {
106
- return t.stack[0]?.functionName?.includes(funcName);
107
- }
108
- if (options.from === "indirect") {
109
- return t.stack.slice(1).some((f) => f.functionName?.includes(funcName));
110
- }
95
+ return new NaiteQuery(this.traces.filter((t) => {
96
+ if (options.from === "direct") return t.stack[0]?.functionName?.includes(funcName);
97
+ if (options.from === "indirect") return t.stack.slice(1).some((f) => f.functionName?.includes(funcName));
111
98
  return t.stack.some((f) => f.functionName?.includes(funcName));
112
- });
113
- return new NaiteQuery(filtered);
99
+ }));
114
100
  }
115
101
  /**
116
102
  * 데이터 경로 기반 필터링
@@ -119,7 +105,7 @@ var init_naite = __esmMin((() => {
119
105
  * @param value 비교값
120
106
  */
121
107
  where(path, operator, value) {
122
- const filtered = this.traces.filter((trace) => {
108
+ return new NaiteQuery(this.traces.filter((trace) => {
123
109
  const actual = get(trace, path);
124
110
  switch (operator) {
125
111
  case ">": return this.isComparableValue(actual) && this.isComparableValue(value) && actual > value;
@@ -131,8 +117,7 @@ var init_naite = __esmMin((() => {
131
117
  case "includes": return typeof actual === "string" && actual.includes(value);
132
118
  default: return false;
133
119
  }
134
- });
135
- return new NaiteQuery(filtered);
120
+ }));
136
121
  }
137
122
  /**
138
123
  * 전체 데이터 배열 반환
@@ -167,21 +152,15 @@ var init_naite = __esmMin((() => {
167
152
  };
168
153
  NaiteClass = class {
169
154
  t(name, value) {
170
- if (process.env.NODE_ENV !== "test") {
171
- return;
172
- }
155
+ if (process.env.NODE_ENV !== "test") return;
173
156
  try {
174
- const context = Sonamu.getContext();
175
- const store = context?.naiteStore;
176
- if (!store) {
177
- return;
178
- }
179
- const stack = extractCallStack();
157
+ const store = Sonamu.getContext()?.naiteStore;
158
+ if (!store) return;
180
159
  const trace = {
181
160
  key: name,
182
161
  data: value,
183
- stack,
184
- at: new Date()
162
+ stack: extractCallStack(),
163
+ at: /* @__PURE__ */ new Date()
185
164
  };
186
165
  const existing = store.get(name) ?? [];
187
166
  getLogger(["naite", ...convertNaiteKeyToCategory(name)]).debug(`naite: {name} ${existing.length === 0 ? "is empty state" : `already existing with ${existing.length} entries`}, appending new entry`, {
@@ -196,36 +175,22 @@ var init_naite = __esmMin((() => {
196
175
  * 항상 NaiteQuery 반환하여 체이닝 가능
197
176
  */
198
177
  get(keyPattern) {
199
- const context = Sonamu.getContext();
200
- const store = context?.naiteStore;
201
- if (!store) {
202
- return new NaiteQuery([]);
203
- }
178
+ const store = Sonamu.getContext()?.naiteStore;
179
+ if (!store) return new NaiteQuery([]);
204
180
  if (!keyPattern.includes("*")) {
205
181
  const traces = store.get(keyPattern) ?? [];
206
182
  return new NaiteQuery(traces);
207
183
  }
208
184
  const allTraces = [];
209
- for (const [key, traces] of store.entries()) {
210
- if (matchesPattern(key, keyPattern)) {
211
- allTraces.push(...traces);
212
- }
213
- }
185
+ for (const [key, traces] of store.entries()) if (matchesPattern(key, keyPattern)) allTraces.push(...traces);
214
186
  return new NaiteQuery(allTraces);
215
187
  }
216
188
  getAll() {
217
189
  const context = Sonamu.getContext();
218
- if (!context?.naiteStore) {
219
- return {};
220
- }
190
+ if (!context?.naiteStore) return {};
221
191
  const result = {};
222
- for (const [key, traces] of context.naiteStore.entries()) {
223
- if (key.startsWith("mock:")) {
224
- result[key] = traces;
225
- } else {
226
- result[key] = traces.map((t) => t.data);
227
- }
228
- }
192
+ for (const [key, traces] of context.naiteStore.entries()) if (key.startsWith("mock:")) result[key] = traces;
193
+ else result[key] = traces.map((t) => t.data);
229
194
  return result;
230
195
  }
231
196
  /**
@@ -236,15 +201,19 @@ var init_naite = __esmMin((() => {
236
201
  */
237
202
  getAllTraces() {
238
203
  const context = Sonamu.getContext();
239
- if (!context?.naiteStore) {
240
- return [];
241
- }
204
+ if (!context?.naiteStore) return [];
242
205
  const traces = Array.from(context.naiteStore.values()).flat();
243
206
  for (const trace of traces) {
244
207
  const check = isSerializable(trace.data);
245
- if (!check.valid) {
246
- console.warn("\n" + "╔════════════════════════════════════════════════════════════════╗\n" + "║ [Naite] Non-serializable value detected! ║\n" + "╠════════════════════════════════════════════════════════════════╣\n" + `║ Key: ${trace.key.padEnd(57)}║\n` + `║ Reason: ${(check.reason ?? "unknown").slice(0, 54).padEnd(54)}║\n` + `║ Location: ${(trace.stack[0]?.filePath ?? "unknown").slice(-51).padEnd(52)}║\n` + `║ Line: ${String(trace.stack[0]?.lineNumber ?? 0).padEnd(56)}║\n` + "╠════════════════════════════════════════════════════════════════╣\n" + "║ Naite.t() accepts any type of value. However, values will ║\n" + "║ be serialized to JSON when exported via Naite.getAllTraces(). ║\n" + "╚════════════════════════════════════════════════════════════════╝\n");
247
- }
208
+ if (!check.valid) console.warn(`
209
+ ╔════════════════════════════════════════════════════════════════╗
210
+ ║ [Naite] Non-serializable value detected! ║
211
+ ╠════════════════════════════════════════════════════════════════╣
212
+ ║ Key: ${trace.key.padEnd(57)}║\n║ Reason: ${(check.reason ?? "unknown").slice(0, 54).padEnd(54)}║\n║ Location: ${(trace.stack[0]?.filePath ?? "unknown").slice(-51).padEnd(52)}║\n║ Line: ${String(trace.stack[0]?.lineNumber ?? 0).padEnd(56)}║\n╠════════════════════════════════════════════════════════════════╣
213
+ ║ Naite.t() accepts any type of value. However, values will ║
214
+ ║ be serialized to JSON when exported via Naite.getAllTraces(). ║
215
+ ╚════════════════════════════════════════════════════════════════╝
216
+ `);
248
217
  }
249
218
  return traces.map((trace) => ({
250
219
  key: trace.key,
@@ -256,19 +225,17 @@ var init_naite = __esmMin((() => {
256
225
  }
257
226
  del(key) {
258
227
  const context = Sonamu.getContext();
259
- if (!context?.naiteStore) {
260
- return;
261
- }
228
+ if (!context?.naiteStore) return;
262
229
  context.naiteStore.delete(key);
263
230
  }
264
231
  createStore() {
265
- return new Map();
232
+ return /* @__PURE__ */ new Map();
266
233
  }
267
234
  };
268
235
  Naite = new NaiteClass();
269
236
  }));
270
-
271
237
  //#endregion
272
238
  init_naite();
273
239
  export { Naite, NaiteClass, NaiteQuery, init_naite };
274
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmFpdGUuanMiLCJuYW1lcyI6WyJ0cmFjZXM6IE5haXRlVHJhY2VbXSIsInRyYWNlOiBOYWl0ZVRyYWNlIiwiYWxsVHJhY2VzOiBOYWl0ZVRyYWNlW10iLCJyZXN1bHQ6IHsgW2tleTogc3RyaW5nXTogYW55IH0iXSwic291cmNlcyI6WyIuLi8uLi9zcmMvbmFpdGUvbmFpdGUudHMiXSwic291cmNlc0NvbnRlbnQiOlsiLyogb3hsaW50LWRpc2FibGUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueSAqLyAvLyBOYWl0ZeuKlCBleHBlY3TsmYAg7Zi47J2R7ZWY64+E66GdIGFueeulvCDtl4jsmqntlahcblxuaW1wb3J0IHsgZ2V0TG9nZ2VyIH0gZnJvbSBcIkBsb2d0YXBlL2xvZ3RhcGVcIjtcbmltcG9ydCB7IGdldCB9IGZyb20gXCJyYWRhc2hpXCI7XG5cbmltcG9ydCB7IFNvbmFtdSB9IGZyb20gXCIuLi9hcGkvc29uYW11XCI7XG5pbXBvcnQgeyB0eXBlIENvbXBhcmlzb25PcGVyYXRvciB9IGZyb20gXCIuLi9kYXRhYmFzZS9wdXJpLnR5cGVzXCI7XG5pbXBvcnQgeyBjb252ZXJ0TmFpdGVLZXlUb0NhdGVnb3J5IH0gZnJvbSBcIi4uL2xvZ2dlci9jYXRlZ29yeVwiO1xuaW1wb3J0IHsgaXNTZXJpYWxpemFibGUgfSBmcm9tIFwiLi4vdXRpbHMvb2JqZWN0LXV0aWxzXCI7XG5cbi8vIFN0YWNrRnJhbWUg7YOA7J6FXG5pbnRlcmZhY2UgU3RhY2tGcmFtZSB7XG4gIGZ1bmN0aW9uTmFtZTogc3RyaW5nIHwgbnVsbDtcbiAgZmlsZVBhdGg6IHN0cmluZzsgLy8gXCIvVXNlcnMvLi4uL3N5bmNlci50c1wiIOuYkOuKlCBcIm5vZGU6aW50ZXJuYWwvLi4uXCJcbiAgbGluZU51bWJlcjogbnVtYmVyOyAvLyBUUyDtjIzsnbwg6riw7KSAIOudvOyduCDrsojtmLhcbn1cblxuLy8gTmFpdGVUcmFjZSDtg4DsnoVcbmludGVyZmFjZSBOYWl0ZVRyYWNlIHtcbiAga2V5OiBzdHJpbmc7XG4gIGRhdGE6IGFueTtcbiAgc3RhY2s6IFN0YWNrRnJhbWVbXTsgLy8g7L2c7Iqk7YOdIOygleuztFxuICBhdDogRGF0ZTtcbn1cblxuLy8gTmFpdGUudOqwgCDsoIDsnqXrkJjripQg7YOA7J6FICjtla3sg4Eg67Cw7Je066GcIO2GteydvClcbmV4cG9ydCB0eXBlIE5haXRlU3RvcmUgPSBNYXA8c3RyaW5nLCBOYWl0ZVRyYWNlW10+O1xuXG4vLyBnZXRBbGxUcmFjZXMoKeqwgCDrsJjtmZjtlZjripQg7KeB66Cs7ZmU65CcIHRyYWNlIO2DgOyehVxuLy8gYm9vdHN0cmFwLnRz7J2YIFRhc2tNZXRhIGF1Z21lbnRhdGlvbiwgZGV2LXZpdGVzdC1tYW5hZ2VyLnRz7JeQ7ISc64+EIOydtCDtg4DsnoXsnYQg6rO17Jyg7ZWp64uI64ukLlxuZXhwb3J0IHR5cGUgU2VyaWFsaXplZFRyYWNlID0ge1xuICBrZXk6IHN0cmluZztcbiAgdmFsdWU6IGFueTtcbiAgZmlsZVBhdGg6IHN0cmluZztcbiAgbGluZU51bWJlcjogbnVtYmVyO1xuICBhdDogc3RyaW5nO1xufTtcblxuLyoqXG4gKiDsvZzsiqTtg53snYQg7YyM7Iux7ZWY7JesIFN0YWNrRnJhbWUg67Cw7Je066GcIOuwmO2ZmFxuICogLSBleHRyYWN0Q2FsbFN0YWNrIOyekOyLoOqzvCBOYWl0ZS5064qUIOygnOyZuFxuICogLSBydW5XaXRoQ29udGV4dC9ydW5XaXRoTW9ja0NvbnRleHQg67Cc6rKsIOyLnCDqsbDquLDshJwg7KKF66OMXG4gKiAtIG5vZGU6IOuCtOu2gCDqsr3roZzripQg7Y+s7ZWo7ZWY65CYLCBsaW5lTnVtYmVy64qUIHBhdGjsl5AgOiDtj6ztlagg7IucIOu2meydtOyngCDslYrsnYxcbiAqL1xuZnVuY3Rpb24gZXh0cmFjdENhbGxTdGFjaygpOiBTdGFja0ZyYW1lW10ge1xuICBjb25zdCBzdGFjayA9IG5ldyBFcnJvcigpLnN0YWNrO1xuICBpZiAoIXN0YWNrKSByZXR1cm4gW107XG5cbiAgY29uc3QgbGluZXMgPSBzdGFjay5zcGxpdChcIlxcblwiKTtcblxuICAvLyDsvZzsiqTtg50g6rWs7KGwOlxuICAvLyBbMF06IFwiRXJyb3JcIlxuICAvLyBbMV06IFwiYXQgZXh0cmFjdENhbGxTdGFja1wiXG4gIC8vIFsyXTogXCJhdCBOYWl0ZS50XCJcbiAgLy8gWzNdOiDsi6TsoJwg7Zi47LacIOychOy5mOu2gO2EsCDsi5zsnpFcbiAgY29uc3QgZnJhbWVzID0gbGluZXNcbiAgICAuc2xpY2UoMylcbiAgICAubWFwKHBhcnNlU3RhY2tGcmFtZSlcbiAgICAuZmlsdGVyKChmcmFtZSk6IGZyYW1lIGlzIFN0YWNrRnJhbWUgPT4gZnJhbWUgIT09IG51bGwpO1xuXG4gIC8vIHJ1bldpdGhDb250ZXh0IOqzhOyXtCDtlajsiJgg67Cc6rKsIOyLnCDqsbDquLDshJwg7J6Q66W06riwXG4gIGNvbnN0IGNvbnRleHRJbmRleCA9IGZyYW1lcy5maW5kSW5kZXgoXG4gICAgKGYpID0+XG4gICAgICBmLmZ1bmN0aW9uTmFtZT8uaW5jbHVkZXMoXCJydW5XaXRoQ29udGV4dFwiKSB8fCBmLmZ1bmN0aW9uTmFtZT8uaW5jbHVkZXMoXCJydW5XaXRoTW9ja0NvbnRleHRcIiksXG4gICk7XG5cbiAgcmV0dXJuIGNvbnRleHRJbmRleCA+PSAwID8gZnJhbWVzLnNsaWNlKDAsIGNvbnRleHRJbmRleCArIDEpIDogZnJhbWVzO1xufVxuXG4vKipcbiAqIOy9nOyKpO2DnSDtlZwg7KSE7J2EIO2MjOyLsVxuICog7ZiV7IudMTogXCJhdCBGdW5jdGlvbk5hbWUgKGZpbGVQYXRoOmxpbmVOdW1iZXI6Y29sdW1uTnVtYmVyKVwiXG4gKiDtmJXsi50yOiBcImF0IGZpbGVQYXRoOmxpbmVOdW1iZXI6Y29sdW1uTnVtYmVyXCIgKOydteuqhSDtlajsiJgv66qo65OIIOugiOuyqClcbiAqL1xuZnVuY3Rpb24gcGFyc2VTdGFja0ZyYW1lKGxpbmU6IHN0cmluZyk6IFN0YWNrRnJhbWUgfCBudWxsIHtcbiAgLy8g7Yyo7YS0MTogXCJhdCBGdW5jdGlvbk5hbWUgKGZpbGVQYXRoOmxpbmVOdW1iZXI6Y29sdW1uTnVtYmVyKVwiXG4gIGNvbnN0IG1hdGNoV2l0aEZ1bmMgPSBsaW5lLm1hdGNoKC9hdFxccysoLis/KVxccytcXCgoLis/KTooXFxkKyk6XFxkK1xcKS8pO1xuICBpZiAobWF0Y2hXaXRoRnVuYykge1xuICAgIGNvbnN0IGZ1bmN0aW9uTmFtZSA9IG1hdGNoV2l0aEZ1bmNbMV07XG4gICAgY29uc3QgZmlsZVBhdGggPSBtYXRjaFdpdGhGdW5jWzJdO1xuICAgIGNvbnN0IGxpbmVOdW1iZXJTdHIgPSBtYXRjaFdpdGhGdW5jWzNdO1xuXG4gICAgLy8gZmlsZVBhdGjsl5Ag7J2066+4IDrqsIAg7Y+s7ZWo65CY7Ja0IOyeiOycvOuptCAo7JiIOiBcIm5vZGU6aW50ZXJuYWwvLi4uXCIpXG4gICAgaWYgKGZpbGVQYXRoLmluY2x1ZGVzKFwiOlwiKSkge1xuICAgICAgcmV0dXJuIHsgZnVuY3Rpb25OYW1lLCBmaWxlUGF0aCwgbGluZU51bWJlcjogMCB9O1xuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICBmdW5jdGlvbk5hbWUsXG4gICAgICBmaWxlUGF0aCxcbiAgICAgIGxpbmVOdW1iZXI6IE51bWJlci5wYXJzZUludChsaW5lTnVtYmVyU3RyLCAxMCksXG4gICAgfTtcbiAgfVxuXG4gIC8vIO2MqO2EtDI6IFwiYXQgZmlsZVBhdGg6bGluZU51bWJlcjpjb2x1bW5OdW1iZXJcIiAo7ZWo7IiY66qFIOyXhuydjClcbiAgY29uc3QgbWF0Y2hOb0Z1bmMgPSBsaW5lLm1hdGNoKC9hdFxccysoLis/KTooXFxkKyk6XFxkKyQvKTtcbiAgaWYgKG1hdGNoTm9GdW5jKSB7XG4gICAgY29uc3QgZmlsZVBhdGggPSBtYXRjaE5vRnVuY1sxXTtcbiAgICBjb25zdCBsaW5lTnVtYmVyU3RyID0gbWF0Y2hOb0Z1bmNbMl07XG5cbiAgICByZXR1cm4ge1xuICAgICAgZnVuY3Rpb25OYW1lOiBudWxsLFxuICAgICAgZmlsZVBhdGgsXG4gICAgICBsaW5lTnVtYmVyOiBOdW1iZXIucGFyc2VJbnQobGluZU51bWJlclN0ciwgMTApLFxuICAgIH07XG4gIH1cblxuICByZXR1cm4gbnVsbDtcbn1cblxuLyoqXG4gKiB3aWxkY2FyZCDtjKjthLQg66ek7LmtXG4gKiDsmIjsi5w6XG4gKiAtIFwic3luY2VyOipcIiDihpIgXCJzeW5jZXI6YVwiLCBcInN5bmNlcjphOmJcIiDrqqjrkZAg66ek7LmtXG4gKiAtIFwic3luY2VyOio6dXNlclwiIOKGkiBcInN5bmNlcjpyZW5kZXJUZW1wbGF0ZTp1c2VyXCIg66ek7LmtXG4gKiAtIFwic3luY2VyOnJlbmRlclRlbXBsYXRlOipcIiDihpIgXCJzeW5jZXI6cmVuZGVyVGVtcGxhdGU6c2VydmljZVwiIOunpOy5rVxuICovXG5mdW5jdGlvbiBtYXRjaGVzUGF0dGVybihrZXk6IHN0cmluZywgcGF0dGVybjogc3RyaW5nKTogYm9vbGVhbiB7XG4gIGNvbnN0IGtleVBhcnRzID0ga2V5LnNwbGl0KFwiOlwiKTtcbiAgY29uc3QgcGF0dGVyblBhcnRzID0gcGF0dGVybi5zcGxpdChcIjpcIik7XG5cbiAgLy8g66eI7KeA66eJ7J20ICog4oaSIHByZWZpeCDrp6Tsua0gKOq4uOydtCDrrLTqtIApXG4gIC8vIOyYiDogXCJzeW5jZXI6Klwi64qUIFwic3luY2VyOmFcIiwgXCJzeW5jZXI6YTpiXCIg66qo65GQIOunpOy5rVxuICBpZiAocGF0dGVyblBhcnRzW3BhdHRlcm5QYXJ0cy5sZW5ndGggLSAxXSA9PT0gXCIqXCIpIHtcbiAgICBjb25zdCBwcmVmaXhQYXJ0cyA9IHBhdHRlcm5QYXJ0cy5zbGljZSgwLCAtMSk7XG4gICAgLy8gcHJlZml46rCAIOuqqOuRkCDsnbzsuZjtlZjripTsp4Ag7ZmV7J24XG4gICAgcmV0dXJuIHByZWZpeFBhcnRzLmV2ZXJ5KChwYXJ0LCBpKSA9PiBwYXJ0ID09PSBrZXlQYXJ0c1tpXSk7XG4gIH1cblxuICAvLyDquLjsnbTqsIAg6rCZ7JWE7JW8IO2VqFxuICBpZiAocGF0dGVyblBhcnRzLmxlbmd0aCAhPT0ga2V5UGFydHMubGVuZ3RoKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgLy8g6rCBIO2MjO2KuOqwgCAqIOuYkOuKlCDsoJXtmZXtnogg7J287LmYXG4gIHJldHVybiBwYXR0ZXJuUGFydHMuZXZlcnkoKHBhcnQsIGkpID0+IHBhcnQgPT09IFwiKlwiIHx8IHBhcnQgPT09IGtleVBhcnRzW2ldKTtcbn1cblxuLyoqXG4gKiBOYWl0ZVF1ZXJ5IO2BtOuemOyKpFxuICog7LK07J2064ud7J2EIO2Gte2VnCB0cmFjZSDtlYTthLDrp4Eg67CPIOyhsO2ajFxuICovXG5leHBvcnQgY2xhc3MgTmFpdGVRdWVyeSB7XG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgdHJhY2VzOiBOYWl0ZVRyYWNlW10pIHt9XG5cbiAgcHJpdmF0ZSBpc0NvbXBhcmFibGVWYWx1ZSh2YWx1ZTogdW5rbm93bik6IHZhbHVlIGlzIG51bWJlciB8IHN0cmluZyB7XG4gICAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PT0gXCJudW1iZXJcIiB8fCB0eXBlb2YgdmFsdWUgPT09IFwic3RyaW5nXCI7XG4gIH1cblxuICAvKipcbiAgICog7YyM7J2866qF7Jy866GcIO2VhO2EsOungVxuICAgKiBAcGFyYW0gZmlsZU5hbWUg7YyM7J2866qFICjsmIg6IFwic3luY2VyLnRlc3QudHNcIilcbiAgICovXG4gIGZyb21GaWxlKGZpbGVOYW1lOiBzdHJpbmcpOiBOYWl0ZVF1ZXJ5IHtcbiAgICBjb25zdCBmaWx0ZXJlZCA9IHRoaXMudHJhY2VzLmZpbHRlcigodCkgPT5cbiAgICAgIHQuc3RhY2suc29tZSgoZnJhbWUpID0+IGZyYW1lLmZpbGVQYXRoLmVuZHNXaXRoKGAvJHtmaWxlTmFtZX1gKSksXG4gICAgKTtcbiAgICByZXR1cm4gbmV3IE5haXRlUXVlcnkoZmlsdGVyZWQpO1xuICB9XG5cbiAgLyoqXG4gICAqIO2VqOyImOuqheycvOuhnCDtlYTthLDrp4FcbiAgICogQHBhcmFtIGZ1bmNOYW1lIO2VqOyImOuqhSAoaW5jbHVkZXMg7LK07YGsKVxuICAgKiBAcGFyYW0gb3B0aW9ucy5mcm9tICdkaXJlY3QnID0g7KeB7KCRIO2YuOy2nOunjCwgJ2luZGlyZWN0JyA9IOqwhOygkSDtmLjstpzrp4wsICdib3RoJyA9IOuqqOuRkFxuICAgKi9cbiAgZnJvbUZ1bmN0aW9uKFxuICAgIGZ1bmNOYW1lOiBzdHJpbmcsXG4gICAgb3B0aW9uczogeyBmcm9tOiBcImRpcmVjdFwiIHwgXCJpbmRpcmVjdFwiIHwgXCJib3RoXCIgfSA9IHsgZnJvbTogXCJib3RoXCIgfSxcbiAgKTogTmFpdGVRdWVyeSB7XG4gICAgY29uc3QgZmlsdGVyZWQgPSB0aGlzLnRyYWNlcy5maWx0ZXIoKHQpID0+IHtcbiAgICAgIGlmIChvcHRpb25zLmZyb20gPT09IFwiZGlyZWN0XCIpIHtcbiAgICAgICAgLy8gc3RhY2tbMF3rp4wg7ZmV7J24ICjsp4HsoJEg7Zi47LacKVxuICAgICAgICByZXR1cm4gdC5zdGFja1swXT8uZnVuY3Rpb25OYW1lPy5pbmNsdWRlcyhmdW5jTmFtZSk7XG4gICAgICB9XG4gICAgICBpZiAob3B0aW9ucy5mcm9tID09PSBcImluZGlyZWN0XCIpIHtcbiAgICAgICAgLy8gc3RhY2tbMStd7JeQ7IScIO2ZleyduCAo6rCE7KCRIO2YuOy2nClcbiAgICAgICAgcmV0dXJuIHQuc3RhY2suc2xpY2UoMSkuc29tZSgoZikgPT4gZi5mdW5jdGlvbk5hbWU/LmluY2x1ZGVzKGZ1bmNOYW1lKSk7XG4gICAgICB9XG4gICAgICAvLyDsoITssrQg7Iqk7YOd7JeQ7IScIO2ZleyduFxuICAgICAgcmV0dXJuIHQuc3RhY2suc29tZSgoZikgPT4gZi5mdW5jdGlvbk5hbWU/LmluY2x1ZGVzKGZ1bmNOYW1lKSk7XG4gICAgfSk7XG4gICAgcmV0dXJuIG5ldyBOYWl0ZVF1ZXJ5KGZpbHRlcmVkKTtcbiAgfVxuXG4gIC8qKlxuICAgKiDrjbDsnbTthLAg6rK966GcIOq4sOuwmCDtlYTthLDrp4FcbiAgICogQHBhcmFtIHBhdGggcmFkYXNoIGdldCDqsr3roZwgKOyYiDogXCJkYXRhLnVzZXJJZFwiKVxuICAgKiBAcGFyYW0gb3BlcmF0b3Ig67mE6rWQIOyXsOyCsOyekFxuICAgKiBAcGFyYW0gdmFsdWUg67mE6rWQ6rCSXG4gICAqL1xuICB3aGVyZShwYXRoOiBzdHJpbmcsIG9wZXJhdG9yOiBDb21wYXJpc29uT3BlcmF0b3IgfCBcImluY2x1ZGVzXCIsIHZhbHVlOiBhbnkpOiBOYWl0ZVF1ZXJ5IHtcbiAgICBjb25zdCBmaWx0ZXJlZCA9IHRoaXMudHJhY2VzLmZpbHRlcigodHJhY2UpID0+IHtcbiAgICAgIGNvbnN0IGFjdHVhbCA9IGdldCh0cmFjZSwgcGF0aCk7XG5cbiAgICAgIHN3aXRjaCAob3BlcmF0b3IpIHtcbiAgICAgICAgY2FzZSBcIj5cIjpcbiAgICAgICAgICByZXR1cm4gdGhpcy5pc0NvbXBhcmFibGVWYWx1ZShhY3R1YWwpICYmIHRoaXMuaXNDb21wYXJhYmxlVmFsdWUodmFsdWUpICYmIGFjdHVhbCA+IHZhbHVlO1xuICAgICAgICBjYXNlIFwiPFwiOlxuICAgICAgICAgIHJldHVybiB0aGlzLmlzQ29tcGFyYWJsZVZhbHVlKGFjdHVhbCkgJiYgdGhpcy5pc0NvbXBhcmFibGVWYWx1ZSh2YWx1ZSkgJiYgYWN0dWFsIDwgdmFsdWU7XG4gICAgICAgIGNhc2UgXCI+PVwiOlxuICAgICAgICAgIHJldHVybiB0aGlzLmlzQ29tcGFyYWJsZVZhbHVlKGFjdHVhbCkgJiYgdGhpcy5pc0NvbXBhcmFibGVWYWx1ZSh2YWx1ZSkgJiYgYWN0dWFsID49IHZhbHVlO1xuICAgICAgICBjYXNlIFwiPD1cIjpcbiAgICAgICAgICByZXR1cm4gdGhpcy5pc0NvbXBhcmFibGVWYWx1ZShhY3R1YWwpICYmIHRoaXMuaXNDb21wYXJhYmxlVmFsdWUodmFsdWUpICYmIGFjdHVhbCA8PSB2YWx1ZTtcbiAgICAgICAgY2FzZSBcIj1cIjpcbiAgICAgICAgICByZXR1cm4gYWN0dWFsID09PSB2YWx1ZTtcbiAgICAgICAgY2FzZSBcIiE9XCI6XG4gICAgICAgICAgcmV0dXJuIGFjdHVhbCAhPT0gdmFsdWU7XG4gICAgICAgIGNhc2UgXCJpbmNsdWRlc1wiOlxuICAgICAgICAgIHJldHVybiB0eXBlb2YgYWN0dWFsID09PSBcInN0cmluZ1wiICYmIGFjdHVhbC5pbmNsdWRlcyh2YWx1ZSk7XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgIH0pO1xuICAgIHJldHVybiBuZXcgTmFpdGVRdWVyeShmaWx0ZXJlZCk7XG4gIH1cblxuICAvKipcbiAgICog7KCE7LK0IOuNsOydtO2EsCDrsLDsl7Qg67CY7ZmYXG4gICAqL1xuICByZXN1bHQoKTogYW55W10ge1xuICAgIHJldHVybiB0aGlzLnRyYWNlcy5tYXAoKHQpID0+IHQuZGF0YSk7XG4gIH1cblxuICAvKipcbiAgICog7LKrIOuyiOynuCDrjbDsnbTthLAg67CY7ZmYXG4gICAqL1xuICBmaXJzdCgpOiBhbnkgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLnRyYWNlc1swXT8uZGF0YTtcbiAgfVxuXG4gIC8qKlxuICAgKiDrp4jsp4Drp4kg642w7J207YSwIOuwmO2ZmFxuICAgKi9cbiAgbGFzdCgpOiBhbnkgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLnRyYWNlc1t0aGlzLnRyYWNlcy5sZW5ndGggLSAxXT8uZGF0YTtcbiAgfVxuXG4gIC8qKlxuICAgKiBu67KI7Ke4IOuNsOydtO2EsCDrsJjtmZhcbiAgICovXG4gIGF0KGluZGV4OiBudW1iZXIpOiBhbnkgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLnRyYWNlc1tpbmRleF0/LmRhdGE7XG4gIH1cblxuICAvKipcbiAgICog7JuQ67O4IHRyYWNlIOuwsOyXtCDrsJjtmZggKOuUlOuyhOq5hS9OYWl0ZVZpZXdlcuyaqSlcbiAgICovXG4gIGdldFRyYWNlcygpOiBOYWl0ZVRyYWNlW10ge1xuICAgIHJldHVybiB0aGlzLnRyYWNlcztcbiAgfVxufVxuXG4vLyBOYWl0ZSDsi7HquIDthLQg6rCd7LK0ICjstpTtm4QgbG9nZ2VyIOyXsOqysCDrk7HsnZgg7IOB7YOcIOq0gOumrCDtlYTsmpTshLEg6rOg66CkKVxuZXhwb3J0IGNsYXNzIE5haXRlQ2xhc3Mge1xuICAvLyDthYzsiqTtirgg66Gc6re4IOq4sOuhnVxuICB0KFxuICAgIG5hbWU6IHN0cmluZyxcbiAgICB2YWx1ZTogYW55IC8q7J2066CH6rKMIOuwm+ydgCDqsJLsnbQgTmFpdGVUcmFjZeuhnCDsoIDsnqXrkJjslrQg7J6I64uk6rCAIOy2lO2bhOyXkCB2aXRlc3Tsl5DqsowgbWV0YeulvCDthrXtlbQg64SY6rKo7KC4IO2UhOuhnOyEuOyKpOqwhCDthrXsi6DsnYQg7Ya17ZW0IOyngeugrO2ZlOuQmOyWtOyVvCDtlZjripQg7KCQ7J2EIOqzoOugpO2VmOyYgOydhCDrlYwg7Jes6riw7JeQIFNlcmlhbGl6YWJsZeydhCDsjajshJwg7KCc7ZWc7J2EIOuRmCDsiJjrj4Qg7J6I7KeA66eMLCDsgqzsmqnsg4HsnZgg7Y647J2Y66W8IOyDneqwge2VmOyXrCBhbnnroZwg67Cb7Iq164uI64ukLiovLFxuICApIHtcbiAgICAvLyDsnbQgdCDtlajsiJjripQg7YWM7Iqk7Yq4IO2ZmOqyveyXkOyEnOunjCDsnpHrj5ntlbTslbwg7ZWp64uI64ukLlxuICAgIC8vIOq3uOumrOqzoCDthYzsiqTtirgg7ZmY6rK9IO2MkOuLqOyXkCDsmZwgaXNUZXN0KCkg7ZWo7IiY66W8IOyCrOyaqe2VmOyngCDslYrslZjrg5DrqbTsmpQsLFxuICAgIC8vIOydtOugh+qyjCDtlZjripTqsowg7Jyg7Yu4IO2VqOyImCDrtojrn6zsmYDshJwg7IKs7Jqp7ZWY64qUIOqyg+uztOuLpCDsobDquIjsnbTrgpjrp4gg67mg66W8IOqygyDqsJnslZjquLAg65WM66y47J6F64uI64ukLlxuICAgIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJ0ZXN0XCIpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0cnkge1xuICAgICAgY29uc3QgY29udGV4dCA9IFNvbmFtdS5nZXRDb250ZXh0KCk7XG4gICAgICBjb25zdCBzdG9yZSA9IGNvbnRleHQ/Lm5haXRlU3RvcmU7XG5cbiAgICAgIGlmICghc3RvcmUpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICAvLyDsvZzsiqTtg50g7IiY7KeRXG4gICAgICBjb25zdCBzdGFjayA9IGV4dHJhY3RDYWxsU3RhY2soKTtcblxuICAgICAgY29uc3QgdHJhY2U6IE5haXRlVHJhY2UgPSB7XG4gICAgICAgIGtleTogbmFtZSxcbiAgICAgICAgZGF0YTogdmFsdWUsXG4gICAgICAgIHN0YWNrLFxuICAgICAgICBhdDogbmV3IERhdGUoKSxcbiAgICAgIH07XG5cbiAgICAgIC8vIO2VreyDgSDrsLDsl7TroZwg6rSA66asXG4gICAgICBjb25zdCBleGlzdGluZyA9IHN0b3JlLmdldChuYW1lKSA/PyBbXTtcbiAgICAgIGdldExvZ2dlcihbXCJuYWl0ZVwiLCAuLi5jb252ZXJ0TmFpdGVLZXlUb0NhdGVnb3J5KG5hbWUpXSkuZGVidWcoXG4gICAgICAgIGBuYWl0ZToge25hbWV9ICR7ZXhpc3RpbmcubGVuZ3RoID09PSAwID8gXCJpcyBlbXB0eSBzdGF0ZVwiIDogYGFscmVhZHkgZXhpc3Rpbmcgd2l0aCAke2V4aXN0aW5nLmxlbmd0aH0gZW50cmllc2B9LCBhcHBlbmRpbmcgbmV3IGVudHJ5YCxcbiAgICAgICAge1xuICAgICAgICAgIG5hbWUsXG4gICAgICAgICAgdmFsdWUsXG4gICAgICAgIH0sXG4gICAgICApO1xuXG4gICAgICBzdG9yZS5zZXQobmFtZSwgWy4uLmV4aXN0aW5nLCB0cmFjZV0pO1xuICAgIH0gY2F0Y2gge1xuICAgICAgLy8gQ29udGV4dCDsl4bripQg7IOB7Zmp7JeQ7IScIE5haXRlLnQg7Zi47LacXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIGtleSDrmJDripQgd2lsZGNhcmQg7Yyo7YS07Jy866GcIHRyYWNlIOyhsO2ajFxuICAgKiDtla3sg4EgTmFpdGVRdWVyeSDrsJjtmZjtlZjsl6wg7LK07J2064udIOqwgOuKpVxuICAgKi9cbiAgZ2V0KGtleVBhdHRlcm46IHN0cmluZyk6IE5haXRlUXVlcnkge1xuICAgIGNvbnN0IGNvbnRleHQgPSBTb25hbXUuZ2V0Q29udGV4dCgpO1xuICAgIGNvbnN0IHN0b3JlID0gY29udGV4dD8ubmFpdGVTdG9yZTtcblxuICAgIGlmICghc3RvcmUpIHtcbiAgICAgIHJldHVybiBuZXcgTmFpdGVRdWVyeShbXSk7XG4gICAgfVxuXG4gICAgLy8gd2lsZGNhcmQg7JeG7Jy866m0IGV4YWN0IG1hdGNoXG4gICAgaWYgKCFrZXlQYXR0ZXJuLmluY2x1ZGVzKFwiKlwiKSkge1xuICAgICAgY29uc3QgdHJhY2VzID0gc3RvcmUuZ2V0KGtleVBhdHRlcm4pID8/IFtdO1xuICAgICAgcmV0dXJuIG5ldyBOYWl0ZVF1ZXJ5KHRyYWNlcyk7XG4gICAgfVxuXG4gICAgLy8gd2lsZGNhcmQg7Yyo7YS0IOunpOy5rVxuICAgIGNvbnN0IGFsbFRyYWNlczogTmFpdGVUcmFjZVtdID0gW107XG4gICAgZm9yIChjb25zdCBba2V5LCB0cmFjZXNdIG9mIHN0b3JlLmVudHJpZXMoKSkge1xuICAgICAgaWYgKG1hdGNoZXNQYXR0ZXJuKGtleSwga2V5UGF0dGVybikpIHtcbiAgICAgICAgYWxsVHJhY2VzLnB1c2goLi4udHJhY2VzKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gbmV3IE5haXRlUXVlcnkoYWxsVHJhY2VzKTtcbiAgfVxuXG4gIC8vIOyghOyytCDrpqzsiqTtirgg6rCA7KC47Jik6riwXG4gIGdldEFsbCgpOiB7IFtrZXk6IHN0cmluZ106IGFueSB9IHtcbiAgICBjb25zdCBjb250ZXh0ID0gU29uYW11LmdldENvbnRleHQoKTtcbiAgICBpZiAoIWNvbnRleHQ/Lm5haXRlU3RvcmUpIHtcbiAgICAgIHJldHVybiB7fTtcbiAgICB9XG4gICAgLy8gTmFpdGVUcmFjZSDrsLDsl7TsnYQgZGF0YeunjCDstpTstpztlZjsl6wg67CY7ZmYXG4gICAgY29uc3QgcmVzdWx0OiB7IFtrZXk6IHN0cmluZ106IGFueSB9ID0ge307XG4gICAgZm9yIChjb25zdCBba2V5LCB0cmFjZXNdIG9mIGNvbnRleHQubmFpdGVTdG9yZS5lbnRyaWVzKCkpIHtcbiAgICAgIGlmIChrZXkuc3RhcnRzV2l0aChcIm1vY2s6XCIpKSB7XG4gICAgICAgIC8vIE1vY2sg7ISk7KCV7J2AIOq3uOuMgOuhnCDrsJjtmZhcbiAgICAgICAgcmVzdWx0W2tleV0gPSB0cmFjZXM7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBOYWl0ZVRyYWNlIOuwsOyXtOydgCBkYXRh66eMIOy2lOy2nFxuICAgICAgICByZXN1bHRba2V5XSA9IHRyYWNlcy5tYXAoKHQ6IE5haXRlVHJhY2UpID0+IHQuZGF0YSk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICAvKipcbiAgICog7Iqk7Yag7Ja07JeQIOuTpOyWtOyeiOuNmCDtirjroIjsnbTsiqTrpbwg6rOg64yA66GcIOq6vOuCtOyYteuLiOuLpC5cbiAgICog7J2065WMIOqwkuuTpOydgCDrqqjrkZAg7KeB66Cs7ZmUIOqwgOuKpe2VnCDsg4Htg5zroZwg64KY6rCA6rKMIOuQqeuLiOuLpC5cbiAgICog7YWM7Iqk7Yq4IOygleuztOyZgCDtlajqu5ggZXh0ZW5zaW9uc+yXkCDrs7Trgrwg7Jqp64+E66GcIOunjOuTpOyXiOyKteuLiOuLpC5cbiAgICogQHJldHVybnNcbiAgICovXG4gIGdldEFsbFRyYWNlcygpOiBTZXJpYWxpemVkVHJhY2VbXSB7XG4gICAgY29uc3QgY29udGV4dCA9IFNvbmFtdS5nZXRDb250ZXh0KCk7XG4gICAgaWYgKCFjb250ZXh0Py5uYWl0ZVN0b3JlKSB7XG4gICAgICByZXR1cm4gW107XG4gICAgfVxuXG4gICAgY29uc3QgdHJhY2VzID0gQXJyYXkuZnJvbShjb250ZXh0Lm5haXRlU3RvcmUudmFsdWVzKCkpLmZsYXQoKTtcblxuICAgIC8vIOyngeugrO2ZlCDrtojqsIDriqXtlZwg6rCS7J20IOyhtOyerO2VnOuLpOuptCDsnbTrpbwg64yA66y47Ked66eM7ZWY6rKMIOyVjOugpOykjeuLiOuLpCEg6re47LmY66eMIOyVjOumrOq4sOunjCDtlZjqs6Ag6re464OlIOyngOuCmOqwkeuLiOuLpCDjhY7jhY5cbiAgICAvLyDsmZwg7KeB66Cs7ZmU6rCAIOykkeyalO2VnOqwgD8g7J20KGdldEFsbFRyYWNlcykg7Zi47Lac7J2YIOqysOqzvOuKlCDsmbjrtoDroZwg64KY6rCA6rKMIOuQmOuKlOuNsCxcbiAgICAvLyDsnbTrlYwg7KO8IOyaqeuPhOqwgCB2aXRlc3TsnZggdGFzay5tZXRhIO2VhOuTnOulvCDthrXtlbQgYWZ0ZXJFYWNo7JeQ7IScIFNvbmFtdSBleHRlbnNpb27snLzroZwg7KCE64us7ZWY64qUIOqyg+yeheuLiOuLpC5cbiAgICAvLyDsl6zquLDshJwgbWV0YSDtlYTrk5zsl5Ag64u06ri0IOuCtOyaqeydgCDtlITroZzshLjsiqTqsIQg7Ya17IugKHByb2Nlc3Muc2VuZCkg65iQ64qUIOyKpOugiOuTnOqwhCDthrXsi6AobWVzc2FnZSBwb3J0KeydhCDthrXtlbQg7KCE64us65CY7Ja07JW8IO2VmOuKlOuNsCxcbiAgICAvLyDsnbTroZwg7J247ZW0IFwi7KeB66Cs7ZmUIOqwgOuKpe2VnCDqsJLrk6Trp4wg7ZeI7JqpXCLtlZjripQg7KCc7JW97J20IOyDneq5geuLiOuLpC5cbiAgICAvL1xuICAgIC8vIOydtCDsoJzslb3snYQg7J2Y7Iud7ZWY7JesIE5haXRlLnTsl5Ag7KeB66Cs7ZmUIOqwgOuKpe2VnCDqsJLrp4wg64SY6riw6rKMIO2VoCDsiJjrj4Qg7J6I7JeI7KeA66eMLCDqt7jroIfqsowg7ZWY66m0IOu2iO2OuO2VtOyniCDqsoMg6rCZ7JWE7IScIO2VmOyngCDslYrslZjsirXri4jri6QuXG4gICAgLy8g65Sw65287IScIO2YhOyerCBOYWl0ZS5064qUIOuqqOuToCDqsJLsnYQg67Cb7J2EIOyImCDsnojqsowg65CY7Ja0IOyeiOyKteuLiOuLpC5cbiAgICAvLyDrjIDsi6Ag7J2066CH6rKMKGdldEFsbFRyYWNlcykg6re4IOqwkuuTpOydhCDrubzrgrwg65WMIEpTT04uc3RyaW5naWZ566W8IOyCrOyaqe2VmOyXrCDqsJXsoJzroZwg7KeB66Cs7ZmUIOqwgOuKpe2VmOqyjCDrp4zrk6Tsl4jsirXri4jri6QsLFxuICAgIGZvciAoY29uc3QgdHJhY2Ugb2YgdHJhY2VzKSB7XG4gICAgICBjb25zdCBjaGVjayA9IGlzU2VyaWFsaXphYmxlKHRyYWNlLmRhdGEpO1xuICAgICAgaWYgKCFjaGVjay52YWxpZCkge1xuICAgICAgICBjb25zb2xlLndhcm4oXG4gICAgICAgICAgXCJcXG5cIiArXG4gICAgICAgICAgICBcIuKVlOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVl1xcblwiICtcbiAgICAgICAgICAgIFwi4pWRICBbTmFpdGVdIE5vbi1zZXJpYWxpemFibGUgdmFsdWUgZGV0ZWN0ZWQhICAgICAgICAgICAgICAgICAgICAgIOKVkVxcblwiICtcbiAgICAgICAgICAgIFwi4pWg4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWjXFxuXCIgK1xuICAgICAgICAgICAgYOKVkSAgS2V5OiAke3RyYWNlLmtleS5wYWRFbmQoNTcpfeKVkVxcbmAgK1xuICAgICAgICAgICAgYOKVkSAgUmVhc29uOiAkeyhjaGVjay5yZWFzb24gPz8gXCJ1bmtub3duXCIpLnNsaWNlKDAsIDU0KS5wYWRFbmQoNTQpfeKVkVxcbmAgK1xuICAgICAgICAgICAgYOKVkSAgTG9jYXRpb246ICR7KHRyYWNlLnN0YWNrWzBdPy5maWxlUGF0aCA/PyBcInVua25vd25cIikuc2xpY2UoLTUxKS5wYWRFbmQoNTIpfeKVkVxcbmAgK1xuICAgICAgICAgICAgYOKVkSAgTGluZTogJHtTdHJpbmcodHJhY2Uuc3RhY2tbMF0/LmxpbmVOdW1iZXIgPz8gMCkucGFkRW5kKDU2KX3ilZFcXG5gICtcbiAgICAgICAgICAgIFwi4pWg4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWjXFxuXCIgK1xuICAgICAgICAgICAgXCLilZEgIE5haXRlLnQoKSBhY2NlcHRzIGFueSB0eXBlIG9mIHZhbHVlLiBIb3dldmVyLCB2YWx1ZXMgd2lsbCAgICAg4pWRXFxuXCIgK1xuICAgICAgICAgICAgXCLilZEgIGJlIHNlcmlhbGl6ZWQgdG8gSlNPTiB3aGVuIGV4cG9ydGVkIHZpYSBOYWl0ZS5nZXRBbGxUcmFjZXMoKS4g4pWRXFxuXCIgK1xuICAgICAgICAgICAgXCLilZrilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZ1cXG5cIixcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gdHJhY2VzLm1hcCgodHJhY2UpID0+ICh7XG4gICAgICBrZXk6IHRyYWNlLmtleSxcbiAgICAgIHZhbHVlOiBKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KHRyYWNlLmRhdGEgPz8gXCJcIikpLCAvLyDsp4HroKztmZQg6rCA64ql7ZWcIOqyg+unjCDrgqjquLDroKTripQg64iI66y86rKo7Jq0IOuFuOugpSwsIOyViOq3uOufrOuptCB0YXNrLm1ldGHsl5Ag65Ok7Ja06rCA7IScIO2UhOuhnOyEuOyKpOqwhCDthrXsi6Ag7ZWgIOuVjCDrrLjsoJwg7IOd6riw6rGw65Og7JqULCxcbiAgICAgIGZpbGVQYXRoOiB0cmFjZS5zdGFja1swXT8uZmlsZVBhdGggPz8gXCJcIixcbiAgICAgIGxpbmVOdW1iZXI6IHRyYWNlLnN0YWNrWzBdPy5saW5lTnVtYmVyID8/IDAsXG4gICAgICBhdDogdHJhY2UuYXQudG9JU09TdHJpbmcoKSxcbiAgICB9KSk7XG4gIH1cblxuICAvLyDtirnsoJUg7YKkIOyCreygnO2VmOq4sFxuICBkZWwoa2V5OiBzdHJpbmcpIHtcbiAgICBjb25zdCBjb250ZXh0ID0gU29uYW11LmdldENvbnRleHQoKTtcbiAgICBpZiAoIWNvbnRleHQ/Lm5haXRlU3RvcmUpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29udGV4dC5uYWl0ZVN0b3JlLmRlbGV0ZShrZXkpO1xuICB9XG5cbiAgY3JlYXRlU3RvcmUoKTogTmFpdGVTdG9yZSB7XG4gICAgcmV0dXJuIG5ldyBNYXA8c3RyaW5nLCBOYWl0ZVRyYWNlW10+KCk7XG4gIH1cbn1cblxuZXhwb3J0IGNvbnN0IE5haXRlID0gbmV3IE5haXRlQ2xhc3MoKTtcbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7QUE0Q0EsU0FBUyxtQkFBaUM7Q0FDeEMsTUFBTSxRQUFRLElBQUksT0FBTyxDQUFDO0FBQzFC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
240
+
241
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmFpdGUuanMiLCJuYW1lcyI6W10sInNvdXJjZXMiOlsiLi4vLi4vc3JjL25haXRlL25haXRlLnRzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qIG94bGludC1kaXNhYmxlIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnkgKi8gLy8gTmFpdGXripQgZXhwZWN07JmAIO2YuOydke2VmOuPhOuhnSBhbnnrpbwg7ZeI7Jqp7ZWoXG5cbmltcG9ydCB7IGdldExvZ2dlciB9IGZyb20gXCJAbG9ndGFwZS9sb2d0YXBlXCI7XG5pbXBvcnQgeyBnZXQgfSBmcm9tIFwicmFkYXNoaVwiO1xuXG5pbXBvcnQgeyBTb25hbXUgfSBmcm9tIFwiLi4vYXBpL3NvbmFtdVwiO1xuaW1wb3J0IHsgdHlwZSBDb21wYXJpc29uT3BlcmF0b3IgfSBmcm9tIFwiLi4vZGF0YWJhc2UvcHVyaS50eXBlc1wiO1xuaW1wb3J0IHsgY29udmVydE5haXRlS2V5VG9DYXRlZ29yeSB9IGZyb20gXCIuLi9sb2dnZXIvY2F0ZWdvcnlcIjtcbmltcG9ydCB7IGlzU2VyaWFsaXphYmxlIH0gZnJvbSBcIi4uL3V0aWxzL29iamVjdC11dGlsc1wiO1xuXG4vLyBTdGFja0ZyYW1lIO2DgOyehVxuaW50ZXJmYWNlIFN0YWNrRnJhbWUge1xuICBmdW5jdGlvbk5hbWU6IHN0cmluZyB8IG51bGw7XG4gIGZpbGVQYXRoOiBzdHJpbmc7IC8vIFwiL1VzZXJzLy4uLi9zeW5jZXIudHNcIiDrmJDripQgXCJub2RlOmludGVybmFsLy4uLlwiXG4gIGxpbmVOdW1iZXI6IG51bWJlcjsgLy8gVFMg7YyM7J28IOq4sOykgCDrnbzsnbgg67KI7Zi4XG59XG5cbi8vIE5haXRlVHJhY2Ug7YOA7J6FXG5pbnRlcmZhY2UgTmFpdGVUcmFjZSB7XG4gIGtleTogc3RyaW5nO1xuICBkYXRhOiBhbnk7XG4gIHN0YWNrOiBTdGFja0ZyYW1lW107IC8vIOy9nOyKpO2DnSDsoJXrs7RcbiAgYXQ6IERhdGU7XG59XG5cbi8vIE5haXRlLnTqsIAg7KCA7J6l65CY64qUIO2DgOyehSAo7ZWt7IOBIOuwsOyXtOuhnCDthrXsnbwpXG5leHBvcnQgdHlwZSBOYWl0ZVN0b3JlID0gTWFwPHN0cmluZywgTmFpdGVUcmFjZVtdPjtcblxuLy8gZ2V0QWxsVHJhY2VzKCnqsIAg67CY7ZmY7ZWY64qUIOyngeugrO2ZlOuQnCB0cmFjZSDtg4DsnoVcbi8vIGJvb3RzdHJhcC50c+ydmCBUYXNrTWV0YSBhdWdtZW50YXRpb24sIGRldi12aXRlc3QtbWFuYWdlci50c+yXkOyEnOuPhCDsnbQg7YOA7J6F7J2EIOqzteycoO2VqeuLiOuLpC5cbmV4cG9ydCB0eXBlIFNlcmlhbGl6ZWRUcmFjZSA9IHtcbiAga2V5OiBzdHJpbmc7XG4gIHZhbHVlOiBhbnk7XG4gIGZpbGVQYXRoOiBzdHJpbmc7XG4gIGxpbmVOdW1iZXI6IG51bWJlcjtcbiAgYXQ6IHN0cmluZztcbn07XG5cbi8qKlxuICog7L2c7Iqk7YOd7J2EIO2MjOyLse2VmOyXrCBTdGFja0ZyYW1lIOuwsOyXtOuhnCDrsJjtmZhcbiAqIC0gZXh0cmFjdENhbGxTdGFjayDsnpDsi6Dqs7wgTmFpdGUudOuKlCDsoJzsmbhcbiAqIC0gcnVuV2l0aENvbnRleHQvcnVuV2l0aE1vY2tDb250ZXh0IOuwnOqyrCDsi5wg6rGw6riw7IScIOyiheujjFxuICogLSBub2RlOiDrgrTrtoAg6rK966Gc64qUIO2PrO2VqO2VmOuQmCwgbGluZU51bWJlcuuKlCBwYXRo7JeQIDog7Y+s7ZWoIOyLnCDrtpnsnbTsp4Ag7JWK7J2MXG4gKi9cbmZ1bmN0aW9uIGV4dHJhY3RDYWxsU3RhY2soKTogU3RhY2tGcmFtZVtdIHtcbiAgY29uc3Qgc3RhY2sgPSBuZXcgRXJyb3IoKS5zdGFjaztcbiAgaWYgKCFzdGFjaykgcmV0dXJuIFtdO1xuXG4gIGNvbnN0IGxpbmVzID0gc3RhY2suc3BsaXQoXCJcXG5cIik7XG5cbiAgLy8g7L2c7Iqk7YOdIOq1rOyhsDpcbiAgLy8gWzBdOiBcIkVycm9yXCJcbiAgLy8gWzFdOiBcImF0IGV4dHJhY3RDYWxsU3RhY2tcIlxuICAvLyBbMl06IFwiYXQgTmFpdGUudFwiXG4gIC8vIFszXTog7Iuk7KCcIO2YuOy2nCDsnITsuZjrtoDthLAg7Iuc7J6RXG4gIGNvbnN0IGZyYW1lcyA9IGxpbmVzXG4gICAgLnNsaWNlKDMpXG4gICAgLm1hcChwYXJzZVN0YWNrRnJhbWUpXG4gICAgLmZpbHRlcigoZnJhbWUpOiBmcmFtZSBpcyBTdGFja0ZyYW1lID0+IGZyYW1lICE9PSBudWxsKTtcblxuICAvLyBydW5XaXRoQ29udGV4dCDqs4Tsl7Qg7ZWo7IiYIOuwnOqyrCDsi5wg6rGw6riw7IScIOyekOultOq4sFxuICBjb25zdCBjb250ZXh0SW5kZXggPSBmcmFtZXMuZmluZEluZGV4KFxuICAgIChmKSA9PlxuICAgICAgZi5mdW5jdGlvbk5hbWU/LmluY2x1ZGVzKFwicnVuV2l0aENvbnRleHRcIikgfHwgZi5mdW5jdGlvbk5hbWU/LmluY2x1ZGVzKFwicnVuV2l0aE1vY2tDb250ZXh0XCIpLFxuICApO1xuXG4gIHJldHVybiBjb250ZXh0SW5kZXggPj0gMCA/IGZyYW1lcy5zbGljZSgwLCBjb250ZXh0SW5kZXggKyAxKSA6IGZyYW1lcztcbn1cblxuLyoqXG4gKiDsvZzsiqTtg50g7ZWcIOykhOydhCDtjIzsi7FcbiAqIO2YleyLnTE6IFwiYXQgRnVuY3Rpb25OYW1lIChmaWxlUGF0aDpsaW5lTnVtYmVyOmNvbHVtbk51bWJlcilcIlxuICog7ZiV7IudMjogXCJhdCBmaWxlUGF0aDpsaW5lTnVtYmVyOmNvbHVtbk51bWJlclwiICjsnbXrqoUg7ZWo7IiYL+uqqOuTiCDroIjrsqgpXG4gKi9cbmZ1bmN0aW9uIHBhcnNlU3RhY2tGcmFtZShsaW5lOiBzdHJpbmcpOiBTdGFja0ZyYW1lIHwgbnVsbCB7XG4gIC8vIO2MqO2EtDE6IFwiYXQgRnVuY3Rpb25OYW1lIChmaWxlUGF0aDpsaW5lTnVtYmVyOmNvbHVtbk51bWJlcilcIlxuICBjb25zdCBtYXRjaFdpdGhGdW5jID0gbGluZS5tYXRjaCgvYXRcXHMrKC4rPylcXHMrXFwoKC4rPyk6KFxcZCspOlxcZCtcXCkvKTtcbiAgaWYgKG1hdGNoV2l0aEZ1bmMpIHtcbiAgICBjb25zdCBmdW5jdGlvbk5hbWUgPSBtYXRjaFdpdGhGdW5jWzFdO1xuICAgIGNvbnN0IGZpbGVQYXRoID0gbWF0Y2hXaXRoRnVuY1syXTtcbiAgICBjb25zdCBsaW5lTnVtYmVyU3RyID0gbWF0Y2hXaXRoRnVuY1szXTtcblxuICAgIC8vIGZpbGVQYXRo7JeQIOydtOuvuCA66rCAIO2PrO2VqOuQmOyWtCDsnojsnLzrqbQgKOyYiDogXCJub2RlOmludGVybmFsLy4uLlwiKVxuICAgIGlmIChmaWxlUGF0aC5pbmNsdWRlcyhcIjpcIikpIHtcbiAgICAgIHJldHVybiB7IGZ1bmN0aW9uTmFtZSwgZmlsZVBhdGgsIGxpbmVOdW1iZXI6IDAgfTtcbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgZnVuY3Rpb25OYW1lLFxuICAgICAgZmlsZVBhdGgsXG4gICAgICBsaW5lTnVtYmVyOiBOdW1iZXIucGFyc2VJbnQobGluZU51bWJlclN0ciwgMTApLFxuICAgIH07XG4gIH1cblxuICAvLyDtjKjthLQyOiBcImF0IGZpbGVQYXRoOmxpbmVOdW1iZXI6Y29sdW1uTnVtYmVyXCIgKO2VqOyImOuqhSDsl4bsnYwpXG4gIGNvbnN0IG1hdGNoTm9GdW5jID0gbGluZS5tYXRjaCgvYXRcXHMrKC4rPyk6KFxcZCspOlxcZCskLyk7XG4gIGlmIChtYXRjaE5vRnVuYykge1xuICAgIGNvbnN0IGZpbGVQYXRoID0gbWF0Y2hOb0Z1bmNbMV07XG4gICAgY29uc3QgbGluZU51bWJlclN0ciA9IG1hdGNoTm9GdW5jWzJdO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIGZ1bmN0aW9uTmFtZTogbnVsbCxcbiAgICAgIGZpbGVQYXRoLFxuICAgICAgbGluZU51bWJlcjogTnVtYmVyLnBhcnNlSW50KGxpbmVOdW1iZXJTdHIsIDEwKSxcbiAgICB9O1xuICB9XG5cbiAgcmV0dXJuIG51bGw7XG59XG5cbi8qKlxuICogd2lsZGNhcmQg7Yyo7YS0IOunpOy5rVxuICog7JiI7IucOlxuICogLSBcInN5bmNlcjoqXCIg4oaSIFwic3luY2VyOmFcIiwgXCJzeW5jZXI6YTpiXCIg66qo65GQIOunpOy5rVxuICogLSBcInN5bmNlcjoqOnVzZXJcIiDihpIgXCJzeW5jZXI6cmVuZGVyVGVtcGxhdGU6dXNlclwiIOunpOy5rVxuICogLSBcInN5bmNlcjpyZW5kZXJUZW1wbGF0ZToqXCIg4oaSIFwic3luY2VyOnJlbmRlclRlbXBsYXRlOnNlcnZpY2VcIiDrp6Tsua1cbiAqL1xuZnVuY3Rpb24gbWF0Y2hlc1BhdHRlcm4oa2V5OiBzdHJpbmcsIHBhdHRlcm46IHN0cmluZyk6IGJvb2xlYW4ge1xuICBjb25zdCBrZXlQYXJ0cyA9IGtleS5zcGxpdChcIjpcIik7XG4gIGNvbnN0IHBhdHRlcm5QYXJ0cyA9IHBhdHRlcm4uc3BsaXQoXCI6XCIpO1xuXG4gIC8vIOuniOyngOunieydtCAqIOKGkiBwcmVmaXgg66ek7LmtICjquLjsnbQg66y06rSAKVxuICAvLyDsmIg6IFwic3luY2VyOipcIuuKlCBcInN5bmNlcjphXCIsIFwic3luY2VyOmE6YlwiIOuqqOuRkCDrp6Tsua1cbiAgaWYgKHBhdHRlcm5QYXJ0c1twYXR0ZXJuUGFydHMubGVuZ3RoIC0gMV0gPT09IFwiKlwiKSB7XG4gICAgY29uc3QgcHJlZml4UGFydHMgPSBwYXR0ZXJuUGFydHMuc2xpY2UoMCwgLTEpO1xuICAgIC8vIHByZWZpeOqwgCDrqqjrkZAg7J287LmY7ZWY64qU7KeAIO2ZleyduFxuICAgIHJldHVybiBwcmVmaXhQYXJ0cy5ldmVyeSgocGFydCwgaSkgPT4gcGFydCA9PT0ga2V5UGFydHNbaV0pO1xuICB9XG5cbiAgLy8g6ri47J206rCAIOqwmeyVhOyVvCDtlahcbiAgaWYgKHBhdHRlcm5QYXJ0cy5sZW5ndGggIT09IGtleVBhcnRzLmxlbmd0aCkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIC8vIOqwgSDtjIztirjqsIAgKiDrmJDripQg7KCV7ZmV7Z6IIOydvOy5mFxuICByZXR1cm4gcGF0dGVyblBhcnRzLmV2ZXJ5KChwYXJ0LCBpKSA9PiBwYXJ0ID09PSBcIipcIiB8fCBwYXJ0ID09PSBrZXlQYXJ0c1tpXSk7XG59XG5cbi8qKlxuICogTmFpdGVRdWVyeSDtgbTrnpjsiqRcbiAqIOyytOydtOuLneydhCDthrXtlZwgdHJhY2Ug7ZWE7YSw66eBIOuwjyDsobDtmoxcbiAqL1xuZXhwb3J0IGNsYXNzIE5haXRlUXVlcnkge1xuICBjb25zdHJ1Y3Rvcihwcml2YXRlIHRyYWNlczogTmFpdGVUcmFjZVtdKSB7fVxuXG4gIHByaXZhdGUgaXNDb21wYXJhYmxlVmFsdWUodmFsdWU6IHVua25vd24pOiB2YWx1ZSBpcyBudW1iZXIgfCBzdHJpbmcge1xuICAgIHJldHVybiB0eXBlb2YgdmFsdWUgPT09IFwibnVtYmVyXCIgfHwgdHlwZW9mIHZhbHVlID09PSBcInN0cmluZ1wiO1xuICB9XG5cbiAgLyoqXG4gICAqIO2MjOydvOuqheycvOuhnCDtlYTthLDrp4FcbiAgICogQHBhcmFtIGZpbGVOYW1lIO2MjOydvOuqhSAo7JiIOiBcInN5bmNlci50ZXN0LnRzXCIpXG4gICAqL1xuICBmcm9tRmlsZShmaWxlTmFtZTogc3RyaW5nKTogTmFpdGVRdWVyeSB7XG4gICAgY29uc3QgZmlsdGVyZWQgPSB0aGlzLnRyYWNlcy5maWx0ZXIoKHQpID0+XG4gICAgICB0LnN0YWNrLnNvbWUoKGZyYW1lKSA9PiBmcmFtZS5maWxlUGF0aC5lbmRzV2l0aChgLyR7ZmlsZU5hbWV9YCkpLFxuICAgICk7XG4gICAgcmV0dXJuIG5ldyBOYWl0ZVF1ZXJ5KGZpbHRlcmVkKTtcbiAgfVxuXG4gIC8qKlxuICAgKiDtlajsiJjrqoXsnLzroZwg7ZWE7YSw66eBXG4gICAqIEBwYXJhbSBmdW5jTmFtZSDtlajsiJjrqoUgKGluY2x1ZGVzIOyytO2BrClcbiAgICogQHBhcmFtIG9wdGlvbnMuZnJvbSAnZGlyZWN0JyA9IOyngeygkSDtmLjstpzrp4wsICdpbmRpcmVjdCcgPSDqsITsoJEg7Zi47Lac66eMLCAnYm90aCcgPSDrqqjrkZBcbiAgICovXG4gIGZyb21GdW5jdGlvbihcbiAgICBmdW5jTmFtZTogc3RyaW5nLFxuICAgIG9wdGlvbnM6IHsgZnJvbTogXCJkaXJlY3RcIiB8IFwiaW5kaXJlY3RcIiB8IFwiYm90aFwiIH0gPSB7IGZyb206IFwiYm90aFwiIH0sXG4gICk6IE5haXRlUXVlcnkge1xuICAgIGNvbnN0IGZpbHRlcmVkID0gdGhpcy50cmFjZXMuZmlsdGVyKCh0KSA9PiB7XG4gICAgICBpZiAob3B0aW9ucy5mcm9tID09PSBcImRpcmVjdFwiKSB7XG4gICAgICAgIC8vIHN0YWNrWzBd66eMIO2ZleyduCAo7KeB7KCRIO2YuOy2nClcbiAgICAgICAgcmV0dXJuIHQuc3RhY2tbMF0/LmZ1bmN0aW9uTmFtZT8uaW5jbHVkZXMoZnVuY05hbWUpO1xuICAgICAgfVxuICAgICAgaWYgKG9wdGlvbnMuZnJvbSA9PT0gXCJpbmRpcmVjdFwiKSB7XG4gICAgICAgIC8vIHN0YWNrWzErXeyXkOyEnCDtmZXsnbggKOqwhOygkSDtmLjstpwpXG4gICAgICAgIHJldHVybiB0LnN0YWNrLnNsaWNlKDEpLnNvbWUoKGYpID0+IGYuZnVuY3Rpb25OYW1lPy5pbmNsdWRlcyhmdW5jTmFtZSkpO1xuICAgICAgfVxuICAgICAgLy8g7KCE7LK0IOyKpO2DneyXkOyEnCDtmZXsnbhcbiAgICAgIHJldHVybiB0LnN0YWNrLnNvbWUoKGYpID0+IGYuZnVuY3Rpb25OYW1lPy5pbmNsdWRlcyhmdW5jTmFtZSkpO1xuICAgIH0pO1xuICAgIHJldHVybiBuZXcgTmFpdGVRdWVyeShmaWx0ZXJlZCk7XG4gIH1cblxuICAvKipcbiAgICog642w7J207YSwIOqyveuhnCDquLDrsJgg7ZWE7YSw66eBXG4gICAqIEBwYXJhbSBwYXRoIHJhZGFzaCBnZXQg6rK966GcICjsmIg6IFwiZGF0YS51c2VySWRcIilcbiAgICogQHBhcmFtIG9wZXJhdG9yIOu5hOq1kCDsl7DsgrDsnpBcbiAgICogQHBhcmFtIHZhbHVlIOu5hOq1kOqwklxuICAgKi9cbiAgd2hlcmUocGF0aDogc3RyaW5nLCBvcGVyYXRvcjogQ29tcGFyaXNvbk9wZXJhdG9yIHwgXCJpbmNsdWRlc1wiLCB2YWx1ZTogYW55KTogTmFpdGVRdWVyeSB7XG4gICAgY29uc3QgZmlsdGVyZWQgPSB0aGlzLnRyYWNlcy5maWx0ZXIoKHRyYWNlKSA9PiB7XG4gICAgICBjb25zdCBhY3R1YWwgPSBnZXQodHJhY2UsIHBhdGgpO1xuXG4gICAgICBzd2l0Y2ggKG9wZXJhdG9yKSB7XG4gICAgICAgIGNhc2UgXCI+XCI6XG4gICAgICAgICAgcmV0dXJuIHRoaXMuaXNDb21wYXJhYmxlVmFsdWUoYWN0dWFsKSAmJiB0aGlzLmlzQ29tcGFyYWJsZVZhbHVlKHZhbHVlKSAmJiBhY3R1YWwgPiB2YWx1ZTtcbiAgICAgICAgY2FzZSBcIjxcIjpcbiAgICAgICAgICByZXR1cm4gdGhpcy5pc0NvbXBhcmFibGVWYWx1ZShhY3R1YWwpICYmIHRoaXMuaXNDb21wYXJhYmxlVmFsdWUodmFsdWUpICYmIGFjdHVhbCA8IHZhbHVlO1xuICAgICAgICBjYXNlIFwiPj1cIjpcbiAgICAgICAgICByZXR1cm4gdGhpcy5pc0NvbXBhcmFibGVWYWx1ZShhY3R1YWwpICYmIHRoaXMuaXNDb21wYXJhYmxlVmFsdWUodmFsdWUpICYmIGFjdHVhbCA+PSB2YWx1ZTtcbiAgICAgICAgY2FzZSBcIjw9XCI6XG4gICAgICAgICAgcmV0dXJuIHRoaXMuaXNDb21wYXJhYmxlVmFsdWUoYWN0dWFsKSAmJiB0aGlzLmlzQ29tcGFyYWJsZVZhbHVlKHZhbHVlKSAmJiBhY3R1YWwgPD0gdmFsdWU7XG4gICAgICAgIGNhc2UgXCI9XCI6XG4gICAgICAgICAgcmV0dXJuIGFjdHVhbCA9PT0gdmFsdWU7XG4gICAgICAgIGNhc2UgXCIhPVwiOlxuICAgICAgICAgIHJldHVybiBhY3R1YWwgIT09IHZhbHVlO1xuICAgICAgICBjYXNlIFwiaW5jbHVkZXNcIjpcbiAgICAgICAgICByZXR1cm4gdHlwZW9mIGFjdHVhbCA9PT0gXCJzdHJpbmdcIiAmJiBhY3R1YWwuaW5jbHVkZXModmFsdWUpO1xuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICByZXR1cm4gbmV3IE5haXRlUXVlcnkoZmlsdGVyZWQpO1xuICB9XG5cbiAgLyoqXG4gICAqIOyghOyytCDrjbDsnbTthLAg67Cw7Je0IOuwmO2ZmFxuICAgKi9cbiAgcmVzdWx0KCk6IGFueVtdIHtcbiAgICByZXR1cm4gdGhpcy50cmFjZXMubWFwKCh0KSA9PiB0LmRhdGEpO1xuICB9XG5cbiAgLyoqXG4gICAqIOyyqyDrsojsp7gg642w7J207YSwIOuwmO2ZmFxuICAgKi9cbiAgZmlyc3QoKTogYW55IHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy50cmFjZXNbMF0/LmRhdGE7XG4gIH1cblxuICAvKipcbiAgICog66eI7KeA66eJIOuNsOydtO2EsCDrsJjtmZhcbiAgICovXG4gIGxhc3QoKTogYW55IHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy50cmFjZXNbdGhpcy50cmFjZXMubGVuZ3RoIC0gMV0/LmRhdGE7XG4gIH1cblxuICAvKipcbiAgICogbuuyiOynuCDrjbDsnbTthLAg67CY7ZmYXG4gICAqL1xuICBhdChpbmRleDogbnVtYmVyKTogYW55IHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy50cmFjZXNbaW5kZXhdPy5kYXRhO1xuICB9XG5cbiAgLyoqXG4gICAqIOybkOuzuCB0cmFjZSDrsLDsl7Qg67CY7ZmYICjrlJTrsoTquYUvTmFpdGVWaWV3ZXLsmqkpXG4gICAqL1xuICBnZXRUcmFjZXMoKTogTmFpdGVUcmFjZVtdIHtcbiAgICByZXR1cm4gdGhpcy50cmFjZXM7XG4gIH1cbn1cblxuLy8gTmFpdGUg7Iux6riA7YS0IOqwneyytCAo7LaU7ZuEIGxvZ2dlciDsl7DqsrAg65Ox7J2YIOyDge2DnCDqtIDrpqwg7ZWE7JqU7ISxIOqzoOugpClcbmV4cG9ydCBjbGFzcyBOYWl0ZUNsYXNzIHtcbiAgLy8g7YWM7Iqk7Yq4IOuhnOq3uCDquLDroZ1cbiAgdChcbiAgICBuYW1lOiBzdHJpbmcsXG4gICAgdmFsdWU6IGFueSAvKuydtOugh+qyjCDrsJvsnYAg6rCS7J20IE5haXRlVHJhY2XroZwg7KCA7J6l65CY7Ja0IOyeiOuLpOqwgCDstpTtm4Tsl5Agdml0ZXN07JeQ6rKMIG1ldGHrpbwg7Ya17ZW0IOuEmOqyqOyguCDtlITroZzshLjsiqTqsIQg7Ya17Iug7J2EIO2Gte2VtCDsp4HroKztmZTrkJjslrTslbwg7ZWY64qUIOygkOydhCDqs6DroKTtlZjsmIDsnYQg65WMIOyXrOq4sOyXkCBTZXJpYWxpemFibGXsnYQg7I2o7IScIOygnO2VnOydhCDrkZgg7IiY64+EIOyeiOyngOunjCwg7IKs7Jqp7IOB7J2YIO2OuOydmOulvCDsg53qsIHtlZjsl6wgYW5566GcIOuwm+yKteuLiOuLpC4qLyxcbiAgKSB7XG4gICAgLy8g7J20IHQg7ZWo7IiY64qUIO2FjOyKpO2KuCDtmZjqsr3sl5DshJzrp4wg7J6R64+Z7ZW07JW8IO2VqeuLiOuLpC5cbiAgICAvLyDqt7jrpqzqs6Ag7YWM7Iqk7Yq4IO2ZmOqyvSDtjJDri6jsl5Ag7JmcIGlzVGVzdCgpIO2VqOyImOulvCDsgqzsmqntlZjsp4Ag7JWK7JWY64OQ66m07JqULCxcbiAgICAvLyDsnbTroIfqsowg7ZWY64qU6rKMIOycoO2LuCDtlajsiJgg67aI65+s7JmA7IScIOyCrOyaqe2VmOuKlCDqsoPrs7Tri6Qg7KGw6riI7J2064KY66eIIOu5oOulvCDqsoMg6rCZ7JWY6riwIOuVjOusuOyeheuLiOuLpC5cbiAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwidGVzdFwiKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGNvbnRleHQgPSBTb25hbXUuZ2V0Q29udGV4dCgpO1xuICAgICAgY29uc3Qgc3RvcmUgPSBjb250ZXh0Py5uYWl0ZVN0b3JlO1xuXG4gICAgICBpZiAoIXN0b3JlKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgLy8g7L2c7Iqk7YOdIOyImOynkVxuICAgICAgY29uc3Qgc3RhY2sgPSBleHRyYWN0Q2FsbFN0YWNrKCk7XG5cbiAgICAgIGNvbnN0IHRyYWNlOiBOYWl0ZVRyYWNlID0ge1xuICAgICAgICBrZXk6IG5hbWUsXG4gICAgICAgIGRhdGE6IHZhbHVlLFxuICAgICAgICBzdGFjayxcbiAgICAgICAgYXQ6IG5ldyBEYXRlKCksXG4gICAgICB9O1xuXG4gICAgICAvLyDtla3sg4Eg67Cw7Je066GcIOq0gOumrFxuICAgICAgY29uc3QgZXhpc3RpbmcgPSBzdG9yZS5nZXQobmFtZSkgPz8gW107XG4gICAgICBnZXRMb2dnZXIoW1wibmFpdGVcIiwgLi4uY29udmVydE5haXRlS2V5VG9DYXRlZ29yeShuYW1lKV0pLmRlYnVnKFxuICAgICAgICBgbmFpdGU6IHtuYW1lfSAke2V4aXN0aW5nLmxlbmd0aCA9PT0gMCA/IFwiaXMgZW1wdHkgc3RhdGVcIiA6IGBhbHJlYWR5IGV4aXN0aW5nIHdpdGggJHtleGlzdGluZy5sZW5ndGh9IGVudHJpZXNgfSwgYXBwZW5kaW5nIG5ldyBlbnRyeWAsXG4gICAgICAgIHtcbiAgICAgICAgICBuYW1lLFxuICAgICAgICAgIHZhbHVlLFxuICAgICAgICB9LFxuICAgICAgKTtcblxuICAgICAgc3RvcmUuc2V0KG5hbWUsIFsuLi5leGlzdGluZywgdHJhY2VdKTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIC8vIENvbnRleHQg7JeG64qUIOyDge2ZqeyXkOyEnCBOYWl0ZS50IO2YuOy2nFxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBrZXkg65iQ64qUIHdpbGRjYXJkIO2MqO2EtOycvOuhnCB0cmFjZSDsobDtmoxcbiAgICog7ZWt7IOBIE5haXRlUXVlcnkg67CY7ZmY7ZWY7JesIOyytOydtOuLnSDqsIDriqVcbiAgICovXG4gIGdldChrZXlQYXR0ZXJuOiBzdHJpbmcpOiBOYWl0ZVF1ZXJ5IHtcbiAgICBjb25zdCBjb250ZXh0ID0gU29uYW11LmdldENvbnRleHQoKTtcbiAgICBjb25zdCBzdG9yZSA9IGNvbnRleHQ/Lm5haXRlU3RvcmU7XG5cbiAgICBpZiAoIXN0b3JlKSB7XG4gICAgICByZXR1cm4gbmV3IE5haXRlUXVlcnkoW10pO1xuICAgIH1cblxuICAgIC8vIHdpbGRjYXJkIOyXhuycvOuptCBleGFjdCBtYXRjaFxuICAgIGlmICgha2V5UGF0dGVybi5pbmNsdWRlcyhcIipcIikpIHtcbiAgICAgIGNvbnN0IHRyYWNlcyA9IHN0b3JlLmdldChrZXlQYXR0ZXJuKSA/PyBbXTtcbiAgICAgIHJldHVybiBuZXcgTmFpdGVRdWVyeSh0cmFjZXMpO1xuICAgIH1cblxuICAgIC8vIHdpbGRjYXJkIO2MqO2EtCDrp6Tsua1cbiAgICBjb25zdCBhbGxUcmFjZXM6IE5haXRlVHJhY2VbXSA9IFtdO1xuICAgIGZvciAoY29uc3QgW2tleSwgdHJhY2VzXSBvZiBzdG9yZS5lbnRyaWVzKCkpIHtcbiAgICAgIGlmIChtYXRjaGVzUGF0dGVybihrZXksIGtleVBhdHRlcm4pKSB7XG4gICAgICAgIGFsbFRyYWNlcy5wdXNoKC4uLnRyYWNlcyk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIG5ldyBOYWl0ZVF1ZXJ5KGFsbFRyYWNlcyk7XG4gIH1cblxuICAvLyDsoITssrQg66as7Iqk7Yq4IOqwgOyguOyYpOq4sFxuICBnZXRBbGwoKTogeyBba2V5OiBzdHJpbmddOiBhbnkgfSB7XG4gICAgY29uc3QgY29udGV4dCA9IFNvbmFtdS5nZXRDb250ZXh0KCk7XG4gICAgaWYgKCFjb250ZXh0Py5uYWl0ZVN0b3JlKSB7XG4gICAgICByZXR1cm4ge307XG4gICAgfVxuICAgIC8vIE5haXRlVHJhY2Ug67Cw7Je07J2EIGRhdGHrp4wg7LaU7Lac7ZWY7JesIOuwmO2ZmFxuICAgIGNvbnN0IHJlc3VsdDogeyBba2V5OiBzdHJpbmddOiBhbnkgfSA9IHt9O1xuICAgIGZvciAoY29uc3QgW2tleSwgdHJhY2VzXSBvZiBjb250ZXh0Lm5haXRlU3RvcmUuZW50cmllcygpKSB7XG4gICAgICBpZiAoa2V5LnN0YXJ0c1dpdGgoXCJtb2NrOlwiKSkge1xuICAgICAgICAvLyBNb2NrIOyEpOygleydgCDqt7jrjIDroZwg67CY7ZmYXG4gICAgICAgIHJlc3VsdFtrZXldID0gdHJhY2VzO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gTmFpdGVUcmFjZSDrsLDsl7TsnYAgZGF0YeunjCDstpTstpxcbiAgICAgICAgcmVzdWx0W2tleV0gPSB0cmFjZXMubWFwKCh0OiBOYWl0ZVRyYWNlKSA9PiB0LmRhdGEpO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgLyoqXG4gICAqIOyKpO2GoOyWtOyXkCDrk6TslrTsnojrjZgg7Yq466CI7J207Iqk66W8IOqzoOuMgOuhnCDqurzrgrTsmLXri4jri6QuXG4gICAqIOydtOuVjCDqsJLrk6TsnYAg66qo65GQIOyngeugrO2ZlCDqsIDriqXtlZwg7IOB7YOc66GcIOuCmOqwgOqyjCDrkKnri4jri6QuXG4gICAqIO2FjOyKpO2KuCDsoJXrs7TsmYAg7ZWo6ruYIGV4dGVuc2lvbnPsl5Ag67O064K8IOyaqeuPhOuhnCDrp4zrk6Tsl4jsirXri4jri6QuXG4gICAqIEByZXR1cm5zXG4gICAqL1xuICBnZXRBbGxUcmFjZXMoKTogU2VyaWFsaXplZFRyYWNlW10ge1xuICAgIGNvbnN0IGNvbnRleHQgPSBTb25hbXUuZ2V0Q29udGV4dCgpO1xuICAgIGlmICghY29udGV4dD8ubmFpdGVTdG9yZSkge1xuICAgICAgcmV0dXJuIFtdO1xuICAgIH1cblxuICAgIGNvbnN0IHRyYWNlcyA9IEFycmF5LmZyb20oY29udGV4dC5uYWl0ZVN0b3JlLnZhbHVlcygpKS5mbGF0KCk7XG5cbiAgICAvLyDsp4HroKztmZQg67aI6rCA64ql7ZWcIOqwkuydtCDsobTsnqztlZzri6TrqbQg7J2066W8IOuMgOusuOynneunjO2VmOqyjCDslYzroKTspI3ri4jri6QhIOq3uOy5mOunjCDslYzrpqzquLDrp4wg7ZWY6rOgIOq3uOuDpSDsp4DrgpjqsJHri4jri6Qg44WO44WOXG4gICAgLy8g7JmcIOyngeugrO2ZlOqwgCDspJHsmpTtlZzqsIA/IOydtChnZXRBbGxUcmFjZXMpIO2YuOy2nOydmCDqsrDqs7zripQg7Jm467aA66GcIOuCmOqwgOqyjCDrkJjripTrjbAsXG4gICAgLy8g7J2065WMIOyjvCDsmqnrj4TqsIAgdml0ZXN07J2YIHRhc2subWV0YSDtlYTrk5zrpbwg7Ya17ZW0IGFmdGVyRWFjaOyXkOyEnCBTb25hbXUgZXh0ZW5zaW9u7Jy866GcIOyghOuLrO2VmOuKlCDqsoPsnoXri4jri6QuXG4gICAgLy8g7Jes6riw7IScIG1ldGEg7ZWE65Oc7JeQIOuLtOq4tCDrgrTsmqnsnYAg7ZSE66Gc7IS47Iqk6rCEIO2GteyLoChwcm9jZXNzLnNlbmQpIOuYkOuKlCDsiqTroIjrk5zqsIQg7Ya17IugKG1lc3NhZ2UgcG9ydCnsnYQg7Ya17ZW0IOyghOuLrOuQmOyWtOyVvCDtlZjripTrjbAsXG4gICAgLy8g7J2066GcIOyduO2VtCBcIuyngeugrO2ZlCDqsIDriqXtlZwg6rCS65Ok66eMIO2XiOyaqVwi7ZWY64qUIOygnOyVveydtCDsg53quYHri4jri6QuXG4gICAgLy9cbiAgICAvLyDsnbQg7KCc7JW97J2EIOydmOyLne2VmOyXrCBOYWl0ZS507JeQIOyngeugrO2ZlCDqsIDriqXtlZwg6rCS66eMIOuEmOq4sOqyjCDtlaAg7IiY64+EIOyeiOyXiOyngOunjCwg6re466CH6rKMIO2VmOuptCDrtojtjrjtlbTsp4gg6rKDIOqwmeyVhOyEnCDtlZjsp4Ag7JWK7JWY7Iq164uI64ukLlxuICAgIC8vIOuUsOudvOyEnCDtmITsnqwgTmFpdGUudOuKlCDrqqjrk6Ag6rCS7J2EIOuwm+ydhCDsiJgg7J6I6rKMIOuQmOyWtCDsnojsirXri4jri6QuXG4gICAgLy8g64yA7IugIOydtOugh+qyjChnZXRBbGxUcmFjZXMpIOq3uCDqsJLrk6TsnYQg67m864K8IOuVjCBKU09OLnN0cmluZ2lmeeulvCDsgqzsmqntlZjsl6wg6rCV7KCc66GcIOyngeugrO2ZlCDqsIDriqXtlZjqsowg66eM65Ok7JeI7Iq164uI64ukLCxcbiAgICBmb3IgKGNvbnN0IHRyYWNlIG9mIHRyYWNlcykge1xuICAgICAgY29uc3QgY2hlY2sgPSBpc1NlcmlhbGl6YWJsZSh0cmFjZS5kYXRhKTtcbiAgICAgIGlmICghY2hlY2sudmFsaWQpIHtcbiAgICAgICAgY29uc29sZS53YXJuKFxuICAgICAgICAgIFwiXFxuXCIgK1xuICAgICAgICAgICAgXCLilZTilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZdcXG5cIiArXG4gICAgICAgICAgICBcIuKVkSAgW05haXRlXSBOb24tc2VyaWFsaXphYmxlIHZhbHVlIGRldGVjdGVkISAgICAgICAgICAgICAgICAgICAgICDilZFcXG5cIiArXG4gICAgICAgICAgICBcIuKVoOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVo1xcblwiICtcbiAgICAgICAgICAgIGDilZEgIEtleTogJHt0cmFjZS5rZXkucGFkRW5kKDU3KX3ilZFcXG5gICtcbiAgICAgICAgICAgIGDilZEgIFJlYXNvbjogJHsoY2hlY2sucmVhc29uID8/IFwidW5rbm93blwiKS5zbGljZSgwLCA1NCkucGFkRW5kKDU0KX3ilZFcXG5gICtcbiAgICAgICAgICAgIGDilZEgIExvY2F0aW9uOiAkeyh0cmFjZS5zdGFja1swXT8uZmlsZVBhdGggPz8gXCJ1bmtub3duXCIpLnNsaWNlKC01MSkucGFkRW5kKDUyKX3ilZFcXG5gICtcbiAgICAgICAgICAgIGDilZEgIExpbmU6ICR7U3RyaW5nKHRyYWNlLnN0YWNrWzBdPy5saW5lTnVtYmVyID8/IDApLnBhZEVuZCg1Nil94pWRXFxuYCArXG4gICAgICAgICAgICBcIuKVoOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVo1xcblwiICtcbiAgICAgICAgICAgIFwi4pWRICBOYWl0ZS50KCkgYWNjZXB0cyBhbnkgdHlwZSBvZiB2YWx1ZS4gSG93ZXZlciwgdmFsdWVzIHdpbGwgICAgIOKVkVxcblwiICtcbiAgICAgICAgICAgIFwi4pWRICBiZSBzZXJpYWxpemVkIHRvIEpTT04gd2hlbiBleHBvcnRlZCB2aWEgTmFpdGUuZ2V0QWxsVHJhY2VzKCkuIOKVkVxcblwiICtcbiAgICAgICAgICAgIFwi4pWa4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWdXFxuXCIsXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHRyYWNlcy5tYXAoKHRyYWNlKSA9PiAoe1xuICAgICAga2V5OiB0cmFjZS5rZXksXG4gICAgICB2YWx1ZTogSlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeSh0cmFjZS5kYXRhID8/IFwiXCIpKSwgLy8g7KeB66Cs7ZmUIOqwgOuKpe2VnCDqsoPrp4wg64Ko6riw66Ck64qUIOuIiOusvOqyqOyatCDrhbjroKUsLCDslYjqt7jrn6zrqbQgdGFzay5tZXRh7JeQIOuTpOyWtOqwgOyEnCDtlITroZzshLjsiqTqsIQg7Ya17IugIO2VoCDrlYwg66y47KCcIOyDneq4sOqxsOuToOyalCwsXG4gICAgICBmaWxlUGF0aDogdHJhY2Uuc3RhY2tbMF0/LmZpbGVQYXRoID8/IFwiXCIsXG4gICAgICBsaW5lTnVtYmVyOiB0cmFjZS5zdGFja1swXT8ubGluZU51bWJlciA/PyAwLFxuICAgICAgYXQ6IHRyYWNlLmF0LnRvSVNPU3RyaW5nKCksXG4gICAgfSkpO1xuICB9XG5cbiAgLy8g7Yq57KCVIO2CpCDsgq3soJztlZjquLBcbiAgZGVsKGtleTogc3RyaW5nKSB7XG4gICAgY29uc3QgY29udGV4dCA9IFNvbmFtdS5nZXRDb250ZXh0KCk7XG4gICAgaWYgKCFjb250ZXh0Py5uYWl0ZVN0b3JlKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnRleHQubmFpdGVTdG9yZS5kZWxldGUoa2V5KTtcbiAgfVxuXG4gIGNyZWF0ZVN0b3JlKCk6IE5haXRlU3RvcmUge1xuICAgIHJldHVybiBuZXcgTWFwPHN0cmluZywgTmFpdGVUcmFjZVtdPigpO1xuICB9XG59XG5cbmV4cG9ydCBjb25zdCBOYWl0ZSA9IG5ldyBOYWl0ZUNsYXNzKCk7XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7QUE0Q0EsU0FBUyxtQkFBaUM7Q0FDeEMsTUFBTSx5QkFBUSxJQUFJLE1BQU0sRUFBQyxDQUFDO0NBQzFCLElBQUksQ0FBQyxPQUFPLE9BQU8sQ0FBQztDQVNwQixNQUFNLFNBUFEsTUFBTSxNQUFNLElBT1gsQ0FBQSxDQUNaLE1BQU0sQ0FBQyxDQUFDLENBQ1IsSUFBSSxlQUFl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
package/dist/ssr/index.js CHANGED
@@ -1,14 +1,11 @@
1
- import { __esmMin } from "../_virtual/rolldown_runtime.js";
1
+ import { __esmMin } from "../_virtual/_rolldown/runtime.js";
2
2
  import { clearSSRRoutes, getSSRRoutes, init_registry, matchSSRRoute, registerSSR } from "./registry.js";
3
3
  import { init_renderer, renderSSR } from "./renderer.js";
4
-
5
- //#region src/ssr/index.ts
6
- var init_ssr = __esmMin((() => {
4
+ //#endregion
5
+ __esmMin((() => {
7
6
  init_registry();
8
7
  init_renderer();
9
- }));
10
-
11
- //#endregion
12
- init_ssr();
8
+ }))();
13
9
  export { clearSSRRoutes, getSSRRoutes, matchSSRRoute, registerSSR, renderSSR };
14
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJuYW1lcyI6W10sInNvdXJjZXMiOlsiLi4vLi4vc3JjL3Nzci9pbmRleC50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgeyBjbGVhclNTUlJvdXRlcywgZ2V0U1NSUm91dGVzLCBtYXRjaFNTUlJvdXRlLCByZWdpc3RlclNTUiB9IGZyb20gXCIuL3JlZ2lzdHJ5XCI7XG5leHBvcnQgeyByZW5kZXJTU1IgfSBmcm9tIFwiLi9yZW5kZXJlclwiO1xuZXhwb3J0IHR5cGUgeyBQcmVsb2FkQ29uZmlnLCBQcmVsb2FkZWREYXRhLCBTU1JRdWVyeSwgU1NSUm91dGUgfSBmcm9tIFwiLi90eXBlc1wiO1xuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Z0JBQXNGO2dCQUMvQyJ9
10
+
11
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJuYW1lcyI6W10sInNvdXJjZXMiOlsiLi4vLi4vc3JjL3Nzci9pbmRleC50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgeyBjbGVhclNTUlJvdXRlcywgZ2V0U1NSUm91dGVzLCBtYXRjaFNTUlJvdXRlLCByZWdpc3RlclNTUiB9IGZyb20gXCIuL3JlZ2lzdHJ5XCI7XG5leHBvcnQgeyByZW5kZXJTU1IgfSBmcm9tIFwiLi9yZW5kZXJlclwiO1xuZXhwb3J0IHR5cGUgeyBQcmVsb2FkQ29uZmlnLCBQcmVsb2FkZWREYXRhLCBTU1JRdWVyeSwgU1NSUm91dGUgfSBmcm9tIFwiLi90eXBlc1wiO1xuIl0sIm1hcHBpbmdzIjoiOzs7OztlQUFxRjtlQUMvQyJ9
@@ -1,5 +1,4 @@
1
- import { __esmMin } from "../_virtual/rolldown_runtime.js";
2
-
1
+ import { __esmMin } from "../_virtual/_rolldown/runtime.js";
3
2
  //#region src/ssr/registry.ts
4
3
  function registerSSR(route) {
5
4
  ssrRoutes.push(route);
@@ -13,30 +12,23 @@ function clearSSRRoutes() {
13
12
  function matchSSRRoute(url) {
14
13
  for (const route of ssrRoutes) {
15
14
  const params = matchPath(route.path, url);
16
- if (params !== null) {
17
- return {
18
- route,
19
- params
20
- };
21
- }
15
+ if (params !== null) return {
16
+ route,
17
+ params
18
+ };
22
19
  }
23
20
  return null;
24
21
  }
25
22
  function matchPath(pattern, url) {
26
23
  const patternParts = pattern.split("/").filter(Boolean);
27
24
  const urlParts = url.split("?")[0].split("/").filter(Boolean);
28
- if (patternParts.length !== urlParts.length) {
29
- return null;
30
- }
25
+ if (patternParts.length !== urlParts.length) return null;
31
26
  const params = {};
32
27
  for (let i = 0; i < patternParts.length; i++) {
33
28
  const patternPart = patternParts[i];
34
29
  const urlPart = urlParts[i];
35
- if (patternPart.startsWith(":")) {
36
- params[patternPart.slice(1)] = urlPart;
37
- } else if (patternPart !== urlPart) {
38
- return null;
39
- }
30
+ if (patternPart.startsWith(":")) params[patternPart.slice(1)] = urlPart;
31
+ else if (patternPart !== urlPart) return null;
40
32
  }
41
33
  return params;
42
34
  }
@@ -44,8 +36,8 @@ var ssrRoutes;
44
36
  var init_registry = __esmMin((() => {
45
37
  ssrRoutes = [];
46
38
  }));
47
-
48
39
  //#endregion
49
40
  init_registry();
50
41
  export { clearSSRRoutes, getSSRRoutes, init_registry, matchPath, matchSSRRoute, registerSSR };
51
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVnaXN0cnkuanMiLCJuYW1lcyI6WyJwYXJhbXM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4iLCJzc3JSb3V0ZXM6IFNTUlJvdXRlW10iXSwic291cmNlcyI6WyIuLi8uLi9zcmMvc3NyL3JlZ2lzdHJ5LnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IHR5cGUgU1NSUm91dGUgfSBmcm9tIFwiLi90eXBlc1wiO1xuXG5jb25zdCBzc3JSb3V0ZXM6IFNTUlJvdXRlW10gPSBbXTtcblxuZXhwb3J0IGZ1bmN0aW9uIHJlZ2lzdGVyU1NSKHJvdXRlOiBTU1JSb3V0ZSk6IHZvaWQge1xuICBzc3JSb3V0ZXMucHVzaChyb3V0ZSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRTU1JSb3V0ZXMoKTogU1NSUm91dGVbXSB7XG4gIHJldHVybiBzc3JSb3V0ZXM7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjbGVhclNTUlJvdXRlcygpOiB2b2lkIHtcbiAgc3NyUm91dGVzLmxlbmd0aCA9IDA7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBtYXRjaFNTUlJvdXRlKFxuICB1cmw6IHN0cmluZyxcbik6IHsgcm91dGU6IFNTUlJvdXRlOyBwYXJhbXM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gfSB8IG51bGwge1xuICBmb3IgKGNvbnN0IHJvdXRlIG9mIHNzclJvdXRlcykge1xuICAgIGNvbnN0IHBhcmFtcyA9IG1hdGNoUGF0aChyb3V0ZS5wYXRoLCB1cmwpO1xuICAgIGlmIChwYXJhbXMgIT09IG51bGwpIHtcbiAgICAgIHJldHVybiB7IHJvdXRlLCBwYXJhbXMgfTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIG51bGw7XG59XG5cbi8vIOqwhOuLqO2VnCBwYXRoIG1hdGNoaW5nXG5leHBvcnQgZnVuY3Rpb24gbWF0Y2hQYXRoKHBhdHRlcm46IHN0cmluZywgdXJsOiBzdHJpbmcpOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+IHwgbnVsbCB7XG4gIGNvbnN0IHBhdHRlcm5QYXJ0cyA9IHBhdHRlcm4uc3BsaXQoXCIvXCIpLmZpbHRlcihCb29sZWFuKTtcbiAgY29uc3QgdXJsUGFydHMgPSB1cmwuc3BsaXQoXCI/XCIpWzBdLnNwbGl0KFwiL1wiKS5maWx0ZXIoQm9vbGVhbik7XG5cbiAgaWYgKHBhdHRlcm5QYXJ0cy5sZW5ndGggIT09IHVybFBhcnRzLmxlbmd0aCkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgY29uc3QgcGFyYW1zOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge307XG5cbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBwYXR0ZXJuUGFydHMubGVuZ3RoOyBpKyspIHtcbiAgICBjb25zdCBwYXR0ZXJuUGFydCA9IHBhdHRlcm5QYXJ0c1tpXTtcbiAgICBjb25zdCB1cmxQYXJ0ID0gdXJsUGFydHNbaV07XG5cbiAgICBpZiAocGF0dGVyblBhcnQuc3RhcnRzV2l0aChcIjpcIikpIHtcbiAgICAgIHBhcmFtc1twYXR0ZXJuUGFydC5zbGljZSgxKV0gPSB1cmxQYXJ0O1xuICAgIH0gZWxzZSBpZiAocGF0dGVyblBhcnQgIT09IHVybFBhcnQpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBwYXJhbXM7XG59XG4iXSwibWFwcGluZ3MiOiI7OztBQUlBLFNBQWdCLFlBQVksT0FBdUI7QUFDakQsV0FBVSxLQUFLLE1BQU07O0FBR3ZCLFNBQWdCLGVBQTJCO0FBQ3pDLFFBQU87O0FBR1QsU0FBZ0IsaUJBQXVCO0FBQ3JDLFdBQVUsU0FBUzs7QUFHckIsU0FBZ0IsY0FDZCxLQUM0RDtBQUM1RCxNQUFLLE1BQU0sU0FBUyxXQUFXO0VBQzdCLE1BQU0sU0FBUyxVQUFVLE1BQU0sTUFBTSxJQUFJO0FBQ3pDLE1BQUksV0FBVyxNQUFNO0FBQ25CLFVBQU87SUFBRTtJQUFPO0lBQVE7OztBQUc1QixRQUFPOztBQUlULFNBQWdCLFVBQVUsU0FBaUIsS0FBNEM7Q0FDckYsTUFBTSxlQUFlLFFBQVEsTUFBTSxJQUFJLENBQUMsT0FBTyxRQUFRO0NBQ3ZELE1BQU0sV0FBVyxJQUFJLE1BQU0sSUFBSSxDQUFDLEdBQUcsTUFBTSxJQUFJLENBQUMsT0FBTyxRQUFRO0FBRTdELEtBQUksYUFBYSxXQUFXLFNBQVMsUUFBUTtBQUMzQyxTQUFPOztDQUdULE1BQU1BLFNBQWlDLEVBQUU7QUFFekMsTUFBSyxJQUFJLElBQUksR0FBRyxJQUFJLGFBQWEsUUFBUSxLQUFLO0VBQzVDLE1BQU0sY0FBYyxhQUFhO0VBQ2pDLE1BQU0sVUFBVSxTQUFTO0FBRXpCLE1BQUksWUFBWSxXQUFXLElBQUksRUFBRTtBQUMvQixVQUFPLFlBQVksTUFBTSxFQUFFLElBQUk7YUFDdEIsZ0JBQWdCLFNBQVM7QUFDbEMsVUFBTzs7O0FBSVgsUUFBTzs7OztDQWhESEMsWUFBd0IsRUFBRSJ9
42
+
43
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVnaXN0cnkuanMiLCJuYW1lcyI6W10sInNvdXJjZXMiOlsiLi4vLi4vc3JjL3Nzci9yZWdpc3RyeS50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyB0eXBlIFNTUlJvdXRlIH0gZnJvbSBcIi4vdHlwZXNcIjtcblxuY29uc3Qgc3NyUm91dGVzOiBTU1JSb3V0ZVtdID0gW107XG5cbmV4cG9ydCBmdW5jdGlvbiByZWdpc3RlclNTUihyb3V0ZTogU1NSUm91dGUpOiB2b2lkIHtcbiAgc3NyUm91dGVzLnB1c2gocm91dGUpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0U1NSUm91dGVzKCk6IFNTUlJvdXRlW10ge1xuICByZXR1cm4gc3NyUm91dGVzO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gY2xlYXJTU1JSb3V0ZXMoKTogdm9pZCB7XG4gIHNzclJvdXRlcy5sZW5ndGggPSAwO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gbWF0Y2hTU1JSb3V0ZShcbiAgdXJsOiBzdHJpbmcsXG4pOiB7IHJvdXRlOiBTU1JSb3V0ZTsgcGFyYW1zOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+IH0gfCBudWxsIHtcbiAgZm9yIChjb25zdCByb3V0ZSBvZiBzc3JSb3V0ZXMpIHtcbiAgICBjb25zdCBwYXJhbXMgPSBtYXRjaFBhdGgocm91dGUucGF0aCwgdXJsKTtcbiAgICBpZiAocGFyYW1zICE9PSBudWxsKSB7XG4gICAgICByZXR1cm4geyByb3V0ZSwgcGFyYW1zIH07XG4gICAgfVxuICB9XG4gIHJldHVybiBudWxsO1xufVxuXG4vLyDqsITri6jtlZwgcGF0aCBtYXRjaGluZ1xuZXhwb3J0IGZ1bmN0aW9uIG1hdGNoUGF0aChwYXR0ZXJuOiBzdHJpbmcsIHVybDogc3RyaW5nKTogUmVjb3JkPHN0cmluZywgc3RyaW5nPiB8IG51bGwge1xuICBjb25zdCBwYXR0ZXJuUGFydHMgPSBwYXR0ZXJuLnNwbGl0KFwiL1wiKS5maWx0ZXIoQm9vbGVhbik7XG4gIGNvbnN0IHVybFBhcnRzID0gdXJsLnNwbGl0KFwiP1wiKVswXS5zcGxpdChcIi9cIikuZmlsdGVyKEJvb2xlYW4pO1xuXG4gIGlmIChwYXR0ZXJuUGFydHMubGVuZ3RoICE9PSB1cmxQYXJ0cy5sZW5ndGgpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIGNvbnN0IHBhcmFtczogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHt9O1xuXG4gIGZvciAobGV0IGkgPSAwOyBpIDwgcGF0dGVyblBhcnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgY29uc3QgcGF0dGVyblBhcnQgPSBwYXR0ZXJuUGFydHNbaV07XG4gICAgY29uc3QgdXJsUGFydCA9IHVybFBhcnRzW2ldO1xuXG4gICAgaWYgKHBhdHRlcm5QYXJ0LnN0YXJ0c1dpdGgoXCI6XCIpKSB7XG4gICAgICBwYXJhbXNbcGF0dGVyblBhcnQuc2xpY2UoMSldID0gdXJsUGFydDtcbiAgICB9IGVsc2UgaWYgKHBhdHRlcm5QYXJ0ICE9PSB1cmxQYXJ0KSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gcGFyYW1zO1xufVxuIl0sIm1hcHBpbmdzIjoiOztBQUlBLFNBQWdCLFlBQVksT0FBdUI7Q0FDakQsVUFBVSxLQUFLLEtBQUs7QUFDdEI7QUFFQSxTQUFnQixlQUEyQjtDQUN6QyxPQUFPO0FBQ1Q7QUFFQSxTQUFnQixpQkFBdUI7Q0FDckMsVUFBVSxTQUFTO0FBQ3JCO0FBRUEsU0FBZ0IsY0FDZCxLQUM0RDtDQUM1RCxLQUFLLE1BQU0sU0FBUyxXQUFXO0VBQzdCLE1BQU0sU0FBUyxVQUFVLE1BQU0sTUFBTSxHQUFHO0VBQ3hDLElBQUksV0FBVyxNQUNiLE9BQU87R0FBRTtHQUFPO0VBQU87Q0FFM0I7Q0FDQSxPQUFPO0FBQ1Q7QUFHQSxTQUFnQixVQUFVLFNBQWlCLEtBQTRDO0NBQ3JGLE1BQU0sZUFBZSxRQUFRLE1BQU0sR0FBRyxDQUFDLENBQUMsT0FBTyxPQUFPO0NBQ3RELE1BQU0sV0FBVyxJQUFJLE1BQU0sR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsT0FBTyxPQUFPO0NBRTVELElBQUksYUFBYSxXQUFXLFNBQVMsUUFDbkMsT0FBTztDQUdULE1BQU0sU0FBaUMsQ0FBQztDQUV4QyxLQUFLLElBQUksSUFBSSxHQUFHLElBQUksYUFBYSxRQUFRLEtBQUs7RUFDNUMsTUFBTSxjQUFjLGFBQWE7RUFDakMsTUFBTSxVQUFVLFNBQVM7RUFFekIsSUFBSSxZQUFZLFdBQVcsR0FBRyxHQUM1QixPQUFPLFlBQVksTUFBTSxDQUFDLEtBQUs7T0FDMUIsSUFBSSxnQkFBZ0IsU0FDekIsT0FBTztDQUVYO0NBRUEsT0FBTztBQUNUOzs7Q0FqRE0sWUFBd0IsQ0FBQyJ9
@@ -1,7 +1,6 @@
1
- import { __esmMin } from "../_virtual/rolldown_runtime.js";
1
+ import { __esmMin } from "../_virtual/_rolldown/runtime.js";
2
2
  import { applyCacheHeaders, init_cache_control } from "../cache-control/cache-control.js";
3
3
  import path from "node:path";
4
-
5
4
  //#region src/ssr/renderer.ts
6
5
  async function renderSSR(url, route, params, request, reply, config, vite) {
7
6
  const { Sonamu } = await import("../api/sonamu.js");
@@ -29,27 +28,21 @@ async function renderSSR(url, route, params, request, reply, config, vite) {
29
28
  const fs = await import("node:fs/promises");
30
29
  const indexHtmlPath = path.join(vite.config.root, "index.html");
31
30
  const originalHtml = await fs.readFile(indexHtmlPath, "utf-8");
32
- const transformedHtml = await vite.transformIndexHtml(url, originalHtml);
33
- viteScripts = extractScriptTags(transformedHtml);
34
- const entryModule = await vite.ssrLoadModule("/src/entry-server.generated.tsx");
35
- render = entryModule.render;
31
+ viteScripts = extractScriptTags(await vite.transformIndexHtml(url, originalHtml));
32
+ render = (await vite.ssrLoadModule("/src/entry-server.generated.tsx")).render;
36
33
  } else {
37
34
  const fs = await import("node:fs");
38
35
  const webDistPath = path.join(Sonamu.apiRootPath, "web-dist", "client");
39
36
  const ssrPath = path.join(Sonamu.apiRootPath, "web-dist", "server");
40
- const builtHtml = fs.readFileSync(path.join(webDistPath, "index.html"), "utf-8");
41
- viteScripts = extractScriptTags(builtHtml);
42
- const entryModule = await import(path.join(ssrPath, "entry-server.generated.js"));
43
- render = entryModule.render;
37
+ viteScripts = extractScriptTags(fs.readFileSync(path.join(webDistPath, "index.html"), "utf-8"));
38
+ render = (await import(path.join(ssrPath, "entry-server.generated.js"))).render;
44
39
  }
45
40
  const { html: fullDocHtml, dehydratedState } = await render(url, preloadedData);
46
41
  const ssrDataScript = dehydratedState ? `<script>window.__SONAMU_SSR__ = ${JSON.stringify(dehydratedState).replace(/</g, "\\u003c")};<\/script>` : "";
47
42
  const ssrConfigScript = route.disableHydrate ? `<script>window.__SONAMU_SSR_CONFIG__ = ${JSON.stringify({ disableHydrate: true })};<\/script>` : "";
48
43
  const finalHtml = fullDocHtml.replace("</body>", `${ssrConfigScript}\n${ssrDataScript}\n${viteScripts}\n</body>`);
49
44
  const ssrCacheConfig = getSSRCacheControl(url, route, request, config);
50
- if (ssrCacheConfig) {
51
- applyCacheHeaders(reply, ssrCacheConfig);
52
- }
45
+ if (ssrCacheConfig) applyCacheHeaders(reply, ssrCacheConfig);
53
46
  return finalHtml;
54
47
  }
55
48
  /**
@@ -57,9 +50,7 @@ async function renderSSR(url, route, params, request, reply, config, vite) {
57
50
  * 우선순위: 개별 지정 > cacheControlHandler
58
51
  */
59
52
  function getSSRCacheControl(url, route, request, config) {
60
- if (route.cacheControl) {
61
- return route.cacheControl;
62
- }
53
+ if (route.cacheControl) return route.cacheControl;
63
54
  if (config.cacheControlHandler) {
64
55
  const cacheReq = {
65
56
  type: "ssr",
@@ -77,15 +68,13 @@ function getSSRCacheControl(url, route, request, config) {
77
68
  * HTML에서 <script>, <link> 태그를 추출
78
69
  */
79
70
  function extractScriptTags(html) {
80
- const scriptRegex = /<script[^>]*>[\s\S]*?<\/script>|<link[^>]*>/gi;
81
- const matches = html.match(scriptRegex) || [];
82
- return matches.join("\n");
71
+ return (html.match(/<script[^>]*>[\s\S]*?<\/script>|<link[^>]*>/gi) || []).join("\n");
83
72
  }
84
73
  var init_renderer = __esmMin((() => {
85
74
  init_cache_control();
86
75
  }));
87
-
88
76
  //#endregion
89
77
  init_renderer();
90
78
  export { init_renderer, renderSSR };
91
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVuZGVyZXIuanMiLCJuYW1lcyI6WyJwcmVsb2FkZWREYXRhOiBQcmVsb2FkZWREYXRhW10iLCJ2aXRlU2NyaXB0czogc3RyaW5nIiwicmVuZGVyOiAoXG4gICAgdXJsOiBzdHJpbmcsXG4gICAgcHJlbG9hZGVkRGF0YTogUHJlbG9hZGVkRGF0YVtdLFxuICApID0+IFByb21pc2U8eyBodG1sOiBzdHJpbmc7IGRlaHlkcmF0ZWRTdGF0ZTogdW5rbm93biB9PiIsImNhY2hlUmVxOiBDYWNoZUNvbnRyb2xSZXF1ZXN0Il0sInNvdXJjZXMiOlsiLi4vLi4vc3JjL3Nzci9yZW5kZXJlci50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgcGF0aCBmcm9tIFwibm9kZTpwYXRoXCI7XG5cbmltcG9ydCB7IHR5cGUgRmFzdGlmeVJlcGx5LCB0eXBlIEZhc3RpZnlSZXF1ZXN0IH0gZnJvbSBcImZhc3RpZnlcIjtcbmltcG9ydCB7IHR5cGUgVml0ZURldlNlcnZlciB9IGZyb20gXCJ2aXRlXCI7XG5cbmltcG9ydCB7IGFwcGx5Q2FjaGVIZWFkZXJzIH0gZnJvbSBcIi4uL2NhY2hlLWNvbnRyb2wvY2FjaGUtY29udHJvbFwiO1xuaW1wb3J0IHsgdHlwZSBDYWNoZUNvbnRyb2xSZXF1ZXN0IH0gZnJvbSBcIi4uL2NhY2hlLWNvbnRyb2wvdHlwZXNcIjtcbmltcG9ydCB7IHR5cGUgU29uYW11RmFzdGlmeUNvbmZpZyB9IGZyb20gXCIuLi90eXBlcy90eXBlc1wiO1xuaW1wb3J0IHsgdHlwZSBQcmVsb2FkZWREYXRhLCB0eXBlIFNTUlJvdXRlIH0gZnJvbSBcIi4vdHlwZXNcIjtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHJlbmRlclNTUihcbiAgdXJsOiBzdHJpbmcsXG4gIHJvdXRlOiBTU1JSb3V0ZSxcbiAgcGFyYW1zOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+LFxuICByZXF1ZXN0OiBGYXN0aWZ5UmVxdWVzdCxcbiAgcmVwbHk6IEZhc3RpZnlSZXBseSxcbiAgY29uZmlnOiBTb25hbXVGYXN0aWZ5Q29uZmlnLFxuICB2aXRlPzogVml0ZURldlNlcnZlcixcbik6IFByb21pc2U8c3RyaW5nPiB7XG4gIGNvbnN0IHsgU29uYW11IH0gPSBhd2FpdCBpbXBvcnQoXCIuLi9hcGkvc29uYW11XCIpO1xuXG4gIC8vIDEuIHByZWxvYWQg7Iuk7ZaJIOKGkiBTU1JRdWVyeVtdIO2ajeuTnSAoZGV2L3Byb2Qg6rO17Ya1KVxuICBjb25zdCBwcmVsb2FkQ29uZmlnID0gcm91dGUucHJlbG9hZCA/IHJvdXRlLnByZWxvYWQocGFyYW1zKSA6IFtdO1xuICBjb25zdCBwcmVsb2FkZWREYXRhOiBQcmVsb2FkZWREYXRhW10gPSBbXTtcblxuICBmb3IgKGNvbnN0IHsgbW9kZWxOYW1lLCBtZXRob2ROYW1lLCBwYXJhbXM6IGFwaVBhcmFtcywgc2VydmljZUtleSB9IG9mIHByZWxvYWRDb25maWcpIHtcbiAgICBjb25zdCBhcGkgPSBTb25hbXUuc3luY2VyLmFwaXMuZmluZChcbiAgICAgIChhKSA9PiBhLm1vZGVsTmFtZSA9PT0gbW9kZWxOYW1lICYmIGEubWV0aG9kTmFtZSA9PT0gbWV0aG9kTmFtZSxcbiAgICApO1xuXG4gICAgaWYgKCFhcGkpIHtcbiAgICAgIGNvbnNvbGUud2FybihgQVBJIG5vdCBmb3VuZDogJHttb2RlbE5hbWV9LiR7bWV0aG9kTmFtZX1gKTtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIHRyeSB7XG4gICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBTb25hbXUuaW52b2tlQXBpRm9yU1NSKGFwaSwgYXBpUGFyYW1zLCBjb25maWcsIHJlcXVlc3QsIHJlcGx5KTtcbiAgICAgIHByZWxvYWRlZERhdGEucHVzaCh7XG4gICAgICAgIHF1ZXJ5S2V5OiBbLi4uc2VydmljZUtleSwgLi4uYXBpUGFyYW1zXSxcbiAgICAgICAgZGF0YTogcmVzdWx0LFxuICAgICAgfSk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgY29uc29sZS5lcnJvcihgRmFpbGVkIHRvIHByZWxvYWQgJHttb2RlbE5hbWV9LiR7bWV0aG9kTmFtZX06YCwgZSk7XG4gICAgfVxuICB9XG5cbiAgLy8gMi4gRGV2L1Byb2Qg7Iqk7YGs66a97Yq4IOy2lOy2nFxuICBsZXQgdml0ZVNjcmlwdHM6IHN0cmluZztcbiAgbGV0IHJlbmRlcjogKFxuICAgIHVybDogc3RyaW5nLFxuICAgIHByZWxvYWRlZERhdGE6IFByZWxvYWRlZERhdGFbXSxcbiAgKSA9PiBQcm9taXNlPHsgaHRtbDogc3RyaW5nOyBkZWh5ZHJhdGVkU3RhdGU6IHVua25vd24gfT47XG5cbiAgaWYgKHZpdGUpIHtcbiAgICAvLyBEZXY6IFZpdGUgRGV2IFNlcnZlclxuICAgIGNvbnN0IGZzID0gYXdhaXQgaW1wb3J0KFwibm9kZTpmcy9wcm9taXNlc1wiKTtcbiAgICBjb25zdCBpbmRleEh0bWxQYXRoID0gcGF0aC5qb2luKHZpdGUuY29uZmlnLnJvb3QsIFwiaW5kZXguaHRtbFwiKTtcbiAgICBjb25zdCBvcmlnaW5hbEh0bWwgPSBhd2FpdCBmcy5yZWFkRmlsZShpbmRleEh0bWxQYXRoLCBcInV0Zi04XCIpO1xuICAgIGNvbnN0IHRyYW5zZm9ybWVkSHRtbCA9IGF3YWl0IHZpdGUudHJhbnNmb3JtSW5kZXhIdG1sKHVybCwgb3JpZ2luYWxIdG1sKTtcblxuICAgIC8vIFZpdGXqsIAg7KO87J6F7ZWcIOyKpO2BrOumve2KuCDstpTstpxcbiAgICB2aXRlU2NyaXB0cyA9IGV4dHJhY3RTY3JpcHRUYWdzKHRyYW5zZm9ybWVkSHRtbCk7XG5cbiAgICBjb25zdCBlbnRyeU1vZHVsZSA9IGF3YWl0IHZpdGUuc3NyTG9hZE1vZHVsZShcIi9zcmMvZW50cnktc2VydmVyLmdlbmVyYXRlZC50c3hcIik7XG4gICAgcmVuZGVyID0gZW50cnlNb2R1bGUucmVuZGVyO1xuICB9IGVsc2Uge1xuICAgIC8vIFByb2Q6IOu5jOuTnOuQnCDtjIzsnbxcbiAgICBjb25zdCBmcyA9IGF3YWl0IGltcG9ydChcIm5vZGU6ZnNcIik7XG4gICAgY29uc3Qgd2ViRGlzdFBhdGggPSBwYXRoLmpvaW4oU29uYW11LmFwaVJvb3RQYXRoLCBcIndlYi1kaXN0XCIsIFwiY2xpZW50XCIpO1xuICAgIGNvbnN0IHNzclBhdGggPSBwYXRoLmpvaW4oU29uYW11LmFwaVJvb3RQYXRoLCBcIndlYi1kaXN0XCIsIFwic2VydmVyXCIpO1xuXG4gICAgLy8g67mM65Oc65CcIGluZGV4Lmh0bWzsl5DshJwg7Iqk7YGs66a97Yq4IOy2lOy2nFxuICAgIGNvbnN0IGJ1aWx0SHRtbCA9IGZzLnJlYWRGaWxlU3luYyhwYXRoLmpvaW4od2ViRGlzdFBhdGgsIFwiaW5kZXguaHRtbFwiKSwgXCJ1dGYtOFwiKTtcbiAgICB2aXRlU2NyaXB0cyA9IGV4dHJhY3RTY3JpcHRUYWdzKGJ1aWx0SHRtbCk7XG5cbiAgICBjb25zdCBlbnRyeU1vZHVsZSA9IGF3YWl0IGltcG9ydChwYXRoLmpvaW4oc3NyUGF0aCwgXCJlbnRyeS1zZXJ2ZXIuZ2VuZXJhdGVkLmpzXCIpKTtcbiAgICByZW5kZXIgPSBlbnRyeU1vZHVsZS5yZW5kZXI7XG4gIH1cblxuICAvLyAzLiBSb3V0ZXJQcm92aWRlciDroIzrjZTrp4EgKGZ1bGwgZG9jdW1lbnQpXG4gIGNvbnN0IHsgaHRtbDogZnVsbERvY0h0bWwsIGRlaHlkcmF0ZWRTdGF0ZSB9ID0gYXdhaXQgcmVuZGVyKHVybCwgcHJlbG9hZGVkRGF0YSk7XG5cbiAgLy8gNC4gU1NSIOuNsOydtO2EsCDsiqTtgazrpr3tirgg7IOd7ISxXG4gIGNvbnN0IHNzckRhdGFTY3JpcHQgPSBkZWh5ZHJhdGVkU3RhdGVcbiAgICA/IGA8c2NyaXB0PndpbmRvdy5fX1NPTkFNVV9TU1JfXyA9ICR7SlNPTi5zdHJpbmdpZnkoZGVoeWRyYXRlZFN0YXRlKS5yZXBsYWNlKC88L2csIFwiXFxcXHUwMDNjXCIpfTs8L3NjcmlwdD5gXG4gICAgOiBcIlwiO1xuXG4gIC8vIDUuIFNTUiBDb25maWcg7Iqk7YGs66a97Yq4IOyDneyEsSAoZGlzYWJsZUh5ZHJhdGUpXG4gIGNvbnN0IHNzckNvbmZpZ1NjcmlwdCA9IHJvdXRlLmRpc2FibGVIeWRyYXRlXG4gICAgPyBgPHNjcmlwdD53aW5kb3cuX19TT05BTVVfU1NSX0NPTkZJR19fID0gJHtKU09OLnN0cmluZ2lmeSh7IGRpc2FibGVIeWRyYXRlOiB0cnVlIH0pfTs8L3NjcmlwdD5gXG4gICAgOiBcIlwiO1xuXG4gIC8vIDYuIFZpdGUg7Iqk7YGs66a97Yq47JmAIFNTUiDrjbDsnbTthLDrpbwgPC9ib2R5PiDsp4HsoITsl5Ag7KO87J6FXG4gIGNvbnN0IGZpbmFsSHRtbCA9IGZ1bGxEb2NIdG1sLnJlcGxhY2UoXG4gICAgXCI8L2JvZHk+XCIsXG4gICAgYCR7c3NyQ29uZmlnU2NyaXB0fVxcbiR7c3NyRGF0YVNjcmlwdH1cXG4ke3ZpdGVTY3JpcHRzfVxcbjwvYm9keT5gLFxuICApO1xuXG4gIC8vIDcuIENhY2hlLUNvbnRyb2wg7Zek642UIOyEpOyglVxuICBjb25zdCBzc3JDYWNoZUNvbmZpZyA9IGdldFNTUkNhY2hlQ29udHJvbCh1cmwsIHJvdXRlLCByZXF1ZXN0LCBjb25maWcpO1xuICBpZiAoc3NyQ2FjaGVDb25maWcpIHtcbiAgICBhcHBseUNhY2hlSGVhZGVycyhyZXBseSwgc3NyQ2FjaGVDb25maWcpO1xuICB9XG5cbiAgcmV0dXJuIGZpbmFsSHRtbDtcbn1cblxuLyoqXG4gKiBTU1Ig7J2R64u17JeQIOyggeyaqe2VoCBDYWNoZS1Db250cm9sIOyEpOygleydhCDqsrDsoJXtlanri4jri6QuXG4gKiDsmrDshKDsiJzsnIQ6IOqwnOuzhCDsp4DsoJUgPiBjYWNoZUNvbnRyb2xIYW5kbGVyXG4gKi9cbmZ1bmN0aW9uIGdldFNTUkNhY2hlQ29udHJvbChcbiAgdXJsOiBzdHJpbmcsXG4gIHJvdXRlOiBTU1JSb3V0ZSxcbiAgcmVxdWVzdDogRmFzdGlmeVJlcXVlc3QsXG4gIGNvbmZpZzogU29uYW11RmFzdGlmeUNvbmZpZyxcbikge1xuICAvLyDqsJzrs4Qg7KeA7KCVIChyZWdpc3RlclNTUi5jYWNoZUNvbnRyb2wpXG4gIGlmIChyb3V0ZS5jYWNoZUNvbnRyb2wpIHtcbiAgICByZXR1cm4gcm91dGUuY2FjaGVDb250cm9sO1xuICB9XG5cbiAgLy8g7KCE7JetIO2VuOuTpOufrFxuICBpZiAoY29uZmlnLmNhY2hlQ29udHJvbEhhbmRsZXIpIHtcbiAgICBjb25zdCBjYWNoZVJlcTogQ2FjaGVDb250cm9sUmVxdWVzdCA9IHtcbiAgICAgIHR5cGU6IFwic3NyXCIsXG4gICAgICB1cmw6IHJlcXVlc3QudXJsLFxuICAgICAgcGF0aDogdXJsLnNwbGl0KFwiP1wiKVswXSxcbiAgICAgIG1ldGhvZDogcmVxdWVzdC5tZXRob2QsXG4gICAgICByb3V0ZSxcbiAgICB9O1xuICAgIGNvbnN0IHJlc3VsdCA9IGNvbmZpZy5jYWNoZUNvbnRyb2xIYW5kbGVyKGNhY2hlUmVxKTtcbiAgICBpZiAocmVzdWx0KSByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgcmV0dXJuIG51bGw7XG59XG5cbi8qKlxuICogSFRNTOyXkOyEnCA8c2NyaXB0PiwgPGxpbms+IO2DnOq3uOulvCDstpTstpxcbiAqL1xuZnVuY3Rpb24gZXh0cmFjdFNjcmlwdFRhZ3MoaHRtbDogc3RyaW5nKTogc3RyaW5nIHtcbiAgY29uc3Qgc2NyaXB0UmVnZXggPSAvPHNjcmlwdFtePl0qPltcXHNcXFNdKj88XFwvc2NyaXB0Pnw8bGlua1tePl0qPi9naTtcbiAgY29uc3QgbWF0Y2hlcyA9IGh0bWwubWF0Y2goc2NyaXB0UmVnZXgpIHx8IFtdO1xuICByZXR1cm4gbWF0Y2hlcy5qb2luKFwiXFxuXCIpO1xufVxuIl0sIm1hcHBpbmdzIjoiOzs7OztBQVVBLGVBQXNCLFVBQ3BCLEtBQ0EsT0FDQSxRQUNBLFNBQ0EsT0FDQSxRQUNBLE1BQ2lCO0NBQ2pCLE1BQU0sRUFBRSxXQUFXLE1BQU0sT0FBTztDQUdoQyxNQUFNLGdCQUFnQixNQUFNLFVBQVUsTUFBTSxRQUFRLE9BQU8sR0FBRyxFQUFFO0NBQ2hFLE1BQU1BLGdCQUFpQyxFQUFFO0FBRXpDLE1BQUssTUFBTSxFQUFFLFdBQVcsWUFB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
79
+
80
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVuZGVyZXIuanMiLCJuYW1lcyI6W10sInNvdXJjZXMiOlsiLi4vLi4vc3JjL3Nzci9yZW5kZXJlci50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgcGF0aCBmcm9tIFwibm9kZTpwYXRoXCI7XG5cbmltcG9ydCB7IHR5cGUgRmFzdGlmeVJlcGx5LCB0eXBlIEZhc3RpZnlSZXF1ZXN0IH0gZnJvbSBcImZhc3RpZnlcIjtcbmltcG9ydCB7IHR5cGUgVml0ZURldlNlcnZlciB9IGZyb20gXCJ2aXRlXCI7XG5cbmltcG9ydCB7IGFwcGx5Q2FjaGVIZWFkZXJzIH0gZnJvbSBcIi4uL2NhY2hlLWNvbnRyb2wvY2FjaGUtY29udHJvbFwiO1xuaW1wb3J0IHsgdHlwZSBDYWNoZUNvbnRyb2xSZXF1ZXN0IH0gZnJvbSBcIi4uL2NhY2hlLWNvbnRyb2wvdHlwZXNcIjtcbmltcG9ydCB7IHR5cGUgU29uYW11RmFzdGlmeUNvbmZpZyB9IGZyb20gXCIuLi90eXBlcy90eXBlc1wiO1xuaW1wb3J0IHsgdHlwZSBQcmVsb2FkZWREYXRhLCB0eXBlIFNTUlJvdXRlIH0gZnJvbSBcIi4vdHlwZXNcIjtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHJlbmRlclNTUihcbiAgdXJsOiBzdHJpbmcsXG4gIHJvdXRlOiBTU1JSb3V0ZSxcbiAgcGFyYW1zOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+LFxuICByZXF1ZXN0OiBGYXN0aWZ5UmVxdWVzdCxcbiAgcmVwbHk6IEZhc3RpZnlSZXBseSxcbiAgY29uZmlnOiBTb25hbXVGYXN0aWZ5Q29uZmlnLFxuICB2aXRlPzogVml0ZURldlNlcnZlcixcbik6IFByb21pc2U8c3RyaW5nPiB7XG4gIGNvbnN0IHsgU29uYW11IH0gPSBhd2FpdCBpbXBvcnQoXCIuLi9hcGkvc29uYW11XCIpO1xuXG4gIC8vIDEuIHByZWxvYWQg7Iuk7ZaJIOKGkiBTU1JRdWVyeVtdIO2ajeuTnSAoZGV2L3Byb2Qg6rO17Ya1KVxuICBjb25zdCBwcmVsb2FkQ29uZmlnID0gcm91dGUucHJlbG9hZCA/IHJvdXRlLnByZWxvYWQocGFyYW1zKSA6IFtdO1xuICBjb25zdCBwcmVsb2FkZWREYXRhOiBQcmVsb2FkZWREYXRhW10gPSBbXTtcblxuICBmb3IgKGNvbnN0IHsgbW9kZWxOYW1lLCBtZXRob2ROYW1lLCBwYXJhbXM6IGFwaVBhcmFtcywgc2VydmljZUtleSB9IG9mIHByZWxvYWRDb25maWcpIHtcbiAgICBjb25zdCBhcGkgPSBTb25hbXUuc3luY2VyLmFwaXMuZmluZChcbiAgICAgIChhKSA9PiBhLm1vZGVsTmFtZSA9PT0gbW9kZWxOYW1lICYmIGEubWV0aG9kTmFtZSA9PT0gbWV0aG9kTmFtZSxcbiAgICApO1xuXG4gICAgaWYgKCFhcGkpIHtcbiAgICAgIGNvbnNvbGUud2FybihgQVBJIG5vdCBmb3VuZDogJHttb2RlbE5hbWV9LiR7bWV0aG9kTmFtZX1gKTtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIHRyeSB7XG4gICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBTb25hbXUuaW52b2tlQXBpRm9yU1NSKGFwaSwgYXBpUGFyYW1zLCBjb25maWcsIHJlcXVlc3QsIHJlcGx5KTtcbiAgICAgIHByZWxvYWRlZERhdGEucHVzaCh7XG4gICAgICAgIHF1ZXJ5S2V5OiBbLi4uc2VydmljZUtleSwgLi4uYXBpUGFyYW1zXSxcbiAgICAgICAgZGF0YTogcmVzdWx0LFxuICAgICAgfSk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgY29uc29sZS5lcnJvcihgRmFpbGVkIHRvIHByZWxvYWQgJHttb2RlbE5hbWV9LiR7bWV0aG9kTmFtZX06YCwgZSk7XG4gICAgfVxuICB9XG5cbiAgLy8gMi4gRGV2L1Byb2Qg7Iqk7YGs66a97Yq4IOy2lOy2nFxuICBsZXQgdml0ZVNjcmlwdHM6IHN0cmluZztcbiAgbGV0IHJlbmRlcjogKFxuICAgIHVybDogc3RyaW5nLFxuICAgIHByZWxvYWRlZERhdGE6IFByZWxvYWRlZERhdGFbXSxcbiAgKSA9PiBQcm9taXNlPHsgaHRtbDogc3RyaW5nOyBkZWh5ZHJhdGVkU3RhdGU6IHVua25vd24gfT47XG5cbiAgaWYgKHZpdGUpIHtcbiAgICAvLyBEZXY6IFZpdGUgRGV2IFNlcnZlclxuICAgIGNvbnN0IGZzID0gYXdhaXQgaW1wb3J0KFwibm9kZTpmcy9wcm9taXNlc1wiKTtcbiAgICBjb25zdCBpbmRleEh0bWxQYXRoID0gcGF0aC5qb2luKHZpdGUuY29uZmlnLnJvb3QsIFwiaW5kZXguaHRtbFwiKTtcbiAgICBjb25zdCBvcmlnaW5hbEh0bWwgPSBhd2FpdCBmcy5yZWFkRmlsZShpbmRleEh0bWxQYXRoLCBcInV0Zi04XCIpO1xuICAgIGNvbnN0IHRyYW5zZm9ybWVkSHRtbCA9IGF3YWl0IHZpdGUudHJhbnNmb3JtSW5kZXhIdG1sKHVybCwgb3JpZ2luYWxIdG1sKTtcblxuICAgIC8vIFZpdGXqsIAg7KO87J6F7ZWcIOyKpO2BrOumve2KuCDstpTstpxcbiAgICB2aXRlU2NyaXB0cyA9IGV4dHJhY3RTY3JpcHRUYWdzKHRyYW5zZm9ybWVkSHRtbCk7XG5cbiAgICBjb25zdCBlbnRyeU1vZHVsZSA9IGF3YWl0IHZpdGUuc3NyTG9hZE1vZHVsZShcIi9zcmMvZW50cnktc2VydmVyLmdlbmVyYXRlZC50c3hcIik7XG4gICAgcmVuZGVyID0gZW50cnlNb2R1bGUucmVuZGVyO1xuICB9IGVsc2Uge1xuICAgIC8vIFByb2Q6IOu5jOuTnOuQnCDtjIzsnbxcbiAgICBjb25zdCBmcyA9IGF3YWl0IGltcG9ydChcIm5vZGU6ZnNcIik7XG4gICAgY29uc3Qgd2ViRGlzdFBhdGggPSBwYXRoLmpvaW4oU29uYW11LmFwaVJvb3RQYXRoLCBcIndlYi1kaXN0XCIsIFwiY2xpZW50XCIpO1xuICAgIGNvbnN0IHNzclBhdGggPSBwYXRoLmpvaW4oU29uYW11LmFwaVJvb3RQYXRoLCBcIndlYi1kaXN0XCIsIFwic2VydmVyXCIpO1xuXG4gICAgLy8g67mM65Oc65CcIGluZGV4Lmh0bWzsl5DshJwg7Iqk7YGs66a97Yq4IOy2lOy2nFxuICAgIGNvbnN0IGJ1aWx0SHRtbCA9IGZzLnJlYWRGaWxlU3luYyhwYXRoLmpvaW4od2ViRGlzdFBhdGgsIFwiaW5kZXguaHRtbFwiKSwgXCJ1dGYtOFwiKTtcbiAgICB2aXRlU2NyaXB0cyA9IGV4dHJhY3RTY3JpcHRUYWdzKGJ1aWx0SHRtbCk7XG5cbiAgICBjb25zdCBlbnRyeU1vZHVsZSA9IGF3YWl0IGltcG9ydChwYXRoLmpvaW4oc3NyUGF0aCwgXCJlbnRyeS1zZXJ2ZXIuZ2VuZXJhdGVkLmpzXCIpKTtcbiAgICByZW5kZXIgPSBlbnRyeU1vZHVsZS5yZW5kZXI7XG4gIH1cblxuICAvLyAzLiBSb3V0ZXJQcm92aWRlciDroIzrjZTrp4EgKGZ1bGwgZG9jdW1lbnQpXG4gIGNvbnN0IHsgaHRtbDogZnVsbERvY0h0bWwsIGRlaHlkcmF0ZWRTdGF0ZSB9ID0gYXdhaXQgcmVuZGVyKHVybCwgcHJlbG9hZGVkRGF0YSk7XG5cbiAgLy8gNC4gU1NSIOuNsOydtO2EsCDsiqTtgazrpr3tirgg7IOd7ISxXG4gIGNvbnN0IHNzckRhdGFTY3JpcHQgPSBkZWh5ZHJhdGVkU3RhdGVcbiAgICA/IGA8c2NyaXB0PndpbmRvdy5fX1NPTkFNVV9TU1JfXyA9ICR7SlNPTi5zdHJpbmdpZnkoZGVoeWRyYXRlZFN0YXRlKS5yZXBsYWNlKC88L2csIFwiXFxcXHUwMDNjXCIpfTs8L3NjcmlwdD5gXG4gICAgOiBcIlwiO1xuXG4gIC8vIDUuIFNTUiBDb25maWcg7Iqk7YGs66a97Yq4IOyDneyEsSAoZGlzYWJsZUh5ZHJhdGUpXG4gIGNvbnN0IHNzckNvbmZpZ1NjcmlwdCA9IHJvdXRlLmRpc2FibGVIeWRyYXRlXG4gICAgPyBgPHNjcmlwdD53aW5kb3cuX19TT05BTVVfU1NSX0NPTkZJR19fID0gJHtKU09OLnN0cmluZ2lmeSh7IGRpc2FibGVIeWRyYXRlOiB0cnVlIH0pfTs8L3NjcmlwdD5gXG4gICAgOiBcIlwiO1xuXG4gIC8vIDYuIFZpdGUg7Iqk7YGs66a97Yq47JmAIFNTUiDrjbDsnbTthLDrpbwgPC9ib2R5PiDsp4HsoITsl5Ag7KO87J6FXG4gIGNvbnN0IGZpbmFsSHRtbCA9IGZ1bGxEb2NIdG1sLnJlcGxhY2UoXG4gICAgXCI8L2JvZHk+XCIsXG4gICAgYCR7c3NyQ29uZmlnU2NyaXB0fVxcbiR7c3NyRGF0YVNjcmlwdH1cXG4ke3ZpdGVTY3JpcHRzfVxcbjwvYm9keT5gLFxuICApO1xuXG4gIC8vIDcuIENhY2hlLUNvbnRyb2wg7Zek642UIOyEpOyglVxuICBjb25zdCBzc3JDYWNoZUNvbmZpZyA9IGdldFNTUkNhY2hlQ29udHJvbCh1cmwsIHJvdXRlLCByZXF1ZXN0LCBjb25maWcpO1xuICBpZiAoc3NyQ2FjaGVDb25maWcpIHtcbiAgICBhcHBseUNhY2hlSGVhZGVycyhyZXBseSwgc3NyQ2FjaGVDb25maWcpO1xuICB9XG5cbiAgcmV0dXJuIGZpbmFsSHRtbDtcbn1cblxuLyoqXG4gKiBTU1Ig7J2R64u17JeQIOyggeyaqe2VoCBDYWNoZS1Db250cm9sIOyEpOygleydhCDqsrDsoJXtlanri4jri6QuXG4gKiDsmrDshKDsiJzsnIQ6IOqwnOuzhCDsp4DsoJUgPiBjYWNoZUNvbnRyb2xIYW5kbGVyXG4gKi9cbmZ1bmN0aW9uIGdldFNTUkNhY2hlQ29udHJvbChcbiAgdXJsOiBzdHJpbmcsXG4gIHJvdXRlOiBTU1JSb3V0ZSxcbiAgcmVxdWVzdDogRmFzdGlmeVJlcXVlc3QsXG4gIGNvbmZpZzogU29uYW11RmFzdGlmeUNvbmZpZyxcbikge1xuICAvLyDqsJzrs4Qg7KeA7KCVIChyZWdpc3RlclNTUi5jYWNoZUNvbnRyb2wpXG4gIGlmIChyb3V0ZS5jYWNoZUNvbnRyb2wpIHtcbiAgICByZXR1cm4gcm91dGUuY2FjaGVDb250cm9sO1xuICB9XG5cbiAgLy8g7KCE7JetIO2VuOuTpOufrFxuICBpZiAoY29uZmlnLmNhY2hlQ29udHJvbEhhbmRsZXIpIHtcbiAgICBjb25zdCBjYWNoZVJlcTogQ2FjaGVDb250cm9sUmVxdWVzdCA9IHtcbiAgICAgIHR5cGU6IFwic3NyXCIsXG4gICAgICB1cmw6IHJlcXVlc3QudXJsLFxuICAgICAgcGF0aDogdXJsLnNwbGl0KFwiP1wiKVswXSxcbiAgICAgIG1ldGhvZDogcmVxdWVzdC5tZXRob2QsXG4gICAgICByb3V0ZSxcbiAgICB9O1xuICAgIGNvbnN0IHJlc3VsdCA9IGNvbmZpZy5jYWNoZUNvbnRyb2xIYW5kbGVyKGNhY2hlUmVxKTtcbiAgICBpZiAocmVzdWx0KSByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgcmV0dXJuIG51bGw7XG59XG5cbi8qKlxuICogSFRNTOyXkOyEnCA8c2NyaXB0PiwgPGxpbms+IO2DnOq3uOulvCDstpTstpxcbiAqL1xuZnVuY3Rpb24gZXh0cmFjdFNjcmlwdFRhZ3MoaHRtbDogc3RyaW5nKTogc3RyaW5nIHtcbiAgY29uc3Qgc2NyaXB0UmVnZXggPSAvPHNjcmlwdFtePl0qPltcXHNcXFNdKj88XFwvc2NyaXB0Pnw8bGlua1tePl0qPi9naTtcbiAgY29uc3QgbWF0Y2hlcyA9IGh0bWwubWF0Y2goc2NyaXB0UmVnZXgpIHx8IFtdO1xuICByZXR1cm4gbWF0Y2hlcy5qb2luKFwiXFxuXCIpO1xufVxuIl0sIm1hcHBpbmdzIjoiOzs7O0FBVUEsZUFBc0IsVUFDcEIsS0FDQSxPQUNBLFFBQ0EsU0FDQSxPQUNBLFFBQ0EsTUFDaUI7Q0FDakIsTUFBTSxFQUFFLFdBQVcsTUFBTSxPQUFPO0NBR2hDLE1BQU0sZ0JBQWdCLE1BQU0sVUFBVSxNQUFNLFFBQVEsTUFBTSxJQUFJLENBQUM7Q0FDL0QsTUFBTSxnQkFBaUMsQ0FBQztDQUV4QyxLQUFLLE1BQU0sRUFBRSxXQUFXLFlBQVksUUFBUSxXQUFXLGdCQUFnQixlQUFlO0VBQ3BGLE1BQU0sTUFBTSxPQUFPLE9BQU8sS0FBSyxNQUM1QixNQUFNLEVBQUUsY0FBYyxhQUFhLEVBQUUsZUFBZSxVQUN2RDtFQUVBLElBQUksQ0FBQyxLQUFLO0dBQ1IsUUFBUSxLQUFLLGtCQUFrQixVQUFVLEdBQUcsWUFBWTtHQUN4RDtFQUNGO0VBRUEsSUFBSTtHQUNGLE1BQU0sU0FBUyxNQUFNLE9BQU8sZ0JBQWdCLEtBQUssV0FBVyxRQUFRLFNBQVMsS0FBSztHQUNsRixjQUFjLEtBQUs7SUFDakIsVUFBVSxDQUFDLEdBQUcsWUFBWSxHQUFHLFNBQVM7SUFDdEMsTUFBTTtHQUNSLENBQUM7RUFDSCxTQUFTLEdBQUc7R0FDVixRQUFRLE1BQU0scUJBQXFCLFVBQVUsR0FBRyxXQUFXLElBQUksQ0FBQztFQUNsRTtDQUNGO0NBR0EsSUFBSTtDQUNKLElBQUk7Q0FLSixJQUFJLE1BQU07RUFFUixNQUFNLEtBQUssTUFBTSxPQUFPO0VBQ3hCLE1BQU0sZ0JBQWdCLEtBQUssS0FBSyxLQUFLLE9BQU8sTUFBTSxZQUFZO0VBQzlELE1BQU0sZUFBZSxNQUFNLEdBQUcsU0FBUyxlQUFlLE9BQU87RUFJN0QsY0FBYyxrQkFBa0IsTUFIRixLQUFLLG1CQUFtQixLQUFLLFlBQVksQ0FHeEI7RUFHL0MsVUFBUyxNQURpQixLQUFLLGNBQWMsaUNBQWlDLEVBQ3JFLENBQVk7Q0FDdkIsT0FBTztFQUVMLE1BQU0sS0FBSyxNQUFNLE9BQU87RUFDeEIsTUFBTSxjQUFjLEtBQUssS0FBSyxPQUFPLGFBQWEsWUFBWSxRQUFRO0VBQ3RFLE1BQU0sVUFBVSxLQUFLLEtBQUssT0FBTyxhQUFhLFlBQVksUUFBUTtFQUlsRSxjQUFjLGtCQURJLEdBQUcsYUFBYSxLQUFLLEtBQUssYUFBYSxZQUFZLEdBQUcsT0FDeEMsQ0FBUztFQUd6QyxVQUFTLE1BRGlCLE9BQU8sS0FBSyxLQUFLLFNBQVMsMkJBQTJCLEdBQ3RFLENBQVk7Q0FDdkI7Q0FHQSxNQUFNLEVBQUUsTUFBTSxhQUFhLG9CQUFvQixNQUFNLE9BQU8sS0FBSyxhQUFhO0NBRzlFLE1BQU0sZ0JBQWdCLGtCQUNsQixtQ0FBbUMsS0FBSyxVQUFVLGVBQWUsQ0FBQyxDQUFDLFFBQVEsTUFBTSxTQUFTLEVBQUUsZUFDNUY7Q0FHSixNQUFNLGtCQUFrQixNQUFNLGlCQUMxQiwwQ0FBMEMsS0FBSyxVQUFVLEVBQUUsZ0JBQWdCLEtBQUssQ0FBQyxFQUFFLGVBQ25GO0NBR0osTUFBTSxZQUFZLFlBQVksUUFDNUIsV0FDQSxHQUFHLGdCQUFnQixJQUFJLGNBQWMsSUFBSSxZQUFZLFVBQ3ZEO0NBR0EsTUFBTSxpQkFBaUIsbUJBQW1CLEtBQUssT0FBTyxTQUFTLE1BQU07Q0FDckUsSUFBSSxnQkFDRixrQkFBa0IsT0FBTyxjQUFjO0NBR3pDLE9BQU87QUFDVDs7Ozs7QUFNQSxTQUFTLG1CQUNQLEtBQ0EsT0FDQSxTQUNBLFFBQ0E7Q0FFQSxJQUFJLE1BQU0sY0FDUixPQUFPLE1BQU07Q0FJZixJQUFJLE9BQU8scUJBQXFCO0VBQzlCLE1BQU0sV0FBZ0M7R0FDcEMsTUFBTTtHQUNOLEtBQUssUUFBUTtHQUNiLE1BQU0sSUFBSSxNQUFNLEdBQUcsQ0FBQyxDQUFDO0dBQ3JCLFFBQVEsUUFBUTtHQUNoQjtFQUNGO0VBQ0EsTUFBTSxTQUFTLE9BQU8sb0JBQW9CLFFBQVE7RUFDbEQsSUFBSSxRQUFRLE9BQU87Q0FDckI7Q0FFQSxPQUFPO0FBQ1Q7Ozs7QUFLQSxTQUFTLGtCQUFrQixNQUFzQjtDQUcvQyxRQURnQixLQUFLLE1BQU0sK0NBQVcsS0FBSyxDQUFDLEVBQ3JDLENBQVEsS0FBSyxJQUFJO0FBQzFCOztvQkE1SWtFIn0=
package/dist/ssr/types.js CHANGED
@@ -1 +1 @@
1
- export { };
1
+ export {};
@@ -1,6 +1,5 @@
1
- import { __esmMin } from "../_virtual/rolldown_runtime.js";
1
+ import { __esmMin } from "../_virtual/_rolldown/runtime.js";
2
2
  import mime from "mime-types";
3
-
4
3
  //#region src/storage/base-file.ts
5
4
  var BaseFile;
6
5
  var init_base_file = __esmMin((() => {
@@ -35,22 +34,18 @@ var init_base_file = __esmMin((() => {
35
34
  }
36
35
  /** 저장된 URL (Unsigned) */
37
36
  get url() {
38
- if (this._url === undefined) {
39
- throw new Error("url이 설정되지 않았습니다.");
40
- }
37
+ if (this._url === void 0) throw new Error("url이 설정되지 않았습니다.");
41
38
  return this._url;
42
39
  }
43
40
  /** 저장된 URL (Signed) */
44
41
  get signedUrl() {
45
- if (this._signedUrl === undefined) {
46
- throw new Error("signedUrl이 설정되지 않았습니다.");
47
- }
42
+ if (this._signedUrl === void 0) throw new Error("signedUrl이 설정되지 않았습니다.");
48
43
  return this._signedUrl;
49
44
  }
50
45
  };
51
46
  }));
52
-
53
47
  //#endregion
54
48
  init_base_file();
55
49
  export { BaseFile, init_base_file };
56
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmFzZS1maWxlLmpzIiwibmFtZXMiOltdLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9zdG9yYWdlL2Jhc2UtZmlsZS50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgbWltZSBmcm9tIFwibWltZS10eXBlc1wiO1xuXG4vKipcbiAqIO2MjOydvOydmCDquLDrs7gg66mU7YOA642w7J207YSwKGZpbGVuYW1lLCBtaW1ldHlwZSwgc2l6ZSDrk7Ep7JeQIOuMgO2VnCDsoJHqt7zsnpAg7KCc6rO1XG4gKi9cbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBCYXNlRmlsZSB7XG4gIHByb3RlY3RlZCBfZmlsZW5hbWU6IHN0cmluZztcbiAgcHJvdGVjdGVkIF9taW1ldHlwZTogc3RyaW5nO1xuICBwcm90ZWN0ZWQgX3NpemU6IG51bWJlcjtcbiAgcHJvdGVjdGVkIF91cmw/OiBzdHJpbmc7XG4gIHByb3RlY3RlZCBfc2lnbmVkVXJsPzogc3RyaW5nO1xuXG4gIGNvbnN0cnVjdG9yKHBhcmFtczoge1xuICAgIGZpbGVuYW1lOiBzdHJpbmc7XG4gICAgbWltZXR5cGU6IHN0cmluZztcbiAgICBzaXplOiBudW1iZXI7XG4gICAgdXJsPzogc3RyaW5nO1xuICAgIHNpZ25lZFVybD86IHN0cmluZztcbiAgfSkge1xuICAgIHRoaXMuX2ZpbGVuYW1lID0gcGFyYW1zLmZpbGVuYW1lO1xuICAgIHRoaXMuX21pbWV0eXBlID0gcGFyYW1zLm1pbWV0eXBlO1xuICAgIHRoaXMuX3NpemUgPSBwYXJhbXMuc2l6ZTtcbiAgICB0aGlzLl91cmwgPSBwYXJhbXMudXJsO1xuICAgIHRoaXMuX3NpZ25lZFVybCA9IHBhcmFtcy5zaWduZWRVcmw7XG4gIH1cblxuICAvKiog7JuQ67O4IO2MjOydvOuqhSAqL1xuICBnZXQgZmlsZW5hbWUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5fZmlsZW5hbWU7XG4gIH1cblxuICAvKiogTUlNRSDtg4DsnoUgKi9cbiAgZ2V0IG1pbWV0eXBlKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuX21pbWV0eXBlO1xuICB9XG5cbiAgLyoqIO2MjOydvCDtgazquLAgKGJ5dGVzKSAqL1xuICBnZXQgc2l6ZSgpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLl9zaXplO1xuICB9XG5cbiAgLyoqIO2ZleyepeyekCAo7KCQIOygnOyZuCkgKi9cbiAgZ2V0IGV4dG5hbWUoKTogc3RyaW5nIHwgZmFsc2Uge1xuICAgIHJldHVybiBtaW1lLmV4dGVuc2lvbih0aGlzLl9taW1ldHlwZSk7XG4gIH1cblxuICAvKiog7KCA7J6l65CcIFVSTCAoVW5zaWduZWQpICovXG4gIGdldCB1cmwoKTogc3RyaW5nIHtcbiAgICBpZiAodGhpcy5fdXJsID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcInVybOydtCDshKTsoJXrkJjsp4Ag7JWK7JWY7Iq164uI64ukLlwiKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuX3VybDtcbiAgfVxuXG4gIC8qKiDsoIDsnqXrkJwgVVJMIChTaWduZWQpICovXG4gIGdldCBzaWduZWRVcmwoKTogc3RyaW5nIHtcbiAgICBpZiAodGhpcy5fc2lnbmVkVXJsID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcInNpZ25lZFVybOydtCDshKTsoJXrkJjsp4Ag7JWK7JWY7Iq164uI64ukLlwiKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuX3NpZ25lZFVybDtcbiAgfVxufVxuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Q0FLc0IsV0FBdEIsTUFBK0I7RUFDN0IsQUFBVTtFQUNWLEFBQVU7RUFDVixBQUFVO0VBQ1YsQUFBVTtFQUNWLEFBQVU7RUFFVixZQUFZLFFBTVQ7QUFDRCxRQUFLLFlBQVksT0FBTztBQUN4QixRQUFLLFlBQVksT0FBTztBQUN4QixRQUFLLFFBQVEsT0FBTztBQUNwQixRQUFLLE9BQU8sT0FBTztBQUNuQixRQUFLLGFBQWEsT0FBTzs7O0VBSTNCLElBQUksV0FBbUI7QUFDckIsVUFBTyxLQUFLOzs7RUFJZCxJQUFJLFdBQW1CO0FBQ3JCLFVBQU8sS0FBSzs7O0VBSWQsSUFBSSxPQUFlO0FBQ2pCLFVBQU8sS0FBSzs7O0VBSWQsSUFBSSxVQUEwQjtBQUM1QixVQUFPLEtBQUssVUFBVSxLQUFLLFVBQVU7OztFQUl2QyxJQUFJLE1BQWM7QUFDaEIsT0FBSSxLQUFLLFNBQVMsV0FBVztBQUMzQixVQUFNLElBQUksTUFBTSxtQkFBbUI7O0FBRXJDLFVBQU8sS0FBSzs7O0VBSWQsSUFBSSxZQUFvQjtBQUN0QixPQUFJLEtBQUssZUFBZSxXQUFXO0FBQ2pDLFVBQU0sSUFBSSxNQUFNLHlCQUF5Qjs7QUFFM0MsVUFBTyxLQUFLIn0=
50
+
51
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmFzZS1maWxlLmpzIiwibmFtZXMiOltdLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9zdG9yYWdlL2Jhc2UtZmlsZS50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgbWltZSBmcm9tIFwibWltZS10eXBlc1wiO1xuXG4vKipcbiAqIO2MjOydvOydmCDquLDrs7gg66mU7YOA642w7J207YSwKGZpbGVuYW1lLCBtaW1ldHlwZSwgc2l6ZSDrk7Ep7JeQIOuMgO2VnCDsoJHqt7zsnpAg7KCc6rO1XG4gKi9cbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBCYXNlRmlsZSB7XG4gIHByb3RlY3RlZCBfZmlsZW5hbWU6IHN0cmluZztcbiAgcHJvdGVjdGVkIF9taW1ldHlwZTogc3RyaW5nO1xuICBwcm90ZWN0ZWQgX3NpemU6IG51bWJlcjtcbiAgcHJvdGVjdGVkIF91cmw/OiBzdHJpbmc7XG4gIHByb3RlY3RlZCBfc2lnbmVkVXJsPzogc3RyaW5nO1xuXG4gIGNvbnN0cnVjdG9yKHBhcmFtczoge1xuICAgIGZpbGVuYW1lOiBzdHJpbmc7XG4gICAgbWltZXR5cGU6IHN0cmluZztcbiAgICBzaXplOiBudW1iZXI7XG4gICAgdXJsPzogc3RyaW5nO1xuICAgIHNpZ25lZFVybD86IHN0cmluZztcbiAgfSkge1xuICAgIHRoaXMuX2ZpbGVuYW1lID0gcGFyYW1zLmZpbGVuYW1lO1xuICAgIHRoaXMuX21pbWV0eXBlID0gcGFyYW1zLm1pbWV0eXBlO1xuICAgIHRoaXMuX3NpemUgPSBwYXJhbXMuc2l6ZTtcbiAgICB0aGlzLl91cmwgPSBwYXJhbXMudXJsO1xuICAgIHRoaXMuX3NpZ25lZFVybCA9IHBhcmFtcy5zaWduZWRVcmw7XG4gIH1cblxuICAvKiog7JuQ67O4IO2MjOydvOuqhSAqL1xuICBnZXQgZmlsZW5hbWUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5fZmlsZW5hbWU7XG4gIH1cblxuICAvKiogTUlNRSDtg4DsnoUgKi9cbiAgZ2V0IG1pbWV0eXBlKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuX21pbWV0eXBlO1xuICB9XG5cbiAgLyoqIO2MjOydvCDtgazquLAgKGJ5dGVzKSAqL1xuICBnZXQgc2l6ZSgpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLl9zaXplO1xuICB9XG5cbiAgLyoqIO2ZleyepeyekCAo7KCQIOygnOyZuCkgKi9cbiAgZ2V0IGV4dG5hbWUoKTogc3RyaW5nIHwgZmFsc2Uge1xuICAgIHJldHVybiBtaW1lLmV4dGVuc2lvbih0aGlzLl9taW1ldHlwZSk7XG4gIH1cblxuICAvKiog7KCA7J6l65CcIFVSTCAoVW5zaWduZWQpICovXG4gIGdldCB1cmwoKTogc3RyaW5nIHtcbiAgICBpZiAodGhpcy5fdXJsID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcInVybOydtCDshKTsoJXrkJjsp4Ag7JWK7JWY7Iq164uI64ukLlwiKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuX3VybDtcbiAgfVxuXG4gIC8qKiDsoIDsnqXrkJwgVVJMIChTaWduZWQpICovXG4gIGdldCBzaWduZWRVcmwoKTogc3RyaW5nIHtcbiAgICBpZiAodGhpcy5fc2lnbmVkVXJsID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcInNpZ25lZFVybOydtCDshKTsoJXrkJjsp4Ag7JWK7JWY7Iq164uI64ukLlwiKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuX3NpZ25lZFVybDtcbiAgfVxufVxuIl0sIm1hcHBpbmdzIjoiOzs7OztDQUtzQixXQUF0QixNQUErQjtFQUM3QjtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBRUEsWUFBWSxRQU1UO0dBQ0QsS0FBSyxZQUFZLE9BQU87R0FDeEIsS0FBSyxZQUFZLE9BQU87R0FDeEIsS0FBSyxRQUFRLE9BQU87R0FDcEIsS0FBSyxPQUFPLE9BQU87R0FDbkIsS0FBSyxhQUFhLE9BQU87RUFDM0I7O0VBR0EsSUFBSSxXQUFtQjtHQUNyQixPQUFPLEtBQUs7RUFDZDs7RUFHQSxJQUFJLFdBQW1CO0dBQ3JCLE9BQU8sS0FBSztFQUNkOztFQUdBLElBQUksT0FBZTtHQUNqQixPQUFPLEtBQUs7RUFDZDs7RUFHQSxJQUFJLFVBQTBCO0dBQzVCLE9BQU8sS0FBSyxVQUFVLEtBQUssU0FBUztFQUN0Qzs7RUFHQSxJQUFJLE1BQWM7R0FDaEIsSUFBSSxLQUFLLFNBQVMsUUFDaEIsTUFBTSxJQUFJLE1BQU0sa0JBQWtCO0dBRXBDLE9BQU8sS0FBSztFQUNkOztFQUdBLElBQUksWUFBb0I7R0FDdEIsSUFBSSxLQUFLLGVBQWUsUUFDdEIsTUFBTSxJQUFJLE1BQU0sd0JBQXdCO0dBRTFDLE9BQU8sS0FBSztFQUNkO0NBQ0YifQ==