@pol-studios/db 1.0.37 → 1.0.38
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/dist/UserMetadataContext-yLZQu24J.d.ts +33 -0
- package/dist/auth/context.d.ts +5 -53
- package/dist/auth/context.js +1 -25
- package/dist/auth/hooks.d.ts +3 -107
- package/dist/auth/hooks.js +2 -8
- package/dist/auth/index.d.ts +5 -5
- package/dist/auth/index.js +9 -39
- package/dist/{chunk-YQUNORJD.js → chunk-6OSNGHRE.js} +77 -153
- package/dist/chunk-6OSNGHRE.js.map +1 -0
- package/dist/{chunk-7NFMEDJW.js → chunk-ILGWCJ6S.js} +9 -42
- package/dist/chunk-ILGWCJ6S.js.map +1 -0
- package/dist/{chunk-U4BZKCBH.js → chunk-INIX2V6L.js} +3 -3
- package/dist/chunk-NSIAAYW3.js +1 -0
- package/dist/{chunk-7P2LGZYQ.js → chunk-QMHHKYZO.js} +2 -2
- package/dist/{chunk-X747EEWD.js → chunk-TO5QB4UM.js} +2 -2
- package/dist/index.js +6 -7
- package/dist/index.native.js +6 -7
- package/dist/index.web.js +5 -6
- package/dist/index.web.js.map +1 -1
- package/dist/with-auth/index.js +4 -5
- package/dist/with-auth/index.js.map +1 -1
- package/package.json +1 -1
- package/dist/UserMetadataContext-QLIv-mfF.d.ts +0 -171
- package/dist/chunk-5HJLTYRA.js +0 -355
- package/dist/chunk-5HJLTYRA.js.map +0 -1
- package/dist/chunk-6KN7KLEG.js +0 -1
- package/dist/chunk-7NFMEDJW.js.map +0 -1
- package/dist/chunk-YQUNORJD.js.map +0 -1
- /package/dist/{chunk-U4BZKCBH.js.map → chunk-INIX2V6L.js.map} +0 -0
- /package/dist/{chunk-6KN7KLEG.js.map → chunk-NSIAAYW3.js.map} +0 -0
- /package/dist/{chunk-7P2LGZYQ.js.map → chunk-QMHHKYZO.js.map} +0 -0
- /package/dist/{chunk-X747EEWD.js.map → chunk-TO5QB4UM.js.map} +0 -0
|
@@ -8,7 +8,6 @@ import {
|
|
|
8
8
|
useUpsertItem
|
|
9
9
|
} from "./chunk-YUX6RGLZ.js";
|
|
10
10
|
import {
|
|
11
|
-
typedSupabase,
|
|
12
11
|
useSupabase
|
|
13
12
|
} from "./chunk-DMVUEJG2.js";
|
|
14
13
|
|
|
@@ -471,8 +470,8 @@ function usePermissions() {
|
|
|
471
470
|
}
|
|
472
471
|
|
|
473
472
|
// src/auth/context/AuthProvider.tsx
|
|
474
|
-
import { isUsable, newUuid } from "@pol-studios/utils";
|
|
475
473
|
import { useCallback as useCallback2, useEffect as useEffect2, useMemo as useMemo3, useRef as useRef3, useState as useState2 } from "react";
|
|
474
|
+
import { isUsable, newUuid } from "@pol-studios/utils";
|
|
476
475
|
import { jsx as jsx2 } from "react/jsx-runtime";
|
|
477
476
|
var SESSION_FETCH_TIMEOUT_MS = 3e3;
|
|
478
477
|
function getPermissionLevel(action) {
|
|
@@ -491,10 +490,21 @@ function getPermissionLevel(action) {
|
|
|
491
490
|
return 0;
|
|
492
491
|
}
|
|
493
492
|
}
|
|
494
|
-
var profileQuery = typedSupabase?.schema("core").from("Profile").select("*, UserAccess(accessKey), status").single();
|
|
495
493
|
function isNotExpired(expiresAt) {
|
|
496
494
|
return !expiresAt || new Date(expiresAt) > /* @__PURE__ */ new Date();
|
|
497
495
|
}
|
|
496
|
+
function matchesAccessPattern(pattern, requestedKey) {
|
|
497
|
+
if (pattern === requestedKey) return true;
|
|
498
|
+
if (pattern === "*:*:*") return true;
|
|
499
|
+
const patternParts = pattern.split(":");
|
|
500
|
+
const keyParts = requestedKey.split(":");
|
|
501
|
+
if (patternParts.length !== keyParts.length) return false;
|
|
502
|
+
for (let i = 0; i < patternParts.length; i++) {
|
|
503
|
+
if (patternParts[i] === "*") continue;
|
|
504
|
+
if (patternParts[i] !== keyParts[i]) return false;
|
|
505
|
+
}
|
|
506
|
+
return true;
|
|
507
|
+
}
|
|
498
508
|
function AuthProvider({
|
|
499
509
|
children,
|
|
500
510
|
enableEntityPermissions = false
|
|
@@ -505,13 +515,9 @@ function AuthProvider({
|
|
|
505
515
|
const [onSignOutCallbacks, setOnSignOutCallbacks] = useState2(/* @__PURE__ */ new Map());
|
|
506
516
|
async function registerAsync(register) {
|
|
507
517
|
const response = await supabase.auth.signUp(register);
|
|
508
|
-
|
|
509
|
-
|
|
510
|
-
|
|
511
|
-
return prev;
|
|
512
|
-
}
|
|
513
|
-
return newUser;
|
|
514
|
-
});
|
|
518
|
+
if (response.data.user) {
|
|
519
|
+
setCurrentUser((prev) => prev?.id === response.data.user?.id ? prev : response.data.user);
|
|
520
|
+
}
|
|
515
521
|
return response;
|
|
516
522
|
}
|
|
517
523
|
async function signInAsync(username, password) {
|
|
@@ -519,34 +525,26 @@ function AuthProvider({
|
|
|
519
525
|
email: username,
|
|
520
526
|
password
|
|
521
527
|
});
|
|
522
|
-
if (response_0.data) {
|
|
523
|
-
setCurrentUser((prev_0) =>
|
|
524
|
-
const newUser_0 = response_0.data.user;
|
|
525
|
-
if (prev_0?.id === newUser_0?.id) {
|
|
526
|
-
return prev_0;
|
|
527
|
-
}
|
|
528
|
-
return newUser_0;
|
|
529
|
-
});
|
|
528
|
+
if (response_0.data.user) {
|
|
529
|
+
setCurrentUser((prev_0) => prev_0?.id === response_0.data.user?.id ? prev_0 : response_0.data.user);
|
|
530
530
|
}
|
|
531
531
|
return response_0;
|
|
532
532
|
}
|
|
533
|
-
|
|
533
|
+
const signOutAsync = useCallback2(async () => {
|
|
534
534
|
const response_1 = await supabase.auth.signOut();
|
|
535
|
-
if (
|
|
536
|
-
Array.from(onSignOutCallbacks.values()).forEach((
|
|
537
|
-
x();
|
|
538
|
-
});
|
|
535
|
+
if (!response_1.error) {
|
|
536
|
+
Array.from(onSignOutCallbacks.values()).forEach((cb) => cb());
|
|
539
537
|
}
|
|
540
538
|
return response_1;
|
|
541
|
-
}
|
|
539
|
+
}, [supabase.auth, onSignOutCallbacks]);
|
|
542
540
|
function onSignOut(action) {
|
|
543
541
|
const id = newUuid();
|
|
544
|
-
setOnSignOutCallbacks((
|
|
542
|
+
setOnSignOutCallbacks((x) => new Map(x).set(id, action));
|
|
545
543
|
return id;
|
|
546
544
|
}
|
|
547
545
|
function removeOnSignOut(id_0) {
|
|
548
|
-
setOnSignOutCallbacks((
|
|
549
|
-
const map = new Map(
|
|
546
|
+
setOnSignOutCallbacks((x_0) => {
|
|
547
|
+
const map = new Map(x_0);
|
|
550
548
|
map.delete(id_0);
|
|
551
549
|
return map;
|
|
552
550
|
});
|
|
@@ -554,17 +552,19 @@ function AuthProvider({
|
|
|
554
552
|
async function refreshAsync() {
|
|
555
553
|
}
|
|
556
554
|
useEffect2(() => {
|
|
557
|
-
const
|
|
555
|
+
const {
|
|
556
|
+
data: {
|
|
557
|
+
subscription
|
|
558
|
+
}
|
|
559
|
+
} = supabase.auth.onAuthStateChange((event) => {
|
|
558
560
|
if (event === "SIGNED_IN" || event === "SIGNED_OUT") {
|
|
559
561
|
setUserNeedsChange(true);
|
|
560
562
|
}
|
|
561
563
|
});
|
|
562
|
-
return () =>
|
|
563
|
-
request.data.subscription.unsubscribe();
|
|
564
|
-
};
|
|
564
|
+
return () => subscription.unsubscribe();
|
|
565
565
|
}, [supabase.auth]);
|
|
566
566
|
useEffect2(() => {
|
|
567
|
-
if (userNeedsChange
|
|
567
|
+
if (!userNeedsChange) return;
|
|
568
568
|
let cancelled = false;
|
|
569
569
|
async function fetchSessionWithTimeout() {
|
|
570
570
|
try {
|
|
@@ -575,13 +575,11 @@ function AuthProvider({
|
|
|
575
575
|
});
|
|
576
576
|
const result = await Promise.race([supabase.auth.getSession(), timeoutPromise]);
|
|
577
577
|
if (cancelled) return;
|
|
578
|
-
const
|
|
578
|
+
const newUser = result?.data?.session?.user ?? null;
|
|
579
579
|
setCurrentUser((prev_2) => {
|
|
580
|
-
if (
|
|
581
|
-
if (prev_2?.id ===
|
|
582
|
-
|
|
583
|
-
}
|
|
584
|
-
return newUser_1;
|
|
580
|
+
if (newUser === null) return null;
|
|
581
|
+
if (prev_2?.id === newUser?.id) return prev_2;
|
|
582
|
+
return newUser;
|
|
585
583
|
});
|
|
586
584
|
setUserNeedsChange(false);
|
|
587
585
|
} catch (error) {
|
|
@@ -596,142 +594,71 @@ function AuthProvider({
|
|
|
596
594
|
cancelled = true;
|
|
597
595
|
};
|
|
598
596
|
}, [userNeedsChange, supabase.auth]);
|
|
597
|
+
const isUserReady = isUsable(currentUser);
|
|
599
598
|
const {
|
|
600
599
|
data: profileData,
|
|
601
|
-
isLoading: profileLoading
|
|
602
|
-
refetch: refetchProfile
|
|
600
|
+
isLoading: profileLoading
|
|
603
601
|
} = useDbQuery("core.Profile", {
|
|
604
602
|
where: {
|
|
605
603
|
id: currentUser?.id
|
|
606
604
|
},
|
|
607
|
-
enabled:
|
|
605
|
+
enabled: isUserReady,
|
|
606
|
+
realtime: true
|
|
608
607
|
});
|
|
609
|
-
const profile = profileData?.[0] ?? null;
|
|
610
608
|
const {
|
|
611
609
|
data: directAccess,
|
|
612
|
-
isLoading: directAccessLoading
|
|
613
|
-
refetch: refetchDirectAccess
|
|
610
|
+
isLoading: directAccessLoading
|
|
614
611
|
} = useDbQuery("core.UserAccess", {
|
|
615
612
|
where: {
|
|
616
613
|
userId: currentUser?.id
|
|
617
614
|
},
|
|
618
|
-
enabled:
|
|
615
|
+
enabled: isUserReady,
|
|
616
|
+
realtime: true
|
|
619
617
|
});
|
|
620
618
|
const {
|
|
621
619
|
data: userGroups,
|
|
622
|
-
isLoading: userGroupsLoading
|
|
623
|
-
refetch: refetchUserGroups
|
|
620
|
+
isLoading: userGroupsLoading
|
|
624
621
|
} = useDbQuery("core.UserGroup", {
|
|
625
622
|
where: {
|
|
626
623
|
userId: currentUser?.id
|
|
627
624
|
},
|
|
628
|
-
enabled:
|
|
625
|
+
enabled: isUserReady,
|
|
626
|
+
realtime: true
|
|
629
627
|
});
|
|
630
628
|
const {
|
|
631
629
|
data: groups,
|
|
632
|
-
isLoading: groupsLoading
|
|
633
|
-
refetch: refetchGroups
|
|
630
|
+
isLoading: groupsLoading
|
|
634
631
|
} = useDbQuery("core.Group", {
|
|
635
632
|
where: {
|
|
636
633
|
isActive: 1
|
|
637
634
|
},
|
|
638
|
-
|
|
639
|
-
|
|
635
|
+
enabled: isUserReady,
|
|
636
|
+
realtime: true
|
|
640
637
|
});
|
|
641
638
|
const groupIds = useMemo3(() => userGroups?.map((ug) => ug.groupId) ?? [], [userGroups]);
|
|
642
639
|
const groupsMap = useMemo3(() => new Map(groups?.map((g) => [g.id, g]) ?? []), [groups]);
|
|
643
640
|
const {
|
|
644
641
|
data: groupAccess,
|
|
645
|
-
isLoading: groupAccessLoading
|
|
646
|
-
refetch: refetchGroupAccess
|
|
642
|
+
isLoading: groupAccessLoading
|
|
647
643
|
} = useDbQuery("core.GroupAccessKey", {
|
|
648
644
|
where: groupIds.length > 0 ? {
|
|
649
645
|
groupId: {
|
|
650
646
|
in: groupIds
|
|
651
647
|
}
|
|
652
648
|
} : void 0,
|
|
653
|
-
enabled: groupIds.length > 0
|
|
649
|
+
enabled: groupIds.length > 0,
|
|
650
|
+
realtime: true
|
|
654
651
|
});
|
|
655
|
-
const
|
|
656
|
-
|
|
657
|
-
refetchUserGroups();
|
|
658
|
-
refetchGroups();
|
|
659
|
-
refetchGroupAccess();
|
|
660
|
-
}, [refetchDirectAccess, refetchUserGroups, refetchGroups, refetchGroupAccess]);
|
|
661
|
-
const userGroupIdsRef = useRef3(/* @__PURE__ */ new Set());
|
|
652
|
+
const profile = profileData?.[0] ?? null;
|
|
653
|
+
const prevProfileStatusRef = useRef3(void 0);
|
|
662
654
|
useEffect2(() => {
|
|
663
|
-
|
|
664
|
-
|
|
665
|
-
|
|
666
|
-
|
|
667
|
-
groupIdSet.add(typeof ug_0.groupId === "number" ? ug_0.groupId : parseInt(ug_0.groupId, 10));
|
|
668
|
-
}
|
|
669
|
-
}
|
|
670
|
-
userGroupIdsRef.current = groupIdSet;
|
|
655
|
+
const currentStatus = profile?.status;
|
|
656
|
+
const prevStatus = prevProfileStatusRef.current;
|
|
657
|
+
if (prevStatus === "active" && (currentStatus === "archived" || currentStatus === "suspended")) {
|
|
658
|
+
signOutAsync();
|
|
671
659
|
}
|
|
672
|
-
|
|
673
|
-
|
|
674
|
-
if (!currentUser?.id) return;
|
|
675
|
-
const channel = supabase.channel(`user-access-keys-${currentUser.id}`).on("postgres_changes", {
|
|
676
|
-
event: "*",
|
|
677
|
-
schema: "core",
|
|
678
|
-
table: "UserAccess",
|
|
679
|
-
filter: `userId=eq.${currentUser.id}`
|
|
680
|
-
}, () => {
|
|
681
|
-
refetchAccessData();
|
|
682
|
-
}).on("postgres_changes", {
|
|
683
|
-
event: "*",
|
|
684
|
-
schema: "core",
|
|
685
|
-
table: "UserGroup",
|
|
686
|
-
filter: `userId=eq.${currentUser.id}`
|
|
687
|
-
}, () => {
|
|
688
|
-
refetchAccessData();
|
|
689
|
-
}).on("postgres_changes", {
|
|
690
|
-
event: "*",
|
|
691
|
-
schema: "core",
|
|
692
|
-
table: "GroupAccessKey"
|
|
693
|
-
}, (payload) => {
|
|
694
|
-
const groupId = payload.new?.groupId || payload.old?.groupId;
|
|
695
|
-
if (groupId && userGroupIdsRef.current.has(groupId)) {
|
|
696
|
-
refetchAccessData();
|
|
697
|
-
}
|
|
698
|
-
}).on("postgres_changes", {
|
|
699
|
-
event: "UPDATE",
|
|
700
|
-
schema: "core",
|
|
701
|
-
table: "Group"
|
|
702
|
-
}, (payload_0) => {
|
|
703
|
-
const oldActive = payload_0.old?.isActive;
|
|
704
|
-
const newActive = payload_0.new?.isActive;
|
|
705
|
-
const groupId_0 = payload_0.new?.id;
|
|
706
|
-
if (oldActive !== newActive && groupId_0 && userGroupIdsRef.current.has(groupId_0)) {
|
|
707
|
-
refetchAccessData();
|
|
708
|
-
}
|
|
709
|
-
}).subscribe();
|
|
710
|
-
return () => {
|
|
711
|
-
channel.unsubscribe();
|
|
712
|
-
supabase.removeChannel(channel);
|
|
713
|
-
};
|
|
714
|
-
}, [supabase, currentUser?.id, refetchAccessData]);
|
|
715
|
-
useEffect2(() => {
|
|
716
|
-
if (!currentUser?.id) return;
|
|
717
|
-
const profileChannel = supabase.channel(`profile-status-${currentUser.id}`).on("postgres_changes", {
|
|
718
|
-
event: "UPDATE",
|
|
719
|
-
schema: "core",
|
|
720
|
-
table: "Profile",
|
|
721
|
-
filter: `id=eq.${currentUser.id}`
|
|
722
|
-
}, (payload_1) => {
|
|
723
|
-
const newStatus = payload_1.new?.status;
|
|
724
|
-
const oldStatus = payload_1.old?.status;
|
|
725
|
-
if (oldStatus === "active" && (newStatus === "archived" || newStatus === "suspended")) {
|
|
726
|
-
signOutAsync();
|
|
727
|
-
}
|
|
728
|
-
refetchProfile();
|
|
729
|
-
}).subscribe();
|
|
730
|
-
return () => {
|
|
731
|
-
profileChannel.unsubscribe();
|
|
732
|
-
supabase.removeChannel(profileChannel);
|
|
733
|
-
};
|
|
734
|
-
}, [supabase, currentUser?.id, refetchProfile]);
|
|
660
|
+
prevProfileStatusRef.current = currentStatus;
|
|
661
|
+
}, [profile?.status, signOutAsync]);
|
|
735
662
|
const allAccessKeys = useMemo3(() => {
|
|
736
663
|
const keys = [];
|
|
737
664
|
directAccess?.forEach((a) => {
|
|
@@ -744,10 +671,10 @@ function AuthProvider({
|
|
|
744
671
|
});
|
|
745
672
|
}
|
|
746
673
|
});
|
|
747
|
-
const activeGroupIds = new Set(userGroups?.filter((
|
|
748
|
-
const group = groupsMap.get(
|
|
749
|
-
return group?.isActive === 1 && isNotExpired(
|
|
750
|
-
}).map((
|
|
674
|
+
const activeGroupIds = new Set(userGroups?.filter((ug_0) => {
|
|
675
|
+
const group = groupsMap.get(ug_0.groupId);
|
|
676
|
+
return group?.isActive === 1 && isNotExpired(ug_0.expiresAt);
|
|
677
|
+
}).map((ug_1) => ug_1.groupId) ?? []);
|
|
751
678
|
groupAccess?.forEach((ga) => {
|
|
752
679
|
if (activeGroupIds.has(ga.groupId) && isNotExpired(ga.expiresAt)) {
|
|
753
680
|
keys.push({
|
|
@@ -776,12 +703,11 @@ function AuthProvider({
|
|
|
776
703
|
const parts = item_0.accessKey.split(":");
|
|
777
704
|
if (parts.length === 3) {
|
|
778
705
|
const [resourceType, resourceId, permission] = parts;
|
|
779
|
-
const permissionLevel = getPermissionLevel(permission);
|
|
780
706
|
permissions.push({
|
|
781
707
|
resourceType,
|
|
782
708
|
resourceId,
|
|
783
709
|
permission,
|
|
784
|
-
permissionLevel,
|
|
710
|
+
permissionLevel: getPermissionLevel(permission),
|
|
785
711
|
source: item_0.source,
|
|
786
712
|
inheritedFrom: null,
|
|
787
713
|
expiresAt: item_0.expiresAt ?? null
|
|
@@ -794,27 +720,25 @@ function AuthProvider({
|
|
|
794
720
|
const isArchived = profileStatus === "archived";
|
|
795
721
|
const isSuspended = profileStatus === "suspended";
|
|
796
722
|
const hasAccess = useCallback2((key) => {
|
|
797
|
-
if (isArchived || isSuspended)
|
|
798
|
-
|
|
723
|
+
if (isArchived || isSuspended) return false;
|
|
724
|
+
if (!isUsable(combinedAccess)) return false;
|
|
725
|
+
if (combinedAccess.includes("*:*:*")) return true;
|
|
726
|
+
if (combinedAccess.includes(key)) return true;
|
|
727
|
+
if (!isUsable(key)) return true;
|
|
728
|
+
for (const pattern of combinedAccess) {
|
|
729
|
+
if (matchesAccessPattern(pattern, key)) return true;
|
|
799
730
|
}
|
|
800
|
-
const accessGiven = combinedAccess;
|
|
801
|
-
if (isUsable(accessGiven) === false) return false;
|
|
802
|
-
if (accessGiven.includes("*:*:*")) return true;
|
|
803
|
-
if (accessGiven.includes(key)) return true;
|
|
804
|
-
if (isUsable(key) === false) return true;
|
|
805
731
|
const parts_0 = key.split(":");
|
|
806
732
|
if (parts_0.length === 3) {
|
|
807
733
|
const [type, id_1, action_0] = parts_0;
|
|
808
734
|
const requiredLevel = getPermissionLevel(action_0);
|
|
809
735
|
const hasPermission = effectivePermissions.some((p) => p.resourceType === type && p.resourceId === id_1 && p.permissionLevel >= requiredLevel);
|
|
810
|
-
if (hasPermission)
|
|
811
|
-
return true;
|
|
812
|
-
}
|
|
736
|
+
if (hasPermission) return true;
|
|
813
737
|
}
|
|
814
738
|
return false;
|
|
815
739
|
}, [combinedAccess, effectivePermissions, isArchived, isSuspended]);
|
|
816
740
|
const isAccessLoading = directAccessLoading || userGroupsLoading || groupsLoading || groupAccessLoading;
|
|
817
|
-
const
|
|
741
|
+
const authState = useMemo3(() => ({
|
|
818
742
|
hasAccess,
|
|
819
743
|
user: currentUser,
|
|
820
744
|
profile,
|
|
@@ -830,9 +754,9 @@ function AuthProvider({
|
|
|
830
754
|
removeOnSignOut,
|
|
831
755
|
registerAsync,
|
|
832
756
|
refreshAsync
|
|
833
|
-
}), [
|
|
757
|
+
}), [hasAccess, currentUser, profile, combinedAccess, effectivePermissions, profileStatus, isArchived, isSuspended, profileLoading, isAccessLoading]);
|
|
834
758
|
const content = enableEntityPermissions ? /* @__PURE__ */ jsx2(PermissionProvider, { children }) : children;
|
|
835
|
-
return /* @__PURE__ */ jsx2(setupAuthContext.Provider, { value:
|
|
759
|
+
return /* @__PURE__ */ jsx2(setupAuthContext.Provider, { value: authState, children: content });
|
|
836
760
|
}
|
|
837
761
|
|
|
838
762
|
// src/auth/context/UserMetadataContext.tsx
|
|
@@ -1188,4 +1112,4 @@ export {
|
|
|
1188
1112
|
useSetUserMetadata,
|
|
1189
1113
|
useUserMetadataState
|
|
1190
1114
|
};
|
|
1191
|
-
//# sourceMappingURL=chunk-
|
|
1115
|
+
//# sourceMappingURL=chunk-6OSNGHRE.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/errors/TimeoutError.ts","../src/useDbQuery.ts","../src/auth/context/setupAuthContext.tsx","../src/auth/context/PermissionContext.tsx","../src/auth/context/AuthProvider.tsx","../src/auth/context/UserMetadataContext.tsx","../src/useDbUpsert.ts"],"sourcesContent":["export const TIMEOUT_ERROR_MESSAGE = \"Request timed out\";\nexport const DEFAULT_QUERY_TIMEOUT = 15_000; // 15 seconds\n\nexport function isTimeoutError(error: Error | null | undefined): boolean {\n if (!error) return false;\n return error.name === \"AbortError\" || error.message === TIMEOUT_ERROR_MESSAGE || error.message.toLowerCase().includes(\"timed out\");\n}","import { PostgrestError, PostgrestSingleResponse } from \"@supabase/supabase-js\";\nimport { useMemo, useRef } from \"react\";\nimport { ItemType } from \"@pol-studios/utils\";\nimport { encode, UseQuerySingleReturn } from \"@supabase-cache-helpers/postgrest-react-query\";\nimport { omit } from \"@pol-studios/utils\";\nimport { useQuery, UseQueryOptions } from \"@tanstack/react-query\";\nimport { useDelayedValue } from \"@pol-studios/hooks/state\";\nimport { DEFAULT_QUERY_TIMEOUT, TIMEOUT_ERROR_MESSAGE } from \"./errors/TimeoutError\";\ntype ConfigurationOptions<T> = {\n crossOrganization?: boolean;\n filter?: (item: ItemType<T>) => boolean;\n timeout?: number;\n};\nexport type UseDbQuerySingleReturn<T> = UseQuerySingleReturn<T> & {\n data: T | null | undefined;\n count?: number | null;\n};\nexport function useDbQuery<Result>(query: PromiseLike<PostgrestSingleResponse<Result>> & {\n abortSignal?: (signal: AbortSignal) => PromiseLike<PostgrestSingleResponse<Result>>;\n}, config?: Omit<UseQueryOptions<Result, PostgrestError>, \"queryKey\" | \"queryFn\"> & ConfigurationOptions<Result>) {\n // Debounce query key to prevent rapid query churn during fast navigation\n const queryKey = encode(query, false);\n const queryKeyString = queryKey.join(\"-\");\n const debouncedKeyString = useDelayedValue(queryKeyString, 50);\n\n // Only enable query when key has stabilized (debounced matches current)\n const isKeyStable = queryKeyString === debouncedKeyString;\n const effectiveEnabled = config?.enabled !== false && isKeyStable;\n const timeoutMs = config?.timeout ?? DEFAULT_QUERY_TIMEOUT;\n\n // Track count from Supabase response (for queries with count: \"exact\")\n const countRef = useRef<number | null>(null);\n const request = useQuery(useMemo(() => ({\n queryKey,\n queryFn: async ({\n signal\n }) => {\n const controller = new AbortController();\n signal.addEventListener(\"abort\", () => controller.abort());\n const timeoutId = setTimeout(() => controller.abort(), timeoutMs);\n try {\n // Execute query with abort signal\n const queryWithSignal = query.abortSignal?.(controller.signal) ?? query;\n const result = await queryWithSignal;\n if (result.error) throw result.error;\n // Store count if available (from queries with count: \"exact\")\n countRef.current = result.count ?? null;\n return result.data;\n } catch (err: any) {\n if (err.name === \"AbortError\") {\n throw new Error(TIMEOUT_ERROR_MESSAGE);\n }\n throw err;\n } finally {\n clearTimeout(timeoutId);\n }\n },\n ...omit({\n retry: 1,\n ...config,\n enabled: effectiveEnabled\n }, [\"queryKey\", \"timeout\"])\n }), [queryKey, config, effectiveEnabled, timeoutMs, query]));\n\n // Return request with count property added\n return useMemo(() => ({\n ...request,\n count: countRef.current\n }), [request, countRef.current]) as UseDbQuerySingleReturn<Result>;\n}","/**\n * SetupAuthContext - Shared context for auth state\n *\n * This file is separate to avoid circular dependencies between\n * AuthProvider and PermissionContext.\n */\n\nimport { createContext, ReactNode } from \"react\";\nimport { AuthTokenResponsePassword, SignUpWithPasswordCredentials, User } from \"@supabase/supabase-js\";\nexport type ProfileStatus = \"active\" | \"archived\" | \"suspended\";\n\n/**\n * Represents an effective permission for a user on a specific resource.\n * These are eagerly loaded at login for fast permission checks.\n */\nexport interface EffectivePermission {\n /** The type of resource (e.g., 'project', 'client', 'database') */\n resourceType: string;\n /** The ID of the specific resource */\n resourceId: string;\n /** The permission action (e.g., 'view', 'edit', 'admin') */\n permission: string;\n /** Numeric level for comparison: view=1, edit=2, admin=3 */\n permissionLevel: number;\n /** How the permission was granted */\n source: \"direct\" | \"group\" | \"inherited\";\n /** If inherited, from which resource */\n inheritedFrom: string | null;\n /** When the permission expires, if applicable */\n expiresAt: string | null;\n}\nexport interface SetupAuthContext {\n user?: User | null | undefined;\n isLoading: boolean;\n profile: Profile | null | undefined;\n access: string[];\n /** Eagerly loaded effective permissions for the user */\n effectivePermissions: EffectivePermission[];\n /** Whether the profile is archived */\n isArchived: boolean;\n /** Whether the profile is suspended */\n isSuspended: boolean;\n /** The profile status (active, archived, suspended) */\n profileStatus: ProfileStatus | undefined;\n registerAsync: (register: SignUpWithPasswordCredentials) => Promise<any>;\n signInAsync: (username: string, password: string) => Promise<AuthTokenResponsePassword>;\n signOutAsync: () => Promise<any>;\n refreshAsync: () => Promise<void>;\n onSignOut: (action: () => any) => string;\n removeOnSignOut: (id: string) => any;\n hasAccess?: (key: string) => boolean;\n}\n\n// Profile type - simplified version, the full type is in AuthProvider\nexport interface Profile {\n id: string;\n email?: string;\n fullName?: string;\n status?: ProfileStatus;\n UserAccess?: Array<{\n accessKey: string;\n }>;\n [key: string]: any;\n}\nexport const setupAuthContext = createContext({} as SetupAuthContext);\n\n/**\n * Props for SetupAuthContextProvider\n * A simpler provider that takes pre-computed auth state\n */\nexport interface SetupAuthContextProviderProps {\n children: ReactNode;\n auth: SetupAuthContext;\n}","import { createContext, ReactNode, useCallback, useContext, useEffect, useMemo, useRef, useState } from \"react\";\nimport useSupabase from \"../../useSupabase\";\nimport { setupAuthContext } from \"./setupAuthContext\";\nimport { EntityType, EntityPermissionLevel, EntityAction, EntityPermissionCheck } from \"../types/EntityPermissions\";\n\n// Cache entry with TTL\ninterface CacheEntry {\n permission: EntityPermissionCheck;\n expiresAt: number;\n}\n\n// Entity identifier for batch lookups\ninterface EntityIdentifier {\n entityType: EntityType;\n entityId: number;\n}\n\n// Cache key helper\nfunction getCacheKey(userId: string | undefined, entityType: EntityType, entityId: number): string {\n return `${userId || \"anon\"}:${entityType}:${entityId}`;\n}\n\n// Default loading state\nconst loadingPermission: EntityPermissionCheck = {\n canView: false,\n canAdminView: false,\n canEdit: false,\n canCreate: false,\n canDelete: false,\n canShare: false,\n permissionLevel: null,\n isLoading: true\n};\n\n// No permission state\nconst noPermission: EntityPermissionCheck = {\n canView: false,\n canAdminView: false,\n canEdit: false,\n canCreate: false,\n canDelete: false,\n canShare: false,\n permissionLevel: null,\n isLoading: false,\n isDenied: false\n};\n\n// Denied permission state - explicitly blocked access\nconst deniedPermission: EntityPermissionCheck = {\n canView: false,\n canAdminView: false,\n canEdit: false,\n canCreate: false,\n canDelete: false,\n canShare: false,\n permissionLevel: null,\n isLoading: false,\n isDenied: true\n};\n\n// Map permission level to permission check\n// If permission is 'denied', it means access was explicitly blocked\n// Handles both legacy formats (ReadOnly, AdminReadOnly, ReadWrite, Admin)\n// and new formats (view, edit, admin, denied)\nfunction mapPermissionLevel(level: EntityPermissionLevel | \"denied\" | string | null): EntityPermissionCheck {\n if (!level) {\n return noPermission;\n }\n\n // Normalize to lowercase for comparison to handle both legacy and new formats\n const normalizedLevel = level.toLowerCase();\n switch (normalizedLevel) {\n // Legacy format: ReadOnly, New format: view\n case \"readonly\":\n case \"view\":\n return {\n canView: true,\n canAdminView: false,\n canEdit: false,\n canCreate: false,\n canDelete: false,\n canShare: false,\n permissionLevel: \"ReadOnly\",\n isLoading: false,\n isDenied: false\n };\n // Legacy format: AdminReadOnly (no new equivalent, keep for backwards compatibility)\n case \"adminreadonly\":\n return {\n canView: true,\n canAdminView: true,\n canEdit: false,\n canCreate: false,\n canDelete: false,\n canShare: false,\n permissionLevel: \"AdminReadOnly\",\n isLoading: false,\n isDenied: false\n };\n // Legacy format: ReadWrite, New format: edit\n case \"readwrite\":\n case \"edit\":\n return {\n canView: true,\n canAdminView: false,\n canEdit: true,\n canCreate: true,\n canDelete: false,\n canShare: false,\n permissionLevel: \"ReadWrite\",\n isLoading: false,\n isDenied: false\n };\n // Legacy format: Admin, New format: admin\n case \"admin\":\n return {\n canView: true,\n canAdminView: true,\n canEdit: true,\n canCreate: true,\n canDelete: true,\n canShare: true,\n permissionLevel: \"Admin\",\n isLoading: false,\n isDenied: false\n };\n // New format: denied - explicit access denial\n case \"denied\":\n return deniedPermission;\n default:\n console.warn(`Unknown permission level: ${level}`);\n return noPermission;\n }\n}\n\n// Context interface\nexport interface PermissionContextValue {\n getPermission: (entityType: EntityType, entityId: number) => EntityPermissionCheck;\n checkPermission: (entityType: EntityType, entityId: number, action: EntityAction) => boolean;\n prefetchPermissions: (entities: EntityIdentifier[]) => Promise<void>;\n invalidatePermission: (entityType: EntityType, entityId: number) => void;\n isLoading: boolean;\n}\n\n/**\n * @deprecated Use permissionContext instead\n */\nexport interface EntityPermissionContextValue extends PermissionContextValue {}\nexport const permissionContext = createContext<PermissionContextValue>({} as PermissionContextValue);\n\n/**\n * @deprecated Use permissionContext instead\n */\nexport const entityPermissionContext = permissionContext;\n\n// TTL for cache entries (5 minutes)\nconst CACHE_TTL_MS = 5 * 60 * 1000;\n\n// TTL for error cache entries (30 seconds) - shorter to allow quick retry\nconst ERROR_CACHE_TTL_MS = 30 * 1000;\n\n// Batch collection delay (50ms)\nconst BATCH_DELAY_MS = 50;\nexport function PermissionProvider({\n children\n}: {\n children: ReactNode;\n}) {\n const supabase = useSupabase();\n const setupAuth = useContext(setupAuthContext);\n const user = setupAuth?.user;\n\n // Permission cache\n const cacheRef = useRef<Map<string, CacheEntry>>(new Map());\n\n // Pending lookups for batching\n const pendingLookupsRef = useRef<Set<string>>(new Set());\n\n // In-flight lookups to prevent duplicate requests during async RPC calls\n const inFlightRef = useRef<Set<string>>(new Set());\n\n // Batch timer ref\n const batchTimerRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n\n // Loading state\n const [isLoading, setIsLoading] = useState(false);\n\n // Force re-render trigger\n const [, forceUpdate] = useState(0);\n\n // Clean up expired cache entries\n const cleanupExpiredEntries = useCallback(() => {\n const now = Date.now();\n const cache = cacheRef.current;\n let hasExpired = false;\n for (const [key, entry] of cache.entries()) {\n if (entry.expiresAt < now) {\n cache.delete(key);\n hasExpired = true;\n }\n }\n if (hasExpired) {\n forceUpdate(prev => prev + 1);\n }\n }, []);\n\n // Periodic cleanup of expired entries\n useEffect(() => {\n const cleanupInterval = setInterval(cleanupExpiredEntries, 60 * 1000);\n return () => clearInterval(cleanupInterval);\n }, [cleanupExpiredEntries]);\n\n // Execute batch lookup\n const executeBatchLookup = useCallback(async () => {\n const pending = Array.from(pendingLookupsRef.current);\n pendingLookupsRef.current.clear();\n if (pending.length === 0 || !user?.id) {\n return;\n }\n\n // Move pending keys to in-flight to prevent duplicate requests\n pending.forEach(k => inFlightRef.current.add(k));\n setIsLoading(true);\n try {\n // Parse pending keys back to entities (format: userId:entityType:entityId)\n const entities = pending.map(key_0 => {\n const parts = key_0.split(\":\");\n // Skip the userId part (index 0), use entityType (index 1) and entityId (index 2)\n const entityType = parts[1];\n const entityIdStr = parts[2];\n return {\n entity_type: entityType as EntityType,\n entity_id: parseInt(entityIdStr, 10)\n };\n });\n\n // Call RPC for batch lookup\n // Using 'as any' because the RPC function type isn't in the generated database types\n const {\n data,\n error\n } = await (supabase.rpc as any)(\"get_user_entity_permissions\", {\n p_user_id: user.id,\n p_entities: entities\n });\n if (error) {\n console.error(\"Failed to fetch entity permissions:\", error);\n // Mark all pending as no permission with shorter TTL to allow quick retry\n const cache_0 = cacheRef.current;\n const now_0 = Date.now();\n for (const key_1 of pending) {\n cache_0.set(key_1, {\n permission: noPermission,\n expiresAt: now_0 + ERROR_CACHE_TTL_MS\n });\n }\n } else if (data) {\n // Update cache with results\n const cache_1 = cacheRef.current;\n const now_1 = Date.now();\n\n // Create a map of results for quick lookup\n // Permission can be a standard level or 'denied' for explicit deny\n const resultsMap = new Map<string, EntityPermissionLevel | \"denied\">();\n // Type the data as an array of permission results\n const results = data as Array<{\n entity_type: EntityType;\n entity_id: number;\n permission: EntityPermissionLevel | \"denied\";\n }>;\n for (const result of results) {\n const key_2 = getCacheKey(user?.id, result.entity_type, result.entity_id);\n resultsMap.set(key_2, result.permission);\n }\n\n // Update cache for all pending keys\n for (const key_3 of pending) {\n const permissionLevel = resultsMap.get(key_3) || null;\n cache_1.set(key_3, {\n permission: mapPermissionLevel(permissionLevel),\n expiresAt: now_1 + CACHE_TTL_MS\n });\n }\n }\n forceUpdate(prev_0 => prev_0 + 1);\n } catch (err) {\n console.error(\"Unexpected error fetching entity permissions:\", err);\n } finally {\n // Remove from in-flight after completion (success or error)\n pending.forEach(k => inFlightRef.current.delete(k));\n setIsLoading(false);\n }\n }, [supabase, user?.id]);\n\n // Schedule batch lookup\n const scheduleBatchLookup = useCallback(() => {\n if (batchTimerRef.current) {\n clearTimeout(batchTimerRef.current);\n }\n batchTimerRef.current = setTimeout(() => {\n batchTimerRef.current = null;\n executeBatchLookup();\n }, BATCH_DELAY_MS);\n }, [executeBatchLookup]);\n\n // Get permission for an entity\n const getPermission = useCallback((entityType_0: EntityType, entityId: number): EntityPermissionCheck => {\n const key_4 = getCacheKey(user?.id, entityType_0, entityId);\n const cache_2 = cacheRef.current;\n const cached = cache_2.get(key_4);\n const now_2 = Date.now();\n\n // Return cached if valid\n if (cached && cached.expiresAt > now_2) {\n return cached.permission;\n }\n\n // Don't add if already pending or in-flight to prevent duplicate requests\n if (!pendingLookupsRef.current.has(key_4) && !inFlightRef.current.has(key_4)) {\n pendingLookupsRef.current.add(key_4);\n scheduleBatchLookup();\n }\n return loadingPermission;\n }, [scheduleBatchLookup, user?.id]);\n\n // Check specific permission action\n const checkPermission = useCallback((entityType_1: EntityType, entityId_0: number, action: EntityAction): boolean => {\n const permission = getPermission(entityType_1, entityId_0);\n if (permission.isLoading) {\n return false;\n }\n switch (action) {\n case \"view\":\n return permission.canView;\n case \"adminView\":\n return permission.canAdminView;\n case \"edit\":\n return permission.canEdit;\n case \"create\":\n return permission.canCreate;\n case \"delete\":\n return permission.canDelete;\n case \"share\":\n return permission.canShare;\n default:\n return false;\n }\n }, [getPermission]);\n\n // Prefetch permissions for multiple entities\n const prefetchPermissions = useCallback(async (entities_0: EntityIdentifier[]): Promise<void> => {\n if (!user?.id || entities_0.length === 0) {\n return;\n }\n const cache_3 = cacheRef.current;\n const now_3 = Date.now();\n\n // Filter out already cached entries, items already pending, and items in-flight\n const toFetch = entities_0.filter(entity => {\n const key_5 = getCacheKey(user?.id, entity.entityType, entity.entityId);\n const cached_0 = cache_3.get(key_5);\n const isPending = pendingLookupsRef.current.has(key_5);\n const isInFlight = inFlightRef.current.has(key_5);\n return !isPending && !isInFlight && (!cached_0 || cached_0.expiresAt <= now_3);\n });\n if (toFetch.length === 0) {\n return;\n }\n setIsLoading(true);\n try {\n const entitiesParam = toFetch.map(e => ({\n entity_type: e.entityType,\n entity_id: e.entityId\n }));\n\n // Using 'as any' because the RPC function type isn't in the generated database types\n const {\n data: data_0,\n error: error_0\n } = await (supabase.rpc as any)(\"get_user_entity_permissions\", {\n p_user_id: user.id,\n p_entities: entitiesParam\n });\n if (error_0) {\n console.error(\"Failed to prefetch entity permissions:\", error_0);\n return;\n }\n if (data_0) {\n // Capture timestamp AFTER the RPC call completes\n const cacheTimestamp = Date.now();\n\n // Permission can be a standard level or 'denied' for explicit deny\n const resultsMap_0 = new Map<string, EntityPermissionLevel | \"denied\">();\n // Type the data as an array of permission results\n const results_0 = data_0 as Array<{\n entity_type: EntityType;\n entity_id: number;\n permission: EntityPermissionLevel | \"denied\";\n }>;\n for (const result_0 of results_0) {\n const key_6 = getCacheKey(user?.id, result_0.entity_type, result_0.entity_id);\n resultsMap_0.set(key_6, result_0.permission);\n }\n for (const entity_0 of toFetch) {\n const key_7 = getCacheKey(user?.id, entity_0.entityType, entity_0.entityId);\n const permissionLevel_0 = resultsMap_0.get(key_7) || null;\n cache_3.set(key_7, {\n permission: mapPermissionLevel(permissionLevel_0),\n expiresAt: cacheTimestamp + CACHE_TTL_MS\n });\n }\n forceUpdate(prev_1 => prev_1 + 1);\n }\n } catch (err_0) {\n console.error(\"Unexpected error prefetching entity permissions:\", err_0);\n } finally {\n setIsLoading(false);\n }\n }, [supabase, user?.id]);\n\n // Invalidate a specific permission\n const invalidatePermission = useCallback((entityType_2: EntityType, entityId_1: number): void => {\n const key_8 = getCacheKey(user?.id, entityType_2, entityId_1);\n cacheRef.current.delete(key_8);\n forceUpdate(prev_2 => prev_2 + 1);\n }, [user?.id]);\n\n // Parse scoped access key format: <entity_type>:<entity_id>:<permission_level>\n // Returns null if the key format is invalid\n const parseScopedAccessKey = useCallback((key_9: string): {\n entityType: EntityType;\n entityId: number;\n } | null => {\n if (!key_9 || typeof key_9 !== \"string\") {\n return null;\n }\n const parts_0 = key_9.split(\":\");\n if (parts_0.length < 2) {\n return null;\n }\n const entityType_3 = parts_0[0];\n const entityId_2 = parseInt(parts_0[1], 10);\n if (isNaN(entityId_2)) {\n return null;\n }\n // Use explicit mapping instead of string manipulation\n // This correctly handles \"database\" -> \"ProjectDatabase\" case\n const entityTypeMap: Record<string, EntityType> = {\n client: \"Client\",\n project: \"Project\",\n database: \"ProjectDatabase\",\n projectdatabase: \"ProjectDatabase\"\n };\n const normalizedEntityType = entityTypeMap[entityType_3.toLowerCase()];\n if (!normalizedEntityType) {\n return null;\n }\n return {\n entityType: normalizedEntityType,\n entityId: entityId_2\n };\n }, []);\n\n // Real-time subscription for permission changes\n useEffect(() => {\n if (!user?.id) {\n return;\n }\n\n // Subscribe to changes on UserAccess table for the current user\n // Use unique channel name per user to avoid collisions\n const channel = supabase.channel(`entity-permissions-${user.id}`).on(\"postgres_changes\", {\n event: \"*\",\n schema: \"core\",\n table: \"UserAccess\",\n filter: `userId=eq.${user.id}`\n }, payload => {\n // Parse the scoped access key from the new record\n if (payload.new && typeof payload.new === \"object\" && \"scopedAccessKey\" in payload.new && typeof payload.new.scopedAccessKey === \"string\") {\n const parsed = parseScopedAccessKey(payload.new.scopedAccessKey);\n if (parsed) {\n invalidatePermission(parsed.entityType, parsed.entityId);\n }\n }\n // Parse the scoped access key from the old record (for deletes/updates)\n if (payload.old && typeof payload.old === \"object\" && \"scopedAccessKey\" in payload.old && typeof payload.old.scopedAccessKey === \"string\") {\n const parsed_0 = parseScopedAccessKey(payload.old.scopedAccessKey);\n if (parsed_0) {\n invalidatePermission(parsed_0.entityType, parsed_0.entityId);\n }\n }\n }).subscribe();\n return () => {\n channel.unsubscribe();\n supabase.removeChannel(channel);\n };\n }, [supabase, user?.id, invalidatePermission, parseScopedAccessKey]);\n\n // Clear cache on user change\n useEffect(() => {\n cacheRef.current.clear();\n pendingLookupsRef.current.clear();\n inFlightRef.current.clear();\n if (batchTimerRef.current) {\n clearTimeout(batchTimerRef.current);\n batchTimerRef.current = null;\n }\n forceUpdate(prev_3 => prev_3 + 1);\n }, [user?.id]);\n\n // Cleanup batch timer on unmount\n useEffect(() => {\n return () => {\n if (batchTimerRef.current) {\n clearTimeout(batchTimerRef.current);\n }\n };\n }, []);\n const value = useMemo(() => ({\n getPermission,\n checkPermission,\n prefetchPermissions,\n invalidatePermission,\n isLoading\n }), [getPermission, checkPermission, prefetchPermissions, invalidatePermission, isLoading]);\n return <permissionContext.Provider value={value}>\n {children}\n </permissionContext.Provider>;\n}\nexport function usePermissions() {\n const context = useContext(permissionContext);\n if (!context || Object.keys(context).length === 0) {\n throw new Error(\"usePermissions must be used within a PermissionProvider\");\n }\n return context;\n}","/**\n * AuthProvider - Unified auth provider for offline-first apps\n *\n * Features:\n * - Supabase auth with session timeout protection (3 second timeout)\n * - Profile and access data via useDbQuery (auto strategy: Supabase primary, PowerSync offline backup)\n * - Group-based access with permission levels (view=1, edit=2, admin=3)\n * - Wildcard matching (*:*:*, type:*:action, etc.)\n * - Works 100% offline once data is synced\n */\n\nimport { ReactNode, useCallback, useEffect, useMemo, useRef, useState } from \"react\";\nimport { User, SignUpWithPasswordCredentials } from \"@supabase/supabase-js\";\nimport { isUsable, newUuid } from \"@pol-studios/utils\";\nimport { useDbQuery } from \"../../hooks/useDbQuery\";\nimport useSupabase from \"../../useSupabase\";\nimport { PermissionProvider } from \"./PermissionContext\";\nimport { setupAuthContext, type ProfileStatus, type EffectivePermission } from \"./setupAuthContext\";\n\n// Re-export from shared context for API compatibility\nexport { setupAuthContext, type SetupAuthContext, type SetupAuthContextProviderProps, type ProfileStatus, type EffectivePermission } from \"./setupAuthContext\";\n\n// Session fetch timeout - fail fast to avoid loading hangs\nconst SESSION_FETCH_TIMEOUT_MS = 3000;\n\n// ============================================================================\n// Types for access-related tables\n// ============================================================================\n\ninterface ProfileRow {\n id: string;\n email?: string | null;\n firstName?: string | null;\n lastName?: string | null;\n fullName?: string | null;\n status?: ProfileStatus | null;\n profilePath?: string | null;\n [key: string]: unknown;\n}\ninterface UserAccessRow {\n id: string;\n accessKey: string;\n effect: string;\n expiresAt: string | null;\n userId: string;\n}\ninterface UserGroupRow {\n id: string;\n userId: string;\n groupId: number;\n expiresAt: string | null;\n}\ninterface GroupRow {\n id: number;\n name: string;\n isActive: number; // PowerSync stores booleans as 0/1\n}\ninterface GroupAccessKeyRow {\n id: string;\n groupId: number;\n accessKey: string;\n effect: string;\n expiresAt?: string | null;\n}\nexport interface AuthProviderProps {\n children: ReactNode;\n /**\n * Enable entity-level permissions (Project, Client, ProjectDatabase access control).\n * When enabled, wraps children with PermissionProvider.\n * @default false\n */\n enableEntityPermissions?: boolean;\n}\n\n// ============================================================================\n// Permission Helpers\n// ============================================================================\n\n/** Maps permission action strings to numeric levels for comparison */\nfunction getPermissionLevel(action: string): number {\n switch (action.toLowerCase()) {\n case \"view\":\n case \"read\":\n return 1;\n case \"edit\":\n case \"write\":\n return 2;\n case \"admin\":\n case \"delete\":\n case \"share\":\n return 3;\n default:\n return 0;\n }\n}\n\n/** Check if a date string is not expired (null = never expires) */\nfunction isNotExpired(expiresAt: string | null | undefined): boolean {\n return !expiresAt || new Date(expiresAt) > new Date();\n}\n\n/**\n * Check if an access key pattern matches a requested key.\n * Supports wildcards (*) in any segment.\n *\n * Examples:\n * - \"*:*:*\" matches everything (super admin)\n * - \"project:*:read\" matches project:123:read\n * - \"project:123:*\" matches project:123:read, project:123:write\n */\nfunction matchesAccessPattern(pattern: string, requestedKey: string): boolean {\n if (pattern === requestedKey) return true;\n if (pattern === \"*:*:*\") return true;\n const patternParts = pattern.split(\":\");\n const keyParts = requestedKey.split(\":\");\n if (patternParts.length !== keyParts.length) return false;\n for (let i = 0; i < patternParts.length; i++) {\n if (patternParts[i] === \"*\") continue;\n if (patternParts[i] !== keyParts[i]) return false;\n }\n return true;\n}\n\n// ============================================================================\n// AuthProvider Component\n// ============================================================================\n\nexport function AuthProvider({\n children,\n enableEntityPermissions = false\n}: AuthProviderProps) {\n const supabase = useSupabase();\n\n // Auth state\n const [currentUser, setCurrentUser] = useState<User | null | undefined>(undefined);\n const [userNeedsChange, setUserNeedsChange] = useState(true);\n const [onSignOutCallbacks, setOnSignOutCallbacks] = useState(new Map<string, () => any>());\n\n // ─── Auth Actions ─────────────────────────────────────────────────────────\n\n async function registerAsync(register: SignUpWithPasswordCredentials) {\n const response = await supabase.auth.signUp(register);\n if (response.data.user) {\n setCurrentUser(prev => prev?.id === response.data.user?.id ? prev : response.data.user);\n }\n return response;\n }\n async function signInAsync(username: string, password: string) {\n const response_0 = await supabase.auth.signInWithPassword({\n email: username,\n password\n });\n if (response_0.data.user) {\n setCurrentUser(prev_0 => prev_0?.id === response_0.data.user?.id ? prev_0 : response_0.data.user);\n }\n return response_0;\n }\n const signOutAsync = useCallback(async () => {\n const response_1 = await supabase.auth.signOut();\n if (!response_1.error) {\n Array.from(onSignOutCallbacks.values()).forEach(cb => cb());\n }\n return response_1;\n }, [supabase.auth, onSignOutCallbacks]);\n function onSignOut(action: () => any) {\n const id = newUuid();\n setOnSignOutCallbacks(x => new Map(x).set(id, action));\n return id;\n }\n function removeOnSignOut(id_0: string) {\n setOnSignOutCallbacks(x_0 => {\n const map = new Map(x_0);\n map.delete(id_0);\n return map;\n });\n }\n async function refreshAsync() {}\n\n // ─── Session Management with Timeout ──────────────────────────────────────\n\n useEffect(() => {\n const {\n data: {\n subscription\n }\n } = supabase.auth.onAuthStateChange(event => {\n if (event === \"SIGNED_IN\" || event === \"SIGNED_OUT\") {\n setUserNeedsChange(true);\n }\n });\n return () => subscription.unsubscribe();\n }, [supabase.auth]);\n useEffect(() => {\n if (!userNeedsChange) return;\n let cancelled = false;\n async function fetchSessionWithTimeout() {\n try {\n // Race session fetch against timeout to prevent indefinite hangs\n const timeoutPromise = new Promise<never>((_, reject) => {\n setTimeout(() => {\n reject(new Error(`Session fetch timed out after ${SESSION_FETCH_TIMEOUT_MS}ms`));\n }, SESSION_FETCH_TIMEOUT_MS);\n });\n const result = await Promise.race([supabase.auth.getSession(), timeoutPromise]);\n if (cancelled) return;\n const newUser = result?.data?.session?.user ?? null;\n setCurrentUser(prev_2 => {\n if (newUser === null) return null;\n if (prev_2?.id === newUser?.id) return prev_2;\n return newUser;\n });\n setUserNeedsChange(false);\n } catch (error) {\n if (cancelled) return;\n console.error(\"Failed to get session (timeout or error):\", error);\n setCurrentUser(prev_1 => prev_1 === null ? prev_1 : null);\n setUserNeedsChange(false);\n }\n }\n fetchSessionWithTimeout();\n return () => {\n cancelled = true;\n };\n }, [userNeedsChange, supabase.auth]);\n\n // ─── Query Profile and Access via useDbQuery ──────────────────────────────\n // Uses auto strategy: Supabase primary, PowerSync offline backup\n\n const isUserReady = isUsable(currentUser);\n\n // All queries use realtime: true for automatic updates (no manual channel subscriptions)\n const {\n data: profileData,\n isLoading: profileLoading\n } = useDbQuery<ProfileRow>(\"core.Profile\", {\n where: {\n id: currentUser?.id\n },\n enabled: isUserReady,\n realtime: true\n });\n const {\n data: directAccess,\n isLoading: directAccessLoading\n } = useDbQuery<UserAccessRow>(\"core.UserAccess\", {\n where: {\n userId: currentUser?.id\n },\n enabled: isUserReady,\n realtime: true\n });\n const {\n data: userGroups,\n isLoading: userGroupsLoading\n } = useDbQuery<UserGroupRow>(\"core.UserGroup\", {\n where: {\n userId: currentUser?.id\n },\n enabled: isUserReady,\n realtime: true\n });\n const {\n data: groups,\n isLoading: groupsLoading\n } = useDbQuery<GroupRow>(\"core.Group\", {\n where: {\n isActive: 1\n },\n enabled: isUserReady,\n realtime: true\n });\n\n // Get group IDs user belongs to\n const groupIds = useMemo(() => userGroups?.map(ug => ug.groupId) ?? [], [userGroups]);\n\n // Map groups by ID for O(1) lookups\n const groupsMap = useMemo(() => new Map(groups?.map(g => [g.id, g]) ?? []), [groups]);\n const {\n data: groupAccess,\n isLoading: groupAccessLoading\n } = useDbQuery<GroupAccessKeyRow>(\"core.GroupAccessKey\", {\n where: groupIds.length > 0 ? {\n groupId: {\n in: groupIds\n }\n } : undefined,\n enabled: groupIds.length > 0,\n realtime: true\n });\n\n // ─── Derived Data ─────────────────────────────────────────────────────────\n\n const profile = profileData?.[0] ?? null;\n\n // Track previous profile status for signout logic\n const prevProfileStatusRef = useRef<string | null | undefined>(undefined);\n\n // Auto-signout if profile becomes archived/suspended\n useEffect(() => {\n const currentStatus = profile?.status;\n const prevStatus = prevProfileStatusRef.current;\n\n // Only trigger signout if status changed FROM active TO archived/suspended\n if (prevStatus === \"active\" && (currentStatus === \"archived\" || currentStatus === \"suspended\")) {\n signOutAsync();\n }\n prevProfileStatusRef.current = currentStatus;\n }, [profile?.status, signOutAsync]);\n\n // All access keys with metadata\n const allAccessKeys = useMemo(() => {\n const keys: Array<{\n accessKey: string;\n effect: string;\n source: \"direct\" | \"group\";\n expiresAt?: string | null;\n }> = [];\n\n // Add direct access keys (filter out expired)\n directAccess?.forEach(a => {\n if (isNotExpired(a.expiresAt)) {\n keys.push({\n accessKey: a.accessKey,\n effect: a.effect ?? \"allow\",\n source: \"direct\",\n expiresAt: a.expiresAt\n });\n }\n });\n\n // Add group access keys (only from active groups user belongs to)\n const activeGroupIds = new Set(userGroups?.filter(ug_0 => {\n const group = groupsMap.get(ug_0.groupId);\n return group?.isActive === 1 && isNotExpired(ug_0.expiresAt);\n }).map(ug_1 => ug_1.groupId) ?? []);\n groupAccess?.forEach(ga => {\n if (activeGroupIds.has(ga.groupId) && isNotExpired(ga.expiresAt)) {\n keys.push({\n accessKey: ga.accessKey,\n effect: ga.effect ?? \"allow\",\n source: \"group\",\n expiresAt: ga.expiresAt\n });\n }\n });\n return keys;\n }, [directAccess, userGroups, groupsMap, groupAccess]);\n\n // Combine access keys into a simple string array for hasAccess checks\n const combinedAccess: string[] = useMemo(() => {\n const uniqueKeys = new Set<string>();\n for (const item of allAccessKeys) {\n if (item.accessKey && item.effect === \"allow\") {\n uniqueKeys.add(item.accessKey);\n }\n }\n return Array.from(uniqueKeys);\n }, [allAccessKeys]);\n\n // Compute effective permissions\n const effectivePermissions: EffectivePermission[] = useMemo(() => {\n const permissions: EffectivePermission[] = [];\n for (const item_0 of allAccessKeys) {\n if (item_0.effect !== \"allow\") continue;\n const parts = item_0.accessKey.split(\":\");\n if (parts.length === 3) {\n const [resourceType, resourceId, permission] = parts;\n permissions.push({\n resourceType,\n resourceId,\n permission,\n permissionLevel: getPermissionLevel(permission),\n source: item_0.source,\n inheritedFrom: null,\n expiresAt: item_0.expiresAt ?? null\n });\n }\n }\n return permissions;\n }, [allAccessKeys]);\n\n // Profile status values\n const profileStatus = profile?.status as ProfileStatus | undefined;\n const isArchived = profileStatus === \"archived\";\n const isSuspended = profileStatus === \"suspended\";\n\n // ─── hasAccess Function ───────────────────────────────────────────────────\n\n const hasAccess = useCallback((key: string) => {\n // Archived/suspended users have no access\n if (isArchived || isSuspended) return false;\n if (!isUsable(combinedAccess)) return false;\n\n // Super-admin key bypasses all permission checks\n if (combinedAccess.includes(\"*:*:*\")) return true;\n\n // Check exact match\n if (combinedAccess.includes(key)) return true;\n\n // Empty key = no restriction\n if (!isUsable(key)) return true;\n\n // Check wildcard patterns\n for (const pattern of combinedAccess) {\n if (matchesAccessPattern(pattern, key)) return true;\n }\n\n // Check permission levels for type:id:action format\n const parts_0 = key.split(\":\");\n if (parts_0.length === 3) {\n const [type, id_1, action_0] = parts_0;\n const requiredLevel = getPermissionLevel(action_0);\n const hasPermission = effectivePermissions.some(p => p.resourceType === type && p.resourceId === id_1 && p.permissionLevel >= requiredLevel);\n if (hasPermission) return true;\n }\n return false;\n }, [combinedAccess, effectivePermissions, isArchived, isSuspended]);\n\n // ─── Loading State ────────────────────────────────────────────────────────\n\n const isAccessLoading = directAccessLoading || userGroupsLoading || groupsLoading || groupAccessLoading;\n const authState = useMemo(() => ({\n hasAccess,\n user: currentUser,\n profile,\n access: combinedAccess,\n effectivePermissions,\n profileStatus,\n isArchived,\n isSuspended,\n isLoading: currentUser === null ? false : profileLoading || isAccessLoading || currentUser === undefined,\n signInAsync,\n signOutAsync,\n onSignOut,\n removeOnSignOut,\n registerAsync,\n refreshAsync\n }), [hasAccess, currentUser, profile, combinedAccess, effectivePermissions, profileStatus, isArchived, isSuspended, profileLoading, isAccessLoading]);\n\n // ─── Render ───────────────────────────────────────────────────────────────\n\n const content = enableEntityPermissions ? <PermissionProvider>{children}</PermissionProvider> : children;\n return <setupAuthContext.Provider value={authState}>\n {content}\n </setupAuthContext.Provider>;\n}\nexport type Profile = ProfileRow;","import { c as _c } from \"react/compiler-runtime\";\nimport { ReactNode, createContext, useContext, useEffect, useMemo, useState, useCallback, useRef } from \"react\";\nimport { useDbQuery as useQuery } from \"../../useDbQuery\";\nimport { useDbUpsert as useUpsert } from \"../../useDbUpsert\";\nimport useSupabase, { Database } from \"../../useSupabase\";\nimport { isUsable } from \"@pol-studios/utils\";\nimport { setupAuthContext } from \"./AuthProvider\";\n\n// UserMetadata query constant\nconst UserMetadataQuery = {\n schema: \"core\",\n table: \"UserMetadata\",\n defaultQuery: \"key, userId, value\"\n} as const;\n\n// Type definitions for UserMetadata\nexport type UserMetadataRow = Database[\"core\"][\"Tables\"][\"UserMetadata\"][\"Row\"];\nexport type UserMetadataInsert = Database[\"core\"][\"Tables\"][\"UserMetadata\"][\"Insert\"];\nexport type UserMetadataUpdate = Database[\"core\"][\"Tables\"][\"UserMetadata\"][\"Update\"];\n\n// Context interface\nexport interface UserMetadataContextType {\n metadata: Record<string, string>;\n isLoading: boolean;\n error: Error | null;\n setMetadata: (key: string, value: string) => Promise<void>;\n getMetadata: (key: string) => string | undefined;\n removeMetadata: (key: string) => Promise<void>;\n refreshMetadata: () => Promise<void>;\n}\n\n// Create context\nexport const userMetadataContext = createContext<UserMetadataContextType | null>(null);\n\n// Provider component\nexport function UserMetadataProvider({\n children\n}: {\n children: ReactNode;\n}) {\n const supabase = useSupabase();\n const [metadata, setMetadataState] = useState<Record<string, string>>({});\n const [isLoading, setIsLoading] = useState(true);\n const [error, setError] = useState<Error | null>(null);\n\n // Get current user ID from auth context\n const setupAuth = useContext(setupAuthContext);\n const userId = setupAuth?.user?.id;\n\n // Query to fetch all user metadata\n const metadataQuery = useQuery(supabase.schema(\"core\").from(\"UserMetadata\").select(UserMetadataQuery.defaultQuery).eq(\"userId\", userId!).order(\"key\"), {\n enabled: isUsable(userId),\n crossOrganization: true\n });\n\n // Upsert mutation for updating metadata\n const upsertMutation = useUpsert({\n table: \"UserMetadata\",\n schema: \"core\"\n }, [\"userId\", \"key\"] // composite primary keys\n );\n\n // Ref to hold mutation to avoid infinite loops in useCallback dependencies\n const upsertMutationRef = useRef(upsertMutation);\n upsertMutationRef.current = upsertMutation;\n\n // Update local state when query data changes\n useEffect(() => {\n if (metadataQuery.data && Array.isArray(metadataQuery.data)) {\n const metadataMap: Record<string, string> = {};\n metadataQuery.data.forEach((item: any) => {\n metadataMap[item.key] = item.value;\n });\n setMetadataState(metadataMap);\n setIsLoading(false);\n setError(null);\n } else if (metadataQuery.error) {\n setError(metadataQuery.error);\n setIsLoading(false);\n } else if (metadataQuery.isLoading) {\n setIsLoading(true);\n } else if (metadataQuery.data && !Array.isArray(metadataQuery.data)) {\n // Handle case where data is not an array (e.g., empty response or count)\n setMetadataState({});\n setIsLoading(false);\n }\n }, [metadataQuery.data, metadataQuery.error, metadataQuery.isLoading]);\n\n // Set metadata function\n const setMetadata = useCallback(async (key: string, value: string) => {\n if (!userId) {\n throw new Error(\"User not authenticated\");\n }\n try {\n await upsertMutationRef.current.mutateAsync({\n userId,\n key,\n value\n });\n\n // Update local state optimistically\n setMetadataState(prev => ({\n ...prev,\n [key]: value\n }));\n } catch (err) {\n setError(err as Error);\n throw err;\n }\n }, [userId]);\n\n // Get metadata function\n const getMetadata = useCallback((key_0: string): string | undefined => {\n return metadata[key_0];\n }, [metadata]);\n\n // Remove metadata function\n const removeMetadata = useCallback(async (key_1: string) => {\n if (!userId) {\n throw new Error(\"User not authenticated\");\n }\n try {\n await supabase.schema(\"core\").from(\"UserMetadata\").delete().eq(\"userId\", userId).eq(\"key\", key_1);\n\n // Update local state\n setMetadataState(prev_0 => {\n const newState = {\n ...prev_0\n };\n delete newState[key_1];\n return newState;\n });\n } catch (err_0) {\n setError(err_0 as Error);\n throw err_0;\n }\n }, [userId, supabase]);\n\n // Refresh metadata function\n const refreshMetadata = useCallback(async () => {\n await metadataQuery.refetch();\n }, [metadataQuery]);\n\n // Context value\n const contextValue = useMemo(() => ({\n metadata,\n isLoading,\n error,\n setMetadata,\n getMetadata,\n removeMetadata,\n refreshMetadata\n }), [metadata, isLoading, error, setMetadata, getMetadata, removeMetadata, refreshMetadata]);\n return <userMetadataContext.Provider value={contextValue}>\n {children}\n </userMetadataContext.Provider>;\n}\n\n// Hook to use the context\nexport function useUserMetadata() {\n const context = useContext(userMetadataContext);\n if (!context) {\n throw new Error(\"useUserMetadata must be used within a UserMetadataProvider\");\n }\n return context;\n}\n\n// Convenience hook for getting a specific metadata value\nexport function useUserMetadataValue(key) {\n const $ = _c(3);\n const {\n getMetadata\n } = useUserMetadata();\n let t0;\n if ($[0] !== getMetadata || $[1] !== key) {\n t0 = getMetadata(key);\n $[0] = getMetadata;\n $[1] = key;\n $[2] = t0;\n } else {\n t0 = $[2];\n }\n return t0;\n}\n\n// Convenience hook for setting a specific metadata value\nexport function useSetUserMetadata() {\n const $ = _c(3);\n const {\n setMetadata,\n removeMetadata\n } = useUserMetadata();\n let t0;\n if ($[0] !== removeMetadata || $[1] !== setMetadata) {\n t0 = {\n setMetadata,\n removeMetadata\n };\n $[0] = removeMetadata;\n $[1] = setMetadata;\n $[2] = t0;\n } else {\n t0 = $[2];\n }\n return t0;\n}\n\n// Advanced state-like hook with JSON serialization support\nexport function useUserMetadataState(key, defaultValue, options) {\n const $ = _c(11);\n const {\n metadata,\n setMetadata,\n isLoading\n } = useUserMetadata();\n const serialize = options?.serialize ?? _temp;\n const deserialize = options?.deserialize ?? _temp2;\n let t0;\n bb0: {\n const rawValue = metadata[key];\n if (!rawValue) {\n t0 = defaultValue;\n break bb0;\n }\n ;\n try {\n let t2;\n if ($[0] !== deserialize || $[1] !== rawValue) {\n t2 = deserialize(rawValue);\n $[0] = deserialize;\n $[1] = rawValue;\n $[2] = t2;\n } else {\n t2 = $[2];\n }\n t0 = t2;\n } catch (t1) {\n const error = t1;\n console.warn(`Failed to deserialize metadata for key \"${key}\":`, error);\n t0 = defaultValue;\n }\n }\n const currentValue = t0;\n let t1;\n if ($[3] !== key || $[4] !== serialize || $[5] !== setMetadata) {\n t1 = async value_1 => {\n const serializedValue = serialize(value_1);\n await setMetadata(key, serializedValue);\n };\n $[3] = key;\n $[4] = serialize;\n $[5] = setMetadata;\n $[6] = t1;\n } else {\n t1 = $[6];\n }\n const setValue = t1;\n let t2;\n if ($[7] !== currentValue || $[8] !== isLoading || $[9] !== setValue) {\n t2 = [currentValue, setValue, isLoading];\n $[7] = currentValue;\n $[8] = isLoading;\n $[9] = setValue;\n $[10] = t2;\n } else {\n t2 = $[10];\n }\n return t2;\n}\nfunction _temp2(value_0) {\n return JSON.parse(value_0);\n}\nfunction _temp(value) {\n return JSON.stringify(value);\n}","import { c as _c } from \"react/compiler-runtime\";\nimport { useMutation } from \"@tanstack/react-query\";\nimport useSupabase, { Database } from \"./useSupabase\";\nimport { useQueriesForTableLoader, useUpdateMutation, useUpsertItem } from \"@supabase-cache-helpers/postgrest-react-query\";\nimport { GetResult } from \"./parser/select-query-parser\";\nimport { GenericSchema } from \"./parser/types\";\nimport { isUsable } from \"@pol-studios/utils\";\nimport { omit } from \"@pol-studios/utils\";\nimport { buildNormalizedQuery } from \"@supabase-cache-helpers/postgrest-core\";\ntype ItemType<T> = T extends Array<infer U> ? U : T;\nexport type MutationOption = Parameters<typeof useUpdateMutation>[3];\nexport type useDbUpsertResponse = ReturnType<typeof useDbUpsert>;\nexport function useDbUpsert(relation, t0, query, mutationOption) {\n const $ = _c(16);\n let t1;\n if ($[0] !== t0) {\n t1 = t0 === undefined ? [\"id\"] : t0;\n $[0] = t0;\n $[1] = t1;\n } else {\n t1 = $[1];\n }\n const primaryKeys = t1;\n const tableName = typeof relation === \"object\" ? relation.table : relation;\n const schemaName = typeof relation === \"object\" ? String(relation.schema) : \"public\";\n const supabase = useSupabase();\n let t2;\n if ($[2] !== primaryKeys) {\n t2 = primaryKeys.map(_temp);\n $[2] = primaryKeys;\n $[3] = t2;\n } else {\n t2 = $[3];\n }\n const primaryKeysAsStrings = t2 as string[];\n const t3 = primaryKeysAsStrings as any;\n const t4 = relation as any;\n let t5;\n if ($[4] !== t3 || $[5] !== t4) {\n t5 = {\n primaryKeys: t3,\n table: t4,\n schema: \"public\"\n };\n $[4] = t3;\n $[5] = t4;\n $[6] = t5;\n } else {\n t5 = $[6];\n }\n const upsertItem = useUpsertItem(t5);\n const queriesForTable = useQueriesForTableLoader(tableName);\n let t6;\n if ($[7] !== primaryKeys || $[8] !== primaryKeysAsStrings || $[9] !== queriesForTable || $[10] !== query || $[11] !== schemaName || $[12] !== supabase || $[13] !== tableName || $[14] !== upsertItem) {\n t6 = {\n mutationFn: async item => {\n let result = null;\n const selectQuery = buildNormalizedQuery({\n queriesForTable,\n query\n });\n const insert = async function insert() {\n const keysToFilter = primaryKeys.filter(x => isUsable((item as any)[x]) === false);\n const keysToFilterAsStrings = keysToFilter.map(_temp2) as string[];\n const response = await (supabase as any).schema(schemaName as \"public\" | \"core\").from(tableName).insert(omit(item as any, keysToFilterAsStrings as any) as any).select(query).single();\n if (response.error) {\n throw response.error;\n }\n result = response.data as any;\n if (result) {\n upsertItem(result as any);\n }\n };\n const isUpsertable = primaryKeys.every(x_0 => x_0 in item && isUsable((item as any)[x_0]));\n if (isUpsertable) {\n const query_0 = (supabase as any).schema(schemaName as \"public\" | \"core\").from(tableName).update(omit(item as any, primaryKeysAsStrings as any) as any);\n primaryKeys.forEach(x_1 => {\n query_0.eq(String(x_1), (item as any)[x_1]);\n });\n const queryResponse = await query_0.select(selectQuery?.selectQuery).single();\n console.log(\"queryResponse\", queryResponse, tableName);\n if (queryResponse.status === 406) {\n await insert();\n } else {\n if (queryResponse.error) {\n throw queryResponse.error;\n }\n if (queryResponse.data) {\n result = queryResponse.data as any;\n if (result) {\n upsertItem(result as any);\n }\n }\n }\n } else {\n await insert();\n }\n return result as any;\n }\n };\n $[7] = primaryKeys;\n $[8] = primaryKeysAsStrings;\n $[9] = queriesForTable;\n $[10] = query;\n $[11] = schemaName;\n $[12] = supabase;\n $[13] = tableName;\n $[14] = upsertItem;\n $[15] = t6;\n } else {\n t6 = $[15];\n }\n const mutation = useMutation(t6);\n return mutation;\n}\nfunction _temp2(k_0) {\n return String(k_0);\n}\nfunction _temp(k) {\n return String(k);\n}"],"mappings":";;;;;;;;;;;;;;AAAO,IAAM,wBAAwB;AAC9B,IAAM,wBAAwB;AAE9B,SAAS,eAAe,OAA0C;AACvE,MAAI,CAAC,MAAO,QAAO;AACnB,SAAO,MAAM,SAAS,gBAAgB,MAAM,YAAY,yBAAyB,MAAM,QAAQ,YAAY,EAAE,SAAS,WAAW;AACnI;;;ACLA,SAAS,SAAS,cAAc;AAGhC,SAAS,YAAY;AACrB,SAAS,gBAAiC;AAC1C,SAAS,uBAAuB;AAWzB,SAASA,YAAmB,OAEhC,QAA+G;AAEhH,QAAM,WAAW,OAAO,OAAO,KAAK;AACpC,QAAM,iBAAiB,SAAS,KAAK,GAAG;AACxC,QAAM,qBAAqB,gBAAgB,gBAAgB,EAAE;AAG7D,QAAM,cAAc,mBAAmB;AACvC,QAAM,mBAAmB,QAAQ,YAAY,SAAS;AACtD,QAAM,YAAY,QAAQ,WAAW;AAGrC,QAAM,WAAW,OAAsB,IAAI;AAC3C,QAAM,UAAU,SAAS,QAAQ,OAAO;AAAA,IACtC;AAAA,IACA,SAAS,OAAO;AAAA,MACd;AAAA,IACF,MAAM;AACJ,YAAM,aAAa,IAAI,gBAAgB;AACvC,aAAO,iBAAiB,SAAS,MAAM,WAAW,MAAM,CAAC;AACzD,YAAM,YAAY,WAAW,MAAM,WAAW,MAAM,GAAG,SAAS;AAChE,UAAI;AAEF,cAAM,kBAAkB,MAAM,cAAc,WAAW,MAAM,KAAK;AAClE,cAAM,SAAS,MAAM;AACrB,YAAI,OAAO,MAAO,OAAM,OAAO;AAE/B,iBAAS,UAAU,OAAO,SAAS;AACnC,eAAO,OAAO;AAAA,MAChB,SAAS,KAAU;AACjB,YAAI,IAAI,SAAS,cAAc;AAC7B,gBAAM,IAAI,MAAM,qBAAqB;AAAA,QACvC;AACA,cAAM;AAAA,MACR,UAAE;AACA,qBAAa,SAAS;AAAA,MACxB;AAAA,IACF;AAAA,IACA,GAAG,KAAK;AAAA,MACN,OAAO;AAAA,MACP,GAAG;AAAA,MACH,SAAS;AAAA,IACX,GAAG,CAAC,YAAY,SAAS,CAAC;AAAA,EAC5B,IAAI,CAAC,UAAU,QAAQ,kBAAkB,WAAW,KAAK,CAAC,CAAC;AAG3D,SAAO,QAAQ,OAAO;AAAA,IACpB,GAAG;AAAA,IACH,OAAO,SAAS;AAAA,EAClB,IAAI,CAAC,SAAS,SAAS,OAAO,CAAC;AACjC;;;AC9DA,SAAS,qBAAgC;AAyDlC,IAAM,mBAAmB,cAAc,CAAC,CAAqB;;;AChEpE,SAAS,iBAAAC,gBAA0B,aAAa,YAAY,WAAW,WAAAC,UAAS,UAAAC,SAAQ,gBAAgB;AA6gB/F;AA3fT,SAAS,YAAY,QAA4B,YAAwB,UAA0B;AACjG,SAAO,GAAG,UAAU,MAAM,IAAI,UAAU,IAAI,QAAQ;AACtD;AAGA,IAAM,oBAA2C;AAAA,EAC/C,SAAS;AAAA,EACT,cAAc;AAAA,EACd,SAAS;AAAA,EACT,WAAW;AAAA,EACX,WAAW;AAAA,EACX,UAAU;AAAA,EACV,iBAAiB;AAAA,EACjB,WAAW;AACb;AAGA,IAAM,eAAsC;AAAA,EAC1C,SAAS;AAAA,EACT,cAAc;AAAA,EACd,SAAS;AAAA,EACT,WAAW;AAAA,EACX,WAAW;AAAA,EACX,UAAU;AAAA,EACV,iBAAiB;AAAA,EACjB,WAAW;AAAA,EACX,UAAU;AACZ;AAGA,IAAM,mBAA0C;AAAA,EAC9C,SAAS;AAAA,EACT,cAAc;AAAA,EACd,SAAS;AAAA,EACT,WAAW;AAAA,EACX,WAAW;AAAA,EACX,UAAU;AAAA,EACV,iBAAiB;AAAA,EACjB,WAAW;AAAA,EACX,UAAU;AACZ;AAMA,SAAS,mBAAmB,OAAgF;AAC1G,MAAI,CAAC,OAAO;AACV,WAAO;AAAA,EACT;AAGA,QAAM,kBAAkB,MAAM,YAAY;AAC1C,UAAQ,iBAAiB;AAAA;AAAA,IAEvB,KAAK;AAAA,IACL,KAAK;AACH,aAAO;AAAA,QACL,SAAS;AAAA,QACT,cAAc;AAAA,QACd,SAAS;AAAA,QACT,WAAW;AAAA,QACX,WAAW;AAAA,QACX,UAAU;AAAA,QACV,iBAAiB;AAAA,QACjB,WAAW;AAAA,QACX,UAAU;AAAA,MACZ;AAAA;AAAA,IAEF,KAAK;AACH,aAAO;AAAA,QACL,SAAS;AAAA,QACT,cAAc;AAAA,QACd,SAAS;AAAA,QACT,WAAW;AAAA,QACX,WAAW;AAAA,QACX,UAAU;AAAA,QACV,iBAAiB;AAAA,QACjB,WAAW;AAAA,QACX,UAAU;AAAA,MACZ;AAAA;AAAA,IAEF,KAAK;AAAA,IACL,KAAK;AACH,aAAO;AAAA,QACL,SAAS;AAAA,QACT,cAAc;AAAA,QACd,SAAS;AAAA,QACT,WAAW;AAAA,QACX,WAAW;AAAA,QACX,UAAU;AAAA,QACV,iBAAiB;AAAA,QACjB,WAAW;AAAA,QACX,UAAU;AAAA,MACZ;AAAA;AAAA,IAEF,KAAK;AACH,aAAO;AAAA,QACL,SAAS;AAAA,QACT,cAAc;AAAA,QACd,SAAS;AAAA,QACT,WAAW;AAAA,QACX,WAAW;AAAA,QACX,UAAU;AAAA,QACV,iBAAiB;AAAA,QACjB,WAAW;AAAA,QACX,UAAU;AAAA,MACZ;AAAA;AAAA,IAEF,KAAK;AACH,aAAO;AAAA,IACT;AACE,cAAQ,KAAK,6BAA6B,KAAK,EAAE;AACjD,aAAO;AAAA,EACX;AACF;AAeO,IAAM,oBAAoBC,eAAsC,CAAC,CAA2B;AAK5F,IAAM,0BAA0B;AAGvC,IAAM,eAAe,IAAI,KAAK;AAG9B,IAAM,qBAAqB,KAAK;AAGhC,IAAM,iBAAiB;AAChB,SAAS,mBAAmB;AAAA,EACjC;AACF,GAEG;AACD,QAAM,WAAW,YAAY;AAC7B,QAAM,YAAY,WAAW,gBAAgB;AAC7C,QAAM,OAAO,WAAW;AAGxB,QAAM,WAAWC,QAAgC,oBAAI,IAAI,CAAC;AAG1D,QAAM,oBAAoBA,QAAoB,oBAAI,IAAI,CAAC;AAGvD,QAAM,cAAcA,QAAoB,oBAAI,IAAI,CAAC;AAGjD,QAAM,gBAAgBA,QAA6C,IAAI;AAGvE,QAAM,CAAC,WAAW,YAAY,IAAI,SAAS,KAAK;AAGhD,QAAM,CAAC,EAAE,WAAW,IAAI,SAAS,CAAC;AAGlC,QAAM,wBAAwB,YAAY,MAAM;AAC9C,UAAM,MAAM,KAAK,IAAI;AACrB,UAAM,QAAQ,SAAS;AACvB,QAAI,aAAa;AACjB,eAAW,CAAC,KAAK,KAAK,KAAK,MAAM,QAAQ,GAAG;AAC1C,UAAI,MAAM,YAAY,KAAK;AACzB,cAAM,OAAO,GAAG;AAChB,qBAAa;AAAA,MACf;AAAA,IACF;AACA,QAAI,YAAY;AACd,kBAAY,UAAQ,OAAO,CAAC;AAAA,IAC9B;AAAA,EACF,GAAG,CAAC,CAAC;AAGL,YAAU,MAAM;AACd,UAAM,kBAAkB,YAAY,uBAAuB,KAAK,GAAI;AACpE,WAAO,MAAM,cAAc,eAAe;AAAA,EAC5C,GAAG,CAAC,qBAAqB,CAAC;AAG1B,QAAM,qBAAqB,YAAY,YAAY;AACjD,UAAM,UAAU,MAAM,KAAK,kBAAkB,OAAO;AACpD,sBAAkB,QAAQ,MAAM;AAChC,QAAI,QAAQ,WAAW,KAAK,CAAC,MAAM,IAAI;AACrC;AAAA,IACF;AAGA,YAAQ,QAAQ,OAAK,YAAY,QAAQ,IAAI,CAAC,CAAC;AAC/C,iBAAa,IAAI;AACjB,QAAI;AAEF,YAAM,WAAW,QAAQ,IAAI,WAAS;AACpC,cAAM,QAAQ,MAAM,MAAM,GAAG;AAE7B,cAAM,aAAa,MAAM,CAAC;AAC1B,cAAM,cAAc,MAAM,CAAC;AAC3B,eAAO;AAAA,UACL,aAAa;AAAA,UACb,WAAW,SAAS,aAAa,EAAE;AAAA,QACrC;AAAA,MACF,CAAC;AAID,YAAM;AAAA,QACJ;AAAA,QACA;AAAA,MACF,IAAI,MAAO,SAAS,IAAY,+BAA+B;AAAA,QAC7D,WAAW,KAAK;AAAA,QAChB,YAAY;AAAA,MACd,CAAC;AACD,UAAI,OAAO;AACT,gBAAQ,MAAM,uCAAuC,KAAK;AAE1D,cAAM,UAAU,SAAS;AACzB,cAAM,QAAQ,KAAK,IAAI;AACvB,mBAAW,SAAS,SAAS;AAC3B,kBAAQ,IAAI,OAAO;AAAA,YACjB,YAAY;AAAA,YACZ,WAAW,QAAQ;AAAA,UACrB,CAAC;AAAA,QACH;AAAA,MACF,WAAW,MAAM;AAEf,cAAM,UAAU,SAAS;AACzB,cAAM,QAAQ,KAAK,IAAI;AAIvB,cAAM,aAAa,oBAAI,IAA8C;AAErE,cAAM,UAAU;AAKhB,mBAAW,UAAU,SAAS;AAC5B,gBAAM,QAAQ,YAAY,MAAM,IAAI,OAAO,aAAa,OAAO,SAAS;AACxE,qBAAW,IAAI,OAAO,OAAO,UAAU;AAAA,QACzC;AAGA,mBAAW,SAAS,SAAS;AAC3B,gBAAM,kBAAkB,WAAW,IAAI,KAAK,KAAK;AACjD,kBAAQ,IAAI,OAAO;AAAA,YACjB,YAAY,mBAAmB,eAAe;AAAA,YAC9C,WAAW,QAAQ;AAAA,UACrB,CAAC;AAAA,QACH;AAAA,MACF;AACA,kBAAY,YAAU,SAAS,CAAC;AAAA,IAClC,SAAS,KAAK;AACZ,cAAQ,MAAM,iDAAiD,GAAG;AAAA,IACpE,UAAE;AAEA,cAAQ,QAAQ,OAAK,YAAY,QAAQ,OAAO,CAAC,CAAC;AAClD,mBAAa,KAAK;AAAA,IACpB;AAAA,EACF,GAAG,CAAC,UAAU,MAAM,EAAE,CAAC;AAGvB,QAAM,sBAAsB,YAAY,MAAM;AAC5C,QAAI,cAAc,SAAS;AACzB,mBAAa,cAAc,OAAO;AAAA,IACpC;AACA,kBAAc,UAAU,WAAW,MAAM;AACvC,oBAAc,UAAU;AACxB,yBAAmB;AAAA,IACrB,GAAG,cAAc;AAAA,EACnB,GAAG,CAAC,kBAAkB,CAAC;AAGvB,QAAM,gBAAgB,YAAY,CAAC,cAA0B,aAA4C;AACvG,UAAM,QAAQ,YAAY,MAAM,IAAI,cAAc,QAAQ;AAC1D,UAAM,UAAU,SAAS;AACzB,UAAM,SAAS,QAAQ,IAAI,KAAK;AAChC,UAAM,QAAQ,KAAK,IAAI;AAGvB,QAAI,UAAU,OAAO,YAAY,OAAO;AACtC,aAAO,OAAO;AAAA,IAChB;AAGA,QAAI,CAAC,kBAAkB,QAAQ,IAAI,KAAK,KAAK,CAAC,YAAY,QAAQ,IAAI,KAAK,GAAG;AAC5E,wBAAkB,QAAQ,IAAI,KAAK;AACnC,0BAAoB;AAAA,IACtB;AACA,WAAO;AAAA,EACT,GAAG,CAAC,qBAAqB,MAAM,EAAE,CAAC;AAGlC,QAAM,kBAAkB,YAAY,CAAC,cAA0B,YAAoB,WAAkC;AACnH,UAAM,aAAa,cAAc,cAAc,UAAU;AACzD,QAAI,WAAW,WAAW;AACxB,aAAO;AAAA,IACT;AACA,YAAQ,QAAQ;AAAA,MACd,KAAK;AACH,eAAO,WAAW;AAAA,MACpB,KAAK;AACH,eAAO,WAAW;AAAA,MACpB,KAAK;AACH,eAAO,WAAW;AAAA,MACpB,KAAK;AACH,eAAO,WAAW;AAAA,MACpB,KAAK;AACH,eAAO,WAAW;AAAA,MACpB,KAAK;AACH,eAAO,WAAW;AAAA,MACpB;AACE,eAAO;AAAA,IACX;AAAA,EACF,GAAG,CAAC,aAAa,CAAC;AAGlB,QAAM,sBAAsB,YAAY,OAAO,eAAkD;AAC/F,QAAI,CAAC,MAAM,MAAM,WAAW,WAAW,GAAG;AACxC;AAAA,IACF;AACA,UAAM,UAAU,SAAS;AACzB,UAAM,QAAQ,KAAK,IAAI;AAGvB,UAAM,UAAU,WAAW,OAAO,YAAU;AAC1C,YAAM,QAAQ,YAAY,MAAM,IAAI,OAAO,YAAY,OAAO,QAAQ;AACtE,YAAM,WAAW,QAAQ,IAAI,KAAK;AAClC,YAAM,YAAY,kBAAkB,QAAQ,IAAI,KAAK;AACrD,YAAM,aAAa,YAAY,QAAQ,IAAI,KAAK;AAChD,aAAO,CAAC,aAAa,CAAC,eAAe,CAAC,YAAY,SAAS,aAAa;AAAA,IAC1E,CAAC;AACD,QAAI,QAAQ,WAAW,GAAG;AACxB;AAAA,IACF;AACA,iBAAa,IAAI;AACjB,QAAI;AACF,YAAM,gBAAgB,QAAQ,IAAI,QAAM;AAAA,QACtC,aAAa,EAAE;AAAA,QACf,WAAW,EAAE;AAAA,MACf,EAAE;AAGF,YAAM;AAAA,QACJ,MAAM;AAAA,QACN,OAAO;AAAA,MACT,IAAI,MAAO,SAAS,IAAY,+BAA+B;AAAA,QAC7D,WAAW,KAAK;AAAA,QAChB,YAAY;AAAA,MACd,CAAC;AACD,UAAI,SAAS;AACX,gBAAQ,MAAM,0CAA0C,OAAO;AAC/D;AAAA,MACF;AACA,UAAI,QAAQ;AAEV,cAAM,iBAAiB,KAAK,IAAI;AAGhC,cAAM,eAAe,oBAAI,IAA8C;AAEvE,cAAM,YAAY;AAKlB,mBAAW,YAAY,WAAW;AAChC,gBAAM,QAAQ,YAAY,MAAM,IAAI,SAAS,aAAa,SAAS,SAAS;AAC5E,uBAAa,IAAI,OAAO,SAAS,UAAU;AAAA,QAC7C;AACA,mBAAW,YAAY,SAAS;AAC9B,gBAAM,QAAQ,YAAY,MAAM,IAAI,SAAS,YAAY,SAAS,QAAQ;AAC1E,gBAAM,oBAAoB,aAAa,IAAI,KAAK,KAAK;AACrD,kBAAQ,IAAI,OAAO;AAAA,YACjB,YAAY,mBAAmB,iBAAiB;AAAA,YAChD,WAAW,iBAAiB;AAAA,UAC9B,CAAC;AAAA,QACH;AACA,oBAAY,YAAU,SAAS,CAAC;AAAA,MAClC;AAAA,IACF,SAAS,OAAO;AACd,cAAQ,MAAM,oDAAoD,KAAK;AAAA,IACzE,UAAE;AACA,mBAAa,KAAK;AAAA,IACpB;AAAA,EACF,GAAG,CAAC,UAAU,MAAM,EAAE,CAAC;AAGvB,QAAM,uBAAuB,YAAY,CAAC,cAA0B,eAA6B;AAC/F,UAAM,QAAQ,YAAY,MAAM,IAAI,cAAc,UAAU;AAC5D,aAAS,QAAQ,OAAO,KAAK;AAC7B,gBAAY,YAAU,SAAS,CAAC;AAAA,EAClC,GAAG,CAAC,MAAM,EAAE,CAAC;AAIb,QAAM,uBAAuB,YAAY,CAAC,UAG9B;AACV,QAAI,CAAC,SAAS,OAAO,UAAU,UAAU;AACvC,aAAO;AAAA,IACT;AACA,UAAM,UAAU,MAAM,MAAM,GAAG;AAC/B,QAAI,QAAQ,SAAS,GAAG;AACtB,aAAO;AAAA,IACT;AACA,UAAM,eAAe,QAAQ,CAAC;AAC9B,UAAM,aAAa,SAAS,QAAQ,CAAC,GAAG,EAAE;AAC1C,QAAI,MAAM,UAAU,GAAG;AACrB,aAAO;AAAA,IACT;AAGA,UAAM,gBAA4C;AAAA,MAChD,QAAQ;AAAA,MACR,SAAS;AAAA,MACT,UAAU;AAAA,MACV,iBAAiB;AAAA,IACnB;AACA,UAAM,uBAAuB,cAAc,aAAa,YAAY,CAAC;AACrE,QAAI,CAAC,sBAAsB;AACzB,aAAO;AAAA,IACT;AACA,WAAO;AAAA,MACL,YAAY;AAAA,MACZ,UAAU;AAAA,IACZ;AAAA,EACF,GAAG,CAAC,CAAC;AAGL,YAAU,MAAM;AACd,QAAI,CAAC,MAAM,IAAI;AACb;AAAA,IACF;AAIA,UAAM,UAAU,SAAS,QAAQ,sBAAsB,KAAK,EAAE,EAAE,EAAE,GAAG,oBAAoB;AAAA,MACvF,OAAO;AAAA,MACP,QAAQ;AAAA,MACR,OAAO;AAAA,MACP,QAAQ,aAAa,KAAK,EAAE;AAAA,IAC9B,GAAG,aAAW;AAEZ,UAAI,QAAQ,OAAO,OAAO,QAAQ,QAAQ,YAAY,qBAAqB,QAAQ,OAAO,OAAO,QAAQ,IAAI,oBAAoB,UAAU;AACzI,cAAM,SAAS,qBAAqB,QAAQ,IAAI,eAAe;AAC/D,YAAI,QAAQ;AACV,+BAAqB,OAAO,YAAY,OAAO,QAAQ;AAAA,QACzD;AAAA,MACF;AAEA,UAAI,QAAQ,OAAO,OAAO,QAAQ,QAAQ,YAAY,qBAAqB,QAAQ,OAAO,OAAO,QAAQ,IAAI,oBAAoB,UAAU;AACzI,cAAM,WAAW,qBAAqB,QAAQ,IAAI,eAAe;AACjE,YAAI,UAAU;AACZ,+BAAqB,SAAS,YAAY,SAAS,QAAQ;AAAA,QAC7D;AAAA,MACF;AAAA,IACF,CAAC,EAAE,UAAU;AACb,WAAO,MAAM;AACX,cAAQ,YAAY;AACpB,eAAS,cAAc,OAAO;AAAA,IAChC;AAAA,EACF,GAAG,CAAC,UAAU,MAAM,IAAI,sBAAsB,oBAAoB,CAAC;AAGnE,YAAU,MAAM;AACd,aAAS,QAAQ,MAAM;AACvB,sBAAkB,QAAQ,MAAM;AAChC,gBAAY,QAAQ,MAAM;AAC1B,QAAI,cAAc,SAAS;AACzB,mBAAa,cAAc,OAAO;AAClC,oBAAc,UAAU;AAAA,IAC1B;AACA,gBAAY,YAAU,SAAS,CAAC;AAAA,EAClC,GAAG,CAAC,MAAM,EAAE,CAAC;AAGb,YAAU,MAAM;AACd,WAAO,MAAM;AACX,UAAI,cAAc,SAAS;AACzB,qBAAa,cAAc,OAAO;AAAA,MACpC;AAAA,IACF;AAAA,EACF,GAAG,CAAC,CAAC;AACL,QAAM,QAAQC,SAAQ,OAAO;AAAA,IAC3B;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,IAAI,CAAC,eAAe,iBAAiB,qBAAqB,sBAAsB,SAAS,CAAC;AAC1F,SAAO,oBAAC,kBAAkB,UAAlB,EAA2B,OAC9B,UACH;AACJ;AACO,SAAS,iBAAiB;AAC/B,QAAM,UAAU,WAAW,iBAAiB;AAC5C,MAAI,CAAC,WAAW,OAAO,KAAK,OAAO,EAAE,WAAW,GAAG;AACjD,UAAM,IAAI,MAAM,yDAAyD;AAAA,EAC3E;AACA,SAAO;AACT;;;AC5gBA,SAAoB,eAAAC,cAAa,aAAAC,YAAW,WAAAC,UAAS,UAAAC,SAAQ,YAAAC,iBAAgB;AAE7E,SAAS,UAAU,eAAe;AA4aU,gBAAAC,YAAA;AAla5C,IAAM,2BAA2B;AAwDjC,SAAS,mBAAmB,QAAwB;AAClD,UAAQ,OAAO,YAAY,GAAG;AAAA,IAC5B,KAAK;AAAA,IACL,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AAAA,IACL,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AACH,aAAO;AAAA,IACT;AACE,aAAO;AAAA,EACX;AACF;AAGA,SAAS,aAAa,WAA+C;AACnE,SAAO,CAAC,aAAa,IAAI,KAAK,SAAS,IAAI,oBAAI,KAAK;AACtD;AAWA,SAAS,qBAAqB,SAAiB,cAA+B;AAC5E,MAAI,YAAY,aAAc,QAAO;AACrC,MAAI,YAAY,QAAS,QAAO;AAChC,QAAM,eAAe,QAAQ,MAAM,GAAG;AACtC,QAAM,WAAW,aAAa,MAAM,GAAG;AACvC,MAAI,aAAa,WAAW,SAAS,OAAQ,QAAO;AACpD,WAAS,IAAI,GAAG,IAAI,aAAa,QAAQ,KAAK;AAC5C,QAAI,aAAa,CAAC,MAAM,IAAK;AAC7B,QAAI,aAAa,CAAC,MAAM,SAAS,CAAC,EAAG,QAAO;AAAA,EAC9C;AACA,SAAO;AACT;AAMO,SAAS,aAAa;AAAA,EAC3B;AAAA,EACA,0BAA0B;AAC5B,GAAsB;AACpB,QAAM,WAAW,YAAY;AAG7B,QAAM,CAAC,aAAa,cAAc,IAAIC,UAAkC,MAAS;AACjF,QAAM,CAAC,iBAAiB,kBAAkB,IAAIA,UAAS,IAAI;AAC3D,QAAM,CAAC,oBAAoB,qBAAqB,IAAIA,UAAS,oBAAI,IAAuB,CAAC;AAIzF,iBAAe,cAAc,UAAyC;AACpE,UAAM,WAAW,MAAM,SAAS,KAAK,OAAO,QAAQ;AACpD,QAAI,SAAS,KAAK,MAAM;AACtB,qBAAe,UAAQ,MAAM,OAAO,SAAS,KAAK,MAAM,KAAK,OAAO,SAAS,KAAK,IAAI;AAAA,IACxF;AACA,WAAO;AAAA,EACT;AACA,iBAAe,YAAY,UAAkB,UAAkB;AAC7D,UAAM,aAAa,MAAM,SAAS,KAAK,mBAAmB;AAAA,MACxD,OAAO;AAAA,MACP;AAAA,IACF,CAAC;AACD,QAAI,WAAW,KAAK,MAAM;AACxB,qBAAe,YAAU,QAAQ,OAAO,WAAW,KAAK,MAAM,KAAK,SAAS,WAAW,KAAK,IAAI;AAAA,IAClG;AACA,WAAO;AAAA,EACT;AACA,QAAM,eAAeC,aAAY,YAAY;AAC3C,UAAM,aAAa,MAAM,SAAS,KAAK,QAAQ;AAC/C,QAAI,CAAC,WAAW,OAAO;AACrB,YAAM,KAAK,mBAAmB,OAAO,CAAC,EAAE,QAAQ,QAAM,GAAG,CAAC;AAAA,IAC5D;AACA,WAAO;AAAA,EACT,GAAG,CAAC,SAAS,MAAM,kBAAkB,CAAC;AACtC,WAAS,UAAU,QAAmB;AACpC,UAAM,KAAK,QAAQ;AACnB,0BAAsB,OAAK,IAAI,IAAI,CAAC,EAAE,IAAI,IAAI,MAAM,CAAC;AACrD,WAAO;AAAA,EACT;AACA,WAAS,gBAAgB,MAAc;AACrC,0BAAsB,SAAO;AAC3B,YAAM,MAAM,IAAI,IAAI,GAAG;AACvB,UAAI,OAAO,IAAI;AACf,aAAO;AAAA,IACT,CAAC;AAAA,EACH;AACA,iBAAe,eAAe;AAAA,EAAC;AAI/B,EAAAC,WAAU,MAAM;AACd,UAAM;AAAA,MACJ,MAAM;AAAA,QACJ;AAAA,MACF;AAAA,IACF,IAAI,SAAS,KAAK,kBAAkB,WAAS;AAC3C,UAAI,UAAU,eAAe,UAAU,cAAc;AACnD,2BAAmB,IAAI;AAAA,MACzB;AAAA,IACF,CAAC;AACD,WAAO,MAAM,aAAa,YAAY;AAAA,EACxC,GAAG,CAAC,SAAS,IAAI,CAAC;AAClB,EAAAA,WAAU,MAAM;AACd,QAAI,CAAC,gBAAiB;AACtB,QAAI,YAAY;AAChB,mBAAe,0BAA0B;AACvC,UAAI;AAEF,cAAM,iBAAiB,IAAI,QAAe,CAAC,GAAG,WAAW;AACvD,qBAAW,MAAM;AACf,mBAAO,IAAI,MAAM,iCAAiC,wBAAwB,IAAI,CAAC;AAAA,UACjF,GAAG,wBAAwB;AAAA,QAC7B,CAAC;AACD,cAAM,SAAS,MAAM,QAAQ,KAAK,CAAC,SAAS,KAAK,WAAW,GAAG,cAAc,CAAC;AAC9E,YAAI,UAAW;AACf,cAAM,UAAU,QAAQ,MAAM,SAAS,QAAQ;AAC/C,uBAAe,YAAU;AACvB,cAAI,YAAY,KAAM,QAAO;AAC7B,cAAI,QAAQ,OAAO,SAAS,GAAI,QAAO;AACvC,iBAAO;AAAA,QACT,CAAC;AACD,2BAAmB,KAAK;AAAA,MAC1B,SAAS,OAAO;AACd,YAAI,UAAW;AACf,gBAAQ,MAAM,6CAA6C,KAAK;AAChE,uBAAe,YAAU,WAAW,OAAO,SAAS,IAAI;AACxD,2BAAmB,KAAK;AAAA,MAC1B;AAAA,IACF;AACA,4BAAwB;AACxB,WAAO,MAAM;AACX,kBAAY;AAAA,IACd;AAAA,EACF,GAAG,CAAC,iBAAiB,SAAS,IAAI,CAAC;AAKnC,QAAM,cAAc,SAAS,WAAW;AAGxC,QAAM;AAAA,IACJ,MAAM;AAAA,IACN,WAAW;AAAA,EACb,IAAI,WAAuB,gBAAgB;AAAA,IACzC,OAAO;AAAA,MACL,IAAI,aAAa;AAAA,IACnB;AAAA,IACA,SAAS;AAAA,IACT,UAAU;AAAA,EACZ,CAAC;AACD,QAAM;AAAA,IACJ,MAAM;AAAA,IACN,WAAW;AAAA,EACb,IAAI,WAA0B,mBAAmB;AAAA,IAC/C,OAAO;AAAA,MACL,QAAQ,aAAa;AAAA,IACvB;AAAA,IACA,SAAS;AAAA,IACT,UAAU;AAAA,EACZ,CAAC;AACD,QAAM;AAAA,IACJ,MAAM;AAAA,IACN,WAAW;AAAA,EACb,IAAI,WAAyB,kBAAkB;AAAA,IAC7C,OAAO;AAAA,MACL,QAAQ,aAAa;AAAA,IACvB;AAAA,IACA,SAAS;AAAA,IACT,UAAU;AAAA,EACZ,CAAC;AACD,QAAM;AAAA,IACJ,MAAM;AAAA,IACN,WAAW;AAAA,EACb,IAAI,WAAqB,cAAc;AAAA,IACrC,OAAO;AAAA,MACL,UAAU;AAAA,IACZ;AAAA,IACA,SAAS;AAAA,IACT,UAAU;AAAA,EACZ,CAAC;AAGD,QAAM,WAAWC,SAAQ,MAAM,YAAY,IAAI,QAAM,GAAG,OAAO,KAAK,CAAC,GAAG,CAAC,UAAU,CAAC;AAGpF,QAAM,YAAYA,SAAQ,MAAM,IAAI,IAAI,QAAQ,IAAI,OAAK,CAAC,EAAE,IAAI,CAAC,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC;AACpF,QAAM;AAAA,IACJ,MAAM;AAAA,IACN,WAAW;AAAA,EACb,IAAI,WAA8B,uBAAuB;AAAA,IACvD,OAAO,SAAS,SAAS,IAAI;AAAA,MAC3B,SAAS;AAAA,QACP,IAAI;AAAA,MACN;AAAA,IACF,IAAI;AAAA,IACJ,SAAS,SAAS,SAAS;AAAA,IAC3B,UAAU;AAAA,EACZ,CAAC;AAID,QAAM,UAAU,cAAc,CAAC,KAAK;AAGpC,QAAM,uBAAuBC,QAAkC,MAAS;AAGxE,EAAAF,WAAU,MAAM;AACd,UAAM,gBAAgB,SAAS;AAC/B,UAAM,aAAa,qBAAqB;AAGxC,QAAI,eAAe,aAAa,kBAAkB,cAAc,kBAAkB,cAAc;AAC9F,mBAAa;AAAA,IACf;AACA,yBAAqB,UAAU;AAAA,EACjC,GAAG,CAAC,SAAS,QAAQ,YAAY,CAAC;AAGlC,QAAM,gBAAgBC,SAAQ,MAAM;AAClC,UAAM,OAKD,CAAC;AAGN,kBAAc,QAAQ,OAAK;AACzB,UAAI,aAAa,EAAE,SAAS,GAAG;AAC7B,aAAK,KAAK;AAAA,UACR,WAAW,EAAE;AAAA,UACb,QAAQ,EAAE,UAAU;AAAA,UACpB,QAAQ;AAAA,UACR,WAAW,EAAE;AAAA,QACf,CAAC;AAAA,MACH;AAAA,IACF,CAAC;AAGD,UAAM,iBAAiB,IAAI,IAAI,YAAY,OAAO,UAAQ;AACxD,YAAM,QAAQ,UAAU,IAAI,KAAK,OAAO;AACxC,aAAO,OAAO,aAAa,KAAK,aAAa,KAAK,SAAS;AAAA,IAC7D,CAAC,EAAE,IAAI,UAAQ,KAAK,OAAO,KAAK,CAAC,CAAC;AAClC,iBAAa,QAAQ,QAAM;AACzB,UAAI,eAAe,IAAI,GAAG,OAAO,KAAK,aAAa,GAAG,SAAS,GAAG;AAChE,aAAK,KAAK;AAAA,UACR,WAAW,GAAG;AAAA,UACd,QAAQ,GAAG,UAAU;AAAA,UACrB,QAAQ;AAAA,UACR,WAAW,GAAG;AAAA,QAChB,CAAC;AAAA,MACH;AAAA,IACF,CAAC;AACD,WAAO;AAAA,EACT,GAAG,CAAC,cAAc,YAAY,WAAW,WAAW,CAAC;AAGrD,QAAM,iBAA2BA,SAAQ,MAAM;AAC7C,UAAM,aAAa,oBAAI,IAAY;AACnC,eAAW,QAAQ,eAAe;AAChC,UAAI,KAAK,aAAa,KAAK,WAAW,SAAS;AAC7C,mBAAW,IAAI,KAAK,SAAS;AAAA,MAC/B;AAAA,IACF;AACA,WAAO,MAAM,KAAK,UAAU;AAAA,EAC9B,GAAG,CAAC,aAAa,CAAC;AAGlB,QAAM,uBAA8CA,SAAQ,MAAM;AAChE,UAAM,cAAqC,CAAC;AAC5C,eAAW,UAAU,eAAe;AAClC,UAAI,OAAO,WAAW,QAAS;AAC/B,YAAM,QAAQ,OAAO,UAAU,MAAM,GAAG;AACxC,UAAI,MAAM,WAAW,GAAG;AACtB,cAAM,CAAC,cAAc,YAAY,UAAU,IAAI;AAC/C,oBAAY,KAAK;AAAA,UACf;AAAA,UACA;AAAA,UACA;AAAA,UACA,iBAAiB,mBAAmB,UAAU;AAAA,UAC9C,QAAQ,OAAO;AAAA,UACf,eAAe;AAAA,UACf,WAAW,OAAO,aAAa;AAAA,QACjC,CAAC;AAAA,MACH;AAAA,IACF;AACA,WAAO;AAAA,EACT,GAAG,CAAC,aAAa,CAAC;AAGlB,QAAM,gBAAgB,SAAS;AAC/B,QAAM,aAAa,kBAAkB;AACrC,QAAM,cAAc,kBAAkB;AAItC,QAAM,YAAYF,aAAY,CAAC,QAAgB;AAE7C,QAAI,cAAc,YAAa,QAAO;AACtC,QAAI,CAAC,SAAS,cAAc,EAAG,QAAO;AAGtC,QAAI,eAAe,SAAS,OAAO,EAAG,QAAO;AAG7C,QAAI,eAAe,SAAS,GAAG,EAAG,QAAO;AAGzC,QAAI,CAAC,SAAS,GAAG,EAAG,QAAO;AAG3B,eAAW,WAAW,gBAAgB;AACpC,UAAI,qBAAqB,SAAS,GAAG,EAAG,QAAO;AAAA,IACjD;AAGA,UAAM,UAAU,IAAI,MAAM,GAAG;AAC7B,QAAI,QAAQ,WAAW,GAAG;AACxB,YAAM,CAAC,MAAM,MAAM,QAAQ,IAAI;AAC/B,YAAM,gBAAgB,mBAAmB,QAAQ;AACjD,YAAM,gBAAgB,qBAAqB,KAAK,OAAK,EAAE,iBAAiB,QAAQ,EAAE,eAAe,QAAQ,EAAE,mBAAmB,aAAa;AAC3I,UAAI,cAAe,QAAO;AAAA,IAC5B;AACA,WAAO;AAAA,EACT,GAAG,CAAC,gBAAgB,sBAAsB,YAAY,WAAW,CAAC;AAIlE,QAAM,kBAAkB,uBAAuB,qBAAqB,iBAAiB;AACrF,QAAM,YAAYE,SAAQ,OAAO;AAAA,IAC/B;AAAA,IACA,MAAM;AAAA,IACN;AAAA,IACA,QAAQ;AAAA,IACR;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,WAAW,gBAAgB,OAAO,QAAQ,kBAAkB,mBAAmB,gBAAgB;AAAA,IAC/F;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,IAAI,CAAC,WAAW,aAAa,SAAS,gBAAgB,sBAAsB,eAAe,YAAY,aAAa,gBAAgB,eAAe,CAAC;AAIpJ,QAAM,UAAU,0BAA0B,gBAAAJ,KAAC,sBAAoB,UAAS,IAAwB;AAChG,SAAO,gBAAAA,KAAC,iBAAiB,UAAjB,EAA0B,OAAO,WACpC,mBACH;AACJ;;;AC7bA,SAAS,KAAKM,WAAU;AACxB,SAAoB,iBAAAC,gBAAe,cAAAC,aAAY,aAAAC,YAAW,WAAAC,UAAS,YAAAC,WAAU,eAAAC,cAAa,UAAAC,eAAc;;;ACDxG,SAAS,KAAK,UAAU;AACxB,SAAS,mBAAmB;AAK5B,SAAS,YAAAC,iBAAgB;AACzB,SAAS,QAAAC,aAAY;AAKd,SAAS,YAAY,UAAU,IAAI,OAAO,gBAAgB;AAC/D,QAAM,IAAI,GAAG,EAAE;AACf,MAAI;AACJ,MAAI,EAAE,CAAC,MAAM,IAAI;AACf,SAAK,OAAO,SAAY,CAAC,IAAI,IAAI;AACjC,MAAE,CAAC,IAAI;AACP,MAAE,CAAC,IAAI;AAAA,EACT,OAAO;AACL,SAAK,EAAE,CAAC;AAAA,EACV;AACA,QAAM,cAAc;AACpB,QAAM,YAAY,OAAO,aAAa,WAAW,SAAS,QAAQ;AAClE,QAAM,aAAa,OAAO,aAAa,WAAW,OAAO,SAAS,MAAM,IAAI;AAC5E,QAAM,WAAW,YAAY;AAC7B,MAAI;AACJ,MAAI,EAAE,CAAC,MAAM,aAAa;AACxB,SAAK,YAAY,IAAI,KAAK;AAC1B,MAAE,CAAC,IAAI;AACP,MAAE,CAAC,IAAI;AAAA,EACT,OAAO;AACL,SAAK,EAAE,CAAC;AAAA,EACV;AACA,QAAM,uBAAuB;AAC7B,QAAM,KAAK;AACX,QAAM,KAAK;AACX,MAAI;AACJ,MAAI,EAAE,CAAC,MAAM,MAAM,EAAE,CAAC,MAAM,IAAI;AAC9B,SAAK;AAAA,MACH,aAAa;AAAA,MACb,OAAO;AAAA,MACP,QAAQ;AAAA,IACV;AACA,MAAE,CAAC,IAAI;AACP,MAAE,CAAC,IAAI;AACP,MAAE,CAAC,IAAI;AAAA,EACT,OAAO;AACL,SAAK,EAAE,CAAC;AAAA,EACV;AACA,QAAM,aAAa,cAAc,EAAE;AACnC,QAAM,kBAAkB,yBAAyB,SAAS;AAC1D,MAAI;AACJ,MAAI,EAAE,CAAC,MAAM,eAAe,EAAE,CAAC,MAAM,wBAAwB,EAAE,CAAC,MAAM,mBAAmB,EAAE,EAAE,MAAM,SAAS,EAAE,EAAE,MAAM,cAAc,EAAE,EAAE,MAAM,YAAY,EAAE,EAAE,MAAM,aAAa,EAAE,EAAE,MAAM,YAAY;AACrM,SAAK;AAAA,MACH,YAAY,OAAM,SAAQ;AACxB,YAAI,SAAS;AACb,cAAM,cAAc,qBAAqB;AAAA,UACvC;AAAA,UACA;AAAA,QACF,CAAC;AACD,cAAM,SAAS,eAAeC,UAAS;AACrC,gBAAM,eAAe,YAAY,OAAO,OAAKC,UAAU,KAAa,CAAC,CAAC,MAAM,KAAK;AACjF,gBAAM,wBAAwB,aAAa,IAAI,MAAM;AACrD,gBAAM,WAAW,MAAO,SAAiB,OAAO,UAA+B,EAAE,KAAK,SAAS,EAAE,OAAOC,MAAK,MAAa,qBAA4B,CAAQ,EAAE,OAAO,KAAK,EAAE,OAAO;AACrL,cAAI,SAAS,OAAO;AAClB,kBAAM,SAAS;AAAA,UACjB;AACA,mBAAS,SAAS;AAClB,cAAI,QAAQ;AACV,uBAAW,MAAa;AAAA,UAC1B;AAAA,QACF;AACA,cAAM,eAAe,YAAY,MAAM,SAAO,OAAO,QAAQD,UAAU,KAAa,GAAG,CAAC,CAAC;AACzF,YAAI,cAAc;AAChB,gBAAM,UAAW,SAAiB,OAAO,UAA+B,EAAE,KAAK,SAAS,EAAE,OAAOC,MAAK,MAAa,oBAA2B,CAAQ;AACtJ,sBAAY,QAAQ,SAAO;AACzB,oBAAQ,GAAG,OAAO,GAAG,GAAI,KAAa,GAAG,CAAC;AAAA,UAC5C,CAAC;AACD,gBAAM,gBAAgB,MAAM,QAAQ,OAAO,aAAa,WAAW,EAAE,OAAO;AAC5E,kBAAQ,IAAI,iBAAiB,eAAe,SAAS;AACrD,cAAI,cAAc,WAAW,KAAK;AAChC,kBAAM,OAAO;AAAA,UACf,OAAO;AACL,gBAAI,cAAc,OAAO;AACvB,oBAAM,cAAc;AAAA,YACtB;AACA,gBAAI,cAAc,MAAM;AACtB,uBAAS,cAAc;AACvB,kBAAI,QAAQ;AACV,2BAAW,MAAa;AAAA,cAC1B;AAAA,YACF;AAAA,UACF;AAAA,QACF,OAAO;AACL,gBAAM,OAAO;AAAA,QACf;AACA,eAAO;AAAA,MACT;AAAA,IACF;AACA,MAAE,CAAC,IAAI;AACP,MAAE,CAAC,IAAI;AACP,MAAE,CAAC,IAAI;AACP,MAAE,EAAE,IAAI;AACR,MAAE,EAAE,IAAI;AACR,MAAE,EAAE,IAAI;AACR,MAAE,EAAE,IAAI;AACR,MAAE,EAAE,IAAI;AACR,MAAE,EAAE,IAAI;AAAA,EACV,OAAO;AACL,SAAK,EAAE,EAAE;AAAA,EACX;AACA,QAAM,WAAW,YAAY,EAAE;AAC/B,SAAO;AACT;AACA,SAAS,OAAO,KAAK;AACnB,SAAO,OAAO,GAAG;AACnB;AACA,SAAS,MAAM,GAAG;AAChB,SAAO,OAAO,CAAC;AACjB;;;ADnHA,SAAS,YAAAC,iBAAgB;AAoJhB,gBAAAC,YAAA;AAhJT,IAAM,oBAAoB;AAAA,EACxB,QAAQ;AAAA,EACR,OAAO;AAAA,EACP,cAAc;AAChB;AAmBO,IAAM,sBAAsBC,eAA8C,IAAI;AAG9E,SAAS,qBAAqB;AAAA,EACnC;AACF,GAEG;AACD,QAAM,WAAW,YAAY;AAC7B,QAAM,CAAC,UAAU,gBAAgB,IAAIC,UAAiC,CAAC,CAAC;AACxE,QAAM,CAAC,WAAW,YAAY,IAAIA,UAAS,IAAI;AAC/C,QAAM,CAAC,OAAO,QAAQ,IAAIA,UAAuB,IAAI;AAGrD,QAAM,YAAYC,YAAW,gBAAgB;AAC7C,QAAM,SAAS,WAAW,MAAM;AAGhC,QAAM,gBAAgBC,YAAS,SAAS,OAAO,MAAM,EAAE,KAAK,cAAc,EAAE,OAAO,kBAAkB,YAAY,EAAE,GAAG,UAAU,MAAO,EAAE,MAAM,KAAK,GAAG;AAAA,IACrJ,SAASC,UAAS,MAAM;AAAA,IACxB,mBAAmB;AAAA,EACrB,CAAC;AAGD,QAAM,iBAAiB;AAAA,IAAU;AAAA,MAC/B,OAAO;AAAA,MACP,QAAQ;AAAA,IACV;AAAA,IAAG,CAAC,UAAU,KAAK;AAAA;AAAA,EACnB;AAGA,QAAM,oBAAoBC,QAAO,cAAc;AAC/C,oBAAkB,UAAU;AAG5B,EAAAC,WAAU,MAAM;AACd,QAAI,cAAc,QAAQ,MAAM,QAAQ,cAAc,IAAI,GAAG;AAC3D,YAAM,cAAsC,CAAC;AAC7C,oBAAc,KAAK,QAAQ,CAAC,SAAc;AACxC,oBAAY,KAAK,GAAG,IAAI,KAAK;AAAA,MAC/B,CAAC;AACD,uBAAiB,WAAW;AAC5B,mBAAa,KAAK;AAClB,eAAS,IAAI;AAAA,IACf,WAAW,cAAc,OAAO;AAC9B,eAAS,cAAc,KAAK;AAC5B,mBAAa,KAAK;AAAA,IACpB,WAAW,cAAc,WAAW;AAClC,mBAAa,IAAI;AAAA,IACnB,WAAW,cAAc,QAAQ,CAAC,MAAM,QAAQ,cAAc,IAAI,GAAG;AAEnE,uBAAiB,CAAC,CAAC;AACnB,mBAAa,KAAK;AAAA,IACpB;AAAA,EACF,GAAG,CAAC,cAAc,MAAM,cAAc,OAAO,cAAc,SAAS,CAAC;AAGrE,QAAM,cAAcC,aAAY,OAAO,KAAa,UAAkB;AACpE,QAAI,CAAC,QAAQ;AACX,YAAM,IAAI,MAAM,wBAAwB;AAAA,IAC1C;AACA,QAAI;AACF,YAAM,kBAAkB,QAAQ,YAAY;AAAA,QAC1C;AAAA,QACA;AAAA,QACA;AAAA,MACF,CAAC;AAGD,uBAAiB,WAAS;AAAA,QACxB,GAAG;AAAA,QACH,CAAC,GAAG,GAAG;AAAA,MACT,EAAE;AAAA,IACJ,SAAS,KAAK;AACZ,eAAS,GAAY;AACrB,YAAM;AAAA,IACR;AAAA,EACF,GAAG,CAAC,MAAM,CAAC;AAGX,QAAM,cAAcA,aAAY,CAAC,UAAsC;AACrE,WAAO,SAAS,KAAK;AAAA,EACvB,GAAG,CAAC,QAAQ,CAAC;AAGb,QAAM,iBAAiBA,aAAY,OAAO,UAAkB;AAC1D,QAAI,CAAC,QAAQ;AACX,YAAM,IAAI,MAAM,wBAAwB;AAAA,IAC1C;AACA,QAAI;AACF,YAAM,SAAS,OAAO,MAAM,EAAE,KAAK,cAAc,EAAE,OAAO,EAAE,GAAG,UAAU,MAAM,EAAE,GAAG,OAAO,KAAK;AAGhG,uBAAiB,YAAU;AACzB,cAAM,WAAW;AAAA,UACf,GAAG;AAAA,QACL;AACA,eAAO,SAAS,KAAK;AACrB,eAAO;AAAA,MACT,CAAC;AAAA,IACH,SAAS,OAAO;AACd,eAAS,KAAc;AACvB,YAAM;AAAA,IACR;AAAA,EACF,GAAG,CAAC,QAAQ,QAAQ,CAAC;AAGrB,QAAM,kBAAkBA,aAAY,YAAY;AAC9C,UAAM,cAAc,QAAQ;AAAA,EAC9B,GAAG,CAAC,aAAa,CAAC;AAGlB,QAAM,eAAeC,SAAQ,OAAO;AAAA,IAClC;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,IAAI,CAAC,UAAU,WAAW,OAAO,aAAa,aAAa,gBAAgB,eAAe,CAAC;AAC3F,SAAO,gBAAAT,KAAC,oBAAoB,UAApB,EAA6B,OAAO,cACvC,UACH;AACJ;AAGO,SAAS,kBAAkB;AAChC,QAAM,UAAUG,YAAW,mBAAmB;AAC9C,MAAI,CAAC,SAAS;AACZ,UAAM,IAAI,MAAM,4DAA4D;AAAA,EAC9E;AACA,SAAO;AACT;AAGO,SAAS,qBAAqB,KAAK;AACxC,QAAM,IAAIO,IAAG,CAAC;AACd,QAAM;AAAA,IACJ;AAAA,EACF,IAAI,gBAAgB;AACpB,MAAI;AACJ,MAAI,EAAE,CAAC,MAAM,eAAe,EAAE,CAAC,MAAM,KAAK;AACxC,SAAK,YAAY,GAAG;AACpB,MAAE,CAAC,IAAI;AACP,MAAE,CAAC,IAAI;AACP,MAAE,CAAC,IAAI;AAAA,EACT,OAAO;AACL,SAAK,EAAE,CAAC;AAAA,EACV;AACA,SAAO;AACT;AAGO,SAAS,qBAAqB;AACnC,QAAM,IAAIA,IAAG,CAAC;AACd,QAAM;AAAA,IACJ;AAAA,IACA;AAAA,EACF,IAAI,gBAAgB;AACpB,MAAI;AACJ,MAAI,EAAE,CAAC,MAAM,kBAAkB,EAAE,CAAC,MAAM,aAAa;AACnD,SAAK;AAAA,MACH;AAAA,MACA;AAAA,IACF;AACA,MAAE,CAAC,IAAI;AACP,MAAE,CAAC,IAAI;AACP,MAAE,CAAC,IAAI;AAAA,EACT,OAAO;AACL,SAAK,EAAE,CAAC;AAAA,EACV;AACA,SAAO;AACT;AAGO,SAAS,qBAAqB,KAAK,cAAc,SAAS;AAC/D,QAAM,IAAIA,IAAG,EAAE;AACf,QAAM;AAAA,IACJ;AAAA,IACA;AAAA,IACA;AAAA,EACF,IAAI,gBAAgB;AACpB,QAAM,YAAY,SAAS,aAAaC;AACxC,QAAM,cAAc,SAAS,eAAeC;AAC5C,MAAI;AACJ,OAAK;AACH,UAAM,WAAW,SAAS,GAAG;AAC7B,QAAI,CAAC,UAAU;AACb,WAAK;AACL,YAAM;AAAA,IACR;AACA;AACA,QAAI;AACF,UAAIC;AACJ,UAAI,EAAE,CAAC,MAAM,eAAe,EAAE,CAAC,MAAM,UAAU;AAC7C,QAAAA,MAAK,YAAY,QAAQ;AACzB,UAAE,CAAC,IAAI;AACP,UAAE,CAAC,IAAI;AACP,UAAE,CAAC,IAAIA;AAAA,MACT,OAAO;AACL,QAAAA,MAAK,EAAE,CAAC;AAAA,MACV;AACA,WAAKA;AAAA,IACP,SAASC,KAAI;AACX,YAAM,QAAQA;AACd,cAAQ,KAAK,2CAA2C,GAAG,MAAM,KAAK;AACtE,WAAK;AAAA,IACP;AAAA,EACF;AACA,QAAM,eAAe;AACrB,MAAI;AACJ,MAAI,EAAE,CAAC,MAAM,OAAO,EAAE,CAAC,MAAM,aAAa,EAAE,CAAC,MAAM,aAAa;AAC9D,SAAK,OAAM,YAAW;AACpB,YAAM,kBAAkB,UAAU,OAAO;AACzC,YAAM,YAAY,KAAK,eAAe;AAAA,IACxC;AACA,MAAE,CAAC,IAAI;AACP,MAAE,CAAC,IAAI;AACP,MAAE,CAAC,IAAI;AACP,MAAE,CAAC,IAAI;AAAA,EACT,OAAO;AACL,SAAK,EAAE,CAAC;AAAA,EACV;AACA,QAAM,WAAW;AACjB,MAAI;AACJ,MAAI,EAAE,CAAC,MAAM,gBAAgB,EAAE,CAAC,MAAM,aAAa,EAAE,CAAC,MAAM,UAAU;AACpE,SAAK,CAAC,cAAc,UAAU,SAAS;AACvC,MAAE,CAAC,IAAI;AACP,MAAE,CAAC,IAAI;AACP,MAAE,CAAC,IAAI;AACP,MAAE,EAAE,IAAI;AAAA,EACV,OAAO;AACL,SAAK,EAAE,EAAE;AAAA,EACX;AACA,SAAO;AACT;AACA,SAASF,QAAO,SAAS;AACvB,SAAO,KAAK,MAAM,OAAO;AAC3B;AACA,SAASD,OAAM,OAAO;AACpB,SAAO,KAAK,UAAU,KAAK;AAC7B;","names":["useDbQuery","createContext","useMemo","useRef","createContext","useRef","useMemo","useCallback","useEffect","useMemo","useRef","useState","jsx","useState","useCallback","useEffect","useMemo","useRef","_c","createContext","useContext","useEffect","useMemo","useState","useCallback","useRef","isUsable","omit","insert","isUsable","omit","isUsable","jsx","createContext","useState","useContext","useDbQuery","isUsable","useRef","useEffect","useCallback","useMemo","_c","_temp","_temp2","t2","t1"]}
|