@burdenoff/microfe-brainyrich 2026.525.1 → 2026.706.1
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/brainyrich/BrainyRichRoot.js +55 -90
- package/dist/brainyrich/BrainyRichRoot.js.map +1 -1
- package/dist/brainyrich/BrainyRichRoutes.js +15 -35
- package/dist/brainyrich/BrainyRichRoutes.js.map +1 -1
- package/dist/brainyrich/components/ActorName.js +38 -0
- package/dist/brainyrich/components/ActorName.js.map +1 -0
- package/dist/brainyrich/components/ConfirmDialog.js +25 -0
- package/dist/brainyrich/components/ConfirmDialog.js.map +1 -0
- package/dist/brainyrich/components/LoadMore.js +24 -0
- package/dist/brainyrich/components/LoadMore.js.map +1 -0
- package/dist/brainyrich/components/index.js +5 -0
- package/dist/brainyrich/components/notify.js +38 -0
- package/dist/brainyrich/components/notify.js.map +1 -0
- package/dist/brainyrich/components/pickers.js +232 -0
- package/dist/brainyrich/components/pickers.js.map +1 -0
- package/dist/brainyrich/components/reuse/CommentThread.js +208 -0
- package/dist/brainyrich/components/reuse/CommentThread.js.map +1 -0
- package/dist/brainyrich/components/reuse/DocumentsPanel.js +237 -0
- package/dist/brainyrich/components/reuse/DocumentsPanel.js.map +1 -0
- package/dist/brainyrich/components/reuse/TagField.js +206 -0
- package/dist/brainyrich/components/reuse/TagField.js.map +1 -0
- package/dist/brainyrich/components/reuse/transport.js +24 -0
- package/dist/brainyrich/components/reuse/transport.js.map +1 -0
- package/dist/brainyrich/hooks/useBrainyRichApi.js +815 -0
- package/dist/brainyrich/hooks/useBrainyRichApi.js.map +1 -0
- package/dist/brainyrich/index.js +0 -1
- package/dist/brainyrich/pages/AccountsPage.js +743 -160
- package/dist/brainyrich/pages/AccountsPage.js.map +1 -1
- package/dist/brainyrich/pages/AiAssistantPage.js +556 -363
- package/dist/brainyrich/pages/AiAssistantPage.js.map +1 -1
- package/dist/brainyrich/pages/AnalyticsPage.js +601 -268
- package/dist/brainyrich/pages/AnalyticsPage.js.map +1 -1
- package/dist/brainyrich/pages/DashboardPage.js +375 -231
- package/dist/brainyrich/pages/DashboardPage.js.map +1 -1
- package/dist/brainyrich/pages/FamilyPage.js +599 -337
- package/dist/brainyrich/pages/FamilyPage.js.map +1 -1
- package/dist/brainyrich/pages/GoalsPage.js +810 -141
- package/dist/brainyrich/pages/GoalsPage.js.map +1 -1
- package/dist/brainyrich/pages/InvestmentsPage.js +410 -311
- package/dist/brainyrich/pages/InvestmentsPage.js.map +1 -1
- package/dist/brainyrich/pages/PortfoliosPage.js +867 -156
- package/dist/brainyrich/pages/PortfoliosPage.js.map +1 -1
- package/dist/brainyrich/pages/ReportsPage.js +421 -251
- package/dist/brainyrich/pages/ReportsPage.js.map +1 -1
- package/dist/brainyrich/pages/RiskPage.js +557 -194
- package/dist/brainyrich/pages/RiskPage.js.map +1 -1
- package/dist/brainyrich/pages/TaxPage.js +655 -221
- package/dist/brainyrich/pages/TaxPage.js.map +1 -1
- package/dist/brainyrich/pages/_shared.js +222 -41
- package/dist/brainyrich/pages/_shared.js.map +1 -1
- package/dist/index.js +2 -3
- package/dist/node_modules/sonner/dist/index.js +163 -0
- package/dist/node_modules/sonner/dist/index.js.map +1 -0
- package/package.json +3 -2
- package/dist/brainyrich/pages/AdvisorsPage.js +0 -375
- package/dist/brainyrich/pages/AdvisorsPage.js.map +0 -1
- package/dist/brainyrich/pages/AssistantPage.js +0 -332
- package/dist/brainyrich/pages/AssistantPage.js.map +0 -1
- package/dist/brainyrich/pages/EstatePage.js +0 -269
- package/dist/brainyrich/pages/EstatePage.js.map +0 -1
- package/dist/brainyrich/pages/InsurancePage.js +0 -181
- package/dist/brainyrich/pages/InsurancePage.js.map +0 -1
- package/dist/brainyrich/pages/MarketplacePage.js +0 -450
- package/dist/brainyrich/pages/MarketplacePage.js.map +0 -1
- package/dist/brainyrich/store/brainyrichStore.js +0 -272
- package/dist/brainyrich/store/brainyrichStore.js.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ReportsPage.js","names":[],"sources":["../../../src/brainyrich/pages/ReportsPage.tsx"],"sourcesContent":["import {\n Card,\n CardContent,\n CardHeader,\n CardTitle,\n CardDescription,\n Badge,\n Button,\n Table,\n TableBody,\n TableCell,\n TableHead,\n TableHeader,\n TableRow,\n} from '@burdenoff/fe-libs/ui';\nimport { FileText, Download, Calendar, Clock } from 'lucide-react';\nimport { useBrainyRichStore } from '../store/brainyrichStore';\nimport { SectionShell, KpiGrid } from './_shared';\n\nconst reportCatalog = [\n {\n category: 'Portfolio Reports',\n items: [\n {\n name: 'Portfolio Performance',\n desc: 'Comprehensive return analysis',\n frequency: 'Monthly',\n last: '2026-06-01',\n },\n {\n name: 'Asset Allocation',\n desc: 'Current vs target allocation',\n frequency: 'Quarterly',\n last: '2026-05-01',\n },\n {\n name: 'Holdings Summary',\n desc: 'Detailed position report',\n frequency: 'Weekly',\n last: '2026-06-08',\n },\n ],\n },\n {\n category: 'Tax Reports',\n items: [\n {\n name: 'Tax Loss Harvesting',\n desc: 'Realized & unrealized gains/losses',\n frequency: 'Monthly',\n last: '2026-06-01',\n },\n {\n name: 'Tax-Efficient Strategies',\n desc: 'Optimization recommendations',\n frequency: 'Quarterly',\n last: '2026-04-01',\n },\n {\n name: 'Year-End Tax Summary',\n desc: 'Annual tax impact analysis',\n frequency: 'Annually',\n last: '2025-12-31',\n },\n ],\n },\n {\n category: 'Risk Reports',\n items: [\n {\n name: 'Risk Assessment',\n desc: 'Portfolio risk metrics',\n frequency: 'Monthly',\n last: '2026-06-01',\n },\n {\n name: 'Stress Test Results',\n desc: 'Crisis scenario analysis',\n frequency: 'Quarterly',\n last: '2026-04-01',\n },\n ],\n },\n];\n\nconst scheduledReports = [\n {\n name: 'Weekly Holdings Summary',\n nextRun: '2026-06-15',\n frequency: 'Weekly',\n recipients: 'you@brainyrich.com',\n },\n {\n name: 'Monthly Performance Report',\n nextRun: '2026-07-01',\n frequency: 'Monthly',\n recipients: 'you@brainyrich.com',\n },\n {\n name: 'Quarterly Tax Summary',\n nextRun: '2026-10-01',\n frequency: 'Quarterly',\n recipients: 'you@brainyrich.com, advisor@firm.com',\n },\n];\n\nexport function ReportsPage() {\n const { reports } = useBrainyRichStore();\n\n return (\n <SectionShell\n title=\"Reports & Documents\"\n description=\"Generate, schedule, and download your financial reports\"\n actionLabel=\"Generate Custom Report\"\n badges={[`${reports.length} Recent Reports`]}\n >\n <KpiGrid\n items={[\n { label: 'Total Reports', value: '127', trend: 'Generated this year' },\n {\n label: 'Scheduled Reports',\n value: String(scheduledReports.length),\n trend: 'Active schedules',\n },\n { label: 'Ready to Download', value: String(reports.length) },\n { label: 'Report Formats', value: '3', trend: 'PDF, Excel, CSV' },\n ]}\n />\n\n <div className=\"grid gap-4 lg:grid-cols-3\">\n {/* Report catalog */}\n <div className=\"lg:col-span-2 space-y-4\">\n {reportCatalog.map((cat) => (\n <Card key={cat.category}>\n <CardHeader>\n <CardTitle className=\"text-base\">{cat.category}</CardTitle>\n </CardHeader>\n <CardContent className=\"space-y-2\">\n {cat.items.map((r) => (\n <div\n key={r.name}\n className=\"flex items-center justify-between rounded-lg border p-3\"\n >\n <div className=\"flex-1\">\n <p className=\"font-medium text-sm\">{r.name}</p>\n <p className=\"text-xs text-muted-foreground\">{r.desc}</p>\n </div>\n <div className=\"text-center mx-4\">\n <Badge variant=\"outline\" className=\"text-[10px]\">\n {r.frequency}\n </Badge>\n <p className=\"text-[10px] text-muted-foreground mt-0.5\">Last: {r.last}</p>\n </div>\n <div className=\"flex gap-1\">\n <Button variant=\"outline\" size=\"sm\">\n Generate\n </Button>\n <Button variant=\"outline\" size=\"sm\">\n <Calendar className=\"h-3 w-3\" />\n </Button>\n </div>\n </div>\n ))}\n </CardContent>\n </Card>\n ))}\n </div>\n\n {/* Sidebar */}\n <div className=\"space-y-4\">\n <Card>\n <CardHeader>\n <CardTitle className=\"flex items-center gap-2 text-base\">\n <FileText className=\"h-4 w-4\" />\n Recent Reports\n </CardTitle>\n </CardHeader>\n <CardContent className=\"space-y-3\">\n {reports.map((r) => (\n <div key={r.id} className=\"rounded-lg border p-3\">\n <p className=\"font-medium text-sm\">{r.title}</p>\n <p className=\"text-xs text-muted-foreground\">\n {r.period} · Generated {r.generatedAt}\n </p>\n <Button variant=\"outline\" size=\"sm\" className=\"mt-2 w-full\">\n <Download className=\"mr-1 h-3 w-3\" />\n Download\n </Button>\n </div>\n ))}\n </CardContent>\n </Card>\n\n <Card>\n <CardHeader>\n <CardTitle className=\"flex items-center gap-2 text-base\">\n <Clock className=\"h-4 w-4\" />\n Scheduled Reports\n </CardTitle>\n </CardHeader>\n <CardContent className=\"space-y-3\">\n {scheduledReports.map((s) => (\n <div key={s.name} className=\"rounded-lg border p-3\">\n <p className=\"font-medium text-sm\">{s.name}</p>\n <p className=\"text-xs text-muted-foreground\">\n Next: {s.nextRun} · {s.frequency}\n </p>\n <p className=\"text-xs text-muted-foreground\">{s.recipients}</p>\n </div>\n ))}\n </CardContent>\n </Card>\n\n <Card>\n <CardHeader>\n <CardTitle className=\"text-base\">Export Formats</CardTitle>\n </CardHeader>\n <CardContent className=\"space-y-2\">\n {[\n { format: 'PDF', status: 'Available' },\n { format: 'Excel (.xlsx)', status: 'Available' },\n { format: 'CSV', status: 'Available' },\n { format: 'Interactive Dashboard', status: 'Coming Soon' },\n ].map((f) => (\n <div key={f.format} className=\"flex justify-between text-sm\">\n <span>{f.format}</span>\n <span\n className={f.status === 'Available' ? 'text-emerald-600' : 'text-yellow-600'}\n >\n {f.status === 'Available' ? 'Available' : 'Coming Soon'}\n </span>\n </div>\n ))}\n </CardContent>\n </Card>\n </div>\n </div>\n </SectionShell>\n );\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"ReportsPage.js","names":[],"sources":["../../../src/brainyrich/pages/ReportsPage.tsx"],"sourcesContent":["import { useMemo, useState } from 'react';\nimport { useQuery } from '@tanstack/react-query';\nimport {\n Card,\n CardContent,\n CardHeader,\n CardTitle,\n CardDescription,\n Button,\n Badge,\n Table,\n TableBody,\n TableCell,\n TableHead,\n TableHeader,\n TableRow,\n Tabs,\n TabsList,\n TabsTrigger,\n DropdownMenu,\n DropdownMenuContent,\n DropdownMenuItem,\n DropdownMenuTrigger,\n} from '@burdenoff/fe-libs/ui';\nimport { FileText, Printer, Download, Wallet, Layers, Receipt, ChevronDown } from 'lucide-react';\nimport { graphqlFetch } from '@burdenoff/fe-libs/shared/graphql';\nimport { useI18n } from '@burdenoff/fe-libs/shared/providers/shell/I18nProvider';\nimport { tWithFallback } from '../utils/i18n';\nimport { useBrainyRich } from '../providers/BrainyRichProvider';\nimport {\n useNetWorthSummary,\n useAllTransactions,\n fetchAllAccounts,\n} from '../hooks/useBrainyRichApi';\nimport type { BraHolding, BraTransaction } from '../types/bra';\nimport {\n SectionShell,\n KpiGrid,\n AllocationBars,\n EmptyState,\n LoadingState,\n ErrorState,\n formatMoney,\n formatDate,\n deltaToneClass,\n type KpiItem,\n type AllocationDatum,\n} from './_shared';\n\ntype Translate = (\n key: string,\n fallback: string,\n params?: Record<string, string | number>\n) => string;\n\ntype StatementView = 'networth' | 'holdings' | 'transactions';\n\n/** Minimal read-query surface the statement sub-cards need for their states. */\ninterface QueryStatus {\n isLoading: boolean;\n isError: boolean;\n refetch: () => void;\n}\n\n// ============================================================================\n// CSV helpers — client-side export built from REAL rows only\n// ============================================================================\n\nfunction toCsv(headers: string[], rows: (string | number)[][]): string {\n const escape = (cell: string | number) => {\n const s = String(cell ?? '');\n return /[\",\\n]/.test(s) ? `\"${s.replace(/\"/g, '\"\"')}\"` : s;\n };\n return [headers, ...rows].map((row) => row.map(escape).join(',')).join('\\n');\n}\n\nfunction downloadCsv(filename: string, csv: string) {\n const blob = new Blob([csv], { type: 'text/csv;charset=utf-8;' });\n const url = URL.createObjectURL(blob);\n const link = document.createElement('a');\n link.href = url;\n link.download = filename;\n document.body.appendChild(link);\n link.click();\n document.body.removeChild(link);\n URL.revokeObjectURL(url);\n}\n\n// ============================================================================\n// Full holdings schedule\n// ----------------------------------------------------------------------------\n// `braListPortfolios`/`braListAccounts` never inline `holdings`, and\n// `braListHoldings` is scoped to a single account/portfolio. To build a\n// COMPLETE holdings schedule (every position, not a truncated first page) we\n// enumerate the full account set via the foundation `fetchAllAccounts` pager,\n// then read each account's holdings (which `braListHoldings` returns in full,\n// un-paginated) and flatten. Real server rows only — no fabrication.\n// ============================================================================\n\nconst HOLDINGS_BY_ACCOUNT_QUERY = `query BraReportHoldings($accountId: ID) {\n braListHoldings(accountId: $accountId) {\n id workspaceId accountId portfolioId symbol name assetClass quantity lastPrice\n costBasis marketValue currency asOf createdAt updatedAt\n }\n}`;\n\nfunction useAllHoldings() {\n const { apiGatewayUrl } = useBrainyRich();\n const query = useQuery({\n queryKey: ['brainyrich', 'holdings', 'report-all'],\n queryFn: async () => {\n const accounts = await fetchAllAccounts(apiGatewayUrl);\n const perAccount = await Promise.all(\n accounts.map(async (account) => {\n const response = await graphqlFetch<{ braListHoldings: BraHolding[] }>({\n gateway: 'workspace',\n baseUrl: apiGatewayUrl,\n query: HOLDINGS_BY_ACCOUNT_QUERY,\n variables: { accountId: account.id },\n workspaceToken: true,\n });\n if (response.errors?.length) {\n throw new Error(response.errors[0]?.message ?? 'Failed to load holdings');\n }\n return response.data?.braListHoldings ?? [];\n })\n );\n return perAccount.flat();\n },\n });\n return { ...query, data: query.data ?? [] };\n}\n\n// ============================================================================\n// Reports page — real, generatable statement views (net worth / holdings / ledger)\n// ============================================================================\n\nexport function ReportsPage() {\n const { t } = useI18n();\n const translate: Translate = (key, fallback, params) => tWithFallback(t, key, fallback, params);\n\n const [view, setView] = useState<StatementView>('networth');\n\n const summaryQuery = useNetWorthSummary();\n // Aggregation sources: page through the FULL set so statements + CSV cover\n // every holding and every ledger entry, not a truncated first page.\n const holdingsQuery = useAllHoldings();\n const transactionsQuery = useAllTransactions();\n\n const summary = summaryQuery.data;\n const currency = summary?.currency ?? 'USD';\n\n // Holdings schedule: every holding across every account, richest first.\n const holdings: BraHolding[] = useMemo(\n () => holdingsQuery.data.slice().sort((a, b) => b.marketValue - a.marketValue),\n [holdingsQuery.data]\n );\n\n const transactions: BraTransaction[] = useMemo(\n () =>\n transactionsQuery.data\n .slice()\n .sort((a, b) => new Date(b.tradeDate).getTime() - new Date(a.tradeDate).getTime()),\n [transactionsQuery.data]\n );\n\n const kpis: KpiItem[] = summary\n ? [\n {\n label: translate('brainyrich.reports.kpis.netWorth', 'Net Worth'),\n value: formatMoney(summary.totalNetWorth, currency),\n },\n {\n label: translate('brainyrich.reports.kpis.marketValue', 'Invested Value'),\n value: formatMoney(summary.totalMarketValue, currency),\n },\n {\n label: translate('brainyrich.reports.kpis.holdings', 'Holdings on Schedule'),\n value: String(holdings.length),\n },\n {\n label: translate('brainyrich.reports.kpis.transactions', 'Ledger Entries'),\n value: String(transactions.length),\n },\n ]\n : [\n {\n label: translate('brainyrich.reports.kpis.holdings', 'Holdings on Schedule'),\n value: String(holdings.length),\n },\n {\n label: translate('brainyrich.reports.kpis.transactions', 'Ledger Entries'),\n value: String(transactions.length),\n },\n ];\n\n // Primary \"Print / Export\" action for the currently selected statement.\n // Each branch emits the COMPLETE dataset (full holdings / full ledger).\n const exportCurrent = () => {\n if (view === 'networth') {\n if (!summary) return;\n const headers = ['Metric', 'Amount', 'Currency'];\n const rows: (string | number)[][] = [\n ['Total Net Worth', summary.totalNetWorth, currency],\n ['Total Market Value', summary.totalMarketValue, currency],\n ['Total Cash', summary.totalCash, currency],\n ['Account Count', summary.accountCount, ''],\n ...summary.byAssetClass.map((row) => [\n `Asset Class: ${row.assetClass.replace(/_/g, ' ')}`,\n row.marketValue,\n currency,\n ]),\n ];\n downloadCsv('brainyrich-net-worth-statement.csv', toCsv(headers, rows));\n return;\n }\n if (view === 'holdings') {\n const headers = [\n 'Symbol',\n 'Name',\n 'Asset Class',\n 'Quantity',\n 'Cost Basis',\n 'Market Value',\n 'Currency',\n ];\n const rows = holdings.map((h) => [\n h.symbol,\n h.name ?? '',\n h.assetClass.replace(/_/g, ' '),\n h.quantity,\n h.costBasis,\n h.marketValue,\n h.currency,\n ]);\n downloadCsv('brainyrich-holdings-schedule.csv', toCsv(headers, rows));\n return;\n }\n const headers = [\n 'Trade Date',\n 'Type',\n 'Symbol',\n 'Quantity',\n 'Price',\n 'Amount',\n 'Fee',\n 'Currency',\n ];\n const rows = transactions.map((tx) => [\n formatDate(tx.tradeDate),\n tx.type,\n tx.symbol ?? '',\n tx.quantity,\n tx.price,\n tx.amount,\n tx.fee,\n tx.currency,\n ]);\n downloadCsv('brainyrich-transaction-ledger.csv', toCsv(headers, rows));\n };\n\n // The export action only produces a file for a statement that actually has\n // rows; disable it while the active statement is still loading / empty.\n const exportDisabled =\n (view === 'networth' && (summaryQuery.isLoading || !summary)) ||\n (view === 'holdings' && (holdingsQuery.isLoading || holdings.length === 0)) ||\n (view === 'transactions' && (transactionsQuery.isLoading || transactions.length === 0));\n\n return (\n <SectionShell\n title={translate('brainyrich.reports.title', 'Reports & Statements')}\n description={translate(\n 'brainyrich.reports.description',\n 'Generate statements directly from your live portfolio data — no fabricated schedules.'\n )}\n actions={\n <DropdownMenu>\n <DropdownMenuTrigger asChild>\n <Button\n size=\"sm\"\n disabled={exportDisabled}\n aria-label={translate('brainyrich.reports.actions.export', 'Print / Export')}\n >\n <Download className=\"size-4\" aria-hidden=\"true\" />\n {translate('brainyrich.reports.actions.export', 'Print / Export')}\n <ChevronDown className=\"size-4\" aria-hidden=\"true\" />\n </Button>\n </DropdownMenuTrigger>\n <DropdownMenuContent align=\"end\">\n <DropdownMenuItem onSelect={exportCurrent}>\n <Download className=\"size-4\" aria-hidden=\"true\" />\n {translate('brainyrich.reports.actions.downloadCsv', 'Download CSV')}\n </DropdownMenuItem>\n <DropdownMenuItem onSelect={() => window.print()}>\n <Printer className=\"size-4\" aria-hidden=\"true\" />\n {translate('brainyrich.reports.actions.print', 'Print statement')}\n </DropdownMenuItem>\n </DropdownMenuContent>\n </DropdownMenu>\n }\n >\n <KpiGrid items={kpis} />\n\n <Tabs value={view} onValueChange={(value) => setView(value as StatementView)}>\n <TabsList>\n <TabsTrigger value=\"networth\">\n <Wallet className=\"size-4\" aria-hidden=\"true\" />\n {translate('brainyrich.reports.tabs.netWorth', 'Net Worth')}\n </TabsTrigger>\n <TabsTrigger value=\"holdings\">\n <Layers className=\"size-4\" aria-hidden=\"true\" />\n {translate('brainyrich.reports.tabs.holdings', 'Holdings')}\n </TabsTrigger>\n <TabsTrigger value=\"transactions\">\n <Receipt className=\"size-4\" aria-hidden=\"true\" />\n {translate('brainyrich.reports.tabs.ledger', 'Ledger')}\n </TabsTrigger>\n </TabsList>\n </Tabs>\n\n {view === 'networth' ? (\n <NetWorthStatement query={summaryQuery} translate={translate} />\n ) : view === 'holdings' ? (\n <HoldingsSchedule query={holdingsQuery} holdings={holdings} translate={translate} />\n ) : (\n <TransactionLedger\n query={transactionsQuery}\n transactions={transactions}\n translate={translate}\n />\n )}\n </SectionShell>\n );\n}\n\n// ============================================================================\n// Net-worth statement\n// ============================================================================\n\nfunction NetWorthStatement({\n query,\n translate,\n}: {\n query: ReturnType<typeof useNetWorthSummary>;\n translate: Translate;\n}) {\n const summary = query.data;\n const currency = summary?.currency ?? 'USD';\n\n const allocation: AllocationDatum[] = useMemo(() => {\n if (!summary) return [];\n const total = summary.byAssetClass.reduce((sum, row) => sum + row.marketValue, 0);\n if (total <= 0) return [];\n return summary.byAssetClass\n .slice()\n .sort((a, b) => b.marketValue - a.marketValue)\n .map((row) => ({\n label: row.assetClass.replace(/_/g, ' '),\n value: (row.marketValue / total) * 100,\n caption: formatMoney(row.marketValue, currency),\n }));\n }, [summary, currency]);\n\n return (\n <Card>\n <CardHeader>\n <CardTitle className=\"flex items-center gap-2\">\n <Wallet className=\"size-5\" aria-hidden=\"true\" />\n {translate('brainyrich.reports.netWorth.title', 'Net Worth Statement')}\n </CardTitle>\n <CardDescription>\n {translate(\n 'brainyrich.reports.netWorth.description',\n 'Consolidated assets, cash, and asset-class allocation as of today.'\n )}\n </CardDescription>\n </CardHeader>\n <CardContent>\n {query.isLoading ? (\n <LoadingState rows={3} />\n ) : query.isError ? (\n <ErrorState onRetry={() => query.refetch()} />\n ) : summary ? (\n <div className=\"space-y-6\">\n <div className=\"grid gap-4 sm:grid-cols-3\">\n <StatementLine\n label={translate('brainyrich.reports.netWorth.total', 'Total Net Worth')}\n value={formatMoney(summary.totalNetWorth, currency)}\n emphasis\n />\n <StatementLine\n label={translate('brainyrich.reports.netWorth.invested', 'Invested Value')}\n value={formatMoney(summary.totalMarketValue, currency)}\n />\n <StatementLine\n label={translate('brainyrich.reports.netWorth.cash', 'Cash & Liquidity')}\n value={formatMoney(summary.totalCash, currency)}\n />\n </div>\n\n <div className=\"space-y-3\">\n <p className=\"text-sm font-medium text-text-primary\">\n {translate('brainyrich.reports.netWorth.allocation', 'Allocation by Asset Class')}\n </p>\n {allocation.length > 0 ? (\n <AllocationBars data={allocation} />\n ) : (\n <p className=\"text-sm text-text-secondary\">\n {translate(\n 'brainyrich.reports.netWorth.noAllocation',\n 'No holdings to allocate yet.'\n )}\n </p>\n )}\n </div>\n </div>\n ) : (\n <EmptyState\n icon={<Wallet className=\"size-6\" aria-hidden=\"true\" />}\n title={translate('brainyrich.reports.netWorth.emptyTitle', 'No net-worth data yet')}\n description={translate(\n 'brainyrich.reports.netWorth.emptyDesc',\n 'Link an account and add holdings to generate a net-worth statement.'\n )}\n />\n )}\n </CardContent>\n </Card>\n );\n}\n\nfunction StatementLine({\n label,\n value,\n emphasis,\n}: {\n label: string;\n value: string;\n emphasis?: boolean;\n}) {\n return (\n <div className=\"rounded-lg border border-border-subtle bg-bg-surface p-4\">\n <p className=\"text-xs text-text-secondary\">{label}</p>\n <p\n className={\n emphasis\n ? 'mt-1 text-2xl font-semibold text-text-primary'\n : 'mt-1 text-xl font-semibold text-text-primary'\n }\n >\n {value}\n </p>\n </div>\n );\n}\n\n// ============================================================================\n// Holdings schedule\n// ============================================================================\n\nfunction HoldingsSchedule({\n query,\n holdings,\n translate,\n}: {\n query: QueryStatus;\n holdings: BraHolding[];\n translate: Translate;\n}) {\n return (\n <Card>\n <CardHeader>\n <CardTitle className=\"flex items-center gap-2\">\n <Layers className=\"size-5\" aria-hidden=\"true\" />\n {translate('brainyrich.reports.holdings.title', 'Holdings Schedule')}\n </CardTitle>\n <CardDescription>\n {translate(\n 'brainyrich.reports.holdings.description',\n 'Every position across your portfolios with cost basis and market value.'\n )}\n </CardDescription>\n </CardHeader>\n <CardContent>\n {query.isLoading ? (\n <LoadingState rows={4} />\n ) : query.isError ? (\n <ErrorState onRetry={() => query.refetch()} />\n ) : holdings.length > 0 ? (\n <div className=\"overflow-x-auto\">\n <Table>\n <TableHeader>\n <TableRow>\n <TableHead>{translate('brainyrich.reports.holdings.symbol', 'Symbol')}</TableHead>\n <TableHead>\n {translate('brainyrich.reports.holdings.assetClass', 'Asset Class')}\n </TableHead>\n <TableHead className=\"text-right\">\n {translate('brainyrich.reports.holdings.quantity', 'Quantity')}\n </TableHead>\n <TableHead className=\"text-right\">\n {translate('brainyrich.reports.holdings.costBasis', 'Cost Basis')}\n </TableHead>\n <TableHead className=\"text-right\">\n {translate('brainyrich.reports.holdings.marketValue', 'Market Value')}\n </TableHead>\n <TableHead className=\"text-right\">\n {translate('brainyrich.reports.holdings.gainLoss', 'Unrealized')}\n </TableHead>\n </TableRow>\n </TableHeader>\n <TableBody>\n {holdings.map((holding) => {\n const gain = holding.marketValue - holding.costBasis;\n return (\n <TableRow key={holding.id}>\n <TableCell>\n <div className=\"font-medium text-text-primary\">{holding.symbol}</div>\n {holding.name ? (\n <div className=\"text-xs text-text-secondary\">{holding.name}</div>\n ) : null}\n </TableCell>\n <TableCell>\n <Badge variant=\"outline\">{holding.assetClass.replace(/_/g, ' ')}</Badge>\n </TableCell>\n <TableCell className=\"text-right tabular-nums text-text-primary\">\n {holding.quantity}\n </TableCell>\n <TableCell className=\"text-right tabular-nums text-text-primary\">\n {formatMoney(holding.costBasis, holding.currency)}\n </TableCell>\n <TableCell className=\"text-right tabular-nums text-text-primary\">\n {formatMoney(holding.marketValue, holding.currency)}\n </TableCell>\n <TableCell\n className={`text-right tabular-nums font-medium ${deltaToneClass(gain)}`}\n >\n {gain > 0 ? '+' : ''}\n {formatMoney(gain, holding.currency)}\n </TableCell>\n </TableRow>\n );\n })}\n </TableBody>\n </Table>\n </div>\n ) : (\n <EmptyState\n icon={<Layers className=\"size-6\" aria-hidden=\"true\" />}\n title={translate('brainyrich.reports.holdings.emptyTitle', 'No holdings on file')}\n description={translate(\n 'brainyrich.reports.holdings.emptyDesc',\n 'Add holdings to your portfolios to generate a holdings schedule.'\n )}\n />\n )}\n </CardContent>\n </Card>\n );\n}\n\n// ============================================================================\n// Transaction ledger\n// ============================================================================\n\nfunction TransactionLedger({\n query,\n transactions,\n translate,\n}: {\n query: QueryStatus;\n transactions: BraTransaction[];\n translate: Translate;\n}) {\n return (\n <Card>\n <CardHeader>\n <CardTitle className=\"flex items-center gap-2\">\n <Receipt className=\"size-5\" aria-hidden=\"true\" />\n {translate('brainyrich.reports.ledger.title', 'Transaction Ledger')}\n </CardTitle>\n <CardDescription>\n {translate(\n 'brainyrich.reports.ledger.description',\n 'Every recorded transaction across your accounts, newest first.'\n )}\n </CardDescription>\n </CardHeader>\n <CardContent>\n {query.isLoading ? (\n <LoadingState rows={4} />\n ) : query.isError ? (\n <ErrorState onRetry={() => query.refetch()} />\n ) : transactions.length > 0 ? (\n <div className=\"overflow-x-auto\">\n <Table>\n <TableHeader>\n <TableRow>\n <TableHead>{translate('brainyrich.reports.ledger.date', 'Trade Date')}</TableHead>\n <TableHead>{translate('brainyrich.reports.ledger.type', 'Type')}</TableHead>\n <TableHead>{translate('brainyrich.reports.ledger.symbol', 'Symbol')}</TableHead>\n <TableHead className=\"text-right\">\n {translate('brainyrich.reports.ledger.quantity', 'Quantity')}\n </TableHead>\n <TableHead className=\"text-right\">\n {translate('brainyrich.reports.ledger.price', 'Price')}\n </TableHead>\n <TableHead className=\"text-right\">\n {translate('brainyrich.reports.ledger.amount', 'Amount')}\n </TableHead>\n </TableRow>\n </TableHeader>\n <TableBody>\n {transactions.map((tx) => (\n <TableRow key={tx.id}>\n <TableCell className=\"text-text-primary\">{formatDate(tx.tradeDate)}</TableCell>\n <TableCell>\n <Badge variant=\"outline\">{tx.type}</Badge>\n </TableCell>\n <TableCell className=\"text-text-primary\">{tx.symbol ?? '—'}</TableCell>\n <TableCell className=\"text-right tabular-nums text-text-primary\">\n {tx.quantity}\n </TableCell>\n <TableCell className=\"text-right tabular-nums text-text-primary\">\n {formatMoney(tx.price, tx.currency)}\n </TableCell>\n <TableCell className=\"text-right tabular-nums text-text-primary\">\n {formatMoney(tx.amount, tx.currency)}\n </TableCell>\n </TableRow>\n ))}\n </TableBody>\n </Table>\n </div>\n ) : (\n <EmptyState\n icon={<FileText className=\"size-6\" aria-hidden=\"true\" />}\n title={translate('brainyrich.reports.ledger.emptyTitle', 'No transactions recorded')}\n description={translate(\n 'brainyrich.reports.ledger.emptyDesc',\n 'Record transactions on your accounts to build a ledger statement.'\n )}\n />\n )}\n </CardContent>\n </Card>\n );\n}\n"],"mappings":";;;;;;;;;;;;AAoEA,SAAS,EAAM,GAAmB,GAAqC;CACrE,IAAM,KAAU,MAA0B;EACxC,IAAM,IAAI,OAAO,KAAQ,GAAG;AAC5B,SAAO,SAAS,KAAK,EAAE,GAAG,IAAI,EAAE,QAAQ,MAAM,OAAK,CAAC,KAAK;;AAE3D,QAAO,CAAC,GAAS,GAAG,EAAK,CAAC,KAAK,MAAQ,EAAI,IAAI,EAAO,CAAC,KAAK,IAAI,CAAC,CAAC,KAAK,KAAK;;AAG9E,SAAS,EAAY,GAAkB,GAAa;CAClD,IAAM,IAAO,IAAI,KAAK,CAAC,EAAI,EAAE,EAAE,MAAM,2BAA2B,CAAC,EAC3D,IAAM,IAAI,gBAAgB,EAAK,EAC/B,IAAO,SAAS,cAAc,IAAI;AAMxC,CALA,EAAK,OAAO,GACZ,EAAK,WAAW,GAChB,SAAS,KAAK,YAAY,EAAK,EAC/B,EAAK,OAAO,EACZ,SAAS,KAAK,YAAY,EAAK,EAC/B,IAAI,gBAAgB,EAAI;;AAc1B,IAAM,IAA4B;AAOlC,SAAS,IAAiB;CACxB,IAAM,EAAE,qBAAkB,GAAe,EACnC,IAAQ,EAAS;EACrB,UAAU;GAAC;GAAc;GAAY;GAAa;EAClD,SAAS,YAAY;GACnB,IAAM,IAAW,MAAM,EAAiB,EAAc;AAgBtD,WAfmB,MAAM,QAAQ,IAC/B,EAAS,IAAI,OAAO,MAAY;IAC9B,IAAM,IAAW,MAAM,EAAgD;KACrE,SAAS;KACT,SAAS;KACT,OAAO;KACP,WAAW,EAAE,WAAW,EAAQ,IAAI;KACpC,gBAAgB;KACjB,CAAC;AACF,QAAI,EAAS,QAAQ,OACnB,OAAU,MAAM,EAAS,OAAO,IAAI,WAAW,0BAA0B;AAE3E,WAAO,EAAS,MAAM,mBAAmB,EAAE;KAC3C,CACH,EACiB,MAAM;;EAE3B,CAAC;AACF,QAAO;EAAE,GAAG;EAAO,MAAM,EAAM,QAAQ,EAAE;EAAE;;AAO7C,SAAgB,IAAc;CAC5B,IAAM,EAAE,SAAM,GAAS,EACjB,KAAwB,GAAK,GAAU,MAAW,EAAc,GAAG,GAAK,GAAU,EAAO,EAEzF,CAAC,GAAM,KAAW,EAAwB,WAAW,EAErD,IAAe,GAAoB,EAGnC,IAAgB,GAAgB,EAChC,IAAoB,GAAoB,EAExC,IAAU,EAAa,MACvB,IAAW,GAAS,YAAY,OAGhC,IAAyB,QACvB,EAAc,KAAK,OAAO,CAAC,MAAM,GAAG,MAAM,EAAE,cAAc,EAAE,YAAY,EAC9E,CAAC,EAAc,KAAK,CACrB,EAEK,IAAiC,QAEnC,EAAkB,KACf,OAAO,CACP,MAAM,GAAG,MAAM,IAAI,KAAK,EAAE,UAAU,CAAC,SAAS,GAAG,IAAI,KAAK,EAAE,UAAU,CAAC,SAAS,CAAC,EACtF,CAAC,EAAkB,KAAK,CACzB,EAEK,IAAkB,IACpB;EACE;GACE,OAAO,EAAU,oCAAoC,YAAY;GACjE,OAAO,EAAY,EAAQ,eAAe,EAAS;GACpD;EACD;GACE,OAAO,EAAU,uCAAuC,iBAAiB;GACzE,OAAO,EAAY,EAAQ,kBAAkB,EAAS;GACvD;EACD;GACE,OAAO,EAAU,oCAAoC,uBAAuB;GAC5E,OAAO,OAAO,EAAS,OAAO;GAC/B;EACD;GACE,OAAO,EAAU,wCAAwC,iBAAiB;GAC1E,OAAO,OAAO,EAAa,OAAO;GACnC;EACF,GACD,CACE;EACE,OAAO,EAAU,oCAAoC,uBAAuB;EAC5E,OAAO,OAAO,EAAS,OAAO;EAC/B,EACD;EACE,OAAO,EAAU,wCAAwC,iBAAiB;EAC1E,OAAO,OAAO,EAAa,OAAO;EACnC,CACF,EAIC,UAAsB;AAC1B,MAAI,MAAS,YAAY;AACvB,OAAI,CAAC,EAAS;AAad,KAAY,sCAAsC,EAZlC;IAAC;IAAU;IAAU;IAAW,EACZ;IAClC;KAAC;KAAmB,EAAQ;KAAe;KAAS;IACpD;KAAC;KAAsB,EAAQ;KAAkB;KAAS;IAC1D;KAAC;KAAc,EAAQ;KAAW;KAAS;IAC3C;KAAC;KAAiB,EAAQ;KAAc;KAAG;IAC3C,GAAG,EAAQ,aAAa,KAAK,MAAQ;KACnC,gBAAgB,EAAI,WAAW,QAAQ,MAAM,IAAI;KACjD,EAAI;KACJ;KACD,CAAC;IACH,CACqE,CAAC;AACvE;;AAEF,MAAI,MAAS,YAAY;AAmBvB,KAAY,oCAAoC,EAlBhC;IACd;IACA;IACA;IACA;IACA;IACA;IACA;IACD,EACY,EAAS,KAAK,MAAM;IAC/B,EAAE;IACF,EAAE,QAAQ;IACV,EAAE,WAAW,QAAQ,MAAM,IAAI;IAC/B,EAAE;IACF,EAAE;IACF,EAAE;IACF,EAAE;IACH,CAAC,CACkE,CAAC;AACrE;;AAsBF,IAAY,qCAAqC,EApBjC;GACd;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACD,EACY,EAAa,KAAK,MAAO;GACpC,EAAW,EAAG,UAAU;GACxB,EAAG;GACH,EAAG,UAAU;GACb,EAAG;GACH,EAAG;GACH,EAAG;GACH,EAAG;GACH,EAAG;GACJ,CAAC,CACmE,CAAC;IAKlE,IACH,MAAS,eAAe,EAAa,aAAa,CAAC,MACnD,MAAS,eAAe,EAAc,aAAa,EAAS,WAAW,MACvE,MAAS,mBAAmB,EAAkB,aAAa,EAAa,WAAW;AAEtF,QACE,kBAAC,GAAD;EACE,OAAO,EAAU,4BAA4B,uBAAuB;EACpE,aAAa,EACX,kCACA,wFACD;EACD,SACE,kBAAC,GAAD,EAAA,UAAA,CACE,kBAAC,GAAD;GAAqB,SAAA;aACnB,kBAAC,IAAD;IACE,MAAK;IACL,UAAU;IACV,cAAY,EAAU,qCAAqC,iBAAiB;cAH9E;KAKE,kBAAC,GAAD;MAAU,WAAU;MAAS,eAAY;MAAS,CAAA;KACjD,EAAU,qCAAqC,iBAAiB;KACjE,kBAAC,GAAD;MAAa,WAAU;MAAS,eAAY;MAAS,CAAA;KAC9C;;GACW,CAAA,EACtB,kBAAC,GAAD;GAAqB,OAAM;aAA3B,CACE,kBAAC,GAAD;IAAkB,UAAU;cAA5B,CACE,kBAAC,GAAD;KAAU,WAAU;KAAS,eAAY;KAAS,CAAA,EACjD,EAAU,0CAA0C,eAAe,CACnD;OACnB,kBAAC,GAAD;IAAkB,gBAAgB,OAAO,OAAO;cAAhD,CACE,kBAAC,GAAD;KAAS,WAAU;KAAS,eAAY;KAAS,CAAA,EAChD,EAAU,oCAAoC,kBAAkB,CAChD;MACC;KACT,EAAA,CAAA;YA7BnB;GAgCE,kBAAC,GAAD,EAAS,OAAO,GAAQ,CAAA;GAExB,kBAAC,GAAD;IAAM,OAAO;IAAM,gBAAgB,MAAU,EAAQ,EAAuB;cAC1E,kBAAC,GAAD,EAAA,UAAA;KACE,kBAAC,GAAD;MAAa,OAAM;gBAAnB,CACE,kBAAC,GAAD;OAAQ,WAAU;OAAS,eAAY;OAAS,CAAA,EAC/C,EAAU,oCAAoC,YAAY,CAC/C;;KACd,kBAAC,GAAD;MAAa,OAAM;gBAAnB,CACE,kBAAC,GAAD;OAAQ,WAAU;OAAS,eAAY;OAAS,CAAA,EAC/C,EAAU,oCAAoC,WAAW,CAC9C;;KACd,kBAAC,GAAD;MAAa,OAAM;gBAAnB,CACE,kBAAC,GAAD;OAAS,WAAU;OAAS,eAAY;OAAS,CAAA,EAChD,EAAU,kCAAkC,SAAS,CAC1C;;KACL,EAAA,CAAA;IACN,CAAA;GAEN,MAAS,aACR,kBAAC,GAAD;IAAmB,OAAO;IAAyB;IAAa,CAAA,GAC9D,MAAS,aACX,kBAAC,IAAD;IAAkB,OAAO;IAAyB;IAAqB;IAAa,CAAA,GAEpF,kBAAC,IAAD;IACE,OAAO;IACO;IACH;IACX,CAAA;GAES;;;AAQnB,SAAS,EAAkB,EACzB,UACA,gBAIC;CACD,IAAM,IAAU,EAAM,MAChB,IAAW,GAAS,YAAY,OAEhC,IAAgC,QAAc;AAClD,MAAI,CAAC,EAAS,QAAO,EAAE;EACvB,IAAM,IAAQ,EAAQ,aAAa,QAAQ,GAAK,MAAQ,IAAM,EAAI,aAAa,EAAE;AAEjF,SADI,KAAS,IAAU,EAAE,GAClB,EAAQ,aACZ,OAAO,CACP,MAAM,GAAG,MAAM,EAAE,cAAc,EAAE,YAAY,CAC7C,KAAK,OAAS;GACb,OAAO,EAAI,WAAW,QAAQ,MAAM,IAAI;GACxC,OAAQ,EAAI,cAAc,IAAS;GACnC,SAAS,EAAY,EAAI,aAAa,EAAS;GAChD,EAAE;IACJ,CAAC,GAAS,EAAS,CAAC;AAEvB,QACE,kBAAC,GAAD,EAAA,UAAA,CACE,kBAAC,GAAD,EAAA,UAAA,CACE,kBAAC,GAAD;EAAW,WAAU;YAArB,CACE,kBAAC,GAAD;GAAQ,WAAU;GAAS,eAAY;GAAS,CAAA,EAC/C,EAAU,qCAAqC,sBAAsB,CAC5D;KACZ,kBAAC,GAAD,EAAA,UACG,EACC,2CACA,qEACD,EACe,CAAA,CACP,EAAA,CAAA,EACb,kBAAC,GAAD,EAAA,UACG,EAAM,YACL,kBAAC,GAAD,EAAc,MAAM,GAAK,CAAA,GACvB,EAAM,UACR,kBAAC,GAAD,EAAY,eAAe,EAAM,SAAS,EAAI,CAAA,GAC5C,IACF,kBAAC,OAAD;EAAK,WAAU;YAAf,CACE,kBAAC,OAAD;GAAK,WAAU;aAAf;IACE,kBAAC,GAAD;KACE,OAAO,EAAU,qCAAqC,kBAAkB;KACxE,OAAO,EAAY,EAAQ,eAAe,EAAS;KACnD,UAAA;KACA,CAAA;IACF,kBAAC,GAAD;KACE,OAAO,EAAU,wCAAwC,iBAAiB;KAC1E,OAAO,EAAY,EAAQ,kBAAkB,EAAS;KACtD,CAAA;IACF,kBAAC,GAAD;KACE,OAAO,EAAU,oCAAoC,mBAAmB;KACxE,OAAO,EAAY,EAAQ,WAAW,EAAS;KAC/C,CAAA;IACE;MAEN,kBAAC,OAAD;GAAK,WAAU;aAAf,CACE,kBAAC,KAAD;IAAG,WAAU;cACV,EAAU,0CAA0C,4BAA4B;IAC/E,CAAA,EACH,EAAW,SAAS,IACnB,kBAAC,GAAD,EAAgB,MAAM,GAAc,CAAA,GAEpC,kBAAC,KAAD;IAAG,WAAU;cACV,EACC,4CACA,+BACD;IACC,CAAA,CAEF;KACF;MAEN,kBAAC,GAAD;EACE,MAAM,kBAAC,GAAD;GAAQ,WAAU;GAAS,eAAY;GAAS,CAAA;EACtD,OAAO,EAAU,0CAA0C,wBAAwB;EACnF,aAAa,EACX,yCACA,sEACD;EACD,CAAA,EAEQ,CAAA,CACT,EAAA,CAAA;;AAIX,SAAS,EAAc,EACrB,UACA,UACA,eAKC;AACD,QACE,kBAAC,OAAD;EAAK,WAAU;YAAf,CACE,kBAAC,KAAD;GAAG,WAAU;aAA+B;GAAU,CAAA,EACtD,kBAAC,KAAD;GACE,WACE,IACI,kDACA;aAGL;GACC,CAAA,CACA;;;AAQV,SAAS,GAAiB,EACxB,UACA,aACA,gBAKC;AACD,QACE,kBAAC,GAAD,EAAA,UAAA,CACE,kBAAC,GAAD,EAAA,UAAA,CACE,kBAAC,GAAD;EAAW,WAAU;YAArB,CACE,kBAAC,GAAD;GAAQ,WAAU;GAAS,eAAY;GAAS,CAAA,EAC/C,EAAU,qCAAqC,oBAAoB,CAC1D;KACZ,kBAAC,GAAD,EAAA,UACG,EACC,2CACA,0EACD,EACe,CAAA,CACP,EAAA,CAAA,EACb,kBAAC,GAAD,EAAA,UACG,EAAM,YACL,kBAAC,GAAD,EAAc,MAAM,GAAK,CAAA,GACvB,EAAM,UACR,kBAAC,GAAD,EAAY,eAAe,EAAM,SAAS,EAAI,CAAA,GAC5C,EAAS,SAAS,IACpB,kBAAC,OAAD;EAAK,WAAU;YACb,kBAAC,GAAD,EAAA,UAAA,CACE,kBAAC,GAAD,EAAA,UACE,kBAAC,GAAD,EAAA,UAAA;GACE,kBAAC,GAAD,EAAA,UAAY,EAAU,sCAAsC,SAAS,EAAa,CAAA;GAClF,kBAAC,GAAD,EAAA,UACG,EAAU,0CAA0C,cAAc,EACzD,CAAA;GACZ,kBAAC,GAAD;IAAW,WAAU;cAClB,EAAU,wCAAwC,WAAW;IACpD,CAAA;GACZ,kBAAC,GAAD;IAAW,WAAU;cAClB,EAAU,yCAAyC,aAAa;IACvD,CAAA;GACZ,kBAAC,GAAD;IAAW,WAAU;cAClB,EAAU,2CAA2C,eAAe;IAC3D,CAAA;GACZ,kBAAC,GAAD;IAAW,WAAU;cAClB,EAAU,wCAAwC,aAAa;IACtD,CAAA;GACH,EAAA,CAAA,EACC,CAAA,EACd,kBAAC,GAAD,EAAA,UACG,EAAS,KAAK,MAAY;GACzB,IAAM,IAAO,EAAQ,cAAc,EAAQ;AAC3C,UACE,kBAAC,GAAD,EAAA,UAAA;IACE,kBAAC,GAAD,EAAA,UAAA,CACE,kBAAC,OAAD;KAAK,WAAU;eAAiC,EAAQ;KAAa,CAAA,EACpE,EAAQ,OACP,kBAAC,OAAD;KAAK,WAAU;eAA+B,EAAQ;KAAW,CAAA,GAC/D,KACM,EAAA,CAAA;IACZ,kBAAC,GAAD,EAAA,UACE,kBAAC,GAAD;KAAO,SAAQ;eAAW,EAAQ,WAAW,QAAQ,MAAM,IAAI;KAAS,CAAA,EAC9D,CAAA;IACZ,kBAAC,GAAD;KAAW,WAAU;eAClB,EAAQ;KACC,CAAA;IACZ,kBAAC,GAAD;KAAW,WAAU;eAClB,EAAY,EAAQ,WAAW,EAAQ,SAAS;KACvC,CAAA;IACZ,kBAAC,GAAD;KAAW,WAAU;eAClB,EAAY,EAAQ,aAAa,EAAQ,SAAS;KACzC,CAAA;IACZ,kBAAC,GAAD;KACE,WAAW,uCAAuC,EAAe,EAAK;eADxE,CAGG,IAAO,IAAI,MAAM,IACjB,EAAY,GAAM,EAAQ,SAAS,CAC1B;;IACH,EAAA,EAzBI,EAAQ,GAyBZ;IAEb,EACQ,CAAA,CACN,EAAA,CAAA;EACJ,CAAA,GAEN,kBAAC,GAAD;EACE,MAAM,kBAAC,GAAD;GAAQ,WAAU;GAAS,eAAY;GAAS,CAAA;EACtD,OAAO,EAAU,0CAA0C,sBAAsB;EACjF,aAAa,EACX,yCACA,mEACD;EACD,CAAA,EAEQ,CAAA,CACT,EAAA,CAAA;;AAQX,SAAS,GAAkB,EACzB,UACA,iBACA,gBAKC;AACD,QACE,kBAAC,GAAD,EAAA,UAAA,CACE,kBAAC,GAAD,EAAA,UAAA,CACE,kBAAC,GAAD;EAAW,WAAU;YAArB,CACE,kBAAC,GAAD;GAAS,WAAU;GAAS,eAAY;GAAS,CAAA,EAChD,EAAU,mCAAmC,qBAAqB,CACzD;KACZ,kBAAC,GAAD,EAAA,UACG,EACC,yCACA,iEACD,EACe,CAAA,CACP,EAAA,CAAA,EACb,kBAAC,GAAD,EAAA,UACG,EAAM,YACL,kBAAC,GAAD,EAAc,MAAM,GAAK,CAAA,GACvB,EAAM,UACR,kBAAC,GAAD,EAAY,eAAe,EAAM,SAAS,EAAI,CAAA,GAC5C,EAAa,SAAS,IACxB,kBAAC,OAAD;EAAK,WAAU;YACb,kBAAC,GAAD,EAAA,UAAA,CACE,kBAAC,GAAD,EAAA,UACE,kBAAC,GAAD,EAAA,UAAA;GACE,kBAAC,GAAD,EAAA,UAAY,EAAU,kCAAkC,aAAa,EAAa,CAAA;GAClF,kBAAC,GAAD,EAAA,UAAY,EAAU,kCAAkC,OAAO,EAAa,CAAA;GAC5E,kBAAC,GAAD,EAAA,UAAY,EAAU,oCAAoC,SAAS,EAAa,CAAA;GAChF,kBAAC,GAAD;IAAW,WAAU;cAClB,EAAU,sCAAsC,WAAW;IAClD,CAAA;GACZ,kBAAC,GAAD;IAAW,WAAU;cAClB,EAAU,mCAAmC,QAAQ;IAC5C,CAAA;GACZ,kBAAC,GAAD;IAAW,WAAU;cAClB,EAAU,oCAAoC,SAAS;IAC9C,CAAA;GACH,EAAA,CAAA,EACC,CAAA,EACd,kBAAC,GAAD,EAAA,UACG,EAAa,KAAK,MACjB,kBAAC,GAAD,EAAA,UAAA;GACE,kBAAC,GAAD;IAAW,WAAU;cAAqB,EAAW,EAAG,UAAU;IAAa,CAAA;GAC/E,kBAAC,GAAD,EAAA,UACE,kBAAC,GAAD;IAAO,SAAQ;cAAW,EAAG;IAAa,CAAA,EAChC,CAAA;GACZ,kBAAC,GAAD;IAAW,WAAU;cAAqB,EAAG,UAAU;IAAgB,CAAA;GACvE,kBAAC,GAAD;IAAW,WAAU;cAClB,EAAG;IACM,CAAA;GACZ,kBAAC,GAAD;IAAW,WAAU;cAClB,EAAY,EAAG,OAAO,EAAG,SAAS;IACzB,CAAA;GACZ,kBAAC,GAAD;IAAW,WAAU;cAClB,EAAY,EAAG,QAAQ,EAAG,SAAS;IAC1B,CAAA;GACH,EAAA,EAfI,EAAG,GAeP,CACX,EACQ,CAAA,CACN,EAAA,CAAA;EACJ,CAAA,GAEN,kBAAC,GAAD;EACE,MAAM,kBAAC,GAAD;GAAU,WAAU;GAAS,eAAY;GAAS,CAAA;EACxD,OAAO,EAAU,wCAAwC,2BAA2B;EACpF,aAAa,EACX,uCACA,oEACD;EACD,CAAA,EAEQ,CAAA,CACT,EAAA,CAAA"}
|