@contenify/chatbot 1.0.0 → 2.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.tsx","../contexts/PreferencesContext.tsx","../lib/api.ts","../lib/config.ts","../services/preferences.service.ts","../components/chatbot/ChatBot.tsx","../util/util.ts","../components/chatbot/ChatWindow.tsx","../components/chatbot/EditModal.tsx","../components/chatbot/RichTextEditor.tsx","../hooks/useTheme.ts","../components/news/NewsList.tsx","../services/news.service.ts","../components/chatbot/UserMenu.tsx","../components/chatbot/headerBar.tsx","../components/ui/Drawer.tsx","../components/preferences/Preferences.tsx","../services/settings.service.ts","../components/ClientSelect.tsx","../services/chat.service.ts"],"sourcesContent":["\"use client\"\n\nimport { useEffect } from \"react\"\nimport { PreferencesProvider } from \"../contexts/PreferencesContext\"\nimport ChatBot from \"../components/chatbot/ChatBot\"\nimport { setConfig } from \"../lib/config\"\n\nexport interface ContenifyChatBotProps {\n apiUrl?: string\n apiKey?: string\n domain?: string\n onPost?: (content: string, keywords: string[]) => void\n}\n\nexport function ContenifyChatBot({ apiUrl, apiKey, domain, onPost }: ContenifyChatBotProps) {\n useEffect(() => {\n setConfig({ apiUrl, apiKey, domain })\n }, [apiUrl, apiKey, domain])\n\n return (\n <PreferencesProvider>\n <ChatBot onPost={onPost} />\n </PreferencesProvider>\n )\n}\n\nexport default ContenifyChatBot\n\n// Re-export types for consumers\nexport type {\n ChatbotPreferences,\n LocalizationPreferences,\n AppearancePreferences,\n ContentPreferences,\n Preferences,\n} from \"../contexts/PreferencesContext\"\n\nexport type {\n ContentOption,\n AnalyzeInputResponse,\n CreateContentPayload,\n RecreateSettings,\n} from \"../services/chat.service\"\n\n// Re-export config utilities for consumers\nexport { setConfig } from \"../lib/config\"\n","'use client'\nimport { createContext, useContext, useState, useEffect, ReactNode } from 'react'\nimport { getMyPreferencesApi } from '@/services/preferences.service'\nimport { getServerBaseUrl } from '@/lib/config'\n\nexport interface ChatbotPreferences {\n name: string\n logoUrl?: string\n primaryColor: string\n secondaryColor: string\n theme: 'light' | 'dark' | 'system'\n}\n\nexport interface LocalizationPreferences {\n country: string\n state: string\n cities: string[]\n language: string\n locale: string\n timezone: string\n}\n\nexport interface AppearancePreferences {\n showSidebar: boolean\n showHeader: boolean\n activeThemePreset: string | null\n showNewsPanel: boolean\n}\n\nexport interface ContentPreferences {\n tone: 'formal' | 'casual' | 'engaging' | 'professional'\n style: 'news' | 'blog' | 'editorial' | 'summary'\n wordCount: 'short' | 'medium' | 'long'\n includeQuotes: boolean\n includeFAQ: boolean\n targetAudience: string\n}\n\nexport interface Preferences {\n chatbot: ChatbotPreferences\n localization: LocalizationPreferences\n appearance: AppearancePreferences\n content: ContentPreferences\n _id?: string\n user?: string\n isActive?: boolean\n createdAt?: string\n updatedAt?: string\n}\n\ninterface PreferencesContextType {\n preferences: Preferences | null\n loading: boolean\n error: string | null\n refreshPreferences: () => Promise<void>\n updatePreferences: (newPreferences: Preferences) => void\n}\n\nconst defaultPreferences: Preferences = {\n chatbot: {\n name: 'AI News Assistant',\n primaryColor: '#10b981',\n secondaryColor: '#064e3b',\n theme: 'system',\n },\n localization: {\n country: 'India',\n state: 'Uttar Pradesh',\n cities: [],\n language: 'en',\n locale: 'en-IN',\n timezone: 'Asia/Kolkata',\n },\n appearance: {\n showSidebar: true,\n showHeader: true,\n activeThemePreset: null,\n showNewsPanel: true,\n },\n content: {\n tone: 'engaging',\n style: 'blog',\n wordCount: 'medium',\n includeQuotes: true,\n includeFAQ: false,\n targetAudience: '',\n },\n}\n\nconst PreferencesContext = createContext<PreferencesContextType | undefined>(undefined)\n\nexport function PreferencesProvider({ children }: { children: ReactNode }) {\n const [preferences, setPreferences] = useState<Preferences | null>(defaultPreferences)\n const [loading, setLoading] = useState(true)\n const [error, setError] = useState<string | null>(null)\n\n const refreshPreferences = async () => {\n try {\n setLoading(true)\n setError(null)\n const data = await getMyPreferencesApi()\n\n if (data) {\n // Ensure logoUrl has full path\n if (data.chatbot?.logoUrl && !data.chatbot.logoUrl.startsWith('http')) {\n data.chatbot.logoUrl = `${getServerBaseUrl()}/${data.chatbot.logoUrl}`\n }\n\n // Merge API response with defaults to ensure all fields exist\n const mergedPreferences: Preferences = {\n ...defaultPreferences,\n ...data,\n chatbot: {\n ...defaultPreferences.chatbot,\n ...data.chatbot,\n },\n localization: {\n ...defaultPreferences.localization,\n ...data.localization,\n },\n appearance: {\n ...defaultPreferences.appearance,\n ...data.appearance,\n },\n content: {\n ...defaultPreferences.content,\n ...data.content,\n },\n }\n\n setPreferences(mergedPreferences)\n\n // Apply CSS variables for colors\n if (typeof document !== 'undefined') {\n document.documentElement.style.setProperty('--color-primary', mergedPreferences.chatbot?.primaryColor || '#10b981')\n document.documentElement.style.setProperty('--color-secondary', mergedPreferences.chatbot?.secondaryColor || '#064e3b')\n }\n }\n } catch (err) {\n console.error('Failed to fetch preferences:', err)\n setError(err instanceof Error ? err.message : 'Failed to load preferences')\n setPreferences(defaultPreferences)\n } finally {\n setLoading(false)\n }\n }\n\n const updatePreferences = (newPreferences: Preferences) => {\n setPreferences(newPreferences)\n\n // Apply CSS variables for colors\n if (typeof document !== 'undefined') {\n document.documentElement.style.setProperty('--color-primary', newPreferences.chatbot?.primaryColor || '#10b981')\n document.documentElement.style.setProperty('--color-secondary', newPreferences.chatbot?.secondaryColor || '#064e3b')\n }\n }\n\n useEffect(() => {\n refreshPreferences()\n }, [])\n\n return (\n <PreferencesContext.Provider\n value={{\n preferences,\n loading,\n error,\n refreshPreferences,\n updatePreferences,\n }}\n >\n {children}\n </PreferencesContext.Provider>\n )\n}\n\nexport function usePreferences() {\n const context = useContext(PreferencesContext)\n if (context === undefined) {\n throw new Error('usePreferences must be used within a PreferencesProvider')\n }\n return context\n}\n","import axios from \"axios\"\nimport { getApiBaseUrl, getApiKey } from \"./config\"\n\nconst api = axios.create({\n baseURL: getApiBaseUrl(),\n withCredentials: true,\n headers: {\n \"Content-Type\": \"application/json\",\n },\n})\n\n/**\n * Request middleware\n */\napi.interceptors.request.use(\n (config) => {\n const apiKey = getApiKey()\n if (apiKey) {\n config.headers[\"x-api-key\"] = apiKey\n }\n return config\n },\n (error) => Promise.reject(error)\n)\n\n/**\n * Response middleware\n */\napi.interceptors.response.use(\n (response) => response,\n (error) => {\n // Centralized error handling\n const message =\n error.response?.data?.message ||\n error.message ||\n \"Something went wrong\"\n\n return Promise.reject(message)\n }\n)\n\nexport default api\n","let _apiUrl = process.env.NEXT_PUBLIC_CONTENIFY_API_URL || \"http://localhost:8080/api\"\nlet _apiKey = process.env.NEXT_PUBLIC_API_KEY || \"\"\nlet _domain = process.env.NEXT_PUBLIC_DOMAIN || \"\"\n\nexport function setConfig(config: { apiUrl?: string; apiKey?: string; domain?: string }) {\n if (config.apiUrl) _apiUrl = config.apiUrl\n if (config.apiKey) _apiKey = config.apiKey\n if (config.domain) _domain = config.domain\n}\n\nexport function getApiBaseUrl(): string {\n return _apiUrl\n}\n\nexport function getServerBaseUrl(): string {\n return _apiUrl.replace(/\\/api\\/?$/, \"\")\n}\n\nexport function getApiKey(): string {\n return _apiKey\n}\n\nexport function getDomain(): string {\n return _domain\n}\n","import api from \"@/lib/api\"\n\n/**\n * Get logged-in user's chatbot preferences\n */\nexport const getMyPreferencesApi = async () => {\n const { data } = await api.get(\"/preferences/me\")\n return data.data\n}\n\n/**\n * Create or update chatbot preferences\n */\nexport const savePreferencesApi = async ({\n botName,\n logo,\n state,\n cities,\n primaryColor,\n secondaryColor,\n theme,\n language,\n showSidebar,\n showHeader,\n activeThemePreset,\n showNewsPanel,\n tone,\n style,\n wordCount,\n includeQuotes,\n includeFAQ,\n targetAudience,\n}: {\n botName?: string\n logo?: File | null\n state?: string\n cities?: string[]\n primaryColor?: string\n secondaryColor?: string\n theme?: \"light\" | \"dark\" | \"system\"\n language?: string\n showSidebar?: boolean\n showHeader?: boolean\n activeThemePreset?: string | null\n showNewsPanel?: boolean\n tone?: string\n style?: string\n wordCount?: string\n includeQuotes?: boolean\n includeFAQ?: boolean\n targetAudience?: string\n}) => {\n const formData = new FormData()\n\n if (botName) {\n formData.append(\"botName\", botName)\n }\n\n if (logo) {\n formData.append(\"logo\", logo)\n }\n\n if (state) {\n formData.append(\"state\", state)\n }\n\n if (cities) {\n formData.append(\"cities\", JSON.stringify(cities))\n }\n\n if (primaryColor) {\n formData.append(\"primaryColor\", primaryColor)\n }\n\n if (secondaryColor) {\n formData.append(\"secondaryColor\", secondaryColor)\n }\n\n if (theme) {\n formData.append(\"theme\", theme)\n }\n\n if (language) {\n formData.append(\"language\", language)\n }\n\n if (showSidebar !== undefined) {\n formData.append(\"showSidebar\", String(showSidebar))\n }\n\n if (showHeader !== undefined) {\n formData.append(\"showHeader\", String(showHeader))\n }\n\n if (activeThemePreset !== undefined) {\n formData.append(\"activeThemePreset\", activeThemePreset ?? \"\")\n }\n\n if (showNewsPanel !== undefined) {\n formData.append(\"showNewsPanel\", String(showNewsPanel))\n }\n\n if (tone) {\n formData.append(\"tone\", tone)\n }\n\n if (style) {\n formData.append(\"style\", style)\n }\n\n if (wordCount) {\n formData.append(\"wordCount\", wordCount)\n }\n\n if (includeQuotes !== undefined) {\n formData.append(\"includeQuotes\", String(includeQuotes))\n }\n\n if (includeFAQ !== undefined) {\n formData.append(\"includeFAQ\", String(includeFAQ))\n }\n\n if (targetAudience !== undefined) {\n formData.append(\"targetAudience\", targetAudience)\n }\n\n const { data } = await api.put(\"/preferences\", formData, {\n headers: {\n \"Content-Type\": \"multipart/form-data\",\n },\n })\n\n return data.data\n}\n\n/**\n * Reset chatbot preferences\n */\nexport const resetPreferencesApi = async () => {\n const { data } = await api.delete(\"/preferences/me\")\n return data\n}\n","\"use client\"\n\nimport { useState } from \"react\"\nimport ChatWindow from \"./ChatWindow\"\nimport HeaderBar from \"./headerBar\"\nimport Drawer from \"../ui/Drawer\"\nimport PreferencesPage from \"../preferences/Preferences\"\nimport {\n rewriteNewsStreamApi,\n rewriteNewsApi,\n analyzeInputApi,\n createContentStreamApi,\n createContentApi,\n type ContentOption,\n} from \"@/services/chat.service\"\nimport { useTheme } from \"@/hooks/useTheme\"\nimport { usePreferences } from \"@/contexts/PreferencesContext\"\nimport toast from \"react-hot-toast\"\nimport { Loader2 } from \"lucide-react\"\n\ntype ChatMessage = {\n id: string\n role: \"user\" | \"assistant\"\n content: string\n}\n\nexport default function ChatBot({ onPost }: { onPost?: (content: string, keywords: string[]) => void }) {\n const { loading } = useTheme()\n const { preferences } = usePreferences()\n const [preferencesOpen, setPreferencesOpen] = useState(false)\n const [messages, setMessages] = useState<ChatMessage[]>([])\n const [isStreaming, setIsStreaming] = useState(false)\n const [analyzedData, setAnalyzedData] = useState<{\n url: string\n content: string\n options: ContentOption[]\n messageId: string\n } | null>(null)\n\n\nconst handleRecreate = async ({ title, content, id }: { title: string; content?: string; id?: string }) => {\n const assistantId = crypto.randomUUID()\n\n // Add user message and empty assistant message\n setMessages(prev => [\n ...prev,\n {\n id: crypto.randomUUID(),\n role: \"user\",\n content: `Recreate this news:\\n${title}`,\n },\n {\n id: assistantId,\n role: \"assistant\",\n content: \"⏳ Creating article...\",\n },\n ])\n\n try {\n let accumulatedContent = \"\"\n let hasStartedStreaming = false\n\n // Get content preferences\n const contentPrefs = preferences?.content\n const lang = preferences?.localization?.language === \"hi\" ? \"Hindi\" : \"English\"\n\n // Try streaming API first\n try {\n await rewriteNewsStreamApi({\n article: content || \"\",\n language: lang,\n articleId: id,\n tone: contentPrefs?.tone,\n style: contentPrefs?.style,\n wordCount: contentPrefs?.wordCount,\n includeQuotes: contentPrefs?.includeQuotes,\n includeFAQ: contentPrefs?.includeFAQ,\n targetAudience: contentPrefs?.targetAudience,\n onChunk: (chunk: string) => {\n hasStartedStreaming = true\n // Accumulate the streamed content\n accumulatedContent += chunk\n\n // Update the message in real-time with streaming content\n setMessages(prev =>\n prev.map(m =>\n m.id === assistantId\n ? { ...m, content: accumulatedContent }\n : m\n )\n )\n },\n onComplete: () => {\n console.log(\"Streaming completed successfully\")\n toast.success(\"Article created successfully!\")\n },\n onError: async (error) => {\n console.error(\"Streaming error:\", error)\n\n // If streaming hasn't started, try fallback to regular API\n if (!hasStartedStreaming) {\n console.log(\"Falling back to regular API...\")\n throw error // Will be caught by outer catch\n } else {\n toast.error(\"Failed to complete article generation\")\n setMessages(prev =>\n prev.map(m =>\n m.id === assistantId\n ? { ...m, content: accumulatedContent || \"❌ Failed to create article. Please try again.\" }\n : m\n )\n )\n }\n },\n })\n } catch (streamError) {\n // Fallback to regular API if streaming fails\n console.log(\"Streaming failed, using regular API...\", streamError)\n\n setMessages(prev =>\n prev.map(m =>\n m.id === assistantId\n ? { ...m, content: \"⏳ Generating with regular API...\" }\n : m\n )\n )\n\n const result = await rewriteNewsApi({\n article: content || \"\",\n language: lang,\n articleId: id,\n tone: contentPrefs?.tone,\n style: contentPrefs?.style,\n wordCount: contentPrefs?.wordCount,\n includeQuotes: contentPrefs?.includeQuotes,\n includeFAQ: contentPrefs?.includeFAQ,\n targetAudience: contentPrefs?.targetAudience,\n })\n\n setMessages(prev =>\n prev.map(m =>\n m.id === assistantId\n ? { ...m, content: result.article || result }\n : m\n )\n )\n\n toast.success(\"Article created successfully!\")\n }\n } catch (err) {\n console.error(\"Complete Error:\", err)\n toast.error((err as Error)?.message || \"An error occurred while creating the article\")\n setMessages(prev =>\n prev.map(m =>\n m.id === assistantId\n ? { ...m, content: \"❌ Failed to create article. Please try again.\" }\n : m\n )\n )\n }\n}\n\n\n\n const handleSendMessage = async (text: string) => {\n const userMsgId = crypto.randomUUID()\n const assistantId = crypto.randomUUID()\n\n // Add user message\n setMessages(prev => [\n ...prev,\n { id: userMsgId, role: \"user\", content: text },\n ])\n\n // Check if input contains a URL\n const urlRegex = /https?:\\/\\/[^\\s]+/\n const hasUrl = urlRegex.test(text)\n\n if (hasUrl) {\n // Show analyzing state\n setMessages(prev => [\n ...prev,\n { id: assistantId, role: \"assistant\", content: \"🔍 Analyzing your link...\" },\n ])\n\n try {\n const result = await analyzeInputApi(text)\n\n if (result.hasUrl && result.options?.length > 0) {\n // Store analyzed data for when user picks an action\n setAnalyzedData({\n url: result.url || \"\",\n content: result.content || \"\",\n options: result.options,\n messageId: assistantId,\n })\n\n // Show options as assistant message\n const optionsList = result.options\n .map((opt) => `• **${opt.name}**${opt.description ? ` – ${opt.description}` : \"\"}`)\n .join(\"\\n\")\n\n setMessages(prev =>\n prev.map(m =>\n m.id === assistantId\n ? {\n ...m,\n content: `I found an article (${result.wordCount || 0} words). What would you like to do?\\n\\n${optionsList}`,\n }\n : m\n )\n )\n } else {\n setMessages(prev =>\n prev.map(m =>\n m.id === assistantId\n ? { ...m, content: \"Could not extract content from that URL. Please try a different link.\" }\n : m\n )\n )\n }\n } catch (err) {\n console.error(\"Analyze input error:\", err)\n toast.error(\"Failed to analyze the link\")\n setMessages(prev =>\n prev.map(m =>\n m.id === assistantId\n ? { ...m, content: \"❌ Failed to analyze the link. Please try again.\" }\n : m\n )\n )\n }\n } else {\n // No URL — send as regular chat (recreate flow with the text as article)\n setMessages(prev => [\n ...prev,\n { id: assistantId, role: \"assistant\", content: \"⏳ Generating content...\" },\n ])\n setIsStreaming(true)\n\n try {\n const contentPrefs = preferences?.content\n const lang = preferences?.localization?.language === \"hi\" ? \"Hindi\" : \"English\"\n let accumulatedContent = \"\"\n\n await rewriteNewsStreamApi({\n article: text,\n language: lang,\n tone: contentPrefs?.tone,\n style: contentPrefs?.style,\n wordCount: contentPrefs?.wordCount,\n includeQuotes: contentPrefs?.includeQuotes,\n includeFAQ: contentPrefs?.includeFAQ,\n targetAudience: contentPrefs?.targetAudience,\n onChunk: (chunk: string) => {\n accumulatedContent += chunk\n setMessages(prev =>\n prev.map(m =>\n m.id === assistantId ? { ...m, content: accumulatedContent } : m\n )\n )\n },\n onComplete: () => {\n setIsStreaming(false)\n toast.success(\"Content generated!\")\n },\n onError: (error) => {\n console.error(\"Stream error:\", error)\n setIsStreaming(false)\n toast.error(\"Failed to generate content\")\n },\n })\n } catch (err) {\n console.error(\"Send message error:\", err)\n setIsStreaming(false)\n setMessages(prev =>\n prev.map(m =>\n m.id === assistantId\n ? { ...m, content: \"❌ Failed to generate content. Please try again.\" }\n : m\n )\n )\n }\n }\n }\n\n /**\n * Handle when user selects a content action option (e.g. Recreate, Summary, etc.)\n */\n const handleSelectAction = async (actionId: string, url: string, content: string) => {\n const assistantId = crypto.randomUUID()\n\n // Clear analyzed data\n setAnalyzedData(null)\n\n const actionName = analyzedData?.options.find(o => o.id === actionId)?.name || actionId\n\n setMessages(prev => [\n ...prev,\n { id: crypto.randomUUID(), role: \"user\", content: `Action: ${actionName}` },\n { id: assistantId, role: \"assistant\", content: \"⏳ Creating content...\" },\n ])\n setIsStreaming(true)\n\n try {\n const contentPrefs = preferences?.content\n let accumulatedContent = \"\"\n\n try {\n // Try streaming first\n await createContentStreamApi({\n url,\n content,\n actionId,\n settings: {\n tone: contentPrefs?.tone,\n style: contentPrefs?.style,\n wordCount: contentPrefs?.wordCount,\n },\n onChunk: (chunk: string) => {\n accumulatedContent += chunk\n setMessages(prev =>\n prev.map(m =>\n m.id === assistantId ? { ...m, content: accumulatedContent } : m\n )\n )\n },\n onComplete: () => {\n setIsStreaming(false)\n toast.success(\"Content created!\")\n },\n onError: (error) => {\n console.error(\"Stream error:\", error)\n setIsStreaming(false)\n toast.error(\"Failed to create content\")\n },\n })\n } catch {\n // Fallback to non-streaming\n const result = await createContentApi({ url, content, actionId, settings: {\n tone: contentPrefs?.tone,\n style: contentPrefs?.style,\n wordCount: contentPrefs?.wordCount,\n }})\n\n setMessages(prev =>\n prev.map(m =>\n m.id === assistantId\n ? { ...m, content: result.article || result.content || JSON.stringify(result) }\n : m\n )\n )\n setIsStreaming(false)\n toast.success(\"Content created!\")\n }\n } catch (err) {\n console.error(\"Create content error:\", err)\n setIsStreaming(false)\n setMessages(prev =>\n prev.map(m =>\n m.id === assistantId\n ? { ...m, content: \"❌ Failed to create content. Please try again.\" }\n : m\n )\n )\n }\n }\n\n // Show loading screen while preferences are loading\n if (loading) {\n return (\n <div className=\"cnfy-loading\">\n <div className=\"cnfy-loading-inner\">\n <Loader2 className=\"cnfy-loading-spinner cnfy-animate-spin\" />\n <p className=\"cnfy-loading-text\">Loading...</p>\n </div>\n </div>\n )\n }\n\n return (\n <div className=\"cnfy-root\">\n\n <HeaderBar onOpenPreferences={() => setPreferencesOpen(true)} />\n\n <div className=\"cnfy-main\">\n <section className=\"cnfy-chat-section cnfy-chat-section--full\">\n {/* Chat window */}\n <div className=\"cnfy-chat-inner\">\n <ChatWindow\n messages={messages}\n onSend={handleSendMessage}\n onSelectNews={handleRecreate}\n isStreaming={isStreaming}\n analyzedData={analyzedData}\n onSelectAction={handleSelectAction}\n onPost={onPost}\n />\n </div>\n\n {!messages.length && (\n <div className=\"cnfy-empty-state\">\n <div>\n <p className=\"cnfy-empty-state-title\">AI News Assistant</p>\n <p className=\"cnfy-empty-state-subtitle\">\n Type a message or paste a link to begin\n </p>\n </div>\n </div>\n )}\n </section>\n </div>\n\n <Drawer\n open={preferencesOpen}\n onClose={() => setPreferencesOpen(false)}\n title=\"Settings\"\n >\n <PreferencesPage />\n </Drawer>\n </div>\n )\n}\n","export function extractArticleContent(raw?: string): {\n title?: string\n article: string\n metaKeywords: string[]\n} {\n if (!raw) {\n return { article: \"\", metaKeywords: [] }\n }\n\n // Plain text (non-JSON)\n if (!raw.trim().startsWith(\"{\")) {\n return {\n article: raw,\n metaKeywords: [],\n }\n }\n\n try {\n const parsed = JSON.parse(raw)\n\n return {\n title: parsed.title || \"\",\n article: parsed.article || parsed.content || \"\",\n metaKeywords: Array.isArray(parsed.metaKeywords)\n ? parsed.metaKeywords\n : [],\n }\n } catch {\n // 🔹 Fallback for partial / broken JSON streams\n const article =\n raw\n .replace(/^[\\s\\S]*?\"article\"\\s*:\\s*\"/, \"\")\n .replace(/\"\\s*,\\s*\"metaKeywords\"[\\s\\S]*$/, \"\")\n .replace(/\"}\\s*$/, \"\") || raw\n\n return {\n article,\n metaKeywords: [],\n }\n }\n}\n","\"use client\"\n\nimport { extractArticleContent } from \"@/util/util\"\nimport { Check, Copy, Edit3, Send, SendHorizontal, Zap, X, RefreshCcw, FileText, ListChecks, Share2, BookOpen, Mail, Key } from \"lucide-react\"\nimport type { ContentOption } from \"@/services/chat.service\"\nimport { useLayoutEffect, useRef, useState, useEffect } from \"react\"\nimport EditModal from \"./EditModal\"\nimport NewsList from \"../news/NewsList\"\nimport { getTrendingNews, getNewsSources, getNewsBySource, scrapeNewsSource } from \"@/services/news.service\"\nimport Select, { SingleValue } from \"react-select\"\nimport { useTheme } from \"@/hooks/useTheme\"\nimport { usePreferences } from \"@/contexts/PreferencesContext\"\n\ninterface SourceOption {\n value: string | null\n label: string\n}\n\ntype ChatMessage = {\n id: string\n role: \"user\" | \"assistant\"\n content: string\n}\n\ntype Block =\n | { type: \"h1\"; text: string }\n | { type: \"h2\"; text: string }\n | { type: \"p\"; text: string }\n\nconst ACTION_ICONS: Record<string, typeof FileText> = {\n recreate_article: RefreshCcw,\n create_summary: ListChecks,\n create_social_posts: Share2,\n create_blog_post: BookOpen,\n create_newsletter: Mail,\n extract_key_points: Key,\n}\n\nexport default function ChatWindow({\n messages,\n onSend,\n onSelectNews,\n isStreaming = false,\n analyzedData,\n onSelectAction,\n onPost: onPostCallback,\n}: {\n messages: ChatMessage[]\n onSend: (message: string) => void\n onSelectNews?: (news: { title: string; content?: string; id?: string }) => void\n isStreaming?: boolean\n analyzedData?: {\n url: string\n content: string\n options: ContentOption[]\n messageId: string\n } | null\n onSelectAction?: (actionId: string, url: string, content: string) => void\n onPost?: (content: string, keywords: string[]) => void\n}) {\n const { loading, showNewsPanel } = useTheme()\n const bottomRef = useRef<HTMLDivElement>(null)\n const textareaRef = useRef<HTMLTextAreaElement>(null)\n const dropdownRef = useRef<HTMLDivElement>(null)\n const [input, setInput] = useState(\"\")\n const [copiedId, setCopiedId] = useState<string | null>(null)\n const [showNewsDropdown, setShowNewsDropdown] = useState(false)\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const [trendingNews, setTrendingNews] = useState<any[]>([])\n const [loadingNews, setLoadingNews] = useState(false)\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const [sources, setSources] = useState<any[]>([])\n const [selectedSource, setSelectedSource] = useState<string | null>(null)\n const [loadingSources, setLoadingSources] = useState(false)\n const [scraping, setScraping] = useState(false)\n const [editModal, setEditModal] = useState<{\n isOpen: boolean\n content: string\n metaKeywords: string[]\n messageId: string\n }>({ isOpen: false, content: \"\", metaKeywords: [], messageId: \"\" })\n\n const { primaryColor } = useTheme();\n const { preferences } = usePreferences();\n const preferredLanguage = preferences?.localization?.language;\n\n\n const handleCopy = async (blocks: Block[], messageId: string) => {\n try {\n const formattedText = blocksToFormattedText(blocks)\n await navigator.clipboard.writeText(formattedText)\n setCopiedId(messageId)\n setTimeout(() => setCopiedId(null), 2000)\n } catch (err) {\n console.error(\"Failed to copy:\", err)\n }\n }\n\n // Convert parsed blocks to formatted text for editing\n const blocksToFormattedText = (blocks: Block[]): string => {\n return blocks\n .map(block => {\n if (block.type === \"h1\") return `# ${block.text}`\n if (block.type === \"h2\") return `## ${block.text}`\n return block.text\n })\n .join(\"\\n\\n\")\n }\n\n const handleEdit = (blocks: Block[], metaKeywords: string[], messageId: string) => {\n const formattedContent = blocksToFormattedText(blocks)\n setEditModal({ isOpen: true, content: formattedContent, metaKeywords, messageId })\n }\n\n const handleCloseModal = () => {\n setEditModal({ isOpen: false, content: \"\", metaKeywords: [], messageId: \"\" })\n }\n\n const handleSaveDraft = (content: string, keywords: string[]) => {\n console.log(\"Saving draft:\", { content, keywords })\n // TODO: Implement save draft logic\n handleCloseModal()\n }\n\n const handlePost = (content: string, keywords: string[]) => {\n onPostCallback?.(content, keywords)\n handleCloseModal()\n }\n\n useLayoutEffect(() => {\n bottomRef.current?.scrollIntoView({ block: \"end\" })\n }, [messages])\n\n const handleSend = () => {\n if (!input.trim()) return\n onSend(input)\n setInput(\"\")\n if (textareaRef.current) {\n textareaRef.current.style.height = \"auto\"\n }\n }\n\n // Auto-resize textarea based on content\n useEffect(() => {\n const textarea = textareaRef.current\n if (textarea) {\n textarea.style.height = \"auto\"\n textarea.style.height = `${textarea.scrollHeight}px`\n }\n }, [input])\n\n const fetchSources = async () => {\n setLoadingSources(true)\n try {\n const data = await getNewsSources()\n setSources(data || [])\n } catch (err) {\n console.error(\"Failed to fetch sources:\", err)\n } finally {\n setLoadingSources(false)\n }\n }\n\n const fetchNews = async (sourceId: string | null) => {\n setLoadingNews(true)\n try {\n let data\n if (sourceId) {\n data = await getNewsBySource(sourceId)\n } else {\n data = await getTrendingNews()\n }\n setTrendingNews(data || [])\n } catch (err) {\n console.error(\"Failed to fetch news:\", err)\n } finally {\n setLoadingNews(false)\n }\n }\n\n const handleScrape = async () => {\n if (!selectedSource) return\n setScraping(true)\n try {\n await scrapeNewsSource(selectedSource)\n await fetchNews(selectedSource)\n } catch (err) {\n console.error(\"Failed to scrape:\", err)\n } finally {\n setScraping(false)\n }\n }\n\n const handleSourceSelect = (option: SingleValue<SourceOption>) => {\n const sourceId = option?.value ?? null\n console.log(\"Selected source:\", option)\n setSelectedSource(sourceId)\n fetchNews(sourceId)\n }\n\n const handleOpenNewsDropdown = () => {\n setShowNewsDropdown(true)\n if (sources.length === 0) {\n fetchSources()\n }\n if (trendingNews.length === 0) {\n fetchNews(selectedSource)\n }\n }\n\n // Close dropdown when clicking outside\n useEffect(() => {\n const handleClickOutside = (event: MouseEvent) => {\n if (dropdownRef.current && !dropdownRef.current.contains(event.target as Node)) {\n setShowNewsDropdown(false)\n }\n }\n\n if (showNewsDropdown) {\n document.addEventListener(\"mousedown\", handleClickOutside)\n }\n\n return () => {\n document.removeEventListener(\"mousedown\", handleClickOutside)\n }\n }, [showNewsDropdown])\n\n function formatAIContent(raw?: string): {\n blocks: Block[]\n metaKeywords: string[]\n } {\n const extracted = extractArticleContent(raw)\n\n if (!extracted || !extracted.article) {\n return { blocks: [], metaKeywords: [] }\n }\n\n const { article, metaKeywords } = extracted\n\n const normalized = article\n .replace(/^H1:\\s*/gm, \"\")\n .replace(/^H2:\\s*/gm, \"\")\n .replace(/<\\/h1>/gi, \"\\n\")\n .replace(/<\\/h2>/gi, \"\\n\")\n .replace(/<\\/p>/gi, \"\\n\")\n .replace(/<br\\s*\\/?>/gi, \"\\n\")\n\n const lines = normalized\n .split(\"\\n\")\n .map(line => line.replace(/<[^>]+>/g, \"\").trim())\n .filter(Boolean)\n\n const blocks: Block[] = []\n\n lines.forEach((line, index) => {\n // Title\n if (index === 0 && line.length < 120) {\n blocks.push({ type: \"h1\", text: line })\n return\n }\n\n // Section heading\n if (\n line.length < 90 &&\n !line.endsWith(\"।\") &&\n !line.endsWith(\".\")\n ) {\n blocks.push({ type: \"h2\", text: line })\n return\n }\n\n blocks.push({ type: \"p\", text: line })\n })\n\n return { blocks, metaKeywords }\n }\n\n return (\n <div className=\"cnfy-chat\">\n {/* Chat Area */}\n <div className=\"cnfy-chat-area\">\n <div className=\"cnfy-chat-scroll\">\n {messages.map(msg => {\n const parsed = formatAIContent(msg.content)\n\n return (\n <div key={msg.id} className=\"cnfy-msg\">\n <div className=\"cnfy-msg-avatar-wrap\">\n <div\n className=\"cnfy-msg-avatar\"\n style={{\n backgroundColor: msg.role === \"assistant\" ? primaryColor : \"#1f2937\",\n }}\n >\n {msg.role === \"assistant\" ? \"AI\" : \"You\"}\n </div>\n </div>\n\n <div className=\"cnfy-msg-body\">\n {/* Copy button for AI responses */}\n {msg.role === \"assistant\" && parsed.blocks.length > 0 && (\n <div className=\"cnfy-msg-copy-row\">\n <button\n onClick={() => handleCopy(parsed.blocks, msg.id)}\n className=\"cnfy-copy-btn\"\n title=\"Copy to clipboard\"\n >\n {copiedId === msg.id ? (\n <Check size={16} className=\"cnfy-copy-icon--copied\" />\n ) : (\n <Copy size={16} />\n )}\n </button>\n </div>\n )}\n\n {parsed.blocks.map((block, idx) => {\n if (block.type === \"h1\") {\n return (\n <h1\n key={idx}\n className=\"cnfy-block-h1\"\n >\n {block.text}\n </h1>\n )\n }\n\n if (block.type === \"h2\") {\n return (\n <h2\n key={idx}\n className=\"cnfy-block-h2\"\n >\n {block.text}\n </h2>\n )\n }\n\n return (\n <p key={idx} className=\"cnfy-block-p\">\n {block.text}\n </p>\n )\n })}\n\n {/* Meta Keywords */}\n {parsed.metaKeywords.length > 0 && (\n <div className=\"cnfy-msg-keywords\">\n <div className=\"cnfy-msg-keywords-list\">\n {parsed.metaKeywords.map((tag, i) => (\n <span\n key={i}\n className=\"cnfy-msg-keyword-tag\"\n >\n #{tag}\n </span>\n ))}\n </div>\n </div>\n )}\n\n {/* Content action options - show when URL was analyzed */}\n {msg.role === \"assistant\" && analyzedData?.messageId === msg.id && analyzedData.options.length > 0 && (\n <div className=\"cnfy-action-options\">\n {analyzedData.options.map((option) => {\n const IconComponent = ACTION_ICONS[option.id] || FileText\n return (\n <button\n key={option.id}\n onClick={() => onSelectAction?.(option.id, analyzedData.url, analyzedData.content)}\n className=\"cnfy-action-btn\"\n >\n <IconComponent size={16} />\n {option.name}\n </button>\n )\n })}\n </div>\n )}\n\n {/* Edit and Post buttons for AI responses - only show when streaming is complete */}\n {msg.role === \"assistant\" && parsed.blocks.length > 0 && !analyzedData?.messageId && (!isStreaming || msg.id !== messages[messages.length - 1]?.id) && (\n <div className=\"cnfy-msg-actions\">\n <button\n onClick={() => handleEdit(parsed.blocks, parsed.metaKeywords, msg.id)}\n className=\"cnfy-btn-edit\"\n >\n <Edit3 size={16} />\n Edit\n </button>\n <button\n onClick={() => handlePost(msg.content, parsed.metaKeywords)}\n className=\"cnfy-btn-post\"\n style={{ backgroundColor: primaryColor, color: \"#fff\" }}\n >\n <Send size={16} />\n Post\n </button>\n </div>\n )}\n </div>\n </div>\n )\n })}\n\n <div ref={bottomRef} />\n </div>\n </div>\n\n {/* Input */}\n <div className=\"cnfy-input-area\">\n <div className=\"cnfy-input-inner\">\n {/* Pulse Icon - Trending News */}\n <div ref={dropdownRef} className=\"cnfy-news-pulse-wrap\">\n <button\n onClick={handleOpenNewsDropdown}\n className=\"cnfy-news-pulse-btn cnfy-animate-pulse\"\n title=\"Select from trending news\"\n >\n <Zap size={16} />\n </button>\n\n {/* News Dropdown */}\n {showNewsDropdown && (\n <div className=\"cnfy-news-dropdown\">\n {/* Header */}\n <div className=\"cnfy-news-dropdown-header\" style={{ backgroundColor: primaryColor, color: \"#fff\" }}>\n <span className=\"cnfy-news-dropdown-title\">Select News</span>\n <button\n onClick={() => setShowNewsDropdown(false)}\n className=\"cnfy-news-dropdown-close\"\n style={{ backgroundColor: primaryColor, color: \"#fff\" }}\n >\n <X size={14} />\n </button>\n </div>\n\n {/* Source Selector */}\n <div className=\"cnfy-news-dropdown-source\">\n {/* Source Dropdown with react-select */}\n <div className=\"cnfy-news-dropdown-select-wrap\">\n <Select<SourceOption>\n options={[\n { value: null, label: \"All Sources (Trending)\" },\n ...sources\n .filter((source) => !preferredLanguage || source.language === preferredLanguage)\n .map((source) => ({\n value: source.id,\n label: source.name,\n })),\n ]}\n value={\n selectedSource\n ? { value: selectedSource, label: sources.find(s => s.id === selectedSource)?.name || selectedSource }\n : { value: null, label: \"All Sources (Trending)\" }\n }\n onChange={handleSourceSelect}\n isLoading={loadingSources}\n isDisabled={loadingSources}\n placeholder=\"Select source...\"\n classNamePrefix=\"react-select\"\n menuPlacement=\"bottom\"\n menuPosition=\"fixed\"\n menuShouldScrollIntoView={false}\n maxMenuHeight={220}\n menuPortalTarget={typeof window !== \"undefined\" ? document.body : null}\n styles={{\n container: (base) => ({\n ...base,\n width: \"100%\",\n }),\n control: (base) => ({\n ...base,\n minHeight: \"38px\",\n borderColor: \"#e5e7eb\",\n boxShadow: \"none\",\n width: \"100%\",\n }),\n menu: (base) => ({\n ...base,\n width: \"100%\",\n zIndex: 999999,\n }),\n menuPortal: (base) => ({\n ...base,\n zIndex: 999999,\n }),\n option: (base, state) => ({\n ...base,\n backgroundColor: state.isSelected\n ? primaryColor\n : state.isFocused\n ? \"#f3f4f6\"\n : \"white\",\n color: state.isSelected ? \"white\" : \"#374151\",\n cursor: \"pointer\",\n }),\n }}\n />\n </div>\n\n {/* Scrape Button */}\n {selectedSource && (\n <button\n onClick={handleScrape}\n disabled={scraping}\n className=\"cnfy-scrape-btn\"\n title=\"Fetch latest news\"\n >\n <RefreshCcw size={14} className={scraping ? 'cnfy-animate-spin' : ''} />\n {scraping ? 'Scraping...' : 'Scrape'}\n </button>\n )}\n\n {/* Refresh Button for trending */}\n {!selectedSource && (\n <button\n onClick={() => fetchNews(null)}\n disabled={loadingNews}\n className=\"cnfy-refresh-btn\"\n >\n <RefreshCcw size={14} className={loadingNews ? 'cnfy-animate-spin' : ''} />\n Refresh\n </button>\n )}\n </div>\n\n {/* News List */}\n <div className=\"cnfy-news-dropdown-list\">\n {loadingNews ? (\n <div className=\"cnfy-news-dropdown-msg\">\n Loading news...\n </div>\n ) : trendingNews.length === 0 ? (\n <div className=\"cnfy-news-dropdown-msg\">\n <p>No news found.</p>\n {selectedSource && (\n <p className=\"cnfy-news-dropdown-hint\">Click &quot;Scrape&quot; to fetch latest news.</p>\n )}\n </div>\n ) : (\n <NewsList\n news={trendingNews.slice(0, 10)}\n onView={(item) => window.open(item.sourceUrl || item.link, \"_blank\")}\n onRecreate={(payload) => {\n setShowNewsDropdown(false)\n onSelectNews?.(payload)\n }}\n />\n )}\n </div>\n </div>\n )}\n </div>\n \n <textarea\n ref={textareaRef}\n value={input}\n onChange={e => setInput(e.target.value)}\n onKeyDown={e => {\n if (e.key === \"Enter\" && !e.shiftKey) {\n e.preventDefault()\n handleSend()\n }\n }}\n rows={1}\n placeholder=\"Ask AI something…\"\n className={`cnfy-chat-textarea ${!showNewsPanel ? 'cnfy-chat-textarea--with-pulse' : ''}`}\n style={{ maxHeight: \"200px\", overflowY: input.split(\"\\n\").length > 6 ? \"auto\" : \"hidden\" }}\n />\n <button\n onClick={handleSend}\n className=\"cnfy-send-btn\"\n style={{ backgroundColor: primaryColor, color: \"#fff\" }}\n >\n <SendHorizontal size={18} />\n </button>\n </div>\n </div>\n\n {/* Edit Modal */}\n <EditModal\n isOpen={editModal.isOpen}\n initialContent={editModal.content}\n metaKeywords={editModal.metaKeywords}\n onClose={handleCloseModal}\n onSaveDraft={handleSaveDraft}\n onPost={handlePost}\n />\n </div>\n )\n}\n","\"use client\"\n\nimport { X } from \"lucide-react\"\nimport { useEffect, useState } from \"react\"\nimport RichTextEditor from \"./RichTextEditor\"\nimport { useTheme } from \"@/hooks/useTheme\"\n\ntype EditModalProps = {\n isOpen: boolean\n initialContent: string\n metaKeywords: string[]\n onClose: () => void\n onSaveDraft: (content: string, keywords: string[]) => void\n onPost: (content: string, keywords: string[]) => void\n}\n\nexport default function EditModal({\n isOpen,\n initialContent,\n metaKeywords,\n onClose,\n onSaveDraft,\n onPost,\n}: EditModalProps) {\n const { primaryColor } = useTheme();\n const [content, setContent] = useState(\"\")\n const [keywords, setKeywords] = useState<string[]>(metaKeywords)\n const [newKeyword, setNewKeyword] = useState(\"\")\n\n // Convert markdown-style content to HTML for the editor\n const markdownToHtml = (text: string): string => {\n const lines = text.split(\"\\n\").filter(line => line.trim())\n let html = \"\"\n\n lines.forEach(line => {\n const trimmed = line.trim()\n if (trimmed.startsWith(\"# \")) {\n html += `<h1>${trimmed.replace(/^#\\s+/, \"\")}</h1>`\n } else if (trimmed.startsWith(\"## \")) {\n html += `<h2>${trimmed.replace(/^##\\s+/, \"\")}</h2>`\n } else {\n html += `<p>${trimmed}</p>`\n }\n })\n\n return html\n }\n\n useEffect(() => {\n const htmlContent = markdownToHtml(initialContent)\n setContent(htmlContent)\n setKeywords(metaKeywords)\n }, [initialContent, metaKeywords])\n\n useEffect(() => {\n if (isOpen) {\n document.body.style.overflow = \"hidden\"\n } else {\n document.body.style.overflow = \"\"\n }\n return () => {\n document.body.style.overflow = \"\"\n }\n }, [isOpen])\n\n const handleAddKeyword = () => {\n if (newKeyword.trim() && !keywords.includes(newKeyword.trim())) {\n setKeywords([...keywords, newKeyword.trim()])\n setNewKeyword(\"\")\n }\n }\n\n const handleRemoveKeyword = (index: number) => {\n setKeywords(keywords.filter((_, i) => i !== index))\n }\n\n const handleKeyDown = (e: React.KeyboardEvent) => {\n if (e.key === \"Enter\") {\n e.preventDefault()\n handleAddKeyword()\n }\n }\n\n if (!isOpen) return null\n\n return (\n <div className=\"cnfy-edit-modal-overlay\">\n {/* Backdrop */}\n <div\n className=\"cnfy-edit-modal-backdrop\"\n onClick={onClose}\n />\n\n {/* Modal */}\n <div className=\"cnfy-edit-modal\">\n {/* Header */}\n <div className=\"cnfy-edit-modal-header\">\n <h2 className=\"cnfy-edit-modal-title\">Edit Article</h2>\n <button\n onClick={onClose}\n className=\"cnfy-edit-modal-close-btn\"\n >\n <X size={20} className=\"cnfy-edit-modal-close-icon\" />\n </button>\n </div>\n\n {/* Content */}\n <div className=\"cnfy-edit-modal-body\">\n {/* Article Content - WYSIWYG Editor */}\n <div>\n <label className=\"cnfy-edit-label\">\n Article Content\n </label>\n <RichTextEditor\n content={content}\n onChange={setContent}\n placeholder=\"Start writing your article...\"\n />\n </div>\n\n {/* Meta Keywords */}\n <div>\n <label className=\"cnfy-edit-label\">\n Meta Keywords\n </label>\n <div className=\"cnfy-keyword-list\">\n {keywords.map((keyword, index) => (\n <span\n key={index}\n className=\"cnfy-keyword-tag\"\n >\n #{keyword}\n <button\n onClick={() => handleRemoveKeyword(index)}\n className=\"cnfy-keyword-remove-btn\"\n >\n <X size={14} />\n </button>\n </span>\n ))}\n </div>\n <div className=\"cnfy-keyword-input-row\">\n <input\n type=\"text\"\n value={newKeyword}\n onChange={e => setNewKeyword(e.target.value)}\n onKeyDown={handleKeyDown}\n placeholder=\"Add a keyword...\"\n className=\"cnfy-keyword-input\"\n />\n <button\n onClick={handleAddKeyword}\n className=\"cnfy-btn-add-keyword\"\n >\n Add\n </button>\n </div>\n </div>\n </div>\n\n {/* Footer */}\n <div className=\"cnfy-edit-modal-footer\">\n <button\n onClick={onClose}\n className=\"cnfy-btn-footer-cancel\"\n >\n Cancel\n </button>\n <button\n onClick={() => onSaveDraft(content, keywords)}\n className=\"cnfy-btn-save-draft\"\n >\n Save Draft\n </button>\n <button\n onClick={() => onPost(content, keywords)}\n className=\"cnfy-btn-post-article\"\n style={{ backgroundColor: primaryColor, color: \"#fff\" }}\n >\n Post\n </button>\n </div>\n </div>\n </div>\n )\n}\n","\"use client\"\n\nimport { useEditor, EditorContent } from \"@tiptap/react\"\nimport StarterKit from \"@tiptap/starter-kit\"\nimport Placeholder from \"@tiptap/extension-placeholder\"\nimport {\n Bold,\n Italic,\n List,\n ListOrdered,\n Heading1,\n Heading2,\n Undo,\n Redo,\n Pilcrow,\n} from \"lucide-react\"\nimport { useEffect } from \"react\"\n\ntype RichTextEditorProps = {\n content: string\n onChange: (content: string) => void\n placeholder?: string\n}\n\nexport default function RichTextEditor({\n content,\n onChange,\n placeholder = \"Start writing your article...\",\n}: RichTextEditorProps) {\n const editor = useEditor({\n immediatelyRender: false, // Prevents SSR hydration mismatch\n extensions: [\n StarterKit.configure({\n heading: {\n levels: [1, 2],\n },\n }),\n Placeholder.configure({\n placeholder,\n }),\n ],\n content: content,\n editorProps: {\n attributes: {\n class: \"ProseMirror\",\n },\n },\n onUpdate: ({ editor }) => {\n onChange(editor.getHTML())\n },\n })\n\n // Update editor content when prop changes\n useEffect(() => {\n if (editor && content !== editor.getHTML()) {\n editor.commands.setContent(content)\n }\n }, [content, editor])\n\n if (!editor) {\n return (\n <div className=\"cnfy-editor-loading\">\n Loading editor...\n </div>\n )\n }\n\n return (\n <div className=\"cnfy-editor\">\n {/* Toolbar */}\n <div className=\"cnfy-toolbar\">\n <ToolbarButton\n onClick={() => editor.chain().focus().toggleHeading({ level: 1 }).run()}\n isActive={editor.isActive(\"heading\", { level: 1 })}\n title=\"Heading 1\"\n >\n <Heading1 size={18} />\n </ToolbarButton>\n\n <ToolbarButton\n onClick={() => editor.chain().focus().toggleHeading({ level: 2 }).run()}\n isActive={editor.isActive(\"heading\", { level: 2 })}\n title=\"Heading 2\"\n >\n <Heading2 size={18} />\n </ToolbarButton>\n\n <ToolbarButton\n onClick={() => editor.chain().focus().setParagraph().run()}\n isActive={editor.isActive(\"paragraph\")}\n title=\"Paragraph\"\n >\n <Pilcrow size={18} />\n </ToolbarButton>\n\n <div className=\"cnfy-toolbar-divider\" />\n\n <ToolbarButton\n onClick={() => editor.chain().focus().toggleBold().run()}\n isActive={editor.isActive(\"bold\")}\n title=\"Bold\"\n >\n <Bold size={18} />\n </ToolbarButton>\n\n <ToolbarButton\n onClick={() => editor.chain().focus().toggleItalic().run()}\n isActive={editor.isActive(\"italic\")}\n title=\"Italic\"\n >\n <Italic size={18} />\n </ToolbarButton>\n\n <div className=\"cnfy-toolbar-divider\" />\n\n <ToolbarButton\n onClick={() => editor.chain().focus().toggleBulletList().run()}\n isActive={editor.isActive(\"bulletList\")}\n title=\"Bullet List\"\n >\n <List size={18} />\n </ToolbarButton>\n\n <ToolbarButton\n onClick={() => editor.chain().focus().toggleOrderedList().run()}\n isActive={editor.isActive(\"orderedList\")}\n title=\"Numbered List\"\n >\n <ListOrdered size={18} />\n </ToolbarButton>\n\n <div className=\"cnfy-toolbar-divider\" />\n\n <ToolbarButton\n onClick={() => editor.chain().focus().undo().run()}\n disabled={!editor.can().undo()}\n title=\"Undo\"\n >\n <Undo size={18} />\n </ToolbarButton>\n\n <ToolbarButton\n onClick={() => editor.chain().focus().redo().run()}\n disabled={!editor.can().redo()}\n title=\"Redo\"\n >\n <Redo size={18} />\n </ToolbarButton>\n </div>\n\n {/* Editor */}\n <EditorContent editor={editor} className=\"cnfy-editor-content\" />\n </div>\n )\n}\n\ntype ToolbarButtonProps = {\n onClick: () => void\n isActive?: boolean\n disabled?: boolean\n title: string\n children: React.ReactNode\n}\n\nfunction ToolbarButton({\n onClick,\n isActive,\n disabled,\n title,\n children,\n}: ToolbarButtonProps) {\n return (\n <button\n onClick={onClick}\n disabled={disabled}\n title={title}\n className={`cnfy-toolbar-btn ${\n isActive ? \"cnfy-toolbar-btn--active\" : \"\"\n } ${disabled ? \"cnfy-toolbar-btn--disabled\" : \"\"}`}\n >\n {children}\n </button>\n )\n}\n","import { usePreferences } from '@/contexts/PreferencesContext'\n\nexport function useTheme() {\n const { preferences, loading } = usePreferences()\n\n return {\n loading,\n primaryColor: preferences?.chatbot?.primaryColor || '#10b981',\n secondaryColor: preferences?.chatbot?.secondaryColor || '#064e3b',\n botName: preferences?.chatbot?.name || 'AI News Assistant',\n logoUrl: preferences?.chatbot?.logoUrl,\n theme: preferences?.chatbot?.theme || 'system',\n showSidebar: preferences?.appearance?.showSidebar ?? true,\n showHeader: preferences?.appearance?.showHeader ?? true,\n activeThemePreset: preferences?.appearance?.activeThemePreset ?? null,\n showNewsPanel: preferences?.appearance?.showNewsPanel ?? true,\n }\n}\n","\"use client\"\nimport { useState } from \"react\"\nimport { Eye, RefreshCcw } from \"lucide-react\"\nimport { useTheme } from \"@/hooks/useTheme\"\n\nconst dateFormatter = new Intl.DateTimeFormat(\"en-GB\", {\n day: \"2-digit\",\n month: \"short\",\n year: \"numeric\",\n})\n\nconst timeFormatter = new Intl.DateTimeFormat(\"en-GB\", {\n hour: \"2-digit\",\n minute: \"2-digit\",\n hour12: false,\n})\n\nfunction extractLinksFromContent(html?: string) {\n if (!html) return []\n\n const parser = new DOMParser()\n const doc = parser.parseFromString(html, \"text/html\")\n\n return Array.from(doc.querySelectorAll(\"li\")).map((li) => {\n const anchor = li.querySelector(\"a\")\n const source = li.querySelector(\"font\")\n\n return {\n title: anchor?.textContent || \"\",\n url: anchor?.getAttribute(\"href\") || \"#\",\n source: source?.textContent || \"\",\n }\n })\n}\n\nexport default function NewsList({\n news,\n onView,\n onRecreate,\n}: {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n news: any[]\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n onView: (item: any) => void\n onRecreate: (payload: { title: string; content?: string; id?: string }) => void\n}) {\n\n const { primaryColor } = useTheme();\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const [primaryColorState] = useState<any>(primaryColor);\n\n const lightenColor = (hex:string, percent = 85) => {\n hex = hex.replace(\"#\", \"\");\n\n let r = parseInt(hex.substring(0, 2), 16);\n let g = parseInt(hex.substring(2, 4), 16);\n let b = parseInt(hex.substring(4, 6), 16);\n\n r = Math.round(r + (255 - r) * (percent / 100));\n g = Math.round(g + (255 - g) * (percent / 100));\n b = Math.round(b + (255 - b) * (percent / 100));\n\n return `rgb(${r}, ${g}, ${b})`;\n}\n\n\n\n\n return (\n <div className=\"cnfy-news-list\">\n {news.flatMap((item) => {\n const publishedDate = new Date(item.publishedAt)\n const links = extractLinksFromContent(item.content)\n\n // CHILD CARDS\n if (links.length > 0) {\n return links.map((link, idx) => (\n <div\n key={`${item._id}-link-${idx}`}\n className=\"cnfy-news-card\"\n >\n {/* LEFT CONTENT */}\n <div className=\"cnfy-news-card-content\">\n <p className=\"cnfy-news-card-title\">\n {link.title}\n </p>\n\n <div className=\"cnfy-news-card-meta\">\n <span\n className=\"cnfy-news-badge\"\n style={{\n backgroundColor: lightenColor(primaryColorState, 95),\n color: primaryColor,\n borderColor: lightenColor(primaryColorState, 95),\n }}\n >\n {link.source || item.sourceName}\n </span>\n\n <span>•</span>\n <span className=\"cnfy-news-card-category\">{item.category}</span>\n <span>•</span>\n\n <span>\n {dateFormatter.format(publishedDate)}{\" \"}\n {timeFormatter.format(publishedDate)}\n </span>\n </div>\n </div>\n\n {/* RIGHT ACTIONS */}\n <div className=\"cnfy-news-card-actions\">\n <button\n onClick={() => window.open(link.url, \"_blank\")}\n className=\"cnfy-news-action-btn\"\n title=\"View\"\n >\n <Eye size={16} />\n </button>\n\n <button\n onClick={() =>\n onRecreate({\n title: link.title,\n content: link.title,\n id: item._id,\n })\n }\n className=\"cnfy-news-action-btn\"\n title=\"Recreate\"\n >\n <RefreshCcw size={16} />\n </button>\n </div>\n </div>\n ))\n }\n\n // PARENT CARD\n return (\n <div\n key={item._id}\n className=\"cnfy-news-card\"\n >\n {/* LEFT CONTENT */}\n <div className=\"cnfy-news-card-content\">\n <p className=\"cnfy-news-card-title\">\n {item.title}\n </p>\n\n <div className=\"cnfy-news-card-meta\">\n <span\n className=\"cnfy-news-badge\"\n style={{\n backgroundColor: lightenColor(primaryColorState, 95),\n color: primaryColor,\n borderColor: lightenColor(primaryColorState, 95),\n }}\n >\n {item.sourceName}\n </span>\n\n <span>•</span>\n <span className=\"cnfy-news-card-category\">{item.category}</span>\n <span>•</span>\n\n <span>\n {dateFormatter.format(publishedDate)}{\" \"}\n {timeFormatter.format(publishedDate)}\n </span>\n </div>\n </div>\n\n {/* RIGHT ACTIONS */}\n <div className=\"cnfy-news-card-actions\">\n <button\n onClick={() => onView(item)}\n className=\"cnfy-news-action-btn\"\n title=\"View\"\n >\n <Eye size={16} />\n </button>\n\n <button\n onClick={() =>\n onRecreate({\n title: item.title,\n content: item.content || item.title,\n id: item._id,\n })\n }\n className=\"cnfy-news-action-btn\"\n title=\"Recreate\"\n >\n <RefreshCcw size={16} />\n </button>\n </div>\n </div>\n )\n })}\n </div>\n )\n}\n","import api from \"@/lib/api\"\n\nexport const getTrendingNews = async () => {\n const { data } = await api.get(\"/news/trending\")\n return data.data\n}\n\n/**\n * Get list of available news sources (RSS feeds)\n */\nexport const getNewsSources = async () => {\n const { data } = await api.get(\"/news/sources\")\n return data.data\n}\n\n/**\n * Scrape top 10 news from a specific source\n */\nexport const scrapeNewsSource = async (sourceId: string) => {\n const { data } = await api.post(\"/news/scrape-source\", { sourceId })\n return data.data\n}\n\n/**\n * Get previously scraped news by source\n */\nexport const getNewsBySource = async (sourceId: string) => {\n const { data } = await api.get(`/news/by-source/${sourceId}`)\n return data.data\n}\n","\"use client\"\n\nimport { Settings } from \"lucide-react\"\n\nexport default function UserMenu({\n onOpenPreferences,\n}: {\n onOpenPreferences?: () => void\n}) {\n return (\n <div className=\"cnfy-user-menu\">\n <button\n onClick={() => onOpenPreferences?.()}\n className=\"cnfy-user-menu-trigger\"\n aria-label=\"Settings\"\n >\n <Settings size={20} className=\"cnfy-user-menu-trigger-icon\" />\n </button>\n </div>\n )\n}\n","\"use client\"\n\nimport UserMenu from \"./UserMenu\"\nimport { useTheme } from \"@/hooks/useTheme\"\n\nexport default function HeaderBar({\n onOpenPreferences,\n}: {\n onOpenPreferences?: () => void\n}) {\n const { primaryColor, botName, logoUrl } = useTheme()\n\n return (\n <header className=\"cnfy-header\">\n <div className=\"cnfy-header-inner\">\n\n {/* Left: Logo + Brand */}\n <div className=\"cnfy-header-left\">\n {logoUrl ? (\n <img src={logoUrl} alt=\"Logo\" className=\"cnfy-header-logo-img\" />\n ) : (\n <div\n className=\"cnfy-header-logo-fallback\"\n style={{ backgroundColor: primaryColor }}\n >\n {botName.charAt(0).toUpperCase()}\n </div>\n )}\n <span className=\"cnfy-header-brand\">\n {botName.toUpperCase()}\n </span>\n </div>\n\n {/* Right: User Menu */}\n <div className=\"cnfy-header-right\">\n <UserMenu onOpenPreferences={onOpenPreferences} />\n </div>\n </div>\n </header>\n )\n}\n","\"use client\"\n\nimport { useEffect } from \"react\"\nimport { X } from \"lucide-react\"\n\nexport default function Drawer({\n open,\n onClose,\n title,\n children,\n}: {\n open: boolean\n onClose: () => void\n title?: string\n children: React.ReactNode\n}) {\n // Prevent body scroll when drawer is open\n useEffect(() => {\n if (open) {\n document.body.style.overflow = \"hidden\"\n } else {\n document.body.style.overflow = \"\"\n }\n return () => {\n document.body.style.overflow = \"\"\n }\n }, [open])\n\n if (!open) return null\n\n return (\n <div className=\"cnfy-drawer-overlay\">\n {/* Backdrop */}\n <div className=\"cnfy-drawer-backdrop\" onClick={onClose} />\n\n {/* Panel */}\n <div className=\"cnfy-drawer-panel\">\n <div className=\"cnfy-drawer-header\">\n {title && <h2 className=\"cnfy-drawer-title\">{title}</h2>}\n <button onClick={onClose} className=\"cnfy-drawer-close-btn\">\n <X size={20} />\n </button>\n </div>\n\n <div className=\"cnfy-drawer-body\">\n {children}\n </div>\n </div>\n </div>\n )\n}\n","'use client'\nimport { useState, useEffect } from \"react\"\nimport toast from \"react-hot-toast\"\nimport { savePreferencesApi } from \"@/services/preferences.service\"\nimport { triggerScrape, getScrapeStatus } from \"@/services/settings.service\"\nimport { usePreferences } from \"@/contexts/PreferencesContext\"\nimport ClientSelect from \"@/components/ClientSelect\"\n\ninterface ScrapeStatus {\n isRunning: boolean\n lastRun?: string\n nextScheduled?: string\n totalScraped?: number\n}\n\nconst STATE_OPTIONS = [\n { value: \"Uttar Pradesh\", label: \"Uttar Pradesh\" }\n]\n\nconst CITY_OPTIONS = [\n \"Agra\",\n \"Aligarh\",\n \"Ayodhya\",\n \"Bareilly\",\n \"Bijnor\",\n \"Bulandshahr\",\n \"Etawah\",\n \"Firozabad\",\n \"Ghaziabad\",\n \"Gorakhpur\",\n \"Jhansi\",\n \"Kanpur\",\n \"Lucknow\",\n \"Mathura\",\n \"Meerut\",\n \"Moradabad\",\n \"Muzaffarnagar\",\n \"Noida\",\n \"Prayagraj\",\n \"Rampur\",\n \"Saharanpur\",\n \"Sitapur\",\n \"Unnao\",\n \"Varanasi\"\n].map(city => ({ value: city, label: city }))\n\nconst LANGUAGE_OPTIONS = [\n { value: \"en\", label: \"English\" },\n { value: \"hi\", label: \"Hindi\" },\n]\n\nconst TONE_OPTIONS = [\n { value: \"formal\", label: \"Formal\" },\n { value: \"casual\", label: \"Casual\" },\n { value: \"engaging\", label: \"Engaging\" },\n { value: \"professional\", label: \"Professional\" },\n]\n\nconst STYLE_OPTIONS = [\n { value: \"news\", label: \"News Article\" },\n { value: \"blog\", label: \"Blog Post\" },\n { value: \"editorial\", label: \"Editorial\" },\n { value: \"summary\", label: \"Summary\" },\n]\n\nconst WORD_COUNT_OPTIONS = [\n { value: \"short\", label: \"Short (~300 words)\" },\n { value: \"medium\", label: \"Medium (~600 words)\" },\n { value: \"long\", label: \"Long (~1000+ words)\" },\n]\n\nexport default function PreferencesPage() {\n const { preferences, loading, refreshPreferences, updatePreferences } = usePreferences()\n const primaryColor = preferences?.chatbot?.primaryColor || \"#10b981\"\n\n const [botName, setBotName] = useState(\"\")\n const [logo, setLogo] = useState<File | null>(null)\n const [logoUrl, setLogoUrl] = useState<string | null>(null)\n const [state, setState] = useState<{ value: string; label: string } | null>(null)\n const [cities, setCities] = useState<{ value: string; label: string }[]>([])\n const [language, setLanguage] = useState<{ value: string; label: string } | null>(null)\n\n // Content preferences\n const [tone, setTone] = useState<{ value: string; label: string } | null>(null)\n const [style, setStyle] = useState<{ value: string; label: string } | null>(null)\n const [wordCount, setWordCount] = useState<{ value: string; label: string } | null>(null)\n const [includeQuotes, setIncludeQuotes] = useState(true)\n const [includeFAQ, setIncludeFAQ] = useState(false)\n const [targetAudience, setTargetAudience] = useState(\"\")\n\n const [saving, setSaving] = useState(false)\n const [success, setSuccess] = useState(false)\n\n // News Scraping state\n const [scraping, setScraping] = useState(false)\n const [scrapeStatus, setScrapeStatus] = useState<ScrapeStatus | null>(null)\n const [loadingStatus, setLoadingStatus] = useState(true)\n\n // Store original values for comparison\n const [originalValues, setOriginalValues] = useState<{\n botName: string\n state: string | undefined\n cities: string[]\n language: string | undefined\n tone: string | undefined\n style: string | undefined\n wordCount: string | undefined\n includeQuotes: boolean\n includeFAQ: boolean\n targetAudience: string\n }>({\n botName: \"\",\n state: undefined,\n cities: [],\n language: undefined,\n tone: undefined,\n style: undefined,\n wordCount: undefined,\n includeQuotes: true,\n includeFAQ: false,\n targetAudience: \"\",\n })\n\n // Fetch scrape status on mount\n useEffect(() => {\n const fetchScrapeStatus = async () => {\n try {\n const data = await getScrapeStatus()\n setScrapeStatus(data)\n } catch (error) {\n console.log(\"Failed to fetch scrape status:\", error)\n } finally {\n setLoadingStatus(false)\n }\n }\n fetchScrapeStatus()\n }, [])\n\n const handleScrape = async () => {\n setScraping(true)\n try {\n await triggerScrape({\n state: preferences?.localization?.state,\n cities: preferences?.localization?.cities,\n })\n toast.success(\"News scraping started successfully!\")\n setTimeout(async () => {\n try {\n const data = await getScrapeStatus()\n setScrapeStatus(data)\n } catch (e) {\n console.log(\"Failed to refresh scrape status:\", e)\n }\n }, 2000)\n } catch (error) {\n console.error(error)\n toast.error(\"Failed to trigger news scraping\")\n } finally {\n setScraping(false)\n }\n }\n\n useEffect(() => {\n if (preferences) {\n // Set chatbot preferences\n const name = preferences.chatbot?.name || \"\"\n const pState = preferences.localization?.state\n const pCities = preferences.localization?.cities || []\n const pLanguage = preferences.localization?.language\n\n setBotName(name)\n if (preferences.chatbot?.logoUrl) setLogoUrl(preferences.chatbot.logoUrl)\n\n // Set localization preferences\n if (pState) {\n setState({ value: pState, label: pState })\n }\n if (Array.isArray(pCities)) {\n setCities(pCities.map((city: string) => ({ value: city, label: city })))\n }\n if (pLanguage) {\n const langOption = LANGUAGE_OPTIONS.find(opt => opt.value === pLanguage)\n setLanguage(langOption || null)\n }\n\n // Set content preferences\n const pTone = preferences.content?.tone\n const pStyle = preferences.content?.style\n const pWordCount = preferences.content?.wordCount\n const pIncludeQuotes = preferences.content?.includeQuotes ?? true\n const pIncludeFAQ = preferences.content?.includeFAQ ?? false\n const pTargetAudience = preferences.content?.targetAudience || \"\"\n\n if (pTone) {\n const toneOption = TONE_OPTIONS.find(opt => opt.value === pTone)\n setTone(toneOption || null)\n }\n if (pStyle) {\n const styleOption = STYLE_OPTIONS.find(opt => opt.value === pStyle)\n setStyle(styleOption || null)\n }\n if (pWordCount) {\n const wordCountOption = WORD_COUNT_OPTIONS.find(opt => opt.value === pWordCount)\n setWordCount(wordCountOption || null)\n }\n setIncludeQuotes(pIncludeQuotes)\n setIncludeFAQ(pIncludeFAQ)\n setTargetAudience(pTargetAudience)\n\n // Store original values\n setOriginalValues({\n botName: name,\n state: pState,\n cities: pCities,\n language: pLanguage,\n tone: pTone,\n style: pStyle,\n wordCount: pWordCount,\n includeQuotes: pIncludeQuotes,\n includeFAQ: pIncludeFAQ,\n targetAudience: pTargetAudience,\n })\n }\n }, [preferences])\n\n const handleSave = async () => {\n if (!botName) {\n toast.error(\"Chatbot name is required\")\n return\n }\n\n setSaving(true)\n setSuccess(false)\n\n try {\n // Build payload with only changed fields\n const payload: {\n botName?: string\n logo?: File | null\n state?: string\n cities?: string[]\n language?: string\n tone?: string\n style?: string\n wordCount?: string\n includeQuotes?: boolean\n includeFAQ?: boolean\n targetAudience?: string\n } = {}\n\n // Check each field for changes\n if (botName !== originalValues.botName) {\n payload.botName = botName\n }\n\n if (logo) {\n payload.logo = logo\n }\n\n const currentState = state?.value\n if (currentState !== originalValues.state) {\n payload.state = currentState\n }\n\n const currentCities = cities.map(c => c.value)\n const citiesChanged =\n currentCities.length !== originalValues.cities.length ||\n currentCities.some((city, index) => city !== originalValues.cities[index])\n if (citiesChanged) {\n payload.cities = currentCities\n }\n\n const currentLanguage = language?.value\n if (currentLanguage !== originalValues.language) {\n payload.language = currentLanguage\n }\n\n // Check content preferences for changes\n const currentTone = tone?.value\n if (currentTone !== originalValues.tone) {\n payload.tone = currentTone\n }\n\n const currentStyle = style?.value\n if (currentStyle !== originalValues.style) {\n payload.style = currentStyle\n }\n\n const currentWordCount = wordCount?.value\n if (currentWordCount !== originalValues.wordCount) {\n payload.wordCount = currentWordCount\n }\n\n if (includeQuotes !== originalValues.includeQuotes) {\n payload.includeQuotes = includeQuotes\n }\n\n if (includeFAQ !== originalValues.includeFAQ) {\n payload.includeFAQ = includeFAQ\n }\n\n if (targetAudience !== originalValues.targetAudience) {\n payload.targetAudience = targetAudience\n }\n\n // If no changes detected, show message\n if (Object.keys(payload).length === 0) {\n toast.error(\"No changes to save\")\n setSaving(false)\n return\n }\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const updatedPreferences = await savePreferencesApi(payload as any)\n\n // Update global context with new preferences\n if (updatedPreferences) {\n updatePreferences(updatedPreferences)\n } else {\n // Refresh from server if save didn't return data\n await refreshPreferences()\n }\n\n setSuccess(true)\n setLogo(null) // Clear logo after successful save\n toast.success(\"Preferences saved successfully!\")\n } catch (error) {\n console.error(error)\n toast.error(\"Failed to save preferences\")\n } finally {\n setSaving(false)\n }\n }\n\n if (loading) {\n return (\n <div className=\"cnfy-dash-page\">\n <p className=\"cnfy-dash-page-subtitle\">Loading settings...</p>\n </div>\n )\n }\n\n return (\n <div className=\"cnfy-dash-page\">\n {/* Chatbot Settings */}\n <div className=\"cnfy-dash-card\">\n <h2 className=\"cnfy-dash-card-title\">Chatbot Settings</h2>\n\n {/* Chatbot Name */}\n <div className=\"cnfy-dash-field\">\n <label className=\"cnfy-dash-label\">Chatbot Name</label>\n <input\n value={botName}\n onChange={(e) => setBotName(e.target.value)}\n className=\"cnfy-dash-input\"\n placeholder=\"Contenify AI\"\n />\n </div>\n\n {/* Logo */}\n <div className=\"cnfy-dash-field\">\n <label className=\"cnfy-dash-label\">Chatbot Logo</label>\n <div className=\"cnfy-logo-upload\">\n <div className=\"cnfy-logo-preview\">\n {logo ? (\n <img\n src={URL.createObjectURL(logo)}\n alt=\"Logo preview\"\n className=\"cnfy-logo-img\"\n />\n ) : logoUrl ? (\n <img\n src={logoUrl}\n alt=\"Current logo\"\n className=\"cnfy-logo-img\"\n />\n ) : (\n <span className=\"cnfy-logo-placeholder\">No logo</span>\n )}\n </div>\n\n <input\n type=\"file\"\n accept=\"image/*\"\n onChange={(e) => setLogo(e.target.files?.[0] || null)}\n className=\"cnfy-file-input\"\n />\n </div>\n </div>\n\n </div>\n\n {/* Localization Settings */}\n <div className=\"cnfy-dash-card\">\n <h2 className=\"cnfy-dash-card-title\">Localization Settings</h2>\n\n {/* State */}\n <div className=\"cnfy-dash-field\">\n <label className=\"cnfy-dash-label\">State</label>\n <ClientSelect\n options={STATE_OPTIONS}\n value={state}\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n onChange={(option:any) => setState(option)}\n placeholder=\"Select state\"\n />\n </div>\n\n {/* City */}\n <div className=\"cnfy-dash-field\">\n <label className=\"cnfy-dash-label\">Cities</label>\n <ClientSelect\n isMulti={true}\n options={CITY_OPTIONS}\n value={cities}\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n onChange={(options) => setCities(options as any)}\n placeholder=\"Select cities\"\n isDisabled={!state}\n />\n </div>\n\n {/* Language */}\n <div className=\"cnfy-dash-field\">\n <label className=\"cnfy-dash-label\">Language</label>\n <ClientSelect\n options={LANGUAGE_OPTIONS}\n value={language}\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n onChange={(option:any) => setLanguage(option)}\n placeholder=\"Select language\"\n />\n </div>\n </div>\n\n {/* Content Settings */}\n <div className=\"cnfy-dash-card\">\n <h2 className=\"cnfy-dash-card-title\">Content Generation Settings</h2>\n\n {/* Tone */}\n <div className=\"cnfy-dash-field\">\n <label className=\"cnfy-dash-label\">Tone</label>\n <ClientSelect\n options={TONE_OPTIONS}\n value={tone}\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n onChange={(option: any) => setTone(option)}\n placeholder=\"Select tone\"\n />\n <p className=\"cnfy-dash-hint\">The writing tone for generated content</p>\n </div>\n\n {/* Style */}\n <div className=\"cnfy-dash-field\">\n <label className=\"cnfy-dash-label\">Style</label>\n <ClientSelect\n options={STYLE_OPTIONS}\n value={style}\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n onChange={(option: any) => setStyle(option)}\n placeholder=\"Select style\"\n />\n <p className=\"cnfy-dash-hint\">The format/style of generated articles</p>\n </div>\n\n {/* Word Count */}\n <div className=\"cnfy-dash-field\">\n <label className=\"cnfy-dash-label\">Word Count</label>\n <ClientSelect\n options={WORD_COUNT_OPTIONS}\n value={wordCount}\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n onChange={(option: any) => setWordCount(option)}\n placeholder=\"Select word count\"\n />\n <p className=\"cnfy-dash-hint\">Target length for generated content</p>\n </div>\n\n {/* Target Audience */}\n <div className=\"cnfy-dash-field\">\n <label className=\"cnfy-dash-label\">Target Audience</label>\n <input\n value={targetAudience}\n onChange={(e) => setTargetAudience(e.target.value)}\n className=\"cnfy-dash-input\"\n placeholder=\"e.g. tech-savvy millennials, business professionals\"\n />\n <p className=\"cnfy-dash-hint\">Describe your target audience for personalized content</p>\n </div>\n\n {/* Toggles */}\n <div className=\"cnfy-toggle-group\">\n <div className=\"cnfy-toggle-row\">\n <div>\n <p className=\"cnfy-toggle-label\">Include Quotes</p>\n <p className=\"cnfy-toggle-desc\">Add relevant quotes to generated articles</p>\n </div>\n <button\n type=\"button\"\n role=\"switch\"\n aria-checked={includeQuotes}\n onClick={() => setIncludeQuotes(!includeQuotes)}\n className=\"cnfy-toggle\"\n style={{ backgroundColor: includeQuotes ? primaryColor : '#d1d5db' }}\n >\n <span\n className={`cnfy-toggle-thumb ${\n includeQuotes ? 'cnfy-toggle-thumb--on' : ''\n }`}\n />\n </button>\n </div>\n\n <div className=\"cnfy-toggle-row\">\n <div>\n <p className=\"cnfy-toggle-label\">Include FAQ Section</p>\n <p className=\"cnfy-toggle-desc\">Add FAQ section at the end of articles</p>\n </div>\n <button\n type=\"button\"\n role=\"switch\"\n aria-checked={includeFAQ}\n onClick={() => setIncludeFAQ(!includeFAQ)}\n className=\"cnfy-toggle\"\n style={{ backgroundColor: includeFAQ ? primaryColor : '#d1d5db' }}\n >\n <span\n className={`cnfy-toggle-thumb ${\n includeFAQ ? 'cnfy-toggle-thumb--on' : ''\n }`}\n />\n </button>\n </div>\n </div>\n </div>\n\n {/* News Scraping */}\n <div className=\"cnfy-dash-card\">\n <div className=\"cnfy-dash-card-header\">\n <h2 className=\"cnfy-dash-card-title-inline\">News Scraping</h2>\n <p className=\"cnfy-dash-card-desc\">\n Scrape latest news from your configured locations\n </p>\n </div>\n\n {!loadingStatus && scrapeStatus && (\n <div className=\"cnfy-dash-grid cnfy-dash-grid--sm\">\n <div>\n <span className=\"cnfy-dash-label-muted\">Status:</span>\n <p className=\"cnfy-dash-label-bold\">\n {scrapeStatus.isRunning ? (\n <span className=\"cnfy-dash-badge cnfy-dash-badge--yellow\">Running</span>\n ) : (\n <span className=\"cnfy-dash-badge cnfy-dash-badge--green\">Idle</span>\n )}\n </p>\n </div>\n\n {scrapeStatus.lastRun && (\n <div>\n <span className=\"cnfy-dash-label-muted\">Last Run:</span>\n <p className=\"cnfy-dash-label-bold\">\n {new Date(scrapeStatus.lastRun).toLocaleString()}\n </p>\n </div>\n )}\n\n {scrapeStatus.totalScraped !== undefined && (\n <div>\n <span className=\"cnfy-dash-label-muted\">Total Scraped:</span>\n <p className=\"cnfy-dash-label-bold\">\n {scrapeStatus.totalScraped.toLocaleString()} articles\n </p>\n </div>\n )}\n </div>\n )}\n\n <div>\n <p className=\"cnfy-dash-info-text\">\n Current configuration: <strong>{preferences?.localization?.state}</strong>\n {preferences?.localization?.cities && preferences.localization.cities.length > 0 && (\n <> - {preferences.localization.cities.join(\", \")}</>\n )}\n </p>\n <button\n onClick={handleScrape}\n disabled={scraping || scrapeStatus?.isRunning}\n className=\"cnfy-dash-btn-save\"\n style={{ backgroundColor: primaryColor }}\n >\n {scraping ? \"Starting Scrape...\" : scrapeStatus?.isRunning ? \"Scraping in Progress...\" : \"Start Scraping\"}\n </button>\n </div>\n </div>\n\n {/* Save Button */}\n <div className=\"cnfy-dash-actions\">\n <button\n onClick={handleSave}\n disabled={saving}\n className=\"cnfy-dash-btn-save\"\n style={{ backgroundColor: primaryColor }}\n >\n {saving ? \"Saving...\" : \"Save Preferences\"}\n </button>\n\n {success && (\n <p className=\"cnfy-dash-success\" style={{ color: primaryColor }}>\n Preferences saved successfully ✅\n </p>\n )}\n </div>\n </div>\n )\n}\n","import api from \"@/lib/api\"\n\n/**\n * Trigger news scraping\n */\n\nexport const triggerScrape = async ({\n state,\n cities,\n}: {\n state?: string\n cities?: string[]\n}) => {\n const { data } = await api.post(\"/scrape/trigger\", {\n state,\n cities,\n })\n return data\n}\n\n/**\n * Get scraping status\n */\nexport const getScrapeStatus = async () => {\n const { data } = await api.get(\"/scrape/status\")\n return data.data\n}\n\n/**\n * Reset user data (daily limits, etc.)\n */\nexport const resetUserData = async () => {\n const { data } = await api.post(\"/users/reset\")\n return data\n}\n","import React, { useEffect, useState } from \"react\";\nimport type { Props as SelectProps } from \"react-select\";\n\ntype Option = {\n label: string;\n value: string;\n};\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nlet ReactSelect: any = null;\n\nconst ClientSelect = (props: SelectProps<Option, boolean>) => {\n const [mounted, setMounted] = useState(false);\n\n useEffect(() => {\n setMounted(true);\n import(\"react-select\").then((mod) => {\n ReactSelect = mod.default;\n });\n }, []);\n\n if (!mounted || !ReactSelect) return null;\n\n return <ReactSelect {...props} />;\n};\n\nexport default ClientSelect;\n","import api from \"@/lib/api\"\nimport { getApiBaseUrl, getApiKey } from \"@/lib/config\"\n\n/* ─── Types ─── */\n\nexport interface ContentOption {\n id: string\n name: string\n description?: string\n icon?: string\n}\n\nexport interface RecreateSettings {\n tones: string[]\n styles: string[]\n wordCounts?: string[]\n}\n\nexport interface AnalyzeInputResponse {\n hasUrl: boolean\n url?: string\n content?: string\n wordCount?: number\n options: ContentOption[]\n recreateSettings?: RecreateSettings\n}\n\nexport interface CreateContentPayload {\n url: string\n content: string\n actionId: string\n settings?: {\n tone?: string\n style?: string\n wordCount?: string\n }\n}\n\n/* ─── New API endpoints ─── */\n\n/**\n * Analyze user input for URLs and return content options\n */\nexport const analyzeInputApi = async (input: string): Promise<AnalyzeInputResponse> => {\n const { data } = await api.post(\"/chat/analyze-input\", { input })\n return data.data\n}\n\n/**\n * Create content based on selected action (non-streaming)\n */\nexport const createContentApi = async (payload: CreateContentPayload) => {\n const { data } = await api.post(\"/chat/create-content\", payload)\n return data.data\n}\n\n/**\n * Create content based on selected action (streaming)\n */\nexport const createContentStreamApi = async ({\n url,\n content,\n actionId,\n settings,\n onChunk,\n onComplete,\n onError,\n}: CreateContentPayload & {\n onChunk: (text: string) => void\n onComplete?: () => void\n onError?: (error: any) => void\n}) => {\n const API_BASE_URL = getApiBaseUrl()\n const apiKey = getApiKey()\n\n const headers: Record<string, string> = {\n \"Content-Type\": \"application/json\",\n }\n if (apiKey) {\n headers[\"x-api-key\"] = apiKey\n }\n\n const response = await fetch(`${API_BASE_URL}/chat/create-content/stream`, {\n method: \"POST\",\n headers,\n credentials: \"include\",\n body: JSON.stringify({ url, content, actionId, settings }),\n })\n\n if (!response.ok) {\n const errorText = await response.text()\n throw new Error(`HTTP error! status: ${response.status} - ${errorText}`)\n }\n\n const reader = response.body?.getReader()\n const decoder = new TextDecoder()\n\n if (!reader) {\n throw new Error(\"No reader available\")\n }\n\n let buffer = \"\"\n let hasReceivedData = false\n\n while (true) {\n const { done, value } = await reader.read()\n\n if (done) {\n if (hasReceivedData) onComplete?.()\n break\n }\n\n const chunk = decoder.decode(value, { stream: true })\n buffer += chunk\n\n const lines = buffer.split(\"\\n\")\n buffer = lines.pop() || \"\"\n\n for (const line of lines) {\n const trimmedLine = line.trim()\n if (trimmedLine === \"\") continue\n\n hasReceivedData = true\n\n if (trimmedLine.startsWith(\"data: \")) {\n const data = trimmedLine.slice(6).trim()\n\n if (data === \"[DONE]\") {\n onComplete?.()\n return\n }\n\n try {\n const parsed = JSON.parse(data)\n if (parsed.content) onChunk(parsed.content)\n else if (parsed.delta) onChunk(parsed.delta)\n else if (parsed.text) onChunk(parsed.text)\n else if (parsed.chunk) onChunk(parsed.chunk)\n else if (typeof parsed === \"string\") onChunk(parsed)\n } catch {\n if (data) onChunk(data)\n }\n } else if (trimmedLine) {\n onChunk(trimmedLine + \"\\n\")\n }\n }\n }\n\n if (!hasReceivedData) {\n throw new Error(\"No data received from stream\")\n }\n}\n\n/**\n * Get all available content creation options and settings\n */\nexport const getContentOptionsApi = async () => {\n const { data } = await api.get(\"/chat/content-options\")\n return data.data\n}\n\n/**\n * Streaming version of rewrite news API (like ChatGPT)\n * Calls the provided onChunk callback for each piece of streamed data\n */\nexport const rewriteNewsStreamApi = async ({\n article,\n language = \"English\",\n articleId,\n tone,\n style,\n wordCount,\n includeQuotes,\n includeFAQ,\n targetAudience,\n onChunk,\n onComplete,\n onError,\n}: {\n article: string\n language?: string\n articleId?: string\n tone?: string\n style?: string\n wordCount?: string\n includeQuotes?: boolean\n includeFAQ?: boolean\n targetAudience?: string\n onChunk: (text: string) => void\n onComplete?: () => void\n onError?: (error: any) => void\n}) => {\n const payload: Record<string, any> = {\n article,\n language,\n }\n\n // Include articleId if available\n if (articleId) {\n payload.articleId = articleId\n }\n\n // Include content generation preferences\n if (tone) payload.tone = tone\n if (style) payload.style = style\n if (wordCount) payload.wordCount = wordCount\n if (includeQuotes !== undefined) payload.includeQuotes = includeQuotes\n if (includeFAQ !== undefined) payload.includeFAQ = includeFAQ\n if (targetAudience) payload.targetAudience = targetAudience\n\n try {\n // Use the API base URL from config\n const API_BASE_URL = getApiBaseUrl()\n const apiKey = getApiKey()\n\n console.log(\"🚀 Starting stream request to:\", `${API_BASE_URL}/chat/rewrite/stream`)\n console.log(\"📦 Payload:\", payload)\n\n const headers: Record<string, string> = {\n \"Content-Type\": \"application/json\",\n }\n\n // Add API key if available\n if (apiKey) {\n headers[\"x-api-key\"] = apiKey\n }\n\n const response = await fetch(`${API_BASE_URL}/chat/rewrite/stream`, {\n method: \"POST\",\n headers,\n credentials: \"include\", // Include cookies for authentication\n body: JSON.stringify(payload),\n })\n\n console.log(\"📡 Response status:\", response.status)\n console.log(\"📡 Response headers:\", Object.fromEntries(response.headers.entries()))\n\n if (!response.ok) {\n const errorText = await response.text()\n console.error(\"❌ API Error:\", response.status, errorText)\n throw new Error(`HTTP error! status: ${response.status} - ${errorText}`)\n }\n\n const reader = response.body?.getReader()\n const decoder = new TextDecoder()\n\n if (!reader) {\n throw new Error(\"No reader available\")\n }\n\n let buffer = \"\"\n let hasReceivedData = false\n\n while (true) {\n const { done, value } = await reader.read()\n\n if (done) {\n if (hasReceivedData) {\n onComplete?.()\n }\n break\n }\n\n // Decode the chunk\n const chunk = decoder.decode(value, { stream: true })\n buffer += chunk\n\n // Process complete lines\n const lines = buffer.split(\"\\n\")\n buffer = lines.pop() || \"\" // Keep the incomplete line in buffer\n\n for (const line of lines) {\n const trimmedLine = line.trim()\n if (trimmedLine === \"\") continue\n\n hasReceivedData = true\n console.log(\"📨 Received line:\", trimmedLine.substring(0, 100) + (trimmedLine.length > 100 ? \"...\" : \"\"))\n\n // Handle SSE format (data: {...})\n if (trimmedLine.startsWith(\"data: \")) {\n const data = trimmedLine.slice(6).trim()\n\n if (data === \"[DONE]\") {\n console.log(\"✅ Stream completed with [DONE] signal\")\n onComplete?.()\n return\n }\n\n try {\n const parsed = JSON.parse(data)\n console.log(\"📋 Parsed JSON:\", parsed)\n\n if (parsed.content) {\n onChunk(parsed.content)\n } else if (parsed.delta) {\n onChunk(parsed.delta)\n } else if (parsed.text) {\n onChunk(parsed.text)\n } else if (parsed.chunk) {\n onChunk(parsed.chunk)\n } else if (typeof parsed === 'string') {\n onChunk(parsed)\n } else {\n console.warn(\"⚠️ Unknown JSON format:\", parsed)\n }\n } catch (e) {\n // If not JSON, treat as plain text\n console.log(\"📝 Non-JSON data, treating as plain text\")\n if (data) {\n onChunk(data)\n }\n }\n } else {\n // Plain text streaming (non-SSE format)\n console.log(\"📄 Plain text chunk\")\n if (trimmedLine) {\n onChunk(trimmedLine + \"\\n\")\n }\n }\n }\n }\n\n if (!hasReceivedData) {\n console.error(\"❌ No data received from stream\")\n throw new Error(\"No data received from stream\")\n }\n\n console.log(\"✅ Stream completed successfully\")\n } catch (error: any) {\n console.error(\"❌ Streaming error:\", error)\n console.error(\"Error details:\", {\n message: error.message,\n name: error.name,\n stack: error.stack\n })\n onError?.(error)\n throw error\n }\n}\n\n/**\n * Non-streaming version (fallback)\n */\nexport const rewriteNewsApi = async ({\n article,\n language = \"English\",\n articleId,\n tone,\n style,\n wordCount,\n includeQuotes,\n includeFAQ,\n targetAudience,\n}: {\n article: string\n language?: string\n articleId?: string\n tone?: string\n style?: string\n wordCount?: string\n includeQuotes?: boolean\n includeFAQ?: boolean\n targetAudience?: string\n}) => {\n const payload: Record<string, any> = {\n article,\n language,\n }\n\n // Include articleId if available\n if (articleId) {\n payload.articleId = articleId\n }\n\n // Include content generation preferences\n if (tone) payload.tone = tone\n if (style) payload.style = style\n if (wordCount) payload.wordCount = wordCount\n if (includeQuotes !== undefined) payload.includeQuotes = includeQuotes\n if (includeFAQ !== undefined) payload.includeFAQ = includeFAQ\n if (targetAudience) payload.targetAudience = targetAudience\n\n const { data } = await api.post(\"/chat/rewrite\", payload)\n\n return data.data;\n}\n"],"mappings":"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","names":["import_react","axios","import_react","import_lucide_react","import_react","import_lucide_react","import_react","import_react","import_jsx_runtime","StarterKit","Placeholder","editor","import_jsx_runtime","import_react","import_lucide_react","import_jsx_runtime","import_jsx_runtime","_a","Select","import_lucide_react","import_jsx_runtime","import_jsx_runtime","import_react","import_lucide_react","import_jsx_runtime","import_react","import_react","import_jsx_runtime","import_jsx_runtime","_a","_b","toast","_c","import_react_hot_toast","import_lucide_react","import_jsx_runtime","toast","import_jsx_runtime"]}
1
+ {"version":3,"sources":["../src/index.tsx","../contexts/PreferencesContext.tsx","../lib/api.ts","../lib/config.ts","../services/preferences.service.ts","../components/chatbot/ChatBot.tsx","../util/util.ts","../components/chatbot/ChatWindow.tsx","../components/chatbot/EditModal.tsx","../components/chatbot/RichTextEditor.tsx","../hooks/useTheme.ts","../components/news/NewsList.tsx","../services/news.service.ts","../components/chatbot/UserMenu.tsx","../components/chatbot/headerBar.tsx","../components/ui/Drawer.tsx","../components/preferences/Preferences.tsx","../services/settings.service.ts","../components/ClientSelect.tsx","../services/chat.service.ts"],"sourcesContent":["\"use client\"\n\nimport { useEffect } from \"react\"\nimport { PreferencesProvider } from \"../contexts/PreferencesContext\"\nimport ChatBot from \"../components/chatbot/ChatBot\"\nimport { setConfig } from \"../lib/config\"\n\nexport interface ContenifyChatBotProps {\n apiUrl?: string\n apiKey?: string\n domain?: string\n onPost?: (content: string, keywords: string[]) => void\n}\n\nexport function ContenifyChatBot({ apiUrl, apiKey, domain, onPost }: ContenifyChatBotProps) {\n useEffect(() => {\n setConfig({ apiUrl, apiKey, domain })\n }, [apiUrl, apiKey, domain])\n\n return (\n <PreferencesProvider>\n <ChatBot onPost={onPost} />\n </PreferencesProvider>\n )\n}\n\nexport default ContenifyChatBot\n\n// Re-export types for consumers\nexport type {\n ChatbotPreferences,\n LocalizationPreferences,\n AppearancePreferences,\n ContentPreferences,\n Preferences,\n} from \"../contexts/PreferencesContext\"\n\nexport type {\n ContentOption,\n AnalyzeInputResponse,\n CreateContentPayload,\n RecreateSettings,\n} from \"../services/chat.service\"\n\n// Re-export config utilities for consumers\nexport { setConfig } from \"../lib/config\"\n","'use client'\nimport { createContext, useContext, useState, useEffect, ReactNode } from 'react'\nimport { getMyPreferencesApi } from '@/services/preferences.service'\nimport { getServerBaseUrl } from '@/lib/config'\n\nexport interface ChatbotPreferences {\n name: string\n logoUrl?: string\n primaryColor: string\n secondaryColor: string\n theme: 'light' | 'dark' | 'system'\n}\n\nexport interface LocalizationPreferences {\n country: string\n state: string\n cities: string[]\n language: string\n locale: string\n timezone: string\n}\n\nexport interface AppearancePreferences {\n showSidebar: boolean\n showHeader: boolean\n activeThemePreset: string | null\n showNewsPanel: boolean\n}\n\nexport interface ContentPreferences {\n tone: 'formal' | 'casual' | 'engaging' | 'professional'\n style: 'news' | 'blog' | 'editorial' | 'summary'\n wordCount: 'short' | 'medium' | 'long'\n includeQuotes: boolean\n includeFAQ: boolean\n targetAudience: string\n}\n\nexport interface Preferences {\n chatbot: ChatbotPreferences\n localization: LocalizationPreferences\n appearance: AppearancePreferences\n content: ContentPreferences\n _id?: string\n user?: string\n isActive?: boolean\n createdAt?: string\n updatedAt?: string\n}\n\ninterface PreferencesContextType {\n preferences: Preferences | null\n loading: boolean\n error: string | null\n refreshPreferences: () => Promise<void>\n updatePreferences: (newPreferences: Preferences) => void\n}\n\nconst defaultPreferences: Preferences = {\n chatbot: {\n name: 'AI News Assistant',\n primaryColor: '#10b981',\n secondaryColor: '#064e3b',\n theme: 'system',\n },\n localization: {\n country: 'India',\n state: 'Uttar Pradesh',\n cities: [],\n language: 'en',\n locale: 'en-IN',\n timezone: 'Asia/Kolkata',\n },\n appearance: {\n showSidebar: true,\n showHeader: true,\n activeThemePreset: null,\n showNewsPanel: true,\n },\n content: {\n tone: 'engaging',\n style: 'blog',\n wordCount: 'medium',\n includeQuotes: true,\n includeFAQ: false,\n targetAudience: '',\n },\n}\n\nconst PreferencesContext = createContext<PreferencesContextType | undefined>(undefined)\n\nexport function PreferencesProvider({ children }: { children: ReactNode }) {\n const [preferences, setPreferences] = useState<Preferences | null>(defaultPreferences)\n const [loading, setLoading] = useState(true)\n const [error, setError] = useState<string | null>(null)\n\n const refreshPreferences = async () => {\n try {\n setLoading(true)\n setError(null)\n const data = await getMyPreferencesApi()\n\n if (data) {\n // Ensure logoUrl has full path\n if (data.chatbot?.logoUrl && !data.chatbot.logoUrl.startsWith('http')) {\n data.chatbot.logoUrl = `${getServerBaseUrl()}/${data.chatbot.logoUrl}`\n }\n\n // Merge API response with defaults to ensure all fields exist\n const mergedPreferences: Preferences = {\n ...defaultPreferences,\n ...data,\n chatbot: {\n ...defaultPreferences.chatbot,\n ...data.chatbot,\n },\n localization: {\n ...defaultPreferences.localization,\n ...data.localization,\n },\n appearance: {\n ...defaultPreferences.appearance,\n ...data.appearance,\n },\n content: {\n ...defaultPreferences.content,\n ...data.content,\n },\n }\n\n setPreferences(mergedPreferences)\n\n // Apply CSS variables for colors\n if (typeof document !== 'undefined') {\n document.documentElement.style.setProperty('--color-primary', mergedPreferences.chatbot?.primaryColor || '#10b981')\n document.documentElement.style.setProperty('--color-secondary', mergedPreferences.chatbot?.secondaryColor || '#064e3b')\n }\n }\n } catch (err) {\n console.error('Failed to fetch preferences:', err)\n setError(err instanceof Error ? err.message : 'Failed to load preferences')\n setPreferences(defaultPreferences)\n } finally {\n setLoading(false)\n }\n }\n\n const updatePreferences = (newPreferences: Preferences) => {\n setPreferences(newPreferences)\n\n // Apply CSS variables for colors\n if (typeof document !== 'undefined') {\n document.documentElement.style.setProperty('--color-primary', newPreferences.chatbot?.primaryColor || '#10b981')\n document.documentElement.style.setProperty('--color-secondary', newPreferences.chatbot?.secondaryColor || '#064e3b')\n }\n }\n\n useEffect(() => {\n refreshPreferences()\n }, [])\n\n return (\n <PreferencesContext.Provider\n value={{\n preferences,\n loading,\n error,\n refreshPreferences,\n updatePreferences,\n }}\n >\n {children}\n </PreferencesContext.Provider>\n )\n}\n\nexport function usePreferences() {\n const context = useContext(PreferencesContext)\n if (context === undefined) {\n throw new Error('usePreferences must be used within a PreferencesProvider')\n }\n return context\n}\n","import axios from \"axios\"\nimport { getApiBaseUrl, getApiKey } from \"./config\"\n\nconst api = axios.create({\n baseURL: getApiBaseUrl(),\n withCredentials: true,\n headers: {\n \"Content-Type\": \"application/json\",\n },\n})\n\n/**\n * Request middleware\n */\napi.interceptors.request.use(\n (config) => {\n const apiKey = getApiKey()\n if (apiKey) {\n config.headers[\"x-api-key\"] = apiKey\n }\n return config\n },\n (error) => Promise.reject(error)\n)\n\n/**\n * Response middleware\n */\napi.interceptors.response.use(\n (response) => response,\n (error) => {\n // Centralized error handling\n const message =\n error.response?.data?.message ||\n error.message ||\n \"Something went wrong\"\n\n return Promise.reject(message)\n }\n)\n\nexport default api\n","let _apiUrl = process.env.NEXT_PUBLIC_CONTENIFY_API_URL || \"http://localhost:8080/api\"\nlet _apiKey = process.env.NEXT_PUBLIC_API_KEY || \"\"\nlet _domain = process.env.NEXT_PUBLIC_DOMAIN || \"\"\n\nexport function setConfig(config: { apiUrl?: string; apiKey?: string; domain?: string }) {\n if (config.apiUrl) _apiUrl = config.apiUrl\n if (config.apiKey) _apiKey = config.apiKey\n if (config.domain) _domain = config.domain\n}\n\nexport function getApiBaseUrl(): string {\n return _apiUrl\n}\n\nexport function getServerBaseUrl(): string {\n return _apiUrl.replace(/\\/api\\/?$/, \"\")\n}\n\nexport function getApiKey(): string {\n return _apiKey\n}\n\nexport function getDomain(): string {\n return _domain\n}\n","import api from \"@/lib/api\"\n\n/**\n * Get logged-in user's chatbot preferences\n */\nexport const getMyPreferencesApi = async () => {\n const { data } = await api.get(\"/chatboat/preferences/me\")\n return data.data\n}\n\n/**\n * Create or update chatbot preferences\n */\nexport const savePreferencesApi = async ({\n botName,\n logo,\n state,\n cities,\n primaryColor,\n secondaryColor,\n theme,\n language,\n showSidebar,\n showHeader,\n activeThemePreset,\n showNewsPanel,\n tone,\n style,\n wordCount,\n includeQuotes,\n includeFAQ,\n targetAudience,\n}: {\n botName?: string\n logo?: File | null\n state?: string\n cities?: string[]\n primaryColor?: string\n secondaryColor?: string\n theme?: \"light\" | \"dark\" | \"system\"\n language?: string\n showSidebar?: boolean\n showHeader?: boolean\n activeThemePreset?: string | null\n showNewsPanel?: boolean\n tone?: string\n style?: string\n wordCount?: string\n includeQuotes?: boolean\n includeFAQ?: boolean\n targetAudience?: string\n}) => {\n const formData = new FormData()\n\n if (botName) {\n formData.append(\"botName\", botName)\n }\n\n if (logo) {\n formData.append(\"logo\", logo)\n }\n\n if (state) {\n formData.append(\"state\", state)\n }\n\n if (cities) {\n formData.append(\"cities\", JSON.stringify(cities))\n }\n\n if (primaryColor) {\n formData.append(\"primaryColor\", primaryColor)\n }\n\n if (secondaryColor) {\n formData.append(\"secondaryColor\", secondaryColor)\n }\n\n if (theme) {\n formData.append(\"theme\", theme)\n }\n\n if (language) {\n formData.append(\"language\", language)\n }\n\n if (showSidebar !== undefined) {\n formData.append(\"showSidebar\", String(showSidebar))\n }\n\n if (showHeader !== undefined) {\n formData.append(\"showHeader\", String(showHeader))\n }\n\n if (activeThemePreset !== undefined) {\n formData.append(\"activeThemePreset\", activeThemePreset ?? \"\")\n }\n\n if (showNewsPanel !== undefined) {\n formData.append(\"showNewsPanel\", String(showNewsPanel))\n }\n\n if (tone) {\n formData.append(\"tone\", tone)\n }\n\n if (style) {\n formData.append(\"style\", style)\n }\n\n if (wordCount) {\n formData.append(\"wordCount\", wordCount)\n }\n\n if (includeQuotes !== undefined) {\n formData.append(\"includeQuotes\", String(includeQuotes))\n }\n\n if (includeFAQ !== undefined) {\n formData.append(\"includeFAQ\", String(includeFAQ))\n }\n\n if (targetAudience !== undefined) {\n formData.append(\"targetAudience\", targetAudience)\n }\n\n const { data } = await api.put(\"/chatboat/preferences\", formData, {\n headers: {\n \"Content-Type\": \"multipart/form-data\",\n },\n })\n\n return data.data\n}\n\n/**\n * Reset chatbot preferences\n */\nexport const resetPreferencesApi = async () => {\n const { data } = await api.delete(\"/chatboat/preferences/me\")\n return data\n}\n","\"use client\"\n\nimport { useState } from \"react\"\nimport ChatWindow from \"./ChatWindow\"\nimport HeaderBar from \"./headerBar\"\nimport Drawer from \"../ui/Drawer\"\nimport PreferencesPage from \"../preferences/Preferences\"\nimport {\n rewriteNewsStreamApi,\n rewriteNewsApi,\n analyzeInputApi,\n createContentStreamApi,\n createContentApi,\n type ContentOption,\n} from \"@/services/chat.service\"\nimport { useTheme } from \"@/hooks/useTheme\"\nimport { usePreferences } from \"@/contexts/PreferencesContext\"\nimport toast from \"react-hot-toast\"\nimport { Loader2 } from \"lucide-react\"\n\ntype ChatMessage = {\n id: string\n role: \"user\" | \"assistant\"\n content: string\n}\n\nexport default function ChatBot({ onPost }: { onPost?: (content: string, keywords: string[]) => void }) {\n const { loading } = useTheme()\n const { preferences } = usePreferences()\n const [preferencesOpen, setPreferencesOpen] = useState(false)\n const [messages, setMessages] = useState<ChatMessage[]>([])\n const [isStreaming, setIsStreaming] = useState(false)\n const [analyzedData, setAnalyzedData] = useState<{\n url: string\n content: string\n options: ContentOption[]\n messageId: string\n } | null>(null)\n\n\nconst handleRecreate = async ({ title, content, id }: { title: string; content?: string; id?: string }) => {\n const assistantId = crypto.randomUUID()\n\n // Add user message and empty assistant message\n setMessages(prev => [\n ...prev,\n {\n id: crypto.randomUUID(),\n role: \"user\",\n content: `Recreate this news:\\n${title}`,\n },\n {\n id: assistantId,\n role: \"assistant\",\n content: \"⏳ Creating article...\",\n },\n ])\n\n try {\n let accumulatedContent = \"\"\n let hasStartedStreaming = false\n\n // Get content preferences\n const contentPrefs = preferences?.content\n const lang = preferences?.localization?.language === \"hi\" ? \"Hindi\" : \"English\"\n\n // Try streaming API first\n try {\n await rewriteNewsStreamApi({\n article: content || \"\",\n language: lang,\n articleId: id,\n tone: contentPrefs?.tone,\n style: contentPrefs?.style,\n wordCount: contentPrefs?.wordCount,\n includeQuotes: contentPrefs?.includeQuotes,\n includeFAQ: contentPrefs?.includeFAQ,\n targetAudience: contentPrefs?.targetAudience,\n onChunk: (chunk: string) => {\n hasStartedStreaming = true\n // Accumulate the streamed content\n accumulatedContent += chunk\n\n // Update the message in real-time with streaming content\n setMessages(prev =>\n prev.map(m =>\n m.id === assistantId\n ? { ...m, content: accumulatedContent }\n : m\n )\n )\n },\n onComplete: () => {\n console.log(\"Streaming completed successfully\")\n toast.success(\"Article created successfully!\")\n },\n onError: async (error) => {\n console.error(\"Streaming error:\", error)\n\n // If streaming hasn't started, try fallback to regular API\n if (!hasStartedStreaming) {\n console.log(\"Falling back to regular API...\")\n throw error // Will be caught by outer catch\n } else {\n toast.error(\"Failed to complete article generation\")\n setMessages(prev =>\n prev.map(m =>\n m.id === assistantId\n ? { ...m, content: accumulatedContent || \"❌ Failed to create article. Please try again.\" }\n : m\n )\n )\n }\n },\n })\n } catch (streamError) {\n // Fallback to regular API if streaming fails\n console.log(\"Streaming failed, using regular API...\", streamError)\n\n setMessages(prev =>\n prev.map(m =>\n m.id === assistantId\n ? { ...m, content: \"⏳ Generating with regular API...\" }\n : m\n )\n )\n\n const result = await rewriteNewsApi({\n article: content || \"\",\n language: lang,\n articleId: id,\n tone: contentPrefs?.tone,\n style: contentPrefs?.style,\n wordCount: contentPrefs?.wordCount,\n includeQuotes: contentPrefs?.includeQuotes,\n includeFAQ: contentPrefs?.includeFAQ,\n targetAudience: contentPrefs?.targetAudience,\n })\n\n setMessages(prev =>\n prev.map(m =>\n m.id === assistantId\n ? { ...m, content: result.article || result }\n : m\n )\n )\n\n toast.success(\"Article created successfully!\")\n }\n } catch (err) {\n console.error(\"Complete Error:\", err)\n toast.error((err as Error)?.message || \"An error occurred while creating the article\")\n setMessages(prev =>\n prev.map(m =>\n m.id === assistantId\n ? { ...m, content: \"❌ Failed to create article. Please try again.\" }\n : m\n )\n )\n }\n}\n\n\n\n const handleSendMessage = async (text: string) => {\n const userMsgId = crypto.randomUUID()\n const assistantId = crypto.randomUUID()\n\n // Add user message\n setMessages(prev => [\n ...prev,\n { id: userMsgId, role: \"user\", content: text },\n ])\n\n // Check if input contains a URL\n const urlRegex = /https?:\\/\\/[^\\s]+/\n const hasUrl = urlRegex.test(text)\n\n if (hasUrl) {\n // Show analyzing state\n setMessages(prev => [\n ...prev,\n { id: assistantId, role: \"assistant\", content: \"🔍 Analyzing your link...\" },\n ])\n\n try {\n const result = await analyzeInputApi(text)\n\n if (result.hasUrl && result.options?.length > 0) {\n // Store analyzed data for when user picks an action\n setAnalyzedData({\n url: result.url || \"\",\n content: result.content || \"\",\n options: result.options,\n messageId: assistantId,\n })\n\n // Show options as assistant message\n const optionsList = result.options\n .map((opt) => `• **${opt.name}**${opt.description ? ` – ${opt.description}` : \"\"}`)\n .join(\"\\n\")\n\n setMessages(prev =>\n prev.map(m =>\n m.id === assistantId\n ? {\n ...m,\n content: `I found an article (${result.wordCount || 0} words). What would you like to do?\\n\\n${optionsList}`,\n }\n : m\n )\n )\n } else {\n setMessages(prev =>\n prev.map(m =>\n m.id === assistantId\n ? { ...m, content: \"Could not extract content from that URL. Please try a different link.\" }\n : m\n )\n )\n }\n } catch (err) {\n console.error(\"Analyze input error:\", err)\n toast.error(\"Failed to analyze the link\")\n setMessages(prev =>\n prev.map(m =>\n m.id === assistantId\n ? { ...m, content: \"❌ Failed to analyze the link. Please try again.\" }\n : m\n )\n )\n }\n } else {\n // No URL — send as regular chat (recreate flow with the text as article)\n setMessages(prev => [\n ...prev,\n { id: assistantId, role: \"assistant\", content: \"⏳ Generating content...\" },\n ])\n setIsStreaming(true)\n\n try {\n const contentPrefs = preferences?.content\n const lang = preferences?.localization?.language === \"hi\" ? \"Hindi\" : \"English\"\n let accumulatedContent = \"\"\n\n await rewriteNewsStreamApi({\n article: text,\n language: lang,\n tone: contentPrefs?.tone,\n style: contentPrefs?.style,\n wordCount: contentPrefs?.wordCount,\n includeQuotes: contentPrefs?.includeQuotes,\n includeFAQ: contentPrefs?.includeFAQ,\n targetAudience: contentPrefs?.targetAudience,\n onChunk: (chunk: string) => {\n accumulatedContent += chunk\n setMessages(prev =>\n prev.map(m =>\n m.id === assistantId ? { ...m, content: accumulatedContent } : m\n )\n )\n },\n onComplete: () => {\n setIsStreaming(false)\n toast.success(\"Content generated!\")\n },\n onError: (error) => {\n console.error(\"Stream error:\", error)\n setIsStreaming(false)\n toast.error(\"Failed to generate content\")\n },\n })\n } catch (err) {\n console.error(\"Send message error:\", err)\n setIsStreaming(false)\n setMessages(prev =>\n prev.map(m =>\n m.id === assistantId\n ? { ...m, content: \"❌ Failed to generate content. Please try again.\" }\n : m\n )\n )\n }\n }\n }\n\n /**\n * Handle when user selects a content action option (e.g. Recreate, Summary, etc.)\n */\n const handleSelectAction = async (actionId: string, url: string, content: string) => {\n const assistantId = crypto.randomUUID()\n\n // Clear analyzed data\n setAnalyzedData(null)\n\n const actionName = analyzedData?.options.find(o => o.id === actionId)?.name || actionId\n\n setMessages(prev => [\n ...prev,\n { id: crypto.randomUUID(), role: \"user\", content: `Action: ${actionName}` },\n { id: assistantId, role: \"assistant\", content: \"⏳ Creating content...\" },\n ])\n setIsStreaming(true)\n\n try {\n const contentPrefs = preferences?.content\n let accumulatedContent = \"\"\n\n try {\n // Try streaming first\n await createContentStreamApi({\n url,\n content,\n actionId,\n settings: {\n tone: contentPrefs?.tone,\n style: contentPrefs?.style,\n wordCount: contentPrefs?.wordCount,\n },\n onChunk: (chunk: string) => {\n accumulatedContent += chunk\n setMessages(prev =>\n prev.map(m =>\n m.id === assistantId ? { ...m, content: accumulatedContent } : m\n )\n )\n },\n onComplete: () => {\n setIsStreaming(false)\n toast.success(\"Content created!\")\n },\n onError: (error) => {\n console.error(\"Stream error:\", error)\n setIsStreaming(false)\n toast.error(\"Failed to create content\")\n },\n })\n } catch {\n // Fallback to non-streaming\n const result = await createContentApi({ url, content, actionId, settings: {\n tone: contentPrefs?.tone,\n style: contentPrefs?.style,\n wordCount: contentPrefs?.wordCount,\n }})\n\n setMessages(prev =>\n prev.map(m =>\n m.id === assistantId\n ? { ...m, content: result.article || result.content || JSON.stringify(result) }\n : m\n )\n )\n setIsStreaming(false)\n toast.success(\"Content created!\")\n }\n } catch (err) {\n console.error(\"Create content error:\", err)\n setIsStreaming(false)\n setMessages(prev =>\n prev.map(m =>\n m.id === assistantId\n ? { ...m, content: \"❌ Failed to create content. Please try again.\" }\n : m\n )\n )\n }\n }\n\n // Show loading screen while preferences are loading\n if (loading) {\n return (\n <div className=\"cnfy-loading\">\n <div className=\"cnfy-loading-inner\">\n <Loader2 className=\"cnfy-loading-spinner cnfy-animate-spin\" />\n <p className=\"cnfy-loading-text\">Loading...</p>\n </div>\n </div>\n )\n }\n\n return (\n <div className=\"cnfy-root\">\n\n <HeaderBar onOpenPreferences={() => setPreferencesOpen(true)} />\n\n <div className=\"cnfy-main\">\n <section className=\"cnfy-chat-section cnfy-chat-section--full\">\n {/* Chat window */}\n <div className=\"cnfy-chat-inner\">\n <ChatWindow\n messages={messages}\n onSend={handleSendMessage}\n onSelectNews={handleRecreate}\n isStreaming={isStreaming}\n analyzedData={analyzedData}\n onSelectAction={handleSelectAction}\n onPost={onPost}\n />\n </div>\n\n {!messages.length && (\n <div className=\"cnfy-empty-state\">\n <div>\n <p className=\"cnfy-empty-state-title\">AI News Assistant</p>\n <p className=\"cnfy-empty-state-subtitle\">\n Type a message or paste a link to begin\n </p>\n </div>\n </div>\n )}\n </section>\n </div>\n\n <Drawer\n open={preferencesOpen}\n onClose={() => setPreferencesOpen(false)}\n title=\"Settings\"\n >\n <PreferencesPage />\n </Drawer>\n </div>\n )\n}\n","export function extractArticleContent(raw?: string): {\n title?: string\n article: string\n metaKeywords: string[]\n} {\n if (!raw) {\n return { article: \"\", metaKeywords: [] }\n }\n\n // Plain text (non-JSON)\n if (!raw.trim().startsWith(\"{\")) {\n return {\n article: raw,\n metaKeywords: [],\n }\n }\n\n try {\n const parsed = JSON.parse(raw)\n\n return {\n title: parsed.title || \"\",\n article: parsed.article || parsed.content || \"\",\n metaKeywords: Array.isArray(parsed.metaKeywords)\n ? parsed.metaKeywords\n : [],\n }\n } catch {\n // 🔹 Fallback for partial / broken JSON streams\n const article =\n raw\n .replace(/^[\\s\\S]*?\"article\"\\s*:\\s*\"/, \"\")\n .replace(/\"\\s*,\\s*\"metaKeywords\"[\\s\\S]*$/, \"\")\n .replace(/\"}\\s*$/, \"\") || raw\n\n return {\n article,\n metaKeywords: [],\n }\n }\n}\n\n\nexport const hexToRgba = (hex: string, opacity: number) => {\n const sanitizedHex = hex.replace(\"#\", \"\");\n\n const r = parseInt(sanitizedHex.substring(0, 2), 16);\n const g = parseInt(sanitizedHex.substring(2, 4), 16);\n const b = parseInt(sanitizedHex.substring(4, 6), 16);\n\n return `rgba(${r}, ${g}, ${b}, ${opacity})`;\n};","\"use client\"\n\nimport { extractArticleContent } from \"@/util/util\"\nimport { Check, Copy, Edit3, Send, SendHorizontal, Zap, X, RefreshCcw, FileText, ListChecks, Share2, BookOpen, Mail, Key } from \"lucide-react\"\nimport type { ContentOption } from \"@/services/chat.service\"\nimport { useLayoutEffect, useRef, useState, useEffect } from \"react\"\nimport EditModal from \"./EditModal\"\nimport NewsList from \"../news/NewsList\"\nimport { getTrendingNews, getNewsSources, getNewsBySource, scrapeNewsSource } from \"@/services/news.service\"\nimport Select, { SingleValue } from \"react-select\"\nimport { useTheme } from \"@/hooks/useTheme\"\nimport { usePreferences } from \"@/contexts/PreferencesContext\"\n\ninterface SourceOption {\n value: string | null\n label: string\n}\n\ntype ChatMessage = {\n id: string\n role: \"user\" | \"assistant\"\n content: string\n}\n\ntype Block =\n | { type: \"h1\"; text: string }\n | { type: \"h2\"; text: string }\n | { type: \"p\"; text: string }\n\nconst ACTION_ICONS: Record<string, typeof FileText> = {\n recreate_article: RefreshCcw,\n create_summary: ListChecks,\n create_social_posts: Share2,\n create_blog_post: BookOpen,\n create_newsletter: Mail,\n extract_key_points: Key,\n}\n\nexport default function ChatWindow({\n messages,\n onSend,\n onSelectNews,\n isStreaming = false,\n analyzedData,\n onSelectAction,\n onPost: onPostCallback,\n}: {\n messages: ChatMessage[]\n onSend: (message: string) => void\n onSelectNews?: (news: { title: string; content?: string; id?: string }) => void\n isStreaming?: boolean\n analyzedData?: {\n url: string\n content: string\n options: ContentOption[]\n messageId: string\n } | null\n onSelectAction?: (actionId: string, url: string, content: string) => void\n onPost?: (content: string, keywords: string[]) => void\n}) {\n const { loading, showNewsPanel } = useTheme()\n const bottomRef = useRef<HTMLDivElement>(null)\n const textareaRef = useRef<HTMLTextAreaElement>(null)\n const dropdownRef = useRef<HTMLDivElement>(null)\n const [input, setInput] = useState(\"\")\n const [copiedId, setCopiedId] = useState<string | null>(null)\n const [showNewsDropdown, setShowNewsDropdown] = useState(false)\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const [trendingNews, setTrendingNews] = useState<any[]>([])\n const [loadingNews, setLoadingNews] = useState(false)\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const [sources, setSources] = useState<any[]>([])\n const [selectedSource, setSelectedSource] = useState<string | null>(null)\n const [loadingSources, setLoadingSources] = useState(false)\n const [scraping, setScraping] = useState(false)\n const [editModal, setEditModal] = useState<{\n isOpen: boolean\n content: string\n metaKeywords: string[]\n messageId: string\n }>({ isOpen: false, content: \"\", metaKeywords: [], messageId: \"\" })\n\n const { primaryColor } = useTheme();\n const { preferences } = usePreferences();\n const preferredLanguage = preferences?.localization?.language;\n\n\n const handleCopy = async (blocks: Block[], messageId: string) => {\n try {\n const formattedText = blocksToFormattedText(blocks)\n await navigator.clipboard.writeText(formattedText)\n setCopiedId(messageId)\n setTimeout(() => setCopiedId(null), 2000)\n } catch (err) {\n console.error(\"Failed to copy:\", err)\n }\n }\n\n // Convert parsed blocks to formatted text for editing\n const blocksToFormattedText = (blocks: Block[]): string => {\n return blocks\n .map(block => {\n if (block.type === \"h1\") return `# ${block.text}`\n if (block.type === \"h2\") return `## ${block.text}`\n return block.text\n })\n .join(\"\\n\\n\")\n }\n\n const handleEdit = (blocks: Block[], metaKeywords: string[], messageId: string) => {\n const formattedContent = blocksToFormattedText(blocks)\n setEditModal({ isOpen: true, content: formattedContent, metaKeywords, messageId })\n }\n\n const handleCloseModal = () => {\n setEditModal({ isOpen: false, content: \"\", metaKeywords: [], messageId: \"\" })\n }\n\n const handleSaveDraft = (content: string, keywords: string[]) => {\n console.log(\"Saving draft:\", { content, keywords })\n // TODO: Implement save draft logic\n handleCloseModal()\n }\n\n const handlePost = (content: string, keywords: string[]) => {\n onPostCallback?.(content, keywords)\n handleCloseModal()\n }\n\n useLayoutEffect(() => {\n bottomRef.current?.scrollIntoView({ block: \"end\" })\n }, [messages])\n\n const handleSend = () => {\n if (!input.trim()) return\n onSend(input)\n setInput(\"\")\n if (textareaRef.current) {\n textareaRef.current.style.height = \"auto\"\n }\n }\n\n // Auto-resize textarea based on content\n useEffect(() => {\n const textarea = textareaRef.current\n if (textarea) {\n textarea.style.height = \"auto\"\n textarea.style.height = `${textarea.scrollHeight}px`\n }\n }, [input])\n\n const fetchSources = async () => {\n setLoadingSources(true)\n try {\n const data = await getNewsSources()\n setSources(data || [])\n } catch (err) {\n console.error(\"Failed to fetch sources:\", err)\n } finally {\n setLoadingSources(false)\n }\n }\n\n const fetchNews = async (sourceId: string | null) => {\n setLoadingNews(true)\n try {\n let data\n if (sourceId) {\n data = await getNewsBySource(sourceId)\n } else {\n data = await getTrendingNews()\n }\n setTrendingNews(data || [])\n } catch (err) {\n console.error(\"Failed to fetch news:\", err)\n } finally {\n setLoadingNews(false)\n }\n }\n\n const handleScrape = async () => {\n if (!selectedSource) return\n setScraping(true)\n try {\n await scrapeNewsSource(selectedSource)\n await fetchNews(selectedSource)\n } catch (err) {\n console.error(\"Failed to scrape:\", err)\n } finally {\n setScraping(false)\n }\n }\n\n const handleSourceSelect = (option: SingleValue<SourceOption>) => {\n const sourceId = option?.value ?? null\n setSelectedSource(sourceId)\n fetchNews(sourceId)\n }\n\n const handleOpenNewsDropdown = () => {\n setShowNewsDropdown(true)\n if (sources.length === 0) {\n fetchSources()\n }\n if (trendingNews.length === 0) {\n fetchNews(selectedSource)\n }\n }\n\n // Close dropdown when clicking outside\n useEffect(() => {\n const handleClickOutside = (event: MouseEvent) => {\n if (dropdownRef.current && !dropdownRef.current.contains(event.target as Node)) {\n setShowNewsDropdown(false)\n }\n }\n\n if (showNewsDropdown) {\n document.addEventListener(\"mousedown\", handleClickOutside)\n }\n\n return () => {\n document.removeEventListener(\"mousedown\", handleClickOutside)\n }\n }, [showNewsDropdown])\n\n function formatAIContent(raw?: string): {\n blocks: Block[]\n metaKeywords: string[]\n } {\n const extracted = extractArticleContent(raw)\n\n if (!extracted || !extracted.article) {\n return { blocks: [], metaKeywords: [] }\n }\n\n const { article, metaKeywords } = extracted\n\n const normalized = article\n .replace(/^H1:\\s*/gm, \"\")\n .replace(/^H2:\\s*/gm, \"\")\n .replace(/<\\/h1>/gi, \"\\n\")\n .replace(/<\\/h2>/gi, \"\\n\")\n .replace(/<\\/p>/gi, \"\\n\")\n .replace(/<br\\s*\\/?>/gi, \"\\n\")\n\n const lines = normalized\n .split(\"\\n\")\n .map(line => line.replace(/<[^>]+>/g, \"\").trim())\n .filter(Boolean)\n\n const blocks: Block[] = []\n\n lines.forEach((line, index) => {\n // Title\n if (index === 0 && line.length < 120) {\n blocks.push({ type: \"h1\", text: line })\n return\n }\n\n // Section heading\n if (\n line.length < 90 &&\n !line.endsWith(\"।\") &&\n !line.endsWith(\".\")\n ) {\n blocks.push({ type: \"h2\", text: line })\n return\n }\n\n blocks.push({ type: \"p\", text: line })\n })\n\n return { blocks, metaKeywords }\n }\n\n return (\n <div className=\"cnfy-chat\">\n {/* Chat Area */}\n <div className=\"cnfy-chat-area\">\n <div className=\"cnfy-chat-scroll\">\n {messages.map(msg => {\n const parsed = formatAIContent(msg.content)\n\n return (\n <div key={msg.id} className=\"cnfy-msg\">\n <div className={msg.role === \"assistant\"?`cnfy-msg-body`:`cnfy-msg-body you`}>\n {msg.role === \"assistant\" && parsed.blocks.length > 0 && (\n <div className=\"cnfy-msg-copy-row\">\n <button\n onClick={() => handleCopy(parsed.blocks, msg.id)}\n className=\"cnfy-copy-btn\"\n title=\"Copy to clipboard\"\n >\n {copiedId === msg.id ? (\n <Check size={16} className=\"cnfy-copy-icon--copied\" />\n ) : (\n <Copy size={16} />\n )}\n </button>\n </div>\n )}\n\n {parsed.blocks.map((block, idx) => {\n if (block.type === \"h1\") {\n return (\n <h1\n key={idx}\n className=\"cnfy-block-h1\"\n >\n {block.text}\n </h1>\n )\n }\n\n if (block.type === \"h2\") {\n return (\n <h2\n key={idx}\n className=\"cnfy-block-h2\"\n >\n {block.text}\n </h2>\n )\n }\n\n return (\n <p key={idx} className=\"cnfy-block-p\">\n {block.text}\n </p>\n )\n })}\n\n {/* Meta Keywords */}\n {parsed.metaKeywords.length > 0 && (\n <div className=\"cnfy-msg-keywords\">\n <div className=\"cnfy-msg-keywords-list\">\n {parsed.metaKeywords.map((tag, i) => (\n <span\n key={i}\n className=\"cnfy-msg-keyword-tag\"\n >\n #{tag}\n </span>\n ))}\n </div>\n </div>\n )}\n\n {/* Content action options - show when URL was analyzed */}\n {msg.role === \"assistant\" && analyzedData?.messageId === msg.id && analyzedData.options.length > 0 && (\n <div className=\"cnfy-action-options\">\n {analyzedData.options.map((option) => {\n const IconComponent = ACTION_ICONS[option.id] || FileText\n return (\n <button\n key={option.id}\n onClick={() => onSelectAction?.(option.id, analyzedData.url, analyzedData.content)}\n className=\"cnfy-action-btn\"\n >\n <IconComponent size={16} />\n {option.name}\n </button>\n )\n })}\n </div>\n )}\n\n {/* Edit and Post buttons for AI responses - only show when streaming is complete */}\n {msg.role === \"assistant\" && parsed.blocks.length > 0 && !analyzedData?.messageId && (!isStreaming || msg.id !== messages[messages.length - 1]?.id) && (\n <div className=\"cnfy-msg-actions\">\n <button\n onClick={() => handleEdit(parsed.blocks, parsed.metaKeywords, msg.id)}\n className=\"cnfy-btn-edit\"\n >\n <Edit3 size={16} />\n Edit\n </button>\n <button\n onClick={() => handlePost(msg.content, parsed.metaKeywords)}\n className=\"cnfy-btn-post\"\n style={{ backgroundColor: primaryColor, color: \"#fff\" }}\n >\n <Send size={16} />\n Post\n </button>\n </div>\n )}\n </div>\n </div>\n )\n })}\n\n <div ref={bottomRef} />\n </div>\n </div>\n\n {/* Input */}\n <div className=\"cnfy-input-area\">\n <div className=\"cnfy-input-inner\">\n {/* Pulse Icon - Trending News */}\n <div ref={dropdownRef} className=\"cnfy-news-pulse-wrap\">\n <button\n onClick={handleOpenNewsDropdown}\n className=\"cnfy-news-pulse-btn cnfy-animate-pulse\"\n title=\"Select from trending news\"\n >\n <Zap size={16} />\n </button>\n\n {/* News Dropdown */}\n {showNewsDropdown && (\n <div className=\"cnfy-news-dropdown\">\n {/* Header */}\n <div className=\"cnfy-news-dropdown-header\" style={{ backgroundColor: primaryColor, color: \"#fff\" }}>\n <span className=\"cnfy-news-dropdown-title\">Select News</span>\n <button\n onClick={() => setShowNewsDropdown(false)}\n className=\"cnfy-news-dropdown-close\"\n style={{ backgroundColor: primaryColor, color: \"#fff\" }}\n >\n <X size={14} />\n </button>\n </div>\n\n {/* Source Selector */}\n <div className=\"cnfy-news-dropdown-source\">\n {/* Source Dropdown with react-select */}\n <div className=\"cnfy-news-dropdown-select-wrap\">\n <Select<SourceOption>\n options={[\n { value: null, label: \"All Sources (Trending)\" },\n ...sources\n .filter((source) => !preferredLanguage || source.language === preferredLanguage)\n .map((source) => ({\n value: source.id,\n label: source.name,\n })),\n ]}\n value={\n selectedSource\n ? { value: selectedSource, label: sources.find(s => s.id === selectedSource)?.name || selectedSource }\n : { value: null, label: \"All Sources (Trending)\" }\n }\n onChange={handleSourceSelect}\n isLoading={loadingSources}\n isDisabled={loadingSources}\n placeholder=\"Select source...\"\n classNamePrefix=\"react-select\"\n menuPlacement=\"bottom\"\n menuPosition=\"fixed\"\n menuShouldScrollIntoView={false}\n maxMenuHeight={220}\n menuPortalTarget={typeof window !== \"undefined\" ? document.body : null}\n styles={{\n container: (base) => ({\n ...base,\n width: \"100%\",\n }),\n control: (base) => ({\n ...base,\n minHeight: \"38px\",\n borderColor: \"#e5e7eb\",\n boxShadow: \"none\",\n width: \"100%\",\n }),\n menu: (base) => ({\n ...base,\n width: \"100%\",\n zIndex: 999999,\n }),\n menuPortal: (base) => ({\n ...base,\n zIndex: 999999,\n }),\n option: (base, state) => ({\n ...base,\n backgroundColor: state.isSelected\n ? primaryColor\n : state.isFocused\n ? \"#f3f4f6\"\n : \"white\",\n color: state.isSelected ? \"white\" : \"#374151\",\n cursor: \"pointer\",\n }),\n }}\n />\n </div>\n\n {/* Scrape Button */}\n {selectedSource && (\n <button\n onClick={handleScrape}\n disabled={scraping}\n className=\"cnfy-scrape-btn\"\n title=\"Fetch latest news\"\n >\n <RefreshCcw size={14} className={scraping ? 'cnfy-animate-spin' : ''} />\n {scraping ? 'Scraping...' : 'Scrape'}\n </button>\n )}\n\n {/* Refresh Button for trending */}\n {!selectedSource && (\n <button\n onClick={() => fetchNews(null)}\n disabled={loadingNews}\n className=\"cnfy-refresh-btn\"\n >\n <RefreshCcw size={14} className={loadingNews ? 'cnfy-animate-spin' : ''} />\n Refresh\n </button>\n )}\n </div>\n\n {/* News List */}\n <div className=\"cnfy-news-dropdown-list\">\n {loadingNews ? (\n <div className=\"cnfy-news-dropdown-msg\">\n Loading news...\n </div>\n ) : trendingNews.length === 0 ? (\n <div className=\"cnfy-news-dropdown-msg\">\n <p>No news found.</p>\n {selectedSource && (\n <p className=\"cnfy-news-dropdown-hint\">Click &quot;Scrape&quot; to fetch latest news.</p>\n )}\n </div>\n ) : (\n <NewsList\n news={trendingNews.slice(0, 10)}\n onView={(item) => window.open(item.sourceUrl || item.link, \"_blank\")}\n onRecreate={(payload) => {\n setShowNewsDropdown(false)\n onSelectNews?.(payload)\n }}\n />\n )}\n </div>\n </div>\n )}\n </div>\n \n <textarea\n ref={textareaRef}\n value={input}\n onChange={e => setInput(e.target.value)}\n onKeyDown={e => {\n if (e.key === \"Enter\" && !e.shiftKey) {\n e.preventDefault()\n handleSend()\n }\n }}\n rows={1}\n placeholder=\"Ask AI something…\"\n className={`cnfy-chat-textarea ${!showNewsPanel ? 'cnfy-chat-textarea--with-pulse' : ''}`}\n style={{ maxHeight: \"200px\", overflowY: input.split(\"\\n\").length > 6 ? \"auto\" : \"hidden\" }}\n />\n <button\n onClick={handleSend}\n className=\"cnfy-send-btn\"\n style={{ backgroundColor: primaryColor, color: \"#fff\" }}\n >\n <SendHorizontal size={18} />\n </button>\n </div>\n </div>\n\n {/* Edit Modal */}\n <EditModal\n isOpen={editModal.isOpen}\n initialContent={editModal.content}\n metaKeywords={editModal.metaKeywords}\n onClose={handleCloseModal}\n onSaveDraft={handleSaveDraft}\n onPost={handlePost}\n />\n </div>\n )\n}\n","\"use client\"\n\nimport { X } from \"lucide-react\"\nimport { useEffect, useState } from \"react\"\nimport RichTextEditor from \"./RichTextEditor\"\nimport { useTheme } from \"@/hooks/useTheme\"\n\ntype EditModalProps = {\n isOpen: boolean\n initialContent: string\n metaKeywords: string[]\n onClose: () => void\n onSaveDraft: (content: string, keywords: string[]) => void\n onPost: (content: string, keywords: string[]) => void\n}\n\nexport default function EditModal({\n isOpen,\n initialContent,\n metaKeywords,\n onClose,\n onSaveDraft,\n onPost,\n}: EditModalProps) {\n const { primaryColor } = useTheme();\n const [content, setContent] = useState(\"\")\n const [keywords, setKeywords] = useState<string[]>(metaKeywords)\n const [newKeyword, setNewKeyword] = useState(\"\")\n\n // Convert markdown-style content to HTML for the editor\n const markdownToHtml = (text: string): string => {\n const lines = text.split(\"\\n\").filter(line => line.trim())\n let html = \"\"\n\n lines.forEach(line => {\n const trimmed = line.trim()\n if (trimmed.startsWith(\"# \")) {\n html += `<h1>${trimmed.replace(/^#\\s+/, \"\")}</h1>`\n } else if (trimmed.startsWith(\"## \")) {\n html += `<h2>${trimmed.replace(/^##\\s+/, \"\")}</h2>`\n } else {\n html += `<p>${trimmed}</p>`\n }\n })\n\n return html\n }\n\n useEffect(() => {\n const htmlContent = markdownToHtml(initialContent)\n setContent(htmlContent)\n setKeywords(metaKeywords)\n }, [initialContent, metaKeywords])\n\n useEffect(() => {\n if (isOpen) {\n document.body.style.overflow = \"hidden\"\n } else {\n document.body.style.overflow = \"\"\n }\n return () => {\n document.body.style.overflow = \"\"\n }\n }, [isOpen])\n\n const handleAddKeyword = () => {\n if (newKeyword.trim() && !keywords.includes(newKeyword.trim())) {\n setKeywords([...keywords, newKeyword.trim()])\n setNewKeyword(\"\")\n }\n }\n\n const handleRemoveKeyword = (index: number) => {\n setKeywords(keywords.filter((_, i) => i !== index))\n }\n\n const handleKeyDown = (e: React.KeyboardEvent) => {\n if (e.key === \"Enter\") {\n e.preventDefault()\n handleAddKeyword()\n }\n }\n\n if (!isOpen) return null\n\n return (\n <div className=\"cnfy-edit-modal-overlay\">\n {/* Backdrop */}\n <div\n className=\"cnfy-edit-modal-backdrop\"\n onClick={onClose}\n />\n\n {/* Modal */}\n <div className=\"cnfy-edit-modal\">\n {/* Header */}\n <div className=\"cnfy-edit-modal-header\">\n <h2 className=\"cnfy-edit-modal-title\">Edit Article</h2>\n <button\n onClick={onClose}\n className=\"cnfy-edit-modal-close-btn\"\n >\n <X size={20} className=\"cnfy-edit-modal-close-icon\" />\n </button>\n </div>\n\n {/* Content */}\n <div className=\"cnfy-edit-modal-body\">\n {/* Article Content - WYSIWYG Editor */}\n <div>\n <label className=\"cnfy-edit-label\">\n Article Content\n </label>\n <RichTextEditor\n content={content}\n onChange={setContent}\n placeholder=\"Start writing your article...\"\n />\n </div>\n\n {/* Meta Keywords */}\n <div>\n <label className=\"cnfy-edit-label\">\n Meta Keywords\n </label>\n <div className=\"cnfy-keyword-list\">\n {keywords.map((keyword, index) => (\n <span\n key={index}\n className=\"cnfy-keyword-tag\"\n >\n #{keyword}\n <button\n onClick={() => handleRemoveKeyword(index)}\n className=\"cnfy-keyword-remove-btn\"\n >\n <X size={14} />\n </button>\n </span>\n ))}\n </div>\n <div className=\"cnfy-keyword-input-row\">\n <input\n type=\"text\"\n value={newKeyword}\n onChange={e => setNewKeyword(e.target.value)}\n onKeyDown={handleKeyDown}\n placeholder=\"Add a keyword...\"\n className=\"cnfy-keyword-input\"\n />\n <button\n onClick={handleAddKeyword}\n className=\"cnfy-btn-add-keyword\"\n >\n Add\n </button>\n </div>\n </div>\n </div>\n\n {/* Footer */}\n <div className=\"cnfy-edit-modal-footer\">\n <button\n onClick={onClose}\n className=\"cnfy-btn-footer-cancel\"\n >\n Cancel\n </button>\n <button\n onClick={() => onSaveDraft(content, keywords)}\n className=\"cnfy-btn-save-draft\"\n >\n Save Draft\n </button>\n <button\n onClick={() => onPost(content, keywords)}\n className=\"cnfy-btn-post-article\"\n style={{ backgroundColor: primaryColor, color: \"#fff\" }}\n >\n Post\n </button>\n </div>\n </div>\n </div>\n )\n}\n","\"use client\"\n\nimport { useEditor, EditorContent } from \"@tiptap/react\"\nimport StarterKit from \"@tiptap/starter-kit\"\nimport Placeholder from \"@tiptap/extension-placeholder\"\nimport {\n Bold,\n Italic,\n List,\n ListOrdered,\n Heading1,\n Heading2,\n Undo,\n Redo,\n Pilcrow,\n} from \"lucide-react\"\nimport { useEffect } from \"react\"\n\ntype RichTextEditorProps = {\n content: string\n onChange: (content: string) => void\n placeholder?: string\n}\n\nexport default function RichTextEditor({\n content,\n onChange,\n placeholder = \"Start writing your article...\",\n}: RichTextEditorProps) {\n const editor = useEditor({\n immediatelyRender: false, // Prevents SSR hydration mismatch\n extensions: [\n StarterKit.configure({\n heading: {\n levels: [1, 2],\n },\n }),\n Placeholder.configure({\n placeholder,\n }),\n ],\n content: content,\n editorProps: {\n attributes: {\n class: \"ProseMirror\",\n },\n },\n onUpdate: ({ editor }) => {\n onChange(editor.getHTML())\n },\n })\n\n // Update editor content when prop changes\n useEffect(() => {\n if (editor && content !== editor.getHTML()) {\n editor.commands.setContent(content)\n }\n }, [content, editor])\n\n if (!editor) {\n return (\n <div className=\"cnfy-editor-loading\">\n Loading editor...\n </div>\n )\n }\n\n return (\n <div className=\"cnfy-editor\">\n {/* Toolbar */}\n <div className=\"cnfy-toolbar\">\n <ToolbarButton\n onClick={() => editor.chain().focus().toggleHeading({ level: 1 }).run()}\n isActive={editor.isActive(\"heading\", { level: 1 })}\n title=\"Heading 1\"\n >\n <Heading1 size={18} />\n </ToolbarButton>\n\n <ToolbarButton\n onClick={() => editor.chain().focus().toggleHeading({ level: 2 }).run()}\n isActive={editor.isActive(\"heading\", { level: 2 })}\n title=\"Heading 2\"\n >\n <Heading2 size={18} />\n </ToolbarButton>\n\n <ToolbarButton\n onClick={() => editor.chain().focus().setParagraph().run()}\n isActive={editor.isActive(\"paragraph\")}\n title=\"Paragraph\"\n >\n <Pilcrow size={18} />\n </ToolbarButton>\n\n <div className=\"cnfy-toolbar-divider\" />\n\n <ToolbarButton\n onClick={() => editor.chain().focus().toggleBold().run()}\n isActive={editor.isActive(\"bold\")}\n title=\"Bold\"\n >\n <Bold size={18} />\n </ToolbarButton>\n\n <ToolbarButton\n onClick={() => editor.chain().focus().toggleItalic().run()}\n isActive={editor.isActive(\"italic\")}\n title=\"Italic\"\n >\n <Italic size={18} />\n </ToolbarButton>\n\n <div className=\"cnfy-toolbar-divider\" />\n\n <ToolbarButton\n onClick={() => editor.chain().focus().toggleBulletList().run()}\n isActive={editor.isActive(\"bulletList\")}\n title=\"Bullet List\"\n >\n <List size={18} />\n </ToolbarButton>\n\n <ToolbarButton\n onClick={() => editor.chain().focus().toggleOrderedList().run()}\n isActive={editor.isActive(\"orderedList\")}\n title=\"Numbered List\"\n >\n <ListOrdered size={18} />\n </ToolbarButton>\n\n <div className=\"cnfy-toolbar-divider\" />\n\n <ToolbarButton\n onClick={() => editor.chain().focus().undo().run()}\n disabled={!editor.can().undo()}\n title=\"Undo\"\n >\n <Undo size={18} />\n </ToolbarButton>\n\n <ToolbarButton\n onClick={() => editor.chain().focus().redo().run()}\n disabled={!editor.can().redo()}\n title=\"Redo\"\n >\n <Redo size={18} />\n </ToolbarButton>\n </div>\n\n {/* Editor */}\n <EditorContent editor={editor} className=\"cnfy-editor-content\" />\n </div>\n )\n}\n\ntype ToolbarButtonProps = {\n onClick: () => void\n isActive?: boolean\n disabled?: boolean\n title: string\n children: React.ReactNode\n}\n\nfunction ToolbarButton({\n onClick,\n isActive,\n disabled,\n title,\n children,\n}: ToolbarButtonProps) {\n return (\n <button\n onClick={onClick}\n disabled={disabled}\n title={title}\n className={`cnfy-toolbar-btn ${\n isActive ? \"cnfy-toolbar-btn--active\" : \"\"\n } ${disabled ? \"cnfy-toolbar-btn--disabled\" : \"\"}`}\n >\n {children}\n </button>\n )\n}\n","import { usePreferences } from '@/contexts/PreferencesContext'\n\nexport function useTheme() {\n const { preferences, loading } = usePreferences()\n\n return {\n loading,\n primaryColor: preferences?.chatbot?.primaryColor || '#10b981',\n secondaryColor: preferences?.chatbot?.secondaryColor || '#064e3b',\n botName: preferences?.chatbot?.name || 'AI News Assistant',\n logoUrl: preferences?.chatbot?.logoUrl,\n theme: preferences?.chatbot?.theme || 'system',\n showSidebar: preferences?.appearance?.showSidebar ?? true,\n showHeader: preferences?.appearance?.showHeader ?? true,\n activeThemePreset: preferences?.appearance?.activeThemePreset ?? null,\n showNewsPanel: preferences?.appearance?.showNewsPanel ?? true,\n }\n}\n","\"use client\"\nimport { useState } from \"react\"\nimport { Eye, RefreshCcw } from \"lucide-react\"\nimport { useTheme } from \"@/hooks/useTheme\"\n\nconst dateFormatter = new Intl.DateTimeFormat(\"en-GB\", {\n day: \"2-digit\",\n month: \"short\",\n year: \"numeric\",\n})\n\nconst timeFormatter = new Intl.DateTimeFormat(\"en-GB\", {\n hour: \"2-digit\",\n minute: \"2-digit\",\n hour12: false,\n})\n\nfunction extractLinksFromContent(html?: string) {\n if (!html) return []\n\n const parser = new DOMParser()\n const doc = parser.parseFromString(html, \"text/html\")\n\n return Array.from(doc.querySelectorAll(\"li\")).map((li) => {\n const anchor = li.querySelector(\"a\")\n const source = li.querySelector(\"font\")\n\n return {\n title: anchor?.textContent || \"\",\n url: anchor?.getAttribute(\"href\") || \"#\",\n source: source?.textContent || \"\",\n }\n })\n}\n\nexport default function NewsList({\n news,\n onView,\n onRecreate,\n}: {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n news: any[]\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n onView: (item: any) => void\n onRecreate: (payload: { title: string; content?: string; id?: string }) => void\n}) {\n\n const { primaryColor } = useTheme();\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const [primaryColorState] = useState<any>(primaryColor);\n\n const lightenColor = (hex:string, percent = 85) => {\n hex = hex.replace(\"#\", \"\");\n\n let r = parseInt(hex.substring(0, 2), 16);\n let g = parseInt(hex.substring(2, 4), 16);\n let b = parseInt(hex.substring(4, 6), 16);\n\n r = Math.round(r + (255 - r) * (percent / 100));\n g = Math.round(g + (255 - g) * (percent / 100));\n b = Math.round(b + (255 - b) * (percent / 100));\n\n return `rgb(${r}, ${g}, ${b})`;\n}\n\n\n\n\n return (\n <div className=\"cnfy-news-list\">\n {news.flatMap((item) => {\n const publishedDate = new Date(item.publishedAt)\n const links = extractLinksFromContent(item.content)\n\n // CHILD CARDS\n if (links.length > 0) {\n return links.map((link, idx) => (\n <div\n key={`${item._id}-link-${idx}`}\n className=\"cnfy-news-card\"\n >\n {/* LEFT CONTENT */}\n <div className=\"cnfy-news-card-content\">\n <p className=\"cnfy-news-card-title\">\n {link.title}\n </p>\n\n <div className=\"cnfy-news-card-meta\">\n <span\n className=\"cnfy-news-badge\"\n style={{\n backgroundColor: lightenColor(primaryColorState, 95),\n color: primaryColor,\n borderColor: lightenColor(primaryColorState, 95),\n }}\n >\n {link.source || item.sourceName}\n </span>\n\n <span>•</span>\n <span className=\"cnfy-news-card-category\">{item.category}</span>\n <span>•</span>\n\n <span>\n {dateFormatter.format(publishedDate)}{\" \"}\n {timeFormatter.format(publishedDate)}\n </span>\n </div>\n </div>\n\n {/* RIGHT ACTIONS */}\n <div className=\"cnfy-news-card-actions\">\n <button\n onClick={() => window.open(link.url, \"_blank\")}\n className=\"cnfy-news-action-btn\"\n title=\"View\"\n >\n <Eye size={16} />\n </button>\n\n <button\n onClick={() =>\n onRecreate({\n title: link.title,\n content: link.title,\n id: item._id,\n })\n }\n className=\"cnfy-news-action-btn\"\n title=\"Recreate\"\n >\n <RefreshCcw size={16} />\n </button>\n </div>\n </div>\n ))\n }\n\n // PARENT CARD\n return (\n <div\n key={item._id}\n className=\"cnfy-news-card\"\n >\n {/* LEFT CONTENT */}\n <div className=\"cnfy-news-card-content\">\n <p className=\"cnfy-news-card-title\">\n {item.title}\n </p>\n\n <div className=\"cnfy-news-card-meta\">\n <span\n className=\"cnfy-news-badge\"\n style={{\n backgroundColor: lightenColor(primaryColorState, 95),\n color: primaryColor,\n borderColor: lightenColor(primaryColorState, 95),\n }}\n >\n {item.sourceName}\n </span>\n\n <span>•</span>\n <span className=\"cnfy-news-card-category\">{item.category}</span>\n <span>•</span>\n\n <span>\n {dateFormatter.format(publishedDate)}{\" \"}\n {timeFormatter.format(publishedDate)}\n </span>\n </div>\n </div>\n\n {/* RIGHT ACTIONS */}\n <div className=\"cnfy-news-card-actions\">\n <button\n onClick={() => onView(item)}\n className=\"cnfy-news-action-btn\"\n title=\"View\"\n >\n <Eye size={16} />\n </button>\n\n <button\n onClick={() =>\n onRecreate({\n title: item.title,\n content: item.content || item.title,\n id: item._id,\n })\n }\n className=\"cnfy-news-action-btn\"\n title=\"Recreate\"\n >\n <RefreshCcw size={16} />\n </button>\n </div>\n </div>\n )\n })}\n </div>\n )\n}\n","import api from \"@/lib/api\"\n\nexport const getTrendingNews = async () => {\n const { data } = await api.get(\"/chatboat/trending\")\n return data.data\n}\n\n/**\n * Get list of available news sources (RSS feeds)\n */\nexport const getNewsSources = async () => {\n const { data } = await api.get(\"/chatboat/scrape/sources\")\n return data.data\n}\n\n/**\n * Scrape top 10 news from a specific source\n */\nexport const scrapeNewsSource = async (sourceId: string) => {\n const { data } = await api.post(\"/chatboat/scrape/source\", { sourceId })\n return data.data\n}\n\n/**\n * Get previously scraped news by source\n */\nexport const getNewsBySource = async (sourceId: string) => {\n const { data } = await api.get(`/chatboat/scrape/by-source/${sourceId}`)\n return data.data\n}\n","\"use client\"\n\nimport { Settings } from \"lucide-react\"\n\nexport default function UserMenu({\n onOpenPreferences,\n}: {\n onOpenPreferences?: () => void\n}) {\n return (\n <div className=\"cnfy-user-menu\">\n <button\n onClick={() => onOpenPreferences?.()}\n className=\"cnfy-user-menu-trigger\"\n aria-label=\"Settings\"\n >\n <Settings size={20} className=\"cnfy-user-menu-trigger-icon\" />\n </button>\n </div>\n )\n}\n","\"use client\"\n\nimport UserMenu from \"./UserMenu\"\nimport { useTheme } from \"@/hooks/useTheme\"\n\nexport default function HeaderBar({\n onOpenPreferences,\n}: {\n onOpenPreferences?: () => void\n}) {\n const { primaryColor, botName, logoUrl } = useTheme()\n\n return (\n <header className=\"cnfy-header\">\n <div className=\"cnfy-header-inner\">\n\n {/* Left: Logo + Brand */}\n <div className=\"cnfy-header-left\">\n {logoUrl ? (\n <img src={logoUrl} alt=\"Logo\" className=\"cnfy-header-logo-img\" />\n ) : (\n <div\n className=\"cnfy-header-logo-fallback\"\n style={{ backgroundColor: primaryColor }}\n >\n {botName.charAt(0).toUpperCase()}\n </div>\n )}\n <span className=\"cnfy-header-brand\">\n {botName.toUpperCase()}\n </span>\n </div>\n\n {/* Right: User Menu */}\n <div className=\"cnfy-header-right\">\n <UserMenu onOpenPreferences={onOpenPreferences} />\n </div>\n </div>\n </header>\n )\n}\n","\"use client\"\n\nimport { useEffect } from \"react\"\nimport { X } from \"lucide-react\"\n\nexport default function Drawer({\n open,\n onClose,\n title,\n children,\n}: {\n open: boolean\n onClose: () => void\n title?: string\n children: React.ReactNode\n}) {\n // Prevent body scroll when drawer is open\n useEffect(() => {\n if (open) {\n document.body.style.overflow = \"hidden\"\n } else {\n document.body.style.overflow = \"\"\n }\n return () => {\n document.body.style.overflow = \"\"\n }\n }, [open])\n\n if (!open) return null\n\n return (\n <div className=\"cnfy-drawer-overlay\">\n {/* Backdrop */}\n <div className=\"cnfy-drawer-backdrop\" onClick={onClose} />\n\n {/* Panel */}\n <div className=\"cnfy-drawer-panel\">\n <div className=\"cnfy-drawer-header\">\n {title && <h2 className=\"cnfy-drawer-title\">{title}</h2>}\n <button onClick={onClose} className=\"cnfy-drawer-close-btn\">\n <X size={20} />\n </button>\n </div>\n\n <div className=\"cnfy-drawer-body\">\n {children}\n </div>\n </div>\n </div>\n )\n}\n","'use client'\nimport { useState, useEffect } from \"react\"\nimport toast from \"react-hot-toast\"\nimport { savePreferencesApi } from \"@/services/preferences.service\"\nimport { triggerScrape, getScrapeStatus } from \"@/services/settings.service\"\nimport { usePreferences } from \"@/contexts/PreferencesContext\"\nimport ClientSelect from \"@/components/ClientSelect\"\nimport { hexToRgba } from \"@/util/util\"\n\ninterface ScrapeStatus {\n isRunning: boolean\n lastRun?: string\n nextScheduled?: string\n totalScraped?: number\n}\n\nconst STATE_OPTIONS = [\n { value: \"Uttar Pradesh\", label: \"Uttar Pradesh\" }\n]\n\nconst CITY_OPTIONS = [\n \"Agra\",\n \"Aligarh\",\n \"Ayodhya\",\n \"Bareilly\",\n \"Bijnor\",\n \"Bulandshahr\",\n \"Etawah\",\n \"Firozabad\",\n \"Ghaziabad\",\n \"Gorakhpur\",\n \"Jhansi\",\n \"Kanpur\",\n \"Lucknow\",\n \"Mathura\",\n \"Meerut\",\n \"Moradabad\",\n \"Muzaffarnagar\",\n \"Noida\",\n \"Prayagraj\",\n \"Rampur\",\n \"Saharanpur\",\n \"Sitapur\",\n \"Unnao\",\n \"Varanasi\"\n].map(city => ({ value: city, label: city }))\n\nconst LANGUAGE_OPTIONS = [\n { value: \"en\", label: \"English\" },\n { value: \"hi\", label: \"Hindi\" },\n]\n\nexport default function PreferencesPage() {\n const { preferences, loading, refreshPreferences, updatePreferences } = usePreferences()\n const primaryColor = preferences?.chatbot?.primaryColor || \"#10b981\"\n\n const [botName, setBotName] = useState(\"\")\n const [logo, setLogo] = useState<File | null>(null)\n const [logoUrl, setLogoUrl] = useState<string | null>(null)\n const [state, setState] = useState<{ value: string; label: string } | null>(null)\n const [cities, setCities] = useState<{ value: string; label: string }[]>([])\n const [language, setLanguage] = useState<{ value: string; label: string } | null>(null)\n\n const [saving, setSaving] = useState(false)\n const [success, setSuccess] = useState(false)\n\n // News Scraping state\n const [scraping, setScraping] = useState(false)\n const [scrapeStatus, setScrapeStatus] = useState<ScrapeStatus | null>(null)\n const [loadingStatus, setLoadingStatus] = useState(true)\n\n // Store original values for comparison\n const [originalValues, setOriginalValues] = useState<{\n botName: string\n state: string | undefined\n cities: string[]\n language: string | undefined\n }>({\n botName: \"\",\n state: undefined,\n cities: [],\n language: undefined,\n })\n\n // Fetch scrape status on mount\n useEffect(() => {\n const fetchScrapeStatus = async () => {\n try {\n const data = await getScrapeStatus()\n setScrapeStatus(data)\n } catch (error) {\n console.log(\"Failed to fetch scrape status:\", error)\n } finally {\n setLoadingStatus(false)\n }\n }\n fetchScrapeStatus()\n }, [])\n\n const handleScrape = async () => {\n setScraping(true)\n try {\n await triggerScrape({\n state: preferences?.localization?.state,\n cities: preferences?.localization?.cities,\n })\n toast.success(\"News scraping started successfully!\")\n setTimeout(async () => {\n try {\n const data = await getScrapeStatus()\n setScrapeStatus(data)\n } catch (e) {\n console.log(\"Failed to refresh scrape status:\", e)\n }\n }, 2000)\n } catch (error) {\n console.error(error)\n toast.error(\"Failed to trigger news scraping\")\n } finally {\n setScraping(false)\n }\n }\n\n useEffect(() => {\n if (preferences) {\n // Set chatbot preferences\n const name = preferences.chatbot?.name || \"\"\n const pState = preferences.localization?.state\n const pCities = preferences.localization?.cities || []\n const pLanguage = preferences.localization?.language\n\n setBotName(name)\n if (preferences.chatbot?.logoUrl) setLogoUrl(preferences.chatbot.logoUrl)\n\n // Set localization preferences\n if (pState) {\n setState({ value: pState, label: pState })\n }\n if (Array.isArray(pCities)) {\n setCities(pCities.map((city: string) => ({ value: city, label: city })))\n }\n if (pLanguage) {\n const langOption = LANGUAGE_OPTIONS.find(opt => opt.value === pLanguage)\n setLanguage(langOption || null)\n }\n\n // Store original values\n setOriginalValues({\n botName: name,\n state: pState,\n cities: pCities,\n language: pLanguage,\n })\n }\n }, [preferences])\n\n const handleSave = async () => {\n if (!botName) {\n toast.error(\"Chatbot name is required\")\n return\n }\n\n setSaving(true)\n setSuccess(false)\n\n try {\n // Build payload with only changed fields\n const payload: {\n botName?: string\n logo?: File | null\n state?: string\n cities?: string[]\n language?: string\n } = {}\n\n // Check each field for changes\n if (botName !== originalValues.botName) {\n payload.botName = botName\n }\n\n if (logo) {\n payload.logo = logo\n }\n\n const currentState = state?.value\n if (currentState !== originalValues.state) {\n payload.state = currentState\n }\n\n const currentCities = cities.map(c => c.value)\n const citiesChanged =\n currentCities.length !== originalValues.cities.length ||\n currentCities.some((city, index) => city !== originalValues.cities[index])\n if (citiesChanged) {\n payload.cities = currentCities\n }\n\n const currentLanguage = language?.value\n if (currentLanguage !== originalValues.language) {\n payload.language = currentLanguage\n }\n\n // If no changes detected, show message\n if (Object.keys(payload).length === 0) {\n toast.error(\"No changes to save\")\n setSaving(false)\n return\n }\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const updatedPreferences = await savePreferencesApi(payload as any)\n\n // Update global context with new preferences\n if (updatedPreferences) {\n updatePreferences(updatedPreferences)\n } else {\n // Refresh from server if save didn't return data\n await refreshPreferences()\n }\n\n setSuccess(true)\n setLogo(null) // Clear logo after successful save\n toast.success(\"Preferences saved successfully!\")\n } catch (error) {\n console.error(error)\n toast.error(\"Failed to save preferences\")\n } finally {\n setSaving(false)\n }\n }\n\n if (loading) {\n return (\n <div className=\"cnfy-dash-page\">\n <p className=\"cnfy-dash-page-subtitle\">Loading settings...</p>\n </div>\n )\n }\n\n return (\n <div className=\"cnfy-dash-page\">\n {/* Chatbot Settings */}\n <div className=\"cnfy-dash-card\">\n <h2 className=\"cnfy-dash-card-title\">Chatbot Settings</h2>\n\n {/* Chatbot Name */}\n <div className=\"cnfy-dash-field\">\n <label className=\"cnfy-dash-label\">Chatbot Name</label>\n <input\n value={botName}\n onChange={(e) => setBotName(e.target.value)}\n className=\"cnfy-dash-input\"\n placeholder=\"Contenify AI\"\n />\n </div>\n\n {/* Logo */}\n <div className=\"cnfy-dash-field\">\n <label className=\"cnfy-dash-label\">Chatbot Logo</label>\n <div className=\"cnfy-logo-upload\">\n <div className=\"cnfy-logo-preview\">\n {logo ? (\n <img\n src={URL.createObjectURL(logo)}\n alt=\"Logo preview\"\n className=\"cnfy-logo-img\"\n />\n ) : logoUrl ? (\n <img\n src={logoUrl}\n alt=\"Current logo\"\n className=\"cnfy-logo-img\"\n />\n ) : (\n <span className=\"cnfy-logo-placeholder\">No logo</span>\n )}\n </div>\n\n <input\n type=\"file\"\n accept=\"image/*\"\n onChange={(e) => setLogo(e.target.files?.[0] || null)}\n className=\"cnfy-file-input\"\n />\n </div>\n </div>\n\n </div>\n\n\n {/* News Scraping */}\n <div className=\"cnfy-dash-card\">\n <div className=\"cnfy-dash-card-header\">\n <h2 className=\"cnfy-dash-card-title-inline\">News Scraping</h2>\n <p className=\"cnfy-dash-card-desc\">\n Scrape latest news from your configured locations\n </p>\n </div>\n\n {!loadingStatus && scrapeStatus && (\n <div className=\"cnfy-dash-grid cnfy-dash-grid--sm\">\n <div>\n <span className=\"cnfy-dash-label-muted\">Status:</span>\n <p className=\"cnfy-dash-label-bold\">\n {scrapeStatus.isRunning ? (\n <span className=\"cnfy-dash-badge cnfy-dash-badge--yellow\">Running</span>\n ) : (\n <span className=\"cnfy-dash-badge cnfy-dash-badge--green\">Idle</span>\n )}\n </p>\n </div>\n\n {scrapeStatus.lastRun && (\n <div>\n <span className=\"cnfy-dash-label-muted\">Last Run:</span>\n <p className=\"cnfy-dash-label-bold\">\n {new Date(scrapeStatus.lastRun).toLocaleString()}\n </p>\n </div>\n )}\n\n {scrapeStatus.totalScraped !== undefined && (\n <div>\n <span className=\"cnfy-dash-label-muted\">Total Scraped:</span>\n <p className=\"cnfy-dash-label-bold\">\n {scrapeStatus.totalScraped.toLocaleString()} articles\n </p>\n </div>\n )}\n </div>\n )}\n\n <div>\n <p className=\"cnfy-dash-info-text\">\n Current configuration: <strong>{preferences?.localization?.state}</strong>\n {preferences?.localization?.cities && preferences.localization.cities.length > 0 && (\n <> - {preferences.localization.cities.join(\", \")}</>\n )}\n </p>\n <button\n onClick={handleScrape}\n disabled={scraping || scrapeStatus?.isRunning}\n className=\"cnfy-dash-btn-save\"\n style={{ backgroundColor: hexToRgba(primaryColor, 0.8) }}\n >\n {scraping ? \"Starting Scrape...\" : scrapeStatus?.isRunning ? \"Scraping in Progress...\" : \"Start Scraping\"}\n </button>\n </div>\n </div>\n\n {/* Localization Settings */}\n <div className=\"cnfy-dash-card\">\n <h2 className=\"cnfy-dash-card-title\">Localization Settings</h2>\n\n {/* State */}\n <div className=\"cnfy-dash-field\">\n <label className=\"cnfy-dash-label\">State</label>\n <ClientSelect\n options={STATE_OPTIONS}\n value={state}\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n onChange={(option:any) => setState(option)}\n placeholder=\"Select state\"\n />\n </div>\n\n {/* City */}\n <div className=\"cnfy-dash-field\">\n <label className=\"cnfy-dash-label\">Cities</label>\n <ClientSelect\n isMulti={true}\n options={CITY_OPTIONS}\n value={cities}\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n onChange={(options) => setCities(options as any)}\n placeholder=\"Select cities\"\n isDisabled={!state}\n />\n </div>\n\n {/* Language */}\n <div className=\"cnfy-dash-field\">\n <label className=\"cnfy-dash-label\">Language</label>\n <ClientSelect\n options={LANGUAGE_OPTIONS}\n value={language}\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n onChange={(option:any) => setLanguage(option)}\n placeholder=\"Select language\"\n />\n </div>\n </div>\n\n \n\n {/* Save Button */}\n <div className=\"cnfy-dash-actions\">\n <button\n onClick={handleSave}\n disabled={saving}\n className=\"cnfy-dash-btn-save\"\n style={{ backgroundColor: primaryColor }}\n >\n {saving ? \"Saving...\" : \"Save Preferences\"}\n </button>\n </div>\n </div>\n )\n}\n","import api from \"@/lib/api\"\n\n/**\n * Trigger news scraping\n */\n\nexport const triggerScrape = async ({\n state,\n cities,\n}: {\n state?: string\n cities?: string[]\n}) => {\n const { data } = await api.post(\"/chatboat/scrape/trigger\", {\n state,\n cities,\n })\n return data\n}\n\n/**\n * Get scraping status\n */\nexport const getScrapeStatus = async () => {\n const { data } = await api.get(\"/chatboat/scrape/status\")\n return data.data\n}\n\n/**\n * Reset user data (daily limits, etc.)\n */\nexport const resetUserData = async () => {\n const { data } = await api.post(\"/users/reset\")\n return data\n}\n","import React, { useEffect, useState } from \"react\";\nimport type { Props as SelectProps } from \"react-select\";\n\ntype Option = {\n label: string;\n value: string;\n};\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nlet ReactSelect: any = null;\n\nconst ClientSelect = (props: SelectProps<Option, boolean>) => {\n const [mounted, setMounted] = useState(false);\n\n useEffect(() => {\n setMounted(true);\n import(\"react-select\").then((mod) => {\n ReactSelect = mod.default;\n });\n }, []);\n\n if (!mounted || !ReactSelect) return null;\n\n return <ReactSelect {...props} />;\n};\n\nexport default ClientSelect;\n","import api from \"@/lib/api\"\nimport { getApiBaseUrl, getApiKey } from \"@/lib/config\"\n\n/* ─── Types ─── */\n\nexport interface ContentOption {\n id: string\n name: string\n description?: string\n icon?: string\n}\n\nexport interface RecreateSettings {\n tones: string[]\n styles: string[]\n wordCounts?: string[]\n}\n\nexport interface AnalyzeInputResponse {\n hasUrl: boolean\n url?: string\n content?: string\n wordCount?: number\n options: ContentOption[]\n recreateSettings?: RecreateSettings\n}\n\nexport interface CreateContentPayload {\n url: string\n content: string\n actionId: string\n settings?: {\n tone?: string\n style?: string\n wordCount?: string\n }\n}\n\n/* ─── New API endpoints ─── */\n\n/**\n * Analyze user input for URLs and return content options\n */\nexport const analyzeInputApi = async (input: string): Promise<AnalyzeInputResponse> => {\n const { data } = await api.post(\"/chat/analyze-input\", { input })\n return data.data\n}\n\n/**\n * Create content based on selected action (non-streaming)\n */\nexport const createContentApi = async (payload: CreateContentPayload) => {\n const { data } = await api.post(\"/chat/create-content\", payload)\n return data.data\n}\n\n/**\n * Create content based on selected action (streaming)\n */\nexport const createContentStreamApi = async ({\n url,\n content,\n actionId,\n settings,\n onChunk,\n onComplete,\n onError,\n}: CreateContentPayload & {\n onChunk: (text: string) => void\n onComplete?: () => void\n onError?: (error: any) => void\n}) => {\n const API_BASE_URL = getApiBaseUrl()\n const apiKey = getApiKey()\n\n const headers: Record<string, string> = {\n \"Content-Type\": \"application/json\",\n }\n if (apiKey) {\n headers[\"x-api-key\"] = apiKey\n }\n\n const response = await fetch(`${API_BASE_URL}/chat/create-content/stream`, {\n method: \"POST\",\n headers,\n credentials: \"include\",\n body: JSON.stringify({ url, content, actionId, settings }),\n })\n\n if (!response.ok) {\n const errorText = await response.text()\n throw new Error(`HTTP error! status: ${response.status} - ${errorText}`)\n }\n\n const reader = response.body?.getReader()\n const decoder = new TextDecoder()\n\n if (!reader) {\n throw new Error(\"No reader available\")\n }\n\n let buffer = \"\"\n let hasReceivedData = false\n\n while (true) {\n const { done, value } = await reader.read()\n\n if (done) {\n if (hasReceivedData) onComplete?.()\n break\n }\n\n const chunk = decoder.decode(value, { stream: true })\n buffer += chunk\n\n const lines = buffer.split(\"\\n\")\n buffer = lines.pop() || \"\"\n\n for (const line of lines) {\n const trimmedLine = line.trim()\n if (trimmedLine === \"\") continue\n\n hasReceivedData = true\n\n if (trimmedLine.startsWith(\"data: \")) {\n const data = trimmedLine.slice(6).trim()\n\n if (data === \"[DONE]\") {\n onComplete?.()\n return\n }\n\n try {\n const parsed = JSON.parse(data)\n if (parsed.content) onChunk(parsed.content)\n else if (parsed.delta) onChunk(parsed.delta)\n else if (parsed.text) onChunk(parsed.text)\n else if (parsed.chunk) onChunk(parsed.chunk)\n else if (typeof parsed === \"string\") onChunk(parsed)\n } catch {\n if (data) onChunk(data)\n }\n } else if (trimmedLine) {\n onChunk(trimmedLine + \"\\n\")\n }\n }\n }\n\n if (!hasReceivedData) {\n throw new Error(\"No data received from stream\")\n }\n}\n\n/**\n * Get all available content creation options and settings\n */\nexport const getContentOptionsApi = async () => {\n const { data } = await api.get(\"/chat/content-options\")\n return data.data\n}\n\n/**\n * Streaming version of rewrite news API (like ChatGPT)\n * Calls the provided onChunk callback for each piece of streamed data\n */\nexport const rewriteNewsStreamApi = async ({\n article,\n language = \"English\",\n articleId,\n tone,\n style,\n wordCount,\n includeQuotes,\n includeFAQ,\n targetAudience,\n onChunk,\n onComplete,\n onError,\n}: {\n article: string\n language?: string\n articleId?: string\n tone?: string\n style?: string\n wordCount?: string\n includeQuotes?: boolean\n includeFAQ?: boolean\n targetAudience?: string\n onChunk: (text: string) => void\n onComplete?: () => void\n onError?: (error: any) => void\n}) => {\n const payload: Record<string, any> = {\n article,\n language,\n }\n\n // Include articleId if available\n if (articleId) {\n payload.articleId = articleId\n }\n\n // Include content generation preferences\n if (tone) payload.tone = tone\n if (style) payload.style = style\n if (wordCount) payload.wordCount = wordCount\n if (includeQuotes !== undefined) payload.includeQuotes = includeQuotes\n if (includeFAQ !== undefined) payload.includeFAQ = includeFAQ\n if (targetAudience) payload.targetAudience = targetAudience\n\n try {\n // Use the API base URL from config\n const API_BASE_URL = getApiBaseUrl()\n const apiKey = getApiKey()\n const headers: Record<string, string> = {\n \"Content-Type\": \"application/json\",\n }\n\n // Add API key if available\n if (apiKey) {\n headers[\"x-api-key\"] = apiKey\n }\n\n const response = await fetch(`${API_BASE_URL}/chatboat/rewrite/stream`, {\n method: \"POST\",\n headers,\n credentials: \"include\", \n body: JSON.stringify(payload),\n })\n\n console.log(\"📡 Response status:\", response.status)\n console.log(\"📡 Response headers:\", Object.fromEntries(response.headers.entries()))\n\n if (!response.ok) {\n const errorText = await response.text()\n console.error(\"❌ API Error:\", response.status, errorText)\n throw new Error(`HTTP error! status: ${response.status} - ${errorText}`)\n }\n\n const reader = response.body?.getReader()\n const decoder = new TextDecoder()\n\n if (!reader) {\n throw new Error(\"No reader available\")\n }\n\n let buffer = \"\"\n let hasReceivedData = false\n\n while (true) {\n const { done, value } = await reader.read()\n\n if (done) {\n if (hasReceivedData) {\n onComplete?.()\n }\n break\n }\n\n // Decode the chunk\n const chunk = decoder.decode(value, { stream: true })\n buffer += chunk\n\n // Process complete lines\n const lines = buffer.split(\"\\n\")\n buffer = lines.pop() || \"\" // Keep the incomplete line in buffer\n\n for (const line of lines) {\n const trimmedLine = line.trim()\n if (trimmedLine === \"\") continue\n\n hasReceivedData = true\n console.log(\"📨 Received line:\", trimmedLine.substring(0, 100) + (trimmedLine.length > 100 ? \"...\" : \"\"))\n\n // Handle SSE format (data: {...})\n if (trimmedLine.startsWith(\"data: \")) {\n const data = trimmedLine.slice(6).trim()\n\n if (data === \"[DONE]\") {\n console.log(\"✅ Stream completed with [DONE] signal\")\n onComplete?.()\n return\n }\n\n try {\n const parsed = JSON.parse(data)\n console.log(\"📋 Parsed JSON:\", parsed)\n\n if (parsed.content) {\n onChunk(parsed.content)\n } else if (parsed.delta) {\n onChunk(parsed.delta)\n } else if (parsed.text) {\n onChunk(parsed.text)\n } else if (parsed.chunk) {\n onChunk(parsed.chunk)\n } else if (typeof parsed === 'string') {\n onChunk(parsed)\n } else {\n console.warn(\"⚠️ Unknown JSON format:\", parsed)\n }\n } catch (e) {\n // If not JSON, treat as plain text\n console.log(\"📝 Non-JSON data, treating as plain text\")\n if (data) {\n onChunk(data)\n }\n }\n } else {\n // Plain text streaming (non-SSE format)\n console.log(\"📄 Plain text chunk\")\n if (trimmedLine) {\n onChunk(trimmedLine + \"\\n\")\n }\n }\n }\n }\n\n if (!hasReceivedData) {\n console.error(\"❌ No data received from stream\")\n throw new Error(\"No data received from stream\")\n }\n\n console.log(\"✅ Stream completed successfully\")\n } catch (error: any) {\n console.error(\"❌ Streaming error:\", error)\n console.error(\"Error details:\", {\n message: error.message,\n name: error.name,\n stack: error.stack\n })\n onError?.(error)\n throw error\n }\n}\n\n/**\n * Non-streaming version (fallback)\n */\nexport const rewriteNewsApi = async ({\n article,\n language = \"English\",\n articleId,\n tone,\n style,\n wordCount,\n includeQuotes,\n includeFAQ,\n targetAudience,\n}: {\n article: string\n language?: string\n articleId?: string\n tone?: string\n style?: string\n wordCount?: string\n includeQuotes?: boolean\n includeFAQ?: boolean\n targetAudience?: string\n}) => {\n const payload: Record<string, any> = {\n article,\n language,\n }\n\n // Include articleId if available\n if (articleId) {\n payload.articleId = articleId\n }\n\n // Include content generation preferences\n if (tone) payload.tone = tone\n if (style) payload.style = style\n if (wordCount) payload.wordCount = wordCount\n if (includeQuotes !== undefined) payload.includeQuotes = includeQuotes\n if (includeFAQ !== undefined) payload.includeFAQ = includeFAQ\n if (targetAudience) payload.targetAudience = targetAudience\n\n const { data } = await api.post(\"/chat/rewrite\", payload)\n\n return data.data;\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAEA,IAAAA,iBAA0B;;;ACD1B,mBAA0E;;;ACD1E,mBAAkB;;;ACAlB,IAAI,UAAU,QAAQ,IAAI,iCAAiC;AAC3D,IAAI,UAAU,QAAQ,IAAI,uBAAuB;AACjD,IAAI,UAAU,QAAQ,IAAI,sBAAsB;AAEzC,SAAS,UAAU,QAA+D;AACvF,MAAI,OAAO,OAAQ,WAAU,OAAO;AACpC,MAAI,OAAO,OAAQ,WAAU,OAAO;AACpC,MAAI,OAAO,OAAQ,WAAU,OAAO;AACtC;AAEO,SAAS,gBAAwB;AACtC,SAAO;AACT;AAEO,SAAS,mBAA2B;AACzC,SAAO,QAAQ,QAAQ,aAAa,EAAE;AACxC;AAEO,SAAS,YAAoB;AAClC,SAAO;AACT;;;ADjBA,IAAM,MAAM,aAAAC,QAAM,OAAO;AAAA,EACvB,SAAS,cAAc;AAAA,EACvB,iBAAiB;AAAA,EACjB,SAAS;AAAA,IACP,gBAAgB;AAAA,EAClB;AACF,CAAC;AAKD,IAAI,aAAa,QAAQ;AAAA,EACvB,CAAC,WAAW;AACV,UAAM,SAAS,UAAU;AACzB,QAAI,QAAQ;AACV,aAAO,QAAQ,WAAW,IAAI;AAAA,IAChC;AACA,WAAO;AAAA,EACT;AAAA,EACA,CAAC,UAAU,QAAQ,OAAO,KAAK;AACjC;AAKA,IAAI,aAAa,SAAS;AAAA,EACxB,CAAC,aAAa;AAAA,EACd,CAAC,UAAU;AA9Bb;AAgCI,UAAM,YACJ,iBAAM,aAAN,mBAAgB,SAAhB,mBAAsB,YACtB,MAAM,WACN;AAEF,WAAO,QAAQ,OAAO,OAAO;AAAA,EAC/B;AACF;AAEA,IAAO,cAAQ;;;AEpCR,IAAM,sBAAsB,YAAY;AAC7C,QAAM,EAAE,KAAK,IAAI,MAAM,YAAI,IAAI,0BAA0B;AACzD,SAAO,KAAK;AACd;AAKO,IAAM,qBAAqB,OAAO;AAAA,EACvC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,MAmBM;AACJ,QAAM,WAAW,IAAI,SAAS;AAE9B,MAAI,SAAS;AACX,aAAS,OAAO,WAAW,OAAO;AAAA,EACpC;AAEA,MAAI,MAAM;AACR,aAAS,OAAO,QAAQ,IAAI;AAAA,EAC9B;AAEA,MAAI,OAAO;AACT,aAAS,OAAO,SAAS,KAAK;AAAA,EAChC;AAEA,MAAI,QAAQ;AACV,aAAS,OAAO,UAAU,KAAK,UAAU,MAAM,CAAC;AAAA,EAClD;AAEA,MAAI,cAAc;AAChB,aAAS,OAAO,gBAAgB,YAAY;AAAA,EAC9C;AAEA,MAAI,gBAAgB;AAClB,aAAS,OAAO,kBAAkB,cAAc;AAAA,EAClD;AAEA,MAAI,OAAO;AACT,aAAS,OAAO,SAAS,KAAK;AAAA,EAChC;AAEA,MAAI,UAAU;AACZ,aAAS,OAAO,YAAY,QAAQ;AAAA,EACtC;AAEA,MAAI,gBAAgB,QAAW;AAC7B,aAAS,OAAO,eAAe,OAAO,WAAW,CAAC;AAAA,EACpD;AAEA,MAAI,eAAe,QAAW;AAC5B,aAAS,OAAO,cAAc,OAAO,UAAU,CAAC;AAAA,EAClD;AAEA,MAAI,sBAAsB,QAAW;AACnC,aAAS,OAAO,qBAAqB,gDAAqB,EAAE;AAAA,EAC9D;AAEA,MAAI,kBAAkB,QAAW;AAC/B,aAAS,OAAO,iBAAiB,OAAO,aAAa,CAAC;AAAA,EACxD;AAEA,MAAI,MAAM;AACR,aAAS,OAAO,QAAQ,IAAI;AAAA,EAC9B;AAEA,MAAI,OAAO;AACT,aAAS,OAAO,SAAS,KAAK;AAAA,EAChC;AAEA,MAAI,WAAW;AACb,aAAS,OAAO,aAAa,SAAS;AAAA,EACxC;AAEA,MAAI,kBAAkB,QAAW;AAC/B,aAAS,OAAO,iBAAiB,OAAO,aAAa,CAAC;AAAA,EACxD;AAEA,MAAI,eAAe,QAAW;AAC5B,aAAS,OAAO,cAAc,OAAO,UAAU,CAAC;AAAA,EAClD;AAEA,MAAI,mBAAmB,QAAW;AAChC,aAAS,OAAO,kBAAkB,cAAc;AAAA,EAClD;AAEA,QAAM,EAAE,KAAK,IAAI,MAAM,YAAI,IAAI,yBAAyB,UAAU;AAAA,IAChE,SAAS;AAAA,MACP,gBAAgB;AAAA,IAClB;AAAA,EACF,CAAC;AAED,SAAO,KAAK;AACd;;;AH6BI;AAxGJ,IAAM,qBAAkC;AAAA,EACtC,SAAS;AAAA,IACP,MAAM;AAAA,IACN,cAAc;AAAA,IACd,gBAAgB;AAAA,IAChB,OAAO;AAAA,EACT;AAAA,EACA,cAAc;AAAA,IACZ,SAAS;AAAA,IACT,OAAO;AAAA,IACP,QAAQ,CAAC;AAAA,IACT,UAAU;AAAA,IACV,QAAQ;AAAA,IACR,UAAU;AAAA,EACZ;AAAA,EACA,YAAY;AAAA,IACV,aAAa;AAAA,IACb,YAAY;AAAA,IACZ,mBAAmB;AAAA,IACnB,eAAe;AAAA,EACjB;AAAA,EACA,SAAS;AAAA,IACP,MAAM;AAAA,IACN,OAAO;AAAA,IACP,WAAW;AAAA,IACX,eAAe;AAAA,IACf,YAAY;AAAA,IACZ,gBAAgB;AAAA,EAClB;AACF;AAEA,IAAM,yBAAqB,4BAAkD,MAAS;AAE/E,SAAS,oBAAoB,EAAE,SAAS,GAA4B;AACzE,QAAM,CAAC,aAAa,cAAc,QAAI,uBAA6B,kBAAkB;AACrF,QAAM,CAAC,SAAS,UAAU,QAAI,uBAAS,IAAI;AAC3C,QAAM,CAAC,OAAO,QAAQ,QAAI,uBAAwB,IAAI;AAEtD,QAAM,qBAAqB,YAAY;AAhGzC;AAiGI,QAAI;AACF,iBAAW,IAAI;AACf,eAAS,IAAI;AACb,YAAM,OAAO,MAAM,oBAAoB;AAEvC,UAAI,MAAM;AAER,cAAI,UAAK,YAAL,mBAAc,YAAW,CAAC,KAAK,QAAQ,QAAQ,WAAW,MAAM,GAAG;AACrE,eAAK,QAAQ,UAAU,GAAG,iBAAiB,CAAC,IAAI,KAAK,QAAQ,OAAO;AAAA,QACtE;AAGA,cAAM,oBAAiC,gDAClC,qBACA,OAFkC;AAAA,UAGrC,SAAS,kCACJ,mBAAmB,UACnB,KAAK;AAAA,UAEV,cAAc,kCACT,mBAAmB,eACnB,KAAK;AAAA,UAEV,YAAY,kCACP,mBAAmB,aACnB,KAAK;AAAA,UAEV,SAAS,kCACJ,mBAAmB,UACnB,KAAK;AAAA,QAEZ;AAEA,uBAAe,iBAAiB;AAGhC,YAAI,OAAO,aAAa,aAAa;AACnC,mBAAS,gBAAgB,MAAM,YAAY,qBAAmB,uBAAkB,YAAlB,mBAA2B,iBAAgB,SAAS;AAClH,mBAAS,gBAAgB,MAAM,YAAY,uBAAqB,uBAAkB,YAAlB,mBAA2B,mBAAkB,SAAS;AAAA,QACxH;AAAA,MACF;AAAA,IACF,SAAS,KAAK;AACZ,cAAQ,MAAM,gCAAgC,GAAG;AACjD,eAAS,eAAe,QAAQ,IAAI,UAAU,4BAA4B;AAC1E,qBAAe,kBAAkB;AAAA,IACnC,UAAE;AACA,iBAAW,KAAK;AAAA,IAClB;AAAA,EACF;AAEA,QAAM,oBAAoB,CAAC,mBAAgC;AAnJ7D;AAoJI,mBAAe,cAAc;AAG7B,QAAI,OAAO,aAAa,aAAa;AACnC,eAAS,gBAAgB,MAAM,YAAY,qBAAmB,oBAAe,YAAf,mBAAwB,iBAAgB,SAAS;AAC/G,eAAS,gBAAgB,MAAM,YAAY,uBAAqB,oBAAe,YAAf,mBAAwB,mBAAkB,SAAS;AAAA,IACrH;AAAA,EACF;AAEA,8BAAU,MAAM;AACd,uBAAmB;AAAA,EACrB,GAAG,CAAC,CAAC;AAEL,SACE;AAAA,IAAC,mBAAmB;AAAA,IAAnB;AAAA,MACC,OAAO;AAAA,QACL;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACF;AAAA,MAEC;AAAA;AAAA,EACH;AAEJ;AAEO,SAAS,iBAAiB;AAC/B,QAAM,cAAU,yBAAW,kBAAkB;AAC7C,MAAI,YAAY,QAAW;AACzB,UAAM,IAAI,MAAM,0DAA0D;AAAA,EAC5E;AACA,SAAO;AACT;;;AIpLA,IAAAC,iBAAyB;;;ACFlB,SAAS,sBAAsB,KAIpC;AACA,MAAI,CAAC,KAAK;AACR,WAAO,EAAE,SAAS,IAAI,cAAc,CAAC,EAAE;AAAA,EACzC;AAGA,MAAI,CAAC,IAAI,KAAK,EAAE,WAAW,GAAG,GAAG;AAC/B,WAAO;AAAA,MACL,SAAS;AAAA,MACT,cAAc,CAAC;AAAA,IACjB;AAAA,EACF;AAEA,MAAI;AACF,UAAM,SAAS,KAAK,MAAM,GAAG;AAE7B,WAAO;AAAA,MACL,OAAO,OAAO,SAAS;AAAA,MACvB,SAAS,OAAO,WAAW,OAAO,WAAW;AAAA,MAC7C,cAAc,MAAM,QAAQ,OAAO,YAAY,IAC3C,OAAO,eACP,CAAC;AAAA,IACP;AAAA,EACF,SAAQ;AAEN,UAAM,UACJ,IACG,QAAQ,8BAA8B,EAAE,EACxC,QAAQ,kCAAkC,EAAE,EAC5C,QAAQ,UAAU,EAAE,KAAK;AAE9B,WAAO;AAAA,MACL;AAAA,MACA,cAAc,CAAC;AAAA,IACjB;AAAA,EACF;AACF;AAGO,IAAM,YAAY,CAAC,KAAa,YAAoB;AACzD,QAAM,eAAe,IAAI,QAAQ,KAAK,EAAE;AAExC,QAAM,IAAI,SAAS,aAAa,UAAU,GAAG,CAAC,GAAG,EAAE;AACnD,QAAM,IAAI,SAAS,aAAa,UAAU,GAAG,CAAC,GAAG,EAAE;AACnD,QAAM,IAAI,SAAS,aAAa,UAAU,GAAG,CAAC,GAAG,EAAE;AAEnD,SAAO,QAAQ,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,OAAO;AAC1C;;;AChDA,IAAAC,uBAAgI;AAEhI,IAAAC,gBAA6D;;;ACH7D,IAAAC,uBAAkB;AAClB,IAAAC,gBAAoC;;;ACDpC,IAAAC,gBAAyC;AACzC,yBAAuB;AACvB,mCAAwB;AACxB,0BAUO;AACP,IAAAA,gBAA0B;AA6CpB,IAAAC,sBAAA;AArCS,SAAR,eAAgC;AAAA,EACrC;AAAA,EACA;AAAA,EACA,cAAc;AAChB,GAAwB;AACtB,QAAM,aAAS,yBAAU;AAAA,IACvB,mBAAmB;AAAA;AAAA,IACnB,YAAY;AAAA,MACV,mBAAAC,QAAW,UAAU;AAAA,QACnB,SAAS;AAAA,UACP,QAAQ,CAAC,GAAG,CAAC;AAAA,QACf;AAAA,MACF,CAAC;AAAA,MACD,6BAAAC,QAAY,UAAU;AAAA,QACpB;AAAA,MACF,CAAC;AAAA,IACH;AAAA,IACA;AAAA,IACA,aAAa;AAAA,MACX,YAAY;AAAA,QACV,OAAO;AAAA,MACT;AAAA,IACF;AAAA,IACA,UAAU,CAAC,EAAE,QAAAC,QAAO,MAAM;AACxB,eAASA,QAAO,QAAQ,CAAC;AAAA,IAC3B;AAAA,EACF,CAAC;AAGD,+BAAU,MAAM;AACd,QAAI,UAAU,YAAY,OAAO,QAAQ,GAAG;AAC1C,aAAO,SAAS,WAAW,OAAO;AAAA,IACpC;AAAA,EACF,GAAG,CAAC,SAAS,MAAM,CAAC;AAEpB,MAAI,CAAC,QAAQ;AACX,WACE,6CAAC,SAAI,WAAU,uBAAsB,+BAErC;AAAA,EAEJ;AAEA,SACE,8CAAC,SAAI,WAAU,eAEb;AAAA,kDAAC,SAAI,WAAU,gBACb;AAAA;AAAA,QAAC;AAAA;AAAA,UACC,SAAS,MAAM,OAAO,MAAM,EAAE,MAAM,EAAE,cAAc,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI;AAAA,UACtE,UAAU,OAAO,SAAS,WAAW,EAAE,OAAO,EAAE,CAAC;AAAA,UACjD,OAAM;AAAA,UAEN,uDAAC,gCAAS,MAAM,IAAI;AAAA;AAAA,MACtB;AAAA,MAEA;AAAA,QAAC;AAAA;AAAA,UACC,SAAS,MAAM,OAAO,MAAM,EAAE,MAAM,EAAE,cAAc,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI;AAAA,UACtE,UAAU,OAAO,SAAS,WAAW,EAAE,OAAO,EAAE,CAAC;AAAA,UACjD,OAAM;AAAA,UAEN,uDAAC,gCAAS,MAAM,IAAI;AAAA;AAAA,MACtB;AAAA,MAEA;AAAA,QAAC;AAAA;AAAA,UACC,SAAS,MAAM,OAAO,MAAM,EAAE,MAAM,EAAE,aAAa,EAAE,IAAI;AAAA,UACzD,UAAU,OAAO,SAAS,WAAW;AAAA,UACrC,OAAM;AAAA,UAEN,uDAAC,+BAAQ,MAAM,IAAI;AAAA;AAAA,MACrB;AAAA,MAEA,6CAAC,SAAI,WAAU,wBAAuB;AAAA,MAEtC;AAAA,QAAC;AAAA;AAAA,UACC,SAAS,MAAM,OAAO,MAAM,EAAE,MAAM,EAAE,WAAW,EAAE,IAAI;AAAA,UACvD,UAAU,OAAO,SAAS,MAAM;AAAA,UAChC,OAAM;AAAA,UAEN,uDAAC,4BAAK,MAAM,IAAI;AAAA;AAAA,MAClB;AAAA,MAEA;AAAA,QAAC;AAAA;AAAA,UACC,SAAS,MAAM,OAAO,MAAM,EAAE,MAAM,EAAE,aAAa,EAAE,IAAI;AAAA,UACzD,UAAU,OAAO,SAAS,QAAQ;AAAA,UAClC,OAAM;AAAA,UAEN,uDAAC,8BAAO,MAAM,IAAI;AAAA;AAAA,MACpB;AAAA,MAEA,6CAAC,SAAI,WAAU,wBAAuB;AAAA,MAEtC;AAAA,QAAC;AAAA;AAAA,UACC,SAAS,MAAM,OAAO,MAAM,EAAE,MAAM,EAAE,iBAAiB,EAAE,IAAI;AAAA,UAC7D,UAAU,OAAO,SAAS,YAAY;AAAA,UACtC,OAAM;AAAA,UAEN,uDAAC,4BAAK,MAAM,IAAI;AAAA;AAAA,MAClB;AAAA,MAEA;AAAA,QAAC;AAAA;AAAA,UACC,SAAS,MAAM,OAAO,MAAM,EAAE,MAAM,EAAE,kBAAkB,EAAE,IAAI;AAAA,UAC9D,UAAU,OAAO,SAAS,aAAa;AAAA,UACvC,OAAM;AAAA,UAEN,uDAAC,mCAAY,MAAM,IAAI;AAAA;AAAA,MACzB;AAAA,MAEA,6CAAC,SAAI,WAAU,wBAAuB;AAAA,MAEtC;AAAA,QAAC;AAAA;AAAA,UACC,SAAS,MAAM,OAAO,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI;AAAA,UACjD,UAAU,CAAC,OAAO,IAAI,EAAE,KAAK;AAAA,UAC7B,OAAM;AAAA,UAEN,uDAAC,4BAAK,MAAM,IAAI;AAAA;AAAA,MAClB;AAAA,MAEA;AAAA,QAAC;AAAA;AAAA,UACC,SAAS,MAAM,OAAO,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI;AAAA,UACjD,UAAU,CAAC,OAAO,IAAI,EAAE,KAAK;AAAA,UAC7B,OAAM;AAAA,UAEN,uDAAC,4BAAK,MAAM,IAAI;AAAA;AAAA,MAClB;AAAA,OACF;AAAA,IAGA,6CAAC,+BAAc,QAAgB,WAAU,uBAAsB;AAAA,KACjE;AAEJ;AAUA,SAAS,cAAc;AAAA,EACrB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAAuB;AACrB,SACE;AAAA,IAAC;AAAA;AAAA,MACC;AAAA,MACA;AAAA,MACA;AAAA,MACA,WAAW,oBACT,WAAW,6BAA6B,EAC1C,IAAI,WAAW,+BAA+B,EAAE;AAAA,MAE/C;AAAA;AAAA,EACH;AAEJ;;;ACrLO,SAAS,WAAW;AAF3B;AAGE,QAAM,EAAE,aAAa,QAAQ,IAAI,eAAe;AAEhD,SAAO;AAAA,IACL;AAAA,IACA,gBAAc,gDAAa,YAAb,mBAAsB,iBAAgB;AAAA,IACpD,kBAAgB,gDAAa,YAAb,mBAAsB,mBAAkB;AAAA,IACxD,WAAS,gDAAa,YAAb,mBAAsB,SAAQ;AAAA,IACvC,UAAS,gDAAa,YAAb,mBAAsB;AAAA,IAC/B,SAAO,gDAAa,YAAb,mBAAsB,UAAS;AAAA,IACtC,cAAa,sDAAa,eAAb,mBAAyB,gBAAzB,YAAwC;AAAA,IACrD,aAAY,sDAAa,eAAb,mBAAyB,eAAzB,YAAuC;AAAA,IACnD,oBAAmB,sDAAa,eAAb,mBAAyB,sBAAzB,YAA8C;AAAA,IACjE,gBAAe,sDAAa,eAAb,mBAAyB,kBAAzB,YAA0C;AAAA,EAC3D;AACF;;;AFuEM,IAAAC,sBAAA;AAxES,SAAR,UAA2B;AAAA,EAChC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAAmB;AACjB,QAAM,EAAE,aAAa,IAAI,SAAS;AAClC,QAAM,CAAC,SAAS,UAAU,QAAI,wBAAS,EAAE;AACzC,QAAM,CAAC,UAAU,WAAW,QAAI,wBAAmB,YAAY;AAC/D,QAAM,CAAC,YAAY,aAAa,QAAI,wBAAS,EAAE;AAG/C,QAAM,iBAAiB,CAAC,SAAyB;AAC/C,UAAM,QAAQ,KAAK,MAAM,IAAI,EAAE,OAAO,UAAQ,KAAK,KAAK,CAAC;AACzD,QAAI,OAAO;AAEX,UAAM,QAAQ,UAAQ;AACpB,YAAM,UAAU,KAAK,KAAK;AAC1B,UAAI,QAAQ,WAAW,IAAI,GAAG;AAC5B,gBAAQ,OAAO,QAAQ,QAAQ,SAAS,EAAE,CAAC;AAAA,MAC7C,WAAW,QAAQ,WAAW,KAAK,GAAG;AACpC,gBAAQ,OAAO,QAAQ,QAAQ,UAAU,EAAE,CAAC;AAAA,MAC9C,OAAO;AACL,gBAAQ,MAAM,OAAO;AAAA,MACvB;AAAA,IACF,CAAC;AAED,WAAO;AAAA,EACT;AAEA,+BAAU,MAAM;AACd,UAAM,cAAc,eAAe,cAAc;AACjD,eAAW,WAAW;AACtB,gBAAY,YAAY;AAAA,EAC1B,GAAG,CAAC,gBAAgB,YAAY,CAAC;AAEjC,+BAAU,MAAM;AACd,QAAI,QAAQ;AACV,eAAS,KAAK,MAAM,WAAW;AAAA,IACjC,OAAO;AACL,eAAS,KAAK,MAAM,WAAW;AAAA,IACjC;AACA,WAAO,MAAM;AACX,eAAS,KAAK,MAAM,WAAW;AAAA,IACjC;AAAA,EACF,GAAG,CAAC,MAAM,CAAC;AAEX,QAAM,mBAAmB,MAAM;AAC7B,QAAI,WAAW,KAAK,KAAK,CAAC,SAAS,SAAS,WAAW,KAAK,CAAC,GAAG;AAC9D,kBAAY,CAAC,GAAG,UAAU,WAAW,KAAK,CAAC,CAAC;AAC5C,oBAAc,EAAE;AAAA,IAClB;AAAA,EACF;AAEA,QAAM,sBAAsB,CAAC,UAAkB;AAC7C,gBAAY,SAAS,OAAO,CAAC,GAAG,MAAM,MAAM,KAAK,CAAC;AAAA,EACpD;AAEA,QAAM,gBAAgB,CAAC,MAA2B;AAChD,QAAI,EAAE,QAAQ,SAAS;AACrB,QAAE,eAAe;AACjB,uBAAiB;AAAA,IACnB;AAAA,EACF;AAEA,MAAI,CAAC,OAAQ,QAAO;AAEpB,SACE,8CAAC,SAAI,WAAU,2BAEb;AAAA;AAAA,MAAC;AAAA;AAAA,QACC,WAAU;AAAA,QACV,SAAS;AAAA;AAAA,IACX;AAAA,IAGA,8CAAC,SAAI,WAAU,mBAEb;AAAA,oDAAC,SAAI,WAAU,0BACb;AAAA,qDAAC,QAAG,WAAU,yBAAwB,0BAAY;AAAA,QAClD;AAAA,UAAC;AAAA;AAAA,YACC,SAAS;AAAA,YACT,WAAU;AAAA,YAEV,uDAAC,0BAAE,MAAM,IAAI,WAAU,8BAA6B;AAAA;AAAA,QACtD;AAAA,SACF;AAAA,MAGA,8CAAC,SAAI,WAAU,wBAEb;AAAA,sDAAC,SACC;AAAA,uDAAC,WAAM,WAAU,mBAAkB,6BAEnC;AAAA,UACA;AAAA,YAAC;AAAA;AAAA,cACC;AAAA,cACA,UAAU;AAAA,cACV,aAAY;AAAA;AAAA,UACd;AAAA,WACF;AAAA,QAGA,8CAAC,SACC;AAAA,uDAAC,WAAM,WAAU,mBAAkB,2BAEnC;AAAA,UACA,6CAAC,SAAI,WAAU,qBACZ,mBAAS,IAAI,CAAC,SAAS,UACtB;AAAA,YAAC;AAAA;AAAA,cAEC,WAAU;AAAA,cACX;AAAA;AAAA,gBACG;AAAA,gBACF;AAAA,kBAAC;AAAA;AAAA,oBACC,SAAS,MAAM,oBAAoB,KAAK;AAAA,oBACxC,WAAU;AAAA,oBAEV,uDAAC,0BAAE,MAAM,IAAI;AAAA;AAAA,gBACf;AAAA;AAAA;AAAA,YATK;AAAA,UAUP,CACD,GACH;AAAA,UACA,8CAAC,SAAI,WAAU,0BACb;AAAA;AAAA,cAAC;AAAA;AAAA,gBACC,MAAK;AAAA,gBACL,OAAO;AAAA,gBACP,UAAU,OAAK,cAAc,EAAE,OAAO,KAAK;AAAA,gBAC3C,WAAW;AAAA,gBACX,aAAY;AAAA,gBACZ,WAAU;AAAA;AAAA,YACZ;AAAA,YACA;AAAA,cAAC;AAAA;AAAA,gBACC,SAAS;AAAA,gBACT,WAAU;AAAA,gBACX;AAAA;AAAA,YAED;AAAA,aACF;AAAA,WACF;AAAA,SACF;AAAA,MAGA,8CAAC,SAAI,WAAU,0BACb;AAAA;AAAA,UAAC;AAAA;AAAA,YACC,SAAS;AAAA,YACT,WAAU;AAAA,YACX;AAAA;AAAA,QAED;AAAA,QACA;AAAA,UAAC;AAAA;AAAA,YACC,SAAS,MAAM,YAAY,SAAS,QAAQ;AAAA,YAC5C,WAAU;AAAA,YACX;AAAA;AAAA,QAED;AAAA,QACA;AAAA,UAAC;AAAA;AAAA,YACC,SAAS,MAAM,OAAO,SAAS,QAAQ;AAAA,YACvC,WAAU;AAAA,YACV,OAAO,EAAE,iBAAiB,cAAc,OAAO,OAAO;AAAA,YACvD;AAAA;AAAA,QAED;AAAA,SACF;AAAA,OACF;AAAA,KACF;AAEJ;;;AGxLA,IAAAC,gBAAyB;AACzB,IAAAC,uBAAgC;AAiFhB,IAAAC,sBAAA;AA9EhB,IAAM,gBAAgB,IAAI,KAAK,eAAe,SAAS;AAAA,EACrD,KAAK;AAAA,EACL,OAAO;AAAA,EACP,MAAM;AACR,CAAC;AAED,IAAM,gBAAgB,IAAI,KAAK,eAAe,SAAS;AAAA,EACrD,MAAM;AAAA,EACN,QAAQ;AAAA,EACR,QAAQ;AACV,CAAC;AAED,SAAS,wBAAwB,MAAe;AAC9C,MAAI,CAAC,KAAM,QAAO,CAAC;AAEnB,QAAM,SAAS,IAAI,UAAU;AAC7B,QAAM,MAAM,OAAO,gBAAgB,MAAM,WAAW;AAEpD,SAAO,MAAM,KAAK,IAAI,iBAAiB,IAAI,CAAC,EAAE,IAAI,CAAC,OAAO;AACxD,UAAM,SAAS,GAAG,cAAc,GAAG;AACnC,UAAM,SAAS,GAAG,cAAc,MAAM;AAEtC,WAAO;AAAA,MACL,QAAO,iCAAQ,gBAAe;AAAA,MAC9B,MAAK,iCAAQ,aAAa,YAAW;AAAA,MACrC,SAAQ,iCAAQ,gBAAe;AAAA,IACjC;AAAA,EACF,CAAC;AACH;AAEe,SAAR,SAA0B;AAAA,EAC/B;AAAA,EACA;AAAA,EACA;AACF,GAMG;AAED,QAAM,EAAE,aAAa,IAAI,SAAS;AAElC,QAAO,CAAC,iBAAiB,QAAI,wBAAc,YAAY;AAEvD,QAAM,eAAe,CAAC,KAAY,UAAU,OAAO;AACnD,UAAM,IAAI,QAAQ,KAAK,EAAE;AAEzB,QAAI,IAAI,SAAS,IAAI,UAAU,GAAG,CAAC,GAAG,EAAE;AACxC,QAAI,IAAI,SAAS,IAAI,UAAU,GAAG,CAAC,GAAG,EAAE;AACxC,QAAI,IAAI,SAAS,IAAI,UAAU,GAAG,CAAC,GAAG,EAAE;AAExC,QAAI,KAAK,MAAM,KAAK,MAAM,MAAM,UAAU,IAAI;AAC9C,QAAI,KAAK,MAAM,KAAK,MAAM,MAAM,UAAU,IAAI;AAC9C,QAAI,KAAK,MAAM,KAAK,MAAM,MAAM,UAAU,IAAI;AAE9C,WAAO,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC;AAAA,EAC7B;AAKE,SACE,6CAAC,SAAI,WAAU,kBACZ,eAAK,QAAQ,CAAC,SAAS;AACtB,UAAM,gBAAgB,IAAI,KAAK,KAAK,WAAW;AAC/C,UAAM,QAAQ,wBAAwB,KAAK,OAAO;AAGlD,QAAI,MAAM,SAAS,GAAG;AACpB,aAAO,MAAM,IAAI,CAAC,MAAM,QACtB;AAAA,QAAC;AAAA;AAAA,UAEC,WAAU;AAAA,UAGV;AAAA,0DAAC,SAAI,WAAU,0BACb;AAAA,2DAAC,OAAE,WAAU,wBACV,eAAK,OACR;AAAA,cAEA,8CAAC,SAAI,WAAU,uBACZ;AAAA;AAAA,kBAAC;AAAA;AAAA,oBACA,WAAU;AAAA,oBACV,OAAO;AAAA,sBACL,iBAAiB,aAAa,mBAAmB,EAAE;AAAA,sBACnD,OAAO;AAAA,sBACP,aAAa,aAAa,mBAAmB,EAAE;AAAA,oBACjD;AAAA,oBAEC,eAAK,UAAU,KAAK;AAAA;AAAA,gBACvB;AAAA,gBAEA,6CAAC,UAAK,oBAAC;AAAA,gBACP,6CAAC,UAAK,WAAU,2BAA2B,eAAK,UAAS;AAAA,gBACzD,6CAAC,UAAK,oBAAC;AAAA,gBAEP,8CAAC,UACE;AAAA,gCAAc,OAAO,aAAa;AAAA,kBAAG;AAAA,kBACrC,cAAc,OAAO,aAAa;AAAA,mBACrC;AAAA,iBACF;AAAA,eACF;AAAA,YAGA,8CAAC,SAAI,WAAU,0BACb;AAAA;AAAA,gBAAC;AAAA;AAAA,kBACC,SAAS,MAAM,OAAO,KAAK,KAAK,KAAK,QAAQ;AAAA,kBAC7C,WAAU;AAAA,kBACV,OAAM;AAAA,kBAEN,uDAAC,4BAAI,MAAM,IAAI;AAAA;AAAA,cACjB;AAAA,cAEA;AAAA,gBAAC;AAAA;AAAA,kBACC,SAAS,MACP,WAAW;AAAA,oBACT,OAAO,KAAK;AAAA,oBACZ,SAAS,KAAK;AAAA,oBACd,IAAI,KAAK;AAAA,kBACX,CAAC;AAAA,kBAEH,WAAU;AAAA,kBACV,OAAM;AAAA,kBAEN,uDAAC,mCAAW,MAAM,IAAI;AAAA;AAAA,cACxB;AAAA,eACF;AAAA;AAAA;AAAA,QAvDK,GAAG,KAAK,GAAG,SAAS,GAAG;AAAA,MAwD9B,CACD;AAAA,IACH;AAGA,WACE;AAAA,MAAC;AAAA;AAAA,QAEC,WAAU;AAAA,QAGV;AAAA,wDAAC,SAAI,WAAU,0BACb;AAAA,yDAAC,OAAE,WAAU,wBACV,eAAK,OACR;AAAA,YAEA,8CAAC,SAAI,WAAU,uBACb;AAAA;AAAA,gBAAC;AAAA;AAAA,kBACD,WAAU;AAAA,kBACV,OAAO;AAAA,oBACL,iBAAiB,aAAa,mBAAmB,EAAE;AAAA,oBACnD,OAAO;AAAA,oBACP,aAAa,aAAa,mBAAmB,EAAE;AAAA,kBACjD;AAAA,kBAEC,eAAK;AAAA;AAAA,cACR;AAAA,cAEE,6CAAC,UAAK,oBAAC;AAAA,cACP,6CAAC,UAAK,WAAU,2BAA2B,eAAK,UAAS;AAAA,cACzD,6CAAC,UAAK,oBAAC;AAAA,cAEP,8CAAC,UACE;AAAA,8BAAc,OAAO,aAAa;AAAA,gBAAG;AAAA,gBACrC,cAAc,OAAO,aAAa;AAAA,iBACrC;AAAA,eACF;AAAA,aACF;AAAA,UAGA,8CAAC,SAAI,WAAU,0BACb;AAAA;AAAA,cAAC;AAAA;AAAA,gBACC,SAAS,MAAM,OAAO,IAAI;AAAA,gBAC1B,WAAU;AAAA,gBACV,OAAM;AAAA,gBAEN,uDAAC,4BAAI,MAAM,IAAI;AAAA;AAAA,YACjB;AAAA,YAEA;AAAA,cAAC;AAAA;AAAA,gBACC,SAAS,MACP,WAAW;AAAA,kBACT,OAAO,KAAK;AAAA,kBACZ,SAAS,KAAK,WAAW,KAAK;AAAA,kBAC9B,IAAI,KAAK;AAAA,gBACX,CAAC;AAAA,gBAEH,WAAU;AAAA,gBACV,OAAM;AAAA,gBAEN,uDAAC,mCAAW,MAAM,IAAI;AAAA;AAAA,YACxB;AAAA,aACF;AAAA;AAAA;AAAA,MAvDK,KAAK;AAAA,IAwDZ;AAAA,EAEJ,CAAC,GACH;AAEJ;;;ACxMO,IAAM,kBAAkB,YAAY;AACzC,QAAM,EAAE,KAAK,IAAI,MAAM,YAAI,IAAI,oBAAoB;AACnD,SAAO,KAAK;AACd;AAKO,IAAM,iBAAiB,YAAY;AACxC,QAAM,EAAE,KAAK,IAAI,MAAM,YAAI,IAAI,0BAA0B;AACzD,SAAO,KAAK;AACd;AAKO,IAAM,mBAAmB,OAAO,aAAqB;AAC1D,QAAM,EAAE,KAAK,IAAI,MAAM,YAAI,KAAK,2BAA2B,EAAE,SAAS,CAAC;AACvE,SAAO,KAAK;AACd;AAKO,IAAM,kBAAkB,OAAO,aAAqB;AACzD,QAAM,EAAE,KAAK,IAAI,MAAM,YAAI,IAAI,8BAA8B,QAAQ,EAAE;AACvE,SAAO,KAAK;AACd;;;ALpBA,0BAAoC;AA8RV,IAAAC,sBAAA;AA1Q1B,IAAM,eAAgD;AAAA,EACpD,kBAAkB;AAAA,EAClB,gBAAgB;AAAA,EAChB,qBAAqB;AAAA,EACrB,kBAAkB;AAAA,EAClB,mBAAmB;AAAA,EACnB,oBAAoB;AACtB;AAEe,SAAR,WAA4B;AAAA,EACjC;AAAA,EACA;AAAA,EACA;AAAA,EACA,cAAc;AAAA,EACd;AAAA,EACA;AAAA,EACA,QAAQ;AACV,GAaG;AA3DH;AA4DE,QAAM,EAAE,SAAS,cAAc,IAAI,SAAS;AAC5C,QAAM,gBAAY,sBAAuB,IAAI;AAC7C,QAAM,kBAAc,sBAA4B,IAAI;AACpD,QAAM,kBAAc,sBAAuB,IAAI;AAC/C,QAAM,CAAC,OAAO,QAAQ,QAAI,wBAAS,EAAE;AACrC,QAAM,CAAC,UAAU,WAAW,QAAI,wBAAwB,IAAI;AAC5D,QAAM,CAAC,kBAAkB,mBAAmB,QAAI,wBAAS,KAAK;AAE9D,QAAM,CAAC,cAAc,eAAe,QAAI,wBAAgB,CAAC,CAAC;AAC1D,QAAM,CAAC,aAAa,cAAc,QAAI,wBAAS,KAAK;AAEpD,QAAM,CAAC,SAAS,UAAU,QAAI,wBAAgB,CAAC,CAAC;AAChD,QAAM,CAAC,gBAAgB,iBAAiB,QAAI,wBAAwB,IAAI;AACxE,QAAM,CAAC,gBAAgB,iBAAiB,QAAI,wBAAS,KAAK;AAC1D,QAAM,CAAC,UAAU,WAAW,QAAI,wBAAS,KAAK;AAC9C,QAAM,CAAC,WAAW,YAAY,QAAI,wBAK/B,EAAE,QAAQ,OAAO,SAAS,IAAI,cAAc,CAAC,GAAG,WAAW,GAAG,CAAC;AAElE,QAAM,EAAE,aAAa,IAAI,SAAS;AAClC,QAAM,EAAE,YAAY,IAAI,eAAe;AACvC,QAAM,qBAAoB,gDAAa,iBAAb,mBAA2B;AAGrD,QAAM,aAAa,OAAO,QAAiB,cAAsB;AAC/D,QAAI;AACF,YAAM,gBAAgB,sBAAsB,MAAM;AAClD,YAAM,UAAU,UAAU,UAAU,aAAa;AACjD,kBAAY,SAAS;AACrB,iBAAW,MAAM,YAAY,IAAI,GAAG,GAAI;AAAA,IAC1C,SAAS,KAAK;AACZ,cAAQ,MAAM,mBAAmB,GAAG;AAAA,IACtC;AAAA,EACF;AAGA,QAAM,wBAAwB,CAAC,WAA4B;AACzD,WAAO,OACJ,IAAI,WAAS;AACZ,UAAI,MAAM,SAAS,KAAM,QAAO,KAAK,MAAM,IAAI;AAC/C,UAAI,MAAM,SAAS,KAAM,QAAO,MAAM,MAAM,IAAI;AAChD,aAAO,MAAM;AAAA,IACf,CAAC,EACA,KAAK,MAAM;AAAA,EAChB;AAEA,QAAM,aAAa,CAAC,QAAiB,cAAwB,cAAsB;AACjF,UAAM,mBAAmB,sBAAsB,MAAM;AACrD,iBAAa,EAAE,QAAQ,MAAM,SAAS,kBAAkB,cAAc,UAAU,CAAC;AAAA,EACnF;AAEA,QAAM,mBAAmB,MAAM;AAC7B,iBAAa,EAAE,QAAQ,OAAO,SAAS,IAAI,cAAc,CAAC,GAAG,WAAW,GAAG,CAAC;AAAA,EAC9E;AAEA,QAAM,kBAAkB,CAAC,SAAiB,aAAuB;AAC/D,YAAQ,IAAI,iBAAiB,EAAE,SAAS,SAAS,CAAC;AAElD,qBAAiB;AAAA,EACnB;AAEA,QAAM,aAAa,CAAC,SAAiB,aAAuB;AAC1D,qDAAiB,SAAS;AAC1B,qBAAiB;AAAA,EACnB;AAEA,qCAAgB,MAAM;AAjIxB,QAAAC;AAkII,KAAAA,MAAA,UAAU,YAAV,gBAAAA,IAAmB,eAAe,EAAE,OAAO,MAAM;AAAA,EACnD,GAAG,CAAC,QAAQ,CAAC;AAEb,QAAM,aAAa,MAAM;AACvB,QAAI,CAAC,MAAM,KAAK,EAAG;AACnB,WAAO,KAAK;AACZ,aAAS,EAAE;AACX,QAAI,YAAY,SAAS;AACvB,kBAAY,QAAQ,MAAM,SAAS;AAAA,IACrC;AAAA,EACF;AAGA,+BAAU,MAAM;AACd,UAAM,WAAW,YAAY;AAC7B,QAAI,UAAU;AACZ,eAAS,MAAM,SAAS;AACxB,eAAS,MAAM,SAAS,GAAG,SAAS,YAAY;AAAA,IAClD;AAAA,EACF,GAAG,CAAC,KAAK,CAAC;AAEV,QAAM,eAAe,YAAY;AAC/B,sBAAkB,IAAI;AACtB,QAAI;AACF,YAAM,OAAO,MAAM,eAAe;AAClC,iBAAW,QAAQ,CAAC,CAAC;AAAA,IACvB,SAAS,KAAK;AACZ,cAAQ,MAAM,4BAA4B,GAAG;AAAA,IAC/C,UAAE;AACA,wBAAkB,KAAK;AAAA,IACzB;AAAA,EACF;AAEA,QAAM,YAAY,OAAO,aAA4B;AACnD,mBAAe,IAAI;AACnB,QAAI;AACF,UAAI;AACJ,UAAI,UAAU;AACZ,eAAO,MAAM,gBAAgB,QAAQ;AAAA,MACvC,OAAO;AACL,eAAO,MAAM,gBAAgB;AAAA,MAC/B;AACA,sBAAgB,QAAQ,CAAC,CAAC;AAAA,IAC5B,SAAS,KAAK;AACZ,cAAQ,MAAM,yBAAyB,GAAG;AAAA,IAC5C,UAAE;AACA,qBAAe,KAAK;AAAA,IACtB;AAAA,EACF;AAEA,QAAM,eAAe,YAAY;AAC/B,QAAI,CAAC,eAAgB;AACrB,gBAAY,IAAI;AAChB,QAAI;AACF,YAAM,iBAAiB,cAAc;AACrC,YAAM,UAAU,cAAc;AAAA,IAChC,SAAS,KAAK;AACZ,cAAQ,MAAM,qBAAqB,GAAG;AAAA,IACxC,UAAE;AACA,kBAAY,KAAK;AAAA,IACnB;AAAA,EACF;AAEA,QAAM,qBAAqB,CAAC,WAAsC;AAjMpE,QAAAA;AAkMI,UAAM,YAAWA,MAAA,iCAAQ,UAAR,OAAAA,MAAiB;AAClC,sBAAkB,QAAQ;AAC1B,cAAU,QAAQ;AAAA,EACpB;AAEA,QAAM,yBAAyB,MAAM;AACnC,wBAAoB,IAAI;AACxB,QAAI,QAAQ,WAAW,GAAG;AACxB,mBAAa;AAAA,IACf;AACA,QAAI,aAAa,WAAW,GAAG;AAC7B,gBAAU,cAAc;AAAA,IAC1B;AAAA,EACF;AAGA,+BAAU,MAAM;AACd,UAAM,qBAAqB,CAAC,UAAsB;AAChD,UAAI,YAAY,WAAW,CAAC,YAAY,QAAQ,SAAS,MAAM,MAAc,GAAG;AAC9E,4BAAoB,KAAK;AAAA,MAC3B;AAAA,IACF;AAEA,QAAI,kBAAkB;AACpB,eAAS,iBAAiB,aAAa,kBAAkB;AAAA,IAC3D;AAEA,WAAO,MAAM;AACX,eAAS,oBAAoB,aAAa,kBAAkB;AAAA,IAC9D;AAAA,EACF,GAAG,CAAC,gBAAgB,CAAC;AAErB,WAAS,gBAAgB,KAGvB;AACA,UAAM,YAAY,sBAAsB,GAAG;AAE3C,QAAI,CAAC,aAAa,CAAC,UAAU,SAAS;AACpC,aAAO,EAAE,QAAQ,CAAC,GAAG,cAAc,CAAC,EAAE;AAAA,IACxC;AAEA,UAAM,EAAE,SAAS,aAAa,IAAI;AAElC,UAAM,aAAa,QAChB,QAAQ,aAAa,EAAE,EACvB,QAAQ,aAAa,EAAE,EACvB,QAAQ,YAAY,IAAI,EACxB,QAAQ,YAAY,IAAI,EACxB,QAAQ,WAAW,IAAI,EACvB,QAAQ,gBAAgB,IAAI;AAE/B,UAAM,QAAQ,WACX,MAAM,IAAI,EACV,IAAI,UAAQ,KAAK,QAAQ,YAAY,EAAE,EAAE,KAAK,CAAC,EAC/C,OAAO,OAAO;AAEjB,UAAM,SAAkB,CAAC;AAEzB,UAAM,QAAQ,CAAC,MAAM,UAAU;AAE7B,UAAI,UAAU,KAAK,KAAK,SAAS,KAAK;AACpC,eAAO,KAAK,EAAE,MAAM,MAAM,MAAM,KAAK,CAAC;AACtC;AAAA,MACF;AAGA,UACE,KAAK,SAAS,MACd,CAAC,KAAK,SAAS,QAAG,KAClB,CAAC,KAAK,SAAS,GAAG,GAClB;AACA,eAAO,KAAK,EAAE,MAAM,MAAM,MAAM,KAAK,CAAC;AACtC;AAAA,MACF;AAEA,aAAO,KAAK,EAAE,MAAM,KAAK,MAAM,KAAK,CAAC;AAAA,IACvC,CAAC;AAED,WAAO,EAAE,QAAQ,aAAa;AAAA,EAChC;AAEA,SACE,8CAAC,SAAI,WAAU,aAEb;AAAA,iDAAC,SAAI,WAAU,kBACb,wDAAC,SAAI,WAAU,oBACZ;AAAA,eAAS,IAAI,SAAO;AAzR/B,YAAAA;AA0RY,cAAM,SAAS,gBAAgB,IAAI,OAAO;AAE1C,eACE,6CAAC,SAAiB,WAAU,YAC1B,wDAAC,SAAI,WAAW,IAAI,SAAS,cAAY,kBAAgB,qBACtD;AAAA,cAAI,SAAS,eAAe,OAAO,OAAO,SAAS,KAClD,6CAAC,SAAI,WAAU,qBACb;AAAA,YAAC;AAAA;AAAA,cACC,SAAS,MAAM,WAAW,OAAO,QAAQ,IAAI,EAAE;AAAA,cAC/C,WAAU;AAAA,cACV,OAAM;AAAA,cAEL,uBAAa,IAAI,KAChB,6CAAC,8BAAM,MAAM,IAAI,WAAU,0BAAyB,IAEpD,6CAAC,6BAAK,MAAM,IAAI;AAAA;AAAA,UAEpB,GACF;AAAA,UAGD,OAAO,OAAO,IAAI,CAAC,OAAO,QAAQ;AACjC,gBAAI,MAAM,SAAS,MAAM;AACvB,qBACE;AAAA,gBAAC;AAAA;AAAA,kBAEC,WAAU;AAAA,kBAET,gBAAM;AAAA;AAAA,gBAHF;AAAA,cAIP;AAAA,YAEJ;AAEA,gBAAI,MAAM,SAAS,MAAM;AACvB,qBACE;AAAA,gBAAC;AAAA;AAAA,kBAEC,WAAU;AAAA,kBAET,gBAAM;AAAA;AAAA,gBAHF;AAAA,cAIP;AAAA,YAEJ;AAEA,mBACE,6CAAC,OAAY,WAAU,gBACpB,gBAAM,QADD,GAER;AAAA,UAEJ,CAAC;AAAA,UAGA,OAAO,aAAa,SAAS,KAC5B,6CAAC,SAAI,WAAU,qBACb,uDAAC,SAAI,WAAU,0BACZ,iBAAO,aAAa,IAAI,CAAC,KAAK,MAC7B;AAAA,YAAC;AAAA;AAAA,cAEC,WAAU;AAAA,cACX;AAAA;AAAA,gBACG;AAAA;AAAA;AAAA,YAHG;AAAA,UAIP,CACD,GACH,GACF;AAAA,UAID,IAAI,SAAS,gBAAe,6CAAc,eAAc,IAAI,MAAM,aAAa,QAAQ,SAAS,KAC/F,6CAAC,SAAI,WAAU,uBACZ,uBAAa,QAAQ,IAAI,CAAC,WAAW;AACpC,kBAAM,gBAAgB,aAAa,OAAO,EAAE,KAAK;AACjD,mBACE;AAAA,cAAC;AAAA;AAAA,gBAEC,SAAS,MAAM,iDAAiB,OAAO,IAAI,aAAa,KAAK,aAAa;AAAA,gBAC1E,WAAU;AAAA,gBAEV;AAAA,+DAAC,iBAAc,MAAM,IAAI;AAAA,kBACxB,OAAO;AAAA;AAAA;AAAA,cALH,OAAO;AAAA,YAMd;AAAA,UAEJ,CAAC,GACH;AAAA,UAID,IAAI,SAAS,eAAe,OAAO,OAAO,SAAS,KAAK,EAAC,6CAAc,eAAc,CAAC,eAAe,IAAI,SAAOA,MAAA,SAAS,SAAS,SAAS,CAAC,MAA5B,gBAAAA,IAA+B,QAC9I,8CAAC,SAAI,WAAU,oBACb;AAAA;AAAA,cAAC;AAAA;AAAA,gBACC,SAAS,MAAM,WAAW,OAAO,QAAQ,OAAO,cAAc,IAAI,EAAE;AAAA,gBACpE,WAAU;AAAA,gBAEV;AAAA,+DAAC,8BAAM,MAAM,IAAI;AAAA,kBAAE;AAAA;AAAA;AAAA,YAErB;AAAA,YACA;AAAA,cAAC;AAAA;AAAA,gBACC,SAAS,MAAM,WAAW,IAAI,SAAS,OAAO,YAAY;AAAA,gBAC1D,WAAU;AAAA,gBACV,OAAO,EAAE,iBAAiB,cAAc,OAAO,OAAO;AAAA,gBAEtD;AAAA,+DAAC,6BAAK,MAAM,IAAI;AAAA,kBAAE;AAAA;AAAA;AAAA,YAEpB;AAAA,aACF;AAAA,WAEJ,KAvGQ,IAAI,EAwGd;AAAA,MAEJ,CAAC;AAAA,MAED,6CAAC,SAAI,KAAK,WAAW;AAAA,OACvB,GACF;AAAA,IAGA,6CAAC,SAAI,WAAU,mBACb,wDAAC,SAAI,WAAU,oBAEb;AAAA,oDAAC,SAAI,KAAK,aAAa,WAAU,wBAC/B;AAAA;AAAA,UAAC;AAAA;AAAA,YACC,SAAS;AAAA,YACT,WAAU;AAAA,YACV,OAAM;AAAA,YAEN,uDAAC,4BAAI,MAAM,IAAI;AAAA;AAAA,QACjB;AAAA,QAGC,oBACC,8CAAC,SAAI,WAAU,sBAEb;AAAA,wDAAC,SAAI,WAAU,6BAA4B,OAAO,EAAE,iBAAiB,cAAc,OAAO,OAAO,GAC/F;AAAA,yDAAC,UAAK,WAAU,4BAA2B,yBAAW;AAAA,YACtD;AAAA,cAAC;AAAA;AAAA,gBACC,SAAS,MAAM,oBAAoB,KAAK;AAAA,gBACxC,WAAU;AAAA,gBACV,OAAO,EAAE,iBAAiB,cAAc,OAAO,OAAO;AAAA,gBAEtD,uDAAC,0BAAE,MAAM,IAAI;AAAA;AAAA,YACf;AAAA,aACF;AAAA,UAGA,8CAAC,SAAI,WAAU,6BAEb;AAAA,yDAAC,SAAI,WAAU,kCACb;AAAA,cAAC,oBAAAC;AAAA,cAAA;AAAA,gBACC,SAAS;AAAA,kBACP,EAAE,OAAO,MAAM,OAAO,yBAAyB;AAAA,kBAC/C,GAAG,QACA,OAAO,CAAC,WAAW,CAAC,qBAAqB,OAAO,aAAa,iBAAiB,EAC9E,IAAI,CAAC,YAAY;AAAA,oBAChB,OAAO,OAAO;AAAA,oBACd,OAAO,OAAO;AAAA,kBAChB,EAAE;AAAA,gBACN;AAAA,gBACA,OACE,iBACI,EAAE,OAAO,gBAAgB,SAAO,aAAQ,KAAK,OAAK,EAAE,OAAO,cAAc,MAAzC,mBAA4C,SAAQ,eAAe,IACnG,EAAE,OAAO,MAAM,OAAO,yBAAyB;AAAA,gBAErD,UAAU;AAAA,gBACV,WAAW;AAAA,gBACX,YAAY;AAAA,gBACZ,aAAY;AAAA,gBACZ,iBAAgB;AAAA,gBAChB,eAAc;AAAA,gBACd,cAAa;AAAA,gBACb,0BAA0B;AAAA,gBAC1B,eAAe;AAAA,gBACf,kBAAkB,OAAO,WAAW,cAAc,SAAS,OAAO;AAAA,gBAClE,QAAQ;AAAA,kBACN,WAAW,CAAC,SAAU,iCACjB,OADiB;AAAA,oBAEpB,OAAO;AAAA,kBACT;AAAA,kBACA,SAAS,CAAC,SAAU,iCACf,OADe;AAAA,oBAElB,WAAW;AAAA,oBACX,aAAa;AAAA,oBACb,WAAW;AAAA,oBACX,OAAO;AAAA,kBACT;AAAA,kBACA,MAAM,CAAC,SAAU,iCACZ,OADY;AAAA,oBAEf,OAAO;AAAA,oBACP,QAAQ;AAAA,kBACV;AAAA,kBACA,YAAY,CAAC,SAAU,iCAClB,OADkB;AAAA,oBAErB,QAAQ;AAAA,kBACV;AAAA,kBACA,QAAQ,CAAC,MAAM,UAAW,iCACrB,OADqB;AAAA,oBAExB,iBAAiB,MAAM,aACnB,eACA,MAAM,YACN,YACA;AAAA,oBACJ,OAAO,MAAM,aAAa,UAAU;AAAA,oBACpC,QAAQ;AAAA,kBACV;AAAA,gBACF;AAAA;AAAA,YACF,GACF;AAAA,YAGC,kBACC;AAAA,cAAC;AAAA;AAAA,gBACC,SAAS;AAAA,gBACT,UAAU;AAAA,gBACV,WAAU;AAAA,gBACV,OAAM;AAAA,gBAEN;AAAA,+DAAC,mCAAW,MAAM,IAAI,WAAW,WAAW,sBAAsB,IAAI;AAAA,kBACrE,WAAW,gBAAgB;AAAA;AAAA;AAAA,YAC9B;AAAA,YAID,CAAC,kBACA;AAAA,cAAC;AAAA;AAAA,gBACC,SAAS,MAAM,UAAU,IAAI;AAAA,gBAC7B,UAAU;AAAA,gBACV,WAAU;AAAA,gBAEV;AAAA,+DAAC,mCAAW,MAAM,IAAI,WAAW,cAAc,sBAAsB,IAAI;AAAA,kBAAE;AAAA;AAAA;AAAA,YAE7E;AAAA,aAEJ;AAAA,UAGA,6CAAC,SAAI,WAAU,2BACZ,wBACC,6CAAC,SAAI,WAAU,0BAAyB,6BAExC,IACE,aAAa,WAAW,IAC1B,8CAAC,SAAI,WAAU,0BACb;AAAA,yDAAC,OAAE,4BAAc;AAAA,YAChB,kBACC,6CAAC,OAAE,WAAU,2BAA0B,kDAA8C;AAAA,aAEzF,IAEA;AAAA,YAAC;AAAA;AAAA,cACC,MAAM,aAAa,MAAM,GAAG,EAAE;AAAA,cAC9B,QAAQ,CAAC,SAAS,OAAO,KAAK,KAAK,aAAa,KAAK,MAAM,QAAQ;AAAA,cACnE,YAAY,CAAC,YAAY;AACvB,oCAAoB,KAAK;AACzB,6DAAe;AAAA,cACjB;AAAA;AAAA,UACF,GAEJ;AAAA,WACF;AAAA,SAEJ;AAAA,MAEA;AAAA,QAAC;AAAA;AAAA,UACC,KAAK;AAAA,UACL,OAAO;AAAA,UACP,UAAU,OAAK,SAAS,EAAE,OAAO,KAAK;AAAA,UACtC,WAAW,OAAK;AACd,gBAAI,EAAE,QAAQ,WAAW,CAAC,EAAE,UAAU;AACpC,gBAAE,eAAe;AACjB,yBAAW;AAAA,YACb;AAAA,UACF;AAAA,UACA,MAAM;AAAA,UACN,aAAY;AAAA,UACZ,WAAW,sBAAsB,CAAC,gBAAgB,mCAAmC,EAAE;AAAA,UACvF,OAAO,EAAE,WAAW,SAAS,WAAW,MAAM,MAAM,IAAI,EAAE,SAAS,IAAI,SAAS,SAAS;AAAA;AAAA,MAC3F;AAAA,MACA;AAAA,QAAC;AAAA;AAAA,UACC,SAAS;AAAA,UACT,WAAU;AAAA,UACV,OAAO,EAAE,iBAAiB,cAAc,OAAO,OAAO;AAAA,UAEtD,uDAAC,uCAAe,MAAM,IAAI;AAAA;AAAA,MAC5B;AAAA,OACF,GACF;AAAA,IAGA;AAAA,MAAC;AAAA;AAAA,QACC,QAAQ,UAAU;AAAA,QAClB,gBAAgB,UAAU;AAAA,QAC1B,cAAc,UAAU;AAAA,QACxB,SAAS;AAAA,QACT,aAAa;AAAA,QACb,QAAQ;AAAA;AAAA,IACV;AAAA,KACF;AAEJ;;;AMjkBA,IAAAC,uBAAyB;AAcjB,IAAAC,sBAAA;AAZO,SAAR,SAA0B;AAAA,EAC/B;AACF,GAEG;AACD,SACE,6CAAC,SAAI,WAAU,kBACb;AAAA,IAAC;AAAA;AAAA,MACC,SAAS,MAAM;AAAA,MACf,WAAU;AAAA,MACV,cAAW;AAAA,MAEX,uDAAC,iCAAS,MAAM,IAAI,WAAU,+BAA8B;AAAA;AAAA,EAC9D,GACF;AAEJ;;;ACHQ,IAAAC,sBAAA;AAZO,SAAR,UAA2B;AAAA,EAChC;AACF,GAEG;AACD,QAAM,EAAE,cAAc,SAAS,QAAQ,IAAI,SAAS;AAEpD,SACE,6CAAC,YAAO,WAAU,eAChB,wDAAC,SAAI,WAAU,qBAGb;AAAA,kDAAC,SAAI,WAAU,oBACZ;AAAA,gBACC,6CAAC,SAAI,KAAK,SAAS,KAAI,QAAO,WAAU,wBAAuB,IAE/D;AAAA,QAAC;AAAA;AAAA,UACC,WAAU;AAAA,UACV,OAAO,EAAE,iBAAiB,aAAa;AAAA,UAEtC,kBAAQ,OAAO,CAAC,EAAE,YAAY;AAAA;AAAA,MACjC;AAAA,MAEF,6CAAC,UAAK,WAAU,qBACb,kBAAQ,YAAY,GACvB;AAAA,OACF;AAAA,IAGA,6CAAC,SAAI,WAAU,qBACb,uDAAC,YAAS,mBAAsC,GAClD;AAAA,KACF,GACF;AAEJ;;;ACtCA,IAAAC,gBAA0B;AAC1B,IAAAC,uBAAkB;AA8BZ,IAAAC,sBAAA;AA5BS,SAAR,OAAwB;AAAA,EAC7B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAKG;AAED,+BAAU,MAAM;AACd,QAAI,MAAM;AACR,eAAS,KAAK,MAAM,WAAW;AAAA,IACjC,OAAO;AACL,eAAS,KAAK,MAAM,WAAW;AAAA,IACjC;AACA,WAAO,MAAM;AACX,eAAS,KAAK,MAAM,WAAW;AAAA,IACjC;AAAA,EACF,GAAG,CAAC,IAAI,CAAC;AAET,MAAI,CAAC,KAAM,QAAO;AAElB,SACE,8CAAC,SAAI,WAAU,uBAEb;AAAA,iDAAC,SAAI,WAAU,wBAAuB,SAAS,SAAS;AAAA,IAGxD,8CAAC,SAAI,WAAU,qBACb;AAAA,oDAAC,SAAI,WAAU,sBACZ;AAAA,iBAAS,6CAAC,QAAG,WAAU,qBAAqB,iBAAM;AAAA,QACnD,6CAAC,YAAO,SAAS,SAAS,WAAU,yBAClC,uDAAC,0BAAE,MAAM,IAAI,GACf;AAAA,SACF;AAAA,MAEA,6CAAC,SAAI,WAAU,oBACZ,UACH;AAAA,OACF;AAAA,KACF;AAEJ;;;ACjDA,IAAAC,gBAAoC;AACpC,6BAAkB;;;ACIX,IAAM,gBAAgB,OAAO;AAAA,EAClC;AAAA,EACA;AACF,MAGM;AACJ,QAAM,EAAE,KAAK,IAAI,MAAM,YAAI,KAAK,4BAA4B;AAAA,IAC1D;AAAA,IACA;AAAA,EACF,CAAC;AACD,SAAO;AACT;AAKO,IAAM,kBAAkB,YAAY;AACzC,QAAM,EAAE,KAAK,IAAI,MAAM,YAAI,IAAI,yBAAyB;AACxD,SAAO,KAAK;AACd;;;AC1BA,IAAAC,gBAA2C;AAuBlC,IAAAC,sBAAA;AAdT,IAAI,cAAmB;AAEvB,IAAM,eAAe,CAAC,UAAwC;AAC5D,QAAM,CAAC,SAAS,UAAU,QAAI,wBAAS,KAAK;AAE5C,+BAAU,MAAM;AACd,eAAW,IAAI;AACf,WAAO,cAAc,EAAE,KAAK,CAAC,QAAQ;AACnC,oBAAc,IAAI;AAAA,IACpB,CAAC;AAAA,EACH,GAAG,CAAC,CAAC;AAEL,MAAI,CAAC,WAAW,CAAC,YAAa,QAAO;AAErC,SAAO,6CAAC,gCAAgB,MAAO;AACjC;AAEA,IAAO,uBAAQ;;;AFgNP,IAAAC,uBAAA;AA1NR,IAAM,gBAAgB;AAAA,EACpB,EAAE,OAAO,iBAAiB,OAAO,gBAAgB;AACnD;AAEA,IAAM,eAAe;AAAA,EACnB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,EAAE,IAAI,WAAS,EAAE,OAAO,MAAM,OAAO,KAAK,EAAE;AAE5C,IAAM,mBAAmB;AAAA,EACvB,EAAE,OAAO,MAAM,OAAO,UAAU;AAAA,EAChC,EAAE,OAAO,MAAM,OAAO,QAAQ;AAChC;AAEe,SAAR,kBAAmC;AApD1C;AAqDE,QAAM,EAAE,aAAa,SAAS,oBAAoB,kBAAkB,IAAI,eAAe;AACvF,QAAM,iBAAe,gDAAa,YAAb,mBAAsB,iBAAgB;AAE3D,QAAM,CAAC,SAAS,UAAU,QAAI,wBAAS,EAAE;AACzC,QAAM,CAAC,MAAM,OAAO,QAAI,wBAAsB,IAAI;AAClD,QAAM,CAAC,SAAS,UAAU,QAAI,wBAAwB,IAAI;AAC1D,QAAM,CAAC,OAAO,QAAQ,QAAI,wBAAkD,IAAI;AAChF,QAAM,CAAC,QAAQ,SAAS,QAAI,wBAA6C,CAAC,CAAC;AAC3E,QAAM,CAAC,UAAU,WAAW,QAAI,wBAAkD,IAAI;AAEtF,QAAM,CAAC,QAAQ,SAAS,QAAI,wBAAS,KAAK;AAC1C,QAAM,CAAC,SAAS,UAAU,QAAI,wBAAS,KAAK;AAG5C,QAAM,CAAC,UAAU,WAAW,QAAI,wBAAS,KAAK;AAC9C,QAAM,CAAC,cAAc,eAAe,QAAI,wBAA8B,IAAI;AAC1E,QAAM,CAAC,eAAe,gBAAgB,QAAI,wBAAS,IAAI;AAGvD,QAAM,CAAC,gBAAgB,iBAAiB,QAAI,wBAKzC;AAAA,IACD,SAAS;AAAA,IACT,OAAO;AAAA,IACP,QAAQ,CAAC;AAAA,IACT,UAAU;AAAA,EACZ,CAAC;AAGD,+BAAU,MAAM;AACd,UAAM,oBAAoB,YAAY;AACpC,UAAI;AACF,cAAM,OAAO,MAAM,gBAAgB;AACnC,wBAAgB,IAAI;AAAA,MACtB,SAAS,OAAO;AACd,gBAAQ,IAAI,kCAAkC,KAAK;AAAA,MACrD,UAAE;AACA,yBAAiB,KAAK;AAAA,MACxB;AAAA,IACF;AACA,sBAAkB;AAAA,EACpB,GAAG,CAAC,CAAC;AAEL,QAAM,eAAe,YAAY;AAnGnC,QAAAC,KAAAC;AAoGI,gBAAY,IAAI;AAChB,QAAI;AACF,YAAM,cAAc;AAAA,QAClB,QAAOD,MAAA,2CAAa,iBAAb,gBAAAA,IAA2B;AAAA,QAClC,SAAQC,MAAA,2CAAa,iBAAb,gBAAAA,IAA2B;AAAA,MACrC,CAAC;AACD,6BAAAC,QAAM,QAAQ,qCAAqC;AACnD,iBAAW,YAAY;AACrB,YAAI;AACF,gBAAM,OAAO,MAAM,gBAAgB;AACnC,0BAAgB,IAAI;AAAA,QACtB,SAAS,GAAG;AACV,kBAAQ,IAAI,oCAAoC,CAAC;AAAA,QACnD;AAAA,MACF,GAAG,GAAI;AAAA,IACT,SAAS,OAAO;AACd,cAAQ,MAAM,KAAK;AACnB,6BAAAA,QAAM,MAAM,iCAAiC;AAAA,IAC/C,UAAE;AACA,kBAAY,KAAK;AAAA,IACnB;AAAA,EACF;AAEA,+BAAU,MAAM;AA3HlB,QAAAF,KAAAC,KAAAE,KAAA;AA4HI,QAAI,aAAa;AAEf,YAAM,SAAOH,MAAA,YAAY,YAAZ,gBAAAA,IAAqB,SAAQ;AAC1C,YAAM,UAASC,MAAA,YAAY,iBAAZ,gBAAAA,IAA0B;AACzC,YAAM,YAAUE,MAAA,YAAY,iBAAZ,gBAAAA,IAA0B,WAAU,CAAC;AACrD,YAAM,aAAY,iBAAY,iBAAZ,mBAA0B;AAE5C,iBAAW,IAAI;AACf,WAAI,iBAAY,YAAZ,mBAAqB,QAAS,YAAW,YAAY,QAAQ,OAAO;AAGxE,UAAI,QAAQ;AACV,iBAAS,EAAE,OAAO,QAAQ,OAAO,OAAO,CAAC;AAAA,MAC3C;AACA,UAAI,MAAM,QAAQ,OAAO,GAAG;AAC1B,kBAAU,QAAQ,IAAI,CAAC,UAAkB,EAAE,OAAO,MAAM,OAAO,KAAK,EAAE,CAAC;AAAA,MACzE;AACA,UAAI,WAAW;AACb,cAAM,aAAa,iBAAiB,KAAK,SAAO,IAAI,UAAU,SAAS;AACvE,oBAAY,cAAc,IAAI;AAAA,MAChC;AAGA,wBAAkB;AAAA,QAChB,SAAS;AAAA,QACT,OAAO;AAAA,QACP,QAAQ;AAAA,QACR,UAAU;AAAA,MACZ,CAAC;AAAA,IACH;AAAA,EACF,GAAG,CAAC,WAAW,CAAC;AAEhB,QAAM,aAAa,YAAY;AAC7B,QAAI,CAAC,SAAS;AACZ,6BAAAD,QAAM,MAAM,0BAA0B;AACtC;AAAA,IACF;AAEA,cAAU,IAAI;AACd,eAAW,KAAK;AAEhB,QAAI;AAEF,YAAM,UAMF,CAAC;AAGL,UAAI,YAAY,eAAe,SAAS;AACtC,gBAAQ,UAAU;AAAA,MACpB;AAEA,UAAI,MAAM;AACR,gBAAQ,OAAO;AAAA,MACjB;AAEA,YAAM,eAAe,+BAAO;AAC5B,UAAI,iBAAiB,eAAe,OAAO;AACzC,gBAAQ,QAAQ;AAAA,MAClB;AAEA,YAAM,gBAAgB,OAAO,IAAI,OAAK,EAAE,KAAK;AAC7C,YAAM,gBACJ,cAAc,WAAW,eAAe,OAAO,UAC/C,cAAc,KAAK,CAAC,MAAM,UAAU,SAAS,eAAe,OAAO,KAAK,CAAC;AAC3E,UAAI,eAAe;AACjB,gBAAQ,SAAS;AAAA,MACnB;AAEA,YAAM,kBAAkB,qCAAU;AAClC,UAAI,oBAAoB,eAAe,UAAU;AAC/C,gBAAQ,WAAW;AAAA,MACrB;AAGA,UAAI,OAAO,KAAK,OAAO,EAAE,WAAW,GAAG;AACrC,+BAAAA,QAAM,MAAM,oBAAoB;AAChC,kBAAU,KAAK;AACf;AAAA,MACF;AAGA,YAAM,qBAAqB,MAAM,mBAAmB,OAAc;AAGlE,UAAI,oBAAoB;AACtB,0BAAkB,kBAAkB;AAAA,MACtC,OAAO;AAEL,cAAM,mBAAmB;AAAA,MAC3B;AAEA,iBAAW,IAAI;AACf,cAAQ,IAAI;AACZ,6BAAAA,QAAM,QAAQ,iCAAiC;AAAA,IACjD,SAAS,OAAO;AACd,cAAQ,MAAM,KAAK;AACnB,6BAAAA,QAAM,MAAM,4BAA4B;AAAA,IAC1C,UAAE;AACA,gBAAU,KAAK;AAAA,IACjB;AAAA,EACF;AAEA,MAAI,SAAS;AACX,WACE,8CAAC,SAAI,WAAU,kBACb,wDAAC,OAAE,WAAU,2BAA0B,iCAAmB,GAC5D;AAAA,EAEJ;AAEA,SACE,+CAAC,SAAI,WAAU,kBAEb;AAAA,mDAAC,SAAI,WAAU,kBACb;AAAA,oDAAC,QAAG,WAAU,wBAAuB,8BAAgB;AAAA,MAGrD,+CAAC,SAAI,WAAU,mBACb;AAAA,sDAAC,WAAM,WAAU,mBAAkB,0BAAY;AAAA,QAC/C;AAAA,UAAC;AAAA;AAAA,YACC,OAAO;AAAA,YACP,UAAU,CAAC,MAAM,WAAW,EAAE,OAAO,KAAK;AAAA,YAC1C,WAAU;AAAA,YACV,aAAY;AAAA;AAAA,QACd;AAAA,SACF;AAAA,MAGA,+CAAC,SAAI,WAAU,mBACb;AAAA,sDAAC,WAAM,WAAU,mBAAkB,0BAAY;AAAA,QAC/C,+CAAC,SAAI,WAAU,oBACb;AAAA,wDAAC,SAAI,WAAU,qBACZ,iBACC;AAAA,YAAC;AAAA;AAAA,cACC,KAAK,IAAI,gBAAgB,IAAI;AAAA,cAC7B,KAAI;AAAA,cACJ,WAAU;AAAA;AAAA,UACZ,IACE,UACF;AAAA,YAAC;AAAA;AAAA,cACC,KAAK;AAAA,cACL,KAAI;AAAA,cACJ,WAAU;AAAA;AAAA,UACZ,IAEA,8CAAC,UAAK,WAAU,yBAAwB,qBAAO,GAEnD;AAAA,UAEA;AAAA,YAAC;AAAA;AAAA,cACC,MAAK;AAAA,cACL,QAAO;AAAA,cACP,UAAU,CAAC,MAAG;AAzR5B,oBAAAF;AAyR+B,iCAAQA,MAAA,EAAE,OAAO,UAAT,gBAAAA,IAAiB,OAAM,IAAI;AAAA;AAAA,cACpD,WAAU;AAAA;AAAA,UACZ;AAAA,WACF;AAAA,SACF;AAAA,OAEF;AAAA,IAIA,+CAAC,SAAI,WAAU,kBACb;AAAA,qDAAC,SAAI,WAAU,yBACb;AAAA,sDAAC,QAAG,WAAU,+BAA8B,2BAAa;AAAA,QACzD,8CAAC,OAAE,WAAU,uBAAsB,+DAEnC;AAAA,SACF;AAAA,MAEC,CAAC,iBAAiB,gBACjB,+CAAC,SAAI,WAAU,qCACb;AAAA,uDAAC,SACC;AAAA,wDAAC,UAAK,WAAU,yBAAwB,qBAAO;AAAA,UAC/C,8CAAC,OAAE,WAAU,wBACV,uBAAa,YACZ,8CAAC,UAAK,WAAU,2CAA0C,qBAAO,IAEjE,8CAAC,UAAK,WAAU,0CAAyC,kBAAI,GAEjE;AAAA,WACF;AAAA,QAEC,aAAa,WACZ,+CAAC,SACC;AAAA,wDAAC,UAAK,WAAU,yBAAwB,uBAAS;AAAA,UACjD,8CAAC,OAAE,WAAU,wBACV,cAAI,KAAK,aAAa,OAAO,EAAE,eAAe,GACjD;AAAA,WACF;AAAA,QAGD,aAAa,iBAAiB,UAC7B,+CAAC,SACC;AAAA,wDAAC,UAAK,WAAU,yBAAwB,4BAAc;AAAA,UACtD,+CAAC,OAAE,WAAU,wBACV;AAAA,yBAAa,aAAa,eAAe;AAAA,YAAE;AAAA,aAC9C;AAAA,WACF;AAAA,SAEJ;AAAA,MAGF,+CAAC,SACC;AAAA,uDAAC,OAAE,WAAU,uBAAsB;AAAA;AAAA,UACV,8CAAC,YAAQ,2DAAa,iBAAb,mBAA2B,OAAM;AAAA,YAChE,gDAAa,iBAAb,mBAA2B,WAAU,YAAY,aAAa,OAAO,SAAS,KAC7E,gFAAE;AAAA;AAAA,YAAI,YAAY,aAAa,OAAO,KAAK,IAAI;AAAA,aAAE;AAAA,WAErD;AAAA,QACA;AAAA,UAAC;AAAA;AAAA,YACC,SAAS;AAAA,YACT,UAAU,aAAY,6CAAc;AAAA,YACpC,WAAU;AAAA,YACV,OAAO,EAAE,iBAAiB,UAAU,cAAc,GAAG,EAAE;AAAA,YAEtD,qBAAW,wBAAuB,6CAAc,aAAY,4BAA4B;AAAA;AAAA,QAC3F;AAAA,SACF;AAAA,OACF;AAAA,IAGA,+CAAC,SAAI,WAAU,kBACb;AAAA,oDAAC,QAAG,WAAU,wBAAuB,mCAAqB;AAAA,MAG1D,+CAAC,SAAI,WAAU,mBACb;AAAA,sDAAC,WAAM,WAAU,mBAAkB,mBAAK;AAAA,QACxC;AAAA,UAAC;AAAA;AAAA,YACC,SAAS;AAAA,YACT,OAAO;AAAA,YAEP,UAAU,CAAC,WAAe,SAAS,MAAM;AAAA,YACzC,aAAY;AAAA;AAAA,QACd;AAAA,SACF;AAAA,MAGA,+CAAC,SAAI,WAAU,mBACb;AAAA,sDAAC,WAAM,WAAU,mBAAkB,oBAAM;AAAA,QACzC;AAAA,UAAC;AAAA;AAAA,YACC,SAAS;AAAA,YACT,SAAS;AAAA,YACT,OAAO;AAAA,YAEP,UAAU,CAAC,YAAY,UAAU,OAAc;AAAA,YAC/C,aAAY;AAAA,YACZ,YAAY,CAAC;AAAA;AAAA,QACf;AAAA,SACF;AAAA,MAGA,+CAAC,SAAI,WAAU,mBACb;AAAA,sDAAC,WAAM,WAAU,mBAAkB,sBAAQ;AAAA,QAC3C;AAAA,UAAC;AAAA;AAAA,YACC,SAAS;AAAA,YACT,OAAO;AAAA,YAEP,UAAU,CAAC,WAAe,YAAY,MAAM;AAAA,YAC5C,aAAY;AAAA;AAAA,QACd;AAAA,SACF;AAAA,OACF;AAAA,IAKA,8CAAC,SAAI,WAAU,qBACb;AAAA,MAAC;AAAA;AAAA,QACC,SAAS;AAAA,QACT,UAAU;AAAA,QACV,WAAU;AAAA,QACV,OAAO,EAAE,iBAAiB,aAAa;AAAA,QAEtC,mBAAS,cAAc;AAAA;AAAA,IAC1B,GACF;AAAA,KACF;AAEJ;;;AG7WO,IAAM,kBAAkB,OAAO,UAAiD;AACrF,QAAM,EAAE,KAAK,IAAI,MAAM,YAAI,KAAK,uBAAuB,EAAE,MAAM,CAAC;AAChE,SAAO,KAAK;AACd;AAKO,IAAM,mBAAmB,OAAO,YAAkC;AACvE,QAAM,EAAE,KAAK,IAAI,MAAM,YAAI,KAAK,wBAAwB,OAAO;AAC/D,SAAO,KAAK;AACd;AAKO,IAAM,yBAAyB,OAAO;AAAA,EAC3C;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,MAIM;AAvEN;AAwEE,QAAM,eAAe,cAAc;AACnC,QAAM,SAAS,UAAU;AAEzB,QAAM,UAAkC;AAAA,IACtC,gBAAgB;AAAA,EAClB;AACA,MAAI,QAAQ;AACV,YAAQ,WAAW,IAAI;AAAA,EACzB;AAEA,QAAM,WAAW,MAAM,MAAM,GAAG,YAAY,+BAA+B;AAAA,IACzE,QAAQ;AAAA,IACR;AAAA,IACA,aAAa;AAAA,IACb,MAAM,KAAK,UAAU,EAAE,KAAK,SAAS,UAAU,SAAS,CAAC;AAAA,EAC3D,CAAC;AAED,MAAI,CAAC,SAAS,IAAI;AAChB,UAAM,YAAY,MAAM,SAAS,KAAK;AACtC,UAAM,IAAI,MAAM,uBAAuB,SAAS,MAAM,MAAM,SAAS,EAAE;AAAA,EACzE;AAEA,QAAM,UAAS,cAAS,SAAT,mBAAe;AAC9B,QAAM,UAAU,IAAI,YAAY;AAEhC,MAAI,CAAC,QAAQ;AACX,UAAM,IAAI,MAAM,qBAAqB;AAAA,EACvC;AAEA,MAAI,SAAS;AACb,MAAI,kBAAkB;AAEtB,SAAO,MAAM;AACX,UAAM,EAAE,MAAM,MAAM,IAAI,MAAM,OAAO,KAAK;AAE1C,QAAI,MAAM;AACR,UAAI,gBAAiB;AACrB;AAAA,IACF;AAEA,UAAM,QAAQ,QAAQ,OAAO,OAAO,EAAE,QAAQ,KAAK,CAAC;AACpD,cAAU;AAEV,UAAM,QAAQ,OAAO,MAAM,IAAI;AAC/B,aAAS,MAAM,IAAI,KAAK;AAExB,eAAW,QAAQ,OAAO;AACxB,YAAM,cAAc,KAAK,KAAK;AAC9B,UAAI,gBAAgB,GAAI;AAExB,wBAAkB;AAElB,UAAI,YAAY,WAAW,QAAQ,GAAG;AACpC,cAAM,OAAO,YAAY,MAAM,CAAC,EAAE,KAAK;AAEvC,YAAI,SAAS,UAAU;AACrB;AACA;AAAA,QACF;AAEA,YAAI;AACF,gBAAM,SAAS,KAAK,MAAM,IAAI;AAC9B,cAAI,OAAO,QAAS,SAAQ,OAAO,OAAO;AAAA,mBACjC,OAAO,MAAO,SAAQ,OAAO,KAAK;AAAA,mBAClC,OAAO,KAAM,SAAQ,OAAO,IAAI;AAAA,mBAChC,OAAO,MAAO,SAAQ,OAAO,KAAK;AAAA,mBAClC,OAAO,WAAW,SAAU,SAAQ,MAAM;AAAA,QACrD,SAAQ;AACN,cAAI,KAAM,SAAQ,IAAI;AAAA,QACxB;AAAA,MACF,WAAW,aAAa;AACtB,gBAAQ,cAAc,IAAI;AAAA,MAC5B;AAAA,IACF;AAAA,EACF;AAEA,MAAI,CAAC,iBAAiB;AACpB,UAAM,IAAI,MAAM,8BAA8B;AAAA,EAChD;AACF;AAcO,IAAM,uBAAuB,OAAO;AAAA,EACzC;AAAA,EACA,WAAW;AAAA,EACX;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,MAaM;AA/LN;AAgME,QAAM,UAA+B;AAAA,IACnC;AAAA,IACA;AAAA,EACF;AAGA,MAAI,WAAW;AACb,YAAQ,YAAY;AAAA,EACtB;AAGA,MAAI,KAAM,SAAQ,OAAO;AACzB,MAAI,MAAO,SAAQ,QAAQ;AAC3B,MAAI,UAAW,SAAQ,YAAY;AACnC,MAAI,kBAAkB,OAAW,SAAQ,gBAAgB;AACzD,MAAI,eAAe,OAAW,SAAQ,aAAa;AACnD,MAAI,eAAgB,SAAQ,iBAAiB;AAE7C,MAAI;AAEF,UAAM,eAAe,cAAc;AACnC,UAAM,SAAS,UAAU;AACzB,UAAM,UAAkC;AAAA,MACtC,gBAAgB;AAAA,IAClB;AAGA,QAAI,QAAQ;AACV,cAAQ,WAAW,IAAI;AAAA,IACzB;AAEA,UAAM,WAAW,MAAM,MAAM,GAAG,YAAY,4BAA4B;AAAA,MACtE,QAAQ;AAAA,MACR;AAAA,MACA,aAAa;AAAA,MACb,MAAM,KAAK,UAAU,OAAO;AAAA,IAC9B,CAAC;AAED,YAAQ,IAAI,8BAAuB,SAAS,MAAM;AAClD,YAAQ,IAAI,+BAAwB,OAAO,YAAY,SAAS,QAAQ,QAAQ,CAAC,CAAC;AAElF,QAAI,CAAC,SAAS,IAAI;AAChB,YAAM,YAAY,MAAM,SAAS,KAAK;AACtC,cAAQ,MAAM,qBAAgB,SAAS,QAAQ,SAAS;AACxD,YAAM,IAAI,MAAM,uBAAuB,SAAS,MAAM,MAAM,SAAS,EAAE;AAAA,IACzE;AAEA,UAAM,UAAS,cAAS,SAAT,mBAAe;AAC9B,UAAM,UAAU,IAAI,YAAY;AAEhC,QAAI,CAAC,QAAQ;AACX,YAAM,IAAI,MAAM,qBAAqB;AAAA,IACvC;AAEA,QAAI,SAAS;AACb,QAAI,kBAAkB;AAEtB,WAAO,MAAM;AACX,YAAM,EAAE,MAAM,MAAM,IAAI,MAAM,OAAO,KAAK;AAE1C,UAAI,MAAM;AACR,YAAI,iBAAiB;AACnB;AAAA,QACF;AACA;AAAA,MACF;AAGA,YAAM,QAAQ,QAAQ,OAAO,OAAO,EAAE,QAAQ,KAAK,CAAC;AACpD,gBAAU;AAGV,YAAM,QAAQ,OAAO,MAAM,IAAI;AAC/B,eAAS,MAAM,IAAI,KAAK;AAExB,iBAAW,QAAQ,OAAO;AACxB,cAAM,cAAc,KAAK,KAAK;AAC9B,YAAI,gBAAgB,GAAI;AAExB,0BAAkB;AAClB,gBAAQ,IAAI,4BAAqB,YAAY,UAAU,GAAG,GAAG,KAAK,YAAY,SAAS,MAAM,QAAQ,GAAG;AAGxG,YAAI,YAAY,WAAW,QAAQ,GAAG;AACpC,gBAAM,OAAO,YAAY,MAAM,CAAC,EAAE,KAAK;AAEvC,cAAI,SAAS,UAAU;AACrB,oBAAQ,IAAI,4CAAuC;AACnD;AACA;AAAA,UACF;AAEA,cAAI;AACF,kBAAM,SAAS,KAAK,MAAM,IAAI;AAC9B,oBAAQ,IAAI,0BAAmB,MAAM;AAErC,gBAAI,OAAO,SAAS;AAClB,sBAAQ,OAAO,OAAO;AAAA,YACxB,WAAW,OAAO,OAAO;AACvB,sBAAQ,OAAO,KAAK;AAAA,YACtB,WAAW,OAAO,MAAM;AACtB,sBAAQ,OAAO,IAAI;AAAA,YACrB,WAAW,OAAO,OAAO;AACvB,sBAAQ,OAAO,KAAK;AAAA,YACtB,WAAW,OAAO,WAAW,UAAU;AACrC,sBAAQ,MAAM;AAAA,YAChB,OAAO;AACL,sBAAQ,KAAK,qCAA2B,MAAM;AAAA,YAChD;AAAA,UACF,SAAS,GAAG;AAEV,oBAAQ,IAAI,iDAA0C;AACtD,gBAAI,MAAM;AACR,sBAAQ,IAAI;AAAA,YACd;AAAA,UACF;AAAA,QACF,OAAO;AAEL,kBAAQ,IAAI,4BAAqB;AACjC,cAAI,aAAa;AACf,oBAAQ,cAAc,IAAI;AAAA,UAC5B;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAEA,QAAI,CAAC,iBAAiB;AACpB,cAAQ,MAAM,qCAAgC;AAC9C,YAAM,IAAI,MAAM,8BAA8B;AAAA,IAChD;AAEA,YAAQ,IAAI,sCAAiC;AAAA,EAC/C,SAAS,OAAY;AACnB,YAAQ,MAAM,2BAAsB,KAAK;AACzC,YAAQ,MAAM,kBAAkB;AAAA,MAC9B,SAAS,MAAM;AAAA,MACf,MAAM,MAAM;AAAA,MACZ,OAAO,MAAM;AAAA,IACf,CAAC;AACD,uCAAU;AACV,UAAM;AAAA,EACR;AACF;AAKO,IAAM,iBAAiB,OAAO;AAAA,EACnC;AAAA,EACA,WAAW;AAAA,EACX;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,MAUM;AACJ,QAAM,UAA+B;AAAA,IACnC;AAAA,IACA;AAAA,EACF;AAGA,MAAI,WAAW;AACb,YAAQ,YAAY;AAAA,EACtB;AAGA,MAAI,KAAM,SAAQ,OAAO;AACzB,MAAI,MAAO,SAAQ,QAAQ;AAC3B,MAAI,UAAW,SAAQ,YAAY;AACnC,MAAI,kBAAkB,OAAW,SAAQ,gBAAgB;AACzD,MAAI,eAAe,OAAW,SAAQ,aAAa;AACnD,MAAI,eAAgB,SAAQ,iBAAiB;AAE7C,QAAM,EAAE,KAAK,IAAI,MAAM,YAAI,KAAK,iBAAiB,OAAO;AAExD,SAAO,KAAK;AACd;;;Ad5WA,IAAAI,0BAAkB;AAClB,IAAAC,uBAAwB;AAkWhB,IAAAC,uBAAA;AA1VO,SAAR,QAAyB,EAAE,OAAO,GAA+D;AACtG,QAAM,EAAE,QAAQ,IAAI,SAAS;AAC7B,QAAM,EAAE,YAAY,IAAI,eAAe;AACvC,QAAM,CAAC,iBAAiB,kBAAkB,QAAI,yBAAS,KAAK;AAC5D,QAAM,CAAC,UAAU,WAAW,QAAI,yBAAwB,CAAC,CAAC;AAC1D,QAAM,CAAC,aAAa,cAAc,QAAI,yBAAS,KAAK;AACpD,QAAM,CAAC,cAAc,eAAe,QAAI,yBAK9B,IAAI;AAGhB,QAAM,iBAAiB,OAAO,EAAE,OAAO,SAAS,GAAG,MAAwD;AAxC3G;AAyCE,UAAM,cAAc,OAAO,WAAW;AAGtC,gBAAY,UAAQ;AAAA,MAClB,GAAG;AAAA,MACH;AAAA,QACE,IAAI,OAAO,WAAW;AAAA,QACtB,MAAM;AAAA,QACN,SAAS;AAAA,EAAwB,KAAK;AAAA,MACxC;AAAA,MACA;AAAA,QACE,IAAI;AAAA,QACJ,MAAM;AAAA,QACN,SAAS;AAAA,MACX;AAAA,IACF,CAAC;AAED,QAAI;AACF,UAAI,qBAAqB;AACzB,UAAI,sBAAsB;AAG1B,YAAM,eAAe,2CAAa;AAClC,YAAM,SAAO,gDAAa,iBAAb,mBAA2B,cAAa,OAAO,UAAU;AAGtE,UAAI;AACF,cAAM,qBAAqB;AAAA,UACzB,SAAS,WAAW;AAAA,UACpB,UAAU;AAAA,UACV,WAAW;AAAA,UACX,MAAM,6CAAc;AAAA,UACpB,OAAO,6CAAc;AAAA,UACrB,WAAW,6CAAc;AAAA,UACzB,eAAe,6CAAc;AAAA,UAC7B,YAAY,6CAAc;AAAA,UAC1B,gBAAgB,6CAAc;AAAA,UAC9B,SAAS,CAAC,UAAkB;AAC1B,kCAAsB;AAEtB,kCAAsB;AAGtB;AAAA,cAAY,UACV,KAAK;AAAA,gBAAI,OACP,EAAE,OAAO,cACL,iCAAK,IAAL,EAAQ,SAAS,mBAAmB,KACpC;AAAA,cACN;AAAA,YACF;AAAA,UACF;AAAA,UACA,YAAY,MAAM;AAChB,oBAAQ,IAAI,kCAAkC;AAC9C,oCAAAC,QAAM,QAAQ,+BAA+B;AAAA,UAC/C;AAAA,UACA,SAAS,OAAO,UAAU;AACxB,oBAAQ,MAAM,oBAAoB,KAAK;AAGvC,gBAAI,CAAC,qBAAqB;AACxB,sBAAQ,IAAI,gCAAgC;AAC5C,oBAAM;AAAA,YACR,OAAO;AACL,sCAAAA,QAAM,MAAM,uCAAuC;AACnD;AAAA,gBAAY,UACV,KAAK;AAAA,kBAAI,OACP,EAAE,OAAO,cACL,iCAAK,IAAL,EAAQ,SAAS,sBAAsB,qDAAgD,KACvF;AAAA,gBACN;AAAA,cACF;AAAA,YACF;AAAA,UACF;AAAA,QACF,CAAC;AAAA,MACH,SAAS,aAAa;AAEpB,gBAAQ,IAAI,0CAA0C,WAAW;AAEjE;AAAA,UAAY,UACV,KAAK;AAAA,YAAI,OACP,EAAE,OAAO,cACL,iCAAK,IAAL,EAAQ,SAAS,wCAAmC,KACpD;AAAA,UACN;AAAA,QACF;AAEA,cAAM,SAAS,MAAM,eAAe;AAAA,UAClC,SAAS,WAAW;AAAA,UACpB,UAAU;AAAA,UACV,WAAW;AAAA,UACX,MAAM,6CAAc;AAAA,UACpB,OAAO,6CAAc;AAAA,UACrB,WAAW,6CAAc;AAAA,UACzB,eAAe,6CAAc;AAAA,UAC7B,YAAY,6CAAc;AAAA,UAC1B,gBAAgB,6CAAc;AAAA,QAChC,CAAC;AAED;AAAA,UAAY,UACV,KAAK;AAAA,YAAI,OACP,EAAE,OAAO,cACL,iCAAK,IAAL,EAAQ,SAAS,OAAO,WAAW,OAAO,KAC1C;AAAA,UACN;AAAA,QACF;AAEA,gCAAAA,QAAM,QAAQ,+BAA+B;AAAA,MAC/C;AAAA,IACF,SAAS,KAAK;AACZ,cAAQ,MAAM,mBAAmB,GAAG;AACpC,8BAAAA,QAAM,OAAO,2BAAe,YAAW,8CAA8C;AACrF;AAAA,QAAY,UACV,KAAK;AAAA,UAAI,OACP,EAAE,OAAO,cACL,iCAAK,IAAL,EAAQ,SAAS,qDAAgD,KACjE;AAAA,QACN;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAIE,QAAM,oBAAoB,OAAO,SAAiB;AApKpD;AAqKI,UAAM,YAAY,OAAO,WAAW;AACpC,UAAM,cAAc,OAAO,WAAW;AAGtC,gBAAY,UAAQ;AAAA,MAClB,GAAG;AAAA,MACH,EAAE,IAAI,WAAW,MAAM,QAAQ,SAAS,KAAK;AAAA,IAC/C,CAAC;AAGD,UAAM,WAAW;AACjB,UAAM,SAAS,SAAS,KAAK,IAAI;AAEjC,QAAI,QAAQ;AAEV,kBAAY,UAAQ;AAAA,QAClB,GAAG;AAAA,QACH,EAAE,IAAI,aAAa,MAAM,aAAa,SAAS,mCAA4B;AAAA,MAC7E,CAAC;AAED,UAAI;AACF,cAAM,SAAS,MAAM,gBAAgB,IAAI;AAEzC,YAAI,OAAO,YAAU,YAAO,YAAP,mBAAgB,UAAS,GAAG;AAE/C,0BAAgB;AAAA,YACd,KAAK,OAAO,OAAO;AAAA,YACnB,SAAS,OAAO,WAAW;AAAA,YAC3B,SAAS,OAAO;AAAA,YAChB,WAAW;AAAA,UACb,CAAC;AAGD,gBAAM,cAAc,OAAO,QACxB,IAAI,CAAC,QAAQ,YAAO,IAAI,IAAI,KAAK,IAAI,cAAc,WAAM,IAAI,WAAW,KAAK,EAAE,EAAE,EACjF,KAAK,IAAI;AAEZ;AAAA,YAAY,UACV,KAAK;AAAA,cAAI,OACP,EAAE,OAAO,cACL,iCACK,IADL;AAAA,gBAEE,SAAS,uBAAuB,OAAO,aAAa,CAAC;AAAA;AAAA,EAA0C,WAAW;AAAA,cAC5G,KACA;AAAA,YACN;AAAA,UACF;AAAA,QACF,OAAO;AACL;AAAA,YAAY,UACV,KAAK;AAAA,cAAI,OACP,EAAE,OAAO,cACL,iCAAK,IAAL,EAAQ,SAAS,wEAAwE,KACzF;AAAA,YACN;AAAA,UACF;AAAA,QACF;AAAA,MACF,SAAS,KAAK;AACZ,gBAAQ,MAAM,wBAAwB,GAAG;AACzC,gCAAAA,QAAM,MAAM,4BAA4B;AACxC;AAAA,UAAY,UACV,KAAK;AAAA,YAAI,OACP,EAAE,OAAO,cACL,iCAAK,IAAL,EAAQ,SAAS,uDAAkD,KACnE;AAAA,UACN;AAAA,QACF;AAAA,MACF;AAAA,IACF,OAAO;AAEL,kBAAY,UAAQ;AAAA,QAClB,GAAG;AAAA,QACH,EAAE,IAAI,aAAa,MAAM,aAAa,SAAS,+BAA0B;AAAA,MAC3E,CAAC;AACD,qBAAe,IAAI;AAEnB,UAAI;AACF,cAAM,eAAe,2CAAa;AAClC,cAAM,SAAO,gDAAa,iBAAb,mBAA2B,cAAa,OAAO,UAAU;AACtE,YAAI,qBAAqB;AAEzB,cAAM,qBAAqB;AAAA,UACzB,SAAS;AAAA,UACT,UAAU;AAAA,UACV,MAAM,6CAAc;AAAA,UACpB,OAAO,6CAAc;AAAA,UACrB,WAAW,6CAAc;AAAA,UACzB,eAAe,6CAAc;AAAA,UAC7B,YAAY,6CAAc;AAAA,UAC1B,gBAAgB,6CAAc;AAAA,UAC9B,SAAS,CAAC,UAAkB;AAC1B,kCAAsB;AACtB;AAAA,cAAY,UACV,KAAK;AAAA,gBAAI,OACP,EAAE,OAAO,cAAc,iCAAK,IAAL,EAAQ,SAAS,mBAAmB,KAAI;AAAA,cACjE;AAAA,YACF;AAAA,UACF;AAAA,UACA,YAAY,MAAM;AAChB,2BAAe,KAAK;AACpB,oCAAAA,QAAM,QAAQ,oBAAoB;AAAA,UACpC;AAAA,UACA,SAAS,CAAC,UAAU;AAClB,oBAAQ,MAAM,iBAAiB,KAAK;AACpC,2BAAe,KAAK;AACpB,oCAAAA,QAAM,MAAM,4BAA4B;AAAA,UAC1C;AAAA,QACF,CAAC;AAAA,MACH,SAAS,KAAK;AACZ,gBAAQ,MAAM,uBAAuB,GAAG;AACxC,uBAAe,KAAK;AACpB;AAAA,UAAY,UACV,KAAK;AAAA,YAAI,OACP,EAAE,OAAO,cACL,iCAAK,IAAL,EAAQ,SAAS,uDAAkD,KACnE;AAAA,UACN;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAKA,QAAM,qBAAqB,OAAO,UAAkB,KAAa,YAAoB;AAjSvF;AAkSI,UAAM,cAAc,OAAO,WAAW;AAGtC,oBAAgB,IAAI;AAEpB,UAAM,eAAa,kDAAc,QAAQ,KAAK,OAAK,EAAE,OAAO,cAAzC,mBAAoD,SAAQ;AAE/E,gBAAY,UAAQ;AAAA,MAClB,GAAG;AAAA,MACH,EAAE,IAAI,OAAO,WAAW,GAAG,MAAM,QAAQ,SAAS,WAAW,UAAU,GAAG;AAAA,MAC1E,EAAE,IAAI,aAAa,MAAM,aAAa,SAAS,6BAAwB;AAAA,IACzE,CAAC;AACD,mBAAe,IAAI;AAEnB,QAAI;AACF,YAAM,eAAe,2CAAa;AAClC,UAAI,qBAAqB;AAEzB,UAAI;AAEF,cAAM,uBAAuB;AAAA,UAC3B;AAAA,UACA;AAAA,UACA;AAAA,UACA,UAAU;AAAA,YACR,MAAM,6CAAc;AAAA,YACpB,OAAO,6CAAc;AAAA,YACrB,WAAW,6CAAc;AAAA,UAC3B;AAAA,UACA,SAAS,CAAC,UAAkB;AAC1B,kCAAsB;AACtB;AAAA,cAAY,UACV,KAAK;AAAA,gBAAI,OACP,EAAE,OAAO,cAAc,iCAAK,IAAL,EAAQ,SAAS,mBAAmB,KAAI;AAAA,cACjE;AAAA,YACF;AAAA,UACF;AAAA,UACA,YAAY,MAAM;AAChB,2BAAe,KAAK;AACpB,oCAAAA,QAAM,QAAQ,kBAAkB;AAAA,UAClC;AAAA,UACA,SAAS,CAAC,UAAU;AAClB,oBAAQ,MAAM,iBAAiB,KAAK;AACpC,2BAAe,KAAK;AACpB,oCAAAA,QAAM,MAAM,0BAA0B;AAAA,UACxC;AAAA,QACF,CAAC;AAAA,MACH,SAAQ;AAEN,cAAM,SAAS,MAAM,iBAAiB,EAAE,KAAK,SAAS,UAAU,UAAU;AAAA,UACxE,MAAM,6CAAc;AAAA,UACpB,OAAO,6CAAc;AAAA,UACrB,WAAW,6CAAc;AAAA,QAC3B,EAAC,CAAC;AAEF;AAAA,UAAY,UACV,KAAK;AAAA,YAAI,OACP,EAAE,OAAO,cACL,iCAAK,IAAL,EAAQ,SAAS,OAAO,WAAW,OAAO,WAAW,KAAK,UAAU,MAAM,EAAE,KAC5E;AAAA,UACN;AAAA,QACF;AACA,uBAAe,KAAK;AACpB,gCAAAA,QAAM,QAAQ,kBAAkB;AAAA,MAClC;AAAA,IACF,SAAS,KAAK;AACZ,cAAQ,MAAM,yBAAyB,GAAG;AAC1C,qBAAe,KAAK;AACpB;AAAA,QAAY,UACV,KAAK;AAAA,UAAI,OACP,EAAE,OAAO,cACL,iCAAK,IAAL,EAAQ,SAAS,qDAAgD,KACjE;AAAA,QACN;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAGA,MAAI,SAAS;AACX,WACE,8CAAC,SAAI,WAAU,gBACb,yDAAC,SAAI,WAAU,sBACb;AAAA,oDAAC,gCAAQ,WAAU,0CAAyC;AAAA,MAC5D,8CAAC,OAAE,WAAU,qBAAoB,wBAAU;AAAA,OAC7C,GACF;AAAA,EAEJ;AAEA,SACE,+CAAC,SAAI,WAAU,aAEb;AAAA,kDAAC,aAAU,mBAAmB,MAAM,mBAAmB,IAAI,GAAG;AAAA,IAE9D,8CAAC,SAAI,WAAU,aACb,yDAAC,aAAQ,WAAU,6CAEjB;AAAA,oDAAC,SAAI,WAAU,mBACb;AAAA,QAAC;AAAA;AAAA,UACC;AAAA,UACA,QAAQ;AAAA,UACR,cAAc;AAAA,UACd;AAAA,UACA;AAAA,UACA,gBAAgB;AAAA,UAChB;AAAA;AAAA,MACF,GACF;AAAA,MAEC,CAAC,SAAS,UACT,8CAAC,SAAI,WAAU,oBACb,yDAAC,SACC;AAAA,sDAAC,OAAE,WAAU,0BAAyB,+BAAiB;AAAA,QACvD,8CAAC,OAAE,WAAU,6BAA4B,qDAEzC;AAAA,SACF,GACF;AAAA,OAEJ,GACF;AAAA,IAEA;AAAA,MAAC;AAAA;AAAA,QACC,MAAM;AAAA,QACN,SAAS,MAAM,mBAAmB,KAAK;AAAA,QACvC,OAAM;AAAA,QAEN,wDAAC,mBAAgB;AAAA;AAAA,IACnB;AAAA,KACF;AAEJ;;;ALjZM,IAAAC,uBAAA;AAPC,SAAS,iBAAiB,EAAE,QAAQ,QAAQ,QAAQ,OAAO,GAA0B;AAC1F,gCAAU,MAAM;AACd,cAAU,EAAE,QAAQ,QAAQ,OAAO,CAAC;AAAA,EACtC,GAAG,CAAC,QAAQ,QAAQ,MAAM,CAAC;AAE3B,SACE,8CAAC,uBACC,wDAAC,WAAQ,QAAgB,GAC3B;AAEJ;AAEA,IAAO,gBAAQ;","names":["import_react","axios","import_react","import_lucide_react","import_react","import_lucide_react","import_react","import_react","import_jsx_runtime","StarterKit","Placeholder","editor","import_jsx_runtime","import_react","import_lucide_react","import_jsx_runtime","import_jsx_runtime","_a","Select","import_lucide_react","import_jsx_runtime","import_jsx_runtime","import_react","import_lucide_react","import_jsx_runtime","import_react","import_react","import_jsx_runtime","import_jsx_runtime","_a","_b","toast","_c","import_react_hot_toast","import_lucide_react","import_jsx_runtime","toast","import_jsx_runtime"]}