slopmeter 0.1.0 → 0.3.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 +25 -1
- package/dist/cli.js +1039 -134
- package/dist/cli.js.map +1 -1
- package/package.json +2 -1
package/dist/cli.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/cli.ts","../../../node_modules/.bun/svg-builder@3.0.4/node_modules/svg-builder/src/content/index.ts","../../../node_modules/.bun/svg-builder@3.0.4/node_modules/svg-builder/src/attributes/index.ts","../../../node_modules/.bun/svg-builder@3.0.4/node_modules/svg-builder/src/elements/element.ts","../../../node_modules/.bun/svg-builder@3.0.4/node_modules/svg-builder/src/elements/definitions.ts","../../../node_modules/.bun/svg-builder@3.0.4/node_modules/svg-builder/src/elements/index.ts","../../../node_modules/.bun/svg-builder@3.0.4/node_modules/svg-builder/src/index.ts","../src/lib/utils.ts","../src/graph.ts","../src/lib/claude-code.ts","../src/lib/codex.ts","../src/lib/interfaces.ts","../src/lib/open-code.ts","../src/providers.ts"],"sourcesContent":["import { mkdirSync, writeFileSync } from \"node:fs\";\nimport { dirname, extname, resolve } from \"node:path\";\nimport { parseArgs } from \"node:util\";\nimport ora, { type Ora } from \"ora\";\nimport ow from \"ow\";\nimport sharp from \"sharp\";\nimport { heatmapThemes, renderUsageHeatmapsSvg, type ColorMode } from \"./graph\";\nimport type {\n JsonExportPayload,\n JsonUsageSummary,\n UsageSummary,\n} from \"./interfaces\";\nimport type { ProviderId } from \"./providers\";\nimport { formatLocalDate } from \"./lib/utils\";\nimport { aggregateUsage, providerIds, providerStatusLabel } from \"./providers\";\n\ntype OutputFormat = \"png\" | \"svg\" | \"json\";\ninterface CliArgValues {\n output?: string;\n format?: string;\n help: boolean;\n dark: boolean;\n claude: boolean;\n codex: boolean;\n opencode: boolean;\n}\n\nconst PNG_BASE_WIDTH = 1000;\nconst PNG_SCALE = 4;\nconst PNG_RENDER_WIDTH = PNG_BASE_WIDTH * PNG_SCALE;\nconst JSON_EXPORT_VERSION = \"2026-03-03\";\n\nconst HELP_TEXT = `slopmeter\n\nGenerate rolling 1-year usage heatmap image(s) (today is the latest day).\n\nUsage:\n slopmeter [--claude] [--codex] [--opencode] [--dark] [--format png|svg|json] [--output ./heatmap-last-year.png]\n\nOptions:\n --claude Render Claude Code graph\n --codex Render Codex graph\n --opencode Render Open Code graph\n --dark Render with the dark theme\n -f, --format Output format: png, svg, or json (default: png)\n -o, --output Output file path (default: ./heatmap-last-year.png)\n -h, --help Show this help\n`;\n\nfunction printHelp() {\n process.stdout.write(HELP_TEXT);\n}\n\nfunction validateArgs(values: unknown): asserts values is CliArgValues {\n ow(\n values,\n ow.object.exactShape({\n output: ow.optional.string.nonEmpty,\n format: ow.optional.string.nonEmpty,\n help: ow.boolean,\n dark: ow.boolean,\n claude: ow.boolean,\n codex: ow.boolean,\n opencode: ow.boolean,\n }),\n );\n}\n\nfunction inferFormat(\n formatArg: string | undefined,\n outputArg: string | undefined,\n) {\n if (formatArg) {\n ow(formatArg, ow.string.oneOf([\"png\", \"svg\", \"json\"] as const));\n\n return formatArg;\n }\n\n if (outputArg) {\n const outputExtension = extname(outputArg).toLowerCase();\n\n if (outputExtension === \".svg\") {\n return \"svg\" as const;\n }\n\n if (outputExtension === \".json\") {\n return \"json\" as const;\n }\n }\n\n return \"png\" as const;\n}\n\nasync function writeOutputImage(\n outputPath: string,\n format: Exclude<OutputFormat, \"json\">,\n svg: string,\n background: string,\n) {\n if (format === \"svg\") {\n writeFileSync(outputPath, svg, \"utf8\");\n\n return;\n }\n\n const pngBuffer = await sharp(Buffer.from(svg), { density: 192 })\n .resize({ width: PNG_RENDER_WIDTH })\n .flatten({ background })\n .png()\n .toBuffer();\n\n writeFileSync(outputPath, pngBuffer);\n}\n\nfunction writeOutputJson(outputPath: string, payload: JsonExportPayload) {\n writeFileSync(outputPath, `${JSON.stringify(payload, null, 2)}\\n`, \"utf8\");\n}\n\nfunction toJsonUsageSummary(summary: UsageSummary): JsonUsageSummary {\n return {\n provider: summary.provider,\n insights: summary.insights,\n daily: summary.daily.map((row) => ({\n date: formatLocalDate(row.date),\n input: row.input,\n output: row.output,\n cache: row.cache,\n total: row.total,\n breakdown: row.breakdown,\n })),\n };\n}\n\nfunction getDateWindow() {\n const start = new Date();\n start.setHours(0, 0, 0, 0);\n start.setFullYear(start.getFullYear() - 1);\n\n const end = new Date();\n end.setHours(23, 59, 59, 999);\n\n return { start, end };\n}\n\nfunction printProviderAvailability(\n rowsByProvider: Record<ProviderId, UsageSummary | null>,\n) {\n for (const provider of providerIds) {\n const found = rowsByProvider[provider] ? \"found\" : \"not found\";\n\n process.stdout.write(`${providerStatusLabel[provider]} ${found}\\n`);\n }\n}\n\nfunction getRequestedProviders(values: CliArgValues) {\n return providerIds.filter((id) => values[id]);\n}\n\nfunction selectProvidersToRender(\n rowsByProvider: Record<ProviderId, UsageSummary | null>,\n requested: ProviderId[],\n) {\n const providersToRender =\n requested.length > 0\n ? requested.filter((provider) => rowsByProvider[provider])\n : providerIds.filter((provider) => rowsByProvider[provider]);\n\n if (requested.length > 0 && providersToRender.length < requested.length) {\n const missing = requested.filter((provider) => !rowsByProvider[provider]);\n\n throw new Error(\n `Requested provider data not found: ${missing.map((provider) => providerStatusLabel[provider]).join(\", \")}`,\n );\n }\n\n if (providersToRender.length === 0) {\n throw new Error(\n \"No usage data found for Claude code, Codex, or Open code.\",\n );\n }\n\n return providersToRender.map((provider) => rowsByProvider[provider]!);\n}\n\nfunction printRunSummary(\n outputPath: string,\n format: OutputFormat,\n colorMode: ColorMode,\n startDate: Date,\n endDate: Date,\n rendered: ProviderId[],\n) {\n process.stdout.write(\n `${JSON.stringify(\n {\n output: outputPath,\n format,\n colorMode,\n startDate: formatLocalDate(startDate),\n endDate: formatLocalDate(endDate),\n rendered,\n },\n null,\n 2,\n )}\\n`,\n );\n}\n\nasync function main() {\n let spinner: Ora | undefined;\n\n const parsed = parseArgs({\n options: {\n output: { type: \"string\", short: \"o\" },\n format: { type: \"string\", short: \"f\" },\n help: { type: \"boolean\", short: \"h\", default: false },\n dark: { type: \"boolean\", default: false },\n claude: { type: \"boolean\", default: false },\n codex: { type: \"boolean\", default: false },\n opencode: { type: \"boolean\", default: false },\n },\n allowPositionals: false,\n });\n\n validateArgs(parsed.values);\n\n const { values } = parsed;\n\n if (values.help) {\n printHelp();\n\n return;\n }\n\n try {\n spinner = ora({\n text: \"Analyzing usage data...\",\n spinner: \"dots\",\n }).start();\n\n const { start, end } = getDateWindow();\n const colorMode: ColorMode = values.dark ? \"dark\" : \"light\";\n const format = inferFormat(values.format, values.output);\n const rowsByProvider = await aggregateUsage({ start, end });\n\n spinner.stop();\n printProviderAvailability(rowsByProvider);\n\n const exportProviders = selectProvidersToRender(\n rowsByProvider,\n getRequestedProviders(values),\n );\n\n const outputPath = resolve(\n values.output ?? `./heatmap-last-year.${format}`,\n );\n\n mkdirSync(dirname(outputPath), { recursive: true });\n\n if (format === \"json\") {\n spinner.start(\"Preparing JSON export...\");\n\n const payload: JsonExportPayload = {\n version: JSON_EXPORT_VERSION,\n start: formatLocalDate(start),\n end: formatLocalDate(end),\n providers: exportProviders.map((provider) =>\n toJsonUsageSummary(provider),\n ),\n };\n\n spinner.text = \"Writing output file...\";\n writeOutputJson(outputPath, payload);\n } else {\n spinner.start(\"Rendering heatmaps...\");\n\n const svg = renderUsageHeatmapsSvg({\n startDate: start,\n endDate: end,\n colorMode,\n sections: exportProviders.map(({ provider, daily, insights }) => ({\n daily,\n insights,\n title: heatmapThemes[provider].title,\n colors: heatmapThemes[provider].colors,\n })),\n });\n const background = colorMode === \"dark\" ? \"#171717\" : \"#ffffff\";\n\n spinner.text = \"Writing output file...\";\n await writeOutputImage(outputPath, format, svg, background);\n }\n\n spinner.succeed(\"Analysis complete\");\n\n printRunSummary(\n outputPath,\n format,\n colorMode,\n start,\n end,\n exportProviders.map(({ provider }) => provider),\n );\n } catch (error: unknown) {\n const message = error instanceof Error ? error.message : String(error);\n\n if (spinner) {\n spinner.fail(`Failed: ${message}`);\n } else {\n process.stderr.write(`${message}\\n`);\n }\n\n process.exitCode = 1;\n }\n}\n\nvoid main();\n",null,null,null,null,null,null,"import { readFile, readdir } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport type { DailyUsage, Insights, ModelUsage, UsageSummary } from \"../interfaces\";\n\nexport function formatLocalDate(date: Date) {\n const y = date.getFullYear();\n const m = String(date.getMonth() + 1).padStart(2, \"0\");\n const d = String(date.getDate()).padStart(2, \"0\");\n\n return `${y}-${m}-${d}`;\n}\n\nexport interface DailyTokenTotals {\n input: number;\n output: number;\n cache: { input: number; output: number };\n total: number;\n}\n\nexport interface ModelTokenTotals {\n input: number;\n output: number;\n cache: { input: number; output: number };\n total: number;\n}\n\ninterface TokenTotals {\n tokens: DailyTokenTotals;\n models: Map<string, ModelTokenTotals>;\n}\n\nexport type DailyTotalsByDate = Map<string, TokenTotals>;\n\nconst ONE_DAY_MS = 24 * 60 * 60 * 1000;\n\nfunction cloneTokenTotals(\n totals: DailyTokenTotals | ModelTokenTotals,\n): ModelTokenTotals {\n return {\n input: totals.input,\n output: totals.output,\n cache: { input: totals.cache.input, output: totals.cache.output },\n total: totals.total,\n };\n}\n\nfunction mergeTokenTotals(\n target: DailyTokenTotals | ModelTokenTotals,\n source: DailyTokenTotals | ModelTokenTotals,\n) {\n target.input += source.input;\n target.output += source.output;\n target.cache.input += source.cache.input;\n target.cache.output += source.cache.output;\n target.total += source.total;\n}\n\nexport function addModelTokenTotals(\n modelTotals: Map<string, ModelTokenTotals>,\n modelName: string,\n tokenTotals: DailyTokenTotals | ModelTokenTotals,\n) {\n const existing = modelTotals.get(modelName);\n\n if (!existing) {\n modelTotals.set(modelName, cloneTokenTotals(tokenTotals));\n\n return;\n }\n\n mergeTokenTotals(existing, tokenTotals);\n}\n\nexport function addDailyTokenTotals(\n totals: DailyTotalsByDate,\n date: Date,\n tokenTotals: DailyTokenTotals,\n modelName?: string,\n) {\n const key = formatLocalDate(date);\n const existing = totals.get(key);\n\n if (!existing) {\n const models = new Map<string, ModelTokenTotals>();\n\n if (modelName) {\n models.set(modelName, cloneTokenTotals(tokenTotals));\n }\n totals.set(key, { tokens: cloneTokenTotals(tokenTotals), models });\n\n return;\n }\n\n mergeTokenTotals(existing.tokens, tokenTotals);\n\n if (modelName) {\n addModelTokenTotals(existing.models, modelName, tokenTotals);\n }\n}\n\nexport function totalsToRows(totals: DailyTotalsByDate): DailyUsage[] {\n return [...totals.entries()]\n .sort(([a], [b]) => a.localeCompare(b))\n .map(([date, { tokens, models }]) => ({\n date: new Date(`${date}T00:00:00`),\n input: tokens.input,\n output: tokens.output,\n cache: { input: tokens.cache.input, output: tokens.cache.output },\n total: tokens.total,\n breakdown: [...models.entries()]\n .sort(([, a], [, b]) => b.total - a.total)\n .map(([name, t]) => ({\n name,\n tokens: {\n input: t.input,\n output: t.output,\n cache: { input: t.cache.input, output: t.cache.output },\n total: t.total,\n },\n })),\n }));\n}\n\nexport async function listFilesRecursive(rootDir: string, extension: string) {\n const files: string[] = [];\n const stack = [rootDir];\n\n while (stack.length > 0) {\n const currentDir = stack.pop()!;\n\n let entries;\n\n try {\n entries = await readdir(currentDir, {\n withFileTypes: true,\n encoding: \"utf8\",\n });\n } catch {\n continue;\n }\n\n for (const entry of entries) {\n const fullPath = join(currentDir, entry.name);\n\n if (entry.isDirectory()) {\n stack.push(fullPath);\n continue;\n }\n\n if (entry.isFile() && fullPath.endsWith(extension)) {\n files.push(fullPath);\n }\n }\n }\n\n return files;\n}\n\nexport async function readJsonLines<T>(filePath: string): Promise<T[]> {\n const content = await readFile(filePath, \"utf8\");\n\n return content\n .split(/\\r?\\n/)\n .filter((line) => line.trim() !== \"\")\n .map((line) => JSON.parse(line.trim()) as T);\n}\n\nexport function getRecentWindowStart(endDate: Date, days = 30) {\n const start = new Date(endDate);\n\n start.setDate(start.getDate() - (days - 1));\n start.setHours(0, 0, 0, 0);\n\n return start;\n}\n\nexport function normalizeModelName(modelName: string) {\n return modelName.replace(/-\\d{8}$/, \"\");\n}\n\nexport function getTopModel(\n modelTotals: Map<string, ModelTokenTotals>,\n): ModelUsage | undefined {\n let bestModel: string | undefined;\n let bestTotals: ModelTokenTotals | undefined;\n\n for (const [modelName, totals] of modelTotals) {\n if (!bestTotals || totals.total > bestTotals.total) {\n bestModel = modelName;\n bestTotals = totals;\n }\n }\n\n if (!bestTotals || bestTotals.total <= 0) {\n return undefined;\n }\n\n return {\n name: bestModel!,\n tokens: {\n input: bestTotals.input,\n output: bestTotals.output,\n cache: { input: bestTotals.cache.input, output: bestTotals.cache.output },\n total: bestTotals.total,\n },\n };\n}\n\nfunction startOfDay(date: Date) {\n const day = new Date(date);\n\n day.setHours(0, 0, 0, 0);\n\n return day;\n}\n\nfunction isConsecutiveDay(prevDate: Date, currDate: Date): boolean {\n const prev = startOfDay(prevDate);\n const curr = startOfDay(currDate);\n const diff = curr.getTime() - prev.getTime();\n\n return diff === ONE_DAY_MS;\n}\n\nexport function computeLongestStreak(daily: DailyUsage[]): number {\n if (daily.length === 0) {\n return 0;\n }\n\n let longest = 1;\n let running = 1;\n\n for (let i = 1; i < daily.length; i += 1) {\n if (isConsecutiveDay(daily[i - 1].date, daily[i].date)) {\n running += 1;\n if (running > longest) {\n longest = running;\n }\n } else {\n running = 1;\n }\n }\n\n return longest;\n}\n\nexport function computeCurrentStreak(daily: DailyUsage[], end: Date): number {\n if (daily.length === 0) {\n return 0;\n }\n\n const endDay = startOfDay(end);\n const lastEntry = daily[daily.length - 1];\n const lastEntryDay = startOfDay(lastEntry.date);\n\n // If the last active day isn't the end date, check if it's consecutive\n if (\n lastEntryDay.getTime() !== endDay.getTime() &&\n !isConsecutiveDay(lastEntryDay, endDay)\n ) {\n return 0;\n }\n\n let current = 1;\n\n for (let i = daily.length - 2; i >= 0; i -= 1) {\n if (!isConsecutiveDay(daily[i].date, daily[i + 1].date)) {\n break;\n }\n current += 1;\n }\n\n return current;\n}\n\nexport function getProviderInsights(\n modelTotals: Map<string, ModelTokenTotals>,\n recentModelTotals: Map<string, ModelTokenTotals>,\n daily: DailyUsage[],\n end: Date,\n): Insights {\n const mostUsedModel = getTopModel(modelTotals);\n const recentMostUsedModel = getTopModel(recentModelTotals);\n\n return {\n mostUsedModel,\n recentMostUsedModel,\n streaks: {\n longest: computeLongestStreak(daily),\n current: computeCurrentStreak(daily, end),\n },\n };\n}\n\nexport function createUsageSummary(\n provider: UsageSummary[\"provider\"],\n totals: DailyTotalsByDate,\n modelTotals: Map<string, ModelTokenTotals>,\n recentModelTotals: Map<string, ModelTokenTotals>,\n end: Date,\n): UsageSummary {\n const daily = totalsToRows(totals);\n\n return {\n provider,\n daily,\n insights: getProviderInsights(modelTotals, recentModelTotals, daily, end),\n };\n}\n\nexport function hasUsage(summary: UsageSummary) {\n return summary.daily.some((row) => row.total > 0);\n}\n","import svgBuilder, { type SVGBuilderInstance } from \"svg-builder\";\nimport type { DailyUsage, Insights, ModelUsage } from \"./interfaces\";\nimport type { ProviderId } from \"./lib/interfaces\";\nimport { formatLocalDate } from \"./lib/utils\";\n\ninterface HeatmapTheme {\n title: string;\n colors: {\n light: string[];\n dark: string[];\n };\n}\n\nexport type ColorMode = \"light\" | \"dark\";\n\ninterface CalendarGrid {\n weeks: (string | null)[][];\n monthLabels: (string | null)[];\n}\n\ninterface SectionLayout {\n width: number;\n height: number;\n gridTop: number;\n leftLabelWidth: number;\n cellSize: number;\n gap: number;\n headerCaptionY: number;\n headerValueY: number;\n titleY: number;\n monthLabelY: number;\n legendY: number;\n footerCaptionY: number;\n footerValueY: number;\n}\n\ninterface DrawHeatmapSectionOptions {\n x: number;\n y: number;\n grid: CalendarGrid;\n layout: SectionLayout;\n daily: DailyUsage[];\n insights?: Insights;\n title: string;\n colors: HeatmapTheme[\"colors\"];\n colorMode: ColorMode;\n palette: SurfacePalette;\n}\n\ninterface RenderUsageHeatmapsSvgSection {\n daily: DailyUsage[];\n insights?: Insights;\n title: string;\n colors: HeatmapTheme[\"colors\"];\n}\n\ninterface ModelUsageRow {\n caption: string;\n data: ModelUsage;\n}\n\ninterface RenderUsageHeatmapsSvgOptions {\n startDate: Date;\n endDate: Date;\n sections: RenderUsageHeatmapsSvgSection[];\n colorMode: ColorMode;\n}\n\ninterface SurfacePalette {\n background: string;\n text: string;\n muted: string;\n}\n\nexport const heatmapThemes: Record<ProviderId, HeatmapTheme> = {\n claude: {\n title: \"Claude Code\",\n colors: {\n light: [\n \"#fff7ed\", // orange-50\n \"#fed7aa\", // orange-200\n \"#fdba74\", // orange-300\n \"#f97316\", // orange-500\n \"#c2410c\", // orange-700\n ],\n dark: [\n \"#292524\", // stone-800\n \"#9a3412\", // orange-800\n \"#c2410c\", // orange-700\n \"#f97316\", // orange-500\n \"#fdba74\", // orange-300\n ],\n },\n },\n codex: {\n title: \"Codex\",\n colors: {\n light: [\n \"#e0e7ff\", // indigo-100\n \"#a5b4fc\", // indigo-300\n \"#818cf8\", // indigo-400\n \"#4f46e5\", // indigo-600\n \"#312e81\", // indigo-900\n ],\n dark: [\n \"#1e1b4b\", // indigo-950\n \"#312e81\", // indigo-900\n \"#4338ca\", // indigo-700\n \"#818cf8\", // indigo-400\n \"#c7d2fe\", // indigo-200\n ],\n },\n },\n opencode: {\n title: \"Open Code\",\n colors: {\n light: [\n \"#f5f5f5\", // neutral-100\n \"#d4d4d4\", // neutral-300\n \"#a3a3a3\", // neutral-400\n \"#525252\", // neutral-600\n \"#171717\", // neutral-900\n ],\n dark: [\n \"#262626\", // neutral-800\n \"#525252\", // neutral-600\n \"#737373\", // neutral-500\n \"#a3a3a3\", // neutral-400\n \"#fafafa\", // neutral-50\n ],\n },\n },\n};\n\nconst daysOfWeekMonday = [\"Mon\", \"Tue\", \"Wed\", \"Thu\", \"Fri\", \"Sat\", \"Sun\"];\nconst numberFormatter = new Intl.NumberFormat(\"en-US\");\nconst fontFamily =\n \"ui-sans-serif, system-ui, -apple-system, Segoe UI, Roboto, sans-serif\";\nconst providerTitleFontSize = 20;\nconst metricCaptionFontSize = 9;\nconst metricValueFontSize = 14;\nconst captionValueGap = 4;\n\nconst surfacePalettes: Record<ColorMode, SurfacePalette> = {\n light: {\n background: \"#ffffff\",\n text: \"#0f172a\",\n muted: \"#737373\",\n },\n dark: {\n background: \"#171717\",\n text: \"#fafafa\",\n muted: \"#a3a3a3\",\n },\n};\n\nfunction formatTokenTotal(value: number) {\n const units = [\n { size: 1_000_000_000_000, suffix: \"T\" },\n { size: 1_000_000_000, suffix: \"B\" },\n { size: 1_000_000, suffix: \"M\" },\n { size: 1_000, suffix: \"K\" },\n ];\n\n for (const unit of units) {\n if (value >= unit.size) {\n const scaled = value / unit.size;\n const precision = scaled >= 100 ? 0 : scaled >= 10 ? 1 : 2;\n const compact = scaled\n .toFixed(precision)\n .replace(/\\.0+$/, \"\")\n .replace(/(\\.\\d*[1-9])0+$/, \"$1\");\n\n return `${compact}${unit.suffix}`;\n }\n }\n\n return numberFormatter.format(value);\n}\n\nfunction truncateText(value: string, maxLength: number) {\n if (value.length <= maxLength) {\n return value;\n }\n\n return `${value.slice(0, Math.max(maxLength - 3, 1))}...`;\n}\n\nfunction escapeXml(value: string) {\n return value\n .replaceAll(\"&\", \"&\")\n .replaceAll(\"<\", \"<\")\n .replaceAll(\">\", \">\");\n}\n\nfunction caption(value: string) {\n return value.toUpperCase();\n}\n\nfunction getAllDays(start: Date, end: Date) {\n const days: string[] = [];\n const curr = new Date(start);\n\n while (curr <= end) {\n days.push(formatLocalDate(curr));\n curr.setDate(curr.getDate() + 1);\n }\n\n return days;\n}\n\nfunction getMondayBasedWeekday(dateIso: string) {\n const sundayBased = new Date(`${dateIso}T00:00:00`).getDay();\n\n return (sundayBased + 6) % 7;\n}\n\nfunction padToWeekStartMonday(days: string[]) {\n const firstDay = getMondayBasedWeekday(days[0]);\n const padding = new Array(firstDay).fill(null);\n\n return [...padding, ...days];\n}\n\nfunction chunkByWeek(days: (string | null)[]): (string | null)[][] {\n const weeks: (string | null)[][] = [];\n\n for (let i = 0; i < days.length; i += 7) {\n weeks.push(days.slice(i, i + 7));\n }\n\n return weeks;\n}\n\nfunction getMonthLabel(week: (string | null)[]) {\n const lastDay = [...week].reverse().find(Boolean);\n\n if (!lastDay) {\n return null;\n }\n\n return new Date(`${lastDay}T00:00:00`).toLocaleString(\"en-US\", {\n month: \"short\",\n });\n}\n\nfunction defaultColourMap(value: number, max: number, colorCount: number) {\n if (max <= 0 || value <= 0) {\n return 0;\n }\n\n const index = Math.ceil((value / max) * (colorCount - 1));\n\n return Math.min(Math.max(index, 0), colorCount - 1);\n}\n\nfunction getCalendarGrid(startDate: Date, endDate: Date) {\n const allDays = getAllDays(startDate, endDate);\n const paddedDays = padToWeekStartMonday(allDays);\n const weeks = chunkByWeek(paddedDays);\n\n const monthLabels = weeks.map((week, i) => {\n const label = getMonthLabel(week);\n const prevLabel = i > 0 ? getMonthLabel(weeks[i - 1]) : null;\n\n return label !== prevLabel ? label : null;\n });\n\n return { weeks, monthLabels };\n}\n\nfunction getSectionLayout(weekCount: number) {\n const cellSize = 11;\n const gap = 2;\n const leftLabelWidth = 34;\n const rightPadding = 20;\n const headerCaptionY = 0;\n const headerValueY =\n headerCaptionY + metricCaptionFontSize + captionValueGap;\n const topMetricHeight = headerValueY + metricValueFontSize;\n const topPadding = Math.max(providerTitleFontSize, topMetricHeight) + 20;\n const monthHeaderHeight = 20;\n const titleY = 0;\n const monthLabelY = topPadding + 4;\n const gridTop = topPadding + monthHeaderHeight;\n const gridHeight = 7 * cellSize + 6 * gap;\n const gridWidth = weekCount * cellSize + Math.max(weekCount - 1, 0) * gap;\n const legendY = gridTop + gridHeight + 28;\n const legendBottomY = legendY + cellSize;\n const footerTopPadding = 32;\n const footerCaptionY = legendBottomY + footerTopPadding;\n const footerValueY =\n footerCaptionY + metricCaptionFontSize + captionValueGap;\n const statsBottomPadding = 12;\n const width = leftLabelWidth + gridWidth + rightPadding;\n const height = footerValueY + metricValueFontSize + statsBottomPadding;\n\n return {\n width,\n height,\n gridTop,\n leftLabelWidth,\n cellSize,\n gap,\n headerCaptionY,\n headerValueY,\n titleY,\n monthLabelY,\n legendY,\n footerCaptionY,\n footerValueY,\n };\n}\n\nfunction drawHeatmapSection(\n svg: SVGBuilderInstance,\n {\n x,\n y,\n grid,\n layout,\n daily,\n insights,\n title,\n colors,\n colorMode,\n palette,\n }: DrawHeatmapSectionOptions,\n) {\n const colorsForMode = colors[colorMode];\n const valueByDate = new Map<string, number>();\n const rightEdge = x + layout.width - 8;\n const leftColumnX = x + 8;\n let maxValue = 0;\n let totalInputTokens = 0;\n let totalOutputTokens = 0;\n let totalTokens = 0;\n\n for (const row of daily) {\n valueByDate.set(formatLocalDate(row.date), row.total);\n maxValue = Math.max(maxValue, row.total);\n totalInputTokens += row.input;\n totalOutputTokens += row.output;\n totalTokens += row.total;\n }\n\n const topMetricGap = 120;\n const headerLast30DaysX = rightEdge - topMetricGap * 3;\n const headerInputX = rightEdge - topMetricGap * 2;\n const headerOutputX = rightEdge - topMetricGap;\n const totalTokensLabel = formatTokenTotal(totalTokens);\n const totalInputLabel = formatTokenTotal(totalInputTokens);\n const totalOutputLabel = formatTokenTotal(totalOutputTokens);\n const longestStreak = insights?.streaks.longest ?? 0;\n const currentStreak = insights?.streaks.current ?? 0;\n\n svg = svg.text(\n {\n x: leftColumnX,\n y: y + layout.titleY,\n fill: palette.text,\n \"font-size\": providerTitleFontSize,\n \"font-weight\": 600,\n \"dominant-baseline\": \"hanging\",\n \"font-family\": fontFamily,\n },\n title,\n );\n\n svg = svg.text(\n {\n x: headerInputX,\n y: y + layout.headerCaptionY,\n fill: palette.muted,\n \"font-size\": metricCaptionFontSize,\n \"font-weight\": 600,\n \"text-anchor\": \"end\",\n \"dominant-baseline\": \"hanging\",\n \"font-family\": fontFamily,\n },\n caption(\"Input tokens\"),\n );\n\n svg = svg.text(\n {\n x: headerInputX,\n y: y + layout.headerValueY,\n fill: palette.text,\n \"font-size\": metricValueFontSize,\n \"font-weight\": 600,\n \"text-anchor\": \"end\",\n \"dominant-baseline\": \"hanging\",\n \"font-family\": fontFamily,\n },\n totalInputLabel,\n );\n\n svg = svg.text(\n {\n x: headerOutputX,\n y: y + layout.headerCaptionY,\n fill: palette.muted,\n \"font-size\": metricCaptionFontSize,\n \"font-weight\": 600,\n \"text-anchor\": \"end\",\n \"dominant-baseline\": \"hanging\",\n \"font-family\": fontFamily,\n },\n caption(\"Output tokens\"),\n );\n\n svg = svg.text(\n {\n x: headerOutputX,\n y: y + layout.headerValueY,\n fill: palette.text,\n \"font-size\": metricValueFontSize,\n \"font-weight\": 600,\n \"text-anchor\": \"end\",\n \"dominant-baseline\": \"hanging\",\n \"font-family\": fontFamily,\n },\n totalOutputLabel,\n );\n\n svg = svg.text(\n {\n x: rightEdge,\n y: y + layout.headerCaptionY,\n fill: palette.muted,\n \"font-size\": metricCaptionFontSize,\n \"font-weight\": 600,\n \"text-anchor\": \"end\",\n \"dominant-baseline\": \"hanging\",\n \"font-family\": fontFamily,\n },\n caption(\"Total tokens\"),\n );\n\n svg = svg.text(\n {\n x: rightEdge,\n y: y + layout.headerValueY,\n fill: palette.text,\n \"font-size\": metricValueFontSize,\n \"font-weight\": 600,\n \"text-anchor\": \"end\",\n \"dominant-baseline\": \"hanging\",\n \"font-family\": fontFamily,\n },\n totalTokensLabel,\n );\n\n for (let i = 0; i < 7; i += 1) {\n const dayY =\n y +\n layout.gridTop +\n i * (layout.cellSize + layout.gap) +\n layout.cellSize / 2;\n\n const dayLabel = i === 0 || i === 6 ? daysOfWeekMonday[i] : \"\";\n\n svg = svg.text(\n {\n x: x + layout.leftLabelWidth - 6,\n y: dayY,\n fill: palette.muted,\n \"font-size\": 10,\n \"text-anchor\": \"end\",\n \"dominant-baseline\": \"middle\",\n \"font-family\": fontFamily,\n },\n dayLabel,\n );\n }\n\n for (let weekIndex = 0; weekIndex < grid.weeks.length; weekIndex += 1) {\n const monthLabel = grid.monthLabels[weekIndex];\n\n if (monthLabel) {\n const monthX =\n x + layout.leftLabelWidth + weekIndex * (layout.cellSize + layout.gap);\n\n svg = svg.text(\n {\n x: monthX,\n y: y + layout.monthLabelY,\n fill: palette.muted,\n \"font-size\": 10,\n \"font-family\": fontFamily,\n },\n monthLabel,\n );\n }\n\n const week = grid.weeks[weekIndex];\n\n for (let dayIndex = 0; dayIndex < week.length; dayIndex += 1) {\n const day = week[dayIndex];\n\n if (!day) {\n continue;\n }\n\n const value = valueByDate.get(day) ?? 0;\n const colorIndex = defaultColourMap(\n value,\n maxValue,\n colorsForMode.length,\n );\n const fill = colorsForMode[colorIndex];\n\n const dayX =\n x + layout.leftLabelWidth + weekIndex * (layout.cellSize + layout.gap);\n const dayY =\n y + layout.gridTop + dayIndex * (layout.cellSize + layout.gap);\n\n svg = svg.rect({\n x: dayX,\n y: dayY,\n width: layout.cellSize,\n height: layout.cellSize,\n rx: 3,\n ry: 3,\n fill,\n });\n }\n }\n\n const legendStartX = x + layout.leftLabelWidth;\n const legendY = y + layout.legendY;\n\n svg = svg.text(\n {\n x: legendStartX,\n y: legendY + 10,\n fill: palette.muted,\n \"font-size\": 10,\n \"font-weight\": 600,\n \"font-family\": fontFamily,\n },\n caption(\"Less\"),\n );\n\n for (let i = 0; i < colorsForMode.length; i += 1) {\n const legendX = legendStartX + 28 + i * (layout.cellSize + 3);\n\n svg = svg.rect({\n x: legendX,\n y: legendY,\n width: layout.cellSize,\n height: layout.cellSize,\n rx: 3,\n ry: 3,\n fill: colorsForMode[i],\n });\n }\n\n svg = svg.text(\n {\n x: legendStartX + 28 + colorsForMode.length * (layout.cellSize + 3) + 6,\n y: legendY + 10,\n fill: palette.muted,\n \"font-size\": 10,\n \"font-weight\": 600,\n \"font-family\": fontFamily,\n },\n caption(\"More\"),\n );\n\n const rightColumnX = rightEdge;\n const leftSecondaryX = leftColumnX + 250;\n const rightPrimaryX = rightColumnX - 160;\n\n const leftRows: ModelUsageRow[] = [];\n\n if (insights?.mostUsedModel) {\n leftRows.push({ caption: \"Most used model\", data: insights.mostUsedModel });\n }\n\n if (insights?.recentMostUsedModel) {\n leftRows.push({\n caption: \"Recent use (last 30 days)\",\n data: insights.recentMostUsedModel,\n });\n }\n\n for (const [index, row] of leftRows.entries()) {\n const captionY = layout.footerCaptionY;\n const valueY = layout.footerValueY;\n const modelName = truncateText(row.data.name, 20);\n const modelX = index === 0 ? leftColumnX : leftSecondaryX;\n const tokenLabel = `(${formatTokenTotal(row.data.tokens.total)})`;\n\n svg = svg.text(\n {\n x: modelX,\n y: y + captionY,\n fill: palette.muted,\n \"font-size\": metricCaptionFontSize,\n \"font-weight\": 600,\n \"dominant-baseline\": \"hanging\",\n \"font-family\": fontFamily,\n },\n caption(row.caption),\n );\n\n svg = svg.text(\n {\n x: modelX,\n y: y + valueY,\n \"dominant-baseline\": \"hanging\",\n \"font-family\": fontFamily,\n },\n `<tspan fill=\"${palette.text}\" font-size=\"${metricValueFontSize}\" font-weight=\"600\">${escapeXml(modelName)}</tspan><tspan dx=\"6\" fill=\"${palette.muted}\" font-size=\"${metricValueFontSize}\" font-weight=\"400\">${tokenLabel}</tspan>`,\n );\n }\n\n svg = svg.text(\n {\n x: rightPrimaryX,\n y: y + layout.footerCaptionY,\n fill: palette.muted,\n \"font-size\": metricCaptionFontSize,\n \"font-weight\": 600,\n \"text-anchor\": \"end\",\n \"dominant-baseline\": \"hanging\",\n \"font-family\": fontFamily,\n },\n caption(\"Longest streak\"),\n );\n\n svg = svg.text(\n {\n x: rightPrimaryX,\n y: y + layout.footerValueY,\n fill: palette.text,\n \"font-size\": metricValueFontSize,\n \"font-weight\": 600,\n \"text-anchor\": \"end\",\n \"dominant-baseline\": \"hanging\",\n \"font-family\": fontFamily,\n },\n `${numberFormatter.format(longestStreak)} days`,\n );\n\n svg = svg.text(\n {\n x: rightColumnX,\n y: y + layout.footerCaptionY,\n fill: palette.muted,\n \"font-size\": metricCaptionFontSize,\n \"font-weight\": 600,\n \"text-anchor\": \"end\",\n \"dominant-baseline\": \"hanging\",\n \"font-family\": fontFamily,\n },\n caption(\"Current streak\"),\n );\n\n svg = svg.text(\n {\n x: rightColumnX,\n y: y + layout.footerValueY,\n fill: palette.text,\n \"font-size\": metricValueFontSize,\n \"font-weight\": 600,\n \"text-anchor\": \"end\",\n \"dominant-baseline\": \"hanging\",\n \"font-family\": fontFamily,\n },\n `${numberFormatter.format(currentStreak)} days`,\n );\n\n return svg;\n}\n\nexport function renderUsageHeatmapsSvg({\n startDate,\n endDate,\n sections,\n colorMode,\n}: RenderUsageHeatmapsSvgOptions) {\n const grid = getCalendarGrid(startDate, endDate);\n const layout = getSectionLayout(grid.weeks.length);\n const palette = surfacePalettes[colorMode];\n const horizontalPadding = 18;\n const topPadding = 30;\n const bottomPadding = 18;\n const sectionGap = 40;\n\n const width = horizontalPadding * 2 + layout.width;\n const height =\n topPadding +\n bottomPadding +\n sections.length * layout.height +\n Math.max(sections.length - 1, 0) * sectionGap;\n\n let svg = svgBuilder\n .create()\n .width(width)\n .height(height)\n .viewBox(`0 0 ${width} ${height}`)\n .rect({\n x: -2,\n y: -2,\n width: width + 4,\n height: height + 4,\n fill: palette.background,\n });\n\n sections.forEach((section, index) => {\n const sectionY = topPadding + index * (layout.height + sectionGap);\n\n svg = drawHeatmapSection(svg, {\n x: horizontalPadding,\n y: sectionY,\n grid,\n layout,\n daily: section.daily,\n insights: section.insights,\n title: section.title,\n colors: section.colors,\n colorMode,\n palette,\n });\n });\n\n return svg.render();\n}\n","import { existsSync } from \"node:fs\";\nimport { homedir } from \"node:os\";\nimport { join, resolve } from \"node:path\";\nimport type { UsageSummary } from \"../interfaces\";\nimport {\n type DailyTotalsByDate,\n type DailyTokenTotals,\n type ModelTokenTotals,\n addDailyTokenTotals,\n addModelTokenTotals,\n createUsageSummary,\n getRecentWindowStart,\n listFilesRecursive,\n normalizeModelName,\n readJsonLines,\n} from \"./utils\";\n\nconst CLAUDE_CONFIG_DIR_ENV = \"CLAUDE_CONFIG_DIR\";\nconst CLAUDE_PROJECTS_DIR_NAME = \"projects\";\n\ninterface ClaudeUsagePayload {\n input_tokens?: number;\n output_tokens?: number;\n cache_creation_input_tokens?: number;\n cache_read_input_tokens?: number;\n}\n\ninterface ClaudeRawLogEntry {\n timestamp?: string;\n requestId?: string;\n message?: {\n usage?: ClaudeUsagePayload;\n model?: string;\n id?: string;\n };\n}\n\ninterface ClaudeLogEntry {\n timestamp: string;\n usage: ClaudeUsagePayload;\n model?: string;\n messageId?: string;\n requestId?: string;\n}\n\nfunction getClaudeConfigPaths() {\n const envPaths = (process.env[CLAUDE_CONFIG_DIR_ENV] ?? \"\").trim();\n\n if (envPaths !== \"\") {\n return envPaths\n .split(\",\")\n .map((path) => path.trim())\n .filter((path) => path !== \"\")\n .map((path) => resolve(path));\n }\n\n const xdgConfigHome =\n process.env.XDG_CONFIG_HOME?.trim() || join(homedir(), \".config\");\n\n return [join(xdgConfigHome, \"claude\"), join(homedir(), \".claude\")];\n}\n\nfunction getClaudeProjectDirs() {\n const unique = new Set<string>();\n const dirs: string[] = [];\n\n for (const basePath of getClaudeConfigPaths()) {\n const projectsDir = join(basePath, CLAUDE_PROJECTS_DIR_NAME);\n\n if (existsSync(projectsDir) && !unique.has(projectsDir)) {\n unique.add(projectsDir);\n dirs.push(projectsDir);\n }\n }\n\n return dirs;\n}\n\nfunction parseClaudeLogEntry(entry: ClaudeRawLogEntry): ClaudeLogEntry | null {\n if (!entry.timestamp || !entry.message?.usage) {\n return null;\n }\n\n return {\n timestamp: entry.timestamp,\n usage: entry.message.usage,\n model: entry.message.model,\n messageId: entry.message.id,\n requestId: entry.requestId,\n };\n}\n\nfunction createClaudeTokenTotals(usage: ClaudeUsagePayload): DailyTokenTotals {\n const cacheReadInput = usage.cache_read_input_tokens ?? 0;\n const cacheCreationInput = usage.cache_creation_input_tokens ?? 0;\n const input = (usage.input_tokens ?? 0) + cacheReadInput;\n const output = (usage.output_tokens ?? 0) + cacheCreationInput;\n\n return {\n input,\n output,\n cache: { input: cacheReadInput, output: cacheCreationInput },\n total: input + output,\n };\n}\n\nasync function parseClaudeFile(filePath: string) {\n const entries: ClaudeLogEntry[] = [];\n const lines = await readJsonLines<ClaudeRawLogEntry>(filePath);\n\n for (const line of lines) {\n const parsed = parseClaudeLogEntry(line);\n\n if (parsed) {\n entries.push(parsed);\n }\n }\n\n return entries;\n}\n\nasync function parseClaudeFiles() {\n const projectDirs = getClaudeProjectDirs();\n const files = (\n await Promise.all(\n projectDirs.map((projectDir) => listFilesRecursive(projectDir, \".jsonl\")),\n )\n ).flat();\n\n return Promise.all(files.map((file) => parseClaudeFile(file)));\n}\n\nfunction createUniqueHash(messageId?: string, requestId?: string) {\n if (!messageId || !requestId) {\n return null;\n }\n\n return `${messageId}:${requestId}`;\n}\n\nexport async function loadClaudeRows(\n startDate: Date,\n endDate: Date,\n): Promise<UsageSummary> {\n const sessions = await parseClaudeFiles();\n\n const totals: DailyTotalsByDate = new Map();\n const modelTotals = new Map<string, ModelTokenTotals>();\n const recentModelTotals = new Map<string, ModelTokenTotals>();\n const recentStart = getRecentWindowStart(endDate, 30);\n const processedHashes = new Set<string>();\n\n for (const session of sessions) {\n for (const entry of session) {\n const uniqueHash = createUniqueHash(entry.messageId, entry.requestId);\n\n if (uniqueHash && processedHashes.has(uniqueHash)) {\n continue;\n }\n\n if (uniqueHash) {\n processedHashes.add(uniqueHash);\n }\n\n const timestamp = new Date(entry.timestamp);\n\n if (timestamp < startDate || timestamp > endDate) {\n continue;\n }\n\n const tokenTotals = createClaudeTokenTotals(entry.usage);\n\n if (tokenTotals.total <= 0) {\n continue;\n }\n\n const modelName =\n entry.model && entry.model !== \"<synthetic>\"\n ? normalizeModelName(entry.model)\n : undefined;\n\n addDailyTokenTotals(totals, timestamp, tokenTotals, modelName);\n\n if (!modelName) {\n continue;\n }\n\n addModelTokenTotals(modelTotals, modelName, tokenTotals);\n\n if (timestamp >= recentStart) {\n addModelTokenTotals(recentModelTotals, modelName, tokenTotals);\n }\n }\n }\n\n return createUsageSummary(\n \"claude\",\n totals,\n modelTotals,\n recentModelTotals,\n endDate,\n );\n}\n","import { homedir } from \"node:os\";\nimport { join, resolve } from \"node:path\";\nimport type { UsageSummary } from \"../interfaces\";\nimport {\n type DailyTotalsByDate,\n type DailyTokenTotals,\n type ModelTokenTotals,\n addDailyTokenTotals,\n addModelTokenTotals,\n createUsageSummary,\n getRecentWindowStart,\n listFilesRecursive,\n normalizeModelName,\n readJsonLines,\n} from \"./utils\";\n\ninterface CodexRawUsage {\n input_tokens?: number;\n cached_input_tokens?: number;\n cache_read_input_tokens?: number;\n output_tokens?: number;\n reasoning_output_tokens?: number;\n total_tokens?: number;\n}\n\ninterface CodexEventInfo {\n model?: string;\n model_name?: string;\n metadata?: { model?: string };\n last_token_usage?: CodexRawUsage;\n total_token_usage?: CodexRawUsage;\n}\n\ninterface CodexEventPayload {\n type?: string;\n info?: CodexEventInfo;\n model?: string;\n model_name?: string;\n metadata?: { model?: string };\n}\n\ninterface CodexEventEntry {\n type?: string;\n timestamp: string;\n payload?: CodexEventPayload;\n}\n\ninterface CodexNormalizedUsage {\n input_tokens: number;\n cached_input_tokens: number;\n output_tokens: number;\n reasoning_output_tokens: number;\n total_tokens: number;\n}\n\nfunction normalizeCodexUsage(value?: CodexRawUsage) {\n if (!value) {\n return null;\n }\n\n const input = value.input_tokens ?? 0;\n const cached =\n value.cached_input_tokens ?? value.cache_read_input_tokens ?? 0;\n const output = value.output_tokens ?? 0;\n const reasoning = value.reasoning_output_tokens ?? 0;\n const total = value.total_tokens ?? 0;\n\n return {\n input_tokens: input,\n cached_input_tokens: cached,\n output_tokens: output,\n reasoning_output_tokens: reasoning,\n total_tokens: total > 0 ? total : input + output,\n };\n}\n\nfunction subtractCodexUsage(\n current: CodexNormalizedUsage,\n previous: CodexNormalizedUsage | null,\n) {\n return {\n input_tokens: Math.max(\n current.input_tokens - (previous?.input_tokens ?? 0),\n 0,\n ),\n cached_input_tokens: Math.max(\n current.cached_input_tokens - (previous?.cached_input_tokens ?? 0),\n 0,\n ),\n output_tokens: Math.max(\n current.output_tokens - (previous?.output_tokens ?? 0),\n 0,\n ),\n reasoning_output_tokens: Math.max(\n current.reasoning_output_tokens -\n (previous?.reasoning_output_tokens ?? 0),\n 0,\n ),\n total_tokens: Math.max(\n current.total_tokens - (previous?.total_tokens ?? 0),\n 0,\n ),\n };\n}\n\nfunction asNonEmptyString(value?: string) {\n const trimmed = value?.trim();\n\n return trimmed === \"\" ? undefined : trimmed;\n}\n\nfunction extractCodexModel(payload?: CodexEventPayload) {\n const directModel =\n asNonEmptyString(payload?.model) ?? asNonEmptyString(payload?.model_name);\n\n if (directModel) {\n return directModel;\n }\n\n if (payload?.info) {\n const infoModel =\n asNonEmptyString(payload.info.model) ??\n asNonEmptyString(payload.info.model_name);\n\n if (infoModel) {\n return infoModel;\n }\n\n if (payload.info.metadata) {\n const model = asNonEmptyString(payload.info.metadata.model);\n\n if (model) {\n return model;\n }\n }\n }\n\n if (payload?.metadata) {\n return asNonEmptyString(payload.metadata.model);\n }\n\n return undefined;\n}\n\nasync function parseCodexFile(filePath: string) {\n return readJsonLines<CodexEventEntry>(filePath);\n}\n\nasync function parseCodexFiles() {\n const codexHome = process.env.CODEX_HOME?.trim()\n ? resolve(process.env.CODEX_HOME)\n : join(homedir(), \".codex\");\n\n const sessionsDir = join(codexHome, \"sessions\");\n\n const files = await listFilesRecursive(sessionsDir, \".jsonl\");\n\n return Promise.all(files.map((file) => parseCodexFile(file)));\n}\n\nexport async function loadCodexRows(\n start: Date,\n end: Date,\n): Promise<UsageSummary> {\n const sessions = await parseCodexFiles();\n\n const totals: DailyTotalsByDate = new Map();\n const recentStart = getRecentWindowStart(end, 30);\n const modelTotals = new Map<string, ModelTokenTotals>();\n const recentModelTotals = new Map<string, ModelTokenTotals>();\n\n for (const session of sessions) {\n let previousTotals: CodexNormalizedUsage | null = null;\n let currentModel: string | undefined;\n\n for (const entry of session) {\n const extractedModel = extractCodexModel(entry.payload);\n\n if (entry.type === \"turn_context\") {\n currentModel = extractedModel ?? currentModel;\n continue;\n }\n\n if (entry.type !== \"event_msg\" || entry.payload?.type !== \"token_count\") {\n continue;\n }\n\n const info = entry.payload.info;\n const lastUsage = normalizeCodexUsage(info?.last_token_usage);\n const totalUsage = normalizeCodexUsage(info?.total_token_usage);\n let rawUsage = lastUsage;\n\n if (!rawUsage && totalUsage) {\n rawUsage = subtractCodexUsage(totalUsage, previousTotals);\n }\n\n if (totalUsage) {\n previousTotals = totalUsage;\n }\n\n if (!rawUsage) {\n continue;\n }\n\n const usage: DailyTokenTotals = {\n input: rawUsage.input_tokens,\n output: rawUsage.output_tokens,\n cache: { input: rawUsage.cached_input_tokens, output: 0 },\n total: rawUsage.total_tokens,\n };\n\n if (usage.total <= 0) {\n continue;\n }\n\n const date = new Date(entry.timestamp);\n\n if (date < start || date > end) {\n continue;\n }\n\n const modelName = extractedModel ?? currentModel;\n const normalizedModelName = modelName\n ? normalizeModelName(modelName)\n : undefined;\n\n addDailyTokenTotals(totals, date, usage, normalizedModelName);\n\n if (normalizedModelName) {\n addModelTokenTotals(modelTotals, normalizedModelName, usage);\n\n if (date >= recentStart) {\n addModelTokenTotals(recentModelTotals, normalizedModelName, usage);\n }\n }\n }\n }\n\n return createUsageSummary(\"codex\", totals, modelTotals, recentModelTotals, end);\n}\n","import type { UsageSummary } from \"../interfaces\";\n\nexport type ProviderId = UsageSummary[\"provider\"];\n\nexport const providerIds: ProviderId[] = [\"claude\", \"codex\", \"opencode\"];\n\nexport const providerStatusLabel: Record<ProviderId, string> = {\n claude: \"Claude code\",\n codex: \"Codex\",\n opencode: \"Open Code\",\n};\n","import { readFile } from \"node:fs/promises\";\nimport { homedir } from \"node:os\";\nimport { join, resolve } from \"node:path\";\nimport type { UsageSummary } from \"../interfaces\";\nimport {\n type DailyTotalsByDate,\n type DailyTokenTotals,\n type ModelTokenTotals,\n addDailyTokenTotals,\n addModelTokenTotals,\n createUsageSummary,\n getRecentWindowStart,\n listFilesRecursive,\n normalizeModelName,\n} from \"./utils\";\n\ninterface OpenCodeTokenCache {\n read?: number;\n write?: number;\n}\n\ninterface OpenCodeTokens {\n input?: number;\n output?: number;\n cache?: OpenCodeTokenCache;\n}\n\ninterface OpenCodeMessage {\n id: string;\n providerID: string;\n modelID: string;\n time: { created: number };\n tokens?: OpenCodeTokens;\n}\n\nfunction sumOpenCodeTokens(tokens?: OpenCodeTokens): DailyTokenTotals {\n const cacheInput = tokens?.cache?.read ?? 0;\n const cacheOutput = tokens?.cache?.write ?? 0;\n const input = (tokens?.input ?? 0) + cacheInput;\n const output = (tokens?.output ?? 0) + cacheOutput;\n\n return {\n input,\n output,\n cache: { input: cacheInput, output: cacheOutput },\n total: input + output,\n };\n}\n\nasync function parseOpenCodeFile(filePath: string) {\n const content = await readFile(filePath, \"utf8\");\n\n return JSON.parse(content) as OpenCodeMessage;\n}\n\nasync function parseOpenCodeFiles() {\n const baseDir = process.env.OPENCODE_DATA_DIR?.trim()\n ? resolve(process.env.OPENCODE_DATA_DIR)\n : join(homedir(), \".local\", \"share\", \"opencode\");\n\n const messagesDir = join(baseDir, \"storage\", \"message\");\n\n const files = await listFilesRecursive(messagesDir, \".json\");\n\n return Promise.all(files.map((file) => parseOpenCodeFile(file)));\n}\n\nexport async function loadOpenCodeRows(\n start: Date,\n end: Date,\n): Promise<UsageSummary> {\n const messages = await parseOpenCodeFiles();\n const totals: DailyTotalsByDate = new Map();\n const dedupe = new Set<string>();\n const recentStart = getRecentWindowStart(end, 30);\n const modelTotals = new Map<string, ModelTokenTotals>();\n const recentModelTotals = new Map<string, ModelTokenTotals>();\n\n for (const message of messages) {\n if (dedupe.has(message.id)) {\n continue;\n }\n\n dedupe.add(message.id);\n\n const tokenTotals = sumOpenCodeTokens(message.tokens);\n\n if (tokenTotals.total <= 0) {\n continue;\n }\n\n const date = new Date(message.time.created);\n\n if (date < start || date > end) {\n continue;\n }\n\n const modelName = normalizeModelName(message.modelID);\n\n addDailyTokenTotals(totals, date, tokenTotals, modelName);\n addModelTokenTotals(modelTotals, modelName, tokenTotals);\n\n if (date >= recentStart) {\n addModelTokenTotals(recentModelTotals, modelName, tokenTotals);\n }\n }\n\n return createUsageSummary(\n \"opencode\",\n totals,\n modelTotals,\n recentModelTotals,\n end,\n );\n}\n","import type { UsageSummary } from \"./interfaces\";\nimport { loadClaudeRows } from \"./lib/claude-code\";\nimport { loadCodexRows } from \"./lib/codex\";\nimport {\n providerIds,\n providerStatusLabel,\n type ProviderId,\n} from \"./lib/interfaces\";\nimport { loadOpenCodeRows } from \"./lib/open-code\";\nimport { hasUsage } from \"./lib/utils\";\n\nexport { providerIds, providerStatusLabel, type ProviderId };\n\ninterface AggregateUsageOptions {\n start: Date;\n end: Date;\n}\n\nexport async function aggregateUsage({\n start,\n end,\n}: AggregateUsageOptions): Promise<Record<ProviderId, UsageSummary | null>> {\n const [claude, codex, opencode] = await Promise.all([\n loadClaudeRows(start, end),\n loadCodexRows(start, end),\n loadOpenCodeRows(start, end),\n ]);\n\n return {\n claude: hasUsage(claude) ? claude : null,\n codex: hasUsage(codex) ? codex : null,\n opencode: hasUsage(opencode) ? opencode : null,\n };\n}\n"],"mappings":"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AC,MAAM,QAAQ,eAAe,GAAG;AACnC;IACF;AACA,oBAAgB,QAAQ,SAAU,SAAe;AAC/C,YAAM,OAAO,KAAK,eAAe,OAAO;AACxC,UAAI,KAAK,iBAAiB,QAAQ,IAAI,MAAM,IAAI;AAC9C,cAAM,IAAI,MAAM,KAAK,OAAO,qBAAqB,OAAO,YAAY;MACtE;IACF,EAAE,KAAK,IAAI,CAAC;EACd;EAEA,KAAM,OAAoC;AACxC,QAAI,UAAU,MAAM,KAAK,MACvB;AAEF,QAAK,OAAO;AACV,WAAK,QAAQ,OAAO;AAClB,cAAM,QAAQ,MAAM,IAAI;AACxB,YAAI,UAAU,QAAW;AACvB;QACF;AACA,mBAAW,MAAM,OAAO,OAAO,OAAO,KAAK,IAAI;MACjD;IACF;AACA,eAAW;AACX,SAAK,OAAO;EACd;;;;AC7KK,IAAM,gBAAgB;EAC3B;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AAKK,IAAM,kBAAkB;EAC7B;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AAKK,IAAM,4BAAoE;EAC/E,KAAK;IACD;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;;EAEJ,WAAW;IACP;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;;EAEJ,iBAAiB;IACb;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;;EAEJ,oBAAoB;IAChB;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;;EAEJ,UAAU;IACN;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;;EAEJ,YAAY;IACR;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;;EAEJ,QAAQ;IACJ;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;;EAEJ,QAAQ;IACJ;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;;EAEJ,WAAW;IACP;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;;EAEJ,WAAW;IACP;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;;EAEJ,iBAAiB;IACb;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;;EAEJ,uBAAuB;IACnB;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;;EAEJ,eAAe;IACX;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;;EAEJ,oBAAoB;IAChB;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;;EAEJ,qBAAqB;IACjB;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;;EAEJ,qBAAqB;IACjB;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;;EAEJ,kBAAkB;IACd;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;;EAEJ,gBAAgB;IACZ;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;;EAEJ,WAAW;IACP;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;;EAEJ,WAAW;IACP;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;;EAEJ,WAAW;IACP;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;;EAEJ,WAAW;IACP;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;;EAEJ,WAAW;IACP;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;;EAEJ,kBAAkB;IACd;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;;EAEJ,WAAW;IACP;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;;EAEJ,WAAW;IACP;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;;EAEJ,eAAe;IACX;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;;EAEJ,gBAAgB;IACZ;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;;EAEJ,YAAY;IACR;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;;EAEJ,gBAAgB;IACZ;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;;EAEJ,sBAAsB;IAClB;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;;EAEJ,eAAe;IACX;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;;EAEJ,UAAU;IACN;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;;EAEJ,gBAAgB;IACZ;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;;EAEJ,UAAU;IACN;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;;EAEJ,iBAAiB;IACb;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;;EAEJ,KAAK;IACD;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;;EAEJ,SAAS;IACL;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;;EAEJ,QAAQ;IACJ;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;;EAEJ,kBAAkB;IACd;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;;EAEJ,UAAU;IACN;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;;EAEJ,QAAQ;IACJ;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;;EAEJ,YAAY;IACR;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;;EAEJ,SAAS;IACL;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;;EAEJ,QAAQ;IACJ;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;;EAEJ,WAAW;IACP;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;;EAEJ,WAAW;IACP;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;;EAEJ,YAAY;IACR;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;;EAEJ,kBAAkB;IACd;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;;EAEJ,QAAQ;IACJ;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;;EAEJ,UAAU;IACN;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;;EAEJ,OAAO;IACH;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;;EAEJ,QAAQ;IACJ;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;;EAEJ,SAAS;IACL;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;;EAEJ,OAAO;IACH;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;;EAEJ,UAAU;IACN;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;;EAEJ,UAAU;IACN;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;;EAEJ,QAAQ;IACJ;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;;EAEJ,YAAY;IACR;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;;EAEJ,SAAS;IACL;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;;EAEJ,SAAS;IACL;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;;EAEJ,OAAO;IACH;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;;EAEJ,QAAQ;IACJ;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;I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","names":["resolve","registry","join","join","homedir","join","resolve","resolve","join","homedir","readFile","homedir","join","resolve","readFile","resolve","join","homedir","resolve"]}
|
|
1
|
+
{"version":3,"sources":["../src/cli.ts","../../../node_modules/.bun/svg-builder@3.0.4/node_modules/svg-builder/src/content/index.ts","../../../node_modules/.bun/svg-builder@3.0.4/node_modules/svg-builder/src/attributes/index.ts","../../../node_modules/.bun/svg-builder@3.0.4/node_modules/svg-builder/src/elements/element.ts","../../../node_modules/.bun/svg-builder@3.0.4/node_modules/svg-builder/src/elements/definitions.ts","../../../node_modules/.bun/svg-builder@3.0.4/node_modules/svg-builder/src/elements/index.ts","../../../node_modules/.bun/svg-builder@3.0.4/node_modules/svg-builder/src/index.ts","../src/lib/utils.ts","../src/graph.ts","../src/lib/claude-code.ts","../src/lib/codex.ts","../src/lib/interfaces.ts","../src/lib/open-code.ts","../src/providers.ts"],"sourcesContent":["import { mkdirSync, writeFileSync } from \"node:fs\";\nimport { dirname, extname, resolve } from \"node:path\";\nimport { parseArgs } from \"node:util\";\nimport ora, { type Ora } from \"ora\";\nimport ow from \"ow\";\nimport sharp from \"sharp\";\nimport { heatmapThemes, renderUsageHeatmapsSvg, type ColorMode } from \"./graph\";\nimport type {\n JsonExportPayload,\n JsonUsageSummary,\n UsageSummary,\n} from \"./interfaces\";\nimport type { ProviderId } from \"./providers\";\nimport { formatLocalDate } from \"./lib/utils\";\nimport { aggregateUsage, providerIds, providerStatusLabel } from \"./providers\";\n\ntype OutputFormat = \"png\" | \"svg\" | \"json\";\ninterface CliArgValues {\n output?: string;\n format?: string;\n help: boolean;\n dark: boolean;\n claude: boolean;\n codex: boolean;\n opencode: boolean;\n}\n\nconst PNG_BASE_WIDTH = 1000;\nconst PNG_SCALE = 4;\nconst PNG_RENDER_WIDTH = PNG_BASE_WIDTH * PNG_SCALE;\nconst JSON_EXPORT_VERSION = \"2026-03-03\";\n\nconst HELP_TEXT = `slopmeter\n\nGenerate rolling 1-year usage heatmap image(s) (today is the latest day).\n\nUsage:\n slopmeter [--claude] [--codex] [--opencode] [--dark] [--format png|svg|json] [--output ./heatmap-last-year.png]\n\nOptions:\n --claude Render Claude Code graph\n --codex Render Codex graph\n --opencode Render Open Code graph\n --dark Render with the dark theme\n -f, --format Output format: png, svg, or json (default: png)\n -o, --output Output file path (default: ./heatmap-last-year.png)\n -h, --help Show this help\n`;\n\nfunction printHelp() {\n process.stdout.write(HELP_TEXT);\n}\n\nfunction validateArgs(values: unknown): asserts values is CliArgValues {\n ow(\n values,\n ow.object.exactShape({\n output: ow.optional.string.nonEmpty,\n format: ow.optional.string.nonEmpty,\n help: ow.boolean,\n dark: ow.boolean,\n claude: ow.boolean,\n codex: ow.boolean,\n opencode: ow.boolean,\n }),\n );\n}\n\nfunction inferFormat(\n formatArg: string | undefined,\n outputArg: string | undefined,\n) {\n if (formatArg) {\n ow(formatArg, ow.string.oneOf([\"png\", \"svg\", \"json\"] as const));\n\n return formatArg;\n }\n\n if (outputArg) {\n const outputExtension = extname(outputArg).toLowerCase();\n\n if (outputExtension === \".svg\") {\n return \"svg\" as const;\n }\n\n if (outputExtension === \".json\") {\n return \"json\" as const;\n }\n }\n\n return \"png\" as const;\n}\n\nasync function writeOutputImage(\n outputPath: string,\n format: Exclude<OutputFormat, \"json\">,\n svg: string,\n background: string,\n) {\n if (format === \"svg\") {\n writeFileSync(outputPath, svg, \"utf8\");\n\n return;\n }\n\n const pngBuffer = await sharp(Buffer.from(svg), { density: 192 })\n .resize({ width: PNG_RENDER_WIDTH })\n .flatten({ background })\n .png()\n .toBuffer();\n\n writeFileSync(outputPath, pngBuffer);\n}\n\nfunction writeOutputJson(outputPath: string, payload: JsonExportPayload) {\n writeFileSync(outputPath, `${JSON.stringify(payload, null, 2)}\\n`, \"utf8\");\n}\n\nfunction toJsonUsageSummary(summary: UsageSummary): JsonUsageSummary {\n return {\n provider: summary.provider,\n insights: summary.insights,\n daily: summary.daily.map((row) => ({\n date: formatLocalDate(row.date),\n input: row.input,\n output: row.output,\n cache: row.cache,\n total: row.total,\n displayValue: row.displayValue,\n breakdown: row.breakdown,\n })),\n };\n}\n\nfunction getDateWindow() {\n const start = new Date();\n\n start.setHours(0, 0, 0, 0);\n start.setFullYear(start.getFullYear() - 1);\n\n const end = new Date();\n\n end.setHours(23, 59, 59, 999);\n\n return { start, end };\n}\n\nfunction printProviderAvailability(\n rowsByProvider: Record<ProviderId, UsageSummary | null>,\n providers: ProviderId[],\n) {\n for (const provider of providers) {\n const found = rowsByProvider[provider] ? \"found\" : \"not found\";\n\n process.stdout.write(`${providerStatusLabel[provider]} ${found}\\n`);\n }\n}\n\nfunction getRequestedProviders(values: CliArgValues) {\n return providerIds.filter((id) => values[id]);\n}\n\nfunction selectProvidersToRender(\n rowsByProvider: Record<ProviderId, UsageSummary | null>,\n requested: ProviderId[],\n) {\n const providersToRender =\n requested.length > 0\n ? requested.filter((provider) => rowsByProvider[provider])\n : providerIds.filter((provider) => rowsByProvider[provider]);\n\n if (requested.length > 0 && providersToRender.length < requested.length) {\n const missing = requested.filter((provider) => !rowsByProvider[provider]);\n\n throw new Error(\n `Requested provider data not found: ${missing.map((provider) => providerStatusLabel[provider]).join(\", \")}`,\n );\n }\n\n if (providersToRender.length === 0) {\n throw new Error(\n \"No usage data found for Claude code, Codex, or Open code.\",\n );\n }\n\n return providersToRender.map((provider) => rowsByProvider[provider]!);\n}\n\nfunction printRunSummary(\n outputPath: string,\n format: OutputFormat,\n colorMode: ColorMode,\n startDate: Date,\n endDate: Date,\n rendered: ProviderId[],\n) {\n process.stdout.write(\n `${JSON.stringify(\n {\n output: outputPath,\n format,\n colorMode,\n startDate: formatLocalDate(startDate),\n endDate: formatLocalDate(endDate),\n rendered,\n },\n null,\n 2,\n )}\\n`,\n );\n}\n\nasync function main() {\n let spinner: Ora | undefined;\n\n const parsed = parseArgs({\n options: {\n output: { type: \"string\", short: \"o\" },\n format: { type: \"string\", short: \"f\" },\n help: { type: \"boolean\", short: \"h\", default: false },\n dark: { type: \"boolean\", default: false },\n claude: { type: \"boolean\", default: false },\n codex: { type: \"boolean\", default: false },\n opencode: { type: \"boolean\", default: false },\n },\n allowPositionals: false,\n });\n\n validateArgs(parsed.values);\n\n const { values } = parsed;\n\n if (values.help) {\n printHelp();\n\n return;\n }\n\n try {\n spinner = ora({\n text: \"Analyzing usage data...\",\n spinner: \"dots\",\n }).start();\n\n const { start, end } = getDateWindow();\n const colorMode: ColorMode = values.dark ? \"dark\" : \"light\";\n const format = inferFormat(values.format, values.output);\n const requestedProviders = getRequestedProviders(values);\n const inspectedProviders =\n requestedProviders.length > 0 ? requestedProviders : providerIds;\n const { rowsByProvider, warnings } = await aggregateUsage({\n start,\n end,\n requestedProviders,\n });\n\n spinner.stop();\n\n for (const warning of warnings) {\n process.stderr.write(`${warning}\\n`);\n }\n\n printProviderAvailability(rowsByProvider, inspectedProviders);\n\n const exportProviders = selectProvidersToRender(\n rowsByProvider,\n requestedProviders,\n );\n\n const outputPath = resolve(\n values.output ?? `./heatmap-last-year.${format}`,\n );\n\n mkdirSync(dirname(outputPath), { recursive: true });\n\n if (format === \"json\") {\n spinner.start(\"Preparing JSON export...\");\n\n const payload: JsonExportPayload = {\n version: JSON_EXPORT_VERSION,\n start: formatLocalDate(start),\n end: formatLocalDate(end),\n providers: exportProviders.map((provider) =>\n toJsonUsageSummary(provider),\n ),\n };\n\n spinner.text = \"Writing output file...\";\n writeOutputJson(outputPath, payload);\n } else {\n spinner.start(\"Rendering heatmaps...\");\n\n const svg = renderUsageHeatmapsSvg({\n startDate: start,\n endDate: end,\n colorMode,\n sections: exportProviders.map(({ provider, daily, insights }) => ({\n daily,\n insights,\n title: heatmapThemes[provider].title,\n colors: heatmapThemes[provider].colors,\n })),\n });\n const background = colorMode === \"dark\" ? \"#171717\" : \"#ffffff\";\n\n spinner.text = \"Writing output file...\";\n await writeOutputImage(outputPath, format, svg, background);\n }\n\n spinner.succeed(\"Analysis complete\");\n\n printRunSummary(\n outputPath,\n format,\n colorMode,\n start,\n end,\n exportProviders.map(({ provider }) => provider),\n );\n } catch (error: unknown) {\n const message = error instanceof Error ? error.message : String(error);\n\n if (spinner) {\n spinner.fail(`Failed: ${message}`);\n } else {\n process.stderr.write(`${message}\\n`);\n }\n\n process.exitCode = 1;\n }\n}\n\nvoid main();\n",null,null,null,null,null,null,"import { createReadStream } from \"node:fs\";\nimport { readdir } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport type { DailyUsage, Insights, ModelUsage, UsageSummary } from \"../interfaces\";\n\nexport function formatLocalDate(date: Date) {\n const y = date.getFullYear();\n const m = String(date.getMonth() + 1).padStart(2, \"0\");\n const d = String(date.getDate()).padStart(2, \"0\");\n\n return `${y}-${m}-${d}`;\n}\n\nexport interface DailyTokenTotals {\n input: number;\n output: number;\n cache: { input: number; output: number };\n total: number;\n}\n\nexport interface ModelTokenTotals {\n input: number;\n output: number;\n cache: { input: number; output: number };\n total: number;\n}\n\ninterface TokenTotals {\n tokens: DailyTokenTotals;\n models: Map<string, ModelTokenTotals>;\n}\n\nexport type DailyTotalsByDate = Map<string, TokenTotals>;\n\nconst ONE_DAY_MS = 24 * 60 * 60 * 1000;\n\nexport const DEFAULT_FILE_PROCESS_CONCURRENCY = 4;\nexport const FILE_PROCESS_CONCURRENCY_ENV =\n \"SLOPMETER_FILE_PROCESS_CONCURRENCY\";\nexport const MAX_JSONL_RECORD_BYTES_ENV = \"SLOPMETER_MAX_JSONL_RECORD_BYTES\";\nexport const DEFAULT_MAX_JSONL_RECORD_BYTES = 64 * 1024 * 1024;\n\nexport interface JsonlRecord<TClassification = void> {\n lineNumber: number;\n rawLine: string;\n byteLength: number;\n classification: TClassification;\n}\n\nexport type JsonlRecordDecision<TClassification> =\n | { kind: \"keep\"; classification: TClassification }\n | { kind: \"skip\" }\n | { kind: \"unknown\" };\n\ninterface ReadJsonlRecordsOptions<TClassification> {\n classificationPrefixBytes?: number;\n classify?: (prefix: string) => JsonlRecordDecision<TClassification>;\n maxRecordBytes?: number;\n onSkippedOversizedRecord?: (record: {\n lineNumber: number;\n byteLength: number;\n }) => void;\n oversizedErrorMessage?: (record: {\n filePath: string;\n lineNumber: number;\n maxRecordBytes: number;\n envVarName: string;\n }) => string;\n}\n\ninterface ReadJsonDocumentOptions {\n maxBytes?: number;\n oversizedErrorMessage?: (record: {\n filePath: string;\n maxBytes: number;\n envVarName: string;\n }) => string;\n}\n\ninterface ParseJsonTextOptions {\n maxBytes?: number;\n oversizedErrorMessage?: (record: {\n sourceLabel: string;\n maxBytes: number;\n envVarName: string;\n }) => string;\n}\n\nfunction cloneTokenTotals(\n totals: DailyTokenTotals | ModelTokenTotals,\n): ModelTokenTotals {\n return {\n input: totals.input,\n output: totals.output,\n cache: { input: totals.cache.input, output: totals.cache.output },\n total: totals.total,\n };\n}\n\nfunction mergeTokenTotals(\n target: DailyTokenTotals | ModelTokenTotals,\n source: DailyTokenTotals | ModelTokenTotals,\n) {\n target.input += source.input;\n target.output += source.output;\n target.cache.input += source.cache.input;\n target.cache.output += source.cache.output;\n target.total += source.total;\n}\n\nexport function addModelTokenTotals(\n modelTotals: Map<string, ModelTokenTotals>,\n modelName: string,\n tokenTotals: DailyTokenTotals | ModelTokenTotals,\n) {\n const existing = modelTotals.get(modelName);\n\n if (!existing) {\n modelTotals.set(modelName, cloneTokenTotals(tokenTotals));\n\n return;\n }\n\n mergeTokenTotals(existing, tokenTotals);\n}\n\nexport function addDailyTokenTotals(\n totals: DailyTotalsByDate,\n date: Date,\n tokenTotals: DailyTokenTotals,\n modelName?: string,\n) {\n const key = formatLocalDate(date);\n const existing = totals.get(key);\n\n if (!existing) {\n const models = new Map<string, ModelTokenTotals>();\n\n if (modelName) {\n models.set(modelName, cloneTokenTotals(tokenTotals));\n }\n totals.set(key, { tokens: cloneTokenTotals(tokenTotals), models });\n\n return;\n }\n\n mergeTokenTotals(existing.tokens, tokenTotals);\n\n if (modelName) {\n addModelTokenTotals(existing.models, modelName, tokenTotals);\n }\n}\n\nexport function mergeDailyTotalsByDate(\n target: DailyTotalsByDate,\n source: DailyTotalsByDate,\n) {\n for (const [dateKey, sourceTotals] of source.entries()) {\n const existing = target.get(dateKey);\n\n if (!existing) {\n const models = new Map<string, ModelTokenTotals>();\n\n for (const [modelName, totals] of sourceTotals.models.entries()) {\n models.set(modelName, cloneTokenTotals(totals));\n }\n\n target.set(dateKey, {\n tokens: cloneTokenTotals(sourceTotals.tokens),\n models,\n });\n continue;\n }\n\n mergeTokenTotals(existing.tokens, sourceTotals.tokens);\n\n for (const [modelName, totals] of sourceTotals.models.entries()) {\n addModelTokenTotals(existing.models, modelName, totals);\n }\n }\n}\n\nexport function mergeModelTotals(\n target: Map<string, ModelTokenTotals>,\n source: Map<string, ModelTokenTotals>,\n) {\n for (const [modelName, totals] of source.entries()) {\n addModelTokenTotals(target, modelName, totals);\n }\n}\n\nexport function totalsToRows(\n totals: DailyTotalsByDate,\n displayValuesByDate = new Map<string, number>(),\n): DailyUsage[] {\n const allDates = new Set<string>([\n ...totals.keys(),\n ...displayValuesByDate.keys(),\n ]);\n\n return [...allDates]\n .sort((a, b) => a.localeCompare(b))\n .map((date) => {\n const entry = totals.get(date);\n const tokens = entry?.tokens ?? {\n input: 0,\n output: 0,\n cache: { input: 0, output: 0 },\n total: 0,\n };\n const models = entry?.models ?? new Map<string, ModelTokenTotals>();\n const displayValue =\n tokens.total > 0 ? tokens.total : (displayValuesByDate.get(date) ?? 0);\n\n return {\n date: new Date(`${date}T00:00:00`),\n input: tokens.input,\n output: tokens.output,\n cache: { input: tokens.cache.input, output: tokens.cache.output },\n total: tokens.total,\n displayValue: displayValue > 0 ? displayValue : undefined,\n breakdown: [...models.entries()]\n .sort(([, a], [, b]) => b.total - a.total)\n .map(([name, t]) => ({\n name,\n tokens: {\n input: t.input,\n output: t.output,\n cache: { input: t.cache.input, output: t.cache.output },\n total: t.total,\n },\n })),\n };\n });\n}\n\nexport async function listFilesRecursive(rootDir: string, extension: string) {\n const files: string[] = [];\n const stack = [rootDir];\n\n while (stack.length > 0) {\n const currentDir = stack.pop()!;\n\n let entries;\n\n try {\n entries = await readdir(currentDir, {\n withFileTypes: true,\n encoding: \"utf8\",\n });\n } catch {\n continue;\n }\n\n for (const entry of entries) {\n const fullPath = join(currentDir, entry.name);\n\n if (entry.isDirectory()) {\n stack.push(fullPath);\n continue;\n }\n\n if (entry.isFile() && fullPath.endsWith(extension)) {\n files.push(fullPath);\n }\n }\n }\n\n return files.sort((left, right) => left.localeCompare(right));\n}\n\nfunction defaultOversizedJsonlRecordMessage({\n filePath,\n lineNumber,\n maxRecordBytes,\n envVarName,\n}: {\n filePath: string;\n lineNumber: number;\n maxRecordBytes: number;\n envVarName: string;\n}) {\n return `JSONL record exceeds ${maxRecordBytes} bytes in ${filePath}:${lineNumber}. Increase ${envVarName} to process this file.`;\n}\n\nfunction defaultOversizedJsonDocumentMessage({\n filePath,\n maxBytes,\n envVarName,\n}: {\n filePath: string;\n maxBytes: number;\n envVarName: string;\n}) {\n return `JSON document exceeds ${maxBytes} bytes in ${filePath}. Increase ${envVarName} to process this file.`;\n}\n\nfunction defaultOversizedJsonTextMessage({\n sourceLabel,\n maxBytes,\n envVarName,\n}: {\n sourceLabel: string;\n maxBytes: number;\n envVarName: string;\n}) {\n return `JSON payload exceeds ${maxBytes} bytes in ${sourceLabel}. Increase ${envVarName} to process this payload.`;\n}\n\nfunction keepAllJsonlRecords<TClassification>(): JsonlRecordDecision<TClassification> {\n return { kind: \"keep\", classification: undefined as TClassification };\n}\n\nexport async function* readJsonlRecords<TClassification = void>(\n filePath: string,\n options: ReadJsonlRecordsOptions<TClassification> = {},\n): AsyncGenerator<JsonlRecord<TClassification>> {\n const maxRecordBytes =\n options.maxRecordBytes ??\n getPositiveIntegerEnv(\n MAX_JSONL_RECORD_BYTES_ENV,\n DEFAULT_MAX_JSONL_RECORD_BYTES,\n );\n const classificationPrefixBytes =\n options.classificationPrefixBytes ?? maxRecordBytes;\n const classify = options.classify ?? keepAllJsonlRecords<TClassification>;\n const oversizedErrorMessage =\n options.oversizedErrorMessage ?? defaultOversizedJsonlRecordMessage;\n const stream = createReadStream(filePath);\n let lineNumber = 0;\n let lineBytesSeen = 0;\n let retainedBytes = 0;\n let prefixBytes = 0;\n let exceededLimit = false;\n let decision: JsonlRecordDecision<TClassification> = { kind: \"unknown\" };\n let prefixChunks: Buffer[] = [];\n let retainedChunks: Buffer[] = [];\n\n const resetRecord = () => {\n lineBytesSeen = 0;\n retainedBytes = 0;\n prefixBytes = 0;\n exceededLimit = false;\n decision = { kind: \"unknown\" };\n prefixChunks = [];\n retainedChunks = [];\n };\n\n const maybeClassify = () => {\n if (decision.kind !== \"unknown\" || prefixBytes === 0) {\n return;\n }\n\n decision = classify(Buffer.concat(prefixChunks, prefixBytes).toString(\"utf8\"));\n\n if (decision.kind === \"skip\") {\n retainedChunks = [];\n retainedBytes = 0;\n }\n };\n\n const appendSegment = (segment: Buffer) => {\n if (segment.length === 0) {\n return;\n }\n\n lineBytesSeen += segment.length;\n\n if (prefixBytes < classificationPrefixBytes) {\n const prefixSegment = segment.subarray(\n 0,\n Math.min(segment.length, classificationPrefixBytes - prefixBytes),\n );\n\n prefixChunks.push(prefixSegment);\n prefixBytes += prefixSegment.length;\n maybeClassify();\n }\n\n if (decision.kind === \"skip\") {\n return;\n }\n\n const remainingBytes = maxRecordBytes - retainedBytes;\n\n if (remainingBytes > 0) {\n const retainedSegment = segment.subarray(\n 0,\n Math.min(segment.length, remainingBytes),\n );\n\n if (retainedSegment.length > 0) {\n retainedChunks.push(retainedSegment);\n retainedBytes += retainedSegment.length;\n }\n }\n\n if (segment.length > remainingBytes) {\n exceededLimit = true;\n }\n };\n\n const resolveDecision = () => {\n if (decision.kind !== \"unknown\") {\n return decision;\n }\n\n const candidate =\n exceededLimit || retainedBytes === 0\n ? Buffer.concat(prefixChunks, prefixBytes).toString(\"utf8\")\n : Buffer.concat(retainedChunks, retainedBytes).toString(\"utf8\");\n\n return classify(candidate);\n };\n\n const finalizeRecord = () => {\n lineNumber += 1;\n\n if (lineBytesSeen === 0 && !exceededLimit) {\n resetRecord();\n\n return null;\n }\n\n const resolvedDecision = resolveDecision();\n\n if (resolvedDecision.kind === \"skip\") {\n if (lineBytesSeen > maxRecordBytes) {\n options.onSkippedOversizedRecord?.({\n lineNumber,\n byteLength: lineBytesSeen,\n });\n }\n\n resetRecord();\n\n return null;\n }\n\n if (resolvedDecision.kind === \"unknown\") {\n resetRecord();\n\n return null;\n }\n\n if (lineBytesSeen > maxRecordBytes || exceededLimit) {\n throw new Error(\n oversizedErrorMessage({\n filePath,\n lineNumber,\n maxRecordBytes,\n envVarName: MAX_JSONL_RECORD_BYTES_ENV,\n }),\n );\n }\n\n const rawLine = Buffer.concat(retainedChunks, retainedBytes)\n .toString(\"utf8\")\n .trim();\n\n if (rawLine === \"\") {\n resetRecord();\n\n return null;\n }\n\n const record: JsonlRecord<TClassification> = {\n lineNumber,\n rawLine,\n byteLength: lineBytesSeen,\n classification: resolvedDecision.classification,\n };\n\n resetRecord();\n\n return record;\n };\n\n for await (const chunk of stream) {\n let start = 0;\n\n for (let index = 0; index < chunk.length; index += 1) {\n if (chunk[index] !== 0x0a) {\n continue;\n }\n\n appendSegment(chunk.subarray(start, index));\n const record = finalizeRecord();\n\n if (record) {\n yield record;\n }\n\n start = index + 1;\n }\n\n appendSegment(chunk.subarray(start));\n }\n\n if (lineBytesSeen > 0) {\n const record = finalizeRecord();\n\n if (record) {\n yield record;\n }\n }\n}\n\nexport async function* readJsonLines<T>(filePath: string): AsyncGenerator<T> {\n for await (const record of readJsonlRecords(filePath)) {\n try {\n yield JSON.parse(record.rawLine) as T;\n } catch {\n // Preserve existing behavior for malformed JSONL records.\n }\n }\n}\n\nexport async function readJsonDocument<T>(\n filePath: string,\n options: ReadJsonDocumentOptions = {},\n) {\n const maxBytes =\n options.maxBytes ??\n getPositiveIntegerEnv(\n MAX_JSONL_RECORD_BYTES_ENV,\n DEFAULT_MAX_JSONL_RECORD_BYTES,\n );\n const oversizedErrorMessage =\n options.oversizedErrorMessage ?? defaultOversizedJsonDocumentMessage;\n const stream = createReadStream(filePath);\n const chunks: Buffer[] = [];\n let totalBytes = 0;\n\n for await (const chunk of stream) {\n totalBytes += chunk.length;\n\n if (totalBytes > maxBytes) {\n stream.destroy();\n\n throw new Error(\n oversizedErrorMessage({\n filePath,\n maxBytes,\n envVarName: MAX_JSONL_RECORD_BYTES_ENV,\n }),\n );\n }\n\n chunks.push(chunk);\n }\n\n return parseJsonTextWithLimit<T>(\n Buffer.concat(chunks, totalBytes).toString(\"utf8\"),\n filePath,\n {\n maxBytes,\n oversizedErrorMessage: ({ sourceLabel, maxBytes, envVarName }) =>\n oversizedErrorMessage({\n filePath: sourceLabel,\n maxBytes,\n envVarName,\n }),\n },\n );\n}\n\nexport function parseJsonTextWithLimit<T>(\n content: string,\n sourceLabel: string,\n options: ParseJsonTextOptions = {},\n) {\n const maxBytes =\n options.maxBytes ??\n getPositiveIntegerEnv(\n MAX_JSONL_RECORD_BYTES_ENV,\n DEFAULT_MAX_JSONL_RECORD_BYTES,\n );\n const oversizedErrorMessage =\n options.oversizedErrorMessage ?? defaultOversizedJsonTextMessage;\n\n if (Buffer.byteLength(content, \"utf8\") > maxBytes) {\n throw new Error(\n oversizedErrorMessage({\n sourceLabel,\n maxBytes,\n envVarName: MAX_JSONL_RECORD_BYTES_ENV,\n }),\n );\n }\n\n return JSON.parse(content) as T;\n}\n\nexport function getPositiveIntegerEnv(name: string, fallback: number) {\n const raw = process.env[name]?.trim();\n\n if (!raw) {\n return fallback;\n }\n\n const parsed = Number.parseInt(raw, 10);\n\n if (!Number.isFinite(parsed) || parsed < 1) {\n return fallback;\n }\n\n return parsed;\n}\n\nexport async function runWithConcurrency<T>(\n items: T[],\n concurrency: number,\n worker: (item: T, index: number) => Promise<void>,\n) {\n if (items.length === 0) {\n return;\n }\n\n const limit = Math.max(1, Math.min(concurrency, items.length));\n let nextIndex = 0;\n\n await Promise.all(\n Array.from({ length: limit }, async () => {\n for (;;) {\n const currentIndex = nextIndex;\n\n nextIndex += 1;\n\n if (currentIndex >= items.length) {\n return;\n }\n\n await worker(items[currentIndex], currentIndex);\n }\n }),\n );\n}\n\nexport function getRecentWindowStart(endDate: Date, days = 30) {\n const start = new Date(endDate);\n\n start.setDate(start.getDate() - (days - 1));\n start.setHours(0, 0, 0, 0);\n\n return start;\n}\n\nexport function normalizeModelName(modelName: string) {\n return modelName.replace(/-\\d{8}$/, \"\");\n}\n\nexport function getTopModel(\n modelTotals: Map<string, ModelTokenTotals>,\n): ModelUsage | undefined {\n let bestModel: string | undefined;\n let bestTotals: ModelTokenTotals | undefined;\n\n for (const [modelName, totals] of modelTotals) {\n if (!bestTotals || totals.total > bestTotals.total) {\n bestModel = modelName;\n bestTotals = totals;\n }\n }\n\n if (!bestTotals || bestTotals.total <= 0) {\n return undefined;\n }\n\n return {\n name: bestModel!,\n tokens: {\n input: bestTotals.input,\n output: bestTotals.output,\n cache: { input: bestTotals.cache.input, output: bestTotals.cache.output },\n total: bestTotals.total,\n },\n };\n}\n\nfunction startOfDay(date: Date) {\n const day = new Date(date);\n\n day.setHours(0, 0, 0, 0);\n\n return day;\n}\n\nfunction isConsecutiveDay(prevDate: Date, currDate: Date): boolean {\n const prev = startOfDay(prevDate);\n const curr = startOfDay(currDate);\n const diff = curr.getTime() - prev.getTime();\n\n return diff === ONE_DAY_MS;\n}\n\nexport function computeLongestStreak(daily: DailyUsage[]): number {\n if (daily.length === 0) {\n return 0;\n }\n\n let longest = 1;\n let running = 1;\n\n for (let i = 1; i < daily.length; i += 1) {\n if (isConsecutiveDay(daily[i - 1].date, daily[i].date)) {\n running += 1;\n if (running > longest) {\n longest = running;\n }\n } else {\n running = 1;\n }\n }\n\n return longest;\n}\n\nexport function computeCurrentStreak(daily: DailyUsage[], end: Date): number {\n if (daily.length === 0) {\n return 0;\n }\n\n const endDay = startOfDay(end);\n const lastEntry = daily[daily.length - 1];\n const lastEntryDay = startOfDay(lastEntry.date);\n\n // If the last active day isn't the end date, check if it's consecutive\n if (\n lastEntryDay.getTime() !== endDay.getTime() &&\n !isConsecutiveDay(lastEntryDay, endDay)\n ) {\n return 0;\n }\n\n let current = 1;\n\n for (let i = daily.length - 2; i >= 0; i -= 1) {\n if (!isConsecutiveDay(daily[i].date, daily[i + 1].date)) {\n break;\n }\n current += 1;\n }\n\n return current;\n}\n\nexport function getProviderInsights(\n modelTotals: Map<string, ModelTokenTotals>,\n recentModelTotals: Map<string, ModelTokenTotals>,\n daily: DailyUsage[],\n end: Date,\n): Insights {\n const mostUsedModel = getTopModel(modelTotals);\n const recentMostUsedModel = getTopModel(recentModelTotals);\n const measuredDaily = daily.filter((row) => row.total > 0);\n\n return {\n mostUsedModel,\n recentMostUsedModel,\n streaks: {\n longest: computeLongestStreak(measuredDaily),\n current: computeCurrentStreak(measuredDaily, end),\n },\n };\n}\n\nexport function createUsageSummary(\n provider: UsageSummary[\"provider\"],\n totals: DailyTotalsByDate,\n modelTotals: Map<string, ModelTokenTotals>,\n recentModelTotals: Map<string, ModelTokenTotals>,\n end: Date,\n displayValuesByDate?: Map<string, number>,\n): UsageSummary {\n const daily = totalsToRows(totals, displayValuesByDate);\n\n return {\n provider,\n daily,\n insights: getProviderInsights(modelTotals, recentModelTotals, daily, end),\n };\n}\n\nexport function hasUsage(summary: UsageSummary) {\n return summary.daily.some(\n (row) => row.total > 0 || (row.displayValue ?? 0) > 0,\n );\n}\n","import svgBuilder, { type SVGBuilderInstance } from \"svg-builder\";\nimport type { DailyUsage, Insights, ModelUsage } from \"./interfaces\";\nimport type { ProviderId } from \"./lib/interfaces\";\nimport { formatLocalDate } from \"./lib/utils\";\n\ninterface HeatmapTheme {\n title: string;\n colors: {\n light: string[];\n dark: string[];\n };\n}\n\nexport type ColorMode = \"light\" | \"dark\";\n\ninterface CalendarGrid {\n weeks: (string | null)[][];\n monthLabels: (string | null)[];\n}\n\ninterface SectionLayout {\n width: number;\n height: number;\n gridTop: number;\n leftLabelWidth: number;\n cellSize: number;\n gap: number;\n headerCaptionY: number;\n headerValueY: number;\n titleY: number;\n monthLabelY: number;\n legendY: number;\n noteY: number;\n footerCaptionY: number;\n footerValueY: number;\n}\n\ninterface DrawHeatmapSectionOptions {\n x: number;\n y: number;\n grid: CalendarGrid;\n layout: SectionLayout;\n daily: DailyUsage[];\n insights?: Insights;\n title: string;\n colors: HeatmapTheme[\"colors\"];\n colorMode: ColorMode;\n palette: SurfacePalette;\n}\n\ninterface RenderUsageHeatmapsSvgSection {\n daily: DailyUsage[];\n insights?: Insights;\n title: string;\n colors: HeatmapTheme[\"colors\"];\n}\n\ninterface ModelUsageRow {\n caption: string;\n data: ModelUsage;\n}\n\ninterface RenderUsageHeatmapsSvgOptions {\n startDate: Date;\n endDate: Date;\n sections: RenderUsageHeatmapsSvgSection[];\n colorMode: ColorMode;\n}\n\ninterface SurfacePalette {\n background: string;\n text: string;\n muted: string;\n}\n\nexport const heatmapThemes: Record<ProviderId, HeatmapTheme> = {\n claude: {\n title: \"Claude Code\",\n colors: {\n light: [\n \"#fff7ed\", // orange-50\n \"#fed7aa\", // orange-200\n \"#fdba74\", // orange-300\n \"#f97316\", // orange-500\n \"#c2410c\", // orange-700\n ],\n dark: [\n \"#292524\", // stone-800\n \"#9a3412\", // orange-800\n \"#c2410c\", // orange-700\n \"#f97316\", // orange-500\n \"#fdba74\", // orange-300\n ],\n },\n },\n codex: {\n title: \"Codex\",\n colors: {\n light: [\n \"#e0e7ff\", // indigo-100\n \"#a5b4fc\", // indigo-300\n \"#818cf8\", // indigo-400\n \"#4f46e5\", // indigo-600\n \"#312e81\", // indigo-900\n ],\n dark: [\n \"#1e1b4b\", // indigo-950\n \"#312e81\", // indigo-900\n \"#4338ca\", // indigo-700\n \"#818cf8\", // indigo-400\n \"#c7d2fe\", // indigo-200\n ],\n },\n },\n opencode: {\n title: \"Open Code\",\n colors: {\n light: [\n \"#f5f5f5\", // neutral-100\n \"#d4d4d4\", // neutral-300\n \"#a3a3a3\", // neutral-400\n \"#525252\", // neutral-600\n \"#171717\", // neutral-900\n ],\n dark: [\n \"#262626\", // neutral-800\n \"#525252\", // neutral-600\n \"#737373\", // neutral-500\n \"#a3a3a3\", // neutral-400\n \"#fafafa\", // neutral-50\n ],\n },\n },\n};\n\nconst daysOfWeekMonday = [\"Mon\", \"Tue\", \"Wed\", \"Thu\", \"Fri\", \"Sat\", \"Sun\"];\nconst numberFormatter = new Intl.NumberFormat(\"en-US\");\nconst fontFamily =\n \"ui-sans-serif, system-ui, -apple-system, Segoe UI, Roboto, sans-serif\";\nconst providerTitleFontSize = 20;\nconst metricCaptionFontSize = 9;\nconst metricValueFontSize = 14;\nconst captionValueGap = 4;\n\nconst surfacePalettes: Record<ColorMode, SurfacePalette> = {\n light: {\n background: \"#ffffff\",\n text: \"#0f172a\",\n muted: \"#737373\",\n },\n dark: {\n background: \"#171717\",\n text: \"#fafafa\",\n muted: \"#a3a3a3\",\n },\n};\n\nfunction formatTokenTotal(value: number) {\n const units = [\n { size: 1_000_000_000_000, suffix: \"T\" },\n { size: 1_000_000_000, suffix: \"B\" },\n { size: 1_000_000, suffix: \"M\" },\n { size: 1_000, suffix: \"K\" },\n ];\n\n for (const unit of units) {\n if (value >= unit.size) {\n const scaled = value / unit.size;\n const precision = scaled >= 100 ? 0 : scaled >= 10 ? 1 : 2;\n const compact = scaled\n .toFixed(precision)\n .replace(/\\.0+$/, \"\")\n .replace(/(\\.\\d*[1-9])0+$/, \"$1\");\n\n return `${compact}${unit.suffix}`;\n }\n }\n\n return numberFormatter.format(value);\n}\n\nfunction truncateText(value: string, maxLength: number) {\n if (value.length <= maxLength) {\n return value;\n }\n\n return `${value.slice(0, Math.max(maxLength - 3, 1))}...`;\n}\n\nfunction escapeXml(value: string) {\n return value\n .replaceAll(\"&\", \"&\")\n .replaceAll(\"<\", \"<\")\n .replaceAll(\">\", \">\");\n}\n\nfunction caption(value: string) {\n return value.toUpperCase();\n}\n\nfunction getAllDays(start: Date, end: Date) {\n const days: string[] = [];\n const curr = new Date(start);\n\n while (curr <= end) {\n days.push(formatLocalDate(curr));\n curr.setDate(curr.getDate() + 1);\n }\n\n return days;\n}\n\nfunction getMondayBasedWeekday(dateIso: string) {\n const sundayBased = new Date(`${dateIso}T00:00:00`).getDay();\n\n return (sundayBased + 6) % 7;\n}\n\nfunction padToWeekStartMonday(days: string[]) {\n const firstDay = getMondayBasedWeekday(days[0]);\n const padding = new Array(firstDay).fill(null);\n\n return [...padding, ...days];\n}\n\nfunction chunkByWeek(days: (string | null)[]): (string | null)[][] {\n const weeks: (string | null)[][] = [];\n\n for (let i = 0; i < days.length; i += 7) {\n weeks.push(days.slice(i, i + 7));\n }\n\n return weeks;\n}\n\nfunction getMonthLabel(week: (string | null)[]) {\n const lastDay = [...week].reverse().find(Boolean);\n\n if (!lastDay) {\n return null;\n }\n\n return new Date(`${lastDay}T00:00:00`).toLocaleString(\"en-US\", {\n month: \"short\",\n });\n}\n\nfunction defaultColourMap(value: number, max: number, colorCount: number) {\n if (max <= 0 || value <= 0) {\n return 0;\n }\n\n const scaled = Math.log1p(value) / Math.log1p(max);\n const index = Math.ceil(scaled * (colorCount - 1));\n\n return Math.min(Math.max(index, 0), colorCount - 1);\n}\n\nfunction formatShortDate(dateIso: string) {\n return new Date(`${dateIso}T00:00:00`).toLocaleString(\"en-US\", {\n month: \"short\",\n day: \"numeric\",\n });\n}\n\nfunction getCalendarGrid(startDate: Date, endDate: Date) {\n const allDays = getAllDays(startDate, endDate);\n const paddedDays = padToWeekStartMonday(allDays);\n const weeks = chunkByWeek(paddedDays);\n\n const monthLabels = weeks.map((week, i) => {\n const label = getMonthLabel(week);\n const prevLabel = i > 0 ? getMonthLabel(weeks[i - 1]) : null;\n\n return label !== prevLabel ? label : null;\n });\n\n return { weeks, monthLabels };\n}\n\nfunction getSectionLayout(weekCount: number) {\n const cellSize = 11;\n const gap = 2;\n const leftLabelWidth = 34;\n const rightPadding = 20;\n const headerCaptionY = 0;\n const headerValueY =\n headerCaptionY + metricCaptionFontSize + captionValueGap;\n const topMetricHeight = headerValueY + metricValueFontSize;\n const topPadding = Math.max(providerTitleFontSize, topMetricHeight) + 20;\n const monthHeaderHeight = 20;\n const titleY = 0;\n const monthLabelY = topPadding + 4;\n const gridTop = topPadding + monthHeaderHeight;\n const gridHeight = 7 * cellSize + 6 * gap;\n const gridWidth = weekCount * cellSize + Math.max(weekCount - 1, 0) * gap;\n const legendY = gridTop + gridHeight + 28;\n const legendBottomY = legendY + cellSize;\n const noteY = legendBottomY + 14;\n const footerTopPadding = 48;\n const footerCaptionY = legendBottomY + footerTopPadding;\n const footerValueY =\n footerCaptionY + metricCaptionFontSize + captionValueGap;\n const statsBottomPadding = 12;\n const width = leftLabelWidth + gridWidth + rightPadding;\n const height = footerValueY + metricValueFontSize + statsBottomPadding;\n\n return {\n width,\n height,\n gridTop,\n leftLabelWidth,\n cellSize,\n gap,\n headerCaptionY,\n headerValueY,\n titleY,\n monthLabelY,\n legendY,\n noteY,\n footerCaptionY,\n footerValueY,\n };\n}\n\nfunction drawHeatmapSection(\n svg: SVGBuilderInstance,\n {\n x,\n y,\n grid,\n layout,\n daily,\n insights,\n title,\n colors,\n colorMode,\n palette,\n }: DrawHeatmapSectionOptions,\n) {\n const colorsForMode = colors[colorMode];\n const valueByDate = new Map<string, number>();\n const rightEdge = x + layout.width - 8;\n const leftColumnX = x + 8;\n let maxValue = 0;\n let totalInputTokens = 0;\n let totalOutputTokens = 0;\n let totalTokens = 0;\n let firstActivityOnlyDate: string | null = null;\n let firstMeasuredDate: string | null = null;\n\n for (const row of daily) {\n const dateKey = formatLocalDate(row.date);\n const displayValue = row.displayValue ?? row.total;\n\n valueByDate.set(dateKey, displayValue);\n maxValue = Math.max(maxValue, displayValue);\n if (row.total <= 0 && displayValue > 0) {\n if (!firstActivityOnlyDate || dateKey < firstActivityOnlyDate) {\n firstActivityOnlyDate = dateKey;\n }\n } else if (row.total > 0 && (!firstMeasuredDate || dateKey < firstMeasuredDate)) {\n firstMeasuredDate = dateKey;\n }\n totalInputTokens += row.input;\n totalOutputTokens += row.output;\n totalTokens += row.total;\n }\n\n const topMetricGap = 120;\n const headerLast30DaysX = rightEdge - topMetricGap * 3;\n const headerInputX = rightEdge - topMetricGap * 2;\n const headerOutputX = rightEdge - topMetricGap;\n const totalTokensLabel = formatTokenTotal(totalTokens);\n const totalInputLabel = formatTokenTotal(totalInputTokens);\n const totalOutputLabel = formatTokenTotal(totalOutputTokens);\n const longestStreak = insights?.streaks.longest ?? 0;\n const currentStreak = insights?.streaks.current ?? 0;\n\n svg = svg.text(\n {\n x: leftColumnX,\n y: y + layout.titleY,\n fill: palette.text,\n \"font-size\": providerTitleFontSize,\n \"font-weight\": 600,\n \"dominant-baseline\": \"hanging\",\n \"font-family\": fontFamily,\n },\n title,\n );\n\n svg = svg.text(\n {\n x: headerInputX,\n y: y + layout.headerCaptionY,\n fill: palette.muted,\n \"font-size\": metricCaptionFontSize,\n \"font-weight\": 600,\n \"text-anchor\": \"end\",\n \"dominant-baseline\": \"hanging\",\n \"font-family\": fontFamily,\n },\n caption(\"Input tokens\"),\n );\n\n svg = svg.text(\n {\n x: headerInputX,\n y: y + layout.headerValueY,\n fill: palette.text,\n \"font-size\": metricValueFontSize,\n \"font-weight\": 600,\n \"text-anchor\": \"end\",\n \"dominant-baseline\": \"hanging\",\n \"font-family\": fontFamily,\n },\n totalInputLabel,\n );\n\n svg = svg.text(\n {\n x: headerOutputX,\n y: y + layout.headerCaptionY,\n fill: palette.muted,\n \"font-size\": metricCaptionFontSize,\n \"font-weight\": 600,\n \"text-anchor\": \"end\",\n \"dominant-baseline\": \"hanging\",\n \"font-family\": fontFamily,\n },\n caption(\"Output tokens\"),\n );\n\n svg = svg.text(\n {\n x: headerOutputX,\n y: y + layout.headerValueY,\n fill: palette.text,\n \"font-size\": metricValueFontSize,\n \"font-weight\": 600,\n \"text-anchor\": \"end\",\n \"dominant-baseline\": \"hanging\",\n \"font-family\": fontFamily,\n },\n totalOutputLabel,\n );\n\n svg = svg.text(\n {\n x: rightEdge,\n y: y + layout.headerCaptionY,\n fill: palette.muted,\n \"font-size\": metricCaptionFontSize,\n \"font-weight\": 600,\n \"text-anchor\": \"end\",\n \"dominant-baseline\": \"hanging\",\n \"font-family\": fontFamily,\n },\n caption(\"Total tokens\"),\n );\n\n svg = svg.text(\n {\n x: rightEdge,\n y: y + layout.headerValueY,\n fill: palette.text,\n \"font-size\": metricValueFontSize,\n \"font-weight\": 600,\n \"text-anchor\": \"end\",\n \"dominant-baseline\": \"hanging\",\n \"font-family\": fontFamily,\n },\n totalTokensLabel,\n );\n\n for (let i = 0; i < 7; i += 1) {\n const dayY =\n y +\n layout.gridTop +\n i * (layout.cellSize + layout.gap) +\n layout.cellSize / 2;\n\n const dayLabel = i === 0 || i === 6 ? daysOfWeekMonday[i] : \"\";\n\n svg = svg.text(\n {\n x: x + layout.leftLabelWidth - 6,\n y: dayY,\n fill: palette.muted,\n \"font-size\": 10,\n \"text-anchor\": \"end\",\n \"dominant-baseline\": \"middle\",\n \"font-family\": fontFamily,\n },\n dayLabel,\n );\n }\n\n for (let weekIndex = 0; weekIndex < grid.weeks.length; weekIndex += 1) {\n const monthLabel = grid.monthLabels[weekIndex];\n\n if (monthLabel) {\n const monthX =\n x + layout.leftLabelWidth + weekIndex * (layout.cellSize + layout.gap);\n\n svg = svg.text(\n {\n x: monthX,\n y: y + layout.monthLabelY,\n fill: palette.muted,\n \"font-size\": 10,\n \"font-family\": fontFamily,\n },\n monthLabel,\n );\n }\n\n const week = grid.weeks[weekIndex];\n\n for (let dayIndex = 0; dayIndex < week.length; dayIndex += 1) {\n const day = week[dayIndex];\n\n if (!day) {\n continue;\n }\n\n const value = valueByDate.get(day) ?? 0;\n const colorIndex = defaultColourMap(\n value,\n maxValue,\n colorsForMode.length,\n );\n const fill = colorsForMode[colorIndex];\n const dayX =\n x + layout.leftLabelWidth + weekIndex * (layout.cellSize + layout.gap);\n const dayY =\n y + layout.gridTop + dayIndex * (layout.cellSize + layout.gap);\n const rectAttributes: Record<string, string | number> = {\n x: dayX,\n y: dayY,\n width: layout.cellSize,\n height: layout.cellSize,\n rx: 3,\n ry: 3,\n fill,\n };\n\n svg = svg.rect(rectAttributes);\n }\n }\n\n const transitionWeekIndex =\n firstActivityOnlyDate && firstMeasuredDate\n ? grid.weeks.findIndex((week) => week.includes(firstMeasuredDate))\n : -1;\n\n if (transitionWeekIndex > 0) {\n const lineX =\n x +\n layout.leftLabelWidth +\n transitionWeekIndex * (layout.cellSize + layout.gap) -\n Math.max(layout.gap, 2);\n const lineTop = y + layout.monthLabelY - 2;\n const lineBottom =\n y + layout.gridTop + 7 * layout.cellSize + 6 * layout.gap + 2;\n\n svg = svg.line({\n x1: lineX,\n y1: lineTop,\n x2: lineX,\n y2: lineBottom,\n stroke: palette.muted,\n \"stroke-width\": 1,\n \"stroke-dasharray\": \"4 4\",\n \"stroke-opacity\": 0.65,\n });\n }\n\n const legendStartX = x + layout.leftLabelWidth;\n const legendY = y + layout.legendY;\n\n svg = svg.text(\n {\n x: legendStartX,\n y: legendY + 10,\n fill: palette.muted,\n \"font-size\": 10,\n \"font-weight\": 600,\n \"font-family\": fontFamily,\n },\n caption(\"Less\"),\n );\n\n for (let i = 0; i < colorsForMode.length; i += 1) {\n const legendX = legendStartX + 28 + i * (layout.cellSize + 3);\n\n svg = svg.rect({\n x: legendX,\n y: legendY,\n width: layout.cellSize,\n height: layout.cellSize,\n rx: 3,\n ry: 3,\n fill: colorsForMode[i],\n });\n }\n\n svg = svg.text(\n {\n x: legendStartX + 28 + colorsForMode.length * (layout.cellSize + 3) + 6,\n y: legendY + 10,\n fill: palette.muted,\n \"font-size\": 10,\n \"font-weight\": 600,\n \"font-family\": fontFamily,\n },\n caption(\"More\"),\n );\n\n if (firstActivityOnlyDate && firstMeasuredDate) {\n const noteX = x + layout.width / 2;\n const noteY =\n y + layout.gridTop + 7 * layout.cellSize + 6 * layout.gap + 8;\n\n svg = svg.text(\n {\n x: noteX,\n y: noteY,\n fill: palette.muted,\n \"font-size\": 10,\n \"text-anchor\": \"middle\",\n \"dominant-baseline\": \"hanging\",\n \"font-family\": fontFamily,\n },\n `Claude started logging full token telemetry on ${formatShortDate(firstMeasuredDate)}; earlier activity may be undercounted.`,\n );\n }\n\n const rightColumnX = rightEdge;\n const leftSecondaryX = leftColumnX + 250;\n const rightPrimaryX = rightColumnX - 160;\n\n const leftRows: ModelUsageRow[] = [];\n\n if (insights?.mostUsedModel) {\n leftRows.push({ caption: \"Most used model\", data: insights.mostUsedModel });\n }\n\n if (insights?.recentMostUsedModel) {\n leftRows.push({\n caption: \"Recent use (last 30 days)\",\n data: insights.recentMostUsedModel,\n });\n }\n\n for (const [index, row] of leftRows.entries()) {\n const captionY = layout.footerCaptionY;\n const valueY = layout.footerValueY;\n const modelName = truncateText(row.data.name, 20);\n const modelX = index === 0 ? leftColumnX : leftSecondaryX;\n const tokenLabel = `(${formatTokenTotal(row.data.tokens.total)})`;\n\n svg = svg.text(\n {\n x: modelX,\n y: y + captionY,\n fill: palette.muted,\n \"font-size\": metricCaptionFontSize,\n \"font-weight\": 600,\n \"dominant-baseline\": \"hanging\",\n \"font-family\": fontFamily,\n },\n caption(row.caption),\n );\n\n svg = svg.text(\n {\n x: modelX,\n y: y + valueY,\n \"dominant-baseline\": \"hanging\",\n \"font-family\": fontFamily,\n },\n `<tspan fill=\"${palette.text}\" font-size=\"${metricValueFontSize}\" font-weight=\"600\">${escapeXml(modelName)}</tspan><tspan dx=\"6\" fill=\"${palette.muted}\" font-size=\"${metricValueFontSize}\" font-weight=\"400\">${tokenLabel}</tspan>`,\n );\n }\n\n svg = svg.text(\n {\n x: rightPrimaryX,\n y: y + layout.footerCaptionY,\n fill: palette.muted,\n \"font-size\": metricCaptionFontSize,\n \"font-weight\": 600,\n \"text-anchor\": \"end\",\n \"dominant-baseline\": \"hanging\",\n \"font-family\": fontFamily,\n },\n caption(\"Longest streak\"),\n );\n\n svg = svg.text(\n {\n x: rightPrimaryX,\n y: y + layout.footerValueY,\n fill: palette.text,\n \"font-size\": metricValueFontSize,\n \"font-weight\": 600,\n \"text-anchor\": \"end\",\n \"dominant-baseline\": \"hanging\",\n \"font-family\": fontFamily,\n },\n `${numberFormatter.format(longestStreak)} days`,\n );\n\n svg = svg.text(\n {\n x: rightColumnX,\n y: y + layout.footerCaptionY,\n fill: palette.muted,\n \"font-size\": metricCaptionFontSize,\n \"font-weight\": 600,\n \"text-anchor\": \"end\",\n \"dominant-baseline\": \"hanging\",\n \"font-family\": fontFamily,\n },\n caption(\"Current streak\"),\n );\n\n svg = svg.text(\n {\n x: rightColumnX,\n y: y + layout.footerValueY,\n fill: palette.text,\n \"font-size\": metricValueFontSize,\n \"font-weight\": 600,\n \"text-anchor\": \"end\",\n \"dominant-baseline\": \"hanging\",\n \"font-family\": fontFamily,\n },\n `${numberFormatter.format(currentStreak)} days`,\n );\n\n return svg;\n}\n\nexport function renderUsageHeatmapsSvg({\n startDate,\n endDate,\n sections,\n colorMode,\n}: RenderUsageHeatmapsSvgOptions) {\n const grid = getCalendarGrid(startDate, endDate);\n const layout = getSectionLayout(grid.weeks.length);\n const palette = surfacePalettes[colorMode];\n const horizontalPadding = 18;\n const topPadding = 30;\n const bottomPadding = 18;\n const sectionGap = 40;\n\n const width = horizontalPadding * 2 + layout.width;\n const height =\n topPadding +\n bottomPadding +\n sections.length * layout.height +\n Math.max(sections.length - 1, 0) * sectionGap;\n\n let svg = svgBuilder\n .create()\n .width(width)\n .height(height)\n .viewBox(`0 0 ${width} ${height}`)\n .rect({\n x: -2,\n y: -2,\n width: width + 4,\n height: height + 4,\n fill: palette.background,\n });\n\n sections.forEach((section, index) => {\n const sectionY = topPadding + index * (layout.height + sectionGap);\n\n svg = drawHeatmapSection(svg, {\n x: horizontalPadding,\n y: sectionY,\n grid,\n layout,\n daily: section.daily,\n insights: section.insights,\n title: section.title,\n colors: section.colors,\n colorMode,\n palette,\n });\n });\n\n return svg.render();\n}\n","import { existsSync } from \"node:fs\";\nimport { homedir } from \"node:os\";\nimport { join, resolve } from \"node:path\";\nimport type { UsageSummary } from \"../interfaces\";\nimport {\n DEFAULT_FILE_PROCESS_CONCURRENCY,\n FILE_PROCESS_CONCURRENCY_ENV,\n type DailyTotalsByDate,\n type DailyTokenTotals,\n type ModelTokenTotals,\n addDailyTokenTotals,\n addModelTokenTotals,\n createUsageSummary,\n formatLocalDate,\n getPositiveIntegerEnv,\n getRecentWindowStart,\n listFilesRecursive,\n normalizeModelName,\n readJsonDocument,\n readJsonLines,\n runWithConcurrency,\n} from \"./utils\";\n\nconst CLAUDE_CONFIG_DIR_ENV = \"CLAUDE_CONFIG_DIR\";\nconst CLAUDE_PROJECTS_DIR_NAME = \"projects\";\nconst CLAUDE_STATS_CACHE_FILE_NAME = \"stats-cache.json\";\n\ninterface ClaudeUsagePayload {\n input_tokens?: number;\n output_tokens?: number;\n cache_creation_input_tokens?: number;\n cache_read_input_tokens?: number;\n}\n\ninterface ClaudeRawLogEntry {\n timestamp?: string;\n requestId?: string;\n message?: {\n usage?: ClaudeUsagePayload;\n model?: string;\n id?: string;\n };\n}\n\ninterface ClaudeLogEntry {\n timestamp: string;\n usage: ClaudeUsagePayload;\n model?: string;\n messageId?: string;\n requestId?: string;\n}\n\ninterface ClaudeStatsCacheModelUsage {\n inputTokens?: number;\n outputTokens?: number;\n cacheReadInputTokens?: number;\n cacheCreationInputTokens?: number;\n}\n\ninterface ClaudeStatsCacheEntry {\n date?: string;\n tokensByModel?: Record<string, number>;\n}\n\ninterface ClaudeStatsCache {\n dailyModelTokens?: ClaudeStatsCacheEntry[];\n modelUsage?: Record<string, ClaudeStatsCacheModelUsage>;\n}\n\ninterface ClaudeHistoryEntry {\n timestamp?: number | string;\n}\n\nfunction getClaudeConfigPaths() {\n const envPaths = (process.env[CLAUDE_CONFIG_DIR_ENV] ?? \"\").trim();\n\n if (envPaths !== \"\") {\n return envPaths\n .split(\",\")\n .map((path) => path.trim())\n .filter((path) => path !== \"\")\n .map((path) => resolve(path));\n }\n\n const xdgConfigHome =\n process.env.XDG_CONFIG_HOME?.trim() || join(homedir(), \".config\");\n\n return [join(xdgConfigHome, \"claude\"), join(homedir(), \".claude\")];\n}\n\nfunction getClaudeProjectDirs() {\n const unique = new Set<string>();\n const dirs: string[] = [];\n\n for (const basePath of getClaudeConfigPaths()) {\n const projectsDir = join(basePath, CLAUDE_PROJECTS_DIR_NAME);\n\n if (existsSync(projectsDir) && !unique.has(projectsDir)) {\n unique.add(projectsDir);\n dirs.push(projectsDir);\n }\n }\n\n return dirs;\n}\n\nfunction getClaudeStatsCacheFiles() {\n const unique = new Set<string>();\n const files: string[] = [];\n\n for (const basePath of getClaudeConfigPaths()) {\n const statsCacheFile = join(basePath, CLAUDE_STATS_CACHE_FILE_NAME);\n\n if (existsSync(statsCacheFile) && !unique.has(statsCacheFile)) {\n unique.add(statsCacheFile);\n files.push(statsCacheFile);\n }\n }\n\n return files;\n}\n\nfunction parseClaudeLogEntry(entry: ClaudeRawLogEntry): ClaudeLogEntry | null {\n if (!entry.timestamp || !entry.message?.usage) {\n return null;\n }\n\n return {\n timestamp: entry.timestamp,\n usage: entry.message.usage,\n model: entry.message.model,\n messageId: entry.message.id,\n requestId: entry.requestId,\n };\n}\n\nfunction createClaudeTokenTotals(usage: ClaudeUsagePayload): DailyTokenTotals {\n const cacheReadInput = usage.cache_read_input_tokens ?? 0;\n const cacheCreationInput = usage.cache_creation_input_tokens ?? 0;\n const input = (usage.input_tokens ?? 0) + cacheReadInput;\n const output = (usage.output_tokens ?? 0) + cacheCreationInput;\n\n return {\n input,\n output,\n cache: { input: cacheReadInput, output: cacheCreationInput },\n total: input + output,\n };\n}\n\nfunction distributeTokenComponents(total: number, weights: number[]) {\n const weightSum = weights.reduce((sum, value) => sum + value, 0);\n\n if (total <= 0 || weightSum <= 0) {\n return weights.map(() => 0);\n }\n\n const exact = weights.map((weight) => (weight / weightSum) * total);\n const allocated = exact.map((value) => Math.floor(value));\n let remainder = total - allocated.reduce((sum, value) => sum + value, 0);\n const order = exact\n .map((value, index) => ({\n index,\n fraction: value - allocated[index],\n weight: weights[index],\n }))\n .sort((left, right) => {\n if (right.fraction !== left.fraction) {\n return right.fraction - left.fraction;\n }\n\n return right.weight - left.weight;\n });\n\n for (const { index } of order) {\n if (remainder <= 0) {\n break;\n }\n\n allocated[index] += 1;\n remainder -= 1;\n }\n\n return allocated;\n}\n\nfunction createStatsCacheTokenTotals(\n totalTokens: number,\n usage?: ClaudeStatsCacheModelUsage,\n): DailyTokenTotals {\n if (totalTokens <= 0) {\n return {\n input: 0,\n output: 0,\n cache: { input: 0, output: 0 },\n total: 0,\n };\n }\n\n const inputTokens = usage?.inputTokens ?? 0;\n const outputTokens = usage?.outputTokens ?? 0;\n const cacheReadInputTokens = usage?.cacheReadInputTokens ?? 0;\n const cacheCreationInputTokens = usage?.cacheCreationInputTokens ?? 0;\n const [scaledInput, scaledOutput, scaledCacheRead, scaledCacheCreation] =\n distributeTokenComponents(totalTokens, [\n inputTokens,\n outputTokens,\n cacheReadInputTokens,\n cacheCreationInputTokens,\n ]);\n\n // Older Claude installs only keep daily totals in stats-cache.json, so\n // reconstruct the input/output/cache split from the cached model totals.\n if (\n scaledInput === 0 &&\n scaledOutput === 0 &&\n scaledCacheRead === 0 &&\n scaledCacheCreation === 0\n ) {\n return {\n input: totalTokens,\n output: 0,\n cache: { input: 0, output: 0 },\n total: totalTokens,\n };\n }\n\n return {\n input: scaledInput + scaledCacheRead,\n output: scaledOutput + scaledCacheCreation,\n cache: { input: scaledCacheRead, output: scaledCacheCreation },\n total: totalTokens,\n };\n}\n\nasync function getClaudeFiles() {\n const projectDirs = getClaudeProjectDirs();\n const files = (\n await Promise.all(\n projectDirs.map((projectDir) => listFilesRecursive(projectDir, \".jsonl\")),\n )\n ).flat();\n\n return files;\n}\n\nfunction getClaudeHistoryFiles() {\n const unique = new Set<string>();\n const files: string[] = [];\n\n for (const basePath of getClaudeConfigPaths()) {\n const historyFile = join(basePath, \"history.jsonl\");\n\n if (existsSync(historyFile) && !unique.has(historyFile)) {\n unique.add(historyFile);\n files.push(historyFile);\n }\n }\n\n return files;\n}\n\nasync function loadClaudeStatsCacheRows(\n startDate: Date,\n endDate: Date,\n coveredDates: Set<string>,\n totals: DailyTotalsByDate,\n modelTotals: Map<string, ModelTokenTotals>,\n recentModelTotals: Map<string, ModelTokenTotals>,\n recentStart: Date,\n) {\n const statsCacheFiles = getClaudeStatsCacheFiles();\n\n for (const file of statsCacheFiles) {\n let statsCache: ClaudeStatsCache;\n\n try {\n statsCache = await readJsonDocument<ClaudeStatsCache>(file);\n } catch {\n continue;\n }\n\n for (const row of statsCache.dailyModelTokens ?? []) {\n if (!row.date || coveredDates.has(row.date)) {\n continue;\n }\n\n const timestamp = new Date(`${row.date}T00:00:00`);\n\n if (\n Number.isNaN(timestamp.getTime()) ||\n timestamp < startDate ||\n timestamp > endDate\n ) {\n continue;\n }\n\n for (const [rawModelName, totalTokens] of Object.entries(\n row.tokensByModel ?? {},\n )) {\n if (!Number.isFinite(totalTokens) || totalTokens <= 0) {\n continue;\n }\n\n const modelName = normalizeModelName(rawModelName);\n const tokenTotals = createStatsCacheTokenTotals(\n totalTokens,\n statsCache.modelUsage?.[rawModelName],\n );\n\n addDailyTokenTotals(totals, timestamp, tokenTotals, modelName);\n addModelTokenTotals(modelTotals, modelName, tokenTotals);\n\n if (timestamp >= recentStart) {\n addModelTokenTotals(recentModelTotals, modelName, tokenTotals);\n }\n }\n }\n }\n}\n\nasync function loadClaudeHistoryDisplayValues(\n startDate: Date,\n endDate: Date,\n coveredDates: Set<string>,\n displayValuesByDate: Map<string, number>,\n) {\n const historyFiles = getClaudeHistoryFiles();\n\n for (const file of historyFiles) {\n for await (const line of readJsonLines<ClaudeHistoryEntry>(file)) {\n const rawTimestamp = line.timestamp;\n const timestamp =\n typeof rawTimestamp === \"number\"\n ? new Date(rawTimestamp)\n : typeof rawTimestamp === \"string\"\n ? new Date(rawTimestamp)\n : null;\n\n if (!timestamp || Number.isNaN(timestamp.getTime())) {\n continue;\n }\n\n if (timestamp < startDate || timestamp > endDate) {\n continue;\n }\n\n const dateKey = formatLocalDate(timestamp);\n\n if (coveredDates.has(dateKey)) {\n continue;\n }\n\n displayValuesByDate.set(dateKey, (displayValuesByDate.get(dateKey) ?? 0) + 1);\n }\n }\n}\n\nfunction createUniqueHash(messageId?: string, requestId?: string) {\n if (!messageId || !requestId) {\n return null;\n }\n\n return `${messageId}:${requestId}`;\n}\n\nexport async function loadClaudeRows(\n startDate: Date,\n endDate: Date,\n): Promise<UsageSummary> {\n const files = await getClaudeFiles();\n const totals: DailyTotalsByDate = new Map();\n const modelTotals = new Map<string, ModelTokenTotals>();\n const recentModelTotals = new Map<string, ModelTokenTotals>();\n const displayValuesByDate = new Map<string, number>();\n const recentStart = getRecentWindowStart(endDate, 30);\n const processedHashes = new Set<string>();\n const fileConcurrency = getPositiveIntegerEnv(\n FILE_PROCESS_CONCURRENCY_ENV,\n DEFAULT_FILE_PROCESS_CONCURRENCY,\n );\n\n await runWithConcurrency(files, fileConcurrency, async (file) => {\n for await (const line of readJsonLines<ClaudeRawLogEntry>(file)) {\n const entry = parseClaudeLogEntry(line);\n\n if (!entry) {\n continue;\n }\n\n const uniqueHash = createUniqueHash(entry.messageId, entry.requestId);\n\n if (uniqueHash && processedHashes.has(uniqueHash)) {\n continue;\n }\n\n if (uniqueHash) {\n processedHashes.add(uniqueHash);\n }\n\n const timestamp = new Date(entry.timestamp);\n\n if (timestamp < startDate || timestamp > endDate) {\n continue;\n }\n\n const tokenTotals = createClaudeTokenTotals(entry.usage);\n\n if (tokenTotals.total <= 0) {\n continue;\n }\n\n const modelName =\n entry.model && entry.model !== \"<synthetic>\"\n ? normalizeModelName(entry.model)\n : undefined;\n\n addDailyTokenTotals(totals, timestamp, tokenTotals, modelName);\n\n if (!modelName) {\n continue;\n }\n\n addModelTokenTotals(modelTotals, modelName, tokenTotals);\n\n if (timestamp >= recentStart) {\n addModelTokenTotals(recentModelTotals, modelName, tokenTotals);\n }\n }\n });\n\n await loadClaudeStatsCacheRows(\n startDate,\n endDate,\n new Set(totals.keys()),\n totals,\n modelTotals,\n recentModelTotals,\n recentStart,\n );\n\n await loadClaudeHistoryDisplayValues(\n startDate,\n endDate,\n new Set(totals.keys()),\n displayValuesByDate,\n );\n\n return createUsageSummary(\n \"claude\",\n totals,\n modelTotals,\n recentModelTotals,\n endDate,\n displayValuesByDate,\n );\n}\n","import { homedir } from \"node:os\";\nimport { join, resolve } from \"node:path\";\nimport type { UsageSummary } from \"../interfaces\";\nimport {\n DEFAULT_MAX_JSONL_RECORD_BYTES,\n DEFAULT_FILE_PROCESS_CONCURRENCY,\n FILE_PROCESS_CONCURRENCY_ENV,\n MAX_JSONL_RECORD_BYTES_ENV,\n type JsonlRecordDecision,\n type DailyTotalsByDate,\n type DailyTokenTotals,\n type ModelTokenTotals,\n addDailyTokenTotals,\n addModelTokenTotals,\n createUsageSummary,\n getPositiveIntegerEnv,\n getRecentWindowStart,\n listFilesRecursive,\n mergeDailyTotalsByDate,\n mergeModelTotals,\n normalizeModelName,\n readJsonlRecords,\n runWithConcurrency,\n} from \"./utils\";\nconst CLASSIFICATION_PREFIX_BYTES = 32 * 1024;\n\ninterface CodexRawUsage {\n input_tokens?: number;\n cached_input_tokens?: number;\n cache_read_input_tokens?: number;\n output_tokens?: number;\n reasoning_output_tokens?: number;\n total_tokens?: number;\n}\n\ninterface CodexEventInfo {\n model?: string;\n model_name?: string;\n metadata?: { model?: string };\n last_token_usage?: CodexRawUsage;\n total_token_usage?: CodexRawUsage;\n}\n\ninterface CodexEventPayload {\n type?: string;\n info?: CodexEventInfo;\n model?: string;\n model_name?: string;\n metadata?: { model?: string };\n}\n\ninterface CodexEventEntry {\n type?: string;\n timestamp: string;\n payload?: CodexEventPayload;\n}\n\ninterface CodexNormalizedUsage {\n input_tokens: number;\n cached_input_tokens: number;\n output_tokens: number;\n reasoning_output_tokens: number;\n total_tokens: number;\n}\n\ninterface CodexFileProcessingResult {\n totals: DailyTotalsByDate;\n modelTotals: Map<string, ModelTokenTotals>;\n recentModelTotals: Map<string, ModelTokenTotals>;\n skippedOversizedIrrelevantRecords: number;\n}\n\ntype JsonContext =\n | {\n kind: \"array\";\n expecting: \"valueOrEnd\" | \"commaOrEnd\";\n }\n | {\n kind: \"object\";\n expecting: \"keyOrEnd\" | \"colon\" | \"value\" | \"commaOrEnd\";\n key?: string;\n isPayloadObject: boolean;\n };\n\nfunction normalizeCodexUsage(value?: CodexRawUsage) {\n if (!value) {\n return null;\n }\n\n const input = value.input_tokens ?? 0;\n const cached =\n value.cached_input_tokens ?? value.cache_read_input_tokens ?? 0;\n const output = value.output_tokens ?? 0;\n const reasoning = value.reasoning_output_tokens ?? 0;\n const total = value.total_tokens ?? 0;\n\n return {\n input_tokens: input,\n cached_input_tokens: cached,\n output_tokens: output,\n reasoning_output_tokens: reasoning,\n total_tokens: total > 0 ? total : input + output,\n };\n}\n\nfunction subtractCodexUsage(\n current: CodexNormalizedUsage,\n previous: CodexNormalizedUsage | null,\n) {\n return {\n input_tokens: Math.max(\n current.input_tokens - (previous?.input_tokens ?? 0),\n 0,\n ),\n cached_input_tokens: Math.max(\n current.cached_input_tokens - (previous?.cached_input_tokens ?? 0),\n 0,\n ),\n output_tokens: Math.max(\n current.output_tokens - (previous?.output_tokens ?? 0),\n 0,\n ),\n reasoning_output_tokens: Math.max(\n current.reasoning_output_tokens -\n (previous?.reasoning_output_tokens ?? 0),\n 0,\n ),\n total_tokens: Math.max(\n current.total_tokens - (previous?.total_tokens ?? 0),\n 0,\n ),\n };\n}\n\nfunction asNonEmptyString(value?: string) {\n const trimmed = value?.trim();\n\n return trimmed === \"\" ? undefined : trimmed;\n}\n\nfunction extractCodexModel(payload?: CodexEventPayload) {\n const directModel =\n asNonEmptyString(payload?.model) ?? asNonEmptyString(payload?.model_name);\n\n if (directModel) {\n return directModel;\n }\n\n if (payload?.info) {\n const infoModel =\n asNonEmptyString(payload.info.model) ??\n asNonEmptyString(payload.info.model_name);\n\n if (infoModel) {\n return infoModel;\n }\n\n if (payload.info.metadata) {\n const model = asNonEmptyString(payload.info.metadata.model);\n\n if (model) {\n return model;\n }\n }\n }\n\n if (payload?.metadata) {\n return asNonEmptyString(payload.metadata.model);\n }\n\n return undefined;\n}\n\nasync function getCodexFiles() {\n const codexHome = process.env.CODEX_HOME?.trim()\n ? resolve(process.env.CODEX_HOME)\n : join(homedir(), \".codex\");\n\n return listFilesRecursive(join(codexHome, \"sessions\"), \".jsonl\");\n}\n\nfunction readJsonString(source: string, start: number) {\n if (source[start] !== '\"') {\n return null;\n }\n\n let value = \"\";\n let escaped = false;\n\n for (let index = start + 1; index < source.length; index += 1) {\n const char = source[index];\n\n if (escaped) {\n value += char;\n escaped = false;\n continue;\n }\n\n if (char === \"\\\\\") {\n escaped = true;\n continue;\n }\n\n if (char === '\"') {\n return { value, nextIndex: index + 1 };\n }\n\n value += char;\n }\n\n return null;\n}\n\nfunction skipWhitespace(source: string, start: number) {\n let index = start;\n\n while (index < source.length && /\\s/.test(source[index])) {\n index += 1;\n }\n\n return index;\n}\n\nfunction skipPrimitive(source: string, start: number) {\n let index = start;\n\n while (index < source.length) {\n const char = source[index];\n\n if (char === \",\" || char === \"}\" || char === \"]\" || /\\s/.test(char)) {\n return index;\n }\n\n index += 1;\n }\n\n return source.length;\n}\n\nfunction classifyCodexRecord(\n source: string,\n): JsonlRecordDecision<\"turn_context\" | \"token_count\"> {\n const stack: JsonContext[] = [];\n let topLevelType: string | undefined;\n\n for (let index = 0; index < source.length; ) {\n index = skipWhitespace(source, index);\n\n if (index >= source.length) {\n break;\n }\n\n const char = source[index];\n\n if (stack.length === 0) {\n if (char !== \"{\") {\n return { kind: \"unknown\" };\n }\n\n stack.push({\n kind: \"object\",\n expecting: \"keyOrEnd\",\n isPayloadObject: false,\n });\n index += 1;\n continue;\n }\n\n const context = stack[stack.length - 1]!;\n\n if (context.kind === \"object\") {\n if (context.expecting === \"keyOrEnd\") {\n if (char === \"}\") {\n stack.pop();\n index += 1;\n continue;\n }\n\n const key = readJsonString(source, index);\n\n if (!key) {\n return { kind: \"unknown\" };\n }\n\n context.key = key.value;\n context.expecting = \"colon\";\n index = key.nextIndex;\n continue;\n }\n\n if (context.expecting === \"colon\") {\n if (char !== \":\") {\n return { kind: \"unknown\" };\n }\n\n context.expecting = \"value\";\n index += 1;\n continue;\n }\n\n if (context.expecting === \"value\") {\n if (char === \"{\") {\n stack.push({\n kind: \"object\",\n expecting: \"keyOrEnd\",\n isPayloadObject: stack.length === 1 && context.key === \"payload\",\n });\n context.expecting = \"commaOrEnd\";\n context.key = undefined;\n index += 1;\n continue;\n }\n\n if (char === \"[\") {\n stack.push({ kind: \"array\", expecting: \"valueOrEnd\" });\n context.expecting = \"commaOrEnd\";\n context.key = undefined;\n index += 1;\n continue;\n }\n\n if (char === '\"') {\n const value = readJsonString(source, index);\n\n if (!value) {\n return { kind: \"unknown\" };\n }\n\n if (stack.length === 1 && context.key === \"type\") {\n topLevelType = value.value;\n\n if (value.value === \"turn_context\") {\n return { kind: \"keep\", classification: \"turn_context\" };\n }\n\n if (value.value !== \"event_msg\") {\n return { kind: \"skip\" };\n }\n }\n\n if (context.isPayloadObject && context.key === \"type\") {\n if (value.value === \"token_count\") {\n return topLevelType === \"event_msg\"\n ? { kind: \"keep\", classification: \"token_count\" }\n : { kind: \"unknown\" };\n }\n\n return topLevelType === \"event_msg\"\n ? { kind: \"skip\" }\n : { kind: \"unknown\" };\n }\n\n context.expecting = \"commaOrEnd\";\n context.key = undefined;\n index = value.nextIndex;\n continue;\n }\n\n context.expecting = \"commaOrEnd\";\n context.key = undefined;\n index = skipPrimitive(source, index);\n continue;\n }\n\n {\n if (char === \",\") {\n context.expecting = \"keyOrEnd\";\n index += 1;\n continue;\n }\n\n if (char === \"}\") {\n stack.pop();\n index += 1;\n continue;\n }\n\n return { kind: \"unknown\" };\n }\n\n continue;\n }\n\n if (context.expecting === \"valueOrEnd\") {\n if (char === \"]\") {\n stack.pop();\n index += 1;\n continue;\n }\n\n if (char === \"{\") {\n stack.push({\n kind: \"object\",\n expecting: \"keyOrEnd\",\n isPayloadObject: false,\n });\n context.expecting = \"commaOrEnd\";\n index += 1;\n continue;\n }\n\n if (char === \"[\") {\n stack.push({ kind: \"array\", expecting: \"valueOrEnd\" });\n context.expecting = \"commaOrEnd\";\n index += 1;\n continue;\n }\n\n if (char === '\"') {\n const value = readJsonString(source, index);\n\n if (!value) {\n return { kind: \"unknown\" };\n }\n\n context.expecting = \"commaOrEnd\";\n index = value.nextIndex;\n continue;\n }\n\n context.expecting = \"commaOrEnd\";\n index = skipPrimitive(source, index);\n continue;\n }\n\n if (char === \",\") {\n context.expecting = \"valueOrEnd\";\n index += 1;\n continue;\n }\n\n if (char === \"]\") {\n stack.pop();\n index += 1;\n continue;\n }\n\n return { kind: \"unknown\" };\n }\n\n if (topLevelType && topLevelType !== \"event_msg\") {\n return { kind: \"skip\" };\n }\n\n return { kind: \"unknown\" };\n}\n\nasync function processCodexFile(\n filePath: string,\n start: Date,\n end: Date,\n maxRecordBytes: number,\n): Promise<CodexFileProcessingResult> {\n const totals: DailyTotalsByDate = new Map();\n const recentStart = getRecentWindowStart(end, 30);\n const modelTotals = new Map<string, ModelTokenTotals>();\n const recentModelTotals = new Map<string, ModelTokenTotals>();\n let previousTotals: CodexNormalizedUsage | null = null;\n let currentModel: string | undefined;\n\n let skippedOversizedIrrelevantRecords = 0;\n\n for await (const record of readJsonlRecords<\"turn_context\" | \"token_count\">(\n filePath,\n {\n classificationPrefixBytes: CLASSIFICATION_PREFIX_BYTES,\n classify: classifyCodexRecord,\n maxRecordBytes,\n onSkippedOversizedRecord: () => {\n skippedOversizedIrrelevantRecords += 1;\n },\n oversizedErrorMessage: ({ filePath, lineNumber, maxRecordBytes }) =>\n `Relevant Codex record exceeds ${maxRecordBytes} bytes in ${filePath}:${lineNumber}. Increase ${MAX_JSONL_RECORD_BYTES_ENV} to process this file.`,\n },\n )) {\n let entry: CodexEventEntry;\n\n try {\n entry = JSON.parse(record.rawLine) as CodexEventEntry;\n } catch {\n continue;\n }\n\n const extractedModel = extractCodexModel(entry.payload);\n\n if (record.classification === \"turn_context\") {\n currentModel = extractedModel ?? currentModel;\n continue;\n }\n\n const info = entry.payload?.info;\n const lastUsage = normalizeCodexUsage(info?.last_token_usage);\n const totalUsage = normalizeCodexUsage(info?.total_token_usage);\n let rawUsage = lastUsage;\n\n if (!rawUsage && totalUsage) {\n rawUsage = subtractCodexUsage(totalUsage, previousTotals);\n }\n\n if (totalUsage) {\n previousTotals = totalUsage;\n }\n\n if (!rawUsage) {\n continue;\n }\n\n const usage: DailyTokenTotals = {\n input: rawUsage.input_tokens,\n output: rawUsage.output_tokens,\n cache: { input: rawUsage.cached_input_tokens, output: 0 },\n total: rawUsage.total_tokens,\n };\n\n if (usage.total <= 0) {\n continue;\n }\n\n const date = new Date(entry.timestamp);\n\n if (date < start || date > end) {\n continue;\n }\n\n const modelName = extractedModel ?? currentModel;\n const normalizedModelName = modelName\n ? normalizeModelName(modelName)\n : undefined;\n\n addDailyTokenTotals(totals, date, usage, normalizedModelName);\n\n if (!normalizedModelName) {\n continue;\n }\n\n addModelTokenTotals(modelTotals, normalizedModelName, usage);\n\n if (date >= recentStart) {\n addModelTokenTotals(recentModelTotals, normalizedModelName, usage);\n }\n }\n\n return {\n totals,\n modelTotals,\n recentModelTotals,\n skippedOversizedIrrelevantRecords,\n };\n}\n\nexport async function loadCodexRows(\n start: Date,\n end: Date,\n warnings: string[] = [],\n): Promise<UsageSummary> {\n const files = await getCodexFiles();\n const totals: DailyTotalsByDate = new Map();\n const modelTotals = new Map<string, ModelTokenTotals>();\n const recentModelTotals = new Map<string, ModelTokenTotals>();\n const maxRecordBytes = getPositiveIntegerEnv(\n MAX_JSONL_RECORD_BYTES_ENV,\n DEFAULT_MAX_JSONL_RECORD_BYTES,\n );\n const fileConcurrency = getPositiveIntegerEnv(\n FILE_PROCESS_CONCURRENCY_ENV,\n DEFAULT_FILE_PROCESS_CONCURRENCY,\n );\n const results = new Array<CodexFileProcessingResult>(files.length);\n\n await runWithConcurrency(files, fileConcurrency, async (file, index) => {\n results[index] = await processCodexFile(file, start, end, maxRecordBytes);\n });\n\n let skippedOversizedIrrelevantRecords = 0;\n let skippedFiles = 0;\n\n for (const result of results) {\n mergeDailyTotalsByDate(totals, result.totals);\n mergeModelTotals(modelTotals, result.modelTotals);\n mergeModelTotals(recentModelTotals, result.recentModelTotals);\n\n if (result.skippedOversizedIrrelevantRecords > 0) {\n skippedOversizedIrrelevantRecords += result.skippedOversizedIrrelevantRecords;\n skippedFiles += 1;\n }\n }\n\n if (skippedOversizedIrrelevantRecords > 0) {\n warnings.push(\n `Skipped ${skippedOversizedIrrelevantRecords} oversized irrelevant Codex record(s) across ${skippedFiles} file(s); usage totals exclude those records. Relevant oversized records fail the file. Override ${MAX_JSONL_RECORD_BYTES_ENV} to raise the cap.`,\n );\n }\n\n return createUsageSummary(\"codex\", totals, modelTotals, recentModelTotals, end);\n}\n","import type { UsageSummary } from \"../interfaces\";\n\nexport type ProviderId = UsageSummary[\"provider\"];\n\nexport const providerIds: ProviderId[] = [\"claude\", \"codex\", \"opencode\"];\n\nexport const providerStatusLabel: Record<ProviderId, string> = {\n claude: \"Claude code\",\n codex: \"Codex\",\n opencode: \"Open Code\",\n};\n","import { existsSync } from \"node:fs\";\nimport { copyFile, mkdtemp, rm } from \"node:fs/promises\";\nimport { homedir, tmpdir } from \"node:os\";\nimport { join, resolve } from \"node:path\";\nimport type { UsageSummary } from \"../interfaces\";\nimport {\n type DailyTotalsByDate,\n type DailyTokenTotals,\n type ModelTokenTotals,\n addDailyTokenTotals,\n addModelTokenTotals,\n createUsageSummary,\n getRecentWindowStart,\n listFilesRecursive,\n normalizeModelName,\n parseJsonTextWithLimit,\n readJsonDocument,\n} from \"./utils\";\n\ninterface OpenCodeTokenCache {\n read?: number;\n write?: number;\n}\n\ninterface OpenCodeTokens {\n input?: number;\n output?: number;\n cache?: OpenCodeTokenCache;\n}\n\ninterface OpenCodeMessage {\n id: string;\n role?: string;\n providerID: string;\n modelID: string;\n time: { created: number };\n tokens?: OpenCodeTokens;\n}\n\ninterface OpenCodeMessageRow {\n id: string;\n data: string;\n}\n\ninterface OpenCodeDatabaseSource {\n kind: \"database\";\n path: string;\n}\n\ninterface OpenCodeLegacySource {\n kind: \"legacy\";\n files: string[];\n}\n\ntype OpenCodeSource = OpenCodeDatabaseSource | OpenCodeLegacySource;\n\nfunction sumOpenCodeTokens(tokens?: OpenCodeTokens): DailyTokenTotals {\n const cacheInput = tokens?.cache?.read ?? 0;\n const cacheOutput = tokens?.cache?.write ?? 0;\n const input = (tokens?.input ?? 0) + cacheInput;\n const output = (tokens?.output ?? 0) + cacheOutput;\n\n return {\n input,\n output,\n cache: { input: cacheInput, output: cacheOutput },\n total: input + output,\n };\n}\n\nasync function parseOpenCodeFile(filePath: string) {\n return readJsonDocument<OpenCodeMessage>(filePath);\n}\n\nfunction getOpenCodeBaseDir() {\n const baseDir = process.env.OPENCODE_DATA_DIR?.trim()\n ? resolve(process.env.OPENCODE_DATA_DIR)\n : join(homedir(), \".local\", \"share\", \"opencode\");\n\n return baseDir;\n}\n\nasync function getOpenCodeSource(): Promise<OpenCodeSource> {\n const baseDir = getOpenCodeBaseDir();\n const databasePath = join(baseDir, \"opencode.db\");\n\n if (existsSync(databasePath)) {\n return { kind: \"database\", path: databasePath };\n }\n\n const messagesDir = join(baseDir, \"storage\", \"message\");\n\n return { kind: \"legacy\", files: await listFilesRecursive(messagesDir, \".json\") };\n}\n\nasync function loadSqliteModule() {\n try {\n const moduleName = \"node:sqlite\";\n\n return await import(moduleName);\n } catch {\n throw new Error(\n \"OpenCode SQLite support requires a Node.js runtime that provides node:sqlite.\",\n );\n }\n}\n\nasync function withoutSqliteExperimentalWarning<T>(callback: () => Promise<T>) {\n const originalEmitWarning = process.emitWarning.bind(process);\n\n process.emitWarning = ((warning: string | Error, ...args: unknown[]) => {\n const warningText =\n typeof warning === \"string\" ? warning : warning.message;\n const warningType =\n warning instanceof Error ? warning.name : String(args[0] ?? \"\");\n\n if (\n warningType === \"ExperimentalWarning\" &&\n /sqlite/i.test(warningText)\n ) {\n return;\n }\n\n return Reflect.apply(originalEmitWarning, process, [\n warning,\n ...args,\n ] as Parameters<typeof process.emitWarning>);\n }) as typeof process.emitWarning;\n\n try {\n return await callback();\n } finally {\n process.emitWarning = originalEmitWarning;\n }\n}\n\nfunction parseOpenCodeMessageData(\n rowId: string,\n sourceLabel: string,\n content: string,\n) {\n const message = parseJsonTextWithLimit<OpenCodeMessage>(content, sourceLabel);\n\n return {\n ...message,\n id: message.id || rowId,\n };\n}\n\nfunction isSqliteLockedError(error: unknown) {\n return error instanceof Error && /database is locked/i.test(error.message);\n}\n\nasync function withDatabaseSnapshot<T>(\n databasePath: string,\n callback: (snapshotPath: string) => Promise<T>,\n) {\n const snapshotDir = await mkdtemp(join(tmpdir(), \"slopmeter-opencode-\"));\n const snapshotPath = join(snapshotDir, \"opencode.db\");\n\n await copyFile(databasePath, snapshotPath);\n\n for (const suffix of [\"-shm\", \"-wal\"]) {\n const companionPath = `${databasePath}${suffix}`;\n\n if (!existsSync(companionPath)) {\n continue;\n }\n\n await copyFile(companionPath, `${snapshotPath}${suffix}`);\n }\n\n try {\n return await callback(snapshotPath);\n } finally {\n await rm(snapshotDir, { recursive: true, force: true });\n }\n}\n\nasync function iterateOpenCodeDatabaseMessages(\n databasePath: string,\n onMessage: (message: OpenCodeMessage) => void,\n) {\n await withoutSqliteExperimentalWarning(async () => {\n const { DatabaseSync } = await loadSqliteModule();\n const database = new DatabaseSync(databasePath, { readOnly: true });\n\n try {\n const statement = database.prepare(\n \"SELECT id, data FROM message ORDER BY time_created ASC\",\n );\n\n for (const row of statement.iterate() as Iterable<OpenCodeMessageRow>) {\n onMessage(\n parseOpenCodeMessageData(\n row.id,\n `${databasePath}:message:${row.id}`,\n row.data,\n ),\n );\n }\n } finally {\n database.close();\n }\n });\n}\n\nasync function loadOpenCodeDatabaseMessages(\n databasePath: string,\n onMessage: (message: OpenCodeMessage) => void,\n) {\n try {\n await iterateOpenCodeDatabaseMessages(databasePath, onMessage);\n } catch (error) {\n if (!isSqliteLockedError(error)) {\n throw error;\n }\n\n await withDatabaseSnapshot(databasePath, async (snapshotPath) => {\n await iterateOpenCodeDatabaseMessages(snapshotPath, onMessage);\n });\n }\n}\n\nfunction addOpenCodeMessage(\n message: OpenCodeMessage,\n start: Date,\n end: Date,\n recentStart: Date,\n totals: DailyTotalsByDate,\n modelTotals: Map<string, ModelTokenTotals>,\n recentModelTotals: Map<string, ModelTokenTotals>,\n dedupe: Set<string>,\n) {\n if (dedupe.has(message.id)) {\n return;\n }\n\n dedupe.add(message.id);\n\n const tokenTotals = sumOpenCodeTokens(message.tokens);\n\n if (tokenTotals.total <= 0) {\n return;\n }\n\n const date = new Date(message.time.created);\n\n if (date < start || date > end) {\n return;\n }\n\n const modelName = normalizeModelName(message.modelID);\n\n addDailyTokenTotals(totals, date, tokenTotals, modelName);\n addModelTokenTotals(modelTotals, modelName, tokenTotals);\n\n if (date >= recentStart) {\n addModelTokenTotals(recentModelTotals, modelName, tokenTotals);\n }\n}\n\nexport async function loadOpenCodeRows(\n start: Date,\n end: Date,\n): Promise<UsageSummary> {\n const source = await getOpenCodeSource();\n const totals: DailyTotalsByDate = new Map();\n const dedupe = new Set<string>();\n const recentStart = getRecentWindowStart(end, 30);\n const modelTotals = new Map<string, ModelTokenTotals>();\n const recentModelTotals = new Map<string, ModelTokenTotals>();\n\n if (source.kind === \"database\") {\n await loadOpenCodeDatabaseMessages(source.path, (message) => {\n addOpenCodeMessage(\n message,\n start,\n end,\n recentStart,\n totals,\n modelTotals,\n recentModelTotals,\n dedupe,\n );\n });\n } else {\n for (const file of source.files) {\n const message = await parseOpenCodeFile(file);\n\n addOpenCodeMessage(\n message,\n start,\n end,\n recentStart,\n totals,\n modelTotals,\n recentModelTotals,\n dedupe,\n );\n }\n }\n\n return createUsageSummary(\n \"opencode\",\n totals,\n modelTotals,\n recentModelTotals,\n end,\n );\n}\n","import type { UsageSummary } from \"./interfaces\";\nimport { loadClaudeRows } from \"./lib/claude-code\";\nimport { loadCodexRows } from \"./lib/codex\";\nimport {\n providerIds,\n providerStatusLabel,\n type ProviderId,\n} from \"./lib/interfaces\";\nimport { loadOpenCodeRows } from \"./lib/open-code\";\nimport { hasUsage } from \"./lib/utils\";\n\nexport { providerIds, providerStatusLabel, type ProviderId };\n\ninterface AggregateUsageOptions {\n start: Date;\n end: Date;\n requestedProviders?: ProviderId[];\n}\n\nexport interface AggregateUsageResult {\n rowsByProvider: Record<ProviderId, UsageSummary | null>;\n warnings: string[];\n}\n\nexport async function aggregateUsage({\n start,\n end,\n requestedProviders,\n}: AggregateUsageOptions): Promise<AggregateUsageResult> {\n const providersToLoad =\n requestedProviders?.length ? requestedProviders : providerIds;\n const rowsByProvider: Record<ProviderId, UsageSummary | null> = {\n claude: null,\n codex: null,\n opencode: null,\n };\n const warnings: string[] = [];\n\n for (const provider of providersToLoad) {\n const summary =\n provider === \"claude\"\n ? await loadClaudeRows(start, end)\n : provider === \"codex\"\n ? await loadCodexRows(start, end, warnings)\n : await loadOpenCodeRows(start, end);\n\n rowsByProvider[provider] = hasUsage(summary) ? summary : null;\n }\n\n return { rowsByProvider, warnings };\n}\n"],"mappings":"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AC,MAAM,QAAQ,eAAe,GAAG;AACnC;IACF;AACA,oBAAgB,QAAQ,SAAU,SAAe;AAC/C,YAAM,OAAO,KAAK,eAAe,OAAO;AACxC,UAAI,KAAK,iBAAiB,QAAQ,IAAI,MAAM,IAAI;AAC9C,cAAM,IAAI,MAAM,KAAK,OAAO,qBAAqB,OAAO,YAAY;MACtE;IACF,EAAE,KAAK,IAAI,CAAC;EACd;EAEA,KAAM,OAAoC;AACxC,QAAI,UAAU,MAAM,KAAK,MACvB;AAEF,QAAK,OAAO;AACV,WAAK,QAAQ,OAAO;AAClB,cAAM,QAAQ,MAAM,IAAI;AACxB,YAAI,UAAU,QAAW;AACvB;QACF;AACA,mBAAW,MAAM,OAAO,OAAO,OAAO,KAAK,IAAI;MACjD;IACF;AACA,eAAW;AACX,SAAK,OAAO;EACd;;;;AC7KK,IAAM,gBAAgB;EAC3B;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AAKK,IAAM,kBAAkB;EAC7B;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AAKK,IAAM,4BAAoE;EAC/E,KAAK;IACD;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;;EAEJ,WAAW;IACP;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;;EAEJ,iBAAiB;IACb;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;;EAEJ,oBAAoB;IAChB;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;;EAEJ,UAAU;IACN;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;;EAEJ,YAAY;IACR;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;;EAEJ,QAAQ;IACJ;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;;EAEJ,QAAQ;IACJ;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;;EAEJ,WAAW;IACP;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;;EAEJ,WAAW;IACP;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;;EAEJ,iBAAiB;IACb;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;;EAEJ,uBAAuB;IACnB;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;;EAEJ,eAAe;IACX;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;;EAEJ,oBAAoB;IAChB;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;;EAEJ,qBAAqB;IACjB;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;;EAEJ,qBAAqB;IACjB;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;;EAEJ,kBAAkB;IACd;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;;EAEJ,gBAAgB;IACZ;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;;EAEJ,WAAW;IACP;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;;EAEJ,WAAW;IACP;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;;EAEJ,WAAW;IACP;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;;EAEJ,WAAW;IACP;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;;EAEJ,WAAW;IACP;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;;EAEJ,kBAAkB;IACd;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;;EAEJ,WAAW;IACP;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;;EAEJ,WAAW;IACP;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;;EAEJ,eAAe;IACX;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;;EAEJ,gBAAgB;IACZ;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;;EAEJ,YAAY;IACR;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;;EAEJ,gBAAgB;IACZ;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;;EAEJ,sBAAsB;IAClB;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;;EAEJ,eAAe;IACX;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;;EAEJ,UAAU;IACN;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;;EAEJ,gBAAgB;IACZ;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;;EAEJ,UAAU;IACN;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;;EAEJ,iBAAiB;IACb;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;;EAEJ,KAAK;IACD;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;;EAEJ,SAAS;IACL;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;;EAEJ,QAAQ;IACJ;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;;EAEJ,kBAAkB;IACd;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;;EAEJ,UAAU;IACN;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;;EAEJ,QAAQ;IACJ;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;;EAEJ,YAAY;IACR;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;;EAEJ,SAAS;IACL;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;;EAEJ,QAAQ;IACJ;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;;EAEJ,WAAW;IACP;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;;EAEJ,WAAW;IACP;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;;EAEJ,YAAY;IACR;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;;EAEJ,kBAAkB;IACd;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;;EAEJ,QAAQ;IACJ;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;;EAEJ,UAAU;IACN;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;;EAEJ,OAAO;IACH;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;;EAEJ,QAAQ;IACJ;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;;EAEJ,SAAS;IACL;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;;EAEJ,OAAO;IACH;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;;EAEJ,UAAU;IACN;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;;EAEJ,UAAU;IACN;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;;EAEJ,QAAQ;IACJ;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;;EAEJ,YAAY;IACR;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;;EAEJ,SAAS;IACL;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;;EAEJ,SAAS;IACL;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;;EAEJ,OAAO;IACH;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;;EAEJ,QAAQ;IACJ;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;I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","names":["resolve","registry","maxBytes","join","join","homedir","join","resolve","resolve","join","homedir","filePath","maxRecordBytes","existsSync","homedir","join","resolve","resolve","join","homedir","existsSync","resolve"]}
|