@hyperttp/core 1.1.12 → 1.2.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 (95) hide show
  1. package/Core/HyperCore.d.ts +173 -8
  2. package/Core/HyperCore.d.ts.map +1 -1
  3. package/Core/HyperCore.js +329 -100
  4. package/Core/HyperCore.js.map +1 -1
  5. package/Core/index.d.ts +0 -1
  6. package/Core/index.d.ts.map +1 -1
  7. package/Core/index.js +0 -1
  8. package/Core/index.js.map +1 -1
  9. package/LICENSE +21 -0
  10. package/README.md +178 -0
  11. package/defaultConfig.d.ts +1 -1
  12. package/defaultConfig.d.ts.map +1 -1
  13. package/defaultConfig.js +0 -1
  14. package/defaultConfig.js.map +1 -1
  15. package/index.d.ts +1 -4
  16. package/index.d.ts.map +1 -1
  17. package/index.js +1 -1
  18. package/index.js.map +1 -1
  19. package/package.json +20 -6
  20. package/transports/node.d.ts +18 -7
  21. package/transports/node.d.ts.map +1 -1
  22. package/transports/node.js +255 -142
  23. package/transports/node.js.map +1 -1
  24. package/utils/errors.d.ts +49 -0
  25. package/utils/errors.d.ts.map +1 -0
  26. package/utils/errors.js +63 -0
  27. package/utils/errors.js.map +1 -0
  28. package/utils/merge.d.ts +8 -1
  29. package/utils/merge.d.ts.map +1 -1
  30. package/utils/merge.js +27 -13
  31. package/utils/merge.js.map +1 -1
  32. package/utils/response.d.ts +40 -0
  33. package/utils/response.d.ts.map +1 -0
  34. package/utils/response.js +79 -0
  35. package/utils/response.js.map +1 -0
  36. package/utils/retryUtils.d.ts +5 -0
  37. package/utils/retryUtils.d.ts.map +1 -0
  38. package/utils/retryUtils.js +35 -0
  39. package/utils/retryUtils.js.map +1 -0
  40. package/Core/RequestExecutor.d.ts +0 -64
  41. package/Core/RequestExecutor.d.ts.map +0 -1
  42. package/Core/RequestExecutor.js +0 -213
  43. package/Core/RequestExecutor.js.map +0 -1
  44. package/transports/bun.d.ts +0 -16
  45. package/transports/bun.d.ts.map +0 -1
  46. package/transports/bun.js +0 -181
  47. package/transports/bun.js.map +0 -1
  48. package/types/errors.d.ts +0 -20
  49. package/types/errors.d.ts.map +0 -1
  50. package/types/errors.js +0 -28
  51. package/types/errors.js.map +0 -1
  52. package/types/http.d.ts +0 -5
  53. package/types/http.d.ts.map +0 -1
  54. package/types/http.js +0 -2
  55. package/types/http.js.map +0 -1
  56. package/types/hyper.d.ts +0 -34
  57. package/types/hyper.d.ts.map +0 -1
  58. package/types/hyper.js +0 -2
  59. package/types/hyper.js.map +0 -1
  60. package/types/index.d.ts +0 -12
  61. package/types/index.d.ts.map +0 -1
  62. package/types/index.js +0 -12
  63. package/types/index.js.map +0 -1
  64. package/types/metrics.d.ts +0 -65
  65. package/types/metrics.d.ts.map +0 -1
  66. package/types/metrics.js +0 -2
  67. package/types/metrics.js.map +0 -1
  68. package/types/network.d.ts +0 -65
  69. package/types/network.d.ts.map +0 -1
  70. package/types/network.js +0 -2
  71. package/types/network.js.map +0 -1
  72. package/types/options.d.ts +0 -51
  73. package/types/options.d.ts.map +0 -1
  74. package/types/options.js +0 -2
  75. package/types/options.js.map +0 -1
  76. package/types/plugins.d.ts +0 -47
  77. package/types/plugins.d.ts.map +0 -1
  78. package/types/plugins.js +0 -2
  79. package/types/plugins.js.map +0 -1
  80. package/types/request.d.ts +0 -114
  81. package/types/request.d.ts.map +0 -1
  82. package/types/request.js +0 -2
  83. package/types/request.js.map +0 -1
  84. package/types/retry.d.ts +0 -28
  85. package/types/retry.d.ts.map +0 -1
  86. package/types/retry.js +0 -2
  87. package/types/retry.js.map +0 -1
  88. package/types/stream.d.ts +0 -39
  89. package/types/stream.d.ts.map +0 -1
  90. package/types/stream.js +0 -2
  91. package/types/stream.js.map +0 -1
  92. package/types/transport.d.ts +0 -25
  93. package/types/transport.d.ts.map +0 -1
  94. package/types/transport.js +0 -2
  95. package/types/transport.js.map +0 -1
package/README.md ADDED
@@ -0,0 +1,178 @@
1
+ # @hyperttp/core ⚡
2
+
3
+ > English | [Русский](https://github.com/IT-IF-OR/hyperttp-core/tree/main/lang/ru)
4
+
5
+ ---
6
+
7
+ ## 🌐 Language
8
+
9
+ - 🇺🇸 English
10
+ - 🇷🇺 [Русский](https://github.com/IT-IF-OR/hyperttp-core/tree/main/lang/ru)
11
+
12
+ ---
13
+
14
+ **Hyperttp** is a high-performance, isomorphic HTTP client designed for modern Node.js and Bun environments.
15
+ It is built as a thin core with an intelligent transport selection strategy and a powerful plugin system.
16
+
17
+ ## Why Hyperttp?
18
+
19
+ - **⚡ Performance:** optimized hot-path HTTP request execution for Node.js and Bun
20
+ - **🧩 Isomorphism:** unified API for Node.js and Bun. The system automatically selects the best transport
21
+ (native Bun, Undici, or standard Node.js `http`)
22
+ - **🔌 Plugin system:** easily extend functionality via hooks
23
+ (`onRequest`, `onResponse`, `onError`)
24
+ - **🛠️ Transport strategy:** easily add support for new runtimes
25
+ (Deno, Browser) via the `HyperTransport` interface
26
+
27
+ ---
28
+
29
+ ## Benchmarks
30
+
31
+ ### Test configuration
32
+
33
+ ```txt
34
+ Requests 100000
35
+ Concurrency 500
36
+ Warmup 500
37
+ Timeout 60000 ms
38
+ ```
39
+
40
+ Run benchmark:
41
+
42
+ ```bash
43
+ bun run bench.ts && npx tsx bench.ts
44
+ ```
45
+
46
+ ---
47
+
48
+ ## [Benchmark results](https://github.com/IT-IF-OR/bench)
49
+
50
+ ---
51
+
52
+ # 🟦 Node.js v24.14.1 — Undici transport
53
+
54
+ ### 🏆 Leaderboard (by RPS)
55
+
56
+ | Rank | Client | RPS | p99 | AVG | Heap |
57
+ | ---- | -------------- | ------ | -------- | ------- | ------- |
58
+ | 🥇 1 | @hyperttp/core | 27.72K | 43.45ms | 17.95ms | 18.7 MB |
59
+ | 🥈 2 | undici | 19.80K | 59.51ms | 25.17ms | 20.6 MB |
60
+ | 🥉 3 | ky | 7.82K | 119.80ms | 63.86ms | 34.1 MB |
61
+ | 4 | node-fetch | 6.39K | 125.38ms | 77.95ms | 15.2 MB |
62
+ | 5 | superagent | 6.28K | 127.06ms | 79.50ms | 15.1 MB |
63
+ | 6 | axios | 6.19K | 110.82ms | 80.53ms | 21.4 MB |
64
+ | 7 | got | 5.84K | 130.92ms | 85.49ms | 15.7 MB |
65
+
66
+ ---
67
+
68
+ # 🟨 Bun v1.3.14 — Bun transport
69
+
70
+ ### 🏆 Leaderboard (by RPS)
71
+
72
+ | Rank | Client | RPS | p99 | AVG | Heap |
73
+ | ---- | -------------- | ------ | ------- | ------- | ------- |
74
+ | 🥇 1 | undici | 36.42K | 15.67ms | 13.68ms | 31.8 MB |
75
+ | 🥈 2 | node-fetch | 36.29K | 16.70ms | 13.74ms | 4.07 MB |
76
+ | 🥉 3 | @hyperttp/core | 34.26K | 21.61ms | 14.54ms | 34.9 MB |
77
+ | 4 | ky | 31.10K | 22.78ms | 16.05ms | 9.88 MB |
78
+ | 5 | superagent | 13.86K | 69.78ms | 36.00ms | 18.1 MB |
79
+ | 6 | axios | 8.98K | 66.58ms | 55.52ms | 18.8 MB |
80
+ | 7 | got | 7.15K | 86.70ms | 69.83ms | 25.2 MB |
81
+
82
+ ---
83
+
84
+ # 🟩 Node.js v24.14.1 — Node transport
85
+
86
+ ### 🏆 Leaderboard (by RPS)
87
+
88
+ | Rank | Client | RPS | p99 | AVG | Heap |
89
+ | ---- | -------------- | ------ | -------- | ------- | ------- |
90
+ | 🥇 1 | undici | 20.08K | 66.21ms | 24.76ms | 20.6 MB |
91
+ | 🥈 2 | @hyperttp/core | 12.52K | 66.42ms | 39.80ms | 14.1 MB |
92
+ | 🥉 3 | ky | 7.98K | 113.21ms | 62.55ms | 23.1 MB |
93
+ | 4 | node-fetch | 6.71K | 114.06ms | 74.23ms | 15.9 MB |
94
+ | 5 | axios | 6.29K | 116.21ms | 79.22ms | 22.2 MB |
95
+ | 6 | superagent | 6.19K | 125.31ms | 80.73ms | 15.2 MB |
96
+ | 7 | got | 5.86K | 135.85ms | 85.18ms | 19.3 MB |
97
+
98
+ ---
99
+
100
+ # 🟪 Bun v1.3.14 — Node transport
101
+
102
+ ### 🏆 Leaderboard (by RPS)
103
+
104
+ | Rank | Client | RPS | p99 | AVG | Heap |
105
+ | ---- | -------------- | ------ | -------- | ------- | ------- |
106
+ | 🥇 1 | node-fetch | 35.87K | 17.00ms | 13.90ms | 6.21 MB |
107
+ | 🥈 2 | undici | 35.79K | 16.59ms | 13.92ms | 25.4 MB |
108
+ | 🥉 3 | ky | 29.68K | 37.27ms | 16.80ms | 17.3 MB |
109
+ | 4 | @hyperttp/core | 17.32K | 50.71ms | 28.79ms | 17.5 MB |
110
+ | 5 | superagent | 13.73K | 122.70ms | 36.37ms | 34.4 MB |
111
+ | 6 | axios | 8.77K | 86.39ms | 56.84ms | 18.9 MB |
112
+ | 7 | got | 6.97K | 98.33ms | 71.64ms | 25.3 MB |
113
+
114
+ ---
115
+
116
+ ## Quick start
117
+
118
+ ### Installation
119
+
120
+ ```bash
121
+ npm install @hyperttp/core
122
+ ```
123
+
124
+ ---
125
+
126
+ ### Usage
127
+
128
+ ```typescript
129
+ import { HyperCore } from "@hyperttp/core";
130
+
131
+ const http = new HyperCore({
132
+ network: { userAgent: "MyApp/1.0" },
133
+ });
134
+
135
+ // GET request
136
+ const response = await http.get("https://api.example.com/data");
137
+
138
+ // POST request
139
+ const result = await http.post("/users", { name: "John" });
140
+ ```
141
+
142
+ ---
143
+
144
+ ### Extending and plugins
145
+
146
+ `HyperCore` supports creating isolated instances with custom configuration and plugins.
147
+
148
+ ```typescript
149
+ const apiClient = http.extend({
150
+ network: { headers: { "X-Auth": "secret" } },
151
+ });
152
+
153
+ apiClient.use({
154
+ name: "logger-plugin",
155
+ enabled: () => true,
156
+ onRequest: async (req) => {
157
+ console.log(`Sending ${req.method} to ${req.url}`);
158
+ },
159
+ });
160
+ ```
161
+
162
+ ---
163
+
164
+ ## Architecture
165
+
166
+ Hyperttp is built on the **Strategy pattern**.
167
+
168
+ 1. **Core (`HyperCore`)**: orchestrates the request lifecycle
169
+ 2. **Transports (`HyperTransport`)**: low-level implementations for different runtimes
170
+ dynamically selected to minimize bundle size
171
+ 3. **Hooks**: executed during request lifecycle (before request, after response, on error)
172
+ allowing interception and modification without changing core logic
173
+
174
+ ---
175
+
176
+ ## License
177
+
178
+ MIT
@@ -1,3 +1,3 @@
1
- import { HttpClientOptions } from "./types/options.js";
1
+ import type { HttpClientOptions } from "@hyperttp/types";
2
2
  export declare const defaultConfig: HttpClientOptions;
3
3
  //# sourceMappingURL=defaultConfig.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"defaultConfig.d.ts","sourceRoot":"","sources":["../src/defaultConfig.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AAEvD,eAAO,MAAM,aAAa,EAAE,iBAmB3B,CAAC"}
1
+ {"version":3,"file":"defaultConfig.d.ts","sourceRoot":"","sources":["../src/defaultConfig.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AAEzD,eAAO,MAAM,aAAa,EAAE,iBAkB3B,CAAC"}
package/defaultConfig.js CHANGED
@@ -2,7 +2,6 @@ export const defaultConfig = {
2
2
  network: {
3
3
  timeout: 30000,
4
4
  maxConcurrent: 500,
5
- allowHttp2: true,
6
5
  pipelining: 10,
7
6
  keepAliveTimeout: 30000,
8
7
  followRedirects: true,
@@ -1 +1 @@
1
- {"version":3,"file":"defaultConfig.js","sourceRoot":"","sources":["../src/defaultConfig.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,MAAM,aAAa,GAAsB;IAC9C,OAAO,EAAE;QACP,OAAO,EAAE,KAAK;QACd,aAAa,EAAE,GAAG;QAClB,UAAU,EAAE,IAAI;QAChB,UAAU,EAAE,EAAE;QACd,gBAAgB,EAAE,KAAK;QACvB,eAAe,EAAE,IAAI;QACrB,YAAY,EAAE,CAAC;QACf,kBAAkB,EAAE,IAAI;QACxB,SAAS,EAAE,cAAc;KAC1B;IACD,KAAK,EAAE;QACL,UAAU,EAAE,CAAC;QACb,SAAS,EAAE,GAAG;QACd,QAAQ,EAAE,IAAI;QACd,MAAM,EAAE,IAAI;KACb;IACD,OAAO,EAAE,KAAK;CACf,CAAC"}
1
+ {"version":3,"file":"defaultConfig.js","sourceRoot":"","sources":["../src/defaultConfig.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,MAAM,aAAa,GAAsB;IAC9C,OAAO,EAAE;QACP,OAAO,EAAE,KAAK;QACd,aAAa,EAAE,GAAG;QAClB,UAAU,EAAE,EAAE;QACd,gBAAgB,EAAE,KAAK;QACvB,eAAe,EAAE,IAAI;QACrB,YAAY,EAAE,CAAC;QACf,kBAAkB,EAAE,IAAI;QACxB,SAAS,EAAE,cAAc;KAC1B;IACD,KAAK,EAAE;QACL,UAAU,EAAE,CAAC;QACb,SAAS,EAAE,GAAG;QACd,QAAQ,EAAE,IAAI;QACd,MAAM,EAAE,IAAI;KACb;IACD,OAAO,EAAE,KAAK;CACf,CAAC"}
package/index.d.ts CHANGED
@@ -1,6 +1,3 @@
1
- export { HyperCore, RequestExecutor } from "./Core/index.js";
1
+ export { HyperCore } from "./Core/index.js";
2
2
  export { deepMerge } from "./utils/merge.js";
3
- export type * from "./types/index.js";
4
- export type * from "./transports/bun.js";
5
- export type * from "./transports/node.js";
6
3
  //# sourceMappingURL=index.d.ts.map
package/index.d.ts.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAE7D,OAAO,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAE7C,mBAAmB,kBAAkB,CAAC;AACtC,mBAAmB,qBAAqB,CAAC;AACzC,mBAAmB,sBAAsB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAC5C,OAAO,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC"}
package/index.js CHANGED
@@ -1,3 +1,3 @@
1
- export { HyperCore, RequestExecutor } from "./Core/index.js";
1
+ export { HyperCore } from "./Core/index.js";
2
2
  export { deepMerge } from "./utils/merge.js";
3
3
  //# sourceMappingURL=index.js.map
package/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAE7D,OAAO,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAC5C,OAAO,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC"}
package/package.json CHANGED
@@ -1,10 +1,18 @@
1
1
  {
2
2
  "name": "@hyperttp/core",
3
- "version": "1.1.12",
4
- "description": "High-performance, extensible HTTP client for Node.js and Bun",
3
+ "version": "1.2.0",
4
+ "description": "High-performance, extensible HTTP client for Node.js and Bun and other",
5
5
  "type": "module",
6
6
  "main": "./index.js",
7
7
  "types": "./index.d.ts",
8
+ "exports": {
9
+ ".": {
10
+ "types": "./index.d.ts",
11
+ "import": "./index.js",
12
+ "require": "./index.js"
13
+ },
14
+ "./package.json": "./package.json"
15
+ },
8
16
  "keywords": [
9
17
  "http",
10
18
  "client",
@@ -20,11 +28,17 @@
20
28
  "url": "git+https://github.com/IT-IF-OR/hyperttp-core.git"
21
29
  },
22
30
  "peerDependencies": {
23
- "typescript": "^6"
31
+ "typescript": "^6",
32
+ "@hyperttp/transport-bun": "^0.1.1",
33
+ "@hyperttp/transport-undici": "^0.1.0"
24
34
  },
25
- "dependencies": {
26
- "http-cookie-agent": "^8.0.0",
27
- "undici": "^8.3.0"
35
+ "peerDependenciesMeta": {
36
+ "@hyperttp/transport-bun": {
37
+ "optional": true
38
+ },
39
+ "@hyperttp/transport-undici": {
40
+ "optional": true
41
+ }
28
42
  },
29
43
  "private": false
30
44
  }
@@ -1,14 +1,25 @@
1
- import type { HyperTransport, TransportRequest, TransportResponse } from "../types/transport.js";
2
- import type { HttpClientOptions } from "../types/options.js";
1
+ import type { HttpClientOptions, HyperTransport, RetryOptions, TransportRequest, TransportResponse } from "@hyperttp/types";
2
+ export declare function isRedirect(status: number): boolean;
3
+ export declare function combineSignal(signal: AbortSignal | undefined, timeoutMs: number): {
4
+ signal?: AbortSignal;
5
+ cancelTimer: () => void;
6
+ isTimeoutAbort: () => boolean;
7
+ };
8
+ export declare function shouldRetry(status: number, retryOptions: RetryOptions): boolean;
9
+ export declare function sleep(ms: number): Promise<void>;
10
+ export declare function calcDelay(attempt: number, retryOptions: RetryOptions): number;
11
+ /**
12
+ * @ru Высокопроизводительный транспорт на базе классических модулей http/https Node.js.
13
+ */
3
14
  export declare class NodeTransport implements HyperTransport {
4
- private agent;
5
- private executor;
6
- private isClosed;
15
+ config: HttpClientOptions;
16
+ private readonly httpAgent;
17
+ private readonly httpsAgent;
7
18
  constructor(config: HttpClientOptions);
19
+ private get timeout();
8
20
  execute(req: TransportRequest): Promise<TransportResponse>;
9
- private wrapDecompress;
21
+ private dispatchOnce;
10
22
  close(): Promise<void>;
11
23
  destroy(): Promise<void>;
12
- private logWarning;
13
24
  }
14
25
  //# sourceMappingURL=node.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"node.d.ts","sourceRoot":"","sources":["../../src/transports/node.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EACV,cAAc,EACd,gBAAgB,EAChB,iBAAiB,EAClB,MAAM,uBAAuB,CAAC;AAC/B,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AAU7D,qBAAa,aAAc,YAAW,cAAc;IAClD,OAAO,CAAC,KAAK,CAAc;IAC3B,OAAO,CAAC,QAAQ,CAAkB;IAClC,OAAO,CAAC,QAAQ,CAAS;gBAEb,MAAM,EAAE,iBAAiB;IA2CxB,OAAO,CAAC,GAAG,EAAE,gBAAgB,GAAG,OAAO,CAAC,iBAAiB,CAAC;IA4EvE,OAAO,CAAC,cAAc;IA0BT,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAkBtB,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IAgBrC,OAAO,CAAC,UAAU;CAMnB"}
1
+ {"version":3,"file":"node.d.ts","sourceRoot":"","sources":["../../src/transports/node.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EACV,iBAAiB,EACjB,cAAc,EACd,YAAY,EACZ,gBAAgB,EAChB,iBAAiB,EAElB,MAAM,iBAAiB,CAAC;AAKzB,wBAAgB,UAAU,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAElD;AAED,wBAAgB,aAAa,CAC3B,MAAM,EAAE,WAAW,GAAG,SAAS,EAC/B,SAAS,EAAE,MAAM,GAChB;IACD,MAAM,CAAC,EAAE,WAAW,CAAC;IACrB,WAAW,EAAE,MAAM,IAAI,CAAC;IACxB,cAAc,EAAE,MAAM,OAAO,CAAC;CAC/B,CA8BA;AAED,wBAAgB,WAAW,CACzB,MAAM,EAAE,MAAM,EACd,YAAY,EAAE,YAAY,GACzB,OAAO,CAMT;AAED,wBAAgB,KAAK,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAE/C;AAED,wBAAgB,SAAS,CAAC,OAAO,EAAE,MAAM,EAAE,YAAY,EAAE,YAAY,GAAG,MAAM,CAI7E;AAkED;;GAEG;AACH,qBAAa,aAAc,YAAW,cAAc;IAC3C,MAAM,EAAE,iBAAiB,CAAC;IACjC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAa;IACvC,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAc;gBAE7B,MAAM,EAAE,iBAAiB;IAkBrC,OAAO,KAAK,OAAO,GAElB;IAEY,OAAO,CAAC,GAAG,EAAE,gBAAgB,GAAG,OAAO,CAAC,iBAAiB,CAAC;IAuHvE,OAAO,CAAC,YAAY;IAwEP,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAKtB,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;CAGtC"}