yamchart 0.9.2 → 0.9.3
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/{advisor-SK2EPAAY.js → advisor-SC64RTZO.js} +11 -11
- package/dist/agent-TZZHNDPK.js +8 -0
- package/dist/{chunk-4P5UHWYK.js → chunk-7CD6UQAV.js} +102 -2
- package/dist/chunk-7CD6UQAV.js.map +1 -0
- package/dist/chunk-7D4SUZUM.js +38 -0
- package/dist/{chunk-EHM6AMMA.js → chunk-EAQXUGP6.js} +65 -2
- package/dist/chunk-EAQXUGP6.js.map +1 -0
- package/dist/{chunk-UDKODFOE.js → chunk-H4L3FNLS.js} +16 -6
- package/dist/chunk-H4L3FNLS.js.map +1 -0
- package/dist/{chunk-OI3EGXVE.js → chunk-NXQ6ZO3V.js} +19 -4
- package/dist/chunk-NXQ6ZO3V.js.map +1 -0
- package/dist/{chunk-65G5DBRO.js → chunk-RM6MNDVF.js} +35 -5
- package/dist/chunk-RM6MNDVF.js.map +1 -0
- package/dist/{chunk-EHYYYKRW.js → chunk-RMIDEBHD.js} +4 -4
- package/dist/{chunk-CWAWATL4.js → chunk-S7YQXEKM.js} +159 -2
- package/dist/chunk-S7YQXEKM.js.map +1 -0
- package/dist/{chunk-ZA6AOQVZ.js → chunk-ZMJPRNOA.js} +2 -2
- package/dist/{compare-ZN6RUOOQ.js → compare-RQFCEZIK.js} +2 -2
- package/dist/{connection-utils-MCJBJEDQ.js → connection-utils-C4FQGBW6.js} +5 -5
- package/dist/{describe-XJ5GXYUE.js → describe-X75C2VDU.js} +7 -7
- package/dist/{dev-PLBVJXT4.js → dev-KDNXUNME.js} +27978 -13314
- package/dist/dev-KDNXUNME.js.map +1 -0
- package/dist/{dist-VNX77VV5.js → dist-JMLAZUL7.js} +9 -3
- package/dist/{dist-7CRX2GIR.js → dist-MNXSMGV6.js} +3 -3
- package/dist/{dist-OCECEAXB.js → dist-MX5K2ABB.js} +3 -3
- package/dist/{dist-JH7OL7U4.js → dist-NGQG7Z4G.js} +7 -3
- package/dist/{generate-KNER36CB.js → generate-B7FAWVIQ.js} +2 -2
- package/dist/index.js +33 -33
- package/dist/{init-GVBYCLJT.js → init-SECXKD5G.js} +2 -2
- package/dist/{lineage-T5NRHHZN.js → lineage-HYO4RKZT.js} +2 -2
- package/dist/{query-2RB75CRI.js → query-QNRDS74I.js} +5 -5
- package/dist/{reset-password-IZQTDTU7.js → reset-password-HDCLH7PZ.js} +3 -3
- package/dist/{rewrite-database-FDJIXKZ2.js → rewrite-database-BOA4QPUR.js} +2 -2
- package/dist/{sample-3UAL7MVU.js → sample-SKLHBZBU.js} +5 -5
- package/dist/{search-ODC4S575.js → search-4KMETZVX.js} +7 -7
- package/dist/{semantic-RAP3S5PQ.js → semantic-6WKELH5V.js} +2 -2
- package/dist/source-resolver-R7WBIL7M.js +18 -0
- package/dist/{sync-dbt-22QQKT3A.js → sync-dbt-72GVO75P.js} +2 -2
- package/dist/{sync-warehouse-QMCT5B4G.js → sync-warehouse-UWRNUXE7.js} +41 -15
- package/dist/sync-warehouse-UWRNUXE7.js.map +1 -0
- package/dist/{tables-QWHUCBRH.js → tables-V65QUGHK.js} +7 -7
- package/dist/templates/default/docs/yamchart-reference.md +74 -9
- package/dist/{test-KX2GETNF.js → test-UE5OWG3E.js} +5 -5
- package/dist/{update-WMATDZTO.js → update-HWCJNQRP.js} +2 -2
- package/package.json +10 -4
- package/dist/agent-KWKPAYT2.js +0 -8
- package/dist/chunk-4P5UHWYK.js.map +0 -1
- package/dist/chunk-65G5DBRO.js.map +0 -1
- package/dist/chunk-CWAWATL4.js.map +0 -1
- package/dist/chunk-DGUM43GV.js +0 -11
- package/dist/chunk-EHM6AMMA.js.map +0 -1
- package/dist/chunk-OI3EGXVE.js.map +0 -1
- package/dist/chunk-UDKODFOE.js.map +0 -1
- package/dist/dev-PLBVJXT4.js.map +0 -1
- package/dist/source-resolver-6QBBNW3P.js +0 -18
- package/dist/sync-warehouse-QMCT5B4G.js.map +0 -1
- /package/dist/{advisor-SK2EPAAY.js.map → advisor-SC64RTZO.js.map} +0 -0
- /package/dist/{agent-KWKPAYT2.js.map → agent-TZZHNDPK.js.map} +0 -0
- /package/dist/{chunk-DGUM43GV.js.map → chunk-7D4SUZUM.js.map} +0 -0
- /package/dist/{chunk-EHYYYKRW.js.map → chunk-RMIDEBHD.js.map} +0 -0
- /package/dist/{chunk-ZA6AOQVZ.js.map → chunk-ZMJPRNOA.js.map} +0 -0
- /package/dist/{compare-ZN6RUOOQ.js.map → compare-RQFCEZIK.js.map} +0 -0
- /package/dist/{connection-utils-MCJBJEDQ.js.map → connection-utils-C4FQGBW6.js.map} +0 -0
- /package/dist/{describe-XJ5GXYUE.js.map → describe-X75C2VDU.js.map} +0 -0
- /package/dist/{dist-JH7OL7U4.js.map → dist-JMLAZUL7.js.map} +0 -0
- /package/dist/{dist-7CRX2GIR.js.map → dist-MNXSMGV6.js.map} +0 -0
- /package/dist/{dist-OCECEAXB.js.map → dist-MX5K2ABB.js.map} +0 -0
- /package/dist/{dist-VNX77VV5.js.map → dist-NGQG7Z4G.js.map} +0 -0
- /package/dist/{generate-KNER36CB.js.map → generate-B7FAWVIQ.js.map} +0 -0
- /package/dist/{init-GVBYCLJT.js.map → init-SECXKD5G.js.map} +0 -0
- /package/dist/{lineage-T5NRHHZN.js.map → lineage-HYO4RKZT.js.map} +0 -0
- /package/dist/{query-2RB75CRI.js.map → query-QNRDS74I.js.map} +0 -0
- /package/dist/{reset-password-IZQTDTU7.js.map → reset-password-HDCLH7PZ.js.map} +0 -0
- /package/dist/{rewrite-database-FDJIXKZ2.js.map → rewrite-database-BOA4QPUR.js.map} +0 -0
- /package/dist/{sample-3UAL7MVU.js.map → sample-SKLHBZBU.js.map} +0 -0
- /package/dist/{search-ODC4S575.js.map → search-4KMETZVX.js.map} +0 -0
- /package/dist/{semantic-RAP3S5PQ.js.map → semantic-6WKELH5V.js.map} +0 -0
- /package/dist/{source-resolver-6QBBNW3P.js.map → source-resolver-R7WBIL7M.js.map} +0 -0
- /package/dist/{sync-dbt-22QQKT3A.js.map → sync-dbt-72GVO75P.js.map} +0 -0
- /package/dist/{tables-QWHUCBRH.js.map → tables-V65QUGHK.js.map} +0 -0
- /package/dist/{test-KX2GETNF.js.map → test-UE5OWG3E.js.map} +0 -0
- /package/dist/{update-WMATDZTO.js.map → update-HWCJNQRP.js.map} +0 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/commands/warehouse-sync.ts","../src/commands/sync-warehouse.ts"],"sourcesContent":["/**\n * Core warehouse sync logic.\n *\n * Pure functions for diffing, grouping, building models, and merging catalogs,\n * plus an async orchestrator (syncWarehouse) that does I/O.\n */\n\nimport { readFile, writeFile, mkdir } from 'fs/promises';\nimport { join } from 'path';\nimport type { Connector } from '@yamchart/query';\nimport type { NormalizedColumnWithTable, NormalizedTable } from './introspection.js';\nimport { getTablesQuery, getColumnsQuery, getDescribeQuery } from './introspection.js';\nimport type { CatalogModel, CatalogData } from '../dbt/catalog.js';\nimport { generateCatalogMd, generateCatalogJson, generateWarehouseSection } from '../dbt/catalog.js';\n\n// ---------------------------------------------------------------------------\n// Interfaces\n// ---------------------------------------------------------------------------\n\nexport interface SyncState {\n syncedAt: string;\n connection: string;\n schemas: string[];\n skipSamples: boolean;\n tables: Record<string, { columnCount: number; lastAltered?: string }>;\n}\n\nexport interface WarehouseTable {\n qualifiedName: string; // \"SCHEMA.TABLE\"\n schema: string;\n name: string;\n type: string; // \"TABLE\" | \"VIEW\"\n columnCount: number;\n}\n\nexport interface SyncDiff {\n newTables: string[];\n changedTables: string[];\n unchangedTables: string[];\n removedTables: string[];\n}\n\nexport interface SyncWarehouseResult {\n tablesTotal: number;\n tablesNew: number;\n tablesChanged: number;\n tablesUnchanged: number;\n tablesRemoved: number;\n errors: string[];\n durationMs: number;\n}\n\nexport interface SyncWarehouseOptions {\n schemas?: string[];\n database?: string;\n skipSamples?: boolean;\n full?: boolean;\n onProgress?: (table: string, index: number, total: number) => void;\n}\n\n// ---------------------------------------------------------------------------\n// Pure functions\n// ---------------------------------------------------------------------------\n\n/**\n * Group a flat column list into a Map keyed by \"SCHEMA.TABLE\".\n */\nexport function groupColumnsByTable(\n columns: NormalizedColumnWithTable[],\n): Map<string, NormalizedColumnWithTable[]> {\n const map = new Map<string, NormalizedColumnWithTable[]>();\n for (const col of columns) {\n const key = `${col.schema}.${col.table}`;\n const existing = map.get(key);\n if (existing) {\n existing.push(col);\n } else {\n map.set(key, [col]);\n }\n }\n return map;\n}\n\n/**\n * Compare current warehouse tables against previous sync state.\n * All tables are \"new\" when prev is null.\n * Detects changed by column count mismatch.\n * Detects removed tables (in prev but not in current).\n */\nexport function diffSyncState(\n current: WarehouseTable[],\n prev: SyncState | null,\n): SyncDiff {\n const newTables: string[] = [];\n const changedTables: string[] = [];\n const unchangedTables: string[] = [];\n const removedTables: string[] = [];\n\n if (!prev) {\n return {\n newTables: current.map((t) => t.qualifiedName),\n changedTables: [],\n unchangedTables: [],\n removedTables: [],\n };\n }\n\n const currentNames = new Set(current.map((t) => t.qualifiedName));\n\n for (const table of current) {\n const prevEntry = prev.tables[table.qualifiedName];\n if (!prevEntry) {\n newTables.push(table.qualifiedName);\n } else if (prevEntry.columnCount !== table.columnCount) {\n changedTables.push(table.qualifiedName);\n } else {\n unchangedTables.push(table.qualifiedName);\n }\n }\n\n // Detect removed tables\n for (const name of Object.keys(prev.tables)) {\n if (!currentNames.has(name)) {\n removedTables.push(name);\n }\n }\n\n return { newTables, changedTables, unchangedTables, removedTables };\n}\n\n/**\n * Build CatalogModel entries from warehouse metadata.\n */\nexport function buildWarehouseModels(\n tables: WarehouseTable[],\n columnMap: Map<string, NormalizedColumnWithTable[]>,\n samples: Record<string, Record<string, unknown>[]>,\n): CatalogModel[] {\n const now = new Date().toISOString();\n\n return tables.map((table) => {\n const cols = columnMap.get(table.qualifiedName) || [];\n const sampleRows = samples[table.qualifiedName];\n\n return {\n name: table.name,\n path: '',\n description: '',\n table: table.qualifiedName,\n tags: ['warehouse'],\n meta: {},\n columns: cols.map((c) => ({\n name: c.name,\n data_type: c.type,\n description: '',\n hints: [],\n })),\n yamchartModels: [],\n source: 'warehouse' as const,\n tableType: table.type as 'TABLE' | 'VIEW',\n ...(sampleRows ? { sampleRows } : {}),\n lastSynced: now,\n };\n });\n}\n\n/**\n * Merge warehouse models into an existing dbt catalog.\n *\n * 1. If no existing catalog, create new with warehouseModels.\n * 2. Remove stale warehouse entries from existing.\n * 3. For tables in both dbt and warehouse (matched by `table` field, case-insensitive):\n * - dbt entry wins (keep it)\n * - Backfill data_type from warehouse columns where missing\n * - Add any warehouse columns that don't exist in the dbt entry\n * 4. Append remaining warehouse-only models.\n * 5. Return updated CatalogData.\n */\nexport function mergeWithDbtCatalog(\n existingCatalog: CatalogData | null,\n warehouseModels: CatalogModel[],\n): CatalogData {\n if (!existingCatalog) {\n return {\n syncedAt: new Date().toISOString(),\n source: { type: 'warehouse' },\n stats: { modelsIncluded: warehouseModels.length, modelsExcluded: 0 },\n models: warehouseModels,\n };\n }\n\n // Build a lookup of warehouse models by normalized table name\n const warehouseByTable = new Map<string, CatalogModel>();\n for (const wm of warehouseModels) {\n if (wm.table) {\n warehouseByTable.set(wm.table.toUpperCase(), wm);\n }\n }\n\n // Track which warehouse models were consumed by dbt merge\n const consumedWarehouseTables = new Set<string>();\n\n // Process existing catalog: keep non-warehouse entries, merge dbt+warehouse matches\n const mergedModels: CatalogModel[] = [];\n\n for (const model of existingCatalog.models) {\n // Remove stale warehouse entries — they'll be replaced by current warehouseModels\n if (model.source === 'warehouse') {\n continue;\n }\n\n // Check if this dbt model matches a warehouse table\n const tableKey = (model.table || '').toUpperCase();\n const warehouseMatch = tableKey ? warehouseByTable.get(tableKey) : undefined;\n\n if (warehouseMatch) {\n // dbt entry wins — backfill data_type and add missing columns\n const warehouseColMap = new Map<string, { data_type?: string; description: string; hints: string[] }>();\n for (const wc of warehouseMatch.columns) {\n warehouseColMap.set(wc.name.toLowerCase(), wc);\n }\n\n // Backfill data_type on existing dbt columns\n const updatedColumns = model.columns.map((col) => {\n const wc = warehouseColMap.get(col.name.toLowerCase());\n if (wc && !col.data_type && wc.data_type) {\n return { ...col, data_type: wc.data_type };\n }\n return col;\n });\n\n // Add warehouse columns not present in dbt entry\n const existingColNames = new Set(model.columns.map((c) => c.name.toLowerCase()));\n for (const wc of warehouseMatch.columns) {\n if (!existingColNames.has(wc.name.toLowerCase())) {\n updatedColumns.push(wc);\n }\n }\n\n mergedModels.push({ ...model, columns: updatedColumns });\n consumedWarehouseTables.add(tableKey);\n } else {\n mergedModels.push(model);\n }\n }\n\n // Append warehouse-only models (not consumed by dbt merge)\n for (const wm of warehouseModels) {\n const tableKey = (wm.table || '').toUpperCase();\n if (!consumedWarehouseTables.has(tableKey)) {\n mergedModels.push(wm);\n }\n }\n\n return {\n ...existingCatalog,\n syncedAt: new Date().toISOString(),\n models: mergedModels,\n };\n}\n\n// ---------------------------------------------------------------------------\n// Async orchestrator\n// ---------------------------------------------------------------------------\n\n/**\n * Main warehouse sync orchestrator.\n *\n * 1. Fetch tables and columns from the warehouse.\n * 2. Diff against previous sync state.\n * 3. Sample new/changed tables (unless skipSamples).\n * 4. Build warehouse CatalogModel entries.\n * 5. Merge with existing catalog, write files.\n */\nexport async function syncWarehouse(\n projectDir: string,\n connector: Connector,\n connectionType: string,\n connectionName: string,\n options?: SyncWarehouseOptions,\n): Promise<SyncWarehouseResult> {\n const start = performance.now();\n const errors: string[] = [];\n\n // 1. Fetch tables\n let normalizedTables: NormalizedTable[] = [];\n\n if (connectionType === 'bigquery') {\n // BigQuery INFORMATION_SCHEMA is dataset-scoped — the dataset must be baked\n // into the query, so we run one query per dataset rather than filtering\n // client-side.\n if (!options?.schemas || options.schemas.length === 0) {\n throw new Error(\n 'BigQuery sync requires a dataset. Pass --schema <dataset> (or set config.dataset).',\n );\n }\n for (const dataset of options.schemas) {\n const q = getTablesQuery(connectionType, { schema: dataset });\n const res = await connector.execute(q.sql);\n normalizedTables.push(...q.normalize(res.rows));\n }\n } else {\n const tablesQuery = getTablesQuery(connectionType, {\n database: options?.database,\n });\n const tablesResult = await connector.execute(tablesQuery.sql);\n normalizedTables = tablesQuery.normalize(tablesResult.rows);\n\n // Filter by schemas if specified\n if (options?.schemas && options.schemas.length > 0) {\n const schemaSet = new Set(options.schemas.map((s) => s.toUpperCase()));\n normalizedTables = normalizedTables.filter((t) => schemaSet.has(t.schema.toUpperCase()));\n }\n }\n\n // 2. Fetch columns\n let allColumns: NormalizedColumnWithTable[] = [];\n\n if (connectionType === 'sqlite') {\n // SQLite: describe each table individually\n for (const table of normalizedTables) {\n try {\n const describeQuery = getDescribeQuery('sqlite', table.name);\n const descResult = await connector.execute(describeQuery.sql);\n const cols = describeQuery.normalize(descResult.rows);\n for (const col of cols) {\n allColumns.push({\n schema: table.schema,\n table: table.name,\n name: col.name,\n type: col.type,\n nullable: col.nullable,\n });\n }\n } catch (err) {\n errors.push(`Failed to describe ${table.name}: ${err instanceof Error ? err.message : String(err)}`);\n }\n }\n } else if (connectionType === 'bigquery') {\n // Dataset-scoped, same as the tables query above.\n for (const dataset of options!.schemas!) {\n const q = getColumnsQuery(connectionType, { schema: dataset });\n const res = await connector.execute(q.sql);\n allColumns.push(...q.normalize(res.rows));\n }\n } else {\n const columnsQuery = getColumnsQuery(connectionType, {\n database: options?.database,\n });\n const columnsResult = await connector.execute(columnsQuery.sql);\n allColumns = columnsQuery.normalize(columnsResult.rows);\n\n // Filter columns by schemas if specified\n if (options?.schemas && options.schemas.length > 0) {\n const schemaSet = new Set(options.schemas.map((s) => s.toUpperCase()));\n allColumns = allColumns.filter((c) => schemaSet.has(c.schema.toUpperCase()));\n }\n }\n\n // Group columns by table\n const columnMap = groupColumnsByTable(allColumns);\n\n // Build WarehouseTable entries with column counts\n const warehouseTables: WarehouseTable[] = normalizedTables.map((t) => {\n const qualifiedName = t.schema ? `${t.schema}.${t.name}` : t.name;\n return {\n qualifiedName,\n schema: t.schema,\n name: t.name,\n type: t.type,\n columnCount: columnMap.get(qualifiedName)?.length || 0,\n };\n });\n\n // 3. Load previous sync state, compute diff\n let prevState: SyncState | null = null;\n if (!options?.full) {\n try {\n const raw = await readFile(join(projectDir, '.yamchart', 'warehouse-sync.json'), 'utf-8');\n prevState = JSON.parse(raw);\n } catch {\n /* no previous state */\n }\n }\n\n const diff = diffSyncState(warehouseTables, prevState);\n\n // 4. Sample new/changed tables (unless skipSamples)\n const samples: Record<string, Record<string, unknown>[]> = {};\n const tablesToSample = options?.skipSamples\n ? []\n : [...diff.newTables, ...diff.changedTables];\n\n for (let i = 0; i < tablesToSample.length; i++) {\n const tableName = tablesToSample[i]!;\n options?.onProgress?.(tableName, i + 1, tablesToSample.length);\n\n try {\n const sampleSql = `SELECT * FROM ${tableName} LIMIT 3`;\n const samplePromise = connector.execute(sampleSql);\n const timeoutPromise = new Promise<never>((_, reject) =>\n setTimeout(() => reject(new Error(`Timeout sampling ${tableName} (5s)`)), 5000),\n );\n const result = await Promise.race([samplePromise, timeoutPromise]);\n samples[tableName] = result.rows;\n } catch (err) {\n errors.push(`Failed to sample ${tableName}: ${err instanceof Error ? err.message : String(err)}`);\n }\n }\n\n // 5. For unchanged tables: carry forward sampleRows from existing catalog\n let existingCatalog: CatalogData | null = null;\n try {\n const raw = await readFile(join(projectDir, '.yamchart', 'catalog.json'), 'utf-8');\n existingCatalog = JSON.parse(raw);\n } catch {\n /* no existing catalog */\n }\n\n if (existingCatalog && !options?.skipSamples) {\n for (const tableName of diff.unchangedTables) {\n const existingModel = existingCatalog.models.find(\n (m) => m.table?.toUpperCase() === tableName.toUpperCase() && m.source === 'warehouse',\n );\n if (existingModel?.sampleRows) {\n samples[tableName] = existingModel.sampleRows;\n }\n }\n }\n\n // 6. Build warehouse CatalogModel entries\n const warehouseModels = buildWarehouseModels(warehouseTables, columnMap, samples);\n\n // 7. Merge with existing catalog, write files\n const merged = mergeWithDbtCatalog(existingCatalog, warehouseModels);\n\n await mkdir(join(projectDir, '.yamchart'), { recursive: true });\n await writeFile(join(projectDir, '.yamchart', 'catalog.json'), generateCatalogJson(merged));\n\n const catalogMd = generateCatalogMd(merged);\n const syncDate = new Date().toISOString().split('T')[0]!;\n const warehouseSection = generateWarehouseSection(merged.models, connectionName, syncDate);\n const fullMd = warehouseSection ? catalogMd + '\\n' + warehouseSection : catalogMd;\n await writeFile(join(projectDir, '.yamchart', 'catalog.md'), fullMd);\n\n // Write sync state\n const syncState: SyncState = {\n syncedAt: new Date().toISOString(),\n connection: connectionName,\n schemas: options?.schemas || [],\n skipSamples: options?.skipSamples || false,\n tables: Object.fromEntries(\n warehouseTables.map((t) => [t.qualifiedName, { columnCount: t.columnCount }]),\n ),\n };\n await writeFile(join(projectDir, '.yamchart', 'warehouse-sync.json'), JSON.stringify(syncState, null, 2));\n\n const durationMs = Math.round(performance.now() - start);\n\n return {\n tablesTotal: warehouseTables.length,\n tablesNew: diff.newTables.length,\n tablesChanged: diff.changedTables.length,\n tablesUnchanged: diff.unchangedTables.length,\n tablesRemoved: diff.removedTables.length,\n errors,\n durationMs,\n };\n}\n","/**\n * CLI handler for `yamchart sync-warehouse`.\n *\n * Thin wrapper: resolves connection, creates connector, delegates to syncWarehouse().\n */\n\nimport * as output from '../utils/output.js';\nimport { resolveConnection, createConnector } from './connection-utils.js';\nimport { syncWarehouse } from './warehouse-sync.js';\nimport { readFile } from 'fs/promises';\nimport { join } from 'path';\nimport type { SyncState } from './warehouse-sync.js';\n\nexport interface SyncWarehouseCliOptions {\n connection?: string;\n schema?: string; // comma-separated → split into array\n database?: string;\n skipSamples?: boolean;\n refresh?: boolean;\n full?: boolean;\n json?: boolean;\n}\n\nexport async function runSyncWarehouse(\n projectDir: string,\n options: SyncWarehouseCliOptions,\n): Promise<void> {\n // Handle --refresh: load saved connection/schemas from previous sync state\n let connectionOverride = options.connection;\n let schemasOverride = options.schema;\n\n if (options.refresh) {\n try {\n const raw = await readFile(join(projectDir, '.yamchart', 'warehouse-sync.json'), 'utf-8');\n const prevState: SyncState = JSON.parse(raw);\n connectionOverride = connectionOverride || prevState.connection;\n if (!schemasOverride && prevState.schemas.length > 0) {\n schemasOverride = prevState.schemas.join(',');\n }\n if (!options.json) {\n output.info(`Re-syncing from ${prevState.connection} (${prevState.schemas.join(', ') || 'all schemas'})`);\n }\n } catch {\n output.error('No previous sync state found. Run sync-warehouse without --refresh first.');\n process.exit(1);\n }\n }\n\n // Resolve connection\n const connection = await resolveConnection(projectDir, connectionOverride);\n const connector = createConnector(connection, projectDir);\n\n let schemas = schemasOverride\n ? schemasOverride.split(',').map((s) => s.trim())\n : undefined;\n\n // BigQuery INFORMATION_SCHEMA is dataset-scoped; fall back to the connection's\n // configured dataset when no --schema is provided.\n if ((!schemas || schemas.length === 0) && connection.type === 'bigquery') {\n const dataset = (connection.config as { dataset?: string }).dataset;\n if (dataset) {\n schemas = [dataset];\n }\n }\n\n const spin = options.json ? null : output.spinner(`Connecting to ${connection.name} ...`);\n\n try {\n await connector.connect();\n\n if (spin) {\n spin.text = 'Fetching table metadata...';\n }\n\n const result = await syncWarehouse(\n projectDir,\n connector,\n connection.type,\n connection.name,\n {\n schemas,\n database: options.database,\n skipSamples: options.skipSamples,\n full: options.full,\n onProgress: spin\n ? (table, index, total) => {\n spin.text = `Sampling tables... ${index}/${total} (${table})`;\n }\n : undefined,\n },\n );\n\n if (spin) {\n spin.stop();\n }\n\n if (options.json) {\n console.log(JSON.stringify(result, null, 2));\n } else {\n const parts = [\n `${result.tablesNew} new`,\n `${result.tablesChanged} changed`,\n `${result.tablesUnchanged} unchanged`,\n ];\n if (result.tablesRemoved > 0) {\n parts.push(`${result.tablesRemoved} removed`);\n }\n output.success(\n `Synced ${result.tablesTotal} tables (${parts.join(', ')}) in ${(result.durationMs / 1000).toFixed(1)}s`,\n );\n output.detail('Written to .yamchart/catalog.json');\n\n if (result.errors.length > 0) {\n output.warning(`${result.errors.length} table(s) had sampling errors:`);\n for (const err of result.errors.slice(0, 5)) {\n output.detail(err);\n }\n if (result.errors.length > 5) {\n output.detail(`... and ${result.errors.length - 5} more`);\n }\n }\n }\n } finally {\n await connector.disconnect();\n }\n}\n"],"mappings":"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","names":["readFile","join"]}
|
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
import {
|
|
2
2
|
resolveTablesSource
|
|
3
|
-
} from "./chunk-
|
|
3
|
+
} from "./chunk-H4L3FNLS.js";
|
|
4
4
|
import "./chunk-VJC24RKT.js";
|
|
5
|
-
import "./chunk-
|
|
6
|
-
import "./chunk-
|
|
7
|
-
import "./chunk-
|
|
8
|
-
import "./chunk-
|
|
5
|
+
import "./chunk-EAQXUGP6.js";
|
|
6
|
+
import "./chunk-NXQ6ZO3V.js";
|
|
7
|
+
import "./chunk-RM6MNDVF.js";
|
|
8
|
+
import "./chunk-S7YQXEKM.js";
|
|
9
9
|
import "./chunk-UND73EOB.js";
|
|
10
|
-
import "./chunk-
|
|
10
|
+
import "./chunk-7D4SUZUM.js";
|
|
11
11
|
|
|
12
12
|
// src/commands/tables.ts
|
|
13
13
|
async function listTables(projectDir, options) {
|
|
@@ -27,4 +27,4 @@ async function listTables(projectDir, options) {
|
|
|
27
27
|
export {
|
|
28
28
|
listTables
|
|
29
29
|
};
|
|
30
|
-
//# sourceMappingURL=tables-
|
|
30
|
+
//# sourceMappingURL=tables-V65QUGHK.js.map
|
|
@@ -705,13 +705,29 @@ config: { account: xy12345, warehouse: COMPUTE_WH, database: ANALYTICS, schema:
|
|
|
705
705
|
auth: { type: env, user_var: SF_USER, password_var: SF_PASSWORD }
|
|
706
706
|
# SSO: auth: { type: externalbrowser, user_var: SF_USER }
|
|
707
707
|
|
|
708
|
+
# BigQuery
|
|
709
|
+
name: warehouse
|
|
710
|
+
type: bigquery
|
|
711
|
+
config:
|
|
712
|
+
project_id: my-gcp-project # required
|
|
713
|
+
dataset: analytics # optional default dataset
|
|
714
|
+
location: US # optional (US | EU | region)
|
|
715
|
+
max_bytes_billed: 1000000000 # optional per-query cost cap (bytes)
|
|
716
|
+
auth:
|
|
717
|
+
type: service_account
|
|
718
|
+
credentials_var: GCP_SERVICE_ACCOUNT_JSON # env var holding the SA key JSON contents
|
|
719
|
+
# or: key_file: ./secrets/sa.json # path to a key file (local dev)
|
|
720
|
+
# or: omit both to use Application Default Credentials (gcloud / workload identity)
|
|
721
|
+
|
|
708
722
|
# SQLite
|
|
709
723
|
name: local-sqlite
|
|
710
724
|
type: sqlite
|
|
711
725
|
path: ./data/app.db
|
|
712
726
|
```
|
|
713
727
|
|
|
714
|
-
**Supported:** DuckDB, PostgreSQL, MySQL, SQLite, Snowflake
|
|
728
|
+
**Supported:** DuckDB, PostgreSQL, MySQL, SQLite, Snowflake, BigQuery
|
|
729
|
+
|
|
730
|
+
BigQuery models must be written in **BigQuery Standard SQL** (e.g. `DATE_TRUNC(d, MONTH)`); yamchart runs model SQL as-is and does not transpile dialects. The CLI introspection commands (`yamchart tables/describe/search`) are dataset-scoped — they use the connection's `dataset` by default, or pass `--schema <dataset>`. `@google-cloud/bigquery` is an optional dependency: install it with `npm install @google-cloud/bigquery`.
|
|
715
731
|
|
|
716
732
|
Use `${ENV_VAR}` for credentials. Never commit secrets.
|
|
717
733
|
|
|
@@ -777,20 +793,32 @@ auth:
|
|
|
777
793
|
session_ttl: "30d" # Optional (default: 30 days)
|
|
778
794
|
providers: # Optional SSO
|
|
779
795
|
google:
|
|
780
|
-
client_id:
|
|
781
|
-
|
|
796
|
+
client_id: "abc.apps.googleusercontent.com" # not secret — safe in git
|
|
797
|
+
client_secret_var: GOOGLE_OAUTH_CLIENT_SECRET # env var NAME holding the secret
|
|
798
|
+
allowed_emails: # invite-only: only these may sign in
|
|
799
|
+
- owner@example.com
|
|
800
|
+
admin_emails: # provisioned as admin (implicitly allowed)
|
|
801
|
+
- owner@example.com
|
|
782
802
|
microsoft:
|
|
783
|
-
client_id:
|
|
784
|
-
|
|
785
|
-
tenant:
|
|
803
|
+
client_id: "..."
|
|
804
|
+
client_secret_var: MS_OAUTH_CLIENT_SECRET
|
|
805
|
+
tenant: "..."
|
|
786
806
|
oidc:
|
|
787
|
-
client_id:
|
|
788
|
-
|
|
807
|
+
client_id: "..."
|
|
808
|
+
client_secret_var: OIDC_OAUTH_CLIENT_SECRET
|
|
789
809
|
issuer: https://auth.example.com
|
|
790
810
|
display_name: "Company SSO"
|
|
791
811
|
```
|
|
792
812
|
|
|
793
|
-
- First visit prompts a setup wizard to create an admin account
|
|
813
|
+
- First visit prompts a setup wizard to create an admin account (password). With
|
|
814
|
+
SSO configured, users can also sign in via the provider.
|
|
815
|
+
- **Secrets:** give the client secret directly via `client_secret`, or name an env
|
|
816
|
+
var with `client_secret_var` so the secret stays out of git. Redirect URI is
|
|
817
|
+
`<BASE_URL>/api/auth/sso/<provider>/callback`.
|
|
818
|
+
- **Invite-only:** if `allowed_emails` is set, only those addresses may sign in via
|
|
819
|
+
SSO — anyone else is rejected, not auto-provisioned. Without it, any authenticated
|
|
820
|
+
account is auto-provisioned as a viewer. `admin_emails` are provisioned as admin
|
|
821
|
+
and are always allowed.
|
|
794
822
|
- **Roles:** admin (manage users + content), editor (content only), viewer (read-only)
|
|
795
823
|
- **User attributes:** Admins can set key-value pairs per user (e.g. `department: Sales`) for row-level security
|
|
796
824
|
- **RLS in SQL:** `{{ user.email }}`, `{{ user.role }}`, `{{ user.department }}` etc.
|
|
@@ -1232,3 +1260,40 @@ models: # optional - restrict accessible models
|
|
|
1232
1260
|
| `.2%` | 12.34% | Percentages |
|
|
1233
1261
|
| `.2s` | 1.2M | SI prefix |
|
|
1234
1262
|
| `.2f` | 1.23 | Fixed decimals |
|
|
1263
|
+
|
|
1264
|
+
## MCP server (experimental)
|
|
1265
|
+
|
|
1266
|
+
When the server is running, an MCP endpoint is available at `POST /mcp`
|
|
1267
|
+
(Streamable HTTP). It exposes tools for LLM clients to explore and query your
|
|
1268
|
+
data: `list_charts`, `list_models`, `run_model`, `run_sql`, `list_tables`,
|
|
1269
|
+
`describe_table`, `sample_table`, `visualize` (returns a chart image), and
|
|
1270
|
+
`save_chart` (editor/admin only). The endpoint runs as the authenticated
|
|
1271
|
+
yamchart user: role gating applies (only editor/admin can `save_chart`), and
|
|
1272
|
+
row-level security applies to governed queries via `run_model` (the user context
|
|
1273
|
+
is passed to the model's Jinja templating). Note that `run_sql` executes raw
|
|
1274
|
+
ad-hoc SQL **without** RLS filtering — it reads whatever the connection can
|
|
1275
|
+
access, so only grant MCP access to users you trust with direct read access to
|
|
1276
|
+
the warehouse.
|
|
1277
|
+
|
|
1278
|
+
### Interactive chart embeds
|
|
1279
|
+
|
|
1280
|
+
The `visualize` tool returns an **interactive chart** (live ECharts: hover, tooltip,
|
|
1281
|
+
zoom) for clients that support MCP Apps — Claude (web/desktop/mobile) and ChatGPT
|
|
1282
|
+
(Apps SDK) — alongside a **static PNG image** that always renders as a fallback.
|
|
1283
|
+
The chart is delivered as a `ui://yamchart/chart` resource plus `structuredContent`;
|
|
1284
|
+
ECharts loads from a CDN, so a client that blocks external scripts will show the
|
|
1285
|
+
PNG instead. Interactive rendering depends on the client's MCP Apps support, which
|
|
1286
|
+
is still stabilizing in some clients — the image guarantees a visual everywhere.
|
|
1287
|
+
|
|
1288
|
+
### Connecting ChatGPT / Claude (OAuth)
|
|
1289
|
+
|
|
1290
|
+
When local auth is enabled (`auth.enabled: true`), the MCP endpoint is protected
|
|
1291
|
+
by OAuth 2.1. Add yamchart as a custom connector in your client using the base
|
|
1292
|
+
URL of your yamchart server; the client discovers the endpoints via
|
|
1293
|
+
`/.well-known/oauth-protected-resource` and `/.well-known/oauth-authorization-server`,
|
|
1294
|
+
registers itself automatically (dynamic client registration), and opens a
|
|
1295
|
+
yamchart login + consent page. After you approve, the client receives a token
|
|
1296
|
+
and operates as your yamchart user — your role and row-level security apply
|
|
1297
|
+
(remember: `run_sql` runs raw SQL without RLS; only grant MCP access to trusted
|
|
1298
|
+
users). Set `BASE_URL` (or `defaults.base_url`) so the OAuth metadata advertises
|
|
1299
|
+
correct absolute URLs.
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import {
|
|
2
2
|
createConnector,
|
|
3
3
|
resolveConnection
|
|
4
|
-
} from "./chunk-
|
|
4
|
+
} from "./chunk-NXQ6ZO3V.js";
|
|
5
5
|
import {
|
|
6
6
|
detail,
|
|
7
7
|
error,
|
|
@@ -10,7 +10,7 @@ import {
|
|
|
10
10
|
success,
|
|
11
11
|
warning
|
|
12
12
|
} from "./chunk-HJVVHYVN.js";
|
|
13
|
-
import "./chunk-
|
|
13
|
+
import "./chunk-RM6MNDVF.js";
|
|
14
14
|
import {
|
|
15
15
|
createTemplateContext,
|
|
16
16
|
expandDatePreset,
|
|
@@ -19,9 +19,9 @@ import {
|
|
|
19
19
|
renderTemplate,
|
|
20
20
|
resolveDynamicDefault,
|
|
21
21
|
runAll
|
|
22
|
-
} from "./chunk-
|
|
22
|
+
} from "./chunk-S7YQXEKM.js";
|
|
23
23
|
import "./chunk-UND73EOB.js";
|
|
24
|
-
import "./chunk-
|
|
24
|
+
import "./chunk-7D4SUZUM.js";
|
|
25
25
|
|
|
26
26
|
// src/commands/test.ts
|
|
27
27
|
import { readFile, readdir } from "fs/promises";
|
|
@@ -180,4 +180,4 @@ export {
|
|
|
180
180
|
formatTestOutput,
|
|
181
181
|
testProject
|
|
182
182
|
};
|
|
183
|
-
//# sourceMappingURL=test-
|
|
183
|
+
//# sourceMappingURL=test-UE5OWG3E.js.map
|
|
@@ -11,7 +11,7 @@ import {
|
|
|
11
11
|
spinner,
|
|
12
12
|
success
|
|
13
13
|
} from "./chunk-HJVVHYVN.js";
|
|
14
|
-
import "./chunk-
|
|
14
|
+
import "./chunk-7D4SUZUM.js";
|
|
15
15
|
|
|
16
16
|
// src/commands/update.ts
|
|
17
17
|
import { execSync } from "child_process";
|
|
@@ -217,4 +217,4 @@ export {
|
|
|
217
217
|
refreshSkills,
|
|
218
218
|
runUpdate
|
|
219
219
|
};
|
|
220
|
-
//# sourceMappingURL=update-
|
|
220
|
+
//# sourceMappingURL=update-HWCJNQRP.js.map
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "yamchart",
|
|
3
|
-
"version": "0.9.
|
|
3
|
+
"version": "0.9.3",
|
|
4
4
|
"description": "Git-native business intelligence dashboards",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"license": "MIT",
|
|
@@ -36,8 +36,12 @@
|
|
|
36
36
|
"@anthropic-ai/sdk": "^0.39.0",
|
|
37
37
|
"@fastify/cookie": "^11.0.0",
|
|
38
38
|
"@fastify/cors": "^10.0.0",
|
|
39
|
+
"@fastify/formbody": "^8.0.0",
|
|
39
40
|
"@fastify/static": "^8.0.0",
|
|
40
41
|
"@inquirer/prompts": "^8.2.0",
|
|
42
|
+
"@mcp-ui/server": "^6.1.0",
|
|
43
|
+
"@modelcontextprotocol/ext-apps": "^0.3.1",
|
|
44
|
+
"@resvg/resvg-js": "^2.6.2",
|
|
41
45
|
"bcryptjs": "^2.4.3",
|
|
42
46
|
"better-sqlite3": "^12.6.0",
|
|
43
47
|
"chokidar": "^4.0.0",
|
|
@@ -45,6 +49,7 @@
|
|
|
45
49
|
"date-fns": "^4.1.0",
|
|
46
50
|
"dotenv": "^16.4.0",
|
|
47
51
|
"duckdb": "^1.1.0",
|
|
52
|
+
"echarts": "^5.5.0",
|
|
48
53
|
"fast-glob": "^3.3.3",
|
|
49
54
|
"fastify": "^5.2.0",
|
|
50
55
|
"lru-cache": "^11.0.0",
|
|
@@ -61,17 +66,18 @@
|
|
|
61
66
|
},
|
|
62
67
|
"devDependencies": {
|
|
63
68
|
"@types/node": "^22.0.0",
|
|
69
|
+
"@google-cloud/bigquery": "^8.3.1",
|
|
64
70
|
"snowflake-sdk": "^2.3.4",
|
|
65
71
|
"tsup": "^8.0.0",
|
|
66
72
|
"typescript": "^5.7.0",
|
|
67
73
|
"vitest": "^2.1.0",
|
|
68
74
|
"@yamchart/auth-local": "0.1.0",
|
|
69
|
-
"@yamchart/
|
|
75
|
+
"@yamchart/query": "0.1.2",
|
|
70
76
|
"@yamchart/config": "0.1.2",
|
|
77
|
+
"@yamchart/schema": "0.1.2",
|
|
71
78
|
"@yamchart/advisor": "0.1.0",
|
|
72
|
-
"@yamchart/query": "0.1.2",
|
|
73
79
|
"@yamchart/server": "0.1.2",
|
|
74
|
-
"@yamchart/
|
|
80
|
+
"@yamchart/chat": "0.1.0"
|
|
75
81
|
},
|
|
76
82
|
"files": [
|
|
77
83
|
"dist",
|
package/dist/agent-KWKPAYT2.js
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../packages/auth-local/src/passwords.ts","../../../packages/auth-local/src/database.ts","../../../packages/auth-local/src/sessions.ts"],"sourcesContent":["import bcrypt from 'bcryptjs';\n\nconst SALT_ROUNDS = 12;\n\nexport async function hashPassword(password: string): Promise<string> {\n return bcrypt.hash(password, SALT_ROUNDS);\n}\n\nexport async function verifyPassword(password: string, hash: string): Promise<boolean> {\n return bcrypt.compare(password, hash);\n}\n","import Database from 'better-sqlite3';\nimport { randomBytes } from 'crypto';\nimport { v4 as uuidv4 } from 'uuid';\nimport type { LocalUser, SafeUser, Role, Provider, Session, ShareLink, CreateShareLinkInput } from './types.js';\n\nconst SCHEMA_SQL = `\nCREATE TABLE IF NOT EXISTS users (\n id TEXT PRIMARY KEY,\n email TEXT UNIQUE NOT NULL,\n name TEXT NOT NULL,\n password_hash TEXT,\n role TEXT NOT NULL DEFAULT 'viewer',\n provider TEXT NOT NULL DEFAULT 'local',\n external_id TEXT,\n created_at TEXT NOT NULL,\n updated_at TEXT NOT NULL,\n UNIQUE(provider, external_id)\n);\n\nCREATE TABLE IF NOT EXISTS sessions (\n id TEXT PRIMARY KEY,\n user_id TEXT NOT NULL REFERENCES users(id) ON DELETE CASCADE,\n expires_at TEXT NOT NULL,\n created_at TEXT NOT NULL\n);\n\nCREATE TABLE IF NOT EXISTS password_reset_tokens (\n id TEXT PRIMARY KEY,\n user_id TEXT NOT NULL REFERENCES users(id) ON DELETE CASCADE,\n token TEXT UNIQUE NOT NULL,\n expires_at TEXT NOT NULL,\n used INTEGER NOT NULL DEFAULT 0\n);\n\nCREATE TABLE IF NOT EXISTS share_links (\n id TEXT PRIMARY KEY,\n token TEXT UNIQUE NOT NULL,\n resource_type TEXT NOT NULL,\n resource_name TEXT NOT NULL,\n created_by TEXT NOT NULL,\n created_at TEXT NOT NULL,\n expires_at TEXT,\n is_active INTEGER NOT NULL DEFAULT 1\n);\n`;\n\nexport interface CreateUserInput {\n email: string;\n name: string;\n password_hash: string | null;\n role: Role;\n provider?: Provider;\n external_id?: string | null;\n}\n\nexport interface UpdateUserInput {\n name?: string;\n role?: Role;\n password_hash?: string;\n}\n\nfunction toSafeUser(user: LocalUser): SafeUser {\n return {\n id: user.id,\n email: user.email,\n name: user.name,\n role: user.role,\n provider: user.provider,\n attributes: user.attributes,\n created_at: user.created_at,\n updated_at: user.updated_at,\n };\n}\n\nexport class AuthDatabase {\n private db: Database.Database;\n\n constructor(dbPath: string) {\n this.db = new Database(dbPath);\n this.db.pragma('journal_mode = WAL');\n this.db.pragma('foreign_keys = ON');\n this.db.exec(SCHEMA_SQL);\n\n // Migrate: add attributes column if missing\n try {\n this.db.prepare(\"SELECT attributes FROM users LIMIT 0\").get();\n } catch {\n this.db.exec(\"ALTER TABLE users ADD COLUMN attributes TEXT NOT NULL DEFAULT '{}'\");\n }\n }\n\n close(): void {\n this.db.close();\n }\n\n needsSetup(): boolean {\n return this.getUserCount() === 0;\n }\n\n getUserCount(): number {\n const row = this.db.prepare('SELECT COUNT(*) as count FROM users').get() as { count: number };\n return row.count;\n }\n\n private getAdminCount(): number {\n const row = this.db.prepare(\"SELECT COUNT(*) as count FROM users WHERE role = 'admin'\").get() as { count: number };\n return row.count;\n }\n\n createUser(input: CreateUserInput): SafeUser {\n const id = uuidv4();\n const now = new Date().toISOString();\n\n this.db.prepare(`\n INSERT INTO users (id, email, name, password_hash, role, provider, external_id, created_at, updated_at)\n VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)\n `).run(\n id,\n input.email,\n input.name,\n input.password_hash,\n input.role,\n input.provider ?? 'local',\n input.external_id ?? null,\n now,\n now,\n );\n\n return this.getUserById(id)! as SafeUser;\n }\n\n getUserById(id: string): LocalUser | null {\n return (this.db.prepare('SELECT * FROM users WHERE id = ?').get(id) as LocalUser) ?? null;\n }\n\n getUserByEmail(email: string): LocalUser | null {\n return (this.db.prepare('SELECT * FROM users WHERE email = ?').get(email) as LocalUser) ?? null;\n }\n\n listUsers(): SafeUser[] {\n const users = this.db.prepare('SELECT * FROM users ORDER BY created_at ASC').all() as LocalUser[];\n return users.map(toSafeUser);\n }\n\n updateUser(id: string, input: UpdateUserInput): void {\n // Guard: prevent changing last admin's role\n if (input.role && input.role !== 'admin') {\n const user = this.getUserById(id);\n if (user && user.role === 'admin' && this.getAdminCount() === 1) {\n throw new Error('Cannot change role of last admin user');\n }\n }\n\n const sets: string[] = [];\n const values: unknown[] = [];\n\n if (input.name !== undefined) { sets.push('name = ?'); values.push(input.name); }\n if (input.role !== undefined) { sets.push('role = ?'); values.push(input.role); }\n if (input.password_hash !== undefined) { sets.push('password_hash = ?'); values.push(input.password_hash); }\n\n if (sets.length === 0) return;\n\n sets.push('updated_at = ?');\n values.push(new Date().toISOString());\n values.push(id);\n\n this.db.prepare(`UPDATE users SET ${sets.join(', ')} WHERE id = ?`).run(...values);\n }\n\n deleteUser(id: string): void {\n const user = this.getUserById(id);\n if (user && user.role === 'admin' && this.getAdminCount() === 1) {\n throw new Error('Cannot delete last admin user');\n }\n this.db.prepare('DELETE FROM users WHERE id = ?').run(id);\n }\n\n createSession(token: string, userId: string, ttlMs: number): void {\n const now = new Date();\n const expiresAt = new Date(now.getTime() + ttlMs);\n\n this.db.prepare(`\n INSERT INTO sessions (id, user_id, expires_at, created_at)\n VALUES (?, ?, ?, ?)\n `).run(token, userId, expiresAt.toISOString(), now.toISOString());\n }\n\n validateSession(token: string): Session | null {\n const session = this.db.prepare(\n 'SELECT * FROM sessions WHERE id = ? AND expires_at > ?'\n ).get(token, new Date().toISOString()) as Session | undefined;\n\n return session ?? null;\n }\n\n deleteSession(token: string): void {\n this.db.prepare('DELETE FROM sessions WHERE id = ?').run(token);\n }\n\n deleteUserSessions(userId: string): void {\n this.db.prepare('DELETE FROM sessions WHERE user_id = ?').run(userId);\n }\n\n purgeExpiredSessions(): number {\n const result = this.db.prepare(\n 'DELETE FROM sessions WHERE expires_at <= ?'\n ).run(new Date().toISOString());\n return result.changes;\n }\n\n getUserByProviderAndExternalId(provider: string, externalId: string): LocalUser | null {\n return (this.db.prepare(\n 'SELECT * FROM users WHERE provider = ? AND external_id = ?'\n ).get(provider, externalId) as LocalUser) ?? null;\n }\n\n // --- User Attributes ---\n\n getUserAttributes(id: string): Record<string, string> {\n const row = this.db.prepare('SELECT attributes FROM users WHERE id = ?').get(id) as { attributes: string } | undefined;\n if (!row) return {};\n try {\n return JSON.parse(row.attributes);\n } catch {\n return {};\n }\n }\n\n updateUserAttributes(id: string, attributes: Record<string, string>): void {\n this.db.prepare('UPDATE users SET attributes = ?, updated_at = ? WHERE id = ?')\n .run(JSON.stringify(attributes), new Date().toISOString(), id);\n }\n\n // --- Share Links ---\n\n createShareLink(input: CreateShareLinkInput): ShareLink {\n const id = uuidv4();\n const token = randomBytes(32).toString('hex');\n const now = new Date().toISOString();\n\n this.db.prepare(`\n INSERT INTO share_links (id, token, resource_type, resource_name, created_by, created_at, expires_at, is_active)\n VALUES (?, ?, ?, ?, ?, ?, ?, 1)\n `).run(id, token, input.resourceType, input.resourceName, input.createdBy, now, input.expiresAt ?? null);\n\n return this.db.prepare('SELECT * FROM share_links WHERE id = ?').get(id) as ShareLink;\n }\n\n getShareLinkByToken(token: string): ShareLink | null {\n const now = new Date().toISOString();\n const link = this.db.prepare(\n 'SELECT * FROM share_links WHERE token = ? AND is_active = 1 AND (expires_at IS NULL OR expires_at > ?)'\n ).get(token, now) as ShareLink | undefined;\n return link ?? null;\n }\n\n listShareLinks(createdBy?: string): ShareLink[] {\n if (createdBy) {\n return this.db.prepare(\n 'SELECT * FROM share_links WHERE created_by = ? AND is_active = 1 ORDER BY created_at DESC'\n ).all(createdBy) as ShareLink[];\n }\n return this.db.prepare(\n 'SELECT * FROM share_links WHERE is_active = 1 ORDER BY created_at DESC'\n ).all() as ShareLink[];\n }\n\n revokeShareLink(id: string): void {\n this.db.prepare('UPDATE share_links SET is_active = 0 WHERE id = ?').run(id);\n }\n\n deleteShareLink(id: string): void {\n this.db.prepare('DELETE FROM share_links WHERE id = ?').run(id);\n }\n}\n","import { randomBytes } from 'crypto';\n\nexport function generateSessionToken(): string {\n return randomBytes(32).toString('hex');\n}\n\nconst DEFAULT_TTL_MS = 30 * 24 * 60 * 60 * 1000; // 30 days\n\nexport function parseTtl(ttl: string): number {\n const match = ttl.match(/^(\\d+)(d|h|m)$/);\n if (!match || !match[1] || !match[2]) return DEFAULT_TTL_MS;\n\n const value = parseInt(match[1], 10);\n switch (match[2]) {\n case 'd': return value * 24 * 60 * 60 * 1000;\n case 'h': return value * 60 * 60 * 1000;\n case 'm': return value * 60 * 1000;\n default: return DEFAULT_TTL_MS;\n }\n}\n"],"mappings":"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","names":["randomBytes"]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../packages/schema/src/connection.ts","../../../packages/schema/src/chart.ts","../../../packages/schema/src/project.ts","../../../packages/schema/src/semantic.ts","../../../packages/schema/src/model.ts","../../../packages/schema/src/dashboard.ts","../../../packages/schema/src/schedule.ts","../../../packages/schema/src/events.ts","../../../packages/schema/src/agent.ts","../../../packages/schema/src/index.ts"],"sourcesContent":["import { z } from 'zod';\n\n// Auth configuration for connections\nconst EnvAuthSchema = z.object({\n type: z.literal('env'),\n user_var: z.string(),\n password_var: z.string(),\n});\n\nconst KeyPairAuthSchema = z.object({\n type: z.literal('key_pair'),\n user_var: z.string(),\n private_key_path: z.string(),\n});\n\nconst SecretManagerAuthSchema = z.object({\n type: z.literal('secret_manager'),\n provider: z.enum(['aws_secrets_manager', 'gcp_secret_manager', 'vault']),\n secret_id: z.string(),\n});\n\nconst ExternalBrowserAuthSchema = z.object({\n type: z.literal('externalbrowser'),\n user_var: z.string(),\n cache_token: z.boolean().optional(),\n});\n\nconst AuthSchema = z.discriminatedUnion('type', [\n EnvAuthSchema,\n KeyPairAuthSchema,\n SecretManagerAuthSchema,\n ExternalBrowserAuthSchema,\n]);\n\n// Connection pool configuration\nconst PoolConfigSchema = z.object({\n min_connections: z.number().int().positive().optional(),\n max_connections: z.number().int().positive().optional(),\n idle_timeout: z.number().int().positive().optional(),\n});\n\n// Query settings\nconst QueryConfigSchema = z.object({\n timeout: z.number().int().positive().optional(),\n max_rows: z.number().int().positive().optional(),\n});\n\n// DuckDB-specific config\nconst DuckDBConfigSchema = z.object({\n path: z.string(), // file path or :memory:\n});\n\n// Postgres-specific config\nconst PostgresConfigSchema = z.object({\n host: z.string(),\n port: z.number().int().positive().default(5432),\n database: z.string(),\n schema: z.string().optional(),\n ssl: z.boolean().optional(),\n});\n\n// Snowflake-specific config\nconst SnowflakeConfigSchema = z.object({\n account: z.string(),\n warehouse: z.string(),\n database: z.string(),\n schema: z.string().optional(),\n role: z.string().optional(),\n});\n\n// MySQL-specific config\nconst MySQLConfigSchema = z.object({\n host: z.string(),\n port: z.number().int().positive().default(3306),\n database: z.string(),\n ssl: z.boolean().optional(),\n});\n\n// SQLite-specific config\nconst SQLiteConfigSchema = z.object({\n path: z.string(), // file path or :memory:\n});\n\n// Base connection schema\nconst BaseConnectionSchema = z.object({\n name: z.string().min(1),\n description: z.string().optional(),\n pool: PoolConfigSchema.optional(),\n query: QueryConfigSchema.optional(),\n});\n\n// Type-specific connection schemas\nconst DuckDBConnectionSchema = BaseConnectionSchema.extend({\n type: z.literal('duckdb'),\n config: DuckDBConfigSchema,\n auth: z.undefined().optional(),\n});\n\nconst PostgresConnectionSchema = BaseConnectionSchema.extend({\n type: z.literal('postgres'),\n config: PostgresConfigSchema,\n auth: AuthSchema.optional(),\n});\n\nconst SnowflakeConnectionSchema = BaseConnectionSchema.extend({\n type: z.literal('snowflake'),\n config: SnowflakeConfigSchema,\n auth: AuthSchema,\n});\n\nconst MySQLConnectionSchema = BaseConnectionSchema.extend({\n type: z.literal('mysql'),\n config: MySQLConfigSchema,\n auth: AuthSchema.optional(),\n});\n\nconst SQLiteConnectionSchema = BaseConnectionSchema.extend({\n type: z.literal('sqlite'),\n config: SQLiteConfigSchema,\n auth: z.undefined().optional(),\n});\n\n// Union of all connection types\nexport const ConnectionSchema = z.discriminatedUnion('type', [\n DuckDBConnectionSchema,\n PostgresConnectionSchema,\n SnowflakeConnectionSchema,\n MySQLConnectionSchema,\n SQLiteConnectionSchema,\n]);\n\nexport type Connection = z.infer<typeof ConnectionSchema>;\nexport type DuckDBConnection = z.infer<typeof DuckDBConnectionSchema>;\nexport type PostgresConnection = z.infer<typeof PostgresConnectionSchema>;\nexport type SnowflakeConnection = z.infer<typeof SnowflakeConnectionSchema>;\nexport type MySQLConnection = z.infer<typeof MySQLConnectionSchema>;\nexport type SQLiteConnection = z.infer<typeof SQLiteConnectionSchema>;\n","import { z } from 'zod';\n\n// Axis types\nconst AxisTypeSchema = z.enum(['temporal', 'quantitative', 'ordinal', 'nominal']);\n\n// Axis configuration\nconst AxisSchema = z.object({\n field: z.string().min(1),\n type: AxisTypeSchema,\n format: z.string().optional(),\n label: z.string().optional(),\n scale: z.enum(['linear', 'log']).optional(),\n});\n\n// Chart types supported (scatter has its own dedicated schema)\nconst ChartTypeSchema = z.enum([\n 'line',\n 'bar',\n 'area',\n 'pie',\n 'donut',\n 'table',\n 'metric',\n 'map',\n 'heatmap',\n 'funnel',\n 'sankey',\n 'treemap',\n 'waterfall',\n 'gauge',\n]);\n\n// Gradient configuration - boolean shorthand or explicit from/to\nconst GradientSchema = z.union([\n z.boolean(),\n z.object({\n from: z.string(),\n to: z.string(),\n }),\n]);\n\n// Long format series: group by a field in the data (one row per series value)\nconst LongFormatSeriesSchema = z.object({\n field: z.string().min(1),\n colors: z.record(z.string(), z.string()).optional(),\n});\n\n// Series transform: compute derived values client-side\nconst SeriesTransformSchema = z.object({\n type: z.enum(['rolling_average']),\n window: z.number().int().positive(),\n});\n\n// Wide format column: each column becomes a separate series\nconst WideFormatColumnSchema = z.object({\n field: z.string().min(1),\n name: z.string().optional(),\n type: z.enum(['line', 'bar', 'area']).optional(),\n axis: z.enum(['left', 'right']).optional(),\n color: z.string().optional(),\n style: z.enum(['solid', 'dashed', 'dotted']).optional(),\n opacity: z.number().min(0).max(1).optional(),\n gradient: GradientSchema.optional(),\n transform: SeriesTransformSchema.optional(),\n band: z.string().optional(), // Pair with another column to render as shaded range band\n});\n\n// Wide format series: explicit list of columns\nconst WideFormatSeriesSchema = z.object({\n columns: z.array(WideFormatColumnSchema).min(1),\n});\n\n// Series config is either long format (group by field) or wide format (explicit columns)\nconst SeriesConfigSchema = z.union([\n LongFormatSeriesSchema,\n WideFormatSeriesSchema,\n]);\n\n// Color condition for conditional coloring\nconst ColorConditionSchema = z.object({\n when: z.string(),\n color: z.string(),\n});\n\n// Conditional color configuration\nconst ConditionalColorSchema = z.object({\n conditions: z.array(ColorConditionSchema).min(1),\n default: z.string().optional(),\n});\n\n// Color - either a simple string or conditional config\nconst ColorSchema = z.union([\n z.string(),\n ConditionalColorSchema,\n]);\n\n// Legend configuration\nconst LegendSchema = z.object({\n show: z.boolean().optional(),\n position: z.enum(['top', 'bottom', 'left', 'right']).optional(),\n});\n\n// Annotation configuration\nconst LineAnnotationSchema = z.object({\n type: z.literal('line'),\n value: z.number(),\n label: z.string().optional(),\n color: z.string().optional(),\n style: z.enum(['solid', 'dashed', 'dotted']).optional(),\n});\n\nconst BandAnnotationSchema = z.object({\n type: z.literal('band'),\n from: z.number(),\n to: z.number(),\n label: z.string().optional(),\n color: z.string().optional(),\n});\n\nconst XLineAnnotationSchema = z.object({\n type: z.literal('x_line'),\n x: z.string(), // x-axis value (date string or category)\n label: z.string().optional(),\n color: z.string().optional(),\n style: z.enum(['solid', 'dashed', 'dotted']).optional(),\n});\n\nconst AnnotationSchema = z.discriminatedUnion('type', [\n LineAnnotationSchema,\n BandAnnotationSchema,\n XLineAnnotationSchema,\n]);\n\n// Goal zone configuration (tolerance band around target)\nconst GoalZoneSchema = z.object({\n tolerance: z.number().min(0).max(1),\n});\n\n// Goal line style\nconst GoalStyleSchema = z.enum(['solid', 'dashed', 'dotted']);\n\n// Fixed goal — constant horizontal target line\nconst FixedGoalSchema = z.object({\n type: z.literal('fixed'),\n value: z.number(),\n label: z.string().optional(),\n color: z.string().optional(),\n style: GoalStyleSchema.optional(),\n zone: GoalZoneSchema.optional(),\n});\n\n// Cumulative goal — target value to reach by a deadline\nconst CumulativeGoalSchema = z.object({\n type: z.literal('cumulative'),\n value: z.number(),\n by: z.string().min(1),\n from: z.string().optional(),\n label: z.string().optional(),\n color: z.string().optional(),\n style: GoalStyleSchema.optional(),\n zone: GoalZoneSchema.optional(),\n});\n\n// Source for model-driven goals\nconst GoalSourceSchema = z.object({\n model: z.string().min(1),\n value_field: z.string().min(1),\n date_field: z.string().optional(),\n});\n\n// Model-driven goal — target values from a SQL model\nconst ModelGoalSchema = z.object({\n type: z.literal('model'),\n source: GoalSourceSchema,\n label: z.string().optional(),\n color: z.string().optional(),\n style: GoalStyleSchema.optional(),\n zone: GoalZoneSchema.optional(),\n});\n\n// Goal discriminated union (for line/bar/area/combo charts)\nconst GoalSchema = z.discriminatedUnion('type', [\n FixedGoalSchema,\n CumulativeGoalSchema,\n ModelGoalSchema,\n]);\n\n// KPI/Gauge goal — simple target value with optional progress display\nconst KpiGoalSchema = z.object({\n value: z.number(),\n label: z.string().optional(),\n show_progress: z.boolean().optional(),\n color: z.string().optional(),\n});\n\n// Interactivity options\nconst InteractionsSchema = z.object({\n tooltip: z.boolean().default(true),\n zoom: z.boolean().default(false),\n brush: z.boolean().default(false),\n});\n\n// KPI format types\nconst KpiFormatSchema = z.object({\n type: z.enum(['number', 'currency', 'percent']),\n currency: z.string().optional(), // e.g., 'USD', 'EUR'\n decimals: z.number().optional(),\n});\n\n// KPI comparison configuration\nconst KpiComparisonSchema = z.object({\n enabled: z.boolean(),\n field: z.string().min(1).optional(),\n period: z.enum(['previous']).optional(),\n label: z.string().optional(),\n type: z.enum(['percent_change', 'absolute']),\n}).refine(\n (data) => !(data.field && data.period),\n { message: 'Cannot set both field and period — use one or the other' }\n).refine(\n (data) => data.field || data.period,\n { message: 'Must set either field or period for comparison' }\n);\n\n// KPI value configuration\nconst KpiValueSchema = z.object({\n field: z.string().min(1),\n});\n\n// KPI-specific config\nconst KpiConfigSchema = z.object({\n type: z.literal('kpi'),\n value: KpiValueSchema,\n format: KpiFormatSchema,\n comparison: KpiComparisonSchema.optional(),\n unit: z.string().optional(), // e.g., 'min', 'sessions', 'users'\n goal: KpiGoalSchema.optional(),\n});\n\n// Center value for donut charts\nconst CenterValueSchema = z.object({\n field: z.string().optional(), // 'total' for sum, or specific field\n label: z.string().optional(),\n format: z.string().optional(),\n});\n\n// Period comparison overlay\nconst CompareSchema = z.object({\n period: z.string(), // previous_week, previous_month, previous_year, or a preset name\n label: z.string().optional(),\n style: z.enum(['solid', 'dashed', 'dotted']).optional(),\n opacity: z.number().min(0).max(1).optional(),\n color: z.string().optional(),\n});\n\n// Standard chart config (existing)\nconst StandardChartConfigSchema = z.object({\n type: ChartTypeSchema,\n x: AxisSchema,\n y: AxisSchema.optional(),\n series: SeriesConfigSchema.optional(),\n stacking: z.enum(['stacked', 'percent']).optional(),\n orientation: z.enum(['vertical', 'horizontal']).optional(),\n color: ColorSchema.optional(),\n gradient: GradientSchema.optional(),\n legend: LegendSchema.optional(),\n annotations: z.array(AnnotationSchema).optional(),\n compare: z.array(CompareSchema).optional(),\n interactions: InteractionsSchema.optional(),\n centerValue: CenterValueSchema.optional(), // For donut charts\n goals: z.array(GoalSchema).optional(),\n});\n\n// Dual axis config for combo charts (label + format, not data field references)\nconst DualAxisConfigSchema = z.object({\n label: z.string().optional(),\n format: z.string().optional(),\n scale: z.enum(['linear', 'log']).optional(),\n});\n\nconst DualAxesSchema = z.object({\n left: DualAxisConfigSchema.optional(),\n right: DualAxisConfigSchema.optional(),\n});\n\n// Combo chart config - requires dual axes\nconst ComboChartConfigSchema = z.object({\n type: z.literal('combo'),\n x: AxisSchema,\n series: WideFormatSeriesSchema,\n stacking: z.enum(['stacked', 'percent']).optional(),\n axes: DualAxesSchema,\n legend: LegendSchema.optional(),\n interactions: InteractionsSchema.optional(),\n gradient: GradientSchema.optional(),\n goals: z.array(GoalSchema).optional(),\n});\n\n// Scatter chart size encoding\nconst ScatterSizeSchema = z.object({\n field: z.string().min(1),\n min: z.number().optional(),\n max: z.number().optional(),\n label: z.string().optional(),\n});\n\n// Scatter chart grouping\nconst ScatterGroupSchema = z.object({\n field: z.string().min(1),\n});\n\n// Regression line configuration\nconst RegressionSchema = z.object({\n type: z.literal('linear'),\n show_equation: z.boolean().optional(),\n show_r_squared: z.boolean().optional(),\n});\n\n// Scatter/bubble chart config\nconst ScatterChartConfigSchema = z.object({\n type: z.literal('scatter'),\n x: AxisSchema,\n y: AxisSchema,\n size: ScatterSizeSchema.optional(),\n group: ScatterGroupSchema.optional(),\n regression: RegressionSchema.optional(),\n color: ColorSchema.optional(),\n legend: LegendSchema.optional(),\n interactions: InteractionsSchema.optional(),\n});\n\n// Heatmap chart config\nconst HeatmapChartConfigSchema = z.object({\n type: z.literal('heatmap'),\n x: AxisSchema,\n y: AxisSchema,\n value: z.object({\n field: z.string().min(1),\n label: z.string().optional(),\n }),\n color_range: z.object({\n min: z.string().optional(),\n max: z.string().optional(),\n }).optional(),\n show_values: z.boolean().optional(),\n});\n\n// Funnel chart config\nconst FunnelChartConfigSchema = z.object({\n type: z.literal('funnel'),\n stage: z.object({ field: z.string().min(1) }),\n value: z.object({ field: z.string().min(1) }),\n show_conversion: z.boolean().optional(),\n color: ColorSchema.optional(),\n});\n\n// Waterfall chart config\nconst WaterfallChartConfigSchema = z.object({\n type: z.literal('waterfall'),\n category: z.object({ field: z.string().min(1) }),\n value: z.object({ field: z.string().min(1) }),\n total_field: z.string().optional(),\n series: LongFormatSeriesSchema.optional(), // Stacked breakdown within each waterfall step\n colors: z.object({\n increase: z.string().optional(),\n decrease: z.string().optional(),\n total: z.string().optional(),\n }).optional(),\n});\n\n// Sankey chart config\nconst SankeyChartConfigSchema = z.object({\n type: z.literal('sankey'),\n source: z.object({ field: z.string().min(1) }),\n target: z.object({ field: z.string().min(1) }),\n value: z.object({ field: z.string().min(1) }),\n levels: z.array(z.array(z.string())).optional(),\n orient: z.enum(['horizontal', 'vertical']).optional(),\n node_width: z.number().positive().optional(),\n node_gap: z.number().nonnegative().optional(),\n label_position: z.enum(['left', 'right', 'top', 'bottom', 'inside']).optional(),\n});\nexport type SankeyChartConfig = z.infer<typeof SankeyChartConfigSchema>;\n\n// Gauge chart config\nconst GaugeThresholdSchema = z.object({\n value: z.number(),\n color: z.string(),\n});\n\nconst GaugeChartConfigSchema = z.object({\n type: z.literal('gauge'),\n value: z.object({ field: z.string().min(1) }),\n min: z.number().optional(),\n max: z.number().optional(),\n unit: z.string().optional(),\n thresholds: z.array(GaugeThresholdSchema).optional(),\n format: z.string().optional(),\n goal: KpiGoalSchema.optional(),\n});\n\nconst TableColumnSummarySchema = z.enum(['sum', 'avg', 'min', 'max', 'count']);\n\nconst PivotAggregateSchema = z.enum(['sum', 'avg', 'min', 'max', 'count']);\n\nconst PivotValueSchema = z.object({\n field: z.string().min(1),\n aggregate: PivotAggregateSchema.default('sum'),\n format: z.string().optional(),\n heatmap: z.boolean().optional(),\n});\n\nconst PivotHeatmapSchema = z.object({\n color: z.string().optional(),\n scope: z.enum(['column', 'global']).optional(),\n});\n\nconst PivotConfigSchema = z.object({\n rows: z.array(z.string().min(1)).min(1),\n columns: z.string().min(1),\n values: z.array(PivotValueSchema).min(1),\n subtotals: z.boolean().optional(),\n grandTotals: z.boolean().optional(),\n heatmap: PivotHeatmapSchema.optional(),\n});\n\nconst TableChartConfigSchema = z.object({\n type: z.literal('table'),\n columns: z.array(z.object({\n field: z.string().min(1),\n label: z.string().optional(),\n format: z.string().optional(),\n sticky: z.boolean().optional(),\n summary: TableColumnSummarySchema.optional(),\n overflow: z.enum(['ellipsis', 'wrap', 'hidden']).optional(),\n font: z.enum(['mono']).optional(),\n })).optional(),\n summary: z.object({\n label: z.string().optional(),\n }).optional(),\n sort: z.object({\n field: z.string().min(1),\n direction: z.enum(['asc', 'desc']).optional(),\n }).optional(),\n pagination: z.object({\n enabled: z.boolean().optional(),\n page_size: z.number().int().positive().optional(),\n mode: z.enum(['paginated', 'infinite_scroll']).optional(),\n server_side: z.boolean().optional(),\n }).optional(),\n max_rows: z.number().int().positive().optional(),\n export: z.object({\n enabled: z.boolean().optional(),\n max_rows: z.number().int().positive().optional(),\n }).optional(),\n pivot: PivotConfigSchema.optional(),\n});\n\n// Chart visualization config - standard, KPI, combo, scatter, heatmap, funnel, waterfall, gauge, or table\nconst ChartConfigSchema = z.union([\n ScatterChartConfigSchema,\n ComboChartConfigSchema,\n HeatmapChartConfigSchema,\n FunnelChartConfigSchema,\n WaterfallChartConfigSchema,\n GaugeChartConfigSchema,\n SankeyChartConfigSchema,\n TableChartConfigSchema,\n StandardChartConfigSchema,\n KpiConfigSchema,\n]);\n\n// Parameter types\nconst ParameterTypeSchema = z.enum([\n 'date_range',\n 'select',\n 'multi_select',\n 'dynamic_select',\n 'text',\n 'number',\n 'boolean',\n]);\n\n// Parameter option\nconst ParameterOptionSchema = z.union([\n z.string(),\n z.object({\n value: z.string(),\n label: z.string(),\n }),\n]);\n\n// Parameter source (for dynamic options)\nconst ParameterSourceSchema = z.object({\n model: z.string(),\n value_field: z.string(),\n label_field: z.string(),\n});\n\n// Parameter definition\nconst ParameterSchema = z.object({\n name: z.string().min(1),\n type: ParameterTypeSchema,\n label: z.string().optional(),\n description: z.string().optional(),\n default: z.union([z.string(), z.number(), z.array(z.string())]).optional(),\n options: z.array(ParameterOptionSchema).optional(),\n source: ParameterSourceSchema.optional(),\n});\n\n// Data source - either model reference or inline SQL\nconst SourceSchema = z.object({\n model: z.string().optional(),\n sql: z.string().optional(),\n}).refine(\n (data) => data.model !== undefined || data.sql !== undefined,\n { message: 'Source must specify either model or sql' }\n).refine(\n (data) => !(data.model !== undefined && data.sql !== undefined),\n { message: 'Source cannot specify both model and sql' }\n);\n\n// Refresh/cache configuration\nconst RefreshSchema = z.object({\n schedule: z.string().optional(), // cron expression\n timezone: z.string().optional(),\n cache_ttl: z.string().optional(), // e.g., \"1h\", \"30m\"\n});\n\n// Drill-down column config for data table display\nconst DrillDownColumnSchema = z.object({\n field: z.string().min(1),\n label: z.string().optional(),\n format: z.string().optional(),\n});\n\n// Drill-down configuration\nconst DrillDownConfigSchema = z.object({\n chart: z.string().optional(), // target chart name (source side)\n model: z.string().optional(), // model name for row-level detail data\n field: z.string().optional(), // field to pass as filter, defaults to x-axis field (backward compat)\n fields: z.union([z.string(), z.array(z.string())]).optional(), // dimension field(s) for filtering\n columns: z.array(DrillDownColumnSchema).optional(), // data table columns (target side)\n}).refine(data => data.chart || data.model || data.columns, {\n message: \"drillDown requires 'chart', 'model', or 'columns'\",\n});\n\n// Main chart schema\nexport const ChartSchema = z.object({\n // Identity\n name: z.string().min(1),\n title: z.string().min(1),\n description: z.string().optional(),\n\n // Metadata\n owner: z.string().optional(),\n tags: z.array(z.string()).optional(),\n created: z.string().optional(),\n updated: z.string().optional(),\n\n // Data\n source: SourceSchema,\n parameters: z.array(ParameterSchema).optional(),\n\n // Visualization\n chart: ChartConfigSchema,\n\n // Caching\n refresh: RefreshSchema.optional(),\n\n // Drill-down navigation\n drillDown: DrillDownConfigSchema.optional(),\n});\n\nexport type Chart = z.infer<typeof ChartSchema>;\nexport type ChartConfig = z.infer<typeof ChartConfigSchema>;\nexport type ChartType = z.infer<typeof ChartTypeSchema>;\nexport type Parameter = z.infer<typeof ParameterSchema>;\nexport type Axis = z.infer<typeof AxisSchema>;\nexport type SeriesConfig = z.infer<typeof SeriesConfigSchema>;\nexport type LongFormatSeries = z.infer<typeof LongFormatSeriesSchema>;\nexport type WideFormatSeries = z.infer<typeof WideFormatSeriesSchema>;\nexport type WideFormatColumn = z.infer<typeof WideFormatColumnSchema>;\nexport type ColorConfig = z.infer<typeof ColorSchema>;\nexport type ConditionalColor = z.infer<typeof ConditionalColorSchema>;\nexport type ColorCondition = z.infer<typeof ColorConditionSchema>;\nexport type GradientConfig = z.infer<typeof GradientSchema>;\nexport type LegendConfig = z.infer<typeof LegendSchema>;\nexport type ComboChartConfig = z.infer<typeof ComboChartConfigSchema>;\nexport type DualAxes = z.infer<typeof DualAxesSchema>;\nexport type ScatterChartConfig = z.infer<typeof ScatterChartConfigSchema>;\nexport type ScatterSize = z.infer<typeof ScatterSizeSchema>;\nexport type ScatterGroup = z.infer<typeof ScatterGroupSchema>;\nexport type RegressionConfig = z.infer<typeof RegressionSchema>;\nexport type DrillDownConfig = z.infer<typeof DrillDownConfigSchema>;\nexport type DrillDownColumn = z.infer<typeof DrillDownColumnSchema>;\nexport type HeatmapChartConfig = z.infer<typeof HeatmapChartConfigSchema>;\nexport type FunnelChartConfig = z.infer<typeof FunnelChartConfigSchema>;\nexport type WaterfallChartConfig = z.infer<typeof WaterfallChartConfigSchema>;\nexport type GaugeChartConfig = z.infer<typeof GaugeChartConfigSchema>;\nexport type TableChartConfig = z.infer<typeof TableChartConfigSchema>;\nexport type PivotConfig = z.infer<typeof PivotConfigSchema>;\nexport type PivotValueConfig = z.infer<typeof PivotValueSchema>;\nexport type PivotHeatmapConfig = z.infer<typeof PivotHeatmapSchema>;\nexport type GoalConfig = z.infer<typeof GoalSchema>;\nexport type FixedGoal = z.infer<typeof FixedGoalSchema>;\nexport type CumulativeGoal = z.infer<typeof CumulativeGoalSchema>;\nexport type ModelGoal = z.infer<typeof ModelGoalSchema>;\nexport type KpiGoal = z.infer<typeof KpiGoalSchema>;\nexport type GoalZone = z.infer<typeof GoalZoneSchema>;\n\nexport { ParameterSchema };\n","import { z } from 'zod';\nimport { SemanticConfigSchema } from './semantic.js';\n\n// Default settings\nconst DefaultsSchema = z.object({\n connection: z.string().optional(),\n theme: z.string().optional(),\n timezone: z.string().optional(),\n cache_ttl: z.string().optional(),\n base_url: z.string().url().optional(),\n week_start: z.enum(['sunday', 'monday', 'tuesday', 'wednesday', 'thursday', 'friday', 'saturday']).optional(),\n table: z.object({\n max_display_rows: z.number().int().positive().optional(),\n max_export_rows: z.number().int().positive().optional(),\n }).optional(),\n});\n\n// Git integration settings\nconst GitSchema = z.object({\n provider: z.enum(['github', 'gitlab', 'bitbucket']).optional(),\n repo: z.string().optional(),\n branch: z.string().optional(),\n preview_branches: z.boolean().optional(),\n});\n\n// SSO provider configuration\nconst SSOProviderSchema = z.object({\n client_id: z.string(),\n client_secret: z.string(),\n tenant: z.string().optional(),\n issuer: z.string().optional(),\n display_name: z.string().optional(),\n});\n\n// Authentication settings (built-in local auth)\nconst AuthSchema = z.object({\n enabled: z.boolean(),\n db_path: z.string().optional(),\n session_ttl: z.string().optional(),\n providers: z.object({\n google: SSOProviderSchema.optional(),\n microsoft: SSOProviderSchema.optional(),\n oidc: SSOProviderSchema.optional(),\n }).optional(),\n});\n\n// Feature flags\nconst FeaturesSchema = z.object({\n enable_sql_editor: z.boolean().optional(),\n enable_csv_export: z.boolean().optional(),\n enable_scheduling: z.boolean().optional(),\n chat: z.boolean().optional(),\n});\n\n// Sidebar link for external navigation\nconst SidebarLinkSchema = z.object({\n label: z.string(),\n url: z.string(),\n icon: z.string().optional(),\n});\n\n// Sidebar configuration\nconst SidebarConfigSchema = z.object({\n show: z.boolean().optional(),\n collapsed: z.boolean().optional(),\n links: z.array(SidebarLinkSchema).optional(),\n sections: z.object({\n dashboards: z.boolean().optional(),\n charts: z.boolean().optional(),\n }).optional(),\n});\n\n// Color configuration\nconst ColorsSchema = z.object({\n primary: z.string().optional(),\n background: z.string().optional(),\n surface: z.string().optional(),\n sidebar: z.string().optional(),\n text: z.string().optional(),\n});\n\n// Font configuration\nconst FontsSchema = z.object({\n heading: z.string().optional(),\n body: z.string().optional(),\n mono: z.string().optional(),\n size: z.enum(['compact', 'default', 'comfortable']).optional(),\n});\n\n// Logo can be a string path or light/dark object\nconst LogoSchema = z.union([\n z.string(),\n z.object({\n light: z.string(),\n dark: z.string(),\n }),\n]);\n\n// Theme configuration\nconst ThemeSchema = z.object({\n mode: z.enum(['light', 'dark', 'auto']).optional(),\n base: z.enum(['modern', 'executive', 'minimal']).optional(),\n logo: LogoSchema.optional(),\n favicon: z.string().optional(),\n title: z.string().optional(),\n colors: ColorsSchema.optional(),\n palette: z.array(z.string()).optional(),\n gradient: z.boolean().default(false),\n opacity: z.number().min(0).max(1).default(1.0),\n fonts: FontsSchema.optional(),\n sidebar: SidebarConfigSchema.optional(),\n customCss: z.string().optional(),\n});\n\n// Environment-specific overrides — same shape as ProjectSchema minus identity fields\nconst EnvironmentOverrideSchema = z.object({\n defaults: DefaultsSchema.optional(),\n git: GitSchema.optional(),\n auth: AuthSchema.optional(),\n features: FeaturesSchema.optional(),\n theme: ThemeSchema.optional(),\n semantic: SemanticConfigSchema.optional(),\n}).passthrough();\n\n/**\n * Deep-merge two plain objects. Objects merge recursively;\n * arrays and scalars in override replace the base value entirely.\n */\nexport function deepMerge<T extends Record<string, unknown>>(\n base: T,\n override: Record<string, unknown> | undefined,\n): T {\n if (!override) return { ...base };\n\n const result = { ...base } as Record<string, unknown>;\n for (const [key, value] of Object.entries(override)) {\n if (\n value !== null &&\n typeof value === 'object' &&\n !Array.isArray(value) &&\n typeof result[key] === 'object' &&\n result[key] !== null &&\n !Array.isArray(result[key])\n ) {\n result[key] = deepMerge(\n result[key] as Record<string, unknown>,\n value as Record<string, unknown>,\n );\n } else {\n result[key] = value;\n }\n }\n return result as T;\n}\n\n/**\n * Resolve a raw yamchart.yaml object for a given environment.\n * Extracts and merges the matching environments block, then strips\n * the environments key. Does NOT validate — caller runs Zod after\n * optionally merging yamchart.local.yaml on top.\n */\nexport function resolveProjectConfig(\n raw: Record<string, unknown>,\n env?: string,\n): Record<string, unknown> {\n const { environments, ...base } = raw;\n const envBlocks = environments as Record<string, Record<string, unknown>> | undefined;\n const envOverride = env ? envBlocks?.[env] : undefined;\n return deepMerge(base as Record<string, unknown>, envOverride);\n}\n\n// Catalog filter configuration\nconst CatalogIncludeSchema = z.object({\n schemas: z.array(z.string()).optional(),\n tags: z.array(z.string()).optional(),\n});\n\nconst CatalogConfigSchema = z.object({\n include: CatalogIncludeSchema.optional(),\n});\n\nexport type CatalogConfig = z.infer<typeof CatalogConfigSchema>;\n\n// Main project schema\nexport const ProjectSchema = z.object({\n version: z.string().min(1),\n name: z.string().min(1),\n description: z.string().optional(),\n\n defaults: DefaultsSchema.optional(),\n\n environments: z.record(z.string(), EnvironmentOverrideSchema).optional(),\n\n git: GitSchema.optional(),\n auth: AuthSchema.optional(),\n features: FeaturesSchema.optional(),\n theme: ThemeSchema.optional(),\n semantic: SemanticConfigSchema,\n catalog: CatalogConfigSchema.optional(),\n});\n\nexport type Project = z.infer<typeof ProjectSchema>;\nexport type Auth = z.infer<typeof AuthSchema>;\nexport type Defaults = z.infer<typeof DefaultsSchema>;\nexport type EnvironmentOverride = z.infer<typeof EnvironmentOverrideSchema>;\nexport type Theme = z.infer<typeof ThemeSchema>;\nexport type SidebarConfig = z.infer<typeof SidebarConfigSchema>;\nexport type FontsConfig = z.infer<typeof FontsSchema>;\nexport type ColorsConfig = z.infer<typeof ColorsSchema>;\n","import { z } from 'zod';\n\n// --- Semantic Model ---\n\nexport const MeasureTypeSchema = z.enum(['sum', 'count', 'avg', 'min', 'max', 'count_distinct']);\n\nexport const DimensionTypeSchema = z.enum(['string', 'number', 'time', 'boolean']);\n\nexport const MeasureSchema = z.object({\n name: z.string(),\n type: MeasureTypeSchema,\n description: z.string().optional(),\n format: z.string().optional(),\n});\n\nexport const DimensionSchema = z.object({\n name: z.string(),\n type: DimensionTypeSchema,\n description: z.string().optional(),\n});\n\nexport const SemanticEntitySchema = z.object({\n name: z.string(),\n description: z.string().optional(),\n source: z.enum(['catalog', 'model']),\n source_table: z.string(),\n measures: z.array(MeasureSchema),\n dimensions: z.array(DimensionSchema),\n parameters: z.array(z.object({\n name: z.string(),\n type: z.string(),\n default: z.union([z.string(), z.number()]).optional(),\n options: z.array(z.string()).optional(),\n })).optional(),\n});\n\nexport const RelationshipSchema = z.object({\n from: z.object({ entity: z.string(), field: z.string() }),\n to: z.object({ entity: z.string(), field: z.string() }),\n type: z.enum(['many_to_one', 'one_to_many', 'one_to_one']),\n});\n\nexport const SemanticModelSchema = z.object({\n entities: z.array(SemanticEntitySchema),\n relationships: z.array(RelationshipSchema),\n generated_at: z.string(),\n});\n\n// --- Structured Query ---\n\nexport const SemanticFilterOperatorSchema = z.enum([\n 'equals', 'not_equals', 'contains', 'gt', 'gte', 'lt', 'lte', 'in', 'not_in',\n]);\n\nexport const SemanticFilterSchema = z.object({\n dimension: z.string(),\n operator: SemanticFilterOperatorSchema,\n value: z.union([z.string(), z.number(), z.boolean(), z.array(z.union([z.string(), z.number()]))]),\n});\n\nexport const SemanticQuerySchema = z.object({\n model: z.string(),\n measures: z.array(z.string()).min(1),\n dimensions: z.array(z.string()).optional().default([]),\n parameters: z.record(z.union([z.string(), z.number()])).optional(),\n filters: z.array(SemanticFilterSchema).optional().default([]),\n order_by: z.object({\n field: z.string(),\n direction: z.enum(['asc', 'desc']).default('asc'),\n }).optional(),\n limit: z.number().int().positive().max(10000).optional().default(1000),\n});\n\n// --- Semantic Config (for yamchart.yaml) ---\n\nexport const SemanticConfigSchema = z.object({\n include: z.object({\n paths: z.array(z.string()).default(['gold/', 'marts/', 'core/']),\n prefixes: z.array(z.string()).default(['dim_', 'fct_', 'fact_']),\n }).optional().default({\n paths: ['gold/', 'marts/', 'core/'],\n prefixes: ['dim_', 'fct_', 'fact_'],\n }),\n}).optional();\n\n// --- Inferred types ---\n\nexport type Measure = z.infer<typeof MeasureSchema>;\nexport type MeasureType = z.infer<typeof MeasureTypeSchema>;\nexport type Dimension = z.infer<typeof DimensionSchema>;\nexport type DimensionType = z.infer<typeof DimensionTypeSchema>;\nexport type SemanticEntity = z.infer<typeof SemanticEntitySchema>;\nexport type Relationship = z.infer<typeof RelationshipSchema>;\nexport type SemanticModel = z.infer<typeof SemanticModelSchema>;\nexport type SemanticFilter = z.infer<typeof SemanticFilterSchema>;\nexport type SemanticQuery = z.infer<typeof SemanticQuerySchema>;\nexport type SemanticConfig = z.infer<typeof SemanticConfigSchema>;\n","import { z } from 'zod';\n\n// Parameter type\nconst ParamTypeSchema = z.enum(['string', 'number', 'date', 'boolean', 'string[]', 'number[]']);\n\n// Model parameter\nconst ModelParamSchema = z.object({\n name: z.string().min(1),\n type: ParamTypeSchema,\n default: z.string().optional(),\n options: z.array(z.string()).optional(), // For enum-like params\n description: z.string().optional(),\n});\n\n// Return column definition\nconst ReturnColumnSchema = z.object({\n name: z.string().min(1),\n type: z.string(),\n description: z.string().optional(),\n});\n\n// Model metadata (extracted from SQL comments)\nexport const ModelMetadataSchema = z.object({\n name: z.string().min(1),\n description: z.string().optional(),\n owner: z.string().optional(),\n tags: z.array(z.string()).optional(),\n\n params: z.array(ModelParamSchema).optional(),\n returns: z.array(ReturnColumnSchema).optional(),\n tests: z.array(z.string()).optional(), // SQL assertions\n});\n\n// Full model (metadata + SQL)\nexport const ModelSchema = z.object({\n metadata: ModelMetadataSchema,\n sql: z.string().min(1),\n filePath: z.string().optional(),\n});\n\nexport type ModelMetadata = z.infer<typeof ModelMetadataSchema>;\nexport type ModelParam = z.infer<typeof ModelParamSchema>;\nexport type ReturnColumn = z.infer<typeof ReturnColumnSchema>;\nexport type Model = z.infer<typeof ModelSchema>;\n","import { z } from 'zod';\nimport { ParameterSchema } from './chart.js';\n\n// Widget types\nconst ChartWidgetSchema = z.object({\n type: z.literal('chart'),\n ref: z.string().min(1),\n cols: z.number().min(1).max(12),\n height: z.number().min(38).optional(),\n x: z.number().min(0).max(11).optional(),\n y: z.number().min(0).optional(),\n});\n\nconst TextWidgetSchema = z.object({\n type: z.literal('text'),\n content: z.string(),\n cols: z.number().min(1).max(12),\n height: z.number().min(38).optional(),\n x: z.number().min(0).max(11).optional(),\n y: z.number().min(0).optional(),\n});\n\nconst WidgetSchema = z.discriminatedUnion('type', [\n ChartWidgetSchema,\n TextWidgetSchema,\n]);\n\n// Row configuration\nconst RowSchema = z.object({\n height: z.number().min(38),\n widgets: z.array(WidgetSchema).min(1),\n});\n\n// Layout configuration\nconst LayoutSchema = z.object({\n gap: z.number().min(0).default(16),\n rows: z.array(RowSchema).min(1),\n});\n\n// Tab configuration\nconst TabSchema = z.object({\n name: z.string().min(1),\n label: z.string().min(1),\n filters: z.array(ParameterSchema).optional(),\n layout: LayoutSchema,\n});\n\n// Main dashboard schema\nexport const DashboardSchema = z.object({\n // Identity\n name: z.string().min(1),\n title: z.string().min(1),\n description: z.string().optional(),\n\n // Filters inherited by all widgets (shared across tabs)\n filters: z.array(ParameterSchema).optional(),\n\n // Layout definition (mutually exclusive with tabs)\n layout: LayoutSchema.optional(),\n\n // Tabbed layout\n tabs: z.array(TabSchema).min(1).optional(),\n}).superRefine((data, ctx) => {\n if (data.layout && data.tabs) {\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n message: 'Dashboard must have either \"layout\" or \"tabs\", not both',\n path: ['tabs'],\n });\n }\n if (!data.layout && !data.tabs) {\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n message: 'Dashboard must have either \"layout\" or \"tabs\"',\n path: [],\n });\n }\n});\n\nexport type Dashboard = z.infer<typeof DashboardSchema>;\nexport type DashboardTab = z.infer<typeof TabSchema>;\nexport type DashboardLayout = z.infer<typeof LayoutSchema>;\nexport type DashboardRow = z.infer<typeof RowSchema>;\nexport type DashboardWidget = z.infer<typeof WidgetSchema>;\nexport type ChartWidget = z.infer<typeof ChartWidgetSchema>;\nexport type TextWidget = z.infer<typeof TextWidgetSchema>;\n","import { z } from 'zod';\n\nconst SlackChannelSchema = z.object({\n webhook_url: z.string().min(1),\n channel: z.string().optional(),\n});\n\nconst ChannelSchema = z.object({\n slack: SlackChannelSchema,\n});\n\nconst ConditionOperatorSchema = z.enum(['lt', 'gt', 'lte', 'gte', 'eq']);\n\nconst ConditionSchema = z.object({\n field: z.string().min(1),\n operator: ConditionOperatorSchema,\n value: z.number(),\n});\n\nconst ReportScheduleSchema = z.object({\n name: z.string().min(1),\n type: z.literal('report'),\n schedule: z.string().min(1),\n timezone: z.string().optional(),\n channel: ChannelSchema,\n charts: z.array(z.string().min(1)).min(1),\n params: z.record(z.unknown()).optional(),\n message: z.string().optional(),\n notify_on_error: z.boolean().optional(),\n});\n\nconst AlertScheduleSchema = z.object({\n name: z.string().min(1),\n type: z.literal('alert'),\n schedule: z.string().min(1),\n timezone: z.string().optional(),\n channel: ChannelSchema,\n chart: z.string().min(1),\n params: z.record(z.unknown()).optional(),\n condition: ConditionSchema,\n cooldown: z.string().optional(),\n message: z.string().optional(),\n notify_on_error: z.boolean().optional(),\n});\n\nexport const ScheduleSchema = z.discriminatedUnion('type', [\n ReportScheduleSchema,\n AlertScheduleSchema,\n]);\n\nexport type Schedule = z.infer<typeof ScheduleSchema>;\nexport type ReportSchedule = z.infer<typeof ReportScheduleSchema>;\nexport type AlertSchedule = z.infer<typeof AlertScheduleSchema>;\nexport type Condition = z.infer<typeof ConditionSchema>;\nexport type ConditionOperator = z.infer<typeof ConditionOperatorSchema>;\n","import { z } from 'zod';\n\nexport const EventSchema = z.object({\n date: z.string(),\n endDate: z.string().optional(),\n label: z.string(),\n description: z.string().optional(),\n color: z.string().optional(),\n charts: z.array(z.string()).optional(),\n});\n\nexport const EventsFileSchema = z.object({\n events: z.array(EventSchema).default([]),\n});\n\nexport type ChartEvent = z.infer<typeof EventSchema>;\nexport type EventsFile = z.infer<typeof EventsFileSchema>;\n","import { z } from 'zod';\n\n/**\n * Zod schema for validating agent YAML files (agents/*.yaml).\n * system_prompt is treated as a plain string — Jinja rendering happens at load time in packages/chat.\n */\nexport const AgentDefinitionSchema = z.object({\n name: z.string(),\n title: z.string().optional(),\n description: z.string(),\n system_prompt: z.string(),\n tools: z.array(z.string()).default([]),\n model: z.string().optional(),\n models: z.array(z.string()).optional(),\n});\n\nexport type AgentDefinition = z.infer<typeof AgentDefinitionSchema>;\n","// Yamchart Schema - Zod schemas and TypeScript types\nexport const VERSION = '0.1.0';\n\nexport * from './connection.js';\nexport * from './chart.js';\nexport * from './project.js';\nexport * from './model.js';\nexport * from './dashboard.js';\nexport * from './schedule.js';\nexport * from './events.js';\nexport * from './semantic.js';\nexport { AgentDefinitionSchema, type AgentDefinition } from './agent.js';\n"],"mappings":";AAAA,SAAS,SAAS;AAGlB,IAAM,gBAAgB,EAAE,OAAO;EAC7B,MAAM,EAAE,QAAQ,KAAK;EACrB,UAAU,EAAE,OAAM;EAClB,cAAc,EAAE,OAAM;CACvB;AAED,IAAM,oBAAoB,EAAE,OAAO;EACjC,MAAM,EAAE,QAAQ,UAAU;EAC1B,UAAU,EAAE,OAAM;EAClB,kBAAkB,EAAE,OAAM;CAC3B;AAED,IAAM,0BAA0B,EAAE,OAAO;EACvC,MAAM,EAAE,QAAQ,gBAAgB;EAChC,UAAU,EAAE,KAAK,CAAC,uBAAuB,sBAAsB,OAAO,CAAC;EACvE,WAAW,EAAE,OAAM;CACpB;AAED,IAAM,4BAA4B,EAAE,OAAO;EACzC,MAAM,EAAE,QAAQ,iBAAiB;EACjC,UAAU,EAAE,OAAM;EAClB,aAAa,EAAE,QAAO,EAAG,SAAQ;CAClC;AAED,IAAM,aAAa,EAAE,mBAAmB,QAAQ;EAC9C;EACA;EACA;EACA;CACD;AAGD,IAAM,mBAAmB,EAAE,OAAO;EAChC,iBAAiB,EAAE,OAAM,EAAG,IAAG,EAAG,SAAQ,EAAG,SAAQ;EACrD,iBAAiB,EAAE,OAAM,EAAG,IAAG,EAAG,SAAQ,EAAG,SAAQ;EACrD,cAAc,EAAE,OAAM,EAAG,IAAG,EAAG,SAAQ,EAAG,SAAQ;CACnD;AAGD,IAAM,oBAAoB,EAAE,OAAO;EACjC,SAAS,EAAE,OAAM,EAAG,IAAG,EAAG,SAAQ,EAAG,SAAQ;EAC7C,UAAU,EAAE,OAAM,EAAG,IAAG,EAAG,SAAQ,EAAG,SAAQ;CAC/C;AAGD,IAAM,qBAAqB,EAAE,OAAO;EAClC,MAAM,EAAE,OAAM;;CACf;AAGD,IAAM,uBAAuB,EAAE,OAAO;EACpC,MAAM,EAAE,OAAM;EACd,MAAM,EAAE,OAAM,EAAG,IAAG,EAAG,SAAQ,EAAG,QAAQ,IAAI;EAC9C,UAAU,EAAE,OAAM;EAClB,QAAQ,EAAE,OAAM,EAAG,SAAQ;EAC3B,KAAK,EAAE,QAAO,EAAG,SAAQ;CAC1B;AAGD,IAAM,wBAAwB,EAAE,OAAO;EACrC,SAAS,EAAE,OAAM;EACjB,WAAW,EAAE,OAAM;EACnB,UAAU,EAAE,OAAM;EAClB,QAAQ,EAAE,OAAM,EAAG,SAAQ;EAC3B,MAAM,EAAE,OAAM,EAAG,SAAQ;CAC1B;AAGD,IAAM,oBAAoB,EAAE,OAAO;EACjC,MAAM,EAAE,OAAM;EACd,MAAM,EAAE,OAAM,EAAG,IAAG,EAAG,SAAQ,EAAG,QAAQ,IAAI;EAC9C,UAAU,EAAE,OAAM;EAClB,KAAK,EAAE,QAAO,EAAG,SAAQ;CAC1B;AAGD,IAAM,qBAAqB,EAAE,OAAO;EAClC,MAAM,EAAE,OAAM;;CACf;AAGD,IAAM,uBAAuB,EAAE,OAAO;EACpC,MAAM,EAAE,OAAM,EAAG,IAAI,CAAC;EACtB,aAAa,EAAE,OAAM,EAAG,SAAQ;EAChC,MAAM,iBAAiB,SAAQ;EAC/B,OAAO,kBAAkB,SAAQ;CAClC;AAGD,IAAM,yBAAyB,qBAAqB,OAAO;EACzD,MAAM,EAAE,QAAQ,QAAQ;EACxB,QAAQ;EACR,MAAM,EAAE,UAAS,EAAG,SAAQ;CAC7B;AAED,IAAM,2BAA2B,qBAAqB,OAAO;EAC3D,MAAM,EAAE,QAAQ,UAAU;EAC1B,QAAQ;EACR,MAAM,WAAW,SAAQ;CAC1B;AAED,IAAM,4BAA4B,qBAAqB,OAAO;EAC5D,MAAM,EAAE,QAAQ,WAAW;EAC3B,QAAQ;EACR,MAAM;CACP;AAED,IAAM,wBAAwB,qBAAqB,OAAO;EACxD,MAAM,EAAE,QAAQ,OAAO;EACvB,QAAQ;EACR,MAAM,WAAW,SAAQ;CAC1B;AAED,IAAM,yBAAyB,qBAAqB,OAAO;EACzD,MAAM,EAAE,QAAQ,QAAQ;EACxB,QAAQ;EACR,MAAM,EAAE,UAAS,EAAG,SAAQ;CAC7B;AAGM,IAAM,mBAAmB,EAAE,mBAAmB,QAAQ;EAC3D;EACA;EACA;EACA;EACA;CACD;;;ACjID,SAAS,KAAAA,UAAS;AAGlB,IAAM,iBAAiBA,GAAE,KAAK,CAAC,YAAY,gBAAgB,WAAW,SAAS,CAAC;AAGhF,IAAM,aAAaA,GAAE,OAAO;EAC1B,OAAOA,GAAE,OAAM,EAAG,IAAI,CAAC;EACvB,MAAM;EACN,QAAQA,GAAE,OAAM,EAAG,SAAQ;EAC3B,OAAOA,GAAE,OAAM,EAAG,SAAQ;EAC1B,OAAOA,GAAE,KAAK,CAAC,UAAU,KAAK,CAAC,EAAE,SAAQ;CAC1C;AAGD,IAAM,kBAAkBA,GAAE,KAAK;EAC7B;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;CACD;AAGD,IAAM,iBAAiBA,GAAE,MAAM;EAC7BA,GAAE,QAAO;EACTA,GAAE,OAAO;IACP,MAAMA,GAAE,OAAM;IACd,IAAIA,GAAE,OAAM;GACb;CACF;AAGD,IAAM,yBAAyBA,GAAE,OAAO;EACtC,OAAOA,GAAE,OAAM,EAAG,IAAI,CAAC;EACvB,QAAQA,GAAE,OAAOA,GAAE,OAAM,GAAIA,GAAE,OAAM,CAAE,EAAE,SAAQ;CAClD;AAGD,IAAM,wBAAwBA,GAAE,OAAO;EACrC,MAAMA,GAAE,KAAK,CAAC,iBAAiB,CAAC;EAChC,QAAQA,GAAE,OAAM,EAAG,IAAG,EAAG,SAAQ;CAClC;AAGD,IAAM,yBAAyBA,GAAE,OAAO;EACtC,OAAOA,GAAE,OAAM,EAAG,IAAI,CAAC;EACvB,MAAMA,GAAE,OAAM,EAAG,SAAQ;EACzB,MAAMA,GAAE,KAAK,CAAC,QAAQ,OAAO,MAAM,CAAC,EAAE,SAAQ;EAC9C,MAAMA,GAAE,KAAK,CAAC,QAAQ,OAAO,CAAC,EAAE,SAAQ;EACxC,OAAOA,GAAE,OAAM,EAAG,SAAQ;EAC1B,OAAOA,GAAE,KAAK,CAAC,SAAS,UAAU,QAAQ,CAAC,EAAE,SAAQ;EACrD,SAASA,GAAE,OAAM,EAAG,IAAI,CAAC,EAAE,IAAI,CAAC,EAAE,SAAQ;EAC1C,UAAU,eAAe,SAAQ;EACjC,WAAW,sBAAsB,SAAQ;EACzC,MAAMA,GAAE,OAAM,EAAG,SAAQ;;CAC1B;AAGD,IAAM,yBAAyBA,GAAE,OAAO;EACtC,SAASA,GAAE,MAAM,sBAAsB,EAAE,IAAI,CAAC;CAC/C;AAGD,IAAM,qBAAqBA,GAAE,MAAM;EACjC;EACA;CACD;AAGD,IAAM,uBAAuBA,GAAE,OAAO;EACpC,MAAMA,GAAE,OAAM;EACd,OAAOA,GAAE,OAAM;CAChB;AAGD,IAAM,yBAAyBA,GAAE,OAAO;EACtC,YAAYA,GAAE,MAAM,oBAAoB,EAAE,IAAI,CAAC;EAC/C,SAASA,GAAE,OAAM,EAAG,SAAQ;CAC7B;AAGD,IAAM,cAAcA,GAAE,MAAM;EAC1BA,GAAE,OAAM;EACR;CACD;AAGD,IAAM,eAAeA,GAAE,OAAO;EAC5B,MAAMA,GAAE,QAAO,EAAG,SAAQ;EAC1B,UAAUA,GAAE,KAAK,CAAC,OAAO,UAAU,QAAQ,OAAO,CAAC,EAAE,SAAQ;CAC9D;AAGD,IAAM,uBAAuBA,GAAE,OAAO;EACpC,MAAMA,GAAE,QAAQ,MAAM;EACtB,OAAOA,GAAE,OAAM;EACf,OAAOA,GAAE,OAAM,EAAG,SAAQ;EAC1B,OAAOA,GAAE,OAAM,EAAG,SAAQ;EAC1B,OAAOA,GAAE,KAAK,CAAC,SAAS,UAAU,QAAQ,CAAC,EAAE,SAAQ;CACtD;AAED,IAAM,uBAAuBA,GAAE,OAAO;EACpC,MAAMA,GAAE,QAAQ,MAAM;EACtB,MAAMA,GAAE,OAAM;EACd,IAAIA,GAAE,OAAM;EACZ,OAAOA,GAAE,OAAM,EAAG,SAAQ;EAC1B,OAAOA,GAAE,OAAM,EAAG,SAAQ;CAC3B;AAED,IAAM,wBAAwBA,GAAE,OAAO;EACrC,MAAMA,GAAE,QAAQ,QAAQ;EACxB,GAAGA,GAAE,OAAM;;EACX,OAAOA,GAAE,OAAM,EAAG,SAAQ;EAC1B,OAAOA,GAAE,OAAM,EAAG,SAAQ;EAC1B,OAAOA,GAAE,KAAK,CAAC,SAAS,UAAU,QAAQ,CAAC,EAAE,SAAQ;CACtD;AAED,IAAM,mBAAmBA,GAAE,mBAAmB,QAAQ;EACpD;EACA;EACA;CACD;AAGD,IAAM,iBAAiBA,GAAE,OAAO;EAC9B,WAAWA,GAAE,OAAM,EAAG,IAAI,CAAC,EAAE,IAAI,CAAC;CACnC;AAGD,IAAM,kBAAkBA,GAAE,KAAK,CAAC,SAAS,UAAU,QAAQ,CAAC;AAG5D,IAAM,kBAAkBA,GAAE,OAAO;EAC/B,MAAMA,GAAE,QAAQ,OAAO;EACvB,OAAOA,GAAE,OAAM;EACf,OAAOA,GAAE,OAAM,EAAG,SAAQ;EAC1B,OAAOA,GAAE,OAAM,EAAG,SAAQ;EAC1B,OAAO,gBAAgB,SAAQ;EAC/B,MAAM,eAAe,SAAQ;CAC9B;AAGD,IAAM,uBAAuBA,GAAE,OAAO;EACpC,MAAMA,GAAE,QAAQ,YAAY;EAC5B,OAAOA,GAAE,OAAM;EACf,IAAIA,GAAE,OAAM,EAAG,IAAI,CAAC;EACpB,MAAMA,GAAE,OAAM,EAAG,SAAQ;EACzB,OAAOA,GAAE,OAAM,EAAG,SAAQ;EAC1B,OAAOA,GAAE,OAAM,EAAG,SAAQ;EAC1B,OAAO,gBAAgB,SAAQ;EAC/B,MAAM,eAAe,SAAQ;CAC9B;AAGD,IAAM,mBAAmBA,GAAE,OAAO;EAChC,OAAOA,GAAE,OAAM,EAAG,IAAI,CAAC;EACvB,aAAaA,GAAE,OAAM,EAAG,IAAI,CAAC;EAC7B,YAAYA,GAAE,OAAM,EAAG,SAAQ;CAChC;AAGD,IAAM,kBAAkBA,GAAE,OAAO;EAC/B,MAAMA,GAAE,QAAQ,OAAO;EACvB,QAAQ;EACR,OAAOA,GAAE,OAAM,EAAG,SAAQ;EAC1B,OAAOA,GAAE,OAAM,EAAG,SAAQ;EAC1B,OAAO,gBAAgB,SAAQ;EAC/B,MAAM,eAAe,SAAQ;CAC9B;AAGD,IAAM,aAAaA,GAAE,mBAAmB,QAAQ;EAC9C;EACA;EACA;CACD;AAGD,IAAM,gBAAgBA,GAAE,OAAO;EAC7B,OAAOA,GAAE,OAAM;EACf,OAAOA,GAAE,OAAM,EAAG,SAAQ;EAC1B,eAAeA,GAAE,QAAO,EAAG,SAAQ;EACnC,OAAOA,GAAE,OAAM,EAAG,SAAQ;CAC3B;AAGD,IAAM,qBAAqBA,GAAE,OAAO;EAClC,SAASA,GAAE,QAAO,EAAG,QAAQ,IAAI;EACjC,MAAMA,GAAE,QAAO,EAAG,QAAQ,KAAK;EAC/B,OAAOA,GAAE,QAAO,EAAG,QAAQ,KAAK;CACjC;AAGD,IAAM,kBAAkBA,GAAE,OAAO;EAC/B,MAAMA,GAAE,KAAK,CAAC,UAAU,YAAY,SAAS,CAAC;EAC9C,UAAUA,GAAE,OAAM,EAAG,SAAQ;;EAC7B,UAAUA,GAAE,OAAM,EAAG,SAAQ;CAC9B;AAGD,IAAM,sBAAsBA,GAAE,OAAO;EACnC,SAASA,GAAE,QAAO;EAClB,OAAOA,GAAE,OAAM,EAAG,IAAI,CAAC,EAAE,SAAQ;EACjC,QAAQA,GAAE,KAAK,CAAC,UAAU,CAAC,EAAE,SAAQ;EACrC,OAAOA,GAAE,OAAM,EAAG,SAAQ;EAC1B,MAAMA,GAAE,KAAK,CAAC,kBAAkB,UAAU,CAAC;CAC5C,EAAE,OACD,CAAC,SAAS,EAAE,KAAK,SAAS,KAAK,SAC/B,EAAE,SAAS,+DAAyD,CAAE,EACtE,OACA,CAAC,SAAS,KAAK,SAAS,KAAK,QAC7B,EAAE,SAAS,iDAAgD,CAAE;AAI/D,IAAM,iBAAiBA,GAAE,OAAO;EAC9B,OAAOA,GAAE,OAAM,EAAG,IAAI,CAAC;CACxB;AAGD,IAAM,kBAAkBA,GAAE,OAAO;EAC/B,MAAMA,GAAE,QAAQ,KAAK;EACrB,OAAO;EACP,QAAQ;EACR,YAAY,oBAAoB,SAAQ;EACxC,MAAMA,GAAE,OAAM,EAAG,SAAQ;;EACzB,MAAM,cAAc,SAAQ;CAC7B;AAGD,IAAM,oBAAoBA,GAAE,OAAO;EACjC,OAAOA,GAAE,OAAM,EAAG,SAAQ;;EAC1B,OAAOA,GAAE,OAAM,EAAG,SAAQ;EAC1B,QAAQA,GAAE,OAAM,EAAG,SAAQ;CAC5B;AAGD,IAAM,gBAAgBA,GAAE,OAAO;EAC7B,QAAQA,GAAE,OAAM;;EAChB,OAAOA,GAAE,OAAM,EAAG,SAAQ;EAC1B,OAAOA,GAAE,KAAK,CAAC,SAAS,UAAU,QAAQ,CAAC,EAAE,SAAQ;EACrD,SAASA,GAAE,OAAM,EAAG,IAAI,CAAC,EAAE,IAAI,CAAC,EAAE,SAAQ;EAC1C,OAAOA,GAAE,OAAM,EAAG,SAAQ;CAC3B;AAGD,IAAM,4BAA4BA,GAAE,OAAO;EACzC,MAAM;EACN,GAAG;EACH,GAAG,WAAW,SAAQ;EACtB,QAAQ,mBAAmB,SAAQ;EACnC,UAAUA,GAAE,KAAK,CAAC,WAAW,SAAS,CAAC,EAAE,SAAQ;EACjD,aAAaA,GAAE,KAAK,CAAC,YAAY,YAAY,CAAC,EAAE,SAAQ;EACxD,OAAO,YAAY,SAAQ;EAC3B,UAAU,eAAe,SAAQ;EACjC,QAAQ,aAAa,SAAQ;EAC7B,aAAaA,GAAE,MAAM,gBAAgB,EAAE,SAAQ;EAC/C,SAASA,GAAE,MAAM,aAAa,EAAE,SAAQ;EACxC,cAAc,mBAAmB,SAAQ;EACzC,aAAa,kBAAkB,SAAQ;;EACvC,OAAOA,GAAE,MAAM,UAAU,EAAE,SAAQ;CACpC;AAGD,IAAM,uBAAuBA,GAAE,OAAO;EACpC,OAAOA,GAAE,OAAM,EAAG,SAAQ;EAC1B,QAAQA,GAAE,OAAM,EAAG,SAAQ;EAC3B,OAAOA,GAAE,KAAK,CAAC,UAAU,KAAK,CAAC,EAAE,SAAQ;CAC1C;AAED,IAAM,iBAAiBA,GAAE,OAAO;EAC9B,MAAM,qBAAqB,SAAQ;EACnC,OAAO,qBAAqB,SAAQ;CACrC;AAGD,IAAM,yBAAyBA,GAAE,OAAO;EACtC,MAAMA,GAAE,QAAQ,OAAO;EACvB,GAAG;EACH,QAAQ;EACR,UAAUA,GAAE,KAAK,CAAC,WAAW,SAAS,CAAC,EAAE,SAAQ;EACjD,MAAM;EACN,QAAQ,aAAa,SAAQ;EAC7B,cAAc,mBAAmB,SAAQ;EACzC,UAAU,eAAe,SAAQ;EACjC,OAAOA,GAAE,MAAM,UAAU,EAAE,SAAQ;CACpC;AAGD,IAAM,oBAAoBA,GAAE,OAAO;EACjC,OAAOA,GAAE,OAAM,EAAG,IAAI,CAAC;EACvB,KAAKA,GAAE,OAAM,EAAG,SAAQ;EACxB,KAAKA,GAAE,OAAM,EAAG,SAAQ;EACxB,OAAOA,GAAE,OAAM,EAAG,SAAQ;CAC3B;AAGD,IAAM,qBAAqBA,GAAE,OAAO;EAClC,OAAOA,GAAE,OAAM,EAAG,IAAI,CAAC;CACxB;AAGD,IAAM,mBAAmBA,GAAE,OAAO;EAChC,MAAMA,GAAE,QAAQ,QAAQ;EACxB,eAAeA,GAAE,QAAO,EAAG,SAAQ;EACnC,gBAAgBA,GAAE,QAAO,EAAG,SAAQ;CACrC;AAGD,IAAM,2BAA2BA,GAAE,OAAO;EACxC,MAAMA,GAAE,QAAQ,SAAS;EACzB,GAAG;EACH,GAAG;EACH,MAAM,kBAAkB,SAAQ;EAChC,OAAO,mBAAmB,SAAQ;EAClC,YAAY,iBAAiB,SAAQ;EACrC,OAAO,YAAY,SAAQ;EAC3B,QAAQ,aAAa,SAAQ;EAC7B,cAAc,mBAAmB,SAAQ;CAC1C;AAGD,IAAM,2BAA2BA,GAAE,OAAO;EACxC,MAAMA,GAAE,QAAQ,SAAS;EACzB,GAAG;EACH,GAAG;EACH,OAAOA,GAAE,OAAO;IACd,OAAOA,GAAE,OAAM,EAAG,IAAI,CAAC;IACvB,OAAOA,GAAE,OAAM,EAAG,SAAQ;GAC3B;EACD,aAAaA,GAAE,OAAO;IACpB,KAAKA,GAAE,OAAM,EAAG,SAAQ;IACxB,KAAKA,GAAE,OAAM,EAAG,SAAQ;GACzB,EAAE,SAAQ;EACX,aAAaA,GAAE,QAAO,EAAG,SAAQ;CAClC;AAGD,IAAM,0BAA0BA,GAAE,OAAO;EACvC,MAAMA,GAAE,QAAQ,QAAQ;EACxB,OAAOA,GAAE,OAAO,EAAE,OAAOA,GAAE,OAAM,EAAG,IAAI,CAAC,EAAC,CAAE;EAC5C,OAAOA,GAAE,OAAO,EAAE,OAAOA,GAAE,OAAM,EAAG,IAAI,CAAC,EAAC,CAAE;EAC5C,iBAAiBA,GAAE,QAAO,EAAG,SAAQ;EACrC,OAAO,YAAY,SAAQ;CAC5B;AAGD,IAAM,6BAA6BA,GAAE,OAAO;EAC1C,MAAMA,GAAE,QAAQ,WAAW;EAC3B,UAAUA,GAAE,OAAO,EAAE,OAAOA,GAAE,OAAM,EAAG,IAAI,CAAC,EAAC,CAAE;EAC/C,OAAOA,GAAE,OAAO,EAAE,OAAOA,GAAE,OAAM,EAAG,IAAI,CAAC,EAAC,CAAE;EAC5C,aAAaA,GAAE,OAAM,EAAG,SAAQ;EAChC,QAAQ,uBAAuB,SAAQ;;EACvC,QAAQA,GAAE,OAAO;IACf,UAAUA,GAAE,OAAM,EAAG,SAAQ;IAC7B,UAAUA,GAAE,OAAM,EAAG,SAAQ;IAC7B,OAAOA,GAAE,OAAM,EAAG,SAAQ;GAC3B,EAAE,SAAQ;CACZ;AAGD,IAAM,0BAA0BA,GAAE,OAAO;EACvC,MAAMA,GAAE,QAAQ,QAAQ;EACxB,QAAQA,GAAE,OAAO,EAAE,OAAOA,GAAE,OAAM,EAAG,IAAI,CAAC,EAAC,CAAE;EAC7C,QAAQA,GAAE,OAAO,EAAE,OAAOA,GAAE,OAAM,EAAG,IAAI,CAAC,EAAC,CAAE;EAC7C,OAAOA,GAAE,OAAO,EAAE,OAAOA,GAAE,OAAM,EAAG,IAAI,CAAC,EAAC,CAAE;EAC5C,QAAQA,GAAE,MAAMA,GAAE,MAAMA,GAAE,OAAM,CAAE,CAAC,EAAE,SAAQ;EAC7C,QAAQA,GAAE,KAAK,CAAC,cAAc,UAAU,CAAC,EAAE,SAAQ;EACnD,YAAYA,GAAE,OAAM,EAAG,SAAQ,EAAG,SAAQ;EAC1C,UAAUA,GAAE,OAAM,EAAG,YAAW,EAAG,SAAQ;EAC3C,gBAAgBA,GAAE,KAAK,CAAC,QAAQ,SAAS,OAAO,UAAU,QAAQ,CAAC,EAAE,SAAQ;CAC9E;AAID,IAAM,uBAAuBA,GAAE,OAAO;EACpC,OAAOA,GAAE,OAAM;EACf,OAAOA,GAAE,OAAM;CAChB;AAED,IAAM,yBAAyBA,GAAE,OAAO;EACtC,MAAMA,GAAE,QAAQ,OAAO;EACvB,OAAOA,GAAE,OAAO,EAAE,OAAOA,GAAE,OAAM,EAAG,IAAI,CAAC,EAAC,CAAE;EAC5C,KAAKA,GAAE,OAAM,EAAG,SAAQ;EACxB,KAAKA,GAAE,OAAM,EAAG,SAAQ;EACxB,MAAMA,GAAE,OAAM,EAAG,SAAQ;EACzB,YAAYA,GAAE,MAAM,oBAAoB,EAAE,SAAQ;EAClD,QAAQA,GAAE,OAAM,EAAG,SAAQ;EAC3B,MAAM,cAAc,SAAQ;CAC7B;AAED,IAAM,2BAA2BA,GAAE,KAAK,CAAC,OAAO,OAAO,OAAO,OAAO,OAAO,CAAC;AAE7E,IAAM,uBAAuBA,GAAE,KAAK,CAAC,OAAO,OAAO,OAAO,OAAO,OAAO,CAAC;AAEzE,IAAM,mBAAmBA,GAAE,OAAO;EAChC,OAAOA,GAAE,OAAM,EAAG,IAAI,CAAC;EACvB,WAAW,qBAAqB,QAAQ,KAAK;EAC7C,QAAQA,GAAE,OAAM,EAAG,SAAQ;EAC3B,SAASA,GAAE,QAAO,EAAG,SAAQ;CAC9B;AAED,IAAM,qBAAqBA,GAAE,OAAO;EAClC,OAAOA,GAAE,OAAM,EAAG,SAAQ;EAC1B,OAAOA,GAAE,KAAK,CAAC,UAAU,QAAQ,CAAC,EAAE,SAAQ;CAC7C;AAED,IAAM,oBAAoBA,GAAE,OAAO;EACjC,MAAMA,GAAE,MAAMA,GAAE,OAAM,EAAG,IAAI,CAAC,CAAC,EAAE,IAAI,CAAC;EACtC,SAASA,GAAE,OAAM,EAAG,IAAI,CAAC;EACzB,QAAQA,GAAE,MAAM,gBAAgB,EAAE,IAAI,CAAC;EACvC,WAAWA,GAAE,QAAO,EAAG,SAAQ;EAC/B,aAAaA,GAAE,QAAO,EAAG,SAAQ;EACjC,SAAS,mBAAmB,SAAQ;CACrC;AAED,IAAM,yBAAyBA,GAAE,OAAO;EACtC,MAAMA,GAAE,QAAQ,OAAO;EACvB,SAASA,GAAE,MAAMA,GAAE,OAAO;IACxB,OAAOA,GAAE,OAAM,EAAG,IAAI,CAAC;IACvB,OAAOA,GAAE,OAAM,EAAG,SAAQ;IAC1B,QAAQA,GAAE,OAAM,EAAG,SAAQ;IAC3B,QAAQA,GAAE,QAAO,EAAG,SAAQ;IAC5B,SAAS,yBAAyB,SAAQ;IAC1C,UAAUA,GAAE,KAAK,CAAC,YAAY,QAAQ,QAAQ,CAAC,EAAE,SAAQ;IACzD,MAAMA,GAAE,KAAK,CAAC,MAAM,CAAC,EAAE,SAAQ;GAChC,CAAC,EAAE,SAAQ;EACZ,SAASA,GAAE,OAAO;IAChB,OAAOA,GAAE,OAAM,EAAG,SAAQ;GAC3B,EAAE,SAAQ;EACX,MAAMA,GAAE,OAAO;IACb,OAAOA,GAAE,OAAM,EAAG,IAAI,CAAC;IACvB,WAAWA,GAAE,KAAK,CAAC,OAAO,MAAM,CAAC,EAAE,SAAQ;GAC5C,EAAE,SAAQ;EACX,YAAYA,GAAE,OAAO;IACnB,SAASA,GAAE,QAAO,EAAG,SAAQ;IAC7B,WAAWA,GAAE,OAAM,EAAG,IAAG,EAAG,SAAQ,EAAG,SAAQ;IAC/C,MAAMA,GAAE,KAAK,CAAC,aAAa,iBAAiB,CAAC,EAAE,SAAQ;IACvD,aAAaA,GAAE,QAAO,EAAG,SAAQ;GAClC,EAAE,SAAQ;EACX,UAAUA,GAAE,OAAM,EAAG,IAAG,EAAG,SAAQ,EAAG,SAAQ;EAC9C,QAAQA,GAAE,OAAO;IACf,SAASA,GAAE,QAAO,EAAG,SAAQ;IAC7B,UAAUA,GAAE,OAAM,EAAG,IAAG,EAAG,SAAQ,EAAG,SAAQ;GAC/C,EAAE,SAAQ;EACX,OAAO,kBAAkB,SAAQ;CAClC;AAGD,IAAM,oBAAoBA,GAAE,MAAM;EAChC;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;CACD;AAGD,IAAM,sBAAsBA,GAAE,KAAK;EACjC;EACA;EACA;EACA;EACA;EACA;EACA;CACD;AAGD,IAAM,wBAAwBA,GAAE,MAAM;EACpCA,GAAE,OAAM;EACRA,GAAE,OAAO;IACP,OAAOA,GAAE,OAAM;IACf,OAAOA,GAAE,OAAM;GAChB;CACF;AAGD,IAAM,wBAAwBA,GAAE,OAAO;EACrC,OAAOA,GAAE,OAAM;EACf,aAAaA,GAAE,OAAM;EACrB,aAAaA,GAAE,OAAM;CACtB;AAGD,IAAM,kBAAkBA,GAAE,OAAO;EAC/B,MAAMA,GAAE,OAAM,EAAG,IAAI,CAAC;EACtB,MAAM;EACN,OAAOA,GAAE,OAAM,EAAG,SAAQ;EAC1B,aAAaA,GAAE,OAAM,EAAG,SAAQ;EAChC,SAASA,GAAE,MAAM,CAACA,GAAE,OAAM,GAAIA,GAAE,OAAM,GAAIA,GAAE,MAAMA,GAAE,OAAM,CAAE,CAAC,CAAC,EAAE,SAAQ;EACxE,SAASA,GAAE,MAAM,qBAAqB,EAAE,SAAQ;EAChD,QAAQ,sBAAsB,SAAQ;CACvC;AAGD,IAAM,eAAeA,GAAE,OAAO;EAC5B,OAAOA,GAAE,OAAM,EAAG,SAAQ;EAC1B,KAAKA,GAAE,OAAM,EAAG,SAAQ;CACzB,EAAE,OACD,CAAC,SAAS,KAAK,UAAU,UAAa,KAAK,QAAQ,QACnD,EAAE,SAAS,0CAAyC,CAAE,EACtD,OACA,CAAC,SAAS,EAAE,KAAK,UAAU,UAAa,KAAK,QAAQ,SACrD,EAAE,SAAS,2CAA0C,CAAE;AAIzD,IAAM,gBAAgBA,GAAE,OAAO;EAC7B,UAAUA,GAAE,OAAM,EAAG,SAAQ;;EAC7B,UAAUA,GAAE,OAAM,EAAG,SAAQ;EAC7B,WAAWA,GAAE,OAAM,EAAG,SAAQ;;CAC/B;AAGD,IAAM,wBAAwBA,GAAE,OAAO;EACrC,OAAOA,GAAE,OAAM,EAAG,IAAI,CAAC;EACvB,OAAOA,GAAE,OAAM,EAAG,SAAQ;EAC1B,QAAQA,GAAE,OAAM,EAAG,SAAQ;CAC5B;AAGD,IAAM,wBAAwBA,GAAE,OAAO;EACrC,OAAOA,GAAE,OAAM,EAAG,SAAQ;;EAC1B,OAAOA,GAAE,OAAM,EAAG,SAAQ;;EAC1B,OAAOA,GAAE,OAAM,EAAG,SAAQ;;EAC1B,QAAQA,GAAE,MAAM,CAACA,GAAE,OAAM,GAAIA,GAAE,MAAMA,GAAE,OAAM,CAAE,CAAC,CAAC,EAAE,SAAQ;;EAC3D,SAASA,GAAE,MAAM,qBAAqB,EAAE,SAAQ;;CACjD,EAAE,OAAO,UAAQ,KAAK,SAAS,KAAK,SAAS,KAAK,SAAS;EAC1D,SAAS;CACV;AAGM,IAAM,cAAcA,GAAE,OAAO;;EAElC,MAAMA,GAAE,OAAM,EAAG,IAAI,CAAC;EACtB,OAAOA,GAAE,OAAM,EAAG,IAAI,CAAC;EACvB,aAAaA,GAAE,OAAM,EAAG,SAAQ;;EAGhC,OAAOA,GAAE,OAAM,EAAG,SAAQ;EAC1B,MAAMA,GAAE,MAAMA,GAAE,OAAM,CAAE,EAAE,SAAQ;EAClC,SAASA,GAAE,OAAM,EAAG,SAAQ;EAC5B,SAASA,GAAE,OAAM,EAAG,SAAQ;;EAG5B,QAAQ;EACR,YAAYA,GAAE,MAAM,eAAe,EAAE,SAAQ;;EAG7C,OAAO;;EAGP,SAAS,cAAc,SAAQ;;EAG/B,WAAW,sBAAsB,SAAQ;CAC1C;;;AC5jBD,SAAS,KAAAC,UAAS;;;ACAlB,SAAS,KAAAC,UAAS;AAIX,IAAM,oBAAoBA,GAAE,KAAK,CAAC,OAAO,SAAS,OAAO,OAAO,OAAO,gBAAgB,CAAC;AAExF,IAAM,sBAAsBA,GAAE,KAAK,CAAC,UAAU,UAAU,QAAQ,SAAS,CAAC;AAE1E,IAAM,gBAAgBA,GAAE,OAAO;EACpC,MAAMA,GAAE,OAAM;EACd,MAAM;EACN,aAAaA,GAAE,OAAM,EAAG,SAAQ;EAChC,QAAQA,GAAE,OAAM,EAAG,SAAQ;CAC5B;AAEM,IAAM,kBAAkBA,GAAE,OAAO;EACtC,MAAMA,GAAE,OAAM;EACd,MAAM;EACN,aAAaA,GAAE,OAAM,EAAG,SAAQ;CACjC;AAEM,IAAM,uBAAuBA,GAAE,OAAO;EAC3C,MAAMA,GAAE,OAAM;EACd,aAAaA,GAAE,OAAM,EAAG,SAAQ;EAChC,QAAQA,GAAE,KAAK,CAAC,WAAW,OAAO,CAAC;EACnC,cAAcA,GAAE,OAAM;EACtB,UAAUA,GAAE,MAAM,aAAa;EAC/B,YAAYA,GAAE,MAAM,eAAe;EACnC,YAAYA,GAAE,MAAMA,GAAE,OAAO;IAC3B,MAAMA,GAAE,OAAM;IACd,MAAMA,GAAE,OAAM;IACd,SAASA,GAAE,MAAM,CAACA,GAAE,OAAM,GAAIA,GAAE,OAAM,CAAE,CAAC,EAAE,SAAQ;IACnD,SAASA,GAAE,MAAMA,GAAE,OAAM,CAAE,EAAE,SAAQ;GACtC,CAAC,EAAE,SAAQ;CACb;AAEM,IAAM,qBAAqBA,GAAE,OAAO;EACzC,MAAMA,GAAE,OAAO,EAAE,QAAQA,GAAE,OAAM,GAAI,OAAOA,GAAE,OAAM,EAAE,CAAE;EACxD,IAAIA,GAAE,OAAO,EAAE,QAAQA,GAAE,OAAM,GAAI,OAAOA,GAAE,OAAM,EAAE,CAAE;EACtD,MAAMA,GAAE,KAAK,CAAC,eAAe,eAAe,YAAY,CAAC;CAC1D;AAEM,IAAM,sBAAsBA,GAAE,OAAO;EAC1C,UAAUA,GAAE,MAAM,oBAAoB;EACtC,eAAeA,GAAE,MAAM,kBAAkB;EACzC,cAAcA,GAAE,OAAM;CACvB;AAIM,IAAM,+BAA+BA,GAAE,KAAK;EACjD;EAAU;EAAc;EAAY;EAAM;EAAO;EAAM;EAAO;EAAM;CACrE;AAEM,IAAM,uBAAuBA,GAAE,OAAO;EAC3C,WAAWA,GAAE,OAAM;EACnB,UAAU;EACV,OAAOA,GAAE,MAAM,CAACA,GAAE,OAAM,GAAIA,GAAE,OAAM,GAAIA,GAAE,QAAO,GAAIA,GAAE,MAAMA,GAAE,MAAM,CAACA,GAAE,OAAM,GAAIA,GAAE,OAAM,CAAE,CAAC,CAAC,CAAC,CAAC;CACjG;AAEM,IAAM,sBAAsBA,GAAE,OAAO;EAC1C,OAAOA,GAAE,OAAM;EACf,UAAUA,GAAE,MAAMA,GAAE,OAAM,CAAE,EAAE,IAAI,CAAC;EACnC,YAAYA,GAAE,MAAMA,GAAE,OAAM,CAAE,EAAE,SAAQ,EAAG,QAAQ,CAAA,CAAE;EACrD,YAAYA,GAAE,OAAOA,GAAE,MAAM,CAACA,GAAE,OAAM,GAAIA,GAAE,OAAM,CAAE,CAAC,CAAC,EAAE,SAAQ;EAChE,SAASA,GAAE,MAAM,oBAAoB,EAAE,SAAQ,EAAG,QAAQ,CAAA,CAAE;EAC5D,UAAUA,GAAE,OAAO;IACjB,OAAOA,GAAE,OAAM;IACf,WAAWA,GAAE,KAAK,CAAC,OAAO,MAAM,CAAC,EAAE,QAAQ,KAAK;GACjD,EAAE,SAAQ;EACX,OAAOA,GAAE,OAAM,EAAG,IAAG,EAAG,SAAQ,EAAG,IAAI,GAAK,EAAE,SAAQ,EAAG,QAAQ,GAAI;CACtE;AAIM,IAAM,uBAAuBA,GAAE,OAAO;EAC3C,SAASA,GAAE,OAAO;IAChB,OAAOA,GAAE,MAAMA,GAAE,OAAM,CAAE,EAAE,QAAQ,CAAC,SAAS,UAAU,OAAO,CAAC;IAC/D,UAAUA,GAAE,MAAMA,GAAE,OAAM,CAAE,EAAE,QAAQ,CAAC,QAAQ,QAAQ,OAAO,CAAC;GAChE,EAAE,SAAQ,EAAG,QAAQ;IACpB,OAAO,CAAC,SAAS,UAAU,OAAO;IAClC,UAAU,CAAC,QAAQ,QAAQ,OAAO;GACnC;CACF,EAAE,SAAQ;;;AD/EX,IAAM,iBAAiBC,GAAE,OAAO;EAC9B,YAAYA,GAAE,OAAM,EAAG,SAAQ;EAC/B,OAAOA,GAAE,OAAM,EAAG,SAAQ;EAC1B,UAAUA,GAAE,OAAM,EAAG,SAAQ;EAC7B,WAAWA,GAAE,OAAM,EAAG,SAAQ;EAC9B,UAAUA,GAAE,OAAM,EAAG,IAAG,EAAG,SAAQ;EACnC,YAAYA,GAAE,KAAK,CAAC,UAAU,UAAU,WAAW,aAAa,YAAY,UAAU,UAAU,CAAC,EAAE,SAAQ;EAC3G,OAAOA,GAAE,OAAO;IACd,kBAAkBA,GAAE,OAAM,EAAG,IAAG,EAAG,SAAQ,EAAG,SAAQ;IACtD,iBAAiBA,GAAE,OAAM,EAAG,IAAG,EAAG,SAAQ,EAAG,SAAQ;GACtD,EAAE,SAAQ;CACZ;AAGD,IAAM,YAAYA,GAAE,OAAO;EACzB,UAAUA,GAAE,KAAK,CAAC,UAAU,UAAU,WAAW,CAAC,EAAE,SAAQ;EAC5D,MAAMA,GAAE,OAAM,EAAG,SAAQ;EACzB,QAAQA,GAAE,OAAM,EAAG,SAAQ;EAC3B,kBAAkBA,GAAE,QAAO,EAAG,SAAQ;CACvC;AAGD,IAAM,oBAAoBA,GAAE,OAAO;EACjC,WAAWA,GAAE,OAAM;EACnB,eAAeA,GAAE,OAAM;EACvB,QAAQA,GAAE,OAAM,EAAG,SAAQ;EAC3B,QAAQA,GAAE,OAAM,EAAG,SAAQ;EAC3B,cAAcA,GAAE,OAAM,EAAG,SAAQ;CAClC;AAGD,IAAMC,cAAaD,GAAE,OAAO;EAC1B,SAASA,GAAE,QAAO;EAClB,SAASA,GAAE,OAAM,EAAG,SAAQ;EAC5B,aAAaA,GAAE,OAAM,EAAG,SAAQ;EAChC,WAAWA,GAAE,OAAO;IAClB,QAAQ,kBAAkB,SAAQ;IAClC,WAAW,kBAAkB,SAAQ;IACrC,MAAM,kBAAkB,SAAQ;GACjC,EAAE,SAAQ;CACZ;AAGD,IAAM,iBAAiBA,GAAE,OAAO;EAC9B,mBAAmBA,GAAE,QAAO,EAAG,SAAQ;EACvC,mBAAmBA,GAAE,QAAO,EAAG,SAAQ;EACvC,mBAAmBA,GAAE,QAAO,EAAG,SAAQ;EACvC,MAAMA,GAAE,QAAO,EAAG,SAAQ;CAC3B;AAGD,IAAM,oBAAoBA,GAAE,OAAO;EACjC,OAAOA,GAAE,OAAM;EACf,KAAKA,GAAE,OAAM;EACb,MAAMA,GAAE,OAAM,EAAG,SAAQ;CAC1B;AAGD,IAAM,sBAAsBA,GAAE,OAAO;EACnC,MAAMA,GAAE,QAAO,EAAG,SAAQ;EAC1B,WAAWA,GAAE,QAAO,EAAG,SAAQ;EAC/B,OAAOA,GAAE,MAAM,iBAAiB,EAAE,SAAQ;EAC1C,UAAUA,GAAE,OAAO;IACjB,YAAYA,GAAE,QAAO,EAAG,SAAQ;IAChC,QAAQA,GAAE,QAAO,EAAG,SAAQ;GAC7B,EAAE,SAAQ;CACZ;AAGD,IAAM,eAAeA,GAAE,OAAO;EAC5B,SAASA,GAAE,OAAM,EAAG,SAAQ;EAC5B,YAAYA,GAAE,OAAM,EAAG,SAAQ;EAC/B,SAASA,GAAE,OAAM,EAAG,SAAQ;EAC5B,SAASA,GAAE,OAAM,EAAG,SAAQ;EAC5B,MAAMA,GAAE,OAAM,EAAG,SAAQ;CAC1B;AAGD,IAAM,cAAcA,GAAE,OAAO;EAC3B,SAASA,GAAE,OAAM,EAAG,SAAQ;EAC5B,MAAMA,GAAE,OAAM,EAAG,SAAQ;EACzB,MAAMA,GAAE,OAAM,EAAG,SAAQ;EACzB,MAAMA,GAAE,KAAK,CAAC,WAAW,WAAW,aAAa,CAAC,EAAE,SAAQ;CAC7D;AAGD,IAAM,aAAaA,GAAE,MAAM;EACzBA,GAAE,OAAM;EACRA,GAAE,OAAO;IACP,OAAOA,GAAE,OAAM;IACf,MAAMA,GAAE,OAAM;GACf;CACF;AAGD,IAAM,cAAcA,GAAE,OAAO;EAC3B,MAAMA,GAAE,KAAK,CAAC,SAAS,QAAQ,MAAM,CAAC,EAAE,SAAQ;EAChD,MAAMA,GAAE,KAAK,CAAC,UAAU,aAAa,SAAS,CAAC,EAAE,SAAQ;EACzD,MAAM,WAAW,SAAQ;EACzB,SAASA,GAAE,OAAM,EAAG,SAAQ;EAC5B,OAAOA,GAAE,OAAM,EAAG,SAAQ;EAC1B,QAAQ,aAAa,SAAQ;EAC7B,SAASA,GAAE,MAAMA,GAAE,OAAM,CAAE,EAAE,SAAQ;EACrC,UAAUA,GAAE,QAAO,EAAG,QAAQ,KAAK;EACnC,SAASA,GAAE,OAAM,EAAG,IAAI,CAAC,EAAE,IAAI,CAAC,EAAE,QAAQ,CAAG;EAC7C,OAAO,YAAY,SAAQ;EAC3B,SAAS,oBAAoB,SAAQ;EACrC,WAAWA,GAAE,OAAM,EAAG,SAAQ;CAC/B;AAGD,IAAM,4BAA4BA,GAAE,OAAO;EACzC,UAAU,eAAe,SAAQ;EACjC,KAAK,UAAU,SAAQ;EACvB,MAAMC,YAAW,SAAQ;EACzB,UAAU,eAAe,SAAQ;EACjC,OAAO,YAAY,SAAQ;EAC3B,UAAU,qBAAqB,SAAQ;CACxC,EAAE,YAAW;AAMR,SAAU,UACd,MACA,UAA6C;AAE7C,MAAI,CAAC;AAAU,WAAO,EAAE,GAAG,KAAI;AAE/B,QAAM,SAAS,EAAE,GAAG,KAAI;AACxB,aAAW,CAAC,KAAK,KAAK,KAAK,OAAO,QAAQ,QAAQ,GAAG;AACnD,QACE,UAAU,QACV,OAAO,UAAU,YACjB,CAAC,MAAM,QAAQ,KAAK,KACpB,OAAO,OAAO,GAAG,MAAM,YACvB,OAAO,GAAG,MAAM,QAChB,CAAC,MAAM,QAAQ,OAAO,GAAG,CAAC,GAC1B;AACA,aAAO,GAAG,IAAI,UACZ,OAAO,GAAG,GACV,KAAgC;IAEpC,OAAO;AACL,aAAO,GAAG,IAAI;IAChB;EACF;AACA,SAAO;AACT;AAQM,SAAU,qBACd,KACA,KAAY;AAEZ,QAAM,EAAE,cAAc,GAAG,KAAI,IAAK;AAClC,QAAM,YAAY;AAClB,QAAM,cAAc,MAAM,YAAY,GAAG,IAAI;AAC7C,SAAO,UAAU,MAAiC,WAAW;AAC/D;AAGA,IAAM,uBAAuBD,GAAE,OAAO;EACpC,SAASA,GAAE,MAAMA,GAAE,OAAM,CAAE,EAAE,SAAQ;EACrC,MAAMA,GAAE,MAAMA,GAAE,OAAM,CAAE,EAAE,SAAQ;CACnC;AAED,IAAM,sBAAsBA,GAAE,OAAO;EACnC,SAAS,qBAAqB,SAAQ;CACvC;AAKM,IAAM,gBAAgBA,GAAE,OAAO;EACpC,SAASA,GAAE,OAAM,EAAG,IAAI,CAAC;EACzB,MAAMA,GAAE,OAAM,EAAG,IAAI,CAAC;EACtB,aAAaA,GAAE,OAAM,EAAG,SAAQ;EAEhC,UAAU,eAAe,SAAQ;EAEjC,cAAcA,GAAE,OAAOA,GAAE,OAAM,GAAI,yBAAyB,EAAE,SAAQ;EAEtE,KAAK,UAAU,SAAQ;EACvB,MAAMC,YAAW,SAAQ;EACzB,UAAU,eAAe,SAAQ;EACjC,OAAO,YAAY,SAAQ;EAC3B,UAAU;EACV,SAAS,oBAAoB,SAAQ;CACtC;;;AEvMD,SAAS,KAAAC,UAAS;AAGlB,IAAM,kBAAkBA,GAAE,KAAK,CAAC,UAAU,UAAU,QAAQ,WAAW,YAAY,UAAU,CAAC;AAG9F,IAAM,mBAAmBA,GAAE,OAAO;EAChC,MAAMA,GAAE,OAAM,EAAG,IAAI,CAAC;EACtB,MAAM;EACN,SAASA,GAAE,OAAM,EAAG,SAAQ;EAC5B,SAASA,GAAE,MAAMA,GAAE,OAAM,CAAE,EAAE,SAAQ;;EACrC,aAAaA,GAAE,OAAM,EAAG,SAAQ;CACjC;AAGD,IAAM,qBAAqBA,GAAE,OAAO;EAClC,MAAMA,GAAE,OAAM,EAAG,IAAI,CAAC;EACtB,MAAMA,GAAE,OAAM;EACd,aAAaA,GAAE,OAAM,EAAG,SAAQ;CACjC;AAGM,IAAM,sBAAsBA,GAAE,OAAO;EAC1C,MAAMA,GAAE,OAAM,EAAG,IAAI,CAAC;EACtB,aAAaA,GAAE,OAAM,EAAG,SAAQ;EAChC,OAAOA,GAAE,OAAM,EAAG,SAAQ;EAC1B,MAAMA,GAAE,MAAMA,GAAE,OAAM,CAAE,EAAE,SAAQ;EAElC,QAAQA,GAAE,MAAM,gBAAgB,EAAE,SAAQ;EAC1C,SAASA,GAAE,MAAM,kBAAkB,EAAE,SAAQ;EAC7C,OAAOA,GAAE,MAAMA,GAAE,OAAM,CAAE,EAAE,SAAQ;;CACpC;AAGM,IAAM,cAAcA,GAAE,OAAO;EAClC,UAAU;EACV,KAAKA,GAAE,OAAM,EAAG,IAAI,CAAC;EACrB,UAAUA,GAAE,OAAM,EAAG,SAAQ;CAC9B;;;ACtCD,SAAS,KAAAC,UAAS;AAIlB,IAAM,oBAAoBC,GAAE,OAAO;EACjC,MAAMA,GAAE,QAAQ,OAAO;EACvB,KAAKA,GAAE,OAAM,EAAG,IAAI,CAAC;EACrB,MAAMA,GAAE,OAAM,EAAG,IAAI,CAAC,EAAE,IAAI,EAAE;EAC9B,QAAQA,GAAE,OAAM,EAAG,IAAI,EAAE,EAAE,SAAQ;EACnC,GAAGA,GAAE,OAAM,EAAG,IAAI,CAAC,EAAE,IAAI,EAAE,EAAE,SAAQ;EACrC,GAAGA,GAAE,OAAM,EAAG,IAAI,CAAC,EAAE,SAAQ;CAC9B;AAED,IAAM,mBAAmBA,GAAE,OAAO;EAChC,MAAMA,GAAE,QAAQ,MAAM;EACtB,SAASA,GAAE,OAAM;EACjB,MAAMA,GAAE,OAAM,EAAG,IAAI,CAAC,EAAE,IAAI,EAAE;EAC9B,QAAQA,GAAE,OAAM,EAAG,IAAI,EAAE,EAAE,SAAQ;EACnC,GAAGA,GAAE,OAAM,EAAG,IAAI,CAAC,EAAE,IAAI,EAAE,EAAE,SAAQ;EACrC,GAAGA,GAAE,OAAM,EAAG,IAAI,CAAC,EAAE,SAAQ;CAC9B;AAED,IAAM,eAAeA,GAAE,mBAAmB,QAAQ;EAChD;EACA;CACD;AAGD,IAAM,YAAYA,GAAE,OAAO;EACzB,QAAQA,GAAE,OAAM,EAAG,IAAI,EAAE;EACzB,SAASA,GAAE,MAAM,YAAY,EAAE,IAAI,CAAC;CACrC;AAGD,IAAM,eAAeA,GAAE,OAAO;EAC5B,KAAKA,GAAE,OAAM,EAAG,IAAI,CAAC,EAAE,QAAQ,EAAE;EACjC,MAAMA,GAAE,MAAM,SAAS,EAAE,IAAI,CAAC;CAC/B;AAGD,IAAM,YAAYA,GAAE,OAAO;EACzB,MAAMA,GAAE,OAAM,EAAG,IAAI,CAAC;EACtB,OAAOA,GAAE,OAAM,EAAG,IAAI,CAAC;EACvB,SAASA,GAAE,MAAM,eAAe,EAAE,SAAQ;EAC1C,QAAQ;CACT;AAGM,IAAM,kBAAkBA,GAAE,OAAO;;EAEtC,MAAMA,GAAE,OAAM,EAAG,IAAI,CAAC;EACtB,OAAOA,GAAE,OAAM,EAAG,IAAI,CAAC;EACvB,aAAaA,GAAE,OAAM,EAAG,SAAQ;;EAGhC,SAASA,GAAE,MAAM,eAAe,EAAE,SAAQ;;EAG1C,QAAQ,aAAa,SAAQ;;EAG7B,MAAMA,GAAE,MAAM,SAAS,EAAE,IAAI,CAAC,EAAE,SAAQ;CACzC,EAAE,YAAY,CAAC,MAAM,QAAO;AAC3B,MAAI,KAAK,UAAU,KAAK,MAAM;AAC5B,QAAI,SAAS;MACX,MAAMA,GAAE,aAAa;MACrB,SAAS;MACT,MAAM,CAAC,MAAM;KACd;EACH;AACA,MAAI,CAAC,KAAK,UAAU,CAAC,KAAK,MAAM;AAC9B,QAAI,SAAS;MACX,MAAMA,GAAE,aAAa;MACrB,SAAS;MACT,MAAM,CAAA;KACP;EACH;AACF,CAAC;;;AC7ED,SAAS,KAAAC,UAAS;AAElB,IAAM,qBAAqBA,GAAE,OAAO;EAClC,aAAaA,GAAE,OAAM,EAAG,IAAI,CAAC;EAC7B,SAASA,GAAE,OAAM,EAAG,SAAQ;CAC7B;AAED,IAAM,gBAAgBA,GAAE,OAAO;EAC7B,OAAO;CACR;AAED,IAAM,0BAA0BA,GAAE,KAAK,CAAC,MAAM,MAAM,OAAO,OAAO,IAAI,CAAC;AAEvE,IAAM,kBAAkBA,GAAE,OAAO;EAC/B,OAAOA,GAAE,OAAM,EAAG,IAAI,CAAC;EACvB,UAAU;EACV,OAAOA,GAAE,OAAM;CAChB;AAED,IAAM,uBAAuBA,GAAE,OAAO;EACpC,MAAMA,GAAE,OAAM,EAAG,IAAI,CAAC;EACtB,MAAMA,GAAE,QAAQ,QAAQ;EACxB,UAAUA,GAAE,OAAM,EAAG,IAAI,CAAC;EAC1B,UAAUA,GAAE,OAAM,EAAG,SAAQ;EAC7B,SAAS;EACT,QAAQA,GAAE,MAAMA,GAAE,OAAM,EAAG,IAAI,CAAC,CAAC,EAAE,IAAI,CAAC;EACxC,QAAQA,GAAE,OAAOA,GAAE,QAAO,CAAE,EAAE,SAAQ;EACtC,SAASA,GAAE,OAAM,EAAG,SAAQ;EAC5B,iBAAiBA,GAAE,QAAO,EAAG,SAAQ;CACtC;AAED,IAAM,sBAAsBA,GAAE,OAAO;EACnC,MAAMA,GAAE,OAAM,EAAG,IAAI,CAAC;EACtB,MAAMA,GAAE,QAAQ,OAAO;EACvB,UAAUA,GAAE,OAAM,EAAG,IAAI,CAAC;EAC1B,UAAUA,GAAE,OAAM,EAAG,SAAQ;EAC7B,SAAS;EACT,OAAOA,GAAE,OAAM,EAAG,IAAI,CAAC;EACvB,QAAQA,GAAE,OAAOA,GAAE,QAAO,CAAE,EAAE,SAAQ;EACtC,WAAW;EACX,UAAUA,GAAE,OAAM,EAAG,SAAQ;EAC7B,SAASA,GAAE,OAAM,EAAG,SAAQ;EAC5B,iBAAiBA,GAAE,QAAO,EAAG,SAAQ;CACtC;AAEM,IAAM,iBAAiBA,GAAE,mBAAmB,QAAQ;EACzD;EACA;CACD;;;AChDD,SAAS,KAAAC,UAAS;AAEX,IAAM,cAAcA,GAAE,OAAO;EAClC,MAAMA,GAAE,OAAM;EACd,SAASA,GAAE,OAAM,EAAG,SAAQ;EAC5B,OAAOA,GAAE,OAAM;EACf,aAAaA,GAAE,OAAM,EAAG,SAAQ;EAChC,OAAOA,GAAE,OAAM,EAAG,SAAQ;EAC1B,QAAQA,GAAE,MAAMA,GAAE,OAAM,CAAE,EAAE,SAAQ;CACrC;AAEM,IAAM,mBAAmBA,GAAE,OAAO;EACvC,QAAQA,GAAE,MAAM,WAAW,EAAE,QAAQ,CAAA,CAAE;CACxC;;;ACbD,SAAS,KAAAC,UAAS;AAMX,IAAM,wBAAwBA,GAAE,OAAO;EAC5C,MAAMA,GAAE,OAAM;EACd,OAAOA,GAAE,OAAM,EAAG,SAAQ;EAC1B,aAAaA,GAAE,OAAM;EACrB,eAAeA,GAAE,OAAM;EACvB,OAAOA,GAAE,MAAMA,GAAE,OAAM,CAAE,EAAE,QAAQ,CAAA,CAAE;EACrC,OAAOA,GAAE,OAAM,EAAG,SAAQ;EAC1B,QAAQA,GAAE,MAAMA,GAAE,OAAM,CAAE,EAAE,SAAQ;CACrC;;;ACbM,IAAM,UAAU;","names":["z","z","z","z","AuthSchema","z","z","z","z","z","z"]}
|