@robinpath/supabase 0.1.0 → 0.1.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 CHANGED
@@ -1,121 +1,121 @@
1
- # @robinpath/supabase
2
-
3
- > Supabase module for RobinPath.
4
-
5
- ![Category](https://img.shields.io/badge/category-Database-blue) ![Functions](https://img.shields.io/badge/functions-27-green) ![Auth](https://img.shields.io/badge/auth-API%20Key-orange) ![License](https://img.shields.io/badge/license-MIT-brightgreen)
6
-
7
- ## Why use this module?
8
-
9
- The `supabase` module lets you:
10
-
11
- - Select rows from a table with optional filters, ordering, and pagination
12
- - Insert one or more rows into a table
13
- - Update rows matching filters
14
- - Insert or update rows (merge on conflict)
15
- - Delete rows matching filters
16
-
17
- All functions are callable directly from RobinPath scripts with a simple, consistent API.
18
-
19
- ## Installation
20
-
21
- ```bash
22
- npm install @robinpath/supabase
23
- ```
24
-
25
- ## Quick Start
26
-
27
- **1. Set up credentials**
28
-
29
- ```robinpath
30
- supabase.setCredentials "https://xyz.supabase.co" "eyJhbGc..."
31
- ```
32
-
33
- **2. Store a service role key for admin operations (Auth admin, etc.)**
34
-
35
- ```robinpath
36
- supabase.setServiceKey "https://xyz.supabase.co" "eyJhbGc..."
37
- ```
38
-
39
- ## Available Functions
40
-
41
- | Function | Description |
42
- |----------|-------------|
43
- | `supabase.setCredentials` | Store Supabase project URL and anon/service API key |
44
- | `supabase.setServiceKey` | Store a service role key for admin operations (Auth admin, etc.) |
45
- | `supabase.select` | Select rows from a table with optional filters, ordering, and pagination |
46
- | `supabase.insert` | Insert one or more rows into a table |
47
- | `supabase.update` | Update rows matching filters |
48
- | `supabase.upsert` | Insert or update rows (merge on conflict) |
49
- | `supabase.delete` | Delete rows matching filters |
50
- | `supabase.rpc` | Call a Postgres function via RPC |
51
- | `supabase.signUp` | Sign up a new user with email and password |
52
- | `supabase.signIn` | Sign in a user with email and password |
53
- | `supabase.signInWithOtp` | Send a magic link to the user's email for passwordless sign in |
54
- | `supabase.signOut` | Sign out a user by invalidating their access token |
55
- | `supabase.getUser` | Get the user object from a JWT access token |
56
- | `supabase.updateUser` | Update user attributes (email, password, metadata) |
57
- | `supabase.listUsers` | Admin: List all users (requires service role key) |
58
- | `supabase.deleteUser` | Admin: Delete a user by ID (requires service role key) |
59
- | `supabase.inviteUser` | Admin: Invite a user by email (requires service role key) |
60
- | `supabase.listBuckets` | List all storage buckets |
61
- | `supabase.createBucket` | Create a new storage bucket |
62
- | `supabase.deleteBucket` | Delete a storage bucket (must be empty first) |
63
- | `supabase.emptyBucket` | Remove all files from a storage bucket |
64
- | `supabase.listFiles` | List files in a storage bucket/folder |
65
- | `supabase.uploadFile` | Upload a file to a storage bucket |
66
- | `supabase.downloadFile` | Download a file from a storage bucket |
67
- | `supabase.deleteFile` | Delete one or more files from a storage bucket |
68
- | `supabase.getPublicUrl` | Get the public URL for a file in a public bucket |
69
- | `supabase.createSignedUrl` | Create a signed URL for temporary access to a private file |
70
-
71
- ## Examples
72
-
73
- ### Store a service role key for admin operations (Auth admin, etc.)
74
-
75
- ```robinpath
76
- supabase.setServiceKey "https://xyz.supabase.co" "eyJhbGc..."
77
- ```
78
-
79
- ### Select rows from a table with optional filters, ordering, and pagination
80
-
81
- ```robinpath
82
- supabase.select "users" "*" {"eq": {"status": "active"}, "limit": 10}
83
- ```
84
-
85
- ### Insert one or more rows into a table
86
-
87
- ```robinpath
88
- supabase.insert "users" {"name": "Alice", "email": "alice@example.com"}
89
- ```
90
-
91
- ## Integration with RobinPath
92
-
93
- ```typescript
94
- import { RobinPath } from "@wiredwp/robinpath";
95
- import Module from "@robinpath/supabase";
96
-
97
- const rp = new RobinPath();
98
- rp.registerModule(Module.name, Module.functions);
99
- rp.registerModuleMeta(Module.name, Module.functionMetadata);
100
-
101
- const result = await rp.executeScript(`
102
- supabase.setCredentials "https://xyz.supabase.co" "eyJhbGc..."
103
- supabase.setServiceKey "https://xyz.supabase.co" "eyJhbGc..."
104
- `);
105
- ```
106
-
107
- ## Full API Reference
108
-
109
- See [MODULE.md](./MODULE.md) for complete documentation including all parameters, return types, error handling, and advanced examples.
110
-
111
- ## Related Modules
112
-
113
- - [`@robinpath/mysql`](../mysql) — MySQL module for complementary functionality
114
- - [`@robinpath/postgres`](../postgres) — PostgreSQL module for complementary functionality
115
- - [`@robinpath/mongo`](../mongo) — Mongo module for complementary functionality
116
- - [`@robinpath/redis`](../redis) — Redis module for complementary functionality
117
- - [`@robinpath/firebase`](../firebase) — Firebase module for complementary functionality
118
-
119
- ## License
120
-
121
- MIT
1
+ # @robinpath/supabase
2
+
3
+ > Supabase module for RobinPath.
4
+
5
+ ![Category](https://img.shields.io/badge/category-Database-blue) ![Functions](https://img.shields.io/badge/functions-27-green) ![Auth](https://img.shields.io/badge/auth-API%20Key-orange) ![License](https://img.shields.io/badge/license-MIT-brightgreen)
6
+
7
+ ## Why use this module?
8
+
9
+ The `supabase` module lets you:
10
+
11
+ - Select rows from a table with optional filters, ordering, and pagination
12
+ - Insert one or more rows into a table
13
+ - Update rows matching filters
14
+ - Insert or update rows (merge on conflict)
15
+ - Delete rows matching filters
16
+
17
+ All functions are callable directly from RobinPath scripts with a simple, consistent API.
18
+
19
+ ## Installation
20
+
21
+ ```bash
22
+ npm install @robinpath/supabase
23
+ ```
24
+
25
+ ## Quick Start
26
+
27
+ **1. Set up credentials**
28
+
29
+ ```robinpath
30
+ supabase.setCredentials "https://xyz.supabase.co" "eyJhbGc..."
31
+ ```
32
+
33
+ **2. Store a service role key for admin operations (Auth admin, etc.)**
34
+
35
+ ```robinpath
36
+ supabase.setServiceKey "https://xyz.supabase.co" "eyJhbGc..."
37
+ ```
38
+
39
+ ## Available Functions
40
+
41
+ | Function | Description |
42
+ |----------|-------------|
43
+ | `supabase.setCredentials` | Store Supabase project URL and anon/service API key |
44
+ | `supabase.setServiceKey` | Store a service role key for admin operations (Auth admin, etc.) |
45
+ | `supabase.select` | Select rows from a table with optional filters, ordering, and pagination |
46
+ | `supabase.insert` | Insert one or more rows into a table |
47
+ | `supabase.update` | Update rows matching filters |
48
+ | `supabase.upsert` | Insert or update rows (merge on conflict) |
49
+ | `supabase.delete` | Delete rows matching filters |
50
+ | `supabase.rpc` | Call a Postgres function via RPC |
51
+ | `supabase.signUp` | Sign up a new user with email and password |
52
+ | `supabase.signIn` | Sign in a user with email and password |
53
+ | `supabase.signInWithOtp` | Send a magic link to the user's email for passwordless sign in |
54
+ | `supabase.signOut` | Sign out a user by invalidating their access token |
55
+ | `supabase.getUser` | Get the user object from a JWT access token |
56
+ | `supabase.updateUser` | Update user attributes (email, password, metadata) |
57
+ | `supabase.listUsers` | Admin: List all users (requires service role key) |
58
+ | `supabase.deleteUser` | Admin: Delete a user by ID (requires service role key) |
59
+ | `supabase.inviteUser` | Admin: Invite a user by email (requires service role key) |
60
+ | `supabase.listBuckets` | List all storage buckets |
61
+ | `supabase.createBucket` | Create a new storage bucket |
62
+ | `supabase.deleteBucket` | Delete a storage bucket (must be empty first) |
63
+ | `supabase.emptyBucket` | Remove all files from a storage bucket |
64
+ | `supabase.listFiles` | List files in a storage bucket/folder |
65
+ | `supabase.uploadFile` | Upload a file to a storage bucket |
66
+ | `supabase.downloadFile` | Download a file from a storage bucket |
67
+ | `supabase.deleteFile` | Delete one or more files from a storage bucket |
68
+ | `supabase.getPublicUrl` | Get the public URL for a file in a public bucket |
69
+ | `supabase.createSignedUrl` | Create a signed URL for temporary access to a private file |
70
+
71
+ ## Examples
72
+
73
+ ### Store a service role key for admin operations (Auth admin, etc.)
74
+
75
+ ```robinpath
76
+ supabase.setServiceKey "https://xyz.supabase.co" "eyJhbGc..."
77
+ ```
78
+
79
+ ### Select rows from a table with optional filters, ordering, and pagination
80
+
81
+ ```robinpath
82
+ supabase.select "users" "*" {"eq": {"status": "active"}, "limit": 10}
83
+ ```
84
+
85
+ ### Insert one or more rows into a table
86
+
87
+ ```robinpath
88
+ supabase.insert "users" {"name": "Alice", "email": "alice@example.com"}
89
+ ```
90
+
91
+ ## Integration with RobinPath
92
+
93
+ ```typescript
94
+ import { RobinPath } from "@wiredwp/robinpath";
95
+ import Module from "@robinpath/supabase";
96
+
97
+ const rp = new RobinPath();
98
+ rp.registerModule(Module.name, Module.functions);
99
+ rp.registerModuleMeta(Module.name, Module.functionMetadata);
100
+
101
+ const result = await rp.executeScript(`
102
+ supabase.setCredentials "https://xyz.supabase.co" "eyJhbGc..."
103
+ supabase.setServiceKey "https://xyz.supabase.co" "eyJhbGc..."
104
+ `);
105
+ ```
106
+
107
+ ## Full API Reference
108
+
109
+ See [MODULE.md](./MODULE.md) for complete documentation including all parameters, return types, error handling, and advanced examples.
110
+
111
+ ## Related Modules
112
+
113
+ - [`@robinpath/mysql`](../mysql) — MySQL module for complementary functionality
114
+ - [`@robinpath/postgres`](../postgres) — PostgreSQL module for complementary functionality
115
+ - [`@robinpath/mongo`](../mongo) — Mongo module for complementary functionality
116
+ - [`@robinpath/redis`](../redis) — Redis module for complementary functionality
117
+ - [`@robinpath/firebase`](../firebase) — Firebase module for complementary functionality
118
+
119
+ ## License
120
+
121
+ MIT
package/package.json CHANGED
@@ -1,13 +1,41 @@
1
1
  {
2
2
  "name": "@robinpath/supabase",
3
- "version": "0.1.0",
4
- "publishConfig": { "access": "public" },
3
+ "version": "0.1.1",
4
+ "publishConfig": {
5
+ "access": "public"
6
+ },
5
7
  "type": "module",
6
8
  "main": "dist/index.js",
7
9
  "types": "dist/index.d.ts",
8
- "exports": { ".": { "import": "./dist/index.js", "types": "./dist/index.d.ts" } },
9
- "files": ["dist"],
10
- "scripts": { "build": "tsc" },
11
- "peerDependencies": { "@wiredwp/robinpath": ">=0.20.0" },
12
- "devDependencies": { "@wiredwp/robinpath": "^0.30.1", "typescript": "^5.6.0" }
10
+ "exports": {
11
+ ".": {
12
+ "import": "./dist/index.js",
13
+ "types": "./dist/index.d.ts"
14
+ }
15
+ },
16
+ "files": [
17
+ "dist"
18
+ ],
19
+ "scripts": {
20
+ "build": "tsc"
21
+ },
22
+ "peerDependencies": {
23
+ "@robinpath/core": ">=0.20.0"
24
+ },
25
+ "devDependencies": {
26
+ "@robinpath/core": "^0.30.1",
27
+ "typescript": "^5.6.0"
28
+ },
29
+ "description": "Supabase module for RobinPath.",
30
+ "keywords": [
31
+ "supabase",
32
+ "database"
33
+ ],
34
+ "license": "MIT",
35
+ "robinpath": {
36
+ "category": "database",
37
+ "type": "utility",
38
+ "auth": "api-key",
39
+ "functionCount": 27
40
+ }
13
41
  }
package/dist/index.d.ts DELETED
@@ -1,6 +0,0 @@
1
- import type { ModuleAdapter } from "@wiredwp/robinpath";
2
- declare const SupabaseModule: ModuleAdapter;
3
- export default SupabaseModule;
4
- export { SupabaseModule };
5
- export { SupabaseFunctions, SupabaseFunctionMetadata, SupabaseModuleMetadata } from "./supabase.js";
6
- //# sourceMappingURL=index.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAGxD,QAAA,MAAM,cAAc,EAAE,aAMrB,CAAC;AAEF,eAAe,cAAc,CAAC;AAC9B,OAAO,EAAE,cAAc,EAAE,CAAC;AAC1B,OAAO,EAAE,iBAAiB,EAAE,wBAAwB,EAAE,sBAAsB,EAAE,MAAM,eAAe,CAAC"}
package/dist/index.js DELETED
@@ -1,12 +0,0 @@
1
- import { SupabaseFunctions, SupabaseFunctionMetadata, SupabaseModuleMetadata } from "./supabase.js";
2
- const SupabaseModule = {
3
- name: "supabase",
4
- functions: SupabaseFunctions,
5
- functionMetadata: SupabaseFunctionMetadata,
6
- moduleMetadata: SupabaseModuleMetadata,
7
- global: false,
8
- }; // as ModuleAdapter
9
- export default SupabaseModule;
10
- export { SupabaseModule };
11
- export { SupabaseFunctions, SupabaseFunctionMetadata, SupabaseModuleMetadata } from "./supabase.js";
12
- //# sourceMappingURL=index.js.map
package/dist/index.js.map DELETED
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,iBAAiB,EAAE,wBAAwB,EAAE,sBAAsB,EAAE,MAAM,eAAe,CAAC;AAEpG,MAAM,cAAc,GAAkB;IACpC,IAAI,EAAE,UAAU;IAChB,SAAS,EAAE,iBAAiB;IAC5B,gBAAgB,EAAE,wBAA+B;IACjD,cAAc,EAAE,sBAA6B;IAC7C,MAAM,EAAE,KAAK;CACd,CAAC,CAAC,mBAAmB;AAEtB,eAAe,cAAc,CAAC;AAC9B,OAAO,EAAE,cAAc,EAAE,CAAC;AAC1B,OAAO,EAAE,iBAAiB,EAAE,wBAAwB,EAAE,sBAAsB,EAAE,MAAM,eAAe,CAAC"}
@@ -1,361 +0,0 @@
1
- import type { BuiltinHandler } from "@wiredwp/robinpath";
2
- export declare const SupabaseFunctions: Record<string, BuiltinHandler>;
3
- export declare const SupabaseFunctionMetadata: {
4
- setCredentials: {
5
- description: string;
6
- parameters: {
7
- name: string;
8
- dataType: string;
9
- description: string;
10
- formInputType: string;
11
- required: boolean;
12
- }[];
13
- returnType: string;
14
- returnDescription: string;
15
- example: string;
16
- };
17
- setServiceKey: {
18
- description: string;
19
- parameters: {
20
- name: string;
21
- dataType: string;
22
- description: string;
23
- formInputType: string;
24
- required: boolean;
25
- }[];
26
- returnType: string;
27
- returnDescription: string;
28
- example: string;
29
- };
30
- select: {
31
- description: string;
32
- parameters: {
33
- name: string;
34
- dataType: string;
35
- description: string;
36
- formInputType: string;
37
- required: boolean;
38
- }[];
39
- returnType: string;
40
- returnDescription: string;
41
- example: string;
42
- };
43
- insert: {
44
- description: string;
45
- parameters: {
46
- name: string;
47
- dataType: string;
48
- description: string;
49
- formInputType: string;
50
- required: boolean;
51
- }[];
52
- returnType: string;
53
- returnDescription: string;
54
- example: string;
55
- };
56
- update: {
57
- description: string;
58
- parameters: {
59
- name: string;
60
- dataType: string;
61
- description: string;
62
- formInputType: string;
63
- required: boolean;
64
- }[];
65
- returnType: string;
66
- returnDescription: string;
67
- example: string;
68
- };
69
- upsert: {
70
- description: string;
71
- parameters: {
72
- name: string;
73
- dataType: string;
74
- description: string;
75
- formInputType: string;
76
- required: boolean;
77
- }[];
78
- returnType: string;
79
- returnDescription: string;
80
- example: string;
81
- };
82
- delete: {
83
- description: string;
84
- parameters: {
85
- name: string;
86
- dataType: string;
87
- description: string;
88
- formInputType: string;
89
- required: boolean;
90
- }[];
91
- returnType: string;
92
- returnDescription: string;
93
- example: string;
94
- };
95
- rpc: {
96
- description: string;
97
- parameters: {
98
- name: string;
99
- dataType: string;
100
- description: string;
101
- formInputType: string;
102
- required: boolean;
103
- }[];
104
- returnType: string;
105
- returnDescription: string;
106
- example: string;
107
- };
108
- signUp: {
109
- description: string;
110
- parameters: {
111
- name: string;
112
- dataType: string;
113
- description: string;
114
- formInputType: string;
115
- required: boolean;
116
- }[];
117
- returnType: string;
118
- returnDescription: string;
119
- example: string;
120
- };
121
- signIn: {
122
- description: string;
123
- parameters: {
124
- name: string;
125
- dataType: string;
126
- description: string;
127
- formInputType: string;
128
- required: boolean;
129
- }[];
130
- returnType: string;
131
- returnDescription: string;
132
- example: string;
133
- };
134
- signInWithOtp: {
135
- description: string;
136
- parameters: {
137
- name: string;
138
- dataType: string;
139
- description: string;
140
- formInputType: string;
141
- required: boolean;
142
- }[];
143
- returnType: string;
144
- returnDescription: string;
145
- example: string;
146
- };
147
- signOut: {
148
- description: string;
149
- parameters: {
150
- name: string;
151
- dataType: string;
152
- description: string;
153
- formInputType: string;
154
- required: boolean;
155
- }[];
156
- returnType: string;
157
- returnDescription: string;
158
- example: string;
159
- };
160
- getUser: {
161
- description: string;
162
- parameters: {
163
- name: string;
164
- dataType: string;
165
- description: string;
166
- formInputType: string;
167
- required: boolean;
168
- }[];
169
- returnType: string;
170
- returnDescription: string;
171
- example: string;
172
- };
173
- updateUser: {
174
- description: string;
175
- parameters: {
176
- name: string;
177
- dataType: string;
178
- description: string;
179
- formInputType: string;
180
- required: boolean;
181
- }[];
182
- returnType: string;
183
- returnDescription: string;
184
- example: string;
185
- };
186
- listUsers: {
187
- description: string;
188
- parameters: {
189
- name: string;
190
- dataType: string;
191
- description: string;
192
- formInputType: string;
193
- required: boolean;
194
- }[];
195
- returnType: string;
196
- returnDescription: string;
197
- example: string;
198
- };
199
- deleteUser: {
200
- description: string;
201
- parameters: {
202
- name: string;
203
- dataType: string;
204
- description: string;
205
- formInputType: string;
206
- required: boolean;
207
- }[];
208
- returnType: string;
209
- returnDescription: string;
210
- example: string;
211
- };
212
- inviteUser: {
213
- description: string;
214
- parameters: {
215
- name: string;
216
- dataType: string;
217
- description: string;
218
- formInputType: string;
219
- required: boolean;
220
- }[];
221
- returnType: string;
222
- returnDescription: string;
223
- example: string;
224
- };
225
- listBuckets: {
226
- description: string;
227
- parameters: {
228
- name: string;
229
- dataType: string;
230
- description: string;
231
- formInputType: string;
232
- required: boolean;
233
- }[];
234
- returnType: string;
235
- returnDescription: string;
236
- example: string;
237
- };
238
- createBucket: {
239
- description: string;
240
- parameters: {
241
- name: string;
242
- dataType: string;
243
- description: string;
244
- formInputType: string;
245
- required: boolean;
246
- }[];
247
- returnType: string;
248
- returnDescription: string;
249
- example: string;
250
- };
251
- deleteBucket: {
252
- description: string;
253
- parameters: {
254
- name: string;
255
- dataType: string;
256
- description: string;
257
- formInputType: string;
258
- required: boolean;
259
- }[];
260
- returnType: string;
261
- returnDescription: string;
262
- example: string;
263
- };
264
- emptyBucket: {
265
- description: string;
266
- parameters: {
267
- name: string;
268
- dataType: string;
269
- description: string;
270
- formInputType: string;
271
- required: boolean;
272
- }[];
273
- returnType: string;
274
- returnDescription: string;
275
- example: string;
276
- };
277
- listFiles: {
278
- description: string;
279
- parameters: {
280
- name: string;
281
- dataType: string;
282
- description: string;
283
- formInputType: string;
284
- required: boolean;
285
- }[];
286
- returnType: string;
287
- returnDescription: string;
288
- example: string;
289
- };
290
- uploadFile: {
291
- description: string;
292
- parameters: {
293
- name: string;
294
- dataType: string;
295
- description: string;
296
- formInputType: string;
297
- required: boolean;
298
- }[];
299
- returnType: string;
300
- returnDescription: string;
301
- example: string;
302
- };
303
- downloadFile: {
304
- description: string;
305
- parameters: {
306
- name: string;
307
- dataType: string;
308
- description: string;
309
- formInputType: string;
310
- required: boolean;
311
- }[];
312
- returnType: string;
313
- returnDescription: string;
314
- example: string;
315
- };
316
- deleteFile: {
317
- description: string;
318
- parameters: {
319
- name: string;
320
- dataType: string;
321
- description: string;
322
- formInputType: string;
323
- required: boolean;
324
- }[];
325
- returnType: string;
326
- returnDescription: string;
327
- example: string;
328
- };
329
- getPublicUrl: {
330
- description: string;
331
- parameters: {
332
- name: string;
333
- dataType: string;
334
- description: string;
335
- formInputType: string;
336
- required: boolean;
337
- }[];
338
- returnType: string;
339
- returnDescription: string;
340
- example: string;
341
- };
342
- createSignedUrl: {
343
- description: string;
344
- parameters: {
345
- name: string;
346
- dataType: string;
347
- description: string;
348
- formInputType: string;
349
- required: boolean;
350
- }[];
351
- returnType: string;
352
- returnDescription: string;
353
- example: string;
354
- };
355
- };
356
- export declare const SupabaseModuleMetadata: {
357
- description: string;
358
- methods: string[];
359
- category: string;
360
- };
361
- //# sourceMappingURL=supabase.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"supabase.d.ts","sourceRoot":"","sources":["../src/supabase.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAA2C,MAAM,oBAAoB,CAAC;AAwGlG,eAAO,MAAM,iBAAiB,EAAE,MAAM,CAAC,MAAM,EAAE,cAAc,CAqZ5D,CAAC;AAIF,eAAO,MAAM,wBAAwB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAmUpC,CAAC;AAIF,eAAO,MAAM,sBAAsB;;;;CAIlC,CAAC"}