@adminide-stack/yantra-mobile 12.0.28-alpha.59 → 12.0.28-alpha.62
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/lib/components/CustomDrawer.js +147 -26
- package/lib/components/CustomDrawer.js.map +1 -1
- package/lib/components/GatewayToolbarButtonMobile.js +21 -21
- package/lib/components/GatewayToolbarButtonMobile.js.map +1 -1
- package/lib/screens/Home/HomeScreen.js +244 -66
- package/lib/screens/Home/HomeScreen.js.map +1 -1
- package/lib/screens/Home/components/ChatHistoryLanding.js +55 -19
- package/lib/screens/Home/components/ChatHistoryLanding.js.map +1 -1
- package/lib/screens/Home/components/DeepSearchModal.js +49 -34
- package/lib/screens/Home/components/DeepSearchModal.js.map +1 -1
- package/lib/screens/NewChat/index.js +8 -4
- package/lib/screens/NewChat/index.js.map +1 -1
- package/lib/theme/mobileTokens.js +18 -0
- package/lib/theme/mobileTokens.js.map +1 -0
- package/package.json +4 -4
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"HomeScreen.js","sources":["../../../src/screens/Home/HomeScreen.tsx"],"sourcesContent":["import React, { FC, useState, useCallback, useEffect, useMemo } from 'react';\nimport { Pressable, StyleSheet, View } from 'react-native';\nimport { MaterialCommunityIcons } from '@expo/vector-icons';\nimport { Box, InputToolBar, Text, getDefaultLeftItems, getDefaultRightItems } from '@admin-layout/gluestack-ui-mobile';\nimport { SafeAreaView, useSafeAreaInsets } from 'react-native-safe-area-context';\nimport { useNavigation, useRoute, StackActions, CommonActions } from '@react-navigation/native';\nimport { MessagesContainerUI } from '@messenger-box/platform-mobile';\nimport { v4 as uuidv4 } from 'uuid';\nimport { ContributionSchemaId } from 'common';\nimport { useGetContextDataQuery, useGetPageSettingsQuery } from 'common/graphql';\nimport { useGatewayContext } from '../../contexts/GatewayContext';\nimport { GatewayToolbarButtonMobile } from '../../components/GatewayToolbarButtonMobile';\nimport { useCdecliAutoConnect } from '../../hooks/useCdecliAutoConnect';\nimport { usePrerequisiteIds } from '../../hooks/usePrerequisiteIds';\nimport { useChatMutations, useChatSessions } from '../../hooks/useChatApi';\nimport { useChatStream, type UseChatStreamRouting } from '../../hooks/useChatStream';\nimport type { ModeSubmission, RoutingMode } from './types';\nimport DeepSearchModal from './components/DeepSearchModal';\nimport ChatHistoryLanding from './components/ChatHistoryLanding';\nimport { extractDeepSearchSources, normalizeSummaryText, type DeepSearchSourceItem } from './deepSearchUtils';\nimport { YantraBrandLoader, YANTRA_LOADER_SIZE_COMPACT } from '../../components/YantraBrandLoader';\nimport { navigationRef } from '@common-stack/client-react';\n\nexport type { RoutingMode, ModeSubmission };\n\nexport interface HomeScreenProps {\n initialMode?: RoutingMode;\n onSubmit?: (submission: ModeSubmission) => void;\n onStop?: () => void;\n isLoading?: boolean;\n disabled?: boolean;\n}\n\n/** Reserve the bottom composer band (toolbar + mode row) so the sending loader centers in the messages area above it. */\nconst SENDING_LOADER_COMPOSER_RESERVE_PX = 156;\n\nfunction organizationFromSettingsValue(settings: unknown): string | null {\n if (settings == null) return null;\n if (typeof settings === 'string') {\n try {\n const parsed = JSON.parse(settings) as { organization?: string };\n const o = parsed?.organization;\n return typeof o === 'string' && o.trim() ? o.trim() : null;\n } catch {\n return null;\n }\n }\n if (typeof settings === 'object' && settings !== null && 'organization' in settings) {\n const o = (settings as { organization?: unknown }).organization;\n return typeof o === 'string' && o.trim() ? o.trim() : null;\n }\n return null;\n}\n\nfunction projectFromSettingsValue(settings: unknown): string | null {\n if (settings == null) return null;\n if (typeof settings === 'string') {\n try {\n const parsed = JSON.parse(settings) as { project?: string };\n const p = parsed?.project;\n return typeof p === 'string' && p.trim() ? p.trim() : null;\n } catch {\n return null;\n }\n }\n if (typeof settings === 'object' && settings !== null && 'project' in settings) {\n const p = (settings as { project?: unknown }).project;\n return typeof p === 'string' && p.trim() ? p.trim() : null;\n }\n return null;\n}\n\nfunction HomeScreenContent({\n initialMode = 'chat',\n onSubmit: onSubmitProp,\n onStop,\n isLoading: isLoadingProp = false,\n disabled = false,\n}: HomeScreenProps) {\n const navigation = useNavigation();\n const route = useRoute<any>();\n const hasRehydratedOrgRef = React.useRef(false);\n const [value, setValue] = useState('');\n const [activeMode, setActiveMode] = useState<RoutingMode>(initialMode);\n const [activeSessionId, setActiveSessionId] = useState<string | null>(null);\n const [isDeepSearchModalOpen, setIsDeepSearchModalOpen] = useState(false);\n const [deepSearchQuery, setDeepSearchQuery] = useState<string | null>(null);\n const [deepSearchSummary, setDeepSearchSummary] = useState('');\n const [deepSearchSources, setDeepSearchSources] = useState<DeepSearchSourceItem[]>([]);\n const [researchProcessOpen, setResearchProcessOpen] = useState(true);\n const [sourcesAccordionOpen, setSourcesAccordionOpen] = useState(true);\n /** Full-screen chat history list opened from header (chat UI remains default). */\n const [showChatHistory, setShowChatHistory] = useState(false);\n /** True while creating channel id before send (covers UI delay before chatLoading flips). */\n const [channelBootstrap, setChannelBootstrap] = useState(false);\n\n const { createChannel } = useChatMutations();\n const { sessions } = useChatSessions();\n const { orgName: resolvedOrgName, projectId } = usePrerequisiteIds();\n const { data: contextData } = useGetContextDataQuery();\n const cdecodeUri = contextData?.getContextData?.cdecodeUri;\n const { data: pageSettingsData } = useGetPageSettingsQuery({\n variables: {\n resourceUri: cdecodeUri as never,\n options: {\n schemaId: ContributionSchemaId.Configuration,\n configKey: 'account.default',\n includeMarketplace: true,\n },\n },\n skip: !cdecodeUri,\n fetchPolicy: 'cache-first',\n });\n const fallbackOrgNameFromSettings = useMemo(\n () => organizationFromSettingsValue(pageSettingsData?.pageSettings?.settings),\n [pageSettingsData],\n );\n const fallbackProjectIdFromSettings = useMemo(\n () => projectFromSettingsValue(pageSettingsData?.pageSettings?.settings),\n [pageSettingsData],\n );\n const routeOrgName = ((route?.params?.orgName as string | undefined) ?? '').trim() || null;\n const effectiveOrgName = resolvedOrgName || fallbackOrgNameFromSettings || routeOrgName || null;\n /** Prefer hook (same source as web); fall back to this screen's page settings when prerequisites lag one frame. */\n const effectiveProjectId = projectId || fallbackProjectIdFromSettings || null;\n const { selectedGateway } = useGatewayContext();\n const cdecliSelected = selectedGateway?.channelType === 'cdecli-serve';\n const cdecli = useCdecliAutoConnect(cdecliSelected, activeSessionId ?? undefined);\n\n /** Same gate as web ChatSessionPage (`cdecliConnected`): only route via gateway when the channel is live. */\n const cdecliConnected = cdecliSelected && cdecli.channelConnected;\n\n const effectivePersistenceMode = cdecli.persistenceMode ?? selectedGateway?.persistenceMode ?? 'frontend';\n\n const chatRouting: UseChatStreamRouting = useMemo(\n () =>\n cdecliConnected\n ? {\n kind: 'cdecli',\n channelConnected: cdecli.channelConnected,\n accountId: cdecli.accountId,\n persistenceMode: effectivePersistenceMode,\n }\n : { kind: 'groq' },\n [cdecliConnected, cdecli.channelConnected, cdecli.accountId, effectivePersistenceMode],\n );\n\n const chat = useChatStream(activeSessionId, chatRouting);\n\n const {\n messages,\n response,\n error: chatError,\n isLoading: chatLoading,\n isStreaming,\n hasMessages,\n sendMessage,\n cancel,\n clearMessages,\n } = chat;\n\n const trimmedQuery = value.trim();\n const hasQuery = trimmedQuery.length > 0;\n const canSubmit = hasQuery && Boolean(routeOrgName || effectiveOrgName);\n const isLoading = isLoadingProp || chatLoading;\n const isResearchMode = activeMode === 'deep-search';\n const inputPlaceholder = !effectiveOrgName\n ? 'Initializing workspace...'\n : isResearchMode\n ? 'Research anything...'\n : 'Ask anything...';\n const waitingForAssistant = useMemo(() => {\n if ((!chatLoading && !isStreaming) || messages.length === 0) return false;\n return messages[messages.length - 1]?.role === 'user';\n }, [chatLoading, isStreaming, messages]);\n\n /** Thread has bubbles or streaming buffer → anchor loader above composer; empty landing → center. */\n const pinSendingLoaderNearComposer = useMemo(\n () => messages.length > 0 || Boolean((response ?? '').trim()),\n [messages.length, response],\n );\n\n const showSendingLoader = !showChatHistory && (channelBootstrap || waitingForAssistant);\n\n const insets = useSafeAreaInsets();\n\n // useEffect(() => {\n // navigation.setOptions({\n // headerLeft: () => null,\n // });\n // }, []);\n\n const handleModeSwitch = useCallback((mode: RoutingMode) => {\n setActiveMode(mode);\n }, []);\n\n // Web-aligned flow: create channel first, then send first post using returned channel id.\n const ensureSessionId = useCallback(\n async (mode: RoutingMode): Promise<string> => {\n if (activeSessionId) return activeSessionId;\n if (!effectiveOrgName || !effectiveProjectId) {\n throw new Error('Workspace is still initializing. Please retry in a moment.');\n }\n const requestedChannelId = uuidv4();\n const title =\n mode === 'deep-search' ? `deep-search-${requestedChannelId}` : `chat-channel-${requestedChannelId}`;\n const session = await createChannel({\n id: requestedChannelId,\n title,\n isShared: false,\n sharedSlug: null,\n isArchived: false,\n isPinned: false,\n model: null,\n systemPrompt: null,\n orgName: effectiveOrgName,\n projectId: effectiveProjectId,\n } as any);\n setActiveSessionId(session.id);\n return session.id;\n },\n [activeSessionId, createChannel, effectiveOrgName, effectiveProjectId],\n );\n\n const handleSubmit = useCallback(\n async (attachments?: ModeSubmission['attachments']) => {\n if (!canSubmit || isLoading || disabled) return;\n\n const submission: ModeSubmission = {\n mode: activeMode,\n query: trimmedQuery,\n attachments,\n };\n\n if (activeMode === 'deep-search') {\n if (onSubmitProp) {\n onSubmitProp(submission);\n }\n setValue('');\n setDeepSearchQuery(trimmedQuery);\n setDeepSearchSummary('');\n setDeepSearchSources([]);\n setIsDeepSearchModalOpen(true);\n try {\n setChannelBootstrap(true);\n const sessionId = await ensureSessionId('deep-search');\n await sendMessage(trimmedQuery, undefined, sessionId);\n } catch (err) {\n console.error('[HomeScreen] Failed to create deep-search session:', err);\n } finally {\n setChannelBootstrap(false);\n }\n return;\n }\n\n if (onSubmitProp && activeMode === 'chat') {\n onSubmitProp(submission);\n setValue('');\n return;\n }\n\n try {\n setChannelBootstrap(true);\n const sessionId = await ensureSessionId('chat');\n setValue('');\n await sendMessage(trimmedQuery, undefined, sessionId);\n } catch (err) {\n console.error('[HomeScreen] Failed to create session:', err);\n } finally {\n setChannelBootstrap(false);\n }\n },\n [\n canSubmit,\n isLoading,\n disabled,\n activeMode,\n trimmedQuery,\n activeSessionId,\n onSubmitProp,\n ensureSessionId,\n sendMessage,\n ],\n );\n\n const handleNewChat = useCallback(() => {\n setShowChatHistory(false);\n setActiveSessionId(null);\n setValue('');\n clearMessages();\n }, [clearMessages]);\n\n const handleOpenChatHistory = useCallback(() => {\n setShowChatHistory(true);\n }, []);\n\n const handleCloseChatHistory = useCallback(() => {\n setShowChatHistory(false);\n }, []);\n\n const handleToggleGateway = useCallback(() => {\n // CDeCLI connection is selection-driven via useCdecliAutoConnect.\n }, []);\n\n const gatewayToolbarStatus =\n cdecli.status === 'connecting'\n ? 'connecting'\n : cdecli.status === 'connected'\n ? 'connected'\n : cdecli.status === 'error'\n ? 'error'\n : 'disconnected';\n\n const gatewayToolbarTone = 'default';\n\n const gatewayToolbarLabel = cdecli.status === 'connecting' ? 'Checking...' : undefined;\n\n const gatewayToolbarError = cdecli.error;\n\n useEffect(() => {\n const currentOrgName = (route?.params?.orgName as string | undefined)?.trim() || '';\n if (!effectiveOrgName || currentOrgName === effectiveOrgName) return;\n // Keep current screen params in sync with resolved org context.\n (navigation as any).setParams?.({ orgName: effectiveOrgName });\n }, [navigation, route?.params?.orgName, effectiveOrgName]);\n\n useEffect(() => {\n const currentOrgName = (route?.params?.orgName as string | undefined)?.trim() || '';\n if (hasRehydratedOrgRef.current || currentOrgName || !effectiveOrgName) return;\n\n hasRehydratedOrgRef.current = true;\n console.log('effectiveOrgName..', effectiveOrgName);\n // navigationRef.navigate('MainStack.Layout.Home', {\n // orgName: effectiveOrgName,\n // });\n // Also navigate with merge=true to patch parent stack params in nested navigation state.\n navigation.getParent()?.dispatch(\n CommonActions.navigate('MainStack', {\n screen: 'MainStack.Layout.Home',\n params: {\n orgName: effectiveOrgName,\n },\n merge: true,\n key: Date.now().toString(),\n }),\n );\n\n // CommonActions.reset({\n // index: 0,\n // routes: [\n // {\n // name: 'MainStack',\n // state: {\n // routes: [\n // {\n // name: 'MainStack.Layout.Home',\n // params: { orgName: effectiveOrgName },\n // },\n // ],\n // },\n // },\n // ],\n // });\n\n // (navigation as any).navigate('MainStack', {\n // screen: 'MainStack.Layout.Home',\n // params: { orgName: effectiveOrgName },\n // merge: true,\n // key: Date.now().toString(),\n // });\n }, [navigation, route?.params?.orgName, effectiveOrgName, navigationRef]);\n\n useEffect(() => {\n navigation.setOptions({\n drawerLabel: 'Chat',\n headerTitle: showChatHistory ? 'Chats' : 'Yantra',\n headerLeft: showChatHistory\n ? () => (\n <Pressable\n onPress={handleCloseChatHistory}\n style={({ pressed }) => [styles.backButton, pressed && styles.newChatButtonPressed]}\n accessibilityLabel=\"Back to chat\"\n >\n <MaterialCommunityIcons name=\"chevron-left\" size={24} color=\"#111827\" />\n </Pressable>\n )\n : undefined,\n headerRight: () => (\n <View style={styles.headerRight}>\n <GatewayToolbarButtonMobile\n gatewayStatus={gatewayToolbarStatus}\n gatewayError={gatewayToolbarError}\n onToggleGateway={handleToggleGateway}\n disabled={false}\n statusLabel={gatewayToolbarLabel}\n tone={gatewayToolbarTone}\n />\n {!showChatHistory ? (\n <Pressable\n onPress={handleOpenChatHistory}\n style={({ pressed }) => [\n styles.historyHeaderButton,\n pressed && styles.historyHeaderButtonPressed,\n ]}\n accessibilityLabel=\"Chat history\"\n accessibilityRole=\"button\"\n >\n <View style={styles.historyHeaderButtonInner}>\n <MaterialCommunityIcons name=\"history\" size={19} color=\"#4338ca\" />\n </View>\n </Pressable>\n ) : null}\n <Pressable\n onPress={handleNewChat}\n style={({ pressed }) => [styles.newChatButton, pressed && styles.newChatButtonPressed]}\n accessibilityLabel=\"New chat\"\n >\n <MaterialCommunityIcons name=\"chat-plus-outline\" size={26} color=\"#000\" />\n </Pressable>\n </View>\n ),\n });\n }, [\n navigation,\n showChatHistory,\n handleCloseChatHistory,\n handleOpenChatHistory,\n handleNewChat,\n handleToggleGateway,\n gatewayToolbarStatus,\n gatewayToolbarError,\n gatewayToolbarLabel,\n gatewayToolbarTone,\n ]);\n\n const handleSendMessage = useCallback(\n async (text: string) => {\n if (!text.trim() || isLoading || disabled) return;\n const submission: ModeSubmission = { mode: activeMode, query: text.trim() };\n if (activeMode === 'deep-search') {\n if (onSubmitProp) {\n onSubmitProp(submission);\n }\n setDeepSearchQuery(text.trim());\n setDeepSearchSummary('');\n setDeepSearchSources([]);\n setIsDeepSearchModalOpen(true);\n try {\n setChannelBootstrap(true);\n const sessionId = await ensureSessionId('deep-search');\n await sendMessage(text.trim(), undefined, sessionId);\n } catch (err) {\n console.error('[HomeScreen] Failed to create deep-search session:', err);\n } finally {\n setChannelBootstrap(false);\n }\n return;\n }\n try {\n setChannelBootstrap(true);\n const sessionId = await ensureSessionId('chat');\n await sendMessage(text.trim(), undefined, sessionId);\n } catch (err) {\n console.error('[HomeScreen] Failed to create session:', err);\n } finally {\n setChannelBootstrap(false);\n }\n },\n [isLoading, disabled, activeMode, onSubmitProp, ensureSessionId, sendMessage],\n );\n\n const leftItems = getDefaultLeftItems({\n search: {\n active: activeMode === 'chat',\n onClick: () => handleModeSwitch('chat'),\n },\n zap: {\n active: activeMode === 'deep-search',\n onClick: () => handleModeSwitch('deep-search'),\n },\n lightbulb: { enabled: false },\n });\n\n const rightItems = getDefaultRightItems({\n tag: { enabled: false },\n chip: { enabled: false },\n camera: { enabled: false, onClick: () => console.log('camera') },\n image: { enabled: false, onClick: () => console.log('image') },\n attach: { enabled: false, onClick: () => console.log('attach') },\n });\n const latestAssistantMessage = useMemo(() => {\n for (let i = messages.length - 1; i >= 0; i -= 1) {\n if (messages[i]?.role === 'assistant') return messages[i]?.content ?? '';\n }\n return '';\n }, [messages]);\n\n const deepSearchPreviewContent = response || deepSearchSummary;\n const deepSearchPreviewNormalized = useMemo(\n () => normalizeSummaryText(deepSearchPreviewContent || deepSearchSummary || ''),\n [deepSearchPreviewContent, deepSearchSummary],\n );\n\n const handleDeepSearchClose = useCallback(() => {\n if (isStreaming) {\n cancel();\n }\n setIsDeepSearchModalOpen(false);\n setDeepSearchQuery(null);\n setDeepSearchSummary('');\n setDeepSearchSources([]);\n setResearchProcessOpen(true);\n setSourcesAccordionOpen(true);\n }, [isStreaming, cancel]);\n\n const handleRetryDeepSearch = useCallback(async () => {\n if (!deepSearchQuery || isStreaming) return;\n try {\n setChannelBootstrap(true);\n const sessionId = await ensureSessionId('deep-search');\n await sendMessage(deepSearchQuery, undefined, sessionId);\n } catch (error) {\n console.error('[HomeScreen] Failed to retry deep-search:', error);\n } finally {\n setChannelBootstrap(false);\n }\n }, [deepSearchQuery, isStreaming, ensureSessionId, sendMessage]);\n\n useEffect(() => {\n if (!deepSearchQuery || isStreaming || !latestAssistantMessage) return;\n setDeepSearchSummary(normalizeSummaryText(latestAssistantMessage));\n setDeepSearchSources(extractDeepSearchSources(latestAssistantMessage));\n }, [deepSearchQuery, isStreaming, latestAssistantMessage]);\n\n return (\n <SafeAreaView edges={['left', 'right', 'bottom']} style={{ flex: 1, backgroundColor: '#fff' }}>\n <Box flex={1} width=\"100%\" position=\"relative\">\n {(chatError || cdecli.error) && (\n <Box mb=\"$2\" mx=\"$4\" p=\"$3\" bg=\"$gray200\" borderRadius=\"$md\">\n <Text fontSize=\"$sm\" color=\"$gray900\">\n {chatError || cdecli.error}\n </Text>\n </Box>\n )}\n {showChatHistory ? (\n <ChatHistoryLanding\n onSelectSession={(channelId) => {\n setShowChatHistory(false);\n setActiveSessionId(channelId);\n setActiveMode('chat');\n }}\n onCompose={() => {\n setShowChatHistory(false);\n setActiveSessionId(null);\n setValue('');\n clearMessages();\n }}\n />\n ) : hasMessages || response ? (\n <Box flex={1} width=\"100%\" alignSelf=\"stretch\">\n <MessagesContainerUI\n mode=\"chat\"\n showBackButton={false}\n onBackPress={handleNewChat}\n compactTop={false}\n messagesContainerStyle={{ paddingHorizontal: 0, paddingTop: 6, margin: 0 }}\n listContentStyle={{ paddingTop: 8, margin: 0 }}\n messages={messages.map((msg, index) => ({\n id: `msg-${index}-${msg.role}`,\n role: msg.role,\n content: msg.content,\n metadata: msg.metadata,\n }))}\n streamingContent={response}\n currentUser={{ id: 'user' }}\n onSend={handleSendMessage}\n disabled={isLoading || disabled}\n isLoading={isLoading}\n onStop={isStreaming ? cancel : onStop}\n renderPlanInputToolbar={({ value, onChange, onSend, disabled: inputDisabled }) => (\n <InputToolBar\n inputConfig={{\n value,\n onChange: (e) => onChange(e.nativeEvent.text),\n placeholder: inputPlaceholder,\n disabled: inputDisabled,\n }}\n leftItems={leftItems}\n rightItems={rightItems}\n templateButton={null}\n templateModalConfig={null}\n micSendButton={{\n hasContent: value.trim().length > 0,\n onSend: () => onSend(value.trim()),\n onMic: () => console.log('mic'),\n disabled: inputDisabled,\n isLoading,\n onStop: isStreaming ? cancel : onStop,\n }}\n />\n )}\n renderBuildInputToolbar={() => null}\n />\n </Box>\n ) : (\n <Box flex={1} width=\"100%\">\n <View style={styles.emptyCenterTitleWrap}>\n <Text style={styles.emptyCenterTitle}>What can I do for you?</Text>\n </View>\n <View\n style={[\n styles.bottomComposerWrap,\n {\n paddingBottom: Math.max(insets.bottom - 6, 2),\n marginBottom: -Math.max(insets.bottom - 2, 0),\n },\n ]}\n >\n <InputToolBar\n inputConfig={{\n value,\n onChange: (e) => setValue(e.nativeEvent.text),\n placeholder: inputPlaceholder,\n disabled: isLoading || disabled,\n }}\n leftItems={leftItems}\n rightItems={rightItems}\n templateButton={null}\n templateModalConfig={null}\n micSendButton={{\n hasContent: canSubmit,\n onSend: () => handleSubmit(),\n onMic: () => console.log('mic'),\n disabled: isLoading || disabled,\n isLoading,\n onStop,\n }}\n />\n </View>\n </Box>\n )}\n {showSendingLoader ? (\n <View\n pointerEvents=\"none\"\n style={\n pinSendingLoaderNearComposer\n ? [\n styles.sendingLoaderAboveComposer,\n {\n bottom: Math.max(insets.bottom, 12) + SENDING_LOADER_COMPOSER_RESERVE_PX,\n },\n ]\n : styles.sendingLoaderEmptyState\n }\n >\n <YantraBrandLoader size={YANTRA_LOADER_SIZE_COMPACT} />\n </View>\n ) : null}\n </Box>\n <DeepSearchModal\n visible={isDeepSearchModalOpen}\n query={deepSearchQuery}\n summaryText={deepSearchPreviewNormalized}\n sources={deepSearchSources}\n isStreaming={isStreaming}\n researchProcessOpen={researchProcessOpen}\n sourcesAccordionOpen={sourcesAccordionOpen}\n onToggleResearchProcess={() => setResearchProcessOpen((prev) => !prev)}\n onToggleSourcesAccordion={() => setSourcesAccordionOpen((prev) => !prev)}\n onRetry={() => {\n void handleRetryDeepSearch();\n }}\n onStop={cancel}\n onClose={handleDeepSearchClose}\n />\n </SafeAreaView>\n );\n}\n\nconst styles = StyleSheet.create({\n /** First message / empty screen: loader in the middle of the pane. */\n sendingLoaderEmptyState: {\n position: 'absolute',\n left: 0,\n right: 0,\n top: 0,\n bottom: 0,\n justifyContent: 'center',\n alignItems: 'center',\n zIndex: 40,\n },\n /** Active thread: loader just above the input, not over message history. */\n sendingLoaderAboveComposer: {\n position: 'absolute',\n left: 0,\n right: 0,\n alignItems: 'center',\n justifyContent: 'flex-end',\n paddingBottom: 8,\n zIndex: 40,\n },\n headerRight: {\n flexDirection: 'row',\n alignItems: 'center',\n marginRight: 4,\n gap: 2,\n },\n historyHeaderButton: {\n marginHorizontal: 2,\n padding: 4,\n borderRadius: 22,\n },\n historyHeaderButtonPressed: {\n opacity: 0.72,\n },\n historyHeaderButtonInner: {\n width: 36,\n height: 36,\n borderRadius: 18,\n alignItems: 'center',\n justifyContent: 'center',\n backgroundColor: '#eef2ff',\n borderWidth: StyleSheet.hairlineWidth,\n borderColor: 'rgba(67, 56, 202, 0.22)',\n shadowColor: '#4338ca',\n shadowOpacity: 0.12,\n shadowRadius: 6,\n shadowOffset: { width: 0, height: 2 },\n elevation: 2,\n },\n newChatButton: {\n padding: 6,\n alignItems: 'center',\n justifyContent: 'center',\n },\n backButton: {\n marginLeft: 6,\n width: 36,\n height: 36,\n borderRadius: 18,\n alignItems: 'center',\n justifyContent: 'center',\n backgroundColor: '#f3f4f6',\n },\n newChatButtonPressed: {\n opacity: 0.6,\n },\n emptyCenterTitleWrap: {\n flex: 1,\n alignItems: 'center',\n justifyContent: 'center',\n paddingHorizontal: 24,\n paddingTop: 44,\n },\n emptyCenterTitle: {\n fontSize: 52 / 2,\n fontWeight: '400',\n color: '#111827',\n textAlign: 'center',\n letterSpacing: 0.2,\n },\n bottomComposerWrap: {\n paddingHorizontal: 14,\n },\n});\n\nconst HomeScreen: FC<HomeScreenProps> = (props) => <HomeScreenContent {...props} />;\n\nexport default HomeScreen;\n"],"names":["_a","uuidv4","_b","_c","value"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"HomeScreen.js","sources":["../../../src/screens/Home/HomeScreen.tsx"],"sourcesContent":["import React, { FC, useState, useCallback, useEffect, useMemo } from 'react';\nimport {\n Keyboard,\n Platform,\n Pressable,\n StyleSheet,\n TouchableWithoutFeedback,\n View,\n useColorScheme,\n useWindowDimensions,\n} from 'react-native';\nimport { MaterialCommunityIcons } from '@expo/vector-icons';\nimport { Box, InputToolBar, Text, getDefaultLeftItems, getDefaultRightItems } from '@admin-layout/gluestack-ui-mobile';\nimport { SafeAreaView, useSafeAreaInsets } from 'react-native-safe-area-context';\nimport { useNavigation, useRoute, StackActions, CommonActions } from '@react-navigation/native';\nimport { MessagesContainerUI } from '@messenger-box/platform-mobile';\nimport { v4 as uuidv4 } from 'uuid';\nimport { ContributionSchemaId } from 'common';\nimport { useGetContextDataQuery, useGetPageSettingsQuery } from 'common/graphql';\nimport { useGatewayContext } from '../../contexts/GatewayContext';\nimport { GatewayToolbarButtonMobile } from '../../components/GatewayToolbarButtonMobile';\nimport { useCdecliAutoConnect } from '../../hooks/useCdecliAutoConnect';\nimport { usePrerequisiteIds } from '../../hooks/usePrerequisiteIds';\nimport { useChatMutations, useChatSessions } from '../../hooks/useChatApi';\nimport { useChatStream, type UseChatStreamRouting } from '../../hooks/useChatStream';\nimport type { ModeSubmission, RoutingMode } from './types';\nimport DeepSearchModal from './components/DeepSearchModal';\nimport ChatHistoryLanding from './components/ChatHistoryLanding';\nimport { extractDeepSearchSources, normalizeSummaryText, type DeepSearchSourceItem } from './deepSearchUtils';\nimport { YantraBrandLoader, YANTRA_LOADER_SIZE_COMPACT } from '../../components/YantraBrandLoader';\nimport { navigationRef } from '@common-stack/client-react';\nimport { mobileTokens } from '../../theme/mobileTokens';\n\nexport type { RoutingMode, ModeSubmission };\n\nexport interface HomeScreenProps {\n initialMode?: RoutingMode;\n onSubmit?: (submission: ModeSubmission) => void;\n onStop?: () => void;\n isLoading?: boolean;\n disabled?: boolean;\n}\n\n/** Reserve the bottom composer band (toolbar + mode row) so the sending loader centers in the messages area above it. */\nconst SENDING_LOADER_COMPOSER_RESERVE_PX = 156;\nconst IOS_KEYBOARD_DOCKING_ADJUST_PX = 10;\nconst COMPOSER_SCROLL_RESERVE_PX = 136;\n\nfunction organizationFromSettingsValue(settings: unknown): string | null {\n if (settings == null) return null;\n if (typeof settings === 'string') {\n try {\n const parsed = JSON.parse(settings) as { organization?: string };\n const o = parsed?.organization;\n return typeof o === 'string' && o.trim() ? o.trim() : null;\n } catch {\n return null;\n }\n }\n if (typeof settings === 'object' && settings !== null && 'organization' in settings) {\n const o = (settings as { organization?: unknown }).organization;\n return typeof o === 'string' && o.trim() ? o.trim() : null;\n }\n return null;\n}\n\nfunction projectFromSettingsValue(settings: unknown): string | null {\n if (settings == null) return null;\n if (typeof settings === 'string') {\n try {\n const parsed = JSON.parse(settings) as { project?: string };\n const p = parsed?.project;\n return typeof p === 'string' && p.trim() ? p.trim() : null;\n } catch {\n return null;\n }\n }\n if (typeof settings === 'object' && settings !== null && 'project' in settings) {\n const p = (settings as { project?: unknown }).project;\n return typeof p === 'string' && p.trim() ? p.trim() : null;\n }\n return null;\n}\n\nfunction HomeScreenContent({\n initialMode = 'chat',\n onSubmit: onSubmitProp,\n onStop,\n isLoading: isLoadingProp = false,\n disabled = false,\n}: HomeScreenProps) {\n const { width: screenWidth } = useWindowDimensions();\n const colorScheme = useColorScheme();\n const isDark = colorScheme === 'dark';\n const navigation = useNavigation();\n const route = useRoute<any>();\n const hasRehydratedOrgRef = React.useRef(false);\n const [value, setValue] = useState('');\n const [activeMode, setActiveMode] = useState<RoutingMode>(initialMode);\n const [activeSessionId, setActiveSessionId] = useState<string | null>(null);\n const [isDeepSearchModalOpen, setIsDeepSearchModalOpen] = useState(false);\n const [deepSearchQuery, setDeepSearchQuery] = useState<string | null>(null);\n const [deepSearchSummary, setDeepSearchSummary] = useState('');\n const [deepSearchSources, setDeepSearchSources] = useState<DeepSearchSourceItem[]>([]);\n const [researchProcessOpen, setResearchProcessOpen] = useState(true);\n const [sourcesAccordionOpen, setSourcesAccordionOpen] = useState(true);\n /** Full-screen chat history list opened from header (chat UI remains default). */\n const [showChatHistory, setShowChatHistory] = useState(false);\n /** True while creating channel id before send (covers UI delay before chatLoading flips). */\n const [channelBootstrap, setChannelBootstrap] = useState(false);\n\n const { createChannel } = useChatMutations();\n const { sessions } = useChatSessions();\n const { orgName: resolvedOrgName, projectId } = usePrerequisiteIds();\n const { data: contextData } = useGetContextDataQuery();\n const cdecodeUri = contextData?.getContextData?.cdecodeUri;\n const { data: pageSettingsData } = useGetPageSettingsQuery({\n variables: {\n resourceUri: cdecodeUri as never,\n options: {\n schemaId: ContributionSchemaId.Configuration,\n configKey: 'account.default',\n includeMarketplace: true,\n },\n },\n skip: !cdecodeUri,\n fetchPolicy: 'cache-first',\n });\n const fallbackOrgNameFromSettings = useMemo(\n () => organizationFromSettingsValue(pageSettingsData?.pageSettings?.settings),\n [pageSettingsData],\n );\n const fallbackProjectIdFromSettings = useMemo(\n () => projectFromSettingsValue(pageSettingsData?.pageSettings?.settings),\n [pageSettingsData],\n );\n const routeOrgName = ((route?.params?.orgName as string | undefined) ?? '').trim() || null;\n const effectiveOrgName = resolvedOrgName || fallbackOrgNameFromSettings || routeOrgName || null;\n /** Prefer hook (same source as web); fall back to this screen's page settings when prerequisites lag one frame. */\n const effectiveProjectId = projectId || fallbackProjectIdFromSettings || null;\n const { selectedGateway } = useGatewayContext();\n const cdecliSelected = selectedGateway?.channelType === 'cdecli-serve';\n const cdecli = useCdecliAutoConnect(cdecliSelected, activeSessionId ?? undefined);\n\n /** Same gate as web ChatSessionPage (`cdecliConnected`): only route via gateway when the channel is live. */\n const cdecliConnected = cdecliSelected && cdecli.channelConnected;\n\n const effectivePersistenceMode = cdecli.persistenceMode ?? selectedGateway?.persistenceMode ?? 'frontend';\n\n const chatRouting: UseChatStreamRouting = useMemo(\n () =>\n cdecliConnected\n ? {\n kind: 'cdecli',\n channelConnected: cdecli.channelConnected,\n accountId: cdecli.accountId,\n persistenceMode: effectivePersistenceMode,\n }\n : { kind: 'groq' },\n [cdecliConnected, cdecli.channelConnected, cdecli.accountId, effectivePersistenceMode],\n );\n\n const chat = useChatStream(activeSessionId, chatRouting);\n\n const {\n messages,\n response,\n error: chatError,\n isLoading: chatLoading,\n isStreaming,\n hasMessages,\n sendMessage,\n cancel,\n clearMessages,\n } = chat;\n\n const trimmedQuery = value.trim();\n const hasQuery = trimmedQuery.length > 0;\n const canSubmit = hasQuery && Boolean(routeOrgName || effectiveOrgName);\n const isLoading = isLoadingProp || chatLoading;\n const isResearchMode = activeMode === 'deep-search';\n const inputPlaceholder = !effectiveOrgName\n ? 'Initializing workspace...'\n : isResearchMode\n ? 'Research anything...'\n : 'Ask anything...';\n const waitingForAssistant = useMemo(() => {\n if ((!chatLoading && !isStreaming) || messages.length === 0) return false;\n return messages[messages.length - 1]?.role === 'user';\n }, [chatLoading, isStreaming, messages]);\n\n /** Thread has bubbles or streaming buffer → anchor loader above composer; empty landing → center. */\n const pinSendingLoaderNearComposer = useMemo(\n () => messages.length > 0 || Boolean((response ?? '').trim()),\n [messages.length, response],\n );\n\n const showSendingLoader = !showChatHistory && (channelBootstrap || waitingForAssistant);\n\n const insets = useSafeAreaInsets();\n const [keyboardHeight, setKeyboardHeight] = useState(0);\n\n // useEffect(() => {\n // navigation.setOptions({\n // headerLeft: () => null,\n // });\n // }, []);\n\n const handleModeSwitch = useCallback((mode: RoutingMode) => {\n setActiveMode(mode);\n }, []);\n\n // Web-aligned flow: create channel first, then send first post using returned channel id.\n const ensureSessionId = useCallback(\n async (mode: RoutingMode): Promise<string> => {\n if (activeSessionId) return activeSessionId;\n if (!effectiveOrgName || !effectiveProjectId) {\n throw new Error('Workspace is still initializing. Please retry in a moment.');\n }\n const requestedChannelId = uuidv4();\n const title =\n mode === 'deep-search' ? `deep-search-${requestedChannelId}` : `chat-channel-${requestedChannelId}`;\n const session = await createChannel({\n id: requestedChannelId,\n title,\n isShared: false,\n sharedSlug: null,\n isArchived: false,\n isPinned: false,\n model: null,\n systemPrompt: null,\n orgName: effectiveOrgName,\n projectId: effectiveProjectId,\n } as any);\n setActiveSessionId(session.id);\n return session.id;\n },\n [activeSessionId, createChannel, effectiveOrgName, effectiveProjectId],\n );\n\n const handleSubmit = useCallback(\n async (attachments?: ModeSubmission['attachments']) => {\n if (!canSubmit || isLoading || disabled) return;\n\n const submission: ModeSubmission = {\n mode: activeMode,\n query: trimmedQuery,\n attachments,\n };\n\n if (activeMode === 'deep-search') {\n if (onSubmitProp) {\n onSubmitProp(submission);\n }\n setValue('');\n setDeepSearchQuery(trimmedQuery);\n setDeepSearchSummary('');\n setDeepSearchSources([]);\n setIsDeepSearchModalOpen(true);\n try {\n setChannelBootstrap(true);\n const sessionId = await ensureSessionId('deep-search');\n await sendMessage(trimmedQuery, undefined, sessionId);\n } catch (err) {\n console.error('[HomeScreen] Failed to create deep-search session:', err);\n } finally {\n setChannelBootstrap(false);\n }\n return;\n }\n\n if (onSubmitProp && activeMode === 'chat') {\n onSubmitProp(submission);\n setValue('');\n return;\n }\n\n try {\n setChannelBootstrap(true);\n const sessionId = await ensureSessionId('chat');\n setValue('');\n await sendMessage(trimmedQuery, undefined, sessionId);\n } catch (err) {\n console.error('[HomeScreen] Failed to create session:', err);\n } finally {\n setChannelBootstrap(false);\n }\n },\n [\n canSubmit,\n isLoading,\n disabled,\n activeMode,\n trimmedQuery,\n activeSessionId,\n onSubmitProp,\n ensureSessionId,\n sendMessage,\n ],\n );\n\n const handleNewChat = useCallback(() => {\n setShowChatHistory(false);\n setActiveSessionId(null);\n setValue('');\n clearMessages();\n }, [clearMessages]);\n\n const handleOpenChatHistory = useCallback(() => {\n setShowChatHistory(true);\n }, []);\n\n const handleCloseChatHistory = useCallback(() => {\n setShowChatHistory(false);\n }, []);\n\n const handleToggleGateway = useCallback(() => {\n // CDeCLI connection is selection-driven via useCdecliAutoConnect.\n }, []);\n\n const gatewayToolbarStatus =\n cdecli.status === 'connecting'\n ? 'connecting'\n : cdecli.status === 'connected'\n ? 'connected'\n : cdecli.status === 'error'\n ? 'error'\n : 'disconnected';\n\n const gatewayToolbarTone = 'default';\n\n const gatewayToolbarLabel = cdecli.status === 'connecting' ? 'Checking...' : undefined;\n\n const gatewayToolbarError = cdecli.error;\n const surfaceColor = isDark ? '#0f172a' : mobileTokens.color.bg;\n const primaryTextColor = isDark ? '#e5e7eb' : mobileTokens.color.text;\n const secondaryTextColor = isDark ? '#94a3b8' : mobileTokens.color.textMuted;\n const accentColor = isDark ? '#a5b4fc' : '#4338ca';\n const newChatIconColor = isDark ? '#e5e7eb' : '#000000';\n const composerBarBackground = isDark ? 'rgba(15, 23, 42, 0.94)' : 'rgba(248, 250, 252, 0.97)';\n const composerBarBorder = isDark ? 'rgba(71, 85, 105, 0.5)' : 'rgba(148, 163, 184, 0.25)';\n const contentMaxWidth = Math.min(720, Math.max(360, screenWidth - 24));\n\n useEffect(() => {\n const currentOrgName = (route?.params?.orgName as string | undefined)?.trim() || '';\n if (!effectiveOrgName || currentOrgName === effectiveOrgName) return;\n // Keep current screen params in sync with resolved org context.\n (navigation as any).setParams?.({ orgName: effectiveOrgName });\n }, [navigation, route?.params?.orgName, effectiveOrgName]);\n\n useEffect(() => {\n const currentOrgName = (route?.params?.orgName as string | undefined)?.trim() || '';\n if (hasRehydratedOrgRef.current || currentOrgName || !effectiveOrgName) return;\n\n hasRehydratedOrgRef.current = true;\n console.log('effectiveOrgName..', effectiveOrgName);\n // navigationRef.navigate('MainStack.Layout.Home', {\n // orgName: effectiveOrgName,\n // });\n // Also navigate with merge=true to patch parent stack params in nested navigation state.\n navigation.getParent()?.dispatch(\n CommonActions.navigate('MainStack', {\n screen: 'MainStack.Layout.Home',\n params: {\n orgName: effectiveOrgName,\n },\n merge: true,\n key: Date.now().toString(),\n }),\n );\n\n // CommonActions.reset({\n // index: 0,\n // routes: [\n // {\n // name: 'MainStack',\n // state: {\n // routes: [\n // {\n // name: 'MainStack.Layout.Home',\n // params: { orgName: effectiveOrgName },\n // },\n // ],\n // },\n // },\n // ],\n // });\n\n // (navigation as any).navigate('MainStack', {\n // screen: 'MainStack.Layout.Home',\n // params: { orgName: effectiveOrgName },\n // merge: true,\n // key: Date.now().toString(),\n // });\n }, [navigation, route?.params?.orgName, effectiveOrgName, navigationRef]);\n\n useEffect(() => {\n navigation.setOptions({\n drawerLabel: 'Chat',\n headerTitle: showChatHistory ? 'Chats' : 'Yantra',\n headerLeft: showChatHistory\n ? () => (\n <Pressable\n onPress={handleCloseChatHistory}\n style={({ pressed }) => [styles.backButton, pressed && styles.newChatButtonPressed]}\n accessibilityLabel=\"Back to chat\"\n >\n <MaterialCommunityIcons name=\"chevron-left\" size={24} color={primaryTextColor} />\n </Pressable>\n )\n : undefined,\n headerRight: () => (\n <View style={styles.headerRight}>\n <GatewayToolbarButtonMobile\n gatewayStatus={gatewayToolbarStatus}\n gatewayError={gatewayToolbarError}\n onToggleGateway={handleToggleGateway}\n disabled={false}\n statusLabel={gatewayToolbarLabel}\n tone={gatewayToolbarTone}\n />\n {!showChatHistory ? (\n <Pressable\n onPress={handleOpenChatHistory}\n style={({ pressed }) => [\n styles.historyHeaderButton,\n pressed && styles.historyHeaderButtonPressed,\n ]}\n accessibilityLabel=\"Chat history\"\n accessibilityRole=\"button\"\n >\n <View\n style={[\n styles.historyHeaderButtonInner,\n isDark ? styles.historyHeaderButtonInnerDark : null,\n ]}\n >\n <MaterialCommunityIcons name=\"history\" size={19} color={accentColor} />\n </View>\n </Pressable>\n ) : null}\n <Pressable\n onPress={handleNewChat}\n style={({ pressed }) => [styles.newChatButton, pressed && styles.newChatButtonPressed]}\n accessibilityLabel=\"New chat\"\n >\n <View style={[styles.newChatButtonInner, isDark ? styles.newChatButtonInnerDark : null]}>\n <MaterialCommunityIcons name=\"chat-plus-outline\" size={20} color={newChatIconColor} />\n </View>\n </Pressable>\n </View>\n ),\n });\n }, [\n navigation,\n showChatHistory,\n handleCloseChatHistory,\n handleOpenChatHistory,\n handleNewChat,\n handleToggleGateway,\n gatewayToolbarStatus,\n gatewayToolbarError,\n gatewayToolbarLabel,\n gatewayToolbarTone,\n primaryTextColor,\n accentColor,\n newChatIconColor,\n isDark,\n ]);\n\n const handleSendMessage = useCallback(\n async (text: string) => {\n if (!text.trim() || isLoading || disabled) return;\n const submission: ModeSubmission = { mode: activeMode, query: text.trim() };\n if (activeMode === 'deep-search') {\n if (onSubmitProp) {\n onSubmitProp(submission);\n }\n setDeepSearchQuery(text.trim());\n setDeepSearchSummary('');\n setDeepSearchSources([]);\n setIsDeepSearchModalOpen(true);\n try {\n setChannelBootstrap(true);\n const sessionId = await ensureSessionId('deep-search');\n await sendMessage(text.trim(), undefined, sessionId);\n } catch (err) {\n console.error('[HomeScreen] Failed to create deep-search session:', err);\n } finally {\n setChannelBootstrap(false);\n }\n return;\n }\n try {\n setChannelBootstrap(true);\n const sessionId = await ensureSessionId('chat');\n await sendMessage(text.trim(), undefined, sessionId);\n } catch (err) {\n console.error('[HomeScreen] Failed to create session:', err);\n } finally {\n setChannelBootstrap(false);\n }\n },\n [isLoading, disabled, activeMode, onSubmitProp, ensureSessionId, sendMessage],\n );\n\n const leftItems = getDefaultLeftItems({\n search: {\n active: activeMode === 'chat',\n onClick: () => handleModeSwitch('chat'),\n },\n zap: {\n active: activeMode === 'deep-search',\n onClick: () => handleModeSwitch('deep-search'),\n },\n lightbulb: { enabled: false },\n });\n\n const rightItems = getDefaultRightItems({\n tag: { enabled: false },\n chip: { enabled: false },\n camera: { enabled: false, onClick: () => console.log('camera') },\n image: { enabled: false, onClick: () => console.log('image') },\n attach: { enabled: false, onClick: () => console.log('attach') },\n });\n const latestAssistantMessage = useMemo(() => {\n for (let i = messages.length - 1; i >= 0; i -= 1) {\n if (messages[i]?.role === 'assistant') return messages[i]?.content ?? '';\n }\n return '';\n }, [messages]);\n\n const deepSearchPreviewContent = response || deepSearchSummary;\n const deepSearchPreviewNormalized = useMemo(\n () => normalizeSummaryText(deepSearchPreviewContent || deepSearchSummary || ''),\n [deepSearchPreviewContent, deepSearchSummary],\n );\n\n const handleDeepSearchClose = useCallback(() => {\n if (isStreaming) {\n cancel();\n }\n setIsDeepSearchModalOpen(false);\n setDeepSearchQuery(null);\n setDeepSearchSummary('');\n setDeepSearchSources([]);\n setResearchProcessOpen(true);\n setSourcesAccordionOpen(true);\n }, [isStreaming, cancel]);\n\n const handleRetryDeepSearch = useCallback(async () => {\n if (!deepSearchQuery || isStreaming) return;\n try {\n setChannelBootstrap(true);\n const sessionId = await ensureSessionId('deep-search');\n await sendMessage(deepSearchQuery, undefined, sessionId);\n } catch (error) {\n console.error('[HomeScreen] Failed to retry deep-search:', error);\n } finally {\n setChannelBootstrap(false);\n }\n }, [deepSearchQuery, isStreaming, ensureSessionId, sendMessage]);\n\n useEffect(() => {\n if (!deepSearchQuery || isStreaming || !latestAssistantMessage) return;\n setDeepSearchSummary(normalizeSummaryText(latestAssistantMessage));\n setDeepSearchSources(extractDeepSearchSources(latestAssistantMessage));\n }, [deepSearchQuery, isStreaming, latestAssistantMessage]);\n\n useEffect(() => {\n if (Platform.OS === 'ios') {\n const frameSub = Keyboard.addListener('keyboardWillChangeFrame', (event) =>\n setKeyboardHeight(event.endCoordinates?.height ?? 0),\n );\n const showSub = Keyboard.addListener('keyboardWillShow', (event) =>\n setKeyboardHeight(event.endCoordinates?.height ?? 0),\n );\n const hideSub = Keyboard.addListener('keyboardWillHide', () => setKeyboardHeight(0));\n return () => {\n frameSub.remove();\n showSub.remove();\n hideSub.remove();\n };\n }\n\n const showSub = Keyboard.addListener('keyboardDidShow', (event) =>\n setKeyboardHeight(event.endCoordinates?.height ?? 0),\n );\n const hideSub = Keyboard.addListener('keyboardDidHide', () => setKeyboardHeight(0));\n return () => {\n showSub.remove();\n hideSub.remove();\n };\n }, []);\n\n const composerBottomOffset = Math.max(\n 0,\n keyboardHeight - insets.bottom - (Platform.OS === 'ios' ? IOS_KEYBOARD_DOCKING_ADJUST_PX : 0),\n );\n const composerScrollBottomPadding = COMPOSER_SCROLL_RESERVE_PX;\n\n return (\n <SafeAreaView edges={['left', 'right', 'bottom']} style={{ flex: 1, backgroundColor: surfaceColor }}>\n <TouchableWithoutFeedback onPress={Keyboard.dismiss} accessible={false}>\n <Box flex={1} width=\"100%\" position=\"relative\">\n {(chatError || cdecli.error) && (\n <Box\n mb=\"$2\"\n mx=\"$4\"\n p=\"$3\"\n borderRadius=\"$md\"\n style={{\n backgroundColor: isDark ? '#2b1a1d' : '#fef2f2',\n borderWidth: 1,\n borderColor: isDark ? '#7f1d1d' : '#fecaca',\n }}\n >\n <Text fontSize=\"$sm\" style={{ color: isDark ? '#fecaca' : '#991b1b' }}>\n {chatError || cdecli.error}\n </Text>\n </Box>\n )}\n {showChatHistory ? (\n <ChatHistoryLanding\n onSelectSession={(channelId) => {\n setShowChatHistory(false);\n setActiveSessionId(channelId);\n setActiveMode('chat');\n }}\n onCompose={() => {\n setShowChatHistory(false);\n setActiveSessionId(null);\n setValue('');\n clearMessages();\n }}\n />\n ) : hasMessages || response ? (\n <Box flex={1} width=\"100%\" alignSelf=\"stretch\">\n <MessagesContainerUI\n mode=\"chat\"\n showBackButton={false}\n onBackPress={handleNewChat}\n compactTop\n messagesContainerStyle={{\n paddingHorizontal: 0,\n paddingTop: 0,\n paddingBottom: composerScrollBottomPadding,\n margin: 0,\n marginTop: 0,\n alignSelf: 'center',\n width: contentMaxWidth,\n }}\n listContentStyle={{\n paddingTop: 0,\n paddingBottom: composerScrollBottomPadding,\n margin: 0,\n marginTop: 0,\n width: contentMaxWidth,\n alignSelf: 'center',\n }}\n messages={messages.map((msg, index) => ({\n id: `msg-${index}-${msg.role}`,\n role: msg.role,\n content: msg.content,\n metadata: msg.metadata,\n }))}\n streamingContent={response}\n currentUser={{ id: 'user' }}\n onSend={handleSendMessage}\n disabled={isLoading || disabled}\n isLoading={isLoading}\n onStop={isStreaming ? cancel : onStop}\n renderPlanInputToolbar={() => null}\n renderBuildInputToolbar={() => null}\n />\n </Box>\n ) : (\n <Box flex={1} width=\"100%\">\n <View style={styles.emptyCenterTitleWrap}>\n <Text style={[styles.emptyEyebrow, { color: secondaryTextColor }]}>\n Choose your mode\n </Text>\n <View\n style={[\n styles.emptyModePillRow,\n {\n backgroundColor: isDark ? 'rgba(30, 41, 59, 0.9)' : '#eef2ff',\n borderColor: isDark\n ? 'rgba(148, 163, 184, 0.26)'\n : 'rgba(67, 56, 202, 0.15)',\n },\n ]}\n >\n <Pressable\n onPress={() => handleModeSwitch('chat')}\n style={[\n styles.emptyModePill,\n activeMode === 'chat' && styles.emptyModePillActive,\n activeMode === 'chat' && {\n backgroundColor: isDark ? '#312e81' : '#4338ca',\n },\n ]}\n accessibilityRole=\"button\"\n accessibilityLabel=\"Switch to chat mode\"\n >\n <MaterialCommunityIcons\n name=\"magnify\"\n size={14}\n color={activeMode === 'chat' ? '#ffffff' : secondaryTextColor}\n />\n <Text\n style={[\n styles.emptyModePillLabel,\n { color: activeMode === 'chat' ? '#ffffff' : secondaryTextColor },\n ]}\n >\n Chat\n </Text>\n </Pressable>\n <Pressable\n onPress={() => handleModeSwitch('deep-search')}\n style={[\n styles.emptyModePill,\n activeMode === 'deep-search' && styles.emptyModePillActive,\n activeMode === 'deep-search' && {\n backgroundColor: isDark ? '#312e81' : '#4338ca',\n },\n ]}\n accessibilityRole=\"button\"\n accessibilityLabel=\"Switch to deep-search mode\"\n >\n <MaterialCommunityIcons\n name=\"lightning-bolt-outline\"\n size={14}\n color={activeMode === 'deep-search' ? '#ffffff' : secondaryTextColor}\n />\n <Text\n style={[\n styles.emptyModePillLabel,\n {\n color:\n activeMode === 'deep-search' ? '#ffffff' : secondaryTextColor,\n },\n ]}\n >\n Deep Search\n </Text>\n </Pressable>\n </View>\n <Text style={[styles.emptyCenterTitle, { color: primaryTextColor }]}>\n How do you want to start?\n </Text>\n <Text style={[styles.emptySubtitle, { color: secondaryTextColor }]}>\n Use Chat for quick help, or Deep Search for researched, source-backed answers.\n </Text>\n </View>\n </Box>\n )}\n {!showChatHistory ? (\n <View\n style={[\n styles.bottomComposerWrap,\n {\n paddingBottom: Math.max(insets.bottom - 6, 2) + composerBottomOffset,\n backgroundColor: composerBarBackground,\n borderTopColor: composerBarBorder,\n },\n ]}\n >\n <View style={[styles.bottomComposerInner, { width: contentMaxWidth }]}>\n <InputToolBar\n inputConfig={{\n value,\n onChange: (e) => setValue(e.nativeEvent.text),\n placeholder: inputPlaceholder,\n disabled: isLoading || disabled,\n }}\n leftItems={leftItems}\n rightItems={rightItems}\n templateButton={null}\n templateModalConfig={null}\n micSendButton={{\n hasContent: canSubmit,\n onSend: () => handleSubmit(),\n onMic: () => console.log('mic'),\n disabled: isLoading || disabled,\n isLoading,\n onStop: isStreaming ? cancel : onStop,\n }}\n />\n </View>\n </View>\n ) : null}\n {showSendingLoader ? (\n <View\n pointerEvents=\"none\"\n style={\n pinSendingLoaderNearComposer\n ? [\n styles.sendingLoaderAboveComposer,\n {\n bottom: Math.max(insets.bottom, 12) + SENDING_LOADER_COMPOSER_RESERVE_PX,\n },\n ]\n : styles.sendingLoaderEmptyState\n }\n >\n <YantraBrandLoader size={YANTRA_LOADER_SIZE_COMPACT} />\n </View>\n ) : null}\n </Box>\n </TouchableWithoutFeedback>\n <DeepSearchModal\n visible={isDeepSearchModalOpen}\n query={deepSearchQuery}\n summaryText={deepSearchPreviewNormalized}\n sources={deepSearchSources}\n isStreaming={isStreaming}\n researchProcessOpen={researchProcessOpen}\n sourcesAccordionOpen={sourcesAccordionOpen}\n onToggleResearchProcess={() => setResearchProcessOpen((prev) => !prev)}\n onToggleSourcesAccordion={() => setSourcesAccordionOpen((prev) => !prev)}\n onRetry={() => {\n void handleRetryDeepSearch();\n }}\n onStop={cancel}\n onClose={handleDeepSearchClose}\n />\n </SafeAreaView>\n );\n}\n\nconst styles = StyleSheet.create({\n /** First message / empty screen: loader in the middle of the pane. */\n sendingLoaderEmptyState: {\n position: 'absolute',\n left: 0,\n right: 0,\n top: 0,\n bottom: 0,\n justifyContent: 'center',\n alignItems: 'center',\n zIndex: 40,\n },\n /** Active thread: loader just above the input, not over message history. */\n sendingLoaderAboveComposer: {\n position: 'absolute',\n left: 0,\n right: 0,\n alignItems: 'center',\n justifyContent: 'flex-end',\n paddingBottom: 8,\n zIndex: 40,\n },\n headerRight: {\n flexDirection: 'row',\n alignItems: 'center',\n marginRight: 6,\n gap: 6,\n },\n historyHeaderButton: {\n marginHorizontal: 0,\n padding: 0,\n borderRadius: 22,\n },\n historyHeaderButtonPressed: {\n opacity: 0.72,\n },\n historyHeaderButtonInner: {\n width: 32,\n height: 32,\n borderRadius: 16,\n alignItems: 'center',\n justifyContent: 'center',\n backgroundColor: mobileTokens.color.primarySoft,\n borderWidth: StyleSheet.hairlineWidth,\n borderColor: mobileTokens.color.primaryBorder,\n shadowColor: '#312e81',\n shadowOpacity: 0.1,\n shadowRadius: 5,\n shadowOffset: { width: 0, height: 2 },\n elevation: 2,\n },\n historyHeaderButtonInnerDark: {\n backgroundColor: '#1e293b',\n borderColor: 'rgba(148, 163, 184, 0.35)',\n shadowColor: '#111827',\n },\n newChatButton: {\n padding: 0,\n alignItems: 'center',\n justifyContent: 'center',\n borderRadius: 22,\n },\n newChatButtonInner: {\n width: 32,\n height: 32,\n borderRadius: 16,\n alignItems: 'center',\n justifyContent: 'center',\n backgroundColor: mobileTokens.color.surface,\n borderWidth: 1,\n borderColor: mobileTokens.color.border,\n shadowColor: '#0f172a',\n shadowOpacity: 0.08,\n shadowRadius: 5,\n shadowOffset: { width: 0, height: 2 },\n elevation: 2,\n },\n newChatButtonInnerDark: {\n backgroundColor: '#0f172a',\n borderColor: '#334155',\n },\n backButton: {\n marginLeft: 6,\n width: 36,\n height: 36,\n borderRadius: 18,\n alignItems: 'center',\n justifyContent: 'center',\n backgroundColor: '#f3f4f6',\n },\n newChatButtonPressed: {\n opacity: 0.6,\n },\n emptyCenterTitleWrap: {\n flex: 1,\n alignItems: 'center',\n justifyContent: 'flex-start',\n paddingHorizontal: 24,\n paddingTop: 88,\n paddingBottom: 52,\n maxWidth: 520,\n alignSelf: 'center',\n },\n emptyEyebrow: {\n fontSize: 12,\n fontWeight: '600',\n letterSpacing: 0.4,\n textTransform: 'uppercase',\n marginBottom: 10,\n },\n emptyCenterTitle: {\n marginTop: 2,\n fontSize: 30,\n fontWeight: '700',\n textAlign: 'center',\n letterSpacing: -0.5,\n },\n emptySubtitle: {\n marginTop: 12,\n fontSize: 14,\n lineHeight: 22,\n textAlign: 'center',\n paddingHorizontal: 16,\n maxWidth: 360,\n },\n bottomComposerWrap: {\n position: 'absolute',\n left: 0,\n right: 0,\n bottom: 0,\n alignItems: 'center',\n justifyContent: 'flex-end',\n borderTopWidth: 1,\n shadowColor: '#0f172a',\n shadowOpacity: 0.08,\n shadowRadius: 8,\n shadowOffset: { width: 0, height: -2 },\n elevation: 6,\n },\n bottomComposerInner: {\n paddingHorizontal: 14,\n paddingTop: 10,\n paddingBottom: 4,\n },\n emptyModePillRow: {\n flexDirection: 'row',\n alignItems: 'center',\n gap: 8,\n marginBottom: 22,\n borderRadius: 16,\n padding: 6,\n borderWidth: 1,\n shadowColor: '#312e81',\n shadowOpacity: 0.08,\n shadowRadius: 8,\n shadowOffset: { width: 0, height: 3 },\n elevation: 3,\n },\n emptyModePill: {\n flexDirection: 'row',\n alignItems: 'center',\n gap: 4,\n paddingHorizontal: 12,\n paddingVertical: 7,\n borderRadius: 11,\n },\n emptyModePillActive: {\n shadowColor: '#312e81',\n shadowOpacity: 0.18,\n shadowRadius: 6,\n shadowOffset: { width: 0, height: 2 },\n elevation: 2,\n },\n emptyModePillLabel: {\n fontSize: 12,\n fontWeight: '600',\n },\n});\n\nconst HomeScreen: FC<HomeScreenProps> = (props) => <HomeScreenContent {...props} />;\n\nexport default HomeScreen;\n"],"names":["_a","uuidv4","_b","_c","showSub","hideSub"],"mappings":";;;;;;;;;;;;;;;;AAiCA,MAAM,kCAAqC,GAAA,GAAA;AAC3C,MAAM,8BAAiC,GAAA,EAAA;AACvC,MAAM,0BAA6B,GAAA,GAAA;AACnC,SAAS,8BAA8B,QAAkC,EAAA;AACvE,EAAI,IAAA,QAAA,IAAY,MAAa,OAAA,IAAA;AAC7B,EAAI,IAAA,OAAO,aAAa,QAAU,EAAA;AAChC,IAAI,IAAA;AACF,MAAM,MAAA,MAAA,GAAS,IAAK,CAAA,KAAA,CAAM,QAAQ,CAAA;AAGlC,MAAA,MAAM,IAAI,MAAQ,IAAA,IAAA,GAAA,KAAA,CAAA,GAAA,MAAA,CAAA,YAAA;AAClB,MAAO,OAAA,OAAO,MAAM,QAAY,IAAA,CAAA,CAAE,MAAS,GAAA,CAAA,CAAE,MAAS,GAAA,IAAA;AAAA,KAChD,CAAA,OAAA,CAAA,EAAA;AACN,MAAO,OAAA,IAAA;AAAA;AACT;AAEF,EAAA,IAAI,OAAO,QAAa,KAAA,QAAA,IAAY,QAAa,KAAA,IAAA,IAAQ,kBAAkB,QAAU,EAAA;AACnF,IAAA,MAAM,IAAK,QAER,CAAA,YAAA;AACH,IAAO,OAAA,OAAO,MAAM,QAAY,IAAA,CAAA,CAAE,MAAS,GAAA,CAAA,CAAE,MAAS,GAAA,IAAA;AAAA;AAExD,EAAO,OAAA,IAAA;AACT;AACA,SAAS,yBAAyB,QAAkC,EAAA;AAClE,EAAI,IAAA,QAAA,IAAY,MAAa,OAAA,IAAA;AAC7B,EAAI,IAAA,OAAO,aAAa,QAAU,EAAA;AAChC,IAAI,IAAA;AACF,MAAM,MAAA,MAAA,GAAS,IAAK,CAAA,KAAA,CAAM,QAAQ,CAAA;AAGlC,MAAA,MAAM,IAAI,MAAQ,IAAA,IAAA,GAAA,KAAA,CAAA,GAAA,MAAA,CAAA,OAAA;AAClB,MAAO,OAAA,OAAO,MAAM,QAAY,IAAA,CAAA,CAAE,MAAS,GAAA,CAAA,CAAE,MAAS,GAAA,IAAA;AAAA,KAChD,CAAA,OAAA,CAAA,EAAA;AACN,MAAO,OAAA,IAAA;AAAA;AACT;AAEF,EAAA,IAAI,OAAO,QAAa,KAAA,QAAA,IAAY,QAAa,KAAA,IAAA,IAAQ,aAAa,QAAU,EAAA;AAC9E,IAAA,MAAM,IAAK,QAER,CAAA,OAAA;AACH,IAAO,OAAA,OAAO,MAAM,QAAY,IAAA,CAAA,CAAE,MAAS,GAAA,CAAA,CAAE,MAAS,GAAA,IAAA;AAAA;AAExD,EAAO,OAAA,IAAA;AACT;AACA,SAAS,iBAAkB,CAAA;AAAA,EACzB,WAAc,GAAA,MAAA;AAAA,EACd,QAAU,EAAA,YAAA;AAAA,EACV,MAAA;AAAA,EACA,WAAW,aAAgB,GAAA,KAAA;AAAA,EAC3B,QAAW,GAAA;AACb,CAAoB,EAAA;AApFpB,EAAA,IAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA;AAqFE,EAAM,MAAA;AAAA,IACJ,KAAO,EAAA;AAAA,MACL,mBAAoB,EAAA;AACxB,EAAA,MAAM,cAAc,cAAe,EAAA;AACnC,EAAA,MAAM,SAAS,WAAgB,KAAA,MAAA;AAC/B,EAAA,MAAM,aAAa,aAAc,EAAA;AACjC,EAAA,MAAM,QAAQ,QAAc,EAAA;AAC5B,EAAM,MAAA,mBAAA,GAAsB,KAAM,CAAA,MAAA,CAAO,KAAK,CAAA;AAC9C,EAAA,MAAM,CAAC,KAAA,EAAO,QAAQ,CAAA,GAAI,SAAS,EAAE,CAAA;AACrC,EAAA,MAAM,CAAC,UAAA,EAAY,aAAa,CAAA,GAAI,SAAsB,WAAW,CAAA;AACrE,EAAA,MAAM,CAAC,eAAA,EAAiB,kBAAkB,CAAA,GAAI,SAAwB,IAAI,CAAA;AAC1E,EAAA,MAAM,CAAC,qBAAA,EAAuB,wBAAwB,CAAA,GAAI,SAAS,KAAK,CAAA;AACxE,EAAA,MAAM,CAAC,eAAA,EAAiB,kBAAkB,CAAA,GAAI,SAAwB,IAAI,CAAA;AAC1E,EAAA,MAAM,CAAC,iBAAA,EAAmB,oBAAoB,CAAA,GAAI,SAAS,EAAE,CAAA;AAC7D,EAAA,MAAM,CAAC,iBAAmB,EAAA,oBAAoB,CAAI,GAAA,QAAA,CAAiC,EAAE,CAAA;AACrF,EAAA,MAAM,CAAC,mBAAA,EAAqB,sBAAsB,CAAA,GAAI,SAAS,IAAI,CAAA;AACnE,EAAA,MAAM,CAAC,oBAAA,EAAsB,uBAAuB,CAAA,GAAI,SAAS,IAAI,CAAA;AAErE,EAAA,MAAM,CAAC,eAAA,EAAiB,kBAAkB,CAAA,GAAI,SAAS,KAAK,CAAA;AAE5D,EAAA,MAAM,CAAC,gBAAA,EAAkB,mBAAmB,CAAA,GAAI,SAAS,KAAK,CAAA;AAC9D,EAAM,MAAA;AAAA,IACJ;AAAA,MACE,gBAAiB,EAAA;AACrB,EAEI,eAAgB;AACpB,EAAM,MAAA;AAAA,IACJ,OAAS,EAAA,eAAA;AAAA,IACT;AAAA,MACE,kBAAmB,EAAA;AACvB,EAAM,MAAA;AAAA,IACJ,IAAM,EAAA;AAAA,MACJ,sBAAuB,EAAA;AAC3B,EAAM,MAAA,UAAA,GAAA,CAAa,EAAa,GAAA,WAAA,IAAA,IAAA,GAAA,MAAA,GAAA,WAAA,CAAA,cAAA,KAAb,IAA6B,GAAA,MAAA,GAAA,EAAA,CAAA,UAAA;AAChD,EAAM,MAAA;AAAA,IACJ,IAAM,EAAA;AAAA,MACJ,uBAAwB,CAAA;AAAA,IAC1B,SAAW,EAAA;AAAA,MACT,WAAa,EAAA,UAAA;AAAA,MACb,OAAS,EAAA;AAAA,QACP,UAAU,oBAAqB,CAAA,aAAA;AAAA,QAC/B,SAAW,EAAA,iBAAA;AAAA,QACX,kBAAoB,EAAA;AAAA;AACtB,KACF;AAAA,IACA,MAAM,CAAC,UAAA;AAAA,IACP,WAAa,EAAA;AAAA,GACd,CAAA;AACD,EAAM,MAAA,2BAAA,GAA8B,QAAQ,MAAG;AAtIjD,IAAAA,IAAAA,GAAAA;AAsIoD,IAAA,OAAA,6BAAA,CAAA,CAA8BA,GAAA,GAAA,gBAAA,IAAA,IAAA,GAAA,MAAA,GAAA,gBAAA,CAAkB,YAAlB,KAAA,IAAA,GAAA,MAAA,GAAAA,IAAgC,QAAQ,CAAA;AAAA,GAAG,EAAA,CAAC,gBAAgB,CAAC,CAAA;AAC7I,EAAM,MAAA,6BAAA,GAAgC,QAAQ,MAAG;AAvInD,IAAAA,IAAAA,GAAAA;AAuIsD,IAAA,OAAA,wBAAA,CAAA,CAAyBA,GAAA,GAAA,gBAAA,IAAA,IAAA,GAAA,MAAA,GAAA,gBAAA,CAAkB,YAAlB,KAAA,IAAA,GAAA,MAAA,GAAAA,IAAgC,QAAQ,CAAA;AAAA,GAAG,EAAA,CAAC,gBAAgB,CAAC,CAAA;AAC1I,EAAM,MAAA,YAAA,GAAA,CAAA,CAAgB,0CAAO,MAAP,KAAA,IAAA,GAAA,MAAA,GAAA,EAAA,CAAe,YAAf,IAAgD,GAAA,EAAA,GAAA,EAAA,EAAI,MAAU,IAAA,IAAA;AACpF,EAAM,MAAA,gBAAA,GAAmB,eAAmB,IAAA,2BAAA,IAA+B,YAAgB,IAAA,IAAA;AAE3F,EAAM,MAAA,kBAAA,GAAqB,aAAa,6BAAiC,IAAA,IAAA;AACzE,EAAM,MAAA;AAAA,IACJ;AAAA,MACE,iBAAkB,EAAA;AACtB,EAAM,MAAA,cAAA,GAAA,CAAiB,mDAAiB,WAAgB,MAAA,cAAA;AACxD,EAAA,MAAM,MAAS,GAAA,oBAAA,CAAqB,cAAgB,EAAA,eAAA,IAAA,IAAA,GAAA,eAAA,GAAmB,MAAS,CAAA;AAGhF,EAAM,MAAA,eAAA,GAAkB,kBAAkB,MAAO,CAAA,gBAAA;AACjD,EAAA,MAAM,4BAA2B,EAAO,GAAA,CAAA,EAAA,GAAA,MAAA,CAAA,eAAA,KAAP,IAA0B,GAAA,EAAA,GAAA,eAAA,IAAA,IAAA,GAAA,MAAA,GAAA,eAAA,CAAiB,oBAA3C,IAA8D,GAAA,EAAA,GAAA,UAAA;AAC/F,EAAM,MAAA,WAAA,GAAoC,OAAQ,CAAA,MAAM,eAAkB,GAAA;AAAA,IACxE,IAAM,EAAA,QAAA;AAAA,IACN,kBAAkB,MAAO,CAAA,gBAAA;AAAA,IACzB,WAAW,MAAO,CAAA,SAAA;AAAA,IAClB,eAAiB,EAAA;AAAA,GACf,GAAA;AAAA,IACF,IAAM,EAAA;AAAA,GACR,EAAG,CAAC,eAAiB,EAAA,MAAA,CAAO,kBAAkB,MAAO,CAAA,SAAA,EAAW,wBAAwB,CAAC,CAAA;AACzF,EAAM,MAAA,IAAA,GAAO,aAAc,CAAA,eAAA,EAAiB,WAAW,CAAA;AACvD,EAAM,MAAA;AAAA,IACJ,QAAA;AAAA,IACA,QAAA;AAAA,IACA,KAAO,EAAA,SAAA;AAAA,IACP,SAAW,EAAA,WAAA;AAAA,IACX,WAAA;AAAA,IACA,WAAA;AAAA,IACA,WAAA;AAAA,IACA,MAAA;AAAA,IACA;AAAA,GACE,GAAA,IAAA;AACJ,EAAM,MAAA,YAAA,GAAe,MAAM,IAAK,EAAA;AAChC,EAAM,MAAA,QAAA,GAAW,aAAa,MAAS,GAAA,CAAA;AACvC,EAAA,MAAM,SAAY,GAAA,QAAA,IAAY,OAAQ,CAAA,YAAA,IAAgB,gBAAgB,CAAA;AACtE,EAAA,MAAM,YAAY,aAAiB,IAAA,WAAA;AACnC,EAAA,MAAM,iBAAiB,UAAe,KAAA,aAAA;AACtC,EAAA,MAAM,gBAAmB,GAAA,CAAC,gBAAmB,GAAA,2BAAA,GAA8B,iBAAiB,sBAAyB,GAAA,iBAAA;AACrH,EAAM,MAAA,mBAAA,GAAsB,QAAQ,MAAM;AA/K5C,IAAAA,IAAAA,GAAAA;AAgLI,IAAA,IAAI,CAAC,WAAe,IAAA,CAAC,eAAe,QAAS,CAAA,MAAA,KAAW,GAAU,OAAA,KAAA;AAClE,IAAOA,OAAAA,CAAAA,CAAAA,GAAAA,GAAA,SAAS,QAAS,CAAA,MAAA,GAAS,CAAC,CAA5B,KAAA,IAAA,GAAA,MAAA,GAAAA,IAA+B,IAAS,MAAA,MAAA;AAAA,GAC9C,EAAA,CAAC,WAAa,EAAA,WAAA,EAAa,QAAQ,CAAC,CAAA;AAGvC,EAAA,MAAM,+BAA+B,OAAQ,CAAA,MAAM,QAAS,CAAA,MAAA,GAAS,KAAK,OAAS,CAAA,CAAA,QAAA,IAAA,IAAA,GAAA,QAAA,GAAY,EAAI,EAAA,IAAA,EAAM,CAAG,EAAA,CAAC,QAAS,CAAA,MAAA,EAAQ,QAAQ,CAAC,CAAA;AACvI,EAAM,MAAA,iBAAA,GAAoB,CAAC,eAAA,KAAoB,gBAAoB,IAAA,mBAAA,CAAA;AACnE,EAAA,MAAM,SAAS,iBAAkB,EAAA;AACjC,EAAA,MAAM,CAAC,cAAA,EAAgB,iBAAiB,CAAA,GAAI,SAAS,CAAC,CAAA;AAQtD,EAAM,MAAA,gBAAA,GAAmB,WAAY,CAAA,CAAC,IAAsB,KAAA;AAC1D,IAAA,aAAA,CAAc,IAAI,CAAA;AAAA,GACpB,EAAG,EAAE,CAAA;AAGL,EAAM,MAAA,eAAA,GAAkB,WAAY,CAAA,OAAO,IAAuC,KAAA;AAChF,IAAA,IAAI,iBAAwB,OAAA,eAAA;AAC5B,IAAI,IAAA,CAAC,gBAAoB,IAAA,CAAC,kBAAoB,EAAA;AAC5C,MAAM,MAAA,IAAI,MAAM,4DAA4D,CAAA;AAAA;AAE9E,IAAA,MAAM,qBAAqBC,EAAO,EAAA;AAClC,IAAA,MAAM,QAAQ,IAAS,KAAA,aAAA,GAAgB,eAAe,kBAAkB,CAAA,CAAA,GAAK,gBAAgB,kBAAkB,CAAA,CAAA;AAC/G,IAAM,MAAA,OAAA,GAAU,MAAM,aAAc,CAAA;AAAA,MAClC,EAAI,EAAA,kBAAA;AAAA,MACJ,KAAA;AAAA,MACA,QAAU,EAAA,KAAA;AAAA,MACV,UAAY,EAAA,IAAA;AAAA,MACZ,UAAY,EAAA,KAAA;AAAA,MACZ,QAAU,EAAA,KAAA;AAAA,MACV,KAAO,EAAA,IAAA;AAAA,MACP,YAAc,EAAA,IAAA;AAAA,MACd,OAAS,EAAA,gBAAA;AAAA,MACT,SAAW,EAAA;AAAA,KACL,CAAA;AACR,IAAA,kBAAA,CAAmB,QAAQ,EAAE,CAAA;AAC7B,IAAA,OAAO,OAAQ,CAAA,EAAA;AAAA,KACd,CAAC,eAAA,EAAiB,aAAe,EAAA,gBAAA,EAAkB,kBAAkB,CAAC,CAAA;AACzE,EAAM,MAAA,YAAA,GAAe,WAAY,CAAA,OAAO,WAAgD,KAAA;AACtF,IAAI,IAAA,CAAC,SAAa,IAAA,SAAA,IAAa,QAAU,EAAA;AACzC,IAAA,MAAM,UAA6B,GAAA;AAAA,MACjC,IAAM,EAAA,UAAA;AAAA,MACN,KAAO,EAAA,YAAA;AAAA,MACP;AAAA,KACF;AACA,IAAA,IAAI,eAAe,aAAe,EAAA;AAChC,MAAA,IAAI,YAAc,EAAA;AAChB,QAAA,YAAA,CAAa,UAAU,CAAA;AAAA;AAEzB,MAAA,QAAA,CAAS,EAAE,CAAA;AACX,MAAA,kBAAA,CAAmB,YAAY,CAAA;AAC/B,MAAA,oBAAA,CAAqB,EAAE,CAAA;AACvB,MAAA,oBAAA,CAAqB,EAAE,CAAA;AACvB,MAAA,wBAAA,CAAyB,IAAI,CAAA;AAC7B,MAAI,IAAA;AACF,QAAA,mBAAA,CAAoB,IAAI,CAAA;AACxB,QAAM,MAAA,SAAA,GAAY,MAAM,eAAA,CAAgB,aAAa,CAAA;AACrD,QAAM,MAAA,WAAA,CAAY,YAAc,EAAA,KAAA,CAAA,EAAW,SAAS,CAAA;AAAA,eAC7C,GAAK,EAAA;AACZ,QAAQ,OAAA,CAAA,KAAA,CAAM,sDAAsD,GAAG,CAAA;AAAA,OACvE,SAAA;AACA,QAAA,mBAAA,CAAoB,KAAK,CAAA;AAAA;AAE3B,MAAA;AAAA;AAEF,IAAI,IAAA,YAAA,IAAgB,eAAe,MAAQ,EAAA;AACzC,MAAA,YAAA,CAAa,UAAU,CAAA;AACvB,MAAA,QAAA,CAAS,EAAE,CAAA;AACX,MAAA;AAAA;AAEF,IAAI,IAAA;AACF,MAAA,mBAAA,CAAoB,IAAI,CAAA;AACxB,MAAM,MAAA,SAAA,GAAY,MAAM,eAAA,CAAgB,MAAM,CAAA;AAC9C,MAAA,QAAA,CAAS,EAAE,CAAA;AACX,MAAM,MAAA,WAAA,CAAY,YAAc,EAAA,KAAA,CAAA,EAAW,SAAS,CAAA;AAAA,aAC7C,GAAK,EAAA;AACZ,MAAQ,OAAA,CAAA,KAAA,CAAM,0CAA0C,GAAG,CAAA;AAAA,KAC3D,SAAA;AACA,MAAA,mBAAA,CAAoB,KAAK,CAAA;AAAA;AAC3B,GACF,EAAG,CAAC,SAAA,EAAW,SAAW,EAAA,QAAA,EAAU,UAAY,EAAA,YAAA,EAAc,eAAiB,EAAA,YAAA,EAAc,eAAiB,EAAA,WAAW,CAAC,CAAA;AAC1H,EAAM,MAAA,aAAA,GAAgB,YAAY,MAAM;AACtC,IAAA,kBAAA,CAAmB,KAAK,CAAA;AACxB,IAAA,kBAAA,CAAmB,IAAI,CAAA;AACvB,IAAA,QAAA,CAAS,EAAE,CAAA;AACX,IAAc,aAAA,EAAA;AAAA,GAChB,EAAG,CAAC,aAAa,CAAC,CAAA;AAClB,EAAM,MAAA,qBAAA,GAAwB,YAAY,MAAM;AAC9C,IAAA,kBAAA,CAAmB,IAAI,CAAA;AAAA,GACzB,EAAG,EAAE,CAAA;AACL,EAAM,MAAA,sBAAA,GAAyB,YAAY,MAAM;AAC/C,IAAA,kBAAA,CAAmB,KAAK,CAAA;AAAA,GAC1B,EAAG,EAAE,CAAA;AACL,EAAM,MAAA,mBAAA,GAAsB,YAAY,MAAM;AAAA,GAE9C,EAAG,EAAE,CAAA;AACL,EAAA,MAAM,oBAAuB,GAAA,MAAA,CAAO,MAAW,KAAA,YAAA,GAAe,YAAe,GAAA,MAAA,CAAO,MAAW,KAAA,WAAA,GAAc,WAAc,GAAA,MAAA,CAAO,MAAW,KAAA,OAAA,GAAU,OAAU,GAAA,cAAA;AACjK,EAAA,MAAM,kBAAqB,GAAA,SAAA;AAC3B,EAAA,MAAM,mBAAsB,GAAA,MAAA,CAAO,MAAW,KAAA,YAAA,GAAe,aAAgB,GAAA,MAAA;AAC7E,EAAA,MAAM,sBAAsB,MAAO,CAAA,KAAA;AACnC,EAAA,MAAM,YAAe,GAAA,MAAA,GAAS,SAAY,GAAA,YAAA,CAAa,KAAM,CAAA,EAAA;AAC7D,EAAA,MAAM,gBAAmB,GAAA,MAAA,GAAS,SAAY,GAAA,YAAA,CAAa,KAAM,CAAA,IAAA;AACjE,EAAA,MAAM,kBAAqB,GAAA,MAAA,GAAS,SAAY,GAAA,YAAA,CAAa,KAAM,CAAA,SAAA;AACnE,EAAM,MAAA,WAAA,GAAc,SAAS,SAAY,GAAA,SAAA;AACzC,EAAM,MAAA,gBAAA,GAAmB,SAAS,SAAY,GAAA,SAAA;AAC9C,EAAM,MAAA,qBAAA,GAAwB,SAAS,wBAA2B,GAAA,2BAAA;AAClE,EAAM,MAAA,iBAAA,GAAoB,SAAS,wBAA2B,GAAA,2BAAA;AAC9D,EAAM,MAAA,eAAA,GAAkB,KAAK,GAAI,CAAA,GAAA,EAAK,KAAK,GAAI,CAAA,GAAA,EAAK,WAAc,GAAA,EAAE,CAAC,CAAA;AACrE,EAAA,SAAA,CAAU,MAAM;AAjSlB,IAAA,IAAAD,KAAAE,GAAAC,EAAAA,GAAAA;AAkSI,IAAM,MAAA,cAAA,GAAA,CAAA,CAAkBD,GAAAF,GAAAA,CAAAA,GAAAA,GAAA,KAAO,IAAA,IAAA,GAAA,MAAA,GAAA,KAAA,CAAA,MAAA,KAAP,gBAAAA,GAAe,CAAA,OAAA,KAAf,IAAAE,GAAAA,MAAAA,GAAAA,GAAAA,CAA+C,IAAU,EAAA,KAAA,EAAA;AACjF,IAAI,IAAA,CAAC,gBAAoB,IAAA,cAAA,KAAmB,gBAAkB,EAAA;AAE9D,IAAA,CAACC,GAAA,GAAA,UAAA,CAAmB,SAAnB,KAAA,IAAA,GAAA,MAAA,GAAAA,IAAA,IAA+B,CAAA,UAAA,EAAA;AAAA,MAC9B,OAAS,EAAA;AAAA,KACX,CAAA;AAAA,GACF,EAAG,CAAC,UAAY,EAAA,CAAA,EAAA,GAAA,KAAA,IAAA,IAAA,GAAA,MAAA,GAAA,KAAA,CAAO,WAAP,IAAe,GAAA,MAAA,GAAA,EAAA,CAAA,OAAA,EAAS,gBAAgB,CAAC,CAAA;AACzD,EAAA,SAAA,CAAU,MAAM;AAzSlB,IAAA,IAAAH,KAAAE,GAAAC,EAAAA,GAAAA;AA0SI,IAAM,MAAA,cAAA,GAAA,CAAA,CAAkBD,GAAAF,GAAAA,CAAAA,GAAAA,GAAA,KAAO,IAAA,IAAA,GAAA,MAAA,GAAA,KAAA,CAAA,MAAA,KAAP,gBAAAA,GAAe,CAAA,OAAA,KAAf,IAAAE,GAAAA,MAAAA,GAAAA,GAAAA,CAA+C,IAAU,EAAA,KAAA,EAAA;AACjF,IAAA,IAAI,mBAAoB,CAAA,OAAA,IAAW,cAAkB,IAAA,CAAC,gBAAkB,EAAA;AACxE,IAAA,mBAAA,CAAoB,OAAU,GAAA,IAAA;AAC9B,IAAQ,OAAA,CAAA,GAAA,CAAI,sBAAsB,gBAAgB,CAAA;AAKlD,IAAAC,CAAAA,GAAAA,GAAA,WAAW,SAAU,EAAA,KAArB,gBAAAA,GAAwB,CAAA,QAAA,CAAS,aAAc,CAAA,QAAA,CAAS,WAAa,EAAA;AAAA,MACnE,MAAQ,EAAA,uBAAA;AAAA,MACR,MAAQ,EAAA;AAAA,QACN,OAAS,EAAA;AAAA,OACX;AAAA,MACA,KAAO,EAAA,IAAA;AAAA,MACP,GAAK,EAAA,IAAA,CAAK,GAAI,EAAA,CAAE,QAAS;AAAA,KAC1B,CAAA,CAAA;AAAA,GAyBH,EAAG,CAAC,UAAY,EAAA,CAAA,EAAA,GAAA,KAAA,IAAA,IAAA,GAAA,MAAA,GAAA,KAAA,CAAO,WAAP,IAAe,GAAA,MAAA,GAAA,EAAA,CAAA,OAAA,EAAS,gBAAkB,EAAA,aAAa,CAAC,CAAA;AACxE,EAAA,SAAA,CAAU,MAAM;AACd,IAAA,UAAA,CAAW,UAAW,CAAA;AAAA,MACpB,WAAa,EAAA,MAAA;AAAA,MACb,WAAA,EAAa,kBAAkB,OAAU,GAAA,QAAA;AAAA,MACzC,UAAA,EAAY,kBAAkB,sBAAM,GAAA,CAAC,aAAU,OAAS,EAAA,sBAAA,EAAwB,OAAO,CAAC;AAAA,QACtF;AAAA,YACI,CAAC,MAAA,CAAO,YAAY,OAAW,IAAA,MAAA,CAAO,oBAAoB,CAAG,EAAA,kBAAA,EAAmB,gBAClE,QAAC,kBAAA,GAAA,CAAA,sBAAA,EAAA,EAAuB,MAAK,cAAe,EAAA,IAAA,EAAM,IAAI,KAAO,EAAA,gBAAA,EAAkB,GACnF,CAAe,GAAA,MAAA;AAAA,MAC/B,aAAa,sBAAM,IAAA,CAAC,IAAK,EAAA,EAAA,KAAA,EAAO,OAAO,WACzB,EAAA,QAAA,EAAA;AAAA,wBAAA,GAAA,CAAC,0BAA2B,EAAA,EAAA,aAAA,EAAe,oBAAsB,EAAA,YAAA,EAAc,mBAAqB,EAAA,eAAA,EAAiB,mBAAqB,EAAA,QAAA,EAAU,KAAO,EAAA,WAAA,EAAa,mBAAqB,EAAA,IAAA,EAAM,kBAAoB,EAAA,CAAA;AAAA,QACtN,CAAC,eAAkB,mBAAA,GAAA,CAAC,aAAU,OAAS,EAAA,qBAAA,EAAuB,OAAO,CAAC;AAAA,UACjF;AAAA,SACI,KAAA,CAAC,MAAO,CAAA,mBAAA,EAAqB,WAAW,MAAO,CAAA,0BAA0B,CAAG,EAAA,kBAAA,EAAmB,cAAe,EAAA,iBAAA,EAAkB,QAClH,EAAA,QAAA,kBAAA,GAAA,CAAC,QAAK,KAAO,EAAA,CAAC,MAAO,CAAA,wBAAA,EAA0B,MAAS,GAAA,MAAA,CAAO,4BAA+B,GAAA,IAAI,GAC9F,QAAC,kBAAA,GAAA,CAAA,sBAAA,EAAA,EAAuB,IAAK,EAAA,SAAA,EAAU,MAAM,EAAI,EAAA,KAAA,EAAO,WAAa,EAAA,CAAA,EACzE,GACJ,CAAe,GAAA,IAAA;AAAA,wBAClB,GAAA,CAAA,SAAA,EAAA,EAAU,OAAS,EAAA,aAAA,EAAe,OAAO,CAAC;AAAA,UACrD;AAAA,SACI,KAAA,CAAC,MAAO,CAAA,aAAA,EAAe,OAAW,IAAA,MAAA,CAAO,oBAAoB,CAAA,EAAG,kBAAmB,EAAA,UAAA,EACzE,QAAC,kBAAA,GAAA,CAAA,IAAA,EAAA,EAAK,OAAO,CAAC,MAAA,CAAO,kBAAoB,EAAA,MAAA,GAAS,MAAO,CAAA,sBAAA,GAAyB,IAAI,CAAA,EAClF,QAAC,kBAAA,GAAA,CAAA,sBAAA,EAAA,EAAuB,IAAK,EAAA,mBAAA,EAAoB,IAAM,EAAA,EAAA,EAAI,KAAO,EAAA,gBAAA,EAAkB,GACxF,CACJ,EAAA;AAAA,OACJ,EAAA;AAAA,KACX,CAAA;AAAA,KACA,CAAC,UAAA,EAAY,eAAiB,EAAA,sBAAA,EAAwB,uBAAuB,aAAe,EAAA,mBAAA,EAAqB,oBAAsB,EAAA,mBAAA,EAAqB,qBAAqB,kBAAoB,EAAA,gBAAA,EAAkB,WAAa,EAAA,gBAAA,EAAkB,MAAM,CAAC,CAAA;AAChQ,EAAM,MAAA,iBAAA,GAAoB,WAAY,CAAA,OAAO,IAAiB,KAAA;AAC5D,IAAA,IAAI,CAAC,IAAA,CAAK,IAAK,EAAA,IAAK,aAAa,QAAU,EAAA;AAC3C,IAAA,MAAM,UAA6B,GAAA;AAAA,MACjC,IAAM,EAAA,UAAA;AAAA,MACN,KAAA,EAAO,KAAK,IAAK;AAAA,KACnB;AACA,IAAA,IAAI,eAAe,aAAe,EAAA;AAChC,MAAA,IAAI,YAAc,EAAA;AAChB,QAAA,YAAA,CAAa,UAAU,CAAA;AAAA;AAEzB,MAAmB,kBAAA,CAAA,IAAA,CAAK,MAAM,CAAA;AAC9B,MAAA,oBAAA,CAAqB,EAAE,CAAA;AACvB,MAAA,oBAAA,CAAqB,EAAE,CAAA;AACvB,MAAA,wBAAA,CAAyB,IAAI,CAAA;AAC7B,MAAI,IAAA;AACF,QAAA,mBAAA,CAAoB,IAAI,CAAA;AACxB,QAAM,MAAA,SAAA,GAAY,MAAM,eAAA,CAAgB,aAAa,CAAA;AACrD,QAAA,MAAM,WAAY,CAAA,IAAA,CAAK,IAAK,EAAA,EAAG,QAAW,SAAS,CAAA;AAAA,eAC5C,GAAK,EAAA;AACZ,QAAQ,OAAA,CAAA,KAAA,CAAM,sDAAsD,GAAG,CAAA;AAAA,OACvE,SAAA;AACA,QAAA,mBAAA,CAAoB,KAAK,CAAA;AAAA;AAE3B,MAAA;AAAA;AAEF,IAAI,IAAA;AACF,MAAA,mBAAA,CAAoB,IAAI,CAAA;AACxB,MAAM,MAAA,SAAA,GAAY,MAAM,eAAA,CAAgB,MAAM,CAAA;AAC9C,MAAA,MAAM,WAAY,CAAA,IAAA,CAAK,IAAK,EAAA,EAAG,QAAW,SAAS,CAAA;AAAA,aAC5C,GAAK,EAAA;AACZ,MAAQ,OAAA,CAAA,KAAA,CAAM,0CAA0C,GAAG,CAAA;AAAA,KAC3D,SAAA;AACA,MAAA,mBAAA,CAAoB,KAAK,CAAA;AAAA;AAC3B,GACF,EAAG,CAAC,SAAW,EAAA,QAAA,EAAU,YAAY,YAAc,EAAA,eAAA,EAAiB,WAAW,CAAC,CAAA;AAChF,EAAA,MAAM,YAAY,mBAAoB,CAAA;AAAA,IACpC,MAAQ,EAAA;AAAA,MACN,QAAQ,UAAe,KAAA,MAAA;AAAA,MACvB,OAAA,EAAS,MAAM,gBAAA,CAAiB,MAAM;AAAA,KACxC;AAAA,IACA,GAAK,EAAA;AAAA,MACH,QAAQ,UAAe,KAAA,aAAA;AAAA,MACvB,OAAA,EAAS,MAAM,gBAAA,CAAiB,aAAa;AAAA,KAC/C;AAAA,IACA,SAAW,EAAA;AAAA,MACT,OAAS,EAAA;AAAA;AACX,GACD,CAAA;AACD,EAAA,MAAM,aAAa,oBAAqB,CAAA;AAAA,IACtC,GAAK,EAAA;AAAA,MACH,OAAS,EAAA;AAAA,KACX;AAAA,IACA,IAAM,EAAA;AAAA,MACJ,OAAS,EAAA;AAAA,KACX;AAAA,IACA,MAAQ,EAAA;AAAA,MACN,OAAS,EAAA,KAAA;AAAA,MACT,OAAS,EAAA,MAAM,OAAQ,CAAA,GAAA,CAAI,QAAQ;AAAA,KACrC;AAAA,IACA,KAAO,EAAA;AAAA,MACL,OAAS,EAAA,KAAA;AAAA,MACT,OAAS,EAAA,MAAM,OAAQ,CAAA,GAAA,CAAI,OAAO;AAAA,KACpC;AAAA,IACA,MAAQ,EAAA;AAAA,MACN,OAAS,EAAA,KAAA;AAAA,MACT,OAAS,EAAA,MAAM,OAAQ,CAAA,GAAA,CAAI,QAAQ;AAAA;AACrC,GACD,CAAA;AACD,EAAM,MAAA,sBAAA,GAAyB,QAAQ,MAAM;AAnb/C,IAAA,IAAAH,KAAAE,GAAAC,EAAAA,GAAAA;AAobI,IAAA,KAAA,IAAS,IAAI,QAAS,CAAA,MAAA,GAAS,GAAG,CAAK,IAAA,CAAA,EAAG,KAAK,CAAG,EAAA;AAChD,MAAA,IAAA,CAAA,CAAIH,MAAA,QAAS,CAAA,CAAC,MAAV,IAAAA,GAAAA,MAAAA,GAAAA,GAAAA,CAAa,UAAS,WAAa,EAAA,OAAA,CAAOG,GAAAD,GAAAA,CAAAA,GAAAA,GAAA,SAAS,CAAC,CAAA,KAAV,gBAAAA,GAAa,CAAA,OAAA,KAAb,OAAAC,GAAwB,GAAA,EAAA;AAAA;AAExE,IAAO,OAAA,EAAA;AAAA,GACT,EAAG,CAAC,QAAQ,CAAC,CAAA;AACb,EAAA,MAAM,2BAA2B,QAAY,IAAA,iBAAA;AAC7C,EAAM,MAAA,2BAAA,GAA8B,OAAQ,CAAA,MAAM,oBAAqB,CAAA,wBAAA,IAA4B,iBAAqB,IAAA,EAAE,CAAG,EAAA,CAAC,wBAA0B,EAAA,iBAAiB,CAAC,CAAA;AAC1K,EAAM,MAAA,qBAAA,GAAwB,YAAY,MAAM;AAC9C,IAAA,IAAI,WAAa,EAAA;AACf,MAAO,MAAA,EAAA;AAAA;AAET,IAAA,wBAAA,CAAyB,KAAK,CAAA;AAC9B,IAAA,kBAAA,CAAmB,IAAI,CAAA;AACvB,IAAA,oBAAA,CAAqB,EAAE,CAAA;AACvB,IAAA,oBAAA,CAAqB,EAAE,CAAA;AACvB,IAAA,sBAAA,CAAuB,IAAI,CAAA;AAC3B,IAAA,uBAAA,CAAwB,IAAI,CAAA;AAAA,GAC3B,EAAA,CAAC,WAAa,EAAA,MAAM,CAAC,CAAA;AACxB,EAAM,MAAA,qBAAA,GAAwB,YAAY,YAAY;AACpD,IAAI,IAAA,CAAC,mBAAmB,WAAa,EAAA;AACrC,IAAI,IAAA;AACF,MAAA,mBAAA,CAAoB,IAAI,CAAA;AACxB,MAAM,MAAA,SAAA,GAAY,MAAM,eAAA,CAAgB,aAAa,CAAA;AACrD,MAAM,MAAA,WAAA,CAAY,eAAiB,EAAA,KAAA,CAAA,EAAW,SAAS,CAAA;AAAA,aAChD,KAAO,EAAA;AACd,MAAQ,OAAA,CAAA,KAAA,CAAM,6CAA6C,KAAK,CAAA;AAAA,KAChE,SAAA;AACA,MAAA,mBAAA,CAAoB,KAAK,CAAA;AAAA;AAC3B,KACC,CAAC,eAAA,EAAiB,WAAa,EAAA,eAAA,EAAiB,WAAW,CAAC,CAAA;AAC/D,EAAA,SAAA,CAAU,MAAM;AACd,IAAA,IAAI,CAAC,eAAA,IAAmB,WAAe,IAAA,CAAC,sBAAwB,EAAA;AAChE,IAAqB,oBAAA,CAAA,oBAAA,CAAqB,sBAAsB,CAAC,CAAA;AACjE,IAAqB,oBAAA,CAAA,wBAAA,CAAyB,sBAAsB,CAAC,CAAA;AAAA,GACpE,EAAA,CAAC,eAAiB,EAAA,WAAA,EAAa,sBAAsB,CAAC,CAAA;AACzD,EAAA,SAAA,CAAU,MAAM;AACd,IAAI,IAAA,QAAA,CAAS,OAAO,KAAO,EAAA;AACzB,MAAA,MAAM,QAAW,GAAA,QAAA,CAAS,WAAY,CAAA,yBAAA,EAA2B,CAAM,KAAA,KAAA;AAzd7E,QAAA,IAAAH,GAAAE,EAAAA,GAAAA;AAydgF,QAAkBA,OAAAA,iBAAAA,CAAAA,CAAAA,GAAAA,GAAAA,CAAAF,MAAA,KAAM,CAAA,cAAA,KAAN,gBAAAA,GAAsB,CAAA,MAAA,KAAtB,IAAAE,GAAAA,GAAAA,GAAgC,CAAC,CAAA;AAAA,OAAC,CAAA;AAC9H,MAAA,MAAME,QAAU,GAAA,QAAA,CAAS,WAAY,CAAA,kBAAA,EAAoB,CAAM,KAAA,KAAA;AA1drE,QAAA,IAAAJ,GAAAE,EAAAA,GAAAA;AA0dwE,QAAkBA,OAAAA,iBAAAA,CAAAA,CAAAA,GAAAA,GAAAA,CAAAF,MAAA,KAAM,CAAA,cAAA,KAAN,gBAAAA,GAAsB,CAAA,MAAA,KAAtB,IAAAE,GAAAA,GAAAA,GAAgC,CAAC,CAAA;AAAA,OAAC,CAAA;AACtH,MAAA,MAAMG,WAAU,QAAS,CAAA,WAAA,CAAY,oBAAoB,MAAM,iBAAA,CAAkB,CAAC,CAAC,CAAA;AACnF,MAAA,OAAO,MAAM;AACX,QAAA,QAAA,CAAS,MAAO,EAAA;AAChB,QAAAD,SAAQ,MAAO,EAAA;AACf,QAAAC,SAAQ,MAAO,EAAA;AAAA,OACjB;AAAA;AAEF,IAAA,MAAM,OAAU,GAAA,QAAA,CAAS,WAAY,CAAA,iBAAA,EAAmB,CAAM,KAAA,KAAA;AAlelE,MAAA,IAAAL,GAAAE,EAAAA,GAAAA;AAkeqE,MAAkBA,OAAAA,iBAAAA,CAAAA,CAAAA,GAAAA,GAAAA,CAAAF,MAAA,KAAM,CAAA,cAAA,KAAN,gBAAAA,GAAsB,CAAA,MAAA,KAAtB,IAAAE,GAAAA,GAAAA,GAAgC,CAAC,CAAA;AAAA,KAAC,CAAA;AACrH,IAAA,MAAM,UAAU,QAAS,CAAA,WAAA,CAAY,mBAAmB,MAAM,iBAAA,CAAkB,CAAC,CAAC,CAAA;AAClF,IAAA,OAAO,MAAM;AACX,MAAA,OAAA,CAAQ,MAAO,EAAA;AACf,MAAA,OAAA,CAAQ,MAAO,EAAA;AAAA,KACjB;AAAA,GACF,EAAG,EAAE,CAAA;AACL,EAAM,MAAA,oBAAA,GAAuB,IAAK,CAAA,GAAA,CAAI,CAAG,EAAA,cAAA,GAAiB,MAAO,CAAA,MAAA,IAAU,QAAS,CAAA,EAAA,KAAO,KAAQ,GAAA,8BAAA,GAAiC,CAAE,CAAA,CAAA;AACtI,EAAA,MAAM,2BAA8B,GAAA,0BAAA;AACpC,EAAO,uBAAA,IAAA,CAAC,gBAAa,KAAO,EAAA,CAAC,QAAQ,OAAS,EAAA,QAAQ,GAAG,KAAO,EAAA;AAAA,IAC9D,IAAM,EAAA,CAAA;AAAA,IACN,eAAiB,EAAA;AAAA,GAET,EAAA,QAAA,EAAA;AAAA,oBAAA,GAAA,CAAC,wBAAyB,EAAA,EAAA,OAAA,EAAS,QAAS,CAAA,OAAA,EAAS,UAAY,EAAA,KAAA,EAC7D,QAAC,kBAAA,IAAA,CAAA,GAAA,EAAA,EAAI,IAAM,EAAA,CAAA,EAAG,KAAM,EAAA,MAAA,EAAO,UAAS,UAC9B,EAAA,QAAA,EAAA;AAAA,MAAA,CAAA,SAAA,IAAa,MAAO,CAAA,KAAA,qBAAW,GAAA,CAAA,GAAA,EAAA,EAAI,EAAG,EAAA,IAAA,EAAK,EAAG,EAAA,IAAA,EAAK,CAAE,EAAA,IAAA,EAAK,YAAa,EAAA,KAAA,EAAM,KAAO,EAAA;AAAA,QAChG,eAAA,EAAiB,SAAS,SAAY,GAAA,SAAA;AAAA,QACtC,WAAa,EAAA,CAAA;AAAA,QACb,WAAA,EAAa,SAAS,SAAY,GAAA;AAAA,OAEhB,EAAA,QAAA,kBAAA,GAAA,CAAC,IAAK,EAAA,EAAA,QAAA,EAAS,OAAM,KAAO,EAAA;AAAA,QAC5C,KAAA,EAAO,SAAS,SAAY,GAAA;AAAA,OAEP,EAAA,QAAA,EAAA,SAAA,IAAa,MAAO,CAAA,KAAA,EACzB,CACJ,EAAA,CAAA;AAAA,MACH,eAAkB,mBAAA,GAAA,CAAC,kBAAmB,EAAA,EAAA,eAAA,EAAiB,CAAa,SAAA,KAAA;AAC/E,QAAA,kBAAA,CAAmB,KAAK,CAAA;AACxB,QAAA,kBAAA,CAAmB,SAAS,CAAA;AAC5B,QAAA,aAAA,CAAc,MAAM,CAAA;AAAA,OACtB,EAAG,WAAW,MAAM;AAClB,QAAA,kBAAA,CAAmB,KAAK,CAAA;AACxB,QAAA,kBAAA,CAAmB,IAAI,CAAA;AACvB,QAAA,QAAA,CAAS,EAAE,CAAA;AACX,QAAc,aAAA,EAAA;AAAA,OAChB,EAAG,IAAK,WAAe,IAAA,QAAA,uBAAY,GAAI,EAAA,EAAA,IAAA,EAAM,CAAG,EAAA,KAAA,EAAM,MAAO,EAAA,SAAA,EAAU,WACnD,QAAC,kBAAA,GAAA,CAAA,mBAAA,EAAA,EAAoB,MAAK,MAAO,EAAA,cAAA,EAAgB,OAAO,WAAa,EAAA,aAAA,EAAe,UAAU,EAAA,IAAA,EAAC,sBAAwB,EAAA;AAAA,QACvI,iBAAmB,EAAA,CAAA;AAAA,QACnB,UAAY,EAAA,CAAA;AAAA,QACZ,aAAe,EAAA,2BAAA;AAAA,QACf,MAAQ,EAAA,CAAA;AAAA,QACR,SAAW,EAAA,CAAA;AAAA,QACX,SAAW,EAAA,QAAA;AAAA,QACX,KAAO,EAAA;AAAA,SACN,gBAAkB,EAAA;AAAA,QACnB,UAAY,EAAA,CAAA;AAAA,QACZ,aAAe,EAAA,2BAAA;AAAA,QACf,MAAQ,EAAA,CAAA;AAAA,QACR,SAAW,EAAA,CAAA;AAAA,QACX,KAAO,EAAA,eAAA;AAAA,QACP,SAAW,EAAA;AAAA,SACV,QAAU,EAAA,QAAA,CAAS,GAAI,CAAA,CAAC,KAAK,KAAW,MAAA;AAAA,QACzC,EAAI,EAAA,CAAA,IAAA,EAAO,KAAK,CAAA,CAAA,EAAI,IAAI,IAAI,CAAA,CAAA;AAAA,QAC5B,MAAM,GAAI,CAAA,IAAA;AAAA,QACV,SAAS,GAAI,CAAA,OAAA;AAAA,QACb,UAAU,GAAI,CAAA;AAAA,OACd,CAAA,CAAA,EAAG,gBAAkB,EAAA,QAAA,EAAU,WAAa,EAAA;AAAA,QAC5C,EAAI,EAAA;AAAA,OACH,EAAA,MAAA,EAAQ,iBAAmB,EAAA,QAAA,EAAU,SAAa,IAAA,QAAA,EAAU,SAAsB,EAAA,MAAA,EAAQ,WAAc,GAAA,MAAA,GAAS,MAAQ,EAAA,sBAAA,EAAwB,MAAM,IAAA,EAAM,uBAAyB,EAAA,MAAM,IAAM,EAAA,CAAA,EACvL,CAAS,mBAAA,GAAA,CAAC,GAAI,EAAA,EAAA,IAAA,EAAM,CAAG,EAAA,KAAA,EAAM,MACzB,EAAA,QAAA,kBAAA,IAAA,CAAC,IAAK,EAAA,EAAA,KAAA,EAAO,OAAO,oBAChB,EAAA,QAAA,EAAA;AAAA,wBAAA,GAAA,CAAC,IAAK,EAAA,EAAA,KAAA,EAAO,CAAC,MAAA,CAAO,YAAc,EAAA;AAAA,UACrD,KAAO,EAAA;AAAA,SACR,GAAG,QAEgB,EAAA,kBAAA,EAAA,CAAA;AAAA,wBACC,IAAA,CAAA,IAAA,EAAA,EAAK,KAAO,EAAA,CAAC,OAAO,gBAAkB,EAAA;AAAA,UACzD,eAAA,EAAiB,SAAS,uBAA0B,GAAA,SAAA;AAAA,UACpD,WAAA,EAAa,SAAS,2BAA8B,GAAA;AAAA,SACrD,CACuB,EAAA,QAAA,EAAA;AAAA,0BAAA,IAAA,CAAC,SAAU,EAAA,EAAA,OAAA,EAAS,MAAM,gBAAA,CAAiB,MAAM,CAAG,EAAA,KAAA,EAAO,CAAC,MAAA,CAAO,eAAe,UAAe,KAAA,MAAA,IAAU,MAAO,CAAA,mBAAA,EAAqB,eAAe,MAAU,IAAA;AAAA,YACpL,eAAA,EAAiB,SAAS,SAAY,GAAA;AAAA,WACvC,CAAA,EAAG,iBAAkB,EAAA,QAAA,EAAS,oBAAmB,qBACxB,EAAA,QAAA,EAAA;AAAA,4BAAC,GAAA,CAAA,sBAAA,EAAA,EAAuB,MAAK,SAAU,EAAA,IAAA,EAAM,IAAI,KAAO,EAAA,UAAA,KAAe,MAAS,GAAA,SAAA,GAAY,kBAAoB,EAAA,CAAA;AAAA,4BAC/G,GAAA,CAAA,IAAA,EAAA,EAAK,KAAO,EAAA,CAAC,OAAO,kBAAoB,EAAA;AAAA,cAC/D,KAAA,EAAO,UAAe,KAAA,MAAA,GAAS,SAAY,GAAA;AAAA,aAC5C,GAAG,QAEoB,EAAA,MAAA,EAAA;AAAA,WACJ,EAAA,CAAA;AAAA,+BACC,SAAU,EAAA,EAAA,OAAA,EAAS,MAAM,gBAAA,CAAiB,aAAa,CAAG,EAAA,KAAA,EAAO,CAAC,MAAA,CAAO,eAAe,UAAe,KAAA,aAAA,IAAiB,MAAO,CAAA,mBAAA,EAAqB,eAAe,aAAiB,IAAA;AAAA,YACzM,eAAA,EAAiB,SAAS,SAAY,GAAA;AAAA,WACvC,CAAA,EAAG,iBAAkB,EAAA,QAAA,EAAS,oBAAmB,4BACxB,EAAA,QAAA,EAAA;AAAA,4BAAC,GAAA,CAAA,sBAAA,EAAA,EAAuB,MAAK,wBAAyB,EAAA,IAAA,EAAM,IAAI,KAAO,EAAA,UAAA,KAAe,aAAgB,GAAA,SAAA,GAAY,kBAAoB,EAAA,CAAA;AAAA,4BACrI,GAAA,CAAA,IAAA,EAAA,EAAK,KAAO,EAAA,CAAC,OAAO,kBAAoB,EAAA;AAAA,cAC/D,KAAA,EAAO,UAAe,KAAA,aAAA,GAAgB,SAAY,GAAA;AAAA,aACnD,GAAG,QAEoB,EAAA,aAAA,EAAA;AAAA,WACJ,EAAA;AAAA,SACJ,EAAA,CAAA;AAAA,wBACC,GAAA,CAAA,IAAA,EAAA,EAAK,KAAO,EAAA,CAAC,OAAO,gBAAkB,EAAA;AAAA,UACzD,KAAO,EAAA;AAAA,SACR,GAAG,QAEgB,EAAA,2BAAA,EAAA,CAAA;AAAA,wBACC,GAAA,CAAA,IAAA,EAAA,EAAK,KAAO,EAAA,CAAC,OAAO,aAAe,EAAA;AAAA,UACtD,KAAO,EAAA;AAAA,SACR,GAAG,QAEgB,EAAA,gFAAA,EAAA;AAAA,OAAA,EACJ,CACJ,EAAA,CAAA;AAAA,MACH,CAAC,eAAkB,mBAAA,GAAA,CAAC,QAAK,KAAO,EAAA,CAAC,OAAO,kBAAoB,EAAA;AAAA,QACvE,eAAe,IAAK,CAAA,GAAA,CAAI,OAAO,MAAS,GAAA,CAAA,EAAG,CAAC,CAAI,GAAA,oBAAA;AAAA,QAChD,eAAiB,EAAA,qBAAA;AAAA,QACjB,cAAgB,EAAA;AAAA,OACjB,CACmB,EAAA,QAAA,kBAAA,GAAA,CAAC,QAAK,KAAO,EAAA,CAAC,OAAO,mBAAqB,EAAA;AAAA,QAC1D,KAAO,EAAA;AAAA,OACR,CAAA,EACqB,QAAC,kBAAA,GAAA,CAAA,YAAA,EAAA,EAAa,WAAa,EAAA;AAAA,QAC7C,KAAA;AAAA,QACA,QAAU,EAAA,CAAA,CAAA,KAAK,QAAS,CAAA,CAAA,CAAE,YAAY,IAAI,CAAA;AAAA,QAC1C,WAAa,EAAA,gBAAA;AAAA,QACb,UAAU,SAAa,IAAA;AAAA,SACtB,SAAsB,EAAA,UAAA,EAAwB,gBAAgB,IAAM,EAAA,mBAAA,EAAqB,MAAM,aAAe,EAAA;AAAA,QAC/G,UAAY,EAAA,SAAA;AAAA,QACZ,MAAA,EAAQ,MAAM,YAAa,EAAA;AAAA,QAC3B,KAAO,EAAA,MAAM,OAAQ,CAAA,GAAA,CAAI,KAAK,CAAA;AAAA,QAC9B,UAAU,SAAa,IAAA,QAAA;AAAA,QACvB,SAAA;AAAA,QACA,MAAA,EAAQ,cAAc,MAAS,GAAA;AAAA,OACjC,EAAG,CACa,EAAA,CAAA,EACJ,CAAU,GAAA,IAAA;AAAA,MACb,iBAAA,uBAAqB,IAAK,EAAA,EAAA,aAAA,EAAc,QAAO,KAAO,EAAA,4BAAA,GAA+B,CAAC,MAAA,CAAO,0BAA4B,EAAA;AAAA,QACpI,QAAQ,IAAK,CAAA,GAAA,CAAI,MAAO,CAAA,MAAA,EAAQ,EAAE,CAAI,GAAA;AAAA,OACvC,IAAI,MAAO,CAAA,uBAAA,EACQ,8BAAC,iBAAkB,EAAA,EAAA,IAAA,EAAM,0BAA4B,EAAA,CAAA,EACzD,CAAU,GAAA;AAAA,KAAA,EAClB,CACJ,EAAA,CAAA;AAAA,oBACC,GAAA,CAAA,eAAA,EAAA,EAAgB,OAAS,EAAA,qBAAA,EAAuB,KAAO,EAAA,eAAA,EAAiB,WAAa,EAAA,2BAAA,EAA6B,OAAS,EAAA,iBAAA,EAAmB,WAA0B,EAAA,mBAAA,EAA0C,oBAA4C,EAAA,uBAAA,EAAyB,MAAM,sBAAA,CAAuB,CAAQ,IAAA,KAAA,CAAC,IAAI,CAAA,EAAG,wBAA0B,EAAA,MAAM,uBAAwB,CAAA,CAAA,IAAA,KAAQ,CAAC,IAAI,CAAG,EAAA,OAAA,EAAS,MAAM;AACla,MAAA,KAAK,qBAAsB,EAAA;AAAA,KAC1B,EAAA,MAAA,EAAQ,MAAQ,EAAA,OAAA,EAAS,qBAAuB,EAAA;AAAA,GAC/C,EAAA,CAAA;AACR;AACA,MAAM,MAAA,GAAS,WAAW,MAAO,CAAA;AAAA;AAAA,EAE/B,uBAAyB,EAAA;AAAA,IACvB,QAAU,EAAA,UAAA;AAAA,IACV,IAAM,EAAA,CAAA;AAAA,IACN,KAAO,EAAA,CAAA;AAAA,IACP,GAAK,EAAA,CAAA;AAAA,IACL,MAAQ,EAAA,CAAA;AAAA,IACR,cAAgB,EAAA,QAAA;AAAA,IAChB,UAAY,EAAA,QAAA;AAAA,IACZ,MAAQ,EAAA;AAAA,GACV;AAAA;AAAA,EAEA,0BAA4B,EAAA;AAAA,IAC1B,QAAU,EAAA,UAAA;AAAA,IACV,IAAM,EAAA,CAAA;AAAA,IACN,KAAO,EAAA,CAAA;AAAA,IACP,UAAY,EAAA,QAAA;AAAA,IACZ,cAAgB,EAAA,UAAA;AAAA,IAChB,aAAe,EAAA,CAAA;AAAA,IACf,MAAQ,EAAA;AAAA,GACV;AAAA,EACA,WAAa,EAAA;AAAA,IACX,aAAe,EAAA,KAAA;AAAA,IACf,UAAY,EAAA,QAAA;AAAA,IACZ,WAAa,EAAA,CAAA;AAAA,IACb,GAAK,EAAA;AAAA,GACP;AAAA,EACA,mBAAqB,EAAA;AAAA,IACnB,gBAAkB,EAAA,CAAA;AAAA,IAClB,OAAS,EAAA,CAAA;AAAA,IACT,YAAc,EAAA;AAAA,GAChB;AAAA,EACA,0BAA4B,EAAA;AAAA,IAC1B,OAAS,EAAA;AAAA,GACX;AAAA,EACA,wBAA0B,EAAA;AAAA,IACxB,KAAO,EAAA,EAAA;AAAA,IACP,MAAQ,EAAA,EAAA;AAAA,IACR,YAAc,EAAA,EAAA;AAAA,IACd,UAAY,EAAA,QAAA;AAAA,IACZ,cAAgB,EAAA,QAAA;AAAA,IAChB,eAAA,EAAiB,aAAa,KAAM,CAAA,WAAA;AAAA,IACpC,aAAa,UAAW,CAAA,aAAA;AAAA,IACxB,WAAA,EAAa,aAAa,KAAM,CAAA,aAAA;AAAA,IAChC,WAAa,EAAA,SAAA;AAAA,IACb,aAAe,EAAA,GAAA;AAAA,IACf,YAAc,EAAA,CAAA;AAAA,IACd,YAAc,EAAA;AAAA,MACZ,KAAO,EAAA,CAAA;AAAA,MACP,MAAQ,EAAA;AAAA,KACV;AAAA,IACA,SAAW,EAAA;AAAA,GACb;AAAA,EACA,4BAA8B,EAAA;AAAA,IAC5B,eAAiB,EAAA,SAAA;AAAA,IACjB,WAAa,EAAA,2BAAA;AAAA,IACb,WAAa,EAAA;AAAA,GACf;AAAA,EACA,aAAe,EAAA;AAAA,IACb,OAAS,EAAA,CAAA;AAAA,IACT,UAAY,EAAA,QAAA;AAAA,IACZ,cAAgB,EAAA,QAAA;AAAA,IAChB,YAAc,EAAA;AAAA,GAChB;AAAA,EACA,kBAAoB,EAAA;AAAA,IAClB,KAAO,EAAA,EAAA;AAAA,IACP,MAAQ,EAAA,EAAA;AAAA,IACR,YAAc,EAAA,EAAA;AAAA,IACd,UAAY,EAAA,QAAA;AAAA,IACZ,cAAgB,EAAA,QAAA;AAAA,IAChB,eAAA,EAAiB,aAAa,KAAM,CAAA,OAAA;AAAA,IACpC,WAAa,EAAA,CAAA;AAAA,IACb,WAAA,EAAa,aAAa,KAAM,CAAA,MAAA;AAAA,IAChC,WAAa,EAAA,SAAA;AAAA,IACb,aAAe,EAAA,IAAA;AAAA,IACf,YAAc,EAAA,CAAA;AAAA,IACd,YAAc,EAAA;AAAA,MACZ,KAAO,EAAA,CAAA;AAAA,MACP,MAAQ,EAAA;AAAA,KACV;AAAA,IACA,SAAW,EAAA;AAAA,GACb;AAAA,EACA,sBAAwB,EAAA;AAAA,IACtB,eAAiB,EAAA,SAAA;AAAA,IACjB,WAAa,EAAA;AAAA,GACf;AAAA,EACA,UAAY,EAAA;AAAA,IACV,UAAY,EAAA,CAAA;AAAA,IACZ,KAAO,EAAA,EAAA;AAAA,IACP,MAAQ,EAAA,EAAA;AAAA,IACR,YAAc,EAAA,EAAA;AAAA,IACd,UAAY,EAAA,QAAA;AAAA,IACZ,cAAgB,EAAA,QAAA;AAAA,IAChB,eAAiB,EAAA;AAAA,GACnB;AAAA,EACA,oBAAsB,EAAA;AAAA,IACpB,OAAS,EAAA;AAAA,GACX;AAAA,EACA,oBAAsB,EAAA;AAAA,IACpB,IAAM,EAAA,CAAA;AAAA,IACN,UAAY,EAAA,QAAA;AAAA,IACZ,cAAgB,EAAA,YAAA;AAAA,IAChB,iBAAmB,EAAA,EAAA;AAAA,IACnB,UAAY,EAAA,EAAA;AAAA,IACZ,aAAe,EAAA,EAAA;AAAA,IACf,QAAU,EAAA,GAAA;AAAA,IACV,SAAW,EAAA;AAAA,GACb;AAAA,EACA,YAAc,EAAA;AAAA,IACZ,QAAU,EAAA,EAAA;AAAA,IACV,UAAY,EAAA,KAAA;AAAA,IACZ,aAAe,EAAA,GAAA;AAAA,IACf,aAAe,EAAA,WAAA;AAAA,IACf,YAAc,EAAA;AAAA,GAChB;AAAA,EACA,gBAAkB,EAAA;AAAA,IAChB,SAAW,EAAA,CAAA;AAAA,IACX,QAAU,EAAA,EAAA;AAAA,IACV,UAAY,EAAA,KAAA;AAAA,IACZ,SAAW,EAAA,QAAA;AAAA,IACX,aAAe,EAAA;AAAA,GACjB;AAAA,EACA,aAAe,EAAA;AAAA,IACb,SAAW,EAAA,EAAA;AAAA,IACX,QAAU,EAAA,EAAA;AAAA,IACV,UAAY,EAAA,EAAA;AAAA,IACZ,SAAW,EAAA,QAAA;AAAA,IACX,iBAAmB,EAAA,EAAA;AAAA,IACnB,QAAU,EAAA;AAAA,GACZ;AAAA,EACA,kBAAoB,EAAA;AAAA,IAClB,QAAU,EAAA,UAAA;AAAA,IACV,IAAM,EAAA,CAAA;AAAA,IACN,KAAO,EAAA,CAAA;AAAA,IACP,MAAQ,EAAA,CAAA;AAAA,IACR,UAAY,EAAA,QAAA;AAAA,IACZ,cAAgB,EAAA,UAAA;AAAA,IAChB,cAAgB,EAAA,CAAA;AAAA,IAChB,WAAa,EAAA,SAAA;AAAA,IACb,aAAe,EAAA,IAAA;AAAA,IACf,YAAc,EAAA,CAAA;AAAA,IACd,YAAc,EAAA;AAAA,MACZ,KAAO,EAAA,CAAA;AAAA,MACP,MAAQ,EAAA;AAAA,KACV;AAAA,IACA,SAAW,EAAA;AAAA,GACb;AAAA,EACA,mBAAqB,EAAA;AAAA,IACnB,iBAAmB,EAAA,EAAA;AAAA,IACnB,UAAY,EAAA,EAAA;AAAA,IACZ,aAAe,EAAA;AAAA,GACjB;AAAA,EACA,gBAAkB,EAAA;AAAA,IAChB,aAAe,EAAA,KAAA;AAAA,IACf,UAAY,EAAA,QAAA;AAAA,IACZ,GAAK,EAAA,CAAA;AAAA,IACL,YAAc,EAAA,EAAA;AAAA,IACd,YAAc,EAAA,EAAA;AAAA,IACd,OAAS,EAAA,CAAA;AAAA,IACT,WAAa,EAAA,CAAA;AAAA,IACb,WAAa,EAAA,SAAA;AAAA,IACb,aAAe,EAAA,IAAA;AAAA,IACf,YAAc,EAAA,CAAA;AAAA,IACd,YAAc,EAAA;AAAA,MACZ,KAAO,EAAA,CAAA;AAAA,MACP,MAAQ,EAAA;AAAA,KACV;AAAA,IACA,SAAW,EAAA;AAAA,GACb;AAAA,EACA,aAAe,EAAA;AAAA,IACb,aAAe,EAAA,KAAA;AAAA,IACf,UAAY,EAAA,QAAA;AAAA,IACZ,GAAK,EAAA,CAAA;AAAA,IACL,iBAAmB,EAAA,EAAA;AAAA,IACnB,eAAiB,EAAA,CAAA;AAAA,IACjB,YAAc,EAAA;AAAA,GAChB;AAAA,EACA,mBAAqB,EAAA;AAAA,IACnB,WAAa,EAAA,SAAA;AAAA,IACb,aAAe,EAAA,IAAA;AAAA,IACf,YAAc,EAAA,CAAA;AAAA,IACd,YAAc,EAAA;AAAA,MACZ,KAAO,EAAA,CAAA;AAAA,MACP,MAAQ,EAAA;AAAA,KACV;AAAA,IACA,SAAW,EAAA;AAAA,GACb;AAAA,EACA,kBAAoB,EAAA;AAAA,IAClB,QAAU,EAAA,EAAA;AAAA,IACV,UAAY,EAAA;AAAA;AAEhB,CAAC,CAAA;AACD,MAAM,UAAkC,GAAA,CAAA,KAAA,qBAAU,GAAA,CAAA,iBAAA,EAAA,cAAA,CAAA,EAAA,EAAsB,KAAO,CAAA"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {jsxs,jsx}from'react/jsx-runtime';import React from'react';import {View,StyleSheet,ScrollView,Pressable}from'react-native';import {MaterialCommunityIcons}from'@expo/vector-icons';import {Text}from'@admin-layout/gluestack-ui-mobile';import {RoomType}from'common';import {useApolloClient}from'@apollo/client/index.js';import {AI_ASSISTANT_CHANNELS_QUERY_VARS}from'../../../hooks/useChatApi.js';import {useGetChannelsByUserWithLastMessageQuery,MessagesDocument}from'common/graphql';import {YantraBrandLoader}from'../../../components/YantraBrandLoader.js';const MESSAGES_PER_CHANNEL = 200;
|
|
1
|
+
import {jsxs,jsx}from'react/jsx-runtime';import React from'react';import {useWindowDimensions,View,StyleSheet,ScrollView,Pressable}from'react-native';import {MaterialCommunityIcons}from'@expo/vector-icons';import {Text}from'@admin-layout/gluestack-ui-mobile';import {RoomType}from'common';import {useApolloClient}from'@apollo/client/index.js';import {AI_ASSISTANT_CHANNELS_QUERY_VARS}from'../../../hooks/useChatApi.js';import {useGetChannelsByUserWithLastMessageQuery,MessagesDocument}from'common/graphql';import {YantraBrandLoader}from'../../../components/YantraBrandLoader.js';import {mobileTokens}from'../../../theme/mobileTokens.js';const MESSAGES_PER_CHANNEL = 200;
|
|
2
2
|
function truncatePreview(text, max = 64) {
|
|
3
3
|
const cleaned = text.replace(/\s+/g, " ").trim();
|
|
4
4
|
if (cleaned.length <= max) return cleaned;
|
|
@@ -77,14 +77,23 @@ function ChatHistoryRow({
|
|
|
77
77
|
return /* @__PURE__ */ jsxs(Pressable, { onPress: () => onSelectSession(session.channelId), style: ({
|
|
78
78
|
pressed
|
|
79
79
|
}) => [styles.item, pressed && styles.itemPressed], children: [
|
|
80
|
-
/* @__PURE__ */
|
|
81
|
-
|
|
80
|
+
/* @__PURE__ */ jsxs(View, { style: styles.itemTop, children: [
|
|
81
|
+
/* @__PURE__ */ jsxs(View, { style: styles.rowTitleWrap, children: [
|
|
82
|
+
/* @__PURE__ */ jsx(View, { style: styles.rowIconWrap, children: /* @__PURE__ */ jsx(MaterialCommunityIcons, { name: "message-text-outline", size: 15, color: mobileTokens.color.primary }) }),
|
|
83
|
+
/* @__PURE__ */ jsx(Text, { style: styles.titleText, fontSize: "$lg", color: mobileTokens.color.text, fontWeight: "$semibold", numberOfLines: 1, children: session.title })
|
|
84
|
+
] }),
|
|
85
|
+
/* @__PURE__ */ jsx(MaterialCommunityIcons, { name: "chevron-right", size: 20, color: mobileTokens.color.textMuted })
|
|
86
|
+
] }),
|
|
87
|
+
/* @__PURE__ */ jsx(Text, { fontSize: "$sm", color: mobileTokens.color.textMuted, numberOfLines: 2, children: session.preview })
|
|
82
88
|
] }, session.id);
|
|
83
89
|
}
|
|
84
90
|
function ChatHistoryLanding({
|
|
85
91
|
onSelectSession,
|
|
86
92
|
onCompose
|
|
87
93
|
}) {
|
|
94
|
+
const {
|
|
95
|
+
width: screenWidth
|
|
96
|
+
} = useWindowDimensions();
|
|
88
97
|
const client = useApolloClient();
|
|
89
98
|
const {
|
|
90
99
|
data: channelsData,
|
|
@@ -143,8 +152,12 @@ function ChatHistoryLanding({
|
|
|
143
152
|
};
|
|
144
153
|
}, [channelsData, client]);
|
|
145
154
|
const loading = (channelsLoading || threadsLoading) && sessions.length === 0;
|
|
155
|
+
const contentMaxWidth = Math.min(760, Math.max(360, screenWidth - 24));
|
|
146
156
|
return /* @__PURE__ */ jsxs(View, { style: styles.container, children: [
|
|
147
|
-
/* @__PURE__ */ jsx(ScrollView, { style: styles.list, contentContainerStyle: styles.listContent,
|
|
157
|
+
/* @__PURE__ */ jsx(ScrollView, { style: styles.list, contentContainerStyle: [styles.listContent, {
|
|
158
|
+
alignSelf: "center",
|
|
159
|
+
width: contentMaxWidth
|
|
160
|
+
}], contentInsetAdjustmentBehavior: "never", automaticallyAdjustContentInsets: false, contentInset: {
|
|
148
161
|
top: 0,
|
|
149
162
|
left: 0,
|
|
150
163
|
bottom: 0,
|
|
@@ -158,24 +171,26 @@ function ChatHistoryLanding({
|
|
|
158
171
|
/* @__PURE__ */ jsx(Text, { fontSize: "$2xl", fontWeight: "$semibold", color: "$gray900", textAlign: "center", children: "What can I do for you?" }),
|
|
159
172
|
/* @__PURE__ */ jsx(Text, { fontSize: "$sm", color: "$gray600", textAlign: "center", children: "Ask anything to search and build with Yantra." })
|
|
160
173
|
] }) : sessions.map((session) => /* @__PURE__ */ jsx(ChatHistoryRow, { session, onSelectSession }, session.id)) }),
|
|
161
|
-
/* @__PURE__ */ jsx(Pressable, { onPress: onCompose, style: ({
|
|
174
|
+
/* @__PURE__ */ jsx(Pressable, { onPress: onCompose, hitSlop: 10, accessibilityRole: "button", accessibilityLabel: "Start new chat", style: ({
|
|
162
175
|
pressed
|
|
163
|
-
}) => [styles.fab,
|
|
176
|
+
}) => [styles.fab, {
|
|
177
|
+
right: Math.max((screenWidth - contentMaxWidth) / 2 + 18, 18)
|
|
178
|
+
}, pressed && styles.fabPressed], children: /* @__PURE__ */ jsx(MaterialCommunityIcons, { name: "plus", size: 28, color: mobileTokens.color.surface }) })
|
|
164
179
|
] });
|
|
165
180
|
}
|
|
166
181
|
const styles = StyleSheet.create({
|
|
167
182
|
container: {
|
|
168
183
|
flex: 1,
|
|
169
|
-
backgroundColor:
|
|
184
|
+
backgroundColor: mobileTokens.color.bg
|
|
170
185
|
},
|
|
171
186
|
list: {
|
|
172
187
|
flex: 1
|
|
173
188
|
},
|
|
174
189
|
listContent: {
|
|
175
190
|
paddingHorizontal: 16,
|
|
176
|
-
paddingTop:
|
|
191
|
+
paddingTop: 8,
|
|
177
192
|
paddingBottom: 100,
|
|
178
|
-
gap:
|
|
193
|
+
gap: 10
|
|
179
194
|
},
|
|
180
195
|
emptyStateWrap: {
|
|
181
196
|
flex: 1,
|
|
@@ -185,9 +200,12 @@ const styles = StyleSheet.create({
|
|
|
185
200
|
gap: 10
|
|
186
201
|
},
|
|
187
202
|
item: {
|
|
188
|
-
borderRadius:
|
|
189
|
-
paddingHorizontal:
|
|
190
|
-
paddingVertical: 14
|
|
203
|
+
borderRadius: 14,
|
|
204
|
+
paddingHorizontal: 14,
|
|
205
|
+
paddingVertical: 14,
|
|
206
|
+
backgroundColor: mobileTokens.color.surface,
|
|
207
|
+
borderWidth: 1,
|
|
208
|
+
borderColor: mobileTokens.color.border
|
|
191
209
|
},
|
|
192
210
|
itemTop: {
|
|
193
211
|
flexDirection: "row",
|
|
@@ -196,13 +214,29 @@ const styles = StyleSheet.create({
|
|
|
196
214
|
marginBottom: 4,
|
|
197
215
|
gap: 8
|
|
198
216
|
},
|
|
199
|
-
|
|
217
|
+
rowTitleWrap: {
|
|
218
|
+
flexDirection: "row",
|
|
219
|
+
alignItems: "center",
|
|
200
220
|
flex: 1,
|
|
201
221
|
minWidth: 0,
|
|
202
|
-
|
|
222
|
+
gap: 8
|
|
223
|
+
},
|
|
224
|
+
rowIconWrap: {
|
|
225
|
+
width: 24,
|
|
226
|
+
height: 24,
|
|
227
|
+
borderRadius: 12,
|
|
228
|
+
alignItems: "center",
|
|
229
|
+
justifyContent: "center",
|
|
230
|
+
backgroundColor: mobileTokens.color.primarySoft,
|
|
231
|
+
borderWidth: 1,
|
|
232
|
+
borderColor: mobileTokens.color.primaryBorder
|
|
233
|
+
},
|
|
234
|
+
titleText: {
|
|
235
|
+
flex: 1,
|
|
236
|
+
minWidth: 0
|
|
203
237
|
},
|
|
204
238
|
itemPressed: {
|
|
205
|
-
opacity: 0.
|
|
239
|
+
opacity: 0.82
|
|
206
240
|
},
|
|
207
241
|
fab: {
|
|
208
242
|
position: "absolute",
|
|
@@ -211,12 +245,14 @@ const styles = StyleSheet.create({
|
|
|
211
245
|
width: 56,
|
|
212
246
|
height: 56,
|
|
213
247
|
borderRadius: 28,
|
|
214
|
-
backgroundColor:
|
|
248
|
+
backgroundColor: mobileTokens.color.primary,
|
|
249
|
+
borderWidth: 1,
|
|
250
|
+
borderColor: mobileTokens.color.primaryBorder,
|
|
215
251
|
alignItems: "center",
|
|
216
252
|
justifyContent: "center",
|
|
217
|
-
shadowColor: "#
|
|
218
|
-
shadowOpacity: 0.
|
|
219
|
-
shadowRadius:
|
|
253
|
+
shadowColor: "#312e81",
|
|
254
|
+
shadowOpacity: 0.22,
|
|
255
|
+
shadowRadius: 10,
|
|
220
256
|
shadowOffset: {
|
|
221
257
|
width: 0,
|
|
222
258
|
height: 4
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ChatHistoryLanding.js","sources":["../../../../src/screens/Home/components/ChatHistoryLanding.tsx"],"sourcesContent":["import React from 'react';\nimport { Pressable, ScrollView, StyleSheet, View } from 'react-native';\nimport { MaterialCommunityIcons } from '@expo/vector-icons';\nimport { Text } from '@admin-layout/gluestack-ui-mobile';\nimport { RoomType } from 'common';\nimport { useApolloClient } from '@apollo/client';\nimport { AI_ASSISTANT_CHANNELS_QUERY_VARS } from '../../../hooks/useChatApi';\nimport { MessagesDocument, useGetChannelsByUserWithLastMessageQuery } from 'common/graphql';\nimport { YantraBrandLoader } from '../../../components/YantraBrandLoader';\n\ninterface ChatHistoryLandingProps {\n onSelectSession: (channelId: string) => void;\n onCompose: () => void;\n}\n\nconst MESSAGES_PER_CHANNEL = 200;\n\nfunction truncatePreview(text: string, max = 64): string {\n const cleaned = text.replace(/\\s+/g, ' ').trim();\n if (cleaned.length <= max) return cleaned;\n return `${cleaned.slice(0, max).trim()}...`;\n}\n\nfunction stripModelCostHeader(content: string): string {\n const normalized = content.replace(/\\r\\n/g, '\\n');\n return normalized.replace(\n /^\\s*(?:[^\\w\\n]+\\s*)?[a-z0-9][a-z0-9._-]*\\s*\\(\\s*\\$[\\d.]+\\s*\\/\\s*MTok\\s+in\\s*\\)\\s*\\n+/i,\n '',\n );\n}\n\nfunction getPostRole(post: any): string | undefined {\n return (\n post?.propsConfiguration?.content?.role ??\n post?.propsConfiguration?.contents?.role ??\n post?.props?.role ??\n undefined\n );\n}\n\nfunction sortPostsByTimeAsc(posts: any[]): any[] {\n return [...posts].sort((a, b) => {\n const ta = new Date(a?.createdAt ?? a?.updatedAt ?? 0).getTime();\n const tb = new Date(b?.createdAt ?? b?.updatedAt ?? 0).getTime();\n return ta - tb;\n });\n}\n\nfunction buildSessionsFromMessages(\n posts: any[],\n): Array<{ id: string; channelId: string; title: string; preview: string; sortAt: number }> {\n const sortedAsc = sortPostsByTimeAsc(posts);\n const rows: Array<{ id: string; channelId: string; title: string; preview: string; sortAt: number }> = [];\n const hasExplicitUserRole = sortedAsc.some((post) => String(getPostRole(post)).toUpperCase() === 'USER');\n\n for (let i = 0; i < sortedAsc.length; i++) {\n const current = sortedAsc[i];\n const role = getPostRole(current);\n if (hasExplicitUserRole && String(role).toUpperCase() !== 'USER') continue;\n\n const titleRaw = stripModelCostHeader(String(current?.message ?? '').trim()) || 'New Chat';\n let previewRaw = titleRaw;\n\n for (let j = i + 1; j < sortedAsc.length; j++) {\n const next = sortedAsc[j];\n const nextRole = getPostRole(next);\n if (String(nextRole).toUpperCase() === 'ASSISTANT') {\n previewRaw = stripModelCostHeader(String(next?.message ?? '').trim()) || titleRaw;\n break;\n }\n }\n\n const sessionChannelId = String(current?.channel?.id ?? current?.channel ?? '');\n if (!sessionChannelId) continue;\n\n rows.push({\n id: String(current?.id ?? `${sessionChannelId}-${i}`),\n channelId: sessionChannelId,\n title: truncatePreview(titleRaw, 44),\n preview: truncatePreview(previewRaw, 72),\n sortAt: new Date(current?.updatedAt ?? current?.createdAt ?? 0).getTime(),\n });\n }\n\n if (rows.length > 0) {\n return rows.reverse();\n }\n\n // Fallback for older rows where role metadata is absent:\n // show latest message per channel so history is never empty when posts exist.\n const fallbackRows: Array<{ id: string; channelId: string; title: string; preview: string; sortAt: number }> = [];\n const seenChannelIds = new Set<string>();\n for (let i = sortedAsc.length - 1; i >= 0; i--) {\n const post = sortedAsc[i];\n const sessionChannelId = String(post?.channel?.id ?? post?.channel ?? '');\n if (!sessionChannelId || seenChannelIds.has(sessionChannelId)) continue;\n seenChannelIds.add(sessionChannelId);\n\n const text = stripModelCostHeader(String(post?.message ?? '').trim()) || 'New Chat';\n fallbackRows.push({\n id: String(post?.id ?? `${sessionChannelId}-${i}`),\n channelId: sessionChannelId,\n title: truncatePreview(text, 44),\n preview: truncatePreview(text, 72),\n sortAt: new Date(post?.updatedAt ?? post?.createdAt ?? 0).getTime(),\n });\n }\n return fallbackRows;\n}\n\nfunction ChatHistoryRow({\n session,\n onSelectSession,\n}: {\n session: { id: string; channelId: string; title: string; preview: string; sortAt: number };\n onSelectSession: (channelId: string) => void;\n}) {\n return (\n <Pressable\n key={session.id}\n onPress={() => onSelectSession(session.channelId)}\n style={({ pressed }) => [styles.item, pressed && styles.itemPressed]}\n >\n <View style={styles.itemTop}>\n <Text style={styles.titleText} fontSize=\"$lg\" color=\"$gray900\" fontWeight=\"$semibold\" numberOfLines={1}>\n {session.title}\n </Text>\n </View>\n <Text fontSize=\"$sm\" color=\"$gray600\" numberOfLines={1}>\n {session.preview}\n </Text>\n </Pressable>\n );\n}\n\nexport default function ChatHistoryLanding({ onSelectSession, onCompose }: ChatHistoryLandingProps) {\n const client = useApolloClient();\n const { data: channelsData, loading: channelsLoading } = useGetChannelsByUserWithLastMessageQuery({\n variables: AI_ASSISTANT_CHANNELS_QUERY_VARS,\n fetchPolicy: 'cache-and-network',\n errorPolicy: 'all',\n notifyOnNetworkStatusChange: true,\n returnPartialData: true,\n context: { cacheKey: 'channels-list' },\n });\n\n const [sessions, setSessions] = React.useState<\n Array<{ id: string; channelId: string; title: string; preview: string; sortAt: number }>\n >([]);\n const [threadsLoading, setThreadsLoading] = React.useState(false);\n\n React.useEffect(() => {\n let mounted = true;\n const load = async () => {\n const channels = (channelsData?.channelsByUser ?? []).filter(\n (c): c is NonNullable<typeof c> => Boolean(c?.id) && (!c?.type || c.type === RoomType.Aiassistant),\n );\n if (channels.length === 0) {\n if (mounted) setSessions([]);\n return;\n }\n\n setThreadsLoading(true);\n try {\n const rowsByChannel = await Promise.all(\n channels.map(async (channel) => {\n const channelId = String(channel.id);\n const result = await client.query({\n query: MessagesDocument,\n variables: {\n channelId,\n parentId: null,\n limit: MESSAGES_PER_CHANNEL,\n skip: 0,\n },\n fetchPolicy: 'cache-first',\n context: { cacheKey: 'messages-list' },\n });\n return buildSessionsFromMessages(result?.data?.messages?.data ?? []);\n }),\n );\n if (!mounted) return;\n const merged = rowsByChannel\n .flat()\n .sort((a, b) => b.sortAt - a.sortAt)\n .slice(0, 200);\n setSessions(merged);\n } finally {\n if (mounted) setThreadsLoading(false);\n }\n };\n\n load();\n return () => {\n mounted = false;\n };\n }, [channelsData, client]);\n\n const loading = (channelsLoading || threadsLoading) && sessions.length === 0;\n\n return (\n <View style={styles.container}>\n <ScrollView\n style={styles.list}\n contentContainerStyle={styles.listContent}\n contentInsetAdjustmentBehavior=\"never\"\n automaticallyAdjustContentInsets={false}\n contentInset={{ top: 0, left: 0, bottom: 0, right: 0 }}\n scrollIndicatorInsets={{ top: 0, left: 0, bottom: 0, right: 0 }}\n >\n {loading ? (\n <View style={styles.emptyStateWrap}>\n <YantraBrandLoader />\n </View>\n ) : sessions.length === 0 ? (\n <View style={styles.emptyStateWrap}>\n <Text fontSize=\"$2xl\" fontWeight=\"$semibold\" color=\"$gray900\" textAlign=\"center\">\n What can I do for you?\n </Text>\n <Text fontSize=\"$sm\" color=\"$gray600\" textAlign=\"center\">\n Ask anything to search and build with Yantra.\n </Text>\n </View>\n ) : (\n sessions.map((session) => (\n <ChatHistoryRow key={session.id} session={session} onSelectSession={onSelectSession} />\n ))\n )}\n </ScrollView>\n <Pressable onPress={onCompose} style={({ pressed }) => [styles.fab, pressed && styles.fabPressed]}>\n <MaterialCommunityIcons name=\"plus\" size={28} color=\"#fff\" />\n </Pressable>\n </View>\n );\n}\n\nconst styles = StyleSheet.create({\n container: {\n flex: 1,\n backgroundColor: '#fff',\n },\n list: {\n flex: 1,\n },\n listContent: {\n paddingHorizontal: 16,\n paddingTop: 0,\n paddingBottom: 100,\n gap: 6,\n },\n emptyStateWrap: {\n flex: 1,\n minHeight: 420,\n alignItems: 'center',\n justifyContent: 'center',\n gap: 10,\n },\n item: {\n borderRadius: 10,\n paddingHorizontal: 12,\n paddingVertical: 14,\n },\n itemTop: {\n flexDirection: 'row',\n alignItems: 'center',\n justifyContent: 'space-between',\n marginBottom: 4,\n gap: 8,\n },\n titleText: {\n flex: 1,\n minWidth: 0,\n marginRight: 8,\n },\n itemPressed: {\n opacity: 0.75,\n },\n fab: {\n position: 'absolute',\n right: 18,\n bottom: 28,\n width: 56,\n height: 56,\n borderRadius: 28,\n backgroundColor: '#1f2937',\n alignItems: 'center',\n justifyContent: 'center',\n shadowColor: '#000',\n shadowOpacity: 0.18,\n shadowRadius: 8,\n shadowOffset: { width: 0, height: 4 },\n elevation: 6,\n },\n fabPressed: {\n opacity: 0.85,\n },\n});\n"],"names":["_a"],"mappings":"+iBAaA,MAAM,oBAAuB,GAAA,GAAA;AAC7B,SAAS,eAAA,CAAgB,IAAc,EAAA,GAAA,GAAM,EAAY,EAAA;AACvD,EAAA,MAAM,UAAU,IAAK,CAAA,OAAA,CAAQ,MAAQ,EAAA,GAAG,EAAE,IAAK,EAAA;AAC/C,EAAI,IAAA,OAAA,CAAQ,MAAU,IAAA,GAAA,EAAY,OAAA,OAAA;AAClC,EAAA,OAAO,GAAG,OAAQ,CAAA,KAAA,CAAM,GAAG,GAAG,CAAA,CAAE,MAAM,CAAA,GAAA,CAAA;AACxC;AACA,SAAS,qBAAqB,OAAyB,EAAA;AACrD,EAAA,MAAM,UAAa,GAAA,OAAA,CAAQ,OAAQ,CAAA,OAAA,EAAS,IAAI,CAAA;AAChD,EAAO,OAAA,UAAA,CAAW,OAAQ,CAAA,uFAAA,EAAyF,EAAE,CAAA;AACvH;AACA,SAAS,YAAY,IAA+B,EAAA;AAvBpD,EAAA,IAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA;AAwBE,EAAA,OAAA,CAAO,0DAAM,kBAAN,KAAA,IAAA,GAAA,MAAA,GAAA,EAAA,CAA0B,YAA1B,IAAmC,GAAA,MAAA,GAAA,EAAA,CAAA,IAAA,KAAnC,aAA2C,EAAM,GAAA,CAAA,EAAA,GAAA,IAAA,IAAA,IAAA,GAAA,MAAA,GAAA,IAAA,CAAA,kBAAA,KAAN,IAA0B,GAAA,MAAA,GAAA,EAAA,CAAA,QAAA,KAA1B,mBAAoC,IAA/E,KAAA,IAAA,GAAA,EAAA,GAAA,CAAuF,kCAAM,KAAN,KAAA,IAAA,GAAA,MAAA,GAAA,EAAA,CAAa,SAApG,IAA4G,GAAA,EAAA,GAAA,MAAA;AACrH;AACA,SAAS,mBAAmB,KAAqB,EAAA;AAC/C,EAAA,OAAO,CAAC,GAAG,KAAK,EAAE,IAAK,CAAA,CAAC,GAAG,CAAM,KAAA;AA3BnC,IAAA,IAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA;AA4BI,IAAM,MAAA,EAAA,GAAK,IAAI,IAAA,CAAA,CAAK,EAAG,GAAA,CAAA,EAAA,GAAA,CAAA,IAAA,IAAA,GAAA,MAAA,GAAA,CAAA,CAAA,SAAA,KAAH,IAAgB,GAAA,EAAA,GAAA,CAAA,IAAA,IAAA,GAAA,MAAA,GAAA,CAAA,CAAG,SAAnB,KAAA,IAAA,GAAA,EAAA,GAAgC,CAAC,CAAA,CAAE,OAAQ,EAAA;AAC/D,IAAM,MAAA,EAAA,GAAK,IAAI,IAAA,CAAA,CAAK,EAAG,GAAA,CAAA,EAAA,GAAA,CAAA,IAAA,IAAA,GAAA,MAAA,GAAA,CAAA,CAAA,SAAA,KAAH,IAAgB,GAAA,EAAA,GAAA,CAAA,IAAA,IAAA,GAAA,MAAA,GAAA,CAAA,CAAG,SAAnB,KAAA,IAAA,GAAA,EAAA,GAAgC,CAAC,CAAA,CAAE,OAAQ,EAAA;AAC/D,IAAA,OAAO,EAAK,GAAA,EAAA;AAAA,GACb,CAAA;AACH;AACA,SAAS,0BAA0B,KAMhC,EAAA;AAvCH,EAAA,IAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA;AAwCE,EAAM,MAAA,SAAA,GAAY,mBAAmB,KAAK,CAAA;AAC1C,EAAA,MAAM,OAMD,EAAC;AACN,EAAM,MAAA,mBAAA,GAAsB,SAAU,CAAA,IAAA,CAAK,CAAQ,IAAA,KAAA,MAAA,CAAO,WAAY,CAAA,IAAI,CAAC,CAAA,CAAE,WAAY,EAAA,KAAM,MAAM,CAAA;AACrG,EAAA,KAAA,IAAS,CAAI,GAAA,CAAA,EAAG,CAAI,GAAA,SAAA,CAAU,QAAQ,CAAK,EAAA,EAAA;AACzC,IAAM,MAAA,OAAA,GAAU,UAAU,CAAC,CAAA;AAC3B,IAAM,MAAA,IAAA,GAAO,YAAY,OAAO,CAAA;AAChC,IAAA,IAAI,uBAAuB,MAAO,CAAA,IAAI,CAAE,CAAA,WAAA,OAAkB,MAAQ,EAAA;AAClE,IAAM,MAAA,QAAA,GAAW,oBAAqB,CAAA,MAAA,CAAA,CAAO,EAAS,GAAA,OAAA,IAAA,IAAA,GAAA,MAAA,GAAA,OAAA,CAAA,OAAA,KAAT,YAAoB,EAAE,CAAA,CAAE,IAAK,EAAC,CAAK,IAAA,UAAA;AAChF,IAAA,IAAI,UAAa,GAAA,QAAA;AACjB,IAAA,KAAA,IAAS,IAAI,CAAI,GAAA,CAAA,EAAG,CAAI,GAAA,SAAA,CAAU,QAAQ,CAAK,EAAA,EAAA;AAC7C,MAAM,MAAA,IAAA,GAAO,UAAU,CAAC,CAAA;AACxB,MAAM,MAAA,QAAA,GAAW,YAAY,IAAI,CAAA;AACjC,MAAA,IAAI,MAAO,CAAA,QAAQ,CAAE,CAAA,WAAA,OAAkB,WAAa,EAAA;AAClD,QAAa,UAAA,GAAA,oBAAA,CAAqB,QAAO,EAAM,GAAA,IAAA,IAAA,IAAA,GAAA,MAAA,GAAA,IAAA,CAAA,OAAA,KAAN,YAAiB,EAAE,CAAA,CAAE,IAAK,EAAC,CAAK,IAAA,QAAA;AACzE,QAAA;AAAA;AACF;AAEF,IAAM,MAAA,gBAAA,GAAmB,MAAO,CAAA,CAAA,EAAA,GAAA,CAAA,EAAA,GAAA,CAAA,EAAA,GAAA,OAAA,IAAA,IAAA,GAAA,MAAA,GAAA,OAAA,CAAS,OAAT,KAAA,IAAA,GAAA,MAAA,GAAA,EAAA,CAAkB,OAAlB,IAAwB,GAAA,EAAA,GAAA,OAAA,IAAA,IAAA,GAAA,MAAA,GAAA,OAAA,CAAS,OAAjC,KAAA,IAAA,GAAA,EAAA,GAA4C,EAAE,CAAA;AAC9E,IAAA,IAAI,CAAC,gBAAkB,EAAA;AACvB,IAAA,IAAA,CAAK,IAAK,CAAA;AAAA,MACR,EAAA,EAAI,QAAO,EAAS,GAAA,OAAA,IAAA,IAAA,GAAA,MAAA,GAAA,OAAA,CAAA,EAAA,KAAT,YAAe,CAAG,EAAA,gBAAgB,CAAI,CAAA,EAAA,CAAC,CAAE,CAAA,CAAA;AAAA,MACpD,SAAW,EAAA,gBAAA;AAAA,MACX,KAAA,EAAO,eAAgB,CAAA,QAAA,EAAU,EAAE,CAAA;AAAA,MACnC,OAAA,EAAS,eAAgB,CAAA,UAAA,EAAY,EAAE,CAAA;AAAA,MACvC,MAAA,EAAQ,IAAI,IAAA,CAAA,CAAK,EAAS,GAAA,CAAA,EAAA,GAAA,OAAA,IAAA,IAAA,GAAA,MAAA,GAAA,OAAA,CAAA,SAAA,KAAT,IAAsB,GAAA,EAAA,GAAA,OAAA,IAAA,IAAA,GAAA,MAAA,GAAA,OAAA,CAAS,SAA/B,KAAA,IAAA,GAAA,EAAA,GAA4C,CAAC,CAAA,CAAE,OAAQ;AAAA,KACzE,CAAA;AAAA;AAEH,EAAI,IAAA,IAAA,CAAK,SAAS,CAAG,EAAA;AACnB,IAAA,OAAO,KAAK,OAAQ,EAAA;AAAA;AAKtB,EAAA,MAAM,eAMD,EAAC;AACN,EAAM,MAAA,cAAA,uBAAqB,GAAY,EAAA;AACvC,EAAA,KAAA,IAAS,IAAI,SAAU,CAAA,MAAA,GAAS,CAAG,EAAA,CAAA,IAAK,GAAG,CAAK,EAAA,EAAA;AAC9C,IAAM,MAAA,IAAA,GAAO,UAAU,CAAC,CAAA;AACxB,IAAM,MAAA,gBAAA,GAAmB,MAAO,CAAA,CAAA,EAAA,GAAA,CAAA,EAAA,GAAA,CAAA,EAAA,GAAA,IAAA,IAAA,IAAA,GAAA,MAAA,GAAA,IAAA,CAAM,OAAN,KAAA,IAAA,GAAA,MAAA,GAAA,EAAA,CAAe,OAAf,IAAqB,GAAA,EAAA,GAAA,IAAA,IAAA,IAAA,GAAA,MAAA,GAAA,IAAA,CAAM,OAA3B,KAAA,IAAA,GAAA,EAAA,GAAsC,EAAE,CAAA;AACxE,IAAA,IAAI,CAAC,gBAAA,IAAoB,cAAe,CAAA,GAAA,CAAI,gBAAgB,CAAG,EAAA;AAC/D,IAAA,cAAA,CAAe,IAAI,gBAAgB,CAAA;AACnC,IAAM,MAAA,IAAA,GAAO,oBAAqB,CAAA,MAAA,CAAA,CAAO,EAAM,GAAA,IAAA,IAAA,IAAA,GAAA,MAAA,GAAA,IAAA,CAAA,OAAA,KAAN,YAAiB,EAAE,CAAA,CAAE,IAAK,EAAC,CAAK,IAAA,UAAA;AACzE,IAAA,YAAA,CAAa,IAAK,CAAA;AAAA,MAChB,EAAA,EAAI,QAAO,EAAM,GAAA,IAAA,IAAA,IAAA,GAAA,MAAA,GAAA,IAAA,CAAA,EAAA,KAAN,YAAY,CAAG,EAAA,gBAAgB,CAAI,CAAA,EAAA,CAAC,CAAE,CAAA,CAAA;AAAA,MACjD,SAAW,EAAA,gBAAA;AAAA,MACX,KAAA,EAAO,eAAgB,CAAA,IAAA,EAAM,EAAE,CAAA;AAAA,MAC/B,OAAA,EAAS,eAAgB,CAAA,IAAA,EAAM,EAAE,CAAA;AAAA,MACjC,MAAA,EAAQ,IAAI,IAAA,CAAA,CAAK,EAAM,GAAA,CAAA,EAAA,GAAA,IAAA,IAAA,IAAA,GAAA,MAAA,GAAA,IAAA,CAAA,SAAA,KAAN,IAAmB,GAAA,EAAA,GAAA,IAAA,IAAA,IAAA,GAAA,MAAA,GAAA,IAAA,CAAM,SAAzB,KAAA,IAAA,GAAA,EAAA,GAAsC,CAAC,CAAA,CAAE,OAAQ;AAAA,KACnE,CAAA;AAAA;AAEH,EAAO,OAAA,YAAA;AACT;AACA,SAAS,cAAe,CAAA;AAAA,EACtB,OAAA;AAAA,EACA;AACF,CASG,EAAA;AACD,EAAO,uBAAA,IAAA,CAAC,aAA2B,OAAS,EAAA,MAAM,gBAAgB,OAAQ,CAAA,SAAS,CAAG,EAAA,KAAA,EAAO,CAAC;AAAA,IAC5F;AAAA,QACI,CAAC,MAAA,CAAO,MAAM,OAAW,IAAA,MAAA,CAAO,WAAW,CACvC,EAAA,QAAA,EAAA;AAAA,oBAAA,GAAA,CAAC,QAAK,KAAO,EAAA,MAAA,CAAO,SAChB,QAAC,kBAAA,GAAA,CAAA,IAAA,EAAA,EAAK,OAAO,MAAO,CAAA,SAAA,EAAW,UAAS,KAAM,EAAA,KAAA,EAAM,YAAW,UAAW,EAAA,WAAA,EAAY,eAAe,CAChG,EAAA,QAAA,EAAA,OAAA,CAAQ,OACb,CACJ,EAAA,CAAA;AAAA,oBACA,GAAA,CAAC,QAAK,QAAS,EAAA,KAAA,EAAM,OAAM,UAAW,EAAA,aAAA,EAAe,CAChD,EAAA,QAAA,EAAA,OAAA,CAAQ,OACb,EAAA;AAAA,GAAA,EAAA,EAVa,QAAQ,EAWzB,CAAA;AACR;AACA,SAAwB,kBAAmB,CAAA;AAAA,EACzC,eAAA;AAAA,EACA;AACF,CAA4B,EAAA;AAC1B,EAAA,MAAM,SAAS,eAAgB,EAAA;AAC/B,EAAM,MAAA;AAAA,IACJ,IAAM,EAAA,YAAA;AAAA,IACN,OAAS,EAAA;AAAA,MACP,wCAAyC,CAAA;AAAA,IAC3C,SAAW,EAAA,gCAAA;AAAA,IACX,WAAa,EAAA,mBAAA;AAAA,IACb,WAAa,EAAA,KAAA;AAAA,IACb,2BAA6B,EAAA,IAAA;AAAA,IAC7B,iBAAmB,EAAA,IAAA;AAAA,IACnB,OAAS,EAAA;AAAA,MACP,QAAU,EAAA;AAAA;AACZ,GACD,CAAA;AACD,EAAA,MAAM,CAAC,QAAU,EAAA,WAAW,IAAI,KAAM,CAAA,QAAA,CAMlC,EAAE,CAAA;AACN,EAAA,MAAM,CAAC,cAAgB,EAAA,iBAAiB,CAAI,GAAA,KAAA,CAAM,SAAS,KAAK,CAAA;AAChE,EAAA,KAAA,CAAM,UAAU,MAAM;AACpB,IAAA,IAAI,OAAU,GAAA,IAAA;AACd,IAAA,MAAM,OAAO,YAAY;AA7J7B,MAAA,IAAA,EAAA;AA8JM,MAAA,MAAM,aAAY,EAAc,GAAA,YAAA,IAAA,IAAA,GAAA,MAAA,GAAA,YAAA,CAAA,cAAA,KAAd,YAAgC,EAAC,EAAG,OAAO,CAAC,CAAA,KAAkC,QAAQ,CAAG,IAAA,IAAA,GAAA,MAAA,GAAA,CAAA,CAAA,EAAE,MAAM,EAAC,CAAA,IAAA,IAAA,GAAA,MAAA,GAAA,CAAA,CAAG,SAAQ,CAAE,CAAA,IAAA,KAAS,SAAS,WAAY,CAAA,CAAA;AAC/J,MAAI,IAAA,QAAA,CAAS,WAAW,CAAG,EAAA;AACzB,QAAI,IAAA,OAAA,EAAqB,WAAA,CAAA,EAAE,CAAA;AAC3B,QAAA;AAAA;AAEF,MAAA,iBAAA,CAAkB,IAAI,CAAA;AACtB,MAAI,IAAA;AACF,QAAA,MAAM,gBAAgB,MAAM,OAAA,CAAQ,IAAI,QAAS,CAAA,GAAA,CAAI,OAAM,OAAW,KAAA;AArK9E,UAAA,IAAAA,GAAA,EAAA,EAAA,EAAA,EAAA;AAsKU,UAAM,MAAA,SAAA,GAAY,MAAO,CAAA,OAAA,CAAQ,EAAE,CAAA;AACnC,UAAM,MAAA,MAAA,GAAS,MAAM,MAAA,CAAO,KAAM,CAAA;AAAA,YAChC,KAAO,EAAA,gBAAA;AAAA,YACP,SAAW,EAAA;AAAA,cACT,SAAA;AAAA,cACA,QAAU,EAAA,IAAA;AAAA,cACV,KAAO,EAAA,oBAAA;AAAA,cACP,IAAM,EAAA;AAAA,aACR;AAAA,YACA,WAAa,EAAA,aAAA;AAAA,YACb,OAAS,EAAA;AAAA,cACP,QAAU,EAAA;AAAA;AACZ,WACD,CAAA;AACD,UAAA,OAAO,yBAA0B,CAAA,CAAA,EAAA,GAAA,CAAA,EAAA,GAAA,CAAAA,GAAA,GAAA,MAAA,IAAA,IAAA,GAAA,KAAA,CAAA,GAAA,MAAA,CAAQ,IAAR,KAAA,IAAA,GAAA,KAAA,CAAA,GAAAA,GAAc,CAAA,QAAA,KAAd,IAAwB,GAAA,KAAA,CAAA,GAAA,EAAA,CAAA,IAAA,KAAxB,IAAgC,GAAA,EAAA,GAAA,EAAE,CAAA;AAAA,SACpE,CAAC,CAAA;AACF,QAAA,IAAI,CAAC,OAAS,EAAA;AACd,QAAA,MAAM,MAAS,GAAA,aAAA,CAAc,IAAK,EAAA,CAAE,KAAK,CAAC,CAAA,EAAG,CAAM,KAAA,CAAA,CAAE,SAAS,CAAE,CAAA,MAAM,CAAE,CAAA,KAAA,CAAM,GAAG,GAAG,CAAA;AACpF,QAAA,WAAA,CAAY,MAAM,CAAA;AAAA,OAClB,SAAA;AACA,QAAI,IAAA,OAAA,oBAA2B,KAAK,CAAA;AAAA;AACtC,KACF;AACA,IAAK,IAAA,EAAA;AACL,IAAA,OAAO,MAAM;AACX,MAAU,OAAA,GAAA,KAAA;AAAA,KACZ;AAAA,GACC,EAAA,CAAC,YAAc,EAAA,MAAM,CAAC,CAAA;AACzB,EAAA,MAAM,OAAW,GAAA,CAAA,eAAA,IAAmB,cAAmB,KAAA,QAAA,CAAS,MAAW,KAAA,CAAA;AAC3E,EAAA,uBAAQ,IAAA,CAAA,IAAA,EAAA,EAAK,KAAO,EAAA,MAAA,CAAO,SACjB,EAAA,QAAA,EAAA;AAAA,oBAAC,GAAA,CAAA,UAAA,EAAA,EAAW,KAAO,EAAA,MAAA,CAAO,IAAM,EAAA,qBAAA,EAAuB,MAAO,CAAA,WAAA,EAAa,8BAA+B,EAAA,OAAA,EAAQ,gCAAkC,EAAA,KAAA,EAAO,YAAc,EAAA;AAAA,MAC/K,GAAK,EAAA,CAAA;AAAA,MACL,IAAM,EAAA,CAAA;AAAA,MACN,MAAQ,EAAA,CAAA;AAAA,MACR,KAAO,EAAA;AAAA,OACN,qBAAuB,EAAA;AAAA,MACxB,GAAK,EAAA,CAAA;AAAA,MACL,IAAM,EAAA,CAAA;AAAA,MACN,MAAQ,EAAA,CAAA;AAAA,MACR,KAAO,EAAA;AAAA,OAEI,QAAU,EAAA,OAAA,mBAAA,GAAA,CAAC,QAAK,KAAO,EAAA,MAAA,CAAO,gBACvB,QAAC,kBAAA,GAAA,CAAA,iBAAA,EAAA,EAAkB,CACvB,EAAA,CAAA,GAAU,SAAS,MAAW,KAAA,CAAA,wBAAK,IAAK,EAAA,EAAA,KAAA,EAAO,OAAO,cAClD,EAAA,QAAA,EAAA;AAAA,sBAAC,GAAA,CAAA,IAAA,EAAA,EAAK,UAAS,MAAO,EAAA,UAAA,EAAW,aAAY,KAAM,EAAA,UAAA,EAAW,SAAU,EAAA,QAAA,EAAS,QAEjF,EAAA,wBAAA,EAAA,CAAA;AAAA,sBACA,GAAA,CAAC,QAAK,QAAS,EAAA,KAAA,EAAM,OAAM,UAAW,EAAA,SAAA,EAAU,UAAS,QAEzD,EAAA,+CAAA,EAAA;AAAA,KACJ,EAAA,CAAA,GAAU,QAAS,CAAA,GAAA,CAAI,CAAW,OAAA,qBAAA,GAAA,CAAC,cAAgC,EAAA,EAAA,OAAA,EAAkB,eAA9B,EAAA,EAAA,OAAA,CAAQ,EAAwD,CAAE,CACjI,EAAA,CAAA;AAAA,oBACC,GAAA,CAAA,SAAA,EAAA,EAAU,OAAS,EAAA,SAAA,EAAW,OAAO,CAAC;AAAA,MAC7C;AAAA,UACI,CAAC,MAAA,CAAO,GAAK,EAAA,OAAA,IAAW,OAAO,UAAU,CAAA,EACnC,QAAC,kBAAA,GAAA,CAAA,sBAAA,EAAA,EAAuB,MAAK,MAAO,EAAA,IAAA,EAAM,EAAI,EAAA,KAAA,EAAM,QAAO,CAC/D,EAAA;AAAA,GACJ,EAAA,CAAA;AACR;AACA,MAAM,MAAA,GAAS,WAAW,MAAO,CAAA;AAAA,EAC/B,SAAW,EAAA;AAAA,IACT,IAAM,EAAA,CAAA;AAAA,IACN,eAAiB,EAAA;AAAA,GACnB;AAAA,EACA,IAAM,EAAA;AAAA,IACJ,IAAM,EAAA;AAAA,GACR;AAAA,EACA,WAAa,EAAA;AAAA,IACX,iBAAmB,EAAA,EAAA;AAAA,IACnB,UAAY,EAAA,CAAA;AAAA,IACZ,aAAe,EAAA,GAAA;AAAA,IACf,GAAK,EAAA;AAAA,GACP;AAAA,EACA,cAAgB,EAAA;AAAA,IACd,IAAM,EAAA,CAAA;AAAA,IACN,SAAW,EAAA,GAAA;AAAA,IACX,UAAY,EAAA,QAAA;AAAA,IACZ,cAAgB,EAAA,QAAA;AAAA,IAChB,GAAK,EAAA;AAAA,GACP;AAAA,EACA,IAAM,EAAA;AAAA,IACJ,YAAc,EAAA,EAAA;AAAA,IACd,iBAAmB,EAAA,EAAA;AAAA,IACnB,eAAiB,EAAA;AAAA,GACnB;AAAA,EACA,OAAS,EAAA;AAAA,IACP,aAAe,EAAA,KAAA;AAAA,IACf,UAAY,EAAA,QAAA;AAAA,IACZ,cAAgB,EAAA,eAAA;AAAA,IAChB,YAAc,EAAA,CAAA;AAAA,IACd,GAAK,EAAA;AAAA,GACP;AAAA,EACA,SAAW,EAAA;AAAA,IACT,IAAM,EAAA,CAAA;AAAA,IACN,QAAU,EAAA,CAAA;AAAA,IACV,WAAa,EAAA;AAAA,GACf;AAAA,EACA,WAAa,EAAA;AAAA,IACX,OAAS,EAAA;AAAA,GACX;AAAA,EACA,GAAK,EAAA;AAAA,IACH,QAAU,EAAA,UAAA;AAAA,IACV,KAAO,EAAA,EAAA;AAAA,IACP,MAAQ,EAAA,EAAA;AAAA,IACR,KAAO,EAAA,EAAA;AAAA,IACP,MAAQ,EAAA,EAAA;AAAA,IACR,YAAc,EAAA,EAAA;AAAA,IACd,eAAiB,EAAA,SAAA;AAAA,IACjB,UAAY,EAAA,QAAA;AAAA,IACZ,cAAgB,EAAA,QAAA;AAAA,IAChB,WAAa,EAAA,MAAA;AAAA,IACb,aAAe,EAAA,IAAA;AAAA,IACf,YAAc,EAAA,CAAA;AAAA,IACd,YAAc,EAAA;AAAA,MACZ,KAAO,EAAA,CAAA;AAAA,MACP,MAAQ,EAAA;AAAA,KACV;AAAA,IACA,SAAW,EAAA;AAAA,GACb;AAAA,EACA,UAAY,EAAA;AAAA,IACV,OAAS,EAAA;AAAA;AAEb,CAAC,CAAA"}
|
|
1
|
+
{"version":3,"file":"ChatHistoryLanding.js","sources":["../../../../src/screens/Home/components/ChatHistoryLanding.tsx"],"sourcesContent":["import React from 'react';\nimport { Pressable, ScrollView, StyleSheet, View, useWindowDimensions } from 'react-native';\nimport { MaterialCommunityIcons } from '@expo/vector-icons';\nimport { Text } from '@admin-layout/gluestack-ui-mobile';\nimport { RoomType } from 'common';\nimport { useApolloClient } from '@apollo/client';\nimport { AI_ASSISTANT_CHANNELS_QUERY_VARS } from '../../../hooks/useChatApi';\nimport { MessagesDocument, useGetChannelsByUserWithLastMessageQuery } from 'common/graphql';\nimport { YantraBrandLoader } from '../../../components/YantraBrandLoader';\nimport { mobileTokens } from '../../../theme/mobileTokens';\n\ninterface ChatHistoryLandingProps {\n onSelectSession: (channelId: string) => void;\n onCompose: () => void;\n}\n\nconst MESSAGES_PER_CHANNEL = 200;\n\nfunction truncatePreview(text: string, max = 64): string {\n const cleaned = text.replace(/\\s+/g, ' ').trim();\n if (cleaned.length <= max) return cleaned;\n return `${cleaned.slice(0, max).trim()}...`;\n}\n\nfunction stripModelCostHeader(content: string): string {\n const normalized = content.replace(/\\r\\n/g, '\\n');\n return normalized.replace(\n /^\\s*(?:[^\\w\\n]+\\s*)?[a-z0-9][a-z0-9._-]*\\s*\\(\\s*\\$[\\d.]+\\s*\\/\\s*MTok\\s+in\\s*\\)\\s*\\n+/i,\n '',\n );\n}\n\nfunction getPostRole(post: any): string | undefined {\n return (\n post?.propsConfiguration?.content?.role ??\n post?.propsConfiguration?.contents?.role ??\n post?.props?.role ??\n undefined\n );\n}\n\nfunction sortPostsByTimeAsc(posts: any[]): any[] {\n return [...posts].sort((a, b) => {\n const ta = new Date(a?.createdAt ?? a?.updatedAt ?? 0).getTime();\n const tb = new Date(b?.createdAt ?? b?.updatedAt ?? 0).getTime();\n return ta - tb;\n });\n}\n\nfunction buildSessionsFromMessages(\n posts: any[],\n): Array<{ id: string; channelId: string; title: string; preview: string; sortAt: number }> {\n const sortedAsc = sortPostsByTimeAsc(posts);\n const rows: Array<{ id: string; channelId: string; title: string; preview: string; sortAt: number }> = [];\n const hasExplicitUserRole = sortedAsc.some((post) => String(getPostRole(post)).toUpperCase() === 'USER');\n\n for (let i = 0; i < sortedAsc.length; i++) {\n const current = sortedAsc[i];\n const role = getPostRole(current);\n if (hasExplicitUserRole && String(role).toUpperCase() !== 'USER') continue;\n\n const titleRaw = stripModelCostHeader(String(current?.message ?? '').trim()) || 'New Chat';\n let previewRaw = titleRaw;\n\n for (let j = i + 1; j < sortedAsc.length; j++) {\n const next = sortedAsc[j];\n const nextRole = getPostRole(next);\n if (String(nextRole).toUpperCase() === 'ASSISTANT') {\n previewRaw = stripModelCostHeader(String(next?.message ?? '').trim()) || titleRaw;\n break;\n }\n }\n\n const sessionChannelId = String(current?.channel?.id ?? current?.channel ?? '');\n if (!sessionChannelId) continue;\n\n rows.push({\n id: String(current?.id ?? `${sessionChannelId}-${i}`),\n channelId: sessionChannelId,\n title: truncatePreview(titleRaw, 44),\n preview: truncatePreview(previewRaw, 72),\n sortAt: new Date(current?.updatedAt ?? current?.createdAt ?? 0).getTime(),\n });\n }\n\n if (rows.length > 0) {\n return rows.reverse();\n }\n\n // Fallback for older rows where role metadata is absent:\n // show latest message per channel so history is never empty when posts exist.\n const fallbackRows: Array<{ id: string; channelId: string; title: string; preview: string; sortAt: number }> = [];\n const seenChannelIds = new Set<string>();\n for (let i = sortedAsc.length - 1; i >= 0; i--) {\n const post = sortedAsc[i];\n const sessionChannelId = String(post?.channel?.id ?? post?.channel ?? '');\n if (!sessionChannelId || seenChannelIds.has(sessionChannelId)) continue;\n seenChannelIds.add(sessionChannelId);\n\n const text = stripModelCostHeader(String(post?.message ?? '').trim()) || 'New Chat';\n fallbackRows.push({\n id: String(post?.id ?? `${sessionChannelId}-${i}`),\n channelId: sessionChannelId,\n title: truncatePreview(text, 44),\n preview: truncatePreview(text, 72),\n sortAt: new Date(post?.updatedAt ?? post?.createdAt ?? 0).getTime(),\n });\n }\n return fallbackRows;\n}\n\nfunction ChatHistoryRow({\n session,\n onSelectSession,\n}: {\n session: { id: string; channelId: string; title: string; preview: string; sortAt: number };\n onSelectSession: (channelId: string) => void;\n}) {\n return (\n <Pressable\n key={session.id}\n onPress={() => onSelectSession(session.channelId)}\n style={({ pressed }) => [styles.item, pressed && styles.itemPressed]}\n >\n <View style={styles.itemTop}>\n <View style={styles.rowTitleWrap}>\n <View style={styles.rowIconWrap}>\n <MaterialCommunityIcons\n name=\"message-text-outline\"\n size={15}\n color={mobileTokens.color.primary}\n />\n </View>\n <Text\n style={styles.titleText}\n fontSize=\"$lg\"\n color={mobileTokens.color.text}\n fontWeight=\"$semibold\"\n numberOfLines={1}\n >\n {session.title}\n </Text>\n </View>\n <MaterialCommunityIcons name=\"chevron-right\" size={20} color={mobileTokens.color.textMuted} />\n </View>\n <Text fontSize=\"$sm\" color={mobileTokens.color.textMuted} numberOfLines={2}>\n {session.preview}\n </Text>\n </Pressable>\n );\n}\n\nexport default function ChatHistoryLanding({ onSelectSession, onCompose }: ChatHistoryLandingProps) {\n const { width: screenWidth } = useWindowDimensions();\n const client = useApolloClient();\n const { data: channelsData, loading: channelsLoading } = useGetChannelsByUserWithLastMessageQuery({\n variables: AI_ASSISTANT_CHANNELS_QUERY_VARS,\n fetchPolicy: 'cache-and-network',\n errorPolicy: 'all',\n notifyOnNetworkStatusChange: true,\n returnPartialData: true,\n context: { cacheKey: 'channels-list' },\n });\n\n const [sessions, setSessions] = React.useState<\n Array<{ id: string; channelId: string; title: string; preview: string; sortAt: number }>\n >([]);\n const [threadsLoading, setThreadsLoading] = React.useState(false);\n\n React.useEffect(() => {\n let mounted = true;\n const load = async () => {\n const channels = (channelsData?.channelsByUser ?? []).filter(\n (c): c is NonNullable<typeof c> => Boolean(c?.id) && (!c?.type || c.type === RoomType.Aiassistant),\n );\n if (channels.length === 0) {\n if (mounted) setSessions([]);\n return;\n }\n\n setThreadsLoading(true);\n try {\n const rowsByChannel = await Promise.all(\n channels.map(async (channel) => {\n const channelId = String(channel.id);\n const result = await client.query({\n query: MessagesDocument,\n variables: {\n channelId,\n parentId: null,\n limit: MESSAGES_PER_CHANNEL,\n skip: 0,\n },\n fetchPolicy: 'cache-first',\n context: { cacheKey: 'messages-list' },\n });\n return buildSessionsFromMessages(result?.data?.messages?.data ?? []);\n }),\n );\n if (!mounted) return;\n const merged = rowsByChannel\n .flat()\n .sort((a, b) => b.sortAt - a.sortAt)\n .slice(0, 200);\n setSessions(merged);\n } finally {\n if (mounted) setThreadsLoading(false);\n }\n };\n\n load();\n return () => {\n mounted = false;\n };\n }, [channelsData, client]);\n\n const loading = (channelsLoading || threadsLoading) && sessions.length === 0;\n const contentMaxWidth = Math.min(760, Math.max(360, screenWidth - 24));\n\n return (\n <View style={styles.container}>\n <ScrollView\n style={styles.list}\n contentContainerStyle={[styles.listContent, { alignSelf: 'center', width: contentMaxWidth }]}\n contentInsetAdjustmentBehavior=\"never\"\n automaticallyAdjustContentInsets={false}\n contentInset={{ top: 0, left: 0, bottom: 0, right: 0 }}\n scrollIndicatorInsets={{ top: 0, left: 0, bottom: 0, right: 0 }}\n >\n {loading ? (\n <View style={styles.emptyStateWrap}>\n <YantraBrandLoader />\n </View>\n ) : sessions.length === 0 ? (\n <View style={styles.emptyStateWrap}>\n <Text fontSize=\"$2xl\" fontWeight=\"$semibold\" color=\"$gray900\" textAlign=\"center\">\n What can I do for you?\n </Text>\n <Text fontSize=\"$sm\" color=\"$gray600\" textAlign=\"center\">\n Ask anything to search and build with Yantra.\n </Text>\n </View>\n ) : (\n sessions.map((session) => (\n <ChatHistoryRow key={session.id} session={session} onSelectSession={onSelectSession} />\n ))\n )}\n </ScrollView>\n <Pressable\n onPress={onCompose}\n hitSlop={10}\n accessibilityRole=\"button\"\n accessibilityLabel=\"Start new chat\"\n style={({ pressed }) => [\n styles.fab,\n { right: Math.max((screenWidth - contentMaxWidth) / 2 + 18, 18) },\n pressed && styles.fabPressed,\n ]}\n >\n <MaterialCommunityIcons name=\"plus\" size={28} color={mobileTokens.color.surface} />\n </Pressable>\n </View>\n );\n}\n\nconst styles = StyleSheet.create({\n container: {\n flex: 1,\n backgroundColor: mobileTokens.color.bg,\n },\n list: {\n flex: 1,\n },\n listContent: {\n paddingHorizontal: 16,\n paddingTop: 8,\n paddingBottom: 100,\n gap: 10,\n },\n emptyStateWrap: {\n flex: 1,\n minHeight: 420,\n alignItems: 'center',\n justifyContent: 'center',\n gap: 10,\n },\n item: {\n borderRadius: 14,\n paddingHorizontal: 14,\n paddingVertical: 14,\n backgroundColor: mobileTokens.color.surface,\n borderWidth: 1,\n borderColor: mobileTokens.color.border,\n },\n itemTop: {\n flexDirection: 'row',\n alignItems: 'center',\n justifyContent: 'space-between',\n marginBottom: 4,\n gap: 8,\n },\n rowTitleWrap: {\n flexDirection: 'row',\n alignItems: 'center',\n flex: 1,\n minWidth: 0,\n gap: 8,\n },\n rowIconWrap: {\n width: 24,\n height: 24,\n borderRadius: 12,\n alignItems: 'center',\n justifyContent: 'center',\n backgroundColor: mobileTokens.color.primarySoft,\n borderWidth: 1,\n borderColor: mobileTokens.color.primaryBorder,\n },\n titleText: {\n flex: 1,\n minWidth: 0,\n },\n itemPressed: {\n opacity: 0.82,\n },\n fab: {\n position: 'absolute',\n right: 18,\n bottom: 28,\n width: 56,\n height: 56,\n borderRadius: 28,\n backgroundColor: mobileTokens.color.primary,\n borderWidth: 1,\n borderColor: mobileTokens.color.primaryBorder,\n alignItems: 'center',\n justifyContent: 'center',\n shadowColor: '#312e81',\n shadowOpacity: 0.22,\n shadowRadius: 10,\n shadowOffset: { width: 0, height: 4 },\n elevation: 6,\n },\n fabPressed: {\n opacity: 0.85,\n },\n});\n"],"names":["_a"],"mappings":"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"}
|