@agent-native/core 0.14.1 → 0.14.2
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/agent/run-manager.d.ts.map +1 -1
- package/dist/agent/run-manager.js +11 -5
- package/dist/agent/run-manager.js.map +1 -1
- package/dist/agent/run-store.d.ts +18 -0
- package/dist/agent/run-store.d.ts.map +1 -1
- package/dist/agent/run-store.js +66 -8
- package/dist/agent/run-store.js.map +1 -1
- package/dist/client/AgentPanel.d.ts.map +1 -1
- package/dist/client/AgentPanel.js +10 -0
- package/dist/client/AgentPanel.js.map +1 -1
- package/dist/client/MultiTabAssistantChat.d.ts.map +1 -1
- package/dist/client/MultiTabAssistantChat.js +19 -10
- package/dist/client/MultiTabAssistantChat.js.map +1 -1
- package/dist/client/composer/PromptComposer.d.ts.map +1 -1
- package/dist/client/composer/PromptComposer.js +28 -3
- package/dist/client/composer/PromptComposer.js.map +1 -1
- package/dist/client/use-chat-threads.d.ts.map +1 -1
- package/dist/client/use-chat-threads.js +114 -72
- package/dist/client/use-chat-threads.js.map +1 -1
- package/dist/server/auth.d.ts.map +1 -1
- package/dist/server/auth.js +12 -1
- package/dist/server/auth.js.map +1 -1
- package/dist/server/google-auth-plugin.d.ts.map +1 -1
- package/dist/server/google-auth-plugin.js +40 -1
- package/dist/server/google-auth-plugin.js.map +1 -1
- package/dist/server/google-oauth.d.ts.map +1 -1
- package/dist/server/google-oauth.js +8 -7
- package/dist/server/google-oauth.js.map +1 -1
- package/dist/server/oauth-return-url.d.ts +6 -0
- package/dist/server/oauth-return-url.d.ts.map +1 -0
- package/dist/server/oauth-return-url.js +78 -0
- package/dist/server/oauth-return-url.js.map +1 -0
- package/dist/server/onboarding-html.d.ts.map +1 -1
- package/dist/server/onboarding-html.js +40 -1
- package/dist/server/onboarding-html.js.map +1 -1
- package/package.json +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"MultiTabAssistantChat.d.ts","sourceRoot":"","sources":["../../src/client/MultiTabAssistantChat.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAmD,MAAM,OAAO,CAAC;AAExE,OAAO,EAEL,KAAK,kBAAkB,EAExB,MAAM,oBAAoB,CAAC;
|
|
1
|
+
{"version":3,"file":"MultiTabAssistantChat.d.ts","sourceRoot":"","sources":["../../src/client/MultiTabAssistantChat.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAmD,MAAM,OAAO,CAAC;AAExE,OAAO,EAEL,KAAK,kBAAkB,EAExB,MAAM,oBAAoB,CAAC;AAqW5B,UAAU,OAAO;IACf,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,GAAG,SAAS,GAAG,WAAW,CAAC;IACzC,uDAAuD;IACvD,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,qEAAqE;IACrE,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,WAAW,gCAAgC;IAC/C,IAAI,EAAE,OAAO,EAAE,CAAC;IAChB,WAAW,EAAE,MAAM,CAAC;IACpB,qBAAqB,EAAE,MAAM,CAAC;IAC9B,cAAc,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IACxC,MAAM,EAAE,MAAM,IAAI,CAAC;IACnB,QAAQ,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IAClC,cAAc,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IACxC,YAAY,EAAE,MAAM,IAAI,CAAC;IACzB,cAAc,EAAE,MAAM,IAAI,CAAC;IAC3B,+BAA+B;IAC/B,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,aAAa,CAAC,EAAE,MAAM,IAAI,CAAC;IAC3B,6EAA6E;IAC7E,QAAQ,EAAE,MAAM,CAAC;CAClB;AAID,MAAM,MAAM,0BAA0B,GAAG,IAAI,CAC3C,kBAAkB,EAClB,OAAO,GAAG,UAAU,CACrB,GAAG;IACF,sCAAsC;IACtC,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,iDAAiD;IACjD,YAAY,CAAC,EAAE,CAAC,KAAK,EAAE,gCAAgC,KAAK,KAAK,CAAC,SAAS,CAAC;IAC5E,2DAA2D;IAC3D,aAAa,CAAC,EAAE,CAAC,KAAK,EAAE,gCAAgC,KAAK,KAAK,CAAC,SAAS,CAAC;IAC7E,sGAAsG;IACtG,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,yFAAyF;IACzF,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB,CAAC;AAEF,wBAAgB,qBAAqB,CAAC,EACpC,UAAiB,EACjB,YAAY,EACZ,aAAa,EACb,aAAqB,EACrB,MAAqD,EACrD,UAAU,EACV,GAAG,KAAK,EACT,EAAE,0BAA0B,2CAqrC5B"}
|
|
@@ -79,7 +79,7 @@ function ChatSkeleton({ header, headerOnly = false, }) {
|
|
|
79
79
|
return (_jsxs("div", { className: cn("flex flex-col min-h-0", headerOnly ? "shrink-0" : "flex-1 h-full"), children: [header ?? (_jsxs("div", { className: "flex items-center px-1 py-1 border-b border-border shrink-0 gap-0.5", children: [_jsx("div", { className: "h-[22px] w-20 rounded-md bg-muted animate-pulse" }), _jsxs("div", { className: "ml-auto flex gap-0.5", children: [_jsx("div", { className: "h-[22px] w-[22px] rounded-md bg-muted animate-pulse" }), _jsx("div", { className: "h-[22px] w-[22px] rounded-md bg-muted animate-pulse" })] })] })), !headerOnly && (_jsxs("div", { className: "flex-1 flex flex-col gap-3 p-4", children: [_jsx("div", { className: "flex justify-center py-8", children: _jsx("div", { className: "h-10 w-10 rounded-full bg-muted animate-pulse" }) }), _jsx("div", { className: "h-3 w-32 rounded bg-muted animate-pulse mx-auto" })] }))] }));
|
|
80
80
|
}
|
|
81
81
|
// ─── History Popover ─────────────────────────────────────────────────────────
|
|
82
|
-
function HistoryPopover({ threads, openTabIds, onSelect, onClose, onSearch, }) {
|
|
82
|
+
function HistoryPopover({ threads, openTabIds, activeThreadId, onSelect, onClose, onSearch, }) {
|
|
83
83
|
const [search, setSearch] = useState("");
|
|
84
84
|
const [searchResults, setSearchResults] = useState(null);
|
|
85
85
|
const [isSearching, setIsSearching] = useState(false);
|
|
@@ -128,9 +128,13 @@ function HistoryPopover({ threads, openTabIds, onSelect, onClose, onSearch, }) {
|
|
|
128
128
|
clearTimeout(debounceRef.current);
|
|
129
129
|
};
|
|
130
130
|
}, [search, onSearch]);
|
|
131
|
-
|
|
131
|
+
// Hide empty threads from the history list — except the currently-active
|
|
132
|
+
// one. The active thread always belongs in the list so the user can see
|
|
133
|
+
// they're in it (the previous filter dropped a brand-new chat the user
|
|
134
|
+
// had just opened, making them think their chat had vanished).
|
|
135
|
+
const visibleThreads = threads.filter((t) => t.messageCount > 0 || t.id === activeThreadId);
|
|
132
136
|
const filtered = search.trim()
|
|
133
|
-
? (searchResults ?? visibleThreads).filter((t) => t.messageCount > 0)
|
|
137
|
+
? (searchResults ?? visibleThreads).filter((t) => t.messageCount > 0 || t.id === activeThreadId)
|
|
134
138
|
: visibleThreads;
|
|
135
139
|
const formatTime = (ts) => {
|
|
136
140
|
const d = new Date(ts);
|
|
@@ -145,12 +149,17 @@ function HistoryPopover({ threads, openTabIds, onSelect, onClose, onSearch, }) {
|
|
|
145
149
|
return d.toLocaleDateString([], { weekday: "short" });
|
|
146
150
|
return d.toLocaleDateString([], { month: "short", day: "numeric" });
|
|
147
151
|
};
|
|
148
|
-
return (_jsxs(_Fragment, { children: [_jsx("div", { className: "fixed inset-0 z-40", onClick: onClose }), _jsxs("div", { className: "absolute right-2 top-0 z-50 w-72 rounded-lg border border-border bg-popover shadow-lg", children: [_jsxs("div", { className: "flex items-center gap-2 px-3 py-2 border-b border-border", children: [_jsx(IconSearch, { size: 13 }), _jsx("input", { ref: inputRef, type: "text", value: search, onChange: (e) => setSearch(e.target.value), placeholder: "Search chats...", className: "flex-1 bg-transparent text-xs text-foreground placeholder:text-muted-foreground outline-none" })] }), _jsx("div", { className: "max-h-64 overflow-y-auto py-1", children: isSearching ? (_jsx("div", { className: "px-3 py-4 text-xs text-muted-foreground text-center", children: "Searching..." })) : filtered.length === 0 ? (_jsx("div", { className: "px-3 py-4 text-xs text-muted-foreground text-center", children: search ? "No matching chats" : "No chats yet" })) : (filtered.map((thread) =>
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
152
|
+
return (_jsxs(_Fragment, { children: [_jsx("div", { className: "fixed inset-0 z-40", onClick: onClose }), _jsxs("div", { className: "absolute right-2 top-0 z-50 w-72 rounded-lg border border-border bg-popover shadow-lg", children: [_jsxs("div", { className: "flex items-center gap-2 px-3 py-2 border-b border-border", children: [_jsx(IconSearch, { size: 13 }), _jsx("input", { ref: inputRef, type: "text", value: search, onChange: (e) => setSearch(e.target.value), placeholder: "Search chats...", className: "flex-1 bg-transparent text-xs text-foreground placeholder:text-muted-foreground outline-none" })] }), _jsx("div", { className: "max-h-64 overflow-y-auto py-1", children: isSearching ? (_jsx("div", { className: "px-3 py-4 text-xs text-muted-foreground text-center", children: "Searching..." })) : filtered.length === 0 ? (_jsx("div", { className: "px-3 py-4 text-xs text-muted-foreground text-center", children: search ? "No matching chats" : "No chats yet" })) : (filtered.map((thread) => {
|
|
153
|
+
const isActive = thread.id === activeThreadId;
|
|
154
|
+
return (_jsxs("button", { onClick: () => {
|
|
155
|
+
onSelect(thread.id);
|
|
156
|
+
onClose();
|
|
157
|
+
}, className: cn("w-full px-3 py-2 text-left hover:bg-accent/50", isActive && "bg-accent/30"), children: [_jsxs("div", { className: "flex items-baseline justify-between gap-2", children: [_jsx("span", { className: "text-xs font-medium text-foreground truncate", children: thread.title || thread.preview || "Chat" }), _jsx("span", { className: "text-[10px] text-muted-foreground shrink-0", children: isActive
|
|
158
|
+
? "Active"
|
|
159
|
+
: openTabIds.has(thread.id)
|
|
160
|
+
? "Open"
|
|
161
|
+
: formatTime(thread.updatedAt) })] }), thread.preview && thread.title !== thread.preview && (_jsx("div", { className: "text-[11px] text-muted-foreground truncate mt-0.5", children: thread.preview }))] }, thread.id));
|
|
162
|
+
})) })] })] }));
|
|
154
163
|
}
|
|
155
164
|
// ─── Help Popover ────────────────────────────────────────────────────────────
|
|
156
165
|
function HelpPopover({ onClose }) {
|
|
@@ -1021,7 +1030,7 @@ export function MultiTabAssistantChat({ showTabBar = true, renderHeader, renderO
|
|
|
1021
1030
|
background: "linear-gradient(to right, transparent, hsl(var(--accent)) 40%)",
|
|
1022
1031
|
}, children: _jsx(IconX, { size: 12 }) })] }, tab.id)))] }) }))] }));
|
|
1023
1032
|
})()
|
|
1024
|
-
: null, _jsxs("div", { className: "relative flex-1 flex flex-col min-h-0", children: [renderOverlay ? renderOverlay(headerProps) : null, showHistory && (_jsx(HistoryPopover, { threads: threads, openTabIds: new Set(openTabIds), onSelect: openFromHistory, onClose: () => setShowHistory(false), onSearch: searchThreads })), helpVisible && _jsx(HelpPopover, { onClose: () => setHelpVisible(false) }), [...new Set(openTabIds)]
|
|
1033
|
+
: null, _jsxs("div", { className: "relative flex-1 flex flex-col min-h-0", children: [renderOverlay ? renderOverlay(headerProps) : null, showHistory && (_jsx(HistoryPopover, { threads: threads, openTabIds: new Set(openTabIds), activeThreadId: activeThreadId, onSelect: openFromHistory, onClose: () => setShowHistory(false), onSearch: searchThreads })), helpVisible && _jsx(HelpPopover, { onClose: () => setHelpVisible(false) }), [...new Set(openTabIds)]
|
|
1025
1034
|
.filter((tabId) => tabId === activeThreadId || mountedTabsRef.current.has(tabId))
|
|
1026
1035
|
.map((tabId) => {
|
|
1027
1036
|
const modelSelection = resolveThreadModelSelection(tabId);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"MultiTabAssistantChat.js","sourceRoot":"","sources":["../../src/client/MultiTabAssistantChat.tsx"],"names":[],"mappings":";AAAA,OAAc,EAAE,QAAQ,EAAE,MAAM,EAAE,SAAS,EAAE,WAAW,EAAE,MAAM,OAAO,CAAC;AACxE,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAC/E,OAAO,EACL,aAAa,GAGd,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EAAE,qBAAqB,EAAE,MAAM,YAAY,CAAC;AACnD,OAAO,EAAE,EAAE,EAAE,MAAM,YAAY,CAAC;AAChC,OAAO,EACL,OAAO,EACP,cAAc,EACd,eAAe,EACf,cAAc,GACf,MAAM,4BAA4B,CAAC;AACpC,OAAO,EAAE,cAAc,EAA0B,MAAM,uBAAuB,CAAC;AAC/E,OAAO,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAChD,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AACrD,OAAO,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAC;AAC1D,OAAO,EACL,iCAAiC,EACjC,iBAAiB,GAElB,MAAM,+BAA+B,CAAC;AAevC,MAAM,2BAA2B,GAAG,oCAAoC,CAAC;AAEzE,SAAS,wBAAwB,CAAC,GAAW;IAC3C,IAAI,OAAO,MAAM,KAAK,WAAW;QAAE,OAAO,SAAS,CAAC;IACpD,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,MAAM,CAAC,YAAY,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;QAC7C,IAAI,CAAC,GAAG;YAAE,OAAO,SAAS,CAAC;QAC3B,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAA4B,CAAC;QAC1D,IAAI,OAAO,MAAM,CAAC,KAAK,KAAK,QAAQ,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,EAAE,EAAE,CAAC;YAC7D,OAAO,SAAS,CAAC;QACnB,CAAC;QACD,MAAM,SAAS,GAAmB;YAChC,KAAK,EAAE,MAAM,CAAC,KAAK;YACnB,MAAM,EAAE,iBAAiB,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM;SAClE,CAAC;QACF,IAAI,OAAO,MAAM,CAAC,MAAM,KAAK,QAAQ;YAAE,SAAS,CAAC,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC;QACxE,OAAO,SAAS,CAAC;IACnB,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,SAAS,CAAC;IACnB,CAAC;AACH,CAAC;AAED,SAAS,yBAAyB,CAAC,GAAW,EAAE,SAAyB;IACvE,IAAI,OAAO,MAAM,KAAK,WAAW;QAAE,OAAO;IAC1C,IAAI,CAAC;QACH,MAAM,CAAC,YAAY,CAAC,OAAO,CAAC,GAAG,EAAE,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC,CAAC;IAC9D,CAAC;IAAC,MAAM,CAAC,CAAA,CAAC;AACZ,CAAC;AAED,SAAS,qBAAqB,CAC5B,SAAqC,EACrC,MAA0B;IAE1B,IAAI,CAAC,SAAS,EAAE,KAAK;QAAE,OAAO,SAAS,CAAC;IACxC,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACxB,MAAM,eAAe,GAAG,SAAS,CAAC,MAAM,IAAI,MAAM,CAAC;QACnD,MAAM,aAAa,GAAG,iCAAiC,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;QACzE,OAAO;YACL,KAAK,EAAE,SAAS,CAAC,KAAK;YACtB,MAAM,EACJ,eAAe,KAAK,MAAM,IAAI,aAAa,CAAC,QAAQ,CAAC,eAAe,CAAC;gBACnE,CAAC,CAAC,eAAe;gBACjB,CAAC,CAAC,MAAM;SACb,CAAC;IACJ,CAAC;IACD,MAAM,cAAc,GAAG,MAAM,CAAC,IAAI,CAChC,CAAC,KAAK,EAAE,EAAE,CACR,KAAK,CAAC,MAAM,KAAK,SAAS,CAAC,MAAM;QACjC,KAAK,CAAC,MAAM,CAAC,QAAQ,CAAC,SAAS,CAAC,KAAK,CAAC,CACzC,CAAC;IACF,MAAM,aAAa,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CAC1C,KAAK,CAAC,MAAM,CAAC,QAAQ,CAAC,SAAS,CAAC,KAAK,CAAC,CACvC,CAAC;IACF,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC,IAAI,CAAC,cAAc,IAAI,CAAC,aAAa,EAAE,CAAC;QAC3D,OAAO,SAAS,CAAC;IACnB,CAAC;IACD,MAAM,MAAM,GACV,cAAc,EAAE,MAAM,IAAI,aAAa,EAAE,MAAM,IAAI,SAAS,CAAC,MAAM,CAAC;IACtE,IAAI,CAAC,MAAM,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC;QAAE,OAAO,SAAS,CAAC;IAEnD,MAAM,eAAe,GAAG,SAAS,CAAC,MAAM,IAAI,MAAM,CAAC;IACnD,MAAM,aAAa,GAAG,iCAAiC,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;IACzE,MAAM,MAAM,GACV,eAAe,KAAK,MAAM,IAAI,aAAa,CAAC,QAAQ,CAAC,eAAe,CAAC;QACnE,CAAC,CAAC,eAAe;QACjB,CAAC,CAAC,MAAM,CAAC;IACb,MAAM,QAAQ,GAAmB,EAAE,KAAK,EAAE,SAAS,CAAC,KAAK,EAAE,MAAM,EAAE,CAAC;IACpE,IAAI,MAAM;QAAE,QAAQ,CAAC,MAAM,GAAG,MAAM,CAAC;IACrC,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED,gFAAgF;AAEhF,SAAS,YAAY,CAAC,EACpB,MAAM,EACN,UAAU,GAAG,KAAK,GAInB;IACC,OAAO,CACL,eACE,SAAS,EAAE,EAAE,CACX,uBAAuB,EACvB,UAAU,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,eAAe,CAC1C,aAEA,MAAM,IAAI,CACT,eAAK,SAAS,EAAC,qEAAqE,aAClF,cAAK,SAAS,EAAC,iDAAiD,GAAG,EACnE,eAAK,SAAS,EAAC,sBAAsB,aACnC,cAAK,SAAS,EAAC,qDAAqD,GAAG,EACvE,cAAK,SAAS,EAAC,qDAAqD,GAAG,IACnE,IACF,CACP,EACA,CAAC,UAAU,IAAI,CACd,eAAK,SAAS,EAAC,gCAAgC,aAC7C,cAAK,SAAS,EAAC,0BAA0B,YACvC,cAAK,SAAS,EAAC,+CAA+C,GAAG,GAC7D,EACN,cAAK,SAAS,EAAC,iDAAiD,GAAG,IAC/D,CACP,IACG,CACP,CAAC;AACJ,CAAC;AAED,gFAAgF;AAEhF,SAAS,cAAc,CAAC,EACtB,OAAO,EACP,UAAU,EACV,QAAQ,EACR,OAAO,EACP,QAAQ,GAOT;IACC,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,GAAG,QAAQ,CAAC,EAAE,CAAC,CAAC;IACzC,MAAM,CAAC,aAAa,EAAE,gBAAgB,CAAC,GAAG,QAAQ,CAEhD,IAAI,CAAC,CAAC;IACR,MAAM,CAAC,WAAW,EAAE,cAAc,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;IACtD,MAAM,QAAQ,GAAG,MAAM,CAAmB,IAAI,CAAC,CAAC;IAChD,MAAM,WAAW,GAAG,MAAM,CAAgC,SAAS,CAAC,CAAC;IAErE,SAAS,CAAC,GAAG,EAAE;QACb,QAAQ,CAAC,OAAO,EAAE,KAAK,EAAE,CAAC;IAC5B,CAAC,EAAE,EAAE,CAAC,CAAC;IAEP,SAAS,CAAC,GAAG,EAAE;QACb,MAAM,OAAO,GAAG,CAAC,CAAgB,EAAE,EAAE;YACnC,IAAI,CAAC,CAAC,GAAG,KAAK,QAAQ;gBAAE,OAAO,EAAE,CAAC;QACpC,CAAC,CAAC;QACF,MAAM,CAAC,gBAAgB,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;QAC5C,OAAO,GAAG,EAAE,CAAC,MAAM,CAAC,mBAAmB,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;IAC9D,CAAC,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC;IAEd,+BAA+B;IAC/B,MAAM,WAAW,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC;IAC9B,SAAS,CAAC,GAAG,EAAE;QACb,IAAI,WAAW,CAAC,OAAO;YAAE,YAAY,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC;QAC3D,MAAM,CAAC,GAAG,MAAM,CAAC,IAAI,EAAE,CAAC;QACxB,IAAI,CAAC,CAAC,EAAE,CAAC;YACP,WAAW,CAAC,OAAO,EAAE,CAAC;YACtB,gBAAgB,CAAC,IAAI,CAAC,CAAC;YACvB,cAAc,CAAC,KAAK,CAAC,CAAC;YACtB,OAAO;QACT,CAAC;QACD,cAAc,CAAC,IAAI,CAAC,CAAC;QACrB,MAAM,EAAE,GAAG,EAAE,WAAW,CAAC,OAAO,CAAC;QACjC,WAAW,CAAC,OAAO,GAAG,UAAU,CAAC,KAAK,IAAI,EAAE;YAC1C,IAAI,QAAQ,EAAE,CAAC;gBACb,MAAM,OAAO,GAAG,MAAM,QAAQ,CAAC,CAAC,CAAC,CAAC;gBAClC,IAAI,EAAE,KAAK,WAAW,CAAC,OAAO;oBAAE,OAAO;gBACvC,gBAAgB,CAAC,OAAO,CAAC,CAAC;YAC5B,CAAC;iBAAM,CAAC;gBACN,oCAAoC;gBACpC,gBAAgB,CAAC,IAAI,CAAC,CAAC;YACzB,CAAC;YACD,cAAc,CAAC,KAAK,CAAC,CAAC;QACxB,CAAC,EAAE,GAAG,CAAC,CAAC;QACR,OAAO,GAAG,EAAE;YACV,IAAI,WAAW,CAAC,OAAO;gBAAE,YAAY,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC;QAC7D,CAAC,CAAC;IACJ,CAAC,EAAE,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC,CAAC;IAEvB,MAAM,cAAc,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,YAAY,GAAG,CAAC,CAAC,CAAC;IAEjE,MAAM,QAAQ,GAAG,MAAM,CAAC,IAAI,EAAE;QAC5B,CAAC,CAAC,CAAC,aAAa,IAAI,cAAc,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,YAAY,GAAG,CAAC,CAAC;QACrE,CAAC,CAAC,cAAc,CAAC;IAEnB,MAAM,UAAU,GAAG,CAAC,EAAU,EAAE,EAAE;QAChC,MAAM,CAAC,GAAG,IAAI,IAAI,CAAC,EAAE,CAAC,CAAC;QACvB,MAAM,GAAG,GAAG,IAAI,IAAI,EAAE,CAAC;QACvB,MAAM,MAAM,GAAG,GAAG,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC,OAAO,EAAE,CAAC;QAC3C,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,GAAG,QAAQ,CAAC,CAAC;QAC/C,IAAI,QAAQ,KAAK,CAAC;YAChB,OAAO,CAAC,CAAC,kBAAkB,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC,CAAC;QAC1E,IAAI,QAAQ,KAAK,CAAC;YAAE,OAAO,WAAW,CAAC;QACvC,IAAI,QAAQ,GAAG,CAAC;YAAE,OAAO,CAAC,CAAC,kBAAkB,CAAC,EAAE,EAAE,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC,CAAC;QACxE,OAAO,CAAC,CAAC,kBAAkB,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE,GAAG,EAAE,SAAS,EAAE,CAAC,CAAC;IACtE,CAAC,CAAC;IAEF,OAAO,CACL,8BACE,cAAK,SAAS,EAAC,oBAAoB,EAAC,OAAO,EAAE,OAAO,GAAI,EACxD,eAAK,SAAS,EAAC,uFAAuF,aACpG,eAAK,SAAS,EAAC,0DAA0D,aACvE,KAAC,UAAU,IAAC,IAAI,EAAE,EAAE,GAAI,EACxB,gBACE,GAAG,EAAE,QAAQ,EACb,IAAI,EAAC,MAAM,EACX,KAAK,EAAE,MAAM,EACb,QAAQ,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAC1C,WAAW,EAAC,iBAAiB,EAC7B,SAAS,EAAC,8FAA8F,GACxG,IACE,EACN,cAAK,SAAS,EAAC,+BAA+B,YAC3C,WAAW,CAAC,CAAC,CAAC,CACb,cAAK,SAAS,EAAC,qDAAqD,6BAE9D,CACP,CAAC,CAAC,CAAC,QAAQ,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,CAC1B,cAAK,SAAS,EAAC,qDAAqD,YACjE,MAAM,CAAC,CAAC,CAAC,mBAAmB,CAAC,CAAC,CAAC,cAAc,GAC1C,CACP,CAAC,CAAC,CAAC,CACF,QAAQ,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CACvB,kBAEE,OAAO,EAAE,GAAG,EAAE;gCACZ,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;gCACpB,OAAO,EAAE,CAAC;4BACZ,CAAC,EACD,SAAS,EAAC,+CAA+C,aAEzD,eAAK,SAAS,EAAC,2CAA2C,aACxD,eAAM,SAAS,EAAC,8CAA8C,YAC3D,MAAM,CAAC,KAAK,IAAI,MAAM,CAAC,OAAO,IAAI,MAAM,GACpC,EACP,eAAM,SAAS,EAAC,4CAA4C,YACzD,UAAU,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC;gDACxB,CAAC,CAAC,MAAM;gDACR,CAAC,CAAC,UAAU,CAAC,MAAM,CAAC,SAAS,CAAC,GAC3B,IACH,EACL,MAAM,CAAC,OAAO,IAAI,MAAM,CAAC,KAAK,KAAK,MAAM,CAAC,OAAO,IAAI,CACpD,cAAK,SAAS,EAAC,mDAAmD,YAC/D,MAAM,CAAC,OAAO,GACX,CACP,KArBI,MAAM,CAAC,EAAE,CAsBP,CACV,CAAC,CACH,GACG,IACF,IACL,CACJ,CAAC;AACJ,CAAC;AAED,gFAAgF;AAEhF,SAAS,WAAW,CAAC,EAAE,OAAO,EAA2B;IACvD,SAAS,CAAC,GAAG,EAAE;QACb,MAAM,OAAO,GAAG,CAAC,CAAgB,EAAE,EAAE;YACnC,IAAI,CAAC,CAAC,GAAG,KAAK,QAAQ;gBAAE,OAAO,EAAE,CAAC;QACpC,CAAC,CAAC;QACF,MAAM,CAAC,gBAAgB,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;QAC5C,OAAO,GAAG,EAAE,CAAC,MAAM,CAAC,mBAAmB,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;IAC9D,CAAC,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC;IAEd,MAAM,QAAQ,GAAG;QACf;YACE,IAAI,EAAE,QAAQ;YACd,WAAW,EAAE,kDAAkD;SAChE;QACD,EAAE,IAAI,EAAE,MAAM,EAAE,WAAW,EAAE,gBAAgB,EAAE;QAC/C,EAAE,IAAI,EAAE,UAAU,EAAE,WAAW,EAAE,kBAAkB,EAAE;QACrD,EAAE,IAAI,EAAE,OAAO,EAAE,WAAW,EAAE,8BAA8B,EAAE;QAC9D,EAAE,IAAI,EAAE,MAAM,EAAE,WAAW,EAAE,uBAAuB,EAAE;QACtD,EAAE,IAAI,EAAE,OAAO,EAAE,WAAW,EAAE,4BAA4B,EAAE;QAC5D,EAAE,IAAI,EAAE,GAAG,EAAE,WAAW,EAAE,qCAAqC,EAAE;KAClE,CAAC;IAEF,OAAO,CACL,8BACE,cAAK,SAAS,EAAC,oBAAoB,EAAC,OAAO,EAAE,OAAO,GAAI,EACxD,eAAK,SAAS,EAAC,uFAAuF,aACpG,eAAK,SAAS,EAAC,oEAAoE,aACjF,eAAM,SAAS,EAAC,qCAAqC,mCAE9C,EACP,iBACE,OAAO,EAAE,OAAO,gBACL,YAAY,EACvB,SAAS,EAAC,8FAA8F,YAExG,KAAC,KAAK,IAAC,IAAI,EAAE,EAAE,GAAI,GACZ,IACL,EACN,cAAK,SAAS,EAAC,MAAM,YAClB,QAAQ,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CACrB,eAAoB,SAAS,EAAC,aAAa,aACzC,cAAK,SAAS,EAAC,qCAAqC,YACjD,GAAG,CAAC,IAAI,GACL,EACN,cAAK,SAAS,EAAC,mCAAmC,YAC/C,GAAG,CAAC,WAAW,GACZ,KANE,GAAG,CAAC,IAAI,CAOZ,CACP,CAAC,GACE,IACF,IACL,CACJ,CAAC;AACJ,CAAC;AAiDD,MAAM,UAAU,qBAAqB,CAAC,EACpC,UAAU,GAAG,IAAI,EACjB,YAAY,EACZ,aAAa,EACb,aAAa,GAAG,KAAK,EACrB,MAAM,GAAG,eAAe,CAAC,2BAA2B,CAAC,EACrD,UAAU,EACV,GAAG,KAAK,EACmB;IAC3B,MAAM,EACJ,OAAO,EACP,cAAc,EACd,SAAS,EACT,YAAY,EACZ,YAAY,EACZ,YAAY,EACZ,UAAU,EACV,cAAc,EACd,aAAa,EACb,aAAa,EACb,cAAc,EACd,WAAW,GACZ,GAAG,cAAc,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC;IAEvC,+FAA+F;IAC/F,MAAM,SAAS,GAAG,UAAU,CAAC,CAAC,CAAC,IAAI,UAAU,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;IACrD,MAAM,iBAAiB,GAAG,GAAG,2BAA2B,GAAG,SAAS,EAAE,CAAC;IAEvE,mFAAmF;IACnF,MAAM,cAAc,GAAG,MAAM,CAAc,IAAI,GAAG,EAAE,CAAC,CAAC;IACtD,MAAM,iBAAiB,GAAG,MAAM,CAAC,cAAc,CAAC,CAAC;IACjD,iBAAiB,CAAC,OAAO,GAAG,cAAc,CAAC;IAC3C,mEAAmE;IACnE,IAAI,cAAc;QAAE,cAAc,CAAC,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC;IAC/D,MAAM,QAAQ,GAAG,MAAM,CAAmC,IAAI,GAAG,EAAE,CAAC,CAAC;IACrE,MAAM,YAAY,GAAG,MAAM,CAAsB,IAAI,GAAG,EAAE,CAAC,CAAC;IAC5D,MAAM,CAAC,cAAc,EAAE,iBAAiB,CAAC,GAAG,QAAQ,CAAc,IAAI,GAAG,EAAE,CAAC,CAAC;IAC7E,MAAM,CAAC,WAAW,EAAE,cAAc,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;IACtD,MAAM,YAAY,GAAG,MAAM,CAAc,IAAI,GAAG,EAAE,CAAC,CAAC;IAEpD,4EAA4E;IAC5E,MAAM,CAAC,eAAe,EAAE,kBAAkB,CAAC,GAAG,QAAQ,CACpD,EAAE,CACH,CAAC;IACF,MAAM,CAAC,YAAY,EAAE,eAAe,CAAC,GAAG,QAAQ,CAAS,aAAa,CAAC,CAAC;IACxE,MAAM,cAAc,GAAG,MAAM,CAE3B,IAAI,GAAG,EAAE,CAAC,CAAC;IACb,MAAM,CAAC,uBAAuB,EAAE,0BAA0B,CAAC,GAAG,QAAQ,CAEpE,GAAG,EAAE,CAAC,wBAAwB,CAAC,iBAAiB,CAAC,CAAC,CAAC;IACrD,MAAM,CAAC,qBAAqB,EAAE,wBAAwB,CAAC,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC;IAEtE,SAAS,CAAC,GAAG,EAAE;QACb,0BAA0B,CAAC,wBAAwB,CAAC,iBAAiB,CAAC,CAAC,CAAC;IAC1E,CAAC,EAAE,CAAC,iBAAiB,CAAC,CAAC,CAAC;IAExB,MAAM,yBAAyB,GAAG,WAAW,CAAC,GAAG,EAAE;QACjD,wBAAwB,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,GAAG,CAAC,CAAC,CAAC;IACrD,CAAC,EAAE,EAAE,CAAC,CAAC;IACP,MAAM,8BAA8B,GAAG,KAAK,CAAC,gBAAgB,KAAK,IAAI,CAAC;IAEvE,MAAM,2BAA2B,GAAG,WAAW,CAC7C,CAAC,QAAgB,EAAE,EAAE,CACnB,qBAAqB,CACnB,cAAc,CAAC,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,uBAAuB,EAC/D,eAAe,CAChB,EACH,CAAC,eAAe,EAAE,uBAAuB,EAAE,qBAAqB,CAAC,CAClE,CAAC;IAEF,MAAM,qBAAqB,GAAG,WAAW,CACvC,CAAC,SAAyB,EAAE,EAAE;QAC5B,0BAA0B,CAAC,SAAS,CAAC,CAAC;QACtC,yBAAyB,CAAC,iBAAiB,EAAE,SAAS,CAAC,CAAC;IAC1D,CAAC,EACD,CAAC,iBAAiB,CAAC,CACpB,CAAC;IAEF,MAAM,iBAAiB,GAAG,WAAW,CACnC,CAAC,KAAa,EAAE,MAAc,EAAE,EAAE;QAChC,MAAM,QAAQ,GAAG,iBAAiB,CAAC,OAAO,CAAC;QAC3C,IAAI,CAAC,QAAQ;YAAE,OAAO;QACtB,MAAM,QAAQ,GAAG,cAAc,CAAC,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QACtD,MAAM,cAAc,GAAG,QAAQ,EAAE,MAAM,IAAI,MAAM,CAAC;QAClD,MAAM,aAAa,GAAG,iCAAiC,CAAC,KAAK,CAAC,CAAC;QAC/D,MAAM,MAAM,GACV,cAAc,KAAK,MAAM,IAAI,aAAa,CAAC,QAAQ,CAAC,cAAc,CAAC;YACjE,CAAC,CAAC,cAAc;YAChB,CAAC,CAAC,MAAM,CAAC;QACb,MAAM,SAAS,GAAG,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC;QAC5C,cAAc,CAAC,OAAO,CAAC,GAAG,CAAC,QAAQ,EAAE,SAAS,CAAC,CAAC;QAChD,qBAAqB,CAAC,SAAS,CAAC,CAAC;QACjC,yBAAyB,EAAE,CAAC;IAC9B,CAAC,EACD,CAAC,yBAAyB,EAAE,qBAAqB,CAAC,CACnD,CAAC;IAEF,MAAM,kBAAkB,GAAG,WAAW,CACpC,CAAC,MAAuB,EAAE,EAAE;QAC1B,MAAM,QAAQ,GAAG,iBAAiB,CAAC,OAAO,CAAC;QAC3C,IAAI,CAAC,QAAQ;YAAE,OAAO;QACtB,MAAM,QAAQ,GAAG,2BAA2B,CAAC,QAAQ,CAAC,CAAC;QACvD,MAAM,KAAK,GAAG,QAAQ,EAAE,KAAK,IAAI,YAAY,CAAC;QAC9C,MAAM,MAAM,GACV,QAAQ,EAAE,MAAM;YAChB,eAAe,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,EAAE,MAAM;YACrE,eAAe,CAAC,CAAC,CAAC,EAAE,MAAM,CAAC;QAC7B,MAAM,SAAS,GAAmB,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC;QACpD,IAAI,MAAM;YAAE,SAAS,CAAC,MAAM,GAAG,MAAM,CAAC;QACtC,cAAc,CAAC,OAAO,CAAC,GAAG,CAAC,QAAQ,EAAE,SAAS,CAAC,CAAC;QAChD,qBAAqB,CAAC,SAAS,CAAC,CAAC;QACjC,yBAAyB,EAAE,CAAC;IAC9B,CAAC,EACD;QACE,eAAe;QACf,yBAAyB;QACzB,YAAY;QACZ,qBAAqB;QACrB,2BAA2B;KAC5B,CACF,CAAC;IAEF,MAAM,cAAc,GAAG,WAAW,CAAC,GAAG,EAAE;QACtC,OAAO,CAAC,GAAG,CAAC;YACV,KAAK,CAAC,eAAe,CAAC,4CAA4C,CAAC,EAAE;gBACnE,MAAM,EAAE,MAAM;gBACd,OAAO,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE;gBAC/C,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC;aACzC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;YACxC,KAAK,CAAC,eAAe,CAAC,2BAA2B,CAAC,CAAC;iBAChD,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;iBACnC,KAAK,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC;YAClB,KAAK,CAAC,eAAe,CAAC,+BAA+B,CAAC,CAAC;iBACpD,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;iBACrC,KAAK,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC;SACrB,CAAC;aACC,IAAI,CAAC,CAAC,CAAC,WAAW,EAAE,OAAO,EAAE,aAAa,CAAC,EAAE,EAAE;YAC9C,IAAI,CAAC,WAAW,EAAE,OAAO;gBAAE,OAAO;YAClC,MAAM,cAAc,GAAG,IAAI,GAAG,CAC3B,OAAuD;iBACrD,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,UAAU,CAAC;iBAC3B,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CACrB,CAAC;YACF,MAAM,gBAAgB,GAAG,aAAa,EAAE,UAAU,KAAK,IAAI,CAAC;YAC5D,MAAM,iBAAiB,GACrB,WAAW,CAAC,OAAO,EAAE,MAAM,CAAC;YAC9B,MAAM,YAAY,GAAuB,WAAW,CAAC,OAAO,EAAE,KAAK,CAAC;YAEpE,IAAI,MAA0B,CAAC;YAE/B,IAAI,gBAAgB,EAAE,CAAC;gBACrB,2DAA2D;gBAC3D,6DAA6D;gBAC7D,+CAA+C;gBAC/C,MAAM,aAAa,GAAG,WAAW,CAAC,OAAO,CAAC,IAAI,CAC5C,CAAC,CAAM,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,SAAS,CACjC,CAAC;gBACF,MAAM,aAAa,GAAa,aAAa,EAAE,eAAe,IAAI,EAAE,CAAC;gBACrE,MAAM,MAAM,GAAG,aAAa,CAAC,MAAM,CAAC,CAAC,CAAS,EAAE,EAAE,CAChD,CAAC,CAAC,UAAU,CAAC,SAAS,CAAC,CACxB,CAAC;gBACF,MAAM,MAAM,GAAG,aAAa,CAAC,MAAM,CAAC,CAAC,CAAS,EAAE,EAAE,CAChD,CAAC,CAAC,UAAU,CAAC,MAAM,CAAC,CACrB,CAAC;gBACF,MAAM,MAAM,GAAG,aAAa,CAAC,MAAM,CAAC,CAAC,CAAS,EAAE,EAAE,CAChD,CAAC,CAAC,UAAU,CAAC,SAAS,CAAC,CACxB,CAAC;gBAEF,MAAM,GAAG;oBACP,GAAG,CAAC,MAAM,CAAC,MAAM;wBACf,CAAC,CAAC;4BACE;gCACE,MAAM,EAAE,SAAS;gCACjB,KAAK,EAAE,QAAQ;gCACf,MAAM,EAAE,MAAM;gCACd,UAAU,EAAE,IAAI;6BACjB;yBACF;wBACH,CAAC,CAAC,EAAE,CAAC;oBACP,GAAG,CAAC,MAAM,CAAC,MAAM;wBACf,CAAC,CAAC;4BACE;gCACE,MAAM,EAAE,SAAS;gCACjB,KAAK,EAAE,QAAQ;gCACf,MAAM,EAAE,MAAM;gCACd,UAAU,EAAE,IAAI;6BACjB;yBACF;wBACH,CAAC,CAAC,EAAE,CAAC;oBACP,GAAG,CAAC,MAAM,CAAC,MAAM;wBACf,CAAC,CAAC;4BACE;gCACE,MAAM,EAAE,SAAS;gCACjB,KAAK,EAAE,QAAQ;gCACf,MAAM,EAAE,MAAM;gCACd,UAAU,EAAE,IAAI;6BACjB;yBACF;wBACH,CAAC,CAAC,EAAE,CAAC;iBACR,CAAC;gBAEF,8DAA8D;gBAC9D,0DAA0D;gBAC1D,IAAI,YAAY,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,YAAY,CAAC,EAAE,CAAC;oBAC1D,MAAM,UAAU,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC;oBAC7B,IAAI,UAAU;wBAAE,UAAU,CAAC,MAAM,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC;gBAC1D,CAAC;YACH,CAAC;iBAAM,CAAC;gBACN,+DAA+D;gBAC/D,MAAM,cAAc,GAAG,IAAI,GAAG,CAAC;oBAC7B,WAAW;oBACX,eAAe;oBACf,eAAe;iBAChB,CAAC,CAAC;gBACH,MAAM,GAAG,WAAW,CAAC,OAAO;qBACzB,MAAM,CAAC,CAAC,CAAM,EAAE,EAAE,CAAC,cAAc,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;qBAC9C,GAAG,CAAC,CAAC,CAAM,EAAE,EAAE;oBACd,MAAM,MAAM,GAAG,CAAC,GAAG,CAAC,CAAC,eAAe,CAAC,CAAC;oBACtC,IACE,CAAC,CAAC,IAAI,KAAK,iBAAiB;wBAC5B,YAAY;wBACZ,CAAC,MAAM,CAAC,QAAQ,CAAC,YAAY,CAAC,EAC9B,CAAC;wBACD,MAAM,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC;oBAC/B,CAAC;oBACD,OAAO;wBACL,MAAM,EAAE,CAAC,CAAC,IAAI;wBACd,KAAK,EAAE,CAAC,CAAC,KAAK;wBACd,MAAM;wBACN,UAAU,EACR,CAAC,CAAC,eAAe,CAAC,MAAM,KAAK,CAAC;4BAC9B,CAAC,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC,CAAS,EAAE,EAAE,CACnC,cAAc,CAAC,GAAG,CAAC,CAAC,CAAC,CACtB;4BACD,CAAC,CAAC,IAAI,KAAK,iBAAiB;qBAC/B,CAAC;gBACJ,CAAC,CAAC,CAAC;YACP,CAAC;YACD,kBAAkB,CAAC,MAAM,CAAC,CAAC;YAC3B,eAAe,CAAC,YAAY,IAAI,aAAa,CAAC,CAAC;QACjD,CAAC,CAAC;aACD,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;IACrB,CAAC,EAAE,EAAE,CAAC,CAAC;IAEP,SAAS,CAAC,GAAG,EAAE;QACb,cAAc,EAAE,CAAC;QACjB,MAAM,CAAC,gBAAgB,CAAC,iCAAiC,EAAE,cAAc,CAAC,CAAC;QAC3E,OAAO,GAAG,EAAE,CACV,MAAM,CAAC,mBAAmB,CACxB,iCAAiC,EACjC,cAAc,CACf,CAAC;IACN,CAAC,EAAE,CAAC,cAAc,CAAC,CAAC,CAAC;IAErB,2DAA2D;IAC3D,0DAA0D;IAC1D,MAAM,cAAc,GAAG,wBAAwB,SAAS,EAAE,CAAC;IAC3D,MAAM,CAAC,SAAS,EAAE,YAAY,CAAC,GAAG,QAAQ,CAAyB,GAAG,EAAE;QACtE,IAAI,CAAC;YACH,MAAM,KAAK,GAAG,YAAY,CAAC,OAAO,CAAC,cAAc,CAAC,CAAC;YACnD,IAAI,KAAK;gBAAE,OAAO,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;QACtC,CAAC;QAAC,MAAM,CAAC,CAAA,CAAC;QACV,OAAO,EAAE,CAAC;IACZ,CAAC,CAAC,CAAC;IAEH,qCAAqC;IACrC,SAAS,CAAC,GAAG,EAAE;QACb,IAAI,CAAC;YACH,YAAY,CAAC,OAAO,CAAC,cAAc,EAAE,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC,CAAC;QAClE,CAAC;QAAC,MAAM,CAAC,CAAA,CAAC;IACZ,CAAC,EAAE,CAAC,SAAS,EAAE,cAAc,CAAC,CAAC,CAAC;IAEhC,uDAAuD;IACvD,oEAAoE;IACpE,MAAM,mBAAmB,GAAG,6BAA6B,SAAS,EAAE,CAAC;IACrE,MAAM,CAAC,aAAa,EAAE,gBAAgB,CAAC,GAAG,QAAQ,CAChD,GAAG,EAAE;QACH,IAAI,CAAC;YACH,MAAM,KAAK,GAAG,YAAY,CAAC,OAAO,CAAC,mBAAmB,CAAC,CAAC;YACxD,IAAI,KAAK;gBAAE,OAAO,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;QACtC,CAAC;QAAC,MAAM,CAAC,CAAA,CAAC;QACV,OAAO,EAAE,CAAC;IACZ,CAAC,CACF,CAAC;IAEF,SAAS,CAAC,GAAG,EAAE;QACb,IAAI,CAAC;YACH,YAAY,CAAC,OAAO,CAAC,mBAAmB,EAAE,IAAI,CAAC,SAAS,CAAC,aAAa,CAAC,CAAC,CAAC;QAC3E,CAAC;QAAC,MAAM,CAAC,CAAA,CAAC;IACZ,CAAC,EAAE,CAAC,aAAa,EAAE,mBAAmB,CAAC,CAAC,CAAC;IAEzC,iEAAiE;IACjE,MAAM,aAAa,GAAG,uBAAuB,SAAS,EAAE,CAAC;IACzD,MAAM,CAAC,UAAU,EAAE,aAAa,CAAC,GAAG,QAAQ,CAAW,GAAG,EAAE;QAC1D,IAAI,CAAC;YACH,MAAM,KAAK,GAAG,YAAY,CAAC,OAAO,CAAC,aAAa,CAAC,CAAC;YAClD,IAAI,KAAK,EAAE,CAAC;gBACV,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;gBACjC,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;oBAC/C,gCAAgC;oBAChC,KAAK,MAAM,EAAE,IAAI,MAAM;wBAAE,cAAc,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;oBACxD,OAAO,MAAM,CAAC;gBAChB,CAAC;YACH,CAAC;QACH,CAAC;QAAC,MAAM,CAAC,CAAA,CAAC;QACV,OAAO,EAAE,CAAC;IACZ,CAAC,CAAC,CAAC;IACH,MAAM,cAAc,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC;IAErC,uFAAuF;IACvF,SAAS,CAAC,GAAG,EAAE;QACb,MAAM,QAAQ,GAAG,UAAU,CAAC,MAAM,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC,CAAC;QAC3D,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACxB,IAAI,CAAC;gBACH,YAAY,CAAC,OAAO,CAAC,aAAa,EAAE,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC,CAAC;YAChE,CAAC;YAAC,MAAM,CAAC,CAAA,CAAC;QACZ,CAAC;IACH,CAAC,EAAE,CAAC,UAAU,EAAE,SAAS,EAAE,aAAa,CAAC,CAAC,CAAC;IAE3C,2EAA2E;IAC3E,SAAS,CAAC,GAAG,EAAE;QACb,IAAI,cAAc,CAAC,OAAO,IAAI,CAAC,cAAc,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC;YACnE,OAAO;QACT,cAAc,CAAC,OAAO,GAAG,IAAI,CAAC;QAC9B,MAAM,SAAS,GAAG,IAAI,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;QACpD,MAAM,SAAS,GAAG,IAAI,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;QAEzD,uEAAuE;QACvE,2EAA2E;QAC3E,oEAAoE;QACpE,MAAM,kBAAkB,GAAG,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC;QAC9C,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QACvB,MAAM,OAAO,GAAG,CAAC,EAAU,EAAE,EAAE;YAC7B,MAAM,MAAM,GAAG,SAAS,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YACjC,OAAO,MAAM;gBACX,CAAC,CAAC,MAAM,CAAC,YAAY,KAAK,CAAC;oBACvB,GAAG,GAAG,MAAM,CAAC,SAAS,GAAG,kBAAkB;gBAC/C,CAAC,CAAC,KAAK,CAAC;QACZ,CAAC,CAAC;QAEF,2FAA2F;QAC3F,IAAI,SAAS,CAAC,cAAc,CAAC,EAAE,CAAC;YAC9B,MAAM,MAAM,GAAG,SAAS,CAAC,cAAc,CAAC,CAAC;YACzC,IAAI,MAAM,IAAI,SAAS,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC;gBACpC,YAAY,CAAC,MAAM,CAAC,CAAC;YACvB,CAAC;iBAAM,CAAC;gBACN,uCAAuC;gBACvC,MAAM,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;gBACzD,IAAI,UAAU;oBAAE,YAAY,CAAC,UAAU,CAAC,EAAE,CAAC,CAAC;YAC9C,CAAC;QACH,CAAC;QAED,aAAa,CAAC,CAAC,IAAI,EAAE,EAAE;YACrB,qFAAqF;YACrF,MAAM,KAAK,GAAG,IAAI,CAAC,MAAM,CACvB,CAAC,EAAE,EAAE,EAAE,CAAC,SAAS,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,CAC5D,CAAC;YACF,gFAAgF;YAChF,IACE,CAAC,SAAS,CAAC,cAAc,CAAC;gBAC1B,CAAC,KAAK,CAAC,QAAQ,CAAC,cAAc,CAAC;gBAC/B,CAAC,OAAO,CAAC,cAAc,CAAC,EACxB,CAAC;gBACD,KAAK,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;YAC7B,CAAC;YACD,OAAO,KAAK,CAAC;QACf,CAAC,CAAC,CAAC;QAEH,yCAAyC;QACzC,IAAI,CAAC,SAAS,CAAC,cAAc,CAAC,IAAI,OAAO,CAAC,cAAc,CAAC,EAAE,CAAC;YAC1D,YAAY,EAAE,CAAC;QACjB,CAAC;IACH,CAAC,EAAE,CAAC,cAAc,EAAE,OAAO,EAAE,SAAS,EAAE,YAAY,EAAE,YAAY,CAAC,CAAC,CAAC;IAErE,+CAA+C;IAC/C,0EAA0E;IAC1E,8EAA8E;IAC9E,SAAS,CAAC,GAAG,EAAE;QACb,IAAI,cAAc,EAAE,CAAC;YACnB,aAAa,CAAC,CAAC,IAAI,EAAE,EAAE,CACrB,IAAI,CAAC,QAAQ,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,GAAG,IAAI,EAAE,cAAc,CAAC,CACjE,CAAC;QACJ,CAAC;IACH,CAAC,EAAE,CAAC,cAAc,CAAC,CAAC,CAAC;IAErB,4EAA4E;IAC5E,2EAA2E;IAC3E,0EAA0E;IAC1E,gEAAgE;IAChE,MAAM,eAAe,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC;IACtC,SAAS,CAAC,GAAG,EAAE;QACb,IAAI,SAAS,IAAI,eAAe,CAAC,OAAO;YAAE,OAAO;QACjD,IAAI,UAAU,CAAC,MAAM,KAAK,CAAC,IAAI,CAAC,cAAc,EAAE,CAAC;YAC/C,eAAe,CAAC,OAAO,GAAG,IAAI,CAAC;YAC/B,YAAY,EAAE,CAAC,IAAI,CAAC,CAAC,EAAE,EAAE,EAAE;gBACzB,eAAe,CAAC,OAAO,GAAG,KAAK,CAAC;gBAChC,IAAI,EAAE,EAAE,CAAC;oBACP,YAAY,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;oBAC7B,aAAa,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;gBACtB,CAAC;YACH,CAAC,CAAC,CAAC;QACL,CAAC;IACH,CAAC,EAAE,CAAC,SAAS,EAAE,UAAU,EAAE,cAAc,EAAE,YAAY,CAAC,CAAC,CAAC;IAE1D,yCAAyC;IACzC,SAAS,CAAC,GAAG,EAAE;QACb,IAAI,CAAC,cAAc;YAAE,OAAO;QAC5B,2DAA2D;QAC3D,MAAM,CAAC,GAAG,UAAU,CAAC,GAAG,EAAE;YACxB,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC,EAAE,aAAa,EAAE,CAAC;QACxD,CAAC,EAAE,EAAE,CAAC,CAAC;QACP,OAAO,GAAG,EAAE,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;IAC/B,CAAC,EAAE,CAAC,cAAc,CAAC,CAAC,CAAC;IAErB,2EAA2E;IAC3E,kFAAkF;IAClF,4EAA4E;IAC5E,4EAA4E;IAC5E,iDAAiD;IACjD,MAAM,cAAc,GAAG,WAAW,CAAC,CAAC,EAAsB,EAAE,EAAE;QAC5D,IAAI,CAAC,EAAE;YAAE,OAAO;QAChB,MAAM,SAAS,GAAG,EAAE,CAAC,aAAa,CAAC;QACnC,IAAI,CAAC,SAAS;YAAE,OAAO;QACvB,MAAM,MAAM,GAAG,EAAE,CAAC;QAClB,qBAAqB,CAAC,GAAG,EAAE;YACzB,MAAM,aAAa,GAAG,SAAS,CAAC,qBAAqB,EAAE,CAAC;YACxD,MAAM,OAAO,GAAG,EAAE,CAAC,qBAAqB,EAAE,CAAC;YAC3C,IAAI,OAAO,CAAC,IAAI,GAAG,aAAa,CAAC,IAAI,GAAG,MAAM,EAAE,CAAC;gBAC/C,SAAS,CAAC,UAAU,IAAI,OAAO,CAAC,IAAI,GAAG,aAAa,CAAC,IAAI,GAAG,MAAM,CAAC;YACrE,CAAC;iBAAM,IAAI,OAAO,CAAC,KAAK,GAAG,aAAa,CAAC,KAAK,GAAG,MAAM,EAAE,CAAC;gBACxD,SAAS,CAAC,UAAU,IAAI,OAAO,CAAC,KAAK,GAAG,aAAa,CAAC,KAAK,GAAG,MAAM,CAAC;YACvE,CAAC;QACH,CAAC,CAAC,CAAC;IACL,CAAC,EAAE,EAAE,CAAC,CAAC;IAEP,MAAM,CAAC,aAAa,EAAE,gBAAgB,CAAC,GAAG,QAAQ,CAChD,GAAG,EAAE,CAAC,MAAM,CAAC,WAAW,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,YAAY,IAAI,CAAC,CAAC,CAAC,CAAC,CAC1E,CAAC;IAEF,kDAAkD;IAClD,SAAS,CAAC,GAAG,EAAE;QACb,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACvB,gBAAgB,CAAC,CAAC,IAAI,EAAE,EAAE;gBACxB,MAAM,IAAI,GAAG,EAAE,GAAG,IAAI,EAAE,CAAC;gBACzB,KAAK,MAAM,CAAC,IAAI,OAAO,EAAE,CAAC;oBACxB,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,IAAI,IAAI,CAAC,EAAE,CAAC;wBACpB,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,YAAY,IAAI,CAAC,CAAC;oBACnC,CAAC;gBACH,CAAC;gBACD,OAAO,IAAI,CAAC;YACd,CAAC,CAAC,CAAC;QACL,CAAC;IACH,CAAC,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC;IAEd,6CAA6C;IAC7C,SAAS,CAAC,GAAG,EAAE;QACb,MAAM,OAAO,GAAG,CAAC,KAAmB,EAAE,EAAE;YACtC,IAAI,CAAC,qBAAqB,CAAC,KAAK,CAAC;gBAAE,OAAO;YAC1C,IAAI,KAAK,CAAC,IAAI,EAAE,IAAI,KAAK,wBAAwB;gBAAE,OAAO;YAC1D,MAAM,OAAO,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,EAAE,OAAiB,CAAC;YACnD,IAAI,CAAC,OAAO;gBAAE,OAAO;YACrB,MAAM,OAAO,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,EAAE,OAA6B,CAAC;YAC/D,MAAM,WAAW,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,EAAE,WAAkC,CAAC;YACxE,MAAM,KAAK,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,EAAE,KAA2B,CAAC;YAC3D,MAAM,MAAM,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,EAAE,MAAiB,CAAC;YAClD,MAAM,MAAM,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,EAAE,MAA6B,CAAC;YAC9D,MAAM,KAAK,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,EAAE,KAAK,CAAC;YACrC,MAAM,cAAc,GAAG,OAAO,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC;YACrE,MAAM,UAAU,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,EAAE,UAAiC,CAAC;YAEtE,oEAAoE;YACpE,yDAAyD;YACzD,IAAI,WAAW,KAAK,KAAK,IAAI,CAAC,UAAU,EAAE,CAAC;gBACzC,MAAM,CAAC,aAAa,CAAC,IAAI,WAAW,CAAC,kBAAkB,CAAC,CAAC,CAAC;YAC5D,CAAC;YACD,IAAI,8BAA8B;gBAAE,OAAO;YAE3C,sEAAsE;YACtE,uEAAuE;YACvE,MAAM,WAAW,GAAG,OAAO;gBACzB,CAAC,CAAC,GAAG,OAAO,kBAAkB,OAAO,cAAc;gBACnD,CAAC,CAAC,OAAO,CAAC;YAEZ,MAAM,SAAS,GAAG,CAAC,QAAgB,EAAE,EAAE;gBACrC,sEAAsE;gBACtE,IAAI,KAAK,EAAE,CAAC;oBACV,MAAM,YAAY,GAAG,eAAe,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAC9C,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,CACzB,CAAC;oBACF,IAAI,YAAY,EAAE,CAAC;wBACjB,MAAM,eAAe,GAAG,iBAAiB,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC;wBACpE,MAAM,aAAa,GAAG,iCAAiC,CAAC,KAAK,CAAC,CAAC;wBAC/D,MAAM,cAAc,GAClB,eAAe,KAAK,MAAM;4BAC1B,aAAa,CAAC,QAAQ,CAAC,eAAe,CAAC;4BACrC,CAAC,CAAC,eAAe;4BACjB,CAAC,CAAC,MAAM,CAAC;wBACb,cAAc,CAAC,OAAO,CAAC,GAAG,CAAC,QAAQ,EAAE;4BACnC,KAAK;4BACL,MAAM,EAAE,YAAY,CAAC,MAAM;4BAC3B,MAAM,EAAE,cAAc;yBACvB,CAAC,CAAC;wBACH,yBAAyB,EAAE,CAAC;oBAC9B,CAAC;gBACH,CAAC;gBAED,MAAM,GAAG,GAAG,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;gBAC3C,IAAI,GAAG,EAAE,CAAC;oBACR,GAAG,CAAC,WAAW,CAAC,WAAW,CAAC,CAAC;gBAC/B,CAAC;qBAAM,CAAC;oBACN,YAAY,CAAC,OAAO,CAAC,GAAG,CAAC,QAAQ,EAAE,WAAW,CAAC,CAAC;gBAClD,CAAC;YACH,CAAC,CAAC;YAEF,IAAI,MAAM,EAAE,CAAC;gBACX,MAAM,aAAa,GAAG,iBAAiB,CAAC,OAAO,CAAC;gBAChD,YAAY,CAAC,cAAc,CAAC,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE;oBAC1C,IAAI,KAAK,EAAE,CAAC;wBACV,YAAY,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;wBAChC,SAAS,CAAC,KAAK,CAAC,CAAC;wBACjB,IAAI,UAAU,IAAI,aAAa,EAAE,CAAC;4BAChC,YAAY,CAAC,aAAa,CAAC,CAAC;wBAC9B,CAAC;oBACH,CAAC;gBACH,CAAC,CAAC,CAAC;YACL,CAAC;iBAAM,CAAC;gBACN,MAAM,YAAY,GAAG,iBAAiB,CAAC,OAAO,CAAC;gBAC/C,IAAI,CAAC,YAAY;oBAAE,OAAO;gBAC1B,SAAS,CAAC,YAAY,CAAC,CAAC;YAC1B,CAAC;QACH,CAAC,CAAC;QACF,MAAM,CAAC,gBAAgB,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;QAC5C,OAAO,GAAG,EAAE,CAAC,MAAM,CAAC,mBAAmB,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;IAC9D,CAAC,EAAE;QACD,eAAe;QACf,yBAAyB;QACzB,YAAY;QACZ,8BAA8B;QAC9B,YAAY;KACb,CAAC,CAAC;IAEH,wCAAwC;IACxC,SAAS,CAAC,GAAG,EAAE;QACb,KAAK,MAAM,CAAC,KAAK,EAAE,OAAO,CAAC,IAAI,YAAY,CAAC,OAAO,EAAE,CAAC;YACpD,MAAM,GAAG,GAAG,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;YACxC,IAAI,GAAG,EAAE,CAAC;gBACR,UAAU,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,WAAW,CAAC,OAAO,CAAC,EAAE,EAAE,CAAC,CAAC;gBAC/C,YAAY,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;YACrC,CAAC;QACH,CAAC;IACH,CAAC,EAAE,CAAC,UAAU,CAAC,CAAC,CAAC;IAEjB,2CAA2C;IAC3C,SAAS,CAAC,GAAG,EAAE;QACb,MAAM,OAAO,GAAG,CAAC,CAAQ,EAAE,EAAE;YAC3B,MAAM,MAAM,GAAI,CAAiB,CAAC,MAAM,CAAC;YACzC,IAAI,CAAC,MAAM;gBAAE,OAAO;YACpB,MAAM,EAAE,SAAS,EAAE,KAAK,EAAE,GAAG,MAAM,CAAC;YACpC,IAAI,CAAC,KAAK;gBAAE,OAAO;YAEnB,iBAAiB,CAAC,CAAC,IAAI,EAAE,EAAE;gBACzB,MAAM,IAAI,GAAG,IAAI,GAAG,CAAC,IAAI,CAAC,CAAC;gBAC3B,IAAI,SAAS,EAAE,CAAC;oBACd,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;gBAClB,CAAC;qBAAM,CAAC;oBACN,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;gBACrB,CAAC;gBACD,OAAO,IAAI,CAAC;YACd,CAAC,CAAC,CAAC;QACL,CAAC,CAAC;QACF,MAAM,CAAC,gBAAgB,CAAC,yBAAyB,EAAE,OAAO,CAAC,CAAC;QAC5D,OAAO,GAAG,EAAE,CAAC,MAAM,CAAC,mBAAmB,CAAC,yBAAyB,EAAE,OAAO,CAAC,CAAC;IAC9E,CAAC,EAAE,EAAE,CAAC,CAAC;IAEP,MAAM,MAAM,GAAG,WAAW,CAAC,KAAK,IAAI,EAAE;QACpC,MAAM,EAAE,GAAG,MAAM,YAAY,EAAE,CAAC;QAChC,IAAI,EAAE,EAAE,CAAC;YACP,YAAY,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAC/B,CAAC;IACH,CAAC,EAAE,CAAC,YAAY,CAAC,CAAC,CAAC;IAEnB,MAAM,QAAQ,GAAG,WAAW,CAC1B,CAAC,KAAa,EAAE,EAAE;QAChB,aAAa,CAAC,CAAC,IAAI,EAAE,EAAE;YACrB,IAAI,IAAI,CAAC,MAAM,IAAI,CAAC,EAAE,CAAC;gBACrB,iEAAiE;gBACjE,YAAY,EAAE,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE;oBAC5B,IAAI,KAAK,EAAE,CAAC;wBACV,YAAY,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;wBAChC,aAAa,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC;oBACzB,CAAC;gBACH,CAAC,CAAC,CAAC;gBACH,OAAO,IAAI,CAAC,CAAC,sCAAsC;YACrD,CAAC;YACD,MAAM,IAAI,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,KAAK,KAAK,CAAC,CAAC;YAC/C,IAAI,KAAK,KAAK,iBAAiB,CAAC,OAAO,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBAC3D,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;gBAChC,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;YACrD,CAAC;YACD,OAAO,IAAI,CAAC;QACd,CAAC,CAAC,CAAC;QACH,QAAQ,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QAC/B,YAAY,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QACnC,YAAY,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QACnC,cAAc,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QACrC,0CAA0C;QAC1C,YAAY,CAAC,CAAC,IAAI,EAAE,EAAE;YACpB,IAAI,CAAC,CAAC,KAAK,IAAI,IAAI,CAAC;gBAAE,OAAO,IAAI,CAAC;YAClC,MAAM,EAAE,CAAC,KAAK,CAAC,EAAE,CAAC,EAAE,GAAG,IAAI,EAAE,GAAG,IAAI,CAAC;YACrC,OAAO,IAAI,CAAC;QACd,CAAC,CAAC,CAAC;QACH,gBAAgB,CAAC,CAAC,IAAI,EAAE,EAAE;YACxB,IAAI,CAAC,CAAC,KAAK,IAAI,IAAI,CAAC;gBAAE,OAAO,IAAI,CAAC;YAClC,MAAM,EAAE,CAAC,KAAK,CAAC,EAAE,CAAC,EAAE,GAAG,IAAI,EAAE,GAAG,IAAI,CAAC;YACrC,OAAO,IAAI,CAAC;QACd,CAAC,CAAC,CAAC;IACL,CAAC,EACD,CAAC,YAAY,EAAE,YAAY,CAAC,CAC7B,CAAC;IAEF,MAAM,cAAc,GAAG,WAAW,CAChC,CAAC,KAAa,EAAE,EAAE;QAChB,aAAa,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC;QACvB,IAAI,iBAAiB,CAAC,OAAO,KAAK,KAAK,EAAE,CAAC;YACxC,YAAY,CAAC,KAAK,CAAC,CAAC;QACtB,CAAC;QACD,gCAAgC;QAChC,KAAK,MAAM,GAAG,IAAI,QAAQ,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC;YAC1C,IAAI,GAAG,KAAK,KAAK,EAAE,CAAC;gBAClB,QAAQ,CAAC,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;gBAC7B,YAAY,CAAC,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;gBACjC,YAAY,CAAC,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;gBACjC,cAAc,CAAC,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;YACrC,CAAC;QACH,CAAC;QACD,oFAAoF;QACpF,YAAY,CAAC,CAAC,IAAI,EAAE,EAAE;YACpB,IAAI,KAAK,IAAI,IAAI;gBAAE,OAAO,EAAE,CAAC,KAAK,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;YACnD,OAAO,EAAE,CAAC;QACZ,CAAC,CAAC,CAAC;QACH,gBAAgB,CAAC,CAAC,IAAI,EAAE,EAAE;YACxB,IAAI,KAAK,IAAI,IAAI;gBAAE,OAAO,EAAE,CAAC,KAAK,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;YACnD,OAAO,EAAE,CAAC;QACZ,CAAC,CAAC,CAAC;IACL,CAAC,EACD,CAAC,YAAY,CAAC,CACf,CAAC;IAEF,MAAM,YAAY,GAAG,WAAW,CAAC,KAAK,IAAI,EAAE;QAC1C,MAAM,EAAE,GAAG,MAAM,YAAY,EAAE,CAAC;QAChC,IAAI,EAAE,EAAE,CAAC;YACP,YAAY,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YAC7B,aAAa,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;YACpB,YAAY,CAAC,EAAE,CAAC,CAAC;YACjB,wBAAwB;YACxB,QAAQ,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC;YACzB,YAAY,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC;YAC7B,cAAc,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC;YAC/B,YAAY,CAAC,EAAE,CAAC,CAAC;YACjB,gBAAgB,CAAC,EAAE,CAAC,CAAC;QACvB,CAAC;IACH,CAAC,EAAE,CAAC,YAAY,EAAE,YAAY,CAAC,CAAC,CAAC;IAEjC,yEAAyE;IACzE,SAAS,CAAC,GAAG,EAAE;QACb,MAAM,kBAAkB,GAAG,GAAG,EAAE;YAC9B,MAAM,EAAE,GAAG,iBAAiB,CAAC,OAAO,CAAC;YACrC,IAAI,EAAE;gBAAE,QAAQ,CAAC,EAAE,CAAC,CAAC;QACvB,CAAC,CAAC;QACF,MAAM,cAAc,GAAG,GAAG,EAAE;YAC1B,KAAK,YAAY,EAAE,CAAC;QACtB,CAAC,CAAC;QACF,MAAM,CAAC,gBAAgB,CAAC,8BAA8B,EAAE,kBAAkB,CAAC,CAAC;QAC5E,MAAM,CAAC,gBAAgB,CAAC,2BAA2B,EAAE,cAAc,CAAC,CAAC;QACrE,OAAO,GAAG,EAAE;YACV,MAAM,CAAC,mBAAmB,CACxB,8BAA8B,EAC9B,kBAAkB,CACnB,CAAC;YACF,MAAM,CAAC,mBAAmB,CAAC,2BAA2B,EAAE,cAAc,CAAC,CAAC;QAC1E,CAAC,CAAC;IACJ,CAAC,EAAE,CAAC,QAAQ,EAAE,YAAY,CAAC,CAAC,CAAC;IAE7B,MAAM,cAAc,GAAG,WAAW,CAAC,GAAG,EAAE;QACtC,MAAM,EAAE,CAAC;IACX,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC;IAEb,MAAM,eAAe,GAAG,WAAW,CACjC,CAAC,QAAgB,EAAE,EAAE;QACnB,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC;YACnC,aAAa,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,GAAG,IAAI,EAAE,QAAQ,CAAC,CAAC,CAAC;QAC/C,CAAC;QACD,YAAY,CAAC,QAAQ,CAAC,CAAC;IACzB,CAAC,EACD,CAAC,UAAU,EAAE,YAAY,CAAC,CAC3B,CAAC;IAEF,uEAAuE;IACvE,SAAS,CAAC,GAAG,EAAE;QACb,SAAS,cAAc,CAAC,CAAQ;YAC9B,MAAM,MAAM,GAAI,CAAiB,CAAC,MAAM,CAAC;YACzC,MAAM,QAAQ,GAAG,MAAM,EAAE,QAAQ,CAAC;YAClC,IAAI,CAAC,QAAQ;gBAAE,OAAO;YACtB,sEAAsE;YACtE,MAAM,QAAQ,GAAG,iBAAiB,CAAC,OAAO,CAAC;YAC3C,IAAI,QAAQ,IAAI,QAAQ,KAAK,QAAQ,EAAE,CAAC;gBACtC,YAAY,CAAC,CAAC,IAAI,EAAE,EAAE,CACpB,IAAI,CAAC,QAAQ,CAAC,KAAK,QAAQ;oBACzB,CAAC,CAAC,IAAI;oBACN,CAAC,CAAC,EAAE,GAAG,IAAI,EAAE,CAAC,QAAQ,CAAC,EAAE,QAAQ,EAAE,CACtC,CAAC;YACJ,CAAC;YACD,yDAAyD;YACzD,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,IAAI,MAAM,CAAC,WAAW,IAAI,EAAE,CAAC;YACrD,IAAI,IAAI,EAAE,CAAC;gBACT,gBAAgB,CAAC,CAAC,IAAI,EAAE,EAAE,CACxB,IAAI,CAAC,QAAQ,CAAC,KAAK,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,GAAG,IAAI,EAAE,CAAC,QAAQ,CAAC,EAAE,IAAI,EAAE,CAC/D,CAAC;YACJ,CAAC;YACD,yEAAyE;YACzE,cAAc,EAAE,CAAC;YACjB,+EAA+E;YAC/E,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC;gBACnC,aAAa,CAAC,CAAC,IAAI,EAAE,EAAE;oBACrB,IAAI,QAAQ,EAAE,CAAC;wBACb,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;wBACzC,IAAI,SAAS,KAAK,CAAC,CAAC,EAAE,CAAC;4BACrB,qEAAqE;4BACrE,MAAM,IAAI,GAAG,CAAC,GAAG,IAAI,CAAC,CAAC;4BACvB,IAAI,SAAS,GAAG,SAAS,GAAG,CAAC,CAAC;4BAC9B,qDAAqD;4BACrD,OACE,SAAS,GAAG,IAAI,CAAC,MAAM;gCACvB,SAAS,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,KAAK,QAAQ,EACvC,CAAC;gCACD,SAAS,EAAE,CAAC;4BACd,CAAC;4BACD,IAAI,CAAC,MAAM,CAAC,SAAS,EAAE,CAAC,EAAE,QAAQ,CAAC,CAAC;4BACpC,OAAO,IAAI,CAAC;wBACd,CAAC;oBACH,CAAC;oBACD,OAAO,CAAC,GAAG,IAAI,EAAE,QAAQ,CAAC,CAAC;gBAC7B,CAAC,CAAC,CAAC;YACL,CAAC;YACD,YAAY,CAAC,QAAQ,CAAC,CAAC;QACzB,CAAC;QACD,MAAM,CAAC,gBAAgB,CAAC,iBAAiB,EAAE,cAAc,CAAC,CAAC;QAC3D,OAAO,GAAG,EAAE,CAAC,MAAM,CAAC,mBAAmB,CAAC,iBAAiB,EAAE,cAAc,CAAC,CAAC;IAC7E,CAAC,EAAE,CAAC,UAAU,EAAE,YAAY,EAAE,cAAc,EAAE,SAAS,CAAC,CAAC,CAAC;IAE1D,2DAA2D;IAC3D,MAAM,kBAAkB,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC;IACrC,SAAS,CAAC,GAAG,EAAE;QACb,IAAI,OAAO,GAAG,KAAK,CAAC;QACpB,IAAI,KAAK,GAAyC,IAAI,CAAC;QAEvD,KAAK,UAAU,eAAe;YAC5B,IAAI,OAAO;gBAAE,OAAO;YACpB,IAAI,CAAC;gBACH,MAAM,GAAG,GAAG,MAAM,KAAK,CACrB,eAAe,CAAC,+CAA+C,CAAC,CACjE,CAAC;gBACF,IAAI,GAAG,CAAC,EAAE,EAAE,CAAC;oBACX,MAAM,IAAI,GAAG,MAAM,GAAG,CAAC,IAAI,EAAE,CAAC;oBAC9B,IACE,IAAI,EAAE,KAAK,EAAE,OAAO,KAAK,aAAa;wBACtC,IAAI,CAAC,KAAK,CAAC,QAAQ;wBACnB,IAAI,CAAC,KAAK,CAAC,SAAS,GAAG,kBAAkB,CAAC,OAAO,EACjD,CAAC;wBACD,kBAAkB,CAAC,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC;wBAClD,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,QAAkB,CAAC;wBAC/C,wCAAwC;wBACxC,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC;4BACnC,aAAa,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,GAAG,IAAI,EAAE,QAAQ,CAAC,CAAC,CAAC;wBAC/C,CAAC;wBACD,YAAY,CAAC,QAAQ,CAAC,CAAC;wBACvB,oBAAoB;wBACpB,KAAK,CACH,eAAe,CAAC,+CAA+C,CAAC,EAChE;4BACE,MAAM,EAAE,QAAQ;4BAChB,OAAO,EAAE,EAAE,qBAAqB,EAAE,GAAG,EAAE;yBACxC,CACF,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;oBACpB,CAAC;gBACH,CAAC;YACH,CAAC;YAAC,MAAM,CAAC,CAAA,CAAC;YACV,IAAI,CAAC,OAAO,EAAE,CAAC;gBACb,KAAK,GAAG,UAAU,CAAC,eAAe,EAAE,IAAI,CAAC,CAAC;YAC5C,CAAC;QACH,CAAC;QAED,eAAe,EAAE,CAAC;QAClB,OAAO,GAAG,EAAE;YACV,OAAO,GAAG,IAAI,CAAC;YACf,IAAI,KAAK;gBAAE,YAAY,CAAC,KAAK,CAAC,CAAC;QACjC,CAAC,CAAC;IACJ,CAAC,EAAE,CAAC,UAAU,EAAE,YAAY,CAAC,CAAC,CAAC;IAE/B,MAAM,mBAAmB,GAAG,WAAW,CACrC,CAAC,QAAgB,EAAE,OAAe,EAAE,EAAE;QACpC,aAAa,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE;YAC9C,IAAI,KAAK,EAAE,CAAC;gBACV,4CAA4C;gBAC5C,cAAc,CAAC,QAAQ,EAAE;oBACvB,UAAU,EAAE,EAAE;oBACd,KAAK;oBACL,OAAO,EAAE,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC;iBAC/B,CAAC,CAAC;YACL,CAAC;QACH,CAAC,CAAC,CAAC;IACL,CAAC,EACD,CAAC,aAAa,EAAE,cAAc,CAAC,CAChC,CAAC;IAEF,MAAM,gBAAgB,GAAG,WAAW,CAClC,CACE,QAAgB,EAChB,IAKC,EACD,EAAE;QACF,cAAc,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;IACjC,CAAC,EACD,CAAC,cAAc,CAAC,CACjB,CAAC;IAEF,uEAAuE;IACvE,MAAM,CAAC,WAAW,EAAE,cAAc,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;IAEtD,MAAM,kBAAkB,GAAG,WAAW,CACpC,CAAC,OAAe,EAAE,EAAE;QAClB,QAAQ,OAAO,EAAE,CAAC;YAChB,KAAK,OAAO,CAAC;YACb,KAAK,KAAK;gBACR,MAAM,EAAE,CAAC;gBACT,MAAM;YACR,KAAK,SAAS;gBACZ,cAAc,CAAC,IAAI,CAAC,CAAC;gBACrB,MAAM;YACR,KAAK,MAAM;gBACT,KAAK,CAAC,gBAAgB,EAAE,CAAC,MAAM,CAAC,CAAC;gBACjC,MAAM;YACR,KAAK,KAAK;gBACR,KAAK,CAAC,gBAAgB,EAAE,CAAC,OAAO,CAAC,CAAC;gBAClC,MAAM;YACR,KAAK,MAAM;gBACT,cAAc,CAAC,IAAI,CAAC,CAAC;gBACrB,MAAM;QACV,CAAC;IACH,CAAC,EACD,CAAC,MAAM,EAAE,KAAK,CAAC,gBAAgB,CAAC,CACjC,CAAC;IAEF,MAAM,cAAc,GAAG,WAAW,CAChC,KAAK,EAAE,cAAsB,EAAE,EAAE;QAC/B,MAAM,QAAQ,GAAG,MAAM,UAAU,CAAC,cAAc,CAAC,CAAC;QAClD,IAAI,CAAC,QAAQ;YAAE,OAAO;QACtB,aAAa,CAAC,CAAC,IAAI,EAAE,EAAE;YACrB,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,cAAc,CAAC,CAAC;YACzC,IAAI,GAAG,KAAK,CAAC,CAAC,EAAE,CAAC;gBACf,MAAM,IAAI,GAAG,CAAC,GAAG,IAAI,CAAC,CAAC;gBACvB,IAAI,CAAC,MAAM,CAAC,GAAG,GAAG,CAAC,EAAE,CAAC,EAAE,QAAQ,CAAC,CAAC;gBAClC,OAAO,IAAI,CAAC;YACd,CAAC;YACD,OAAO,CAAC,GAAG,IAAI,EAAE,QAAQ,CAAC,CAAC;QAC7B,CAAC,CAAC,CAAC;QACH,YAAY,CAAC,QAAQ,CAAC,CAAC;IACzB,CAAC,EACD,CAAC,UAAU,EAAE,YAAY,CAAC,CAC3B,CAAC;IAEF,kCAAkC;IAClC,MAAM,SAAS,GAAG,IAAI,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;IACzD,MAAM,IAAI,GAAc,UAAU;SAC/B,MAAM,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,SAAS,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,EAAE,KAAK,cAAc,CAAC;SAC1D,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE;QACV,MAAM,CAAC,GAAG,SAAS,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAC5B,OAAO;YACL,EAAE;YACF,KAAK,EAAE,CAAC,EAAE,KAAK,IAAI,CAAC,EAAE,OAAO,EAAE,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,UAAU;YACzD,MAAM,EAAE,cAAc,CAAC,GAAG,CAAC,EAAE,CAAC;gBAC5B,CAAC,CAAE,SAAmB;gBACtB,CAAC,CAAC,CAAC,aAAa,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,YAAY,IAAI,CAAC,CAAC,GAAG,CAAC;oBAC/C,CAAC,CAAE,WAAqB;oBACxB,CAAC,CAAE,MAAgB;YACvB,cAAc,EAAE,SAAS,CAAC,EAAE,CAAC;YAC7B,YAAY,EAAE,aAAa,CAAC,EAAE,CAAC;SAChC,CAAC;IACJ,CAAC,CAAC,CAAC;IAEL,oFAAoF;IACpF,KAAK,MAAM,EAAE,IAAI,UAAU,EAAE,CAAC;QAC5B,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC;YACnC,IAAI,CAAC,IAAI,CAAC;gBACR,EAAE;gBACF,KAAK,EACH,aAAa,CAAC,EAAE,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC,UAAU,CAAC;gBACpE,MAAM,EAAE,SAAkB;gBAC1B,cAAc,EAAE,SAAS,CAAC,EAAE,CAAC;gBAC7B,YAAY,EAAE,aAAa,CAAC,EAAE,CAAC;aAChC,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IAED,MAAM,WAAW,GAAqC;QACpD,IAAI;QACJ,WAAW,EAAE,cAAc,IAAI,EAAE;QACjC,qBAAqB,EAAE,cAAc;YACnC,CAAC,CAAC,CAAC,aAAa,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC;YACtC,CAAC,CAAC,CAAC;QACL,cAAc,EAAE,YAAY;QAC5B,MAAM;QACN,QAAQ;QACR,cAAc;QACd,YAAY;QACZ,cAAc;QACd,WAAW;QACX,aAAa,EAAE,GAAG,EAAE,CAAC,cAAc,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC;QAC9C,QAAQ,EAAE,UAAU,CAAC,MAAM;KAC5B,CAAC;IAEF,sEAAsE;IACtE,wEAAwE;IACxE,8EAA8E;IAC9E,oEAAoE;IACpE,IAAI,SAAS,IAAI,CAAC,cAAc,EAAE,CAAC;QACjC,OAAO,CACL,KAAC,YAAY,IACX,MAAM,EAAE,YAAY,EAAE,CAAC,WAAW,CAAC,EACnC,UAAU,EAAE,aAAa,GACzB,CACH,CAAC;IACJ,CAAC;IAED,OAAO,CACL,eAAK,SAAS,EAAC,uDAAuD,aAEpE,gBACE,uBAAuB,EAAE;oBACvB,MAAM,EACJ,yEAAyE;wBACzE,mEAAmE;wBACnE,sDAAsD;iBACzD,GACD,EACD,YAAY;gBACX,CAAC,CAAC,YAAY,CAAC,WAAW,CAAC;gBAC3B,CAAC,CAAC,UAAU;oBACV,CAAC,CAAC,CAAC,GAAG,EAAE;wBACJ,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,cAAc,CAAC,CAAC;wBAC5D,MAAM,aAAa,GAAG,SAAS,EAAE,cAAc,IAAI,cAAc,CAAC;wBAClE,MAAM,SAAS,GAAG,IAAI,CAAC,MAAM,CAC3B,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,cAAc,KAAK,aAAa,CAC1C,CAAC;wBACF,MAAM,UAAU,GAAG,SAAS,CAAC,MAAM,GAAG,CAAC,CAAC;wBACxC,MAAM,QAAQ,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC;wBAEvD,OAAO,CACL,8BACE,eAAK,SAAS,EAAC,qEAAqE,aAClF,cAAK,SAAS,EAAC,4EAA4E,YACxF,QAAQ,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE;gDACpB,MAAM,QAAQ,GACZ,GAAG,CAAC,EAAE,KAAK,cAAc;oDACzB,CAAC,GAAG,CAAC,EAAE,KAAK,aAAa;wDACvB,SAAS,EAAE,cAAc,KAAK,GAAG,CAAC,EAAE,CAAC,CAAC;gDAC1C,OAAO,CACL,eAEE,GAAG,EAAE,QAAQ,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC,SAAS,EAC1C,SAAS,EAAE,EAAE,CACX,gGAAgG,EAChG,QAAQ;wDACN,CAAC,CAAC,2BAA2B;wDAC7B,CAAC,CAAC,6DAA6D,CAClE,aAED,kBACE,IAAI,EAAC,QAAQ,EACb,OAAO,EAAE,GAAG,EAAE,CAAC,YAAY,CAAC,GAAG,CAAC,EAAE,CAAC,EACnC,SAAS,EAAC,gEAAgE,aAE1E,eAAM,SAAS,EAAC,eAAe,YAAE,GAAG,CAAC,KAAK,GAAQ,EACjD,GAAG,CAAC,MAAM,KAAK,SAAS,IAAI,CAC3B,eAAM,SAAS,EAAC,wEAAwE,GAAG,CAC5F,IACM,EACT,iBACE,IAAI,EAAC,QAAQ,gBACF,WAAW,EACtB,OAAO,EAAE,CAAC,CAAC,EAAE,EAAE;gEACb,CAAC,CAAC,eAAe,EAAE,CAAC;gEACpB,CAAC,CAAC,cAAc,EAAE,CAAC;gEACnB,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;4DACnB,CAAC,EACD,SAAS,EAAC,4FAA4F,EACtG,KAAK,EAAE;gEACL,QAAQ,EAAE,UAAU;gEACpB,KAAK,EAAE,CAAC;gEACR,GAAG,EAAE,CAAC;gEACN,MAAM,EAAE,CAAC;gEACT,KAAK,EAAE,EAAE;gEACT,YAAY,EAAE,CAAC;gEACf,YAAY,EAAE,aAAa;gEAC3B,UAAU,EACR,gEAAgE;6DACnE,YAED,KAAC,KAAK,IAAC,IAAI,EAAE,EAAE,GAAI,GACZ,KAzCJ,GAAG,CAAC,EAAE,CA0CP,CACP,CAAC;4CACJ,CAAC,CAAC,GACE,EACN,KAAC,eAAe,IAAC,aAAa,EAAE,GAAG,YACjC,eAAK,SAAS,EAAC,2CAA2C,aACxD,MAAC,OAAO,eACN,KAAC,cAAc,IAAC,OAAO,kBACrB,iBACE,OAAO,EAAE,MAAM,gBACJ,UAAU,EACrB,SAAS,EAAC,oHAAoH,YAE9H,KAAC,QAAQ,IAAC,IAAI,EAAE,EAAE,GAAI,GACf,GACM,EACjB,KAAC,cAAc,2BAA0B,IACjC,EACV,MAAC,OAAO,eACN,KAAC,cAAc,IAAC,OAAO,kBACrB,iBACE,OAAO,EAAE,GAAG,EAAE,CAAC,cAAc,CAAC,CAAC,WAAW,CAAC,gBAChC,WAAW,EACtB,SAAS,EAAE,EAAE,CACX,oHAAoH,EACpH,WAAW,IAAI,2BAA2B,CAC3C,YAED,KAAC,WAAW,IAAC,IAAI,EAAE,EAAE,GAAI,GAClB,GACM,EACjB,KAAC,cAAc,4BAA2B,IAClC,IACN,GACU,IACd,EACL,UAAU,IAAI,CACb,cAAK,SAAS,EAAC,mFAAmF,YAChG,eAAK,SAAS,EAAC,4EAA4E,aACzF,iBACE,OAAO,EAAE,GAAG,EAAE,CAAC,YAAY,CAAC,aAAc,CAAC,EAC3C,SAAS,EAAE,EAAE,CACX,8FAA8F,EAC9F,cAAc,KAAK,aAAa;oDAC9B,CAAC,CAAC,2BAA2B;oDAC7B,CAAC,CAAC,6DAA6D,CAClE,qBAGM,EACR,SAAS,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CACtB,eAEE,GAAG,EACD,GAAG,CAAC,EAAE,KAAK,cAAc;oDACvB,CAAC,CAAC,cAAc;oDAChB,CAAC,CAAC,SAAS,EAEf,SAAS,EAAE,EAAE,CACX,gGAAgG,EAChG,GAAG,CAAC,EAAE,KAAK,cAAc;oDACvB,CAAC,CAAC,2BAA2B;oDAC7B,CAAC,CAAC,6DAA6D,CAClE,aAED,kBACE,IAAI,EAAC,QAAQ,EACb,OAAO,EAAE,GAAG,EAAE,CAAC,YAAY,CAAC,GAAG,CAAC,EAAE,CAAC,EACnC,SAAS,EAAC,4DAA4D,aAEtE,eAAM,SAAS,EAAC,eAAe,YAC5B,GAAG,CAAC,YAAY,IAAI,GAAG,CAAC,KAAK,GACzB,EACN,GAAG,CAAC,MAAM,KAAK,SAAS,IAAI,CAC3B,eAAM,SAAS,EAAC,oEAAoE,GAAG,CACxF,IACM,EACT,iBACE,IAAI,EAAC,QAAQ,gBACF,WAAW,EACtB,OAAO,EAAE,CAAC,CAAC,EAAE,EAAE;4DACb,CAAC,CAAC,eAAe,EAAE,CAAC;4DACpB,CAAC,CAAC,cAAc,EAAE,CAAC;4DACnB,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;wDACnB,CAAC,EACD,SAAS,EAAC,4FAA4F,EACtG,KAAK,EAAE;4DACL,QAAQ,EAAE,UAAU;4DACpB,KAAK,EAAE,CAAC;4DACR,GAAG,EAAE,CAAC;4DACN,MAAM,EAAE,CAAC;4DACT,KAAK,EAAE,EAAE;4DACT,YAAY,EAAE,CAAC;4DACf,YAAY,EAAE,aAAa;4DAC3B,UAAU,EACR,gEAAgE;yDACnE,YAED,KAAC,KAAK,IAAC,IAAI,EAAE,EAAE,GAAI,GACZ,KA/CJ,GAAG,CAAC,EAAE,CAgDP,CACP,CAAC,IACE,GACF,CACP,IACA,CACJ,CAAC;oBACJ,CAAC,CAAC,EAAE;oBACN,CAAC,CAAC,IAAI,EAGV,eAAK,SAAS,EAAC,uCAAuC,aACnD,aAAa,CAAC,CAAC,CAAC,aAAa,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,IAAI,EAGjD,WAAW,IAAI,CACd,KAAC,cAAc,IACb,OAAO,EAAE,OAAO,EAChB,UAAU,EAAE,IAAI,GAAG,CAAC,UAAU,CAAC,EAC/B,QAAQ,EAAE,eAAe,EACzB,OAAO,EAAE,GAAG,EAAE,CAAC,cAAc,CAAC,KAAK,CAAC,EACpC,QAAQ,EAAE,aAAa,GACvB,CACH,EAGA,WAAW,IAAI,KAAC,WAAW,IAAC,OAAO,EAAE,GAAG,EAAE,CAAC,cAAc,CAAC,KAAK,CAAC,GAAI,EAKpE,CAAC,GAAG,IAAI,GAAG,CAAC,UAAU,CAAC,CAAC;yBACtB,MAAM,CACL,CAAC,KAAK,EAAE,EAAE,CACR,KAAK,KAAK,cAAc,IAAI,cAAc,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,CAChE;yBACA,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE;wBACb,MAAM,cAAc,GAAG,2BAA2B,CAAC,KAAK,CAAC,CAAC;wBAC1D,OAAO,CACL,eAEE,SAAS,EAAC,yBAAyB,EACnC,KAAK,EAAE;gCACL,OAAO,EACL,aAAa,IAAI,KAAK,KAAK,cAAc,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM;6BAC9D,aAED,KAAC,cAAc,IACb,QAAQ,EAAE,KAAK,EACf,MAAM,EAAE,MAAM,EACd,OAAO,EAAE,GAAG,EAAE;wCACZ,MAAM,MAAM,GAAG,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;wCAC3C,MAAM,EAAE,WAAW,CACjB,4FAA4F,CAC7F,CAAC;oCACJ,CAAC,GACD,EACF,KAAC,aAAa,OACR,KAAK,EACT,GAAG,EAAE,CAAC,MAAM,EAAE,EAAE;wCACd,IAAI,MAAM,EAAE,CAAC;4CACX,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;wCACtC,CAAC;6CAAM,CAAC;4CACN,QAAQ,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;wCACjC,CAAC;oCACH,CAAC,EACD,QAAQ,EAAE,KAAK,EACf,KAAK,EAAE,KAAK,EACZ,MAAM,EAAE,MAAM,EACd,WAAW,EACT,YAAY,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,WAAW,CAAC,KAAK,CAAC,EAEvD,oBAAoB,EAAE,CAAC,KAAK,EAAE,EAAE,CAC9B,gBAAgB,CAAC,CAAC,IAAI,EAAE,EAAE,CACxB,IAAI,CAAC,KAAK,CAAC,KAAK,KAAK;wCACnB,CAAC,CAAC,IAAI;wCACN,CAAC,CAAC,EAAE,GAAG,IAAI,EAAE,CAAC,KAAK,CAAC,EAAE,KAAK,EAAE,CAChC,EAEH,YAAY,EAAE,gBAAgB,EAC9B,eAAe,EAAE,mBAAmB,EACpC,cAAc,EAAE,kBAAkB,EAClC,aAAa,EAAE,cAAc,EAAE,KAAK,EACpC,cAAc,EAAE,cAAc,EAAE,MAAM,EACtC,cAAc,EAAE,cAAc,EAAE,MAAM,IAAI,MAAM,EAChD,YAAY,EAAE,YAAY,EAC1B,eAAe,EAAE,eAAe,EAChC,aAAa,EAAE,iBAAiB,EAChC,cAAc,EAAE,kBAAkB,EAClC,UAAU,EAAE,GAAG,EAAE,CAAC,cAAc,CAAC,KAAK,CAAC,GACvC,KAlDG,KAAK,CAmDN,CACP,CAAC;oBACJ,CAAC,CAAC,IACA,IACF,CACP,CAAC;AACJ,CAAC","sourcesContent":["import React, { useState, useRef, useEffect, useCallback } from \"react\";\nimport { IconX, IconPlus, IconHistory, IconSearch } from \"@tabler/icons-react\";\nimport {\n AssistantChat,\n type AssistantChatProps,\n type AssistantChatHandle,\n} from \"./AssistantChat.js\";\nimport { isTrustedFrameMessage } from \"./frame.js\";\nimport { cn } from \"./utils.js\";\nimport {\n Tooltip,\n TooltipContent,\n TooltipProvider,\n TooltipTrigger,\n} from \"./components/ui/tooltip.js\";\nimport { useChatThreads, type ChatThreadSummary } from \"./use-chat-threads.js\";\nimport { agentNativePath } from \"./api-path.js\";\nimport { RunStuckBanner } from \"./RunStuckBanner.js\";\nimport { DEFAULT_MODEL } from \"../agent/default-model.js\";\nimport {\n getReasoningEffortOptionsForModel,\n isReasoningEffort,\n type ReasoningEffort,\n} from \"../shared/reasoning-effort.js\";\n\ninterface EngineModelGroup {\n engine: string;\n label: string;\n models: string[];\n configured: boolean;\n}\n\ninterface ModelSelection {\n model: string;\n engine?: string;\n effort?: ReasoningEffort;\n}\n\nconst MODEL_SELECTION_STORAGE_KEY = \"agent-native:chat-models:selection\";\n\nfunction readStoredModelSelection(key: string): ModelSelection | undefined {\n if (typeof window === \"undefined\") return undefined;\n try {\n const raw = window.localStorage.getItem(key);\n if (!raw) return undefined;\n const parsed = JSON.parse(raw) as Partial<ModelSelection>;\n if (typeof parsed.model !== \"string\" || !parsed.model.trim()) {\n return undefined;\n }\n const selection: ModelSelection = {\n model: parsed.model,\n effort: isReasoningEffort(parsed.effort) ? parsed.effort : \"auto\",\n };\n if (typeof parsed.engine === \"string\") selection.engine = parsed.engine;\n return selection;\n } catch {\n return undefined;\n }\n}\n\nfunction writeStoredModelSelection(key: string, selection: ModelSelection) {\n if (typeof window === \"undefined\") return;\n try {\n window.localStorage.setItem(key, JSON.stringify(selection));\n } catch {}\n}\n\nfunction resolveModelSelection(\n selection: ModelSelection | undefined,\n groups: EngineModelGroup[],\n): ModelSelection | undefined {\n if (!selection?.model) return undefined;\n if (groups.length === 0) {\n const requestedEffort = selection.effort ?? \"auto\";\n const effortOptions = getReasoningEffortOptionsForModel(selection.model);\n return {\n model: selection.model,\n effort:\n requestedEffort === \"auto\" || effortOptions.includes(requestedEffort)\n ? requestedEffort\n : \"auto\",\n };\n }\n const preferredGroup = groups.find(\n (group) =>\n group.engine === selection.engine &&\n group.models.includes(selection.model),\n );\n const fallbackGroup = groups.find((group) =>\n group.models.includes(selection.model),\n );\n if (groups.length > 0 && !preferredGroup && !fallbackGroup) {\n return undefined;\n }\n const engine =\n preferredGroup?.engine ?? fallbackGroup?.engine ?? selection.engine;\n if (!engine && groups.length > 0) return undefined;\n\n const requestedEffort = selection.effort ?? \"auto\";\n const effortOptions = getReasoningEffortOptionsForModel(selection.model);\n const effort =\n requestedEffort === \"auto\" || effortOptions.includes(requestedEffort)\n ? requestedEffort\n : \"auto\";\n const resolved: ModelSelection = { model: selection.model, effort };\n if (engine) resolved.engine = engine;\n return resolved;\n}\n\n// ─── Skeleton Loader ─────────────────────────────────────────────────────────\n\nfunction ChatSkeleton({\n header,\n headerOnly = false,\n}: {\n header?: React.ReactNode;\n headerOnly?: boolean;\n}) {\n return (\n <div\n className={cn(\n \"flex flex-col min-h-0\",\n headerOnly ? \"shrink-0\" : \"flex-1 h-full\",\n )}\n >\n {header ?? (\n <div className=\"flex items-center px-1 py-1 border-b border-border shrink-0 gap-0.5\">\n <div className=\"h-[22px] w-20 rounded-md bg-muted animate-pulse\" />\n <div className=\"ml-auto flex gap-0.5\">\n <div className=\"h-[22px] w-[22px] rounded-md bg-muted animate-pulse\" />\n <div className=\"h-[22px] w-[22px] rounded-md bg-muted animate-pulse\" />\n </div>\n </div>\n )}\n {!headerOnly && (\n <div className=\"flex-1 flex flex-col gap-3 p-4\">\n <div className=\"flex justify-center py-8\">\n <div className=\"h-10 w-10 rounded-full bg-muted animate-pulse\" />\n </div>\n <div className=\"h-3 w-32 rounded bg-muted animate-pulse mx-auto\" />\n </div>\n )}\n </div>\n );\n}\n\n// ─── History Popover ─────────────────────────────────────────────────────────\n\nfunction HistoryPopover({\n threads,\n openTabIds,\n onSelect,\n onClose,\n onSearch,\n}: {\n threads: ChatThreadSummary[];\n openTabIds: Set<string>;\n onSelect: (id: string) => void;\n onClose: () => void;\n onSearch?: (query: string) => Promise<ChatThreadSummary[]>;\n}) {\n const [search, setSearch] = useState(\"\");\n const [searchResults, setSearchResults] = useState<\n ChatThreadSummary[] | null\n >(null);\n const [isSearching, setIsSearching] = useState(false);\n const inputRef = useRef<HTMLInputElement>(null);\n const debounceRef = useRef<ReturnType<typeof setTimeout>>(undefined);\n\n useEffect(() => {\n inputRef.current?.focus();\n }, []);\n\n useEffect(() => {\n const handler = (e: KeyboardEvent) => {\n if (e.key === \"Escape\") onClose();\n };\n window.addEventListener(\"keydown\", handler);\n return () => window.removeEventListener(\"keydown\", handler);\n }, [onClose]);\n\n // Debounced server-side search\n const searchIdRef = useRef(0);\n useEffect(() => {\n if (debounceRef.current) clearTimeout(debounceRef.current);\n const q = search.trim();\n if (!q) {\n searchIdRef.current++;\n setSearchResults(null);\n setIsSearching(false);\n return;\n }\n setIsSearching(true);\n const id = ++searchIdRef.current;\n debounceRef.current = setTimeout(async () => {\n if (onSearch) {\n const results = await onSearch(q);\n if (id !== searchIdRef.current) return;\n setSearchResults(results);\n } else {\n // Fallback to client-side filtering\n setSearchResults(null);\n }\n setIsSearching(false);\n }, 250);\n return () => {\n if (debounceRef.current) clearTimeout(debounceRef.current);\n };\n }, [search, onSearch]);\n\n const visibleThreads = threads.filter((t) => t.messageCount > 0);\n\n const filtered = search.trim()\n ? (searchResults ?? visibleThreads).filter((t) => t.messageCount > 0)\n : visibleThreads;\n\n const formatTime = (ts: number) => {\n const d = new Date(ts);\n const now = new Date();\n const diffMs = now.getTime() - d.getTime();\n const diffDays = Math.floor(diffMs / 86400000);\n if (diffDays === 0)\n return d.toLocaleTimeString([], { hour: \"numeric\", minute: \"2-digit\" });\n if (diffDays === 1) return \"Yesterday\";\n if (diffDays < 7) return d.toLocaleDateString([], { weekday: \"short\" });\n return d.toLocaleDateString([], { month: \"short\", day: \"numeric\" });\n };\n\n return (\n <>\n <div className=\"fixed inset-0 z-40\" onClick={onClose} />\n <div className=\"absolute right-2 top-0 z-50 w-72 rounded-lg border border-border bg-popover shadow-lg\">\n <div className=\"flex items-center gap-2 px-3 py-2 border-b border-border\">\n <IconSearch size={13} />\n <input\n ref={inputRef}\n type=\"text\"\n value={search}\n onChange={(e) => setSearch(e.target.value)}\n placeholder=\"Search chats...\"\n className=\"flex-1 bg-transparent text-xs text-foreground placeholder:text-muted-foreground outline-none\"\n />\n </div>\n <div className=\"max-h-64 overflow-y-auto py-1\">\n {isSearching ? (\n <div className=\"px-3 py-4 text-xs text-muted-foreground text-center\">\n Searching...\n </div>\n ) : filtered.length === 0 ? (\n <div className=\"px-3 py-4 text-xs text-muted-foreground text-center\">\n {search ? \"No matching chats\" : \"No chats yet\"}\n </div>\n ) : (\n filtered.map((thread) => (\n <button\n key={thread.id}\n onClick={() => {\n onSelect(thread.id);\n onClose();\n }}\n className=\"w-full px-3 py-2 text-left hover:bg-accent/50\"\n >\n <div className=\"flex items-baseline justify-between gap-2\">\n <span className=\"text-xs font-medium text-foreground truncate\">\n {thread.title || thread.preview || \"Chat\"}\n </span>\n <span className=\"text-[10px] text-muted-foreground shrink-0\">\n {openTabIds.has(thread.id)\n ? \"Open\"\n : formatTime(thread.updatedAt)}\n </span>\n </div>\n {thread.preview && thread.title !== thread.preview && (\n <div className=\"text-[11px] text-muted-foreground truncate mt-0.5\">\n {thread.preview}\n </div>\n )}\n </button>\n ))\n )}\n </div>\n </div>\n </>\n );\n}\n\n// ─── Help Popover ────────────────────────────────────────────────────────────\n\nfunction HelpPopover({ onClose }: { onClose: () => void }) {\n useEffect(() => {\n const handler = (e: KeyboardEvent) => {\n if (e.key === \"Escape\") onClose();\n };\n window.addEventListener(\"keydown\", handler);\n return () => window.removeEventListener(\"keydown\", handler);\n }, [onClose]);\n\n const commands = [\n {\n name: \"/clear\",\n description: \"Start a new chat (keeps current chat in history)\",\n },\n { name: \"/new\", description: \"Same as /clear\" },\n { name: \"/history\", description: \"Browse all chats\" },\n { name: \"/plan\", description: \"Switch to read-only planning\" },\n { name: \"/act\", description: \"Switch back to acting\" },\n { name: \"/help\", description: \"Show this list of commands\" },\n { name: \"@\", description: \"Mention files, agents, or resources\" },\n ];\n\n return (\n <>\n <div className=\"fixed inset-0 z-40\" onClick={onClose} />\n <div className=\"absolute right-2 top-0 z-50 w-72 rounded-lg border border-border bg-popover shadow-lg\">\n <div className=\"flex items-center justify-between px-3 py-2 border-b border-border\">\n <span className=\"text-xs font-medium text-foreground\">\n Available Commands\n </span>\n <button\n onClick={onClose}\n aria-label=\"Close help\"\n className=\"flex h-5 w-5 items-center justify-center rounded text-muted-foreground hover:text-foreground\"\n >\n <IconX size={12} />\n </button>\n </div>\n <div className=\"py-1\">\n {commands.map((cmd) => (\n <div key={cmd.name} className=\"px-3 py-1.5\">\n <div className=\"text-xs font-medium text-foreground\">\n {cmd.name}\n </div>\n <div className=\"text-[11px] text-muted-foreground\">\n {cmd.description}\n </div>\n </div>\n ))}\n </div>\n </div>\n </>\n );\n}\n\n// ─── Types ──────────────────────────────────────────────────────────────────\n\ninterface ChatTab {\n id: string;\n label: string;\n status: \"idle\" | \"running\" | \"completed\";\n /** If this tab is a sub-agent, the parent thread ID */\n parentThreadId?: string;\n /** Short name for sub-agent tabs (e.g. \"Research\", \"Draft email\") */\n subAgentName?: string;\n}\n\nexport interface MultiTabAssistantChatHeaderProps {\n tabs: ChatTab[];\n activeTabId: string;\n activeTabMessageCount: number;\n setActiveTabId: (tabId: string) => void;\n addTab: () => void;\n closeTab: (tabId: string) => void;\n closeOtherTabs: (tabId: string) => void;\n closeAllTabs: () => void;\n clearActiveTab: () => void;\n /** Open the history popover */\n showHistory?: boolean;\n toggleHistory?: () => void;\n /** Number of open tabs (useful for triggering scroll on tab count change) */\n tabCount: number;\n}\n\n// ─── Component ──────────────────────────────────────────────────────────────\n\nexport type MultiTabAssistantChatProps = Omit<\n AssistantChatProps,\n \"tabId\" | \"threadId\"\n> & {\n /** Show the tab bar. Default: true */\n showTabBar?: boolean;\n /** Optional custom single-row header renderer */\n renderHeader?: (props: MultiTabAssistantChatHeaderProps) => React.ReactNode;\n /** Optional overlay actions renderer for the active tab */\n renderOverlay?: (props: MultiTabAssistantChatHeaderProps) => React.ReactNode;\n /** Hide the chat content while keeping the header visible. Used when CLI/resources mode is active. */\n contentHidden?: boolean;\n /** Namespace for localStorage keys — used to isolate chat state per app in the frame. */\n storageKey?: string;\n};\n\nexport function MultiTabAssistantChat({\n showTabBar = true,\n renderHeader,\n renderOverlay,\n contentHidden = false,\n apiUrl = agentNativePath(\"/_agent-native/agent-chat\"),\n storageKey,\n ...props\n}: MultiTabAssistantChatProps) {\n const {\n threads,\n activeThreadId,\n isLoading,\n createThread,\n switchThread,\n deleteThread,\n forkThread,\n saveThreadData,\n generateTitle,\n searchThreads,\n refreshThreads,\n isNewThread,\n } = useChatThreads(apiUrl, storageKey);\n\n // Namespace all localStorage keys by storageKey when provided (for per-app isolation in frame)\n const keyPrefix = storageKey ? `:${storageKey}` : \"\";\n const modelSelectionKey = `${MODEL_SELECTION_STORAGE_KEY}${keyPrefix}`;\n\n // Track which tabs have been focused at least once (lazy mount for sub-agent tabs)\n const mountedTabsRef = useRef<Set<string>>(new Set());\n const activeThreadIdRef = useRef(activeThreadId);\n activeThreadIdRef.current = activeThreadId;\n // Mark the active tab as mounted so it persists when switched away\n if (activeThreadId) mountedTabsRef.current.add(activeThreadId);\n const chatRefs = useRef<Map<string, AssistantChatHandle>>(new Map());\n const pendingSends = useRef<Map<string, string>>(new Map());\n const [runningThreads, setRunningThreads] = useState<Set<string>>(new Set());\n const [showHistory, setShowHistory] = useState(false);\n const newThreadIds = useRef<Set<string>>(new Set());\n\n // ─── Model state ─────────────────────────────────────────────────────────\n const [availableModels, setAvailableModels] = useState<EngineModelGroup[]>(\n [],\n );\n const [defaultModel, setDefaultModel] = useState<string>(DEFAULT_MODEL);\n const threadModelRef = useRef<\n Map<string, { model: string; engine?: string; effort?: ReasoningEffort }>\n >(new Map());\n const [persistedModelSelection, setPersistedModelSelection] = useState<\n ModelSelection | undefined\n >(() => readStoredModelSelection(modelSelectionKey));\n const [modelSelectionVersion, setModelSelectionVersion] = useState(0);\n\n useEffect(() => {\n setPersistedModelSelection(readStoredModelSelection(modelSelectionKey));\n }, [modelSelectionKey]);\n\n const bumpModelSelectionVersion = useCallback(() => {\n setModelSelectionVersion((version) => version + 1);\n }, []);\n const postMessageSubmissionsDisabled = props.composerDisabled === true;\n\n const resolveThreadModelSelection = useCallback(\n (threadId: string) =>\n resolveModelSelection(\n threadModelRef.current.get(threadId) ?? persistedModelSelection,\n availableModels,\n ),\n [availableModels, persistedModelSelection, modelSelectionVersion],\n );\n\n const persistModelSelection = useCallback(\n (selection: ModelSelection) => {\n setPersistedModelSelection(selection);\n writeStoredModelSelection(modelSelectionKey, selection);\n },\n [modelSelectionKey],\n );\n\n const handleModelChange = useCallback(\n (model: string, engine: string) => {\n const threadId = activeThreadIdRef.current;\n if (!threadId) return;\n const existing = threadModelRef.current.get(threadId);\n const existingEffort = existing?.effort ?? \"auto\";\n const effortOptions = getReasoningEffortOptionsForModel(model);\n const effort =\n existingEffort === \"auto\" || effortOptions.includes(existingEffort)\n ? existingEffort\n : \"auto\";\n const selection = { model, engine, effort };\n threadModelRef.current.set(threadId, selection);\n persistModelSelection(selection);\n bumpModelSelectionVersion();\n },\n [bumpModelSelectionVersion, persistModelSelection],\n );\n\n const handleEffortChange = useCallback(\n (effort: ReasoningEffort) => {\n const threadId = activeThreadIdRef.current;\n if (!threadId) return;\n const existing = resolveThreadModelSelection(threadId);\n const model = existing?.model ?? defaultModel;\n const engine =\n existing?.engine ??\n availableModels.find((group) => group.models.includes(model))?.engine ??\n availableModels[0]?.engine;\n const selection: ModelSelection = { model, effort };\n if (engine) selection.engine = engine;\n threadModelRef.current.set(threadId, selection);\n persistModelSelection(selection);\n bumpModelSelectionVersion();\n },\n [\n availableModels,\n bumpModelSelectionVersion,\n defaultModel,\n persistModelSelection,\n resolveThreadModelSelection,\n ],\n );\n\n const refreshEngines = useCallback(() => {\n Promise.all([\n fetch(agentNativePath(\"/_agent-native/actions/manage-agent-engine\"), {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({ action: \"list\" }),\n }).then((r) => (r.ok ? r.json() : null)),\n fetch(agentNativePath(\"/_agent-native/env-status\"))\n .then((r) => (r.ok ? r.json() : []))\n .catch(() => []),\n fetch(agentNativePath(\"/_agent-native/builder/status\"))\n .then((r) => (r.ok ? r.json() : null))\n .catch(() => null),\n ])\n .then(([enginesData, envKeys, builderStatus]) => {\n if (!enginesData?.engines) return;\n const configuredKeys = new Set(\n (envKeys as Array<{ key: string; configured: boolean }>)\n .filter((k) => k.configured)\n .map((k) => k.key),\n );\n const builderConnected = builderStatus?.configured === true;\n const currentEngineName: string | undefined =\n enginesData.current?.engine;\n const currentModel: string | undefined = enginesData.current?.model;\n\n let groups: EngineModelGroup[];\n\n if (builderConnected) {\n // When Builder.io is connected, show all Builder-supported\n // models grouped by provider — all route through the builder\n // engine so no individual API keys are needed.\n const builderEngine = enginesData.engines.find(\n (e: any) => e.name === \"builder\",\n );\n const builderModels: string[] = builderEngine?.supportedModels ?? [];\n const claude = builderModels.filter((m: string) =>\n m.startsWith(\"claude-\"),\n );\n const openai = builderModels.filter((m: string) =>\n m.startsWith(\"gpt-\"),\n );\n const gemini = builderModels.filter((m: string) =>\n m.startsWith(\"gemini-\"),\n );\n\n groups = [\n ...(claude.length\n ? [\n {\n engine: \"builder\",\n label: \"Claude\",\n models: claude,\n configured: true,\n },\n ]\n : []),\n ...(openai.length\n ? [\n {\n engine: \"builder\",\n label: \"OpenAI\",\n models: openai,\n configured: true,\n },\n ]\n : []),\n ...(gemini.length\n ? [\n {\n engine: \"builder\",\n label: \"Gemini\",\n models: gemini,\n configured: true,\n },\n ]\n : []),\n ];\n\n // Ensure the current model shows in the list even if it's not\n // in BUILDER_SUPPORTED_MODELS (e.g. custom model string).\n if (currentModel && !builderModels.includes(currentModel)) {\n const firstGroup = groups[0];\n if (firstGroup) firstGroup.models.unshift(currentModel);\n }\n } else {\n // No Builder connection — show SDK engines that have API keys.\n const allowedEngines = new Set([\n \"anthropic\",\n \"ai-sdk:openai\",\n \"ai-sdk:google\",\n ]);\n groups = enginesData.engines\n .filter((e: any) => allowedEngines.has(e.name))\n .map((e: any) => {\n const models = [...e.supportedModels];\n if (\n e.name === currentEngineName &&\n currentModel &&\n !models.includes(currentModel)\n ) {\n models.unshift(currentModel);\n }\n return {\n engine: e.name,\n label: e.label,\n models,\n configured:\n e.requiredEnvVars.length === 0 ||\n e.requiredEnvVars.some((v: string) =>\n configuredKeys.has(v),\n ) ||\n e.name === currentEngineName,\n };\n });\n }\n setAvailableModels(groups);\n setDefaultModel(currentModel ?? DEFAULT_MODEL);\n })\n .catch(() => {});\n }, []);\n\n useEffect(() => {\n refreshEngines();\n window.addEventListener(\"agent-engine:configured-changed\", refreshEngines);\n return () =>\n window.removeEventListener(\n \"agent-engine:configured-changed\",\n refreshEngines,\n );\n }, [refreshEngines]);\n\n // Parent-child thread mapping — persisted to localStorage.\n // Maps childThreadId → parentThreadId for sub-agent tabs.\n const PARENT_MAP_KEY = `agent-chat-parent-map${keyPrefix}`;\n const [parentMap, setParentMap] = useState<Record<string, string>>(() => {\n try {\n const saved = localStorage.getItem(PARENT_MAP_KEY);\n if (saved) return JSON.parse(saved);\n } catch {}\n return {};\n });\n\n // Persist parent map to localStorage\n useEffect(() => {\n try {\n localStorage.setItem(PARENT_MAP_KEY, JSON.stringify(parentMap));\n } catch {}\n }, [parentMap, PARENT_MAP_KEY]);\n\n // Sub-agent display names — persisted to localStorage.\n // Maps childThreadId → short name (e.g. \"Research\", \"Draft email\").\n const SUB_AGENT_NAMES_KEY = `agent-chat-sub-agent-names${keyPrefix}`;\n const [subAgentNames, setSubAgentNames] = useState<Record<string, string>>(\n () => {\n try {\n const saved = localStorage.getItem(SUB_AGENT_NAMES_KEY);\n if (saved) return JSON.parse(saved);\n } catch {}\n return {};\n },\n );\n\n useEffect(() => {\n try {\n localStorage.setItem(SUB_AGENT_NAMES_KEY, JSON.stringify(subAgentNames));\n } catch {}\n }, [subAgentNames, SUB_AGENT_NAMES_KEY]);\n\n // Open tabs — persisted to localStorage so they survive refresh.\n const OPEN_TABS_KEY = `agent-chat-open-tabs${keyPrefix}`;\n const [openTabIds, setOpenTabIds] = useState<string[]>(() => {\n try {\n const saved = localStorage.getItem(OPEN_TABS_KEY);\n if (saved) {\n const parsed = JSON.parse(saved);\n if (Array.isArray(parsed) && parsed.length > 0) {\n // Mark restored tabs as mounted\n for (const id of parsed) mountedTabsRef.current.add(id);\n return parsed;\n }\n }\n } catch {}\n return [];\n });\n const initializedRef = useRef(false);\n\n // Persist open tab IDs to localStorage (exclude sub-agent tabs — they're session-only)\n useEffect(() => {\n const mainTabs = openTabIds.filter((id) => !parentMap[id]);\n if (mainTabs.length > 0) {\n try {\n localStorage.setItem(OPEN_TABS_KEY, JSON.stringify(mainTabs));\n } catch {}\n }\n }, [openTabIds, parentMap, OPEN_TABS_KEY]);\n\n // Initialize open tabs once threads load — validate saved tabs still exist\n useEffect(() => {\n if (initializedRef.current || !activeThreadId || threads.length === 0)\n return;\n initializedRef.current = true;\n const threadIds = new Set(threads.map((t) => t.id));\n const threadMap = new Map(threads.map((t) => [t.id, t]));\n\n // Auto-close only empty tabs inactive for more than 4 hours. Non-empty\n // conversations should survive refresh even if they are old; otherwise the\n // chat appears to disappear even though it still exists in history.\n const STALE_THRESHOLD_MS = 4 * 60 * 60 * 1000;\n const now = Date.now();\n const isStale = (id: string) => {\n const thread = threadMap.get(id);\n return thread\n ? thread.messageCount === 0 &&\n now - thread.updatedAt > STALE_THRESHOLD_MS\n : false;\n };\n\n // If the active thread is a sub-agent, switch to its parent or the most recent main thread\n if (parentMap[activeThreadId]) {\n const parent = parentMap[activeThreadId];\n if (parent && threadIds.has(parent)) {\n switchThread(parent);\n } else {\n // Fall back to most recent main thread\n const mainThread = threads.find((t) => !parentMap[t.id]);\n if (mainThread) switchThread(mainThread.id);\n }\n }\n\n setOpenTabIds((prev) => {\n // Filter out tabs that no longer exist, sub-agent tabs, or stale tabs (>4h inactive)\n const valid = prev.filter(\n (id) => threadIds.has(id) && !parentMap[id] && !isStale(id),\n );\n // Ensure active thread is included (only if it's not a sub-agent and not stale)\n if (\n !parentMap[activeThreadId] &&\n !valid.includes(activeThreadId) &&\n !isStale(activeThreadId)\n ) {\n valid.push(activeThreadId);\n }\n return valid;\n });\n\n // If active thread is stale, start fresh\n if (!parentMap[activeThreadId] && isStale(activeThreadId)) {\n createThread();\n }\n }, [activeThreadId, threads, parentMap, switchThread, createThread]);\n\n // Ensure active thread is always in open tabs.\n // Use functional update to check inside the setter — avoids race with the\n // initialization effect that may have already added the ID in the same batch.\n useEffect(() => {\n if (activeThreadId) {\n setOpenTabIds((prev) =>\n prev.includes(activeThreadId) ? prev : [...prev, activeThreadId],\n );\n }\n }, [activeThreadId]);\n\n // Ensure at least one tab is always open — auto-create if sidebar is empty.\n // Skipped when an active thread already exists (e.g. the hook generated an\n // optimistic id for a brand-new session); the activeThreadId effect above\n // adds it to openTabIds without spinning up a duplicate thread.\n const autoCreatingRef = useRef(false);\n useEffect(() => {\n if (isLoading || autoCreatingRef.current) return;\n if (openTabIds.length === 0 && !activeThreadId) {\n autoCreatingRef.current = true;\n createThread().then((id) => {\n autoCreatingRef.current = false;\n if (id) {\n newThreadIds.current.add(id);\n setOpenTabIds([id]);\n }\n });\n }\n }, [isLoading, openTabIds, activeThreadId, createThread]);\n\n // Focus the composer when switching tabs\n useEffect(() => {\n if (!activeThreadId) return;\n // Small delay to ensure the tab is visible before focusing\n const t = setTimeout(() => {\n chatRefs.current.get(activeThreadId)?.focusComposer();\n }, 50);\n return () => clearTimeout(t);\n }, [activeThreadId]);\n\n // Ref callback: scroll the active tab into view in the overflow container.\n // Uses getBoundingClientRect for reliable positioning regardless of offsetParent.\n // A margin keeps the active tab from sitting flush against either container\n // edge — at the right edge it was landing directly under the +/history/menu\n // buttons, which visually clipped the tab label.\n const activeTabRefCb = useCallback((el: HTMLElement | null) => {\n if (!el) return;\n const container = el.parentElement;\n if (!container) return;\n const MARGIN = 24;\n requestAnimationFrame(() => {\n const containerRect = container.getBoundingClientRect();\n const tabRect = el.getBoundingClientRect();\n if (tabRect.left < containerRect.left + MARGIN) {\n container.scrollLeft += tabRect.left - containerRect.left - MARGIN;\n } else if (tabRect.right > containerRect.right - MARGIN) {\n container.scrollLeft += tabRect.right - containerRect.right + MARGIN;\n }\n });\n }, []);\n\n const [messageCounts, setMessageCounts] = useState<Record<string, number>>(\n () => Object.fromEntries(threads.map((t) => [t.id, t.messageCount ?? 0])),\n );\n\n // Sync message counts from threads when they load\n useEffect(() => {\n if (threads.length > 0) {\n setMessageCounts((prev) => {\n const next = { ...prev };\n for (const t of threads) {\n if (!(t.id in next)) {\n next[t.id] = t.messageCount ?? 0;\n }\n }\n return next;\n });\n }\n }, [threads]);\n\n // Listen for builder.submitChat postMessages\n useEffect(() => {\n const handler = (event: MessageEvent) => {\n if (!isTrustedFrameMessage(event)) return;\n if (event.data?.type !== \"agentNative.submitChat\") return;\n const message = event.data.data?.message as string;\n if (!message) return;\n const context = event.data.data?.context as string | undefined;\n const openSidebar = event.data.data?.openSidebar as boolean | undefined;\n const model = event.data.data?.model as string | undefined;\n const effort = event.data.data?.effort as unknown;\n const newTab = event.data.data?.newTab as boolean | undefined;\n const tabId = event.data.data?.tabId;\n const requestedTabId = typeof tabId === \"string\" ? tabId : undefined;\n const background = event.data.data?.background as boolean | undefined;\n\n // Make sure the sidebar is visible to show the response, unless the\n // caller explicitly opted out or it's a background send.\n if (openSidebar !== false && !background) {\n window.dispatchEvent(new CustomEvent(\"agent-panel:open\"));\n }\n if (postMessageSubmissionsDisabled) return;\n\n // Plan mode is sent as request metadata by the chat adapter. Keep the\n // user-visible message clean so mode instructions never enter history.\n const fullMessage = context\n ? `${message}\\n\\n<context>\\n${context}\\n</context>`\n : message;\n\n const sendToTab = (threadId: string) => {\n // If a model override was specified, apply it only if we recognize it\n if (model) {\n const matchedGroup = availableModels.find((g) =>\n g.models.includes(model),\n );\n if (matchedGroup) {\n const requestedEffort = isReasoningEffort(effort) ? effort : \"auto\";\n const effortOptions = getReasoningEffortOptionsForModel(model);\n const selectedEffort =\n requestedEffort === \"auto\" ||\n effortOptions.includes(requestedEffort)\n ? requestedEffort\n : \"auto\";\n threadModelRef.current.set(threadId, {\n model,\n engine: matchedGroup.engine,\n effort: selectedEffort,\n });\n bumpModelSelectionVersion();\n }\n }\n\n const ref = chatRefs.current.get(threadId);\n if (ref) {\n ref.sendMessage(fullMessage);\n } else {\n pendingSends.current.set(threadId, fullMessage);\n }\n };\n\n if (newTab) {\n const previousTabId = activeThreadIdRef.current;\n createThread(requestedTabId).then((newId) => {\n if (newId) {\n newThreadIds.current.add(newId);\n sendToTab(newId);\n if (background && previousTabId) {\n switchThread(previousTabId);\n }\n }\n });\n } else {\n const currentTabId = activeThreadIdRef.current;\n if (!currentTabId) return;\n sendToTab(currentTabId);\n }\n };\n window.addEventListener(\"message\", handler);\n return () => window.removeEventListener(\"message\", handler);\n }, [\n availableModels,\n bumpModelSelectionVersion,\n createThread,\n postMessageSubmissionsDisabled,\n switchThread,\n ]);\n\n // Process pending sends when refs mount\n useEffect(() => {\n for (const [tabId, message] of pendingSends.current) {\n const ref = chatRefs.current.get(tabId);\n if (ref) {\n setTimeout(() => ref.sendMessage(message), 50);\n pendingSends.current.delete(tabId);\n }\n }\n }, [openTabIds]);\n\n // Listen for chatRunning completion events\n useEffect(() => {\n const handler = (e: Event) => {\n const detail = (e as CustomEvent).detail;\n if (!detail) return;\n const { isRunning, tabId } = detail;\n if (!tabId) return;\n\n setRunningThreads((prev) => {\n const next = new Set(prev);\n if (isRunning) {\n next.add(tabId);\n } else {\n next.delete(tabId);\n }\n return next;\n });\n };\n window.addEventListener(\"agentNative.chatRunning\", handler);\n return () => window.removeEventListener(\"agentNative.chatRunning\", handler);\n }, []);\n\n const addTab = useCallback(async () => {\n const id = await createThread();\n if (id) {\n newThreadIds.current.add(id);\n }\n }, [createThread]);\n\n const closeTab = useCallback(\n (tabId: string) => {\n setOpenTabIds((prev) => {\n if (prev.length <= 1) {\n // Last tab — create a new one and replace the old tab atomically\n createThread().then((newId) => {\n if (newId) {\n newThreadIds.current.add(newId);\n setOpenTabIds([newId]);\n }\n });\n return prev; // Keep old tab until new one is ready\n }\n const next = prev.filter((id) => id !== tabId);\n if (tabId === activeThreadIdRef.current && next.length > 0) {\n const idx = prev.indexOf(tabId);\n switchThread(next[Math.min(idx, next.length - 1)]);\n }\n return next;\n });\n chatRefs.current.delete(tabId);\n pendingSends.current.delete(tabId);\n newThreadIds.current.delete(tabId);\n threadModelRef.current.delete(tabId);\n // Clean up parent map and sub-agent names\n setParentMap((prev) => {\n if (!(tabId in prev)) return prev;\n const { [tabId]: _, ...rest } = prev;\n return rest;\n });\n setSubAgentNames((prev) => {\n if (!(tabId in prev)) return prev;\n const { [tabId]: _, ...rest } = prev;\n return rest;\n });\n },\n [switchThread, createThread],\n );\n\n const closeOtherTabs = useCallback(\n (tabId: string) => {\n setOpenTabIds([tabId]);\n if (activeThreadIdRef.current !== tabId) {\n switchThread(tabId);\n }\n // Clean up refs for closed tabs\n for (const key of chatRefs.current.keys()) {\n if (key !== tabId) {\n chatRefs.current.delete(key);\n pendingSends.current.delete(key);\n newThreadIds.current.delete(key);\n threadModelRef.current.delete(key);\n }\n }\n // Clean up parent map and sub-agent names — only keep entries for the surviving tab\n setParentMap((prev) => {\n if (tabId in prev) return { [tabId]: prev[tabId] };\n return {};\n });\n setSubAgentNames((prev) => {\n if (tabId in prev) return { [tabId]: prev[tabId] };\n return {};\n });\n },\n [switchThread],\n );\n\n const closeAllTabs = useCallback(async () => {\n const id = await createThread();\n if (id) {\n newThreadIds.current.add(id);\n setOpenTabIds([id]);\n switchThread(id);\n // Clean up all old refs\n chatRefs.current.clear();\n pendingSends.current.clear();\n threadModelRef.current.clear();\n setParentMap({});\n setSubAgentNames({});\n }\n }, [createThread, switchThread]);\n\n // Keyboard shortcuts dispatched from AgentPanel based on the active mode\n useEffect(() => {\n const handleCloseCurrent = () => {\n const id = activeThreadIdRef.current;\n if (id) closeTab(id);\n };\n const handleCloseAll = () => {\n void closeAllTabs();\n };\n window.addEventListener(\"agent-chat:close-current-tab\", handleCloseCurrent);\n window.addEventListener(\"agent-chat:close-all-tabs\", handleCloseAll);\n return () => {\n window.removeEventListener(\n \"agent-chat:close-current-tab\",\n handleCloseCurrent,\n );\n window.removeEventListener(\"agent-chat:close-all-tabs\", handleCloseAll);\n };\n }, [closeTab, closeAllTabs]);\n\n const clearActiveTab = useCallback(() => {\n addTab();\n }, [addTab]);\n\n const openFromHistory = useCallback(\n (threadId: string) => {\n if (!openTabIds.includes(threadId)) {\n setOpenTabIds((prev) => [...prev, threadId]);\n }\n switchThread(threadId);\n },\n [openTabIds, switchThread],\n );\n\n // Listen for agent-task-open events (from AgentTaskCard \"Open\" button)\n useEffect(() => {\n function handleOpenTask(e: Event) {\n const detail = (e as CustomEvent).detail;\n const threadId = detail?.threadId;\n if (!threadId) return;\n // The current active thread is the parent that spawned this sub-agent\n const parentId = activeThreadIdRef.current;\n if (parentId && parentId !== threadId) {\n setParentMap((prev) =>\n prev[threadId] === parentId\n ? prev\n : { ...prev, [threadId]: parentId },\n );\n }\n // Store the sub-agent name/description for the tab label\n const name = detail.name || detail.description || \"\";\n if (name) {\n setSubAgentNames((prev) =>\n prev[threadId] === name ? prev : { ...prev, [threadId]: name },\n );\n }\n // Refresh thread list so the new sub-agent thread appears with its title\n refreshThreads();\n // Open the sub-agent thread as a tab — insert after parent for visual grouping\n if (!openTabIds.includes(threadId)) {\n setOpenTabIds((prev) => {\n if (parentId) {\n const parentIdx = prev.indexOf(parentId);\n if (parentIdx !== -1) {\n // Insert after the parent (and any existing children of that parent)\n const next = [...prev];\n let insertIdx = parentIdx + 1;\n // Skip past any existing children of the same parent\n while (\n insertIdx < next.length &&\n parentMap[next[insertIdx]] === parentId\n ) {\n insertIdx++;\n }\n next.splice(insertIdx, 0, threadId);\n return next;\n }\n }\n return [...prev, threadId];\n });\n }\n switchThread(threadId);\n }\n window.addEventListener(\"agent-task-open\", handleOpenTask);\n return () => window.removeEventListener(\"agent-task-open\", handleOpenTask);\n }, [openTabIds, switchThread, refreshThreads, parentMap]);\n\n // Watch for agent-issued chat-command in application-state\n const lastChatCommandRef = useRef(0);\n useEffect(() => {\n let stopped = false;\n let timer: ReturnType<typeof setTimeout> | null = null;\n\n async function pollChatCommand() {\n if (stopped) return;\n try {\n const res = await fetch(\n agentNativePath(\"/_agent-native/application-state/chat-command\"),\n );\n if (res.ok) {\n const data = await res.json();\n if (\n data?.value?.command === \"open-thread\" &&\n data.value.threadId &&\n data.value.timestamp > lastChatCommandRef.current\n ) {\n lastChatCommandRef.current = data.value.timestamp;\n const threadId = data.value.threadId as string;\n // Open the thread as a tab and focus it\n if (!openTabIds.includes(threadId)) {\n setOpenTabIds((prev) => [...prev, threadId]);\n }\n switchThread(threadId);\n // Clear the command\n fetch(\n agentNativePath(\"/_agent-native/application-state/chat-command\"),\n {\n method: \"DELETE\",\n headers: { \"X-Agent-Native-CSRF\": \"1\" },\n },\n ).catch(() => {});\n }\n }\n } catch {}\n if (!stopped) {\n timer = setTimeout(pollChatCommand, 2000);\n }\n }\n\n pollChatCommand();\n return () => {\n stopped = true;\n if (timer) clearTimeout(timer);\n };\n }, [openTabIds, switchThread]);\n\n const handleGenerateTitle = useCallback(\n (threadId: string, message: string) => {\n generateTitle(threadId, message).then((title) => {\n if (title) {\n // Persist the generated title to the server\n saveThreadData(threadId, {\n threadData: \"\",\n title,\n preview: message.slice(0, 120),\n });\n }\n });\n },\n [generateTitle, saveThreadData],\n );\n\n const handleSaveThread = useCallback(\n (\n threadId: string,\n data: {\n threadData: string;\n title: string;\n preview: string;\n messageCount: number;\n },\n ) => {\n saveThreadData(threadId, data);\n },\n [saveThreadData],\n );\n\n // ─── Slash command handler ──────────────────────────────────────────\n const [helpVisible, setHelpVisible] = useState(false);\n\n const handleSlashCommand = useCallback(\n (command: string) => {\n switch (command) {\n case \"clear\":\n case \"new\":\n addTab();\n break;\n case \"history\":\n setShowHistory(true);\n break;\n case \"plan\":\n props.onExecModeChange?.(\"plan\");\n break;\n case \"act\":\n props.onExecModeChange?.(\"build\");\n break;\n case \"help\":\n setHelpVisible(true);\n break;\n }\n },\n [addTab, props.onExecModeChange],\n );\n\n const handleForkChat = useCallback(\n async (sourceThreadId: string) => {\n const forkedId = await forkThread(sourceThreadId);\n if (!forkedId) return;\n setOpenTabIds((prev) => {\n const idx = prev.indexOf(sourceThreadId);\n if (idx !== -1) {\n const next = [...prev];\n next.splice(idx + 1, 0, forkedId);\n return next;\n }\n return [...prev, forkedId];\n });\n switchThread(forkedId);\n },\n [forkThread, switchThread],\n );\n\n // Build tabs from open thread IDs\n const threadMap = new Map(threads.map((t) => [t.id, t]));\n const tabs: ChatTab[] = openTabIds\n .filter((id) => threadMap.has(id) || id === activeThreadId)\n .map((id) => {\n const t = threadMap.get(id);\n return {\n id,\n label: t?.title || t?.preview?.slice(0, 30) || \"New chat\",\n status: runningThreads.has(id)\n ? (\"running\" as const)\n : (messageCounts[id] ?? t?.messageCount ?? 0) > 0\n ? (\"completed\" as const)\n : (\"idle\" as const),\n parentThreadId: parentMap[id],\n subAgentName: subAgentNames[id],\n };\n });\n\n // Include sub-agent tabs that aren't in threadMap yet (just created, not refreshed)\n for (const id of openTabIds) {\n if (!tabs.some((t) => t.id === id)) {\n tabs.push({\n id,\n label:\n subAgentNames[id] || (parentMap[id] ? \"Sub-agent...\" : \"New chat\"),\n status: \"running\" as const,\n parentThreadId: parentMap[id],\n subAgentName: subAgentNames[id],\n });\n }\n }\n\n const headerProps: MultiTabAssistantChatHeaderProps = {\n tabs,\n activeTabId: activeThreadId ?? \"\",\n activeTabMessageCount: activeThreadId\n ? (messageCounts[activeThreadId] ?? 0)\n : 0,\n setActiveTabId: switchThread,\n addTab,\n closeTab,\n closeOtherTabs,\n closeAllTabs,\n clearActiveTab,\n showHistory,\n toggleHistory: () => setShowHistory((v) => !v),\n tabCount: openTabIds.length,\n };\n\n // No full-shell skeleton: the hook seeds an optimistic activeThreadId\n // synchronously so the chat shell + composer can paint on first render.\n // Per-thread restore (existing chats with history) shows its own message-area\n // skeleton inside AssistantChat — header and composer stay visible.\n if (isLoading && !activeThreadId) {\n return (\n <ChatSkeleton\n header={renderHeader?.(headerProps)}\n headerOnly={contentHidden}\n />\n );\n }\n\n return (\n <div className=\"flex flex-1 flex-col h-full min-h-0 overflow-x-hidden\">\n {/* Tailwind group-hover/tab doesn't work in core package — inject directly */}\n <style\n dangerouslySetInnerHTML={{\n __html:\n \".agent-tab-close{opacity:0}.agent-tab:hover .agent-tab-close{opacity:1}\" +\n \".agent-tabs-scroll{scrollbar-width:none;-ms-overflow-style:none;}\" +\n \".agent-tabs-scroll::-webkit-scrollbar{display:none;}\",\n }}\n />\n {renderHeader\n ? renderHeader(headerProps)\n : showTabBar\n ? (() => {\n const activeTab = tabs.find((t) => t.id === activeThreadId);\n const focusParentId = activeTab?.parentThreadId || activeThreadId;\n const childTabs = tabs.filter(\n (t) => t.parentThreadId === focusParentId,\n );\n const hasSubTabs = childTabs.length > 0;\n const mainTabs = tabs.filter((t) => !t.parentThreadId);\n\n return (\n <>\n <div className=\"flex items-center px-1 py-1 border-b border-border shrink-0 gap-0.5\">\n <div className=\"agent-tabs-scroll flex items-center gap-0.5 min-w-0 overflow-x-auto flex-1\">\n {mainTabs.map((tab) => {\n const isActive =\n tab.id === activeThreadId ||\n (tab.id === focusParentId &&\n activeTab?.parentThreadId === tab.id);\n return (\n <div\n key={tab.id}\n ref={isActive ? activeTabRefCb : undefined}\n className={cn(\n \"agent-tab relative flex items-center rounded-md text-[11px] font-medium shrink-0 max-w-[130px]\",\n isActive\n ? \"bg-accent text-foreground\"\n : \"text-muted-foreground hover:text-foreground hover:bg-accent\",\n )}\n >\n <button\n type=\"button\"\n onClick={() => switchThread(tab.id)}\n className=\"flex items-center gap-1 px-2.5 py-1.5 min-w-0 flex-1 text-left\"\n >\n <span className=\"truncate pr-1\">{tab.label}</span>\n {tab.status === \"running\" && (\n <span className=\"w-1.5 h-1.5 rounded-full bg-muted-foreground/50 shrink-0 animate-pulse\" />\n )}\n </button>\n <button\n type=\"button\"\n aria-label=\"Close tab\"\n onClick={(e) => {\n e.stopPropagation();\n e.preventDefault();\n closeTab(tab.id);\n }}\n className=\"agent-tab-close flex items-center justify-end text-muted-foreground hover:!text-foreground\"\n style={{\n position: \"absolute\",\n right: 0,\n top: 0,\n bottom: 0,\n width: 28,\n paddingRight: 6,\n borderRadius: \"0 6px 6px 0\",\n background:\n \"linear-gradient(to right, transparent, hsl(var(--accent)) 40%)\",\n }}\n >\n <IconX size={12} />\n </button>\n </div>\n );\n })}\n </div>\n <TooltipProvider delayDuration={200}>\n <div className=\"flex items-center gap-px shrink-0 ml-auto\">\n <Tooltip>\n <TooltipTrigger asChild>\n <button\n onClick={addTab}\n aria-label=\"New chat\"\n className=\"flex h-6 w-6 items-center justify-center rounded text-muted-foreground/60 hover:text-foreground hover:bg-accent/50\"\n >\n <IconPlus size={12} />\n </button>\n </TooltipTrigger>\n <TooltipContent>New chat</TooltipContent>\n </Tooltip>\n <Tooltip>\n <TooltipTrigger asChild>\n <button\n onClick={() => setShowHistory(!showHistory)}\n aria-label=\"All chats\"\n className={cn(\n \"flex h-6 w-6 items-center justify-center rounded text-muted-foreground/60 hover:text-foreground hover:bg-accent/50\",\n showHistory && \"bg-accent text-foreground\",\n )}\n >\n <IconHistory size={12} />\n </button>\n </TooltipTrigger>\n <TooltipContent>All chats</TooltipContent>\n </Tooltip>\n </div>\n </TooltipProvider>\n </div>\n {hasSubTabs && (\n <div className=\"flex items-center px-1 py-0.5 border-b border-border shrink-0 gap-0.5 bg-muted/30\">\n <div className=\"agent-tabs-scroll flex items-center gap-0.5 min-w-0 overflow-x-auto flex-1\">\n <button\n onClick={() => switchThread(focusParentId!)}\n className={cn(\n \"flex shrink-0 items-center gap-1 rounded-md px-2 py-1 text-[10px] font-medium cursor-pointer\",\n activeThreadId === focusParentId\n ? \"bg-accent text-foreground\"\n : \"text-muted-foreground hover:bg-accent hover:text-foreground\",\n )}\n >\n Main\n </button>\n {childTabs.map((tab) => (\n <div\n key={tab.id}\n ref={\n tab.id === activeThreadId\n ? activeTabRefCb\n : undefined\n }\n className={cn(\n \"agent-tab relative flex shrink-0 items-center rounded-md text-[10px] font-medium max-w-[130px]\",\n tab.id === activeThreadId\n ? \"bg-accent text-foreground\"\n : \"text-muted-foreground hover:bg-accent hover:text-foreground\",\n )}\n >\n <button\n type=\"button\"\n onClick={() => switchThread(tab.id)}\n className=\"flex items-center gap-1 px-2 py-1 min-w-0 flex-1 text-left\"\n >\n <span className=\"truncate pr-1\">\n {tab.subAgentName || tab.label}\n </span>\n {tab.status === \"running\" && (\n <span className=\"w-1 h-1 rounded-full bg-muted-foreground/50 shrink-0 animate-pulse\" />\n )}\n </button>\n <button\n type=\"button\"\n aria-label=\"Close tab\"\n onClick={(e) => {\n e.stopPropagation();\n e.preventDefault();\n closeTab(tab.id);\n }}\n className=\"agent-tab-close flex items-center justify-end text-muted-foreground hover:!text-foreground\"\n style={{\n position: \"absolute\",\n right: 0,\n top: 0,\n bottom: 0,\n width: 24,\n paddingRight: 4,\n borderRadius: \"0 6px 6px 0\",\n background:\n \"linear-gradient(to right, transparent, hsl(var(--accent)) 40%)\",\n }}\n >\n <IconX size={12} />\n </button>\n </div>\n ))}\n </div>\n </div>\n )}\n </>\n );\n })()\n : null}\n\n {/* Chat content with optional overlay */}\n <div className=\"relative flex-1 flex flex-col min-h-0\">\n {renderOverlay ? renderOverlay(headerProps) : null}\n\n {/* History popover — rendered inside relative container so positioning works */}\n {showHistory && (\n <HistoryPopover\n threads={threads}\n openTabIds={new Set(openTabIds)}\n onSelect={openFromHistory}\n onClose={() => setShowHistory(false)}\n onSearch={searchThreads}\n />\n )}\n\n {/* Help popover — shown by /help slash command */}\n {helpVisible && <HelpPopover onClose={() => setHelpVisible(false)} />}\n\n {/* Render tabs that have been activated at least once, hide inactive ones to preserve state.\n Sub-agent tabs are only mounted when first focused — prevents stale restore from running\n while the component is display:none before the user switches to it. */}\n {[...new Set(openTabIds)]\n .filter(\n (tabId) =>\n tabId === activeThreadId || mountedTabsRef.current.has(tabId),\n )\n .map((tabId) => {\n const modelSelection = resolveThreadModelSelection(tabId);\n return (\n <div\n key={tabId}\n className=\"flex-1 min-h-0 flex-col\"\n style={{\n display:\n contentHidden || tabId !== activeThreadId ? \"none\" : \"flex\",\n }}\n >\n <RunStuckBanner\n threadId={tabId}\n apiUrl={apiUrl}\n onRetry={() => {\n const handle = chatRefs.current.get(tabId);\n handle?.sendMessage(\n \"Continue from where you left off and finish my last request. Do not repeat completed work.\",\n );\n }}\n />\n <AssistantChat\n {...props}\n ref={(handle) => {\n if (handle) {\n chatRefs.current.set(tabId, handle);\n } else {\n chatRefs.current.delete(tabId);\n }\n }}\n threadId={tabId}\n tabId={tabId}\n apiUrl={apiUrl}\n isNewThread={\n newThreadIds.current.has(tabId) || isNewThread(tabId)\n }\n onMessageCountChange={(count) =>\n setMessageCounts((prev) =>\n prev[tabId] === count\n ? prev\n : { ...prev, [tabId]: count },\n )\n }\n onSaveThread={handleSaveThread}\n onGenerateTitle={handleGenerateTitle}\n onSlashCommand={handleSlashCommand}\n selectedModel={modelSelection?.model}\n selectedEngine={modelSelection?.engine}\n selectedEffort={modelSelection?.effort ?? \"auto\"}\n defaultModel={defaultModel}\n availableModels={availableModels}\n onModelChange={handleModelChange}\n onEffortChange={handleEffortChange}\n onForkChat={() => handleForkChat(tabId)}\n />\n </div>\n );\n })}\n </div>\n </div>\n );\n}\n"]}
|
|
1
|
+
{"version":3,"file":"MultiTabAssistantChat.js","sourceRoot":"","sources":["../../src/client/MultiTabAssistantChat.tsx"],"names":[],"mappings":";AAAA,OAAc,EAAE,QAAQ,EAAE,MAAM,EAAE,SAAS,EAAE,WAAW,EAAE,MAAM,OAAO,CAAC;AACxE,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAC/E,OAAO,EACL,aAAa,GAGd,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EAAE,qBAAqB,EAAE,MAAM,YAAY,CAAC;AACnD,OAAO,EAAE,EAAE,EAAE,MAAM,YAAY,CAAC;AAChC,OAAO,EACL,OAAO,EACP,cAAc,EACd,eAAe,EACf,cAAc,GACf,MAAM,4BAA4B,CAAC;AACpC,OAAO,EAAE,cAAc,EAA0B,MAAM,uBAAuB,CAAC;AAC/E,OAAO,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAChD,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AACrD,OAAO,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAC;AAC1D,OAAO,EACL,iCAAiC,EACjC,iBAAiB,GAElB,MAAM,+BAA+B,CAAC;AAevC,MAAM,2BAA2B,GAAG,oCAAoC,CAAC;AAEzE,SAAS,wBAAwB,CAAC,GAAW;IAC3C,IAAI,OAAO,MAAM,KAAK,WAAW;QAAE,OAAO,SAAS,CAAC;IACpD,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,MAAM,CAAC,YAAY,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;QAC7C,IAAI,CAAC,GAAG;YAAE,OAAO,SAAS,CAAC;QAC3B,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAA4B,CAAC;QAC1D,IAAI,OAAO,MAAM,CAAC,KAAK,KAAK,QAAQ,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,EAAE,EAAE,CAAC;YAC7D,OAAO,SAAS,CAAC;QACnB,CAAC;QACD,MAAM,SAAS,GAAmB;YAChC,KAAK,EAAE,MAAM,CAAC,KAAK;YACnB,MAAM,EAAE,iBAAiB,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM;SAClE,CAAC;QACF,IAAI,OAAO,MAAM,CAAC,MAAM,KAAK,QAAQ;YAAE,SAAS,CAAC,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC;QACxE,OAAO,SAAS,CAAC;IACnB,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,SAAS,CAAC;IACnB,CAAC;AACH,CAAC;AAED,SAAS,yBAAyB,CAAC,GAAW,EAAE,SAAyB;IACvE,IAAI,OAAO,MAAM,KAAK,WAAW;QAAE,OAAO;IAC1C,IAAI,CAAC;QACH,MAAM,CAAC,YAAY,CAAC,OAAO,CAAC,GAAG,EAAE,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC,CAAC;IAC9D,CAAC;IAAC,MAAM,CAAC,CAAA,CAAC;AACZ,CAAC;AAED,SAAS,qBAAqB,CAC5B,SAAqC,EACrC,MAA0B;IAE1B,IAAI,CAAC,SAAS,EAAE,KAAK;QAAE,OAAO,SAAS,CAAC;IACxC,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACxB,MAAM,eAAe,GAAG,SAAS,CAAC,MAAM,IAAI,MAAM,CAAC;QACnD,MAAM,aAAa,GAAG,iCAAiC,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;QACzE,OAAO;YACL,KAAK,EAAE,SAAS,CAAC,KAAK;YACtB,MAAM,EACJ,eAAe,KAAK,MAAM,IAAI,aAAa,CAAC,QAAQ,CAAC,eAAe,CAAC;gBACnE,CAAC,CAAC,eAAe;gBACjB,CAAC,CAAC,MAAM;SACb,CAAC;IACJ,CAAC;IACD,MAAM,cAAc,GAAG,MAAM,CAAC,IAAI,CAChC,CAAC,KAAK,EAAE,EAAE,CACR,KAAK,CAAC,MAAM,KAAK,SAAS,CAAC,MAAM;QACjC,KAAK,CAAC,MAAM,CAAC,QAAQ,CAAC,SAAS,CAAC,KAAK,CAAC,CACzC,CAAC;IACF,MAAM,aAAa,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CAC1C,KAAK,CAAC,MAAM,CAAC,QAAQ,CAAC,SAAS,CAAC,KAAK,CAAC,CACvC,CAAC;IACF,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC,IAAI,CAAC,cAAc,IAAI,CAAC,aAAa,EAAE,CAAC;QAC3D,OAAO,SAAS,CAAC;IACnB,CAAC;IACD,MAAM,MAAM,GACV,cAAc,EAAE,MAAM,IAAI,aAAa,EAAE,MAAM,IAAI,SAAS,CAAC,MAAM,CAAC;IACtE,IAAI,CAAC,MAAM,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC;QAAE,OAAO,SAAS,CAAC;IAEnD,MAAM,eAAe,GAAG,SAAS,CAAC,MAAM,IAAI,MAAM,CAAC;IACnD,MAAM,aAAa,GAAG,iCAAiC,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;IACzE,MAAM,MAAM,GACV,eAAe,KAAK,MAAM,IAAI,aAAa,CAAC,QAAQ,CAAC,eAAe,CAAC;QACnE,CAAC,CAAC,eAAe;QACjB,CAAC,CAAC,MAAM,CAAC;IACb,MAAM,QAAQ,GAAmB,EAAE,KAAK,EAAE,SAAS,CAAC,KAAK,EAAE,MAAM,EAAE,CAAC;IACpE,IAAI,MAAM;QAAE,QAAQ,CAAC,MAAM,GAAG,MAAM,CAAC;IACrC,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED,gFAAgF;AAEhF,SAAS,YAAY,CAAC,EACpB,MAAM,EACN,UAAU,GAAG,KAAK,GAInB;IACC,OAAO,CACL,eACE,SAAS,EAAE,EAAE,CACX,uBAAuB,EACvB,UAAU,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,eAAe,CAC1C,aAEA,MAAM,IAAI,CACT,eAAK,SAAS,EAAC,qEAAqE,aAClF,cAAK,SAAS,EAAC,iDAAiD,GAAG,EACnE,eAAK,SAAS,EAAC,sBAAsB,aACnC,cAAK,SAAS,EAAC,qDAAqD,GAAG,EACvE,cAAK,SAAS,EAAC,qDAAqD,GAAG,IACnE,IACF,CACP,EACA,CAAC,UAAU,IAAI,CACd,eAAK,SAAS,EAAC,gCAAgC,aAC7C,cAAK,SAAS,EAAC,0BAA0B,YACvC,cAAK,SAAS,EAAC,+CAA+C,GAAG,GAC7D,EACN,cAAK,SAAS,EAAC,iDAAiD,GAAG,IAC/D,CACP,IACG,CACP,CAAC;AACJ,CAAC;AAED,gFAAgF;AAEhF,SAAS,cAAc,CAAC,EACtB,OAAO,EACP,UAAU,EACV,cAAc,EACd,QAAQ,EACR,OAAO,EACP,QAAQ,GAQT;IACC,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,GAAG,QAAQ,CAAC,EAAE,CAAC,CAAC;IACzC,MAAM,CAAC,aAAa,EAAE,gBAAgB,CAAC,GAAG,QAAQ,CAEhD,IAAI,CAAC,CAAC;IACR,MAAM,CAAC,WAAW,EAAE,cAAc,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;IACtD,MAAM,QAAQ,GAAG,MAAM,CAAmB,IAAI,CAAC,CAAC;IAChD,MAAM,WAAW,GAAG,MAAM,CAAgC,SAAS,CAAC,CAAC;IAErE,SAAS,CAAC,GAAG,EAAE;QACb,QAAQ,CAAC,OAAO,EAAE,KAAK,EAAE,CAAC;IAC5B,CAAC,EAAE,EAAE,CAAC,CAAC;IAEP,SAAS,CAAC,GAAG,EAAE;QACb,MAAM,OAAO,GAAG,CAAC,CAAgB,EAAE,EAAE;YACnC,IAAI,CAAC,CAAC,GAAG,KAAK,QAAQ;gBAAE,OAAO,EAAE,CAAC;QACpC,CAAC,CAAC;QACF,MAAM,CAAC,gBAAgB,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;QAC5C,OAAO,GAAG,EAAE,CAAC,MAAM,CAAC,mBAAmB,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;IAC9D,CAAC,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC;IAEd,+BAA+B;IAC/B,MAAM,WAAW,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC;IAC9B,SAAS,CAAC,GAAG,EAAE;QACb,IAAI,WAAW,CAAC,OAAO;YAAE,YAAY,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC;QAC3D,MAAM,CAAC,GAAG,MAAM,CAAC,IAAI,EAAE,CAAC;QACxB,IAAI,CAAC,CAAC,EAAE,CAAC;YACP,WAAW,CAAC,OAAO,EAAE,CAAC;YACtB,gBAAgB,CAAC,IAAI,CAAC,CAAC;YACvB,cAAc,CAAC,KAAK,CAAC,CAAC;YACtB,OAAO;QACT,CAAC;QACD,cAAc,CAAC,IAAI,CAAC,CAAC;QACrB,MAAM,EAAE,GAAG,EAAE,WAAW,CAAC,OAAO,CAAC;QACjC,WAAW,CAAC,OAAO,GAAG,UAAU,CAAC,KAAK,IAAI,EAAE;YAC1C,IAAI,QAAQ,EAAE,CAAC;gBACb,MAAM,OAAO,GAAG,MAAM,QAAQ,CAAC,CAAC,CAAC,CAAC;gBAClC,IAAI,EAAE,KAAK,WAAW,CAAC,OAAO;oBAAE,OAAO;gBACvC,gBAAgB,CAAC,OAAO,CAAC,CAAC;YAC5B,CAAC;iBAAM,CAAC;gBACN,oCAAoC;gBACpC,gBAAgB,CAAC,IAAI,CAAC,CAAC;YACzB,CAAC;YACD,cAAc,CAAC,KAAK,CAAC,CAAC;QACxB,CAAC,EAAE,GAAG,CAAC,CAAC;QACR,OAAO,GAAG,EAAE;YACV,IAAI,WAAW,CAAC,OAAO;gBAAE,YAAY,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC;QAC7D,CAAC,CAAC;IACJ,CAAC,EAAE,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC,CAAC;IAEvB,yEAAyE;IACzE,wEAAwE;IACxE,uEAAuE;IACvE,+DAA+D;IAC/D,MAAM,cAAc,GAAG,OAAO,CAAC,MAAM,CACnC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,YAAY,GAAG,CAAC,IAAI,CAAC,CAAC,EAAE,KAAK,cAAc,CACrD,CAAC;IAEF,MAAM,QAAQ,GAAG,MAAM,CAAC,IAAI,EAAE;QAC5B,CAAC,CAAC,CAAC,aAAa,IAAI,cAAc,CAAC,CAAC,MAAM,CACtC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,YAAY,GAAG,CAAC,IAAI,CAAC,CAAC,EAAE,KAAK,cAAc,CACrD;QACH,CAAC,CAAC,cAAc,CAAC;IAEnB,MAAM,UAAU,GAAG,CAAC,EAAU,EAAE,EAAE;QAChC,MAAM,CAAC,GAAG,IAAI,IAAI,CAAC,EAAE,CAAC,CAAC;QACvB,MAAM,GAAG,GAAG,IAAI,IAAI,EAAE,CAAC;QACvB,MAAM,MAAM,GAAG,GAAG,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC,OAAO,EAAE,CAAC;QAC3C,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,GAAG,QAAQ,CAAC,CAAC;QAC/C,IAAI,QAAQ,KAAK,CAAC;YAChB,OAAO,CAAC,CAAC,kBAAkB,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC,CAAC;QAC1E,IAAI,QAAQ,KAAK,CAAC;YAAE,OAAO,WAAW,CAAC;QACvC,IAAI,QAAQ,GAAG,CAAC;YAAE,OAAO,CAAC,CAAC,kBAAkB,CAAC,EAAE,EAAE,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC,CAAC;QACxE,OAAO,CAAC,CAAC,kBAAkB,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE,GAAG,EAAE,SAAS,EAAE,CAAC,CAAC;IACtE,CAAC,CAAC;IAEF,OAAO,CACL,8BACE,cAAK,SAAS,EAAC,oBAAoB,EAAC,OAAO,EAAE,OAAO,GAAI,EACxD,eAAK,SAAS,EAAC,uFAAuF,aACpG,eAAK,SAAS,EAAC,0DAA0D,aACvE,KAAC,UAAU,IAAC,IAAI,EAAE,EAAE,GAAI,EACxB,gBACE,GAAG,EAAE,QAAQ,EACb,IAAI,EAAC,MAAM,EACX,KAAK,EAAE,MAAM,EACb,QAAQ,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAC1C,WAAW,EAAC,iBAAiB,EAC7B,SAAS,EAAC,8FAA8F,GACxG,IACE,EACN,cAAK,SAAS,EAAC,+BAA+B,YAC3C,WAAW,CAAC,CAAC,CAAC,CACb,cAAK,SAAS,EAAC,qDAAqD,6BAE9D,CACP,CAAC,CAAC,CAAC,QAAQ,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,CAC1B,cAAK,SAAS,EAAC,qDAAqD,YACjE,MAAM,CAAC,CAAC,CAAC,mBAAmB,CAAC,CAAC,CAAC,cAAc,GAC1C,CACP,CAAC,CAAC,CAAC,CACF,QAAQ,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE;4BACtB,MAAM,QAAQ,GAAG,MAAM,CAAC,EAAE,KAAK,cAAc,CAAC;4BAC9C,OAAO,CACL,kBAEE,OAAO,EAAE,GAAG,EAAE;oCACZ,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;oCACpB,OAAO,EAAE,CAAC;gCACZ,CAAC,EACD,SAAS,EAAE,EAAE,CACX,+CAA+C,EAC/C,QAAQ,IAAI,cAAc,CAC3B,aAED,eAAK,SAAS,EAAC,2CAA2C,aACxD,eAAM,SAAS,EAAC,8CAA8C,YAC3D,MAAM,CAAC,KAAK,IAAI,MAAM,CAAC,OAAO,IAAI,MAAM,GACpC,EACP,eAAM,SAAS,EAAC,4CAA4C,YACzD,QAAQ;oDACP,CAAC,CAAC,QAAQ;oDACV,CAAC,CAAC,UAAU,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC;wDACzB,CAAC,CAAC,MAAM;wDACR,CAAC,CAAC,UAAU,CAAC,MAAM,CAAC,SAAS,CAAC,GAC7B,IACH,EACL,MAAM,CAAC,OAAO,IAAI,MAAM,CAAC,KAAK,KAAK,MAAM,CAAC,OAAO,IAAI,CACpD,cAAK,SAAS,EAAC,mDAAmD,YAC/D,MAAM,CAAC,OAAO,GACX,CACP,KA1BI,MAAM,CAAC,EAAE,CA2BP,CACV,CAAC;wBACJ,CAAC,CAAC,CACH,GACG,IACF,IACL,CACJ,CAAC;AACJ,CAAC;AAED,gFAAgF;AAEhF,SAAS,WAAW,CAAC,EAAE,OAAO,EAA2B;IACvD,SAAS,CAAC,GAAG,EAAE;QACb,MAAM,OAAO,GAAG,CAAC,CAAgB,EAAE,EAAE;YACnC,IAAI,CAAC,CAAC,GAAG,KAAK,QAAQ;gBAAE,OAAO,EAAE,CAAC;QACpC,CAAC,CAAC;QACF,MAAM,CAAC,gBAAgB,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;QAC5C,OAAO,GAAG,EAAE,CAAC,MAAM,CAAC,mBAAmB,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;IAC9D,CAAC,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC;IAEd,MAAM,QAAQ,GAAG;QACf;YACE,IAAI,EAAE,QAAQ;YACd,WAAW,EAAE,kDAAkD;SAChE;QACD,EAAE,IAAI,EAAE,MAAM,EAAE,WAAW,EAAE,gBAAgB,EAAE;QAC/C,EAAE,IAAI,EAAE,UAAU,EAAE,WAAW,EAAE,kBAAkB,EAAE;QACrD,EAAE,IAAI,EAAE,OAAO,EAAE,WAAW,EAAE,8BAA8B,EAAE;QAC9D,EAAE,IAAI,EAAE,MAAM,EAAE,WAAW,EAAE,uBAAuB,EAAE;QACtD,EAAE,IAAI,EAAE,OAAO,EAAE,WAAW,EAAE,4BAA4B,EAAE;QAC5D,EAAE,IAAI,EAAE,GAAG,EAAE,WAAW,EAAE,qCAAqC,EAAE;KAClE,CAAC;IAEF,OAAO,CACL,8BACE,cAAK,SAAS,EAAC,oBAAoB,EAAC,OAAO,EAAE,OAAO,GAAI,EACxD,eAAK,SAAS,EAAC,uFAAuF,aACpG,eAAK,SAAS,EAAC,oEAAoE,aACjF,eAAM,SAAS,EAAC,qCAAqC,mCAE9C,EACP,iBACE,OAAO,EAAE,OAAO,gBACL,YAAY,EACvB,SAAS,EAAC,8FAA8F,YAExG,KAAC,KAAK,IAAC,IAAI,EAAE,EAAE,GAAI,GACZ,IACL,EACN,cAAK,SAAS,EAAC,MAAM,YAClB,QAAQ,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CACrB,eAAoB,SAAS,EAAC,aAAa,aACzC,cAAK,SAAS,EAAC,qCAAqC,YACjD,GAAG,CAAC,IAAI,GACL,EACN,cAAK,SAAS,EAAC,mCAAmC,YAC/C,GAAG,CAAC,WAAW,GACZ,KANE,GAAG,CAAC,IAAI,CAOZ,CACP,CAAC,GACE,IACF,IACL,CACJ,CAAC;AACJ,CAAC;AAiDD,MAAM,UAAU,qBAAqB,CAAC,EACpC,UAAU,GAAG,IAAI,EACjB,YAAY,EACZ,aAAa,EACb,aAAa,GAAG,KAAK,EACrB,MAAM,GAAG,eAAe,CAAC,2BAA2B,CAAC,EACrD,UAAU,EACV,GAAG,KAAK,EACmB;IAC3B,MAAM,EACJ,OAAO,EACP,cAAc,EACd,SAAS,EACT,YAAY,EACZ,YAAY,EACZ,YAAY,EACZ,UAAU,EACV,cAAc,EACd,aAAa,EACb,aAAa,EACb,cAAc,EACd,WAAW,GACZ,GAAG,cAAc,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC;IAEvC,+FAA+F;IAC/F,MAAM,SAAS,GAAG,UAAU,CAAC,CAAC,CAAC,IAAI,UAAU,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;IACrD,MAAM,iBAAiB,GAAG,GAAG,2BAA2B,GAAG,SAAS,EAAE,CAAC;IAEvE,mFAAmF;IACnF,MAAM,cAAc,GAAG,MAAM,CAAc,IAAI,GAAG,EAAE,CAAC,CAAC;IACtD,MAAM,iBAAiB,GAAG,MAAM,CAAC,cAAc,CAAC,CAAC;IACjD,iBAAiB,CAAC,OAAO,GAAG,cAAc,CAAC;IAC3C,mEAAmE;IACnE,IAAI,cAAc;QAAE,cAAc,CAAC,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC;IAC/D,MAAM,QAAQ,GAAG,MAAM,CAAmC,IAAI,GAAG,EAAE,CAAC,CAAC;IACrE,MAAM,YAAY,GAAG,MAAM,CAAsB,IAAI,GAAG,EAAE,CAAC,CAAC;IAC5D,MAAM,CAAC,cAAc,EAAE,iBAAiB,CAAC,GAAG,QAAQ,CAAc,IAAI,GAAG,EAAE,CAAC,CAAC;IAC7E,MAAM,CAAC,WAAW,EAAE,cAAc,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;IACtD,MAAM,YAAY,GAAG,MAAM,CAAc,IAAI,GAAG,EAAE,CAAC,CAAC;IAEpD,4EAA4E;IAC5E,MAAM,CAAC,eAAe,EAAE,kBAAkB,CAAC,GAAG,QAAQ,CACpD,EAAE,CACH,CAAC;IACF,MAAM,CAAC,YAAY,EAAE,eAAe,CAAC,GAAG,QAAQ,CAAS,aAAa,CAAC,CAAC;IACxE,MAAM,cAAc,GAAG,MAAM,CAE3B,IAAI,GAAG,EAAE,CAAC,CAAC;IACb,MAAM,CAAC,uBAAuB,EAAE,0BAA0B,CAAC,GAAG,QAAQ,CAEpE,GAAG,EAAE,CAAC,wBAAwB,CAAC,iBAAiB,CAAC,CAAC,CAAC;IACrD,MAAM,CAAC,qBAAqB,EAAE,wBAAwB,CAAC,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC;IAEtE,SAAS,CAAC,GAAG,EAAE;QACb,0BAA0B,CAAC,wBAAwB,CAAC,iBAAiB,CAAC,CAAC,CAAC;IAC1E,CAAC,EAAE,CAAC,iBAAiB,CAAC,CAAC,CAAC;IAExB,MAAM,yBAAyB,GAAG,WAAW,CAAC,GAAG,EAAE;QACjD,wBAAwB,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,GAAG,CAAC,CAAC,CAAC;IACrD,CAAC,EAAE,EAAE,CAAC,CAAC;IACP,MAAM,8BAA8B,GAAG,KAAK,CAAC,gBAAgB,KAAK,IAAI,CAAC;IAEvE,MAAM,2BAA2B,GAAG,WAAW,CAC7C,CAAC,QAAgB,EAAE,EAAE,CACnB,qBAAqB,CACnB,cAAc,CAAC,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,uBAAuB,EAC/D,eAAe,CAChB,EACH,CAAC,eAAe,EAAE,uBAAuB,EAAE,qBAAqB,CAAC,CAClE,CAAC;IAEF,MAAM,qBAAqB,GAAG,WAAW,CACvC,CAAC,SAAyB,EAAE,EAAE;QAC5B,0BAA0B,CAAC,SAAS,CAAC,CAAC;QACtC,yBAAyB,CAAC,iBAAiB,EAAE,SAAS,CAAC,CAAC;IAC1D,CAAC,EACD,CAAC,iBAAiB,CAAC,CACpB,CAAC;IAEF,MAAM,iBAAiB,GAAG,WAAW,CACnC,CAAC,KAAa,EAAE,MAAc,EAAE,EAAE;QAChC,MAAM,QAAQ,GAAG,iBAAiB,CAAC,OAAO,CAAC;QAC3C,IAAI,CAAC,QAAQ;YAAE,OAAO;QACtB,MAAM,QAAQ,GAAG,cAAc,CAAC,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QACtD,MAAM,cAAc,GAAG,QAAQ,EAAE,MAAM,IAAI,MAAM,CAAC;QAClD,MAAM,aAAa,GAAG,iCAAiC,CAAC,KAAK,CAAC,CAAC;QAC/D,MAAM,MAAM,GACV,cAAc,KAAK,MAAM,IAAI,aAAa,CAAC,QAAQ,CAAC,cAAc,CAAC;YACjE,CAAC,CAAC,cAAc;YAChB,CAAC,CAAC,MAAM,CAAC;QACb,MAAM,SAAS,GAAG,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC;QAC5C,cAAc,CAAC,OAAO,CAAC,GAAG,CAAC,QAAQ,EAAE,SAAS,CAAC,CAAC;QAChD,qBAAqB,CAAC,SAAS,CAAC,CAAC;QACjC,yBAAyB,EAAE,CAAC;IAC9B,CAAC,EACD,CAAC,yBAAyB,EAAE,qBAAqB,CAAC,CACnD,CAAC;IAEF,MAAM,kBAAkB,GAAG,WAAW,CACpC,CAAC,MAAuB,EAAE,EAAE;QAC1B,MAAM,QAAQ,GAAG,iBAAiB,CAAC,OAAO,CAAC;QAC3C,IAAI,CAAC,QAAQ;YAAE,OAAO;QACtB,MAAM,QAAQ,GAAG,2BAA2B,CAAC,QAAQ,CAAC,CAAC;QACvD,MAAM,KAAK,GAAG,QAAQ,EAAE,KAAK,IAAI,YAAY,CAAC;QAC9C,MAAM,MAAM,GACV,QAAQ,EAAE,MAAM;YAChB,eAAe,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,EAAE,MAAM;YACrE,eAAe,CAAC,CAAC,CAAC,EAAE,MAAM,CAAC;QAC7B,MAAM,SAAS,GAAmB,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC;QACpD,IAAI,MAAM;YAAE,SAAS,CAAC,MAAM,GAAG,MAAM,CAAC;QACtC,cAAc,CAAC,OAAO,CAAC,GAAG,CAAC,QAAQ,EAAE,SAAS,CAAC,CAAC;QAChD,qBAAqB,CAAC,SAAS,CAAC,CAAC;QACjC,yBAAyB,EAAE,CAAC;IAC9B,CAAC,EACD;QACE,eAAe;QACf,yBAAyB;QACzB,YAAY;QACZ,qBAAqB;QACrB,2BAA2B;KAC5B,CACF,CAAC;IAEF,MAAM,cAAc,GAAG,WAAW,CAAC,GAAG,EAAE;QACtC,OAAO,CAAC,GAAG,CAAC;YACV,KAAK,CAAC,eAAe,CAAC,4CAA4C,CAAC,EAAE;gBACnE,MAAM,EAAE,MAAM;gBACd,OAAO,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE;gBAC/C,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC;aACzC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;YACxC,KAAK,CAAC,eAAe,CAAC,2BAA2B,CAAC,CAAC;iBAChD,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;iBACnC,KAAK,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC;YAClB,KAAK,CAAC,eAAe,CAAC,+BAA+B,CAAC,CAAC;iBACpD,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;iBACrC,KAAK,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC;SACrB,CAAC;aACC,IAAI,CAAC,CAAC,CAAC,WAAW,EAAE,OAAO,EAAE,aAAa,CAAC,EAAE,EAAE;YAC9C,IAAI,CAAC,WAAW,EAAE,OAAO;gBAAE,OAAO;YAClC,MAAM,cAAc,GAAG,IAAI,GAAG,CAC3B,OAAuD;iBACrD,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,UAAU,CAAC;iBAC3B,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CACrB,CAAC;YACF,MAAM,gBAAgB,GAAG,aAAa,EAAE,UAAU,KAAK,IAAI,CAAC;YAC5D,MAAM,iBAAiB,GACrB,WAAW,CAAC,OAAO,EAAE,MAAM,CAAC;YAC9B,MAAM,YAAY,GAAuB,WAAW,CAAC,OAAO,EAAE,KAAK,CAAC;YAEpE,IAAI,MAA0B,CAAC;YAE/B,IAAI,gBAAgB,EAAE,CAAC;gBACrB,2DAA2D;gBAC3D,6DAA6D;gBAC7D,+CAA+C;gBAC/C,MAAM,aAAa,GAAG,WAAW,CAAC,OAAO,CAAC,IAAI,CAC5C,CAAC,CAAM,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,SAAS,CACjC,CAAC;gBACF,MAAM,aAAa,GAAa,aAAa,EAAE,eAAe,IAAI,EAAE,CAAC;gBACrE,MAAM,MAAM,GAAG,aAAa,CAAC,MAAM,CAAC,CAAC,CAAS,EAAE,EAAE,CAChD,CAAC,CAAC,UAAU,CAAC,SAAS,CAAC,CACxB,CAAC;gBACF,MAAM,MAAM,GAAG,aAAa,CAAC,MAAM,CAAC,CAAC,CAAS,EAAE,EAAE,CAChD,CAAC,CAAC,UAAU,CAAC,MAAM,CAAC,CACrB,CAAC;gBACF,MAAM,MAAM,GAAG,aAAa,CAAC,MAAM,CAAC,CAAC,CAAS,EAAE,EAAE,CAChD,CAAC,CAAC,UAAU,CAAC,SAAS,CAAC,CACxB,CAAC;gBAEF,MAAM,GAAG;oBACP,GAAG,CAAC,MAAM,CAAC,MAAM;wBACf,CAAC,CAAC;4BACE;gCACE,MAAM,EAAE,SAAS;gCACjB,KAAK,EAAE,QAAQ;gCACf,MAAM,EAAE,MAAM;gCACd,UAAU,EAAE,IAAI;6BACjB;yBACF;wBACH,CAAC,CAAC,EAAE,CAAC;oBACP,GAAG,CAAC,MAAM,CAAC,MAAM;wBACf,CAAC,CAAC;4BACE;gCACE,MAAM,EAAE,SAAS;gCACjB,KAAK,EAAE,QAAQ;gCACf,MAAM,EAAE,MAAM;gCACd,UAAU,EAAE,IAAI;6BACjB;yBACF;wBACH,CAAC,CAAC,EAAE,CAAC;oBACP,GAAG,CAAC,MAAM,CAAC,MAAM;wBACf,CAAC,CAAC;4BACE;gCACE,MAAM,EAAE,SAAS;gCACjB,KAAK,EAAE,QAAQ;gCACf,MAAM,EAAE,MAAM;gCACd,UAAU,EAAE,IAAI;6BACjB;yBACF;wBACH,CAAC,CAAC,EAAE,CAAC;iBACR,CAAC;gBAEF,8DAA8D;gBAC9D,0DAA0D;gBAC1D,IAAI,YAAY,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,YAAY,CAAC,EAAE,CAAC;oBAC1D,MAAM,UAAU,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC;oBAC7B,IAAI,UAAU;wBAAE,UAAU,CAAC,MAAM,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC;gBAC1D,CAAC;YACH,CAAC;iBAAM,CAAC;gBACN,+DAA+D;gBAC/D,MAAM,cAAc,GAAG,IAAI,GAAG,CAAC;oBAC7B,WAAW;oBACX,eAAe;oBACf,eAAe;iBAChB,CAAC,CAAC;gBACH,MAAM,GAAG,WAAW,CAAC,OAAO;qBACzB,MAAM,CAAC,CAAC,CAAM,EAAE,EAAE,CAAC,cAAc,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;qBAC9C,GAAG,CAAC,CAAC,CAAM,EAAE,EAAE;oBACd,MAAM,MAAM,GAAG,CAAC,GAAG,CAAC,CAAC,eAAe,CAAC,CAAC;oBACtC,IACE,CAAC,CAAC,IAAI,KAAK,iBAAiB;wBAC5B,YAAY;wBACZ,CAAC,MAAM,CAAC,QAAQ,CAAC,YAAY,CAAC,EAC9B,CAAC;wBACD,MAAM,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC;oBAC/B,CAAC;oBACD,OAAO;wBACL,MAAM,EAAE,CAAC,CAAC,IAAI;wBACd,KAAK,EAAE,CAAC,CAAC,KAAK;wBACd,MAAM;wBACN,UAAU,EACR,CAAC,CAAC,eAAe,CAAC,MAAM,KAAK,CAAC;4BAC9B,CAAC,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC,CAAS,EAAE,EAAE,CACnC,cAAc,CAAC,GAAG,CAAC,CAAC,CAAC,CACtB;4BACD,CAAC,CAAC,IAAI,KAAK,iBAAiB;qBAC/B,CAAC;gBACJ,CAAC,CAAC,CAAC;YACP,CAAC;YACD,kBAAkB,CAAC,MAAM,CAAC,CAAC;YAC3B,eAAe,CAAC,YAAY,IAAI,aAAa,CAAC,CAAC;QACjD,CAAC,CAAC;aACD,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;IACrB,CAAC,EAAE,EAAE,CAAC,CAAC;IAEP,SAAS,CAAC,GAAG,EAAE;QACb,cAAc,EAAE,CAAC;QACjB,MAAM,CAAC,gBAAgB,CAAC,iCAAiC,EAAE,cAAc,CAAC,CAAC;QAC3E,OAAO,GAAG,EAAE,CACV,MAAM,CAAC,mBAAmB,CACxB,iCAAiC,EACjC,cAAc,CACf,CAAC;IACN,CAAC,EAAE,CAAC,cAAc,CAAC,CAAC,CAAC;IAErB,2DAA2D;IAC3D,0DAA0D;IAC1D,MAAM,cAAc,GAAG,wBAAwB,SAAS,EAAE,CAAC;IAC3D,MAAM,CAAC,SAAS,EAAE,YAAY,CAAC,GAAG,QAAQ,CAAyB,GAAG,EAAE;QACtE,IAAI,CAAC;YACH,MAAM,KAAK,GAAG,YAAY,CAAC,OAAO,CAAC,cAAc,CAAC,CAAC;YACnD,IAAI,KAAK;gBAAE,OAAO,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;QACtC,CAAC;QAAC,MAAM,CAAC,CAAA,CAAC;QACV,OAAO,EAAE,CAAC;IACZ,CAAC,CAAC,CAAC;IAEH,qCAAqC;IACrC,SAAS,CAAC,GAAG,EAAE;QACb,IAAI,CAAC;YACH,YAAY,CAAC,OAAO,CAAC,cAAc,EAAE,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC,CAAC;QAClE,CAAC;QAAC,MAAM,CAAC,CAAA,CAAC;IACZ,CAAC,EAAE,CAAC,SAAS,EAAE,cAAc,CAAC,CAAC,CAAC;IAEhC,uDAAuD;IACvD,oEAAoE;IACpE,MAAM,mBAAmB,GAAG,6BAA6B,SAAS,EAAE,CAAC;IACrE,MAAM,CAAC,aAAa,EAAE,gBAAgB,CAAC,GAAG,QAAQ,CAChD,GAAG,EAAE;QACH,IAAI,CAAC;YACH,MAAM,KAAK,GAAG,YAAY,CAAC,OAAO,CAAC,mBAAmB,CAAC,CAAC;YACxD,IAAI,KAAK;gBAAE,OAAO,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;QACtC,CAAC;QAAC,MAAM,CAAC,CAAA,CAAC;QACV,OAAO,EAAE,CAAC;IACZ,CAAC,CACF,CAAC;IAEF,SAAS,CAAC,GAAG,EAAE;QACb,IAAI,CAAC;YACH,YAAY,CAAC,OAAO,CAAC,mBAAmB,EAAE,IAAI,CAAC,SAAS,CAAC,aAAa,CAAC,CAAC,CAAC;QAC3E,CAAC;QAAC,MAAM,CAAC,CAAA,CAAC;IACZ,CAAC,EAAE,CAAC,aAAa,EAAE,mBAAmB,CAAC,CAAC,CAAC;IAEzC,iEAAiE;IACjE,MAAM,aAAa,GAAG,uBAAuB,SAAS,EAAE,CAAC;IACzD,MAAM,CAAC,UAAU,EAAE,aAAa,CAAC,GAAG,QAAQ,CAAW,GAAG,EAAE;QAC1D,IAAI,CAAC;YACH,MAAM,KAAK,GAAG,YAAY,CAAC,OAAO,CAAC,aAAa,CAAC,CAAC;YAClD,IAAI,KAAK,EAAE,CAAC;gBACV,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;gBACjC,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;oBAC/C,gCAAgC;oBAChC,KAAK,MAAM,EAAE,IAAI,MAAM;wBAAE,cAAc,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;oBACxD,OAAO,MAAM,CAAC;gBAChB,CAAC;YACH,CAAC;QACH,CAAC;QAAC,MAAM,CAAC,CAAA,CAAC;QACV,OAAO,EAAE,CAAC;IACZ,CAAC,CAAC,CAAC;IACH,MAAM,cAAc,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC;IAErC,uFAAuF;IACvF,SAAS,CAAC,GAAG,EAAE;QACb,MAAM,QAAQ,GAAG,UAAU,CAAC,MAAM,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC,CAAC;QAC3D,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACxB,IAAI,CAAC;gBACH,YAAY,CAAC,OAAO,CAAC,aAAa,EAAE,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC,CAAC;YAChE,CAAC;YAAC,MAAM,CAAC,CAAA,CAAC;QACZ,CAAC;IACH,CAAC,EAAE,CAAC,UAAU,EAAE,SAAS,EAAE,aAAa,CAAC,CAAC,CAAC;IAE3C,2EAA2E;IAC3E,SAAS,CAAC,GAAG,EAAE;QACb,IAAI,cAAc,CAAC,OAAO,IAAI,CAAC,cAAc,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC;YACnE,OAAO;QACT,cAAc,CAAC,OAAO,GAAG,IAAI,CAAC;QAC9B,MAAM,SAAS,GAAG,IAAI,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;QACpD,MAAM,SAAS,GAAG,IAAI,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;QAEzD,uEAAuE;QACvE,2EAA2E;QAC3E,oEAAoE;QACpE,MAAM,kBAAkB,GAAG,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC;QAC9C,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QACvB,MAAM,OAAO,GAAG,CAAC,EAAU,EAAE,EAAE;YAC7B,MAAM,MAAM,GAAG,SAAS,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YACjC,OAAO,MAAM;gBACX,CAAC,CAAC,MAAM,CAAC,YAAY,KAAK,CAAC;oBACvB,GAAG,GAAG,MAAM,CAAC,SAAS,GAAG,kBAAkB;gBAC/C,CAAC,CAAC,KAAK,CAAC;QACZ,CAAC,CAAC;QAEF,2FAA2F;QAC3F,IAAI,SAAS,CAAC,cAAc,CAAC,EAAE,CAAC;YAC9B,MAAM,MAAM,GAAG,SAAS,CAAC,cAAc,CAAC,CAAC;YACzC,IAAI,MAAM,IAAI,SAAS,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC;gBACpC,YAAY,CAAC,MAAM,CAAC,CAAC;YACvB,CAAC;iBAAM,CAAC;gBACN,uCAAuC;gBACvC,MAAM,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;gBACzD,IAAI,UAAU;oBAAE,YAAY,CAAC,UAAU,CAAC,EAAE,CAAC,CAAC;YAC9C,CAAC;QACH,CAAC;QAED,aAAa,CAAC,CAAC,IAAI,EAAE,EAAE;YACrB,qFAAqF;YACrF,MAAM,KAAK,GAAG,IAAI,CAAC,MAAM,CACvB,CAAC,EAAE,EAAE,EAAE,CAAC,SAAS,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,CAC5D,CAAC;YACF,gFAAgF;YAChF,IACE,CAAC,SAAS,CAAC,cAAc,CAAC;gBAC1B,CAAC,KAAK,CAAC,QAAQ,CAAC,cAAc,CAAC;gBAC/B,CAAC,OAAO,CAAC,cAAc,CAAC,EACxB,CAAC;gBACD,KAAK,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;YAC7B,CAAC;YACD,OAAO,KAAK,CAAC;QACf,CAAC,CAAC,CAAC;QAEH,yCAAyC;QACzC,IAAI,CAAC,SAAS,CAAC,cAAc,CAAC,IAAI,OAAO,CAAC,cAAc,CAAC,EAAE,CAAC;YAC1D,YAAY,EAAE,CAAC;QACjB,CAAC;IACH,CAAC,EAAE,CAAC,cAAc,EAAE,OAAO,EAAE,SAAS,EAAE,YAAY,EAAE,YAAY,CAAC,CAAC,CAAC;IAErE,+CAA+C;IAC/C,0EAA0E;IAC1E,8EAA8E;IAC9E,SAAS,CAAC,GAAG,EAAE;QACb,IAAI,cAAc,EAAE,CAAC;YACnB,aAAa,CAAC,CAAC,IAAI,EAAE,EAAE,CACrB,IAAI,CAAC,QAAQ,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,GAAG,IAAI,EAAE,cAAc,CAAC,CACjE,CAAC;QACJ,CAAC;IACH,CAAC,EAAE,CAAC,cAAc,CAAC,CAAC,CAAC;IAErB,4EAA4E;IAC5E,2EAA2E;IAC3E,0EAA0E;IAC1E,gEAAgE;IAChE,MAAM,eAAe,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC;IACtC,SAAS,CAAC,GAAG,EAAE;QACb,IAAI,SAAS,IAAI,eAAe,CAAC,OAAO;YAAE,OAAO;QACjD,IAAI,UAAU,CAAC,MAAM,KAAK,CAAC,IAAI,CAAC,cAAc,EAAE,CAAC;YAC/C,eAAe,CAAC,OAAO,GAAG,IAAI,CAAC;YAC/B,YAAY,EAAE,CAAC,IAAI,CAAC,CAAC,EAAE,EAAE,EAAE;gBACzB,eAAe,CAAC,OAAO,GAAG,KAAK,CAAC;gBAChC,IAAI,EAAE,EAAE,CAAC;oBACP,YAAY,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;oBAC7B,aAAa,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;gBACtB,CAAC;YACH,CAAC,CAAC,CAAC;QACL,CAAC;IACH,CAAC,EAAE,CAAC,SAAS,EAAE,UAAU,EAAE,cAAc,EAAE,YAAY,CAAC,CAAC,CAAC;IAE1D,yCAAyC;IACzC,SAAS,CAAC,GAAG,EAAE;QACb,IAAI,CAAC,cAAc;YAAE,OAAO;QAC5B,2DAA2D;QAC3D,MAAM,CAAC,GAAG,UAAU,CAAC,GAAG,EAAE;YACxB,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC,EAAE,aAAa,EAAE,CAAC;QACxD,CAAC,EAAE,EAAE,CAAC,CAAC;QACP,OAAO,GAAG,EAAE,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;IAC/B,CAAC,EAAE,CAAC,cAAc,CAAC,CAAC,CAAC;IAErB,2EAA2E;IAC3E,kFAAkF;IAClF,4EAA4E;IAC5E,4EAA4E;IAC5E,iDAAiD;IACjD,MAAM,cAAc,GAAG,WAAW,CAAC,CAAC,EAAsB,EAAE,EAAE;QAC5D,IAAI,CAAC,EAAE;YAAE,OAAO;QAChB,MAAM,SAAS,GAAG,EAAE,CAAC,aAAa,CAAC;QACnC,IAAI,CAAC,SAAS;YAAE,OAAO;QACvB,MAAM,MAAM,GAAG,EAAE,CAAC;QAClB,qBAAqB,CAAC,GAAG,EAAE;YACzB,MAAM,aAAa,GAAG,SAAS,CAAC,qBAAqB,EAAE,CAAC;YACxD,MAAM,OAAO,GAAG,EAAE,CAAC,qBAAqB,EAAE,CAAC;YAC3C,IAAI,OAAO,CAAC,IAAI,GAAG,aAAa,CAAC,IAAI,GAAG,MAAM,EAAE,CAAC;gBAC/C,SAAS,CAAC,UAAU,IAAI,OAAO,CAAC,IAAI,GAAG,aAAa,CAAC,IAAI,GAAG,MAAM,CAAC;YACrE,CAAC;iBAAM,IAAI,OAAO,CAAC,KAAK,GAAG,aAAa,CAAC,KAAK,GAAG,MAAM,EAAE,CAAC;gBACxD,SAAS,CAAC,UAAU,IAAI,OAAO,CAAC,KAAK,GAAG,aAAa,CAAC,KAAK,GAAG,MAAM,CAAC;YACvE,CAAC;QACH,CAAC,CAAC,CAAC;IACL,CAAC,EAAE,EAAE,CAAC,CAAC;IAEP,MAAM,CAAC,aAAa,EAAE,gBAAgB,CAAC,GAAG,QAAQ,CAChD,GAAG,EAAE,CAAC,MAAM,CAAC,WAAW,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,YAAY,IAAI,CAAC,CAAC,CAAC,CAAC,CAC1E,CAAC;IAEF,kDAAkD;IAClD,SAAS,CAAC,GAAG,EAAE;QACb,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACvB,gBAAgB,CAAC,CAAC,IAAI,EAAE,EAAE;gBACxB,MAAM,IAAI,GAAG,EAAE,GAAG,IAAI,EAAE,CAAC;gBACzB,KAAK,MAAM,CAAC,IAAI,OAAO,EAAE,CAAC;oBACxB,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,IAAI,IAAI,CAAC,EAAE,CAAC;wBACpB,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,YAAY,IAAI,CAAC,CAAC;oBACnC,CAAC;gBACH,CAAC;gBACD,OAAO,IAAI,CAAC;YACd,CAAC,CAAC,CAAC;QACL,CAAC;IACH,CAAC,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC;IAEd,6CAA6C;IAC7C,SAAS,CAAC,GAAG,EAAE;QACb,MAAM,OAAO,GAAG,CAAC,KAAmB,EAAE,EAAE;YACtC,IAAI,CAAC,qBAAqB,CAAC,KAAK,CAAC;gBAAE,OAAO;YAC1C,IAAI,KAAK,CAAC,IAAI,EAAE,IAAI,KAAK,wBAAwB;gBAAE,OAAO;YAC1D,MAAM,OAAO,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,EAAE,OAAiB,CAAC;YACnD,IAAI,CAAC,OAAO;gBAAE,OAAO;YACrB,MAAM,OAAO,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,EAAE,OAA6B,CAAC;YAC/D,MAAM,WAAW,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,EAAE,WAAkC,CAAC;YACxE,MAAM,KAAK,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,EAAE,KAA2B,CAAC;YAC3D,MAAM,MAAM,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,EAAE,MAAiB,CAAC;YAClD,MAAM,MAAM,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,EAAE,MAA6B,CAAC;YAC9D,MAAM,KAAK,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,EAAE,KAAK,CAAC;YACrC,MAAM,cAAc,GAAG,OAAO,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC;YACrE,MAAM,UAAU,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,EAAE,UAAiC,CAAC;YAEtE,oEAAoE;YACpE,yDAAyD;YACzD,IAAI,WAAW,KAAK,KAAK,IAAI,CAAC,UAAU,EAAE,CAAC;gBACzC,MAAM,CAAC,aAAa,CAAC,IAAI,WAAW,CAAC,kBAAkB,CAAC,CAAC,CAAC;YAC5D,CAAC;YACD,IAAI,8BAA8B;gBAAE,OAAO;YAE3C,sEAAsE;YACtE,uEAAuE;YACvE,MAAM,WAAW,GAAG,OAAO;gBACzB,CAAC,CAAC,GAAG,OAAO,kBAAkB,OAAO,cAAc;gBACnD,CAAC,CAAC,OAAO,CAAC;YAEZ,MAAM,SAAS,GAAG,CAAC,QAAgB,EAAE,EAAE;gBACrC,sEAAsE;gBACtE,IAAI,KAAK,EAAE,CAAC;oBACV,MAAM,YAAY,GAAG,eAAe,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAC9C,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,CACzB,CAAC;oBACF,IAAI,YAAY,EAAE,CAAC;wBACjB,MAAM,eAAe,GAAG,iBAAiB,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC;wBACpE,MAAM,aAAa,GAAG,iCAAiC,CAAC,KAAK,CAAC,CAAC;wBAC/D,MAAM,cAAc,GAClB,eAAe,KAAK,MAAM;4BAC1B,aAAa,CAAC,QAAQ,CAAC,eAAe,CAAC;4BACrC,CAAC,CAAC,eAAe;4BACjB,CAAC,CAAC,MAAM,CAAC;wBACb,cAAc,CAAC,OAAO,CAAC,GAAG,CAAC,QAAQ,EAAE;4BACnC,KAAK;4BACL,MAAM,EAAE,YAAY,CAAC,MAAM;4BAC3B,MAAM,EAAE,cAAc;yBACvB,CAAC,CAAC;wBACH,yBAAyB,EAAE,CAAC;oBAC9B,CAAC;gBACH,CAAC;gBAED,MAAM,GAAG,GAAG,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;gBAC3C,IAAI,GAAG,EAAE,CAAC;oBACR,GAAG,CAAC,WAAW,CAAC,WAAW,CAAC,CAAC;gBAC/B,CAAC;qBAAM,CAAC;oBACN,YAAY,CAAC,OAAO,CAAC,GAAG,CAAC,QAAQ,EAAE,WAAW,CAAC,CAAC;gBAClD,CAAC;YACH,CAAC,CAAC;YAEF,IAAI,MAAM,EAAE,CAAC;gBACX,MAAM,aAAa,GAAG,iBAAiB,CAAC,OAAO,CAAC;gBAChD,YAAY,CAAC,cAAc,CAAC,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE;oBAC1C,IAAI,KAAK,EAAE,CAAC;wBACV,YAAY,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;wBAChC,SAAS,CAAC,KAAK,CAAC,CAAC;wBACjB,IAAI,UAAU,IAAI,aAAa,EAAE,CAAC;4BAChC,YAAY,CAAC,aAAa,CAAC,CAAC;wBAC9B,CAAC;oBACH,CAAC;gBACH,CAAC,CAAC,CAAC;YACL,CAAC;iBAAM,CAAC;gBACN,MAAM,YAAY,GAAG,iBAAiB,CAAC,OAAO,CAAC;gBAC/C,IAAI,CAAC,YAAY;oBAAE,OAAO;gBAC1B,SAAS,CAAC,YAAY,CAAC,CAAC;YAC1B,CAAC;QACH,CAAC,CAAC;QACF,MAAM,CAAC,gBAAgB,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;QAC5C,OAAO,GAAG,EAAE,CAAC,MAAM,CAAC,mBAAmB,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;IAC9D,CAAC,EAAE;QACD,eAAe;QACf,yBAAyB;QACzB,YAAY;QACZ,8BAA8B;QAC9B,YAAY;KACb,CAAC,CAAC;IAEH,wCAAwC;IACxC,SAAS,CAAC,GAAG,EAAE;QACb,KAAK,MAAM,CAAC,KAAK,EAAE,OAAO,CAAC,IAAI,YAAY,CAAC,OAAO,EAAE,CAAC;YACpD,MAAM,GAAG,GAAG,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;YACxC,IAAI,GAAG,EAAE,CAAC;gBACR,UAAU,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,WAAW,CAAC,OAAO,CAAC,EAAE,EAAE,CAAC,CAAC;gBAC/C,YAAY,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;YACrC,CAAC;QACH,CAAC;IACH,CAAC,EAAE,CAAC,UAAU,CAAC,CAAC,CAAC;IAEjB,2CAA2C;IAC3C,SAAS,CAAC,GAAG,EAAE;QACb,MAAM,OAAO,GAAG,CAAC,CAAQ,EAAE,EAAE;YAC3B,MAAM,MAAM,GAAI,CAAiB,CAAC,MAAM,CAAC;YACzC,IAAI,CAAC,MAAM;gBAAE,OAAO;YACpB,MAAM,EAAE,SAAS,EAAE,KAAK,EAAE,GAAG,MAAM,CAAC;YACpC,IAAI,CAAC,KAAK;gBAAE,OAAO;YAEnB,iBAAiB,CAAC,CAAC,IAAI,EAAE,EAAE;gBACzB,MAAM,IAAI,GAAG,IAAI,GAAG,CAAC,IAAI,CAAC,CAAC;gBAC3B,IAAI,SAAS,EAAE,CAAC;oBACd,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;gBAClB,CAAC;qBAAM,CAAC;oBACN,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;gBACrB,CAAC;gBACD,OAAO,IAAI,CAAC;YACd,CAAC,CAAC,CAAC;QACL,CAAC,CAAC;QACF,MAAM,CAAC,gBAAgB,CAAC,yBAAyB,EAAE,OAAO,CAAC,CAAC;QAC5D,OAAO,GAAG,EAAE,CAAC,MAAM,CAAC,mBAAmB,CAAC,yBAAyB,EAAE,OAAO,CAAC,CAAC;IAC9E,CAAC,EAAE,EAAE,CAAC,CAAC;IAEP,MAAM,MAAM,GAAG,WAAW,CAAC,KAAK,IAAI,EAAE;QACpC,MAAM,EAAE,GAAG,MAAM,YAAY,EAAE,CAAC;QAChC,IAAI,EAAE,EAAE,CAAC;YACP,YAAY,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAC/B,CAAC;IACH,CAAC,EAAE,CAAC,YAAY,CAAC,CAAC,CAAC;IAEnB,MAAM,QAAQ,GAAG,WAAW,CAC1B,CAAC,KAAa,EAAE,EAAE;QAChB,aAAa,CAAC,CAAC,IAAI,EAAE,EAAE;YACrB,IAAI,IAAI,CAAC,MAAM,IAAI,CAAC,EAAE,CAAC;gBACrB,iEAAiE;gBACjE,YAAY,EAAE,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE;oBAC5B,IAAI,KAAK,EAAE,CAAC;wBACV,YAAY,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;wBAChC,aAAa,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC;oBACzB,CAAC;gBACH,CAAC,CAAC,CAAC;gBACH,OAAO,IAAI,CAAC,CAAC,sCAAsC;YACrD,CAAC;YACD,MAAM,IAAI,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,KAAK,KAAK,CAAC,CAAC;YAC/C,IAAI,KAAK,KAAK,iBAAiB,CAAC,OAAO,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBAC3D,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;gBAChC,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;YACrD,CAAC;YACD,OAAO,IAAI,CAAC;QACd,CAAC,CAAC,CAAC;QACH,QAAQ,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QAC/B,YAAY,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QACnC,YAAY,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QACnC,cAAc,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QACrC,0CAA0C;QAC1C,YAAY,CAAC,CAAC,IAAI,EAAE,EAAE;YACpB,IAAI,CAAC,CAAC,KAAK,IAAI,IAAI,CAAC;gBAAE,OAAO,IAAI,CAAC;YAClC,MAAM,EAAE,CAAC,KAAK,CAAC,EAAE,CAAC,EAAE,GAAG,IAAI,EAAE,GAAG,IAAI,CAAC;YACrC,OAAO,IAAI,CAAC;QACd,CAAC,CAAC,CAAC;QACH,gBAAgB,CAAC,CAAC,IAAI,EAAE,EAAE;YACxB,IAAI,CAAC,CAAC,KAAK,IAAI,IAAI,CAAC;gBAAE,OAAO,IAAI,CAAC;YAClC,MAAM,EAAE,CAAC,KAAK,CAAC,EAAE,CAAC,EAAE,GAAG,IAAI,EAAE,GAAG,IAAI,CAAC;YACrC,OAAO,IAAI,CAAC;QACd,CAAC,CAAC,CAAC;IACL,CAAC,EACD,CAAC,YAAY,EAAE,YAAY,CAAC,CAC7B,CAAC;IAEF,MAAM,cAAc,GAAG,WAAW,CAChC,CAAC,KAAa,EAAE,EAAE;QAChB,aAAa,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC;QACvB,IAAI,iBAAiB,CAAC,OAAO,KAAK,KAAK,EAAE,CAAC;YACxC,YAAY,CAAC,KAAK,CAAC,CAAC;QACtB,CAAC;QACD,gCAAgC;QAChC,KAAK,MAAM,GAAG,IAAI,QAAQ,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC;YAC1C,IAAI,GAAG,KAAK,KAAK,EAAE,CAAC;gBAClB,QAAQ,CAAC,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;gBAC7B,YAAY,CAAC,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;gBACjC,YAAY,CAAC,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;gBACjC,cAAc,CAAC,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;YACrC,CAAC;QACH,CAAC;QACD,oFAAoF;QACpF,YAAY,CAAC,CAAC,IAAI,EAAE,EAAE;YACpB,IAAI,KAAK,IAAI,IAAI;gBAAE,OAAO,EAAE,CAAC,KAAK,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;YACnD,OAAO,EAAE,CAAC;QACZ,CAAC,CAAC,CAAC;QACH,gBAAgB,CAAC,CAAC,IAAI,EAAE,EAAE;YACxB,IAAI,KAAK,IAAI,IAAI;gBAAE,OAAO,EAAE,CAAC,KAAK,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;YACnD,OAAO,EAAE,CAAC;QACZ,CAAC,CAAC,CAAC;IACL,CAAC,EACD,CAAC,YAAY,CAAC,CACf,CAAC;IAEF,MAAM,YAAY,GAAG,WAAW,CAAC,KAAK,IAAI,EAAE;QAC1C,MAAM,EAAE,GAAG,MAAM,YAAY,EAAE,CAAC;QAChC,IAAI,EAAE,EAAE,CAAC;YACP,YAAY,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YAC7B,aAAa,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;YACpB,YAAY,CAAC,EAAE,CAAC,CAAC;YACjB,wBAAwB;YACxB,QAAQ,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC;YACzB,YAAY,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC;YAC7B,cAAc,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC;YAC/B,YAAY,CAAC,EAAE,CAAC,CAAC;YACjB,gBAAgB,CAAC,EAAE,CAAC,CAAC;QACvB,CAAC;IACH,CAAC,EAAE,CAAC,YAAY,EAAE,YAAY,CAAC,CAAC,CAAC;IAEjC,yEAAyE;IACzE,SAAS,CAAC,GAAG,EAAE;QACb,MAAM,kBAAkB,GAAG,GAAG,EAAE;YAC9B,MAAM,EAAE,GAAG,iBAAiB,CAAC,OAAO,CAAC;YACrC,IAAI,EAAE;gBAAE,QAAQ,CAAC,EAAE,CAAC,CAAC;QACvB,CAAC,CAAC;QACF,MAAM,cAAc,GAAG,GAAG,EAAE;YAC1B,KAAK,YAAY,EAAE,CAAC;QACtB,CAAC,CAAC;QACF,MAAM,CAAC,gBAAgB,CAAC,8BAA8B,EAAE,kBAAkB,CAAC,CAAC;QAC5E,MAAM,CAAC,gBAAgB,CAAC,2BAA2B,EAAE,cAAc,CAAC,CAAC;QACrE,OAAO,GAAG,EAAE;YACV,MAAM,CAAC,mBAAmB,CACxB,8BAA8B,EAC9B,kBAAkB,CACnB,CAAC;YACF,MAAM,CAAC,mBAAmB,CAAC,2BAA2B,EAAE,cAAc,CAAC,CAAC;QAC1E,CAAC,CAAC;IACJ,CAAC,EAAE,CAAC,QAAQ,EAAE,YAAY,CAAC,CAAC,CAAC;IAE7B,MAAM,cAAc,GAAG,WAAW,CAAC,GAAG,EAAE;QACtC,MAAM,EAAE,CAAC;IACX,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC;IAEb,MAAM,eAAe,GAAG,WAAW,CACjC,CAAC,QAAgB,EAAE,EAAE;QACnB,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC;YACnC,aAAa,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,GAAG,IAAI,EAAE,QAAQ,CAAC,CAAC,CAAC;QAC/C,CAAC;QACD,YAAY,CAAC,QAAQ,CAAC,CAAC;IACzB,CAAC,EACD,CAAC,UAAU,EAAE,YAAY,CAAC,CAC3B,CAAC;IAEF,uEAAuE;IACvE,SAAS,CAAC,GAAG,EAAE;QACb,SAAS,cAAc,CAAC,CAAQ;YAC9B,MAAM,MAAM,GAAI,CAAiB,CAAC,MAAM,CAAC;YACzC,MAAM,QAAQ,GAAG,MAAM,EAAE,QAAQ,CAAC;YAClC,IAAI,CAAC,QAAQ;gBAAE,OAAO;YACtB,sEAAsE;YACtE,MAAM,QAAQ,GAAG,iBAAiB,CAAC,OAAO,CAAC;YAC3C,IAAI,QAAQ,IAAI,QAAQ,KAAK,QAAQ,EAAE,CAAC;gBACtC,YAAY,CAAC,CAAC,IAAI,EAAE,EAAE,CACpB,IAAI,CAAC,QAAQ,CAAC,KAAK,QAAQ;oBACzB,CAAC,CAAC,IAAI;oBACN,CAAC,CAAC,EAAE,GAAG,IAAI,EAAE,CAAC,QAAQ,CAAC,EAAE,QAAQ,EAAE,CACtC,CAAC;YACJ,CAAC;YACD,yDAAyD;YACzD,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,IAAI,MAAM,CAAC,WAAW,IAAI,EAAE,CAAC;YACrD,IAAI,IAAI,EAAE,CAAC;gBACT,gBAAgB,CAAC,CAAC,IAAI,EAAE,EAAE,CACxB,IAAI,CAAC,QAAQ,CAAC,KAAK,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,GAAG,IAAI,EAAE,CAAC,QAAQ,CAAC,EAAE,IAAI,EAAE,CAC/D,CAAC;YACJ,CAAC;YACD,yEAAyE;YACzE,cAAc,EAAE,CAAC;YACjB,+EAA+E;YAC/E,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC;gBACnC,aAAa,CAAC,CAAC,IAAI,EAAE,EAAE;oBACrB,IAAI,QAAQ,EAAE,CAAC;wBACb,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;wBACzC,IAAI,SAAS,KAAK,CAAC,CAAC,EAAE,CAAC;4BACrB,qEAAqE;4BACrE,MAAM,IAAI,GAAG,CAAC,GAAG,IAAI,CAAC,CAAC;4BACvB,IAAI,SAAS,GAAG,SAAS,GAAG,CAAC,CAAC;4BAC9B,qDAAqD;4BACrD,OACE,SAAS,GAAG,IAAI,CAAC,MAAM;gCACvB,SAAS,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,KAAK,QAAQ,EACvC,CAAC;gCACD,SAAS,EAAE,CAAC;4BACd,CAAC;4BACD,IAAI,CAAC,MAAM,CAAC,SAAS,EAAE,CAAC,EAAE,QAAQ,CAAC,CAAC;4BACpC,OAAO,IAAI,CAAC;wBACd,CAAC;oBACH,CAAC;oBACD,OAAO,CAAC,GAAG,IAAI,EAAE,QAAQ,CAAC,CAAC;gBAC7B,CAAC,CAAC,CAAC;YACL,CAAC;YACD,YAAY,CAAC,QAAQ,CAAC,CAAC;QACzB,CAAC;QACD,MAAM,CAAC,gBAAgB,CAAC,iBAAiB,EAAE,cAAc,CAAC,CAAC;QAC3D,OAAO,GAAG,EAAE,CAAC,MAAM,CAAC,mBAAmB,CAAC,iBAAiB,EAAE,cAAc,CAAC,CAAC;IAC7E,CAAC,EAAE,CAAC,UAAU,EAAE,YAAY,EAAE,cAAc,EAAE,SAAS,CAAC,CAAC,CAAC;IAE1D,2DAA2D;IAC3D,MAAM,kBAAkB,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC;IACrC,SAAS,CAAC,GAAG,EAAE;QACb,IAAI,OAAO,GAAG,KAAK,CAAC;QACpB,IAAI,KAAK,GAAyC,IAAI,CAAC;QAEvD,KAAK,UAAU,eAAe;YAC5B,IAAI,OAAO;gBAAE,OAAO;YACpB,IAAI,CAAC;gBACH,MAAM,GAAG,GAAG,MAAM,KAAK,CACrB,eAAe,CAAC,+CAA+C,CAAC,CACjE,CAAC;gBACF,IAAI,GAAG,CAAC,EAAE,EAAE,CAAC;oBACX,MAAM,IAAI,GAAG,MAAM,GAAG,CAAC,IAAI,EAAE,CAAC;oBAC9B,IACE,IAAI,EAAE,KAAK,EAAE,OAAO,KAAK,aAAa;wBACtC,IAAI,CAAC,KAAK,CAAC,QAAQ;wBACnB,IAAI,CAAC,KAAK,CAAC,SAAS,GAAG,kBAAkB,CAAC,OAAO,EACjD,CAAC;wBACD,kBAAkB,CAAC,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC;wBAClD,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,QAAkB,CAAC;wBAC/C,wCAAwC;wBACxC,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC;4BACnC,aAAa,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,GAAG,IAAI,EAAE,QAAQ,CAAC,CAAC,CAAC;wBAC/C,CAAC;wBACD,YAAY,CAAC,QAAQ,CAAC,CAAC;wBACvB,oBAAoB;wBACpB,KAAK,CACH,eAAe,CAAC,+CAA+C,CAAC,EAChE;4BACE,MAAM,EAAE,QAAQ;4BAChB,OAAO,EAAE,EAAE,qBAAqB,EAAE,GAAG,EAAE;yBACxC,CACF,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;oBACpB,CAAC;gBACH,CAAC;YACH,CAAC;YAAC,MAAM,CAAC,CAAA,CAAC;YACV,IAAI,CAAC,OAAO,EAAE,CAAC;gBACb,KAAK,GAAG,UAAU,CAAC,eAAe,EAAE,IAAI,CAAC,CAAC;YAC5C,CAAC;QACH,CAAC;QAED,eAAe,EAAE,CAAC;QAClB,OAAO,GAAG,EAAE;YACV,OAAO,GAAG,IAAI,CAAC;YACf,IAAI,KAAK;gBAAE,YAAY,CAAC,KAAK,CAAC,CAAC;QACjC,CAAC,CAAC;IACJ,CAAC,EAAE,CAAC,UAAU,EAAE,YAAY,CAAC,CAAC,CAAC;IAE/B,MAAM,mBAAmB,GAAG,WAAW,CACrC,CAAC,QAAgB,EAAE,OAAe,EAAE,EAAE;QACpC,aAAa,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE;YAC9C,IAAI,KAAK,EAAE,CAAC;gBACV,4CAA4C;gBAC5C,cAAc,CAAC,QAAQ,EAAE;oBACvB,UAAU,EAAE,EAAE;oBACd,KAAK;oBACL,OAAO,EAAE,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC;iBAC/B,CAAC,CAAC;YACL,CAAC;QACH,CAAC,CAAC,CAAC;IACL,CAAC,EACD,CAAC,aAAa,EAAE,cAAc,CAAC,CAChC,CAAC;IAEF,MAAM,gBAAgB,GAAG,WAAW,CAClC,CACE,QAAgB,EAChB,IAKC,EACD,EAAE;QACF,cAAc,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;IACjC,CAAC,EACD,CAAC,cAAc,CAAC,CACjB,CAAC;IAEF,uEAAuE;IACvE,MAAM,CAAC,WAAW,EAAE,cAAc,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;IAEtD,MAAM,kBAAkB,GAAG,WAAW,CACpC,CAAC,OAAe,EAAE,EAAE;QAClB,QAAQ,OAAO,EAAE,CAAC;YAChB,KAAK,OAAO,CAAC;YACb,KAAK,KAAK;gBACR,MAAM,EAAE,CAAC;gBACT,MAAM;YACR,KAAK,SAAS;gBACZ,cAAc,CAAC,IAAI,CAAC,CAAC;gBACrB,MAAM;YACR,KAAK,MAAM;gBACT,KAAK,CAAC,gBAAgB,EAAE,CAAC,MAAM,CAAC,CAAC;gBACjC,MAAM;YACR,KAAK,KAAK;gBACR,KAAK,CAAC,gBAAgB,EAAE,CAAC,OAAO,CAAC,CAAC;gBAClC,MAAM;YACR,KAAK,MAAM;gBACT,cAAc,CAAC,IAAI,CAAC,CAAC;gBACrB,MAAM;QACV,CAAC;IACH,CAAC,EACD,CAAC,MAAM,EAAE,KAAK,CAAC,gBAAgB,CAAC,CACjC,CAAC;IAEF,MAAM,cAAc,GAAG,WAAW,CAChC,KAAK,EAAE,cAAsB,EAAE,EAAE;QAC/B,MAAM,QAAQ,GAAG,MAAM,UAAU,CAAC,cAAc,CAAC,CAAC;QAClD,IAAI,CAAC,QAAQ;YAAE,OAAO;QACtB,aAAa,CAAC,CAAC,IAAI,EAAE,EAAE;YACrB,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,cAAc,CAAC,CAAC;YACzC,IAAI,GAAG,KAAK,CAAC,CAAC,EAAE,CAAC;gBACf,MAAM,IAAI,GAAG,CAAC,GAAG,IAAI,CAAC,CAAC;gBACvB,IAAI,CAAC,MAAM,CAAC,GAAG,GAAG,CAAC,EAAE,CAAC,EAAE,QAAQ,CAAC,CAAC;gBAClC,OAAO,IAAI,CAAC;YACd,CAAC;YACD,OAAO,CAAC,GAAG,IAAI,EAAE,QAAQ,CAAC,CAAC;QAC7B,CAAC,CAAC,CAAC;QACH,YAAY,CAAC,QAAQ,CAAC,CAAC;IACzB,CAAC,EACD,CAAC,UAAU,EAAE,YAAY,CAAC,CAC3B,CAAC;IAEF,kCAAkC;IAClC,MAAM,SAAS,GAAG,IAAI,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;IACzD,MAAM,IAAI,GAAc,UAAU;SAC/B,MAAM,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,SAAS,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,EAAE,KAAK,cAAc,CAAC;SAC1D,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE;QACV,MAAM,CAAC,GAAG,SAAS,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAC5B,OAAO;YACL,EAAE;YACF,KAAK,EAAE,CAAC,EAAE,KAAK,IAAI,CAAC,EAAE,OAAO,EAAE,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,UAAU;YACzD,MAAM,EAAE,cAAc,CAAC,GAAG,CAAC,EAAE,CAAC;gBAC5B,CAAC,CAAE,SAAmB;gBACtB,CAAC,CAAC,CAAC,aAAa,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,YAAY,IAAI,CAAC,CAAC,GAAG,CAAC;oBAC/C,CAAC,CAAE,WAAqB;oBACxB,CAAC,CAAE,MAAgB;YACvB,cAAc,EAAE,SAAS,CAAC,EAAE,CAAC;YAC7B,YAAY,EAAE,aAAa,CAAC,EAAE,CAAC;SAChC,CAAC;IACJ,CAAC,CAAC,CAAC;IAEL,oFAAoF;IACpF,KAAK,MAAM,EAAE,IAAI,UAAU,EAAE,CAAC;QAC5B,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC;YACnC,IAAI,CAAC,IAAI,CAAC;gBACR,EAAE;gBACF,KAAK,EACH,aAAa,CAAC,EAAE,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC,UAAU,CAAC;gBACpE,MAAM,EAAE,SAAkB;gBAC1B,cAAc,EAAE,SAAS,CAAC,EAAE,CAAC;gBAC7B,YAAY,EAAE,aAAa,CAAC,EAAE,CAAC;aAChC,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IAED,MAAM,WAAW,GAAqC;QACpD,IAAI;QACJ,WAAW,EAAE,cAAc,IAAI,EAAE;QACjC,qBAAqB,EAAE,cAAc;YACnC,CAAC,CAAC,CAAC,aAAa,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC;YACtC,CAAC,CAAC,CAAC;QACL,cAAc,EAAE,YAAY;QAC5B,MAAM;QACN,QAAQ;QACR,cAAc;QACd,YAAY;QACZ,cAAc;QACd,WAAW;QACX,aAAa,EAAE,GAAG,EAAE,CAAC,cAAc,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC;QAC9C,QAAQ,EAAE,UAAU,CAAC,MAAM;KAC5B,CAAC;IAEF,sEAAsE;IACtE,wEAAwE;IACxE,8EAA8E;IAC9E,oEAAoE;IACpE,IAAI,SAAS,IAAI,CAAC,cAAc,EAAE,CAAC;QACjC,OAAO,CACL,KAAC,YAAY,IACX,MAAM,EAAE,YAAY,EAAE,CAAC,WAAW,CAAC,EACnC,UAAU,EAAE,aAAa,GACzB,CACH,CAAC;IACJ,CAAC;IAED,OAAO,CACL,eAAK,SAAS,EAAC,uDAAuD,aAEpE,gBACE,uBAAuB,EAAE;oBACvB,MAAM,EACJ,yEAAyE;wBACzE,mEAAmE;wBACnE,sDAAsD;iBACzD,GACD,EACD,YAAY;gBACX,CAAC,CAAC,YAAY,CAAC,WAAW,CAAC;gBAC3B,CAAC,CAAC,UAAU;oBACV,CAAC,CAAC,CAAC,GAAG,EAAE;wBACJ,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,cAAc,CAAC,CAAC;wBAC5D,MAAM,aAAa,GAAG,SAAS,EAAE,cAAc,IAAI,cAAc,CAAC;wBAClE,MAAM,SAAS,GAAG,IAAI,CAAC,MAAM,CAC3B,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,cAAc,KAAK,aAAa,CAC1C,CAAC;wBACF,MAAM,UAAU,GAAG,SAAS,CAAC,MAAM,GAAG,CAAC,CAAC;wBACxC,MAAM,QAAQ,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC;wBAEvD,OAAO,CACL,8BACE,eAAK,SAAS,EAAC,qEAAqE,aAClF,cAAK,SAAS,EAAC,4EAA4E,YACxF,QAAQ,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE;gDACpB,MAAM,QAAQ,GACZ,GAAG,CAAC,EAAE,KAAK,cAAc;oDACzB,CAAC,GAAG,CAAC,EAAE,KAAK,aAAa;wDACvB,SAAS,EAAE,cAAc,KAAK,GAAG,CAAC,EAAE,CAAC,CAAC;gDAC1C,OAAO,CACL,eAEE,GAAG,EAAE,QAAQ,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC,SAAS,EAC1C,SAAS,EAAE,EAAE,CACX,gGAAgG,EAChG,QAAQ;wDACN,CAAC,CAAC,2BAA2B;wDAC7B,CAAC,CAAC,6DAA6D,CAClE,aAED,kBACE,IAAI,EAAC,QAAQ,EACb,OAAO,EAAE,GAAG,EAAE,CAAC,YAAY,CAAC,GAAG,CAAC,EAAE,CAAC,EACnC,SAAS,EAAC,gEAAgE,aAE1E,eAAM,SAAS,EAAC,eAAe,YAAE,GAAG,CAAC,KAAK,GAAQ,EACjD,GAAG,CAAC,MAAM,KAAK,SAAS,IAAI,CAC3B,eAAM,SAAS,EAAC,wEAAwE,GAAG,CAC5F,IACM,EACT,iBACE,IAAI,EAAC,QAAQ,gBACF,WAAW,EACtB,OAAO,EAAE,CAAC,CAAC,EAAE,EAAE;gEACb,CAAC,CAAC,eAAe,EAAE,CAAC;gEACpB,CAAC,CAAC,cAAc,EAAE,CAAC;gEACnB,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;4DACnB,CAAC,EACD,SAAS,EAAC,4FAA4F,EACtG,KAAK,EAAE;gEACL,QAAQ,EAAE,UAAU;gEACpB,KAAK,EAAE,CAAC;gEACR,GAAG,EAAE,CAAC;gEACN,MAAM,EAAE,CAAC;gEACT,KAAK,EAAE,EAAE;gEACT,YAAY,EAAE,CAAC;gEACf,YAAY,EAAE,aAAa;gEAC3B,UAAU,EACR,gEAAgE;6DACnE,YAED,KAAC,KAAK,IAAC,IAAI,EAAE,EAAE,GAAI,GACZ,KAzCJ,GAAG,CAAC,EAAE,CA0CP,CACP,CAAC;4CACJ,CAAC,CAAC,GACE,EACN,KAAC,eAAe,IAAC,aAAa,EAAE,GAAG,YACjC,eAAK,SAAS,EAAC,2CAA2C,aACxD,MAAC,OAAO,eACN,KAAC,cAAc,IAAC,OAAO,kBACrB,iBACE,OAAO,EAAE,MAAM,gBACJ,UAAU,EACrB,SAAS,EAAC,oHAAoH,YAE9H,KAAC,QAAQ,IAAC,IAAI,EAAE,EAAE,GAAI,GACf,GACM,EACjB,KAAC,cAAc,2BAA0B,IACjC,EACV,MAAC,OAAO,eACN,KAAC,cAAc,IAAC,OAAO,kBACrB,iBACE,OAAO,EAAE,GAAG,EAAE,CAAC,cAAc,CAAC,CAAC,WAAW,CAAC,gBAChC,WAAW,EACtB,SAAS,EAAE,EAAE,CACX,oHAAoH,EACpH,WAAW,IAAI,2BAA2B,CAC3C,YAED,KAAC,WAAW,IAAC,IAAI,EAAE,EAAE,GAAI,GAClB,GACM,EACjB,KAAC,cAAc,4BAA2B,IAClC,IACN,GACU,IACd,EACL,UAAU,IAAI,CACb,cAAK,SAAS,EAAC,mFAAmF,YAChG,eAAK,SAAS,EAAC,4EAA4E,aACzF,iBACE,OAAO,EAAE,GAAG,EAAE,CAAC,YAAY,CAAC,aAAc,CAAC,EAC3C,SAAS,EAAE,EAAE,CACX,8FAA8F,EAC9F,cAAc,KAAK,aAAa;oDAC9B,CAAC,CAAC,2BAA2B;oDAC7B,CAAC,CAAC,6DAA6D,CAClE,qBAGM,EACR,SAAS,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CACtB,eAEE,GAAG,EACD,GAAG,CAAC,EAAE,KAAK,cAAc;oDACvB,CAAC,CAAC,cAAc;oDAChB,CAAC,CAAC,SAAS,EAEf,SAAS,EAAE,EAAE,CACX,gGAAgG,EAChG,GAAG,CAAC,EAAE,KAAK,cAAc;oDACvB,CAAC,CAAC,2BAA2B;oDAC7B,CAAC,CAAC,6DAA6D,CAClE,aAED,kBACE,IAAI,EAAC,QAAQ,EACb,OAAO,EAAE,GAAG,EAAE,CAAC,YAAY,CAAC,GAAG,CAAC,EAAE,CAAC,EACnC,SAAS,EAAC,4DAA4D,aAEtE,eAAM,SAAS,EAAC,eAAe,YAC5B,GAAG,CAAC,YAAY,IAAI,GAAG,CAAC,KAAK,GACzB,EACN,GAAG,CAAC,MAAM,KAAK,SAAS,IAAI,CAC3B,eAAM,SAAS,EAAC,oEAAoE,GAAG,CACxF,IACM,EACT,iBACE,IAAI,EAAC,QAAQ,gBACF,WAAW,EACtB,OAAO,EAAE,CAAC,CAAC,EAAE,EAAE;4DACb,CAAC,CAAC,eAAe,EAAE,CAAC;4DACpB,CAAC,CAAC,cAAc,EAAE,CAAC;4DACnB,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;wDACnB,CAAC,EACD,SAAS,EAAC,4FAA4F,EACtG,KAAK,EAAE;4DACL,QAAQ,EAAE,UAAU;4DACpB,KAAK,EAAE,CAAC;4DACR,GAAG,EAAE,CAAC;4DACN,MAAM,EAAE,CAAC;4DACT,KAAK,EAAE,EAAE;4DACT,YAAY,EAAE,CAAC;4DACf,YAAY,EAAE,aAAa;4DAC3B,UAAU,EACR,gEAAgE;yDACnE,YAED,KAAC,KAAK,IAAC,IAAI,EAAE,EAAE,GAAI,GACZ,KA/CJ,GAAG,CAAC,EAAE,CAgDP,CACP,CAAC,IACE,GACF,CACP,IACA,CACJ,CAAC;oBACJ,CAAC,CAAC,EAAE;oBACN,CAAC,CAAC,IAAI,EAGV,eAAK,SAAS,EAAC,uCAAuC,aACnD,aAAa,CAAC,CAAC,CAAC,aAAa,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,IAAI,EAGjD,WAAW,IAAI,CACd,KAAC,cAAc,IACb,OAAO,EAAE,OAAO,EAChB,UAAU,EAAE,IAAI,GAAG,CAAC,UAAU,CAAC,EAC/B,cAAc,EAAE,cAAc,EAC9B,QAAQ,EAAE,eAAe,EACzB,OAAO,EAAE,GAAG,EAAE,CAAC,cAAc,CAAC,KAAK,CAAC,EACpC,QAAQ,EAAE,aAAa,GACvB,CACH,EAGA,WAAW,IAAI,KAAC,WAAW,IAAC,OAAO,EAAE,GAAG,EAAE,CAAC,cAAc,CAAC,KAAK,CAAC,GAAI,EAKpE,CAAC,GAAG,IAAI,GAAG,CAAC,UAAU,CAAC,CAAC;yBACtB,MAAM,CACL,CAAC,KAAK,EAAE,EAAE,CACR,KAAK,KAAK,cAAc,IAAI,cAAc,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,CAChE;yBACA,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE;wBACb,MAAM,cAAc,GAAG,2BAA2B,CAAC,KAAK,CAAC,CAAC;wBAC1D,OAAO,CACL,eAEE,SAAS,EAAC,yBAAyB,EACnC,KAAK,EAAE;gCACL,OAAO,EACL,aAAa,IAAI,KAAK,KAAK,cAAc,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM;6BAC9D,aAED,KAAC,cAAc,IACb,QAAQ,EAAE,KAAK,EACf,MAAM,EAAE,MAAM,EACd,OAAO,EAAE,GAAG,EAAE;wCACZ,MAAM,MAAM,GAAG,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;wCAC3C,MAAM,EAAE,WAAW,CACjB,4FAA4F,CAC7F,CAAC;oCACJ,CAAC,GACD,EACF,KAAC,aAAa,OACR,KAAK,EACT,GAAG,EAAE,CAAC,MAAM,EAAE,EAAE;wCACd,IAAI,MAAM,EAAE,CAAC;4CACX,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;wCACtC,CAAC;6CAAM,CAAC;4CACN,QAAQ,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;wCACjC,CAAC;oCACH,CAAC,EACD,QAAQ,EAAE,KAAK,EACf,KAAK,EAAE,KAAK,EACZ,MAAM,EAAE,MAAM,EACd,WAAW,EACT,YAAY,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,WAAW,CAAC,KAAK,CAAC,EAEvD,oBAAoB,EAAE,CAAC,KAAK,EAAE,EAAE,CAC9B,gBAAgB,CAAC,CAAC,IAAI,EAAE,EAAE,CACxB,IAAI,CAAC,KAAK,CAAC,KAAK,KAAK;wCACnB,CAAC,CAAC,IAAI;wCACN,CAAC,CAAC,EAAE,GAAG,IAAI,EAAE,CAAC,KAAK,CAAC,EAAE,KAAK,EAAE,CAChC,EAEH,YAAY,EAAE,gBAAgB,EAC9B,eAAe,EAAE,mBAAmB,EACpC,cAAc,EAAE,kBAAkB,EAClC,aAAa,EAAE,cAAc,EAAE,KAAK,EACpC,cAAc,EAAE,cAAc,EAAE,MAAM,EACtC,cAAc,EAAE,cAAc,EAAE,MAAM,IAAI,MAAM,EAChD,YAAY,EAAE,YAAY,EAC1B,eAAe,EAAE,eAAe,EAChC,aAAa,EAAE,iBAAiB,EAChC,cAAc,EAAE,kBAAkB,EAClC,UAAU,EAAE,GAAG,EAAE,CAAC,cAAc,CAAC,KAAK,CAAC,GACvC,KAlDG,KAAK,CAmDN,CACP,CAAC;oBACJ,CAAC,CAAC,IACA,IACF,CACP,CAAC;AACJ,CAAC","sourcesContent":["import React, { useState, useRef, useEffect, useCallback } from \"react\";\nimport { IconX, IconPlus, IconHistory, IconSearch } from \"@tabler/icons-react\";\nimport {\n AssistantChat,\n type AssistantChatProps,\n type AssistantChatHandle,\n} from \"./AssistantChat.js\";\nimport { isTrustedFrameMessage } from \"./frame.js\";\nimport { cn } from \"./utils.js\";\nimport {\n Tooltip,\n TooltipContent,\n TooltipProvider,\n TooltipTrigger,\n} from \"./components/ui/tooltip.js\";\nimport { useChatThreads, type ChatThreadSummary } from \"./use-chat-threads.js\";\nimport { agentNativePath } from \"./api-path.js\";\nimport { RunStuckBanner } from \"./RunStuckBanner.js\";\nimport { DEFAULT_MODEL } from \"../agent/default-model.js\";\nimport {\n getReasoningEffortOptionsForModel,\n isReasoningEffort,\n type ReasoningEffort,\n} from \"../shared/reasoning-effort.js\";\n\ninterface EngineModelGroup {\n engine: string;\n label: string;\n models: string[];\n configured: boolean;\n}\n\ninterface ModelSelection {\n model: string;\n engine?: string;\n effort?: ReasoningEffort;\n}\n\nconst MODEL_SELECTION_STORAGE_KEY = \"agent-native:chat-models:selection\";\n\nfunction readStoredModelSelection(key: string): ModelSelection | undefined {\n if (typeof window === \"undefined\") return undefined;\n try {\n const raw = window.localStorage.getItem(key);\n if (!raw) return undefined;\n const parsed = JSON.parse(raw) as Partial<ModelSelection>;\n if (typeof parsed.model !== \"string\" || !parsed.model.trim()) {\n return undefined;\n }\n const selection: ModelSelection = {\n model: parsed.model,\n effort: isReasoningEffort(parsed.effort) ? parsed.effort : \"auto\",\n };\n if (typeof parsed.engine === \"string\") selection.engine = parsed.engine;\n return selection;\n } catch {\n return undefined;\n }\n}\n\nfunction writeStoredModelSelection(key: string, selection: ModelSelection) {\n if (typeof window === \"undefined\") return;\n try {\n window.localStorage.setItem(key, JSON.stringify(selection));\n } catch {}\n}\n\nfunction resolveModelSelection(\n selection: ModelSelection | undefined,\n groups: EngineModelGroup[],\n): ModelSelection | undefined {\n if (!selection?.model) return undefined;\n if (groups.length === 0) {\n const requestedEffort = selection.effort ?? \"auto\";\n const effortOptions = getReasoningEffortOptionsForModel(selection.model);\n return {\n model: selection.model,\n effort:\n requestedEffort === \"auto\" || effortOptions.includes(requestedEffort)\n ? requestedEffort\n : \"auto\",\n };\n }\n const preferredGroup = groups.find(\n (group) =>\n group.engine === selection.engine &&\n group.models.includes(selection.model),\n );\n const fallbackGroup = groups.find((group) =>\n group.models.includes(selection.model),\n );\n if (groups.length > 0 && !preferredGroup && !fallbackGroup) {\n return undefined;\n }\n const engine =\n preferredGroup?.engine ?? fallbackGroup?.engine ?? selection.engine;\n if (!engine && groups.length > 0) return undefined;\n\n const requestedEffort = selection.effort ?? \"auto\";\n const effortOptions = getReasoningEffortOptionsForModel(selection.model);\n const effort =\n requestedEffort === \"auto\" || effortOptions.includes(requestedEffort)\n ? requestedEffort\n : \"auto\";\n const resolved: ModelSelection = { model: selection.model, effort };\n if (engine) resolved.engine = engine;\n return resolved;\n}\n\n// ─── Skeleton Loader ─────────────────────────────────────────────────────────\n\nfunction ChatSkeleton({\n header,\n headerOnly = false,\n}: {\n header?: React.ReactNode;\n headerOnly?: boolean;\n}) {\n return (\n <div\n className={cn(\n \"flex flex-col min-h-0\",\n headerOnly ? \"shrink-0\" : \"flex-1 h-full\",\n )}\n >\n {header ?? (\n <div className=\"flex items-center px-1 py-1 border-b border-border shrink-0 gap-0.5\">\n <div className=\"h-[22px] w-20 rounded-md bg-muted animate-pulse\" />\n <div className=\"ml-auto flex gap-0.5\">\n <div className=\"h-[22px] w-[22px] rounded-md bg-muted animate-pulse\" />\n <div className=\"h-[22px] w-[22px] rounded-md bg-muted animate-pulse\" />\n </div>\n </div>\n )}\n {!headerOnly && (\n <div className=\"flex-1 flex flex-col gap-3 p-4\">\n <div className=\"flex justify-center py-8\">\n <div className=\"h-10 w-10 rounded-full bg-muted animate-pulse\" />\n </div>\n <div className=\"h-3 w-32 rounded bg-muted animate-pulse mx-auto\" />\n </div>\n )}\n </div>\n );\n}\n\n// ─── History Popover ─────────────────────────────────────────────────────────\n\nfunction HistoryPopover({\n threads,\n openTabIds,\n activeThreadId,\n onSelect,\n onClose,\n onSearch,\n}: {\n threads: ChatThreadSummary[];\n openTabIds: Set<string>;\n activeThreadId: string | null;\n onSelect: (id: string) => void;\n onClose: () => void;\n onSearch?: (query: string) => Promise<ChatThreadSummary[]>;\n}) {\n const [search, setSearch] = useState(\"\");\n const [searchResults, setSearchResults] = useState<\n ChatThreadSummary[] | null\n >(null);\n const [isSearching, setIsSearching] = useState(false);\n const inputRef = useRef<HTMLInputElement>(null);\n const debounceRef = useRef<ReturnType<typeof setTimeout>>(undefined);\n\n useEffect(() => {\n inputRef.current?.focus();\n }, []);\n\n useEffect(() => {\n const handler = (e: KeyboardEvent) => {\n if (e.key === \"Escape\") onClose();\n };\n window.addEventListener(\"keydown\", handler);\n return () => window.removeEventListener(\"keydown\", handler);\n }, [onClose]);\n\n // Debounced server-side search\n const searchIdRef = useRef(0);\n useEffect(() => {\n if (debounceRef.current) clearTimeout(debounceRef.current);\n const q = search.trim();\n if (!q) {\n searchIdRef.current++;\n setSearchResults(null);\n setIsSearching(false);\n return;\n }\n setIsSearching(true);\n const id = ++searchIdRef.current;\n debounceRef.current = setTimeout(async () => {\n if (onSearch) {\n const results = await onSearch(q);\n if (id !== searchIdRef.current) return;\n setSearchResults(results);\n } else {\n // Fallback to client-side filtering\n setSearchResults(null);\n }\n setIsSearching(false);\n }, 250);\n return () => {\n if (debounceRef.current) clearTimeout(debounceRef.current);\n };\n }, [search, onSearch]);\n\n // Hide empty threads from the history list — except the currently-active\n // one. The active thread always belongs in the list so the user can see\n // they're in it (the previous filter dropped a brand-new chat the user\n // had just opened, making them think their chat had vanished).\n const visibleThreads = threads.filter(\n (t) => t.messageCount > 0 || t.id === activeThreadId,\n );\n\n const filtered = search.trim()\n ? (searchResults ?? visibleThreads).filter(\n (t) => t.messageCount > 0 || t.id === activeThreadId,\n )\n : visibleThreads;\n\n const formatTime = (ts: number) => {\n const d = new Date(ts);\n const now = new Date();\n const diffMs = now.getTime() - d.getTime();\n const diffDays = Math.floor(diffMs / 86400000);\n if (diffDays === 0)\n return d.toLocaleTimeString([], { hour: \"numeric\", minute: \"2-digit\" });\n if (diffDays === 1) return \"Yesterday\";\n if (diffDays < 7) return d.toLocaleDateString([], { weekday: \"short\" });\n return d.toLocaleDateString([], { month: \"short\", day: \"numeric\" });\n };\n\n return (\n <>\n <div className=\"fixed inset-0 z-40\" onClick={onClose} />\n <div className=\"absolute right-2 top-0 z-50 w-72 rounded-lg border border-border bg-popover shadow-lg\">\n <div className=\"flex items-center gap-2 px-3 py-2 border-b border-border\">\n <IconSearch size={13} />\n <input\n ref={inputRef}\n type=\"text\"\n value={search}\n onChange={(e) => setSearch(e.target.value)}\n placeholder=\"Search chats...\"\n className=\"flex-1 bg-transparent text-xs text-foreground placeholder:text-muted-foreground outline-none\"\n />\n </div>\n <div className=\"max-h-64 overflow-y-auto py-1\">\n {isSearching ? (\n <div className=\"px-3 py-4 text-xs text-muted-foreground text-center\">\n Searching...\n </div>\n ) : filtered.length === 0 ? (\n <div className=\"px-3 py-4 text-xs text-muted-foreground text-center\">\n {search ? \"No matching chats\" : \"No chats yet\"}\n </div>\n ) : (\n filtered.map((thread) => {\n const isActive = thread.id === activeThreadId;\n return (\n <button\n key={thread.id}\n onClick={() => {\n onSelect(thread.id);\n onClose();\n }}\n className={cn(\n \"w-full px-3 py-2 text-left hover:bg-accent/50\",\n isActive && \"bg-accent/30\",\n )}\n >\n <div className=\"flex items-baseline justify-between gap-2\">\n <span className=\"text-xs font-medium text-foreground truncate\">\n {thread.title || thread.preview || \"Chat\"}\n </span>\n <span className=\"text-[10px] text-muted-foreground shrink-0\">\n {isActive\n ? \"Active\"\n : openTabIds.has(thread.id)\n ? \"Open\"\n : formatTime(thread.updatedAt)}\n </span>\n </div>\n {thread.preview && thread.title !== thread.preview && (\n <div className=\"text-[11px] text-muted-foreground truncate mt-0.5\">\n {thread.preview}\n </div>\n )}\n </button>\n );\n })\n )}\n </div>\n </div>\n </>\n );\n}\n\n// ─── Help Popover ────────────────────────────────────────────────────────────\n\nfunction HelpPopover({ onClose }: { onClose: () => void }) {\n useEffect(() => {\n const handler = (e: KeyboardEvent) => {\n if (e.key === \"Escape\") onClose();\n };\n window.addEventListener(\"keydown\", handler);\n return () => window.removeEventListener(\"keydown\", handler);\n }, [onClose]);\n\n const commands = [\n {\n name: \"/clear\",\n description: \"Start a new chat (keeps current chat in history)\",\n },\n { name: \"/new\", description: \"Same as /clear\" },\n { name: \"/history\", description: \"Browse all chats\" },\n { name: \"/plan\", description: \"Switch to read-only planning\" },\n { name: \"/act\", description: \"Switch back to acting\" },\n { name: \"/help\", description: \"Show this list of commands\" },\n { name: \"@\", description: \"Mention files, agents, or resources\" },\n ];\n\n return (\n <>\n <div className=\"fixed inset-0 z-40\" onClick={onClose} />\n <div className=\"absolute right-2 top-0 z-50 w-72 rounded-lg border border-border bg-popover shadow-lg\">\n <div className=\"flex items-center justify-between px-3 py-2 border-b border-border\">\n <span className=\"text-xs font-medium text-foreground\">\n Available Commands\n </span>\n <button\n onClick={onClose}\n aria-label=\"Close help\"\n className=\"flex h-5 w-5 items-center justify-center rounded text-muted-foreground hover:text-foreground\"\n >\n <IconX size={12} />\n </button>\n </div>\n <div className=\"py-1\">\n {commands.map((cmd) => (\n <div key={cmd.name} className=\"px-3 py-1.5\">\n <div className=\"text-xs font-medium text-foreground\">\n {cmd.name}\n </div>\n <div className=\"text-[11px] text-muted-foreground\">\n {cmd.description}\n </div>\n </div>\n ))}\n </div>\n </div>\n </>\n );\n}\n\n// ─── Types ──────────────────────────────────────────────────────────────────\n\ninterface ChatTab {\n id: string;\n label: string;\n status: \"idle\" | \"running\" | \"completed\";\n /** If this tab is a sub-agent, the parent thread ID */\n parentThreadId?: string;\n /** Short name for sub-agent tabs (e.g. \"Research\", \"Draft email\") */\n subAgentName?: string;\n}\n\nexport interface MultiTabAssistantChatHeaderProps {\n tabs: ChatTab[];\n activeTabId: string;\n activeTabMessageCount: number;\n setActiveTabId: (tabId: string) => void;\n addTab: () => void;\n closeTab: (tabId: string) => void;\n closeOtherTabs: (tabId: string) => void;\n closeAllTabs: () => void;\n clearActiveTab: () => void;\n /** Open the history popover */\n showHistory?: boolean;\n toggleHistory?: () => void;\n /** Number of open tabs (useful for triggering scroll on tab count change) */\n tabCount: number;\n}\n\n// ─── Component ──────────────────────────────────────────────────────────────\n\nexport type MultiTabAssistantChatProps = Omit<\n AssistantChatProps,\n \"tabId\" | \"threadId\"\n> & {\n /** Show the tab bar. Default: true */\n showTabBar?: boolean;\n /** Optional custom single-row header renderer */\n renderHeader?: (props: MultiTabAssistantChatHeaderProps) => React.ReactNode;\n /** Optional overlay actions renderer for the active tab */\n renderOverlay?: (props: MultiTabAssistantChatHeaderProps) => React.ReactNode;\n /** Hide the chat content while keeping the header visible. Used when CLI/resources mode is active. */\n contentHidden?: boolean;\n /** Namespace for localStorage keys — used to isolate chat state per app in the frame. */\n storageKey?: string;\n};\n\nexport function MultiTabAssistantChat({\n showTabBar = true,\n renderHeader,\n renderOverlay,\n contentHidden = false,\n apiUrl = agentNativePath(\"/_agent-native/agent-chat\"),\n storageKey,\n ...props\n}: MultiTabAssistantChatProps) {\n const {\n threads,\n activeThreadId,\n isLoading,\n createThread,\n switchThread,\n deleteThread,\n forkThread,\n saveThreadData,\n generateTitle,\n searchThreads,\n refreshThreads,\n isNewThread,\n } = useChatThreads(apiUrl, storageKey);\n\n // Namespace all localStorage keys by storageKey when provided (for per-app isolation in frame)\n const keyPrefix = storageKey ? `:${storageKey}` : \"\";\n const modelSelectionKey = `${MODEL_SELECTION_STORAGE_KEY}${keyPrefix}`;\n\n // Track which tabs have been focused at least once (lazy mount for sub-agent tabs)\n const mountedTabsRef = useRef<Set<string>>(new Set());\n const activeThreadIdRef = useRef(activeThreadId);\n activeThreadIdRef.current = activeThreadId;\n // Mark the active tab as mounted so it persists when switched away\n if (activeThreadId) mountedTabsRef.current.add(activeThreadId);\n const chatRefs = useRef<Map<string, AssistantChatHandle>>(new Map());\n const pendingSends = useRef<Map<string, string>>(new Map());\n const [runningThreads, setRunningThreads] = useState<Set<string>>(new Set());\n const [showHistory, setShowHistory] = useState(false);\n const newThreadIds = useRef<Set<string>>(new Set());\n\n // ─── Model state ─────────────────────────────────────────────────────────\n const [availableModels, setAvailableModels] = useState<EngineModelGroup[]>(\n [],\n );\n const [defaultModel, setDefaultModel] = useState<string>(DEFAULT_MODEL);\n const threadModelRef = useRef<\n Map<string, { model: string; engine?: string; effort?: ReasoningEffort }>\n >(new Map());\n const [persistedModelSelection, setPersistedModelSelection] = useState<\n ModelSelection | undefined\n >(() => readStoredModelSelection(modelSelectionKey));\n const [modelSelectionVersion, setModelSelectionVersion] = useState(0);\n\n useEffect(() => {\n setPersistedModelSelection(readStoredModelSelection(modelSelectionKey));\n }, [modelSelectionKey]);\n\n const bumpModelSelectionVersion = useCallback(() => {\n setModelSelectionVersion((version) => version + 1);\n }, []);\n const postMessageSubmissionsDisabled = props.composerDisabled === true;\n\n const resolveThreadModelSelection = useCallback(\n (threadId: string) =>\n resolveModelSelection(\n threadModelRef.current.get(threadId) ?? persistedModelSelection,\n availableModels,\n ),\n [availableModels, persistedModelSelection, modelSelectionVersion],\n );\n\n const persistModelSelection = useCallback(\n (selection: ModelSelection) => {\n setPersistedModelSelection(selection);\n writeStoredModelSelection(modelSelectionKey, selection);\n },\n [modelSelectionKey],\n );\n\n const handleModelChange = useCallback(\n (model: string, engine: string) => {\n const threadId = activeThreadIdRef.current;\n if (!threadId) return;\n const existing = threadModelRef.current.get(threadId);\n const existingEffort = existing?.effort ?? \"auto\";\n const effortOptions = getReasoningEffortOptionsForModel(model);\n const effort =\n existingEffort === \"auto\" || effortOptions.includes(existingEffort)\n ? existingEffort\n : \"auto\";\n const selection = { model, engine, effort };\n threadModelRef.current.set(threadId, selection);\n persistModelSelection(selection);\n bumpModelSelectionVersion();\n },\n [bumpModelSelectionVersion, persistModelSelection],\n );\n\n const handleEffortChange = useCallback(\n (effort: ReasoningEffort) => {\n const threadId = activeThreadIdRef.current;\n if (!threadId) return;\n const existing = resolveThreadModelSelection(threadId);\n const model = existing?.model ?? defaultModel;\n const engine =\n existing?.engine ??\n availableModels.find((group) => group.models.includes(model))?.engine ??\n availableModels[0]?.engine;\n const selection: ModelSelection = { model, effort };\n if (engine) selection.engine = engine;\n threadModelRef.current.set(threadId, selection);\n persistModelSelection(selection);\n bumpModelSelectionVersion();\n },\n [\n availableModels,\n bumpModelSelectionVersion,\n defaultModel,\n persistModelSelection,\n resolveThreadModelSelection,\n ],\n );\n\n const refreshEngines = useCallback(() => {\n Promise.all([\n fetch(agentNativePath(\"/_agent-native/actions/manage-agent-engine\"), {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({ action: \"list\" }),\n }).then((r) => (r.ok ? r.json() : null)),\n fetch(agentNativePath(\"/_agent-native/env-status\"))\n .then((r) => (r.ok ? r.json() : []))\n .catch(() => []),\n fetch(agentNativePath(\"/_agent-native/builder/status\"))\n .then((r) => (r.ok ? r.json() : null))\n .catch(() => null),\n ])\n .then(([enginesData, envKeys, builderStatus]) => {\n if (!enginesData?.engines) return;\n const configuredKeys = new Set(\n (envKeys as Array<{ key: string; configured: boolean }>)\n .filter((k) => k.configured)\n .map((k) => k.key),\n );\n const builderConnected = builderStatus?.configured === true;\n const currentEngineName: string | undefined =\n enginesData.current?.engine;\n const currentModel: string | undefined = enginesData.current?.model;\n\n let groups: EngineModelGroup[];\n\n if (builderConnected) {\n // When Builder.io is connected, show all Builder-supported\n // models grouped by provider — all route through the builder\n // engine so no individual API keys are needed.\n const builderEngine = enginesData.engines.find(\n (e: any) => e.name === \"builder\",\n );\n const builderModels: string[] = builderEngine?.supportedModels ?? [];\n const claude = builderModels.filter((m: string) =>\n m.startsWith(\"claude-\"),\n );\n const openai = builderModels.filter((m: string) =>\n m.startsWith(\"gpt-\"),\n );\n const gemini = builderModels.filter((m: string) =>\n m.startsWith(\"gemini-\"),\n );\n\n groups = [\n ...(claude.length\n ? [\n {\n engine: \"builder\",\n label: \"Claude\",\n models: claude,\n configured: true,\n },\n ]\n : []),\n ...(openai.length\n ? [\n {\n engine: \"builder\",\n label: \"OpenAI\",\n models: openai,\n configured: true,\n },\n ]\n : []),\n ...(gemini.length\n ? [\n {\n engine: \"builder\",\n label: \"Gemini\",\n models: gemini,\n configured: true,\n },\n ]\n : []),\n ];\n\n // Ensure the current model shows in the list even if it's not\n // in BUILDER_SUPPORTED_MODELS (e.g. custom model string).\n if (currentModel && !builderModels.includes(currentModel)) {\n const firstGroup = groups[0];\n if (firstGroup) firstGroup.models.unshift(currentModel);\n }\n } else {\n // No Builder connection — show SDK engines that have API keys.\n const allowedEngines = new Set([\n \"anthropic\",\n \"ai-sdk:openai\",\n \"ai-sdk:google\",\n ]);\n groups = enginesData.engines\n .filter((e: any) => allowedEngines.has(e.name))\n .map((e: any) => {\n const models = [...e.supportedModels];\n if (\n e.name === currentEngineName &&\n currentModel &&\n !models.includes(currentModel)\n ) {\n models.unshift(currentModel);\n }\n return {\n engine: e.name,\n label: e.label,\n models,\n configured:\n e.requiredEnvVars.length === 0 ||\n e.requiredEnvVars.some((v: string) =>\n configuredKeys.has(v),\n ) ||\n e.name === currentEngineName,\n };\n });\n }\n setAvailableModels(groups);\n setDefaultModel(currentModel ?? DEFAULT_MODEL);\n })\n .catch(() => {});\n }, []);\n\n useEffect(() => {\n refreshEngines();\n window.addEventListener(\"agent-engine:configured-changed\", refreshEngines);\n return () =>\n window.removeEventListener(\n \"agent-engine:configured-changed\",\n refreshEngines,\n );\n }, [refreshEngines]);\n\n // Parent-child thread mapping — persisted to localStorage.\n // Maps childThreadId → parentThreadId for sub-agent tabs.\n const PARENT_MAP_KEY = `agent-chat-parent-map${keyPrefix}`;\n const [parentMap, setParentMap] = useState<Record<string, string>>(() => {\n try {\n const saved = localStorage.getItem(PARENT_MAP_KEY);\n if (saved) return JSON.parse(saved);\n } catch {}\n return {};\n });\n\n // Persist parent map to localStorage\n useEffect(() => {\n try {\n localStorage.setItem(PARENT_MAP_KEY, JSON.stringify(parentMap));\n } catch {}\n }, [parentMap, PARENT_MAP_KEY]);\n\n // Sub-agent display names — persisted to localStorage.\n // Maps childThreadId → short name (e.g. \"Research\", \"Draft email\").\n const SUB_AGENT_NAMES_KEY = `agent-chat-sub-agent-names${keyPrefix}`;\n const [subAgentNames, setSubAgentNames] = useState<Record<string, string>>(\n () => {\n try {\n const saved = localStorage.getItem(SUB_AGENT_NAMES_KEY);\n if (saved) return JSON.parse(saved);\n } catch {}\n return {};\n },\n );\n\n useEffect(() => {\n try {\n localStorage.setItem(SUB_AGENT_NAMES_KEY, JSON.stringify(subAgentNames));\n } catch {}\n }, [subAgentNames, SUB_AGENT_NAMES_KEY]);\n\n // Open tabs — persisted to localStorage so they survive refresh.\n const OPEN_TABS_KEY = `agent-chat-open-tabs${keyPrefix}`;\n const [openTabIds, setOpenTabIds] = useState<string[]>(() => {\n try {\n const saved = localStorage.getItem(OPEN_TABS_KEY);\n if (saved) {\n const parsed = JSON.parse(saved);\n if (Array.isArray(parsed) && parsed.length > 0) {\n // Mark restored tabs as mounted\n for (const id of parsed) mountedTabsRef.current.add(id);\n return parsed;\n }\n }\n } catch {}\n return [];\n });\n const initializedRef = useRef(false);\n\n // Persist open tab IDs to localStorage (exclude sub-agent tabs — they're session-only)\n useEffect(() => {\n const mainTabs = openTabIds.filter((id) => !parentMap[id]);\n if (mainTabs.length > 0) {\n try {\n localStorage.setItem(OPEN_TABS_KEY, JSON.stringify(mainTabs));\n } catch {}\n }\n }, [openTabIds, parentMap, OPEN_TABS_KEY]);\n\n // Initialize open tabs once threads load — validate saved tabs still exist\n useEffect(() => {\n if (initializedRef.current || !activeThreadId || threads.length === 0)\n return;\n initializedRef.current = true;\n const threadIds = new Set(threads.map((t) => t.id));\n const threadMap = new Map(threads.map((t) => [t.id, t]));\n\n // Auto-close only empty tabs inactive for more than 4 hours. Non-empty\n // conversations should survive refresh even if they are old; otherwise the\n // chat appears to disappear even though it still exists in history.\n const STALE_THRESHOLD_MS = 4 * 60 * 60 * 1000;\n const now = Date.now();\n const isStale = (id: string) => {\n const thread = threadMap.get(id);\n return thread\n ? thread.messageCount === 0 &&\n now - thread.updatedAt > STALE_THRESHOLD_MS\n : false;\n };\n\n // If the active thread is a sub-agent, switch to its parent or the most recent main thread\n if (parentMap[activeThreadId]) {\n const parent = parentMap[activeThreadId];\n if (parent && threadIds.has(parent)) {\n switchThread(parent);\n } else {\n // Fall back to most recent main thread\n const mainThread = threads.find((t) => !parentMap[t.id]);\n if (mainThread) switchThread(mainThread.id);\n }\n }\n\n setOpenTabIds((prev) => {\n // Filter out tabs that no longer exist, sub-agent tabs, or stale tabs (>4h inactive)\n const valid = prev.filter(\n (id) => threadIds.has(id) && !parentMap[id] && !isStale(id),\n );\n // Ensure active thread is included (only if it's not a sub-agent and not stale)\n if (\n !parentMap[activeThreadId] &&\n !valid.includes(activeThreadId) &&\n !isStale(activeThreadId)\n ) {\n valid.push(activeThreadId);\n }\n return valid;\n });\n\n // If active thread is stale, start fresh\n if (!parentMap[activeThreadId] && isStale(activeThreadId)) {\n createThread();\n }\n }, [activeThreadId, threads, parentMap, switchThread, createThread]);\n\n // Ensure active thread is always in open tabs.\n // Use functional update to check inside the setter — avoids race with the\n // initialization effect that may have already added the ID in the same batch.\n useEffect(() => {\n if (activeThreadId) {\n setOpenTabIds((prev) =>\n prev.includes(activeThreadId) ? prev : [...prev, activeThreadId],\n );\n }\n }, [activeThreadId]);\n\n // Ensure at least one tab is always open — auto-create if sidebar is empty.\n // Skipped when an active thread already exists (e.g. the hook generated an\n // optimistic id for a brand-new session); the activeThreadId effect above\n // adds it to openTabIds without spinning up a duplicate thread.\n const autoCreatingRef = useRef(false);\n useEffect(() => {\n if (isLoading || autoCreatingRef.current) return;\n if (openTabIds.length === 0 && !activeThreadId) {\n autoCreatingRef.current = true;\n createThread().then((id) => {\n autoCreatingRef.current = false;\n if (id) {\n newThreadIds.current.add(id);\n setOpenTabIds([id]);\n }\n });\n }\n }, [isLoading, openTabIds, activeThreadId, createThread]);\n\n // Focus the composer when switching tabs\n useEffect(() => {\n if (!activeThreadId) return;\n // Small delay to ensure the tab is visible before focusing\n const t = setTimeout(() => {\n chatRefs.current.get(activeThreadId)?.focusComposer();\n }, 50);\n return () => clearTimeout(t);\n }, [activeThreadId]);\n\n // Ref callback: scroll the active tab into view in the overflow container.\n // Uses getBoundingClientRect for reliable positioning regardless of offsetParent.\n // A margin keeps the active tab from sitting flush against either container\n // edge — at the right edge it was landing directly under the +/history/menu\n // buttons, which visually clipped the tab label.\n const activeTabRefCb = useCallback((el: HTMLElement | null) => {\n if (!el) return;\n const container = el.parentElement;\n if (!container) return;\n const MARGIN = 24;\n requestAnimationFrame(() => {\n const containerRect = container.getBoundingClientRect();\n const tabRect = el.getBoundingClientRect();\n if (tabRect.left < containerRect.left + MARGIN) {\n container.scrollLeft += tabRect.left - containerRect.left - MARGIN;\n } else if (tabRect.right > containerRect.right - MARGIN) {\n container.scrollLeft += tabRect.right - containerRect.right + MARGIN;\n }\n });\n }, []);\n\n const [messageCounts, setMessageCounts] = useState<Record<string, number>>(\n () => Object.fromEntries(threads.map((t) => [t.id, t.messageCount ?? 0])),\n );\n\n // Sync message counts from threads when they load\n useEffect(() => {\n if (threads.length > 0) {\n setMessageCounts((prev) => {\n const next = { ...prev };\n for (const t of threads) {\n if (!(t.id in next)) {\n next[t.id] = t.messageCount ?? 0;\n }\n }\n return next;\n });\n }\n }, [threads]);\n\n // Listen for builder.submitChat postMessages\n useEffect(() => {\n const handler = (event: MessageEvent) => {\n if (!isTrustedFrameMessage(event)) return;\n if (event.data?.type !== \"agentNative.submitChat\") return;\n const message = event.data.data?.message as string;\n if (!message) return;\n const context = event.data.data?.context as string | undefined;\n const openSidebar = event.data.data?.openSidebar as boolean | undefined;\n const model = event.data.data?.model as string | undefined;\n const effort = event.data.data?.effort as unknown;\n const newTab = event.data.data?.newTab as boolean | undefined;\n const tabId = event.data.data?.tabId;\n const requestedTabId = typeof tabId === \"string\" ? tabId : undefined;\n const background = event.data.data?.background as boolean | undefined;\n\n // Make sure the sidebar is visible to show the response, unless the\n // caller explicitly opted out or it's a background send.\n if (openSidebar !== false && !background) {\n window.dispatchEvent(new CustomEvent(\"agent-panel:open\"));\n }\n if (postMessageSubmissionsDisabled) return;\n\n // Plan mode is sent as request metadata by the chat adapter. Keep the\n // user-visible message clean so mode instructions never enter history.\n const fullMessage = context\n ? `${message}\\n\\n<context>\\n${context}\\n</context>`\n : message;\n\n const sendToTab = (threadId: string) => {\n // If a model override was specified, apply it only if we recognize it\n if (model) {\n const matchedGroup = availableModels.find((g) =>\n g.models.includes(model),\n );\n if (matchedGroup) {\n const requestedEffort = isReasoningEffort(effort) ? effort : \"auto\";\n const effortOptions = getReasoningEffortOptionsForModel(model);\n const selectedEffort =\n requestedEffort === \"auto\" ||\n effortOptions.includes(requestedEffort)\n ? requestedEffort\n : \"auto\";\n threadModelRef.current.set(threadId, {\n model,\n engine: matchedGroup.engine,\n effort: selectedEffort,\n });\n bumpModelSelectionVersion();\n }\n }\n\n const ref = chatRefs.current.get(threadId);\n if (ref) {\n ref.sendMessage(fullMessage);\n } else {\n pendingSends.current.set(threadId, fullMessage);\n }\n };\n\n if (newTab) {\n const previousTabId = activeThreadIdRef.current;\n createThread(requestedTabId).then((newId) => {\n if (newId) {\n newThreadIds.current.add(newId);\n sendToTab(newId);\n if (background && previousTabId) {\n switchThread(previousTabId);\n }\n }\n });\n } else {\n const currentTabId = activeThreadIdRef.current;\n if (!currentTabId) return;\n sendToTab(currentTabId);\n }\n };\n window.addEventListener(\"message\", handler);\n return () => window.removeEventListener(\"message\", handler);\n }, [\n availableModels,\n bumpModelSelectionVersion,\n createThread,\n postMessageSubmissionsDisabled,\n switchThread,\n ]);\n\n // Process pending sends when refs mount\n useEffect(() => {\n for (const [tabId, message] of pendingSends.current) {\n const ref = chatRefs.current.get(tabId);\n if (ref) {\n setTimeout(() => ref.sendMessage(message), 50);\n pendingSends.current.delete(tabId);\n }\n }\n }, [openTabIds]);\n\n // Listen for chatRunning completion events\n useEffect(() => {\n const handler = (e: Event) => {\n const detail = (e as CustomEvent).detail;\n if (!detail) return;\n const { isRunning, tabId } = detail;\n if (!tabId) return;\n\n setRunningThreads((prev) => {\n const next = new Set(prev);\n if (isRunning) {\n next.add(tabId);\n } else {\n next.delete(tabId);\n }\n return next;\n });\n };\n window.addEventListener(\"agentNative.chatRunning\", handler);\n return () => window.removeEventListener(\"agentNative.chatRunning\", handler);\n }, []);\n\n const addTab = useCallback(async () => {\n const id = await createThread();\n if (id) {\n newThreadIds.current.add(id);\n }\n }, [createThread]);\n\n const closeTab = useCallback(\n (tabId: string) => {\n setOpenTabIds((prev) => {\n if (prev.length <= 1) {\n // Last tab — create a new one and replace the old tab atomically\n createThread().then((newId) => {\n if (newId) {\n newThreadIds.current.add(newId);\n setOpenTabIds([newId]);\n }\n });\n return prev; // Keep old tab until new one is ready\n }\n const next = prev.filter((id) => id !== tabId);\n if (tabId === activeThreadIdRef.current && next.length > 0) {\n const idx = prev.indexOf(tabId);\n switchThread(next[Math.min(idx, next.length - 1)]);\n }\n return next;\n });\n chatRefs.current.delete(tabId);\n pendingSends.current.delete(tabId);\n newThreadIds.current.delete(tabId);\n threadModelRef.current.delete(tabId);\n // Clean up parent map and sub-agent names\n setParentMap((prev) => {\n if (!(tabId in prev)) return prev;\n const { [tabId]: _, ...rest } = prev;\n return rest;\n });\n setSubAgentNames((prev) => {\n if (!(tabId in prev)) return prev;\n const { [tabId]: _, ...rest } = prev;\n return rest;\n });\n },\n [switchThread, createThread],\n );\n\n const closeOtherTabs = useCallback(\n (tabId: string) => {\n setOpenTabIds([tabId]);\n if (activeThreadIdRef.current !== tabId) {\n switchThread(tabId);\n }\n // Clean up refs for closed tabs\n for (const key of chatRefs.current.keys()) {\n if (key !== tabId) {\n chatRefs.current.delete(key);\n pendingSends.current.delete(key);\n newThreadIds.current.delete(key);\n threadModelRef.current.delete(key);\n }\n }\n // Clean up parent map and sub-agent names — only keep entries for the surviving tab\n setParentMap((prev) => {\n if (tabId in prev) return { [tabId]: prev[tabId] };\n return {};\n });\n setSubAgentNames((prev) => {\n if (tabId in prev) return { [tabId]: prev[tabId] };\n return {};\n });\n },\n [switchThread],\n );\n\n const closeAllTabs = useCallback(async () => {\n const id = await createThread();\n if (id) {\n newThreadIds.current.add(id);\n setOpenTabIds([id]);\n switchThread(id);\n // Clean up all old refs\n chatRefs.current.clear();\n pendingSends.current.clear();\n threadModelRef.current.clear();\n setParentMap({});\n setSubAgentNames({});\n }\n }, [createThread, switchThread]);\n\n // Keyboard shortcuts dispatched from AgentPanel based on the active mode\n useEffect(() => {\n const handleCloseCurrent = () => {\n const id = activeThreadIdRef.current;\n if (id) closeTab(id);\n };\n const handleCloseAll = () => {\n void closeAllTabs();\n };\n window.addEventListener(\"agent-chat:close-current-tab\", handleCloseCurrent);\n window.addEventListener(\"agent-chat:close-all-tabs\", handleCloseAll);\n return () => {\n window.removeEventListener(\n \"agent-chat:close-current-tab\",\n handleCloseCurrent,\n );\n window.removeEventListener(\"agent-chat:close-all-tabs\", handleCloseAll);\n };\n }, [closeTab, closeAllTabs]);\n\n const clearActiveTab = useCallback(() => {\n addTab();\n }, [addTab]);\n\n const openFromHistory = useCallback(\n (threadId: string) => {\n if (!openTabIds.includes(threadId)) {\n setOpenTabIds((prev) => [...prev, threadId]);\n }\n switchThread(threadId);\n },\n [openTabIds, switchThread],\n );\n\n // Listen for agent-task-open events (from AgentTaskCard \"Open\" button)\n useEffect(() => {\n function handleOpenTask(e: Event) {\n const detail = (e as CustomEvent).detail;\n const threadId = detail?.threadId;\n if (!threadId) return;\n // The current active thread is the parent that spawned this sub-agent\n const parentId = activeThreadIdRef.current;\n if (parentId && parentId !== threadId) {\n setParentMap((prev) =>\n prev[threadId] === parentId\n ? prev\n : { ...prev, [threadId]: parentId },\n );\n }\n // Store the sub-agent name/description for the tab label\n const name = detail.name || detail.description || \"\";\n if (name) {\n setSubAgentNames((prev) =>\n prev[threadId] === name ? prev : { ...prev, [threadId]: name },\n );\n }\n // Refresh thread list so the new sub-agent thread appears with its title\n refreshThreads();\n // Open the sub-agent thread as a tab — insert after parent for visual grouping\n if (!openTabIds.includes(threadId)) {\n setOpenTabIds((prev) => {\n if (parentId) {\n const parentIdx = prev.indexOf(parentId);\n if (parentIdx !== -1) {\n // Insert after the parent (and any existing children of that parent)\n const next = [...prev];\n let insertIdx = parentIdx + 1;\n // Skip past any existing children of the same parent\n while (\n insertIdx < next.length &&\n parentMap[next[insertIdx]] === parentId\n ) {\n insertIdx++;\n }\n next.splice(insertIdx, 0, threadId);\n return next;\n }\n }\n return [...prev, threadId];\n });\n }\n switchThread(threadId);\n }\n window.addEventListener(\"agent-task-open\", handleOpenTask);\n return () => window.removeEventListener(\"agent-task-open\", handleOpenTask);\n }, [openTabIds, switchThread, refreshThreads, parentMap]);\n\n // Watch for agent-issued chat-command in application-state\n const lastChatCommandRef = useRef(0);\n useEffect(() => {\n let stopped = false;\n let timer: ReturnType<typeof setTimeout> | null = null;\n\n async function pollChatCommand() {\n if (stopped) return;\n try {\n const res = await fetch(\n agentNativePath(\"/_agent-native/application-state/chat-command\"),\n );\n if (res.ok) {\n const data = await res.json();\n if (\n data?.value?.command === \"open-thread\" &&\n data.value.threadId &&\n data.value.timestamp > lastChatCommandRef.current\n ) {\n lastChatCommandRef.current = data.value.timestamp;\n const threadId = data.value.threadId as string;\n // Open the thread as a tab and focus it\n if (!openTabIds.includes(threadId)) {\n setOpenTabIds((prev) => [...prev, threadId]);\n }\n switchThread(threadId);\n // Clear the command\n fetch(\n agentNativePath(\"/_agent-native/application-state/chat-command\"),\n {\n method: \"DELETE\",\n headers: { \"X-Agent-Native-CSRF\": \"1\" },\n },\n ).catch(() => {});\n }\n }\n } catch {}\n if (!stopped) {\n timer = setTimeout(pollChatCommand, 2000);\n }\n }\n\n pollChatCommand();\n return () => {\n stopped = true;\n if (timer) clearTimeout(timer);\n };\n }, [openTabIds, switchThread]);\n\n const handleGenerateTitle = useCallback(\n (threadId: string, message: string) => {\n generateTitle(threadId, message).then((title) => {\n if (title) {\n // Persist the generated title to the server\n saveThreadData(threadId, {\n threadData: \"\",\n title,\n preview: message.slice(0, 120),\n });\n }\n });\n },\n [generateTitle, saveThreadData],\n );\n\n const handleSaveThread = useCallback(\n (\n threadId: string,\n data: {\n threadData: string;\n title: string;\n preview: string;\n messageCount: number;\n },\n ) => {\n saveThreadData(threadId, data);\n },\n [saveThreadData],\n );\n\n // ─── Slash command handler ──────────────────────────────────────────\n const [helpVisible, setHelpVisible] = useState(false);\n\n const handleSlashCommand = useCallback(\n (command: string) => {\n switch (command) {\n case \"clear\":\n case \"new\":\n addTab();\n break;\n case \"history\":\n setShowHistory(true);\n break;\n case \"plan\":\n props.onExecModeChange?.(\"plan\");\n break;\n case \"act\":\n props.onExecModeChange?.(\"build\");\n break;\n case \"help\":\n setHelpVisible(true);\n break;\n }\n },\n [addTab, props.onExecModeChange],\n );\n\n const handleForkChat = useCallback(\n async (sourceThreadId: string) => {\n const forkedId = await forkThread(sourceThreadId);\n if (!forkedId) return;\n setOpenTabIds((prev) => {\n const idx = prev.indexOf(sourceThreadId);\n if (idx !== -1) {\n const next = [...prev];\n next.splice(idx + 1, 0, forkedId);\n return next;\n }\n return [...prev, forkedId];\n });\n switchThread(forkedId);\n },\n [forkThread, switchThread],\n );\n\n // Build tabs from open thread IDs\n const threadMap = new Map(threads.map((t) => [t.id, t]));\n const tabs: ChatTab[] = openTabIds\n .filter((id) => threadMap.has(id) || id === activeThreadId)\n .map((id) => {\n const t = threadMap.get(id);\n return {\n id,\n label: t?.title || t?.preview?.slice(0, 30) || \"New chat\",\n status: runningThreads.has(id)\n ? (\"running\" as const)\n : (messageCounts[id] ?? t?.messageCount ?? 0) > 0\n ? (\"completed\" as const)\n : (\"idle\" as const),\n parentThreadId: parentMap[id],\n subAgentName: subAgentNames[id],\n };\n });\n\n // Include sub-agent tabs that aren't in threadMap yet (just created, not refreshed)\n for (const id of openTabIds) {\n if (!tabs.some((t) => t.id === id)) {\n tabs.push({\n id,\n label:\n subAgentNames[id] || (parentMap[id] ? \"Sub-agent...\" : \"New chat\"),\n status: \"running\" as const,\n parentThreadId: parentMap[id],\n subAgentName: subAgentNames[id],\n });\n }\n }\n\n const headerProps: MultiTabAssistantChatHeaderProps = {\n tabs,\n activeTabId: activeThreadId ?? \"\",\n activeTabMessageCount: activeThreadId\n ? (messageCounts[activeThreadId] ?? 0)\n : 0,\n setActiveTabId: switchThread,\n addTab,\n closeTab,\n closeOtherTabs,\n closeAllTabs,\n clearActiveTab,\n showHistory,\n toggleHistory: () => setShowHistory((v) => !v),\n tabCount: openTabIds.length,\n };\n\n // No full-shell skeleton: the hook seeds an optimistic activeThreadId\n // synchronously so the chat shell + composer can paint on first render.\n // Per-thread restore (existing chats with history) shows its own message-area\n // skeleton inside AssistantChat — header and composer stay visible.\n if (isLoading && !activeThreadId) {\n return (\n <ChatSkeleton\n header={renderHeader?.(headerProps)}\n headerOnly={contentHidden}\n />\n );\n }\n\n return (\n <div className=\"flex flex-1 flex-col h-full min-h-0 overflow-x-hidden\">\n {/* Tailwind group-hover/tab doesn't work in core package — inject directly */}\n <style\n dangerouslySetInnerHTML={{\n __html:\n \".agent-tab-close{opacity:0}.agent-tab:hover .agent-tab-close{opacity:1}\" +\n \".agent-tabs-scroll{scrollbar-width:none;-ms-overflow-style:none;}\" +\n \".agent-tabs-scroll::-webkit-scrollbar{display:none;}\",\n }}\n />\n {renderHeader\n ? renderHeader(headerProps)\n : showTabBar\n ? (() => {\n const activeTab = tabs.find((t) => t.id === activeThreadId);\n const focusParentId = activeTab?.parentThreadId || activeThreadId;\n const childTabs = tabs.filter(\n (t) => t.parentThreadId === focusParentId,\n );\n const hasSubTabs = childTabs.length > 0;\n const mainTabs = tabs.filter((t) => !t.parentThreadId);\n\n return (\n <>\n <div className=\"flex items-center px-1 py-1 border-b border-border shrink-0 gap-0.5\">\n <div className=\"agent-tabs-scroll flex items-center gap-0.5 min-w-0 overflow-x-auto flex-1\">\n {mainTabs.map((tab) => {\n const isActive =\n tab.id === activeThreadId ||\n (tab.id === focusParentId &&\n activeTab?.parentThreadId === tab.id);\n return (\n <div\n key={tab.id}\n ref={isActive ? activeTabRefCb : undefined}\n className={cn(\n \"agent-tab relative flex items-center rounded-md text-[11px] font-medium shrink-0 max-w-[130px]\",\n isActive\n ? \"bg-accent text-foreground\"\n : \"text-muted-foreground hover:text-foreground hover:bg-accent\",\n )}\n >\n <button\n type=\"button\"\n onClick={() => switchThread(tab.id)}\n className=\"flex items-center gap-1 px-2.5 py-1.5 min-w-0 flex-1 text-left\"\n >\n <span className=\"truncate pr-1\">{tab.label}</span>\n {tab.status === \"running\" && (\n <span className=\"w-1.5 h-1.5 rounded-full bg-muted-foreground/50 shrink-0 animate-pulse\" />\n )}\n </button>\n <button\n type=\"button\"\n aria-label=\"Close tab\"\n onClick={(e) => {\n e.stopPropagation();\n e.preventDefault();\n closeTab(tab.id);\n }}\n className=\"agent-tab-close flex items-center justify-end text-muted-foreground hover:!text-foreground\"\n style={{\n position: \"absolute\",\n right: 0,\n top: 0,\n bottom: 0,\n width: 28,\n paddingRight: 6,\n borderRadius: \"0 6px 6px 0\",\n background:\n \"linear-gradient(to right, transparent, hsl(var(--accent)) 40%)\",\n }}\n >\n <IconX size={12} />\n </button>\n </div>\n );\n })}\n </div>\n <TooltipProvider delayDuration={200}>\n <div className=\"flex items-center gap-px shrink-0 ml-auto\">\n <Tooltip>\n <TooltipTrigger asChild>\n <button\n onClick={addTab}\n aria-label=\"New chat\"\n className=\"flex h-6 w-6 items-center justify-center rounded text-muted-foreground/60 hover:text-foreground hover:bg-accent/50\"\n >\n <IconPlus size={12} />\n </button>\n </TooltipTrigger>\n <TooltipContent>New chat</TooltipContent>\n </Tooltip>\n <Tooltip>\n <TooltipTrigger asChild>\n <button\n onClick={() => setShowHistory(!showHistory)}\n aria-label=\"All chats\"\n className={cn(\n \"flex h-6 w-6 items-center justify-center rounded text-muted-foreground/60 hover:text-foreground hover:bg-accent/50\",\n showHistory && \"bg-accent text-foreground\",\n )}\n >\n <IconHistory size={12} />\n </button>\n </TooltipTrigger>\n <TooltipContent>All chats</TooltipContent>\n </Tooltip>\n </div>\n </TooltipProvider>\n </div>\n {hasSubTabs && (\n <div className=\"flex items-center px-1 py-0.5 border-b border-border shrink-0 gap-0.5 bg-muted/30\">\n <div className=\"agent-tabs-scroll flex items-center gap-0.5 min-w-0 overflow-x-auto flex-1\">\n <button\n onClick={() => switchThread(focusParentId!)}\n className={cn(\n \"flex shrink-0 items-center gap-1 rounded-md px-2 py-1 text-[10px] font-medium cursor-pointer\",\n activeThreadId === focusParentId\n ? \"bg-accent text-foreground\"\n : \"text-muted-foreground hover:bg-accent hover:text-foreground\",\n )}\n >\n Main\n </button>\n {childTabs.map((tab) => (\n <div\n key={tab.id}\n ref={\n tab.id === activeThreadId\n ? activeTabRefCb\n : undefined\n }\n className={cn(\n \"agent-tab relative flex shrink-0 items-center rounded-md text-[10px] font-medium max-w-[130px]\",\n tab.id === activeThreadId\n ? \"bg-accent text-foreground\"\n : \"text-muted-foreground hover:bg-accent hover:text-foreground\",\n )}\n >\n <button\n type=\"button\"\n onClick={() => switchThread(tab.id)}\n className=\"flex items-center gap-1 px-2 py-1 min-w-0 flex-1 text-left\"\n >\n <span className=\"truncate pr-1\">\n {tab.subAgentName || tab.label}\n </span>\n {tab.status === \"running\" && (\n <span className=\"w-1 h-1 rounded-full bg-muted-foreground/50 shrink-0 animate-pulse\" />\n )}\n </button>\n <button\n type=\"button\"\n aria-label=\"Close tab\"\n onClick={(e) => {\n e.stopPropagation();\n e.preventDefault();\n closeTab(tab.id);\n }}\n className=\"agent-tab-close flex items-center justify-end text-muted-foreground hover:!text-foreground\"\n style={{\n position: \"absolute\",\n right: 0,\n top: 0,\n bottom: 0,\n width: 24,\n paddingRight: 4,\n borderRadius: \"0 6px 6px 0\",\n background:\n \"linear-gradient(to right, transparent, hsl(var(--accent)) 40%)\",\n }}\n >\n <IconX size={12} />\n </button>\n </div>\n ))}\n </div>\n </div>\n )}\n </>\n );\n })()\n : null}\n\n {/* Chat content with optional overlay */}\n <div className=\"relative flex-1 flex flex-col min-h-0\">\n {renderOverlay ? renderOverlay(headerProps) : null}\n\n {/* History popover — rendered inside relative container so positioning works */}\n {showHistory && (\n <HistoryPopover\n threads={threads}\n openTabIds={new Set(openTabIds)}\n activeThreadId={activeThreadId}\n onSelect={openFromHistory}\n onClose={() => setShowHistory(false)}\n onSearch={searchThreads}\n />\n )}\n\n {/* Help popover — shown by /help slash command */}\n {helpVisible && <HelpPopover onClose={() => setHelpVisible(false)} />}\n\n {/* Render tabs that have been activated at least once, hide inactive ones to preserve state.\n Sub-agent tabs are only mounted when first focused — prevents stale restore from running\n while the component is display:none before the user switches to it. */}\n {[...new Set(openTabIds)]\n .filter(\n (tabId) =>\n tabId === activeThreadId || mountedTabsRef.current.has(tabId),\n )\n .map((tabId) => {\n const modelSelection = resolveThreadModelSelection(tabId);\n return (\n <div\n key={tabId}\n className=\"flex-1 min-h-0 flex-col\"\n style={{\n display:\n contentHidden || tabId !== activeThreadId ? \"none\" : \"flex\",\n }}\n >\n <RunStuckBanner\n threadId={tabId}\n apiUrl={apiUrl}\n onRetry={() => {\n const handle = chatRefs.current.get(tabId);\n handle?.sendMessage(\n \"Continue from where you left off and finish my last request. Do not repeat completed work.\",\n );\n }}\n />\n <AssistantChat\n {...props}\n ref={(handle) => {\n if (handle) {\n chatRefs.current.set(tabId, handle);\n } else {\n chatRefs.current.delete(tabId);\n }\n }}\n threadId={tabId}\n tabId={tabId}\n apiUrl={apiUrl}\n isNewThread={\n newThreadIds.current.has(tabId) || isNewThread(tabId)\n }\n onMessageCountChange={(count) =>\n setMessageCounts((prev) =>\n prev[tabId] === count\n ? prev\n : { ...prev, [tabId]: count },\n )\n }\n onSaveThread={handleSaveThread}\n onGenerateTitle={handleGenerateTitle}\n onSlashCommand={handleSlashCommand}\n selectedModel={modelSelection?.model}\n selectedEngine={modelSelection?.engine}\n selectedEffort={modelSelection?.effort ?? \"auto\"}\n defaultModel={defaultModel}\n availableModels={availableModels}\n onModelChange={handleModelChange}\n onEffortChange={handleEffortChange}\n onForkChat={() => handleForkChat(tabId)}\n />\n </div>\n );\n })}\n </div>\n </div>\n );\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"PromptComposer.d.ts","sourceRoot":"","sources":["../../../src/client/composer/PromptComposer.tsx"],"names":[],"mappings":"AAAA,OAAO,
|
|
1
|
+
{"version":3,"file":"PromptComposer.d.ts","sourceRoot":"","sources":["../../../src/client/composer/PromptComposer.tsx"],"names":[],"mappings":"AAAA,OAAO,EAML,KAAK,GAAG,EACT,MAAM,OAAO,CAAC;AAsBf,OAAO,EAAkB,KAAK,oBAAoB,EAAE,MAAM,qBAAqB,CAAC;AAChF,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAE5C,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,kCAAkC,CAAC;AAUxE;;;;GAIG;AACH,MAAM,MAAM,kBAAkB,GAAG,IAAI,CAAC;AAEtC,MAAM,WAAW,2BAA2B;IAC1C,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,eAAe,CAAC;CAC1B;AAED,MAAM,WAAW,mBAAmB;IAClC,iDAAiD;IACjD,QAAQ,EAAE,CACR,IAAI,EAAE,MAAM,EACZ,KAAK,EAAE,kBAAkB,EAAE,EAC3B,UAAU,EAAE,SAAS,EAAE,EACvB,OAAO,EAAE,2BAA2B,KACjC,IAAI,CAAC;IACV,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,yDAAyD;IACzD,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,+DAA+D;IAC/D,qBAAqB,CAAC,EAAE,OAAO,CAAC;IAChC,+CAA+C;IAC/C,iBAAiB,CAAC,EAAE,OAAO,CAAC;IAC5B,uDAAuD;IACvD,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,sFAAsF;IACtF,kBAAkB,CAAC,EAAE,OAAO,CAAC;IAC7B,qDAAqD;IACrD,YAAY,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IACtC,mDAAmD;IACnD,WAAW,CAAC,EAAE,GAAG,CAAC,oBAAoB,CAAC,CAAC;CACzC;AA+VD;;;;;;;;;;GAUG;AACH,wBAAgB,cAAc,CAAC,KAAK,EAAE,mBAAmB,2CAqBxD"}
|