@ai-sdk-tool/eval 0.1.7 → 1.0.0-canary.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/reporters/console.ts","../src/reporters/console.debug.ts","../src/reporters/json.ts","../src/reporters/index.ts","../src/evaluate.ts","../src/benchmarks/bfcl.ts","../src/utils/paths.ts","../src/benchmarks/bfcl/ast-checker.ts","../src/benchmarks/json-generation.ts"],"sourcesContent":["import { EvaluationResult } from \"@/interfaces\";\n\n// Basic ANSI color codes for console output\nconst colors = {\n reset: \"\\x1b[0m\",\n green: \"\\x1b[32m\",\n red: \"\\x1b[31m\",\n yellow: \"\\x1b[33m\",\n cyan: \"\\x1b[36m\",\n magenta: \"\\x1b[35m\",\n gray: \"\\x1b[90m\",\n};\n\nfunction printResult(result: EvaluationResult) {\n const { model, modelKey, benchmark, result: benchmarkResult } = result;\n const status = benchmarkResult.success\n ? `${colors.green}✔ SUCCESS${colors.reset}`\n : `${colors.red}✖ FAILURE${colors.reset}`;\n\n console.log(\n `\\n ${colors.cyan}[${model}]${colors.reset}${modelKey ? ` ${colors.gray}(${modelKey})${colors.reset}` : \"\"} - ${colors.magenta}${benchmark}${colors.reset}`\n );\n console.log(\n ` └ ${status} | Score: ${colors.yellow}${benchmarkResult.score.toFixed(2)}${colors.reset}`\n );\n\n const metrics = Object.entries(benchmarkResult.metrics);\n if (metrics.length > 0) {\n console.log(\" Metrics:\");\n for (const [key, value] of metrics) {\n console.log(` - ${key}: ${value}`);\n }\n }\n\n if (benchmarkResult.error) {\n console.log(\n ` ${colors.red}Error: ${benchmarkResult.error.message}${colors.reset}`\n );\n }\n}\n\nexport function consoleReporter(results: EvaluationResult[]): void {\n console.log(\"\\n--- 📊 Evaluation Report ---\");\n for (const result of results) {\n printResult(result);\n }\n console.log(\"\\n---------------------------\\n\");\n}\n","import { EvaluationResult } from \"@/interfaces\";\n\nconst colors = {\n reset: \"\\x1b[0m\",\n green: \"\\x1b[32m\",\n red: \"\\x1b[31m\",\n yellow: \"\\x1b[33m\",\n cyan: \"\\x1b[36m\",\n magenta: \"\\x1b[35m\",\n gray: \"\\x1b[90m\",\n bold: \"\\x1b[1m\",\n underline: \"\\x1b[4m\",\n};\n\nfunction colorizeDiffLine(line: string): string {\n if (line.startsWith(\"+\")) return `${colors.green}${line}${colors.reset}`;\n if (line.startsWith(\"-\")) return `${colors.red}${line}${colors.reset}`;\n if (line.startsWith(\"@\"))\n return `${colors.cyan}${colors.bold}${line}${colors.reset}`;\n return line;\n}\n\nfunction uniqueLines(lines: string[]): string[] {\n const seen = new Set<string>();\n const out: string[] = [];\n for (const l of lines) {\n if (seen.has(l)) continue;\n seen.add(l);\n out.push(l);\n }\n return out;\n}\n\nfunction suggestFixFromDiff(parsed: unknown): string[] {\n const suggestions: string[] = [];\n const { error_type, expected, actual, diff } =\n (parsed as Record<string, unknown>) ?? {};\n\n if (\n (Array.isArray(diff) &&\n diff.some((d: unknown) => String(d).includes(\"function name\"))) ||\n (Array.isArray(diff) &&\n diff.some((d: unknown) => String(d).includes(\"missing function:\")))\n ) {\n const expectedName = (expected as Record<string, unknown> | undefined)\n ?.function as string | undefined;\n const actualName = (actual as Record<string, unknown> | undefined)\n ?.function as string | undefined;\n if (expectedName && actualName && expectedName !== actualName) {\n suggestions.push(\n `Call the function '${expectedName}' instead of '${actualName}'.`\n );\n }\n if (Array.isArray((expected as Record<string, unknown>)?.functions)) {\n suggestions.push(\n `Ensure tool calls include: ${((expected as Record<string, unknown>).functions as string[]).join(\", \")}.`\n );\n }\n }\n\n if (\n Array.isArray(diff) &&\n diff.some((d: unknown) => String(d).startsWith(\"- missing required param:\"))\n ) {\n const missing = diff\n .filter((d: unknown) => String(d).startsWith(\"- missing required param:\"))\n .map((d: unknown) => String(d).replace(\"- missing required param: \", \"\"));\n if (missing.length) {\n suggestions.push(`Add required parameter(s): ${missing.join(\", \")}.`);\n }\n }\n\n if (\n Array.isArray(diff) &&\n diff.some((d: unknown) => String(d).startsWith(\"+ unexpected param:\"))\n ) {\n const extras = diff\n .filter((d: unknown) => String(d).startsWith(\"+ unexpected param:\"))\n .map((d: unknown) => String(d).replace(\"+ unexpected param: \", \"\"));\n if (extras.length) {\n suggestions.push(`Remove unexpected parameter(s): ${extras.join(\", \")}.`);\n }\n }\n\n if (\n Array.isArray(diff) &&\n diff.some((d: unknown) => String(d).startsWith(\"@@ param \"))\n ) {\n const targets = diff\n .filter((d: unknown) => String(d).startsWith(\"@@ param \"))\n .map((d: unknown) => String(d).replace(\"@@ param \", \"\"));\n for (const param of targets) {\n const allowedLine = (diff as unknown[]).find((d: unknown) =>\n String(d).startsWith(\"- expected one of:\")\n ) as string | undefined;\n if (allowedLine) {\n const allowed = allowedLine.replace(\"- expected one of: \", \"\");\n suggestions.push(`Set '${param}' to one of: ${allowed}.`);\n } else {\n suggestions.push(`Adjust '${param}' to an allowed value.`);\n }\n }\n }\n\n if (suggestions.length === 0 && typeof error_type === \"string\") {\n if (error_type.includes(\"missing_required\")) {\n suggestions.push(\n \"Add all required parameters defined by the tool schema.\"\n );\n } else if (error_type.includes(\"unexpected_param\")) {\n suggestions.push(\"Remove parameters not present in the tool schema.\");\n } else if (error_type.includes(\"wrong_count\")) {\n suggestions.push(\n \"Adjust the number of tool calls to match expected count.\"\n );\n } else if (error_type.includes(\"wrong_func_name\")) {\n suggestions.push(\"Use the exact expected function name from the schema.\");\n } else if (error_type.includes(\"value_error\")) {\n suggestions.push(\"Choose a value from the allowed options.\");\n }\n }\n\n return uniqueLines(suggestions);\n}\n\nexport function consoleDebugReporter(results: EvaluationResult[]): void {\n console.log(\"\\n--- 📊 Evaluation Report (debug) ---\");\n for (const r of results) {\n const { model, modelKey, benchmark, result } = r;\n const status = result.success\n ? `${colors.green}✔ SUCCESS${colors.reset}`\n : `${colors.red}✖ FAILURE${colors.reset}`;\n\n console.log(\n `\\n ${colors.cyan}[${model}]${colors.reset}${modelKey ? ` ${colors.gray}(${modelKey})${colors.reset}` : \"\"} - ${colors.magenta}${benchmark}${colors.reset}`\n );\n console.log(\n ` └ ${status} | Score: ${colors.yellow}${result.score.toFixed(2)}${colors.reset}`\n );\n\n const metrics = Object.entries(result.metrics);\n if (metrics.length > 0) {\n console.log(\" Metrics:\");\n for (const [k, v] of metrics) console.log(` - ${k}: ${v}`);\n }\n\n if (result.logs && result.logs.length) {\n // Print only failure-related logs prominently. Pass logs stay compact.\n const failLogs = result.logs.filter(\n l =>\n l.startsWith(\"[FAIL]\") ||\n l.startsWith(\"[ERROR]\") ||\n l.startsWith(\"[FATAL]\") ||\n l.startsWith(\"[STACK]\") ||\n l.startsWith(\"[DEBUG-FAIL]\")\n );\n const hasFails = failLogs.length > 0;\n if (hasFails) {\n console.log(` ${colors.bold}Failure details:${colors.reset}`);\n // Build set of IDs that have structured debug entries to prevent duplicate prints\n const debugIds = new Set<string>();\n for (const l of failLogs) {\n if (l.startsWith(\"[DEBUG-FAIL]\")) {\n try {\n const parsed = JSON.parse(l.replace(/^\\[DEBUG-FAIL\\] /, \"\"));\n if (parsed?.id) debugIds.add(String(parsed.id));\n } catch {\n // ignore JSON parse errors for debug lines\n }\n }\n }\n for (const line of failLogs) {\n // Highlight test id and reasons\n if (line.startsWith(\"[FAIL]\")) {\n // Skip duplicate [FAIL] if we also have a [DEBUG-FAIL] for same id\n const m = line.match(/^\\[FAIL\\]\\s+([^:]+):/);\n const failId = m?.[1];\n if (failId && debugIds.has(failId)) continue;\n console.log(` ${colors.red}${line}${colors.reset}`);\n } else if (line.startsWith(\"[ERROR]\") || line.startsWith(\"[FATAL]\")) {\n console.log(` ${colors.yellow}${line}${colors.reset}`);\n } else if (line.startsWith(\"[STACK]\")) {\n console.log(` ${colors.gray}${line}${colors.reset}`);\n } else if (line.startsWith(\"[DEBUG-FAIL]\")) {\n // Attempt to pretty print embedded diffs\n const payload = line.replace(/^\\[DEBUG-FAIL\\] /, \"\");\n try {\n const parsed = JSON.parse(payload);\n const { id, expected, actual, message, diff } = parsed;\n console.log(\n ` ${colors.underline}${id}${colors.reset} ${message ? \"- \" + message : \"\"}`\n );\n if (diff && Array.isArray(diff)) {\n for (const dLine of diff)\n console.log(\" \" + colorizeDiffLine(dLine));\n } else {\n console.log(\" expected:\");\n console.log(\n colors.green +\n \" \" +\n JSON.stringify(expected, null, 2)\n .split(\"\\n\")\n .join(\"\\n \") +\n colors.reset\n );\n console.log(\" actual:\");\n console.log(\n colors.red +\n \" \" +\n JSON.stringify(actual, null, 2)\n .split(\"\\n\")\n .join(\"\\n \") +\n colors.reset\n );\n }\n const suggestions = suggestFixFromDiff(parsed);\n if (suggestions.length) {\n console.log(\n ` ${colors.bold}Suggested fix:${colors.reset}`\n );\n for (const s of suggestions) console.log(` • ${s}`);\n }\n } catch {\n console.log(` ${line}`);\n }\n }\n }\n } else {\n // Compact debug lines on success\n const info = result.logs.filter(\n l => l.startsWith(\"[INFO]\") || l.startsWith(\"[PASS]\")\n );\n for (const line of info)\n console.log(` ${colors.gray}${line}${colors.reset}`);\n }\n }\n }\n\n console.log(\"\\n------------------------------------\\n\");\n}\n","import { EvaluationResult } from \"@/interfaces\";\n\nexport function jsonReporter(results: EvaluationResult[]): void {\n // Output the raw results array as a JSON string.\n // The 'error' object is converted to a string for serialization.\n const serializableResults = results.map(r => ({\n ...r,\n result: {\n ...r.result,\n error: r.result.error?.message,\n },\n }));\n console.log(JSON.stringify(serializableResults, null, 2));\n}\n","import { EvaluationResult, ReporterType } from \"@/interfaces\";\n\nimport { consoleReporter } from \"./console\";\nimport { consoleDebugReporter } from \"./console.debug\";\nimport { jsonReporter } from \"./json\";\n\nexport const reporters: Record<\n ReporterType,\n (results: EvaluationResult[]) => void\n> = {\n console: consoleReporter,\n json: jsonReporter,\n \"console.debug\": consoleDebugReporter,\n};\n","import { LanguageModel } from \"ai\";\n\nimport {\n EvaluateOptions,\n EvaluationResult,\n LanguageModelV2Benchmark,\n} from \"./interfaces\";\nimport { reporters } from \"./reporters\";\n\nasync function runSingleBenchmark(\n model: LanguageModel,\n benchmark: LanguageModelV2Benchmark,\n modelKey?: string,\n config?: Record<string, unknown>\n): Promise<EvaluationResult> {\n const modelId =\n typeof model === \"object\" &&\n model !== null &&\n \"modelId\" in model &&\n typeof model.modelId === \"string\"\n ? model.modelId\n : \"unknown-model\";\n\n try {\n console.log(\n `[${modelId}]${modelKey ? ` (${modelKey})` : \"\"} Running benchmark: ${benchmark.name}...`\n );\n const result = await benchmark.run(model, config);\n console.log(\n `[${modelId}]${modelKey ? ` (${modelKey})` : \"\"} Finished benchmark: ${benchmark.name}. Score: ${result.score}`\n );\n return {\n model: modelId,\n modelKey,\n benchmark: benchmark.name,\n result,\n };\n } catch (error) {\n console.error(\n `[${modelId}]${modelKey ? ` (${modelKey})` : \"\"} Error running benchmark: ${benchmark.name}`,\n error\n );\n return {\n model: modelId,\n modelKey,\n benchmark: benchmark.name,\n result: {\n score: 0,\n success: false,\n metrics: {},\n error: error instanceof Error ? error : new Error(String(error)),\n },\n };\n }\n}\n\nexport async function evaluate(\n options: EvaluateOptions\n): Promise<EvaluationResult[]> {\n const {\n models,\n benchmarks,\n reporter = \"console\",\n temperature,\n maxTokens,\n } = options;\n\n const modelEntries: Array<[string | undefined, LanguageModel]> = [];\n if (Array.isArray(models)) {\n for (const m of models) modelEntries.push([undefined, m]);\n } else if (\n typeof models === \"object\" &&\n models !== null &&\n \"modelId\" in (models as Record<string, unknown>)\n ) {\n modelEntries.push([undefined, models as unknown as LanguageModel]);\n } else {\n for (const [key, m] of Object.entries(\n models as Record<string, LanguageModel>\n )) {\n modelEntries.push([key, m]);\n }\n }\n const allResults: EvaluationResult[] = [];\n\n for (const [modelKey, model] of modelEntries) {\n for (const benchmark of benchmarks) {\n const config: Record<string, unknown> = {};\n if (temperature !== undefined) config.temperature = temperature;\n if (maxTokens !== undefined) config.maxTokens = maxTokens;\n\n const evaluationResult = await runSingleBenchmark(\n model,\n benchmark,\n modelKey,\n Object.keys(config).length > 0 ? config : undefined\n );\n allResults.push(evaluationResult);\n }\n }\n\n const report = reporters[reporter];\n if (report) {\n report(allResults);\n } else {\n console.warn(`Unknown reporter: '${reporter}'. Defaulting to console.`);\n reporters.console(allResults);\n }\n\n return allResults;\n}\n","import { generateText, jsonSchema, LanguageModel, tool } from \"ai\";\nimport { promises as fs } from \"fs\";\nimport path from \"path\";\n\nimport { BenchmarkResult, LanguageModelV2Benchmark } from \"@/interfaces\";\nimport { resolveDataDir } from \"@/utils/paths\";\n\nimport {\n FunctionDescription,\n multipleFunctionChecker,\n parallelFunctionCheckerNoOrder,\n simpleFunctionChecker,\n ToolCall,\n} from \"./bfcl/ast-checker\";\n\n// Resolve data files relative to this module using ESM-safe utilities\n\n// --- Interfaces ---\ninterface ToolSchemaObject {\n type: string;\n properties?: Record<string, unknown>;\n items?: unknown;\n required?: string[];\n [key: string]: unknown;\n}\n\ninterface ToolSpec {\n name: string;\n description?: string;\n parameters: ToolSchemaObject;\n}\n\ntype Message = { role: string; content: string };\n\ninterface TestCase {\n id: string;\n question: Message[] | Message[][];\n function: ToolSpec[];\n}\n\ninterface TransformedTool {\n type: \"function\";\n name: string;\n description?: string;\n inputSchema: ToolSchemaObject;\n}\n\ninterface PossibleAnswer {\n id: string;\n ground_truth: unknown;\n}\n\n// --- Generic Checker Dispatcher ---\nfunction check(\n testCase: TestCase,\n modelOutput: unknown, // This is an array of tool_calls\n possibleAnswer: PossibleAnswer\n): { valid: boolean; error?: string; error_type?: string } {\n const category = testCase.id.split(\"_\")[0];\n\n try {\n if (category === \"simple\") {\n if (!Array.isArray(modelOutput) || modelOutput.length !== 1) {\n return {\n valid: false,\n error: `Expected 1 function call, but got ${Array.isArray(modelOutput) ? modelOutput.length : 0}.`,\n error_type: \"simple:wrong_count\",\n };\n }\n return simpleFunctionChecker(\n testCase.function[0] as unknown as FunctionDescription,\n modelOutput[0] as ToolCall,\n (possibleAnswer.ground_truth as Array<Record<string, unknown>>)[0]\n );\n } else if (category === \"parallel\") {\n return parallelFunctionCheckerNoOrder(\n testCase.function as unknown as FunctionDescription[],\n modelOutput as ToolCall[],\n possibleAnswer.ground_truth as Array<Record<string, unknown>>\n );\n } else if (category === \"multiple\") {\n return multipleFunctionChecker(\n testCase.function as unknown as FunctionDescription[],\n modelOutput as ToolCall[],\n possibleAnswer.ground_truth as Array<Record<string, unknown>>\n );\n } else if (category.includes(\"parallel-multiple\")) {\n // parallel-multiple is just a more complex parallel case\n return parallelFunctionCheckerNoOrder(\n testCase.function as unknown as FunctionDescription[],\n modelOutput as ToolCall[],\n possibleAnswer.ground_truth as Array<Record<string, unknown>>\n );\n }\n\n // Default for unimplemented categories (like multi_turn)\n // As per user request, we are deferring multi-turn.\n return { valid: true }; // Pass to not fail the whole benchmark\n } catch (e: unknown) {\n return {\n valid: false,\n error: `Checker Error: ${(e as Error).message}`,\n error_type: \"checker_error\",\n };\n }\n}\n\n// --- Generic Benchmark Runner Factory ---\nfunction createBfclBenchmark(\n name: string,\n description: string,\n testDataFile: string,\n answerDataFile: string\n): LanguageModelV2Benchmark {\n return {\n name,\n version: \"1.0.0\",\n description,\n async run(\n model: LanguageModel,\n config?: Record<string, unknown>\n ): Promise<BenchmarkResult> {\n const logs: string[] = [];\n let correctCount = 0;\n let testCases: TestCase[] = [];\n\n try {\n // Resolve data directory in a way that works both in monorepo and when installed as a dependency.\n const dataPath = resolveDataDir();\n logs.push(`[INFO] Using data dir: ${dataPath}`);\n const testCasesJson = await fs.readFile(\n path.join(dataPath, testDataFile),\n \"utf-8\"\n );\n const possibleAnswersJson = await fs.readFile(\n path.join(dataPath, answerDataFile),\n \"utf-8\"\n );\n\n // The BFCL datasets are in JSON Lines (NDJSON) format: one JSON object per line.\n // Parse them line-by-line instead of as a single JSON value.\n testCases = testCasesJson\n .split(/\\r?\\n/)\n .filter(line => line.trim().length > 0)\n .map(line => JSON.parse(line));\n const possibleAnswers: PossibleAnswer[] = possibleAnswersJson\n .split(/\\r?\\n/)\n .filter(line => line.trim().length > 0)\n .map(line => JSON.parse(line));\n const possibleAnswersMap = new Map(\n possibleAnswers.map(ans => [ans.id, ans])\n );\n\n // Optional: limit number of test cases via env for faster local runs\n const limitEnv = process.env.BFCL_LIMIT;\n const limit = limitEnv ? Number(limitEnv) : undefined;\n if (limit && Number.isFinite(limit) && limit > 0) {\n testCases = testCases.slice(0, limit);\n logs.push(\n `[INFO] Limiting test cases to ${limit} due to BFCL_LIMIT.`\n );\n }\n\n // Helper: fix BFCL JSON schema types to OpenAI-compatible JSON Schema\n const fixSchema = (schema: unknown): unknown => {\n if (!schema || typeof schema !== \"object\")\n return { type: \"object\", properties: {} };\n const copy: ToolSchemaObject | unknown[] = Array.isArray(schema)\n ? (schema as unknown[]).map(v => fixSchema(v))\n : ({ ...(schema as Record<string, unknown>) } as ToolSchemaObject);\n if (!Array.isArray(copy)) {\n if (copy.type) {\n if (copy.type === \"dict\") copy.type = \"object\";\n if (copy.type === \"integer\" || copy.type === \"float\")\n copy.type = \"number\";\n }\n if (copy.properties && typeof copy.properties === \"object\") {\n for (const k of Object.keys(copy.properties)) {\n (copy.properties as Record<string, unknown>)[k] = fixSchema(\n (copy.properties as Record<string, unknown>)[k]\n );\n }\n }\n if (copy.items) copy.items = fixSchema(copy.items);\n return copy;\n }\n return copy;\n };\n\n // Concurrency control via env BFCL_CONCURRENCY (default 4)\n const concurrencyEnv = process.env.BFCL_CONCURRENCY;\n const concurrency =\n concurrencyEnv && Number.isFinite(Number(concurrencyEnv))\n ? Math.max(1, Number(concurrencyEnv))\n : 4;\n logs.push(\n `[INFO] Running ${testCases.length} test cases with concurrency=${concurrency}`\n );\n\n // Per-test runner that does not throw and returns its own logs\n const runSingleCase = async (\n testCase: TestCase\n ): Promise<{ valid: boolean; logs: string[] }> => {\n const caseLogs: string[] = [];\n const { function: tools, question: messages } = testCase;\n const temp = config?.temperature;\n const temperature = typeof temp === \"number\" ? temp : undefined;\n const maxTok = config?.maxTokens;\n const maxTokens = typeof maxTok === \"number\" ? maxTok : undefined;\n\n try {\n // Flatten BFCL message shape [[{role, content}], ...] to [{role, content}, ...]\n const flatMessages =\n Array.isArray(messages) &&\n (messages as unknown[]).some(m => Array.isArray(m))\n ? (messages as unknown[] as Message[][]).flat(1)\n : (messages as Message[]);\n\n // Build tools array (LanguageModelV2FunctionTool[]) for middleware compatibility\n // Keep a mapping sanitized -> original to restore before checking\n const nameMap = new Map<string, string>();\n const sanitizeName = (name: string) => {\n // OpenAI-compatible: letters, digits, underscores and dashes, max 64\n const s = name.replace(/[^a-zA-Z0-9_-]/g, \"_\").slice(0, 64);\n return s.length > 0 ? s : \"tool\";\n };\n\n const transformedTools: TransformedTool[] = (\n tools as ToolSpec[]\n ).map(t => {\n const fixed = fixSchema(t.parameters);\n // Ensure we always provide a valid JSON Schema object of type 'object'\n const isObjectSchema =\n fixed &&\n typeof fixed === \"object\" &&\n (fixed as ToolSchemaObject).type === \"object\";\n const inputSchema: ToolSchemaObject = isObjectSchema\n ? (fixed as ToolSchemaObject)\n : { type: \"object\", properties: {} };\n\n const sanitized = sanitizeName(t.name);\n nameMap.set(sanitized, t.name);\n\n return {\n type: \"function\" as const,\n name: sanitized,\n description: t.description,\n inputSchema: inputSchema,\n };\n });\n\n // Convert to ToolSet expected by generateText\n const toolsMap = Object.fromEntries(\n transformedTools.map(t => [\n t.name,\n tool({\n description:\n typeof t.description === \"string\"\n ? t.description\n : undefined,\n inputSchema: jsonSchema(t.inputSchema as unknown as any),\n }),\n ])\n );\n\n // Debug: record first tool object and schema type\n try {\n const firstTool = transformedTools[0];\n const schemaType =\n (firstTool as any)?.inputSchema?.type ??\n (firstTool as any)?.inputSchema?.jsonSchema?.type;\n caseLogs.push(\n `[DEBUG] ${testCase.id}: firstTool=${JSON.stringify(firstTool)}, schemaType=${schemaType}`\n );\n } catch (e: unknown) {\n caseLogs.push(\n `[DEBUG] ${testCase.id}: failed to introspect tools: ${(e as Error).message}`\n );\n }\n\n const { toolCalls, text, finishReason } = await generateText({\n model,\n messages: flatMessages as unknown as any,\n tools: toolsMap,\n toolChoice: \"auto\",\n ...(temperature !== undefined ? { temperature } : {}),\n ...(maxTokens !== undefined\n ? { maxOutputTokens: maxTokens }\n : {}),\n });\n\n // Debug: raw toolCalls\n try {\n caseLogs.push(\n `[DEBUG] ${testCase.id}: rawToolCalls=${JSON.stringify(toolCalls)}, finishReason=${finishReason}, text=${JSON.stringify(text)}`\n );\n } catch {\n caseLogs.push(\n `[DEBUG] ${testCase.id}: failed to serialize toolCalls`\n );\n }\n\n const possibleAnswer = possibleAnswersMap.get(testCase.id);\n if (!possibleAnswer) {\n throw new Error(`No possible answer for id: ${testCase.id}`);\n }\n\n // Restore original tool names in toolCalls before checking\n const restoredCalls = (toolCalls || []).map((c: any) => {\n const rawName = (c as any).toolName ?? (c as any).name;\n // Some providers (e.g., response-format models) may encode tool name as a numeric index string\n const sanitizedFromIndex =\n typeof rawName === \"string\" && /^\\d+$/.test(rawName)\n ? (transformedTools[Number(rawName)]?.name ?? rawName)\n : rawName;\n const originalName =\n nameMap.get(sanitizedFromIndex) ?? sanitizedFromIndex;\n const extractedArgs =\n (c as any).args ??\n (c as any).arguments ??\n (c as any).input ??\n (c as any).params ??\n (c as any).parameters ??\n undefined;\n let parsedArgs = extractedArgs;\n if (typeof parsedArgs === \"string\") {\n try {\n parsedArgs = JSON.parse(parsedArgs);\n } catch {\n // leave as string if not JSON\n }\n }\n return {\n ...c,\n toolName: originalName,\n name: originalName,\n args: parsedArgs ?? {},\n };\n });\n\n const checkerResult = check(\n testCase,\n restoredCalls,\n possibleAnswer\n );\n\n if (checkerResult.valid) {\n caseLogs.push(`[PASS] ${testCase.id}`);\n return { valid: true, logs: caseLogs };\n } else {\n caseLogs.push(`[FAIL] ${testCase.id}: ${checkerResult.error}`);\n try {\n // Build a compact expectation/actual summary and a human-friendly diff\n const category = testCase.id.split(\"_\")[0];\n const diff: string[] = [];\n const summarizeArgs = (args: unknown): unknown => {\n if (args == null) return args;\n if (typeof args !== \"object\") return args;\n // Sort object keys for stable output\n return Object.keys(args)\n .sort()\n .reduce(\n (acc: Record<string, unknown>, k) => {\n acc[k] = (args as Record<string, unknown>)[k];\n return acc;\n },\n {} as Record<string, unknown>\n );\n };\n\n const expected: Record<string, unknown> = {};\n const actual: Record<string, unknown> = {};\n\n if (category === \"simple\") {\n const funcDesc = (tools as ToolSpec[])[0];\n const gt = (possibleAnswer as { ground_truth?: unknown[] })\n .ground_truth?.[0] as Record<string, unknown> | undefined;\n const expectedFuncName = funcDesc?.name;\n const expectedParams = gt\n ? gt[Object.keys(gt)[0]]\n : undefined;\n const received = (restoredCalls as any[])[0];\n const receivedName = received?.toolName ?? received?.name;\n const receivedArgs = summarizeArgs(received?.args);\n\n expected.function = expectedFuncName;\n expected.params = expectedParams;\n actual.function = receivedName;\n actual.args = receivedArgs;\n\n if (expectedFuncName !== receivedName) {\n diff.push(`@@ function name`);\n diff.push(`- ${expectedFuncName}`);\n diff.push(`+ ${receivedName}`);\n }\n if (\n expectedParams &&\n receivedArgs &&\n typeof receivedArgs === \"object\" &&\n receivedArgs !== null\n ) {\n const required = (funcDesc?.parameters?.required ??\n []) as string[];\n // Missing required\n for (const req of required) {\n if (!(req in receivedArgs)) {\n diff.push(`- missing required param: ${req}`);\n }\n }\n // Unexpected\n for (const k of Object.keys(\n receivedArgs as Record<string, unknown>\n )) {\n if (\n !Object.prototype.hasOwnProperty.call(expectedParams, k)\n ) {\n diff.push(`+ unexpected param: ${k}`);\n }\n }\n // Invalid values\n for (const k of Object.keys(\n receivedArgs as Record<string, unknown>\n )) {\n if (\n Object.prototype.hasOwnProperty.call(expectedParams, k)\n ) {\n const allowed = (\n expectedParams as Record<string, unknown[]>\n )[k];\n const got = (receivedArgs as Record<string, unknown>)[\n k\n ];\n const includes =\n Array.isArray(allowed) &&\n allowed.some((v: unknown) => {\n try {\n if (Array.isArray(got)) {\n return (\n JSON.stringify(\n got.map(x => String(x)).sort()\n ) ===\n JSON.stringify(\n (v as unknown[]).map(x => String(x)).sort()\n )\n );\n }\n } catch {\n void 0;\n }\n return (\n String(v).toLowerCase().replace(/\\s+/g, \"\") ===\n String(got).toLowerCase().replace(/\\s+/g, \"\")\n );\n });\n if (!includes) {\n diff.push(`@@ param ${k}`);\n diff.push(\n `- expected one of: ${JSON.stringify(allowed)}`\n );\n diff.push(`+ got: ${JSON.stringify(got)}`);\n }\n }\n }\n }\n } else {\n // Parallel / multiple: show function name sets and param-level diffs per matched function\n const gtArr: Array<Record<string, unknown>> =\n (\n possibleAnswer as {\n ground_truth?: Array<Record<string, unknown>>;\n }\n ).ground_truth ?? [];\n const expectedNames = gtArr.map(g => Object.keys(g)[0]);\n const actualNames = (restoredCalls as any[]).map(\n c => c.toolName ?? c.name\n );\n expected.functions = expectedNames;\n actual.functions = actualNames;\n\n if (expectedNames.length !== actualNames.length) {\n diff.push(`@@ call count`);\n diff.push(`- expected ${expectedNames.length}`);\n diff.push(`+ got ${actualNames.length}`);\n }\n\n const missing = expectedNames.filter(\n n => !actualNames.includes(n)\n );\n const extra = actualNames.filter(\n n => !expectedNames.includes(n)\n );\n for (const m of missing)\n diff.push(`- missing function: ${m}`);\n for (const e of extra)\n diff.push(`+ unexpected function: ${e}`);\n\n // Attempt to compute param-level diffs for functions that exist in both expected and actual\n const usedActual = new Set<number>();\n for (const expectedObj of gtArr) {\n const fname = Object.keys(expectedObj)[0];\n // Find a matching actual call not yet used\n let matchedIndex = -1;\n for (let i = 0; i < (restoredCalls as any[]).length; i++) {\n if (usedActual.has(i)) continue;\n const rc = (restoredCalls as any[])[i];\n const rcName = rc?.toolName ?? rc?.name;\n if (rcName === fname) {\n matchedIndex = i;\n break;\n }\n }\n if (matchedIndex === -1) continue; // already reported as missing above\n usedActual.add(matchedIndex);\n\n const received = (restoredCalls as any[])[matchedIndex];\n const receivedArgs = summarizeArgs(received?.args);\n\n // expected parameters allowed values\n const expectedParamsAllowed = expectedObj[fname] as Record<\n string,\n unknown\n >;\n const funcDesc = (tools as ToolSpec[]).find(\n (t: ToolSpec) => t.name === fname\n );\n const requiredParams = (funcDesc?.parameters?.required ??\n []) as string[];\n\n diff.push(`@@ function ${fname}`);\n\n if (\n expectedParamsAllowed &&\n receivedArgs &&\n typeof receivedArgs === \"object\" &&\n receivedArgs !== null\n ) {\n // Missing required\n for (const req of requiredParams) {\n if (!(req in receivedArgs)) {\n diff.push(`- missing required param: ${req}`);\n }\n }\n // Unexpected params\n for (const k of Object.keys(\n receivedArgs as Record<string, unknown>\n )) {\n if (\n !Object.prototype.hasOwnProperty.call(\n expectedParamsAllowed,\n k\n )\n ) {\n diff.push(`+ unexpected param: ${k}`);\n }\n }\n // Invalid values\n for (const k of Object.keys(\n receivedArgs as Record<string, unknown>\n )) {\n if (\n Object.prototype.hasOwnProperty.call(\n expectedParamsAllowed,\n k\n )\n ) {\n const allowed = (\n expectedParamsAllowed as Record<string, unknown[]>\n )[k];\n const got = (receivedArgs as Record<string, unknown>)[\n k\n ];\n const includes =\n Array.isArray(allowed) &&\n allowed.some((v: unknown) => {\n try {\n if (Array.isArray(got)) {\n return (\n JSON.stringify(\n got.map(x => String(x)).sort()\n ) ===\n JSON.stringify(\n (v as unknown[])\n .map(x => String(x))\n .sort()\n )\n );\n }\n } catch {\n void 0;\n }\n return (\n String(v).toLowerCase().replace(/\\s+/g, \"\") ===\n String(got).toLowerCase().replace(/\\s+/g, \"\")\n );\n });\n if (!includes) {\n diff.push(`@@ param ${k}`);\n diff.push(\n `- expected one of: ${JSON.stringify(allowed)}`\n );\n diff.push(`+ got: ${JSON.stringify(got)}`);\n }\n }\n }\n }\n }\n }\n\n caseLogs.push(\n `[DEBUG-FAIL] ${JSON.stringify({\n id: testCase.id,\n message: checkerResult.error,\n error_type: checkerResult.error_type,\n expected,\n actual,\n diff,\n })}`\n );\n } catch {\n caseLogs.push(\n `[DEBUG] ${testCase.id}: failed to build debug diff`\n );\n }\n return { valid: false, logs: caseLogs };\n }\n } catch (e: any) {\n caseLogs.push(\n `[ERROR] ${testCase.id}: Model generation failed: ${e?.message}`\n );\n if (e?.stack) {\n caseLogs.push(`[STACK] ${testCase.id}: ${e.stack}`);\n }\n return { valid: false, logs: caseLogs };\n }\n };\n\n // Generic concurrency mapper\n const mapWithConcurrency = async <T, R>(\n items: T[],\n limit: number,\n mapper: (item: T, index: number) => Promise<R>\n ): Promise<R[]> => {\n const results = new Array<R>(items.length);\n let idx = 0;\n const workers = new Array(Math.min(limit, items.length))\n .fill(0)\n .map(async () => {\n while (true) {\n const current = idx++;\n if (current >= items.length) break;\n results[current] = await mapper(items[current], current);\n }\n });\n await Promise.all(workers);\n return results;\n };\n\n const resultsPerCase = await mapWithConcurrency(\n testCases,\n concurrency,\n async tc => runSingleCase(tc)\n );\n\n // Aggregate\n correctCount = resultsPerCase.reduce(\n (acc, r) => acc + (r.valid ? 1 : 0),\n 0\n );\n for (const r of resultsPerCase) logs.push(...r.logs);\n\n if (testCases.length === 0) {\n return {\n score: 0,\n success: false,\n metrics: {},\n logs: [\"No test cases found.\"],\n };\n }\n\n const score = correctCount / testCases.length;\n return {\n score,\n success: score > 0.95, // High success threshold as requested\n metrics: {\n correct_count: correctCount,\n total_cases: testCases.length,\n accuracy: score,\n },\n logs,\n };\n } catch (e: any) {\n return {\n score: 0,\n success: false,\n metrics: {},\n error: e,\n logs: [`[FATAL] Failed to run benchmark ${name}: ${e.message}`],\n };\n }\n },\n };\n}\n\n// --- Exported Benchmark Instances ---\nexport const bfclSimpleBenchmark = createBfclBenchmark(\n \"bfcl-simple\",\n \"BFCL Simple Function Calling\",\n \"BFCL_v3_simple.json\",\n \"BFCL_v3_simple_possible_answer.json\"\n);\n\nexport const bfclParallelBenchmark = createBfclBenchmark(\n \"bfcl-parallel\",\n \"BFCL Parallel Function Calling\",\n \"BFCL_v3_parallel.json\",\n \"BFCL_v3_parallel_possible_answer.json\"\n);\n\nexport const bfclMultipleBenchmark = createBfclBenchmark(\n \"bfcl-multiple\",\n \"BFCL Multiple Function Calling\",\n \"BFCL_v3_multiple.json\",\n \"BFCL_v3_multiple_possible_answer.json\"\n);\n\nexport const bfclParallelMultipleBenchmark = createBfclBenchmark(\n \"bfcl-parallel-multiple\",\n \"BFCL Parallel & Multiple Function Calling\",\n \"BFCL_v3_parallel_multiple.json\",\n \"BFCL_v3_parallel_multiple_possible_answer.json\"\n);\n","import fs from \"fs\";\nimport { createRequire } from \"module\";\nimport path from \"path\";\nimport { fileURLToPath } from \"url\";\n\n/**\n * Resolve the directory that holds the eval datasets.\n * Order:\n * 1) BFCL_DATA_DIR env var override\n * 2) Resolve the installed package root via require.resolve(\"@ai-sdk-tool/eval\") and use its sibling 'data'\n * 3) Resolve the installed package root via require.resolve(\"@ai-sdk-tool/eval/package.json\") and use its sibling 'data'\n * 4) Walk up from current module location to find nearest sibling 'data' directory\n * 5) Fallback to package-root/data assuming dist/benchmarks depth or cwd\n * 3) Walk up from current module location to find nearest sibling 'data' directory\n * 4) Fallback to package-root/data assuming dist/benchmarks depth or cwd\n */\nexport function resolveDataDir(fromModuleUrl?: string): string {\n // 0) Use provided module URL when available; otherwise rely on require/cwd fallbacks (avoids import.meta in CJS)\n const moduleUrl = fromModuleUrl;\n\n // 1) Explicit override\n const override = process.env.BFCL_DATA_DIR;\n if (override && override.trim().length > 0) {\n return override;\n }\n\n // 2) Resolve via installed package location (works with pnpm workspaces and published package)\n try {\n // Prefer resolving the package main entry (exported by package.json) so we don't rely on exporting package.json\n const baseForRequireEntry =\n (typeof moduleUrl === \"string\" && moduleUrl) ||\n path.join(process.cwd(), \"package.json\");\n const requireFromEntry = createRequire(baseForRequireEntry);\n const entryPath = requireFromEntry.resolve(\"@ai-sdk-tool/eval\");\n const entryDir = path.dirname(entryPath);\n // If entry is in dist/, walk up to package root and locate 'data'\n const guessPkgRoot = fs.existsSync(path.join(entryDir, \"..\"))\n ? path.resolve(entryDir, \"..\")\n : entryDir;\n const dataAtRoot = path.join(guessPkgRoot, \"data\");\n if (fs.existsSync(dataAtRoot)) return dataAtRoot;\n } catch {\n // ignore and continue to other strategies\n }\n\n try {\n // In CJS builds, import.meta.url may be empty. Fallback to cwd package.json path for a valid base.\n const baseForRequire =\n (typeof moduleUrl === \"string\" && moduleUrl) ||\n path.join(process.cwd(), \"package.json\");\n const require = createRequire(baseForRequire);\n // Resolve this package's package.json location\n const pkgJsonPath = require.resolve(\"@ai-sdk-tool/eval/package.json\");\n const pkgDir = path.dirname(pkgJsonPath);\n const dataAtPkg = path.join(pkgDir, \"data\");\n if (fs.existsSync(dataAtPkg)) return dataAtPkg;\n } catch {\n // ignore if resolution fails (e.g., unusual environments)\n }\n\n // 3) Walk up a few levels to find a 'data' directory from the module URL\n let startDir: string;\n if (moduleUrl) {\n try {\n startDir = path.dirname(fileURLToPath(moduleUrl));\n } catch {\n // In case moduleUrl is invalid or unavailable, fall back to cwd\n startDir = process.cwd();\n }\n } else {\n startDir = process.cwd();\n }\n let dir = startDir;\n for (let i = 0; i < 6; i++) {\n const dataCandidate = path.join(dir, \"data\");\n if (fs.existsSync(dataCandidate)) return dataCandidate;\n const parent = path.resolve(dir, \"..\");\n if (parent === dir) break; // reached filesystem root\n dir = parent;\n }\n\n // 4) Fallback to packageRoot/data assuming dist/benchmarks -> dist -> packageRoot\n const pkgRoot = path.resolve(startDir, \"..\", \"..\");\n return path.join(pkgRoot, \"data\");\n}\n","// Local ToolCall interface for type safety, as it's not exported from 'ai'.\nexport interface ToolCall {\n toolCallId: string;\n toolName: string;\n args: unknown;\n}\n\n// --- Type Definitions ---\nexport interface FunctionDescription {\n name: string;\n description?: string;\n parameters: {\n type: \"object\";\n properties: {\n [key: string]: {\n type: string;\n description?: string;\n items?: { type: string };\n };\n };\n required: string[];\n };\n}\n\n/**\n * Standardizes a string for comparison.\n */\nfunction standardizeString(input: string): string {\n if (typeof input !== \"string\") return input;\n const regex = /[ ,./\\\\-_*^]/g;\n return input.replace(regex, \"\").toLowerCase().replace(/'/g, '\"');\n}\n\n/**\n * Checks a string value against possible answers.\n */\nfunction checkStringValue(\n param: string,\n modelValue: string,\n possibleAnswers: unknown[]\n): { valid: boolean; error?: string; error_type?: string } {\n const standardizedModelValue = standardizeString(modelValue);\n const standardizedPossibleAnswers = possibleAnswers.map(ans =>\n standardizeString(String(ans))\n );\n\n if (!standardizedPossibleAnswers.includes(standardizedModelValue)) {\n return {\n valid: false,\n error: `Invalid value for parameter '${param}': ${JSON.stringify(\n modelValue\n )}. Expected one of ${JSON.stringify(possibleAnswers)}.`,\n error_type: \"value_error:string\",\n };\n }\n return { valid: true };\n}\n\n/**\n * Main checker for a single function call.\n * Aligned with the `ai` package's `ToolCall` type.\n */\nexport function simpleFunctionChecker(\n funcDescription: FunctionDescription,\n modelToolCall: ToolCall,\n possibleAnswer: Record<string, unknown>\n): { valid: boolean; error?: string; error_type?: string } {\n const modelArgs = modelToolCall.args;\n const modelFuncName = modelToolCall.toolName;\n const expectedFuncName = funcDescription.name;\n const expectedParams = funcDescription.parameters.properties;\n const requiredParams = funcDescription.parameters.required;\n\n if (modelFuncName !== expectedFuncName) {\n return {\n valid: false,\n error: `Function name '${modelFuncName}' does not match expected '${expectedFuncName}'.`,\n error_type: \"simple_function_checker:wrong_func_name\",\n };\n }\n\n const possibleAnswerParams = possibleAnswer[\n Object.keys(possibleAnswer)[0]\n ] as Record<string, unknown>;\n\n const argsObj: Record<string, unknown> =\n modelArgs && typeof modelArgs === \"object\"\n ? (modelArgs as Record<string, unknown>)\n : {};\n\n for (const param of requiredParams) {\n if (!(param in argsObj)) {\n return {\n valid: false,\n error: `Missing required parameter: '${param}'.`,\n error_type: \"simple_function_checker:missing_required\",\n };\n }\n }\n\n if (modelArgs && typeof modelArgs === \"object\") {\n for (const paramName of Object.keys(argsObj)) {\n const modelValue = argsObj[paramName];\n if (\n !(paramName in expectedParams) ||\n !(paramName in possibleAnswerParams)\n ) {\n return {\n valid: false,\n error: `Unexpected parameter: '${paramName}'.`,\n error_type: \"simple_function_checker:unexpected_param\",\n };\n }\n\n const possibleValues = possibleAnswerParams[paramName] as unknown;\n\n if (typeof modelValue === \"string\") {\n const result = checkStringValue(\n paramName,\n modelValue,\n (possibleValues as unknown[] | undefined) ?? []\n );\n if (!result.valid) return result;\n } else if (Array.isArray(modelValue)) {\n const modelValueStr = JSON.stringify(\n modelValue.map(v => standardizeString(String(v))).sort()\n );\n const hasMatch = Array.isArray(possibleValues)\n ? (possibleValues as unknown[]).some(p => {\n if (!Array.isArray(p)) return false;\n return (\n JSON.stringify(\n p.map(v => standardizeString(String(v))).sort()\n ) === modelValueStr\n );\n })\n : false;\n if (!hasMatch) {\n return {\n valid: false,\n error: `Invalid value for list parameter '${paramName}'. Got ${JSON.stringify(\n modelValue\n )}. Expected one of ${JSON.stringify(possibleValues)}.`,\n error_type: \"value_error:list\",\n };\n }\n } else {\n // Handle nested objects by comparing JSON representations\n const hasMatch = Array.isArray(possibleValues)\n ? (possibleValues as unknown[]).some(possibleValue => {\n // Direct equality check first\n if (modelValue === possibleValue) return true;\n\n // For objects, perform deep comparison via JSON serialization\n if (\n typeof modelValue === \"object\" &&\n modelValue !== null &&\n typeof possibleValue === \"object\" &&\n possibleValue !== null\n ) {\n try {\n // Handle BFCL dataset quirk where object property values are wrapped in arrays\n // e.g. {\"min\": [300000], \"max\": [400000]} should match {\"min\": 300000, \"max\": 400000}\n const normalizeObject = (obj: unknown): unknown => {\n if (Array.isArray(obj)) {\n return obj.map(normalizeObject);\n }\n if (obj && typeof obj === \"object\") {\n const normalized: Record<string, unknown> = {};\n for (const [key, value] of Object.entries(\n obj as Record<string, unknown>\n )) {\n // If value is a single-element array, unwrap it\n if (\n Array.isArray(value) &&\n value.length === 1 &&\n (typeof value[0] !== \"object\" || value[0] === null)\n ) {\n normalized[key] = value[0];\n } else {\n normalized[key] = normalizeObject(value);\n }\n }\n return normalized;\n }\n return obj;\n };\n\n const normalizedModel = normalizeObject(modelValue);\n const normalizedPossible = normalizeObject(possibleValue);\n\n return (\n JSON.stringify(normalizedModel) ===\n JSON.stringify(normalizedPossible)\n );\n } catch {\n return false;\n }\n }\n\n // For numbers, handle string/number conversion\n if (\n typeof modelValue === \"number\" &&\n typeof possibleValue === \"string\"\n ) {\n return modelValue.toString() === possibleValue;\n }\n if (\n typeof modelValue === \"string\" &&\n typeof possibleValue === \"number\"\n ) {\n return modelValue === possibleValue.toString();\n }\n\n return false;\n })\n : false;\n\n if (!hasMatch) {\n return {\n valid: false,\n error: `Invalid value for parameter '${paramName}'. Got ${JSON.stringify(\n modelValue\n )}. Expected one of ${JSON.stringify(possibleValues)}.`,\n error_type: \"value_error:other\",\n };\n }\n }\n }\n }\n\n for (const paramName in possibleAnswerParams) {\n const val = possibleAnswerParams[paramName] as unknown;\n const isOptional = Array.isArray(val) && val.includes(\"\");\n if (!(paramName in argsObj) && !isOptional) {\n return {\n valid: false,\n error: `Missing optional parameter '${paramName}' which was not marked as optional.`,\n error_type: \"simple_function_checker:missing_optional\",\n };\n }\n }\n\n return { valid: true };\n}\n\n/**\n * Checker for parallel function calls (order-agnostic).\n */\nexport function parallelFunctionCheckerNoOrder(\n funcDescriptions: FunctionDescription[],\n modelToolCalls: ToolCall[],\n possibleAnswers: Record<string, unknown>[]\n): { valid: boolean; error?: string; error_type?: string } {\n if (modelToolCalls.length !== possibleAnswers.length) {\n return {\n valid: false,\n error: `Wrong number of functions. Expected ${possibleAnswers.length}, got ${modelToolCalls.length}.`,\n error_type: \"parallel_function_checker_no_order:wrong_count\",\n };\n }\n\n const matchedModelCallIndices = new Set<number>();\n for (const possibleAnswer of possibleAnswers) {\n const expectedFuncName = Object.keys(possibleAnswer)[0];\n const funcDescription = funcDescriptions.find(\n f => f.name === expectedFuncName\n );\n\n if (!funcDescription) {\n return {\n valid: false,\n error: `Could not find function description for '${expectedFuncName}'.`,\n error_type: \"parallel_function_checker_no_order:missing_func_desc\",\n };\n }\n\n let foundMatch = false;\n for (let i = 0; i < modelToolCalls.length; i++) {\n if (matchedModelCallIndices.has(i)) continue;\n\n const checkerResult = simpleFunctionChecker(\n funcDescription,\n modelToolCalls[i],\n possibleAnswer\n );\n if (checkerResult.valid) {\n matchedModelCallIndices.add(i);\n foundMatch = true;\n break;\n }\n }\n\n if (!foundMatch) {\n return {\n valid: false,\n error: `Could not find a matching function call for '${expectedFuncName}'.`,\n error_type: \"parallel_function_checker_no_order:cannot_find_match\",\n };\n }\n }\n return { valid: true };\n}\n\n/**\n * Checker for multiple calls to the same function.\n */\nexport function multipleFunctionChecker(\n funcDescriptions: FunctionDescription[],\n modelToolCalls: ToolCall[],\n possibleAnswers: Record<string, unknown>[]\n): { valid: boolean; error?: string; error_type?: string } {\n if (modelToolCalls.length !== possibleAnswers.length) {\n return {\n valid: false,\n error: `Wrong number of functions. Expected ${possibleAnswers.length}, got ${modelToolCalls.length}.`,\n error_type: \"multiple_function_checker:wrong_count\",\n };\n }\n\n const expectedFuncName = Object.keys(possibleAnswers[0])[0];\n const funcDescription = funcDescriptions.find(\n f => f.name === expectedFuncName\n );\n\n if (!funcDescription) {\n return {\n valid: false,\n error: `Could not find function description for '${expectedFuncName}'.`,\n error_type: \"multiple_function_checker:missing_func_desc\",\n };\n }\n\n return simpleFunctionChecker(\n funcDescription,\n modelToolCalls[0],\n possibleAnswers[0]\n );\n}\n","import { generateText, LanguageModel } from \"ai\";\nimport Ajv, { AnySchema } from \"ajv\";\nimport { promises as fs } from \"fs\";\nimport path from \"path\";\n\nimport { BenchmarkResult, LanguageModelV2Benchmark } from \"@/interfaces\";\nimport { resolveDataDir } from \"@/utils/paths\";\n\ntype Json = unknown;\n\ninterface SchemaTestCase {\n id: string;\n description: string;\n schema: AnySchema; // JSON Schema (draft 2020-12 subset supported by Ajv v8)\n promptFacts: string; // natural language facts to express desired values\n expected: Json; // subset of fields we expect to match exactly\n}\n\ninterface ExpectedRecord {\n id: string;\n expected: Json;\n}\n\nfunction extractFirstJsonBlock(text: string): Json | undefined {\n // 1) try direct parse\n try {\n return JSON.parse(text);\n } catch {\n // ignore parse errors\n }\n\n // 2) try code fence ```json ... ```\n const fenceMatch =\n text.match(/```json\\s*([\\s\\S]*?)```/i) ||\n text.match(/```\\s*([\\s\\S]*?)```/i);\n if (fenceMatch) {\n const inner = fenceMatch[1].trim();\n try {\n return JSON.parse(inner);\n } catch {\n // ignore parse errors\n }\n }\n\n // 3) bracket scanning for first object or array\n const startIdxObj = text.indexOf(\"{\");\n const startIdxArr = text.indexOf(\"[\");\n const start = [startIdxObj, startIdxArr]\n .filter(i => i >= 0)\n .sort((a, b) => a - b)[0];\n if (start === undefined) return undefined;\n\n const open = text[start] === \"{\" ? \"{\" : \"[\";\n const close = open === \"{\" ? \"}\" : \"]\";\n let depth = 0;\n for (let i = start; i < text.length; i++) {\n const ch = text[i];\n if (ch === open) depth++;\n else if (ch === close) depth--;\n if (depth === 0) {\n const candidate = text.slice(start, i + 1);\n try {\n return JSON.parse(candidate);\n } catch {\n // ignore parse errors\n }\n break;\n }\n }\n return undefined;\n}\n\nfunction subsetMatch(expected: Json, actual: Json): boolean {\n // primitives\n if (expected === null || typeof expected !== \"object\") {\n return expected === actual;\n }\n // arrays\n if (Array.isArray(expected)) {\n if (!Array.isArray(actual)) return false;\n // Require at least that expected elements (by index) match if provided\n for (let i = 0; i < expected.length; i++) {\n if (!subsetMatch(expected[i], actual[i])) return false;\n }\n return true;\n }\n // object subset\n if (actual === null || typeof actual !== \"object\") return false;\n const eObj = expected as Record<string, unknown>;\n const aObj = actual as Record<string, unknown>;\n for (const key of Object.keys(eObj)) {\n if (!subsetMatch(eObj[key], aObj[key])) return false;\n }\n return true;\n}\n\n// Test cases will be loaded from data files at runtime\n\nexport const jsonGenerationBenchmark: LanguageModelV2Benchmark = {\n name: \"json-generation\",\n version: \"2.1.0\",\n description:\n \"Evaluates schema-compliant JSON generation from natural language using JSON Schema prompts.\",\n\n async run(\n model: LanguageModel,\n config?: Record<string, unknown>\n ): Promise<BenchmarkResult> {\n const logs: string[] = [];\n const ajv = new Ajv({ allErrors: true, strict: false });\n\n let schemaValidCount = 0;\n let valueMatchCount = 0;\n let correctCount = 0; // both schema + value subset\n\n // Load JSONL datasets (tests + expected) similar to BFCL\n let tests: Omit<SchemaTestCase, \"expected\">[] = [];\n const expectedMap = new Map<string, ExpectedRecord>();\n try {\n const dataDir = resolveDataDir();\n const testsJsonl = await fs.readFile(\n path.join(dataDir, \"json_generation_tests.jsonl\"),\n \"utf-8\"\n );\n const expectedJsonl = await fs.readFile(\n path.join(dataDir, \"json_generation_expected.jsonl\"),\n \"utf-8\"\n );\n\n tests = testsJsonl\n .split(/\\r?\\n/)\n .filter(line => line.trim().length > 0)\n .map(line => JSON.parse(line));\n const expecteds: ExpectedRecord[] = expectedJsonl\n .split(/\\r?\\n/)\n .filter(line => line.trim().length > 0)\n .map(line => JSON.parse(line));\n for (const r of expecteds) expectedMap.set(r.id, r);\n } catch (e: unknown) {\n const msg = e instanceof Error ? e.message : String(e);\n return {\n score: 0,\n success: false,\n metrics: {},\n logs: [`[FATAL] Failed to load json-generation datasets: ${msg}`],\n error: e as Error,\n };\n }\n\n for (const tc of tests) {\n try {\n const schemaStr = JSON.stringify(tc.schema, null, 2);\n const messages = [\n {\n role: \"system\" as const,\n content:\n \"You must output only a single JSON document that strictly conforms to the given JSON Schema. Do not include any extra text or code fences.\",\n },\n {\n role: \"user\" as const,\n content: [\n \"Generate a JSON object that reflects the following facts.\",\n \"JSON Schema:\",\n schemaStr,\n \"Facts:\",\n tc.promptFacts,\n \"Output must be a single JSON only, with no additional text.\",\n ].join(\"\\n\\n\"),\n },\n ];\n\n const temp = config?.temperature;\n const temperature = typeof temp === \"number\" ? temp : undefined;\n const { text } = await generateText({\n model,\n messages,\n ...(temperature !== undefined ? { temperature } : {}),\n });\n\n let parsed: Json | undefined;\n try {\n parsed = extractFirstJsonBlock(text);\n } catch {\n // ignore parse errors\n }\n\n if (parsed === undefined) {\n logs.push(`[FAIL] ${tc.id}: Unable to parse JSON from model output.`);\n continue;\n }\n\n const validate = ajv.compile(tc.schema);\n const valid = validate(parsed) as boolean;\n if (valid) schemaValidCount++;\n else\n logs.push(\n `[INFO] ${tc.id}: Schema validation errors: ${\n (validate.errors || [])\n .map(e => `${e.instancePath} ${e.message}`)\n .join(\", \") || \"unknown\"\n }`\n );\n\n const expectedRec = expectedMap.get(tc.id);\n if (!expectedRec) {\n logs.push(\n `[WARN] ${tc.id}: No expected record found. Skipping value match.`\n );\n }\n const valuesOk = expectedRec\n ? subsetMatch(expectedRec.expected, parsed)\n : false;\n if (valuesOk) valueMatchCount++;\n\n if (valid && valuesOk) {\n correctCount++;\n logs.push(`[PASS] ${tc.id}`);\n } else {\n logs.push(\n `[FAIL] ${tc.id}: schemaValid=${valid}, valuesOk=${valuesOk}. Output=${JSON.stringify(\n parsed\n )}`\n );\n }\n } catch (e: unknown) {\n const msg = e instanceof Error ? e.message : String(e);\n logs.push(`[ERROR] ${tc.id}: ${msg}`);\n }\n }\n\n const total = tests.length;\n const score = correctCount / total;\n return {\n score,\n success: score >= 0.8,\n metrics: {\n total_cases: total,\n correct_count: correctCount,\n schema_valid_count: schemaValidCount,\n value_match_count: valueMatchCount,\n accuracy: score,\n },\n logs,\n };\n },\n};\n\n// A schema-only variant that validates structure/format without value matching\ntype SchemaOnlyTestCase = Omit<SchemaTestCase, \"expected\">;\n\nexport const jsonGenerationSchemaOnlyBenchmark: LanguageModelV2Benchmark = {\n name: \"json-generation-schema-only\",\n version: \"1.0.1\",\n description:\n \"Evaluates whether model outputs strictly conform to the provided JSON Schema (structure only).\",\n\n async run(\n model: LanguageModel,\n config?: Record<string, unknown>\n ): Promise<BenchmarkResult> {\n const logs: string[] = [];\n const ajv = new Ajv({ allErrors: true, strict: false });\n\n // Load tests\n let tests: SchemaOnlyTestCase[] = [];\n try {\n const dataDir = resolveDataDir();\n const testsJsonl = await fs.readFile(\n path.join(dataDir, \"json_generation_tests.jsonl\"),\n \"utf-8\"\n );\n tests = testsJsonl\n .split(/\\r?\\n/)\n .filter(line => line.trim().length > 0)\n .map(line => JSON.parse(line));\n } catch (e: unknown) {\n const msg = e instanceof Error ? e.message : String(e);\n return {\n score: 0,\n success: false,\n metrics: {},\n logs: [`[FATAL] Failed to load schema-only tests: ${msg}`],\n error: e as Error,\n };\n }\n\n let schemaValidCount = 0;\n\n for (const tc of tests) {\n try {\n const schemaStr = JSON.stringify(tc.schema, null, 2);\n const messages = [\n {\n role: \"system\" as const,\n content:\n \"You must output only a single JSON document that strictly conforms to the given JSON Schema. Do not include any extra text or code fences.\",\n },\n {\n role: \"user\" as const,\n content: [\n \"Generate a JSON object that reflects the following facts.\",\n \"JSON Schema:\",\n schemaStr,\n \"Facts:\",\n tc.promptFacts,\n \"Output must be a single JSON only, with no additional text.\",\n ].join(\"\\n\\n\"),\n },\n ];\n\n const temp = config?.temperature;\n const temperature = typeof temp === \"number\" ? temp : undefined;\n const { text } = await generateText({\n model,\n messages,\n ...(temperature !== undefined ? { temperature } : {}),\n });\n\n let parsed: Json | undefined;\n try {\n parsed = extractFirstJsonBlock(text);\n } catch {\n // ignore\n }\n if (parsed === undefined) {\n logs.push(`[FAIL] ${tc.id}: Could not parse JSON from model output.`);\n continue;\n }\n\n const validate = ajv.compile(tc.schema);\n const valid = validate(parsed) as boolean;\n if (valid) {\n schemaValidCount++;\n logs.push(`[PASS] ${tc.id}`);\n } else {\n logs.push(\n `[FAIL] ${tc.id}: Schema validation errors: ${\n (validate.errors || [])\n .map(e => `${e.instancePath} ${e.message}`)\n .join(\", \") || \"unknown\"\n }`\n );\n }\n } catch (e: unknown) {\n const msg = e instanceof Error ? e.message : String(e);\n logs.push(`[ERROR] ${tc.id}: ${msg}`);\n }\n }\n\n const total = tests.length;\n const score = total > 0 ? schemaValidCount / total : 0;\n return {\n score,\n success: score >= 0.8,\n metrics: {\n total_cases: total,\n schema_valid_count: schemaValidCount,\n accuracy: score,\n },\n logs,\n };\n },\n};\n"],"mappings":"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","names":["colors","fs","path","require","fs","path","name","limit","generateText","fs","path","fs","path","generateText"]}
1
+ {"version":3,"sources":["../src/benchmarks/bfcl.ts","../src/utils/paths.ts","../src/benchmarks/bfcl/ast-checker.ts","../src/benchmarks/json-generation.ts","../src/reporters/console.ts","../src/reporters/console.debug.ts","../src/reporters/json.ts","../src/reporters/index.ts","../src/evaluate.ts"],"sourcesContent":["import { promises as fs } from \"node:fs\";\nimport path from \"node:path\";\nimport {\n type CoreMessage,\n generateText,\n jsonSchema,\n type LanguageModel,\n tool,\n} from \"ai\";\n\nimport type { BenchmarkResult, LanguageModelV3Benchmark } from \"@/interfaces\";\nimport { resolveDataDir } from \"@/utils/paths\";\n\nimport {\n type FunctionDescription,\n multipleFunctionChecker,\n parallelFunctionCheckerNoOrder,\n simpleFunctionChecker,\n type ToolCall,\n} from \"./bfcl/ast-checker\";\n\n// Resolve data files relative to this module using ESM-safe utilities\n\n// Regex constants for performance\nconst LINE_SPLIT_REGEX = /\\r?\\n/;\nconst NUMERIC_STRING_REGEX = /^\\d+$/;\n\n// --- Interfaces ---\ntype ToolSchemaObject = {\n type: string;\n properties?: Record<string, unknown>;\n items?: unknown;\n required?: string[];\n [key: string]: unknown;\n};\n\ntype ToolSpec = {\n name: string;\n description?: string;\n parameters: ToolSchemaObject;\n};\n\ntype Message = { role: string; content: string };\n\ntype TestCase = {\n id: string;\n question: Message[] | Message[][];\n function: ToolSpec[];\n};\n\ntype TransformedTool = {\n type: \"function\";\n name: string;\n description?: string;\n inputSchema: ToolSchemaObject;\n};\n\ntype PossibleAnswer = {\n id: string;\n ground_truth: unknown;\n};\n\n// --- Generic Checker Dispatcher ---\nfunction check(\n testCase: TestCase,\n modelOutput: unknown, // This is an array of tool_calls\n possibleAnswer: PossibleAnswer\n): { valid: boolean; error?: string; error_type?: string } {\n const category = testCase.id.split(\"_\")[0];\n\n try {\n if (category === \"simple\") {\n if (!Array.isArray(modelOutput) || modelOutput.length !== 1) {\n return {\n valid: false,\n error: `Expected 1 function call, but got ${Array.isArray(modelOutput) ? modelOutput.length : 0}.`,\n error_type: \"simple:wrong_count\",\n };\n }\n return simpleFunctionChecker(\n testCase.function[0] as unknown as FunctionDescription,\n modelOutput[0] as ToolCall,\n (possibleAnswer.ground_truth as Record<string, unknown>[])[0]\n );\n }\n if (category === \"parallel\") {\n return parallelFunctionCheckerNoOrder(\n testCase.function as unknown as FunctionDescription[],\n modelOutput as ToolCall[],\n possibleAnswer.ground_truth as Record<string, unknown>[]\n );\n }\n if (category === \"multiple\") {\n return multipleFunctionChecker(\n testCase.function as unknown as FunctionDescription[],\n modelOutput as ToolCall[],\n possibleAnswer.ground_truth as Record<string, unknown>[]\n );\n }\n if (category.includes(\"parallel-multiple\")) {\n // parallel-multiple is just a more complex parallel case\n return parallelFunctionCheckerNoOrder(\n testCase.function as unknown as FunctionDescription[],\n modelOutput as ToolCall[],\n possibleAnswer.ground_truth as Record<string, unknown>[]\n );\n }\n\n // Default for unimplemented categories (like multi_turn)\n // As per user request, we are deferring multi-turn.\n return { valid: true }; // Pass to not fail the whole benchmark\n } catch (e: unknown) {\n return {\n valid: false,\n error: `Checker Error: ${(e as Error).message}`,\n error_type: \"checker_error\",\n };\n }\n}\n\n// --- Generic Benchmark Runner Factory ---\nfunction createBfclBenchmark(\n name: string,\n description: string,\n testDataFile: string,\n answerDataFile: string\n): LanguageModelV3Benchmark {\n return {\n name,\n version: \"1.0.0\",\n description,\n async run(\n model: LanguageModel,\n config?: Record<string, unknown>\n ): Promise<BenchmarkResult> {\n const logs: string[] = [];\n let correctCount = 0;\n let testCases: TestCase[] = [];\n\n try {\n // Resolve data directory in a way that works both in monorepo and when installed as a dependency.\n const dataPath = resolveDataDir();\n logs.push(`[INFO] Using data dir: ${dataPath}`);\n const testCasesJson = await fs.readFile(\n path.join(dataPath, testDataFile),\n \"utf-8\"\n );\n const possibleAnswersJson = await fs.readFile(\n path.join(dataPath, answerDataFile),\n \"utf-8\"\n );\n\n // The BFCL datasets are in JSON Lines (NDJSON) format: one JSON object per line.\n // Parse them line-by-line instead of as a single JSON value.\n testCases = testCasesJson\n .split(LINE_SPLIT_REGEX)\n .filter((line) => line.trim().length > 0)\n .map((line) => JSON.parse(line));\n const possibleAnswers: PossibleAnswer[] = possibleAnswersJson\n .split(LINE_SPLIT_REGEX)\n .filter((line) => line.trim().length > 0)\n .map((line) => JSON.parse(line));\n const possibleAnswersMap = new Map(\n possibleAnswers.map((ans) => [ans.id, ans])\n );\n\n // Optional: limit number of test cases via env for faster local runs\n const limitEnv = process.env.BFCL_LIMIT;\n const limit = limitEnv ? Number(limitEnv) : undefined;\n if (limit && Number.isFinite(limit) && limit > 0) {\n testCases = testCases.slice(0, limit);\n logs.push(\n `[INFO] Limiting test cases to ${limit} due to BFCL_LIMIT.`\n );\n }\n\n // Helper: fix BFCL JSON schema type field\n const fixSchemaType = (copy: ToolSchemaObject): void => {\n if (!copy.type) {\n return;\n }\n if (copy.type === \"dict\") {\n copy.type = \"object\";\n }\n if (copy.type === \"tuple\") {\n copy.type = \"array\";\n }\n if (copy.type === \"integer\" || copy.type === \"float\") {\n copy.type = \"number\";\n }\n };\n\n // Helper: fix BFCL JSON schema properties recursively\n const fixSchemaProperties = (\n copy: ToolSchemaObject,\n fixSchemaFn: (schema: unknown) => unknown\n ): void => {\n if (!copy.properties || typeof copy.properties !== \"object\") {\n return;\n }\n for (const k of Object.keys(copy.properties)) {\n (copy.properties as Record<string, unknown>)[k] = fixSchemaFn(\n (copy.properties as Record<string, unknown>)[k]\n );\n }\n };\n\n // Helper: fix BFCL JSON schema types to OpenAI-compatible JSON Schema\n const fixSchema = (schema: unknown): unknown => {\n if (!schema || typeof schema !== \"object\") {\n return { type: \"object\", properties: {} };\n }\n const copy: ToolSchemaObject | unknown[] = Array.isArray(schema)\n ? (schema as unknown[]).map((v) => fixSchema(v))\n : ({ ...(schema as Record<string, unknown>) } as ToolSchemaObject);\n if (!Array.isArray(copy)) {\n fixSchemaType(copy);\n fixSchemaProperties(copy, fixSchema);\n if (copy.items) {\n copy.items = fixSchema(copy.items);\n }\n return copy;\n }\n return copy;\n };\n\n // Helper: Flatten BFCL message shape\n const flattenMessages = (\n messages: Message[] | Message[][]\n ): Message[] =>\n Array.isArray(messages) &&\n (messages as unknown[]).some((m) => Array.isArray(m))\n ? (messages as unknown[] as Message[][]).flat(1)\n : (messages as Message[]);\n\n // Helper: Sanitize tool name for OpenAI compatibility\n const sanitizeName = (toolName: string): string => {\n const s = toolName.replace(/[^a-zA-Z0-9_-]/g, \"_\").slice(0, 64);\n return s.length > 0 ? s : \"tool\";\n };\n\n // Helper: Build transformed tools and name mapping\n const buildTransformedTools = (\n tools: ToolSpec[],\n fixSchemaFn: (schema: unknown) => unknown\n ): {\n transformedTools: TransformedTool[];\n nameMap: Map<string, string>;\n } => {\n const nameMap = new Map<string, string>();\n const transformedTools: TransformedTool[] = tools.map((t) => {\n const fixed = fixSchemaFn(t.parameters);\n const isObjectSchema =\n fixed &&\n typeof fixed === \"object\" &&\n (fixed as ToolSchemaObject).type === \"object\";\n const inputSchema: ToolSchemaObject = isObjectSchema\n ? (fixed as ToolSchemaObject)\n : { type: \"object\", properties: {} };\n\n const sanitized = sanitizeName(t.name);\n nameMap.set(sanitized, t.name);\n\n return {\n type: \"function\" as const,\n name: sanitized,\n description: t.description,\n inputSchema,\n };\n });\n return { transformedTools, nameMap };\n };\n\n // Helper: Parse middleware debug tool calls\n const parseDebugToolCalls = (\n raw: string | undefined\n ): Array<{ toolName?: string; input?: unknown }> => {\n if (!raw) {\n return [];\n }\n try {\n const arr = JSON.parse(raw);\n return Array.isArray(arr) ? arr : [];\n } catch {\n return [];\n }\n };\n\n // Helper: Get sanitized name from index or raw name\n const getSanitizedName = (\n rawName: unknown,\n transformedTools: TransformedTool[]\n ): unknown => {\n if (\n typeof rawName === \"string\" &&\n NUMERIC_STRING_REGEX.test(rawName)\n ) {\n return transformedTools[Number(rawName)]?.name ?? rawName;\n }\n return rawName;\n };\n\n // Helper: Parse arguments from various formats\n const parseToolArgs = (extractedArgs: unknown): unknown => {\n if (typeof extractedArgs !== \"string\") {\n return extractedArgs;\n }\n try {\n return JSON.parse(extractedArgs);\n } catch {\n // leave as string if not JSON\n return extractedArgs;\n }\n };\n\n // Helper: Restore original tool names in tool calls\n const restoreToolCalls = (\n toolCalls: unknown[],\n nameMap: Map<string, string>,\n transformedTools: TransformedTool[]\n ): unknown[] =>\n (toolCalls || []).map((c: unknown) => {\n const call = c as Record<string, unknown>;\n const rawName = call.toolName ?? call.name;\n const sanitizedFromIndex = getSanitizedName(\n rawName,\n transformedTools\n );\n const originalName =\n nameMap.get(sanitizedFromIndex as string) ?? sanitizedFromIndex;\n const extractedArgs =\n call.args ??\n call.arguments ??\n call.input ??\n call.params ??\n call.parameters;\n const parsedArgs = parseToolArgs(extractedArgs);\n return {\n ...call,\n toolName: originalName,\n name: originalName,\n args: parsedArgs ?? {},\n };\n });\n\n // Helper: Summarize args for stable output\n const summarizeArgs = (args: unknown): unknown => {\n if (args == null) {\n return args;\n }\n if (typeof args !== \"object\") {\n return args;\n }\n return Object.keys(args)\n .sort()\n .reduce(\n (acc: Record<string, unknown>, k) => {\n acc[k] = (args as Record<string, unknown>)[k];\n return acc;\n },\n {} as Record<string, unknown>\n );\n };\n\n // Helper: Generate parameter mismatch diff\n const generateParamMismatchDiff = (\n paramName: string,\n allowed: unknown,\n got: unknown\n ): string[] => {\n const diffLines: string[] = [];\n diffLines.push(`@@ param ${paramName}`);\n const allowedArray = Array.isArray(allowed)\n ? (allowed as unknown[])\n : [allowed as unknown];\n const expectedLine = (() => {\n if (allowedArray.length === 1) {\n return `- expected: ${JSON.stringify(allowedArray[0])}`;\n }\n const formatted = allowedArray\n .map((v) =>\n Array.isArray(v) || (typeof v === \"object\" && v !== null)\n ? JSON.stringify(v)\n : String(v)\n )\n .join(\", \");\n return `- expected one of: ${formatted}`;\n })();\n diffLines.push(expectedLine);\n diffLines.push(`+ got: ${JSON.stringify(got)}`);\n return diffLines;\n };\n\n // Helper: Check if param value matches allowed values\n const paramValueMatches = (allowed: unknown, got: unknown): boolean => {\n if (!Array.isArray(allowed)) {\n return false;\n }\n return allowed.some((v: unknown) => {\n try {\n if (Array.isArray(got)) {\n return (\n JSON.stringify(got.map((x) => String(x)).sort()) ===\n JSON.stringify((v as unknown[]).map((x) => String(x)).sort())\n );\n }\n } catch {\n // Ignore parse errors\n }\n return (\n String(v).toLowerCase().replace(/\\s+/g, \"\") ===\n String(got).toLowerCase().replace(/\\s+/g, \"\")\n );\n });\n };\n\n // Helper: Check function name mismatch\n const checkFunctionNameMismatch = (\n expectedName: unknown,\n receivedName: unknown,\n diff: string[]\n ): void => {\n if (expectedName !== receivedName) {\n diff.push(\"@@ function name\");\n diff.push(`- ${expectedName}`);\n diff.push(`+ ${receivedName}`);\n }\n };\n\n // Helper: Check missing required params\n const checkMissingParams = (\n required: string[],\n receivedArgs: Record<string, unknown>,\n diff: string[]\n ): void => {\n for (const req of required) {\n if (!(req in receivedArgs)) {\n diff.push(`- missing required param: ${req}`);\n }\n }\n };\n\n // Helper: Check unexpected params\n const checkUnexpectedParams = (\n expectedParams: Record<string, unknown>,\n receivedArgs: Record<string, unknown>,\n diff: string[]\n ): void => {\n for (const k of Object.keys(receivedArgs)) {\n if (!(k in expectedParams)) {\n diff.push(`+ unexpected param: ${k}`);\n }\n }\n };\n\n // Helper: Check param value mismatches\n const checkParamValueMismatches = (\n expectedParams: Record<string, unknown>,\n receivedArgs: Record<string, unknown>,\n diff: string[]\n ): void => {\n for (const k of Object.keys(receivedArgs)) {\n if (k in expectedParams) {\n const allowed = (expectedParams as Record<string, unknown[]>)[k];\n const got = receivedArgs[k];\n if (!paramValueMatches(allowed, got)) {\n diff.push(...generateParamMismatchDiff(k, allowed, got));\n }\n }\n }\n };\n\n // Helper: Build diff for simple test case\n const buildSimpleDiff = (\n tools: ToolSpec[],\n possibleAnswer: PossibleAnswer,\n restoredCalls: unknown[]\n ): {\n expected: Record<string, unknown>;\n actual: Record<string, unknown>;\n diff: string[];\n } => {\n const funcDesc = tools[0];\n const gt = (possibleAnswer as { ground_truth?: unknown[] })\n .ground_truth?.[0] as Record<string, unknown> | undefined;\n const expectedFuncName = funcDesc?.name;\n const expectedParams = gt ? gt[Object.keys(gt)[0]] : undefined;\n const received = (restoredCalls as Record<string, unknown>[])[0];\n const receivedName = received?.toolName ?? received?.name;\n const receivedArgs = summarizeArgs(received?.args);\n\n const expected: Record<string, unknown> = {\n function: expectedFuncName,\n params: expectedParams,\n };\n const actual: Record<string, unknown> = {\n function: receivedName,\n args: receivedArgs,\n };\n const diff: string[] = [];\n\n checkFunctionNameMismatch(expectedFuncName, receivedName, diff);\n\n if (\n expectedParams &&\n receivedArgs &&\n typeof receivedArgs === \"object\" &&\n receivedArgs !== null\n ) {\n const required = (funcDesc?.parameters?.required ?? []) as string[];\n checkMissingParams(\n required,\n receivedArgs as Record<string, unknown>,\n diff\n );\n checkUnexpectedParams(\n expectedParams as Record<string, unknown>,\n receivedArgs as Record<string, unknown>,\n diff\n );\n checkParamValueMismatches(\n expectedParams as Record<string, unknown>,\n receivedArgs as Record<string, unknown>,\n diff\n );\n }\n\n return { expected, actual, diff };\n };\n\n // Helper: Check call count mismatch\n const checkCallCountMismatch = (\n expectedCount: number,\n actualCount: number,\n diff: string[]\n ): void => {\n if (expectedCount !== actualCount) {\n diff.push(\"@@ call count\");\n diff.push(`- expected ${expectedCount}`);\n diff.push(`+ got ${actualCount}`);\n }\n };\n\n // Helper: Add missing and extra functions to diff\n const addMissingAndExtraFunctions = (\n expectedNames: unknown[],\n actualNames: unknown[],\n diff: string[]\n ): void => {\n const missing = expectedNames.filter((n) => !actualNames.includes(n));\n const extra = actualNames.filter((n) => !expectedNames.includes(n));\n for (const m of missing) {\n diff.push(`- missing function: ${m}`);\n }\n for (const e of extra) {\n diff.push(`+ unexpected function: ${e}`);\n }\n };\n\n // Helper: Find matching call index\n const findMatchingCallIndex = (\n fname: string,\n restoredCalls: Record<string, unknown>[],\n usedActual: Set<number>\n ): number => {\n for (let i = 0; i < restoredCalls.length; i += 1) {\n if (usedActual.has(i)) {\n continue;\n }\n const rc = restoredCalls[i];\n const rcName = rc?.toolName ?? rc?.name;\n if (rcName === fname) {\n return i;\n }\n }\n return -1;\n };\n\n // Helper: Validate function parameters\n const validateFunctionParams = (options: {\n receivedArgs: Record<string, unknown>;\n expectedParamsAllowed: Record<string, unknown>;\n requiredParams: string[];\n diff: string[];\n }): void => {\n const { receivedArgs, expectedParamsAllowed, requiredParams, diff } =\n options;\n checkMissingParams(requiredParams, receivedArgs, diff);\n checkUnexpectedParams(expectedParamsAllowed, receivedArgs, diff);\n checkParamValueMismatches(expectedParamsAllowed, receivedArgs, diff);\n };\n\n // Helper: Process single expected function call\n const processExpectedCall = (options: {\n expectedObj: Record<string, unknown>;\n restoredCalls: Record<string, unknown>[];\n tools: ToolSpec[];\n usedActual: Set<number>;\n diff: string[];\n }): void => {\n const { expectedObj, restoredCalls, tools, usedActual, diff } =\n options;\n const fname = Object.keys(expectedObj)[0];\n const matchedIndex = findMatchingCallIndex(\n fname,\n restoredCalls,\n usedActual\n );\n\n if (matchedIndex === -1) {\n return;\n }\n\n usedActual.add(matchedIndex);\n const received = restoredCalls[matchedIndex];\n const receivedArgs = summarizeArgs(received?.args);\n const expectedParamsAllowed = expectedObj[fname] as Record<\n string,\n unknown\n >;\n const funcDesc = tools.find((t: ToolSpec) => t.name === fname);\n const requiredParams = (funcDesc?.parameters?.required ??\n []) as string[];\n\n diff.push(`@@ function ${fname}`);\n\n if (\n expectedParamsAllowed &&\n receivedArgs &&\n typeof receivedArgs === \"object\" &&\n receivedArgs !== null\n ) {\n validateFunctionParams({\n receivedArgs: receivedArgs as Record<string, unknown>,\n expectedParamsAllowed,\n requiredParams,\n diff,\n });\n }\n };\n\n // Helper: Build diff for parallel/multiple test case\n const buildParallelDiff = (\n tools: ToolSpec[],\n possibleAnswer: PossibleAnswer,\n restoredCalls: unknown[]\n ): {\n expected: Record<string, unknown>;\n actual: Record<string, unknown>;\n diff: string[];\n } => {\n const gtArr: Record<string, unknown>[] =\n (\n possibleAnswer as {\n ground_truth?: Record<string, unknown>[];\n }\n ).ground_truth ?? [];\n const expectedNames = gtArr.map((g) => Object.keys(g)[0]);\n const actualNames = (restoredCalls as Record<string, unknown>[]).map(\n (c) => c.toolName ?? c.name\n );\n\n const expected: Record<string, unknown> = {\n functions: expectedNames,\n };\n const actual: Record<string, unknown> = { functions: actualNames };\n const diff: string[] = [];\n\n checkCallCountMismatch(\n expectedNames.length,\n actualNames.length,\n diff\n );\n addMissingAndExtraFunctions(expectedNames, actualNames, diff);\n\n const usedActual = new Set<number>();\n for (const expectedObj of gtArr) {\n processExpectedCall({\n expectedObj,\n restoredCalls: restoredCalls as Record<string, unknown>[],\n tools,\n usedActual,\n diff,\n });\n }\n\n return { expected, actual, diff };\n };\n\n // Concurrency control via env BFCL_CONCURRENCY (default 4)\n const concurrencyEnv = process.env.BFCL_CONCURRENCY;\n const concurrency =\n concurrencyEnv && Number.isFinite(Number(concurrencyEnv))\n ? Math.max(1, Number(concurrencyEnv))\n : 4;\n logs.push(\n `[INFO] Running ${testCases.length} test cases with concurrency=${concurrency}`\n );\n\n // Helper: Log first tool debug info\n const logFirstToolDebug = (\n transformedTools: TransformedTool[],\n testCaseId: string,\n caseLogs: string[]\n ): void => {\n try {\n const firstTool = transformedTools[0];\n const schemaType =\n firstTool?.inputSchema?.type ??\n (\n (firstTool?.inputSchema as Record<string, unknown> | undefined)\n ?.jsonSchema as Record<string, unknown> | undefined\n )?.type;\n caseLogs.push(\n `[DEBUG] ${testCaseId}: firstTool=${JSON.stringify(firstTool)}, schemaType=${schemaType}`\n );\n } catch (e: unknown) {\n caseLogs.push(\n `[DEBUG] ${testCaseId}: failed to introspect tools: ${(e as Error).message}`\n );\n }\n };\n\n // Helper: Log raw tool calls\n const logRawToolCalls = (options: {\n toolCalls: unknown;\n finishReason: unknown;\n text: unknown;\n testCaseId: string;\n caseLogs: string[];\n }): void => {\n const { toolCalls, finishReason, text, testCaseId, caseLogs } =\n options;\n try {\n caseLogs.push(\n `[DEBUG] ${testCaseId}: rawToolCalls=${JSON.stringify(toolCalls)}, finishReason=${finishReason}, text=${JSON.stringify(text)}`\n );\n } catch {\n caseLogs.push(\n `[DEBUG] ${testCaseId}: failed to serialize toolCalls`\n );\n }\n };\n\n // Helper: Build failure context payload\n const buildFailureContext = (options: {\n testCase: TestCase;\n tools: ToolSpec[];\n flatMessages: Message[];\n mwOriginalText: string | undefined;\n text: unknown;\n finishReason: unknown;\n mwParsedToolCalls: Array<{ toolName?: string; input?: unknown }>;\n restoredCalls: unknown[];\n possibleAnswer: PossibleAnswer;\n }): Record<string, unknown> => {\n const {\n testCase,\n tools,\n flatMessages,\n mwOriginalText,\n text,\n finishReason,\n mwParsedToolCalls,\n restoredCalls,\n possibleAnswer,\n } = options;\n\n const lastUser = (() => {\n const reversed = [...flatMessages].reverse();\n const found = reversed.find(\n (m) => (m as Message).role === \"user\"\n ) as Message | undefined;\n return found?.content ?? undefined;\n })();\n\n const rawModelText = (() => {\n if (mwOriginalText && mwOriginalText.length > 0) {\n return mwOriginalText;\n }\n if (typeof text === \"string\") {\n return text;\n }\n return \"\";\n })();\n\n return {\n id: testCase.id,\n tool_schema: tools,\n last_user_query: lastUser,\n raw_model_text: rawModelText,\n finish_reason: finishReason,\n parsed_tool_calls: mwParsedToolCalls.length\n ? mwParsedToolCalls\n : restoredCalls,\n ground_truth: (possibleAnswer as { ground_truth?: unknown })\n .ground_truth,\n };\n };\n\n // Helper: Log failure details\n const logFailureDetails = (options: {\n testCase: TestCase;\n tools: ToolSpec[];\n possibleAnswer: PossibleAnswer;\n restoredCalls: unknown[];\n checkerResult: {\n valid: boolean;\n error?: string;\n error_type?: string;\n };\n flatMessages: Message[];\n mwOriginalText: string | undefined;\n text: unknown;\n finishReason: unknown;\n mwParsedToolCalls: Array<{ toolName?: string; input?: unknown }>;\n caseLogs: string[];\n }): void => {\n const {\n testCase,\n tools,\n possibleAnswer,\n restoredCalls,\n checkerResult,\n flatMessages,\n mwOriginalText,\n text,\n finishReason,\n mwParsedToolCalls,\n caseLogs,\n } = options;\n\n try {\n const category = testCase.id.split(\"_\")[0];\n const { expected, actual, diff } =\n category === \"simple\"\n ? buildSimpleDiff(\n tools as ToolSpec[],\n possibleAnswer,\n restoredCalls\n )\n : buildParallelDiff(\n tools as ToolSpec[],\n possibleAnswer,\n restoredCalls\n );\n\n caseLogs.push(\n `[DEBUG-FAIL] ${JSON.stringify({\n id: testCase.id,\n message: checkerResult.error,\n error_type: checkerResult.error_type,\n expected,\n actual,\n diff,\n })}`\n );\n\n try {\n const contextPayload = buildFailureContext({\n testCase,\n tools,\n flatMessages,\n mwOriginalText,\n text,\n finishReason,\n mwParsedToolCalls,\n restoredCalls,\n possibleAnswer,\n });\n caseLogs.push(\n `[DEBUG-FAIL-CONTEXT] ${JSON.stringify(contextPayload)}`\n );\n } catch {\n // ignore context build failures\n }\n } catch {\n caseLogs.push(`[DEBUG] ${testCase.id}: failed to build debug diff`);\n }\n };\n\n // Helper: Build tools map for AI SDK\n const buildToolsMap = (\n transformedTools: TransformedTool[]\n ): Record<string, ReturnType<typeof tool>> =>\n Object.fromEntries(\n transformedTools.map((t) => [\n t.name,\n tool({\n description:\n typeof t.description === \"string\" ? t.description : undefined,\n inputSchema: jsonSchema(\n t.inputSchema as Record<string, unknown>\n ),\n }),\n ])\n );\n\n // Helper: Execute model generation\n const executeModelGeneration = async (options: {\n model: LanguageModel;\n flatMessages: Message[];\n toolsMap: Record<string, ReturnType<typeof tool>>;\n temperature: number | undefined;\n maxTokens: number | undefined;\n }): Promise<{\n toolCalls: unknown;\n text: unknown;\n finishReason: unknown;\n debugSummaryRef: { originalText?: string; toolCalls?: string };\n }> => {\n const {\n model: modelInstance,\n flatMessages,\n toolsMap,\n temperature,\n maxTokens,\n } = options;\n\n type ProviderOptionsWithMiddleware = {\n toolCallMiddleware?: {\n debugSummary?: {\n originalText?: string;\n toolCalls?: string;\n };\n };\n };\n const debugSummaryRef: {\n originalText?: string;\n toolCalls?: string;\n } = {};\n const providerOptions: ProviderOptionsWithMiddleware = {\n toolCallMiddleware: {\n debugSummary: debugSummaryRef,\n },\n };\n const { toolCalls, text, finishReason } = await generateText({\n model: modelInstance,\n messages: flatMessages as unknown as CoreMessage[],\n tools: toolsMap,\n toolChoice: \"auto\",\n providerOptions,\n ...(temperature !== undefined ? { temperature } : {}),\n ...(maxTokens !== undefined ? { maxOutputTokens: maxTokens } : {}),\n });\n\n return { toolCalls, text, finishReason, debugSummaryRef };\n };\n\n // Helper: Process validation result\n const processValidationResult = (options: {\n checkerResult: {\n valid: boolean;\n error?: string;\n error_type?: string;\n };\n testCase: TestCase;\n tools: ToolSpec[];\n possibleAnswer: PossibleAnswer;\n restoredCalls: unknown[];\n flatMessages: Message[];\n mwOriginalText: string | undefined;\n text: unknown;\n finishReason: unknown;\n mwParsedToolCalls: Array<{ toolName?: string; input?: unknown }>;\n caseLogs: string[];\n }): { valid: boolean; logs: string[] } => {\n const {\n checkerResult,\n testCase,\n tools,\n possibleAnswer,\n restoredCalls,\n flatMessages,\n mwOriginalText,\n text,\n finishReason,\n mwParsedToolCalls,\n caseLogs,\n } = options;\n\n if (checkerResult.valid) {\n caseLogs.push(`[PASS] ${testCase.id}`);\n return { valid: true, logs: caseLogs };\n }\n\n caseLogs.push(`[FAIL] ${testCase.id}: ${checkerResult.error}`);\n logFailureDetails({\n testCase,\n tools,\n possibleAnswer,\n restoredCalls,\n checkerResult,\n flatMessages,\n mwOriginalText,\n text,\n finishReason,\n mwParsedToolCalls,\n caseLogs,\n });\n return { valid: false, logs: caseLogs };\n };\n\n // Helper: Prepare test case data\n const prepareTestCaseData = (\n testCase: TestCase\n ): {\n flatMessages: Message[];\n transformedTools: TransformedTool[];\n nameMap: Map<string, string>;\n toolsMap: Record<string, ReturnType<typeof tool>>;\n } => {\n const { function: tools, question: messages } = testCase;\n const flatMessages = flattenMessages(messages);\n const { transformedTools, nameMap } = buildTransformedTools(\n tools as ToolSpec[],\n fixSchema\n );\n const toolsMap = buildToolsMap(transformedTools);\n return { flatMessages, transformedTools, nameMap, toolsMap };\n };\n\n // Helper: Process model response\n const processModelResponse = (options: {\n testCase: TestCase;\n toolCalls: unknown;\n text: unknown;\n finishReason: unknown;\n debugSummaryRef: { originalText?: string; toolCalls?: string };\n nameMap: Map<string, string>;\n transformedTools: TransformedTool[];\n flatMessages: Message[];\n tools: ToolSpec[];\n caseLogs: string[];\n }): { valid: boolean; logs: string[] } => {\n const {\n testCase,\n toolCalls,\n text,\n finishReason,\n debugSummaryRef,\n nameMap,\n transformedTools,\n flatMessages,\n tools,\n caseLogs,\n } = options;\n\n const mwOriginalText: string | undefined =\n debugSummaryRef.originalText;\n const mwParsedToolCalls = parseDebugToolCalls(\n debugSummaryRef.toolCalls\n );\n\n logRawToolCalls({\n toolCalls,\n finishReason,\n text,\n testCaseId: testCase.id,\n caseLogs,\n });\n\n const possibleAnswer = possibleAnswersMap.get(testCase.id);\n if (!possibleAnswer) {\n throw new Error(`No possible answer for id: ${testCase.id}`);\n }\n\n const restoredCalls = restoreToolCalls(\n (toolCalls as unknown[]) || [],\n nameMap,\n transformedTools\n );\n\n const checkerResult = check(testCase, restoredCalls, possibleAnswer);\n\n return processValidationResult({\n checkerResult,\n testCase,\n tools,\n possibleAnswer,\n restoredCalls,\n flatMessages,\n mwOriginalText,\n text,\n finishReason,\n mwParsedToolCalls,\n caseLogs,\n });\n };\n\n // Per-test runner that does not throw and returns its own logs\n const runSingleCase = async (\n testCase: TestCase\n ): Promise<{ valid: boolean; logs: string[] }> => {\n const caseLogs: string[] = [];\n const { function: tools } = testCase;\n const temp = config?.temperature;\n const temperature = typeof temp === \"number\" ? temp : undefined;\n const maxTok = config?.maxTokens;\n const maxTokens = typeof maxTok === \"number\" ? maxTok : undefined;\n\n try {\n const { flatMessages, transformedTools, nameMap, toolsMap } =\n prepareTestCaseData(testCase);\n\n logFirstToolDebug(transformedTools, testCase.id, caseLogs);\n\n const { toolCalls, text, finishReason, debugSummaryRef } =\n await executeModelGeneration({\n model,\n flatMessages,\n toolsMap,\n temperature,\n maxTokens,\n });\n\n return processModelResponse({\n testCase,\n toolCalls,\n text,\n finishReason,\n debugSummaryRef,\n nameMap,\n transformedTools,\n flatMessages,\n tools: tools as ToolSpec[],\n caseLogs,\n });\n } catch (e: unknown) {\n caseLogs.push(\n `[ERROR] ${testCase.id}: Model generation failed: ${(e as Error)?.message}`\n );\n if ((e as Error)?.stack) {\n caseLogs.push(`[STACK] ${testCase.id}: ${(e as Error).stack}`);\n }\n return { valid: false, logs: caseLogs };\n }\n };\n\n // Generic concurrency mapper\n const mapWithConcurrency = async <T, R>(\n items: T[],\n concurrencyLimit: number,\n mapper: (item: T, index: number) => Promise<R>\n ): Promise<R[]> => {\n const results = new Array<R>(items.length);\n let idx = 0;\n const workers = new Array(Math.min(concurrencyLimit, items.length))\n .fill(0)\n .map(async () => {\n while (true) {\n const current = idx;\n idx += 1;\n if (current >= items.length) {\n break;\n }\n results[current] = await mapper(items[current], current);\n }\n });\n await Promise.all(workers);\n return results;\n };\n\n const resultsPerCase = await mapWithConcurrency(\n testCases,\n concurrency,\n async (tc) => runSingleCase(tc)\n );\n\n // Aggregate\n correctCount = resultsPerCase.reduce(\n (acc, r) => acc + (r.valid ? 1 : 0),\n 0\n );\n for (const r of resultsPerCase) {\n logs.push(...r.logs);\n }\n\n if (testCases.length === 0) {\n return {\n score: 0,\n success: false,\n metrics: {},\n logs: [\"No test cases found.\"],\n };\n }\n\n const score = correctCount / testCases.length;\n return {\n score,\n success: score > 0.95, // High success threshold as requested\n metrics: {\n correct_count: correctCount,\n total_cases: testCases.length,\n accuracy: score,\n },\n logs,\n };\n } catch (e: unknown) {\n return {\n score: 0,\n success: false,\n metrics: {},\n error: e as Error,\n logs: [\n `[FATAL] Failed to run benchmark ${name}: ${(e as Error).message}`,\n ],\n };\n }\n },\n };\n}\n\n// --- Exported Benchmark Instances ---\nexport const bfclSimpleBenchmark = createBfclBenchmark(\n \"bfcl-simple\",\n \"BFCL Simple Function Calling\",\n \"BFCL_v3_simple.jsonl\",\n \"BFCL_v3_simple_possible_answer.jsonl\"\n);\n\nexport const bfclParallelBenchmark = createBfclBenchmark(\n \"bfcl-parallel\",\n \"BFCL Parallel Function Calling\",\n \"BFCL_v3_parallel.jsonl\",\n \"BFCL_v3_parallel_possible_answer.jsonl\"\n);\n\nexport const bfclMultipleBenchmark = createBfclBenchmark(\n \"bfcl-multiple\",\n \"BFCL Multiple Function Calling\",\n \"BFCL_v3_multiple.jsonl\",\n \"BFCL_v3_multiple_possible_answer.jsonl\"\n);\n\nexport const bfclParallelMultipleBenchmark = createBfclBenchmark(\n \"bfcl-parallel-multiple\",\n \"BFCL Parallel & Multiple Function Calling\",\n \"BFCL_v3_parallel_multiple.jsonl\",\n \"BFCL_v3_parallel_multiple_possible_answer.jsonl\"\n);\n","import fs from \"node:fs\";\nimport { createRequire } from \"node:module\";\nimport path from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\n\n/**\n * Try to resolve data directory via package entry point\n */\nfunction tryResolveViaPackageEntry(moduleUrl?: string): string | null {\n try {\n const baseForRequireEntry =\n (typeof moduleUrl === \"string\" && moduleUrl) ||\n path.join(process.cwd(), \"package.json\");\n const requireFromEntry = createRequire(baseForRequireEntry);\n const entryPath = requireFromEntry.resolve(\"@ai-sdk-tool/eval\");\n const entryDir = path.dirname(entryPath);\n const guessPkgRoot = fs.existsSync(path.join(entryDir, \"..\"))\n ? path.resolve(entryDir, \"..\")\n : entryDir;\n const dataAtRoot = path.join(guessPkgRoot, \"data\");\n if (fs.existsSync(dataAtRoot)) {\n return dataAtRoot;\n }\n } catch {\n // ignore and continue to other strategies\n }\n return null;\n}\n\n/**\n * Try to resolve data directory via package.json\n */\nfunction tryResolveViaPackageJson(moduleUrl?: string): string | null {\n try {\n const baseForRequire =\n (typeof moduleUrl === \"string\" && moduleUrl) ||\n path.join(process.cwd(), \"package.json\");\n const require = createRequire(baseForRequire);\n const pkgJsonPath = require.resolve(\"@ai-sdk-tool/eval/package.json\");\n const pkgDir = path.dirname(pkgJsonPath);\n const dataAtPkg = path.join(pkgDir, \"data\");\n if (fs.existsSync(dataAtPkg)) {\n return dataAtPkg;\n }\n } catch {\n // ignore if resolution fails\n }\n return null;\n}\n\n/**\n * Determine starting directory from module URL\n */\nfunction getStartDir(moduleUrl?: string): string {\n if (moduleUrl) {\n try {\n return path.dirname(fileURLToPath(moduleUrl));\n } catch {\n return process.cwd();\n }\n }\n return process.cwd();\n}\n\n/**\n * Walk up directory tree to find data directory\n */\nfunction findDataDirByTraversal(startDir: string): string | null {\n let dir = startDir;\n const MAX_PARENT_TRAVERSAL_DEPTH = 6;\n for (let i = 0; i < MAX_PARENT_TRAVERSAL_DEPTH; i += 1) {\n const dataCandidate = path.join(dir, \"data\");\n if (fs.existsSync(dataCandidate)) {\n return dataCandidate;\n }\n const parent = path.resolve(dir, \"..\");\n if (parent === dir) {\n break; // reached filesystem root\n }\n dir = parent;\n }\n return null;\n}\n\n/**\n * Resolve the directory that holds the eval datasets.\n * Order:\n * 1) BFCL_DATA_DIR env var override\n * 2) Resolve the installed package root via require.resolve(\"@ai-sdk-tool/eval\") and use its sibling 'data'\n * 3) Resolve the installed package root via require.resolve(\"@ai-sdk-tool/eval/package.json\") and use its sibling 'data'\n * 4) Walk up from current module location to find nearest sibling 'data' directory\n * 5) Fallback to package-root/data assuming dist/benchmarks depth or cwd\n */\nexport function resolveDataDir(fromModuleUrl?: string): string {\n // 1) Explicit override\n const override = process.env.BFCL_DATA_DIR;\n if (override && override.trim().length > 0) {\n return override;\n }\n\n // 2) Try resolving via package entry point\n const viaEntry = tryResolveViaPackageEntry(fromModuleUrl);\n if (viaEntry) {\n return viaEntry;\n }\n\n // 3) Try resolving via package.json\n const viaPackageJson = tryResolveViaPackageJson(fromModuleUrl);\n if (viaPackageJson) {\n return viaPackageJson;\n }\n\n // 4) Walk up directory tree to find data directory\n const startDir = getStartDir(fromModuleUrl);\n const viaTraversal = findDataDirByTraversal(startDir);\n if (viaTraversal) {\n return viaTraversal;\n }\n\n // 5) Fallback to packageRoot/data assuming dist/benchmarks -> dist -> packageRoot\n const pkgRoot = path.resolve(startDir, \"..\", \"..\");\n return path.join(pkgRoot, \"data\");\n}\n","// Local ToolCall interface for type safety, as it's not exported from 'ai'.\nexport type ToolCall = {\n toolCallId: string;\n toolName: string;\n args: unknown;\n};\n\n// --- Type Definitions ---\nexport type FunctionDescription = {\n name: string;\n description?: string;\n parameters: {\n type: \"object\";\n properties: {\n [key: string]: {\n type: string;\n description?: string;\n items?: { type: string };\n };\n };\n required: string[];\n };\n};\n\n/**\n * Standardizes a string for comparison.\n */\nfunction standardizeString(input: string): string {\n if (typeof input !== \"string\") {\n return input;\n }\n const regex = /[ ,./\\\\-_*^]/g;\n return input.replace(regex, \"\").toLowerCase().replace(/'/g, '\"');\n}\n\n/**\n * Checks a string value against possible answers.\n */\nfunction checkStringValue(\n param: string,\n modelValue: string,\n possibleAnswers: unknown[]\n): { valid: boolean; error?: string; error_type?: string } {\n const standardizedModelValue = standardizeString(modelValue);\n const standardizedPossibleAnswers = possibleAnswers.map((ans) =>\n standardizeString(String(ans))\n );\n\n if (!standardizedPossibleAnswers.includes(standardizedModelValue)) {\n return {\n valid: false,\n error: `Invalid value for parameter '${param}': ${JSON.stringify(\n modelValue\n )}. Expected one of ${JSON.stringify(possibleAnswers)}.`,\n error_type: \"value_error:string\",\n };\n }\n return { valid: true };\n}\n\n/**\n * Normalizes objects by unwrapping single-element arrays (BFCL dataset quirk)\n */\nfunction normalizeObject(obj: unknown): unknown {\n if (Array.isArray(obj)) {\n return obj.map(normalizeObject);\n }\n if (obj && typeof obj === \"object\") {\n const normalized: Record<string, unknown> = {};\n for (const [key, value] of Object.entries(obj as Record<string, unknown>)) {\n // If value is a single-element array, unwrap it\n if (\n Array.isArray(value) &&\n value.length === 1 &&\n (typeof value[0] !== \"object\" || value[0] === null)\n ) {\n normalized[key] = value[0];\n } else {\n normalized[key] = normalizeObject(value);\n }\n }\n return normalized;\n }\n return obj;\n}\n\n/**\n * Checks if two values match, handling objects, numbers, and strings\n */\nfunction valuesMatch(modelValue: unknown, possibleValue: unknown): boolean {\n // Direct equality check first\n if (modelValue === possibleValue) {\n return true;\n }\n\n // For objects, perform deep comparison via JSON serialization\n if (\n typeof modelValue === \"object\" &&\n modelValue !== null &&\n typeof possibleValue === \"object\" &&\n possibleValue !== null\n ) {\n try {\n const normalizedModel = normalizeObject(modelValue);\n const normalizedPossible = normalizeObject(possibleValue);\n return (\n JSON.stringify(normalizedModel) === JSON.stringify(normalizedPossible)\n );\n } catch {\n return false;\n }\n }\n\n // For numbers, handle string/number conversion\n if (typeof modelValue === \"number\" && typeof possibleValue === \"string\") {\n return modelValue.toString() === possibleValue;\n }\n if (typeof modelValue === \"string\" && typeof possibleValue === \"number\") {\n return modelValue === possibleValue.toString();\n }\n\n return false;\n}\n\n/**\n * Checks array parameter values\n */\nfunction checkArrayValue(\n paramName: string,\n modelValue: unknown[],\n possibleValues: unknown\n): { valid: boolean; error?: string; error_type?: string } {\n const modelValueStr = JSON.stringify(\n modelValue.map((v) => standardizeString(String(v))).sort()\n );\n const hasMatch = Array.isArray(possibleValues)\n ? (possibleValues as unknown[]).some((p) => {\n if (!Array.isArray(p)) {\n return false;\n }\n return (\n JSON.stringify(p.map((v) => standardizeString(String(v))).sort()) ===\n modelValueStr\n );\n })\n : false;\n if (!hasMatch) {\n return {\n valid: false,\n error: `Invalid value for list parameter '${paramName}'. Got ${JSON.stringify(\n modelValue\n )}. Expected one of ${JSON.stringify(possibleValues)}.`,\n error_type: \"value_error:list\",\n };\n }\n return { valid: true };\n}\n\n/**\n * Checks object/other parameter values\n */\nfunction checkObjectValue(\n paramName: string,\n modelValue: unknown,\n possibleValues: unknown\n): { valid: boolean; error?: string; error_type?: string } {\n const hasMatch = Array.isArray(possibleValues)\n ? (possibleValues as unknown[]).some((possibleValue) =>\n valuesMatch(modelValue, possibleValue)\n )\n : false;\n\n if (!hasMatch) {\n return {\n valid: false,\n error: `Invalid value for parameter '${paramName}'. Got ${JSON.stringify(\n modelValue\n )}. Expected one of ${JSON.stringify(possibleValues)}.`,\n error_type: \"value_error:other\",\n };\n }\n return { valid: true };\n}\n\ntype CheckerResult = { valid: boolean; error?: string; error_type?: string };\n\ntype CheckerContext = {\n funcDescription: FunctionDescription;\n modelToolCall: ToolCall;\n possibleAnswerParams: Record<string, unknown>;\n expectedParams: Record<\n string,\n { type: string; description?: string; items?: { type: string } }\n >;\n};\n\n/**\n * Main checker for a single function call.\n * Aligned with the `ai` package's `ToolCall` type.\n */\nexport function simpleFunctionChecker(\n funcDescription: FunctionDescription,\n modelToolCall: ToolCall,\n possibleAnswer: Record<string, unknown>\n): CheckerResult {\n const funcNameCheck = checkFunctionName(\n funcDescription.name,\n modelToolCall.toolName\n );\n if (!funcNameCheck.valid) {\n return funcNameCheck;\n }\n\n const possibleAnswerParams = possibleAnswer[\n Object.keys(possibleAnswer)[0]\n ] as Record<string, unknown>;\n\n const argsObj: Record<string, unknown> =\n modelToolCall.args && typeof modelToolCall.args === \"object\"\n ? (modelToolCall.args as Record<string, unknown>)\n : {};\n\n const context: CheckerContext = {\n funcDescription,\n modelToolCall,\n possibleAnswerParams,\n expectedParams: funcDescription.parameters.properties,\n };\n\n const requiredCheck = checkRequiredParams(\n funcDescription.parameters.required,\n argsObj\n );\n if (!requiredCheck.valid) {\n return requiredCheck;\n }\n\n const paramsCheck = checkAllParameters(argsObj, context);\n if (!paramsCheck.valid) {\n return paramsCheck;\n }\n\n const optionalCheck = checkOptionalParams(argsObj, possibleAnswerParams);\n if (!optionalCheck.valid) {\n return optionalCheck;\n }\n\n return { valid: true };\n}\n\nfunction checkFunctionName(expected: string, actual: string): CheckerResult {\n if (actual !== expected) {\n return {\n valid: false,\n error: `Function name '${actual}' does not match expected '${expected}'.`,\n error_type: \"simple_function_checker:wrong_func_name\",\n };\n }\n return { valid: true };\n}\n\nfunction checkRequiredParams(\n requiredParams: string[],\n argsObj: Record<string, unknown>\n): CheckerResult {\n for (const param of requiredParams) {\n if (!(param in argsObj)) {\n return {\n valid: false,\n error: `Missing required parameter: '${param}'.`,\n error_type: \"simple_function_checker:missing_required\",\n };\n }\n }\n return { valid: true };\n}\n\nfunction checkAllParameters(\n argsObj: Record<string, unknown>,\n context: CheckerContext\n): CheckerResult {\n for (const paramName of Object.keys(argsObj)) {\n const paramCheck = checkSingleParameter(\n paramName,\n argsObj[paramName],\n context\n );\n if (!paramCheck.valid) {\n return paramCheck;\n }\n }\n return { valid: true };\n}\n\nfunction checkSingleParameter(\n paramName: string,\n modelValue: unknown,\n context: CheckerContext\n): CheckerResult {\n if (\n !(\n paramName in context.expectedParams &&\n paramName in context.possibleAnswerParams\n )\n ) {\n return {\n valid: false,\n error: `Unexpected parameter: '${paramName}'.`,\n error_type: \"simple_function_checker:unexpected_param\",\n };\n }\n\n const possibleValues = context.possibleAnswerParams[paramName] as unknown;\n\n if (typeof modelValue === \"string\") {\n return checkStringValue(\n paramName,\n modelValue,\n (possibleValues as unknown[] | undefined) ?? []\n );\n }\n\n if (Array.isArray(modelValue)) {\n return checkArrayValue(paramName, modelValue, possibleValues);\n }\n\n return checkObjectValue(paramName, modelValue, possibleValues);\n}\n\nfunction checkOptionalParams(\n argsObj: Record<string, unknown>,\n possibleAnswerParams: Record<string, unknown>\n): CheckerResult {\n for (const paramName in possibleAnswerParams) {\n if (Object.hasOwn(possibleAnswerParams, paramName)) {\n const val = possibleAnswerParams[paramName] as unknown;\n const isOptional = Array.isArray(val) && val.includes(\"\");\n if (!(paramName in argsObj || isOptional)) {\n return {\n valid: false,\n error: `Missing optional parameter '${paramName}' which was not marked as optional.`,\n error_type: \"simple_function_checker:missing_optional\",\n };\n }\n }\n }\n return { valid: true };\n}\n\n/**\n * Checker for parallel function calls (order-agnostic).\n */\nexport function parallelFunctionCheckerNoOrder(\n funcDescriptions: FunctionDescription[],\n modelToolCalls: ToolCall[],\n possibleAnswers: Record<string, unknown>[]\n): { valid: boolean; error?: string; error_type?: string } {\n if (modelToolCalls.length !== possibleAnswers.length) {\n return {\n valid: false,\n error: `Wrong number of functions. Expected ${possibleAnswers.length}, got ${modelToolCalls.length}.`,\n error_type: \"parallel_function_checker_no_order:wrong_count\",\n };\n }\n\n const matchedModelCallIndices = new Set<number>();\n for (const possibleAnswer of possibleAnswers) {\n const expectedFuncName = Object.keys(possibleAnswer)[0];\n const funcDescription = funcDescriptions.find(\n (f) => f.name === expectedFuncName\n );\n\n if (!funcDescription) {\n return {\n valid: false,\n error: `Could not find function description for '${expectedFuncName}'.`,\n error_type: \"parallel_function_checker_no_order:missing_func_desc\",\n };\n }\n\n let foundMatch = false;\n for (let i = 0; i < modelToolCalls.length; i += 1) {\n if (matchedModelCallIndices.has(i)) {\n continue;\n }\n\n const checkerResult = simpleFunctionChecker(\n funcDescription,\n modelToolCalls[i],\n possibleAnswer\n );\n if (checkerResult.valid) {\n matchedModelCallIndices.add(i);\n foundMatch = true;\n break;\n }\n }\n\n if (!foundMatch) {\n return {\n valid: false,\n error: `Could not find a matching function call for '${expectedFuncName}'.`,\n error_type: \"parallel_function_checker_no_order:cannot_find_match\",\n };\n }\n }\n return { valid: true };\n}\n\n/**\n * Checker for multiple calls to the same function.\n */\nexport function multipleFunctionChecker(\n funcDescriptions: FunctionDescription[],\n modelToolCalls: ToolCall[],\n possibleAnswers: Record<string, unknown>[]\n): { valid: boolean; error?: string; error_type?: string } {\n if (modelToolCalls.length !== possibleAnswers.length) {\n return {\n valid: false,\n error: `Wrong number of functions. Expected ${possibleAnswers.length}, got ${modelToolCalls.length}.`,\n error_type: \"multiple_function_checker:wrong_count\",\n };\n }\n\n const expectedFuncName = Object.keys(possibleAnswers[0])[0];\n const funcDescription = funcDescriptions.find(\n (f) => f.name === expectedFuncName\n );\n\n if (!funcDescription) {\n return {\n valid: false,\n error: `Could not find function description for '${expectedFuncName}'.`,\n error_type: \"multiple_function_checker:missing_func_desc\",\n };\n }\n\n return simpleFunctionChecker(\n funcDescription,\n modelToolCalls[0],\n possibleAnswers[0]\n );\n}\n","import { promises as fs } from \"node:fs\";\nimport path from \"node:path\";\nimport { generateText, type LanguageModel } from \"ai\";\nimport Ajv, { type AnySchema } from \"ajv\";\n\nimport type { BenchmarkResult, LanguageModelV3Benchmark } from \"@/interfaces\";\nimport { resolveDataDir } from \"@/utils/paths\";\n\ntype Json = unknown;\n\n// Regex patterns used for JSON extraction\nconst JSON_FENCE_REGEX = /```json\\s*([\\s\\S]*?)```/i;\nconst CODE_FENCE_REGEX = /```\\s*([\\s\\S]*?)```/i;\nconst NEWLINE_REGEX = /\\r?\\n/;\nconst LINE_SPLIT_REGEX = /\\r?\\n/;\n\ntype SchemaTestCase = {\n id: string;\n description: string;\n schema: AnySchema; // JSON Schema (draft 2020-12 subset supported by Ajv v8)\n promptFacts: string; // natural language facts to express desired values\n expected: Json; // subset of fields we expect to match exactly\n};\n\ntype ExpectedRecord = {\n id: string;\n expected: Json;\n};\n\nfunction tryDirectParse(text: string): Json | undefined {\n try {\n return JSON.parse(text);\n } catch {\n return;\n }\n}\n\nfunction tryCodeFenceParse(text: string): Json | undefined {\n const fenceMatch =\n text.match(JSON_FENCE_REGEX) || text.match(CODE_FENCE_REGEX);\n if (!fenceMatch) {\n return;\n }\n\n const inner = fenceMatch[1].trim();\n try {\n return JSON.parse(inner);\n } catch {\n return;\n }\n}\n\nfunction tryBracketScan(text: string): Json | undefined {\n const startIdxObj = text.indexOf(\"{\");\n const startIdxArr = text.indexOf(\"[\");\n const start = [startIdxObj, startIdxArr]\n .filter((i) => i >= 0)\n .sort((a, b) => a - b)[0];\n\n if (start === undefined) {\n return;\n }\n\n const open = text[start] === \"{\" ? \"{\" : \"[\";\n const close = open === \"{\" ? \"}\" : \"]\";\n let depth = 0;\n\n for (let i = start; i < text.length; i += 1) {\n const ch = text[i];\n if (ch === open) {\n depth += 1;\n } else if (ch === close) {\n depth -= 1;\n }\n\n if (depth === 0) {\n const candidate = text.slice(start, i + 1);\n try {\n return JSON.parse(candidate);\n } catch {\n return;\n }\n }\n }\n\n return;\n}\n\nfunction extractFirstJsonBlock(text: string): Json | undefined {\n // 1) try direct parse\n const directResult = tryDirectParse(text);\n if (directResult !== undefined) {\n return directResult;\n }\n\n // 2) try code fence ```json ... ```\n const fenceResult = tryCodeFenceParse(text);\n if (fenceResult !== undefined) {\n return fenceResult;\n }\n\n // 3) bracket scanning for first object or array\n return tryBracketScan(text);\n}\n\nfunction subsetMatch(expected: Json, actual: Json): boolean {\n // primitives\n if (expected === null || typeof expected !== \"object\") {\n return expected === actual;\n }\n // arrays\n if (Array.isArray(expected)) {\n if (!Array.isArray(actual)) {\n return false;\n }\n // Require at least that expected elements (by index) match if provided\n for (let i = 0; i < expected.length; i += 1) {\n if (!subsetMatch(expected[i], actual[i])) {\n return false;\n }\n }\n return true;\n }\n // object subset\n if (actual === null || typeof actual !== \"object\") {\n return false;\n }\n const eObj = expected as Record<string, unknown>;\n const aObj = actual as Record<string, unknown>;\n for (const key of Object.keys(eObj)) {\n if (!subsetMatch(eObj[key], aObj[key])) {\n return false;\n }\n }\n return true;\n}\n\n// Test cases will be loaded from data files at runtime\n\ntype DatasetLoadResult = {\n tests: Omit<SchemaTestCase, \"expected\">[];\n expectedMap: Map<string, ExpectedRecord>;\n error?: Error;\n};\n\nasync function loadDatasets(): Promise<DatasetLoadResult> {\n try {\n const dataDir = resolveDataDir();\n const testsJsonl = await fs.readFile(\n path.join(dataDir, \"json_generation_tests.jsonl\"),\n \"utf-8\"\n );\n const expectedJsonl = await fs.readFile(\n path.join(dataDir, \"json_generation_expected.jsonl\"),\n \"utf-8\"\n );\n\n const tests = testsJsonl\n .split(NEWLINE_REGEX)\n .filter((line) => line.trim().length > 0)\n .map((line) => JSON.parse(line));\n\n const expecteds: ExpectedRecord[] = expectedJsonl\n .split(NEWLINE_REGEX)\n .filter((line) => line.trim().length > 0)\n .map((line) => JSON.parse(line));\n\n const expectedMap = new Map<string, ExpectedRecord>();\n for (const r of expecteds) {\n expectedMap.set(r.id, r);\n }\n\n return { tests, expectedMap };\n } catch (e: unknown) {\n return {\n tests: [],\n expectedMap: new Map(),\n error: e as Error,\n };\n }\n}\n\nfunction buildMessages(tc: Omit<SchemaTestCase, \"expected\">) {\n const schemaStr = JSON.stringify(tc.schema, null, 2);\n return [\n {\n role: \"system\" as const,\n content:\n \"You must output only a single JSON document that strictly conforms to the given JSON Schema. Do not include any extra text or code fences.\",\n },\n {\n role: \"user\" as const,\n content: [\n \"Generate a JSON object that reflects the following facts.\",\n \"JSON Schema:\",\n schemaStr,\n \"Facts:\",\n tc.promptFacts,\n \"Output must be a single JSON only, with no additional text.\",\n ].join(\"\\n\\n\"),\n },\n ];\n}\n\ntype ValidationResult = {\n valid: boolean;\n valuesOk: boolean;\n parsed: Json;\n};\n\ntype ValidationContext = {\n expectedMap: Map<string, ExpectedRecord>;\n ajv: Ajv;\n logs: string[];\n};\n\nfunction validateTestCase(\n tc: Omit<SchemaTestCase, \"expected\">,\n parsed: Json,\n context: ValidationContext\n): ValidationResult {\n const validate = context.ajv.compile(tc.schema);\n const valid = validate(parsed) as boolean;\n\n if (!valid) {\n context.logs.push(\n `[INFO] ${tc.id}: Schema validation errors: ${\n (validate.errors || [])\n .map((e) => `${e.instancePath} ${e.message}`)\n .join(\", \") || \"unknown\"\n }`\n );\n }\n\n const expectedRec = context.expectedMap.get(tc.id);\n if (!expectedRec) {\n context.logs.push(\n `[WARN] ${tc.id}: No expected record found. Skipping value match.`\n );\n }\n\n const valuesOk = expectedRec\n ? subsetMatch(expectedRec.expected, parsed)\n : false;\n\n return { valid, valuesOk, parsed };\n}\n\ntype ProcessContext = {\n model: LanguageModel;\n config: Record<string, unknown> | undefined;\n validation: ValidationContext;\n};\n\nasync function processTestCase(\n tc: Omit<SchemaTestCase, \"expected\">,\n context: ProcessContext\n): Promise<{ schemaValid: boolean; valueMatch: boolean; correct: boolean }> {\n const messages = buildMessages(tc);\n\n const temp = context.config?.temperature;\n const temperature = typeof temp === \"number\" ? temp : undefined;\n const { text } = await generateText({\n model: context.model,\n messages,\n ...(temperature !== undefined ? { temperature } : {}),\n });\n\n let parsed: Json | undefined;\n try {\n parsed = extractFirstJsonBlock(text);\n } catch {\n // ignore parse errors\n }\n\n if (parsed === undefined) {\n context.validation.logs.push(\n `[FAIL] ${tc.id}: Unable to parse JSON from model output.`\n );\n return { schemaValid: false, valueMatch: false, correct: false };\n }\n\n const {\n valid,\n valuesOk,\n parsed: validatedParsed,\n } = validateTestCase(tc, parsed, context.validation);\n\n const correct = valid && valuesOk;\n if (correct) {\n context.validation.logs.push(`[PASS] ${tc.id}`);\n } else {\n context.validation.logs.push(\n `[FAIL] ${tc.id}: schemaValid=${valid}, valuesOk=${valuesOk}. Output=${JSON.stringify(\n validatedParsed\n )}`\n );\n }\n\n return { schemaValid: valid, valueMatch: valuesOk, correct };\n}\n\nexport const jsonGenerationBenchmark: LanguageModelV3Benchmark = {\n name: \"json-generation\",\n version: \"2.1.0\",\n description:\n \"Evaluates schema-compliant JSON generation from natural language using JSON Schema prompts.\",\n\n async run(\n model: LanguageModel,\n config?: Record<string, unknown>\n ): Promise<BenchmarkResult> {\n const logs: string[] = [];\n const ajv = new Ajv({ allErrors: true, strict: false });\n\n // Load datasets\n const { tests, expectedMap, error } = await loadDatasets();\n if (error) {\n return {\n score: 0,\n success: false,\n metrics: {},\n logs: [\n `[FATAL] Failed to load json-generation datasets: ${error.message}`,\n ],\n error,\n };\n }\n\n const context: ProcessContext = {\n model,\n config,\n validation: { expectedMap, ajv, logs },\n };\n\n const counts = await processAllTests(tests, context);\n return buildBenchmarkResult(tests.length, counts, logs);\n },\n};\n\nasync function processAllTests(\n tests: Omit<SchemaTestCase, \"expected\">[],\n context: ProcessContext\n): Promise<{\n schemaValidCount: number;\n valueMatchCount: number;\n correctCount: number;\n}> {\n let schemaValidCount = 0;\n let valueMatchCount = 0;\n let correctCount = 0;\n\n for (const tc of tests) {\n try {\n const result = await processTestCase(tc, context);\n if (result.schemaValid) {\n schemaValidCount += 1;\n }\n if (result.valueMatch) {\n valueMatchCount += 1;\n }\n if (result.correct) {\n correctCount += 1;\n }\n } catch (e: unknown) {\n const msg = e instanceof Error ? e.message : String(e);\n context.validation.logs.push(`[ERROR] ${tc.id}: ${msg}`);\n }\n }\n\n return { schemaValidCount, valueMatchCount, correctCount };\n}\n\nfunction buildBenchmarkResult(\n total: number,\n counts: {\n schemaValidCount: number;\n valueMatchCount: number;\n correctCount: number;\n },\n logs: string[]\n): BenchmarkResult {\n const score = counts.correctCount / total;\n return {\n score,\n success: score >= 0.8,\n metrics: {\n total_cases: total,\n correct_count: counts.correctCount,\n schema_valid_count: counts.schemaValidCount,\n value_match_count: counts.valueMatchCount,\n accuracy: score,\n },\n logs,\n };\n}\n\n// A schema-only variant that validates structure/format without value matching\ntype SchemaOnlyTestCase = Omit<SchemaTestCase, \"expected\">;\n\ntype SchemaOnlyContext = {\n model: LanguageModel;\n config: Record<string, unknown> | undefined;\n ajv: Ajv;\n logs: string[];\n};\n\nasync function loadSchemaOnlyTests(): Promise<{\n tests: SchemaOnlyTestCase[];\n error?: Error;\n}> {\n try {\n const dataDir = resolveDataDir();\n const testsJsonl = await fs.readFile(\n path.join(dataDir, \"json_generation_tests.jsonl\"),\n \"utf-8\"\n );\n const tests = testsJsonl\n .split(LINE_SPLIT_REGEX)\n .filter((line) => line.trim().length > 0)\n .map((line) => JSON.parse(line));\n return { tests };\n } catch (e: unknown) {\n return { tests: [], error: e as Error };\n }\n}\n\nasync function processSchemaOnlyTestCase(\n tc: SchemaOnlyTestCase,\n context: SchemaOnlyContext\n): Promise<boolean> {\n const messages = buildMessages(tc);\n\n const temp = context.config?.temperature;\n const temperature = typeof temp === \"number\" ? temp : undefined;\n const { text } = await generateText({\n model: context.model,\n messages,\n ...(temperature !== undefined ? { temperature } : {}),\n });\n\n let parsed: Json | undefined;\n try {\n parsed = extractFirstJsonBlock(text);\n } catch {\n // ignore\n }\n if (parsed === undefined) {\n context.logs.push(\n `[FAIL] ${tc.id}: Could not parse JSON from model output.`\n );\n return false;\n }\n\n const validate = context.ajv.compile(tc.schema);\n const valid = validate(parsed) as boolean;\n if (valid) {\n context.logs.push(`[PASS] ${tc.id}`);\n return true;\n }\n\n context.logs.push(\n `[FAIL] ${tc.id}: Schema validation errors: ${\n (validate.errors || [])\n .map((e) => `${e.instancePath} ${e.message}`)\n .join(\", \") || \"unknown\"\n }`\n );\n return false;\n}\n\nasync function runSchemaOnlyTests(\n tests: SchemaOnlyTestCase[],\n context: SchemaOnlyContext\n): Promise<number> {\n let schemaValidCount = 0;\n\n for (const tc of tests) {\n try {\n const isValid = await processSchemaOnlyTestCase(tc, context);\n if (isValid) {\n schemaValidCount += 1;\n }\n } catch (e: unknown) {\n const msg = e instanceof Error ? e.message : String(e);\n context.logs.push(`[ERROR] ${tc.id}: ${msg}`);\n }\n }\n\n return schemaValidCount;\n}\n\nexport const jsonGenerationSchemaOnlyBenchmark: LanguageModelV3Benchmark = {\n name: \"json-generation-schema-only\",\n version: \"1.0.1\",\n description:\n \"Evaluates whether model outputs strictly conform to the provided JSON Schema (structure only).\",\n\n async run(\n model: LanguageModel,\n config?: Record<string, unknown>\n ): Promise<BenchmarkResult> {\n const logs: string[] = [];\n const ajv = new Ajv({ allErrors: true, strict: false });\n\n const { tests, error } = await loadSchemaOnlyTests();\n if (error) {\n const msg = error.message;\n return {\n score: 0,\n success: false,\n metrics: {},\n logs: [`[FATAL] Failed to load schema-only tests: ${msg}`],\n error,\n };\n }\n\n const context: SchemaOnlyContext = { model, config, ajv, logs };\n const schemaValidCount = await runSchemaOnlyTests(tests, context);\n\n const total = tests.length;\n const score = total > 0 ? schemaValidCount / total : 0;\n return {\n score,\n success: score >= 0.8,\n metrics: {\n total_cases: total,\n schema_valid_count: schemaValidCount,\n accuracy: score,\n },\n logs,\n };\n },\n};\n","import type { EvaluationResult } from \"@/interfaces\";\n\n// Basic ANSI color codes for console output\nconst colors = {\n reset: \"\\x1b[0m\",\n green: \"\\x1b[32m\",\n red: \"\\x1b[31m\",\n yellow: \"\\x1b[33m\",\n cyan: \"\\x1b[36m\",\n magenta: \"\\x1b[35m\",\n gray: \"\\x1b[90m\",\n};\n\nfunction printResult(result: EvaluationResult) {\n const { model, modelKey, benchmark, result: benchmarkResult } = result;\n const status = benchmarkResult.success\n ? `${colors.green}✔ SUCCESS${colors.reset}`\n : `${colors.red}✖ FAILURE${colors.reset}`;\n\n console.log(\n `\\n ${colors.cyan}[${model}]${colors.reset}${modelKey ? ` ${colors.gray}(${modelKey})${colors.reset}` : \"\"} - ${colors.magenta}${benchmark}${colors.reset}`\n );\n console.log(\n ` └ ${status} | Score: ${colors.yellow}${benchmarkResult.score.toFixed(2)}${colors.reset}`\n );\n\n const metrics = Object.entries(benchmarkResult.metrics);\n if (metrics.length > 0) {\n console.log(\" Metrics:\");\n for (const [key, value] of metrics) {\n console.log(` - ${key}: ${value}`);\n }\n }\n\n if (benchmarkResult.error) {\n console.log(\n ` ${colors.red}Error: ${benchmarkResult.error.message}${colors.reset}`\n );\n }\n}\n\nexport function consoleReporter(results: EvaluationResult[]): void {\n console.log(\"\\n--- 📊 Evaluation Report ---\");\n for (const result of results) {\n printResult(result);\n }\n console.log(\"\\n---------------------------\\n\");\n}\n","import type { EvaluationResult } from \"@/interfaces\";\n\n// Regex patterns at module level for performance\nconst FAIL_ID_REGEX = /^\\[FAIL\\]\\s+([^:]+):/;\nconst DEBUG_FAIL_PREFIX_REGEX = /^\\[DEBUG-FAIL\\] /;\nconst DEBUG_FAIL_CONTEXT_PREFIX_REGEX = /^\\[DEBUG-FAIL-CONTEXT\\] /;\n\nconst colors = {\n reset: \"\\x1b[0m\",\n green: \"\\x1b[32m\",\n red: \"\\x1b[31m\",\n yellow: \"\\x1b[33m\",\n cyan: \"\\x1b[36m\",\n magenta: \"\\x1b[35m\",\n gray: \"\\x1b[90m\",\n bold: \"\\x1b[1m\",\n underline: \"\\x1b[4m\",\n};\n\nfunction colorizeDiffLine(line: string): string {\n if (line.startsWith(\"+\")) {\n return `${colors.green}${line}${colors.reset}`;\n }\n if (line.startsWith(\"-\")) {\n return `${colors.red}${line}${colors.reset}`;\n }\n if (line.startsWith(\"@\")) {\n return `${colors.cyan}${colors.bold}${line}${colors.reset}`;\n }\n return line;\n}\n\nfunction uniqueLines(lines: string[]): string[] {\n const seen = new Set<string>();\n const out: string[] = [];\n for (const l of lines) {\n if (seen.has(l)) {\n continue;\n }\n seen.add(l);\n out.push(l);\n }\n return out;\n}\n\n// Helper function to check if diff contains function name issues\nfunction hasFunctionNameIssue(diff: unknown[]): boolean {\n return diff.some(\n (d: unknown) =>\n String(d).includes(\"function name\") ||\n String(d).includes(\"missing function:\")\n );\n}\n\n// Helper function to suggest function name fixes\nfunction suggestFunctionNameFix(\n expected: unknown,\n actual: unknown,\n suggestions: string[]\n): void {\n const expectedName = (expected as Record<string, unknown> | undefined)\n ?.function as string | undefined;\n const actualName = (actual as Record<string, unknown> | undefined)\n ?.function as string | undefined;\n if (expectedName && actualName && expectedName !== actualName) {\n suggestions.push(\n `Call the function '${expectedName}' instead of '${actualName}'.`\n );\n }\n if (Array.isArray((expected as Record<string, unknown>)?.functions)) {\n suggestions.push(\n `Ensure tool calls include: ${((expected as Record<string, unknown>).functions as string[]).join(\", \")}.`\n );\n }\n}\n\n// Helper function to suggest missing parameter fixes\nfunction suggestMissingParamFix(diff: unknown[], suggestions: string[]): void {\n const missing = diff\n .filter((d: unknown) => String(d).startsWith(\"- missing required param:\"))\n .map((d: unknown) => String(d).replace(\"- missing required param: \", \"\"));\n if (missing.length) {\n suggestions.push(`Add required parameter(s): ${missing.join(\", \")}.`);\n }\n}\n\n// Helper function to suggest unexpected parameter fixes\nfunction suggestUnexpectedParamFix(\n diff: unknown[],\n suggestions: string[]\n): void {\n const extras = diff\n .filter((d: unknown) => String(d).startsWith(\"+ unexpected param:\"))\n .map((d: unknown) => String(d).replace(\"+ unexpected param: \", \"\"));\n if (extras.length) {\n suggestions.push(`Remove unexpected parameter(s): ${extras.join(\", \")}.`);\n }\n}\n\n// Helper function to suggest parameter value fixes\nfunction suggestParamValueFix(diff: unknown[], suggestions: string[]): void {\n const targets = diff\n .filter((d: unknown) => String(d).startsWith(\"@@ param \"))\n .map((d: unknown) => String(d).replace(\"@@ param \", \"\"));\n for (const param of targets) {\n const allowedOneOfLine = (diff as unknown[]).find((d: unknown) =>\n String(d).startsWith(\"- expected one of:\")\n ) as string | undefined;\n const allowedSingleLine = (diff as unknown[]).find((d: unknown) =>\n String(d).startsWith(\"- expected:\")\n ) as string | undefined;\n if (allowedSingleLine) {\n const value = allowedSingleLine.replace(\"- expected: \", \"\");\n suggestions.push(`Set '${param}' to: ${value}.`);\n } else if (allowedOneOfLine) {\n const allowed = allowedOneOfLine.replace(\"- expected one of: \", \"\");\n suggestions.push(`Set '${param}' to one of: ${allowed}.`);\n } else {\n suggestions.push(`Adjust '${param}' to an allowed value.`);\n }\n }\n}\n\n// Helper function to suggest fixes based on error type\nfunction suggestFromErrorType(error_type: string, suggestions: string[]): void {\n if (error_type.includes(\"missing_required\")) {\n suggestions.push(\"Add all required parameters defined by the tool schema.\");\n } else if (error_type.includes(\"unexpected_param\")) {\n suggestions.push(\"Remove parameters not present in the tool schema.\");\n } else if (error_type.includes(\"wrong_count\")) {\n suggestions.push(\n \"Adjust the number of tool calls to match expected count.\"\n );\n } else if (error_type.includes(\"wrong_func_name\")) {\n suggestions.push(\"Use the exact expected function name from the schema.\");\n } else if (error_type.includes(\"value_error\")) {\n suggestions.push(\"Choose a value from the allowed options.\");\n }\n}\n\nfunction suggestFixFromDiff(parsed: unknown): string[] {\n const suggestions: string[] = [];\n const { error_type, expected, actual, diff } =\n (parsed as Record<string, unknown>) ?? {};\n\n if (!Array.isArray(diff)) {\n if (suggestions.length === 0 && typeof error_type === \"string\") {\n suggestFromErrorType(error_type, suggestions);\n }\n return uniqueLines(suggestions);\n }\n\n if (hasFunctionNameIssue(diff)) {\n suggestFunctionNameFix(expected, actual, suggestions);\n }\n\n if (\n diff.some((d: unknown) => String(d).startsWith(\"- missing required param:\"))\n ) {\n suggestMissingParamFix(diff, suggestions);\n }\n\n if (diff.some((d: unknown) => String(d).startsWith(\"+ unexpected param:\"))) {\n suggestUnexpectedParamFix(diff, suggestions);\n }\n\n if (diff.some((d: unknown) => String(d).startsWith(\"@@ param \"))) {\n suggestParamValueFix(diff, suggestions);\n }\n\n if (suggestions.length === 0 && typeof error_type === \"string\") {\n suggestFromErrorType(error_type, suggestions);\n }\n\n return uniqueLines(suggestions);\n}\n\n// Helper function to extract test ID from a log line\nfunction getTestIdFromLogLine(line: string): string | undefined {\n if (line.startsWith(\"[FAIL]\")) {\n const m = line.match(FAIL_ID_REGEX);\n return m?.[1];\n }\n if (line.startsWith(\"[DEBUG-FAIL]\")) {\n try {\n const parsed = JSON.parse(line.replace(DEBUG_FAIL_PREFIX_REGEX, \"\"));\n return String(parsed?.id ?? \"\");\n } catch {\n // Intentionally ignore: malformed [DEBUG-FAIL] payloads are expected when\n // earlier steps fail to JSON-stringify complex values (circular/BigInt/etc.).\n // We only use parsed IDs for de-duplication, so a parse miss is safe.\n }\n }\n if (line.startsWith(\"[DEBUG-FAIL-CONTEXT]\")) {\n try {\n const parsed = JSON.parse(\n line.replace(DEBUG_FAIL_CONTEXT_PREFIX_REGEX, \"\")\n );\n return String(parsed?.id ?? \"\");\n } catch {\n /* intentionally ignored */\n }\n }\n return;\n}\n\n// Helper function to group logs by test ID\nfunction groupLogsByTestId(failLogs: string[]): Map<string, string[]> {\n const byId = new Map<string, string[]>();\n for (const line of failLogs) {\n const id = getTestIdFromLogLine(line);\n const key = id ?? \"__general__\";\n const arr = byId.get(key) ?? [];\n arr.push(line);\n byId.set(key, arr);\n }\n return byId;\n}\n\n// Helper function to collect debug IDs from lines\nfunction collectDebugIds(lines: string[]): Set<string> {\n const debugIds = new Set<string>();\n for (const l of lines) {\n if (l.startsWith(\"[DEBUG-FAIL]\")) {\n try {\n const parsed = JSON.parse(l.replace(DEBUG_FAIL_PREFIX_REGEX, \"\"));\n if (parsed?.id) {\n debugIds.add(String(parsed.id));\n }\n } catch {\n /* intentionally ignored */\n }\n }\n }\n return debugIds;\n}\n\n// Helper function to print formatted JSON with indentation\nfunction printIndentedJson(prefix: string, data: unknown, color: string): void {\n console.log(\n color +\n prefix +\n JSON.stringify(data, null, 2).split(\"\\n\").join(\"\\n \") +\n colors.reset\n );\n}\n\n// Helper function to handle DEBUG-FAIL line display\nfunction displayDebugFailLine(line: string): void {\n const payload = line.replace(DEBUG_FAIL_PREFIX_REGEX, \"\");\n try {\n const parsed = JSON.parse(payload);\n const { message, diff, expected, actual } = parsed;\n if (message) {\n console.log(` ${colors.bold}${message}${colors.reset}`);\n }\n if (diff && Array.isArray(diff)) {\n for (const dLine of diff) {\n console.log(` ${colorizeDiffLine(dLine)}`);\n }\n } else {\n console.log(\" expected:\");\n printIndentedJson(\" \", expected, colors.green);\n console.log(\" actual:\");\n printIndentedJson(\" \", actual, colors.red);\n }\n const suggestions = suggestFixFromDiff(parsed);\n if (suggestions.length) {\n console.log(` ${colors.bold}Suggested fix:${colors.reset}`);\n for (const s of suggestions) {\n console.log(` • ${s}`);\n }\n }\n } catch {\n console.log(` ${line}`);\n }\n}\n\n// Helper function to display context information\nfunction displayContextInfo(ctx: Record<string, unknown>): void {\n if (ctx.tool_schema) {\n printIndentedJson(\" tool schema: \", ctx.tool_schema, colors.gray);\n }\n if (ctx.last_user_query) {\n console.log(\n colors.gray +\n \" last user: \" +\n JSON.stringify(ctx.last_user_query) +\n colors.reset\n );\n }\n if (ctx.raw_model_text) {\n console.log(\n colors.gray +\n \" raw model text (middleware parsed):\\n \" +\n String(ctx.raw_model_text).split(\"\\n\").join(\"\\n \") +\n colors.reset\n );\n }\n if (ctx.parsed_tool_calls) {\n printIndentedJson(\n \" parsed tool calls: \",\n ctx.parsed_tool_calls,\n colors.gray\n );\n }\n if (ctx.ground_truth) {\n printIndentedJson(\n \" ground truth: \",\n ctx.ground_truth,\n colors.gray\n );\n }\n if (ctx.finish_reason) {\n console.log(\n colors.gray +\n \" finish reason: \" +\n JSON.stringify(ctx.finish_reason) +\n colors.reset\n );\n }\n}\n\n// Helper function to handle DEBUG-FAIL-CONTEXT line display\nfunction displayDebugFailContextLine(line: string): void {\n const payload = line.replace(DEBUG_FAIL_CONTEXT_PREFIX_REGEX, \"\");\n try {\n const ctx = JSON.parse(payload) as Record<string, unknown>;\n console.log(` ${colors.gray}context:${colors.reset}`);\n displayContextInfo(ctx);\n } catch {\n console.log(` ${line}`);\n }\n}\n\n// Helper function to display a single log line\nfunction displayLogLine(line: string, debugIds: Set<string>): void {\n if (line.startsWith(\"[FAIL]\")) {\n const m = line.match(FAIL_ID_REGEX);\n const failId = m?.[1];\n if (failId && debugIds.has(failId)) {\n return;\n }\n console.log(` ${colors.red}${line}${colors.reset}`);\n } else if (line.startsWith(\"[ERROR]\") || line.startsWith(\"[FATAL]\")) {\n console.log(` ${colors.yellow}${line}${colors.reset}`);\n } else if (line.startsWith(\"[STACK]\")) {\n console.log(` ${colors.gray}${line}${colors.reset}`);\n } else if (line.startsWith(\"[DEBUG-FAIL]\")) {\n displayDebugFailLine(line);\n } else if (line.startsWith(\"[DEBUG-FAIL-CONTEXT]\")) {\n displayDebugFailContextLine(line);\n }\n}\n\n// Helper function to display grouped failure logs\nfunction displayGroupedFailures(byId: Map<string, string[]>): void {\n console.log(` ${colors.bold}Failure details (grouped):${colors.reset}`);\n for (const [groupId, lines] of byId) {\n if (groupId !== \"__general__\") {\n console.log(` ${colors.underline}${groupId}${colors.reset}`);\n }\n const debugIds = collectDebugIds(lines);\n for (const line of lines) {\n displayLogLine(line, debugIds);\n }\n }\n}\n\n// Helper function to display success logs\nfunction displaySuccessLogs(logs: string[]): void {\n const info = logs.filter(\n (l) => l.startsWith(\"[INFO]\") || l.startsWith(\"[PASS]\")\n );\n for (const line of info) {\n console.log(` ${colors.gray}${line}${colors.reset}`);\n }\n}\n\n// Helper function to filter failure-related logs\nfunction filterFailureLogs(logs: string[]): string[] {\n return logs.filter(\n (l) =>\n l.startsWith(\"[FAIL]\") ||\n l.startsWith(\"[ERROR]\") ||\n l.startsWith(\"[FATAL]\") ||\n l.startsWith(\"[STACK]\") ||\n l.startsWith(\"[DEBUG-FAIL]\") ||\n l.startsWith(\"[DEBUG-FAIL-CONTEXT]\")\n );\n}\n\n// Helper function to display logs for a result\nfunction displayResultLogs(logs: string[]): void {\n const failLogs = filterFailureLogs(logs);\n const hasFails = failLogs.length > 0;\n if (hasFails) {\n const byId = groupLogsByTestId(failLogs);\n displayGroupedFailures(byId);\n } else {\n displaySuccessLogs(logs);\n }\n}\n\n// Helper function to display metrics\nfunction displayMetrics(metrics: [string, unknown][]): void {\n if (metrics.length > 0) {\n console.log(\" Metrics:\");\n for (const [k, v] of metrics) {\n console.log(` - ${k}: ${v}`);\n }\n }\n}\n\n// Helper function to display result header\nfunction displayResultHeader(r: EvaluationResult): void {\n const { model, modelKey, benchmark, result } = r;\n const status = result.success\n ? `${colors.green}✔ SUCCESS${colors.reset}`\n : `${colors.red}✖ FAILURE${colors.reset}`;\n\n console.log(\n `\\n ${colors.cyan}[${model}]${colors.reset}${modelKey ? ` ${colors.gray}(${modelKey})${colors.reset}` : \"\"} - ${colors.magenta}${benchmark}${colors.reset}`\n );\n console.log(\n ` └ ${status} | Score: ${colors.yellow}${result.score.toFixed(2)}${colors.reset}`\n );\n}\n\nexport function consoleDebugReporter(results: EvaluationResult[]): void {\n console.log(\"\\n--- 📊 Evaluation Report (debug) ---\");\n for (const r of results) {\n displayResultHeader(r);\n displayMetrics(Object.entries(r.result.metrics));\n if (r.result.logs?.length) {\n displayResultLogs(r.result.logs);\n }\n }\n console.log(\"\\n------------------------------------\\n\");\n}\n","import type { EvaluationResult } from \"@/interfaces\";\n\nexport function jsonReporter(results: EvaluationResult[]): void {\n // Output the raw results array as a JSON string.\n // The 'error' object is converted to a string for serialization.\n const serializableResults = results.map((r) => ({\n ...r,\n result: {\n ...r.result,\n error: r.result.error?.message,\n },\n }));\n console.log(JSON.stringify(serializableResults, null, 2));\n}\n","import type { EvaluationResult, ReporterType } from \"@/interfaces\";\n\nimport { consoleReporter } from \"./console\";\nimport { consoleDebugReporter } from \"./console.debug\";\nimport { jsonReporter } from \"./json\";\n\nexport const reporters: Record<\n ReporterType,\n (results: EvaluationResult[]) => void\n> = {\n console: consoleReporter,\n json: jsonReporter,\n \"console.debug\": consoleDebugReporter,\n};\n","import type { LanguageModel } from \"ai\";\n\nimport type {\n EvaluateOptions,\n EvaluationResult,\n LanguageModelV3Benchmark,\n ReporterType,\n} from \"./interfaces\";\nimport { reporters } from \"./reporters\";\n\nasync function runSingleBenchmark(\n model: LanguageModel,\n benchmark: LanguageModelV3Benchmark,\n modelKey?: string,\n config?: Record<string, unknown>\n): Promise<EvaluationResult> {\n const modelId =\n typeof model === \"object\" &&\n model !== null &&\n \"modelId\" in model &&\n typeof model.modelId === \"string\"\n ? model.modelId\n : \"unknown-model\";\n\n try {\n console.log(\n `[${modelId}]${modelKey ? ` (${modelKey})` : \"\"} Running benchmark: ${benchmark.name}...`\n );\n const result = await benchmark.run(model, config);\n console.log(\n `[${modelId}]${modelKey ? ` (${modelKey})` : \"\"} Finished benchmark: ${benchmark.name}. Score: ${result.score}`\n );\n return {\n model: modelId,\n modelKey,\n benchmark: benchmark.name,\n result,\n };\n } catch (error) {\n console.error(\n `[${modelId}]${modelKey ? ` (${modelKey})` : \"\"} Error running benchmark: ${benchmark.name}`,\n error\n );\n return {\n model: modelId,\n modelKey,\n benchmark: benchmark.name,\n result: {\n score: 0,\n success: false,\n metrics: {},\n error: error instanceof Error ? error : new Error(String(error)),\n },\n };\n }\n}\n\n/**\n * Normalize models input to array of [key, model] entries\n */\nfunction normalizeModels(\n models: LanguageModel | LanguageModel[] | Record<string, LanguageModel>\n): [string | undefined, LanguageModel][] {\n const modelEntries: [string | undefined, LanguageModel][] = [];\n\n if (Array.isArray(models)) {\n for (const m of models) {\n modelEntries.push([undefined, m]);\n }\n } else if (\n typeof models === \"object\" &&\n models !== null &&\n \"modelId\" in (models as Record<string, unknown>)\n ) {\n modelEntries.push([undefined, models as unknown as LanguageModel]);\n } else {\n for (const [key, m] of Object.entries(\n models as Record<string, LanguageModel>\n )) {\n modelEntries.push([key, m]);\n }\n }\n\n return modelEntries;\n}\n\n/**\n * Build config object from optional parameters\n */\nfunction buildConfig(\n temperature?: number,\n maxTokens?: number\n): Record<string, unknown> | undefined {\n const config: Record<string, unknown> = {};\n if (temperature !== undefined) {\n config.temperature = temperature;\n }\n if (maxTokens !== undefined) {\n config.maxTokens = maxTokens;\n }\n return Object.keys(config).length > 0 ? config : undefined;\n}\n\n/**\n * Execute reporter with results\n */\nfunction executeReporter(\n reporter: ReporterType,\n results: EvaluationResult[]\n): void {\n const report = reporters[reporter];\n if (report) {\n report(results);\n } else {\n console.warn(`Unknown reporter: '${reporter}'. Defaulting to console.`);\n reporters.console(results);\n }\n}\n\nexport async function evaluate(\n options: EvaluateOptions\n): Promise<EvaluationResult[]> {\n const {\n models,\n benchmarks,\n reporter = \"console\",\n temperature,\n maxTokens,\n } = options;\n\n const modelEntries = normalizeModels(models);\n const config = buildConfig(temperature, maxTokens);\n const allResults: EvaluationResult[] = [];\n\n for (const [modelKey, model] of modelEntries) {\n for (const benchmark of benchmarks) {\n const evaluationResult = await runSingleBenchmark(\n model,\n benchmark,\n modelKey,\n config\n );\n allResults.push(evaluationResult);\n }\n }\n\n executeReporter(reporter, allResults);\n return allResults;\n}\n"],"mappings":";AAAA,SAAS,YAAYA,WAAU;AAC/B,OAAOC,WAAU;AACjB;AAAA,EAEE;AAAA,EACA;AAAA,EAEA;AAAA,OACK;;;ACRP,OAAO,QAAQ;AACf,SAAS,qBAAqB;AAC9B,OAAO,UAAU;AACjB,SAAS,qBAAqB;AAK9B,SAAS,0BAA0B,WAAmC;AACpE,MAAI;AACF,UAAM,sBACH,OAAO,cAAc,YAAY,aAClC,KAAK,KAAK,QAAQ,IAAI,GAAG,cAAc;AACzC,UAAM,mBAAmB,cAAc,mBAAmB;AAC1D,UAAM,YAAY,iBAAiB,QAAQ,mBAAmB;AAC9D,UAAM,WAAW,KAAK,QAAQ,SAAS;AACvC,UAAM,eAAe,GAAG,WAAW,KAAK,KAAK,UAAU,IAAI,CAAC,IACxD,KAAK,QAAQ,UAAU,IAAI,IAC3B;AACJ,UAAM,aAAa,KAAK,KAAK,cAAc,MAAM;AACjD,QAAI,GAAG,WAAW,UAAU,GAAG;AAC7B,aAAO;AAAA,IACT;AAAA,EACF,QAAQ;AAAA,EAER;AACA,SAAO;AACT;AAKA,SAAS,yBAAyB,WAAmC;AACnE,MAAI;AACF,UAAM,iBACH,OAAO,cAAc,YAAY,aAClC,KAAK,KAAK,QAAQ,IAAI,GAAG,cAAc;AACzC,UAAMC,WAAU,cAAc,cAAc;AAC5C,UAAM,cAAcA,SAAQ,QAAQ,gCAAgC;AACpE,UAAM,SAAS,KAAK,QAAQ,WAAW;AACvC,UAAM,YAAY,KAAK,KAAK,QAAQ,MAAM;AAC1C,QAAI,GAAG,WAAW,SAAS,GAAG;AAC5B,aAAO;AAAA,IACT;AAAA,EACF,QAAQ;AAAA,EAER;AACA,SAAO;AACT;AAKA,SAAS,YAAY,WAA4B;AAC/C,MAAI,WAAW;AACb,QAAI;AACF,aAAO,KAAK,QAAQ,cAAc,SAAS,CAAC;AAAA,IAC9C,QAAQ;AACN,aAAO,QAAQ,IAAI;AAAA,IACrB;AAAA,EACF;AACA,SAAO,QAAQ,IAAI;AACrB;AAKA,SAAS,uBAAuB,UAAiC;AAC/D,MAAI,MAAM;AACV,QAAM,6BAA6B;AACnC,WAAS,IAAI,GAAG,IAAI,4BAA4B,KAAK,GAAG;AACtD,UAAM,gBAAgB,KAAK,KAAK,KAAK,MAAM;AAC3C,QAAI,GAAG,WAAW,aAAa,GAAG;AAChC,aAAO;AAAA,IACT;AACA,UAAM,SAAS,KAAK,QAAQ,KAAK,IAAI;AACrC,QAAI,WAAW,KAAK;AAClB;AAAA,IACF;AACA,UAAM;AAAA,EACR;AACA,SAAO;AACT;AAWO,SAAS,eAAe,eAAgC;AAE7D,QAAM,WAAW,QAAQ,IAAI;AAC7B,MAAI,YAAY,SAAS,KAAK,EAAE,SAAS,GAAG;AAC1C,WAAO;AAAA,EACT;AAGA,QAAM,WAAW,0BAA0B,aAAa;AACxD,MAAI,UAAU;AACZ,WAAO;AAAA,EACT;AAGA,QAAM,iBAAiB,yBAAyB,aAAa;AAC7D,MAAI,gBAAgB;AAClB,WAAO;AAAA,EACT;AAGA,QAAM,WAAW,YAAY,aAAa;AAC1C,QAAM,eAAe,uBAAuB,QAAQ;AACpD,MAAI,cAAc;AAChB,WAAO;AAAA,EACT;AAGA,QAAM,UAAU,KAAK,QAAQ,UAAU,MAAM,IAAI;AACjD,SAAO,KAAK,KAAK,SAAS,MAAM;AAClC;;;AC/FA,SAAS,kBAAkB,OAAuB;AAChD,MAAI,OAAO,UAAU,UAAU;AAC7B,WAAO;AAAA,EACT;AACA,QAAM,QAAQ;AACd,SAAO,MAAM,QAAQ,OAAO,EAAE,EAAE,YAAY,EAAE,QAAQ,MAAM,GAAG;AACjE;AAKA,SAAS,iBACP,OACA,YACA,iBACyD;AACzD,QAAM,yBAAyB,kBAAkB,UAAU;AAC3D,QAAM,8BAA8B,gBAAgB;AAAA,IAAI,CAAC,QACvD,kBAAkB,OAAO,GAAG,CAAC;AAAA,EAC/B;AAEA,MAAI,CAAC,4BAA4B,SAAS,sBAAsB,GAAG;AACjE,WAAO;AAAA,MACL,OAAO;AAAA,MACP,OAAO,gCAAgC,KAAK,MAAM,KAAK;AAAA,QACrD;AAAA,MACF,CAAC,qBAAqB,KAAK,UAAU,eAAe,CAAC;AAAA,MACrD,YAAY;AAAA,IACd;AAAA,EACF;AACA,SAAO,EAAE,OAAO,KAAK;AACvB;AAKA,SAAS,gBAAgB,KAAuB;AAC9C,MAAI,MAAM,QAAQ,GAAG,GAAG;AACtB,WAAO,IAAI,IAAI,eAAe;AAAA,EAChC;AACA,MAAI,OAAO,OAAO,QAAQ,UAAU;AAClC,UAAM,aAAsC,CAAC;AAC7C,eAAW,CAAC,KAAK,KAAK,KAAK,OAAO,QAAQ,GAA8B,GAAG;AAEzE,UACE,MAAM,QAAQ,KAAK,KACnB,MAAM,WAAW,MAChB,OAAO,MAAM,CAAC,MAAM,YAAY,MAAM,CAAC,MAAM,OAC9C;AACA,mBAAW,GAAG,IAAI,MAAM,CAAC;AAAA,MAC3B,OAAO;AACL,mBAAW,GAAG,IAAI,gBAAgB,KAAK;AAAA,MACzC;AAAA,IACF;AACA,WAAO;AAAA,EACT;AACA,SAAO;AACT;AAKA,SAAS,YAAY,YAAqB,eAAiC;AAEzE,MAAI,eAAe,eAAe;AAChC,WAAO;AAAA,EACT;AAGA,MACE,OAAO,eAAe,YACtB,eAAe,QACf,OAAO,kBAAkB,YACzB,kBAAkB,MAClB;AACA,QAAI;AACF,YAAM,kBAAkB,gBAAgB,UAAU;AAClD,YAAM,qBAAqB,gBAAgB,aAAa;AACxD,aACE,KAAK,UAAU,eAAe,MAAM,KAAK,UAAU,kBAAkB;AAAA,IAEzE,QAAQ;AACN,aAAO;AAAA,IACT;AAAA,EACF;AAGA,MAAI,OAAO,eAAe,YAAY,OAAO,kBAAkB,UAAU;AACvE,WAAO,WAAW,SAAS,MAAM;AAAA,EACnC;AACA,MAAI,OAAO,eAAe,YAAY,OAAO,kBAAkB,UAAU;AACvE,WAAO,eAAe,cAAc,SAAS;AAAA,EAC/C;AAEA,SAAO;AACT;AAKA,SAAS,gBACP,WACA,YACA,gBACyD;AACzD,QAAM,gBAAgB,KAAK;AAAA,IACzB,WAAW,IAAI,CAAC,MAAM,kBAAkB,OAAO,CAAC,CAAC,CAAC,EAAE,KAAK;AAAA,EAC3D;AACA,QAAM,WAAW,MAAM,QAAQ,cAAc,IACxC,eAA6B,KAAK,CAAC,MAAM;AACxC,QAAI,CAAC,MAAM,QAAQ,CAAC,GAAG;AACrB,aAAO;AAAA,IACT;AACA,WACE,KAAK,UAAU,EAAE,IAAI,CAAC,MAAM,kBAAkB,OAAO,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,MAChE;AAAA,EAEJ,CAAC,IACD;AACJ,MAAI,CAAC,UAAU;AACb,WAAO;AAAA,MACL,OAAO;AAAA,MACP,OAAO,qCAAqC,SAAS,UAAU,KAAK;AAAA,QAClE;AAAA,MACF,CAAC,qBAAqB,KAAK,UAAU,cAAc,CAAC;AAAA,MACpD,YAAY;AAAA,IACd;AAAA,EACF;AACA,SAAO,EAAE,OAAO,KAAK;AACvB;AAKA,SAAS,iBACP,WACA,YACA,gBACyD;AACzD,QAAM,WAAW,MAAM,QAAQ,cAAc,IACxC,eAA6B;AAAA,IAAK,CAAC,kBAClC,YAAY,YAAY,aAAa;AAAA,EACvC,IACA;AAEJ,MAAI,CAAC,UAAU;AACb,WAAO;AAAA,MACL,OAAO;AAAA,MACP,OAAO,gCAAgC,SAAS,UAAU,KAAK;AAAA,QAC7D;AAAA,MACF,CAAC,qBAAqB,KAAK,UAAU,cAAc,CAAC;AAAA,MACpD,YAAY;AAAA,IACd;AAAA,EACF;AACA,SAAO,EAAE,OAAO,KAAK;AACvB;AAkBO,SAAS,sBACd,iBACA,eACA,gBACe;AACf,QAAM,gBAAgB;AAAA,IACpB,gBAAgB;AAAA,IAChB,cAAc;AAAA,EAChB;AACA,MAAI,CAAC,cAAc,OAAO;AACxB,WAAO;AAAA,EACT;AAEA,QAAM,uBAAuB,eAC3B,OAAO,KAAK,cAAc,EAAE,CAAC,CAC/B;AAEA,QAAM,UACJ,cAAc,QAAQ,OAAO,cAAc,SAAS,WAC/C,cAAc,OACf,CAAC;AAEP,QAAM,UAA0B;AAAA,IAC9B;AAAA,IACA;AAAA,IACA;AAAA,IACA,gBAAgB,gBAAgB,WAAW;AAAA,EAC7C;AAEA,QAAM,gBAAgB;AAAA,IACpB,gBAAgB,WAAW;AAAA,IAC3B;AAAA,EACF;AACA,MAAI,CAAC,cAAc,OAAO;AACxB,WAAO;AAAA,EACT;AAEA,QAAM,cAAc,mBAAmB,SAAS,OAAO;AACvD,MAAI,CAAC,YAAY,OAAO;AACtB,WAAO;AAAA,EACT;AAEA,QAAM,gBAAgB,oBAAoB,SAAS,oBAAoB;AACvE,MAAI,CAAC,cAAc,OAAO;AACxB,WAAO;AAAA,EACT;AAEA,SAAO,EAAE,OAAO,KAAK;AACvB;AAEA,SAAS,kBAAkB,UAAkB,QAA+B;AAC1E,MAAI,WAAW,UAAU;AACvB,WAAO;AAAA,MACL,OAAO;AAAA,MACP,OAAO,kBAAkB,MAAM,8BAA8B,QAAQ;AAAA,MACrE,YAAY;AAAA,IACd;AAAA,EACF;AACA,SAAO,EAAE,OAAO,KAAK;AACvB;AAEA,SAAS,oBACP,gBACA,SACe;AACf,aAAW,SAAS,gBAAgB;AAClC,QAAI,EAAE,SAAS,UAAU;AACvB,aAAO;AAAA,QACL,OAAO;AAAA,QACP,OAAO,gCAAgC,KAAK;AAAA,QAC5C,YAAY;AAAA,MACd;AAAA,IACF;AAAA,EACF;AACA,SAAO,EAAE,OAAO,KAAK;AACvB;AAEA,SAAS,mBACP,SACA,SACe;AACf,aAAW,aAAa,OAAO,KAAK,OAAO,GAAG;AAC5C,UAAM,aAAa;AAAA,MACjB;AAAA,MACA,QAAQ,SAAS;AAAA,MACjB;AAAA,IACF;AACA,QAAI,CAAC,WAAW,OAAO;AACrB,aAAO;AAAA,IACT;AAAA,EACF;AACA,SAAO,EAAE,OAAO,KAAK;AACvB;AAEA,SAAS,qBACP,WACA,YACA,SACe;AACf,MACE,EACE,aAAa,QAAQ,kBACrB,aAAa,QAAQ,uBAEvB;AACA,WAAO;AAAA,MACL,OAAO;AAAA,MACP,OAAO,0BAA0B,SAAS;AAAA,MAC1C,YAAY;AAAA,IACd;AAAA,EACF;AAEA,QAAM,iBAAiB,QAAQ,qBAAqB,SAAS;AAE7D,MAAI,OAAO,eAAe,UAAU;AAClC,WAAO;AAAA,MACL;AAAA,MACA;AAAA,MACC,kBAA4C,CAAC;AAAA,IAChD;AAAA,EACF;AAEA,MAAI,MAAM,QAAQ,UAAU,GAAG;AAC7B,WAAO,gBAAgB,WAAW,YAAY,cAAc;AAAA,EAC9D;AAEA,SAAO,iBAAiB,WAAW,YAAY,cAAc;AAC/D;AAEA,SAAS,oBACP,SACA,sBACe;AACf,aAAW,aAAa,sBAAsB;AAC5C,QAAI,OAAO,OAAO,sBAAsB,SAAS,GAAG;AAClD,YAAM,MAAM,qBAAqB,SAAS;AAC1C,YAAM,aAAa,MAAM,QAAQ,GAAG,KAAK,IAAI,SAAS,EAAE;AACxD,UAAI,EAAE,aAAa,WAAW,aAAa;AACzC,eAAO;AAAA,UACL,OAAO;AAAA,UACP,OAAO,+BAA+B,SAAS;AAAA,UAC/C,YAAY;AAAA,QACd;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACA,SAAO,EAAE,OAAO,KAAK;AACvB;AAKO,SAAS,+BACd,kBACA,gBACA,iBACyD;AACzD,MAAI,eAAe,WAAW,gBAAgB,QAAQ;AACpD,WAAO;AAAA,MACL,OAAO;AAAA,MACP,OAAO,uCAAuC,gBAAgB,MAAM,SAAS,eAAe,MAAM;AAAA,MAClG,YAAY;AAAA,IACd;AAAA,EACF;AAEA,QAAM,0BAA0B,oBAAI,IAAY;AAChD,aAAW,kBAAkB,iBAAiB;AAC5C,UAAM,mBAAmB,OAAO,KAAK,cAAc,EAAE,CAAC;AACtD,UAAM,kBAAkB,iBAAiB;AAAA,MACvC,CAAC,MAAM,EAAE,SAAS;AAAA,IACpB;AAEA,QAAI,CAAC,iBAAiB;AACpB,aAAO;AAAA,QACL,OAAO;AAAA,QACP,OAAO,4CAA4C,gBAAgB;AAAA,QACnE,YAAY;AAAA,MACd;AAAA,IACF;AAEA,QAAI,aAAa;AACjB,aAAS,IAAI,GAAG,IAAI,eAAe,QAAQ,KAAK,GAAG;AACjD,UAAI,wBAAwB,IAAI,CAAC,GAAG;AAClC;AAAA,MACF;AAEA,YAAM,gBAAgB;AAAA,QACpB;AAAA,QACA,eAAe,CAAC;AAAA,QAChB;AAAA,MACF;AACA,UAAI,cAAc,OAAO;AACvB,gCAAwB,IAAI,CAAC;AAC7B,qBAAa;AACb;AAAA,MACF;AAAA,IACF;AAEA,QAAI,CAAC,YAAY;AACf,aAAO;AAAA,QACL,OAAO;AAAA,QACP,OAAO,gDAAgD,gBAAgB;AAAA,QACvE,YAAY;AAAA,MACd;AAAA,IACF;AAAA,EACF;AACA,SAAO,EAAE,OAAO,KAAK;AACvB;AAKO,SAAS,wBACd,kBACA,gBACA,iBACyD;AACzD,MAAI,eAAe,WAAW,gBAAgB,QAAQ;AACpD,WAAO;AAAA,MACL,OAAO;AAAA,MACP,OAAO,uCAAuC,gBAAgB,MAAM,SAAS,eAAe,MAAM;AAAA,MAClG,YAAY;AAAA,IACd;AAAA,EACF;AAEA,QAAM,mBAAmB,OAAO,KAAK,gBAAgB,CAAC,CAAC,EAAE,CAAC;AAC1D,QAAM,kBAAkB,iBAAiB;AAAA,IACvC,CAAC,MAAM,EAAE,SAAS;AAAA,EACpB;AAEA,MAAI,CAAC,iBAAiB;AACpB,WAAO;AAAA,MACL,OAAO;AAAA,MACP,OAAO,4CAA4C,gBAAgB;AAAA,MACnE,YAAY;AAAA,IACd;AAAA,EACF;AAEA,SAAO;AAAA,IACL;AAAA,IACA,eAAe,CAAC;AAAA,IAChB,gBAAgB,CAAC;AAAA,EACnB;AACF;;;AFnaA,IAAM,mBAAmB;AACzB,IAAM,uBAAuB;AAsC7B,SAAS,MACP,UACA,aACA,gBACyD;AACzD,QAAM,WAAW,SAAS,GAAG,MAAM,GAAG,EAAE,CAAC;AAEzC,MAAI;AACF,QAAI,aAAa,UAAU;AACzB,UAAI,CAAC,MAAM,QAAQ,WAAW,KAAK,YAAY,WAAW,GAAG;AAC3D,eAAO;AAAA,UACL,OAAO;AAAA,UACP,OAAO,qCAAqC,MAAM,QAAQ,WAAW,IAAI,YAAY,SAAS,CAAC;AAAA,UAC/F,YAAY;AAAA,QACd;AAAA,MACF;AACA,aAAO;AAAA,QACL,SAAS,SAAS,CAAC;AAAA,QACnB,YAAY,CAAC;AAAA,QACZ,eAAe,aAA2C,CAAC;AAAA,MAC9D;AAAA,IACF;AACA,QAAI,aAAa,YAAY;AAC3B,aAAO;AAAA,QACL,SAAS;AAAA,QACT;AAAA,QACA,eAAe;AAAA,MACjB;AAAA,IACF;AACA,QAAI,aAAa,YAAY;AAC3B,aAAO;AAAA,QACL,SAAS;AAAA,QACT;AAAA,QACA,eAAe;AAAA,MACjB;AAAA,IACF;AACA,QAAI,SAAS,SAAS,mBAAmB,GAAG;AAE1C,aAAO;AAAA,QACL,SAAS;AAAA,QACT;AAAA,QACA,eAAe;AAAA,MACjB;AAAA,IACF;AAIA,WAAO,EAAE,OAAO,KAAK;AAAA,EACvB,SAAS,GAAY;AACnB,WAAO;AAAA,MACL,OAAO;AAAA,MACP,OAAO,kBAAmB,EAAY,OAAO;AAAA,MAC7C,YAAY;AAAA,IACd;AAAA,EACF;AACF;AAGA,SAAS,oBACP,MACA,aACA,cACA,gBAC0B;AAC1B,SAAO;AAAA,IACL;AAAA,IACA,SAAS;AAAA,IACT;AAAA,IACA,MAAM,IACJ,OACA,QAC0B;AAC1B,YAAM,OAAiB,CAAC;AACxB,UAAI,eAAe;AACnB,UAAI,YAAwB,CAAC;AAE7B,UAAI;AAEF,cAAM,WAAW,eAAe;AAChC,aAAK,KAAK,0BAA0B,QAAQ,EAAE;AAC9C,cAAM,gBAAgB,MAAMC,IAAG;AAAA,UAC7BC,MAAK,KAAK,UAAU,YAAY;AAAA,UAChC;AAAA,QACF;AACA,cAAM,sBAAsB,MAAMD,IAAG;AAAA,UACnCC,MAAK,KAAK,UAAU,cAAc;AAAA,UAClC;AAAA,QACF;AAIA,oBAAY,cACT,MAAM,gBAAgB,EACtB,OAAO,CAAC,SAAS,KAAK,KAAK,EAAE,SAAS,CAAC,EACvC,IAAI,CAAC,SAAS,KAAK,MAAM,IAAI,CAAC;AACjC,cAAM,kBAAoC,oBACvC,MAAM,gBAAgB,EACtB,OAAO,CAAC,SAAS,KAAK,KAAK,EAAE,SAAS,CAAC,EACvC,IAAI,CAAC,SAAS,KAAK,MAAM,IAAI,CAAC;AACjC,cAAM,qBAAqB,IAAI;AAAA,UAC7B,gBAAgB,IAAI,CAAC,QAAQ,CAAC,IAAI,IAAI,GAAG,CAAC;AAAA,QAC5C;AAGA,cAAM,WAAW,QAAQ,IAAI;AAC7B,cAAM,QAAQ,WAAW,OAAO,QAAQ,IAAI;AAC5C,YAAI,SAAS,OAAO,SAAS,KAAK,KAAK,QAAQ,GAAG;AAChD,sBAAY,UAAU,MAAM,GAAG,KAAK;AACpC,eAAK;AAAA,YACH,iCAAiC,KAAK;AAAA,UACxC;AAAA,QACF;AAGA,cAAM,gBAAgB,CAAC,SAAiC;AACtD,cAAI,CAAC,KAAK,MAAM;AACd;AAAA,UACF;AACA,cAAI,KAAK,SAAS,QAAQ;AACxB,iBAAK,OAAO;AAAA,UACd;AACA,cAAI,KAAK,SAAS,SAAS;AACzB,iBAAK,OAAO;AAAA,UACd;AACA,cAAI,KAAK,SAAS,aAAa,KAAK,SAAS,SAAS;AACpD,iBAAK,OAAO;AAAA,UACd;AAAA,QACF;AAGA,cAAM,sBAAsB,CAC1B,MACA,gBACS;AACT,cAAI,CAAC,KAAK,cAAc,OAAO,KAAK,eAAe,UAAU;AAC3D;AAAA,UACF;AACA,qBAAW,KAAK,OAAO,KAAK,KAAK,UAAU,GAAG;AAC5C,YAAC,KAAK,WAAuC,CAAC,IAAI;AAAA,cAC/C,KAAK,WAAuC,CAAC;AAAA,YAChD;AAAA,UACF;AAAA,QACF;AAGA,cAAM,YAAY,CAAC,WAA6B;AAC9C,cAAI,CAAC,UAAU,OAAO,WAAW,UAAU;AACzC,mBAAO,EAAE,MAAM,UAAU,YAAY,CAAC,EAAE;AAAA,UAC1C;AACA,gBAAM,OAAqC,MAAM,QAAQ,MAAM,IAC1D,OAAqB,IAAI,CAAC,MAAM,UAAU,CAAC,CAAC,IAC5C,EAAE,GAAI,OAAmC;AAC9C,cAAI,CAAC,MAAM,QAAQ,IAAI,GAAG;AACxB,0BAAc,IAAI;AAClB,gCAAoB,MAAM,SAAS;AACnC,gBAAI,KAAK,OAAO;AACd,mBAAK,QAAQ,UAAU,KAAK,KAAK;AAAA,YACnC;AACA,mBAAO;AAAA,UACT;AACA,iBAAO;AAAA,QACT;AAGA,cAAM,kBAAkB,CACtB,aAEA,MAAM,QAAQ,QAAQ,KACrB,SAAuB,KAAK,CAAC,MAAM,MAAM,QAAQ,CAAC,CAAC,IAC/C,SAAsC,KAAK,CAAC,IAC5C;AAGP,cAAM,eAAe,CAAC,aAA6B;AACjD,gBAAM,IAAI,SAAS,QAAQ,mBAAmB,GAAG,EAAE,MAAM,GAAG,EAAE;AAC9D,iBAAO,EAAE,SAAS,IAAI,IAAI;AAAA,QAC5B;AAGA,cAAM,wBAAwB,CAC5B,OACA,gBAIG;AACH,gBAAM,UAAU,oBAAI,IAAoB;AACxC,gBAAM,mBAAsC,MAAM,IAAI,CAAC,MAAM;AAC3D,kBAAM,QAAQ,YAAY,EAAE,UAAU;AACtC,kBAAM,iBACJ,SACA,OAAO,UAAU,YAChB,MAA2B,SAAS;AACvC,kBAAM,cAAgC,iBACjC,QACD,EAAE,MAAM,UAAU,YAAY,CAAC,EAAE;AAErC,kBAAM,YAAY,aAAa,EAAE,IAAI;AACrC,oBAAQ,IAAI,WAAW,EAAE,IAAI;AAE7B,mBAAO;AAAA,cACL,MAAM;AAAA,cACN,MAAM;AAAA,cACN,aAAa,EAAE;AAAA,cACf;AAAA,YACF;AAAA,UACF,CAAC;AACD,iBAAO,EAAE,kBAAkB,QAAQ;AAAA,QACrC;AAGA,cAAM,sBAAsB,CAC1B,QACkD;AAClD,cAAI,CAAC,KAAK;AACR,mBAAO,CAAC;AAAA,UACV;AACA,cAAI;AACF,kBAAM,MAAM,KAAK,MAAM,GAAG;AAC1B,mBAAO,MAAM,QAAQ,GAAG,IAAI,MAAM,CAAC;AAAA,UACrC,QAAQ;AACN,mBAAO,CAAC;AAAA,UACV;AAAA,QACF;AAGA,cAAM,mBAAmB,CACvB,SACA,qBACY;AACZ,cACE,OAAO,YAAY,YACnB,qBAAqB,KAAK,OAAO,GACjC;AACA,mBAAO,iBAAiB,OAAO,OAAO,CAAC,GAAG,QAAQ;AAAA,UACpD;AACA,iBAAO;AAAA,QACT;AAGA,cAAM,gBAAgB,CAAC,kBAAoC;AACzD,cAAI,OAAO,kBAAkB,UAAU;AACrC,mBAAO;AAAA,UACT;AACA,cAAI;AACF,mBAAO,KAAK,MAAM,aAAa;AAAA,UACjC,QAAQ;AAEN,mBAAO;AAAA,UACT;AAAA,QACF;AAGA,cAAM,mBAAmB,CACvB,WACA,SACA,sBAEC,aAAa,CAAC,GAAG,IAAI,CAAC,MAAe;AACpC,gBAAM,OAAO;AACb,gBAAM,UAAU,KAAK,YAAY,KAAK;AACtC,gBAAM,qBAAqB;AAAA,YACzB;AAAA,YACA;AAAA,UACF;AACA,gBAAM,eACJ,QAAQ,IAAI,kBAA4B,KAAK;AAC/C,gBAAM,gBACJ,KAAK,QACL,KAAK,aACL,KAAK,SACL,KAAK,UACL,KAAK;AACP,gBAAM,aAAa,cAAc,aAAa;AAC9C,iBAAO;AAAA,YACL,GAAG;AAAA,YACH,UAAU;AAAA,YACV,MAAM;AAAA,YACN,MAAM,cAAc,CAAC;AAAA,UACvB;AAAA,QACF,CAAC;AAGH,cAAM,gBAAgB,CAAC,SAA2B;AAChD,cAAI,QAAQ,MAAM;AAChB,mBAAO;AAAA,UACT;AACA,cAAI,OAAO,SAAS,UAAU;AAC5B,mBAAO;AAAA,UACT;AACA,iBAAO,OAAO,KAAK,IAAI,EACpB,KAAK,EACL;AAAA,YACC,CAAC,KAA8B,MAAM;AACnC,kBAAI,CAAC,IAAK,KAAiC,CAAC;AAC5C,qBAAO;AAAA,YACT;AAAA,YACA,CAAC;AAAA,UACH;AAAA,QACJ;AAGA,cAAM,4BAA4B,CAChC,WACA,SACA,QACa;AACb,gBAAM,YAAsB,CAAC;AAC7B,oBAAU,KAAK,YAAY,SAAS,EAAE;AACtC,gBAAM,eAAe,MAAM,QAAQ,OAAO,IACrC,UACD,CAAC,OAAkB;AACvB,gBAAM,gBAAgB,MAAM;AAC1B,gBAAI,aAAa,WAAW,GAAG;AAC7B,qBAAO,eAAe,KAAK,UAAU,aAAa,CAAC,CAAC,CAAC;AAAA,YACvD;AACA,kBAAM,YAAY,aACf;AAAA,cAAI,CAAC,MACJ,MAAM,QAAQ,CAAC,KAAM,OAAO,MAAM,YAAY,MAAM,OAChD,KAAK,UAAU,CAAC,IAChB,OAAO,CAAC;AAAA,YACd,EACC,KAAK,IAAI;AACZ,mBAAO,sBAAsB,SAAS;AAAA,UACxC,GAAG;AACH,oBAAU,KAAK,YAAY;AAC3B,oBAAU,KAAK,UAAU,KAAK,UAAU,GAAG,CAAC,EAAE;AAC9C,iBAAO;AAAA,QACT;AAGA,cAAM,oBAAoB,CAAC,SAAkB,QAA0B;AACrE,cAAI,CAAC,MAAM,QAAQ,OAAO,GAAG;AAC3B,mBAAO;AAAA,UACT;AACA,iBAAO,QAAQ,KAAK,CAAC,MAAe;AAClC,gBAAI;AACF,kBAAI,MAAM,QAAQ,GAAG,GAAG;AACtB,uBACE,KAAK,UAAU,IAAI,IAAI,CAAC,MAAM,OAAO,CAAC,CAAC,EAAE,KAAK,CAAC,MAC/C,KAAK,UAAW,EAAgB,IAAI,CAAC,MAAM,OAAO,CAAC,CAAC,EAAE,KAAK,CAAC;AAAA,cAEhE;AAAA,YACF,QAAQ;AAAA,YAER;AACA,mBACE,OAAO,CAAC,EAAE,YAAY,EAAE,QAAQ,QAAQ,EAAE,MAC1C,OAAO,GAAG,EAAE,YAAY,EAAE,QAAQ,QAAQ,EAAE;AAAA,UAEhD,CAAC;AAAA,QACH;AAGA,cAAM,4BAA4B,CAChC,cACA,cACA,SACS;AACT,cAAI,iBAAiB,cAAc;AACjC,iBAAK,KAAK,kBAAkB;AAC5B,iBAAK,KAAK,KAAK,YAAY,EAAE;AAC7B,iBAAK,KAAK,KAAK,YAAY,EAAE;AAAA,UAC/B;AAAA,QACF;AAGA,cAAM,qBAAqB,CACzB,UACA,cACA,SACS;AACT,qBAAW,OAAO,UAAU;AAC1B,gBAAI,EAAE,OAAO,eAAe;AAC1B,mBAAK,KAAK,6BAA6B,GAAG,EAAE;AAAA,YAC9C;AAAA,UACF;AAAA,QACF;AAGA,cAAM,wBAAwB,CAC5B,gBACA,cACA,SACS;AACT,qBAAW,KAAK,OAAO,KAAK,YAAY,GAAG;AACzC,gBAAI,EAAE,KAAK,iBAAiB;AAC1B,mBAAK,KAAK,uBAAuB,CAAC,EAAE;AAAA,YACtC;AAAA,UACF;AAAA,QACF;AAGA,cAAM,4BAA4B,CAChC,gBACA,cACA,SACS;AACT,qBAAW,KAAK,OAAO,KAAK,YAAY,GAAG;AACzC,gBAAI,KAAK,gBAAgB;AACvB,oBAAM,UAAW,eAA6C,CAAC;AAC/D,oBAAM,MAAM,aAAa,CAAC;AAC1B,kBAAI,CAAC,kBAAkB,SAAS,GAAG,GAAG;AACpC,qBAAK,KAAK,GAAG,0BAA0B,GAAG,SAAS,GAAG,CAAC;AAAA,cACzD;AAAA,YACF;AAAA,UACF;AAAA,QACF;AAGA,cAAM,kBAAkB,CACtB,OACA,gBACA,kBAKG;AACH,gBAAM,WAAW,MAAM,CAAC;AACxB,gBAAM,KAAM,eACT,eAAe,CAAC;AACnB,gBAAM,mBAAmB,UAAU;AACnC,gBAAM,iBAAiB,KAAK,GAAG,OAAO,KAAK,EAAE,EAAE,CAAC,CAAC,IAAI;AACrD,gBAAM,WAAY,cAA4C,CAAC;AAC/D,gBAAM,eAAe,UAAU,YAAY,UAAU;AACrD,gBAAM,eAAe,cAAc,UAAU,IAAI;AAEjD,gBAAM,WAAoC;AAAA,YACxC,UAAU;AAAA,YACV,QAAQ;AAAA,UACV;AACA,gBAAM,SAAkC;AAAA,YACtC,UAAU;AAAA,YACV,MAAM;AAAA,UACR;AACA,gBAAM,OAAiB,CAAC;AAExB,oCAA0B,kBAAkB,cAAc,IAAI;AAE9D,cACE,kBACA,gBACA,OAAO,iBAAiB,YACxB,iBAAiB,MACjB;AACA,kBAAM,WAAY,UAAU,YAAY,YAAY,CAAC;AACrD;AAAA,cACE;AAAA,cACA;AAAA,cACA;AAAA,YACF;AACA;AAAA,cACE;AAAA,cACA;AAAA,cACA;AAAA,YACF;AACA;AAAA,cACE;AAAA,cACA;AAAA,cACA;AAAA,YACF;AAAA,UACF;AAEA,iBAAO,EAAE,UAAU,QAAQ,KAAK;AAAA,QAClC;AAGA,cAAM,yBAAyB,CAC7B,eACA,aACA,SACS;AACT,cAAI,kBAAkB,aAAa;AACjC,iBAAK,KAAK,eAAe;AACzB,iBAAK,KAAK,cAAc,aAAa,EAAE;AACvC,iBAAK,KAAK,SAAS,WAAW,EAAE;AAAA,UAClC;AAAA,QACF;AAGA,cAAM,8BAA8B,CAClC,eACA,aACA,SACS;AACT,gBAAM,UAAU,cAAc,OAAO,CAAC,MAAM,CAAC,YAAY,SAAS,CAAC,CAAC;AACpE,gBAAM,QAAQ,YAAY,OAAO,CAAC,MAAM,CAAC,cAAc,SAAS,CAAC,CAAC;AAClE,qBAAW,KAAK,SAAS;AACvB,iBAAK,KAAK,uBAAuB,CAAC,EAAE;AAAA,UACtC;AACA,qBAAW,KAAK,OAAO;AACrB,iBAAK,KAAK,0BAA0B,CAAC,EAAE;AAAA,UACzC;AAAA,QACF;AAGA,cAAM,wBAAwB,CAC5B,OACA,eACA,eACW;AACX,mBAAS,IAAI,GAAG,IAAI,cAAc,QAAQ,KAAK,GAAG;AAChD,gBAAI,WAAW,IAAI,CAAC,GAAG;AACrB;AAAA,YACF;AACA,kBAAM,KAAK,cAAc,CAAC;AAC1B,kBAAM,SAAS,IAAI,YAAY,IAAI;AACnC,gBAAI,WAAW,OAAO;AACpB,qBAAO;AAAA,YACT;AAAA,UACF;AACA,iBAAO;AAAA,QACT;AAGA,cAAM,yBAAyB,CAAC,YAKpB;AACV,gBAAM,EAAE,cAAc,uBAAuB,gBAAgB,KAAK,IAChE;AACF,6BAAmB,gBAAgB,cAAc,IAAI;AACrD,gCAAsB,uBAAuB,cAAc,IAAI;AAC/D,oCAA0B,uBAAuB,cAAc,IAAI;AAAA,QACrE;AAGA,cAAM,sBAAsB,CAAC,YAMjB;AACV,gBAAM,EAAE,aAAa,eAAe,OAAO,YAAY,KAAK,IAC1D;AACF,gBAAM,QAAQ,OAAO,KAAK,WAAW,EAAE,CAAC;AACxC,gBAAM,eAAe;AAAA,YACnB;AAAA,YACA;AAAA,YACA;AAAA,UACF;AAEA,cAAI,iBAAiB,IAAI;AACvB;AAAA,UACF;AAEA,qBAAW,IAAI,YAAY;AAC3B,gBAAM,WAAW,cAAc,YAAY;AAC3C,gBAAM,eAAe,cAAc,UAAU,IAAI;AACjD,gBAAM,wBAAwB,YAAY,KAAK;AAI/C,gBAAM,WAAW,MAAM,KAAK,CAAC,MAAgB,EAAE,SAAS,KAAK;AAC7D,gBAAM,iBAAkB,UAAU,YAAY,YAC5C,CAAC;AAEH,eAAK,KAAK,eAAe,KAAK,EAAE;AAEhC,cACE,yBACA,gBACA,OAAO,iBAAiB,YACxB,iBAAiB,MACjB;AACA,mCAAuB;AAAA,cACrB;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,YACF,CAAC;AAAA,UACH;AAAA,QACF;AAGA,cAAM,oBAAoB,CACxB,OACA,gBACA,kBAKG;AACH,gBAAM,QAEF,eAGA,gBAAgB,CAAC;AACrB,gBAAM,gBAAgB,MAAM,IAAI,CAAC,MAAM,OAAO,KAAK,CAAC,EAAE,CAAC,CAAC;AACxD,gBAAM,cAAe,cAA4C;AAAA,YAC/D,CAAC,MAAM,EAAE,YAAY,EAAE;AAAA,UACzB;AAEA,gBAAM,WAAoC;AAAA,YACxC,WAAW;AAAA,UACb;AACA,gBAAM,SAAkC,EAAE,WAAW,YAAY;AACjE,gBAAM,OAAiB,CAAC;AAExB;AAAA,YACE,cAAc;AAAA,YACd,YAAY;AAAA,YACZ;AAAA,UACF;AACA,sCAA4B,eAAe,aAAa,IAAI;AAE5D,gBAAM,aAAa,oBAAI,IAAY;AACnC,qBAAW,eAAe,OAAO;AAC/B,gCAAoB;AAAA,cAClB;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,YACF,CAAC;AAAA,UACH;AAEA,iBAAO,EAAE,UAAU,QAAQ,KAAK;AAAA,QAClC;AAGA,cAAM,iBAAiB,QAAQ,IAAI;AACnC,cAAM,cACJ,kBAAkB,OAAO,SAAS,OAAO,cAAc,CAAC,IACpD,KAAK,IAAI,GAAG,OAAO,cAAc,CAAC,IAClC;AACN,aAAK;AAAA,UACH,kBAAkB,UAAU,MAAM,gCAAgC,WAAW;AAAA,QAC/E;AAGA,cAAM,oBAAoB,CACxB,kBACA,YACA,aACS;AACT,cAAI;AACF,kBAAM,YAAY,iBAAiB,CAAC;AACpC,kBAAM,aACJ,WAAW,aAAa,QAErB,WAAW,aACR,YACH;AACL,qBAAS;AAAA,cACP,WAAW,UAAU,eAAe,KAAK,UAAU,SAAS,CAAC,gBAAgB,UAAU;AAAA,YACzF;AAAA,UACF,SAAS,GAAY;AACnB,qBAAS;AAAA,cACP,WAAW,UAAU,iCAAkC,EAAY,OAAO;AAAA,YAC5E;AAAA,UACF;AAAA,QACF;AAGA,cAAM,kBAAkB,CAAC,YAMb;AACV,gBAAM,EAAE,WAAW,cAAc,MAAM,YAAY,SAAS,IAC1D;AACF,cAAI;AACF,qBAAS;AAAA,cACP,WAAW,UAAU,kBAAkB,KAAK,UAAU,SAAS,CAAC,kBAAkB,YAAY,UAAU,KAAK,UAAU,IAAI,CAAC;AAAA,YAC9H;AAAA,UACF,QAAQ;AACN,qBAAS;AAAA,cACP,WAAW,UAAU;AAAA,YACvB;AAAA,UACF;AAAA,QACF;AAGA,cAAM,sBAAsB,CAAC,YAUE;AAC7B,gBAAM;AAAA,YACJ;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,UACF,IAAI;AAEJ,gBAAM,YAAY,MAAM;AACtB,kBAAM,WAAW,CAAC,GAAG,YAAY,EAAE,QAAQ;AAC3C,kBAAM,QAAQ,SAAS;AAAA,cACrB,CAAC,MAAO,EAAc,SAAS;AAAA,YACjC;AACA,mBAAO,OAAO,WAAW;AAAA,UAC3B,GAAG;AAEH,gBAAM,gBAAgB,MAAM;AAC1B,gBAAI,kBAAkB,eAAe,SAAS,GAAG;AAC/C,qBAAO;AAAA,YACT;AACA,gBAAI,OAAO,SAAS,UAAU;AAC5B,qBAAO;AAAA,YACT;AACA,mBAAO;AAAA,UACT,GAAG;AAEH,iBAAO;AAAA,YACL,IAAI,SAAS;AAAA,YACb,aAAa;AAAA,YACb,iBAAiB;AAAA,YACjB,gBAAgB;AAAA,YAChB,eAAe;AAAA,YACf,mBAAmB,kBAAkB,SACjC,oBACA;AAAA,YACJ,cAAe,eACZ;AAAA,UACL;AAAA,QACF;AAGA,cAAM,oBAAoB,CAAC,YAgBf;AACV,gBAAM;AAAA,YACJ;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,UACF,IAAI;AAEJ,cAAI;AACF,kBAAM,WAAW,SAAS,GAAG,MAAM,GAAG,EAAE,CAAC;AACzC,kBAAM,EAAE,UAAU,QAAQ,KAAK,IAC7B,aAAa,WACT;AAAA,cACE;AAAA,cACA;AAAA,cACA;AAAA,YACF,IACA;AAAA,cACE;AAAA,cACA;AAAA,cACA;AAAA,YACF;AAEN,qBAAS;AAAA,cACP,gBAAgB,KAAK,UAAU;AAAA,gBAC7B,IAAI,SAAS;AAAA,gBACb,SAAS,cAAc;AAAA,gBACvB,YAAY,cAAc;AAAA,gBAC1B;AAAA,gBACA;AAAA,gBACA;AAAA,cACF,CAAC,CAAC;AAAA,YACJ;AAEA,gBAAI;AACF,oBAAM,iBAAiB,oBAAoB;AAAA,gBACzC;AAAA,gBACA;AAAA,gBACA;AAAA,gBACA;AAAA,gBACA;AAAA,gBACA;AAAA,gBACA;AAAA,gBACA;AAAA,gBACA;AAAA,cACF,CAAC;AACD,uBAAS;AAAA,gBACP,wBAAwB,KAAK,UAAU,cAAc,CAAC;AAAA,cACxD;AAAA,YACF,QAAQ;AAAA,YAER;AAAA,UACF,QAAQ;AACN,qBAAS,KAAK,WAAW,SAAS,EAAE,8BAA8B;AAAA,UACpE;AAAA,QACF;AAGA,cAAM,gBAAgB,CACpB,qBAEA,OAAO;AAAA,UACL,iBAAiB,IAAI,CAAC,MAAM;AAAA,YAC1B,EAAE;AAAA,YACF,KAAK;AAAA,cACH,aACE,OAAO,EAAE,gBAAgB,WAAW,EAAE,cAAc;AAAA,cACtD,aAAa;AAAA,gBACX,EAAE;AAAA,cACJ;AAAA,YACF,CAAC;AAAA,UACH,CAAC;AAAA,QACH;AAGF,cAAM,yBAAyB,OAAO,YAWhC;AACJ,gBAAM;AAAA,YACJ,OAAO;AAAA,YACP;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,UACF,IAAI;AAUJ,gBAAM,kBAGF,CAAC;AACL,gBAAM,kBAAiD;AAAA,YACrD,oBAAoB;AAAA,cAClB,cAAc;AAAA,YAChB;AAAA,UACF;AACA,gBAAM,EAAE,WAAW,MAAM,aAAa,IAAI,MAAM,aAAa;AAAA,YAC3D,OAAO;AAAA,YACP,UAAU;AAAA,YACV,OAAO;AAAA,YACP,YAAY;AAAA,YACZ;AAAA,YACA,GAAI,gBAAgB,SAAY,EAAE,YAAY,IAAI,CAAC;AAAA,YACnD,GAAI,cAAc,SAAY,EAAE,iBAAiB,UAAU,IAAI,CAAC;AAAA,UAClE,CAAC;AAED,iBAAO,EAAE,WAAW,MAAM,cAAc,gBAAgB;AAAA,QAC1D;AAGA,cAAM,0BAA0B,CAAC,YAgBS;AACxC,gBAAM;AAAA,YACJ;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,UACF,IAAI;AAEJ,cAAI,cAAc,OAAO;AACvB,qBAAS,KAAK,UAAU,SAAS,EAAE,EAAE;AACrC,mBAAO,EAAE,OAAO,MAAM,MAAM,SAAS;AAAA,UACvC;AAEA,mBAAS,KAAK,UAAU,SAAS,EAAE,KAAK,cAAc,KAAK,EAAE;AAC7D,4BAAkB;AAAA,YAChB;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,UACF,CAAC;AACD,iBAAO,EAAE,OAAO,OAAO,MAAM,SAAS;AAAA,QACxC;AAGA,cAAM,sBAAsB,CAC1B,aAMG;AACH,gBAAM,EAAE,UAAU,OAAO,UAAU,SAAS,IAAI;AAChD,gBAAM,eAAe,gBAAgB,QAAQ;AAC7C,gBAAM,EAAE,kBAAkB,QAAQ,IAAI;AAAA,YACpC;AAAA,YACA;AAAA,UACF;AACA,gBAAM,WAAW,cAAc,gBAAgB;AAC/C,iBAAO,EAAE,cAAc,kBAAkB,SAAS,SAAS;AAAA,QAC7D;AAGA,cAAM,uBAAuB,CAAC,YAWY;AACxC,gBAAM;AAAA,YACJ;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,UACF,IAAI;AAEJ,gBAAM,iBACJ,gBAAgB;AAClB,gBAAM,oBAAoB;AAAA,YACxB,gBAAgB;AAAA,UAClB;AAEA,0BAAgB;AAAA,YACd;AAAA,YACA;AAAA,YACA;AAAA,YACA,YAAY,SAAS;AAAA,YACrB;AAAA,UACF,CAAC;AAED,gBAAM,iBAAiB,mBAAmB,IAAI,SAAS,EAAE;AACzD,cAAI,CAAC,gBAAgB;AACnB,kBAAM,IAAI,MAAM,8BAA8B,SAAS,EAAE,EAAE;AAAA,UAC7D;AAEA,gBAAM,gBAAgB;AAAA,YACnB,aAA2B,CAAC;AAAA,YAC7B;AAAA,YACA;AAAA,UACF;AAEA,gBAAM,gBAAgB,MAAM,UAAU,eAAe,cAAc;AAEnE,iBAAO,wBAAwB;AAAA,YAC7B;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,UACF,CAAC;AAAA,QACH;AAGA,cAAM,gBAAgB,OACpB,aACgD;AAChD,gBAAM,WAAqB,CAAC;AAC5B,gBAAM,EAAE,UAAU,MAAM,IAAI;AAC5B,gBAAM,OAAO,QAAQ;AACrB,gBAAM,cAAc,OAAO,SAAS,WAAW,OAAO;AACtD,gBAAM,SAAS,QAAQ;AACvB,gBAAM,YAAY,OAAO,WAAW,WAAW,SAAS;AAExD,cAAI;AACF,kBAAM,EAAE,cAAc,kBAAkB,SAAS,SAAS,IACxD,oBAAoB,QAAQ;AAE9B,8BAAkB,kBAAkB,SAAS,IAAI,QAAQ;AAEzD,kBAAM,EAAE,WAAW,MAAM,cAAc,gBAAgB,IACrD,MAAM,uBAAuB;AAAA,cAC3B;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,YACF,CAAC;AAEH,mBAAO,qBAAqB;AAAA,cAC1B;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,YACF,CAAC;AAAA,UACH,SAAS,GAAY;AACnB,qBAAS;AAAA,cACP,WAAW,SAAS,EAAE,8BAA+B,GAAa,OAAO;AAAA,YAC3E;AACA,gBAAK,GAAa,OAAO;AACvB,uBAAS,KAAK,WAAW,SAAS,EAAE,KAAM,EAAY,KAAK,EAAE;AAAA,YAC/D;AACA,mBAAO,EAAE,OAAO,OAAO,MAAM,SAAS;AAAA,UACxC;AAAA,QACF;AAGA,cAAM,qBAAqB,OACzB,OACA,kBACA,WACiB;AACjB,gBAAM,UAAU,IAAI,MAAS,MAAM,MAAM;AACzC,cAAI,MAAM;AACV,gBAAM,UAAU,IAAI,MAAM,KAAK,IAAI,kBAAkB,MAAM,MAAM,CAAC,EAC/D,KAAK,CAAC,EACN,IAAI,YAAY;AACf,mBAAO,MAAM;AACX,oBAAM,UAAU;AAChB,qBAAO;AACP,kBAAI,WAAW,MAAM,QAAQ;AAC3B;AAAA,cACF;AACA,sBAAQ,OAAO,IAAI,MAAM,OAAO,MAAM,OAAO,GAAG,OAAO;AAAA,YACzD;AAAA,UACF,CAAC;AACH,gBAAM,QAAQ,IAAI,OAAO;AACzB,iBAAO;AAAA,QACT;AAEA,cAAM,iBAAiB,MAAM;AAAA,UAC3B;AAAA,UACA;AAAA,UACA,OAAO,OAAO,cAAc,EAAE;AAAA,QAChC;AAGA,uBAAe,eAAe;AAAA,UAC5B,CAAC,KAAK,MAAM,OAAO,EAAE,QAAQ,IAAI;AAAA,UACjC;AAAA,QACF;AACA,mBAAW,KAAK,gBAAgB;AAC9B,eAAK,KAAK,GAAG,EAAE,IAAI;AAAA,QACrB;AAEA,YAAI,UAAU,WAAW,GAAG;AAC1B,iBAAO;AAAA,YACL,OAAO;AAAA,YACP,SAAS;AAAA,YACT,SAAS,CAAC;AAAA,YACV,MAAM,CAAC,sBAAsB;AAAA,UAC/B;AAAA,QACF;AAEA,cAAM,QAAQ,eAAe,UAAU;AACvC,eAAO;AAAA,UACL;AAAA,UACA,SAAS,QAAQ;AAAA;AAAA,UACjB,SAAS;AAAA,YACP,eAAe;AAAA,YACf,aAAa,UAAU;AAAA,YACvB,UAAU;AAAA,UACZ;AAAA,UACA;AAAA,QACF;AAAA,MACF,SAAS,GAAY;AACnB,eAAO;AAAA,UACL,OAAO;AAAA,UACP,SAAS;AAAA,UACT,SAAS,CAAC;AAAA,UACV,OAAO;AAAA,UACP,MAAM;AAAA,YACJ,mCAAmC,IAAI,KAAM,EAAY,OAAO;AAAA,UAClE;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACF;AAGO,IAAM,sBAAsB;AAAA,EACjC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAEO,IAAM,wBAAwB;AAAA,EACnC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAEO,IAAM,wBAAwB;AAAA,EACnC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAEO,IAAM,gCAAgC;AAAA,EAC3C;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;;;AGxtCA,SAAS,YAAYC,WAAU;AAC/B,OAAOC,WAAU;AACjB,SAAS,gBAAAC,qBAAwC;AACjD,OAAO,SAA6B;AAQpC,IAAM,mBAAmB;AACzB,IAAM,mBAAmB;AACzB,IAAM,gBAAgB;AACtB,IAAMC,oBAAmB;AAezB,SAAS,eAAe,MAAgC;AACtD,MAAI;AACF,WAAO,KAAK,MAAM,IAAI;AAAA,EACxB,QAAQ;AACN;AAAA,EACF;AACF;AAEA,SAAS,kBAAkB,MAAgC;AACzD,QAAM,aACJ,KAAK,MAAM,gBAAgB,KAAK,KAAK,MAAM,gBAAgB;AAC7D,MAAI,CAAC,YAAY;AACf;AAAA,EACF;AAEA,QAAM,QAAQ,WAAW,CAAC,EAAE,KAAK;AACjC,MAAI;AACF,WAAO,KAAK,MAAM,KAAK;AAAA,EACzB,QAAQ;AACN;AAAA,EACF;AACF;AAEA,SAAS,eAAe,MAAgC;AACtD,QAAM,cAAc,KAAK,QAAQ,GAAG;AACpC,QAAM,cAAc,KAAK,QAAQ,GAAG;AACpC,QAAM,QAAQ,CAAC,aAAa,WAAW,EACpC,OAAO,CAAC,MAAM,KAAK,CAAC,EACpB,KAAK,CAAC,GAAG,MAAM,IAAI,CAAC,EAAE,CAAC;AAE1B,MAAI,UAAU,QAAW;AACvB;AAAA,EACF;AAEA,QAAM,OAAO,KAAK,KAAK,MAAM,MAAM,MAAM;AACzC,QAAM,QAAQ,SAAS,MAAM,MAAM;AACnC,MAAI,QAAQ;AAEZ,WAAS,IAAI,OAAO,IAAI,KAAK,QAAQ,KAAK,GAAG;AAC3C,UAAM,KAAK,KAAK,CAAC;AACjB,QAAI,OAAO,MAAM;AACf,eAAS;AAAA,IACX,WAAW,OAAO,OAAO;AACvB,eAAS;AAAA,IACX;AAEA,QAAI,UAAU,GAAG;AACf,YAAM,YAAY,KAAK,MAAM,OAAO,IAAI,CAAC;AACzC,UAAI;AACF,eAAO,KAAK,MAAM,SAAS;AAAA,MAC7B,QAAQ;AACN;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAEA;AACF;AAEA,SAAS,sBAAsB,MAAgC;AAE7D,QAAM,eAAe,eAAe,IAAI;AACxC,MAAI,iBAAiB,QAAW;AAC9B,WAAO;AAAA,EACT;AAGA,QAAM,cAAc,kBAAkB,IAAI;AAC1C,MAAI,gBAAgB,QAAW;AAC7B,WAAO;AAAA,EACT;AAGA,SAAO,eAAe,IAAI;AAC5B;AAEA,SAAS,YAAY,UAAgB,QAAuB;AAE1D,MAAI,aAAa,QAAQ,OAAO,aAAa,UAAU;AACrD,WAAO,aAAa;AAAA,EACtB;AAEA,MAAI,MAAM,QAAQ,QAAQ,GAAG;AAC3B,QAAI,CAAC,MAAM,QAAQ,MAAM,GAAG;AAC1B,aAAO;AAAA,IACT;AAEA,aAAS,IAAI,GAAG,IAAI,SAAS,QAAQ,KAAK,GAAG;AAC3C,UAAI,CAAC,YAAY,SAAS,CAAC,GAAG,OAAO,CAAC,CAAC,GAAG;AACxC,eAAO;AAAA,MACT;AAAA,IACF;AACA,WAAO;AAAA,EACT;AAEA,MAAI,WAAW,QAAQ,OAAO,WAAW,UAAU;AACjD,WAAO;AAAA,EACT;AACA,QAAM,OAAO;AACb,QAAM,OAAO;AACb,aAAW,OAAO,OAAO,KAAK,IAAI,GAAG;AACnC,QAAI,CAAC,YAAY,KAAK,GAAG,GAAG,KAAK,GAAG,CAAC,GAAG;AACtC,aAAO;AAAA,IACT;AAAA,EACF;AACA,SAAO;AACT;AAUA,eAAe,eAA2C;AACxD,MAAI;AACF,UAAM,UAAU,eAAe;AAC/B,UAAM,aAAa,MAAMC,IAAG;AAAA,MAC1BC,MAAK,KAAK,SAAS,6BAA6B;AAAA,MAChD;AAAA,IACF;AACA,UAAM,gBAAgB,MAAMD,IAAG;AAAA,MAC7BC,MAAK,KAAK,SAAS,gCAAgC;AAAA,MACnD;AAAA,IACF;AAEA,UAAM,QAAQ,WACX,MAAM,aAAa,EACnB,OAAO,CAAC,SAAS,KAAK,KAAK,EAAE,SAAS,CAAC,EACvC,IAAI,CAAC,SAAS,KAAK,MAAM,IAAI,CAAC;AAEjC,UAAM,YAA8B,cACjC,MAAM,aAAa,EACnB,OAAO,CAAC,SAAS,KAAK,KAAK,EAAE,SAAS,CAAC,EACvC,IAAI,CAAC,SAAS,KAAK,MAAM,IAAI,CAAC;AAEjC,UAAM,cAAc,oBAAI,IAA4B;AACpD,eAAW,KAAK,WAAW;AACzB,kBAAY,IAAI,EAAE,IAAI,CAAC;AAAA,IACzB;AAEA,WAAO,EAAE,OAAO,YAAY;AAAA,EAC9B,SAAS,GAAY;AACnB,WAAO;AAAA,MACL,OAAO,CAAC;AAAA,MACR,aAAa,oBAAI,IAAI;AAAA,MACrB,OAAO;AAAA,IACT;AAAA,EACF;AACF;AAEA,SAAS,cAAc,IAAsC;AAC3D,QAAM,YAAY,KAAK,UAAU,GAAG,QAAQ,MAAM,CAAC;AACnD,SAAO;AAAA,IACL;AAAA,MACE,MAAM;AAAA,MACN,SACE;AAAA,IACJ;AAAA,IACA;AAAA,MACE,MAAM;AAAA,MACN,SAAS;AAAA,QACP;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA,GAAG;AAAA,QACH;AAAA,MACF,EAAE,KAAK,MAAM;AAAA,IACf;AAAA,EACF;AACF;AAcA,SAAS,iBACP,IACA,QACA,SACkB;AAClB,QAAM,WAAW,QAAQ,IAAI,QAAQ,GAAG,MAAM;AAC9C,QAAM,QAAQ,SAAS,MAAM;AAE7B,MAAI,CAAC,OAAO;AACV,YAAQ,KAAK;AAAA,MACX,UAAU,GAAG,EAAE,gCACZ,SAAS,UAAU,CAAC,GAClB,IAAI,CAAC,MAAM,GAAG,EAAE,YAAY,IAAI,EAAE,OAAO,EAAE,EAC3C,KAAK,IAAI,KAAK,SACnB;AAAA,IACF;AAAA,EACF;AAEA,QAAM,cAAc,QAAQ,YAAY,IAAI,GAAG,EAAE;AACjD,MAAI,CAAC,aAAa;AAChB,YAAQ,KAAK;AAAA,MACX,UAAU,GAAG,EAAE;AAAA,IACjB;AAAA,EACF;AAEA,QAAM,WAAW,cACb,YAAY,YAAY,UAAU,MAAM,IACxC;AAEJ,SAAO,EAAE,OAAO,UAAU,OAAO;AACnC;AAQA,eAAe,gBACb,IACA,SAC0E;AAC1E,QAAM,WAAW,cAAc,EAAE;AAEjC,QAAM,OAAO,QAAQ,QAAQ;AAC7B,QAAM,cAAc,OAAO,SAAS,WAAW,OAAO;AACtD,QAAM,EAAE,KAAK,IAAI,MAAMC,cAAa;AAAA,IAClC,OAAO,QAAQ;AAAA,IACf;AAAA,IACA,GAAI,gBAAgB,SAAY,EAAE,YAAY,IAAI,CAAC;AAAA,EACrD,CAAC;AAED,MAAI;AACJ,MAAI;AACF,aAAS,sBAAsB,IAAI;AAAA,EACrC,QAAQ;AAAA,EAER;AAEA,MAAI,WAAW,QAAW;AACxB,YAAQ,WAAW,KAAK;AAAA,MACtB,UAAU,GAAG,EAAE;AAAA,IACjB;AACA,WAAO,EAAE,aAAa,OAAO,YAAY,OAAO,SAAS,MAAM;AAAA,EACjE;AAEA,QAAM;AAAA,IACJ;AAAA,IACA;AAAA,IACA,QAAQ;AAAA,EACV,IAAI,iBAAiB,IAAI,QAAQ,QAAQ,UAAU;AAEnD,QAAM,UAAU,SAAS;AACzB,MAAI,SAAS;AACX,YAAQ,WAAW,KAAK,KAAK,UAAU,GAAG,EAAE,EAAE;AAAA,EAChD,OAAO;AACL,YAAQ,WAAW,KAAK;AAAA,MACtB,UAAU,GAAG,EAAE,iBAAiB,KAAK,cAAc,QAAQ,YAAY,KAAK;AAAA,QAC1E;AAAA,MACF,CAAC;AAAA,IACH;AAAA,EACF;AAEA,SAAO,EAAE,aAAa,OAAO,YAAY,UAAU,QAAQ;AAC7D;AAEO,IAAM,0BAAoD;AAAA,EAC/D,MAAM;AAAA,EACN,SAAS;AAAA,EACT,aACE;AAAA,EAEF,MAAM,IACJ,OACA,QAC0B;AAC1B,UAAM,OAAiB,CAAC;AACxB,UAAM,MAAM,IAAI,IAAI,EAAE,WAAW,MAAM,QAAQ,MAAM,CAAC;AAGtD,UAAM,EAAE,OAAO,aAAa,MAAM,IAAI,MAAM,aAAa;AACzD,QAAI,OAAO;AACT,aAAO;AAAA,QACL,OAAO;AAAA,QACP,SAAS;AAAA,QACT,SAAS,CAAC;AAAA,QACV,MAAM;AAAA,UACJ,oDAAoD,MAAM,OAAO;AAAA,QACnE;AAAA,QACA;AAAA,MACF;AAAA,IACF;AAEA,UAAM,UAA0B;AAAA,MAC9B;AAAA,MACA;AAAA,MACA,YAAY,EAAE,aAAa,KAAK,KAAK;AAAA,IACvC;AAEA,UAAM,SAAS,MAAM,gBAAgB,OAAO,OAAO;AACnD,WAAO,qBAAqB,MAAM,QAAQ,QAAQ,IAAI;AAAA,EACxD;AACF;AAEA,eAAe,gBACb,OACA,SAKC;AACD,MAAI,mBAAmB;AACvB,MAAI,kBAAkB;AACtB,MAAI,eAAe;AAEnB,aAAW,MAAM,OAAO;AACtB,QAAI;AACF,YAAM,SAAS,MAAM,gBAAgB,IAAI,OAAO;AAChD,UAAI,OAAO,aAAa;AACtB,4BAAoB;AAAA,MACtB;AACA,UAAI,OAAO,YAAY;AACrB,2BAAmB;AAAA,MACrB;AACA,UAAI,OAAO,SAAS;AAClB,wBAAgB;AAAA,MAClB;AAAA,IACF,SAAS,GAAY;AACnB,YAAM,MAAM,aAAa,QAAQ,EAAE,UAAU,OAAO,CAAC;AACrD,cAAQ,WAAW,KAAK,KAAK,WAAW,GAAG,EAAE,KAAK,GAAG,EAAE;AAAA,IACzD;AAAA,EACF;AAEA,SAAO,EAAE,kBAAkB,iBAAiB,aAAa;AAC3D;AAEA,SAAS,qBACP,OACA,QAKA,MACiB;AACjB,QAAM,QAAQ,OAAO,eAAe;AACpC,SAAO;AAAA,IACL;AAAA,IACA,SAAS,SAAS;AAAA,IAClB,SAAS;AAAA,MACP,aAAa;AAAA,MACb,eAAe,OAAO;AAAA,MACtB,oBAAoB,OAAO;AAAA,MAC3B,mBAAmB,OAAO;AAAA,MAC1B,UAAU;AAAA,IACZ;AAAA,IACA;AAAA,EACF;AACF;AAYA,eAAe,sBAGZ;AACD,MAAI;AACF,UAAM,UAAU,eAAe;AAC/B,UAAM,aAAa,MAAMF,IAAG;AAAA,MAC1BC,MAAK,KAAK,SAAS,6BAA6B;AAAA,MAChD;AAAA,IACF;AACA,UAAM,QAAQ,WACX,MAAMF,iBAAgB,EACtB,OAAO,CAAC,SAAS,KAAK,KAAK,EAAE,SAAS,CAAC,EACvC,IAAI,CAAC,SAAS,KAAK,MAAM,IAAI,CAAC;AACjC,WAAO,EAAE,MAAM;AAAA,EACjB,SAAS,GAAY;AACnB,WAAO,EAAE,OAAO,CAAC,GAAG,OAAO,EAAW;AAAA,EACxC;AACF;AAEA,eAAe,0BACb,IACA,SACkB;AAClB,QAAM,WAAW,cAAc,EAAE;AAEjC,QAAM,OAAO,QAAQ,QAAQ;AAC7B,QAAM,cAAc,OAAO,SAAS,WAAW,OAAO;AACtD,QAAM,EAAE,KAAK,IAAI,MAAMG,cAAa;AAAA,IAClC,OAAO,QAAQ;AAAA,IACf;AAAA,IACA,GAAI,gBAAgB,SAAY,EAAE,YAAY,IAAI,CAAC;AAAA,EACrD,CAAC;AAED,MAAI;AACJ,MAAI;AACF,aAAS,sBAAsB,IAAI;AAAA,EACrC,QAAQ;AAAA,EAER;AACA,MAAI,WAAW,QAAW;AACxB,YAAQ,KAAK;AAAA,MACX,UAAU,GAAG,EAAE;AAAA,IACjB;AACA,WAAO;AAAA,EACT;AAEA,QAAM,WAAW,QAAQ,IAAI,QAAQ,GAAG,MAAM;AAC9C,QAAM,QAAQ,SAAS,MAAM;AAC7B,MAAI,OAAO;AACT,YAAQ,KAAK,KAAK,UAAU,GAAG,EAAE,EAAE;AACnC,WAAO;AAAA,EACT;AAEA,UAAQ,KAAK;AAAA,IACX,UAAU,GAAG,EAAE,gCACZ,SAAS,UAAU,CAAC,GAClB,IAAI,CAAC,MAAM,GAAG,EAAE,YAAY,IAAI,EAAE,OAAO,EAAE,EAC3C,KAAK,IAAI,KAAK,SACnB;AAAA,EACF;AACA,SAAO;AACT;AAEA,eAAe,mBACb,OACA,SACiB;AACjB,MAAI,mBAAmB;AAEvB,aAAW,MAAM,OAAO;AACtB,QAAI;AACF,YAAM,UAAU,MAAM,0BAA0B,IAAI,OAAO;AAC3D,UAAI,SAAS;AACX,4BAAoB;AAAA,MACtB;AAAA,IACF,SAAS,GAAY;AACnB,YAAM,MAAM,aAAa,QAAQ,EAAE,UAAU,OAAO,CAAC;AACrD,cAAQ,KAAK,KAAK,WAAW,GAAG,EAAE,KAAK,GAAG,EAAE;AAAA,IAC9C;AAAA,EACF;AAEA,SAAO;AACT;AAEO,IAAM,oCAA8D;AAAA,EACzE,MAAM;AAAA,EACN,SAAS;AAAA,EACT,aACE;AAAA,EAEF,MAAM,IACJ,OACA,QAC0B;AAC1B,UAAM,OAAiB,CAAC;AACxB,UAAM,MAAM,IAAI,IAAI,EAAE,WAAW,MAAM,QAAQ,MAAM,CAAC;AAEtD,UAAM,EAAE,OAAO,MAAM,IAAI,MAAM,oBAAoB;AACnD,QAAI,OAAO;AACT,YAAM,MAAM,MAAM;AAClB,aAAO;AAAA,QACL,OAAO;AAAA,QACP,SAAS;AAAA,QACT,SAAS,CAAC;AAAA,QACV,MAAM,CAAC,6CAA6C,GAAG,EAAE;AAAA,QACzD;AAAA,MACF;AAAA,IACF;AAEA,UAAM,UAA6B,EAAE,OAAO,QAAQ,KAAK,KAAK;AAC9D,UAAM,mBAAmB,MAAM,mBAAmB,OAAO,OAAO;AAEhE,UAAM,QAAQ,MAAM;AACpB,UAAM,QAAQ,QAAQ,IAAI,mBAAmB,QAAQ;AACrD,WAAO;AAAA,MACL;AAAA,MACA,SAAS,SAAS;AAAA,MAClB,SAAS;AAAA,QACP,aAAa;AAAA,QACb,oBAAoB;AAAA,QACpB,UAAU;AAAA,MACZ;AAAA,MACA;AAAA,IACF;AAAA,EACF;AACF;;;AClhBA,IAAM,SAAS;AAAA,EACb,OAAO;AAAA,EACP,OAAO;AAAA,EACP,KAAK;AAAA,EACL,QAAQ;AAAA,EACR,MAAM;AAAA,EACN,SAAS;AAAA,EACT,MAAM;AACR;AAEA,SAAS,YAAY,QAA0B;AAC7C,QAAM,EAAE,OAAO,UAAU,WAAW,QAAQ,gBAAgB,IAAI;AAChE,QAAM,SAAS,gBAAgB,UAC3B,GAAG,OAAO,KAAK,iBAAY,OAAO,KAAK,KACvC,GAAG,OAAO,GAAG,iBAAY,OAAO,KAAK;AAEzC,UAAQ;AAAA,IACN;AAAA,GAAM,OAAO,IAAI,IAAI,KAAK,IAAI,OAAO,KAAK,GAAG,WAAW,IAAI,OAAO,IAAI,IAAI,QAAQ,IAAI,OAAO,KAAK,KAAK,EAAE,MAAM,OAAO,OAAO,GAAG,SAAS,GAAG,OAAO,KAAK;AAAA,EAC3J;AACA,UAAQ;AAAA,IACN,YAAO,MAAM,aAAa,OAAO,MAAM,GAAG,gBAAgB,MAAM,QAAQ,CAAC,CAAC,GAAG,OAAO,KAAK;AAAA,EAC3F;AAEA,QAAM,UAAU,OAAO,QAAQ,gBAAgB,OAAO;AACtD,MAAI,QAAQ,SAAS,GAAG;AACtB,YAAQ,IAAI,cAAc;AAC1B,eAAW,CAAC,KAAK,KAAK,KAAK,SAAS;AAClC,cAAQ,IAAI,WAAW,GAAG,KAAK,KAAK,EAAE;AAAA,IACxC;AAAA,EACF;AAEA,MAAI,gBAAgB,OAAO;AACzB,YAAQ;AAAA,MACN,OAAO,OAAO,GAAG,UAAU,gBAAgB,MAAM,OAAO,GAAG,OAAO,KAAK;AAAA,IACzE;AAAA,EACF;AACF;AAEO,SAAS,gBAAgB,SAAmC;AACjE,UAAQ,IAAI,uCAAgC;AAC5C,aAAW,UAAU,SAAS;AAC5B,gBAAY,MAAM;AAAA,EACpB;AACA,UAAQ,IAAI,iCAAiC;AAC/C;;;AC5CA,IAAM,gBAAgB;AACtB,IAAM,0BAA0B;AAChC,IAAM,kCAAkC;AAExC,IAAMC,UAAS;AAAA,EACb,OAAO;AAAA,EACP,OAAO;AAAA,EACP,KAAK;AAAA,EACL,QAAQ;AAAA,EACR,MAAM;AAAA,EACN,SAAS;AAAA,EACT,MAAM;AAAA,EACN,MAAM;AAAA,EACN,WAAW;AACb;AAEA,SAAS,iBAAiB,MAAsB;AAC9C,MAAI,KAAK,WAAW,GAAG,GAAG;AACxB,WAAO,GAAGA,QAAO,KAAK,GAAG,IAAI,GAAGA,QAAO,KAAK;AAAA,EAC9C;AACA,MAAI,KAAK,WAAW,GAAG,GAAG;AACxB,WAAO,GAAGA,QAAO,GAAG,GAAG,IAAI,GAAGA,QAAO,KAAK;AAAA,EAC5C;AACA,MAAI,KAAK,WAAW,GAAG,GAAG;AACxB,WAAO,GAAGA,QAAO,IAAI,GAAGA,QAAO,IAAI,GAAG,IAAI,GAAGA,QAAO,KAAK;AAAA,EAC3D;AACA,SAAO;AACT;AAEA,SAAS,YAAY,OAA2B;AAC9C,QAAM,OAAO,oBAAI,IAAY;AAC7B,QAAM,MAAgB,CAAC;AACvB,aAAW,KAAK,OAAO;AACrB,QAAI,KAAK,IAAI,CAAC,GAAG;AACf;AAAA,IACF;AACA,SAAK,IAAI,CAAC;AACV,QAAI,KAAK,CAAC;AAAA,EACZ;AACA,SAAO;AACT;AAGA,SAAS,qBAAqB,MAA0B;AACtD,SAAO,KAAK;AAAA,IACV,CAAC,MACC,OAAO,CAAC,EAAE,SAAS,eAAe,KAClC,OAAO,CAAC,EAAE,SAAS,mBAAmB;AAAA,EAC1C;AACF;AAGA,SAAS,uBACP,UACA,QACA,aACM;AACN,QAAM,eAAgB,UAClB;AACJ,QAAM,aAAc,QAChB;AACJ,MAAI,gBAAgB,cAAc,iBAAiB,YAAY;AAC7D,gBAAY;AAAA,MACV,sBAAsB,YAAY,iBAAiB,UAAU;AAAA,IAC/D;AAAA,EACF;AACA,MAAI,MAAM,QAAS,UAAsC,SAAS,GAAG;AACnE,gBAAY;AAAA,MACV,8BAAgC,SAAqC,UAAuB,KAAK,IAAI,CAAC;AAAA,IACxG;AAAA,EACF;AACF;AAGA,SAAS,uBAAuB,MAAiB,aAA6B;AAC5E,QAAM,UAAU,KACb,OAAO,CAAC,MAAe,OAAO,CAAC,EAAE,WAAW,2BAA2B,CAAC,EACxE,IAAI,CAAC,MAAe,OAAO,CAAC,EAAE,QAAQ,8BAA8B,EAAE,CAAC;AAC1E,MAAI,QAAQ,QAAQ;AAClB,gBAAY,KAAK,8BAA8B,QAAQ,KAAK,IAAI,CAAC,GAAG;AAAA,EACtE;AACF;AAGA,SAAS,0BACP,MACA,aACM;AACN,QAAM,SAAS,KACZ,OAAO,CAAC,MAAe,OAAO,CAAC,EAAE,WAAW,qBAAqB,CAAC,EAClE,IAAI,CAAC,MAAe,OAAO,CAAC,EAAE,QAAQ,wBAAwB,EAAE,CAAC;AACpE,MAAI,OAAO,QAAQ;AACjB,gBAAY,KAAK,mCAAmC,OAAO,KAAK,IAAI,CAAC,GAAG;AAAA,EAC1E;AACF;AAGA,SAAS,qBAAqB,MAAiB,aAA6B;AAC1E,QAAM,UAAU,KACb,OAAO,CAAC,MAAe,OAAO,CAAC,EAAE,WAAW,WAAW,CAAC,EACxD,IAAI,CAAC,MAAe,OAAO,CAAC,EAAE,QAAQ,aAAa,EAAE,CAAC;AACzD,aAAW,SAAS,SAAS;AAC3B,UAAM,mBAAoB,KAAmB;AAAA,MAAK,CAAC,MACjD,OAAO,CAAC,EAAE,WAAW,oBAAoB;AAAA,IAC3C;AACA,UAAM,oBAAqB,KAAmB;AAAA,MAAK,CAAC,MAClD,OAAO,CAAC,EAAE,WAAW,aAAa;AAAA,IACpC;AACA,QAAI,mBAAmB;AACrB,YAAM,QAAQ,kBAAkB,QAAQ,gBAAgB,EAAE;AAC1D,kBAAY,KAAK,QAAQ,KAAK,SAAS,KAAK,GAAG;AAAA,IACjD,WAAW,kBAAkB;AAC3B,YAAM,UAAU,iBAAiB,QAAQ,uBAAuB,EAAE;AAClE,kBAAY,KAAK,QAAQ,KAAK,gBAAgB,OAAO,GAAG;AAAA,IAC1D,OAAO;AACL,kBAAY,KAAK,WAAW,KAAK,wBAAwB;AAAA,IAC3D;AAAA,EACF;AACF;AAGA,SAAS,qBAAqB,YAAoB,aAA6B;AAC7E,MAAI,WAAW,SAAS,kBAAkB,GAAG;AAC3C,gBAAY,KAAK,yDAAyD;AAAA,EAC5E,WAAW,WAAW,SAAS,kBAAkB,GAAG;AAClD,gBAAY,KAAK,mDAAmD;AAAA,EACtE,WAAW,WAAW,SAAS,aAAa,GAAG;AAC7C,gBAAY;AAAA,MACV;AAAA,IACF;AAAA,EACF,WAAW,WAAW,SAAS,iBAAiB,GAAG;AACjD,gBAAY,KAAK,uDAAuD;AAAA,EAC1E,WAAW,WAAW,SAAS,aAAa,GAAG;AAC7C,gBAAY,KAAK,0CAA0C;AAAA,EAC7D;AACF;AAEA,SAAS,mBAAmB,QAA2B;AACrD,QAAM,cAAwB,CAAC;AAC/B,QAAM,EAAE,YAAY,UAAU,QAAQ,KAAK,IACxC,UAAsC,CAAC;AAE1C,MAAI,CAAC,MAAM,QAAQ,IAAI,GAAG;AACxB,QAAI,YAAY,WAAW,KAAK,OAAO,eAAe,UAAU;AAC9D,2BAAqB,YAAY,WAAW;AAAA,IAC9C;AACA,WAAO,YAAY,WAAW;AAAA,EAChC;AAEA,MAAI,qBAAqB,IAAI,GAAG;AAC9B,2BAAuB,UAAU,QAAQ,WAAW;AAAA,EACtD;AAEA,MACE,KAAK,KAAK,CAAC,MAAe,OAAO,CAAC,EAAE,WAAW,2BAA2B,CAAC,GAC3E;AACA,2BAAuB,MAAM,WAAW;AAAA,EAC1C;AAEA,MAAI,KAAK,KAAK,CAAC,MAAe,OAAO,CAAC,EAAE,WAAW,qBAAqB,CAAC,GAAG;AAC1E,8BAA0B,MAAM,WAAW;AAAA,EAC7C;AAEA,MAAI,KAAK,KAAK,CAAC,MAAe,OAAO,CAAC,EAAE,WAAW,WAAW,CAAC,GAAG;AAChE,yBAAqB,MAAM,WAAW;AAAA,EACxC;AAEA,MAAI,YAAY,WAAW,KAAK,OAAO,eAAe,UAAU;AAC9D,yBAAqB,YAAY,WAAW;AAAA,EAC9C;AAEA,SAAO,YAAY,WAAW;AAChC;AAGA,SAAS,qBAAqB,MAAkC;AAC9D,MAAI,KAAK,WAAW,QAAQ,GAAG;AAC7B,UAAM,IAAI,KAAK,MAAM,aAAa;AAClC,WAAO,IAAI,CAAC;AAAA,EACd;AACA,MAAI,KAAK,WAAW,cAAc,GAAG;AACnC,QAAI;AACF,YAAM,SAAS,KAAK,MAAM,KAAK,QAAQ,yBAAyB,EAAE,CAAC;AACnE,aAAO,OAAO,QAAQ,MAAM,EAAE;AAAA,IAChC,QAAQ;AAAA,IAIR;AAAA,EACF;AACA,MAAI,KAAK,WAAW,sBAAsB,GAAG;AAC3C,QAAI;AACF,YAAM,SAAS,KAAK;AAAA,QAClB,KAAK,QAAQ,iCAAiC,EAAE;AAAA,MAClD;AACA,aAAO,OAAO,QAAQ,MAAM,EAAE;AAAA,IAChC,QAAQ;AAAA,IAER;AAAA,EACF;AACA;AACF;AAGA,SAAS,kBAAkB,UAA2C;AACpE,QAAM,OAAO,oBAAI,IAAsB;AACvC,aAAW,QAAQ,UAAU;AAC3B,UAAM,KAAK,qBAAqB,IAAI;AACpC,UAAM,MAAM,MAAM;AAClB,UAAM,MAAM,KAAK,IAAI,GAAG,KAAK,CAAC;AAC9B,QAAI,KAAK,IAAI;AACb,SAAK,IAAI,KAAK,GAAG;AAAA,EACnB;AACA,SAAO;AACT;AAGA,SAAS,gBAAgB,OAA8B;AACrD,QAAM,WAAW,oBAAI,IAAY;AACjC,aAAW,KAAK,OAAO;AACrB,QAAI,EAAE,WAAW,cAAc,GAAG;AAChC,UAAI;AACF,cAAM,SAAS,KAAK,MAAM,EAAE,QAAQ,yBAAyB,EAAE,CAAC;AAChE,YAAI,QAAQ,IAAI;AACd,mBAAS,IAAI,OAAO,OAAO,EAAE,CAAC;AAAA,QAChC;AAAA,MACF,QAAQ;AAAA,MAER;AAAA,IACF;AAAA,EACF;AACA,SAAO;AACT;AAGA,SAAS,kBAAkB,QAAgB,MAAe,OAAqB;AAC7E,UAAQ;AAAA,IACN,QACE,SACA,KAAK,UAAU,MAAM,MAAM,CAAC,EAAE,MAAM,IAAI,EAAE,KAAK,gBAAgB,IAC/DA,QAAO;AAAA,EACX;AACF;AAGA,SAAS,qBAAqB,MAAoB;AAChD,QAAM,UAAU,KAAK,QAAQ,yBAAyB,EAAE;AACxD,MAAI;AACF,UAAM,SAAS,KAAK,MAAM,OAAO;AACjC,UAAM,EAAE,SAAS,MAAM,UAAU,OAAO,IAAI;AAC5C,QAAI,SAAS;AACX,cAAQ,IAAI,WAAWA,QAAO,IAAI,GAAG,OAAO,GAAGA,QAAO,KAAK,EAAE;AAAA,IAC/D;AACA,QAAI,QAAQ,MAAM,QAAQ,IAAI,GAAG;AAC/B,iBAAW,SAAS,MAAM;AACxB,gBAAQ,IAAI,aAAa,iBAAiB,KAAK,CAAC,EAAE;AAAA,MACpD;AAAA,IACF,OAAO;AACL,cAAQ,IAAI,qBAAqB;AACjC,wBAAkB,gBAAgB,UAAUA,QAAO,KAAK;AACxD,cAAQ,IAAI,mBAAmB;AAC/B,wBAAkB,gBAAgB,QAAQA,QAAO,GAAG;AAAA,IACtD;AACA,UAAM,cAAc,mBAAmB,MAAM;AAC7C,QAAI,YAAY,QAAQ;AACtB,cAAQ,IAAI,aAAaA,QAAO,IAAI,iBAAiBA,QAAO,KAAK,EAAE;AACnE,iBAAW,KAAK,aAAa;AAC3B,gBAAQ,IAAI,sBAAiB,CAAC,EAAE;AAAA,MAClC;AAAA,IACF;AAAA,EACF,QAAQ;AACN,YAAQ,IAAI,WAAW,IAAI,EAAE;AAAA,EAC/B;AACF;AAGA,SAAS,mBAAmB,KAAoC;AAC9D,MAAI,IAAI,aAAa;AACnB,sBAAkB,2BAA2B,IAAI,aAAaA,QAAO,IAAI;AAAA,EAC3E;AACA,MAAI,IAAI,iBAAiB;AACvB,YAAQ;AAAA,MACNA,QAAO,OACL,0BACA,KAAK,UAAU,IAAI,eAAe,IAClCA,QAAO;AAAA,IACX;AAAA,EACF;AACA,MAAI,IAAI,gBAAgB;AACtB,YAAQ;AAAA,MACNA,QAAO,OACL,gEACA,OAAO,IAAI,cAAc,EAAE,MAAM,IAAI,EAAE,KAAK,gBAAgB,IAC5DA,QAAO;AAAA,IACX;AAAA,EACF;AACA,MAAI,IAAI,mBAAmB;AACzB;AAAA,MACE;AAAA,MACA,IAAI;AAAA,MACJA,QAAO;AAAA,IACT;AAAA,EACF;AACA,MAAI,IAAI,cAAc;AACpB;AAAA,MACE;AAAA,MACA,IAAI;AAAA,MACJA,QAAO;AAAA,IACT;AAAA,EACF;AACA,MAAI,IAAI,eAAe;AACrB,YAAQ;AAAA,MACNA,QAAO,OACL,8BACA,KAAK,UAAU,IAAI,aAAa,IAChCA,QAAO;AAAA,IACX;AAAA,EACF;AACF;AAGA,SAAS,4BAA4B,MAAoB;AACvD,QAAM,UAAU,KAAK,QAAQ,iCAAiC,EAAE;AAChE,MAAI;AACF,UAAM,MAAM,KAAK,MAAM,OAAO;AAC9B,YAAQ,IAAI,WAAWA,QAAO,IAAI,WAAWA,QAAO,KAAK,EAAE;AAC3D,uBAAmB,GAAG;AAAA,EACxB,QAAQ;AACN,YAAQ,IAAI,WAAW,IAAI,EAAE;AAAA,EAC/B;AACF;AAGA,SAAS,eAAe,MAAc,UAA6B;AACjE,MAAI,KAAK,WAAW,QAAQ,GAAG;AAC7B,UAAM,IAAI,KAAK,MAAM,aAAa;AAClC,UAAM,SAAS,IAAI,CAAC;AACpB,QAAI,UAAU,SAAS,IAAI,MAAM,GAAG;AAClC;AAAA,IACF;AACA,YAAQ,IAAI,WAAWA,QAAO,GAAG,GAAG,IAAI,GAAGA,QAAO,KAAK,EAAE;AAAA,EAC3D,WAAW,KAAK,WAAW,SAAS,KAAK,KAAK,WAAW,SAAS,GAAG;AACnE,YAAQ,IAAI,WAAWA,QAAO,MAAM,GAAG,IAAI,GAAGA,QAAO,KAAK,EAAE;AAAA,EAC9D,WAAW,KAAK,WAAW,SAAS,GAAG;AACrC,YAAQ,IAAI,WAAWA,QAAO,IAAI,GAAG,IAAI,GAAGA,QAAO,KAAK,EAAE;AAAA,EAC5D,WAAW,KAAK,WAAW,cAAc,GAAG;AAC1C,yBAAqB,IAAI;AAAA,EAC3B,WAAW,KAAK,WAAW,sBAAsB,GAAG;AAClD,gCAA4B,IAAI;AAAA,EAClC;AACF;AAGA,SAAS,uBAAuB,MAAmC;AACjE,UAAQ,IAAI,OAAOA,QAAO,IAAI,6BAA6BA,QAAO,KAAK,EAAE;AACzE,aAAW,CAAC,SAAS,KAAK,KAAK,MAAM;AACnC,QAAI,YAAY,eAAe;AAC7B,cAAQ,IAAI,SAASA,QAAO,SAAS,GAAG,OAAO,GAAGA,QAAO,KAAK,EAAE;AAAA,IAClE;AACA,UAAM,WAAW,gBAAgB,KAAK;AACtC,eAAW,QAAQ,OAAO;AACxB,qBAAe,MAAM,QAAQ;AAAA,IAC/B;AAAA,EACF;AACF;AAGA,SAAS,mBAAmB,MAAsB;AAChD,QAAM,OAAO,KAAK;AAAA,IAChB,CAAC,MAAM,EAAE,WAAW,QAAQ,KAAK,EAAE,WAAW,QAAQ;AAAA,EACxD;AACA,aAAW,QAAQ,MAAM;AACvB,YAAQ,IAAI,SAASA,QAAO,IAAI,GAAG,IAAI,GAAGA,QAAO,KAAK,EAAE;AAAA,EAC1D;AACF;AAGA,SAAS,kBAAkB,MAA0B;AACnD,SAAO,KAAK;AAAA,IACV,CAAC,MACC,EAAE,WAAW,QAAQ,KACrB,EAAE,WAAW,SAAS,KACtB,EAAE,WAAW,SAAS,KACtB,EAAE,WAAW,SAAS,KACtB,EAAE,WAAW,cAAc,KAC3B,EAAE,WAAW,sBAAsB;AAAA,EACvC;AACF;AAGA,SAAS,kBAAkB,MAAsB;AAC/C,QAAM,WAAW,kBAAkB,IAAI;AACvC,QAAM,WAAW,SAAS,SAAS;AACnC,MAAI,UAAU;AACZ,UAAM,OAAO,kBAAkB,QAAQ;AACvC,2BAAuB,IAAI;AAAA,EAC7B,OAAO;AACL,uBAAmB,IAAI;AAAA,EACzB;AACF;AAGA,SAAS,eAAe,SAAoC;AAC1D,MAAI,QAAQ,SAAS,GAAG;AACtB,YAAQ,IAAI,cAAc;AAC1B,eAAW,CAAC,GAAG,CAAC,KAAK,SAAS;AAC5B,cAAQ,IAAI,WAAW,CAAC,KAAK,CAAC,EAAE;AAAA,IAClC;AAAA,EACF;AACF;AAGA,SAAS,oBAAoB,GAA2B;AACtD,QAAM,EAAE,OAAO,UAAU,WAAW,OAAO,IAAI;AAC/C,QAAM,SAAS,OAAO,UAClB,GAAGA,QAAO,KAAK,iBAAYA,QAAO,KAAK,KACvC,GAAGA,QAAO,GAAG,iBAAYA,QAAO,KAAK;AAEzC,UAAQ;AAAA,IACN;AAAA,GAAMA,QAAO,IAAI,IAAI,KAAK,IAAIA,QAAO,KAAK,GAAG,WAAW,IAAIA,QAAO,IAAI,IAAI,QAAQ,IAAIA,QAAO,KAAK,KAAK,EAAE,MAAMA,QAAO,OAAO,GAAG,SAAS,GAAGA,QAAO,KAAK;AAAA,EAC3J;AACA,UAAQ;AAAA,IACN,YAAO,MAAM,aAAaA,QAAO,MAAM,GAAG,OAAO,MAAM,QAAQ,CAAC,CAAC,GAAGA,QAAO,KAAK;AAAA,EAClF;AACF;AAEO,SAAS,qBAAqB,SAAmC;AACtE,UAAQ,IAAI,+CAAwC;AACpD,aAAW,KAAK,SAAS;AACvB,wBAAoB,CAAC;AACrB,mBAAe,OAAO,QAAQ,EAAE,OAAO,OAAO,CAAC;AAC/C,QAAI,EAAE,OAAO,MAAM,QAAQ;AACzB,wBAAkB,EAAE,OAAO,IAAI;AAAA,IACjC;AAAA,EACF;AACA,UAAQ,IAAI,0CAA0C;AACxD;;;ACrbO,SAAS,aAAa,SAAmC;AAG9D,QAAM,sBAAsB,QAAQ,IAAI,CAAC,OAAO;AAAA,IAC9C,GAAG;AAAA,IACH,QAAQ;AAAA,MACN,GAAG,EAAE;AAAA,MACL,OAAO,EAAE,OAAO,OAAO;AAAA,IACzB;AAAA,EACF,EAAE;AACF,UAAQ,IAAI,KAAK,UAAU,qBAAqB,MAAM,CAAC,CAAC;AAC1D;;;ACPO,IAAM,YAGT;AAAA,EACF,SAAS;AAAA,EACT,MAAM;AAAA,EACN,iBAAiB;AACnB;;;ACHA,eAAe,mBACb,OACA,WACA,UACA,QAC2B;AAC3B,QAAM,UACJ,OAAO,UAAU,YACjB,UAAU,QACV,aAAa,SACb,OAAO,MAAM,YAAY,WACrB,MAAM,UACN;AAEN,MAAI;AACF,YAAQ;AAAA,MACN,IAAI,OAAO,IAAI,WAAW,KAAK,QAAQ,MAAM,EAAE,uBAAuB,UAAU,IAAI;AAAA,IACtF;AACA,UAAM,SAAS,MAAM,UAAU,IAAI,OAAO,MAAM;AAChD,YAAQ;AAAA,MACN,IAAI,OAAO,IAAI,WAAW,KAAK,QAAQ,MAAM,EAAE,wBAAwB,UAAU,IAAI,YAAY,OAAO,KAAK;AAAA,IAC/G;AACA,WAAO;AAAA,MACL,OAAO;AAAA,MACP;AAAA,MACA,WAAW,UAAU;AAAA,MACrB;AAAA,IACF;AAAA,EACF,SAAS,OAAO;AACd,YAAQ;AAAA,MACN,IAAI,OAAO,IAAI,WAAW,KAAK,QAAQ,MAAM,EAAE,6BAA6B,UAAU,IAAI;AAAA,MAC1F;AAAA,IACF;AACA,WAAO;AAAA,MACL,OAAO;AAAA,MACP;AAAA,MACA,WAAW,UAAU;AAAA,MACrB,QAAQ;AAAA,QACN,OAAO;AAAA,QACP,SAAS;AAAA,QACT,SAAS,CAAC;AAAA,QACV,OAAO,iBAAiB,QAAQ,QAAQ,IAAI,MAAM,OAAO,KAAK,CAAC;AAAA,MACjE;AAAA,IACF;AAAA,EACF;AACF;AAKA,SAAS,gBACP,QACuC;AACvC,QAAM,eAAsD,CAAC;AAE7D,MAAI,MAAM,QAAQ,MAAM,GAAG;AACzB,eAAW,KAAK,QAAQ;AACtB,mBAAa,KAAK,CAAC,QAAW,CAAC,CAAC;AAAA,IAClC;AAAA,EACF,WACE,OAAO,WAAW,YAClB,WAAW,QACX,aAAc,QACd;AACA,iBAAa,KAAK,CAAC,QAAW,MAAkC,CAAC;AAAA,EACnE,OAAO;AACL,eAAW,CAAC,KAAK,CAAC,KAAK,OAAO;AAAA,MAC5B;AAAA,IACF,GAAG;AACD,mBAAa,KAAK,CAAC,KAAK,CAAC,CAAC;AAAA,IAC5B;AAAA,EACF;AAEA,SAAO;AACT;AAKA,SAAS,YACP,aACA,WACqC;AACrC,QAAM,SAAkC,CAAC;AACzC,MAAI,gBAAgB,QAAW;AAC7B,WAAO,cAAc;AAAA,EACvB;AACA,MAAI,cAAc,QAAW;AAC3B,WAAO,YAAY;AAAA,EACrB;AACA,SAAO,OAAO,KAAK,MAAM,EAAE,SAAS,IAAI,SAAS;AACnD;AAKA,SAAS,gBACP,UACA,SACM;AACN,QAAM,SAAS,UAAU,QAAQ;AACjC,MAAI,QAAQ;AACV,WAAO,OAAO;AAAA,EAChB,OAAO;AACL,YAAQ,KAAK,sBAAsB,QAAQ,2BAA2B;AACtE,cAAU,QAAQ,OAAO;AAAA,EAC3B;AACF;AAEA,eAAsB,SACpB,SAC6B;AAC7B,QAAM;AAAA,IACJ;AAAA,IACA;AAAA,IACA,WAAW;AAAA,IACX;AAAA,IACA;AAAA,EACF,IAAI;AAEJ,QAAM,eAAe,gBAAgB,MAAM;AAC3C,QAAM,SAAS,YAAY,aAAa,SAAS;AACjD,QAAM,aAAiC,CAAC;AAExC,aAAW,CAAC,UAAU,KAAK,KAAK,cAAc;AAC5C,eAAW,aAAa,YAAY;AAClC,YAAM,mBAAmB,MAAM;AAAA,QAC7B;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACF;AACA,iBAAW,KAAK,gBAAgB;AAAA,IAClC;AAAA,EACF;AAEA,kBAAgB,UAAU,UAAU;AACpC,SAAO;AACT;","names":["fs","path","require","fs","path","fs","path","generateText","LINE_SPLIT_REGEX","fs","path","generateText","colors"]}