wellcrafted 0.21.4 → 0.23.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +184 -38
- package/dist/error/index.d.ts +94 -40
- package/dist/error/index.d.ts.map +1 -1
- package/dist/error/index.js +31 -11
- package/dist/error/index.js.map +1 -1
- package/dist/{index-CS5xkzx0.d.ts → index-PgMy4LEz.d.ts} +2 -2
- package/dist/{index-CS5xkzx0.d.ts.map → index-PgMy4LEz.d.ts.map} +1 -1
- package/dist/query/index.d.ts +5 -5
- package/dist/query/index.js +8 -8
- package/dist/query/index.js.map +1 -1
- package/dist/result/index.d.ts +2 -2
- package/dist/result/index.js +2 -2
- package/dist/{result-BPrctj1f.js → result-B1iWFqM9.js} +5 -85
- package/dist/{result-BPrctj1f.js.map → result-B1iWFqM9.js.map} +1 -1
- package/dist/{result-DucAuR8u.d.ts → result-DRq8PMRe.d.ts} +71 -81
- package/dist/result-DRq8PMRe.d.ts.map +1 -0
- package/dist/{result-DOgvmaNP.js → result-DfuKgZo9.js} +2 -2
- package/dist/{result-DOgvmaNP.js.map → result-DfuKgZo9.js.map} +1 -1
- package/package.json +55 -55
- package/dist/result-DucAuR8u.d.ts.map +0 -1
|
@@ -234,98 +234,88 @@ declare function isOk<T, E>(result: Result<T, E>): result is Ok<T>;
|
|
|
234
234
|
*/
|
|
235
235
|
declare function isErr<T, E>(result: Result<T, E>): result is Err<E>;
|
|
236
236
|
/**
|
|
237
|
-
* Executes a synchronous operation and wraps its outcome
|
|
238
|
-
*
|
|
239
|
-
* This function attempts to execute the `operation
|
|
240
|
-
* - If `
|
|
241
|
-
* - If `
|
|
242
|
-
* the `
|
|
243
|
-
*
|
|
244
|
-
*
|
|
245
|
-
*
|
|
246
|
-
*
|
|
247
|
-
* @param options - An object containing the operation and error mapping function.
|
|
248
|
-
* @param options.try - The synchronous operation to execute. This function is expected to return a value of type `T`.
|
|
249
|
-
* @param options.mapErr - A function that takes the `unknown` exception caught from `options.try`
|
|
250
|
-
* and transforms it into an `Err<E>` variant containing a specific error value of type `E`.
|
|
251
|
-
* @returns A `Result<T, E>`: `Ok<T>` if `options.try` succeeds, or `Err<E>` if it throws and `options.mapErr` provides an error variant.
|
|
252
|
-
* @example
|
|
253
|
-
* ```ts
|
|
254
|
-
* function parseJson(jsonString: string): Result<object, SyntaxError> {
|
|
255
|
-
* return trySync({
|
|
256
|
-
* try: () => JSON.parse(jsonString),
|
|
257
|
-
* mapErr: (err: unknown) => {
|
|
258
|
-
* if (err instanceof SyntaxError) return Err(err);
|
|
259
|
-
* return Err(new SyntaxError("Unknown parsing error"));
|
|
260
|
-
* }
|
|
261
|
-
* });
|
|
262
|
-
* }
|
|
237
|
+
* Executes a synchronous operation and wraps its outcome in a Result type.
|
|
238
|
+
*
|
|
239
|
+
* This function attempts to execute the `try` operation:
|
|
240
|
+
* - If the `try` operation completes successfully, its return value is wrapped in an `Ok<T>` variant.
|
|
241
|
+
* - If the `try` operation throws an exception, the caught exception (of type `unknown`) is passed to
|
|
242
|
+
* the `catch` function, which transforms it into either an `Ok<T>` (recovery) or `Err<E>` (propagation).
|
|
243
|
+
*
|
|
244
|
+
* The return type is automatically narrowed based on what your catch function returns:
|
|
245
|
+
* - If catch always returns `Ok<T>`, the function returns `Ok<T>` (guaranteed success)
|
|
246
|
+
* - If catch can return `Err<E>`, the function returns `Result<T, E>` (may succeed or fail)
|
|
263
247
|
*
|
|
264
|
-
*
|
|
265
|
-
*
|
|
248
|
+
* @template T - The success value type
|
|
249
|
+
* @template E - The error value type (when catch can return errors)
|
|
250
|
+
* @param options - Configuration object
|
|
251
|
+
* @param options.try - The operation to execute
|
|
252
|
+
* @param options.catch - Error handler that transforms caught exceptions into either `Ok<T>` (recovery) or `Err<E>` (propagation)
|
|
253
|
+
* @returns `Ok<T>` if catch always returns Ok (recovery), otherwise `Result<T, E>` (propagation)
|
|
266
254
|
*
|
|
267
|
-
*
|
|
268
|
-
*
|
|
255
|
+
* @example
|
|
256
|
+
* ```ts
|
|
257
|
+
* // Returns Ok<string> - guaranteed success since catch always returns Ok
|
|
258
|
+
* const alwaysOk = trySync({
|
|
259
|
+
* try: () => JSON.parse(input),
|
|
260
|
+
* catch: () => Ok("fallback") // Always Ok<T>
|
|
261
|
+
* });
|
|
262
|
+
*
|
|
263
|
+
* // Returns Result<object, string> - may fail since catch can return Err
|
|
264
|
+
* const mayFail = trySync({
|
|
265
|
+
* try: () => JSON.parse(input),
|
|
266
|
+
* catch: (err) => Err("Parse failed") // Returns Err<E>
|
|
267
|
+
* });
|
|
269
268
|
* ```
|
|
270
269
|
*/
|
|
271
|
-
declare function trySync<T
|
|
272
|
-
try: operation,
|
|
273
|
-
mapErr
|
|
274
|
-
}: {
|
|
270
|
+
declare function trySync<T>(options: {
|
|
275
271
|
try: () => T;
|
|
276
|
-
|
|
272
|
+
catch: (error: unknown) => Ok<T>;
|
|
273
|
+
}): Ok<T>;
|
|
274
|
+
declare function trySync<T, E>(options: {
|
|
275
|
+
try: () => T;
|
|
276
|
+
catch: (error: unknown) => Err<E>;
|
|
277
277
|
}): Result<T, E>;
|
|
278
278
|
/**
|
|
279
|
-
* Executes an asynchronous operation
|
|
280
|
-
*
|
|
281
|
-
* This function attempts to execute the
|
|
282
|
-
* - If the `
|
|
283
|
-
* - If the `
|
|
284
|
-
* the
|
|
285
|
-
*
|
|
286
|
-
*
|
|
287
|
-
*
|
|
288
|
-
*
|
|
289
|
-
*
|
|
290
|
-
* @template T - The
|
|
291
|
-
* @template E - The
|
|
292
|
-
* @param options -
|
|
293
|
-
* @param options.try - The
|
|
294
|
-
* @param options.
|
|
295
|
-
*
|
|
296
|
-
*
|
|
297
|
-
* @returns A `Promise` that resolves to a `Result<T, E>`: `Ok<T>` if `options.try`'s `Promise` resolves,
|
|
298
|
-
* or `Err<E>` if it rejects/throws and `options.mapErr` provides an error variant.
|
|
279
|
+
* Executes an asynchronous operation and wraps its outcome in a Promise<Result>.
|
|
280
|
+
*
|
|
281
|
+
* This function attempts to execute the `try` operation:
|
|
282
|
+
* - If the `try` operation resolves successfully, its resolved value is wrapped in an `Ok<T>` variant.
|
|
283
|
+
* - If the `try` operation rejects or throws an exception, the caught error (of type `unknown`) is passed to
|
|
284
|
+
* the `catch` function, which transforms it into either an `Ok<T>` (recovery) or `Err<E>` (propagation).
|
|
285
|
+
*
|
|
286
|
+
* The return type is automatically narrowed based on what your catch function returns:
|
|
287
|
+
* - If catch always returns `Ok<T>`, the function returns `Promise<Ok<T>>` (guaranteed success)
|
|
288
|
+
* - If catch can return `Err<E>`, the function returns `Promise<Result<T, E>>` (may succeed or fail)
|
|
289
|
+
*
|
|
290
|
+
* @template T - The success value type
|
|
291
|
+
* @template E - The error value type (when catch can return errors)
|
|
292
|
+
* @param options - Configuration object
|
|
293
|
+
* @param options.try - The async operation to execute
|
|
294
|
+
* @param options.catch - Error handler that transforms caught exceptions/rejections into either `Ok<T>` (recovery) or `Err<E>` (propagation)
|
|
295
|
+
* @returns `Promise<Ok<T>>` if catch always returns Ok (recovery), otherwise `Promise<Result<T, E>>` (propagation)
|
|
296
|
+
*
|
|
299
297
|
* @example
|
|
300
298
|
* ```ts
|
|
301
|
-
*
|
|
302
|
-
*
|
|
303
|
-
*
|
|
304
|
-
*
|
|
305
|
-
*
|
|
306
|
-
*
|
|
307
|
-
*
|
|
308
|
-
*
|
|
309
|
-
*
|
|
310
|
-
*
|
|
311
|
-
*
|
|
312
|
-
* const result = await fetchData("/api/data");
|
|
313
|
-
* if (isOk(result)) {
|
|
314
|
-
* const response = result.data;
|
|
315
|
-
* console.log("Data fetched:", await response.json());
|
|
316
|
-
* } else {
|
|
317
|
-
* console.error("Fetch error:", result.error.message);
|
|
318
|
-
* }
|
|
319
|
-
* }
|
|
320
|
-
* processData();
|
|
299
|
+
* // Returns Promise<Ok<Response>> - guaranteed success since catch always returns Ok
|
|
300
|
+
* const alwaysOk = tryAsync({
|
|
301
|
+
* try: async () => fetch(url),
|
|
302
|
+
* catch: () => Ok(new Response()) // Always Ok<T>
|
|
303
|
+
* });
|
|
304
|
+
*
|
|
305
|
+
* // Returns Promise<Result<Response, Error>> - may fail since catch can return Err
|
|
306
|
+
* const mayFail = tryAsync({
|
|
307
|
+
* try: async () => fetch(url),
|
|
308
|
+
* catch: (err) => Err(new Error("Fetch failed")) // Returns Err<E>
|
|
309
|
+
* });
|
|
321
310
|
* ```
|
|
322
311
|
*/
|
|
323
|
-
declare function tryAsync<T
|
|
324
|
-
try:
|
|
325
|
-
|
|
326
|
-
}:
|
|
312
|
+
declare function tryAsync<T>(options: {
|
|
313
|
+
try: () => Promise<T>;
|
|
314
|
+
catch: (error: unknown) => Ok<T>;
|
|
315
|
+
}): Promise<Ok<T>>;
|
|
316
|
+
declare function tryAsync<T, E>(options: {
|
|
327
317
|
try: () => Promise<T>;
|
|
328
|
-
|
|
318
|
+
catch: (error: unknown) => Err<E>;
|
|
329
319
|
}): Promise<Result<T, E>>;
|
|
330
320
|
/**
|
|
331
321
|
* Resolves a value that may or may not be wrapped in a `Result`, returning the final value.
|
|
@@ -426,4 +416,4 @@ declare function resolve<T, E>(value: T | Result<T, E>): T;
|
|
|
426
416
|
//# sourceMappingURL=result.d.ts.map
|
|
427
417
|
//#endregion
|
|
428
418
|
export { Err, ExtractErrFromResult, ExtractOkFromResult, Ok, Result, UnwrapErr, UnwrapOk, isErr, isOk, isResult, resolve, tryAsync, trySync, unwrap };
|
|
429
|
-
//# sourceMappingURL=result-
|
|
419
|
+
//# sourceMappingURL=result-DRq8PMRe.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"result-DRq8PMRe.d.ts","names":[],"sources":["../src/result/result.ts"],"sourcesContent":[],"mappings":";;AAWA;AAaA;AAqCA;;;;;;AAAsC;AAiBtC;AAAgE,KAnEpD,EAmEoD,CAAA,CAAA,CAAA,GAAA;EAAA,IAApC,EAnEA,CAmEA;EAAC,KAAM,EAAA,IAAA;CAAC;AAAF;AAiBlC;;;;;AAAqC;AAWrC;;;;AAAsE,KAlF1D,GAkF0D,CAAA,CAAA,CAAA,GAAA;EAAO,KAAA,EAlF/C,CAkF+C;EAcjE,IAAA,EAAA,IAAA;CAAoB;;;;AAA8C;AAuB9E;;;;;;AACI;AAqBJ;;;;;;AAGI;AAgCJ;;;;;AAEkB;AAoClB;;;;;;;AAA8D;AAyB9D;;;AAA8C,KA1MlC,MA0MkC,CAAA,CAAA,EAAA,CAAA,CAAA,GA1MnB,EA0MmB,CA1MhB,CA0MgB,CAAA,GA1MX,GA0MW,CA1MP,CA0MO,CAAA;;;;AAAkB;AAsChE;;;;;;;AAGM;AAEN;;;AAEgC,cAtOnB,EAsOmB,EAAA,CAAA,CAAA,CAAA,CAAA,IAAA,EAtOJ,CAsOI,EAAA,GAtOA,EAsOA,CAtOG,CAsOH,CAAA;;;;;AACtB;AAmDV;;;;;;;;;AAGW;AAEW,cA9QT,GA8QiB,EAAA,CAAA,CAAA,CAAA,CAAA,KAAA,EA9QA,CA8QA,EAAA,GA9QI,GA8QJ,CA9QQ,CA8QR,CAAA;;;;;;;;;;AAGnB,KAtQC,mBAsQD,CAAA,UAtQ+B,MAsQ/B,CAAA,OAAA,EAAA,OAAA,CAAA,CAAA,GAtQ2D,OAsQ3D,CArQV,CAqQU,EAAA;EA+GK,KAAA,EAAA,IAAM;CAAA,CAAA;;;;;AAA+B;AAOrD;;;;AAAmD,KA9WvC,oBA8WuC,CAAA,UA9WR,MA8WQ,CAAA,OAAA,EAAA,OAAA,CAAA,CAAA,GA9WoB,OA8WpB,CA7WlD,CA6WkD,EAAA;EAAC,IAAX,EAAA,IAAA;CAAM,CAAA;AAAU;;;;;;;;;;;;;;;;;;KAvV7C,mBAAmB,4BAA4B,UAAU,cAClE;;;;;;;;;;;;;;;;;;;KAqBS,oBAAoB,4BAA4B,UAAU,eAGnE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBAgCa,6DAEJ,OAAO,GAAG;;;;;;;;;;;;;;;;;;;;;;iBAoCN,mBAAmB,OAAO,GAAG,eAAe,GAAG;;;;;;;;;;;;;;;;;;;;;;iBAyB/C,oBAAoB,OAAO,GAAG,eAAe,IAAI;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBAsCjD;aACJ;6BACgB,GAAG;IAC3B,GAAG;iBAES;aACJ;6BACgB,IAAI;IAC5B,OAAO,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBAmDQ;aACV,QAAQ;6BACQ,GAAG;IAC3B,QAAQ,GAAG;iBAEO;aACV,QAAQ;6BACQ,IAAI;IAC5B,QAAQ,OAAO,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBA+GN,qBAAqB,OAAO,GAAG,KAAK;iBAOpC,qBAAqB,IAAI,OAAO,GAAG,KAAK"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { isOk } from "./result-
|
|
1
|
+
import { isOk } from "./result-B1iWFqM9.js";
|
|
2
2
|
|
|
3
3
|
//#region src/result/utils.ts
|
|
4
4
|
/**
|
|
@@ -27,4 +27,4 @@ function partitionResults(results) {
|
|
|
27
27
|
|
|
28
28
|
//#endregion
|
|
29
29
|
export { partitionResults };
|
|
30
|
-
//# sourceMappingURL=result-
|
|
30
|
+
//# sourceMappingURL=result-DfuKgZo9.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"result-
|
|
1
|
+
{"version":3,"file":"result-DfuKgZo9.js","names":["results: Result<T, E>[]"],"sources":["../src/result/utils.ts"],"sourcesContent":["import type { Err, Ok, Result } from \"./result.js\";\nimport { isOk } from \"./result.js\";\n\n/**\n * Partitions an array of Result objects into two separate arrays based on their status.\n *\n * @template T - The success type\n * @template E - The error type\n * @param results - An array of Result objects to partition\n * @returns An object containing two arrays:\n * - `oks`: Array of successful Result objects (Ok<T>[])\n * - `errs`: Array of error Result objects (Err<E>[])\n *\n * @example\n * const results = [Ok(1), Err(\"error\"), Ok(2)];\n * const { oks, errs } = partitionResults(results);\n * // oks = [Ok(1), Ok(2)]\n * // errs = [Err(\"error\")]\n */\nexport function partitionResults<T, E>(results: Result<T, E>[]) {\n\treturn {\n\t\toks: [],\n\t\terrs: [],\n\t\t...Object.groupBy(results, (result) => (isOk(result) ? \"oks\" : \"errs\")),\n\t} as { oks: Ok<T>[]; errs: Err<E>[] };\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;AAmBA,SAAgB,iBAAuBA,SAAyB;AAC/D,QAAO;EACN,KAAK,CAAE;EACP,MAAM,CAAE;EACR,GAAG,OAAO,QAAQ,SAAS,CAAC,WAAY,KAAK,OAAO,GAAG,QAAQ,OAAQ;CACvE;AACD"}
|
package/package.json
CHANGED
|
@@ -1,56 +1,56 @@
|
|
|
1
1
|
{
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
}
|
|
2
|
+
"name": "wellcrafted",
|
|
3
|
+
"version": "0.23.1",
|
|
4
|
+
"description": "Delightful TypeScript patterns for elegant, type-safe applications",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"files": [
|
|
7
|
+
"dist",
|
|
8
|
+
"README.md",
|
|
9
|
+
"LICENSE"
|
|
10
|
+
],
|
|
11
|
+
"exports": {
|
|
12
|
+
"./result": {
|
|
13
|
+
"types": "./dist/result/index.d.ts",
|
|
14
|
+
"import": "./dist/result/index.js"
|
|
15
|
+
},
|
|
16
|
+
"./error": {
|
|
17
|
+
"types": "./dist/error/index.d.ts",
|
|
18
|
+
"import": "./dist/error/index.js"
|
|
19
|
+
},
|
|
20
|
+
"./brand": {
|
|
21
|
+
"types": "./dist/brand.d.ts",
|
|
22
|
+
"import": "./dist/brand.js"
|
|
23
|
+
},
|
|
24
|
+
"./query": {
|
|
25
|
+
"types": "./dist/query/index.d.ts",
|
|
26
|
+
"import": "./dist/query/index.js"
|
|
27
|
+
}
|
|
28
|
+
},
|
|
29
|
+
"scripts": {
|
|
30
|
+
"build": "tsdown",
|
|
31
|
+
"format": "biome format --write .",
|
|
32
|
+
"lint": "biome lint --write .",
|
|
33
|
+
"release": "pnpm run build && changeset version && changeset publish"
|
|
34
|
+
},
|
|
35
|
+
"keywords": [
|
|
36
|
+
"typescript",
|
|
37
|
+
"delightful",
|
|
38
|
+
"elegant",
|
|
39
|
+
"type-safe",
|
|
40
|
+
"well-crafted",
|
|
41
|
+
"polished",
|
|
42
|
+
"utilities",
|
|
43
|
+
"result",
|
|
44
|
+
"error-handling",
|
|
45
|
+
"brand-types"
|
|
46
|
+
],
|
|
47
|
+
"author": "",
|
|
48
|
+
"license": "MIT",
|
|
49
|
+
"devDependencies": {
|
|
50
|
+
"@biomejs/biome": "^2.3.3",
|
|
51
|
+
"@changesets/cli": "^2.27.10",
|
|
52
|
+
"@tanstack/query-core": "^5.82.0",
|
|
53
|
+
"tsdown": "^0.12.5",
|
|
54
|
+
"typescript": "^5.8.3"
|
|
55
|
+
}
|
|
56
|
+
}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"result-DucAuR8u.d.ts","names":[],"sources":["../src/result/result.ts"],"sourcesContent":[],"mappings":";;AAWA;AAaA;AAqCA;;;;;;AAAsC;AAiBtC;AAAgE,KAnEpD,EAmEoD,CAAA,CAAA,CAAA,GAAA;EAAA,IAApC,EAnEA,CAmEA;EAAC,KAAM,EAAA,IAAA;CAAC;AAAF;AAiBlC;;;;;AAAqC;AAWrC;;;;AAAsE,KAlF1D,GAkF0D,CAAA,CAAA,CAAA,GAAA;EAAO,KAAA,EAlF/C,CAkF+C;EAcjE,IAAA,EAAA,IAAA;CAAoB;;;;AAA8C;AAuB9E;;;;;;AACI;AAqBJ;;;;;;AAGI;AAgCJ;;;;;AAEkB;AAoClB;;;;;;;AAA8D;AAyB9D;;;AAA8C,KA1MlC,MA0MkC,CAAA,CAAA,EAAA,CAAA,CAAA,GA1MnB,EA0MmB,CA1MhB,CA0MgB,CAAA,GA1MX,GA0MW,CA1MP,CA0MO,CAAA;;;;AAAkB;AAuChE;;;;;;;;;;AAMU;AAsDY,cA5RT,EA4RiB,EAAA,CAAA,CAAA,CAAA,CAAA,IAAA,EA5RF,CA4RE,EAAA,GA5RE,EA4RF,CA5RK,CA4RL,CAAA;;;;;;;;;;;;AAMnB;AAuGX;;;AAA+C,cAxXlC,GAwXkC,EAAA,CAAA,CAAA,CAAA,CAAA,KAAA,EAxXjB,CAwXiB,EAAA,GAxXb,GAwXa,CAxXT,CAwXS,CAAA;;;AAAM;AAOrD;;;;;;AAAwD,KApX5C,mBAoX4C,CAAA,UApXd,MAoXc,CAAA,OAAA,EAAA,OAAA,CAAA,CAAA,GApXc,OAoXd,CAnXvD,CAmXuD,EAAA;EAAC,KAAA,EAAA,IAAA;;;;;;;;;;;KAtW7C,+BAA+B,4BAA4B,QACtE;;;;;;;;;;;;;;;;;;;;;KAsBW,mBAAmB,4BAA4B,UAAU,cAClE;;;;;;;;;;;;;;;;;;;KAqBS,oBAAoB,4BAA4B,UAAU,eAGnE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBAgCa,6DAEJ,OAAO,GAAG;;;;;;;;;;;;;;;;;;;;;;iBAoCN,mBAAmB,OAAO,GAAG,eAAe,GAAG;;;;;;;;;;;;;;;;;;;;;;iBAyB/C,oBAAoB,OAAO,GAAG,eAAe,IAAI;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBAuCjD;OACV;;;aAGM;8BACiB,IAAI;IAC7B,OAAO,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBAsDQ;OAChB;;;aAGM,QAAQ;8BACS,IAAI;IAC7B,QAAQ,OAAO,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBAuGN,qBAAqB,OAAO,GAAG,KAAK;iBAOpC,qBAAqB,IAAI,OAAO,GAAG,KAAK"}
|