{"version":3,"file":"index.mjs","sources":["../src/resources/tar.ts","../src/resources/model-asset.ts","../src/pipelines/ocr/config.ts","../src/platform/browser.ts","../src/runtime/ort.ts","../src/utils/common.ts","../src/models/infer.ts","../src/models/common.ts","../src/models/det.ts","../src/models/rec.ts","../src/pipelines/ocr/crop.ts","../src/runtime/opencv.ts","../src/pipelines/ocr/runtime-params.ts","../src/pipelines/ocr/default-config.ts","../src/pipelines/ocr/shared.ts","../src/pipelines/ocr/core.ts","../src/worker/protocol.ts","../src/worker/client.ts","../src/pipelines/ocr/worker-backed.ts","../src/pipelines/ocr/index.ts"],"sourcesContent":["function readString(bytes: Uint8Array, start: number, length: number): string {\n  let output = \"\";\n  for (let index = start; index < start + length; index += 1) {\n    const value = bytes[index];\n    if (value === 0) break;\n    output += String.fromCharCode(value);\n  }\n  return output.replace(/\\0.*$/, \"\").trim();\n}\n\nfunction readOctal(bytes: Uint8Array, start: number, length: number): number {\n  const raw = readString(bytes, start, length).replace(/\\0/g, \"\").trim();\n  return raw ? Number.parseInt(raw, 8) : 0;\n}\n\nfunction isEmptyBlock(bytes: Uint8Array, offset: number): boolean {\n  for (let index = offset; index < offset + 512; index += 1) {\n    if (bytes[index] !== 0) return false;\n  }\n  return true;\n}\n\nfunction normalizeEntryName(name: string): string {\n  return name.replace(/^\\.?\\//, \"\");\n}\n\nfunction isMetadataEntry(name: string): boolean {\n  const segments = normalizeEntryName(name).split(\"/\");\n  const baseName = segments[segments.length - 1] || \"\";\n  return (\n    baseName.startsWith(\"._\") || segments.includes(\"PaxHeader\") || segments.includes(\"__MACOSX\")\n  );\n}\n\nexport function extractTarEntries(buffer: ArrayBuffer | Uint8Array): Map<string, Uint8Array> {\n  const bytes = buffer instanceof Uint8Array ? buffer : new Uint8Array(buffer);\n  const entries = new Map<string, Uint8Array>();\n  let offset = 0;\n\n  while (offset + 512 <= bytes.length) {\n    if (isEmptyBlock(bytes, offset)) {\n      break;\n    }\n\n    const name = normalizeEntryName(readString(bytes, offset, 100));\n    const size = readOctal(bytes, offset + 124, 12);\n    const type = bytes[offset + 156];\n    const dataStart = offset + 512;\n    const dataEnd = dataStart + size;\n\n    if (type !== 53 && type !== 120 && name && !isMetadataEntry(name)) {\n      entries.set(name, bytes.slice(dataStart, dataEnd));\n    }\n\n    offset = dataStart + Math.ceil(size / 512) * 512;\n  }\n\n  return entries;\n}\n\nexport function pickTarEntry(entries: Map<string, Uint8Array>, targetName: string): Uint8Array {\n  const normalizedTarget = normalizeEntryName(targetName);\n  const entry = entries.get(normalizedTarget);\n  if (entry) {\n    return entry;\n  }\n\n  for (const [name, value] of entries) {\n    if (name.endsWith(`/${normalizedTarget}`) || name === normalizedTarget) {\n      return value;\n    }\n  }\n\n  throw new Error(`Entry \"${targetName}\" was not found in the tar archive.`);\n}\n","export interface ModelAsset {\n  url: string;\n}\n\nexport type ModelAssetsMap = Record<string, ModelAsset>;\n\nexport const DEFAULT_MODEL_ASSETS: ModelAssetsMap = {\n  \"PP-OCRv5_mobile_det\": {\n    url: \"https://paddle-model-ecology.bj.bcebos.com/paddlex/official_inference_model/paddle3.0.0/PP-OCRv5_mobile_det_onnx.tar\"\n  },\n  \"PP-OCRv5_mobile_rec\": {\n    url: \"https://paddle-model-ecology.bj.bcebos.com/paddlex/official_inference_model/paddle3.0.0/PP-OCRv5_mobile_rec_onnx.tar\"\n  }\n};\n\nexport const MODEL_ENTRY_PATHS: Readonly<Record<string, string>> = Object.freeze({\n  model: \"inference.onnx\",\n  config: \"inference.yml\"\n});\n\nexport interface ModelLoadResult {\n  modelBytes: Uint8Array;\n  configText: string;\n  download: ModelLoadSummary;\n}\n\nexport interface ModelLoadSummary {\n  url: string;\n  bytes: number;\n}\n\n// --- Validation helpers ---\n\nfunction isNonEmptyString(value: unknown): value is string {\n  return typeof value === \"string\" && value.length > 0;\n}\n\nfunction isObject(value: unknown): value is Record<string, unknown> {\n  return Boolean(value && typeof value === \"object\" && !Array.isArray(value));\n}\n\nexport function normalizeModelAsset(assetName: string, asset: unknown): ModelAsset {\n  if (isNonEmptyString(asset)) {\n    const resolvedAsset = DEFAULT_MODEL_ASSETS[asset];\n    // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition -- runtime guard for missing Record key\n    if (!resolvedAsset) {\n      throw new Error(`Asset \"${assetName}\" references unknown model asset \"${asset}\".`);\n    }\n    return { url: resolvedAsset.url };\n  }\n\n  if (!isObject(asset)) {\n    throw new Error(`Asset \"${assetName}\" must be an object.`);\n  }\n  if (!isNonEmptyString(asset.url)) {\n    throw new Error(`Asset \"${assetName}\" must define url.`);\n  }\n\n  return {\n    url: asset.url\n  };\n}\n\nexport function normalizeAssets(\n  assets: Record<string, unknown> | undefined\n): Record<string, ModelAsset> {\n  const assetEntries = Object.entries(assets || {});\n\n  if (assetEntries.length === 0) {\n    throw new Error(\"Assets must define at least one asset.\");\n  }\n\n  return Object.fromEntries(\n    assetEntries.map(([assetName, asset]) => [assetName, normalizeModelAsset(assetName, asset)])\n  );\n}\n\n// --- Model loading ---\n\nexport function getModelEntryPath(slot: string): string | null {\n  return MODEL_ENTRY_PATHS[slot] || null;\n}\n\nexport function assertModelResourceSlot(kind: string, slot: string, value: unknown): void {\n  if (slot === \"model\") {\n    if (!(value instanceof Uint8Array) || value.byteLength === 0) {\n      throw new Error(`${kind} model requires a non-empty ${MODEL_ENTRY_PATHS.model} resource.`);\n    }\n    return;\n  }\n\n  if (slot === \"config\") {\n    if (typeof value !== \"string\" || value.trim().length === 0) {\n      throw new Error(`${kind} model requires a non-empty ${MODEL_ENTRY_PATHS.config} resource.`);\n    }\n    return;\n  }\n\n  throw new Error(`Unsupported model resource slot \"${slot}\".`);\n}\n\nexport function assertModelResources(kind: string, resources: Record<string, unknown>): void {\n  for (const [slot, value] of Object.entries(resources)) {\n    assertModelResourceSlot(kind, slot, value);\n  }\n}\n\n// --- Model loading (fetch + tar extraction) ---\n\nimport { extractTarEntries, pickTarEntry } from \"./tar\";\n\nexport async function loadModelAsset(\n  asset: ModelAsset,\n  fetchImpl: typeof fetch = fetch\n): Promise<ModelLoadResult> {\n  const response = await fetchImpl(asset.url);\n  if (!response.ok) {\n    throw new Error(`Failed to download ${asset.url}: HTTP ${String(response.status)}`);\n  }\n  const buffer = await response.arrayBuffer();\n  const entries = extractTarEntries(buffer);\n  const modelBytes = pickTarEntry(entries, MODEL_ENTRY_PATHS.model);\n  const configBytes = pickTarEntry(entries, MODEL_ENTRY_PATHS.config);\n\n  return {\n    modelBytes,\n    configText: new TextDecoder().decode(configBytes),\n    download: {\n      url: asset.url,\n      bytes: buffer.byteLength\n    }\n  };\n}\n","import yaml from \"js-yaml\";\n\nimport type { ModelAsset } from \"../../resources/model-asset\";\nimport { normalizeModelAsset } from \"../../resources/model-asset\";\nimport type { LimitType } from \"./runtime-params\";\n\nconst SUPPORTED_PIPELINE_NAME = \"OCR\";\n\nexport interface NormalizedPipelineConfig {\n  pipelineName: string;\n  raw: Record<string, unknown>;\n  warnings: string[];\n  unsupportedFeatures: string[];\n  modelSelection: PipelineModelSelection;\n  assets: Partial<Record<string, ModelAsset>>;\n  runtimeDefaults: PipelineRuntimeDefaults;\n  pipelineBatchSize: number;\n  textDetectionBatchSize: number;\n  textRecognitionBatchSize: number;\n}\n\nexport interface PipelineModelSelection {\n  textDetectionModelName: string | null;\n  textRecognitionModelName: string | null;\n}\n\nexport interface PipelineRuntimeDefaults {\n  text_det_limit_side_len?: number;\n  text_det_limit_type?: LimitType;\n  text_det_max_side_limit?: number;\n  text_det_thresh?: number;\n  text_det_box_thresh?: number;\n  text_det_unclip_ratio?: number;\n  text_rec_score_thresh?: number;\n}\n\ntype YamlObject = Record<string, unknown>;\n\nfunction isPlainObject(value: unknown): value is YamlObject {\n  return Boolean(value) && typeof value === \"object\" && !Array.isArray(value);\n}\n\nexport function toFiniteNumber(value: unknown): number | undefined {\n  if (value === null || value === undefined || value === \"\") {\n    return undefined;\n  }\n  const normalized = Number(value);\n  return Number.isFinite(normalized) ? normalized : undefined;\n}\n\nfunction batchSizeOrOne(value: unknown): number {\n  const n = toFiniteNumber(value);\n  return n !== undefined && n >= 1 ? n : 1;\n}\n\nfunction applyGeneralPipelineRuntimeDefaults(\n  textType: string,\n  runtimeDefaults: PipelineRuntimeDefaults\n): PipelineRuntimeDefaults {\n  if (textType !== \"general\") {\n    return runtimeDefaults;\n  }\n  return {\n    text_det_limit_side_len: runtimeDefaults.text_det_limit_side_len ?? 960,\n    text_det_limit_type: runtimeDefaults.text_det_limit_type ?? \"max\",\n    text_det_max_side_limit: runtimeDefaults.text_det_max_side_limit ?? 4000,\n    text_det_thresh: runtimeDefaults.text_det_thresh ?? 0.3,\n    text_det_box_thresh: runtimeDefaults.text_det_box_thresh ?? 0.6,\n    text_det_unclip_ratio: runtimeDefaults.text_det_unclip_ratio ?? 2.0,\n    text_rec_score_thresh: runtimeDefaults.text_rec_score_thresh ?? 0\n  };\n}\n\nfunction parsePipelineConfigInput(input: unknown): YamlObject {\n  if (typeof input === \"string\") {\n    const parsed = yaml.load(input);\n    if (!isPlainObject(parsed)) {\n      throw new Error(\"OCR pipeline config text must decode to an object.\");\n    }\n    return parsed;\n  }\n  if (!isPlainObject(input)) {\n    throw new Error(\"OCR pipeline config must be an object or YAML text.\");\n  }\n  return input;\n}\n\nfunction addFeatureWarning(warnings: string[], featureName: string, reason?: string): void {\n  warnings.push(\n    `${featureName} is not yet supported in PaddleOCR.js${reason ? `: ${reason}` : \"\"}.`\n  );\n}\n\nfunction getModuleModelName(moduleConfig: YamlObject | null): string | null {\n  return typeof moduleConfig?.model_name === \"string\" ? moduleConfig.model_name : null;\n}\n\nfunction validateModuleAsset(modulePath: string, modelName: string | null): void {\n  if (!modelName) {\n    throw new Error(\n      `${modulePath}.model_name must be provided when ${modulePath}.model_dir is set.`\n    );\n  }\n}\n\nfunction getModuleAsset(\n  assetName: string,\n  modulePath: string,\n  moduleConfig: YamlObject | null\n): ModelAsset | null {\n  if (moduleConfig?.model_dir == null) {\n    return null;\n  }\n  if (isPlainObject(moduleConfig.model_dir)) {\n    const asset = normalizeModelAsset(assetName, moduleConfig.model_dir);\n    validateModuleAsset(modulePath, getModuleModelName(moduleConfig));\n    return asset;\n  }\n  throw new Error(\n    `${modulePath}.model_dir must be null or an asset descriptor object in browser usage.`\n  );\n}\n\nexport function parseOcrPipelineConfigText(text: string): YamlObject {\n  return parsePipelineConfigInput(text);\n}\n\nexport function normalizeOcrPipelineConfig(input: unknown): NormalizedPipelineConfig {\n  const config = parsePipelineConfigInput(input);\n  const pipelineName = (config.pipeline_name as string | undefined) ?? SUPPORTED_PIPELINE_NAME;\n\n  if (pipelineName !== SUPPORTED_PIPELINE_NAME) {\n    throw new Error(\n      `Unsupported pipeline_name \"${pipelineName}\". PaddleOCR.js currently supports only \"${SUPPORTED_PIPELINE_NAME}\".`\n    );\n  }\n\n  const warnings: string[] = [];\n  const subModules = isPlainObject(config.SubModules) ? config.SubModules : {};\n  const textDetection = isPlainObject(subModules.TextDetection) ? subModules.TextDetection : null;\n  const textRecognition = isPlainObject(subModules.TextRecognition)\n    ? subModules.TextRecognition\n    : null;\n\n  if (!textDetection || !textRecognition) {\n    throw new Error(\n      'OCR pipeline config must define both \"SubModules.TextDetection\" and \"SubModules.TextRecognition\".'\n    );\n  }\n\n  const useDocPreprocessor = Boolean(config.use_doc_preprocessor);\n  const useTextlineOrientation = Boolean(config.use_textline_orientation);\n  const subPipelines = config.SubPipelines as YamlObject | undefined;\n  const docPreprocessor = isPlainObject(subPipelines?.DocPreprocessor)\n    ? subPipelines.DocPreprocessor\n    : null;\n  const textLineOrientation = isPlainObject(subModules.TextLineOrientation)\n    ? subModules.TextLineOrientation\n    : null;\n\n  if (useDocPreprocessor || docPreprocessor) {\n    addFeatureWarning(warnings, \"DocPreprocessor\", \"config will be ignored for now\");\n  }\n  if (useTextlineOrientation || textLineOrientation) {\n    addFeatureWarning(warnings, \"TextLineOrientation\", \"config will be ignored for now\");\n  }\n  const textType =\n    typeof config.text_type === \"string\" && config.text_type.length > 0\n      ? config.text_type\n      : \"general\";\n\n  if (config.text_type && config.text_type !== \"general\") {\n    warnings.push(`text_type ${JSON.stringify(config.text_type)} is not used by PaddleOCR.js yet.`);\n  }\n\n  const detAsset = getModuleAsset(\"det\", \"SubModules.TextDetection\", textDetection);\n  const recAsset = getModuleAsset(\"rec\", \"SubModules.TextRecognition\", textRecognition);\n\n  const pipelineBatchSize = batchSizeOrOne(config.batch_size);\n  const textDetectionBatchSize = batchSizeOrOne(textDetection.batch_size);\n  const textRecognitionBatchSizeFromModule = batchSizeOrOne(textRecognition.batch_size);\n\n  return {\n    pipelineName,\n    raw: config,\n    warnings,\n    unsupportedFeatures: [\n      ...(useDocPreprocessor || docPreprocessor ? [\"DocPreprocessor\"] : []),\n      ...(useTextlineOrientation || textLineOrientation ? [\"TextLineOrientation\"] : [])\n    ],\n    modelSelection: {\n      textDetectionModelName: getModuleModelName(textDetection),\n      textRecognitionModelName: getModuleModelName(textRecognition)\n    },\n    assets: {\n      ...(detAsset ? { det: detAsset } : {}),\n      ...(recAsset ? { rec: recAsset } : {})\n    },\n    runtimeDefaults: applyGeneralPipelineRuntimeDefaults(textType, {\n      text_det_limit_side_len: toFiniteNumber(textDetection.limit_side_len),\n      text_det_limit_type: (textDetection.limit_type as LimitType | undefined) || undefined,\n      text_det_max_side_limit: toFiniteNumber(textDetection.max_side_limit),\n      text_det_thresh: toFiniteNumber(textDetection.thresh),\n      text_det_box_thresh: toFiniteNumber(textDetection.box_thresh),\n      text_det_unclip_ratio: toFiniteNumber(textDetection.unclip_ratio),\n      text_rec_score_thresh: toFiniteNumber(textRecognition.score_thresh)\n    }),\n    pipelineBatchSize,\n    textDetectionBatchSize,\n    textRecognitionBatchSize: textRecognitionBatchSizeFromModule\n  };\n}\n","import type { OpenCv, Mat } from \"@techstark/opencv-js\";\n\nexport type ImageSource = ImageBitmap | Blob | HTMLCanvasElement | ImageData | HTMLImageElement;\n\nexport interface SourceMatResult {\n  width: number;\n  height: number;\n  mat: Mat;\n  dispose(): void;\n}\n\nexport interface WorkerPayload {\n  kind: \"imageBitmap\";\n  imageBitmap: ImageBitmap;\n}\n\nexport interface WorkerPayloadResult {\n  payload: WorkerPayload;\n  transferables: Transferable[];\n}\n\nexport function ensureServedFromHttp(): void {\n  if (globalThis.location.protocol === \"file:\") {\n    throw new Error(\"PaddleOCR.js requires an HTTP(S) origin so model assets can be fetched.\");\n  }\n}\n\nfunction hasDomConstructor(name: string): boolean {\n  return typeof (globalThis as Record<string, unknown>)[name] !== \"undefined\";\n}\n\nexport async function sourceToImageBitmap(source: ImageSource): Promise<ImageBitmap> {\n  if (typeof ImageBitmap !== \"undefined\" && source instanceof ImageBitmap) return source;\n  if (source instanceof Blob) return createImageBitmap(source);\n  if (hasDomConstructor(\"HTMLCanvasElement\") && source instanceof HTMLCanvasElement) {\n    return createImageBitmap(source);\n  }\n  if (source instanceof ImageData) {\n    const canvas = document.createElement(\"canvas\");\n    canvas.width = source.width;\n    canvas.height = source.height;\n    const ctx = canvas.getContext(\"2d\");\n    if (!ctx) throw new Error(\"Failed to create a 2D canvas context.\");\n    ctx.putImageData(source, 0, 0);\n    return createImageBitmap(canvas);\n  }\n  if (hasDomConstructor(\"HTMLImageElement\") && source instanceof HTMLImageElement) {\n    return createImageBitmap(source);\n  }\n  throw new Error(\"Unsupported image source. Use a Blob, ImageBitmap, ImageData, canvas, or img.\");\n}\n\nasync function sourceToClonedImageBitmap(source: ImageSource): Promise<ImageBitmap> {\n  if (typeof ImageBitmap !== \"undefined\" && source instanceof ImageBitmap) {\n    return createImageBitmap(source);\n  }\n  return sourceToImageBitmap(source);\n}\n\nexport function bitmapToSourceMat(\n  cv: OpenCv,\n  imageBitmap: ImageBitmap\n): { canvas: HTMLCanvasElement; mat: Mat } {\n  const canvas = document.createElement(\"canvas\");\n  canvas.width = imageBitmap.width;\n  canvas.height = imageBitmap.height;\n  const ctx = canvas.getContext(\"2d\", { willReadFrequently: true });\n  if (!ctx) throw new Error(\"Failed to create a 2D canvas context.\");\n  ctx.drawImage(imageBitmap, 0, 0);\n  return {\n    canvas,\n    mat: cv.imread(canvas)\n  };\n}\n\nexport async function sourceToMat(cv: OpenCv, source: unknown): Promise<SourceMatResult> {\n  if (typeof cv.Mat === \"function\" && source instanceof cv.Mat) {\n    const cloned = source.clone();\n    return {\n      width: source.cols,\n      height: source.rows,\n      mat: cloned,\n      dispose() {\n        cloned.delete();\n      }\n    };\n  }\n\n  const imageBitmap = await sourceToImageBitmap(source as ImageSource);\n  const sourceImage = bitmapToSourceMat(cv, imageBitmap);\n  return {\n    width: imageBitmap.width,\n    height: imageBitmap.height,\n    mat: sourceImage.mat,\n    dispose() {\n      sourceImage.mat.delete();\n      imageBitmap.close();\n    }\n  };\n}\n\nexport async function sourceToWorkerPayload(source: ImageSource): Promise<WorkerPayloadResult> {\n  if (typeof ImageBitmap === \"undefined\" || typeof createImageBitmap !== \"function\") {\n    throw new Error(\"Worker mode requires ImageBitmap support in this browser.\");\n  }\n  const imageBitmap = await sourceToClonedImageBitmap(source);\n  return {\n    payload: {\n      kind: \"imageBitmap\",\n      imageBitmap\n    },\n    transferables: [imageBitmap]\n  };\n}\n","export type OrtModule = typeof import(\"onnxruntime-web\");\n\nexport interface WebGpuState {\n  available: boolean;\n  reason: string;\n}\n\nexport interface OrtOptions {\n  backend?: \"webgpu\" | \"wasm\" | \"auto\" | (string & {});\n  wasmPaths?: string;\n  numThreads?: number;\n  simd?: boolean;\n  proxy?: boolean;\n  disableWasmProxy?: boolean;\n}\n\nexport interface OrtRuntimeResult {\n  ort: OrtModule;\n  webgpuState: WebGpuState;\n  backend: string;\n}\n\nexport interface SessionState {\n  session: import(\"onnxruntime-web\").InferenceSession;\n  provider: string;\n}\n\nlet ortModulePromise: Promise<OrtModule> | null = null;\n\nasync function loadOrtModule(): Promise<OrtModule> {\n  if (ortModulePromise) {\n    return ortModulePromise;\n  }\n  ortModulePromise = import(\"onnxruntime-web\");\n  return ortModulePromise;\n}\n\ninterface GpuLike {\n  requestAdapter(): Promise<unknown>;\n}\n\nexport async function detectWebGpuAvailability(): Promise<WebGpuState> {\n  const gpu = (globalThis.navigator as (Navigator & { gpu?: GpuLike }) | undefined)?.gpu;\n  if (!gpu?.requestAdapter) {\n    return {\n      available: false,\n      reason: \"navigator.gpu is unavailable in this browser.\"\n    };\n  }\n  try {\n    const adapter = await gpu.requestAdapter();\n    if (!adapter) {\n      return {\n        available: false,\n        reason: \"The browser did not return a WebGPU adapter.\"\n      };\n    }\n    return {\n      available: true,\n      reason: \"\"\n    };\n  } catch (err: unknown) {\n    return {\n      available: false,\n      reason: err instanceof Error ? err.message : \"Failed to request a WebGPU adapter.\"\n    };\n  }\n}\n\nexport function getProviderCandidates(backend: string, webgpuState: WebGpuState): string[][] {\n  if (backend === \"webgpu\") {\n    if (!webgpuState.available) {\n      throw new Error(`WebGPU is unavailable: ${webgpuState.reason}`);\n    }\n    return [[\"webgpu\"]];\n  }\n  if (backend === \"wasm\") {\n    return [[\"wasm\"]];\n  }\n  return webgpuState.available ? [[\"webgpu\"], [\"wasm\"]] : [[\"wasm\"]];\n}\n\nfunction applyOrtEnvironmentOptions(ort: OrtModule, ortOptions: OrtOptions): void {\n  const wasmOptions = ort.env.wasm;\n\n  if (ortOptions.wasmPaths !== undefined) {\n    wasmOptions.wasmPaths = ortOptions.wasmPaths;\n  }\n  if (ortOptions.numThreads !== undefined) {\n    wasmOptions.numThreads = ortOptions.numThreads;\n  }\n  if (ortOptions.simd !== undefined) {\n    wasmOptions.simd = ortOptions.simd;\n  }\n  if (ortOptions.proxy !== undefined) {\n    wasmOptions.proxy = ortOptions.proxy;\n  }\n  if (ortOptions.disableWasmProxy) {\n    wasmOptions.proxy = false;\n  }\n}\n\nexport async function initOrtRuntime(\n  ortOptions: OrtOptions | string = {}\n): Promise<OrtRuntimeResult> {\n  const backend =\n    typeof ortOptions === \"string\"\n      ? ortOptions\n      : ortOptions.backend === \"webgpu\" || ortOptions.backend === \"wasm\"\n        ? ortOptions.backend\n        : \"auto\";\n  const webgpuState = await detectWebGpuAvailability();\n  const ort = await loadOrtModule();\n  if (typeof ortOptions !== \"string\") {\n    applyOrtEnvironmentOptions(ort, ortOptions);\n  }\n  return {\n    ort,\n    webgpuState,\n    backend\n  };\n}\n\nexport async function createSession(\n  ort: OrtModule,\n  modelBytes: Uint8Array,\n  providerCandidates: string[][]\n): Promise<SessionState> {\n  let lastErr: unknown = null;\n  for (const executionProviders of providerCandidates) {\n    try {\n      const session = await ort.InferenceSession.create(modelBytes, {\n        executionProviders,\n        graphOptimizationLevel: \"all\"\n      });\n      return { session, provider: executionProviders[0] };\n    } catch (err: unknown) {\n      lastErr = err;\n    }\n  }\n  throw lastErr instanceof Error ? lastErr : new Error(\"Failed to create ONNX session.\");\n}\n\nexport async function releaseSessions(\n  ...sessions: Array<import(\"onnxruntime-web\").InferenceSession | null | undefined>\n): Promise<void> {\n  await Promise.all(\n    sessions.map(async (session) => {\n      if (!session?.release) return;\n      await session.release();\n    })\n  );\n}\n","export function nowMs(): number {\n  return performance.now();\n}\n\nexport function clamp(value: number, min: number, max: number): number {\n  return Math.max(min, Math.min(max, value));\n}\n\nexport function distance2(p0: [number, number], p1: [number, number]): number {\n  const dx = p0[0] - p1[0];\n  const dy = p0[1] - p1[1];\n  return Math.sqrt(dx * dx + dy * dy);\n}\n\nexport function formatMs(value: number): string {\n  return `${value.toFixed(1)} ms`;\n}\n\nexport function withTimeout<T>(promise: Promise<T>, ms: number, label: string): Promise<T> {\n  let settled = false;\n  return new Promise<T>((resolve, reject) => {\n    const timer = setTimeout(() => {\n      if (settled) return;\n      settled = true;\n      reject(new Error(`${label} timed out after ${String(ms / 1000)}s`));\n    }, ms);\n\n    promise\n      .then((result) => {\n        if (settled) return;\n        settled = true;\n        clearTimeout(timer);\n        resolve(result);\n      })\n      .catch((err: unknown) => {\n        if (settled) return;\n        settled = true;\n        clearTimeout(timer);\n        // eslint-disable-next-line @typescript-eslint/prefer-promise-reject-errors -- propagating upstream rejection\n        reject(err);\n      });\n  });\n}\n\nexport function resolveRuntimeBatchSize(override: unknown, defaultBatchSize: number): number {\n  const rawBatch = override ?? defaultBatchSize;\n  const coercedBatch =\n    typeof rawBatch === \"number\"\n      ? rawBatch\n      : typeof rawBatch === \"string\"\n        ? Number.parseInt(rawBatch, 10)\n        : Number.NaN;\n  return Math.max(1, Number.isFinite(coercedBatch) ? coercedBatch : 1);\n}\n\nexport function chunkArray<T>(items: T[], size: number): T[][] {\n  const chunks: T[][] = [];\n  for (let i = 0; i < items.length; i += size) {\n    chunks.push(items.slice(i, i + size));\n  }\n  return chunks;\n}\n\nexport function deepClone<T>(value: T): T {\n  return structuredClone(value);\n}\n","import type { InferenceSession, Tensor } from \"onnxruntime-web\";\n\nexport async function runInference(\n  session: InferenceSession,\n  inputTensor: Tensor\n): Promise<Tensor> {\n  const inputName = session.inputNames[0];\n  const outputMap = await session.run({ [inputName]: inputTensor });\n  return outputMap[session.outputNames[0]];\n}\n","import yaml from \"js-yaml\";\nimport ClipperLib from \"clipper-lib\";\nimport type { OpenCv, Mat } from \"@techstark/opencv-js\";\n\nimport { clamp, distance2 } from \"../utils/common\";\n\nexport type Point2D = [number, number];\n\nexport interface NormalizeConfig {\n  mean: number[];\n  std: number[];\n  scale: number;\n}\n\nexport interface MiniBox {\n  box: Point2D[];\n  side: number;\n}\n\nexport interface DetBox {\n  poly: Point2D[];\n  score: number;\n}\n\ntype YamlValue = string | number | boolean | null | YamlValue[] | { [key: string]: YamlValue };\ntype YamlObject = Record<string, YamlValue>;\n\nfunction isPlainObject(value: unknown): value is YamlObject {\n  return Boolean(value) && typeof value === \"object\" && !Array.isArray(value);\n}\n\nexport function parseInferenceConfigText(text: string): YamlObject {\n  const parsed = yaml.load(text);\n  return isPlainObject(parsed) ? parsed : {};\n}\n\nexport function parseScaleValue(rawScale: unknown, fallback: number): number {\n  if (typeof rawScale === \"number\") return rawScale;\n  if (typeof rawScale !== \"string\") return fallback;\n  const normalized = rawScale.replace(/\\s/g, \"\");\n  const direct = Number(normalized);\n  if (!Number.isNaN(direct)) return direct;\n  const divParts = normalized.split(\"/\");\n  if (divParts.length === 2) {\n    const numerator = Number(divParts[0].replace(/\\.+$/, \"\"));\n    const denominator = Number(divParts[1].replace(/\\.+$/, \"\"));\n    if (!Number.isNaN(numerator) && !Number.isNaN(denominator) && denominator !== 0) {\n      return numerator / denominator;\n    }\n  }\n  return fallback;\n}\n\nexport function getTransformOp(\n  transformOps: Array<Record<string, unknown>> | undefined,\n  opName: string\n): Record<string, unknown> | null {\n  for (const op of transformOps || []) {\n    if (Object.prototype.hasOwnProperty.call(op, opName)) {\n      return op[opName] as YamlObject;\n    }\n  }\n  return null;\n}\n\nfunction findModelNameInYamlNode(value: YamlValue): string | null {\n  if (Array.isArray(value)) {\n    for (const item of value) {\n      const match = findModelNameInYamlNode(item);\n      if (match) return match;\n    }\n    return null;\n  }\n\n  if (!isPlainObject(value)) {\n    return null;\n  }\n\n  for (const [key, childValue] of Object.entries(value)) {\n    if (key === \"model_name\" && typeof childValue === \"string\" && childValue.trim()) {\n      return childValue;\n    }\n    const match = findModelNameInYamlNode(childValue);\n    if (match) return match;\n  }\n\n  return null;\n}\n\nexport function extractInferenceModelName(configText: string): string | null {\n  const parsed = parseInferenceConfigText(configText);\n  const preferredCandidates = [\n    (parsed.Global as YamlObject | undefined)?.model_name,\n    parsed.model_name\n  ];\n  for (const candidate of preferredCandidates) {\n    if (typeof candidate === \"string\" && candidate.trim()) {\n      return candidate;\n    }\n  }\n\n  return findModelNameInYamlNode(parsed);\n}\n\nexport function toBgrFloatCHWFromBgr(\n  bgr: Uint8Array,\n  width: number,\n  height: number,\n  normalizeConfig: NormalizeConfig\n): Float32Array {\n  const data = new Float32Array(3 * width * height);\n  const hw = width * height;\n  const mean = normalizeConfig.mean;\n  const std = normalizeConfig.std;\n  const scale = normalizeConfig.scale;\n  for (let y = 0; y < height; y += 1) {\n    for (let x = 0; x < width; x += 1) {\n      const idx = y * width + x;\n      const p = idx * 3;\n      const b = bgr[p];\n      const g = bgr[p + 1];\n      const r = bgr[p + 2];\n      data[idx] = (b * scale - mean[0]) / std[0];\n      data[idx + hw] = (g * scale - mean[1]) / std[1];\n      data[idx + 2 * hw] = (r * scale - mean[2]) / std[2];\n    }\n  }\n  return data;\n}\n\nfunction orderQuad(pts: Point2D[]): Point2D[] {\n  const points = pts.slice().sort((a, b) => a[0] - b[0]);\n  let indexA: number;\n  let indexB: number;\n  let indexC: number;\n  let indexD: number;\n  if (points[1][1] > points[0][1]) {\n    indexA = 0;\n    indexD = 1;\n  } else {\n    indexA = 1;\n    indexD = 0;\n  }\n  if (points[3][1] > points[2][1]) {\n    indexB = 2;\n    indexC = 3;\n  } else {\n    indexB = 3;\n    indexC = 2;\n  }\n  return [points[indexA], points[indexB], points[indexC], points[indexD]];\n}\n\nfunction polygonArea(poly: Point2D[]): number {\n  let area = 0;\n  for (let i = 0; i < poly.length; i += 1) {\n    const j = (i + 1) % poly.length;\n    area += poly[i][0] * poly[j][1] - poly[j][0] * poly[i][1];\n  }\n  return Math.abs(area) * 0.5;\n}\n\nfunction polygonPerimeter(poly: Point2D[]): number {\n  let peri = 0;\n  for (let i = 0; i < poly.length; i += 1) {\n    const j = (i + 1) % poly.length;\n    peri += distance2(poly[i], poly[j]);\n  }\n  return peri;\n}\n\ninterface ClipperPoint {\n  X: number;\n  Y: number;\n}\n\nfunction chooseMaxAreaPath(paths: ClipperPoint[][]): ClipperPoint[] | null {\n  let best: ClipperPoint[] | null = null;\n  let bestArea = 0;\n  for (const path of paths) {\n    if (path.length < 4) continue;\n    const poly: Point2D[] = path.map((pt) => [pt.X, pt.Y]);\n    const area = polygonArea(poly);\n    if (area > bestArea) {\n      bestArea = area;\n      best = path;\n    }\n  }\n  return best;\n}\n\nexport function unclip(poly: Point2D[], unclipRatio: number): Point2D[] | null {\n  const area = polygonArea(poly);\n  const perimeter = polygonPerimeter(poly);\n  if (perimeter <= 0) return null;\n  const distance = (area * unclipRatio) / perimeter;\n  const path: ClipperPoint[] = poly.map((p) => ({ X: Math.trunc(p[0]), Y: Math.trunc(p[1]) }));\n  const offset = new ClipperLib.ClipperOffset();\n  offset.AddPath(path, ClipperLib.JoinType.jtRound, ClipperLib.EndType.etClosedPolygon);\n  const expanded = new ClipperLib.Paths();\n  offset.Execute(expanded, distance);\n  const best = chooseMaxAreaPath(expanded);\n  if (!best) return null;\n  return best.map((pt) => [pt.X, pt.Y]);\n}\n\nexport function getMiniBoxFromPoints(cv: OpenCv, points: Point2D[]): MiniBox {\n  const flat: number[] = [];\n  for (const p of points) flat.push(p[0], p[1]);\n  const contour = cv.matFromArray(points.length, 1, cv.CV_32FC2, flat);\n  const rect = cv.minAreaRect(contour);\n  const vertices = cv.RotatedRect.points(rect);\n  const box: Point2D[] = [];\n  for (let i = 0; i < 4; i += 1) box.push([vertices[i].x, vertices[i].y]);\n  contour.delete();\n  const ordered = orderQuad(box);\n  const side = Math.min(distance2(ordered[0], ordered[1]), distance2(ordered[1], ordered[2]));\n  return { box: ordered, side };\n}\n\nexport function boxScoreFast(cv: OpenCv, predMat: Mat, box: Point2D[]): number {\n  const h = predMat.rows;\n  const w = predMat.cols;\n  let minX = w - 1;\n  let maxX = 0;\n  let minY = h - 1;\n  let maxY = 0;\n  for (const p of box) {\n    minX = Math.min(minX, p[0]);\n    maxX = Math.max(maxX, p[0]);\n    minY = Math.min(minY, p[1]);\n    maxY = Math.max(maxY, p[1]);\n  }\n  minX = clamp(Math.floor(minX), 0, w - 1);\n  maxX = clamp(Math.ceil(maxX), 0, w - 1);\n  minY = clamp(Math.floor(minY), 0, h - 1);\n  maxY = clamp(Math.ceil(maxY), 0, h - 1);\n  const rw = Math.max(1, maxX - minX + 1);\n  const rh = Math.max(1, maxY - minY + 1);\n  const roi = predMat.roi(new cv.Rect(minX, minY, rw, rh));\n  const mask = cv.Mat.zeros(rh, rw, cv.CV_8UC1);\n  const shifted = box.map((p) => [Math.trunc(p[0] - minX), Math.trunc(p[1] - minY)]);\n  const flat: number[] = [];\n  for (const p of shifted) flat.push(p[0], p[1]);\n  const pts = cv.matFromArray(shifted.length, 1, cv.CV_32SC2, flat);\n  const ptsVec = new cv.MatVector();\n  ptsVec.push_back(pts);\n  cv.fillPoly(mask, ptsVec, new cv.Scalar(1));\n  const mean = cv.mean(roi, mask)[0];\n  roi.delete();\n  mask.delete();\n  pts.delete();\n  ptsVec.delete();\n  return mean;\n}\n","import type { OpenCv, Mat } from \"@techstark/opencv-js\";\nimport type { InferenceSession, Tensor } from \"onnxruntime-web\";\n\nimport { assertModelResources } from \"../resources/model-asset\";\nimport { createSession, getProviderCandidates, releaseSessions } from \"../runtime/ort\";\nimport type { OrtModule, WebGpuState, SessionState } from \"../runtime/ort\";\nimport { chunkArray, clamp, resolveRuntimeBatchSize, withTimeout } from \"../utils/common\";\nimport { runInference } from \"./infer\";\nimport {\n  boxScoreFast,\n  getMiniBoxFromPoints,\n  getTransformOp,\n  parseInferenceConfigText,\n  parseScaleValue,\n  toBgrFloatCHWFromBgr,\n  unclip\n} from \"./common\";\nimport type { Point2D, NormalizeConfig, DetBox } from \"./common\";\n\nexport type LimitType = \"min\" | \"max\";\n\nexport interface DetRuntimeOverrides {\n  batchSize?: number;\n  thresh?: number;\n  boxThresh?: number;\n  unclipRatio?: number;\n  limitSideLen?: number;\n  limitType?: LimitType;\n  maxSideLimit?: number;\n}\n\nexport interface DetPostprocessConfig {\n  thresh: number;\n  boxThresh: number;\n  maxCandidates: number;\n  unclipRatio: number;\n}\n\nexport interface DetModelConfig {\n  resizeLong: number;\n  limitType: LimitType;\n  maxSideLimit: number;\n  normalize: NormalizeConfig;\n  postprocess: DetPostprocessConfig;\n}\n\nexport interface DetModel {\n  readonly kind: \"det\";\n  readonly config: DetModelConfig;\n  readonly provider: string;\n  predict(cv: OpenCv, mats: Mat[], overrides?: DetRuntimeOverrides): Promise<DetResult[]>;\n  dispose(): Promise<void>;\n}\n\ninterface DetPreprocessResult {\n  tensor: Tensor;\n  srcW: number;\n  srcH: number;\n  dstW: number;\n  dstH: number;\n}\n\nexport interface DetResult {\n  boxes: DetBox[];\n  srcW: number;\n  srcH: number;\n}\n\ninterface InternalDetParams {\n  limitSideLen: number;\n  limitType: LimitType;\n  maxSideLimit: number;\n  thresh: number;\n  boxThresh: number;\n  unclipRatio: number;\n}\n\ninterface InternalDetBatchItem {\n  prep: DetPreprocessResult;\n  boxes: DetBox[];\n}\n\nconst DET_BOX_MIN_SIZE = 3;\n\nexport const DEFAULT_DET_MODEL_PARSE_FALLBACKS: Readonly<DetModelConfig> = Object.freeze({\n  resizeLong: 960,\n  limitType: \"max\",\n  maxSideLimit: 4000,\n  normalize: {\n    mean: [0.485, 0.456, 0.406],\n    std: [0.229, 0.224, 0.225],\n    scale: 1 / 255\n  },\n  postprocess: {\n    thresh: 0.3,\n    boxThresh: 0.6,\n    maxCandidates: 1000,\n    unclipRatio: 2.0\n  }\n});\n\nexport const DEFAULT_DET_MODEL_CONFIG: Readonly<DetModelConfig> = Object.freeze({\n  ...DEFAULT_DET_MODEL_PARSE_FALLBACKS\n});\n\nfunction parseDetLimitType(raw: unknown): LimitType {\n  const v = typeof raw === \"string\" ? raw.trim().toLowerCase() : \"\";\n  if (v === \"min\" || v === \"max\") {\n    return v;\n  }\n  return DEFAULT_DET_MODEL_PARSE_FALLBACKS.limitType;\n}\n\nexport function parseDetModelConfigText(text: string): DetModelConfig {\n  const parsed = parseInferenceConfigText(text);\n  const preProcess = parsed.PreProcess as Record<string, unknown> | undefined;\n  const transformOps = preProcess?.transform_ops as Array<Record<string, unknown>> | undefined;\n  const resize = getTransformOp(transformOps, \"DetResizeForTest\");\n  const normalize = getTransformOp(transformOps, \"NormalizeImage\");\n  const postprocess = (parsed.PostProcess || {}) as Record<string, unknown>;\n\n  const maxSideRaw = resize?.max_side_limit;\n  const maxSideLimit = Number(maxSideRaw);\n  const maxSide =\n    Number.isFinite(maxSideLimit) && maxSideLimit > 0\n      ? maxSideLimit\n      : DEFAULT_DET_MODEL_PARSE_FALLBACKS.maxSideLimit;\n\n  return {\n    resizeLong: Number(resize?.resize_long ?? DEFAULT_DET_MODEL_PARSE_FALLBACKS.resizeLong),\n    limitType: parseDetLimitType(resize?.limit_type),\n    maxSideLimit: maxSide,\n    normalize: {\n      mean:\n        (normalize?.mean as number[] | undefined) ??\n        DEFAULT_DET_MODEL_PARSE_FALLBACKS.normalize.mean,\n      std:\n        (normalize?.std as number[] | undefined) ?? DEFAULT_DET_MODEL_PARSE_FALLBACKS.normalize.std,\n      scale: parseScaleValue(normalize?.scale, DEFAULT_DET_MODEL_PARSE_FALLBACKS.normalize.scale)\n    },\n    postprocess: {\n      thresh: Number(postprocess.thresh ?? DEFAULT_DET_MODEL_PARSE_FALLBACKS.postprocess.thresh),\n      boxThresh: Number(\n        postprocess.box_thresh ?? DEFAULT_DET_MODEL_PARSE_FALLBACKS.postprocess.boxThresh\n      ),\n      maxCandidates: Number(\n        postprocess.max_candidates ?? DEFAULT_DET_MODEL_PARSE_FALLBACKS.postprocess.maxCandidates\n      ),\n      unclipRatio: Number(\n        postprocess.unclip_ratio ?? DEFAULT_DET_MODEL_PARSE_FALLBACKS.postprocess.unclipRatio\n      )\n    }\n  };\n}\n\ninterface CreateDetModelArgs {\n  ort: OrtModule;\n  modelBytes: Uint8Array;\n  configText: string;\n  backend: string;\n  webgpuState: WebGpuState;\n  batchSize?: number;\n}\n\nfunction resolveDetParams(\n  defaults: InternalDetParams,\n  overrides?: DetRuntimeOverrides\n): InternalDetParams {\n  return {\n    limitSideLen: overrides?.limitSideLen ?? defaults.limitSideLen,\n    limitType: overrides?.limitType ?? defaults.limitType,\n    maxSideLimit: overrides?.maxSideLimit ?? defaults.maxSideLimit,\n    thresh: overrides?.thresh ?? defaults.thresh,\n    boxThresh: overrides?.boxThresh ?? defaults.boxThresh,\n    unclipRatio: overrides?.unclipRatio ?? defaults.unclipRatio\n  };\n}\n\nexport async function createDetModel({\n  ort,\n  modelBytes,\n  configText,\n  backend,\n  webgpuState,\n  batchSize: batchSizeArg\n}: CreateDetModelArgs): Promise<DetModel> {\n  assertModelResources(\"Detection\", {\n    model: modelBytes,\n    config: configText\n  });\n  const config = parseDetModelConfigText(configText);\n  const defaultBatchSize = Math.max(1, batchSizeArg ?? 1);\n  const defaultParams: InternalDetParams = {\n    limitSideLen: config.resizeLong,\n    limitType: config.limitType,\n    maxSideLimit: config.maxSideLimit,\n    thresh: config.postprocess.thresh,\n    boxThresh: config.postprocess.boxThresh,\n    unclipRatio: config.postprocess.unclipRatio\n  };\n  let sessionState: SessionState | null = await createDetModelSession(\n    ort,\n    modelBytes,\n    backend,\n    webgpuState\n  );\n\n  return {\n    kind: \"det\",\n    config,\n    get provider() {\n      return sessionState?.provider || \"\";\n    },\n    async predict(cv, mats, overrides) {\n      if (!sessionState?.session) {\n        throw new Error(\"Detection model session is not initialized.\");\n      }\n      const params = resolveDetParams(defaultParams, overrides);\n      const batchSize = resolveRuntimeBatchSize(overrides?.batchSize, defaultBatchSize);\n      const results: DetResult[] = [];\n      const runCtx: DetRunContext = {\n        cv,\n        ort,\n        config,\n        session: sessionState.session\n      };\n      for (const chunk of chunkArray(mats, batchSize)) {\n        const preps = preprocess({ cv, ort, config }, chunk, params);\n        const inputTensor = packDetBatchTensor(ort, preps);\n        const fullOutput = await runInference(sessionState.session, inputTensor);\n        const internals = postprocess(runCtx, fullOutput, preps, params);\n        for (const internal of internals) {\n          results.push({\n            boxes: internal.boxes,\n            srcW: internal.prep.srcW,\n            srcH: internal.prep.srcH\n          });\n        }\n      }\n      return results;\n    },\n    async dispose() {\n      await releaseSessions(sessionState?.session);\n      sessionState = null;\n    }\n  };\n}\n\nexport async function createDetModelSession(\n  ort: OrtModule,\n  modelBytes: Uint8Array,\n  backend: string,\n  webgpuState: WebGpuState\n): Promise<SessionState> {\n  const providerCandidates = getProviderCandidates(backend, webgpuState);\n  return withTimeout(createSession(ort, modelBytes, providerCandidates), 60000, \"Detection model\");\n}\n\ninterface DetContext {\n  cv: OpenCv;\n  ort: OrtModule;\n  config: DetModelConfig;\n}\n\ninterface DetRunContext extends DetContext {\n  session: InferenceSession;\n}\n\nfunction preprocess(\n  context: DetContext,\n  mats: Mat[],\n  params: InternalDetParams\n): DetPreprocessResult[] {\n  return mats.map((mat) => preprocessSample(context, mat, params));\n}\n\nfunction preprocessSample(\n  context: DetContext,\n  sourceMat: Mat,\n  params: InternalDetParams\n): DetPreprocessResult {\n  const { cv, ort, config } = context;\n  const srcW = sourceMat.cols;\n  const srcH = sourceMat.rows;\n  const limitSideLen = Math.max(32, params.limitSideLen);\n  const limitType: LimitType = params.limitType;\n  const maxSideLimit = Math.max(32, params.maxSideLimit);\n  let scale = 1.0;\n  if (limitType === \"max\") {\n    const maxSide = Math.max(srcW, srcH);\n    if (maxSide > limitSideLen) {\n      scale = limitSideLen / Math.max(1, maxSide);\n    }\n  } else {\n    const minSide = Math.min(srcW, srcH);\n    if (minSide < limitSideLen) {\n      scale = limitSideLen / Math.max(1, minSide);\n    }\n  }\n  let dstW = Math.max(32, Math.round((srcW * scale) / 32) * 32);\n  let dstH = Math.max(32, Math.round((srcH * scale) / 32) * 32);\n  if (Math.max(dstW, dstH) > maxSideLimit) {\n    const limitScale = maxSideLimit / Math.max(dstW, dstH);\n    dstW = Math.max(32, Math.floor(dstW * limitScale));\n    dstH = Math.max(32, Math.floor(dstH * limitScale));\n  }\n  dstW = clamp(dstW, 32, maxSideLimit);\n  dstH = clamp(dstH, 32, maxSideLimit);\n  dstW = Math.max(32, Math.round(dstW / 32) * 32);\n  dstH = Math.max(32, Math.round(dstH / 32) * 32);\n\n  const resized = new cv.Mat();\n  const bgr = new cv.Mat();\n  cv.resize(sourceMat, resized, new cv.Size(dstW, dstH), 0, 0, cv.INTER_LINEAR);\n  if (resized.channels() === 4) {\n    cv.cvtColor(resized, bgr, cv.COLOR_RGBA2BGR);\n  } else if (resized.channels() === 1) {\n    cv.cvtColor(resized, bgr, cv.COLOR_GRAY2BGR);\n  } else {\n    resized.copyTo(bgr);\n  }\n  const chw = toBgrFloatCHWFromBgr(bgr.data, dstW, dstH, config.normalize);\n  resized.delete();\n  bgr.delete();\n\n  return {\n    tensor: new ort.Tensor(\"float32\", chw, [1, 3, dstH, dstW]),\n    srcW,\n    srcH,\n    dstW,\n    dstH\n  };\n}\n\nfunction getDetMap(outputTensor: Tensor): { data: Float32Array; h: number; w: number } {\n  const dims = outputTensor.dims;\n  const data = outputTensor.data as Float32Array;\n  if (dims.length === 4) return { data, h: dims[2], w: dims[3] };\n  if (dims.length === 3) return { data, h: dims[1], w: dims[2] };\n  throw new Error(`Unexpected det output dims: [${dims.join(\", \")}]`);\n}\n\nfunction createBatchDetTensor(\n  ort: OrtModule,\n  preps: DetPreprocessResult[],\n  maxH: number,\n  maxW: number\n): Tensor {\n  const batch = preps.length;\n  const plane = 3 * maxH * maxW;\n  const out = new Float32Array(batch * plane);\n  for (let i = 0; i < batch; i += 1) {\n    const prep = preps[i];\n    const chw = prep.tensor.data as Float32Array;\n    const { dstH, dstW } = prep;\n    const base = i * plane;\n    for (let c = 0; c < 3; c += 1) {\n      const srcChannelBase = c * dstH * dstW;\n      const dstChannelBase = base + c * maxH * maxW;\n      for (let y = 0; y < dstH; y += 1) {\n        const srcRow = srcChannelBase + y * dstW;\n        const dstRow = dstChannelBase + y * maxW;\n        out.set(chw.subarray(srcRow, srcRow + dstW), dstRow);\n      }\n    }\n  }\n  return new ort.Tensor(\"float32\", out, [batch, 3, maxH, maxW]);\n}\n\nfunction packDetBatchTensor(ort: OrtModule, preps: DetPreprocessResult[]): Tensor {\n  const maxH = Math.max(...preps.map((p) => p.dstH));\n  const maxW = Math.max(...preps.map((p) => p.dstW));\n  return createBatchDetTensor(ort, preps, maxH, maxW);\n}\n\nfunction batchDetOutputPlaneOffset(dims: readonly number[], batchIndex: number): number {\n  const tail = dims.slice(1).reduce((a, b) => a * b, 1);\n  return batchIndex * tail;\n}\n\nfunction detFeatureCropDims(\n  dstH: number,\n  dstW: number,\n  maxH: number,\n  maxW: number,\n  ohFull: number,\n  owFull: number\n): { cropOh: number; cropOw: number } {\n  const cropOh = Math.max(1, Math.min(ohFull, Math.round((ohFull * dstH) / maxH)));\n  const cropOw = Math.max(1, Math.min(owFull, Math.round((owFull * dstW) / maxW)));\n  return { cropOh, cropOw };\n}\n\nfunction sliceBatchedDetOutputPlane(\n  ort: OrtModule,\n  fullOutput: Tensor,\n  batchIndex: number,\n  cropOh: number,\n  cropOw: number,\n  ohFull: number,\n  owFull: number\n): Tensor {\n  const data = fullOutput.data as Float32Array;\n  const dims = fullOutput.dims;\n  const base = batchDetOutputPlaneOffset(dims, batchIndex);\n  const out = new Float32Array(cropOh * cropOw);\n  for (let r = 0; r < cropOh; r += 1) {\n    const rowStart = base + r * owFull;\n    out.set(data.subarray(rowStart, rowStart + cropOw), r * cropOw);\n  }\n  return new ort.Tensor(\"float32\", out, [1, 1, cropOh, cropOw]);\n}\n\nfunction postprocess(\n  context: DetRunContext,\n  fullOutput: Tensor,\n  preps: DetPreprocessResult[],\n  params: InternalDetParams\n): InternalDetBatchItem[] {\n  const { cv, ort, config } = context;\n  const od = fullOutput.dims;\n  if (od.length !== 3 && od.length !== 4) {\n    throw new Error(`Unexpected det output dims: [${od.join(\", \")}]`);\n  }\n  const ohFull = od.length === 4 ? od[2] : od[1];\n  const owFull = od.length === 4 ? od[3] : od[2];\n  const nOut = od.length === 4 ? od[0] : preps.length === 1 ? 1 : od[0];\n  if (nOut !== preps.length) {\n    throw new Error(\n      `Detection batch output N=${String(nOut)} does not match input batch ${String(preps.length)}`\n    );\n  }\n\n  const maxH = Math.max(...preps.map((p) => p.dstH));\n  const maxW = Math.max(...preps.map((p) => p.dstW));\n\n  const items: InternalDetBatchItem[] = [];\n  for (let i = 0; i < preps.length; i += 1) {\n    const prep = preps[i];\n    const { cropOh, cropOw } = detFeatureCropDims(prep.dstH, prep.dstW, maxH, maxW, ohFull, owFull);\n    const planeTensor = sliceBatchedDetOutputPlane(\n      ort,\n      fullOutput,\n      i,\n      cropOh,\n      cropOw,\n      ohFull,\n      owFull\n    );\n    const boxes = decodeDetOutput(\n      { cv, config },\n      planeTensor,\n      prep,\n      params.thresh,\n      params.boxThresh,\n      params.unclipRatio\n    );\n    items.push({ prep, boxes });\n  }\n  return items;\n}\n\nfunction decodeDetOutput(\n  context: { cv: OpenCv; config: DetModelConfig },\n  detOutput: Tensor,\n  meta: DetPreprocessResult,\n  detThresh: number,\n  boxThresh: number,\n  unclipRatio: number\n): DetBox[] {\n  const { cv, config } = context;\n  const { data, h, w } = getDetMap(detOutput);\n  const pred = cv.matFromArray(h, w, cv.CV_32FC1, data);\n  const maskData = new Uint8Array(h * w);\n  for (let i = 0; i < data.length; i += 1) {\n    maskData[i] = data[i] > detThresh ? 255 : 0;\n  }\n  const bitmap = cv.matFromArray(h, w, cv.CV_8UC1, maskData);\n  const contours = new cv.MatVector();\n  const hierarchy = new cv.Mat();\n  cv.findContours(bitmap, contours, hierarchy, cv.RETR_LIST, cv.CHAIN_APPROX_SIMPLE);\n\n  const boxes: DetBox[] = [];\n  const candidateCount = Math.min(config.postprocess.maxCandidates, contours.size());\n  for (let i = 0; i < candidateCount; i += 1) {\n    const contour = contours.get(i);\n    if (contour.rows < 4) {\n      contour.delete();\n      continue;\n    }\n    const points: Point2D[] = [];\n    for (let row = 0; row < contour.rows; row += 1) {\n      points.push([contour.data32S[row * 2], contour.data32S[row * 2 + 1]]);\n    }\n    const mini = getMiniBoxFromPoints(cv, points);\n    if (mini.side < DET_BOX_MIN_SIZE) {\n      contour.delete();\n      continue;\n    }\n    const score = boxScoreFast(cv, pred, mini.box);\n    if (score < boxThresh) {\n      contour.delete();\n      continue;\n    }\n    const expanded = unclip(mini.box, unclipRatio);\n    if (!expanded || expanded.length < 4) {\n      contour.delete();\n      continue;\n    }\n    const miniUnclip = getMiniBoxFromPoints(cv, expanded);\n    if (miniUnclip.side < DET_BOX_MIN_SIZE + 2) {\n      contour.delete();\n      continue;\n    }\n\n    const poly: Point2D[] = miniUnclip.box.map((point) => [\n      clamp(Math.round((point[0] * meta.srcW) / Math.max(1, w)), 0, meta.srcW),\n      clamp(Math.round((point[1] * meta.srcH) / Math.max(1, h)), 0, meta.srcH)\n    ]);\n    boxes.push({ poly, score });\n    contour.delete();\n  }\n\n  pred.delete();\n  bitmap.delete();\n  contours.delete();\n  hierarchy.delete();\n\n  boxes.sort((a, b) => a.poly[0][1] - b.poly[0][1] || a.poly[0][0] - b.poly[0][0]);\n  for (let i = 0; i < boxes.length - 1; i += 1) {\n    for (let j = i; j >= 0; j -= 1) {\n      if (\n        Math.abs(boxes[j + 1].poly[0][1] - boxes[j].poly[0][1]) < 10 &&\n        boxes[j + 1].poly[0][0] < boxes[j].poly[0][0]\n      ) {\n        const tmp = boxes[j];\n        boxes[j] = boxes[j + 1];\n        boxes[j + 1] = tmp;\n      } else {\n        break;\n      }\n    }\n  }\n\n  return boxes;\n}\n","import type { OpenCv, Mat } from \"@techstark/opencv-js\";\nimport type { Tensor } from \"onnxruntime-web\";\n\nimport { assertModelResources } from \"../resources/model-asset\";\nimport { createSession, getProviderCandidates, releaseSessions } from \"../runtime/ort\";\nimport type { OrtModule, WebGpuState, SessionState } from \"../runtime/ort\";\nimport { chunkArray, clamp, resolveRuntimeBatchSize, withTimeout } from \"../utils/common\";\nimport { getTransformOp, parseInferenceConfigText, toBgrFloatCHWFromBgr } from \"./common\";\nimport { runInference } from \"./infer\";\nimport type { NormalizeConfig } from \"./common\";\n\nexport interface RecModelConfig {\n  imageShape: number[];\n  charDict: string[];\n}\n\nexport interface RecResult {\n  text: string;\n  score: number;\n}\n\nexport interface RecRuntimeOverrides {\n  batchSize?: number;\n}\n\nexport interface RecModel {\n  readonly kind: \"rec\";\n  readonly config: RecModelConfig;\n  readonly provider: string;\n  predict(cv: OpenCv, mats: Mat[], overrides?: RecRuntimeOverrides): Promise<RecResult[]>;\n  dispose(): Promise<void>;\n}\n\ninterface RecSample {\n  inputIndex: number;\n  width: number;\n  chw: Float32Array;\n}\n\nconst DEFAULT_REC_ALPHANUMERIC_DICT = \"0123456789abcdefghijklmnopqrstuvwxyz\".split(\"\");\n\nconst REC_NORMALIZE: Readonly<NormalizeConfig> = Object.freeze({\n  mean: [0.5, 0.5, 0.5],\n  std: [0.5, 0.5, 0.5],\n  scale: 1 / 255\n});\n\nexport const DEFAULT_REC_MODEL_PARSE_FALLBACKS: Readonly<\n  Pick<RecModelConfig, \"imageShape\" | \"charDict\">\n> = Object.freeze({\n  imageShape: [3, 48, 320],\n  charDict: []\n});\n\nexport const DEFAULT_REC_RUNTIME_LIMITS = Object.freeze({});\n\nconst MAX_REC_WIDTH = 3200;\n\nexport const DEFAULT_REC_MODEL_CONFIG: Readonly<RecModelConfig> = Object.freeze({\n  ...DEFAULT_REC_MODEL_PARSE_FALLBACKS\n});\n\nexport function parseRecModelConfigText(text: string): RecModelConfig {\n  const parsed = parseInferenceConfigText(text);\n  const preProcess = parsed.PreProcess as Record<string, unknown> | undefined;\n  const transformOps = preProcess?.transform_ops as Array<Record<string, unknown>> | undefined;\n  const resize = getTransformOp(transformOps, \"RecResizeImg\");\n  const postprocess = (parsed.PostProcess || {}) as Record<string, unknown>;\n  const baseCharDict = postprocess.character_dict;\n\n  const imageShape = resize?.image_shape as number[] | undefined;\n  if (!imageShape || !Array.isArray(imageShape) || imageShape.length < 3) {\n    throw new Error(\"RecResizeImg.image_shape is required in rec inference.yml\");\n  }\n\n  const charDict =\n    Array.isArray(baseCharDict) && baseCharDict.length > 0\n      ? [...(baseCharDict as string[]), \" \"]\n      : [...DEFAULT_REC_ALPHANUMERIC_DICT, \" \"];\n\n  return {\n    imageShape,\n    charDict\n  };\n}\n\ninterface CreateRecModelArgs {\n  ort: OrtModule;\n  modelBytes: Uint8Array;\n  configText: string;\n  backend: string;\n  webgpuState: WebGpuState;\n  batchSize?: number;\n}\n\nexport async function createRecModel({\n  ort,\n  modelBytes,\n  configText,\n  backend,\n  webgpuState,\n  batchSize: batchSizeArg\n}: CreateRecModelArgs): Promise<RecModel> {\n  assertModelResources(\"Recognition\", {\n    model: modelBytes,\n    config: configText\n  });\n  const config = parseRecModelConfigText(configText);\n  const defaultBatchSize = Math.max(1, batchSizeArg ?? 1);\n  let sessionState: SessionState | null = await createRecModelSession(\n    ort,\n    modelBytes,\n    backend,\n    webgpuState\n  );\n\n  return {\n    kind: \"rec\",\n    config,\n    get provider() {\n      return sessionState?.provider || \"\";\n    },\n    async predict(cv, mats, overrides) {\n      if (!sessionState?.session) {\n        throw new Error(\"Recognition model session is not initialized.\");\n      }\n      const batchSize = resolveRuntimeBatchSize(overrides?.batchSize, defaultBatchSize);\n      const ctx = { cv, config };\n      const samples = preprocess(ctx, mats);\n      const charDict = config.charDict;\n      const ordered = samples.slice().sort((a, b) => a.width - b.width);\n      const decoded: Array<{ inputIndex: number; text: string; score: number }> = [];\n      const targetH = config.imageShape[1];\n\n      for (const batch of chunkArray(ordered, batchSize)) {\n        const inputTensor = packRecBatchTensor(ort, batch, targetH);\n        const output = await runInference(sessionState.session, inputTensor);\n        const batchResults = postprocess(output, charDict);\n        for (let index = 0; index < batchResults.length; index += 1) {\n          decoded.push({\n            inputIndex: batch[index].inputIndex,\n            ...batchResults[index]\n          });\n        }\n      }\n\n      decoded.sort((a, b) => a.inputIndex - b.inputIndex);\n      return decoded.map(({ text, score }) => ({ text, score }));\n    },\n    async dispose() {\n      await releaseSessions(sessionState?.session);\n      sessionState = null;\n    }\n  };\n}\n\nexport async function createRecModelSession(\n  ort: OrtModule,\n  modelBytes: Uint8Array,\n  backend: string,\n  webgpuState: WebGpuState\n): Promise<SessionState> {\n  const providerCandidates = getProviderCandidates(backend, webgpuState);\n  return withTimeout(\n    createSession(ort, modelBytes, providerCandidates),\n    60000,\n    \"Recognition model\"\n  );\n}\n\nfunction preprocess(context: { cv: OpenCv; config: RecModelConfig }, mats: Mat[]): RecSample[] {\n  const samples: RecSample[] = [];\n  for (let i = 0; i < mats.length; i += 1) {\n    samples.push(preprocessSample(context, mats[i], i));\n  }\n  return samples;\n}\n\nfunction preprocessSample(\n  context: { cv: OpenCv; config: RecModelConfig },\n  cropMat: Mat,\n  inputIndex: number\n): RecSample {\n  const { cv, config } = context;\n  const [channels, targetH, baseW] = config.imageShape;\n  const srcW = cropMat.cols;\n  const srcH = cropMat.rows;\n  if (channels !== 3) {\n    throw new Error(`Unexpected recognition channels: ${String(channels)}`);\n  }\n  const ratio = srcW / Math.max(1, srcH);\n  const maxWhRatio = Math.max(baseW / Math.max(1, targetH), ratio);\n  const recW = clamp(Math.trunc(targetH * maxWhRatio), 1, MAX_REC_WIDTH);\n  const resizedW = Math.min(recW, Math.ceil(targetH * ratio));\n  const resized = new cv.Mat();\n  const bgr = new cv.Mat();\n  cv.resize(cropMat, resized, new cv.Size(resizedW, targetH), 0, 0, cv.INTER_LINEAR);\n  if (resized.channels() === 4) {\n    cv.cvtColor(resized, bgr, cv.COLOR_RGBA2BGR);\n  } else if (resized.channels() === 1) {\n    cv.cvtColor(resized, bgr, cv.COLOR_GRAY2BGR);\n  } else {\n    resized.copyTo(bgr);\n  }\n  const resizedChw = toBgrFloatCHWFromBgr(bgr.data, resizedW, targetH, REC_NORMALIZE);\n  const chw = new Float32Array(3 * targetH * recW);\n  const dstPerChannel = targetH * recW;\n  const srcPerChannel = targetH * resizedW;\n  for (let channel = 0; channel < 3; channel += 1) {\n    for (let row = 0; row < targetH; row += 1) {\n      const srcStart = channel * srcPerChannel + row * resizedW;\n      const dstStart = channel * dstPerChannel + row * recW;\n      chw.set(resizedChw.subarray(srcStart, srcStart + resizedW), dstStart);\n    }\n  }\n  bgr.delete();\n  resized.delete();\n  return { inputIndex, width: recW, chw };\n}\n\nfunction createBatchTensor(\n  ort: OrtModule,\n  samples: RecSample[],\n  maxW: number,\n  targetH: number\n): Tensor {\n  const batch = samples.length;\n  const out = new Float32Array(batch * 3 * targetH * maxW);\n  const dstPerChannel = targetH * maxW;\n  for (let index = 0; index < batch; index += 1) {\n    const sample = samples[index];\n    const srcW = sample.width;\n    const srcPerChannel = targetH * srcW;\n    for (let channel = 0; channel < 3; channel += 1) {\n      const srcBase = channel * srcPerChannel;\n      const dstBase = index * (3 * dstPerChannel) + channel * dstPerChannel;\n      for (let row = 0; row < targetH; row += 1) {\n        const srcStart = srcBase + row * srcW;\n        const dstStart = dstBase + row * maxW;\n        out.set(sample.chw.subarray(srcStart, srcStart + srcW), dstStart);\n      }\n    }\n  }\n  return new ort.Tensor(\"float32\", out, [batch, 3, targetH, maxW]);\n}\n\nfunction packRecBatchTensor(ort: OrtModule, samples: RecSample[], targetH: number): Tensor {\n  const maxW = samples.reduce((acc, sample) => Math.max(acc, sample.width), 1);\n  return createBatchTensor(ort, samples, maxW, targetH);\n}\n\nfunction decodeCTCSample(\n  data: Float32Array,\n  offset: number,\n  timeSteps: number,\n  classes: number,\n  charDict: string[]\n): { text: string; score: number } {\n  let prevIdx = -1;\n  let text = \"\";\n  const probs: number[] = [];\n  for (let step = 0; step < timeSteps; step += 1) {\n    let maxIdx = 0;\n    let maxVal = -Infinity;\n    const stepOffset = offset + step * classes;\n    for (let cls = 0; cls < classes; cls += 1) {\n      const value = data[stepOffset + cls];\n      if (value > maxVal) {\n        maxVal = value;\n        maxIdx = cls;\n      }\n    }\n    if (maxIdx > 0 && maxIdx !== prevIdx) {\n      const dictIdx = maxIdx - 1;\n      if (dictIdx >= 0 && dictIdx < charDict.length) {\n        text += charDict[dictIdx];\n        probs.push(maxVal);\n      }\n    }\n    prevIdx = maxIdx;\n  }\n  const score = probs.length ? probs.reduce((a, b) => a + b, 0) / probs.length : 0;\n  return { text, score };\n}\n\nfunction postprocess(output: Tensor, charDict: string[]): Array<{ text: string; score: number }> {\n  const dims = output.dims;\n  if (dims.length !== 3) {\n    throw new Error(`Unexpected rec output dims: [${dims.join(\", \")}]`);\n  }\n  const sampleCount = dims[0];\n  const timeSteps = dims[1];\n  const classes = dims[2];\n  const data = output.data as Float32Array;\n  const stride = timeSteps * classes;\n  const results: Array<{ text: string; score: number }> = [];\n  for (let index = 0; index < sampleCount; index += 1) {\n    results.push(decodeCTCSample(data, index * stride, timeSteps, classes, charDict));\n  }\n  return results;\n}\n","import type { OpenCv, Mat } from \"@techstark/opencv-js\";\n\nimport { getMiniBoxFromPoints } from \"../../models/common\";\nimport type { Point2D } from \"../../models/common\";\n\nexport function cropByPoly(cv: OpenCv, srcMat: Mat, poly: Point2D[]): Mat {\n  const ordered = getMiniBoxFromPoints(cv, poly).box;\n  const widthTop = Math.hypot(ordered[1][0] - ordered[0][0], ordered[1][1] - ordered[0][1]);\n  const widthBottom = Math.hypot(ordered[2][0] - ordered[3][0], ordered[2][1] - ordered[3][1]);\n  const heightLeft = Math.hypot(ordered[3][0] - ordered[0][0], ordered[3][1] - ordered[0][1]);\n  const heightRight = Math.hypot(ordered[2][0] - ordered[1][0], ordered[2][1] - ordered[1][1]);\n  const cropW = Math.max(1, Math.floor(Math.max(widthTop, widthBottom)));\n  const cropH = Math.max(1, Math.floor(Math.max(heightLeft, heightRight)));\n\n  const srcTri = cv.matFromArray(4, 1, cv.CV_32FC2, [\n    ordered[0][0],\n    ordered[0][1],\n    ordered[1][0],\n    ordered[1][1],\n    ordered[2][0],\n    ordered[2][1],\n    ordered[3][0],\n    ordered[3][1]\n  ]);\n  const dstTri = cv.matFromArray(4, 1, cv.CV_32FC2, [0, 0, cropW, 0, cropW, cropH, 0, cropH]);\n  const transform = cv.getPerspectiveTransform(srcTri, dstTri);\n  const warped = new cv.Mat();\n  cv.warpPerspective(\n    srcMat,\n    warped,\n    transform,\n    new cv.Size(cropW, cropH),\n    cv.INTER_CUBIC,\n    cv.BORDER_REPLICATE,\n    new cv.Scalar()\n  );\n  srcTri.delete();\n  dstTri.delete();\n  transform.delete();\n\n  if (warped.rows / Math.max(1, warped.cols) >= 1.5) {\n    const rotated = new cv.Mat();\n    cv.rotate(warped, rotated, cv.ROTATE_90_COUNTERCLOCKWISE);\n    warped.delete();\n    return rotated;\n  }\n  return warped;\n}\n","import type { OpenCv } from \"@techstark/opencv-js\";\nimport cvModule from \"@techstark/opencv-js\";\n\nlet cachedCvPromise: Promise<{ cv: OpenCv }> | null = null;\n\nasync function getOpenCv(): Promise<{ cv: OpenCv }> {\n  let cv: OpenCv;\n  if (cvModule instanceof Promise) {\n    cv = await cvModule;\n  } else {\n    const mod = cvModule as { Mat?: unknown; onRuntimeInitialized?: () => void };\n    if (mod.Mat) {\n      cv = cvModule as OpenCv;\n    } else {\n      await new Promise<void>((resolve) => {\n        mod.onRuntimeInitialized = () => {\n          resolve();\n        };\n      });\n      cv = cvModule as OpenCv;\n    }\n  }\n  return { cv };\n}\n\nexport async function initOpenCvRuntime(): Promise<{ cv: OpenCv }> {\n  if (!cachedCvPromise) {\n    cachedCvPromise = getOpenCv().catch((error: unknown) => {\n      cachedCvPromise = null;\n      throw error;\n    });\n  }\n  return cachedCvPromise;\n}\n","import type { DetModelConfig, DetRuntimeOverrides, LimitType } from \"../../models/det\";\nimport type { RecModelConfig } from \"../../models/rec\";\n\nexport type { LimitType };\n\nexport interface OcrModelConfig {\n  det: DetModelConfig;\n  rec: RecModelConfig;\n}\n\nexport interface ResolvedOcrParams {\n  det: DetRuntimeOverrides;\n  pipeline: { scoreThresh: number };\n}\n\nexport interface OcrRuntimeParamsInput {\n  text_det_limit_side_len?: number;\n  textDetLimitSideLen?: number;\n  text_det_limit_type?: LimitType;\n  textDetLimitType?: LimitType;\n  text_det_max_side_limit?: number;\n  textDetMaxSideLimit?: number;\n  text_det_thresh?: number;\n  textDetThresh?: number;\n  text_det_box_thresh?: number;\n  textDetBoxThresh?: number;\n  text_det_unclip_ratio?: number;\n  textDetUnclipRatio?: number;\n  text_rec_score_thresh?: number;\n  textRecScoreThresh?: number;\n}\n\nfunction firstDefined<T>(...values: Array<T | undefined | null>): T | undefined {\n  for (const value of values) {\n    if (value !== undefined && value !== null) {\n      return value;\n    }\n  }\n  return undefined;\n}\n\nfunction toNumberOrUndefined(value: unknown): number | undefined {\n  if (value === undefined || value === null) return undefined;\n  const num = Number(value);\n  return Number.isFinite(num) ? num : undefined;\n}\n\nexport function getOcrRuntimeParams(\n  config: OcrModelConfig,\n  defaults: Partial<OcrRuntimeParamsInput> = {},\n  params: OcrRuntimeParamsInput = {}\n): ResolvedOcrParams {\n  return {\n    det: {\n      limitSideLen: toNumberOrUndefined(\n        firstDefined(\n          params.text_det_limit_side_len,\n          params.textDetLimitSideLen,\n          defaults.text_det_limit_side_len,\n          defaults.textDetLimitSideLen,\n          config.det.resizeLong\n        )\n      ),\n      limitType: firstDefined(\n        params.text_det_limit_type,\n        params.textDetLimitType,\n        defaults.text_det_limit_type,\n        defaults.textDetLimitType,\n        config.det.limitType\n      ),\n      maxSideLimit: toNumberOrUndefined(\n        firstDefined(\n          params.text_det_max_side_limit,\n          params.textDetMaxSideLimit,\n          defaults.text_det_max_side_limit,\n          defaults.textDetMaxSideLimit,\n          config.det.maxSideLimit\n        )\n      ),\n      thresh: toNumberOrUndefined(\n        firstDefined(\n          params.text_det_thresh,\n          params.textDetThresh,\n          defaults.text_det_thresh,\n          defaults.textDetThresh,\n          config.det.postprocess.thresh\n        )\n      ),\n      boxThresh: toNumberOrUndefined(\n        firstDefined(\n          params.text_det_box_thresh,\n          params.textDetBoxThresh,\n          defaults.text_det_box_thresh,\n          defaults.textDetBoxThresh,\n          config.det.postprocess.boxThresh\n        )\n      ),\n      unclipRatio: toNumberOrUndefined(\n        firstDefined(\n          params.text_det_unclip_ratio,\n          params.textDetUnclipRatio,\n          defaults.text_det_unclip_ratio,\n          defaults.textDetUnclipRatio,\n          config.det.postprocess.unclipRatio\n        )\n      )\n    },\n    pipeline: {\n      scoreThresh: Number(\n        firstDefined(\n          params.text_rec_score_thresh,\n          params.textRecScoreThresh,\n          defaults.text_rec_score_thresh,\n          defaults.textRecScoreThresh,\n          0\n        )\n      )\n    }\n  };\n}\n","export const DEFAULT_OCR_PIPELINE_CONFIG_TEXT = `\npipeline_name: OCR\n\ntext_type: general\n\nuse_doc_preprocessor: False\nuse_textline_orientation: False\n\nSubPipelines:\n  DocPreprocessor:\n    pipeline_name: doc_preprocessor\n    use_doc_orientation_classify: False\n    use_doc_unwarping: False\n    SubModules:\n      DocOrientationClassify:\n        module_name: doc_text_orientation\n        model_name: PP-LCNet_x1_0_doc_ori\n        model_dir: null\n      DocUnwarping:\n        module_name: image_unwarping\n        model_name: UVDoc\n        model_dir: null\n\nSubModules:\n  TextDetection:\n    module_name: text_detection\n    model_name: PP-OCRv5_mobile_det\n    model_dir: null\n    limit_side_len: 64\n    limit_type: min\n    max_side_limit: 4000\n    thresh: 0.3\n    box_thresh: 0.6\n    unclip_ratio: 1.5\n  TextLineOrientation:\n    module_name: textline_orientation\n    model_name: PP-LCNet_x1_0_textline_ori\n    model_dir: null\n    batch_size: 6\n  TextRecognition:\n    module_name: text_recognition\n    model_name: PP-OCRv5_mobile_rec\n    model_dir: null\n    batch_size: 6\n    score_thresh: 0.0\n`.trimStart();\n","import type { ModelAsset } from \"../../resources/model-asset\";\nimport { DEFAULT_MODEL_ASSETS } from \"../../resources/model-asset\";\nimport { DEFAULT_DET_MODEL_CONFIG } from \"../../models/det\";\nimport { DEFAULT_REC_MODEL_CONFIG } from \"../../models/rec\";\nimport { extractInferenceModelName } from \"../../models/common\";\nimport { deepClone } from \"../../utils/common\";\nimport type {\n  NormalizedPipelineConfig,\n  PipelineModelSelection,\n  PipelineRuntimeDefaults\n} from \"./config\";\nimport { normalizeOcrPipelineConfig, toFiniteNumber } from \"./config\";\nimport type { LimitType } from \"./runtime-params\";\nimport { DEFAULT_OCR_PIPELINE_CONFIG_TEXT } from \"./default-config\";\nimport type { OcrModelConfig } from \"./runtime-params\";\nimport type { OrtOptions } from \"../../runtime/ort\";\n\nexport interface ResolvedOcrOptions {\n  pipelineConfig: NormalizedPipelineConfig;\n  ortOptions: NormalizedOrtOptions;\n}\n\nexport type ResolvedBackend = \"webgpu\" | \"wasm\" | \"auto\";\n\nexport interface NormalizedOrtOptions {\n  backend: ResolvedBackend;\n  wasmPaths?: string;\n  numThreads?: number;\n  simd?: boolean;\n  proxy?: boolean;\n}\n\nexport interface WorkerResolvedOptions {\n  enabled: boolean;\n  createWorker: (() => Worker) | null;\n}\n\nexport const DEFAULT_OCR_CONFIG: OcrModelConfig = {\n  det: DEFAULT_DET_MODEL_CONFIG,\n  rec: DEFAULT_REC_MODEL_CONFIG\n};\n\ninterface ModelRole {\n  assetKey: string;\n  modelRole: string;\n  selectionKey: keyof PipelineModelSelection;\n  nameAliases: string[];\n  assetAliases: string[];\n  nameLabel: string;\n  assetLabel: string;\n  assetRequirementError: string;\n}\n\nconst DEFAULT_NORMALIZED_PIPELINE_CONFIG = normalizeOcrPipelineConfig(\n  DEFAULT_OCR_PIPELINE_CONFIG_TEXT\n);\nconst DEFAULT_MODEL_SELECTION: Readonly<PipelineModelSelection> = Object.freeze({\n  ...DEFAULT_NORMALIZED_PIPELINE_CONFIG.modelSelection\n});\nconst DEFAULT_LANG_VERSION_MODEL_SELECTION: Readonly<PipelineModelSelection> = Object.freeze({\n  ...DEFAULT_MODEL_SELECTION\n});\nconst OCR_MODEL_ROLES: Readonly<ModelRole[]> = Object.freeze([\n  {\n    assetKey: \"det\",\n    modelRole: \"TextDetection\",\n    selectionKey: \"textDetectionModelName\",\n    nameAliases: [\"text_detection_model_name\", \"textDetectionModelName\"],\n    assetAliases: [\"textDetectionModelAsset\", \"text_detection_model_dir\", \"textDetectionModelDir\"],\n    nameLabel: \"text detection model name\",\n    assetLabel: \"text detection model asset\",\n    assetRequirementError: \"text_detection_model_dir requires text_detection_model_name.\"\n  },\n  {\n    assetKey: \"rec\",\n    modelRole: \"TextRecognition\",\n    selectionKey: \"textRecognitionModelName\",\n    nameAliases: [\"text_recognition_model_name\", \"textRecognitionModelName\"],\n    assetAliases: [\n      \"textRecognitionModelAsset\",\n      \"text_recognition_model_dir\",\n      \"textRecognitionModelDir\"\n    ],\n    nameLabel: \"text recognition model name\",\n    assetLabel: \"text recognition model asset\",\n    assetRequirementError: \"text_recognition_model_dir requires text_recognition_model_name.\"\n  }\n]);\n\nconst SUPPORTED_LANG_VERSION_MODELS = new Map<string, Readonly<PipelineModelSelection>>([\n  [\"ch::PP-OCRv5\", DEFAULT_LANG_VERSION_MODEL_SELECTION],\n  [\"chinese_cht::PP-OCRv5\", DEFAULT_LANG_VERSION_MODEL_SELECTION],\n  [\"en::PP-OCRv5\", DEFAULT_LANG_VERSION_MODEL_SELECTION],\n  [\"japan::PP-OCRv5\", DEFAULT_LANG_VERSION_MODEL_SELECTION]\n]);\n\nfunction readAliasedOption(\n  options: Record<string, unknown>,\n  aliases: string[],\n  label: string\n): unknown {\n  let resolved: unknown;\n  let hasResolvedValue = false;\n\n  for (const alias of aliases) {\n    if (!(alias in options)) continue;\n    const value = options[alias];\n    if (!hasResolvedValue) {\n      resolved = value;\n      hasResolvedValue = true;\n      continue;\n    }\n    if (value !== resolved) {\n      throw new Error(`Conflicting values provided for ${label}: ${aliases.join(\", \")}.`);\n    }\n  }\n\n  return hasResolvedValue ? resolved : undefined;\n}\n\nfunction isLimitType(value: unknown): value is LimitType {\n  return value === \"min\" || value === \"max\";\n}\n\nfunction overlayPipelineRuntimeDefaults(\n  base: PipelineRuntimeDefaults,\n  explicit: Partial<PipelineRuntimeDefaults>\n): PipelineRuntimeDefaults {\n  const next: Record<string, unknown> = { ...base };\n  for (const key of Object.keys(explicit) as Array<keyof PipelineRuntimeDefaults>) {\n    const value = explicit[key];\n    if (value === undefined) continue;\n    next[key as string] = value as unknown;\n  }\n  return next as PipelineRuntimeDefaults;\n}\n\nfunction readExplicitPipelineRuntimeDefaults(\n  options: Record<string, unknown>\n): Partial<PipelineRuntimeDefaults> {\n  const out: Partial<PipelineRuntimeDefaults> = {};\n\n  const limitSide = readAliasedOption(\n    options,\n    [\"text_det_limit_side_len\", \"textDetLimitSideLen\"],\n    \"text_det_limit_side_len\"\n  );\n  if (limitSide !== undefined) {\n    const n = toFiniteNumber(limitSide);\n    if (n !== undefined) out.text_det_limit_side_len = n;\n  }\n\n  const limitType = readAliasedOption(\n    options,\n    [\"text_det_limit_type\", \"textDetLimitType\"],\n    \"text_det_limit_type\"\n  );\n  if (limitType !== undefined && isLimitType(limitType)) {\n    out.text_det_limit_type = limitType;\n  }\n\n  const maxSide = readAliasedOption(\n    options,\n    [\"text_det_max_side_limit\", \"textDetMaxSideLimit\"],\n    \"text_det_max_side_limit\"\n  );\n  if (maxSide !== undefined) {\n    const n = toFiniteNumber(maxSide);\n    if (n !== undefined) out.text_det_max_side_limit = n;\n  }\n\n  const detThresh = readAliasedOption(\n    options,\n    [\"text_det_thresh\", \"textDetThresh\"],\n    \"text_det_thresh\"\n  );\n  if (detThresh !== undefined) {\n    const n = toFiniteNumber(detThresh);\n    if (n !== undefined) out.text_det_thresh = n;\n  }\n\n  const boxThresh = readAliasedOption(\n    options,\n    [\"text_det_box_thresh\", \"textDetBoxThresh\"],\n    \"text_det_box_thresh\"\n  );\n  if (boxThresh !== undefined) {\n    const n = toFiniteNumber(boxThresh);\n    if (n !== undefined) out.text_det_box_thresh = n;\n  }\n\n  const unclip = readAliasedOption(\n    options,\n    [\"text_det_unclip_ratio\", \"textDetUnclipRatio\"],\n    \"text_det_unclip_ratio\"\n  );\n  if (unclip !== undefined) {\n    const n = toFiniteNumber(unclip);\n    if (n !== undefined) out.text_det_unclip_ratio = n;\n  }\n\n  const recScore = readAliasedOption(\n    options,\n    [\"text_rec_score_thresh\", \"textRecScoreThresh\"],\n    \"text_rec_score_thresh\"\n  );\n  if (recScore !== undefined) {\n    const n = toFiniteNumber(recScore);\n    if (n !== undefined) out.text_rec_score_thresh = n;\n  }\n\n  return out;\n}\n\nfunction toBatchSizeOption(value: unknown): number | undefined {\n  const n = toFiniteNumber(value);\n  return n !== undefined && n >= 1 ? Math.floor(n) : undefined;\n}\n\nfunction readExplicitBatchSizes(options: Record<string, unknown>): {\n  det: number | undefined;\n  rec: number | undefined;\n  pipeline: number | undefined;\n} {\n  return {\n    det: toBatchSizeOption(\n      readAliasedOption(\n        options,\n        [\"textDetectionBatchSize\", \"text_detection_batch_size\"],\n        \"textDetectionBatchSize\"\n      )\n    ),\n    rec: toBatchSizeOption(\n      readAliasedOption(\n        options,\n        [\"textRecognitionBatchSize\", \"text_recognition_batch_size\"],\n        \"textRecognitionBatchSize\"\n      )\n    ),\n    pipeline: toBatchSizeOption(\n      readAliasedOption(\n        options,\n        [\"pipelineBatchSize\", \"pipeline_batch_size\", \"batch_size\"],\n        \"pipelineBatchSize\"\n      )\n    )\n  };\n}\n\nfunction mergeNormalizedPipelineConfigWithExplicit(\n  normalized: NormalizedPipelineConfig,\n  options: Record<string, unknown>\n): NormalizedPipelineConfig {\n  const explicitRuntime = readExplicitPipelineRuntimeDefaults(options);\n  const explicitBatch = readExplicitBatchSizes(options);\n  const merged = deepClone(normalized);\n  merged.runtimeDefaults = overlayPipelineRuntimeDefaults(merged.runtimeDefaults, explicitRuntime);\n  if (explicitBatch.det !== undefined) {\n    merged.textDetectionBatchSize = explicitBatch.det;\n  }\n  if (explicitBatch.rec !== undefined) {\n    merged.textRecognitionBatchSize = explicitBatch.rec;\n  }\n  if (explicitBatch.pipeline !== undefined) {\n    merged.pipelineBatchSize = explicitBatch.pipeline;\n  }\n  return merged;\n}\n\nfunction resolveWarningBehavior(value: unknown): \"warn\" | \"ignore\" | \"error\" {\n  if (value === \"ignore\" || value === \"error\") return value;\n  return \"warn\";\n}\n\nfunction emitPipelineWarnings(warnings: string[], behavior: \"warn\" | \"ignore\" | \"error\"): void {\n  if (!warnings.length || behavior === \"ignore\") return;\n  if (behavior === \"error\") {\n    throw new Error(warnings.join(\" \"));\n  }\n  for (const warning of warnings) {\n    console.warn(`[PaddleOCR.js] ${warning}`);\n  }\n}\n\nfunction resolveModelAssetByName(_modelRole: string, modelName: string): ModelAsset {\n  const asset = DEFAULT_MODEL_ASSETS[modelName];\n  // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition -- runtime guard for missing Record key\n  if (!asset) {\n    throw new Error(`Unknown model asset \"${modelName}\".`);\n  }\n  return { url: asset.url };\n}\n\nfunction getSelectedModelName(\n  baseSelection: PipelineModelSelection | null,\n  configSelection: PipelineModelSelection | null,\n  explicitSelection: Record<string, string | null> | null,\n  selectionKey: keyof PipelineModelSelection\n): string | null {\n  return (\n    explicitSelection?.[selectionKey] ??\n    configSelection?.[selectionKey] ??\n    baseSelection?.[selectionKey] ??\n    null\n  );\n}\n\nfunction createResolvedModelSelection(\n  baseSelection: PipelineModelSelection | null,\n  configSelection: PipelineModelSelection | null,\n  explicitSelection: Record<string, string | null> | null\n): PipelineModelSelection {\n  return Object.fromEntries(\n    OCR_MODEL_ROLES.map((role) => [\n      role.selectionKey,\n      getSelectedModelName(baseSelection, configSelection, explicitSelection, role.selectionKey)\n    ])\n  ) as unknown as PipelineModelSelection;\n}\n\nexport function validateLoadedModelName(\n  modelRole: string,\n  expectedModelName: string | null | undefined,\n  configText: string\n): void {\n  if (!expectedModelName) {\n    throw new Error(`${modelRole} model selection must define model_name.`);\n  }\n  const declaredModelName = extractInferenceModelName(configText);\n  if (!declaredModelName) {\n    throw new Error(`${modelRole} in inference.yml must define model_name.`);\n  }\n  if (declaredModelName !== expectedModelName) {\n    throw new Error(\n      `${modelRole} in inference.yml declares model_name \"${declaredModelName}\" but requested model_name is \"${expectedModelName}\".`\n    );\n  }\n}\n\nfunction resolveSelectedAsset(\n  assetRole: string,\n  modelRole: string,\n  selectionKey: keyof PipelineModelSelection,\n  baseSelection: PipelineModelSelection | null,\n  configSelection: PipelineModelSelection | null,\n  explicitSelection: Record<string, string | null> | null,\n  configAssets: Partial<Record<string, ModelAsset>> | null,\n  explicitAssets: Record<string, ModelAsset> | null\n): ModelAsset | null {\n  const explicitAsset = explicitAssets?.[assetRole];\n  if (explicitAsset) {\n    return explicitAsset;\n  }\n  const explicitModelName = explicitSelection?.[selectionKey];\n  if (explicitModelName) {\n    return resolveModelAssetByName(modelRole, explicitModelName);\n  }\n  const configAsset = configAssets?.[assetRole];\n  if (configAsset) {\n    return configAsset;\n  }\n  const configModelName = configSelection?.[selectionKey];\n  if (configModelName) {\n    return resolveModelAssetByName(modelRole, configModelName);\n  }\n  const baseModelName = baseSelection?.[selectionKey];\n  if (baseModelName) {\n    return resolveModelAssetByName(modelRole, baseModelName);\n  }\n  return null;\n}\n\nfunction createOcrAssets(\n  baseSelection: PipelineModelSelection | null,\n  configSelection: PipelineModelSelection | null,\n  explicitSelection: Record<string, string | null> | null,\n  configAssets: Partial<Record<string, ModelAsset>> | null,\n  explicitAssets: Record<string, ModelAsset> | null\n): Record<string, ModelAsset> {\n  const assets = Object.fromEntries(\n    OCR_MODEL_ROLES.map((role) => [\n      role.assetKey,\n      resolveSelectedAsset(\n        role.assetKey,\n        role.modelRole,\n        role.selectionKey,\n        baseSelection,\n        configSelection,\n        explicitSelection,\n        configAssets,\n        explicitAssets\n      )\n    ])\n  );\n\n  if (Object.values(assets).some((asset) => !asset)) {\n    throw new Error(\"OCR model selection must define both detection and recognition models.\");\n  }\n\n  return assets as Record<string, ModelAsset>;\n}\n\nfunction getExplicitModelSelection(options: Record<string, unknown>): {\n  modelSelection: Record<string, string | null>;\n  assets: Record<string, ModelAsset>;\n} | null {\n  const modelSelection: Record<string, string | null> = {};\n  const assets: Record<string, ModelAsset> = {};\n  let hasAnyOption = false;\n\n  for (const role of OCR_MODEL_ROLES) {\n    const modelName = readAliasedOption(options, role.nameAliases, role.nameLabel) as\n      | string\n      | undefined;\n    const asset = readAliasedOption(options, role.assetAliases, role.assetLabel) as\n      | ModelAsset\n      | undefined;\n\n    if (modelName !== undefined) {\n      modelSelection[role.selectionKey] = modelName;\n      hasAnyOption = true;\n    }\n    if (asset !== undefined) {\n      if (modelName === undefined) {\n        throw new Error(role.assetRequirementError);\n      }\n      assets[role.assetKey] = asset;\n      hasAnyOption = true;\n    }\n  }\n\n  if (!hasAnyOption) {\n    return null;\n  }\n\n  return {\n    modelSelection,\n    assets\n  };\n}\n\nfunction resolveBaseModelSelection(\n  options: Record<string, unknown>,\n  includeDefaultBase = false\n): Readonly<PipelineModelSelection> | null {\n  const ocrVersion = readAliasedOption(options, [\"ocrVersion\", \"ocr_version\"], \"ocrVersion\") as\n    | string\n    | undefined;\n  if (!options.lang && !ocrVersion) {\n    return includeDefaultBase ? DEFAULT_MODEL_SELECTION : null;\n  }\n\n  const lang = (options.lang as string) || \"ch\";\n  const resolvedOcrVersion = ocrVersion || \"PP-OCRv5\";\n  const modelSelection = SUPPORTED_LANG_VERSION_MODELS.get(`${lang}::${resolvedOcrVersion}`);\n\n  if (!modelSelection) {\n    throw new Error(\n      `Unsupported lang/ocrVersion combination: lang=\"${lang}\", ocrVersion=\"${resolvedOcrVersion}\".`\n    );\n  }\n  return modelSelection;\n}\n\nfunction resolveConstructionOptions(\n  options: Record<string, unknown> = {}\n): NormalizedPipelineConfig {\n  const pipelineInput = options.pipelineConfig;\n  const userPipelineConfig =\n    pipelineInput != null ? normalizeOcrPipelineConfig(pipelineInput) : null;\n  const warningBehavior = resolveWarningBehavior(options.unsupportedBehavior);\n  const warnings = userPipelineConfig?.warnings || [];\n  const baseSelection = resolveBaseModelSelection(options, !userPipelineConfig);\n  const configSelection = userPipelineConfig?.modelSelection || null;\n  const configAssets = userPipelineConfig?.assets || null;\n  const explicitOptions = getExplicitModelSelection(options);\n  const explicitSelection = explicitOptions?.modelSelection || null;\n  const explicitAssets = explicitOptions?.assets || null;\n  const resolvedModelSelection = createResolvedModelSelection(\n    baseSelection,\n    configSelection,\n    explicitSelection\n  );\n  const assets = createOcrAssets(\n    baseSelection,\n    configSelection,\n    explicitSelection,\n    configAssets,\n    explicitAssets\n  );\n\n  const baseNormalized = userPipelineConfig ?? DEFAULT_NORMALIZED_PIPELINE_CONFIG;\n  if (userPipelineConfig) {\n    emitPipelineWarnings(warnings, warningBehavior);\n  }\n  const merged = mergeNormalizedPipelineConfigWithExplicit(baseNormalized, options);\n  merged.modelSelection = resolvedModelSelection;\n  merged.assets = { ...assets };\n  return merged;\n}\n\nfunction resolveBackend(raw: string | undefined): ResolvedBackend {\n  if (raw === \"webgpu\" || raw === \"wasm\") return raw;\n  return \"auto\";\n}\n\nexport function normalizeOrtOptions(ortOptions: OrtOptions = {}): NormalizedOrtOptions {\n  const backend = resolveBackend(ortOptions.backend);\n\n  return {\n    backend,\n    ...(ortOptions.wasmPaths !== undefined ? { wasmPaths: ortOptions.wasmPaths } : {}),\n    ...(ortOptions.numThreads !== undefined ? { numThreads: ortOptions.numThreads } : {}),\n    ...(ortOptions.simd !== undefined ? { simd: ortOptions.simd } : {}),\n    ...(ortOptions.proxy !== undefined ? { proxy: ortOptions.proxy } : {})\n  };\n}\n\nexport function resolveWorkerOptions(workerOption: unknown): WorkerResolvedOptions {\n  if (!workerOption) {\n    return {\n      enabled: false,\n      createWorker: null\n    };\n  }\n\n  if (workerOption === true) {\n    return {\n      enabled: true,\n      createWorker: null\n    };\n  }\n\n  if (typeof workerOption === \"object\") {\n    const opts = workerOption as Record<string, unknown>;\n    return {\n      enabled: true,\n      createWorker:\n        typeof opts.createWorker === \"function\" ? (opts.createWorker as () => Worker) : null\n    };\n  }\n\n  throw new Error(\"worker must be a boolean or an options object.\");\n}\n\nexport function resolvePaddleOCROptions(options: Record<string, unknown> = {}): ResolvedOcrOptions {\n  return {\n    pipelineConfig: resolveConstructionOptions(options),\n    ortOptions: normalizeOrtOptions((options.ortOptions || {}) as OrtOptions)\n  };\n}\n\nexport function cloneDefaultOcrConfig(): OcrModelConfig {\n  return deepClone(DEFAULT_OCR_CONFIG);\n}\n","import type { OpenCv, Mat } from \"@techstark/opencv-js\";\nimport type { ModelAsset, ModelLoadSummary } from \"../../resources/model-asset\";\nimport { loadModelAsset } from \"../../resources/index\";\nimport { createDetModel, createRecModel } from \"../../models/index\";\nimport type { DetModel } from \"../../models/det\";\nimport type { RecModel } from \"../../models/rec\";\nimport type { Point2D } from \"../../models/common\";\nimport { cropByPoly } from \"./crop\";\nimport { initOpenCvRuntime } from \"../../runtime/opencv\";\nimport { initOrtRuntime } from \"../../runtime/ort\";\nimport type { OrtModule, WebGpuState, OrtOptions } from \"../../runtime/ort\";\nimport { chunkArray, nowMs } from \"../../utils/common\";\nimport type { OcrModelConfig, OcrRuntimeParamsInput } from \"./runtime-params\";\nimport { getOcrRuntimeParams } from \"./runtime-params\";\nimport type { NormalizedPipelineConfig } from \"./config\";\nimport { cloneDefaultOcrConfig, validateLoadedModelName } from \"./shared\";\nimport type { NormalizedOrtOptions } from \"./shared\";\nimport type { SourceMatResult } from \"../../platform/browser\";\n\nexport interface OcrResultItem {\n  poly: Point2D[];\n  text: string;\n  score: number;\n}\n\nexport interface OcrResultMetrics {\n  detMs: number;\n  recMs: number;\n  totalMs: number;\n  detectedBoxes: number;\n  recognizedCount: number;\n}\n\nexport interface OcrResultRuntime {\n  requestedBackend: string;\n  detProvider: string;\n  recProvider: string;\n  webgpuAvailable: boolean;\n}\n\nexport interface OcrResult {\n  image: { width: number; height: number };\n  items: OcrResultItem[];\n  metrics: OcrResultMetrics;\n  runtime: OcrResultRuntime;\n}\n\nexport interface InitializationSummary {\n  backend: string;\n  webgpuAvailable: boolean;\n  detProvider: string;\n  recProvider: string;\n  assets: ModelLoadSummary[];\n  elapsedMs: number;\n  pipelineConfigWarnings: string[];\n}\n\nexport type SourceToMatFn = (\n  cv: OpenCv,\n  source: unknown\n) => SourceMatResult | Promise<SourceMatResult>;\ntype EnsureServedFromHttpFn = () => void;\n\nexport interface OcrPipelineRunnerOptions {\n  pipelineConfig: NormalizedPipelineConfig;\n  ortOptions?: OrtOptions | NormalizedOrtOptions;\n  fetch?: typeof fetch;\n  ensureServedFromHttp?: EnsureServedFromHttpFn;\n  sourceToMat?: SourceToMatFn;\n}\n\nfunction noopEnsureServedFromHttp(): void {}\n\nfunction getResolvedAssets(assets: Partial<Record<string, ModelAsset>> | undefined): {\n  det: ModelAsset;\n  rec: ModelAsset;\n} {\n  const det = assets?.det;\n  const rec = assets?.rec;\n  if (!det || typeof det !== \"object\" || !rec || typeof rec !== \"object\") {\n    throw new Error(\n      \"PaddleOCRCore requires pre-resolved detection and recognition asset descriptors.\"\n    );\n  }\n  return { det, rec };\n}\n\nexport class OcrPipelineRunner {\n  protected options: OcrPipelineRunnerOptions;\n  protected modelConfig: OcrModelConfig;\n  protected runtimeDefaults: Partial<OcrRuntimeParamsInput>;\n  protected cv: OpenCv | null;\n  protected ort: OrtModule | null;\n  protected detModel: DetModel | null;\n  protected recModel: RecModel | null;\n  protected webgpuState: WebGpuState;\n  protected pipelineConfig: NormalizedPipelineConfig;\n  protected lastInitializationSummary: InitializationSummary | null;\n  private ensureServedFromHttp: EnsureServedFromHttpFn;\n  private sourceToMat: SourceToMatFn | undefined;\n\n  constructor(options: OcrPipelineRunnerOptions) {\n    this.options = options;\n    this.modelConfig = cloneDefaultOcrConfig();\n    this.pipelineConfig = options.pipelineConfig;\n    this.runtimeDefaults = { ...options.pipelineConfig.runtimeDefaults };\n    this.cv = null;\n    this.ort = null;\n    this.detModel = null;\n    this.recModel = null;\n    this.webgpuState = { available: false, reason: \"\" };\n    this.lastInitializationSummary = null;\n    this.ensureServedFromHttp = options.ensureServedFromHttp || noopEnsureServedFromHttp;\n    this.sourceToMat = options.sourceToMat;\n  }\n\n  async initialize(): Promise<InitializationSummary> {\n    this.ensureServedFromHttp();\n    const start = nowMs();\n    const { cv } = await initOpenCvRuntime();\n    this.cv = cv;\n    const { ort, webgpuState, backend } = await initOrtRuntime(this.options.ortOptions || {});\n    this.ort = ort;\n    this.webgpuState = webgpuState;\n\n    const assets = getResolvedAssets(this.pipelineConfig.assets);\n    const fetchImpl = this.options.fetch || fetch;\n    const loadedAssets = await Promise.all([\n      loadModelAsset(assets.det, fetchImpl),\n      loadModelAsset(assets.rec, fetchImpl)\n    ]);\n    validateLoadedModelName(\n      \"TextDetection\",\n      this.pipelineConfig.modelSelection.textDetectionModelName,\n      loadedAssets[0].configText\n    );\n    validateLoadedModelName(\n      \"TextRecognition\",\n      this.pipelineConfig.modelSelection.textRecognitionModelName,\n      loadedAssets[1].configText\n    );\n    await this.disposeModelsOnly();\n    const detBatchSize = this.pipelineConfig.textDetectionBatchSize;\n    const recBatchSize = this.pipelineConfig.textRecognitionBatchSize;\n\n    const [detModel, recModel] = await Promise.all([\n      createDetModel({\n        ort: this.ort,\n        modelBytes: loadedAssets[0].modelBytes,\n        configText: loadedAssets[0].configText,\n        backend,\n        webgpuState,\n        batchSize: detBatchSize\n      }),\n      createRecModel({\n        ort: this.ort,\n        modelBytes: loadedAssets[1].modelBytes,\n        configText: loadedAssets[1].configText,\n        backend,\n        webgpuState,\n        batchSize: recBatchSize\n      })\n    ]);\n    this.detModel = detModel;\n    this.recModel = recModel;\n    this.modelConfig = {\n      det: this.detModel.config,\n      rec: this.recModel.config\n    };\n\n    const elapsed = nowMs() - start;\n    this.lastInitializationSummary = {\n      backend,\n      webgpuAvailable: webgpuState.available,\n      detProvider: this.detModel.provider,\n      recProvider: this.recModel.provider,\n      assets: loadedAssets.map((asset) => asset.download),\n      elapsedMs: elapsed,\n      pipelineConfigWarnings: this.pipelineConfig.warnings\n    };\n    return this.lastInitializationSummary;\n  }\n\n  getInitializationSummary(): InitializationSummary | null {\n    return this.lastInitializationSummary;\n  }\n\n  getModelConfig(): OcrModelConfig {\n    return this.modelConfig;\n  }\n\n  async predict(input: unknown, params: OcrRuntimeParamsInput = {}): Promise<OcrResult[]> {\n    if (!this.sourceToMat) {\n      throw new Error(\"PaddleOCR source adapter is not configured.\");\n    }\n    if (!this.detModel || !this.recModel || !this.cv || !this.ort) {\n      await this.initialize();\n    }\n\n    const cv = this.cv;\n    const detModel = this.detModel;\n    const recModel = this.recModel;\n    if (!cv || !detModel || !recModel) {\n      throw new Error(\"Initialization did not complete. Call initialize() first.\");\n    }\n\n    const sources = Array.isArray(input) ? input : [input];\n    const sourceToMat = this.sourceToMat;\n    const pipelineBatchSize = Math.max(1, Math.floor(this.pipelineConfig.pipelineBatchSize) || 1);\n    const sourceBatches = chunkArray(sources, pipelineBatchSize);\n\n    const totalStart = nowMs();\n    const resolved = getOcrRuntimeParams(this.modelConfig, this.runtimeDefaults, params);\n\n    let sumDetMs = 0;\n    let sumRecMs = 0;\n    const partials: Array<{\n      image: { width: number; height: number };\n      items: OcrResultItem[];\n      detectedBoxes: number;\n      recognizedCount: number;\n    }> = [];\n\n    for (const batchSources of sourceBatches) {\n      const sourceImages = await Promise.all(\n        batchSources.map((source) => Promise.resolve(sourceToMat(cv, source)))\n      );\n      try {\n        const detStart = nowMs();\n        const detResults = await detModel.predict(\n          cv,\n          sourceImages.map((s) => s.mat),\n          resolved.det\n        );\n        sumDetMs += nowMs() - detStart;\n\n        const recStart = nowMs();\n        const perImageItems: OcrResultItem[][] = [];\n\n        for (let imgIdx = 0; imgIdx < detResults.length; imgIdx += 1) {\n          const detBoxes = detResults[imgIdx]?.boxes ?? [];\n          const cropMats: Mat[] = [];\n          for (let boxIdx = 0; boxIdx < detBoxes.length; boxIdx += 1) {\n            cropMats.push(cropByPoly(cv, sourceImages[imgIdx].mat, detBoxes[boxIdx].poly));\n          }\n\n          try {\n            const recResults = cropMats.length ? await recModel.predict(cv, cropMats) : [];\n            const items: OcrResultItem[] = [];\n            for (let boxIdx = 0; boxIdx < recResults.length; boxIdx += 1) {\n              const rec = recResults[boxIdx];\n              if (rec.text && rec.score >= resolved.pipeline.scoreThresh) {\n                items.push({\n                  poly: detBoxes[boxIdx].poly,\n                  text: rec.text,\n                  score: rec.score\n                });\n              }\n            }\n            perImageItems.push(items);\n          } finally {\n            for (const mat of cropMats) {\n              mat.delete();\n            }\n          }\n        }\n\n        sumRecMs += nowMs() - recStart;\n\n        for (let i = 0; i < sourceImages.length; i += 1) {\n          const sourceImage = sourceImages[i];\n          const detBoxes = detResults[i]?.boxes ?? [];\n          const items = perImageItems[i] ?? [];\n          partials.push({\n            image: {\n              width: sourceImage.width,\n              height: sourceImage.height\n            },\n            items,\n            detectedBoxes: detBoxes.length,\n            recognizedCount: items.length\n          });\n        }\n      } finally {\n        for (const sourceImage of sourceImages) {\n          sourceImage.dispose();\n        }\n      }\n    }\n\n    const totalElapsed = nowMs() - totalStart;\n    const requestedBackend =\n      (this.options.ortOptions as NormalizedOrtOptions | undefined)?.backend ?? \"auto\";\n\n    return partials.map(\n      (p): OcrResult => ({\n        image: p.image,\n        items: p.items,\n        metrics: {\n          detMs: sumDetMs,\n          recMs: sumRecMs,\n          totalMs: totalElapsed,\n          detectedBoxes: p.detectedBoxes,\n          recognizedCount: p.recognizedCount\n        },\n        runtime: {\n          requestedBackend,\n          detProvider: detModel.provider,\n          recProvider: recModel.provider,\n          webgpuAvailable: this.webgpuState.available\n        }\n      })\n    );\n  }\n\n  async disposeModelsOnly(): Promise<void> {\n    await Promise.all([this.detModel?.dispose(), this.recModel?.dispose()]);\n    this.detModel = null;\n    this.recModel = null;\n  }\n\n  async dispose(): Promise<void> {\n    await this.disposeModelsOnly();\n  }\n}\n\nexport { OcrPipelineRunner as PaddleOCRCore };\n","const REQUEST_KIND = \"worker-transport-request\";\nconst RESPONSE_KIND = \"worker-transport-response\";\n\nexport interface SerializedError {\n  name: string;\n  message: string;\n  stack: string;\n}\n\nexport interface TransportRequest {\n  kind: typeof REQUEST_KIND;\n  type: string;\n  payload: unknown;\n  requestId: number;\n}\n\nexport interface TransportSuccessResponse {\n  kind: typeof RESPONSE_KIND;\n  status: \"success\";\n  requestId: number;\n  payload: unknown;\n}\n\nexport interface TransportErrorResponse {\n  kind: typeof RESPONSE_KIND;\n  status: \"error\";\n  requestId: number;\n  error: SerializedError;\n}\n\nexport type TransportResponse = TransportSuccessResponse | TransportErrorResponse;\n\nexport function createTransportRequest(\n  type: string,\n  payload: unknown,\n  requestId: number\n): TransportRequest {\n  return {\n    kind: REQUEST_KIND,\n    type,\n    payload,\n    requestId\n  };\n}\n\nexport function createTransportSuccess(\n  requestId: number,\n  payload: unknown\n): TransportSuccessResponse {\n  return {\n    kind: RESPONSE_KIND,\n    status: \"success\",\n    requestId,\n    payload\n  };\n}\n\nexport function createTransportError(requestId: number, error: unknown): TransportErrorResponse {\n  return {\n    kind: RESPONSE_KIND,\n    status: \"error\",\n    requestId,\n    error: serializeError(error)\n  };\n}\n\nexport function isTransportRequest(message: unknown): message is TransportRequest {\n  return (\n    typeof message === \"object\" &&\n    message !== null &&\n    \"kind\" in message &&\n    message.kind === REQUEST_KIND\n  );\n}\n\nexport function isTransportResponse(message: unknown): message is TransportResponse {\n  return (\n    typeof message === \"object\" &&\n    message !== null &&\n    \"kind\" in message &&\n    message.kind === RESPONSE_KIND\n  );\n}\n\nexport function serializeError(error: unknown): SerializedError {\n  const err = error as Partial<Error> | undefined;\n  return {\n    name: err?.name || \"Error\",\n    message: err?.message || \"Unknown worker error.\",\n    stack: err?.stack || \"\"\n  };\n}\n\nexport function deserializeError(error: unknown): Error {\n  const normalized = (error || {}) as SerializedError;\n  const instance = new Error(normalized.message || \"Unknown worker error.\");\n  instance.name = normalized.name || \"Error\";\n  if (normalized.stack) {\n    instance.stack = normalized.stack;\n  }\n  return instance;\n}\n","import { createTransportRequest, deserializeError, isTransportResponse } from \"./protocol\";\n\ninterface PendingRequest {\n  resolve: (value: unknown) => void;\n  reject: (reason: unknown) => void;\n}\n\nexport interface WorkerOptions {\n  createWorker?: () => Worker;\n}\n\nexport class WorkerTransportClient {\n  private workerOptions: WorkerOptions;\n  private worker: Worker | null;\n  private pending: Map<number, PendingRequest>;\n  private nextRequestId: number;\n  private disposed: boolean;\n\n  constructor(workerOptions: WorkerOptions = {}) {\n    this.workerOptions = workerOptions;\n    this.worker = null;\n    this.pending = new Map();\n    this.nextRequestId = 1;\n    this.disposed = false;\n  }\n\n  ensureActive(): void {\n    if (this.disposed) {\n      throw new Error(\"Worker transport client has been disposed.\");\n    }\n  }\n\n  ensureWorker(): Worker {\n    this.ensureActive();\n    if (this.worker) {\n      return this.worker;\n    }\n\n    const workerFactory = this.workerOptions.createWorker;\n    if (typeof workerFactory !== \"function\") {\n      throw new Error(\"Worker transport client requires a createWorker() factory.\");\n    }\n    const worker = workerFactory();\n    worker.onmessage = (event: MessageEvent) => {\n      const message = event.data as unknown;\n      if (!isTransportResponse(message)) return;\n      const pending = this.pending.get(message.requestId);\n      if (!pending) return;\n      this.pending.delete(message.requestId);\n      if (message.status === \"success\") {\n        pending.resolve(message.payload);\n      } else {\n        pending.reject(deserializeError(message.error));\n      }\n    };\n    worker.onerror = (event: ErrorEvent) => {\n      const error = new Error(event.message || \"OCR worker failed.\");\n      for (const pending of this.pending.values()) {\n        pending.reject(error);\n      }\n      this.pending.clear();\n    };\n    this.worker = worker;\n    return worker;\n  }\n\n  request(type: string, payload: unknown, transferables: Transferable[] = []): Promise<unknown> {\n    const worker = this.ensureWorker();\n    const requestId = this.nextRequestId;\n    this.nextRequestId += 1;\n\n    return new Promise((resolve, reject) => {\n      this.pending.set(requestId, { resolve, reject });\n      worker.postMessage(createTransportRequest(type, payload, requestId), transferables);\n    });\n  }\n\n  disposeWorker(): void {\n    if (!this.worker) {\n      return;\n    }\n    this.worker.terminate();\n    this.worker = null;\n  }\n\n  dispose(): void {\n    if (this.disposed) {\n      return;\n    }\n    this.disposed = true;\n    for (const pending of this.pending.values()) {\n      pending.reject(new Error(\"Worker transport client has been disposed.\"));\n    }\n    this.pending.clear();\n    this.disposeWorker();\n  }\n}\n\nexport function createWorkerTransportClient(workerOptions: WorkerOptions): WorkerTransportClient {\n  return new WorkerTransportClient(workerOptions);\n}\n","import { sourceToWorkerPayload } from \"../../platform/browser\";\nimport { createWorkerTransportClient } from \"../../worker/client\";\nimport type { WorkerTransportClient, WorkerOptions } from \"../../worker/client\";\nimport type { OcrModelConfig, OcrRuntimeParamsInput } from \"./runtime-params\";\nimport type { InitializationSummary, OcrResult, OcrPipelineRunnerOptions } from \"./core\";\nimport { cloneDefaultOcrConfig } from \"./shared\";\n\ndeclare const __ORT_WASM_CDN_PREFIX__: string | undefined;\n\nfunction createDefaultWorker(): Worker {\n  if (typeof Worker !== \"function\") {\n    throw new Error(\"worker mode requires Web Worker support in this environment.\");\n  }\n  return new Worker(new URL(\"./worker-entry.ts\", import.meta.url), {\n    type: \"module\"\n  });\n}\n\nexport class WorkerBackedPaddleOCR {\n  private options: OcrPipelineRunnerOptions;\n  private lastInitializationSummary: InitializationSummary | null;\n  private modelConfig: OcrModelConfig;\n  private transportClient: WorkerTransportClient;\n  private initPromise: Promise<InitializationSummary> | null;\n  private disposed: boolean;\n\n  constructor(options: OcrPipelineRunnerOptions, transportClient: WorkerTransportClient) {\n    this.options = options;\n    this.lastInitializationSummary = null;\n    this.modelConfig = cloneDefaultOcrConfig();\n    this.transportClient = transportClient;\n    this.initPromise = null;\n    this.disposed = false;\n  }\n\n  ensureActive(): void {\n    if (this.disposed) {\n      throw new Error(\"PaddleOCR worker instance has been disposed.\");\n    }\n  }\n\n  async initialize(): Promise<InitializationSummary> {\n    this.ensureActive();\n    if (this.lastInitializationSummary) {\n      return this.lastInitializationSummary;\n    }\n    if (!this.initPromise) {\n      const ortOpts = (this.options.ortOptions || {}) as Record<string, unknown>;\n      if (ortOpts[\"wasmPaths\"] === undefined && typeof __ORT_WASM_CDN_PREFIX__ === \"string\") {\n        console.warn(\n          \"[PaddleOCR.js] Worker mode: ortOptions.wasmPaths is not set — falling back to CDN (%s). \" +\n            \"For version consistency between main thread and worker, set ortOptions.wasmPaths \" +\n            \"to the path where your bundler outputs the onnxruntime-web WASM files \" +\n            '(e.g. ortOptions: { wasmPaths: \"/assets/\" }).',\n          __ORT_WASM_CDN_PREFIX__\n        );\n      }\n      const wasmCdnFallback =\n        ortOpts[\"wasmPaths\"] === undefined && typeof __ORT_WASM_CDN_PREFIX__ === \"string\"\n          ? { wasmPaths: __ORT_WASM_CDN_PREFIX__ }\n          : {};\n      this.initPromise = this.transportClient\n        .request(\"init\", {\n          options: {\n            ...this.options,\n            ortOptions: {\n              ...ortOpts,\n              ...wasmCdnFallback,\n              disableWasmProxy: true\n            }\n          }\n        })\n        .then((rawPayload) => {\n          const payload = rawPayload as {\n            summary: InitializationSummary;\n            modelConfig: OcrModelConfig;\n          };\n          this.lastInitializationSummary = payload.summary;\n          this.modelConfig = payload.modelConfig;\n          return this.lastInitializationSummary;\n        })\n        .catch((error: unknown) => {\n          this.initPromise = null;\n          this.transportClient.dispose();\n          throw error;\n        });\n    }\n    return this.initPromise;\n  }\n\n  getInitializationSummary(): InitializationSummary | null {\n    return this.lastInitializationSummary;\n  }\n\n  getModelConfig(): OcrModelConfig {\n    return this.modelConfig;\n  }\n\n  async predict(input: unknown, params: OcrRuntimeParamsInput = {}): Promise<OcrResult[]> {\n    this.ensureActive();\n    await this.initialize();\n    const sources: unknown[] = Array.isArray(input) ? input : [input];\n    const payloads: Array<{ payload: unknown; transferables: Transferable[] }> = await Promise.all(\n      sources.map((source) =>\n        sourceToWorkerPayload(source as Parameters<typeof sourceToWorkerPayload>[0])\n      )\n    );\n    const combinedPayloads = payloads.map((p) => p.payload);\n    const combinedTransferables = payloads.flatMap((p) => p.transferables);\n    return this.transportClient.request(\n      \"predict\",\n      {\n        sources: combinedPayloads,\n        params\n      },\n      combinedTransferables\n    ) as Promise<OcrResult[]>;\n  }\n\n  async dispose(): Promise<void> {\n    if (this.disposed) {\n      return;\n    }\n    this.disposed = true;\n    try {\n      await this.transportClient.request(\"dispose\", {});\n    } catch {\n      // Transport disposal is authoritative even if the worker cannot respond.\n    }\n    this.transportClient.dispose();\n  }\n}\n\nexport function createWorkerBackedPaddleOCR(\n  options: OcrPipelineRunnerOptions,\n  workerOptions: WorkerOptions = {}\n): WorkerBackedPaddleOCR {\n  const transportClient = createWorkerTransportClient({\n    ...workerOptions,\n    createWorker: workerOptions.createWorker || createDefaultWorker\n  });\n  return new WorkerBackedPaddleOCR(options, transportClient);\n}\n","import { normalizeOcrPipelineConfig, parseOcrPipelineConfigText } from \"./config\";\nimport { ensureServedFromHttp, sourceToMat } from \"../../platform/browser\";\nimport type { OcrPipelineRunnerOptions } from \"./core\";\nimport { OcrPipelineRunner } from \"./core\";\nimport { resolvePaddleOCROptions, resolveWorkerOptions } from \"./shared\";\nimport { createWorkerBackedPaddleOCR } from \"./worker-backed\";\nimport type { WorkerBackedPaddleOCR } from \"./worker-backed\";\nimport type { OrtOptions } from \"../../runtime/ort\";\nimport type { ModelAsset } from \"../../resources/model-asset\";\nimport type { LimitType } from \"./runtime-params\";\n\nexport interface PaddleOCRCreateOptions {\n  worker?: boolean | { createWorker?: () => Worker };\n  fetch?: typeof fetch;\n  initialize?: boolean;\n  ortOptions?: OrtOptions;\n\n  pipelineConfig?: unknown;\n  unsupportedBehavior?: \"warn\" | \"ignore\" | \"error\";\n\n  lang?: string;\n  ocrVersion?: string;\n  ocr_version?: string;\n\n  textDetectionModelName?: string;\n  text_detection_model_name?: string;\n  textRecognitionModelName?: string;\n  text_recognition_model_name?: string;\n\n  textDetectionModelAsset?: ModelAsset;\n  textDetectionModelDir?: ModelAsset;\n  text_detection_model_dir?: ModelAsset;\n  textRecognitionModelAsset?: ModelAsset;\n  textRecognitionModelDir?: ModelAsset;\n  text_recognition_model_dir?: ModelAsset;\n\n  textDetectionBatchSize?: number;\n  text_detection_batch_size?: number;\n  textRecognitionBatchSize?: number;\n  text_recognition_batch_size?: number;\n  batch_size?: number;\n\n  textDetLimitSideLen?: number;\n  text_det_limit_side_len?: number;\n  textDetLimitType?: LimitType;\n  text_det_limit_type?: LimitType;\n  textDetMaxSideLimit?: number;\n  text_det_max_side_limit?: number;\n  textDetThresh?: number;\n  text_det_thresh?: number;\n  textDetBoxThresh?: number;\n  text_det_box_thresh?: number;\n  textDetUnclipRatio?: number;\n  text_det_unclip_ratio?: number;\n  textRecScoreThresh?: number;\n  text_rec_score_thresh?: number;\n\n  [key: string]: unknown;\n}\n\nexport class PaddleOCR extends OcrPipelineRunner {\n  constructor(options: OcrPipelineRunnerOptions) {\n    super({\n      ...options,\n      ensureServedFromHttp,\n      sourceToMat\n    });\n  }\n\n  static async create(\n    options: PaddleOCRCreateOptions = {}\n  ): Promise<PaddleOCR | WorkerBackedPaddleOCR> {\n    const workerOptions = resolveWorkerOptions(options.worker);\n    if (workerOptions.enabled && options.fetch) {\n      throw new Error(\"worker mode does not support a custom fetch implementation.\");\n    }\n\n    const resolvedOptions = resolvePaddleOCROptions(options);\n    const instance = workerOptions.enabled\n      ? createWorkerBackedPaddleOCR(resolvedOptions, {\n          createWorker: workerOptions.createWorker ?? undefined\n        })\n      : new PaddleOCR({\n          ...resolvedOptions,\n          fetch: options.fetch\n        });\n\n    if (options.initialize !== false) {\n      await instance.initialize();\n    }\n    return instance;\n  }\n}\n\nexport { normalizeOcrPipelineConfig, parseOcrPipelineConfigText };\n"],"names":["isPlainObject","postprocess","preprocess","preprocessSample","unclip","sourceToMat"],"mappings":"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"}