@ninjaxtools/slopdex 0.19.0 → 0.21.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/.gitignore +2 -0
- package/README.md +154 -46
- package/binary-install.js +348 -0
- package/binary.js +124 -0
- package/install.js +4 -0
- package/npm-shrinkwrap.json +52 -0
- package/package.json +78 -61
- package/run-slopdex.js +4 -0
- package/dist/chunk-5BO2LLXC.js +0 -15
- package/dist/chunk-5BO2LLXC.js.map +0 -1
- package/dist/chunk-BXWO2KMC.js +0 -20
- package/dist/chunk-BXWO2KMC.js.map +0 -1
- package/dist/chunk-DKRB2XT5.js +0 -33
- package/dist/chunk-DKRB2XT5.js.map +0 -1
- package/dist/chunk-DTI7SXGL.js +0 -109
- package/dist/chunk-DTI7SXGL.js.map +0 -1
- package/dist/chunk-GBEJHETS.js +0 -1117
- package/dist/chunk-GBEJHETS.js.map +0 -1
- package/dist/chunk-HMKVMRLF.js +0 -2221
- package/dist/chunk-HMKVMRLF.js.map +0 -1
- package/dist/chunk-IQU3YVZ3.js +0 -85
- package/dist/chunk-IQU3YVZ3.js.map +0 -1
- package/dist/chunk-JAVPHCZH.js +0 -24
- package/dist/chunk-JAVPHCZH.js.map +0 -1
- package/dist/chunk-MKUTTXZB.js +0 -74
- package/dist/chunk-MKUTTXZB.js.map +0 -1
- package/dist/chunk-OIKBO3NJ.js +0 -133
- package/dist/chunk-OIKBO3NJ.js.map +0 -1
- package/dist/chunk-P57ZJREE.js +0 -426
- package/dist/chunk-P57ZJREE.js.map +0 -1
- package/dist/chunk-S225GYCL.js +0 -79
- package/dist/chunk-S225GYCL.js.map +0 -1
- package/dist/chunk-TSURHRFF.js +0 -240
- package/dist/chunk-TSURHRFF.js.map +0 -1
- package/dist/chunk-VH5VGRCI.js +0 -103
- package/dist/chunk-VH5VGRCI.js.map +0 -1
- package/dist/cli.d.ts +0 -1
- package/dist/cli.js +0 -1130
- package/dist/cli.js.map +0 -1
- package/dist/code-index-MWSJKV3G.js +0 -14
- package/dist/code-index-MWSJKV3G.js.map +0 -1
- package/dist/cross-search-ERBFC25T.js +0 -10
- package/dist/cross-search-ERBFC25T.js.map +0 -1
- package/dist/database-P5XWJWQL.js +0 -14
- package/dist/database-P5XWJWQL.js.map +0 -1
- package/dist/hosted-GHIUHKOU.js +0 -13
- package/dist/hosted-GHIUHKOU.js.map +0 -1
- package/dist/index.d.ts +0 -681
- package/dist/index.js +0 -102
- package/dist/index.js.map +0 -1
- package/dist/jina-43RL7C6M.js +0 -12
- package/dist/jina-43RL7C6M.js.map +0 -1
- package/dist/openai-CYUPNBGB.js +0 -12
- package/dist/openai-CYUPNBGB.js.map +0 -1
- package/dist/openai-EC6THXKV.js +0 -21
- package/dist/openai-EC6THXKV.js.map +0 -1
- package/dist/openai-TCRXM66O.js +0 -11
- package/dist/openai-TCRXM66O.js.map +0 -1
- package/docs/implementation.md +0 -162
- package/docs/reference.md +0 -187
package/dist/cli.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/cli.ts","../src/format.ts"],"sourcesContent":["#!/usr/bin/env node\n\nimport { existsSync, mkdirSync, readFileSync, renameSync, rmSync, writeFileSync } from \"node:fs\";\nimport path from \"node:path\";\nimport { DatabaseSync } from \"node:sqlite\";\nimport { parseArgs } from \"node:util\";\n\nimport { CodeIndexError, GitUnavailableError, IncompatibleIndexError } from \"./errors.js\";\nimport { formatSimilarityClusters, formatSimilaritySummary } from \"./format.js\";\nimport { clearProgress, TerminalProgress } from \"./progress.js\";\nimport { compileNameRegex, DEFAULT_PARALLELISM } from \"./utils.js\";\nimport type { CodeIndex } from \"./code-index.js\";\nimport type { DescriptionProviderName } from \"./descriptions/openai.js\";\nimport type {\n CodeIndexOptions,\n CrossSearchOptions,\n CrossSearchResult,\n CrossSearchSourceFilter,\n EmbeddingProvider,\n IndexedFunction,\n SimilarityResult,\n Reranker,\n DescriptionProfile,\n UpdateStats,\n} from \"./types.js\";\n\n// Lightweight copies kept in sync with src/descriptions/openai.ts so --help,\n// --version, and config validation do not need to load the heavy `ai` SDK.\nconst DESCRIPTION_PROVIDER_NAMES = [\"openai\", \"opencode\", \"opencode-go\"] as const;\n\nfunction isDescriptionProviderName(value: string): value is DescriptionProviderName {\n return (DESCRIPTION_PROVIDER_NAMES as readonly string[]).includes(value);\n}\n\ndeclare const __SLOPDEX_VERSION__: string;\n\ninterface FileConfig {\n provider?: \"openai\" | \"jina\";\n model?: string;\n dimensions?: number;\n indexPath?: string;\n include?: string[];\n exclude?: string[];\n maxFileSize?: number;\n embeddingBatchSize?: number;\n parallelism?: number;\n descriptionProvider?: DescriptionProviderName;\n descriptionModel?: string;\n descriptionsEnabled?: boolean;\n rerankerProvider?: \"cohere\" | \"jina\" | \"openai\";\n rerankerModel?: string;\n rerankerCandidates?: number;\n rerankingEnabled?: boolean;\n verbose?: boolean;\n}\n\ntype OpenCodeDescriptionProvider = Exclude<DescriptionProviderName, \"openai\">;\n\ninterface PublishedModel {\n provider: OpenCodeDescriptionProvider;\n model: string;\n}\n\ninterface DescriptionRefreshHooks {\n beforeRefresh?: (index: CodeIndex) => void | Promise<void>;\n afterRefresh?: (index: CodeIndex) => void | Promise<void>;\n}\n\nconst parsed = (() => {\n try {\n return parseArgs({\n args: process.argv.slice(2),\n allowPositionals: true,\n strict: true,\n options: {\n root: { type: \"string\", default: process.cwd() },\n config: { type: \"string\" },\n index: { type: \"string\" },\n provider: { type: \"string\" },\n model: { type: \"string\" },\n \"description-provider\": { type: \"string\" },\n \"description-model\": { type: \"string\" },\n \"reranker-candidates\": { type: \"string\" },\n dimensions: { type: \"string\" },\n target: { type: \"string\" },\n \"target-root\": { type: \"string\" },\n \"target-index\": { type: \"string\" },\n \"target-config\": { type: \"string\" },\n \"changed-since\": { type: \"string\" },\n uncommitted: { type: \"boolean\", default: false },\n \"source-path\": { type: \"string\" },\n \"min-lines\": { type: \"string\" },\n regex: { type: \"string\" },\n regexp: { type: \"string\", short: \"e\" },\n limit: { type: \"string\" },\n matches: { type: \"string\" },\n threshold: { type: \"string\" },\n format: { type: \"string\" },\n cohesion: { type: \"boolean\", default: false },\n \"include-symmetric-duplicates\": { type: \"boolean\", default: false },\n \"cross-file-only\": { type: \"boolean\", default: false },\n \"rebuild-on-divergence\": { type: \"boolean\", default: false },\n \"force-reindex\": { type: \"boolean\", default: false },\n \"no-reindex\": { type: \"boolean\", default: false },\n callables: { type: \"boolean\", default: false },\n \"ignore-errors\": { type: \"boolean\", default: false },\n verbose: { type: \"boolean\", default: false },\n version: { type: \"boolean\", default: false },\n help: { type: \"boolean\", short: \"h\", default: false },\n },\n });\n } catch (error) {\n process.stderr.write(`slopdex: ${error instanceof Error ? error.message : String(error)}\\n`);\n process.exit(2);\n }\n})();\n\nconst [command, ...positionals] = parsed.positionals;\nconst descriptionsAction = command === \"descriptions\" ? positionals[0] : undefined;\n\nif (parsed.values.version) {\n const version = typeof __SLOPDEX_VERSION__ === \"string\"\n ? __SLOPDEX_VERSION__\n : (JSON.parse(readFileSync(new URL(\"../package.json\", import.meta.url), \"utf8\")) as { version: string }).version;\n process.stdout.write(`${version}\\n`);\n process.exit(0);\n}\n\nif (parsed.values.help || !command) {\n printHelp();\n process.exit(parsed.values.help ? 0 : 1);\n}\n\n// Read persisted diagnostics at exit so failed and update/delete commands report\n// the final state rather than stale errors. Registered after the --help early\n// exit, and uses only node:sqlite directly so --help never loads the heavy\n// index/provider graph (ai SDK, tree-sitter, sqlite-vec).\nconst diagnosticIndexes = new Set<string>();\nfunction readErrorCountsLight(indexPath: string): { errors: number; files: number } {\n const database = new DatabaseSync(indexPath, { readOnly: true });\n try {\n if (!database.prepare(\"SELECT 1 FROM sqlite_master WHERE type = 'table' AND name = 'indexing_errors'\").get()) {\n return { errors: 0, files: 0 };\n }\n const counts = database.prepare(\"SELECT COUNT(*) AS errors, COUNT(DISTINCT path) AS files FROM indexing_errors\").get() as { errors: number; files: number };\n return { errors: Number(counts.errors), files: Number(counts.files) };\n } finally {\n database.close();\n }\n}\nprocess.on(\"exit\", () => {\n if (parsed.values[\"ignore-errors\"]) return;\n try {\n const rootDir = path.resolve(parsed.values.root!);\n const config = loadConfig(rootDir, parsed.values.config);\n diagnosticIndexes.add(path.resolve(parsed.values.index ?? config.indexPath ?? path.join(rootDir, \".slopdex/index.sqlite\")));\n if (parsed.values[\"target-index\"]) diagnosticIndexes.add(path.resolve(parsed.values[\"target-index\"]));\n } catch {\n // Invalid configuration is reported by main; diagnostics must not mask it.\n }\n for (const indexPath of diagnosticIndexes) {\n try {\n if (!existsSync(indexPath)) continue;\n const { errors, files } = readErrorCountsLight(indexPath);\n if (errors === 0) continue;\n process.stderr.write(`slopdex: warning: ${errors} unresolved indexing error(s) in ${files} file(s); run slopdex index-errors --index ${JSON.stringify(indexPath)} to inspect, or use --ignore-errors to silence this warning.\\n`);\n } catch {\n // Opening an invalid index is handled by the command's normal error path.\n }\n }\n});\n\nvoid main().catch((error: unknown) => {\n clearProgress();\n const message = error instanceof Error ? error.message : String(error);\n process.stderr.write(`slopdex: ${message}\\n`);\n process.exitCode = error instanceof CodeIndexError ? 2 : 1;\n});\n\nasync function main(): Promise<void> {\n validateInvocation();\n const rootDir = path.resolve(parsed.values.root!);\n if (command === \"models\") {\n await runModels();\n return;\n }\n if (command === \"config\") {\n await runConfig(rootDir);\n return;\n }\n const config = loadConfig(rootDir, parsed.values.config);\n if (command === \"index-errors\") {\n const indexPath = path.resolve(parsed.values.index ?? config.indexPath ?? path.join(rootDir, \".slopdex/index.sqlite\"));\n const { readIndexErrors } = await import(\"./storage/database.js\");\n const errors = existsSync(indexPath) ? readIndexErrors(indexPath) : [];\n if (outputFormat(\"summary\") === \"summary\") {\n process.stdout.write(errors.length === 0 ? \"No indexing errors.\\n\" : `${errors.map((error) =>\n `${error.path}${error.startLine === null ? \"\" : `:${error.startLine}:${error.startColumn}`} ${error.qualifiedName ? `:: ${error.qualifiedName} ` : \"\"}[${error.code}]\\n ${error.message}`,\n ).join(\"\\n\")}\\n`);\n } else printJson(errors);\n return;\n }\n const provider = await createProvider(config);\n const reranker = command === \"search\" || command === \"search-description\" ? await createReranker(config) : undefined;\n const descriptionProvider = await createDescriptionProvider(config);\n const progress = new TerminalProgress();\n const indexOptions: CodeIndexOptions = {\n rootDir,\n provider,\n parallelism: config.parallelism ?? DEFAULT_PARALLELISM,\n onProgress: (value) => progress.update(value),\n ...(reranker ? { reranker } : {}),\n ...(descriptionProvider ? { descriptionProvider } : {}),\n onWarning: () => {}, // Persisted diagnostics are reported once per index at exit.\n ...(parsed.values.index || config.indexPath ? { indexPath: parsed.values.index ?? config.indexPath } : {}),\n ...(config.include ? { include: config.include } : {}),\n ...(config.exclude ? { exclude: config.exclude } : {}),\n ...(config.maxFileSize ? { maxFileSize: config.maxFileSize } : {}),\n ...(config.embeddingBatchSize ? { embeddingBatchSize: config.embeddingBatchSize } : {}),\n ...(config.verbose ? { verbose: true } : {}),\n };\n const updateTarget = command === \"update-git\" ? parsed.values.target ?? \"HEAD\" : \"HEAD\";\n const updateStats = await ensureIndexUpdated(\n indexOptions,\n \"index\",\n updateTarget,\n parsed.values[\"rebuild-on-divergence\"],\n parsed.values[\"force-reindex\"],\n parsed.values[\"no-reindex\"],\n descriptionRefresh(config),\n );\n const { CodeIndex } = await import(\"./code-index.js\");\n const index = new CodeIndex(indexOptions);\n try {\n switch (command) {\n case \"status\":\n printJson(index.status());\n break;\n case \"update-files\":\n if (positionals.length === 0) throw new CodeIndexError(\"update-files requires at least one path.\");\n printJson(await index.updateFiles({ upsert: positionals }));\n break;\n case \"delete-files\":\n if (positionals.length === 0) throw new CodeIndexError(\"delete-files requires at least one path.\");\n printJson(await index.updateFiles({ delete: positionals }));\n break;\n case \"update-git\": {\n printJson(updateStats);\n break;\n }\n case \"reindex-files\":\n printJson(await index.reindexFiles({ includeCallables: parsed.values.callables }));\n break;\n case \"descriptions\":\n printJson(descriptionsAction === \"enable\" ? await index.useDescriptions() : index.disableDescriptions());\n break;\n case \"search\":\n case \"search-description\": {\n const query = positionals.join(\" \").trim();\n if (!query) throw new CodeIndexError(`${command} requires a query.`);\n const threshold = similarityThreshold();\n const nameRegex = qualifiedNameRegex();\n const results = await (command === \"search-description\" ? index.searchDescription.bind(index) : index.similaritySearch.bind(index))({\n query,\n ...(nameRegex !== undefined ? { nameRegex } : {}),\n ...(parsed.values.limit === undefined ? {} : { limit: positiveIntegerOption(parsed.values.limit, 1, \"limit\") }),\n minSimilarity: threshold.min,\n ...(threshold.max !== undefined ? { maxSimilarity: threshold.max } : {}),\n });\n const format = outputFormat(\"summary\");\n if (format === \"clusters\") throw new CodeIndexError(\"clusters format is only available for cross-search.\");\n if (format === \"summary\") {\n process.stdout.write(`${command === \"search-description\"\n ? results.map((match) => `${formatSimilaritySummary([match])}\\n ${match.function.description}`).join(\"\\n\")\n : formatSimilaritySummary(results)}\\n`);\n } else printJson(results.map(presentMatch));\n break;\n }\n case \"cross-search\":\n await runCrossSearch(index, indexOptions, provider);\n break;\n default:\n throw new CodeIndexError(`Unknown command: ${command}`);\n }\n } finally {\n index.close();\n }\n}\n\nasync function runCrossSearch(\n source: CodeIndex,\n sourceOptions: CodeIndexOptions,\n provider: EmbeddingProvider,\n): Promise<void> {\n const targetRoot = parsed.values[\"target-root\"];\n const targetPath = parsed.values[\"target-index\"];\n if ((targetRoot && !targetPath) || (!targetRoot && targetPath)) {\n throw new CodeIndexError(\"Cross-index search requires both --target-root and --target-index.\");\n }\n const targetRootDir = targetRoot ? path.resolve(targetRoot) : undefined;\n const resolvedTargetPath = targetPath ? path.resolve(targetPath) : undefined;\n const usesSourceAsTarget = targetRootDir === source.rootDir && resolvedTargetPath === source.indexPath;\n const targetConfig = targetRootDir && !usesSourceAsTarget\n ? loadConfig(targetRootDir, parsed.values[\"target-config\"])\n : undefined;\n const targetDescriptionProvider = targetConfig ? await createDescriptionProvider(targetConfig) : undefined;\n const targetOptions: CodeIndexOptions | undefined = targetRootDir && resolvedTargetPath && !usesSourceAsTarget ? {\n rootDir: targetRootDir,\n indexPath: resolvedTargetPath,\n provider,\n ...(sourceOptions.parallelism !== undefined ? { parallelism: sourceOptions.parallelism } : {}),\n ...(sourceOptions.onProgress ? { onProgress: sourceOptions.onProgress } : {}),\n ...(sourceOptions.onWarning ? { onWarning: sourceOptions.onWarning } : {}),\n ...(targetConfig?.include ? { include: targetConfig.include } : {}),\n ...(targetConfig?.exclude ? { exclude: targetConfig.exclude } : {}),\n ...(targetConfig?.maxFileSize ? { maxFileSize: targetConfig.maxFileSize } : {}),\n ...(targetConfig?.embeddingBatchSize ? { embeddingBatchSize: targetConfig.embeddingBatchSize } : {}),\n ...(targetConfig?.verbose ? { verbose: true } : {}),\n ...(targetDescriptionProvider ? { descriptionProvider: targetDescriptionProvider } : {}),\n } : undefined;\n if (targetOptions) {\n await ensureIndexUpdated(\n targetOptions,\n \"target index\",\n \"HEAD\",\n parsed.values[\"rebuild-on-divergence\"],\n parsed.values[\"force-reindex\"],\n parsed.values[\"no-reindex\"],\n descriptionRefresh(targetConfig!),\n );\n }\n const { CodeIndex: CodeIndexClass } = await import(\"./code-index.js\");\n const { crossSearch } = await import(\"./search/cross-search.js\");\n const target = targetOptions ? new CodeIndexClass({ ...targetOptions, readOnly: true }) : undefined;\n const format = outputFormat(parsed.values.cohesion ? \"summary\" : \"clusters\");\n const threshold = similarityThreshold();\n const indexProgress = sourceOptions.onProgress;\n const outputLimit = parsed.values.limit === undefined\n ? undefined\n : positiveIntegerOption(parsed.values.limit, 1, \"limit\");\n const searchOptions: CrossSearchOptions = {\n source,\n ...(target ? { target } : {}),\n sourceFilter: crossSearchSourceFilter(),\n limitPerFunction: positiveIntegerOption(parsed.values.matches, 5, \"matches\"),\n minSimilarity: threshold.min,\n ...(threshold.max !== undefined ? { maxSimilarity: threshold.max } : {}),\n includeSymmetricDuplicates: parsed.values[\"include-symmetric-duplicates\"],\n crossFileOnly: parsed.values[\"cross-file-only\"],\n cohesion: parsed.values.cohesion,\n minLines: minimumLines(),\n // Per-source read progress (including read-repair scans) on the terminal bar.\n ...(indexProgress ? {\n onProgress: (value: { completed: number; total: number }) =>\n indexProgress({ phase: \"cross-search\", ...value }),\n } : {}),\n };\n try {\n if (format === \"clusters\") {\n const results: CrossSearchResult[] = [];\n for await (const result of crossSearch(searchOptions)) results.push(result);\n process.stdout.write(`${formatSimilarityClusters(results, !target, outputLimit)}\\n`);\n return;\n }\n let emitted = 0;\n for await (const result of crossSearch(searchOptions)) {\n if (outputLimit !== undefined && emitted >= outputLimit) break;\n if (format === \"summary\") {\n process.stdout.write(`${formatSimilaritySummary(result.matches, result.source)}\\n`);\n } else {\n process.stdout.write(`${JSON.stringify({\n source: presentFunction(result.source),\n matches: result.matches.map(presentMatch),\n scoring: result.scoring,\n })}\\n`);\n }\n emitted += 1;\n }\n } finally {\n target?.close();\n }\n}\n\nasync function ensureIndexUpdated(\n options: CodeIndexOptions,\n label: string,\n target: string,\n rebuildOnDivergence: boolean,\n forceRebuild: boolean,\n noReindex: boolean,\n hooks?: DescriptionRefreshHooks,\n): Promise<UpdateStats> {\n diagnosticIndexes.add(resolveIndexPath(options));\n const initialized = await initializeMissingIndex(options, label, target, noReindex, hooks);\n if (initialized) return initialized;\n const { CodeIndex } = await import(\"./code-index.js\");\n try {\n const index = new CodeIndex(options);\n try {\n await hooks?.beforeRefresh?.(index);\n const stats = await refreshIndex(index, label, target, rebuildOnDivergence, noReindex);\n await hooks?.afterRefresh?.(index);\n return stats;\n } finally {\n index.close();\n }\n } catch (error) {\n if (!forceRebuild || !(error instanceof IncompatibleIndexError)) throw error;\n process.stderr.write(\n `slopdex: warning: ${label} is incompatible (${error.message}); rebuilding automatically because --force-reindex was specified.\\n`,\n );\n const indexPath = resolveIndexPath(options);\n const descriptionProfile = descriptionProfileForRebuild(indexPath, options.rootDir);\n try {\n const { resetIndexState } = await import(\"./storage/database.js\");\n resetIndexState(indexPath, options.rootDir, options.provider.profile);\n } catch (resetError) {\n if (!(resetError instanceof IncompatibleIndexError)) throw resetError;\n removeIndexArtifacts(indexPath);\n }\n return initializeIndex(options, indexPath, label, target, noReindex, descriptionProfile, hooks);\n }\n}\n\nasync function initializeMissingIndex(\n options: CodeIndexOptions,\n label: string,\n target: string,\n noReindex: boolean,\n hooks?: DescriptionRefreshHooks,\n): Promise<UpdateStats | null> {\n const indexPath = resolveIndexPath(options);\n if (existsSync(indexPath)) return null;\n\n process.stderr.write(\n `slopdex: ${label} not found at ${indexPath}; initializing automatically from ${target}${noReindex ? \"\" : \" and the working tree\"}.\\n`,\n );\n return initializeIndex(options, indexPath, label, target, noReindex, null, hooks);\n}\n\nasync function initializeIndex(\n options: CodeIndexOptions,\n indexPath: string,\n label: string,\n target: string,\n noReindex: boolean,\n descriptionProfile: DescriptionProfile | null = null,\n hooks?: DescriptionRefreshHooks,\n): Promise<UpdateStats> {\n const { CodeIndex } = await import(\"./code-index.js\");\n const rebuiltDescriptionProvider = descriptionProfile && !options.descriptionProvider\n ? await createDescriptionProvider({\n descriptionProvider: descriptionProfile.provider as DescriptionProviderName,\n descriptionModel: descriptionProfile.model,\n parallelism: options.parallelism ?? DEFAULT_PARALLELISM,\n ...(options.verbose ? { verbose: true } : {}),\n })\n : undefined;\n const index = new CodeIndex({\n ...options, indexPath,\n ...(rebuiltDescriptionProvider ? { descriptionProvider: rebuiltDescriptionProvider } : {}),\n });\n try {\n if (descriptionProfile) await index.useDescriptions();\n await hooks?.beforeRefresh?.(index);\n const stats = await refreshIndex(index, label, target, false, noReindex);\n await hooks?.afterRefresh?.(index);\n return stats;\n } finally {\n index.close();\n }\n}\n\nfunction descriptionProfileForRebuild(indexPath: string, rootDir: string): DescriptionProfile | null {\n const db = new DatabaseSync(indexPath, { readOnly: true });\n try {\n const metadata = new Map((db.prepare(\"SELECT key, value FROM metadata\").all() as Array<{ key: string; value: string }>)\n .map((row) => [row.key, row.value]));\n if (metadata.get(\"root_dir\") !== path.resolve(rootDir) || metadata.get(\"descriptions_enabled\") !== \"true\") return null;\n const profile = JSON.parse(metadata.get(\"description_profile\")!) as DescriptionProfile;\n if (!isDescriptionProviderName(profile.provider)) {\n throw new CodeIndexError(\"Rebuilding this description index requires its custom description provider through the library API.\");\n }\n return profile;\n } finally {\n db.close();\n }\n}\n\nasync function refreshIndex(\n index: CodeIndex,\n label: string,\n target: string,\n rebuildOnDivergence: boolean,\n noReindex: boolean,\n): Promise<UpdateStats> {\n try {\n return await index.updateFromGit({ target, rebuildOnDivergence, includeWorkingTree: !noReindex });\n } catch (error) {\n if (!(error instanceof GitUnavailableError)) throw error;\n const status = index.status();\n if (noReindex && status.fileCount > 0) {\n process.stderr.write(\n `slopdex: warning: no Git repository is available for ${label}; full working-tree re-index skipped because --no-reindex was specified.\\n`,\n );\n return {\n filesUpdated: 0,\n filesDeleted: 0,\n functionsAdded: 0,\n functionsUpdated: 0,\n functionsDeleted: 0,\n embeddingsCreated: 0,\n checkpoint: status.gitCheckpoint,\n };\n }\n process.stderr.write(\n `slopdex: warning: no Git repository is available for ${label}; re-indexing all source files from the working tree.\\n`,\n );\n return await index.updateFromWorkingTree();\n }\n}\n\nfunction resolveIndexPath(options: CodeIndexOptions): string {\n return path.resolve(options.indexPath ?? path.join(path.resolve(options.rootDir), \".slopdex\", \"index.sqlite\"));\n}\n\nfunction removeIndexArtifacts(indexPath: string): void {\n for (const suffix of [\"\", \"-shm\", \"-wal\", \"-journal\"]) rmSync(`${indexPath}${suffix}`, { force: true });\n}\n\nfunction loadConfig(rootDir: string, configuredPath?: string): FileConfig {\n const configPath = path.resolve(configuredPath ?? path.join(rootDir, \".slopdex\", \"config.json\"));\n if (!existsSync(configPath)) return commandLineConfig({});\n const value = JSON.parse(readFileSync(configPath, \"utf8\")) as FileConfig;\n return commandLineConfig(value);\n}\n\nfunction commandLineConfig(config: FileConfig): FileConfig {\n const dimensions = parsed.values.dimensions\n ? numberOption(parsed.values.dimensions, 0, \"dimensions\")\n : config.dimensions;\n const providerValue = parsed.values.provider ?? config.provider;\n if (providerValue !== undefined && providerValue !== \"openai\" && providerValue !== \"jina\") {\n throw new CodeIndexError(`Unsupported provider: ${providerValue}`);\n }\n const provider: FileConfig[\"provider\"] = providerValue === \"openai\" || providerValue === \"jina\"\n ? providerValue\n : undefined;\n const descriptionProviderValue = parsed.values[\"description-provider\"] ?? config.descriptionProvider;\n if (descriptionProviderValue !== undefined && !isDescriptionProviderName(descriptionProviderValue)) {\n throw new CodeIndexError(`Unsupported description provider: ${descriptionProviderValue}`);\n }\n if (config.rerankingEnabled !== undefined && typeof config.rerankingEnabled !== \"boolean\") {\n throw new CodeIndexError(\"rerankingEnabled must be a boolean.\");\n }\n if (config.parallelism !== undefined && (!Number.isInteger(config.parallelism) || config.parallelism < 1)) {\n throw new CodeIndexError(\"parallelism must be a positive integer.\");\n }\n if (config.verbose !== undefined && typeof config.verbose !== \"boolean\") {\n throw new CodeIndexError(\"verbose must be a boolean.\");\n }\n if (config.rerankingEnabled === true) {\n if (config.rerankerProvider !== \"cohere\" && config.rerankerProvider !== \"jina\" && config.rerankerProvider !== \"openai\") {\n throw new CodeIndexError(`Unsupported reranker provider: ${String(config.rerankerProvider)}`);\n }\n if (config.rerankerModel !== undefined\n && (typeof config.rerankerModel !== \"string\" || !config.rerankerModel.trim())) {\n throw new CodeIndexError(\"rerankerModel must be a non-empty string.\");\n }\n if (config.rerankerProvider === \"openai\" && config.rerankerCandidates !== undefined\n && (typeof config.rerankerCandidates !== \"number\" || !Number.isInteger(config.rerankerCandidates) || config.rerankerCandidates < 1)) {\n throw new CodeIndexError(\"rerankerCandidates must be a positive integer.\");\n }\n if (config.rerankerProvider === \"openai\" && typeof config.rerankerCandidates === \"number\" && config.rerankerCandidates > 100) {\n throw new CodeIndexError(\"rerankerCandidates must not exceed 100.\");\n }\n }\n return {\n ...config,\n ...(provider ? { provider } : {}),\n ...(parsed.values.model ? { model: parsed.values.model } : {}),\n ...(descriptionProviderValue ? { descriptionProvider: descriptionProviderValue } : {}),\n ...(parsed.values[\"description-model\"] ? { descriptionModel: parsed.values[\"description-model\"] } : {}),\n ...(dimensions ? { dimensions } : {}),\n ...(parsed.values.verbose ? { verbose: true } : {}),\n };\n}\n\nasync function createDescriptionProvider(config: FileConfig): Promise<import(\"./types.js\").DescriptionProvider | undefined> {\n if (!config.descriptionProvider && !config.descriptionModel) return undefined;\n const { OpenAIDescriptionProvider } = await import(\"./descriptions/openai.js\");\n return new OpenAIDescriptionProvider({\n ...(config.descriptionProvider ? { provider: config.descriptionProvider } : {}),\n ...(config.descriptionModel ? { model: config.descriptionModel } : {}),\n parallelism: config.parallelism ?? DEFAULT_PARALLELISM,\n ...(config.verbose ? { verbose: true } : {}),\n });\n}\n\nfunction descriptionRefresh(config: FileConfig): DescriptionRefreshHooks | undefined {\n if (command === \"descriptions\") {\n return descriptionsAction === \"disable\"\n ? { beforeRefresh: (index) => { index.disableDescriptions(); } }\n : enableDescriptionRefresh(false);\n }\n if (config.descriptionsEnabled === true) return enableDescriptionRefresh();\n if (config.descriptionsEnabled === false) return { beforeRefresh: (index) => { index.disableDescriptions(); } };\n return undefined;\n}\n\nfunction enableDescriptionRefresh(afterRefresh = true): DescriptionRefreshHooks {\n return {\n ...(afterRefresh ? { afterRefresh: async (index: CodeIndex) => { await index.useDescriptions(); } } : {}),\n };\n}\n\nasync function runModels(): Promise<void> {\n const positionalProvider = positionals[0];\n const optionProvider = parsed.values[\"description-provider\"];\n if (positionalProvider && optionProvider && positionalProvider !== optionProvider) {\n throw new CodeIndexError(\"models provider and --description-provider must match when both are supplied.\");\n }\n const requested = positionalProvider ?? optionProvider;\n if (requested !== undefined && !isOpenCodeDescriptionProvider(requested)) {\n throw new CodeIndexError(\"models provider must be opencode or opencode-go.\");\n }\n const providers: OpenCodeDescriptionProvider[] = requested ? [requested] : [\"opencode\", \"opencode-go\"];\n const models = (await Promise.all(providers.map(fetchPublishedModels))).flat();\n const format = outputFormat(\"summary\");\n if (format === \"clusters\") throw new CodeIndexError(\"clusters format is only available for cross-search.\");\n if (format === \"json\") printJson(models);\n else process.stdout.write(`${models.map(({ provider, model }) => `${provider}/${model}`).join(\"\\n\")}\\n`);\n}\n\nasync function runConfig(rootDir: string): Promise<void> {\n const configPath = path.resolve(parsed.values.config ?? path.join(rootDir, \".slopdex\", \"config.json\"));\n const config = readConfigFile(configPath);\n const action = positionals[0];\n let result: Record<string, unknown>;\n if (action === \"descriptions\") {\n config.descriptionsEnabled = positionals[1] === \"enable\";\n result = { descriptionsEnabled: config.descriptionsEnabled };\n } else if (action === \"model\") {\n const selected = await resolveConfiguredModel(positionals[1]);\n config.descriptionProvider = selected.provider;\n config.descriptionModel = selected.model;\n result = { descriptionProvider: selected.provider, descriptionModel: selected.model };\n } else if (action === \"parallelism\") {\n const parallelism = Number(positionals[1]);\n config.parallelism = parallelism;\n result = { parallelism };\n } else {\n const provider = positionals[1] as \"cohere\" | \"jina\" | \"openai\" | \"disable\";\n if (provider === \"disable\") {\n config.rerankingEnabled = false;\n result = { rerankingEnabled: false };\n } else {\n const sameProvider = config.rerankerProvider === provider;\n const defaultModel = provider === \"cohere\"\n ? \"rerank-v4.0-pro\"\n : provider === \"jina\" ? \"jina-reranker-v3.5\" : \"gpt-5.6-luna\";\n const model = positionals[2]\n ?? (sameProvider && typeof config.rerankerModel === \"string\" && config.rerankerModel.trim() ? config.rerankerModel : defaultModel);\n config.rerankerProvider = provider;\n config.rerankerModel = model;\n if (provider === \"openai\") {\n const savedCandidates = sameProvider && typeof config.rerankerCandidates === \"number\"\n && Number.isInteger(config.rerankerCandidates) && config.rerankerCandidates > 0\n ? config.rerankerCandidates\n : 10;\n config.rerankerCandidates = openAIRerankerCandidateCount(\n parsed.values[\"reranker-candidates\"], savedCandidates, \"reranker candidate count\",\n );\n } else {\n delete config.rerankerCandidates;\n }\n config.rerankingEnabled = true;\n result = {\n rerankingEnabled: true,\n rerankerProvider: provider,\n rerankerModel: model,\n ...(provider === \"openai\" ? { rerankerCandidates: config.rerankerCandidates } : {}),\n };\n }\n }\n writeConfigFile(configPath, config);\n const format = outputFormat(\"summary\");\n if (format === \"clusters\") throw new CodeIndexError(\"clusters format is only available for cross-search.\");\n if (format === \"json\") printJson({ configPath, ...result });\n else process.stdout.write(`Updated ${configPath}: ${Object.entries(result).map(([key, value]) => `${key}=${value}`).join(\" \")}\\n`);\n}\n\nasync function resolveConfiguredModel(positionalModel: string | undefined): Promise<PublishedModel> {\n const optionModel = parsed.values[\"description-model\"];\n if (positionalModel && optionModel && positionalModel !== optionModel) {\n throw new CodeIndexError(\"config model argument and --description-model must match when both are supplied.\");\n }\n let reference = positionalModel ?? optionModel;\n if (!reference) throw new CodeIndexError(\"config model requires a model ID or provider/model reference.\");\n let provider = parsed.values[\"description-provider\"];\n const separator = reference.indexOf(\"/\");\n if (separator !== -1) {\n const qualifiedProvider = reference.slice(0, separator);\n reference = reference.slice(separator + 1);\n if (provider && provider !== qualifiedProvider) {\n throw new CodeIndexError(\"Model reference and --description-provider must select the same provider.\");\n }\n provider = qualifiedProvider;\n }\n if (!reference) throw new CodeIndexError(\"config model requires a non-empty model ID.\");\n if (provider !== undefined) {\n if (!isOpenCodeDescriptionProvider(provider)) {\n throw new CodeIndexError(\"config model provider must be opencode or opencode-go.\");\n }\n const models = await fetchPublishedModels(provider);\n if (!models.some(({ model }) => model === reference)) {\n throw new CodeIndexError(`Unknown ${provider} model: ${reference}`);\n }\n return { provider, model: reference };\n }\n const matches = (await Promise.all([\n fetchPublishedModels(\"opencode\"),\n fetchPublishedModels(\"opencode-go\"),\n ])).flat().filter(({ model }) => model === reference);\n if (matches.length === 0) throw new CodeIndexError(`Unknown OpenCode model: ${reference}`);\n if (matches.length > 1) {\n throw new CodeIndexError(`Model ${reference} is available from multiple providers; use provider/model.`);\n }\n return matches[0]!;\n}\n\nasync function fetchPublishedModels(provider: OpenCodeDescriptionProvider): Promise<PublishedModel[]> {\n const { descriptionProviderBaseUrl } = await import(\"./descriptions/openai.js\");\n const url = `${descriptionProviderBaseUrl(provider)}/models`;\n let response: Response;\n try {\n response = await fetch(url);\n } catch (error) {\n throw new CodeIndexError(`Could not fetch ${provider} models: ${error instanceof Error ? error.message : String(error)}`, { cause: error });\n }\n if (!response.ok) {\n throw new CodeIndexError(`Could not fetch ${provider} models (${response.status}): ${(await response.text()).slice(0, 500)}`);\n }\n let body: { data?: Array<{ id?: unknown }> };\n try {\n body = await response.json() as { data?: Array<{ id?: unknown }> };\n } catch (error) {\n throw new CodeIndexError(`${provider} returned a malformed model list.`, { cause: error });\n }\n if (!Array.isArray(body.data) || body.data.some((item) => typeof item.id !== \"string\" || item.id.length === 0)) {\n throw new CodeIndexError(`${provider} returned a malformed model list.`);\n }\n return [...new Set(body.data.map((item) => item.id as string))].map((model) => ({ provider, model }));\n}\n\nfunction isOpenCodeDescriptionProvider(value: string): value is OpenCodeDescriptionProvider {\n return value === \"opencode\" || value === \"opencode-go\";\n}\n\nfunction readConfigFile(configPath: string): FileConfig {\n if (!existsSync(configPath)) return {};\n const value = JSON.parse(readFileSync(configPath, \"utf8\")) as unknown;\n if (!value || typeof value !== \"object\" || Array.isArray(value)) {\n throw new CodeIndexError(`Config must contain a JSON object: ${configPath}`);\n }\n return value as FileConfig;\n}\n\nfunction writeConfigFile(configPath: string, config: FileConfig): void {\n mkdirSync(path.dirname(configPath), { recursive: true });\n const temporaryPath = `${configPath}.tmp-${process.pid}`;\n writeFileSync(temporaryPath, `${JSON.stringify(config, null, 2)}\\n`);\n renameSync(temporaryPath, configPath);\n}\n\nasync function createProvider(config: FileConfig): Promise<EmbeddingProvider> {\n if ((config.provider ?? \"openai\") === \"jina\") {\n const { JinaEmbeddingProvider } = await import(\"./embeddings/jina.js\");\n return new JinaEmbeddingProvider({\n ...(config.model ? { model: config.model } : {}),\n ...(config.dimensions ? { dimensions: config.dimensions } : {}),\n parallelism: config.parallelism ?? DEFAULT_PARALLELISM,\n ...(config.verbose ? { verbose: true } : {}),\n });\n }\n const { OpenAIEmbeddingProvider } = await import(\"./embeddings/openai.js\");\n return new OpenAIEmbeddingProvider({\n ...(config.model ? { model: config.model } : {}),\n ...(config.dimensions ? { dimensions: config.dimensions } : {}),\n parallelism: config.parallelism ?? DEFAULT_PARALLELISM,\n ...(config.verbose ? { verbose: true } : {}),\n });\n}\n\nasync function createReranker(config: FileConfig): Promise<Reranker | undefined> {\n if (config.rerankingEnabled !== true) return undefined;\n if (config.rerankerProvider === \"cohere\" || config.rerankerProvider === \"jina\") {\n const { CohereReranker, JinaReranker } = await import(\"./rerankers/hosted.js\");\n if (config.rerankerProvider === \"cohere\") {\n return new CohereReranker({\n ...(config.rerankerModel ? { model: config.rerankerModel } : {}),\n ...(config.verbose ? { verbose: true } : {}),\n });\n }\n return new JinaReranker({\n ...(config.rerankerModel ? { model: config.rerankerModel } : {}),\n ...(config.verbose ? { verbose: true } : {}),\n });\n }\n if (config.rerankerProvider === \"openai\") {\n const { OpenAILLMReranker } = await import(\"./rerankers/openai.js\");\n return new OpenAILLMReranker({\n ...(config.rerankerModel ? { model: config.rerankerModel } : {}),\n ...(config.rerankerCandidates ? { candidateCount: config.rerankerCandidates } : {}),\n ...(config.verbose ? { verbose: true } : {}),\n });\n }\n throw new CodeIndexError(\"rerankerProvider is required when rerankingEnabled is true.\");\n}\n\nfunction numberOption(value: string | undefined, defaultValue: number, name: string): number {\n if (value === undefined) return defaultValue;\n const parsedValue = Number(value);\n if (!Number.isFinite(parsedValue)) throw new CodeIndexError(`${name} must be a number.`);\n return parsedValue;\n}\n\nfunction validateInvocation(): void {\n if (parsed.values[\"reranker-candidates\"] !== undefined\n && (command !== \"config\" || positionals[0] !== \"reranker\" || positionals[1] !== \"openai\")) {\n throw new CodeIndexError(\"--reranker-candidates is only available with config reranker openai.\");\n }\n if (parsed.values.cohesion && command !== \"cross-search\") {\n throw new CodeIndexError(\"--cohesion is only available for cross-search.\");\n }\n if (parsed.values.matches !== undefined && command !== \"cross-search\") {\n throw new CodeIndexError(\"--matches is only available for cross-search.\");\n }\n const nameRegex = qualifiedNameRegex();\n if (nameRegex !== undefined) {\n if (![\"search\", \"search-description\", \"cross-search\"].includes(command!)) {\n throw new CodeIndexError(\"-e/--regexp/--regex is only available for search, search-description, and cross-search.\");\n }\n compileNameRegex(nameRegex, parsed.values.regex !== undefined ? \"--regex value\" : \"-e/--regexp value\");\n }\n switch (command) {\n case \"models\":\n if (positionals.length > 1) throw new CodeIndexError(\"models accepts at most one provider.\");\n if (outputFormat(\"summary\") === \"clusters\") throw new CodeIndexError(\"clusters format is only available for cross-search.\");\n return;\n case \"config\":\n if (outputFormat(\"summary\") === \"clusters\") throw new CodeIndexError(\"clusters format is only available for cross-search.\");\n if (positionals[0] === \"descriptions\") {\n if (positionals.length !== 2 || (positionals[1] !== \"enable\" && positionals[1] !== \"disable\")) {\n throw new CodeIndexError(\"config descriptions requires enable or disable.\");\n }\n return;\n }\n if (positionals[0] === \"model\") {\n if (positionals.length > 2 || (!positionals[1] && !parsed.values[\"description-model\"])) {\n throw new CodeIndexError(\"config model requires a model ID or provider/model reference.\");\n }\n return;\n }\n if (positionals[0] === \"parallelism\") {\n const value = Number(positionals[1]);\n if (positionals.length !== 2 || !Number.isInteger(value) || value < 1) {\n throw new CodeIndexError(\"config parallelism requires a positive integer.\");\n }\n return;\n }\n if (positionals[0] === \"reranker\") {\n const provider = positionals[1];\n if ((provider !== \"cohere\" && provider !== \"jina\" && provider !== \"openai\" && provider !== \"disable\")\n || positionals.length > (provider === \"disable\" ? 2 : 3)\n || (positionals[2] !== undefined && !positionals[2].trim())) {\n throw new CodeIndexError(\"config reranker requires cohere, jina, openai, or disable, optionally followed by a model ID.\");\n }\n if (provider === \"openai\") openAIRerankerCandidateCount(parsed.values[\"reranker-candidates\"], 10, \"reranker candidate count\");\n return;\n }\n throw new CodeIndexError(\"config requires descriptions, model, parallelism, or reranker.\");\n case \"index-errors\":\n if (outputFormat(\"summary\") === \"clusters\") throw new CodeIndexError(\"clusters format is only available for cross-search.\");\n return;\n case \"status\":\n case \"update-git\":\n return;\n case \"reindex-files\":\n if (positionals.length > 0) throw new CodeIndexError(\"reindex-files does not accept positional arguments.\");\n return;\n case \"descriptions\":\n if (positionals.length !== 1 || (descriptionsAction !== \"enable\" && descriptionsAction !== \"disable\")) {\n throw new CodeIndexError(\"descriptions requires enable or disable.\");\n }\n return;\n case \"update-files\":\n if (positionals.length === 0) throw new CodeIndexError(\"update-files requires at least one path.\");\n return;\n case \"delete-files\":\n if (positionals.length === 0) throw new CodeIndexError(\"delete-files requires at least one path.\");\n return;\n case \"search\":\n case \"search-description\": {\n if (!positionals.join(\" \").trim()) throw new CodeIndexError(`${command} requires a query.`);\n validateOutputLimit();\n similarityThreshold();\n if (outputFormat(\"summary\") === \"clusters\") throw new CodeIndexError(\"clusters format is only available for cross-search.\");\n return;\n }\n case \"cross-search\":\n if (Boolean(parsed.values[\"target-root\"]) !== Boolean(parsed.values[\"target-index\"])) {\n throw new CodeIndexError(\"Cross-index search requires both --target-root and --target-index.\");\n }\n if (parsed.values[\"target-config\"] && !parsed.values[\"target-root\"]) {\n throw new CodeIndexError(\"--target-config requires --target-root and --target-index.\");\n }\n validateMatches(5);\n validateOutputLimit();\n similarityThreshold();\n if (parsed.values.cohesion && outputFormat(\"summary\") === \"clusters\") {\n throw new CodeIndexError(\"clusters format does not preserve cohesion match order; use summary or json.\");\n }\n outputFormat(parsed.values.cohesion ? \"summary\" : \"clusters\");\n minimumLines();\n crossSearchSourceFilter();\n return;\n default:\n throw new CodeIndexError(`Unknown command: ${command}`);\n }\n}\n\nfunction validateMatches(defaultValue: number): void {\n positiveIntegerOption(parsed.values.matches, defaultValue, \"matches\");\n}\n\nfunction validateOutputLimit(): void {\n if (parsed.values.limit !== undefined) positiveIntegerOption(parsed.values.limit, 1, \"limit\");\n}\n\nfunction positiveIntegerOption(value: string | undefined, defaultValue: number, name: string): number {\n const parsedValue = numberOption(value, defaultValue, name);\n if (!Number.isInteger(parsedValue) || parsedValue < 1) throw new CodeIndexError(`${name} must be a positive integer.`);\n return parsedValue;\n}\n\nfunction openAIRerankerCandidateCount(value: string | undefined, defaultValue: number, name: string): number {\n const count = positiveIntegerOption(value, defaultValue, name);\n if (count > 100) throw new CodeIndexError(`${name} must not exceed 100.`);\n return count;\n}\n\nfunction similarityThreshold(defaultMin = 0.3): { min: number; max?: number } {\n const threshold = parsed.values.threshold;\n if (threshold === undefined) return { min: defaultMin };\n\n const number = \"[+-]?(?:\\\\d+(?:\\\\.\\\\d*)?|\\\\.\\\\d+)(?:e[+-]?\\\\d+)?\";\n const range = new RegExp(`^\\\\s*(${number})\\\\s*-\\\\s*(${number})\\\\s*$`, \"i\").exec(threshold);\n if (!range) return { min: numberOption(threshold, defaultMin, \"threshold\") };\n const min = Number(range[1]);\n const max = Number(range[2]);\n if (!Number.isFinite(min) || !Number.isFinite(max)) throw new CodeIndexError(\"threshold range bounds must be numbers.\");\n if (min >= max) throw new CodeIndexError(\"threshold range minimum must be less than its maximum.\");\n return { min, max };\n}\n\nfunction outputFormat(defaultValue: \"json\" | \"summary\" | \"clusters\"): \"json\" | \"summary\" | \"clusters\" {\n const value = parsed.values.format ?? defaultValue;\n if (value !== \"json\" && value !== \"summary\" && value !== \"clusters\") {\n throw new CodeIndexError(\"format must be json, summary, or clusters.\");\n }\n return value;\n}\n\nfunction minimumLines(): number {\n const value = numberOption(parsed.values[\"min-lines\"], 2, \"min-lines\");\n if (!Number.isInteger(value) || value < 1) throw new CodeIndexError(\"min-lines must be a positive integer.\");\n return value;\n}\n\nfunction qualifiedNameRegex(): string | undefined {\n if (parsed.values.regexp !== undefined && parsed.values.regex !== undefined && parsed.values.regexp !== parsed.values.regex) {\n throw new CodeIndexError(\"-e/--regexp and --regex are aliases and cannot use different values.\");\n }\n return parsed.values.regexp ?? parsed.values.regex;\n}\n\nfunction crossSearchSourceFilter(): CrossSearchSourceFilter {\n const changedSince = parsed.values[\"changed-since\"];\n const uncommitted = parsed.values.uncommitted;\n const nameRegex = qualifiedNameRegex();\n const restrictions = {\n ...(parsed.values[\"source-path\"] ? { path: parsed.values[\"source-path\"] } : {}),\n ...(nameRegex !== undefined ? { nameRegex } : {}),\n };\n if (changedSince) return { type: \"changed-since\", commit: changedSince, ...(uncommitted ? { uncommitted: true } : {}), ...restrictions };\n if (uncommitted) return { type: \"uncommitted\", ...restrictions };\n return { type: \"all\", ...restrictions };\n}\n\nfunction presentFunction(value: IndexedFunction) {\n const { embeddingInput: _embeddingInput, embeddingId: _embeddingId, descriptionEmbeddingId: _descriptionEmbeddingId, ...result } = value;\n return result;\n}\n\nfunction presentMatch(value: SimilarityResult) {\n const { function: callable, ...scores } = value;\n return { ...scores, function: presentFunction(callable) };\n}\n\nfunction printJson(value: unknown): void {\n process.stdout.write(`${JSON.stringify(value, null, 2)}\\n`);\n}\n\nfunction printHelp(): void {\n process.stdout.write(`Usage: slopdex <command> [arguments] [options]\n\nCommands:\n models [opencode|opencode-go] List current published OpenCode models\n config model <model|provider/model> Validate and save an OpenCode description model\n config descriptions <enable|disable> Save description state without opening an index\n config parallelism <count> Save the concurrent provider request limit (default: 10)\n config reranker <provider|disable> Save Cohere, Jina, or OpenAI reranking settings\n status Show index metadata\n index-errors List persisted file and function indexing failures\n update-files <path...> Index specific working-tree files\n reindex-files Regenerate stale file descriptions\n delete-files <path...> Remove specific files from the index\n update-git Index a Git snapshot plus working-tree changes\n search <query> Search functions by semantic similarity\n descriptions <enable|disable> Enable or disable automatic purpose descriptions\n search-description <query> Search functions using description embeddings\n cross-search Find nearest functions for each source function\n\nExamples:\n Search code:\n slopdex search \"validate an authenticated session\"\n\n slopdex search \"keep the repository index synchronized\"\n 0.4284 tests/languages.test.ts :: refresh\n 0.4200 src/cli.ts :: refreshIndex\n 0.4113 src/code-index.ts :: CodeIndex.updateFromGit\n ...\n\n Enable descriptions, then search by their meaning:\n slopdex descriptions enable\n slopdex search-description \"keep the repository index synchronized\"\n\n slopdex models opencode-go\n slopdex config model opencode-go/gpt-5.6-luna\n\n Find duplicate code:\n Compare functions across files, exclude short wrappers, and group matches into clusters:\n slopdex cross-search --cross-file-only --min-lines 4 --threshold 0.9\n\n Cluster 1 (3 functions, similarity 0.9124-0.9568)\n src/auth/session.ts:18:1 :: validateSession\n src/http/middleware.ts:42:1 :: authenticate\n src/users/user-service.ts:27:3 :: UserService.authenticate\n\n This found three substantial authentication functions in separate files with very\n high similarity. Review them for repeated validation or session logic that could be shared.\n Middleware and service locations may be intentional architectural layers, so this is\n evidence to inspect rather than proof they should merge. Connected components may use\n transitive links, so every function need not directly match every other function.\n\n Using --cross-file-only is useful to exclude similar code in the same file.\n\n Review adjacent bands with threshold ranges:\n slopdex cross-search --cross-file-only --min-lines 4 --threshold 0.9\n slopdex cross-search --cross-file-only --min-lines 4 --threshold 0.85-0.9\n\n Restrict functions used in cross-search:\n Only use uncommitted working-tree functions as sources:\n slopdex cross-search --uncommitted --cross-file-only --min-lines 4 --threshold 0.9\n\n Only use functions changed since origin/main as sources:\n slopdex cross-search --changed-since origin/main --threshold 0.9\n\n Only use matching symbols under src/services as sources:\n slopdex cross-search --source-path src/services -e '^UserService\\\\.' --threshold 0.9\n\n Find related code stored far apart:\n --cohesion orders matches from farthest to nearest, which can highlight similar code\n that could be made more cohesive through an abstraction:\n slopdex cross-search --cross-file-only --cohesion --threshold 0.8\n\n src/auth/session.ts :: validateSession\n 0.9400 packages/http/middleware.ts :: authenticate [distance 4]\n 0.9300 src/auth/token.ts :: validateToken [distance 1]\n\n --cohesion keeps cross-search's semantic matches but orders each source's matches\n from greatest to least path distance. Similarity breaks distance ties. This highlights\n related functions stored far apart without introducing a separate analysis command.\n\n Use with agents:\n slopdex search \"...\" --threshold 0.5\n slopdex cross-search --uncommitted --threshold 0.8\n\n Reranking (second-stage reranker for search and search-description):\n slopdex config reranker cohere\n slopdex config reranker jina\n slopdex config reranker openai\n\n Compare repositories:\n slopdex cross-search --target-root /path/to/other/repo --target-index /path/to/other/repo/.slopdex/index.sqlite --threshold 0.9\n\n Inspect index health:\n slopdex status\n slopdex index-errors --format summary\n slopdex --version\n\nOptions:\n --version Show the package version\n --root <path> Repository root (default: current directory)\n --config <path> Config file (default: .slopdex/config.json)\n --index <path> SQLite index path\n --provider <openai|jina> Embedding provider\n --model <name> Embedding model\n --description-provider <name> Description provider: openai, opencode, or opencode-go\n --description-model <name> Description model (provider default: gpt-5.6-luna or muse-spark-1.3-contributor)\n --reranker-candidates <number> Candidates sent to the OpenAI LLM reranker (default: 10)\n --dimensions <number> Embedding dimensions\n --target <ref> Target ref for update-git (default: HEAD)\n --rebuild-on-divergence Rebuild after a rebase or branch change\n --force-reindex Rebuild an incompatible existing index\n --no-reindex Skip worktree overlays or reuse a non-Git index\n --callables With reindex-files, also regenerate callable descriptions\n --ignore-errors Silence warnings about persisted indexing errors\n --verbose Log every external model call instead of one per kind/model\n --limit <number> Output limit (default: unlimited; threshold filters results)\n --matches <number> Cross-search matches per source function (default: 5)\n --threshold <number|range> Show similarities at/above a value or within a range (default: 0.3)\n --format <json|summary|clusters> Output format (default: summary; cross-search: clusters)\n --cohesion Re-rank cross-search matches by physical distance\n --include-symmetric-duplicates Show both directions of same-index matches\n --cross-file-only Exclude matches from the source file\n --min-lines <number> Minimum callable length for cross-search (default: 2)\n -e, --regexp <regex> Filter qualified symbols (analysis: sources only)\n --regex <regex> Alias for -e/--regexp\n --changed-since <commit> Search added, modified, or moved functions\n --uncommitted Search functions from uncommitted files\n --source-path <path> Restrict cross-search sources to a file or directory\n --target-root <path> Root of a second indexed codebase\n --target-index <path> SQLite path of a second index\n --target-config <path> Config file for a second indexed codebase\n\nOther Examples:\n Save description state and parallelism without opening an index:\n slopdex config descriptions enable\n slopdex config parallelism 10\n\n Index specific working-tree files:\n slopdex update-files src/service.ts src/model.ts\n\n Regenerate stale file descriptions, optionally continuing through callable descriptions:\n slopdex reindex-files\n slopdex reindex-files --callables\n\n Remove deleted files from the index:\n slopdex delete-files src/removed.ts\n\n Index HEAD and overlay uncommitted working-tree changes:\n slopdex update-git --target HEAD\n\n Combine source restrictions (all must match):\n slopdex cross-search -e 'validate' --source-path src --changed-since origin/main --uncommitted\n\n Filter semantic search results by qualified symbol before applying the limit:\n slopdex search \"validate session\" -e '^Session\\\\.' --limit 10\n`);\n}\n","import type { CohesionReport, CrossSearchMatch, CrossSearchResult, IndexedFunction, SimilarityResult, SimilarityScores } from \"./types.js\";\n\nfunction functionName(value: Pick<IndexedFunction, \"path\" | \"qualifiedName\">): string {\n return `${value.path} :: ${value.qualifiedName}`;\n}\n\nexport function formatSimilaritySummary(\n matches: readonly (SimilarityResult | CrossSearchMatch)[],\n source?: IndexedFunction,\n): string {\n const lines = matches.map((match) => `${source ? \" \" : \"\"}${rankDetails(match)} ${functionName(match.function)}${distanceDetails(match)}${scoreDetails(match)}`);\n if (!source) return lines.length > 0 ? lines.join(\"\\n\") : \"No matches.\";\n return [functionName(source), ...(lines.length > 0 ? lines : [\" No matches.\"])].join(\"\\n\");\n}\n\nfunction rankDetails(match: SimilarityResult | CrossSearchMatch): string {\n return match.rerankScore === undefined\n ? match.similarity.toFixed(4)\n : `${match.rerankScore.toFixed(4)} rerank (${match.similarity.toFixed(4)} similarity)`;\n}\n\nfunction distanceDetails(match: SimilarityResult | CrossSearchMatch): string {\n return \"physicalDistance\" in match && match.physicalDistance !== undefined\n ? ` [distance ${match.physicalDistance}]`\n : \"\";\n}\n\nexport function formatSimilarityClusters(results: readonly CrossSearchResult[], sameIndex: boolean, limit?: number): string {\n const combined = results.some((result) => result.matches.some((match) => match.descriptionSimilarity !== undefined));\n const nodes = new Map<string, { function: IndexedFunction; role: \"source\" | \"target\" }>();\n const neighbors = new Map<string, Set<string>>();\n const edges: Array<{ left: string; right: string; similarity: number }> = [];\n const connect = (left: string, right: string): void => {\n const leftNeighbors = neighbors.get(left) ?? new Set<string>();\n const rightNeighbors = neighbors.get(right) ?? new Set<string>();\n leftNeighbors.add(right);\n rightNeighbors.add(left);\n neighbors.set(left, leftNeighbors);\n neighbors.set(right, rightNeighbors);\n };\n\n for (const result of results) {\n const sourceKey = `${sameIndex ? \"index\" : \"source\"}:${result.source.id}`;\n nodes.set(sourceKey, { function: result.source, role: \"source\" });\n for (const match of result.matches) {\n const matchKey = `${sameIndex ? \"index\" : \"target\"}:${match.function.id}`;\n nodes.set(matchKey, { function: match.function, role: sameIndex ? \"source\" : \"target\" });\n connect(sourceKey, matchKey);\n edges.push({ left: sourceKey, right: matchKey, similarity: match.similarity });\n }\n }\n\n const seen = new Set<string>();\n const clusters: Array<{ members: Array<{ function: IndexedFunction; role: \"source\" | \"target\" }>; min: number; max: number }> = [];\n for (const start of neighbors.keys()) {\n if (seen.has(start)) continue;\n const pending = [start];\n const keys = new Set<string>();\n while (pending.length > 0) {\n const key = pending.pop()!;\n if (seen.has(key)) continue;\n seen.add(key);\n keys.add(key);\n for (const neighbor of neighbors.get(key) ?? []) pending.push(neighbor);\n }\n const similarities = edges\n .filter((edge) => keys.has(edge.left) && keys.has(edge.right))\n .map((edge) => edge.similarity);\n clusters.push({\n members: [...keys].map((key) => nodes.get(key)!).sort((left, right) => (\n clusterFunctionName(left, sameIndex).localeCompare(clusterFunctionName(right, sameIndex))\n )),\n min: Math.min(...similarities),\n max: Math.max(...similarities),\n });\n }\n clusters.sort((left, right) => right.members.length - left.members.length\n || clusterFunctionName(left.members[0]!, sameIndex).localeCompare(clusterFunctionName(right.members[0]!, sameIndex)));\n const limited = limit !== undefined ? clusters.slice(0, limit) : clusters;\n if (limited.length === 0) return \"No clusters.\";\n return limited.map((cluster, index) => {\n const similarity = cluster.min === cluster.max\n ? cluster.min.toFixed(4)\n : `${cluster.min.toFixed(4)}-${cluster.max.toFixed(4)}`;\n return [\n `Cluster ${index + 1} (${cluster.members.length} functions, similarity ${similarity}${combined ? \", combined code + callable description + file description\" : \"\"})`,\n ...cluster.members.map((member) => ` ${clusterFunctionName(member, sameIndex)}`),\n ].join(\"\\n\");\n }).join(\"\\n\\n\");\n}\n\nexport function formatCohesionSummary(report: CohesionReport): string {\n const { metrics } = report;\n const edgeLabel = metrics.semanticEdges === 1 ? \"edge\" : \"edges\";\n const lines = [\n `Cohesion: ${metrics.functionsAnalyzed} functions analyzed, ${metrics.semanticEdges} semantic ${edgeLabel}`,\n ` same file ${(metrics.sameFileRatio * 100).toFixed(1)}% same folder ${(metrics.sameFolderRatio * 100).toFixed(1)}% remote ${(metrics.remoteRatio * 100).toFixed(1)}% mean distance ${metrics.weightedMeanDistance.toFixed(2)}`,\n ];\n if (report.parameters.similarityMode === \"code-description-file-average\") {\n lines.push(\" similarity: combined 1/3 code + 1/3 callable description + 1/3 file description\");\n }\n if (report.pairs.length === 0) return [...lines, \"No cohesion gaps.\"].join(\"\\n\");\n lines.push(\"\");\n for (const pair of report.pairs) {\n lines.push(\n `${pair.rank}. gap ${pair.cohesionGap.toFixed(4)} similarity ${pair.similarity.toFixed(4)} distance ${pair.location.physicalDistance}${pair.reciprocal ? \" reciprocal\" : \"\"}${scoreDetails(pair)}`,\n ` ${functionLocation(pair.left)}`,\n ` ${functionLocation(pair.right)}`,\n );\n }\n return lines.join(\"\\n\");\n}\n\nfunction scoreDetails(scores: SimilarityScores): string {\n if (scores.descriptionSimilarity === undefined || scores.fileDescriptionSimilarity === undefined) return \"\";\n if (scores.codeSimilarity === undefined) {\n return ` [combined 50/50; description ${scores.descriptionSimilarity.toFixed(4)}, file ${scores.fileDescriptionSimilarity.toFixed(4)}]`;\n }\n return ` [combined thirds; code ${scores.codeSimilarity.toFixed(4)}, description ${scores.descriptionSimilarity.toFixed(4)}, file ${scores.fileDescriptionSimilarity.toFixed(4)}]`;\n}\n\nfunction clusterFunctionName(\n member: { function: IndexedFunction; role: \"source\" | \"target\" },\n sameIndex: boolean,\n): string {\n const role = sameIndex ? \"\" : `[${member.role}] `;\n return `${role}${member.function.path}:${member.function.startLine}:${member.function.startColumn} :: ${member.function.qualifiedName}`;\n}\n\nfunction functionLocation(value: IndexedFunction): string {\n return `${value.path}:${value.startLine}:${value.startColumn} :: ${value.qualifiedName}`;\n}\n"],"mappings":";;;;;;;;;;;;;;;;AAEA,SAAS,YAAY,WAAW,cAAc,YAAY,QAAQ,qBAAqB;AACvF,OAAO,UAAU;AACjB,SAAS,oBAAoB;AAC7B,SAAS,iBAAiB;;;ACH1B,SAAS,aAAa,OAAgE;AACpF,SAAO,GAAG,MAAM,IAAI,OAAO,MAAM,aAAa;AAChD;AAEO,SAAS,wBACd,SACA,QACQ;AACR,QAAM,QAAQ,QAAQ,IAAI,CAAC,UAAU,GAAG,SAAS,OAAO,EAAE,GAAG,YAAY,KAAK,CAAC,KAAK,aAAa,MAAM,QAAQ,CAAC,GAAG,gBAAgB,KAAK,CAAC,GAAG,aAAa,KAAK,CAAC,EAAE;AACjK,MAAI,CAAC,OAAQ,QAAO,MAAM,SAAS,IAAI,MAAM,KAAK,IAAI,IAAI;AAC1D,SAAO,CAAC,aAAa,MAAM,GAAG,GAAI,MAAM,SAAS,IAAI,QAAQ,CAAC,eAAe,CAAE,EAAE,KAAK,IAAI;AAC5F;AAEA,SAAS,YAAY,OAAoD;AACvE,SAAO,MAAM,gBAAgB,SACzB,MAAM,WAAW,QAAQ,CAAC,IAC1B,GAAG,MAAM,YAAY,QAAQ,CAAC,CAAC,YAAY,MAAM,WAAW,QAAQ,CAAC,CAAC;AAC5E;AAEA,SAAS,gBAAgB,OAAoD;AAC3E,SAAO,sBAAsB,SAAS,MAAM,qBAAqB,SAC7D,eAAe,MAAM,gBAAgB,MACrC;AACN;AAEO,SAAS,yBAAyB,SAAuC,WAAoB,OAAwB;AAC1H,QAAM,WAAW,QAAQ,KAAK,CAAC,WAAW,OAAO,QAAQ,KAAK,CAAC,UAAU,MAAM,0BAA0B,MAAS,CAAC;AACnH,QAAM,QAAQ,oBAAI,IAAsE;AACxF,QAAM,YAAY,oBAAI,IAAyB;AAC/C,QAAM,QAAoE,CAAC;AAC3E,QAAM,UAAU,CAAC,MAAc,UAAwB;AACrD,UAAM,gBAAgB,UAAU,IAAI,IAAI,KAAK,oBAAI,IAAY;AAC7D,UAAM,iBAAiB,UAAU,IAAI,KAAK,KAAK,oBAAI,IAAY;AAC/D,kBAAc,IAAI,KAAK;AACvB,mBAAe,IAAI,IAAI;AACvB,cAAU,IAAI,MAAM,aAAa;AACjC,cAAU,IAAI,OAAO,cAAc;AAAA,EACrC;AAEA,aAAW,UAAU,SAAS;AAC5B,UAAM,YAAY,GAAG,YAAY,UAAU,QAAQ,IAAI,OAAO,OAAO,EAAE;AACvE,UAAM,IAAI,WAAW,EAAE,UAAU,OAAO,QAAQ,MAAM,SAAS,CAAC;AAChE,eAAW,SAAS,OAAO,SAAS;AAClC,YAAM,WAAW,GAAG,YAAY,UAAU,QAAQ,IAAI,MAAM,SAAS,EAAE;AACvE,YAAM,IAAI,UAAU,EAAE,UAAU,MAAM,UAAU,MAAM,YAAY,WAAW,SAAS,CAAC;AACvF,cAAQ,WAAW,QAAQ;AAC3B,YAAM,KAAK,EAAE,MAAM,WAAW,OAAO,UAAU,YAAY,MAAM,WAAW,CAAC;AAAA,IAC/E;AAAA,EACF;AAEA,QAAM,OAAO,oBAAI,IAAY;AAC7B,QAAM,WAA0H,CAAC;AACjI,aAAW,SAAS,UAAU,KAAK,GAAG;AACpC,QAAI,KAAK,IAAI,KAAK,EAAG;AACrB,UAAM,UAAU,CAAC,KAAK;AACtB,UAAM,OAAO,oBAAI,IAAY;AAC7B,WAAO,QAAQ,SAAS,GAAG;AACzB,YAAM,MAAM,QAAQ,IAAI;AACxB,UAAI,KAAK,IAAI,GAAG,EAAG;AACnB,WAAK,IAAI,GAAG;AACZ,WAAK,IAAI,GAAG;AACZ,iBAAW,YAAY,UAAU,IAAI,GAAG,KAAK,CAAC,EAAG,SAAQ,KAAK,QAAQ;AAAA,IACxE;AACA,UAAM,eAAe,MAClB,OAAO,CAAC,SAAS,KAAK,IAAI,KAAK,IAAI,KAAK,KAAK,IAAI,KAAK,KAAK,CAAC,EAC5D,IAAI,CAAC,SAAS,KAAK,UAAU;AAChC,aAAS,KAAK;AAAA,MACZ,SAAS,CAAC,GAAG,IAAI,EAAE,IAAI,CAAC,QAAQ,MAAM,IAAI,GAAG,CAAE,EAAE,KAAK,CAAC,MAAM,UAC3D,oBAAoB,MAAM,SAAS,EAAE,cAAc,oBAAoB,OAAO,SAAS,CAAC,CACzF;AAAA,MACD,KAAK,KAAK,IAAI,GAAG,YAAY;AAAA,MAC7B,KAAK,KAAK,IAAI,GAAG,YAAY;AAAA,IAC/B,CAAC;AAAA,EACH;AACA,WAAS,KAAK,CAAC,MAAM,UAAU,MAAM,QAAQ,SAAS,KAAK,QAAQ,UAC9D,oBAAoB,KAAK,QAAQ,CAAC,GAAI,SAAS,EAAE,cAAc,oBAAoB,MAAM,QAAQ,CAAC,GAAI,SAAS,CAAC,CAAC;AACtH,QAAM,UAAU,UAAU,SAAY,SAAS,MAAM,GAAG,KAAK,IAAI;AACjE,MAAI,QAAQ,WAAW,EAAG,QAAO;AACjC,SAAO,QAAQ,IAAI,CAAC,SAAS,UAAU;AACrC,UAAM,aAAa,QAAQ,QAAQ,QAAQ,MACvC,QAAQ,IAAI,QAAQ,CAAC,IACrB,GAAG,QAAQ,IAAI,QAAQ,CAAC,CAAC,IAAI,QAAQ,IAAI,QAAQ,CAAC,CAAC;AACvD,WAAO;AAAA,MACL,WAAW,QAAQ,CAAC,KAAK,QAAQ,QAAQ,MAAM,0BAA0B,UAAU,GAAG,WAAW,8DAA8D,EAAE;AAAA,MACjK,GAAG,QAAQ,QAAQ,IAAI,CAAC,WAAW,KAAK,oBAAoB,QAAQ,SAAS,CAAC,EAAE;AAAA,IAClF,EAAE,KAAK,IAAI;AAAA,EACb,CAAC,EAAE,KAAK,MAAM;AAChB;AAwBA,SAAS,aAAa,QAAkC;AACtD,MAAI,OAAO,0BAA0B,UAAa,OAAO,8BAA8B,OAAW,QAAO;AACzG,MAAI,OAAO,mBAAmB,QAAW;AACvC,WAAO,kCAAkC,OAAO,sBAAsB,QAAQ,CAAC,CAAC,UAAU,OAAO,0BAA0B,QAAQ,CAAC,CAAC;AAAA,EACvI;AACA,SAAO,4BAA4B,OAAO,eAAe,QAAQ,CAAC,CAAC,iBAAiB,OAAO,sBAAsB,QAAQ,CAAC,CAAC,UAAU,OAAO,0BAA0B,QAAQ,CAAC,CAAC;AAClL;AAEA,SAAS,oBACP,QACA,WACQ;AACR,QAAM,OAAO,YAAY,KAAK,IAAI,OAAO,IAAI;AAC7C,SAAO,GAAG,IAAI,GAAG,OAAO,SAAS,IAAI,IAAI,OAAO,SAAS,SAAS,IAAI,OAAO,SAAS,WAAW,OAAO,OAAO,SAAS,aAAa;AACvI;;;ADnGA,IAAM,6BAA6B,CAAC,UAAU,YAAY,aAAa;AAEvE,SAAS,0BAA0B,OAAiD;AAClF,SAAQ,2BAAiD,SAAS,KAAK;AACzE;AAoCA,IAAM,UAAU,MAAM;AACpB,MAAI;AACF,WAAO,UAAU;AAAA,MACf,MAAM,QAAQ,KAAK,MAAM,CAAC;AAAA,MAC1B,kBAAkB;AAAA,MAClB,QAAQ;AAAA,MACR,SAAS;AAAA,QACP,MAAM,EAAE,MAAM,UAAU,SAAS,QAAQ,IAAI,EAAE;AAAA,QAC/C,QAAQ,EAAE,MAAM,SAAS;AAAA,QACzB,OAAO,EAAE,MAAM,SAAS;AAAA,QACxB,UAAU,EAAE,MAAM,SAAS;AAAA,QAC3B,OAAO,EAAE,MAAM,SAAS;AAAA,QACxB,wBAAwB,EAAE,MAAM,SAAS;AAAA,QACzC,qBAAqB,EAAE,MAAM,SAAS;AAAA,QACtC,uBAAuB,EAAE,MAAM,SAAS;AAAA,QACxC,YAAY,EAAE,MAAM,SAAS;AAAA,QAC7B,QAAQ,EAAE,MAAM,SAAS;AAAA,QACzB,eAAe,EAAE,MAAM,SAAS;AAAA,QAChC,gBAAgB,EAAE,MAAM,SAAS;AAAA,QACjC,iBAAiB,EAAE,MAAM,SAAS;AAAA,QAClC,iBAAiB,EAAE,MAAM,SAAS;AAAA,QAClC,aAAa,EAAE,MAAM,WAAW,SAAS,MAAM;AAAA,QAC/C,eAAe,EAAE,MAAM,SAAS;AAAA,QAChC,aAAa,EAAE,MAAM,SAAS;AAAA,QAC9B,OAAO,EAAE,MAAM,SAAS;AAAA,QACxB,QAAQ,EAAE,MAAM,UAAU,OAAO,IAAI;AAAA,QACrC,OAAO,EAAE,MAAM,SAAS;AAAA,QACxB,SAAS,EAAE,MAAM,SAAS;AAAA,QAC1B,WAAW,EAAE,MAAM,SAAS;AAAA,QAC5B,QAAQ,EAAE,MAAM,SAAS;AAAA,QACzB,UAAU,EAAE,MAAM,WAAW,SAAS,MAAM;AAAA,QAC5C,gCAAgC,EAAE,MAAM,WAAW,SAAS,MAAM;AAAA,QAClE,mBAAmB,EAAE,MAAM,WAAW,SAAS,MAAM;AAAA,QACrD,yBAAyB,EAAE,MAAM,WAAW,SAAS,MAAM;AAAA,QAC3D,iBAAiB,EAAE,MAAM,WAAW,SAAS,MAAM;AAAA,QACnD,cAAc,EAAE,MAAM,WAAW,SAAS,MAAM;AAAA,QAChD,WAAW,EAAE,MAAM,WAAW,SAAS,MAAM;AAAA,QAC7C,iBAAiB,EAAE,MAAM,WAAW,SAAS,MAAM;AAAA,QACnD,SAAS,EAAE,MAAM,WAAW,SAAS,MAAM;AAAA,QAC3C,SAAS,EAAE,MAAM,WAAW,SAAS,MAAM;AAAA,QAC3C,MAAM,EAAE,MAAM,WAAW,OAAO,KAAK,SAAS,MAAM;AAAA,MACtD;AAAA,IACF,CAAC;AAAA,EACH,SAAS,OAAO;AACd,YAAQ,OAAO,MAAM,YAAY,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK,CAAC;AAAA,CAAI;AAC3F,YAAQ,KAAK,CAAC;AAAA,EAChB;AACF,GAAG;AAEH,IAAM,CAAC,SAAS,GAAG,WAAW,IAAI,OAAO;AACzC,IAAM,qBAAqB,YAAY,iBAAiB,YAAY,CAAC,IAAI;AAEzE,IAAI,OAAO,OAAO,SAAS;AACzB,QAAM,UAAU,OACZ,WACC,KAAK,MAAM,aAAa,IAAI,IAAI,mBAAmB,YAAY,GAAG,GAAG,MAAM,CAAC,EAA0B;AAC3G,UAAQ,OAAO,MAAM,GAAG,OAAO;AAAA,CAAI;AACnC,UAAQ,KAAK,CAAC;AAChB;AAEA,IAAI,OAAO,OAAO,QAAQ,CAAC,SAAS;AAClC,YAAU;AACV,UAAQ,KAAK,OAAO,OAAO,OAAO,IAAI,CAAC;AACzC;AAMA,IAAM,oBAAoB,oBAAI,IAAY;AAC1C,SAAS,qBAAqB,WAAsD;AAClF,QAAM,WAAW,IAAI,aAAa,WAAW,EAAE,UAAU,KAAK,CAAC;AAC/D,MAAI;AACF,QAAI,CAAC,SAAS,QAAQ,+EAA+E,EAAE,IAAI,GAAG;AAC5G,aAAO,EAAE,QAAQ,GAAG,OAAO,EAAE;AAAA,IAC/B;AACA,UAAM,SAAS,SAAS,QAAQ,+EAA+E,EAAE,IAAI;AACrH,WAAO,EAAE,QAAQ,OAAO,OAAO,MAAM,GAAG,OAAO,OAAO,OAAO,KAAK,EAAE;AAAA,EACtE,UAAE;AACA,aAAS,MAAM;AAAA,EACjB;AACF;AACA,QAAQ,GAAG,QAAQ,MAAM;AACvB,MAAI,OAAO,OAAO,eAAe,EAAG;AACpC,MAAI;AACF,UAAM,UAAU,KAAK,QAAQ,OAAO,OAAO,IAAK;AAChD,UAAM,SAAS,WAAW,SAAS,OAAO,OAAO,MAAM;AACvD,sBAAkB,IAAI,KAAK,QAAQ,OAAO,OAAO,SAAS,OAAO,aAAa,KAAK,KAAK,SAAS,uBAAuB,CAAC,CAAC;AAC1H,QAAI,OAAO,OAAO,cAAc,EAAG,mBAAkB,IAAI,KAAK,QAAQ,OAAO,OAAO,cAAc,CAAC,CAAC;AAAA,EACtG,QAAQ;AAAA,EAER;AACA,aAAW,aAAa,mBAAmB;AACzC,QAAI;AACF,UAAI,CAAC,WAAW,SAAS,EAAG;AAC5B,YAAM,EAAE,QAAQ,MAAM,IAAI,qBAAqB,SAAS;AACxD,UAAI,WAAW,EAAG;AAClB,cAAQ,OAAO,MAAM,qBAAqB,MAAM,oCAAoC,KAAK,8CAA8C,KAAK,UAAU,SAAS,CAAC;AAAA,CAAgE;AAAA,IAClO,QAAQ;AAAA,IAER;AAAA,EACF;AACF,CAAC;AAED,KAAK,KAAK,EAAE,MAAM,CAAC,UAAmB;AACpC,gBAAc;AACd,QAAM,UAAU,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK;AACrE,UAAQ,OAAO,MAAM,YAAY,OAAO;AAAA,CAAI;AAC5C,UAAQ,WAAW,iBAAiB,iBAAiB,IAAI;AAC3D,CAAC;AAED,eAAe,OAAsB;AACnC,qBAAmB;AACnB,QAAM,UAAU,KAAK,QAAQ,OAAO,OAAO,IAAK;AAChD,MAAI,YAAY,UAAU;AACxB,UAAM,UAAU;AAChB;AAAA,EACF;AACA,MAAI,YAAY,UAAU;AACxB,UAAM,UAAU,OAAO;AACvB;AAAA,EACF;AACA,QAAM,SAAS,WAAW,SAAS,OAAO,OAAO,MAAM;AACvD,MAAI,YAAY,gBAAgB;AAC9B,UAAM,YAAY,KAAK,QAAQ,OAAO,OAAO,SAAS,OAAO,aAAa,KAAK,KAAK,SAAS,uBAAuB,CAAC;AACrH,UAAM,EAAE,gBAAgB,IAAI,MAAM,OAAO,wBAAuB;AAChE,UAAM,SAAS,WAAW,SAAS,IAAI,gBAAgB,SAAS,IAAI,CAAC;AACrE,QAAI,aAAa,SAAS,MAAM,WAAW;AACzC,cAAQ,OAAO,MAAM,OAAO,WAAW,IAAI,0BAA0B,GAAG,OAAO;AAAA,QAAI,CAAC,UAClF,GAAG,MAAM,IAAI,GAAG,MAAM,cAAc,OAAO,KAAK,IAAI,MAAM,SAAS,IAAI,MAAM,WAAW,EAAE,IAAI,MAAM,gBAAgB,MAAM,MAAM,aAAa,MAAM,EAAE,IAAI,MAAM,IAAI;AAAA,IAAQ,MAAM,OAAO;AAAA,MAC1L,EAAE,KAAK,IAAI,CAAC;AAAA,CAAI;AAAA,IAClB,MAAO,WAAU,MAAM;AACvB;AAAA,EACF;AACA,QAAM,WAAW,MAAM,eAAe,MAAM;AAC5C,QAAM,WAAW,YAAY,YAAY,YAAY,uBAAuB,MAAM,eAAe,MAAM,IAAI;AAC3G,QAAM,sBAAsB,MAAM,0BAA0B,MAAM;AAClE,QAAM,WAAW,IAAI,iBAAiB;AACtC,QAAM,eAAiC;AAAA,IACrC;AAAA,IACA;AAAA,IACA,aAAa,OAAO,eAAe;AAAA,IACnC,YAAY,CAAC,UAAU,SAAS,OAAO,KAAK;AAAA,IAC5C,GAAI,WAAW,EAAE,SAAS,IAAI,CAAC;AAAA,IAC/B,GAAI,sBAAsB,EAAE,oBAAoB,IAAI,CAAC;AAAA,IACrD,WAAW,MAAM;AAAA,IAAC;AAAA;AAAA,IAClB,GAAI,OAAO,OAAO,SAAS,OAAO,YAAY,EAAE,WAAW,OAAO,OAAO,SAAS,OAAO,UAAU,IAAI,CAAC;AAAA,IACxG,GAAI,OAAO,UAAU,EAAE,SAAS,OAAO,QAAQ,IAAI,CAAC;AAAA,IACpD,GAAI,OAAO,UAAU,EAAE,SAAS,OAAO,QAAQ,IAAI,CAAC;AAAA,IACpD,GAAI,OAAO,cAAc,EAAE,aAAa,OAAO,YAAY,IAAI,CAAC;AAAA,IAChE,GAAI,OAAO,qBAAqB,EAAE,oBAAoB,OAAO,mBAAmB,IAAI,CAAC;AAAA,IACrF,GAAI,OAAO,UAAU,EAAE,SAAS,KAAK,IAAI,CAAC;AAAA,EAC5C;AACA,QAAM,eAAe,YAAY,eAAe,OAAO,OAAO,UAAU,SAAS;AACjF,QAAM,cAAc,MAAM;AAAA,IACxB;AAAA,IACA;AAAA,IACA;AAAA,IACA,OAAO,OAAO,uBAAuB;AAAA,IACrC,OAAO,OAAO,eAAe;AAAA,IAC7B,OAAO,OAAO,YAAY;AAAA,IAC1B,mBAAmB,MAAM;AAAA,EAC3B;AACA,QAAM,EAAE,UAAU,IAAI,MAAM,OAAO,0BAAiB;AACpD,QAAM,QAAQ,IAAI,UAAU,YAAY;AACxC,MAAI;AACF,YAAQ,SAAS;AAAA,MACf,KAAK;AACH,kBAAU,MAAM,OAAO,CAAC;AACxB;AAAA,MACF,KAAK;AACH,YAAI,YAAY,WAAW,EAAG,OAAM,IAAI,eAAe,0CAA0C;AACjG,kBAAU,MAAM,MAAM,YAAY,EAAE,QAAQ,YAAY,CAAC,CAAC;AAC1D;AAAA,MACF,KAAK;AACH,YAAI,YAAY,WAAW,EAAG,OAAM,IAAI,eAAe,0CAA0C;AACjG,kBAAU,MAAM,MAAM,YAAY,EAAE,QAAQ,YAAY,CAAC,CAAC;AAC1D;AAAA,MACF,KAAK,cAAc;AACjB,kBAAU,WAAW;AACrB;AAAA,MACF;AAAA,MACA,KAAK;AACH,kBAAU,MAAM,MAAM,aAAa,EAAE,kBAAkB,OAAO,OAAO,UAAU,CAAC,CAAC;AACjF;AAAA,MACF,KAAK;AACH,kBAAU,uBAAuB,WAAW,MAAM,MAAM,gBAAgB,IAAI,MAAM,oBAAoB,CAAC;AACvG;AAAA,MACF,KAAK;AAAA,MACL,KAAK,sBAAsB;AACzB,cAAM,QAAQ,YAAY,KAAK,GAAG,EAAE,KAAK;AACzC,YAAI,CAAC,MAAO,OAAM,IAAI,eAAe,GAAG,OAAO,oBAAoB;AACnE,cAAM,YAAY,oBAAoB;AACtC,cAAM,YAAY,mBAAmB;AACrC,cAAM,UAAU,OAAO,YAAY,uBAAuB,MAAM,kBAAkB,KAAK,KAAK,IAAI,MAAM,iBAAiB,KAAK,KAAK,GAAG;AAAA,UAClI;AAAA,UACA,GAAI,cAAc,SAAY,EAAE,UAAU,IAAI,CAAC;AAAA,UAC/C,GAAI,OAAO,OAAO,UAAU,SAAY,CAAC,IAAI,EAAE,OAAO,sBAAsB,OAAO,OAAO,OAAO,GAAG,OAAO,EAAE;AAAA,UAC7G,eAAe,UAAU;AAAA,UACzB,GAAI,UAAU,QAAQ,SAAY,EAAE,eAAe,UAAU,IAAI,IAAI,CAAC;AAAA,QACxE,CAAC;AACD,cAAM,SAAS,aAAa,SAAS;AACrC,YAAI,WAAW,WAAY,OAAM,IAAI,eAAe,qDAAqD;AACzG,YAAI,WAAW,WAAW;AACxB,kBAAQ,OAAO,MAAM,GAAG,YAAY,uBAChC,QAAQ,IAAI,CAAC,UAAU,GAAG,wBAAwB,CAAC,KAAK,CAAC,CAAC;AAAA,IAAO,MAAM,SAAS,WAAW,EAAE,EAAE,KAAK,IAAI,IACxG,wBAAwB,OAAO,CAAC;AAAA,CAAI;AAAA,QAC1C,MAAO,WAAU,QAAQ,IAAI,YAAY,CAAC;AAC1C;AAAA,MACF;AAAA,MACA,KAAK;AACH,cAAM,eAAe,OAAO,cAAc,QAAQ;AAClD;AAAA,MACF;AACE,cAAM,IAAI,eAAe,oBAAoB,OAAO,EAAE;AAAA,IAC1D;AAAA,EACF,UAAE;AACA,UAAM,MAAM;AAAA,EACd;AACF;AAEA,eAAe,eACb,QACA,eACA,UACe;AACf,QAAM,aAAa,OAAO,OAAO,aAAa;AAC9C,QAAM,aAAa,OAAO,OAAO,cAAc;AAC/C,MAAK,cAAc,CAAC,cAAgB,CAAC,cAAc,YAAa;AAC9D,UAAM,IAAI,eAAe,oEAAoE;AAAA,EAC/F;AACA,QAAM,gBAAgB,aAAa,KAAK,QAAQ,UAAU,IAAI;AAC9D,QAAM,qBAAqB,aAAa,KAAK,QAAQ,UAAU,IAAI;AACnE,QAAM,qBAAqB,kBAAkB,OAAO,WAAW,uBAAuB,OAAO;AAC7F,QAAM,eAAe,iBAAiB,CAAC,qBACnC,WAAW,eAAe,OAAO,OAAO,eAAe,CAAC,IACxD;AACJ,QAAM,4BAA4B,eAAe,MAAM,0BAA0B,YAAY,IAAI;AACjG,QAAM,gBAA8C,iBAAiB,sBAAsB,CAAC,qBAAqB;AAAA,IAC/G,SAAS;AAAA,IACT,WAAW;AAAA,IACX;AAAA,IACA,GAAI,cAAc,gBAAgB,SAAY,EAAE,aAAa,cAAc,YAAY,IAAI,CAAC;AAAA,IAC5F,GAAI,cAAc,aAAa,EAAE,YAAY,cAAc,WAAW,IAAI,CAAC;AAAA,IAC3E,GAAI,cAAc,YAAY,EAAE,WAAW,cAAc,UAAU,IAAI,CAAC;AAAA,IACxE,GAAI,cAAc,UAAU,EAAE,SAAS,aAAa,QAAQ,IAAI,CAAC;AAAA,IACjE,GAAI,cAAc,UAAU,EAAE,SAAS,aAAa,QAAQ,IAAI,CAAC;AAAA,IACjE,GAAI,cAAc,cAAc,EAAE,aAAa,aAAa,YAAY,IAAI,CAAC;AAAA,IAC7E,GAAI,cAAc,qBAAqB,EAAE,oBAAoB,aAAa,mBAAmB,IAAI,CAAC;AAAA,IAClG,GAAI,cAAc,UAAU,EAAE,SAAS,KAAK,IAAI,CAAC;AAAA,IACjD,GAAI,4BAA4B,EAAE,qBAAqB,0BAA0B,IAAI,CAAC;AAAA,EACxF,IAAI;AACJ,MAAI,eAAe;AACjB,UAAM;AAAA,MACJ;AAAA,MACA;AAAA,MACA;AAAA,MACA,OAAO,OAAO,uBAAuB;AAAA,MACrC,OAAO,OAAO,eAAe;AAAA,MAC7B,OAAO,OAAO,YAAY;AAAA,MAC1B,mBAAmB,YAAa;AAAA,IAClC;AAAA,EACF;AACA,QAAM,EAAE,WAAW,eAAe,IAAI,MAAM,OAAO,0BAAiB;AACpE,QAAM,EAAE,YAAY,IAAI,MAAM,OAAO,4BAA0B;AAC/D,QAAM,SAAS,gBAAgB,IAAI,eAAe,EAAE,GAAG,eAAe,UAAU,KAAK,CAAC,IAAI;AAC1F,QAAM,SAAS,aAAa,OAAO,OAAO,WAAW,YAAY,UAAU;AAC3E,QAAM,YAAY,oBAAoB;AACtC,QAAM,gBAAgB,cAAc;AACpC,QAAM,cAAc,OAAO,OAAO,UAAU,SACxC,SACA,sBAAsB,OAAO,OAAO,OAAO,GAAG,OAAO;AACzD,QAAM,gBAAoC;AAAA,IACxC;AAAA,IACA,GAAI,SAAS,EAAE,OAAO,IAAI,CAAC;AAAA,IAC3B,cAAc,wBAAwB;AAAA,IACtC,kBAAkB,sBAAsB,OAAO,OAAO,SAAS,GAAG,SAAS;AAAA,IAC3E,eAAe,UAAU;AAAA,IACzB,GAAI,UAAU,QAAQ,SAAY,EAAE,eAAe,UAAU,IAAI,IAAI,CAAC;AAAA,IACtE,4BAA4B,OAAO,OAAO,8BAA8B;AAAA,IACxE,eAAe,OAAO,OAAO,iBAAiB;AAAA,IAC9C,UAAU,OAAO,OAAO;AAAA,IACxB,UAAU,aAAa;AAAA;AAAA,IAEvB,GAAI,gBAAgB;AAAA,MAClB,YAAY,CAAC,UACX,cAAc,EAAE,OAAO,gBAAgB,GAAG,MAAM,CAAC;AAAA,IACrD,IAAI,CAAC;AAAA,EACP;AACA,MAAI;AACF,QAAI,WAAW,YAAY;AACzB,YAAM,UAA+B,CAAC;AACtC,uBAAiB,UAAU,YAAY,aAAa,EAAG,SAAQ,KAAK,MAAM;AAC1E,cAAQ,OAAO,MAAM,GAAG,yBAAyB,SAAS,CAAC,QAAQ,WAAW,CAAC;AAAA,CAAI;AACnF;AAAA,IACF;AACA,QAAI,UAAU;AACd,qBAAiB,UAAU,YAAY,aAAa,GAAG;AACrD,UAAI,gBAAgB,UAAa,WAAW,YAAa;AACzD,UAAI,WAAW,WAAW;AACxB,gBAAQ,OAAO,MAAM,GAAG,wBAAwB,OAAO,SAAS,OAAO,MAAM,CAAC;AAAA,CAAI;AAAA,MACpF,OAAO;AACL,gBAAQ,OAAO,MAAM,GAAG,KAAK,UAAU;AAAA,UACrC,QAAQ,gBAAgB,OAAO,MAAM;AAAA,UACrC,SAAS,OAAO,QAAQ,IAAI,YAAY;AAAA,UACxC,SAAS,OAAO;AAAA,QAClB,CAAC,CAAC;AAAA,CAAI;AAAA,MACR;AACA,iBAAW;AAAA,IACb;AAAA,EACF,UAAE;AACA,YAAQ,MAAM;AAAA,EAChB;AACF;AAEA,eAAe,mBACb,SACA,OACA,QACA,qBACA,cACA,WACA,OACsB;AACtB,oBAAkB,IAAI,iBAAiB,OAAO,CAAC;AAC/C,QAAM,cAAc,MAAM,uBAAuB,SAAS,OAAO,QAAQ,WAAW,KAAK;AACzF,MAAI,YAAa,QAAO;AACxB,QAAM,EAAE,UAAU,IAAI,MAAM,OAAO,0BAAiB;AACpD,MAAI;AACF,UAAM,QAAQ,IAAI,UAAU,OAAO;AACnC,QAAI;AACF,YAAM,OAAO,gBAAgB,KAAK;AAClC,YAAM,QAAQ,MAAM,aAAa,OAAO,OAAO,QAAQ,qBAAqB,SAAS;AACrF,YAAM,OAAO,eAAe,KAAK;AACjC,aAAO;AAAA,IACT,UAAE;AACA,YAAM,MAAM;AAAA,IACd;AAAA,EACF,SAAS,OAAO;AACd,QAAI,CAAC,gBAAgB,EAAE,iBAAiB,wBAAyB,OAAM;AACvE,YAAQ,OAAO;AAAA,MACb,qBAAqB,KAAK,qBAAqB,MAAM,OAAO;AAAA;AAAA,IAC9D;AACA,UAAM,YAAY,iBAAiB,OAAO;AAC1C,UAAM,qBAAqB,6BAA6B,WAAW,QAAQ,OAAO;AAClF,QAAI;AACF,YAAM,EAAE,gBAAgB,IAAI,MAAM,OAAO,wBAAuB;AAChE,sBAAgB,WAAW,QAAQ,SAAS,QAAQ,SAAS,OAAO;AAAA,IACtE,SAAS,YAAY;AACnB,UAAI,EAAE,sBAAsB,wBAAyB,OAAM;AAC3D,2BAAqB,SAAS;AAAA,IAChC;AACA,WAAO,gBAAgB,SAAS,WAAW,OAAO,QAAQ,WAAW,oBAAoB,KAAK;AAAA,EAChG;AACF;AAEA,eAAe,uBACb,SACA,OACA,QACA,WACA,OAC6B;AAC7B,QAAM,YAAY,iBAAiB,OAAO;AAC1C,MAAI,WAAW,SAAS,EAAG,QAAO;AAElC,UAAQ,OAAO;AAAA,IACb,YAAY,KAAK,iBAAiB,SAAS,qCAAqC,MAAM,GAAG,YAAY,KAAK,uBAAuB;AAAA;AAAA,EACnI;AACA,SAAO,gBAAgB,SAAS,WAAW,OAAO,QAAQ,WAAW,MAAM,KAAK;AAClF;AAEA,eAAe,gBACb,SACA,WACA,OACA,QACA,WACA,qBAAgD,MAChD,OACsB;AACtB,QAAM,EAAE,UAAU,IAAI,MAAM,OAAO,0BAAiB;AACpD,QAAM,6BAA6B,sBAAsB,CAAC,QAAQ,sBAC9D,MAAM,0BAA0B;AAAA,IAChC,qBAAqB,mBAAmB;AAAA,IACxC,kBAAkB,mBAAmB;AAAA,IACrC,aAAa,QAAQ,eAAe;AAAA,IACpC,GAAI,QAAQ,UAAU,EAAE,SAAS,KAAK,IAAI,CAAC;AAAA,EAC7C,CAAC,IACC;AACJ,QAAM,QAAQ,IAAI,UAAU;AAAA,IAC1B,GAAG;AAAA,IAAS;AAAA,IACZ,GAAI,6BAA6B,EAAE,qBAAqB,2BAA2B,IAAI,CAAC;AAAA,EAC1F,CAAC;AACD,MAAI;AACF,QAAI,mBAAoB,OAAM,MAAM,gBAAgB;AACpD,UAAM,OAAO,gBAAgB,KAAK;AAClC,UAAM,QAAQ,MAAM,aAAa,OAAO,OAAO,QAAQ,OAAO,SAAS;AACvE,UAAM,OAAO,eAAe,KAAK;AACjC,WAAO;AAAA,EACT,UAAE;AACA,UAAM,MAAM;AAAA,EACd;AACF;AAEA,SAAS,6BAA6B,WAAmB,SAA4C;AACnG,QAAM,KAAK,IAAI,aAAa,WAAW,EAAE,UAAU,KAAK,CAAC;AACzD,MAAI;AACF,UAAM,WAAW,IAAI,IAAK,GAAG,QAAQ,iCAAiC,EAAE,IAAI,EACzE,IAAI,CAAC,QAAQ,CAAC,IAAI,KAAK,IAAI,KAAK,CAAC,CAAC;AACrC,QAAI,SAAS,IAAI,UAAU,MAAM,KAAK,QAAQ,OAAO,KAAK,SAAS,IAAI,sBAAsB,MAAM,OAAQ,QAAO;AAClH,UAAM,UAAU,KAAK,MAAM,SAAS,IAAI,qBAAqB,CAAE;AAC/D,QAAI,CAAC,0BAA0B,QAAQ,QAAQ,GAAG;AAChD,YAAM,IAAI,eAAe,qGAAqG;AAAA,IAChI;AACA,WAAO;AAAA,EACT,UAAE;AACA,OAAG,MAAM;AAAA,EACX;AACF;AAEA,eAAe,aACb,OACA,OACA,QACA,qBACA,WACsB;AACtB,MAAI;AACF,WAAO,MAAM,MAAM,cAAc,EAAE,QAAQ,qBAAqB,oBAAoB,CAAC,UAAU,CAAC;AAAA,EAClG,SAAS,OAAO;AACd,QAAI,EAAE,iBAAiB,qBAAsB,OAAM;AACnD,UAAM,SAAS,MAAM,OAAO;AAC5B,QAAI,aAAa,OAAO,YAAY,GAAG;AACrC,cAAQ,OAAO;AAAA,QACb,wDAAwD,KAAK;AAAA;AAAA,MAC/D;AACA,aAAO;AAAA,QACL,cAAc;AAAA,QACd,cAAc;AAAA,QACd,gBAAgB;AAAA,QAChB,kBAAkB;AAAA,QAClB,kBAAkB;AAAA,QAClB,mBAAmB;AAAA,QACnB,YAAY,OAAO;AAAA,MACrB;AAAA,IACF;AACA,YAAQ,OAAO;AAAA,MACb,wDAAwD,KAAK;AAAA;AAAA,IAC/D;AACA,WAAO,MAAM,MAAM,sBAAsB;AAAA,EAC3C;AACF;AAEA,SAAS,iBAAiB,SAAmC;AAC3D,SAAO,KAAK,QAAQ,QAAQ,aAAa,KAAK,KAAK,KAAK,QAAQ,QAAQ,OAAO,GAAG,YAAY,cAAc,CAAC;AAC/G;AAEA,SAAS,qBAAqB,WAAyB;AACrD,aAAW,UAAU,CAAC,IAAI,QAAQ,QAAQ,UAAU,EAAG,QAAO,GAAG,SAAS,GAAG,MAAM,IAAI,EAAE,OAAO,KAAK,CAAC;AACxG;AAEA,SAAS,WAAW,SAAiB,gBAAqC;AACxE,QAAM,aAAa,KAAK,QAAQ,kBAAkB,KAAK,KAAK,SAAS,YAAY,aAAa,CAAC;AAC/F,MAAI,CAAC,WAAW,UAAU,EAAG,QAAO,kBAAkB,CAAC,CAAC;AACxD,QAAM,QAAQ,KAAK,MAAM,aAAa,YAAY,MAAM,CAAC;AACzD,SAAO,kBAAkB,KAAK;AAChC;AAEA,SAAS,kBAAkB,QAAgC;AACzD,QAAM,aAAa,OAAO,OAAO,aAC7B,aAAa,OAAO,OAAO,YAAY,GAAG,YAAY,IACtD,OAAO;AACX,QAAM,gBAAgB,OAAO,OAAO,YAAY,OAAO;AACvD,MAAI,kBAAkB,UAAa,kBAAkB,YAAY,kBAAkB,QAAQ;AACzF,UAAM,IAAI,eAAe,yBAAyB,aAAa,EAAE;AAAA,EACnE;AACA,QAAM,WAAmC,kBAAkB,YAAY,kBAAkB,SACrF,gBACA;AACJ,QAAM,2BAA2B,OAAO,OAAO,sBAAsB,KAAK,OAAO;AACjF,MAAI,6BAA6B,UAAa,CAAC,0BAA0B,wBAAwB,GAAG;AAClG,UAAM,IAAI,eAAe,qCAAqC,wBAAwB,EAAE;AAAA,EAC1F;AACA,MAAI,OAAO,qBAAqB,UAAa,OAAO,OAAO,qBAAqB,WAAW;AACzF,UAAM,IAAI,eAAe,qCAAqC;AAAA,EAChE;AACA,MAAI,OAAO,gBAAgB,WAAc,CAAC,OAAO,UAAU,OAAO,WAAW,KAAK,OAAO,cAAc,IAAI;AACzG,UAAM,IAAI,eAAe,yCAAyC;AAAA,EACpE;AACA,MAAI,OAAO,YAAY,UAAa,OAAO,OAAO,YAAY,WAAW;AACvE,UAAM,IAAI,eAAe,4BAA4B;AAAA,EACvD;AACA,MAAI,OAAO,qBAAqB,MAAM;AACpC,QAAI,OAAO,qBAAqB,YAAY,OAAO,qBAAqB,UAAU,OAAO,qBAAqB,UAAU;AACtH,YAAM,IAAI,eAAe,kCAAkC,OAAO,OAAO,gBAAgB,CAAC,EAAE;AAAA,IAC9F;AACA,QAAI,OAAO,kBAAkB,WACvB,OAAO,OAAO,kBAAkB,YAAY,CAAC,OAAO,cAAc,KAAK,IAAI;AAC/E,YAAM,IAAI,eAAe,2CAA2C;AAAA,IACtE;AACA,QAAI,OAAO,qBAAqB,YAAY,OAAO,uBAAuB,WACpE,OAAO,OAAO,uBAAuB,YAAY,CAAC,OAAO,UAAU,OAAO,kBAAkB,KAAK,OAAO,qBAAqB,IAAI;AACrI,YAAM,IAAI,eAAe,gDAAgD;AAAA,IAC3E;AACA,QAAI,OAAO,qBAAqB,YAAY,OAAO,OAAO,uBAAuB,YAAY,OAAO,qBAAqB,KAAK;AAC5H,YAAM,IAAI,eAAe,yCAAyC;AAAA,IACpE;AAAA,EACF;AACA,SAAO;AAAA,IACL,GAAG;AAAA,IACH,GAAI,WAAW,EAAE,SAAS,IAAI,CAAC;AAAA,IAC/B,GAAI,OAAO,OAAO,QAAQ,EAAE,OAAO,OAAO,OAAO,MAAM,IAAI,CAAC;AAAA,IAC5D,GAAI,2BAA2B,EAAE,qBAAqB,yBAAyB,IAAI,CAAC;AAAA,IACpF,GAAI,OAAO,OAAO,mBAAmB,IAAI,EAAE,kBAAkB,OAAO,OAAO,mBAAmB,EAAE,IAAI,CAAC;AAAA,IACrG,GAAI,aAAa,EAAE,WAAW,IAAI,CAAC;AAAA,IACnC,GAAI,OAAO,OAAO,UAAU,EAAE,SAAS,KAAK,IAAI,CAAC;AAAA,EACnD;AACF;AAEA,eAAe,0BAA0B,QAAmF;AAC1H,MAAI,CAAC,OAAO,uBAAuB,CAAC,OAAO,iBAAkB,QAAO;AACpE,QAAM,EAAE,0BAA0B,IAAI,MAAM,OAAO,sBAA0B;AAC7E,SAAO,IAAI,0BAA0B;AAAA,IACnC,GAAI,OAAO,sBAAsB,EAAE,UAAU,OAAO,oBAAoB,IAAI,CAAC;AAAA,IAC7E,GAAI,OAAO,mBAAmB,EAAE,OAAO,OAAO,iBAAiB,IAAI,CAAC;AAAA,IACpE,aAAa,OAAO,eAAe;AAAA,IACnC,GAAI,OAAO,UAAU,EAAE,SAAS,KAAK,IAAI,CAAC;AAAA,EAC5C,CAAC;AACH;AAEA,SAAS,mBAAmB,QAAyD;AACnF,MAAI,YAAY,gBAAgB;AAC9B,WAAO,uBAAuB,YAC1B,EAAE,eAAe,CAAC,UAAU;AAAE,YAAM,oBAAoB;AAAA,IAAG,EAAE,IAC7D,yBAAyB,KAAK;AAAA,EACpC;AACA,MAAI,OAAO,wBAAwB,KAAM,QAAO,yBAAyB;AACzE,MAAI,OAAO,wBAAwB,MAAO,QAAO,EAAE,eAAe,CAAC,UAAU;AAAE,UAAM,oBAAoB;AAAA,EAAG,EAAE;AAC9G,SAAO;AACT;AAEA,SAAS,yBAAyB,eAAe,MAA+B;AAC9E,SAAO;AAAA,IACL,GAAI,eAAe,EAAE,cAAc,OAAO,UAAqB;AAAE,YAAM,MAAM,gBAAgB;AAAA,IAAG,EAAE,IAAI,CAAC;AAAA,EACzG;AACF;AAEA,eAAe,YAA2B;AACxC,QAAM,qBAAqB,YAAY,CAAC;AACxC,QAAM,iBAAiB,OAAO,OAAO,sBAAsB;AAC3D,MAAI,sBAAsB,kBAAkB,uBAAuB,gBAAgB;AACjF,UAAM,IAAI,eAAe,+EAA+E;AAAA,EAC1G;AACA,QAAM,YAAY,sBAAsB;AACxC,MAAI,cAAc,UAAa,CAAC,8BAA8B,SAAS,GAAG;AACxE,UAAM,IAAI,eAAe,kDAAkD;AAAA,EAC7E;AACA,QAAM,YAA2C,YAAY,CAAC,SAAS,IAAI,CAAC,YAAY,aAAa;AACrG,QAAM,UAAU,MAAM,QAAQ,IAAI,UAAU,IAAI,oBAAoB,CAAC,GAAG,KAAK;AAC7E,QAAM,SAAS,aAAa,SAAS;AACrC,MAAI,WAAW,WAAY,OAAM,IAAI,eAAe,qDAAqD;AACzG,MAAI,WAAW,OAAQ,WAAU,MAAM;AAAA,MAClC,SAAQ,OAAO,MAAM,GAAG,OAAO,IAAI,CAAC,EAAE,UAAU,MAAM,MAAM,GAAG,QAAQ,IAAI,KAAK,EAAE,EAAE,KAAK,IAAI,CAAC;AAAA,CAAI;AACzG;AAEA,eAAe,UAAU,SAAgC;AACvD,QAAM,aAAa,KAAK,QAAQ,OAAO,OAAO,UAAU,KAAK,KAAK,SAAS,YAAY,aAAa,CAAC;AACrG,QAAM,SAAS,eAAe,UAAU;AACxC,QAAM,SAAS,YAAY,CAAC;AAC5B,MAAI;AACJ,MAAI,WAAW,gBAAgB;AAC7B,WAAO,sBAAsB,YAAY,CAAC,MAAM;AAChD,aAAS,EAAE,qBAAqB,OAAO,oBAAoB;AAAA,EAC7D,WAAW,WAAW,SAAS;AAC7B,UAAM,WAAW,MAAM,uBAAuB,YAAY,CAAC,CAAC;AAC5D,WAAO,sBAAsB,SAAS;AACtC,WAAO,mBAAmB,SAAS;AACnC,aAAS,EAAE,qBAAqB,SAAS,UAAU,kBAAkB,SAAS,MAAM;AAAA,EACtF,WAAW,WAAW,eAAe;AACnC,UAAM,cAAc,OAAO,YAAY,CAAC,CAAC;AACzC,WAAO,cAAc;AACrB,aAAS,EAAE,YAAY;AAAA,EACzB,OAAO;AACL,UAAM,WAAW,YAAY,CAAC;AAC9B,QAAI,aAAa,WAAW;AAC1B,aAAO,mBAAmB;AAC1B,eAAS,EAAE,kBAAkB,MAAM;AAAA,IACrC,OAAO;AACL,YAAM,eAAe,OAAO,qBAAqB;AACjD,YAAM,eAAe,aAAa,WAC9B,oBACA,aAAa,SAAS,uBAAuB;AACjD,YAAM,QAAQ,YAAY,CAAC,MACrB,gBAAgB,OAAO,OAAO,kBAAkB,YAAY,OAAO,cAAc,KAAK,IAAI,OAAO,gBAAgB;AACvH,aAAO,mBAAmB;AAC1B,aAAO,gBAAgB;AACvB,UAAI,aAAa,UAAU;AACzB,cAAM,kBAAkB,gBAAgB,OAAO,OAAO,uBAAuB,YACxE,OAAO,UAAU,OAAO,kBAAkB,KAAK,OAAO,qBAAqB,IAC5E,OAAO,qBACP;AACJ,eAAO,qBAAqB;AAAA,UAC1B,OAAO,OAAO,qBAAqB;AAAA,UAAG;AAAA,UAAiB;AAAA,QACzD;AAAA,MACF,OAAO;AACL,eAAO,OAAO;AAAA,MAChB;AACA,aAAO,mBAAmB;AAC1B,eAAS;AAAA,QACP,kBAAkB;AAAA,QAClB,kBAAkB;AAAA,QAClB,eAAe;AAAA,QACf,GAAI,aAAa,WAAW,EAAE,oBAAoB,OAAO,mBAAmB,IAAI,CAAC;AAAA,MACnF;AAAA,IACF;AAAA,EACF;AACA,kBAAgB,YAAY,MAAM;AAClC,QAAM,SAAS,aAAa,SAAS;AACrC,MAAI,WAAW,WAAY,OAAM,IAAI,eAAe,qDAAqD;AACzG,MAAI,WAAW,OAAQ,WAAU,EAAE,YAAY,GAAG,OAAO,CAAC;AAAA,MACrD,SAAQ,OAAO,MAAM,WAAW,UAAU,KAAK,OAAO,QAAQ,MAAM,EAAE,IAAI,CAAC,CAAC,KAAK,KAAK,MAAM,GAAG,GAAG,IAAI,KAAK,EAAE,EAAE,KAAK,GAAG,CAAC;AAAA,CAAI;AACnI;AAEA,eAAe,uBAAuB,iBAA8D;AAClG,QAAM,cAAc,OAAO,OAAO,mBAAmB;AACrD,MAAI,mBAAmB,eAAe,oBAAoB,aAAa;AACrE,UAAM,IAAI,eAAe,kFAAkF;AAAA,EAC7G;AACA,MAAI,YAAY,mBAAmB;AACnC,MAAI,CAAC,UAAW,OAAM,IAAI,eAAe,+DAA+D;AACxG,MAAI,WAAW,OAAO,OAAO,sBAAsB;AACnD,QAAM,YAAY,UAAU,QAAQ,GAAG;AACvC,MAAI,cAAc,IAAI;AACpB,UAAM,oBAAoB,UAAU,MAAM,GAAG,SAAS;AACtD,gBAAY,UAAU,MAAM,YAAY,CAAC;AACzC,QAAI,YAAY,aAAa,mBAAmB;AAC9C,YAAM,IAAI,eAAe,2EAA2E;AAAA,IACtG;AACA,eAAW;AAAA,EACb;AACA,MAAI,CAAC,UAAW,OAAM,IAAI,eAAe,6CAA6C;AACtF,MAAI,aAAa,QAAW;AAC1B,QAAI,CAAC,8BAA8B,QAAQ,GAAG;AAC5C,YAAM,IAAI,eAAe,wDAAwD;AAAA,IACnF;AACA,UAAM,SAAS,MAAM,qBAAqB,QAAQ;AAClD,QAAI,CAAC,OAAO,KAAK,CAAC,EAAE,MAAM,MAAM,UAAU,SAAS,GAAG;AACpD,YAAM,IAAI,eAAe,WAAW,QAAQ,WAAW,SAAS,EAAE;AAAA,IACpE;AACA,WAAO,EAAE,UAAU,OAAO,UAAU;AAAA,EACtC;AACA,QAAM,WAAW,MAAM,QAAQ,IAAI;AAAA,IACjC,qBAAqB,UAAU;AAAA,IAC/B,qBAAqB,aAAa;AAAA,EACpC,CAAC,GAAG,KAAK,EAAE,OAAO,CAAC,EAAE,MAAM,MAAM,UAAU,SAAS;AACpD,MAAI,QAAQ,WAAW,EAAG,OAAM,IAAI,eAAe,2BAA2B,SAAS,EAAE;AACzF,MAAI,QAAQ,SAAS,GAAG;AACtB,UAAM,IAAI,eAAe,SAAS,SAAS,4DAA4D;AAAA,EACzG;AACA,SAAO,QAAQ,CAAC;AAClB;AAEA,eAAe,qBAAqB,UAAkE;AACpG,QAAM,EAAE,2BAA2B,IAAI,MAAM,OAAO,sBAA0B;AAC9E,QAAM,MAAM,GAAG,2BAA2B,QAAQ,CAAC;AACnD,MAAI;AACJ,MAAI;AACF,eAAW,MAAM,MAAM,GAAG;AAAA,EAC5B,SAAS,OAAO;AACd,UAAM,IAAI,eAAe,mBAAmB,QAAQ,YAAY,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK,CAAC,IAAI,EAAE,OAAO,MAAM,CAAC;AAAA,EAC5I;AACA,MAAI,CAAC,SAAS,IAAI;AAChB,UAAM,IAAI,eAAe,mBAAmB,QAAQ,YAAY,SAAS,MAAM,OAAO,MAAM,SAAS,KAAK,GAAG,MAAM,GAAG,GAAG,CAAC,EAAE;AAAA,EAC9H;AACA,MAAI;AACJ,MAAI;AACF,WAAO,MAAM,SAAS,KAAK;AAAA,EAC7B,SAAS,OAAO;AACd,UAAM,IAAI,eAAe,GAAG,QAAQ,qCAAqC,EAAE,OAAO,MAAM,CAAC;AAAA,EAC3F;AACA,MAAI,CAAC,MAAM,QAAQ,KAAK,IAAI,KAAK,KAAK,KAAK,KAAK,CAAC,SAAS,OAAO,KAAK,OAAO,YAAY,KAAK,GAAG,WAAW,CAAC,GAAG;AAC9G,UAAM,IAAI,eAAe,GAAG,QAAQ,mCAAmC;AAAA,EACzE;AACA,SAAO,CAAC,GAAG,IAAI,IAAI,KAAK,KAAK,IAAI,CAAC,SAAS,KAAK,EAAY,CAAC,CAAC,EAAE,IAAI,CAAC,WAAW,EAAE,UAAU,MAAM,EAAE;AACtG;AAEA,SAAS,8BAA8B,OAAqD;AAC1F,SAAO,UAAU,cAAc,UAAU;AAC3C;AAEA,SAAS,eAAe,YAAgC;AACtD,MAAI,CAAC,WAAW,UAAU,EAAG,QAAO,CAAC;AACrC,QAAM,QAAQ,KAAK,MAAM,aAAa,YAAY,MAAM,CAAC;AACzD,MAAI,CAAC,SAAS,OAAO,UAAU,YAAY,MAAM,QAAQ,KAAK,GAAG;AAC/D,UAAM,IAAI,eAAe,sCAAsC,UAAU,EAAE;AAAA,EAC7E;AACA,SAAO;AACT;AAEA,SAAS,gBAAgB,YAAoB,QAA0B;AACrE,YAAU,KAAK,QAAQ,UAAU,GAAG,EAAE,WAAW,KAAK,CAAC;AACvD,QAAM,gBAAgB,GAAG,UAAU,QAAQ,QAAQ,GAAG;AACtD,gBAAc,eAAe,GAAG,KAAK,UAAU,QAAQ,MAAM,CAAC,CAAC;AAAA,CAAI;AACnE,aAAW,eAAe,UAAU;AACtC;AAEA,eAAe,eAAe,QAAgD;AAC5E,OAAK,OAAO,YAAY,cAAc,QAAQ;AAC5C,UAAM,EAAE,sBAAsB,IAAI,MAAM,OAAO,oBAAsB;AACrE,WAAO,IAAI,sBAAsB;AAAA,MAC/B,GAAI,OAAO,QAAQ,EAAE,OAAO,OAAO,MAAM,IAAI,CAAC;AAAA,MAC9C,GAAI,OAAO,aAAa,EAAE,YAAY,OAAO,WAAW,IAAI,CAAC;AAAA,MAC7D,aAAa,OAAO,eAAe;AAAA,MACnC,GAAI,OAAO,UAAU,EAAE,SAAS,KAAK,IAAI,CAAC;AAAA,IAC5C,CAAC;AAAA,EACH;AACA,QAAM,EAAE,wBAAwB,IAAI,MAAM,OAAO,sBAAwB;AACzE,SAAO,IAAI,wBAAwB;AAAA,IACjC,GAAI,OAAO,QAAQ,EAAE,OAAO,OAAO,MAAM,IAAI,CAAC;AAAA,IAC9C,GAAI,OAAO,aAAa,EAAE,YAAY,OAAO,WAAW,IAAI,CAAC;AAAA,IAC7D,aAAa,OAAO,eAAe;AAAA,IACnC,GAAI,OAAO,UAAU,EAAE,SAAS,KAAK,IAAI,CAAC;AAAA,EAC5C,CAAC;AACH;AAEA,eAAe,eAAe,QAAmD;AAC/E,MAAI,OAAO,qBAAqB,KAAM,QAAO;AAC7C,MAAI,OAAO,qBAAqB,YAAY,OAAO,qBAAqB,QAAQ;AAC9E,UAAM,EAAE,gBAAgB,aAAa,IAAI,MAAM,OAAO,sBAAuB;AAC7E,QAAI,OAAO,qBAAqB,UAAU;AACxC,aAAO,IAAI,eAAe;AAAA,QACxB,GAAI,OAAO,gBAAgB,EAAE,OAAO,OAAO,cAAc,IAAI,CAAC;AAAA,QAC9D,GAAI,OAAO,UAAU,EAAE,SAAS,KAAK,IAAI,CAAC;AAAA,MAC5C,CAAC;AAAA,IACH;AACA,WAAO,IAAI,aAAa;AAAA,MACtB,GAAI,OAAO,gBAAgB,EAAE,OAAO,OAAO,cAAc,IAAI,CAAC;AAAA,MAC9D,GAAI,OAAO,UAAU,EAAE,SAAS,KAAK,IAAI,CAAC;AAAA,IAC5C,CAAC;AAAA,EACH;AACA,MAAI,OAAO,qBAAqB,UAAU;AACxC,UAAM,EAAE,kBAAkB,IAAI,MAAM,OAAO,sBAAuB;AAClE,WAAO,IAAI,kBAAkB;AAAA,MAC3B,GAAI,OAAO,gBAAgB,EAAE,OAAO,OAAO,cAAc,IAAI,CAAC;AAAA,MAC9D,GAAI,OAAO,qBAAqB,EAAE,gBAAgB,OAAO,mBAAmB,IAAI,CAAC;AAAA,MACjF,GAAI,OAAO,UAAU,EAAE,SAAS,KAAK,IAAI,CAAC;AAAA,IAC5C,CAAC;AAAA,EACH;AACA,QAAM,IAAI,eAAe,6DAA6D;AACxF;AAEA,SAAS,aAAa,OAA2B,cAAsB,MAAsB;AAC3F,MAAI,UAAU,OAAW,QAAO;AAChC,QAAM,cAAc,OAAO,KAAK;AAChC,MAAI,CAAC,OAAO,SAAS,WAAW,EAAG,OAAM,IAAI,eAAe,GAAG,IAAI,oBAAoB;AACvF,SAAO;AACT;AAEA,SAAS,qBAA2B;AAClC,MAAI,OAAO,OAAO,qBAAqB,MAAM,WACvC,YAAY,YAAY,YAAY,CAAC,MAAM,cAAc,YAAY,CAAC,MAAM,WAAW;AAC3F,UAAM,IAAI,eAAe,sEAAsE;AAAA,EACjG;AACA,MAAI,OAAO,OAAO,YAAY,YAAY,gBAAgB;AACxD,UAAM,IAAI,eAAe,gDAAgD;AAAA,EAC3E;AACA,MAAI,OAAO,OAAO,YAAY,UAAa,YAAY,gBAAgB;AACrE,UAAM,IAAI,eAAe,+CAA+C;AAAA,EAC1E;AACA,QAAM,YAAY,mBAAmB;AACrC,MAAI,cAAc,QAAW;AAC3B,QAAI,CAAC,CAAC,UAAU,sBAAsB,cAAc,EAAE,SAAS,OAAQ,GAAG;AACxE,YAAM,IAAI,eAAe,yFAAyF;AAAA,IACpH;AACA,qBAAiB,WAAW,OAAO,OAAO,UAAU,SAAY,kBAAkB,mBAAmB;AAAA,EACvG;AACA,UAAQ,SAAS;AAAA,IACf,KAAK;AACH,UAAI,YAAY,SAAS,EAAG,OAAM,IAAI,eAAe,sCAAsC;AAC3F,UAAI,aAAa,SAAS,MAAM,WAAY,OAAM,IAAI,eAAe,qDAAqD;AAC1H;AAAA,IACF,KAAK;AACH,UAAI,aAAa,SAAS,MAAM,WAAY,OAAM,IAAI,eAAe,qDAAqD;AAC1H,UAAI,YAAY,CAAC,MAAM,gBAAgB;AACrC,YAAI,YAAY,WAAW,KAAM,YAAY,CAAC,MAAM,YAAY,YAAY,CAAC,MAAM,WAAY;AAC7F,gBAAM,IAAI,eAAe,iDAAiD;AAAA,QAC5E;AACA;AAAA,MACF;AACA,UAAI,YAAY,CAAC,MAAM,SAAS;AAC9B,YAAI,YAAY,SAAS,KAAM,CAAC,YAAY,CAAC,KAAK,CAAC,OAAO,OAAO,mBAAmB,GAAI;AACtF,gBAAM,IAAI,eAAe,+DAA+D;AAAA,QAC1F;AACA;AAAA,MACF;AACA,UAAI,YAAY,CAAC,MAAM,eAAe;AACpC,cAAM,QAAQ,OAAO,YAAY,CAAC,CAAC;AACnC,YAAI,YAAY,WAAW,KAAK,CAAC,OAAO,UAAU,KAAK,KAAK,QAAQ,GAAG;AACrE,gBAAM,IAAI,eAAe,iDAAiD;AAAA,QAC5E;AACA;AAAA,MACF;AACA,UAAI,YAAY,CAAC,MAAM,YAAY;AACjC,cAAM,WAAW,YAAY,CAAC;AAC9B,YAAK,aAAa,YAAY,aAAa,UAAU,aAAa,YAAY,aAAa,aACtF,YAAY,UAAU,aAAa,YAAY,IAAI,MAClD,YAAY,CAAC,MAAM,UAAa,CAAC,YAAY,CAAC,EAAE,KAAK,GAAI;AAC7D,gBAAM,IAAI,eAAe,+FAA+F;AAAA,QAC1H;AACA,YAAI,aAAa,SAAU,8BAA6B,OAAO,OAAO,qBAAqB,GAAG,IAAI,0BAA0B;AAC5H;AAAA,MACF;AACA,YAAM,IAAI,eAAe,gEAAgE;AAAA,IAC3F,KAAK;AACH,UAAI,aAAa,SAAS,MAAM,WAAY,OAAM,IAAI,eAAe,qDAAqD;AAC1H;AAAA,IACF,KAAK;AAAA,IACL,KAAK;AACH;AAAA,IACF,KAAK;AACH,UAAI,YAAY,SAAS,EAAG,OAAM,IAAI,eAAe,qDAAqD;AAC1G;AAAA,IACF,KAAK;AACH,UAAI,YAAY,WAAW,KAAM,uBAAuB,YAAY,uBAAuB,WAAY;AACrG,cAAM,IAAI,eAAe,0CAA0C;AAAA,MACrE;AACA;AAAA,IACF,KAAK;AACH,UAAI,YAAY,WAAW,EAAG,OAAM,IAAI,eAAe,0CAA0C;AACjG;AAAA,IACF,KAAK;AACH,UAAI,YAAY,WAAW,EAAG,OAAM,IAAI,eAAe,0CAA0C;AACjG;AAAA,IACF,KAAK;AAAA,IACL,KAAK,sBAAsB;AACzB,UAAI,CAAC,YAAY,KAAK,GAAG,EAAE,KAAK,EAAG,OAAM,IAAI,eAAe,GAAG,OAAO,oBAAoB;AAC1F,0BAAoB;AACpB,0BAAoB;AACpB,UAAI,aAAa,SAAS,MAAM,WAAY,OAAM,IAAI,eAAe,qDAAqD;AAC1H;AAAA,IACF;AAAA,IACA,KAAK;AACH,UAAI,QAAQ,OAAO,OAAO,aAAa,CAAC,MAAM,QAAQ,OAAO,OAAO,cAAc,CAAC,GAAG;AACpF,cAAM,IAAI,eAAe,oEAAoE;AAAA,MAC/F;AACA,UAAI,OAAO,OAAO,eAAe,KAAK,CAAC,OAAO,OAAO,aAAa,GAAG;AACnE,cAAM,IAAI,eAAe,4DAA4D;AAAA,MACvF;AACA,sBAAgB,CAAC;AACjB,0BAAoB;AACpB,0BAAoB;AACpB,UAAI,OAAO,OAAO,YAAY,aAAa,SAAS,MAAM,YAAY;AACpE,cAAM,IAAI,eAAe,8EAA8E;AAAA,MACzG;AACA,mBAAa,OAAO,OAAO,WAAW,YAAY,UAAU;AAC5D,mBAAa;AACb,8BAAwB;AACxB;AAAA,IACF;AACE,YAAM,IAAI,eAAe,oBAAoB,OAAO,EAAE;AAAA,EAC1D;AACF;AAEA,SAAS,gBAAgB,cAA4B;AACnD,wBAAsB,OAAO,OAAO,SAAS,cAAc,SAAS;AACtE;AAEA,SAAS,sBAA4B;AACnC,MAAI,OAAO,OAAO,UAAU,OAAW,uBAAsB,OAAO,OAAO,OAAO,GAAG,OAAO;AAC9F;AAEA,SAAS,sBAAsB,OAA2B,cAAsB,MAAsB;AACpG,QAAM,cAAc,aAAa,OAAO,cAAc,IAAI;AAC1D,MAAI,CAAC,OAAO,UAAU,WAAW,KAAK,cAAc,EAAG,OAAM,IAAI,eAAe,GAAG,IAAI,8BAA8B;AACrH,SAAO;AACT;AAEA,SAAS,6BAA6B,OAA2B,cAAsB,MAAsB;AAC3G,QAAM,QAAQ,sBAAsB,OAAO,cAAc,IAAI;AAC7D,MAAI,QAAQ,IAAK,OAAM,IAAI,eAAe,GAAG,IAAI,uBAAuB;AACxE,SAAO;AACT;AAEA,SAAS,oBAAoB,aAAa,KAAoC;AAC5E,QAAM,YAAY,OAAO,OAAO;AAChC,MAAI,cAAc,OAAW,QAAO,EAAE,KAAK,WAAW;AAEtD,QAAM,SAAS;AACf,QAAM,QAAQ,IAAI,OAAO,SAAS,MAAM,cAAc,MAAM,UAAU,GAAG,EAAE,KAAK,SAAS;AACzF,MAAI,CAAC,MAAO,QAAO,EAAE,KAAK,aAAa,WAAW,YAAY,WAAW,EAAE;AAC3E,QAAM,MAAM,OAAO,MAAM,CAAC,CAAC;AAC3B,QAAM,MAAM,OAAO,MAAM,CAAC,CAAC;AAC3B,MAAI,CAAC,OAAO,SAAS,GAAG,KAAK,CAAC,OAAO,SAAS,GAAG,EAAG,OAAM,IAAI,eAAe,yCAAyC;AACtH,MAAI,OAAO,IAAK,OAAM,IAAI,eAAe,wDAAwD;AACjG,SAAO,EAAE,KAAK,IAAI;AACpB;AAEA,SAAS,aAAa,cAAgF;AACpG,QAAM,QAAQ,OAAO,OAAO,UAAU;AACtC,MAAI,UAAU,UAAU,UAAU,aAAa,UAAU,YAAY;AACnE,UAAM,IAAI,eAAe,4CAA4C;AAAA,EACvE;AACA,SAAO;AACT;AAEA,SAAS,eAAuB;AAC9B,QAAM,QAAQ,aAAa,OAAO,OAAO,WAAW,GAAG,GAAG,WAAW;AACrE,MAAI,CAAC,OAAO,UAAU,KAAK,KAAK,QAAQ,EAAG,OAAM,IAAI,eAAe,uCAAuC;AAC3G,SAAO;AACT;AAEA,SAAS,qBAAyC;AAChD,MAAI,OAAO,OAAO,WAAW,UAAa,OAAO,OAAO,UAAU,UAAa,OAAO,OAAO,WAAW,OAAO,OAAO,OAAO;AAC3H,UAAM,IAAI,eAAe,sEAAsE;AAAA,EACjG;AACA,SAAO,OAAO,OAAO,UAAU,OAAO,OAAO;AAC/C;AAEA,SAAS,0BAAmD;AAC1D,QAAM,eAAe,OAAO,OAAO,eAAe;AAClD,QAAM,cAAc,OAAO,OAAO;AAClC,QAAM,YAAY,mBAAmB;AACrC,QAAM,eAAe;AAAA,IACnB,GAAI,OAAO,OAAO,aAAa,IAAI,EAAE,MAAM,OAAO,OAAO,aAAa,EAAE,IAAI,CAAC;AAAA,IAC7E,GAAI,cAAc,SAAY,EAAE,UAAU,IAAI,CAAC;AAAA,EACjD;AACA,MAAI,aAAc,QAAO,EAAE,MAAM,iBAAiB,QAAQ,cAAc,GAAI,cAAc,EAAE,aAAa,KAAK,IAAI,CAAC,GAAI,GAAG,aAAa;AACvI,MAAI,YAAa,QAAO,EAAE,MAAM,eAAe,GAAG,aAAa;AAC/D,SAAO,EAAE,MAAM,OAAO,GAAG,aAAa;AACxC;AAEA,SAAS,gBAAgB,OAAwB;AAC/C,QAAM,EAAE,gBAAgB,iBAAiB,aAAa,cAAc,wBAAwB,yBAAyB,GAAG,OAAO,IAAI;AACnI,SAAO;AACT;AAEA,SAAS,aAAa,OAAyB;AAC7C,QAAM,EAAE,UAAU,UAAU,GAAG,OAAO,IAAI;AAC1C,SAAO,EAAE,GAAG,QAAQ,UAAU,gBAAgB,QAAQ,EAAE;AAC1D;AAEA,SAAS,UAAU,OAAsB;AACvC,UAAQ,OAAO,MAAM,GAAG,KAAK,UAAU,OAAO,MAAM,CAAC,CAAC;AAAA,CAAI;AAC5D;AAEA,SAAS,YAAkB;AACzB,UAAQ,OAAO,MAAM;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,CA2JtB;AACD;","names":[]}
|
|
@@ -1,14 +0,0 @@
|
|
|
1
|
-
import {
|
|
2
|
-
CodeIndex
|
|
3
|
-
} from "./chunk-HMKVMRLF.js";
|
|
4
|
-
import "./chunk-GBEJHETS.js";
|
|
5
|
-
import "./chunk-TSURHRFF.js";
|
|
6
|
-
import "./chunk-5BO2LLXC.js";
|
|
7
|
-
import "./chunk-BXWO2KMC.js";
|
|
8
|
-
import "./chunk-S225GYCL.js";
|
|
9
|
-
import "./chunk-VH5VGRCI.js";
|
|
10
|
-
import "./chunk-DKRB2XT5.js";
|
|
11
|
-
export {
|
|
12
|
-
CodeIndex
|
|
13
|
-
};
|
|
14
|
-
//# sourceMappingURL=code-index-MWSJKV3G.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
|
|
@@ -1,14 +0,0 @@
|
|
|
1
|
-
import {
|
|
2
|
-
IndexDatabase,
|
|
3
|
-
readIndexErrorCounts,
|
|
4
|
-
readIndexErrors,
|
|
5
|
-
resetIndexState
|
|
6
|
-
} from "./chunk-GBEJHETS.js";
|
|
7
|
-
import "./chunk-DKRB2XT5.js";
|
|
8
|
-
export {
|
|
9
|
-
IndexDatabase,
|
|
10
|
-
readIndexErrorCounts,
|
|
11
|
-
readIndexErrors,
|
|
12
|
-
resetIndexState
|
|
13
|
-
};
|
|
14
|
-
//# sourceMappingURL=database-P5XWJWQL.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
|
package/dist/hosted-GHIUHKOU.js
DELETED
|
@@ -1,13 +0,0 @@
|
|
|
1
|
-
import {
|
|
2
|
-
CohereReranker,
|
|
3
|
-
JinaReranker
|
|
4
|
-
} from "./chunk-DTI7SXGL.js";
|
|
5
|
-
import "./chunk-BXWO2KMC.js";
|
|
6
|
-
import "./chunk-S225GYCL.js";
|
|
7
|
-
import "./chunk-VH5VGRCI.js";
|
|
8
|
-
import "./chunk-DKRB2XT5.js";
|
|
9
|
-
export {
|
|
10
|
-
CohereReranker,
|
|
11
|
-
JinaReranker
|
|
12
|
-
};
|
|
13
|
-
//# sourceMappingURL=hosted-GHIUHKOU.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
|