@adaptic/utils 0.1.44 → 0.1.45

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 (225) hide show
  1. package/README.md +61 -153
  2. package/dist/index.cjs +5356 -60315
  3. package/dist/index.cjs.map +1 -1
  4. package/dist/index.mjs +5356 -60054
  5. package/dist/index.mjs.map +1 -1
  6. package/dist/test.js +361 -824
  7. package/dist/test.js.map +1 -1
  8. package/dist/types/adaptic.d.ts +2 -2
  9. package/dist/types/adaptic.d.ts.map +1 -1
  10. package/dist/types/alpaca-functions.d.ts +233 -0
  11. package/dist/types/alpaca-functions.d.ts.map +1 -0
  12. package/dist/types/alpaca-market-data-api.d.ts +9 -24
  13. package/dist/types/alpaca-market-data-api.d.ts.map +1 -1
  14. package/dist/types/alpaca-trading-api.d.ts +12 -12
  15. package/dist/types/alpaca-trading-api.d.ts.map +1 -1
  16. package/dist/types/alphavantage.d.ts +1 -1
  17. package/dist/types/alphavantage.d.ts.map +1 -1
  18. package/dist/types/asset-allocation-algorithm.d.ts +1 -7
  19. package/dist/types/asset-allocation-algorithm.d.ts.map +1 -1
  20. package/dist/types/cache/stampede-protected-cache.d.ts.map +1 -1
  21. package/dist/types/crypto.d.ts +4 -4
  22. package/dist/types/crypto.d.ts.map +1 -1
  23. package/dist/types/display-manager.d.ts +1 -1
  24. package/dist/types/display-manager.d.ts.map +1 -1
  25. package/dist/types/examples/asset-allocation-example.d.ts +6 -7
  26. package/dist/types/examples/asset-allocation-example.d.ts.map +1 -1
  27. package/dist/types/format-tools.d.ts.map +1 -1
  28. package/dist/types/index.d.ts +55 -393
  29. package/dist/types/index.d.ts.map +1 -1
  30. package/dist/types/logging.d.ts +1 -1
  31. package/dist/types/logging.d.ts.map +1 -1
  32. package/dist/types/market-hours.d.ts.map +1 -1
  33. package/dist/types/market-time.d.ts +13 -75
  34. package/dist/types/market-time.d.ts.map +1 -1
  35. package/dist/types/metrics-calcs.d.ts.map +1 -1
  36. package/dist/types/misc-utils.d.ts +1 -4
  37. package/dist/types/misc-utils.d.ts.map +1 -1
  38. package/dist/types/performance-metrics.d.ts +6 -6
  39. package/dist/types/performance-metrics.d.ts.map +1 -1
  40. package/dist/types/polygon-indices.d.ts +3 -3
  41. package/dist/types/polygon-indices.d.ts.map +1 -1
  42. package/dist/types/polygon.d.ts +1 -1
  43. package/dist/types/polygon.d.ts.map +1 -1
  44. package/dist/types/price-utils.d.ts.map +1 -1
  45. package/dist/types/technical-analysis.d.ts +9 -9
  46. package/dist/types/technical-analysis.d.ts.map +1 -1
  47. package/dist/types/time-utils.d.ts.map +1 -1
  48. package/dist/types/types/adaptic-types.d.ts +1 -1
  49. package/dist/types/types/adaptic-types.d.ts.map +1 -1
  50. package/dist/types/types/alpaca-types.d.ts +89 -252
  51. package/dist/types/types/alpaca-types.d.ts.map +1 -1
  52. package/dist/types/types/alphavantage-types.d.ts +2 -2
  53. package/dist/types/types/asset-allocation-types.d.ts +11 -11
  54. package/dist/types/types/index.d.ts +8 -8
  55. package/dist/types/types/index.d.ts.map +1 -1
  56. package/dist/types/types/logging-types.d.ts +2 -2
  57. package/dist/types/types/logging-types.d.ts.map +1 -1
  58. package/dist/types/types/market-time-types.d.ts +4 -4
  59. package/dist/types/types/market-time-types.d.ts.map +1 -1
  60. package/dist/types/types/metrics-types.d.ts +4 -4
  61. package/dist/types/types/metrics-types.d.ts.map +1 -1
  62. package/dist/types/types/polygon-indices-types.d.ts +6 -6
  63. package/dist/types/types/polygon-types.d.ts +3 -3
  64. package/dist/types/types/ta-types.d.ts +3 -3
  65. package/package.json +6 -24
  66. package/dist/types/__tests__/alpaca-functions.test.d.ts +0 -2
  67. package/dist/types/__tests__/alpaca-functions.test.d.ts.map +0 -1
  68. package/dist/types/__tests__/api-endpoints.test.d.ts +0 -2
  69. package/dist/types/__tests__/api-endpoints.test.d.ts.map +0 -1
  70. package/dist/types/__tests__/asset-allocation.test.d.ts +0 -2
  71. package/dist/types/__tests__/asset-allocation.test.d.ts.map +0 -1
  72. package/dist/types/__tests__/auth-validator.test.d.ts +0 -2
  73. package/dist/types/__tests__/auth-validator.test.d.ts.map +0 -1
  74. package/dist/types/__tests__/cache.test.d.ts +0 -2
  75. package/dist/types/__tests__/cache.test.d.ts.map +0 -1
  76. package/dist/types/__tests__/errors.test.d.ts +0 -2
  77. package/dist/types/__tests__/errors.test.d.ts.map +0 -1
  78. package/dist/types/__tests__/financial-regression.test.d.ts +0 -2
  79. package/dist/types/__tests__/financial-regression.test.d.ts.map +0 -1
  80. package/dist/types/__tests__/format-tools.test.d.ts +0 -2
  81. package/dist/types/__tests__/format-tools.test.d.ts.map +0 -1
  82. package/dist/types/__tests__/http-keep-alive.test.d.ts +0 -2
  83. package/dist/types/__tests__/http-keep-alive.test.d.ts.map +0 -1
  84. package/dist/types/__tests__/http-timeout.test.d.ts +0 -2
  85. package/dist/types/__tests__/http-timeout.test.d.ts.map +0 -1
  86. package/dist/types/__tests__/logger.test.d.ts +0 -2
  87. package/dist/types/__tests__/logger.test.d.ts.map +0 -1
  88. package/dist/types/__tests__/market-time.test.d.ts +0 -2
  89. package/dist/types/__tests__/market-time.test.d.ts.map +0 -1
  90. package/dist/types/__tests__/misc-utils.test.d.ts +0 -2
  91. package/dist/types/__tests__/misc-utils.test.d.ts.map +0 -1
  92. package/dist/types/__tests__/paginator.test.d.ts +0 -2
  93. package/dist/types/__tests__/paginator.test.d.ts.map +0 -1
  94. package/dist/types/__tests__/performance-metrics.test.d.ts +0 -2
  95. package/dist/types/__tests__/performance-metrics.test.d.ts.map +0 -1
  96. package/dist/types/__tests__/polygon.test.d.ts +0 -2
  97. package/dist/types/__tests__/polygon.test.d.ts.map +0 -1
  98. package/dist/types/__tests__/price-utils.test.d.ts +0 -2
  99. package/dist/types/__tests__/price-utils.test.d.ts.map +0 -1
  100. package/dist/types/__tests__/property-based-financial.test.d.ts +0 -2
  101. package/dist/types/__tests__/property-based-financial.test.d.ts.map +0 -1
  102. package/dist/types/__tests__/rate-limiter.test.d.ts +0 -2
  103. package/dist/types/__tests__/rate-limiter.test.d.ts.map +0 -1
  104. package/dist/types/__tests__/schema-validation.test.d.ts +0 -2
  105. package/dist/types/__tests__/schema-validation.test.d.ts.map +0 -1
  106. package/dist/types/__tests__/technical-analysis.test.d.ts +0 -2
  107. package/dist/types/__tests__/technical-analysis.test.d.ts.map +0 -1
  108. package/dist/types/__tests__/time-utils.test.d.ts +0 -2
  109. package/dist/types/__tests__/time-utils.test.d.ts.map +0 -1
  110. package/dist/types/alpaca/client.d.ts +0 -95
  111. package/dist/types/alpaca/client.d.ts.map +0 -1
  112. package/dist/types/alpaca/crypto/data.d.ts +0 -281
  113. package/dist/types/alpaca/crypto/data.d.ts.map +0 -1
  114. package/dist/types/alpaca/crypto/index.d.ts +0 -75
  115. package/dist/types/alpaca/crypto/index.d.ts.map +0 -1
  116. package/dist/types/alpaca/crypto/orders.d.ts +0 -221
  117. package/dist/types/alpaca/crypto/orders.d.ts.map +0 -1
  118. package/dist/types/alpaca/index.d.ts +0 -205
  119. package/dist/types/alpaca/index.d.ts.map +0 -1
  120. package/dist/types/alpaca/legacy/account.d.ts +0 -34
  121. package/dist/types/alpaca/legacy/account.d.ts.map +0 -1
  122. package/dist/types/alpaca/legacy/assets.d.ts +0 -13
  123. package/dist/types/alpaca/legacy/assets.d.ts.map +0 -1
  124. package/dist/types/alpaca/legacy/auth.d.ts +0 -18
  125. package/dist/types/alpaca/legacy/auth.d.ts.map +0 -1
  126. package/dist/types/alpaca/legacy/index.d.ts +0 -15
  127. package/dist/types/alpaca/legacy/index.d.ts.map +0 -1
  128. package/dist/types/alpaca/legacy/market-data.d.ts +0 -32
  129. package/dist/types/alpaca/legacy/market-data.d.ts.map +0 -1
  130. package/dist/types/alpaca/legacy/orders.d.ts +0 -84
  131. package/dist/types/alpaca/legacy/orders.d.ts.map +0 -1
  132. package/dist/types/alpaca/legacy/positions.d.ts +0 -66
  133. package/dist/types/alpaca/legacy/positions.d.ts.map +0 -1
  134. package/dist/types/alpaca/legacy/utils.d.ts +0 -18
  135. package/dist/types/alpaca/legacy/utils.d.ts.map +0 -1
  136. package/dist/types/alpaca/market-data/bars.d.ts +0 -142
  137. package/dist/types/alpaca/market-data/bars.d.ts.map +0 -1
  138. package/dist/types/alpaca/market-data/index.d.ts +0 -13
  139. package/dist/types/alpaca/market-data/index.d.ts.map +0 -1
  140. package/dist/types/alpaca/market-data/news.d.ts +0 -87
  141. package/dist/types/alpaca/market-data/news.d.ts.map +0 -1
  142. package/dist/types/alpaca/market-data/quotes.d.ts +0 -85
  143. package/dist/types/alpaca/market-data/quotes.d.ts.map +0 -1
  144. package/dist/types/alpaca/market-data/trades.d.ts +0 -98
  145. package/dist/types/alpaca/market-data/trades.d.ts.map +0 -1
  146. package/dist/types/alpaca/options/contracts.d.ts +0 -279
  147. package/dist/types/alpaca/options/contracts.d.ts.map +0 -1
  148. package/dist/types/alpaca/options/data.d.ts +0 -126
  149. package/dist/types/alpaca/options/data.d.ts.map +0 -1
  150. package/dist/types/alpaca/options/index.d.ts +0 -17
  151. package/dist/types/alpaca/options/index.d.ts.map +0 -1
  152. package/dist/types/alpaca/options/orders.d.ts +0 -366
  153. package/dist/types/alpaca/options/orders.d.ts.map +0 -1
  154. package/dist/types/alpaca/options/strategies.d.ts +0 -224
  155. package/dist/types/alpaca/options/strategies.d.ts.map +0 -1
  156. package/dist/types/alpaca/streams/base-stream.d.ts +0 -143
  157. package/dist/types/alpaca/streams/base-stream.d.ts.map +0 -1
  158. package/dist/types/alpaca/streams/crypto-stream.d.ts +0 -173
  159. package/dist/types/alpaca/streams/crypto-stream.d.ts.map +0 -1
  160. package/dist/types/alpaca/streams/index.d.ts +0 -54
  161. package/dist/types/alpaca/streams/index.d.ts.map +0 -1
  162. package/dist/types/alpaca/streams/option-stream.d.ts +0 -167
  163. package/dist/types/alpaca/streams/option-stream.d.ts.map +0 -1
  164. package/dist/types/alpaca/streams/stock-stream.d.ts +0 -176
  165. package/dist/types/alpaca/streams/stock-stream.d.ts.map +0 -1
  166. package/dist/types/alpaca/streams/stream-manager.d.ts +0 -277
  167. package/dist/types/alpaca/streams/stream-manager.d.ts.map +0 -1
  168. package/dist/types/alpaca/streams/trading-stream.d.ts +0 -186
  169. package/dist/types/alpaca/streams/trading-stream.d.ts.map +0 -1
  170. package/dist/types/alpaca/streams.d.ts +0 -88
  171. package/dist/types/alpaca/streams.d.ts.map +0 -1
  172. package/dist/types/alpaca/test-imports.d.ts +0 -7
  173. package/dist/types/alpaca/test-imports.d.ts.map +0 -1
  174. package/dist/types/alpaca/trading/account.d.ts +0 -198
  175. package/dist/types/alpaca/trading/account.d.ts.map +0 -1
  176. package/dist/types/alpaca/trading/bracket-orders.d.ts +0 -162
  177. package/dist/types/alpaca/trading/bracket-orders.d.ts.map +0 -1
  178. package/dist/types/alpaca/trading/clock.d.ts +0 -99
  179. package/dist/types/alpaca/trading/clock.d.ts.map +0 -1
  180. package/dist/types/alpaca/trading/index.d.ts +0 -15
  181. package/dist/types/alpaca/trading/index.d.ts.map +0 -1
  182. package/dist/types/alpaca/trading/oco-orders.d.ts +0 -203
  183. package/dist/types/alpaca/trading/oco-orders.d.ts.map +0 -1
  184. package/dist/types/alpaca/trading/order-utils.d.ts +0 -404
  185. package/dist/types/alpaca/trading/order-utils.d.ts.map +0 -1
  186. package/dist/types/alpaca/trading/orders.d.ts +0 -199
  187. package/dist/types/alpaca/trading/orders.d.ts.map +0 -1
  188. package/dist/types/alpaca/trading/oto-orders.d.ts +0 -282
  189. package/dist/types/alpaca/trading/oto-orders.d.ts.map +0 -1
  190. package/dist/types/alpaca/trading/positions.d.ts +0 -389
  191. package/dist/types/alpaca/trading/positions.d.ts.map +0 -1
  192. package/dist/types/alpaca/trading/smart-orders.d.ts +0 -301
  193. package/dist/types/alpaca/trading/smart-orders.d.ts.map +0 -1
  194. package/dist/types/alpaca/trading/trailing-stops.d.ts +0 -240
  195. package/dist/types/alpaca/trading/trailing-stops.d.ts.map +0 -1
  196. package/dist/types/config/api-endpoints.d.ts +0 -94
  197. package/dist/types/config/api-endpoints.d.ts.map +0 -1
  198. package/dist/types/errors/index.d.ts +0 -130
  199. package/dist/types/errors/index.d.ts.map +0 -1
  200. package/dist/types/examples/rate-limiter-example.d.ts +0 -7
  201. package/dist/types/examples/rate-limiter-example.d.ts.map +0 -1
  202. package/dist/types/http-timeout.d.ts +0 -37
  203. package/dist/types/http-timeout.d.ts.map +0 -1
  204. package/dist/types/logger.d.ts +0 -56
  205. package/dist/types/logger.d.ts.map +0 -1
  206. package/dist/types/rate-limiter.d.ts +0 -171
  207. package/dist/types/rate-limiter.d.ts.map +0 -1
  208. package/dist/types/schemas/alpaca-schemas.d.ts +0 -779
  209. package/dist/types/schemas/alpaca-schemas.d.ts.map +0 -1
  210. package/dist/types/schemas/alphavantage-schemas.d.ts +0 -255
  211. package/dist/types/schemas/alphavantage-schemas.d.ts.map +0 -1
  212. package/dist/types/schemas/index.d.ts +0 -21
  213. package/dist/types/schemas/index.d.ts.map +0 -1
  214. package/dist/types/schemas/polygon-schemas.d.ts +0 -551
  215. package/dist/types/schemas/polygon-schemas.d.ts.map +0 -1
  216. package/dist/types/schemas/validate-response.d.ts +0 -88
  217. package/dist/types/schemas/validate-response.d.ts.map +0 -1
  218. package/dist/types/utils/auth-validator.d.ts +0 -32
  219. package/dist/types/utils/auth-validator.d.ts.map +0 -1
  220. package/dist/types/utils/http-keep-alive.d.ts +0 -110
  221. package/dist/types/utils/http-keep-alive.d.ts.map +0 -1
  222. package/dist/types/utils/paginator.d.ts +0 -154
  223. package/dist/types/utils/paginator.d.ts.map +0 -1
  224. package/dist/types/utils/retry.d.ts +0 -78
  225. package/dist/types/utils/retry.d.ts.map +0 -1
@@ -1,171 +0,0 @@
1
- /**
2
- * Token bucket rate limiter for external API integrations
3
- *
4
- * Implements client-side rate limiting to prevent exceeding API quotas
5
- * and ensure fair usage of external services like Alpaca, Polygon, and AlphaVantage.
6
- *
7
- * @example
8
- * ```typescript
9
- * import { rateLimiters } from '@adaptic/utils';
10
- *
11
- * // Before making an API call
12
- * await rateLimiters.alpaca.acquire();
13
- * const result = await makeAlpacaApiCall();
14
- * ```
15
- */
16
- import { RateLimitError } from "./errors";
17
- export { RateLimitError };
18
- /**
19
- * Configuration for a rate limiter instance
20
- */
21
- export interface RateLimiterConfig {
22
- /** Maximum number of tokens (requests) that can be accumulated */
23
- maxTokens: number;
24
- /** Rate at which tokens are refilled (tokens per second) */
25
- refillRate: number;
26
- /** Human-readable label for logging and error messages */
27
- label: string;
28
- /** Maximum time to wait for a token before timing out (milliseconds) */
29
- timeoutMs?: number;
30
- }
31
- /**
32
- * Token bucket rate limiter implementation
33
- *
34
- * Uses the token bucket algorithm to control the rate of API requests.
35
- * Tokens are consumed on each request and refilled at a constant rate.
36
- * Requests that exceed the available tokens are queued and processed
37
- * when tokens become available.
38
- */
39
- export declare class TokenBucketRateLimiter {
40
- private readonly config;
41
- private tokens;
42
- private lastRefill;
43
- private queue;
44
- private readonly timeoutMs;
45
- private processingQueue;
46
- /**
47
- * Creates a new rate limiter instance
48
- *
49
- * @param config - Rate limiter configuration
50
- *
51
- * @example
52
- * ```typescript
53
- * // Alpaca: 200 requests per minute
54
- * const alpacaLimiter = new TokenBucketRateLimiter({
55
- * maxTokens: 200,
56
- * refillRate: 200 / 60, // ~3.33 per second
57
- * label: 'alpaca',
58
- * timeoutMs: 60000
59
- * });
60
- * ```
61
- */
62
- constructor(config: RateLimiterConfig);
63
- /**
64
- * Acquires a token for making an API request
65
- *
66
- * If a token is available, it is consumed immediately.
67
- * If no tokens are available, the request is queued and will resolve
68
- * when a token becomes available or reject if it times out.
69
- *
70
- * @throws {RateLimitError} If the request times out waiting for a token
71
- *
72
- * @example
73
- * ```typescript
74
- * try {
75
- * await limiter.acquire();
76
- * // Make API call
77
- * } catch (error) {
78
- * if (error instanceof RateLimitError) {
79
- * // Handle rate limit timeout
80
- * }
81
- * }
82
- * ```
83
- */
84
- acquire(): Promise<void>;
85
- /**
86
- * Refills tokens based on elapsed time and processes queued requests
87
- *
88
- * Tokens are refilled at the configured rate up to the maximum capacity.
89
- * If tokens are available after refilling, queued requests are processed.
90
- */
91
- private refill;
92
- /**
93
- * Processes queued requests when tokens are available
94
- *
95
- * Prevents concurrent queue processing to ensure FIFO order.
96
- */
97
- private processQueue;
98
- /**
99
- * Gets the current number of available tokens
100
- *
101
- * @returns Number of tokens currently available
102
- */
103
- getAvailableTokens(): number;
104
- /**
105
- * Gets the current queue length
106
- *
107
- * @returns Number of requests waiting for tokens
108
- */
109
- getQueueLength(): number;
110
- /**
111
- * Clears all queued requests and resets the token bucket
112
- *
113
- * All queued requests will be rejected with a RateLimitError.
114
- * Useful for cleanup or when changing rate limit configurations.
115
- */
116
- reset(): void;
117
- }
118
- /**
119
- * Pre-configured rate limiters for common external APIs
120
- *
121
- * These limiters are configured based on the documented rate limits
122
- * for each service. Adjust the configurations if you have different
123
- * tier access or if limits change.
124
- *
125
- * @example
126
- * ```typescript
127
- * import { rateLimiters } from '@adaptic/utils';
128
- *
129
- * // Use before making API calls
130
- * await rateLimiters.alpaca.acquire();
131
- * await rateLimiters.polygon.acquire();
132
- * await rateLimiters.alphaVantage.acquire();
133
- * ```
134
- */
135
- export declare const rateLimiters: {
136
- /**
137
- * Alpaca API rate limiter
138
- *
139
- * Configured for 200 requests per minute.
140
- * See: https://alpaca.markets/docs/api-references/trading-api/#rate-limit
141
- */
142
- alpaca: TokenBucketRateLimiter;
143
- /**
144
- * Polygon.io API rate limiter
145
- *
146
- * Configured for 5 requests per second (basic plan).
147
- * Adjust if you have a different subscription tier.
148
- * See: https://polygon.io/pricing
149
- */
150
- polygon: TokenBucketRateLimiter;
151
- /**
152
- * AlphaVantage API rate limiter
153
- *
154
- * Configured for 5 requests per minute (free tier).
155
- * For premium tier (75/min), create a custom limiter:
156
- *
157
- * @example
158
- * ```typescript
159
- * const premiumAV = new TokenBucketRateLimiter({
160
- * maxTokens: 75,
161
- * refillRate: 75 / 60,
162
- * label: 'alphaVantage-premium',
163
- * timeoutMs: 60000,
164
- * });
165
- * ```
166
- *
167
- * See: https://www.alphavantage.co/premium/
168
- */
169
- alphaVantage: TokenBucketRateLimiter;
170
- };
171
- //# sourceMappingURL=rate-limiter.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"rate-limiter.d.ts","sourceRoot":"","sources":["../../src/rate-limiter.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAGH,OAAO,EAAE,cAAc,EAAE,MAAM,UAAU,CAAC;AAC1C,OAAO,EAAE,cAAc,EAAE,CAAC;AAE1B;;GAEG;AACH,MAAM,WAAW,iBAAiB;IAChC,kEAAkE;IAClE,SAAS,EAAE,MAAM,CAAC;IAClB,4DAA4D;IAC5D,UAAU,EAAE,MAAM,CAAC;IACnB,0DAA0D;IAC1D,KAAK,EAAE,MAAM,CAAC;IACd,wEAAwE;IACxE,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAcD;;;;;;;GAOG;AACH,qBAAa,sBAAsB;IAuBrB,OAAO,CAAC,QAAQ,CAAC,MAAM;IAtBnC,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,UAAU,CAAS;IAC3B,OAAO,CAAC,KAAK,CAAuB;IACpC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAS;IACnC,OAAO,CAAC,eAAe,CAAkB;IAEzC;;;;;;;;;;;;;;;OAeG;gBAC0B,MAAM,EAAE,iBAAiB;IAMtD;;;;;;;;;;;;;;;;;;;;OAoBG;IACG,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IAkD9B;;;;;OAKG;IACH,OAAO,CAAC,MAAM;IAYd;;;;OAIG;IACH,OAAO,CAAC,YAAY;IA6BpB;;;;OAIG;IACH,kBAAkB,IAAI,MAAM;IAK5B;;;;OAIG;IACH,cAAc,IAAI,MAAM;IAIxB;;;;;OAKG;IACH,KAAK,IAAI,IAAI;CAwBd;AAED;;;;;;;;;;;;;;;;GAgBG;AACH,eAAO,MAAM,YAAY;IACvB;;;;;OAKG;;IAQH;;;;;;OAMG;;IAQH;;;;;;;;;;;;;;;;;OAiBG;;CAOJ,CAAC"}