@64mb/freelens-power 2.1.0 → 2.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +4 -4
- package/out/main/common/power-logs.js.map +1 -1
- package/out/main/common/resource-search.js.map +1 -1
- package/out/main/power-logs-child.js +3 -3
- package/out/main/power-logs-child.js.map +1 -1
- package/out/main/power-logs-database.js +165 -7
- package/out/main/power-logs-database.js.map +1 -1
- package/out/main/power-logs-ipc.js +12 -3
- package/out/main/power-logs-ipc.js.map +1 -1
- package/out/main/power-logs-worker.js +29 -7
- package/out/main/power-logs-worker.js.map +1 -1
- package/out/main/resource-search-database.js +3 -2
- package/out/main/resource-search-database.js.map +1 -1
- package/out/main/resource-search.js +2 -1
- package/out/main/resource-search.js.map +1 -1
- package/out/renderer/_virtual/_global-external_react.js +2 -1
- package/out/renderer/ai-context-mutations.js +14 -0
- package/out/renderer/ai-context-mutations.js.map +1 -0
- package/out/renderer/ai-copy-answer.js +18 -15
- package/out/renderer/ai-copy-answer.js.map +1 -1
- package/out/renderer/ai-diagnostic-handoff.js +2 -2
- package/out/renderer/ai-diagnostic-handoff.js.map +1 -1
- package/out/renderer/ai-extras.js +41 -38
- package/out/renderer/ai-extras.js.map +1 -1
- package/out/renderer/ai-message.js +50 -39
- package/out/renderer/ai-message.js.map +1 -1
- package/out/renderer/ai-provider-icon.js +39 -32
- package/out/renderer/ai-provider-icon.js.map +1 -1
- package/out/renderer/ai-resize.js +40 -37
- package/out/renderer/ai-resize.js.map +1 -1
- package/out/renderer/ai-shortcuts.js +20 -17
- package/out/renderer/ai-shortcuts.js.map +1 -1
- package/out/renderer/ai-terminal-context.js +42 -48
- package/out/renderer/ai-terminal-context.js.map +1 -1
- package/out/renderer/ai.js +137 -111
- package/out/renderer/ai.js.map +1 -1
- package/out/renderer/cluster-icon-colors.js +10 -7
- package/out/renderer/cluster-icon-colors.js.map +1 -1
- package/out/renderer/cluster-icons.js +47 -40
- package/out/renderer/cluster-icons.js.map +1 -1
- package/out/renderer/details/service-diagnostics-details.js +25 -23
- package/out/renderer/details/service-diagnostics-details.js.map +1 -1
- package/out/renderer/diagnostic-explain-button.js +7 -4
- package/out/renderer/diagnostic-explain-button.js.map +1 -1
- package/out/renderer/diagnostics-screen-finding.js +51 -0
- package/out/renderer/diagnostics-screen-finding.js.map +1 -0
- package/out/renderer/diagnostics.css.js +1 -1
- package/out/renderer/diagnostics.css.js.map +1 -1
- package/out/renderer/diagnostics.js +146 -107
- package/out/renderer/diagnostics.js.map +1 -1
- package/out/renderer/incident-copy-button.js +24 -21
- package/out/renderer/incident-copy-button.js.map +1 -1
- package/out/renderer/index.js +2 -0
- package/out/renderer/index.js.map +1 -1
- package/out/renderer/monitoring.js +19 -22
- package/out/renderer/monitoring.js.map +1 -1
- package/out/renderer/native-tooltip.js +22 -0
- package/out/renderer/native-tooltip.js.map +1 -0
- package/out/renderer/pod-details-enhancements.js +106 -0
- package/out/renderer/pod-details-enhancements.js.map +1 -0
- package/out/renderer/power-log-json-cell.js +44 -38
- package/out/renderer/power-log-json-cell.js.map +1 -1
- package/out/renderer/power-log-json.js +17 -10
- package/out/renderer/power-log-json.js.map +1 -1
- package/out/renderer/power-log-sql-editor.js +31 -2
- package/out/renderer/power-log-sql-editor.js.map +1 -1
- package/out/renderer/power-logs-client.js +5 -0
- package/out/renderer/power-logs-client.js.map +1 -1
- package/out/renderer/power-logs-entrypoints.js +10 -36
- package/out/renderer/power-logs-entrypoints.js.map +1 -1
- package/out/renderer/power-logs.css.js +9 -2
- package/out/renderer/power-logs.css.js.map +1 -1
- package/out/renderer/power-logs.js +376 -214
- package/out/renderer/power-logs.js.map +1 -1
- package/out/renderer/preferences/dashboard-preferences.js +42 -35
- package/out/renderer/preferences/dashboard-preferences.js.map +1 -1
- package/out/renderer/preferences/logs-preferences.js +1 -1
- package/out/renderer/preferences/logs-preferences.js.map +1 -1
- package/out/renderer/preferences/monitoring-preferences.js +7 -4
- package/out/renderer/preferences/monitoring-preferences.js.map +1 -1
- package/out/renderer/preferences/preferences.js +2 -2
- package/out/renderer/preferences/preferences.js.map +1 -1
- package/out/renderer/preferences/settings-icon-action.js +12 -11
- package/out/renderer/preferences/settings-icon-action.js.map +1 -1
- package/out/renderer/relationship-map-finding.js +53 -0
- package/out/renderer/relationship-map-finding.js.map +1 -0
- package/out/renderer/resource-relationships.css.js +6 -0
- package/out/renderer/resource-relationships.css.js.map +1 -1
- package/out/renderer/resource-relationships.js +94 -47
- package/out/renderer/resource-relationships.js.map +1 -1
- package/out/renderer/resource-search-client.js.map +1 -1
- package/out/renderer/resource-search.js +88 -35
- package/out/renderer/resource-search.js.map +1 -1
- package/out/renderer/src/common/gateway-relationships.js +8 -7
- package/out/renderer/src/common/gateway-relationships.js.map +1 -1
- package/out/renderer/src/common/power-log-json-filter-sql.js +12 -0
- package/out/renderer/src/common/power-log-json-filter-sql.js.map +1 -1
- package/out/renderer/src/common/power-log-json-preset.js +2 -2
- package/out/renderer/src/common/power-log-json-preset.js.map +1 -1
- package/out/renderer/src/common/power-logs.js.map +1 -1
- package/out/renderer/src/common/resource-relationships.js +10 -8
- package/out/renderer/src/common/resource-relationships.js.map +1 -1
- package/out/renderer/src/common/resource-search.js.map +1 -1
- package/out/renderer/welcome.js +16 -1
- package/out/renderer/welcome.js.map +1 -1
- package/package.json +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"power-logs.js","names":[],"sources":["../../src/renderer/power-logs.tsx"],"sourcesContent":["import { randomUUID } from \"node:crypto\";\nimport { Renderer } from \"@freelensapp/extensions\";\nimport { clipboard } from \"electron\";\nimport { observer } from \"mobx-react\";\nimport {\n type CSSProperties,\n type KeyboardEvent as ReactKeyboardEvent,\n type ReactNode,\n useEffect,\n useLayoutEffect,\n useMemo,\n useRef,\n useState,\n} from \"react\";\nimport { formatDateTime } from \"../common/date-time\";\nimport { compileJsonFilters, type JsonFieldFilter, jsonValuesEqual } from \"../common/power-log-field-filters\";\nimport { buildJsonFilterSql, type SqlJsonFieldFilter } from \"../common/power-log-json-filter-sql\";\nimport { buildJsonProjectionSql, JSON_KEY_DISCOVERY_SQL } from \"../common/power-log-json-preset\";\nimport { sqlCellLevel } from \"../common/power-log-sql-level\";\nimport {\n POWER_LOGS_LIMITS as L,\n type LogCapture,\n type LogLevel,\n type LogQueryResult,\n type LogRecord,\n type LogSource,\n type LogTarget,\n} from \"../common/power-logs\";\nimport { powerLogLineEvidence, powerLogQueryEvidence } from \"../common/power-logs-ai\";\nimport { applyPowerLogsLimits, normalizePowerLogsLimits } from \"../common/power-logs-limits\";\nimport { LogsPreferencesStore } from \"../common/store/logs-preferences-store\";\nimport { explainDiagnosticFinding } from \"./ai-diagnostic-handoff\";\nimport { DiagnosticExplainButton } from \"./diagnostic-explain-button\";\nimport { LogJson } from \"./power-log-json\";\nimport { LogJsonCell } from \"./power-log-json-cell\";\nimport { formatJsonLiteral, jsonHasDuplicateKeys } from \"./power-log-json-fields\";\nimport { LogMessage } from \"./power-log-message\";\nimport { SqlEditor } from \"./power-log-sql-editor\";\nimport { powerLogsStyles } from \"./power-logs.css\";\nimport { createPowerLogsClient } from \"./power-logs-client\";\nimport { collectHistoricalLogs, type LiveLogCoverage, resolveLogSources, startLiveLogs } from \"./power-logs-collector\";\nimport { openPowerLogs, parsePowerLogsTarget } from \"./power-logs-entrypoints\";\nimport { CaptureSqlDrafts } from \"./power-logs-sql-drafts\";\nimport { sqlRowDetails } from \"./power-logs-sql-row\";\nimport { createPowerLogsTransport } from \"./power-logs-transport\";\nimport { searchContextId } from \"./resource-search-client\";\n\nconst Icon = (props: { material: string; size?: number; tooltip?: string }) => (\n <span aria-hidden=\"true\" style={{ display: \"inline-flex\" }}>\n <Renderer.Component.Icon {...props} />\n </span>\n);\nconst sourceKey = (r: Pick<LogRecord, \"pod\" | \"container\" | \"previous\">) =>\n `${r.pod} / ${r.container}${r.previous ? \" (previous)\" : \"\"}`;\nconst levels: LogLevel[] = [\"trace\", \"debug\", \"info\", \"warn\", \"error\", \"fatal\", \"unknown\"];\nconst examples = [\n [\"Recent\", \"SELECT message, level, container, pod, timestamp FROM logs ORDER BY timestamp DESC NULLS LAST LIMIT 200\"],\n [\n \"Errors\",\n \"SELECT pod, container, count(*) AS errors FROM logs WHERE level IN ('error','fatal') GROUP BY pod, container ORDER BY errors DESC\",\n ],\n [\n \"Timeline\",\n \"SELECT strftime('%Y-%m-%d %H:%M', timestamp / 1000, 'unixepoch') AS minute, UPPER(level) AS level, count(*) AS lines FROM logs GROUP BY minute, level ORDER BY minute\",\n ],\n [\"JSON\", \"SELECT fieldsJson FROM logs WHERE fieldsJson IS NOT NULL LIMIT 100\"],\n] as const;\nconst sqlColumnWidth = (column: string) =>\n column === \"message\" || column === \"fieldsJson\" ? 360 : column === \"level\" ? 90 : 200;\ntype ViewRecord = LogRecord & { key: number; bytes: number };\n\nfunction initialTarget(): LogTarget | undefined {\n try {\n return parsePowerLogsTarget(JSON.parse(new URLSearchParams(window.location.search).get(\"target\") ?? \"null\"));\n } catch {\n return;\n }\n}\nfunction initialSource(container: unknown = new URLSearchParams(window.location.search).get(\"container\")): string {\n return typeof container === \"string\" && /^[a-z0-9](?:[-a-z0-9]*[a-z0-9])?$/.test(container) && container.length <= 63\n ? `container:${container}`\n : \"\";\n}\n\nfunction LogSelect({\n label,\n value,\n options,\n onChange,\n disabled = false,\n renderOption,\n onKeyDown,\n}: {\n label: string;\n value: string;\n options: { value: string; label: string }[];\n onChange(value: string): void;\n disabled?: boolean;\n onKeyDown?: (event: ReactKeyboardEvent) => void;\n renderOption?: (option: { value: string; label: string }, context: \"menu\" | \"value\") => ReactNode;\n}) {\n return (\n <span className=\"power-logs-select\" data-source-select={label === \"Container source\" || undefined}>\n <Renderer.Component.Select\n aria-label={label}\n value={value}\n options={options}\n formatOptionLabel={(option, meta) =>\n renderOption ? (\n renderOption(option, meta.context)\n ) : label === \"Log level\" && option.value ? (\n <span className=\"power-logs-level-label\" data-level={option.value}>\n {option.label}\n </span>\n ) : (\n option.label\n )\n }\n isDisabled={disabled}\n onKeyDown={onKeyDown}\n tabSelectsValue={false}\n isClearable={false}\n menuPosition=\"fixed\"\n menuPortalTarget={document.body}\n styles={{\n menu: (base) => (label === \"Container source\" ? { ...base, width: \"100%\", maxWidth: \"100%\" } : base),\n menuList: (base) => (label === \"Container source\" ? { ...base, width: \"100%\", maxWidth: \"100%\" } : base),\n option: (base) => (label === \"Container source\" ? { ...base, whiteSpace: \"normal\" } : base),\n menuPortal: (base) => {\n if (label !== \"Container source\" && label !== \"Capture snapshot\") return { ...base, zIndex: 10000 };\n const width = Math.min(label === \"Capture snapshot\" ? 620 : 560, window.innerWidth - 32);\n return {\n ...base,\n zIndex: 10000,\n width,\n left: Math.max(\n 16,\n Math.min(typeof base.left === \"number\" ? base.left : 16, window.innerWidth - width - 16),\n ),\n };\n },\n }}\n onChange={(option) => {\n if (option) onChange(option.value);\n }}\n />\n </span>\n );\n}\n\nconst SourcePicker = observer(() => {\n const stores = [\n Renderer.K8sApi.podsStore,\n Renderer.K8sApi.deploymentStore,\n Renderer.K8sApi.daemonSetStore,\n Renderer.K8sApi.statefulSetStore,\n Renderer.K8sApi.replicaSetStore,\n Renderer.K8sApi.jobStore,\n Renderer.K8sApi.cronJobStore,\n ];\n const targets = stores.flatMap((store) =>\n store.getItems().flatMap((object) => {\n const target = parsePowerLogsTarget({ kind: object.kind, ...object.metadata });\n return target ? [target] : [];\n }),\n );\n const [value, setValue] = useState(\"\");\n const sorted = [...targets].sort((a, b) =>\n `${a.namespace}/${a.kind}/${a.name}`.localeCompare(`${b.namespace}/${b.kind}/${b.name}`),\n );\n return (\n <div className=\"power-logs-source\">\n <span className=\"power-logs-control-label\">Resource</span>\n <LogSelect\n label=\"Resource\"\n value={value}\n onChange={setValue}\n options={[\n { value: \"\", label: \"Choose a loaded pod or workload\" },\n ...sorted.map((target) => ({\n value: target.uid,\n label: `${target.namespace} / ${target.kind} / ${target.name}`,\n })),\n ]}\n />\n <button\n type=\"button\"\n disabled={!targets.some((target) => target.uid === value)}\n onClick={() => {\n const target = targets.find((t) => t.uid === value);\n if (target) openPowerLogs(target);\n }}\n >\n <Icon material=\"subject\" size={16} /> Open logs\n </button>\n </div>\n );\n});\n\nfunction LogRows({\n records,\n loading,\n selected,\n onSelect,\n follow,\n setFollow,\n compact,\n}: {\n records: ViewRecord[];\n loading: boolean;\n selected?: number;\n onSelect(record: ViewRecord): void;\n follow: boolean;\n setFollow(value: boolean): void;\n compact: boolean;\n}) {\n const viewport = useRef<HTMLDivElement>(null);\n const [top, setTop] = useState(0);\n const [height, setHeight] = useState(400);\n useEffect(() => {\n const element = viewport.current;\n if (!element) return;\n const resize = new ResizeObserver(() => setHeight(element.clientHeight));\n resize.observe(element);\n return () => resize.disconnect();\n }, []);\n useLayoutEffect(() => {\n if (follow && viewport.current) {\n viewport.current.scrollTop = viewport.current.scrollHeight;\n setTop(viewport.current.scrollTop);\n }\n }, [records, follow, compact]);\n const levelCharacters = useMemo(\n () => records.reduce((width, record) => Math.max(width, record.level.length), 4),\n [records],\n );\n const rowHeight = compact ? 20 : 34;\n const start = Math.max(0, Math.floor(top / rowHeight) - 5);\n const visible = records.slice(start, start + Math.ceil(height / rowHeight) + 10);\n return (\n <div className=\"power-logs-viewer\">\n <div\n className=\"power-logs-stream\"\n ref={viewport}\n style={{ \"--power-log-level-ch\": levelCharacters } as CSSProperties}\n aria-label=\"Log lines\"\n aria-busy={loading}\n onScroll={(event) => {\n const el = event.currentTarget;\n setTop(el.scrollTop);\n if (el.scrollHeight - el.scrollTop - el.clientHeight > 60) setFollow(false);\n }}\n >\n {records.length === 0 ? (\n <div className=\"power-logs-empty\">{loading ? \"Loading logs…\" : \"No matching log lines\"}</div>\n ) : (\n <div style={{ height: records.length * rowHeight, position: \"relative\" }}>\n {visible.map((record, i) => (\n <button\n type=\"button\"\n className=\"power-log-row\"\n data-level={record.level}\n aria-pressed={selected === record.key}\n style={{ top: (start + i) * rowHeight, height: rowHeight }}\n key={record.key}\n onClick={() => onSelect(record)}\n >\n <span title={record.timestamp !== null ? formatDateTime(record.timestamp) : \"Timestamp unavailable\"}>\n {record.timestamp !== null ? formatDateTime(record.timestamp).slice(-8) : \"—\"}\n </span>\n <span className=\"power-log-level\">{record.level}</span>\n <span className=\"power-log-origin\" id={`power-log-source-${record.key}`}>\n {record.pod}\n {record.previous ? \" (previous)\" : \"\"}\n <Renderer.Component.Tooltip targetId={`power-log-source-${record.key}`}>\n {sourceKey(record)}\n </Renderer.Component.Tooltip>\n </span>\n <LogMessage text={record.message} />\n </button>\n ))}\n </div>\n )}\n </div>\n </div>\n );\n}\n\nfunction LogDetails({\n record,\n jsonColumn,\n onClose,\n onFilter,\n}: {\n record: LogRecord;\n jsonColumn?: string;\n onClose: () => void;\n onFilter?: (filter: JsonFieldFilter) => void;\n}) {\n const structuredFields = useMemo(() => {\n if (!record?.fieldsJson) return \"\";\n return formatJsonLiteral(record.fieldsJson);\n }, [record?.fieldsJson]);\n const fieldsEnabled = useMemo(() => !jsonHasDuplicateKeys(record.fieldsJson ?? \"\"), [record.fieldsJson]);\n const [copyFeedback, setCopyFeedback] = useState(\"\");\n useEffect(() => setCopyFeedback(\"\"), [structuredFields]);\n return (\n <aside className=\"power-logs-detail\" aria-label=\"Log line details\">\n <header>\n <strong>Line details</strong>\n <button\n className=\"power-logs-detail-close\"\n aria-label=\"Close line details\"\n title=\"Close line details\"\n onClick={onClose}\n >\n <Icon material=\"close\" size={16} />\n </button>\n </header>\n <p className=\"power-logs-muted\">\n {[record.pod && sourceKey(record), record.level.toUpperCase()].filter(Boolean).join(\" · \")}\n </p>\n {record.message && (\n <pre>\n <LogMessage text={record.message} />\n </pre>\n )}\n {record.fieldsJson && (\n <>\n <div className=\"power-logs-structured-heading\">\n <strong>{jsonColumn ? `Structured fields · ${jsonColumn}` : \"Structured fields\"}</strong>\n <button\n type=\"button\"\n className=\"power-logs-detail-copy\"\n aria-label=\"Copy structured JSON\"\n title={copyFeedback || \"Copy structured JSON\"}\n onClick={() => {\n try {\n clipboard.writeText(structuredFields);\n setCopyFeedback(\"Copied\");\n } catch {\n setCopyFeedback(\"Unable to copy JSON\");\n }\n }}\n >\n <Icon material={copyFeedback === \"Copied\" ? \"check\" : \"content_copy\"} size={16} />\n </button>\n <span className=\"power-logs-muted\" aria-live=\"polite\">\n {copyFeedback}\n </span>\n </div>\n <LogJson text={structuredFields} fieldsEnabled={fieldsEnabled} Icon={Icon} onFilter={onFilter} />\n </>\n )}\n </aside>\n );\n}\n\nconst sameFieldFilter = (a: JsonFieldFilter, b: JsonFieldFilter) =>\n a.operator === b.operator &&\n a.path.length === b.path.length &&\n a.path.every((part, index) => part === b.path[index]) &&\n jsonValuesEqual(a.value, b.value);\nconst fieldFilterLabel = (filter: JsonFieldFilter) =>\n `${filter.path.reduce<string>((path, part) => `${path}[${typeof part === \"number\" ? part : JSON.stringify(part)}]`, \"$\")} ${filter.operator === \"eq\" ? \"=\" : \"!=\"} ${JSON.stringify(filter.value)}`;\nfunction FieldFilters({\n filters,\n sql = false,\n disabled = false,\n onRemove,\n}: {\n filters: readonly (JsonFieldFilter & { column?: string })[];\n sql?: boolean;\n disabled?: boolean;\n onRemove(index: number): void;\n}) {\n if (!filters.length) return null;\n return (\n <div className=\"power-logs-field-filters\" aria-label={sql ? \"SQL JSON filters\" : \"Live JSON filters\"}>\n <span className=\"power-logs-muted\">{sql ? \"Result filters\" : \"JSON filters\"} · AND</span>\n {filters.map((filter, index) => {\n const label = `${filter.column ? `${filter.column} ` : \"\"}${fieldFilterLabel(filter)}`;\n return (\n <button\n type=\"button\"\n key={index}\n disabled={disabled}\n title={label}\n aria-label={`Remove JSON filter ${label}`}\n onClick={() => onRemove(index)}\n >\n <span>{label}</span>\n <Icon material=\"close\" size={14} />\n </button>\n );\n })}\n </div>\n );\n}\n\nfunction Workspace({ clusterId, contextId }: { clusterId: string; contextId: string }) {\n const client = useMemo(() => createPowerLogsClient({ clusterId, contextId }), [clusterId, contextId]);\n const drafts = useMemo(\n () =>\n new CaptureSqlDrafts(\n (id, query) => client.saveSql(id, query),\n () => setError(\"Could not save the SQL draft. Your edits remain available in this workspace.\"),\n ),\n [client],\n );\n useEffect(\n () => () => {\n void drafts.dispose();\n },\n [drafts],\n );\n const [target, setTarget] = useState(initialTarget);\n const [records, setRecords] = useState<ViewRecord[]>([]);\n const [sources, setSources] = useState<LogSource[]>([]);\n const [notes, setNotes] = useState<string[]>([]);\n const [status, setStatus] = useState(\"Choose a resource to read its logs\");\n const [error, setError] = useState(\"\");\n const [sqlError, setSqlError] = useState(\"\");\n const [tab, setTab] = useState<\"live\" | \"captures\">(\"live\");\n const [text, setText] = useState(\"\");\n const [level, setLevel] = useState(\"\");\n const [source, setSource] = useState(initialSource);\n const [fieldFilters, setFieldFilters] = useState<JsonFieldFilter[]>([]);\n const matchFields = useMemo(() => compileJsonFilters(fieldFilters), [fieldFilters]);\n const parsedFields = useRef(new WeakMap<LogRecord, unknown>());\n const [sqlFieldFilters, setSqlFieldFilters] = useState<{\n base: string;\n rendered: string;\n captureId: string;\n filters: SqlJsonFieldFilter[];\n }>();\n const preferences = LogsPreferencesStore.getInstanceOrCreate<LogsPreferencesStore>();\n const limits = normalizePowerLogsLimits(preferences.limits);\n useEffect(() => {\n applyPowerLogsLimits(preferences.limits);\n }, [preferences.limits]);\n const [compact, setCompact] = useState(preferences.compactRows === true);\n const [hideResourceName, setHideResourceName] = useState(preferences.hideResourceNameColumn === true);\n const [selected, setSelected] = useState<ViewRecord>();\n const [selectedSqlRow, setSelectedSqlRow] = useState<\n ReturnType<typeof sqlRowDetails> & { row: LogQueryResult[\"rows\"][number] }\n >();\n const [liveCoverage, setLiveCoverage] = useState<LiveLogCoverage>();\n const [live, setLive] = useState(false);\n const [follow, setFollow] = useState(true);\n const [busy, setBusy] = useState(() => Boolean(initialTarget()));\n const [captures, setCaptures] = useState<LogCapture[]>([]);\n const [captureId, updateCaptureId] = useState(\"\");\n const captureSelection = useRef(captureId);\n captureSelection.current = captureId;\n const setCaptureId = (id: string, snapshot = captures.find((item) => item.id === id)) => {\n if (id !== captureSelection.current) void drafts.flush();\n captureSelection.current = id;\n const query = snapshot ? drafts.read(snapshot, examples[0][1]) : examples[0][1];\n sqlDraft.current = query;\n updateSql(query);\n updateCaptureId(id);\n };\n const deleting = useRef(new Set<string>());\n const [deletingCount, setDeletingCount] = useState(0);\n const [capturing, setCapturing] = useState<LogCapture>();\n const [capturePending, setCapturePending] = useState(false);\n const [captureMinutes, setCaptureMinutes] = useState(15);\n const [previous, setPrevious] = useState(false);\n const [sql, updateSql] = useState<string>(examples[0][1]);\n const sqlDraft = useRef(sql);\n sqlDraft.current = sql;\n const setSql = (query: string) => {\n sqlDraft.current = query;\n updateSql(query);\n if (captureSelection.current) drafts.set(captureSelection.current, query);\n };\n const captureKeys = useRef(new Map<string, string[]>());\n useEffect(() => {\n setSqlFieldFilters((current) =>\n current && (current.rendered !== sql || current.captureId !== captureId) ? undefined : current,\n );\n }, [sql, captureId]);\n const [result, setResult] = useState<LogQueryResult>();\n const [resultEvidence, setResultEvidence] = useState<{ capture: LogCapture; sql: string; error?: string }>();\n const [resultPage, setResultPage] = useState(0);\n const [queryId, setQueryId] = useState(\"\");\n const captureOptions = useRef<HTMLDetailsElement>(null);\n useEffect(() => {\n const outside = (event: PointerEvent) => {\n if (\n !captureOptions.current?.contains(event.target as Node) &&\n !(event.target as Element)?.closest?.(\".Select__menu\")\n ) {\n if (captureOptions.current) captureOptions.current.open = false;\n }\n };\n const escape = (event: KeyboardEvent) => {\n if (event.key !== \"Escape\" || event.defaultPrevented || (event.target as Element)?.closest?.(\".Select\")) return;\n if (captureOptions.current?.open) captureOptions.current.open = false;\n else {\n setSelected(undefined);\n setSelectedSqlRow(undefined);\n }\n };\n window.addEventListener(\"pointerdown\", outside);\n window.addEventListener(\"keydown\", escape);\n return () => {\n window.removeEventListener(\"pointerdown\", outside);\n window.removeEventListener(\"keydown\", escape);\n };\n }, []);\n const historyController = useRef<AbortController>();\n const liveController = useRef<AbortController>();\n const captureController = useRef<AbortController>();\n const queryRef = useRef(\"\");\n const epoch = useRef(0);\n const alive = useRef(true);\n const sequence = useRef(0);\n const recordsRef = useRef(records);\n recordsRef.current = records;\n const pending = useRef<LogRecord[]>([]);\n const flushTimer = useRef<ReturnType<typeof setTimeout>>();\n const refreshCaptures = () =>\n client\n .list()\n .then((value) => {\n if (alive.current) setCaptures(value);\n })\n .catch(() => {\n if (alive.current) setError(\"Temporary captures are unavailable\");\n });\n const stopLive = () => {\n liveController.current?.abort();\n liveController.current = undefined;\n setLive(false);\n };\n const flush = () => {\n clearTimeout(flushTimer.current);\n flushTimer.current = undefined;\n const batch = pending.current;\n pending.current = [];\n if (!batch.length || !alive.current) return;\n const next = batch.map((record) => ({\n ...record,\n key: ++sequence.current,\n bytes: Buffer.byteLength(JSON.stringify(record)),\n }));\n setRecords((current) => {\n const combined = [...current, ...next];\n let bytes = combined.reduce((sum, r) => sum + r.bytes, 0);\n let start = 0;\n while (combined.length - start > L.liveRows || bytes > L.liveBytes) bytes -= combined[start++].bytes;\n return combined.slice(start).sort((a, b) => (a.timestamp ?? 0) - (b.timestamp ?? 0) || a.key - b.key);\n });\n };\n const appendView = (batch: LogRecord[]) => {\n if (!alive.current) return;\n pending.current.push(...batch);\n if (pending.current.length > 1000) flush();\n else flushTimer.current ??= setTimeout(flush, 80);\n };\n useEffect(() => {\n alive.current = true;\n const onTarget = (event: Event) => {\n const next = parsePowerLogsTarget((event as CustomEvent).detail);\n if (next) {\n if (queryRef.current) {\n void client.cancel(queryRef.current).catch(() => {});\n queryRef.current = \"\";\n setQueryId(\"\");\n }\n setSource(initialSource((event as CustomEvent).detail.container));\n setTarget(next);\n }\n };\n window.addEventListener(\"power-logs-target\", onTarget);\n void refreshCaptures();\n const timer = setInterval(() => void refreshCaptures(), 30000);\n return () => {\n alive.current = false;\n epoch.current++;\n clearInterval(timer);\n clearTimeout(flushTimer.current);\n historyController.current?.abort();\n liveController.current?.abort();\n captureController.current?.abort();\n if (queryRef.current) void client.cancel(queryRef.current).catch(() => {});\n window.removeEventListener(\"power-logs-target\", onTarget);\n };\n }, [client]);\n const readHistory = async () => {\n if (!target) return;\n const currentEpoch = ++epoch.current;\n historyController.current?.abort();\n stopLive();\n const controller = new AbortController();\n historyController.current = controller;\n clearTimeout(flushTimer.current);\n flushTimer.current = undefined;\n pending.current = [];\n setBusy(true);\n setRecords([]);\n setSelected(undefined);\n setError(\"\");\n setNotes([]);\n setStatus(\"Discovering owned containers…\");\n try {\n const transport = createPowerLogsTransport(clusterId);\n const discovery = await resolveLogSources(target, transport, controller.signal);\n if (controller.signal.aborted || currentEpoch !== epoch.current) return;\n setSources(discovery.sources);\n setNotes(discovery.notes);\n setStatus(`Reading ${discovery.sources.length} container sources…`);\n const history = await collectHistoricalLogs(discovery.sources, transport, {\n signal: controller.signal,\n tailLines: L.historyLines,\n limitBytes: L.historyBytes,\n onRecords: (batch) => {\n if (currentEpoch === epoch.current) appendView(batch);\n },\n });\n if (controller.signal.aborted || currentEpoch !== epoch.current) return;\n flush();\n setNotes([...new Set([...discovery.notes, ...history.notes])]);\n setStatus(\n `${discovery.sources.length} sources · last ${limits.historyLines.toLocaleString()} lines per container, up to ${limits.historyBytes / 1048576} MiB each`,\n );\n } catch {\n if (alive.current && currentEpoch === epoch.current)\n setError(\n controller.signal.aborted\n ? \"Log loading stopped\"\n : \"Could not read this resource's logs. Check permissions and whether it still exists.\",\n );\n } finally {\n if (alive.current && currentEpoch === epoch.current) setBusy(false);\n }\n };\n useEffect(() => {\n setText(\"\");\n setFieldFilters([]);\n setSources([]);\n setTab(\"live\");\n void readHistory();\n }, [target?.uid]);\n const toggleLive = () => {\n if (live) {\n stopLive();\n return;\n }\n setLive(true);\n };\n const sourceIdentity = sources.map((item) => `${item.podUid}/${item.container}`).join(\";\");\n useEffect(() => {\n if (!live || !sources.length) return;\n const controller = new AbortController();\n liveController.current = controller;\n const collector = startLiveLogs(sources, createPowerLogsTransport(clusterId), {\n signal: controller.signal,\n tailLines: L.historyLines,\n initialRecords: recordsRef.current,\n onRecords: appendView,\n onCoverage: (coverage) => {\n if (alive.current && liveController.current === controller)\n setLiveCoverage({ ...coverage, notes: [...coverage.notes] });\n },\n });\n setLiveCoverage({ ...collector.coverage });\n void collector.done.finally(() => {\n if (alive.current && !controller.signal.aborted && liveController.current === controller) {\n liveController.current = undefined;\n setLive(false);\n }\n });\n return () => {\n controller.abort();\n if (liveController.current === controller) liveController.current = undefined;\n };\n }, [live, sourceIdentity]);\n useEffect(() => {\n if (!live || !target) return;\n const controller = new AbortController();\n const startingEpoch = epoch.current;\n let refreshing = false;\n const timer = setInterval(() => {\n if (refreshing) return;\n refreshing = true;\n void resolveLogSources(target, createPowerLogsTransport(clusterId), controller.signal)\n .then((discovery) => {\n if (controller.signal.aborted || epoch.current !== startingEpoch) return;\n setSources(discovery.sources);\n setNotes(discovery.notes);\n setStatus(`${discovery.sources.length} sources · ownership inventory refreshed`);\n })\n .catch(() => {\n if (!controller.signal.aborted && alive.current && epoch.current === startingEpoch) {\n stopLive();\n setNotes((current) => [\n ...new Set([\n ...current,\n \"Workload inventory changed or became unavailable. Refresh before following logs again.\",\n ]),\n ]);\n }\n })\n .finally(() => {\n refreshing = false;\n });\n }, 30000);\n return () => {\n clearInterval(timer);\n controller.abort();\n };\n }, [live, target?.uid]);\n const capture = async () => {\n if (!target || captureController.current || queryRef.current) return;\n setCapturePending(true);\n const controller = new AbortController();\n captureController.current = controller;\n let current: LogCapture | undefined;\n let partial = false;\n let captureNotes: string[] = [];\n setError(\"\");\n stopLive();\n try {\n current = await client.create(target);\n setCapturing(current);\n const transport = createPowerLogsTransport(clusterId);\n const discovery = await resolveLogSources(target, transport, controller.signal);\n captureNotes = discovery.notes;\n partial = discovery.partial;\n const captureSources = previous\n ? [...discovery.sources, ...discovery.sources.map((item) => ({ ...item, previous: true }))]\n : discovery.sources;\n const boundary = current.createdAt;\n const history = await collectHistoricalLogs(captureSources, transport, {\n signal: controller.signal,\n tailLines: L.captureSourceLines,\n sinceTime: new Date(boundary - captureMinutes * 60000).toISOString(),\n limitBytes: L.captureSourceBytes,\n onRecords: async (batch) => {\n if (batch.some((record) => record.timestamp === null)) {\n partial = true;\n captureNotes.push(\"Some records have no timestamp and their capture window cannot be verified\");\n }\n batch = batch.filter(\n (record) =>\n record.timestamp === null ||\n (record.timestamp <= boundary && record.timestamp >= boundary - captureMinutes * 60000),\n );\n for (let offset = 0; offset < batch.length; ) {\n const chunk: LogRecord[] = [];\n let bytes = 2;\n while (offset < batch.length && chunk.length < L.batchRows) {\n const record = batch[offset];\n const size = Buffer.byteLength(JSON.stringify(record)) + 1;\n if (chunk.length && bytes + size > L.batchBytes) break;\n chunk.push(record);\n bytes += size;\n offset++;\n }\n if (controller.signal.aborted) throw new Error(\"Capture stopped\");\n try {\n current = await client.append(current!.id, chunk);\n if (alive.current) setCapturing(current);\n } catch {\n controller.abort();\n throw new Error(\"Capture reached its storage limit or became unavailable\");\n }\n }\n },\n });\n partial ||= history.partial;\n captureNotes.push(...history.notes);\n } catch {\n partial = true;\n captureNotes.push(\"Collection stopped or a source was unavailable; this snapshot may be incomplete\");\n } finally {\n if (current) {\n try {\n const saved = await client.finish(\n current.id,\n partial || controller.signal.aborted,\n [...new Set(captureNotes)].slice(0, 20),\n );\n if (alive.current) {\n setCaptureId(saved.id, saved);\n setCaptures((items) => [saved, ...items.filter((item) => item.id !== saved.id)]);\n setTab(\"captures\");\n setSql(examples[0][1]);\n void applyPreset(\"Recent\", saved, true);\n }\n } catch {\n if (alive.current) setError(\"The temporary capture could not be finalized\");\n }\n } else if (alive.current)\n setError(\"Could not create a capture. Delete an old snapshot or check the log service.\");\n if (alive.current) {\n setCapturing(undefined);\n setCapturePending(false);\n void refreshCaptures();\n }\n captureController.current = undefined;\n }\n };\n const runQuery = async (selectedCapture?: LogCapture, query = sql) => {\n if (queryRef.current || (!selectedCapture && captureController.current)) return;\n const captured = selectedCapture ?? captures.find((item) => item.id === captureId);\n if (!captured || captured.state === \"collecting\" || deleting.current.has(captured.id)) return;\n const id = randomUUID();\n queryRef.current = id;\n setQueryId(id);\n setError(\"\");\n setResult(undefined);\n setSelectedSqlRow(undefined);\n setSqlError(\"\");\n setResultEvidence({ capture: captured, sql: query });\n setResultPage(0);\n try {\n const value = await client.query(captured.id, id, query);\n if (alive.current && queryRef.current === id) {\n if (value.error) {\n setSqlError(value.error);\n setResultEvidence({ capture: captured, sql: query, error: value.error });\n } else setResult(value);\n }\n } catch {\n if (alive.current && queryRef.current === id) {\n const message =\n \"Query stopped or failed. Use one read-only SELECT or EXPLAIN; external files, networking and extensions are disabled.\";\n setSqlError(message);\n setResultEvidence({ capture: captured, sql: query, error: message });\n }\n } finally {\n if (queryRef.current === id) {\n if (alive.current) setQueryId(\"\");\n queryRef.current = \"\";\n }\n }\n };\n const applyPreset = async (title: \"Recent\" | \"JSON\", selectedCapture?: LogCapture, execute = false) => {\n const captured = selectedCapture ?? captures.find((item) => item.id === captureId);\n if (queryRef.current || (!selectedCapture && captureController.current)) return;\n if (title === \"Recent\") {\n const query = examples[0][1];\n setSql(query);\n setSelectedSqlRow(undefined);\n if (execute && captured) void runQuery(captured, query);\n return;\n }\n if (\n queryRef.current ||\n (!selectedCapture && captureController.current) ||\n !captured ||\n captured.state === \"collecting\" ||\n deleting.current.has(captured.id)\n )\n return;\n const draft = execute ? examples[0][1] : sqlDraft.current;\n const id = randomUUID();\n queryRef.current = id;\n setQueryId(id);\n setSqlError(\"\");\n let prepared: string | undefined;\n try {\n let keys = captureKeys.current.get(captured.id);\n if (!keys) {\n const schema = await client.query(captured.id, id, JSON_KEY_DISCOVERY_SQL);\n if (schema.error) throw new Error(schema.error);\n const keyColumn = schema.columns.indexOf(\"key\");\n keys = schema.truncated\n ? [\"\\0\"]\n : keyColumn < 0\n ? []\n : schema.rows.map((row) => row[keyColumn]).filter((key): key is string => typeof key === \"string\");\n captureKeys.current.set(captured.id, keys);\n if (captureKeys.current.size > 10) captureKeys.current.delete(captureKeys.current.keys().next().value!);\n }\n if (!alive.current || queryRef.current !== id || captureSelection.current !== captured.id) return;\n if (sqlDraft.current !== draft) {\n setSqlError(\"SQL draft changed while detecting JSON fields. Select the preset again to replace it.\");\n return;\n }\n prepared = buildJsonProjectionSql(keys);\n setSql(prepared);\n setSelectedSqlRow(undefined);\n } catch {\n if (alive.current) setSqlError(\"Could not detect JSON fields for this snapshot. Try the preset again.\");\n } finally {\n if (queryRef.current === id) {\n queryRef.current = \"\";\n if (alive.current) setQueryId(\"\");\n }\n }\n if (prepared && execute && alive.current) void runQuery(captured, prepared);\n };\n const addLiveFilter = (filter: JsonFieldFilter) => {\n if (!jsonValuesEqual(filter.value, filter.value)) {\n setError(\"This JSON value is too large or unsupported for filtering\");\n return;\n }\n if (fieldFilters.some((current) => sameFieldFilter(current, filter))) return;\n if (fieldFilters.length >= 32) {\n setError(\"Up to 32 JSON filters can be combined\");\n return;\n }\n setFieldFilters([...fieldFilters, filter]);\n };\n const activeSqlFilters =\n sqlFieldFilters?.rendered === sql && sqlFieldFilters.captureId === captureId ? sqlFieldFilters : undefined;\n const sqlFilteringDisabled = Boolean(\n queryId ||\n capturePending ||\n deleting.current.has(captureId) ||\n !captures.some((capture) => capture.id === captureId && capture.state !== \"collecting\"),\n );\n const applySqlFilters = (filters: SqlJsonFieldFilter[]) => {\n if (queryRef.current || captureController.current || sqlFilteringDisabled) return;\n if (!resultEvidence || resultEvidence.sql !== sql) {\n setSqlError(\"Run the edited SQL query before filtering its results\");\n return;\n }\n try {\n const base = activeSqlFilters?.base ?? sql;\n const query = buildJsonFilterSql(base, filters);\n setSqlFieldFilters({ base, rendered: query, captureId, filters });\n setSql(query);\n void runQuery(undefined, query);\n } catch {\n setSqlError(\"This JSON filter cannot be added to the query. Check the field path and value size.\");\n }\n };\n const addSqlFilter = (column: string, filter: JsonFieldFilter) => {\n const columnNames = result?.columns.map((name) => name.replace(/[A-Z]/g, (letter) => letter.toLowerCase())) ?? [];\n if (!result?.columns.includes(column) || new Set(columnNames).size !== columnNames.length) {\n setSqlError(\"JSON filters require unique result column names, ignoring case\");\n return;\n }\n const filters = activeSqlFilters?.filters ?? [];\n if (filters.some((current) => current.column === column && sameFieldFilter(current, filter))) return;\n if (filters.length >= 32) {\n setSqlError(\"Up to 32 JSON filters can be combined\");\n return;\n }\n applySqlFilters([...filters, { ...filter, column }]);\n };\n const matchesRecordFields = (record: LogRecord) => {\n if (!fieldFilters.length) return true;\n if (!parsedFields.current.has(record)) {\n let fields: unknown;\n try {\n fields = JSON.parse(record.fieldsJson ?? \"null\");\n } catch {\n fields = undefined;\n }\n parsedFields.current.set(record, fields);\n }\n return matchFields(parsedFields.current.get(record));\n };\n const filtered = useMemo(\n () =>\n records.filter(\n (record) =>\n (!text || record.message.toLocaleLowerCase().includes(text.toLocaleLowerCase())) &&\n (!level || record.level === level) &&\n (!source ||\n (source.startsWith(\"container:\") ? record.container === source.slice(10) : sourceKey(record) === source)) &&\n matchesRecordFields(record),\n ),\n [records, text, level, source, fieldFilters, matchFields],\n );\n const chosenCapture = captures.find((item) => item.id === captureId);\n const collectionNotes = tab === \"live\" ? [...new Set([...notes, ...(live ? (liveCoverage?.notes ?? []) : [])])] : [];\n useEffect(() => {\n window.dispatchEvent(new CustomEvent(\"power-logs-workspace-change\", { detail: { active: true } }));\n return () => {\n window.dispatchEvent(new CustomEvent(\"power-logs-workspace-change\", { detail: { active: false } }));\n };\n }, []);\n useEffect(() => {\n const insert = (event: Event) => {\n const sql = (event as CustomEvent<{ sql?: unknown }>).detail?.sql;\n if (typeof sql !== \"string\" || !sql.trim() || sql.length > 65536) return;\n setTab(\"captures\");\n setSelectedSqlRow(undefined);\n if (!captureId) {\n const latest = captures.find((item) => item.state !== \"collecting\" && item.target.uid === target?.uid);\n if (latest) setCaptureId(latest.id);\n }\n setSql(sql);\n requestAnimationFrame(() => document.getElementById(\"power-logs-sql\")?.focus());\n };\n window.addEventListener(\"power-logs-sql-draft\", insert);\n return () => window.removeEventListener(\"power-logs-sql-draft\", insert);\n }, [captureId, captures, target?.uid]);\n const attachAi = () => {\n const queryEvidence =\n result ??\n (resultEvidence?.error\n ? {\n columns: [],\n rows: [],\n truncated: false,\n elapsedMs: 0,\n error: resultEvidence.error,\n }\n : undefined);\n const resource =\n tab === \"captures\"\n ? queryEvidence && resultEvidence\n ? resultEvidence.capture.target\n : (chosenCapture?.target ?? target)\n : target;\n const summary =\n tab === \"captures\" && queryEvidence && resultEvidence\n ? powerLogQueryEvidence(\n resultEvidence.capture,\n resultEvidence.sql,\n selectedSqlRow ? { ...queryEvidence, rows: [selectedSqlRow.row], truncated: false } : queryEvidence,\n )\n : tab === \"live\" && selected\n ? powerLogLineEvidence(resource, selected)\n : JSON.stringify({\n target: resource,\n ...(tab === \"captures\"\n ? { sql, rows: [], state: \"Draft query, not executed\" }\n : { status, sources: sources.length }),\n });\n if (\n !explainDiagnosticFinding({\n clusterId,\n source: \"logs\",\n title: tab === \"captures\" ? (selectedSqlRow ? \"SQL row\" : \"SQL query\") : selected ? \"Log line\" : \"Power Logs\",\n summary: summary.slice(0, 6000),\n ...(resource ? { resource: { kind: resource.kind, name: resource.name, namespace: resource.namespace } } : {}),\n })\n )\n window.dispatchEvent(new Event(\"power-ai-open-only\"));\n };\n const deleteCapture = async (id: string) => {\n if (deleting.current.has(id) || queryRef.current || captureController.current) return;\n deleting.current.add(id);\n setDeletingCount(deleting.current.size);\n try {\n await drafts.flush();\n await client.delete(id);\n drafts.forget(id);\n if (id === captureSelection.current) {\n setCaptureId(\"\");\n setResult(undefined);\n setResultEvidence(undefined);\n setSelectedSqlRow(undefined);\n }\n await refreshCaptures();\n } catch {\n setError(\"Could not delete capture\");\n } finally {\n deleting.current.delete(id);\n if (alive.current) setDeletingCount(deleting.current.size);\n }\n };\n const native = () => {\n const first = sources[0];\n const pod = Renderer.K8sApi.podsStore\n .getItems()\n .find((item) =>\n target?.kind === \"Pod\" ? item.metadata.uid === target.uid : item.metadata.uid === first?.podUid,\n );\n const requested = source.startsWith(\"container:\")\n ? source.slice(10)\n : sources.find((item) => sourceKey(item) === source)?.container;\n const defaultContainer = pod?.metadata.annotations?.[\"kubectl.kubernetes.io/default-container\"];\n const container =\n pod?.getAllContainers().find((item) => item.name === (requested ?? defaultContainer)) ??\n pod?.getAllContainers()[0];\n if (pod && container)\n Renderer.Component.logTabStore.createPodTab({ selectedPod: pod, selectedContainer: container });\n else setError(\"Open the Pod in the native resource view to use its Logs action\");\n };\n return (\n <div\n className=\"power-logs\"\n data-testid=\"power-logs-page\"\n data-compact={compact || undefined}\n data-hide-resource-name={hideResourceName || undefined}\n >\n <style>{powerLogsStyles}</style>\n <header>\n <h1 className=\"power-logs-page-title\">Power Logs</h1>\n <div\n className=\"power-logs-tabs\"\n role=\"tablist\"\n aria-label=\"Log workspace\"\n onKeyDown={(event) => {\n if (![\"ArrowLeft\", \"ArrowRight\", \"Home\", \"End\"].includes(event.key)) return;\n const tabs = [...event.currentTarget.querySelectorAll<HTMLButtonElement>(\"[role=tab]\")];\n const index = tabs.indexOf(document.activeElement as HTMLButtonElement);\n if (index < 0) return;\n event.preventDefault();\n const next =\n event.key === \"Home\"\n ? 0\n : event.key === \"End\"\n ? tabs.length - 1\n : (index + (event.key === \"ArrowRight\" ? 1 : -1) + tabs.length) % tabs.length;\n tabs[next]?.focus();\n tabs[next]?.click();\n }}\n >\n <button role=\"tab\" aria-selected={tab === \"live\"} onClick={() => setTab(\"live\")}>\n <Icon material=\"subject\" size={16} /> Live view\n </button>\n <button\n role=\"tab\"\n aria-selected={tab === \"captures\"}\n onClick={() => {\n setTab(\"captures\");\n const latest = captures.find(\n (item) => item.state !== \"collecting\" && (!target || item.target.uid === target.uid),\n );\n if (!captureId && latest && !capturePending) {\n setCaptureId(latest.id);\n }\n void refreshCaptures();\n }}\n >\n <Icon material=\"code\" size={16} /> SQL\n </button>\n </div>\n\n <div className=\"power-logs-actions\">\n <div className=\"power-logs-toolbar power-logs-capture\">\n <details ref={captureOptions} className=\"power-logs-options\">\n <summary title={`Capture window: ${captureMinutes} minutes`}>\n <Icon material=\"tune\" size={16} /> Options\n </summary>\n <div>\n {\" \"}\n <label>\n Capture window\n <LogSelect\n label=\"Capture window\"\n value={String(captureMinutes)}\n onChange={(value) => setCaptureMinutes(Number(value))}\n options={[\n { value: \"5\", label: \"5 minutes\" },\n { value: \"15\", label: \"15 minutes\" },\n { value: \"60\", label: \"1 hour\" },\n ]}\n />\n </label>\n <Renderer.Component.Switch checked={previous} onChange={setPrevious}>\n Include previous containers\n </Renderer.Component.Switch>\n <Renderer.Component.Switch\n checked={compact}\n onChange={(value) => {\n setCompact(value);\n preferences.compactRows = value;\n }}\n >\n Compact density\n </Renderer.Component.Switch>\n <Renderer.Component.Switch\n checked={hideResourceName}\n onChange={(value) => {\n setHideResourceName(value);\n preferences.hideResourceNameColumn = value;\n }}\n >\n Hide resource name column\n </Renderer.Component.Switch>\n </div>\n </details>\n {tab === \"captures\" && (\n <button\n type=\"button\"\n disabled={!target || capturePending || busy || !!queryId || deletingCount > 0}\n onClick={() => void capture()}\n >\n <Icon material=\"save_alt\" size={16} /> Capture logs\n </button>\n )}\n {capturePending && (\n <>\n <span role=\"status\" className=\"power-logs-muted\">\n {capturing\n ? `${capturing.rows.toLocaleString()} lines · ${(capturing.bytes / 1048576).toFixed(1)} MiB`\n : \"Preparing capture…\"}\n </span>\n <button type=\"button\" onClick={() => captureController.current?.abort()}>\n <Icon material=\"stop\" size={16} /> Stop & keep partial\n </button>\n </>\n )}\n </div>\n\n <DiagnosticExplainButton aria-label=\"Open AI assistant\" title=\"Open AI assistant\" onClick={attachAi}>\n <Icon material=\"chat_bubble_outline\" size={16} /> AI\n </DiagnosticExplainButton>\n {tab === \"live\" && (\n <button type=\"button\" disabled={!target || busy} onClick={() => void readHistory()}>\n <Icon material=\"refresh\" size={16} /> Refresh\n </button>\n )}\n {target?.kind === \"Pod\" && (\n <button type=\"button\" aria-label=\"Native logs\" title=\"Native logs\" onClick={native}>\n <Renderer.Component.Icon material=\"open_in_new\" size={16} tooltip=\"Native logs\" tooltipOverrideDisabled />\n </button>\n )}\n </div>\n </header>\n {target ? (\n <div\n className=\"power-logs-target power-logs-muted\"\n title={`${target.kind} / ${target.name} · ${target.namespace} · UID ${target.uid}`}\n >\n <strong>\n {target.kind} / {target.name}\n </strong>{\" \"}\n · {target.namespace}\n </div>\n ) : (\n <SourcePicker />\n )}\n {error && (\n <div role=\"alert\" className=\"power-logs-notice power-logs-error\">\n {error}\n </div>\n )}\n {tab === \"live\" ? (\n <>\n <div className=\"power-logs-filters\">\n <input\n aria-label=\"Search log messages\"\n placeholder=\"Search messages…\"\n value={text}\n maxLength={300}\n onChange={(event) => setText(event.target.value)}\n />\n <LogSelect\n label=\"Log level\"\n value={level}\n onChange={setLevel}\n options={[\n { value: \"\", label: \"All levels\" },\n ...levels.map((value) => ({ value, label: value.toUpperCase() })),\n ]}\n />\n <LogSelect\n label=\"Container source\"\n renderOption={(option, context) => {\n if (context !== \"menu\") return <span title={option.label}>{option.label}</span>;\n const item = sources.find((item) => sourceKey(item) === option.value);\n return (\n <span className=\"power-logs-source-option\" title={option.label}>\n <Icon material={item ? \"view_in_ar\" : \"layers\"} size={16} />\n <span className=\"power-logs-option-text\">\n <strong>{item ? item.pod : option.value ? \"All pods\" : option.label}</strong>\n <small>\n {option.value\n ? `Container · ${item?.container ?? option.value.slice(10)}`\n : \"Every pod and container\"}\n {item?.previous ? \" · Previous\" : \"\"}\n </small>\n </span>\n <span className=\"power-logs-source-check\" aria-hidden=\"true\">\n {source === option.value && <Icon material=\"check\" size={16} />}\n </span>\n </span>\n );\n }}\n value={source}\n onChange={setSource}\n options={[\n { value: \"\", label: `All sources (${sources.length})` },\n ...[...new Set(sources.map((item) => item.container))].map((container) => ({\n value: `container:${container}`,\n label: `All pods / ${container}`,\n })),\n ...[...new Set(sources.map(sourceKey))].map((value) => ({ value, label: value })),\n ]}\n />\n <button\n type=\"button\"\n disabled={!sources.length || busy || capturePending}\n aria-pressed={live}\n onClick={toggleLive}\n >\n <Icon material={live ? \"pause\" : \"play_arrow\"} size={16} /> {live ? \"Pause\" : \"Live\"}\n </button>\n <button type=\"button\" aria-pressed={follow} onClick={() => setFollow(!follow)}>\n <Icon material=\"vertical_align_bottom\" size={16} /> Follow tail\n </button>\n {busy && (\n <button onClick={() => historyController.current?.abort()} type=\"button\">\n <Icon material=\"stop\" size={16} /> Stop loading\n </button>\n )}\n </div>\n <FieldFilters\n filters={fieldFilters}\n onRemove={(index) => setFieldFilters(fieldFilters.filter((_, item) => item !== index))}\n />\n <div\n className=\"power-logs-muted power-logs-status\"\n role=\"status\"\n title={`${status} · Viewer retains up to ${limits.liveRows.toLocaleString()} lines / ${limits.liveBytes / 1048576} MiB`}\n >\n <span>{filtered.length.toLocaleString()} matching lines</span> · {status}\n {liveCoverage && live ? ` · ${liveCoverage.active}/${liveCoverage.total} active sources` : \"\"} · Viewer\n retains up to {limits.liveRows.toLocaleString()} lines / {limits.liveBytes / 1048576} MiB\n </div>\n <div className=\"power-logs-workspace\">\n <LogRows\n records={filtered}\n loading={busy}\n selected={selected?.key}\n onSelect={setSelected}\n follow={follow}\n setFollow={setFollow}\n compact={compact}\n />\n {selected && (\n <LogDetails record={selected} onClose={() => setSelected(undefined)} onFilter={addLiveFilter} />\n )}\n </div>\n </>\n ) : (\n <>\n <div className=\"power-logs-toolbar power-logs-snapshot-bar\">\n <span className=\"power-logs-control-label\">Snapshot</span>\n <LogSelect\n label=\"Capture snapshot\"\n onKeyDown={(event) => {\n if (\n event.key !== \"Delete\" ||\n !event.altKey ||\n ((event.target as HTMLInputElement).value ?? \"\").length > 0\n )\n return;\n const button = document.querySelector<HTMLButtonElement>(\n \".Select__menu .Select__option--is-focused [data-capture-delete]\",\n );\n if (button && !button.disabled) {\n event.preventDefault();\n event.stopPropagation();\n void deleteCapture(button.dataset.captureDelete!);\n }\n }}\n renderOption={(option, context) => {\n const item = captures.find((item) => item.id === option.value);\n if (context !== \"menu\" || !item) return option.label;\n return (\n <span className=\"power-logs-snapshot-option\" title={option.label}>\n <span className=\"power-logs-option-text\">\n <strong>{item.target.name}</strong>\n <small>\n {formatDateTime(item.createdAt)} · {item.rows.toLocaleString()} lines ·{\" \"}\n {item.state[0].toUpperCase()}\n {item.state.slice(1)}\n </small>\n </span>\n <button\n type=\"button\"\n aria-label={`Delete snapshot ${item.target.name}`}\n title=\"Delete snapshot (Alt+Delete)\"\n data-capture-delete={item.id}\n onKeyDown={(event) => event.stopPropagation()}\n disabled={!!queryId || capturePending || deletingCount > 0 || item.state === \"collecting\"}\n onMouseDown={(event) => {\n event.preventDefault();\n event.stopPropagation();\n }}\n onClick={(event) => {\n event.preventDefault();\n event.stopPropagation();\n void deleteCapture(item.id);\n }}\n >\n <Renderer.Component.Icon\n material=\"delete_outline\"\n size={16}\n tooltip=\"Delete snapshot\"\n tooltipOverrideDisabled\n />\n </button>\n </span>\n );\n }}\n value={captureId}\n disabled={!!queryId || capturePending || deletingCount > 0}\n onChange={(value) => {\n setCaptureId(value);\n setResult(undefined);\n setResultEvidence(undefined);\n setSelectedSqlRow(undefined);\n setSqlError(\"\");\n }}\n options={[\n { value: \"\", label: \"Choose a snapshot\" },\n ...captures.map((item) => ({\n value: item.id,\n label: `${item.target.name} · ${formatDateTime(item.createdAt)} · ${item.rows.toLocaleString()} lines · ${item.state[0].toUpperCase()}${item.state.slice(1)}`,\n })),\n ]}\n />\n <button\n type=\"button\"\n disabled={!captureId || !!queryId || deleting.current.has(captureId)}\n title=\"Export JSON Lines (NDJSON)\"\n onClick={() => {\n void client.export(captureId).catch(() => setError(\"Could not export capture\"));\n }}\n >\n <Icon material=\"download\" size={16} /> Export JSON\n </button>\n </div>\n {!!chosenCapture?.notes.length && (\n <details className=\"power-logs-snapshot-notes power-logs-muted\">\n <summary>Snapshot notes ({chosenCapture.notes.length})</summary>\n {chosenCapture.notes.map((note) => (\n <div key={note}>{note}</div>\n ))}\n </details>\n )}\n <div className=\"power-logs-toolbar power-logs-sql-tools\">\n <label\n htmlFor=\"power-logs-sql\"\n className=\"power-logs-control-label\"\n title={`Read-only SELECT · ${limits.queryMs / 1000} s · ${limits.resultRows.toLocaleString()} rows · Schema: logs(timestamp INTEGER in milliseconds, pod, podUid, container, level, message, fieldsJson, previous INTEGER 0 or 1)`}\n >\n SQL query\n </label>\n <button\n type=\"button\"\n disabled={\n !chosenCapture ||\n !!queryId ||\n capturePending ||\n deleting.current.has(captureId) ||\n chosenCapture.state === \"collecting\"\n }\n onClick={() => void runQuery()}\n >\n <Icon material=\"play_arrow\" size={16} /> Run query\n </button>\n {queryId && (\n <button\n type=\"button\"\n onClick={() => {\n void client.cancel(queryId).catch(() => setError(\"Could not cancel query\"));\n }}\n >\n <Icon material=\"stop\" size={16} /> Cancel\n </button>\n )}\n {examples.map(([title, query]) => (\n <button\n type=\"button\"\n key={title}\n disabled={!!queryId || capturePending}\n onClick={() => (title === \"JSON\" || title === \"Recent\" ? void applyPreset(title) : setSql(query))}\n >\n <Icon\n material={\n title === \"Recent\"\n ? \"history\"\n : title === \"Errors\"\n ? \"error_outline\"\n : title === \"Timeline\"\n ? \"timeline\"\n : \"data_object\"\n }\n size={16}\n />{\" \"}\n SQL · {title}\n </button>\n ))}\n </div>\n <FieldFilters\n sql\n filters={activeSqlFilters?.filters ?? []}\n disabled={sqlFilteringDisabled}\n onRemove={(index) => applySqlFilters((activeSqlFilters?.filters ?? []).filter((_, item) => item !== index))}\n />\n <SqlEditor id=\"power-logs-sql\" value={sql} onChange={setSql} />\n {sqlError && (\n <div role=\"alert\" className=\"power-logs-notice power-logs-error power-logs-query-error\">\n {sqlError}\n </div>\n )}\n {result ? (\n <>\n <div className=\"power-logs-toolbar power-logs-results-bar\">\n <span role=\"status\" className=\"power-logs-muted\">\n {result.rows.length} rows · {result.elapsedMs} ms{result.truncated ? \" · Result truncated\" : \"\"}\n </span>\n </div>\n <div className=\"power-logs-workspace\">\n <div className=\"power-logs-results\">\n <table\n style={{\n minWidth:\n result.columns.length > 3\n ? result.columns.reduce((width, column) => width + sqlColumnWidth(column), 0)\n : undefined,\n }}\n >\n <colgroup>\n {result.columns.map((column, i) => (\n <col\n key={i}\n style={{\n width: result.columns.length > 3 ? sqlColumnWidth(column) : undefined,\n }}\n />\n ))}\n </colgroup>\n <thead>\n <tr>\n {result.columns.map((column, i) => (\n <th key={i} data-column={column}>\n {column}\n </th>\n ))}\n </tr>\n </thead>\n <tbody>\n {result.rows.slice(resultPage * 50, (resultPage + 1) * 50).map((row, i) => (\n <tr\n key={i}\n tabIndex={0}\n aria-label={`Open SQL row ${resultPage * 50 + i + 1}`}\n onClick={() => setSelectedSqlRow({ ...sqlRowDetails(result.columns, row), row })}\n onKeyDown={(event) => {\n if (event.key === \"Enter\" || event.key === \" \") {\n event.preventDefault();\n setSelectedSqlRow({ ...sqlRowDetails(result.columns, row), row });\n }\n }}\n >\n {row.map((cell, j) => (\n <td\n key={j}\n data-column={result.columns[j]}\n data-level={sqlCellLevel(result.columns[j], cell)}\n >\n <LogJsonCell\n value={cell === null ? null : String(cell)}\n column={result.columns[j]}\n rawValue={cell}\n Icon={Icon}\n onFilter={\n sqlFilteringDisabled ? undefined : (filter) => addSqlFilter(result.columns[j], filter)\n }\n />\n </td>\n ))}\n </tr>\n ))}\n </tbody>\n </table>\n {result.rows.length === 0 && (\n <div className=\"power-logs-empty\">\n {chosenCapture?.rows === 0\n ? \"This snapshot contains no log lines. Try a longer capture window.\"\n : \"This query returned no rows. Adjust the query or choose SQL · Recent.\"}\n </div>\n )}\n </div>\n {selectedSqlRow && (\n <LogDetails\n record={selectedSqlRow.record}\n jsonColumn={selectedSqlRow.jsonColumn}\n onFilter={\n !sqlFilteringDisabled && selectedSqlRow.jsonColumn\n ? (filter) => addSqlFilter(selectedSqlRow.jsonColumn!, filter)\n : undefined\n }\n onClose={() => setSelectedSqlRow(undefined)}\n />\n )}\n </div>\n {result.rows.length > 50 && (\n <nav className=\"power-logs-toolbar power-logs-pagination\" aria-label=\"SQL result pages\">\n <button\n type=\"button\"\n aria-label=\"Previous page\"\n title=\"Previous page\"\n disabled={resultPage === 0}\n onClick={() => {\n setResultPage(resultPage - 1);\n setSelectedSqlRow(undefined);\n }}\n >\n <Icon material=\"chevron_left\" size={16} />\n </button>\n <span className=\"power-logs-muted\">\n Page {resultPage + 1} / {Math.max(1, Math.ceil(result.rows.length / 50))}\n </span>\n <button\n type=\"button\"\n aria-label=\"Next page\"\n title=\"Next page\"\n disabled={(resultPage + 1) * 50 >= result.rows.length}\n onClick={() => {\n setResultPage(resultPage + 1);\n setSelectedSqlRow(undefined);\n }}\n >\n <Icon material=\"chevron_right\" size={16} />\n </button>\n </nav>\n )}\n </>\n ) : (\n <div className=\"power-logs-results power-logs-empty\">\n {queryId\n ? \"Running query…\"\n : captures.length === 0\n ? \"Capture logs to create a temporary snapshot for SQL.\"\n : \"Choose a snapshot to preview its logs.\"}\n </div>\n )}\n </>\n )}\n <div className=\"power-logs-muted power-logs-footer\">\n <span\n className=\"power-logs-caption\"\n title={`Gentle collection: ${limits.requestsPerSecond} requests/s, ${limits.bytesPerSecond / 1048576} MiB/s. Captures: ${limits.captureSourceLines.toLocaleString()} lines / ${limits.captureSourceBytes / 1048576} MiB per source, ${limits.captureBytes / 1048576} MiB total. Up to ${limits.captures} snapshots retained for ${limits.ttlMs / 60000} minutes.`}\n >\n Gentle collection · {limits.requestsPerSecond} requests/s · {limits.bytesPerSecond / 1048576} MiB/s · Captures\n limited to {limits.captureSourceLines.toLocaleString()} lines / {limits.captureSourceBytes / 1048576} MiB per\n source and {limits.captureBytes / 1048576} MiB total · Up to {limits.captures} temporary snapshots, retained\n for {limits.ttlMs / 60000} min\n </span>\n {collectionNotes.length > 0 && (\n <span role=\"note\" className=\"power-logs-notice power-logs-collection-note\" title={collectionNotes.join(\"\\n\")}>\n <Icon material=\"warning_amber\" size={14} />\n <span>{collectionNotes.join(\" · \")}</span>\n </span>\n )}\n </div>\n </div>\n );\n}\n\nconst ObservedWorkspace = observer(Workspace);\n\nexport const PowerLogsPage = observer(() => {\n const enabled = LogsPreferencesStore.getInstanceOrCreate<LogsPreferencesStore>().enabled;\n const clusterId = Renderer.Catalog.activeCluster.get()?.metadata.uid;\n if (!enabled || !clusterId)\n return (\n <div className=\"power-logs\">\n <style>{powerLogsStyles}</style>\n <h1>Power Logs</h1>\n <p>Enable Power Logs in Power settings and open a cluster to view logs.</p>\n </div>\n );\n const contextId = searchContextId();\n return <ObservedWorkspace key={`${clusterId}:${contextId}`} clusterId={clusterId} contextId={contextId} />;\n});\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA+CA,IAAM,QAAQ,UACZ,oCAAA,IAAC,QAAD;CAAM,eAAY;CAAO,OAAO,EAAE,SAAS,cAAc;WACvD,oCAAA,IAAC,mBAAA,SAAS,UAAU,MAApB,EAAyB,GAAI,MAAQ,CAAA;AACjC,CAAA;AAER,IAAM,aAAa,MACjB,GAAG,EAAE,IAAI,KAAK,EAAE,YAAY,EAAE,WAAW,gBAAgB;AAC3D,IAAM,SAAqB;CAAC;CAAS;CAAS;CAAQ;CAAQ;CAAS;CAAS;AAAS;AACzF,IAAM,WAAW;CACf,CAAC,UAAU,yGAAyG;CACpH,CACE,UACA,mIACF;CACA,CACE,YACA,uKACF;CACA,CAAC,QAAQ,oEAAoE;AAC/E;AACA,IAAM,kBAAkB,WACtB,WAAW,aAAa,WAAW,eAAe,MAAM,WAAW,UAAU,KAAK;AAGpF,SAAS,gBAAuC;CAC9C,IAAI;EACF,OAAO,+BAAA,qBAAqB,KAAK,MAAM,IAAI,gBAAgB,OAAO,SAAS,MAAM,CAAC,CAAC,IAAI,QAAQ,KAAK,MAAM,CAAC;CAC7G,QAAQ;EACN;CACF;AACF;AACA,SAAS,cAAc,YAAqB,IAAI,gBAAgB,OAAO,SAAS,MAAM,CAAC,CAAC,IAAI,WAAW,GAAW;CAChH,OAAO,OAAO,cAAc,YAAY,oCAAoC,KAAK,SAAS,KAAK,UAAU,UAAU,KAC/G,aAAa,cACb;AACN;AAEA,SAAS,UAAU,EACjB,OACA,OACA,SACA,UACA,WAAW,OACX,cACA,aASC;CACD,OACE,oCAAA,IAAC,QAAD;EAAM,WAAU;EAAoB,sBAAoB,UAAU,sBAAsB,KAAA;YACtF,oCAAA,IAAC,mBAAA,SAAS,UAAU,QAApB;GACE,cAAY;GACL;GACE;GACT,oBAAoB,QAAQ,SAC1B,eACE,aAAa,QAAQ,KAAK,OAAO,IAC/B,UAAU,eAAe,OAAO,QAClC,oCAAA,IAAC,QAAD;IAAM,WAAU;IAAyB,cAAY,OAAO;cACzD,OAAO;GACJ,CAAA,IAEN,OAAO;GAGX,YAAY;GACD;GACX,iBAAiB;GACjB,aAAa;GACb,cAAa;GACb,kBAAkB,SAAS;GAC3B,QAAQ;IACN,OAAO,SAAU,UAAU,qBAAqB;KAAE,GAAG;KAAM,OAAO;KAAQ,UAAU;IAAO,IAAI;IAC/F,WAAW,SAAU,UAAU,qBAAqB;KAAE,GAAG;KAAM,OAAO;KAAQ,UAAU;IAAO,IAAI;IACnG,SAAS,SAAU,UAAU,qBAAqB;KAAE,GAAG;KAAM,YAAY;IAAS,IAAI;IACtF,aAAa,SAAS;KACpB,IAAI,UAAU,sBAAsB,UAAU,oBAAoB,OAAO;MAAE,GAAG;MAAM,QAAQ;KAAM;KAClG,MAAM,QAAQ,KAAK,IAAI,UAAU,qBAAqB,MAAM,KAAK,OAAO,aAAa,EAAE;KACvF,OAAO;MACL,GAAG;MACH,QAAQ;MACR;MACA,MAAM,KAAK,IACT,IACA,KAAK,IAAI,OAAO,KAAK,SAAS,WAAW,KAAK,OAAO,IAAI,OAAO,aAAa,QAAQ,EAAE,CACzF;KACF;IACF;GACF;GACA,WAAW,WAAW;IACpB,IAAI,QAAQ,SAAS,OAAO,KAAK;GACnC;EACD,CAAA;CACG,CAAA;AAEV;AAEA,IAAM,eAAe,oCAAA,eAAe;CAUlC,MAAM,UAAU;EARd,mBAAA,SAAS,OAAO;EAChB,mBAAA,SAAS,OAAO;EAChB,mBAAA,SAAS,OAAO;EAChB,mBAAA,SAAS,OAAO;EAChB,mBAAA,SAAS,OAAO;EAChB,mBAAA,SAAS,OAAO;EAChB,mBAAA,SAAS,OAAO;CAEF,CAAA,CAAO,SAAS,UAC9B,MAAM,SAAS,CAAC,CAAC,SAAS,WAAW;EACnC,MAAM,SAAS,+BAAA,qBAAqB;GAAE,MAAM,OAAO;GAAM,GAAG,OAAO;EAAS,CAAC;EAC7E,OAAO,SAAS,CAAC,MAAM,IAAI,CAAC;CAC9B,CAAC,CACH;CACA,MAAM,CAAC,OAAO,YAAY,+BAAA,SAAS,EAAE;CACrC,MAAM,SAAS,CAAC,GAAG,OAAO,CAAC,CAAC,MAAM,GAAG,MACnC,GAAG,EAAE,UAAU,GAAG,EAAE,KAAK,GAAG,EAAE,OAAO,cAAc,GAAG,EAAE,UAAU,GAAG,EAAE,KAAK,GAAG,EAAE,MAAM,CACzF;CACA,OACE,oCAAA,KAAC,OAAD;EAAK,WAAU;YAAf;GACE,oCAAA,IAAC,QAAD;IAAM,WAAU;cAA2B;GAAc,CAAA;GACzD,oCAAA,IAAC,WAAD;IACE,OAAM;IACC;IACP,UAAU;IACV,SAAS,CACP;KAAE,OAAO;KAAI,OAAO;IAAkC,GACtD,GAAG,OAAO,KAAK,YAAY;KACzB,OAAO,OAAO;KACd,OAAO,GAAG,OAAO,UAAU,KAAK,OAAO,KAAK,KAAK,OAAO;IAC1D,EAAE,CACJ;GACD,CAAA;GACD,oCAAA,KAAC,UAAD;IACE,MAAK;IACL,UAAU,CAAC,QAAQ,MAAM,WAAW,OAAO,QAAQ,KAAK;IACxD,eAAe;KACb,MAAM,SAAS,QAAQ,MAAM,MAAM,EAAE,QAAQ,KAAK;KAClD,IAAI,QAAQ,+BAAA,cAAc,MAAM;IAClC;cANF,CAQE,oCAAA,IAAC,MAAD;KAAM,UAAS;KAAU,MAAM;IAAK,CAAA,GAAC,YAC/B;;EACL;;AAET,CAAC;AAED,SAAS,QAAQ,EACf,SACA,SACA,UACA,UACA,QACA,WACA,WASC;CACD,MAAM,WAAW,+BAAA,OAAuB,IAAI;CAC5C,MAAM,CAAC,KAAK,UAAU,+BAAA,SAAS,CAAC;CAChC,MAAM,CAAC,QAAQ,aAAa,+BAAA,SAAS,GAAG;CACxC,+BAAA,gBAAgB;EACd,MAAM,UAAU,SAAS;EACzB,IAAI,CAAC,SAAS;EACd,MAAM,SAAS,IAAI,qBAAqB,UAAU,QAAQ,YAAY,CAAC;EACvE,OAAO,QAAQ,OAAO;EACtB,aAAa,OAAO,WAAW;CACjC,GAAG,CAAC,CAAC;CACL,+BAAA,sBAAsB;EACpB,IAAI,UAAU,SAAS,SAAS;GAC9B,SAAS,QAAQ,YAAY,SAAS,QAAQ;GAC9C,OAAO,SAAS,QAAQ,SAAS;EACnC;CACF,GAAG;EAAC;EAAS;EAAQ;CAAO,CAAC;CAC7B,MAAM,kBAAkB,+BAAA,cAChB,QAAQ,QAAQ,OAAO,WAAW,KAAK,IAAI,OAAO,OAAO,MAAM,MAAM,GAAG,CAAC,GAC/E,CAAC,OAAO,CACV;CACA,MAAM,YAAY,UAAU,KAAK;CACjC,MAAM,QAAQ,KAAK,IAAI,GAAG,KAAK,MAAM,MAAM,SAAS,IAAI,CAAC;CACzD,MAAM,UAAU,QAAQ,MAAM,OAAO,QAAQ,KAAK,KAAK,SAAS,SAAS,IAAI,EAAE;CAC/E,OACE,oCAAA,IAAC,OAAD;EAAK,WAAU;YACb,oCAAA,IAAC,OAAD;GACE,WAAU;GACV,KAAK;GACL,OAAO,EAAE,wBAAwB,gBAAgB;GACjD,cAAW;GACX,aAAW;GACX,WAAW,UAAU;IACnB,MAAM,KAAK,MAAM;IACjB,OAAO,GAAG,SAAS;IACnB,IAAI,GAAG,eAAe,GAAG,YAAY,GAAG,eAAe,IAAI,UAAU,KAAK;GAC5E;aAEC,QAAQ,WAAW,IAClB,oCAAA,IAAC,OAAD;IAAK,WAAU;cAAoB,UAAU,kBAAkB;GAA6B,CAAA,IAE5F,oCAAA,IAAC,OAAD;IAAK,OAAO;KAAE,QAAQ,QAAQ,SAAS;KAAW,UAAU;IAAW;cACpE,QAAQ,KAAK,QAAQ,MACpB,oCAAA,KAAC,UAAD;KACE,MAAK;KACL,WAAU;KACV,cAAY,OAAO;KACnB,gBAAc,aAAa,OAAO;KAClC,OAAO;MAAE,MAAM,QAAQ,KAAK;MAAW,QAAQ;KAAU;KAEzD,eAAe,SAAS,MAAM;eAPhC;MASE,oCAAA,IAAC,QAAD;OAAM,OAAO,OAAO,cAAc,OAAO,kBAAA,eAAe,OAAO,SAAS,IAAI;iBACzE,OAAO,cAAc,OAAO,kBAAA,eAAe,OAAO,SAAS,CAAC,CAAC,MAAM,EAAE,IAAI;MACtE,CAAA;MACN,oCAAA,IAAC,QAAD;OAAM,WAAU;iBAAmB,OAAO;MAAY,CAAA;MACtD,oCAAA,KAAC,QAAD;OAAM,WAAU;OAAmB,IAAI,oBAAoB,OAAO;iBAAlE;QACG,OAAO;QACP,OAAO,WAAW,gBAAgB;QACnC,oCAAA,IAAC,mBAAA,SAAS,UAAU,SAApB;SAA4B,UAAU,oBAAoB,OAAO;mBAC9D,UAAU,MAAM;QACS,CAAA;OACxB;;MACN,oCAAA,IAAC,0BAAA,YAAD,EAAY,MAAM,OAAO,QAAU,CAAA;KAC7B;OAfD,OAAO,GAeN,CACT;GACE,CAAA;EAEJ,CAAA;CACF,CAAA;AAET;AAEA,SAAS,WAAW,EAClB,QACA,YACA,SACA,YAMC;CACD,MAAM,mBAAmB,+BAAA,cAAc;EACrC,IAAI,CAAC,QAAQ,YAAY,OAAO;EAChC,OAAO,8BAAA,kBAAkB,OAAO,UAAU;CAC5C,GAAG,CAAC,QAAQ,UAAU,CAAC;CACvB,MAAM,gBAAgB,+BAAA,cAAc,CAAC,8BAAA,qBAAqB,OAAO,cAAc,EAAE,GAAG,CAAC,OAAO,UAAU,CAAC;CACvG,MAAM,CAAC,cAAc,mBAAmB,+BAAA,SAAS,EAAE;CACnD,+BAAA,gBAAgB,gBAAgB,EAAE,GAAG,CAAC,gBAAgB,CAAC;CACvD,OACE,oCAAA,KAAC,SAAD;EAAO,WAAU;EAAoB,cAAW;YAAhD;GACE,oCAAA,KAAC,UAAD,EAAA,UAAA,CACE,oCAAA,IAAC,UAAD,EAAA,UAAQ,eAAoB,CAAA,GAC5B,oCAAA,IAAC,UAAD;IACE,WAAU;IACV,cAAW;IACX,OAAM;IACN,SAAS;cAET,oCAAA,IAAC,MAAD;KAAM,UAAS;KAAQ,MAAM;IAAK,CAAA;GAC5B,CAAA,CACF,EAAA,CAAA;GACR,oCAAA,IAAC,KAAD;IAAG,WAAU;cACV,CAAC,OAAO,OAAO,UAAU,MAAM,GAAG,OAAO,MAAM,YAAY,CAAC,CAAC,CAAC,OAAO,OAAO,CAAC,CAAC,KAAK,KAAK;GACxF,CAAA;GACF,OAAO,WACN,oCAAA,IAAC,OAAD,EAAA,UACE,oCAAA,IAAC,0BAAA,YAAD,EAAY,MAAM,OAAO,QAAU,CAAA,EAChC,CAAA;GAEN,OAAO,cACN,oCAAA,KAAA,oBAAA,UAAA,EAAA,UAAA,CACE,oCAAA,KAAC,OAAD;IAAK,WAAU;cAAf;KACE,oCAAA,IAAC,UAAD,EAAA,UAAS,aAAa,uBAAuB,eAAe,oBAA4B,CAAA;KACxF,oCAAA,IAAC,UAAD;MACE,MAAK;MACL,WAAU;MACV,cAAW;MACX,OAAO,gBAAgB;MACvB,eAAe;OACb,IAAI;QACF,SAAA,UAAU,UAAU,gBAAgB;QACpC,gBAAgB,QAAQ;OAC1B,QAAQ;QACN,gBAAgB,qBAAqB;OACvC;MACF;gBAEA,oCAAA,IAAC,MAAD;OAAM,UAAU,iBAAiB,WAAW,UAAU;OAAgB,MAAM;MAAK,CAAA;KAC3E,CAAA;KACR,oCAAA,IAAC,QAAD;MAAM,WAAU;MAAmB,aAAU;gBAC1C;KACG,CAAA;IACH;OACL,oCAAA,IAAC,uBAAA,SAAD;IAAS,MAAM;IAAiC;IAAqB;IAAgB;GAAW,CAAA,CAChG,EAAA,CAAA;EAEC;;AAEX;AAEA,IAAM,mBAAmB,GAAoB,MAC3C,EAAE,aAAa,EAAE,YACjB,EAAE,KAAK,WAAW,EAAE,KAAK,UACzB,EAAE,KAAK,OAAO,MAAM,UAAU,SAAS,EAAE,KAAK,MAAM,KACpD,gCAAA,gBAAgB,EAAE,OAAO,EAAE,KAAK;AAClC,IAAM,oBAAoB,WACxB,GAAG,OAAO,KAAK,QAAgB,MAAM,SAAS,GAAG,KAAK,GAAG,OAAO,SAAS,WAAW,OAAO,KAAK,UAAU,IAAI,EAAE,IAAI,GAAG,EAAE,GAAG,OAAO,aAAa,OAAO,MAAM,KAAK,GAAG,KAAK,UAAU,OAAO,KAAK;AAClM,SAAS,aAAa,EACpB,SACA,MAAM,OACN,WAAW,OACX,YAMC;CACD,IAAI,CAAC,QAAQ,QAAQ,OAAO;CAC5B,OACE,oCAAA,KAAC,OAAD;EAAK,WAAU;EAA2B,cAAY,MAAM,qBAAqB;YAAjF,CACE,oCAAA,KAAC,QAAD;GAAM,WAAU;aAAhB,CAAoC,MAAM,mBAAmB,gBAAe,QAAY;MACvF,QAAQ,KAAK,QAAQ,UAAU;GAC9B,MAAM,QAAQ,GAAG,OAAO,SAAS,GAAG,OAAO,OAAO,KAAK,KAAK,iBAAiB,MAAM;GACnF,OACE,oCAAA,KAAC,UAAD;IACE,MAAK;IAEK;IACV,OAAO;IACP,cAAY,sBAAsB;IAClC,eAAe,SAAS,KAAK;cAN/B,CAQE,oCAAA,IAAC,QAAD,EAAA,UAAO,MAAY,CAAA,GACnB,oCAAA,IAAC,MAAD;KAAM,UAAS;KAAQ,MAAM;IAAK,CAAA,CAC5B;MARD,KAQC;EAEZ,CAAC,CACE;;AAET;AAEA,SAAS,UAAU,EAAE,WAAW,aAAuD;CACrF,MAAM,SAAS,+BAAA,cAAc,0BAAA,sBAAsB;EAAE;EAAW;CAAU,CAAC,GAAG,CAAC,WAAW,SAAS,CAAC;CACpG,MAAM,SAAS,+BAAA,cAEX,IAAI,8BAAA,kBACD,IAAI,UAAU,OAAO,QAAQ,IAAI,KAAK,SACjC,SAAS,8EAA8E,CAC/F,GACF,CAAC,MAAM,CACT;CACA,+BAAA,sBACc;EACV,OAAY,QAAQ;CACtB,GACA,CAAC,MAAM,CACT;CACA,MAAM,CAAC,QAAQ,aAAa,+BAAA,SAAS,aAAa;CAClD,MAAM,CAAC,SAAS,cAAc,+BAAA,SAAuB,CAAC,CAAC;CACvD,MAAM,CAAC,SAAS,cAAc,+BAAA,SAAsB,CAAC,CAAC;CACtD,MAAM,CAAC,OAAO,YAAY,+BAAA,SAAmB,CAAC,CAAC;CAC/C,MAAM,CAAC,QAAQ,aAAa,+BAAA,SAAS,oCAAoC;CACzE,MAAM,CAAC,OAAO,YAAY,+BAAA,SAAS,EAAE;CACrC,MAAM,CAAC,UAAU,eAAe,+BAAA,SAAS,EAAE;CAC3C,MAAM,CAAC,KAAK,UAAU,+BAAA,SAA8B,MAAM;CAC1D,MAAM,CAAC,MAAM,WAAW,+BAAA,SAAS,EAAE;CACnC,MAAM,CAAC,OAAO,YAAY,+BAAA,SAAS,EAAE;CACrC,MAAM,CAAC,QAAQ,aAAa,+BAAA,SAAS,aAAa;CAClD,MAAM,CAAC,cAAc,mBAAmB,+BAAA,SAA4B,CAAC,CAAC;CACtE,MAAM,cAAc,+BAAA,cAAc,gCAAA,mBAAmB,YAAY,GAAG,CAAC,YAAY,CAAC;CAClF,MAAM,eAAe,+BAAA,uBAAO,IAAI,QAA4B,CAAC;CAC7D,MAAM,CAAC,iBAAiB,sBAAsB,+BAAA,SAK3C;CACH,MAAM,cAAc,+BAAA,qBAAqB,oBAA0C;CACnF,MAAM,SAAS,0BAAA,yBAAyB,YAAY,MAAM;CAC1D,+BAAA,gBAAgB;EACd,0BAAA,qBAAqB,YAAY,MAAM;CACzC,GAAG,CAAC,YAAY,MAAM,CAAC;CACvB,MAAM,CAAC,SAAS,cAAc,+BAAA,SAAS,YAAY,gBAAgB,IAAI;CACvE,MAAM,CAAC,kBAAkB,uBAAuB,+BAAA,SAAS,YAAY,2BAA2B,IAAI;CACpG,MAAM,CAAC,UAAU,eAAe,+BAAA,SAAqB;CACrD,MAAM,CAAC,gBAAgB,qBAAqB,+BAAA,SAE1C;CACF,MAAM,CAAC,cAAc,mBAAmB,+BAAA,SAA0B;CAClE,MAAM,CAAC,MAAM,WAAW,+BAAA,SAAS,KAAK;CACtC,MAAM,CAAC,QAAQ,aAAa,+BAAA,SAAS,IAAI;CACzC,MAAM,CAAC,MAAM,WAAW,+BAAA,eAAe,QAAQ,cAAc,CAAC,CAAC;CAC/D,MAAM,CAAC,UAAU,eAAe,+BAAA,SAAuB,CAAC,CAAC;CACzD,MAAM,CAAC,WAAW,mBAAmB,+BAAA,SAAS,EAAE;CAChD,MAAM,mBAAmB,+BAAA,OAAO,SAAS;CACzC,iBAAiB,UAAU;CAC3B,MAAM,gBAAgB,IAAY,WAAW,SAAS,MAAM,SAAS,KAAK,OAAO,EAAE,MAAM;EACvF,IAAI,OAAO,iBAAiB,SAAS,OAAY,MAAM;EACvD,iBAAiB,UAAU;EAC3B,MAAM,QAAQ,WAAW,OAAO,KAAK,UAAU,SAAS,EAAE,CAAC,EAAE,IAAI,SAAS,EAAE,CAAC;EAC7E,SAAS,UAAU;EACnB,UAAU,KAAK;EACf,gBAAgB,EAAE;CACpB;CACA,MAAM,WAAW,+BAAA,uBAAO,IAAI,IAAY,CAAC;CACzC,MAAM,CAAC,eAAe,oBAAoB,+BAAA,SAAS,CAAC;CACpD,MAAM,CAAC,WAAW,gBAAgB,+BAAA,SAAqB;CACvD,MAAM,CAAC,gBAAgB,qBAAqB,+BAAA,SAAS,KAAK;CAC1D,MAAM,CAAC,gBAAgB,qBAAqB,+BAAA,SAAS,EAAE;CACvD,MAAM,CAAC,UAAU,eAAe,+BAAA,SAAS,KAAK;CAC9C,MAAM,CAAC,KAAK,aAAa,+BAAA,SAAiB,SAAS,EAAE,CAAC,EAAE;CACxD,MAAM,WAAW,+BAAA,OAAO,GAAG;CAC3B,SAAS,UAAU;CACnB,MAAM,UAAU,UAAkB;EAChC,SAAS,UAAU;EACnB,UAAU,KAAK;EACf,IAAI,iBAAiB,SAAS,OAAO,IAAI,iBAAiB,SAAS,KAAK;CAC1E;CACA,MAAM,cAAc,+BAAA,uBAAO,IAAI,IAAsB,CAAC;CACtD,+BAAA,gBAAgB;EACd,oBAAoB,YAClB,YAAY,QAAQ,aAAa,OAAO,QAAQ,cAAc,aAAa,KAAA,IAAY,OACzF;CACF,GAAG,CAAC,KAAK,SAAS,CAAC;CACnB,MAAM,CAAC,QAAQ,aAAa,+BAAA,SAAyB;CACrD,MAAM,CAAC,gBAAgB,qBAAqB,+BAAA,SAA+D;CAC3G,MAAM,CAAC,YAAY,iBAAiB,+BAAA,SAAS,CAAC;CAC9C,MAAM,CAAC,SAAS,cAAc,+BAAA,SAAS,EAAE;CACzC,MAAM,iBAAiB,+BAAA,OAA2B,IAAI;CACtD,+BAAA,gBAAgB;EACd,MAAM,WAAW,UAAwB;GACvC,IACE,CAAC,eAAe,SAAS,SAAS,MAAM,MAAc,KACtD,CAAE,MAAM,QAAoB,UAAU,eAAe;QAEjD,eAAe,SAAS,eAAe,QAAQ,OAAO;GAAA;EAE9D;EACA,MAAM,UAAU,UAAyB;GACvC,IAAI,MAAM,QAAQ,YAAY,MAAM,oBAAqB,MAAM,QAAoB,UAAU,SAAS,GAAG;GACzG,IAAI,eAAe,SAAS,MAAM,eAAe,QAAQ,OAAO;QAC3D;IACH,YAAY,KAAA,CAAS;IACrB,kBAAkB,KAAA,CAAS;GAC7B;EACF;EACA,OAAO,iBAAiB,eAAe,OAAO;EAC9C,OAAO,iBAAiB,WAAW,MAAM;EACzC,aAAa;GACX,OAAO,oBAAoB,eAAe,OAAO;GACjD,OAAO,oBAAoB,WAAW,MAAM;EAC9C;CACF,GAAG,CAAC,CAAC;CACL,MAAM,oBAAoB,+BAAA,OAAwB;CAClD,MAAM,iBAAiB,+BAAA,OAAwB;CAC/C,MAAM,oBAAoB,+BAAA,OAAwB;CAClD,MAAM,WAAW,+BAAA,OAAO,EAAE;CAC1B,MAAM,QAAQ,+BAAA,OAAO,CAAC;CACtB,MAAM,QAAQ,+BAAA,OAAO,IAAI;CACzB,MAAM,WAAW,+BAAA,OAAO,CAAC;CACzB,MAAM,aAAa,+BAAA,OAAO,OAAO;CACjC,WAAW,UAAU;CACrB,MAAM,UAAU,+BAAA,OAAoB,CAAC,CAAC;CACtC,MAAM,aAAa,+BAAA,OAAsC;CACzD,MAAM,wBACJ,OACG,KAAK,CAAC,CACN,MAAM,UAAU;EACf,IAAI,MAAM,SAAS,YAAY,KAAK;CACtC,CAAC,CAAC,CACD,YAAY;EACX,IAAI,MAAM,SAAS,SAAS,oCAAoC;CAClE,CAAC;CACL,MAAM,iBAAiB;EACrB,eAAe,SAAS,MAAM;EAC9B,eAAe,UAAU,KAAA;EACzB,QAAQ,KAAK;CACf;CACA,MAAM,cAAc;EAClB,aAAa,WAAW,OAAO;EAC/B,WAAW,UAAU,KAAA;EACrB,MAAM,QAAQ,QAAQ;EACtB,QAAQ,UAAU,CAAC;EACnB,IAAI,CAAC,MAAM,UAAU,CAAC,MAAM,SAAS;EACrC,MAAM,OAAO,MAAM,KAAK,YAAY;GAClC,GAAG;GACH,KAAK,EAAE,SAAS;GAChB,OAAO,OAAO,WAAW,KAAK,UAAU,MAAM,CAAC;EACjD,EAAE;EACF,YAAY,YAAY;GACtB,MAAM,WAAW,CAAC,GAAG,SAAS,GAAG,IAAI;GACrC,IAAI,QAAQ,SAAS,QAAQ,KAAK,MAAM,MAAM,EAAE,OAAO,CAAC;GACxD,IAAI,QAAQ;GACZ,OAAO,SAAS,SAAS,QAAQ,mBAAA,kBAAE,YAAY,QAAQ,mBAAA,kBAAE,WAAW,SAAS,SAAS,QAAQ,CAAC;GAC/F,OAAO,SAAS,MAAM,KAAK,CAAC,CAAC,MAAM,GAAG,OAAO,EAAE,aAAa,MAAM,EAAE,aAAa,MAAM,EAAE,MAAM,EAAE,GAAG;EACtG,CAAC;CACH;CACA,MAAM,cAAc,UAAuB;EACzC,IAAI,CAAC,MAAM,SAAS;EACpB,QAAQ,QAAQ,KAAK,GAAG,KAAK;EAC7B,IAAI,QAAQ,QAAQ,SAAS,KAAM,MAAM;OACpC,WAAW,YAAY,WAAW,OAAO,EAAE;CAClD;CACA,+BAAA,gBAAgB;EACd,MAAM,UAAU;EAChB,MAAM,YAAY,UAAiB;GACjC,MAAM,OAAO,+BAAA,qBAAsB,MAAsB,MAAM;GAC/D,IAAI,MAAM;IACR,IAAI,SAAS,SAAS;KACpB,OAAY,OAAO,SAAS,OAAO,CAAC,CAAC,YAAY,CAAC,CAAC;KACnD,SAAS,UAAU;KACnB,WAAW,EAAE;IACf;IACA,UAAU,cAAe,MAAsB,OAAO,SAAS,CAAC;IAChE,UAAU,IAAI;GAChB;EACF;EACA,OAAO,iBAAiB,qBAAqB,QAAQ;EACrD,gBAAqB;EACrB,MAAM,QAAQ,kBAAkB,KAAK,gBAAgB,GAAG,GAAK;EAC7D,aAAa;GACX,MAAM,UAAU;GAChB,MAAM;GACN,cAAc,KAAK;GACnB,aAAa,WAAW,OAAO;GAC/B,kBAAkB,SAAS,MAAM;GACjC,eAAe,SAAS,MAAM;GAC9B,kBAAkB,SAAS,MAAM;GACjC,IAAI,SAAS,SAAS,OAAY,OAAO,SAAS,OAAO,CAAC,CAAC,YAAY,CAAC,CAAC;GACzE,OAAO,oBAAoB,qBAAqB,QAAQ;EAC1D;CACF,GAAG,CAAC,MAAM,CAAC;CACX,MAAM,cAAc,YAAY;EAC9B,IAAI,CAAC,QAAQ;EACb,MAAM,eAAe,EAAE,MAAM;EAC7B,kBAAkB,SAAS,MAAM;EACjC,SAAS;EACT,MAAM,aAAa,IAAI,gBAAgB;EACvC,kBAAkB,UAAU;EAC5B,aAAa,WAAW,OAAO;EAC/B,WAAW,UAAU,KAAA;EACrB,QAAQ,UAAU,CAAC;EACnB,QAAQ,IAAI;EACZ,WAAW,CAAC,CAAC;EACb,YAAY,KAAA,CAAS;EACrB,SAAS,EAAE;EACX,SAAS,CAAC,CAAC;EACX,UAAU,+BAA+B;EACzC,IAAI;GACF,MAAM,YAAY,6BAAA,yBAAyB,SAAS;GACpD,MAAM,YAAY,MAAM,6BAAA,kBAAkB,QAAQ,WAAW,WAAW,MAAM;GAC9E,IAAI,WAAW,OAAO,WAAW,iBAAiB,MAAM,SAAS;GACjE,WAAW,UAAU,OAAO;GAC5B,SAAS,UAAU,KAAK;GACxB,UAAU,WAAW,UAAU,QAAQ,OAAO,oBAAoB;GAClE,MAAM,UAAU,MAAM,6BAAA,sBAAsB,UAAU,SAAS,WAAW;IACxE,QAAQ,WAAW;IACnB,WAAW,mBAAA,kBAAE;IACb,YAAY,mBAAA,kBAAE;IACd,YAAY,UAAU;KACpB,IAAI,iBAAiB,MAAM,SAAS,WAAW,KAAK;IACtD;GACF,CAAC;GACD,IAAI,WAAW,OAAO,WAAW,iBAAiB,MAAM,SAAS;GACjE,MAAM;GACN,SAAS,CAAC,mBAAG,IAAI,IAAI,CAAC,GAAG,UAAU,OAAO,GAAG,QAAQ,KAAK,CAAC,CAAC,CAAC;GAC7D,UACE,GAAG,UAAU,QAAQ,OAAO,kBAAkB,OAAO,aAAa,eAAe,EAAE,8BAA8B,OAAO,eAAe,QAAQ,UACjJ;EACF,QAAQ;GACN,IAAI,MAAM,WAAW,iBAAiB,MAAM,SAC1C,SACE,WAAW,OAAO,UACd,wBACA,qFACN;EACJ,UAAU;GACR,IAAI,MAAM,WAAW,iBAAiB,MAAM,SAAS,QAAQ,KAAK;EACpE;CACF;CACA,+BAAA,gBAAgB;EACd,QAAQ,EAAE;EACV,gBAAgB,CAAC,CAAC;EAClB,WAAW,CAAC,CAAC;EACb,OAAO,MAAM;EACb,YAAiB;CACnB,GAAG,CAAC,QAAQ,GAAG,CAAC;CAChB,MAAM,mBAAmB;EACvB,IAAI,MAAM;GACR,SAAS;GACT;EACF;EACA,QAAQ,IAAI;CACd;CAEA,+BAAA,gBAAgB;EACd,IAAI,CAAC,QAAQ,CAAC,QAAQ,QAAQ;EAC9B,MAAM,aAAa,IAAI,gBAAgB;EACvC,eAAe,UAAU;EACzB,MAAM,YAAY,6BAAA,cAAc,SAAS,6BAAA,yBAAyB,SAAS,GAAG;GAC5E,QAAQ,WAAW;GACnB,WAAW,mBAAA,kBAAE;GACb,gBAAgB,WAAW;GAC3B,WAAW;GACX,aAAa,aAAa;IACxB,IAAI,MAAM,WAAW,eAAe,YAAY,YAC9C,gBAAgB;KAAE,GAAG;KAAU,OAAO,CAAC,GAAG,SAAS,KAAK;IAAE,CAAC;GAC/D;EACF,CAAC;EACD,gBAAgB,EAAE,GAAG,UAAU,SAAS,CAAC;EACzC,UAAe,KAAK,cAAc;GAChC,IAAI,MAAM,WAAW,CAAC,WAAW,OAAO,WAAW,eAAe,YAAY,YAAY;IACxF,eAAe,UAAU,KAAA;IACzB,QAAQ,KAAK;GACf;EACF,CAAC;EACD,aAAa;GACX,WAAW,MAAM;GACjB,IAAI,eAAe,YAAY,YAAY,eAAe,UAAU,KAAA;EACtE;CACF,GAAG,CAAC,MA1BmB,QAAQ,KAAK,SAAS,GAAG,KAAK,OAAO,GAAG,KAAK,WAAW,CAAC,CAAC,KAAK,GA0B5E,CAAc,CAAC;CACzB,+BAAA,gBAAgB;EACd,IAAI,CAAC,QAAQ,CAAC,QAAQ;EACtB,MAAM,aAAa,IAAI,gBAAgB;EACvC,MAAM,gBAAgB,MAAM;EAC5B,IAAI,aAAa;EACjB,MAAM,QAAQ,kBAAkB;GAC9B,IAAI,YAAY;GAChB,aAAa;GACb,6BAAK,kBAAkB,QAAQ,6BAAA,yBAAyB,SAAS,GAAG,WAAW,MAAM,CAAC,CACnF,MAAM,cAAc;IACnB,IAAI,WAAW,OAAO,WAAW,MAAM,YAAY,eAAe;IAClE,WAAW,UAAU,OAAO;IAC5B,SAAS,UAAU,KAAK;IACxB,UAAU,GAAG,UAAU,QAAQ,OAAO,yCAAyC;GACjF,CAAC,CAAC,CACD,YAAY;IACX,IAAI,CAAC,WAAW,OAAO,WAAW,MAAM,WAAW,MAAM,YAAY,eAAe;KAClF,SAAS;KACT,UAAU,YAAY,CACpB,mBAAG,IAAI,IAAI,CACT,GAAG,SACH,wFACF,CAAC,CACH,CAAC;IACH;GACF,CAAC,CAAC,CACD,cAAc;IACb,aAAa;GACf,CAAC;EACL,GAAG,GAAK;EACR,aAAa;GACX,cAAc,KAAK;GACnB,WAAW,MAAM;EACnB;CACF,GAAG,CAAC,MAAM,QAAQ,GAAG,CAAC;CACtB,MAAM,UAAU,YAAY;EAC1B,IAAI,CAAC,UAAU,kBAAkB,WAAW,SAAS,SAAS;EAC9D,kBAAkB,IAAI;EACtB,MAAM,aAAa,IAAI,gBAAgB;EACvC,kBAAkB,UAAU;EAC5B,IAAI;EACJ,IAAI,UAAU;EACd,IAAI,eAAyB,CAAC;EAC9B,SAAS,EAAE;EACX,SAAS;EACT,IAAI;GACF,UAAU,MAAM,OAAO,OAAO,MAAM;GACpC,aAAa,OAAO;GACpB,MAAM,YAAY,6BAAA,yBAAyB,SAAS;GACpD,MAAM,YAAY,MAAM,6BAAA,kBAAkB,QAAQ,WAAW,WAAW,MAAM;GAC9E,eAAe,UAAU;GACzB,UAAU,UAAU;GACpB,MAAM,iBAAiB,WACnB,CAAC,GAAG,UAAU,SAAS,GAAG,UAAU,QAAQ,KAAK,UAAU;IAAE,GAAG;IAAM,UAAU;GAAK,EAAE,CAAC,IACxF,UAAU;GACd,MAAM,WAAW,QAAQ;GACzB,MAAM,UAAU,MAAM,6BAAA,sBAAsB,gBAAgB,WAAW;IACrE,QAAQ,WAAW;IACnB,WAAW,mBAAA,kBAAE;IACb,4BAAW,IAAI,KAAK,WAAW,iBAAiB,GAAK,EAAA,CAAE,YAAY;IACnE,YAAY,mBAAA,kBAAE;IACd,WAAW,OAAO,UAAU;KAC1B,IAAI,MAAM,MAAM,WAAW,OAAO,cAAc,IAAI,GAAG;MACrD,UAAU;MACV,aAAa,KAAK,4EAA4E;KAChG;KACA,QAAQ,MAAM,QACX,WACC,OAAO,cAAc,QACpB,OAAO,aAAa,YAAY,OAAO,aAAa,WAAW,iBAAiB,GACrF;KACA,KAAK,IAAI,SAAS,GAAG,SAAS,MAAM,SAAU;MAC5C,MAAM,QAAqB,CAAC;MAC5B,IAAI,QAAQ;MACZ,OAAO,SAAS,MAAM,UAAU,MAAM,SAAS,mBAAA,kBAAE,WAAW;OAC1D,MAAM,SAAS,MAAM;OACrB,MAAM,OAAO,OAAO,WAAW,KAAK,UAAU,MAAM,CAAC,IAAI;OACzD,IAAI,MAAM,UAAU,QAAQ,OAAO,mBAAA,kBAAE,YAAY;OACjD,MAAM,KAAK,MAAM;OACjB,SAAS;OACT;MACF;MACA,IAAI,WAAW,OAAO,SAAS,MAAM,IAAI,MAAM,iBAAiB;MAChE,IAAI;OACF,UAAU,MAAM,OAAO,OAAO,QAAS,IAAI,KAAK;OAChD,IAAI,MAAM,SAAS,aAAa,OAAO;MACzC,QAAQ;OACN,WAAW,MAAM;OACjB,MAAM,IAAI,MAAM,yDAAyD;MAC3E;KACF;IACF;GACF,CAAC;GACD,YAAY,QAAQ;GACpB,aAAa,KAAK,GAAG,QAAQ,KAAK;EACpC,QAAQ;GACN,UAAU;GACV,aAAa,KAAK,iFAAiF;EACrG,UAAU;GACR,IAAI,SACF,IAAI;IACF,MAAM,QAAQ,MAAM,OAAO,OACzB,QAAQ,IACR,WAAW,WAAW,OAAO,SAC7B,CAAC,GAAG,IAAI,IAAI,YAAY,CAAC,CAAC,CAAC,MAAM,GAAG,EAAE,CACxC;IACA,IAAI,MAAM,SAAS;KACjB,aAAa,MAAM,IAAI,KAAK;KAC5B,aAAa,UAAU,CAAC,OAAO,GAAG,MAAM,QAAQ,SAAS,KAAK,OAAO,MAAM,EAAE,CAAC,CAAC;KAC/E,OAAO,UAAU;KACjB,OAAO,SAAS,EAAE,CAAC,EAAE;KACrB,YAAiB,UAAU,OAAO,IAAI;IACxC;GACF,QAAQ;IACN,IAAI,MAAM,SAAS,SAAS,8CAA8C;GAC5E;QACK,IAAI,MAAM,SACf,SAAS,8EAA8E;GACzF,IAAI,MAAM,SAAS;IACjB,aAAa,KAAA,CAAS;IACtB,kBAAkB,KAAK;IACvB,gBAAqB;GACvB;GACA,kBAAkB,UAAU,KAAA;EAC9B;CACF;CACA,MAAM,WAAW,OAAO,iBAA8B,QAAQ,QAAQ;EACpE,IAAI,SAAS,WAAY,CAAC,mBAAmB,kBAAkB,SAAU;EACzE,MAAM,WAAW,mBAAmB,SAAS,MAAM,SAAS,KAAK,OAAO,SAAS;EACjF,IAAI,CAAC,YAAY,SAAS,UAAU,gBAAgB,SAAS,QAAQ,IAAI,SAAS,EAAE,GAAG;EACvF,MAAM,MAAA,GAAA,YAAA,WAAA,CAAgB;EACtB,SAAS,UAAU;EACnB,WAAW,EAAE;EACb,SAAS,EAAE;EACX,UAAU,KAAA,CAAS;EACnB,kBAAkB,KAAA,CAAS;EAC3B,YAAY,EAAE;EACd,kBAAkB;GAAE,SAAS;GAAU,KAAK;EAAM,CAAC;EACnD,cAAc,CAAC;EACf,IAAI;GACF,MAAM,QAAQ,MAAM,OAAO,MAAM,SAAS,IAAI,IAAI,KAAK;GACvD,IAAI,MAAM,WAAW,SAAS,YAAY,IACxC,IAAI,MAAM,OAAO;IACf,YAAY,MAAM,KAAK;IACvB,kBAAkB;KAAE,SAAS;KAAU,KAAK;KAAO,OAAO,MAAM;IAAM,CAAC;GACzE,OAAO,UAAU,KAAK;EAE1B,QAAQ;GACN,IAAI,MAAM,WAAW,SAAS,YAAY,IAAI;IAC5C,MAAM,UACJ;IACF,YAAY,OAAO;IACnB,kBAAkB;KAAE,SAAS;KAAU,KAAK;KAAO,OAAO;IAAQ,CAAC;GACrE;EACF,UAAU;GACR,IAAI,SAAS,YAAY,IAAI;IAC3B,IAAI,MAAM,SAAS,WAAW,EAAE;IAChC,SAAS,UAAU;GACrB;EACF;CACF;CACA,MAAM,cAAc,OAAO,OAA0B,iBAA8B,UAAU,UAAU;EACrG,MAAM,WAAW,mBAAmB,SAAS,MAAM,SAAS,KAAK,OAAO,SAAS;EACjF,IAAI,SAAS,WAAY,CAAC,mBAAmB,kBAAkB,SAAU;EACzE,IAAI,UAAU,UAAU;GACtB,MAAM,QAAQ,SAAS,EAAE,CAAC;GAC1B,OAAO,KAAK;GACZ,kBAAkB,KAAA,CAAS;GAC3B,IAAI,WAAW,UAAU,SAAc,UAAU,KAAK;GACtD;EACF;EACA,IACE,SAAS,WACR,CAAC,mBAAmB,kBAAkB,WACvC,CAAC,YACD,SAAS,UAAU,gBACnB,SAAS,QAAQ,IAAI,SAAS,EAAE,GAEhC;EACF,MAAM,QAAQ,UAAU,SAAS,EAAE,CAAC,KAAK,SAAS;EAClD,MAAM,MAAA,GAAA,YAAA,WAAA,CAAgB;EACtB,SAAS,UAAU;EACnB,WAAW,EAAE;EACb,YAAY,EAAE;EACd,IAAI;EACJ,IAAI;GACF,IAAI,OAAO,YAAY,QAAQ,IAAI,SAAS,EAAE;GAC9C,IAAI,CAAC,MAAM;IACT,MAAM,SAAS,MAAM,OAAO,MAAM,SAAS,IAAI,IAAI,8BAAA,sBAAsB;IACzE,IAAI,OAAO,OAAO,MAAM,IAAI,MAAM,OAAO,KAAK;IAC9C,MAAM,YAAY,OAAO,QAAQ,QAAQ,KAAK;IAC9C,OAAO,OAAO,YACV,CAAC,IAAI,IACL,YAAY,IACV,CAAC,IACD,OAAO,KAAK,KAAK,QAAQ,IAAI,UAAU,CAAC,CAAC,QAAQ,QAAuB,OAAO,QAAQ,QAAQ;IACrG,YAAY,QAAQ,IAAI,SAAS,IAAI,IAAI;IACzC,IAAI,YAAY,QAAQ,OAAO,IAAI,YAAY,QAAQ,OAAO,YAAY,QAAQ,KAAK,CAAC,CAAC,KAAK,CAAC,CAAC,KAAM;GACxG;GACA,IAAI,CAAC,MAAM,WAAW,SAAS,YAAY,MAAM,iBAAiB,YAAY,SAAS,IAAI;GAC3F,IAAI,SAAS,YAAY,OAAO;IAC9B,YAAY,uFAAuF;IACnG;GACF;GACA,WAAW,8BAAA,uBAAuB,IAAI;GACtC,OAAO,QAAQ;GACf,kBAAkB,KAAA,CAAS;EAC7B,QAAQ;GACN,IAAI,MAAM,SAAS,YAAY,uEAAuE;EACxG,UAAU;GACR,IAAI,SAAS,YAAY,IAAI;IAC3B,SAAS,UAAU;IACnB,IAAI,MAAM,SAAS,WAAW,EAAE;GAClC;EACF;EACA,IAAI,YAAY,WAAW,MAAM,SAAS,SAAc,UAAU,QAAQ;CAC5E;CACA,MAAM,iBAAiB,WAA4B;EACjD,IAAI,CAAC,gCAAA,gBAAgB,OAAO,OAAO,OAAO,KAAK,GAAG;GAChD,SAAS,2DAA2D;GACpE;EACF;EACA,IAAI,aAAa,MAAM,YAAY,gBAAgB,SAAS,MAAM,CAAC,GAAG;EACtE,IAAI,aAAa,UAAU,IAAI;GAC7B,SAAS,uCAAuC;GAChD;EACF;EACA,gBAAgB,CAAC,GAAG,cAAc,MAAM,CAAC;CAC3C;CACA,MAAM,mBACJ,iBAAiB,aAAa,OAAO,gBAAgB,cAAc,YAAY,kBAAkB,KAAA;CACnG,MAAM,uBAAuB,QAC3B,WACE,kBACA,SAAS,QAAQ,IAAI,SAAS,KAC9B,CAAC,SAAS,MAAM,YAAY,QAAQ,OAAO,aAAa,QAAQ,UAAU,YAAY,CAC1F;CACA,MAAM,mBAAmB,YAAkC;EACzD,IAAI,SAAS,WAAW,kBAAkB,WAAW,sBAAsB;EAC3E,IAAI,CAAC,kBAAkB,eAAe,QAAQ,KAAK;GACjD,YAAY,uDAAuD;GACnE;EACF;EACA,IAAI;GACF,MAAM,OAAO,kBAAkB,QAAQ;GACvC,MAAM,QAAQ,kCAAA,mBAAmB,MAAM,OAAO;GAC9C,mBAAmB;IAAE;IAAM,UAAU;IAAO;IAAW;GAAQ,CAAC;GAChE,OAAO,KAAK;GACZ,SAAc,KAAA,GAAW,KAAK;EAChC,QAAQ;GACN,YAAY,qFAAqF;EACnG;CACF;CACA,MAAM,gBAAgB,QAAgB,WAA4B;EAChE,MAAM,cAAc,QAAQ,QAAQ,KAAK,SAAS,KAAK,QAAQ,WAAW,WAAW,OAAO,YAAY,CAAC,CAAC,KAAK,CAAC;EAChH,IAAI,CAAC,QAAQ,QAAQ,SAAS,MAAM,KAAK,IAAI,IAAI,WAAW,CAAC,CAAC,SAAS,YAAY,QAAQ;GACzF,YAAY,gEAAgE;GAC5E;EACF;EACA,MAAM,UAAU,kBAAkB,WAAW,CAAC;EAC9C,IAAI,QAAQ,MAAM,YAAY,QAAQ,WAAW,UAAU,gBAAgB,SAAS,MAAM,CAAC,GAAG;EAC9F,IAAI,QAAQ,UAAU,IAAI;GACxB,YAAY,uCAAuC;GACnD;EACF;EACA,gBAAgB,CAAC,GAAG,SAAS;GAAE,GAAG;GAAQ;EAAO,CAAC,CAAC;CACrD;CACA,MAAM,uBAAuB,WAAsB;EACjD,IAAI,CAAC,aAAa,QAAQ,OAAO;EACjC,IAAI,CAAC,aAAa,QAAQ,IAAI,MAAM,GAAG;GACrC,IAAI;GACJ,IAAI;IACF,SAAS,KAAK,MAAM,OAAO,cAAc,MAAM;GACjD,QAAQ;IACN,SAAS,KAAA;GACX;GACA,aAAa,QAAQ,IAAI,QAAQ,MAAM;EACzC;EACA,OAAO,YAAY,aAAa,QAAQ,IAAI,MAAM,CAAC;CACrD;CACA,MAAM,WAAW,+BAAA,cAEb,QAAQ,QACL,YACE,CAAC,QAAQ,OAAO,QAAQ,kBAAkB,CAAC,CAAC,SAAS,KAAK,kBAAkB,CAAC,OAC7E,CAAC,SAAS,OAAO,UAAU,WAC3B,CAAC,WACC,OAAO,WAAW,YAAY,IAAI,OAAO,cAAc,OAAO,MAAM,EAAE,IAAI,UAAU,MAAM,MAAM,YACnG,oBAAoB,MAAM,CAC9B,GACF;EAAC;EAAS;EAAM;EAAO;EAAQ;EAAc;CAAW,CAC1D;CACA,MAAM,gBAAgB,SAAS,MAAM,SAAS,KAAK,OAAO,SAAS;CACnE,MAAM,kBAAkB,QAAQ,SAAS,CAAC,mBAAG,IAAI,IAAI,CAAC,GAAG,OAAO,GAAI,OAAQ,cAAc,SAAS,CAAC,IAAK,CAAC,CAAE,CAAC,CAAC,IAAI,CAAC;CACnH,+BAAA,gBAAgB;EACd,OAAO,cAAc,IAAI,YAAY,+BAA+B,EAAE,QAAQ,EAAE,QAAQ,KAAK,EAAE,CAAC,CAAC;EACjG,aAAa;GACX,OAAO,cAAc,IAAI,YAAY,+BAA+B,EAAE,QAAQ,EAAE,QAAQ,MAAM,EAAE,CAAC,CAAC;EACpG;CACF,GAAG,CAAC,CAAC;CACL,+BAAA,gBAAgB;EACd,MAAM,UAAU,UAAiB;GAC/B,MAAM,MAAO,MAAyC,QAAQ;GAC9D,IAAI,OAAO,QAAQ,YAAY,CAAC,IAAI,KAAK,KAAK,IAAI,SAAS,OAAO;GAClE,OAAO,UAAU;GACjB,kBAAkB,KAAA,CAAS;GAC3B,IAAI,CAAC,WAAW;IACd,MAAM,SAAS,SAAS,MAAM,SAAS,KAAK,UAAU,gBAAgB,KAAK,OAAO,QAAQ,QAAQ,GAAG;IACrG,IAAI,QAAQ,aAAa,OAAO,EAAE;GACpC;GACA,OAAO,GAAG;GACV,4BAA4B,SAAS,eAAe,gBAAgB,CAAC,EAAE,MAAM,CAAC;EAChF;EACA,OAAO,iBAAiB,wBAAwB,MAAM;EACtD,aAAa,OAAO,oBAAoB,wBAAwB,MAAM;CACxE,GAAG;EAAC;EAAW;EAAU,QAAQ;CAAG,CAAC;CACrC,MAAM,iBAAiB;EACrB,MAAM,gBACJ,WACC,gBAAgB,QACb;GACE,SAAS,CAAC;GACV,MAAM,CAAC;GACP,WAAW;GACX,WAAW;GACX,OAAO,eAAe;EACxB,IACA,KAAA;EACN,MAAM,WACJ,QAAQ,aACJ,iBAAiB,iBACf,eAAe,QAAQ,SACtB,eAAe,UAAU,SAC5B;EACN,MAAM,UACJ,QAAQ,cAAc,iBAAiB,iBACnC,sBAAA,sBACE,eAAe,SACf,eAAe,KACf,iBAAiB;GAAE,GAAG;GAAe,MAAM,CAAC,eAAe,GAAG;GAAG,WAAW;EAAM,IAAI,aACxF,IACA,QAAQ,UAAU,WAChB,sBAAA,qBAAqB,UAAU,QAAQ,IACvC,KAAK,UAAU;GACb,QAAQ;GACR,GAAI,QAAQ,aACR;IAAE;IAAK,MAAM,CAAC;IAAG,OAAO;GAA4B,IACpD;IAAE;IAAQ,SAAS,QAAQ;GAAO;EACxC,CAAC;EACT,IACE,CAAC,8BAAA,yBAAyB;GACxB;GACA,QAAQ;GACR,OAAO,QAAQ,aAAc,iBAAiB,YAAY,cAAe,WAAW,aAAa;GACjG,SAAS,QAAQ,MAAM,GAAG,GAAI;GAC9B,GAAI,WAAW,EAAE,UAAU;IAAE,MAAM,SAAS;IAAM,MAAM,SAAS;IAAM,WAAW,SAAS;GAAU,EAAE,IAAI,CAAC;EAC9G,CAAC,GAED,OAAO,cAAc,IAAI,MAAM,oBAAoB,CAAC;CACxD;CACA,MAAM,gBAAgB,OAAO,OAAe;EAC1C,IAAI,SAAS,QAAQ,IAAI,EAAE,KAAK,SAAS,WAAW,kBAAkB,SAAS;EAC/E,SAAS,QAAQ,IAAI,EAAE;EACvB,iBAAiB,SAAS,QAAQ,IAAI;EACtC,IAAI;GACF,MAAM,OAAO,MAAM;GACnB,MAAM,OAAO,OAAO,EAAE;GACtB,OAAO,OAAO,EAAE;GAChB,IAAI,OAAO,iBAAiB,SAAS;IACnC,aAAa,EAAE;IACf,UAAU,KAAA,CAAS;IACnB,kBAAkB,KAAA,CAAS;IAC3B,kBAAkB,KAAA,CAAS;GAC7B;GACA,MAAM,gBAAgB;EACxB,QAAQ;GACN,SAAS,0BAA0B;EACrC,UAAU;GACR,SAAS,QAAQ,OAAO,EAAE;GAC1B,IAAI,MAAM,SAAS,iBAAiB,SAAS,QAAQ,IAAI;EAC3D;CACF;CACA,MAAM,eAAe;EACnB,MAAM,QAAQ,QAAQ;EACtB,MAAM,MAAM,mBAAA,SAAS,OAAO,UACzB,SAAS,CAAC,CACV,MAAM,SACL,QAAQ,SAAS,QAAQ,KAAK,SAAS,QAAQ,OAAO,MAAM,KAAK,SAAS,QAAQ,OAAO,MAC3F;EACF,MAAM,YAAY,OAAO,WAAW,YAAY,IAC5C,OAAO,MAAM,EAAE,IACf,QAAQ,MAAM,SAAS,UAAU,IAAI,MAAM,MAAM,CAAC,EAAE;EACxD,MAAM,mBAAmB,KAAK,SAAS,cAAc;EACrD,MAAM,YACJ,KAAK,iBAAiB,CAAC,CAAC,MAAM,SAAS,KAAK,UAAU,aAAa,iBAAiB,KACpF,KAAK,iBAAiB,CAAC,CAAC;EAC1B,IAAI,OAAO,WACT,mBAAA,SAAS,UAAU,YAAY,aAAa;GAAE,aAAa;GAAK,mBAAmB;EAAU,CAAC;OAC3F,SAAS,iEAAiE;CACjF;CACA,OACE,oCAAA,KAAC,OAAD;EACE,WAAU;EACV,eAAY;EACZ,gBAAc,WAAW,KAAA;EACzB,2BAAyB,oBAAoB,KAAA;YAJ/C;GAME,oCAAA,IAAC,SAAD,EAAA,UAAQ,uBAAA,gBAAuB,CAAA;GAC/B,oCAAA,KAAC,UAAD,EAAA,UAAA;IACE,oCAAA,IAAC,MAAD;KAAI,WAAU;eAAwB;IAAc,CAAA;IACpD,oCAAA,KAAC,OAAD;KACE,WAAU;KACV,MAAK;KACL,cAAW;KACX,YAAY,UAAU;MACpB,IAAI,CAAC;OAAC;OAAa;OAAc;OAAQ;MAAK,CAAC,CAAC,SAAS,MAAM,GAAG,GAAG;MACrE,MAAM,OAAO,CAAC,GAAG,MAAM,cAAc,iBAAoC,YAAY,CAAC;MACtF,MAAM,QAAQ,KAAK,QAAQ,SAAS,aAAkC;MACtE,IAAI,QAAQ,GAAG;MACf,MAAM,eAAe;MACrB,MAAM,OACJ,MAAM,QAAQ,SACV,IACA,MAAM,QAAQ,QACZ,KAAK,SAAS,KACb,SAAS,MAAM,QAAQ,eAAe,IAAI,MAAM,KAAK,UAAU,KAAK;MAC7E,KAAK,KAAK,EAAE,MAAM;MAClB,KAAK,KAAK,EAAE,MAAM;KACpB;eAlBF,CAoBE,oCAAA,KAAC,UAAD;MAAQ,MAAK;MAAM,iBAAe,QAAQ;MAAQ,eAAe,OAAO,MAAM;gBAA9E,CACE,oCAAA,IAAC,MAAD;OAAM,UAAS;OAAU,MAAM;MAAK,CAAA,GAAC,YAC/B;SACR,oCAAA,KAAC,UAAD;MACE,MAAK;MACL,iBAAe,QAAQ;MACvB,eAAe;OACb,OAAO,UAAU;OACjB,MAAM,SAAS,SAAS,MACrB,SAAS,KAAK,UAAU,iBAAiB,CAAC,UAAU,KAAK,OAAO,QAAQ,OAAO,IAClF;OACA,IAAI,CAAC,aAAa,UAAU,CAAC,gBAC3B,aAAa,OAAO,EAAE;OAExB,gBAAqB;MACvB;gBAZF,CAcE,oCAAA,IAAC,MAAD;OAAM,UAAS;OAAO,MAAM;MAAK,CAAA,GAAC,MAC5B;OACL;;IAEL,oCAAA,KAAC,OAAD;KAAK,WAAU;eAAf;MACE,oCAAA,KAAC,OAAD;OAAK,WAAU;iBAAf;QACE,oCAAA,KAAC,WAAD;SAAS,KAAK;SAAgB,WAAU;mBAAxC,CACE,oCAAA,KAAC,WAAD;UAAS,OAAO,mBAAmB,eAAe;oBAAlD,CACE,oCAAA,IAAC,MAAD;WAAM,UAAS;WAAO,MAAM;UAAK,CAAA,GAAC,UAC3B;aACT,oCAAA,KAAC,OAAD,EAAA,UAAA;UACG;UACD,oCAAA,KAAC,SAAD,EAAA,UAAA,CAAO,kBAEL,oCAAA,IAAC,WAAD;WACE,OAAM;WACN,OAAO,OAAO,cAAc;WAC5B,WAAW,UAAU,kBAAkB,OAAO,KAAK,CAAC;WACpD,SAAS;YACP;aAAE,OAAO;aAAK,OAAO;YAAY;YACjC;aAAE,OAAO;aAAM,OAAO;YAAa;YACnC;aAAE,OAAO;aAAM,OAAO;YAAS;WACjC;UACD,CAAA,CACI,EAAA,CAAA;UACP,oCAAA,IAAC,mBAAA,SAAS,UAAU,QAApB;WAA2B,SAAS;WAAU,UAAU;qBAAa;UAE1C,CAAA;UAC3B,oCAAA,IAAC,mBAAA,SAAS,UAAU,QAApB;WACE,SAAS;WACT,WAAW,UAAU;YACnB,WAAW,KAAK;YAChB,YAAY,cAAc;WAC5B;qBACD;UAE0B,CAAA;UAC3B,oCAAA,IAAC,mBAAA,SAAS,UAAU,QAApB;WACE,SAAS;WACT,WAAW,UAAU;YACnB,oBAAoB,KAAK;YACzB,YAAY,yBAAyB;WACvC;qBACD;UAE0B,CAAA;SACxB,EAAA,CAAA,CACE;;QACR,QAAQ,cACP,oCAAA,KAAC,UAAD;SACE,MAAK;SACL,UAAU,CAAC,UAAU,kBAAkB,QAAQ,CAAC,CAAC,WAAW,gBAAgB;SAC5E,eAAe,KAAK,QAAQ;mBAH9B,CAKE,oCAAA,IAAC,MAAD;UAAM,UAAS;UAAW,MAAM;SAAK,CAAA,GAAC,eAChC;;QAET,kBACC,oCAAA,KAAA,oBAAA,UAAA,EAAA,UAAA,CACE,oCAAA,IAAC,QAAD;SAAM,MAAK;SAAS,WAAU;mBAC3B,YACG,GAAG,UAAU,KAAK,eAAe,EAAE,YAAY,UAAU,QAAQ,QAAA,CAAS,QAAQ,CAAC,EAAE,QACrF;QACA,CAAA,GACN,oCAAA,KAAC,UAAD;SAAQ,MAAK;SAAS,eAAe,kBAAkB,SAAS,MAAM;mBAAtE,CACE,oCAAA,IAAC,MAAD;UAAM,UAAS;UAAO,MAAM;SAAK,CAAA,GAAC,sBAC5B;UACR,EAAA,CAAA;OAED;;MAEL,oCAAA,KAAC,kCAAA,yBAAD;OAAyB,cAAW;OAAoB,OAAM;OAAoB,SAAS;iBAA3F,CACE,oCAAA,IAAC,MAAD;QAAM,UAAS;QAAsB,MAAM;OAAK,CAAA,GAAC,KAC1B;;MACxB,QAAQ,UACP,oCAAA,KAAC,UAAD;OAAQ,MAAK;OAAS,UAAU,CAAC,UAAU;OAAM,eAAe,KAAK,YAAY;iBAAjF,CACE,oCAAA,IAAC,MAAD;QAAM,UAAS;QAAU,MAAM;OAAK,CAAA,GAAC,UAC/B;;MAET,QAAQ,SAAS,SAChB,oCAAA,IAAC,UAAD;OAAQ,MAAK;OAAS,cAAW;OAAc,OAAM;OAAc,SAAS;iBAC1E,oCAAA,IAAC,mBAAA,SAAS,UAAU,MAApB;QAAyB,UAAS;QAAc,MAAM;QAAI,SAAQ;QAAc,yBAAA;OAAyB,CAAA;MACnG,CAAA;KAEP;;GACC,EAAA,CAAA;GACP,SACC,oCAAA,KAAC,OAAD;IACE,WAAU;IACV,OAAO,GAAG,OAAO,KAAK,KAAK,OAAO,KAAK,KAAK,OAAO,UAAU,SAAS,OAAO;cAF/E;KAIE,oCAAA,KAAC,UAAD,EAAA,UAAA;MACG,OAAO;MAAK;MAAI,OAAO;KAClB,EAAA,CAAA;KAAE;KAAI;KACX,OAAO;IACP;QAEL,oCAAA,IAAC,cAAD,CAAe,CAAA;GAEhB,SACC,oCAAA,IAAC,OAAD;IAAK,MAAK;IAAQ,WAAU;cACzB;GACE,CAAA;GAEN,QAAQ,SACP,oCAAA,KAAA,oBAAA,UAAA,EAAA,UAAA;IACE,oCAAA,KAAC,OAAD;KAAK,WAAU;eAAf;MACE,oCAAA,IAAC,SAAD;OACE,cAAW;OACX,aAAY;OACZ,OAAO;OACP,WAAW;OACX,WAAW,UAAU,QAAQ,MAAM,OAAO,KAAK;MAChD,CAAA;MACD,oCAAA,IAAC,WAAD;OACE,OAAM;OACN,OAAO;OACP,UAAU;OACV,SAAS,CACP;QAAE,OAAO;QAAI,OAAO;OAAa,GACjC,GAAG,OAAO,KAAK,WAAW;QAAE;QAAO,OAAO,MAAM,YAAY;OAAE,EAAE,CAClE;MACD,CAAA;MACD,oCAAA,IAAC,WAAD;OACE,OAAM;OACN,eAAe,QAAQ,YAAY;QACjC,IAAI,YAAY,QAAQ,OAAO,oCAAA,IAAC,QAAD;SAAM,OAAO,OAAO;mBAAQ,OAAO;QAAY,CAAA;QAC9E,MAAM,OAAO,QAAQ,MAAM,SAAS,UAAU,IAAI,MAAM,OAAO,KAAK;QACpE,OACE,oCAAA,KAAC,QAAD;SAAM,WAAU;SAA2B,OAAO,OAAO;mBAAzD;UACE,oCAAA,IAAC,MAAD;WAAM,UAAU,OAAO,eAAe;WAAU,MAAM;UAAK,CAAA;UAC3D,oCAAA,KAAC,QAAD;WAAM,WAAU;qBAAhB,CACE,oCAAA,IAAC,UAAD,EAAA,UAAS,OAAO,KAAK,MAAM,OAAO,QAAQ,aAAa,OAAO,MAAc,CAAA,GAC5E,oCAAA,KAAC,SAAD,EAAA,UAAA,CACG,OAAO,QACJ,eAAe,MAAM,aAAa,OAAO,MAAM,MAAM,EAAE,MACvD,2BACH,MAAM,WAAW,gBAAgB,EAC7B,EAAA,CAAA,CACH;;UACN,oCAAA,IAAC,QAAD;WAAM,WAAU;WAA0B,eAAY;qBACnD,WAAW,OAAO,SAAS,oCAAA,IAAC,MAAD;YAAM,UAAS;YAAQ,MAAM;WAAK,CAAA;UAC1D,CAAA;SACF;;OAEV;OACA,OAAO;OACP,UAAU;OACV,SAAS;QACP;SAAE,OAAO;SAAI,OAAO,gBAAgB,QAAQ,OAAO;QAAG;QACtD,GAAG,CAAC,GAAG,IAAI,IAAI,QAAQ,KAAK,SAAS,KAAK,SAAS,CAAC,CAAC,CAAC,CAAC,KAAK,eAAe;SACzE,OAAO,aAAa;SACpB,OAAO,cAAc;QACvB,EAAE;QACF,GAAG,CAAC,GAAG,IAAI,IAAI,QAAQ,IAAI,SAAS,CAAC,CAAC,CAAC,CAAC,KAAK,WAAW;SAAE;SAAO,OAAO;QAAM,EAAE;OAClF;MACD,CAAA;MACD,oCAAA,KAAC,UAAD;OACE,MAAK;OACL,UAAU,CAAC,QAAQ,UAAU,QAAQ;OACrC,gBAAc;OACd,SAAS;iBAJX;QAME,oCAAA,IAAC,MAAD;SAAM,UAAU,OAAO,UAAU;SAAc,MAAM;QAAK,CAAA;QAAC;QAAE,OAAO,UAAU;OACxE;;MACR,oCAAA,KAAC,UAAD;OAAQ,MAAK;OAAS,gBAAc;OAAQ,eAAe,UAAU,CAAC,MAAM;iBAA5E,CACE,oCAAA,IAAC,MAAD;QAAM,UAAS;QAAwB,MAAM;OAAK,CAAA,GAAC,cAC7C;;MACP,QACC,oCAAA,KAAC,UAAD;OAAQ,eAAe,kBAAkB,SAAS,MAAM;OAAG,MAAK;iBAAhE,CACE,oCAAA,IAAC,MAAD;QAAM,UAAS;QAAO,MAAM;OAAK,CAAA,GAAC,eAC5B;;KAEP;;IACL,oCAAA,IAAC,cAAD;KACE,SAAS;KACT,WAAW,UAAU,gBAAgB,aAAa,QAAQ,GAAG,SAAS,SAAS,KAAK,CAAC;IACtF,CAAA;IACD,oCAAA,KAAC,OAAD;KACE,WAAU;KACV,MAAK;KACL,OAAO,GAAG,OAAO,0BAA0B,OAAO,SAAS,eAAe,EAAE,WAAW,OAAO,YAAY,QAAQ;eAHpH;MAKE,oCAAA,KAAC,QAAD,EAAA,UAAA,CAAO,SAAS,OAAO,eAAe,GAAE,iBAAqB,EAAA,CAAA;MAAC;MAAI;MACjE,gBAAgB,OAAO,MAAM,aAAa,OAAO,GAAG,aAAa,MAAM,mBAAmB;MAAG;MAC/E,OAAO,SAAS,eAAe;MAAE;MAAU,OAAO,YAAY;MAAQ;KAClF;;IACL,oCAAA,KAAC,OAAD;KAAK,WAAU;eAAf,CACE,oCAAA,IAAC,SAAD;MACE,SAAS;MACT,SAAS;MACT,UAAU,UAAU;MACpB,UAAU;MACF;MACG;MACF;KACV,CAAA,GACA,YACC,oCAAA,IAAC,YAAD;MAAY,QAAQ;MAAU,eAAe,YAAY,KAAA,CAAS;MAAG,UAAU;KAAgB,CAAA,CAE9F;;GACL,EAAA,CAAA,IAEF,oCAAA,KAAA,oBAAA,UAAA,EAAA,UAAA;IACE,oCAAA,KAAC,OAAD;KAAK,WAAU;eAAf;MACE,oCAAA,IAAC,QAAD;OAAM,WAAU;iBAA2B;MAAc,CAAA;MACzD,oCAAA,IAAC,WAAD;OACE,OAAM;OACN,YAAY,UAAU;QACpB,IACE,MAAM,QAAQ,YACd,CAAC,MAAM,WACL,MAAM,OAA4B,SAAS,GAAA,CAAI,SAAS,GAE1D;QACF,MAAM,SAAS,SAAS,cACtB,iEACF;QACA,IAAI,UAAU,CAAC,OAAO,UAAU;SAC9B,MAAM,eAAe;SACrB,MAAM,gBAAgB;SACtB,cAAmB,OAAO,QAAQ,aAAc;QAClD;OACF;OACA,eAAe,QAAQ,YAAY;QACjC,MAAM,OAAO,SAAS,MAAM,SAAS,KAAK,OAAO,OAAO,KAAK;QAC7D,IAAI,YAAY,UAAU,CAAC,MAAM,OAAO,OAAO;QAC/C,OACE,oCAAA,KAAC,QAAD;SAAM,WAAU;SAA6B,OAAO,OAAO;mBAA3D,CACE,oCAAA,KAAC,QAAD;UAAM,WAAU;oBAAhB,CACE,oCAAA,IAAC,UAAD,EAAA,UAAS,KAAK,OAAO,KAAa,CAAA,GAClC,oCAAA,KAAC,SAAD,EAAA,UAAA;WACG,kBAAA,eAAe,KAAK,SAAS;WAAE;WAAI,KAAK,KAAK,eAAe;WAAE;WAAS;WACvE,KAAK,MAAM,EAAE,CAAC,YAAY;WAC1B,KAAK,MAAM,MAAM,CAAC;UACd,EAAA,CAAA,CACH;aACN,oCAAA,IAAC,UAAD;UACE,MAAK;UACL,cAAY,mBAAmB,KAAK,OAAO;UAC3C,OAAM;UACN,uBAAqB,KAAK;UAC1B,YAAY,UAAU,MAAM,gBAAgB;UAC5C,UAAU,CAAC,CAAC,WAAW,kBAAkB,gBAAgB,KAAK,KAAK,UAAU;UAC7E,cAAc,UAAU;WACtB,MAAM,eAAe;WACrB,MAAM,gBAAgB;UACxB;UACA,UAAU,UAAU;WAClB,MAAM,eAAe;WACrB,MAAM,gBAAgB;WACtB,cAAmB,KAAK,EAAE;UAC5B;oBAEA,oCAAA,IAAC,mBAAA,SAAS,UAAU,MAApB;WACE,UAAS;WACT,MAAM;WACN,SAAQ;WACR,yBAAA;UACD,CAAA;SACK,CAAA,CACJ;;OAEV;OACA,OAAO;OACP,UAAU,CAAC,CAAC,WAAW,kBAAkB,gBAAgB;OACzD,WAAW,UAAU;QACnB,aAAa,KAAK;QAClB,UAAU,KAAA,CAAS;QACnB,kBAAkB,KAAA,CAAS;QAC3B,kBAAkB,KAAA,CAAS;QAC3B,YAAY,EAAE;OAChB;OACA,SAAS,CACP;QAAE,OAAO;QAAI,OAAO;OAAoB,GACxC,GAAG,SAAS,KAAK,UAAU;QACzB,OAAO,KAAK;QACZ,OAAO,GAAG,KAAK,OAAO,KAAK,KAAK,kBAAA,eAAe,KAAK,SAAS,EAAE,KAAK,KAAK,KAAK,eAAe,EAAE,WAAW,KAAK,MAAM,EAAE,CAAC,YAAY,IAAI,KAAK,MAAM,MAAM,CAAC;OAC5J,EAAE,CACJ;MACD,CAAA;MACD,oCAAA,KAAC,UAAD;OACE,MAAK;OACL,UAAU,CAAC,aAAa,CAAC,CAAC,WAAW,SAAS,QAAQ,IAAI,SAAS;OACnE,OAAM;OACN,eAAe;QACb,OAAY,OAAO,SAAS,CAAC,CAAC,YAAY,SAAS,0BAA0B,CAAC;OAChF;iBANF,CAQE,oCAAA,IAAC,MAAD;QAAM,UAAS;QAAW,MAAM;OAAK,CAAA,GAAC,cAChC;;KACL;;IACJ,CAAC,CAAC,eAAe,MAAM,UACtB,oCAAA,KAAC,WAAD;KAAS,WAAU;eAAnB,CACE,oCAAA,KAAC,WAAD,EAAA,UAAA;MAAS;MAAiB,cAAc,MAAM;MAAO;KAAU,EAAA,CAAA,GAC9D,cAAc,MAAM,KAAK,SACxB,oCAAA,IAAC,OAAD,EAAA,UAAiB,KAAU,GAAjB,IAAiB,CAC5B,CACM;;IAEX,oCAAA,KAAC,OAAD;KAAK,WAAU;eAAf;MACE,oCAAA,IAAC,SAAD;OACE,SAAQ;OACR,WAAU;OACV,OAAO,sBAAsB,OAAO,UAAU,IAAK,OAAO,OAAO,WAAW,eAAe,EAAE;iBAC9F;MAEM,CAAA;MACP,oCAAA,KAAC,UAAD;OACE,MAAK;OACL,UACE,CAAC,iBACD,CAAC,CAAC,WACF,kBACA,SAAS,QAAQ,IAAI,SAAS,KAC9B,cAAc,UAAU;OAE1B,eAAe,KAAK,SAAS;iBAT/B,CAWE,oCAAA,IAAC,MAAD;QAAM,UAAS;QAAa,MAAM;OAAK,CAAA,GAAC,YAClC;;MACP,WACC,oCAAA,KAAC,UAAD;OACE,MAAK;OACL,eAAe;QACb,OAAY,OAAO,OAAO,CAAC,CAAC,YAAY,SAAS,wBAAwB,CAAC;OAC5E;iBAJF,CAME,oCAAA,IAAC,MAAD;QAAM,UAAS;QAAO,MAAM;OAAK,CAAA,GAAC,SAC5B;;MAET,SAAS,KAAK,CAAC,OAAO,WACrB,oCAAA,KAAC,UAAD;OACE,MAAK;OAEL,UAAU,CAAC,CAAC,WAAW;OACvB,eAAgB,UAAU,UAAU,UAAU,WAAW,KAAK,YAAY,KAAK,IAAI,OAAO,KAAK;iBAJjG;QAME,oCAAA,IAAC,MAAD;SACE,UACE,UAAU,WACN,YACA,UAAU,WACR,kBACA,UAAU,aACR,aACA;SAEV,MAAM;QACP,CAAA;QAAE;QAAI;QACA;OACD;SAjBD,KAiBC,CACT;KACE;;IACL,oCAAA,IAAC,cAAD;KACE,KAAA;KACA,SAAS,kBAAkB,WAAW,CAAC;KACvC,UAAU;KACV,WAAW,UAAU,iBAAiB,kBAAkB,WAAW,CAAC,EAAA,CAAG,QAAQ,GAAG,SAAS,SAAS,KAAK,CAAC;IAC3G,CAAA;IACD,oCAAA,IAAC,6BAAA,WAAD;KAAW,IAAG;KAAiB,OAAO;KAAK,UAAU;IAAS,CAAA;IAC7D,YACC,oCAAA,IAAC,OAAD;KAAK,MAAK;KAAQ,WAAU;eACzB;IACE,CAAA;IAEN,SACC,oCAAA,KAAA,oBAAA,UAAA,EAAA,UAAA;KACE,oCAAA,IAAC,OAAD;MAAK,WAAU;gBACb,oCAAA,KAAC,QAAD;OAAM,MAAK;OAAS,WAAU;iBAA9B;QACG,OAAO,KAAK;QAAO;QAAS,OAAO;QAAU;QAAI,OAAO,YAAY,wBAAwB;OACzF;;KACH,CAAA;KACL,oCAAA,KAAC,OAAD;MAAK,WAAU;gBAAf,CACE,oCAAA,KAAC,OAAD;OAAK,WAAU;iBAAf,CACE,oCAAA,KAAC,SAAD;QACE,OAAO,EACL,UACE,OAAO,QAAQ,SAAS,IACpB,OAAO,QAAQ,QAAQ,OAAO,WAAW,QAAQ,eAAe,MAAM,GAAG,CAAC,IAC1E,KAAA,EACR;kBANF;SAQE,oCAAA,IAAC,YAAD,EAAA,UACG,OAAO,QAAQ,KAAK,QAAQ,MAC3B,oCAAA,IAAC,OAAD,EAEE,OAAO,EACL,OAAO,OAAO,QAAQ,SAAS,IAAI,eAAe,MAAM,IAAI,KAAA,EAC9D,EACD,GAJM,CAIN,CACF,EACO,CAAA;SACV,oCAAA,IAAC,SAAD,EAAA,UACE,oCAAA,IAAC,MAAD,EAAA,UACG,OAAO,QAAQ,KAAK,QAAQ,MAC3B,oCAAA,IAAC,MAAD;UAAY,eAAa;oBACtB;SACC,GAFK,CAEL,CACL,EACC,CAAA,EACC,CAAA;SACP,oCAAA,IAAC,SAAD,EAAA,UACG,OAAO,KAAK,MAAM,aAAa,KAAK,aAAa,KAAK,EAAE,CAAC,CAAC,KAAK,KAAK,MACnE,oCAAA,IAAC,MAAD;UAEE,UAAU;UACV,cAAY,gBAAgB,aAAa,KAAK,IAAI;UAClD,eAAe,kBAAkB;WAAE,GAAG,2BAAA,cAAc,OAAO,SAAS,GAAG;WAAG;UAAI,CAAC;UAC/E,YAAY,UAAU;WACpB,IAAI,MAAM,QAAQ,WAAW,MAAM,QAAQ,KAAK;YAC9C,MAAM,eAAe;YACrB,kBAAkB;aAAE,GAAG,2BAAA,cAAc,OAAO,SAAS,GAAG;aAAG;YAAI,CAAC;WAClE;UACF;oBAEC,IAAI,KAAK,MAAM,MACd,oCAAA,IAAC,MAAD;WAEE,eAAa,OAAO,QAAQ;WAC5B,cAAY,4BAAA,aAAa,OAAO,QAAQ,IAAI,IAAI;qBAEhD,oCAAA,IAAC,4BAAA,aAAD;YACE,OAAO,SAAS,OAAO,OAAO,OAAO,IAAI;YACzC,QAAQ,OAAO,QAAQ;YACvB,UAAU;YACJ;YACN,UACE,uBAAuB,KAAA,KAAa,WAAW,aAAa,OAAO,QAAQ,IAAI,MAAM;WAExF,CAAA;UACC,GAbG,CAaH,CACL;SACC,GA5BG,CA4BH,CACL,EACI,CAAA;QACF;WACN,OAAO,KAAK,WAAW,KACtB,oCAAA,IAAC,OAAD;QAAK,WAAU;kBACZ,eAAe,SAAS,IACrB,sEACA;OACD,CAAA,CAEJ;UACJ,kBACC,oCAAA,IAAC,YAAD;OACE,QAAQ,eAAe;OACvB,YAAY,eAAe;OAC3B,UACE,CAAC,wBAAwB,eAAe,cACnC,WAAW,aAAa,eAAe,YAAa,MAAM,IAC3D,KAAA;OAEN,eAAe,kBAAkB,KAAA,CAAS;MAC3C,CAAA,CAEA;;KACJ,OAAO,KAAK,SAAS,MACpB,oCAAA,KAAC,OAAD;MAAK,WAAU;MAA2C,cAAW;gBAArE;OACE,oCAAA,IAAC,UAAD;QACE,MAAK;QACL,cAAW;QACX,OAAM;QACN,UAAU,eAAe;QACzB,eAAe;SACb,cAAc,aAAa,CAAC;SAC5B,kBAAkB,KAAA,CAAS;QAC7B;kBAEA,oCAAA,IAAC,MAAD;SAAM,UAAS;SAAe,MAAM;QAAK,CAAA;OACnC,CAAA;OACR,oCAAA,KAAC,QAAD;QAAM,WAAU;kBAAhB;SAAmC;SAC3B,aAAa;SAAE;SAAI,KAAK,IAAI,GAAG,KAAK,KAAK,OAAO,KAAK,SAAS,EAAE,CAAC;QACnE;;OACN,oCAAA,IAAC,UAAD;QACE,MAAK;QACL,cAAW;QACX,OAAM;QACN,WAAW,aAAa,KAAK,MAAM,OAAO,KAAK;QAC/C,eAAe;SACb,cAAc,aAAa,CAAC;SAC5B,kBAAkB,KAAA,CAAS;QAC7B;kBAEA,oCAAA,IAAC,MAAD;SAAM,UAAS;SAAgB,MAAM;QAAK,CAAA;OACpC,CAAA;MACL;;IAEP,EAAA,CAAA,IAEF,oCAAA,IAAC,OAAD;KAAK,WAAU;eACZ,UACG,mBACA,SAAS,WAAW,IAClB,yDACA;IACH,CAAA;GAEP,EAAA,CAAA;GAEJ,oCAAA,KAAC,OAAD;IAAK,WAAU;cAAf,CACE,oCAAA,KAAC,QAAD;KACE,WAAU;KACV,OAAO,sBAAsB,OAAO,kBAAkB,eAAe,OAAO,iBAAiB,QAAQ,oBAAoB,OAAO,mBAAmB,eAAe,EAAE,WAAW,OAAO,qBAAqB,QAAQ,mBAAmB,OAAO,eAAe,QAAQ,oBAAoB,OAAO,SAAS,0BAA0B,OAAO,QAAQ,IAAM;eAFzV;MAGC;MACsB,OAAO;MAAkB;MAAe,OAAO,iBAAiB;MAAQ;MACjF,OAAO,mBAAmB,eAAe;MAAE;MAAU,OAAO,qBAAqB;MAAQ;MACzF,OAAO,eAAe;MAAQ;MAAoB,OAAO;MAAS;MACzE,OAAO,QAAQ;MAAM;KACtB;QACL,gBAAgB,SAAS,KACxB,oCAAA,KAAC,QAAD;KAAM,MAAK;KAAO,WAAU;KAA+C,OAAO,gBAAgB,KAAK,IAAI;eAA3G,CACE,oCAAA,IAAC,MAAD;MAAM,UAAS;MAAgB,MAAM;KAAK,CAAA,GAC1C,oCAAA,IAAC,QAAD,EAAA,UAAO,gBAAgB,KAAK,KAAK,EAAQ,CAAA,CACrC;MAEL;;EACF;;AAET;AAEA,IAAM,oBAAoB,oCAAA,SAAS,SAAS;AAE5C,IAAa,gBAAgB,oCAAA,eAAe;CAC1C,MAAM,UAAU,+BAAA,qBAAqB,oBAA0C,CAAC,CAAC;CACjF,MAAM,YAAY,mBAAA,SAAS,QAAQ,cAAc,IAAI,CAAC,EAAE,SAAS;CACjE,IAAI,CAAC,WAAW,CAAC,WACf,OACE,oCAAA,KAAC,OAAD;EAAK,WAAU;YAAf;GACE,oCAAA,IAAC,SAAD,EAAA,UAAQ,uBAAA,gBAAuB,CAAA;GAC/B,oCAAA,IAAC,MAAD,EAAA,UAAI,aAAc,CAAA;GAClB,oCAAA,IAAC,KAAD,EAAA,UAAG,uEAAuE,CAAA;EACvE;;CAET,MAAM,YAAY,+BAAA,gBAAgB;CAClC,OAAO,oCAAA,IAAC,mBAAD;EAAgE;EAAsB;CAAY,GAA1E,GAAG,UAAU,GAAG,WAA0D;AAC3G,CAAC"}
|
|
1
|
+
{"version":3,"file":"power-logs.js","names":[],"sources":["../../src/renderer/power-logs.tsx"],"sourcesContent":["import { randomUUID } from \"node:crypto\";\nimport { Renderer } from \"@freelensapp/extensions\";\nimport { clipboard } from \"electron\";\nimport { observer } from \"mobx-react\";\nimport {\n type CSSProperties,\n type KeyboardEvent as ReactKeyboardEvent,\n type ReactNode,\n useEffect,\n useLayoutEffect,\n useMemo,\n useRef,\n useState,\n} from \"react\";\nimport { formatDateTime } from \"../common/date-time\";\nimport { compileJsonFilters, type JsonFieldFilter, jsonValuesEqual } from \"../common/power-log-field-filters\";\nimport { buildJsonFilterSql, type SqlJsonFieldFilter } from \"../common/power-log-json-filter-sql\";\nimport { buildJsonProjectionSql, JSON_KEY_DISCOVERY_SQL } from \"../common/power-log-json-preset\";\nimport { sqlCellLevel } from \"../common/power-log-sql-level\";\nimport {\n POWER_LOGS_LIMITS as L,\n type LogCapture,\n type LogLevel,\n type LogQueryResult,\n type LogRecord,\n type LogSource,\n type LogTarget,\n} from \"../common/power-logs\";\nimport { powerLogLineEvidence, powerLogQueryEvidence } from \"../common/power-logs-ai\";\nimport { applyPowerLogsLimits, normalizePowerLogsLimits } from \"../common/power-logs-limits\";\nimport { LogsPreferencesStore } from \"../common/store/logs-preferences-store\";\nimport { explainDiagnosticFinding } from \"./ai-diagnostic-handoff\";\nimport { DiagnosticExplainButton } from \"./diagnostic-explain-button\";\nimport { NativeTooltip } from \"./native-tooltip\";\nimport { LogJson } from \"./power-log-json\";\nimport { LogJsonCell } from \"./power-log-json-cell\";\nimport { formatJsonLiteral, jsonHasDuplicateKeys } from \"./power-log-json-fields\";\nimport { LogMessage } from \"./power-log-message\";\nimport { SqlEditor } from \"./power-log-sql-editor\";\nimport { powerLogsStyles } from \"./power-logs.css\";\nimport { createPowerLogsClient } from \"./power-logs-client\";\nimport { collectHistoricalLogs, type LiveLogCoverage, resolveLogSources, startLiveLogs } from \"./power-logs-collector\";\nimport { openPowerLogs, parsePowerLogsTarget } from \"./power-logs-entrypoints\";\nimport { CaptureSqlDrafts } from \"./power-logs-sql-drafts\";\nimport { sqlRowDetails } from \"./power-logs-sql-row\";\nimport { createPowerLogsTransport } from \"./power-logs-transport\";\nimport { searchContextId } from \"./resource-search-client\";\n\nconst Icon = (props: { material: string; size?: number; tooltip?: string }) => (\n <span aria-hidden=\"true\" style={{ display: \"inline-flex\" }}>\n <Renderer.Component.Icon {...props} />\n </span>\n);\nconst sourceKey = (r: Pick<LogRecord, \"pod\" | \"container\" | \"previous\">) =>\n `${r.pod} / ${r.container}${r.previous ? \" (previous)\" : \"\"}`;\nconst levels: LogLevel[] = [\"trace\", \"debug\", \"info\", \"warn\", \"error\", \"fatal\", \"unknown\"];\nconst examples = [\n [\"Recent\", \"SELECT timestamp, level, message, container, pod FROM logs ORDER BY timestamp DESC NULLS LAST LIMIT 200\"],\n [\n \"Errors\",\n \"SELECT message, count(*) AS occurrences FROM logs WHERE level IN ('error','fatal') GROUP BY message ORDER BY occurrences DESC LIMIT 200\",\n ],\n [\n \"Timeline\",\n \"SELECT (timestamp / 60000) * 60000 AS minute, UPPER(level) AS level, count(*) AS lines FROM logs GROUP BY minute, level ORDER BY minute\",\n ],\n [\"JSON\", \"SELECT fieldsJson FROM logs WHERE fieldsJson IS NOT NULL LIMIT 100\"],\n] as const;\nconst sqlColumnWidth = (column: string) =>\n column === \"message\" || column === \"fieldsJson\" ? 360 : column === \"level\" ? 90 : 200;\ntype ViewRecord = LogRecord & { key: number; bytes: number };\n\nfunction initialTarget(): LogTarget | undefined {\n try {\n return parsePowerLogsTarget(JSON.parse(new URLSearchParams(window.location.search).get(\"target\") ?? \"null\"));\n } catch {\n return;\n }\n}\nfunction initialSource(container: unknown = new URLSearchParams(window.location.search).get(\"container\")): string {\n return typeof container === \"string\" && /^[a-z0-9](?:[-a-z0-9]*[a-z0-9])?$/.test(container) && container.length <= 63\n ? `container:${container}`\n : \"\";\n}\n\nfunction LogSelect({\n label,\n value,\n options,\n onChange,\n disabled = false,\n renderOption,\n onKeyDown,\n}: {\n label: string;\n value: string;\n options: { value: string; label: string }[];\n onChange(value: string): void;\n disabled?: boolean;\n onKeyDown?: (event: ReactKeyboardEvent) => void;\n renderOption?: (option: { value: string; label: string }, context: \"menu\" | \"value\") => ReactNode;\n}) {\n return (\n <span className=\"power-logs-select\" data-source-select={label === \"Container source\" || undefined}>\n <Renderer.Component.Select\n aria-label={label}\n value={value}\n options={options}\n formatOptionLabel={(option, meta) =>\n renderOption ? (\n renderOption(option, meta.context)\n ) : label === \"Log level\" && option.value ? (\n <span className=\"power-logs-level-label\" data-level={option.value}>\n {option.label}\n </span>\n ) : (\n option.label\n )\n }\n isDisabled={disabled}\n onKeyDown={onKeyDown}\n tabSelectsValue={false}\n isClearable={false}\n menuPosition=\"fixed\"\n menuPortalTarget={document.body}\n styles={{\n menu: (base) => (label === \"Container source\" ? { ...base, width: \"100%\", maxWidth: \"100%\" } : base),\n menuList: (base) => (label === \"Container source\" ? { ...base, width: \"100%\", maxWidth: \"100%\" } : base),\n option: (base) => (label === \"Container source\" ? { ...base, whiteSpace: \"normal\" } : base),\n menuPortal: (base) => {\n if (label !== \"Container source\" && label !== \"Capture snapshot\") return { ...base, zIndex: 10000 };\n const width = Math.min(label === \"Capture snapshot\" ? 620 : 560, window.innerWidth - 32);\n return {\n ...base,\n zIndex: 10000,\n width,\n left: Math.max(\n 16,\n Math.min(typeof base.left === \"number\" ? base.left : 16, window.innerWidth - width - 16),\n ),\n };\n },\n }}\n onChange={(option) => {\n if (option) onChange(option.value);\n }}\n />\n </span>\n );\n}\n\nconst SourcePicker = observer(() => {\n const stores = [\n Renderer.K8sApi.podsStore,\n Renderer.K8sApi.deploymentStore,\n Renderer.K8sApi.daemonSetStore,\n Renderer.K8sApi.statefulSetStore,\n Renderer.K8sApi.replicaSetStore,\n Renderer.K8sApi.jobStore,\n Renderer.K8sApi.cronJobStore,\n ];\n const targets = stores.flatMap((store) =>\n store.getItems().flatMap((object) => {\n const target = parsePowerLogsTarget({ kind: object.kind, ...object.metadata });\n return target ? [target] : [];\n }),\n );\n const [value, setValue] = useState(\"\");\n const sorted = [...targets].sort((a, b) =>\n `${a.namespace}/${a.kind}/${a.name}`.localeCompare(`${b.namespace}/${b.kind}/${b.name}`),\n );\n return (\n <div className=\"power-logs-source\">\n <span className=\"power-logs-control-label\">Resource</span>\n <LogSelect\n label=\"Resource\"\n value={value}\n onChange={setValue}\n options={[\n { value: \"\", label: \"Choose a loaded pod or workload\" },\n ...sorted.map((target) => ({\n value: target.uid,\n label: `${target.namespace} / ${target.kind} / ${target.name}`,\n })),\n ]}\n />\n <button\n type=\"button\"\n disabled={!targets.some((target) => target.uid === value)}\n onClick={() => {\n const target = targets.find((t) => t.uid === value);\n if (target) openPowerLogs(target);\n }}\n >\n <Icon material=\"subject\" size={16} /> Open logs\n </button>\n </div>\n );\n});\n\nfunction LogRows({\n records,\n loading,\n selected,\n onSelect,\n follow,\n setFollow,\n compact,\n}: {\n records: ViewRecord[];\n loading: boolean;\n selected?: number;\n onSelect(record: ViewRecord): void;\n follow: boolean;\n setFollow(value: boolean): void;\n compact: boolean;\n}) {\n const viewport = useRef<HTMLDivElement>(null);\n const [top, setTop] = useState(0);\n const [height, setHeight] = useState(400);\n useEffect(() => {\n const element = viewport.current;\n if (!element) return;\n const resize = new ResizeObserver(() => setHeight(element.clientHeight));\n resize.observe(element);\n return () => resize.disconnect();\n }, []);\n useLayoutEffect(() => {\n if (follow && viewport.current) {\n viewport.current.scrollTop = viewport.current.scrollHeight;\n setTop(viewport.current.scrollTop);\n }\n }, [records, follow, compact]);\n const levelCharacters = useMemo(\n () => records.reduce((width, record) => Math.max(width, record.level.length), 4),\n [records],\n );\n const rowHeight = compact ? 20 : 34;\n const start = Math.max(0, Math.floor(top / rowHeight) - 5);\n const visible = records.slice(start, start + Math.ceil(height / rowHeight) + 10);\n return (\n <div className=\"power-logs-viewer\">\n <div\n className=\"power-logs-stream\"\n ref={viewport}\n style={{ \"--power-log-level-ch\": levelCharacters } as CSSProperties}\n aria-label=\"Log lines\"\n aria-busy={loading}\n onScroll={(event) => {\n const el = event.currentTarget;\n setTop(el.scrollTop);\n if (el.scrollHeight - el.scrollTop - el.clientHeight > 60) setFollow(false);\n }}\n >\n {records.length === 0 ? (\n <div className=\"power-logs-empty\">{loading ? \"Loading logs…\" : \"No matching log lines\"}</div>\n ) : (\n <div style={{ height: records.length * rowHeight, position: \"relative\" }}>\n {visible.map((record, i) => (\n <button\n type=\"button\"\n className=\"power-log-row\"\n data-level={record.level}\n aria-pressed={selected === record.key}\n style={{ top: (start + i) * rowHeight, height: rowHeight }}\n key={record.key}\n onClick={() => onSelect(record)}\n >\n <NativeTooltip\n title={record.timestamp !== null ? formatDateTime(record.timestamp) : \"Timestamp unavailable\"}\n >\n <span>{record.timestamp !== null ? formatDateTime(record.timestamp).slice(-8) : \"—\"}</span>\n </NativeTooltip>\n <span className=\"power-log-level\">{record.level}</span>\n <span className=\"power-log-origin\" id={`power-log-source-${record.key}`}>\n {record.pod}\n {record.previous ? \" (previous)\" : \"\"}\n <Renderer.Component.Tooltip targetId={`power-log-source-${record.key}`}>\n {sourceKey(record)}\n </Renderer.Component.Tooltip>\n </span>\n <LogMessage text={record.message} />\n </button>\n ))}\n </div>\n )}\n </div>\n </div>\n );\n}\n\nfunction LogDetails({\n record,\n jsonColumn,\n onClose,\n onFilter,\n}: {\n record: LogRecord;\n jsonColumn?: string;\n onClose: () => void;\n onFilter?: (filter: JsonFieldFilter) => void;\n}) {\n const structuredFields = useMemo(() => {\n if (!record?.fieldsJson) return \"\";\n return formatJsonLiteral(record.fieldsJson);\n }, [record?.fieldsJson]);\n const fieldsEnabled = useMemo(() => !jsonHasDuplicateKeys(record.fieldsJson ?? \"\"), [record.fieldsJson]);\n const [copyFeedback, setCopyFeedback] = useState(\"\");\n useEffect(() => setCopyFeedback(\"\"), [structuredFields]);\n return (\n <aside className=\"power-logs-detail\" aria-label=\"Log line details\">\n <header>\n <strong>Line details</strong>\n <NativeTooltip title=\"Close line details\">\n <button className=\"power-logs-detail-close\" aria-label=\"Close line details\" onClick={onClose}>\n <Icon material=\"close\" size={16} />\n </button>\n </NativeTooltip>\n </header>\n <p className=\"power-logs-muted\">\n {record.pod && <>{sourceKey(record)} · </>}\n <span className=\"power-logs-level-label\" data-level={record.level}>\n {record.level.toUpperCase()}\n </span>\n </p>\n {record.message && (\n <pre>\n <LogMessage text={record.message} />\n </pre>\n )}\n {record.fieldsJson && (\n <>\n <div className=\"power-logs-structured-heading\">\n <strong>{jsonColumn ? `Structured fields · ${jsonColumn}` : \"Structured fields\"}</strong>\n <NativeTooltip title={copyFeedback || \"Copy structured JSON\"}>\n <button\n type=\"button\"\n className=\"power-logs-detail-copy\"\n aria-label=\"Copy structured JSON\"\n onClick={() => {\n try {\n clipboard.writeText(structuredFields);\n setCopyFeedback(\"Copied\");\n } catch {\n setCopyFeedback(\"Unable to copy JSON\");\n }\n }}\n >\n <Icon material={copyFeedback === \"Copied\" ? \"check\" : \"content_copy\"} size={16} />\n </button>\n </NativeTooltip>\n <span className=\"power-logs-muted\" aria-live=\"polite\">\n {copyFeedback}\n </span>\n </div>\n <LogJson text={structuredFields} fieldsEnabled={fieldsEnabled} Icon={Icon} onFilter={onFilter} />\n </>\n )}\n </aside>\n );\n}\n\nconst sameFieldValue = (a: JsonFieldFilter, b: JsonFieldFilter) =>\n a.path.length === b.path.length &&\n a.path.every((part, index) => part === b.path[index]) &&\n jsonValuesEqual(a.value, b.value);\nconst fieldFilterLabel = (filter: JsonFieldFilter) =>\n `${filter.path.reduce<string>((path, part) => `${path}[${typeof part === \"number\" ? part : JSON.stringify(part)}]`, \"$\")} ${filter.operator === \"eq\" ? \"=\" : \"!=\"} ${JSON.stringify(filter.value)}`;\nfunction FieldFilters({\n filters,\n sql = false,\n disabled = false,\n onRemove,\n}: {\n filters: readonly (JsonFieldFilter & { column?: string })[];\n sql?: boolean;\n disabled?: boolean;\n onRemove(index: number): void;\n}) {\n if (!filters.length) return null;\n return (\n <div className=\"power-logs-field-filters\" aria-label={sql ? \"SQL JSON filters\" : \"Live JSON filters\"}>\n <span className=\"power-logs-muted\">{sql ? \"Result filters\" : \"JSON filters\"} · AND</span>\n {filters.map((filter, index) => {\n const label = `${filter.column ? `${filter.column} ` : \"\"}${fieldFilterLabel(filter)}`;\n return (\n <NativeTooltip key={index} title={label}>\n <button\n type=\"button\"\n disabled={disabled}\n aria-label={`Remove JSON filter ${label}`}\n onClick={() => onRemove(index)}\n >\n <span>{label}</span>\n <Icon material=\"close\" size={14} />\n </button>\n </NativeTooltip>\n );\n })}\n </div>\n );\n}\n\nfunction Workspace({ clusterId, contextId }: { clusterId: string; contextId: string }) {\n const client = useMemo(() => createPowerLogsClient({ clusterId, contextId }), [clusterId, contextId]);\n const drafts = useMemo(\n () =>\n new CaptureSqlDrafts(\n (id, query) => client.saveSql(id, query),\n () => setError(\"Could not save the SQL draft. Your edits remain available in this workspace.\"),\n ),\n [client],\n );\n useEffect(\n () => () => {\n void drafts.dispose();\n },\n [drafts],\n );\n const [target, setTarget] = useState(initialTarget);\n const [records, setRecords] = useState<ViewRecord[]>([]);\n const [sources, setSources] = useState<LogSource[]>([]);\n const [notes, setNotes] = useState<string[]>([]);\n const [status, setStatus] = useState(\"Choose a resource to read its logs\");\n const [error, setError] = useState(\"\");\n const [sqlError, setSqlError] = useState(\"\");\n const [tab, setTab] = useState<\"live\" | \"captures\">(\"live\");\n const [text, setText] = useState(\"\");\n const [level, setLevel] = useState(\"\");\n const [source, setSource] = useState(initialSource);\n const [savedPoolFull, setSavedPoolFull] = useState(false);\n const [fieldFilters, setFieldFilters] = useState<JsonFieldFilter[]>([]);\n const matchFields = useMemo(() => compileJsonFilters(fieldFilters), [fieldFilters]);\n const parsedFields = useRef(new WeakMap<LogRecord, unknown>());\n const [sqlFieldFilters, setSqlFieldFilters] = useState<{\n base: string;\n rendered: string;\n captureId: string;\n filters: SqlJsonFieldFilter[];\n }>();\n const preferences = LogsPreferencesStore.getInstanceOrCreate<LogsPreferencesStore>();\n const limits = normalizePowerLogsLimits(preferences.limits);\n useEffect(() => {\n applyPowerLogsLimits(preferences.limits);\n }, [preferences.limits]);\n const [compact, setCompact] = useState(preferences.compactRows === true);\n const [hideResourceName, setHideResourceName] = useState(preferences.hideResourceNameColumn === true);\n const [selected, setSelected] = useState<ViewRecord>();\n const [selectedSqlRow, setSelectedSqlRow] = useState<\n ReturnType<typeof sqlRowDetails> & { row: LogQueryResult[\"rows\"][number] }\n >();\n const [liveCoverage, setLiveCoverage] = useState<LiveLogCoverage>();\n const [live, setLive] = useState(false);\n const [follow, setFollow] = useState(true);\n const [busy, setBusy] = useState(() => Boolean(initialTarget()));\n const [captures, setCaptures] = useState<LogCapture[]>([]);\n const [captureId, updateCaptureId] = useState(\"\");\n const captureSelection = useRef(captureId);\n captureSelection.current = captureId;\n const setCaptureId = (id: string, snapshot = captures.find((item) => item.id === id)) => {\n if (id !== captureSelection.current) void drafts.flush();\n captureSelection.current = id;\n const query = snapshot ? drafts.read(snapshot, examples[0][1]) : examples[0][1];\n sqlDraft.current = query;\n updateSql(query);\n updateCaptureId(id);\n };\n const deleting = useRef(new Set<string>());\n const [deletingCount, setDeletingCount] = useState(0);\n const [capturing, setCapturing] = useState<LogCapture>();\n const [capturePending, setCapturePending] = useState(false);\n const [captureMinutes, setCaptureMinutes] = useState(15);\n const [previous, setPrevious] = useState(false);\n const [sqlFitVersion, setSqlFitVersion] = useState(0);\n const [sql, updateSql] = useState<string>(examples[0][1]);\n const sqlDraft = useRef(sql);\n sqlDraft.current = sql;\n const setSql = (query: string) => {\n sqlDraft.current = query;\n updateSql(query);\n if (captureSelection.current) drafts.set(captureSelection.current, query);\n };\n const captureKeys = useRef(new Map<string, string[]>());\n useEffect(() => {\n setSqlFieldFilters((current) =>\n current && (current.rendered !== sql || current.captureId !== captureId) ? undefined : current,\n );\n }, [sql, captureId]);\n const [result, setResult] = useState<LogQueryResult>();\n const [resultEvidence, setResultEvidence] = useState<{ capture: LogCapture; sql: string; error?: string }>();\n const [resultPage, setResultPage] = useState(0);\n const [queryId, setQueryId] = useState(\"\");\n const captureOptions = useRef<HTMLDetailsElement>(null);\n useEffect(() => {\n const outside = (event: PointerEvent) => {\n if (\n !captureOptions.current?.contains(event.target as Node) &&\n !(event.target as Element)?.closest?.(\".Select__menu\")\n ) {\n if (captureOptions.current) captureOptions.current.open = false;\n }\n };\n const escape = (event: KeyboardEvent) => {\n if (event.key !== \"Escape\" || event.defaultPrevented || (event.target as Element)?.closest?.(\".Select\")) return;\n if (captureOptions.current?.open) captureOptions.current.open = false;\n else {\n setSelected(undefined);\n setSelectedSqlRow(undefined);\n }\n };\n window.addEventListener(\"pointerdown\", outside);\n window.addEventListener(\"keydown\", escape);\n return () => {\n window.removeEventListener(\"pointerdown\", outside);\n window.removeEventListener(\"keydown\", escape);\n };\n }, []);\n const historyController = useRef<AbortController>();\n const liveController = useRef<AbortController>();\n const captureController = useRef<AbortController>();\n const queryRef = useRef(\"\");\n const epoch = useRef(0);\n const alive = useRef(true);\n const sequence = useRef(0);\n const recordsRef = useRef(records);\n recordsRef.current = records;\n const pending = useRef<LogRecord[]>([]);\n const flushTimer = useRef<ReturnType<typeof setTimeout>>();\n const refreshCaptures = () =>\n client\n .list()\n .then((value) => {\n if (alive.current) setCaptures(value);\n })\n .catch(() => {\n if (alive.current) setError(\"Temporary captures are unavailable\");\n });\n const stopLive = () => {\n liveController.current?.abort();\n liveController.current = undefined;\n setLive(false);\n };\n const flush = () => {\n clearTimeout(flushTimer.current);\n flushTimer.current = undefined;\n const batch = pending.current;\n pending.current = [];\n if (!batch.length || !alive.current) return;\n const next = batch.map((record) => ({\n ...record,\n key: ++sequence.current,\n bytes: Buffer.byteLength(JSON.stringify(record)),\n }));\n setRecords((current) => {\n const combined = [...current, ...next];\n let bytes = combined.reduce((sum, r) => sum + r.bytes, 0);\n let start = 0;\n while (combined.length - start > L.liveRows || bytes > L.liveBytes) bytes -= combined[start++].bytes;\n return combined.slice(start).sort((a, b) => (a.timestamp ?? 0) - (b.timestamp ?? 0) || a.key - b.key);\n });\n };\n const appendView = (batch: LogRecord[]) => {\n if (!alive.current) return;\n pending.current.push(...batch);\n if (pending.current.length > 1000) flush();\n else flushTimer.current ??= setTimeout(flush, 80);\n };\n useEffect(() => {\n alive.current = true;\n const onTarget = (event: Event) => {\n const next = parsePowerLogsTarget((event as CustomEvent).detail);\n if (next) {\n if (queryRef.current) {\n void client.cancel(queryRef.current).catch(() => {});\n queryRef.current = \"\";\n setQueryId(\"\");\n }\n setSource(initialSource((event as CustomEvent).detail.container));\n setTarget(next);\n }\n };\n window.addEventListener(\"power-logs-target\", onTarget);\n void refreshCaptures();\n const timer = setInterval(() => void refreshCaptures(), 30000);\n return () => {\n alive.current = false;\n epoch.current++;\n clearInterval(timer);\n clearTimeout(flushTimer.current);\n historyController.current?.abort();\n liveController.current?.abort();\n captureController.current?.abort();\n if (queryRef.current) void client.cancel(queryRef.current).catch(() => {});\n window.removeEventListener(\"power-logs-target\", onTarget);\n };\n }, [client]);\n const readHistory = async () => {\n if (!target) return;\n const currentEpoch = ++epoch.current;\n historyController.current?.abort();\n stopLive();\n const controller = new AbortController();\n historyController.current = controller;\n clearTimeout(flushTimer.current);\n flushTimer.current = undefined;\n pending.current = [];\n setBusy(true);\n setRecords([]);\n setSelected(undefined);\n setError(\"\");\n setNotes([]);\n setStatus(\"Discovering owned containers…\");\n try {\n const transport = createPowerLogsTransport(clusterId);\n const discovery = await resolveLogSources(target, transport, controller.signal);\n if (controller.signal.aborted || currentEpoch !== epoch.current) return;\n setSources(discovery.sources);\n setNotes(discovery.notes);\n setStatus(`Reading ${discovery.sources.length} container sources…`);\n const history = await collectHistoricalLogs(discovery.sources, transport, {\n signal: controller.signal,\n tailLines: L.historyLines,\n limitBytes: L.historyBytes,\n onRecords: (batch) => {\n if (currentEpoch === epoch.current) appendView(batch);\n },\n });\n if (controller.signal.aborted || currentEpoch !== epoch.current) return;\n flush();\n setNotes([...new Set([...discovery.notes, ...history.notes])]);\n setStatus(\n `${discovery.sources.length} sources · last ${limits.historyLines.toLocaleString()} lines per container, up to ${limits.historyBytes / 1048576} MiB each`,\n );\n } catch {\n if (alive.current && currentEpoch === epoch.current)\n setError(\n controller.signal.aborted\n ? \"Log loading stopped\"\n : \"Could not read this resource's logs. Check permissions and whether it still exists.\",\n );\n } finally {\n if (alive.current && currentEpoch === epoch.current) setBusy(false);\n }\n };\n useEffect(() => {\n setText(\"\");\n setFieldFilters([]);\n setSources([]);\n setTab(\"live\");\n void readHistory();\n }, [target?.uid]);\n const toggleLive = () => {\n if (live) {\n stopLive();\n return;\n }\n setLive(true);\n };\n const sourceIdentity = sources.map((item) => `${item.podUid}/${item.container}`).join(\";\");\n useEffect(() => {\n if (!live || !sources.length) return;\n const controller = new AbortController();\n liveController.current = controller;\n const collector = startLiveLogs(sources, createPowerLogsTransport(clusterId), {\n signal: controller.signal,\n tailLines: L.historyLines,\n initialRecords: recordsRef.current,\n onRecords: appendView,\n onCoverage: (coverage) => {\n if (alive.current && liveController.current === controller)\n setLiveCoverage({ ...coverage, notes: [...coverage.notes] });\n },\n });\n setLiveCoverage({ ...collector.coverage });\n void collector.done.finally(() => {\n if (alive.current && !controller.signal.aborted && liveController.current === controller) {\n liveController.current = undefined;\n setLive(false);\n }\n });\n return () => {\n controller.abort();\n if (liveController.current === controller) liveController.current = undefined;\n };\n }, [live, sourceIdentity]);\n useEffect(() => {\n if (!live || !target) return;\n const controller = new AbortController();\n const startingEpoch = epoch.current;\n let refreshing = false;\n const timer = setInterval(() => {\n if (refreshing) return;\n refreshing = true;\n void resolveLogSources(target, createPowerLogsTransport(clusterId), controller.signal)\n .then((discovery) => {\n if (controller.signal.aborted || epoch.current !== startingEpoch) return;\n setSources(discovery.sources);\n setNotes(discovery.notes);\n setStatus(`${discovery.sources.length} sources · ownership inventory refreshed`);\n })\n .catch(() => {\n if (!controller.signal.aborted && alive.current && epoch.current === startingEpoch) {\n stopLive();\n setNotes((current) => [\n ...new Set([\n ...current,\n \"Workload inventory changed or became unavailable. Refresh before following logs again.\",\n ]),\n ]);\n }\n })\n .finally(() => {\n refreshing = false;\n });\n }, 30000);\n return () => {\n clearInterval(timer);\n controller.abort();\n };\n }, [live, target?.uid]);\n const capture = async () => {\n if (!target || captureController.current || queryRef.current) return;\n setCapturePending(true);\n const controller = new AbortController();\n captureController.current = controller;\n let current: LogCapture | undefined;\n let partial = false;\n let captureNotes: string[] = [];\n setError(\"\");\n stopLive();\n try {\n current = await client.create(target);\n setCapturing(current);\n const transport = createPowerLogsTransport(clusterId);\n const discovery = await resolveLogSources(target, transport, controller.signal);\n captureNotes = discovery.notes;\n partial = discovery.partial;\n const captureSources = previous\n ? [...discovery.sources, ...discovery.sources.map((item) => ({ ...item, previous: true }))]\n : discovery.sources;\n const boundary = current.createdAt;\n const history = await collectHistoricalLogs(captureSources, transport, {\n signal: controller.signal,\n tailLines: L.captureSourceLines,\n sinceTime: new Date(boundary - captureMinutes * 60000).toISOString(),\n limitBytes: L.captureSourceBytes,\n onRecords: async (batch) => {\n if (batch.some((record) => record.timestamp === null)) {\n partial = true;\n captureNotes.push(\"Some records have no timestamp and their capture window cannot be verified\");\n }\n batch = batch.filter(\n (record) =>\n record.timestamp === null ||\n (record.timestamp <= boundary && record.timestamp >= boundary - captureMinutes * 60000),\n );\n for (let offset = 0; offset < batch.length; ) {\n const chunk: LogRecord[] = [];\n let bytes = 2;\n while (offset < batch.length && chunk.length < L.batchRows) {\n const record = batch[offset];\n const size = Buffer.byteLength(JSON.stringify(record)) + 1;\n if (chunk.length && bytes + size > L.batchBytes) break;\n chunk.push(record);\n bytes += size;\n offset++;\n }\n if (controller.signal.aborted) throw new Error(\"Capture stopped\");\n try {\n current = await client.append(current!.id, chunk);\n if (alive.current) setCapturing(current);\n } catch {\n controller.abort();\n throw new Error(\"Capture reached its storage limit or became unavailable\");\n }\n }\n },\n });\n partial ||= history.partial;\n captureNotes.push(...history.notes);\n } catch {\n partial = true;\n captureNotes.push(\"Collection stopped or a source was unavailable; this snapshot may be incomplete\");\n } finally {\n if (current) {\n try {\n const saved = await client.finish(\n current.id,\n partial || controller.signal.aborted,\n [...new Set(captureNotes)].slice(0, 20),\n );\n if (alive.current) {\n setCaptureId(saved.id, saved);\n setCaptures((items) => [saved, ...items.filter((item) => item.id !== saved.id)]);\n setTab(\"captures\");\n setSql(examples[0][1]);\n void applyPreset(\"Recent\", saved, true);\n }\n } catch {\n if (alive.current) setError(\"The temporary capture could not be finalized\");\n }\n } else if (alive.current)\n setError(\"Could not create a capture. Delete an old snapshot or check the log service.\");\n if (alive.current) {\n setCapturing(undefined);\n setCapturePending(false);\n void refreshCaptures();\n }\n captureController.current = undefined;\n }\n };\n const runQuery = async (selectedCapture?: LogCapture, query = sql) => {\n if (queryRef.current || (!selectedCapture && captureController.current)) return;\n const captured = selectedCapture ?? captures.find((item) => item.id === captureId);\n if (!captured || captured.state === \"collecting\" || deleting.current.has(captured.id)) return;\n const id = randomUUID();\n queryRef.current = id;\n setQueryId(id);\n setError(\"\");\n setResult(undefined);\n setSelectedSqlRow(undefined);\n setSqlError(\"\");\n setResultEvidence({ capture: captured, sql: query });\n setResultPage(0);\n try {\n const value = await client.query(captured.id, id, query);\n if (alive.current && queryRef.current === id) {\n if (value.error) {\n setSqlError(value.error);\n setResultEvidence({ capture: captured, sql: query, error: value.error });\n } else setResult(value);\n }\n } catch {\n if (alive.current && queryRef.current === id) {\n const message =\n \"Query stopped or failed. Use one read-only SELECT or EXPLAIN; external files, networking and extensions are disabled.\";\n setSqlError(message);\n setResultEvidence({ capture: captured, sql: query, error: message });\n }\n } finally {\n if (queryRef.current === id) {\n if (alive.current) setQueryId(\"\");\n queryRef.current = \"\";\n }\n }\n };\n const applyPreset = async (title: \"Recent\" | \"JSON\", selectedCapture?: LogCapture, execute = false) => {\n const captured = selectedCapture ?? captures.find((item) => item.id === captureId);\n if (queryRef.current || (!selectedCapture && captureController.current)) return;\n if (title === \"Recent\") {\n const query = examples[0][1];\n setSql(query);\n setSqlFitVersion((version) => version + 1);\n setSelectedSqlRow(undefined);\n if (execute && captured) void runQuery(captured, query);\n return;\n }\n if (\n queryRef.current ||\n (!selectedCapture && captureController.current) ||\n !captured ||\n captured.state === \"collecting\" ||\n deleting.current.has(captured.id)\n )\n return;\n const draft = execute ? examples[0][1] : sqlDraft.current;\n const id = randomUUID();\n queryRef.current = id;\n setQueryId(id);\n setSqlError(\"\");\n let prepared: string | undefined;\n try {\n let keys = captureKeys.current.get(captured.id);\n if (!keys) {\n const schema = await client.query(captured.id, id, JSON_KEY_DISCOVERY_SQL);\n if (schema.error) throw new Error(schema.error);\n const keyColumn = schema.columns.indexOf(\"key\");\n keys = schema.truncated\n ? [\"\\0\"]\n : keyColumn < 0\n ? []\n : schema.rows.map((row) => row[keyColumn]).filter((key): key is string => typeof key === \"string\");\n captureKeys.current.set(captured.id, keys);\n if (captureKeys.current.size > 10) captureKeys.current.delete(captureKeys.current.keys().next().value!);\n }\n if (!alive.current || queryRef.current !== id || captureSelection.current !== captured.id) return;\n if (sqlDraft.current !== draft) {\n setSqlError(\"SQL draft changed while detecting JSON fields. Select the preset again to replace it.\");\n return;\n }\n prepared = buildJsonProjectionSql(keys);\n setSql(prepared);\n setSqlFitVersion((version) => version + 1);\n setSelectedSqlRow(undefined);\n } catch {\n if (alive.current) setSqlError(\"Could not detect JSON fields for this snapshot. Try the preset again.\");\n } finally {\n if (queryRef.current === id) {\n queryRef.current = \"\";\n if (alive.current) setQueryId(\"\");\n }\n }\n if (prepared && execute && alive.current) void runQuery(captured, prepared);\n };\n const addLiveFilter = (filter: JsonFieldFilter) => {\n if (!jsonValuesEqual(filter.value, filter.value)) {\n setError(\"This JSON value is too large or unsupported for filtering\");\n return;\n }\n const existing = fieldFilters.findIndex((current) => sameFieldValue(current, filter));\n if (existing >= 0) {\n if (fieldFilters[existing].operator !== filter.operator) {\n setFieldFilters(fieldFilters.map((current, index) => (index === existing ? filter : current)));\n }\n return;\n }\n if (fieldFilters.length >= 32) {\n setError(\"Up to 32 JSON filters can be combined\");\n return;\n }\n setFieldFilters([...fieldFilters, filter]);\n };\n const activeSqlFilters =\n sqlFieldFilters?.rendered === sql && sqlFieldFilters.captureId === captureId ? sqlFieldFilters : undefined;\n const sqlFilteringDisabled = Boolean(\n queryId ||\n capturePending ||\n deleting.current.has(captureId) ||\n !captures.some((capture) => capture.id === captureId && capture.state !== \"collecting\"),\n );\n const applySqlFilters = (filters: SqlJsonFieldFilter[]) => {\n if (queryRef.current || captureController.current || sqlFilteringDisabled) return;\n if (!resultEvidence || resultEvidence.sql !== sql) {\n setSqlError(\"Run the edited SQL query before filtering its results\");\n return;\n }\n try {\n const base = activeSqlFilters?.base ?? sql;\n const query = buildJsonFilterSql(base, filters);\n setSqlFieldFilters({ base, rendered: query, captureId, filters });\n setSql(query);\n void runQuery(undefined, query);\n } catch {\n setSqlError(\"This JSON filter cannot be added to the query. Check the field path and value size.\");\n }\n };\n const addSqlFilter = (column: string, filter: JsonFieldFilter) => {\n const columnNames = result?.columns.map((name) => name.replace(/[A-Z]/g, (letter) => letter.toLowerCase())) ?? [];\n if (!result?.columns.includes(column) || new Set(columnNames).size !== columnNames.length) {\n setSqlError(\"JSON filters require unique result column names, ignoring case\");\n return;\n }\n const filters = activeSqlFilters?.filters ?? [];\n const existing = filters.findIndex((current) => current.column === column && sameFieldValue(current, filter));\n if (existing >= 0) {\n if (filters[existing].operator !== filter.operator) {\n applySqlFilters(filters.map((current, index) => (index === existing ? { ...filter, column } : current)));\n }\n return;\n }\n if (filters.length >= 32) {\n setSqlError(\"Up to 32 JSON filters can be combined\");\n return;\n }\n applySqlFilters([...filters, { ...filter, column }]);\n };\n const matchesRecordFields = (record: LogRecord) => {\n if (!fieldFilters.length) return true;\n if (!parsedFields.current.has(record)) {\n let fields: unknown;\n try {\n fields = JSON.parse(record.fieldsJson ?? \"null\");\n } catch {\n fields = undefined;\n }\n parsedFields.current.set(record, fields);\n }\n return matchFields(parsedFields.current.get(record));\n };\n const filtered = useMemo(\n () =>\n records.filter(\n (record) =>\n (!text || record.message.toLocaleLowerCase().includes(text.toLocaleLowerCase())) &&\n (!level || record.level === level) &&\n (!source ||\n (source.startsWith(\"container:\") ? record.container === source.slice(10) : sourceKey(record) === source)) &&\n matchesRecordFields(record),\n ),\n [records, text, level, source, fieldFilters, matchFields],\n );\n const chosenCapture = captures.find((item) => item.id === captureId);\n const collectionNotes = tab === \"live\" ? [...new Set([...notes, ...(live ? (liveCoverage?.notes ?? []) : [])])] : [];\n useEffect(() => {\n window.dispatchEvent(new CustomEvent(\"power-logs-workspace-change\", { detail: { active: true } }));\n return () => {\n window.dispatchEvent(new CustomEvent(\"power-logs-workspace-change\", { detail: { active: false } }));\n };\n }, []);\n useEffect(() => {\n const insert = (event: Event) => {\n const sql = (event as CustomEvent<{ sql?: unknown }>).detail?.sql;\n if (typeof sql !== \"string\" || !sql.trim() || sql.length > 65536) return;\n setTab(\"captures\");\n setSelectedSqlRow(undefined);\n if (!captureId) {\n const latest = captures.find((item) => item.state !== \"collecting\" && item.target.uid === target?.uid);\n if (latest) setCaptureId(latest.id);\n }\n setSql(sql);\n requestAnimationFrame(() => document.getElementById(\"power-logs-sql\")?.focus());\n };\n window.addEventListener(\"power-logs-sql-draft\", insert);\n return () => window.removeEventListener(\"power-logs-sql-draft\", insert);\n }, [captureId, captures, target?.uid]);\n const attachAi = () => {\n const queryEvidence =\n result ??\n (resultEvidence?.error\n ? {\n columns: [],\n rows: [],\n truncated: false,\n elapsedMs: 0,\n error: resultEvidence.error,\n }\n : undefined);\n const resource =\n tab === \"captures\"\n ? queryEvidence && resultEvidence\n ? resultEvidence.capture.target\n : (chosenCapture?.target ?? target)\n : target;\n const summary =\n tab === \"captures\" && queryEvidence && resultEvidence\n ? powerLogQueryEvidence(\n resultEvidence.capture,\n resultEvidence.sql,\n selectedSqlRow ? { ...queryEvidence, rows: [selectedSqlRow.row], truncated: false } : queryEvidence,\n )\n : tab === \"live\" && selected\n ? powerLogLineEvidence(resource, selected)\n : JSON.stringify({\n target: resource,\n ...(tab === \"captures\"\n ? { sql, rows: [], state: \"Draft query, not executed\" }\n : { status, sources: sources.length }),\n });\n if (\n !explainDiagnosticFinding({\n clusterId,\n source: \"logs\",\n title: tab === \"captures\" ? (selectedSqlRow ? \"SQL row\" : \"SQL query\") : selected ? \"Log line\" : \"Power Logs\",\n summary: summary.slice(0, 6000),\n ...(resource ? { resource: { kind: resource.kind, name: resource.name, namespace: resource.namespace } } : {}),\n })\n )\n window.dispatchEvent(new Event(\"power-ai-open-only\"));\n };\n const deleteCapture = async (id: string) => {\n if (deleting.current.has(id) || queryRef.current || captureController.current) return;\n deleting.current.add(id);\n setDeletingCount(deleting.current.size);\n try {\n await drafts.flush();\n await client.delete(id);\n drafts.forget(id);\n if (id === captureSelection.current) {\n setCaptureId(\"\");\n setResult(undefined);\n setResultEvidence(undefined);\n setSelectedSqlRow(undefined);\n }\n await refreshCaptures();\n } catch {\n setError(\"Could not delete capture\");\n } finally {\n deleting.current.delete(id);\n if (alive.current) setDeletingCount(deleting.current.size);\n }\n };\n const confirmDeleteCapture = (id: string) => {\n const capture = captures.find((capture) => capture.id === id);\n if (!capture) return;\n Renderer.Component.ConfirmDialog.open({\n message: (\n <>\n Delete snapshot <strong>{capture.target.name}</strong>? This cannot be undone.\n </>\n ),\n labelOk: \"Delete snapshot\",\n ok: () => deleteCapture(id),\n });\n };\n const confirmPersistentCapture = (capture: LogCapture) => {\n const persistent = !capture.persistent;\n Renderer.Component.ConfirmDialog.open({\n message: persistent ? (\n <>\n Keep snapshot <strong>{capture.target.name}</strong> until you delete it? It will survive restarts and will\n not expire automatically.\n </>\n ) : (\n <>\n Allow snapshot <strong>{capture.target.name}</strong> to expire? Its retention period will start again now.\n </>\n ),\n labelOk: persistent ? \"Keep snapshot\" : \"Allow expiration\",\n ok: async () => {\n if (!alive.current || deleting.current.has(capture.id) || queryRef.current || captureController.current) return;\n deleting.current.add(capture.id);\n setDeletingCount(deleting.current.size);\n try {\n await drafts.flush();\n await client.setPersistent(capture.id, persistent);\n await refreshCaptures();\n } catch (error) {\n if (alive.current) {\n const full = error instanceof Error && error.message.includes(\"Saved snapshot limit reached\");\n setSavedPoolFull(full);\n setError(\n full\n ? \"Saved snapshot limit reached. Delete a saved snapshot or clear saved snapshots from all clusters.\"\n : \"Could not update snapshot retention\",\n );\n }\n } finally {\n deleting.current.delete(capture.id);\n if (alive.current) setDeletingCount(deleting.current.size);\n }\n },\n });\n };\n const clearSavedSnapshots = () =>\n Renderer.Component.ConfirmDialog.open({\n message: \"Delete all saved snapshots from all clusters? Temporary snapshots will be kept. This cannot be undone.\",\n labelOk: \"Clear saved snapshots\",\n ok: async () => {\n if (queryRef.current || captureController.current || deleting.current.size) return;\n deleting.current.add(\"clear-saved\");\n setDeletingCount(deleting.current.size);\n try {\n await drafts.flush();\n await client.clearPersistent();\n const removed = captures.filter((capture) => capture.persistent);\n for (const capture of removed) drafts.forget(capture.id);\n if (removed.some((capture) => capture.id === captureSelection.current)) {\n setCaptureId(\"\");\n setResult(undefined);\n setResultEvidence(undefined);\n setSelectedSqlRow(undefined);\n }\n setSavedPoolFull(false);\n setError(\"\");\n await refreshCaptures();\n } catch {\n if (alive.current) setError(\"Could not clear saved snapshots\");\n } finally {\n deleting.current.delete(\"clear-saved\");\n if (alive.current) setDeletingCount(deleting.current.size);\n }\n },\n });\n const native = () => {\n const first = sources[0];\n const pod = Renderer.K8sApi.podsStore\n .getItems()\n .find((item) =>\n target?.kind === \"Pod\" ? item.metadata.uid === target.uid : item.metadata.uid === first?.podUid,\n );\n const requested = source.startsWith(\"container:\")\n ? source.slice(10)\n : sources.find((item) => sourceKey(item) === source)?.container;\n const defaultContainer = pod?.metadata.annotations?.[\"kubectl.kubernetes.io/default-container\"];\n const container =\n pod?.getAllContainers().find((item) => item.name === (requested ?? defaultContainer)) ??\n pod?.getAllContainers()[0];\n if (pod && container)\n Renderer.Component.logTabStore.createPodTab({ selectedPod: pod, selectedContainer: container });\n else setError(\"Open the Pod in the native resource view to use its Logs action\");\n };\n return (\n <div\n className=\"power-logs\"\n data-testid=\"power-logs-page\"\n data-compact={compact || undefined}\n data-hide-resource-name={hideResourceName || undefined}\n >\n <style>{powerLogsStyles}</style>\n <header>\n <h1 className=\"power-logs-page-title\">Power Logs</h1>\n <div\n className=\"power-logs-tabs\"\n role=\"tablist\"\n aria-label=\"Log workspace\"\n onKeyDown={(event) => {\n if (![\"ArrowLeft\", \"ArrowRight\", \"Home\", \"End\"].includes(event.key)) return;\n const tabs = [...event.currentTarget.querySelectorAll<HTMLButtonElement>(\"[role=tab]\")];\n const index = tabs.indexOf(document.activeElement as HTMLButtonElement);\n if (index < 0) return;\n event.preventDefault();\n const next =\n event.key === \"Home\"\n ? 0\n : event.key === \"End\"\n ? tabs.length - 1\n : (index + (event.key === \"ArrowRight\" ? 1 : -1) + tabs.length) % tabs.length;\n tabs[next]?.focus();\n tabs[next]?.click();\n }}\n >\n <button role=\"tab\" aria-selected={tab === \"live\"} onClick={() => setTab(\"live\")}>\n <Icon material=\"subject\" size={16} /> Live view\n </button>\n <button\n role=\"tab\"\n aria-selected={tab === \"captures\"}\n onClick={() => {\n setTab(\"captures\");\n const latest = captures.find(\n (item) => item.state !== \"collecting\" && (!target || item.target.uid === target.uid),\n );\n if (!captureId && latest && !capturePending) {\n setCaptureId(latest.id);\n }\n void refreshCaptures();\n }}\n >\n <Icon material=\"code\" size={16} /> SQL\n </button>\n </div>\n\n <div className=\"power-logs-actions\">\n <div className=\"power-logs-toolbar power-logs-capture\">\n <details ref={captureOptions} className=\"power-logs-options\">\n <NativeTooltip title={`Capture window: ${captureMinutes} minutes`}>\n <summary>\n <Icon material=\"tune\" size={16} /> Options\n </summary>\n </NativeTooltip>\n <div>\n {\" \"}\n <label>\n Capture window\n <LogSelect\n label=\"Capture window\"\n value={String(captureMinutes)}\n onChange={(value) => setCaptureMinutes(Number(value))}\n options={[\n { value: \"5\", label: \"5 minutes\" },\n { value: \"15\", label: \"15 minutes\" },\n { value: \"60\", label: \"1 hour\" },\n ]}\n />\n </label>\n <Renderer.Component.Switch checked={previous} onChange={setPrevious}>\n Include previous containers\n </Renderer.Component.Switch>\n <Renderer.Component.Switch\n checked={compact}\n onChange={(value) => {\n setCompact(value);\n preferences.compactRows = value;\n }}\n >\n Compact density\n </Renderer.Component.Switch>\n <Renderer.Component.Switch\n checked={hideResourceName}\n onChange={(value) => {\n setHideResourceName(value);\n preferences.hideResourceNameColumn = value;\n }}\n >\n Hide resource name column\n </Renderer.Component.Switch>\n </div>\n </details>\n {tab === \"captures\" && (\n <button\n type=\"button\"\n disabled={!target || capturePending || busy || !!queryId || deletingCount > 0}\n onClick={() => void capture()}\n >\n <Icon material=\"save_alt\" size={16} /> Capture logs\n </button>\n )}\n {capturePending && (\n <>\n <span role=\"status\" className=\"power-logs-muted\">\n {capturing\n ? `${capturing.rows.toLocaleString()} lines · ${(capturing.bytes / 1048576).toFixed(1)} MiB`\n : \"Preparing capture…\"}\n </span>\n <button type=\"button\" onClick={() => captureController.current?.abort()}>\n <Icon material=\"stop\" size={16} /> Stop & keep partial\n </button>\n </>\n )}\n </div>\n\n <DiagnosticExplainButton aria-label=\"Open AI assistant\" title=\"Open AI assistant\" onClick={attachAi}>\n <Icon material=\"chat_bubble_outline\" size={16} /> AI\n </DiagnosticExplainButton>\n {tab === \"live\" && (\n <button type=\"button\" disabled={!target || busy} onClick={() => void readHistory()}>\n <Icon material=\"refresh\" size={16} /> Refresh\n </button>\n )}\n {target?.kind === \"Pod\" && (\n <NativeTooltip title=\"Native logs\">\n <button type=\"button\" aria-label=\"Native logs\" onClick={native}>\n <Renderer.Component.Icon material=\"open_in_new\" size={16} />\n </button>\n </NativeTooltip>\n )}\n </div>\n </header>\n {target ? (\n <NativeTooltip title={`${target.kind} / ${target.name} · ${target.namespace} · UID ${target.uid}`}>\n <div className=\"power-logs-target power-logs-muted\">\n <strong>\n {target.kind} / {target.name}\n </strong>{\" \"}\n · {target.namespace}\n </div>\n </NativeTooltip>\n ) : (\n <SourcePicker />\n )}\n {error && (\n <div role=\"alert\" className=\"power-logs-notice power-logs-error\">\n {error}\n {savedPoolFull && (\n <button\n type=\"button\"\n disabled={deletingCount > 0 || !!queryId || capturePending}\n onClick={clearSavedSnapshots}\n >\n Clear saved snapshots\n </button>\n )}\n </div>\n )}\n {tab === \"live\" ? (\n <>\n <div className=\"power-logs-filters\">\n <input\n aria-label=\"Search log messages\"\n placeholder=\"Search messages…\"\n value={text}\n maxLength={300}\n onChange={(event) => setText(event.target.value)}\n />\n <LogSelect\n label=\"Log level\"\n value={level}\n onChange={setLevel}\n options={[\n { value: \"\", label: \"All levels\" },\n ...levels.map((value) => ({ value, label: value.toUpperCase() })),\n ]}\n />\n <LogSelect\n label=\"Container source\"\n renderOption={(option, context) => {\n if (context !== \"menu\")\n return (\n <NativeTooltip title={option.label}>\n <span>{option.label}</span>\n </NativeTooltip>\n );\n const item = sources.find((item) => sourceKey(item) === option.value);\n return (\n <NativeTooltip title={option.label}>\n <span className=\"power-logs-source-option\">\n <Icon material={item ? \"view_in_ar\" : \"layers\"} size={16} />\n <span className=\"power-logs-option-text\">\n <strong>{item ? item.pod : option.value ? \"All pods\" : option.label}</strong>\n <small>\n {option.value\n ? `Container · ${item?.container ?? option.value.slice(10)}`\n : \"Every pod and container\"}\n {item?.previous ? \" · Previous\" : \"\"}\n </small>\n </span>\n <span className=\"power-logs-source-check\" aria-hidden=\"true\">\n {source === option.value && <Icon material=\"check\" size={16} />}\n </span>\n </span>\n </NativeTooltip>\n );\n }}\n value={source}\n onChange={setSource}\n options={[\n { value: \"\", label: `All sources (${sources.length})` },\n ...[...new Set(sources.map((item) => item.container))].map((container) => ({\n value: `container:${container}`,\n label: `All pods / ${container}`,\n })),\n ...[...new Set(sources.map(sourceKey))].map((value) => ({ value, label: value })),\n ]}\n />\n <button\n type=\"button\"\n disabled={!sources.length || busy || capturePending}\n aria-pressed={live}\n onClick={toggleLive}\n >\n <Icon material={live ? \"pause\" : \"play_arrow\"} size={16} /> {live ? \"Pause\" : \"Live\"}\n </button>\n <button type=\"button\" aria-pressed={follow} onClick={() => setFollow(!follow)}>\n <Icon material=\"vertical_align_bottom\" size={16} /> Follow tail\n </button>\n {busy && (\n <button onClick={() => historyController.current?.abort()} type=\"button\">\n <Icon material=\"stop\" size={16} /> Stop loading\n </button>\n )}\n </div>\n <FieldFilters\n filters={fieldFilters}\n onRemove={(index) => setFieldFilters(fieldFilters.filter((_, item) => item !== index))}\n />\n <NativeTooltip\n title={`${status} · Viewer retains up to ${limits.liveRows.toLocaleString()} lines / ${limits.liveBytes / 1048576} MiB`}\n >\n <div className=\"power-logs-muted power-logs-status\" role=\"status\">\n <span>{filtered.length.toLocaleString()} matching lines</span> · {status}\n {liveCoverage && live ? ` · ${liveCoverage.active}/${liveCoverage.total} active sources` : \"\"} · Viewer\n retains up to {limits.liveRows.toLocaleString()} lines / {limits.liveBytes / 1048576} MiB\n </div>\n </NativeTooltip>\n <div className=\"power-logs-workspace\">\n <LogRows\n records={filtered}\n loading={busy}\n selected={selected?.key}\n onSelect={setSelected}\n follow={follow}\n setFollow={setFollow}\n compact={compact}\n />\n {selected && (\n <LogDetails record={selected} onClose={() => setSelected(undefined)} onFilter={addLiveFilter} />\n )}\n </div>\n </>\n ) : (\n <>\n <div className=\"power-logs-toolbar power-logs-snapshot-bar\">\n <span className=\"power-logs-control-label\">Snapshot</span>\n <LogSelect\n label=\"Capture snapshot\"\n onKeyDown={(event) => {\n if (\n event.key !== \"Delete\" ||\n !event.altKey ||\n ((event.target as HTMLInputElement).value ?? \"\").length > 0\n )\n return;\n const button = document.querySelector<HTMLButtonElement>(\n \".Select__menu .Select__option--is-focused [data-capture-delete]\",\n );\n if (button && !button.disabled) {\n event.preventDefault();\n event.stopPropagation();\n confirmDeleteCapture(button.dataset.captureDelete!);\n }\n }}\n renderOption={(option, context) => {\n const item = captures.find((item) => item.id === option.value);\n if (context !== \"menu\" || !item) return option.label;\n return (\n <span className=\"power-logs-snapshot-option\">\n <NativeTooltip title={option.label}>\n <span className=\"power-logs-option-text\">\n <strong>{item.target.name}</strong>\n <small>\n {formatDateTime(item.createdAt)} · {item.rows.toLocaleString()} lines ·{\" \"}\n {item.state[0].toUpperCase()}\n {item.state.slice(1)}\n {item.persistent ? \" · Persistent\" : \"\"}\n </small>\n </span>\n </NativeTooltip>\n <NativeTooltip title={item.persistent ? \"Allow snapshot to expire\" : \"Keep snapshot\"}>\n <button\n type=\"button\"\n aria-label={`${item.persistent ? \"Allow expiration for\" : \"Keep\"} snapshot ${item.target.name}`}\n aria-pressed={Boolean(item.persistent)}\n data-capture-persistent={item.id}\n onKeyDown={(event) => event.stopPropagation()}\n disabled={!!queryId || capturePending || deletingCount > 0 || item.state === \"collecting\"}\n onMouseDown={(event) => {\n event.preventDefault();\n event.stopPropagation();\n }}\n onClick={(event) => {\n event.preventDefault();\n event.stopPropagation();\n confirmPersistentCapture(item);\n }}\n >\n <Renderer.Component.Icon material=\"push_pin\" size={16} />\n </button>\n </NativeTooltip>\n <NativeTooltip title=\"Delete snapshot (Alt+Delete)\">\n <button\n type=\"button\"\n aria-label={`Delete snapshot ${item.target.name}`}\n data-capture-delete={item.id}\n onKeyDown={(event) => event.stopPropagation()}\n disabled={!!queryId || capturePending || deletingCount > 0 || item.state === \"collecting\"}\n onMouseDown={(event) => {\n event.preventDefault();\n event.stopPropagation();\n }}\n onClick={(event) => {\n event.preventDefault();\n event.stopPropagation();\n confirmDeleteCapture(item.id);\n }}\n >\n <Renderer.Component.Icon material=\"delete_outline\" size={16} />\n </button>\n </NativeTooltip>\n </span>\n );\n }}\n value={captureId}\n disabled={!!queryId || capturePending || deletingCount > 0}\n onChange={(value) => {\n setCaptureId(value);\n setResult(undefined);\n setResultEvidence(undefined);\n setSelectedSqlRow(undefined);\n setSqlError(\"\");\n }}\n options={[\n { value: \"\", label: \"Choose a snapshot\" },\n ...captures.map((item) => ({\n value: item.id,\n label: `${item.target.name} · ${formatDateTime(item.createdAt)} · ${item.rows.toLocaleString()} lines · ${item.state[0].toUpperCase()}${item.state.slice(1)}${item.persistent ? \" · Persistent\" : \"\"}`,\n })),\n ]}\n />\n <NativeTooltip title=\"Export JSON Lines (NDJSON)\">\n <button\n type=\"button\"\n disabled={!captureId || !!queryId || deleting.current.has(captureId)}\n onClick={() => {\n void client.export(captureId).catch(() => setError(\"Could not export capture\"));\n }}\n >\n <Icon material=\"download\" size={16} /> Export JSON\n </button>\n </NativeTooltip>\n </div>\n <div className=\"power-logs-toolbar power-logs-sql-tools\">\n <NativeTooltip\n title={`Read-only SELECT · ${limits.queryMs / 1000} s · ${limits.resultRows.toLocaleString()} rows · Schema: logs(timestamp INTEGER in milliseconds, pod, podUid, container, level, message, fieldsJson, previous INTEGER 0 or 1)`}\n >\n <label htmlFor=\"power-logs-sql\" className=\"power-logs-control-label\">\n SQL query\n </label>\n </NativeTooltip>\n <button\n type=\"button\"\n disabled={\n !chosenCapture ||\n !!queryId ||\n capturePending ||\n deleting.current.has(captureId) ||\n chosenCapture.state === \"collecting\"\n }\n onClick={() => void runQuery()}\n >\n <Icon material=\"play_arrow\" size={16} /> Run query\n </button>\n {queryId && (\n <button\n type=\"button\"\n onClick={() => {\n void client.cancel(queryId).catch(() => setError(\"Could not cancel query\"));\n }}\n >\n <Icon material=\"stop\" size={16} /> Cancel\n </button>\n )}\n {examples.map(([title, query]) => (\n <button\n type=\"button\"\n key={title}\n disabled={!!queryId || capturePending}\n onClick={() => {\n if (title === \"JSON\" || title === \"Recent\") void applyPreset(title);\n else {\n setSql(query);\n setSqlFitVersion((version) => version + 1);\n }\n }}\n >\n <Icon\n material={\n title === \"Recent\"\n ? \"history\"\n : title === \"Errors\"\n ? \"error_outline\"\n : title === \"Timeline\"\n ? \"timeline\"\n : \"data_object\"\n }\n size={16}\n />{\" \"}\n SQL · {title}\n </button>\n ))}\n </div>\n <FieldFilters\n sql\n filters={activeSqlFilters?.filters ?? []}\n disabled={sqlFilteringDisabled}\n onRemove={(index) => applySqlFilters((activeSqlFilters?.filters ?? []).filter((_, item) => item !== index))}\n />\n <SqlEditor id=\"power-logs-sql\" value={sql} onChange={setSql} fitVersion={sqlFitVersion} />\n {sqlError && (\n <div role=\"alert\" className=\"power-logs-notice power-logs-error power-logs-query-error\">\n {sqlError}\n </div>\n )}\n {result ? (\n <>\n <div className=\"power-logs-toolbar power-logs-results-bar\">\n <span role=\"status\" className=\"power-logs-muted\">\n {result.rows.length} rows · {result.elapsedMs} ms{result.truncated ? \" · Result truncated\" : \"\"}\n </span>\n </div>\n <div className=\"power-logs-workspace\">\n <div className=\"power-logs-results\">\n <table\n style={{\n minWidth:\n result.columns.length > 3\n ? result.columns.reduce((width, column) => width + sqlColumnWidth(column), 0)\n : undefined,\n }}\n >\n <colgroup>\n {result.columns.map((column, i) => (\n <col\n key={i}\n style={{\n width: result.columns.length > 3 ? sqlColumnWidth(column) : undefined,\n }}\n />\n ))}\n </colgroup>\n <thead>\n <tr>\n {result.columns.map((column, i) => (\n <th key={i} data-column={column}>\n {column}\n </th>\n ))}\n </tr>\n </thead>\n <tbody>\n {result.rows.slice(resultPage * 50, (resultPage + 1) * 50).map((row, i) => (\n <tr\n key={i}\n tabIndex={0}\n aria-label={`Open SQL row ${resultPage * 50 + i + 1}`}\n onClick={() => setSelectedSqlRow({ ...sqlRowDetails(result.columns, row), row })}\n onKeyDown={(event) => {\n if (event.key === \"Enter\" || event.key === \" \") {\n event.preventDefault();\n setSelectedSqlRow({ ...sqlRowDetails(result.columns, row), row });\n }\n }}\n >\n {row.map((cell, j) => (\n <td\n key={j}\n data-column={result.columns[j]}\n data-level={sqlCellLevel(result.columns[j], cell)}\n >\n <LogJsonCell\n value={cell === null ? null : String(cell)}\n column={result.columns[j]}\n rawValue={cell}\n Icon={Icon}\n />\n </td>\n ))}\n </tr>\n ))}\n </tbody>\n </table>\n {result.rows.length === 0 && (\n <div className=\"power-logs-empty\">\n {chosenCapture?.rows === 0\n ? \"This snapshot contains no log lines. Try a longer capture window.\"\n : \"This query returned no rows. Adjust the query or choose SQL · Recent.\"}\n </div>\n )}\n </div>\n {selectedSqlRow && (\n <LogDetails\n record={selectedSqlRow.record}\n jsonColumn={selectedSqlRow.jsonColumn}\n onFilter={\n !sqlFilteringDisabled && selectedSqlRow.jsonColumn\n ? (filter) => addSqlFilter(selectedSqlRow.jsonColumn!, filter)\n : undefined\n }\n onClose={() => setSelectedSqlRow(undefined)}\n />\n )}\n </div>\n {result.rows.length > 50 && (\n <nav className=\"power-logs-toolbar power-logs-pagination\" aria-label=\"SQL result pages\">\n <NativeTooltip title=\"Previous page\">\n <button\n type=\"button\"\n aria-label=\"Previous page\"\n disabled={resultPage === 0}\n onClick={() => {\n setResultPage(resultPage - 1);\n setSelectedSqlRow(undefined);\n }}\n >\n <Icon material=\"chevron_left\" size={16} />\n </button>\n </NativeTooltip>\n <span className=\"power-logs-muted\">\n Page {resultPage + 1} / {Math.max(1, Math.ceil(result.rows.length / 50))}\n </span>\n <NativeTooltip title=\"Next page\">\n <button\n type=\"button\"\n aria-label=\"Next page\"\n disabled={(resultPage + 1) * 50 >= result.rows.length}\n onClick={() => {\n setResultPage(resultPage + 1);\n setSelectedSqlRow(undefined);\n }}\n >\n <Icon material=\"chevron_right\" size={16} />\n </button>\n </NativeTooltip>\n </nav>\n )}\n </>\n ) : (\n <div className=\"power-logs-results power-logs-empty\">\n {queryId\n ? \"Running query…\"\n : captures.length === 0\n ? \"Capture logs to create a temporary snapshot for SQL.\"\n : \"Choose a snapshot to preview its logs.\"}\n </div>\n )}\n </>\n )}\n <div className=\"power-logs-muted power-logs-footer\">\n <NativeTooltip\n title={`Gentle collection: ${limits.requestsPerSecond} requests/s, ${limits.bytesPerSecond / 1048576} MiB/s. Captures: ${limits.captureSourceLines.toLocaleString()} lines / ${limits.captureSourceBytes / 1048576} MiB per source, ${limits.captureBytes / 1048576} MiB total. Up to ${limits.captures} snapshots retained for ${limits.ttlMs / 60000} minutes.`}\n >\n <span className=\"power-logs-caption\">\n Collection · {limits.requestsPerSecond} req/s · {limits.bytesPerSecond / 1048576} MiB/s ·{\" \"}\n {limits.captureBytes / 1048576} MiB/snapshot · Retention {limits.ttlMs / 60000} min\n </span>\n </NativeTooltip>\n {tab === \"live\" && collectionNotes.length > 0 && (\n <NativeTooltip title={collectionNotes.join(\"\\n\")}>\n <span role=\"note\" className=\"power-logs-notice power-logs-collection-note\">\n <Icon material=\"warning_amber\" size={14} />\n <span>{collectionNotes.join(\" · \")}</span>\n </span>\n </NativeTooltip>\n )}\n {tab === \"captures\" &&\n chosenCapture &&\n (chosenCapture.state === \"partial\" || chosenCapture.notes.length > 0) && (\n <NativeTooltip\n title={\n chosenCapture.notes.join(\"\\n\") ||\n \"Collection stopped or a source was unavailable; this snapshot may be incomplete\"\n }\n >\n <span role=\"note\" className=\"power-logs-notice power-logs-collection-note\">\n <Icon material=\"warning_amber\" size={14} />\n <span>Incomplete snapshot</span>\n </span>\n </NativeTooltip>\n )}\n </div>\n </div>\n );\n}\n\nconst ObservedWorkspace = observer(Workspace);\n\nexport const PowerLogsPage = observer(() => {\n const enabled = LogsPreferencesStore.getInstanceOrCreate<LogsPreferencesStore>().enabled;\n const clusterId = Renderer.Catalog.activeCluster.get()?.metadata.uid;\n if (!enabled || !clusterId)\n return (\n <div className=\"power-logs\">\n <style>{powerLogsStyles}</style>\n <h1>Power Logs</h1>\n <p>Enable Power Logs in Power settings and open a cluster to view logs.</p>\n </div>\n );\n const contextId = searchContextId();\n return <ObservedWorkspace key={`${clusterId}:${contextId}`} clusterId={clusterId} contextId={contextId} />;\n});\n"],"mappings":"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"}
|