@happyvertical/smrt-assets 0.51.39 → 0.52.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.
@@ -2,7 +2,7 @@
2
2
  "version": "1.0.0",
3
3
  "timestamp": 0,
4
4
  "packageName": "@happyvertical/smrt-assets",
5
- "packageVersion": "0.51.39",
5
+ "packageVersion": "0.52.0",
6
6
  "objects": {
7
7
  "@happyvertical/smrt-assets:AssetAssociation": {
8
8
  "name": "assetassociation",
@@ -1034,6 +1034,385 @@
1034
1034
  },
1035
1035
  "importPath": "@happyvertical/smrt-assets"
1036
1036
  },
1037
+ "@happyvertical/smrt-assets:AssetTag": {
1038
+ "name": "assettag",
1039
+ "className": "AssetTag",
1040
+ "qualifiedName": "@happyvertical/smrt-assets:AssetTag",
1041
+ "collection": "assettags",
1042
+ "filePath": "/home/runner/work/smrt/smrt/packages/assets/src/asset-tag.ts",
1043
+ "packageName": "@happyvertical/smrt-assets",
1044
+ "fields": {
1045
+ "tenantId": {
1046
+ "type": "text",
1047
+ "required": false,
1048
+ "_meta": {
1049
+ "sqlType": "UUID",
1050
+ "nullable": true,
1051
+ "__tenancy": {
1052
+ "isTenantIdField": true,
1053
+ "autoFilter": true,
1054
+ "required": false,
1055
+ "autoPopulate": true,
1056
+ "nullable": true,
1057
+ "mode": "optional",
1058
+ "field": "tenantId",
1059
+ "allowSuperAdminBypass": false
1060
+ }
1061
+ }
1062
+ },
1063
+ "assetId": {
1064
+ "type": "foreignKey",
1065
+ "required": true,
1066
+ "related": "Asset",
1067
+ "_meta": {
1068
+ "required": true,
1069
+ "onDelete": "CASCADE"
1070
+ }
1071
+ },
1072
+ "tagId": {
1073
+ "type": "crossPackageRef",
1074
+ "required": true,
1075
+ "related": "@happyvertical/smrt-tags:Tag",
1076
+ "_meta": {
1077
+ "onDelete": "CASCADE"
1078
+ }
1079
+ }
1080
+ },
1081
+ "methods": {},
1082
+ "decoratorConfig": {
1083
+ "tableName": "asset_tags",
1084
+ "conflictColumns": [
1085
+ "asset_id",
1086
+ "tag_id"
1087
+ ],
1088
+ "api": false,
1089
+ "mcp": false,
1090
+ "cli": false,
1091
+ "tenantScoped": {
1092
+ "mode": "optional"
1093
+ }
1094
+ },
1095
+ "extends": "SmrtObject",
1096
+ "exportName": "AssetTag",
1097
+ "collectionExportName": "AssetTagCollection",
1098
+ "validationRules": [
1099
+ {
1100
+ "field": "assetId",
1101
+ "rule": "required",
1102
+ "fieldType": "foreignKey"
1103
+ },
1104
+ {
1105
+ "field": "tagId",
1106
+ "rule": "required",
1107
+ "fieldType": "crossPackageRef"
1108
+ }
1109
+ ],
1110
+ "schema": {
1111
+ "tableName": "asset_tags",
1112
+ "ddl": "CREATE TABLE IF NOT EXISTS \"asset_tags\" (\n \"id\" UUID PRIMARY KEY NOT NULL,\n \"slug\" TEXT NOT NULL,\n \"context\" TEXT NOT NULL DEFAULT '',\n \"created_at\" TIMESTAMP NOT NULL DEFAULT current_timestamp,\n \"updated_at\" TIMESTAMP NOT NULL DEFAULT current_timestamp,\n \"tenant_id\" UUID,\n \"asset_id\" UUID NOT NULL,\n \"tag_id\" UUID NOT NULL\n);",
1113
+ "columns": {
1114
+ "id": {
1115
+ "type": "UUID",
1116
+ "primaryKey": true,
1117
+ "referenceKind": "id",
1118
+ "notNull": true
1119
+ },
1120
+ "slug": {
1121
+ "type": "TEXT",
1122
+ "notNull": true
1123
+ },
1124
+ "context": {
1125
+ "type": "TEXT",
1126
+ "notNull": true,
1127
+ "default": ""
1128
+ },
1129
+ "created_at": {
1130
+ "type": "TIMESTAMP",
1131
+ "notNull": true,
1132
+ "default": "current_timestamp"
1133
+ },
1134
+ "updated_at": {
1135
+ "type": "TIMESTAMP",
1136
+ "notNull": true,
1137
+ "default": "current_timestamp"
1138
+ },
1139
+ "tenant_id": {
1140
+ "type": "UUID",
1141
+ "referenceKind": "tenantId",
1142
+ "notNull": false,
1143
+ "unique": false
1144
+ },
1145
+ "asset_id": {
1146
+ "type": "UUID",
1147
+ "referenceKind": "foreignKey",
1148
+ "notNull": true,
1149
+ "unique": false,
1150
+ "foreignKey": {
1151
+ "table": "assets",
1152
+ "column": "id",
1153
+ "onDelete": "CASCADE",
1154
+ "onUpdate": "CASCADE"
1155
+ }
1156
+ },
1157
+ "tag_id": {
1158
+ "type": "UUID",
1159
+ "referenceKind": "crossPackageRef",
1160
+ "notNull": true,
1161
+ "unique": false
1162
+ }
1163
+ },
1164
+ "indexes": [
1165
+ {
1166
+ "name": "asset_tags_asset_id_tag_id_idx",
1167
+ "columns": [
1168
+ "asset_id",
1169
+ "tag_id"
1170
+ ],
1171
+ "unique": true
1172
+ },
1173
+ {
1174
+ "name": "asset_tags_slug_context_idx",
1175
+ "columns": [
1176
+ "slug",
1177
+ "context"
1178
+ ]
1179
+ },
1180
+ {
1181
+ "name": "asset_tags_tenant_id_created_at_idx",
1182
+ "columns": [
1183
+ "tenant_id",
1184
+ "created_at"
1185
+ ]
1186
+ },
1187
+ {
1188
+ "name": "asset_tags_tag_id_idx",
1189
+ "columns": [
1190
+ "tag_id"
1191
+ ]
1192
+ }
1193
+ ],
1194
+ "version": "e60d24f5"
1195
+ },
1196
+ "importPath": "@happyvertical/smrt-assets"
1197
+ },
1198
+ "@happyvertical/smrt-assets:AssetTagCollection": {
1199
+ "name": "assettagcollection",
1200
+ "className": "AssetTagCollection",
1201
+ "qualifiedName": "@happyvertical/smrt-assets:AssetTagCollection",
1202
+ "collection": "assettags",
1203
+ "filePath": "/home/runner/work/smrt/smrt/packages/assets/src/asset-tags.ts",
1204
+ "packageName": "@happyvertical/smrt-assets",
1205
+ "fields": {},
1206
+ "methods": {
1207
+ "byLeft": {
1208
+ "name": "byLeft",
1209
+ "async": true,
1210
+ "parameters": [
1211
+ {
1212
+ "name": "leftId",
1213
+ "type": "string",
1214
+ "optional": false
1215
+ },
1216
+ {
1217
+ "name": "opts",
1218
+ "type": "JunctionFilterOptions",
1219
+ "optional": true
1220
+ }
1221
+ ],
1222
+ "returnType": "Promise<TItem[]>",
1223
+ "isStatic": false,
1224
+ "isPublic": true
1225
+ },
1226
+ "byRight": {
1227
+ "name": "byRight",
1228
+ "async": true,
1229
+ "parameters": [
1230
+ {
1231
+ "name": "rightId",
1232
+ "type": "string",
1233
+ "optional": false
1234
+ },
1235
+ {
1236
+ "name": "opts",
1237
+ "type": "JunctionFilterOptions",
1238
+ "optional": true
1239
+ }
1240
+ ],
1241
+ "returnType": "Promise<TItem[]>",
1242
+ "isStatic": false,
1243
+ "isPublic": true
1244
+ },
1245
+ "attach": {
1246
+ "name": "attach",
1247
+ "async": true,
1248
+ "parameters": [
1249
+ {
1250
+ "name": "leftId",
1251
+ "type": "string",
1252
+ "optional": false
1253
+ },
1254
+ {
1255
+ "name": "rightId",
1256
+ "type": "string",
1257
+ "optional": false
1258
+ },
1259
+ {
1260
+ "name": "opts",
1261
+ "type": "JunctionAttachOptions",
1262
+ "optional": true
1263
+ }
1264
+ ],
1265
+ "returnType": "Promise<TItem>",
1266
+ "isStatic": false,
1267
+ "isPublic": true
1268
+ },
1269
+ "detach": {
1270
+ "name": "detach",
1271
+ "async": true,
1272
+ "parameters": [
1273
+ {
1274
+ "name": "leftId",
1275
+ "type": "string",
1276
+ "optional": false
1277
+ },
1278
+ {
1279
+ "name": "rightId",
1280
+ "type": "string",
1281
+ "optional": false
1282
+ },
1283
+ {
1284
+ "name": "opts",
1285
+ "type": "JunctionFilterOptions",
1286
+ "optional": true
1287
+ }
1288
+ ],
1289
+ "returnType": "Promise<void>",
1290
+ "isStatic": false,
1291
+ "isPublic": true
1292
+ },
1293
+ "setLinks": {
1294
+ "name": "setLinks",
1295
+ "async": true,
1296
+ "parameters": [
1297
+ {
1298
+ "name": "leftId",
1299
+ "type": "string",
1300
+ "optional": false
1301
+ },
1302
+ {
1303
+ "name": "rightIds",
1304
+ "type": "string[]",
1305
+ "optional": false
1306
+ },
1307
+ {
1308
+ "name": "opts",
1309
+ "type": "JunctionAttachOptions",
1310
+ "optional": true
1311
+ }
1312
+ ],
1313
+ "returnType": "Promise<void>",
1314
+ "isStatic": false,
1315
+ "isPublic": true
1316
+ }
1317
+ },
1318
+ "decoratorConfig": {
1319
+ "tableName": "asset_tags",
1320
+ "api": false,
1321
+ "mcp": false,
1322
+ "cli": false
1323
+ },
1324
+ "extends": "SmrtJunction",
1325
+ "extendsTypeArg": "AssetTag",
1326
+ "exportName": "AssetTagCollection",
1327
+ "collectionExportName": "AssetTagCollectionCollection",
1328
+ "schema": {
1329
+ "tableName": "asset_tags",
1330
+ "ddl": "CREATE TABLE IF NOT EXISTS \"asset_tags\" (\n \"id\" UUID PRIMARY KEY NOT NULL,\n \"slug\" TEXT NOT NULL,\n \"context\" TEXT NOT NULL DEFAULT '',\n \"created_at\" TIMESTAMP NOT NULL DEFAULT current_timestamp,\n \"updated_at\" TIMESTAMP NOT NULL DEFAULT current_timestamp,\n \"tenant_id\" UUID,\n \"asset_id\" UUID NOT NULL,\n \"tag_id\" UUID NOT NULL\n);",
1331
+ "columns": {
1332
+ "id": {
1333
+ "type": "UUID",
1334
+ "primaryKey": true,
1335
+ "referenceKind": "id",
1336
+ "notNull": true
1337
+ },
1338
+ "slug": {
1339
+ "type": "TEXT",
1340
+ "notNull": true
1341
+ },
1342
+ "context": {
1343
+ "type": "TEXT",
1344
+ "notNull": true,
1345
+ "default": ""
1346
+ },
1347
+ "created_at": {
1348
+ "type": "TIMESTAMP",
1349
+ "notNull": true,
1350
+ "default": "current_timestamp"
1351
+ },
1352
+ "updated_at": {
1353
+ "type": "TIMESTAMP",
1354
+ "notNull": true,
1355
+ "default": "current_timestamp"
1356
+ },
1357
+ "tenant_id": {
1358
+ "type": "UUID",
1359
+ "referenceKind": "tenantId",
1360
+ "notNull": false,
1361
+ "unique": false
1362
+ },
1363
+ "asset_id": {
1364
+ "type": "UUID",
1365
+ "referenceKind": "foreignKey",
1366
+ "notNull": true,
1367
+ "unique": false,
1368
+ "foreignKey": {
1369
+ "table": "assets",
1370
+ "column": "id",
1371
+ "onDelete": "CASCADE",
1372
+ "onUpdate": "CASCADE"
1373
+ }
1374
+ },
1375
+ "tag_id": {
1376
+ "type": "UUID",
1377
+ "referenceKind": "crossPackageRef",
1378
+ "notNull": true,
1379
+ "unique": false
1380
+ }
1381
+ },
1382
+ "indexes": [
1383
+ {
1384
+ "name": "asset_tags_asset_id_tag_id_idx",
1385
+ "columns": [
1386
+ "asset_id",
1387
+ "tag_id"
1388
+ ],
1389
+ "unique": true
1390
+ },
1391
+ {
1392
+ "name": "asset_tags_slug_context_idx",
1393
+ "columns": [
1394
+ "slug",
1395
+ "context"
1396
+ ]
1397
+ },
1398
+ {
1399
+ "name": "asset_tags_tenant_id_created_at_idx",
1400
+ "columns": [
1401
+ "tenant_id",
1402
+ "created_at"
1403
+ ]
1404
+ },
1405
+ {
1406
+ "name": "asset_tags_tag_id_idx",
1407
+ "columns": [
1408
+ "tag_id"
1409
+ ]
1410
+ }
1411
+ ],
1412
+ "version": "e60d24f5"
1413
+ },
1414
+ "importPath": "@happyvertical/smrt-assets"
1415
+ },
1037
1416
  "@happyvertical/smrt-assets:AssetType": {
1038
1417
  "name": "assettype",
1039
1418
  "className": "AssetType",
@@ -1402,6 +1781,14 @@
1402
1781
  }
1403
1782
  },
1404
1783
  "methods": {
1784
+ "getSlug": {
1785
+ "name": "getSlug",
1786
+ "async": true,
1787
+ "parameters": [],
1788
+ "returnType": "Promise<string | null | undefined>",
1789
+ "isStatic": false,
1790
+ "isPublic": true
1791
+ },
1405
1792
  "getMetadata": {
1406
1793
  "name": "getMetadata",
1407
1794
  "async": false,
@@ -1496,6 +1883,11 @@
1496
1883
  "name": "tagSlug",
1497
1884
  "type": "string",
1498
1885
  "optional": false
1886
+ },
1887
+ {
1888
+ "name": "context",
1889
+ "type": "string",
1890
+ "optional": true
1499
1891
  }
1500
1892
  ],
1501
1893
  "returnType": "Promise<boolean>",
@@ -1859,12 +2251,17 @@
1859
2251
  "optional": false
1860
2252
  },
1861
2253
  {
1862
- "name": "tagSlug",
2254
+ "name": "tag",
1863
2255
  "type": "string",
1864
2256
  "optional": false
2257
+ },
2258
+ {
2259
+ "name": "options",
2260
+ "type": "AssetTagInput",
2261
+ "optional": true
1865
2262
  }
1866
2263
  ],
1867
- "returnType": "Promise<void>",
2264
+ "returnType": "Promise<Tag>",
1868
2265
  "isStatic": false,
1869
2266
  "isPublic": true
1870
2267
  },
@@ -1878,23 +2275,71 @@
1878
2275
  "optional": false
1879
2276
  },
1880
2277
  {
1881
- "name": "tagSlug",
2278
+ "name": "tag",
1882
2279
  "type": "string",
1883
2280
  "optional": false
2281
+ },
2282
+ {
2283
+ "name": "options",
2284
+ "type": "Pick<AssetTagInput, 'context'>",
2285
+ "optional": true
1884
2286
  }
1885
2287
  ],
1886
2288
  "returnType": "Promise<void>",
1887
2289
  "isStatic": false,
1888
2290
  "isPublic": true
1889
2291
  },
2292
+ "setTags": {
2293
+ "name": "setTags",
2294
+ "async": true,
2295
+ "parameters": [
2296
+ {
2297
+ "name": "assetId",
2298
+ "type": "string",
2299
+ "optional": false
2300
+ },
2301
+ {
2302
+ "name": "tags",
2303
+ "type": "string[]",
2304
+ "optional": false
2305
+ },
2306
+ {
2307
+ "name": "options",
2308
+ "type": "Pick<AssetTagInput, 'context'>",
2309
+ "optional": true
2310
+ }
2311
+ ],
2312
+ "returnType": "Promise<Tag[]>",
2313
+ "isStatic": false,
2314
+ "isPublic": true
2315
+ },
2316
+ "getTagsForAssets": {
2317
+ "name": "getTagsForAssets",
2318
+ "async": true,
2319
+ "parameters": [
2320
+ {
2321
+ "name": "assetIds",
2322
+ "type": "string[]",
2323
+ "optional": false
2324
+ }
2325
+ ],
2326
+ "returnType": "Promise<Map<string, Tag[]>>",
2327
+ "isStatic": false,
2328
+ "isPublic": true
2329
+ },
1890
2330
  "getByTag": {
1891
2331
  "name": "getByTag",
1892
2332
  "async": true,
1893
2333
  "parameters": [
1894
2334
  {
1895
- "name": "tagSlug",
2335
+ "name": "tag",
1896
2336
  "type": "string",
1897
2337
  "optional": false
2338
+ },
2339
+ {
2340
+ "name": "options",
2341
+ "type": "Pick<AssetTagInput, 'context'>",
2342
+ "optional": true
1898
2343
  }
1899
2344
  ],
1900
2345
  "returnType": "Promise<Asset[]>",
@@ -13,6 +13,21 @@ export interface AssetOwnerCollection<OwnerType extends AssetOwnerRecord> {
13
13
  }
14
14
  export declare function assertValidOwnedAssetRelationship(relationship: string): void;
15
15
  export declare function assertValidOwnedAssetSortOrder(sortOrder: number): void;
16
+ /**
17
+ * Refuse to link an asset to an owner (place, profile, …) of another tenant.
18
+ *
19
+ * The asset's tenant is read from STORAGE by id under system context, never
20
+ * taken from the caller's object: `new Asset({ id: foreignId })` or a stale
21
+ * copy carries no (or the wrong) tenant and would otherwise pass. Rules:
22
+ *
23
+ * - a tenant owner may link its own assets and global (tenantless) ones;
24
+ * - a global owner may link only global assets — a tenant's asset linked to
25
+ * a global owner would be listed to every tenant through the global link;
26
+ * - an asset id with no stored row is refused.
27
+ *
28
+ * @param ownerLabel - plain noun for the error ("place", "profile")
29
+ */
30
+ export declare function assertAssetLinkable(db: SmrtCollectionOptions['db'], assetId: string, ownerTenantId: string | null | undefined, ownerLabel: string): Promise<void>;
16
31
  export declare function resolveOwnedAssetsById(db: SmrtCollectionOptions['db'], assetIds: string[], tenantId?: string | null): Promise<Asset[]>;
17
32
  export declare function getOwnedAssetsFromCollection<OwnerType extends AssetOwnerRecord>(collection: AssetOwnerCollection<OwnerType>, ownerId: string, relationship?: string): Promise<Asset[]>;
18
33
  export declare function addOwnedAssetFromCollection<OwnerType extends AssetOwnerRecord>(collection: AssetOwnerCollection<OwnerType>, ownerType: string, ownerId: string, asset: Asset, relationship?: string, sortOrder?: number): Promise<void>;
@@ -1 +1 @@
1
- {"version":3,"file":"owned-asset-helpers.d.ts","sourceRoot":"","sources":["../src/owned-asset-helpers.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,0BAA0B,CAAC;AAEtE,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,SAAS,CAAC;AAGrC,eAAO,MAAM,gCAAgC,QAA6B,CAAC;AAE3E,MAAM,WAAW,gBAAgB;IAC/B,SAAS,CAAC,YAAY,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,KAAK,EAAE,CAAC,CAAC;IACnD,QAAQ,CACN,KAAK,EAAE,KAAK,EACZ,YAAY,CAAC,EAAE,MAAM,EACrB,SAAS,CAAC,EAAE,MAAM,GACjB,OAAO,CAAC,IAAI,CAAC,CAAC;IACjB,WAAW,CAAC,OAAO,EAAE,MAAM,EAAE,YAAY,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CACpE;AAED,MAAM,WAAW,oBAAoB,CAAC,SAAS,SAAS,gBAAgB;IACtE,GAAG,CAAC,KAAK,EAAE;QAAE,EAAE,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC,SAAS,GAAG,IAAI,CAAC,CAAC;CACvD;AAED,wBAAgB,iCAAiC,CAAC,YAAY,EAAE,MAAM,GAAG,IAAI,CAM5E;AAED,wBAAgB,8BAA8B,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI,CAMtE;AAED,wBAAsB,sBAAsB,CAC1C,EAAE,EAAE,qBAAqB,CAAC,IAAI,CAAC,EAC/B,QAAQ,EAAE,MAAM,EAAE,EAClB,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,GACvB,OAAO,CAAC,KAAK,EAAE,CAAC,CAuBlB;AASD,wBAAsB,4BAA4B,CAChD,SAAS,SAAS,gBAAgB,EAElC,UAAU,EAAE,oBAAoB,CAAC,SAAS,CAAC,EAC3C,OAAO,EAAE,MAAM,EACf,YAAY,CAAC,EAAE,MAAM,GACpB,OAAO,CAAC,KAAK,EAAE,CAAC,CAOlB;AAED,wBAAsB,2BAA2B,CAC/C,SAAS,SAAS,gBAAgB,EAElC,UAAU,EAAE,oBAAoB,CAAC,SAAS,CAAC,EAC3C,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,MAAM,EACf,KAAK,EAAE,KAAK,EACZ,YAAY,SAAe,EAC3B,SAAS,SAAI,GACZ,OAAO,CAAC,IAAI,CAAC,CAOf;AAED,wBAAsB,8BAA8B,CAClD,SAAS,SAAS,gBAAgB,EAElC,UAAU,EAAE,oBAAoB,CAAC,SAAS,CAAC,EAC3C,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,MAAM,EACf,OAAO,EAAE,MAAM,EACf,YAAY,CAAC,EAAE,MAAM,GACpB,OAAO,CAAC,IAAI,CAAC,CAOf"}
1
+ {"version":3,"file":"owned-asset-helpers.d.ts","sourceRoot":"","sources":["../src/owned-asset-helpers.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,0BAA0B,CAAC;AAEtE,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,SAAS,CAAC;AAGrC,eAAO,MAAM,gCAAgC,QAA6B,CAAC;AAE3E,MAAM,WAAW,gBAAgB;IAC/B,SAAS,CAAC,YAAY,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,KAAK,EAAE,CAAC,CAAC;IACnD,QAAQ,CACN,KAAK,EAAE,KAAK,EACZ,YAAY,CAAC,EAAE,MAAM,EACrB,SAAS,CAAC,EAAE,MAAM,GACjB,OAAO,CAAC,IAAI,CAAC,CAAC;IACjB,WAAW,CAAC,OAAO,EAAE,MAAM,EAAE,YAAY,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CACpE;AAED,MAAM,WAAW,oBAAoB,CAAC,SAAS,SAAS,gBAAgB;IACtE,GAAG,CAAC,KAAK,EAAE;QAAE,EAAE,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC,SAAS,GAAG,IAAI,CAAC,CAAC;CACvD;AAED,wBAAgB,iCAAiC,CAAC,YAAY,EAAE,MAAM,GAAG,IAAI,CAM5E;AAED,wBAAgB,8BAA8B,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI,CAMtE;AAED;;;;;;;;;;;;;GAaG;AACH,wBAAsB,mBAAmB,CACvC,EAAE,EAAE,qBAAqB,CAAC,IAAI,CAAC,EAC/B,OAAO,EAAE,MAAM,EACf,aAAa,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,EACxC,UAAU,EAAE,MAAM,GACjB,OAAO,CAAC,IAAI,CAAC,CAgBf;AAED,wBAAsB,sBAAsB,CAC1C,EAAE,EAAE,qBAAqB,CAAC,IAAI,CAAC,EAC/B,QAAQ,EAAE,MAAM,EAAE,EAClB,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,GACvB,OAAO,CAAC,KAAK,EAAE,CAAC,CAuBlB;AASD,wBAAsB,4BAA4B,CAChD,SAAS,SAAS,gBAAgB,EAElC,UAAU,EAAE,oBAAoB,CAAC,SAAS,CAAC,EAC3C,OAAO,EAAE,MAAM,EACf,YAAY,CAAC,EAAE,MAAM,GACpB,OAAO,CAAC,KAAK,EAAE,CAAC,CAOlB;AAED,wBAAsB,2BAA2B,CAC/C,SAAS,SAAS,gBAAgB,EAElC,UAAU,EAAE,oBAAoB,CAAC,SAAS,CAAC,EAC3C,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,MAAM,EACf,KAAK,EAAE,KAAK,EACZ,YAAY,SAAe,EAC3B,SAAS,SAAI,GACZ,OAAO,CAAC,IAAI,CAAC,CAOf;AAED,wBAAsB,8BAA8B,CAClD,SAAS,SAAS,gBAAgB,EAElC,UAAU,EAAE,oBAAoB,CAAC,SAAS,CAAC,EAC3C,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,MAAM,EACf,OAAO,EAAE,MAAM,EACf,YAAY,CAAC,EAAE,MAAM,GACpB,OAAO,CAAC,IAAI,CAAC,CAOf"}