@ai-sdk-tool/eval 1.0.0 → 1.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +9 -3
- package/data/BFCL_v4_multi_turn_base.jsonl +200 -0
- package/data/BFCL_v4_multi_turn_long_context.jsonl +200 -0
- package/data/BFCL_v4_multi_turn_miss_func.jsonl +200 -0
- package/data/BFCL_v4_multi_turn_miss_param.jsonl +200 -0
- package/data/multi_turn_func_doc/gorilla_file_system.jsonl +18 -0
- package/data/multi_turn_func_doc/math_api.jsonl +17 -0
- package/data/multi_turn_func_doc/memory_kv.jsonl +15 -0
- package/data/multi_turn_func_doc/memory_rec_sum.jsonl +5 -0
- package/data/multi_turn_func_doc/memory_vector.jsonl +12 -0
- package/data/multi_turn_func_doc/message_api.jsonl +10 -0
- package/data/multi_turn_func_doc/posting_api.jsonl +14 -0
- package/data/multi_turn_func_doc/ticket_api.jsonl +9 -0
- package/data/multi_turn_func_doc/trading_bot.jsonl +20 -0
- package/data/multi_turn_func_doc/travel_booking.jsonl +18 -0
- package/data/multi_turn_func_doc/vehicle_control.jsonl +22 -0
- package/data/multi_turn_func_doc/web_search.jsonl +2 -0
- package/data/possible_answer/BFCL_v4_multi_turn_base.jsonl +200 -0
- package/data/possible_answer/BFCL_v4_multi_turn_long_context.jsonl +200 -0
- package/data/possible_answer/BFCL_v4_multi_turn_miss_func.jsonl +200 -0
- package/data/possible_answer/BFCL_v4_multi_turn_miss_param.jsonl +200 -0
- package/dist/index.cjs +4526 -62
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +17 -1
- package/dist/index.d.ts +17 -1
- package/dist/index.js +4525 -62
- package/dist/index.js.map +1 -1
- package/package.json +5 -4
package/dist/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts","../src/benchmarks/bfcl.ts","../src/utils/paths.ts","../src/benchmarks/bfcl/ast-checker.ts","../src/benchmarks/complex-func-bench.ts","../src/benchmarks/json-generation.ts","../src/evaluate.ts","../src/reporters/console.ts","../src/reporters/console.debug.ts","../src/reporters/console.summary.ts","../src/reporters/json.ts","../src/reporters/index.ts"],"sourcesContent":["// biome-ignore lint/performance/noBarrelFile: Package entrypoint - must re-export for public API\nexport {\n bfclMultipleBenchmark,\n bfclParallelBenchmark,\n bfclParallelMultipleBenchmark,\n bfclSimpleBenchmark,\n} from \"./benchmarks/bfcl\";\nexport { complexFuncBenchBenchmark } from \"./benchmarks/complex-func-bench\";\nexport {\n jsonGenerationBenchmark,\n jsonGenerationSchemaOnlyBenchmark,\n} from \"./benchmarks/json-generation\";\nexport { evaluate } from \"./evaluate\";\n\n// Core interfaces for custom benchmarks\nexport type {\n BenchmarkResult,\n EvaluateOptions,\n LanguageModelV3Benchmark,\n ModelConfig,\n ReporterType,\n} from \"./interfaces\";\n","import { promises as fs } from \"node:fs\";\nimport path from \"node:path\";\nimport type { JSONObject } from \"@ai-sdk/provider\";\nimport {\n generateText,\n jsonSchema,\n type LanguageModel,\n type ModelMessage,\n tool,\n} from \"ai\";\n\nimport type { BenchmarkResult, LanguageModelV3Benchmark } from \"../interfaces\";\nimport { resolveDataDir } from \"../utils/paths\";\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+$/;\nconst DIFF_NUMERIC_EXTRACT_REGEX = /:\\s*([\\d.]+)/;\n\n// Helper function to convert ground truth to morphXML format\nfunction convertGroundTruthToXML(call: Record<string, unknown>): string {\n const keys = Object.keys(call);\n if (keys.length === 0) {\n return \"<empty_call />\";\n }\n const funcName = keys[0];\n if (!funcName) {\n return \"<undefined_function />\";\n }\n const params = call[funcName] as Record<string, unknown>;\n if (!params || typeof params !== \"object\") {\n return `<${funcName} />`;\n }\n let xml = `<${funcName}>\\n`;\n for (const [key, value] of Object.entries(params)) {\n // Value is typically an array [value, ...alternatives]\n const displayValue = Array.isArray(value) ? value[0] : value;\n let valueStr: string;\n if (typeof displayValue === \"string\") {\n valueStr = displayValue;\n } else if (displayValue === null || displayValue === undefined) {\n valueStr = \"\";\n } else {\n valueStr = JSON.stringify(displayValue);\n }\n xml += ` <${key}>${valueStr}</${key}>\\n`;\n }\n xml += `</${funcName}>`;\n return xml;\n}\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\ninterface Message {\n role: string;\n content: string;\n}\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 extractCategory(id: string): string {\n if (id.startsWith(\"parallel_multiple\")) {\n return \"parallel_multiple\";\n }\n if (id.startsWith(\"simple_python\")) {\n return \"simple\";\n }\n if (id.startsWith(\"simple_java\")) {\n return \"simple\";\n }\n if (id.startsWith(\"simple_javascript\")) {\n return \"simple\";\n }\n if (id.startsWith(\"parallel\")) {\n return \"parallel\";\n }\n if (id.startsWith(\"multiple\")) {\n return \"multiple\";\n }\n if (id.startsWith(\"simple\")) {\n return \"simple\";\n }\n return id.split(\"_\")[0];\n}\n\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 = extractCategory(testCase.id);\n\n try {\n switch (category) {\n case \"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 case \"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 case \"parallel\":\n case \"parallel_multiple\": {\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 default: {\n return { valid: true };\n }\n }\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 16)\n const concurrencyEnv = process.env.BFCL_CONCURRENCY;\n const concurrency =\n concurrencyEnv && Number.isFinite(Number(concurrencyEnv))\n ? Math.max(1, Number(concurrencyEnv))\n : 16;\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 const hasPercentPattern = (diff: string[]): boolean => {\n return diff.some((d) => {\n if (!(d.startsWith(\"+ got:\") || d.startsWith(\"- expected:\"))) {\n return false;\n }\n const numMatch = d.match(DIFF_NUMERIC_EXTRACT_REGEX);\n if (!numMatch) {\n return false;\n }\n const num = Number.parseFloat(numMatch[1]);\n return num >= 1 && num <= 100;\n });\n };\n\n const isValueError = (\n errorType: string | undefined,\n diff: string[]\n ): boolean => {\n return (\n !!errorType?.includes(\"value_error\") ||\n diff.some((d) => d.startsWith(\"@@ param\"))\n );\n };\n\n const isFunctionNameError = (\n errorType: string | undefined,\n diff: string[]\n ): boolean => {\n return (\n !!errorType?.includes(\"wrong_func_name\") ||\n diff.some((d) => d.includes(\"function name\"))\n );\n };\n\n const isMissingParamError = (\n errorType: string | undefined,\n diff: string[]\n ): boolean => {\n return (\n !!errorType?.includes(\"missing_required\") ||\n diff.some((d) => d.includes(\"missing required param\"))\n );\n };\n\n const isUnexpectedParamError = (\n errorType: string | undefined,\n diff: string[]\n ): boolean => {\n return (\n !!errorType?.includes(\"unexpected_param\") ||\n diff.some((d) => d.includes(\"unexpected param\"))\n );\n };\n\n type FailureClassifier = (\n errorType: string | undefined,\n diff: string[]\n ) => boolean;\n\n const classifyByErrorPatterns = (\n errorType: string | undefined,\n diff: string[]\n ): string | null => {\n const patterns: [FailureClassifier, string][] = [\n [\n isValueError,\n hasPercentPattern(diff)\n ? \"PARAM_VALUE_PERCENT\"\n : \"PARAM_VALUE_MISMATCH\",\n ],\n [isFunctionNameError, \"WRONG_FUNCTION\"],\n [isMissingParamError, \"MISSING_PARAMS\"],\n [isUnexpectedParamError, \"UNEXPECTED_PARAMS\"],\n ];\n\n for (const [classifier, result] of patterns) {\n if (classifier(errorType, diff)) {\n return result;\n }\n }\n\n if (errorType?.includes(\"cannot_find_match\")) {\n return \"NO_MATCH\";\n }\n\n return null;\n };\n\n const classifyByCallCount = (\n actualCount: number,\n expectedCount: number\n ): string | null => {\n if (actualCount === 0 && expectedCount > 0) {\n return \"PARSE_FAILURE\";\n }\n if (actualCount > 0 && actualCount < expectedCount) {\n return \"PARTIAL_CALLS\";\n }\n if (actualCount > expectedCount) {\n return \"EXTRA_CALLS\";\n }\n return null;\n };\n\n const classifyFailureType = (options: {\n errorType: string | undefined;\n restoredCalls: unknown[];\n expectedCount: number;\n diff: string[];\n }): string => {\n const { errorType, restoredCalls, expectedCount, diff } = options;\n const actualCount = Array.isArray(restoredCalls)\n ? restoredCalls.length\n : 0;\n\n const countBasedResult = classifyByCallCount(\n actualCount,\n expectedCount\n );\n if (countBasedResult) {\n return countBasedResult;\n }\n\n const patternBasedResult = classifyByErrorPatterns(errorType, diff);\n if (patternBasedResult) {\n return patternBasedResult;\n }\n\n return \"OTHER\";\n };\n\n const extractRawModelText = (\n mwOriginalText: string | undefined,\n text: unknown\n ): string => {\n if (mwOriginalText && mwOriginalText.length > 0) {\n return mwOriginalText;\n }\n if (typeof text === \"string\") {\n return text;\n }\n return \"\";\n };\n\n const extractLastUserQuery = (flatMessages: Message[]): string => {\n const reversed = [...flatMessages].reverse();\n const found = reversed.find((m) => (m as Message).role === \"user\") as\n | Message\n | undefined;\n const content = found?.content ?? \"\";\n return content.length > 200 ? `${content.slice(0, 200)}...` : content;\n };\n\n const truncateText = (text: string, maxLen: number): string => {\n return text.length > maxLen ? `${text.slice(0, maxLen)}...` : text;\n };\n\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: { 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(tools, possibleAnswer, restoredCalls)\n : buildParallelDiff(tools, possibleAnswer, restoredCalls);\n\n const gtArr = (possibleAnswer as { ground_truth?: unknown[] })\n .ground_truth;\n const expectedCount = Array.isArray(gtArr) ? gtArr.length : 1;\n\n const rawModelText = extractRawModelText(mwOriginalText, text);\n const lastUserQuery = extractLastUserQuery(flatMessages);\n\n const failurePayload = {\n id: testCase.id,\n category: classifyFailureType({\n errorType: checkerResult.error_type,\n restoredCalls,\n expectedCount,\n diff,\n }),\n message: checkerResult.error,\n error_type: checkerResult.error_type,\n expected,\n actual,\n diff,\n context: {\n raw_model_text: truncateText(rawModelText, 500),\n raw_model_text_full:\n rawModelText.length > 500 ? rawModelText : undefined,\n parsed_tool_calls: mwParsedToolCalls.length\n ? mwParsedToolCalls\n : restoredCalls,\n expected_count: expectedCount,\n actual_count: Array.isArray(restoredCalls)\n ? restoredCalls.length\n : 0,\n finish_reason: finishReason,\n last_user_query: lastUserQuery,\n tool_names: tools.map((t) => t.name),\n },\n };\n\n caseLogs.push(`[DEBUG-FAIL] ${JSON.stringify(failurePayload)}`);\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 const debugSummaryRef: {\n originalText?: string;\n toolCalls?: string;\n } = {};\n const providerOptions: Record<string, JSONObject> = {\n toolCallMiddleware: {\n debugSummary: debugSummaryRef,\n },\n };\n const { toolCalls, text, finishReason } = await generateText({\n model: modelInstance,\n messages: flatMessages as unknown as ModelMessage[],\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 const possibleAnswer = possibleAnswersMap.get(testCase.id);\n if (!possibleAnswer) {\n throw new Error(`No possible answer for id: ${testCase.id}`);\n }\n\n // Enhanced debug logging: compare expected vs actual\n if (process.env.DEBUG_PARSER_OUTPUT === \"true\") {\n // Render expected output in morphXML format\n const groundTruth = possibleAnswer.ground_truth as Record<\n string,\n unknown\n >[];\n const expectedXML = groundTruth\n .map((call) => convertGroundTruthToXML(call))\n .join(\"\\n\\n\");\n\n console.log(\"\\n========== BFCL CASE DEBUG ==========\");\n console.log(`Test Case: ${testCase.id}`);\n console.log(`Expected count: ${groundTruth.length} call(s)`);\n console.log(\"\\n--- EXPECTED OUTPUT (morphXML format) ---\");\n console.log(expectedXML);\n console.log(\"\\n--- ACTUAL MODEL OUTPUT (raw, with whitespace) ---\");\n console.log(mwOriginalText || text || \"(empty)\");\n console.log(\n \"\\n--- PARSED TOOL CALLS (count: \" +\n (Array.isArray(toolCalls) ? toolCalls.length : 0) +\n \") ---\"\n );\n console.log(JSON.stringify(toolCalls, null, 2));\n console.log(\"======================================\\n\");\n }\n\n logRawToolCalls({\n toolCalls,\n finishReason,\n text,\n testCaseId: testCase.id,\n caseLogs,\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 const caseResults = resultsPerCase.map((r, i) => ({\n id: testCases[i].id,\n valid: r.valid,\n }));\n return {\n score,\n success: score > 0.95,\n metrics: {\n correct_count: correctCount,\n total_cases: testCases.length,\n accuracy: score,\n case_results: JSON.stringify(caseResults),\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 v4 Simple Function Calling\",\n \"BFCL_v4_simple.jsonl\",\n \"BFCL_v4_simple_possible_answer.jsonl\"\n);\n\nexport const bfclParallelBenchmark = createBfclBenchmark(\n \"bfcl-parallel\",\n \"BFCL v4 Parallel Function Calling\",\n \"BFCL_v4_parallel.jsonl\",\n \"BFCL_v4_parallel_possible_answer.jsonl\"\n);\n\nexport const bfclMultipleBenchmark = createBfclBenchmark(\n \"bfcl-multiple\",\n \"BFCL v4 Multiple Function Calling\",\n \"BFCL_v4_multiple.jsonl\",\n \"BFCL_v4_multiple_possible_answer.jsonl\"\n);\n\nexport const bfclParallelMultipleBenchmark = createBfclBenchmark(\n \"bfcl-parallel-multiple\",\n \"BFCL v4 Parallel & Multiple Function Calling\",\n \"BFCL_v4_parallel_multiple.jsonl\",\n \"BFCL_v4_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 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\") {\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\ninterface CheckerResult {\n valid: boolean;\n error?: string;\n error_type?: string;\n}\n\ninterface 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","/**\n * ComplexFuncBench - Complex Function Calling Benchmark\n *\n * This benchmark evaluates models on complex function calling scenarios including:\n * - Multi-step function calls in a single turn\n * - Function calling with constraints\n * - Parameter value reasoning from implicit information\n * - Long parameter values (500+ tokens)\n * - Parallel function calls\n *\n * Dataset: https://huggingface.co/datasets/THUDM/ComplexFuncBench\n * Paper: https://arxiv.org/abs/2501.10132\n */\n\nimport { promises as fs } from \"node:fs\";\nimport path from \"node:path\";\nimport type { JSONObject } from \"@ai-sdk/provider\";\nimport {\n generateText,\n jsonSchema,\n type LanguageModel,\n type ModelMessage,\n tool,\n} from \"ai\";\n\nimport type { BenchmarkResult, LanguageModelV3Benchmark } from \"../interfaces\";\nimport { resolveDataDir } from \"../utils/paths\";\n\n// Regex constants for performance\nconst LINE_SPLIT_REGEX = /\\r?\\n/;\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\ninterface Message {\n role: string;\n content: string;\n}\n\ninterface TestCase {\n id: string;\n question: 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: Record<string, unknown>[];\n}\n\ninterface ToolCall {\n toolName?: string;\n name?: string;\n args?: unknown;\n}\n\n// --- Helper Functions ---\n\n/**\n * Standardizes a string for comparison.\n */\nfunction standardizeString(input: string): string {\n if (typeof input !== \"string\") {\n return input;\n }\n return input.toLowerCase().trim();\n}\n\n/**\n * Checks if two values match with tolerance for ComplexFuncBench\n */\nfunction valuesMatch(modelValue: unknown, expectedValue: unknown): boolean {\n if (modelValue === expectedValue) {\n return true;\n }\n\n if (typeof modelValue === \"string\" && typeof expectedValue === \"string\") {\n return standardizeString(modelValue) === standardizeString(expectedValue);\n }\n\n if (typeof modelValue === \"number\" && typeof expectedValue === \"string\") {\n return (\n modelValue.toString() === expectedValue ||\n modelValue === Number(expectedValue)\n );\n }\n if (typeof modelValue === \"string\" && typeof expectedValue === \"number\") {\n return (\n modelValue === expectedValue.toString() ||\n Number(modelValue) === expectedValue\n );\n }\n\n if (\n typeof modelValue === \"object\" &&\n modelValue !== null &&\n typeof expectedValue === \"object\" &&\n expectedValue !== null\n ) {\n try {\n return JSON.stringify(modelValue) === JSON.stringify(expectedValue);\n } catch {\n return false;\n }\n }\n\n return false;\n}\n\n/**\n * Validate function name match\n */\nfunction validateFunctionName(\n modelFuncName: string | undefined,\n expectedFuncName: string\n): { valid: boolean; error?: string; error_type?: string } {\n if (modelFuncName !== expectedFuncName) {\n return {\n valid: false,\n error: `Function name mismatch: expected '${expectedFuncName}', got '${modelFuncName}'`,\n error_type: \"function_name_mismatch\",\n };\n }\n return { valid: true };\n}\n\n/**\n * Validate required parameters are present\n */\nfunction validateRequiredParams(\n requiredParams: string[],\n modelArgs: Record<string, unknown>,\n expectedArgs: Record<string, unknown>\n): { valid: boolean; error?: string; error_type?: string } {\n for (const param of requiredParams) {\n if (!(param in modelArgs) && param in expectedArgs) {\n return {\n valid: false,\n error: `Missing required parameter: '${param}'`,\n error_type: \"missing_required_param\",\n };\n }\n }\n return { valid: true };\n}\n\n/**\n * Validate parameter values match\n */\nfunction validateParamValues(\n expectedArgs: Record<string, unknown>,\n modelArgs: Record<string, unknown>,\n requiredParams: string[]\n): { valid: boolean; error?: string; error_type?: string } {\n for (const [paramName, expectedValue] of Object.entries(expectedArgs)) {\n if (!(paramName in modelArgs)) {\n if (!requiredParams.includes(paramName)) {\n continue;\n }\n return {\n valid: false,\n error: `Missing parameter: '${paramName}'`,\n error_type: \"missing_param\",\n };\n }\n\n const modelValue = modelArgs[paramName];\n if (!valuesMatch(modelValue, expectedValue)) {\n return {\n valid: false,\n error: `Parameter '${paramName}' value mismatch: expected ${JSON.stringify(expectedValue)}, got ${JSON.stringify(modelValue)}`,\n error_type: \"value_mismatch\",\n };\n }\n }\n return { valid: true };\n}\n\n/**\n * Check a single function call against expected\n */\nfunction checkFunctionCall(\n modelCall: ToolCall,\n expected: Record<string, unknown>,\n toolSpecs: ToolSpec[]\n): { valid: boolean; error?: string; error_type?: string } {\n const expectedFuncName = Object.keys(expected)[0];\n const expectedArgs = expected[expectedFuncName] as Record<string, unknown>;\n const modelFuncName = modelCall.toolName ?? modelCall.name;\n const modelArgs = (modelCall.args ?? {}) as Record<string, unknown>;\n\n const nameResult = validateFunctionName(modelFuncName, expectedFuncName);\n if (!nameResult.valid) {\n return nameResult;\n }\n\n const toolSpec = toolSpecs.find((t) => t.name === expectedFuncName);\n const requiredParams = toolSpec?.parameters?.required ?? [];\n\n const requiredResult = validateRequiredParams(\n requiredParams,\n modelArgs,\n expectedArgs\n );\n if (!requiredResult.valid) {\n return requiredResult;\n }\n\n return validateParamValues(expectedArgs, modelArgs, requiredParams);\n}\n\n/**\n * Check all function calls (parallel/single)\n */\nfunction checkAllFunctionCalls(\n modelCalls: ToolCall[],\n expectedCalls: Record<string, unknown>[],\n toolSpecs: ToolSpec[]\n): { valid: boolean; error?: string; error_type?: string } {\n if (modelCalls.length !== expectedCalls.length) {\n return {\n valid: false,\n error: `Wrong number of function calls: expected ${expectedCalls.length}, got ${modelCalls.length}`,\n error_type: \"wrong_call_count\",\n };\n }\n\n if (expectedCalls.length === 1) {\n return checkFunctionCall(modelCalls[0], expectedCalls[0], toolSpecs);\n }\n\n const matchedIndices = new Set<number>();\n for (const expected of expectedCalls) {\n let foundMatch = false;\n for (let i = 0; i < modelCalls.length; i++) {\n if (matchedIndices.has(i)) {\n continue;\n }\n\n const result = checkFunctionCall(modelCalls[i], expected, toolSpecs);\n if (result.valid) {\n matchedIndices.add(i);\n foundMatch = true;\n break;\n }\n }\n\n if (!foundMatch) {\n const expectedFuncName = Object.keys(expected)[0];\n return {\n valid: false,\n error: `Could not find matching call for function '${expectedFuncName}'`,\n error_type: \"no_matching_call\",\n };\n }\n }\n\n return { valid: true };\n}\n\n// --- Schema Fixers ---\nconst 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\nconst fixSchema = (schema: unknown): unknown => {\n if (!schema || typeof schema !== \"object\") {\n return { type: \"object\", properties: {} };\n }\n const copy = Array.isArray(schema)\n ? schema.map((v) => fixSchema(v))\n : ({ ...(schema as Record<string, unknown>) } as ToolSchemaObject);\n\n if (!Array.isArray(copy)) {\n fixSchemaType(copy);\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) {\n copy.items = fixSchema(copy.items);\n }\n }\n return copy;\n};\n\n// --- Tool Builder ---\nfunction buildTools(tools: ToolSpec[]) {\n const nameMap = new Map<string, string>();\n const transformedTools: TransformedTool[] = tools.map((t) => {\n const fixed = fixSchema(t.parameters) as ToolSchemaObject;\n const inputSchema =\n fixed &&\n typeof fixed === \"object\" &&\n (fixed as ToolSchemaObject).type === \"object\"\n ? (fixed as ToolSchemaObject)\n : { type: \"object\", properties: {} };\n\n const sanitized =\n t.name.replace(/[^a-zA-Z0-9_-]/g, \"_\").slice(0, 64) || \"tool\";\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\n const toolsMap = Object.fromEntries(\n transformedTools.map((t) => [\n t.name,\n tool({\n description:\n typeof t.description === \"string\" ? t.description : undefined,\n inputSchema: jsonSchema(t.inputSchema as Record<string, unknown>),\n }),\n ])\n );\n\n return { nameMap, toolsMap };\n}\n\n// --- Concurrency Mapper ---\nasync function mapWithConcurrency<T, R>(\n items: T[],\n concurrencyLimit: number,\n mapper: (item: T) => 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]);\n }\n });\n await Promise.all(workers);\n return results;\n}\n\n// --- Test Case Runner ---\nasync function runSingleCase(\n testCase: TestCase,\n model: LanguageModel,\n possibleAnswersMap: Map<string, PossibleAnswer>,\n temperature: number | undefined,\n maxTokens: number | undefined\n): Promise<{ valid: boolean; logs: string[] }> {\n const caseLogs: string[] = [];\n const { function: tools, question: messages } = testCase;\n\n try {\n const { nameMap, toolsMap } = buildTools(tools);\n\n const debugSummaryRef: { originalText?: string; toolCalls?: string } = {};\n const providerOptions: Record<string, JSONObject> = {\n toolCallMiddleware: { debugSummary: debugSummaryRef },\n };\n\n const { toolCalls, finishReason } = await generateText({\n model,\n messages: messages as unknown as ModelMessage[],\n tools: toolsMap,\n toolChoice: \"auto\",\n providerOptions,\n ...(temperature !== undefined ? { temperature } : {}),\n ...(maxTokens !== undefined ? { maxOutputTokens: maxTokens } : {}),\n });\n\n const restoredCalls = (toolCalls ?? []).map((c) => {\n const rawName =\n (c as Record<string, unknown>).toolName ??\n (c as Record<string, unknown>).name;\n const originalName = nameMap.get(rawName as string) ?? rawName;\n return {\n toolName: originalName,\n name: originalName,\n args:\n (c as Record<string, unknown>).input ??\n (c as Record<string, unknown>).args ??\n {},\n };\n });\n\n caseLogs.push(\n `[DEBUG] ${testCase.id}: toolCalls=${JSON.stringify(restoredCalls)}, finishReason=${finishReason}`\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 checkerResult = checkAllFunctionCalls(\n restoredCalls as ToolCall[],\n possibleAnswer.ground_truth,\n tools as ToolSpec[]\n );\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 return { valid: false, logs: caseLogs };\n } catch (e: unknown) {\n caseLogs.push(`[ERROR] ${testCase.id}: ${(e as Error)?.message}`);\n return { valid: false, logs: caseLogs };\n }\n}\n\n// --- Data Loading ---\nasync function loadTestData(dataPath: string, testDataFile: string) {\n const testCasesJson = await fs.readFile(\n path.join(dataPath, testDataFile),\n \"utf-8\"\n );\n return testCasesJson\n .split(LINE_SPLIT_REGEX)\n .filter((line) => line.trim().length > 0)\n .map((line) => JSON.parse(line) as TestCase);\n}\n\nasync function loadAnswerData(dataPath: string, answerDataFile: string) {\n const answersJson = await fs.readFile(\n path.join(dataPath, answerDataFile),\n \"utf-8\"\n );\n const answers: PossibleAnswer[] = answersJson\n .split(LINE_SPLIT_REGEX)\n .filter((line) => line.trim().length > 0)\n .map((line) => JSON.parse(line));\n return new Map(answers.map((ans) => [ans.id, ans]));\n}\n\nfunction getConfigValues(config?: Record<string, unknown>) {\n const limitEnv = process.env.COMPLEXFUNCBENCH_LIMIT;\n const limit = limitEnv ? Number(limitEnv) : undefined;\n\n const concurrencyEnv = process.env.COMPLEXFUNCBENCH_CONCURRENCY;\n const concurrency =\n concurrencyEnv && Number.isFinite(Number(concurrencyEnv))\n ? Math.max(1, Number(concurrencyEnv))\n : 4;\n\n const temperature =\n typeof config?.temperature === \"number\" ? config.temperature : undefined;\n const maxTokens =\n typeof config?.maxTokens === \"number\" ? config.maxTokens : undefined;\n\n return { limit, concurrency, temperature, maxTokens };\n}\n\nfunction aggregateResults(\n resultsPerCase: { valid: boolean; logs: string[] }[],\n testCases: TestCase[]\n): BenchmarkResult {\n const logs: string[] = [];\n const correctCount = resultsPerCase.reduce(\n (acc, r) => acc + (r.valid ? 1 : 0),\n 0\n );\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.5,\n metrics: {\n correct_count: correctCount,\n total_cases: testCases.length,\n accuracy: score,\n },\n logs,\n };\n}\n\n// --- Benchmark Factory ---\nfunction createComplexFuncBenchBenchmark(\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\n try {\n const dataPath = resolveDataDir();\n logs.push(`[INFO] Using data dir: ${dataPath}`);\n\n let testCases = await loadTestData(dataPath, testDataFile);\n const possibleAnswersMap = await loadAnswerData(\n dataPath,\n answerDataFile\n );\n\n const { limit, concurrency, temperature, maxTokens } =\n getConfigValues(config);\n\n if (limit && Number.isFinite(limit) && limit > 0) {\n testCases = testCases.slice(0, limit);\n logs.push(`[INFO] Limiting test cases to ${limit}`);\n }\n\n logs.push(\n `[INFO] Running ${testCases.length} test cases with concurrency=${concurrency}`\n );\n\n const resultsPerCase = await mapWithConcurrency(\n testCases,\n concurrency,\n (tc) =>\n runSingleCase(tc, model, possibleAnswersMap, temperature, maxTokens)\n );\n\n const result = aggregateResults(resultsPerCase, testCases);\n result.logs = [...logs, ...(result.logs ?? [])];\n return result;\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 ---\n\n/**\n * ComplexFuncBench benchmark - tests complex function calling scenarios\n * including multi-step calls, constraints, parameter reasoning, and long parameters.\n */\nexport const complexFuncBenchBenchmark = createComplexFuncBenchBenchmark(\n \"complex-func-bench\",\n \"ComplexFuncBench - Complex Function Calling (multi-step, constraints, long params)\",\n \"ComplexFuncBench.jsonl\",\n \"ComplexFuncBench_possible_answer.jsonl\"\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\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 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\ninterface 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\ninterface ValidationResult {\n valid: boolean;\n valuesOk: boolean;\n parsed: Json;\n}\n\ninterface 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\ninterface 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\ninterface 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 { LanguageModelV3Middleware } from \"@ai-sdk/provider\";\nimport { createDiskCacheMiddleware } from \"@ai-sdk-tool/middleware\";\nimport { type LanguageModel, wrapLanguageModel } from \"ai\";\nimport type {\n EvaluateOptions,\n EvaluationResult,\n LanguageModelV3Benchmark,\n ModelConfig,\n ReporterType,\n} from \"./interfaces\";\nimport { reporters } from \"./reporters\";\n\ntype ModelEntry = [\n string | undefined,\n LanguageModel,\n LanguageModelV3Middleware | LanguageModelV3Middleware[] | undefined,\n];\n\nfunction isModelConfig(value: unknown): value is ModelConfig {\n if (typeof value !== \"object\" || value === null) {\n return false;\n }\n const obj = value as Record<string, unknown>;\n if (!(\"model\" in obj)) {\n return false;\n }\n const model = obj.model;\n if (typeof model !== \"object\" || model === null) {\n return false;\n }\n return \"modelId\" in (model as Record<string, unknown>);\n}\n\nfunction isLanguageModel(value: unknown): value is LanguageModel {\n if (typeof value !== \"object\" || value === null) {\n return false;\n }\n const obj = value as Record<string, unknown>;\n return \"modelId\" in obj && typeof obj.modelId === \"string\";\n}\n\nfunction extractModelAndMiddleware(\n input: LanguageModel | ModelConfig\n): [\n LanguageModel,\n LanguageModelV3Middleware | LanguageModelV3Middleware[] | undefined,\n] {\n if (isModelConfig(input)) {\n return [input.model, input.middleware];\n }\n return [input, undefined];\n}\n\nfunction normalizeModels(models: EvaluateOptions[\"models\"]): ModelEntry[] {\n const entries: ModelEntry[] = [];\n\n if (Array.isArray(models)) {\n for (const m of models) {\n const [model, middleware] = extractModelAndMiddleware(m);\n entries.push([undefined, model, middleware]);\n }\n } else if (isModelConfig(models)) {\n entries.push([undefined, models.model, models.middleware]);\n } else if (isLanguageModel(models)) {\n entries.push([undefined, models, undefined]);\n } else {\n for (const [key, m] of Object.entries(models)) {\n const [model, middleware] = extractModelAndMiddleware(m);\n entries.push([key, model, middleware]);\n }\n }\n\n return entries;\n}\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\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\nfunction buildEffectiveModel(\n baseModel: LanguageModel,\n userMiddleware:\n | LanguageModelV3Middleware\n | LanguageModelV3Middleware[]\n | undefined,\n cacheOptions: EvaluateOptions[\"cache\"]\n): LanguageModel {\n const cacheEnabled = cacheOptions?.enabled === true;\n\n if (!(cacheEnabled || userMiddleware)) {\n return baseModel;\n }\n\n const cacheMiddleware = cacheEnabled\n ? createDiskCacheMiddleware({\n cacheDir: cacheOptions.cacheDir ?? \".ai-cache\",\n enabled: true,\n debug: cacheOptions.debug ?? false,\n })\n : null;\n\n const middlewares: LanguageModelV3Middleware[] = [];\n\n // Order: userMiddleware first (outermost), cache last (innermost)\n // This ensures cache sees transformed params for correct cache key generation\n // Applied as: userMiddleware(cacheMiddleware(model))\n if (userMiddleware) {\n if (Array.isArray(userMiddleware)) {\n middlewares.push(...userMiddleware);\n } else {\n middlewares.push(userMiddleware);\n }\n }\n\n if (cacheMiddleware) {\n middlewares.push(cacheMiddleware);\n }\n\n if (middlewares.length === 0) {\n return baseModel;\n }\n\n return wrapLanguageModel({\n // biome-ignore lint/suspicious/noExplicitAny: AI SDK v5/v6 type mismatch\n model: baseModel as any,\n middleware: middlewares.length === 1 ? middlewares[0] : middlewares,\n });\n}\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 const prefix = `[${modelId}]${modelKey ? ` (${modelKey})` : \"\"} ${benchmark.name}`;\n\n try {\n process.stdout.write(`${prefix}: ...`);\n const result = await benchmark.run(model, config);\n const scoreDisplay = result.score.toFixed(2);\n process.stdout.write(`\\r${prefix}: .... Score: ${scoreDisplay}\\n`);\n return {\n model: modelId,\n modelKey,\n benchmark: benchmark.name,\n result,\n };\n } catch (error) {\n process.stdout.write(`\\r${prefix}: .... Score: ERROR\\n`);\n console.error(error);\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 cache,\n } = options;\n\n const modelEntries = normalizeModels(models);\n const config = buildConfig(temperature, maxTokens);\n const allResults: EvaluationResult[] = [];\n\n for (const [modelKey, baseModel, userMiddleware] of modelEntries) {\n const effectiveModel = buildEffectiveModel(\n baseModel,\n userMiddleware,\n cache\n );\n\n for (const benchmark of benchmarks) {\n const evaluationResult = await runSingleBenchmark(\n effectiveModel,\n benchmark,\n modelKey,\n config\n );\n allResults.push(evaluationResult);\n }\n }\n\n executeReporter(reporter, allResults);\n return allResults;\n}\n","import type { EvaluationResult } from \"../interfaces\";\n\nconst colors = {\n reset: \"\\x1b[0m\",\n bold: \"\\x1b[1m\",\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 white: \"\\x1b[37m\",\n};\n\nconst DEBUG_FAIL_REGEX = /^\\[DEBUG-FAIL\\] /;\n\ninterface ParsedFailure {\n id: string;\n category?: string;\n message?: string;\n error_type?: string;\n expected?: Record<string, unknown>;\n actual?: Record<string, unknown>;\n diff?: string[];\n context?: {\n raw_model_text?: string;\n expected_count?: number;\n actual_count?: number;\n };\n}\n\nfunction formatDiff(diff: string[]): string {\n if (!diff || diff.length === 0) {\n return \"\";\n }\n\n return diff\n .slice(0, 8)\n .map((line) => {\n if (line.startsWith(\"-\")) {\n return `${colors.red}${line}${colors.reset}`;\n }\n if (line.startsWith(\"+\")) {\n return `${colors.green}${line}${colors.reset}`;\n }\n if (line.startsWith(\"@@\")) {\n return `${colors.cyan}${line}${colors.reset}`;\n }\n return line;\n })\n .join(\"\\n \");\n}\n\nfunction parseFailures(logs: string[]): ParsedFailure[] {\n const failures: ParsedFailure[] = [];\n\n for (const log of logs) {\n if (!DEBUG_FAIL_REGEX.test(log)) {\n continue;\n }\n\n try {\n const jsonStr = log.replace(DEBUG_FAIL_REGEX, \"\");\n const parsed = JSON.parse(jsonStr) as ParsedFailure;\n failures.push(parsed);\n } catch {\n // Malformed JSON, skip\n }\n }\n\n return failures;\n}\n\nfunction groupFailuresByCategory(\n failures: ParsedFailure[]\n): Map<string, ParsedFailure[]> {\n const groups = new Map<string, ParsedFailure[]>();\n\n for (const failure of failures) {\n const category = failure.category || \"OTHER\";\n const existing = groups.get(category);\n\n if (existing) {\n existing.push(failure);\n } else {\n groups.set(category, [failure]);\n }\n }\n\n return groups;\n}\n\nfunction printCompactFailure(failure: ParsedFailure): void {\n console.log(\n `\\n ${colors.red}${failure.id}${colors.reset} [${colors.yellow}${failure.category || \"OTHER\"}${colors.reset}]`\n );\n\n if (failure.message) {\n console.log(` ${failure.message}`);\n }\n\n if (failure.diff && failure.diff.length > 0) {\n console.log(` ${formatDiff(failure.diff)}`);\n }\n\n if (failure.context?.raw_model_text && failure.category === \"PARSE_FAILURE\") {\n const text = failure.context.raw_model_text;\n const truncated = text.length > 80 ? `${text.slice(0, 80)}...` : text;\n console.log(` ${colors.gray}Model: \"${truncated}\"${colors.reset}`);\n }\n}\n\nfunction printFailureSummary(failures: ParsedFailure[]): void {\n const groups = groupFailuresByCategory(failures);\n const sorted = [...groups.entries()].sort(\n (a, b) => b[1].length - a[1].length\n );\n\n console.log(`\\n ${colors.bold}Failures by category:${colors.reset}`);\n\n for (const [category, categoryFailures] of sorted) {\n console.log(\n ` ${colors.yellow}${category}${colors.reset}: ${categoryFailures.length}`\n );\n }\n\n const maxToShow = 5;\n const shown = failures.slice(0, maxToShow);\n\n for (const failure of shown) {\n printCompactFailure(failure);\n }\n\n if (failures.length > maxToShow) {\n const remaining = failures.length - maxToShow;\n const remainingIds = failures.slice(maxToShow).map((f) => f.id);\n const idPreview = remainingIds.slice(0, 5).join(\", \");\n const more = remainingIds.length > 5 ? \"...\" : \"\";\n console.log(\n `\\n ${colors.gray}+${remaining} more: ${idPreview}${more}${colors.reset}`\n );\n }\n}\n\nfunction printResult(result: EvaluationResult): void {\n const { model, modelKey, benchmark, result: benchmarkResult } = result;\n\n const passed = benchmarkResult.metrics.correct_count as number | undefined;\n const total = benchmarkResult.metrics.total_cases as number | undefined;\n const scorePercent = (benchmarkResult.score * 100).toFixed(1);\n\n const statusIcon = benchmarkResult.success ? \"✔\" : \"✖\";\n const statusColor = benchmarkResult.success ? colors.green : colors.red;\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 ` └ ${statusColor}${statusIcon} ${scorePercent}%${colors.reset} (${passed ?? \"?\"}/${total ?? \"?\"} passed)`\n );\n\n if (benchmarkResult.error) {\n console.log(\n ` ${colors.red}Error: ${benchmarkResult.error.message}${colors.reset}`\n );\n }\n\n if (!benchmarkResult.success && benchmarkResult.logs) {\n const failures = parseFailures(benchmarkResult.logs);\n\n if (failures.length > 0) {\n printFailureSummary(failures);\n } else if (benchmarkResult.logs.length > 0) {\n console.log(` ${colors.gray}Raw Logs (Sample):${colors.reset}`);\n for (const l of benchmarkResult.logs.slice(0, 5)) {\n console.log(` ${l}`);\n }\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\nconst colors = {\n reset: \"\\x1b[0m\",\n bold: \"\\x1b[1m\",\n dim: \"\\x1b[2m\",\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 white: \"\\x1b[37m\",\n};\n\nconst DEBUG_FAIL_REGEX = /^\\[DEBUG-FAIL\\] /;\nconst ID_NUM_REGEX = /_(\\d+)$/;\nconst REASONING_TAG = \"think\";\nconst MAX_FAILURES_TO_DISPLAY = 5;\n\ninterface FailureContext {\n raw_model_text?: string;\n raw_model_text_full?: string;\n reasoning?: string;\n parsed_tool_calls?: unknown[];\n expected_count?: number;\n actual_count?: number;\n finish_reason?: unknown;\n last_user_query?: string;\n tool_names?: string[];\n}\n\ninterface ParsedFailure {\n id: string;\n category: string;\n message?: string;\n error_type?: string;\n expected?: Record<string, unknown>;\n actual?: Record<string, unknown>;\n diff?: string[];\n context?: FailureContext;\n}\n\ninterface CategoryGroup {\n failures: ParsedFailure[];\n pattern?: string;\n}\n\ninterface CategoryInfo {\n label: string;\n description: string;\n hint?: string;\n}\n\nconst CATEGORY_DESCRIPTIONS: Record<string, CategoryInfo> = {\n PARSE_FAILURE: {\n label: \"Parse Failure\",\n description: \"No tool calls extracted from model output\",\n hint: \"Model may have responded in text instead of tool format\",\n },\n PARTIAL_CALLS: {\n label: \"Partial Calls\",\n description: \"Some expected tool calls missing\",\n hint: \"Model stopped early or missed some tools\",\n },\n EXTRA_CALLS: {\n label: \"Extra Calls\",\n description: \"More tool calls than expected\",\n hint: \"Model called tools that weren't needed\",\n },\n PARAM_VALUE_PERCENT: {\n label: \"Param Value (Percent)\",\n description: \"Percentage sent as integer instead of decimal\",\n hint: \"e.g., 5 instead of 0.05 for 5%\",\n },\n PARAM_VALUE_MISMATCH: {\n label: \"Param Value Mismatch\",\n description: \"Parameter values don't match expected\",\n },\n WRONG_FUNCTION: {\n label: \"Wrong Function\",\n description: \"Called wrong function name\",\n },\n MISSING_PARAMS: {\n label: \"Missing Params\",\n description: \"Required parameters not provided\",\n },\n UNEXPECTED_PARAMS: {\n label: \"Unexpected Params\",\n description: \"Extra parameters that shouldn't be there\",\n },\n NO_MATCH: {\n label: \"No Match\",\n description: \"Function called but couldn't match to expected\",\n hint: \"Parameters may be correct but don't match any expected combination\",\n },\n OTHER: {\n label: \"Other\",\n description: \"Uncategorized failure\",\n },\n};\n\nfunction parseFailureLogs(logs: string[]): ParsedFailure[] {\n return logs\n .filter((log) => DEBUG_FAIL_REGEX.test(log))\n .map((log) => {\n try {\n const jsonStr = log.replace(DEBUG_FAIL_REGEX, \"\");\n return JSON.parse(jsonStr) as ParsedFailure;\n } catch {\n return null;\n }\n })\n .filter((parsed): parsed is ParsedFailure => parsed !== null);\n}\n\nfunction groupByCategory(\n failures: ParsedFailure[]\n): Map<string, CategoryGroup> {\n const groups = new Map<string, CategoryGroup>();\n\n for (const failure of failures) {\n const category = failure.category || \"OTHER\";\n const existing = groups.get(category);\n\n if (existing) {\n existing.failures.push(failure);\n } else {\n groups.set(category, { failures: [failure] });\n }\n }\n\n return groups;\n}\n\nfunction extractParamNames(failures: ParsedFailure[]): Set<string> {\n const paramNames = new Set<string>();\n for (const f of failures) {\n if (!f.diff) {\n continue;\n }\n for (const d of f.diff) {\n if (d.startsWith(\"@@ param \")) {\n paramNames.add(d.replace(\"@@ param \", \"\"));\n }\n }\n }\n return paramNames;\n}\n\nfunction extractFinishReasons(failures: ParsedFailure[]): Set<string> {\n const finishReasons = new Set<string>();\n for (const f of failures) {\n if (f.context?.finish_reason) {\n finishReasons.add(String(f.context.finish_reason));\n }\n }\n return finishReasons;\n}\n\nfunction detectPatterns(group: CategoryGroup): void {\n const { failures } = group;\n\n if (failures.length < 2) {\n return;\n }\n\n const firstCategory = failures[0].category;\n\n if (firstCategory === \"PARAM_VALUE_PERCENT\") {\n const paramNames = extractParamNames(failures);\n if (paramNames.size > 0) {\n group.pattern = `Affected params: ${[...paramNames].join(\", \")}`;\n }\n }\n\n if (firstCategory === \"PARSE_FAILURE\") {\n const finishReasons = extractFinishReasons(failures);\n if (finishReasons.size === 1) {\n group.pattern = `All finished with: ${[...finishReasons][0]}`;\n }\n }\n}\n\nfunction getLineColor(line: string): string {\n if (line.startsWith(\"+\")) {\n return colors.green;\n }\n if (line.startsWith(\"-\")) {\n return colors.red;\n }\n if (line.startsWith(\"@@\")) {\n return colors.cyan;\n }\n return colors.white;\n}\n\nfunction formatFunctions(funcs: unknown): string {\n if (Array.isArray(funcs)) {\n return funcs.join(\", \");\n }\n return String(funcs);\n}\n\nfunction printExpectedActual(failure: ParsedFailure): void {\n if (failure.expected) {\n const expFuncs = failure.expected.functions || failure.expected.function;\n if (expFuncs) {\n console.log(\n ` ${colors.gray}Expected:${colors.reset} ${formatFunctions(expFuncs)}`\n );\n }\n }\n\n if (failure.actual) {\n const actFuncs = failure.actual.functions || failure.actual.function;\n if (actFuncs) {\n const isEmpty = Array.isArray(actFuncs) && actFuncs.length === 0;\n const color = isEmpty ? colors.red : colors.white;\n const text = isEmpty ? \"(none)\" : formatFunctions(actFuncs);\n console.log(\n ` ${colors.gray}Actual:${colors.reset} ${color}${text}${colors.reset}`\n );\n }\n }\n}\n\nfunction printDiff(diff: string[]): void {\n console.log(` ${colors.gray}Diff:${colors.reset}`);\n for (const line of diff.slice(0, MAX_FAILURES_TO_DISPLAY)) {\n const lineColor = getLineColor(line);\n console.log(` ${lineColor}${line}${colors.reset}`);\n }\n}\n\nfunction removeReasoningTags(text: string): string {\n const openTag = `<${REASONING_TAG}>`;\n const closeTag = `</${REASONING_TAG}>`;\n const closedTagPattern = new RegExp(\n `${openTag.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\")}[\\\\s\\\\S]*?${closeTag.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\")}`,\n \"g\"\n );\n const unclosedTagPattern = new RegExp(\n `${openTag.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\")}[\\\\s\\\\S]*`,\n \"g\"\n );\n let result = text.replace(closedTagPattern, \"\");\n result = result.replace(unclosedTagPattern, \"\");\n return result.trim();\n}\n\nfunction printModelOutput(failure: ParsedFailure, category: string): void {\n if (category !== \"PARSE_FAILURE\") {\n return;\n }\n\n const rawText =\n failure.context?.raw_model_text_full ||\n failure.context?.raw_model_text ||\n \"\";\n const cleanedText = removeReasoningTags(rawText);\n\n if (cleanedText) {\n console.log(\n ` ${colors.gray}Model said:${colors.reset} \"${colors.dim}${cleanedText}${colors.reset}\"`\n );\n } else {\n console.log(\n ` ${colors.gray}Model said:${colors.reset} ${colors.dim}(only reasoning, no tool call output)${colors.reset}`\n );\n }\n}\n\nfunction shouldShowDiffByDefault(category: string): boolean {\n return (\n category === \"PARAM_VALUE_MISMATCH\" || category === \"PARAM_VALUE_PERCENT\"\n );\n}\n\nfunction printSingleFailure(\n failure: ParsedFailure,\n category: string,\n verbose: boolean\n): void {\n console.log(`\\n ${colors.bold}${failure.id}${colors.reset}`);\n\n const hasDiff = failure.diff && failure.diff.length > 0;\n const showDiffPrimarily = shouldShowDiffByDefault(category) && hasDiff;\n\n if (showDiffPrimarily) {\n printDiff(failure.diff as string[]);\n } else {\n printExpectedActual(failure);\n if (hasDiff && verbose) {\n printDiff(failure.diff as string[]);\n }\n }\n\n printModelOutput(failure, category);\n}\n\nconst MAX_SAMPLE_FAILURES = 2;\n\nfunction printRemainingIds(failures: ParsedFailure[]): void {\n const remainingIds = failures.slice(MAX_SAMPLE_FAILURES).map((f) => f.id);\n const idNums = remainingIds.map((id) => {\n const match = id.match(ID_NUM_REGEX);\n return match ? match[1] : id;\n });\n console.log(\n `\\n ${colors.dim}+${failures.length - MAX_SAMPLE_FAILURES} more: ${idNums.join(\", \")}${colors.reset}`\n );\n}\n\nfunction printCategoryHeader(info: CategoryInfo, count: number): void {\n console.log(\n `\\n${colors.cyan}───── ${info.label} (${count}) ─────${colors.reset}`\n );\n console.log(`${colors.dim}${info.description}${colors.reset}`);\n}\n\nfunction printCategoryDetails(\n category: string,\n group: CategoryGroup,\n verbose: boolean\n): void {\n const info = CATEGORY_DESCRIPTIONS[category] || CATEGORY_DESCRIPTIONS.OTHER;\n const { failures } = group;\n\n printCategoryHeader(info, failures.length);\n\n if (group.pattern) {\n console.log(`${colors.yellow}Pattern: ${group.pattern}${colors.reset}`);\n }\n\n if (info.hint) {\n console.log(`${colors.magenta}Hint: ${info.hint}${colors.reset}`);\n }\n\n const samplesToShow = verbose ? failures : failures.slice(0, 2);\n\n for (const failure of samplesToShow) {\n printSingleFailure(failure, category, verbose);\n }\n\n if (!verbose && failures.length > 2) {\n printRemainingIds(failures);\n }\n}\n\nfunction printResultHeader(result: EvaluationResult): void {\n const { model, modelKey, benchmark, result: benchmarkResult } = result;\n\n const passed = benchmarkResult.metrics.correct_count as number | undefined;\n const total = benchmarkResult.metrics.total_cases as number | undefined;\n const scorePercent = (benchmarkResult.score * 100).toFixed(1);\n\n const statusIcon = benchmarkResult.success ? \"✔\" : \"✖\";\n const statusColor = benchmarkResult.success ? colors.green : colors.red;\n\n const modelPart = `${colors.cyan}${model}${colors.reset}${modelKey ? ` ${colors.dim}(${modelKey})${colors.reset}` : \"\"}`;\n const benchmarkPart = `${colors.magenta}${benchmark}${colors.reset}`;\n const scorePart = `${statusColor}${statusIcon} ${scorePercent}%${colors.reset} (${passed ?? \"?\"}/${total ?? \"?\"} passed)`;\n\n console.log(\n `\\n${colors.bold}━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━${colors.reset}`\n );\n console.log(`${modelPart} │ ${benchmarkPart} │ ${scorePart}`);\n}\n\nfunction printResultSummary(result: EvaluationResult, verbose: boolean): void {\n const { result: benchmarkResult } = result;\n\n printResultHeader(result);\n\n if (!benchmarkResult.logs || benchmarkResult.logs.length === 0) {\n return;\n }\n\n const failures = parseFailureLogs(benchmarkResult.logs);\n\n if (failures.length === 0) {\n if (!benchmarkResult.success) {\n console.log(\n `${colors.yellow}No structured failure data available${colors.reset}`\n );\n }\n return;\n }\n\n const groups = groupByCategory(failures);\n\n for (const group of groups.values()) {\n detectPatterns(group);\n }\n\n const sortedCategories = [...groups.entries()].sort(\n (a, b) => b[1].failures.length - a[1].failures.length\n );\n\n for (const [cat, group] of sortedCategories) {\n printCategoryDetails(cat, group, verbose);\n }\n}\n\nexport function consoleSummaryReporter(results: EvaluationResult[]): void {\n const verbose = process.env.VERBOSE === \"true\";\n\n console.log(`\\n${colors.bold}Evaluation Report (Summary)${colors.reset}`);\n console.log(`${colors.dim}Use VERBOSE=true for full details${colors.reset}`);\n\n for (const result of results) {\n printResultSummary(result, verbose);\n }\n\n console.log(\n `\\n${colors.bold}━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━${colors.reset}\\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 { consoleSummaryReporter } from \"./console.summary\";\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 \"console.summary\": consoleSummaryReporter,\n};\n"],"mappings":"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","names":["import_node_fs","import_node_path","path","fs","require","fs","path","fixSchemaType","fixSchema","_a","runSingleCase","mapWithConcurrency","import_node_fs","import_node_path","import_ai","LINE_SPLIT_REGEX","standardizeString","valuesMatch","fs","path","import_node_fs","import_node_path","import_ai","LINE_SPLIT_REGEX","fs","path","Ajv","import_ai","colors","colors","DEBUG_FAIL_REGEX"]}
|
|
1
|
+
{"version":3,"sources":["../src/index.ts","../src/benchmarks/bfcl.ts","../src/utils/paths.ts","../src/benchmarks/bfcl/ast-checker.ts","../src/benchmarks/bfcl-multi-turn.ts","../src/multi-turn/classes/gorilla-file-system.ts","../src/multi-turn/classes/math-api.ts","../src/multi-turn/classes/message-api.ts","../src/multi-turn/classes/ticket-api.ts","../src/multi-turn/classes/trading-bot.ts","../src/multi-turn/classes/travel-api.ts","../src/multi-turn/classes/twitter-api.ts","../src/multi-turn/classes/vehicle-control-api.ts","../src/multi-turn/constants.ts","../src/multi-turn/method-registry.ts","../src/multi-turn/safe-executor.ts","../src/multi-turn/execution-engine.ts","../src/multi-turn/response-checker.ts","../src/multi-turn/state-checker.ts","../src/multi-turn/checker.ts","../src/benchmarks/complex-func-bench.ts","../src/benchmarks/json-generation.ts","../src/evaluate.ts","../src/reporters/console.ts","../src/reporters/console.debug.ts","../src/reporters/console.summary.ts","../src/reporters/json.ts","../src/reporters/index.ts"],"sourcesContent":["// biome-ignore lint/performance/noBarrelFile: Package entrypoint - must re-export for public API\nexport {\n bfclMultipleBenchmark,\n bfclParallelBenchmark,\n bfclParallelMultipleBenchmark,\n bfclSimpleBenchmark,\n} from \"./benchmarks/bfcl\";\nexport {\n bfclMultiTurnBaseBenchmark,\n bfclMultiTurnLongContextBenchmark,\n bfclMultiTurnMissFuncBenchmark,\n bfclMultiTurnMissParamBenchmark,\n} from \"./benchmarks/bfcl-multi-turn\";\nexport { complexFuncBenchBenchmark } from \"./benchmarks/complex-func-bench\";\nexport {\n jsonGenerationBenchmark,\n jsonGenerationSchemaOnlyBenchmark,\n} from \"./benchmarks/json-generation\";\nexport { evaluate } from \"./evaluate\";\n// Core interfaces for custom benchmarks\nexport type {\n BenchmarkResult,\n EvaluateOptions,\n LanguageModelV3Benchmark,\n ModelConfig,\n ReporterType,\n} from \"./interfaces\";\nexport { executeMultiTurnFuncCall } from \"./multi-turn\";\n","import { promises as fs } from \"node:fs\";\nimport path from \"node:path\";\nimport type { JSONObject } from \"@ai-sdk/provider\";\nimport {\n generateText,\n jsonSchema,\n type LanguageModel,\n type ModelMessage,\n tool,\n} from \"ai\";\n\nimport type { BenchmarkResult, LanguageModelV3Benchmark } from \"../interfaces\";\nimport { resolveDataDir } from \"../utils/paths\";\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+$/;\nconst DIFF_NUMERIC_EXTRACT_REGEX = /:\\s*([\\d.]+)/;\n\n// Helper function to convert ground truth to morphXML format\nfunction convertGroundTruthToXML(call: Record<string, unknown>): string {\n const keys = Object.keys(call);\n if (keys.length === 0) {\n return \"<empty_call />\";\n }\n const funcName = keys[0];\n if (!funcName) {\n return \"<undefined_function />\";\n }\n const params = call[funcName] as Record<string, unknown>;\n if (!params || typeof params !== \"object\") {\n return `<${funcName} />`;\n }\n let xml = `<${funcName}>\\n`;\n for (const [key, value] of Object.entries(params)) {\n // Value is typically an array [value, ...alternatives]\n const displayValue = Array.isArray(value) ? value[0] : value;\n let valueStr: string;\n if (typeof displayValue === \"string\") {\n valueStr = displayValue;\n } else if (displayValue === null || displayValue === undefined) {\n valueStr = \"\";\n } else {\n valueStr = JSON.stringify(displayValue);\n }\n xml += ` <${key}>${valueStr}</${key}>\\n`;\n }\n xml += `</${funcName}>`;\n return xml;\n}\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\ninterface Message {\n role: string;\n content: string;\n}\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 extractCategory(id: string): string {\n if (id.startsWith(\"parallel_multiple\")) {\n return \"parallel_multiple\";\n }\n if (id.startsWith(\"simple_python\")) {\n return \"simple\";\n }\n if (id.startsWith(\"simple_java\")) {\n return \"simple\";\n }\n if (id.startsWith(\"simple_javascript\")) {\n return \"simple\";\n }\n if (id.startsWith(\"parallel\")) {\n return \"parallel\";\n }\n if (id.startsWith(\"multiple\")) {\n return \"multiple\";\n }\n if (id.startsWith(\"simple\")) {\n return \"simple\";\n }\n return id.split(\"_\")[0];\n}\n\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 = extractCategory(testCase.id);\n\n try {\n switch (category) {\n case \"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 case \"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 case \"parallel\":\n case \"parallel_multiple\": {\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 default: {\n return { valid: true };\n }\n }\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 16)\n const concurrencyEnv = process.env.BFCL_CONCURRENCY;\n const concurrency =\n concurrencyEnv && Number.isFinite(Number(concurrencyEnv))\n ? Math.max(1, Number(concurrencyEnv))\n : 16;\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 const hasPercentPattern = (diff: string[]): boolean => {\n return diff.some((d) => {\n if (!(d.startsWith(\"+ got:\") || d.startsWith(\"- expected:\"))) {\n return false;\n }\n const numMatch = d.match(DIFF_NUMERIC_EXTRACT_REGEX);\n if (!numMatch) {\n return false;\n }\n const num = Number.parseFloat(numMatch[1]);\n return num >= 1 && num <= 100;\n });\n };\n\n const isValueError = (\n errorType: string | undefined,\n diff: string[]\n ): boolean => {\n return (\n !!errorType?.includes(\"value_error\") ||\n diff.some((d) => d.startsWith(\"@@ param\"))\n );\n };\n\n const isFunctionNameError = (\n errorType: string | undefined,\n diff: string[]\n ): boolean => {\n return (\n !!errorType?.includes(\"wrong_func_name\") ||\n diff.some((d) => d.includes(\"function name\"))\n );\n };\n\n const isMissingParamError = (\n errorType: string | undefined,\n diff: string[]\n ): boolean => {\n return (\n !!errorType?.includes(\"missing_required\") ||\n diff.some((d) => d.includes(\"missing required param\"))\n );\n };\n\n const isUnexpectedParamError = (\n errorType: string | undefined,\n diff: string[]\n ): boolean => {\n return (\n !!errorType?.includes(\"unexpected_param\") ||\n diff.some((d) => d.includes(\"unexpected param\"))\n );\n };\n\n type FailureClassifier = (\n errorType: string | undefined,\n diff: string[]\n ) => boolean;\n\n const classifyByErrorPatterns = (\n errorType: string | undefined,\n diff: string[]\n ): string | null => {\n const patterns: [FailureClassifier, string][] = [\n [\n isValueError,\n hasPercentPattern(diff)\n ? \"PARAM_VALUE_PERCENT\"\n : \"PARAM_VALUE_MISMATCH\",\n ],\n [isFunctionNameError, \"WRONG_FUNCTION\"],\n [isMissingParamError, \"MISSING_PARAMS\"],\n [isUnexpectedParamError, \"UNEXPECTED_PARAMS\"],\n ];\n\n for (const [classifier, result] of patterns) {\n if (classifier(errorType, diff)) {\n return result;\n }\n }\n\n if (errorType?.includes(\"cannot_find_match\")) {\n return \"NO_MATCH\";\n }\n\n return null;\n };\n\n const classifyByCallCount = (\n actualCount: number,\n expectedCount: number\n ): string | null => {\n if (actualCount === 0 && expectedCount > 0) {\n return \"PARSE_FAILURE\";\n }\n if (actualCount > 0 && actualCount < expectedCount) {\n return \"PARTIAL_CALLS\";\n }\n if (actualCount > expectedCount) {\n return \"EXTRA_CALLS\";\n }\n return null;\n };\n\n const classifyFailureType = (options: {\n errorType: string | undefined;\n restoredCalls: unknown[];\n expectedCount: number;\n diff: string[];\n }): string => {\n const { errorType, restoredCalls, expectedCount, diff } = options;\n const actualCount = Array.isArray(restoredCalls)\n ? restoredCalls.length\n : 0;\n\n const countBasedResult = classifyByCallCount(\n actualCount,\n expectedCount\n );\n if (countBasedResult) {\n return countBasedResult;\n }\n\n const patternBasedResult = classifyByErrorPatterns(errorType, diff);\n if (patternBasedResult) {\n return patternBasedResult;\n }\n\n return \"OTHER\";\n };\n\n const extractRawModelText = (\n mwOriginalText: string | undefined,\n text: unknown\n ): string => {\n if (mwOriginalText && mwOriginalText.length > 0) {\n return mwOriginalText;\n }\n if (typeof text === \"string\") {\n return text;\n }\n return \"\";\n };\n\n const extractLastUserQuery = (flatMessages: Message[]): string => {\n const reversed = [...flatMessages].reverse();\n const found = reversed.find((m) => (m as Message).role === \"user\") as\n | Message\n | undefined;\n const content = found?.content ?? \"\";\n return content.length > 200 ? `${content.slice(0, 200)}...` : content;\n };\n\n const truncateText = (text: string, maxLen: number): string => {\n return text.length > maxLen ? `${text.slice(0, maxLen)}...` : text;\n };\n\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: { 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(tools, possibleAnswer, restoredCalls)\n : buildParallelDiff(tools, possibleAnswer, restoredCalls);\n\n const gtArr = (possibleAnswer as { ground_truth?: unknown[] })\n .ground_truth;\n const expectedCount = Array.isArray(gtArr) ? gtArr.length : 1;\n\n const rawModelText = extractRawModelText(mwOriginalText, text);\n const lastUserQuery = extractLastUserQuery(flatMessages);\n\n const failurePayload = {\n id: testCase.id,\n category: classifyFailureType({\n errorType: checkerResult.error_type,\n restoredCalls,\n expectedCount,\n diff,\n }),\n message: checkerResult.error,\n error_type: checkerResult.error_type,\n expected,\n actual,\n diff,\n context: {\n raw_model_text: truncateText(rawModelText, 500),\n raw_model_text_full:\n rawModelText.length > 500 ? rawModelText : undefined,\n parsed_tool_calls: mwParsedToolCalls.length\n ? mwParsedToolCalls\n : restoredCalls,\n expected_count: expectedCount,\n actual_count: Array.isArray(restoredCalls)\n ? restoredCalls.length\n : 0,\n finish_reason: finishReason,\n last_user_query: lastUserQuery,\n tool_names: tools.map((t) => t.name),\n },\n };\n\n caseLogs.push(`[DEBUG-FAIL] ${JSON.stringify(failurePayload)}`);\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 const debugSummaryRef: {\n originalText?: string;\n toolCalls?: string;\n } = {};\n const providerOptions: Record<string, JSONObject> = {\n toolCallMiddleware: {\n debugSummary: debugSummaryRef,\n },\n };\n const { toolCalls, text, finishReason } = await generateText({\n model: modelInstance,\n messages: flatMessages as unknown as ModelMessage[],\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 const possibleAnswer = possibleAnswersMap.get(testCase.id);\n if (!possibleAnswer) {\n throw new Error(`No possible answer for id: ${testCase.id}`);\n }\n\n // Enhanced debug logging: compare expected vs actual\n if (process.env.DEBUG_PARSER_OUTPUT === \"true\") {\n // Render expected output in morphXML format\n const groundTruth = possibleAnswer.ground_truth as Record<\n string,\n unknown\n >[];\n const expectedXML = groundTruth\n .map((call) => convertGroundTruthToXML(call))\n .join(\"\\n\\n\");\n\n console.log(\"\\n========== BFCL CASE DEBUG ==========\");\n console.log(`Test Case: ${testCase.id}`);\n console.log(`Expected count: ${groundTruth.length} call(s)`);\n console.log(\"\\n--- EXPECTED OUTPUT (morphXML format) ---\");\n console.log(expectedXML);\n console.log(\"\\n--- ACTUAL MODEL OUTPUT (raw, with whitespace) ---\");\n console.log(mwOriginalText || text || \"(empty)\");\n console.log(\n \"\\n--- PARSED TOOL CALLS (count: \" +\n (Array.isArray(toolCalls) ? toolCalls.length : 0) +\n \") ---\"\n );\n console.log(JSON.stringify(toolCalls, null, 2));\n console.log(\"======================================\\n\");\n }\n\n logRawToolCalls({\n toolCalls,\n finishReason,\n text,\n testCaseId: testCase.id,\n caseLogs,\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 const caseResults = resultsPerCase.map((r, i) => ({\n id: testCases[i].id,\n valid: r.valid,\n }));\n return {\n score,\n success: score > 0.95,\n metrics: {\n correct_count: correctCount,\n total_cases: testCases.length,\n accuracy: score,\n case_results: JSON.stringify(caseResults),\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 v4 Simple Function Calling\",\n \"BFCL_v4_simple.jsonl\",\n \"BFCL_v4_simple_possible_answer.jsonl\"\n);\n\nexport const bfclParallelBenchmark = createBfclBenchmark(\n \"bfcl-parallel\",\n \"BFCL v4 Parallel Function Calling\",\n \"BFCL_v4_parallel.jsonl\",\n \"BFCL_v4_parallel_possible_answer.jsonl\"\n);\n\nexport const bfclMultipleBenchmark = createBfclBenchmark(\n \"bfcl-multiple\",\n \"BFCL v4 Multiple Function Calling\",\n \"BFCL_v4_multiple.jsonl\",\n \"BFCL_v4_multiple_possible_answer.jsonl\"\n);\n\nexport const bfclParallelMultipleBenchmark = createBfclBenchmark(\n \"bfcl-parallel-multiple\",\n \"BFCL v4 Parallel & Multiple Function Calling\",\n \"BFCL_v4_parallel_multiple.jsonl\",\n \"BFCL_v4_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 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\") {\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\ninterface CheckerResult {\n valid: boolean;\n error?: string;\n error_type?: string;\n}\n\ninterface 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 type { JSONObject } from \"@ai-sdk/provider\";\nimport {\n generateText,\n jsonSchema,\n type LanguageModel,\n type ModelMessage,\n tool,\n} from \"ai\";\n\nimport type { BenchmarkResult, LanguageModelV3Benchmark } from \"../interfaces\";\nimport {\n executeMultiTurnFuncCall,\n globalMethodRegistry,\n multiTurnChecker,\n multiTurnIrrelevanceChecker,\n resetTestInstances,\n type ToolCall,\n} from \"../multi-turn\";\nimport { resolveDataDir } from \"../utils/paths\";\n\nconst LINE_SPLIT_REGEX = /\\r?\\n/;\nconst NUMERIC_STRING_REGEX = /^\\d+$/;\nconst MAXIMUM_STEP_LIMIT = 20;\nconst DEFAULT_USER_PROMPT_FOR_ADDITIONAL_FUNCTION_FC =\n \"I have updated some more functions you can choose from. What about now?\";\n\nconst MULTI_TURN_SYSTEM_PROMPT = `You are an expert in composing functions. You are given a question and a set of possible functions. Based on the question, you will need to make one or more function/tool calls to achieve the purpose. If none of the functions can be used, point it out. If the given question lacks the parameters required by the function, also point it out.\n\nAt each turn, you should try your best to complete the tasks requested by the user within the current turn. Continue to output functions to call until you have fulfilled the user's request to the best of your ability. Once you have no more functions to call, the system will consider the current turn complete and proceed to the next turn or task.`;\n\n// Retry configuration for rate limit (429) errors\nconst RETRY_MAX_ATTEMPTS = 5;\nconst RETRY_INITIAL_DELAY_MS = 1000;\nconst RETRY_MAX_DELAY_MS = 60_000;\nconst RETRY_BACKOFF_MULTIPLIER = 2;\n\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\ninterface Message {\n role: string;\n content: string;\n}\n\ninterface MultiTurnTestCase {\n id: string;\n question: Message[] | Message[][];\n initial_config?: Record<string, unknown>;\n path?: string[];\n involved_classes?: string[];\n missed_function?: Record<string, string[]>;\n excluded_function?: string[];\n}\n\ninterface PossibleAnswer {\n id: string;\n ground_truth: string[][];\n}\n\ninterface TransformedTool {\n type: \"function\";\n name: string;\n description?: string;\n inputSchema: ToolSchemaObject;\n}\n\nconst MULTI_TURN_DATASETS = [\n {\n name: \"bfcl-multi-turn-base\",\n description: \"BFCL v4 Multi-Turn Base Function Calling\",\n testFile: \"BFCL_v4_multi_turn_base.jsonl\",\n answerFile: \"possible_answer/BFCL_v4_multi_turn_base.jsonl\",\n },\n {\n name: \"bfcl-multi-turn-long-context\",\n description: \"BFCL v4 Multi-Turn Long-Context Function Calling\",\n testFile: \"BFCL_v4_multi_turn_long_context.jsonl\",\n answerFile: \"possible_answer/BFCL_v4_multi_turn_long_context.jsonl\",\n },\n {\n name: \"bfcl-multi-turn-miss-func\",\n description: \"BFCL v4 Multi-Turn Missing Function Calling\",\n testFile: \"BFCL_v4_multi_turn_miss_func.jsonl\",\n answerFile: \"possible_answer/BFCL_v4_multi_turn_miss_func.jsonl\",\n },\n {\n name: \"bfcl-multi-turn-miss-param\",\n description: \"BFCL v4 Multi-Turn Missing Parameter Function Calling\",\n testFile: \"BFCL_v4_multi_turn_miss_param.jsonl\",\n answerFile: \"possible_answer/BFCL_v4_multi_turn_miss_param.jsonl\",\n },\n] as const;\n\nconst MULTI_TURN_DOCS: Record<string, string> = {\n GorillaFileSystem: \"multi_turn_func_doc/gorilla_file_system.jsonl\",\n MathAPI: \"multi_turn_func_doc/math_api.jsonl\",\n MessageAPI: \"multi_turn_func_doc/message_api.jsonl\",\n TwitterAPI: \"multi_turn_func_doc/posting_api.jsonl\",\n TicketAPI: \"multi_turn_func_doc/ticket_api.jsonl\",\n TradingBot: \"multi_turn_func_doc/trading_bot.jsonl\",\n TravelAPI: \"multi_turn_func_doc/travel_booking.jsonl\",\n VehicleControlAPI: \"multi_turn_func_doc/vehicle_control.jsonl\",\n};\n\nconst toolDocCache = new Map<string, ToolSpec[]>();\n\nconst normalizeTurns = (question: Message[] | Message[][]): Message[][] => {\n if (Array.isArray(question) && question.some((m) => Array.isArray(m))) {\n return question as Message[][];\n }\n return [question as Message[]];\n};\n\nconst 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\n if (Array.isArray(copy)) {\n return copy;\n }\n\n if (!copy.type) {\n copy.type = \"object\";\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 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) {\n copy.items = fixSchema(copy.items);\n }\n return copy;\n};\n\nconst 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\nconst buildTransformedTools = (\n tools: ToolSpec[]\n): { transformedTools: TransformedTool[]; nameMap: Map<string, string> } => {\n const nameMap = new Map<string, string>();\n const transformedTools = tools.map((t) => {\n const fixed = fixSchema(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\n return { transformedTools, nameMap };\n};\n\nconst 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(t.inputSchema as Record<string, unknown>),\n }),\n ])\n );\n\nconst parseToolArgs = (extractedArgs: unknown): unknown => {\n if (typeof extractedArgs !== \"string\") {\n return extractedArgs;\n }\n try {\n return JSON.parse(extractedArgs);\n } catch {\n // JSON.parse failed - might be due to unescaped control characters\n // (actual newlines/tabs instead of \\n/\\t escape sequences)\n try {\n const escaped = extractedArgs\n .replace(/\\n/g, \"\\\\n\")\n .replace(/\\r/g, \"\\\\r\")\n .replace(/\\t/g, \"\\\\t\");\n return JSON.parse(escaped);\n } catch {\n return extractedArgs;\n }\n }\n};\n\nconst getSanitizedName = (\n rawName: unknown,\n transformedTools: TransformedTool[]\n): unknown => {\n if (typeof rawName === \"string\" && NUMERIC_STRING_REGEX.test(rawName)) {\n return transformedTools[Number(rawName)]?.name ?? rawName;\n }\n return rawName;\n};\n\nconst restoreToolCalls = (\n toolCalls: unknown[],\n nameMap: Map<string, string>,\n transformedTools: TransformedTool[]\n): Array<{ toolCallId?: string; toolName: string; args: 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(rawName, transformedTools);\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 toolCallId:\n typeof call.toolCallId === \"string\" ? call.toolCallId : undefined,\n toolName: String(originalName),\n args: parsedArgs ?? {},\n };\n });\n\nconst loadToolsForClass = async (\n className: string,\n dataDir: string\n): Promise<ToolSpec[]> => {\n // Force cache refresh if BFCL_FORCE_CACHE_REFRESH is set\n const forceRefresh = process.env.BFCL_FORCE_CACHE_REFRESH === \"true\";\n if (!forceRefresh) {\n const cached = toolDocCache.get(className);\n if (cached) {\n return cached;\n }\n }\n const relPath = MULTI_TURN_DOCS[className];\n if (!relPath) {\n throw new Error(`Missing tool doc mapping for class: ${className}`);\n }\n const raw = await fs.readFile(path.join(dataDir, relPath), \"utf-8\");\n const tools = raw\n .split(LINE_SPLIT_REGEX)\n .filter((line) => line.trim().length > 0)\n .map((line) => JSON.parse(line))\n .map((entry: Record<string, unknown>) => {\n const methodName = typeof entry.name === \"string\" ? entry.name : \"tool\";\n // Use ClassName.methodName format to match Python BFCL implementation\n const fullName = `${className}.${methodName}`;\n return {\n name: fullName,\n description:\n typeof entry.description === \"string\" ? entry.description : undefined,\n parameters: (entry.parameters ?? {\n type: \"object\",\n properties: {},\n }) as ToolSchemaObject,\n } satisfies ToolSpec;\n });\n\n toolDocCache.set(className, tools);\n return tools;\n};\n\nconst loadToolsForClasses = async (\n classes: string[],\n dataDir: string\n): Promise<ToolSpec[]> => {\n const toolsPerClass = await Promise.all(\n classes.map((cls) => loadToolsForClass(cls, dataDir))\n );\n return toolsPerClass.flat();\n};\n\nconst getMethodName = (toolName: string): string =>\n toolName.split(\".\").pop() ?? toolName;\n\nconst isRateLimitError = (error: unknown): boolean => {\n if (!(error instanceof Error)) {\n return false;\n }\n const message = error.message.toLowerCase();\n if (message.includes(\"429\") || message.includes(\"rate limit\")) {\n return true;\n }\n const anyError = error as unknown as Record<string, unknown>;\n if (anyError.status === 429 || anyError.statusCode === 429) {\n return true;\n }\n // Check nested cause\n if (\n anyError.cause &&\n typeof anyError.cause === \"object\" &&\n (anyError.cause as Record<string, unknown>).status === 429\n ) {\n return true;\n }\n return false;\n};\n\nconst sleep = (ms: number): Promise<void> =>\n new Promise((resolve) => setTimeout(resolve, ms));\n\nconst withRetry = async <T>(\n fn: () => Promise<T>,\n options: { debug?: boolean } = {}\n): Promise<T> => {\n let lastError: unknown;\n let delay = RETRY_INITIAL_DELAY_MS;\n\n for (let attempt = 1; attempt <= RETRY_MAX_ATTEMPTS; attempt++) {\n try {\n return await fn();\n } catch (error) {\n lastError = error;\n\n if (!isRateLimitError(error)) {\n throw error;\n }\n\n if (attempt === RETRY_MAX_ATTEMPTS) {\n throw error;\n }\n\n if (options.debug) {\n console.log(\n `[DEBUG] Rate limit hit, retrying in ${delay}ms (attempt ${attempt}/${RETRY_MAX_ATTEMPTS})`\n );\n }\n\n await sleep(delay);\n delay = Math.min(delay * RETRY_BACKOFF_MULTIPLIER, RETRY_MAX_DELAY_MS);\n }\n }\n\n throw lastError;\n};\n\nconst createBfclMultiTurnBenchmark = (\n name: string,\n description: string,\n testDataFile: string,\n answerDataFile: string\n): LanguageModelV3Benchmark => ({\n name,\n version: \"1.0.0\",\n description,\n async run(\n model: LanguageModel,\n config?: Record<string, unknown>\n ): Promise<BenchmarkResult> {\n console.log(\"Starting BFCL multi-turn benchmark...\");\n\n // Clear tool cache on each run to ensure fresh execution\n toolDocCache.clear();\n\n // Also clear method registry instances to ensure fresh state\n globalMethodRegistry.reset();\n\n const logs: string[] = [];\n let correctCount = 0;\n let testCases: MultiTurnTestCase[] = [];\n\n const dataPath = resolveDataDir();\n // Include config in runId to ensure different cache for different settings\n const configHash = JSON.stringify(config || {});\n const runId = `bfcl_${Date.now()}_${Math.random().toString(36).slice(2, 8)}_${configHash.slice(0, 10)}`;\n\n try {\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 testCases = testCasesJson\n .split(LINE_SPLIT_REGEX)\n .filter((line) => line.trim().length > 0)\n .map((line) => JSON.parse(line));\n\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 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(`[INFO] Limiting test cases to ${limit} due to BFCL_LIMIT.`);\n }\n\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 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 const debugMode = process.env.BFCL_DEBUG === \"true\";\n\n const executeModelGeneration = async (options: {\n messages: ModelMessage[];\n toolsMap: Record<string, ReturnType<typeof tool>>;\n }): Promise<{\n toolCalls: unknown;\n text: unknown;\n finishReason: unknown;\n }> => {\n const { messages, toolsMap } = options;\n const providerOptions: Record<string, JSONObject> = {\n toolCallMiddleware: {\n debugSummary: {},\n },\n };\n const { toolCalls, text, finishReason } = await withRetry(\n () =>\n generateText({\n model,\n system: MULTI_TURN_SYSTEM_PROMPT,\n messages,\n tools: toolsMap,\n toolChoice: \"auto\",\n providerOptions,\n ...(temperature !== undefined ? { temperature } : {}),\n ...(maxTokens !== undefined\n ? { maxOutputTokens: maxTokens }\n : {}),\n }),\n { debug: debugMode }\n );\n\n if (debugMode) {\n console.log(\"[DEBUG] generateText response:\");\n console.log(\" finishReason:\", finishReason);\n console.log(\" text:\", text?.slice?.(0, 200) ?? text);\n console.log(\n \" toolCalls:\",\n JSON.stringify(toolCalls, null, 2)?.slice(0, 500)\n );\n }\n\n return { toolCalls, text, finishReason };\n };\n\n const buildWithholdUntil = (\n missedFunctionMap: Record<string, string[]>\n ): Map<string, number> => {\n const withholdUntil = new Map<string, number>();\n for (const [turnStr, funcs] of Object.entries(missedFunctionMap)) {\n const turnIndex = Number(turnStr);\n if (!Number.isFinite(turnIndex)) {\n continue;\n }\n for (const fn of funcs) {\n withholdUntil.set(fn, turnIndex);\n }\n }\n return withholdUntil;\n };\n\n const getTurnMessages = (\n turns: Message[][],\n turnIndex: number,\n missedFunctionMap: Record<string, string[]>\n ): Message[] => {\n const turnMessages = turns[turnIndex] ?? [];\n const missedFunctionsForTurn =\n missedFunctionMap[String(turnIndex)] ?? [];\n if (turnMessages.length === 0 && missedFunctionsForTurn.length > 0) {\n return [\n {\n role: \"user\",\n content: DEFAULT_USER_PROMPT_FOR_ADDITIONAL_FUNCTION_FC,\n },\n ];\n }\n return turnMessages;\n };\n\n const getAvailableTools = (\n tools: ToolSpec[],\n excludedFunctions: Set<string>,\n withholdUntil: Map<string, number>,\n turnIndex: number\n ): ToolSpec[] =>\n tools.filter((toolSpec) => {\n const methodName = getMethodName(toolSpec.name);\n if (\n excludedFunctions.has(methodName) ||\n excludedFunctions.has(toolSpec.name)\n ) {\n return false;\n }\n const availableFrom =\n withholdUntil.get(methodName) ?? withholdUntil.get(toolSpec.name);\n if (availableFrom !== undefined && turnIndex < availableFrom) {\n return false;\n }\n return true;\n });\n\n const runToolStep = async (options: {\n history: ModelMessage[];\n toolsMap: Record<string, ReturnType<typeof tool>>;\n transformedTools: TransformedTool[];\n nameMap: Map<string, string>;\n turnIndex: number;\n stepCount: number;\n initialConfig: Record<string, unknown>;\n involvedClasses: string[];\n isLongContext: boolean;\n testCaseId: string;\n }): Promise<{\n done: boolean;\n history: ModelMessage[];\n toolCalls: ToolCall[];\n }> => {\n const {\n history,\n toolsMap,\n transformedTools,\n nameMap,\n turnIndex,\n stepCount,\n initialConfig,\n involvedClasses,\n isLongContext,\n testCaseId,\n } = options;\n\n const { toolCalls, text, finishReason } = await executeModelGeneration({\n messages: history,\n toolsMap,\n });\n const toolCallsArray = Array.isArray(toolCalls) ? toolCalls : [];\n\n console.log(`[DEBUG] TestCase ${testCaseId} Step ${stepCount}:`);\n console.log(` History length: ${history.length}`);\n console.log(\" Last message:\", history.at(-1));\n console.log(` Finish reason: ${finishReason}`);\n console.log(` Text response: \"${text}\"`);\n console.log(` Tool calls count: ${toolCallsArray.length}`);\n if (toolCallsArray.length > 0) {\n console.log(\n \" Tool calls:\",\n toolCallsArray.map((tc) => ({\n name: tc.toolName,\n args: tc.args,\n }))\n );\n }\n\n // Model finished without tool calls - turn is complete\n // Add assistant text response to history (matching official BFCL behavior)\n if (toolCallsArray.length === 0) {\n const textContent = typeof text === \"string\" ? text : \"\";\n const updatedHistory: ModelMessage[] = textContent\n ? [\n ...history,\n {\n role: \"assistant\",\n content: [{ type: \"text\", text: textContent }],\n },\n ]\n : history;\n return { done: true, history: updatedHistory, toolCalls: [] };\n }\n\n // If finishReason indicates stop (not tool_calls), treat as done after this execution\n // This handles models that return both text and tool calls but signal completion\n const isLastStep =\n finishReason === \"stop\" ||\n finishReason === \"end_turn\" ||\n finishReason === \"length\";\n\n const restoredCalls = restoreToolCalls(\n toolCallsArray,\n nameMap,\n transformedTools\n );\n\n const toolCallParts = toolCallsArray.map((call, idx) => {\n const record = call as Record<string, unknown>;\n const toolCallId =\n typeof record.toolCallId === \"string\"\n ? record.toolCallId\n : `toolcall-${turnIndex}-${stepCount}-${idx}`;\n const rawName = record.toolName ?? record.name;\n const toolName =\n typeof rawName === \"string\"\n ? rawName\n : (transformedTools[idx]?.name ?? \"tool\");\n const extractedArgs =\n record.args ??\n record.arguments ??\n record.input ??\n record.params ??\n record.parameters;\n const parsedInput = parseToolArgs(extractedArgs) ?? {};\n\n if (debugMode) {\n console.log(`[DEBUG] Tool call ${idx} args processing:`);\n console.log(` record.args type: ${typeof record.args}`);\n console.log(` record.arguments type: ${typeof record.arguments}`);\n console.log(\n ` extractedArgs type: ${typeof extractedArgs}, value: ${JSON.stringify(extractedArgs)?.slice(0, 200)}`\n );\n console.log(\n ` parsedInput type: ${typeof parsedInput}, value: ${JSON.stringify(parsedInput)?.slice(0, 200)}`\n );\n }\n\n return {\n type: \"tool-call\" as const,\n toolCallId,\n toolName,\n input: parsedInput,\n };\n });\n\n const historyWithToolCalls: ModelMessage[] = [\n ...history,\n {\n role: \"assistant\",\n content: toolCallParts,\n },\n ];\n\n const toolCallsForExecution: ToolCall[] = restoredCalls.map((call) => ({\n toolName: call.toolName,\n args: (call.args ?? {}) as Record<string, unknown>,\n }));\n\n const executionResult = await executeMultiTurnFuncCall(\n toolCallsForExecution,\n initialConfig,\n involvedClasses,\n runId,\n testCaseId,\n isLongContext,\n false\n );\n const executionResults = executionResult.executionResults;\n\n console.log(\"[DEBUG] Tool call execution results:\", executionResults);\n console.log(\"[DEBUG] Tool calls:\", toolCallsForExecution);\n\n const toolResultParts = executionResults.map((result, idx) => {\n const toolCallPart = toolCallParts[idx];\n return {\n type: \"tool-result\" as const,\n toolCallId: toolCallPart.toolCallId,\n toolName: toolCallPart.toolName,\n output: {\n type: \"text\" as const,\n value: result,\n },\n };\n });\n\n const historyWithToolResults: ModelMessage[] = [\n ...historyWithToolCalls,\n {\n role: \"tool\",\n content: toolResultParts,\n },\n ];\n\n return {\n done: isLastStep,\n history: historyWithToolResults,\n toolCalls: toolCallsForExecution,\n };\n };\n\n const runTurn = async (options: {\n testCase: MultiTurnTestCase;\n turnIndex: number;\n history: ModelMessage[];\n tools: ToolSpec[];\n excludedFunctions: Set<string>;\n withholdUntil: Map<string, number>;\n initialConfig: Record<string, unknown>;\n involvedClasses: string[];\n isLongContext: boolean;\n }): Promise<{\n history: ModelMessage[];\n turnResults: ToolCall[][];\n forceQuit: boolean;\n }> => {\n const {\n testCase,\n turnIndex,\n history,\n tools,\n excludedFunctions,\n withholdUntil,\n initialConfig,\n involvedClasses,\n isLongContext,\n } = options;\n const availableTools = getAvailableTools(\n tools,\n excludedFunctions,\n withholdUntil,\n turnIndex\n );\n const { transformedTools, nameMap } =\n buildTransformedTools(availableTools);\n const toolsMap = buildToolsMap(transformedTools);\n const turnResults: ToolCall[][] = [];\n let stepCount = 0;\n let updatedHistory = history;\n\n while (stepCount <= MAXIMUM_STEP_LIMIT) {\n const stepResult = await runToolStep({\n history: updatedHistory,\n toolsMap,\n transformedTools,\n nameMap,\n turnIndex,\n stepCount,\n initialConfig,\n involvedClasses,\n isLongContext,\n testCaseId: testCase.id,\n });\n if (stepResult.done) {\n return {\n history: stepResult.history,\n turnResults,\n forceQuit: false,\n };\n }\n turnResults.push(stepResult.toolCalls);\n updatedHistory = stepResult.history;\n stepCount += 1;\n }\n\n return { history: updatedHistory, turnResults, forceQuit: true };\n };\n\n const buildCaseContext = async (\n testCase: MultiTurnTestCase,\n possibleAnswer: PossibleAnswer\n ): Promise<{\n turns: Message[][];\n expectedGroundTruth: string[][];\n involvedClasses: string[];\n initialConfig: Record<string, unknown>;\n excludedFunctions: Set<string>;\n missedFunctionMap: Record<string, string[]>;\n tools: ToolSpec[];\n withholdUntil: Map<string, number>;\n isLongContext: boolean;\n }> => {\n const turns = normalizeTurns(testCase.question ?? []);\n const expectedGroundTruth = possibleAnswer.ground_truth;\n const involvedClasses = testCase.involved_classes ?? [];\n const initialConfig = testCase.initial_config ?? {};\n const excludedFunctions = new Set(testCase.excluded_function ?? []);\n const missedFunctionMap = testCase.missed_function ?? {};\n const tools = await loadToolsForClasses(involvedClasses, dataPath);\n const withholdUntil = buildWithholdUntil(missedFunctionMap);\n const isLongContext =\n testCase.id.includes(\"long_context\") ||\n testCase.id.includes(\"composite\");\n return {\n turns,\n expectedGroundTruth,\n involvedClasses,\n initialConfig,\n excludedFunctions,\n missedFunctionMap,\n tools,\n withholdUntil,\n isLongContext,\n };\n };\n\n const runConversation = async (context: {\n turns: Message[][];\n testCase: MultiTurnTestCase;\n tools: ToolSpec[];\n excludedFunctions: Set<string>;\n withholdUntil: Map<string, number>;\n initialConfig: Record<string, unknown>;\n involvedClasses: string[];\n missedFunctionMap: Record<string, string[]>;\n isLongContext: boolean;\n }): Promise<{\n modelResultsByTurn: ToolCall[][][];\n forceQuit: boolean;\n }> => {\n const {\n turns,\n testCase,\n tools,\n excludedFunctions,\n withholdUntil,\n initialConfig,\n involvedClasses,\n missedFunctionMap,\n isLongContext,\n } = context;\n let history: ModelMessage[] = [];\n const modelResultsByTurn: ToolCall[][][] = [];\n\n for (let turnIndex = 0; turnIndex < turns.length; turnIndex += 1) {\n const turnMessages = getTurnMessages(\n turns,\n turnIndex,\n missedFunctionMap\n );\n if (turnMessages.length > 0) {\n history = [\n ...history,\n ...(turnMessages as unknown as ModelMessage[]),\n ];\n }\n\n const turnOutcome = await runTurn({\n testCase,\n turnIndex,\n history,\n tools,\n excludedFunctions,\n withholdUntil,\n initialConfig,\n involvedClasses,\n isLongContext,\n });\n\n history = turnOutcome.history;\n modelResultsByTurn.push(turnOutcome.turnResults);\n\n if (turnOutcome.forceQuit) {\n return { modelResultsByTurn, forceQuit: true };\n }\n }\n\n return { modelResultsByTurn, forceQuit: false };\n };\n\n const checkCase = async (\n testCase: MultiTurnTestCase,\n modelResultsByTurn: ToolCall[][][],\n expectedGroundTruth: string[][]\n ): Promise<Record<string, unknown>> => {\n const testCategory = testCase.id.split(\"_\").slice(0, -1).join(\"_\");\n const checkResult = await multiTurnChecker(\n modelResultsByTurn,\n expectedGroundTruth,\n testCase,\n testCategory,\n runId\n );\n\n // Also check irrelevance\n const irrelevanceResult = multiTurnIrrelevanceChecker(\n modelResultsByTurn,\n expectedGroundTruth\n );\n\n return {\n valid: checkResult.valid && irrelevanceResult.valid,\n error_type: checkResult.error_type || irrelevanceResult.error_type,\n details: checkResult.details || irrelevanceResult.details,\n };\n };\n\n const runSingleCase = async (\n testCase: MultiTurnTestCase\n // biome-ignore lint/complexity/noExcessiveCognitiveComplexity: Multi-turn evaluation requires complex branching\n ): Promise<{ valid: boolean; logs: string[] }> => {\n try {\n const caseLogs: string[] = [];\n const possibleAnswer = possibleAnswersMap.get(testCase.id);\n if (!possibleAnswer) {\n caseLogs.push(`[FAIL] ${testCase.id}: missing possible answer`);\n return { valid: false, logs: caseLogs };\n }\n\n const context = await buildCaseContext(testCase, possibleAnswer);\n\n const conversationResult = await runConversation({\n ...context,\n testCase,\n });\n if (conversationResult.forceQuit) {\n caseLogs.push(\n `[FAIL] ${testCase.id}: force-terminated after ${MAXIMUM_STEP_LIMIT} steps`\n );\n return { valid: false, logs: caseLogs };\n }\n\n const checkerResult = await checkCase(\n testCase,\n conversationResult.modelResultsByTurn,\n context.expectedGroundTruth\n );\n\n // Always log for debugging\n console.log(`[DEBUG] Test case: ${testCase.id}`);\n console.log(\n `[DEBUG] Model results (${conversationResult.modelResultsByTurn.length} turns):`,\n conversationResult.modelResultsByTurn\n );\n console.log(\n `[DEBUG] Ground truth (${context.expectedGroundTruth.length} turns):`,\n context.expectedGroundTruth\n );\n\n // Compare results in detail\n for (\n let turn = 0;\n turn <\n Math.max(\n conversationResult.modelResultsByTurn.length,\n context.expectedGroundTruth.length\n );\n turn++\n ) {\n const modelTurn = conversationResult.modelResultsByTurn[turn] || [];\n const gtTurn = context.expectedGroundTruth[turn] || [];\n console.log(`[DEBUG] Turn ${turn}:`);\n console.log(` Model: ${JSON.stringify(modelTurn)}`);\n console.log(` Ground Truth: ${JSON.stringify(gtTurn)}`);\n console.log(\n ` Match: ${JSON.stringify(modelTurn) === JSON.stringify(gtTurn)}`\n );\n }\n\n console.log(\"[DEBUG] Checker result:\", checkerResult);\n console.log(\n `[DEBUG] Ground truth (${context.expectedGroundTruth.length} turns):`,\n context.expectedGroundTruth\n );\n console.log(\"[DEBUG] Checker result:\", checkerResult);\n\n if (checkerResult.valid === true) {\n caseLogs.push(`[PASS] ${testCase.id}`);\n return { valid: true, logs: caseLogs };\n }\n\n caseLogs.push(\n `[FAIL] ${testCase.id}: ${checkerResult.error_type ?? \"unknown error\"}`\n );\n return { valid: false, logs: caseLogs };\n } catch (e: unknown) {\n const errorMsg =\n e instanceof Error ? e.message : \"unknown error in runSingleCase\";\n return {\n valid: false,\n logs: [`[FAIL] ${testCase.id}: ${errorMsg}`],\n };\n }\n };\n\n const runSingleCaseSafe = async (\n testCase: MultiTurnTestCase\n ): Promise<{ valid: boolean; logs: string[] }> => {\n try {\n return await runSingleCase(testCase);\n } catch (e: unknown) {\n const errorMsg =\n e instanceof Error ? e.message : \"unknown error occurred\";\n if (debugMode) {\n console.error(`[DEBUG] Error in test case ${testCase.id}:`, e);\n }\n return {\n valid: false,\n logs: [`[FAIL] ${testCase.id}: ${errorMsg}`],\n };\n }\n };\n\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) => runSingleCaseSafe(tc)\n );\n\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 const caseResults = resultsPerCase.map((r, i) => ({\n id: testCases[i].id,\n valid: r.valid,\n }));\n return {\n score,\n success: score > 0.95,\n metrics: {\n correct_count: correctCount,\n total_cases: testCases.length,\n accuracy: score,\n case_results: JSON.stringify(caseResults),\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 `[ERROR] Failed to run BFCL multi-turn benchmark: ${(e as Error).message}`,\n ],\n };\n } finally {\n // Clean up test instances\n resetTestInstances(\"\", runId);\n }\n },\n});\n\nexport const bfclMultiTurnBaseBenchmark = createBfclMultiTurnBenchmark(\n MULTI_TURN_DATASETS[0].name,\n MULTI_TURN_DATASETS[0].description,\n MULTI_TURN_DATASETS[0].testFile,\n MULTI_TURN_DATASETS[0].answerFile\n);\nexport const bfclMultiTurnLongContextBenchmark = createBfclMultiTurnBenchmark(\n MULTI_TURN_DATASETS[1].name,\n MULTI_TURN_DATASETS[1].description,\n MULTI_TURN_DATASETS[1].testFile,\n MULTI_TURN_DATASETS[1].answerFile\n);\nexport const bfclMultiTurnMissFuncBenchmark = createBfclMultiTurnBenchmark(\n MULTI_TURN_DATASETS[2].name,\n MULTI_TURN_DATASETS[2].description,\n MULTI_TURN_DATASETS[2].testFile,\n MULTI_TURN_DATASETS[2].answerFile\n);\nexport const bfclMultiTurnMissParamBenchmark = createBfclMultiTurnBenchmark(\n MULTI_TURN_DATASETS[3].name,\n MULTI_TURN_DATASETS[3].description,\n MULTI_TURN_DATASETS[3].testFile,\n MULTI_TURN_DATASETS[3].answerFile\n);\n","const TRAILING_SLASHES_REGEX = /\\/+$/;\nconst PATH_TRAILING_SLASHES_REGEX = /\\/+$/;\nconst WHITESPACE_REGEX = /\\s+/;\n\nexport class File {\n name: string;\n content: string;\n\n constructor(name: string, content = \"\") {\n this.name = name;\n this.content = content;\n }\n\n _write(newContent: string): void {\n this.content = newContent;\n }\n\n _read(): string {\n return this.content;\n }\n}\n\nexport class Directory {\n name: string;\n parent: Directory | null;\n contents: Record<string, File | Directory>;\n\n constructor(name: string, parent: Directory | null = null) {\n this.name = name;\n this.parent = parent;\n this.contents = {};\n }\n\n _addFile(fileName: string, content = \"\"): void {\n this.contents[fileName] = new File(fileName, content);\n }\n\n _addDirectory(dirName: string): void {\n this.contents[dirName] = new Directory(dirName, this);\n }\n\n _getItem(itemName: string): File | Directory | null {\n if (itemName === \".\") {\n return this;\n }\n return this.contents[itemName] || null;\n }\n\n _listContents(): string[] {\n return Object.keys(this.contents);\n }\n}\n\nexport class GorillaFileSystem {\n private root!: Directory;\n private _currentDir!: Directory;\n\n constructor() {\n this.root = new Directory(\"/\", null);\n this._currentDir = this.root;\n }\n\n // biome-ignore lint/suspicious/noExplicitAny: Dynamic scenario loading from JSON\n _loadScenario(scenario: any, _longContext = false): void {\n this.root = new Directory(\"/\", null);\n\n if (scenario?.root) {\n const rootKeys = Object.keys(scenario.root);\n if (rootKeys.length > 0) {\n const rootDirName = rootKeys[0];\n const rootDir = new Directory(rootDirName, null);\n this.root = this._loadDirectory(\n scenario.root[rootDirName].contents || {},\n rootDir\n );\n }\n }\n this._currentDir = this.root;\n }\n\n private _loadDirectory(\n // biome-ignore lint/suspicious/noExplicitAny: Dynamic directory structure from JSON\n current: any,\n parent: Directory\n ): Directory {\n for (const [name, data] of Object.entries(\n current as Record<\n string,\n { type: string; contents?: unknown; content?: string }\n >\n )) {\n if (data.type === \"directory\") {\n const newDir = new Directory(name, parent);\n const loadedDir = this._loadDirectory(data.contents || {}, newDir);\n parent.contents[name] = loadedDir;\n } else if (data.type === \"file\") {\n parent.contents[name] = new File(name, data.content || \"\");\n }\n }\n return parent;\n }\n\n pwd(): Record<string, string> {\n const path: string[] = [];\n let dir: Directory | null = this._currentDir;\n while (dir !== null) {\n path.push(dir.name);\n dir = dir.parent;\n }\n return { current_working_directory: `/${path.reverse().join(\"/\")}` };\n }\n\n ls(a = false): Record<string, string[]> {\n let contents = this._currentDir._listContents();\n if (!a) {\n contents = contents.filter((item) => !item.startsWith(\".\"));\n }\n return { current_directory_content: contents };\n }\n\n cd(folder: string): Record<string, string> | null {\n let normalizedFolder = folder.replace(TRAILING_SLASHES_REGEX, \"\");\n if (normalizedFolder === \"\") {\n normalizedFolder = \"/\";\n }\n\n if (\n normalizedFolder !== \".\" &&\n normalizedFolder !== \"..\" &&\n normalizedFolder !== \"/\" &&\n normalizedFolder.includes(\"/\")\n ) {\n return {\n error: `cd: ${normalizedFolder}: Unsupported path. Only one folder level at a time is supported.`,\n };\n }\n\n if (normalizedFolder === \"..\") {\n if (this._currentDir.parent) {\n this._currentDir = this._currentDir.parent;\n return {};\n }\n if (this.root === this._currentDir) {\n return {\n error: \"Current directory is already the root. Cannot go back.\",\n };\n }\n return { error: \"cd: ..: No such directory\" };\n }\n\n const targetDir = this._navigateToDirectory(normalizedFolder);\n if (targetDir && \"error\" in targetDir) {\n return targetDir as Record<string, string>;\n }\n if (targetDir instanceof Directory) {\n this._currentDir = targetDir;\n return { current_working_directory: targetDir.name };\n }\n return { error: `cd: ${normalizedFolder}: No such file or directory` };\n }\n\n mkdir(dir_name: string): Record<string, string> | null {\n if (dir_name in this._currentDir.contents) {\n return {\n error: `mkdir: cannot create directory '${dir_name}': File exists`,\n };\n }\n this._currentDir._addDirectory(dir_name);\n return null;\n }\n\n touch(file_name: string): Record<string, string> | null {\n if (file_name in this._currentDir.contents) {\n return { error: `touch: cannot touch '${file_name}': File exists` };\n }\n this._currentDir._addFile(file_name);\n return null;\n }\n\n echo(content: string, file_name?: string): Record<string, string> | null {\n if (file_name === undefined || file_name === null) {\n return { terminal_output: content };\n }\n if (file_name in this._currentDir.contents) {\n const item = this._currentDir._getItem(file_name);\n if (item instanceof File) {\n item._write(content);\n return null;\n }\n }\n return { error: `echo: cannot write to '${file_name}': No such file` };\n }\n\n cat(file_name: string): Record<string, string> {\n if (file_name in this._currentDir.contents) {\n const item = this._currentDir._getItem(file_name);\n if (item instanceof File) {\n return { file_content: item._read() };\n }\n return { error: `cat: '${file_name}': Is a directory` };\n }\n return { error: `cat: '${file_name}': No such file or directory` };\n }\n\n find(\n path = \".\",\n name?: string\n ): Record<string, string[]> | Record<string, string> {\n const targetDir = this._navigateToDirectory(path);\n if (targetDir && \"error\" in targetDir) {\n const errMsg = (targetDir as Record<string, string>).error || \"\";\n if (errMsg.startsWith(\"cd:\")) {\n return { error: errMsg.replace(\"cd:\", \"find:\") };\n }\n return targetDir as Record<string, string>;\n }\n\n const matches: string[] = [];\n const recursiveSearch = (directory: Directory, basePath: string): void => {\n for (const [itemName, item] of Object.entries(directory.contents)) {\n const itemPath = `${basePath}/${itemName}`;\n if (name === undefined || name === null || itemName.includes(name)) {\n matches.push(itemPath);\n }\n if (item instanceof Directory) {\n recursiveSearch(item, itemPath);\n }\n }\n };\n\n if (targetDir instanceof Directory) {\n recursiveSearch(targetDir, path.replace(PATH_TRAILING_SLASHES_REGEX, \"\"));\n }\n return { matches };\n }\n\n wc(file_name: string, mode = \"l\"): Record<string, number | string> {\n if (![\"l\", \"w\", \"c\"].includes(mode)) {\n return { error: `wc: invalid mode '${mode}'` };\n }\n\n if (file_name in this._currentDir.contents) {\n const file = this._currentDir._getItem(file_name);\n if (file instanceof File) {\n const content = file._read();\n if (mode === \"l\") {\n return { count: content.split(\"\\n\").length, type: \"lines\" };\n }\n if (mode === \"w\") {\n return {\n count: content.split(WHITESPACE_REGEX).filter(Boolean).length,\n type: \"words\",\n };\n }\n if (mode === \"c\") {\n return { count: content.length, type: \"characters\" };\n }\n }\n }\n return { error: `wc: ${file_name}: No such file or directory` };\n }\n\n sort(file_name: string): Record<string, string> {\n if (file_name in this._currentDir.contents) {\n const file = this._currentDir._getItem(file_name);\n if (file instanceof File) {\n const content = file._read();\n const sortedContent = content.split(\"\\n\").sort().join(\"\\n\");\n return { sorted_content: sortedContent };\n }\n }\n return { error: `sort: ${file_name}: No such file or directory` };\n }\n\n grep(file_name: string, pattern: string): Record<string, string[] | string> {\n if (file_name in this._currentDir.contents) {\n const file = this._currentDir._getItem(file_name);\n if (file instanceof File) {\n const content = file._read();\n const matchingLines = content\n .split(\"\\n\")\n .filter((line) => line.includes(pattern));\n return { matching_lines: matchingLines };\n }\n }\n return { error: `grep: ${file_name}: No such file or directory` };\n }\n\n du(human_readable = false): Record<string, string> {\n const getSize = (item: File | Directory): number => {\n if (item instanceof File) {\n return new TextEncoder().encode(item._read()).length;\n }\n if (item instanceof Directory) {\n return Object.values(item.contents).reduce(\n (acc, child) => acc + getSize(child),\n 0\n );\n }\n return 0;\n };\n\n const totalSize = getSize(this._currentDir);\n\n if (human_readable) {\n const units = [\"B\", \"KB\", \"MB\", \"GB\", \"TB\"];\n let unitIndex = 0;\n let size = totalSize;\n while (size >= 1024 && unitIndex < units.length - 1) {\n size /= 1024;\n unitIndex++;\n }\n return { disk_usage: `${size.toFixed(2)} ${units[unitIndex]}` };\n }\n return { disk_usage: `${totalSize} bytes` };\n }\n\n tail(file_name: string, lines = 10): Record<string, string> {\n if (file_name in this._currentDir.contents) {\n const file = this._currentDir._getItem(file_name);\n if (file instanceof File) {\n const content = file._read().split(\"\\n\");\n const actualLines = Math.min(lines, content.length);\n const lastLines = content.slice(-actualLines);\n return { last_lines: lastLines.join(\"\\n\") };\n }\n }\n return { error: `tail: ${file_name}: No such file or directory` };\n }\n\n diff(file_name1: string, file_name2: string): Record<string, string> {\n if (\n file_name1 in this._currentDir.contents &&\n file_name2 in this._currentDir.contents\n ) {\n const file1 = this._currentDir._getItem(file_name1);\n const file2 = this._currentDir._getItem(file_name2);\n if (file1 instanceof File && file2 instanceof File) {\n const content1 = file1._read().split(\"\\n\");\n const content2 = file2._read().split(\"\\n\");\n const diffLines: string[] = [];\n const maxLen = Math.max(content1.length, content2.length);\n for (let i = 0; i < maxLen; i++) {\n const line1 = content1[i] || \"\";\n const line2 = content2[i] || \"\";\n if (line1 !== line2) {\n diffLines.push(`- ${line1}\\n+ ${line2}`);\n }\n }\n return { diff_lines: diffLines.join(\"\\n\") };\n }\n }\n return {\n error: `diff: ${file_name1} or ${file_name2}: No such file or directory`,\n };\n }\n\n mv(source: string, destination: string): Record<string, string> {\n if (!(source in this._currentDir.contents)) {\n return {\n error: `mv: cannot move '${source}': No such file or directory`,\n };\n }\n\n const item = this._currentDir._getItem(source);\n if (!(item instanceof File || item instanceof Directory)) {\n return { error: `mv: cannot move '${source}': Not a file or directory` };\n }\n\n if (destination.includes(\"/\")) {\n return {\n error:\n \"mv: path not allowed in destination. Provide only a file or directory name.\",\n };\n }\n\n if (destination in this._currentDir.contents) {\n const destItem = this._currentDir._getItem(destination);\n if (destItem instanceof Directory) {\n if (source in destItem.contents) {\n return {\n error: `mv: cannot move '${source}' to '${destination}/${source}': File exists`,\n };\n }\n delete this._currentDir.contents[source];\n if (item instanceof File) {\n destItem._addFile(source, item.content);\n } else {\n destItem._addDirectory(source);\n (destItem.contents[source] as Directory).contents = item.contents;\n }\n return { result: `'${source}' moved to '${destination}/${source}'` };\n }\n return {\n error: `mv: cannot move '${source}' to '${destination}': Not a directory`,\n };\n }\n\n delete this._currentDir.contents[source];\n if (item instanceof File) {\n this._currentDir._addFile(destination, item.content);\n } else {\n this._currentDir._addDirectory(destination);\n (this._currentDir.contents[destination] as Directory).contents =\n item.contents;\n }\n return { result: `'${source}' moved to '${destination}'` };\n }\n\n rm(file_name: string): Record<string, string> {\n if (file_name in this._currentDir.contents) {\n delete this._currentDir.contents[file_name];\n return { result: `'${file_name}' removed` };\n }\n return {\n error: `rm: cannot remove '${file_name}': No such file or directory`,\n };\n }\n\n rmdir(dir_name: string): Record<string, string> {\n if (dir_name in this._currentDir.contents) {\n const item = this._currentDir._getItem(dir_name);\n if (item instanceof Directory) {\n if (Object.keys(item.contents).length > 0) {\n return {\n error: `rmdir: cannot remove '${dir_name}': Directory not empty`,\n };\n }\n delete this._currentDir.contents[dir_name];\n return { result: `'${dir_name}' removed` };\n }\n return { error: `rmdir: cannot remove '${dir_name}': Not a directory` };\n }\n return {\n error: `rmdir: cannot remove '${dir_name}': No such file or directory`,\n };\n }\n\n cp(source: string, destination: string): Record<string, string> {\n if (!(source in this._currentDir.contents)) {\n return {\n error: `cp: cannot copy '${source}': No such file or directory`,\n };\n }\n\n const item = this._currentDir._getItem(source);\n if (!(item instanceof File || item instanceof Directory)) {\n return { error: `cp: cannot copy '${source}': Not a file or directory` };\n }\n\n if (destination.includes(\"/\")) {\n return {\n error:\n \"cp: path not allowed in destination. Provide only a file or directory name.\",\n };\n }\n\n if (destination in this._currentDir.contents) {\n const destItem = this._currentDir._getItem(destination);\n if (destItem instanceof Directory) {\n if (source in destItem.contents) {\n return {\n error: `cp: cannot copy '${source}' to '${destination}/${source}': File exists`,\n };\n }\n if (item instanceof File) {\n destItem._addFile(source, item.content);\n } else {\n destItem._addDirectory(source);\n (destItem.contents[source] as Directory).contents = {\n ...item.contents,\n };\n }\n return { result: `'${source}' copied to '${destination}/${source}'` };\n }\n return {\n error: `cp: cannot copy '${source}' to '${destination}': Not a directory`,\n };\n }\n\n if (item instanceof File) {\n this._currentDir._addFile(destination, item.content);\n } else {\n this._currentDir._addDirectory(destination);\n (this._currentDir.contents[destination] as Directory).contents = {\n ...item.contents,\n };\n }\n return { result: `'${source}' copied to '${destination}'` };\n }\n\n private _navigateToDirectory(\n path: string | null\n ): Directory | Record<string, string> {\n if (path === null || path === \".\") {\n return this._currentDir;\n }\n if (path === \"/\") {\n return this.root;\n }\n\n const dirs = path.replace(/^\\/+|\\/+$/g, \"\").split(\"/\");\n let tempDir: Directory = path.startsWith(\"/\")\n ? this.root\n : this._currentDir;\n\n for (const dirName of dirs) {\n const nextDir = tempDir._getItem(dirName);\n if (nextDir instanceof Directory) {\n tempDir = nextDir;\n } else {\n return { error: `cd: '${path}': No such file or directory` };\n }\n }\n return tempDir;\n }\n\n equals(other: unknown): boolean {\n if (!(other instanceof GorillaFileSystem)) {\n return false;\n }\n return JSON.stringify(this.root) === JSON.stringify(other.root);\n }\n}\n","import { Decimal } from \"decimal.js\";\n\ntype MathResult = { result: number } | { error: string };\n\nexport class MathAPI {\n logarithm(value: number, base: number, precision: number): MathResult {\n try {\n // Set precision for Decimal.js\n Decimal.set({ precision });\n\n // Use Decimal for high-precision logarithmic calculations\n const result = new Decimal(value).ln().div(new Decimal(base).ln());\n\n return { result: result.toNumber() };\n } catch (e) {\n return { error: String(e) };\n }\n }\n\n mean(numbers: number[]): MathResult {\n if (!numbers.length) {\n return { error: \"Cannot calculate mean of an empty list\" };\n }\n try {\n return { result: numbers.reduce((a, b) => a + b, 0) / numbers.length };\n } catch (_e) {\n return { error: \"All elements in the list must be numbers\" };\n }\n }\n\n standardDeviation(numbers: number[]): MathResult {\n if (!numbers.length) {\n return { error: \"Cannot calculate standard deviation of an empty list\" };\n }\n try {\n const mean = numbers.reduce((a, b) => a + b, 0) / numbers.length;\n const variance =\n numbers.reduce((sum, x) => sum + (x - mean) ** 2, 0) / numbers.length;\n return { result: Math.sqrt(variance) };\n } catch (_e) {\n return { error: \"All elements in the list must be numbers\" };\n }\n }\n\n siUnitConversion(value: number, unitIn: string, unitOut: string): MathResult {\n const toMeters: Record<string, number> = {\n km: 1000,\n m: 1,\n cm: 0.01,\n mm: 0.001,\n um: 1e-6,\n nm: 1e-9,\n };\n const fromMeters = Object.fromEntries(\n Object.entries(toMeters).map(([k, v]) => [k, 1 / v])\n );\n\n if (typeof value !== \"number\") {\n return { error: \"Value must be a number\" };\n }\n\n if (!(unitIn in toMeters && unitOut in fromMeters)) {\n return {\n error: `Conversion from '${unitIn}' to '${unitOut}' is not supported`,\n };\n }\n\n try {\n const valueInMeters = value * toMeters[unitIn];\n const result = valueInMeters * fromMeters[unitOut];\n return { result };\n } catch (_e) {\n return { error: \"Conversion resulted in a value too large to represent\" };\n }\n }\n\n imperialSiConversion(\n value: number,\n unitIn: string,\n unitOut: string\n ): MathResult {\n const conversion: Record<string, number> = {\n cm_to_in: 0.393_701,\n in_to_cm: 2.54,\n m_to_ft: 3.280_84,\n ft_to_m: 0.3048,\n m_to_yd: 1.093_61,\n yd_to_m: 0.9144,\n km_to_miles: 0.621_371,\n miles_to_km: 1.609_34,\n kg_to_lb: 2.204_62,\n lb_to_kg: 0.453_592,\n celsius_to_fahrenheit: 1.8,\n fahrenheit_to_celsius: 5 / 9,\n };\n\n if (typeof value !== \"number\") {\n return { error: \"Value must be a number\" };\n }\n\n if (unitIn === unitOut) {\n return { result: value };\n }\n\n const conversionKey = `${unitIn}_to_${unitOut}`;\n if (!(conversionKey in conversion)) {\n return {\n error: `Conversion from '${unitIn}' to '${unitOut}' is not supported`,\n };\n }\n\n try {\n let result: number;\n if (unitIn === \"celsius\" && unitOut === \"fahrenheit\") {\n result = value * conversion[conversionKey] + 32;\n } else if (unitIn === \"fahrenheit\" && unitOut === \"celsius\") {\n result = (value - 32) * conversion[conversionKey];\n } else {\n result = value * conversion[conversionKey];\n }\n\n return { result };\n } catch (_e) {\n return { error: \"Conversion resulted in a value too large to represent\" };\n }\n }\n\n add(a: number, b: number): MathResult {\n try {\n return { result: a + b };\n } catch (_e) {\n return { error: \"Both inputs must be numbers\" };\n }\n }\n\n subtract(a: number, b: number): MathResult {\n try {\n return { result: a - b };\n } catch (_e) {\n return { error: \"Both inputs must be numbers\" };\n }\n }\n\n multiply(a: number, b: number): MathResult {\n if (typeof a !== \"number\" || typeof b !== \"number\") {\n return { error: \"Both inputs must be numbers\" };\n }\n\n try {\n return { result: a * b };\n } catch (_e) {\n return { error: \"Both inputs must be numbers\" };\n }\n }\n\n divide(a: number, b: number): MathResult {\n try {\n if (b === 0) {\n return { error: \"Cannot divide by zero\" };\n }\n return { result: a / b };\n } catch (_e) {\n return { error: \"Both inputs must be numbers\" };\n }\n }\n\n power(base: number, exponent: number): MathResult {\n try {\n return { result: base ** exponent };\n } catch (_e) {\n return { error: \"Both inputs must be numbers\" };\n }\n }\n\n squareRoot(number: number, precision: number): MathResult {\n try {\n if (number < 0) {\n return { error: \"Cannot calculate square root of a negative number\" };\n }\n\n // Set the precision for Decimal\n Decimal.set({ precision });\n\n // Use Decimal for high-precision square root calculation\n const decimalNumber = new Decimal(number);\n const result = decimalNumber.sqrt();\n\n return { result: result.toNumber() };\n } catch (_e) {\n return {\n error:\n \"Input must be a number or computation resulted in an invalid operation\",\n };\n }\n }\n\n absoluteValue(number: number): MathResult {\n try {\n return { result: Math.abs(number) };\n } catch (_e) {\n return { error: \"Input must be a number\" };\n }\n }\n\n roundNumber(number: number, decimalPlaces = 0): MathResult {\n try {\n return {\n result: Math.round(number * 10 ** decimalPlaces) / 10 ** decimalPlaces,\n };\n } catch (_e) {\n return {\n error: \"First input must be a number, second input must be an integer\",\n };\n }\n }\n\n percentage(part: number, whole: number): MathResult {\n try {\n if (whole === 0) {\n return { error: \"Whole value cannot be zero\" };\n }\n return { result: (part / whole) * 100 };\n } catch (_e) {\n return { error: \"Both inputs must be numbers\" };\n }\n }\n\n minValue(numbers: number[]): MathResult {\n if (!numbers.length) {\n return { error: \"Cannot find minimum of an empty list\" };\n }\n try {\n return { result: Math.min(...numbers) };\n } catch (_e) {\n return { error: \"All elements in the list must be numbers\" };\n }\n }\n\n maxValue(numbers: number[]): MathResult {\n if (!numbers.length) {\n return { error: \"Cannot find maximum of an empty list\" };\n }\n try {\n return { result: Math.max(...numbers) };\n } catch (_e) {\n return { error: \"All elements in the list must be numbers\" };\n }\n }\n\n sumValues(numbers: number[]): MathResult {\n if (!numbers.length) {\n return { error: \"Cannot calculate sum of an empty list\" };\n }\n try {\n return { result: numbers.reduce((a, b) => a + b, 0) };\n } catch (_e) {\n return { error: \"All elements in the list must be numbers\" };\n }\n }\n}\n","export interface MessageScenario {\n random_seed?: number;\n generated_ids?: number[];\n user_count?: number;\n user_map?: Record<string, string>;\n inbox?: Record<string, string>[];\n message_count?: number;\n current_user?: string | null;\n}\n\nconst DEFAULT_STATE: MessageScenario = {\n generated_ids: [],\n user_count: 4,\n user_map: {\n Alice: \"USR001\",\n Bob: \"USR002\",\n Catherine: \"USR003\",\n Daniel: \"USR004\",\n },\n inbox: [\n { USR002: \"My name is Alice. I want to connect.\" },\n { USR003: \"Could you upload the file?\" },\n { USR004: \"Could you upload the file?\" },\n ],\n message_count: 3,\n current_user: null,\n};\n\nexport class MessageAPI {\n private generatedIds: Set<number>;\n private userCount: number;\n private userMap: Record<string, string>;\n private inbox: Record<string, string>[];\n messageCount: number;\n private currentUser: string | null;\n\n constructor() {\n this.generatedIds = new Set();\n this.userCount = 4;\n this.userMap = {};\n this.inbox = [];\n this.messageCount = 0;\n this.currentUser = null;\n }\n\n _loadScenario(scenario: MessageScenario, _longContext = false): void {\n const defaultCopy = JSON.parse(JSON.stringify(DEFAULT_STATE));\n\n const generatedIdsData = scenario.generated_ids || [];\n this.generatedIds = new Set(generatedIdsData);\n this.userCount = scenario.user_count || defaultCopy.user_count;\n this.userMap = { ...defaultCopy.user_map, ...scenario.user_map };\n this.inbox = scenario.inbox || defaultCopy.inbox;\n this.messageCount = scenario.message_count || defaultCopy.message_count;\n this.currentUser = scenario.current_user || defaultCopy.current_user;\n }\n\n equals(other: unknown): boolean {\n if (!(other instanceof MessageAPI)) {\n return false;\n }\n\n const excludeKeys = new Set([\"_random\", \"_apiDescription\"]);\n for (const key of Object.keys(this)) {\n if (key.startsWith(\"_\") || excludeKeys.has(key)) {\n continue;\n }\n const thisValue = (this as unknown as Record<string, unknown>)[key];\n const otherValue = (other as unknown as Record<string, unknown>)[key];\n if (thisValue !== otherValue) {\n return false;\n }\n }\n\n return true;\n }\n\n private _generateId(): Record<string, number> {\n let newId = Math.floor(Math.random() * 90_000) + 10_000; // 5 digits\n while (this.generatedIds.has(newId)) {\n newId = Math.floor(Math.random() * 90_000) + 10_000;\n }\n this.generatedIds.add(newId);\n return { new_id: newId };\n }\n\n listUsers(): Record<string, string[]> {\n return { user_list: Object.keys(this.userMap) };\n }\n\n list_users(): Record<string, string[]> {\n return this.listUsers();\n }\n\n getUserId(user: string): Record<string, string | null> {\n if (!(user in this.userMap)) {\n return { error: `User '${user}' not found in the workspace.` };\n }\n return { user_id: this.userMap[user] };\n }\n\n messageLogin(userId: string): Record<string, string | boolean> {\n if (!Object.values(this.userMap).includes(userId)) {\n return { login_status: false, message: `User ID '${userId}' not found.` };\n }\n this.currentUser = userId;\n return {\n login_status: true,\n message: `User '${userId}' logged in successfully.`,\n };\n }\n\n messageGetLoginStatus(): Record<string, boolean> {\n return { login_status: !!this.currentUser };\n }\n\n sendMessage(\n receiverId: string,\n message: string\n ):\n | { error: string }\n | {\n sent_status: boolean;\n message_id: Record<string, number>;\n message: string;\n } {\n if (!this.currentUser) {\n return { error: \"No user is currently logged in.\" };\n }\n if (!Object.values(this.userMap).includes(receiverId)) {\n return { error: `Receiver ID '${receiverId}' not found.` };\n }\n\n const messageId = this._generateId();\n this.inbox.push({ [receiverId]: message });\n this.messageCount += 1;\n return {\n sent_status: true,\n message_id: messageId,\n message: `Message sent to '${receiverId}' successfully.`,\n };\n }\n\n deleteMessage(\n receiverId: string\n ):\n | { error: string }\n | { deleted_status: boolean; receiver_id: string; message: string } {\n if (!this.currentUser) {\n return { error: \"No user is currently logged in.\" };\n }\n\n for (let i = this.inbox.length - 1; i >= 0; i--) {\n const message = this.inbox[i];\n const [receiver] = Object.keys(message);\n if (receiver === receiverId) {\n this.inbox.splice(i, 1);\n return {\n deleted_status: true,\n receiver_id: receiver,\n message: `Receiver ${receiverId}'s latest message deleted successfully.`,\n };\n }\n }\n return { error: `Receiver ID ${receiverId} not found.` };\n }\n\n viewMessagesSent():\n | { error: string }\n | { messages: Record<string, string[]> } {\n if (!this.currentUser) {\n return { error: \"No user is currently logged in.\" };\n }\n\n const sentMessages: Record<string, string[]> = {};\n for (const message of this.inbox) {\n const [receiver, content] = Object.entries(message)[0];\n if (!sentMessages[receiver]) {\n sentMessages[receiver] = [];\n }\n sentMessages[receiver].push(content);\n }\n return { messages: sentMessages };\n }\n\n addContact(\n userName: string\n ):\n | { error: string }\n | { added_status: boolean; user_id: string; message: string } {\n if (userName in this.userMap) {\n return { error: `User name '${userName}' already exists.` };\n }\n this.userCount += 1;\n const userId = `USR${String(this.userCount).padStart(3, \"0\")}`;\n if (Object.values(this.userMap).includes(userId)) {\n return { error: `User ID '${userId}' already exists.` };\n }\n this.userMap[userName] = userId;\n return {\n added_status: true,\n user_id: userId,\n message: `Contact '${userName}' added successfully.`,\n };\n }\n\n searchMessages(\n keyword: string\n ):\n | { error: string }\n | { results: Array<{ receiver_id: string; message: string }> } {\n if (!this.currentUser) {\n return { error: \"No user is currently logged in.\" };\n }\n const keywordLower = keyword.toLowerCase();\n const results: Array<{ receiver_id: string; message: string }> = [];\n\n for (const messageData of this.inbox) {\n const [receiverId, messageContent] = Object.entries(messageData)[0];\n if (messageContent.toLowerCase().includes(keywordLower)) {\n results.push({\n receiver_id: receiverId,\n message: messageContent,\n });\n }\n }\n return { results };\n }\n\n getMessageStats():\n | { error: string }\n | { stats: { received_count: number; total_contacts: number } } {\n if (!this.currentUser) {\n return { error: \"No user is currently logged in.\" };\n }\n const receivedCount = this.inbox.length;\n const contacts = new Set(this.inbox.map((msg) => Object.keys(msg)[0]));\n const totalContacts = contacts.size;\n return {\n stats: {\n received_count: receivedCount,\n total_contacts: totalContacts,\n },\n };\n }\n}\n","interface Ticket {\n id: number;\n title: string;\n description: string;\n status: string;\n priority: number;\n created_by: string;\n resolution?: string;\n [key: string]: string | number | undefined;\n}\n\nexport interface TicketScenario {\n ticket_queue?: Ticket[];\n ticket_counter?: number;\n current_user?: string | null;\n}\n\nconst DEFAULT_STATE: TicketScenario = {\n ticket_queue: [],\n ticket_counter: 1,\n current_user: null,\n};\n\nexport class TicketAPI {\n private ticketQueue: Ticket[];\n private ticketCounter: number;\n private currentUser: string | null;\n\n constructor() {\n this.ticketQueue = [];\n this.ticketCounter = 1;\n this.currentUser = null;\n }\n\n _loadScenario(scenario: TicketScenario, _longContext = false): void {\n const defaultCopy = JSON.parse(\n JSON.stringify(DEFAULT_STATE)\n ) as TicketScenario;\n this.ticketQueue = scenario.ticket_queue ?? defaultCopy.ticket_queue ?? [];\n this.ticketCounter =\n scenario.ticket_counter ?? defaultCopy.ticket_counter ?? 1;\n this.currentUser =\n scenario.current_user ?? defaultCopy.current_user ?? null;\n }\n\n create_ticket(\n title: string,\n description = \"\",\n priority = 1\n ): Ticket | { error: string } {\n if (!this.currentUser) {\n return {\n error: \"User not authenticated. Please log in to create a ticket.\",\n };\n }\n if (priority < 1 || priority > 5) {\n return { error: \"Invalid priority. Priority must be between 1 and 5.\" };\n }\n\n const ticket = {\n id: this.ticketCounter,\n title,\n description,\n status: \"Open\",\n priority,\n created_by: this.currentUser,\n };\n this.ticketQueue.push(ticket);\n this.ticketCounter += 1;\n return ticket;\n }\n\n get_ticket(ticket_id: number): Ticket | { error: string } {\n const ticket = this._findTicket(ticket_id);\n if (!ticket) {\n return { error: `Ticket with ID ${ticket_id} not found.` };\n }\n return ticket;\n }\n\n close_ticket(ticket_id: number): Record<string, string> {\n const ticket = this._findTicket(ticket_id);\n if (!ticket) {\n return { error: `Ticket with ID ${ticket_id} not found.` };\n }\n if (ticket.status === \"Closed\") {\n return { error: `Ticket with ID ${ticket_id} is already closed.` };\n }\n ticket.status = \"Closed\";\n return { status: `Ticket ${ticket_id} has been closed successfully.` };\n }\n\n resolve_ticket(\n ticket_id: number,\n resolution: string\n ): Record<string, string> {\n const ticket = this._findTicket(ticket_id);\n if (!ticket) {\n return { error: `Ticket with ID ${ticket_id} not found.` };\n }\n if (ticket.status === \"Resolved\") {\n return { error: `Ticket with ID ${ticket_id} is already resolved.` };\n }\n ticket.status = \"Resolved\";\n ticket.resolution = resolution;\n return { status: `Ticket ${ticket_id} has been resolved successfully.` };\n }\n\n edit_ticket(\n ticket_id: number,\n updates: Record<string, string | number | null>\n ): Record<string, string> {\n const ticket = this._findTicket(ticket_id);\n if (!ticket) {\n return { error: `Ticket with ID ${ticket_id} not found.` };\n }\n\n const validFields = new Set([\"title\", \"description\", \"status\", \"priority\"]);\n const invalidFields = Object.keys(updates).filter(\n (field) => !validFields.has(field)\n );\n if (invalidFields.length > 0) {\n return {\n error: `Invalid fields for update: ${invalidFields.join(\", \")}`,\n };\n }\n\n for (const [key, value] of Object.entries(updates)) {\n if (value !== null) {\n ticket[key] = value;\n }\n }\n\n return { status: `Ticket ${ticket_id} has been updated successfully.` };\n }\n\n private _findTicket(ticket_id: number): Ticket | undefined {\n return this.ticketQueue.find((ticket) => ticket.id === ticket_id);\n }\n\n ticket_login(username: string, password: string): Record<string, boolean> {\n if (username && password) {\n this.currentUser = username;\n return { success: true };\n }\n return { success: false };\n }\n\n ticket_get_login_status(): Record<string, boolean> {\n return { login_status: !!this.currentUser };\n }\n\n logout(): Record<string, boolean> {\n if (this.currentUser) {\n this.currentUser = null;\n return { success: true };\n }\n return { success: false };\n }\n\n get_user_tickets(status?: string): (Ticket | { error: string })[] {\n if (!this.currentUser) {\n return [\n { error: \"User not authenticated. Please log in to view tickets.\" },\n ];\n }\n\n let userTickets = this.ticketQueue.filter(\n (ticket) => ticket.created_by === this.currentUser\n );\n\n if (status) {\n userTickets = userTickets.filter(\n (ticket) => ticket.status.toLowerCase() === status.toLowerCase()\n );\n }\n\n return userTickets;\n }\n}\n","// TradingBot - Full port from Python\nexport interface TradingScenario {\n orders?: Record<number, OrderInfo>;\n account_info?: AccountInfo;\n authenticated?: boolean;\n market_status?: string;\n order_counter?: number;\n stocks?: Record<string, StockInfo>;\n watch_list?: string[];\n transaction_history?: TransactionInfo[];\n random_seed?: number;\n}\n\ninterface OrderInfo {\n id: number;\n order_type: string;\n symbol: string;\n price: number;\n amount: number;\n status: string;\n [key: string]: string | number;\n}\n\ninterface AccountInfo {\n account_id: number;\n balance: number;\n binding_card: number;\n [key: string]: number;\n}\n\ninterface StockInfo {\n price: number;\n percent_change: number;\n volume: number;\n \"MA(5)\": number;\n \"MA(20)\": number;\n [key: string]: number;\n}\n\ninterface TransactionInfo {\n type: string;\n amount: number;\n timestamp: string;\n}\n\nconst CURRENT_TIME = new Date(2024, 8, 1, 10, 30);\n\nconst DEFAULT_STATE: TradingScenario = {\n orders: {\n 12345: {\n id: 12_345,\n order_type: \"Buy\",\n symbol: \"AAPL\",\n price: 210.65,\n amount: 10,\n status: \"Completed\",\n },\n 12446: {\n id: 12_446,\n order_type: \"Sell\",\n symbol: \"GOOG\",\n price: 2840.56,\n amount: 5,\n status: \"Pending\",\n },\n },\n account_info: {\n account_id: 12_345,\n balance: 10_000.0,\n binding_card: 1_974_202_140_965_533,\n },\n authenticated: false,\n market_status: \"Closed\",\n order_counter: 12_446,\n stocks: {\n AAPL: {\n price: 227.16,\n percent_change: 0.17,\n volume: 2.552,\n \"MA(5)\": 227.11,\n \"MA(20)\": 227.09,\n },\n GOOG: {\n price: 2840.34,\n percent_change: 0.24,\n volume: 1.123,\n \"MA(5)\": 2835.67,\n \"MA(20)\": 2842.15,\n },\n TSLA: {\n price: 667.92,\n percent_change: -0.12,\n volume: 1.654,\n \"MA(5)\": 671.15,\n \"MA(20)\": 668.2,\n },\n MSFT: {\n price: 310.23,\n percent_change: 0.09,\n volume: 3.234,\n \"MA(5)\": 309.88,\n \"MA(20)\": 310.11,\n },\n NVDA: {\n price: 220.34,\n percent_change: 0.34,\n volume: 1.234,\n \"MA(5)\": 220.45,\n \"MA(20)\": 220.67,\n },\n ALPH: {\n price: 1320.45,\n percent_change: -0.08,\n volume: 1.567,\n \"MA(5)\": 1321.12,\n \"MA(20)\": 1325.78,\n },\n OMEG: {\n price: 457.23,\n percent_change: 0.12,\n volume: 2.345,\n \"MA(5)\": 456.78,\n \"MA(20)\": 458.12,\n },\n QUAS: {\n price: 725.89,\n percent_change: -0.03,\n volume: 1.789,\n \"MA(5)\": 726.45,\n \"MA(20)\": 728.0,\n },\n NEPT: {\n price: 88.34,\n percent_change: 0.19,\n volume: 0.654,\n \"MA(5)\": 88.21,\n \"MA(20)\": 88.67,\n },\n SYNX: {\n price: 345.67,\n percent_change: 0.11,\n volume: 2.112,\n \"MA(5)\": 345.34,\n \"MA(20)\": 346.12,\n },\n ZETA: {\n price: 22.09,\n percent_change: -0.05,\n volume: 0.789,\n \"MA(5)\": 22.12,\n \"MA(20)\": 22.34,\n },\n },\n watch_list: [\"NVDA\"],\n transaction_history: [],\n random_seed: 1_053_520,\n};\n\nclass SeededRandom {\n private seed: number;\n constructor(seed: number) {\n this.seed = seed;\n }\n randint(min: number, max: number): number {\n this.seed = (this.seed * 9301 + 49_297) % 233_280;\n return Math.floor(min + (this.seed / 233_280) * (max - min + 1));\n }\n}\n\nexport class TradingBot {\n private orders: Record<number, OrderInfo>;\n private accountInfo: AccountInfo;\n private authenticated: boolean;\n private marketStatus: string;\n private orderCounter: number;\n private stocks: Record<string, StockInfo>;\n private watchList: string[];\n private transactionHistory: TransactionInfo[];\n private _random: SeededRandom;\n\n constructor() {\n this.orders = {};\n this.accountInfo = { account_id: 0, balance: 0, binding_card: 0 };\n this.authenticated = false;\n this.marketStatus = \"Closed\";\n this.orderCounter = 0;\n this.stocks = {};\n this.watchList = [];\n this.transactionHistory = [];\n this._random = new SeededRandom(1_053_520);\n }\n\n _loadScenario(scenario: TradingScenario, _longContext = false): void {\n const defaultCopy = JSON.parse(JSON.stringify(DEFAULT_STATE));\n this.orders = { ...defaultCopy.orders, ...scenario.orders };\n // Convert string keys to numbers\n const convertedOrders: Record<number, OrderInfo> = {};\n for (const [k, v] of Object.entries(this.orders)) {\n const numKey = Number.parseInt(k, 10);\n if (!Number.isNaN(numKey)) {\n convertedOrders[numKey] = v;\n }\n }\n this.orders = convertedOrders;\n\n this.accountInfo = {\n ...defaultCopy.account_info,\n ...scenario.account_info,\n };\n this.authenticated = scenario.authenticated ?? defaultCopy.authenticated;\n this.marketStatus = scenario.market_status ?? defaultCopy.market_status;\n this.orderCounter = scenario.order_counter ?? defaultCopy.order_counter;\n this.stocks = { ...defaultCopy.stocks, ...scenario.stocks };\n this.watchList = scenario.watch_list ?? defaultCopy.watch_list;\n this.transactionHistory =\n scenario.transaction_history ?? defaultCopy.transaction_history;\n this._random = new SeededRandom(\n scenario.random_seed ?? defaultCopy.random_seed\n );\n }\n\n private _generateTransactionTimestamp(): string {\n const startDate = CURRENT_TIME;\n const endDate = new Date(startDate.getTime() + 24 * 60 * 60 * 1000);\n const startTimestamp = Math.floor(startDate.getTime() / 1000);\n const endTimestamp = Math.floor(endDate.getTime() / 1000);\n const randomTimestamp = this._random.randint(startTimestamp, endTimestamp);\n const randomDate = new Date(randomTimestamp * 1000);\n const pad = (n: number) => n.toString().padStart(2, \"0\");\n return `${randomDate.getFullYear()}-${pad(randomDate.getMonth() + 1)}-${pad(randomDate.getDate())} ${pad(randomDate.getHours())}:${pad(randomDate.getMinutes())}:${pad(randomDate.getSeconds())}`;\n }\n\n equals(other: unknown): boolean {\n if (!(other instanceof TradingBot)) {\n return false;\n }\n return (\n JSON.stringify(this.orders) === JSON.stringify(other.orders) &&\n JSON.stringify(this.accountInfo) === JSON.stringify(other.accountInfo) &&\n this.authenticated === other.authenticated &&\n this.marketStatus === other.marketStatus &&\n JSON.stringify(this.watchList) === JSON.stringify(other.watchList)\n );\n }\n\n get_current_time(): Record<string, string> {\n const hours = CURRENT_TIME.getHours();\n const minutes = CURRENT_TIME.getMinutes();\n const ampm = hours >= 12 ? \"PM\" : \"AM\";\n const formattedHours = hours % 12 || 12;\n const formattedMinutes = minutes.toString().padStart(2, \"0\");\n return { current_time: `${formattedHours}:${formattedMinutes} ${ampm}` };\n }\n\n get_symbol_by_name(name: string): Record<string, string> {\n const symbolMap: Record<string, string> = {\n Apple: \"AAPL\",\n Google: \"GOOG\",\n Tesla: \"TSLA\",\n Microsoft: \"MSFT\",\n Nvidia: \"NVDA\",\n \"Zeta Corp\": \"ZETA\",\n \"Alpha Tech\": \"ALPH\",\n \"Omega Industries\": \"OMEG\",\n \"Quasar Ltd.\": \"QUAS\",\n \"Neptune Systems\": \"NEPT\",\n \"Synex Solutions\": \"SYNX\",\n Amazon: \"AMZN\",\n Gorilla: \"GORI\",\n };\n return { symbol: symbolMap[name] ?? \"Stock not found\" };\n }\n\n get_stock_info(symbol: string): Record<string, unknown> {\n if (!(symbol in this.stocks)) {\n return { error: `Stock with symbol '${symbol}' not found.` };\n }\n return this.stocks[symbol];\n }\n\n get_order_details(order_id: number): Record<string, unknown> {\n const orderId = Number(order_id);\n if (!(orderId in this.orders)) {\n return {\n error: `Order with ID ${orderId} not found. Here is the list of orders_id: ${Object.keys(this.orders).join(\", \")}`,\n };\n }\n return this.orders[orderId];\n }\n\n cancel_order(order_id: number): Record<string, unknown> {\n const orderId = Number(order_id);\n if (!(orderId in this.orders)) {\n return { error: `Order with ID ${orderId} not found.` };\n }\n if (this.orders[orderId].status === \"Completed\") {\n return {\n error: `Can't cancel order ${orderId}. Order is already completed.`,\n };\n }\n this.orders[orderId].status = \"Cancelled\";\n return { order_id: orderId, status: \"Cancelled\" };\n }\n\n place_order(\n order_type: string,\n symbol: string,\n price: number,\n amount: number\n ): Record<string, unknown> {\n if (!this.authenticated) {\n return {\n error: \"User not authenticated. Please log in to place an order.\",\n };\n }\n if (!(symbol in this.stocks)) {\n return { error: `Invalid stock symbol: ${symbol}` };\n }\n if (price <= 0 || amount <= 0) {\n return { error: \"Price and amount must be positive values.\" };\n }\n\n if (order_type.toLowerCase() === \"buy\") {\n const totalCost = Number(price) * Number(amount);\n if (totalCost > (this.accountInfo.balance ?? 0)) {\n return {\n error: `Insufficient funds: required $${totalCost.toFixed(2)} but only $${(this.accountInfo.balance ?? 0).toFixed(2)} available.`,\n };\n }\n }\n\n const orderId = this.orderCounter;\n this.orders[orderId] = {\n id: orderId,\n order_type,\n symbol,\n price: Number(price),\n amount: Number(amount),\n status: \"Open\",\n };\n this.orderCounter += 1;\n\n return {\n order_id: orderId,\n order_type,\n status: \"Pending\",\n price: Number(price),\n amount: Number(amount),\n };\n }\n\n withdraw_funds(amount: number): Record<string, unknown> {\n if (!this.authenticated) {\n return {\n error: \"User not authenticated. Please log in to make a transaction.\",\n };\n }\n if (this.marketStatus !== \"Open\") {\n return { error: \"Market is closed. Transactions are not allowed.\" };\n }\n if (amount <= 0) {\n return { error: \"Transaction amount must be positive.\" };\n }\n if (amount > this.accountInfo.balance) {\n return { error: \"Insufficient funds for withdrawal.\" };\n }\n\n this.accountInfo.balance -= amount;\n this.transactionHistory.push({\n type: \"withdrawal\",\n amount,\n timestamp: this._generateTransactionTimestamp(),\n });\n return {\n status: \"Withdrawal successful\",\n new_balance: this.accountInfo.balance,\n };\n }\n\n get_account_info(): Record<string, unknown> {\n if (!this.authenticated) {\n return {\n error:\n \"User not authenticated. Please log in to view account information.\",\n };\n }\n return this.accountInfo;\n }\n\n trading_login(_username: string, _password: string): Record<string, string> {\n if (this.authenticated) {\n return { status: \"Already logged in\" };\n }\n this.authenticated = true;\n return { status: \"Logged in successfully\" };\n }\n\n trading_get_login_status(): Record<string, boolean> {\n return { status: this.authenticated };\n }\n\n trading_logout(): Record<string, string> {\n if (!this.authenticated) {\n return { status: \"No user is currently logged in\" };\n }\n this.authenticated = false;\n return { status: \"Logged out successfully\" };\n }\n\n fund_account(amount: number): Record<string, unknown> {\n if (!this.authenticated) {\n return {\n error: \"User not authenticated. Please log in to fund the account.\",\n };\n }\n if (amount <= 0) {\n return { error: \"Funding amount must be positive.\" };\n }\n this.accountInfo.balance += amount;\n this.transactionHistory.push({\n type: \"deposit\",\n amount,\n timestamp: this._generateTransactionTimestamp(),\n });\n return {\n status: \"Account funded successfully\",\n new_balance: this.accountInfo.balance,\n };\n }\n\n remove_stock_from_watchlist(symbol: string): Record<string, string> {\n if (!this.authenticated) {\n return {\n error: \"User not authenticated. Please log in to modify the watchlist.\",\n };\n }\n const idx = this.watchList.indexOf(symbol);\n if (idx === -1) {\n return { error: `Stock ${symbol} not found in watchlist.` };\n }\n this.watchList.splice(idx, 1);\n return { status: `Stock ${symbol} removed from watchlist successfully.` };\n }\n\n get_watchlist(): Record<string, unknown> {\n if (!this.authenticated) {\n return {\n error: \"User not authenticated. Please log in to view the watchlist.\",\n };\n }\n return { watchlist: this.watchList };\n }\n\n get_order_history(): Record<string, unknown> {\n if (!this.authenticated) {\n return {\n error: \"User not authenticated. Please log in to view order history.\",\n };\n }\n return { history: Object.keys(this.orders).map(Number) };\n }\n\n get_transaction_history(\n start_date?: string,\n end_date?: string\n ): Record<string, unknown> {\n if (!this.authenticated) {\n return {\n error:\n \"User not authenticated. Please log in to view transaction history.\",\n };\n }\n\n const start = start_date ? new Date(start_date) : new Date(0);\n const end = end_date ? new Date(end_date) : new Date(8_640_000_000_000_000);\n\n const filteredHistory = this.transactionHistory.filter((t) => {\n const txDate = new Date(t.timestamp);\n return txDate >= start && txDate <= end;\n });\n\n return { transaction_history: filteredHistory };\n }\n\n get_available_stocks(sector: string): Record<string, string[]> {\n const sectorMap: Record<string, string[]> = {\n Technology: [\"AAPL\", \"GOOG\", \"MSFT\", \"NVDA\"],\n Automobile: [\"TSLA\", \"F\", \"GM\"],\n };\n return { stock_list: sectorMap[sector] ?? [] };\n }\n\n filter_stocks_by_price(\n stocks: string[],\n min_price: number,\n max_price: number\n ): Record<string, string[]> {\n const filteredStocks = stocks.filter((symbol) => {\n const stock = this.stocks[symbol];\n if (!stock) {\n return false;\n }\n return stock.price >= min_price && stock.price <= max_price;\n });\n return { filtered_stocks: filteredStocks };\n }\n\n add_to_watchlist(stock: string): Record<string, string[]> {\n if (!this.watchList.includes(stock) && stock in this.stocks) {\n this.watchList.push(stock);\n }\n return { watchlist: this.watchList };\n }\n\n notify_price_change(\n stocks: string[],\n threshold: number\n ): Record<string, string> {\n const changedStocks = stocks.filter((symbol) => {\n const stock = this.stocks[symbol];\n if (!stock) {\n return false;\n }\n return Math.abs(stock.percent_change) >= threshold;\n });\n\n if (changedStocks.length > 0) {\n return {\n notification: `Stocks ${changedStocks.join(\", \")} have significant price changes.`,\n };\n }\n return {\n notification: \"No significant price changes in the selected stocks.\",\n };\n }\n\n // Aliases for camelCase compatibility\n placeOrder = this.place_order.bind(this);\n getAccountInfo = this.get_account_info.bind(this);\n tradingLogin = this.trading_login.bind(this);\n tradingGetLoginStatus = this.trading_get_login_status.bind(this);\n getOrderHistory = this.get_order_history.bind(this);\n}\n","const DIGIT_REGEX = /\\d/;\nconst DATE_FORMAT_REGEX = /^\\d{4}-\\d{2}-\\d{2}$/;\n\nexport interface TravelScenario {\n random_seed?: number;\n credit_card_list?: Record<string, CreditCard>;\n booking_record?: Record<string, BookingRecord>;\n access_token?: string;\n token_type?: string;\n token_expires_in?: number;\n token_scope?: string;\n user_first_name?: string;\n user_last_name?: string;\n budget_limit?: number;\n}\n\ninterface CreditCard {\n card_number: string;\n expiration_date: string;\n cardholder_name: string;\n card_verification_number: number;\n balance: number;\n}\n\ninterface BookingRecord {\n card_id: string;\n travel_date: string;\n travel_from: string;\n travel_to: string;\n travel_class: string;\n travel_cost: number;\n transaction_id: string;\n}\n\ninterface FlightCostEntry {\n cost: number;\n}\n\nconst DEFAULT_STATE: TravelScenario = {\n random_seed: 141_053,\n credit_card_list: {},\n booking_record: {},\n access_token: undefined,\n token_type: undefined,\n token_expires_in: undefined,\n token_scope: undefined,\n user_first_name: undefined,\n user_last_name: undefined,\n budget_limit: undefined,\n};\n\nconst BASE_COSTS: Map<string, number> = new Map([\n [\"SFO|LAX\", 200],\n [\"SFO|JFK\", 500],\n [\"SFO|ORD\", 400],\n [\"SFO|BOS\", 450],\n [\"SFO|RMS\", 300],\n [\"SFO|SBK\", 350],\n [\"SFO|MPC\", 370],\n [\"SFO|SVP\", 320],\n [\"SFO|SHD\", 330],\n [\"SFO|SSV\", 340],\n [\"SFO|OKD\", 360],\n [\"SFO|WLB\", 310],\n [\"SFO|CRH\", 380],\n [\"SFO|ATV\", 390],\n [\"SFO|PHV\", 420],\n [\"SFO|GFD\", 430],\n [\"SFO|CIA\", 700],\n [\"LAX|SFO\", 100],\n [\"LAX|JFK\", 600],\n [\"LAX|ORD\", 500],\n [\"LAX|BOS\", 550],\n [\"LAX|RMS\", 310],\n [\"LAX|SBK\", 320],\n [\"LAX|MPC\", 330],\n [\"LAX|SVP\", 340],\n [\"LAX|SHD\", 350],\n [\"LAX|SSV\", 360],\n [\"LAX|OKD\", 370],\n [\"LAX|WLB\", 380],\n [\"LAX|CRH\", 390],\n [\"LAX|ATV\", 400],\n [\"LAX|PHV\", 410],\n [\"LAX|GFD\", 420],\n [\"LAX|HND\", 430],\n [\"JFK|ORD\", 300],\n [\"JFK|BOS\", 250],\n [\"JFK|RMS\", 450],\n [\"JFK|SBK\", 460],\n [\"JFK|MPC\", 470],\n [\"JFK|SVP\", 480],\n [\"JFK|SHD\", 490],\n [\"JFK|SSV\", 500],\n [\"JFK|OKD\", 510],\n [\"JFK|WLB\", 520],\n [\"JFK|CRH\", 530],\n [\"JFK|ATV\", 540],\n [\"JFK|PHV\", 550],\n [\"JFK|GFD\", 560],\n [\"JFK|LAX\", 570],\n [\"JFK|HND\", 800],\n [\"JFK|PVG\", 950],\n [\"JFK|PEK\", 1000],\n [\"ORD|LAX\", 180],\n [\"ORD|BOS\", 200],\n [\"ORD|RMS\", 350],\n [\"ORD|SBK\", 360],\n [\"ORD|MPC\", 370],\n [\"ORD|SVP\", 380],\n [\"ORD|SHD\", 390],\n [\"ORD|SSV\", 400],\n [\"ORD|OKD\", 410],\n [\"ORD|WLB\", 420],\n [\"ORD|CRH\", 430],\n [\"ORD|ATV\", 440],\n [\"ORD|PHV\", 450],\n [\"ORD|GFD\", 460],\n [\"BOS|RMS\", 400],\n [\"BOS|SBK\", 410],\n [\"BOS|MPC\", 420],\n [\"BOS|SVP\", 430],\n [\"BOS|SHD\", 440],\n [\"BOS|SSV\", 450],\n [\"BOS|OKD\", 460],\n [\"BOS|WLB\", 470],\n [\"BOS|CRH\", 480],\n [\"BOS|ATV\", 490],\n [\"BOS|PHV\", 500],\n [\"BOS|GFD\", 510],\n [\"RMS|BOS\", 200],\n [\"RMS|JFK\", 210],\n [\"RMS|SBK\", 220],\n [\"RMS|MPC\", 230],\n [\"RMS|SVP\", 240],\n [\"RMS|SHD\", 250],\n [\"RMS|SSV\", 260],\n [\"RMS|OKD\", 270],\n [\"RMS|WLB\", 280],\n [\"RMS|CRH\", 290],\n [\"RMS|ATV\", 300],\n [\"RMS|PHV\", 310],\n [\"RMS|GFD\", 320],\n [\"RMS|LAX\", 330],\n [\"SBK|MPC\", 200],\n [\"SBK|SVP\", 210],\n [\"SBK|SHD\", 220],\n [\"SBK|SSV\", 230],\n [\"SBK|OKD\", 240],\n [\"SBK|WLB\", 250],\n [\"SBK|CRH\", 260],\n [\"SBK|ATV\", 270],\n [\"SBK|PHV\", 280],\n [\"SBK|GFD\", 290],\n [\"MPC|SVP\", 210],\n [\"MPC|SHD\", 220],\n [\"MPC|SSV\", 230],\n [\"MPC|OKD\", 240],\n [\"MPC|WLB\", 250],\n [\"MPC|CRH\", 260],\n [\"MPC|ATV\", 270],\n [\"MPC|PHV\", 280],\n [\"MPC|GFD\", 290],\n [\"SVP|SHD\", 230],\n [\"SVP|SSV\", 240],\n [\"SVP|OKD\", 250],\n [\"SVP|WLB\", 260],\n [\"SVP|CRH\", 270],\n [\"SVP|ATV\", 280],\n [\"SVP|PHV\", 290],\n [\"SVP|GFD\", 300],\n [\"SHD|SSV\", 220],\n [\"SHD|OKD\", 230],\n [\"SHD|WLB\", 240],\n [\"SHD|CRH\", 250],\n [\"SHD|ATV\", 260],\n [\"SHD|PHV\", 270],\n [\"SHD|GFD\", 280],\n [\"SSV|OKD\", 240],\n [\"SSV|WLB\", 250],\n [\"SSV|CRH\", 260],\n [\"SSV|ATV\", 270],\n [\"SSV|PHV\", 280],\n [\"SSV|GFD\", 290],\n [\"OKD|WLB\", 230],\n [\"OKD|CRH\", 240],\n [\"OKD|ATV\", 250],\n [\"OKD|PHV\", 260],\n [\"OKD|GFD\", 270],\n [\"WLB|CRH\", 250],\n [\"WLB|ATV\", 260],\n [\"WLB|PHV\", 270],\n [\"WLB|GFD\", 280],\n [\"CRH|ATV\", 240],\n [\"CRH|PHV\", 250],\n [\"CRH|GFD\", 260],\n [\"CRH|SFO\", 270],\n [\"CRH|RMS\", 280],\n [\"CRH|HKG\", 290],\n [\"CRH|JFK\", 300],\n [\"ATV|PHV\", 230],\n [\"ATV|GFD\", 240],\n [\"PHV|GFD\", 220],\n [\"LHR|CDG\", 100],\n [\"OKD|LAX\", 220],\n]);\n\nconst AIRPORT_MAP: Record<string, string> = {\n Rivermist: \"RMS\",\n Stonebrook: \"SBK\",\n Maplecrest: \"MPC\",\n Silverpine: \"SVP\",\n Shadowridge: \"SHD\",\n London: \"LHR\",\n Paris: \"CDG\",\n \"Sunset Valley\": \"SSV\",\n Oakendale: \"OKD\",\n Willowbend: \"WLB\",\n \"Crescent Hollow\": \"CRH\",\n Autumnville: \"ATV\",\n Pinehaven: \"PHV\",\n Greenfield: \"GFD\",\n \"San Francisco\": \"SFO\",\n \"Los Angeles\": \"LAX\",\n \"New York\": \"JFK\",\n Chicago: \"ORD\",\n Boston: \"BOS\",\n Beijing: \"PEK\",\n \"Hong Kong\": \"HKG\",\n Rome: \"CIA\",\n Tokyo: \"HND\",\n};\n\nconst EXCHANGE_RATES: Map<string, number> = new Map([\n [\"USD|RMB\", 7],\n [\"USD|EUR\", 0.8],\n [\"USD|JPY\", 110],\n [\"USD|GBP\", 0.7],\n [\"USD|CAD\", 1.3],\n [\"USD|AUD\", 1.4],\n [\"USD|INR\", 70],\n [\"USD|RUB\", 60],\n [\"USD|BRL\", 3.8],\n [\"USD|MXN\", 20],\n]);\n\nconst ALL_AIRPORTS = [\n \"RMS\",\n \"SBK\",\n \"MPC\",\n \"SVP\",\n \"SHD\",\n \"CDG\",\n \"LHR\",\n \"SSV\",\n \"OKD\",\n \"WLB\",\n \"PEK\",\n \"HND\",\n \"HKG\",\n \"CIA\",\n \"CRH\",\n \"ATV\",\n \"PHV\",\n \"GFD\",\n \"SFO\",\n \"LAX\",\n \"JFK\",\n \"ORD\",\n \"BOS\",\n];\n\nclass SeededRandom {\n private seed: number;\n\n constructor(seed: number) {\n this.seed = seed;\n }\n\n next(): number {\n // biome-ignore lint/suspicious/noBitwiseOperators: Linear congruential generator requires bitwise AND for 32-bit overflow\n this.seed = (this.seed * 1_103_515_245 + 12_345) & 0x7f_ff_ff_ff;\n return this.seed;\n }\n\n randInt(min: number, max: number): number {\n return min + (this.next() % (max - min + 1));\n }\n}\n\nexport class TravelAPI {\n creditCardList: Record<string, CreditCard>;\n bookingRecord: Record<string, BookingRecord>;\n accessToken?: string;\n tokenType?: string;\n tokenExpiresIn?: number;\n tokenScope?: string;\n userFirstName?: string;\n userLastName?: string;\n budgetLimit?: number;\n longContext = false;\n private _random: SeededRandom;\n private readonly _flightCostLookup: Map<string, FlightCostEntry> = new Map();\n\n constructor() {\n this.creditCardList = {};\n this.bookingRecord = {};\n this._random = new SeededRandom(DEFAULT_STATE.random_seed ?? 141_053);\n }\n\n _loadScenario(scenario: TravelScenario, longContext = false): void {\n const defaultCopy = JSON.parse(JSON.stringify(DEFAULT_STATE));\n this._random = new SeededRandom(\n scenario.random_seed ?? defaultCopy.random_seed\n );\n\n this.creditCardList =\n scenario.credit_card_list ?? defaultCopy.credit_card_list;\n this.bookingRecord = scenario.booking_record ?? defaultCopy.booking_record;\n this.accessToken = scenario.access_token ?? defaultCopy.access_token;\n this.tokenType = scenario.token_type ?? defaultCopy.token_type;\n this.tokenExpiresIn =\n scenario.token_expires_in ?? defaultCopy.token_expires_in;\n this.tokenScope = scenario.token_scope ?? defaultCopy.token_scope;\n this.userFirstName =\n scenario.user_first_name ?? defaultCopy.user_first_name;\n this.userLastName = scenario.user_last_name ?? defaultCopy.user_last_name;\n this.budgetLimit = scenario.budget_limit ?? defaultCopy.budget_limit;\n this.longContext = longContext;\n }\n\n authenticateTravel(\n _clientId: string,\n _clientSecret: string,\n _refreshToken: string,\n grantType: string,\n userFirstName: string,\n userLastName: string\n ): Record<string, unknown> {\n this.tokenExpiresIn = 2;\n this.accessToken = String(this._random.randInt(100_000, 999_999));\n this.tokenType = \"Bearer\";\n this.tokenScope = grantType;\n this.userFirstName = userFirstName;\n this.userLastName = userLastName;\n return {\n expires_in: 2,\n access_token: this.accessToken,\n token_type: \"Bearer\",\n scope: grantType,\n };\n }\n\n travelGetLoginStatus(): Record<string, boolean> {\n const isNotLoggedIn =\n this.tokenExpiresIn === undefined || this.tokenExpiresIn === 0;\n return { status: !isNotLoggedIn };\n }\n\n getBudgetFiscalYear(\n _lastModifiedAfter?: string,\n _includeRemoved?: string\n ): Record<string, string> {\n return { budget_fiscal_year: \"2018\" };\n }\n\n registerCreditCard(\n accessToken: string,\n cardNumber: string,\n expirationDate: string,\n cardholderName: string,\n cardVerificationNumber: number\n ): Record<string, unknown> {\n if (this.tokenExpiresIn === undefined) {\n return { error: \"Token not initialized\" };\n }\n if (this.tokenExpiresIn === 0) {\n return { error: \"Token expired\" };\n }\n if (accessToken !== this.accessToken) {\n return { error: \"Invalid access token\" };\n }\n if (cardNumber in this.creditCardList) {\n return { error: \"Card already registered\" };\n }\n\n const cardId = String(\n this._random.randInt(100_000_000_000, 999_999_999_999)\n );\n this.creditCardList[cardId] = {\n card_number: cardNumber,\n expiration_date: expirationDate,\n cardholder_name: cardholderName,\n card_verification_number: cardVerificationNumber,\n balance: this._random.randInt(10_000, 99_999),\n };\n return { card_id: cardId };\n }\n\n getFlightCost(\n travelFrom: string,\n travelTo: string,\n travelDate: string,\n travelClass: string\n ): Record<string, number[]> {\n const key = `${travelFrom}|${travelTo}`;\n const baseCost = BASE_COSTS.get(key);\n\n if (baseCost === undefined) {\n throw new Error(\"No available route for the given airports.\");\n }\n\n let factor = 1;\n if (travelClass === \"economy\") {\n factor = 1;\n } else if (travelClass === \"business\") {\n factor = 2;\n } else if (travelClass === \"first\") {\n factor = 5;\n } else {\n throw new Error(\n \"Invalid travel class. Options are: economy, business, first.\"\n );\n }\n\n const digitSum = travelDate\n .split(\"\")\n .filter((c) => DIGIT_REGEX.test(c))\n .reduce((sum, c) => sum + Number.parseInt(c, 10), 0);\n const travelDateMultiplier = digitSum % 2 === 0 ? 2 : 1;\n\n const travelCost = baseCost * factor * travelDateMultiplier;\n\n const travelCostList: number[] = [];\n if (this.longContext) {\n this._flightCostLookup.clear();\n for (const [route, base] of BASE_COSTS.entries()) {\n const cost = base * factor * travelDateMultiplier;\n const [from, to] = route.split(\"|\");\n const cacheKey = `${from}|${to}|${travelClass}|${travelDate}`;\n this._flightCostLookup.set(cacheKey, { cost });\n travelCostList.push(cost);\n }\n } else {\n travelCostList.push(travelCost);\n const cacheKey = `${travelFrom}|${travelTo}|${travelClass}|${travelDate}`;\n this._flightCostLookup.set(cacheKey, { cost: travelCost });\n }\n\n return { travel_cost_list: travelCostList };\n }\n\n getCreditCardBalance(\n accessToken: string,\n cardId: string\n ): Record<string, unknown> {\n if (this.tokenExpiresIn === 0) {\n return { error: \"Token expired\" };\n }\n if (accessToken !== this.accessToken) {\n return { error: \"Invalid access token\" };\n }\n if (!(cardId in this.creditCardList)) {\n return {\n error: `Card not registered. Here are a list of card_id's: ${Object.keys(this.creditCardList).join(\", \")}`,\n };\n }\n return { card_balance: this.creditCardList[cardId].balance };\n }\n\n bookFlight(\n accessToken: string,\n cardId: string,\n travelDate: string,\n travelFrom: string,\n travelTo: string,\n travelClass: string\n ): Record<string, unknown> {\n if (this.tokenExpiresIn === 0) {\n return { booking_status: false, error: \"Token expired\" };\n }\n if (accessToken !== this.accessToken) {\n return { booking_status: false, error: \"Invalid access token\" };\n }\n if (!(cardId in this.creditCardList)) {\n return { booking_status: false, error: \"Card not registered\" };\n }\n if (!(\"balance\" in this.creditCardList[cardId])) {\n return { booking_status: false, error: \"Balance not found\" };\n }\n\n const allAirports = this.listAllAirports();\n if (!allAirports.includes(travelFrom)) {\n return {\n booking_status: false,\n error: `Invalid departure airport code: ${travelFrom}`,\n };\n }\n if (!allAirports.includes(travelTo)) {\n return {\n booking_status: false,\n error: `Invalid destination airport code: ${travelTo}`,\n };\n }\n\n if (!DATE_FORMAT_REGEX.test(travelDate)) {\n return {\n booking_status: false,\n error: \"Invalid date format. Use YYYY-MM-DD.\",\n };\n }\n\n const validClasses = new Set([\"economy\", \"business\", \"first\"]);\n if (!validClasses.has(travelClass)) {\n return {\n booking_status: false,\n error: `Invalid travel class. Must be one of ${[...validClasses].join(\", \")}`,\n };\n }\n\n try {\n this.getFlightCost(travelFrom, travelTo, travelDate, travelClass);\n const cacheKey = `${travelFrom}|${travelTo}|${travelClass}|${travelDate}`;\n const travelCostEntry = this._flightCostLookup.get(cacheKey);\n if (!travelCostEntry) {\n return {\n booking_status: false,\n error: \"No available route for the given parameters\",\n };\n }\n const travelCost = travelCostEntry.cost;\n\n if (this.creditCardList[cardId].balance < travelCost) {\n return { booking_status: false, error: \"Insufficient funds\" };\n }\n if (\n this.budgetLimit !== undefined &&\n this.creditCardList[cardId].balance < this.budgetLimit\n ) {\n return {\n booking_status: false,\n error: \"Balance is less than budget limit\",\n };\n }\n\n this.creditCardList[cardId].balance -= travelCost;\n const bookingId = String(this._random.randInt(1_000_000, 9_999_999));\n const transactionId = String(\n this._random.randInt(10_000_000, 99_999_999)\n );\n\n this.bookingRecord[bookingId] = {\n card_id: cardId,\n travel_date: travelDate,\n travel_from: travelFrom,\n travel_to: travelTo,\n travel_class: travelClass,\n travel_cost: travelCost,\n transaction_id: transactionId,\n };\n\n if (this.longContext) {\n return {\n booking_id: bookingId,\n transaction_id: transactionId,\n booking_status: true,\n booking_history: this.bookingRecord,\n };\n }\n return {\n booking_id: bookingId,\n transaction_id: transactionId,\n booking_status: true,\n booking_history: {},\n };\n } catch (e) {\n return { booking_status: false, error: String(e) };\n }\n }\n\n retrieveInvoice(\n accessToken: string,\n bookingId?: string,\n _insuranceId?: string\n ): Record<string, unknown> {\n if (this.tokenExpiresIn === 0) {\n return { error: \"Token expired\" };\n }\n if (accessToken !== this.accessToken) {\n return { error: \"Invalid access token\" };\n }\n if (!(bookingId && bookingId in this.bookingRecord)) {\n return { error: \"Booking not found\" };\n }\n const booking = this.bookingRecord[bookingId];\n return {\n invoice: {\n booking_id: bookingId,\n travel_date: booking.travel_date,\n travel_from: booking.travel_from,\n travel_to: booking.travel_to,\n travel_class: booking.travel_class,\n travel_cost: booking.travel_cost,\n transaction_id: booking.transaction_id,\n },\n };\n }\n\n getBookingHistory(accessToken: string): Record<string, unknown> {\n if (this.tokenExpiresIn === 0) {\n return { error: \"Token expired\" };\n }\n if (accessToken !== this.accessToken) {\n return { error: \"Invalid access token\" };\n }\n return { booking_history: JSON.parse(JSON.stringify(this.bookingRecord)) };\n }\n\n listAllAirports(): string[] {\n return ALL_AIRPORTS;\n }\n\n cancelBooking(\n accessToken: string,\n bookingId: string\n ): Record<string, unknown> {\n if (this.tokenExpiresIn === 0) {\n return { cancel_status: false, error: \"Token expired\" };\n }\n if (accessToken !== this.accessToken) {\n return { cancel_status: false, error: \"Invalid access token\" };\n }\n if (!(bookingId in this.bookingRecord)) {\n return { cancel_status: false, error: \"Booking not found\" };\n }\n const cardId = this.bookingRecord[bookingId].card_id;\n const travelCost = this.bookingRecord[bookingId].travel_cost;\n this.creditCardList[cardId].balance += travelCost;\n delete this.bookingRecord[bookingId];\n return { cancel_status: true };\n }\n\n computeExchangeRate(\n baseCurrency: string,\n targetCurrency: string,\n value: number\n ): Record<string, number> {\n const forwardKey = `${baseCurrency}|${targetCurrency}`;\n const reverseKey = `${targetCurrency}|${baseCurrency}`;\n\n const forwardRate = EXCHANGE_RATES.get(forwardKey);\n if (forwardRate !== undefined) {\n return { exchanged_value: value * forwardRate };\n }\n const reverseRate = EXCHANGE_RATES.get(reverseKey);\n if (reverseRate !== undefined) {\n return { exchanged_value: Math.round((value / reverseRate) * 100) / 100 };\n }\n throw new Error(\"No available exchange rate for the given currencies.\");\n }\n\n verifyTravelerInformation(\n firstName: string,\n lastName: string,\n dateOfBirth: string,\n passportNumber: string\n ): Record<string, unknown> {\n if (this.userFirstName !== firstName || this.userLastName !== lastName) {\n return {\n verification_status: false,\n verification_failure: `Cannot book flight information for another user. Expected ${this.userFirstName} ${this.userLastName}, got ${firstName} ${lastName}`,\n };\n }\n\n if (!DATE_FORMAT_REGEX.test(dateOfBirth)) {\n return {\n verification_status: false,\n verification_failure:\n \"Invalid date of birth format. Please use YYYY-MM-DD.\",\n };\n }\n\n const birthDate = new Date(dateOfBirth);\n const today = new Date();\n let age = today.getFullYear() - birthDate.getFullYear();\n const monthDiff = today.getMonth() - birthDate.getMonth();\n if (\n monthDiff < 0 ||\n (monthDiff === 0 && today.getDate() < birthDate.getDate())\n ) {\n age--;\n }\n\n if (age < 18) {\n return {\n verification_status: false,\n verification_failure: \"Traveler must be at least 18 years old.\",\n };\n }\n\n if (!passportNumber.startsWith(\"US\")) {\n return {\n verification_status: false,\n verification_failure: \"Passport must be issued by the United States.\",\n };\n }\n\n return { verification_status: true };\n }\n\n setBudgetLimit(\n accessToken: string,\n budgetLimit: number\n ): Record<string, unknown> {\n if (this.tokenExpiresIn === 0) {\n return { error: \"Token expired\" };\n }\n if (accessToken !== this.accessToken) {\n return { error: \"Invalid access token\" };\n }\n this.budgetLimit = Number(budgetLimit);\n return { budget_limit: this.budgetLimit };\n }\n\n getNearestAirportByCity(location: string): Record<string, string> {\n return { nearest_airport: AIRPORT_MAP[location] ?? \"Unknown\" };\n }\n\n purchaseInsurance(\n accessToken: string,\n _insuranceType: string,\n bookingId: string,\n insuranceCost: number,\n cardId: string\n ): Record<string, unknown> {\n if (this.tokenExpiresIn === 0) {\n return { insurance_status: false, error: \"Token expired\" };\n }\n if (accessToken !== this.accessToken) {\n return { insurance_status: false, error: \"Invalid access token\" };\n }\n if (this.budgetLimit !== undefined && this.budgetLimit < insuranceCost) {\n return { insurance_status: false, error: \"Exceeded budget limit\" };\n }\n if (!(bookingId in this.bookingRecord)) {\n return { insurance_status: false, error: \"Booking not found\" };\n }\n if (!(cardId in this.creditCardList)) {\n return { insurance_status: false, error: \"Credit card not registered\" };\n }\n this.creditCardList[cardId].balance -= insuranceCost;\n return {\n insurance_id: String(this._random.randInt(100_000_000, 999_999_999)),\n insurance_status: true,\n };\n }\n\n contactCustomerSupport(\n bookingId: string,\n _message: string\n ): Record<string, string> {\n if (!(bookingId in this.bookingRecord)) {\n return { error: \"Booking not found\" };\n }\n return {\n customer_support_message:\n \"Thank you for contacting customer support. Your message has been received and we will get back to you shortly.\",\n };\n }\n\n getAllCreditCards(): Record<string, unknown> {\n return { credit_card_list: this.creditCardList };\n }\n}\n","export interface Tweet {\n id: number;\n username: string;\n content: string;\n tags: string[];\n mentions: string[];\n}\n\nexport interface Comment {\n username: string;\n content: string;\n}\n\nexport interface TwitterScenario {\n username?: string;\n password?: string;\n authenticated?: boolean;\n tweets?: Record<number, Tweet>;\n comments?: Record<number, Comment[]>;\n retweets?: Record<string, number[]>;\n following_list?: string[];\n tweet_counter?: number;\n}\n\nconst DEFAULT_STATE: Required<TwitterScenario> = {\n username: \"john\",\n password: \"john123\",\n authenticated: false,\n tweets: {},\n comments: {},\n retweets: {},\n following_list: [\"alice\", \"bob\"],\n tweet_counter: 0,\n};\n\nexport class TwitterAPI {\n private username: string;\n private password: string;\n private authenticated: boolean;\n private tweets: Record<number, Tweet>;\n private comments: Record<number, Comment[]>;\n private retweets: Record<string, number[]>;\n private followingList: string[];\n private tweetCounter: number;\n\n constructor() {\n this.username = \"john\";\n this.password = \"john123\";\n this.authenticated = false;\n this.tweets = {};\n this.comments = {};\n this.retweets = {};\n this.followingList = [];\n this.tweetCounter = 0;\n }\n\n _loadScenario(scenario: TwitterScenario, _longContext = false): void {\n const defaultCopy: Required<TwitterScenario> = JSON.parse(\n JSON.stringify(DEFAULT_STATE)\n );\n this.username = scenario.username ?? defaultCopy.username;\n this.password = scenario.password ?? defaultCopy.password;\n this.authenticated = scenario.authenticated ?? defaultCopy.authenticated;\n this.tweets = scenario.tweets ?? defaultCopy.tweets;\n // Convert tweet keys from string to int from loaded scenario\n this.tweets = Object.fromEntries(\n Object.entries(this.tweets).map(([k, v]) => [Number.parseInt(k, 10), v])\n );\n this.comments = scenario.comments ?? defaultCopy.comments;\n this.retweets = scenario.retweets ?? defaultCopy.retweets;\n this.followingList = scenario.following_list ?? defaultCopy.following_list;\n this.tweetCounter = scenario.tweet_counter ?? defaultCopy.tweet_counter;\n }\n\n authenticate_twitter(\n username: string,\n password: string\n ): Record<string, boolean> {\n if (username === this.username && password === this.password) {\n this.authenticated = true;\n return { authentication_status: true };\n }\n return { authentication_status: false };\n }\n\n posting_get_login_status(): Record<string, boolean | string> {\n return { login_status: !!this.authenticated };\n }\n\n post_tweet(\n content: string,\n tags: string[] = [],\n mentions: string[] = []\n ): Tweet | { error: string } {\n if (!this.authenticated) {\n return {\n error: \"User not authenticated. Please authenticate before posting.\",\n };\n }\n\n const tweet = {\n id: this.tweetCounter,\n username: this.username,\n content,\n tags,\n mentions,\n };\n this.tweets[this.tweetCounter] = tweet;\n this.tweetCounter += 1;\n return tweet;\n }\n\n retweet(tweetId: number): Record<string, string> {\n if (!this.authenticated) {\n return {\n error: \"User not authenticated. Please authenticate before retweeting.\",\n };\n }\n\n if (!(tweetId in this.tweets)) {\n return { error: `Tweet with ID ${tweetId} not found.` };\n }\n\n if (!(this.username in this.retweets)) {\n this.retweets[this.username] = [];\n }\n\n if (this.retweets[this.username].includes(tweetId)) {\n return { retweet_status: \"Already retweeted\" };\n }\n\n this.retweets[this.username].push(tweetId);\n return { retweet_status: \"Successfully retweeted\" };\n }\n\n comment(tweetId: number, commentContent: string): Record<string, string> {\n if (!this.authenticated) {\n return {\n error: \"User not authenticated. Please authenticate before commenting.\",\n };\n }\n\n if (!(tweetId in this.tweets)) {\n return { error: `Tweet with ID ${tweetId} not found.` };\n }\n\n if (!(tweetId in this.comments)) {\n this.comments[tweetId] = [];\n }\n\n this.comments[tweetId].push({\n username: this.username,\n content: commentContent,\n });\n return { comment_status: \"Comment added successfully\" };\n }\n\n mention(\n tweetId: number,\n mentionedUsernames: string[]\n ): Record<string, string> {\n if (!(tweetId in this.tweets)) {\n return { error: `Tweet with ID ${tweetId} not found.` };\n }\n\n const tweet = this.tweets[tweetId];\n tweet.mentions.push(...mentionedUsernames);\n\n return { mention_status: \"Users mentioned successfully\" };\n }\n\n follow_user(\n username_to_follow: string\n ): { error: string } | { follow_status: boolean } {\n if (!this.authenticated) {\n return {\n error: \"User not authenticated. Please authenticate before following.\",\n };\n }\n\n if (this.followingList.includes(username_to_follow)) {\n return { follow_status: false };\n }\n\n this.followingList.push(username_to_follow);\n return { follow_status: true };\n }\n\n list_all_following(): { error: string } | { following_list: string[] } {\n if (!this.authenticated) {\n return {\n error:\n \"User not authenticated. Please authenticate before listing following.\",\n };\n }\n return { following_list: this.followingList };\n }\n\n unfollow_user(\n username_to_unfollow: string\n ): { error: string } | { unfollow_status: boolean } {\n if (!this.authenticated) {\n return {\n error:\n \"User not authenticated. Please authenticate before unfollowing.\",\n };\n }\n\n if (!this.followingList.includes(username_to_unfollow)) {\n return { unfollow_status: false };\n }\n\n this.followingList = this.followingList.filter(\n (u) => u !== username_to_unfollow\n );\n return { unfollow_status: true };\n }\n\n get_tweet(tweet_id: number): Tweet | { error: string } {\n if (!(tweet_id in this.tweets)) {\n return { error: `Tweet with ID ${tweet_id} not found.` };\n }\n\n return this.tweets[tweet_id];\n }\n\n get_user_tweets(username: string): Tweet[] {\n return Object.values(this.tweets).filter(\n (tweet) => tweet.username === username\n );\n }\n\n search_tweets(keyword: string): Tweet[] {\n const keywordLower = keyword.toLowerCase();\n return Object.values(this.tweets).filter(\n (tweet) =>\n tweet.content.toLowerCase().includes(keywordLower) ||\n tweet.tags.some((tag: string) =>\n tag.toLowerCase().includes(keywordLower)\n )\n );\n }\n\n get_tweet_comments(tweet_id: number): (Comment | { error: string })[] {\n if (!(tweet_id in this.tweets)) {\n return [{ error: `Tweet with ID ${tweet_id} not found.` }];\n }\n return this.comments[tweet_id] || [];\n }\n\n get_user_stats(username: string): Record<string, number> {\n const tweetCount = Object.values(this.tweets).filter(\n (tweet) => tweet.username === username\n ).length;\n const followingCount =\n username === this.username ? this.followingList.length : 0;\n const retweetCount = (this.retweets[username] || []).length;\n\n return {\n tweet_count: tweetCount,\n following_count: followingCount,\n retweet_count: retweetCount,\n };\n }\n}\n","// VehicleControlAPI - Full port from Python\nexport interface VehicleScenario {\n random_seed?: number;\n fuelLevel?: number;\n batteryVoltage?: number;\n engineState?: string;\n remainingUnlockedDoors?: number;\n doorStatus?: Record<string, string>;\n acTemperature?: number;\n fanSpeed?: number;\n acMode?: string;\n humidityLevel?: number;\n headLightStatus?: string;\n parkingBrakeStatus?: string;\n parkingBrakeForce?: number;\n slopeAngle?: number;\n brakePedalStatus?: string;\n brakePedalForce?: number;\n distanceToNextVehicle?: number;\n cruiseStatus?: string;\n destination?: string;\n frontLeftTirePressure?: number;\n frontRightTirePressure?: number;\n rearLeftTirePressure?: number;\n rearRightTirePressure?: number;\n}\n\nconst MAX_FUEL_LEVEL = 50;\nconst MIN_FUEL_LEVEL = 0.0;\nconst MILE_PER_GALLON = 20.0;\n\nconst DEFAULT_STATE: VehicleScenario = {\n random_seed: 141_053,\n fuelLevel: 0.0,\n batteryVoltage: 12.6,\n engineState: \"stopped\",\n remainingUnlockedDoors: 4,\n doorStatus: {\n driver: \"unlocked\",\n passenger: \"unlocked\",\n rear_left: \"unlocked\",\n rear_right: \"unlocked\",\n },\n acTemperature: 25.0,\n fanSpeed: 50,\n acMode: \"auto\",\n humidityLevel: 50.0,\n headLightStatus: \"off\",\n parkingBrakeStatus: \"released\",\n parkingBrakeForce: 0.0,\n slopeAngle: 0.0,\n brakePedalStatus: \"released\",\n brakePedalForce: 0.0,\n distanceToNextVehicle: 50.0,\n cruiseStatus: \"inactive\",\n destination: \"None\",\n frontLeftTirePressure: 32.0,\n frontRightTirePressure: 32.0,\n rearLeftTirePressure: 30.0,\n rearRightTirePressure: 30.0,\n};\n\nclass SeededRandom {\n private seed: number;\n constructor(seed: number) {\n this.seed = seed;\n }\n uniform(min: number, max: number): number {\n this.seed = (this.seed * 9301 + 49_297) % 233_280;\n const rnd = this.seed / 233_280;\n return min + rnd * (max - min);\n }\n}\n\nexport class VehicleControlAPI {\n private fuelLevel: number;\n private batteryVoltage: number;\n private engineState: string;\n private remainingUnlockedDoors: number;\n private doorStatus: Record<string, string>;\n private acTemperature: number;\n private fanSpeed: number;\n private acMode: string;\n private humidityLevel: number;\n private headLightStatus: string;\n private parkingBrakeStatus: string;\n private _parkingBrakeForce: number;\n private _slopeAngle: number;\n private brakePedalStatus: string;\n private _brakePedalForce: number;\n private distanceToNextVehicle: number;\n private cruiseStatus: string;\n private destination: string;\n private frontLeftTirePressure: number;\n private frontRightTirePressure: number;\n private rearLeftTirePressure: number;\n private rearRightTirePressure: number;\n private longContext = false;\n private _random: SeededRandom;\n private readonly _apiDescription =\n \"This tool belongs to the vehicle control system, which allows users to control various aspects of the car such as engine, doors, climate control, lights, and more.\";\n\n constructor() {\n this.fuelLevel = 0.0;\n this.batteryVoltage = 12.6;\n this.engineState = \"stopped\";\n this.remainingUnlockedDoors = 4;\n this.doorStatus = {\n driver: \"unlocked\",\n passenger: \"unlocked\",\n rear_left: \"unlocked\",\n rear_right: \"unlocked\",\n };\n this.acTemperature = 25.0;\n this.fanSpeed = 50;\n this.acMode = \"auto\";\n this.humidityLevel = 50.0;\n this.headLightStatus = \"off\";\n this.parkingBrakeStatus = \"released\";\n this._parkingBrakeForce = 0.0;\n this._slopeAngle = 0.0;\n this.brakePedalStatus = \"released\";\n this._brakePedalForce = 0.0;\n this.distanceToNextVehicle = 50.0;\n this.cruiseStatus = \"inactive\";\n this.destination = \"None\";\n this.frontLeftTirePressure = 32.0;\n this.frontRightTirePressure = 32.0;\n this.rearLeftTirePressure = 30.0;\n this.rearRightTirePressure = 30.0;\n this._random = new SeededRandom(141_053);\n }\n\n // biome-ignore lint/complexity/noExcessiveCognitiveComplexity: Scenario loading requires many field initializations\n _loadScenario(scenario: VehicleScenario, longContext = false): void {\n const defaultCopy = JSON.parse(JSON.stringify(DEFAULT_STATE));\n this._random = new SeededRandom(\n scenario.random_seed ?? defaultCopy.random_seed\n );\n this.fuelLevel = scenario.fuelLevel ?? defaultCopy.fuelLevel;\n this.batteryVoltage = scenario.batteryVoltage ?? defaultCopy.batteryVoltage;\n this.engineState = scenario.engineState ?? defaultCopy.engineState;\n this.doorStatus = scenario.doorStatus ?? defaultCopy.doorStatus;\n this.remainingUnlockedDoors =\n 4 -\n Object.values(this.doorStatus).filter((status) => status === \"locked\")\n .length;\n this.acTemperature = scenario.acTemperature ?? defaultCopy.acTemperature;\n this.fanSpeed = scenario.fanSpeed ?? defaultCopy.fanSpeed;\n this.acMode = scenario.acMode ?? defaultCopy.acMode;\n this.humidityLevel = scenario.humidityLevel ?? defaultCopy.humidityLevel;\n this.headLightStatus =\n scenario.headLightStatus ?? defaultCopy.headLightStatus;\n this.parkingBrakeStatus =\n scenario.parkingBrakeStatus ?? defaultCopy.parkingBrakeStatus;\n this._parkingBrakeForce =\n scenario.parkingBrakeForce ?? defaultCopy.parkingBrakeForce;\n this._slopeAngle = scenario.slopeAngle ?? defaultCopy.slopeAngle;\n this.brakePedalStatus =\n scenario.brakePedalStatus ?? defaultCopy.brakePedalStatus;\n this._brakePedalForce =\n scenario.brakePedalForce ?? defaultCopy.brakePedalForce;\n this.distanceToNextVehicle =\n scenario.distanceToNextVehicle ?? defaultCopy.distanceToNextVehicle;\n this.cruiseStatus = scenario.cruiseStatus ?? defaultCopy.cruiseStatus;\n this.destination = scenario.destination ?? defaultCopy.destination;\n this.frontLeftTirePressure =\n scenario.frontLeftTirePressure ?? defaultCopy.frontLeftTirePressure;\n this.frontRightTirePressure =\n scenario.frontRightTirePressure ?? defaultCopy.frontRightTirePressure;\n this.rearLeftTirePressure =\n scenario.rearLeftTirePressure ?? defaultCopy.rearLeftTirePressure;\n this.rearRightTirePressure =\n scenario.rearRightTirePressure ?? defaultCopy.rearRightTirePressure;\n this.longContext = longContext;\n }\n\n equals(other: unknown): boolean {\n if (!(other instanceof VehicleControlAPI)) {\n return false;\n }\n for (const attrName of Object.keys(this) as (keyof VehicleControlAPI)[]) {\n if (attrName.startsWith(\"_\")) {\n continue;\n }\n const modelAttr = this[attrName];\n const groundTruthAttr = other[attrName];\n if (JSON.stringify(modelAttr) !== JSON.stringify(groundTruthAttr)) {\n return false;\n }\n }\n return true;\n }\n\n startEngine(ignitionMode: string): Record<string, unknown> {\n if (ignitionMode === \"STOP\") {\n this.engineState = \"stopped\";\n }\n if (this.remainingUnlockedDoors > 0) {\n const unlockedDoors = Object.entries(this.doorStatus)\n .filter(([, status]) => status === \"unlocked\")\n .map(([door]) => door)\n .join(\", \");\n return {\n error: `All doors must be locked before starting the engine. Here are the unlocked doors: ${unlockedDoors}`,\n };\n }\n if (this.brakePedalStatus !== \"pressed\") {\n return {\n error: \"Brake pedal needs to be pressed when starting the engine.\",\n };\n }\n if (this._brakePedalForce !== 1000.0) {\n return {\n error: \"Must press the brake fully before starting the engine.\",\n };\n }\n if (this.fuelLevel < MIN_FUEL_LEVEL) {\n return { error: \"Fuel tank is empty.\" };\n }\n if (ignitionMode === \"START\") {\n this.engineState = \"running\";\n } else {\n return { error: \"Invalid ignition mode.\" };\n }\n return {\n engineState: this.engineState,\n fuelLevel: this.fuelLevel,\n batteryVoltage: this.batteryVoltage,\n };\n }\n\n fillFuelTank(fuelAmount: number): Record<string, unknown> {\n if (fuelAmount < 0) {\n return { error: \"Fuel amount cannot be negative.\" };\n }\n if (this.fuelLevel + fuelAmount > MAX_FUEL_LEVEL) {\n return { error: \"Cannot fill gas above the tank capacity.\" };\n }\n if (this.fuelLevel + fuelAmount < MIN_FUEL_LEVEL) {\n return { error: \"Fuel tank is empty. Min fuel level is 0 gallons.\" };\n }\n this.fuelLevel += fuelAmount;\n return { fuelLevel: this.fuelLevel };\n }\n\n lockDoors(unlock: boolean, door: string[]): Record<string, unknown> {\n if (unlock) {\n for (const d of door) {\n if (this.doorStatus[d] === \"unlocked\") {\n continue;\n }\n this.doorStatus[d] = \"unlocked\";\n this.remainingUnlockedDoors += 1;\n }\n return {\n lockStatus: \"unlocked\",\n remainingUnlockedDoors: this.remainingUnlockedDoors,\n };\n }\n for (const d of door) {\n if (this.doorStatus[d] === \"locked\") {\n continue;\n }\n this.doorStatus[d] = \"locked\";\n this.remainingUnlockedDoors -= 1;\n }\n return {\n lockStatus: \"locked\",\n remainingUnlockedDoors: this.remainingUnlockedDoors,\n };\n }\n\n adjustClimateControl(\n temperature: number,\n unit = \"celsius\",\n fanSpeed = 50,\n mode = \"auto\"\n ): Record<string, unknown> {\n if (fanSpeed < 0 || fanSpeed > 100) {\n return { error: \"Fan speed must be between 0 and 100.\" };\n }\n this.acTemperature = temperature;\n if (unit === \"fahrenheit\") {\n this.acTemperature = ((temperature - 32) * 5) / 9;\n }\n this.fanSpeed = fanSpeed;\n this.acMode = mode;\n return {\n currentACTemperature: temperature,\n climateMode: mode,\n humidityLevel: this.humidityLevel,\n };\n }\n\n get_outside_temperature_from_google(): Record<string, unknown> {\n return { outsideTemperature: this._random.uniform(-10.0, 40.0) };\n }\n\n get_outside_temperature_from_weather_com(): Record<string, unknown> {\n return { error: 404 };\n }\n\n setHeadlights(mode: string): Record<string, string> {\n if (![\"on\", \"off\", \"auto\"].includes(mode)) {\n return { error: \"Invalid headlight mode.\" };\n }\n this.headLightStatus = mode === \"on\" ? \"on\" : \"off\";\n return { headlightStatus: this.headLightStatus };\n }\n\n displayCarStatus(option: string): Record<string, unknown> {\n const status: Record<string, unknown> = {};\n if (option === \"fuel\") {\n status.fuelLevel = this.fuelLevel;\n } else if (option === \"battery\") {\n status.batteryVoltage = this.batteryVoltage;\n } else if (option === \"doors\") {\n status.doorStatus = this.doorStatus;\n } else if (option === \"climate\") {\n status.currentACTemperature = this.acTemperature;\n status.fanSpeed = this.fanSpeed;\n status.climateMode = this.acMode;\n status.humidityLevel = this.humidityLevel;\n } else if (option === \"headlights\") {\n status.headlightStatus = this.headLightStatus;\n } else if (option === \"parkingBrake\") {\n status.parkingBrakeStatus = this.parkingBrakeStatus;\n status.parkingBrakeForce = this._parkingBrakeForce;\n status.slopeAngle = this._slopeAngle;\n } else if (option === \"brakePedal\") {\n status.brakePedalStatus = this.brakePedalStatus;\n status.brakePedalForce = this._brakePedalForce;\n } else if (option === \"engine\") {\n status.engineState = this.engineState;\n } else {\n status.error = \"Invalid option\";\n }\n return status;\n }\n\n activateParkingBrake(mode: string): Record<string, unknown> {\n if (![\"engage\", \"release\"].includes(mode)) {\n return { error: \"Invalid mode\" };\n }\n if (mode === \"engage\") {\n this.parkingBrakeStatus = \"engaged\";\n this._parkingBrakeForce = 500.0;\n this._slopeAngle = 10.0;\n return {\n parkingBrakeStatus: \"engaged\",\n _parkingBrakeForce: 500.0,\n _slopeAngle: 10.0,\n };\n }\n this.parkingBrakeStatus = \"released\";\n this._parkingBrakeForce = 0.0;\n this._slopeAngle = 10.0;\n return {\n parkingBrakeStatus: \"released\",\n _parkingBrakeForce: 0.0,\n _slopeAngle: 10.0,\n };\n }\n\n pressBrakePedal(pedalPosition: number): Record<string, unknown> {\n if (pedalPosition < 0 || pedalPosition > 1) {\n return { error: \"Pedal position must be between 0 and 1.\" };\n }\n if (pedalPosition === 0) {\n this.brakePedalStatus = \"released\";\n this._brakePedalForce = 0.0;\n return { brakePedalStatus: \"released\", brakePedalForce: 0.0 };\n }\n const maxBrakeForce = 1000;\n const force = pedalPosition * maxBrakeForce;\n this.brakePedalStatus = \"pressed\";\n this._brakePedalForce = force;\n return { brakePedalStatus: \"pressed\", brakePedalForce: force };\n }\n\n releaseBrakePedal(): Record<string, unknown> {\n this.brakePedalStatus = \"released\";\n this._brakePedalForce = 0.0;\n return { brakePedalStatus: \"released\", brakePedalForce: 0.0 };\n }\n\n setCruiseControl(\n speed: number,\n activate: boolean,\n distanceToNextVehicle: number\n ): Record<string, unknown> {\n const dist = Number(distanceToNextVehicle);\n const spd = Number(speed);\n\n if (this.engineState === \"stopped\") {\n return {\n error: \"Start the engine before activating the cruise control.\",\n };\n }\n if (activate) {\n this.distanceToNextVehicle = dist;\n if (spd < 0 || spd > 120 || spd % 5 !== 0) {\n return { error: \"Invalid speed\" };\n }\n this.cruiseStatus = \"active\";\n return {\n cruiseStatus: \"active\",\n currentSpeed: spd,\n distanceToNextVehicle: dist,\n };\n }\n this.cruiseStatus = \"inactive\";\n this.distanceToNextVehicle = dist;\n return {\n cruiseStatus: \"inactive\",\n currentSpeed: spd,\n distanceToNextVehicle: dist,\n };\n }\n\n get_current_speed(): Record<string, number> {\n return { currentSpeed: this._random.uniform(0.0, 120.0) };\n }\n\n display_log(messages: string[]): Record<string, string[]> {\n return { log: messages };\n }\n\n estimate_drive_feasibility_by_mileage(\n distance: number\n ): Record<string, boolean> {\n if (this.fuelLevel * MILE_PER_GALLON < distance) {\n return { canDrive: false };\n }\n return { canDrive: true };\n }\n\n liter_to_gallon(liter: number): Record<string, number> {\n return { gallon: liter * 0.264_172 };\n }\n\n gallon_to_liter(gallon: number): Record<string, number> {\n return { liter: gallon * 3.785_41 };\n }\n\n estimate_distance(cityA: string, cityB: string): Record<string, unknown> {\n const distances: Record<string, number> = {\n \"83214-74532\": 750.0,\n \"56108-62947\": 320.0,\n \"71354-83462\": 450.0,\n \"47329-52013\": 290.0,\n \"69238-51479\": 630.0,\n \"94016-83214\": 980.0,\n \"94016-94704\": 600.0,\n \"94704-08540\": 2550.0,\n \"94016-08540\": 1950.0,\n \"62947-47329\": 1053.0,\n \"94016-62947\": 780.0,\n \"74532-94016\": 880.0,\n };\n\n const key1 = `${cityA}-${cityB}`;\n const key2 = `${cityB}-${cityA}`;\n\n if (distances[key1] !== undefined) {\n return { distance: distances[key1] };\n }\n if (distances[key2] !== undefined) {\n return { distance: distances[key2] };\n }\n return { error: \"distance not found in database.\" };\n }\n\n get_zipcode_based_on_city(city: string): Record<string, string> {\n const zipcodes: Record<string, string> = {\n Rivermist: \"83214\",\n Stonebrook: \"74532\",\n Maplecrest: \"56108\",\n Silverpine: \"62947\",\n Shadowridge: \"71354\",\n \"Sunset Valley\": \"83462\",\n Oakendale: \"47329\",\n Willowbend: \"52013\",\n \"Crescent Hollow\": \"69238\",\n Autumnville: \"51479\",\n \"San Francisco\": \"94016\",\n };\n return { zipcode: zipcodes[city] ?? \"00000\" };\n }\n\n set_navigation(destination: string): Record<string, string> {\n this.destination = destination;\n return { status: `Navigating to ${destination}` };\n }\n\n check_tire_pressure(): Record<string, unknown> {\n const avgPressure =\n (this.frontLeftTirePressure +\n this.frontRightTirePressure +\n this.rearLeftTirePressure +\n this.rearRightTirePressure) /\n 4;\n const healthyTirePressure = avgPressure >= 30 && avgPressure <= 35;\n\n return {\n frontLeftTirePressure: this.frontLeftTirePressure,\n frontRightTirePressure: this.frontRightTirePressure,\n rearLeftTirePressure: this.rearLeftTirePressure,\n rearRightTirePressure: this.rearRightTirePressure,\n healthy_tire_pressure: healthyTirePressure,\n car_info: {},\n };\n }\n\n find_nearest_tire_shop(): Record<string, string> {\n return { shopLocation: \"456 Oakwood Avenue, Rivermist, 83214\" };\n }\n}\n","// Constants and class mappings for multi-turn evaluation\n// Ported from executable_backend_config.py\n\nimport { GorillaFileSystem } from \"./classes/gorilla-file-system\";\nimport { MathAPI } from \"./classes/math-api\";\nimport { MessageAPI } from \"./classes/message-api\";\nimport { TicketAPI } from \"./classes/ticket-api\";\nimport { TradingBot } from \"./classes/trading-bot\";\nimport { TravelAPI } from \"./classes/travel-api\";\nimport { TwitterAPI } from \"./classes/twitter-api\";\nimport { VehicleControlAPI } from \"./classes/vehicle-control-api\";\n\n// biome-ignore lint/suspicious/noExplicitAny: Dynamic class instantiation requires any for method access\ntype ClassConstructor = new () => any;\n\nexport const CLASS_NAME_TO_CLASS: Record<string, ClassConstructor> = {\n MathAPI,\n MessageAPI,\n TicketAPI,\n TwitterAPI,\n TravelAPI,\n TradingBot,\n VehicleControlAPI,\n GorillaFileSystem,\n};\n\n// Stateless classes (don't maintain state across turns)\nexport const STATELESS_CLASSES = new Set([\"MathAPI\"]);\n\n// Module path mapping (simplified for TypeScript)\nexport const CLASS_FILE_PATH_MAPPING: Record<string, string> = {\n MathAPI: \"math_api\",\n MessageAPI: \"message_api\",\n TicketAPI: \"ticket_api\",\n TwitterAPI: \"posting_api\",\n TravelAPI: \"travel_booking\",\n TradingBot: \"trading_bot\",\n VehicleControlAPI: \"vehicle_control\",\n GorillaFileSystem: \"gorilla_file_system\",\n};\n\n// Function categories for different benchmark types\nexport const MULTI_TURN_CATEGORY = [\n \"multi_turn_base\",\n \"multi_turn_miss_func\",\n \"multi_turn_miss_param\",\n \"multi_turn_long_context\",\n];\n\n// Configuration constants\nexport const BFCL_CONFIG = {\n // Add configuration constants as needed\n};\n","// Method registry for safe method invocation\n// Replaces Python's dynamic import and eval system\n\nimport { CLASS_NAME_TO_CLASS, STATELESS_CLASSES } from \"./constants\";\n\n// biome-ignore lint/suspicious/noExplicitAny: Dynamic instance storage for various class types\nexport type InstanceRegistry = Record<string, any>;\n\nexport class MethodRegistry {\n private instances: InstanceRegistry = {};\n private methodMapping: Record<string, string> = {}; // method_name -> instance_key\n\n constructor() {\n // Initialize stateless classes (MathAPI)\n for (const className of STATELESS_CLASSES) {\n const ClassConstructor = CLASS_NAME_TO_CLASS[className];\n if (ClassConstructor) {\n const instance = new ClassConstructor();\n const instanceKey = `${className}_stateless_instance`;\n this.instances[instanceKey] = instance;\n\n // Register all methods\n const methods = Object.getOwnPropertyNames(\n Object.getPrototypeOf(instance)\n ).filter(\n (name) =>\n typeof instance[name] === \"function\" && name !== \"constructor\"\n );\n\n for (const methodName of methods) {\n this.methodMapping[methodName] = instanceKey;\n }\n }\n }\n }\n\n getOrCreateInstance(\n className: string,\n testEntryId: string,\n modelName: string,\n // biome-ignore lint/suspicious/noExplicitAny: Dynamic scenario data from JSON\n scenario: any,\n longContext = false,\n isEvalRun = false\n // biome-ignore lint/suspicious/noExplicitAny: Returns dynamically typed class instance\n ): any {\n const instanceKey = `${modelName}_${testEntryId}_${className}_${isEvalRun ? \"eval\" : \"model\"}_instance`;\n\n if (!this.instances[instanceKey]) {\n const ClassConstructor = CLASS_NAME_TO_CLASS[className];\n if (!ClassConstructor) {\n throw new Error(`Unknown class: ${className}`);\n }\n\n const instance = new ClassConstructor();\n // Only call _loadScenario for stateful classes\n if (\n !STATELESS_CLASSES.has(className) &&\n typeof instance._loadScenario === \"function\"\n ) {\n instance._loadScenario(scenario, longContext);\n }\n this.instances[instanceKey] = instance;\n\n // Register methods for this instance\n const methods = Object.getOwnPropertyNames(\n Object.getPrototypeOf(instance)\n ).filter(\n (name) =>\n typeof instance[name] === \"function\" &&\n name !== \"constructor\" &&\n !name.startsWith(\"_\")\n );\n\n for (const methodName of methods) {\n this.methodMapping[methodName] = instanceKey;\n }\n }\n\n return this.instances[instanceKey];\n }\n\n // biome-ignore lint/suspicious/noExplicitAny: Returns dynamically typed class instance\n getInstanceByMethod(methodName: string): any {\n const instanceKey = this.methodMapping[methodName];\n if (!instanceKey) {\n throw new Error(`Method not found: ${methodName}`);\n }\n return this.instances[instanceKey];\n }\n\n // Get all instances for a specific test case\n getInstancesForTest(\n testEntryId: string,\n modelName: string\n ): InstanceRegistry {\n const result: InstanceRegistry = {};\n for (const [key, instance] of Object.entries(this.instances)) {\n if (key.includes(`${modelName}_${testEntryId}`)) {\n result[key] = instance;\n }\n }\n return result;\n }\n\n // Clear instances for a specific test case\n clearInstancesForTest(testEntryId: string, modelName: string): void {\n const keysToDelete: string[] = [];\n for (const key of Object.keys(this.instances)) {\n if (key.includes(`${modelName}_${testEntryId}`)) {\n keysToDelete.push(key);\n }\n }\n for (const key of keysToDelete) {\n delete this.instances[key];\n }\n\n // Remove method mappings for deleted instances\n const methodsToDelete: string[] = [];\n for (const [method, instanceKey] of Object.entries(this.methodMapping)) {\n if (keysToDelete.includes(instanceKey)) {\n methodsToDelete.push(method);\n }\n }\n for (const method of methodsToDelete) {\n delete this.methodMapping[method];\n }\n }\n\n // Reset all instances (for testing)\n reset(): void {\n this.instances = {};\n this.methodMapping = {};\n\n // Re-initialize stateless classes\n for (const className of STATELESS_CLASSES) {\n const ClassConstructor = CLASS_NAME_TO_CLASS[className];\n if (ClassConstructor) {\n const instance = new ClassConstructor();\n const instanceKey = `${className}_stateless_instance`;\n this.instances[instanceKey] = instance;\n\n const methods = Object.getOwnPropertyNames(\n Object.getPrototypeOf(instance)\n ).filter(\n (name) =>\n typeof instance[name] === \"function\" && name !== \"constructor\"\n );\n\n for (const methodName of methods) {\n this.methodMapping[methodName] = instanceKey;\n }\n }\n }\n }\n}\n\n// Global registry instance\nexport const globalMethodRegistry = new MethodRegistry();\n","import { globalMethodRegistry } from \"./method-registry\";\n\nconst WHITESPACE_REGEX = /\\s/;\nconst DELIMITER_REGEX = /[,)\\]}]/;\nconst FUNCTION_CALL_REGEX = /^(\\w+(?:\\.\\w+)?)\\((.*)\\)$/s;\nconst KEY_EQUALS_REGEX = /^(\\w+)\\s*=/;\n\nexport interface ToolCall {\n toolName: string;\n args: Record<string, unknown>;\n}\n\nexport interface ExecutionResult {\n success: boolean;\n result?: unknown;\n error?: string;\n}\n\n// biome-ignore lint/complexity/noStaticOnlyClass: Namespace pattern for executor methods\nexport class SafeExecutor {\n private static readonly DANGEROUS_METHODS = new Set([\n \"kill\",\n \"exit\",\n \"quit\",\n \"system\",\n \"exec\",\n \"eval\",\n \"import\",\n ]);\n\n private static readonly METHOD_PARAM_ORDER: Record<string, string[]> = {\n cd: [\"folder\"],\n mkdir: [\"dir_name\"],\n touch: [\"file_name\"],\n echo: [\"content\", \"file_name\"],\n cat: [\"file_name\"],\n grep: [\"file_name\", \"pattern\"],\n sort: [\"file_name\"],\n tail: [\"file_name\", \"lines\"],\n diff: [\"file_name1\", \"file_name2\"],\n mv: [\"source\", \"destination\"],\n cp: [\"source\", \"destination\"],\n rm: [\"file_name\"],\n rmdir: [\"dir_name\"],\n find: [\"path\", \"name\"],\n ls: [\"a\"],\n pwd: [],\n wc: [\"file_name\", \"mode\"],\n du: [\"human_readable\"],\n\n // TwitterAPI (PostingAPI)\n authenticate_twitter: [\"username\", \"password\"],\n posting_get_login_status: [],\n post_tweet: [\"content\", \"tags\", \"mentions\"],\n retweet: [\"tweet_id\"],\n comment: [\"tweet_id\", \"comment_content\"],\n mention: [\"tweet_id\", \"mentioned_usernames\"],\n follow_user: [\"username_to_follow\"],\n list_all_following: [],\n unfollow_user: [\"username_to_unfollow\"],\n get_tweet: [\"tweet_id\"],\n get_user_tweets: [\"username\"],\n search_tweets: [\"keyword\"],\n get_tweet_comments: [\"tweet_id\"],\n get_user_stats: [\"username\"],\n\n // TicketAPI\n create_ticket: [\"title\", \"description\", \"priority\"],\n get_ticket: [\"ticket_id\"],\n close_ticket: [\"ticket_id\"],\n resolve_ticket: [\"ticket_id\", \"resolution\"],\n edit_ticket: [\"ticket_id\", \"updates\"],\n ticket_login: [\"username\", \"password\"],\n ticket_get_login_status: [],\n logout: [],\n get_user_tickets: [\"status\"],\n\n // MathAPI\n mean: [\"numbers\"],\n std: [\"numbers\"],\n add: [\"a\", \"b\"],\n subtract: [\"a\", \"b\"],\n multiply: [\"a\", \"b\"],\n divide: [\"a\", \"b\"],\n absolute: [\"number\"],\n absolute_value: [\"number\"],\n power: [\"base\", \"exponent\"],\n logarithm: [\"value\", \"base\", \"precision\"],\n log: [\"value\", \"base\"],\n max_value: [\"numbers\"],\n min_value: [\"numbers\"],\n percentage: [\"part\", \"whole\"],\n round_number: [\"number\", \"decimal_places\"],\n square_root: [\"number\", \"precision\"],\n standard_deviation: [\"numbers\"],\n sum_values: [\"numbers\"],\n imperial_si_conversion: [\"value\", \"unit_in\", \"unit_out\"],\n si_unit_conversion: [\"value\", \"unit_in\", \"unit_out\"],\n\n // MessageAPI\n send_message: [\"receiver_id\", \"message\"],\n view_messages_received: [],\n view_messages_sent: [],\n add_contact: [\"user_name\", \"user_id\"],\n delete_contact: [\"user_id\"],\n delete_message: [\"receiver_id\"],\n search_messages: [\"keyword\"],\n get_message_stats: [],\n get_user_id: [\"user\"],\n message_login: [\"user_id\"],\n message_get_login_status: [],\n list_users: [],\n\n // TradingBot\n add_to_watchlist: [\"stock\"],\n cancel_order: [\"order_id\"],\n filter_stocks_by_price: [\"stocks\", \"min_price\", \"max_price\"],\n fund_account: [\"amount\"],\n get_account_info: [],\n get_available_stocks: [\"sector\"],\n get_current_time: [],\n get_order_details: [\"order_id\"],\n get_order_history: [],\n get_stock_info: [\"symbol\"],\n get_symbol_by_name: [\"name\"],\n get_transaction_history: [\"start_date\", \"end_date\"],\n get_watchlist: [],\n notify_price_change: [\"stocks\", \"threshold\"],\n place_order: [\"order_type\", \"symbol\", \"price\", \"amount\"],\n remove_stock_from_watchlist: [\"symbol\"],\n trading_get_login_status: [],\n trading_login: [\"username\", \"password\"],\n trading_logout: [],\n withdraw_funds: [\"amount\"],\n\n // TravelAPI\n authenticate_travel: [\n \"client_id\",\n \"client_secret\",\n \"refresh_token\",\n \"grant_type\",\n \"user_first_name\",\n \"user_last_name\",\n ],\n book_flight: [\n \"access_token\",\n \"card_id\",\n \"travel_date\",\n \"travel_from\",\n \"travel_to\",\n \"travel_class\",\n ],\n cancel_booking: [\"access_token\", \"booking_id\"],\n compute_exchange_rate: [\"base_currency\", \"target_currency\", \"value\"],\n contact_customer_support: [\"booking_id\", \"message\"],\n get_all_credit_cards: [],\n get_booking_history: [\"access_token\"],\n get_budget_fiscal_year: [\"lastModifiedAfter\", \"includeRemoved\"],\n get_credit_card_balance: [\"access_token\", \"card_id\"],\n get_flight_cost: [\n \"travel_from\",\n \"travel_to\",\n \"travel_date\",\n \"travel_class\",\n ],\n get_nearest_airport_by_city: [\"location\"],\n list_all_airports: [],\n purchase_insurance: [\n \"access_token\",\n \"insurance_type\",\n \"insurance_cost\",\n \"booking_id\",\n \"card_id\",\n ],\n register_credit_card: [\n \"access_token\",\n \"card_number\",\n \"expiration_date\",\n \"cardholder_name\",\n \"card_verification_number\",\n ],\n retrieve_invoice: [\"access_token\", \"booking_id\", \"insurance_id\"],\n set_budget_limit: [\"access_token\", \"budget_limit\"],\n travel_get_login_status: [],\n verify_traveler_information: [\n \"first_name\",\n \"last_name\",\n \"date_of_birth\",\n \"passport_number\",\n ],\n\n // VehicleControlAPI\n activateParkingBrake: [\"mode\"],\n adjustClimateControl: [\"temperature\", \"unit\", \"fanSpeed\", \"mode\"],\n check_tire_pressure: [],\n displayCarStatus: [\"option\"],\n display_log: [\"messages\"],\n estimate_distance: [\"cityA\", \"cityB\"],\n estimate_drive_feasibility_by_mileage: [\"distance\"],\n fillFuelTank: [\"fuelAmount\"],\n find_nearest_tire_shop: [],\n gallon_to_liter: [\"gallon\"],\n get_current_speed: [],\n get_outside_temperature_from_google: [],\n get_outside_temperature_from_weather_com: [],\n get_zipcode_based_on_city: [\"city\"],\n liter_to_gallon: [\"liter\"],\n lockDoors: [\"unlock\", \"door\"],\n pressBrakePedal: [\"pedalPosition\"],\n releaseBrakePedal: [],\n setCruiseControl: [\"speed\", \"activate\", \"distanceToNextVehicle\"],\n setHeadlights: [\"mode\"],\n set_navigation: [\"destination\"],\n startEngine: [\"ignitionMode\"],\n };\n\n private static extractMethodName(toolName: string): string {\n return toolName.split(\".\").pop() ?? toolName;\n }\n\n private static snakeToCamel(str: string): string {\n return str.replace(/_([a-z])/g, (_, letter) => letter.toUpperCase());\n }\n\n private static getMethodVariants(methodName: string): string[] {\n const camelCase = SafeExecutor.snakeToCamel(methodName);\n if (camelCase === methodName) {\n return [methodName];\n }\n return [methodName, camelCase];\n }\n\n // biome-ignore lint/complexity/noExcessiveCognitiveComplexity: Method resolution requires nested loops\n private static findInstanceAndMethod(\n methodName: string,\n involvedInstances?: Record<string, unknown>\n ): { instance: unknown; resolvedMethodName: string } | undefined {\n const variants = SafeExecutor.getMethodVariants(methodName);\n\n if (involvedInstances) {\n for (const instance of Object.values(involvedInstances)) {\n if (instance && typeof instance === \"object\") {\n for (const variant of variants) {\n if (\n variant in instance &&\n typeof (instance as Record<string, unknown>)[variant] ===\n \"function\"\n ) {\n return { instance, resolvedMethodName: variant };\n }\n }\n }\n }\n }\n\n for (const variant of variants) {\n try {\n const instance = globalMethodRegistry.getInstanceByMethod(variant);\n if (instance) {\n return { instance, resolvedMethodName: variant };\n }\n } catch {\n // Method not found in registry, continue searching\n }\n }\n return undefined;\n }\n\n private static buildArgs(\n methodName: string,\n args: Record<string, unknown>\n ): unknown[] {\n const paramOrder = SafeExecutor.METHOD_PARAM_ORDER[methodName];\n if (!paramOrder) {\n return Object.values(args);\n }\n return paramOrder.map((param) => args[param]);\n }\n\n private static isDangerous(methodName: string): boolean {\n return (\n SafeExecutor.DANGEROUS_METHODS.has(methodName) ||\n methodName.startsWith(\"__\")\n );\n }\n\n static async execute(\n toolCall: ToolCall,\n involvedInstances?: Record<string, unknown>\n ): Promise<ExecutionResult> {\n const methodName = SafeExecutor.extractMethodName(toolCall.toolName);\n\n if (SafeExecutor.isDangerous(methodName)) {\n return {\n success: false,\n error: `Dangerous method blocked: ${methodName}`,\n };\n }\n\n const found = SafeExecutor.findInstanceAndMethod(\n methodName,\n involvedInstances\n );\n if (!found) {\n return {\n success: false,\n error: `Instance not found for method: ${methodName}`,\n };\n }\n\n const { instance, resolvedMethodName } = found;\n const method = (instance as Record<string, unknown>)[resolvedMethodName];\n if (typeof method !== \"function\") {\n return {\n success: false,\n error: `Method not found: ${methodName}`,\n };\n }\n\n try {\n const args = SafeExecutor.buildArgs(methodName, toolCall.args);\n const result = method.apply(instance, args);\n const finalResult = result instanceof Promise ? await result : result;\n\n return { success: true, result: finalResult };\n } catch (error) {\n return {\n success: false,\n error: `Execution error: ${error instanceof Error ? error.message : String(error)}`,\n };\n }\n }\n\n static async executeMany(\n toolCalls: ToolCall[],\n involvedInstances?: Record<string, unknown>\n ): Promise<ExecutionResult[]> {\n const results: ExecutionResult[] = [];\n for (const toolCall of toolCalls) {\n results.push(await SafeExecutor.execute(toolCall, involvedInstances));\n }\n return results;\n }\n\n static serializeResult(result: unknown): string {\n if (result === null || result === undefined) {\n return \"None\";\n }\n if (typeof result === \"string\") {\n return result;\n }\n if (typeof result === \"object\") {\n try {\n return JSON.stringify(result);\n } catch {\n return String(result);\n }\n }\n return String(result);\n }\n\n // biome-ignore lint/complexity/noExcessiveCognitiveComplexity: Python call parsing requires complex branching\n static parsePythonCall(pythonCall: string): ToolCall {\n const match = pythonCall.match(FUNCTION_CALL_REGEX);\n if (!match) {\n throw new Error(`Invalid function call format: ${pythonCall}`);\n }\n\n const [, fullMethodName, argsString] = match;\n const methodName = fullMethodName.split(\".\").pop() || fullMethodName;\n const args: Record<string, unknown> = {};\n\n if (!argsString.trim()) {\n return { toolName: methodName, args };\n }\n\n const parsedArgs = SafeExecutor.parseArgsString(argsString);\n const paramOrder = SafeExecutor.METHOD_PARAM_ORDER[methodName];\n\n if (paramOrder && parsedArgs.some((a) => a.key)) {\n for (const arg of parsedArgs) {\n if (arg.key) {\n args[arg.key] = arg.value;\n }\n }\n } else if (paramOrder) {\n let idx = 0;\n for (const arg of parsedArgs) {\n if (arg.key) {\n args[arg.key] = arg.value;\n } else if (idx < paramOrder.length) {\n args[paramOrder[idx]] = arg.value;\n idx++;\n }\n }\n } else {\n let idx = 0;\n for (const arg of parsedArgs) {\n if (arg.key) {\n args[arg.key] = arg.value;\n } else {\n args[`arg${idx}`] = arg.value;\n idx++;\n }\n }\n }\n\n return { toolName: methodName, args };\n }\n\n private static parseArgsString(\n argsString: string\n ): Array<{ key?: string; value: unknown }> {\n const results: Array<{ key?: string; value: unknown }> = [];\n let i = 0;\n const s = argsString.trim();\n\n while (i < s.length) {\n while (i < s.length && WHITESPACE_REGEX.test(s[i])) {\n i++;\n }\n if (i >= s.length) {\n break;\n }\n\n let key: string | undefined;\n const keyMatch = s.slice(i).match(KEY_EQUALS_REGEX);\n if (keyMatch) {\n key = keyMatch[1];\n i += keyMatch[0].length;\n }\n\n while (i < s.length && WHITESPACE_REGEX.test(s[i])) {\n i++;\n }\n\n const value = SafeExecutor.parseValue(s, i);\n i = value.endIndex;\n results.push({ key, value: value.value });\n\n while (i < s.length && WHITESPACE_REGEX.test(s[i])) {\n i++;\n }\n if (i < s.length && s[i] === \",\") {\n i++;\n }\n }\n\n return results;\n }\n\n // biome-ignore lint/complexity/noExcessiveCognitiveComplexity: Python value parsing requires complex branching for strings, lists, dicts, etc.\n private static parseValue(\n s: string,\n start: number\n ): { value: unknown; endIndex: number } {\n let i = start;\n while (i < s.length && WHITESPACE_REGEX.test(s[i])) {\n i++;\n }\n\n if (s[i] === \"'\" || s[i] === '\"') {\n const quote = s[i];\n i++;\n let value = \"\";\n while (i < s.length && s[i] !== quote) {\n if (s[i] === \"\\\\\" && i + 1 < s.length) {\n const next = s[i + 1];\n if (next === \"n\") {\n value += \"\\n\";\n } else if (next === \"t\") {\n value += \"\\t\";\n } else if (next === \"r\") {\n value += \"\\r\";\n } else {\n value += next;\n }\n i += 2;\n } else {\n value += s[i];\n i++;\n }\n }\n return { value, endIndex: i + 1 };\n }\n\n if (s[i] === \"[\") {\n return SafeExecutor.parseList(s, i);\n }\n\n if (s[i] === \"{\") {\n return SafeExecutor.parseDict(s, i);\n }\n\n let token = \"\";\n while (i < s.length && !DELIMITER_REGEX.test(s[i])) {\n token += s[i];\n i++;\n }\n token = token.trim();\n\n if (token === \"True\") {\n return { value: true, endIndex: i };\n }\n if (token === \"False\") {\n return { value: false, endIndex: i };\n }\n if (token === \"None\") {\n return { value: null, endIndex: i };\n }\n const num = Number(token);\n if (!Number.isNaN(num)) {\n return { value: num, endIndex: i };\n }\n return { value: token, endIndex: i };\n }\n\n private static parseList(\n s: string,\n start: number\n ): { value: unknown[]; endIndex: number } {\n const items: unknown[] = [];\n let i = start + 1;\n while (i < s.length && s[i] !== \"]\") {\n while (i < s.length && WHITESPACE_REGEX.test(s[i])) {\n i++;\n }\n if (s[i] === \"]\") {\n break;\n }\n const item = SafeExecutor.parseValue(s, i);\n items.push(item.value);\n i = item.endIndex;\n while (i < s.length && WHITESPACE_REGEX.test(s[i])) {\n i++;\n }\n if (s[i] === \",\") {\n i++;\n }\n }\n return { value: items, endIndex: i + 1 };\n }\n\n private static parseDict(\n s: string,\n start: number\n ): { value: Record<string, unknown>; endIndex: number } {\n const obj: Record<string, unknown> = {};\n let i = start + 1;\n while (i < s.length && s[i] !== \"}\") {\n while (i < s.length && WHITESPACE_REGEX.test(s[i])) {\n i++;\n }\n if (s[i] === \"}\") {\n break;\n }\n const keyResult = SafeExecutor.parseValue(s, i);\n i = keyResult.endIndex;\n while (i < s.length && WHITESPACE_REGEX.test(s[i])) {\n i++;\n }\n if (s[i] === \":\") {\n i++;\n }\n const valResult = SafeExecutor.parseValue(s, i);\n obj[String(keyResult.value)] = valResult.value;\n i = valResult.endIndex;\n while (i < s.length && WHITESPACE_REGEX.test(s[i])) {\n i++;\n }\n if (s[i] === \",\") {\n i++;\n }\n }\n return { value: obj, endIndex: i + 1 };\n }\n}\n","import { globalMethodRegistry } from \"./method-registry\";\nimport { SafeExecutor, type ToolCall } from \"./safe-executor\";\n\nexport interface ExecutionResult {\n executionResults: string[];\n involvedInstances: Record<string, unknown>;\n}\n\nexport async function executeMultiTurnFuncCall(\n toolCalls: ToolCall[],\n initialConfig: Record<string, unknown>,\n involvedClasses: string[],\n modelName: string,\n testEntryId: string,\n longContext = false,\n isEvalRun = false\n): Promise<ExecutionResult> {\n const configCopy = JSON.parse(JSON.stringify(initialConfig));\n const involvedInstances: Record<string, unknown> = {};\n\n for (const className of involvedClasses) {\n involvedInstances[className] = globalMethodRegistry.getOrCreateInstance(\n className,\n testEntryId,\n modelName,\n configCopy[className] || {},\n longContext,\n isEvalRun\n );\n }\n\n const results = await SafeExecutor.executeMany(toolCalls, involvedInstances);\n const executionResults = results.map((r) =>\n r.success\n ? SafeExecutor.serializeResult(r.result)\n : `Error during execution: ${r.error}`\n );\n\n return { executionResults, involvedInstances };\n}\n\nexport function resetInstancesForTest(\n testEntryId: string,\n modelName: string\n): void {\n globalMethodRegistry.clearInstancesForTest(testEntryId, modelName);\n}\n\nexport function isEmptyExecuteResponse(responseList: string[]): boolean {\n return responseList.every(\n (response) =>\n response === \"\" ||\n response === \"None\" ||\n response === \"{}\" ||\n response === \"[]\" ||\n response.includes(\"Error during execution\")\n );\n}\n","// Response checker - validates execution results\n// Ported from Python's response_checker function\n\ntype ResponseItem =\n | string\n | number\n | boolean\n | null\n | Record<string, unknown>\n | unknown[];\n\nexport interface ResponseCheckResult {\n valid: boolean;\n error_type?: string;\n details?: {\n missing_items?: ResponseItem[];\n model_response?: ResponseItem[];\n ground_truth_response?: ResponseItem[];\n };\n}\n\nexport function responseChecker(\n modelResponseList: ResponseItem[],\n groundTruthResponseList: ResponseItem[],\n _turnIndex: number\n): ResponseCheckResult {\n const isSubsequenceResult = isSubsequenceUnordered(\n groundTruthResponseList,\n modelResponseList\n );\n\n if (!isSubsequenceResult.isSubsequence) {\n return {\n valid: false,\n error_type: \"multi_turn:execution_response_mismatch\",\n details: {\n missing_items: isSubsequenceResult.missingItems,\n model_response: modelResponseList,\n ground_truth_response: groundTruthResponseList,\n },\n };\n }\n\n return { valid: true };\n}\n\nexport function isSubsequenceUnordered(\n groundTruthList: ResponseItem[],\n modelList: ResponseItem[]\n): { isSubsequence: boolean; missingItems: ResponseItem[] } {\n if (groundTruthList.length === 0) {\n return { isSubsequence: true, missingItems: [] };\n }\n\n if (modelList.length === 0) {\n return { isSubsequence: false, missingItems: [...groundTruthList] };\n }\n\n const remainingModel = [...modelList];\n const missingItems: ResponseItem[] = [];\n\n for (const groundTruthItem of groundTruthList) {\n let found = false;\n\n for (let i = 0; i < remainingModel.length; i++) {\n if (itemsEqual(groundTruthItem, remainingModel[i])) {\n remainingModel.splice(i, 1);\n found = true;\n break;\n }\n }\n\n if (!found) {\n missingItems.push(groundTruthItem);\n }\n }\n\n return {\n isSubsequence: missingItems.length === 0,\n missingItems,\n };\n}\n\nfunction itemsEqual(a: ResponseItem, b: ResponseItem): boolean {\n if (a == null && b == null) {\n return true;\n }\n if (a == null || b == null) {\n return false;\n }\n\n if (typeof a === \"string\" && typeof b === \"string\") {\n return normalizeResponse(a) === normalizeResponse(b);\n }\n\n if (typeof a === \"object\" && typeof b === \"object\") {\n try {\n return (\n JSON.stringify(normalizeObject(a)) ===\n JSON.stringify(normalizeObject(b))\n );\n } catch {\n return String(a) === String(b);\n }\n }\n\n return a === b;\n}\n\n/**\n * Normalize response string for comparison\n */\nfunction normalizeResponse(response: string): string {\n // Remove extra whitespace and normalize\n return response.trim().replace(/\\s+/g, \" \");\n}\n\nfunction normalizeObject(obj: ResponseItem): ResponseItem {\n if (obj == null) {\n return obj;\n }\n if (typeof obj !== \"object\") {\n return obj;\n }\n if (Array.isArray(obj)) {\n return obj.map((item) => normalizeObject(item as ResponseItem));\n }\n\n const normalized: Record<string, unknown> = {};\n for (const [key, value] of Object.entries(obj)) {\n if (value !== undefined) {\n normalized[key] = normalizeObject(value as ResponseItem);\n }\n }\n\n const sorted: Record<string, unknown> = {};\n for (const key of Object.keys(normalized).sort()) {\n sorted[key] = normalized[key];\n }\n\n return sorted;\n}\n","// State checker - validates instance states after execution\n// Ported from Python's state_checker function\n\nimport { Directory, File } from \"./classes/gorilla-file-system\";\n\n/**\n * Represents serialized state of any value for comparison\n */\ntype SerializedValue =\n | string\n | number\n | boolean\n | null\n | SerializedObject\n | SerializedValue[];\ninterface SerializedObject {\n [key: string]: SerializedValue;\n}\n\nexport interface StateCheckResult {\n valid: boolean;\n error_type?: string;\n details?: {\n differences?: Record<string, SerializedValue>;\n model_instance_state?: Record<string, SerializedValue>;\n ground_truth_instance_state?: Record<string, SerializedValue>;\n };\n}\n\n/**\n * Checks if, after executing the function calls, the model_instance\n * has the same state (defined by the attributes) as the ground_truth_instance.\n */\nexport function stateChecker(\n // biome-ignore lint/suspicious/noExplicitAny: Runtime type comparison requires dynamic property access\n modelInstances: Record<string, any>,\n // biome-ignore lint/suspicious/noExplicitAny: Runtime type comparison requires dynamic property access\n groundTruthInstances: Record<string, any>\n): StateCheckResult {\n for (const [className, groundTruthInstance] of Object.entries(\n groundTruthInstances\n )) {\n const modelInstance = modelInstances[className];\n\n if (!modelInstance) {\n return {\n valid: false,\n error_type: \"multi_turn:instance_state_mismatch\",\n details: {\n differences: { [className]: \"Instance not found in model instances\" },\n },\n };\n }\n\n const comparisonResult = compareInstances(\n modelInstance,\n groundTruthInstance\n );\n\n if (!comparisonResult.valid) {\n // Debug: 더 자세한 상태 차이 출력\n console.log(\"[DEBUG] State mismatch detected!\");\n console.log(\n \"[DEBUG] Differences:\",\n JSON.stringify(comparisonResult.differences, null, 2)\n );\n console.log(\n \"[DEBUG] Model instance state:\",\n JSON.stringify(serializeInstanceState(modelInstance), null, 2)\n );\n console.log(\n \"[DEBUG] Ground truth instance state:\",\n JSON.stringify(serializeInstanceState(groundTruthInstance), null, 2)\n );\n\n return {\n valid: false,\n error_type: \"multi_turn:instance_state_mismatch\",\n details: {\n differences: comparisonResult.differences,\n model_instance_state: serializeInstanceState(modelInstance),\n ground_truth_instance_state:\n serializeInstanceState(groundTruthInstance),\n },\n };\n }\n }\n\n return { valid: true };\n}\n\nfunction compareInstances(\n // biome-ignore lint/suspicious/noExplicitAny: Dynamic property enumeration for runtime comparison\n modelObject: any,\n // biome-ignore lint/suspicious/noExplicitAny: Dynamic property enumeration for runtime comparison\n groundTruthObject: any\n): {\n valid: boolean;\n differences: Record<string, SerializedValue>;\n} {\n const differences: Record<string, SerializedValue> = {};\n\n const SKIP_ATTRS = new Set([\"parent\", \"_parent\"]);\n for (const attrName of Object.keys(groundTruthObject)) {\n if (attrName.startsWith(\"_\") || SKIP_ATTRS.has(attrName)) {\n continue;\n }\n\n const modelAttr = modelObject[attrName];\n const groundTruthAttr = groundTruthObject[attrName];\n\n // Deep comparison for objects and arrays\n if (!deepEqual(modelAttr, groundTruthAttr)) {\n differences[attrName] = {\n model: modelAttr,\n ground_truth: groundTruthAttr,\n };\n }\n }\n\n return {\n valid: Object.keys(differences).length === 0,\n differences,\n };\n}\n\nconst SKIP_KEYS = new Set([\"parent\", \"_parent\"]);\n\nfunction shouldSkipKey(key: string): boolean {\n return key.startsWith(\"_\") || SKIP_KEYS.has(key);\n}\n\nfunction getFilteredKeys(obj: object): string[] {\n return Object.keys(obj).filter((k) => !shouldSkipKey(k));\n}\n\nfunction deepEqualArrays(\n // biome-ignore lint/suspicious/noExplicitAny: Array element comparison\n a: any[],\n // biome-ignore lint/suspicious/noExplicitAny: Array element comparison\n b: any[],\n seen: WeakSet<object>\n): boolean {\n if (a.length !== b.length) {\n return false;\n }\n for (let i = 0; i < a.length; i++) {\n if (!deepEqual(a[i], b[i], seen)) {\n return false;\n }\n }\n return true;\n}\n\nfunction deepEqualObjects(\n // biome-ignore lint/suspicious/noExplicitAny: Object property comparison\n a: any,\n // biome-ignore lint/suspicious/noExplicitAny: Object property comparison\n b: any,\n seen: WeakSet<object>\n): boolean {\n const keysA = getFilteredKeys(a);\n const keysB = getFilteredKeys(b);\n\n if (keysA.length !== keysB.length) {\n return false;\n }\n\n for (const key of keysA) {\n if (!keysB.includes(key)) {\n return false;\n }\n if (!deepEqual(a[key], b[key], seen)) {\n return false;\n }\n }\n return true;\n}\n\nfunction deepEqual(\n // biome-ignore lint/suspicious/noExplicitAny: Deep equality check on unknown runtime types\n a: any,\n // biome-ignore lint/suspicious/noExplicitAny: Deep equality check on unknown runtime types\n b: any,\n seen: WeakSet<object> = new WeakSet()\n): boolean {\n if (a === b) {\n return true;\n }\n if (a == null || b == null) {\n return a === b;\n }\n if (typeof a !== typeof b) {\n return false;\n }\n if (typeof a !== \"object\") {\n return a === b;\n }\n\n if (seen.has(a) || seen.has(b)) {\n return true;\n }\n seen.add(a);\n if (typeof b === \"object\") {\n seen.add(b);\n }\n\n if (Array.isArray(a) && Array.isArray(b)) {\n return deepEqualArrays(a, b, seen);\n }\n if (Array.isArray(a) !== Array.isArray(b)) {\n return false;\n }\n\n return deepEqualObjects(a, b, seen);\n}\n\nfunction serializeInstanceState(\n // biome-ignore lint/suspicious/noExplicitAny: Serializes unknown instance types for error reporting\n instance: any\n): Record<string, SerializedValue> {\n const state: Record<string, SerializedValue> = {};\n\n for (const [key, value] of Object.entries(instance)) {\n if (!key.startsWith(\"_\")) {\n try {\n if (key === \"root\" && typeof value === \"object\") {\n state[key] = serializeDirectory(value);\n } else {\n state[key] =\n typeof value === \"object\"\n ? JSON.parse(JSON.stringify(value))\n : (value as SerializedValue);\n }\n } catch {\n state[key] = String(value);\n }\n }\n }\n\n return state;\n}\n\n// biome-ignore lint/suspicious/noExplicitAny: Handles Directory instances with dynamic contents property\nfunction serializeDirectory(dir: any, depth = 0): SerializedObject {\n if (depth > 5) {\n return { value: \"[Max depth reached]\" };\n }\n\n const result: SerializedObject = {\n name: dir.name,\n contents: {},\n };\n\n const contents = result.contents as Record<string, SerializedObject>;\n for (const [name, item] of Object.entries(dir.contents || {})) {\n if (item instanceof File) {\n contents[name] = { type: \"file\", content: item.content };\n } else if (item instanceof Directory) {\n contents[name] = serializeDirectory(item, depth + 1);\n }\n }\n\n return result;\n}\n","import {\n executeMultiTurnFuncCall,\n isEmptyExecuteResponse,\n resetInstancesForTest,\n} from \"./execution-engine\";\nimport { responseChecker } from \"./response-checker\";\nimport { SafeExecutor, type ToolCall } from \"./safe-executor\";\nimport { stateChecker } from \"./state-checker\";\n\nexport interface MultiTurnCheckResult {\n valid: boolean;\n error_type?: string;\n details?: unknown;\n}\n\nfunction parseGroundTruth(pythonCalls: string[]): ToolCall[] {\n return pythonCalls.map((call) => SafeExecutor.parsePythonCall(call));\n}\n\nexport async function multiTurnChecker(\n modelToolCalls: ToolCall[][][],\n groundTruthPythonCalls: string[][],\n testEntry: {\n id: string;\n initial_config?: Record<string, unknown>;\n involved_classes?: string[];\n },\n testCategory: string,\n modelName: string\n): Promise<MultiTurnCheckResult> {\n const initialConfig = testEntry.initial_config || {};\n const involvedClasses = testEntry.involved_classes || [];\n\n resetInstancesForTest(testEntry.id, modelName);\n resetInstancesForTest(testEntry.id, `${modelName}_ground_truth`);\n\n const initResult = await executeMultiTurnFuncCall(\n [],\n initialConfig,\n involvedClasses,\n modelName,\n testEntry.id,\n testCategory.includes(\"long_context\"),\n true\n );\n const initGtResult = await executeMultiTurnFuncCall(\n [],\n initialConfig,\n involvedClasses,\n `${modelName}_ground_truth`,\n testEntry.id,\n testCategory.includes(\"long_context\"),\n true\n );\n\n const allTurnModelExecutionResults: string[] = [];\n let finalModelInstances = initResult.involvedInstances;\n let finalGroundTruthInstances = initGtResult.involvedInstances;\n\n for (\n let turnIndex = 0;\n turnIndex < groundTruthPythonCalls.length;\n turnIndex++\n ) {\n const groundTruthCalls = parseGroundTruth(\n groundTruthPythonCalls[turnIndex]\n );\n const modelSteps = modelToolCalls[turnIndex] || [];\n\n const singleTurnModelExecutionResults: string[] = [];\n\n for (const stepToolCalls of modelSteps) {\n const stepResult = await executeMultiTurnFuncCall(\n stepToolCalls,\n initialConfig,\n involvedClasses,\n modelName,\n testEntry.id,\n testCategory.includes(\"long_context\"),\n true\n );\n singleTurnModelExecutionResults.push(...stepResult.executionResults);\n finalModelInstances = stepResult.involvedInstances;\n }\n\n const groundTruthResult = await executeMultiTurnFuncCall(\n groundTruthCalls,\n initialConfig,\n involvedClasses,\n `${modelName}_ground_truth`,\n testEntry.id,\n testCategory.includes(\"long_context\"),\n true\n );\n\n allTurnModelExecutionResults.push(...singleTurnModelExecutionResults);\n finalGroundTruthInstances = groundTruthResult.involvedInstances;\n\n if (groundTruthCalls.length === 0) {\n continue;\n }\n\n const stateCheckResult = stateChecker(\n finalModelInstances,\n finalGroundTruthInstances\n );\n if (!stateCheckResult.valid) {\n return {\n valid: false,\n error_type: stateCheckResult.error_type,\n details: stateCheckResult.details,\n };\n }\n\n const responseCheckResult = responseChecker(\n allTurnModelExecutionResults,\n groundTruthResult.executionResults,\n turnIndex\n );\n if (!responseCheckResult.valid) {\n return {\n valid: false,\n error_type: responseCheckResult.error_type,\n details: responseCheckResult.details,\n };\n }\n }\n\n return { valid: true };\n}\n\nexport function multiTurnIrrelevanceChecker(\n modelToolCalls: ToolCall[][][],\n groundTruthPythonCalls: string[][]\n): MultiTurnCheckResult {\n for (\n let turnIndex = 0;\n turnIndex < groundTruthPythonCalls.length;\n turnIndex++\n ) {\n const groundTruthCalls = groundTruthPythonCalls[turnIndex];\n const modelSteps = modelToolCalls[turnIndex] || [];\n\n const flatModelCalls = modelSteps.flat();\n const modelCallStrings = flatModelCalls.map((tc) =>\n tc.args ? JSON.stringify(tc) : \"None\"\n );\n\n if (\n groundTruthCalls.length === 0 &&\n !isEmptyExecuteResponse(modelCallStrings)\n ) {\n return {\n valid: false,\n error_type: \"multi_turn:irrelevance_error:decoder_success\",\n details: { model_response_decoded: modelSteps },\n };\n }\n }\n\n return { valid: true };\n}\n\nexport function resetTestInstances(\n testEntryId: string,\n modelName: string\n): void {\n resetInstancesForTest(testEntryId, modelName);\n resetInstancesForTest(testEntryId, `${modelName}_ground_truth`);\n}\n","/**\n * ComplexFuncBench - Complex Function Calling Benchmark\n *\n * This benchmark evaluates models on complex function calling scenarios including:\n * - Multi-step function calls in a single turn\n * - Function calling with constraints\n * - Parameter value reasoning from implicit information\n * - Long parameter values (500+ tokens)\n * - Parallel function calls\n *\n * Dataset: https://huggingface.co/datasets/THUDM/ComplexFuncBench\n * Paper: https://arxiv.org/abs/2501.10132\n */\n\nimport { promises as fs } from \"node:fs\";\nimport path from \"node:path\";\nimport type { JSONObject } from \"@ai-sdk/provider\";\nimport {\n generateText,\n jsonSchema,\n type LanguageModel,\n type ModelMessage,\n tool,\n} from \"ai\";\n\nimport type { BenchmarkResult, LanguageModelV3Benchmark } from \"../interfaces\";\nimport { resolveDataDir } from \"../utils/paths\";\n\n// Regex constants for performance\nconst LINE_SPLIT_REGEX = /\\r?\\n/;\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\ninterface Message {\n role: string;\n content: string;\n}\n\ninterface TestCase {\n id: string;\n question: 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: Record<string, unknown>[];\n}\n\ninterface ToolCall {\n toolName?: string;\n name?: string;\n args?: unknown;\n}\n\n// --- Helper Functions ---\n\n/**\n * Standardizes a string for comparison.\n */\nfunction standardizeString(input: string): string {\n if (typeof input !== \"string\") {\n return input;\n }\n return input.toLowerCase().trim();\n}\n\n/**\n * Checks if two values match with tolerance for ComplexFuncBench\n */\nfunction valuesMatch(modelValue: unknown, expectedValue: unknown): boolean {\n if (modelValue === expectedValue) {\n return true;\n }\n\n if (typeof modelValue === \"string\" && typeof expectedValue === \"string\") {\n return standardizeString(modelValue) === standardizeString(expectedValue);\n }\n\n if (typeof modelValue === \"number\" && typeof expectedValue === \"string\") {\n return (\n modelValue.toString() === expectedValue ||\n modelValue === Number(expectedValue)\n );\n }\n if (typeof modelValue === \"string\" && typeof expectedValue === \"number\") {\n return (\n modelValue === expectedValue.toString() ||\n Number(modelValue) === expectedValue\n );\n }\n\n if (\n typeof modelValue === \"object\" &&\n modelValue !== null &&\n typeof expectedValue === \"object\" &&\n expectedValue !== null\n ) {\n try {\n return JSON.stringify(modelValue) === JSON.stringify(expectedValue);\n } catch {\n return false;\n }\n }\n\n return false;\n}\n\n/**\n * Validate function name match\n */\nfunction validateFunctionName(\n modelFuncName: string | undefined,\n expectedFuncName: string\n): { valid: boolean; error?: string; error_type?: string } {\n if (modelFuncName !== expectedFuncName) {\n return {\n valid: false,\n error: `Function name mismatch: expected '${expectedFuncName}', got '${modelFuncName}'`,\n error_type: \"function_name_mismatch\",\n };\n }\n return { valid: true };\n}\n\n/**\n * Validate required parameters are present\n */\nfunction validateRequiredParams(\n requiredParams: string[],\n modelArgs: Record<string, unknown>,\n expectedArgs: Record<string, unknown>\n): { valid: boolean; error?: string; error_type?: string } {\n for (const param of requiredParams) {\n if (!(param in modelArgs) && param in expectedArgs) {\n return {\n valid: false,\n error: `Missing required parameter: '${param}'`,\n error_type: \"missing_required_param\",\n };\n }\n }\n return { valid: true };\n}\n\n/**\n * Validate parameter values match\n */\nfunction validateParamValues(\n expectedArgs: Record<string, unknown>,\n modelArgs: Record<string, unknown>,\n requiredParams: string[]\n): { valid: boolean; error?: string; error_type?: string } {\n for (const [paramName, expectedValue] of Object.entries(expectedArgs)) {\n if (!(paramName in modelArgs)) {\n if (!requiredParams.includes(paramName)) {\n continue;\n }\n return {\n valid: false,\n error: `Missing parameter: '${paramName}'`,\n error_type: \"missing_param\",\n };\n }\n\n const modelValue = modelArgs[paramName];\n if (!valuesMatch(modelValue, expectedValue)) {\n return {\n valid: false,\n error: `Parameter '${paramName}' value mismatch: expected ${JSON.stringify(expectedValue)}, got ${JSON.stringify(modelValue)}`,\n error_type: \"value_mismatch\",\n };\n }\n }\n return { valid: true };\n}\n\n/**\n * Check a single function call against expected\n */\nfunction checkFunctionCall(\n modelCall: ToolCall,\n expected: Record<string, unknown>,\n toolSpecs: ToolSpec[]\n): { valid: boolean; error?: string; error_type?: string } {\n const expectedFuncName = Object.keys(expected)[0];\n const expectedArgs = expected[expectedFuncName] as Record<string, unknown>;\n const modelFuncName = modelCall.toolName ?? modelCall.name;\n const modelArgs = (modelCall.args ?? {}) as Record<string, unknown>;\n\n const nameResult = validateFunctionName(modelFuncName, expectedFuncName);\n if (!nameResult.valid) {\n return nameResult;\n }\n\n const toolSpec = toolSpecs.find((t) => t.name === expectedFuncName);\n const requiredParams = toolSpec?.parameters?.required ?? [];\n\n const requiredResult = validateRequiredParams(\n requiredParams,\n modelArgs,\n expectedArgs\n );\n if (!requiredResult.valid) {\n return requiredResult;\n }\n\n return validateParamValues(expectedArgs, modelArgs, requiredParams);\n}\n\n/**\n * Check all function calls (parallel/single)\n */\nfunction checkAllFunctionCalls(\n modelCalls: ToolCall[],\n expectedCalls: Record<string, unknown>[],\n toolSpecs: ToolSpec[]\n): { valid: boolean; error?: string; error_type?: string } {\n if (modelCalls.length !== expectedCalls.length) {\n return {\n valid: false,\n error: `Wrong number of function calls: expected ${expectedCalls.length}, got ${modelCalls.length}`,\n error_type: \"wrong_call_count\",\n };\n }\n\n if (expectedCalls.length === 1) {\n return checkFunctionCall(modelCalls[0], expectedCalls[0], toolSpecs);\n }\n\n const matchedIndices = new Set<number>();\n for (const expected of expectedCalls) {\n let foundMatch = false;\n for (let i = 0; i < modelCalls.length; i++) {\n if (matchedIndices.has(i)) {\n continue;\n }\n\n const result = checkFunctionCall(modelCalls[i], expected, toolSpecs);\n if (result.valid) {\n matchedIndices.add(i);\n foundMatch = true;\n break;\n }\n }\n\n if (!foundMatch) {\n const expectedFuncName = Object.keys(expected)[0];\n return {\n valid: false,\n error: `Could not find matching call for function '${expectedFuncName}'`,\n error_type: \"no_matching_call\",\n };\n }\n }\n\n return { valid: true };\n}\n\n// --- Schema Fixers ---\nconst 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\nconst fixSchema = (schema: unknown): unknown => {\n if (!schema || typeof schema !== \"object\") {\n return { type: \"object\", properties: {} };\n }\n const copy = Array.isArray(schema)\n ? schema.map((v) => fixSchema(v))\n : ({ ...(schema as Record<string, unknown>) } as ToolSchemaObject);\n\n if (!Array.isArray(copy)) {\n fixSchemaType(copy);\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) {\n copy.items = fixSchema(copy.items);\n }\n }\n return copy;\n};\n\n// --- Tool Builder ---\nfunction buildTools(tools: ToolSpec[]) {\n const nameMap = new Map<string, string>();\n const transformedTools: TransformedTool[] = tools.map((t) => {\n const fixed = fixSchema(t.parameters) as ToolSchemaObject;\n const inputSchema =\n fixed &&\n typeof fixed === \"object\" &&\n (fixed as ToolSchemaObject).type === \"object\"\n ? (fixed as ToolSchemaObject)\n : { type: \"object\", properties: {} };\n\n const sanitized =\n t.name.replace(/[^a-zA-Z0-9_-]/g, \"_\").slice(0, 64) || \"tool\";\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\n const toolsMap = Object.fromEntries(\n transformedTools.map((t) => [\n t.name,\n tool({\n description:\n typeof t.description === \"string\" ? t.description : undefined,\n inputSchema: jsonSchema(t.inputSchema as Record<string, unknown>),\n }),\n ])\n );\n\n return { nameMap, toolsMap };\n}\n\n// --- Concurrency Mapper ---\nasync function mapWithConcurrency<T, R>(\n items: T[],\n concurrencyLimit: number,\n mapper: (item: T) => 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]);\n }\n });\n await Promise.all(workers);\n return results;\n}\n\n// --- Test Case Runner ---\nasync function runSingleCase(\n testCase: TestCase,\n model: LanguageModel,\n possibleAnswersMap: Map<string, PossibleAnswer>,\n temperature: number | undefined,\n maxTokens: number | undefined\n): Promise<{ valid: boolean; logs: string[] }> {\n const caseLogs: string[] = [];\n const { function: tools, question: messages } = testCase;\n\n try {\n const { nameMap, toolsMap } = buildTools(tools);\n\n const debugSummaryRef: { originalText?: string; toolCalls?: string } = {};\n const providerOptions: Record<string, JSONObject> = {\n toolCallMiddleware: { debugSummary: debugSummaryRef },\n };\n\n const { toolCalls, finishReason } = await generateText({\n model,\n messages: messages as unknown as ModelMessage[],\n tools: toolsMap,\n toolChoice: \"auto\",\n providerOptions,\n ...(temperature !== undefined ? { temperature } : {}),\n ...(maxTokens !== undefined ? { maxOutputTokens: maxTokens } : {}),\n });\n\n const restoredCalls = (toolCalls ?? []).map((c) => {\n const rawName =\n (c as Record<string, unknown>).toolName ??\n (c as Record<string, unknown>).name;\n const originalName = nameMap.get(rawName as string) ?? rawName;\n return {\n toolName: originalName,\n name: originalName,\n args:\n (c as Record<string, unknown>).input ??\n (c as Record<string, unknown>).args ??\n {},\n };\n });\n\n caseLogs.push(\n `[DEBUG] ${testCase.id}: toolCalls=${JSON.stringify(restoredCalls)}, finishReason=${finishReason}`\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 checkerResult = checkAllFunctionCalls(\n restoredCalls as ToolCall[],\n possibleAnswer.ground_truth,\n tools as ToolSpec[]\n );\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 return { valid: false, logs: caseLogs };\n } catch (e: unknown) {\n caseLogs.push(`[ERROR] ${testCase.id}: ${(e as Error)?.message}`);\n return { valid: false, logs: caseLogs };\n }\n}\n\n// --- Data Loading ---\nasync function loadTestData(dataPath: string, testDataFile: string) {\n const testCasesJson = await fs.readFile(\n path.join(dataPath, testDataFile),\n \"utf-8\"\n );\n return testCasesJson\n .split(LINE_SPLIT_REGEX)\n .filter((line) => line.trim().length > 0)\n .map((line) => JSON.parse(line) as TestCase);\n}\n\nasync function loadAnswerData(dataPath: string, answerDataFile: string) {\n const answersJson = await fs.readFile(\n path.join(dataPath, answerDataFile),\n \"utf-8\"\n );\n const answers: PossibleAnswer[] = answersJson\n .split(LINE_SPLIT_REGEX)\n .filter((line) => line.trim().length > 0)\n .map((line) => JSON.parse(line));\n return new Map(answers.map((ans) => [ans.id, ans]));\n}\n\nfunction getConfigValues(config?: Record<string, unknown>) {\n const limitEnv = process.env.COMPLEXFUNCBENCH_LIMIT;\n const limit = limitEnv ? Number(limitEnv) : undefined;\n\n const concurrencyEnv = process.env.COMPLEXFUNCBENCH_CONCURRENCY;\n const concurrency =\n concurrencyEnv && Number.isFinite(Number(concurrencyEnv))\n ? Math.max(1, Number(concurrencyEnv))\n : 4;\n\n const temperature =\n typeof config?.temperature === \"number\" ? config.temperature : undefined;\n const maxTokens =\n typeof config?.maxTokens === \"number\" ? config.maxTokens : undefined;\n\n return { limit, concurrency, temperature, maxTokens };\n}\n\nfunction aggregateResults(\n resultsPerCase: { valid: boolean; logs: string[] }[],\n testCases: TestCase[]\n): BenchmarkResult {\n const logs: string[] = [];\n const correctCount = resultsPerCase.reduce(\n (acc, r) => acc + (r.valid ? 1 : 0),\n 0\n );\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.5,\n metrics: {\n correct_count: correctCount,\n total_cases: testCases.length,\n accuracy: score,\n },\n logs,\n };\n}\n\n// --- Benchmark Factory ---\nfunction createComplexFuncBenchBenchmark(\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\n try {\n const dataPath = resolveDataDir();\n logs.push(`[INFO] Using data dir: ${dataPath}`);\n\n let testCases = await loadTestData(dataPath, testDataFile);\n const possibleAnswersMap = await loadAnswerData(\n dataPath,\n answerDataFile\n );\n\n const { limit, concurrency, temperature, maxTokens } =\n getConfigValues(config);\n\n if (limit && Number.isFinite(limit) && limit > 0) {\n testCases = testCases.slice(0, limit);\n logs.push(`[INFO] Limiting test cases to ${limit}`);\n }\n\n logs.push(\n `[INFO] Running ${testCases.length} test cases with concurrency=${concurrency}`\n );\n\n const resultsPerCase = await mapWithConcurrency(\n testCases,\n concurrency,\n (tc) =>\n runSingleCase(tc, model, possibleAnswersMap, temperature, maxTokens)\n );\n\n const result = aggregateResults(resultsPerCase, testCases);\n result.logs = [...logs, ...(result.logs ?? [])];\n return result;\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 ---\n\n/**\n * ComplexFuncBench benchmark - tests complex function calling scenarios\n * including multi-step calls, constraints, parameter reasoning, and long parameters.\n */\nexport const complexFuncBenchBenchmark = createComplexFuncBenchBenchmark(\n \"complex-func-bench\",\n \"ComplexFuncBench - Complex Function Calling (multi-step, constraints, long params)\",\n \"ComplexFuncBench.jsonl\",\n \"ComplexFuncBench_possible_answer.jsonl\"\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\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 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\ninterface 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\ninterface ValidationResult {\n valid: boolean;\n valuesOk: boolean;\n parsed: Json;\n}\n\ninterface 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\ninterface 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\ninterface 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 { LanguageModelV3Middleware } from \"@ai-sdk/provider\";\nimport { createDiskCacheMiddleware } from \"@ai-sdk-tool/middleware\";\nimport { type LanguageModel, wrapLanguageModel } from \"ai\";\nimport type {\n EvaluateOptions,\n EvaluationResult,\n LanguageModelV3Benchmark,\n ModelConfig,\n ReporterType,\n} from \"./interfaces\";\nimport { reporters } from \"./reporters\";\n\ntype ModelEntry = [\n string | undefined,\n LanguageModel,\n LanguageModelV3Middleware | LanguageModelV3Middleware[] | undefined,\n];\n\nfunction isModelConfig(value: unknown): value is ModelConfig {\n if (typeof value !== \"object\" || value === null) {\n return false;\n }\n const obj = value as Record<string, unknown>;\n if (!(\"model\" in obj)) {\n return false;\n }\n const model = obj.model;\n if (typeof model !== \"object\" || model === null) {\n return false;\n }\n return \"modelId\" in (model as Record<string, unknown>);\n}\n\nfunction isLanguageModel(value: unknown): value is LanguageModel {\n if (typeof value !== \"object\" || value === null) {\n return false;\n }\n const obj = value as Record<string, unknown>;\n return \"modelId\" in obj && typeof obj.modelId === \"string\";\n}\n\nfunction extractModelAndMiddleware(\n input: LanguageModel | ModelConfig\n): [\n LanguageModel,\n LanguageModelV3Middleware | LanguageModelV3Middleware[] | undefined,\n] {\n if (isModelConfig(input)) {\n return [input.model, input.middleware];\n }\n return [input, undefined];\n}\n\nfunction normalizeModels(models: EvaluateOptions[\"models\"]): ModelEntry[] {\n const entries: ModelEntry[] = [];\n\n if (Array.isArray(models)) {\n for (const m of models) {\n const [model, middleware] = extractModelAndMiddleware(m);\n entries.push([undefined, model, middleware]);\n }\n } else if (isModelConfig(models)) {\n entries.push([undefined, models.model, models.middleware]);\n } else if (isLanguageModel(models)) {\n entries.push([undefined, models, undefined]);\n } else {\n for (const [key, m] of Object.entries(models)) {\n const [model, middleware] = extractModelAndMiddleware(m);\n entries.push([key, model, middleware]);\n }\n }\n\n return entries;\n}\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\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\nfunction buildEffectiveModel(\n baseModel: LanguageModel,\n userMiddleware:\n | LanguageModelV3Middleware\n | LanguageModelV3Middleware[]\n | undefined,\n cacheOptions: EvaluateOptions[\"cache\"]\n): LanguageModel {\n const cacheEnabled = cacheOptions?.enabled === true;\n\n if (!(cacheEnabled || userMiddleware)) {\n return baseModel;\n }\n\n const cacheMiddleware = cacheEnabled\n ? createDiskCacheMiddleware({\n cacheDir: cacheOptions.cacheDir ?? \".ai-cache\",\n enabled: true,\n debug: cacheOptions.debug ?? false,\n })\n : null;\n\n const middlewares: LanguageModelV3Middleware[] = [];\n\n // Order: userMiddleware first (outermost), cache last (innermost)\n // This ensures cache sees transformed params for correct cache key generation\n // Applied as: userMiddleware(cacheMiddleware(model))\n if (userMiddleware) {\n if (Array.isArray(userMiddleware)) {\n middlewares.push(...userMiddleware);\n } else {\n middlewares.push(userMiddleware);\n }\n }\n\n if (cacheMiddleware) {\n middlewares.push(cacheMiddleware);\n }\n\n if (middlewares.length === 0) {\n return baseModel;\n }\n\n return wrapLanguageModel({\n // biome-ignore lint/suspicious/noExplicitAny: AI SDK v5/v6 type mismatch\n model: baseModel as any,\n middleware: middlewares.length === 1 ? middlewares[0] : middlewares,\n });\n}\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 const prefix = `[${modelId}]${modelKey ? ` (${modelKey})` : \"\"} ${benchmark.name}`;\n\n try {\n // Use console.log for reliable output in all environments\n if (process.stdout.isTTY) {\n process.stdout.write(`${prefix}: ...`);\n } else {\n console.log(`${prefix}: ...`);\n }\n const result = await benchmark.run(model, config);\n const scoreDisplay = result.score.toFixed(2);\n if (process.stdout.isTTY) {\n process.stdout.write(`\\r${prefix}: .... Score: ${scoreDisplay}\\n`);\n } else {\n console.log(`${prefix}: .... Score: ${scoreDisplay}`);\n }\n return {\n model: modelId,\n modelKey,\n benchmark: benchmark.name,\n result,\n };\n } catch (error) {\n if (process.stdout.isTTY) {\n process.stdout.write(`\\r${prefix}: .... Score: ERROR\\n`);\n } else {\n console.log(`${prefix}: .... Score: ERROR`);\n }\n console.error(error);\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 cache,\n } = options;\n\n const modelEntries = normalizeModels(models);\n const config = buildConfig(temperature, maxTokens);\n const allResults: EvaluationResult[] = [];\n\n for (const [modelKey, baseModel, userMiddleware] of modelEntries) {\n const effectiveModel = buildEffectiveModel(\n baseModel,\n userMiddleware,\n cache\n );\n\n for (const benchmark of benchmarks) {\n const evaluationResult = await runSingleBenchmark(\n effectiveModel,\n benchmark,\n modelKey,\n config\n );\n allResults.push(evaluationResult);\n }\n }\n\n executeReporter(reporter, allResults);\n return allResults;\n}\n","import type { EvaluationResult } from \"../interfaces\";\n\nconst colors = {\n reset: \"\\x1b[0m\",\n bold: \"\\x1b[1m\",\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 white: \"\\x1b[37m\",\n};\n\nconst DEBUG_FAIL_REGEX = /^\\[DEBUG-FAIL\\] /;\nconst PASS_REGEX = /^\\[PASS\\] (.+)$/;\nconst FAIL_REGEX = /^\\[FAIL\\] ([^:]+)(?:: (.+))?$/;\n\ninterface TestResult {\n id: string;\n passed: boolean;\n reason?: string;\n}\n\ninterface ParsedFailure {\n id: string;\n category?: string;\n message?: string;\n error_type?: string;\n expected?: Record<string, unknown>;\n actual?: Record<string, unknown>;\n diff?: string[];\n context?: {\n raw_model_text?: string;\n expected_count?: number;\n actual_count?: number;\n };\n}\n\nfunction formatDiff(diff: string[]): string {\n if (!diff || diff.length === 0) {\n return \"\";\n }\n\n return diff\n .slice(0, 8)\n .map((line) => {\n if (line.startsWith(\"-\")) {\n return `${colors.red}${line}${colors.reset}`;\n }\n if (line.startsWith(\"+\")) {\n return `${colors.green}${line}${colors.reset}`;\n }\n if (line.startsWith(\"@@\")) {\n return `${colors.cyan}${line}${colors.reset}`;\n }\n return line;\n })\n .join(\"\\n \");\n}\n\nfunction parseFailures(logs: string[]): ParsedFailure[] {\n const failures: ParsedFailure[] = [];\n\n for (const log of logs) {\n if (!DEBUG_FAIL_REGEX.test(log)) {\n continue;\n }\n\n try {\n const jsonStr = log.replace(DEBUG_FAIL_REGEX, \"\");\n const parsed = JSON.parse(jsonStr) as ParsedFailure;\n failures.push(parsed);\n } catch {\n // Malformed JSON, skip\n }\n }\n\n return failures;\n}\n\nfunction groupFailuresByCategory(\n failures: ParsedFailure[]\n): Map<string, ParsedFailure[]> {\n const groups = new Map<string, ParsedFailure[]>();\n\n for (const failure of failures) {\n const category = failure.category || \"OTHER\";\n const existing = groups.get(category);\n\n if (existing) {\n existing.push(failure);\n } else {\n groups.set(category, [failure]);\n }\n }\n\n return groups;\n}\n\nfunction printCompactFailure(failure: ParsedFailure): void {\n console.log(\n `\\n ${colors.red}${failure.id}${colors.reset} [${colors.yellow}${failure.category || \"OTHER\"}${colors.reset}]`\n );\n\n if (failure.message) {\n console.log(` ${failure.message}`);\n }\n\n if (failure.diff && failure.diff.length > 0) {\n console.log(` ${formatDiff(failure.diff)}`);\n }\n\n if (failure.context?.raw_model_text && failure.category === \"PARSE_FAILURE\") {\n const text = failure.context.raw_model_text;\n const truncated = text.length > 80 ? `${text.slice(0, 80)}...` : text;\n console.log(` ${colors.gray}Model: \"${truncated}\"${colors.reset}`);\n }\n}\n\nfunction printFailureSummary(failures: ParsedFailure[]): void {\n const groups = groupFailuresByCategory(failures);\n const sorted = [...groups.entries()].sort(\n (a, b) => b[1].length - a[1].length\n );\n\n console.log(`\\n ${colors.bold}Failures by category:${colors.reset}`);\n\n for (const [category, categoryFailures] of sorted) {\n console.log(\n ` ${colors.yellow}${category}${colors.reset}: ${categoryFailures.length}`\n );\n }\n\n const maxToShow = 5;\n const shown = failures.slice(0, maxToShow);\n\n for (const failure of shown) {\n printCompactFailure(failure);\n }\n\n if (failures.length > maxToShow) {\n const remaining = failures.length - maxToShow;\n const remainingIds = failures.slice(maxToShow).map((f) => f.id);\n const idPreview = remainingIds.slice(0, 5).join(\", \");\n const more = remainingIds.length > 5 ? \"...\" : \"\";\n console.log(\n `\\n ${colors.gray}+${remaining} more: ${idPreview}${more}${colors.reset}`\n );\n }\n}\n\nfunction parseTestResults(logs: string[]): TestResult[] {\n const results: TestResult[] = [];\n\n for (const log of logs) {\n const passMatch = log.match(PASS_REGEX);\n if (passMatch) {\n results.push({ id: passMatch[1], passed: true });\n continue;\n }\n\n const failMatch = log.match(FAIL_REGEX);\n if (failMatch) {\n results.push({\n id: failMatch[1],\n passed: false,\n reason: failMatch[2],\n });\n }\n }\n\n return results;\n}\n\nfunction printTestResults(testResults: TestResult[]): void {\n const passed = testResults.filter((r) => r.passed);\n const failed = testResults.filter((r) => !r.passed);\n\n if (passed.length > 0) {\n const passedIds = passed.map((r) => r.id).join(\", \");\n console.log(\n ` ${colors.green}✔ Passed (${passed.length}):${colors.reset} ${passedIds}`\n );\n }\n\n if (failed.length > 0) {\n console.log(` ${colors.red}✖ Failed (${failed.length}):${colors.reset}`);\n for (const f of failed) {\n const reason = f.reason\n ? `: ${colors.gray}${f.reason}${colors.reset}`\n : \"\";\n console.log(` ${colors.red}${f.id}${colors.reset}${reason}`);\n }\n }\n}\n\nfunction printResult(result: EvaluationResult): void {\n const { model, modelKey, benchmark, result: benchmarkResult } = result;\n\n const passed = benchmarkResult.metrics.correct_count as number | undefined;\n const total = benchmarkResult.metrics.total_cases as number | undefined;\n const scorePercent = (benchmarkResult.score * 100).toFixed(1);\n\n const statusIcon = benchmarkResult.success ? \"✔\" : \"✖\";\n const statusColor = benchmarkResult.success ? colors.green : colors.red;\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 ` └ ${statusColor}${statusIcon} ${scorePercent}%${colors.reset} (${passed ?? \"?\"}/${total ?? \"?\"} passed)`\n );\n\n if (benchmarkResult.error) {\n console.log(\n ` ${colors.red}Error: ${benchmarkResult.error.message}${colors.reset}`\n );\n }\n\n if (benchmarkResult.logs && benchmarkResult.logs.length > 0) {\n const structuredFailures = parseFailures(benchmarkResult.logs);\n const testResults = parseTestResults(benchmarkResult.logs);\n\n // Always show test results if available\n if (testResults.length > 0) {\n printTestResults(testResults);\n }\n\n // Show structured failure details if available\n if (structuredFailures.length > 0) {\n printFailureSummary(structuredFailures);\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\nconst colors = {\n reset: \"\\x1b[0m\",\n bold: \"\\x1b[1m\",\n dim: \"\\x1b[2m\",\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 white: \"\\x1b[37m\",\n};\n\nconst DEBUG_FAIL_REGEX = /^\\[DEBUG-FAIL\\] /;\nconst ID_NUM_REGEX = /_(\\d+)$/;\nconst REASONING_TAG = \"think\";\nconst MAX_FAILURES_TO_DISPLAY = 5;\n\ninterface FailureContext {\n raw_model_text?: string;\n raw_model_text_full?: string;\n reasoning?: string;\n parsed_tool_calls?: unknown[];\n expected_count?: number;\n actual_count?: number;\n finish_reason?: unknown;\n last_user_query?: string;\n tool_names?: string[];\n}\n\ninterface ParsedFailure {\n id: string;\n category: string;\n message?: string;\n error_type?: string;\n expected?: Record<string, unknown>;\n actual?: Record<string, unknown>;\n diff?: string[];\n context?: FailureContext;\n}\n\ninterface CategoryGroup {\n failures: ParsedFailure[];\n pattern?: string;\n}\n\ninterface CategoryInfo {\n label: string;\n description: string;\n hint?: string;\n}\n\nconst CATEGORY_DESCRIPTIONS: Record<string, CategoryInfo> = {\n PARSE_FAILURE: {\n label: \"Parse Failure\",\n description: \"No tool calls extracted from model output\",\n hint: \"Model may have responded in text instead of tool format\",\n },\n PARTIAL_CALLS: {\n label: \"Partial Calls\",\n description: \"Some expected tool calls missing\",\n hint: \"Model stopped early or missed some tools\",\n },\n EXTRA_CALLS: {\n label: \"Extra Calls\",\n description: \"More tool calls than expected\",\n hint: \"Model called tools that weren't needed\",\n },\n PARAM_VALUE_PERCENT: {\n label: \"Param Value (Percent)\",\n description: \"Percentage sent as integer instead of decimal\",\n hint: \"e.g., 5 instead of 0.05 for 5%\",\n },\n PARAM_VALUE_MISMATCH: {\n label: \"Param Value Mismatch\",\n description: \"Parameter values don't match expected\",\n },\n WRONG_FUNCTION: {\n label: \"Wrong Function\",\n description: \"Called wrong function name\",\n },\n MISSING_PARAMS: {\n label: \"Missing Params\",\n description: \"Required parameters not provided\",\n },\n UNEXPECTED_PARAMS: {\n label: \"Unexpected Params\",\n description: \"Extra parameters that shouldn't be there\",\n },\n NO_MATCH: {\n label: \"No Match\",\n description: \"Function called but couldn't match to expected\",\n hint: \"Parameters may be correct but don't match any expected combination\",\n },\n OTHER: {\n label: \"Other\",\n description: \"Uncategorized failure\",\n },\n};\n\nfunction parseFailureLogs(logs: string[]): ParsedFailure[] {\n return logs\n .filter((log) => DEBUG_FAIL_REGEX.test(log))\n .map((log) => {\n try {\n const jsonStr = log.replace(DEBUG_FAIL_REGEX, \"\");\n return JSON.parse(jsonStr) as ParsedFailure;\n } catch {\n return null;\n }\n })\n .filter((parsed): parsed is ParsedFailure => parsed !== null);\n}\n\nfunction groupByCategory(\n failures: ParsedFailure[]\n): Map<string, CategoryGroup> {\n const groups = new Map<string, CategoryGroup>();\n\n for (const failure of failures) {\n const category = failure.category || \"OTHER\";\n const existing = groups.get(category);\n\n if (existing) {\n existing.failures.push(failure);\n } else {\n groups.set(category, { failures: [failure] });\n }\n }\n\n return groups;\n}\n\nfunction extractParamNames(failures: ParsedFailure[]): Set<string> {\n const paramNames = new Set<string>();\n for (const f of failures) {\n if (!f.diff) {\n continue;\n }\n for (const d of f.diff) {\n if (d.startsWith(\"@@ param \")) {\n paramNames.add(d.replace(\"@@ param \", \"\"));\n }\n }\n }\n return paramNames;\n}\n\nfunction extractFinishReasons(failures: ParsedFailure[]): Set<string> {\n const finishReasons = new Set<string>();\n for (const f of failures) {\n if (f.context?.finish_reason) {\n finishReasons.add(String(f.context.finish_reason));\n }\n }\n return finishReasons;\n}\n\nfunction detectPatterns(group: CategoryGroup): void {\n const { failures } = group;\n\n if (failures.length < 2) {\n return;\n }\n\n const firstCategory = failures[0].category;\n\n if (firstCategory === \"PARAM_VALUE_PERCENT\") {\n const paramNames = extractParamNames(failures);\n if (paramNames.size > 0) {\n group.pattern = `Affected params: ${[...paramNames].join(\", \")}`;\n }\n }\n\n if (firstCategory === \"PARSE_FAILURE\") {\n const finishReasons = extractFinishReasons(failures);\n if (finishReasons.size === 1) {\n group.pattern = `All finished with: ${[...finishReasons][0]}`;\n }\n }\n}\n\nfunction getLineColor(line: string): string {\n if (line.startsWith(\"+\")) {\n return colors.green;\n }\n if (line.startsWith(\"-\")) {\n return colors.red;\n }\n if (line.startsWith(\"@@\")) {\n return colors.cyan;\n }\n return colors.white;\n}\n\nfunction formatFunctions(funcs: unknown): string {\n if (Array.isArray(funcs)) {\n return funcs.join(\", \");\n }\n return String(funcs);\n}\n\nfunction printExpectedActual(failure: ParsedFailure): void {\n if (failure.expected) {\n const expFuncs = failure.expected.functions || failure.expected.function;\n if (expFuncs) {\n console.log(\n ` ${colors.gray}Expected:${colors.reset} ${formatFunctions(expFuncs)}`\n );\n }\n }\n\n if (failure.actual) {\n const actFuncs = failure.actual.functions || failure.actual.function;\n if (actFuncs) {\n const isEmpty = Array.isArray(actFuncs) && actFuncs.length === 0;\n const color = isEmpty ? colors.red : colors.white;\n const text = isEmpty ? \"(none)\" : formatFunctions(actFuncs);\n console.log(\n ` ${colors.gray}Actual:${colors.reset} ${color}${text}${colors.reset}`\n );\n }\n }\n}\n\nfunction printDiff(diff: string[]): void {\n console.log(` ${colors.gray}Diff:${colors.reset}`);\n for (const line of diff.slice(0, MAX_FAILURES_TO_DISPLAY)) {\n const lineColor = getLineColor(line);\n console.log(` ${lineColor}${line}${colors.reset}`);\n }\n}\n\nfunction removeReasoningTags(text: string): string {\n const openTag = `<${REASONING_TAG}>`;\n const closeTag = `</${REASONING_TAG}>`;\n const closedTagPattern = new RegExp(\n `${openTag.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\")}[\\\\s\\\\S]*?${closeTag.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\")}`,\n \"g\"\n );\n const unclosedTagPattern = new RegExp(\n `${openTag.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\")}[\\\\s\\\\S]*`,\n \"g\"\n );\n let result = text.replace(closedTagPattern, \"\");\n result = result.replace(unclosedTagPattern, \"\");\n return result.trim();\n}\n\nfunction printModelOutput(failure: ParsedFailure, category: string): void {\n if (category !== \"PARSE_FAILURE\") {\n return;\n }\n\n const rawText =\n failure.context?.raw_model_text_full ||\n failure.context?.raw_model_text ||\n \"\";\n const cleanedText = removeReasoningTags(rawText);\n\n if (cleanedText) {\n console.log(\n ` ${colors.gray}Model said:${colors.reset} \"${colors.dim}${cleanedText}${colors.reset}\"`\n );\n } else {\n console.log(\n ` ${colors.gray}Model said:${colors.reset} ${colors.dim}(only reasoning, no tool call output)${colors.reset}`\n );\n }\n}\n\nfunction shouldShowDiffByDefault(category: string): boolean {\n return (\n category === \"PARAM_VALUE_MISMATCH\" || category === \"PARAM_VALUE_PERCENT\"\n );\n}\n\nfunction printSingleFailure(\n failure: ParsedFailure,\n category: string,\n verbose: boolean\n): void {\n console.log(`\\n ${colors.bold}${failure.id}${colors.reset}`);\n\n const hasDiff = failure.diff && failure.diff.length > 0;\n const showDiffPrimarily = shouldShowDiffByDefault(category) && hasDiff;\n\n if (showDiffPrimarily) {\n printDiff(failure.diff as string[]);\n } else {\n printExpectedActual(failure);\n if (hasDiff && verbose) {\n printDiff(failure.diff as string[]);\n }\n }\n\n printModelOutput(failure, category);\n}\n\nconst MAX_SAMPLE_FAILURES = 2;\n\nfunction printRemainingIds(failures: ParsedFailure[]): void {\n const remainingIds = failures.slice(MAX_SAMPLE_FAILURES).map((f) => f.id);\n const idNums = remainingIds.map((id) => {\n const match = id.match(ID_NUM_REGEX);\n return match ? match[1] : id;\n });\n console.log(\n `\\n ${colors.dim}+${failures.length - MAX_SAMPLE_FAILURES} more: ${idNums.join(\", \")}${colors.reset}`\n );\n}\n\nfunction printCategoryHeader(info: CategoryInfo, count: number): void {\n console.log(\n `\\n${colors.cyan}───── ${info.label} (${count}) ─────${colors.reset}`\n );\n console.log(`${colors.dim}${info.description}${colors.reset}`);\n}\n\nfunction printCategoryDetails(\n category: string,\n group: CategoryGroup,\n verbose: boolean\n): void {\n const info = CATEGORY_DESCRIPTIONS[category] || CATEGORY_DESCRIPTIONS.OTHER;\n const { failures } = group;\n\n printCategoryHeader(info, failures.length);\n\n if (group.pattern) {\n console.log(`${colors.yellow}Pattern: ${group.pattern}${colors.reset}`);\n }\n\n if (info.hint) {\n console.log(`${colors.magenta}Hint: ${info.hint}${colors.reset}`);\n }\n\n const samplesToShow = verbose ? failures : failures.slice(0, 2);\n\n for (const failure of samplesToShow) {\n printSingleFailure(failure, category, verbose);\n }\n\n if (!verbose && failures.length > 2) {\n printRemainingIds(failures);\n }\n}\n\nfunction printResultHeader(result: EvaluationResult): void {\n const { model, modelKey, benchmark, result: benchmarkResult } = result;\n\n const passed = benchmarkResult.metrics.correct_count as number | undefined;\n const total = benchmarkResult.metrics.total_cases as number | undefined;\n const scorePercent = (benchmarkResult.score * 100).toFixed(1);\n\n const statusIcon = benchmarkResult.success ? \"✔\" : \"✖\";\n const statusColor = benchmarkResult.success ? colors.green : colors.red;\n\n const modelPart = `${colors.cyan}${model}${colors.reset}${modelKey ? ` ${colors.dim}(${modelKey})${colors.reset}` : \"\"}`;\n const benchmarkPart = `${colors.magenta}${benchmark}${colors.reset}`;\n const scorePart = `${statusColor}${statusIcon} ${scorePercent}%${colors.reset} (${passed ?? \"?\"}/${total ?? \"?\"} passed)`;\n\n console.log(\n `\\n${colors.bold}━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━${colors.reset}`\n );\n console.log(`${modelPart} │ ${benchmarkPart} │ ${scorePart}`);\n}\n\nfunction printResultSummary(result: EvaluationResult, verbose: boolean): void {\n const { result: benchmarkResult } = result;\n\n printResultHeader(result);\n\n if (!benchmarkResult.logs || benchmarkResult.logs.length === 0) {\n return;\n }\n\n const failures = parseFailureLogs(benchmarkResult.logs);\n\n if (failures.length === 0) {\n if (!benchmarkResult.success) {\n console.log(\n `${colors.yellow}No structured failure data available${colors.reset}`\n );\n }\n return;\n }\n\n const groups = groupByCategory(failures);\n\n for (const group of groups.values()) {\n detectPatterns(group);\n }\n\n const sortedCategories = [...groups.entries()].sort(\n (a, b) => b[1].failures.length - a[1].failures.length\n );\n\n for (const [cat, group] of sortedCategories) {\n printCategoryDetails(cat, group, verbose);\n }\n}\n\nexport function consoleSummaryReporter(results: EvaluationResult[]): void {\n const verbose = process.env.VERBOSE === \"true\";\n\n console.log(`\\n${colors.bold}Evaluation Report (Summary)${colors.reset}`);\n console.log(`${colors.dim}Use VERBOSE=true for full details${colors.reset}`);\n\n for (const result of results) {\n printResultSummary(result, verbose);\n }\n\n console.log(\n `\\n${colors.bold}━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━${colors.reset}\\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 { consoleSummaryReporter } from \"./console.summary\";\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 \"console.summary\": consoleSummaryReporter,\n};\n"],"mappings":"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AAC,WAAW,GAAG;AAAA,EACf,CAAC,WAAW,GAAG;AAAA,EACf,CAAC,WAAW,GAAG;AAAA,EACf,CAAC,WAAW,GAAG;AAAA,EACf,CAAC,WAAW,GAAG;AAAA,EACf,CAAC,WAAW,GAAG;AAAA,EACf,CAAC,WAAW,GAAG;AAAA,EACf,CAAC,WAAW,GAAG;AAAA,EACf,CAAC,WAAW,GAAG;AAAA,EACf,CAAC,WAAW,GAAG;AAAA,EACf,CAAC,WAAW,GAAG;AAAA,EACf,CAAC,WAAW,GAAG;AAAA,EACf,CAAC,WAAW,GAAG;AAAA,EACf,CAAC,WAAW,GAAG;AAAA,EACf,CAAC,WAAW,GAAG;AAAA,EACf,CAAC,WAAW,GAAG;AAAA,EACf,CAAC,WAAW,GAAG;AAAA,EACf,CAAC,WAAW,GAAG;AAAA,EACf,CAAC,WAAW,GAAI;AAAA,EAChB,CAAC,WAAW,GAAG;AAAA,EACf,CAAC,WAAW,GAAG;AAAA,EACf,CAAC,WAAW,GAAG;AAAA,EACf,CAAC,WAAW,GAAG;AAAA,EACf,CAAC,WAAW,GAAG;AAAA,EACf,CAAC,WAAW,GAAG;AAAA,EACf,CAAC,WAAW,GAAG;AAAA,EACf,CAAC,WAAW,GAAG;AAAA,EACf,CAAC,WAAW,GAAG;AAAA,EACf,CAAC,WAAW,GAAG;AAAA,EACf,CAAC,WAAW,GAAG;AAAA,EACf,CAAC,WAAW,GAAG;AAAA,EACf,CAAC,WAAW,GAAG;AAAA,EACf,CAAC,WAAW,GAAG;AAAA,EACf,CAAC,WAAW,GAAG;AAAA,EACf,CAAC,WAAW,GAAG;AAAA,EACf,CAAC,WAAW,GAAG;AAAA,EACf,CAAC,WAAW,GAAG;AAAA,EACf,CAAC,WAAW,GAAG;AAAA,EACf,CAAC,WAAW,GAAG;AAAA,EACf,CAAC,WAAW,GAAG;AAAA,EACf,CAAC,WAAW,GAAG;AAAA,EACf,CAAC,WAAW,GAAG;AAAA,EACf,CAAC,WAAW,GAAG;AAAA,EACf,CAAC,WAAW,GAAG;AAAA,EACf,CAAC,WAAW,GAAG;AAAA,EACf,CAAC,WAAW,GAAG;AAAA,EACf,CAAC,WAAW,GAAG;AAAA,EACf,CAAC,WAAW,GAAG;AAAA,EACf,CAAC,WAAW,GAAG;AAAA,EACf,CAAC,WAAW,GAAG;AAAA,EACf,CAAC,WAAW,GAAG;AAAA,EACf,CAAC,WAAW,GAAG;AAAA,EACf,CAAC,WAAW,GAAG;AAAA,EACf,CAAC,WAAW,GAAG;AAAA,EACf,CAAC,WAAW,GAAG;AAAA,EACf,CAAC,WAAW,GAAG;AAAA,EACf,CAAC,WAAW,GAAG;AAAA,EACf,CAAC,WAAW,GAAG;AAAA,EACf,CAAC,WAAW,GAAG;AAAA,EACf,CAAC,WAAW,GAAG;AAAA,EACf,CAAC,WAAW,GAAG;AAAA,EACf,CAAC,WAAW,GAAG;AAAA,EACf,CAAC,WAAW,GAAG;AAAA,EACf,CAAC,WAAW,GAAG;AAAA,EACf,CAAC,WAAW,GAAG;AAAA,EACf,CAAC,WAAW,GAAG;AAAA,EACf,CAAC,WAAW,GAAG;AAAA,EACf,CAAC,WAAW,GAAG;AAAA,EACf,CAAC,WAAW,GAAG;AAAA,EACf,CAAC,WAAW,GAAG;AAAA,EACf,CAAC,WAAW,GAAG;AAAA,EACf,CAAC,WAAW,GAAG;AAAA,EACf,CAAC,WAAW,GAAG;AAAA,EACf,CAAC,WAAW,GAAG;AAAA,EACf,CAAC,WAAW,GAAG;AAAA,EACf,CAAC,WAAW,GAAG;AAAA,EACf,CAAC,WAAW,GAAG;AAAA,EACf,CAAC,WAAW,GAAG;AAAA,EACf,CAAC,WAAW,GAAG;AAAA,EACf,CAAC,WAAW,GAAG;AAAA,EACf,CAAC,WAAW,GAAG;AAAA,EACf,CAAC,WAAW,GAAG;AAAA,EACf,CAAC,WAAW,GAAG;AAAA,EACf,CAAC,WAAW,GAAG;AAAA,EACf,CAAC,WAAW,GAAG;AAAA,EACf,CAAC,WAAW,GAAG;AAAA,EACf,CAAC,WAAW,GAAG;AAAA,EACf,CAAC,WAAW,GAAG;AAAA,EACf,CAAC,WAAW,GAAG;AAAA,EACf,CAAC,WAAW,GAAG;AAAA,EACf,CAAC,WAAW,GAAG;AAAA,EACf,CAAC,WAAW,GAAG;AAAA,EACf,CAAC,WAAW,GAAG;AAAA,EACf,CAAC,WAAW,GAAG;AAAA,EACf,CAAC,WAAW,GAAG;AAAA,EACf,CAAC,WAAW,GAAG;AAAA,EACf,CAAC,WAAW,GAAG;AAAA,EACf,CAAC,WAAW,GAAG;AAAA,EACf,CAAC,WAAW,GAAG;AAAA,EACf,CAAC,WAAW,GAAG;AAAA,EACf,CAAC,WAAW,GAAG;AAAA,EACf,CAAC,WAAW,GAAG;AAAA,EACf,CAAC,WAAW,GAAG;AAAA,EACf,CAAC,WAAW,GAAG;AAAA,EACf,CAAC,WAAW,GAAG;AAAA,EACf,CAAC,WAAW,GAAG;AAAA,EACf,CAAC,WAAW,GAAG;AAAA,EACf,CAAC,WAAW,GAAG;AAAA,EACf,CAAC,WAAW,GAAG;AAAA,EACf,CAAC,WAAW,GAAG;AAAA,EACf,CAAC,WAAW,GAAG;AAAA,EACf,CAAC,WAAW,GAAG;AAAA,EACf,CAAC,WAAW,GAAG;AAAA,EACf,CAAC,WAAW,GAAG;AAAA,EACf,CAAC,WAAW,GAAG;AAAA,EACf,CAAC,WAAW,GAAG;AAAA,EACf,CAAC,WAAW,GAAG;AAAA,EACf,CAAC,WAAW,GAAG;AAAA,EACf,CAAC,WAAW,GAAG;AAAA,EACf,CAAC,WAAW,GAAG;AACjB,CAAC;AAED,IAAM,cAAsC;AAAA,EAC1C,WAAW;AAAA,EACX,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,aAAa;AAAA,EACb,QAAQ;AAAA,EACR,OAAO;AAAA,EACP,iBAAiB;AAAA,EACjB,WAAW;AAAA,EACX,YAAY;AAAA,EACZ,mBAAmB;AAAA,EACnB,aAAa;AAAA,EACb,WAAW;AAAA,EACX,YAAY;AAAA,EACZ,iBAAiB;AAAA,EACjB,eAAe;AAAA,EACf,YAAY;AAAA,EACZ,SAAS;AAAA,EACT,QAAQ;AAAA,EACR,SAAS;AAAA,EACT,aAAa;AAAA,EACb,MAAM;AAAA,EACN,OAAO;AACT;AAEA,IAAM,iBAAsC,oBAAI,IAAI;AAAA,EAClD,CAAC,WAAW,CAAC;AAAA,EACb,CAAC,WAAW,GAAG;AAAA,EACf,CAAC,WAAW,GAAG;AAAA,EACf,CAAC,WAAW,GAAG;AAAA,EACf,CAAC,WAAW,GAAG;AAAA,EACf,CAAC,WAAW,GAAG;AAAA,EACf,CAAC,WAAW,EAAE;AAAA,EACd,CAAC,WAAW,EAAE;AAAA,EACd,CAAC,WAAW,GAAG;AAAA,EACf,CAAC,WAAW,EAAE;AAChB,CAAC;AAED,IAAM,eAAe;AAAA,EACnB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAEA,IAAMC,gBAAN,MAAmB;AAAA,EAGjB,YAAY,MAAc;AACxB,SAAK,OAAO;AAAA,EACd;AAAA,EAEA,OAAe;AAEb,SAAK,OAAQ,KAAK,OAAO,aAAgB,QAAU;AACnD,WAAO,KAAK;AAAA,EACd;AAAA,EAEA,QAAQ,KAAa,KAAqB;AACxC,WAAO,MAAO,KAAK,KAAK,KAAK,MAAM,MAAM;AAAA,EAC3C;AACF;AAEO,IAAM,YAAN,MAAgB;AAAA,EAcrB,cAAc;AAJd,uBAAc;AAEd,SAAiB,oBAAkD,oBAAI,IAAI;AA9S7E;AAiTI,SAAK,iBAAiB,CAAC;AACvB,SAAK,gBAAgB,CAAC;AACtB,SAAK,UAAU,IAAIA,eAAa,KAAAD,eAAc,gBAAd,YAA6B,MAAO;AAAA,EACtE;AAAA,EAEA,cAAc,UAA0B,cAAc,OAAa;AAtTrE;AAuTI,UAAM,cAAc,KAAK,MAAM,KAAK,UAAUA,cAAa,CAAC;AAC5D,SAAK,UAAU,IAAIC;AAAA,OACjB,cAAS,gBAAT,YAAwB,YAAY;AAAA,IACtC;AAEA,SAAK,kBACH,cAAS,qBAAT,YAA6B,YAAY;AAC3C,SAAK,iBAAgB,cAAS,mBAAT,YAA2B,YAAY;AAC5D,SAAK,eAAc,cAAS,iBAAT,YAAyB,YAAY;AACxD,SAAK,aAAY,cAAS,eAAT,YAAuB,YAAY;AACpD,SAAK,kBACH,cAAS,qBAAT,YAA6B,YAAY;AAC3C,SAAK,cAAa,cAAS,gBAAT,YAAwB,YAAY;AACtD,SAAK,iBACH,cAAS,oBAAT,YAA4B,YAAY;AAC1C,SAAK,gBAAe,cAAS,mBAAT,YAA2B,YAAY;AAC3D,SAAK,eAAc,cAAS,iBAAT,YAAyB,YAAY;AACxD,SAAK,cAAc;AAAA,EACrB;AAAA,EAEA,mBACE,WACA,eACA,eACA,WACA,eACA,cACyB;AACzB,SAAK,iBAAiB;AACtB,SAAK,cAAc,OAAO,KAAK,QAAQ,QAAQ,KAAS,MAAO,CAAC;AAChE,SAAK,YAAY;AACjB,SAAK,aAAa;AAClB,SAAK,gBAAgB;AACrB,SAAK,eAAe;AACpB,WAAO;AAAA,MACL,YAAY;AAAA,MACZ,cAAc,KAAK;AAAA,MACnB,YAAY;AAAA,MACZ,OAAO;AAAA,IACT;AAAA,EACF;AAAA,EAEA,uBAAgD;AAC9C,UAAM,gBACJ,KAAK,mBAAmB,UAAa,KAAK,mBAAmB;AAC/D,WAAO,EAAE,QAAQ,CAAC,cAAc;AAAA,EAClC;AAAA,EAEA,oBACE,oBACA,iBACwB;AACxB,WAAO,EAAE,oBAAoB,OAAO;AAAA,EACtC;AAAA,EAEA,mBACE,aACA,YACA,gBACA,gBACA,wBACyB;AACzB,QAAI,KAAK,mBAAmB,QAAW;AACrC,aAAO,EAAE,OAAO,wBAAwB;AAAA,IAC1C;AACA,QAAI,KAAK,mBAAmB,GAAG;AAC7B,aAAO,EAAE,OAAO,gBAAgB;AAAA,IAClC;AACA,QAAI,gBAAgB,KAAK,aAAa;AACpC,aAAO,EAAE,OAAO,uBAAuB;AAAA,IACzC;AACA,QAAI,cAAc,KAAK,gBAAgB;AACrC,aAAO,EAAE,OAAO,0BAA0B;AAAA,IAC5C;AAEA,UAAM,SAAS;AAAA,MACb,KAAK,QAAQ,QAAQ,MAAiB,YAAe;AAAA,IACvD;AACA,SAAK,eAAe,MAAM,IAAI;AAAA,MAC5B,aAAa;AAAA,MACb,iBAAiB;AAAA,MACjB,iBAAiB;AAAA,MACjB,0BAA0B;AAAA,MAC1B,SAAS,KAAK,QAAQ,QAAQ,KAAQ,KAAM;AAAA,IAC9C;AACA,WAAO,EAAE,SAAS,OAAO;AAAA,EAC3B;AAAA,EAEA,cACE,YACA,UACA,YACA,aAC0B;AAC1B,UAAM,MAAM,GAAG,UAAU,IAAI,QAAQ;AACrC,UAAM,WAAW,WAAW,IAAI,GAAG;AAEnC,QAAI,aAAa,QAAW;AAC1B,YAAM,IAAI,MAAM,4CAA4C;AAAA,IAC9D;AAEA,QAAI,SAAS;AACb,QAAI,gBAAgB,WAAW;AAC7B,eAAS;AAAA,IACX,WAAW,gBAAgB,YAAY;AACrC,eAAS;AAAA,IACX,WAAW,gBAAgB,SAAS;AAClC,eAAS;AAAA,IACX,OAAO;AACL,YAAM,IAAI;AAAA,QACR;AAAA,MACF;AAAA,IACF;AAEA,UAAM,WAAW,WACd,MAAM,EAAE,EACR,OAAO,CAAC,MAAM,YAAY,KAAK,CAAC,CAAC,EACjC,OAAO,CAAC,KAAK,MAAM,MAAM,OAAO,SAAS,GAAG,EAAE,GAAG,CAAC;AACrD,UAAM,uBAAuB,WAAW,MAAM,IAAI,IAAI;AAEtD,UAAM,aAAa,WAAW,SAAS;AAEvC,UAAM,iBAA2B,CAAC;AAClC,QAAI,KAAK,aAAa;AACpB,WAAK,kBAAkB,MAAM;AAC7B,iBAAW,CAAC,OAAO,IAAI,KAAK,WAAW,QAAQ,GAAG;AAChD,cAAM,OAAO,OAAO,SAAS;AAC7B,cAAM,CAAC,MAAM,EAAE,IAAI,MAAM,MAAM,GAAG;AAClC,cAAM,WAAW,GAAG,IAAI,IAAI,EAAE,IAAI,WAAW,IAAI,UAAU;AAC3D,aAAK,kBAAkB,IAAI,UAAU,EAAE,KAAK,CAAC;AAC7C,uBAAe,KAAK,IAAI;AAAA,MAC1B;AAAA,IACF,OAAO;AACL,qBAAe,KAAK,UAAU;AAC9B,YAAM,WAAW,GAAG,UAAU,IAAI,QAAQ,IAAI,WAAW,IAAI,UAAU;AACvE,WAAK,kBAAkB,IAAI,UAAU,EAAE,MAAM,WAAW,CAAC;AAAA,IAC3D;AAEA,WAAO,EAAE,kBAAkB,eAAe;AAAA,EAC5C;AAAA,EAEA,qBACE,aACA,QACyB;AACzB,QAAI,KAAK,mBAAmB,GAAG;AAC7B,aAAO,EAAE,OAAO,gBAAgB;AAAA,IAClC;AACA,QAAI,gBAAgB,KAAK,aAAa;AACpC,aAAO,EAAE,OAAO,uBAAuB;AAAA,IACzC;AACA,QAAI,EAAE,UAAU,KAAK,iBAAiB;AACpC,aAAO;AAAA,QACL,OAAO,sDAAsD,OAAO,KAAK,KAAK,cAAc,EAAE,KAAK,IAAI,CAAC;AAAA,MAC1G;AAAA,IACF;AACA,WAAO,EAAE,cAAc,KAAK,eAAe,MAAM,EAAE,QAAQ;AAAA,EAC7D;AAAA,EAEA,WACE,aACA,QACA,YACA,YACA,UACA,aACyB;AACzB,QAAI,KAAK,mBAAmB,GAAG;AAC7B,aAAO,EAAE,gBAAgB,OAAO,OAAO,gBAAgB;AAAA,IACzD;AACA,QAAI,gBAAgB,KAAK,aAAa;AACpC,aAAO,EAAE,gBAAgB,OAAO,OAAO,uBAAuB;AAAA,IAChE;AACA,QAAI,EAAE,UAAU,KAAK,iBAAiB;AACpC,aAAO,EAAE,gBAAgB,OAAO,OAAO,sBAAsB;AAAA,IAC/D;AACA,QAAI,EAAE,aAAa,KAAK,eAAe,MAAM,IAAI;AAC/C,aAAO,EAAE,gBAAgB,OAAO,OAAO,oBAAoB;AAAA,IAC7D;AAEA,UAAM,cAAc,KAAK,gBAAgB;AACzC,QAAI,CAAC,YAAY,SAAS,UAAU,GAAG;AACrC,aAAO;AAAA,QACL,gBAAgB;AAAA,QAChB,OAAO,mCAAmC,UAAU;AAAA,MACtD;AAAA,IACF;AACA,QAAI,CAAC,YAAY,SAAS,QAAQ,GAAG;AACnC,aAAO;AAAA,QACL,gBAAgB;AAAA,QAChB,OAAO,qCAAqC,QAAQ;AAAA,MACtD;AAAA,IACF;AAEA,QAAI,CAAC,kBAAkB,KAAK,UAAU,GAAG;AACvC,aAAO;AAAA,QACL,gBAAgB;AAAA,QAChB,OAAO;AAAA,MACT;AAAA,IACF;AAEA,UAAM,eAAe,oBAAI,IAAI,CAAC,WAAW,YAAY,OAAO,CAAC;AAC7D,QAAI,CAAC,aAAa,IAAI,WAAW,GAAG;AAClC,aAAO;AAAA,QACL,gBAAgB;AAAA,QAChB,OAAO,wCAAwC,CAAC,GAAG,YAAY,EAAE,KAAK,IAAI,CAAC;AAAA,MAC7E;AAAA,IACF;AAEA,QAAI;AACF,WAAK,cAAc,YAAY,UAAU,YAAY,WAAW;AAChE,YAAM,WAAW,GAAG,UAAU,IAAI,QAAQ,IAAI,WAAW,IAAI,UAAU;AACvE,YAAM,kBAAkB,KAAK,kBAAkB,IAAI,QAAQ;AAC3D,UAAI,CAAC,iBAAiB;AACpB,eAAO;AAAA,UACL,gBAAgB;AAAA,UAChB,OAAO;AAAA,QACT;AAAA,MACF;AACA,YAAM,aAAa,gBAAgB;AAEnC,UAAI,KAAK,eAAe,MAAM,EAAE,UAAU,YAAY;AACpD,eAAO,EAAE,gBAAgB,OAAO,OAAO,qBAAqB;AAAA,MAC9D;AACA,UACE,KAAK,gBAAgB,UACrB,KAAK,eAAe,MAAM,EAAE,UAAU,KAAK,aAC3C;AACA,eAAO;AAAA,UACL,gBAAgB;AAAA,UAChB,OAAO;AAAA,QACT;AAAA,MACF;AAEA,WAAK,eAAe,MAAM,EAAE,WAAW;AACvC,YAAM,YAAY,OAAO,KAAK,QAAQ,QAAQ,KAAW,OAAS,CAAC;AACnE,YAAM,gBAAgB;AAAA,QACpB,KAAK,QAAQ,QAAQ,KAAY,QAAU;AAAA,MAC7C;AAEA,WAAK,cAAc,SAAS,IAAI;AAAA,QAC9B,SAAS;AAAA,QACT,aAAa;AAAA,QACb,aAAa;AAAA,QACb,WAAW;AAAA,QACX,cAAc;AAAA,QACd,aAAa;AAAA,QACb,gBAAgB;AAAA,MAClB;AAEA,UAAI,KAAK,aAAa;AACpB,eAAO;AAAA,UACL,YAAY;AAAA,UACZ,gBAAgB;AAAA,UAChB,gBAAgB;AAAA,UAChB,iBAAiB,KAAK;AAAA,QACxB;AAAA,MACF;AACA,aAAO;AAAA,QACL,YAAY;AAAA,QACZ,gBAAgB;AAAA,QAChB,gBAAgB;AAAA,QAChB,iBAAiB,CAAC;AAAA,MACpB;AAAA,IACF,SAAS,GAAG;AACV,aAAO,EAAE,gBAAgB,OAAO,OAAO,OAAO,CAAC,EAAE;AAAA,IACnD;AAAA,EACF;AAAA,EAEA,gBACE,aACA,WACA,cACyB;AACzB,QAAI,KAAK,mBAAmB,GAAG;AAC7B,aAAO,EAAE,OAAO,gBAAgB;AAAA,IAClC;AACA,QAAI,gBAAgB,KAAK,aAAa;AACpC,aAAO,EAAE,OAAO,uBAAuB;AAAA,IACzC;AACA,QAAI,EAAE,aAAa,aAAa,KAAK,gBAAgB;AACnD,aAAO,EAAE,OAAO,oBAAoB;AAAA,IACtC;AACA,UAAM,UAAU,KAAK,cAAc,SAAS;AAC5C,WAAO;AAAA,MACL,SAAS;AAAA,QACP,YAAY;AAAA,QACZ,aAAa,QAAQ;AAAA,QACrB,aAAa,QAAQ;AAAA,QACrB,WAAW,QAAQ;AAAA,QACnB,cAAc,QAAQ;AAAA,QACtB,aAAa,QAAQ;AAAA,QACrB,gBAAgB,QAAQ;AAAA,MAC1B;AAAA,IACF;AAAA,EACF;AAAA,EAEA,kBAAkB,aAA8C;AAC9D,QAAI,KAAK,mBAAmB,GAAG;AAC7B,aAAO,EAAE,OAAO,gBAAgB;AAAA,IAClC;AACA,QAAI,gBAAgB,KAAK,aAAa;AACpC,aAAO,EAAE,OAAO,uBAAuB;AAAA,IACzC;AACA,WAAO,EAAE,iBAAiB,KAAK,MAAM,KAAK,UAAU,KAAK,aAAa,CAAC,EAAE;AAAA,EAC3E;AAAA,EAEA,kBAA4B;AAC1B,WAAO;AAAA,EACT;AAAA,EAEA,cACE,aACA,WACyB;AACzB,QAAI,KAAK,mBAAmB,GAAG;AAC7B,aAAO,EAAE,eAAe,OAAO,OAAO,gBAAgB;AAAA,IACxD;AACA,QAAI,gBAAgB,KAAK,aAAa;AACpC,aAAO,EAAE,eAAe,OAAO,OAAO,uBAAuB;AAAA,IAC/D;AACA,QAAI,EAAE,aAAa,KAAK,gBAAgB;AACtC,aAAO,EAAE,eAAe,OAAO,OAAO,oBAAoB;AAAA,IAC5D;AACA,UAAM,SAAS,KAAK,cAAc,SAAS,EAAE;AAC7C,UAAM,aAAa,KAAK,cAAc,SAAS,EAAE;AACjD,SAAK,eAAe,MAAM,EAAE,WAAW;AACvC,WAAO,KAAK,cAAc,SAAS;AACnC,WAAO,EAAE,eAAe,KAAK;AAAA,EAC/B;AAAA,EAEA,oBACE,cACA,gBACA,OACwB;AACxB,UAAM,aAAa,GAAG,YAAY,IAAI,cAAc;AACpD,UAAM,aAAa,GAAG,cAAc,IAAI,YAAY;AAEpD,UAAM,cAAc,eAAe,IAAI,UAAU;AACjD,QAAI,gBAAgB,QAAW;AAC7B,aAAO,EAAE,iBAAiB,QAAQ,YAAY;AAAA,IAChD;AACA,UAAM,cAAc,eAAe,IAAI,UAAU;AACjD,QAAI,gBAAgB,QAAW;AAC7B,aAAO,EAAE,iBAAiB,KAAK,MAAO,QAAQ,cAAe,GAAG,IAAI,IAAI;AAAA,IAC1E;AACA,UAAM,IAAI,MAAM,sDAAsD;AAAA,EACxE;AAAA,EAEA,0BACE,WACA,UACA,aACA,gBACyB;AACzB,QAAI,KAAK,kBAAkB,aAAa,KAAK,iBAAiB,UAAU;AACtE,aAAO;AAAA,QACL,qBAAqB;AAAA,QACrB,sBAAsB,6DAA6D,KAAK,aAAa,IAAI,KAAK,YAAY,SAAS,SAAS,IAAI,QAAQ;AAAA,MAC1J;AAAA,IACF;AAEA,QAAI,CAAC,kBAAkB,KAAK,WAAW,GAAG;AACxC,aAAO;AAAA,QACL,qBAAqB;AAAA,QACrB,sBACE;AAAA,MACJ;AAAA,IACF;AAEA,UAAM,YAAY,IAAI,KAAK,WAAW;AACtC,UAAM,QAAQ,oBAAI,KAAK;AACvB,QAAI,MAAM,MAAM,YAAY,IAAI,UAAU,YAAY;AACtD,UAAM,YAAY,MAAM,SAAS,IAAI,UAAU,SAAS;AACxD,QACE,YAAY,KACX,cAAc,KAAK,MAAM,QAAQ,IAAI,UAAU,QAAQ,GACxD;AACA;AAAA,IACF;AAEA,QAAI,MAAM,IAAI;AACZ,aAAO;AAAA,QACL,qBAAqB;AAAA,QACrB,sBAAsB;AAAA,MACxB;AAAA,IACF;AAEA,QAAI,CAAC,eAAe,WAAW,IAAI,GAAG;AACpC,aAAO;AAAA,QACL,qBAAqB;AAAA,QACrB,sBAAsB;AAAA,MACxB;AAAA,IACF;AAEA,WAAO,EAAE,qBAAqB,KAAK;AAAA,EACrC;AAAA,EAEA,eACE,aACA,aACyB;AACzB,QAAI,KAAK,mBAAmB,GAAG;AAC7B,aAAO,EAAE,OAAO,gBAAgB;AAAA,IAClC;AACA,QAAI,gBAAgB,KAAK,aAAa;AACpC,aAAO,EAAE,OAAO,uBAAuB;AAAA,IACzC;AACA,SAAK,cAAc,OAAO,WAAW;AACrC,WAAO,EAAE,cAAc,KAAK,YAAY;AAAA,EAC1C;AAAA,EAEA,wBAAwB,UAA0C;AAptBpE;AAqtBI,WAAO,EAAE,kBAAiB,iBAAY,QAAQ,MAApB,YAAyB,UAAU;AAAA,EAC/D;AAAA,EAEA,kBACE,aACA,gBACA,WACA,eACA,QACyB;AACzB,QAAI,KAAK,mBAAmB,GAAG;AAC7B,aAAO,EAAE,kBAAkB,OAAO,OAAO,gBAAgB;AAAA,IAC3D;AACA,QAAI,gBAAgB,KAAK,aAAa;AACpC,aAAO,EAAE,kBAAkB,OAAO,OAAO,uBAAuB;AAAA,IAClE;AACA,QAAI,KAAK,gBAAgB,UAAa,KAAK,cAAc,eAAe;AACtE,aAAO,EAAE,kBAAkB,OAAO,OAAO,wBAAwB;AAAA,IACnE;AACA,QAAI,EAAE,aAAa,KAAK,gBAAgB;AACtC,aAAO,EAAE,kBAAkB,OAAO,OAAO,oBAAoB;AAAA,IAC/D;AACA,QAAI,EAAE,UAAU,KAAK,iBAAiB;AACpC,aAAO,EAAE,kBAAkB,OAAO,OAAO,6BAA6B;AAAA,IACxE;AACA,SAAK,eAAe,MAAM,EAAE,WAAW;AACvC,WAAO;AAAA,MACL,cAAc,OAAO,KAAK,QAAQ,QAAQ,KAAa,SAAW,CAAC;AAAA,MACnE,kBAAkB;AAAA,IACpB;AAAA,EACF;AAAA,EAEA,uBACE,WACA,UACwB;AACxB,QAAI,EAAE,aAAa,KAAK,gBAAgB;AACtC,aAAO,EAAE,OAAO,oBAAoB;AAAA,IACtC;AACA,WAAO;AAAA,MACL,0BACE;AAAA,IACJ;AAAA,EACF;AAAA,EAEA,oBAA6C;AAC3C,WAAO,EAAE,kBAAkB,KAAK,eAAe;AAAA,EACjD;AACF;;;AC7uBA,IAAMC,iBAA2C;AAAA,EAC/C,UAAU;AAAA,EACV,UAAU;AAAA,EACV,eAAe;AAAA,EACf,QAAQ,CAAC;AAAA,EACT,UAAU,CAAC;AAAA,EACX,UAAU,CAAC;AAAA,EACX,gBAAgB,CAAC,SAAS,KAAK;AAAA,EAC/B,eAAe;AACjB;AAEO,IAAM,aAAN,MAAiB;AAAA,EAUtB,cAAc;AACZ,SAAK,WAAW;AAChB,SAAK,WAAW;AAChB,SAAK,gBAAgB;AACrB,SAAK,SAAS,CAAC;AACf,SAAK,WAAW,CAAC;AACjB,SAAK,WAAW,CAAC;AACjB,SAAK,gBAAgB,CAAC;AACtB,SAAK,eAAe;AAAA,EACtB;AAAA,EAEA,cAAc,UAA2B,eAAe,OAAa;AAxDvE;AAyDI,UAAM,cAAyC,KAAK;AAAA,MAClD,KAAK,UAAUA,cAAa;AAAA,IAC9B;AACA,SAAK,YAAW,cAAS,aAAT,YAAqB,YAAY;AACjD,SAAK,YAAW,cAAS,aAAT,YAAqB,YAAY;AACjD,SAAK,iBAAgB,cAAS,kBAAT,YAA0B,YAAY;AAC3D,SAAK,UAAS,cAAS,WAAT,YAAmB,YAAY;AAE7C,SAAK,SAAS,OAAO;AAAA,MACnB,OAAO,QAAQ,KAAK,MAAM,EAAE,IAAI,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,OAAO,SAAS,GAAG,EAAE,GAAG,CAAC,CAAC;AAAA,IACzE;AACA,SAAK,YAAW,cAAS,aAAT,YAAqB,YAAY;AACjD,SAAK,YAAW,cAAS,aAAT,YAAqB,YAAY;AACjD,SAAK,iBAAgB,cAAS,mBAAT,YAA2B,YAAY;AAC5D,SAAK,gBAAe,cAAS,kBAAT,YAA0B,YAAY;AAAA,EAC5D;AAAA,EAEA,qBACE,UACA,UACyB;AACzB,QAAI,aAAa,KAAK,YAAY,aAAa,KAAK,UAAU;AAC5D,WAAK,gBAAgB;AACrB,aAAO,EAAE,uBAAuB,KAAK;AAAA,IACvC;AACA,WAAO,EAAE,uBAAuB,MAAM;AAAA,EACxC;AAAA,EAEA,2BAA6D;AAC3D,WAAO,EAAE,cAAc,CAAC,CAAC,KAAK,cAAc;AAAA,EAC9C;AAAA,EAEA,WACE,SACA,OAAiB,CAAC,GAClB,WAAqB,CAAC,GACK;AAC3B,QAAI,CAAC,KAAK,eAAe;AACvB,aAAO;AAAA,QACL,OAAO;AAAA,MACT;AAAA,IACF;AAEA,UAAM,QAAQ;AAAA,MACZ,IAAI,KAAK;AAAA,MACT,UAAU,KAAK;AAAA,MACf;AAAA,MACA;AAAA,MACA;AAAA,IACF;AACA,SAAK,OAAO,KAAK,YAAY,IAAI;AACjC,SAAK,gBAAgB;AACrB,WAAO;AAAA,EACT;AAAA,EAEA,QAAQ,SAAyC;AAC/C,QAAI,CAAC,KAAK,eAAe;AACvB,aAAO;AAAA,QACL,OAAO;AAAA,MACT;AAAA,IACF;AAEA,QAAI,EAAE,WAAW,KAAK,SAAS;AAC7B,aAAO,EAAE,OAAO,iBAAiB,OAAO,cAAc;AAAA,IACxD;AAEA,QAAI,EAAE,KAAK,YAAY,KAAK,WAAW;AACrC,WAAK,SAAS,KAAK,QAAQ,IAAI,CAAC;AAAA,IAClC;AAEA,QAAI,KAAK,SAAS,KAAK,QAAQ,EAAE,SAAS,OAAO,GAAG;AAClD,aAAO,EAAE,gBAAgB,oBAAoB;AAAA,IAC/C;AAEA,SAAK,SAAS,KAAK,QAAQ,EAAE,KAAK,OAAO;AACzC,WAAO,EAAE,gBAAgB,yBAAyB;AAAA,EACpD;AAAA,EAEA,QAAQ,SAAiB,gBAAgD;AACvE,QAAI,CAAC,KAAK,eAAe;AACvB,aAAO;AAAA,QACL,OAAO;AAAA,MACT;AAAA,IACF;AAEA,QAAI,EAAE,WAAW,KAAK,SAAS;AAC7B,aAAO,EAAE,OAAO,iBAAiB,OAAO,cAAc;AAAA,IACxD;AAEA,QAAI,EAAE,WAAW,KAAK,WAAW;AAC/B,WAAK,SAAS,OAAO,IAAI,CAAC;AAAA,IAC5B;AAEA,SAAK,SAAS,OAAO,EAAE,KAAK;AAAA,MAC1B,UAAU,KAAK;AAAA,MACf,SAAS;AAAA,IACX,CAAC;AACD,WAAO,EAAE,gBAAgB,6BAA6B;AAAA,EACxD;AAAA,EAEA,QACE,SACA,oBACwB;AACxB,QAAI,EAAE,WAAW,KAAK,SAAS;AAC7B,aAAO,EAAE,OAAO,iBAAiB,OAAO,cAAc;AAAA,IACxD;AAEA,UAAM,QAAQ,KAAK,OAAO,OAAO;AACjC,UAAM,SAAS,KAAK,GAAG,kBAAkB;AAEzC,WAAO,EAAE,gBAAgB,+BAA+B;AAAA,EAC1D;AAAA,EAEA,YACE,oBACgD;AAChD,QAAI,CAAC,KAAK,eAAe;AACvB,aAAO;AAAA,QACL,OAAO;AAAA,MACT;AAAA,IACF;AAEA,QAAI,KAAK,cAAc,SAAS,kBAAkB,GAAG;AACnD,aAAO,EAAE,eAAe,MAAM;AAAA,IAChC;AAEA,SAAK,cAAc,KAAK,kBAAkB;AAC1C,WAAO,EAAE,eAAe,KAAK;AAAA,EAC/B;AAAA,EAEA,qBAAuE;AACrE,QAAI,CAAC,KAAK,eAAe;AACvB,aAAO;AAAA,QACL,OACE;AAAA,MACJ;AAAA,IACF;AACA,WAAO,EAAE,gBAAgB,KAAK,cAAc;AAAA,EAC9C;AAAA,EAEA,cACE,sBACkD;AAClD,QAAI,CAAC,KAAK,eAAe;AACvB,aAAO;AAAA,QACL,OACE;AAAA,MACJ;AAAA,IACF;AAEA,QAAI,CAAC,KAAK,cAAc,SAAS,oBAAoB,GAAG;AACtD,aAAO,EAAE,iBAAiB,MAAM;AAAA,IAClC;AAEA,SAAK,gBAAgB,KAAK,cAAc;AAAA,MACtC,CAAC,MAAM,MAAM;AAAA,IACf;AACA,WAAO,EAAE,iBAAiB,KAAK;AAAA,EACjC;AAAA,EAEA,UAAU,UAA6C;AACrD,QAAI,EAAE,YAAY,KAAK,SAAS;AAC9B,aAAO,EAAE,OAAO,iBAAiB,QAAQ,cAAc;AAAA,IACzD;AAEA,WAAO,KAAK,OAAO,QAAQ;AAAA,EAC7B;AAAA,EAEA,gBAAgB,UAA2B;AACzC,WAAO,OAAO,OAAO,KAAK,MAAM,EAAE;AAAA,MAChC,CAAC,UAAU,MAAM,aAAa;AAAA,IAChC;AAAA,EACF;AAAA,EAEA,cAAc,SAA0B;AACtC,UAAM,eAAe,QAAQ,YAAY;AACzC,WAAO,OAAO,OAAO,KAAK,MAAM,EAAE;AAAA,MAChC,CAAC,UACC,MAAM,QAAQ,YAAY,EAAE,SAAS,YAAY,KACjD,MAAM,KAAK;AAAA,QAAK,CAAC,QACf,IAAI,YAAY,EAAE,SAAS,YAAY;AAAA,MACzC;AAAA,IACJ;AAAA,EACF;AAAA,EAEA,mBAAmB,UAAmD;AACpE,QAAI,EAAE,YAAY,KAAK,SAAS;AAC9B,aAAO,CAAC,EAAE,OAAO,iBAAiB,QAAQ,cAAc,CAAC;AAAA,IAC3D;AACA,WAAO,KAAK,SAAS,QAAQ,KAAK,CAAC;AAAA,EACrC;AAAA,EAEA,eAAe,UAA0C;AACvD,UAAM,aAAa,OAAO,OAAO,KAAK,MAAM,EAAE;AAAA,MAC5C,CAAC,UAAU,MAAM,aAAa;AAAA,IAChC,EAAE;AACF,UAAM,iBACJ,aAAa,KAAK,WAAW,KAAK,cAAc,SAAS;AAC3D,UAAM,gBAAgB,KAAK,SAAS,QAAQ,KAAK,CAAC,GAAG;AAErD,WAAO;AAAA,MACL,aAAa;AAAA,MACb,iBAAiB;AAAA,MACjB,eAAe;AAAA,IACjB;AAAA,EACF;AACF;;;AC7OA,IAAM,iBAAiB;AACvB,IAAM,iBAAiB;AACvB,IAAM,kBAAkB;AAExB,IAAMC,iBAAiC;AAAA,EACrC,aAAa;AAAA,EACb,WAAW;AAAA,EACX,gBAAgB;AAAA,EAChB,aAAa;AAAA,EACb,wBAAwB;AAAA,EACxB,YAAY;AAAA,IACV,QAAQ;AAAA,IACR,WAAW;AAAA,IACX,WAAW;AAAA,IACX,YAAY;AAAA,EACd;AAAA,EACA,eAAe;AAAA,EACf,UAAU;AAAA,EACV,QAAQ;AAAA,EACR,eAAe;AAAA,EACf,iBAAiB;AAAA,EACjB,oBAAoB;AAAA,EACpB,mBAAmB;AAAA,EACnB,YAAY;AAAA,EACZ,kBAAkB;AAAA,EAClB,iBAAiB;AAAA,EACjB,uBAAuB;AAAA,EACvB,cAAc;AAAA,EACd,aAAa;AAAA,EACb,uBAAuB;AAAA,EACvB,wBAAwB;AAAA,EACxB,sBAAsB;AAAA,EACtB,uBAAuB;AACzB;AAEA,IAAMC,gBAAN,MAAmB;AAAA,EAEjB,YAAY,MAAc;AACxB,SAAK,OAAO;AAAA,EACd;AAAA,EACA,QAAQ,KAAa,KAAqB;AACxC,SAAK,QAAQ,KAAK,OAAO,OAAO,SAAU;AAC1C,UAAM,MAAM,KAAK,OAAO;AACxB,WAAO,MAAM,OAAO,MAAM;AAAA,EAC5B;AACF;AAEO,IAAM,oBAAN,MAAM,mBAAkB;AAAA,EA4B7B,cAAc;AALd,SAAQ,cAAc;AAEtB,SAAiB,kBACf;AAGA,SAAK,YAAY;AACjB,SAAK,iBAAiB;AACtB,SAAK,cAAc;AACnB,SAAK,yBAAyB;AAC9B,SAAK,aAAa;AAAA,MAChB,QAAQ;AAAA,MACR,WAAW;AAAA,MACX,WAAW;AAAA,MACX,YAAY;AAAA,IACd;AACA,SAAK,gBAAgB;AACrB,SAAK,WAAW;AAChB,SAAK,SAAS;AACd,SAAK,gBAAgB;AACrB,SAAK,kBAAkB;AACvB,SAAK,qBAAqB;AAC1B,SAAK,qBAAqB;AAC1B,SAAK,cAAc;AACnB,SAAK,mBAAmB;AACxB,SAAK,mBAAmB;AACxB,SAAK,wBAAwB;AAC7B,SAAK,eAAe;AACpB,SAAK,cAAc;AACnB,SAAK,wBAAwB;AAC7B,SAAK,yBAAyB;AAC9B,SAAK,uBAAuB;AAC5B,SAAK,wBAAwB;AAC7B,SAAK,UAAU,IAAIA,cAAa,MAAO;AAAA,EACzC;AAAA;AAAA,EAGA,cAAc,UAA2B,cAAc,OAAa;AAtItE;AAuII,UAAM,cAAc,KAAK,MAAM,KAAK,UAAUD,cAAa,CAAC;AAC5D,SAAK,UAAU,IAAIC;AAAA,OACjB,cAAS,gBAAT,YAAwB,YAAY;AAAA,IACtC;AACA,SAAK,aAAY,cAAS,cAAT,YAAsB,YAAY;AACnD,SAAK,kBAAiB,cAAS,mBAAT,YAA2B,YAAY;AAC7D,SAAK,eAAc,cAAS,gBAAT,YAAwB,YAAY;AACvD,SAAK,cAAa,cAAS,eAAT,YAAuB,YAAY;AACrD,SAAK,yBACH,IACA,OAAO,OAAO,KAAK,UAAU,EAAE,OAAO,CAAC,WAAW,WAAW,QAAQ,EAClE;AACL,SAAK,iBAAgB,cAAS,kBAAT,YAA0B,YAAY;AAC3D,SAAK,YAAW,cAAS,aAAT,YAAqB,YAAY;AACjD,SAAK,UAAS,cAAS,WAAT,YAAmB,YAAY;AAC7C,SAAK,iBAAgB,cAAS,kBAAT,YAA0B,YAAY;AAC3D,SAAK,mBACH,cAAS,oBAAT,YAA4B,YAAY;AAC1C,SAAK,sBACH,cAAS,uBAAT,YAA+B,YAAY;AAC7C,SAAK,sBACH,cAAS,sBAAT,YAA8B,YAAY;AAC5C,SAAK,eAAc,cAAS,eAAT,YAAuB,YAAY;AACtD,SAAK,oBACH,cAAS,qBAAT,YAA6B,YAAY;AAC3C,SAAK,oBACH,cAAS,oBAAT,YAA4B,YAAY;AAC1C,SAAK,yBACH,cAAS,0BAAT,YAAkC,YAAY;AAChD,SAAK,gBAAe,cAAS,iBAAT,YAAyB,YAAY;AACzD,SAAK,eAAc,cAAS,gBAAT,YAAwB,YAAY;AACvD,SAAK,yBACH,cAAS,0BAAT,YAAkC,YAAY;AAChD,SAAK,0BACH,cAAS,2BAAT,YAAmC,YAAY;AACjD,SAAK,wBACH,cAAS,yBAAT,YAAiC,YAAY;AAC/C,SAAK,yBACH,cAAS,0BAAT,YAAkC,YAAY;AAChD,SAAK,cAAc;AAAA,EACrB;AAAA,EAEA,OAAO,OAAyB;AAC9B,QAAI,EAAE,iBAAiB,qBAAoB;AACzC,aAAO;AAAA,IACT;AACA,eAAW,YAAY,OAAO,KAAK,IAAI,GAAkC;AACvE,UAAI,SAAS,WAAW,GAAG,GAAG;AAC5B;AAAA,MACF;AACA,YAAM,YAAY,KAAK,QAAQ;AAC/B,YAAM,kBAAkB,MAAM,QAAQ;AACtC,UAAI,KAAK,UAAU,SAAS,MAAM,KAAK,UAAU,eAAe,GAAG;AACjE,eAAO;AAAA,MACT;AAAA,IACF;AACA,WAAO;AAAA,EACT;AAAA,EAEA,YAAY,cAA+C;AACzD,QAAI,iBAAiB,QAAQ;AAC3B,WAAK,cAAc;AAAA,IACrB;AACA,QAAI,KAAK,yBAAyB,GAAG;AACnC,YAAM,gBAAgB,OAAO,QAAQ,KAAK,UAAU,EACjD,OAAO,CAAC,CAAC,EAAE,MAAM,MAAM,WAAW,UAAU,EAC5C,IAAI,CAAC,CAAC,IAAI,MAAM,IAAI,EACpB,KAAK,IAAI;AACZ,aAAO;AAAA,QACL,OAAO,qFAAqF,aAAa;AAAA,MAC3G;AAAA,IACF;AACA,QAAI,KAAK,qBAAqB,WAAW;AACvC,aAAO;AAAA,QACL,OAAO;AAAA,MACT;AAAA,IACF;AACA,QAAI,KAAK,qBAAqB,KAAQ;AACpC,aAAO;AAAA,QACL,OAAO;AAAA,MACT;AAAA,IACF;AACA,QAAI,KAAK,YAAY,gBAAgB;AACnC,aAAO,EAAE,OAAO,sBAAsB;AAAA,IACxC;AACA,QAAI,iBAAiB,SAAS;AAC5B,WAAK,cAAc;AAAA,IACrB,OAAO;AACL,aAAO,EAAE,OAAO,yBAAyB;AAAA,IAC3C;AACA,WAAO;AAAA,MACL,aAAa,KAAK;AAAA,MAClB,WAAW,KAAK;AAAA,MAChB,gBAAgB,KAAK;AAAA,IACvB;AAAA,EACF;AAAA,EAEA,aAAa,YAA6C;AACxD,QAAI,aAAa,GAAG;AAClB,aAAO,EAAE,OAAO,kCAAkC;AAAA,IACpD;AACA,QAAI,KAAK,YAAY,aAAa,gBAAgB;AAChD,aAAO,EAAE,OAAO,2CAA2C;AAAA,IAC7D;AACA,QAAI,KAAK,YAAY,aAAa,gBAAgB;AAChD,aAAO,EAAE,OAAO,mDAAmD;AAAA,IACrE;AACA,SAAK,aAAa;AAClB,WAAO,EAAE,WAAW,KAAK,UAAU;AAAA,EACrC;AAAA,EAEA,UAAU,QAAiB,MAAyC;AAClE,QAAI,QAAQ;AACV,iBAAW,KAAK,MAAM;AACpB,YAAI,KAAK,WAAW,CAAC,MAAM,YAAY;AACrC;AAAA,QACF;AACA,aAAK,WAAW,CAAC,IAAI;AACrB,aAAK,0BAA0B;AAAA,MACjC;AACA,aAAO;AAAA,QACL,YAAY;AAAA,QACZ,wBAAwB,KAAK;AAAA,MAC/B;AAAA,IACF;AACA,eAAW,KAAK,MAAM;AACpB,UAAI,KAAK,WAAW,CAAC,MAAM,UAAU;AACnC;AAAA,MACF;AACA,WAAK,WAAW,CAAC,IAAI;AACrB,WAAK,0BAA0B;AAAA,IACjC;AACA,WAAO;AAAA,MACL,YAAY;AAAA,MACZ,wBAAwB,KAAK;AAAA,IAC/B;AAAA,EACF;AAAA,EAEA,qBACE,aACA,OAAO,WACP,WAAW,IACX,OAAO,QACkB;AACzB,QAAI,WAAW,KAAK,WAAW,KAAK;AAClC,aAAO,EAAE,OAAO,uCAAuC;AAAA,IACzD;AACA,SAAK,gBAAgB;AACrB,QAAI,SAAS,cAAc;AACzB,WAAK,iBAAkB,cAAc,MAAM,IAAK;AAAA,IAClD;AACA,SAAK,WAAW;AAChB,SAAK,SAAS;AACd,WAAO;AAAA,MACL,sBAAsB;AAAA,MACtB,aAAa;AAAA,MACb,eAAe,KAAK;AAAA,IACtB;AAAA,EACF;AAAA,EAEA,sCAA+D;AAC7D,WAAO,EAAE,oBAAoB,KAAK,QAAQ,QAAQ,KAAO,EAAI,EAAE;AAAA,EACjE;AAAA,EAEA,2CAAoE;AAClE,WAAO,EAAE,OAAO,IAAI;AAAA,EACtB;AAAA,EAEA,cAAc,MAAsC;AAClD,QAAI,CAAC,CAAC,MAAM,OAAO,MAAM,EAAE,SAAS,IAAI,GAAG;AACzC,aAAO,EAAE,OAAO,0BAA0B;AAAA,IAC5C;AACA,SAAK,kBAAkB,SAAS,OAAO,OAAO;AAC9C,WAAO,EAAE,iBAAiB,KAAK,gBAAgB;AAAA,EACjD;AAAA,EAEA,iBAAiB,QAAyC;AACxD,UAAM,SAAkC,CAAC;AACzC,QAAI,WAAW,QAAQ;AACrB,aAAO,YAAY,KAAK;AAAA,IAC1B,WAAW,WAAW,WAAW;AAC/B,aAAO,iBAAiB,KAAK;AAAA,IAC/B,WAAW,WAAW,SAAS;AAC7B,aAAO,aAAa,KAAK;AAAA,IAC3B,WAAW,WAAW,WAAW;AAC/B,aAAO,uBAAuB,KAAK;AACnC,aAAO,WAAW,KAAK;AACvB,aAAO,cAAc,KAAK;AAC1B,aAAO,gBAAgB,KAAK;AAAA,IAC9B,WAAW,WAAW,cAAc;AAClC,aAAO,kBAAkB,KAAK;AAAA,IAChC,WAAW,WAAW,gBAAgB;AACpC,aAAO,qBAAqB,KAAK;AACjC,aAAO,oBAAoB,KAAK;AAChC,aAAO,aAAa,KAAK;AAAA,IAC3B,WAAW,WAAW,cAAc;AAClC,aAAO,mBAAmB,KAAK;AAC/B,aAAO,kBAAkB,KAAK;AAAA,IAChC,WAAW,WAAW,UAAU;AAC9B,aAAO,cAAc,KAAK;AAAA,IAC5B,OAAO;AACL,aAAO,QAAQ;AAAA,IACjB;AACA,WAAO;AAAA,EACT;AAAA,EAEA,qBAAqB,MAAuC;AAC1D,QAAI,CAAC,CAAC,UAAU,SAAS,EAAE,SAAS,IAAI,GAAG;AACzC,aAAO,EAAE,OAAO,eAAe;AAAA,IACjC;AACA,QAAI,SAAS,UAAU;AACrB,WAAK,qBAAqB;AAC1B,WAAK,qBAAqB;AAC1B,WAAK,cAAc;AACnB,aAAO;AAAA,QACL,oBAAoB;AAAA,QACpB,oBAAoB;AAAA,QACpB,aAAa;AAAA,MACf;AAAA,IACF;AACA,SAAK,qBAAqB;AAC1B,SAAK,qBAAqB;AAC1B,SAAK,cAAc;AACnB,WAAO;AAAA,MACL,oBAAoB;AAAA,MACpB,oBAAoB;AAAA,MACpB,aAAa;AAAA,IACf;AAAA,EACF;AAAA,EAEA,gBAAgB,eAAgD;AAC9D,QAAI,gBAAgB,KAAK,gBAAgB,GAAG;AAC1C,aAAO,EAAE,OAAO,0CAA0C;AAAA,IAC5D;AACA,QAAI,kBAAkB,GAAG;AACvB,WAAK,mBAAmB;AACxB,WAAK,mBAAmB;AACxB,aAAO,EAAE,kBAAkB,YAAY,iBAAiB,EAAI;AAAA,IAC9D;AACA,UAAM,gBAAgB;AACtB,UAAM,QAAQ,gBAAgB;AAC9B,SAAK,mBAAmB;AACxB,SAAK,mBAAmB;AACxB,WAAO,EAAE,kBAAkB,WAAW,iBAAiB,MAAM;AAAA,EAC/D;AAAA,EAEA,oBAA6C;AAC3C,SAAK,mBAAmB;AACxB,SAAK,mBAAmB;AACxB,WAAO,EAAE,kBAAkB,YAAY,iBAAiB,EAAI;AAAA,EAC9D;AAAA,EAEA,iBACE,OACA,UACA,uBACyB;AACzB,UAAM,OAAO,OAAO,qBAAqB;AACzC,UAAM,MAAM,OAAO,KAAK;AAExB,QAAI,KAAK,gBAAgB,WAAW;AAClC,aAAO;AAAA,QACL,OAAO;AAAA,MACT;AAAA,IACF;AACA,QAAI,UAAU;AACZ,WAAK,wBAAwB;AAC7B,UAAI,MAAM,KAAK,MAAM,OAAO,MAAM,MAAM,GAAG;AACzC,eAAO,EAAE,OAAO,gBAAgB;AAAA,MAClC;AACA,WAAK,eAAe;AACpB,aAAO;AAAA,QACL,cAAc;AAAA,QACd,cAAc;AAAA,QACd,uBAAuB;AAAA,MACzB;AAAA,IACF;AACA,SAAK,eAAe;AACpB,SAAK,wBAAwB;AAC7B,WAAO;AAAA,MACL,cAAc;AAAA,MACd,cAAc;AAAA,MACd,uBAAuB;AAAA,IACzB;AAAA,EACF;AAAA,EAEA,oBAA4C;AAC1C,WAAO,EAAE,cAAc,KAAK,QAAQ,QAAQ,GAAK,GAAK,EAAE;AAAA,EAC1D;AAAA,EAEA,YAAY,UAA8C;AACxD,WAAO,EAAE,KAAK,SAAS;AAAA,EACzB;AAAA,EAEA,sCACE,UACyB;AACzB,QAAI,KAAK,YAAY,kBAAkB,UAAU;AAC/C,aAAO,EAAE,UAAU,MAAM;AAAA,IAC3B;AACA,WAAO,EAAE,UAAU,KAAK;AAAA,EAC1B;AAAA,EAEA,gBAAgB,OAAuC;AACrD,WAAO,EAAE,QAAQ,QAAQ,SAAU;AAAA,EACrC;AAAA,EAEA,gBAAgB,QAAwC;AACtD,WAAO,EAAE,OAAO,SAAS,QAAS;AAAA,EACpC;AAAA,EAEA,kBAAkB,OAAe,OAAwC;AACvE,UAAM,YAAoC;AAAA,MACxC,eAAe;AAAA,MACf,eAAe;AAAA,MACf,eAAe;AAAA,MACf,eAAe;AAAA,MACf,eAAe;AAAA,MACf,eAAe;AAAA,MACf,eAAe;AAAA,MACf,eAAe;AAAA,MACf,eAAe;AAAA,MACf,eAAe;AAAA,MACf,eAAe;AAAA,MACf,eAAe;AAAA,IACjB;AAEA,UAAM,OAAO,GAAG,KAAK,IAAI,KAAK;AAC9B,UAAM,OAAO,GAAG,KAAK,IAAI,KAAK;AAE9B,QAAI,UAAU,IAAI,MAAM,QAAW;AACjC,aAAO,EAAE,UAAU,UAAU,IAAI,EAAE;AAAA,IACrC;AACA,QAAI,UAAU,IAAI,MAAM,QAAW;AACjC,aAAO,EAAE,UAAU,UAAU,IAAI,EAAE;AAAA,IACrC;AACA,WAAO,EAAE,OAAO,kCAAkC;AAAA,EACpD;AAAA,EAEA,0BAA0B,MAAsC;AA1dlE;AA2dI,UAAM,WAAmC;AAAA,MACvC,WAAW;AAAA,MACX,YAAY;AAAA,MACZ,YAAY;AAAA,MACZ,YAAY;AAAA,MACZ,aAAa;AAAA,MACb,iBAAiB;AAAA,MACjB,WAAW;AAAA,MACX,YAAY;AAAA,MACZ,mBAAmB;AAAA,MACnB,aAAa;AAAA,MACb,iBAAiB;AAAA,IACnB;AACA,WAAO,EAAE,UAAS,cAAS,IAAI,MAAb,YAAkB,QAAQ;AAAA,EAC9C;AAAA,EAEA,eAAe,aAA6C;AAC1D,SAAK,cAAc;AACnB,WAAO,EAAE,QAAQ,iBAAiB,WAAW,GAAG;AAAA,EAClD;AAAA,EAEA,sBAA+C;AAC7C,UAAM,eACH,KAAK,wBACJ,KAAK,yBACL,KAAK,uBACL,KAAK,yBACP;AACF,UAAM,sBAAsB,eAAe,MAAM,eAAe;AAEhE,WAAO;AAAA,MACL,uBAAuB,KAAK;AAAA,MAC5B,wBAAwB,KAAK;AAAA,MAC7B,sBAAsB,KAAK;AAAA,MAC3B,uBAAuB,KAAK;AAAA,MAC5B,uBAAuB;AAAA,MACvB,UAAU,CAAC;AAAA,IACb;AAAA,EACF;AAAA,EAEA,yBAAiD;AAC/C,WAAO,EAAE,cAAc,uCAAuC;AAAA,EAChE;AACF;;;ACvfO,IAAM,sBAAwD;AAAA,EACnE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAGO,IAAM,oBAAoB,oBAAI,IAAI,CAAC,SAAS,CAAC;;;ACnB7C,IAAM,iBAAN,MAAqB;AAAA;AAAA,EAI1B,cAAc;AAHd,SAAQ,YAA8B,CAAC;AACvC,SAAQ,gBAAwC,CAAC;AAI/C,eAAW,aAAa,mBAAmB;AACzC,YAAM,mBAAmB,oBAAoB,SAAS;AACtD,UAAI,kBAAkB;AACpB,cAAM,WAAW,IAAI,iBAAiB;AACtC,cAAM,cAAc,GAAG,SAAS;AAChC,aAAK,UAAU,WAAW,IAAI;AAG9B,cAAM,UAAU,OAAO;AAAA,UACrB,OAAO,eAAe,QAAQ;AAAA,QAChC,EAAE;AAAA,UACA,CAAC,SACC,OAAO,SAAS,IAAI,MAAM,cAAc,SAAS;AAAA,QACrD;AAEA,mBAAW,cAAc,SAAS;AAChC,eAAK,cAAc,UAAU,IAAI;AAAA,QACnC;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAAA,EAEA,oBACE,WACA,aACA,WAEA,UACA,cAAc,OACd,YAAY,OAEP;AACL,UAAM,cAAc,GAAG,SAAS,IAAI,WAAW,IAAI,SAAS,IAAI,YAAY,SAAS,OAAO;AAE5F,QAAI,CAAC,KAAK,UAAU,WAAW,GAAG;AAChC,YAAM,mBAAmB,oBAAoB,SAAS;AACtD,UAAI,CAAC,kBAAkB;AACrB,cAAM,IAAI,MAAM,kBAAkB,SAAS,EAAE;AAAA,MAC/C;AAEA,YAAM,WAAW,IAAI,iBAAiB;AAEtC,UACE,CAAC,kBAAkB,IAAI,SAAS,KAChC,OAAO,SAAS,kBAAkB,YAClC;AACA,iBAAS,cAAc,UAAU,WAAW;AAAA,MAC9C;AACA,WAAK,UAAU,WAAW,IAAI;AAG9B,YAAM,UAAU,OAAO;AAAA,QACrB,OAAO,eAAe,QAAQ;AAAA,MAChC,EAAE;AAAA,QACA,CAAC,SACC,OAAO,SAAS,IAAI,MAAM,cAC1B,SAAS,iBACT,CAAC,KAAK,WAAW,GAAG;AAAA,MACxB;AAEA,iBAAW,cAAc,SAAS;AAChC,aAAK,cAAc,UAAU,IAAI;AAAA,MACnC;AAAA,IACF;AAEA,WAAO,KAAK,UAAU,WAAW;AAAA,EACnC;AAAA;AAAA,EAGA,oBAAoB,YAAyB;AAC3C,UAAM,cAAc,KAAK,cAAc,UAAU;AACjD,QAAI,CAAC,aAAa;AAChB,YAAM,IAAI,MAAM,qBAAqB,UAAU,EAAE;AAAA,IACnD;AACA,WAAO,KAAK,UAAU,WAAW;AAAA,EACnC;AAAA;AAAA,EAGA,oBACE,aACA,WACkB;AAClB,UAAM,SAA2B,CAAC;AAClC,eAAW,CAAC,KAAK,QAAQ,KAAK,OAAO,QAAQ,KAAK,SAAS,GAAG;AAC5D,UAAI,IAAI,SAAS,GAAG,SAAS,IAAI,WAAW,EAAE,GAAG;AAC/C,eAAO,GAAG,IAAI;AAAA,MAChB;AAAA,IACF;AACA,WAAO;AAAA,EACT;AAAA;AAAA,EAGA,sBAAsB,aAAqB,WAAyB;AAClE,UAAM,eAAyB,CAAC;AAChC,eAAW,OAAO,OAAO,KAAK,KAAK,SAAS,GAAG;AAC7C,UAAI,IAAI,SAAS,GAAG,SAAS,IAAI,WAAW,EAAE,GAAG;AAC/C,qBAAa,KAAK,GAAG;AAAA,MACvB;AAAA,IACF;AACA,eAAW,OAAO,cAAc;AAC9B,aAAO,KAAK,UAAU,GAAG;AAAA,IAC3B;AAGA,UAAM,kBAA4B,CAAC;AACnC,eAAW,CAAC,QAAQ,WAAW,KAAK,OAAO,QAAQ,KAAK,aAAa,GAAG;AACtE,UAAI,aAAa,SAAS,WAAW,GAAG;AACtC,wBAAgB,KAAK,MAAM;AAAA,MAC7B;AAAA,IACF;AACA,eAAW,UAAU,iBAAiB;AACpC,aAAO,KAAK,cAAc,MAAM;AAAA,IAClC;AAAA,EACF;AAAA;AAAA,EAGA,QAAc;AACZ,SAAK,YAAY,CAAC;AAClB,SAAK,gBAAgB,CAAC;AAGtB,eAAW,aAAa,mBAAmB;AACzC,YAAM,mBAAmB,oBAAoB,SAAS;AACtD,UAAI,kBAAkB;AACpB,cAAM,WAAW,IAAI,iBAAiB;AACtC,cAAM,cAAc,GAAG,SAAS;AAChC,aAAK,UAAU,WAAW,IAAI;AAE9B,cAAM,UAAU,OAAO;AAAA,UACrB,OAAO,eAAe,QAAQ;AAAA,QAChC,EAAE;AAAA,UACA,CAAC,SACC,OAAO,SAAS,IAAI,MAAM,cAAc,SAAS;AAAA,QACrD;AAEA,mBAAW,cAAc,SAAS;AAChC,eAAK,cAAc,UAAU,IAAI;AAAA,QACnC;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACF;AAGO,IAAM,uBAAuB,IAAI,eAAe;;;AC5JvD,IAAMC,oBAAmB;AACzB,IAAM,kBAAkB;AACxB,IAAM,sBAAsB;AAC5B,IAAM,mBAAmB;AAclB,IAAM,gBAAN,MAAM,cAAa;AAAA,EAqMxB,OAAe,kBAAkB,UAA0B;AAxN7D;AAyNI,YAAO,cAAS,MAAM,GAAG,EAAE,IAAI,MAAxB,YAA6B;AAAA,EACtC;AAAA,EAEA,OAAe,aAAa,KAAqB;AAC/C,WAAO,IAAI,QAAQ,aAAa,CAAC,GAAG,WAAW,OAAO,YAAY,CAAC;AAAA,EACrE;AAAA,EAEA,OAAe,kBAAkB,YAA8B;AAC7D,UAAM,YAAY,cAAa,aAAa,UAAU;AACtD,QAAI,cAAc,YAAY;AAC5B,aAAO,CAAC,UAAU;AAAA,IACpB;AACA,WAAO,CAAC,YAAY,SAAS;AAAA,EAC/B;AAAA;AAAA,EAGA,OAAe,sBACb,YACA,mBAC+D;AAC/D,UAAM,WAAW,cAAa,kBAAkB,UAAU;AAE1D,QAAI,mBAAmB;AACrB,iBAAW,YAAY,OAAO,OAAO,iBAAiB,GAAG;AACvD,YAAI,YAAY,OAAO,aAAa,UAAU;AAC5C,qBAAW,WAAW,UAAU;AAC9B,gBACE,WAAW,YACX,OAAQ,SAAqC,OAAO,MAClD,YACF;AACA,qBAAO,EAAE,UAAU,oBAAoB,QAAQ;AAAA,YACjD;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAEA,eAAW,WAAW,UAAU;AAC9B,UAAI;AACF,cAAM,WAAW,qBAAqB,oBAAoB,OAAO;AACjE,YAAI,UAAU;AACZ,iBAAO,EAAE,UAAU,oBAAoB,QAAQ;AAAA,QACjD;AAAA,MACF,SAAQ;AAAA,MAER;AAAA,IACF;AACA,WAAO;AAAA,EACT;AAAA,EAEA,OAAe,UACb,YACA,MACW;AACX,UAAM,aAAa,cAAa,mBAAmB,UAAU;AAC7D,QAAI,CAAC,YAAY;AACf,aAAO,OAAO,OAAO,IAAI;AAAA,IAC3B;AACA,WAAO,WAAW,IAAI,CAAC,UAAU,KAAK,KAAK,CAAC;AAAA,EAC9C;AAAA,EAEA,OAAe,YAAY,YAA6B;AACtD,WACE,cAAa,kBAAkB,IAAI,UAAU,KAC7C,WAAW,WAAW,IAAI;AAAA,EAE9B;AAAA,EAEA,aAAa,QACX,UACA,mBAC0B;AAC1B,UAAM,aAAa,cAAa,kBAAkB,SAAS,QAAQ;AAEnE,QAAI,cAAa,YAAY,UAAU,GAAG;AACxC,aAAO;AAAA,QACL,SAAS;AAAA,QACT,OAAO,6BAA6B,UAAU;AAAA,MAChD;AAAA,IACF;AAEA,UAAM,QAAQ,cAAa;AAAA,MACzB;AAAA,MACA;AAAA,IACF;AACA,QAAI,CAAC,OAAO;AACV,aAAO;AAAA,QACL,SAAS;AAAA,QACT,OAAO,kCAAkC,UAAU;AAAA,MACrD;AAAA,IACF;AAEA,UAAM,EAAE,UAAU,mBAAmB,IAAI;AACzC,UAAM,SAAU,SAAqC,kBAAkB;AACvE,QAAI,OAAO,WAAW,YAAY;AAChC,aAAO;AAAA,QACL,SAAS;AAAA,QACT,OAAO,qBAAqB,UAAU;AAAA,MACxC;AAAA,IACF;AAEA,QAAI;AACF,YAAM,OAAO,cAAa,UAAU,YAAY,SAAS,IAAI;AAC7D,YAAM,SAAS,OAAO,MAAM,UAAU,IAAI;AAC1C,YAAM,cAAc,kBAAkB,UAAU,MAAM,SAAS;AAE/D,aAAO,EAAE,SAAS,MAAM,QAAQ,YAAY;AAAA,IAC9C,SAAS,OAAO;AACd,aAAO;AAAA,QACL,SAAS;AAAA,QACT,OAAO,oBAAoB,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK,CAAC;AAAA,MACnF;AAAA,IACF;AAAA,EACF;AAAA,EAEA,aAAa,YACX,WACA,mBAC4B;AAC5B,UAAM,UAA6B,CAAC;AACpC,eAAW,YAAY,WAAW;AAChC,cAAQ,KAAK,MAAM,cAAa,QAAQ,UAAU,iBAAiB,CAAC;AAAA,IACtE;AACA,WAAO;AAAA,EACT;AAAA,EAEA,OAAO,gBAAgB,QAAyB;AAC9C,QAAI,WAAW,QAAQ,WAAW,QAAW;AAC3C,aAAO;AAAA,IACT;AACA,QAAI,OAAO,WAAW,UAAU;AAC9B,aAAO;AAAA,IACT;AACA,QAAI,OAAO,WAAW,UAAU;AAC9B,UAAI;AACF,eAAO,KAAK,UAAU,MAAM;AAAA,MAC9B,SAAQ;AACN,eAAO,OAAO,MAAM;AAAA,MACtB;AAAA,IACF;AACA,WAAO,OAAO,MAAM;AAAA,EACtB;AAAA;AAAA,EAGA,OAAO,gBAAgB,YAA8B;AACnD,UAAM,QAAQ,WAAW,MAAM,mBAAmB;AAClD,QAAI,CAAC,OAAO;AACV,YAAM,IAAI,MAAM,iCAAiC,UAAU,EAAE;AAAA,IAC/D;AAEA,UAAM,CAAC,EAAE,gBAAgB,UAAU,IAAI;AACvC,UAAM,aAAa,eAAe,MAAM,GAAG,EAAE,IAAI,KAAK;AACtD,UAAM,OAAgC,CAAC;AAEvC,QAAI,CAAC,WAAW,KAAK,GAAG;AACtB,aAAO,EAAE,UAAU,YAAY,KAAK;AAAA,IACtC;AAEA,UAAM,aAAa,cAAa,gBAAgB,UAAU;AAC1D,UAAM,aAAa,cAAa,mBAAmB,UAAU;AAE7D,QAAI,cAAc,WAAW,KAAK,CAAC,MAAM,EAAE,GAAG,GAAG;AAC/C,iBAAW,OAAO,YAAY;AAC5B,YAAI,IAAI,KAAK;AACX,eAAK,IAAI,GAAG,IAAI,IAAI;AAAA,QACtB;AAAA,MACF;AAAA,IACF,WAAW,YAAY;AACrB,UAAI,MAAM;AACV,iBAAW,OAAO,YAAY;AAC5B,YAAI,IAAI,KAAK;AACX,eAAK,IAAI,GAAG,IAAI,IAAI;AAAA,QACtB,WAAW,MAAM,WAAW,QAAQ;AAClC,eAAK,WAAW,GAAG,CAAC,IAAI,IAAI;AAC5B;AAAA,QACF;AAAA,MACF;AAAA,IACF,OAAO;AACL,UAAI,MAAM;AACV,iBAAW,OAAO,YAAY;AAC5B,YAAI,IAAI,KAAK;AACX,eAAK,IAAI,GAAG,IAAI,IAAI;AAAA,QACtB,OAAO;AACL,eAAK,MAAM,GAAG,EAAE,IAAI,IAAI;AACxB;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAEA,WAAO,EAAE,UAAU,YAAY,KAAK;AAAA,EACtC;AAAA,EAEA,OAAe,gBACb,YACyC;AACzC,UAAM,UAAmD,CAAC;AAC1D,QAAI,IAAI;AACR,UAAM,IAAI,WAAW,KAAK;AAE1B,WAAO,IAAI,EAAE,QAAQ;AACnB,aAAO,IAAI,EAAE,UAAUA,kBAAiB,KAAK,EAAE,CAAC,CAAC,GAAG;AAClD;AAAA,MACF;AACA,UAAI,KAAK,EAAE,QAAQ;AACjB;AAAA,MACF;AAEA,UAAI;AACJ,YAAM,WAAW,EAAE,MAAM,CAAC,EAAE,MAAM,gBAAgB;AAClD,UAAI,UAAU;AACZ,cAAM,SAAS,CAAC;AAChB,aAAK,SAAS,CAAC,EAAE;AAAA,MACnB;AAEA,aAAO,IAAI,EAAE,UAAUA,kBAAiB,KAAK,EAAE,CAAC,CAAC,GAAG;AAClD;AAAA,MACF;AAEA,YAAM,QAAQ,cAAa,WAAW,GAAG,CAAC;AAC1C,UAAI,MAAM;AACV,cAAQ,KAAK,EAAE,KAAK,OAAO,MAAM,MAAM,CAAC;AAExC,aAAO,IAAI,EAAE,UAAUA,kBAAiB,KAAK,EAAE,CAAC,CAAC,GAAG;AAClD;AAAA,MACF;AACA,UAAI,IAAI,EAAE,UAAU,EAAE,CAAC,MAAM,KAAK;AAChC;AAAA,MACF;AAAA,IACF;AAEA,WAAO;AAAA,EACT;AAAA;AAAA,EAGA,OAAe,WACb,GACA,OACsC;AACtC,QAAI,IAAI;AACR,WAAO,IAAI,EAAE,UAAUA,kBAAiB,KAAK,EAAE,CAAC,CAAC,GAAG;AAClD;AAAA,IACF;AAEA,QAAI,EAAE,CAAC,MAAM,OAAO,EAAE,CAAC,MAAM,KAAK;AAChC,YAAM,QAAQ,EAAE,CAAC;AACjB;AACA,UAAI,QAAQ;AACZ,aAAO,IAAI,EAAE,UAAU,EAAE,CAAC,MAAM,OAAO;AACrC,YAAI,EAAE,CAAC,MAAM,QAAQ,IAAI,IAAI,EAAE,QAAQ;AACrC,gBAAM,OAAO,EAAE,IAAI,CAAC;AACpB,cAAI,SAAS,KAAK;AAChB,qBAAS;AAAA,UACX,WAAW,SAAS,KAAK;AACvB,qBAAS;AAAA,UACX,WAAW,SAAS,KAAK;AACvB,qBAAS;AAAA,UACX,OAAO;AACL,qBAAS;AAAA,UACX;AACA,eAAK;AAAA,QACP,OAAO;AACL,mBAAS,EAAE,CAAC;AACZ;AAAA,QACF;AAAA,MACF;AACA,aAAO,EAAE,OAAO,UAAU,IAAI,EAAE;AAAA,IAClC;AAEA,QAAI,EAAE,CAAC,MAAM,KAAK;AAChB,aAAO,cAAa,UAAU,GAAG,CAAC;AAAA,IACpC;AAEA,QAAI,EAAE,CAAC,MAAM,KAAK;AAChB,aAAO,cAAa,UAAU,GAAG,CAAC;AAAA,IACpC;AAEA,QAAI,QAAQ;AACZ,WAAO,IAAI,EAAE,UAAU,CAAC,gBAAgB,KAAK,EAAE,CAAC,CAAC,GAAG;AAClD,eAAS,EAAE,CAAC;AACZ;AAAA,IACF;AACA,YAAQ,MAAM,KAAK;AAEnB,QAAI,UAAU,QAAQ;AACpB,aAAO,EAAE,OAAO,MAAM,UAAU,EAAE;AAAA,IACpC;AACA,QAAI,UAAU,SAAS;AACrB,aAAO,EAAE,OAAO,OAAO,UAAU,EAAE;AAAA,IACrC;AACA,QAAI,UAAU,QAAQ;AACpB,aAAO,EAAE,OAAO,MAAM,UAAU,EAAE;AAAA,IACpC;AACA,UAAM,MAAM,OAAO,KAAK;AACxB,QAAI,CAAC,OAAO,MAAM,GAAG,GAAG;AACtB,aAAO,EAAE,OAAO,KAAK,UAAU,EAAE;AAAA,IACnC;AACA,WAAO,EAAE,OAAO,OAAO,UAAU,EAAE;AAAA,EACrC;AAAA,EAEA,OAAe,UACb,GACA,OACwC;AACxC,UAAM,QAAmB,CAAC;AAC1B,QAAI,IAAI,QAAQ;AAChB,WAAO,IAAI,EAAE,UAAU,EAAE,CAAC,MAAM,KAAK;AACnC,aAAO,IAAI,EAAE,UAAUA,kBAAiB,KAAK,EAAE,CAAC,CAAC,GAAG;AAClD;AAAA,MACF;AACA,UAAI,EAAE,CAAC,MAAM,KAAK;AAChB;AAAA,MACF;AACA,YAAM,OAAO,cAAa,WAAW,GAAG,CAAC;AACzC,YAAM,KAAK,KAAK,KAAK;AACrB,UAAI,KAAK;AACT,aAAO,IAAI,EAAE,UAAUA,kBAAiB,KAAK,EAAE,CAAC,CAAC,GAAG;AAClD;AAAA,MACF;AACA,UAAI,EAAE,CAAC,MAAM,KAAK;AAChB;AAAA,MACF;AAAA,IACF;AACA,WAAO,EAAE,OAAO,OAAO,UAAU,IAAI,EAAE;AAAA,EACzC;AAAA,EAEA,OAAe,UACb,GACA,OACsD;AACtD,UAAM,MAA+B,CAAC;AACtC,QAAI,IAAI,QAAQ;AAChB,WAAO,IAAI,EAAE,UAAU,EAAE,CAAC,MAAM,KAAK;AACnC,aAAO,IAAI,EAAE,UAAUA,kBAAiB,KAAK,EAAE,CAAC,CAAC,GAAG;AAClD;AAAA,MACF;AACA,UAAI,EAAE,CAAC,MAAM,KAAK;AAChB;AAAA,MACF;AACA,YAAM,YAAY,cAAa,WAAW,GAAG,CAAC;AAC9C,UAAI,UAAU;AACd,aAAO,IAAI,EAAE,UAAUA,kBAAiB,KAAK,EAAE,CAAC,CAAC,GAAG;AAClD;AAAA,MACF;AACA,UAAI,EAAE,CAAC,MAAM,KAAK;AAChB;AAAA,MACF;AACA,YAAM,YAAY,cAAa,WAAW,GAAG,CAAC;AAC9C,UAAI,OAAO,UAAU,KAAK,CAAC,IAAI,UAAU;AACzC,UAAI,UAAU;AACd,aAAO,IAAI,EAAE,UAAUA,kBAAiB,KAAK,EAAE,CAAC,CAAC,GAAG;AAClD;AAAA,MACF;AACA,UAAI,EAAE,CAAC,MAAM,KAAK;AAChB;AAAA,MACF;AAAA,IACF;AACA,WAAO,EAAE,OAAO,KAAK,UAAU,IAAI,EAAE;AAAA,EACvC;AACF;AA7iBa,cACa,oBAAoB,oBAAI,IAAI;AAAA,EAClD;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,CAAC;AATU,cAWa,qBAA+C;AAAA,EACrE,IAAI,CAAC,QAAQ;AAAA,EACb,OAAO,CAAC,UAAU;AAAA,EAClB,OAAO,CAAC,WAAW;AAAA,EACnB,MAAM,CAAC,WAAW,WAAW;AAAA,EAC7B,KAAK,CAAC,WAAW;AAAA,EACjB,MAAM,CAAC,aAAa,SAAS;AAAA,EAC7B,MAAM,CAAC,WAAW;AAAA,EAClB,MAAM,CAAC,aAAa,OAAO;AAAA,EAC3B,MAAM,CAAC,cAAc,YAAY;AAAA,EACjC,IAAI,CAAC,UAAU,aAAa;AAAA,EAC5B,IAAI,CAAC,UAAU,aAAa;AAAA,EAC5B,IAAI,CAAC,WAAW;AAAA,EAChB,OAAO,CAAC,UAAU;AAAA,EAClB,MAAM,CAAC,QAAQ,MAAM;AAAA,EACrB,IAAI,CAAC,GAAG;AAAA,EACR,KAAK,CAAC;AAAA,EACN,IAAI,CAAC,aAAa,MAAM;AAAA,EACxB,IAAI,CAAC,gBAAgB;AAAA;AAAA,EAGrB,sBAAsB,CAAC,YAAY,UAAU;AAAA,EAC7C,0BAA0B,CAAC;AAAA,EAC3B,YAAY,CAAC,WAAW,QAAQ,UAAU;AAAA,EAC1C,SAAS,CAAC,UAAU;AAAA,EACpB,SAAS,CAAC,YAAY,iBAAiB;AAAA,EACvC,SAAS,CAAC,YAAY,qBAAqB;AAAA,EAC3C,aAAa,CAAC,oBAAoB;AAAA,EAClC,oBAAoB,CAAC;AAAA,EACrB,eAAe,CAAC,sBAAsB;AAAA,EACtC,WAAW,CAAC,UAAU;AAAA,EACtB,iBAAiB,CAAC,UAAU;AAAA,EAC5B,eAAe,CAAC,SAAS;AAAA,EACzB,oBAAoB,CAAC,UAAU;AAAA,EAC/B,gBAAgB,CAAC,UAAU;AAAA;AAAA,EAG3B,eAAe,CAAC,SAAS,eAAe,UAAU;AAAA,EAClD,YAAY,CAAC,WAAW;AAAA,EACxB,cAAc,CAAC,WAAW;AAAA,EAC1B,gBAAgB,CAAC,aAAa,YAAY;AAAA,EAC1C,aAAa,CAAC,aAAa,SAAS;AAAA,EACpC,cAAc,CAAC,YAAY,UAAU;AAAA,EACrC,yBAAyB,CAAC;AAAA,EAC1B,QAAQ,CAAC;AAAA,EACT,kBAAkB,CAAC,QAAQ;AAAA;AAAA,EAG3B,MAAM,CAAC,SAAS;AAAA,EAChB,KAAK,CAAC,SAAS;AAAA,EACf,KAAK,CAAC,KAAK,GAAG;AAAA,EACd,UAAU,CAAC,KAAK,GAAG;AAAA,EACnB,UAAU,CAAC,KAAK,GAAG;AAAA,EACnB,QAAQ,CAAC,KAAK,GAAG;AAAA,EACjB,UAAU,CAAC,QAAQ;AAAA,EACnB,gBAAgB,CAAC,QAAQ;AAAA,EACzB,OAAO,CAAC,QAAQ,UAAU;AAAA,EAC1B,WAAW,CAAC,SAAS,QAAQ,WAAW;AAAA,EACxC,KAAK,CAAC,SAAS,MAAM;AAAA,EACrB,WAAW,CAAC,SAAS;AAAA,EACrB,WAAW,CAAC,SAAS;AAAA,EACrB,YAAY,CAAC,QAAQ,OAAO;AAAA,EAC5B,cAAc,CAAC,UAAU,gBAAgB;AAAA,EACzC,aAAa,CAAC,UAAU,WAAW;AAAA,EACnC,oBAAoB,CAAC,SAAS;AAAA,EAC9B,YAAY,CAAC,SAAS;AAAA,EACtB,wBAAwB,CAAC,SAAS,WAAW,UAAU;AAAA,EACvD,oBAAoB,CAAC,SAAS,WAAW,UAAU;AAAA;AAAA,EAGnD,cAAc,CAAC,eAAe,SAAS;AAAA,EACvC,wBAAwB,CAAC;AAAA,EACzB,oBAAoB,CAAC;AAAA,EACrB,aAAa,CAAC,aAAa,SAAS;AAAA,EACpC,gBAAgB,CAAC,SAAS;AAAA,EAC1B,gBAAgB,CAAC,aAAa;AAAA,EAC9B,iBAAiB,CAAC,SAAS;AAAA,EAC3B,mBAAmB,CAAC;AAAA,EACpB,aAAa,CAAC,MAAM;AAAA,EACpB,eAAe,CAAC,SAAS;AAAA,EACzB,0BAA0B,CAAC;AAAA,EAC3B,YAAY,CAAC;AAAA;AAAA,EAGb,kBAAkB,CAAC,OAAO;AAAA,EAC1B,cAAc,CAAC,UAAU;AAAA,EACzB,wBAAwB,CAAC,UAAU,aAAa,WAAW;AAAA,EAC3D,cAAc,CAAC,QAAQ;AAAA,EACvB,kBAAkB,CAAC;AAAA,EACnB,sBAAsB,CAAC,QAAQ;AAAA,EAC/B,kBAAkB,CAAC;AAAA,EACnB,mBAAmB,CAAC,UAAU;AAAA,EAC9B,mBAAmB,CAAC;AAAA,EACpB,gBAAgB,CAAC,QAAQ;AAAA,EACzB,oBAAoB,CAAC,MAAM;AAAA,EAC3B,yBAAyB,CAAC,cAAc,UAAU;AAAA,EAClD,eAAe,CAAC;AAAA,EAChB,qBAAqB,CAAC,UAAU,WAAW;AAAA,EAC3C,aAAa,CAAC,cAAc,UAAU,SAAS,QAAQ;AAAA,EACvD,6BAA6B,CAAC,QAAQ;AAAA,EACtC,0BAA0B,CAAC;AAAA,EAC3B,eAAe,CAAC,YAAY,UAAU;AAAA,EACtC,gBAAgB,CAAC;AAAA,EACjB,gBAAgB,CAAC,QAAQ;AAAA;AAAA,EAGzB,qBAAqB;AAAA,IACnB;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAAA,EACA,aAAa;AAAA,IACX;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAAA,EACA,gBAAgB,CAAC,gBAAgB,YAAY;AAAA,EAC7C,uBAAuB,CAAC,iBAAiB,mBAAmB,OAAO;AAAA,EACnE,0BAA0B,CAAC,cAAc,SAAS;AAAA,EAClD,sBAAsB,CAAC;AAAA,EACvB,qBAAqB,CAAC,cAAc;AAAA,EACpC,wBAAwB,CAAC,qBAAqB,gBAAgB;AAAA,EAC9D,yBAAyB,CAAC,gBAAgB,SAAS;AAAA,EACnD,iBAAiB;AAAA,IACf;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAAA,EACA,6BAA6B,CAAC,UAAU;AAAA,EACxC,mBAAmB,CAAC;AAAA,EACpB,oBAAoB;AAAA,IAClB;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAAA,EACA,sBAAsB;AAAA,IACpB;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAAA,EACA,kBAAkB,CAAC,gBAAgB,cAAc,cAAc;AAAA,EAC/D,kBAAkB,CAAC,gBAAgB,cAAc;AAAA,EACjD,yBAAyB,CAAC;AAAA,EAC1B,6BAA6B;AAAA,IAC3B;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAAA;AAAA,EAGA,sBAAsB,CAAC,MAAM;AAAA,EAC7B,sBAAsB,CAAC,eAAe,QAAQ,YAAY,MAAM;AAAA,EAChE,qBAAqB,CAAC;AAAA,EACtB,kBAAkB,CAAC,QAAQ;AAAA,EAC3B,aAAa,CAAC,UAAU;AAAA,EACxB,mBAAmB,CAAC,SAAS,OAAO;AAAA,EACpC,uCAAuC,CAAC,UAAU;AAAA,EAClD,cAAc,CAAC,YAAY;AAAA,EAC3B,wBAAwB,CAAC;AAAA,EACzB,iBAAiB,CAAC,QAAQ;AAAA,EAC1B,mBAAmB,CAAC;AAAA,EACpB,qCAAqC,CAAC;AAAA,EACtC,0CAA0C,CAAC;AAAA,EAC3C,2BAA2B,CAAC,MAAM;AAAA,EAClC,iBAAiB,CAAC,OAAO;AAAA,EACzB,WAAW,CAAC,UAAU,MAAM;AAAA,EAC5B,iBAAiB,CAAC,eAAe;AAAA,EACjC,mBAAmB,CAAC;AAAA,EACpB,kBAAkB,CAAC,SAAS,YAAY,uBAAuB;AAAA,EAC/D,eAAe,CAAC,MAAM;AAAA,EACtB,gBAAgB,CAAC,aAAa;AAAA,EAC9B,aAAa,CAAC,cAAc;AAC9B;AAnMK,IAAM,eAAN;;;ACXP,eAAsB,yBACpB,WACA,eACA,iBACA,WACA,aACA,cAAc,OACd,YAAY,OACc;AAC1B,QAAM,aAAa,KAAK,MAAM,KAAK,UAAU,aAAa,CAAC;AAC3D,QAAM,oBAA6C,CAAC;AAEpD,aAAW,aAAa,iBAAiB;AACvC,sBAAkB,SAAS,IAAI,qBAAqB;AAAA,MAClD;AAAA,MACA;AAAA,MACA;AAAA,MACA,WAAW,SAAS,KAAK,CAAC;AAAA,MAC1B;AAAA,MACA;AAAA,IACF;AAAA,EACF;AAEA,QAAM,UAAU,MAAM,aAAa,YAAY,WAAW,iBAAiB;AAC3E,QAAM,mBAAmB,QAAQ;AAAA,IAAI,CAAC,MACpC,EAAE,UACE,aAAa,gBAAgB,EAAE,MAAM,IACrC,2BAA2B,EAAE,KAAK;AAAA,EACxC;AAEA,SAAO,EAAE,kBAAkB,kBAAkB;AAC/C;AAEO,SAAS,sBACd,aACA,WACM;AACN,uBAAqB,sBAAsB,aAAa,SAAS;AACnE;AAEO,SAAS,uBAAuB,cAAiC;AACtE,SAAO,aAAa;AAAA,IAClB,CAAC,aACC,aAAa,MACb,aAAa,UACb,aAAa,QACb,aAAa,QACb,SAAS,SAAS,wBAAwB;AAAA,EAC9C;AACF;;;ACpCO,SAAS,gBACd,mBACA,yBACA,YACqB;AACrB,QAAM,sBAAsB;AAAA,IAC1B;AAAA,IACA;AAAA,EACF;AAEA,MAAI,CAAC,oBAAoB,eAAe;AACtC,WAAO;AAAA,MACL,OAAO;AAAA,MACP,YAAY;AAAA,MACZ,SAAS;AAAA,QACP,eAAe,oBAAoB;AAAA,QACnC,gBAAgB;AAAA,QAChB,uBAAuB;AAAA,MACzB;AAAA,IACF;AAAA,EACF;AAEA,SAAO,EAAE,OAAO,KAAK;AACvB;AAEO,SAAS,uBACd,iBACA,WAC0D;AAC1D,MAAI,gBAAgB,WAAW,GAAG;AAChC,WAAO,EAAE,eAAe,MAAM,cAAc,CAAC,EAAE;AAAA,EACjD;AAEA,MAAI,UAAU,WAAW,GAAG;AAC1B,WAAO,EAAE,eAAe,OAAO,cAAc,CAAC,GAAG,eAAe,EAAE;AAAA,EACpE;AAEA,QAAM,iBAAiB,CAAC,GAAG,SAAS;AACpC,QAAM,eAA+B,CAAC;AAEtC,aAAW,mBAAmB,iBAAiB;AAC7C,QAAI,QAAQ;AAEZ,aAAS,IAAI,GAAG,IAAI,eAAe,QAAQ,KAAK;AAC9C,UAAI,WAAW,iBAAiB,eAAe,CAAC,CAAC,GAAG;AAClD,uBAAe,OAAO,GAAG,CAAC;AAC1B,gBAAQ;AACR;AAAA,MACF;AAAA,IACF;AAEA,QAAI,CAAC,OAAO;AACV,mBAAa,KAAK,eAAe;AAAA,IACnC;AAAA,EACF;AAEA,SAAO;AAAA,IACL,eAAe,aAAa,WAAW;AAAA,IACvC;AAAA,EACF;AACF;AAEA,SAAS,WAAW,GAAiB,GAA0B;AAC7D,MAAI,KAAK,QAAQ,KAAK,MAAM;AAC1B,WAAO;AAAA,EACT;AACA,MAAI,KAAK,QAAQ,KAAK,MAAM;AAC1B,WAAO;AAAA,EACT;AAEA,MAAI,OAAO,MAAM,YAAY,OAAO,MAAM,UAAU;AAClD,WAAO,kBAAkB,CAAC,MAAM,kBAAkB,CAAC;AAAA,EACrD;AAEA,MAAI,OAAO,MAAM,YAAY,OAAO,MAAM,UAAU;AAClD,QAAI;AACF,aACE,KAAK,UAAUC,iBAAgB,CAAC,CAAC,MACjC,KAAK,UAAUA,iBAAgB,CAAC,CAAC;AAAA,IAErC,SAAQ;AACN,aAAO,OAAO,CAAC,MAAM,OAAO,CAAC;AAAA,IAC/B;AAAA,EACF;AAEA,SAAO,MAAM;AACf;AAKA,SAAS,kBAAkB,UAA0B;AAEnD,SAAO,SAAS,KAAK,EAAE,QAAQ,QAAQ,GAAG;AAC5C;AAEA,SAASA,iBAAgB,KAAiC;AACxD,MAAI,OAAO,MAAM;AACf,WAAO;AAAA,EACT;AACA,MAAI,OAAO,QAAQ,UAAU;AAC3B,WAAO;AAAA,EACT;AACA,MAAI,MAAM,QAAQ,GAAG,GAAG;AACtB,WAAO,IAAI,IAAI,CAAC,SAASA,iBAAgB,IAAoB,CAAC;AAAA,EAChE;AAEA,QAAM,aAAsC,CAAC;AAC7C,aAAW,CAAC,KAAK,KAAK,KAAK,OAAO,QAAQ,GAAG,GAAG;AAC9C,QAAI,UAAU,QAAW;AACvB,iBAAW,GAAG,IAAIA,iBAAgB,KAAqB;AAAA,IACzD;AAAA,EACF;AAEA,QAAM,SAAkC,CAAC;AACzC,aAAW,OAAO,OAAO,KAAK,UAAU,EAAE,KAAK,GAAG;AAChD,WAAO,GAAG,IAAI,WAAW,GAAG;AAAA,EAC9B;AAEA,SAAO;AACT;;;AC5GO,SAAS,aAEd,gBAEA,sBACkB;AAClB,aAAW,CAAC,WAAW,mBAAmB,KAAK,OAAO;AAAA,IACpD;AAAA,EACF,GAAG;AACD,UAAM,gBAAgB,eAAe,SAAS;AAE9C,QAAI,CAAC,eAAe;AAClB,aAAO;AAAA,QACL,OAAO;AAAA,QACP,YAAY;AAAA,QACZ,SAAS;AAAA,UACP,aAAa,EAAE,CAAC,SAAS,GAAG,wCAAwC;AAAA,QACtE;AAAA,MACF;AAAA,IACF;AAEA,UAAM,mBAAmB;AAAA,MACvB;AAAA,MACA;AAAA,IACF;AAEA,QAAI,CAAC,iBAAiB,OAAO;AAE3B,cAAQ,IAAI,kCAAkC;AAC9C,cAAQ;AAAA,QACN;AAAA,QACA,KAAK,UAAU,iBAAiB,aAAa,MAAM,CAAC;AAAA,MACtD;AACA,cAAQ;AAAA,QACN;AAAA,QACA,KAAK,UAAU,uBAAuB,aAAa,GAAG,MAAM,CAAC;AAAA,MAC/D;AACA,cAAQ;AAAA,QACN;AAAA,QACA,KAAK,UAAU,uBAAuB,mBAAmB,GAAG,MAAM,CAAC;AAAA,MACrE;AAEA,aAAO;AAAA,QACL,OAAO;AAAA,QACP,YAAY;AAAA,QACZ,SAAS;AAAA,UACP,aAAa,iBAAiB;AAAA,UAC9B,sBAAsB,uBAAuB,aAAa;AAAA,UAC1D,6BACE,uBAAuB,mBAAmB;AAAA,QAC9C;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAEA,SAAO,EAAE,OAAO,KAAK;AACvB;AAEA,SAAS,iBAEP,aAEA,mBAIA;AACA,QAAM,cAA+C,CAAC;AAEtD,QAAM,aAAa,oBAAI,IAAI,CAAC,UAAU,SAAS,CAAC;AAChD,aAAW,YAAY,OAAO,KAAK,iBAAiB,GAAG;AACrD,QAAI,SAAS,WAAW,GAAG,KAAK,WAAW,IAAI,QAAQ,GAAG;AACxD;AAAA,IACF;AAEA,UAAM,YAAY,YAAY,QAAQ;AACtC,UAAM,kBAAkB,kBAAkB,QAAQ;AAGlD,QAAI,CAAC,UAAU,WAAW,eAAe,GAAG;AAC1C,kBAAY,QAAQ,IAAI;AAAA,QACtB,OAAO;AAAA,QACP,cAAc;AAAA,MAChB;AAAA,IACF;AAAA,EACF;AAEA,SAAO;AAAA,IACL,OAAO,OAAO,KAAK,WAAW,EAAE,WAAW;AAAA,IAC3C;AAAA,EACF;AACF;AAEA,IAAM,YAAY,oBAAI,IAAI,CAAC,UAAU,SAAS,CAAC;AAE/C,SAAS,cAAc,KAAsB;AAC3C,SAAO,IAAI,WAAW,GAAG,KAAK,UAAU,IAAI,GAAG;AACjD;AAEA,SAAS,gBAAgB,KAAuB;AAC9C,SAAO,OAAO,KAAK,GAAG,EAAE,OAAO,CAAC,MAAM,CAAC,cAAc,CAAC,CAAC;AACzD;AAEA,SAAS,gBAEP,GAEA,GACA,MACS;AACT,MAAI,EAAE,WAAW,EAAE,QAAQ;AACzB,WAAO;AAAA,EACT;AACA,WAAS,IAAI,GAAG,IAAI,EAAE,QAAQ,KAAK;AACjC,QAAI,CAAC,UAAU,EAAE,CAAC,GAAG,EAAE,CAAC,GAAG,IAAI,GAAG;AAChC,aAAO;AAAA,IACT;AAAA,EACF;AACA,SAAO;AACT;AAEA,SAAS,iBAEP,GAEA,GACA,MACS;AACT,QAAM,QAAQ,gBAAgB,CAAC;AAC/B,QAAM,QAAQ,gBAAgB,CAAC;AAE/B,MAAI,MAAM,WAAW,MAAM,QAAQ;AACjC,WAAO;AAAA,EACT;AAEA,aAAW,OAAO,OAAO;AACvB,QAAI,CAAC,MAAM,SAAS,GAAG,GAAG;AACxB,aAAO;AAAA,IACT;AACA,QAAI,CAAC,UAAU,EAAE,GAAG,GAAG,EAAE,GAAG,GAAG,IAAI,GAAG;AACpC,aAAO;AAAA,IACT;AAAA,EACF;AACA,SAAO;AACT;AAEA,SAAS,UAEP,GAEA,GACA,OAAwB,oBAAI,QAAQ,GAC3B;AACT,MAAI,MAAM,GAAG;AACX,WAAO;AAAA,EACT;AACA,MAAI,KAAK,QAAQ,KAAK,MAAM;AAC1B,WAAO,MAAM;AAAA,EACf;AACA,MAAI,OAAO,MAAM,OAAO,GAAG;AACzB,WAAO;AAAA,EACT;AACA,MAAI,OAAO,MAAM,UAAU;AACzB,WAAO,MAAM;AAAA,EACf;AAEA,MAAI,KAAK,IAAI,CAAC,KAAK,KAAK,IAAI,CAAC,GAAG;AAC9B,WAAO;AAAA,EACT;AACA,OAAK,IAAI,CAAC;AACV,MAAI,OAAO,MAAM,UAAU;AACzB,SAAK,IAAI,CAAC;AAAA,EACZ;AAEA,MAAI,MAAM,QAAQ,CAAC,KAAK,MAAM,QAAQ,CAAC,GAAG;AACxC,WAAO,gBAAgB,GAAG,GAAG,IAAI;AAAA,EACnC;AACA,MAAI,MAAM,QAAQ,CAAC,MAAM,MAAM,QAAQ,CAAC,GAAG;AACzC,WAAO;AAAA,EACT;AAEA,SAAO,iBAAiB,GAAG,GAAG,IAAI;AACpC;AAEA,SAAS,uBAEP,UACiC;AACjC,QAAM,QAAyC,CAAC;AAEhD,aAAW,CAAC,KAAK,KAAK,KAAK,OAAO,QAAQ,QAAQ,GAAG;AACnD,QAAI,CAAC,IAAI,WAAW,GAAG,GAAG;AACxB,UAAI;AACF,YAAI,QAAQ,UAAU,OAAO,UAAU,UAAU;AAC/C,gBAAM,GAAG,IAAI,mBAAmB,KAAK;AAAA,QACvC,OAAO;AACL,gBAAM,GAAG,IACP,OAAO,UAAU,WACb,KAAK,MAAM,KAAK,UAAU,KAAK,CAAC,IAC/B;AAAA,QACT;AAAA,MACF,SAAQ;AACN,cAAM,GAAG,IAAI,OAAO,KAAK;AAAA,MAC3B;AAAA,IACF;AAAA,EACF;AAEA,SAAO;AACT;AAGA,SAAS,mBAAmB,KAAU,QAAQ,GAAqB;AACjE,MAAI,QAAQ,GAAG;AACb,WAAO,EAAE,OAAO,sBAAsB;AAAA,EACxC;AAEA,QAAM,SAA2B;AAAA,IAC/B,MAAM,IAAI;AAAA,IACV,UAAU,CAAC;AAAA,EACb;AAEA,QAAM,WAAW,OAAO;AACxB,aAAW,CAAC,MAAM,IAAI,KAAK,OAAO,QAAQ,IAAI,YAAY,CAAC,CAAC,GAAG;AAC7D,QAAI,gBAAgB,MAAM;AACxB,eAAS,IAAI,IAAI,EAAE,MAAM,QAAQ,SAAS,KAAK,QAAQ;AAAA,IACzD,WAAW,gBAAgB,WAAW;AACpC,eAAS,IAAI,IAAI,mBAAmB,MAAM,QAAQ,CAAC;AAAA,IACrD;AAAA,EACF;AAEA,SAAO;AACT;;;ACzPA,SAAS,iBAAiB,aAAmC;AAC3D,SAAO,YAAY,IAAI,CAAC,SAAS,aAAa,gBAAgB,IAAI,CAAC;AACrE;AAEA,eAAsB,iBACpB,gBACA,wBACA,WAKA,cACA,WAC+B;AAC/B,QAAM,gBAAgB,UAAU,kBAAkB,CAAC;AACnD,QAAM,kBAAkB,UAAU,oBAAoB,CAAC;AAEvD,wBAAsB,UAAU,IAAI,SAAS;AAC7C,wBAAsB,UAAU,IAAI,GAAG,SAAS,eAAe;AAE/D,QAAM,aAAa,MAAM;AAAA,IACvB,CAAC;AAAA,IACD;AAAA,IACA;AAAA,IACA;AAAA,IACA,UAAU;AAAA,IACV,aAAa,SAAS,cAAc;AAAA,IACpC;AAAA,EACF;AACA,QAAM,eAAe,MAAM;AAAA,IACzB,CAAC;AAAA,IACD;AAAA,IACA;AAAA,IACA,GAAG,SAAS;AAAA,IACZ,UAAU;AAAA,IACV,aAAa,SAAS,cAAc;AAAA,IACpC;AAAA,EACF;AAEA,QAAM,+BAAyC,CAAC;AAChD,MAAI,sBAAsB,WAAW;AACrC,MAAI,4BAA4B,aAAa;AAE7C,WACM,YAAY,GAChB,YAAY,uBAAuB,QACnC,aACA;AACA,UAAM,mBAAmB;AAAA,MACvB,uBAAuB,SAAS;AAAA,IAClC;AACA,UAAM,aAAa,eAAe,SAAS,KAAK,CAAC;AAEjD,UAAM,kCAA4C,CAAC;AAEnD,eAAW,iBAAiB,YAAY;AACtC,YAAM,aAAa,MAAM;AAAA,QACvB;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA,UAAU;AAAA,QACV,aAAa,SAAS,cAAc;AAAA,QACpC;AAAA,MACF;AACA,sCAAgC,KAAK,GAAG,WAAW,gBAAgB;AACnE,4BAAsB,WAAW;AAAA,IACnC;AAEA,UAAM,oBAAoB,MAAM;AAAA,MAC9B;AAAA,MACA;AAAA,MACA;AAAA,MACA,GAAG,SAAS;AAAA,MACZ,UAAU;AAAA,MACV,aAAa,SAAS,cAAc;AAAA,MACpC;AAAA,IACF;AAEA,iCAA6B,KAAK,GAAG,+BAA+B;AACpE,gCAA4B,kBAAkB;AAE9C,QAAI,iBAAiB,WAAW,GAAG;AACjC;AAAA,IACF;AAEA,UAAM,mBAAmB;AAAA,MACvB;AAAA,MACA;AAAA,IACF;AACA,QAAI,CAAC,iBAAiB,OAAO;AAC3B,aAAO;AAAA,QACL,OAAO;AAAA,QACP,YAAY,iBAAiB;AAAA,QAC7B,SAAS,iBAAiB;AAAA,MAC5B;AAAA,IACF;AAEA,UAAM,sBAAsB;AAAA,MAC1B;AAAA,MACA,kBAAkB;AAAA,MAClB;AAAA,IACF;AACA,QAAI,CAAC,oBAAoB,OAAO;AAC9B,aAAO;AAAA,QACL,OAAO;AAAA,QACP,YAAY,oBAAoB;AAAA,QAChC,SAAS,oBAAoB;AAAA,MAC/B;AAAA,IACF;AAAA,EACF;AAEA,SAAO,EAAE,OAAO,KAAK;AACvB;AAEO,SAAS,4BACd,gBACA,wBACsB;AACtB,WACM,YAAY,GAChB,YAAY,uBAAuB,QACnC,aACA;AACA,UAAM,mBAAmB,uBAAuB,SAAS;AACzD,UAAM,aAAa,eAAe,SAAS,KAAK,CAAC;AAEjD,UAAM,iBAAiB,WAAW,KAAK;AACvC,UAAM,mBAAmB,eAAe;AAAA,MAAI,CAAC,OAC3C,GAAG,OAAO,KAAK,UAAU,EAAE,IAAI;AAAA,IACjC;AAEA,QACE,iBAAiB,WAAW,KAC5B,CAAC,uBAAuB,gBAAgB,GACxC;AACA,aAAO;AAAA,QACL,OAAO;AAAA,QACP,YAAY;AAAA,QACZ,SAAS,EAAE,wBAAwB,WAAW;AAAA,MAChD;AAAA,IACF;AAAA,EACF;AAEA,SAAO,EAAE,OAAO,KAAK;AACvB;AAEO,SAAS,mBACd,aACA,WACM;AACN,wBAAsB,aAAa,SAAS;AAC5C,wBAAsB,aAAa,GAAG,SAAS,eAAe;AAChE;;;AfnJA,IAAMC,oBAAmB;AACzB,IAAMC,wBAAuB;AAC7B,IAAM,qBAAqB;AAC3B,IAAM,iDACJ;AAEF,IAAM,2BAA2B;AAAA;AAAA;AAKjC,IAAM,qBAAqB;AAC3B,IAAM,yBAAyB;AAC/B,IAAM,qBAAqB;AAC3B,IAAM,2BAA2B;AA2CjC,IAAM,sBAAsB;AAAA,EAC1B;AAAA,IACE,MAAM;AAAA,IACN,aAAa;AAAA,IACb,UAAU;AAAA,IACV,YAAY;AAAA,EACd;AAAA,EACA;AAAA,IACE,MAAM;AAAA,IACN,aAAa;AAAA,IACb,UAAU;AAAA,IACV,YAAY;AAAA,EACd;AAAA,EACA;AAAA,IACE,MAAM;AAAA,IACN,aAAa;AAAA,IACb,UAAU;AAAA,IACV,YAAY;AAAA,EACd;AAAA,EACA;AAAA,IACE,MAAM;AAAA,IACN,aAAa;AAAA,IACb,UAAU;AAAA,IACV,YAAY;AAAA,EACd;AACF;AAEA,IAAM,kBAA0C;AAAA,EAC9C,mBAAmB;AAAA,EACnB,SAAS;AAAA,EACT,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,WAAW;AAAA,EACX,YAAY;AAAA,EACZ,WAAW;AAAA,EACX,mBAAmB;AACrB;AAEA,IAAM,eAAe,oBAAI,IAAwB;AAEjD,IAAM,iBAAiB,CAAC,aAAmD;AACzE,MAAI,MAAM,QAAQ,QAAQ,KAAK,SAAS,KAAK,CAAC,MAAM,MAAM,QAAQ,CAAC,CAAC,GAAG;AACrE,WAAO;AAAA,EACT;AACA,SAAO,CAAC,QAAqB;AAC/B;AAEA,IAAM,YAAY,CAAC,WAA6B;AAC9C,MAAI,CAAC,UAAU,OAAO,WAAW,UAAU;AACzC,WAAO,EAAE,MAAM,UAAU,YAAY,CAAC,EAAE;AAAA,EAC1C;AACA,QAAM,OAAqC,MAAM,QAAQ,MAAM,IAC1D,OAAqB,IAAI,CAAC,MAAM,UAAU,CAAC,CAAC,IAC5C,EAAE,GAAI,OAAmC;AAE9C,MAAI,MAAM,QAAQ,IAAI,GAAG;AACvB,WAAO;AAAA,EACT;AAEA,MAAI,CAAC,KAAK,MAAM;AACd,SAAK,OAAO;AAAA,EACd;AACA,MAAI,KAAK,SAAS,QAAQ;AACxB,SAAK,OAAO;AAAA,EACd;AACA,MAAI,KAAK,SAAS,SAAS;AACzB,SAAK,OAAO;AAAA,EACd;AACA,MAAI,KAAK,SAAS,aAAa,KAAK,SAAS,SAAS;AACpD,SAAK,OAAO;AAAA,EACd;AACA,MAAI,KAAK,cAAc,OAAO,KAAK,eAAe,UAAU;AAC1D,eAAW,KAAK,OAAO,KAAK,KAAK,UAAU,GAAG;AAC5C,MAAC,KAAK,WAAuC,CAAC,IAAI;AAAA,QAC/C,KAAK,WAAuC,CAAC;AAAA,MAChD;AAAA,IACF;AAAA,EACF;AACA,MAAI,KAAK,OAAO;AACd,SAAK,QAAQ,UAAU,KAAK,KAAK;AAAA,EACnC;AACA,SAAO;AACT;AAEA,IAAM,eAAe,CAAC,aAA6B;AACjD,QAAM,IAAI,SAAS,QAAQ,mBAAmB,GAAG,EAAE,MAAM,GAAG,EAAE;AAC9D,SAAO,EAAE,SAAS,IAAI,IAAI;AAC5B;AAEA,IAAM,wBAAwB,CAC5B,UAC0E;AAC1E,QAAM,UAAU,oBAAI,IAAoB;AACxC,QAAM,mBAAmB,MAAM,IAAI,CAAC,MAAM;AACxC,UAAM,QAAQ,UAAU,EAAE,UAAU;AACpC,UAAM,iBACJ,SACA,OAAO,UAAU,YAChB,MAA2B,SAAS;AACvC,UAAM,cAAgC,iBACjC,QACD,EAAE,MAAM,UAAU,YAAY,CAAC,EAAE;AAErC,UAAM,YAAY,aAAa,EAAE,IAAI;AACrC,YAAQ,IAAI,WAAW,EAAE,IAAI;AAE7B,WAAO;AAAA,MACL,MAAM;AAAA,MACN,MAAM;AAAA,MACN,aAAa,EAAE;AAAA,MACf;AAAA,IACF;AAAA,EACF,CAAC;AAED,SAAO,EAAE,kBAAkB,QAAQ;AACrC;AAEA,IAAM,gBAAgB,CACpB,qBAEA,OAAO;AAAA,EACL,iBAAiB,IAAI,CAAC,MAAM;AAAA,IAC1B,EAAE;AAAA,QACF,iBAAK;AAAA,MACH,aACE,OAAO,EAAE,gBAAgB,WAAW,EAAE,cAAc;AAAA,MACtD,iBAAa,uBAAW,EAAE,WAAsC;AAAA,IAClE,CAAC;AAAA,EACH,CAAC;AACH;AAEF,IAAM,gBAAgB,CAAC,kBAAoC;AACzD,MAAI,OAAO,kBAAkB,UAAU;AACrC,WAAO;AAAA,EACT;AACA,MAAI;AACF,WAAO,KAAK,MAAM,aAAa;AAAA,EACjC,SAAQ;AAGN,QAAI;AACF,YAAM,UAAU,cACb,QAAQ,OAAO,KAAK,EACpB,QAAQ,OAAO,KAAK,EACpB,QAAQ,OAAO,KAAK;AACvB,aAAO,KAAK,MAAM,OAAO;AAAA,IAC3B,SAAQC,IAAA;AACN,aAAO;AAAA,IACT;AAAA,EACF;AACF;AAEA,IAAM,mBAAmB,CACvB,SACA,qBACY;AA1Od;AA2OE,MAAI,OAAO,YAAY,YAAYD,sBAAqB,KAAK,OAAO,GAAG;AACrE,YAAO,4BAAiB,OAAO,OAAO,CAAC,MAAhC,mBAAmC,SAAnC,YAA2C;AAAA,EACpD;AACA,SAAO;AACT;AAEA,IAAM,mBAAmB,CACvB,WACA,SACA,sBAEC,aAAa,CAAC,GAAG,IAAI,CAAC,MAAe;AAtPxC;AAuPI,QAAM,OAAO;AACb,QAAM,WAAU,UAAK,aAAL,YAAiB,KAAK;AACtC,QAAM,qBAAqB,iBAAiB,SAAS,gBAAgB;AACrE,QAAM,gBACJ,aAAQ,IAAI,kBAA4B,MAAxC,YAA6C;AAC/C,QAAM,iBACJ,4BAAK,SAAL,YACA,KAAK,cADL,YAEA,KAAK,UAFL,YAGA,KAAK,WAHL,YAIA,KAAK;AACP,QAAM,aAAa,cAAc,aAAa;AAC9C,SAAO;AAAA,IACL,YACE,OAAO,KAAK,eAAe,WAAW,KAAK,aAAa;AAAA,IAC1D,UAAU,OAAO,YAAY;AAAA,IAC7B,MAAM,kCAAc,CAAC;AAAA,EACvB;AACF,CAAC;AAEH,IAAM,oBAAoB,OACxB,WACA,YACwB;AAExB,QAAM,eAAe,QAAQ,IAAI,6BAA6B;AAC9D,MAAI,CAAC,cAAc;AACjB,UAAM,SAAS,aAAa,IAAI,SAAS;AACzC,QAAI,QAAQ;AACV,aAAO;AAAA,IACT;AAAA,EACF;AACA,QAAM,UAAU,gBAAgB,SAAS;AACzC,MAAI,CAAC,SAAS;AACZ,UAAM,IAAI,MAAM,uCAAuC,SAAS,EAAE;AAAA,EACpE;AACA,QAAM,MAAM,MAAM,gBAAAE,SAAG,SAAS,kBAAAC,QAAK,KAAK,SAAS,OAAO,GAAG,OAAO;AAClE,QAAM,QAAQ,IACX,MAAMJ,iBAAgB,EACtB,OAAO,CAAC,SAAS,KAAK,KAAK,EAAE,SAAS,CAAC,EACvC,IAAI,CAAC,SAAS,KAAK,MAAM,IAAI,CAAC,EAC9B,IAAI,CAAC,UAAmC;AAhS7C;AAiSM,UAAM,aAAa,OAAO,MAAM,SAAS,WAAW,MAAM,OAAO;AAEjE,UAAM,WAAW,GAAG,SAAS,IAAI,UAAU;AAC3C,WAAO;AAAA,MACL,MAAM;AAAA,MACN,aACE,OAAO,MAAM,gBAAgB,WAAW,MAAM,cAAc;AAAA,MAC9D,aAAa,WAAM,eAAN,YAAoB;AAAA,QAC/B,MAAM;AAAA,QACN,YAAY,CAAC;AAAA,MACf;AAAA,IACF;AAAA,EACF,CAAC;AAEH,eAAa,IAAI,WAAW,KAAK;AACjC,SAAO;AACT;AAEA,IAAM,sBAAsB,OAC1B,SACA,YACwB;AACxB,QAAM,gBAAgB,MAAM,QAAQ;AAAA,IAClC,QAAQ,IAAI,CAAC,QAAQ,kBAAkB,KAAK,OAAO,CAAC;AAAA,EACtD;AACA,SAAO,cAAc,KAAK;AAC5B;AAEA,IAAM,gBAAgB,CAAC,aAA0B;AA7TjD;AA8TE,wBAAS,MAAM,GAAG,EAAE,IAAI,MAAxB,YAA6B;AAAA;AAE/B,IAAM,mBAAmB,CAAC,UAA4B;AACpD,MAAI,EAAE,iBAAiB,QAAQ;AAC7B,WAAO;AAAA,EACT;AACA,QAAM,UAAU,MAAM,QAAQ,YAAY;AAC1C,MAAI,QAAQ,SAAS,KAAK,KAAK,QAAQ,SAAS,YAAY,GAAG;AAC7D,WAAO;AAAA,EACT;AACA,QAAM,WAAW;AACjB,MAAI,SAAS,WAAW,OAAO,SAAS,eAAe,KAAK;AAC1D,WAAO;AAAA,EACT;AAEA,MACE,SAAS,SACT,OAAO,SAAS,UAAU,YACzB,SAAS,MAAkC,WAAW,KACvD;AACA,WAAO;AAAA,EACT;AACA,SAAO;AACT;AAEA,IAAM,QAAQ,CAAC,OACb,IAAI,QAAQ,CAAC,YAAY,WAAW,SAAS,EAAE,CAAC;AAElD,IAAM,YAAY,OAChB,IACA,UAA+B,CAAC,MACjB;AACf,MAAI;AACJ,MAAI,QAAQ;AAEZ,WAAS,UAAU,GAAG,WAAW,oBAAoB,WAAW;AAC9D,QAAI;AACF,aAAO,MAAM,GAAG;AAAA,IAClB,SAAS,OAAO;AACd,kBAAY;AAEZ,UAAI,CAAC,iBAAiB,KAAK,GAAG;AAC5B,cAAM;AAAA,MACR;AAEA,UAAI,YAAY,oBAAoB;AAClC,cAAM;AAAA,MACR;AAEA,UAAI,QAAQ,OAAO;AACjB,gBAAQ;AAAA,UACN,uCAAuC,KAAK,eAAe,OAAO,IAAI,kBAAkB;AAAA,QAC1F;AAAA,MACF;AAEA,YAAM,MAAM,KAAK;AACjB,cAAQ,KAAK,IAAI,QAAQ,0BAA0B,kBAAkB;AAAA,IACvE;AAAA,EACF;AAEA,QAAM;AACR;AAEA,IAAM,+BAA+B,CACnC,MACA,aACA,cACA,oBAC8B;AAAA,EAC9B;AAAA,EACA,SAAS;AAAA,EACT;AAAA,EACA,MAAM,IACJ,OACA,QAC0B;AAC1B,YAAQ,IAAI,uCAAuC;AAGnD,iBAAa,MAAM;AAGnB,yBAAqB,MAAM;AAE3B,UAAM,OAAiB,CAAC;AACxB,QAAI,eAAe;AACnB,QAAI,YAAiC,CAAC;AAEtC,UAAM,WAAW,eAAe;AAEhC,UAAM,aAAa,KAAK,UAAU,UAAU,CAAC,CAAC;AAC9C,UAAM,QAAQ,QAAQ,KAAK,IAAI,CAAC,IAAI,KAAK,OAAO,EAAE,SAAS,EAAE,EAAE,MAAM,GAAG,CAAC,CAAC,IAAI,WAAW,MAAM,GAAG,EAAE,CAAC;AAErG,QAAI;AACF,WAAK,KAAK,0BAA0B,QAAQ,EAAE;AAC9C,YAAM,gBAAgB,MAAM,gBAAAG,SAAG;AAAA,QAC7B,kBAAAC,QAAK,KAAK,UAAU,YAAY;AAAA,QAChC;AAAA,MACF;AACA,YAAM,sBAAsB,MAAM,gBAAAD,SAAG;AAAA,QACnC,kBAAAC,QAAK,KAAK,UAAU,cAAc;AAAA,QAClC;AAAA,MACF;AAEA,kBAAY,cACT,MAAMJ,iBAAgB,EACtB,OAAO,CAAC,SAAS,KAAK,KAAK,EAAE,SAAS,CAAC,EACvC,IAAI,CAAC,SAAS,KAAK,MAAM,IAAI,CAAC;AAEjC,YAAM,kBAAoC,oBACvC,MAAMA,iBAAgB,EACtB,OAAO,CAAC,SAAS,KAAK,KAAK,EAAE,SAAS,CAAC,EACvC,IAAI,CAAC,SAAS,KAAK,MAAM,IAAI,CAAC;AACjC,YAAM,qBAAqB,IAAI;AAAA,QAC7B,gBAAgB,IAAI,CAAC,QAAQ,CAAC,IAAI,IAAI,GAAG,CAAC;AAAA,MAC5C;AAEA,YAAM,WAAW,QAAQ,IAAI;AAC7B,YAAM,QAAQ,WAAW,OAAO,QAAQ,IAAI;AAC5C,UAAI,SAAS,OAAO,SAAS,KAAK,KAAK,QAAQ,GAAG;AAChD,oBAAY,UAAU,MAAM,GAAG,KAAK;AACpC,aAAK,KAAK,iCAAiC,KAAK,qBAAqB;AAAA,MACvE;AAEA,YAAM,iBAAiB,QAAQ,IAAI;AACnC,YAAM,cACJ,kBAAkB,OAAO,SAAS,OAAO,cAAc,CAAC,IACpD,KAAK,IAAI,GAAG,OAAO,cAAc,CAAC,IAClC;AACN,WAAK;AAAA,QACH,kBAAkB,UAAU,MAAM,gCAAgC,WAAW;AAAA,MAC/E;AAEA,YAAM,OAAO,iCAAQ;AACrB,YAAM,cAAc,OAAO,SAAS,WAAW,OAAO;AACtD,YAAM,SAAS,iCAAQ;AACvB,YAAM,YAAY,OAAO,WAAW,WAAW,SAAS;AAExD,YAAM,YAAY,QAAQ,IAAI,eAAe;AAE7C,YAAM,yBAAyB,OAAO,YAOhC;AAjdZ;AAkdQ,cAAM,EAAE,UAAU,SAAS,IAAI;AAC/B,cAAM,kBAA8C;AAAA,UAClD,oBAAoB;AAAA,YAClB,cAAc,CAAC;AAAA,UACjB;AAAA,QACF;AACA,cAAM,EAAE,WAAW,MAAM,aAAa,IAAI,MAAM;AAAA,UAC9C,UACE,yBAAa;AAAA,YACX;AAAA,YACA,QAAQ;AAAA,YACR;AAAA,YACA,OAAO;AAAA,YACP,YAAY;AAAA,YACZ;AAAA,YACA,GAAI,gBAAgB,SAAY,EAAE,YAAY,IAAI,CAAC;AAAA,YACnD,GAAI,cAAc,SACd,EAAE,iBAAiB,UAAU,IAC7B,CAAC;AAAA,UACP,CAAC;AAAA,UACH,EAAE,OAAO,UAAU;AAAA,QACrB;AAEA,YAAI,WAAW;AACb,kBAAQ,IAAI,gCAAgC;AAC5C,kBAAQ,IAAI,mBAAmB,YAAY;AAC3C,kBAAQ,IAAI,YAAW,wCAAM,UAAN,8BAAc,GAAG,SAAjB,YAAyB,IAAI;AACpD,kBAAQ;AAAA,YACN;AAAA,aACA,UAAK,UAAU,WAAW,MAAM,CAAC,MAAjC,mBAAoC,MAAM,GAAG;AAAA,UAC/C;AAAA,QACF;AAEA,eAAO,EAAE,WAAW,MAAM,aAAa;AAAA,MACzC;AAEA,YAAM,qBAAqB,CACzB,sBACwB;AACxB,cAAM,gBAAgB,oBAAI,IAAoB;AAC9C,mBAAW,CAAC,SAAS,KAAK,KAAK,OAAO,QAAQ,iBAAiB,GAAG;AAChE,gBAAM,YAAY,OAAO,OAAO;AAChC,cAAI,CAAC,OAAO,SAAS,SAAS,GAAG;AAC/B;AAAA,UACF;AACA,qBAAW,MAAM,OAAO;AACtB,0BAAc,IAAI,IAAI,SAAS;AAAA,UACjC;AAAA,QACF;AACA,eAAO;AAAA,MACT;AAEA,YAAM,kBAAkB,CACtB,OACA,WACA,sBACc;AA1gBtB;AA2gBQ,cAAM,gBAAe,WAAM,SAAS,MAAf,YAAoB,CAAC;AAC1C,cAAM,0BACJ,uBAAkB,OAAO,SAAS,CAAC,MAAnC,YAAwC,CAAC;AAC3C,YAAI,aAAa,WAAW,KAAK,uBAAuB,SAAS,GAAG;AAClE,iBAAO;AAAA,YACL;AAAA,cACE,MAAM;AAAA,cACN,SAAS;AAAA,YACX;AAAA,UACF;AAAA,QACF;AACA,eAAO;AAAA,MACT;AAEA,YAAM,oBAAoB,CACxB,OACA,mBACA,eACA,cAEA,MAAM,OAAO,CAAC,aAAa;AA/hBnC;AAgiBU,cAAM,aAAa,cAAc,SAAS,IAAI;AAC9C,YACE,kBAAkB,IAAI,UAAU,KAChC,kBAAkB,IAAI,SAAS,IAAI,GACnC;AACA,iBAAO;AAAA,QACT;AACA,cAAM,iBACJ,mBAAc,IAAI,UAAU,MAA5B,YAAiC,cAAc,IAAI,SAAS,IAAI;AAClE,YAAI,kBAAkB,UAAa,YAAY,eAAe;AAC5D,iBAAO;AAAA,QACT;AACA,eAAO;AAAA,MACT,CAAC;AAEH,YAAM,cAAc,OAAO,YAerB;AACJ,cAAM;AAAA,UACJ;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,QACF,IAAI;AAEJ,cAAM,EAAE,WAAW,MAAM,aAAa,IAAI,MAAM,uBAAuB;AAAA,UACrE,UAAU;AAAA,UACV;AAAA,QACF,CAAC;AACD,cAAM,iBAAiB,MAAM,QAAQ,SAAS,IAAI,YAAY,CAAC;AAE/D,gBAAQ,IAAI,oBAAoB,UAAU,SAAS,SAAS,GAAG;AAC/D,gBAAQ,IAAI,qBAAqB,QAAQ,MAAM,EAAE;AACjD,gBAAQ,IAAI,mBAAmB,QAAQ,GAAG,EAAE,CAAC;AAC7C,gBAAQ,IAAI,oBAAoB,YAAY,EAAE;AAC9C,gBAAQ,IAAI,qBAAqB,IAAI,GAAG;AACxC,gBAAQ,IAAI,uBAAuB,eAAe,MAAM,EAAE;AAC1D,YAAI,eAAe,SAAS,GAAG;AAC7B,kBAAQ;AAAA,YACN;AAAA,YACA,eAAe,IAAI,CAAC,QAAQ;AAAA,cAC1B,MAAM,GAAG;AAAA,cACT,MAAM,GAAG;AAAA,YACX,EAAE;AAAA,UACJ;AAAA,QACF;AAIA,YAAI,eAAe,WAAW,GAAG;AAC/B,gBAAM,cAAc,OAAO,SAAS,WAAW,OAAO;AACtD,gBAAM,iBAAiC,cACnC;AAAA,YACE,GAAG;AAAA,YACH;AAAA,cACE,MAAM;AAAA,cACN,SAAS,CAAC,EAAE,MAAM,QAAQ,MAAM,YAAY,CAAC;AAAA,YAC/C;AAAA,UACF,IACA;AACJ,iBAAO,EAAE,MAAM,MAAM,SAAS,gBAAgB,WAAW,CAAC,EAAE;AAAA,QAC9D;AAIA,cAAM,aACJ,iBAAiB,UACjB,iBAAiB,cACjB,iBAAiB;AAEnB,cAAM,gBAAgB;AAAA,UACpB;AAAA,UACA;AAAA,UACA;AAAA,QACF;AAEA,cAAM,gBAAgB,eAAe,IAAI,CAAC,MAAM,QAAQ;AA/nBhE;AAgoBU,gBAAM,SAAS;AACf,gBAAM,aACJ,OAAO,OAAO,eAAe,WACzB,OAAO,aACP,YAAY,SAAS,IAAI,SAAS,IAAI,GAAG;AAC/C,gBAAM,WAAU,YAAO,aAAP,YAAmB,OAAO;AAC1C,gBAAM,WACJ,OAAO,YAAY,WACf,WACC,4BAAiB,GAAG,MAApB,mBAAuB,SAAvB,YAA+B;AACtC,gBAAM,iBACJ,8BAAO,SAAP,YACA,OAAO,cADP,YAEA,OAAO,UAFP,YAGA,OAAO,WAHP,YAIA,OAAO;AACT,gBAAM,eAAc,mBAAc,aAAa,MAA3B,YAAgC,CAAC;AAErD,cAAI,WAAW;AACb,oBAAQ,IAAI,qBAAqB,GAAG,mBAAmB;AACvD,oBAAQ,IAAI,uBAAuB,OAAO,OAAO,IAAI,EAAE;AACvD,oBAAQ,IAAI,4BAA4B,OAAO,OAAO,SAAS,EAAE;AACjE,oBAAQ;AAAA,cACN,yBAAyB,OAAO,aAAa,aAAY,UAAK,UAAU,aAAa,MAA5B,mBAA+B,MAAM,GAAG,IAAI;AAAA,YACvG;AACA,oBAAQ;AAAA,cACN,uBAAuB,OAAO,WAAW,aAAY,UAAK,UAAU,WAAW,MAA1B,mBAA6B,MAAM,GAAG,IAAI;AAAA,YACjG;AAAA,UACF;AAEA,iBAAO;AAAA,YACL,MAAM;AAAA,YACN;AAAA,YACA;AAAA,YACA,OAAO;AAAA,UACT;AAAA,QACF,CAAC;AAED,cAAM,uBAAuC;AAAA,UAC3C,GAAG;AAAA,UACH;AAAA,YACE,MAAM;AAAA,YACN,SAAS;AAAA,UACX;AAAA,QACF;AAEA,cAAM,wBAAoC,cAAc,IAAI,CAAC,SAAM;AA9qB3E;AA8qB+E;AAAA,YACrE,UAAU,KAAK;AAAA,YACf,OAAO,UAAK,SAAL,YAAa,CAAC;AAAA,UACvB;AAAA,SAAE;AAEF,cAAM,kBAAkB,MAAM;AAAA,UAC5B;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,QACF;AACA,cAAM,mBAAmB,gBAAgB;AAEzC,gBAAQ,IAAI,wCAAwC,gBAAgB;AACpE,gBAAQ,IAAI,uBAAuB,qBAAqB;AAExD,cAAM,kBAAkB,iBAAiB,IAAI,CAAC,QAAQ,QAAQ;AAC5D,gBAAM,eAAe,cAAc,GAAG;AACtC,iBAAO;AAAA,YACL,MAAM;AAAA,YACN,YAAY,aAAa;AAAA,YACzB,UAAU,aAAa;AAAA,YACvB,QAAQ;AAAA,cACN,MAAM;AAAA,cACN,OAAO;AAAA,YACT;AAAA,UACF;AAAA,QACF,CAAC;AAED,cAAM,yBAAyC;AAAA,UAC7C,GAAG;AAAA,UACH;AAAA,YACE,MAAM;AAAA,YACN,SAAS;AAAA,UACX;AAAA,QACF;AAEA,eAAO;AAAA,UACL,MAAM;AAAA,UACN,SAAS;AAAA,UACT,WAAW;AAAA,QACb;AAAA,MACF;AAEA,YAAM,UAAU,OAAO,YAcjB;AACJ,cAAM;AAAA,UACJ;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,QACF,IAAI;AACJ,cAAM,iBAAiB;AAAA,UACrB;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,QACF;AACA,cAAM,EAAE,kBAAkB,QAAQ,IAChC,sBAAsB,cAAc;AACtC,cAAM,WAAW,cAAc,gBAAgB;AAC/C,cAAM,cAA4B,CAAC;AACnC,YAAI,YAAY;AAChB,YAAI,iBAAiB;AAErB,eAAO,aAAa,oBAAoB;AACtC,gBAAM,aAAa,MAAM,YAAY;AAAA,YACnC,SAAS;AAAA,YACT;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA,YAAY,SAAS;AAAA,UACvB,CAAC;AACD,cAAI,WAAW,MAAM;AACnB,mBAAO;AAAA,cACL,SAAS,WAAW;AAAA,cACpB;AAAA,cACA,WAAW;AAAA,YACb;AAAA,UACF;AACA,sBAAY,KAAK,WAAW,SAAS;AACrC,2BAAiB,WAAW;AAC5B,uBAAa;AAAA,QACf;AAEA,eAAO,EAAE,SAAS,gBAAgB,aAAa,WAAW,KAAK;AAAA,MACjE;AAEA,YAAM,mBAAmB,OACvB,UACA,mBAWI;AA7yBZ;AA8yBQ,cAAM,QAAQ,gBAAe,cAAS,aAAT,YAAqB,CAAC,CAAC;AACpD,cAAM,sBAAsB,eAAe;AAC3C,cAAM,mBAAkB,cAAS,qBAAT,YAA6B,CAAC;AACtD,cAAM,iBAAgB,cAAS,mBAAT,YAA2B,CAAC;AAClD,cAAM,oBAAoB,IAAI,KAAI,cAAS,sBAAT,YAA8B,CAAC,CAAC;AAClE,cAAM,qBAAoB,cAAS,oBAAT,YAA4B,CAAC;AACvD,cAAM,QAAQ,MAAM,oBAAoB,iBAAiB,QAAQ;AACjE,cAAM,gBAAgB,mBAAmB,iBAAiB;AAC1D,cAAM,gBACJ,SAAS,GAAG,SAAS,cAAc,KACnC,SAAS,GAAG,SAAS,WAAW;AAClC,eAAO;AAAA,UACL;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,QACF;AAAA,MACF;AAEA,YAAM,kBAAkB,OAAO,YAazB;AACJ,cAAM;AAAA,UACJ;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,QACF,IAAI;AACJ,YAAI,UAA0B,CAAC;AAC/B,cAAM,qBAAqC,CAAC;AAE5C,iBAAS,YAAY,GAAG,YAAY,MAAM,QAAQ,aAAa,GAAG;AAChE,gBAAM,eAAe;AAAA,YACnB;AAAA,YACA;AAAA,YACA;AAAA,UACF;AACA,cAAI,aAAa,SAAS,GAAG;AAC3B,sBAAU;AAAA,cACR,GAAG;AAAA,cACH,GAAI;AAAA,YACN;AAAA,UACF;AAEA,gBAAM,cAAc,MAAM,QAAQ;AAAA,YAChC;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,UACF,CAAC;AAED,oBAAU,YAAY;AACtB,6BAAmB,KAAK,YAAY,WAAW;AAE/C,cAAI,YAAY,WAAW;AACzB,mBAAO,EAAE,oBAAoB,WAAW,KAAK;AAAA,UAC/C;AAAA,QACF;AAEA,eAAO,EAAE,oBAAoB,WAAW,MAAM;AAAA,MAChD;AAEA,YAAM,YAAY,OAChB,UACA,oBACA,wBACqC;AACrC,cAAM,eAAe,SAAS,GAAG,MAAM,GAAG,EAAE,MAAM,GAAG,EAAE,EAAE,KAAK,GAAG;AACjE,cAAM,cAAc,MAAM;AAAA,UACxB;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,QACF;AAGA,cAAM,oBAAoB;AAAA,UACxB;AAAA,UACA;AAAA,QACF;AAEA,eAAO;AAAA,UACL,OAAO,YAAY,SAAS,kBAAkB;AAAA,UAC9C,YAAY,YAAY,cAAc,kBAAkB;AAAA,UACxD,SAAS,YAAY,WAAW,kBAAkB;AAAA,QACpD;AAAA,MACF;AAEA,YAAMK,iBAAgB,OACpB,aAEgD;AAp6BxD;AAq6BQ,YAAI;AACF,gBAAM,WAAqB,CAAC;AAC5B,gBAAM,iBAAiB,mBAAmB,IAAI,SAAS,EAAE;AACzD,cAAI,CAAC,gBAAgB;AACnB,qBAAS,KAAK,UAAU,SAAS,EAAE,2BAA2B;AAC9D,mBAAO,EAAE,OAAO,OAAO,MAAM,SAAS;AAAA,UACxC;AAEA,gBAAM,UAAU,MAAM,iBAAiB,UAAU,cAAc;AAE/D,gBAAM,qBAAqB,MAAM,gBAAgB;AAAA,YAC/C,GAAG;AAAA,YACH;AAAA,UACF,CAAC;AACD,cAAI,mBAAmB,WAAW;AAChC,qBAAS;AAAA,cACP,UAAU,SAAS,EAAE,4BAA4B,kBAAkB;AAAA,YACrE;AACA,mBAAO,EAAE,OAAO,OAAO,MAAM,SAAS;AAAA,UACxC;AAEA,gBAAM,gBAAgB,MAAM;AAAA,YAC1B;AAAA,YACA,mBAAmB;AAAA,YACnB,QAAQ;AAAA,UACV;AAGA,kBAAQ,IAAI,sBAAsB,SAAS,EAAE,EAAE;AAC/C,kBAAQ;AAAA,YACN,0BAA0B,mBAAmB,mBAAmB,MAAM;AAAA,YACtE,mBAAmB;AAAA,UACrB;AACA,kBAAQ;AAAA,YACN,yBAAyB,QAAQ,oBAAoB,MAAM;AAAA,YAC3D,QAAQ;AAAA,UACV;AAGA,mBACM,OAAO,GACX,OACA,KAAK;AAAA,YACH,mBAAmB,mBAAmB;AAAA,YACtC,QAAQ,oBAAoB;AAAA,UAC9B,GACA,QACA;AACA,kBAAM,YAAY,mBAAmB,mBAAmB,IAAI,KAAK,CAAC;AAClE,kBAAM,SAAS,QAAQ,oBAAoB,IAAI,KAAK,CAAC;AACrD,oBAAQ,IAAI,gBAAgB,IAAI,GAAG;AACnC,oBAAQ,IAAI,YAAY,KAAK,UAAU,SAAS,CAAC,EAAE;AACnD,oBAAQ,IAAI,mBAAmB,KAAK,UAAU,MAAM,CAAC,EAAE;AACvD,oBAAQ;AAAA,cACN,YAAY,KAAK,UAAU,SAAS,MAAM,KAAK,UAAU,MAAM,CAAC;AAAA,YAClE;AAAA,UACF;AAEA,kBAAQ,IAAI,2BAA2B,aAAa;AACpD,kBAAQ;AAAA,YACN,yBAAyB,QAAQ,oBAAoB,MAAM;AAAA,YAC3D,QAAQ;AAAA,UACV;AACA,kBAAQ,IAAI,2BAA2B,aAAa;AAEpD,cAAI,cAAc,UAAU,MAAM;AAChC,qBAAS,KAAK,UAAU,SAAS,EAAE,EAAE;AACrC,mBAAO,EAAE,OAAO,MAAM,MAAM,SAAS;AAAA,UACvC;AAEA,mBAAS;AAAA,YACP,UAAU,SAAS,EAAE,MAAK,mBAAc,eAAd,YAA4B,eAAe;AAAA,UACvE;AACA,iBAAO,EAAE,OAAO,OAAO,MAAM,SAAS;AAAA,QACxC,SAAS,GAAY;AACnB,gBAAM,WACJ,aAAa,QAAQ,EAAE,UAAU;AACnC,iBAAO;AAAA,YACL,OAAO;AAAA,YACP,MAAM,CAAC,UAAU,SAAS,EAAE,KAAK,QAAQ,EAAE;AAAA,UAC7C;AAAA,QACF;AAAA,MACF;AAEA,YAAM,oBAAoB,OACxB,aACgD;AAChD,YAAI;AACF,iBAAO,MAAMA,eAAc,QAAQ;AAAA,QACrC,SAAS,GAAY;AACnB,gBAAM,WACJ,aAAa,QAAQ,EAAE,UAAU;AACnC,cAAI,WAAW;AACb,oBAAQ,MAAM,8BAA8B,SAAS,EAAE,KAAK,CAAC;AAAA,UAC/D;AACA,iBAAO;AAAA,YACL,OAAO;AAAA,YACP,MAAM,CAAC,UAAU,SAAS,EAAE,KAAK,QAAQ,EAAE;AAAA,UAC7C;AAAA,QACF;AAAA,MACF;AAEA,YAAMC,sBAAqB,OACzB,OACA,kBACA,WACiB;AACjB,cAAM,UAAU,IAAI,MAAS,MAAM,MAAM;AACzC,YAAI,MAAM;AACV,cAAM,UAAU,IAAI,MAAM,KAAK,IAAI,kBAAkB,MAAM,MAAM,CAAC,EAC/D,KAAK,CAAC,EACN,IAAI,YAAY;AACf,iBAAO,MAAM;AACX,kBAAM,UAAU;AAChB,mBAAO;AACP,gBAAI,WAAW,MAAM,QAAQ;AAC3B;AAAA,YACF;AACA,oBAAQ,OAAO,IAAI,MAAM,OAAO,MAAM,OAAO,GAAG,OAAO;AAAA,UACzD;AAAA,QACF,CAAC;AACH,cAAM,QAAQ,IAAI,OAAO;AACzB,eAAO;AAAA,MACT;AAEA,YAAM,iBAAiB,MAAMA;AAAA,QAC3B;AAAA,QACA;AAAA,QACA,OAAO,OAAO,kBAAkB,EAAE;AAAA,MACpC;AAEA,qBAAe,eAAe;AAAA,QAC5B,CAAC,KAAK,MAAM,OAAO,EAAE,QAAQ,IAAI;AAAA,QACjC;AAAA,MACF;AACA,iBAAW,KAAK,gBAAgB;AAC9B,aAAK,KAAK,GAAG,EAAE,IAAI;AAAA,MACrB;AAEA,UAAI,UAAU,WAAW,GAAG;AAC1B,eAAO;AAAA,UACL,OAAO;AAAA,UACP,SAAS;AAAA,UACT,SAAS,CAAC;AAAA,UACV,MAAM,CAAC,sBAAsB;AAAA,QAC/B;AAAA,MACF;AAEA,YAAM,QAAQ,eAAe,UAAU;AACvC,YAAM,cAAc,eAAe,IAAI,CAAC,GAAG,OAAO;AAAA,QAChD,IAAI,UAAU,CAAC,EAAE;AAAA,QACjB,OAAO,EAAE;AAAA,MACX,EAAE;AACF,aAAO;AAAA,QACL;AAAA,QACA,SAAS,QAAQ;AAAA,QACjB,SAAS;AAAA,UACP,eAAe;AAAA,UACf,aAAa,UAAU;AAAA,UACvB,UAAU;AAAA,UACV,cAAc,KAAK,UAAU,WAAW;AAAA,QAC1C;AAAA,QACA;AAAA,MACF;AAAA,IACF,SAAS,GAAY;AACnB,aAAO;AAAA,QACL,OAAO;AAAA,QACP,SAAS;AAAA,QACT,SAAS,CAAC;AAAA,QACV,OAAO;AAAA,QACP,MAAM;AAAA,UACJ,oDAAqD,EAAY,OAAO;AAAA,QAC1E;AAAA,MACF;AAAA,IACF,UAAE;AAEA,yBAAmB,IAAI,KAAK;AAAA,IAC9B;AAAA,EACF;AACF;AAEO,IAAM,6BAA6B;AAAA,EACxC,oBAAoB,CAAC,EAAE;AAAA,EACvB,oBAAoB,CAAC,EAAE;AAAA,EACvB,oBAAoB,CAAC,EAAE;AAAA,EACvB,oBAAoB,CAAC,EAAE;AACzB;AACO,IAAM,oCAAoC;AAAA,EAC/C,oBAAoB,CAAC,EAAE;AAAA,EACvB,oBAAoB,CAAC,EAAE;AAAA,EACvB,oBAAoB,CAAC,EAAE;AAAA,EACvB,oBAAoB,CAAC,EAAE;AACzB;AACO,IAAM,iCAAiC;AAAA,EAC5C,oBAAoB,CAAC,EAAE;AAAA,EACvB,oBAAoB,CAAC,EAAE;AAAA,EACvB,oBAAoB,CAAC,EAAE;AAAA,EACvB,oBAAoB,CAAC,EAAE;AACzB;AACO,IAAM,kCAAkC;AAAA,EAC7C,oBAAoB,CAAC,EAAE;AAAA,EACvB,oBAAoB,CAAC,EAAE;AAAA,EACvB,oBAAoB,CAAC,EAAE;AAAA,EACvB,oBAAoB,CAAC,EAAE;AACzB;;;AgBnmCA,IAAAC,kBAA+B;AAC/B,IAAAC,oBAAiB;AAEjB,IAAAC,aAMO;AAMP,IAAMC,oBAAmB;AAmDzB,SAASC,mBAAkB,OAAuB;AAChD,MAAI,OAAO,UAAU,UAAU;AAC7B,WAAO;AAAA,EACT;AACA,SAAO,MAAM,YAAY,EAAE,KAAK;AAClC;AAKA,SAASC,aAAY,YAAqB,eAAiC;AACzE,MAAI,eAAe,eAAe;AAChC,WAAO;AAAA,EACT;AAEA,MAAI,OAAO,eAAe,YAAY,OAAO,kBAAkB,UAAU;AACvE,WAAOD,mBAAkB,UAAU,MAAMA,mBAAkB,aAAa;AAAA,EAC1E;AAEA,MAAI,OAAO,eAAe,YAAY,OAAO,kBAAkB,UAAU;AACvE,WACE,WAAW,SAAS,MAAM,iBAC1B,eAAe,OAAO,aAAa;AAAA,EAEvC;AACA,MAAI,OAAO,eAAe,YAAY,OAAO,kBAAkB,UAAU;AACvE,WACE,eAAe,cAAc,SAAS,KACtC,OAAO,UAAU,MAAM;AAAA,EAE3B;AAEA,MACE,OAAO,eAAe,YACtB,eAAe,QACf,OAAO,kBAAkB,YACzB,kBAAkB,MAClB;AACA,QAAI;AACF,aAAO,KAAK,UAAU,UAAU,MAAM,KAAK,UAAU,aAAa;AAAA,IACpE,SAAQ;AACN,aAAO;AAAA,IACT;AAAA,EACF;AAEA,SAAO;AACT;AAKA,SAAS,qBACP,eACA,kBACyD;AACzD,MAAI,kBAAkB,kBAAkB;AACtC,WAAO;AAAA,MACL,OAAO;AAAA,MACP,OAAO,qCAAqC,gBAAgB,WAAW,aAAa;AAAA,MACpF,YAAY;AAAA,IACd;AAAA,EACF;AACA,SAAO,EAAE,OAAO,KAAK;AACvB;AAKA,SAAS,uBACP,gBACA,WACA,cACyD;AACzD,aAAW,SAAS,gBAAgB;AAClC,QAAI,EAAE,SAAS,cAAc,SAAS,cAAc;AAClD,aAAO;AAAA,QACL,OAAO;AAAA,QACP,OAAO,gCAAgC,KAAK;AAAA,QAC5C,YAAY;AAAA,MACd;AAAA,IACF;AAAA,EACF;AACA,SAAO,EAAE,OAAO,KAAK;AACvB;AAKA,SAAS,oBACP,cACA,WACA,gBACyD;AACzD,aAAW,CAAC,WAAW,aAAa,KAAK,OAAO,QAAQ,YAAY,GAAG;AACrE,QAAI,EAAE,aAAa,YAAY;AAC7B,UAAI,CAAC,eAAe,SAAS,SAAS,GAAG;AACvC;AAAA,MACF;AACA,aAAO;AAAA,QACL,OAAO;AAAA,QACP,OAAO,uBAAuB,SAAS;AAAA,QACvC,YAAY;AAAA,MACd;AAAA,IACF;AAEA,UAAM,aAAa,UAAU,SAAS;AACtC,QAAI,CAACC,aAAY,YAAY,aAAa,GAAG;AAC3C,aAAO;AAAA,QACL,OAAO;AAAA,QACP,OAAO,cAAc,SAAS,8BAA8B,KAAK,UAAU,aAAa,CAAC,SAAS,KAAK,UAAU,UAAU,CAAC;AAAA,QAC5H,YAAY;AAAA,MACd;AAAA,IACF;AAAA,EACF;AACA,SAAO,EAAE,OAAO,KAAK;AACvB;AAKA,SAAS,kBACP,WACA,UACA,WACyD;AA5M3D;AA6ME,QAAM,mBAAmB,OAAO,KAAK,QAAQ,EAAE,CAAC;AAChD,QAAM,eAAe,SAAS,gBAAgB;AAC9C,QAAM,iBAAgB,eAAU,aAAV,YAAsB,UAAU;AACtD,QAAM,aAAa,eAAU,SAAV,YAAkB,CAAC;AAEtC,QAAM,aAAa,qBAAqB,eAAe,gBAAgB;AACvE,MAAI,CAAC,WAAW,OAAO;AACrB,WAAO;AAAA,EACT;AAEA,QAAM,WAAW,UAAU,KAAK,CAAC,MAAM,EAAE,SAAS,gBAAgB;AAClE,QAAM,kBAAiB,gDAAU,eAAV,mBAAsB,aAAtB,YAAkC,CAAC;AAE1D,QAAM,iBAAiB;AAAA,IACrB;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACA,MAAI,CAAC,eAAe,OAAO;AACzB,WAAO;AAAA,EACT;AAEA,SAAO,oBAAoB,cAAc,WAAW,cAAc;AACpE;AAKA,SAAS,sBACP,YACA,eACA,WACyD;AACzD,MAAI,WAAW,WAAW,cAAc,QAAQ;AAC9C,WAAO;AAAA,MACL,OAAO;AAAA,MACP,OAAO,4CAA4C,cAAc,MAAM,SAAS,WAAW,MAAM;AAAA,MACjG,YAAY;AAAA,IACd;AAAA,EACF;AAEA,MAAI,cAAc,WAAW,GAAG;AAC9B,WAAO,kBAAkB,WAAW,CAAC,GAAG,cAAc,CAAC,GAAG,SAAS;AAAA,EACrE;AAEA,QAAM,iBAAiB,oBAAI,IAAY;AACvC,aAAW,YAAY,eAAe;AACpC,QAAI,aAAa;AACjB,aAAS,IAAI,GAAG,IAAI,WAAW,QAAQ,KAAK;AAC1C,UAAI,eAAe,IAAI,CAAC,GAAG;AACzB;AAAA,MACF;AAEA,YAAM,SAAS,kBAAkB,WAAW,CAAC,GAAG,UAAU,SAAS;AACnE,UAAI,OAAO,OAAO;AAChB,uBAAe,IAAI,CAAC;AACpB,qBAAa;AACb;AAAA,MACF;AAAA,IACF;AAEA,QAAI,CAAC,YAAY;AACf,YAAM,mBAAmB,OAAO,KAAK,QAAQ,EAAE,CAAC;AAChD,aAAO;AAAA,QACL,OAAO;AAAA,QACP,OAAO,8CAA8C,gBAAgB;AAAA,QACrE,YAAY;AAAA,MACd;AAAA,IACF;AAAA,EACF;AAEA,SAAO,EAAE,OAAO,KAAK;AACvB;AAGA,IAAM,gBAAgB,CAAC,SAAiC;AACtD,MAAI,CAAC,KAAK,MAAM;AACd;AAAA,EACF;AACA,MAAI,KAAK,SAAS,QAAQ;AACxB,SAAK,OAAO;AAAA,EACd;AACA,MAAI,KAAK,SAAS,SAAS;AACzB,SAAK,OAAO;AAAA,EACd;AACA,MAAI,KAAK,SAAS,aAAa,KAAK,SAAS,SAAS;AACpD,SAAK,OAAO;AAAA,EACd;AACF;AAEA,IAAMC,aAAY,CAAC,WAA6B;AAC9C,MAAI,CAAC,UAAU,OAAO,WAAW,UAAU;AACzC,WAAO,EAAE,MAAM,UAAU,YAAY,CAAC,EAAE;AAAA,EAC1C;AACA,QAAM,OAAO,MAAM,QAAQ,MAAM,IAC7B,OAAO,IAAI,CAAC,MAAMA,WAAU,CAAC,CAAC,IAC7B,EAAE,GAAI,OAAmC;AAE9C,MAAI,CAAC,MAAM,QAAQ,IAAI,GAAG;AACxB,kBAAc,IAAI;AAClB,QAAI,KAAK,cAAc,OAAO,KAAK,eAAe,UAAU;AAC1D,iBAAW,KAAK,OAAO,KAAK,KAAK,UAAU,GAAG;AAC5C,QAAC,KAAK,WAAuC,CAAC,IAAIA;AAAA,UAC/C,KAAK,WAAuC,CAAC;AAAA,QAChD;AAAA,MACF;AAAA,IACF;AACA,QAAI,KAAK,OAAO;AACd,WAAK,QAAQA,WAAU,KAAK,KAAK;AAAA,IACnC;AAAA,EACF;AACA,SAAO;AACT;AAGA,SAAS,WAAW,OAAmB;AACrC,QAAM,UAAU,oBAAI,IAAoB;AACxC,QAAM,mBAAsC,MAAM,IAAI,CAAC,MAAM;AAC3D,UAAM,QAAQA,WAAU,EAAE,UAAU;AACpC,UAAM,cACJ,SACA,OAAO,UAAU,YAChB,MAA2B,SAAS,WAChC,QACD,EAAE,MAAM,UAAU,YAAY,CAAC,EAAE;AAEvC,UAAM,YACJ,EAAE,KAAK,QAAQ,mBAAmB,GAAG,EAAE,MAAM,GAAG,EAAE,KAAK;AACzD,YAAQ,IAAI,WAAW,EAAE,IAAI;AAE7B,WAAO;AAAA,MACL,MAAM;AAAA,MACN,MAAM;AAAA,MACN,aAAa,EAAE;AAAA,MACf;AAAA,IACF;AAAA,EACF,CAAC;AAED,QAAM,WAAW,OAAO;AAAA,IACtB,iBAAiB,IAAI,CAAC,MAAM;AAAA,MAC1B,EAAE;AAAA,UACF,iBAAK;AAAA,QACH,aACE,OAAO,EAAE,gBAAgB,WAAW,EAAE,cAAc;AAAA,QACtD,iBAAa,uBAAW,EAAE,WAAsC;AAAA,MAClE,CAAC;AAAA,IACH,CAAC;AAAA,EACH;AAEA,SAAO,EAAE,SAAS,SAAS;AAC7B;AAGA,eAAe,mBACb,OACA,kBACA,QACc;AACd,QAAM,UAAU,IAAI,MAAS,MAAM,MAAM;AACzC,MAAI,MAAM;AACV,QAAM,UAAU,IAAI,MAAM,KAAK,IAAI,kBAAkB,MAAM,MAAM,CAAC,EAC/D,KAAK,CAAC,EACN,IAAI,YAAY;AACf,WAAO,MAAM;AACX,YAAM,UAAU;AAChB,aAAO;AACP,UAAI,WAAW,MAAM,QAAQ;AAC3B;AAAA,MACF;AACA,cAAQ,OAAO,IAAI,MAAM,OAAO,MAAM,OAAO,CAAC;AAAA,IAChD;AAAA,EACF,CAAC;AACH,QAAM,QAAQ,IAAI,OAAO;AACzB,SAAO;AACT;AAGA,eAAe,cACb,UACA,OACA,oBACA,aACA,WAC6C;AAC7C,QAAM,WAAqB,CAAC;AAC5B,QAAM,EAAE,UAAU,OAAO,UAAU,SAAS,IAAI;AAEhD,MAAI;AACF,UAAM,EAAE,SAAS,SAAS,IAAI,WAAW,KAAK;AAE9C,UAAM,kBAAiE,CAAC;AACxE,UAAM,kBAA8C;AAAA,MAClD,oBAAoB,EAAE,cAAc,gBAAgB;AAAA,IACtD;AAEA,UAAM,EAAE,WAAW,aAAa,IAAI,UAAM,yBAAa;AAAA,MACrD;AAAA,MACA;AAAA,MACA,OAAO;AAAA,MACP,YAAY;AAAA,MACZ;AAAA,MACA,GAAI,gBAAgB,SAAY,EAAE,YAAY,IAAI,CAAC;AAAA,MACnD,GAAI,cAAc,SAAY,EAAE,iBAAiB,UAAU,IAAI,CAAC;AAAA,IAClE,CAAC;AAED,UAAM,iBAAiB,gCAAa,CAAC,GAAG,IAAI,CAAC,MAAM;AA1ZvD;AA2ZM,YAAM,WACH,OAA8B,aAA9B,YACA,EAA8B;AACjC,YAAM,gBAAe,aAAQ,IAAI,OAAiB,MAA7B,YAAkC;AACvD,aAAO;AAAA,QACL,UAAU;AAAA,QACV,MAAM;AAAA,QACN,OACG,aAA8B,UAA9B,YACA,EAA8B,SAD9B,YAED,CAAC;AAAA,MACL;AAAA,IACF,CAAC;AAED,aAAS;AAAA,MACP,WAAW,SAAS,EAAE,eAAe,KAAK,UAAU,aAAa,CAAC,kBAAkB,YAAY;AAAA,IAClG;AAEA,UAAM,iBAAiB,mBAAmB,IAAI,SAAS,EAAE;AACzD,QAAI,CAAC,gBAAgB;AACnB,YAAM,IAAI,MAAM,8BAA8B,SAAS,EAAE,EAAE;AAAA,IAC7D;AAEA,UAAM,gBAAgB;AAAA,MACpB;AAAA,MACA,eAAe;AAAA,MACf;AAAA,IACF;AAEA,QAAI,cAAc,OAAO;AACvB,eAAS,KAAK,UAAU,SAAS,EAAE,EAAE;AACrC,aAAO,EAAE,OAAO,MAAM,MAAM,SAAS;AAAA,IACvC;AAEA,aAAS,KAAK,UAAU,SAAS,EAAE,KAAK,cAAc,KAAK,EAAE;AAC7D,WAAO,EAAE,OAAO,OAAO,MAAM,SAAS;AAAA,EACxC,SAAS,GAAY;AACnB,aAAS,KAAK,WAAW,SAAS,EAAE,KAAM,uBAAa,OAAO,EAAE;AAChE,WAAO,EAAE,OAAO,OAAO,MAAM,SAAS;AAAA,EACxC;AACF;AAGA,eAAe,aAAa,UAAkB,cAAsB;AAClE,QAAM,gBAAgB,MAAM,gBAAAC,SAAG;AAAA,IAC7B,kBAAAC,QAAK,KAAK,UAAU,YAAY;AAAA,IAChC;AAAA,EACF;AACA,SAAO,cACJ,MAAML,iBAAgB,EACtB,OAAO,CAAC,SAAS,KAAK,KAAK,EAAE,SAAS,CAAC,EACvC,IAAI,CAAC,SAAS,KAAK,MAAM,IAAI,CAAa;AAC/C;AAEA,eAAe,eAAe,UAAkB,gBAAwB;AACtE,QAAM,cAAc,MAAM,gBAAAI,SAAG;AAAA,IAC3B,kBAAAC,QAAK,KAAK,UAAU,cAAc;AAAA,IAClC;AAAA,EACF;AACA,QAAM,UAA4B,YAC/B,MAAML,iBAAgB,EACtB,OAAO,CAAC,SAAS,KAAK,KAAK,EAAE,SAAS,CAAC,EACvC,IAAI,CAAC,SAAS,KAAK,MAAM,IAAI,CAAC;AACjC,SAAO,IAAI,IAAI,QAAQ,IAAI,CAAC,QAAQ,CAAC,IAAI,IAAI,GAAG,CAAC,CAAC;AACpD;AAEA,SAAS,gBAAgB,QAAkC;AACzD,QAAM,WAAW,QAAQ,IAAI;AAC7B,QAAM,QAAQ,WAAW,OAAO,QAAQ,IAAI;AAE5C,QAAM,iBAAiB,QAAQ,IAAI;AACnC,QAAM,cACJ,kBAAkB,OAAO,SAAS,OAAO,cAAc,CAAC,IACpD,KAAK,IAAI,GAAG,OAAO,cAAc,CAAC,IAClC;AAEN,QAAM,cACJ,QAAO,iCAAQ,iBAAgB,WAAW,OAAO,cAAc;AACjE,QAAM,YACJ,QAAO,iCAAQ,eAAc,WAAW,OAAO,YAAY;AAE7D,SAAO,EAAE,OAAO,aAAa,aAAa,UAAU;AACtD;AAEA,SAAS,iBACP,gBACA,WACiB;AACjB,QAAM,OAAiB,CAAC;AACxB,QAAM,eAAe,eAAe;AAAA,IAClC,CAAC,KAAK,MAAM,OAAO,EAAE,QAAQ,IAAI;AAAA,IACjC;AAAA,EACF;AAEA,aAAW,KAAK,gBAAgB;AAC9B,SAAK,KAAK,GAAG,EAAE,IAAI;AAAA,EACrB;AAEA,MAAI,UAAU,WAAW,GAAG;AAC1B,WAAO;AAAA,MACL,OAAO;AAAA,MACP,SAAS;AAAA,MACT,SAAS,CAAC;AAAA,MACV,MAAM,CAAC,sBAAsB;AAAA,IAC/B;AAAA,EACF;AAEA,QAAM,QAAQ,eAAe,UAAU;AACvC,SAAO;AAAA,IACL;AAAA,IACA,SAAS,QAAQ;AAAA,IACjB,SAAS;AAAA,MACP,eAAe;AAAA,MACf,aAAa,UAAU;AAAA,MACvB,UAAU;AAAA,IACZ;AAAA,IACA;AAAA,EACF;AACF;AAGA,SAAS,gCACP,MACA,aACA,cACA,gBAC0B;AAC1B,SAAO;AAAA,IACL;AAAA,IACA,SAAS;AAAA,IACT;AAAA,IACA,MAAM,IACJ,OACA,QAC0B;AAjiBhC;AAkiBM,YAAM,OAAiB,CAAC;AAExB,UAAI;AACF,cAAM,WAAW,eAAe;AAChC,aAAK,KAAK,0BAA0B,QAAQ,EAAE;AAE9C,YAAI,YAAY,MAAM,aAAa,UAAU,YAAY;AACzD,cAAM,qBAAqB,MAAM;AAAA,UAC/B;AAAA,UACA;AAAA,QACF;AAEA,cAAM,EAAE,OAAO,aAAa,aAAa,UAAU,IACjD,gBAAgB,MAAM;AAExB,YAAI,SAAS,OAAO,SAAS,KAAK,KAAK,QAAQ,GAAG;AAChD,sBAAY,UAAU,MAAM,GAAG,KAAK;AACpC,eAAK,KAAK,iCAAiC,KAAK,EAAE;AAAA,QACpD;AAEA,aAAK;AAAA,UACH,kBAAkB,UAAU,MAAM,gCAAgC,WAAW;AAAA,QAC/E;AAEA,cAAM,iBAAiB,MAAM;AAAA,UAC3B;AAAA,UACA;AAAA,UACA,CAAC,OACC,cAAc,IAAI,OAAO,oBAAoB,aAAa,SAAS;AAAA,QACvE;AAEA,cAAM,SAAS,iBAAiB,gBAAgB,SAAS;AACzD,eAAO,OAAO,CAAC,GAAG,MAAM,IAAI,YAAO,SAAP,YAAe,CAAC,CAAE;AAC9C,eAAO;AAAA,MACT,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;AAQO,IAAM,4BAA4B;AAAA,EACvC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;;;AC9lBA,IAAAM,kBAA+B;AAC/B,IAAAC,oBAAiB;AACjB,IAAAC,aAAiD;AACjD,iBAAoC;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,SAAQ;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,SAAQ;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,SAAQ;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,MAAM,gBAAAC,SAAG;AAAA,MAC1B,kBAAAC,QAAK,KAAK,SAAS,6BAA6B;AAAA,MAChD;AAAA,IACF;AACA,UAAM,gBAAgB,MAAM,gBAAAD,SAAG;AAAA,MAC7B,kBAAAC,QAAK,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;AAjQ5E;AAkQE,QAAM,WAAW,cAAc,EAAE;AAEjC,QAAM,QAAO,aAAQ,WAAR,mBAAgB;AAC7B,QAAM,cAAc,OAAO,SAAS,WAAW,OAAO;AACtD,QAAM,EAAE,KAAK,IAAI,UAAM,yBAAa;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,SAAQ;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,WAAAC,QAAI,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,MAAM,gBAAAF,SAAG;AAAA,MAC1B,kBAAAC,QAAK,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;AA9apB;AA+aE,QAAM,WAAW,cAAc,EAAE;AAEjC,QAAM,QAAO,aAAQ,WAAR,mBAAgB;AAC7B,QAAM,cAAc,OAAO,SAAS,WAAW,OAAO;AACtD,QAAM,EAAE,KAAK,IAAI,UAAM,yBAAa;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,SAAQ;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,WAAAG,QAAI,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;;;ACphBA,wBAA0C;AAC1C,IAAAC,aAAsD;;;ACAtD,IAAM,SAAS;AAAA,EACb,OAAO;AAAA,EACP,MAAM;AAAA,EACN,OAAO;AAAA,EACP,KAAK;AAAA,EACL,QAAQ;AAAA,EACR,MAAM;AAAA,EACN,SAAS;AAAA,EACT,MAAM;AAAA,EACN,OAAO;AACT;AAEA,IAAM,mBAAmB;AACzB,IAAM,aAAa;AACnB,IAAM,aAAa;AAuBnB,SAAS,WAAW,MAAwB;AAC1C,MAAI,CAAC,QAAQ,KAAK,WAAW,GAAG;AAC9B,WAAO;AAAA,EACT;AAEA,SAAO,KACJ,MAAM,GAAG,CAAC,EACV,IAAI,CAAC,SAAS;AACb,QAAI,KAAK,WAAW,GAAG,GAAG;AACxB,aAAO,GAAG,OAAO,GAAG,GAAG,IAAI,GAAG,OAAO,KAAK;AAAA,IAC5C;AACA,QAAI,KAAK,WAAW,GAAG,GAAG;AACxB,aAAO,GAAG,OAAO,KAAK,GAAG,IAAI,GAAG,OAAO,KAAK;AAAA,IAC9C;AACA,QAAI,KAAK,WAAW,IAAI,GAAG;AACzB,aAAO,GAAG,OAAO,IAAI,GAAG,IAAI,GAAG,OAAO,KAAK;AAAA,IAC7C;AACA,WAAO;AAAA,EACT,CAAC,EACA,KAAK,UAAU;AACpB;AAEA,SAAS,cAAc,MAAiC;AACtD,QAAM,WAA4B,CAAC;AAEnC,aAAW,OAAO,MAAM;AACtB,QAAI,CAAC,iBAAiB,KAAK,GAAG,GAAG;AAC/B;AAAA,IACF;AAEA,QAAI;AACF,YAAM,UAAU,IAAI,QAAQ,kBAAkB,EAAE;AAChD,YAAM,SAAS,KAAK,MAAM,OAAO;AACjC,eAAS,KAAK,MAAM;AAAA,IACtB,SAAQ;AAAA,IAER;AAAA,EACF;AAEA,SAAO;AACT;AAEA,SAAS,wBACP,UAC8B;AAC9B,QAAM,SAAS,oBAAI,IAA6B;AAEhD,aAAW,WAAW,UAAU;AAC9B,UAAM,WAAW,QAAQ,YAAY;AACrC,UAAM,WAAW,OAAO,IAAI,QAAQ;AAEpC,QAAI,UAAU;AACZ,eAAS,KAAK,OAAO;AAAA,IACvB,OAAO;AACL,aAAO,IAAI,UAAU,CAAC,OAAO,CAAC;AAAA,IAChC;AAAA,EACF;AAEA,SAAO;AACT;AAEA,SAAS,oBAAoB,SAA8B;AApG3D;AAqGE,UAAQ;AAAA,IACN;AAAA,MAAS,OAAO,GAAG,GAAG,QAAQ,EAAE,GAAG,OAAO,KAAK,KAAK,OAAO,MAAM,GAAG,QAAQ,YAAY,OAAO,GAAG,OAAO,KAAK;AAAA,EAChH;AAEA,MAAI,QAAQ,SAAS;AACnB,YAAQ,IAAI,SAAS,QAAQ,OAAO,EAAE;AAAA,EACxC;AAEA,MAAI,QAAQ,QAAQ,QAAQ,KAAK,SAAS,GAAG;AAC3C,YAAQ,IAAI,SAAS,WAAW,QAAQ,IAAI,CAAC,EAAE;AAAA,EACjD;AAEA,QAAI,aAAQ,YAAR,mBAAiB,mBAAkB,QAAQ,aAAa,iBAAiB;AAC3E,UAAM,OAAO,QAAQ,QAAQ;AAC7B,UAAM,YAAY,KAAK,SAAS,KAAK,GAAG,KAAK,MAAM,GAAG,EAAE,CAAC,QAAQ;AACjE,YAAQ,IAAI,SAAS,OAAO,IAAI,WAAW,SAAS,IAAI,OAAO,KAAK,EAAE;AAAA,EACxE;AACF;AAEA,SAAS,oBAAoB,UAAiC;AAC5D,QAAM,SAAS,wBAAwB,QAAQ;AAC/C,QAAM,SAAS,CAAC,GAAG,OAAO,QAAQ,CAAC,EAAE;AAAA,IACnC,CAAC,GAAG,MAAM,EAAE,CAAC,EAAE,SAAS,EAAE,CAAC,EAAE;AAAA,EAC/B;AAEA,UAAQ,IAAI;AAAA,MAAS,OAAO,IAAI,wBAAwB,OAAO,KAAK,EAAE;AAEtE,aAAW,CAAC,UAAU,gBAAgB,KAAK,QAAQ;AACjD,YAAQ;AAAA,MACN,SAAS,OAAO,MAAM,GAAG,QAAQ,GAAG,OAAO,KAAK,KAAK,iBAAiB,MAAM;AAAA,IAC9E;AAAA,EACF;AAEA,QAAM,YAAY;AAClB,QAAM,QAAQ,SAAS,MAAM,GAAG,SAAS;AAEzC,aAAW,WAAW,OAAO;AAC3B,wBAAoB,OAAO;AAAA,EAC7B;AAEA,MAAI,SAAS,SAAS,WAAW;AAC/B,UAAM,YAAY,SAAS,SAAS;AACpC,UAAM,eAAe,SAAS,MAAM,SAAS,EAAE,IAAI,CAAC,MAAM,EAAE,EAAE;AAC9D,UAAM,YAAY,aAAa,MAAM,GAAG,CAAC,EAAE,KAAK,IAAI;AACpD,UAAM,OAAO,aAAa,SAAS,IAAI,QAAQ;AAC/C,YAAQ;AAAA,MACN;AAAA,MAAS,OAAO,IAAI,IAAI,SAAS,UAAU,SAAS,GAAG,IAAI,GAAG,OAAO,KAAK;AAAA,IAC5E;AAAA,EACF;AACF;AAEA,SAAS,iBAAiB,MAA8B;AACtD,QAAM,UAAwB,CAAC;AAE/B,aAAW,OAAO,MAAM;AACtB,UAAM,YAAY,IAAI,MAAM,UAAU;AACtC,QAAI,WAAW;AACb,cAAQ,KAAK,EAAE,IAAI,UAAU,CAAC,GAAG,QAAQ,KAAK,CAAC;AAC/C;AAAA,IACF;AAEA,UAAM,YAAY,IAAI,MAAM,UAAU;AACtC,QAAI,WAAW;AACb,cAAQ,KAAK;AAAA,QACX,IAAI,UAAU,CAAC;AAAA,QACf,QAAQ;AAAA,QACR,QAAQ,UAAU,CAAC;AAAA,MACrB,CAAC;AAAA,IACH;AAAA,EACF;AAEA,SAAO;AACT;AAEA,SAAS,iBAAiB,aAAiC;AACzD,QAAM,SAAS,YAAY,OAAO,CAAC,MAAM,EAAE,MAAM;AACjD,QAAM,SAAS,YAAY,OAAO,CAAC,MAAM,CAAC,EAAE,MAAM;AAElD,MAAI,OAAO,SAAS,GAAG;AACrB,UAAM,YAAY,OAAO,IAAI,CAAC,MAAM,EAAE,EAAE,EAAE,KAAK,IAAI;AACnD,YAAQ;AAAA,MACN,OAAO,OAAO,KAAK,kBAAa,OAAO,MAAM,KAAK,OAAO,KAAK,IAAI,SAAS;AAAA,IAC7E;AAAA,EACF;AAEA,MAAI,OAAO,SAAS,GAAG;AACrB,YAAQ,IAAI,OAAO,OAAO,GAAG,kBAAa,OAAO,MAAM,KAAK,OAAO,KAAK,EAAE;AAC1E,eAAW,KAAK,QAAQ;AACtB,YAAM,SAAS,EAAE,SACb,KAAK,OAAO,IAAI,GAAG,EAAE,MAAM,GAAG,OAAO,KAAK,KAC1C;AACJ,cAAQ,IAAI,SAAS,OAAO,GAAG,GAAG,EAAE,EAAE,GAAG,OAAO,KAAK,GAAG,MAAM,EAAE;AAAA,IAClE;AAAA,EACF;AACF;AAEA,SAAS,YAAY,QAAgC;AACnD,QAAM,EAAE,OAAO,UAAU,WAAW,QAAQ,gBAAgB,IAAI;AAEhE,QAAM,SAAS,gBAAgB,QAAQ;AACvC,QAAM,QAAQ,gBAAgB,QAAQ;AACtC,QAAM,gBAAgB,gBAAgB,QAAQ,KAAK,QAAQ,CAAC;AAE5D,QAAM,aAAa,gBAAgB,UAAU,WAAM;AACnD,QAAM,cAAc,gBAAgB,UAAU,OAAO,QAAQ,OAAO;AAEpE,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,WAAW,GAAG,UAAU,IAAI,YAAY,IAAI,OAAO,KAAK,KAAK,0BAAU,GAAG,IAAI,wBAAS,GAAG;AAAA,EACnG;AAEA,MAAI,gBAAgB,OAAO;AACzB,YAAQ;AAAA,MACN,OAAO,OAAO,GAAG,UAAU,gBAAgB,MAAM,OAAO,GAAG,OAAO,KAAK;AAAA,IACzE;AAAA,EACF;AAEA,MAAI,gBAAgB,QAAQ,gBAAgB,KAAK,SAAS,GAAG;AAC3D,UAAM,qBAAqB,cAAc,gBAAgB,IAAI;AAC7D,UAAM,cAAc,iBAAiB,gBAAgB,IAAI;AAGzD,QAAI,YAAY,SAAS,GAAG;AAC1B,uBAAiB,WAAW;AAAA,IAC9B;AAGA,QAAI,mBAAmB,SAAS,GAAG;AACjC,0BAAoB,kBAAkB;AAAA,IACxC;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;;;AC/OA,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,qCAClB;AACJ,QAAM,aAAc,iCAChB;AACJ,MAAI,gBAAgB,cAAc,iBAAiB,YAAY;AAC7D,gBAAY;AAAA,MACV,sBAAsB,YAAY,iBAAiB,UAAU;AAAA,IAC/D;AAAA,EACF;AACA,MAAI,MAAM,QAAS,qCAAsC,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,0BAAsC,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;AAlLhE;AAmLE,MAAI,KAAK,WAAW,QAAQ,GAAG;AAC7B,UAAM,IAAI,KAAK,MAAM,aAAa;AAClC,WAAO,uBAAI;AAAA,EACb;AACA,MAAI,KAAK,WAAW,cAAc,GAAG;AACnC,QAAI;AACF,YAAM,SAAS,KAAK,MAAM,KAAK,QAAQ,yBAAyB,EAAE,CAAC;AACnE,aAAO,QAAO,sCAAQ,OAAR,YAAc,EAAE;AAAA,IAChC,SAAQ;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,QAAO,sCAAQ,OAAR,YAAc,EAAE;AAAA,IAChC,SAAQ;AAAA,IAER;AAAA,EACF;AACA;AACF;AAGA,SAAS,kBAAkB,UAA2C;AA/MtE;AAgNE,QAAM,OAAO,oBAAI,IAAsB;AACvC,aAAW,QAAQ,UAAU;AAC3B,UAAM,KAAK,qBAAqB,IAAI;AACpC,UAAM,MAAM,kBAAM;AAClB,UAAM,OAAM,UAAK,IAAI,GAAG,MAAZ,YAAiB,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,iCAAQ,IAAI;AACd,mBAAS,IAAI,OAAO,OAAO,EAAE,CAAC;AAAA,QAChC;AAAA,MACF,SAAQ;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,SAAQ;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,SAAQ;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,uBAAI;AACnB,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;AA7axE;AA8aE,UAAQ,IAAI,+CAAwC;AACpD,aAAW,KAAK,SAAS;AACvB,wBAAoB,CAAC;AACrB,mBAAe,OAAO,QAAQ,EAAE,OAAO,OAAO,CAAC;AAC/C,SAAI,OAAE,OAAO,SAAT,mBAAe,QAAQ;AACzB,wBAAkB,EAAE,OAAO,IAAI;AAAA,IACjC;AAAA,EACF;AACA,UAAQ,IAAI,0CAA0C;AACxD;;;ACrbA,IAAMC,UAAS;AAAA,EACb,OAAO;AAAA,EACP,MAAM;AAAA,EACN,KAAK;AAAA,EACL,OAAO;AAAA,EACP,KAAK;AAAA,EACL,QAAQ;AAAA,EACR,MAAM;AAAA,EACN,SAAS;AAAA,EACT,MAAM;AAAA,EACN,OAAO;AACT;AAEA,IAAMC,oBAAmB;AACzB,IAAM,eAAe;AACrB,IAAM,gBAAgB;AACtB,IAAM,0BAA0B;AAoChC,IAAM,wBAAsD;AAAA,EAC1D,eAAe;AAAA,IACb,OAAO;AAAA,IACP,aAAa;AAAA,IACb,MAAM;AAAA,EACR;AAAA,EACA,eAAe;AAAA,IACb,OAAO;AAAA,IACP,aAAa;AAAA,IACb,MAAM;AAAA,EACR;AAAA,EACA,aAAa;AAAA,IACX,OAAO;AAAA,IACP,aAAa;AAAA,IACb,MAAM;AAAA,EACR;AAAA,EACA,qBAAqB;AAAA,IACnB,OAAO;AAAA,IACP,aAAa;AAAA,IACb,MAAM;AAAA,EACR;AAAA,EACA,sBAAsB;AAAA,IACpB,OAAO;AAAA,IACP,aAAa;AAAA,EACf;AAAA,EACA,gBAAgB;AAAA,IACd,OAAO;AAAA,IACP,aAAa;AAAA,EACf;AAAA,EACA,gBAAgB;AAAA,IACd,OAAO;AAAA,IACP,aAAa;AAAA,EACf;AAAA,EACA,mBAAmB;AAAA,IACjB,OAAO;AAAA,IACP,aAAa;AAAA,EACf;AAAA,EACA,UAAU;AAAA,IACR,OAAO;AAAA,IACP,aAAa;AAAA,IACb,MAAM;AAAA,EACR;AAAA,EACA,OAAO;AAAA,IACL,OAAO;AAAA,IACP,aAAa;AAAA,EACf;AACF;AAEA,SAAS,iBAAiB,MAAiC;AACzD,SAAO,KACJ,OAAO,CAAC,QAAQA,kBAAiB,KAAK,GAAG,CAAC,EAC1C,IAAI,CAAC,QAAQ;AACZ,QAAI;AACF,YAAM,UAAU,IAAI,QAAQA,mBAAkB,EAAE;AAChD,aAAO,KAAK,MAAM,OAAO;AAAA,IAC3B,SAAQ;AACN,aAAO;AAAA,IACT;AAAA,EACF,CAAC,EACA,OAAO,CAAC,WAAoC,WAAW,IAAI;AAChE;AAEA,SAAS,gBACP,UAC4B;AAC5B,QAAM,SAAS,oBAAI,IAA2B;AAE9C,aAAW,WAAW,UAAU;AAC9B,UAAM,WAAW,QAAQ,YAAY;AACrC,UAAM,WAAW,OAAO,IAAI,QAAQ;AAEpC,QAAI,UAAU;AACZ,eAAS,SAAS,KAAK,OAAO;AAAA,IAChC,OAAO;AACL,aAAO,IAAI,UAAU,EAAE,UAAU,CAAC,OAAO,EAAE,CAAC;AAAA,IAC9C;AAAA,EACF;AAEA,SAAO;AACT;AAEA,SAAS,kBAAkB,UAAwC;AACjE,QAAM,aAAa,oBAAI,IAAY;AACnC,aAAW,KAAK,UAAU;AACxB,QAAI,CAAC,EAAE,MAAM;AACX;AAAA,IACF;AACA,eAAW,KAAK,EAAE,MAAM;AACtB,UAAI,EAAE,WAAW,WAAW,GAAG;AAC7B,mBAAW,IAAI,EAAE,QAAQ,aAAa,EAAE,CAAC;AAAA,MAC3C;AAAA,IACF;AAAA,EACF;AACA,SAAO;AACT;AAEA,SAAS,qBAAqB,UAAwC;AAtJtE;AAuJE,QAAM,gBAAgB,oBAAI,IAAY;AACtC,aAAW,KAAK,UAAU;AACxB,SAAI,OAAE,YAAF,mBAAW,eAAe;AAC5B,oBAAc,IAAI,OAAO,EAAE,QAAQ,aAAa,CAAC;AAAA,IACnD;AAAA,EACF;AACA,SAAO;AACT;AAEA,SAAS,eAAe,OAA4B;AAClD,QAAM,EAAE,SAAS,IAAI;AAErB,MAAI,SAAS,SAAS,GAAG;AACvB;AAAA,EACF;AAEA,QAAM,gBAAgB,SAAS,CAAC,EAAE;AAElC,MAAI,kBAAkB,uBAAuB;AAC3C,UAAM,aAAa,kBAAkB,QAAQ;AAC7C,QAAI,WAAW,OAAO,GAAG;AACvB,YAAM,UAAU,oBAAoB,CAAC,GAAG,UAAU,EAAE,KAAK,IAAI,CAAC;AAAA,IAChE;AAAA,EACF;AAEA,MAAI,kBAAkB,iBAAiB;AACrC,UAAM,gBAAgB,qBAAqB,QAAQ;AACnD,QAAI,cAAc,SAAS,GAAG;AAC5B,YAAM,UAAU,sBAAsB,CAAC,GAAG,aAAa,EAAE,CAAC,CAAC;AAAA,IAC7D;AAAA,EACF;AACF;AAEA,SAAS,aAAa,MAAsB;AAC1C,MAAI,KAAK,WAAW,GAAG,GAAG;AACxB,WAAOD,QAAO;AAAA,EAChB;AACA,MAAI,KAAK,WAAW,GAAG,GAAG;AACxB,WAAOA,QAAO;AAAA,EAChB;AACA,MAAI,KAAK,WAAW,IAAI,GAAG;AACzB,WAAOA,QAAO;AAAA,EAChB;AACA,SAAOA,QAAO;AAChB;AAEA,SAAS,gBAAgB,OAAwB;AAC/C,MAAI,MAAM,QAAQ,KAAK,GAAG;AACxB,WAAO,MAAM,KAAK,IAAI;AAAA,EACxB;AACA,SAAO,OAAO,KAAK;AACrB;AAEA,SAAS,oBAAoB,SAA8B;AACzD,MAAI,QAAQ,UAAU;AACpB,UAAM,WAAW,QAAQ,SAAS,aAAa,QAAQ,SAAS;AAChE,QAAI,UAAU;AACZ,cAAQ;AAAA,QACN,OAAOA,QAAO,IAAI,YAAYA,QAAO,KAAK,IAAI,gBAAgB,QAAQ,CAAC;AAAA,MACzE;AAAA,IACF;AAAA,EACF;AAEA,MAAI,QAAQ,QAAQ;AAClB,UAAM,WAAW,QAAQ,OAAO,aAAa,QAAQ,OAAO;AAC5D,QAAI,UAAU;AACZ,YAAM,UAAU,MAAM,QAAQ,QAAQ,KAAK,SAAS,WAAW;AAC/D,YAAM,QAAQ,UAAUA,QAAO,MAAMA,QAAO;AAC5C,YAAM,OAAO,UAAU,WAAW,gBAAgB,QAAQ;AAC1D,cAAQ;AAAA,QACN,OAAOA,QAAO,IAAI,UAAUA,QAAO,KAAK,MAAM,KAAK,GAAG,IAAI,GAAGA,QAAO,KAAK;AAAA,MAC3E;AAAA,IACF;AAAA,EACF;AACF;AAEA,SAAS,UAAU,MAAsB;AACvC,UAAQ,IAAI,OAAOA,QAAO,IAAI,QAAQA,QAAO,KAAK,EAAE;AACpD,aAAW,QAAQ,KAAK,MAAM,GAAG,uBAAuB,GAAG;AACzD,UAAM,YAAY,aAAa,IAAI;AACnC,YAAQ,IAAI,SAAS,SAAS,GAAG,IAAI,GAAGA,QAAO,KAAK,EAAE;AAAA,EACxD;AACF;AAEA,SAAS,oBAAoB,MAAsB;AACjD,QAAM,UAAU,IAAI,aAAa;AACjC,QAAM,WAAW,KAAK,aAAa;AACnC,QAAM,mBAAmB,IAAI;AAAA,IAC3B,GAAG,QAAQ,QAAQ,uBAAuB,MAAM,CAAC,aAAa,SAAS,QAAQ,uBAAuB,MAAM,CAAC;AAAA,IAC7G;AAAA,EACF;AACA,QAAM,qBAAqB,IAAI;AAAA,IAC7B,GAAG,QAAQ,QAAQ,uBAAuB,MAAM,CAAC;AAAA,IACjD;AAAA,EACF;AACA,MAAI,SAAS,KAAK,QAAQ,kBAAkB,EAAE;AAC9C,WAAS,OAAO,QAAQ,oBAAoB,EAAE;AAC9C,SAAO,OAAO,KAAK;AACrB;AAEA,SAAS,iBAAiB,SAAwB,UAAwB;AA3P1E;AA4PE,MAAI,aAAa,iBAAiB;AAChC;AAAA,EACF;AAEA,QAAM,YACJ,aAAQ,YAAR,mBAAiB,0BACjB,aAAQ,YAAR,mBAAiB,mBACjB;AACF,QAAM,cAAc,oBAAoB,OAAO;AAE/C,MAAI,aAAa;AACf,YAAQ;AAAA,MACN,OAAOA,QAAO,IAAI,cAAcA,QAAO,KAAK,KAAKA,QAAO,GAAG,GAAG,WAAW,GAAGA,QAAO,KAAK;AAAA,IAC1F;AAAA,EACF,OAAO;AACL,YAAQ;AAAA,MACN,OAAOA,QAAO,IAAI,cAAcA,QAAO,KAAK,IAAIA,QAAO,GAAG,wCAAwCA,QAAO,KAAK;AAAA,IAChH;AAAA,EACF;AACF;AAEA,SAAS,wBAAwB,UAA2B;AAC1D,SACE,aAAa,0BAA0B,aAAa;AAExD;AAEA,SAAS,mBACP,SACA,UACA,SACM;AACN,UAAQ,IAAI;AAAA,IAAOA,QAAO,IAAI,GAAG,QAAQ,EAAE,GAAGA,QAAO,KAAK,EAAE;AAE5D,QAAM,UAAU,QAAQ,QAAQ,QAAQ,KAAK,SAAS;AACtD,QAAM,oBAAoB,wBAAwB,QAAQ,KAAK;AAE/D,MAAI,mBAAmB;AACrB,cAAU,QAAQ,IAAgB;AAAA,EACpC,OAAO;AACL,wBAAoB,OAAO;AAC3B,QAAI,WAAW,SAAS;AACtB,gBAAU,QAAQ,IAAgB;AAAA,IACpC;AAAA,EACF;AAEA,mBAAiB,SAAS,QAAQ;AACpC;AAEA,IAAM,sBAAsB;AAE5B,SAAS,kBAAkB,UAAiC;AAC1D,QAAM,eAAe,SAAS,MAAM,mBAAmB,EAAE,IAAI,CAAC,MAAM,EAAE,EAAE;AACxE,QAAM,SAAS,aAAa,IAAI,CAAC,OAAO;AACtC,UAAM,QAAQ,GAAG,MAAM,YAAY;AACnC,WAAO,QAAQ,MAAM,CAAC,IAAI;AAAA,EAC5B,CAAC;AACD,UAAQ;AAAA,IACN;AAAA,IAAOA,QAAO,GAAG,IAAI,SAAS,SAAS,mBAAmB,UAAU,OAAO,KAAK,IAAI,CAAC,GAAGA,QAAO,KAAK;AAAA,EACtG;AACF;AAEA,SAAS,oBAAoB,MAAoB,OAAqB;AACpE,UAAQ;AAAA,IACN;AAAA,EAAKA,QAAO,IAAI,kCAAS,KAAK,KAAK,KAAK,KAAK,mCAAUA,QAAO,KAAK;AAAA,EACrE;AACA,UAAQ,IAAI,GAAGA,QAAO,GAAG,GAAG,KAAK,WAAW,GAAGA,QAAO,KAAK,EAAE;AAC/D;AAEA,SAAS,qBACP,UACA,OACA,SACM;AACN,QAAM,OAAO,sBAAsB,QAAQ,KAAK,sBAAsB;AACtE,QAAM,EAAE,SAAS,IAAI;AAErB,sBAAoB,MAAM,SAAS,MAAM;AAEzC,MAAI,MAAM,SAAS;AACjB,YAAQ,IAAI,GAAGA,QAAO,MAAM,YAAY,MAAM,OAAO,GAAGA,QAAO,KAAK,EAAE;AAAA,EACxE;AAEA,MAAI,KAAK,MAAM;AACb,YAAQ,IAAI,GAAGA,QAAO,OAAO,SAAS,KAAK,IAAI,GAAGA,QAAO,KAAK,EAAE;AAAA,EAClE;AAEA,QAAM,gBAAgB,UAAU,WAAW,SAAS,MAAM,GAAG,CAAC;AAE9D,aAAW,WAAW,eAAe;AACnC,uBAAmB,SAAS,UAAU,OAAO;AAAA,EAC/C;AAEA,MAAI,CAAC,WAAW,SAAS,SAAS,GAAG;AACnC,sBAAkB,QAAQ;AAAA,EAC5B;AACF;AAEA,SAAS,kBAAkB,QAAgC;AACzD,QAAM,EAAE,OAAO,UAAU,WAAW,QAAQ,gBAAgB,IAAI;AAEhE,QAAM,SAAS,gBAAgB,QAAQ;AACvC,QAAM,QAAQ,gBAAgB,QAAQ;AACtC,QAAM,gBAAgB,gBAAgB,QAAQ,KAAK,QAAQ,CAAC;AAE5D,QAAM,aAAa,gBAAgB,UAAU,WAAM;AACnD,QAAM,cAAc,gBAAgB,UAAUA,QAAO,QAAQA,QAAO;AAEpE,QAAM,YAAY,GAAGA,QAAO,IAAI,GAAG,KAAK,GAAGA,QAAO,KAAK,GAAG,WAAW,IAAIA,QAAO,GAAG,IAAI,QAAQ,IAAIA,QAAO,KAAK,KAAK,EAAE;AACtH,QAAM,gBAAgB,GAAGA,QAAO,OAAO,GAAG,SAAS,GAAGA,QAAO,KAAK;AAClE,QAAM,YAAY,GAAG,WAAW,GAAG,UAAU,IAAI,YAAY,IAAIA,QAAO,KAAK,KAAK,0BAAU,GAAG,IAAI,wBAAS,GAAG;AAE/G,UAAQ;AAAA,IACN;AAAA,EAAKA,QAAO,IAAI,6UAA0DA,QAAO,KAAK;AAAA,EACxF;AACA,UAAQ,IAAI,GAAG,SAAS,WAAM,aAAa,WAAM,SAAS,EAAE;AAC9D;AAEA,SAAS,mBAAmB,QAA0B,SAAwB;AAC5E,QAAM,EAAE,QAAQ,gBAAgB,IAAI;AAEpC,oBAAkB,MAAM;AAExB,MAAI,CAAC,gBAAgB,QAAQ,gBAAgB,KAAK,WAAW,GAAG;AAC9D;AAAA,EACF;AAEA,QAAM,WAAW,iBAAiB,gBAAgB,IAAI;AAEtD,MAAI,SAAS,WAAW,GAAG;AACzB,QAAI,CAAC,gBAAgB,SAAS;AAC5B,cAAQ;AAAA,QACN,GAAGA,QAAO,MAAM,uCAAuCA,QAAO,KAAK;AAAA,MACrE;AAAA,IACF;AACA;AAAA,EACF;AAEA,QAAM,SAAS,gBAAgB,QAAQ;AAEvC,aAAW,SAAS,OAAO,OAAO,GAAG;AACnC,mBAAe,KAAK;AAAA,EACtB;AAEA,QAAM,mBAAmB,CAAC,GAAG,OAAO,QAAQ,CAAC,EAAE;AAAA,IAC7C,CAAC,GAAG,MAAM,EAAE,CAAC,EAAE,SAAS,SAAS,EAAE,CAAC,EAAE,SAAS;AAAA,EACjD;AAEA,aAAW,CAAC,KAAK,KAAK,KAAK,kBAAkB;AAC3C,yBAAqB,KAAK,OAAO,OAAO;AAAA,EAC1C;AACF;AAEO,SAAS,uBAAuB,SAAmC;AACxE,QAAM,UAAU,QAAQ,IAAI,YAAY;AAExC,UAAQ,IAAI;AAAA,EAAKA,QAAO,IAAI,8BAA8BA,QAAO,KAAK,EAAE;AACxE,UAAQ,IAAI,GAAGA,QAAO,GAAG,oCAAoCA,QAAO,KAAK,EAAE;AAE3E,aAAW,UAAU,SAAS;AAC5B,uBAAmB,QAAQ,OAAO;AAAA,EACpC;AAEA,UAAQ;AAAA,IACN;AAAA,EAAKA,QAAO,IAAI,6UAA0DA,QAAO,KAAK;AAAA;AAAA,EACxF;AACF;;;AChaO,SAAS,aAAa,SAAmC;AAG9D,QAAM,sBAAsB,QAAQ,IAAI,CAAC,MAAG;AAL9C;AAKkD;AAAA,MAC9C,GAAG;AAAA,MACH,QAAQ;AAAA,QACN,GAAG,EAAE;AAAA,QACL,QAAO,OAAE,OAAO,UAAT,mBAAgB;AAAA,MACzB;AAAA,IACF;AAAA,GAAE;AACF,UAAQ,IAAI,KAAK,UAAU,qBAAqB,MAAM,CAAC,CAAC;AAC1D;;;ACNO,IAAM,YAGT;AAAA,EACF,SAAS;AAAA,EACT,MAAM;AAAA,EACN,iBAAiB;AAAA,EACjB,mBAAmB;AACrB;;;ALGA,SAAS,cAAc,OAAsC;AAC3D,MAAI,OAAO,UAAU,YAAY,UAAU,MAAM;AAC/C,WAAO;AAAA,EACT;AACA,QAAM,MAAM;AACZ,MAAI,EAAE,WAAW,MAAM;AACrB,WAAO;AAAA,EACT;AACA,QAAM,QAAQ,IAAI;AAClB,MAAI,OAAO,UAAU,YAAY,UAAU,MAAM;AAC/C,WAAO;AAAA,EACT;AACA,SAAO,aAAc;AACvB;AAEA,SAAS,gBAAgB,OAAwC;AAC/D,MAAI,OAAO,UAAU,YAAY,UAAU,MAAM;AAC/C,WAAO;AAAA,EACT;AACA,QAAM,MAAM;AACZ,SAAO,aAAa,OAAO,OAAO,IAAI,YAAY;AACpD;AAEA,SAAS,0BACP,OAIA;AACA,MAAI,cAAc,KAAK,GAAG;AACxB,WAAO,CAAC,MAAM,OAAO,MAAM,UAAU;AAAA,EACvC;AACA,SAAO,CAAC,OAAO,MAAS;AAC1B;AAEA,SAAS,gBAAgB,QAAiD;AACxE,QAAM,UAAwB,CAAC;AAE/B,MAAI,MAAM,QAAQ,MAAM,GAAG;AACzB,eAAW,KAAK,QAAQ;AACtB,YAAM,CAAC,OAAO,UAAU,IAAI,0BAA0B,CAAC;AACvD,cAAQ,KAAK,CAAC,QAAW,OAAO,UAAU,CAAC;AAAA,IAC7C;AAAA,EACF,WAAW,cAAc,MAAM,GAAG;AAChC,YAAQ,KAAK,CAAC,QAAW,OAAO,OAAO,OAAO,UAAU,CAAC;AAAA,EAC3D,WAAW,gBAAgB,MAAM,GAAG;AAClC,YAAQ,KAAK,CAAC,QAAW,QAAQ,MAAS,CAAC;AAAA,EAC7C,OAAO;AACL,eAAW,CAAC,KAAK,CAAC,KAAK,OAAO,QAAQ,MAAM,GAAG;AAC7C,YAAM,CAAC,OAAO,UAAU,IAAI,0BAA0B,CAAC;AACvD,cAAQ,KAAK,CAAC,KAAK,OAAO,UAAU,CAAC;AAAA,IACvC;AAAA,EACF;AAEA,SAAO;AACT;AAEA,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;AAEA,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,SAAS,oBACP,WACA,gBAIA,cACe;AA7GjB;AA8GE,QAAM,gBAAe,6CAAc,aAAY;AAE/C,MAAI,EAAE,gBAAgB,iBAAiB;AACrC,WAAO;AAAA,EACT;AAEA,QAAM,kBAAkB,mBACpB,6CAA0B;AAAA,IACxB,WAAU,kBAAa,aAAb,YAAyB;AAAA,IACnC,SAAS;AAAA,IACT,QAAO,kBAAa,UAAb,YAAsB;AAAA,EAC/B,CAAC,IACD;AAEJ,QAAM,cAA2C,CAAC;AAKlD,MAAI,gBAAgB;AAClB,QAAI,MAAM,QAAQ,cAAc,GAAG;AACjC,kBAAY,KAAK,GAAG,cAAc;AAAA,IACpC,OAAO;AACL,kBAAY,KAAK,cAAc;AAAA,IACjC;AAAA,EACF;AAEA,MAAI,iBAAiB;AACnB,gBAAY,KAAK,eAAe;AAAA,EAClC;AAEA,MAAI,YAAY,WAAW,GAAG;AAC5B,WAAO;AAAA,EACT;AAEA,aAAO,8BAAkB;AAAA;AAAA,IAEvB,OAAO;AAAA,IACP,YAAY,YAAY,WAAW,IAAI,YAAY,CAAC,IAAI;AAAA,EAC1D,CAAC;AACH;AAEA,eAAe,mBACb,OACA,WACA,UACA,QAC2B;AAC3B,QAAM,UACJ,OAAO,UAAU,YACjB,UAAU,QACV,aAAa,SACb,OAAO,MAAM,YAAY,WACrB,MAAM,UACN;AAEN,QAAM,SAAS,IAAI,OAAO,IAAI,WAAW,KAAK,QAAQ,MAAM,EAAE,IAAI,UAAU,IAAI;AAEhF,MAAI;AAEF,QAAI,QAAQ,OAAO,OAAO;AACxB,cAAQ,OAAO,MAAM,GAAG,MAAM,OAAO;AAAA,IACvC,OAAO;AACL,cAAQ,IAAI,GAAG,MAAM,OAAO;AAAA,IAC9B;AACA,UAAM,SAAS,MAAM,UAAU,IAAI,OAAO,MAAM;AAChD,UAAM,eAAe,OAAO,MAAM,QAAQ,CAAC;AAC3C,QAAI,QAAQ,OAAO,OAAO;AACxB,cAAQ,OAAO,MAAM,KAAK,MAAM,iBAAiB,YAAY;AAAA,CAAI;AAAA,IACnE,OAAO;AACL,cAAQ,IAAI,GAAG,MAAM,iBAAiB,YAAY,EAAE;AAAA,IACtD;AACA,WAAO;AAAA,MACL,OAAO;AAAA,MACP;AAAA,MACA,WAAW,UAAU;AAAA,MACrB;AAAA,IACF;AAAA,EACF,SAAS,OAAO;AACd,QAAI,QAAQ,OAAO,OAAO;AACxB,cAAQ,OAAO,MAAM,KAAK,MAAM;AAAA,CAAuB;AAAA,IACzD,OAAO;AACL,cAAQ,IAAI,GAAG,MAAM,qBAAqB;AAAA,IAC5C;AACA,YAAQ,MAAM,KAAK;AACnB,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;AAEA,eAAsB,SACpB,SAC6B;AAC7B,QAAM;AAAA,IACJ;AAAA,IACA;AAAA,IACA,WAAW;AAAA,IACX;AAAA,IACA;AAAA,IACA;AAAA,EACF,IAAI;AAEJ,QAAM,eAAe,gBAAgB,MAAM;AAC3C,QAAM,SAAS,YAAY,aAAa,SAAS;AACjD,QAAM,aAAiC,CAAC;AAExC,aAAW,CAAC,UAAU,WAAW,cAAc,KAAK,cAAc;AAChE,UAAM,iBAAiB;AAAA,MACrB;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAEA,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":["import_node_fs","import_node_path","path","fs","require","fs","path","fixSchemaType","fixSchema","sanitizeName","buildTransformedTools","getSanitizedName","parseToolArgs","restoreToolCalls","_a","buildToolsMap","runSingleCase","mapWithConcurrency","import_node_fs","import_node_path","import_ai","path","DEFAULT_STATE","DEFAULT_STATE","DEFAULT_STATE","SeededRandom","DEFAULT_STATE","DEFAULT_STATE","SeededRandom","WHITESPACE_REGEX","normalizeObject","LINE_SPLIT_REGEX","NUMERIC_STRING_REGEX","e","fs","path","runSingleCase","mapWithConcurrency","import_node_fs","import_node_path","import_ai","LINE_SPLIT_REGEX","standardizeString","valuesMatch","fixSchema","fs","path","import_node_fs","import_node_path","import_ai","LINE_SPLIT_REGEX","fs","path","Ajv","import_ai","colors","colors","DEBUG_FAIL_REGEX"]}
|