@hashgraphonline/standards-sdk 0.1.141-canary.3 → 0.1.141-canary.30

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 (251) hide show
  1. package/README.md +13 -1
  2. package/dist/cjs/hcs-16/base-client.d.ts.map +1 -1
  3. package/dist/cjs/hcs-17/types.d.ts.map +1 -1
  4. package/dist/cjs/hcs-20/sdk.d.ts.map +1 -1
  5. package/dist/cjs/hcs-20/types.d.ts +9 -8
  6. package/dist/cjs/hcs-20/types.d.ts.map +1 -1
  7. package/dist/cjs/hcs-21/base-client.d.ts +4 -3
  8. package/dist/cjs/hcs-21/base-client.d.ts.map +1 -1
  9. package/dist/cjs/hcs-21/index.d.ts +1 -0
  10. package/dist/cjs/hcs-21/index.d.ts.map +1 -1
  11. package/dist/cjs/hcs-21/sdk.d.ts +34 -0
  12. package/dist/cjs/hcs-21/sdk.d.ts.map +1 -1
  13. package/dist/cjs/hcs-21/tx.d.ts.map +1 -1
  14. package/dist/cjs/hcs-21/types.d.ts +135 -64
  15. package/dist/cjs/hcs-21/types.d.ts.map +1 -1
  16. package/dist/cjs/hcs-21/verify.d.ts +6 -0
  17. package/dist/cjs/hcs-21/verify.d.ts.map +1 -0
  18. package/dist/cjs/inscribe/inscriber.d.ts +1 -0
  19. package/dist/cjs/inscribe/inscriber.d.ts.map +1 -1
  20. package/dist/cjs/inscribe/quote-cache.d.ts.map +1 -1
  21. package/dist/cjs/services/registry-broker/client.d.ts +4 -3
  22. package/dist/cjs/services/registry-broker/client.d.ts.map +1 -1
  23. package/dist/cjs/services/registry-broker/private-key-signer.d.ts.map +1 -1
  24. package/dist/cjs/services/registry-broker/schemas.d.ts +38 -38
  25. package/dist/cjs/services/registry-broker/schemas.d.ts.map +1 -1
  26. package/dist/cjs/standards-sdk.cjs +2 -2
  27. package/dist/cjs/standards-sdk.cjs.map +1 -1
  28. package/dist/cjs/utils/dynamic-import.d.ts +1 -0
  29. package/dist/cjs/utils/dynamic-import.d.ts.map +1 -1
  30. package/dist/es/hcs-16/base-client.d.ts.map +1 -1
  31. package/dist/es/hcs-17/types.d.ts.map +1 -1
  32. package/dist/es/hcs-20/sdk.d.ts.map +1 -1
  33. package/dist/es/hcs-20/types.d.ts +9 -8
  34. package/dist/es/hcs-20/types.d.ts.map +1 -1
  35. package/dist/es/hcs-21/base-client.d.ts +4 -3
  36. package/dist/es/hcs-21/base-client.d.ts.map +1 -1
  37. package/dist/es/hcs-21/index.d.ts +1 -0
  38. package/dist/es/hcs-21/index.d.ts.map +1 -1
  39. package/dist/es/hcs-21/sdk.d.ts +34 -0
  40. package/dist/es/hcs-21/sdk.d.ts.map +1 -1
  41. package/dist/es/hcs-21/tx.d.ts.map +1 -1
  42. package/dist/es/hcs-21/types.d.ts +135 -64
  43. package/dist/es/hcs-21/types.d.ts.map +1 -1
  44. package/dist/es/hcs-21/verify.d.ts +6 -0
  45. package/dist/es/hcs-21/verify.d.ts.map +1 -0
  46. package/dist/es/inscribe/inscriber.d.ts +1 -0
  47. package/dist/es/inscribe/inscriber.d.ts.map +1 -1
  48. package/dist/es/inscribe/quote-cache.d.ts.map +1 -1
  49. package/dist/es/services/registry-broker/client.d.ts +4 -3
  50. package/dist/es/services/registry-broker/client.d.ts.map +1 -1
  51. package/dist/es/services/registry-broker/private-key-signer.d.ts.map +1 -1
  52. package/dist/es/services/registry-broker/schemas.d.ts +38 -38
  53. package/dist/es/services/registry-broker/schemas.d.ts.map +1 -1
  54. package/dist/es/standards-sdk.es.js +58 -50
  55. package/dist/es/standards-sdk.es.js.map +1 -1
  56. package/dist/es/standards-sdk.es10.js +2 -2
  57. package/dist/es/standards-sdk.es100.js +26 -229
  58. package/dist/es/standards-sdk.es100.js.map +1 -1
  59. package/dist/es/standards-sdk.es101.js +228 -109
  60. package/dist/es/standards-sdk.es101.js.map +1 -1
  61. package/dist/es/standards-sdk.es102.js +94 -15
  62. package/dist/es/standards-sdk.es102.js.map +1 -1
  63. package/dist/es/standards-sdk.es103.js +30 -80
  64. package/dist/es/standards-sdk.es103.js.map +1 -1
  65. package/dist/es/standards-sdk.es104.js +80 -27
  66. package/dist/es/standards-sdk.es104.js.map +1 -1
  67. package/dist/es/standards-sdk.es105.js +25 -136
  68. package/dist/es/standards-sdk.es105.js.map +1 -1
  69. package/dist/es/standards-sdk.es106.js +140 -27
  70. package/dist/es/standards-sdk.es106.js.map +1 -1
  71. package/dist/es/standards-sdk.es107.js +27 -20
  72. package/dist/es/standards-sdk.es107.js.map +1 -1
  73. package/dist/es/standards-sdk.es108.js +18 -156
  74. package/dist/es/standards-sdk.es108.js.map +1 -1
  75. package/dist/es/standards-sdk.es109.js +148 -196
  76. package/dist/es/standards-sdk.es109.js.map +1 -1
  77. package/dist/es/standards-sdk.es110.js +160 -747
  78. package/dist/es/standards-sdk.es110.js.map +1 -1
  79. package/dist/es/standards-sdk.es111.js +786 -9
  80. package/dist/es/standards-sdk.es111.js.map +1 -1
  81. package/dist/es/standards-sdk.es112.js +13 -567
  82. package/dist/es/standards-sdk.es112.js.map +1 -1
  83. package/dist/es/standards-sdk.es113.js +541 -576
  84. package/dist/es/standards-sdk.es113.js.map +1 -1
  85. package/dist/es/standards-sdk.es114.js +601 -12
  86. package/dist/es/standards-sdk.es114.js.map +1 -1
  87. package/dist/es/standards-sdk.es115.js +13 -2
  88. package/dist/es/standards-sdk.es115.js.map +1 -1
  89. package/dist/es/standards-sdk.es116.js +2 -83
  90. package/dist/es/standards-sdk.es116.js.map +1 -1
  91. package/dist/es/standards-sdk.es117.js +80 -36
  92. package/dist/es/standards-sdk.es117.js.map +1 -1
  93. package/dist/es/standards-sdk.es118.js +39 -2
  94. package/dist/es/standards-sdk.es118.js.map +1 -1
  95. package/dist/es/standards-sdk.es119.js +2 -223
  96. package/dist/es/standards-sdk.es119.js.map +1 -1
  97. package/dist/es/standards-sdk.es12.js +1 -1
  98. package/dist/es/standards-sdk.es120.js +193 -1110
  99. package/dist/es/standards-sdk.es120.js.map +1 -1
  100. package/dist/es/standards-sdk.es121.js +1059 -225
  101. package/dist/es/standards-sdk.es121.js.map +1 -1
  102. package/dist/es/standards-sdk.es122.js +303 -419
  103. package/dist/es/standards-sdk.es122.js.map +1 -1
  104. package/dist/es/standards-sdk.es123.js +418 -351
  105. package/dist/es/standards-sdk.es123.js.map +1 -1
  106. package/dist/es/standards-sdk.es124.js +348 -785
  107. package/dist/es/standards-sdk.es124.js.map +1 -1
  108. package/dist/es/standards-sdk.es125.js +766 -182
  109. package/dist/es/standards-sdk.es125.js.map +1 -1
  110. package/dist/es/standards-sdk.es126.js +153 -1512
  111. package/dist/es/standards-sdk.es126.js.map +1 -1
  112. package/dist/es/standards-sdk.es127.js +1373 -1977
  113. package/dist/es/standards-sdk.es127.js.map +1 -1
  114. package/dist/es/standards-sdk.es128.js +2211 -50
  115. package/dist/es/standards-sdk.es128.js.map +1 -1
  116. package/dist/es/standards-sdk.es129.js +59 -79
  117. package/dist/es/standards-sdk.es129.js.map +1 -1
  118. package/dist/es/standards-sdk.es13.js +1 -1
  119. package/dist/es/standards-sdk.es130.js +80 -152
  120. package/dist/es/standards-sdk.es130.js.map +1 -1
  121. package/dist/es/standards-sdk.es131.js +159 -7
  122. package/dist/es/standards-sdk.es131.js.map +1 -1
  123. package/dist/es/standards-sdk.es132.js +7 -86
  124. package/dist/es/standards-sdk.es132.js.map +1 -1
  125. package/dist/es/standards-sdk.es133.js +65 -44
  126. package/dist/es/standards-sdk.es133.js.map +1 -1
  127. package/dist/es/standards-sdk.es134.js +65 -28
  128. package/dist/es/standards-sdk.es134.js.map +1 -1
  129. package/dist/es/standards-sdk.es135.js +69 -125
  130. package/dist/es/standards-sdk.es135.js.map +1 -1
  131. package/dist/es/standards-sdk.es136.js +28 -42
  132. package/dist/es/standards-sdk.es136.js.map +1 -1
  133. package/dist/es/standards-sdk.es137.js +138 -760
  134. package/dist/es/standards-sdk.es137.js.map +1 -1
  135. package/dist/es/standards-sdk.es138.js +36 -50
  136. package/dist/es/standards-sdk.es138.js.map +1 -1
  137. package/dist/es/standards-sdk.es139.js +766 -64
  138. package/dist/es/standards-sdk.es139.js.map +1 -1
  139. package/dist/es/standards-sdk.es14.js +1 -1
  140. package/dist/es/standards-sdk.es141.js +13 -168
  141. package/dist/es/standards-sdk.es141.js.map +1 -1
  142. package/dist/es/standards-sdk.es142.js +55 -321
  143. package/dist/es/standards-sdk.es142.js.map +1 -1
  144. package/dist/es/standards-sdk.es143.js +120 -294
  145. package/dist/es/standards-sdk.es143.js.map +1 -1
  146. package/dist/es/standards-sdk.es144.js +191 -322
  147. package/dist/es/standards-sdk.es144.js.map +1 -1
  148. package/dist/es/standards-sdk.es145.js +294 -279
  149. package/dist/es/standards-sdk.es145.js.map +1 -1
  150. package/dist/es/standards-sdk.es146.js +440 -63
  151. package/dist/es/standards-sdk.es146.js.map +1 -1
  152. package/dist/es/standards-sdk.es147.js +327 -13
  153. package/dist/es/standards-sdk.es147.js.map +1 -1
  154. package/dist/es/standards-sdk.es148.js +79 -0
  155. package/dist/es/standards-sdk.es148.js.map +1 -0
  156. package/dist/es/standards-sdk.es15.js +1 -1
  157. package/dist/es/standards-sdk.es16.js +1 -1
  158. package/dist/es/standards-sdk.es17.js +5 -10
  159. package/dist/es/standards-sdk.es17.js.map +1 -1
  160. package/dist/es/standards-sdk.es19.js +11 -15
  161. package/dist/es/standards-sdk.es19.js.map +1 -1
  162. package/dist/es/standards-sdk.es2.js +26 -72
  163. package/dist/es/standards-sdk.es2.js.map +1 -1
  164. package/dist/es/standards-sdk.es20.js +8 -12
  165. package/dist/es/standards-sdk.es20.js.map +1 -1
  166. package/dist/es/standards-sdk.es21.js +1 -1
  167. package/dist/es/standards-sdk.es22.js +1 -1
  168. package/dist/es/standards-sdk.es23.js +1 -1
  169. package/dist/es/standards-sdk.es24.js +1 -1
  170. package/dist/es/standards-sdk.es25.js +1 -1
  171. package/dist/es/standards-sdk.es26.js +1 -1
  172. package/dist/es/standards-sdk.es27.js +1 -1
  173. package/dist/es/standards-sdk.es28.js +11 -15
  174. package/dist/es/standards-sdk.es28.js.map +1 -1
  175. package/dist/es/standards-sdk.es3.js +2 -2
  176. package/dist/es/standards-sdk.es31.js +1 -1
  177. package/dist/es/standards-sdk.es32.js +3 -3
  178. package/dist/es/standards-sdk.es33.js +1 -1
  179. package/dist/es/standards-sdk.es36.js +6 -11
  180. package/dist/es/standards-sdk.es36.js.map +1 -1
  181. package/dist/es/standards-sdk.es37.js +3 -3
  182. package/dist/es/standards-sdk.es38.js +1 -1
  183. package/dist/es/standards-sdk.es39.js +2 -2
  184. package/dist/es/standards-sdk.es40.js +1 -1
  185. package/dist/es/standards-sdk.es41.js +1 -1
  186. package/dist/es/standards-sdk.es42.js +2 -2
  187. package/dist/es/standards-sdk.es47.js +1 -1
  188. package/dist/es/standards-sdk.es5.js +2 -2
  189. package/dist/es/standards-sdk.es52.js +1 -1
  190. package/dist/es/standards-sdk.es54.js +1 -1
  191. package/dist/es/standards-sdk.es57.js +2 -2
  192. package/dist/es/standards-sdk.es59.js +1 -1
  193. package/dist/es/standards-sdk.es6.js +2 -2
  194. package/dist/es/standards-sdk.es60.js +1 -1
  195. package/dist/es/standards-sdk.es61.js +7 -11
  196. package/dist/es/standards-sdk.es61.js.map +1 -1
  197. package/dist/es/standards-sdk.es63.js +1 -1
  198. package/dist/es/standards-sdk.es65.js +2 -2
  199. package/dist/es/standards-sdk.es66.js +3 -3
  200. package/dist/es/standards-sdk.es69.js +2 -2
  201. package/dist/es/standards-sdk.es7.js +2 -2
  202. package/dist/es/standards-sdk.es70.js +3 -3
  203. package/dist/es/standards-sdk.es71.js +2 -2
  204. package/dist/es/standards-sdk.es72.js +1 -1
  205. package/dist/es/standards-sdk.es73.js.map +1 -1
  206. package/dist/es/standards-sdk.es75.js +2 -2
  207. package/dist/es/standards-sdk.es77.js +5 -3
  208. package/dist/es/standards-sdk.es77.js.map +1 -1
  209. package/dist/es/standards-sdk.es78.js +4 -10
  210. package/dist/es/standards-sdk.es78.js.map +1 -1
  211. package/dist/es/standards-sdk.es79.js +1 -1
  212. package/dist/es/standards-sdk.es8.js +1 -1
  213. package/dist/es/standards-sdk.es80.js +26 -15
  214. package/dist/es/standards-sdk.es80.js.map +1 -1
  215. package/dist/es/standards-sdk.es82.js +12 -4
  216. package/dist/es/standards-sdk.es82.js.map +1 -1
  217. package/dist/es/standards-sdk.es83.js +7 -6
  218. package/dist/es/standards-sdk.es83.js.map +1 -1
  219. package/dist/es/standards-sdk.es84.js +106 -5
  220. package/dist/es/standards-sdk.es84.js.map +1 -1
  221. package/dist/es/standards-sdk.es86.js +55 -21
  222. package/dist/es/standards-sdk.es86.js.map +1 -1
  223. package/dist/es/standards-sdk.es87.js +22 -75
  224. package/dist/es/standards-sdk.es87.js.map +1 -1
  225. package/dist/es/standards-sdk.es88.js +45 -30
  226. package/dist/es/standards-sdk.es88.js.map +1 -1
  227. package/dist/es/standards-sdk.es89.js +57 -22
  228. package/dist/es/standards-sdk.es89.js.map +1 -1
  229. package/dist/es/standards-sdk.es90.js +28 -23
  230. package/dist/es/standards-sdk.es90.js.map +1 -1
  231. package/dist/es/standards-sdk.es91.js +23 -167
  232. package/dist/es/standards-sdk.es91.js.map +1 -1
  233. package/dist/es/standards-sdk.es92.js +158 -119
  234. package/dist/es/standards-sdk.es92.js.map +1 -1
  235. package/dist/es/standards-sdk.es93.js +68 -95
  236. package/dist/es/standards-sdk.es93.js.map +1 -1
  237. package/dist/es/standards-sdk.es94.js +136 -119
  238. package/dist/es/standards-sdk.es94.js.map +1 -1
  239. package/dist/es/standards-sdk.es95.js +139 -39
  240. package/dist/es/standards-sdk.es95.js.map +1 -1
  241. package/dist/es/standards-sdk.es96.js +42 -257
  242. package/dist/es/standards-sdk.es96.js.map +1 -1
  243. package/dist/es/standards-sdk.es97.js +243 -80
  244. package/dist/es/standards-sdk.es97.js.map +1 -1
  245. package/dist/es/standards-sdk.es98.js +47 -48
  246. package/dist/es/standards-sdk.es98.js.map +1 -1
  247. package/dist/es/standards-sdk.es99.js +100 -28
  248. package/dist/es/standards-sdk.es99.js.map +1 -1
  249. package/dist/es/utils/dynamic-import.d.ts +1 -0
  250. package/dist/es/utils/dynamic-import.d.ts.map +1 -1
  251. package/package.json +65 -63
@@ -1,211 +1,163 @@
1
- import axios from "axios";
2
- import { Logger } from "./standards-sdk.es105.js";
3
- import { HederaMirrorNode } from "./standards-sdk.es126.js";
4
- import "node:path";
5
- import "node:buffer";
6
- import "node:crypto";
7
- import "@noble/curves/secp256k1.js";
8
- import "./standards-sdk.es129.js";
9
- import "viem/accounts";
10
- import "viem/chains";
11
- import "x402-axios";
12
- import "x402/types";
13
- import "./standards-sdk.es137.js";
14
- import "zod";
15
- import "@hashgraph/sdk";
16
- class HRLResolver {
17
- constructor(logLevel = "info") {
18
- this.defaultEndpoint = "https://kiloscribe.com/api/inscription-cdn";
19
- this.logger = Logger.getInstance({
20
- level: logLevel,
21
- module: "HRLResolver"
1
+ import { Logger } from "./standards-sdk.es106.js";
2
+ class ProgressReporter {
3
+ constructor(options = {}) {
4
+ this.module = options.module || "Progress";
5
+ this.callback = options.callback;
6
+ this.logger = options.logger || new Logger({
7
+ level: "info",
8
+ module: "ProgressReporter"
22
9
  });
10
+ this.logProgress = options.logProgress ?? true;
11
+ this.minPercent = options.minPercent ?? 0;
12
+ this.maxPercent = options.maxPercent ?? 100;
13
+ this.lastReportedPercent = -1;
14
+ this.lastReportedTime = 0;
15
+ this.throttleMs = 100;
23
16
  }
24
- /**
25
- * Determines if a MIME type represents binary content
26
- */
27
- isBinaryContentType(mimeType) {
28
- const binaryTypes = [
29
- "image/",
30
- "audio/",
31
- "video/",
32
- "application/octet-stream",
33
- "application/pdf",
34
- "application/zip",
35
- "application/gzip",
36
- "application/x-binary",
37
- "application/vnd.ms-",
38
- "application/x-msdownload",
39
- "application/x-shockwave-flash",
40
- "font/",
41
- "application/wasm"
42
- ];
43
- return binaryTypes.some((prefix) => mimeType.startsWith(prefix));
44
- }
45
- /**
46
- * Parses an HRL string into its components
47
- */
48
- parseHRL(hrl) {
49
- if (!hrl) {
50
- return null;
51
- }
52
- const hrlPattern = /^hcs:\/\/(\d+)\/([0-9]+\.[0-9]+\.[0-9]+)$/;
53
- const match = hrl.match(hrlPattern);
54
- if (!match) {
55
- return null;
17
+ static getInstance(options = {}) {
18
+ if (!ProgressReporter.instance) {
19
+ ProgressReporter.instance = new ProgressReporter(options);
20
+ } else {
21
+ if (options.callback) {
22
+ ProgressReporter.instance.setCallback(options.callback);
23
+ }
24
+ if (options.module) {
25
+ ProgressReporter.instance.setModule(options.module);
26
+ }
27
+ if (options.logger) {
28
+ ProgressReporter.instance.setLogger(options.logger);
29
+ }
30
+ if (options.minPercent !== void 0) {
31
+ ProgressReporter.instance.setMinPercent(options.minPercent);
32
+ }
33
+ if (options.maxPercent !== void 0) {
34
+ ProgressReporter.instance.setMaxPercent(options.maxPercent);
35
+ }
56
36
  }
57
- return {
58
- standard: match[1],
59
- topicId: match[2]
60
- };
37
+ return ProgressReporter.instance;
61
38
  }
62
- /**
63
- * Validates if a string is a valid HRL
64
- */
65
- isValidHRL(hrl) {
66
- if (!hrl || typeof hrl !== "string") {
67
- return false;
68
- }
69
- const parsed = this.parseHRL(hrl);
70
- if (!parsed) {
71
- return false;
72
- }
73
- const topicIdPattern = /^[0-9]+\.[0-9]+\.[0-9]+$/;
74
- if (!topicIdPattern.test(parsed.topicId)) {
75
- return false;
76
- }
77
- return true;
78
- }
79
- /**
80
- * Validates if a string is a valid topic ID
81
- */
82
- isValidTopicId(topicId) {
83
- const topicIdPattern = /^[0-9]+\.[0-9]+\.[0-9]+$/;
84
- return topicIdPattern.test(topicId);
85
- }
86
- /**
87
- * Resolves content from either an HRL or a topic ID
88
- * If a topic ID is provided, it queries the topic memo to determine the HCS standard
89
- */
90
- async resolve(hrlOrTopicId, options) {
91
- if (this.isValidHRL(hrlOrTopicId)) {
92
- return this.resolveHRL(hrlOrTopicId, options);
93
- }
94
- if (!this.isValidTopicId(hrlOrTopicId)) {
95
- throw new Error(`Invalid HRL or topic ID format: ${hrlOrTopicId}`);
96
- }
97
- try {
98
- const mirrorNode = new HederaMirrorNode(options.network, this.logger);
99
- const topicInfo = await mirrorNode.getTopicInfo(hrlOrTopicId);
100
- const memo = topicInfo?.memo || "";
101
- let standard = "1";
102
- if (memo) {
103
- const hcsMatch = memo.match(/^hcs-(\d+)/);
104
- if (hcsMatch && hcsMatch[1]) {
105
- standard = hcsMatch[1];
106
- }
107
- }
108
- const hrl = `hcs://${standard}/${hrlOrTopicId}`;
109
- return this.resolveHRL(hrl, options);
110
- } catch (error) {
111
- this.logger.error(
112
- `Failed to get topic info for ${hrlOrTopicId}: ${error.message}`
39
+ setCallback(callback) {
40
+ this.callback = callback;
41
+ }
42
+ setModule(module) {
43
+ this.module = module;
44
+ }
45
+ setLogger(logger) {
46
+ this.logger = logger;
47
+ }
48
+ setMinPercent(minPercent) {
49
+ this.minPercent = minPercent;
50
+ }
51
+ setMaxPercent(maxPercent) {
52
+ this.maxPercent = maxPercent;
53
+ }
54
+ createSubProgress(options) {
55
+ const subReporter = new ProgressReporter({
56
+ module: this.module,
57
+ logger: this.logger,
58
+ logProgress: this.logProgress,
59
+ minPercent: options.minPercent,
60
+ maxPercent: options.maxPercent
61
+ });
62
+ const logPrefix = options.logPrefix || "";
63
+ subReporter.setCallback((data) => {
64
+ const scaledPercent = this.scalePercent(
65
+ data.progressPercent,
66
+ options.minPercent,
67
+ options.maxPercent
113
68
  );
114
- const hrl = `hcs://1/${hrlOrTopicId}`;
115
- return this.resolveHRL(hrl, options);
116
- }
69
+ let formattedMessage = data.message;
70
+ if (logPrefix && !formattedMessage.startsWith(logPrefix)) {
71
+ formattedMessage = `${logPrefix}: ${formattedMessage}`;
72
+ }
73
+ this.report({
74
+ stage: data.stage,
75
+ message: formattedMessage,
76
+ progressPercent: scaledPercent,
77
+ details: data.details
78
+ });
79
+ });
80
+ return subReporter;
117
81
  }
118
- async getContentWithType(hrl, options) {
119
- if (!this.isValidHRL(hrl)) {
120
- return {
121
- content: hrl,
122
- contentType: "text/plain",
123
- isBinary: false
124
- };
125
- }
126
- try {
127
- const result = await this.resolveHRL(hrl, options);
128
- return {
129
- content: result.content,
130
- contentType: result.contentType,
131
- isBinary: result.isBinary
132
- };
133
- } catch (e) {
134
- const error = e;
135
- const logMessage = `Error resolving HRL for content and type: ${error.message}`;
136
- this.logger.error(logMessage);
137
- throw new Error(logMessage);
82
+ report(data) {
83
+ const rawPercent = data.progressPercent;
84
+ const percent = Math.max(0, Math.min(100, rawPercent));
85
+ const scaledPercent = this.scalePercent(percent, 0, 100);
86
+ const now = Date.now();
87
+ if (scaledPercent === this.lastReportedPercent && now - this.lastReportedTime < this.throttleMs && data.stage !== "completed" && data.stage !== "failed") {
88
+ return;
138
89
  }
139
- }
140
- /**
141
- * Resolves HRL content with proper content type detection
142
- */
143
- async resolveHRL(hrl, options) {
144
- const parsed = this.parseHRL(hrl);
145
- if (!parsed) {
146
- throw new Error(`Invalid HRL format: ${hrl}`);
90
+ this.lastReportedPercent = scaledPercent;
91
+ this.lastReportedTime = now;
92
+ const progressData = {
93
+ ...data,
94
+ progressPercent: scaledPercent
95
+ };
96
+ if (this.logProgress) {
97
+ this.logger.debug(
98
+ `[${this.module}] [${data.stage.toUpperCase()}] ${data.message} (${scaledPercent.toFixed(1)}%)`,
99
+ data.details
100
+ );
147
101
  }
148
- const { standard, topicId } = parsed;
149
- this.logger.debug(
150
- `Resolving HRL reference: standard=${standard}, topicId=${topicId}`
151
- );
152
- try {
153
- const cdnEndpoint = options.cdnEndpoint || this.defaultEndpoint;
154
- const cdnUrl = `${cdnEndpoint}/${topicId}?network=${options.network}`;
155
- this.logger.debug(`Fetching content from CDN: ${cdnUrl}`);
156
- const headResponse = await axios.head(cdnUrl);
157
- const contentType = headResponse.headers["content-type"] || "";
158
- const isBinary = this.isBinaryContentType(contentType);
159
- if (isBinary || options.returnRaw) {
160
- const response2 = await axios.get(cdnUrl, {
161
- responseType: "arraybuffer"
162
- });
163
- return {
164
- content: response2.data,
165
- contentType,
166
- topicId,
167
- isBinary: true
168
- };
102
+ if (this.callback) {
103
+ try {
104
+ this.callback(progressData);
105
+ } catch (err) {
106
+ this.logger.warn(`Error in progress callback: ${err}`);
169
107
  }
170
- if (contentType === "application/json") {
171
- const response2 = await axios.get(cdnUrl, {
172
- responseType: "json"
173
- });
174
- if (!response2.data) {
175
- throw new Error(`Failed to fetch content from topic: ${topicId}`);
176
- }
177
- return {
178
- content: response2.data,
179
- contentType,
180
- topicId,
181
- isBinary: false
182
- };
183
- }
184
- const response = await axios.get(cdnUrl);
185
- if (!response.data) {
186
- throw new Error(`Failed to fetch content from topic: ${topicId}`);
187
- }
188
- let content;
189
- if (typeof response.data === "object") {
190
- content = response.data.content || response.data.text || JSON.stringify(response.data);
191
- } else {
192
- content = response.data;
193
- }
194
- return {
195
- content,
196
- contentType,
197
- topicId,
198
- isBinary: false
199
- };
200
- } catch (e) {
201
- const error = e;
202
- const logMessage = `Error resolving HRL reference: ${error.message}`;
203
- this.logger.error(logMessage);
204
- throw new Error(logMessage);
205
108
  }
206
109
  }
110
+ scalePercent(percent, sourceMin, sourceMax) {
111
+ const range = this.maxPercent - this.minPercent;
112
+ const sourceRange = sourceMax - sourceMin;
113
+ const scaleFactor = range / sourceRange;
114
+ return this.minPercent + (percent - sourceMin) * scaleFactor;
115
+ }
116
+ preparing(message, percent, details) {
117
+ this.report({
118
+ stage: "preparing",
119
+ message,
120
+ progressPercent: percent,
121
+ details
122
+ });
123
+ }
124
+ submitting(message, percent, details) {
125
+ this.report({
126
+ stage: "submitting",
127
+ message,
128
+ progressPercent: percent,
129
+ details
130
+ });
131
+ }
132
+ confirming(message, percent, details) {
133
+ this.report({
134
+ stage: "confirming",
135
+ message,
136
+ progressPercent: percent,
137
+ details
138
+ });
139
+ }
140
+ verifying(message, percent, details) {
141
+ this.report({
142
+ stage: "verifying",
143
+ message,
144
+ progressPercent: percent,
145
+ details
146
+ });
147
+ }
148
+ completed(message, details) {
149
+ this.report({ stage: "completed", message, progressPercent: 100, details });
150
+ }
151
+ failed(message, details) {
152
+ this.report({
153
+ stage: "failed",
154
+ message,
155
+ progressPercent: this.lastReportedPercent,
156
+ details
157
+ });
158
+ }
207
159
  }
208
160
  export {
209
- HRLResolver
161
+ ProgressReporter
210
162
  };
211
163
  //# sourceMappingURL=standards-sdk.es109.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"standards-sdk.es109.js","sources":["../../src/utils/hrl-resolver.ts"],"sourcesContent":["import axios from 'axios';\nimport { Logger, LogLevel, ILogger } from './logger';\nimport { NetworkType } from './types';\nimport { HederaMirrorNode } from '../services';\n\n/**\n * Options for HRL resolution\n */\nexport interface HRLResolutionOptions {\n network: NetworkType;\n returnRaw?: boolean;\n cdnEndpoint?: string;\n}\n\n/**\n * Result of an HRL resolution operation\n */\nexport interface HRLResolutionResult {\n content: string | ArrayBuffer;\n contentType: string;\n topicId: string;\n isBinary: boolean;\n}\n\nexport interface ContentWithType {\n content: string | ArrayBuffer;\n contentType: string;\n isBinary: boolean;\n}\n\n/**\n * Utility class for resolving Hedera Resource Locators across the SDK\n */\nexport class HRLResolver {\n private logger: ILogger;\n private defaultEndpoint = 'https://kiloscribe.com/api/inscription-cdn';\n\n constructor(logLevel: LogLevel = 'info') {\n this.logger = Logger.getInstance({\n level: logLevel,\n module: 'HRLResolver',\n });\n }\n\n /**\n * Determines if a MIME type represents binary content\n */\n private isBinaryContentType(mimeType: string): boolean {\n const binaryTypes = [\n 'image/',\n 'audio/',\n 'video/',\n 'application/octet-stream',\n 'application/pdf',\n 'application/zip',\n 'application/gzip',\n 'application/x-binary',\n 'application/vnd.ms-',\n 'application/x-msdownload',\n 'application/x-shockwave-flash',\n 'font/',\n 'application/wasm',\n ];\n\n return binaryTypes.some(prefix => mimeType.startsWith(prefix));\n }\n\n /**\n * Parses an HRL string into its components\n */\n public parseHRL(hrl: string): { standard: string; topicId: string } | null {\n if (!hrl) {\n return null;\n }\n\n const hrlPattern = /^hcs:\\/\\/(\\d+)\\/([0-9]+\\.[0-9]+\\.[0-9]+)$/;\n const match = hrl.match(hrlPattern);\n\n if (!match) {\n return null;\n }\n\n return {\n standard: match[1],\n topicId: match[2],\n };\n }\n\n /**\n * Validates if a string is a valid HRL\n */\n public isValidHRL(hrl: string): boolean {\n if (!hrl || typeof hrl !== 'string') {\n return false;\n }\n\n const parsed = this.parseHRL(hrl);\n if (!parsed) {\n return false;\n }\n\n const topicIdPattern = /^[0-9]+\\.[0-9]+\\.[0-9]+$/;\n if (!topicIdPattern.test(parsed.topicId)) {\n return false;\n }\n\n return true;\n }\n\n /**\n * Validates if a string is a valid topic ID\n */\n public isValidTopicId(topicId: string): boolean {\n const topicIdPattern = /^[0-9]+\\.[0-9]+\\.[0-9]+$/;\n return topicIdPattern.test(topicId);\n }\n\n /**\n * Resolves content from either an HRL or a topic ID\n * If a topic ID is provided, it queries the topic memo to determine the HCS standard\n */\n public async resolve(\n hrlOrTopicId: string,\n options: HRLResolutionOptions,\n ): Promise<HRLResolutionResult> {\n if (this.isValidHRL(hrlOrTopicId)) {\n return this.resolveHRL(hrlOrTopicId, options);\n }\n\n if (!this.isValidTopicId(hrlOrTopicId)) {\n throw new Error(`Invalid HRL or topic ID format: ${hrlOrTopicId}`);\n }\n\n try {\n const mirrorNode = new HederaMirrorNode(options.network, this.logger);\n const topicInfo = await mirrorNode.getTopicInfo(hrlOrTopicId);\n const memo = topicInfo?.memo || '';\n\n let standard = '1';\n if (memo) {\n const hcsMatch = memo.match(/^hcs-(\\d+)/);\n if (hcsMatch && hcsMatch[1]) {\n standard = hcsMatch[1];\n }\n }\n\n const hrl = `hcs://${standard}/${hrlOrTopicId}`;\n return this.resolveHRL(hrl, options);\n } catch (error: any) {\n this.logger.error(\n `Failed to get topic info for ${hrlOrTopicId}: ${error.message}`,\n );\n const hrl = `hcs://1/${hrlOrTopicId}`;\n return this.resolveHRL(hrl, options);\n }\n }\n\n public async getContentWithType(\n hrl: string,\n options: HRLResolutionOptions,\n ): Promise<ContentWithType> {\n if (!this.isValidHRL(hrl)) {\n return {\n content: hrl,\n contentType: 'text/plain',\n isBinary: false,\n };\n }\n\n try {\n const result = await this.resolveHRL(hrl, options);\n return {\n content: result.content,\n contentType: result.contentType,\n isBinary: result.isBinary,\n };\n } catch (e: any) {\n const error = e as Error;\n const logMessage = `Error resolving HRL for content and type: ${error.message}`;\n this.logger.error(logMessage);\n throw new Error(logMessage);\n }\n }\n\n /**\n * Resolves HRL content with proper content type detection\n */\n public async resolveHRL(\n hrl: string,\n options: HRLResolutionOptions,\n ): Promise<HRLResolutionResult> {\n const parsed = this.parseHRL(hrl);\n\n if (!parsed) {\n throw new Error(`Invalid HRL format: ${hrl}`);\n }\n\n const { standard, topicId } = parsed;\n\n this.logger.debug(\n `Resolving HRL reference: standard=${standard}, topicId=${topicId}`,\n );\n\n try {\n const cdnEndpoint = options.cdnEndpoint || this.defaultEndpoint;\n const cdnUrl = `${cdnEndpoint}/${topicId}?network=${options.network}`;\n\n this.logger.debug(`Fetching content from CDN: ${cdnUrl}`);\n const headResponse = await axios.head(cdnUrl);\n const contentType = headResponse.headers['content-type'] || '';\n const isBinary = this.isBinaryContentType(contentType);\n\n if (isBinary || options.returnRaw) {\n const response = await axios.get(cdnUrl, {\n responseType: 'arraybuffer',\n });\n\n return {\n content: response.data,\n contentType,\n topicId,\n isBinary: true,\n };\n }\n\n if (contentType === 'application/json') {\n const response = await axios.get(cdnUrl, {\n responseType: 'json',\n });\n\n if (!response.data) {\n throw new Error(`Failed to fetch content from topic: ${topicId}`);\n }\n\n return {\n content: response.data,\n contentType,\n topicId,\n isBinary: false,\n };\n }\n\n const response = await axios.get(cdnUrl);\n\n if (!response.data) {\n throw new Error(`Failed to fetch content from topic: ${topicId}`);\n }\n\n let content: string;\n\n if (typeof response.data === 'object') {\n content =\n response.data.content ||\n response.data.text ||\n JSON.stringify(response.data);\n } else {\n content = response.data;\n }\n\n return {\n content,\n contentType,\n topicId,\n isBinary: false,\n };\n } catch (e: any) {\n const error = e as Error;\n const logMessage = `Error resolving HRL reference: ${error.message}`;\n this.logger.error(logMessage);\n throw new Error(logMessage);\n }\n }\n}\n"],"names":["response"],"mappings":"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"}
1
+ {"version":3,"file":"standards-sdk.es109.js","sources":["../../src/utils/progress-reporter.ts"],"sourcesContent":["import { Logger, ILogger } from './logger';\n\nexport type ProgressStage =\n | 'preparing'\n | 'submitting'\n | 'confirming'\n | 'verifying'\n | 'completed'\n | 'failed';\n\nexport interface ProgressData {\n stage: ProgressStage;\n message: string;\n progressPercent: number;\n details?: Record<string, any>;\n}\n\nexport type ProgressCallback = (data: ProgressData) => void;\n\nexport interface ProgressReporterOptions {\n module?: string;\n callback?: ProgressCallback;\n logger?: ILogger;\n logProgress?: boolean;\n minPercent?: number;\n maxPercent?: number;\n}\n\n/**\n * ProgressReporter is a singleton class that reports progress of a task.\n * Can be used in a generalized fashion.\n */\nexport class ProgressReporter {\n private static instance: ProgressReporter;\n private module: string;\n private callback?: ProgressCallback;\n private logger: ILogger;\n private logProgress: boolean;\n private minPercent: number;\n private maxPercent: number;\n private lastReportedPercent: number;\n private lastReportedTime: number;\n private throttleMs: number;\n\n constructor(options: ProgressReporterOptions = {}) {\n this.module = options.module || 'Progress';\n this.callback = options.callback;\n this.logger =\n options.logger ||\n new Logger({\n level: 'info',\n module: 'ProgressReporter',\n });\n this.logProgress = options.logProgress ?? true;\n this.minPercent = options.minPercent ?? 0;\n this.maxPercent = options.maxPercent ?? 100;\n this.lastReportedPercent = -1;\n this.lastReportedTime = 0;\n this.throttleMs = 100;\n }\n\n static getInstance(options: ProgressReporterOptions = {}): ProgressReporter {\n if (!ProgressReporter.instance) {\n ProgressReporter.instance = new ProgressReporter(options);\n } else {\n if (options.callback) {\n ProgressReporter.instance.setCallback(options.callback);\n }\n if (options.module) {\n ProgressReporter.instance.setModule(options.module);\n }\n if (options.logger) {\n ProgressReporter.instance.setLogger(options.logger);\n }\n if (options.minPercent !== undefined) {\n ProgressReporter.instance.setMinPercent(options.minPercent);\n }\n if (options.maxPercent !== undefined) {\n ProgressReporter.instance.setMaxPercent(options.maxPercent);\n }\n }\n return ProgressReporter.instance;\n }\n\n setCallback(callback: ProgressCallback): void {\n this.callback = callback;\n }\n\n setModule(module: string): void {\n this.module = module;\n }\n\n setLogger(logger: ILogger): void {\n this.logger = logger;\n }\n\n setMinPercent(minPercent: number): void {\n this.minPercent = minPercent;\n }\n\n setMaxPercent(maxPercent: number): void {\n this.maxPercent = maxPercent;\n }\n\n createSubProgress(options: {\n minPercent: number;\n maxPercent: number;\n logPrefix?: string;\n }): ProgressReporter {\n const subReporter = new ProgressReporter({\n module: this.module,\n logger: this.logger,\n logProgress: this.logProgress,\n minPercent: options.minPercent,\n maxPercent: options.maxPercent,\n });\n\n const logPrefix = options.logPrefix || '';\n\n subReporter.setCallback(data => {\n const scaledPercent = this.scalePercent(\n data.progressPercent,\n options.minPercent,\n options.maxPercent,\n );\n\n let formattedMessage = data.message;\n if (logPrefix && !formattedMessage.startsWith(logPrefix)) {\n formattedMessage = `${logPrefix}: ${formattedMessage}`;\n }\n\n this.report({\n stage: data.stage,\n message: formattedMessage,\n progressPercent: scaledPercent,\n details: data.details,\n });\n });\n\n return subReporter;\n }\n\n report(data: ProgressData): void {\n const rawPercent = data.progressPercent;\n const percent = Math.max(0, Math.min(100, rawPercent));\n\n const scaledPercent = this.scalePercent(percent, 0, 100);\n\n const now = Date.now();\n if (\n scaledPercent === this.lastReportedPercent &&\n now - this.lastReportedTime < this.throttleMs &&\n data.stage !== 'completed' &&\n data.stage !== 'failed'\n ) {\n return;\n }\n\n this.lastReportedPercent = scaledPercent;\n this.lastReportedTime = now;\n\n const progressData = {\n ...data,\n progressPercent: scaledPercent,\n };\n\n if (this.logProgress) {\n this.logger.debug(\n `[${this.module}] [${data.stage.toUpperCase()}] ${\n data.message\n } (${scaledPercent.toFixed(1)}%)`,\n data.details,\n );\n }\n\n if (this.callback) {\n try {\n this.callback(progressData);\n } catch (err) {\n this.logger.warn(`Error in progress callback: ${err}`);\n }\n }\n }\n\n private scalePercent(\n percent: number,\n sourceMin: number,\n sourceMax: number,\n ): number {\n const range = this.maxPercent - this.minPercent;\n const sourceRange = sourceMax - sourceMin;\n const scaleFactor = range / sourceRange;\n\n return this.minPercent + (percent - sourceMin) * scaleFactor;\n }\n\n preparing(\n message: string,\n percent: number,\n details?: Record<string, any>,\n ): void {\n this.report({\n stage: 'preparing',\n message,\n progressPercent: percent,\n details,\n });\n }\n\n submitting(\n message: string,\n percent: number,\n details?: Record<string, any>,\n ): void {\n this.report({\n stage: 'submitting',\n message,\n progressPercent: percent,\n details,\n });\n }\n\n confirming(\n message: string,\n percent: number,\n details?: Record<string, any>,\n ): void {\n this.report({\n stage: 'confirming',\n message,\n progressPercent: percent,\n details,\n });\n }\n\n verifying(\n message: string,\n percent: number,\n details?: Record<string, any>,\n ): void {\n this.report({\n stage: 'verifying',\n message,\n progressPercent: percent,\n details,\n });\n }\n\n completed(message: string, details?: Record<string, any>): void {\n this.report({ stage: 'completed', message, progressPercent: 100, details });\n }\n\n failed(message: string, details?: Record<string, any>): void {\n this.report({\n stage: 'failed',\n message,\n progressPercent: this.lastReportedPercent,\n details,\n });\n }\n}\n"],"names":[],"mappings":";AAgCO,MAAM,iBAAiB;AAAA,EAY5B,YAAY,UAAmC,IAAI;AACjD,SAAK,SAAS,QAAQ,UAAU;AAChC,SAAK,WAAW,QAAQ;AACxB,SAAK,SACH,QAAQ,UACR,IAAI,OAAO;AAAA,MACT,OAAO;AAAA,MACP,QAAQ;AAAA,IAAA,CACT;AACH,SAAK,cAAc,QAAQ,eAAe;AAC1C,SAAK,aAAa,QAAQ,cAAc;AACxC,SAAK,aAAa,QAAQ,cAAc;AACxC,SAAK,sBAAsB;AAC3B,SAAK,mBAAmB;AACxB,SAAK,aAAa;AAAA,EACpB;AAAA,EAEA,OAAO,YAAY,UAAmC,IAAsB;AAC1E,QAAI,CAAC,iBAAiB,UAAU;AAC9B,uBAAiB,WAAW,IAAI,iBAAiB,OAAO;AAAA,IAC1D,OAAO;AACL,UAAI,QAAQ,UAAU;AACpB,yBAAiB,SAAS,YAAY,QAAQ,QAAQ;AAAA,MACxD;AACA,UAAI,QAAQ,QAAQ;AAClB,yBAAiB,SAAS,UAAU,QAAQ,MAAM;AAAA,MACpD;AACA,UAAI,QAAQ,QAAQ;AAClB,yBAAiB,SAAS,UAAU,QAAQ,MAAM;AAAA,MACpD;AACA,UAAI,QAAQ,eAAe,QAAW;AACpC,yBAAiB,SAAS,cAAc,QAAQ,UAAU;AAAA,MAC5D;AACA,UAAI,QAAQ,eAAe,QAAW;AACpC,yBAAiB,SAAS,cAAc,QAAQ,UAAU;AAAA,MAC5D;AAAA,IACF;AACA,WAAO,iBAAiB;AAAA,EAC1B;AAAA,EAEA,YAAY,UAAkC;AAC5C,SAAK,WAAW;AAAA,EAClB;AAAA,EAEA,UAAU,QAAsB;AAC9B,SAAK,SAAS;AAAA,EAChB;AAAA,EAEA,UAAU,QAAuB;AAC/B,SAAK,SAAS;AAAA,EAChB;AAAA,EAEA,cAAc,YAA0B;AACtC,SAAK,aAAa;AAAA,EACpB;AAAA,EAEA,cAAc,YAA0B;AACtC,SAAK,aAAa;AAAA,EACpB;AAAA,EAEA,kBAAkB,SAIG;AACnB,UAAM,cAAc,IAAI,iBAAiB;AAAA,MACvC,QAAQ,KAAK;AAAA,MACb,QAAQ,KAAK;AAAA,MACb,aAAa,KAAK;AAAA,MAClB,YAAY,QAAQ;AAAA,MACpB,YAAY,QAAQ;AAAA,IAAA,CACrB;AAED,UAAM,YAAY,QAAQ,aAAa;AAEvC,gBAAY,YAAY,CAAA,SAAQ;AAC9B,YAAM,gBAAgB,KAAK;AAAA,QACzB,KAAK;AAAA,QACL,QAAQ;AAAA,QACR,QAAQ;AAAA,MAAA;AAGV,UAAI,mBAAmB,KAAK;AAC5B,UAAI,aAAa,CAAC,iBAAiB,WAAW,SAAS,GAAG;AACxD,2BAAmB,GAAG,SAAS,KAAK,gBAAgB;AAAA,MACtD;AAEA,WAAK,OAAO;AAAA,QACV,OAAO,KAAK;AAAA,QACZ,SAAS;AAAA,QACT,iBAAiB;AAAA,QACjB,SAAS,KAAK;AAAA,MAAA,CACf;AAAA,IACH,CAAC;AAED,WAAO;AAAA,EACT;AAAA,EAEA,OAAO,MAA0B;AAC/B,UAAM,aAAa,KAAK;AACxB,UAAM,UAAU,KAAK,IAAI,GAAG,KAAK,IAAI,KAAK,UAAU,CAAC;AAErD,UAAM,gBAAgB,KAAK,aAAa,SAAS,GAAG,GAAG;AAEvD,UAAM,MAAM,KAAK,IAAA;AACjB,QACE,kBAAkB,KAAK,uBACvB,MAAM,KAAK,mBAAmB,KAAK,cACnC,KAAK,UAAU,eACf,KAAK,UAAU,UACf;AACA;AAAA,IACF;AAEA,SAAK,sBAAsB;AAC3B,SAAK,mBAAmB;AAExB,UAAM,eAAe;AAAA,MACnB,GAAG;AAAA,MACH,iBAAiB;AAAA,IAAA;AAGnB,QAAI,KAAK,aAAa;AACpB,WAAK,OAAO;AAAA,QACV,IAAI,KAAK,MAAM,MAAM,KAAK,MAAM,YAAA,CAAa,KAC3C,KAAK,OACP,KAAK,cAAc,QAAQ,CAAC,CAAC;AAAA,QAC7B,KAAK;AAAA,MAAA;AAAA,IAET;AAEA,QAAI,KAAK,UAAU;AACjB,UAAI;AACF,aAAK,SAAS,YAAY;AAAA,MAC5B,SAAS,KAAK;AACZ,aAAK,OAAO,KAAK,+BAA+B,GAAG,EAAE;AAAA,MACvD;AAAA,IACF;AAAA,EACF;AAAA,EAEQ,aACN,SACA,WACA,WACQ;AACR,UAAM,QAAQ,KAAK,aAAa,KAAK;AACrC,UAAM,cAAc,YAAY;AAChC,UAAM,cAAc,QAAQ;AAE5B,WAAO,KAAK,cAAc,UAAU,aAAa;AAAA,EACnD;AAAA,EAEA,UACE,SACA,SACA,SACM;AACN,SAAK,OAAO;AAAA,MACV,OAAO;AAAA,MACP;AAAA,MACA,iBAAiB;AAAA,MACjB;AAAA,IAAA,CACD;AAAA,EACH;AAAA,EAEA,WACE,SACA,SACA,SACM;AACN,SAAK,OAAO;AAAA,MACV,OAAO;AAAA,MACP;AAAA,MACA,iBAAiB;AAAA,MACjB;AAAA,IAAA,CACD;AAAA,EACH;AAAA,EAEA,WACE,SACA,SACA,SACM;AACN,SAAK,OAAO;AAAA,MACV,OAAO;AAAA,MACP;AAAA,MACA,iBAAiB;AAAA,MACjB;AAAA,IAAA,CACD;AAAA,EACH;AAAA,EAEA,UACE,SACA,SACA,SACM;AACN,SAAK,OAAO;AAAA,MACV,OAAO;AAAA,MACP;AAAA,MACA,iBAAiB;AAAA,MACjB;AAAA,IAAA,CACD;AAAA,EACH;AAAA,EAEA,UAAU,SAAiB,SAAqC;AAC9D,SAAK,OAAO,EAAE,OAAO,aAAa,SAAS,iBAAiB,KAAK,SAAS;AAAA,EAC5E;AAAA,EAEA,OAAO,SAAiB,SAAqC;AAC3D,SAAK,OAAO;AAAA,MACV,OAAO;AAAA,MACP;AAAA,MACA,iBAAiB,KAAK;AAAA,MACtB;AAAA,IAAA,CACD;AAAA,EACH;AACF;"}